LyoKICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgogKgogKgogKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgogKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQogKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKICogY29waWVzLgogKgogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCiAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQogKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAogKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKi8KCiNpZiAhZGVmaW5lZCggX19XTEFOX1FDVF9QQUxfUEFDS0VUX0ggKQojZGVmaW5lIF9fV0xBTl9RQ1RfUEFMX1BBQ0tFVF9ICgovKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgCiAgXGZpbGUgIHdsYW5fcWN0X3BhbF9wYWNrZXQuaAogIAogIFxicmllZiBkZWZpbmUgUEFMIHBhY2tldC4gd3B0ID0gKFdsYW4gUGFsIFR5cGUpCiAgICAgICAgICAgICAgIAogICBEZWZpbml0aW9ucyBmb3IgcGxhdGZvcm0gaW5kZXBlbmRlbnQuCiAgCiAgIENvcHlyaWdodCAyMDEwIChjKSBRdWFsY29tbSwgSW5jb3Jwb3JhdGVkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgCiAgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkuCiAgCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCiNpbmNsdWRlICJ3bGFuX3FjdF9wYWxfdHlwZS5oIgojaW5jbHVkZSAid2xhbl9xY3RfcGFsX3N0YXR1cy5oIgoKLy8gVGhlIHNpemUgb2YgdGhlIGRhdGEgYnVmZmVyIGluIHZvcy9wYWwgcGFja2V0cwovLyBFeHBsYW5hdGlvbjoKLy8gTVRVIHNpemUgID0gMTUwMCBieXRlcwovLyBNYXggbnVtYmVyIG9mIEJEL1BEVXMgcmVxdWlyZWQgdG8gaG9sZCBwYXlsb2FkIG9mIDE1MDAgPQovLyAgIDEyIFBEVXMgKDEyNCBieXRlcyBlYWNoKSArIDEgQkQgKDEyIGJ5dGVzIGZvciBwYXlsb2FkKSA9Ci8vICAgMTMgQkQvUERVcyA9IDEzIHggMTI4ID0gMTY2NCBieXRlcwovLwovLyBJbiBjYXNlIG9mIEEtTVNEVSB3aXRoIGVhY2ggTVNEVSBoYXZpbmcgcGF5bG9hZCBvZiAxNTAwIGJ5dGVzOgovLyAgIDFzdCBNU0RVID0gcmVxdWlyZXMgMTMgQkQvUERVcyBhcyBwZXIgdGhlIGFib3ZlIGVxdWF0aW9uLgovLyAgIDJuZCBNU0RVID0gSFcgaW5zZXJ0cyBhbiBleHRyYSBCRCB0byBob2xkIHRoZSBpbmZvcm1hdGlvbiBvZiB0aGUgMm5kCi8vICAgTVNEVSBhbmQgdGhlIHBheWxvYWQgcG9ydGlvbiBvZiB0aGlzIEJEIGlzIHVudXNlZCB3aGljaCBtZWFucyB0byBjb3ZlcgovLyAgIDE1MDAgYnl0ZXMgd2UgcmVxdWlyZSAxMyBQRFVzLgovLyAgIFNvIDEzIFBEVXMgKyAxIEJEID0gMTQgQkQvUERVcyA9IDE3OTIgYnl0ZXMuCi8vCi8vIEhPV0VWRVIKLy8gSW4gY2FzZSBvZiBBLU1TRFUgd2l0aCBlcnJvcnMsIHRoZSBBRFUgd2lsbCBwdXNoIHRvIHRoZSBob3N0IHVwIHRvCi8vIDIzNDYgYnl0ZXMuICBJZiB0aGF0IGlzIHRoZSAybmQgb3IgbGF0ZXIgTVNEVSB0aGUgd29yc3QgY2FzZSBpczoKLy8gICAxIFByZXBlbmRlZCBCRC9QRFUKLy8gICAxIEJEL1BEVSBjb250YWluaW5nIHRoZSAxc3QgNCBieXRlcyBvZiB0aGUgZGVsaW1pdGVyCi8vICAgMSBCRC9QRFUgY29udGFpbmluZyB0aGUgbGFzdCAxMCBieXRlcyBvZiB0aGUgZGVsaW1pdGVyCi8vICAgICBwbHVzIHRoZSBmaXJzdCAxMTQgb2YgdGhlIHBheWxvYWQKLy8gICAxOCBCRC9QRFVzIGNvbnRhaW5pbmcgdGhlIHJlbWFpbmluZyAyMjMyIGJ5dGVzIG9mIHRoZSBwYXlsb2FkCi8vICAgICAyMzQ2IC0gMTE0ID0gMjIzMjsgMjIzMiAvIDEyNCA9IDE4Ci8vICAgU28gMjEgQkQvUERVcyBhcmUgcmVxdWlyZWQKCi8vVGhlIHNpemUgb2YgQU1TRFUgZnJhbWUgcGVyIHNwZWMgY2FuIGJlIGEgbWF4IG9mIDM4MzkgYnl0ZXMgCi8vIGluIEJEL1BEVXMgdGhhdCBtZWFucyAzMCAob25lIEJEID0gMTI4IGJ5dGVzKSAKLy8gd2UgbXVzdCBhZGQgdGhlIHNpemUgb2YgdGhlIDgwMi4xMSBoZWFkZXIgdG8gdGhhdCAKI2RlZmluZSBWUEtUX1NJWkVfQlVGRkVSICAoMzAgKiAxMjgpICsgMzIKCnR5cGVkZWYgZW51bQp7CiAgIC8vL1BhY2tldCBpcyB1c2VkIHRvIHRyYW5zbWl0IDgwMi4xMSBNYW5hZ2VtZW50IGZyYW1lcy4KICAgZVdMQU5fUEFMX1BLVF9UWVBFX1RYXzgwMl8xMV9NR01ULAogICAvLy9QYWNrZXQgaXMgdXNlZCB0byB0cmFuc21pdCA4MDIuMTEgRGF0YSBmcmFtZXMuCiAgIGVXTEFOX1BBTF9QS1RfVFlQRV9UWF84MDJfMTFfREFUQSwKICAgLy8vUGFja2V0IGlzIHVzZWQgdG8gdHJhbnNtaXQgODAyLjMgRGF0YSBmcmFtZXMuCiAgIGVXTEFOX1BBTF9QS1RfVFlQRV9UWF84MDJfM19EQVRBLAogICAvLy9QYWNrZXQgY29udGFpbnMgUmVjZWl2ZWQgZGF0YSBvZiBhbiB1bmtub3duIGZyYW1lIHR5cGUKICAgZVdMQU5fUEFMX1BLVF9UWVBFX1JYX1JBVwp9IHdwdF9wYWNrZXRfdHlwZTsKCgp0eXBlZGVmIHN0cnVjdCBzd3B0X3BhY2tldAp7CiAgIC8qCiAgIFBvaW50ZXIgdG8gYSBidWZmZXIgZm9yIEJEIGZvciBUWCBwYWNrZXRzCiAgIEZvciBSWCBwYWNrZXRzLiBUaGUgcEJEIE1VU1Qgc2V0IHRvIE5VTEwuCiAgIFBBTCBwYWNrZXQgc2hhbGwgc2V0IHRoZSBwb2ludGVyIHBvaW50IHRvIHRoZSBzdGFydCBvZiB0aGUgZmxhdCBidWZmZXIKICAgd2hlcmUgdGhlIEJEIHN0YXJ0cy4KICAgKi8KICAgdm9pZCAqcEJEOwogICAvL1BoeXNpY2FsIGFkZHJlc3MgZm9yIHBCRCBmb3IgRE1BLWFibGUgZGV2aWNlcwogICB2b2lkICpwQkRQaHlzOyAKICAgLy9PUyBkZXBlbmRlbnQgc3RydWN1dHJlIHVzZWQgb25seSBieSBPUyBzcGVjaWZpYyBjb2RlLgogICB2b2lkICpwT1NTdHJ1Y3Q7ICAKICAgdm9pZCAqcGt0TWV0YUluZm87CiAgIHdwdF9wYWNrZXRfdHlwZSBwa3RUeXBlOwogICAvL1RoZSBudW1iZXIgb2YgYnl0ZXMgcEJEIHVzZXMuIEl0IE1VU1QgYmUgc2V0IHRvIDAgZm9yIFJYIHBhY2tldHMKICAgd3B0X3VpbnQxNiBCRExlbmd0aDsKCiAgIC8vSW50ZXJuYWwgZGF0YSBmb3IgUEFMIHBhY2tldCBpbXBsZW1lbnRhdGlvbiB1c2FnZSBvbmx5CiAgIHZvaWQgKnBJbnRlcm5hbERhdGE7IAp9IHdwdF9wYWNrZXQ7Cgp0eXBlZGVmIHN0cnVjdCBzd3B0X2l0ZXJhdG9yCnsKICAgdm9pZCAqcE5leHQ7ICAKICAgdm9pZCAqcEN1cjsKICAgdm9pZCAqcENvbnRleHQ7Cn0gd3B0X2l0ZXJhdG9yOwoKCi8vcFBrdCBpcyBhIHBvaW50ZXIgdG8gd3B0X3BhY2tldAojZGVmaW5lIFdQQUxfUEFDS0VUX1NFVF9CRF9QT0lOVEVSKHBQa3QsIHBCZCkgICAoIChwUGt0KS0+cEJEID0gKHBCZCkgKQojZGVmaW5lIFdQQUxfUEFDS0VUX0dFVF9CRF9QT0lOVEVSKHBQa3QpICAoIChwUGt0KS0+cEJEICkKLy9BY2Nlc3MgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgQkQKI2RlZmluZSBXUEFMX1BBQ0tFVF9TRVRfQkRfUEhZUyhwUGt0LCBwQmRQaHlzKSAgICggKHBQa3QpLT5wQkRQaHlzID0gKHBCZFBoeXMpICkKI2RlZmluZSBXUEFMX1BBQ0tFVF9HRVRfQkRfUEhZUyhwUGt0KSAgKCAocFBrdCktPnBCRFBoeXMgKQojZGVmaW5lIFdQQUxfUEFDS0VUX1NFVF9CRF9MRU5HVEgocFBrdCwgbGVuKSAgICggKHBQa3QpLT5CRExlbmd0aCA9IChsZW4pICkKI2RlZmluZSBXUEFMX1BBQ0tFVF9HRVRfQkRfTEVOR1RIKHBQa3QpICAoIChwUGt0KS0+QkRMZW5ndGggKQojZGVmaW5lIFdQQUxfUEFDS0VUX1NFVF9NRVRBSU5GT19QT0lOVEVSKHBQa3QsIHApICggKHBQa3QpLT5wa3RNZXRhSW5mbyA9IChwKSApCiNkZWZpbmUgV1BBTF9QQUNLRVRfR0VUX01FVEFJTkZPX1BPSU5URVIocFBrdCkgKCAocFBrdCktPnBrdE1ldGFJbmZvICkKI2RlZmluZSBXUEFMX1BBQ0tFVF9TRVRfVFlQRShwUGt0LCB0eXBlKSAgKCAocFBrdCktPnBrdFR5cGUgPSAodHlwZSkgKQojZGVmaW5lIFdQQUxfUEFDS0VUX0dFVF9UWVBFKHBQa3QpICAoIChwUGt0KS0+cGt0VHlwZSApCiNkZWZpbmUgV1BBTF9QQUNLRVRfU0VUX09TX1NUUlVDVF9QT0lOVEVSKHBQa3QsIHBTdHJ1Y3QpICAgKCAocFBrdCktPnBPU1N0cnVjdCA9IChwU3RydWN0KSApCiNkZWZpbmUgV1BBTF9QQUNLRVRfR0VUX09TX1NUUlVDVF9QT0lOVEVSKHBQa3QpICAoIChwUGt0KS0+cE9TU3RydWN0ICkKI2RlZmluZSBXUEFMX1BBQ0tFVF9JU19GTEFUX0JVRihwa3RUeXBlKSAoIChlV0xBTl9QQUxfUEtUX1RZUEVfUlhfUkFXID09IChwa3RUeXBlKSkgfHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVXTEFOX1BBTF9QS1RfVFlQRV9UWF84MDJfMTFfTUdNVCA9PSAocGt0VHlwZSkpICkKCi8qIFJYIFJBVyBwYWNrZXQgYWxsb2MgZmFpbCBkdWUgdG8gb3V0IG9mIHJlc291cmNlIENCIGZ1bmN0aW9uIHR5cGUgKi8KdHlwZWRlZiB2b2lkICggKndwYWxQYWNrZXRMb3dQYWNrZXRDQiApKCB3cHRfcGFja2V0ICpwUGFja2V0LCB2b2lkICp1c3JEYXRhICk7CgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxQYWNrZXRJbml0IJYgSW5pdGlhbGl6ZSBhbGwgd3B0X3BhY2tldCByZWxhdGVkIG9iamVjdHMuIEFsbG9jYXRlIG1lbW9yeSBmb3Igd3B0X3BhY2tldC4gCiAgICBBbGxvY2F0ZSBtZW1vcnkgZm9yIFRYIG1hbmFnZW1lbnQgZnJhbWVzIGFuZCBSWCBmcmFtZXMuCiAgICBGb3Igb3VyIGxlZ2FjeSBVTUFDLCBpdCBpcyBub3QgbmVlZGVkIGJlY2F1c2Ugdm9zX3BhY2tldCBjb250YWlucyB3cHRfcGFja2V0LgogICAgUGFyYW06IAogICAgICAgIHBQYWxDb250ZXh0IJYgQSBjb250ZXh0IFBBTCB1c2VzPz8KICAgIFJldHVybjoKICAgICAgICBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgLS0gc3VjY2VzcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp3cHRfc3RhdHVzIHdwYWxQYWNrZXRJbml0KHZvaWQgKnBQYWxDb250ZXh0KTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB3cGFsUGFja2V0Q2xvc2UgliBGcmVlIGFsbCBhbGxvY2F0ZWQgcmVzb3VyY2UgYnkgd3BhbFBhY2tldEluaXQuCiAgICBGb3Igb3VyIGxlZ2FjeSBVTUFDLCBpdCBpcyBub3QgbmVlZGVkIGJlY2F1c2Ugdm9zX3BhY2tldCBjb250YWlucyBwYWxfcGFja2V0LgogICAgUGFyYW06IAogICAgICAgIHBQYWxDb250ZXh0IJYgQSBjb250ZXh0IFBBTCB1c2VzPz8KICAgIFJldHVybjoKICAgICAgICBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgLS0gc3VjY2VzcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp3cHRfc3RhdHVzIHdwYWxQYWNrZXRDbG9zZSh2b2lkICpwUGFsQ29udGV4dCk7CgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxQYWNrZXRBbGxvYyCWIEFsbG9jYXRlIGEgd3B0X3BhY2tldCBmcm9tIFBBTC4KICAgIFBhcmFtOiAKICAgICAgICBwUGFsQ29udGV4dCCWIEEgY29udGV4dCBQQUwgdXNlcz8/CiAgICAgICAgcGt0VHlwZSCWIHNwZWNpZnkgdGhlIHR5cGUgb2Ygd3B0X3BhY2tldCB0byBhbGxvY2F0ZQogICAgICAgIG5Qa3RTaXplIC0gc3BlY2lmeSB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBwYWNrZXQgYnVmZmVyLgogICAgUmV0dXJuOgogICAgICAgIEEgcG9pbnRlciB0byB0aGUgd3B0X3BhY2tldC4gTlVMTCBtZWFucyBmYWlsLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp3cHRfcGFja2V0ICogd3BhbFBhY2tldEFsbG9jKHdwdF9wYWNrZXRfdHlwZSBwa3RUeXBlLCB3cHRfdWludDMyIG5Qa3RTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdwYWxQYWNrZXRMb3dQYWNrZXRDQiByeExvd0NCLCB2b2lkICp1c3JkYXRhKTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB3cGFsUGFja2V0RnJlZSCWIEZyZWUgYSB3cHRfcGFja2V0IGNoYWluIGZvciBvbmUgcGFydGljdWxhciB0eXBlLgogICAgUGFja2V0IHR5cGUgaXMgY2FycmllZCBpbiB3cHRfcGFja2V0IHN0cnVjdHVyZS4KICAgIFBhcmFtOiAKICAgICAgICBwUGFsQ29udGV4dCCWIEEgY29udGV4dCBQQUwgdXNlcz8/CiAgICAgICAgcFBrdCAtIHBvaW50ZXIgdG8gYSBwYWNrZXQgdG8gYmUgZnJlZWQuCiAgICBSZXR1cm46CiAgICAgICAgZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTIC0gc3VjY2VzcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp3cHRfc3RhdHVzIHdwYWxQYWNrZXRGcmVlKHdwdF9wYWNrZXQgKnBQa3QpOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxQYWNrZXRHZXRMZW5ndGggliBHZXQgbnVtYmVyIG9mIGJ5dGVzIGluIGEgd3B0X3BhY2tldC4KICAgIFBhcmFtOiAKICAgICAgICBwUGFsQ29udGV4dCCWIFBBTCBjb250ZXh0IHJldHVybmVkIGZyb20gUEFMIG9wZW4KICAgICAgICBwUGt0IC0gcG9pbnRlciB0byBhIHBhY2tldCB0byBiZSBmcmVlZC4KICAgIFJldHVybjoKICAgICAgICBMZW5ndGggb2YgdGhlIGRhdGEgaW5jbHVkZSBsYXllci0yIGhlYWRlcnMuIEZvciBleGFtcGxlLCBpZiB0aGUgZnJhbWUgaXMgODAyLjMsIAogICAgICAgIHRoZSBsZW5ndGggaW5jbHVkZXMgdGhlIGV0aGVybmV0IGhlYWRlci4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kd3B0X3VpbnQzMiB3cGFsUGFja2V0R2V0TGVuZ3RoKHdwdF9wYWNrZXQgKnBQa3QpOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxQYWNrZXRSYXdUcmltSGVhZCCWIE1vdmUgdGhlIHN0YXJ0aW5nIG9mZnNldCBhbmQgcmVkdWNlIHBhY2tldCBsZW5ndGguCiAgICAgICAgICBUaGUgZnVuY3Rpb24gY2FuIG9ubHkgYmUgdXNlZCB3aXRoIHJhdyBwYWNrZXRzLAogICAgICAgICAgd2hvc2UgYnVmZmVyIGlzIG9uZSBwaWVjZSBhbmQgYWxsb2NhdGVkIGJ5IFdMQU4gZHJpdmVyLiAKICAgIFBhcmFtOiAKICAgICAgICBwUGt0IC0gcG9pbnRlciB0byBhIHdwdF9wYWNrZXQuCiAgICAgICAgc2l6ZSCWIG51bWJlciBvZiBieXRlcyB0byB0YWtlIG9mZiB0aGUgaGVhZC4KICAgIFJldHVybjoKICAgICAgICBlV1BBTF9TVEFUVVNfU1VDQ0VTUyAtIHN1Y2Nlc3MuIEZhaWwgb3RoZXJ3aXNlLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp3cHRfc3RhdHVzIHdwYWxQYWNrZXRSYXdUcmltSGVhZCh3cHRfcGFja2V0ICpwUGt0LCB3cHRfdWludDMyIHNpemUpOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxQYWNrZXRSYXdUcmltVGFpbCCWIHJlZHVjZSB0aGUgbGVuZ3RoIG9mIHRoZSBwYWNrZXQuIFRoZSBmdW5jdGlvbiBjYW4gCiAgICAgICAgICBvbmx5IGJlIHVzZWQgd2l0aCByYXcgcGFja2V0cywgd2hvc2UgYnVmZmVyIGlzIG9uZSBwaWVjZSBhbmQgCiAgICAgICAgICBhbGxvY2F0ZWQgYnkgV0xBTiBkcml2ZXIuIFRoaXMgYWxzbyByZWR1Y2UgdGhlIGxlbmd0aCBvZiB0aGUgcGFja2V0LgogICAgUGFyYW06IAogICAgICAgIHBQa3QgLSBwb2ludGVyIHRvIGEgd3B0X3BhY2tldC4KICAgICAgICBzaXplIJYgbnVtYmVyIG9mIGJ5dGVzIHRvIHRha2Ugb2YgdGhlIHBhY2tldCBsZW5ndGgKICAgIFJldHVybjoKICAgICAgICBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgliBzdWNjZXNzLiBPdGhlcndpc2UgZmFpbC4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kd3B0X3N0YXR1cyB3cGFsUGFja2V0UmF3VHJpbVRhaWwod3B0X3BhY2tldCAqcFBrdCwgd3B0X3VpbnQzMiBzaXplKTsKCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgd3BhbFBhY2tldEdldFJhd0J1ZiCWIFJldHVybiB0aGUgc3RhcnRpbmcgYnVmZmVyJ3MgdmlydHVhbCBhZGRyZXNzIGZvciB0aGUgUkFXIGZsYXQgYnVmZmVyCiAgICBJdCBpcyBpbmxpbmUgaW4gaG9wZSBvZiBmYXN0ZXIgaW1wbGVtZW50YXRpb24gZm9yIGNlcnRhaW4gcGxhdGZvcm0uCiAgICBQYXJhbTogCiAgICAgICAgcFBrdCAtIHBvaW50ZXIgdG8gYSB3cHRfcGFja2V0LgogICAgUmV0dXJuOgogICAgICAgIE5VTEwgLSBmYWlsLgogICAgICAgIE90aGVyd2lzZSB0aGUgYWRkcmVzcyBvZiB0aGUgc3RhcnRpbmcgb2YgdGhlIGJ1ZmZlcgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpleHRlcm4gV1BUX0lOTElORSB3cHRfdWludDggKndwYWxQYWNrZXRHZXRSYXdCdWYod3B0X3BhY2tldCAqcFBrdCk7CgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxQYWNrZXRTZXRSeExlbmd0aCCWIFNldCB0aGUgdmFsaWQgZGF0YSBsZW5ndGggb24gYSBSWCBwYWNrZXQuIFRoaXMgZnVuY3Rpb24gbXVzdCAKICAgIGJlIGNhbGxlZCBvbmNlIHBlciBSWCBwYWNrZXQgcGVyIHJlY2VpdmluZy4gSXQgaW5kaWNhdGVzIHRoZSBhdmFpbGFibGUgZGF0YSBsZW5ndGggZnJvbQogICAgdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIuCiAgICBQYXJhbTogCiAgICAgICAgcFBrdCAtIHBvaW50ZXIgdG8gYSB3cHRfcGFja2V0LgogICAgUmV0dXJuOgogICAgICAgIE5VTEwgLSBmYWlsLgogICAgICAgIE90aGVyd2lzZSB0aGUgYWRkcmVzcyBvZiB0aGUgc3RhcnRpbmcgb2YgdGhlIGJ1ZmZlcgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpleHRlcm4gV1BUX0lOTElORSB3cHRfc3RhdHVzIHdwYWxQYWNrZXRTZXRSeExlbmd0aCh3cHRfcGFja2V0ICpwUGt0LCB3cHRfdWludDMyIGxlbik7CgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxJdGVyYXRvckluaXQgliBJbml0aWFsaXplIGFuIGludGVyYXRvciBieSB1cGRhdGluZyBwQ3VyIHRvIGZpcnN0IGl0ZW0uCiAgICBQYXJhbTogCiAgICAgICAgcEl0ZXIgliBwb2ludGVyIHRvIGEgY2FsbGVyIGFsbG9jYXRlZCB3cHRfaXRlcmF0b3IKICAgICAgICBwUGFja2V0IJYgcG9pbnRlciB0byBhIHdwdF9wYWNrZXQKICAgIFJldHVybjoKICAgICAgICBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgLSBzdWNjZXNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCndwdF9zdGF0dXMgd3BhbEl0ZXJhdG9ySW5pdCh3cHRfaXRlcmF0b3IgKnBJdGVyLCB3cHRfcGFja2V0ICpwUGFja2V0KTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB3cGFsSXRlcmF0b3JOZXh0IJYgR2V0IHRoZSBhZGRyZXNzIGZvciB0aGUgbmV4dCBpdGVtCiAgICBQYXJhbTogCiAgICAgICAgcEl0ZXIgliBwb2ludGVyIHRvIGEgY2FsbGVyIGFsbG9jYXRlZCB3cHRfaXRlcmF0b3IKICAgICAgICBwUGFja2V0IJYgcG9pbnRlciB0byBhIHdwdF9wYWNrZXQKICAgICAgICBwcEFkZHIgliBDYWxsZXIgYWxsb2NhdGVkIHBvaW50ZXIgdG8gcmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBpdGVtLiBGb3IgRE1BLWFibGUgZGV2aWNlcywgdGhpcyBpcyB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgaXRlbS4KICAgICAgICBwTGVuIJYgVG8gcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGl0ZW0uCiAgICBSZXR1cm46CiAgICAgICAgZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTIC0gc3VjY2VzcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp3cHRfc3RhdHVzIHdwYWxJdGVyYXRvck5leHQod3B0X2l0ZXJhdG9yICpwSXRlciwgd3B0X3BhY2tldCAqcFBhY2tldCwgdm9pZCAqKnBwQWRkciwgd3B0X3VpbnQzMiAqcExlbik7CgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxMb2NrUGFja2V0Rm9yVHJhbnNmZXIgliBQYWNrZXQgbXVzdCBiZSBsb2NrZWQgYmVmb3JlIHRyYW5zZmVyIGNhbiBiZWdpbiwKICAgIHRoZSBsb2NrIHdpbGwgZW5zdXJlIHRoYXQgdGhlIERNQSBlbmdpbmUgaGFzIGFjY2VzcyB0byB0aGUgZGF0YSBwYWNrZXQKICAgIGluIGEgY2FjaGUgY29oZXJlbnQgbWFubmVyCiAKICAgIFBhcmFtOiAKICAgICAgICBwUGFja2V0IJYgcG9pbnRlciB0byBhIHdwdF9wYWNrZXQKIAogICAgUmV0dXJuOgogICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAtIHN1Y2Nlc3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kd3B0X3N0YXR1cyB3cGFsTG9ja1BhY2tldEZvclRyYW5zZmVyKCB3cHRfcGFja2V0ICpwUGFja2V0KTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB3cGFsVW5sb2NrUGFja2V0IJYgT25jZSB0aGUgdHJhbnNmZXIgaGFzIGJlZW4gY29tcGxldGVkIHRoZSBwYWNrZXQgc2hvdWxkCiAgICAgICAgICAgICAgICAgICAgICAgYmUgdW5sb2NrZWQgc28gdGhhdCBub3JtYWwgb3BlcmF0aW9uIG1heSByZXN1bWUKICAgIFBhcmFtOiAKICAgICAgICBwUGFja2V0IJYgcG9pbnRlciB0byBhIHdwdF9wYWNrZXQKIAogICAgUmV0dXJuOgogICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAtIHN1Y2Nlc3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kd3B0X3N0YXR1cyB3cGFsVW5sb2NrUGFja2V0KCB3cHRfcGFja2V0ICpwUGFja2V0KTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB3cGFsUGFja2V0R2V0RnJhZ0NvdW50IJYgR2V0IGNvdW50IG9mIG1lbW9yeSBjaGFpbnMgKGZyYWdtZW50cykKICAgICAgICAgICAgICAgICAgICAgICBpbiBhIHBhY2tldAogICAgUGFyYW06IAogICAgICAgIHBQYWNrZXQgliBwb2ludGVyIHRvIGEgd3B0X3BhY2tldAogCiAgICBSZXR1cm46CiAgICAgICAgbWVtb3J5IGZyYWdtZW50IGNvdW50IGluIGEgcGFja2V0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCndwdF9pbnQzMiB3cGFsUGFja2V0R2V0RnJhZ0NvdW50KHdwdF9wYWNrZXQgKnBQa3QpOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxJc1BhY2tldExvY2tlZCCWICBDaGVjayB3aGV0aGVyIHRoZSBQYWNrZXQgaXMgbG9ja2VkIGZvciBETUEuCiAgICBQYXJhbTogCiAgICAgICAgcFBhY2tldCCWIHBvaW50ZXIgdG8gYSB3cHRfcGFja2V0CiAKICAgIFJldHVybjoKICAgICAgICBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MKICAgICAgICBlV0xBTl9QQUxfU1RBVFVTX0VfRkFJTFVSRQogICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfRV9JTlZBTAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp3cHRfc3RhdHVzIHdwYWxJc1BhY2tldExvY2tlZCggd3B0X3BhY2tldCAqcFBhY2tldCk7CgojZW5kaWYgLy8gX19XTEFOX1FDVF9QQUxfUEFDS0VUX0gK