LyogQm9vc3QgaW50ZXJ2YWwvZGV0YWlsL3Rlc3RfaW5wdXQuaHBwIGZpbGUKICoKICogQ29weXJpZ2h0IDIwMDIgSGVydukgQnL2bm5pbWFubiwgR3VpbGxhdW1lIE1lbHF1aW9uZCwgU3lsdmFpbiBQaW9uCiAqCiAqIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KICogKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IKICogY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCiAqLwoKI2lmbmRlZiBCT09TVF9OVU1FUklDX0lOVEVSVkFMX0RFVEFJTF9URVNUX0lOUFVUX0hQUAojZGVmaW5lIEJPT1NUX05VTUVSSUNfSU5URVJWQUxfREVUQUlMX1RFU1RfSU5QVVRfSFBQCgojaW5jbHVkZSA8Ym9vc3QvbnVtZXJpYy9pbnRlcnZhbC9kZXRhaWwvaW50ZXJ2YWxfcHJvdG90eXBlLmhwcD4KCm5hbWVzcGFjZSBib29zdCB7Cm5hbWVzcGFjZSBudW1lcmljIHsKbmFtZXNwYWNlIGludGVydmFsX2xpYiB7Cm5hbWVzcGFjZSB1c2VyIHsKCnRlbXBsYXRlPGNsYXNzIFQ+IGlubGluZQpib29sIGlzX3plcm8oVCBjb25zdCAmdikgeyByZXR1cm4gdiA9PSBzdGF0aWNfY2FzdDxUPigwKTsgfQoKdGVtcGxhdGU8Y2xhc3MgVD4gaW5saW5lCmJvb2wgaXNfbmVnIChUIGNvbnN0ICZ2KSB7IHJldHVybiB2IDwgIHN0YXRpY19jYXN0PFQ+KDApOyB9Cgp0ZW1wbGF0ZTxjbGFzcyBUPiBpbmxpbmUKYm9vbCBpc19wb3MgKFQgY29uc3QgJnYpIHsgcmV0dXJuIHYgPiAgc3RhdGljX2Nhc3Q8VD4oMCk7IH0KCn0gLy8gbmFtZXNwYWNlIHVzZXIKCm5hbWVzcGFjZSBkZXRhaWwgewoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUG9saWNpZXM+IGlubGluZQpib29sIHRlc3RfaW5wdXQoY29uc3QgaW50ZXJ2YWw8VCwgUG9saWNpZXM+JiB4KSB7CiAgdHlwZWRlZiB0eXBlbmFtZSBQb2xpY2llczo6Y2hlY2tpbmcgY2hlY2tpbmc7CiAgcmV0dXJuIGNoZWNraW5nOjppc19lbXB0eSh4Lmxvd2VyKCksIHgudXBwZXIoKSk7Cn0KCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzMSwgY2xhc3MgUG9saWNpZXMyPiBpbmxpbmUKYm9vbCB0ZXN0X2lucHV0KGNvbnN0IGludGVydmFsPFQsIFBvbGljaWVzMT4mIHgsIGNvbnN0IGludGVydmFsPFQsIFBvbGljaWVzMj4mIHkpIHsKICB0eXBlZGVmIHR5cGVuYW1lIFBvbGljaWVzMTo6Y2hlY2tpbmcgY2hlY2tpbmcxOwogIHR5cGVkZWYgdHlwZW5hbWUgUG9saWNpZXMyOjpjaGVja2luZyBjaGVja2luZzI7CiAgcmV0dXJuIGNoZWNraW5nMTo6aXNfZW1wdHkoeC5sb3dlcigpLCB4LnVwcGVyKCkpIHx8CiAgICAgICAgIGNoZWNraW5nMjo6aXNfZW1wdHkoeS5sb3dlcigpLCB5LnVwcGVyKCkpOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBQb2xpY2llcz4gaW5saW5lCmJvb2wgdGVzdF9pbnB1dChjb25zdCBUJiB4LCBjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llcz4mIHkpIHsKICB0eXBlZGVmIHR5cGVuYW1lIFBvbGljaWVzOjpjaGVja2luZyBjaGVja2luZzsKICByZXR1cm4gY2hlY2tpbmc6OmlzX25hbih4KSB8fCBjaGVja2luZzo6aXNfZW1wdHkoeS5sb3dlcigpLCB5LnVwcGVyKCkpOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBQb2xpY2llcz4gaW5saW5lCmJvb2wgdGVzdF9pbnB1dChjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llcz4mIHgsIGNvbnN0IFQmIHkpIHsKICB0eXBlZGVmIHR5cGVuYW1lIFBvbGljaWVzOjpjaGVja2luZyBjaGVja2luZzsKICByZXR1cm4gY2hlY2tpbmc6OmlzX2VtcHR5KHgubG93ZXIoKSwgeC51cHBlcigpKSB8fCBjaGVja2luZzo6aXNfbmFuKHkpOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBQb2xpY2llcz4gaW5saW5lCmJvb2wgdGVzdF9pbnB1dChjb25zdCBUJiB4KSB7CiAgdHlwZWRlZiB0eXBlbmFtZSBQb2xpY2llczo6Y2hlY2tpbmcgY2hlY2tpbmc7CiAgcmV0dXJuIGNoZWNraW5nOjppc19uYW4oeCk7Cn0KCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzPiBpbmxpbmUKYm9vbCB0ZXN0X2lucHV0KGNvbnN0IFQmIHgsIGNvbnN0IFQmIHkpIHsKICB0eXBlZGVmIHR5cGVuYW1lIFBvbGljaWVzOjpjaGVja2luZyBjaGVja2luZzsKICByZXR1cm4gY2hlY2tpbmc6OmlzX25hbih4KSB8fCBjaGVja2luZzo6aXNfbmFuKHkpOwp9Cgp9IC8vIG5hbWVzcGFjZSBkZXRhaWwKfSAvLyBuYW1lc3BhY2UgaW50ZXJ2YWxfbGliCn0gLy8gbmFtZXNwYWNlIG51bWVyaWMKfSAvLyBuYW1lc3BhY2UgYm9vc3QKCiNlbmRpZiAvLyBCT09TVF9OVU1FUklDX0lOVEVSVkFMX0RFVEFJTF9URVNUX0lOUFVUX0hQUAo=