I2luY2x1ZGUgPG5pcnZhbmEuaD4KI2luY2x1ZGUgTlZfVklFV1BPUlRfSAojaW5jbHVkZSA8c3RkaW8uaD4KCiNpbmNsdWRlIDxmdDJidWlsZC5oPgojaW5jbHVkZSBGVF9GUkVFVFlQRV9ICgovKiBpbmNsdWRlIEZyZWVUeXBlIGludGVybmFscyB0byBkZWJ1ZyBoaW50cyAqLwojaW5jbHVkZSA8Li4vc3JjL3BzaGludGVyL3BzaHJlYy5oPgojaW5jbHVkZSA8Li4vc3JjL3BzaGludGVyL3BzaGFsZ28xLmg+CiNpbmNsdWRlIDwuLi9zcmMvcHNoaW50ZXIvcHNoYWxnbzIuaD4KI2luY2x1ZGUgPC4uL3NyYy9wc2hpbnRlci9wc2hhbGdvMy5oPgoKI2luY2x1ZGUgPC4uL3NyYy9hdXRvaGludC9haHR5cGVzLmg+CgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwogLyoqKioqICAgICAgICAgICAgICAgICAgICAgUk9PVCBERUZJTklUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgojaW5jbHVkZSA8dGltZS5oPiAgICAvKiBmb3IgY2xvY2soKSAqLwoKLyogU3VuT1MgNC4xLiogZG9lcyBub3QgZGVmaW5lIENMT0NLU19QRVJfU0VDLCBzbyBpbmNsdWRlIDxzeXMvcGFyYW0uaD4gKi8KLyogdG8gZ2V0IHRoZSBIWiBtYWNybyB3aGljaCBpcyB0aGUgZXF1aXZhbGVudC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KI2lmIGRlZmluZWQoX19zdW5fXykgJiYgIWRlZmluZWQoU1ZSNCkgJiYgIWRlZmluZWQoX19TVlI0KQojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNkZWZpbmUgQ0xPQ0tTX1BFUl9TRUMgSFoKI2VuZGlmCgpzdGF0aWMgaW50ICBmaXJzdF9nbHlwaCA9IDA7CgpzdGF0aWMgTlZfUmVuZGVyZXIgICByZW5kZXJlcjsKc3RhdGljIE5WX1BhaW50ZXIgICAgcGFpbnRlcjsKc3RhdGljIE5WX1BpeG1hcCAgICAgdGFyZ2V0OwpzdGF0aWMgTlZfRXJyb3IgICAgICBlcnJvcjsKc3RhdGljIE5WX01lbW9yeSAgICAgbWVtb3J5OwpzdGF0aWMgTlZWX0Rpc3BsYXkgICBkaXNwbGF5OwpzdGF0aWMgTlZWX1N1cmZhY2UgICBzdXJmYWNlOwoKc3RhdGljIEZUX0xpYnJhcnkgICAgZnJlZXR5cGU7CnN0YXRpYyBGVF9GYWNlICAgICAgIGZhY2U7CgoKc3RhdGljICBOVl9Qb3MgICAgICAgIGdseXBoX3NjYWxlOwpzdGF0aWMgIE5WX1BvcyAgICAgICAgZ2x5cGhfb3JnX3g7CnN0YXRpYyAgTlZfUG9zICAgICAgICBnbHlwaF9vcmdfeTsKc3RhdGljICBOVl9UcmFuc2Zvcm0gIGdseXBoX3RyYW5zZm9ybTsgIC8qIGZvbnQgdW5pdHMgLT4gZGV2aWNlIHBpeGVscyAqLwpzdGF0aWMgIE5WX1RyYW5zZm9ybSAgc2l6ZV90cmFuc2Zvcm07ICAgLyogc3VicGl4ZWxzICAtPiBkZXZpY2UgcGl4ZWxzICovCgpzdGF0aWMgIE5WX1NjYWxlICAgICAgZ3JpZF9zY2FsZSA9IDEuMDsKCnN0YXRpYyAgaW50ICAgZ2x5cGhfaW5kZXg7CnN0YXRpYyAgaW50ICAgcGl4ZWxfc2l6ZSA9IDEyOwoKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KIC8qKioqKiAgICAgICAgICAgICAgICAgT1BUSU9OUywgQ09MT1JTIGFuZCBPVEhFUlMgICAgICAgICAgICAgICAgICAgKioqKiovCiAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgIGludCAgIG9wdGlvbl9zaG93X2F4aXMgICAgID0gMTsKc3RhdGljICBpbnQgICBvcHRpb25fc2hvd19kb3RzICAgICA9IDE7CnN0YXRpYyAgaW50ICAgb3B0aW9uX3Nob3dfc3Ryb2tlICAgPSAwOwpzdGF0aWMgIGludCAgIG9wdGlvbl9zaG93X2dseXBoICAgID0gMTsKc3RhdGljICBpbnQgICBvcHRpb25fc2hvd19ncmlkICAgICA9IDE7CnN0YXRpYyAgaW50ICAgb3B0aW9uX3Nob3dfZW0gICAgICAgPSAwOwpzdGF0aWMgIGludCAgIG9wdGlvbl9zaG93X3Ntb290aCAgID0gMTsKc3RhdGljICBpbnQgICBvcHRpb25fc2hvd19ibHVlcyAgICA9IDA7CnN0YXRpYyAgaW50ICAgb3B0aW9uX3Nob3dfZWRnZXMgICAgPSAwOwpzdGF0aWMgIGludCAgIG9wdGlvbl9zaG93X3NlZ21lbnRzID0gMTsKc3RhdGljICBpbnQgICBvcHRpb25fc2hvd19saW5rcyAgICA9IDE7CnN0YXRpYyAgaW50ICAgb3B0aW9uX3Nob3dfaW5kaWNlcyAgPSAwOwoKc3RhdGljICBpbnQgICBvcHRpb25fc2hvd19wc19oaW50cyAgID0gMTsKc3RhdGljICBpbnQgICBvcHRpb25fc2hvd19ob3J6X2hpbnRzID0gMTsKc3RhdGljICBpbnQgICBvcHRpb25fc2hvd192ZXJ0X2hpbnRzID0gMTsKCgpzdGF0aWMgIGludCAgIG9wdGlvbl9oaW50aW5nID0gMTsKCnN0YXRpYyAgY2hhciAgdGVtcF9tZXNzYWdlWzEwMjRdOwoKc3RhdGljICBOVl9QYXRoICAgc3ltYm9sX2RvdCAgICAgPSBOVUxMOwpzdGF0aWMgIE5WX1BhdGggICBzeW1ib2xfY2lyY2xlICA9IE5VTEw7CnN0YXRpYyAgTlZfUGF0aCAgIHN5bWJvbF9zcXVhcmUgID0gTlVMTDsKc3RhdGljICBOVl9QYXRoICAgc3ltYm9sX3JlY3RfaCAgPSBOVUxMOwpzdGF0aWMgIE5WX1BhdGggICBzeW1ib2xfcmVjdF92ICA9IE5VTEw7CgoKCiNkZWZpbmUgIEFYSVNfQ09MT1IgICAgICAgIDB4RkZGRjAwMDAKI2RlZmluZSAgR1JJRF9DT0xPUiAgICAgICAgMHhGRkQwRDBEMAojZGVmaW5lICBPTl9DT0xPUiAgICAgICAgICAweEZGRkYyMDAwCiNkZWZpbmUgIE9GRl9DT0xPUiAgICAgICAgIDB4RkZGRjAwODAKI2RlZmluZSAgU1RST05HX0NPTE9SICAgICAgMHhGRjQwNDA0MAojZGVmaW5lICBJTlRFUlBfQ09MT1IgICAgICAweEZGMjA2MDQwCiNkZWZpbmUgIFNNT09USF9DT0xPUiAgICAgIDB4RjAwMEIwNDAKI2RlZmluZSAgQkFDS0dST1VORF9DT0xPUiAgMHhGRkZGRkZGRgojZGVmaW5lICBURVhUX0NPTE9SICAgICAgICAweEZGMDAwMDAwCiNkZWZpbmUgIEVNX0NPTE9SICAgICAgICAgIDB4ODAwMDgwMDAKI2RlZmluZSAgQkxVRVNfVE9QX0NPTE9SICAgMHg0MDAwMDA4RgojZGVmaW5lICBCTFVFU19CT1RfQ09MT1IgICAweDQwMDA4RjAwCgojZGVmaW5lICBHSE9TVF9ISU5UX0NPTE9SICAweEUwMDAwMEZGCiNkZWZpbmUgIFNURU1fSElOVF9DT0xPUiAgIDB4RTAyMDIwRkYKI2RlZmluZSAgU1RFTV9KT0lOX0NPTE9SICAgMHhFMDIwRkYyMAoKI2RlZmluZSAgRURHRV9DT0xPUiAgICAgICAgMHhGMDcwNDA3MAojZGVmaW5lICBTRUdNRU5UX0NPTE9SICAgICAweEYwMjA2MDQwCiNkZWZpbmUgIExJTktfQ09MT1IgICAgICAgIDB4RjBGRkZGMDAKI2RlZmluZSAgU0VSSUZfTElOS19DT0xPUiAgMHhGMEZGODA4RgoKLyogcHJpbnQgbWVzc2FnZSBhbmQgYWJvcnQgcHJvZ3JhbSAqLwpzdGF0aWMgdm9pZApQYW5pYyggY29uc3QgY2hhciogIG1lc3NhZ2UgKQp7CiAgZnByaW50Ziggc3RkZXJyLCAiUEFOSUM6ICVzXG4iLCBtZXNzYWdlICk7CiAgZXhpdCgxKTsKfQoKCnN0YXRpYyB2b2lkCmluaXRfc3ltYm9scyggdm9pZCApCnsKICBudl9wYXRoX25ld19yZWN0YW5nbGUoIHJlbmRlcmVyLCAtMSwgLTEsIDMsIDMsIDAsIDAsICZzeW1ib2xfc3F1YXJlICk7CiAgbnZfcGF0aF9uZXdfcmVjdGFuZ2xlKCByZW5kZXJlciwgLTEsIC02LCAyLCAxMiwgMCwgMCwgJnN5bWJvbF9yZWN0X3YgKTsKICBudl9wYXRoX25ld19yZWN0YW5nbGUoIHJlbmRlcmVyLCAtNiwgLTEsIDEyLCAyLCAwLCAwLCAmc3ltYm9sX3JlY3RfaCApOwoKICBudl9wYXRoX25ld19jaXJjbGUoIHJlbmRlcmVyLCAwLCAwLCAzLiwgJnN5bWJvbF9kb3QgKTsKCiAgbnZfcGF0aF9zdHJva2UoIHN5bWJvbF9kb3QsIDAuNiwKICAgICAgICAgICAgICAgICAgbnZfcGF0aF9saW5lY2FwX2J1dHQsCiAgICAgICAgICAgICAgICAgIG52X3BhdGhfbGluZWpvaW5fbWl0ZXIsIDEuLAogICAgICAgICAgICAgICAgICAmc3ltYm9sX2NpcmNsZSApOwoKICBudl9wYXRoX2Rlc3Ryb3koIHN5bWJvbF9kb3QgKTsKCiAgbnZfcGF0aF9uZXdfY2lyY2xlKCByZW5kZXJlciwgMCwgMCwgMi4sICZzeW1ib2xfZG90ICk7CiB9CgpzdGF0aWMgdm9pZApkb25lX3N5bWJvbHMoIHZvaWQgKQp7CiAgbnZfcGF0aF9kZXN0cm95KCBzeW1ib2xfY2lyY2xlICk7CiAgbnZfcGF0aF9kZXN0cm95KCBzeW1ib2xfZG90ICk7CiAgbnZfcGF0aF9kZXN0cm95KCBzeW1ib2xfcmVjdF92ICk7CiAgbnZfcGF0aF9kZXN0cm95KCBzeW1ib2xfcmVjdF9oICk7CiAgbnZfcGF0aF9kZXN0cm95KCBzeW1ib2xfc3F1YXJlICk7Cn0KCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCiAvKioqKiogICAgICAgICAgICAgICAgICAgICBDT01NT04gR1JJRCBEUkFXSU5HIFJPVVRJTkVTICAgICAgICAgICAgICoqKioqLwogLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIHZvaWQKcmVzZXRfc2NhbGUoIE5WX1NjYWxlICBzY2FsZSApCnsKIC8qIGNvbXB1dGUgZm9udCB1bml0cyAtPiBncmlkIHBpeGVscyBzY2FsZSBmYWN0b3IgKi8KICBnbHlwaF9zY2FsZSA9IHRhcmdldC0+d2lkdGgqMC43NSAvIGZhY2UtPnVuaXRzX3Blcl9FTSAqIHNjYWxlOwoKIC8qIHNldHVwIGZvbnQgdW5pdHMgLT4gZ3JpZCBwaXhlbHMgdHJhbnNmb3JtICovCiAgbnZfdHJhbnNmb3JtX3NldF9zY2FsZSggJmdseXBoX3RyYW5zZm9ybSwgZ2x5cGhfc2NhbGUsIC1nbHlwaF9zY2FsZSApOwogIGdseXBoX29yZ194ID0gZ2x5cGhfdHJhbnNmb3JtLmRlbHRhLnggPSB0YXJnZXQtPndpZHRoKjAuMTI1OwogIGdseXBoX29yZ195ID0gZ2x5cGhfdHJhbnNmb3JtLmRlbHRhLnkgPSB0YXJnZXQtPmhlaWdodCowLjg3NTsKCiAvKiBzZXR1cCBzdWJwaXhlbHMgLT4gZ3JpZCBwaXhlbHMgdHJhbnNmb3JtICovCiAgbnZfdHJhbnNmb3JtX3NldF9zY2FsZSggJnNpemVfdHJhbnNmb3JtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhfc2NhbGUvbnZfZnJvbWZpeGVkKGZhY2UtPnNpemUtPm1ldHJpY3MueF9zY2FsZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgLSBnbHlwaF9zY2FsZS9udl9mcm9tZml4ZWQoZmFjZS0+c2l6ZS0+bWV0cmljcy55X3NjYWxlKSApOwoKICBzaXplX3RyYW5zZm9ybS5kZWx0YSA9IGdseXBoX3RyYW5zZm9ybS5kZWx0YTsKfQoKCnN0YXRpYyB2b2lkCnJlc2V0X3NpemUoIGludCAgcGl4ZWxfc2l6ZSwgTlZfU2NhbGUgIHNjYWxlICkKewogIEZUX1NldF9QaXhlbF9TaXplcyggZmFjZSwgcGl4ZWxfc2l6ZSwgcGl4ZWxfc2l6ZSApOwogIHJlc2V0X3NjYWxlKCBzY2FsZSApOwp9CgoKc3RhdGljIHZvaWQKY2xlYXJfYmFja2dyb3VuZCggdm9pZCApCnsKICBudl9waXhtYXBfZmlsbF9yZWN0KCB0YXJnZXQsIDAsIDAsIHRhcmdldC0+d2lkdGgsIHRhcmdldC0+aGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgIEJBQ0tHUk9VTkRfQ09MT1IgKTsKfQoKCnN0YXRpYyB2b2lkCmRyYXdfZ3JpZCggdm9pZCApCnsKICBpbnQgIHggPSAoaW50KWdseXBoX29yZ194OwogIGludCAgeSA9IChpbnQpZ2x5cGhfb3JnX3k7CgogIC8qIGRyYXcgZ3JpZCAqLwogIGlmICggb3B0aW9uX3Nob3dfZ3JpZCApCiAgewogICAgTlZfU2NhbGUgIG1pbiwgbWF4LCB4LCBzdGVwOwoKICAgIC8qIGRyYXcgdmVydGljYWwgZ3JpZCBiYXJzICovCiAgICBzdGVwID0gNjQuICogc2l6ZV90cmFuc2Zvcm0ubWF0cml4Lnh4OwogICAgaWYgKHN0ZXAgPiAxLikKICAgIHsKICAgICAgbWluICA9IG1heCA9IGdseXBoX29yZ194OwogICAgICB3aGlsZSAoIG1pbiAtIHN0ZXAgPj0gMCApICAgICAgICAgICAgIG1pbiAtPSBzdGVwOwogICAgICB3aGlsZSAoIG1heCArIHN0ZXAgPCB0YXJnZXQtPndpZHRoICkgIG1heCArPSBzdGVwOwoKICAgICAgZm9yICggeCA9IG1pbjsgeCA8PSBtYXg7IHggKz0gc3RlcCApCiAgICAgICAgbnZfcGl4bWFwX2ZpbGxfcmVjdCggdGFyZ2V0LCAoTlZfSW50KSh4Ky41KSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCB0YXJnZXQtPmhlaWdodCwgR1JJRF9DT0xPUiApOwogICAgfQoKICAgIC8qIGRyYXcgaG9yaXpvbnRhbCBncmlkIGJhcnMgKi8KICAgIHN0ZXAgPSAtNjQuICogc2l6ZV90cmFuc2Zvcm0ubWF0cml4Lnl5OwogICAgaWYgKHN0ZXAgPiAxLikKICAgIHsKICAgICAgbWluICA9IG1heCA9IGdseXBoX29yZ195OwogICAgICB3aGlsZSAoIG1pbiAtIHN0ZXAgPj0gMCApICAgICAgICAgICAgICBtaW4gLT0gc3RlcDsKICAgICAgd2hpbGUgKCBtYXggKyBzdGVwIDwgdGFyZ2V0LT5oZWlnaHQgKSAgbWF4ICs9IHN0ZXA7CgogICAgICBmb3IgKCB4ID0gbWluOyB4IDw9IG1heDsgeCArPSBzdGVwICkKICAgICAgICBudl9waXhtYXBfZmlsbF9yZWN0KCB0YXJnZXQsIDAsIChOVl9JbnQpKHgrLjUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC0+d2lkdGgsIDEsIEdSSURfQ09MT1IgKTsKICAgIH0KICB9CgogIC8qIGRyYXcgYXhpcyAqLwogIGlmICggb3B0aW9uX3Nob3dfYXhpcyApCiAgewogICAgbnZfcGl4bWFwX2ZpbGxfcmVjdCggdGFyZ2V0LCB4LCAwLCAxLCB0YXJnZXQtPmhlaWdodCwgQVhJU19DT0xPUiApOwogICAgbnZfcGl4bWFwX2ZpbGxfcmVjdCggdGFyZ2V0LCAwLCB5LCB0YXJnZXQtPndpZHRoLCAxLCBBWElTX0NPTE9SICk7CiAgfQoKICBpZiAoIG9wdGlvbl9zaG93X2VtICkKICB7CiAgICBOVl9QYXRoICBwYXRoOwogICAgTlZfUGF0aCAgc3Ryb2tlOwogICAgTlZfVUludCAgdW5pdHMgPSAoTlZfVUludClmYWNlLT51bml0c19wZXJfRU07CgogICAgbnZfcGF0aF9uZXdfcmVjdGFuZ2xlKCByZW5kZXJlciwgMCwgMCwgdW5pdHMsIHVuaXRzLCAwLCAwLCAmcGF0aCApOwogICAgbnZfcGF0aF90cmFuc2Zvcm0oIHBhdGgsICZnbHlwaF90cmFuc2Zvcm0gKTsKCiAgICBudl9wYXRoX3N0cm9rZSggcGF0aCwgMS41LCBudl9wYXRoX2xpbmVjYXBfYnV0dCwgbnZfcGF0aF9saW5lam9pbl9taXRlciwKICAgICAgICAgICAgICAgICAgICA0LjAsICZzdHJva2UgKTsKCiAgICBudl9wYWludGVyX3NldF9jb2xvciggcGFpbnRlciwgRU1fQ09MT1IsIDI1NiApOwogICAgbnZfcGFpbnRlcl9maWxsX3BhdGgoIHBhaW50ZXIsIE5VTEwsIDAsIHN0cm9rZSApOwoKICAgIG52X3BhdGhfZGVzdHJveSggc3Ryb2tlICk7CiAgICBudl9wYXRoX2Rlc3Ryb3koIHBhdGggKTsKICB9Cgp9CgoKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KIC8qKioqKiAgICAgICAgICAgIFBPU1RTQ1JJUFQgR0xPQkFMUyBST1VUSU5FUyAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCiAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaW5jbHVkZSA8Li4vc3JjL3BzaGludGVyL3BzaGdsb2IuaD4KCnN0YXRpYyB2b2lkCmRyYXdfcHNfYmx1ZV96b25lcyggdm9pZCApCnsKICBpZiAoIG9wdGlvbl9zaG93X2JsdWVzICYmIHBzX2RlYnVnX2dsb2JhbHMgKQogIHsKICAgIFBTSF9CbHVlcyAgICAgICBibHVlcyA9ICZwc19kZWJ1Z19nbG9iYWxzLT5ibHVlczsKICAgIFBTSF9CbHVlX1RhYmxlICB0YWJsZTsKICAgIE5WX1ZlY3RvciAgICAgICB2OwogICAgRlRfSW50ICAgICAgICAgIHkxLCB5MjsKICAgIEZUX1VJbnQgICAgICAgICBjb3VudDsKICAgIFBTSF9CbHVlX1pvbmUgICB6b25lOwoKICAgIC8qIGRyYXcgdG9wIHpvbmVzICovCiAgICB0YWJsZSA9ICZibHVlcy0+bm9ybWFsX3RvcDsKICAgIGNvdW50ID0gdGFibGUtPmNvdW50OwogICAgem9uZSAgPSB0YWJsZS0+em9uZXM7CgogICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIHpvbmUrKyApCiAgICB7CiAgICAgIHYueCA9IDA7CiAgICAgIGlmICggIXBzX2RlYnVnX25vX2hvcnpfaGludHMgKQogICAgICB7CiAgICAgICAgdi55ID0gem9uZS0+Y3VyX3JlZiArIHpvbmUtPmN1cl9kZWx0YTsKICAgICAgICBudl92ZWN0b3JfdHJhbnNmb3JtKCAmdiwgJnNpemVfdHJhbnNmb3JtICk7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgdi55ID0gem9uZS0+b3JnX3JlZiArIHpvbmUtPm9yZ19kZWx0YTsKICAgICAgICBudl92ZWN0b3JfdHJhbnNmb3JtKCAmdiwgJmdseXBoX3RyYW5zZm9ybSApOwogICAgICB9CiAgICAgIHkxICA9IChpbnQpKHYueSArIDAuNSk7CgogICAgICB2LnggPSAwOwogICAgICBpZiAoICFwc19kZWJ1Z19ub19ob3J6X2hpbnRzICkKICAgICAgewogICAgICAgIHYueSA9IHpvbmUtPmN1cl9yZWY7CiAgICAgICAgbnZfdmVjdG9yX3RyYW5zZm9ybSggJnYsICZzaXplX3RyYW5zZm9ybSApOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIHYueSA9IHpvbmUtPm9yZ19yZWY7CiAgICAgICAgbnZfdmVjdG9yX3RyYW5zZm9ybSggJnYsICZnbHlwaF90cmFuc2Zvcm0gKTsKICAgICAgfQogICAgICB5MiA9IChpbnQpKHYueSArIDAuNSk7CgogICAgICBudl9waXhtYXBfZmlsbF9yZWN0KCB0YXJnZXQsIDAsIHkxLAogICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQtPndpZHRoLCB5Mi15MSsxLAogICAgICAgICAgICAgICAgICAgICAgICAgICBCTFVFU19UT1BfQ09MT1IgKTsKCiNpZiAwCiAgICAgIHByaW50ZiggInRvcCBbJS4zZiAlLjNmXVxuIiwgem9uZS0+Y3VyX2JvdHRvbS82NC4wLCB6b25lLT5jdXJfdG9wLzY0LjAgKTsKI2VuZGlmCiAgICB9CgoKICAgIC8qIGRyYXcgYm90dG9tIHpvbmVzICovCiAgICB0YWJsZSA9ICZibHVlcy0+bm9ybWFsX2JvdHRvbTsKICAgIGNvdW50ID0gdGFibGUtPmNvdW50OwogICAgem9uZSAgPSB0YWJsZS0+em9uZXM7CgogICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIHpvbmUrKyApCiAgICB7CiAgICAgIHYueCA9IDA7CiAgICAgIHYueSA9IHpvbmUtPmN1cl9yZWY7CiAgICAgIG52X3ZlY3Rvcl90cmFuc2Zvcm0oICZ2LCAmc2l6ZV90cmFuc2Zvcm0gKTsKICAgICAgeTEgID0gKGludCkodi55ICsgMC41KTsKCiAgICAgIHYueCA9IDA7CiAgICAgIHYueSA9IHpvbmUtPmN1cl9yZWYgKyB6b25lLT5jdXJfZGVsdGE7CiAgICAgIG52X3ZlY3Rvcl90cmFuc2Zvcm0oICZ2LCAmc2l6ZV90cmFuc2Zvcm0gKTsKICAgICAgeTIgPSAoaW50KSh2LnkgKyAwLjUpOwoKICAgICAgbnZfcGl4bWFwX2ZpbGxfcmVjdCggdGFyZ2V0LCAwLCB5MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LT53aWR0aCwgeTIteTErMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgQkxVRVNfQk9UX0NPTE9SICk7CgojaWYgMAogICAgICBwcmludGYoICJib3QgWyUuM2YgJS4zZl1cbiIsIHpvbmUtPmN1cl9ib3R0b20vNjQuMCwgem9uZS0+Y3VyX3RvcC82NC4wICk7CiNlbmRpZgogICAgfQogIH0KfQoKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KIC8qKioqKiAgICAgICAgICAgIFBPU1RTQ1JJUFQgSElOVEVSIEFMR09SSVRITSAxIFJPVVRJTkVTICAgICAgICAgICAgKioqKiovCiAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaW5jbHVkZSA8Li4vc3JjL3BzaGludGVyL3BzaGFsZ28xLmg+CgpzdGF0aWMgaW50IHBzaGludF9jcG9zICAgICA9IDA7CnN0YXRpYyBpbnQgcHNoaW50X3ZlcnRpY2FsID0gLTE7CgpzdGF0aWMgdm9pZApkcmF3X3BzMV9oaW50KCBQU0gxX0hpbnQgICBoaW50LCBGVF9Cb29sICB2ZXJ0aWNhbCApCnsKICBpbnQgICAgICAgIHgxLCB4MjsKICBOVl9WZWN0b3IgIHY7CgoKICBpZiAoIHBzaGludF92ZXJ0aWNhbCAhPSB2ZXJ0aWNhbCApCiAgewogICAgaWYgKHZlcnRpY2FsKQogICAgICBwc2hpbnRfY3BvcyA9IDQwOwogICAgZWxzZQogICAgICBwc2hpbnRfY3BvcyA9IDEwOwoKICAgIHBzaGludF92ZXJ0aWNhbCA9IHZlcnRpY2FsOwogIH0KCiAgaWYgKHZlcnRpY2FsKQogIHsKICAgIGlmICggIW9wdGlvbl9zaG93X3ZlcnRfaGludHMgKQogICAgICByZXR1cm47CgogICAgdi54ID0gaGludC0+Y3VyX3BvczsKICAgIHYueSA9IDA7CiAgICBudl92ZWN0b3JfdHJhbnNmb3JtKCAmdiwgJnNpemVfdHJhbnNmb3JtICk7CiAgICB4MSA9IChpbnQpKHYueCArIDAuNSk7CgogICAgdi54ID0gaGludC0+Y3VyX3BvcyArIGhpbnQtPmN1cl9sZW47CiAgICB2LnkgPSAwOwogICAgbnZfdmVjdG9yX3RyYW5zZm9ybSggJnYsICZzaXplX3RyYW5zZm9ybSApOwogICAgeDIgPSAoaW50KSh2LnggKyAwLjUpOwoKICAgIG52X3BpeG1hcF9maWxsX3JlY3QoIHRhcmdldCwgeDEsIDAsIDEsIHRhcmdldC0+aGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgcHNoMV9oaW50X2lzX2dob3N0KGhpbnQpCiAgICAgICAgICAgICAgICAgICAgICAgICA/IEdIT1NUX0hJTlRfQ09MT1IgOiBTVEVNX0hJTlRfQ09MT1IgKTsKCiAgICBpZiAoIHBzaDFfaGludF9pc19naG9zdChoaW50KSApCiAgICB7CiAgICAgIHgxIC0tOwogICAgICB4MiA9IHgxICsgMjsKICAgIH0KICAgIGVsc2UKICAgICAgbnZfcGl4bWFwX2ZpbGxfcmVjdCggdGFyZ2V0LCB4MiwgMCwgMSwgdGFyZ2V0LT5oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzaDFfaGludF9pc19naG9zdChoaW50KQogICAgICAgICAgICAgICAgICAgICAgICAgICA/IEdIT1NUX0hJTlRfQ09MT1IgOiBTVEVNX0hJTlRfQ09MT1IgKTsKCiAgICBudl9waXhtYXBfZmlsbF9yZWN0KCB0YXJnZXQsIHgxLCBwc2hpbnRfY3BvcywgeDIrMS14MSwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgIFNURU1fSk9JTl9DT0xPUiApOwogIH0KICBlbHNlCiAgewogICAgaWYgKCFvcHRpb25fc2hvd19ob3J6X2hpbnRzKQogICAgICByZXR1cm47CgogICAgdi55ID0gaGludC0+Y3VyX3BvczsKICAgIHYueCA9IDA7CiAgICBudl92ZWN0b3JfdHJhbnNmb3JtKCAmdiwgJnNpemVfdHJhbnNmb3JtICk7CiAgICB4MSA9IChpbnQpKHYueSArIDAuNSk7CgogICAgdi55ID0gaGludC0+Y3VyX3BvcyArIGhpbnQtPmN1cl9sZW47CiAgICB2LnggPSAwOwogICAgbnZfdmVjdG9yX3RyYW5zZm9ybSggJnYsICZzaXplX3RyYW5zZm9ybSApOwogICAgeDIgPSAoaW50KSh2LnkgKyAwLjUpOwoKICAgIG52X3BpeG1hcF9maWxsX3JlY3QoIHRhcmdldCwgMCwgeDEsIHRhcmdldC0+d2lkdGgsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICBwc2gxX2hpbnRfaXNfZ2hvc3QoaGludCkKICAgICAgICAgICAgICAgICAgICAgICAgID8gR0hPU1RfSElOVF9DT0xPUiA6IFNURU1fSElOVF9DT0xPUiApOwoKICAgIGlmICggcHNoMV9oaW50X2lzX2dob3N0KGhpbnQpICkKICAgIHsKICAgICAgeDEgLS07CiAgICAgIHgyID0geDEgKyAyOwogICAgfQogICAgZWxzZQogICAgICBudl9waXhtYXBfZmlsbF9yZWN0KCB0YXJnZXQsIDAsIHgyLCB0YXJnZXQtPndpZHRoLCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwc2gxX2hpbnRfaXNfZ2hvc3QoaGludCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBHSE9TVF9ISU5UX0NPTE9SIDogU1RFTV9ISU5UX0NPTE9SICk7CgogICAgbnZfcGl4bWFwX2ZpbGxfcmVjdCggdGFyZ2V0LCBwc2hpbnRfY3BvcywgeDIsIDEsIHgxKzEteDIsCiAgICAgICAgICAgICAgICAgICAgICAgICBTVEVNX0pPSU5fQ09MT1IgKTsKICB9CgojaWYgMAogIHByaW50ZiggIlslNy4zZiAlNy4zZl0gJWNcbiIsIGhpbnQtPmN1cl9wb3MvNjQuMCwgKGhpbnQtPmN1cl9wb3MraGludC0+Y3VyX2xlbikvNjQuMCwgdmVydGljYWwgPyAndicgOiAnaCcgKTsKI2VuZGlmCgogIHBzaGludF9jcG9zICs9IDEwOwp9CgoKCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCiAvKioqKiogICAgICAgICAgICBQT1NUU0NSSVBUIEhJTlRFUiBBTEdPUklUSE0gMiBST1VUSU5FUyAgICAgICAgICAgICoqKioqLwogLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgPC4uL3NyYy9wc2hpbnRlci9wc2hhbGdvMi5oPgoKc3RhdGljIHZvaWQKZHJhd19wczJfaGludCggUFNIMl9IaW50ICAgaGludCwgRlRfQm9vbCAgdmVydGljYWwgKQp7CiAgaW50ICAgICAgICB4MSwgeDI7CiAgTlZfVmVjdG9yICB2OwoKICBpZiAoIHBzaGludF92ZXJ0aWNhbCAhPSB2ZXJ0aWNhbCApCiAgewogICAgaWYgKHZlcnRpY2FsKQogICAgICBwc2hpbnRfY3BvcyA9IDQwOwogICAgZWxzZQogICAgICBwc2hpbnRfY3BvcyA9IDEwOwoKICAgIHBzaGludF92ZXJ0aWNhbCA9IHZlcnRpY2FsOwogIH0KCiAgaWYgKHZlcnRpY2FsKQogIHsKICAgIGlmICggIW9wdGlvbl9zaG93X3ZlcnRfaGludHMgKQogICAgICByZXR1cm47CgogICAgdi54ID0gaGludC0+Y3VyX3BvczsKICAgIHYueSA9IDA7CiAgICBudl92ZWN0b3JfdHJhbnNmb3JtKCAmdiwgJnNpemVfdHJhbnNmb3JtICk7CiAgICB4MSA9IChpbnQpKHYueCArIDAuNSk7CgogICAgdi54ID0gaGludC0+Y3VyX3BvcyArIGhpbnQtPmN1cl9sZW47CiAgICB2LnkgPSAwOwogICAgbnZfdmVjdG9yX3RyYW5zZm9ybSggJnYsICZzaXplX3RyYW5zZm9ybSApOwogICAgeDIgPSAoaW50KSh2LnggKyAwLjUpOwoKICAgIG52X3BpeG1hcF9maWxsX3JlY3QoIHRhcmdldCwgeDEsIDAsIDEsIHRhcmdldC0+aGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgcHNoMl9oaW50X2lzX2dob3N0KGhpbnQpCiAgICAgICAgICAgICAgICAgICAgICAgICA/IEdIT1NUX0hJTlRfQ09MT1IgOiBTVEVNX0hJTlRfQ09MT1IgKTsKCiAgICBpZiAoIHBzaDJfaGludF9pc19naG9zdChoaW50KSApCiAgICB7CiAgICAgIHgxIC0tOwogICAgICB4MiA9IHgxICsgMjsKICAgIH0KICAgIGVsc2UKICAgICAgbnZfcGl4bWFwX2ZpbGxfcmVjdCggdGFyZ2V0LCB4MiwgMCwgMSwgdGFyZ2V0LT5oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzaDJfaGludF9pc19naG9zdChoaW50KQogICAgICAgICAgICAgICAgICAgICAgICAgICA/IEdIT1NUX0hJTlRfQ09MT1IgOiBTVEVNX0hJTlRfQ09MT1IgKTsKCiAgICBudl9waXhtYXBfZmlsbF9yZWN0KCB0YXJnZXQsIHgxLCBwc2hpbnRfY3BvcywgeDIrMS14MSwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgIFNURU1fSk9JTl9DT0xPUiApOwogIH0KICBlbHNlCiAgewogICAgaWYgKCFvcHRpb25fc2hvd19ob3J6X2hpbnRzKQogICAgICByZXR1cm47CgogICAgdi55ID0gaGludC0+Y3VyX3BvczsKICAgIHYueCA9IDA7CiAgICBudl92ZWN0b3JfdHJhbnNmb3JtKCAmdiwgJnNpemVfdHJhbnNmb3JtICk7CiAgICB4MSA9IChpbnQpKHYueSArIDAuNSk7CgogICAgdi55ID0gaGludC0+Y3VyX3BvcyArIGhpbnQtPmN1cl9sZW47CiAgICB2LnggPSAwOwogICAgbnZfdmVjdG9yX3RyYW5zZm9ybSggJnYsICZzaXplX3RyYW5zZm9ybSApOwogICAgeDIgPSAoaW50KSh2LnkgKyAwLjUpOwoKICAgIG52X3BpeG1hcF9maWxsX3JlY3QoIHRhcmdldCwgMCwgeDEsIHRhcmdldC0+d2lkdGgsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICBwc2gyX2hpbnRfaXNfZ2hvc3QoaGludCkKICAgICAgICAgICAgICAgICAgICAgICAgID8gR0hPU1RfSElOVF9DT0xPUiA6IFNURU1fSElOVF9DT0xPUiApOwoKICAgIGlmICggcHNoMl9oaW50X2lzX2dob3N0KGhpbnQpICkKICAgIHsKICAgICAgeDEgLS07CiAgICAgIHgyID0geDEgKyAyOwogICAgfQogICAgZWxzZQogICAgICBudl9waXhtYXBfZmlsbF9yZWN0KCB0YXJnZXQsIDAsIHgyLCB0YXJnZXQtPndpZHRoLCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwc2gyX2hpbnRfaXNfZ2hvc3QoaGludCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBHSE9TVF9ISU5UX0NPTE9SIDogU1RFTV9ISU5UX0NPTE9SICk7CgogICAgbnZfcGl4bWFwX2ZpbGxfcmVjdCggdGFyZ2V0LCBwc2hpbnRfY3BvcywgeDIsIDEsIHgxKzEteDIsCiAgICAgICAgICAgICAgICAgICAgICAgICBTVEVNX0pPSU5fQ09MT1IgKTsKICB9CgojaWYgMAogIHByaW50ZiggIlslNy4zZiAlNy4zZl0gJWNcbiIsIGhpbnQtPmN1cl9wb3MvNjQuMCwgKGhpbnQtPmN1cl9wb3MraGludC0+Y3VyX2xlbikvNjQuMCwgdmVydGljYWwgPyAndicgOiAnaCcgKTsKI2VuZGlmCgogIHBzaGludF9jcG9zICs9IDEwOwp9CgoKc3RhdGljIHZvaWQKcHMyX2RyYXdfY29udHJvbF9wb2ludHMoIHZvaWQgKQp7CiAgaWYgKCBwczJfZGVidWdfZ2x5cGggKQogIHsKICAgIFBTSDJfR2x5cGggICAgZ2x5cGggPSBwczJfZGVidWdfZ2x5cGg7CiAgICBQU0gyX1BvaW50ICAgIHBvaW50ID0gZ2x5cGgtPnBvaW50czsKICAgIEZUX1VJbnQgICAgICAgY291bnQgPSBnbHlwaC0+bnVtX3BvaW50czsKICAgIE5WX1RyYW5zZm9ybSAgdHJhbnNmb3JtLCAqdHJhbnMgPSAmdHJhbnNmb3JtOwogICAgTlZfUGF0aCAgICAgICB2ZXJ0X3JlY3Q7CiAgICBOVl9QYXRoICAgICAgIGhvcnpfcmVjdDsKICAgIE5WX1BhdGggICAgICAgZG90LCBjaXJjbGU7CgogICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIHBvaW50KysgKQogICAgewogICAgICBOVl9WZWN0b3IgIHZlYzsKCiAgICAgIHZlYy54ID0gcG9pbnQtPmN1cl94OwogICAgICB2ZWMueSA9IHBvaW50LT5jdXJfeTsKICAgICAgbnZfdmVjdG9yX3RyYW5zZm9ybSggJnZlYywgJnNpemVfdHJhbnNmb3JtICk7CgogICAgICBudl90cmFuc2Zvcm1fc2V0X3RyYW5zbGF0ZSggdHJhbnMsIHZlYy54LCB2ZWMueSApOwoKICAgICAgaWYgKCBvcHRpb25fc2hvd19zbW9vdGggJiYgIXBzaDJfcG9pbnRfaXNfc21vb3RoKHBvaW50KSApCiAgICAgIHsKICAgICAgICBudl9wYWludGVyX3NldF9jb2xvciggcGFpbnRlciwgU01PT1RIX0NPTE9SLCAyNTYgKTsKICAgICAgICBudl9wYWludGVyX2ZpbGxfcGF0aCggcGFpbnRlciwgdHJhbnMsIDAsIHN5bWJvbF9jaXJjbGUgKTsKICAgICAgfQoKICAgICAgaWYgKG9wdGlvbl9zaG93X2hvcnpfaGludHMpCiAgICAgIHsKICAgICAgICBpZiAoIHBvaW50LT5mbGFnc195ICYgUFNIMl9QT0lOVF9TVFJPTkcgKQogICAgICAgIHsKICAgICAgICAgIG52X3BhaW50ZXJfc2V0X2NvbG9yKCBwYWludGVyLCBTVFJPTkdfQ09MT1IsIDI1NiApOwogICAgICAgICAgbnZfcGFpbnRlcl9maWxsX3BhdGgoIHBhaW50ZXIsIHRyYW5zLCAwLCBzeW1ib2xfcmVjdF9oICk7CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAob3B0aW9uX3Nob3dfdmVydF9oaW50cykKICAgICAgewogICAgICAgIGlmICggcG9pbnQtPmZsYWdzX3ggJiBQU0gyX1BPSU5UX1NUUk9ORyApCiAgICAgICAgewogICAgICAgICAgbnZfcGFpbnRlcl9zZXRfY29sb3IoIHBhaW50ZXIsIFNUUk9OR19DT0xPUiwgMjU2ICk7CiAgICAgICAgICBudl9wYWludGVyX2ZpbGxfcGF0aCggcGFpbnRlciwgdHJhbnMsIDAsIHN5bWJvbF9yZWN0X3YgKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn0KCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCiAvKioqKiogICAgICAgICAgICBQT1NUU0NSSVBUIEhJTlRFUiBBTEdPUklUSE0gMyBST1VUSU5FUyAgICAgICAgICAgICoqKioqLwogLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgPC4uL3NyYy9wc2hpbnRlci9wc2hhbGdvMy5oPgoKc3RhdGljIHZvaWQKZHJhd19wczNfaGludCggUFNIM19IaW50ICAgaGludCwgRlRfQm9vbCAgdmVydGljYWwgKQp7CiAgaW50ICAgICAgICB4MSwgeDI7CiAgTlZfVmVjdG9yICB2OwoKICBpZiAoIHBzaGludF92ZXJ0aWNhbCAhPSB2ZXJ0aWNhbCApCiAgewogICAgaWYgKHZlcnRpY2FsKQogICAgICBwc2hpbnRfY3BvcyA9IDQwOwogICAgZWxzZQogICAgICBwc2hpbnRfY3BvcyA9IDEwOwoKICAgIHBzaGludF92ZXJ0aWNhbCA9IHZlcnRpY2FsOwogIH0KCiAgaWYgKCF2ZXJ0aWNhbCkKICB7CiAgICBpZiAoICFvcHRpb25fc2hvd192ZXJ0X2hpbnRzICkKICAgICAgcmV0dXJuOwoKICAgIHYueCA9IGhpbnQtPmN1cl9wb3M7CiAgICB2LnkgPSAwOwogICAgbnZfdmVjdG9yX3RyYW5zZm9ybSggJnYsICZzaXplX3RyYW5zZm9ybSApOwogICAgeDEgPSAoaW50KSh2LnggKyAwLjUpOwoKICAgIHYueCA9IGhpbnQtPmN1cl9wb3MgKyBoaW50LT5jdXJfbGVuOwogICAgdi55ID0gMDsKICAgIG52X3ZlY3Rvcl90cmFuc2Zvcm0oICZ2LCAmc2l6ZV90cmFuc2Zvcm0gKTsKICAgIHgyID0gKGludCkodi54ICsgMC41KTsKCiAgICBudl9waXhtYXBfZmlsbF9yZWN0KCB0YXJnZXQsIHgxLCAwLCAxLCB0YXJnZXQtPmhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgIHBzaDNfaGludF9pc19naG9zdChoaW50KQogICAgICAgICAgICAgICAgICAgICAgICAgPyBHSE9TVF9ISU5UX0NPTE9SIDogU1RFTV9ISU5UX0NPTE9SICk7CgogICAgaWYgKCBwc2gzX2hpbnRfaXNfZ2hvc3QoaGludCkgKQogICAgewogICAgICB4MSAtLTsKICAgICAgeDIgPSB4MSArIDI7CiAgICB9CiAgICBlbHNlCiAgICAgIG52X3BpeG1hcF9maWxsX3JlY3QoIHRhcmdldCwgeDIsIDAsIDEsIHRhcmdldC0+aGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBwc2gzX2hpbnRfaXNfZ2hvc3QoaGludCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBHSE9TVF9ISU5UX0NPTE9SIDogU1RFTV9ISU5UX0NPTE9SICk7CgogICAgbnZfcGl4bWFwX2ZpbGxfcmVjdCggdGFyZ2V0LCB4MSwgcHNoaW50X2Nwb3MsIHgyKzEteDEsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICBTVEVNX0pPSU5fQ09MT1IgKTsKICB9CiAgZWxzZQogIHsKICAgIGlmICghb3B0aW9uX3Nob3dfaG9yel9oaW50cykKICAgICAgcmV0dXJuOwoKICAgIHYueSA9IGhpbnQtPmN1cl9wb3M7CiAgICB2LnggPSAwOwogICAgbnZfdmVjdG9yX3RyYW5zZm9ybSggJnYsICZzaXplX3RyYW5zZm9ybSApOwogICAgeDEgPSAoaW50KSh2LnkgKyAwLjUpOwoKICAgIHYueSA9IGhpbnQtPmN1cl9wb3MgKyBoaW50LT5jdXJfbGVuOwogICAgdi54ID0gMDsKICAgIG52X3ZlY3Rvcl90cmFuc2Zvcm0oICZ2LCAmc2l6ZV90cmFuc2Zvcm0gKTsKICAgIHgyID0gKGludCkodi55ICsgMC41KTsKCiAgICBudl9waXhtYXBfZmlsbF9yZWN0KCB0YXJnZXQsIDAsIHgxLCB0YXJnZXQtPndpZHRoLCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgcHNoM19oaW50X2lzX2dob3N0KGhpbnQpCiAgICAgICAgICAgICAgICAgICAgICAgICA/IEdIT1NUX0hJTlRfQ09MT1IgOiBTVEVNX0hJTlRfQ09MT1IgKTsKCiAgICBpZiAoIHBzaDNfaGludF9pc19naG9zdChoaW50KSApCiAgICB7CiAgICAgIHgxIC0tOwogICAgICB4MiA9IHgxICsgMjsKICAgIH0KICAgIGVsc2UKICAgICAgbnZfcGl4bWFwX2ZpbGxfcmVjdCggdGFyZ2V0LCAwLCB4MiwgdGFyZ2V0LT53aWR0aCwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNoM19oaW50X2lzX2dob3N0KGhpbnQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgID8gR0hPU1RfSElOVF9DT0xPUiA6IFNURU1fSElOVF9DT0xPUiApOwoKICAgIG52X3BpeG1hcF9maWxsX3JlY3QoIHRhcmdldCwgcHNoaW50X2Nwb3MsIHgyLCAxLCB4MSsxLXgyLAogICAgICAgICAgICAgICAgICAgICAgICAgU1RFTV9KT0lOX0NPTE9SICk7CiAgfQoKI2lmIDAKICBwcmludGYoICJbJTcuM2YgJTcuM2ZdICVjXG4iLCBoaW50LT5jdXJfcG9zLzY0LjAsIChoaW50LT5jdXJfcG9zK2hpbnQtPmN1cl9sZW4pLzY0LjAsIHZlcnRpY2FsID8gJ3YnIDogJ2gnICk7CiNlbmRpZgoKICBwc2hpbnRfY3BvcyArPSAxMDsKfQoKCnN0YXRpYyB2b2lkCnBzM19kcmF3X2NvbnRyb2xfcG9pbnRzKCB2b2lkICkKewogIGlmICggcHMzX2RlYnVnX2dseXBoICkKICB7CiAgICBQU0gzX0dseXBoICAgIGdseXBoID0gcHMzX2RlYnVnX2dseXBoOwogICAgUFNIM19Qb2ludCAgICBwb2ludCA9IGdseXBoLT5wb2ludHM7CiAgICBGVF9VSW50ICAgICAgIGNvdW50ID0gZ2x5cGgtPm51bV9wb2ludHM7CiAgICBOVl9UcmFuc2Zvcm0gIHRyYW5zZm9ybSwgKnRyYW5zID0gJnRyYW5zZm9ybTsKICAgIE5WX1BhdGggICAgICAgdmVydF9yZWN0OwogICAgTlZfUGF0aCAgICAgICBob3J6X3JlY3Q7CiAgICBOVl9QYXRoICAgICAgIGRvdCwgY2lyY2xlOwoKICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBwb2ludCsrICkKICAgIHsKICAgICAgTlZfVmVjdG9yICB2ZWM7CgogICAgICB2ZWMueCA9IHBvaW50LT5jdXJfeDsKICAgICAgdmVjLnkgPSBwb2ludC0+Y3VyX3k7CiAgICAgIG52X3ZlY3Rvcl90cmFuc2Zvcm0oICZ2ZWMsICZzaXplX3RyYW5zZm9ybSApOwoKICAgICAgbnZfdHJhbnNmb3JtX3NldF90cmFuc2xhdGUoIHRyYW5zLCB2ZWMueCwgdmVjLnkgKTsKCiAgICAgIGlmICggb3B0aW9uX3Nob3dfc21vb3RoICYmICFwc2gzX3BvaW50X2lzX3Ntb290aChwb2ludCkgKQogICAgICB7CiAgICAgICAgbnZfcGFpbnRlcl9zZXRfY29sb3IoIHBhaW50ZXIsIFNNT09USF9DT0xPUiwgMjU2ICk7CiAgICAgICAgbnZfcGFpbnRlcl9maWxsX3BhdGgoIHBhaW50ZXIsIHRyYW5zLCAwLCBzeW1ib2xfY2lyY2xlICk7CiAgICAgIH0KCiAgICAgIGlmIChvcHRpb25fc2hvd19ob3J6X2hpbnRzKQogICAgICB7CiAgICAgICAgaWYgKCBwb2ludC0+ZmxhZ3NfeSAmIFBTSDNfUE9JTlRfU1RST05HICkKICAgICAgICB7CiAgICAgICAgICBudl9wYWludGVyX3NldF9jb2xvciggcGFpbnRlciwgU1RST05HX0NPTE9SLCAyNTYgKTsKICAgICAgICAgIG52X3BhaW50ZXJfZmlsbF9wYXRoKCBwYWludGVyLCB0cmFucywgMCwgc3ltYm9sX3JlY3RfaCApOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKG9wdGlvbl9zaG93X3ZlcnRfaGludHMpCiAgICAgIHsKICAgICAgICBpZiAoIHBvaW50LT5mbGFnc194ICYgUFNIM19QT0lOVF9TVFJPTkcgKQogICAgICAgIHsKICAgICAgICAgIG52X3BhaW50ZXJfc2V0X2NvbG9yKCBwYWludGVyLCBTVFJPTkdfQ09MT1IsIDI1NiApOwogICAgICAgICAgbnZfcGFpbnRlcl9maWxsX3BhdGgoIHBhaW50ZXIsIHRyYW5zLCAwLCBzeW1ib2xfcmVjdF92ICk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9CgoKc3RhdGljIHZvaWQKcHNfcHJpbnRfaGludHMoIHZvaWQgKQp7CiAgaWYgKCBwc19kZWJ1Z19oaW50cyApCiAgewogICAgRlRfSW50ICAgICAgICAgZGltZW5zaW9uOwogICAgUFNIX0RpbWVuc2lvbiAgZGltOwoKICAgIGZvciAoIGRpbWVuc2lvbiA9IDE7IGRpbWVuc2lvbiA+PSAwOyBkaW1lbnNpb24tLSApCiAgICB7CiAgICAgIFBTX0RpbWVuc2lvbiAgZGltICAgPSAmcHNfZGVidWdfaGludHMtPmRpbWVuc2lvblsgZGltZW5zaW9uIF07CiAgICAgIFBTX01hc2sgICAgICAgbWFzayAgPSBkaW0tPm1hc2tzLm1hc2tzOwogICAgICBGVF9VSW50ICAgICAgIGNvdW50ID0gZGltLT5tYXNrcy5udW1fbWFza3M7CgogICAgICBwcmludGYoICIlcyBoaW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iLAogICAgICAgICAgICAgIGRpbWVuc2lvbiA/ICJ2ZXJ0aWNhbCIgOiAiaG9yaXpvbnRhbCIgKTsKCiAgICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBtYXNrKysgKQogICAgICB7CiAgICAgICAgRlRfVUludCAgaW5kZXg7CgogICAgICAgIHByaW50ZiggIm1hc2sgLT4gJWRcbiIsIG1hc2stPmVuZF9wb2ludCApOwogICAgICAgIGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBtYXNrLT5udW1fYml0czsgaW5kZXgrKyApCiAgICAgICAgewogICAgICAgICAgaWYgKCBtYXNrLT5ieXRlc1sgaW5kZXggPj4gMyBdICYgKDB4ODAgPj4gKGluZGV4ICYgNykpICkKICAgICAgICAgIHsKICAgICAgICAgICAgUFNfSGludCAgaGludCA9IGRpbS0+aGludHMuaGludHMgKyBpbmRleDsKCiAgICAgICAgICAgIHByaW50ZiggIiVjIFslM2QgJTNkICglNGQpXVxuIiwgZGltZW5zaW9uID8gInYiIDogImgiLAogICAgICAgICAgICAgICAgICAgIGhpbnQtPnBvcywgaGludC0+cG9zICsgaGludC0+bGVuLCBoaW50LT5sZW4gKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn0KCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCiAvKioqKiogICAgICAgICAgICBBVVRPSElOVEVSIERSQVdJTkcgUk9VVElORVMgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwogLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIE5WX1BhdGgKYWhfbGlua19wYXRoKCBOVl9WZWN0b3IqICAgcDEsCiAgICAgICAgICAgICAgTlZfVmVjdG9yKiAgIHA0LAogICAgICAgICAgICAgIE5WX0Jvb2wgICAgICB2ZXJ0aWNhbCApCnsKICBOVl9QYXRoV3JpdGVyICB3cml0ZXI7CiAgTlZfVmVjdG9yICAgICAgcDIsIHAzOwogIE5WX1BhdGggICAgICAgIHBhdGgsIHN0cm9rZTsKCiAgaWYgKCB2ZXJ0aWNhbCApCiAgewogICAgcDIueCA9IHA0LT54OwogICAgcDIueSA9IHAxLT55OwoKICAgIHAzLnggPSBwMS0+eDsKICAgIHAzLnkgPSBwNC0+eTsKICB9CiAgZWxzZQogIHsKICAgIHAyLnggPSBwMS0+eDsKICAgIHAyLnkgPSBwNC0+eTsKCiAgICBwMy54ID0gcDQtPng7CiAgICBwMy55ID0gcDEtPnk7CiAgfQoKICBudl9wYXRoX3dyaXRlcl9uZXcoIHJlbmRlcmVyLCAmd3JpdGVyICk7CiAgbnZfcGF0aF93cml0ZXJfbW92ZXRvKCB3cml0ZXIsIHAxICk7CiAgbnZfcGF0aF93cml0ZXJfY3ViaWN0byggd3JpdGVyLCAmcDIsICZwMywgcDQgKTsKICBudl9wYXRoX3dyaXRlcl9lbmQoIHdyaXRlciApOwoKICBwYXRoID0gbnZfcGF0aF93cml0ZXJfZ2V0X3BhdGgoIHdyaXRlciApOwogIG52X3BhdGhfd3JpdGVyX2Rlc3Ryb3koIHdyaXRlciApOwoKICBudl9wYXRoX3N0cm9rZSggcGF0aCwgMS4sIG52X3BhdGhfbGluZWNhcF9idXR0LCBudl9wYXRoX2xpbmVqb2luX3JvdW5kLCAxLiwgICZzdHJva2UgKTsKCiAgbnZfcGF0aF9kZXN0cm95KCBwYXRoICk7CgogIHJldHVybiBzdHJva2U7Cn0KCgpzdGF0aWMgdm9pZAphaF9kcmF3X3Ntb290aF9wb2ludHMoIHZvaWQgKQp7CiAgaWYgKCBhaF9kZWJ1Z19oaW50ZXIgJiYgb3B0aW9uX3Nob3dfc21vb3RoICkKICB7CiAgICBBSF9PdXRsaW5lICAgZ2x5cGggPSBhaF9kZWJ1Z19oaW50ZXItPmdseXBoOwogICAgRlRfVUludCAgICAgIGNvdW50ID0gZ2x5cGgtPm51bV9wb2ludHM7CiAgICBBSF9Qb2ludCAgICAgcG9pbnQgPSBnbHlwaC0+cG9pbnRzOwoKICAgIG52X3BhaW50ZXJfc2V0X2NvbG9yKCBwYWludGVyLCBTTU9PVEhfQ09MT1IsIDI1NiApOwoKICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBwb2ludCsrICkKICAgIHsKICAgICAgaWYgKCAhKCBwb2ludC0+ZmxhZ3MgJiBBSF9GTEFHX1dFQUtfSU5URVJQT0xBVElPTiApICkKICAgICAgewogICAgICAgIE5WX1RyYW5zZm9ybSAgdHJhbnNmb3JtLCAqdHJhbnMgPSAmdHJhbnNmb3JtOwogICAgICAgIE5WX1ZlY3RvciAgICAgdmVjOwoKICAgICAgICB2ZWMueCA9IHBvaW50LT54IC0gYWhfZGVidWdfaGludGVyLT5wcDEueDsKICAgICAgICB2ZWMueSA9IHBvaW50LT55OwogICAgICAgIG52X3ZlY3Rvcl90cmFuc2Zvcm0oICZ2ZWMsICZzaXplX3RyYW5zZm9ybSApOwoKICAgICAgICBudl90cmFuc2Zvcm1fc2V0X3RyYW5zbGF0ZSggJnRyYW5zZm9ybSwgdmVjLngsIHZlYy55ICk7CiAgICAgICAgbnZfcGFpbnRlcl9maWxsX3BhdGgoIHBhaW50ZXIsIHRyYW5zLCAwLCBzeW1ib2xfY2lyY2xlICk7CiAgICAgIH0KICAgIH0KICB9Cn0KCgpzdGF0aWMgdm9pZAphaF9kcmF3X2VkZ2VzKCB2b2lkICkKewogIGlmICggYWhfZGVidWdfaGludGVyICkKICB7CiAgICBBSF9PdXRsaW5lICAgZ2x5cGggPSBhaF9kZWJ1Z19oaW50ZXItPmdseXBoOwogICAgRlRfVUludCAgICAgIGNvdW50OwogICAgQUhfRWRnZSAgICAgIGVkZ2U7CiAgICBGVF9Qb3MgICAgICAgcHAxID0gYWhfZGVidWdfaGludGVyLT5wcDEueDsKCiAgICBudl9wYWludGVyX3NldF9jb2xvciggcGFpbnRlciwgRURHRV9DT0xPUiwgMjU2ICk7CgogICAgaWYgKCBvcHRpb25fc2hvd19lZGdlcyApCiAgICB7CiAgICAgIC8qIGRyYXcgdmVydGljYWwgZWRnZXMgKi8KICAgICAgaWYgKCBvcHRpb25fc2hvd192ZXJ0X2hpbnRzICkKICAgICAgewogICAgICAgIGNvdW50ID0gZ2x5cGgtPm51bV92ZWRnZXM7CiAgICAgICAgZWRnZSAgPSBnbHlwaC0+dmVydF9lZGdlczsKICAgICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgZWRnZSsrICkKICAgICAgICB7CiAgICAgICAgICBOVl9WZWN0b3IgICAgIHZlYzsKICAgICAgICAgIE5WX1BvcyAgICAgICAgeDsKCiAgICAgICAgICB2ZWMueCA9IGVkZ2UtPnBvcyAtIHBwMTsKICAgICAgICAgIHZlYy55ID0gMDsKCiAgICAgICAgICBudl92ZWN0b3JfdHJhbnNmb3JtKCAmdmVjLCAmc2l6ZV90cmFuc2Zvcm0gKTsKICAgICAgICAgIHggPSAoRlRfUG9zKSggdmVjLnggKyAwLjUgKTsKCiAgICAgICAgICBudl9waXhtYXBfZmlsbF9yZWN0KCB0YXJnZXQsIHgsIDAsIDEsIHRhcmdldC0+aGVpZ2h0LCBFREdFX0NPTE9SICk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKiBkcmF3IGhvcml6b250YWwgZWRnZXMgKi8KICAgICAgaWYgKCBvcHRpb25fc2hvd19ob3J6X2hpbnRzICkKICAgICAgewogICAgICAgIGNvdW50ID0gZ2x5cGgtPm51bV9oZWRnZXM7CiAgICAgICAgZWRnZSAgPSBnbHlwaC0+aG9yel9lZGdlczsKICAgICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgZWRnZSsrICkKICAgICAgICB7CiAgICAgICAgICBOVl9WZWN0b3IgICAgIHZlYzsKICAgICAgICAgIE5WX1BvcyAgICAgICAgeDsKCiAgICAgICAgICB2ZWMueCA9IDA7CiAgICAgICAgICB2ZWMueSA9IGVkZ2UtPnBvczsKCiAgICAgICAgICBudl92ZWN0b3JfdHJhbnNmb3JtKCAmdmVjLCAmc2l6ZV90cmFuc2Zvcm0gKTsKICAgICAgICAgIHggPSAoRlRfUG9zKSggdmVjLnkgKyAwLjUgKTsKCiAgICAgICAgICBudl9waXhtYXBfZmlsbF9yZWN0KCB0YXJnZXQsIDAsIHgsIHRhcmdldC0+d2lkdGgsIDEsIEVER0VfQ09MT1IgKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBpZiAoIG9wdGlvbl9zaG93X3NlZ21lbnRzICkKICAgIHsKICAgICAgLyogZHJhdyB2ZXJ0aWNhbCBzZWdtZW50cyAqLwogICAgICBpZiAoIG9wdGlvbl9zaG93X3ZlcnRfaGludHMgKQogICAgICB7CiAgICAgICAgQUhfU2VnbWVudCAgIHNlZyAgID0gZ2x5cGgtPnZlcnRfc2VnbWVudHM7CiAgICAgICAgRlRfVUludCAgICAgIGNvdW50ID0gZ2x5cGgtPm51bV92c2VnbWVudHM7CgogICAgICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBzZWcrKyApCiAgICAgICAgewogICAgICAgICAgQUhfUG9pbnRSZWMgICpmaXJzdCwgKmxhc3Q7CiAgICAgICAgICBOVl9WZWN0b3IgIHYxLCB2MjsKICAgICAgICAgIE5WX1BvcyAgICAgeTEsIHkyLCB4OwoKICAgICAgICAgIGZpcnN0ID0gc2VnLT5maXJzdDsKICAgICAgICAgIGxhc3QgID0gc2VnLT5sYXN0OwoKICAgICAgICAgIHYxLnggPSB2Mi54ID0gZmlyc3QtPnggLSBwcDE7CgogICAgICAgICAgaWYgKCBmaXJzdC0+eSA8PSBsYXN0LT55ICkKICAgICAgICAgIHsKICAgICAgICAgICAgdjEueSA9IGZpcnN0LT55OwogICAgICAgICAgICB2Mi55ID0gbGFzdC0+eTsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UKICAgICAgICAgIHsKICAgICAgICAgICAgdjEueSA9IGxhc3QtPnk7CiAgICAgICAgICAgIHYyLnkgPSBmaXJzdC0+eTsKICAgICAgICAgIH0KCiAgICAgICAgICBudl92ZWN0b3JfdHJhbnNmb3JtKCAmdjEsICZzaXplX3RyYW5zZm9ybSApOwogICAgICAgICAgbnZfdmVjdG9yX3RyYW5zZm9ybSggJnYyLCAmc2l6ZV90cmFuc2Zvcm0gKTsKCiAgICAgICAgICB5MSA9IChOVl9Qb3MpKCB2MS55ICsgMC41ICk7CiAgICAgICAgICB5MiA9IChOVl9Qb3MpKCB2Mi55ICsgMC41ICk7CiAgICAgICAgICB4ICA9IChOVl9Qb3MpKCB2MS54ICsgMC41ICk7CgogICAgICAgICAgbnZfcGl4bWFwX2ZpbGxfcmVjdCggdGFyZ2V0LCB4LTEsIHkyLCAzLCBBQlMoeTEteTIpKzEsIFNFR01FTlRfQ09MT1IgKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qIGRyYXcgaG9yaXpvbnRhbCBzZWdtZW50cyAqLwogICAgICBpZiAoIG9wdGlvbl9zaG93X2hvcnpfaGludHMgKQogICAgICB7CiAgICAgICAgQUhfU2VnbWVudCAgIHNlZyAgID0gZ2x5cGgtPmhvcnpfc2VnbWVudHM7CiAgICAgICAgRlRfVUludCAgICAgIGNvdW50ID0gZ2x5cGgtPm51bV9oc2VnbWVudHM7CgogICAgICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBzZWcrKyApCiAgICAgICAgewogICAgICAgICAgQUhfUG9pbnRSZWMgICpmaXJzdCwgKmxhc3Q7CiAgICAgICAgICBOVl9WZWN0b3IgIHYxLCB2MjsKICAgICAgICAgIE5WX1BvcyAgICAgeTEsIHkyLCB4OwoKICAgICAgICAgIGZpcnN0ID0gc2VnLT5maXJzdDsKICAgICAgICAgIGxhc3QgID0gc2VnLT5sYXN0OwoKICAgICAgICAgIHYxLnkgPSB2Mi55ID0gZmlyc3QtPnk7CgogICAgICAgICAgaWYgKCBmaXJzdC0+eCA8PSBsYXN0LT54ICkKICAgICAgICAgIHsKICAgICAgICAgICAgdjEueCA9IGZpcnN0LT54IC0gcHAxOwogICAgICAgICAgICB2Mi54ID0gbGFzdC0+eCAtIHBwMTsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UKICAgICAgICAgIHsKICAgICAgICAgICAgdjEueCA9IGxhc3QtPnggLSBwcDE7CiAgICAgICAgICAgIHYyLnggPSBmaXJzdC0+eCAtIHBwMTsKICAgICAgICAgIH0KCiAgICAgICAgICBudl92ZWN0b3JfdHJhbnNmb3JtKCAmdjEsICZzaXplX3RyYW5zZm9ybSApOwogICAgICAgICAgbnZfdmVjdG9yX3RyYW5zZm9ybSggJnYyLCAmc2l6ZV90cmFuc2Zvcm0gKTsKCiAgICAgICAgICB5MSA9IChOVl9Qb3MpKCB2MS54ICsgMC41ICk7CiAgICAgICAgICB5MiA9IChOVl9Qb3MpKCB2Mi54ICsgMC41ICk7CiAgICAgICAgICB4ICA9IChOVl9Qb3MpKCB2MS55ICsgMC41ICk7CgogICAgICAgICAgbnZfcGl4bWFwX2ZpbGxfcmVjdCggdGFyZ2V0LCB5MSwgeC0xLCBBQlMoeTEteTIpKzEsIDMsIFNFR01FTlRfQ09MT1IgKTsKICAgICAgICB9CiAgICAgIH0KCgogICAgICBpZiAoIG9wdGlvbl9zaG93X3ZlcnRfaGludHMgJiYgb3B0aW9uX3Nob3dfbGlua3MgKQogICAgICB7CiAgICAgICAgQUhfU2VnbWVudCAgIHNlZyAgID0gZ2x5cGgtPnZlcnRfc2VnbWVudHM7CiAgICAgICAgRlRfVUludCAgICAgIGNvdW50ID0gZ2x5cGgtPm51bV92c2VnbWVudHM7CgogICAgICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBzZWcrKyApCiAgICAgICAgewogICAgICAgICAgQUhfU2VnbWVudCAgIHNlZzIgPSBOVUxMOwogICAgICAgICAgTlZfUGF0aCAgICAgIGxpbms7CiAgICAgICAgICBOVl9WZWN0b3IgICAgdjEsIHYyOwoKICAgICAgICAgIGlmICggc2VnLT5saW5rICkKICAgICAgICAgIHsKICAgICAgICAgICAgaWYgKCBzZWctPmxpbmsgPiBzZWcgKQogICAgICAgICAgICAgIHNlZzIgPSBzZWctPmxpbms7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIGlmICggc2VnLT5zZXJpZiApCiAgICAgICAgICAgIHNlZzIgPSBzZWctPnNlcmlmOwoKICAgICAgICAgIGlmICggc2VnMiApCiAgICAgICAgICB7CiAgICAgICAgICAgIHYxLnggPSBzZWctPmZpcnN0LT54ICAtIHBwMTsKICAgICAgICAgICAgdjIueCA9IHNlZzItPmZpcnN0LT54IC0gcHAxOwogICAgICAgICAgICB2MS55ID0gKHNlZy0+Zmlyc3QtPnkgKyBzZWctPmxhc3QtPnkpLzI7CiAgICAgICAgICAgIHYyLnkgPSAoc2VnMi0+Zmlyc3QtPnkgKyBzZWcyLT5sYXN0LT55KS8yOwoKICAgICAgICAgICAgbGluayA9IGFoX2xpbmtfcGF0aCggJnYxLCAmdjIsIDEgKTsKCiAgICAgICAgICAgIG52X3BhaW50ZXJfc2V0X2NvbG9yKCBwYWludGVyLCBzZWctPnNlcmlmID8gU0VSSUZfTElOS19DT0xPUiA6IExJTktfQ09MT1IsIDI1NiApOwogICAgICAgICAgICBudl9wYWludGVyX2ZpbGxfcGF0aCggcGFpbnRlciwgJnNpemVfdHJhbnNmb3JtLCAwLCBsaW5rICk7CgogICAgICAgICAgICBudl9wYXRoX2Rlc3Ryb3koIGxpbmsgKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmICggb3B0aW9uX3Nob3dfaG9yel9oaW50cyAmJiBvcHRpb25fc2hvd19saW5rcyApCiAgICAgIHsKICAgICAgICBBSF9TZWdtZW50ICAgc2VnICAgPSBnbHlwaC0+aG9yel9zZWdtZW50czsKICAgICAgICBGVF9VSW50ICAgICAgY291bnQgPSBnbHlwaC0+bnVtX2hzZWdtZW50czsKCiAgICAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIHNlZysrICkKICAgICAgICB7CiAgICAgICAgICBBSF9TZWdtZW50ICAgc2VnMiA9IE5VTEw7CiAgICAgICAgICBOVl9QYXRoICAgICAgbGluazsKICAgICAgICAgIE5WX1ZlY3RvciAgICB2MSwgdjI7CgogICAgICAgICAgaWYgKCBzZWctPmxpbmsgKQogICAgICAgICAgewogICAgICAgICAgICBpZiAoIHNlZy0+bGluayA+IHNlZyApCiAgICAgICAgICAgICAgc2VnMiA9IHNlZy0+bGluazsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgaWYgKCBzZWctPnNlcmlmICkKICAgICAgICAgICAgc2VnMiA9IHNlZy0+c2VyaWY7CgogICAgICAgICAgaWYgKCBzZWcyICkKICAgICAgICAgIHsKICAgICAgICAgICAgdjEueSA9IHNlZy0+Zmlyc3QtPnk7CiAgICAgICAgICAgIHYyLnkgPSBzZWcyLT5maXJzdC0+eTsKICAgICAgICAgICAgdjEueCA9IChzZWctPmZpcnN0LT54ICsgc2VnLT5sYXN0LT54KS8yIC0gcHAxOwogICAgICAgICAgICB2Mi54ID0gKHNlZzItPmZpcnN0LT54ICsgc2VnMi0+bGFzdC0+eCkvMiAtIHBwMTsKCiAgICAgICAgICAgIGxpbmsgPSBhaF9saW5rX3BhdGgoICZ2MSwgJnYyLCAwICk7CgogICAgICAgICAgICBudl9wYWludGVyX3NldF9jb2xvciggcGFpbnRlciwgc2VnLT5zZXJpZiA/IFNFUklGX0xJTktfQ09MT1IgOiBMSU5LX0NPTE9SLCAyNTYgKTsKICAgICAgICAgICAgbnZfcGFpbnRlcl9maWxsX3BhdGgoIHBhaW50ZXIsICZzaXplX3RyYW5zZm9ybSwgMCwgbGluayApOwoKICAgICAgICAgICAgbnZfcGF0aF9kZXN0cm95KCBsaW5rICk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9CgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwogLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgTUFJTiBMT09QKFMpICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyB2b2lkCmRyYXdfZ2x5cGgoIGludCAgZ2x5cGhfaW5kZXggKQp7CiAgTlZfUGF0aCAgIHBhdGg7CgogIHBzaGludF92ZXJ0aWNhbCAgICA9IC0xOwoKICBwczFfZGVidWdfaGludF9mdW5jID0gb3B0aW9uX3Nob3dfcHNfaGludHMgPyBkcmF3X3BzMV9oaW50IDogMDsKICBwczJfZGVidWdfaGludF9mdW5jID0gb3B0aW9uX3Nob3dfcHNfaGludHMgPyBkcmF3X3BzMl9oaW50IDogMDsKICBwczNfZGVidWdfaGludF9mdW5jID0gb3B0aW9uX3Nob3dfcHNfaGludHMgPyBkcmF3X3BzM19oaW50IDogMDsKCiAgYWhfZGVidWdfaGludGVyID0gTlVMTDsKCiAgZXJyb3IgPSBGVF9Mb2FkX0dseXBoKCBmYWNlLCBnbHlwaF9pbmRleCwgRlRfTE9BRF9OT19CSVRNQVAgKTsKICBpZiAoZXJyb3IpIFBhbmljKCAiY291bGQgbm90IGxvYWQgZ2x5cGgiICk7CgogIGlmICggZmFjZS0+Z2x5cGgtPmZvcm1hdCAhPSBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSApCiAgICBQYW5pYyggImNvdWxkIG5vdCBsb2FkIGdseXBoIG91dGxpbmUiICk7CgogIGVycm9yID0gbnZfcGF0aF9uZXdfZnJvbV9vdXRsaW5lKCByZW5kZXJlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5WX091dGxpbmUqKSZmYWNlLT5nbHlwaC0+b3V0bGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemVfdHJhbnNmb3JtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0aCApOwogIGlmIChlcnJvcikgUGFuaWMoICJjb3VsZCBub3QgY3JlYXRlIGdseXBoIHBhdGgiICk7CgogIC8qIHRyYWPpIGR1IGdseXBoZSBwbGVpbiAqLwogIGlmICggb3B0aW9uX3Nob3dfZ2x5cGggKQogIHsKICAgIG52X3BhaW50ZXJfc2V0X2NvbG9yICggcGFpbnRlciwgMHhGRjQwNDA4MCwgMTI4ICk7CiAgICBudl9wYWludGVyX2ZpbGxfcGF0aCAoIHBhaW50ZXIsIDAsIDAsIHBhdGggKTsKICB9CgogIGlmICggb3B0aW9uX3Nob3dfc3Ryb2tlICkKICB7CiAgICBOVl9QYXRoICAgc3Ryb2tlOwoKICAgIGVycm9yID0gbnZfcGF0aF9zdHJva2UoIHBhdGgsIDAuNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG52X3BhdGhfbGluZWNhcF9idXR0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbnZfcGF0aF9saW5lam9pbl9taXRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMCwgJnN0cm9rZSApOwogICAgaWYgKGVycm9yKSBQYW5pYyggImNvdWxkIG5vdCBzdHJva2UgZ2x5cGggcGF0aCIgKTsKCiAgICBudl9wYWludGVyX3NldF9jb2xvciAoIHBhaW50ZXIsIDB4RkYwMDAwNDAsIDI1NiApOwogICAgbnZfcGFpbnRlcl9maWxsX3BhdGggKCBwYWludGVyLCAwLCAwLCBzdHJva2UgKTsKCiAgICBudl9wYXRoX2Rlc3Ryb3koIHN0cm9rZSApOwogIH0KCiAgLyogdHJhY+kgZGVzIHBvaW50cyBkZSBjb250cm9sZSAqLwogIGlmICggb3B0aW9uX3Nob3dfZG90cyApCiAgewogICAgTlZfUGF0aCAgICAgcGxvdDsKICAgIE5WX091dGxpbmUgIG91dDsKICAgIE5WX1NjYWxlICAgIHIgPSAyOwogICAgTlZfSW50ICAgICAgbiwgZmlyc3QsIGxhc3Q7CgogICAgbnZfcGF0aF9nZXRfb3V0bGluZSggcGF0aCwgTlVMTCwgbWVtb3J5LCAmb3V0ICk7CgogICAgZmlyc3QgPSAwOwogICAgZm9yICggbiA9IDA7IG4gPCBvdXQubl9jb250b3VyczsgbisrICkKICAgIHsKICAgICAgaW50ICAgICAgICAgICAgbTsKICAgICAgTlZfVHJhbnNmb3JtICAgdHJhbnM7CiAgICAgIE5WX0NvbG9yICAgICAgIGNvbG9yOwogICAgICBOVl9TdWJWZWN0b3IqICB2ZWM7CgogICAgICBsYXN0ICA9IG91dC5jb250b3Vyc1tuXTsKCiAgICAgIGZvciAoIG0gPSBmaXJzdDsgbSA8PSBsYXN0OyBtKysgKQogICAgICB7CiAgICAgICAgY29sb3IgPSAob3V0LnRhZ3NbbV0gJiBGVF9DVVJWRV9UQUdfT04pCiAgICAgICAgICAgICAgPyBPTl9DT0xPUgogICAgICAgICAgICAgIDogT0ZGX0NPTE9SOwoKICAgICAgICB2ZWMgPSBvdXQucG9pbnRzICsgbTsKCiAgICAgICAgbnZfdHJhbnNmb3JtX3NldF90cmFuc2xhdGUoICZ0cmFucywgdmVjLT54LzY0LjAsIHZlYy0+eS82NC4wICk7CgogICAgICAgIG52X3BhaW50ZXJfc2V0X2NvbG9yKCBwYWludGVyLCBjb2xvciwgMjU2ICk7CiAgICAgICAgbnZfcGFpbnRlcl9maWxsX3BhdGgoIHBhaW50ZXIsICZ0cmFucywgMCwgc3ltYm9sX2RvdCApOwoKICAgICAgICBpZiAoIG9wdGlvbl9zaG93X2luZGljZXMgKQogICAgICAgIHsKICAgICAgICAgIGNoYXIgIHRlbXBbNV07CgogICAgICAgICAgc3ByaW50ZiggdGVtcCwgIiVkIiwgbSApOwogICAgICAgICAgbnZfcGl4bWFwX2NlbGxfdGV4dCggdGFyZ2V0LCB2ZWMtPngvNjQgKyA0LCB2ZWMtPnkvNjQgLSA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCwgVEVYVF9DT0xPUiApOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZmlyc3QgPSBsYXN0ICsgMTsKICAgIH0KICB9CgogIGFoX2RyYXdfc21vb3RoX3BvaW50cygpOwogIGFoX2RyYXdfZWRnZXMoKTsKCiAgbnZfcGF0aF9kZXN0cm95KCBwYXRoICk7CgogIC8qIGF1dHJlIGluZm9zICovCiAgewogICAgY2hhciAgdGVtcFsxMDI0XTsKICAgIGNoYXIgIHRlbXAyWzY0XTsKCiAgICBzcHJpbnRmKCB0ZW1wLCAiZm9udCBuYW1lIDogJXMgKCVzKSIsIGZhY2UtPmZhbWlseV9uYW1lLCBmYWNlLT5zdHlsZV9uYW1lICk7CiAgICBudl9waXhtYXBfY2VsbF90ZXh0KCB0YXJnZXQsIDAsIDAsIHRlbXAsIFRFWFRfQ09MT1IgKTsKCiAgICBGVF9HZXRfR2x5cGhfTmFtZSggZmFjZSwgZ2x5cGhfaW5kZXgsIHRlbXAyLCA2MyApOwogICAgdGVtcDJbNjNdID0gMDsKCiAgICBzcHJpbnRmKCB0ZW1wLCAiZ2x5cGggJTRkOiAlcyIsIGdseXBoX2luZGV4LCB0ZW1wMiApOwogICAgbnZfcGl4bWFwX2NlbGxfdGV4dCggdGFyZ2V0LCAwLCA4LCB0ZW1wLCBURVhUX0NPTE9SICk7CgogICAgaWYgKCB0ZW1wX21lc3NhZ2VbMF0gKQogICAgewogICAgICBudl9waXhtYXBfY2VsbF90ZXh0KCB0YXJnZXQsIDAsIDE2LCB0ZW1wX21lc3NhZ2UsIFRFWFRfQ09MT1IgKTsKICAgICAgdGVtcF9tZXNzYWdlWzBdID0gMDsKICAgIH0KICB9Cn0KCgoKI2RlZmluZSAgVE9HR0xFX09QVElPTih2YXIscHJlZml4KSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICB2YXIgPSAhdmFyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICBzcHJpbnRmKCB0ZW1wX21lc3NhZ2UsIHByZWZpeCAiIGlzIG5vdyAlcyIsICAgIFwKICAgICAgICAgICAgICAgICAgICAgICB2YXIgPyAib24iIDogIm9mZiIgKTsgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgfQoKCiNkZWZpbmUgIFRPR0dMRV9PUFRJT05fTkVHKHZhcixwcmVmaXgpICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgdmFyID0gIXZhcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgc3ByaW50ZiggdGVtcF9tZXNzYWdlLCBwcmVmaXggIiBpcyBub3cgJXMiLCAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgIXZhciA/ICJvbiIgOiAib2ZmIiApOyAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0KCgpzdGF0aWMgdm9pZApoYW5kbGVfZXZlbnQoIE5WVl9FdmVudFJlYyogICBldiApCnsKICBzd2l0Y2ggKGV2LT5rZXkpCiAgewogICAgY2FzZSBOVlZfS2V5X0xlZnQ6CiAgICAgIHsKICAgICAgICBpZiAoIGdseXBoX2luZGV4ID4gMCApCiAgICAgICAgICBnbHlwaF9pbmRleC0tOwogICAgICAgIGJyZWFrOwogICAgICB9CgogICAgY2FzZSBOVlZfS2V5X1JpZ2h0OgogICAgICB7CiAgICAgICAgaWYgKCBnbHlwaF9pbmRleCsxIDwgZmFjZS0+bnVtX2dseXBocyApCiAgICAgICAgICBnbHlwaF9pbmRleCsrOwogICAgICAgIGJyZWFrOwogICAgICB9CgogICAgY2FzZSBOVlZfS0VZKCd4Jyk6CiAgICAgIFRPR0dMRV9PUFRJT04oIG9wdGlvbl9zaG93X2F4aXMsICJncmlkIGF4aXMgZGlzcGxheSIgKQoKICAgIGNhc2UgTlZWX0tFWSgncycpOgogICAgICBUT0dHTEVfT1BUSU9OKCBvcHRpb25fc2hvd19zdHJva2UsICJnbHlwaCBzdHJva2UgZGlzcGxheSIgKQoKICAgIGNhc2UgTlZWX0tFWSgnZycpOgogICAgICBUT0dHTEVfT1BUSU9OKCBvcHRpb25fc2hvd19nbHlwaCwgImdseXBoIGZpbGwgZGlzcGxheSIgKQoKICAgIGNhc2UgTlZWX0tFWSgnZCcpOgogICAgICBUT0dHTEVfT1BUSU9OKCBvcHRpb25fc2hvd19kb3RzLCAiY29udHJvbCBwb2ludHMgZGlzcGxheSIgKQoKICAgIGNhc2UgTlZWX0tFWSgnZScpOgogICAgICBUT0dHTEVfT1BUSU9OKCBvcHRpb25fc2hvd19lbSwgIkVNIHNxdWFyZSBkaXNwbGF5IiApCgogICAgY2FzZSBOVlZfS0VZKCcrJyk6CiAgICAgIHsKICAgICAgICBncmlkX3NjYWxlICo9IDEuMjsKICAgICAgICByZXNldF9zY2FsZSggZ3JpZF9zY2FsZSApOwogICAgICAgIGJyZWFrOwogICAgICB9CgogICAgY2FzZSBOVlZfS0VZKCctJyk6CiAgICAgIHsKICAgICAgICBpZiAoZ3JpZF9zY2FsZSA+IDAuMykKICAgICAgICB7CiAgICAgICAgICBncmlkX3NjYWxlIC89IDEuMjsKICAgICAgICAgIHJlc2V0X3NjYWxlKCBncmlkX3NjYWxlICk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICB9CgogICAgY2FzZSBOVlZfS2V5X1VwOgogICAgICB7CiAgICAgICAgcGl4ZWxfc2l6ZSsrOwogICAgICAgIHJlc2V0X3NpemUoIHBpeGVsX3NpemUsIGdyaWRfc2NhbGUgKTsKICAgICAgICBzcHJpbnRmKCB0ZW1wX21lc3NhZ2UsICJwaXhlbCBzaXplID0gJWQiLCBwaXhlbF9zaXplICk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KCiAgICBjYXNlIE5WVl9LZXlfRG93bjoKICAgICAgewogICAgICAgIGlmIChwaXhlbF9zaXplID4gMSkKICAgICAgICB7CiAgICAgICAgICBwaXhlbF9zaXplLS07CiAgICAgICAgICByZXNldF9zaXplKCBwaXhlbF9zaXplLCBncmlkX3NjYWxlICk7CiAgICAgICAgICBzcHJpbnRmKCB0ZW1wX21lc3NhZ2UsICJwaXhlbCBzaXplID0gJWQiLCBwaXhlbF9zaXplICk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICB9CgogICAgY2FzZSBOVlZfS0VZKCd6Jyk6CiAgICAgIFRPR0dMRV9PUFRJT05fTkVHKCBwc19kZWJ1Z19ub192ZXJ0X2hpbnRzLCAidmVydGljYWwgaGludHMgcHJvY2Vzc2luZyIgKQoKICAgIGNhc2UgTlZWX0tFWSgnYScpOgogICAgICBUT0dHTEVfT1BUSU9OX05FRyggcHNfZGVidWdfbm9faG9yel9oaW50cywgImhvcml6b250YWwgaGludHMgcHJvY2Vzc2luZyIgKQoKICAgIGNhc2UgTlZWX0tFWSgnWicpOgogICAgICBUT0dHTEVfT1BUSU9OKCBvcHRpb25fc2hvd192ZXJ0X2hpbnRzLCAidmVydGljYWwgaGludHMgZGlzcGxheSIgKQoKICAgIGNhc2UgTlZWX0tFWSgnQScpOgogICAgICBUT0dHTEVfT1BUSU9OKCBvcHRpb25fc2hvd19ob3J6X2hpbnRzLCAiaG9yaXpvbnRhbCBoaW50cyBkaXNwbGF5IiApCgogICAgY2FzZSBOVlZfS0VZKCdTJyk6CiAgICAgIFRPR0dMRV9PUFRJT04oIG9wdGlvbl9zaG93X3Ntb290aCwgInNtb290aCBwb2ludHMgZGlzcGxheSIgKTsKCiAgICBjYXNlIE5WVl9LRVkoJ2knKToKICAgICAgVE9HR0xFX09QVElPTiggb3B0aW9uX3Nob3dfaW5kaWNlcywgInBvaW50IGluZGV4IGRpc3BsYXkiICk7CgogICAgY2FzZSBOVlZfS0VZKCdiJyk6CiAgICAgIFRPR0dMRV9PUFRJT04oIG9wdGlvbl9zaG93X2JsdWVzLCAiYmx1ZSB6b25lcyBkaXNwbGF5IiApOwoKICAgIGNhc2UgTlZWX0tFWSgnaCcpOgogICAgICBwc19kZWJ1Z19ub19ob3J6X2hpbnRzID0gb3B0aW9uX2hpbnRpbmc7CiAgICAgIHBzX2RlYnVnX25vX3ZlcnRfaGludHMgPSBvcHRpb25faGludGluZzsKCiAgICAgIFRPR0dMRV9PUFRJT04oIG9wdGlvbl9oaW50aW5nLCAiaGludGluZyIgKQoKICAgIGNhc2UgTlZWX0tFWSgnSCcpOgogICAgICBwc19wcmludF9oaW50cygpOwogICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICA7CiAgfQp9CgoKCnN0YXRpYyB2b2lkCnVzYWdlKCkKewogIFBhbmljKCAibm8gdXNhZ2UiICk7Cn0KCgojZGVmaW5lICBPUFRJT04xKG4sY29kZSkgICBcCiAgICAgICAgICAgY2FzZSBuIDogICAgICAgIFwKICAgICAgICAgICAgIGNvZGUgICAgICAgICAgXAogICAgICAgICAgICAgYXJnYy0tOyAgICAgICBcCiAgICAgICAgICAgICBhcmd2Kys7ICAgICAgIFwKICAgICAgICAgICAgIGJyZWFrOwoKI2RlZmluZSAgT1BUSU9OMihuLGNvZGUpICAgICBcCiAgICAgICAgICAgY2FzZSBuIDogICAgICAgICAgXAogICAgICAgICAgICAgY29kZSAgICAgICAgICAgIFwKICAgICAgICAgICAgIGFyZ2MgLT0gMjsgICAgICBcCiAgICAgICAgICAgICBhcmd2ICs9IDI7ICAgICAgXAogICAgICAgICAgICAgYnJlYWs7CgoKc3RhdGljIHZvaWQKcGFyc2Vfb3B0aW9ucyggaW50KiAgYXJnY19wLCBjaGFyKioqIGFyZ3ZfcCApCnsKICBpbnQgICAgYXJnYyA9ICphcmdjX3A7CiAgY2hhcioqIGFyZ3YgPSAqYXJndl9wOwoKICB3aGlsZSAoYXJnYyA+IDIgJiYgYXJndlsxXVswXSA9PSAnLScpCiAgewogICAgc3dpdGNoIChhcmd2WzFdWzFdKQogICAgewogICAgICBPUFRJT04yKCAnZicsIGZpcnN0X2dseXBoID0gYXRvaSggYXJndlsyXSApOyApCgogICAgICBPUFRJT04yKCAncycsIHBpeGVsX3NpemUgPSBhdG9pKCBhcmd2WzJdICk7ICkKCiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdXNhZ2UoKTsKICAgIH0KICB9CgogICphcmdjX3AgPSBhcmdjOwogICphcmd2X3AgPSBhcmd2Owp9CgoKCmludCAgbWFpbiggaW50ICBhcmdjLCBjaGFyKiogIGFyZ3YgKQp7CiAgY2hhciogIGZpbGVuYW1lID0gIi93aW5udC9mb250cy9hcmlhbC50dGYiOwoKICBwYXJzZV9vcHRpb25zKCAmYXJnYywgJmFyZ3YgKTsKCiAgaWYgKCBhcmdjID49IDIgKQogICAgZmlsZW5hbWUgPSBhcmd2WzFdOwoKCiAgLyogY3JlYXRlIGxpYnJhcnkgKi8KICBlcnJvciA9IG52X3JlbmRlcmVyX25ldyggMCwgJnJlbmRlcmVyICk7CiAgaWYgKGVycm9yKSBQYW5pYyggImNvdWxkIG5vdCBjcmVhdGUgTmlydmFuYSByZW5kZXJlciIgKTsKCiAgbWVtb3J5ID0gbnZfcmVuZGVyZXJfZ2V0X21lbW9yeSggcmVuZGVyZXIgKTsKICBpbml0X3N5bWJvbHMoKTsKCiAgZXJyb3IgPSBudnZfZGlzcGxheV9uZXcoIHJlbmRlcmVyLCAmZGlzcGxheSApOwogIGlmIChlcnJvcikgUGFuaWMoICJjb3VsZCBub3QgY3JlYXRlIGRpc3BsYXkiICk7CgogIGVycm9yID0gbnZ2X3N1cmZhY2VfbmV3KCBkaXNwbGF5LCA0NjAsIDQ2MCwgbnZfcGl4bWFwX3R5cGVfYXJnYiwgJnN1cmZhY2UgKTsKICBpZiAoZXJyb3IpIFBhbmljKCAiY291bGQgbm90IGNyZWF0ZSBzdXJmYWNlIiApOwoKICB0YXJnZXQgPSBudnZfc3VyZmFjZV9nZXRfcGl4bWFwKCBzdXJmYWNlICk7CgogIGVycm9yID0gbnZfcGFpbnRlcl9uZXcoIHJlbmRlcmVyLCAmcGFpbnRlciApOwogIGlmIChlcnJvcikgUGFuaWMoICJjb3VsZCBub3QgY3JlYXRlIHBhaW50ZXIiICk7CgogIG52X3BhaW50ZXJfc2V0X3RhcmdldCggcGFpbnRlciwgdGFyZ2V0ICk7CgogIGNsZWFyX2JhY2tncm91bmQoKTsKCiAgZXJyb3IgPSBGVF9Jbml0X0ZyZWVUeXBlKCAmZnJlZXR5cGUgKTsKICBpZiAoZXJyb3IpIFBhbmljKCAiY291bGQgbm90IGluaXRpYWxpc2UgRnJlZVR5cGUiICk7CgogIGVycm9yID0gRlRfTmV3X0ZhY2UoIGZyZWV0eXBlLCBmaWxlbmFtZSwgMCwgJmZhY2UgKTsKICBpZiAoZXJyb3IpIFBhbmljKCAiY291bGQgbm90IG9wZW4gZm9udCBmYWNlIiApOwoKICByZXNldF9zaXplKCBwaXhlbF9zaXplLCBncmlkX3NjYWxlICk7CgoKICBudnZfc3VyZmFjZV9zZXRfdGl0bGUoIHN1cmZhY2UsICJGcmVlVHlwZSBHbHlwaCBWaWV3ZXIiICk7CgogIHsKICAgIE5WVl9FdmVudFJlYyAgZXZlbnQ7CgogICAgZ2x5cGhfaW5kZXggPSBmaXJzdF9nbHlwaDsKICAgIGZvciAoIDs7ICkKICAgIHsKICAgICAgY2xlYXJfYmFja2dyb3VuZCgpOwogICAgICBkcmF3X2dyaWQoKTsKCiAgICAgIHBzX2RlYnVnX2hpbnRzICA9IDA7CiAgICAgIGFoX2RlYnVnX2hpbnRlciA9IDA7CgogICAgICBhaF9kZWJ1Z19kaXNhYmxlX3ZlcnQgPSBwc19kZWJ1Z19ub192ZXJ0X2hpbnRzOwogICAgICBhaF9kZWJ1Z19kaXNhYmxlX2hvcnogPSBwc19kZWJ1Z19ub19ob3J6X2hpbnRzOwoKICAgICAgZHJhd19wc19ibHVlX3pvbmVzKCk7CiAgICAgIGRyYXdfZ2x5cGgoIGdseXBoX2luZGV4ICk7CiAgICAgIHBzM19kcmF3X2NvbnRyb2xfcG9pbnRzKCk7CgogICAgICBudnZfc3VyZmFjZV9yZWZyZXNoKCBzdXJmYWNlLCBOVUxMICk7CgogICAgICBudnZfc3VyZmFjZV9saXN0ZW4oIHN1cmZhY2UsIDAsICZldmVudCApOwogICAgICBpZiAoIGV2ZW50LmtleSA9PSBOVlZfS2V5X0VzYyApCiAgICAgICAgYnJlYWs7CgogICAgICBoYW5kbGVfZXZlbnQoICZldmVudCApOwogICAgICBzd2l0Y2ggKGV2ZW50LmtleSkKICAgICAgewogICAgICAgIGNhc2UgTlZWX0tleV9Fc2M6CiAgICAgICAgICBnb3RvIEV4aXQ7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICA7CiAgICAgIH0KICAgIH0KICB9CgogRXhpdDoKICAvKiB3YWl0IGZvciBlc2NhcGUgKi8KCgogIC8qIGRlc3Ryb3kgZGlzcGxheSAoYW5kIHN1cmZhY2UpICovCiAgbnZ2X2Rpc3BsYXlfdW5yZWYoIGRpc3BsYXkgKTsKCiAgZG9uZV9zeW1ib2xzKCk7CiAgbnZfcmVuZGVyZXJfdW5yZWYoIHJlbmRlcmVyICk7CgogIHJldHVybiAwOwp9Cg==