Ci8qIQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBcZmlsZSBtYl9hY2Nlc3MuYwogKgogKiBcYnJpZWYKICogICAgRnVuY3Rpb25zIGZvciBtYWNyb2Jsb2NrIG5laWdoYm9yaG9vZHMKICoKICogIFxhdXRob3IKICogICAgICBNYWluIGNvbnRyaWJ1dG9ycyAoc2VlIGNvbnRyaWJ1dG9ycy5oIGZvciBjb3B5cmlnaHQsIGFkZHJlc3MgYW5kIGFmZmlsaWF0aW9uIGRldGFpbHMpCiAqICAgICAgLSBLYXJzdGVuIFP8aHJpbmcgICAgICAgICAgPHN1ZWhyaW5nQGhoaS5kZT4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCiNpbmNsdWRlIDxhc3NlcnQuaD4KCiNpbmNsdWRlICJnbG9iYWwuaCIKI2luY2x1ZGUgIm1iX2FjY2Vzcy5oIgoKLyohCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogXGJyaWVmCiAqICAgIHJldHVybnMgMSBpZiB0aGUgbWFjcm9ibG9jayBhdCB0aGUgZ2l2ZW4gYWRkcmVzcyBpcyBhdmFpbGFibGUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8KaW50IG1iX2lzX2F2YWlsYWJsZShpbnQgbWJBZGRyLCBpbnQgY3Vyck1iQWRkcikKewogIGlmICgobWJBZGRyIDwgMCkgfHwgKG1iQWRkciA+ICgoaW50KWltZy0+UGljU2l6ZUluTWJzIC0gMSkpKQogICAgcmV0dXJuIDA7CgogIC8vIHRoZSBmb2xsb3dpbmcgbGluZSBjaGVja3MgYm90aDogc2xpY2UgbnVtYmVyIGFuZCBpZiB0aGUgbWIgaGFzIGJlZW4gZGVjb2RlZAogIGlmICghaW1nLT5EZWJsb2NrQ2FsbCkKICB7CiAgICBpZiAoaW1nLT5tYl9kYXRhW21iQWRkcl0uc2xpY2VfbnIgIT0gaW1nLT5tYl9kYXRhW2N1cnJNYkFkZHJdLnNsaWNlX25yKQogICAgICByZXR1cm4gMDsKICB9CgogIHJldHVybiAxOwp9CgoKLyohCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogXGJyaWVmCiAqICAgIENoZWNrcyB0aGUgYXZhaWxhYmlsaXR5IG9mIG5laWdoYm9yaW5nIG1hY3JvYmxvY2tzIG9mCiAqICAgIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgZm9yIHByZWRpY3Rpb24gYW5kIGNvbnRleHQgZGV0ZXJtaW5hdGlvbjsKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8Kdm9pZCBDaGVja0F2YWlsYWJpbGl0eU9mTmVpZ2hib3JzKHZvaWQpCnsKICBjb25zdCBpbnQgbWJfbnIgPSBpbWctPmN1cnJlbnRfbWJfbnI7CiAgTWFjcm9ibG9jayAqY3Vyck1CID0gJmltZy0+bWJfZGF0YVttYl9ucl07CgogIC8vIG1hcmsgYWxsIG5laWdoYm9ycyBhcyB1bmF2YWlsYWJsZQogIGN1cnJNQi0+bWJfYXZhaWxhYmxlX3VwICAgPSBOVUxMOwogIGN1cnJNQi0+bWJfYXZhaWxhYmxlX2xlZnQgPSBOVUxMOwoKICBpZiAoaW1nLT5NYmFmZkZyYW1lRmxhZykKICB7CiAgICBpbnQgY3VyX21iX3BhaXIgPSBtYl9uciA+PiAxOwogICAgY3Vyck1CLT5tYkFkZHJBID0gMiAqIChjdXJfbWJfcGFpciAtIDEpOwogICAgY3Vyck1CLT5tYkFkZHJCID0gMiAqIChjdXJfbWJfcGFpciAtIGltZy0+UGljV2lkdGhJbk1icyk7CiAgICBjdXJyTUItPm1iQWRkckMgPSAyICogKGN1cl9tYl9wYWlyIC0gaW1nLT5QaWNXaWR0aEluTWJzICsgMSk7CiAgICBjdXJyTUItPm1iQWRkckQgPSAyICogKGN1cl9tYl9wYWlyIC0gaW1nLT5QaWNXaWR0aEluTWJzIC0gMSk7CgogICAgY3Vyck1CLT5tYkF2YWlsQSA9IG1iX2lzX2F2YWlsYWJsZShjdXJyTUItPm1iQWRkckEsIG1iX25yKSAmJiAoKFBpY1Bvc1tjdXJfbWJfcGFpciAgICBdWzBdKSE9MCk7CiAgICBjdXJyTUItPm1iQXZhaWxCID0gbWJfaXNfYXZhaWxhYmxlKGN1cnJNQi0+bWJBZGRyQiwgbWJfbnIpOwogICAgY3Vyck1CLT5tYkF2YWlsQyA9IG1iX2lzX2F2YWlsYWJsZShjdXJyTUItPm1iQWRkckMsIG1iX25yKSAmJiAoKFBpY1Bvc1tjdXJfbWJfcGFpciArIDFdWzBdKSE9MCk7CiAgICBjdXJyTUItPm1iQXZhaWxEID0gbWJfaXNfYXZhaWxhYmxlKGN1cnJNQi0+bWJBZGRyRCwgbWJfbnIpICYmICgoUGljUG9zW2N1cl9tYl9wYWlyICAgIF1bMF0pIT0wKTsKICB9CiAgZWxzZQogIHsKICAgIGN1cnJNQi0+bWJBZGRyQSA9IG1iX25yIC0gMTsKICAgIGN1cnJNQi0+bWJBZGRyQiA9IG1iX25yIC0gaW1nLT5QaWNXaWR0aEluTWJzOwogICAgY3Vyck1CLT5tYkFkZHJDID0gbWJfbnIgLSBpbWctPlBpY1dpZHRoSW5NYnMgKyAxOwogICAgY3Vyck1CLT5tYkFkZHJEID0gbWJfbnIgLSBpbWctPlBpY1dpZHRoSW5NYnMgLSAxOwoKICAgIGN1cnJNQi0+bWJBdmFpbEEgPSBtYl9pc19hdmFpbGFibGUoY3Vyck1CLT5tYkFkZHJBLCBtYl9ucikgJiYgKChQaWNQb3NbbWJfbnIgICAgXVswXSkhPTApOwogICAgY3Vyck1CLT5tYkF2YWlsQiA9IG1iX2lzX2F2YWlsYWJsZShjdXJyTUItPm1iQWRkckIsIG1iX25yKTsKICAgIGN1cnJNQi0+bWJBdmFpbEMgPSBtYl9pc19hdmFpbGFibGUoY3Vyck1CLT5tYkFkZHJDLCBtYl9ucikgJiYgKChQaWNQb3NbbWJfbnIgKyAxXVswXSkhPTApOwogICAgY3Vyck1CLT5tYkF2YWlsRCA9IG1iX2lzX2F2YWlsYWJsZShjdXJyTUItPm1iQWRkckQsIG1iX25yKSAmJiAoKFBpY1Bvc1ttYl9uciAgICBdWzBdKSE9MCk7CiAgfQoKICBpZiAoY3Vyck1CLT5tYkF2YWlsQSkgY3Vyck1CLT5tYl9hdmFpbGFibGVfbGVmdCA9ICYoaW1nLT5tYl9kYXRhW2N1cnJNQi0+bWJBZGRyQV0pOwogIGlmIChjdXJyTUItPm1iQXZhaWxCKSBjdXJyTUItPm1iX2F2YWlsYWJsZV91cCAgID0gJihpbWctPm1iX2RhdGFbY3Vyck1CLT5tYkFkZHJCXSk7Cn0KCgovKiEKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBcYnJpZWYKICogICAgcmV0dXJucyB0aGUgeCBhbmQgeSBtYWNyb2Jsb2NrIGNvb3JkaW5hdGVzIGZvciBhIGdpdmVuIE1iQWRkcmVzcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwp2b2lkIGdldF9tYl9ibG9ja19wb3Nfbm9ybWFsIChpbnQgbWJfYWRkciwgaW50ICp4LCBpbnQqeSkKewogICp4ID0gUGljUG9zWyBtYl9hZGRyIF1bMF07CiAgKnkgPSBQaWNQb3NbIG1iX2FkZHIgXVsxXTsKfQoKLyohCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogXGJyaWVmCiAqICAgIHJldHVybnMgdGhlIHggYW5kIHkgbWFjcm9ibG9jayBjb29yZGluYXRlcyBmb3IgYSBnaXZlbiBNYkFkZHJlc3MKICogICAgZm9yIG1iYWZmIHR5cGUgc2xpY2VzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCnZvaWQgZ2V0X21iX2Jsb2NrX3Bvc19tYmFmZiAoaW50IG1iX2FkZHIsIGludCAqeCwgaW50KnkpCnsKICAqeCA9ICBQaWNQb3NbbWJfYWRkcj4+MV1bMF07CiAgKnkgPSAoUGljUG9zW21iX2FkZHI+PjFdWzFdIDw8IDEpICsgKG1iX2FkZHIgJiAweDAxKTsKfQoKLyohCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogXGJyaWVmCiAqICAgIHJldHVybnMgdGhlIHggYW5kIHkgc2FtcGxlIGNvb3JkaW5hdGVzIGZvciBhIGdpdmVuIE1iQWRkcmVzcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwp2b2lkIGdldF9tYl9wb3MgKGludCBtYl9hZGRyLCBpbnQgKngsIGludCp5LCBpbnQgaXNfY2hyb21hKQp7CiAgZ2V0X21iX2Jsb2NrX3BvcyhtYl9hZGRyLCB4LCB5KTsKCiAgKCp4KSAqPSBpbWctPm1iX3NpemVbaXNfY2hyb21hXVswXTsKICAoKnkpICo9IGltZy0+bWJfc2l6ZVtpc19jaHJvbWFdWzFdOwp9CgoKLyohCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogXGJyaWVmCiAqICAgIGdldCBuZWlnaGJvdXJpbmcgcG9zaXRpb25zIGZvciBub24tYWZmIGNvZGluZwogKiBccGFyYW0gY3Vycl9tYl9ucgogKiAgIGN1cnJlbnQgbWFjcm9ibG9jayBudW1iZXIgKGRlY29kaW5nIG9yZGVyKQogKiBccGFyYW0geE4KICogICAgaW5wdXQgeCBwb3NpdGlvbgogKiBccGFyYW0geU4KICogICAgaW5wdXQgeSBwb3NpdGlvbgogKiBccGFyYW0gbHVtYQogKiAgICAxIGlmIGx1bWEgY29kaW5nLCAwIGZvciBjaHJvbWEKICogXHBhcmFtIHBpeAogKiAgICByZXR1cm5zIHBvc2l0aW9uIGluZm9ybWF0aW9ucwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwp2b2lkIGdldE5vbkFmZk5laWdoYm91cih1bnNpZ25lZCBpbnQgY3Vycl9tYl9uciwgaW50IHhOLCBpbnQgeU4sIGludCBpc19jaHJvbWEsIFBpeGVsUG9zICpwaXgpCnsKICBNYWNyb2Jsb2NrICpjdXJyTWIgPSAmaW1nLT5tYl9kYXRhW2N1cnJfbWJfbnJdOwogIGludCBtYXhXID0gaW1nLT5tYl9zaXplW2lzX2Nocm9tYV1bMF0sIG1heEggPSBpbWctPm1iX3NpemVbaXNfY2hyb21hXVsxXTsKLyoKICBpZiAoIWlzX2Nocm9tYSkKICB7CiAgICBtYXhXID0gMTY7CiAgICBtYXhIID0gMTY7CiAgfQogIGVsc2UKICB7CiAgICBhc3NlcnQoaW1nLT55dXZfZm9ybWF0ICE9IDApOwogICAgbWF4VyA9IGltZy0+bWJfY3Jfc2l6ZV94OwogICAgbWF4SCA9IGltZy0+bWJfY3Jfc2l6ZV95OwogIH0KKi8KCiAgaWYgKCh4TjwwKSYmKHlOPDApKQogIHsKICAgIHBpeC0+bWJfYWRkciAgID0gY3Vyck1iLT5tYkFkZHJEOwogICAgcGl4LT5hdmFpbGFibGUgPSBjdXJyTWItPm1iQXZhaWxEOwogIH0KICBlbHNlIGlmICgoeE48MCkmJigoeU4+PTApJiYoeU48bWF4SCkpKQogIHsKICAgIHBpeC0+bWJfYWRkciAgPSBjdXJyTWItPm1iQWRkckE7CiAgICBwaXgtPmF2YWlsYWJsZSA9IGN1cnJNYi0+bWJBdmFpbEE7CiAgfQogIGVsc2UgaWYgKCgoeE4+PTApJiYoeE48bWF4VykpJiYoeU48MCkpCiAgewogICAgcGl4LT5tYl9hZGRyICA9IGN1cnJNYi0+bWJBZGRyQjsKICAgIHBpeC0+YXZhaWxhYmxlID0gY3Vyck1iLT5tYkF2YWlsQjsKICB9CiAgZWxzZSBpZiAoKCh4Tj49MCkmJih4TjxtYXhXKSkmJigoeU4+PTApJiYoeU48bWF4SCkpKQogIHsKICAgIHBpeC0+bWJfYWRkciAgPSBjdXJyX21iX25yOwogICAgcGl4LT5hdmFpbGFibGUgPSBUUlVFOwogIH0KICBlbHNlIGlmICgoeE4+PW1heFcpJiYoeU48MCkpCiAgewogICAgcGl4LT5tYl9hZGRyICA9IGN1cnJNYi0+bWJBZGRyQzsKICAgIHBpeC0+YXZhaWxhYmxlID0gY3Vyck1iLT5tYkF2YWlsQzsKICB9CiAgZWxzZQogIHsKICAgIHBpeC0+YXZhaWxhYmxlID0gRkFMU0U7CiAgfQoKICBpZiAocGl4LT5hdmFpbGFibGUgfHwgaW1nLT5EZWJsb2NrQ2FsbCkKICB7CiAgICBpbnQgKkN1clBvcyA9IFBpY1Bvc1sgcGl4LT5tYl9hZGRyIF07CgogICAgcGl4LT54ID0geE4gJiAobWF4VyAtIDEpOwogICAgcGl4LT55ID0geU4gJiAobWF4SCAtIDEpOwogICAgcGl4LT5wb3NfeCA9IEN1clBvc1swXSAqIG1heFcgKyBwaXgtPng7CiAgICBwaXgtPnBvc195ID0gQ3VyUG9zWzFdICogbWF4SCArIHBpeC0+eTsKICB9Cn0KCi8qIQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFxicmllZgogKiAgICBnZXQgbmVpZ2hib3VyaW5nIHBvc2l0aW9ucyBmb3IgYWZmIGNvZGluZwogKiBccGFyYW0gY3Vycl9tYl9ucgogKiAgIGN1cnJlbnQgbWFjcm9ibG9jayBudW1iZXIgKGRlY29kaW5nIG9yZGVyKQogKiBccGFyYW0geE4KICogICAgaW5wdXQgeCBwb3NpdGlvbgogKiBccGFyYW0geU4KICogICAgaW5wdXQgeSBwb3NpdGlvbgogKiBccGFyYW0gbHVtYQogKiAgICAxIGlmIGx1bWEgY29kaW5nLCAwIGZvciBjaHJvbWEKICogXHBhcmFtIHBpeAogKiAgICByZXR1cm5zIHBvc2l0aW9uIGluZm9ybWF0aW9ucwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwp2b2lkIGdldEFmZk5laWdoYm91cih1bnNpZ25lZCBpbnQgY3Vycl9tYl9uciwgaW50IHhOLCBpbnQgeU4sIGludCBpc19jaHJvbWEsIFBpeGVsUG9zICpwaXgpCnsKICBNYWNyb2Jsb2NrICpjdXJyTWIgPSAmaW1nLT5tYl9kYXRhW2N1cnJfbWJfbnJdOwogIGludCBtYXhXLCBtYXhIOwogIGludCB5TSA9IC0xOwoKLyoKICBpZiAoIWlzX2Nocm9tYSkKICB7CiAgICBtYXhXID0gMTY7CiAgICBtYXhIID0gMTY7CiAgfQogIGVsc2UKICB7CiAgICBhc3NlcnQoaW1nLT55dXZfZm9ybWF0ICE9IDApOwogICAgbWF4VyA9IGltZy0+bWJfY3Jfc2l6ZV94OwogICAgbWF4SCA9IGltZy0+bWJfY3Jfc2l6ZV95OwogIH0KKi8KICBtYXhXID0gaW1nLT5tYl9zaXplW2lzX2Nocm9tYV1bMF07CiAgbWF4SCA9IGltZy0+bWJfc2l6ZVtpc19jaHJvbWFdWzFdOwoKICAvLyBpbml0aWFsaXplIHRvICJub3QgYXZhaWxhYmxlIgogIHBpeC0+YXZhaWxhYmxlID0gRkFMU0U7CgogIGlmKHlOID4gKG1heEggLSAxKSkKICB7CiAgICByZXR1cm47CiAgfQogIGlmICh4TiA+IChtYXhXIC0gMSkgJiYgeU4gPj0gMCAmJiB5TiA8IG1heEgpCiAgewogICAgcmV0dXJuOwogIH0KCiAgaWYgKHhOIDwgMCkKICB7CiAgICBpZiAoeU4gPCAwKQogICAgewogICAgICBpZighY3Vyck1iLT5tYl9maWVsZCkKICAgICAgewogICAgICAgIC8vIGZyYW1lCiAgICAgICAgaWYgKChjdXJyX21iX25yICYgMHgwMSkgPT0gMCkKICAgICAgICB7CiAgICAgICAgICAvLyB0b3AKICAgICAgICAgIHBpeC0+bWJfYWRkciAgID0gY3Vyck1iLT5tYkFkZHJEICArIDE7CiAgICAgICAgICBwaXgtPmF2YWlsYWJsZSA9IGN1cnJNYi0+bWJBdmFpbEQ7CiAgICAgICAgICB5TSA9IHlOOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgLy8gYm90dG9tCiAgICAgICAgICBwaXgtPm1iX2FkZHIgICA9IGN1cnJNYi0+bWJBZGRyQTsKICAgICAgICAgIHBpeC0+YXZhaWxhYmxlID0gY3Vyck1iLT5tYkF2YWlsQTsKICAgICAgICAgIGlmIChjdXJyTWItPm1iQXZhaWxBKQogICAgICAgICAgewogICAgICAgICAgICBpZighaW1nLT5tYl9kYXRhW2N1cnJNYi0+bWJBZGRyQV0ubWJfZmllbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgeU0gPSB5TjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAocGl4LT5tYl9hZGRyKSsrOwogICAgICAgICAgICAgICB5TSA9ICh5TiArIG1heEgpID4+IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgLy8gZmllbGQKICAgICAgICBpZiAoKGN1cnJfbWJfbnIgJiAweDAxKSA9PSAwKQogICAgICAgIHsKICAgICAgICAgIC8vIHRvcAogICAgICAgICAgcGl4LT5tYl9hZGRyICAgPSBjdXJyTWItPm1iQWRkckQ7CiAgICAgICAgICBwaXgtPmF2YWlsYWJsZSA9IGN1cnJNYi0+bWJBdmFpbEQ7CiAgICAgICAgICBpZiAoY3Vyck1iLT5tYkF2YWlsRCkKICAgICAgICAgIHsKICAgICAgICAgICAgaWYoIWltZy0+bWJfZGF0YVtjdXJyTWItPm1iQWRkckRdLm1iX2ZpZWxkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgKHBpeC0+bWJfYWRkcikrKzsKICAgICAgICAgICAgICAgeU0gPSAyICogeU47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIHlNID0geU47CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgIC8vIGJvdHRvbQogICAgICAgICAgcGl4LT5tYl9hZGRyICAgPSBjdXJyTWItPm1iQWRkckQrMTsKICAgICAgICAgIHBpeC0+YXZhaWxhYmxlID0gY3Vyck1iLT5tYkF2YWlsRDsKICAgICAgICAgIHlNID0geU47CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7IC8vIHhOIDwgMCAmJiB5TiA+PSAwCiAgICAgIGlmICh5TiA+PSAwICYmIHlOIDxtYXhIKQogICAgICB7CiAgICAgICAgaWYgKCFjdXJyTWItPm1iX2ZpZWxkKQogICAgICAgIHsKICAgICAgICAgIC8vIGZyYW1lCiAgICAgICAgICBpZiAoKGN1cnJfbWJfbnIgJiAweDAxKSA9PSAwKQogICAgICAgICAgewogICAgICAgICAgICAvLyB0b3AKICAgICAgICAgICAgcGl4LT5tYl9hZGRyICAgPSBjdXJyTWItPm1iQWRkckE7CiAgICAgICAgICAgIHBpeC0+YXZhaWxhYmxlID0gY3Vyck1iLT5tYkF2YWlsQTsKICAgICAgICAgICAgaWYgKGN1cnJNYi0+bWJBdmFpbEEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBpZighaW1nLT5tYl9kYXRhW2N1cnJNYi0+bWJBZGRyQV0ubWJfZmllbGQpCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHlNID0geU47CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAocGl4LT5tYl9hZGRyKSs9ICgoeU4gJiAweDAxKSAhPSAwKTsKICAgICAgICAgICAgICAgIHlNID0geU4gPj4gMTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGVsc2UKICAgICAgICAgIHsKICAgICAgICAgICAgLy8gYm90dG9tCiAgICAgICAgICAgIHBpeC0+bWJfYWRkciAgID0gY3Vyck1iLT5tYkFkZHJBOwogICAgICAgICAgICBwaXgtPmF2YWlsYWJsZSA9IGN1cnJNYi0+bWJBdmFpbEE7CiAgICAgICAgICAgIGlmIChjdXJyTWItPm1iQXZhaWxBKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgaWYoIWltZy0+bWJfZGF0YVtjdXJyTWItPm1iQWRkckFdLm1iX2ZpZWxkKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIChwaXgtPm1iX2FkZHIpKys7CiAgICAgICAgICAgICAgICAgeU0gPSB5TjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIChwaXgtPm1iX2FkZHIpKz0gKCh5TiAmIDB4MDEpICE9IDApOwogICAgICAgICAgICAgICAgeU0gPSAoeU4gKyBtYXhIKSA+PiAxOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgLy8gZmllbGQKICAgICAgICAgIGlmICgoY3Vycl9tYl9uciAmIDB4MDEpID09IDApCiAgICAgICAgICB7CiAgICAgICAgICAgIC8vIHRvcAogICAgICAgICAgICBwaXgtPm1iX2FkZHIgID0gY3Vyck1iLT5tYkFkZHJBOwogICAgICAgICAgICBwaXgtPmF2YWlsYWJsZSA9IGN1cnJNYi0+bWJBdmFpbEE7CiAgICAgICAgICAgIGlmIChjdXJyTWItPm1iQXZhaWxBKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgaWYoIWltZy0+bWJfZGF0YVtjdXJyTWItPm1iQWRkckFdLm1iX2ZpZWxkKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh5TiA8IChtYXhIID4+IDEpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgeU0gPSB5TiA8PCAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAocGl4LT5tYl9hZGRyKSsrOwogICAgICAgICAgICAgICAgICAgeU0gPSAoeU4gPDwgMSApIC0gbWF4SDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB5TSA9IHlOOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgZWxzZQogICAgICAgICAgewogICAgICAgICAgICAvLyBib3R0b20KICAgICAgICAgICAgcGl4LT5tYl9hZGRyICA9IGN1cnJNYi0+bWJBZGRyQTsKICAgICAgICAgICAgcGl4LT5hdmFpbGFibGUgPSBjdXJyTWItPm1iQXZhaWxBOwogICAgICAgICAgICBpZiAoY3Vyck1iLT5tYkF2YWlsQSkKICAgICAgICAgICAgewogICAgICAgICAgICAgIGlmKCFpbWctPm1iX2RhdGFbY3Vyck1iLT5tYkFkZHJBXS5tYl9maWVsZCkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoeU4gPCAobWF4SCA+PiAxKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgeU0gPSAoeU4gPDwgMSkgKyAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAocGl4LT5tYl9hZGRyKSsrOwogICAgICAgICAgICAgICAgICAgeU0gPSAoeU4gPDwgMSApICsgMSAtIG1heEg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAocGl4LT5tYl9hZGRyKSsrOwogICAgICAgICAgICAgICAgIHlNID0geU47CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIGVsc2UKICB7IC8vIHhOID49IDAKICAgIGlmICh4TiA+PSAwICYmIHhOIDwgbWF4VykKICAgIHsKICAgICAgaWYgKHlOPDApCiAgICAgIHsKICAgICAgICBpZiAoIWN1cnJNYi0+bWJfZmllbGQpCiAgICAgICAgewogICAgICAgICAgLy9mcmFtZQogICAgICAgICAgaWYgKChjdXJyX21iX25yICYgMHgwMSkgPT0gMCkKICAgICAgICAgIHsKICAgICAgICAgICAgLy90b3AKICAgICAgICAgICAgcGl4LT5tYl9hZGRyICA9IGN1cnJNYi0+bWJBZGRyQjsKICAgICAgICAgICAgLy8gZm9yIHRoZSBkZWJsb2NrZXIgaWYgdGhlIGN1cnJlbnQgTUIgaXMgYSBmcmFtZSBhbmQgdGhlIG9uZSBhYm92ZSBpcyBhIGZpZWxkCiAgICAgICAgICAgIC8vIHRoZW4gdGhlIG5laWdoYm9yIGlzIHRoZSB0b3AgTUIgb2YgdGhlIHBhaXIKICAgICAgICAgICAgaWYgKGN1cnJNYi0+bWJBdmFpbEIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBpZiAoIShpbWctPkRlYmxvY2tDYWxsID09IDEgJiYgKGltZy0+bWJfZGF0YVtjdXJyTWItPm1iQWRkckJdKS5tYl9maWVsZCkpCiAgICAgICAgICAgICAgICBwaXgtPm1iX2FkZHIgICs9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHBpeC0+YXZhaWxhYmxlID0gY3Vyck1iLT5tYkF2YWlsQjsKICAgICAgICAgICAgeU0gPSB5TjsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UKICAgICAgICAgIHsKICAgICAgICAgICAgLy8gYm90dG9tCiAgICAgICAgICAgIHBpeC0+bWJfYWRkciAgID0gY3Vycl9tYl9uciAtIDE7CiAgICAgICAgICAgIHBpeC0+YXZhaWxhYmxlID0gVFJVRTsKICAgICAgICAgICAgeU0gPSB5TjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgIC8vIGZpZWxkCiAgICAgICAgICBpZiAoKGN1cnJfbWJfbnIgJiAweDAxKSA9PSAwKQogICAgICAgICAgewogICAgICAgICAgICAvLyB0b3AKICAgICAgICAgICAgcGl4LT5tYl9hZGRyICAgPSBjdXJyTWItPm1iQWRkckI7CiAgICAgICAgICAgIHBpeC0+YXZhaWxhYmxlID0gY3Vyck1iLT5tYkF2YWlsQjsKICAgICAgICAgICAgaWYgKGN1cnJNYi0+bWJBdmFpbEIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBpZighaW1nLT5tYl9kYXRhW2N1cnJNYi0+bWJBZGRyQl0ubWJfZmllbGQpCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgKHBpeC0+bWJfYWRkcikrKzsKICAgICAgICAgICAgICAgICB5TSA9IDIqIHlOOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHlNID0geU47CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlCiAgICAgICAgICB7CiAgICAgICAgICAgIC8vIGJvdHRvbQogICAgICAgICAgICBwaXgtPm1iX2FkZHIgICA9IGN1cnJNYi0+bWJBZGRyQiArIDE7CiAgICAgICAgICAgIHBpeC0+YXZhaWxhYmxlID0gY3Vyck1iLT5tYkF2YWlsQjsKICAgICAgICAgICAgeU0gPSB5TjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgLy8geU4gPj0wCiAgICAgICAgLy8gZm9yIHRoZSBkZWJsb2NrZXIgaWYgdGhpcyBpcyB0aGUgZXh0cmEgZWRnZSB0aGVuIGRvIHRoaXMgc3BlY2lhbCBzdHVmZgogICAgICAgIGlmICh5TiA9PSAwICYmIGltZy0+RGVibG9ja0NhbGwgPT0gMikKICAgICAgICB7CiAgICAgICAgICBwaXgtPm1iX2FkZHIgID0gY3Vyck1iLT5tYkFkZHJCICsgMTsKICAgICAgICAgIHBpeC0+YXZhaWxhYmxlID0gVFJVRTsKICAgICAgICAgIHlNID0geU4gLSAxOwogICAgICAgIH0KCiAgICAgICAgZWxzZSBpZiAoKHlOID49IDApICYmICh5TiA8bWF4SCkpCiAgICAgICAgewogICAgICAgICAgcGl4LT5tYl9hZGRyICAgPSBjdXJyX21iX25yOwogICAgICAgICAgcGl4LT5hdmFpbGFibGUgPSBUUlVFOwogICAgICAgICAgeU0gPSB5TjsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsgLy8geE4gPj0gbWF4VwogICAgICBpZih5TiA8IDApCiAgICAgIHsKICAgICAgICBpZiAoIWN1cnJNYi0+bWJfZmllbGQpCiAgICAgICAgewogICAgICAgICAgLy8gZnJhbWUKICAgICAgICAgIGlmICgoY3Vycl9tYl9uciAmIDB4MDEpID09IDApCiAgICAgICAgICB7CiAgICAgICAgICAgIC8vIHRvcAogICAgICAgICAgICBwaXgtPm1iX2FkZHIgID0gY3Vyck1iLT5tYkFkZHJDICsgMTsKICAgICAgICAgICAgcGl4LT5hdmFpbGFibGUgPSBjdXJyTWItPm1iQXZhaWxDOwogICAgICAgICAgICB5TSA9IHlOOwogICAgICAgICAgfQogICAgICAgICAgZWxzZQogICAgICAgICAgewogICAgICAgICAgICAvLyBib3R0b20KICAgICAgICAgICAgcGl4LT5hdmFpbGFibGUgPSBGQUxTRTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgIC8vIGZpZWxkCiAgICAgICAgICBpZiAoKGN1cnJfbWJfbnIgJiAweDAxKSA9PSAwKQogICAgICAgICAgewogICAgICAgICAgICAvLyB0b3AKICAgICAgICAgICAgcGl4LT5tYl9hZGRyICAgPSBjdXJyTWItPm1iQWRkckM7CiAgICAgICAgICAgIHBpeC0+YXZhaWxhYmxlID0gY3Vyck1iLT5tYkF2YWlsQzsKICAgICAgICAgICAgaWYgKGN1cnJNYi0+bWJBdmFpbEMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBpZighaW1nLT5tYl9kYXRhW2N1cnJNYi0+bWJBZGRyQ10ubWJfZmllbGQpCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgKHBpeC0+bWJfYWRkcikrKzsKICAgICAgICAgICAgICAgICB5TSA9IDIqIHlOOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgeU0gPSB5TjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGVsc2UKICAgICAgICAgIHsKICAgICAgICAgICAgLy8gYm90dG9tCiAgICAgICAgICAgIHBpeC0+bWJfYWRkciAgID0gY3Vyck1iLT5tYkFkZHJDICsgMTsKICAgICAgICAgICAgcGl4LT5hdmFpbGFibGUgPSBjdXJyTWItPm1iQXZhaWxDOwogICAgICAgICAgICB5TSA9IHlOOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICBpZiAocGl4LT5hdmFpbGFibGUgfHwgaW1nLT5EZWJsb2NrQ2FsbCkKICB7CiAgICBwaXgtPnggPSB4TiAmIChtYXhXIC0gMSk7CiAgICBwaXgtPnkgPSB5TSAmIChtYXhIIC0gMSk7CiAgICBnZXRfbWJfcG9zKHBpeC0+bWJfYWRkciwgJihwaXgtPnBvc194KSwgJihwaXgtPnBvc195KSwgaXNfY2hyb21hKTsKICAgIHBpeC0+cG9zX3ggKz0gcGl4LT54OwogICAgcGl4LT5wb3NfeSArPSBwaXgtPnk7CiAgfQp9CgoKLyohCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogXGJyaWVmCiAqICAgIGdldCBuZWlnaGJvdXJpbmcgcG9zaXRpb25zLiBNQiBBRkYgaXMgYXV0b21hdGljYWxseSB1c2VkIGZyb20gaW1nIHN0cnVjdHVyZQogKiBccGFyYW0gY3Vycl9tYl9ucgogKiAgIGN1cnJlbnQgbWFjcm9ibG9jayBudW1iZXIgKGRlY29kaW5nIG9yZGVyKQogKiBccGFyYW0geE4KICogICAgaW5wdXQgeCBwb3NpdGlvbgogKiBccGFyYW0geU4KICogICAgaW5wdXQgeSBwb3NpdGlvbgogKiBccGFyYW0gbHVtYQogKiAgICAxIGlmIGx1bWEgY29kaW5nLCAwIGZvciBjaHJvbWEKICogXHBhcmFtIHBpeAogKiAgICByZXR1cm5zIHBvc2l0aW9uIGluZm9ybWF0aW9ucwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwovKgp2b2lkIGdldE5laWdoYm91cihpbnQgY3Vycl9tYl9uciwgaW50IHhOLCBpbnQgeU4sIGludCBpc19jaHJvbWEsIFBpeGVsUG9zICpwaXgpCnsKICBpZiAoY3Vycl9tYl9ucjwwKQogICAgZXJyb3IgKCJnZXROZWlnaGJvdXI6IGludmFsaWQgbWFjcm9ibG9jayBudW1iZXIiLCAxMDApOwoKICBpZiAoaW1nLT5NYmFmZkZyYW1lRmxhZykKICAgIGdldEFmZk5laWdoYm91cihjdXJyX21iX25yLCB4TiwgeU4sIGlzX2Nocm9tYSwgcGl4KTsKICBlbHNlCiAgICBnZXROb25BZmZOZWlnaGJvdXIoY3Vycl9tYl9uciwgeE4sIHlOLCBpc19jaHJvbWEsIHBpeCk7Cn0KKi8KCi8qIQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFxicmllZgogKiAgICBnZXQgbmVpZ2hib3VyaW5nICBnZXQgbmVpZ2hib3VyaW5nIDR4NCBsdW1hIGJsb2NrCiAqIFxwYXJhbSBjdXJyX21iX25yCiAqICAgY3VycmVudCBtYWNyb2Jsb2NrIG51bWJlciAoZGVjb2Rpbmcgb3JkZXIpCiAqIFxwYXJhbSBibG9ja194CiAqICAgIGlucHV0IHggYmxvY2sgcG9zaXRpb24KICogXHBhcmFtIGJsb2NrX3kKICogICAgaW5wdXQgeSBibG9jayBwb3NpdGlvbgogKiBccGFyYW0gcmVsX3gKICogICAgcmVsYXRpdmUgeCBwb3NpdGlvbiBvZiBuZWlnaGJvcgogKiBccGFyYW0gcmVsX3kKICogICAgcmVsYXRpdmUgeSBwb3NpdGlvbiBvZiBuZWlnaGJvcgogKiBccGFyYW0gcGl4CiAqICAgIHJldHVybnMgcG9zaXRpb24gaW5mb3JtYXRpb25zCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCnZvaWQgZ2V0THVtYTR4NE5laWdoYm91ciAoaW50IGN1cnJfbWJfbnIsIGludCBibG9ja194X3BvcywgaW50IGJsb2NrX3lfcG9zLCBQaXhlbFBvcyAqcGl4KQp7CiAgZ2V0TmVpZ2hib3VyKGN1cnJfbWJfbnIsIGJsb2NrX3hfcG9zLCBibG9ja195X3BvcywgSVNfTFVNQSwgcGl4KTsKCiAgaWYgKHBpeC0+YXZhaWxhYmxlKQogIHsKICAgIHBpeC0+eCA+Pj0gMjsKICAgIHBpeC0+eSA+Pj0gMjsKICAgIHBpeC0+cG9zX3ggPj49IDI7CiAgICBwaXgtPnBvc195ID4+PSAyOwogIH0KfQoKCi8qIQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFxicmllZgogKiAgICBnZXQgbmVpZ2hib3VyaW5nIDR4NCBjaHJvbWEgYmxvY2sKICogXHBhcmFtIGN1cnJfbWJfbnIKICogICBjdXJyZW50IG1hY3JvYmxvY2sgbnVtYmVyIChkZWNvZGluZyBvcmRlcikKICogXHBhcmFtIGJsb2NrX3gKICogICAgaW5wdXQgeCBibG9jayBwb3NpdGlvbgogKiBccGFyYW0gYmxvY2tfeQogKiAgICBpbnB1dCB5IGJsb2NrIHBvc2l0aW9uCiAqIFxwYXJhbSByZWxfeAogKiAgICByZWxhdGl2ZSB4IHBvc2l0aW9uIG9mIG5laWdoYm9yCiAqIFxwYXJhbSByZWxfeQogKiAgICByZWxhdGl2ZSB5IHBvc2l0aW9uIG9mIG5laWdoYm9yCiAqIFxwYXJhbSBwaXgKICogICAgcmV0dXJucyBwb3NpdGlvbiBpbmZvcm1hdGlvbnMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8Kdm9pZCBnZXRDaHJvbWE0eDROZWlnaGJvdXIgKGludCBjdXJyX21iX25yLCBpbnQgYmxvY2tfeCwgaW50IGJsb2NrX3ksIFBpeGVsUG9zICpwaXgpCnsKICBnZXROZWlnaGJvdXIoY3Vycl9tYl9uciwgYmxvY2tfeCwgYmxvY2tfeSwgSVNfQ0hST01BLCBwaXgpOwoKICBpZiAocGl4LT5hdmFpbGFibGUpCiAgewogICAgcGl4LT54ID4+PSAyOwogICAgcGl4LT55ID4+PSAyOwogICAgcGl4LT5wb3NfeCA+Pj0gMjsKICAgIHBpeC0+cG9zX3kgPj49IDI7CiAgfQp9Cg==