LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CiAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KCiAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCgogIERlc2NyaXB0aW9uOiAgQWJzdHJhY3QgTWVtb3J5IEludGVyZmFjZSBmb3IgeDg2IGNvbXBhdGlibGUKCiAgTGljZW5zZToKCiAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogICAgYXJlIG1ldDoKCiAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgoKICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgoKICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cwogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCiAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KCiAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCiAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAogICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCiAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCiAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CiAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCiAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCiAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoKICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CgogICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCiAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCiAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAgICAgICAgICAgICAkUkNTZmlsZTogYW1peDg2LmMsdiAkCgogICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKCiAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCgogICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAoKICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgogICAgICAgICAgICAgICAgICAgIC4uLgoKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIFJldmlzaW9uIEhpc3Rvcnk6CgogIHIucy46IGZpcnN0IGltcGxlbWV0YXRpb24KCiAgMjAwNi0wNi0xMyAgZC5rLjogZHVwbGljYXRlIGZ1bmN0aW9ucyBmb3IgbGl0dGxlIGVuZGlhbiBhbmQgYmlnIGVuZGlhbgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8vI2luY2x1ZGUgImdsb2JhbC5oIgovLyNpbmNsdWRlICJFcGxBbWkuaCIKI2luY2x1ZGUgIkVwbEluYy5oIgoKI2lmICghZGVmaW5lZChFUExfQU1JX0lOTElORUQpKSB8fCBkZWZpbmVkKElOTElORV9FTkFCTEVEKQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gdHlwZWRlZgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKdHlwZWRlZiBzdHJ1Y3QgewoJV09SRCBtX3dXb3JkOwoKfSB0d1N0cnVjdDsKCnR5cGVkZWYgc3RydWN0IHsKCURXT1JEIG1fZHdEd29yZDsKCn0gdGR3U3RydWN0OwoKdHlwZWRlZiBzdHJ1Y3QgewoJUVdPUkQgbV9xd1F3b3JkOwoKfSB0cXdTdHJ1Y3Q7CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLwovLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLwovLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLwovLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gRnVuY3Rpb246ICAgIEFtaVNldFhYWFRvQmUoKQovLwovLyBEZXNjcmlwdGlvbjogd3JpdGVzIHRoZSBzcGVjaWZpZWQgdmFsdWUgdG8gdGhlIGFic29sdXRlIGFkZHJlc3MgaW4KLy8gICAgICAgICAgICAgIGJpZyBlbmRpYW4KLy8KLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICAgICAgICAgID0gYWJzb2x1dGUgYWRkcmVzcwovLyAgICAgICAgICAgICAgeFhYWFZhbF9wICAgICAgICAgICAgICAgPSB2YWx1ZQovLwovLyBSZXR1cm5zOiAgICAgKG5vbmUpCi8vCi8vIFN0YXRlOgovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8tLS0tLS0tLS0tLS08IHdyaXRlIEJZVEUgaW4gYmlnIGVuZGlhbiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLyoKdm9pZCAgUFVCTElDICBBbWlTZXRCeXRlVG9CZSAodm9pZCBGQVIqIHBBZGRyX3AsIEJZVEUgYkJ5dGVWYWxfcCkKewoKICAgKihCWVRFIEZBUiopcEFkZHJfcCA9IGJCeXRlVmFsX3A7Cgp9CiovCgovLy0tLS0tLS0tLS0tLTwgd3JpdGUgV09SRCBpbiBiaWcgZW5kaWFuID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKSU5MSU5FX0ZVTkNUSU9OIHZvaWQgUFVCTElDIEFtaVNldFdvcmRUb0JlKHZvaWQgRkFSICogcEFkZHJfcCwgV09SRCB3V29yZFZhbF9wKQp7Cgl0d1N0cnVjdCBGQVIgKnB3U3RydWN0OwoJdHdTdHJ1Y3Qgd1ZhbHVlOwoKCXdWYWx1ZS5tX3dXb3JkID0gKFdPUkQpICgod1dvcmRWYWxfcCAmIDB4MDBGRikgPDwgOCk7CS8vTFNCIHRvIE1TQgoJd1ZhbHVlLm1fd1dvcmQgfD0gKFdPUkQpICgod1dvcmRWYWxfcCAmIDB4RkYwMCkgPj4gOCk7CS8vTVNCIHRvIExTQgoKCXB3U3RydWN0ID0gKHR3U3RydWN0IEZBUiAqKSBwQWRkcl9wOwoJcHdTdHJ1Y3QtPm1fd1dvcmQgPSB3VmFsdWUubV93V29yZDsKCn0KCi8vLS0tLS0tLS0tLS0tPCB3cml0ZSBEV09SRCBpbiBiaWcgZW5kaWFuID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpJTkxJTkVfRlVOQ1RJT04gdm9pZCBQVUJMSUMgQW1pU2V0RHdvcmRUb0JlKHZvaWQgRkFSICogcEFkZHJfcCwKCQkJCQkgICAgRFdPUkQgZHdEd29yZFZhbF9wKQp7Cgl0ZHdTdHJ1Y3QgRkFSICpwZHdTdHJ1Y3Q7Cgl0ZHdTdHJ1Y3QgZHdWYWx1ZTsKCglkd1ZhbHVlLm1fZHdEd29yZCA9ICgoZHdEd29yZFZhbF9wICYgMHgwMDAwMDBGRikgPDwgMjQpOwkvL0xTQiB0byBNU0IKCWR3VmFsdWUubV9kd0R3b3JkIHw9ICgoZHdEd29yZFZhbF9wICYgMHgwMDAwRkYwMCkgPDwgOCk7Cglkd1ZhbHVlLm1fZHdEd29yZCB8PSAoKGR3RHdvcmRWYWxfcCAmIDB4MDBGRjAwMDApID4+IDgpOwoJZHdWYWx1ZS5tX2R3RHdvcmQgfD0gKChkd0R3b3JkVmFsX3AgJiAweEZGMDAwMDAwKSA+PiAyNCk7CS8vTVNCIHRvIExTQgoKCXBkd1N0cnVjdCA9ICh0ZHdTdHJ1Y3QgRkFSICopIHBBZGRyX3A7CglwZHdTdHJ1Y3QtPm1fZHdEd29yZCA9IGR3VmFsdWUubV9kd0R3b3JkOwoKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gRnVuY3Rpb246ICAgIEFtaVNldFhYWFRvTGUoKQovLwovLyBEZXNjcmlwdGlvbjogd3JpdGVzIHRoZSBzcGVjaWZpZWQgdmFsdWUgdG8gdGhlIGFic29sdXRlIGFkZHJlc3MgaW4KLy8gICAgICAgICAgICAgIGxpdHRsZSBlbmRpYW4KLy8KLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICAgICAgICAgID0gYWJzb2x1dGUgYWRkcmVzcwovLyAgICAgICAgICAgICAgeFhYWFZhbF9wICAgICAgICAgICAgICAgPSB2YWx1ZQovLwovLyBSZXR1cm5zOiAgICAgKG5vbmUpCi8vCi8vIFN0YXRlOgovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8tLS0tLS0tLS0tLS08IHdyaXRlIEJZVEUgaW4gbGl0dGxlIGVuZGlhbiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLyoKdm9pZCAgUFVCTElDICBBbWlTZXRCeXRlVG9MZSAodm9pZCBGQVIqIHBBZGRyX3AsIEJZVEUgYkJ5dGVWYWxfcCkKewoKICAgKihCWVRFIEZBUiopcEFkZHJfcCA9IGJCeXRlVmFsX3A7Cgp9CiovCgovLy0tLS0tLS0tLS0tLTwgd3JpdGUgV09SRCBpbiBsaXR0bGUgZW5kaWFuID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKSU5MSU5FX0ZVTkNUSU9OIHZvaWQgUFVCTElDIEFtaVNldFdvcmRUb0xlKHZvaWQgRkFSICogcEFkZHJfcCwgV09SRCB3V29yZFZhbF9wKQp7Cgl0d1N0cnVjdCBGQVIgKnB3U3RydWN0OwoKCXB3U3RydWN0ID0gKHR3U3RydWN0IEZBUiAqKSBwQWRkcl9wOwoJcHdTdHJ1Y3QtPm1fd1dvcmQgPSB3V29yZFZhbF9wOwoKfQoKLy8tLS0tLS0tLS0tLS08IHdyaXRlIERXT1JEIGluIGxpdHRsZSBlbmRpYW4gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCklOTElORV9GVU5DVElPTiB2b2lkIFBVQkxJQyBBbWlTZXREd29yZFRvTGUodm9pZCBGQVIgKiBwQWRkcl9wLAoJCQkJCSAgICBEV09SRCBkd0R3b3JkVmFsX3ApCnsKCXRkd1N0cnVjdCBGQVIgKnBkd1N0cnVjdDsKCglwZHdTdHJ1Y3QgPSAodGR3U3RydWN0IEZBUiAqKSBwQWRkcl9wOwoJcGR3U3RydWN0LT5tX2R3RHdvcmQgPSBkd0R3b3JkVmFsX3A7Cgp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgQW1pR2V0WFhYRnJvbUJlKCkKLy8KLy8gRGVzY3JpcHRpb246IHJlYWRzIHRoZSBzcGVjaWZpZWQgdmFsdWUgZnJvbSB0aGUgYWJzb2x1dGUgYWRkcmVzcyBpbgovLyAgICAgICAgICAgICAgYmlnIGVuZGlhbgovLwovLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgICAgICAgICAgPSBhYnNvbHV0ZSBhZGRyZXNzCi8vCi8vIFJldHVybnM6ICAgICBYWFggICAgICAgICAgICAgICAgICAgICA9IHZhbHVlCi8vCi8vIFN0YXRlOgovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8tLS0tLS0tLS0tLS08IHJlYWQgQllURSBpbiBiaWcgZW5kaWFuID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLyoKQllURSAgUFVCTElDICBBbWlHZXRCeXRlRnJvbUJlICh2b2lkIEZBUiogcEFkZHJfcCkKewoKICAgcmV0dXJuICggKihCWVRFIEZBUiopcEFkZHJfcCApOwoKfQoqLwoKLy8tLS0tLS0tLS0tLS08IHJlYWQgV09SRCBpbiBiaWcgZW5kaWFuID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCklOTElORV9GVU5DVElPTiBXT1JEIFBVQkxJQyBBbWlHZXRXb3JkRnJvbUJlKHZvaWQgRkFSICogcEFkZHJfcCkKewoJdHdTdHJ1Y3QgRkFSICpwd1N0cnVjdDsKCXR3U3RydWN0IHdWYWx1ZTsKCglwd1N0cnVjdCA9ICh0d1N0cnVjdCBGQVIgKikgcEFkZHJfcDsKCgl3VmFsdWUubV93V29yZCA9IChXT1JEKSAoKHB3U3RydWN0LT5tX3dXb3JkICYgMHgwMEZGKSA8PCA4KTsJLy9MU0IgdG8gTVNCCgl3VmFsdWUubV93V29yZCB8PSAoV09SRCkgKChwd1N0cnVjdC0+bV93V29yZCAmIDB4RkYwMCkgPj4gOCk7CS8vTVNCIHRvIExTQgoKCXJldHVybiAod1ZhbHVlLm1fd1dvcmQpOwoKfQoKLy8tLS0tLS0tLS0tLS08IHJlYWQgRFdPUkQgaW4gYmlnIGVuZGlhbiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCklOTElORV9GVU5DVElPTiBEV09SRCBQVUJMSUMgQW1pR2V0RHdvcmRGcm9tQmUodm9pZCBGQVIgKiBwQWRkcl9wKQp7Cgl0ZHdTdHJ1Y3QgRkFSICpwZHdTdHJ1Y3Q7Cgl0ZHdTdHJ1Y3QgZHdWYWx1ZTsKCglwZHdTdHJ1Y3QgPSAodGR3U3RydWN0IEZBUiAqKSBwQWRkcl9wOwoKCWR3VmFsdWUubV9kd0R3b3JkID0gKChwZHdTdHJ1Y3QtPm1fZHdEd29yZCAmIDB4MDAwMDAwRkYpIDw8IDI0KTsJLy9MU0IgdG8gTVNCCglkd1ZhbHVlLm1fZHdEd29yZCB8PSAoKHBkd1N0cnVjdC0+bV9kd0R3b3JkICYgMHgwMDAwRkYwMCkgPDwgOCk7Cglkd1ZhbHVlLm1fZHdEd29yZCB8PSAoKHBkd1N0cnVjdC0+bV9kd0R3b3JkICYgMHgwMEZGMDAwMCkgPj4gOCk7Cglkd1ZhbHVlLm1fZHdEd29yZCB8PSAoKHBkd1N0cnVjdC0+bV9kd0R3b3JkICYgMHhGRjAwMDAwMCkgPj4gMjQpOwkvL01TQiB0byBMU0IKCglyZXR1cm4gKGR3VmFsdWUubV9kd0R3b3JkKTsKCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBBbWlHZXRYWFhGcm9tTGUoKQovLwovLyBEZXNjcmlwdGlvbjogcmVhZHMgdGhlIHNwZWNpZmllZCB2YWx1ZSBmcm9tIHRoZSBhYnNvbHV0ZSBhZGRyZXNzIGluCi8vICAgICAgICAgICAgICBsaXR0bGUgZW5kaWFuCi8vCi8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgICAgICAgICA9IGFic29sdXRlIGFkZHJlc3MKLy8KLy8gUmV0dXJuczogICAgIFhYWCAgICAgICAgICAgICAgICAgICAgID0gdmFsdWUKLy8KLy8gU3RhdGU6Ci8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLy0tLS0tLS0tLS0tLTwgcmVhZCBCWVRFIGluIGxpdHRsZSBlbmRpYW4gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovKgpCWVRFICBQVUJMSUMgIEFtaUdldEJ5dGVGcm9tTGUgKHZvaWQgRkFSKiBwQWRkcl9wKQp7CgogICByZXR1cm4gKCAqKEJZVEUgRkFSKilwQWRkcl9wICk7Cgp9CiovCgovLy0tLS0tLS0tLS0tLTwgcmVhZCBXT1JEIGluIGxpdHRsZSBlbmRpYW4gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKSU5MSU5FX0ZVTkNUSU9OIFdPUkQgUFVCTElDIEFtaUdldFdvcmRGcm9tTGUodm9pZCBGQVIgKiBwQWRkcl9wKQp7Cgl0d1N0cnVjdCBGQVIgKnB3U3RydWN0OwoKCXB3U3RydWN0ID0gKHR3U3RydWN0IEZBUiAqKSBwQWRkcl9wOwoJcmV0dXJuIChwd1N0cnVjdC0+bV93V29yZCk7Cgp9CgovLy0tLS0tLS0tLS0tLTwgcmVhZCBEV09SRCBpbiBsaXR0bGUgZW5kaWFuID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKSU5MSU5FX0ZVTkNUSU9OIERXT1JEIFBVQkxJQyBBbWlHZXREd29yZEZyb21MZSh2b2lkIEZBUiAqIHBBZGRyX3ApCnsKCXRkd1N0cnVjdCBGQVIgKnBkd1N0cnVjdDsKCglwZHdTdHJ1Y3QgPSAodGR3U3RydWN0IEZBUiAqKSBwQWRkcl9wOwoJcmV0dXJuIChwZHdTdHJ1Y3QtPm1fZHdEd29yZCk7Cgp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgQW1pU2V0RHdvcmQyNFRvQmUoKQovLwovLyBEZXNjcmlwdGlvbjogc2V0cyBhIDI0IGJpdCB2YWx1ZSB0byBhIGJ1ZmZlciBpbiBiaWcgZW5kaWFuCi8vCi8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlcgovLyAgICAgICAgICAgICAgZHdEd29yZFZhbF9wICAgID0gdmFsdWUgdG8gc2V0Ci8vCi8vIFJldHVybjogICAgICB2b2lkCi8vCi8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCi8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpJTkxJTkVfRlVOQ1RJT04gdm9pZCBQVUJMSUMgQW1pU2V0RHdvcmQyNFRvQmUodm9pZCBGQVIgKiBwQWRkcl9wLAoJCQkJCSAgICAgIERXT1JEIGR3RHdvcmRWYWxfcCkKewoKCSgoQllURSBGQVIgKikgcEFkZHJfcClbMF0gPSAoKEJZVEUgRkFSICopICYgZHdEd29yZFZhbF9wKVsyXTsKCSgoQllURSBGQVIgKikgcEFkZHJfcClbMV0gPSAoKEJZVEUgRkFSICopICYgZHdEd29yZFZhbF9wKVsxXTsKCSgoQllURSBGQVIgKikgcEFkZHJfcClbMl0gPSAoKEJZVEUgRkFSICopICYgZHdEd29yZFZhbF9wKVswXTsKCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBBbWlTZXREd29yZDI0VG9MZSgpCi8vCi8vIERlc2NyaXB0aW9uOiBzZXRzIGEgMjQgYml0IHZhbHVlIHRvIGEgYnVmZmVyIGluIGxpdHRsZSBlbmRpYW4KLy8KLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gZGVzdGluYXRpb24gYnVmZmVyCi8vICAgICAgICAgICAgICBkd0R3b3JkVmFsX3AgICAgPSB2YWx1ZSB0byBzZXQKLy8KLy8gUmV0dXJuOiAgICAgIHZvaWQKLy8KLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCklOTElORV9GVU5DVElPTiB2b2lkIFBVQkxJQyBBbWlTZXREd29yZDI0VG9MZSh2b2lkIEZBUiAqIHBBZGRyX3AsCgkJCQkJICAgICAgRFdPUkQgZHdEd29yZFZhbF9wKQp7CgoJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVswXSA9ICgoQllURSBGQVIgKikgJiBkd0R3b3JkVmFsX3ApWzBdOwoJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVsxXSA9ICgoQllURSBGQVIgKikgJiBkd0R3b3JkVmFsX3ApWzFdOwoJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVsyXSA9ICgoQllURSBGQVIgKikgJiBkd0R3b3JkVmFsX3ApWzJdOwoKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gRnVuY3Rpb246ICAgIEFtaUdldER3b3JkMjRGcm9tQmUoKQovLwovLyBEZXNjcmlwdGlvbjogcmVhZHMgYSAyNCBiaXQgdmFsdWUgZnJvbSBhIGJ1ZmZlciBpbiBiaWcgZW5kaWFuCi8vCi8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIKLy8KLy8gUmV0dXJuOiAgICAgIERXT1JEICAgICAgICAgICA9IHJlYWQgdmFsdWUKLy8KLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCklOTElORV9GVU5DVElPTiBEV09SRCBQVUJMSUMgQW1pR2V0RHdvcmQyNEZyb21CZSh2b2lkIEZBUiAqIHBBZGRyX3ApCnsKCgl0ZHdTdHJ1Y3QgZHdTdHJ1Y3Q7CgoJZHdTdHJ1Y3QubV9kd0R3b3JkID0gQW1pR2V0RHdvcmRGcm9tQmUocEFkZHJfcCk7Cglkd1N0cnVjdC5tX2R3RHdvcmQgPj49IDg7CgoJcmV0dXJuIChkd1N0cnVjdC5tX2R3RHdvcmQpOwoKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gRnVuY3Rpb246ICAgIEFtaUdldER3b3JkMjRGcm9tTGUoKQovLwovLyBEZXNjcmlwdGlvbjogcmVhZHMgYSAyNCBiaXQgdmFsdWUgZnJvbSBhIGJ1ZmZlciBpbiBsaXR0bGUgZW5kaWFuCi8vCi8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIKLy8KLy8gUmV0dXJuOiAgICAgIERXT1JEICAgICAgICAgICA9IHJlYWQgdmFsdWUKLy8KLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCklOTElORV9GVU5DVElPTiBEV09SRCBQVUJMSUMgQW1pR2V0RHdvcmQyNEZyb21MZSh2b2lkIEZBUiAqIHBBZGRyX3ApCnsKCgl0ZHdTdHJ1Y3QgZHdTdHJ1Y3Q7CgoJZHdTdHJ1Y3QubV9kd0R3b3JkID0gQW1pR2V0RHdvcmRGcm9tTGUocEFkZHJfcCk7Cglkd1N0cnVjdC5tX2R3RHdvcmQgJj0gMHgwMEZGRkZGRjsKCglyZXR1cm4gKGR3U3RydWN0Lm1fZHdEd29yZCk7Cgp9CgovLyNpZmRlZiBVU0VfVkFSNjQKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBBbWlTZXRRd29yZDY0VG9CZSgpCi8vCi8vIERlc2NyaXB0aW9uOiBzZXRzIGEgNjQgYml0IHZhbHVlIHRvIGEgYnVmZmVyIGluIGJpZyBlbmRpYW4KLy8KLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gZGVzdGluYXRpb24gYnVmZmVyCi8vICAgICAgICAgICAgICBxd1F3b3JkVmFsX3AgICAgPSBxdWFkcnVwbGUgd29yZCB2YWx1ZQovLwovLyBSZXR1cm46ICAgICAgdm9pZAovLwovLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKSU5MSU5FX0ZVTkNUSU9OIHZvaWQgUFVCTElDIEFtaVNldFF3b3JkNjRUb0JlKHZvaWQgRkFSICogcEFkZHJfcCwKCQkJCQkgICAgICBRV09SRCBxd1F3b3JkVmFsX3ApCnsKCgkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzBdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbN107CgkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzFdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbNl07CgkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzJdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbNV07CgkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzNdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbNF07CgkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzRdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbM107CgkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzVdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbMl07CgkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzZdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbMV07CgkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzddID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbMF07Cgp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgQW1pU2V0UXdvcmQ2NFRvTGUoKQovLwovLyBEZXNjcmlwdGlvbjogc2V0cyBhIDY0IGJpdCB2YWx1ZSB0byBhIGJ1ZmZlciBpbiBsaXR0bGUgZW5kaWFuCi8vCi8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlcgovLyAgICAgICAgICAgICAgcXdRd29yZFZhbF9wICAgID0gcXVhZHJ1cGxlIHdvcmQgdmFsdWUKLy8KLy8gUmV0dXJuOiAgICAgIHZvaWQKLy8KLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCklOTElORV9GVU5DVElPTiB2b2lkIFBVQkxJQyBBbWlTZXRRd29yZDY0VG9MZSh2b2lkIEZBUiAqIHBBZGRyX3AsCgkJCQkJICAgICAgUVdPUkQgcXdRd29yZFZhbF9wKQp7CgoJUVdPUkQgRkFSICpwcXdEc3Q7CgoJcHF3RHN0ID0gKFFXT1JEIEZBUiAqKSBwQWRkcl9wOwoJKnBxd0RzdCA9IHF3UXdvcmRWYWxfcDsKCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBBbWlHZXRRd29yZDY0RnJvbUJlKCkKLy8KLy8gRGVzY3JpcHRpb246IHJlYWRzIGEgNjQgYml0IHZhbHVlIGZyb20gYSBidWZmZXIgaW4gYmlnIGVuZGlhbgovLwovLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBzb3VyY2UgYnVmZmVyCi8vCi8vIFJldHVybjogICAgICB2b2lkCi8vCi8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCi8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpJTkxJTkVfRlVOQ1RJT04gUVdPUkQgUFVCTElDIEFtaUdldFF3b3JkNjRGcm9tQmUodm9pZCBGQVIgKiBwQWRkcl9wKQp7CgoJdHF3U3RydWN0IHF3U3RydWN0OwoKCSgoQllURSBGQVIgKikgJiBxd1N0cnVjdC5tX3F3UXdvcmQpWzBdID0gKChCWVRFIEZBUiAqKSBwQWRkcl9wKVs3XTsKCSgoQllURSBGQVIgKikgJiBxd1N0cnVjdC5tX3F3UXdvcmQpWzFdID0gKChCWVRFIEZBUiAqKSBwQWRkcl9wKVs2XTsKCSgoQllURSBGQVIgKikgJiBxd1N0cnVjdC5tX3F3UXdvcmQpWzJdID0gKChCWVRFIEZBUiAqKSBwQWRkcl9wKVs1XTsKCSgoQllURSBGQVIgKikgJiBxd1N0cnVjdC5tX3F3UXdvcmQpWzNdID0gKChCWVRFIEZBUiAqKSBwQWRkcl9wKVs0XTsKCSgoQllURSBGQVIgKikgJiBxd1N0cnVjdC5tX3F3UXdvcmQpWzRdID0gKChCWVRFIEZBUiAqKSBwQWRkcl9wKVszXTsKCSgoQllURSBGQVIgKikgJiBxd1N0cnVjdC5tX3F3UXdvcmQpWzVdID0gKChCWVRFIEZBUiAqKSBwQWRkcl9wKVsyXTsKCSgoQllURSBGQVIgKikgJiBxd1N0cnVjdC5tX3F3UXdvcmQpWzZdID0gKChCWVRFIEZBUiAqKSBwQWRkcl9wKVsxXTsKCSgoQllURSBGQVIgKikgJiBxd1N0cnVjdC5tX3F3UXdvcmQpWzddID0gKChCWVRFIEZBUiAqKSBwQWRkcl9wKVswXTsKCglyZXR1cm4gKHF3U3RydWN0Lm1fcXdRd29yZCk7Cgp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgQW1pR2V0UXdvcmQ2NEZyb21MZSgpCi8vCi8vIERlc2NyaXB0aW9uOiByZWFkcyBhIDY0IGJpdCB2YWx1ZSBmcm9tIGEgYnVmZmVyIGluIGxpdHRsZSBlbmRpYW4KLy8KLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gc291cmNlIGJ1ZmZlcgovLwovLyBSZXR1cm46ICAgICAgdm9pZAovLwovLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKSU5MSU5FX0ZVTkNUSU9OIFFXT1JEIFBVQkxJQyBBbWlHZXRRd29yZDY0RnJvbUxlKHZvaWQgRkFSICogcEFkZHJfcCkKewoKCXRxd1N0cnVjdCBGQVIgKnBxd1N0cnVjdDsKCXRxd1N0cnVjdCBxd1N0cnVjdDsKCglwcXdTdHJ1Y3QgPSAodHF3U3RydWN0IEZBUiAqKSBwQWRkcl9wOwoJcXdTdHJ1Y3QubV9xd1F3b3JkID0gcHF3U3RydWN0LT5tX3F3UXdvcmQ7CgoJcmV0dXJuIChxd1N0cnVjdC5tX3F3UXdvcmQpOwoKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gRnVuY3Rpb246ICAgIEFtaVNldFF3b3JkNDBUb0JlKCkKLy8KLy8gRGVzY3JpcHRpb246IHNldHMgYSA0MCBiaXQgdmFsdWUgdG8gYSBidWZmZXIgaW4gYmlnIGVuZGlhbgovLwovLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBkZXN0aW5hdGlvbiBidWZmZXIKLy8gICAgICAgICAgICAgIHF3UXdvcmRWYWxfcCAgICA9IHF1YWRydXBsZSB3b3JkIHZhbHVlCi8vCi8vIFJldHVybjogICAgICB2b2lkCi8vCi8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCi8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpJTkxJTkVfRlVOQ1RJT04gdm9pZCBQVUJMSUMgQW1pU2V0UXdvcmQ0MFRvQmUodm9pZCBGQVIgKiBwQWRkcl9wLAoJCQkJCSAgICAgIFFXT1JEIHF3UXdvcmRWYWxfcCkKewoKCSgoQllURSBGQVIgKikgcEFkZHJfcClbMF0gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVs0XTsKCSgoQllURSBGQVIgKikgcEFkZHJfcClbMV0gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVszXTsKCSgoQllURSBGQVIgKikgcEFkZHJfcClbMl0gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVsyXTsKCSgoQllURSBGQVIgKikgcEFkZHJfcClbM10gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVsxXTsKCSgoQllURSBGQVIgKikgcEFkZHJfcClbNF0gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVswXTsKCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBBbWlTZXRRd29yZDQwVG9MZSgpCi8vCi8vIERlc2NyaXB0aW9uOiBzZXRzIGEgNDAgYml0IHZhbHVlIHRvIGEgYnVmZmVyIGluIGxpdHRsZSBlbmRpYW4KLy8KLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gZGVzdGluYXRpb24gYnVmZmVyCi8vICAgICAgICAgICAgICBxd1F3b3JkVmFsX3AgICAgPSBxdWFkcnVwbGUgd29yZCB2YWx1ZQovLwovLyBSZXR1cm46ICAgICAgdm9pZAovLwovLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKSU5MSU5FX0ZVTkNUSU9OIHZvaWQgUFVCTElDIEFtaVNldFF3b3JkNDBUb0xlKHZvaWQgRkFSICogcEFkZHJfcCwKCQkJCQkgICAgICBRV09SRCBxd1F3b3JkVmFsX3ApCnsKCgkoKERXT1JEIEZBUiAqKSBwQWRkcl9wKVswXSA9ICgoRFdPUkQgRkFSICopICYgcXdRd29yZFZhbF9wKVswXTsKCSgoQllURSBGQVIgKikgcEFkZHJfcClbNF0gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVs0XTsKCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBBbWlHZXRRd29yZDQwRnJvbUJlKCkKLy8KLy8gRGVzY3JpcHRpb246IHJlYWRzIGEgNDAgYml0IHZhbHVlIGZyb20gYSBidWZmZXIgaW4gYmlnIGVuZGlhbgovLwovLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBzb3VyY2UgYnVmZmVyCi8vCi8vIFJldHVybjogICAgICBRV09SRAovLwovLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKSU5MSU5FX0ZVTkNUSU9OIFFXT1JEIFBVQkxJQyBBbWlHZXRRd29yZDQwRnJvbUJlKHZvaWQgRkFSICogcEFkZHJfcCkKewoKCXRxd1N0cnVjdCBxd1N0cnVjdDsKCglxd1N0cnVjdC5tX3F3UXdvcmQgPSBBbWlHZXRRd29yZDY0RnJvbUJlKHBBZGRyX3ApOwoJcXdTdHJ1Y3QubV9xd1F3b3JkID4+PSAyNDsKCglyZXR1cm4gKHF3U3RydWN0Lm1fcXdRd29yZCk7Cgp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgQW1pR2V0UXdvcmQ0MEZyb21MZSgpCi8vCi8vIERlc2NyaXB0aW9uOiByZWFkcyBhIDQwIGJpdCB2YWx1ZSBmcm9tIGEgYnVmZmVyIGluIGxpdHRsZSBlbmRpYW4KLy8KLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gc291cmNlIGJ1ZmZlcgovLwovLyBSZXR1cm46ICAgICAgUVdPUkQKLy8KLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCklOTElORV9GVU5DVElPTiBRV09SRCBQVUJMSUMgQW1pR2V0UXdvcmQ0MEZyb21MZSh2b2lkIEZBUiAqIHBBZGRyX3ApCnsKCgl0cXdTdHJ1Y3QgcXdTdHJ1Y3Q7CgoJcXdTdHJ1Y3QubV9xd1F3b3JkID0gQW1pR2V0UXdvcmQ2NEZyb21MZShwQWRkcl9wKTsKCXF3U3RydWN0Lm1fcXdRd29yZCAmPSAweDAwMDAwMEZGRkZGRkZGRkZMTDsKCglyZXR1cm4gKHF3U3RydWN0Lm1fcXdRd29yZCk7Cgp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgQW1pU2V0UXdvcmQ0OFRvQmUoKQovLwovLyBEZXNjcmlwdGlvbjogc2V0cyBhIDQ4IGJpdCB2YWx1ZSB0byBhIGJ1ZmZlciBpbiBiaWcgZW5kaWFuCi8vCi8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlcgovLyAgICAgICAgICAgICAgcXdRd29yZFZhbF9wICAgID0gcXVhZHJ1cGxlIHdvcmQgdmFsdWUKLy8KLy8gUmV0dXJuOiAgICAgIHZvaWQKLy8KLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCklOTElORV9GVU5DVElPTiB2b2lkIFBVQkxJQyBBbWlTZXRRd29yZDQ4VG9CZSh2b2lkIEZBUiAqIHBBZGRyX3AsCgkJCQkJICAgICAgUVdPUkQgcXdRd29yZFZhbF9wKQp7CgoJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVswXSA9ICgoQllURSBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzVdOwoJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVsxXSA9ICgoQllURSBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzRdOwoJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVsyXSA9ICgoQllURSBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzNdOwoJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVszXSA9ICgoQllURSBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzJdOwoJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVs0XSA9ICgoQllURSBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzFdOwoJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVs1XSA9ICgoQllURSBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzBdOwoKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gRnVuY3Rpb246ICAgIEFtaVNldFF3b3JkNDhUb0xlKCkKLy8KLy8gRGVzY3JpcHRpb246IHNldHMgYSA0OCBiaXQgdmFsdWUgdG8gYSBidWZmZXIgaW4gbGl0dGxlIGVuZGlhbgovLwovLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBkZXN0aW5hdGlvbiBidWZmZXIKLy8gICAgICAgICAgICAgIHF3UXdvcmRWYWxfcCAgICA9IHF1YWRydXBsZSB3b3JkIHZhbHVlCi8vCi8vIFJldHVybjogICAgICB2b2lkCi8vCi8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCi8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpJTkxJTkVfRlVOQ1RJT04gdm9pZCBQVUJMSUMgQW1pU2V0UXdvcmQ0OFRvTGUodm9pZCBGQVIgKiBwQWRkcl9wLAoJCQkJCSAgICAgIFFXT1JEIHF3UXdvcmRWYWxfcCkKewoKCSgoRFdPUkQgRkFSICopIHBBZGRyX3ApWzBdID0gKChEV09SRCBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzBdOwoJKChXT1JEIEZBUiAqKSBwQWRkcl9wKVsyXSA9ICgoV09SRCBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzJdOwoKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gRnVuY3Rpb246ICAgIEFtaUdldFF3b3JkNDhGcm9tQmUoKQovLwovLyBEZXNjcmlwdGlvbjogcmVhZHMgYSA0OCBiaXQgdmFsdWUgZnJvbSBhIGJ1ZmZlciBpbiBiaWcgZW5kaWFuCi8vCi8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIKLy8KLy8gUmV0dXJuOiAgICAgIFFXT1JECi8vCi8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCi8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpJTkxJTkVfRlVOQ1RJT04gUVdPUkQgUFVCTElDIEFtaUdldFF3b3JkNDhGcm9tQmUodm9pZCBGQVIgKiBwQWRkcl9wKQp7CgoJdHF3U3RydWN0IHF3U3RydWN0OwoKCXF3U3RydWN0Lm1fcXdRd29yZCA9IEFtaUdldFF3b3JkNjRGcm9tQmUocEFkZHJfcCk7Cglxd1N0cnVjdC5tX3F3UXdvcmQgPj49IDE2OwoKCXJldHVybiAocXdTdHJ1Y3QubV9xd1F3b3JkKTsKCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBBbWlHZXRRd29yZDQ4RnJvbUxlKCkKLy8KLy8gRGVzY3JpcHRpb246IHJlYWRzIGEgNDggYml0IHZhbHVlIGZyb20gYSBidWZmZXIgaW4gbGl0dGxlIGVuZGlhbgovLwovLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBzb3VyY2UgYnVmZmVyCi8vCi8vIFJldHVybjogICAgICBRV09SRAovLwovLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKSU5MSU5FX0ZVTkNUSU9OIFFXT1JEIFBVQkxJQyBBbWlHZXRRd29yZDQ4RnJvbUxlKHZvaWQgRkFSICogcEFkZHJfcCkKewoKCXRxd1N0cnVjdCBxd1N0cnVjdDsKCglxd1N0cnVjdC5tX3F3UXdvcmQgPSBBbWlHZXRRd29yZDY0RnJvbUxlKHBBZGRyX3ApOwoJcXdTdHJ1Y3QubV9xd1F3b3JkICY9IDB4MDAwMEZGRkZGRkZGRkZGRkxMOwoKCXJldHVybiAocXdTdHJ1Y3QubV9xd1F3b3JkKTsKCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBBbWlTZXRRd29yZDU2VG9CZSgpCi8vCi8vIERlc2NyaXB0aW9uOiBzZXRzIGEgNTYgYml0IHZhbHVlIHRvIGEgYnVmZmVyIGluIGJpZyBlbmRpYW4KLy8KLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gZGVzdGluYXRpb24gYnVmZmVyCi8vICAgICAgICAgICAgICBxd1F3b3JkVmFsX3AgICAgPSBxdWFkcnVwbGUgd29yZCB2YWx1ZQovLwovLyBSZXR1cm46ICAgICAgdm9pZAovLwovLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKSU5MSU5FX0ZVTkNUSU9OIHZvaWQgUFVCTElDIEFtaVNldFF3b3JkNTZUb0JlKHZvaWQgRkFSICogcEFkZHJfcCwKCQkJCQkgICAgICBRV09SRCBxd1F3b3JkVmFsX3ApCnsKCgkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzBdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbNl07CgkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzFdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbNV07CgkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzJdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbNF07CgkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzNdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbM107CgkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzRdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbMl07CgkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzVdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbMV07CgkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzZdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbMF07Cgp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgQW1pU2V0UXdvcmQ1NlRvTGUoKQovLwovLyBEZXNjcmlwdGlvbjogc2V0cyBhIDU2IGJpdCB2YWx1ZSB0byBhIGJ1ZmZlciBpbiBsaXR0bGUgZW5kaWFuCi8vCi8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlcgovLyAgICAgICAgICAgICAgcXdRd29yZFZhbF9wICAgID0gcXVhZHJ1cGxlIHdvcmQgdmFsdWUKLy8KLy8gUmV0dXJuOiAgICAgIHZvaWQKLy8KLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCklOTElORV9GVU5DVElPTiB2b2lkIFBVQkxJQyBBbWlTZXRRd29yZDU2VG9MZSh2b2lkIEZBUiAqIHBBZGRyX3AsCgkJCQkJICAgICAgUVdPUkQgcXdRd29yZFZhbF9wKQp7CgoJKChEV09SRCBGQVIgKikgcEFkZHJfcClbMF0gPSAoKERXT1JEIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbMF07CgkoKFdPUkQgRkFSICopIHBBZGRyX3ApWzJdID0gKChXT1JEIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbMl07CgkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzZdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbNl07Cgp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgQW1pR2V0UXdvcmQ1NkZyb21CZSgpCi8vCi8vIERlc2NyaXB0aW9uOiByZWFkcyBhIDU2IGJpdCB2YWx1ZSBmcm9tIGEgYnVmZmVyIGluIGJpZyBlbmRpYW4KLy8KLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gc291cmNlIGJ1ZmZlcgovLwovLyBSZXR1cm46ICAgICAgUVdPUkQKLy8KLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCklOTElORV9GVU5DVElPTiBRV09SRCBQVUJMSUMgQW1pR2V0UXdvcmQ1NkZyb21CZSh2b2lkIEZBUiAqIHBBZGRyX3ApCnsKCgl0cXdTdHJ1Y3QgcXdTdHJ1Y3Q7CgoJcXdTdHJ1Y3QubV9xd1F3b3JkID0gQW1pR2V0UXdvcmQ2NEZyb21CZShwQWRkcl9wKTsKCXF3U3RydWN0Lm1fcXdRd29yZCA+Pj0gODsKCglyZXR1cm4gKHF3U3RydWN0Lm1fcXdRd29yZCk7Cgp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgQW1pR2V0UXdvcmQ1NkZyb21MZSgpCi8vCi8vIERlc2NyaXB0aW9uOiByZWFkcyBhIDU2IGJpdCB2YWx1ZSBmcm9tIGEgYnVmZmVyIGluIGxpdHRsZSBlbmRpYW4KLy8KLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gc291cmNlIGJ1ZmZlcgovLwovLyBSZXR1cm46ICAgICAgUVdPUkQKLy8KLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCklOTElORV9GVU5DVElPTiBRV09SRCBQVUJMSUMgQW1pR2V0UXdvcmQ1NkZyb21MZSh2b2lkIEZBUiAqIHBBZGRyX3ApCnsKCgl0cXdTdHJ1Y3QgcXdTdHJ1Y3Q7CgoJcXdTdHJ1Y3QubV9xd1F3b3JkID0gQW1pR2V0UXdvcmQ2NEZyb21MZShwQWRkcl9wKTsKCXF3U3RydWN0Lm1fcXdRd29yZCAmPSAweDAwRkZGRkZGRkZGRkZGRkZMTDsKCglyZXR1cm4gKHF3U3RydWN0Lm1fcXdRd29yZCk7Cgp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgQW1pU2V0VGltZU9mRGF5KCkKLy8KLy8gRGVzY3JpcHRpb246IHNldHMgYSBUSU1FX09GX0RBWSAoQ0FOb3BlbikgdmFsdWUgdG8gYSBidWZmZXIKLy8KLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gZGVzdGluYXRpb24gYnVmZmVyCi8vICAgICAgICAgICAgICBwVGltZU9mRGF5X3AgICAgPSBwb2ludGVyIHRvIHN0cnVjdCBUSU1FX09GX0RBWQovLwovLyBSZXR1cm46ICAgICAgdm9pZAovLwovLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKSU5MSU5FX0ZVTkNUSU9OIHZvaWQgUFVCTElDIEFtaVNldFRpbWVPZkRheSh2b2lkIEZBUiAqIHBBZGRyX3AsCgkJCQkJICAgIHRUaW1lT2ZEYXkgRkFSICogcFRpbWVPZkRheV9wKQp7CgoJQW1pU2V0RHdvcmRUb0xlKCgoQllURSBGQVIgKikgcEFkZHJfcCksCgkJCXBUaW1lT2ZEYXlfcC0+bV9kd01zICYgMHgwRkZGRkZGRik7CglBbWlTZXRXb3JkVG9MZSgoKEJZVEUgRkFSICopIHBBZGRyX3ApICsgNCwgcFRpbWVPZkRheV9wLT5tX3dEYXlzKTsKCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBBbWlHZXRUaW1lT2ZEYXkoKQovLwovLyBEZXNjcmlwdGlvbjogcmVhZHMgYSBUSU1FX09GX0RBWSAoQ0FOb3BlbikgdmFsdWUgZnJvbSBhIGJ1ZmZlcgovLwovLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBzb3VyY2UgYnVmZmVyCi8vICAgICAgICAgICAgICBwVGltZU9mRGF5X3AgICAgPSBwb2ludGVyIHRvIHN0cnVjdCBUSU1FX09GX0RBWQovLwovLyBSZXR1cm46ICAgICAgdm9pZAovLwovLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKSU5MSU5FX0ZVTkNUSU9OIHZvaWQgUFVCTElDIEFtaUdldFRpbWVPZkRheSh2b2lkIEZBUiAqIHBBZGRyX3AsCgkJCQkJICAgIHRUaW1lT2ZEYXkgRkFSICogcFRpbWVPZkRheV9wKQp7CgoJcFRpbWVPZkRheV9wLT5tX2R3TXMgPQoJICAgIEFtaUdldER3b3JkRnJvbUxlKCgoQllURSBGQVIgKikgcEFkZHJfcCkpICYgMHgwRkZGRkZGRjsKCXBUaW1lT2ZEYXlfcC0+bV93RGF5cyA9IEFtaUdldFdvcmRGcm9tTGUoKChCWVRFIEZBUiAqKSBwQWRkcl9wKSArIDQpOwoKfQoKI2VuZGlmCgovLyBFT0YKCi8vIERpZSBsZXR6dGUgWmVpbGUgbXXfIHVuYmVkaW5ndCBlaW5lIGxlZXJlIFplaWxlIHNlaW4sIHdlaWwgbWFuY2hlIENvbXBpbGVyCi8vIGRhbWl0IGVpbiBQcm9ibGVtIGhhYmVuLCB3ZW5uIGRhcyBuaWNodCBzbyBpc3QgKHouQi4gR05VIG9kZXIgQm9ybGFuZCBDKysgQnVpbGRlcikuCg==