LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZS4KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgojaWZuZGVmIF9VX0JPT1RfSTM4Nl9IXwojZGVmaW5lIF9VX0JPT1RfSTM4Nl9IXwkxCgovKiBmb3IgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXMsIHNlZSBzdGFydC5TICovCmV4dGVybiB1bG9uZyBpMzg2Ym9vdF9zdGFydDsJICAgIC8qIGNvZGUgc3RhcnQgKGluIGZsYXNoKSAqLwpleHRlcm4gdWxvbmcgaTM4NmJvb3RfZW5kOwkgICAgLyogY29kZSBlbmQgKGluIGZsYXNoKSAqLwpleHRlcm4gdWxvbmcgaTM4NmJvb3Rfcm9tZGF0YV9zdGFydDsvKiBkYXRhc2VnbWVudCBpbiBmbGFzaCAoYWxzbyBjb2RlK3JvZGF0YSBlbmQpICovCmV4dGVybiB1bG9uZyBpMzg2Ym9vdF9yb21kYXRhX2Rlc3Q7IC8qIGRhdGEgbG9jYXRpb24gc2VnbWVudCBpbiByYW0gKi8KZXh0ZXJuIHVsb25nIGkzODZib290X3JvbWRhdGFfc2l6ZTsgLyogc2l6ZSBvZiBkYXRhIHNlZ21lbnQgKi8KZXh0ZXJuIHVsb25nIGkzODZib290X2Jzc19zdGFydDsgICAgLyogYnNzIHN0YXJ0ICovCmV4dGVybiB1bG9uZyBpMzg2Ym9vdF9ic3Nfc2l6ZTsgICAgIC8qIGJzcyBzaXplICovCmV4dGVybiB1bG9uZyBpMzg2Ym9vdF9zdGFja19lbmQ7ICAgIC8qIGZpcnN0IHVzYWJsZSBSQU0gYWRkcmVzcyBhZnRlciBic3MgYW5kIHN0YWNrICovCmV4dGVybiB1bG9uZyBpMzg2Ym9vdF9yYW1fZW5kOyAgICAgIC8qIGVuZCBvZiByYW0gKi8KCmV4dGVybiB1bG9uZyBpMzg2Ym9vdF9yZWFsbW9kZTsgICAgIC8qIHN0YXJ0IG9mIHJlYWxtb2RlIGVudHJ5IGNvZGUgKi8KZXh0ZXJuIHVsb25nIGkzODZib290X3JlYWxtb2RlX3NpemU7Lyogc2l6ZSBvZiByZWFsbW9kZSBlbnRyeSBjb2RlICovCmV4dGVybiB1bG9uZyBpMzg2Ym9vdF9iaW9zOyAgICAgICAgIC8qIHN0YXJ0IG9mIEJJT1MgZW11bGF0aW9uIGNvZGUgKi8KZXh0ZXJuIHVsb25nIGkzODZib290X2Jpb3Nfc2l6ZTsgICAgLyogc2l6ZSBvZiBCSU9TIGVtdWxhdGlvbiBjb2RlICovCgoKLyogY3B1Ly4uLi9jcHUuYyAqLwppbnQgY3B1X2luaXQodm9pZCk7CmludCB0aW1lcl9pbml0KHZvaWQpOwoKLyogYm9hcmQvLi4uLy4uLiAqLwppbnQgYm9hcmRfaW5pdCh2b2lkKTsKaW50IGRyYW1faW5pdCh2b2lkKTsKCnZvaWQgaXNhX3VubWFwX3JvbSh1MzIgYWRkcik7CnUzMiBpc2FfbWFwX3JvbSh1MzIgYnVzX2FkZHIsIGludCBzaXplKTsKCi8qIGxpYl9pMzg2Ly4uLiAqLwppbnQgdmlkZW9fYmlvc19pbml0KHZvaWQpOwppbnQgdmlkZW9faW5pdCh2b2lkKTsKCgojZW5kaWYJLyogX1VfQk9PVF9JMzg2X0hfICovCg==