LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZS4KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgpPVVRQVVRfRk9STUFUKCJlbGYzMi1pMzg2IiwgImVsZjMyLWkzODYiLCAiZWxmMzItaTM4NiIpCk9VVFBVVF9BUkNIKGkzODYpCkVOVFJZKF9zdGFydCkKClNFQ1RJT05TCnsKCS4gPSBURVhUX0JBU0U7CQkvKiBMb2NhdGlvbiBvZiBib290Y29kZSBpbiBmbGFzaCAqLwoJX190ZXh0X3N0YXJ0ID0gLjsKCS50ZXh0ICA6IHsgKigudGV4dCopOyB9CgoJLiA9IEFMSUdOKDQpOwoJX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKCS51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9CgkuID0gQUxJR04oNCk7CglfX3VfYm9vdF9jbWRfZW5kID0gLjsKCgkuID0gQUxJR04oNCk7Cgkucm9kYXRhIDogeyAqKFNPUlRfQllfQUxJR05NRU5UKFNPUlRfQllfTkFNRSgucm9kYXRhKikpKSB9CgoJLiA9IEFMSUdOKDQpOwoJLmRhdGEgOiB7ICooLmRhdGEqKSB9CgoJLiA9IEFMSUdOKDQpOwoJLmR5bnN5bSA6IHsgKiguZHluc3ltKikgfQoKCS4gPSBBTElHTig0KTsKCS5oYXNoIDogeyAqKC5oYXNoKikgfQoKCS4gPSBBTElHTig0KTsKCS5nb3QgOiB7ICooLmdvdCopIH0KCgkuID0gQUxJR04oNCk7CglfX2RhdGFfZW5kID0gLjsKCgkuID0gQUxJR04oNCk7CglfX2Jzc19zdGFydCA9IEFCU09MVVRFKC4pOwoJLmJzcyAoTk9MT0FEKSA6IHsgKiguYnNzKSB9CgkuID0gQUxJR04oNCk7CglfX2Jzc19lbmQgPSBBQlNPTFVURSguKTsKCgkuID0gQUxJR04oNCk7CglfX3JlbF9keW5fc3RhcnQgPSAuOwoJLnJlbC5keW4gOiB7ICooLnJlbC5keW4pIH0KCV9fcmVsX2R5bl9lbmQgPSAuOwoKCS9ESVNDQVJELyA6IHsgKiguZHluc3RyKikgfQoJL0RJU0NBUkQvIDogeyAqKC5keW5hbWljKikgfQoJL0RJU0NBUkQvIDogeyAqKC5wbHQqKSB9CgkvRElTQ0FSRC8gOiB7ICooLmludGVycCopIH0KCS9ESVNDQVJELyA6IHsgKiguZ251KikgfQoKCS8qIDE2Yml0IHJlYWxtb2RlIHRyYW1wb2xpbmUgY29kZSAqLwoJLnJlYWxtb2RlIDB4N2MwIDogQVQgKCBMT0FEQUREUigucmVsLmR5bikgKyBTSVpFT0YoLnJlbC5keW4pICkgeyBLRUVQKCooLnJlYWxtb2RlKSkgfQoKCV9fcmVhbG1vZGVfc3RhcnQgPSBMT0FEQUREUigucmVhbG1vZGUpOwoJX19yZWFsbW9kZV9zaXplID0gU0laRU9GKC5yZWFsbW9kZSk7CgoJLyogMTZiaXQgQklPUyBlbXVsYXRpb24gY29kZSAoanVzdCBlbm91Z2ggdG8gYm9vdCBMaW51eCkgKi8KCS5iaW9zIDAgOiBBVCAoIExPQURBRERSKC5yZWFsbW9kZSkgKyBTSVpFT0YoLnJlYWxtb2RlKSApIHsgS0VFUCgqKC5iaW9zKSkgfQoKCV9fYmlvc19zdGFydCA9IExPQURBRERSKC5iaW9zKTsKCV9fYmlvc19zaXplID0gU0laRU9GKC5iaW9zKTsKCgkvKiBUaGUgbG9hZCBhZGRyZXNzZXMgYmVsb3cgYXNzdW1lcyB0aGF0IHRoZSBmbGFzaAoJICogd2lsbCBiZSBtYXBwZWQgc28gdGhhdCAweDM4N2YwMDAwID09IDB4ZmZmZjAwMDAKCSAqIGF0IHJlc2V0IHRpbWUKCSAqCgkgKiBUaGUgZmUwMCBhbmQgZmYwMCBvZmZzZXRzIG9mIHRoZSBzdGFydDMyIGFuZCBzdGFydDE2CgkgKiBzZWdtZW50cyBhcmUgYXJiaXRyYXJ5LCB0aGUganVzdCBoYXZlIHRvIGJlIG1hcHBlZAoJICogYXQgcmVzZXQgYW5kIHRoZSBjb2RlIGhhdmUgdG8gZml0LgoJICogVGhlIGZmZjAgb2Zmc2V0IG9mIHJlc2V0dmVjIGlzIGltcG9ydGFudCwgaG93ZXZlci4KCSAqLwoJLiA9IDB4ZmZmZmZlMDA7Cgkuc3RhcnQzMiA6IEFUIChURVhUX0JBU0UgKyAweDNmZTAwKSB7IEtFRVAoKiguc3RhcnQzMikpOyB9CgoJLiA9IDB4ZjgwMDsKCS5zdGFydDE2IDogQVQgKFRFWFRfQkFTRSArIDB4M2Y4MDApIHsgS0VFUCgqKC5zdGFydDE2KSk7IH0KCgkuID0gMHhmZmYwOwoJLnJlc2V0dmVjIDogQVQgKFRFWFRfQkFTRSArIDB4M2ZmZjApIHsgS0VFUCgqKC5yZXNldHZlYykpOyB9Cn0K