LyoKICogQ29weXJpZ2h0IChjKSAxOTk5IEt1bmdsaWdhIFRla25pc2thIEj2Z3Nrb2xhbgogKiAoUm95YWwgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIFN0b2NraG9sbSwgU3dlZGVuKS4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogKiBhcmUgbWV0OgogKgogKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAqCiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICoKICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCiAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKICogICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBLdW5nbGlnYSBUZWtuaXNrYQogKiAgICAgIEj2Z3Nrb2xhbiBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KICoKICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgSW5zdGl0dXRlIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwogKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAqCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIElOU1RJVFVURSBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCiAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCiAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIElOU1RJVFVURSBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCiAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCiAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCiAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQogKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAogKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCiAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKICogU1VDSCBEQU1BR0UuCiAqLwoKLyogJElkOiBpbmV0X250b3AuYyx2IDEuNyAyMDAzLzExLzE2IDA5OjM2OjUwIGd1eSBFeHAgJCAqLwoKI2lmbmRlZiBsaW50CnN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gPQogICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL21pc3NpbmcvaW5ldF9udG9wLmMsdiAxLjcgMjAwMy8xMS8xNiAwOTozNjo1MCBndXkgRXhwICQiOwojZW5kaWYKCi8qIHdlIGFyZW4ndCB0Y3BkdW1wIDopICovCiNpZmRlZiBub3RkZWYKI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CiNlbmRpZgoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KCiNpZm5kZWYgV0lOMzIKI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CgojZWxzZSAgIC8qIFdJTjMyICovCiNpbmNsdWRlIDx0aW1lLmg+CiNpbmNsdWRlIDx3aW5zb2NrMi5oPgojaWZkZWYgRE9fSVBWNgojaW5jbHVkZSA8d3MydGNwaXAuaD4KI2VuZGlmICAvKiBET19JUFY2ICovCiNpbmNsdWRlIDx3aW5kb3dzLmg+CgovKiBUaGUgYmVsb3cgYXJlIGNvcGllZCBmcm9tIG5ldGxpYi5oICovCiNpZmRlZiBlcnJubwovKiBkZWxldGUgdGhlIG9uZSBmcm9tIHN0ZGxpYi5oICAqLwovKiNkZWZpbmUgZXJybm8gICAgICAgKCpfZXJybm8oKSkgKi8KI3VuZGVmIGVycm5vCiNlbmRpZgojZGVmaW5lIGVycm5vIEdldExhc3RFcnJvcigpCiNkZWZpbmUgU2V0X2Vycm5vKG51bSkgU2V0TGFzdEVycm9yKChudW0pKQoKLyogSU5WQUxJRF9TT0NLRVQgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUgPT0gKHVuc2lnbmVkIGludCkofjApICovCi8qIFNPQ0tFVF9FUlJPUiA9PSAtMSAqLwojZGVmaW5lIEVOT1RTT0NLIFdTQUVOT1RTT0NLCiNkZWZpbmUgRUlOVFIgICAgV1NBRUlOVFIKI2RlZmluZSBFTk9CVUZTICBXU0FFTk9CVUZTCiNkZWZpbmUgRVdPVUxEQkxPQ0sgICAgICAgICAgIFdTQUVXT1VMREJMT0NLCiNkZWZpbmUgRUFGTk9TVVBQT1JUICBXU0FFQUZOT1NVUFBPUlQKLyogZnJvbSBwdWJsaWNcc2RrXGluY1xjcnRcZXJybm8uaCAqLwojZGVmaW5lIEVOT1NQQyAgICAgICAgICAyOAojZW5kaWYgIC8qIFdJTjMyICovCgovKgogKgogKi8KCiNpZm5kZWYgSU5FVF9BRERSU1RSTEVOCiNkZWZpbmUgSU5FVF9BRERSU1RSTEVOICAgIDE2CiNlbmRpZgoKc3RhdGljIGNvbnN0IGNoYXIgKgppbmV0X250b3BfdjQgKGNvbnN0IHZvaWQgKnNyYywgY2hhciAqZHN0LCBzaXplX3Qgc2l6ZSkKewogICAgY29uc3QgY2hhciBkaWdpdHNbXSA9ICIwMTIzNDU2Nzg5IjsKICAgIGludCBpOwogICAgc3RydWN0IGluX2FkZHIgKmFkZHIgPSAoc3RydWN0IGluX2FkZHIgKilzcmM7CiAgICB1X2xvbmcgYSA9IG50b2hsKGFkZHItPnNfYWRkcik7CiAgICBjb25zdCBjaGFyICpvcmlnX2RzdCA9IGRzdDsKCiAgICBpZiAoc2l6ZSA8IElORVRfQUREUlNUUkxFTikgewogICAgICBTZXRfZXJybm8oRU5PU1BDKTsKICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CglpbnQgbiA9IChhID4+ICgyNCAtIGkgKiA4KSkgJiAweEZGOwoJaW50IG5vbl96ZXJvcCA9IDA7CgoJaWYgKG5vbl96ZXJvcCB8fCBuIC8gMTAwID4gMCkgewoJICAgICpkc3QrKyA9IGRpZ2l0c1tuIC8gMTAwXTsKCSAgICBuICU9IDEwMDsKCSAgICBub25femVyb3AgPSAxOwoJfQoJaWYgKG5vbl96ZXJvcCB8fCBuIC8gMTAgPiAwKSB7CgkgICAgKmRzdCsrID0gZGlnaXRzW24gLyAxMF07CgkgICAgbiAlPSAxMDsKCSAgICBub25femVyb3AgPSAxOwoJfQoJKmRzdCsrID0gZGlnaXRzW25dOwoJaWYgKGkgIT0gMykKCSAgICAqZHN0KysgPSAnLic7CiAgICB9CiAgICAqZHN0KysgPSAnXDAnOwogICAgcmV0dXJuIG9yaWdfZHN0Owp9Cgpjb25zdCBjaGFyICoKaW5ldF9udG9wKGludCBhZiwgY29uc3Qgdm9pZCAqc3JjLCBjaGFyICpkc3QsIHNpemVfdCBzaXplKQp7CiAgICBzd2l0Y2ggKGFmKSB7CiAgICBjYXNlIEFGX0lORVQgOgoJcmV0dXJuIGluZXRfbnRvcF92NCAoc3JjLCBkc3QsIHNpemUpOwogICAgZGVmYXVsdCA6CiAgICAgIFNldF9lcnJubyhFQUZOT1NVUFBPUlQpOwogICAgICByZXR1cm4gTlVMTDsKICAgIH0KfQo=