LyoKICogVG9zaGliYSBUQzYzOTNYQiBJL08gQ29udHJvbGxlci4KICogRm91bmQgaW4gU2hhcnAgWmF1cnVzIFNMLTYwMDAgKHRvc2EpIG9yIHNvbWUKICogVG9zaGliYSBlLVNlcmllcyBQREFzLgogKgogKiBGQiBzdXBwb3J0IGNvZGUuIEJhc2VkIG9uIEczNjQgZmIgZW11bGF0b3IKICoKICogQ29weXJpZ2h0IChjKSAyMDA3IEhlcnbpIFBvdXNzaW5lYXUKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KICovCgojaWYgQklUUyA9PSA4CiMgZGVmaW5lIFNFVF9QSVhFTChhZGRyLCBjb2xvcikJKih1aW50OF90KilhZGRyID0gY29sb3I7CiNlbGlmIEJJVFMgPT0gMTUgfHwgQklUUyA9PSAxNgojIGRlZmluZSBTRVRfUElYRUwoYWRkciwgY29sb3IpCSoodWludDE2X3QqKWFkZHIgPSBjb2xvcjsKI2VsaWYgQklUUyA9PSAyNAojIGRlZmluZSBTRVRfUElYRUwoYWRkciwgY29sb3IpCVwKICAgIGFkZHJbMF0gPSBjb2xvcjsgYWRkclsxXSA9IChjb2xvcikgPj4gODsgYWRkclsyXSA9IChjb2xvcikgPj4gMTY7CiNlbGlmIEJJVFMgPT0gMzIKIyBkZWZpbmUgU0VUX1BJWEVMKGFkZHIsIGNvbG9yKQkqKHVpbnQzMl90KilhZGRyID0gY29sb3I7CiNlbHNlCiMgZXJyb3IgdW5rbm93biBiaXQgZGVwdGgKI2VuZGlmCgoKc3RhdGljIHZvaWQgZ2x1ZSh0YzYzOTN4Yl9kcmF3X2dyYXBoaWMsIEJJVFMpKFRDNjM5M3hiU3RhdGUgKnMpCnsKICAgIGludCBpOwogICAgdWludDE2X3QgKmRhdGFfYnVmZmVyOwogICAgdWludDhfdCAqZGF0YV9kaXNwbGF5OwoKICAgIGRhdGFfYnVmZmVyID0gcy0+dnJhbV9wdHI7CiAgICBkYXRhX2Rpc3BsYXkgPSBkc19nZXRfZGF0YShzLT5kcyk7CiAgICBmb3IoaSA9IDA7IGkgPCBzLT5zY3JfaGVpZ2h0OyBpKyspIHsKI2lmIChCSVRTID09IDE2KQogICAgICAgIG1lbWNweShkYXRhX2Rpc3BsYXksIGRhdGFfYnVmZmVyLCBzLT5zY3Jfd2lkdGggKiAyKTsKICAgICAgICBkYXRhX2J1ZmZlciArPSBzLT5zY3Jfd2lkdGg7CiAgICAgICAgZGF0YV9kaXNwbGF5ICs9IGRzX2dldF9saW5lc2l6ZShzLT5kcyk7CiNlbHNlCiAgICAgICAgaW50IGo7CiAgICAgICAgZm9yIChqID0gMDsgaiA8IHMtPnNjcl93aWR0aDsgaisrLCBkYXRhX2Rpc3BsYXkgKz0gQklUUyAvIDgsIGRhdGFfYnVmZmVyKyspIHsKICAgICAgICAgICAgdWludDE2X3QgY29sb3IgPSAqZGF0YV9idWZmZXI7CiAgICAgICAgICAgIHVpbnQzMl90IGRlc3RfY29sb3IgPSBnbHVlKHJnYl90b19waXhlbCwgQklUUykoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY29sb3IgJiAweGY4MDApICogMHgxMDgpID4+IDExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAoKGNvbG9yICYgMHg3ZTApICogMHg0MSkgPj4gOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjb2xvciAmIDB4MWYpICogMHgyMSkgPj4gMgogICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICBTRVRfUElYRUwoZGF0YV9kaXNwbGF5LCBkZXN0X2NvbG9yKTsKICAgICAgICB9CiNlbmRpZgogICAgfQp9CgojdW5kZWYgQklUUwojdW5kZWYgU0VUX1BJWEVMCg==