LyoKICogJFJDU0lkOiAkCiAqCiAqIENvcHlyaWdodCCpIDIwMDAgVHVvbWFzIEouIEx1a2thCiAqCiAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwogKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAogKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwogKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBUdW9tYXMgTHVra2Egbm90IGJlIHVzZWQgaW4KICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CiAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUdW9tYXMgTHVra2EgbWFrZXMgbm8KICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0CiAqIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCiAqCiAqIFRVT01BUyBMVUtLQSBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwogKiBFVkVOVCBTSEFMTCBUVU9NQVMgTFVLS0EgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCiAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKi8KCiNpbmNsdWRlIDxtYXRoLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlICJmY2ludC5oIgoKY29uc3QgRmNNYXRyaXggICAgRmNJZGVudGl0eU1hdHJpeCA9IHsgMSwgMCwgMCwgMSB9OwoKRmNNYXRyaXggKgpGY01hdHJpeENvcHkgKGNvbnN0IEZjTWF0cml4ICptYXQpIAp7CiAgICBGY01hdHJpeCAqcjsKICAgIGlmKCFtYXQpIAoJcmV0dXJuIDA7CiAgICByID0gKEZjTWF0cml4ICopIG1hbGxvYyAoc2l6ZW9mICgqcikgKTsKICAgIGlmICghcikKCXJldHVybiAwOwogICAgRmNNZW1BbGxvYyAoRkNfTUVNX01BVFJJWCwgc2l6ZW9mIChGY01hdHJpeCkpOwogICAgKnIgPSAqbWF0OwogICAgcmV0dXJuIHI7Cn0KCnZvaWQKRmNNYXRyaXhGcmVlIChGY01hdHJpeCAqbWF0KQp7CiAgICBpZiAobWF0ICE9ICZGY0lkZW50aXR5TWF0cml4KQogICAgewoJRmNNZW1GcmVlIChGQ19NRU1fTUFUUklYLCBzaXplb2YgKEZjTWF0cml4KSk7CglmcmVlIChtYXQpOwogICAgfQp9CgpGY0Jvb2wKRmNNYXRyaXhFcXVhbCAoY29uc3QgRmNNYXRyaXggKm1hdDEsIGNvbnN0IEZjTWF0cml4ICptYXQyKQp7CiAgICBpZihtYXQxID09IG1hdDIpIHJldHVybiBGY1RydWU7CiAgICBpZihtYXQxID09IDAgfHwgbWF0MiA9PSAwKSByZXR1cm4gRmNGYWxzZTsKICAgIHJldHVybiBtYXQxLT54eCA9PSBtYXQyLT54eCAmJiAKCSAgIG1hdDEtPnh5ID09IG1hdDItPnh5ICYmCgkgICBtYXQxLT55eCA9PSBtYXQyLT55eCAmJgoJICAgbWF0MS0+eXkgPT0gbWF0Mi0+eXk7Cn0KCnZvaWQKRmNNYXRyaXhNdWx0aXBseSAoRmNNYXRyaXggKnJlc3VsdCwgY29uc3QgRmNNYXRyaXggKmEsIGNvbnN0IEZjTWF0cml4ICpiKQp7CiAgICBGY01hdHJpeAlyOwoKICAgIHIueHggPSBhLT54eCAqIGItPnh4ICsgYS0+eHkgKiBiLT55eDsKICAgIHIueHkgPSBhLT54eCAqIGItPnh5ICsgYS0+eHkgKiBiLT55eTsKICAgIHIueXggPSBhLT55eCAqIGItPnh4ICsgYS0+eXkgKiBiLT55eDsKICAgIHIueXkgPSBhLT55eCAqIGItPnh5ICsgYS0+eXkgKiBiLT55eTsKICAgICpyZXN1bHQgPSByOwp9Cgp2b2lkCkZjTWF0cml4Um90YXRlIChGY01hdHJpeCAqbSwgZG91YmxlIGMsIGRvdWJsZSBzKQp7CiAgICBGY01hdHJpeAlyOwoKICAgIC8qCiAgICAgKiBYIENvb3JkaW5hdGUgc3lzdGVtIGlzIHVwc2lkZSBkb3duLCBzd2FwIHRvIG1ha2UKICAgICAqIHJvdGF0aW9ucyBjb3VudGVyY2xvY2t3aXNlCiAgICAgKi8KICAgIHIueHggPSBjOwogICAgci54eSA9IC1zOwogICAgci55eCA9IHM7CiAgICByLnl5ID0gYzsKICAgIEZjTWF0cml4TXVsdGlwbHkgKG0sICZyLCBtKTsKfQoKdm9pZApGY01hdHJpeFNjYWxlIChGY01hdHJpeCAqbSwgZG91YmxlIHN4LCBkb3VibGUgc3kpCnsKICAgIEZjTWF0cml4CXI7CgogICAgci54eCA9IHN4OwogICAgci54eSA9IDA7CiAgICByLnl4ID0gMDsKICAgIHIueXkgPSBzeTsKICAgIEZjTWF0cml4TXVsdGlwbHkgKG0sICZyLCBtKTsKfQoKdm9pZApGY01hdHJpeFNoZWFyIChGY01hdHJpeCAqbSwgZG91YmxlIHNoLCBkb3VibGUgc3YpCnsKICAgIEZjTWF0cml4CXI7CgogICAgci54eCA9IDE7CiAgICByLnh5ID0gc2g7CiAgICByLnl4ID0gc3Y7CiAgICByLnl5ID0gMTsKICAgIEZjTWF0cml4TXVsdGlwbHkgKG0sICZyLCBtKTsKfQo=