LyoKICBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxNiBTYW0gTGFudGluZ2EgPHNsb3VrZW5AbGlic2RsLm9yZz4KCiAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCiAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KCiAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCiAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAogIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKCiAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQogICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQogICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCiAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCiAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKi8KI2luY2x1ZGUgIi4uL1NETF9pbnRlcm5hbC5oIgoKLyoKICogUkxFIGVuY29kaW5nIGZvciBzb2Z0d2FyZSBjb2xvcmtleSBhbmQgYWxwaGEtY2hhbm5lbCBhY2NlbGVyYXRpb24KICoKICogT3JpZ2luYWwgdmVyc2lvbiBieSBTYW0gTGFudGluZ2EKICoKICogTWF0dGlhcyBFbmdkZWflcmQgKFlvcmljayk6IFJld3JpdGUuIE5ldyBlbmNvZGluZyBmb3JtYXQsIGVuY29kZXIgYW5kCiAqIGRlY29kZXIuIEFkZGVkIHBlci1zdXJmYWNlIGFscGhhIGJsaXR0ZXIuIEFkZGVkIHBlci1waXhlbCBhbHBoYQogKiBmb3JtYXQsIGVuY29kZXIgYW5kIGJsaXR0ZXIuCiAqCiAqIE1hbnkgdGhhbmtzIHRvIFhhcmsgYW5kIGpvaG5zIGZvciBoaW50cywgYmVuY2htYXJrcyBhbmQgdXNlZnVsIGNvbW1lbnRzCiAqIGxlYWRpbmcgdG8gdGhpcyBjb2RlLgogKgogKiBXZWxjb21lIHRvIE1hY3JvIE1heWhlbS4KICovCgovKgogKiBUaGUgZW5jb2RpbmcgdHJhbnNsYXRlcyB0aGUgaW1hZ2UgZGF0YSB0byBhIHN0cmVhbSBvZiBzZWdtZW50cyBvZiB0aGUgZm9ybQogKgogKiA8c2tpcD4gPHJ1bj4gPGRhdGE+CiAqCiAqIHdoZXJlIDxza2lwPiBpcyB0aGUgbnVtYmVyIG9mIHRyYW5zcGFyZW50IHBpeGVscyB0byBza2lwLAogKiAgICAgICA8cnVuPiAgaXMgdGhlIG51bWJlciBvZiBvcGFxdWUgcGl4ZWxzIHRvIGJsaXQsCiAqIGFuZCAgIDxkYXRhPiBhcmUgdGhlIHBpeGVscyB0aGVtc2VsdmVzLgogKgogKiBUaGlzIGJhc2ljIHN0cnVjdHVyZSBpcyB1c2VkIGJvdGggZm9yIGNvbG9ya2V5ZWQgc3VyZmFjZXMsIHVzZWQgZm9yIHNpbXBsZQogKiBiaW5hcnkgdHJhbnNwYXJlbmN5IGFuZCBmb3IgcGVyLXN1cmZhY2UgYWxwaGEgYmxlbmRpbmcsIGFuZCBmb3Igc3VyZmFjZXMKICogd2l0aCBwZXItcGl4ZWwgYWxwaGEuIFRoZSBkZXRhaWxzIGRpZmZlciwgaG93ZXZlcjoKICoKICogRW5jb2Rpbmcgb2YgY29sb3JrZXllZCBzdXJmYWNlczoKICoKICogICBFbmNvZGVkIHBpeGVscyBhbHdheXMgaGF2ZSB0aGUgc2FtZSBmb3JtYXQgYXMgdGhlIHRhcmdldCBzdXJmYWNlLgogKiAgIDxza2lwPiBhbmQgPHJ1bj4gYXJlIHVuc2lnbmVkIDggYml0IGludGVnZXJzLCBleGNlcHQgZm9yIDMyIGJpdCBkZXB0aAogKiAgIHdoZXJlIHRoZXkgYXJlIDE2IGJpdC4gVGhpcyBtYWtlcyB0aGUgcGl4ZWwgZGF0YSBhbGlnbmVkIGF0IGFsbCB0aW1lcy4KICogICBTZWdtZW50cyBuZXZlciB3cmFwIGFyb3VuZCBmcm9tIG9uZSBzY2FuIGxpbmUgdG8gdGhlIG5leHQuCiAqCiAqICAgVGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UgaXMgbWFya2VkIGJ5IGEgemVybyA8c2tpcD4sPHJ1bj4gcGFpciBhdCB0aGUgKgogKiAgIGJlZ2lubmluZyBvZiBhIGxpbmUuCiAqCiAqIEVuY29kaW5nIG9mIHN1cmZhY2VzIHdpdGggcGVyLXBpeGVsIGFscGhhOgogKgogKiAgIFRoZSBzZXF1ZW5jZSBiZWdpbnMgd2l0aCBhIHN0cnVjdCBSTEVEZXN0Rm9ybWF0IGRlc2NyaWJpbmcgdGhlIHRhcmdldAogKiAgIHBpeGVsIGZvcm1hdCwgdG8gcHJvdmlkZSByZWxpYWJsZSB1bi1lbmNvZGluZy4KICoKICogICBFYWNoIHNjYW4gbGluZSBpcyBlbmNvZGVkIHR3aWNlOiBGaXJzdCBhbGwgY29tcGxldGVseSBvcGFxdWUgcGl4ZWxzLAogKiAgIGVuY29kZWQgaW4gdGhlIHRhcmdldCBmb3JtYXQgYXMgZGVzY3JpYmVkIGFib3ZlLCBhbmQgdGhlbiBhbGwKICogICBwYXJ0aWFsbHkgdHJhbnNwYXJlbnQgKHRyYW5zbHVjZW50KSBwaXhlbHMgKHdoZXJlIDEgPD0gYWxwaGEgPD0gMjU0KSwKICogICBpbiB0aGUgZm9sbG93aW5nIDMyLWJpdCBmb3JtYXQ6CiAqCiAqICAgRm9yIDMyLWJpdCB0YXJnZXRzLCBlYWNoIHBpeGVsIGhhcyB0aGUgdGFyZ2V0IFJHQiBmb3JtYXQgYnV0IHdpdGgKICogICB0aGUgYWxwaGEgdmFsdWUgb2NjdXB5aW5nIHRoZSBoaWdoZXN0IDggYml0cy4gVGhlIDxza2lwPiBhbmQgPHJ1bj4KICogICBjb3VudHMgYXJlIDE2IGJpdC4KICoKICogICBGb3IgMTYtYml0IHRhcmdldHMsIGVhY2ggcGl4ZWwgaGFzIHRoZSB0YXJnZXQgUkdCIGZvcm1hdCwgYnV0IHdpdGgKICogICB0aGUgbWlkZGxlIGNvbXBvbmVudCAodXN1YWxseSBncmVlbikgc2hpZnRlZCAxNiBzdGVwcyB0byB0aGUgbGVmdCwKICogICBhbmQgdGhlIGhvbGUgZmlsbGVkIHdpdGggdGhlIDUgbW9zdCBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSBhbHBoYSB2YWx1ZS4KICogICBpLmUuIGlmIHRoZSB0YXJnZXQgaGFzIHRoZSBmb3JtYXQgICAgICAgICBycnJycmdnZ2dnZ2JiYmJiLAogKiAgIHRoZSBlbmNvZGVkIHBpeGVsIHdpbGwgYmUgMDAwMDBnZ2dnZ2cwMDAwMHJycnJyMGFhYWFhYmJiYmIuCiAqICAgVGhlIDxza2lwPiBhbmQgPHJ1bj4gY291bnRzIGFyZSA4IGJpdCBmb3IgdGhlIG9wYXF1ZSBsaW5lcywgMTYgYml0CiAqICAgZm9yIHRoZSB0cmFuc2x1Y2VudCBsaW5lcy4gVHdvIHBhZGRpbmcgYnl0ZXMgbWF5IGJlIGluc2VydGVkCiAqICAgYmVmb3JlIGVhY2ggdHJhbnNsdWNlbnQgbGluZSB0byBrZWVwIHRoZW0gMzItYml0IGFsaWduZWQuCiAqCiAqICAgVGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UgaXMgbWFya2VkIGJ5IGEgemVybyA8c2tpcD4sPHJ1bj4gcGFpciBhdCB0aGUKICogICBiZWdpbm5pbmcgb2YgYW4gb3BhcXVlIGxpbmUuCiAqLwoKI2luY2x1ZGUgIlNETF92aWRlby5oIgojaW5jbHVkZSAiU0RMX3N5c3ZpZGVvLmgiCiNpbmNsdWRlICJTRExfYmxpdC5oIgojaW5jbHVkZSAiU0RMX1JMRWFjY2VsX2MuaCIKCiNpZm5kZWYgTUFYCiNkZWZpbmUgTUFYKGEsIGIpICgoYSkgPiAoYikgPyAoYSkgOiAoYikpCiNlbmRpZgojaWZuZGVmIE1JTgojZGVmaW5lIE1JTihhLCBiKSAoKGEpIDwgKGIpID8gKGEpIDogKGIpKQojZW5kaWYKCiNkZWZpbmUgUElYRUxfQ09QWSh0bywgZnJvbSwgbGVuLCBicHApICAgICAgICAgIFwKICAgIFNETF9tZW1jcHkodG8sIGZyb20sIChzaXplX3QpKGxlbikgKiAoYnBwKSkKCi8qCiAqIFZhcmlvdXMgY29sb3JrZXkgYmxpdCBtZXRob2RzLCBmb3Igb3BhcXVlIGFuZCBwZXItc3VyZmFjZSBhbHBoYQogKi8KCiNkZWZpbmUgT1BBUVVFX0JMSVQodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSkgICBcCiAgICBQSVhFTF9DT1BZKHRvLCBmcm9tLCBsZW5ndGgsIGJwcCkKCi8qCiAqIEZvciAzMmJwcCBwaXhlbHMgb24gdGhlIGZvcm0gMHgwMHJyZ2diYjoKICogSWYgd2UgdHJlYXQgdGhlIG1pZGRsZSBjb21wb25lbnQgc2VwYXJhdGVseSwgd2UgY2FuIHByb2Nlc3MgdGhlIHR3bwogKiByZW1haW5pbmcgaW4gcGFyYWxsZWwuIFRoaXMgaXMgc2FmZSB0byBkbyBiZWNhdXNlIG9mIHRoZSBnYXAgdG8gdGhlIGxlZnQKICogb2YgZWFjaCBjb21wb25lbnQsIHNvIHRoZSBiaXRzIGZyb20gdGhlIG11bHRpcGxpY2F0aW9uIGRvbid0IGNvbGxpZGUuCiAqIFRoaXMgY2FuIGJlIHVzZWQgZm9yIGFueSBSR0IgcGVybXV0YXRpb24gb2YgY291cnNlLgogKi8KI2RlZmluZSBBTFBIQV9CTElUMzJfODg4KHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEpICAgICAgXAogICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBVaW50MzIgKnNyYyA9IChVaW50MzIgKikoZnJvbSk7ICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIFVpbnQzMiAqZHN0ID0gKFVpbnQzMiAqKSh0byk7ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQpKGxlbmd0aCk7IGkrKykgeyAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgVWludDMyIHMgPSAqc3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBVaW50MzIgZCA9ICpkc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIFVpbnQzMiBzMSA9IHMgJiAweGZmMDBmZjsgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgVWludDMyIGQxID0gZCAmIDB4ZmYwMGZmOyAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBkMSA9IChkMSArICgoczEgLSBkMSkgKiBhbHBoYSA+PiA4KSkgJiAweGZmMDBmZjsgXAogICAgICAgICAgICBzICY9IDB4ZmYwMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGQgJj0gMHhmZjAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgZCA9IChkICsgKChzIC0gZCkgKiBhbHBoYSA+PiA4KSkgJiAweGZmMDA7ICAgICAgXAogICAgICAgICAgICAqZHN0KysgPSBkMSB8IGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIH0gd2hpbGUgKDApCgovKgogKiBGb3IgMTZicHAgcGl4ZWxzIHdlIGNhbiBnbyBhIHN0ZXAgZnVydGhlcjogcHV0IHRoZSBtaWRkbGUgY29tcG9uZW50CiAqIGluIHRoZSBoaWdoIDE2IGJpdHMgb2YgYSAzMiBiaXQgd29yZCwgYW5kIHByb2Nlc3MgYWxsIHRocmVlIFJHQgogKiBjb21wb25lbnRzIGF0IHRoZSBzYW1lIHRpbWUuIFNpbmNlIHRoZSBzbWFsbGVzdCBnYXAgaXMgaGVyZSBqdXN0CiAqIDUgYml0cywgd2UgaGF2ZSB0byBzY2FsZSBhbHBoYSBkb3duIHRvIDUgYml0cyBhcyB3ZWxsLgogKi8KI2RlZmluZSBBTFBIQV9CTElUMTZfNTY1KHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEpICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBVaW50MTYgKnNyYyA9IChVaW50MTYgKikoZnJvbSk7ICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDE2ICpkc3QgPSAoVWludDE2ICopKHRvKTsgICAgICAgICAgICAgICAgICAgXAogICAgICAgIFVpbnQzMiBBTFBIQSA9IGFscGhhID4+IDM7ICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBmb3IoaSA9IDA7IGkgPCAoaW50KShsZW5ndGgpOyBpKyspIHsgICAgICAgICAgICBcCiAgICAgICAgICAgIFVpbnQzMiBzID0gKnNyYysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBVaW50MzIgZCA9ICpkc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgcyA9IChzIHwgcyA8PCAxNikgJiAweDA3ZTBmODFmOyAgICAgICAgICAgICBcCiAgICAgICAgICAgIGQgPSAoZCB8IGQgPDwgMTYpICYgMHgwN2UwZjgxZjsgICAgICAgICAgICAgXAogICAgICAgICAgICBkICs9IChzIC0gZCkgKiBBTFBIQSA+PiA1OyAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgZCAmPSAweDA3ZTBmODFmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICpkc3QrKyA9IChVaW50MTYpKGQgfCBkID4+IDE2KTsgICAgICAgICAgICAgXAogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIH0gd2hpbGUoMCkKCiNkZWZpbmUgQUxQSEFfQkxJVDE2XzU1NSh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhKSAgXAogICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDE2ICpzcmMgPSAoVWludDE2ICopKGZyb20pOyAgICAgICAgICAgICAgICAgXAogICAgICAgIFVpbnQxNiAqZHN0ID0gKFVpbnQxNiAqKSh0byk7ICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBVaW50MzIgQUxQSEEgPSBhbHBoYSA+PiAzOyAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZm9yKGkgPSAwOyBpIDwgKGludCkobGVuZ3RoKTsgaSsrKSB7ICAgICAgICAgICAgXAogICAgICAgICAgICBVaW50MzIgcyA9ICpzcmMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgVWludDMyIGQgPSAqZHN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHMgPSAocyB8IHMgPDwgMTYpICYgMHgwM2UwN2MxZjsgICAgICAgICAgICAgXAogICAgICAgICAgICBkID0gKGQgfCBkIDw8IDE2KSAmIDB4MDNlMDdjMWY7ICAgICAgICAgICAgIFwKICAgICAgICAgICAgZCArPSAocyAtIGQpICogQUxQSEEgPj4gNTsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGQgJj0gMHgwM2UwN2MxZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAqZHN0KysgPSAoVWludDE2KShkIHwgZCA+PiAxNik7ICAgICAgICAgICAgIFwKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICB9IHdoaWxlKDApCgovKgogKiBUaGUgZ2VuZXJhbCBzbG93IGNhdGNoLWFsbCBmdW5jdGlvbiwgZm9yIHJlbWFpbmluZyBkZXB0aHMgYW5kIGZvcm1hdHMKICovCiNkZWZpbmUgQUxQSEFfQkxJVF9BTlkodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSkgICAgICAgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDggKnNyYyA9IGZyb207ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDggKmRzdCA9IHRvOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQpKGxlbmd0aCk7IGkrKykgeyAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIFVpbnQzMiBzLCBkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHVuc2lnbmVkIHJzLCBncywgYnMsIHJkLCBnZCwgYmQ7ICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHN3aXRjaCAoYnBwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBzID0gKihVaW50MTYgKilzcmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBkID0gKihVaW50MTYgKilkc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBpZiAoU0RMX0JZVEVPUkRFUiA9PSBTRExfQklHX0VORElBTikgeyAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgcyA9IChzcmNbMF0gPDwgMTYpIHwgKHNyY1sxXSA8PCA4KSB8IHNyY1syXTsgXAogICAgICAgICAgICAgICAgICAgIGQgPSAoZHN0WzBdIDw8IDE2KSB8IChkc3RbMV0gPDwgOCkgfCBkc3RbMl07IFwKICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICBzID0gKHNyY1syXSA8PCAxNikgfCAoc3JjWzFdIDw8IDgpIHwgc3JjWzBdOyBcCiAgICAgICAgICAgICAgICAgICAgZCA9IChkc3RbMl0gPDwgMTYpIHwgKGRzdFsxXSA8PCA4KSB8IGRzdFswXTsgXAogICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBjYXNlIDQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgcyA9ICooVWludDMyICopc3JjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgZCA9ICooVWludDMyICopZHN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBSR0JfRlJPTV9QSVhFTChzLCBmbXQsIHJzLCBncywgYnMpOyAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBSR0JfRlJPTV9QSVhFTChkLCBmbXQsIHJkLCBnZCwgYmQpOyAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICByZCArPSAocnMgLSByZCkgKiBhbHBoYSA+PiA4OyAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBnZCArPSAoZ3MgLSBnZCkgKiBhbHBoYSA+PiA4OyAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBiZCArPSAoYnMgLSBiZCkgKiBhbHBoYSA+PiA4OyAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBQSVhFTF9GUk9NX1JHQihkLCBmbXQsIHJkLCBnZCwgYmQpOyAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBzd2l0Y2ggKGJwcCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgKihVaW50MTYgKilkc3QgPSAoVWludDE2KWQ7ICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgaWYgKFNETF9CWVRFT1JERVIgPT0gU0RMX0JJR19FTkRJQU4pIHsgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIGRzdFswXSA9IChVaW50OCkoZCA+PiAxNik7ICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIGRzdFsxXSA9IChVaW50OCkoZCA+PiA4KTsgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIGRzdFsyXSA9IChVaW50OCkoZCk7ICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIGRzdFswXSA9IChVaW50OClkOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIGRzdFsxXSA9IChVaW50OCkoZCA+PiA4KTsgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIGRzdFsyXSA9IChVaW50OCkoZCA+PiAxNik7ICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBjYXNlIDQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgKihVaW50MzIgKilkc3QgPSBkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBzcmMgKz0gYnBwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBkc3QgKz0gYnBwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgfSB3aGlsZSgwKQoKLyoKICogU3BlY2lhbCBjYXNlOiA1MCUgYWxwaGEgKGFscGhhPTEyOCkKICogVGhpcyBpcyB0cmVhdGVkIHNwZWNpYWxseSBiZWNhdXNlIGl0IGNhbiBiZSBvcHRpbWl6ZWQgdmVyeSB3ZWxsLCBhbmQKICogc2luY2UgaXQgaXMgZ29vZCBmb3IgbWFueSBjYXNlcyBvZiBzZW1pLXRyYW5zbHVjZW5jeS4KICogVGhlIHRoZW9yeSBpcyB0byBkbyBhbGwgdGhyZWUgY29tcG9uZW50cyBhdCB0aGUgc2FtZSB0aW1lOgogKiBGaXJzdCB6ZXJvIHRoZSBsb3dlc3QgYml0IG9mIGVhY2ggY29tcG9uZW50LCB3aGljaCBnaXZlcyB1cyByb29tIHRvCiAqIGFkZCB0aGVtLiBUaGVuIHNoaWZ0IHJpZ2h0IGFuZCBhZGQgdGhlIHN1bSBvZiB0aGUgbG93ZXN0IGJpdHMuCiAqLwojZGVmaW5lIEFMUEhBX0JMSVQzMl84ODhfNTAodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSkgICAgICAgXAogICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIFVpbnQzMiAqc3JjID0gKFVpbnQzMiAqKShmcm9tKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIFVpbnQzMiAqZHN0ID0gKFVpbnQzMiAqKSh0byk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGZvcihpID0gMDsgaSA8IChpbnQpKGxlbmd0aCk7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBVaW50MzIgcyA9ICpzcmMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBVaW50MzIgZCA9ICpkc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAqZHN0KysgPSAoKChzICYgMHgwMGZlZmVmZSkgKyAoZCAmIDB4MDBmZWZlZmUpKSA+PiAxKSBcCiAgICAgICAgICAgICAgICAgKyAocyAmIGQgJiAweDAwMDEwMTAxKTsgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICB9IHdoaWxlKDApCgovKgogKiBGb3IgMTZicHAsIHdlIGNhbiBhY3R1YWxseSBibGVuZCB0d28gcGl4ZWxzIGluIHBhcmFsbGVsLCBpZiB3ZSB0YWtlCiAqIGNhcmUgdG8gc2hpZnQgYmVmb3JlIHdlIGFkZCwgbm90IGFmdGVyLgogKi8KCi8qIGhlbHBlcjogYmxlbmQgYSBzaW5nbGUgMTYgYml0IHBpeGVsIGF0IDUwJSAqLwojZGVmaW5lIEJMRU5EMTZfNTAoZHN0LCBzcmMsIG1hc2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIFVpbnQzMiBzID0gKnNyYysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIFVpbnQzMiBkID0gKmRzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICpkc3QrKyA9IChVaW50MTYpKCgoKHMgJiBtYXNrKSArIChkICYgbWFzaykpID4+IDEpICsgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgIChzICYgZCAmICh+bWFzayAmIDB4ZmZmZikpKTsgICAgICAgICAgXAogICAgfSB3aGlsZSgwKQoKLyogYmFzaWMgMTZicHAgYmxlbmRlci4gbWFzayBpcyB0aGUgcGl4ZWxzIHRvIGtlZXAgd2hlbiBhZGRpbmcuICovCiNkZWZpbmUgQUxQSEFfQkxJVDE2XzUwKHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEsIG1hc2spICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgdW5zaWduZWQgbiA9IChsZW5ndGgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDE2ICpzcmMgPSAoVWludDE2ICopKGZyb20pOyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDE2ICpkc3QgPSAoVWludDE2ICopKHRvKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaWYgKCgodWludHB0cl90KXNyYyBeICh1aW50cHRyX3QpZHN0KSAmIDMpIHsgICAgICAgICAgICBcCiAgICAgICAgICAgIC8qIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gbm90IGluIHBoYXNlLCBibGl0IG9uZSBieSBvbmUgKi8gXAogICAgICAgICAgICB3aGlsZSAobi0tKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgQkxFTkQxNl81MChkc3QsIHNyYywgbWFzayk7ICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpZiAoKHVpbnRwdHJfdClzcmMgJiAzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgLyogZmlyc3Qgb2RkIHBpeGVsICovICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgQkxFTkQxNl81MChkc3QsIHNyYywgbWFzayk7ICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgbi0tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBmb3IgKDsgbiA+IDE7IG4gLT0gMikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgVWludDMyIHMgPSAqKFVpbnQzMiAqKXNyYzsgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgVWludDMyIGQgPSAqKFVpbnQzMiAqKWRzdDsgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgKihVaW50MzIgKilkc3QgPSAoKHMgJiAobWFzayB8IG1hc2sgPDwgMTYpKSA+PiAxKSBcCiAgICAgICAgICAgICAgICAgICAgKyAoKGQgJiAobWFzayB8IG1hc2sgPDwgMTYpKSA+PiAxKSAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgKyAocyAmIGQgJiAofihtYXNrIHwgbWFzayA8PCAxNikpKTsgICAgICAgICBcCiAgICAgICAgICAgICAgICBzcmMgKz0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBkc3QgKz0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGlmIChuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBCTEVORDE2XzUwKGRzdCwgc3JjLCBtYXNrKTsgLyogbGFzdCBvZGQgcGl4ZWwgKi8gXAogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgfSB3aGlsZSgwKQoKI2RlZmluZSBBTFBIQV9CTElUMTZfNTY1XzUwKHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEpICAgICAgIFwKICAgIEFMUEhBX0JMSVQxNl81MCh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhLCAweGY3ZGUpCgojZGVmaW5lIEFMUEhBX0JMSVQxNl81NTVfNTAodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSkgICAgICAgXAogICAgQUxQSEFfQkxJVDE2XzUwKHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEsIDB4ZmJkZSkKCiNkZWZpbmUgQ0hPT1NFX0JMSVQoYmxpdHRlciwgYWxwaGEsIGZtdCkgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaWYgKGFscGhhID09IDI1NSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHN3aXRjaCAoZm10LT5CeXRlc1BlclBpeGVsKSB7ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNhc2UgMTogYmxpdHRlcigxLCBVaW50OCwgT1BBUVVFX0JMSVQpOyBicmVhazsgICAgICBcCiAgICAgICAgICAgIGNhc2UgMjogYmxpdHRlcigyLCBVaW50OCwgT1BBUVVFX0JMSVQpOyBicmVhazsgICAgICBcCiAgICAgICAgICAgIGNhc2UgMzogYmxpdHRlcigzLCBVaW50OCwgT1BBUVVFX0JMSVQpOyBicmVhazsgICAgICBcCiAgICAgICAgICAgIGNhc2UgNDogYmxpdHRlcig0LCBVaW50MTYsIE9QQVFVRV9CTElUKTsgYnJlYWs7ICAgICBcCiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHN3aXRjaCAoZm10LT5CeXRlc1BlclBpeGVsKSB7ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNhc2UgMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAvKiBObyA4YnBwIGFscGhhIGJsaXR0aW5nICovICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBzd2l0Y2ggKGZtdC0+Um1hc2sgfCBmbXQtPkdtYXNrIHwgZm10LT5CbWFzaykgeyBcCiAgICAgICAgICAgICAgICBjYXNlIDB4ZmZmZjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgaWYgKGZtdC0+R21hc2sgPT0gMHgwN2UwICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgIHx8IGZtdC0+Um1hc2sgPT0gMHgwN2UwICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgIHx8IGZtdC0+Qm1hc2sgPT0gMHgwN2UwKSB7ICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbHBoYSA9PSAxMjgpIHsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGl0dGVyKDIsIFVpbnQ4LCBBTFBIQV9CTElUMTZfNTY1XzUwKTsgXAogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxpdHRlcigyLCBVaW50OCwgQUxQSEFfQkxJVDE2XzU2NSk7IFwKICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgZ290byBnZW5lcmFsMTY7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGNhc2UgMHg3ZmZmOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICBpZiAoZm10LT5HbWFzayA9PSAweDAzZTAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgfHwgZm10LT5SbWFzayA9PSAweDAzZTAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgfHwgZm10LT5CbWFzayA9PSAweDAzZTApIHsgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFscGhhID09IDEyOCkgeyAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsaXR0ZXIoMiwgVWludDgsIEFMUEhBX0JMSVQxNl81NTVfNTApOyBcCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGl0dGVyKDIsIFVpbnQ4LCBBTFBIQV9CTElUMTZfNTU1KTsgXAogICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIH0gZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGdlbmVyYWwxNjsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgZ2VuZXJhbDE2OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIGJsaXR0ZXIoMiwgVWludDgsIEFMUEhBX0JMSVRfQU5ZKTsgICAgICAgICAgXAogICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgYmxpdHRlcigzLCBVaW50OCwgQUxQSEFfQkxJVF9BTlkpOyAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBjYXNlIDQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgaWYgKChmbXQtPlJtYXNrIHwgZm10LT5HbWFzayB8IGZtdC0+Qm1hc2spID09IDB4MDBmZmZmZmYgXAogICAgICAgICAgICAgICAgICAgICYmIChmbXQtPkdtYXNrID09IDB4ZmYwMCB8fCBmbXQtPlJtYXNrID09IDB4ZmYwMCBcCiAgICAgICAgICAgICAgICAgICAgfHwgZm10LT5CbWFzayA9PSAweGZmMDApKSB7ICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgaWYgKGFscGhhID09IDEyOCkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgIGJsaXR0ZXIoNCwgVWludDE2LCBBTFBIQV9CTElUMzJfODg4XzUwKTsgXAogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICBibGl0dGVyKDQsIFVpbnQxNiwgQUxQSEFfQkxJVDMyXzg4OCk7ICAgXAogICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIGJsaXR0ZXIoNCwgVWludDE2LCBBTFBIQV9CTElUX0FOWSk7ICAgICAgICAgXAogICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgfSB3aGlsZSgwKQoKLyoKICogU2V0IGEgcGl4ZWwgdmFsdWUgdXNpbmcgdGhlIGdpdmVuIGZvcm1hdCwgZXhjZXB0IHRoYXQgdGhlIGFscGhhIHZhbHVlIGlzCiAqIHBsYWNlZCBpbiB0aGUgdG9wIGJ5dGUuIFRoaXMgaXMgdGhlIGZvcm1hdCB1c2VkIGZvciBSTEUgd2l0aCBhbHBoYS4KICovCiNkZWZpbmUgUkxFUElYRUxfRlJPTV9SR0JBKFBpeGVsLCBmbXQsIHIsIGcsIGIsIGEpICAgICAgICAgICAgICAgICAgICAgIFwKeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgUGl4ZWwgPSAoKHI+PmZtdC0+Umxvc3MpPDxmbXQtPlJzaGlmdCl8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgKChnPj5mbXQtPkdsb3NzKTw8Zm10LT5Hc2hpZnQpfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAoKGI+PmZtdC0+Qmxvc3MpPDxmbXQtPkJzaGlmdCl8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIChhPDwyNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCn0KCi8qCiAqIFRoaXMgdGFrZXMgY2FyZSBvZiB0aGUgY2FzZSB3aGVuIHRoZSBzdXJmYWNlIGlzIGNsaXBwZWQgb24gdGhlIGxlZnQgYW5kL29yCiAqIHJpZ2h0LiBUb3AgY2xpcHBpbmcgaGFzIGFscmVhZHkgYmVlbiB0YWtlbiBjYXJlIG9mLgogKi8Kc3RhdGljIHZvaWQKUkxFQ2xpcEJsaXQoaW50IHcsIFVpbnQ4ICogc3JjYnVmLCBTRExfU3VyZmFjZSAqIHN1cmZfZHN0LAogICAgICAgICAgICBVaW50OCAqIGRzdGJ1ZiwgU0RMX1JlY3QgKiBzcmNyZWN0LCB1bnNpZ25lZCBhbHBoYSkKewogICAgU0RMX1BpeGVsRm9ybWF0ICpmbXQgPSBzdXJmX2RzdC0+Zm9ybWF0OwoKI2RlZmluZSBSTEVDTElQQkxJVChicHAsIFR5cGUsIGRvX2JsaXQpICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpbnQgbGluZWNvdW50ID0gc3JjcmVjdC0+aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpbnQgb2ZzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpbnQgbGVmdCA9IHNyY3JlY3QtPng7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpbnQgcmlnaHQgPSBsZWZ0ICsgc3JjcmVjdC0+dzsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBkc3RidWYgLT0gbGVmdCAqIGJwcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBmb3IgKDs7KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaW50IHJ1bjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgb2ZzICs9ICooVHlwZSAqKXNyY2J1ZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgcnVuID0gKChUeXBlICopc3JjYnVmKVsxXTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgc3JjYnVmICs9IDIgKiBzaXplb2YoVHlwZSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaWYgKHJ1bikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIC8qIGNsaXAgdG8gbGVmdCBhbmQgcmlnaHQgYm9yZGVycyAqLyAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGlmIChvZnMgPCByaWdodCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICBpbnQgbGVuID0gcnVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRjb2w7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICBpZiAobGVmdCAtIG9mcyA+IDApIHsgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBsZWZ0IC0gb2ZzOyAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC09IHN0YXJ0OyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA8PSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbm9jb3B5ICMjIGJwcCAjIyBkb19ibGl0OyAgICAgIFwKICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICBzdGFydGNvbCA9IG9mcyArIHN0YXJ0OyAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICBpZiAobGVuID4gcmlnaHQgLSBzdGFydGNvbCkgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gcmlnaHQgLSBzdGFydGNvbDsgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICBkb19ibGl0KGRzdGJ1ZiArIHN0YXJ0Y29sICogYnBwLCBzcmNidWYgKyBzdGFydCAqIGJwcCwgXAogICAgICAgICAgICAgICAgICAgICAgICBsZW4sIGJwcCwgYWxwaGEpOyAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgbm9jb3B5ICMjIGJwcCAjIyBkb19ibGl0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgc3JjYnVmICs9IHJ1biAqIGJwcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgb2ZzICs9IHJ1bjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICB9IGVsc2UgaWYgKCFvZnMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpZiAob2ZzID09IHcpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgb2ZzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgZHN0YnVmICs9IHN1cmZfZHN0LT5waXRjaDsgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgaWYgKCEtLWxpbmVjb3VudCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgfSB3aGlsZSgwKQoKICAgIENIT09TRV9CTElUKFJMRUNMSVBCTElULCBhbHBoYSwgZm10KTsKCiN1bmRlZiBSTEVDTElQQkxJVAoKfQoKCi8qIGJsaXQgYSBjb2xvcmtleWVkIFJMRSBzdXJmYWNlICovCmludApTRExfUkxFQmxpdChTRExfU3VyZmFjZSAqIHN1cmZfc3JjLCBTRExfUmVjdCAqIHNyY3JlY3QsCiAgICAgICAgICAgIFNETF9TdXJmYWNlICogc3VyZl9kc3QsIFNETF9SZWN0ICogZHN0cmVjdCkKewogICAgVWludDggKmRzdGJ1ZjsKICAgIFVpbnQ4ICpzcmNidWY7CiAgICBpbnQgeCwgeTsKICAgIGludCB3ID0gc3VyZl9zcmMtPnc7CiAgICB1bnNpZ25lZCBhbHBoYTsKCiAgICAvKiBMb2NrIHRoZSBkZXN0aW5hdGlvbiBpZiBuZWNlc3NhcnkgKi8KICAgIGlmIChTRExfTVVTVExPQ0soc3VyZl9kc3QpKSB7CiAgICAgICAgaWYgKFNETF9Mb2NrU3VyZmFjZShzdXJmX2RzdCkgPCAwKSB7CiAgICAgICAgICAgIHJldHVybiAoLTEpOwogICAgICAgIH0KICAgIH0KCiAgICAvKiBTZXQgdXAgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gcG9pbnRlcnMgKi8KICAgIHggPSBkc3RyZWN0LT54OwogICAgeSA9IGRzdHJlY3QtPnk7CiAgICBkc3RidWYgPSAoVWludDggKikgc3VyZl9kc3QtPnBpeGVscwogICAgICAgICsgeSAqIHN1cmZfZHN0LT5waXRjaCArIHggKiBzdXJmX3NyYy0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsOwogICAgc3JjYnVmID0gKFVpbnQ4ICopIHN1cmZfc3JjLT5tYXAtPmRhdGE7CgogICAgewogICAgICAgIC8qIHNraXAgbGluZXMgYXQgdGhlIHRvcCBpZiBuZWNlc3NhcnkgKi8KICAgICAgICBpbnQgdnNraXAgPSBzcmNyZWN0LT55OwogICAgICAgIGludCBvZnMgPSAwOwogICAgICAgIGlmICh2c2tpcCkgewoKI2RlZmluZSBSTEVTS0lQKGJwcCwgVHlwZSkgICAgICAgICAgXAogICAgICAgIGZvcig7OykgeyAgICAgICAgICAgXAogICAgICAgICAgICBpbnQgcnVuOyAgICAgICAgICAgIFwKICAgICAgICAgICAgb2ZzICs9ICooVHlwZSAqKXNyY2J1ZjsgXAogICAgICAgICAgICBydW4gPSAoKFR5cGUgKilzcmNidWYpWzFdOyAgXAogICAgICAgICAgICBzcmNidWYgKz0gc2l6ZW9mKFR5cGUpICogMjsgXAogICAgICAgICAgICBpZihydW4pIHsgICAgICAgICAgIFwKICAgICAgICAgICAgc3JjYnVmICs9IHJ1biAqIGJwcDsgICAgXAogICAgICAgICAgICBvZnMgKz0gcnVuOyAgICAgXAogICAgICAgICAgICB9IGVsc2UgaWYoIW9mcykgICAgIFwKICAgICAgICAgICAgZ290byBkb25lOyAgICAgIFwKICAgICAgICAgICAgaWYob2ZzID09IHcpIHsgICAgICBcCiAgICAgICAgICAgIG9mcyA9IDA7ICAgICAgICBcCiAgICAgICAgICAgIGlmKCEtLXZza2lwKSAgICAgICAgXAogICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgXAogICAgICAgICAgICB9ICAgICAgICAgICAgICAgXAogICAgICAgIH0KCiAgICAgICAgICAgIHN3aXRjaCAoc3VyZl9zcmMtPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCkgewogICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICBSTEVTS0lQKDEsIFVpbnQ4KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICBSTEVTS0lQKDIsIFVpbnQ4KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICBSTEVTS0lQKDMsIFVpbnQ4KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICBSTEVTS0lQKDQsIFVpbnQxNik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKI3VuZGVmIFJMRVNLSVAKCiAgICAgICAgfQogICAgfQoKICAgIGFscGhhID0gc3VyZl9zcmMtPm1hcC0+aW5mby5hOwogICAgLyogaWYgbGVmdCBvciByaWdodCBlZGdlIGNsaXBwaW5nIG5lZWRlZCwgY2FsbCBjbGlwIGJsaXQgKi8KICAgIGlmIChzcmNyZWN0LT54IHx8IHNyY3JlY3QtPncgIT0gc3VyZl9zcmMtPncpIHsKICAgICAgICBSTEVDbGlwQmxpdCh3LCBzcmNidWYsIHN1cmZfZHN0LCBkc3RidWYsIHNyY3JlY3QsIGFscGhhKTsKICAgIH0gZWxzZSB7CiAgICAgICAgU0RMX1BpeGVsRm9ybWF0ICpmbXQgPSBzdXJmX3NyYy0+Zm9ybWF0OwoKI2RlZmluZSBSTEVCTElUKGJwcCwgVHlwZSwgZG9fYmxpdCkgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpbnQgbGluZWNvdW50ID0gc3JjcmVjdC0+aDsgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGludCBvZnMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBmb3IoOzspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgdW5zaWduZWQgcnVuOyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIG9mcyArPSAqKFR5cGUgKilzcmNidWY7ICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgcnVuID0gKChUeXBlICopc3JjYnVmKVsxXTsgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgc3JjYnVmICs9IDIgKiBzaXplb2YoVHlwZSk7ICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaWYocnVuKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGRvX2JsaXQoZHN0YnVmICsgb2ZzICogYnBwLCBzcmNidWYsIHJ1biwgYnBwLCBhbHBoYSk7IFwKICAgICAgICAgICAgc3JjYnVmICs9IHJ1biAqIGJwcDsgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBvZnMgKz0gcnVuOyAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICB9IGVsc2UgaWYoIW9mcykgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaWYob2ZzID09IHcpIHsgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIG9mcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGRzdGJ1ZiArPSBzdXJmX2RzdC0+cGl0Y2g7ICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpZighLS1saW5lY291bnQpICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gd2hpbGUoMCkKCiAgICAgICAgQ0hPT1NFX0JMSVQoUkxFQkxJVCwgYWxwaGEsIGZtdCk7CgojdW5kZWYgUkxFQkxJVAogICAgfQoKICBkb25lOgogICAgLyogVW5sb2NrIHRoZSBkZXN0aW5hdGlvbiBpZiBuZWNlc3NhcnkgKi8KICAgIGlmIChTRExfTVVTVExPQ0soc3VyZl9kc3QpKSB7CiAgICAgICAgU0RMX1VubG9ja1N1cmZhY2Uoc3VyZl9kc3QpOwogICAgfQogICAgcmV0dXJuICgwKTsKfQoKI3VuZGVmIE9QQVFVRV9CTElUCgovKgogKiBQZXItcGl4ZWwgYmxpdHRpbmcgbWFjcm9zIGZvciB0cmFuc2x1Y2VudCBwaXhlbHM6CiAqIFRoZXNlIHVzZSB0aGUgc2FtZSB0ZWNobmlxdWVzIGFzIHRoZSBwZXItc3VyZmFjZSBibGl0dGluZyBtYWNyb3MKICovCgovKgogKiBGb3IgMzJicHAgcGl4ZWxzLCB3ZSBoYXZlIG1hZGUgc3VyZSB0aGUgYWxwaGEgaXMgc3RvcmVkIGluIHRoZSB0b3AKICogOCBiaXRzLCBzbyBwcm9jZWVkIGFzIHVzdWFsCiAqLwojZGVmaW5lIEJMSVRfVFJBTlNMXzg4OChzcmMsIGRzdCkgICAgICAgICAgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBVaW50MzIgcyA9IHNyYzsgICAgICAgICAgICAgICAgICAgICBcCiAgICBVaW50MzIgZCA9IGRzdDsgICAgICAgICAgICAgICAgICAgICBcCiAgICB1bnNpZ25lZCBhbHBoYSA9IHMgPj4gMjQ7ICAgICAgICAgICAgICAgXAogICAgVWludDMyIHMxID0gcyAmIDB4ZmYwMGZmOyAgICAgICAgICAgICAgIFwKICAgIFVpbnQzMiBkMSA9IGQgJiAweGZmMDBmZjsgICAgICAgICAgICAgICBcCiAgICBkMSA9IChkMSArICgoczEgLSBkMSkgKiBhbHBoYSA+PiA4KSkgJiAweGZmMDBmZjsgICAgXAogICAgcyAmPSAweGZmMDA7ICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgZCAmPSAweGZmMDA7ICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgZCA9IChkICsgKChzIC0gZCkgKiBhbHBoYSA+PiA4KSkgJiAweGZmMDA7ICAgICAgXAogICAgZHN0ID0gZDEgfCBkIHwgMHhmZjAwMDAwMDsgICAgICAgICAgICAgIFwKICAgIH0gd2hpbGUoMCkKCi8qCiAqIEZvciAxNmJwcCBwaXhlbHMsIHdlIGhhdmUgc3RvcmVkIHRoZSA1IG1vc3Qgc2lnbmlmaWNhbnQgYWxwaGEgYml0cyBpbgogKiBiaXRzIDUtMTAuIEFzIGJlZm9yZSwgd2UgY2FuIHByb2Nlc3MgYWxsIDMgUkdCIGNvbXBvbmVudHMgYXQgdGhlIHNhbWUgdGltZS4KICovCiNkZWZpbmUgQkxJVF9UUkFOU0xfNTY1KHNyYywgZHN0KSAgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICBcCiAgICBVaW50MzIgcyA9IHNyYzsgICAgICAgICAgICAgXAogICAgVWludDMyIGQgPSBkc3Q7ICAgICAgICAgICAgIFwKICAgIHVuc2lnbmVkIGFscGhhID0gKHMgJiAweDNlMCkgPj4gNTsgIFwKICAgIHMgJj0gMHgwN2UwZjgxZjsgICAgICAgICAgICBcCiAgICBkID0gKGQgfCBkIDw8IDE2KSAmIDB4MDdlMGY4MWY7ICAgICBcCiAgICBkICs9IChzIC0gZCkgKiBhbHBoYSA+PiA1OyAgICAgIFwKICAgIGQgJj0gMHgwN2UwZjgxZjsgICAgICAgICAgICBcCiAgICBkc3QgPSAoVWludDE2KShkIHwgZCA+PiAxNik7ICAgICAgICAgICAgXAogICAgfSB3aGlsZSgwKQoKI2RlZmluZSBCTElUX1RSQU5TTF81NTUoc3JjLCBkc3QpICAgICAgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgIFwKICAgIFVpbnQzMiBzID0gc3JjOyAgICAgICAgICAgICBcCiAgICBVaW50MzIgZCA9IGRzdDsgICAgICAgICAgICAgXAogICAgdW5zaWduZWQgYWxwaGEgPSAocyAmIDB4M2UwKSA+PiA1OyAgXAogICAgcyAmPSAweDAzZTA3YzFmOyAgICAgICAgICAgIFwKICAgIGQgPSAoZCB8IGQgPDwgMTYpICYgMHgwM2UwN2MxZjsgICAgIFwKICAgIGQgKz0gKHMgLSBkKSAqIGFscGhhID4+IDU7ICAgICAgXAogICAgZCAmPSAweDAzZTA3YzFmOyAgICAgICAgICAgIFwKICAgIGRzdCA9IChVaW50MTYpKGQgfCBkID4+IDE2KTsgICAgICAgICAgICBcCiAgICB9IHdoaWxlKDApCgovKiB1c2VkIHRvIHNhdmUgdGhlIGRlc3RpbmF0aW9uIGZvcm1hdCBpbiB0aGUgZW5jb2RpbmcuIERlc2lnbmVkIHRvIGJlCiAgIG1hY3JvLWNvbXBhdGlibGUgd2l0aCBTRExfUGl4ZWxGb3JtYXQgYnV0IHdpdGhvdXQgdGhlIHVubmVlZGVkIGZpZWxkcyAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBVaW50OCBCeXRlc1BlclBpeGVsOwogICAgVWludDggcGFkZGluZ1szXTsKICAgIFVpbnQzMiBSbWFzazsKICAgIFVpbnQzMiBHbWFzazsKICAgIFVpbnQzMiBCbWFzazsKICAgIFVpbnQzMiBBbWFzazsKICAgIFVpbnQ4IFJsb3NzOwogICAgVWludDggR2xvc3M7CiAgICBVaW50OCBCbG9zczsKICAgIFVpbnQ4IEFsb3NzOwogICAgVWludDggUnNoaWZ0OwogICAgVWludDggR3NoaWZ0OwogICAgVWludDggQnNoaWZ0OwogICAgVWludDggQXNoaWZ0Owp9IFJMRURlc3RGb3JtYXQ7CgovKiBibGl0IGEgcGl4ZWwtYWxwaGEgUkxFIHN1cmZhY2UgY2xpcHBlZCBhdCB0aGUgcmlnaHQgYW5kL29yIGxlZnQgZWRnZXMgKi8Kc3RhdGljIHZvaWQKUkxFQWxwaGFDbGlwQmxpdChpbnQgdywgVWludDggKiBzcmNidWYsIFNETF9TdXJmYWNlICogc3VyZl9kc3QsCiAgICAgICAgICAgICAgICAgVWludDggKiBkc3RidWYsIFNETF9SZWN0ICogc3JjcmVjdCkKewogICAgU0RMX1BpeGVsRm9ybWF0ICpkZiA9IHN1cmZfZHN0LT5mb3JtYXQ7CiAgICAvKgogICAgICogY2xpcHBlZCBibGl0dGVyOiBQdHlwZSBpcyB0aGUgZGVzdGluYXRpb24gcGl4ZWwgdHlwZSwKICAgICAqIEN0eXBlIHRoZSB0cmFuc2x1Y2VudCBjb3VudCB0eXBlLCBhbmQgZG9fYmxlbmQgdGhlIG1hY3JvCiAgICAgKiB0byBibGVuZCBvbmUgcGl4ZWwuCiAgICAgKi8KI2RlZmluZSBSTEVBTFBIQUNMSVBCTElUKFB0eXBlLCBDdHlwZSwgZG9fYmxlbmQpICAgICAgICAgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIGludCBsaW5lY291bnQgPSBzcmNyZWN0LT5oOyAgICAgICAgICAgICAgICAgICBcCiAgICBpbnQgbGVmdCA9IHNyY3JlY3QtPng7ICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgaW50IHJpZ2h0ID0gbGVmdCArIHNyY3JlY3QtPnc7ICAgICAgICAgICAgICAgICAgICBcCiAgICBkc3RidWYgLT0gbGVmdCAqIHNpemVvZihQdHlwZSk7ICAgICAgICAgICAgICAgICAgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGludCBvZnMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIC8qIGJsaXQgb3BhcXVlIHBpeGVscyBvbiBvbmUgbGluZSAqLyAgICAgICAgICAgICAgXAogICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgdW5zaWduZWQgcnVuOyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgb2ZzICs9ICgoQ3R5cGUgKilzcmNidWYpWzBdOyAgICAgICAgICAgICAgICAgIFwKICAgICAgICBydW4gPSAoKEN0eXBlICopc3JjYnVmKVsxXTsgICAgICAgICAgICAgICBcCiAgICAgICAgc3JjYnVmICs9IDIgKiBzaXplb2YoQ3R5cGUpOyAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpZihydW4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAvKiBjbGlwIHRvIGxlZnQgYW5kIHJpZ2h0IGJvcmRlcnMgKi8gICAgICAgICAgXAogICAgICAgICAgICBpbnQgY29mcyA9IG9mczsgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpbnQgY3J1biA9IHJ1bjsgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpZihsZWZ0IC0gY29mcyA+IDApIHsgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgY3J1biAtPSBsZWZ0IC0gY29mczsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNvZnMgPSBsZWZ0OyAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaWYoY3J1biA+IHJpZ2h0IC0gY29mcykgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNydW4gPSByaWdodCAtIGNvZnM7ICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpZihjcnVuID4gMCkgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBQSVhFTF9DT1BZKGRzdGJ1ZiArIGNvZnMgKiBzaXplb2YoUHR5cGUpLCAgICAgXAogICAgICAgICAgICAgICAgICAgc3JjYnVmICsgKGNvZnMgLSBvZnMpICogc2l6ZW9mKFB0eXBlKSwgXAogICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKWNydW4sIHNpemVvZihQdHlwZSkpOyAgICBcCiAgICAgICAgICAgIHNyY2J1ZiArPSBydW4gKiBzaXplb2YoUHR5cGUpOyAgICAgICAgICAgIFwKICAgICAgICAgICAgb2ZzICs9IHJ1bjsgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9IGVsc2UgaWYoIW9mcykgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gd2hpbGUob2ZzIDwgdyk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAvKiBza2lwIHBhZGRpbmcgaWYgbmVjZXNzYXJ5ICovICAgICAgICAgICAgICAgXAogICAgICAgIGlmKHNpemVvZihQdHlwZSkgPT0gMikgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBzcmNidWYgKz0gKHVpbnRwdHJfdClzcmNidWYgJiAyOyAgICAgICAgICAgICAgXAogICAgICAgIC8qIGJsaXQgdHJhbnNsdWNlbnQgcGl4ZWxzIG9uIHRoZSBzYW1lIGxpbmUgKi8gICAgICAgIFwKICAgICAgICBvZnMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIHVuc2lnbmVkIHJ1bjsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIG9mcyArPSAoKFVpbnQxNiAqKXNyY2J1ZilbMF07ICAgICAgICAgICAgICAgICBcCiAgICAgICAgcnVuID0gKChVaW50MTYgKilzcmNidWYpWzFdOyAgICAgICAgICAgICAgICAgIFwKICAgICAgICBzcmNidWYgKz0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpZihydW4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAvKiBjbGlwIHRvIGxlZnQgYW5kIHJpZ2h0IGJvcmRlcnMgKi8gICAgICAgICAgXAogICAgICAgICAgICBpbnQgY29mcyA9IG9mczsgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpbnQgY3J1biA9IHJ1bjsgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpZihsZWZ0IC0gY29mcyA+IDApIHsgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgY3J1biAtPSBsZWZ0IC0gY29mczsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNvZnMgPSBsZWZ0OyAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaWYoY3J1biA+IHJpZ2h0IC0gY29mcykgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNydW4gPSByaWdodCAtIGNvZnM7ICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpZihjcnVuID4gMCkgeyAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBQdHlwZSAqZHN0ID0gKFB0eXBlICopZHN0YnVmICsgY29mczsgICAgICAgICAgXAogICAgICAgICAgICBVaW50MzIgKnNyYyA9IChVaW50MzIgKilzcmNidWYgKyAoY29mcyAtIG9mcyk7ICAgIFwKICAgICAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBjcnVuOyBpKyspICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGRvX2JsZW5kKHNyY1tpXSwgZHN0W2ldKTsgICAgICAgICAgICAgXAogICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHNyY2J1ZiArPSBydW4gKiA0OyAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBvZnMgKz0gcnVuOyAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9IHdoaWxlKG9mcyA8IHcpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZHN0YnVmICs9IHN1cmZfZHN0LT5waXRjaDsgICAgICAgICAgICAgICAgICAgICBcCiAgICB9IHdoaWxlKC0tbGluZWNvdW50KTsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgfSB3aGlsZSgwKQoKICAgIHN3aXRjaCAoZGYtPkJ5dGVzUGVyUGl4ZWwpIHsKICAgIGNhc2UgMjoKICAgICAgICBpZiAoZGYtPkdtYXNrID09IDB4MDdlMCB8fCBkZi0+Um1hc2sgPT0gMHgwN2UwIHx8IGRmLT5CbWFzayA9PSAweDA3ZTApCiAgICAgICAgICAgIFJMRUFMUEhBQ0xJUEJMSVQoVWludDE2LCBVaW50OCwgQkxJVF9UUkFOU0xfNTY1KTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIFJMRUFMUEhBQ0xJUEJMSVQoVWludDE2LCBVaW50OCwgQkxJVF9UUkFOU0xfNTU1KTsKICAgICAgICBicmVhazsKICAgIGNhc2UgNDoKICAgICAgICBSTEVBTFBIQUNMSVBCTElUKFVpbnQzMiwgVWludDE2LCBCTElUX1RSQU5TTF84ODgpOwogICAgICAgIGJyZWFrOwogICAgfQp9CgovKiBibGl0IGEgcGl4ZWwtYWxwaGEgUkxFIHN1cmZhY2UgKi8KaW50ClNETF9STEVBbHBoYUJsaXQoU0RMX1N1cmZhY2UgKiBzdXJmX3NyYywgU0RMX1JlY3QgKiBzcmNyZWN0LAogICAgICAgICAgICAgICAgIFNETF9TdXJmYWNlICogc3VyZl9kc3QsIFNETF9SZWN0ICogZHN0cmVjdCkKewogICAgaW50IHgsIHk7CiAgICBpbnQgdyA9IHN1cmZfc3JjLT53OwogICAgVWludDggKnNyY2J1ZiwgKmRzdGJ1ZjsKICAgIFNETF9QaXhlbEZvcm1hdCAqZGYgPSBzdXJmX2RzdC0+Zm9ybWF0OwoKICAgIC8qIExvY2sgdGhlIGRlc3RpbmF0aW9uIGlmIG5lY2Vzc2FyeSAqLwogICAgaWYgKFNETF9NVVNUTE9DSyhzdXJmX2RzdCkpIHsKICAgICAgICBpZiAoU0RMX0xvY2tTdXJmYWNlKHN1cmZfZHN0KSA8IDApIHsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgIH0KCiAgICB4ID0gZHN0cmVjdC0+eDsKICAgIHkgPSBkc3RyZWN0LT55OwogICAgZHN0YnVmID0gKFVpbnQ4ICopIHN1cmZfZHN0LT5waXhlbHMgKyB5ICogc3VyZl9kc3QtPnBpdGNoICsgeCAqIGRmLT5CeXRlc1BlclBpeGVsOwogICAgc3JjYnVmID0gKFVpbnQ4ICopIHN1cmZfc3JjLT5tYXAtPmRhdGEgKyBzaXplb2YoUkxFRGVzdEZvcm1hdCk7CgogICAgewogICAgICAgIC8qIHNraXAgbGluZXMgYXQgdGhlIHRvcCBpZiBuZWNlc3NhcnkgKi8KICAgICAgICBpbnQgdnNraXAgPSBzcmNyZWN0LT55OwogICAgICAgIGlmICh2c2tpcCkgewogICAgICAgICAgICBpbnQgb2ZzOwogICAgICAgICAgICBpZiAoZGYtPkJ5dGVzUGVyUGl4ZWwgPT0gMikgewogICAgICAgICAgICAgICAgLyogdGhlIDE2LzMyIGludGVybGVhdmVkIGZvcm1hdCAqLwogICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgIC8qIHNraXAgb3BhcXVlIGxpbmUgKi8KICAgICAgICAgICAgICAgICAgICBvZnMgPSAwOwogICAgICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJ1bjsKICAgICAgICAgICAgICAgICAgICAgICAgb2ZzICs9IHNyY2J1ZlswXTsKICAgICAgICAgICAgICAgICAgICAgICAgcnVuID0gc3JjYnVmWzFdOwogICAgICAgICAgICAgICAgICAgICAgICBzcmNidWYgKz0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjYnVmICs9IDIgKiBydW47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZnMgKz0gcnVuOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFvZnMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CiAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAob2ZzIDwgdyk7CgogICAgICAgICAgICAgICAgICAgIC8qIHNraXAgcGFkZGluZyAqLwogICAgICAgICAgICAgICAgICAgIHNyY2J1ZiArPSAodWludHB0cl90KSBzcmNidWYgJiAyOwoKICAgICAgICAgICAgICAgICAgICAvKiBza2lwIHRyYW5zbHVjZW50IGxpbmUgKi8KICAgICAgICAgICAgICAgICAgICBvZnMgPSAwOwogICAgICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJ1bjsKICAgICAgICAgICAgICAgICAgICAgICAgb2ZzICs9ICgoVWludDE2ICopIHNyY2J1ZilbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIHJ1biA9ICgoVWludDE2ICopIHNyY2J1ZilbMV07CiAgICAgICAgICAgICAgICAgICAgICAgIHNyY2J1ZiArPSA0ICogKHJ1biArIDEpOwogICAgICAgICAgICAgICAgICAgICAgICBvZnMgKz0gcnVuOwogICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKG9mcyA8IHcpOwogICAgICAgICAgICAgICAgfSB3aGlsZSAoLS12c2tpcCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvKiB0aGUgMzIvMzIgaW50ZXJsZWF2ZWQgZm9ybWF0ICovCiAgICAgICAgICAgICAgICB2c2tpcCA8PD0gMTsgICAgLyogb3BhcXVlIGFuZCB0cmFuc2x1Y2VudCBoYXZlIHNhbWUgZm9ybWF0ICovCiAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgb2ZzID0gMDsKICAgICAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgICAgIGludCBydW47CiAgICAgICAgICAgICAgICAgICAgICAgIG9mcyArPSAoKFVpbnQxNiAqKSBzcmNidWYpWzBdOwogICAgICAgICAgICAgICAgICAgICAgICBydW4gPSAoKFVpbnQxNiAqKSBzcmNidWYpWzFdOwogICAgICAgICAgICAgICAgICAgICAgICBzcmNidWYgKz0gNDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjYnVmICs9IDQgKiBydW47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZnMgKz0gcnVuOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFvZnMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CiAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAob2ZzIDwgdyk7CiAgICAgICAgICAgICAgICB9IHdoaWxlICgtLXZza2lwKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKiBpZiBsZWZ0IG9yIHJpZ2h0IGVkZ2UgY2xpcHBpbmcgbmVlZGVkLCBjYWxsIGNsaXAgYmxpdCAqLwogICAgaWYgKHNyY3JlY3QtPnggfHwgc3JjcmVjdC0+dyAhPSBzdXJmX3NyYy0+dykgewogICAgICAgIFJMRUFscGhhQ2xpcEJsaXQodywgc3JjYnVmLCBzdXJmX2RzdCwgZHN0YnVmLCBzcmNyZWN0KTsKICAgIH0gZWxzZSB7CgogICAgICAgIC8qCiAgICAgICAgICogbm9uLWNsaXBwZWQgYmxpdHRlci4gUHR5cGUgaXMgdGhlIGRlc3RpbmF0aW9uIHBpeGVsIHR5cGUsCiAgICAgICAgICogQ3R5cGUgdGhlIHRyYW5zbHVjZW50IGNvdW50IHR5cGUsIGFuZCBkb19ibGVuZCB0aGUKICAgICAgICAgKiBtYWNybyB0byBibGVuZCBvbmUgcGl4ZWwuCiAgICAgICAgICovCiNkZWZpbmUgUkxFQUxQSEFCTElUKFB0eXBlLCBDdHlwZSwgZG9fYmxlbmQpICAgICAgICAgICAgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGludCBsaW5lY291bnQgPSBzcmNyZWN0LT5oOyAgICAgICAgICAgICAgICAgIFwKICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaW50IG9mcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAvKiBibGl0IG9wYXF1ZSBwaXhlbHMgb24gb25lIGxpbmUgKi8gICAgICAgICAgICAgXAogICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgdW5zaWduZWQgcnVuOyAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBvZnMgKz0gKChDdHlwZSAqKXNyY2J1ZilbMF07ICAgICAgICAgICAgIFwKICAgICAgICAgICAgcnVuID0gKChDdHlwZSAqKXNyY2J1ZilbMV07ICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHNyY2J1ZiArPSAyICogc2l6ZW9mKEN0eXBlKTsgICAgICAgICAgICAgXAogICAgICAgICAgICBpZihydW4pIHsgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIFBJWEVMX0NPUFkoZHN0YnVmICsgb2ZzICogc2l6ZW9mKFB0eXBlKSwgc3JjYnVmLCBcCiAgICAgICAgICAgICAgICAgICBydW4sIHNpemVvZihQdHlwZSkpOyAgICAgICAgICBcCiAgICAgICAgICAgIHNyY2J1ZiArPSBydW4gKiBzaXplb2YoUHR5cGUpOyAgICAgICAgICAgXAogICAgICAgICAgICBvZnMgKz0gcnVuOyAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgfSBlbHNlIGlmKCFvZnMpICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBnb3RvIGRvbmU7ICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9IHdoaWxlKG9mcyA8IHcpOyAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIC8qIHNraXAgcGFkZGluZyBpZiBuZWNlc3NhcnkgKi8gICAgICAgICAgICAgIFwKICAgICAgICBpZihzaXplb2YoUHR5cGUpID09IDIpICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgc3JjYnVmICs9ICh1aW50cHRyX3Qpc3JjYnVmICYgMjsgICAgICAgICAgICAgXAogICAgICAgIC8qIGJsaXQgdHJhbnNsdWNlbnQgcGl4ZWxzIG9uIHRoZSBzYW1lIGxpbmUgKi8gICAgICAgXAogICAgICAgIG9mcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHVuc2lnbmVkIHJ1bjsgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgb2ZzICs9ICgoVWludDE2ICopc3JjYnVmKVswXTsgICAgICAgICAgICBcCiAgICAgICAgICAgIHJ1biA9ICgoVWludDE2ICopc3JjYnVmKVsxXTsgICAgICAgICAgICAgXAogICAgICAgICAgICBzcmNidWYgKz0gNDsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGlmKHJ1bikgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgUHR5cGUgKmRzdCA9IChQdHlwZSAqKWRzdGJ1ZiArIG9mczsgICAgICBcCiAgICAgICAgICAgIHVuc2lnbmVkIGk7ICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBydW47IGkrKykgeyAgICAgICAgICAgXAogICAgICAgICAgICAgICAgVWludDMyIHNyYyA9ICooVWludDMyICopc3JjYnVmOyAgICAgIFwKICAgICAgICAgICAgICAgIGRvX2JsZW5kKHNyYywgKmRzdCk7ICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIHNyY2J1ZiArPSA0OyAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgZHN0Kys7ICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgb2ZzICs9IHJ1bjsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gd2hpbGUob2ZzIDwgdyk7ICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZHN0YnVmICs9IHN1cmZfZHN0LT5waXRjaDsgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9IHdoaWxlKC0tbGluZWNvdW50KTsgICAgICAgICAgICAgICAgICAgIFwKICAgIH0gd2hpbGUoMCkKCiAgICAgICAgc3dpdGNoIChkZi0+Qnl0ZXNQZXJQaXhlbCkgewogICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgaWYgKGRmLT5HbWFzayA9PSAweDA3ZTAgfHwgZGYtPlJtYXNrID09IDB4MDdlMAogICAgICAgICAgICAgICAgfHwgZGYtPkJtYXNrID09IDB4MDdlMCkKICAgICAgICAgICAgICAgIFJMRUFMUEhBQkxJVChVaW50MTYsIFVpbnQ4LCBCTElUX1RSQU5TTF81NjUpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBSTEVBTFBIQUJMSVQoVWludDE2LCBVaW50OCwgQkxJVF9UUkFOU0xfNTU1KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA0OgogICAgICAgICAgICBSTEVBTFBIQUJMSVQoVWludDMyLCBVaW50MTYsIEJMSVRfVFJBTlNMXzg4OCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KCiAgZG9uZToKICAgIC8qIFVubG9jayB0aGUgZGVzdGluYXRpb24gaWYgbmVjZXNzYXJ5ICovCiAgICBpZiAoU0RMX01VU1RMT0NLKHN1cmZfZHN0KSkgewogICAgICAgIFNETF9VbmxvY2tTdXJmYWNlKHN1cmZfZHN0KTsKICAgIH0KICAgIHJldHVybiAwOwp9CgovKgogKiBBdXhpbGlhcnkgZnVuY3Rpb25zOgogKiBUaGUgZW5jb2RpbmcgZnVuY3Rpb25zIHRha2UgMzJicHAgcmdiICsgYSwgYW5kCiAqIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCB0byB0aGUgZGVzdGluYXRpb24uCiAqIFRoZSBkZWNvZGluZyBmdW5jdGlvbnMgY29weSB0byAzMmJwcCByZ2IgKyBhLCBhbmQKICogcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkIGZyb20gdGhlIHNvdXJjZS4KICogVGhlc2UgYXJlIG9ubHkgdXNlZCBpbiB0aGUgZW5jb2RlciBhbmQgdW4tUkxFIGNvZGUgYW5kIGFyZSB0aGVyZWZvcmUgbm90CiAqIGhpZ2hseSBvcHRpbWlzZWQuCiAqLwoKLyogZW5jb2RlIDMyYnBwIHJnYiArIGEgaW50byAxNmJwcCByZ2IsIGxvc2luZyBhbHBoYSAqLwpzdGF0aWMgaW50CmNvcHlfb3BhcXVlXzE2KHZvaWQgKmRzdCwgVWludDMyICogc3JjLCBpbnQgbiwKICAgICAgICAgICAgICAgU0RMX1BpeGVsRm9ybWF0ICogc2ZtdCwgU0RMX1BpeGVsRm9ybWF0ICogZGZtdCkKewogICAgaW50IGk7CiAgICBVaW50MTYgKmQgPSBkc3Q7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgdW5zaWduZWQgciwgZywgYjsKICAgICAgICBSR0JfRlJPTV9QSVhFTCgqc3JjLCBzZm10LCByLCBnLCBiKTsKICAgICAgICBQSVhFTF9GUk9NX1JHQigqZCwgZGZtdCwgciwgZywgYik7CiAgICAgICAgc3JjKys7CiAgICAgICAgZCsrOwogICAgfQogICAgcmV0dXJuIG4gKiAyOwp9CgovKiBkZWNvZGUgb3BhcXVlIHBpeGVscyBmcm9tIDE2YnBwIHRvIDMyYnBwIHJnYiArIGEgKi8Kc3RhdGljIGludAp1bmNvcHlfb3BhcXVlXzE2KFVpbnQzMiAqIGRzdCwgdm9pZCAqc3JjLCBpbnQgbiwKICAgICAgICAgICAgICAgICBSTEVEZXN0Rm9ybWF0ICogc2ZtdCwgU0RMX1BpeGVsRm9ybWF0ICogZGZtdCkKewogICAgaW50IGk7CiAgICBVaW50MTYgKnMgPSBzcmM7CiAgICB1bnNpZ25lZCBhbHBoYSA9IGRmbXQtPkFtYXNrID8gMjU1IDogMDsKICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICB1bnNpZ25lZCByLCBnLCBiOwogICAgICAgIFJHQl9GUk9NX1BJWEVMKCpzLCBzZm10LCByLCBnLCBiKTsKICAgICAgICBQSVhFTF9GUk9NX1JHQkEoKmRzdCwgZGZtdCwgciwgZywgYiwgYWxwaGEpOwogICAgICAgIHMrKzsKICAgICAgICBkc3QrKzsKICAgIH0KICAgIHJldHVybiBuICogMjsKfQoKCgovKiBlbmNvZGUgMzJicHAgcmdiICsgYSBpbnRvIDMyYnBwIEcwUkFCIGZvcm1hdCBmb3IgYmxpdHRpbmcgaW50byA1NjUgKi8Kc3RhdGljIGludApjb3B5X3RyYW5zbF81NjUodm9pZCAqZHN0LCBVaW50MzIgKiBzcmMsIGludCBuLAogICAgICAgICAgICAgICAgU0RMX1BpeGVsRm9ybWF0ICogc2ZtdCwgU0RMX1BpeGVsRm9ybWF0ICogZGZtdCkKewogICAgaW50IGk7CiAgICBVaW50MzIgKmQgPSBkc3Q7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgdW5zaWduZWQgciwgZywgYiwgYTsKICAgICAgICBVaW50MTYgcGl4OwogICAgICAgIFJHQkFfRlJPTV84ODg4KCpzcmMsIHNmbXQsIHIsIGcsIGIsIGEpOwogICAgICAgIFBJWEVMX0ZST01fUkdCKHBpeCwgZGZtdCwgciwgZywgYik7CiAgICAgICAgKmQgPSAoKHBpeCAmIDB4N2UwKSA8PCAxNikgfCAocGl4ICYgMHhmODFmKSB8ICgoYSA8PCAyKSAmIDB4N2UwKTsKICAgICAgICBzcmMrKzsKICAgICAgICBkKys7CiAgICB9CiAgICByZXR1cm4gbiAqIDQ7Cn0KCi8qIGVuY29kZSAzMmJwcCByZ2IgKyBhIGludG8gMzJicHAgRzBSQUIgZm9ybWF0IGZvciBibGl0dGluZyBpbnRvIDU1NSAqLwpzdGF0aWMgaW50CmNvcHlfdHJhbnNsXzU1NSh2b2lkICpkc3QsIFVpbnQzMiAqIHNyYywgaW50IG4sCiAgICAgICAgICAgICAgICBTRExfUGl4ZWxGb3JtYXQgKiBzZm10LCBTRExfUGl4ZWxGb3JtYXQgKiBkZm10KQp7CiAgICBpbnQgaTsKICAgIFVpbnQzMiAqZCA9IGRzdDsKICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICB1bnNpZ25lZCByLCBnLCBiLCBhOwogICAgICAgIFVpbnQxNiBwaXg7CiAgICAgICAgUkdCQV9GUk9NXzg4ODgoKnNyYywgc2ZtdCwgciwgZywgYiwgYSk7CiAgICAgICAgUElYRUxfRlJPTV9SR0IocGl4LCBkZm10LCByLCBnLCBiKTsKICAgICAgICAqZCA9ICgocGl4ICYgMHgzZTApIDw8IDE2KSB8IChwaXggJiAweGZjMWYpIHwgKChhIDw8IDIpICYgMHgzZTApOwogICAgICAgIHNyYysrOwogICAgICAgIGQrKzsKICAgIH0KICAgIHJldHVybiBuICogNDsKfQoKLyogZGVjb2RlIHRyYW5zbHVjZW50IHBpeGVscyBmcm9tIDMyYnBwIEdPUkFCIHRvIDMyYnBwIHJnYiArIGEgKi8Kc3RhdGljIGludAp1bmNvcHlfdHJhbnNsXzE2KFVpbnQzMiAqIGRzdCwgdm9pZCAqc3JjLCBpbnQgbiwKICAgICAgICAgICAgICAgICBSTEVEZXN0Rm9ybWF0ICogc2ZtdCwgU0RMX1BpeGVsRm9ybWF0ICogZGZtdCkKewogICAgaW50IGk7CiAgICBVaW50MzIgKnMgPSBzcmM7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgdW5zaWduZWQgciwgZywgYiwgYTsKICAgICAgICBVaW50MzIgcGl4ID0gKnMrKzsKICAgICAgICBhID0gKHBpeCAmIDB4M2UwKSA+PiAyOwogICAgICAgIHBpeCA9IChwaXggJiB+MHgzZTApIHwgcGl4ID4+IDE2OwogICAgICAgIFJHQl9GUk9NX1BJWEVMKHBpeCwgc2ZtdCwgciwgZywgYik7CiAgICAgICAgUElYRUxfRlJPTV9SR0JBKCpkc3QsIGRmbXQsIHIsIGcsIGIsIGEpOwogICAgICAgIGRzdCsrOwogICAgfQogICAgcmV0dXJuIG4gKiA0Owp9CgovKiBlbmNvZGUgMzJicHAgcmdiYSBpbnRvIDMyYnBwIHJnYmEsIGtlZXBpbmcgYWxwaGEgKGR1YWwgcHVycG9zZSkgKi8Kc3RhdGljIGludApjb3B5XzMyKHZvaWQgKmRzdCwgVWludDMyICogc3JjLCBpbnQgbiwKICAgICAgICBTRExfUGl4ZWxGb3JtYXQgKiBzZm10LCBTRExfUGl4ZWxGb3JtYXQgKiBkZm10KQp7CiAgICBpbnQgaTsKICAgIFVpbnQzMiAqZCA9IGRzdDsKICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICB1bnNpZ25lZCByLCBnLCBiLCBhOwogICAgICAgIFJHQkFfRlJPTV84ODg4KCpzcmMsIHNmbXQsIHIsIGcsIGIsIGEpOwogICAgICAgIFJMRVBJWEVMX0ZST01fUkdCQSgqZCwgZGZtdCwgciwgZywgYiwgYSk7CiAgICAgICAgZCsrOwogICAgICAgIHNyYysrOwogICAgfQogICAgcmV0dXJuIG4gKiA0Owp9CgovKiBkZWNvZGUgMzJicHAgcmdiYSBpbnRvIDMyYnBwIHJnYmEsIGtlZXBpbmcgYWxwaGEgKGR1YWwgcHVycG9zZSkgKi8Kc3RhdGljIGludAp1bmNvcHlfMzIoVWludDMyICogZHN0LCB2b2lkICpzcmMsIGludCBuLAogICAgICAgICAgUkxFRGVzdEZvcm1hdCAqIHNmbXQsIFNETF9QaXhlbEZvcm1hdCAqIGRmbXQpCnsKICAgIGludCBpOwogICAgVWludDMyICpzID0gc3JjOwogICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIHVuc2lnbmVkIHIsIGcsIGIsIGE7CiAgICAgICAgVWludDMyIHBpeGVsID0gKnMrKzsKICAgICAgICBSR0JfRlJPTV9QSVhFTChwaXhlbCwgc2ZtdCwgciwgZywgYik7CiAgICAgICAgYSA9IHBpeGVsID4+IDI0OwogICAgICAgIFBJWEVMX0ZST01fUkdCQSgqZHN0LCBkZm10LCByLCBnLCBiLCBhKTsKICAgICAgICBkc3QrKzsKICAgIH0KICAgIHJldHVybiBuICogNDsKfQoKI2RlZmluZSBJU09QQVFVRShwaXhlbCwgZm10KSAoKCgocGl4ZWwpICYgZm10LT5BbWFzaykgPj4gZm10LT5Bc2hpZnQpID09IDI1NSkKCiNkZWZpbmUgSVNUUkFOU0wocGl4ZWwsIGZtdCkgICAgXAogICAgKCh1bnNpZ25lZCkoKCgocGl4ZWwpICYgZm10LT5BbWFzaykgPj4gZm10LT5Bc2hpZnQpIC0gMVUpIDwgMjU0VSkKCi8qIGNvbnZlcnQgc3VyZmFjZSB0byBiZSBxdWlja2x5IGFscGhhLWJsaXR0YWJsZSBvbnRvIGRlc3QsIGlmIHBvc3NpYmxlICovCnN0YXRpYyBpbnQKUkxFQWxwaGFTdXJmYWNlKFNETF9TdXJmYWNlICogc3VyZmFjZSkKewogICAgU0RMX1N1cmZhY2UgKmRlc3Q7CiAgICBTRExfUGl4ZWxGb3JtYXQgKmRmOwogICAgaW50IG1heHNpemUgPSAwOwogICAgaW50IG1heF9vcGFxdWVfcnVuOwogICAgaW50IG1heF90cmFuc2xfcnVuID0gNjU1MzU7CiAgICB1bnNpZ25lZCBtYXNrc3VtOwogICAgVWludDggKnJsZWJ1ZiwgKmRzdDsKICAgIGludCAoKmNvcHlfb3BhcXVlKSAodm9pZCAqLCBVaW50MzIgKiwgaW50LAogICAgICAgICAgICAgICAgICAgICAgICBTRExfUGl4ZWxGb3JtYXQgKiwgU0RMX1BpeGVsRm9ybWF0ICopOwogICAgaW50ICgqY29weV90cmFuc2wpICh2b2lkICosIFVpbnQzMiAqLCBpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgIFNETF9QaXhlbEZvcm1hdCAqLCBTRExfUGl4ZWxGb3JtYXQgKik7CgogICAgZGVzdCA9IHN1cmZhY2UtPm1hcC0+ZHN0OwogICAgaWYgKCFkZXN0KQogICAgICAgIHJldHVybiAtMTsKICAgIGRmID0gZGVzdC0+Zm9ybWF0OwogICAgaWYgKHN1cmZhY2UtPmZvcm1hdC0+Qml0c1BlclBpeGVsICE9IDMyKQogICAgICAgIHJldHVybiAtMTsgICAgICAgICAgICAgIC8qIG9ubHkgMzJicHAgc291cmNlIHN1cHBvcnRlZCAqLwoKICAgIC8qIGZpbmQgb3V0IHdoZXRoZXIgdGhlIGRlc3RpbmF0aW9uIGlzIG9uZSB3ZSBzdXBwb3J0LAogICAgICAgYW5kIGRldGVybWluZSB0aGUgbWF4IHNpemUgb2YgdGhlIGVuY29kZWQgcmVzdWx0ICovCiAgICBtYXNrc3VtID0gZGYtPlJtYXNrIHwgZGYtPkdtYXNrIHwgZGYtPkJtYXNrOwogICAgc3dpdGNoIChkZi0+Qnl0ZXNQZXJQaXhlbCkgewogICAgY2FzZSAyOgogICAgICAgIC8qIDE2YnBwOiBvbmx5IHN1cHBvcnQgNTY1IGFuZCA1NTUgZm9ybWF0cyAqLwogICAgICAgIHN3aXRjaCAobWFza3N1bSkgewogICAgICAgIGNhc2UgMHhmZmZmOgogICAgICAgICAgICBpZiAoZGYtPkdtYXNrID09IDB4MDdlMAogICAgICAgICAgICAgICAgfHwgZGYtPlJtYXNrID09IDB4MDdlMCB8fCBkZi0+Qm1hc2sgPT0gMHgwN2UwKSB7CiAgICAgICAgICAgICAgICBjb3B5X29wYXF1ZSA9IGNvcHlfb3BhcXVlXzE2OwogICAgICAgICAgICAgICAgY29weV90cmFuc2wgPSBjb3B5X3RyYW5zbF81NjU7CiAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4N2ZmZjoKICAgICAgICAgICAgaWYgKGRmLT5HbWFzayA9PSAweDAzZTAKICAgICAgICAgICAgICAgIHx8IGRmLT5SbWFzayA9PSAweDAzZTAgfHwgZGYtPkJtYXNrID09IDB4MDNlMCkgewogICAgICAgICAgICAgICAgY29weV9vcGFxdWUgPSBjb3B5X29wYXF1ZV8xNjsKICAgICAgICAgICAgICAgIGNvcHlfdHJhbnNsID0gY29weV90cmFuc2xfNTU1OwogICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICBtYXhfb3BhcXVlX3J1biA9IDI1NTsgICAvKiBydW5zIHN0b3JlZCBhcyBieXRlcyAqLwoKICAgICAgICAvKiB3b3JzdCBjYXNlIGlzIGFsdGVybmF0aW5nIG9wYXF1ZSBhbmQgdHJhbnNsdWNlbnQgcGl4ZWxzLAogICAgICAgICAgIHdpdGggcm9vbSBmb3IgYWxpZ25tZW50IHBhZGRpbmcgYmV0d2VlbiBsaW5lcyAqLwogICAgICAgIG1heHNpemUgPSBzdXJmYWNlLT5oICogKDIgKyAoNCArIDIpICogKHN1cmZhY2UtPncgKyAxKSkgKyAyOwogICAgICAgIGJyZWFrOwogICAgY2FzZSA0OgogICAgICAgIGlmIChtYXNrc3VtICE9IDB4MDBmZmZmZmYpCiAgICAgICAgICAgIHJldHVybiAtMTsgICAgICAgICAgLyogcmVxdWlyZXMgdW51c2VkIGhpZ2ggYnl0ZSAqLwogICAgICAgIGNvcHlfb3BhcXVlID0gY29weV8zMjsKICAgICAgICBjb3B5X3RyYW5zbCA9IGNvcHlfMzI7CiAgICAgICAgbWF4X29wYXF1ZV9ydW4gPSAyNTU7ICAgLyogcnVucyBzdG9yZWQgYXMgc2hvcnQgaW50cyAqLwoKICAgICAgICAvKiB3b3JzdCBjYXNlIGlzIGFsdGVybmF0aW5nIG9wYXF1ZSBhbmQgdHJhbnNsdWNlbnQgcGl4ZWxzICovCiAgICAgICAgbWF4c2l6ZSA9IHN1cmZhY2UtPmggKiAyICogNCAqIChzdXJmYWNlLT53ICsgMSkgKyA0OwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAvKiBhbnl0aGluZyBlbHNlIHVuc3VwcG9ydGVkIHJpZ2h0IG5vdyAqLwogICAgfQoKICAgIG1heHNpemUgKz0gc2l6ZW9mKFJMRURlc3RGb3JtYXQpOwogICAgcmxlYnVmID0gKFVpbnQ4ICopIFNETF9tYWxsb2MobWF4c2l6ZSk7CiAgICBpZiAoIXJsZWJ1ZikgewogICAgICAgIHJldHVybiBTRExfT3V0T2ZNZW1vcnkoKTsKICAgIH0KICAgIHsKICAgICAgICAvKiBzYXZlIHRoZSBkZXN0aW5hdGlvbiBmb3JtYXQgc28gd2UgY2FuIHVuZG8gdGhlIGVuY29kaW5nIGxhdGVyICovCiAgICAgICAgUkxFRGVzdEZvcm1hdCAqciA9IChSTEVEZXN0Rm9ybWF0ICopIHJsZWJ1ZjsKICAgICAgICByLT5CeXRlc1BlclBpeGVsID0gZGYtPkJ5dGVzUGVyUGl4ZWw7CiAgICAgICAgci0+Um1hc2sgPSBkZi0+Um1hc2s7CiAgICAgICAgci0+R21hc2sgPSBkZi0+R21hc2s7CiAgICAgICAgci0+Qm1hc2sgPSBkZi0+Qm1hc2s7CiAgICAgICAgci0+QW1hc2sgPSBkZi0+QW1hc2s7CiAgICAgICAgci0+Umxvc3MgPSBkZi0+Umxvc3M7CiAgICAgICAgci0+R2xvc3MgPSBkZi0+R2xvc3M7CiAgICAgICAgci0+Qmxvc3MgPSBkZi0+Qmxvc3M7CiAgICAgICAgci0+QWxvc3MgPSBkZi0+QWxvc3M7CiAgICAgICAgci0+UnNoaWZ0ID0gZGYtPlJzaGlmdDsKICAgICAgICByLT5Hc2hpZnQgPSBkZi0+R3NoaWZ0OwogICAgICAgIHItPkJzaGlmdCA9IGRmLT5Cc2hpZnQ7CiAgICAgICAgci0+QXNoaWZ0ID0gZGYtPkFzaGlmdDsKICAgIH0KICAgIGRzdCA9IHJsZWJ1ZiArIHNpemVvZihSTEVEZXN0Rm9ybWF0KTsKCiAgICAvKiBEbyB0aGUgYWN0dWFsIGVuY29kaW5nICovCiAgICB7CiAgICAgICAgaW50IHgsIHk7CiAgICAgICAgaW50IGggPSBzdXJmYWNlLT5oLCB3ID0gc3VyZmFjZS0+dzsKICAgICAgICBTRExfUGl4ZWxGb3JtYXQgKnNmID0gc3VyZmFjZS0+Zm9ybWF0OwogICAgICAgIFVpbnQzMiAqc3JjID0gKFVpbnQzMiAqKSBzdXJmYWNlLT5waXhlbHM7CiAgICAgICAgVWludDggKmxhc3RsaW5lID0gZHN0OyAgLyogZW5kIG9mIGxhc3Qgbm9uLWJsYW5rIGxpbmUgKi8KCiAgICAgICAgLyogb3BhcXVlIGNvdW50cyBhcmUgOCBvciAxNiBiaXRzLCBkZXBlbmRpbmcgb24gdGFyZ2V0IGRlcHRoICovCiNkZWZpbmUgQUREX09QQVFVRV9DT1VOVFMobiwgbSkgICAgICAgICBcCiAgICBpZihkZi0+Qnl0ZXNQZXJQaXhlbCA9PSA0KSB7ICAgICAgICBcCiAgICAgICAgKChVaW50MTYgKilkc3QpWzBdID0gbjsgICAgIFwKICAgICAgICAoKFVpbnQxNiAqKWRzdClbMV0gPSBtOyAgICAgXAogICAgICAgIGRzdCArPSA0OyAgICAgICAgICAgICAgIFwKICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgIFwKICAgICAgICBkc3RbMF0gPSBuOyAgICAgICAgICAgICBcCiAgICAgICAgZHN0WzFdID0gbTsgICAgICAgICAgICAgXAogICAgICAgIGRzdCArPSAyOyAgICAgICAgICAgICAgIFwKICAgIH0KCiAgICAgICAgLyogdHJhbnNsdWNlbnQgY291bnRzIGFyZSBhbHdheXMgMTYgYml0ICovCiNkZWZpbmUgQUREX1RSQU5TTF9DT1VOVFMobiwgbSkgICAgIFwKICAgICgoKFVpbnQxNiAqKWRzdClbMF0gPSBuLCAoKFVpbnQxNiAqKWRzdClbMV0gPSBtLCBkc3QgKz0gNCkKCiAgICAgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgewogICAgICAgICAgICBpbnQgcnVuc3RhcnQsIHNraXBzdGFydDsKICAgICAgICAgICAgaW50IGJsYW5rbGluZSA9IDA7CiAgICAgICAgICAgIC8qIEZpcnN0IGVuY29kZSBhbGwgb3BhcXVlIHBpeGVscyBvZiBhIHNjYW4gbGluZSAqLwogICAgICAgICAgICB4ID0gMDsKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgaW50IHJ1biwgc2tpcCwgbGVuOwogICAgICAgICAgICAgICAgc2tpcHN0YXJ0ID0geDsKICAgICAgICAgICAgICAgIHdoaWxlICh4IDwgdyAmJiAhSVNPUEFRVUUoc3JjW3hdLCBzZikpCiAgICAgICAgICAgICAgICAgICAgeCsrOwogICAgICAgICAgICAgICAgcnVuc3RhcnQgPSB4OwogICAgICAgICAgICAgICAgd2hpbGUgKHggPCB3ICYmIElTT1BBUVVFKHNyY1t4XSwgc2YpKQogICAgICAgICAgICAgICAgICAgIHgrKzsKICAgICAgICAgICAgICAgIHNraXAgPSBydW5zdGFydCAtIHNraXBzdGFydDsKICAgICAgICAgICAgICAgIGlmIChza2lwID09IHcpCiAgICAgICAgICAgICAgICAgICAgYmxhbmtsaW5lID0gMTsKICAgICAgICAgICAgICAgIHJ1biA9IHggLSBydW5zdGFydDsKICAgICAgICAgICAgICAgIHdoaWxlIChza2lwID4gbWF4X29wYXF1ZV9ydW4pIHsKICAgICAgICAgICAgICAgICAgICBBRERfT1BBUVVFX0NPVU5UUyhtYXhfb3BhcXVlX3J1biwgMCk7CiAgICAgICAgICAgICAgICAgICAgc2tpcCAtPSBtYXhfb3BhcXVlX3J1bjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxlbiA9IE1JTihydW4sIG1heF9vcGFxdWVfcnVuKTsKICAgICAgICAgICAgICAgIEFERF9PUEFRVUVfQ09VTlRTKHNraXAsIGxlbik7CiAgICAgICAgICAgICAgICBkc3QgKz0gY29weV9vcGFxdWUoZHN0LCBzcmMgKyBydW5zdGFydCwgbGVuLCBzZiwgZGYpOwogICAgICAgICAgICAgICAgcnVuc3RhcnQgKz0gbGVuOwogICAgICAgICAgICAgICAgcnVuIC09IGxlbjsKICAgICAgICAgICAgICAgIHdoaWxlIChydW4pIHsKICAgICAgICAgICAgICAgICAgICBsZW4gPSBNSU4ocnVuLCBtYXhfb3BhcXVlX3J1bik7CiAgICAgICAgICAgICAgICAgICAgQUREX09QQVFVRV9DT1VOVFMoMCwgbGVuKTsKICAgICAgICAgICAgICAgICAgICBkc3QgKz0gY29weV9vcGFxdWUoZHN0LCBzcmMgKyBydW5zdGFydCwgbGVuLCBzZiwgZGYpOwogICAgICAgICAgICAgICAgICAgIHJ1bnN0YXJ0ICs9IGxlbjsKICAgICAgICAgICAgICAgICAgICBydW4gLT0gbGVuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IHdoaWxlICh4IDwgdyk7CgogICAgICAgICAgICAvKiBNYWtlIHN1cmUgdGhlIG5leHQgb3V0cHV0IGFkZHJlc3MgaXMgMzItYml0IGFsaWduZWQgKi8KICAgICAgICAgICAgZHN0ICs9ICh1aW50cHRyX3QpIGRzdCAmIDI7CgogICAgICAgICAgICAvKiBOZXh0LCBlbmNvZGUgYWxsIHRyYW5zbHVjZW50IHBpeGVscyBvZiB0aGUgc2FtZSBzY2FuIGxpbmUgKi8KICAgICAgICAgICAgeCA9IDA7CiAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgIGludCBydW4sIHNraXAsIGxlbjsKICAgICAgICAgICAgICAgIHNraXBzdGFydCA9IHg7CiAgICAgICAgICAgICAgICB3aGlsZSAoeCA8IHcgJiYgIUlTVFJBTlNMKHNyY1t4XSwgc2YpKQogICAgICAgICAgICAgICAgICAgIHgrKzsKICAgICAgICAgICAgICAgIHJ1bnN0YXJ0ID0geDsKICAgICAgICAgICAgICAgIHdoaWxlICh4IDwgdyAmJiBJU1RSQU5TTChzcmNbeF0sIHNmKSkKICAgICAgICAgICAgICAgICAgICB4Kys7CiAgICAgICAgICAgICAgICBza2lwID0gcnVuc3RhcnQgLSBza2lwc3RhcnQ7CiAgICAgICAgICAgICAgICBibGFua2xpbmUgJj0gKHNraXAgPT0gdyk7CiAgICAgICAgICAgICAgICBydW4gPSB4IC0gcnVuc3RhcnQ7CiAgICAgICAgICAgICAgICB3aGlsZSAoc2tpcCA+IG1heF90cmFuc2xfcnVuKSB7CiAgICAgICAgICAgICAgICAgICAgQUREX1RSQU5TTF9DT1VOVFMobWF4X3RyYW5zbF9ydW4sIDApOwogICAgICAgICAgICAgICAgICAgIHNraXAgLT0gbWF4X3RyYW5zbF9ydW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsZW4gPSBNSU4ocnVuLCBtYXhfdHJhbnNsX3J1bik7CiAgICAgICAgICAgICAgICBBRERfVFJBTlNMX0NPVU5UUyhza2lwLCBsZW4pOwogICAgICAgICAgICAgICAgZHN0ICs9IGNvcHlfdHJhbnNsKGRzdCwgc3JjICsgcnVuc3RhcnQsIGxlbiwgc2YsIGRmKTsKICAgICAgICAgICAgICAgIHJ1bnN0YXJ0ICs9IGxlbjsKICAgICAgICAgICAgICAgIHJ1biAtPSBsZW47CiAgICAgICAgICAgICAgICB3aGlsZSAocnVuKSB7CiAgICAgICAgICAgICAgICAgICAgbGVuID0gTUlOKHJ1biwgbWF4X3RyYW5zbF9ydW4pOwogICAgICAgICAgICAgICAgICAgIEFERF9UUkFOU0xfQ09VTlRTKDAsIGxlbik7CiAgICAgICAgICAgICAgICAgICAgZHN0ICs9IGNvcHlfdHJhbnNsKGRzdCwgc3JjICsgcnVuc3RhcnQsIGxlbiwgc2YsIGRmKTsKICAgICAgICAgICAgICAgICAgICBydW5zdGFydCArPSBsZW47CiAgICAgICAgICAgICAgICAgICAgcnVuIC09IGxlbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghYmxhbmtsaW5lKQogICAgICAgICAgICAgICAgICAgIGxhc3RsaW5lID0gZHN0OwogICAgICAgICAgICB9IHdoaWxlICh4IDwgdyk7CgogICAgICAgICAgICBzcmMgKz0gc3VyZmFjZS0+cGl0Y2ggPj4gMjsKICAgICAgICB9CiAgICAgICAgZHN0ID0gbGFzdGxpbmU7ICAgICAgICAgLyogYmFjayB1cCBwYXN0IHRyYWlsaW5nIGJsYW5rIGxpbmVzICovCiAgICAgICAgQUREX09QQVFVRV9DT1VOVFMoMCwgMCk7CiAgICB9CgojdW5kZWYgQUREX09QQVFVRV9DT1VOVFMKI3VuZGVmIEFERF9UUkFOU0xfQ09VTlRTCgogICAgLyogTm93IHRoYXQgd2UgaGF2ZSBpdCBlbmNvZGVkLCByZWxlYXNlIHRoZSBvcmlnaW5hbCBwaXhlbHMgKi8KICAgIGlmICghKHN1cmZhY2UtPmZsYWdzICYgU0RMX1BSRUFMTE9DKSkgewogICAgICAgIFNETF9mcmVlKHN1cmZhY2UtPnBpeGVscyk7CiAgICAgICAgc3VyZmFjZS0+cGl4ZWxzID0gTlVMTDsKICAgIH0KCiAgICAvKiByZWFsbG9jIHRoZSBidWZmZXIgdG8gcmVsZWFzZSB1bnVzZWQgbWVtb3J5ICovCiAgICB7CiAgICAgICAgVWludDggKnAgPSBTRExfcmVhbGxvYyhybGVidWYsIGRzdCAtIHJsZWJ1Zik7CiAgICAgICAgaWYgKCFwKQogICAgICAgICAgICBwID0gcmxlYnVmOwogICAgICAgIHN1cmZhY2UtPm1hcC0+ZGF0YSA9IHA7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBVaW50MzIKZ2V0cGl4XzgoVWludDggKiBzcmNidWYpCnsKICAgIHJldHVybiAqc3JjYnVmOwp9CgpzdGF0aWMgVWludDMyCmdldHBpeF8xNihVaW50OCAqIHNyY2J1ZikKewogICAgcmV0dXJuICooVWludDE2ICopIHNyY2J1ZjsKfQoKc3RhdGljIFVpbnQzMgpnZXRwaXhfMjQoVWludDggKiBzcmNidWYpCnsKI2lmIFNETF9CWVRFT1JERVIgPT0gU0RMX0xJTF9FTkRJQU4KICAgIHJldHVybiBzcmNidWZbMF0gKyAoc3JjYnVmWzFdIDw8IDgpICsgKHNyY2J1ZlsyXSA8PCAxNik7CiNlbHNlCiAgICByZXR1cm4gKHNyY2J1ZlswXSA8PCAxNikgKyAoc3JjYnVmWzFdIDw8IDgpICsgc3JjYnVmWzJdOwojZW5kaWYKfQoKc3RhdGljIFVpbnQzMgpnZXRwaXhfMzIoVWludDggKiBzcmNidWYpCnsKICAgIHJldHVybiAqKFVpbnQzMiAqKSBzcmNidWY7Cn0KCnR5cGVkZWYgVWludDMyKCpnZXRwaXhfZnVuYykgKFVpbnQ4ICopOwoKc3RhdGljIGNvbnN0IGdldHBpeF9mdW5jIGdldHBpeGVzWzRdID0gewogICAgZ2V0cGl4XzgsIGdldHBpeF8xNiwgZ2V0cGl4XzI0LCBnZXRwaXhfMzIKfTsKCnN0YXRpYyBpbnQKUkxFQ29sb3JrZXlTdXJmYWNlKFNETF9TdXJmYWNlICogc3VyZmFjZSkKewogICAgVWludDggKnJsZWJ1ZiwgKmRzdDsKICAgIGludCBtYXhuOwogICAgaW50IHk7CiAgICBVaW50OCAqc3JjYnVmLCAqbGFzdGxpbmU7CiAgICBpbnQgbWF4c2l6ZSA9IDA7CiAgICBpbnQgYnBwID0gc3VyZmFjZS0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsOwogICAgZ2V0cGl4X2Z1bmMgZ2V0cGl4OwogICAgVWludDMyIGNrZXksIHJnYm1hc2s7CiAgICBpbnQgdywgaDsKCiAgICAvKiBjYWxjdWxhdGUgdGhlIHdvcnN0IGNhc2Ugc2l6ZSBmb3IgdGhlIGNvbXByZXNzZWQgc3VyZmFjZSAqLwogICAgc3dpdGNoIChicHApIHsKICAgIGNhc2UgMToKICAgICAgICAvKiB3b3JzdCBjYXNlIGlzIGFsdGVybmF0aW5nIG9wYXF1ZSBhbmQgdHJhbnNwYXJlbnQgcGl4ZWxzLAogICAgICAgICAgIHN0YXJ0aW5nIHdpdGggYW4gb3BhcXVlIHBpeGVsICovCiAgICAgICAgbWF4c2l6ZSA9IHN1cmZhY2UtPmggKiAzICogKHN1cmZhY2UtPncgLyAyICsgMSkgKyAyOwogICAgICAgIGJyZWFrOwogICAgY2FzZSAyOgogICAgY2FzZSAzOgogICAgICAgIC8qIHdvcnN0IGNhc2UgaXMgc29saWQgcnVucywgYXQgbW9zdCAyNTUgcGl4ZWxzIHdpZGUgKi8KICAgICAgICBtYXhzaXplID0gc3VyZmFjZS0+aCAqICgyICogKHN1cmZhY2UtPncgLyAyNTUgKyAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3VyZmFjZS0+dyAqIGJwcCkgKyAyOwogICAgICAgIGJyZWFrOwogICAgY2FzZSA0OgogICAgICAgIC8qIHdvcnN0IGNhc2UgaXMgc29saWQgcnVucywgYXQgbW9zdCA2NTUzNSBwaXhlbHMgd2lkZSAqLwogICAgICAgIG1heHNpemUgPSBzdXJmYWNlLT5oICogKDQgKiAoc3VyZmFjZS0+dyAvIDY1NTM1ICsgMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN1cmZhY2UtPncgKiA0KSArIDQ7CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgcmxlYnVmID0gKFVpbnQ4ICopIFNETF9tYWxsb2MobWF4c2l6ZSk7CiAgICBpZiAocmxlYnVmID09IE5VTEwpIHsKICAgICAgICByZXR1cm4gU0RMX091dE9mTWVtb3J5KCk7CiAgICB9CgogICAgLyogU2V0IHVwIHRoZSBjb252ZXJzaW9uICovCiAgICBzcmNidWYgPSAoVWludDggKikgc3VyZmFjZS0+cGl4ZWxzOwogICAgbWF4biA9IGJwcCA9PSA0ID8gNjU1MzUgOiAyNTU7CiAgICBkc3QgPSBybGVidWY7CiAgICByZ2JtYXNrID0gfnN1cmZhY2UtPmZvcm1hdC0+QW1hc2s7CiAgICBja2V5ID0gc3VyZmFjZS0+bWFwLT5pbmZvLmNvbG9ya2V5ICYgcmdibWFzazsKICAgIGxhc3RsaW5lID0gZHN0OwogICAgZ2V0cGl4ID0gZ2V0cGl4ZXNbYnBwIC0gMV07CiAgICB3ID0gc3VyZmFjZS0+dzsKICAgIGggPSBzdXJmYWNlLT5oOwoKI2RlZmluZSBBRERfQ09VTlRTKG4sIG0pICAgICAgICAgICAgXAogICAgaWYoYnBwID09IDQpIHsgICAgICAgICAgICAgIFwKICAgICAgICAoKFVpbnQxNiAqKWRzdClbMF0gPSBuOyAgICAgXAogICAgICAgICgoVWludDE2ICopZHN0KVsxXSA9IG07ICAgICBcCiAgICAgICAgZHN0ICs9IDQ7ICAgICAgICAgICAgICAgXAogICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgXAogICAgICAgIGRzdFswXSA9IG47ICAgICAgICAgICAgIFwKICAgICAgICBkc3RbMV0gPSBtOyAgICAgICAgICAgICBcCiAgICAgICAgZHN0ICs9IDI7ICAgICAgICAgICAgICAgXAogICAgfQoKICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKICAgICAgICBpbnQgeCA9IDA7CiAgICAgICAgaW50IGJsYW5rbGluZSA9IDA7CiAgICAgICAgZG8gewogICAgICAgICAgICBpbnQgcnVuLCBza2lwLCBsZW47CiAgICAgICAgICAgIGludCBydW5zdGFydDsKICAgICAgICAgICAgaW50IHNraXBzdGFydCA9IHg7CgogICAgICAgICAgICAvKiBmaW5kIHJ1biBvZiB0cmFuc3BhcmVudCwgdGhlbiBvcGFxdWUgcGl4ZWxzICovCiAgICAgICAgICAgIHdoaWxlICh4IDwgdyAmJiAoZ2V0cGl4KHNyY2J1ZiArIHggKiBicHApICYgcmdibWFzaykgPT0gY2tleSkKICAgICAgICAgICAgICAgIHgrKzsKICAgICAgICAgICAgcnVuc3RhcnQgPSB4OwogICAgICAgICAgICB3aGlsZSAoeCA8IHcgJiYgKGdldHBpeChzcmNidWYgKyB4ICogYnBwKSAmIHJnYm1hc2spICE9IGNrZXkpCiAgICAgICAgICAgICAgICB4Kys7CiAgICAgICAgICAgIHNraXAgPSBydW5zdGFydCAtIHNraXBzdGFydDsKICAgICAgICAgICAgaWYgKHNraXAgPT0gdykKICAgICAgICAgICAgICAgIGJsYW5rbGluZSA9IDE7CiAgICAgICAgICAgIHJ1biA9IHggLSBydW5zdGFydDsKCiAgICAgICAgICAgIC8qIGVuY29kZSBzZWdtZW50ICovCiAgICAgICAgICAgIHdoaWxlIChza2lwID4gbWF4bikgewogICAgICAgICAgICAgICAgQUREX0NPVU5UUyhtYXhuLCAwKTsKICAgICAgICAgICAgICAgIHNraXAgLT0gbWF4bjsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZW4gPSBNSU4ocnVuLCBtYXhuKTsKICAgICAgICAgICAgQUREX0NPVU5UUyhza2lwLCBsZW4pOwogICAgICAgICAgICBTRExfbWVtY3B5KGRzdCwgc3JjYnVmICsgcnVuc3RhcnQgKiBicHAsIGxlbiAqIGJwcCk7CiAgICAgICAgICAgIGRzdCArPSBsZW4gKiBicHA7CiAgICAgICAgICAgIHJ1biAtPSBsZW47CiAgICAgICAgICAgIHJ1bnN0YXJ0ICs9IGxlbjsKICAgICAgICAgICAgd2hpbGUgKHJ1bikgewogICAgICAgICAgICAgICAgbGVuID0gTUlOKHJ1biwgbWF4bik7CiAgICAgICAgICAgICAgICBBRERfQ09VTlRTKDAsIGxlbik7CiAgICAgICAgICAgICAgICBTRExfbWVtY3B5KGRzdCwgc3JjYnVmICsgcnVuc3RhcnQgKiBicHAsIGxlbiAqIGJwcCk7CiAgICAgICAgICAgICAgICBkc3QgKz0gbGVuICogYnBwOwogICAgICAgICAgICAgICAgcnVuc3RhcnQgKz0gbGVuOwogICAgICAgICAgICAgICAgcnVuIC09IGxlbjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWJsYW5rbGluZSkKICAgICAgICAgICAgICAgIGxhc3RsaW5lID0gZHN0OwogICAgICAgIH0gd2hpbGUgKHggPCB3KTsKCiAgICAgICAgc3JjYnVmICs9IHN1cmZhY2UtPnBpdGNoOwogICAgfQogICAgZHN0ID0gbGFzdGxpbmU7ICAgICAgICAgICAgIC8qIGJhY2sgdXAgYmFzdCB0cmFpbGluZyBibGFuayBsaW5lcyAqLwogICAgQUREX0NPVU5UUygwLCAwKTsKCiN1bmRlZiBBRERfQ09VTlRTCgogICAgLyogTm93IHRoYXQgd2UgaGF2ZSBpdCBlbmNvZGVkLCByZWxlYXNlIHRoZSBvcmlnaW5hbCBwaXhlbHMgKi8KICAgIGlmICghKHN1cmZhY2UtPmZsYWdzICYgU0RMX1BSRUFMTE9DKSkgewogICAgICAgIFNETF9mcmVlKHN1cmZhY2UtPnBpeGVscyk7CiAgICAgICAgc3VyZmFjZS0+cGl4ZWxzID0gTlVMTDsKICAgIH0KCiAgICAvKiByZWFsbG9jIHRoZSBidWZmZXIgdG8gcmVsZWFzZSB1bnVzZWQgbWVtb3J5ICovCiAgICB7CiAgICAgICAgLyogSWYgcmVhbGxvYyByZXR1cm5zIE5VTEwsIHRoZSBvcmlnaW5hbCBibG9jayBpcyBsZWZ0IGludGFjdCAqLwogICAgICAgIFVpbnQ4ICpwID0gU0RMX3JlYWxsb2MocmxlYnVmLCBkc3QgLSBybGVidWYpOwogICAgICAgIGlmICghcCkKICAgICAgICAgICAgcCA9IHJsZWJ1ZjsKICAgICAgICBzdXJmYWNlLT5tYXAtPmRhdGEgPSBwOwogICAgfQoKICAgIHJldHVybiAoMCk7Cn0KCmludApTRExfUkxFU3VyZmFjZShTRExfU3VyZmFjZSAqIHN1cmZhY2UpCnsKICAgIGludCBmbGFnczsKCiAgICAvKiBDbGVhciBhbnkgcHJldmlvdXMgUkxFIGNvbnZlcnNpb24gKi8KICAgIGlmICgoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfUkxFQUNDRUwpID09IFNETF9STEVBQ0NFTCkgewogICAgICAgIFNETF9VblJMRVN1cmZhY2Uoc3VyZmFjZSwgMSk7CiAgICB9CgogICAgLyogV2UgZG9uJ3Qgc3VwcG9ydCBSTEUgZW5jb2Rpbmcgb2YgYml0bWFwcyAqLwogICAgaWYgKHN1cmZhY2UtPmZvcm1hdC0+Qml0c1BlclBpeGVsIDwgOCkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICAvKiBNYWtlIHN1cmUgdGhlIHBpeGVscyBhcmUgYXZhaWxhYmxlICovCiAgICBpZiAoIXN1cmZhY2UtPnBpeGVscykgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICAvKiBJZiB3ZSBkb24ndCBoYXZlIGNvbG9ya2V5IG9yIGJsZW5kaW5nLCBub3RoaW5nIHRvIGRvLi4uICovCiAgICBmbGFncyA9IHN1cmZhY2UtPm1hcC0+aW5mby5mbGFnczsKICAgIGlmICghKGZsYWdzICYgKFNETF9DT1BZX0NPTE9SS0VZIHwgU0RMX0NPUFlfQkxFTkQpKSkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICAvKiBQYXNzIG9uIGNvbWJpbmF0aW9ucyBub3Qgc3VwcG9ydGVkICovCiAgICBpZiAoKGZsYWdzICYgU0RMX0NPUFlfTU9EVUxBVEVfQ09MT1IpIHx8CiAgICAgICAgKChmbGFncyAmIFNETF9DT1BZX01PRFVMQVRFX0FMUEhBKSAmJiBzdXJmYWNlLT5mb3JtYXQtPkFtYXNrKSB8fAogICAgICAgIChmbGFncyAmIChTRExfQ09QWV9BREQgfCBTRExfQ09QWV9NT0QpKSB8fAogICAgICAgIChmbGFncyAmIFNETF9DT1BZX05FQVJFU1QpKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIC8qIEVuY29kZSBhbmQgc2V0IHVwIHRoZSBibGl0ICovCiAgICBpZiAoIXN1cmZhY2UtPmZvcm1hdC0+QW1hc2sgfHwgIShmbGFncyAmIFNETF9DT1BZX0JMRU5EKSkgewogICAgICAgIGlmICghc3VyZmFjZS0+bWFwLT5pZGVudGl0eSkgewogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgICAgIGlmIChSTEVDb2xvcmtleVN1cmZhY2Uoc3VyZmFjZSkgPCAwKSB7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgc3VyZmFjZS0+bWFwLT5ibGl0ID0gU0RMX1JMRUJsaXQ7CiAgICAgICAgc3VyZmFjZS0+bWFwLT5pbmZvLmZsYWdzIHw9IFNETF9DT1BZX1JMRV9DT0xPUktFWTsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKFJMRUFscGhhU3VyZmFjZShzdXJmYWNlKSA8IDApIHsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICBzdXJmYWNlLT5tYXAtPmJsaXQgPSBTRExfUkxFQWxwaGFCbGl0OwogICAgICAgIHN1cmZhY2UtPm1hcC0+aW5mby5mbGFncyB8PSBTRExfQ09QWV9STEVfQUxQSEFLRVk7CiAgICB9CgogICAgLyogVGhlIHN1cmZhY2UgaXMgbm93IGFjY2VsZXJhdGVkICovCiAgICBzdXJmYWNlLT5mbGFncyB8PSBTRExfUkxFQUNDRUw7CgogICAgcmV0dXJuICgwKTsKfQoKLyoKICogVW4tUkxFIGEgc3VyZmFjZSB3aXRoIHBpeGVsIGFscGhhCiAqIFRoaXMgbWF5IG5vdCBnaXZlIGJhY2sgZXhhY3RseSB0aGUgaW1hZ2UgYmVmb3JlIFJMRS1lbmNvZGluZzsgYWxsCiAqIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQgcGl4ZWxzIHdpbGwgYmUgbG9zdCwgYW5kIGNvbG9yIGFuZCBhbHBoYSBkZXB0aAogKiBtYXkgaGF2ZSBiZWVuIHJlZHVjZWQgKHdoZW4gZW5jb2RpbmcgZm9yIDE2YnBwIHRhcmdldHMpLgogKi8Kc3RhdGljIFNETF9ib29sClVuUkxFQWxwaGEoU0RMX1N1cmZhY2UgKiBzdXJmYWNlKQp7CiAgICBVaW50OCAqc3JjYnVmOwogICAgVWludDMyICpkc3Q7CiAgICBTRExfUGl4ZWxGb3JtYXQgKnNmID0gc3VyZmFjZS0+Zm9ybWF0OwogICAgUkxFRGVzdEZvcm1hdCAqZGYgPSBzdXJmYWNlLT5tYXAtPmRhdGE7CiAgICBpbnQgKCp1bmNvcHlfb3BhcXVlKSAoVWludDMyICosIHZvaWQgKiwgaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgIFJMRURlc3RGb3JtYXQgKiwgU0RMX1BpeGVsRm9ybWF0ICopOwogICAgaW50ICgqdW5jb3B5X3RyYW5zbCkgKFVpbnQzMiAqLCB2b2lkICosIGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICBSTEVEZXN0Rm9ybWF0ICosIFNETF9QaXhlbEZvcm1hdCAqKTsKICAgIGludCB3ID0gc3VyZmFjZS0+dzsKICAgIGludCBicHAgPSBkZi0+Qnl0ZXNQZXJQaXhlbDsKCiAgICBpZiAoYnBwID09IDIpIHsKICAgICAgICB1bmNvcHlfb3BhcXVlID0gdW5jb3B5X29wYXF1ZV8xNjsKICAgICAgICB1bmNvcHlfdHJhbnNsID0gdW5jb3B5X3RyYW5zbF8xNjsKICAgIH0gZWxzZSB7CiAgICAgICAgdW5jb3B5X29wYXF1ZSA9IHVuY29weV90cmFuc2wgPSB1bmNvcHlfMzI7CiAgICB9CgogICAgc3VyZmFjZS0+cGl4ZWxzID0gU0RMX21hbGxvYyhzdXJmYWNlLT5oICogc3VyZmFjZS0+cGl0Y2gpOwogICAgaWYgKCFzdXJmYWNlLT5waXhlbHMpIHsKICAgICAgICByZXR1cm4gKFNETF9GQUxTRSk7CiAgICB9CiAgICAvKiBmaWxsIGJhY2tncm91bmQgd2l0aCB0cmFuc3BhcmVudCBwaXhlbHMgKi8KICAgIFNETF9tZW1zZXQoc3VyZmFjZS0+cGl4ZWxzLCAwLCBzdXJmYWNlLT5oICogc3VyZmFjZS0+cGl0Y2gpOwoKICAgIGRzdCA9IHN1cmZhY2UtPnBpeGVsczsKICAgIHNyY2J1ZiA9IChVaW50OCAqKSAoZGYgKyAxKTsKICAgIGZvciAoOzspIHsKICAgICAgICAvKiBjb3B5IG9wYXF1ZSBwaXhlbHMgKi8KICAgICAgICBpbnQgb2ZzID0gMDsKICAgICAgICBkbyB7CiAgICAgICAgICAgIHVuc2lnbmVkIHJ1bjsKICAgICAgICAgICAgaWYgKGJwcCA9PSAyKSB7CiAgICAgICAgICAgICAgICBvZnMgKz0gc3JjYnVmWzBdOwogICAgICAgICAgICAgICAgcnVuID0gc3JjYnVmWzFdOwogICAgICAgICAgICAgICAgc3JjYnVmICs9IDI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBvZnMgKz0gKChVaW50MTYgKikgc3JjYnVmKVswXTsKICAgICAgICAgICAgICAgIHJ1biA9ICgoVWludDE2ICopIHNyY2J1ZilbMV07CiAgICAgICAgICAgICAgICBzcmNidWYgKz0gNDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocnVuKSB7CiAgICAgICAgICAgICAgICBzcmNidWYgKz0gdW5jb3B5X29wYXF1ZShkc3QgKyBvZnMsIHNyY2J1ZiwgcnVuLCBkZiwgc2YpOwogICAgICAgICAgICAgICAgb2ZzICs9IHJ1bjsKICAgICAgICAgICAgfSBlbHNlIGlmICghb2ZzKQogICAgICAgICAgICAgICAgcmV0dXJuIChTRExfVFJVRSk7CiAgICAgICAgfSB3aGlsZSAob2ZzIDwgdyk7CgogICAgICAgIC8qIHNraXAgcGFkZGluZyBpZiBuZWVkZWQgKi8KICAgICAgICBpZiAoYnBwID09IDIpCiAgICAgICAgICAgIHNyY2J1ZiArPSAodWludHB0cl90KSBzcmNidWYgJiAyOwoKICAgICAgICAvKiBjb3B5IHRyYW5zbHVjZW50IHBpeGVscyAqLwogICAgICAgIG9mcyA9IDA7CiAgICAgICAgZG8gewogICAgICAgICAgICB1bnNpZ25lZCBydW47CiAgICAgICAgICAgIG9mcyArPSAoKFVpbnQxNiAqKSBzcmNidWYpWzBdOwogICAgICAgICAgICBydW4gPSAoKFVpbnQxNiAqKSBzcmNidWYpWzFdOwogICAgICAgICAgICBzcmNidWYgKz0gNDsKICAgICAgICAgICAgaWYgKHJ1bikgewogICAgICAgICAgICAgICAgc3JjYnVmICs9IHVuY29weV90cmFuc2woZHN0ICsgb2ZzLCBzcmNidWYsIHJ1biwgZGYsIHNmKTsKICAgICAgICAgICAgICAgIG9mcyArPSBydW47CiAgICAgICAgICAgIH0KICAgICAgICB9IHdoaWxlIChvZnMgPCB3KTsKICAgICAgICBkc3QgKz0gc3VyZmFjZS0+cGl0Y2ggPj4gMjsKICAgIH0KICAgIC8qIE1ha2UgdGhlIGNvbXBpbGVyIGhhcHB5ICovCiAgICByZXR1cm4gKFNETF9UUlVFKTsKfQoKdm9pZApTRExfVW5STEVTdXJmYWNlKFNETF9TdXJmYWNlICogc3VyZmFjZSwgaW50IHJlY29kZSkKewogICAgaWYgKHN1cmZhY2UtPmZsYWdzICYgU0RMX1JMRUFDQ0VMKSB7CiAgICAgICAgc3VyZmFjZS0+ZmxhZ3MgJj0gflNETF9STEVBQ0NFTDsKCiAgICAgICAgaWYgKHJlY29kZSAmJiAhKHN1cmZhY2UtPmZsYWdzICYgU0RMX1BSRUFMTE9DKSkgewogICAgICAgICAgICBpZiAoc3VyZmFjZS0+bWFwLT5pbmZvLmZsYWdzICYgU0RMX0NPUFlfUkxFX0NPTE9SS0VZKSB7CiAgICAgICAgICAgICAgICBTRExfUmVjdCBmdWxsOwoKICAgICAgICAgICAgICAgIC8qIHJlLWNyZWF0ZSB0aGUgb3JpZ2luYWwgc3VyZmFjZSAqLwogICAgICAgICAgICAgICAgc3VyZmFjZS0+cGl4ZWxzID0gU0RMX21hbGxvYyhzdXJmYWNlLT5oICogc3VyZmFjZS0+cGl0Y2gpOwogICAgICAgICAgICAgICAgaWYgKCFzdXJmYWNlLT5waXhlbHMpIHsKICAgICAgICAgICAgICAgICAgICAvKiBPaCBjcmFwLi4uICovCiAgICAgICAgICAgICAgICAgICAgc3VyZmFjZS0+ZmxhZ3MgfD0gU0RMX1JMRUFDQ0VMOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvKiBmaWxsIGl0IHdpdGggdGhlIGJhY2tncm91bmQgY29sb3IgKi8KICAgICAgICAgICAgICAgIFNETF9GaWxsUmVjdChzdXJmYWNlLCBOVUxMLCBzdXJmYWNlLT5tYXAtPmluZm8uY29sb3JrZXkpOwoKICAgICAgICAgICAgICAgIC8qIG5vdyByZW5kZXIgdGhlIGVuY29kZWQgc3VyZmFjZSAqLwogICAgICAgICAgICAgICAgZnVsbC54ID0gZnVsbC55ID0gMDsKICAgICAgICAgICAgICAgIGZ1bGwudyA9IHN1cmZhY2UtPnc7CiAgICAgICAgICAgICAgICBmdWxsLmggPSBzdXJmYWNlLT5oOwogICAgICAgICAgICAgICAgU0RMX1JMRUJsaXQoc3VyZmFjZSwgJmZ1bGwsIHN1cmZhY2UsICZmdWxsKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICghVW5STEVBbHBoYShzdXJmYWNlKSkgewogICAgICAgICAgICAgICAgICAgIC8qIE9oIGNyYXAuLi4gKi8KICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLT5mbGFncyB8PSBTRExfUkxFQUNDRUw7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHN1cmZhY2UtPm1hcC0+aW5mby5mbGFncyAmPQogICAgICAgICAgICB+KFNETF9DT1BZX1JMRV9DT0xPUktFWSB8IFNETF9DT1BZX1JMRV9BTFBIQUtFWSk7CgogICAgICAgIFNETF9mcmVlKHN1cmZhY2UtPm1hcC0+ZGF0YSk7CiAgICAgICAgc3VyZmFjZS0+bWFwLT5kYXRhID0gTlVMTDsKICAgIH0KfQoKLyogdmk6IHNldCB0cz00IHN3PTQgZXhwYW5kdGFiOiAqLwo=