LyoKICogRGVidWdnZXIgc3RhY2sgaGFuZGxpbmcKICoKICogQ29weXJpZ2h0IDE5OTUgQWxleGFuZHJlIEp1bGxpYXJkCiAqIENvcHlyaWdodCAxOTk2IEVyaWMgWW91bmdkYWxlCiAqIENvcHlyaWdodCAxOTk5IE92ZSBL5XZlbgogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgImRlYnVnZ2VyLmgiCiNpbmNsdWRlICJzdGFja2ZyYW1lLmgiCgoKLyoKICogV2Uga2VlcCB0aGlzIGluZm8gZm9yIGVhY2ggZnJhbWUsIHNvIHRoYXQgd2UgY2FuCiAqIGZpbmQgbG9jYWwgdmFyaWFibGUgaW5mb3JtYXRpb24gY29ycmVjdGx5LgogKi8Kc3RydWN0IGJ0X2luZm8KewogIHVuc2lnbmVkIGludAkgICAgIGNzOwogIHVuc2lnbmVkIGludAkgICAgIGVpcDsKICB1bnNpZ25lZCBpbnQJICAgICBzczsKICB1bnNpZ25lZCBpbnQJICAgICBlYnA7CiAgc3RydWN0IHN5bWJvbF9pbmZvIGZyYW1lOwp9OwoKc3RhdGljIGludCBuZnJhbWU7CnN0YXRpYyBzdHJ1Y3QgYnRfaW5mbyAqIGZyYW1lcyA9IE5VTEw7CmludCBjdXJyX2ZyYW1lOwoKdHlwZWRlZiBzdHJ1Y3QKewogICAgV09SRCBicDsKICAgIFdPUkQgaXA7CiAgICBXT1JEIGNzOwp9IEZSQU1FMTY7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgICBEV09SRCBicDsKICAgIERXT1JEIGlwOwogICAgV09SRCBjczsKfSBGUkFNRTMyOwoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIERFQlVHX0luZm9TdGFjawogKgogKiBEdW1wIHRoZSB0b3Agb2YgdGhlIHN0YWNrCiAqLwp2b2lkIERFQlVHX0luZm9TdGFjayh2b2lkKQp7CiAgICBEQkdfQUREUiBhZGRyOwoKICAgIGFkZHIudHlwZSA9IE5VTEw7CiAgICBhZGRyLnNlZyA9IFNTX3JlZygmREVCVUdfY29udGV4dCk7CiAgICBhZGRyLm9mZiA9IEVTUF9yZWcoJkRFQlVHX2NvbnRleHQpOwoKICAgIGZwcmludGYoc3RkZXJyLCJTdGFjayBkdW1wOlxuIik7CiAgICBpZiAoSVNfU0VMRUNUT1JfMzJCSVQoYWRkci5zZWcpKQogICAgeyAgLyogMzItYml0IG1vZGUgKi8KICAgICAgICBERUJVR19FeGFtaW5lTWVtb3J5KCAmYWRkciwgMjQsICd4JyApOwogICAgfQogICAgZWxzZSAgLyogMTYtYml0IG1vZGUgKi8KICAgIHsKICAgICAgICBhZGRyLm9mZiAmPSAweGZmZmY7CiAgICAgICAgREVCVUdfRXhhbWluZU1lbW9yeSggJmFkZHIsIDI0LCAndycgKTsKICAgIH0KICAgIGZwcmludGYoc3RkZXJyLCJcbiIpOwp9CgoKc3RhdGljIHZvaWQgREVCVUdfRm9yY2VGcmFtZShEQkdfQUREUiAqc3RhY2ssIERCR19BRERSICpjb2RlLCBpbnQgZnJhbWVubywgaW50IGJpdHMsIGludCBub2lzeSkKewogICAgaW50IHRoZWZyYW1lID0gbmZyYW1lKys7CiAgICBmcmFtZXMgPSAoc3RydWN0IGJ0X2luZm8gKilEQkdfcmVhbGxvYyhmcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZnJhbWUqc2l6ZW9mKHN0cnVjdCBidF9pbmZvKSk7CiAgICBpZiAobm9pc3kpCiAgICAgIGZwcmludGYoc3RkZXJyLCIlcyVkICIsICh0aGVmcmFtZSA9PSBjdXJyX2ZyYW1lID8gIj0+IiA6ICIgICIpLAogICAgICAgICAgICAgIGZyYW1lbm8pOwogICAgZnJhbWVzW3RoZWZyYW1lXS5jcyA9IGNvZGUtPnNlZzsKICAgIGZyYW1lc1t0aGVmcmFtZV0uZWlwID0gY29kZS0+b2ZmOwogICAgaWYgKG5vaXN5KQogICAgICBmcmFtZXNbdGhlZnJhbWVdLmZyYW1lID0gREVCVUdfUHJpbnRBZGRyZXNzQW5kQXJncyggY29kZSwgYml0cywgCgkJCQkJCXN0YWNrLT5vZmYsIFRSVUUgKTsKICAgIGVsc2UKICAgICAgREVCVUdfRmluZE5lYXJlc3RTeW1ib2woIGNvZGUsIFRSVUUsIAoJCQkgICAgICAgJmZyYW1lc1t0aGVmcmFtZV0uZnJhbWUuc3ltLCBzdGFjay0+b2ZmLCAKCQkJICAgICAgICZmcmFtZXNbdGhlZnJhbWVdLmZyYW1lLmxpc3QpOwogICAgZnJhbWVzW3RoZWZyYW1lXS5zcyA9IHN0YWNrLT5zZWc7CiAgICBmcmFtZXNbdGhlZnJhbWVdLmVicCA9IHN0YWNrLT5vZmY7CiAgICBpZiAobm9pc3kpIHsKICAgICAgZnByaW50Ziggc3RkZXJyLCAoYml0cyA9PSAxNikgPyAiIChicD0lMDRseClcbiIgOiAiIChlYnA9JTA4bHgpXG4iLCBzdGFjay0+b2ZmICk7CiAgICB9Cn0KCnN0YXRpYyBCT09MIERFQlVHX0ZyYW1lMTYoREJHX0FERFIgKmFkZHIsIHVuc2lnbmVkIGludCAqY3MsIGludCBmcmFtZW5vLCBpbnQgbm9pc3kpCnsKICAgIHVuc2lnbmVkIGludCBzcyA9IGFkZHItPnNlZywgcG9zc2libGVfY3MgPSAwOwogICAgRlJBTUUxNiAqZnJhbWUgPSAoRlJBTUUxNiAqKURCR19BRERSX1RPX0xJTihhZGRyKTsKICAgIGludCB0aGVmcmFtZSA9IG5mcmFtZTsKCiAgICBpZiAoIURCR19DSEVDS19SRUFEX1BUUiggYWRkciwgc2l6ZW9mKEZSQU1FMTYpICkpIHJldHVybiBGQUxTRTsKICAgIGlmICghZnJhbWUtPmJwKSByZXR1cm4gRkFMU0U7CiAgICBuZnJhbWUrKzsKICAgIGZyYW1lcyA9IChzdHJ1Y3QgYnRfaW5mbyAqKURCR19yZWFsbG9jKGZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5mcmFtZSpzaXplb2Yoc3RydWN0IGJ0X2luZm8pKTsKICAgIGlmIChub2lzeSkKICAgICAgZnByaW50ZihzdGRlcnIsIiVzJWQgIiwgKHRoZWZyYW1lID09IGN1cnJfZnJhbWUgPyAiPT4iIDogIiAgIiksCiAgICAgICAgICAgICAgZnJhbWVubyk7CiAgICBpZiAoZnJhbWUtPmJwICYgMSkgKmNzID0gZnJhbWUtPmNzOwogICAgZWxzZSB7CiAgICAgIC8qIG5vdCBleHBsaWNpdGx5IG1hcmtlZCBhcyBmYXIgY2FsbCwKICAgICAgICogYnV0IGNoZWNrIHdoZXRoZXIgaXQgY291bGQgYmUgYW55d2F5ICovCiAgICAgIGlmICgoKGZyYW1lLT5jcyY3KT09NykgJiYgKGZyYW1lLT5jcyAhPSAqY3MpICYmICFJU19TRUxFQ1RPUl9GUkVFKGZyYW1lLT5jcykpIHsKICAgICAgICBsZHRfZW50cnkgdGNzOwogICAgICAgIExEVF9HZXRFbnRyeSggU0VMRUNUT1JfVE9fRU5UUlkoZnJhbWUtPmNzKSwgJnRjcyApOwogICAgICAgIGlmICggdGNzLnR5cGUgPT0gU0VHTUVOVF9DT0RFICkgewogICAgICAgICAgLyogaXQgaXMgdmVyeSB1bmNvbW1vbiB0byBwdXNoIGEgY29kZSBzZWdtZW50IGNzIGFzCiAgICAgICAgICAgKiBhIHBhcmFtZXRlciwgc28gdGhpcyBzaG91bGQgd29yayBpbiBtb3N0IGNhc2VzICovCiAgICAgICAgICAqY3MgPSBwb3NzaWJsZV9jcyA9IGZyYW1lLT5jczsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGZyYW1lc1t0aGVmcmFtZV0uY3MgPSBhZGRyLT5zZWcgPSAqY3M7CiAgICBmcmFtZXNbdGhlZnJhbWVdLmVpcCA9IGFkZHItPm9mZiA9IGZyYW1lLT5pcDsKICAgIGlmIChub2lzeSkKICAgICAgZnJhbWVzW3RoZWZyYW1lXS5mcmFtZSA9IERFQlVHX1ByaW50QWRkcmVzc0FuZEFyZ3MoIGFkZHIsIDE2LCAKCQkJCQkJZnJhbWUtPmJwLCBUUlVFICk7CiAgICBlbHNlCiAgICAgIERFQlVHX0ZpbmROZWFyZXN0U3ltYm9sKCBhZGRyLCBUUlVFLCAKCQkJICAgICAgICZmcmFtZXNbdGhlZnJhbWVdLmZyYW1lLnN5bSwgZnJhbWUtPmJwLCAKCQkJICAgICAgICZmcmFtZXNbdGhlZnJhbWVdLmZyYW1lLmxpc3QpOwogICAgZnJhbWVzW3RoZWZyYW1lXS5zcyA9IGFkZHItPnNlZyA9IHNzOwogICAgZnJhbWVzW3RoZWZyYW1lXS5lYnAgPSBhZGRyLT5vZmYgPSBmcmFtZS0+YnAgJiB+MTsKICAgIGlmIChub2lzeSkgewogICAgICBmcHJpbnRmKCBzdGRlcnIsICIgKGJwPSUwNGx4IiwgYWRkci0+b2ZmICk7CiAgICAgIGlmIChwb3NzaWJsZV9jcykgewogICAgICAgIGZwcmludGYoIHN0ZGVyciwgIiwgZmFyIGNhbGwgYXNzdW1lZCIgKTsKICAgICAgfQogICAgICBmcHJpbnRmKCBzdGRlcnIsICIpXG4iICk7CiAgICB9CiAgICByZXR1cm4gVFJVRTsKfQoKc3RhdGljIEJPT0wgREVCVUdfRnJhbWUzMihEQkdfQUREUiAqYWRkciwgdW5zaWduZWQgaW50ICpjcywgaW50IGZyYW1lbm8sIGludCBub2lzeSkKewogICAgdW5zaWduZWQgaW50IHNzID0gYWRkci0+c2VnOwogICAgRlJBTUUzMiAqZnJhbWUgPSAoRlJBTUUzMiAqKURCR19BRERSX1RPX0xJTihhZGRyKTsKICAgIGludCB0aGVmcmFtZSA9IG5mcmFtZTsKCiAgICBpZiAoIURCR19DSEVDS19SRUFEX1BUUiggYWRkciwgc2l6ZW9mKEZSQU1FMzIpICkpIHJldHVybiBGQUxTRTsKICAgIGlmICghZnJhbWUtPmlwKSByZXR1cm4gRkFMU0U7CiAgICBuZnJhbWUrKzsKICAgIGZyYW1lcyA9IChzdHJ1Y3QgYnRfaW5mbyAqKURCR19yZWFsbG9jKGZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5mcmFtZSpzaXplb2Yoc3RydWN0IGJ0X2luZm8pKTsKICAgIGlmIChub2lzeSkKICAgICAgZnByaW50ZihzdGRlcnIsIiVzJWQgIiwgKHRoZWZyYW1lID09IGN1cnJfZnJhbWUgPyAiPT4iIDogIiAgIiksCiAgICAgICAgICAgICAgZnJhbWVubyk7CiAgICBmcmFtZXNbdGhlZnJhbWVdLmNzID0gYWRkci0+c2VnID0gKmNzOwogICAgZnJhbWVzW3RoZWZyYW1lXS5laXAgPSBhZGRyLT5vZmYgPSBmcmFtZS0+aXA7CiAgICBpZiAobm9pc3kpCiAgICAgIGZyYW1lc1t0aGVmcmFtZV0uZnJhbWUgPSBERUJVR19QcmludEFkZHJlc3NBbmRBcmdzKCBhZGRyLCAzMiwgCgkJCQkJCWZyYW1lLT5icCwgVFJVRSApOwogICAgZWxzZQogICAgICBERUJVR19GaW5kTmVhcmVzdFN5bWJvbCggYWRkciwgVFJVRSwgCgkJCSAgICAgICAmZnJhbWVzW3RoZWZyYW1lXS5mcmFtZS5zeW0sIGZyYW1lLT5icCwgCgkJCSAgICAgICAmZnJhbWVzW3RoZWZyYW1lXS5mcmFtZS5saXN0KTsKICAgIGlmIChub2lzeSkgZnByaW50Ziggc3RkZXJyLCAiIChlYnA9JTA4bHgpXG4iLCBmcmFtZS0+YnAgKTsKICAgIGZyYW1lc1t0aGVmcmFtZV0uc3MgPSBhZGRyLT5zZWcgPSBzczsKICAgIGZyYW1lc1t0aGVmcmFtZV0uZWJwID0gZnJhbWUtPmJwOwogICAgaWYgKGFkZHItPm9mZiA9PSBmcmFtZS0+YnApIHJldHVybiBGQUxTRTsKICAgIGFkZHItPm9mZiA9IGZyYW1lLT5icDsKICAgIHJldHVybiBUUlVFOwp9CgpzdGF0aWMgdm9pZCBERUJVR19Eb0JhY2tUcmFjZShpbnQgbm9pc3kpCnsKICAgIERCR19BRERSIGFkZHIsIHN3X2FkZHI7CiAgICB1bnNpZ25lZCBpbnQgc3MgPSBTU19yZWcoJkRFQlVHX2NvbnRleHQpLCBjcyA9IENTX3JlZygmREVCVUdfY29udGV4dCk7CiAgICBpbnQgZnJhbWVubyA9IDAsIGlzMTYsIG9rOwogICAgRFdPUkQgbmV4dF9zd2l0Y2gsIGN1cl9zd2l0Y2g7CgogICAgaWYgKG5vaXN5KSBmcHJpbnRmKCBzdGRlcnIsICJCYWNrdHJhY2U6XG4iICk7CgogICAgbmZyYW1lID0gMTsKICAgIGlmIChmcmFtZXMpIERCR19mcmVlKCBmcmFtZXMgKTsKICAgIGZyYW1lcyA9IChzdHJ1Y3QgYnRfaW5mbyAqKSBEQkdfYWxsb2MoIHNpemVvZihzdHJ1Y3QgYnRfaW5mbykgKTsKICAgIGlmIChub2lzeSkKICAgICAgZnByaW50ZihzdGRlcnIsIiVzJWQgIiwoY3Vycl9mcmFtZSA9PSAwID8gIj0+IiA6ICIgICIpLCBmcmFtZW5vKTsKCiAgICBpZiAoSVNfU0VMRUNUT1JfU1lTVEVNKHNzKSkgc3MgPSAwOwogICAgaWYgKElTX1NFTEVDVE9SX1NZU1RFTShjcykpIGNzID0gMDsKCiAgICAvKiBmaXJzdCBzdGFjayBmcmFtZSBmcm9tIHJlZ2lzdGVycyAqLwogICAgaWYgKElTX1NFTEVDVE9SXzMyQklUKHNzKSkKICAgIHsKICAgICAgICBmcmFtZXNbMF0uY3MgPSBhZGRyLnNlZyA9IGNzOwogICAgICAgIGZyYW1lc1swXS5laXAgPSBhZGRyLm9mZiA9IEVJUF9yZWcoJkRFQlVHX2NvbnRleHQpOwogICAgICAgIGlmIChub2lzeSkKICAgICAgICAgIGZyYW1lc1swXS5mcmFtZSA9IERFQlVHX1ByaW50QWRkcmVzcyggJmFkZHIsIDMyLCBUUlVFICk7CiAgICAgICAgZWxzZQoJICBERUJVR19GaW5kTmVhcmVzdFN5bWJvbCggJmFkZHIsIFRSVUUsICZmcmFtZXNbMF0uZnJhbWUuc3ltLCAwLCAKCQkJCQkJJmZyYW1lc1swXS5mcmFtZS5saXN0KTsKICAgICAgICBmcmFtZXNbMF0uc3MgPSBhZGRyLnNlZyA9IHNzOwoJZnJhbWVzWzBdLmVicCA9IGFkZHIub2ZmID0gRUJQX3JlZygmREVCVUdfY29udGV4dCk7CiAgICAgICAgaWYgKG5vaXN5KSBmcHJpbnRmKCBzdGRlcnIsICIgKGVicD0lMDh4KVxuIiwgZnJhbWVzWzBdLmVicCApOwogICAgICAgIGlzMTYgPSBGQUxTRTsKICAgIH0gZWxzZSB7CiAgICAgICAgZnJhbWVzWzBdLmNzID0gYWRkci5zZWcgPSBjczsKICAgICAgICBmcmFtZXNbMF0uZWlwID0gYWRkci5vZmYgPSBJUF9yZWcoJkRFQlVHX2NvbnRleHQpOwogICAgICAgIGlmIChub2lzeSkKICAgICAgICAgIGZyYW1lc1swXS5mcmFtZSA9IERFQlVHX1ByaW50QWRkcmVzcyggJmFkZHIsIDE2LCBUUlVFICk7CiAgICAgICAgZWxzZQoJICBERUJVR19GaW5kTmVhcmVzdFN5bWJvbCggJmFkZHIsIFRSVUUsICZmcmFtZXNbMF0uZnJhbWUuc3ltLCAwLCAKCQkJCQkJJmZyYW1lc1swXS5mcmFtZS5saXN0KTsKICAgICAgICBmcmFtZXNbMF0uc3MgPSBhZGRyLnNlZyA9IHNzOwoJZnJhbWVzWzBdLmVicCA9IGFkZHIub2ZmID0gQlBfcmVnKCZERUJVR19jb250ZXh0KTsKICAgICAgICBpZiAobm9pc3kpIGZwcmludGYoIHN0ZGVyciwgIiAoYnA9JTA0eClcbiIsIGZyYW1lc1swXS5lYnAgKTsKICAgICAgICBpczE2ID0gVFJVRTsKICAgIH0KCiAgICBuZXh0X3N3aXRjaCA9IE50Q3VycmVudFRlYigpLT5jdXJfc3RhY2s7CiAgICBpZiAoaXMxNikgewogICAgICBpZiAoSXNCYWRSZWFkUHRyKChTVEFDSzMyRlJBTUUqKW5leHRfc3dpdGNoLCBzaXplb2YoU1RBQ0szMkZSQU1FKSkpIHsKCSBmcHJpbnRmKCBzdGRlcnIsICJCYWQgc3RhY2sgZnJhbWUgJXBcbiIsIChTVEFDSzMyRlJBTUUqKW5leHRfc3dpdGNoICk7CgkgcmV0dXJuOwogICAgICB9CiAgICAgIGN1cl9zd2l0Y2ggPSAoRFdPUkQpKChTVEFDSzMyRlJBTUUqKW5leHRfc3dpdGNoKS0+ZnJhbWUxNjsKICAgICAgc3dfYWRkci5zZWcgPSBTRUxFQ1RPUk9GKGN1cl9zd2l0Y2gpOwogICAgICBzd19hZGRyLm9mZiA9IE9GRlNFVE9GKGN1cl9zd2l0Y2gpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKElzQmFkUmVhZFB0cigoU1RBQ0sxNkZSQU1FKilQVFJfU0VHX1RPX0xJTihuZXh0X3N3aXRjaCksIHNpemVvZihTVEFDSzE2RlJBTUUpKSkgewoJIGZwcmludGYoIHN0ZGVyciwgIkJhZCBzdGFjayBmcmFtZSAlcFxuIiwgKFNUQUNLMTZGUkFNRSopUFRSX1NFR19UT19MSU4obmV4dF9zd2l0Y2gpICk7CgkgcmV0dXJuOwogICAgICB9CiAgICAgIGN1cl9zd2l0Y2ggPSAoRFdPUkQpKChTVEFDSzE2RlJBTUUqKVBUUl9TRUdfVE9fTElOKG5leHRfc3dpdGNoKSktPmZyYW1lMzI7CiAgICAgIHN3X2FkZHIuc2VnID0gc3M7CiAgICAgIHN3X2FkZHIub2ZmID0gY3VyX3N3aXRjaDsKICAgIH0KICAgIGlmIChERUJVR19Jc0JhZFJlYWRQdHIoJnN3X2FkZHIsMSkpIHsKICAgICAgc3dfYWRkci5zZWcgPSAoRFdPUkQpLTE7CiAgICAgIHN3X2FkZHIub2ZmID0gKERXT1JEKS0xOwogICAgfQoKICAgIGZvciAob2sgPSBUUlVFOyBvazspIHsKICAgICAgaWYgKChmcmFtZXNbZnJhbWVub10uc3MgPT0gc3dfYWRkci5zZWcpICYmCiAgICAgICAgICAoZnJhbWVzW2ZyYW1lbm9dLmVicCA+PSBzd19hZGRyLm9mZikpIHsKICAgICAgICAvKiAxNjwtPjMyIHN3aXRjaC4uLgogICAgICAgICAqIHllcywgSSBrbm93IHRoaXMgaXMgY29uZnVzaW5nLCBpdCBnYXZlIG1lIGEgaGVhZGFjaGUgdG9vICovCiAgICAgICAgaWYgKGlzMTYpIHsKICAgICAgICAgIFNUQUNLMzJGUkFNRSAqZnJhbWUgPSAoU1RBQ0szMkZSQU1FKiluZXh0X3N3aXRjaDsKICAgICAgICAgIERCR19BRERSIGNvZGU7CgoJICBpZiAoSXNCYWRSZWFkUHRyKChTVEFDSzMyRlJBTUUqKW5leHRfc3dpdGNoLCBzaXplb2YoU1RBQ0szMkZSQU1FKSkpIHsKCSAgICBmcHJpbnRmKCBzdGRlcnIsICJCYWQgc3RhY2sgZnJhbWUgJXBcbiIsIChTVEFDSzMyRlJBTUUqKW5leHRfc3dpdGNoICk7CgkgICAgcmV0dXJuOwoJICB9CgkgIGNvZGUudHlwZSA9IE5VTEw7CgkgIGNvZGUuc2VnICA9IDA7CgkgIGNvZGUub2ZmICA9IGZyYW1lLT5yZXRhZGRyOwoKICAgICAgICAgIGNzID0gMDsKICAgICAgICAgIGFkZHIuc2VnID0gMDsKICAgICAgICAgIGFkZHIub2ZmID0gZnJhbWUtPmVicDsKICAgICAgICAgIERFQlVHX0ZvcmNlRnJhbWUoICZhZGRyLCAmY29kZSwgKytmcmFtZW5vLCAzMiwgbm9pc3kgKTsKCiAgICAgICAgICBuZXh0X3N3aXRjaCA9IGN1cl9zd2l0Y2g7CgkgIGlmIChJc0JhZFJlYWRQdHIoKFNUQUNLMTZGUkFNRSopUFRSX1NFR19UT19MSU4obmV4dF9zd2l0Y2gpLCBzaXplb2YoU1RBQ0sxNkZSQU1FKSkpIHsKCSAgICBmcHJpbnRmKCBzdGRlcnIsICJCYWQgc3RhY2sgZnJhbWUgJXBcbiIsIChTVEFDSzE2RlJBTUUqKVBUUl9TRUdfVE9fTElOKG5leHRfc3dpdGNoKSApOwoJICAgIHJldHVybjsKCSAgfQogICAgICAgICAgY3VyX3N3aXRjaCA9IChEV09SRCkoKFNUQUNLMTZGUkFNRSopUFRSX1NFR19UT19MSU4obmV4dF9zd2l0Y2gpKS0+ZnJhbWUzMjsKICAgICAgICAgIHN3X2FkZHIuc2VnID0gMDsKICAgICAgICAgIHN3X2FkZHIub2ZmID0gY3VyX3N3aXRjaDsKCiAgICAgICAgICBpczE2ID0gRkFMU0U7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIFNUQUNLMTZGUkFNRSAqZnJhbWUgPSAoU1RBQ0sxNkZSQU1FKilQVFJfU0VHX1RPX0xJTihuZXh0X3N3aXRjaCk7CiAgICAgICAgICBEQkdfQUREUiBjb2RlOwoKCSAgaWYgKElzQmFkUmVhZFB0cigoU1RBQ0sxNkZSQU1FKilQVFJfU0VHX1RPX0xJTihuZXh0X3N3aXRjaCksIHNpemVvZihTVEFDSzE2RlJBTUUpKSkgewoJICAgIGZwcmludGYoIHN0ZGVyciwgIkJhZCBzdGFjayBmcmFtZSAlcFxuIiwgKFNUQUNLMTZGUkFNRSopUFRSX1NFR19UT19MSU4obmV4dF9zd2l0Y2gpICk7CgkgICAgcmV0dXJuOwoJICB9CgoJICBjb2RlLnR5cGUgPSBOVUxMOwoJICBjb2RlLnNlZyAgPSBmcmFtZS0+Y3M7CgkgIGNvZGUub2ZmICA9IGZyYW1lLT5pcDsKCiAgICAgICAgICBjcyA9IGZyYW1lLT5jczsKICAgICAgICAgIGFkZHIuc2VnID0gU0VMRUNUT1JPRihuZXh0X3N3aXRjaCk7CiAgICAgICAgICBhZGRyLm9mZiA9IGZyYW1lLT5icDsKICAgICAgICAgIERFQlVHX0ZvcmNlRnJhbWUoICZhZGRyLCAmY29kZSwgKytmcmFtZW5vLCAxNiwgbm9pc3kgKTsKCiAgICAgICAgICBuZXh0X3N3aXRjaCA9IGN1cl9zd2l0Y2g7CgkgIGlmIChJc0JhZFJlYWRQdHIoKFNUQUNLMzJGUkFNRSopbmV4dF9zd2l0Y2gsIHNpemVvZihTVEFDSzMyRlJBTUUpKSkgewoJICAgIGZwcmludGYoIHN0ZGVyciwgIkJhZCBzdGFjayBmcmFtZSAlcFxuIiwgKFNUQUNLMzJGUkFNRSopbmV4dF9zd2l0Y2ggKTsKCSAgICByZXR1cm47CgkgIH0KICAgICAgICAgIGN1cl9zd2l0Y2ggPSAoRFdPUkQpKChTVEFDSzMyRlJBTUUqKW5leHRfc3dpdGNoKS0+ZnJhbWUxNjsKICAgICAgICAgIHN3X2FkZHIuc2VnID0gU0VMRUNUT1JPRihjdXJfc3dpdGNoKTsKICAgICAgICAgIHN3X2FkZHIub2ZmID0gT0ZGU0VUT0YoY3VyX3N3aXRjaCk7CgogICAgICAgICAgaXMxNiA9IFRSVUU7CiAgICAgICAgfQogICAgICAgIGlmIChERUJVR19Jc0JhZFJlYWRQdHIoJnN3X2FkZHIsMSkpIHsKICAgICAgICAgIHN3X2FkZHIuc2VnID0gKERXT1JEKS0xOwogICAgICAgICAgc3dfYWRkci5vZmYgPSAoRFdPUkQpLTE7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIC8qIG9yZGluYXJ5IHN0YWNrIGZyYW1lICovCiAgICAgICAgb2sgPSBpczE2ID8gREVCVUdfRnJhbWUxNiggJmFkZHIsICZjcywgKytmcmFtZW5vLCBub2lzeSkKICAgICAgICAgICAgICAgICAgOiBERUJVR19GcmFtZTMyKCAmYWRkciwgJmNzLCArK2ZyYW1lbm8sIG5vaXN5KTsKICAgICAgfQogICAgfQogICAgaWYgKG5vaXN5KSBmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBERUJVR19CYWNrVHJhY2UKICoKICogRGlzcGxheSBhIHN0YWNrIGJhY2stdHJhY2UuCiAqLwp2b2lkIERFQlVHX0JhY2tUcmFjZSh2b2lkKQp7CiAgICBERUJVR19Eb0JhY2tUcmFjZSggVFJVRSApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIERFQlVHX1NpbGVudEJhY2tUcmFjZQogKgogKiBEaXNwbGF5IGEgc3RhY2sgYmFjay10cmFjZS4KICovCnZvaWQgREVCVUdfU2lsZW50QmFja1RyYWNlKHZvaWQpCnsKICAgIERFQlVHX0RvQmFja1RyYWNlKCBGQUxTRSApOwp9CgppbnQKREVCVUdfU2V0RnJhbWUoaW50IG5ld2ZyYW1lKQp7CiAgaW50CQlydG4gPSBGQUxTRTsKCiAgY3Vycl9mcmFtZSA9IG5ld2ZyYW1lOwoKICBpZiggY3Vycl9mcmFtZSA+PSBuZnJhbWUgKQogICAgewogICAgICBjdXJyX2ZyYW1lID0gbmZyYW1lIC0gMTsKICAgIH0KCiAgaWYoIGN1cnJfZnJhbWUgPCAwICkKICAgIHsKICAgICAgY3Vycl9mcmFtZSA9IDA7CiAgICB9CgogICBpZiggZnJhbWVzICYmIGZyYW1lc1tjdXJyX2ZyYW1lXS5mcmFtZS5saXN0LnNvdXJjZWZpbGUgIT0gTlVMTCApCiAgICB7CiAgICAgIERFQlVHX0xpc3QoJmZyYW1lc1tjdXJyX2ZyYW1lXS5mcmFtZS5saXN0LCBOVUxMLCAwKTsKICAgIH0KCiAgcnRuID0gVFJVRTsKICByZXR1cm4gKHJ0bik7Cn0KCmludApERUJVR19HZXRDdXJyZW50RnJhbWUoc3RydWN0IG5hbWVfaGFzaCAqKiBuYW1lLCB1bnNpZ25lZCBpbnQgKiBlaXAsCgkJICAgICAgdW5zaWduZWQgaW50ICogZWJwKQp7CiAgLyoKICAgKiBJZiB3ZSBkb24ndCBoYXZlIGEgdmFsaWQgYmFja3RyYWNlLCB0aGVuIGp1c3QgcmV0dXJuLgogICAqLwogIGlmKCBmcmFtZXMgPT0gTlVMTCApCiAgICB7CiAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgLyoKICAgKiBJZiB3ZSBkb24ndCBrbm93IHdoYXQgdGhlIGN1cnJlbnQgZnVuY3Rpb24gaXMsIHRoZW4gd2UgYWxzbyBoYXZlCiAgICogbm90aGluZyB0byByZXBvcnQgaGVyZS4KICAgKi8KICBpZiggZnJhbWVzW2N1cnJfZnJhbWVdLmZyYW1lLnN5bSA9PSBOVUxMICkKICAgIHsKICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAqbmFtZSA9IGZyYW1lc1tjdXJyX2ZyYW1lXS5mcmFtZS5zeW07CiAgKmVpcCA9IGZyYW1lc1tjdXJyX2ZyYW1lXS5laXA7CiAgKmVicCA9IGZyYW1lc1tjdXJyX2ZyYW1lXS5lYnA7CgogIHJldHVybiBUUlVFOwp9Cgo=