LyoKICogRGlyZWN0RHJhdyBoZWxwZXIgZnVuY3Rpb25zCiAqCiAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDAwIE1hcmN1cyBNZWlzc25lcgogKiBDb3B5cmlnaHQgKGMpIDE5OTggTGlvbmVsIFVsbWVyCiAqIENvcHlyaWdodCAoYykgMjAwMCBUcmFuc0dhbWluZyBUZWNobm9sb2dpZXMgSW5jLgogKiBDb3B5cmlnaHQgKGMpIDIwMDYgU3RlZmFuIET2c2luZ2VyCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKCiNkZWZpbmUgTk9OQU1FTEVTU1VOSU9OCgojaW5jbHVkZSAiZGRyYXdfcHJpdmF0ZS5oIgojaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgoKV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwoZGRyYXcpOwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBQaXhlbEZvcm1hdF9XaW5lRDNEdG9ERAogKgogKiBDb252ZXJ0cyBhbiBXSU5FRDNERk9STUFUIHZhbHVlIGludG8gYSBERFBJWEVMRk9STUFUIHN0cnVjdHVyZQogKgogKiBQYXJhbXM6CiAqICBERFBpeGVsRm9ybWF0OiBBZGRyZXNzIG9mIHRoZSBzdHJ1Y3R1cmUgdG8gd3JpdGUgdGhlIHBpeGVsIGZvcm1hdCB0bwogKiAgV2luZUQzREZvcm1hdDogU291cmNlIGZvcm1hdAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQKUGl4ZWxGb3JtYXRfV2luZUQzRHRvREQoRERQSVhFTEZPUk1BVCAqRERQaXhlbEZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzREZPUk1BVCBXaW5lRDNERm9ybWF0KQp7CiAgICBEV09SRCBTaXplID0gRERQaXhlbEZvcm1hdC0+ZHdTaXplOwogICAgVFJBQ0UoIkNvbnZlcnRpbmcgV0lORUQzREZPUk1BVCAlZCB0byBERFJBV1xuIiwgV2luZUQzREZvcm1hdCk7CgogICAgaWYoU2l6ZT09MCkgcmV0dXJuOwoKICAgIG1lbXNldChERFBpeGVsRm9ybWF0LCAweDAwLCBTaXplKTsKICAgIEREUGl4ZWxGb3JtYXQtPmR3U2l6ZSA9IFNpemU7CiAgICBzd2l0Y2goV2luZUQzREZvcm1hdCkKICAgIHsKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfUjhHOEI4OgogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9SR0I7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID0gMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTEuZHdSR0JCaXRDb3VudCA9IDI0OwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd1JCaXRNYXNrID0gMHgwMGZmMDAwMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTMuZHdHQml0TWFzayA9IDB4MDAwMGZmMDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3QkJpdE1hc2sgPSAweDAwMDAwMGZmOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NS5kd1JHQkFscGhhQml0TWFzayA9IDB4MDsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgV0lORUQzREZNVF9BOFI4RzhCODoKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfUkdCIHwgRERQRl9BTFBIQVBJWEVMUzsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd1JHQkJpdENvdW50ID0gMzI7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUyLmR3UkJpdE1hc2sgPSAweDAwZmYwMDAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd0dCaXRNYXNrID0gMHgwMDAwZmYwMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTQuZHdCQml0TWFzayA9IDB4MDAwMDAwZmY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU1LmR3UkdCQWxwaGFCaXRNYXNrID0gMHhmZjAwMDAwMDsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgV0lORUQzREZNVF9YOFI4RzhCODoKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfUkdCOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9IDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUxLmR3UkdCQml0Q291bnQgPSAzMjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTIuZHdSQml0TWFzayA9IDB4MDBmZjAwMDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3R0JpdE1hc2sgPSAweDAwMDBmZjAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NC5kd0JCaXRNYXNrID0gMHgwMDAwMDBmZjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTUuZHdSR0JBbHBoYUJpdE1hc2sgPSAweDA7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfWDhCOEc4Ujg6CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgPSBERFBGX1JHQjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd1JHQkJpdENvdW50ID0gMzI7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUyLmR3UkJpdE1hc2sgPSAweDAwMDAwMGZmOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd0dCaXRNYXNrID0gMHgwMDAwZmYwMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTQuZHdCQml0TWFzayA9IDB4MDBmZjAwMDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU1LmR3UkdCQWxwaGFCaXRNYXNrID0gMHgwOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX1I1RzZCNToKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfUkdCOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9IDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUxLmR3UkdCQml0Q291bnQgPSAxNjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTIuZHdSQml0TWFzayA9IDB4RjgwMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTMuZHdHQml0TWFzayA9IDB4MDdFMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTQuZHdCQml0TWFzayA9IDB4MDAxRjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTUuZHdSR0JBbHBoYUJpdE1hc2sgPSAweDA7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfWDFSNUc1QjU6CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgPSBERFBGX1JHQjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd1JHQkJpdENvdW50ID0gMTY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUyLmR3UkJpdE1hc2sgPSAweDdDMDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3R0JpdE1hc2sgPSAweDAzRTA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3QkJpdE1hc2sgPSAweDAwMUY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU1LmR3UkdCQWxwaGFCaXRNYXNrID0gMHgwOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0ExUjVHNUI1OgogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9SR0IgfCBERFBGX0FMUEhBUElYRUxTOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9IDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUxLmR3UkdCQml0Q291bnQgPSAxNjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTIuZHdSQml0TWFzayA9IDB4N0MwMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTMuZHdHQml0TWFzayA9IDB4MDNFMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTQuZHdCQml0TWFzayA9IDB4MDAxRjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTUuZHdSR0JBbHBoYUJpdE1hc2sgPSAweDgwMDA7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfQTRSNEc0QjQ6CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgPSBERFBGX1JHQiB8IEREUEZfQUxQSEFQSVhFTFM7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID0gMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTEuZHdSR0JCaXRDb3VudCA9IDE2OwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd1JCaXRNYXNrID0gMHgwRjAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd0dCaXRNYXNrID0gMHgwMEYwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NC5kd0JCaXRNYXNrID0gMHgwMDBGOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NS5kd1JHQkFscGhhQml0TWFzayA9IDB4RjAwMDsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgV0lORUQzREZNVF9SM0czQjI6CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgPSBERFBGX1JHQjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd1JHQkJpdENvdW50ID0gODsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTIuZHdSQml0TWFzayA9IDB4RTA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3R0JpdE1hc2sgPSAweDFDOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NC5kd0JCaXRNYXNrID0gMHgwMzsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTUuZHdMdW1pbmFuY2VBbHBoYUJpdE1hc2sgPSAweDA7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfUDg6CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgPSBERFBGX1BBTEVUVEVJTkRFWEVEOCB8IEREUEZfUkdCOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9IDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUxLmR3UkdCQml0Q291bnQgPSA4OwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd1JCaXRNYXNrID0gMHgwMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTMuZHdHQml0TWFzayA9IDB4MDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3QkJpdE1hc2sgPSAweDAwOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0E4OgogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9BTFBIQTsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd0FscGhhQml0RGVwdGggPSA4OwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd1JCaXRNYXNrID0gMHgwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd1pCaXRNYXNrID0gMHgwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NC5kd1N0ZW5jaWxCaXRNYXNrID0gMHgwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NS5kd0x1bWluYW5jZUFscGhhQml0TWFzayA9IDB4MDsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgV0lORUQzREZNVF9BOFIzRzNCMjoKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfUkdCIHwgRERQRl9BTFBIQVBJWEVMUzsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd1JHQkJpdENvdW50ID0gMTY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUyLmR3UkJpdE1hc2sgPSAweDAwRTA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3R0JpdE1hc2sgPSAweDAwMUM7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3QkJpdE1hc2sgPSAweDAwMDM7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU1LmR3UkdCQWxwaGFCaXRNYXNrID0gMHhGMDAwOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX1g0UjRHNEI0OgogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9SR0I7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID0gMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTEuZHdSR0JCaXRDb3VudCA9IDE2OwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd1JCaXRNYXNrID0gMHgwRjAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd0dCaXRNYXNrID0gMHgwMEYwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NC5kd0JCaXRNYXNrID0gMHgwMDBGOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NS5kd1JHQkFscGhhQml0TWFzayA9IDB4MDsKICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICAvKiBIb3cgYXJlIFogYnVmZmVyIGJpdCBkZXB0aCBhbmQgU3RlbmNpbCBidWZmZXIgYml0IGRlcHRoIHJlbGF0ZWQ/CiAgICAgICAgICovCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0QxNjoKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfWkJVRkZFUjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd1pCdWZmZXJCaXREZXB0aCA9IDE2OwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd1N0ZW5jaWxCaXREZXB0aCA9IDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3WkJpdE1hc2sgPSAweDAwMDBGRkZGOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NC5kd1N0ZW5jaWxCaXRNYXNrID0gMHgwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NS5kd1JHQlpCaXRNYXNrID0gMHgwMDAwRkZGRjsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgV0lORUQzREZNVF9EMzI6CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgPSBERFBGX1pCVUZGRVI7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID0gMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTEuZHdaQnVmZmVyQml0RGVwdGggPSAzMjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTIuZHdTdGVuY2lsQml0RGVwdGggPSAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd1pCaXRNYXNrID0gMHhGRkZGRkZGRjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTQuZHdTdGVuY2lsQml0TWFzayA9IDB4MDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTUuZHdSR0JaQml0TWFzayA9IDB4RkZGRkZGRkY7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfRDI0WDRTNDoKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfWkJVRkZFUiB8IEREUEZfU1RFTkNJTEJVRkZFUjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOwogICAgICAgICAgICAvKiBTaG91bGQgSSBzZXQgZHdaQnVmZmVyQml0RGVwdGggdG8gMzIgaGVyZT8gKi8KICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTEuZHdaQnVmZmVyQml0RGVwdGggPSAyNDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTIuZHdTdGVuY2lsQml0RGVwdGggPSA0OwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd1pCaXRNYXNrID0gMHgwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NC5kd1N0ZW5jaWxCaXRNYXNrID0gMHgwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NS5kd1JHQkFscGhhQml0TWFzayA9IDB4MDsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgV0lORUQzREZNVF9EMjRTODoKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfWkJVRkZFUiB8IEREUEZfU1RFTkNJTEJVRkZFUjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOwogICAgICAgICAgICAvKiBTaG91bGQgSSBzZXQgZHdaQnVmZmVyQml0RGVwdGggdG8gMzIgaGVyZT8gKi8KICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTEuZHdaQnVmZmVyQml0RGVwdGggPSAyNDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTIuZHdTdGVuY2lsQml0RGVwdGggPSA4OwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd1pCaXRNYXNrID0gMHgwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NC5kd1N0ZW5jaWxCaXRNYXNrID0gMHgwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NS5kd1JHQkFscGhhQml0TWFzayA9IDB4MDsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgV0lORUQzREZNVF9EMjRYODoKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfWkJVRkZFUjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd1pCdWZmZXJCaXREZXB0aCA9IDI0OwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd1N0ZW5jaWxCaXREZXB0aCA9IDg7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3WkJpdE1hc2sgPSAweDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3U3RlbmNpbEJpdE1hc2sgPSAweDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU1LmR3UkdCQWxwaGFCaXRNYXNrID0gMHgwOwoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0QxNVMxOgogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9aQlVGRkVSIHwgRERQRl9TVEVOQ0lMQlVGRkVSOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9IDA7CiAgICAgICAgICAgIC8qIFNob3VsZCBJIHNldCBkd1pCdWZmZXJCaXREZXB0aCB0byAxNiBoZXJlPyAqLwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd1pCdWZmZXJCaXREZXB0aCA9IDE1OwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd1N0ZW5jaWxCaXREZXB0aCA9IDE7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3WkJpdE1hc2sgPSAweDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3U3RlbmNpbEJpdE1hc2sgPSAweDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU1LmR3UkdCQWxwaGFCaXRNYXNrID0gMHgwOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX1VZVlk6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX1lVWTI6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0RYVDE6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0RYVDI6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0RYVDM6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0RYVDQ6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0RYVDU6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX01VTFRJMl9BUkdCODoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfRzhSOF9HOEI4OgogICAgICAgIGNhc2UgV0lORUQzREZNVF9SOEc4X0I4Rzg6CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgPSBERFBGX0ZPVVJDQzsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSBXaW5lRDNERm9ybWF0OwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgLyogTHVtaW5hbmNlICovCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0w4OgogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9MVU1JTkFOQ0U7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID0gMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTEuZHdMdW1pbmFuY2VCaXRDb3VudCA9IDg7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUyLmR3THVtaW5hbmNlQml0TWFzayA9IDB4ZmY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3QnVtcER2Qml0TWFzayA9IDB4MDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTQuZHdCdW1wTHVtaW5hbmNlQml0TWFzayA9IDB4MDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTUuZHdMdW1pbmFuY2VBbHBoYUJpdE1hc2sgPSAweDA7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfQTRMNDoKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfQUxQSEFQSVhFTFMgfCBERFBGX0xVTUlOQU5DRTsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd0x1bWluYW5jZUJpdENvdW50ID0gNDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTIuZHdMdW1pbmFuY2VCaXRNYXNrID0gMHgwZjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTMuZHdCdW1wRHZCaXRNYXNrID0gMHgwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NC5kd0J1bXBMdW1pbmFuY2VCaXRNYXNrID0gMHgwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NS5kd0x1bWluYW5jZUFscGhhQml0TWFzayA9IDB4ZjA7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfQThMODoKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfQUxQSEFQSVhFTFMgfCBERFBGX0xVTUlOQU5DRTsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd0x1bWluYW5jZUJpdENvdW50ID0gMTY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUyLmR3THVtaW5hbmNlQml0TWFzayA9IDB4MDBmZjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTMuZHdCdW1wRHZCaXRNYXNrID0gMHgwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NC5kd0J1bXBMdW1pbmFuY2VCaXRNYXNrID0gMHgwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NS5kd0x1bWluYW5jZUFscGhhQml0TWFzayA9IDB4ZmYwMDsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIC8qIEJ1bXAgbWFwcGluZyAqLwogICAgICAgIGNhc2UgV0lORUQzREZNVF9WOFU4OgogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9CVU1QRFVEVjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd0J1bXBCaXRDb3VudCA9IDE2OwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd0J1bXBEdUJpdE1hc2sgPSAgICAgICAgIDB4MDAwMDAwZmY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3QnVtcER2Qml0TWFzayA9ICAgICAgICAgMHgwMDAwZmYwMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTQuZHdCdW1wTHVtaW5hbmNlQml0TWFzayA9ICAweDAwMDAwMDAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NS5kd0x1bWluYW5jZUFscGhhQml0TWFzayA9IDB4MDAwMDAwMDA7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfTDZWNVU1OgogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9CVU1QRFVEVjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd0J1bXBCaXRDb3VudCA9IDE2OwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd0J1bXBEdUJpdE1hc2sgPSAgICAgICAgIDB4MDAwMDAwMWY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3QnVtcER2Qml0TWFzayA9ICAgICAgICAgMHgwMDAwMDNlMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTQuZHdCdW1wTHVtaW5hbmNlQml0TWFzayA9ICAweDAwMDBmYzAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NS5kd0x1bWluYW5jZUFscGhhQml0TWFzayA9IDB4MDAwMDAwMDA7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBFUlIoIkNhbid0IHRyYW5zbGF0ZSB0aGlzIFBpeGVsZm9ybWF0ICVkXG4iLCBXaW5lRDNERm9ybWF0KTsKICAgIH0KCiAgICBpZihUUkFDRV9PTihkZHJhdykpIHsKICAgICAgICBUUkFDRSgiUmV0dXJuaW5nOiAiKTsKICAgICAgICBERFJBV19kdW1wX3BpeGVsZm9ybWF0KEREUGl4ZWxGb3JtYXQpOwogICAgICAgIFRSQUNFKCJcbiIpOwogICAgfQp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBQaXhlbEZvcm1hdF9ERDJXaW5lRDNECiAqCiAqIFJlYWRzIGEgRERQSVhFTEZPUk1BVCBzdHJ1Y3R1cmUgYW5kIHJldHVybnMgdGhlIGVxdWFsIFdJTkVEM0RGT1JNQVQKICoKICogUGFyYW1zOgogKiAgRERQaXhlbEZvcm1hdDogVGhlIHNvdXJjZSBmb3JtYXQKICoKICogUmV0dXJuczoKICogIFRoZSBXSU5FRDNERk9STUFUIGVxdWFsIHRvIHRoZSBERHJhdyBmb3JtYXQKICogIFdJTkVEM0RGTVRfVU5LTk9XTiBpZiBhIG1hdGNoaW5nIGZvcm1hdCB3YXNuJ3QgZm91bmQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpXSU5FRDNERk9STUFUClBpeGVsRm9ybWF0X0REMldpbmVEM0QoY29uc3QgRERQSVhFTEZPUk1BVCAqRERQaXhlbEZvcm1hdCkKewogICAgVFJBQ0UoIkNvbnZlcnQgYSBEaXJlY3REcmF3IFBpeGVsZm9ybWF0IHRvIGEgV2luZUQzRCBQaXhlbGZvcm1hdFxuIik7ICAgIAogICAgaWYoVFJBQ0VfT04oZGRyYXcpKQogICAgewogICAgICAgIEREUkFXX2R1bXBfcGl4ZWxmb3JtYXQoRERQaXhlbEZvcm1hdCk7CiAgICAgICAgVFJBQ0UoIlxuIik7CiAgICB9CgogICAgaWYoRERQaXhlbEZvcm1hdC0+ZHdGbGFncyAmIEREUEZfUEFMRVRURUlOREVYRUQ4KQogICAgewogICAgICAgIHJldHVybiBXSU5FRDNERk1UX1A4OwogICAgfQogICAgZWxzZSBpZihERFBpeGVsRm9ybWF0LT5kd0ZsYWdzICYgKEREUEZfUEFMRVRURUlOREVYRUQxIHwgRERQRl9QQUxFVFRFSU5ERVhFRDIgfCBERFBGX1BBTEVUVEVJTkRFWEVENCkgKQogICAgewogICAgICAgIEZJWE1FKCJERFBGX1BBTEVUVEVJTkRFWEVEMSB0byBERFBGX1BBTEVUVEVJTkRFWEVENCBhcmUgbm90IHN1cHBvcnRlZCBieSBXaW5lRDNEICh5ZXQpLiBSZXR1cm5pbmcgV0lORUQzREZNVF9QOFxuIik7CiAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfUDg7CiAgICB9CiAgICBlbHNlIGlmKEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgJiBERFBGX1JHQikKICAgIHsKICAgICAgICBzd2l0Y2goRERQaXhlbEZvcm1hdC0+dTEuZHdSR0JCaXRDb3VudCkKICAgICAgICB7CiAgICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgdGhlIG9ubHkgZm9ybWF0IHRoYXQgY2FuIG1hdGNoIGhlcmUgKi8KICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX1IzRzNCMjsKCiAgICAgICAgICAgIGNhc2UgMTY6CiAgICAgICAgICAgICAgICAvKiBSZWFkIHRoZSBDb2xvciBtYXNrcyAqLwogICAgICAgICAgICAgICAgaWYoIChERFBpeGVsRm9ybWF0LT51Mi5kd1JCaXRNYXNrID09IDB4RjgwMCkgJiYKICAgICAgICAgICAgICAgICAgICAoRERQaXhlbEZvcm1hdC0+dTMuZHdHQml0TWFzayA9PSAweDA3RTApICYmCiAgICAgICAgICAgICAgICAgICAgKEREUGl4ZWxGb3JtYXQtPnU0LmR3QkJpdE1hc2sgPT0gMHgwMDFGKSApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfUjVHNkI1OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmKCAoRERQaXhlbEZvcm1hdC0+dTIuZHdSQml0TWFzayA9PSAweDdDMDApICYmCiAgICAgICAgICAgICAgICAgICAgKEREUGl4ZWxGb3JtYXQtPnUzLmR3R0JpdE1hc2sgPT0gMHgwM0UwKSAmJgogICAgICAgICAgICAgICAgICAgIChERFBpeGVsRm9ybWF0LT51NC5kd0JCaXRNYXNrID09IDB4MDAxRikgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmKCAoRERQaXhlbEZvcm1hdC0+ZHdGbGFncyAmIEREUEZfQUxQSEFQSVhFTFMpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIChERFBpeGVsRm9ybWF0LT51NS5kd1JHQkFscGhhQml0TWFzayA9PSAweDgwMDApKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9BMVI1RzVCNTsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX1gxUjVHNUI1OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmKCAoRERQaXhlbEZvcm1hdC0+dTIuZHdSQml0TWFzayA9PSAweDBGMDApICYmCiAgICAgICAgICAgICAgICAgICAgKEREUGl4ZWxGb3JtYXQtPnUzLmR3R0JpdE1hc2sgPT0gMHgwMEYwKSAmJgogICAgICAgICAgICAgICAgICAgIChERFBpeGVsRm9ybWF0LT51NC5kd0JCaXRNYXNrID09IDB4MDAwRikgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmKCAoRERQaXhlbEZvcm1hdC0+ZHdGbGFncyAmIEREUEZfQUxQSEFQSVhFTFMpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIChERFBpeGVsRm9ybWF0LT51NS5kd1JHQkFscGhhQml0TWFzayA9PSAweEYwMDApKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9BNFI0RzRCNDsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX1g0UjRHNEI0OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmKCAoRERQaXhlbEZvcm1hdC0+ZHdGbGFncyAmIEREUEZfQUxQSEFQSVhFTFMpICYmCiAgICAgICAgICAgICAgICAgICAgKEREUGl4ZWxGb3JtYXQtPnU1LmR3UkdCQWxwaGFCaXRNYXNrID09IDB4RkYwMCkgJiYKICAgICAgICAgICAgICAgICAgICAoRERQaXhlbEZvcm1hdC0+dTIuZHdSQml0TWFzayA9PSAweDAwRTApICYmCiAgICAgICAgICAgICAgICAgICAgKEREUGl4ZWxGb3JtYXQtPnUzLmR3R0JpdE1hc2sgPT0gMHgwMDFDKSAmJgogICAgICAgICAgICAgICAgICAgIChERFBpeGVsRm9ybWF0LT51NC5kd0JCaXRNYXNrID09IDB4MDAwMykgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX0E4UjNHM0IyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgRVJSKCIxNiBiaXQgUkdCIFBpeGVsIGZvcm1hdCBkb2VzIG5vdCBtYXRjaFxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9VTktOT1dOOwoKICAgICAgICAgICAgY2FzZSAyNDoKICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX1I4RzhCODsKCiAgICAgICAgICAgIGNhc2UgMzI6CiAgICAgICAgICAgICAgICAvKiBSZWFkIHRoZSBDb2xvciBtYXNrcyAqLwogICAgICAgICAgICAgICAgaWYoIChERFBpeGVsRm9ybWF0LT51Mi5kd1JCaXRNYXNrID09IDB4MDBGRjAwMDApICYmCiAgICAgICAgICAgICAgICAgICAgKEREUGl4ZWxGb3JtYXQtPnUzLmR3R0JpdE1hc2sgPT0gMHgwMDAwRkYwMCkgJiYKICAgICAgICAgICAgICAgICAgICAoRERQaXhlbEZvcm1hdC0+dTQuZHdCQml0TWFzayA9PSAweDAwMDAwMEZGKSApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYoIChERFBpeGVsRm9ybWF0LT5kd0ZsYWdzICYgRERQRl9BTFBIQVBJWEVMUykgJiYKICAgICAgICAgICAgICAgICAgICAgICAgKEREUGl4ZWxGb3JtYXQtPnU1LmR3UkdCQWxwaGFCaXRNYXNrID09IDB4RkYwMDAwMDApKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9BOFI4RzhCODsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX1g4UjhHOEI4OwoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIEVSUigiMzIgYml0IFJHQiBwaXhlbCBmb3JtYXQgZG9lcyBub3QgbWF0Y2hcbiIpOwoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIEVSUigiSW52YWxpZCBkd1JHQkJpdENvdW50IGluIFBpeGVsZm9ybWF0IHN0cnVjdHVyZVxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9VTktOT1dOOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYoIChERFBpeGVsRm9ybWF0LT5kd0ZsYWdzICYgRERQRl9BTFBIQSkgKQogICAgewogICAgICAgIC8qIEFscGhhIG9ubHkgUGl4ZWxmb3JtYXQgKi8KICAgICAgICBzd2l0Y2goRERQaXhlbEZvcm1hdC0+dTEuZHdBbHBoYUJpdERlcHRoKQogICAgICAgIHsKICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgIEVSUigiVW5zdXBwb3J0ZWQgQWxwaGEtT25seSBiaXQgZGVwdGggMHgleFxuIiwgRERQaXhlbEZvcm1hdC0+dTEuZHdBbHBoYUJpdERlcHRoKTsKICAgICAgICAgICAgY2FzZSA4OgogICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfQTg7CgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgRVJSKCJJbnZhbGlkIEFscGhhQml0RGVwdGggaW4gQWxwaGEtT25seSBQaXhlbGZvcm1hdFxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9VTktOT1dOOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYoRERQaXhlbEZvcm1hdC0+ZHdGbGFncyAmIEREUEZfTFVNSU5BTkNFKQogICAgewogICAgICAgIC8qIEx1bWluYW5jZS1vbmx5IG9yIGx1bWluYW5jZS1hbHBoYSAqLwogICAgICAgIGlmKEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgJiBERFBGX0FMUEhBUElYRUxTKQogICAgICAgIHsKICAgICAgICAgICAgLyogTHVtaW5hbmNlIHdpdGggQWxwaGEgKi8KICAgICAgICAgICAgc3dpdGNoKEREUGl4ZWxGb3JtYXQtPnUxLmR3THVtaW5hbmNlQml0Q291bnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICBpZihERFBpeGVsRm9ybWF0LT51MS5kd0FscGhhQml0RGVwdGggPT0gNCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfQTRMNDsKICAgICAgICAgICAgICAgICAgICBFUlIoIlVua25vd24gQWxwaGEgLyBMdW1pbmFuY2UgYml0IGRlcHRoIGNvbWJpbmF0aW9uXG4iKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9VTktOT1dOOwoKICAgICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgICAgICBFUlIoIkEgbHVtaW5hbmNlIFBpeGVsZm9ybWF0IHNob3VsZG4ndCBoYXZlIDYgbHVtaW5hbmNlIGJpdHMuIFJldHVybmluZyBEM0RGTVRfTDZWNVU1IGZvciBub3chIVxuIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfTDZWNVU1OwoKICAgICAgICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgICAgICAgICBpZihERFBpeGVsRm9ybWF0LT51MS5kd0FscGhhQml0RGVwdGggPT0gOCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfQThMODsKICAgICAgICAgICAgICAgICAgICBFUlIoIlVua25vd24gQWxwaGEgLyBMdW1pbmNhc2UgYml0IGRlcHRoIGNvbWJpbmF0aW9uXG4iKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9VTktOT1dOOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIC8qIEx1bWluYW5jZS1vbmx5ICovCiAgICAgICAgICAgIHN3aXRjaChERFBpeGVsRm9ybWF0LT51MS5kd0x1bWluYW5jZUJpdENvdW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICAgICAgICAgRVJSKCJBIGx1bWluYW5jZSBQaXhlbGZvcm1hdCBzaG91bGRuJ3QgaGF2ZSA2IGx1bWluYW5jZSBiaXRzLiBSZXR1cm5pbmcgRDNERk1UX0w2VjVVNSBmb3Igbm93ISFcbiIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX0w2VjVVNTsKCiAgICAgICAgICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfTDg7CgogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICBFUlIoIlVua25vd24gbHVtaW5hbmNlLW9ubHkgYml0IGRlcHRoIDB4JXhcbiIsIEREUGl4ZWxGb3JtYXQtPnUxLmR3THVtaW5hbmNlQml0Q291bnQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX1VOS05PV047CiAgICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSBpZihERFBpeGVsRm9ybWF0LT5kd0ZsYWdzICYgRERQRl9aQlVGRkVSKQogICAgewogICAgICAgIC8qIFogYnVmZmVyICovCiAgICAgICAgaWYoRERQaXhlbEZvcm1hdC0+ZHdGbGFncyAmIEREUEZfU1RFTkNJTEJVRkZFUikKICAgICAgICB7CiAgICAgICAgICAgIHN3aXRjaChERFBpeGVsRm9ybWF0LT51MS5kd1pCdWZmZXJCaXREZXB0aCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FzZSA4OgogICAgICAgICAgICAgICAgICAgIEVSUigiOCBCaXRzIForU3RlbmNpbCBidWZmZXIgcGl4ZWxmb3JtYXQgaXMgbm90IHN1cHBvcnRlZC4gUmV0dXJuaW5nIFdJTkVEM0RGTVRfVU5LTk9XTlxuIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfVU5LTk9XTjsKCiAgICAgICAgICAgICAgICBjYXNlIDE1OgogICAgICAgICAgICAgICAgY2FzZSAxNjoKICAgICAgICAgICAgICAgICAgICBpZihERFBpeGVsRm9ybWF0LT51Mi5kd1N0ZW5jaWxCaXREZXB0aCA9PSAxKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9EMTVTMTsKCiAgICAgICAgICAgICAgICAgICAgRVJSKCJEb24ndCBrbm93IGhvdyB0byBoYW5kbGUgYSAxNiBiaXQgWiBidWZmZXIgd2l0aCAlZCBiaXQgc3RlbmNpbCBidWZmZXIgcGl4ZWxmb3JtYXRcbiIsIEREUGl4ZWxGb3JtYXQtPnUyLmR3U3RlbmNpbEJpdERlcHRoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9VTktOT1dOOwoKICAgICAgICAgICAgICAgIGNhc2UgMjQ6CiAgICAgICAgICAgICAgICAgICAgRVJSKCJEb24ndCBrbm93IGhvdyB0byBoYW5kbGUgYSAyNCBiaXQgZGVwdGggYnVmZmVyIHdpdGggc3RlbmNpbCBiaXRzXG4iKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9EMjRTODsKCiAgICAgICAgICAgICAgICBjYXNlIDMyOgogICAgICAgICAgICAgICAgICAgIGlmKEREUGl4ZWxGb3JtYXQtPnUyLmR3U3RlbmNpbEJpdERlcHRoID09IDgpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX0QyNFM4OwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfRDI0WDRTNDsKCiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIEVSUigiVW5rbm93biBaIGJ1ZmZlciBkZXB0aCAlZFxuIiwgRERQaXhlbEZvcm1hdC0+dTEuZHdaQnVmZmVyQml0RGVwdGgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX1VOS05PV047CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgc3dpdGNoKEREUGl4ZWxGb3JtYXQtPnUxLmR3WkJ1ZmZlckJpdERlcHRoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgICAgICAgICAgRVJSKCI4IEJpdCBaIGJ1ZmZlcnMgYXJlIG5vdCBzdXBwb3J0ZWQuIFRyeWluZyBhIDE2IEJpdCBvbmVcbiIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX0QxNjsKCiAgICAgICAgICAgICAgICBjYXNlIDE2OgogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX0QxNjsKCiAgICAgICAgICAgICAgICBjYXNlIDI0OgogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX0QyNFg4OwoKICAgICAgICAgICAgICAgIGNhc2UgMzI6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfRDMyOwoKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgRVJSKCJVbnN1cHBvcnRlZCBaIGJ1ZmZlciBkZXB0aCAlZFxuIiwgRERQaXhlbEZvcm1hdC0+dTEuZHdaQnVmZmVyQml0RGVwdGgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX1VOS05PV047CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmKEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgJiBERFBGX0ZPVVJDQykKICAgIHsKICAgICAgICBpZihERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9PSBNQUtFRk9VUkNDKCdVJywgJ1knLCAnVicsICdZJykpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9VWVZZOwogICAgICAgIH0KICAgICAgICBpZihERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9PSBNQUtFRk9VUkNDKCdZJywgJ1UnLCAnWScsICcyJykpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9ZVVkyOwogICAgICAgIH0KICAgICAgICBpZihERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9PSBNQUtFRk9VUkNDKCdEJywgJ1gnLCAnVCcsICcxJykpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9EWFQxOwogICAgICAgIH0KICAgICAgICBpZihERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9PSBNQUtFRk9VUkNDKCdEJywgJ1gnLCAnVCcsICcyJykpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9EWFQyOwogICAgICAgIH0KICAgICAgICBpZihERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9PSBNQUtFRk9VUkNDKCdEJywgJ1gnLCAnVCcsICczJykpCiAgICAgICAgewogICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX0RYVDM7CiAgICAgICAgfQogICAgICAgIGlmKEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID09IE1BS0VGT1VSQ0MoJ0QnLCAnWCcsICdUJywgJzQnKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX0RYVDQ7CiAgICAgICAgfQogICAgICAgIGlmKEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID09IE1BS0VGT1VSQ0MoJ0QnLCAnWCcsICdUJywgJzUnKSkKICAgICAgICB7CgkgICAgcmV0dXJuIFdJTkVEM0RGTVRfRFhUNTsKICAgICAgICB9CiAgICAgICAgaWYoRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPT0gTUFLRUZPVVJDQygnRycsICdSJywgJ0cnLCAnQicpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfRzhSOF9HOEI4OwogICAgICAgIH0KICAgICAgICBpZihERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9PSBNQUtFRk9VUkNDKCdSJywgJ0cnLCAnQicsICdHJykpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9SOEc4X0I4Rzg7CiAgICAgICAgfQogICAgICAgIHJldHVybiBXSU5FRDNERk1UX1VOS05PV047ICAvKiBBYnVzZSB0aGlzIGFzIGFuIGVycm9yIHZhbHVlICovCiAgICB9CiAgICBlbHNlIGlmKEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgJiBERFBGX0JVTVBEVURWKQogICAgewogICAgICAgIGlmKCAoRERQaXhlbEZvcm1hdC0+dTEuZHdCdW1wQml0Q291bnQgICAgICAgICA9PSAxNiAgICAgICAgKSAmJgogICAgICAgICAgICAoRERQaXhlbEZvcm1hdC0+dTIuZHdCdW1wRHVCaXRNYXNrICAgICAgICA9PSAweDAwMDAwMGZmKSAmJgogICAgICAgICAgICAoRERQaXhlbEZvcm1hdC0+dTMuZHdCdW1wRHZCaXRNYXNrICAgICAgICA9PSAweDAwMDBmZjAwKSAmJgogICAgICAgICAgICAoRERQaXhlbEZvcm1hdC0+dTQuZHdCdW1wTHVtaW5hbmNlQml0TWFzayA9PSAweDAwMDAwMDAwKSApCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9WOFU4OwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICggKEREUGl4ZWxGb3JtYXQtPnUxLmR3QnVtcEJpdENvdW50ICAgICAgICAgPT0gMTYgICAgICAgICkgJiYKICAgICAgICAgICAgICAgICAgKEREUGl4ZWxGb3JtYXQtPnUyLmR3QnVtcER1Qml0TWFzayAgICAgICAgPT0gMHgwMDAwMDAxZikgJiYKICAgICAgICAgICAgICAgICAgKEREUGl4ZWxGb3JtYXQtPnUzLmR3QnVtcER2Qml0TWFzayAgICAgICAgPT0gMHgwMDAwMDNlMCkgJiYKICAgICAgICAgICAgICAgICAgKEREUGl4ZWxGb3JtYXQtPnU0LmR3QnVtcEx1bWluYW5jZUJpdE1hc2sgPT0gMHgwMDAwZmMwMCkgKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfTDZWNVU1OwogICAgICAgIH0KICAgIH0KCiAgICBFUlIoIlVua25vd24gUGl4ZWxmb3JtYXQhXG4iKTsKICAgIHJldHVybiBXSU5FRDNERk1UX1VOS05PV047Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBWYXJpb3VzIGR1bXBpbmcgZnVuY3Rpb25zLgogKgogKiBUaGV5IHdyaXRlIHRoZSBjb250ZW50cyBvZiBhIHNwZWNpZmljIGZ1bmN0aW9uIHRvIGEgRFBSSU5URi4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZApERFJBV19kdW1wX0RXT1JEKGNvbnN0IHZvaWQgKmluKQp7CiAgICBEUFJJTlRGKCIlZCIsICooKGNvbnN0IERXT1JEICopIGluKSk7Cn0Kc3RhdGljIHZvaWQKRERSQVdfZHVtcF9QVFIoY29uc3Qgdm9pZCAqaW4pCnsKICAgIERQUklOVEYoIiVwIiwgKigoY29uc3Qgdm9pZCAqIGNvbnN0KikgaW4pKTsKfQpzdGF0aWMgdm9pZApERFJBV19kdW1wX0REQ09MT1JLRVkoY29uc3QgRERDT0xPUktFWSAqZGRjaykKewogICAgRFBSSU5URigiIExvdyA6ICVkICAtIEhpZ2ggOiAlZCIsIGRkY2stPmR3Q29sb3JTcGFjZUxvd1ZhbHVlLCBkZGNrLT5kd0NvbG9yU3BhY2VIaWdoVmFsdWUpOwp9CgojZGVmaW5lIEREUkFXX2R1bXBfZmxhZ3MoZmxhZ3MsbmFtZXMsbnVtX25hbWVzKSBERFJBV19kdW1wX2ZsYWdzXyhmbGFncywgbmFtZXMsIG51bV9uYW1lcywgMSkKc3RhdGljIHZvaWQKRERSQVdfZHVtcF9mbGFnc18oRFdPUkQgZmxhZ3MsCiAgICAgICAgICAgICAgICAgIGNvbnN0IGZsYWdfaW5mbyogbmFtZXMsCiAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1fbmFtZXMsCiAgICAgICAgICAgICAgICAgIGludCBuZXdsaW5lKQp7CiAgICB1bnNpZ25lZCBpbnQJaTsKCiAgICBmb3IgKGk9MDsgaSA8IG51bV9uYW1lczsgaSsrKQogICAgICAgIGlmICgoZmxhZ3MgJiBuYW1lc1tpXS52YWwpIHx8ICAgICAgLyogc3RhbmRhcmQgZmxhZyB2YWx1ZSAqLwogICAgICAgICAgICAoKCFmbGFncykgJiYgKCFuYW1lc1tpXS52YWwpKSkgLyogemVybyB2YWx1ZSBvbmx5ICovCiAgICAgICAgICAgIERQUklOVEYoIiVzICIsIG5hbWVzW2ldLm5hbWUpOwoKICAgIGlmIChuZXdsaW5lKQogICAgICAgIERQUklOVEYoIlxuIik7Cn0KCnZvaWQgRERSQVdfZHVtcF9ERFNDQVBTMihjb25zdCBERFNDQVBTMiAqaW4pCnsKICAgIHN0YXRpYyBjb25zdCBmbGFnX2luZm8gZmxhZ3NbXSA9IHsKICAgICAgICBGRShERFNDQVBTX1JFU0VSVkVEMSksCiAgICAgICAgRkUoRERTQ0FQU19BTFBIQSksCiAgICAgICAgRkUoRERTQ0FQU19CQUNLQlVGRkVSKSwKICAgICAgICBGRShERFNDQVBTX0NPTVBMRVgpLAogICAgICAgIEZFKEREU0NBUFNfRkxJUCksCiAgICAgICAgRkUoRERTQ0FQU19GUk9OVEJVRkZFUiksCiAgICAgICAgRkUoRERTQ0FQU19PRkZTQ1JFRU5QTEFJTiksCiAgICAgICAgRkUoRERTQ0FQU19PVkVSTEFZKSwKICAgICAgICBGRShERFNDQVBTX1BBTEVUVEUpLAogICAgICAgIEZFKEREU0NBUFNfUFJJTUFSWVNVUkZBQ0UpLAogICAgICAgIEZFKEREU0NBUFNfUFJJTUFSWVNVUkZBQ0VMRUZUKSwKICAgICAgICBGRShERFNDQVBTX1NZU1RFTU1FTU9SWSksCiAgICAgICAgRkUoRERTQ0FQU19URVhUVVJFKSwKICAgICAgICBGRShERFNDQVBTXzNEREVWSUNFKSwKICAgICAgICBGRShERFNDQVBTX1ZJREVPTUVNT1JZKSwKICAgICAgICBGRShERFNDQVBTX1ZJU0lCTEUpLAogICAgICAgIEZFKEREU0NBUFNfV1JJVEVPTkxZKSwKICAgICAgICBGRShERFNDQVBTX1pCVUZGRVIpLAogICAgICAgIEZFKEREU0NBUFNfT1dOREMpLAogICAgICAgIEZFKEREU0NBUFNfTElWRVZJREVPKSwKICAgICAgICBGRShERFNDQVBTX0hXQ09ERUMpLAogICAgICAgIEZFKEREU0NBUFNfTU9ERVgpLAogICAgICAgIEZFKEREU0NBUFNfTUlQTUFQKSwKICAgICAgICBGRShERFNDQVBTX1JFU0VSVkVEMiksCiAgICAgICAgRkUoRERTQ0FQU19BTExPQ09OTE9BRCksCiAgICAgICAgRkUoRERTQ0FQU19WSURFT1BPUlQpLAogICAgICAgIEZFKEREU0NBUFNfTE9DQUxWSURNRU0pLAogICAgICAgIEZFKEREU0NBUFNfTk9OTE9DQUxWSURNRU0pLAogICAgICAgIEZFKEREU0NBUFNfU1RBTkRBUkRWR0FNT0RFKSwKICAgICAgICBGRShERFNDQVBTX09QVElNSVpFRCkKICAgIH07CiAgICBzdGF0aWMgY29uc3QgZmxhZ19pbmZvIGZsYWdzMltdID0gewogICAgICAgIEZFKEREU0NBUFMyX0hBUkRXQVJFREVJTlRFUkxBQ0UpLAogICAgICAgIEZFKEREU0NBUFMyX0hJTlREWU5BTUlDKSwKICAgICAgICBGRShERFNDQVBTMl9ISU5UU1RBVElDKSwKICAgICAgICBGRShERFNDQVBTMl9URVhUVVJFTUFOQUdFKSwKICAgICAgICBGRShERFNDQVBTMl9SRVNFUlZFRDEpLAogICAgICAgIEZFKEREU0NBUFMyX1JFU0VSVkVEMiksCiAgICAgICAgRkUoRERTQ0FQUzJfT1BBUVVFKSwKICAgICAgICBGRShERFNDQVBTMl9ISU5UQU5USUFMSUFTSU5HKSwKICAgICAgICBGRShERFNDQVBTMl9DVUJFTUFQKSwKICAgICAgICBGRShERFNDQVBTMl9DVUJFTUFQX1BPU0lUSVZFWCksCiAgICAgICAgRkUoRERTQ0FQUzJfQ1VCRU1BUF9ORUdBVElWRVgpLAogICAgICAgIEZFKEREU0NBUFMyX0NVQkVNQVBfUE9TSVRJVkVZKSwKICAgICAgICBGRShERFNDQVBTMl9DVUJFTUFQX05FR0FUSVZFWSksCiAgICAgICAgRkUoRERTQ0FQUzJfQ1VCRU1BUF9QT1NJVElWRVopLAogICAgICAgIEZFKEREU0NBUFMyX0NVQkVNQVBfTkVHQVRJVkVaKSwKICAgICAgICBGRShERFNDQVBTMl9NSVBNQVBTVUJMRVZFTCksCiAgICAgICAgRkUoRERTQ0FQUzJfRDNEVEVYVFVSRU1BTkFHRSksCiAgICAgICAgRkUoRERTQ0FQUzJfRE9OT1RQRVJTSVNUKSwKICAgICAgICBGRShERFNDQVBTMl9TVEVSRU9TVVJGQUNFTEVGVCkKICAgIH07CgogICAgRERSQVdfZHVtcF9mbGFnc18oaW4tPmR3Q2FwcywgZmxhZ3MsIHNpemVvZihmbGFncykvc2l6ZW9mKGZsYWdzWzBdKSwgMCk7CiAgICBERFJBV19kdW1wX2ZsYWdzXyhpbi0+ZHdDYXBzMiwgZmxhZ3MyLCBzaXplb2YoZmxhZ3MyKS9zaXplb2YoZmxhZ3MyWzBdKSwgMCk7Cn0KCnZvaWQKRERSQVdfZHVtcF9ERFNDQVBTKGNvbnN0IEREU0NBUFMgKmluKQp7CiAgICBERFNDQVBTMiBpbl9iaXM7CgogICAgaW5fYmlzLmR3Q2FwcyA9IGluLT5kd0NhcHM7CiAgICBpbl9iaXMuZHdDYXBzMiA9IDA7CiAgICBpbl9iaXMuZHdDYXBzMyA9IDA7CiAgICBpbl9iaXMuZHdDYXBzNCA9IDA7CgogICAgRERSQVdfZHVtcF9ERFNDQVBTMigmaW5fYmlzKTsKfQoKc3RhdGljIHZvaWQKRERSQVdfZHVtcF9waXhlbGZvcm1hdF9mbGFnKERXT1JEIGZsYWdtYXNrKQp7CiAgICBzdGF0aWMgY29uc3QgZmxhZ19pbmZvIGZsYWdzW10gPQogICAgICAgIHsKICAgICAgICAgICAgRkUoRERQRl9BTFBIQVBJWEVMUyksCiAgICAgICAgICAgIEZFKEREUEZfQUxQSEEpLAogICAgICAgICAgICBGRShERFBGX0ZPVVJDQyksCiAgICAgICAgICAgIEZFKEREUEZfUEFMRVRURUlOREVYRUQ0KSwKICAgICAgICAgICAgRkUoRERQRl9QQUxFVFRFSU5ERVhFRFRPOCksCiAgICAgICAgICAgIEZFKEREUEZfUEFMRVRURUlOREVYRUQ4KSwKICAgICAgICAgICAgRkUoRERQRl9SR0IpLAogICAgICAgICAgICBGRShERFBGX0NPTVBSRVNTRUQpLAogICAgICAgICAgICBGRShERFBGX1JHQlRPWVVWKSwKICAgICAgICAgICAgRkUoRERQRl9ZVVYpLAogICAgICAgICAgICBGRShERFBGX1pCVUZGRVIpLAogICAgICAgICAgICBGRShERFBGX1BBTEVUVEVJTkRFWEVEMSksCiAgICAgICAgICAgIEZFKEREUEZfUEFMRVRURUlOREVYRUQyKSwKICAgICAgICAgICAgRkUoRERQRl9aUElYRUxTKQogICAgfTsKCiAgICBERFJBV19kdW1wX2ZsYWdzXyhmbGFnbWFzaywgZmxhZ3MsIHNpemVvZihmbGFncykvc2l6ZW9mKGZsYWdzWzBdKSwgMCk7Cn0KCnN0YXRpYyB2b2lkCkREUkFXX2R1bXBfbWVtYmVycyhEV09SRCBmbGFncywKICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGRhdGEsCiAgICAgICAgICAgICAgICAgICBjb25zdCBtZW1iZXJfaW5mbyogbWVtcywKICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1fbWVtcykKewogICAgdW5zaWduZWQgaW50IGk7CgogICAgZm9yIChpPTA7IGkgPCBudW1fbWVtczsgaSsrKQogICAgewogICAgICAgIGlmIChtZW1zW2ldLnZhbCAmIGZsYWdzKQogICAgICAgIHsKICAgICAgICAgICAgRFBSSU5URigiIC0gJXMgOiAiLCBtZW1zW2ldLm5hbWUpOwogICAgICAgICAgICBtZW1zW2ldLmZ1bmMoKGNvbnN0IGNoYXIgKilkYXRhICsgbWVtc1tpXS5vZmZzZXQpOwogICAgICAgICAgICBEUFJJTlRGKCJcbiIpOwogICAgICAgIH0KICAgIH0KfQoKdm9pZApERFJBV19kdW1wX3BpeGVsZm9ybWF0KGNvbnN0IEREUElYRUxGT1JNQVQgKnBmKQp7CiAgICBEUFJJTlRGKCIoICIpOwogICAgRERSQVdfZHVtcF9waXhlbGZvcm1hdF9mbGFnKHBmLT5kd0ZsYWdzKTsKICAgIGlmIChwZi0+ZHdGbGFncyAmIEREUEZfRk9VUkNDKQogICAgewogICAgICAgIERQUklOVEYoIiwgZHdGb3VyQ0MgY29kZSAnJWMlYyVjJWMnICgweCUwOHgpIC0gJWQgYml0cyBwZXIgcGl4ZWwiLAogICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpKCBwZi0+ZHdGb3VyQ0MgICAgICYweGZmKSwKICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKSgocGYtPmR3Rm91ckNDPj4gOCkmMHhmZiksCiAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhcikoKHBmLT5kd0ZvdXJDQz4+MTYpJjB4ZmYpLAogICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpKChwZi0+ZHdGb3VyQ0M+PjI0KSYweGZmKSwKICAgICAgICAgICAgICAgIHBmLT5kd0ZvdXJDQywKICAgICAgICAgICAgICAgIHBmLT51MS5kd1lVVkJpdENvdW50CiAgICAgICAgKTsKICAgIH0KICAgIGlmIChwZi0+ZHdGbGFncyAmIEREUEZfUkdCKQogICAgewogICAgICAgIGNvbnN0IGNoYXIgKmNtZDsKICAgICAgICBEUFJJTlRGKCIsIFJHQiBiaXRzOiAlZCwgIiwgcGYtPnUxLmR3UkdCQml0Q291bnQpOwogICAgICAgIHN3aXRjaCAocGYtPnUxLmR3UkdCQml0Q291bnQpCiAgICAgICAgewogICAgICAgIGNhc2UgNDogY21kID0gIiUxbHgiOyBicmVhazsKICAgICAgICBjYXNlIDg6IGNtZCA9ICIlMDJseCI7IGJyZWFrOwogICAgICAgIGNhc2UgMTY6IGNtZCA9ICIlMDRseCI7IGJyZWFrOwogICAgICAgIGNhc2UgMjQ6IGNtZCA9ICIlMDZseCI7IGJyZWFrOwogICAgICAgIGNhc2UgMzI6IGNtZCA9ICIlMDhseCI7IGJyZWFrOwogICAgICAgIGRlZmF1bHQ6IEVSUigiVW5leHBlY3RlZCBiaXQgZGVwdGggIVxuIik7IGNtZCA9ICIlZCI7IGJyZWFrOwogICAgICAgIH0KICAgICAgICBEUFJJTlRGKCIgUiAiKTsgRFBSSU5URihjbWQsIHBmLT51Mi5kd1JCaXRNYXNrKTsKICAgICAgICBEUFJJTlRGKCIgRyAiKTsgRFBSSU5URihjbWQsIHBmLT51My5kd0dCaXRNYXNrKTsKICAgICAgICBEUFJJTlRGKCIgQiAiKTsgRFBSSU5URihjbWQsIHBmLT51NC5kd0JCaXRNYXNrKTsKICAgICAgICBpZiAocGYtPmR3RmxhZ3MgJiBERFBGX0FMUEhBUElYRUxTKQogICAgICAgIHsKICAgICAgICAgICAgRFBSSU5URigiIEEgIik7IERQUklOVEYoY21kLCBwZi0+dTUuZHdSR0JBbHBoYUJpdE1hc2spOwogICAgICAgIH0KICAgICAgICBpZiAocGYtPmR3RmxhZ3MgJiBERFBGX1pQSVhFTFMpCiAgICAgICAgewogICAgICAgICAgICBEUFJJTlRGKCIgWiAiKTsgRFBSSU5URihjbWQsIHBmLT51NS5kd1JHQlpCaXRNYXNrKTsKICAgICAgICB9CiAgICB9CiAgICBpZiAocGYtPmR3RmxhZ3MgJiBERFBGX1pCVUZGRVIpCiAgICB7CiAgICAgICAgRFBSSU5URigiLCBaIGJpdHMgOiAlZCIsIHBmLT51MS5kd1pCdWZmZXJCaXREZXB0aCk7CiAgICB9CiAgICBpZiAocGYtPmR3RmxhZ3MgJiBERFBGX0FMUEhBKQogICAgewogICAgICAgIERQUklOVEYoIiwgQWxwaGEgYml0cyA6ICVkIiwgcGYtPnUxLmR3QWxwaGFCaXREZXB0aCk7CiAgICB9CiAgICBpZiAocGYtPmR3RmxhZ3MgJiBERFBGX0JVTVBEVURWKQogICAgewogICAgICAgIGNvbnN0IGNoYXIgKmNtZCA9ICIlMDhseCI7CiAgICAgICAgRFBSSU5URigiLCBCdW1wIGJpdHM6ICVkLCAiLCBwZi0+dTEuZHdCdW1wQml0Q291bnQpOwogICAgICAgIERQUklOVEYoIiBVICIpOyBEUFJJTlRGKGNtZCwgcGYtPnUyLmR3QnVtcER1Qml0TWFzayk7CiAgICAgICAgRFBSSU5URigiIFYgIik7IERQUklOVEYoY21kLCBwZi0+dTMuZHdCdW1wRHZCaXRNYXNrKTsKICAgICAgICBEUFJJTlRGKCIgTCAiKTsgRFBSSU5URihjbWQsIHBmLT51NC5kd0J1bXBMdW1pbmFuY2VCaXRNYXNrKTsKICAgIH0KICAgIERQUklOVEYoIikiKTsKfQoKdm9pZCBERFJBV19kdW1wX3N1cmZhY2VfZGVzYyhjb25zdCBERFNVUkZBQ0VERVNDMiAqbHBkZHNkKQp7CiNkZWZpbmUgU1RSVUNUIEREU1VSRkFDRURFU0MyCiAgICBzdGF0aWMgY29uc3QgbWVtYmVyX2luZm8gbWVtYmVyc1tdID0KICAgICAgICB7CiAgICAgICAgICAgIE1FKEREU0RfSEVJR0hULCBERFJBV19kdW1wX0RXT1JELCBkd0hlaWdodCksCiAgICAgICAgICAgIE1FKEREU0RfV0lEVEgsIEREUkFXX2R1bXBfRFdPUkQsIGR3V2lkdGgpLAogICAgICAgICAgICBNRShERFNEX1BJVENILCBERFJBV19kdW1wX0RXT1JELCB1MSAvKiBsUGl0Y2ggKi8pLAogICAgICAgICAgICBNRShERFNEX0xJTkVBUlNJWkUsIEREUkFXX2R1bXBfRFdPUkQsIHUxIC8qIGR3TGluZWFyU2l6ZSAqLyksCiAgICAgICAgICAgIE1FKEREU0RfQkFDS0JVRkZFUkNPVU5ULCBERFJBV19kdW1wX0RXT1JELCBkd0JhY2tCdWZmZXJDb3VudCksCiAgICAgICAgICAgIE1FKEREU0RfTUlQTUFQQ09VTlQsIEREUkFXX2R1bXBfRFdPUkQsIHUyIC8qIGR3TWlwTWFwQ291bnQgKi8pLAogICAgICAgICAgICBNRShERFNEX1pCVUZGRVJCSVRERVBUSCwgRERSQVdfZHVtcF9EV09SRCwgdTIgLyogZHdaQnVmZmVyQml0RGVwdGggKi8pLCAvKiBUaGlzIGlzIGZvciAnb2xkLXN0eWxlJyBEM0QgKi8KICAgICAgICAgICAgTUUoRERTRF9SRUZSRVNIUkFURSwgRERSQVdfZHVtcF9EV09SRCwgdTIgLyogZHdSZWZyZXNoUmF0ZSAqLyksCiAgICAgICAgICAgIE1FKEREU0RfQUxQSEFCSVRERVBUSCwgRERSQVdfZHVtcF9EV09SRCwgZHdBbHBoYUJpdERlcHRoKSwKICAgICAgICAgICAgTUUoRERTRF9MUFNVUkZBQ0UsIEREUkFXX2R1bXBfUFRSLCBscFN1cmZhY2UpLAogICAgICAgICAgICBNRShERFNEX0NLREVTVE9WRVJMQVksIEREUkFXX2R1bXBfRERDT0xPUktFWSwgdTMgLyogZGRja0NLRGVzdE92ZXJsYXkgKi8pLAogICAgICAgICAgICBNRShERFNEX0NLREVTVEJMVCwgRERSQVdfZHVtcF9ERENPTE9SS0VZLCBkZGNrQ0tEZXN0Qmx0KSwKICAgICAgICAgICAgTUUoRERTRF9DS1NSQ09WRVJMQVksIEREUkFXX2R1bXBfRERDT0xPUktFWSwgZGRja0NLU3JjT3ZlcmxheSksCiAgICAgICAgICAgIE1FKEREU0RfQ0tTUkNCTFQsIEREUkFXX2R1bXBfRERDT0xPUktFWSwgZGRja0NLU3JjQmx0KSwKICAgICAgICAgICAgTUUoRERTRF9QSVhFTEZPUk1BVCwgRERSQVdfZHVtcF9waXhlbGZvcm1hdCwgdTQgLyogZGRwZlBpeGVsRm9ybWF0ICovKQogICAgICAgIH07CiAgICBzdGF0aWMgY29uc3QgbWVtYmVyX2luZm8gbWVtYmVyc19jYXBzW10gPQogICAgICAgIHsKICAgICAgICAgICAgTUUoRERTRF9DQVBTLCBERFJBV19kdW1wX0REU0NBUFMsIGRkc0NhcHMpCiAgICAgICAgfTsKICAgIHN0YXRpYyBjb25zdCBtZW1iZXJfaW5mbyBtZW1iZXJzX2NhcHMyW10gPQogICAgICAgIHsKICAgICAgICAgICAgTUUoRERTRF9DQVBTLCBERFJBV19kdW1wX0REU0NBUFMyLCBkZHNDYXBzKQogICAgICAgIH07CiN1bmRlZiBTVFJVQ1QKCiAgICBpZiAoTlVMTCA9PSBscGRkc2QpCiAgICB7CiAgICAgICAgRFBSSU5URigiKG51bGwpXG4iKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgaWYgKGxwZGRzZC0+ZHdTaXplID49IHNpemVvZihERFNVUkZBQ0VERVNDMikpCiAgICAgIHsKICAgICAgICAgIEREUkFXX2R1bXBfbWVtYmVycyhscGRkc2QtPmR3RmxhZ3MsIGxwZGRzZCwgbWVtYmVyc19jYXBzMiwgMSk7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgICBERFJBV19kdW1wX21lbWJlcnMobHBkZHNkLT5kd0ZsYWdzLCBscGRkc2QsIG1lbWJlcnNfY2FwcywgMSk7CiAgICAgIH0KICAgICAgRERSQVdfZHVtcF9tZW1iZXJzKGxwZGRzZC0+ZHdGbGFncywgbHBkZHNkLCBtZW1iZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihtZW1iZXJzKS9zaXplb2YobWVtYmVyc1swXSkpOwogICAgfQp9Cgp2b2lkCmR1bXBfRDNETUFUUklYKGNvbnN0IEQzRE1BVFJJWCAqbWF0KQp7CiAgICBEUFJJTlRGKCIgICVmICVmICVmICVmXG4iLCBtYXQtPl8xMSwgbWF0LT5fMTIsIG1hdC0+XzEzLCBtYXQtPl8xNCk7CiAgICBEUFJJTlRGKCIgICVmICVmICVmICVmXG4iLCBtYXQtPl8yMSwgbWF0LT5fMjIsIG1hdC0+XzIzLCBtYXQtPl8yNCk7CiAgICBEUFJJTlRGKCIgICVmICVmICVmICVmXG4iLCBtYXQtPl8zMSwgbWF0LT5fMzIsIG1hdC0+XzMzLCBtYXQtPl8zNCk7CiAgICBEUFJJTlRGKCIgICVmICVmICVmICVmXG4iLCBtYXQtPl80MSwgbWF0LT5fNDIsIG1hdC0+XzQzLCBtYXQtPl80NCk7Cn0KCkRXT1JECmdldF9mbGV4aWJsZV92ZXJ0ZXhfc2l6ZShEV09SRCBkM2R2dFZlcnRleFR5cGUpCnsKICAgIERXT1JEIHNpemUgPSAwOwogICAgaW50IGk7CgogICAgaWYgKGQzZHZ0VmVydGV4VHlwZSAmIEQzREZWRl9OT1JNQUwpIHNpemUgKz0gMyAqIHNpemVvZihEM0RWQUxVRSk7CiAgICBpZiAoZDNkdnRWZXJ0ZXhUeXBlICYgRDNERlZGX0RJRkZVU0UpIHNpemUgKz0gc2l6ZW9mKERXT1JEKTsKICAgIGlmIChkM2R2dFZlcnRleFR5cGUgJiBEM0RGVkZfU1BFQ1VMQVIpIHNpemUgKz0gc2l6ZW9mKERXT1JEKTsKICAgIGlmIChkM2R2dFZlcnRleFR5cGUgJiBEM0RGVkZfUkVTRVJWRUQxKSBzaXplICs9IHNpemVvZihEV09SRCk7CiAgICBzd2l0Y2ggKGQzZHZ0VmVydGV4VHlwZSAmIEQzREZWRl9QT1NJVElPTl9NQVNLKQogICAgewogICAgICAgIGNhc2UgRDNERlZGX1hZWjogICAgc2l6ZSArPSAzICogc2l6ZW9mKEQzRFZBTFVFKTsgYnJlYWs7CiAgICAgICAgY2FzZSBEM0RGVkZfWFlaUkhXOiBzaXplICs9IDQgKiBzaXplb2YoRDNEVkFMVUUpOyBicmVhazsKICAgICAgICBjYXNlIEQzREZWRl9YWVpCMTogIHNpemUgKz0gNCAqIHNpemVvZihEM0RWQUxVRSk7IGJyZWFrOwogICAgICAgIGNhc2UgRDNERlZGX1hZWkIyOiAgc2l6ZSArPSA1ICogc2l6ZW9mKEQzRFZBTFVFKTsgYnJlYWs7CiAgICAgICAgY2FzZSBEM0RGVkZfWFlaQjM6ICBzaXplICs9IDYgKiBzaXplb2YoRDNEVkFMVUUpOyBicmVhazsKICAgICAgICBjYXNlIEQzREZWRl9YWVpCNDogIHNpemUgKz0gNyAqIHNpemVvZihEM0RWQUxVRSk7IGJyZWFrOwogICAgICAgIGNhc2UgRDNERlZGX1hZWkI1OiAgc2l6ZSArPSA4ICogc2l6ZW9mKEQzRFZBTFVFKTsgYnJlYWs7CiAgICAgICAgZGVmYXVsdDogRVJSKCJVbmV4cGVjdGVkIHBvc2l0aW9uIG1hc2tcbiIpOwogICAgfQogICAgZm9yIChpID0gMDsgaSA8IEdFVF9URVhDT1VOVF9GUk9NX0ZWRihkM2R2dFZlcnRleFR5cGUpOyBpKyspCiAgICB7CiAgICAgICAgc2l6ZSArPSBHRVRfVEVYQ09PUkRfU0laRV9GUk9NX0ZWRihkM2R2dFZlcnRleFR5cGUsIGkpICogc2l6ZW9mKEQzRFZBTFVFKTsKICAgIH0KCiAgICByZXR1cm4gc2l6ZTsKfQoKdm9pZCBERFJBV19Db252ZXJ0X0REU0NBUFNfMV9Ub18yKGNvbnN0IEREU0NBUFMqIHBJbiwgRERTQ0FQUzIqIHBPdXQpCnsKICAgIC8qIDIgYWRkcyB0aHJlZSBhZGRpdGlvbmFsIGNhcHMgZmllbGRzIHRvIHRoZSBlbmQuIEJvdGggdmVyc2lvbnMKICAgICAqIGFyZSB1bnZlcnNpb25lZC4gKi8KICAgIHBPdXQtPmR3Q2FwcyA9IHBJbi0+ZHdDYXBzOwogICAgcE91dC0+ZHdDYXBzMiA9IDA7CiAgICBwT3V0LT5kd0NhcHMzID0gMDsKICAgIHBPdXQtPmR3Q2FwczQgPSAwOwp9Cgp2b2lkIEREUkFXX0NvbnZlcnRfRERERVZJQ0VJREVOVElGSUVSXzJfVG9fMShjb25zdCBERERFVklDRUlERU5USUZJRVIyKiBwSW4sIEREREVWSUNFSURFTlRJRklFUiogcE91dCkKewogICAgLyogMiBhZGRzIGEgZHdXSFFMTGV2ZWwgZmllbGQgdG8gdGhlIGVuZC4gQm90aCBzdHJ1Y3R1cmVzIGFyZQogICAgICogdW52ZXJzaW9uZWQuICovCiAgICBtZW1jcHkocE91dCwgcEluLCBzaXplb2YoKnBPdXQpKTsKfQoKdm9pZCBERFJBV19kdW1wX2Nvb3BlcmF0aXZlbGV2ZWwoRFdPUkQgY29vcGxldmVsKQp7CiAgICBzdGF0aWMgY29uc3QgZmxhZ19pbmZvIGZsYWdzW10gPQogICAgICAgIHsKICAgICAgICAgICAgRkUoRERTQ0xfRlVMTFNDUkVFTiksCiAgICAgICAgICAgIEZFKEREU0NMX0FMTE9XUkVCT09UKSwKICAgICAgICAgICAgRkUoRERTQ0xfTk9XSU5ET1dDSEFOR0VTKSwKICAgICAgICAgICAgRkUoRERTQ0xfTk9STUFMKSwKICAgICAgICAgICAgRkUoRERTQ0xfQUxMT1dNT0RFWCksCiAgICAgICAgICAgIEZFKEREU0NMX0VYQ0xVU0lWRSksCiAgICAgICAgICAgIEZFKEREU0NMX1NFVEZPQ1VTV0lORE9XKSwKICAgICAgICAgICAgRkUoRERTQ0xfU0VUREVWSUNFV0lORE9XKSwKICAgICAgICAgICAgRkUoRERTQ0xfQ1JFQVRFREVWSUNFV0lORE9XKQogICAgfTsKCiAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKQogICAgewogICAgICAgIERQUklOVEYoIiAtICIpOwogICAgICAgIEREUkFXX2R1bXBfZmxhZ3MoY29vcGxldmVsLCBmbGFncywgc2l6ZW9mKGZsYWdzKS9zaXplb2YoZmxhZ3NbMF0pKTsKICAgIH0KfQoKdm9pZCBERFJBV19kdW1wX0REQ0FQUyhjb25zdCBERENBUFMgKmxwY2FwcykKewogICAgc3RhdGljIGNvbnN0IGZsYWdfaW5mbyBmbGFnczFbXSA9CiAgICB7CiAgICAgIEZFKEREQ0FQU18zRCksCiAgICAgIEZFKEREQ0FQU19BTElHTkJPVU5EQVJZREVTVCksCiAgICAgIEZFKEREQ0FQU19BTElHTlNJWkVERVNUKSwKICAgICAgRkUoRERDQVBTX0FMSUdOQk9VTkRBUllTUkMpLAogICAgICBGRShERENBUFNfQUxJR05TSVpFU1JDKSwKICAgICAgRkUoRERDQVBTX0FMSUdOU1RSSURFKSwKICAgICAgRkUoRERDQVBTX0JMVCksCiAgICAgIEZFKEREQ0FQU19CTFRRVUVVRSksCiAgICAgIEZFKEREQ0FQU19CTFRGT1VSQ0MpLAogICAgICBGRShERENBUFNfQkxUU1RSRVRDSCksCiAgICAgIEZFKEREQ0FQU19HREkpLAogICAgICBGRShERENBUFNfT1ZFUkxBWSksCiAgICAgIEZFKEREQ0FQU19PVkVSTEFZQ0FOVENMSVApLAogICAgICBGRShERENBUFNfT1ZFUkxBWUZPVVJDQyksCiAgICAgIEZFKEREQ0FQU19PVkVSTEFZU1RSRVRDSCksCiAgICAgIEZFKEREQ0FQU19QQUxFVFRFKSwKICAgICAgRkUoRERDQVBTX1BBTEVUVEVWU1lOQyksCiAgICAgIEZFKEREQ0FQU19SRUFEU0NBTkxJTkUpLAogICAgICBGRShERENBUFNfU1RFUkVPVklFVyksCiAgICAgIEZFKEREQ0FQU19WQkkpLAogICAgICBGRShERENBUFNfWkJMVFMpLAogICAgICBGRShERENBUFNfWk9WRVJMQVlTKSwKICAgICAgRkUoRERDQVBTX0NPTE9SS0VZKSwKICAgICAgRkUoRERDQVBTX0FMUEhBKSwKICAgICAgRkUoRERDQVBTX0NPTE9SS0VZSFdBU1NJU1QpLAogICAgICBGRShERENBUFNfTk9IQVJEV0FSRSksCiAgICAgIEZFKEREQ0FQU19CTFRDT0xPUkZJTEwpLAogICAgICBGRShERENBUFNfQkFOS1NXSVRDSEVEKSwKICAgICAgRkUoRERDQVBTX0JMVERFUFRIRklMTCksCiAgICAgIEZFKEREQ0FQU19DQU5DTElQKSwKICAgICAgRkUoRERDQVBTX0NBTkNMSVBTVFJFVENIRUQpLAogICAgICBGRShERENBUFNfQ0FOQkxUU1lTTUVNKQogICAgfTsKICAgIHN0YXRpYyBjb25zdCBmbGFnX2luZm8gZmxhZ3MyW10gPQogICAgewogICAgICBGRShERENBUFMyX0NFUlRJRklFRCksCiAgICAgIEZFKEREQ0FQUzJfTk8yRERVUklORzNEU0NFTkUpLAogICAgICBGRShERENBUFMyX1ZJREVPUE9SVCksCiAgICAgIEZFKEREQ0FQUzJfQVVUT0ZMSVBPVkVSTEFZKSwKICAgICAgRkUoRERDQVBTMl9DQU5CT0JJTlRFUkxFQVZFRCksCiAgICAgIEZFKEREQ0FQUzJfQ0FOQk9CTk9OSU5URVJMRUFWRUQpLAogICAgICBGRShERENBUFMyX0NPTE9SQ09OVFJPTE9WRVJMQVkpLAogICAgICBGRShERENBUFMyX0NPTE9SQ09OVFJPTFBSSU1BUlkpLAogICAgICBGRShERENBUFMyX0NBTkRST1BaMTZCSVQpLAogICAgICBGRShERENBUFMyX05PTkxPQ0FMVklETUVNKSwKICAgICAgRkUoRERDQVBTMl9OT05MT0NBTFZJRE1FTUNBUFMpLAogICAgICBGRShERENBUFMyX05PUEFHRUxPQ0tSRVFVSVJFRCksCiAgICAgIEZFKEREQ0FQUzJfV0lERVNVUkZBQ0VTKSwKICAgICAgRkUoRERDQVBTMl9DQU5GTElQT0RERVZFTiksCiAgICAgIEZFKEREQ0FQUzJfQ0FOQk9CSEFSRFdBUkUpLAogICAgICBGRShERENBUFMyX0NPUFlGT1VSQ0MpLAogICAgICBGRShERENBUFMyX1BSSU1BUllHQU1NQSksCiAgICAgIEZFKEREQ0FQUzJfQ0FOUkVOREVSV0lORE9XRUQpLAogICAgICBGRShERENBUFMyX0NBTkNBTElCUkFURUdBTU1BKSwKICAgICAgRkUoRERDQVBTMl9GTElQSU5URVJWQUwpLAogICAgICBGRShERENBUFMyX0ZMSVBOT1ZTWU5DKSwKICAgICAgRkUoRERDQVBTMl9DQU5NQU5BR0VURVhUVVJFKSwKICAgICAgRkUoRERDQVBTMl9URVhNQU5JTk5PTkxPQ0FMVklETUVNKSwKICAgICAgRkUoRERDQVBTMl9TVEVSRU8pLAogICAgICBGRShERENBUFMyX1NZU1RPTk9OTE9DQUxfQVNfU1lTVE9MT0NBTCkKICAgIH07CiAgICBzdGF0aWMgY29uc3QgZmxhZ19pbmZvIGZsYWdzM1tdID0KICAgIHsKICAgICAgRkUoRERDS0VZQ0FQU19ERVNUQkxUKSwKICAgICAgRkUoRERDS0VZQ0FQU19ERVNUQkxUQ0xSU1BBQ0UpLAogICAgICBGRShERENLRVlDQVBTX0RFU1RCTFRDTFJTUEFDRVlVViksCiAgICAgIEZFKEREQ0tFWUNBUFNfREVTVEJMVFlVViksCiAgICAgIEZFKEREQ0tFWUNBUFNfREVTVE9WRVJMQVkpLAogICAgICBGRShERENLRVlDQVBTX0RFU1RPVkVSTEFZQ0xSU1BBQ0UpLAogICAgICBGRShERENLRVlDQVBTX0RFU1RPVkVSTEFZQ0xSU1BBQ0VZVVYpLAogICAgICBGRShERENLRVlDQVBTX0RFU1RPVkVSTEFZT05FQUNUSVZFKSwKICAgICAgRkUoRERDS0VZQ0FQU19ERVNUT1ZFUkxBWVlVViksCiAgICAgIEZFKEREQ0tFWUNBUFNfU1JDQkxUKSwKICAgICAgRkUoRERDS0VZQ0FQU19TUkNCTFRDTFJTUEFDRSksCiAgICAgIEZFKEREQ0tFWUNBUFNfU1JDQkxUQ0xSU1BBQ0VZVVYpLAogICAgICBGRShERENLRVlDQVBTX1NSQ0JMVFlVViksCiAgICAgIEZFKEREQ0tFWUNBUFNfU1JDT1ZFUkxBWSksCiAgICAgIEZFKEREQ0tFWUNBUFNfU1JDT1ZFUkxBWUNMUlNQQUNFKSwKICAgICAgRkUoRERDS0VZQ0FQU19TUkNPVkVSTEFZQ0xSU1BBQ0VZVVYpLAogICAgICBGRShERENLRVlDQVBTX1NSQ09WRVJMQVlPTkVBQ1RJVkUpLAogICAgICBGRShERENLRVlDQVBTX1NSQ09WRVJMQVlZVVYpLAogICAgICBGRShERENLRVlDQVBTX05PQ09TVE9WRVJMQVkpCiAgICB9OwogICAgc3RhdGljIGNvbnN0IGZsYWdfaW5mbyBmbGFnczRbXSA9CiAgICB7CiAgICAgIEZFKERERlhDQVBTX0JMVEFMUEhBKSwKICAgICAgRkUoRERGWENBUFNfT1ZFUkxBWUFMUEhBKSwKICAgICAgRkUoRERGWENBUFNfQkxUQVJJVEhTVFJFVENIWU4pLAogICAgICBGRShEREZYQ0FQU19CTFRBUklUSFNUUkVUQ0hZKSwKICAgICAgRkUoRERGWENBUFNfQkxUTUlSUk9STEVGVFJJR0hUKSwKICAgICAgRkUoRERGWENBUFNfQkxUTUlSUk9SVVBET1dOKSwKICAgICAgRkUoRERGWENBUFNfQkxUUk9UQVRJT04pLAogICAgICBGRShEREZYQ0FQU19CTFRST1RBVElPTjkwKSwKICAgICAgRkUoRERGWENBUFNfQkxUU0hSSU5LWCksCiAgICAgIEZFKERERlhDQVBTX0JMVFNIUklOS1hOKSwKICAgICAgRkUoRERGWENBUFNfQkxUU0hSSU5LWSksCiAgICAgIEZFKERERlhDQVBTX0JMVFNIUklOS1lOKSwKICAgICAgRkUoRERGWENBUFNfQkxUU1RSRVRDSFgpLAogICAgICBGRShEREZYQ0FQU19CTFRTVFJFVENIWE4pLAogICAgICBGRShEREZYQ0FQU19CTFRTVFJFVENIWSksCiAgICAgIEZFKERERlhDQVBTX0JMVFNUUkVUQ0hZTiksCiAgICAgIEZFKERERlhDQVBTX09WRVJMQVlBUklUSFNUUkVUQ0hZKSwKICAgICAgRkUoRERGWENBUFNfT1ZFUkxBWUFSSVRIU1RSRVRDSFlOKSwKICAgICAgRkUoRERGWENBUFNfT1ZFUkxBWVNIUklOS1gpLAogICAgICBGRShEREZYQ0FQU19PVkVSTEFZU0hSSU5LWE4pLAogICAgICBGRShEREZYQ0FQU19PVkVSTEFZU0hSSU5LWSksCiAgICAgIEZFKERERlhDQVBTX09WRVJMQVlTSFJJTktZTiksCiAgICAgIEZFKERERlhDQVBTX09WRVJMQVlTVFJFVENIWCksCiAgICAgIEZFKERERlhDQVBTX09WRVJMQVlTVFJFVENIWE4pLAogICAgICBGRShEREZYQ0FQU19PVkVSTEFZU1RSRVRDSFkpLAogICAgICBGRShEREZYQ0FQU19PVkVSTEFZU1RSRVRDSFlOKSwKICAgICAgRkUoRERGWENBUFNfT1ZFUkxBWU1JUlJPUkxFRlRSSUdIVCksCiAgICAgIEZFKERERlhDQVBTX09WRVJMQVlNSVJST1JVUERPV04pCiAgICB9OwogICAgc3RhdGljIGNvbnN0IGZsYWdfaW5mbyBmbGFnczVbXSA9CiAgICB7CiAgICAgIEZFKERERlhBTFBIQUNBUFNfQkxUQUxQSEFFREdFQkxFTkQpLAogICAgICBGRShEREZYQUxQSEFDQVBTX0JMVEFMUEhBUElYRUxTKSwKICAgICAgRkUoRERGWEFMUEhBQ0FQU19CTFRBTFBIQVBJWEVMU05FRyksCiAgICAgIEZFKERERlhBTFBIQUNBUFNfQkxUQUxQSEFTVVJGQUNFUyksCiAgICAgIEZFKERERlhBTFBIQUNBUFNfQkxUQUxQSEFTVVJGQUNFU05FRyksCiAgICAgIEZFKERERlhBTFBIQUNBUFNfT1ZFUkxBWUFMUEhBRURHRUJMRU5EKSwKICAgICAgRkUoRERGWEFMUEhBQ0FQU19PVkVSTEFZQUxQSEFQSVhFTFMpLAogICAgICBGRShEREZYQUxQSEFDQVBTX09WRVJMQVlBTFBIQVBJWEVMU05FRyksCiAgICAgIEZFKERERlhBTFBIQUNBUFNfT1ZFUkxBWUFMUEhBU1VSRkFDRVMpLAogICAgICBGRShEREZYQUxQSEFDQVBTX09WRVJMQVlBTFBIQVNVUkZBQ0VTTkVHKQogICAgfTsKICAgIHN0YXRpYyBjb25zdCBmbGFnX2luZm8gZmxhZ3M2W10gPQogICAgewogICAgICBGRShERFBDQVBTXzRCSVQpLAogICAgICBGRShERFBDQVBTXzhCSVRFTlRSSUVTKSwKICAgICAgRkUoRERQQ0FQU184QklUKSwKICAgICAgRkUoRERQQ0FQU19JTklUSUFMSVpFKSwKICAgICAgRkUoRERQQ0FQU19QUklNQVJZU1VSRkFDRSksCiAgICAgIEZFKEREUENBUFNfUFJJTUFSWVNVUkZBQ0VMRUZUKSwKICAgICAgRkUoRERQQ0FQU19BTExPVzI1NiksCiAgICAgIEZFKEREUENBUFNfVlNZTkMpLAogICAgICBGRShERFBDQVBTXzFCSVQpLAogICAgICBGRShERFBDQVBTXzJCSVQpLAogICAgICBGRShERFBDQVBTX0FMUEhBKSwKICAgIH07CiAgICBzdGF0aWMgY29uc3QgZmxhZ19pbmZvIGZsYWdzN1tdID0KICAgIHsKICAgICAgRkUoRERTVkNBUFNfUkVTRVJWRUQxKSwKICAgICAgRkUoRERTVkNBUFNfUkVTRVJWRUQyKSwKICAgICAgRkUoRERTVkNBUFNfUkVTRVJWRUQzKSwKICAgICAgRkUoRERTVkNBUFNfUkVTRVJWRUQ0KSwKICAgICAgRkUoRERTVkNBUFNfU1RFUkVPU0VRVUVOVElBTCksCiAgICB9OwoKICAgIERQUklOVEYoIiAtIGR3U2l6ZSA6ICVkXG4iLCBscGNhcHMtPmR3U2l6ZSk7CiAgICBEUFJJTlRGKCIgLSBkd0NhcHMgOiAiKTsgRERSQVdfZHVtcF9mbGFncyhscGNhcHMtPmR3Q2FwcywgZmxhZ3MxLCBzaXplb2YoZmxhZ3MxKS9zaXplb2YoZmxhZ3MxWzBdKSk7CiAgICBEUFJJTlRGKCIgLSBkd0NhcHMyIDogIik7IEREUkFXX2R1bXBfZmxhZ3MobHBjYXBzLT5kd0NhcHMyLCBmbGFnczIsIHNpemVvZihmbGFnczIpL3NpemVvZihmbGFnczJbMF0pKTsKICAgIERQUklOVEYoIiAtIGR3Q0tleUNhcHMgOiAiKTsgRERSQVdfZHVtcF9mbGFncyhscGNhcHMtPmR3Q0tleUNhcHMsIGZsYWdzMywgc2l6ZW9mKGZsYWdzMykvc2l6ZW9mKGZsYWdzM1swXSkpOwogICAgRFBSSU5URigiIC0gZHdGWENhcHMgOiAiKTsgRERSQVdfZHVtcF9mbGFncyhscGNhcHMtPmR3RlhDYXBzLCBmbGFnczQsIHNpemVvZihmbGFnczQpL3NpemVvZihmbGFnczRbMF0pKTsKICAgIERQUklOVEYoIiAtIGR3RlhBbHBoYUNhcHMgOiAiKTsgRERSQVdfZHVtcF9mbGFncyhscGNhcHMtPmR3RlhBbHBoYUNhcHMsIGZsYWdzNSwgc2l6ZW9mKGZsYWdzNSkvc2l6ZW9mKGZsYWdzNVswXSkpOwogICAgRFBSSU5URigiIC0gZHdQYWxDYXBzIDogIik7IEREUkFXX2R1bXBfZmxhZ3MobHBjYXBzLT5kd1BhbENhcHMsIGZsYWdzNiwgc2l6ZW9mKGZsYWdzNikvc2l6ZW9mKGZsYWdzNlswXSkpOwogICAgRFBSSU5URigiIC0gZHdTVkNhcHMgOiAiKTsgRERSQVdfZHVtcF9mbGFncyhscGNhcHMtPmR3U1ZDYXBzLCBmbGFnczcsIHNpemVvZihmbGFnczcpL3NpemVvZihmbGFnczdbMF0pKTsKICAgIERQUklOVEYoIi4uLlxuIik7CiAgICBEUFJJTlRGKCIgLSBkd051bUZvdXJDQ0NvZGVzIDogJWRcbiIsIGxwY2Fwcy0+ZHdOdW1Gb3VyQ0NDb2Rlcyk7CiAgICBEUFJJTlRGKCIgLSBkd0N1cnJWaXNpYmxlT3ZlcmxheXMgOiAlZFxuIiwgbHBjYXBzLT5kd0N1cnJWaXNpYmxlT3ZlcmxheXMpOwogICAgRFBSSU5URigiIC0gZHdNaW5PdmVybGF5U3RyZXRjaCA6ICVkXG4iLCBscGNhcHMtPmR3TWluT3ZlcmxheVN0cmV0Y2gpOwogICAgRFBSSU5URigiIC0gZHdNYXhPdmVybGF5U3RyZXRjaCA6ICVkXG4iLCBscGNhcHMtPmR3TWF4T3ZlcmxheVN0cmV0Y2gpOwogICAgRFBSSU5URigiLi4uXG4iKTsKICAgIERQUklOVEYoIiAtIGRkc0NhcHMgOiAiKTsgRERSQVdfZHVtcF9ERFNDQVBTMigmbHBjYXBzLT5kZHNDYXBzKTsgRFBSSU5URigiXG4iKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIG11bHRpcGx5X21hdHJpeAogKgogKiBNdWx0aXBsaWVzIDIgNHg0IG1hdHJpY2VzIHNyYzEgYW5kIHNyYzIsIGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbiBkZXN0LgogKgogKiBQYXJhbXM6CiAqICBkZXN0OiBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBtYXRyaXgKICogIHNyYzE6IFBvaW50ZXIgdG8gdGhlIGZpcnN0IHNvdXJjZSBtYXRyaXgKICogIHNyYzI6IFBvaW50ZXIgdG8gdGhlIHNlY29uZCBzb3VyY2UgbWF0cml4CiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZAptdWx0aXBseV9tYXRyaXgoRDNETUFUUklYICpkZXN0LAogICAgICAgICAgICAgICAgY29uc3QgRDNETUFUUklYICpzcmMxLAogICAgICAgICAgICAgICAgY29uc3QgRDNETUFUUklYICpzcmMyKQp7CiAgICBEM0RNQVRSSVggdGVtcDsKCiAgICAvKiBOb3cgZG8gdGhlIG11bHRpcGxpY2F0aW9uICdieSBoYW5kJy4KICAgICAgIEkga25vdyB0aGF0IGFsbCB0aGlzIGNvdWxkIGJlIG9wdGltaXNlZCwgYnV0IHRoaXMgd2lsbCBiZSBkb25lIGxhdGVyIDotKSAqLwogICAgdGVtcC5fMTEgPSAoc3JjMS0+XzExICogc3JjMi0+XzExKSArIChzcmMxLT5fMjEgKiBzcmMyLT5fMTIpICsgKHNyYzEtPl8zMSAqIHNyYzItPl8xMykgKyAoc3JjMS0+XzQxICogc3JjMi0+XzE0KTsKICAgIHRlbXAuXzIxID0gKHNyYzEtPl8xMSAqIHNyYzItPl8yMSkgKyAoc3JjMS0+XzIxICogc3JjMi0+XzIyKSArIChzcmMxLT5fMzEgKiBzcmMyLT5fMjMpICsgKHNyYzEtPl80MSAqIHNyYzItPl8yNCk7CiAgICB0ZW1wLl8zMSA9IChzcmMxLT5fMTEgKiBzcmMyLT5fMzEpICsgKHNyYzEtPl8yMSAqIHNyYzItPl8zMikgKyAoc3JjMS0+XzMxICogc3JjMi0+XzMzKSArIChzcmMxLT5fNDEgKiBzcmMyLT5fMzQpOwogICAgdGVtcC5fNDEgPSAoc3JjMS0+XzExICogc3JjMi0+XzQxKSArIChzcmMxLT5fMjEgKiBzcmMyLT5fNDIpICsgKHNyYzEtPl8zMSAqIHNyYzItPl80MykgKyAoc3JjMS0+XzQxICogc3JjMi0+XzQ0KTsKCiAgICB0ZW1wLl8xMiA9IChzcmMxLT5fMTIgKiBzcmMyLT5fMTEpICsgKHNyYzEtPl8yMiAqIHNyYzItPl8xMikgKyAoc3JjMS0+XzMyICogc3JjMi0+XzEzKSArIChzcmMxLT5fNDIgKiBzcmMyLT5fMTQpOwogICAgdGVtcC5fMjIgPSAoc3JjMS0+XzEyICogc3JjMi0+XzIxKSArIChzcmMxLT5fMjIgKiBzcmMyLT5fMjIpICsgKHNyYzEtPl8zMiAqIHNyYzItPl8yMykgKyAoc3JjMS0+XzQyICogc3JjMi0+XzI0KTsKICAgIHRlbXAuXzMyID0gKHNyYzEtPl8xMiAqIHNyYzItPl8zMSkgKyAoc3JjMS0+XzIyICogc3JjMi0+XzMyKSArIChzcmMxLT5fMzIgKiBzcmMyLT5fMzMpICsgKHNyYzEtPl80MiAqIHNyYzItPl8zNCk7CiAgICB0ZW1wLl80MiA9IChzcmMxLT5fMTIgKiBzcmMyLT5fNDEpICsgKHNyYzEtPl8yMiAqIHNyYzItPl80MikgKyAoc3JjMS0+XzMyICogc3JjMi0+XzQzKSArIChzcmMxLT5fNDIgKiBzcmMyLT5fNDQpOwoKICAgIHRlbXAuXzEzID0gKHNyYzEtPl8xMyAqIHNyYzItPl8xMSkgKyAoc3JjMS0+XzIzICogc3JjMi0+XzEyKSArIChzcmMxLT5fMzMgKiBzcmMyLT5fMTMpICsgKHNyYzEtPl80MyAqIHNyYzItPl8xNCk7CiAgICB0ZW1wLl8yMyA9IChzcmMxLT5fMTMgKiBzcmMyLT5fMjEpICsgKHNyYzEtPl8yMyAqIHNyYzItPl8yMikgKyAoc3JjMS0+XzMzICogc3JjMi0+XzIzKSArIChzcmMxLT5fNDMgKiBzcmMyLT5fMjQpOwogICAgdGVtcC5fMzMgPSAoc3JjMS0+XzEzICogc3JjMi0+XzMxKSArIChzcmMxLT5fMjMgKiBzcmMyLT5fMzIpICsgKHNyYzEtPl8zMyAqIHNyYzItPl8zMykgKyAoc3JjMS0+XzQzICogc3JjMi0+XzM0KTsKICAgIHRlbXAuXzQzID0gKHNyYzEtPl8xMyAqIHNyYzItPl80MSkgKyAoc3JjMS0+XzIzICogc3JjMi0+XzQyKSArIChzcmMxLT5fMzMgKiBzcmMyLT5fNDMpICsgKHNyYzEtPl80MyAqIHNyYzItPl80NCk7CgogICAgdGVtcC5fMTQgPSAoc3JjMS0+XzE0ICogc3JjMi0+XzExKSArIChzcmMxLT5fMjQgKiBzcmMyLT5fMTIpICsgKHNyYzEtPl8zNCAqIHNyYzItPl8xMykgKyAoc3JjMS0+XzQ0ICogc3JjMi0+XzE0KTsKICAgIHRlbXAuXzI0ID0gKHNyYzEtPl8xNCAqIHNyYzItPl8yMSkgKyAoc3JjMS0+XzI0ICogc3JjMi0+XzIyKSArIChzcmMxLT5fMzQgKiBzcmMyLT5fMjMpICsgKHNyYzEtPl80NCAqIHNyYzItPl8yNCk7CiAgICB0ZW1wLl8zNCA9IChzcmMxLT5fMTQgKiBzcmMyLT5fMzEpICsgKHNyYzEtPl8yNCAqIHNyYzItPl8zMikgKyAoc3JjMS0+XzM0ICogc3JjMi0+XzMzKSArIChzcmMxLT5fNDQgKiBzcmMyLT5fMzQpOwogICAgdGVtcC5fNDQgPSAoc3JjMS0+XzE0ICogc3JjMi0+XzQxKSArIChzcmMxLT5fMjQgKiBzcmMyLT5fNDIpICsgKHNyYzEtPl8zNCAqIHNyYzItPl80MykgKyAoc3JjMS0+XzQ0ICogc3JjMi0+XzQ0KTsKCiAgICAvKiBBbmQgY29weSB0aGUgbmV3IG1hdHJpeCBpbiB0aGUgZ29vZCBzdG9yYWdlLi4gKi8KICAgIG1lbWNweShkZXN0LCAmdGVtcCwgMTYgKiBzaXplb2YoRDNEVkFMVUUpKTsKfQoKCkhSRVNVTFQKaHJfZGRyYXdfZnJvbV93aW5lZDNkKEhSRVNVTFQgaHIpCnsKICAgIHN3aXRjaChocikKICAgIHsKICAgICAgICBjYXNlIFdJTkVEM0RFUlJfSU5WQUxJRENBTEw6IHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwogICAgICAgIGRlZmF1bHQ6IHJldHVybiBocjsKICAgIH0KfQo=