LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CiAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KCiAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCgogIERlc2NyaXB0aW9uOiAgQWJzdHJhY3QgTWVtb3J5IEludGVyZmFjZSBmb3IgeDg2IGNvbXBhdGlibGUKCiAgTGljZW5zZToKCiAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogICAgYXJlIG1ldDoKCiAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgoKICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgoKICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cwogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCiAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KCiAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCiAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAogICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCiAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCiAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CiAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCiAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCiAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoKICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CgogICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCiAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCiAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAgICAgICAgICAgICAkUkNTZmlsZTogYW1peDg2LmMsdiAkCgogICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKCiAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCgogICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAoKICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgogICAgICAgICAgICAgICAgICAgIC4uLgoKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIFJldmlzaW9uIEhpc3Rvcnk6CgogIHIucy46IGZpcnN0IGltcGxlbWV0YXRpb24KCiAgMjAwNi0wNi0xMyAgZC5rLjogZHVwbGljYXRlIGZ1bmN0aW9ucyBmb3IgbGl0dGxlIGVuZGlhbiBhbmQgYmlnIGVuZGlhbgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8vI2luY2x1ZGUgImdsb2JhbC5oIgovLyNpbmNsdWRlICJFcGxBbWkuaCIKI2luY2x1ZGUgIkVwbEluYy5oIgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gdHlwZWRlZgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKdHlwZWRlZiBzdHJ1Y3QgewoJdTE2IG1fd1dvcmQ7Cgp9IHR3U3RydWN0OwoKdHlwZWRlZiBzdHJ1Y3QgewoJdTMyIG1fZHdEd29yZDsKCn0gdGR3U3RydWN0OwoKdHlwZWRlZiBzdHJ1Y3QgewoJdTY0IG1fcXdRd29yZDsKCn0gdHF3U3RydWN0OwoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBBbWlTZXRYWFhUb0JlKCkKLy8KLy8gRGVzY3JpcHRpb246IHdyaXRlcyB0aGUgc3BlY2lmaWVkIHZhbHVlIHRvIHRoZSBhYnNvbHV0ZSBhZGRyZXNzIGluCi8vICAgICAgICAgICAgICBiaWcgZW5kaWFuCi8vCi8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgICAgICAgICA9IGFic29sdXRlIGFkZHJlc3MKLy8gICAgICAgICAgICAgIHhYWFhWYWxfcCAgICAgICAgICAgICAgID0gdmFsdWUKLy8KLy8gUmV0dXJuczogICAgIChub25lKQovLwovLyBTdGF0ZToKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vLS0tLS0tLS0tLS0tPCB3cml0ZSB1OCBpbiBiaWcgZW5kaWFuID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovKgp2b2lkIEFtaVNldEJ5dGVUb0JlICh2b2lkICpwQWRkcl9wLCB1OCBiQnl0ZVZhbF9wKQp7CgoJKih1OCAqKXBBZGRyX3AgPSBiQnl0ZVZhbF9wOwoKfQoqLwoKLy8tLS0tLS0tLS0tLS08IHdyaXRlIHUxNiBpbiBiaWcgZW5kaWFuID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKdm9pZCBBbWlTZXRXb3JkVG9CZSh2b2lkICogcEFkZHJfcCwgdTE2IHdXb3JkVmFsX3ApCnsKCXR3U3RydWN0ICpwd1N0cnVjdDsKCXR3U3RydWN0IHdWYWx1ZTsKCgl3VmFsdWUubV93V29yZCA9ICh1MTYpICgod1dvcmRWYWxfcCAmIDB4MDBGRikgPDwgOCk7CS8vTFNCIHRvIE1TQgoJd1ZhbHVlLm1fd1dvcmQgfD0gKHUxNikgKCh3V29yZFZhbF9wICYgMHhGRjAwKSA+PiA4KTsJLy9NU0IgdG8gTFNCCgoJcHdTdHJ1Y3QgPSAodHdTdHJ1Y3QgKikgcEFkZHJfcDsKCXB3U3RydWN0LT5tX3dXb3JkID0gd1ZhbHVlLm1fd1dvcmQ7Cgp9CgovLy0tLS0tLS0tLS0tLTwgd3JpdGUgdTMyIGluIGJpZyBlbmRpYW4gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnZvaWQgQW1pU2V0RHdvcmRUb0JlKHZvaWQgKnBBZGRyX3AsIHUzMiBkd0R3b3JkVmFsX3ApCnsKCXRkd1N0cnVjdCAqcGR3U3RydWN0OwoJdGR3U3RydWN0IGR3VmFsdWU7CgoJZHdWYWx1ZS5tX2R3RHdvcmQgPSAoKGR3RHdvcmRWYWxfcCAmIDB4MDAwMDAwRkYpIDw8IDI0KTsJLy9MU0IgdG8gTVNCCglkd1ZhbHVlLm1fZHdEd29yZCB8PSAoKGR3RHdvcmRWYWxfcCAmIDB4MDAwMEZGMDApIDw8IDgpOwoJZHdWYWx1ZS5tX2R3RHdvcmQgfD0gKChkd0R3b3JkVmFsX3AgJiAweDAwRkYwMDAwKSA+PiA4KTsKCWR3VmFsdWUubV9kd0R3b3JkIHw9ICgoZHdEd29yZFZhbF9wICYgMHhGRjAwMDAwMCkgPj4gMjQpOwkvL01TQiB0byBMU0IKCglwZHdTdHJ1Y3QgPSAodGR3U3RydWN0ICopIHBBZGRyX3A7CglwZHdTdHJ1Y3QtPm1fZHdEd29yZCA9IGR3VmFsdWUubV9kd0R3b3JkOwoKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gRnVuY3Rpb246ICAgIEFtaVNldFhYWFRvTGUoKQovLwovLyBEZXNjcmlwdGlvbjogd3JpdGVzIHRoZSBzcGVjaWZpZWQgdmFsdWUgdG8gdGhlIGFic29sdXRlIGFkZHJlc3MgaW4KLy8gICAgICAgICAgICAgIGxpdHRsZSBlbmRpYW4KLy8KLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICAgICAgICAgID0gYWJzb2x1dGUgYWRkcmVzcwovLyAgICAgICAgICAgICAgeFhYWFZhbF9wICAgICAgICAgICAgICAgPSB2YWx1ZQovLwovLyBSZXR1cm5zOiAgICAgKG5vbmUpCi8vCi8vIFN0YXRlOgovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8tLS0tLS0tLS0tLS08IHdyaXRlIHU4IGluIGxpdHRsZSBlbmRpYW4gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8qCnZvaWQgQW1pU2V0Qnl0ZVRvTGUgKHZvaWQgKnBBZGRyX3AsIHU4IGJCeXRlVmFsX3ApCnsKCgkqKHU4ICopcEFkZHJfcCA9IGJCeXRlVmFsX3A7Cgp9CiovCgovLy0tLS0tLS0tLS0tLTwgd3JpdGUgdTE2IGluIGxpdHRsZSBlbmRpYW4gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgp2b2lkIEFtaVNldFdvcmRUb0xlKHZvaWQgKnBBZGRyX3AsIHUxNiB3V29yZFZhbF9wKQp7Cgl0d1N0cnVjdCAqcHdTdHJ1Y3Q7CgoJcHdTdHJ1Y3QgPSAodHdTdHJ1Y3QgKikgcEFkZHJfcDsKCXB3U3RydWN0LT5tX3dXb3JkID0gd1dvcmRWYWxfcDsKCn0KCi8vLS0tLS0tLS0tLS0tPCB3cml0ZSB1MzIgaW4gbGl0dGxlIGVuZGlhbiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKdm9pZCBBbWlTZXREd29yZFRvTGUodm9pZCAqcEFkZHJfcCwgdTMyIGR3RHdvcmRWYWxfcCkKewoJdGR3U3RydWN0ICpwZHdTdHJ1Y3Q7CgoJcGR3U3RydWN0ID0gKHRkd1N0cnVjdCAqKSBwQWRkcl9wOwoJcGR3U3RydWN0LT5tX2R3RHdvcmQgPSBkd0R3b3JkVmFsX3A7Cgp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgQW1pR2V0WFhYRnJvbUJlKCkKLy8KLy8gRGVzY3JpcHRpb246IHJlYWRzIHRoZSBzcGVjaWZpZWQgdmFsdWUgZnJvbSB0aGUgYWJzb2x1dGUgYWRkcmVzcyBpbgovLyAgICAgICAgICAgICAgYmlnIGVuZGlhbgovLwovLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgICAgICAgICAgPSBhYnNvbHV0ZSBhZGRyZXNzCi8vCi8vIFJldHVybnM6ICAgICBYWFggICAgICAgICAgICAgICAgICAgICA9IHZhbHVlCi8vCi8vIFN0YXRlOgovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8tLS0tLS0tLS0tLS08IHJlYWQgdTggaW4gYmlnIGVuZGlhbiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8qCnU4IEFtaUdldEJ5dGVGcm9tQmUgKHZvaWQgKnBBZGRyX3ApCnsKCglyZXR1cm4gKCAqKHU4ICopcEFkZHJfcCApOwoKfQoqLwoKLy8tLS0tLS0tLS0tLS08IHJlYWQgdTE2IGluIGJpZyBlbmRpYW4gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKdTE2IEFtaUdldFdvcmRGcm9tQmUodm9pZCAqcEFkZHJfcCkKewoJdHdTdHJ1Y3QgKnB3U3RydWN0OwoJdHdTdHJ1Y3Qgd1ZhbHVlOwoKCXB3U3RydWN0ID0gKHR3U3RydWN0ICopIHBBZGRyX3A7CgoJd1ZhbHVlLm1fd1dvcmQgPSAodTE2KSAoKHB3U3RydWN0LT5tX3dXb3JkICYgMHgwMEZGKSA8PCA4KTsJLy9MU0IgdG8gTVNCCgl3VmFsdWUubV93V29yZCB8PSAodTE2KSAoKHB3U3RydWN0LT5tX3dXb3JkICYgMHhGRjAwKSA+PiA4KTsJLy9NU0IgdG8gTFNCCgoJcmV0dXJuICh3VmFsdWUubV93V29yZCk7Cgp9CgovLy0tLS0tLS0tLS0tLTwgcmVhZCB1MzIgaW4gYmlnIGVuZGlhbiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnUzMiBBbWlHZXREd29yZEZyb21CZSh2b2lkICpwQWRkcl9wKQp7Cgl0ZHdTdHJ1Y3QgKnBkd1N0cnVjdDsKCXRkd1N0cnVjdCBkd1ZhbHVlOwoKCXBkd1N0cnVjdCA9ICh0ZHdTdHJ1Y3QgKikgcEFkZHJfcDsKCglkd1ZhbHVlLm1fZHdEd29yZCA9ICgocGR3U3RydWN0LT5tX2R3RHdvcmQgJiAweDAwMDAwMEZGKSA8PCAyNCk7CS8vTFNCIHRvIE1TQgoJZHdWYWx1ZS5tX2R3RHdvcmQgfD0gKChwZHdTdHJ1Y3QtPm1fZHdEd29yZCAmIDB4MDAwMEZGMDApIDw8IDgpOwoJZHdWYWx1ZS5tX2R3RHdvcmQgfD0gKChwZHdTdHJ1Y3QtPm1fZHdEd29yZCAmIDB4MDBGRjAwMDApID4+IDgpOwoJZHdWYWx1ZS5tX2R3RHdvcmQgfD0gKChwZHdTdHJ1Y3QtPm1fZHdEd29yZCAmIDB4RkYwMDAwMDApID4+IDI0KTsJLy9NU0IgdG8gTFNCCgoJcmV0dXJuIChkd1ZhbHVlLm1fZHdEd29yZCk7Cgp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgQW1pR2V0WFhYRnJvbUxlKCkKLy8KLy8gRGVzY3JpcHRpb246IHJlYWRzIHRoZSBzcGVjaWZpZWQgdmFsdWUgZnJvbSB0aGUgYWJzb2x1dGUgYWRkcmVzcyBpbgovLyAgICAgICAgICAgICAgbGl0dGxlIGVuZGlhbgovLwovLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgICAgICAgICAgPSBhYnNvbHV0ZSBhZGRyZXNzCi8vCi8vIFJldHVybnM6ICAgICBYWFggICAgICAgICAgICAgICAgICAgICA9IHZhbHVlCi8vCi8vIFN0YXRlOgovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8tLS0tLS0tLS0tLS08IHJlYWQgdTggaW4gbGl0dGxlIGVuZGlhbiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8qCnU4IEFtaUdldEJ5dGVGcm9tTGUgKHZvaWQgKnBBZGRyX3ApCnsKCglyZXR1cm4gKCAqKHU4ICopcEFkZHJfcCApOwoKfQoqLwoKLy8tLS0tLS0tLS0tLS08IHJlYWQgdTE2IGluIGxpdHRsZSBlbmRpYW4gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKdTE2IEFtaUdldFdvcmRGcm9tTGUodm9pZCAqcEFkZHJfcCkKewoJdHdTdHJ1Y3QgKnB3U3RydWN0OwoKCXB3U3RydWN0ID0gKHR3U3RydWN0ICopIHBBZGRyX3A7CglyZXR1cm4gKHB3U3RydWN0LT5tX3dXb3JkKTsKfQoKLy8tLS0tLS0tLS0tLS08IHJlYWQgdTMyIGluIGxpdHRsZSBlbmRpYW4gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgp1MzIgQW1pR2V0RHdvcmRGcm9tTGUodm9pZCAqcEFkZHJfcCkKewoJdGR3U3RydWN0ICpwZHdTdHJ1Y3Q7CgoJcGR3U3RydWN0ID0gKHRkd1N0cnVjdCAqKSBwQWRkcl9wOwoJcmV0dXJuIChwZHdTdHJ1Y3QtPm1fZHdEd29yZCk7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBBbWlTZXREd29yZDI0VG9CZSgpCi8vCi8vIERlc2NyaXB0aW9uOiBzZXRzIGEgMjQgYml0IHZhbHVlIHRvIGEgYnVmZmVyIGluIGJpZyBlbmRpYW4KLy8KLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gZGVzdGluYXRpb24gYnVmZmVyCi8vICAgICAgICAgICAgICBkd0R3b3JkVmFsX3AgICAgPSB2YWx1ZSB0byBzZXQKLy8KLy8gUmV0dXJuOiAgICAgIHZvaWQKLy8KLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnZvaWQgQW1pU2V0RHdvcmQyNFRvQmUodm9pZCAqcEFkZHJfcCwgdTMyIGR3RHdvcmRWYWxfcCkKewoJKCh1OCAqKSBwQWRkcl9wKVswXSA9ICgodTggKikgJiBkd0R3b3JkVmFsX3ApWzJdOwoJKCh1OCAqKSBwQWRkcl9wKVsxXSA9ICgodTggKikgJiBkd0R3b3JkVmFsX3ApWzFdOwoJKCh1OCAqKSBwQWRkcl9wKVsyXSA9ICgodTggKikgJiBkd0R3b3JkVmFsX3ApWzBdOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgQW1pU2V0RHdvcmQyNFRvTGUoKQovLwovLyBEZXNjcmlwdGlvbjogc2V0cyBhIDI0IGJpdCB2YWx1ZSB0byBhIGJ1ZmZlciBpbiBsaXR0bGUgZW5kaWFuCi8vCi8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlcgovLyAgICAgICAgICAgICAgZHdEd29yZFZhbF9wICAgID0gdmFsdWUgdG8gc2V0Ci8vCi8vIFJldHVybjogICAgICB2b2lkCi8vCi8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCi8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgp2b2lkIEFtaVNldER3b3JkMjRUb0xlKHZvaWQgKnBBZGRyX3AsIHUzMiBkd0R3b3JkVmFsX3ApCnsKCSgodTggKikgcEFkZHJfcClbMF0gPSAoKHU4ICopICYgZHdEd29yZFZhbF9wKVswXTsKCSgodTggKikgcEFkZHJfcClbMV0gPSAoKHU4ICopICYgZHdEd29yZFZhbF9wKVsxXTsKCSgodTggKikgcEFkZHJfcClbMl0gPSAoKHU4ICopICYgZHdEd29yZFZhbF9wKVsyXTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gRnVuY3Rpb246ICAgIEFtaUdldER3b3JkMjRGcm9tQmUoKQovLwovLyBEZXNjcmlwdGlvbjogcmVhZHMgYSAyNCBiaXQgdmFsdWUgZnJvbSBhIGJ1ZmZlciBpbiBiaWcgZW5kaWFuCi8vCi8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIKLy8KLy8gUmV0dXJuOiAgICAgIHUzMiAgICAgICAgICAgPSByZWFkIHZhbHVlCi8vCi8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCi8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnUzMiBBbWlHZXREd29yZDI0RnJvbUJlKHZvaWQgKnBBZGRyX3ApCnsKCXRkd1N0cnVjdCBkd1N0cnVjdDsKCglkd1N0cnVjdC5tX2R3RHdvcmQgPSBBbWlHZXREd29yZEZyb21CZShwQWRkcl9wKTsKCWR3U3RydWN0Lm1fZHdEd29yZCA+Pj0gODsKCglyZXR1cm4gKGR3U3RydWN0Lm1fZHdEd29yZCk7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBBbWlHZXREd29yZDI0RnJvbUxlKCkKLy8KLy8gRGVzY3JpcHRpb246IHJlYWRzIGEgMjQgYml0IHZhbHVlIGZyb20gYSBidWZmZXIgaW4gbGl0dGxlIGVuZGlhbgovLwovLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBzb3VyY2UgYnVmZmVyCi8vCi8vIFJldHVybjogICAgICB1MzIgICAgICAgICAgID0gcmVhZCB2YWx1ZQovLwovLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp1MzIgQW1pR2V0RHdvcmQyNEZyb21MZSh2b2lkICpwQWRkcl9wKQp7Cgl0ZHdTdHJ1Y3QgZHdTdHJ1Y3Q7CgoJZHdTdHJ1Y3QubV9kd0R3b3JkID0gQW1pR2V0RHdvcmRGcm9tTGUocEFkZHJfcCk7Cglkd1N0cnVjdC5tX2R3RHdvcmQgJj0gMHgwMEZGRkZGRjsKCglyZXR1cm4gKGR3U3RydWN0Lm1fZHdEd29yZCk7Cn0KCi8vI2lmZGVmIFVTRV9WQVI2NAoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gRnVuY3Rpb246ICAgIEFtaVNldFF3b3JkNjRUb0JlKCkKLy8KLy8gRGVzY3JpcHRpb246IHNldHMgYSA2NCBiaXQgdmFsdWUgdG8gYSBidWZmZXIgaW4gYmlnIGVuZGlhbgovLwovLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBkZXN0aW5hdGlvbiBidWZmZXIKLy8gICAgICAgICAgICAgIHF3UXdvcmRWYWxfcCAgICA9IHF1YWRydXBsZSB3b3JkIHZhbHVlCi8vCi8vIFJldHVybjogICAgICB2b2lkCi8vCi8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCi8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnZvaWQgQW1pU2V0UXdvcmQ2NFRvQmUodm9pZCAqcEFkZHJfcCwgdTY0IHF3UXdvcmRWYWxfcCkKewoJKCh1OCAqKSBwQWRkcl9wKVswXSA9ICgodTggKikgJiBxd1F3b3JkVmFsX3ApWzddOwoJKCh1OCAqKSBwQWRkcl9wKVsxXSA9ICgodTggKikgJiBxd1F3b3JkVmFsX3ApWzZdOwoJKCh1OCAqKSBwQWRkcl9wKVsyXSA9ICgodTggKikgJiBxd1F3b3JkVmFsX3ApWzVdOwoJKCh1OCAqKSBwQWRkcl9wKVszXSA9ICgodTggKikgJiBxd1F3b3JkVmFsX3ApWzRdOwoJKCh1OCAqKSBwQWRkcl9wKVs0XSA9ICgodTggKikgJiBxd1F3b3JkVmFsX3ApWzNdOwoJKCh1OCAqKSBwQWRkcl9wKVs1XSA9ICgodTggKikgJiBxd1F3b3JkVmFsX3ApWzJdOwoJKCh1OCAqKSBwQWRkcl9wKVs2XSA9ICgodTggKikgJiBxd1F3b3JkVmFsX3ApWzFdOwoJKCh1OCAqKSBwQWRkcl9wKVs3XSA9ICgodTggKikgJiBxd1F3b3JkVmFsX3ApWzBdOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgQW1pU2V0UXdvcmQ2NFRvTGUoKQovLwovLyBEZXNjcmlwdGlvbjogc2V0cyBhIDY0IGJpdCB2YWx1ZSB0byBhIGJ1ZmZlciBpbiBsaXR0bGUgZW5kaWFuCi8vCi8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlcgovLyAgICAgICAgICAgICAgcXdRd29yZFZhbF9wICAgID0gcXVhZHJ1cGxlIHdvcmQgdmFsdWUKLy8KLy8gUmV0dXJuOiAgICAgIHZvaWQKLy8KLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kdm9pZCBBbWlTZXRRd29yZDY0VG9MZSh2b2lkICpwQWRkcl9wLCB1NjQgcXdRd29yZFZhbF9wKQp7Cgl1NjQgKnBxd0RzdDsKCglwcXdEc3QgPSAodTY0ICopIHBBZGRyX3A7CgkqcHF3RHN0ID0gcXdRd29yZFZhbF9wOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgQW1pR2V0UXdvcmQ2NEZyb21CZSgpCi8vCi8vIERlc2NyaXB0aW9uOiByZWFkcyBhIDY0IGJpdCB2YWx1ZSBmcm9tIGEgYnVmZmVyIGluIGJpZyBlbmRpYW4KLy8KLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gc291cmNlIGJ1ZmZlcgovLwovLyBSZXR1cm46ICAgICAgdm9pZAovLwovLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp1NjQgQW1pR2V0UXdvcmQ2NEZyb21CZSh2b2lkICpwQWRkcl9wKQp7Cgl0cXdTdHJ1Y3QgcXdTdHJ1Y3Q7CgoJKCh1OCAqKSAmIHF3U3RydWN0Lm1fcXdRd29yZClbMF0gPSAoKHU4ICopIHBBZGRyX3ApWzddOwoJKCh1OCAqKSAmIHF3U3RydWN0Lm1fcXdRd29yZClbMV0gPSAoKHU4ICopIHBBZGRyX3ApWzZdOwoJKCh1OCAqKSAmIHF3U3RydWN0Lm1fcXdRd29yZClbMl0gPSAoKHU4ICopIHBBZGRyX3ApWzVdOwoJKCh1OCAqKSAmIHF3U3RydWN0Lm1fcXdRd29yZClbM10gPSAoKHU4ICopIHBBZGRyX3ApWzRdOwoJKCh1OCAqKSAmIHF3U3RydWN0Lm1fcXdRd29yZClbNF0gPSAoKHU4ICopIHBBZGRyX3ApWzNdOwoJKCh1OCAqKSAmIHF3U3RydWN0Lm1fcXdRd29yZClbNV0gPSAoKHU4ICopIHBBZGRyX3ApWzJdOwoJKCh1OCAqKSAmIHF3U3RydWN0Lm1fcXdRd29yZClbNl0gPSAoKHU4ICopIHBBZGRyX3ApWzFdOwoJKCh1OCAqKSAmIHF3U3RydWN0Lm1fcXdRd29yZClbN10gPSAoKHU4ICopIHBBZGRyX3ApWzBdOwoKCXJldHVybiAocXdTdHJ1Y3QubV9xd1F3b3JkKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gRnVuY3Rpb246ICAgIEFtaUdldFF3b3JkNjRGcm9tTGUoKQovLwovLyBEZXNjcmlwdGlvbjogcmVhZHMgYSA2NCBiaXQgdmFsdWUgZnJvbSBhIGJ1ZmZlciBpbiBsaXR0bGUgZW5kaWFuCi8vCi8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIKLy8KLy8gUmV0dXJuOiAgICAgIHZvaWQKLy8KLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdTY0IEFtaUdldFF3b3JkNjRGcm9tTGUodm9pZCAqcEFkZHJfcCkKewoJdHF3U3RydWN0ICpwcXdTdHJ1Y3Q7Cgl0cXdTdHJ1Y3QgcXdTdHJ1Y3Q7CgoJcHF3U3RydWN0ID0gKHRxd1N0cnVjdCAqKSBwQWRkcl9wOwoJcXdTdHJ1Y3QubV9xd1F3b3JkID0gcHF3U3RydWN0LT5tX3F3UXdvcmQ7CgoJcmV0dXJuIChxd1N0cnVjdC5tX3F3UXdvcmQpOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgQW1pU2V0UXdvcmQ0MFRvQmUoKQovLwovLyBEZXNjcmlwdGlvbjogc2V0cyBhIDQwIGJpdCB2YWx1ZSB0byBhIGJ1ZmZlciBpbiBiaWcgZW5kaWFuCi8vCi8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlcgovLyAgICAgICAgICAgICAgcXdRd29yZFZhbF9wICAgID0gcXVhZHJ1cGxlIHdvcmQgdmFsdWUKLy8KLy8gUmV0dXJuOiAgICAgIHZvaWQKLy8KLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnZvaWQgQW1pU2V0UXdvcmQ0MFRvQmUodm9pZCAqcEFkZHJfcCwgdTY0IHF3UXdvcmRWYWxfcCkKewoKCSgodTggKikgcEFkZHJfcClbMF0gPSAoKHU4ICopICYgcXdRd29yZFZhbF9wKVs0XTsKCSgodTggKikgcEFkZHJfcClbMV0gPSAoKHU4ICopICYgcXdRd29yZFZhbF9wKVszXTsKCSgodTggKikgcEFkZHJfcClbMl0gPSAoKHU4ICopICYgcXdRd29yZFZhbF9wKVsyXTsKCSgodTggKikgcEFkZHJfcClbM10gPSAoKHU4ICopICYgcXdRd29yZFZhbF9wKVsxXTsKCSgodTggKikgcEFkZHJfcClbNF0gPSAoKHU4ICopICYgcXdRd29yZFZhbF9wKVswXTsKCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBBbWlTZXRRd29yZDQwVG9MZSgpCi8vCi8vIERlc2NyaXB0aW9uOiBzZXRzIGEgNDAgYml0IHZhbHVlIHRvIGEgYnVmZmVyIGluIGxpdHRsZSBlbmRpYW4KLy8KLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gZGVzdGluYXRpb24gYnVmZmVyCi8vICAgICAgICAgICAgICBxd1F3b3JkVmFsX3AgICAgPSBxdWFkcnVwbGUgd29yZCB2YWx1ZQovLwovLyBSZXR1cm46ICAgICAgdm9pZAovLwovLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKdm9pZCBBbWlTZXRRd29yZDQwVG9MZSh2b2lkICpwQWRkcl9wLCB1NjQgcXdRd29yZFZhbF9wKQp7CgoJKCh1MzIgKikgcEFkZHJfcClbMF0gPSAoKHUzMiAqKSAmIHF3UXdvcmRWYWxfcClbMF07CgkoKHU4ICopIHBBZGRyX3ApWzRdID0gKCh1OCAqKSAmIHF3UXdvcmRWYWxfcClbNF07Cgp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgQW1pR2V0UXdvcmQ0MEZyb21CZSgpCi8vCi8vIERlc2NyaXB0aW9uOiByZWFkcyBhIDQwIGJpdCB2YWx1ZSBmcm9tIGEgYnVmZmVyIGluIGJpZyBlbmRpYW4KLy8KLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gc291cmNlIGJ1ZmZlcgovLwovLyBSZXR1cm46ICAgICAgdTY0Ci8vCi8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCi8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgp1NjQgQW1pR2V0UXdvcmQ0MEZyb21CZSh2b2lkICpwQWRkcl9wKQp7CgoJdHF3U3RydWN0IHF3U3RydWN0OwoKCXF3U3RydWN0Lm1fcXdRd29yZCA9IEFtaUdldFF3b3JkNjRGcm9tQmUocEFkZHJfcCk7Cglxd1N0cnVjdC5tX3F3UXdvcmQgPj49IDI0OwoKCXJldHVybiAocXdTdHJ1Y3QubV9xd1F3b3JkKTsKCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBBbWlHZXRRd29yZDQwRnJvbUxlKCkKLy8KLy8gRGVzY3JpcHRpb246IHJlYWRzIGEgNDAgYml0IHZhbHVlIGZyb20gYSBidWZmZXIgaW4gbGl0dGxlIGVuZGlhbgovLwovLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBzb3VyY2UgYnVmZmVyCi8vCi8vIFJldHVybjogICAgICB1NjQKLy8KLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnU2NCBBbWlHZXRRd29yZDQwRnJvbUxlKHZvaWQgKnBBZGRyX3ApCnsKCgl0cXdTdHJ1Y3QgcXdTdHJ1Y3Q7CgoJcXdTdHJ1Y3QubV9xd1F3b3JkID0gQW1pR2V0UXdvcmQ2NEZyb21MZShwQWRkcl9wKTsKCXF3U3RydWN0Lm1fcXdRd29yZCAmPSAweDAwMDAwMEZGRkZGRkZGRkZMTDsKCglyZXR1cm4gKHF3U3RydWN0Lm1fcXdRd29yZCk7Cgp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgQW1pU2V0UXdvcmQ0OFRvQmUoKQovLwovLyBEZXNjcmlwdGlvbjogc2V0cyBhIDQ4IGJpdCB2YWx1ZSB0byBhIGJ1ZmZlciBpbiBiaWcgZW5kaWFuCi8vCi8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlcgovLyAgICAgICAgICAgICAgcXdRd29yZFZhbF9wICAgID0gcXVhZHJ1cGxlIHdvcmQgdmFsdWUKLy8KLy8gUmV0dXJuOiAgICAgIHZvaWQKLy8KLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnZvaWQgQW1pU2V0UXdvcmQ0OFRvQmUodm9pZCAqcEFkZHJfcCwgdTY0IHF3UXdvcmRWYWxfcCkKewoKCSgodTggKikgcEFkZHJfcClbMF0gPSAoKHU4ICopICYgcXdRd29yZFZhbF9wKVs1XTsKCSgodTggKikgcEFkZHJfcClbMV0gPSAoKHU4ICopICYgcXdRd29yZFZhbF9wKVs0XTsKCSgodTggKikgcEFkZHJfcClbMl0gPSAoKHU4ICopICYgcXdRd29yZFZhbF9wKVszXTsKCSgodTggKikgcEFkZHJfcClbM10gPSAoKHU4ICopICYgcXdRd29yZFZhbF9wKVsyXTsKCSgodTggKikgcEFkZHJfcClbNF0gPSAoKHU4ICopICYgcXdRd29yZFZhbF9wKVsxXTsKCSgodTggKikgcEFkZHJfcClbNV0gPSAoKHU4ICopICYgcXdRd29yZFZhbF9wKVswXTsKCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBBbWlTZXRRd29yZDQ4VG9MZSgpCi8vCi8vIERlc2NyaXB0aW9uOiBzZXRzIGEgNDggYml0IHZhbHVlIHRvIGEgYnVmZmVyIGluIGxpdHRsZSBlbmRpYW4KLy8KLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gZGVzdGluYXRpb24gYnVmZmVyCi8vICAgICAgICAgICAgICBxd1F3b3JkVmFsX3AgICAgPSBxdWFkcnVwbGUgd29yZCB2YWx1ZQovLwovLyBSZXR1cm46ICAgICAgdm9pZAovLwovLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKdm9pZCBBbWlTZXRRd29yZDQ4VG9MZSh2b2lkICpwQWRkcl9wLCB1NjQgcXdRd29yZFZhbF9wKQp7CgoJKCh1MzIgKikgcEFkZHJfcClbMF0gPSAoKHUzMiAqKSAmIHF3UXdvcmRWYWxfcClbMF07CgkoKHUxNiAqKSBwQWRkcl9wKVsyXSA9ICgodTE2ICopICYgcXdRd29yZFZhbF9wKVsyXTsKCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBBbWlHZXRRd29yZDQ4RnJvbUJlKCkKLy8KLy8gRGVzY3JpcHRpb246IHJlYWRzIGEgNDggYml0IHZhbHVlIGZyb20gYSBidWZmZXIgaW4gYmlnIGVuZGlhbgovLwovLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBzb3VyY2UgYnVmZmVyCi8vCi8vIFJldHVybjogICAgICB1NjQKLy8KLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnU2NCBBbWlHZXRRd29yZDQ4RnJvbUJlKHZvaWQgKnBBZGRyX3ApCnsKCgl0cXdTdHJ1Y3QgcXdTdHJ1Y3Q7CgoJcXdTdHJ1Y3QubV9xd1F3b3JkID0gQW1pR2V0UXdvcmQ2NEZyb21CZShwQWRkcl9wKTsKCXF3U3RydWN0Lm1fcXdRd29yZCA+Pj0gMTY7CgoJcmV0dXJuIChxd1N0cnVjdC5tX3F3UXdvcmQpOwoKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gRnVuY3Rpb246ICAgIEFtaUdldFF3b3JkNDhGcm9tTGUoKQovLwovLyBEZXNjcmlwdGlvbjogcmVhZHMgYSA0OCBiaXQgdmFsdWUgZnJvbSBhIGJ1ZmZlciBpbiBsaXR0bGUgZW5kaWFuCi8vCi8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIKLy8KLy8gUmV0dXJuOiAgICAgIHU2NAovLwovLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKdTY0IEFtaUdldFF3b3JkNDhGcm9tTGUodm9pZCAqcEFkZHJfcCkKewoKCXRxd1N0cnVjdCBxd1N0cnVjdDsKCglxd1N0cnVjdC5tX3F3UXdvcmQgPSBBbWlHZXRRd29yZDY0RnJvbUxlKHBBZGRyX3ApOwoJcXdTdHJ1Y3QubV9xd1F3b3JkICY9IDB4MDAwMEZGRkZGRkZGRkZGRkxMOwoKCXJldHVybiAocXdTdHJ1Y3QubV9xd1F3b3JkKTsKCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBBbWlTZXRRd29yZDU2VG9CZSgpCi8vCi8vIERlc2NyaXB0aW9uOiBzZXRzIGEgNTYgYml0IHZhbHVlIHRvIGEgYnVmZmVyIGluIGJpZyBlbmRpYW4KLy8KLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gZGVzdGluYXRpb24gYnVmZmVyCi8vICAgICAgICAgICAgICBxd1F3b3JkVmFsX3AgICAgPSBxdWFkcnVwbGUgd29yZCB2YWx1ZQovLwovLyBSZXR1cm46ICAgICAgdm9pZAovLwovLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKdm9pZCBBbWlTZXRRd29yZDU2VG9CZSh2b2lkICpwQWRkcl9wLCB1NjQgcXdRd29yZFZhbF9wKQp7CgoJKCh1OCAqKSBwQWRkcl9wKVswXSA9ICgodTggKikgJiBxd1F3b3JkVmFsX3ApWzZdOwoJKCh1OCAqKSBwQWRkcl9wKVsxXSA9ICgodTggKikgJiBxd1F3b3JkVmFsX3ApWzVdOwoJKCh1OCAqKSBwQWRkcl9wKVsyXSA9ICgodTggKikgJiBxd1F3b3JkVmFsX3ApWzRdOwoJKCh1OCAqKSBwQWRkcl9wKVszXSA9ICgodTggKikgJiBxd1F3b3JkVmFsX3ApWzNdOwoJKCh1OCAqKSBwQWRkcl9wKVs0XSA9ICgodTggKikgJiBxd1F3b3JkVmFsX3ApWzJdOwoJKCh1OCAqKSBwQWRkcl9wKVs1XSA9ICgodTggKikgJiBxd1F3b3JkVmFsX3ApWzFdOwoJKCh1OCAqKSBwQWRkcl9wKVs2XSA9ICgodTggKikgJiBxd1F3b3JkVmFsX3ApWzBdOwoKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gRnVuY3Rpb246ICAgIEFtaVNldFF3b3JkNTZUb0xlKCkKLy8KLy8gRGVzY3JpcHRpb246IHNldHMgYSA1NiBiaXQgdmFsdWUgdG8gYSBidWZmZXIgaW4gbGl0dGxlIGVuZGlhbgovLwovLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBkZXN0aW5hdGlvbiBidWZmZXIKLy8gICAgICAgICAgICAgIHF3UXdvcmRWYWxfcCAgICA9IHF1YWRydXBsZSB3b3JkIHZhbHVlCi8vCi8vIFJldHVybjogICAgICB2b2lkCi8vCi8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCi8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgp2b2lkIEFtaVNldFF3b3JkNTZUb0xlKHZvaWQgKnBBZGRyX3AsIHU2NCBxd1F3b3JkVmFsX3ApCnsKCgkoKHUzMiAqKSBwQWRkcl9wKVswXSA9ICgodTMyICopICYgcXdRd29yZFZhbF9wKVswXTsKCSgodTE2ICopIHBBZGRyX3ApWzJdID0gKCh1MTYgKikgJiBxd1F3b3JkVmFsX3ApWzJdOwoJKCh1OCAqKSBwQWRkcl9wKVs2XSA9ICgodTggKikgJiBxd1F3b3JkVmFsX3ApWzZdOwoKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gRnVuY3Rpb246ICAgIEFtaUdldFF3b3JkNTZGcm9tQmUoKQovLwovLyBEZXNjcmlwdGlvbjogcmVhZHMgYSA1NiBiaXQgdmFsdWUgZnJvbSBhIGJ1ZmZlciBpbiBiaWcgZW5kaWFuCi8vCi8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIKLy8KLy8gUmV0dXJuOiAgICAgIHU2NAovLwovLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKdTY0IEFtaUdldFF3b3JkNTZGcm9tQmUodm9pZCAqcEFkZHJfcCkKewoKCXRxd1N0cnVjdCBxd1N0cnVjdDsKCglxd1N0cnVjdC5tX3F3UXdvcmQgPSBBbWlHZXRRd29yZDY0RnJvbUJlKHBBZGRyX3ApOwoJcXdTdHJ1Y3QubV9xd1F3b3JkID4+PSA4OwoKCXJldHVybiAocXdTdHJ1Y3QubV9xd1F3b3JkKTsKCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBBbWlHZXRRd29yZDU2RnJvbUxlKCkKLy8KLy8gRGVzY3JpcHRpb246IHJlYWRzIGEgNTYgYml0IHZhbHVlIGZyb20gYSBidWZmZXIgaW4gbGl0dGxlIGVuZGlhbgovLwovLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBzb3VyY2UgYnVmZmVyCi8vCi8vIFJldHVybjogICAgICB1NjQKLy8KLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnU2NCBBbWlHZXRRd29yZDU2RnJvbUxlKHZvaWQgKnBBZGRyX3ApCnsKCgl0cXdTdHJ1Y3QgcXdTdHJ1Y3Q7CgoJcXdTdHJ1Y3QubV9xd1F3b3JkID0gQW1pR2V0UXdvcmQ2NEZyb21MZShwQWRkcl9wKTsKCXF3U3RydWN0Lm1fcXdRd29yZCAmPSAweDAwRkZGRkZGRkZGRkZGRkZMTDsKCglyZXR1cm4gKHF3U3RydWN0Lm1fcXdRd29yZCk7Cgp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgQW1pU2V0VGltZU9mRGF5KCkKLy8KLy8gRGVzY3JpcHRpb246IHNldHMgYSBUSU1FX09GX0RBWSAoQ0FOb3BlbikgdmFsdWUgdG8gYSBidWZmZXIKLy8KLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gZGVzdGluYXRpb24gYnVmZmVyCi8vICAgICAgICAgICAgICBwVGltZU9mRGF5X3AgICAgPSBwb2ludGVyIHRvIHN0cnVjdCBUSU1FX09GX0RBWQovLwovLyBSZXR1cm46ICAgICAgdm9pZAovLwovLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKdm9pZCBBbWlTZXRUaW1lT2ZEYXkodm9pZCAqcEFkZHJfcCwgdFRpbWVPZkRheSAqcFRpbWVPZkRheV9wKQp7CgoJQW1pU2V0RHdvcmRUb0xlKCgodTggKikgcEFkZHJfcCksIHBUaW1lT2ZEYXlfcC0+bV9kd01zICYgMHgwRkZGRkZGRik7CglBbWlTZXRXb3JkVG9MZSgoKHU4ICopIHBBZGRyX3ApICsgNCwgcFRpbWVPZkRheV9wLT5tX3dEYXlzKTsKCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBBbWlHZXRUaW1lT2ZEYXkoKQovLwovLyBEZXNjcmlwdGlvbjogcmVhZHMgYSBUSU1FX09GX0RBWSAoQ0FOb3BlbikgdmFsdWUgZnJvbSBhIGJ1ZmZlcgovLwovLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBzb3VyY2UgYnVmZmVyCi8vICAgICAgICAgICAgICBwVGltZU9mRGF5X3AgICAgPSBwb2ludGVyIHRvIHN0cnVjdCBUSU1FX09GX0RBWQovLwovLyBSZXR1cm46ICAgICAgdm9pZAovLwovLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKdm9pZCBBbWlHZXRUaW1lT2ZEYXkodm9pZCAqcEFkZHJfcCwgdFRpbWVPZkRheSAqcFRpbWVPZkRheV9wKQp7CgoJcFRpbWVPZkRheV9wLT5tX2R3TXMgPSBBbWlHZXREd29yZEZyb21MZSgoKHU4ICopIHBBZGRyX3ApKSAmIDB4MEZGRkZGRkY7CglwVGltZU9mRGF5X3AtPm1fd0RheXMgPSBBbWlHZXRXb3JkRnJvbUxlKCgodTggKikgcEFkZHJfcCkgKyA0KTsKCn0KCi8vIEVPRgoKLy8gRGllIGxldHp0ZSBaZWlsZSBtdd8gdW5iZWRpbmd0IGVpbmUgbGVlcmUgWmVpbGUgc2Vpbiwgd2VpbCBtYW5jaGUgQ29tcGlsZXIKLy8gZGFtaXQgZWluIFByb2JsZW0gaGFiZW4sIHdlbm4gZGFzIG5pY2h0IHNvIGlzdCAoei5CLiBHTlUgb2RlciBCb3JsYW5kIEMrKyBCdWlsZGVyKS4K