LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZS4KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgojaW5jbHVkZSA8Y29uZmlnLmg+Ck9VVFBVVF9GT1JNQVQoImVsZjMyLWkzODYiLCAiZWxmMzItaTM4NiIsICJlbGYzMi1pMzg2IikKT1VUUFVUX0FSQ0goaTM4NikKRU5UUlkoX3N0YXJ0KQoKU0VDVElPTlMKewoJLiA9IENPTkZJR19TWVNfVEVYVF9CQVNFOwkvKiBMb2NhdGlvbiBvZiBib290Y29kZSBpbiBmbGFzaCAqLwoJX190ZXh0X3N0YXJ0ID0gLjsKCS50ZXh0ICA6IHsgKigudGV4dCopOyB9CgoJLiA9IEFMSUdOKDQpOwoJX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKCS51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9CgkuID0gQUxJR04oNCk7CglfX3VfYm9vdF9jbWRfZW5kID0gLjsKCgkuID0gQUxJR04oNCk7Cgkucm9kYXRhIDogeyAqKFNPUlRfQllfQUxJR05NRU5UKFNPUlRfQllfTkFNRSgucm9kYXRhKikpKSB9CgoJLiA9IEFMSUdOKDQpOwoJLmRhdGEgOiB7ICooLmRhdGEqKSB9CgoJLiA9IEFMSUdOKDQpOwoJLmR5bnN5bSA6IHsgKiguZHluc3ltKikgfQoKCS4gPSBBTElHTig0KTsKCS5oYXNoIDogeyAqKC5oYXNoKikgfQoKCS4gPSBBTElHTig0KTsKCS5nb3QgOiB7ICooLmdvdCopIH0KCgkuID0gQUxJR04oNCk7CglfX2RhdGFfZW5kID0gLjsKCgkuID0gQUxJR04oNCk7CglfX2Jzc19zdGFydCA9IEFCU09MVVRFKC4pOwoJLmJzcyAoTk9MT0FEKSA6IHsgKiguYnNzKSB9CgkuID0gQUxJR04oNCk7CglfX2Jzc19lbmQgPSBBQlNPTFVURSguKTsKCgkuID0gQUxJR04oNCk7CglfX3JlbF9keW5fc3RhcnQgPSAuOwoJLnJlbC5keW4gOiB7ICooLnJlbC5keW4pIH0KCV9fcmVsX2R5bl9lbmQgPSAuOwoKCS9ESVNDQVJELyA6IHsgKiguZHluc3RyKikgfQoJL0RJU0NBUkQvIDogeyAqKC5keW5hbWljKikgfQoJL0RJU0NBUkQvIDogeyAqKC5wbHQqKSB9CgkvRElTQ0FSRC8gOiB7ICooLmludGVycCopIH0KCS9ESVNDQVJELyA6IHsgKiguZ251KikgfQoKCS8qIDE2Yml0IHJlYWxtb2RlIHRyYW1wb2xpbmUgY29kZSAqLwoJLnJlYWxtb2RlIFJFQUxNT0RFX0JBU0UgOiBBVCAoIExPQURBRERSKC5yZWwuZHluKSArIFNJWkVPRigucmVsLmR5bikgKSB7IEtFRVAoKigucmVhbG1vZGUpKSB9CgoJX19yZWFsbW9kZV9zdGFydCA9IExPQURBRERSKC5yZWFsbW9kZSk7CglfX3JlYWxtb2RlX3NpemUgPSBTSVpFT0YoLnJlYWxtb2RlKTsKCgkvKiAxNmJpdCBCSU9TIGVtdWxhdGlvbiBjb2RlIChqdXN0IGVub3VnaCB0byBib290IExpbnV4KSAqLwoJLmJpb3MgMCA6IEFUICggTE9BREFERFIoLnJlYWxtb2RlKSArIFNJWkVPRigucmVhbG1vZGUpICkgeyBLRUVQKCooLmJpb3MpKSB9CgoJX19iaW9zX3N0YXJ0ID0gTE9BREFERFIoLmJpb3MpOwoJX19iaW9zX3NpemUgPSBTSVpFT0YoLmJpb3MpOwoKCS8qCgkgKiBUaGUgZm9sbG93aW5nIGV4cHJlc3Npb25zIHBsYWNlIHRoZSAxNi1iaXQgUmVhbC1Nb2RlIGNvZGUgYW5kCgkgKiBSZXNldCBWZWN0b3IgYXQgdGhlIGVuZCBvZiB0aGUgRmxhc2ggUk9NCgkgKi8KCS4gPSBTVEFSVF8xNjsKCS5zdGFydDE2IDogQVQgKENPTkZJR19TWVNfVEVYVF9CQVNFICsgKENPTkZJR19TWVNfTU9OSVRPUl9MRU4gLSBSRVNFVF9TRUdfU0laRSArIFNUQVJUXzE2KSkgeyBLRUVQKCooLnN0YXJ0MTYpKTsgfQoKCS4gPSBSRVNFVF9WRUNfTE9DOwoJLnJlc2V0dmVjIDogQVQgKENPTkZJR19TWVNfVEVYVF9CQVNFICsgKENPTkZJR19TWVNfTU9OSVRPUl9MRU4gLSBSRVNFVF9TRUdfU0laRSArIFJFU0VUX1ZFQ19MT0MpKSB7IEtFRVAoKigucmVzZXR2ZWMpKTsgfQp9Cg==