LyoKICBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxNCBTYW0gTGFudGluZ2EgPHNsb3VrZW5AbGlic2RsLm9yZz4KCiAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCiAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KCiAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCiAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAogIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKCiAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQogICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQogICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCiAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCiAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKi8KI2luY2x1ZGUgIi4uL1NETF9pbnRlcm5hbC5oIgoKLyoKICogUkxFIGVuY29kaW5nIGZvciBzb2Z0d2FyZSBjb2xvcmtleSBhbmQgYWxwaGEtY2hhbm5lbCBhY2NlbGVyYXRpb24KICoKICogT3JpZ2luYWwgdmVyc2lvbiBieSBTYW0gTGFudGluZ2EKICoKICogTWF0dGlhcyBFbmdkZWflcmQgKFlvcmljayk6IFJld3JpdGUuIE5ldyBlbmNvZGluZyBmb3JtYXQsIGVuY29kZXIgYW5kCiAqIGRlY29kZXIuIEFkZGVkIHBlci1zdXJmYWNlIGFscGhhIGJsaXR0ZXIuIEFkZGVkIHBlci1waXhlbCBhbHBoYQogKiBmb3JtYXQsIGVuY29kZXIgYW5kIGJsaXR0ZXIuCiAqCiAqIE1hbnkgdGhhbmtzIHRvIFhhcmsgYW5kIGpvaG5zIGZvciBoaW50cywgYmVuY2htYXJrcyBhbmQgdXNlZnVsIGNvbW1lbnRzCiAqIGxlYWRpbmcgdG8gdGhpcyBjb2RlLgogKgogKiBXZWxjb21lIHRvIE1hY3JvIE1heWhlbS4KICovCgovKgogKiBUaGUgZW5jb2RpbmcgdHJhbnNsYXRlcyB0aGUgaW1hZ2UgZGF0YSB0byBhIHN0cmVhbSBvZiBzZWdtZW50cyBvZiB0aGUgZm9ybQogKgogKiA8c2tpcD4gPHJ1bj4gPGRhdGE+CiAqCiAqIHdoZXJlIDxza2lwPiBpcyB0aGUgbnVtYmVyIG9mIHRyYW5zcGFyZW50IHBpeGVscyB0byBza2lwLAogKiAgICAgICA8cnVuPiAgaXMgdGhlIG51bWJlciBvZiBvcGFxdWUgcGl4ZWxzIHRvIGJsaXQsCiAqIGFuZCAgIDxkYXRhPiBhcmUgdGhlIHBpeGVscyB0aGVtc2VsdmVzLgogKgogKiBUaGlzIGJhc2ljIHN0cnVjdHVyZSBpcyB1c2VkIGJvdGggZm9yIGNvbG9ya2V5ZWQgc3VyZmFjZXMsIHVzZWQgZm9yIHNpbXBsZQogKiBiaW5hcnkgdHJhbnNwYXJlbmN5IGFuZCBmb3IgcGVyLXN1cmZhY2UgYWxwaGEgYmxlbmRpbmcsIGFuZCBmb3Igc3VyZmFjZXMKICogd2l0aCBwZXItcGl4ZWwgYWxwaGEuIFRoZSBkZXRhaWxzIGRpZmZlciwgaG93ZXZlcjoKICoKICogRW5jb2Rpbmcgb2YgY29sb3JrZXllZCBzdXJmYWNlczoKICoKICogICBFbmNvZGVkIHBpeGVscyBhbHdheXMgaGF2ZSB0aGUgc2FtZSBmb3JtYXQgYXMgdGhlIHRhcmdldCBzdXJmYWNlLgogKiAgIDxza2lwPiBhbmQgPHJ1bj4gYXJlIHVuc2lnbmVkIDggYml0IGludGVnZXJzLCBleGNlcHQgZm9yIDMyIGJpdCBkZXB0aAogKiAgIHdoZXJlIHRoZXkgYXJlIDE2IGJpdC4gVGhpcyBtYWtlcyB0aGUgcGl4ZWwgZGF0YSBhbGlnbmVkIGF0IGFsbCB0aW1lcy4KICogICBTZWdtZW50cyBuZXZlciB3cmFwIGFyb3VuZCBmcm9tIG9uZSBzY2FuIGxpbmUgdG8gdGhlIG5leHQuCiAqCiAqICAgVGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UgaXMgbWFya2VkIGJ5IGEgemVybyA8c2tpcD4sPHJ1bj4gcGFpciBhdCB0aGUgKgogKiAgIGJlZ2lubmluZyBvZiBhIGxpbmUuCiAqCiAqIEVuY29kaW5nIG9mIHN1cmZhY2VzIHdpdGggcGVyLXBpeGVsIGFscGhhOgogKgogKiAgIFRoZSBzZXF1ZW5jZSBiZWdpbnMgd2l0aCBhIHN0cnVjdCBSTEVEZXN0Rm9ybWF0IGRlc2NyaWJpbmcgdGhlIHRhcmdldAogKiAgIHBpeGVsIGZvcm1hdCwgdG8gcHJvdmlkZSByZWxpYWJsZSB1bi1lbmNvZGluZy4KICoKICogICBFYWNoIHNjYW4gbGluZSBpcyBlbmNvZGVkIHR3aWNlOiBGaXJzdCBhbGwgY29tcGxldGVseSBvcGFxdWUgcGl4ZWxzLAogKiAgIGVuY29kZWQgaW4gdGhlIHRhcmdldCBmb3JtYXQgYXMgZGVzY3JpYmVkIGFib3ZlLCBhbmQgdGhlbiBhbGwKICogICBwYXJ0aWFsbHkgdHJhbnNwYXJlbnQgKHRyYW5zbHVjZW50KSBwaXhlbHMgKHdoZXJlIDEgPD0gYWxwaGEgPD0gMjU0KSwKICogICBpbiB0aGUgZm9sbG93aW5nIDMyLWJpdCBmb3JtYXQ6CiAqCiAqICAgRm9yIDMyLWJpdCB0YXJnZXRzLCBlYWNoIHBpeGVsIGhhcyB0aGUgdGFyZ2V0IFJHQiBmb3JtYXQgYnV0IHdpdGgKICogICB0aGUgYWxwaGEgdmFsdWUgb2NjdXB5aW5nIHRoZSBoaWdoZXN0IDggYml0cy4gVGhlIDxza2lwPiBhbmQgPHJ1bj4KICogICBjb3VudHMgYXJlIDE2IGJpdC4KICoKICogICBGb3IgMTYtYml0IHRhcmdldHMsIGVhY2ggcGl4ZWwgaGFzIHRoZSB0YXJnZXQgUkdCIGZvcm1hdCwgYnV0IHdpdGgKICogICB0aGUgbWlkZGxlIGNvbXBvbmVudCAodXN1YWxseSBncmVlbikgc2hpZnRlZCAxNiBzdGVwcyB0byB0aGUgbGVmdCwKICogICBhbmQgdGhlIGhvbGUgZmlsbGVkIHdpdGggdGhlIDUgbW9zdCBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSBhbHBoYSB2YWx1ZS4KICogICBpLmUuIGlmIHRoZSB0YXJnZXQgaGFzIHRoZSBmb3JtYXQgICAgICAgICBycnJycmdnZ2dnZ2JiYmJiLAogKiAgIHRoZSBlbmNvZGVkIHBpeGVsIHdpbGwgYmUgMDAwMDBnZ2dnZ2cwMDAwMHJycnJyMGFhYWFhYmJiYmIuCiAqICAgVGhlIDxza2lwPiBhbmQgPHJ1bj4gY291bnRzIGFyZSA4IGJpdCBmb3IgdGhlIG9wYXF1ZSBsaW5lcywgMTYgYml0CiAqICAgZm9yIHRoZSB0cmFuc2x1Y2VudCBsaW5lcy4gVHdvIHBhZGRpbmcgYnl0ZXMgbWF5IGJlIGluc2VydGVkCiAqICAgYmVmb3JlIGVhY2ggdHJhbnNsdWNlbnQgbGluZSB0byBrZWVwIHRoZW0gMzItYml0IGFsaWduZWQuCiAqCiAqICAgVGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UgaXMgbWFya2VkIGJ5IGEgemVybyA8c2tpcD4sPHJ1bj4gcGFpciBhdCB0aGUKICogICBiZWdpbm5pbmcgb2YgYW4gb3BhcXVlIGxpbmUuCiAqLwoKI2luY2x1ZGUgIlNETF92aWRlby5oIgojaW5jbHVkZSAiU0RMX3N5c3ZpZGVvLmgiCiNpbmNsdWRlICJTRExfYmxpdC5oIgojaW5jbHVkZSAiU0RMX1JMRWFjY2VsX2MuaCIKCiNpZm5kZWYgTUFYCiNkZWZpbmUgTUFYKGEsIGIpICgoYSkgPiAoYikgPyAoYSkgOiAoYikpCiNlbmRpZgojaWZuZGVmIE1JTgojZGVmaW5lIE1JTihhLCBiKSAoKGEpIDwgKGIpID8gKGEpIDogKGIpKQojZW5kaWYKCiNkZWZpbmUgUElYRUxfQ09QWSh0bywgZnJvbSwgbGVuLCBicHApICAgICAgICAgIFwKICAgIFNETF9tZW1jcHkodG8sIGZyb20sIChzaXplX3QpKGxlbikgKiAoYnBwKSkKCi8qCiAqIFZhcmlvdXMgY29sb3JrZXkgYmxpdCBtZXRob2RzLCBmb3Igb3BhcXVlIGFuZCBwZXItc3VyZmFjZSBhbHBoYQogKi8KCiNkZWZpbmUgT1BBUVVFX0JMSVQodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSkgICBcCiAgICBQSVhFTF9DT1BZKHRvLCBmcm9tLCBsZW5ndGgsIGJwcCkKCi8qCiAqIEZvciAzMmJwcCBwaXhlbHMgb24gdGhlIGZvcm0gMHgwMHJyZ2diYjoKICogSWYgd2UgdHJlYXQgdGhlIG1pZGRsZSBjb21wb25lbnQgc2VwYXJhdGVseSwgd2UgY2FuIHByb2Nlc3MgdGhlIHR3bwogKiByZW1haW5pbmcgaW4gcGFyYWxsZWwuIFRoaXMgaXMgc2FmZSB0byBkbyBiZWNhdXNlIG9mIHRoZSBnYXAgdG8gdGhlIGxlZnQKICogb2YgZWFjaCBjb21wb25lbnQsIHNvIHRoZSBiaXRzIGZyb20gdGhlIG11bHRpcGxpY2F0aW9uIGRvbid0IGNvbGxpZGUuCiAqIFRoaXMgY2FuIGJlIHVzZWQgZm9yIGFueSBSR0IgcGVybXV0YXRpb24gb2YgY291cnNlLgogKi8KI2RlZmluZSBBTFBIQV9CTElUMzJfODg4KHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEpICAgICAgXAogICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBVaW50MzIgKnNyYyA9IChVaW50MzIgKikoZnJvbSk7ICAgICAgICAgICAgIFwKICAgIFVpbnQzMiAqZHN0ID0gKFVpbnQzMiAqKSh0byk7ICAgICAgICAgICAgICAgXAogICAgZm9yKGkgPSAwOyBpIDwgKGludCkobGVuZ3RoKTsgaSsrKSB7ICAgICAgICAgICAgXAogICAgICAgIFVpbnQzMiBzID0gKnNyYysrOyAgICAgICAgICAgICAgICAgIFwKICAgICAgICBVaW50MzIgZCA9ICpkc3Q7ICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDMyIHMxID0gcyAmIDB4ZmYwMGZmOyAgICAgICAgICAgICAgIFwKICAgICAgICBVaW50MzIgZDEgPSBkICYgMHhmZjAwZmY7ICAgICAgICAgICAgICAgXAogICAgICAgIGQxID0gKGQxICsgKChzMSAtIGQxKSAqIGFscGhhID4+IDgpKSAmIDB4ZmYwMGZmOyAgICBcCiAgICAgICAgcyAmPSAweGZmMDA7ICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZCAmPSAweGZmMDA7ICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZCA9IChkICsgKChzIC0gZCkgKiBhbHBoYSA+PiA4KSkgJiAweGZmMDA7ICAgICAgXAogICAgICAgICpkc3QrKyA9IGQxIHwgZDsgICAgICAgICAgICAgICAgICAgIFwKICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICB9IHdoaWxlKDApCgovKgogKiBGb3IgMTZicHAgcGl4ZWxzIHdlIGNhbiBnbyBhIHN0ZXAgZnVydGhlcjogcHV0IHRoZSBtaWRkbGUgY29tcG9uZW50CiAqIGluIHRoZSBoaWdoIDE2IGJpdHMgb2YgYSAzMiBiaXQgd29yZCwgYW5kIHByb2Nlc3MgYWxsIHRocmVlIFJHQgogKiBjb21wb25lbnRzIGF0IHRoZSBzYW1lIHRpbWUuIFNpbmNlIHRoZSBzbWFsbGVzdCBnYXAgaXMgaGVyZSBqdXN0CiAqIDUgYml0cywgd2UgaGF2ZSB0byBzY2FsZSBhbHBoYSBkb3duIHRvIDUgYml0cyBhcyB3ZWxsLgogKi8KI2RlZmluZSBBTFBIQV9CTElUMTZfNTY1KHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEpICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICBcCiAgICBVaW50MTYgKnNyYyA9IChVaW50MTYgKikoZnJvbSk7ICAgICAgICAgXAogICAgVWludDE2ICpkc3QgPSAoVWludDE2ICopKHRvKTsgICAgICAgICAgIFwKICAgIFVpbnQzMiBBTFBIQSA9IGFscGhhID4+IDM7ICAgICAgICAgIFwKICAgIGZvcihpID0gMDsgaSA8IChpbnQpKGxlbmd0aCk7IGkrKykgeyAgICAgICAgXAogICAgICAgIFVpbnQzMiBzID0gKnNyYysrOyAgICAgICAgICAgICAgXAogICAgICAgIFVpbnQzMiBkID0gKmRzdDsgICAgICAgICAgICAgICAgXAogICAgICAgIHMgPSAocyB8IHMgPDwgMTYpICYgMHgwN2UwZjgxZjsgICAgIFwKICAgICAgICBkID0gKGQgfCBkIDw8IDE2KSAmIDB4MDdlMGY4MWY7ICAgICBcCiAgICAgICAgZCArPSAocyAtIGQpICogQUxQSEEgPj4gNTsgICAgICAgICAgXAogICAgICAgIGQgJj0gMHgwN2UwZjgxZjsgICAgICAgICAgICAgICAgXAogICAgICAgICpkc3QrKyA9IChVaW50MTYpKGQgfCBkID4+IDE2KTsgICAgICAgICBcCiAgICB9ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICB9IHdoaWxlKDApCgojZGVmaW5lIEFMUEhBX0JMSVQxNl81NTUodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSkgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgIFwKICAgIFVpbnQxNiAqc3JjID0gKFVpbnQxNiAqKShmcm9tKTsgICAgICAgICBcCiAgICBVaW50MTYgKmRzdCA9IChVaW50MTYgKikodG8pOyAgICAgICAgICAgXAogICAgVWludDMyIEFMUEhBID0gYWxwaGEgPj4gMzsgICAgICAgICAgXAogICAgZm9yKGkgPSAwOyBpIDwgKGludCkobGVuZ3RoKTsgaSsrKSB7ICAgICAgICBcCiAgICAgICAgVWludDMyIHMgPSAqc3JjKys7ICAgICAgICAgICAgICBcCiAgICAgICAgVWludDMyIGQgPSAqZHN0OyAgICAgICAgICAgICAgICBcCiAgICAgICAgcyA9IChzIHwgcyA8PCAxNikgJiAweDAzZTA3YzFmOyAgICAgXAogICAgICAgIGQgPSAoZCB8IGQgPDwgMTYpICYgMHgwM2UwN2MxZjsgICAgIFwKICAgICAgICBkICs9IChzIC0gZCkgKiBBTFBIQSA+PiA1OyAgICAgICAgICBcCiAgICAgICAgZCAmPSAweDAzZTA3YzFmOyAgICAgICAgICAgICAgICBcCiAgICAgICAgKmRzdCsrID0gKFVpbnQxNikoZCB8IGQgPj4gMTYpOyAgICAgICAgIFwKICAgIH0gICAgICAgICAgICAgICAgICAgICAgIFwKICAgIH0gd2hpbGUoMCkKCi8qCiAqIFRoZSBnZW5lcmFsIHNsb3cgY2F0Y2gtYWxsIGZ1bmN0aW9uLCBmb3IgcmVtYWluaW5nIGRlcHRocyBhbmQgZm9ybWF0cwogKi8KI2RlZmluZSBBTFBIQV9CTElUX0FOWSh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhKSAgICAgICAgICAgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBVaW50OCAqc3JjID0gZnJvbTsgICAgICAgICAgICAgICAgICAgICAgXAogICAgVWludDggKmRzdCA9IHRvOyAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIGZvcihpID0gMDsgaSA8IChpbnQpKGxlbmd0aCk7IGkrKykgeyAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDMyIHMsIGQ7ICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIHVuc2lnbmVkIHJzLCBncywgYnMsIHJkLCBnZCwgYmQ7ICAgICAgICAgICAgICAgIFwKICAgICAgICBzd2l0Y2goYnBwKSB7ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgY2FzZSAyOiAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgcyA9ICooVWludDE2ICopc3JjOyAgICAgICAgICAgICAgICAgXAogICAgICAgIGQgPSAqKFVpbnQxNiAqKWRzdDsgICAgICAgICAgICAgICAgIFwKICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpZihTRExfQllURU9SREVSID09IFNETF9CSUdfRU5ESUFOKSB7ICAgICAgICAgICBcCiAgICAgICAgICAgIHMgPSAoc3JjWzBdIDw8IDE2KSB8IChzcmNbMV0gPDwgOCkgfCBzcmNbMl07ICAgIFwKICAgICAgICAgICAgZCA9IChkc3RbMF0gPDwgMTYpIHwgKGRzdFsxXSA8PCA4KSB8IGRzdFsyXTsgICAgXAogICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBzID0gKHNyY1syXSA8PCAxNikgfCAoc3JjWzFdIDw8IDgpIHwgc3JjWzBdOyAgICBcCiAgICAgICAgICAgIGQgPSAoZHN0WzJdIDw8IDE2KSB8IChkc3RbMV0gPDwgOCkgfCBkc3RbMF07ICAgIFwKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGNhc2UgNDogICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIHMgPSAqKFVpbnQzMiAqKXNyYzsgICAgICAgICAgICAgICAgIFwKICAgICAgICBkID0gKihVaW50MzIgKilkc3Q7ICAgICAgICAgICAgICAgICBcCiAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgUkdCX0ZST01fUElYRUwocywgZm10LCBycywgZ3MsIGJzKTsgICAgICAgICAgICAgXAogICAgICAgIFJHQl9GUk9NX1BJWEVMKGQsIGZtdCwgcmQsIGdkLCBiZCk7ICAgICAgICAgICAgIFwKICAgICAgICByZCArPSAocnMgLSByZCkgKiBhbHBoYSA+PiA4OyAgICAgICAgICAgICAgIFwKICAgICAgICBnZCArPSAoZ3MgLSBnZCkgKiBhbHBoYSA+PiA4OyAgICAgICAgICAgICAgIFwKICAgICAgICBiZCArPSAoYnMgLSBiZCkgKiBhbHBoYSA+PiA4OyAgICAgICAgICAgICAgIFwKICAgICAgICBQSVhFTF9GUk9NX1JHQihkLCBmbXQsIHJkLCBnZCwgYmQpOyAgICAgICAgICAgICBcCiAgICAgICAgc3dpdGNoKGJwcCkgeyAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICooVWludDE2ICopZHN0ID0gKFVpbnQxNilkOyAgICAgICAgICAgICAgICAgXAogICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGlmKFNETF9CWVRFT1JERVIgPT0gU0RMX0JJR19FTkRJQU4pIHsgICAgICAgICAgIFwKICAgICAgICAgICAgZHN0WzBdID0gKFVpbnQ4KShkID4+IDE2KTsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGRzdFsxXSA9IChVaW50OCkoZCA+PiA4KTsgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBkc3RbMl0gPSAoVWludDgpKGQpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgZHN0WzBdID0gKFVpbnQ4KWQ7ICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgZHN0WzFdID0gKFVpbnQ4KShkID4+IDgpOyAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGRzdFsyXSA9IChVaW50OCkoZCA+PiAxNik7ICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgY2FzZSA0OiAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgKihVaW50MzIgKilkc3QgPSBkOyAgICAgICAgICAgICAgICAgXAogICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIHNyYyArPSBicHA7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBkc3QgKz0gYnBwOyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIH0gd2hpbGUoMCkKCi8qCiAqIFNwZWNpYWwgY2FzZTogNTAlIGFscGhhIChhbHBoYT0xMjgpCiAqIFRoaXMgaXMgdHJlYXRlZCBzcGVjaWFsbHkgYmVjYXVzZSBpdCBjYW4gYmUgb3B0aW1pemVkIHZlcnkgd2VsbCwgYW5kCiAqIHNpbmNlIGl0IGlzIGdvb2QgZm9yIG1hbnkgY2FzZXMgb2Ygc2VtaS10cmFuc2x1Y2VuY3kuCiAqIFRoZSB0aGVvcnkgaXMgdG8gZG8gYWxsIHRocmVlIGNvbXBvbmVudHMgYXQgdGhlIHNhbWUgdGltZToKICogRmlyc3QgemVybyB0aGUgbG93ZXN0IGJpdCBvZiBlYWNoIGNvbXBvbmVudCwgd2hpY2ggZ2l2ZXMgdXMgcm9vbSB0bwogKiBhZGQgdGhlbS4gVGhlbiBzaGlmdCByaWdodCBhbmQgYWRkIHRoZSBzdW0gb2YgdGhlIGxvd2VzdCBiaXRzLgogKi8KI2RlZmluZSBBTFBIQV9CTElUMzJfODg4XzUwKHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEpICAgICAgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBVaW50MzIgKnNyYyA9IChVaW50MzIgKikoZnJvbSk7ICAgICAgICAgICAgICAgICBcCiAgICBVaW50MzIgKmRzdCA9IChVaW50MzIgKikodG8pOyAgICAgICAgICAgICAgICAgICBcCiAgICBmb3IoaSA9IDA7IGkgPCAoaW50KShsZW5ndGgpOyBpKyspIHsgICAgICAgICAgICAgICAgXAogICAgICAgIFVpbnQzMiBzID0gKnNyYysrOyAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDMyIGQgPSAqZHN0OyAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAqZHN0KysgPSAoKChzICYgMHgwMGZlZmVmZSkgKyAoZCAmIDB4MDBmZWZlZmUpKSA+PiAxKSAgIFwKICAgICAgICAgICAgICsgKHMgJiBkICYgMHgwMDAxMDEwMSk7ICAgICAgICAgICAgICAgIFwKICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgfSB3aGlsZSgwKQoKLyoKICogRm9yIDE2YnBwLCB3ZSBjYW4gYWN0dWFsbHkgYmxlbmQgdHdvIHBpeGVscyBpbiBwYXJhbGxlbCwgaWYgd2UgdGFrZQogKiBjYXJlIHRvIHNoaWZ0IGJlZm9yZSB3ZSBhZGQsIG5vdCBhZnRlci4KICovCgovKiBoZWxwZXI6IGJsZW5kIGEgc2luZ2xlIDE2IGJpdCBwaXhlbCBhdCA1MCUgKi8KI2RlZmluZSBCTEVORDE2XzUwKGRzdCwgc3JjLCBtYXNrKSAgICAgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgVWludDMyIHMgPSAqc3JjKys7ICAgICAgICAgICAgICBcCiAgICBVaW50MzIgZCA9ICpkc3Q7ICAgICAgICAgICAgICAgIFwKICAgICpkc3QrKyA9IChVaW50MTYpKCgoKHMgJiBtYXNrKSArIChkICYgbWFzaykpID4+IDEpICsgICAgXAogICAgICAgICAgICAgICAgICAgICAgKHMgJiBkICYgKH5tYXNrICYgMHhmZmZmKSkpOyAgICAgIFwKICAgIH0gd2hpbGUoMCkKCi8qIGJhc2ljIDE2YnBwIGJsZW5kZXIuIG1hc2sgaXMgdGhlIHBpeGVscyB0byBrZWVwIHdoZW4gYWRkaW5nLiAqLwojZGVmaW5lIEFMUEhBX0JMSVQxNl81MCh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhLCBtYXNrKSAgICAgXAogICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgdW5zaWduZWQgbiA9IChsZW5ndGgpOyAgICAgICAgICAgICAgICAgICAgICBcCiAgICBVaW50MTYgKnNyYyA9IChVaW50MTYgKikoZnJvbSk7ICAgICAgICAgICAgICAgICBcCiAgICBVaW50MTYgKmRzdCA9IChVaW50MTYgKikodG8pOyAgICAgICAgICAgICAgICAgICBcCiAgICBpZigoKHVpbnRwdHJfdClzcmMgXiAodWludHB0cl90KWRzdCkgJiAzKSB7ICAgICAgICAgXAogICAgICAgIC8qIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gbm90IGluIHBoYXNlLCBibGl0IG9uZSBieSBvbmUgKi8gIFwKICAgICAgICB3aGlsZShuLS0pICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgQkxFTkQxNl81MChkc3QsIHNyYywgbWFzayk7ICAgICAgICAgICAgIFwKICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpZigodWludHB0cl90KXNyYyAmIDMpIHsgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAvKiBmaXJzdCBvZGQgcGl4ZWwgKi8gICAgICAgICAgICAgICAgICAgXAogICAgICAgIEJMRU5EMTZfNTAoZHN0LCBzcmMsIG1hc2spOyAgICAgICAgICAgICBcCiAgICAgICAgbi0tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZm9yKDsgbiA+IDE7IG4gLT0gMikgeyAgICAgICAgICAgICAgICAgIFwKICAgICAgICBVaW50MzIgcyA9ICooVWludDMyICopc3JjOyAgICAgICAgICAgICAgXAogICAgICAgIFVpbnQzMiBkID0gKihVaW50MzIgKilkc3Q7ICAgICAgICAgICAgICBcCiAgICAgICAgKihVaW50MzIgKilkc3QgPSAoKHMgJiAobWFzayB8IG1hc2sgPDwgMTYpKSA+PiAxKSAgIFwKICAgICAgICAgICAgICAgICAgICAgICArICgoZCAmIChtYXNrIHwgbWFzayA8PCAxNikpID4+IDEpICAgXAogICAgICAgICAgICAgICAgICAgICAgICsgKHMgJiBkICYgKH4obWFzayB8IG1hc2sgPDwgMTYpKSk7ICBcCiAgICAgICAgc3JjICs9IDI7ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZHN0ICs9IDI7ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaWYobikgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgQkxFTkQxNl81MChkc3QsIHNyYywgbWFzayk7IC8qIGxhc3Qgb2RkIHBpeGVsICovICAgIFwKICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgfSB3aGlsZSgwKQoKI2RlZmluZSBBTFBIQV9CTElUMTZfNTY1XzUwKHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEpICAgXAogICAgQUxQSEFfQkxJVDE2XzUwKHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEsIDB4ZjdkZSkKCiNkZWZpbmUgQUxQSEFfQkxJVDE2XzU1NV81MCh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhKSAgIFwKICAgIEFMUEhBX0JMSVQxNl81MCh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhLCAweGZiZGUpCgojZGVmaW5lIENIT09TRV9CTElUKGJsaXR0ZXIsIGFscGhhLCBmbXQpICAgICAgICAgICAgICAgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpZihhbHBoYSA9PSAyNTUpIHsgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIHN3aXRjaChmbXQtPkJ5dGVzUGVyUGl4ZWwpIHsgICAgICAgICAgICAgICAgXAogICAgICAgIGNhc2UgMTogYmxpdHRlcigxLCBVaW50OCwgT1BBUVVFX0JMSVQpOyBicmVhazsgICAgICBcCiAgICAgICAgY2FzZSAyOiBibGl0dGVyKDIsIFVpbnQ4LCBPUEFRVUVfQkxJVCk7IGJyZWFrOyAgICAgIFwKICAgICAgICBjYXNlIDM6IGJsaXR0ZXIoMywgVWludDgsIE9QQVFVRV9CTElUKTsgYnJlYWs7ICAgICAgXAogICAgICAgIGNhc2UgNDogYmxpdHRlcig0LCBVaW50MTYsIE9QQVFVRV9CTElUKTsgYnJlYWs7ICAgICBcCiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgc3dpdGNoKGZtdC0+Qnl0ZXNQZXJQaXhlbCkgeyAgICAgICAgICAgICAgICBcCiAgICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgLyogTm8gOGJwcCBhbHBoYSBibGl0dGluZyAqLyAgICAgICAgICAgICAgICBcCiAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBzd2l0Y2goZm10LT5SbWFzayB8IGZtdC0+R21hc2sgfCBmbXQtPkJtYXNrKSB7ICAgICAgXAogICAgICAgIGNhc2UgMHhmZmZmOiAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaWYoZm10LT5HbWFzayA9PSAweDA3ZTAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICB8fCBmbXQtPlJtYXNrID09IDB4MDdlMCAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICB8fCBmbXQtPkJtYXNrID09IDB4MDdlMCkgeyAgICAgICAgICAgXAogICAgICAgICAgICBpZihhbHBoYSA9PSAxMjgpICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGJsaXR0ZXIoMiwgVWludDgsIEFMUEhBX0JMSVQxNl81NjVfNTApOyBcCiAgICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBibGl0dGVyKDIsIFVpbnQ4LCBBTFBIQV9CTElUMTZfNTY1KTsgICAgXAogICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gZWxzZSAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGdvdG8gZ2VuZXJhbDE2OyAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgY2FzZSAweDdmZmY6ICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpZihmbXQtPkdtYXNrID09IDB4MDNlMCAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgIHx8IGZtdC0+Um1hc2sgPT0gMHgwM2UwICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgIHx8IGZtdC0+Qm1hc2sgPT0gMHgwM2UwKSB7ICAgICAgICAgICBcCiAgICAgICAgICAgIGlmKGFscGhhID09IDEyOCkgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgYmxpdHRlcigyLCBVaW50OCwgQUxQSEFfQkxJVDE2XzU1NV81MCk7IFwKICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGJsaXR0ZXIoMiwgVWludDgsIEFMUEhBX0JMSVQxNl81NTUpOyAgICBcCiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgLyogZmFsbHRocm91Z2ggKi8gICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZ2VuZXJhbDE2OiAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGJsaXR0ZXIoMiwgVWludDgsIEFMUEhBX0JMSVRfQU5ZKTsgICAgICAgICAgXAogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBibGl0dGVyKDMsIFVpbnQ4LCBBTFBIQV9CTElUX0FOWSk7ICAgICAgICAgIFwKICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGNhc2UgNDogICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGlmKChmbXQtPlJtYXNrIHwgZm10LT5HbWFzayB8IGZtdC0+Qm1hc2spID09IDB4MDBmZmZmZmYgXAogICAgICAgICAgICYmIChmbXQtPkdtYXNrID09IDB4ZmYwMCB8fCBmbXQtPlJtYXNrID09IDB4ZmYwMCBcCiAgICAgICAgICAgICAgIHx8IGZtdC0+Qm1hc2sgPT0gMHhmZjAwKSkgeyAgICAgICAgICBcCiAgICAgICAgICAgIGlmKGFscGhhID09IDEyOCkgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgYmxpdHRlcig0LCBVaW50MTYsIEFMUEhBX0JMSVQzMl84ODhfNTApOyAgICBcCiAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGJsaXR0ZXIoNCwgVWludDE2LCBBTFBIQV9CTElUMzJfODg4KTsgICAgICAgXAogICAgICAgIH0gZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBibGl0dGVyKDQsIFVpbnQxNiwgQUxQSEFfQkxJVF9BTlkpOyAgICAgICAgIFwKICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgfSB3aGlsZSgwKQoKLyoKICogVGhpcyB0YWtlcyBjYXJlIG9mIHRoZSBjYXNlIHdoZW4gdGhlIHN1cmZhY2UgaXMgY2xpcHBlZCBvbiB0aGUgbGVmdCBhbmQvb3IKICogcmlnaHQuIFRvcCBjbGlwcGluZyBoYXMgYWxyZWFkeSBiZWVuIHRha2VuIGNhcmUgb2YuCiAqLwpzdGF0aWMgdm9pZApSTEVDbGlwQmxpdChpbnQgdywgVWludDggKiBzcmNidWYsIFNETF9TdXJmYWNlICogZHN0LAogICAgICAgICAgICBVaW50OCAqIGRzdGJ1ZiwgU0RMX1JlY3QgKiBzcmNyZWN0LCB1bnNpZ25lZCBhbHBoYSkKewogICAgU0RMX1BpeGVsRm9ybWF0ICpmbXQgPSBkc3QtPmZvcm1hdDsKCiNkZWZpbmUgUkxFQ0xJUEJMSVQoYnBwLCBUeXBlLCBkb19ibGl0KSAgICAgICAgICAgICAgICAgICAgXAogICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgaW50IGxpbmVjb3VudCA9IHNyY3JlY3QtPmg7ICAgICAgICAgICAgICAgICAgICBcCiAgICBpbnQgb2ZzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgaW50IGxlZnQgPSBzcmNyZWN0LT54OyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBpbnQgcmlnaHQgPSBsZWZ0ICsgc3JjcmVjdC0+dzsgICAgICAgICAgICAgICAgICAgICBcCiAgICBkc3RidWYgLT0gbGVmdCAqIGJwcDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIGZvcig7OykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpbnQgcnVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgb2ZzICs9ICooVHlwZSAqKXNyY2J1ZjsgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBydW4gPSAoKFR5cGUgKilzcmNidWYpWzFdOyAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBzcmNidWYgKz0gMiAqIHNpemVvZihUeXBlKTsgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpZihydW4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgLyogY2xpcCB0byBsZWZ0IGFuZCByaWdodCBib3JkZXJzICovICAgICAgICAgICAgICAgXAogICAgICAgIGlmKG9mcyA8IHJpZ2h0KSB7ICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaW50IHN0YXJ0ID0gMDsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGludCBsZW4gPSBydW47ICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpbnQgc3RhcnRjb2w7ICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaWYobGVmdCAtIG9mcyA+IDApIHsgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBzdGFydCA9IGxlZnQgLSBvZnM7ICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgbGVuIC09IHN0YXJ0OyAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGlmKGxlbiA8PSAwKSAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgZ290byBub2NvcHkgIyMgYnBwICMjIGRvX2JsaXQ7ICAgICAgICAgXAogICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBzdGFydGNvbCA9IG9mcyArIHN0YXJ0OyAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGlmKGxlbiA+IHJpZ2h0IC0gc3RhcnRjb2wpICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGxlbiA9IHJpZ2h0IC0gc3RhcnRjb2w7ICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgZG9fYmxpdChkc3RidWYgKyBzdGFydGNvbCAqIGJwcCwgc3JjYnVmICsgc3RhcnQgKiBicHAsIFwKICAgICAgICAgICAgICAgIGxlbiwgYnBwLCBhbHBoYSk7ICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgbm9jb3B5ICMjIGJwcCAjIyBkb19ibGl0OiAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgc3JjYnVmICs9IHJ1biAqIGJwcDsgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBvZnMgKz0gcnVuOyAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9IGVsc2UgaWYoIW9mcykgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaWYob2ZzID09IHcpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIG9mcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGRzdGJ1ZiArPSBkc3QtPnBpdGNoOyAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaWYoIS0tbGluZWNvdW50KSAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICB9IHdoaWxlKDApCgogICAgQ0hPT1NFX0JMSVQoUkxFQ0xJUEJMSVQsIGFscGhhLCBmbXQpOwoKI3VuZGVmIFJMRUNMSVBCTElUCgp9CgoKLyogYmxpdCBhIGNvbG9ya2V5ZWQgUkxFIHN1cmZhY2UgKi8KaW50ClNETF9STEVCbGl0KFNETF9TdXJmYWNlICogc3JjLCBTRExfUmVjdCAqIHNyY3JlY3QsCiAgICAgICAgICAgIFNETF9TdXJmYWNlICogZHN0LCBTRExfUmVjdCAqIGRzdHJlY3QpCnsKICAgIFVpbnQ4ICpkc3RidWY7CiAgICBVaW50OCAqc3JjYnVmOwogICAgaW50IHgsIHk7CiAgICBpbnQgdyA9IHNyYy0+dzsKICAgIHVuc2lnbmVkIGFscGhhOwoKICAgIC8qIExvY2sgdGhlIGRlc3RpbmF0aW9uIGlmIG5lY2Vzc2FyeSAqLwogICAgaWYgKFNETF9NVVNUTE9DSyhkc3QpKSB7CiAgICAgICAgaWYgKFNETF9Mb2NrU3VyZmFjZShkc3QpIDwgMCkgewogICAgICAgICAgICByZXR1cm4gKC0xKTsKICAgICAgICB9CiAgICB9CgogICAgLyogU2V0IHVwIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHBvaW50ZXJzICovCiAgICB4ID0gZHN0cmVjdC0+eDsKICAgIHkgPSBkc3RyZWN0LT55OwogICAgZHN0YnVmID0gKFVpbnQ4ICopIGRzdC0+cGl4ZWxzCiAgICAgICAgKyB5ICogZHN0LT5waXRjaCArIHggKiBzcmMtPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbDsKICAgIHNyY2J1ZiA9IChVaW50OCAqKSBzcmMtPm1hcC0+ZGF0YTsKCiAgICB7CiAgICAgICAgLyogc2tpcCBsaW5lcyBhdCB0aGUgdG9wIGlmIG5lY2Vzc2FyeSAqLwogICAgICAgIGludCB2c2tpcCA9IHNyY3JlY3QtPnk7CiAgICAgICAgaW50IG9mcyA9IDA7CiAgICAgICAgaWYgKHZza2lwKSB7CgojZGVmaW5lIFJMRVNLSVAoYnBwLCBUeXBlKSAgICAgICAgICBcCiAgICAgICAgZm9yKDs7KSB7ICAgICAgICAgICBcCiAgICAgICAgICAgIGludCBydW47ICAgICAgICAgICAgXAogICAgICAgICAgICBvZnMgKz0gKihUeXBlICopc3JjYnVmOyBcCiAgICAgICAgICAgIHJ1biA9ICgoVHlwZSAqKXNyY2J1ZilbMV07ICBcCiAgICAgICAgICAgIHNyY2J1ZiArPSBzaXplb2YoVHlwZSkgKiAyOyBcCiAgICAgICAgICAgIGlmKHJ1bikgeyAgICAgICAgICAgXAogICAgICAgICAgICBzcmNidWYgKz0gcnVuICogYnBwOyAgICBcCiAgICAgICAgICAgIG9mcyArPSBydW47ICAgICBcCiAgICAgICAgICAgIH0gZWxzZSBpZighb2ZzKSAgICAgXAogICAgICAgICAgICBnb3RvIGRvbmU7ICAgICAgXAogICAgICAgICAgICBpZihvZnMgPT0gdykgeyAgICAgIFwKICAgICAgICAgICAgb2ZzID0gMDsgICAgICAgIFwKICAgICAgICAgICAgaWYoIS0tdnNraXApICAgICAgICBcCiAgICAgICAgICAgICAgICBicmVhazsgICAgICBcCiAgICAgICAgICAgIH0gICAgICAgICAgICAgICBcCiAgICAgICAgfQoKICAgICAgICAgICAgc3dpdGNoIChzcmMtPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCkgewogICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICBSTEVTS0lQKDEsIFVpbnQ4KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICBSTEVTS0lQKDIsIFVpbnQ4KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICBSTEVTS0lQKDMsIFVpbnQ4KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICBSTEVTS0lQKDQsIFVpbnQxNik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKI3VuZGVmIFJMRVNLSVAKCiAgICAgICAgfQogICAgfQoKICAgIGFscGhhID0gc3JjLT5tYXAtPmluZm8uYTsKICAgIC8qIGlmIGxlZnQgb3IgcmlnaHQgZWRnZSBjbGlwcGluZyBuZWVkZWQsIGNhbGwgY2xpcCBibGl0ICovCiAgICBpZiAoc3JjcmVjdC0+eCB8fCBzcmNyZWN0LT53ICE9IHNyYy0+dykgewogICAgICAgIFJMRUNsaXBCbGl0KHcsIHNyY2J1ZiwgZHN0LCBkc3RidWYsIHNyY3JlY3QsIGFscGhhKTsKICAgIH0gZWxzZSB7CiAgICAgICAgU0RMX1BpeGVsRm9ybWF0ICpmbXQgPSBzcmMtPmZvcm1hdDsKCiNkZWZpbmUgUkxFQkxJVChicHAsIFR5cGUsIGRvX2JsaXQpICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaW50IGxpbmVjb3VudCA9IHNyY3JlY3QtPmg7ICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpbnQgb2ZzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZm9yKDs7KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHVuc2lnbmVkIHJ1bjsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBvZnMgKz0gKihUeXBlICopc3JjYnVmOyAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHJ1biA9ICgoVHlwZSAqKXNyY2J1ZilbMV07ICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHNyY2J1ZiArPSAyICogc2l6ZW9mKFR5cGUpOyAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGlmKHJ1bikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBkb19ibGl0KGRzdGJ1ZiArIG9mcyAqIGJwcCwgc3JjYnVmLCBydW4sIGJwcCwgYWxwaGEpOyBcCiAgICAgICAgICAgIHNyY2J1ZiArPSBydW4gKiBicHA7ICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgb2ZzICs9IHJ1bjsgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgfSBlbHNlIGlmKCFvZnMpICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGlmKG9mcyA9PSB3KSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBvZnMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBkc3RidWYgKz0gZHN0LT5waXRjaDsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGlmKCEtLWxpbmVjb3VudCkgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSB3aGlsZSgwKQoKICAgICAgICBDSE9PU0VfQkxJVChSTEVCTElULCBhbHBoYSwgZm10KTsKCiN1bmRlZiBSTEVCTElUCiAgICB9CgogIGRvbmU6CiAgICAvKiBVbmxvY2sgdGhlIGRlc3RpbmF0aW9uIGlmIG5lY2Vzc2FyeSAqLwogICAgaWYgKFNETF9NVVNUTE9DSyhkc3QpKSB7CiAgICAgICAgU0RMX1VubG9ja1N1cmZhY2UoZHN0KTsKICAgIH0KICAgIHJldHVybiAoMCk7Cn0KCiN1bmRlZiBPUEFRVUVfQkxJVAoKLyoKICogUGVyLXBpeGVsIGJsaXR0aW5nIG1hY3JvcyBmb3IgdHJhbnNsdWNlbnQgcGl4ZWxzOgogKiBUaGVzZSB1c2UgdGhlIHNhbWUgdGVjaG5pcXVlcyBhcyB0aGUgcGVyLXN1cmZhY2UgYmxpdHRpbmcgbWFjcm9zCiAqLwoKLyoKICogRm9yIDMyYnBwIHBpeGVscywgd2UgaGF2ZSBtYWRlIHN1cmUgdGhlIGFscGhhIGlzIHN0b3JlZCBpbiB0aGUgdG9wCiAqIDggYml0cywgc28gcHJvY2VlZCBhcyB1c3VhbAogKi8KI2RlZmluZSBCTElUX1RSQU5TTF84ODgoc3JjLCBkc3QpICAgICAgICAgICAgICAgXAogICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDMyIHMgPSBzcmM7ICAgICAgICAgICAgICAgICAgICAgXAogICAgVWludDMyIGQgPSBkc3Q7ICAgICAgICAgICAgICAgICAgICAgXAogICAgdW5zaWduZWQgYWxwaGEgPSBzID4+IDI0OyAgICAgICAgICAgICAgIFwKICAgIFVpbnQzMiBzMSA9IHMgJiAweGZmMDBmZjsgICAgICAgICAgICAgICBcCiAgICBVaW50MzIgZDEgPSBkICYgMHhmZjAwZmY7ICAgICAgICAgICAgICAgXAogICAgZDEgPSAoZDEgKyAoKHMxIC0gZDEpICogYWxwaGEgPj4gOCkpICYgMHhmZjAwZmY7ICAgIFwKICAgIHMgJj0gMHhmZjAwOyAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIGQgJj0gMHhmZjAwOyAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIGQgPSAoZCArICgocyAtIGQpICogYWxwaGEgPj4gOCkpICYgMHhmZjAwOyAgICAgIFwKICAgIGRzdCA9IGQxIHwgZCB8IDB4ZmYwMDAwMDA7ICAgICAgICAgICAgICBcCiAgICB9IHdoaWxlKDApCgovKgogKiBGb3IgMTZicHAgcGl4ZWxzLCB3ZSBoYXZlIHN0b3JlZCB0aGUgNSBtb3N0IHNpZ25pZmljYW50IGFscGhhIGJpdHMgaW4KICogYml0cyA1LTEwLiBBcyBiZWZvcmUsIHdlIGNhbiBwcm9jZXNzIGFsbCAzIFJHQiBjb21wb25lbnRzIGF0IHRoZSBzYW1lIHRpbWUuCiAqLwojZGVmaW5lIEJMSVRfVFJBTlNMXzU2NShzcmMsIGRzdCkgICAgICAgXAogICAgZG8geyAgICAgICAgICAgICAgICAgICAgXAogICAgVWludDMyIHMgPSBzcmM7ICAgICAgICAgICAgIFwKICAgIFVpbnQzMiBkID0gZHN0OyAgICAgICAgICAgICBcCiAgICB1bnNpZ25lZCBhbHBoYSA9IChzICYgMHgzZTApID4+IDU7ICBcCiAgICBzICY9IDB4MDdlMGY4MWY7ICAgICAgICAgICAgXAogICAgZCA9IChkIHwgZCA8PCAxNikgJiAweDA3ZTBmODFmOyAgICAgXAogICAgZCArPSAocyAtIGQpICogYWxwaGEgPj4gNTsgICAgICBcCiAgICBkICY9IDB4MDdlMGY4MWY7ICAgICAgICAgICAgXAogICAgZHN0ID0gKFVpbnQxNikoZCB8IGQgPj4gMTYpOyAgICAgICAgICAgIFwKICAgIH0gd2hpbGUoMCkKCiNkZWZpbmUgQkxJVF9UUkFOU0xfNTU1KHNyYywgZHN0KSAgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICBcCiAgICBVaW50MzIgcyA9IHNyYzsgICAgICAgICAgICAgXAogICAgVWludDMyIGQgPSBkc3Q7ICAgICAgICAgICAgIFwKICAgIHVuc2lnbmVkIGFscGhhID0gKHMgJiAweDNlMCkgPj4gNTsgIFwKICAgIHMgJj0gMHgwM2UwN2MxZjsgICAgICAgICAgICBcCiAgICBkID0gKGQgfCBkIDw8IDE2KSAmIDB4MDNlMDdjMWY7ICAgICBcCiAgICBkICs9IChzIC0gZCkgKiBhbHBoYSA+PiA1OyAgICAgIFwKICAgIGQgJj0gMHgwM2UwN2MxZjsgICAgICAgICAgICBcCiAgICBkc3QgPSAoVWludDE2KShkIHwgZCA+PiAxNik7ICAgICAgICAgICAgXAogICAgfSB3aGlsZSgwKQoKLyogdXNlZCB0byBzYXZlIHRoZSBkZXN0aW5hdGlvbiBmb3JtYXQgaW4gdGhlIGVuY29kaW5nLiBEZXNpZ25lZCB0byBiZQogICBtYWNyby1jb21wYXRpYmxlIHdpdGggU0RMX1BpeGVsRm9ybWF0IGJ1dCB3aXRob3V0IHRoZSB1bm5lZWRlZCBmaWVsZHMgKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgVWludDggQnl0ZXNQZXJQaXhlbDsKICAgIFVpbnQ4IHBhZGRpbmdbM107CiAgICBVaW50MzIgUm1hc2s7CiAgICBVaW50MzIgR21hc2s7CiAgICBVaW50MzIgQm1hc2s7CiAgICBVaW50MzIgQW1hc2s7CiAgICBVaW50OCBSbG9zczsKICAgIFVpbnQ4IEdsb3NzOwogICAgVWludDggQmxvc3M7CiAgICBVaW50OCBBbG9zczsKICAgIFVpbnQ4IFJzaGlmdDsKICAgIFVpbnQ4IEdzaGlmdDsKICAgIFVpbnQ4IEJzaGlmdDsKICAgIFVpbnQ4IEFzaGlmdDsKfSBSTEVEZXN0Rm9ybWF0OwoKLyogYmxpdCBhIHBpeGVsLWFscGhhIFJMRSBzdXJmYWNlIGNsaXBwZWQgYXQgdGhlIHJpZ2h0IGFuZC9vciBsZWZ0IGVkZ2VzICovCnN0YXRpYyB2b2lkClJMRUFscGhhQ2xpcEJsaXQoaW50IHcsIFVpbnQ4ICogc3JjYnVmLCBTRExfU3VyZmFjZSAqIGRzdCwKICAgICAgICAgICAgICAgICBVaW50OCAqIGRzdGJ1ZiwgU0RMX1JlY3QgKiBzcmNyZWN0KQp7CiAgICBTRExfUGl4ZWxGb3JtYXQgKmRmID0gZHN0LT5mb3JtYXQ7CiAgICAvKgogICAgICogY2xpcHBlZCBibGl0dGVyOiBQdHlwZSBpcyB0aGUgZGVzdGluYXRpb24gcGl4ZWwgdHlwZSwKICAgICAqIEN0eXBlIHRoZSB0cmFuc2x1Y2VudCBjb3VudCB0eXBlLCBhbmQgZG9fYmxlbmQgdGhlIG1hY3JvCiAgICAgKiB0byBibGVuZCBvbmUgcGl4ZWwuCiAgICAgKi8KI2RlZmluZSBSTEVBTFBIQUNMSVBCTElUKFB0eXBlLCBDdHlwZSwgZG9fYmxlbmQpICAgICAgICAgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIGludCBsaW5lY291bnQgPSBzcmNyZWN0LT5oOyAgICAgICAgICAgICAgICAgICBcCiAgICBpbnQgbGVmdCA9IHNyY3JlY3QtPng7ICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgaW50IHJpZ2h0ID0gbGVmdCArIHNyY3JlY3QtPnc7ICAgICAgICAgICAgICAgICAgICBcCiAgICBkc3RidWYgLT0gbGVmdCAqIHNpemVvZihQdHlwZSk7ICAgICAgICAgICAgICAgICAgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGludCBvZnMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIC8qIGJsaXQgb3BhcXVlIHBpeGVscyBvbiBvbmUgbGluZSAqLyAgICAgICAgICAgICAgXAogICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgdW5zaWduZWQgcnVuOyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgb2ZzICs9ICgoQ3R5cGUgKilzcmNidWYpWzBdOyAgICAgICAgICAgICAgICAgIFwKICAgICAgICBydW4gPSAoKEN0eXBlICopc3JjYnVmKVsxXTsgICAgICAgICAgICAgICBcCiAgICAgICAgc3JjYnVmICs9IDIgKiBzaXplb2YoQ3R5cGUpOyAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpZihydW4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAvKiBjbGlwIHRvIGxlZnQgYW5kIHJpZ2h0IGJvcmRlcnMgKi8gICAgICAgICAgXAogICAgICAgICAgICBpbnQgY29mcyA9IG9mczsgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpbnQgY3J1biA9IHJ1bjsgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpZihsZWZ0IC0gY29mcyA+IDApIHsgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgY3J1biAtPSBsZWZ0IC0gY29mczsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNvZnMgPSBsZWZ0OyAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaWYoY3J1biA+IHJpZ2h0IC0gY29mcykgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNydW4gPSByaWdodCAtIGNvZnM7ICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpZihjcnVuID4gMCkgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBQSVhFTF9DT1BZKGRzdGJ1ZiArIGNvZnMgKiBzaXplb2YoUHR5cGUpLCAgICAgXAogICAgICAgICAgICAgICAgICAgc3JjYnVmICsgKGNvZnMgLSBvZnMpICogc2l6ZW9mKFB0eXBlKSwgXAogICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKWNydW4sIHNpemVvZihQdHlwZSkpOyAgICBcCiAgICAgICAgICAgIHNyY2J1ZiArPSBydW4gKiBzaXplb2YoUHR5cGUpOyAgICAgICAgICAgIFwKICAgICAgICAgICAgb2ZzICs9IHJ1bjsgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9IGVsc2UgaWYoIW9mcykgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gd2hpbGUob2ZzIDwgdyk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAvKiBza2lwIHBhZGRpbmcgaWYgbmVjZXNzYXJ5ICovICAgICAgICAgICAgICAgXAogICAgICAgIGlmKHNpemVvZihQdHlwZSkgPT0gMikgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBzcmNidWYgKz0gKHVpbnRwdHJfdClzcmNidWYgJiAyOyAgICAgICAgICAgICAgXAogICAgICAgIC8qIGJsaXQgdHJhbnNsdWNlbnQgcGl4ZWxzIG9uIHRoZSBzYW1lIGxpbmUgKi8gICAgICAgIFwKICAgICAgICBvZnMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIHVuc2lnbmVkIHJ1bjsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIG9mcyArPSAoKFVpbnQxNiAqKXNyY2J1ZilbMF07ICAgICAgICAgICAgICAgICBcCiAgICAgICAgcnVuID0gKChVaW50MTYgKilzcmNidWYpWzFdOyAgICAgICAgICAgICAgICAgIFwKICAgICAgICBzcmNidWYgKz0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpZihydW4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAvKiBjbGlwIHRvIGxlZnQgYW5kIHJpZ2h0IGJvcmRlcnMgKi8gICAgICAgICAgXAogICAgICAgICAgICBpbnQgY29mcyA9IG9mczsgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpbnQgY3J1biA9IHJ1bjsgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpZihsZWZ0IC0gY29mcyA+IDApIHsgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgY3J1biAtPSBsZWZ0IC0gY29mczsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNvZnMgPSBsZWZ0OyAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaWYoY3J1biA+IHJpZ2h0IC0gY29mcykgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNydW4gPSByaWdodCAtIGNvZnM7ICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpZihjcnVuID4gMCkgeyAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBQdHlwZSAqZHN0ID0gKFB0eXBlICopZHN0YnVmICsgY29mczsgICAgICAgICAgXAogICAgICAgICAgICBVaW50MzIgKnNyYyA9IChVaW50MzIgKilzcmNidWYgKyAoY29mcyAtIG9mcyk7ICAgIFwKICAgICAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBjcnVuOyBpKyspICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGRvX2JsZW5kKHNyY1tpXSwgZHN0W2ldKTsgICAgICAgICAgICAgXAogICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHNyY2J1ZiArPSBydW4gKiA0OyAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBvZnMgKz0gcnVuOyAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9IHdoaWxlKG9mcyA8IHcpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZHN0YnVmICs9IGRzdC0+cGl0Y2g7ICAgICAgICAgICAgICAgICAgICAgXAogICAgfSB3aGlsZSgtLWxpbmVjb3VudCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIH0gd2hpbGUoMCkKCiAgICBzd2l0Y2ggKGRmLT5CeXRlc1BlclBpeGVsKSB7CiAgICBjYXNlIDI6CiAgICAgICAgaWYgKGRmLT5HbWFzayA9PSAweDA3ZTAgfHwgZGYtPlJtYXNrID09IDB4MDdlMCB8fCBkZi0+Qm1hc2sgPT0gMHgwN2UwKQogICAgICAgICAgICBSTEVBTFBIQUNMSVBCTElUKFVpbnQxNiwgVWludDgsIEJMSVRfVFJBTlNMXzU2NSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBSTEVBTFBIQUNMSVBCTElUKFVpbnQxNiwgVWludDgsIEJMSVRfVFJBTlNMXzU1NSk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDQ6CiAgICAgICAgUkxFQUxQSEFDTElQQkxJVChVaW50MzIsIFVpbnQxNiwgQkxJVF9UUkFOU0xfODg4KTsKICAgICAgICBicmVhazsKICAgIH0KfQoKLyogYmxpdCBhIHBpeGVsLWFscGhhIFJMRSBzdXJmYWNlICovCmludApTRExfUkxFQWxwaGFCbGl0KFNETF9TdXJmYWNlICogc3JjLCBTRExfUmVjdCAqIHNyY3JlY3QsCiAgICAgICAgICAgICAgICAgU0RMX1N1cmZhY2UgKiBkc3QsIFNETF9SZWN0ICogZHN0cmVjdCkKewogICAgaW50IHgsIHk7CiAgICBpbnQgdyA9IHNyYy0+dzsKICAgIFVpbnQ4ICpzcmNidWYsICpkc3RidWY7CiAgICBTRExfUGl4ZWxGb3JtYXQgKmRmID0gZHN0LT5mb3JtYXQ7CgogICAgLyogTG9jayB0aGUgZGVzdGluYXRpb24gaWYgbmVjZXNzYXJ5ICovCiAgICBpZiAoU0RMX01VU1RMT0NLKGRzdCkpIHsKICAgICAgICBpZiAoU0RMX0xvY2tTdXJmYWNlKGRzdCkgPCAwKSB7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICB9CgogICAgeCA9IGRzdHJlY3QtPng7CiAgICB5ID0gZHN0cmVjdC0+eTsKICAgIGRzdGJ1ZiA9IChVaW50OCAqKSBkc3QtPnBpeGVscyArIHkgKiBkc3QtPnBpdGNoICsgeCAqIGRmLT5CeXRlc1BlclBpeGVsOwogICAgc3JjYnVmID0gKFVpbnQ4ICopIHNyYy0+bWFwLT5kYXRhICsgc2l6ZW9mKFJMRURlc3RGb3JtYXQpOwoKICAgIHsKICAgICAgICAvKiBza2lwIGxpbmVzIGF0IHRoZSB0b3AgaWYgbmVjZXNzYXJ5ICovCiAgICAgICAgaW50IHZza2lwID0gc3JjcmVjdC0+eTsKICAgICAgICBpZiAodnNraXApIHsKICAgICAgICAgICAgaW50IG9mczsKICAgICAgICAgICAgaWYgKGRmLT5CeXRlc1BlclBpeGVsID09IDIpIHsKICAgICAgICAgICAgICAgIC8qIHRoZSAxNi8zMiBpbnRlcmxlYXZlZCBmb3JtYXQgKi8KICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICAvKiBza2lwIG9wYXF1ZSBsaW5lICovCiAgICAgICAgICAgICAgICAgICAgb2ZzID0gMDsKICAgICAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgICAgIGludCBydW47CiAgICAgICAgICAgICAgICAgICAgICAgIG9mcyArPSBzcmNidWZbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIHJ1biA9IHNyY2J1ZlsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgc3JjYnVmICs9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY2J1ZiArPSAyICogcnVuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZzICs9IHJ1bjsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghb2ZzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOwogICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKG9mcyA8IHcpOwoKICAgICAgICAgICAgICAgICAgICAvKiBza2lwIHBhZGRpbmcgKi8KICAgICAgICAgICAgICAgICAgICBzcmNidWYgKz0gKHVpbnRwdHJfdCkgc3JjYnVmICYgMjsKCiAgICAgICAgICAgICAgICAgICAgLyogc2tpcCB0cmFuc2x1Y2VudCBsaW5lICovCiAgICAgICAgICAgICAgICAgICAgb2ZzID0gMDsKICAgICAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgICAgIGludCBydW47CiAgICAgICAgICAgICAgICAgICAgICAgIG9mcyArPSAoKFVpbnQxNiAqKSBzcmNidWYpWzBdOwogICAgICAgICAgICAgICAgICAgICAgICBydW4gPSAoKFVpbnQxNiAqKSBzcmNidWYpWzFdOwogICAgICAgICAgICAgICAgICAgICAgICBzcmNidWYgKz0gNCAqIChydW4gKyAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgb2ZzICs9IHJ1bjsKICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChvZnMgPCB3KTsKICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tdnNraXApOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLyogdGhlIDMyLzMyIGludGVybGVhdmVkIGZvcm1hdCAqLwogICAgICAgICAgICAgICAgdnNraXAgPDw9IDE7ICAgIC8qIG9wYXF1ZSBhbmQgdHJhbnNsdWNlbnQgaGF2ZSBzYW1lIGZvcm1hdCAqLwogICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgIG9mcyA9IDA7CiAgICAgICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgICAgICBpbnQgcnVuOwogICAgICAgICAgICAgICAgICAgICAgICBvZnMgKz0gKChVaW50MTYgKikgc3JjYnVmKVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgcnVuID0gKChVaW50MTYgKikgc3JjYnVmKVsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgc3JjYnVmICs9IDQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY2J1ZiArPSA0ICogcnVuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZzICs9IHJ1bjsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghb2ZzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOwogICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKG9mcyA8IHcpOwogICAgICAgICAgICAgICAgfSB3aGlsZSAoLS12c2tpcCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyogaWYgbGVmdCBvciByaWdodCBlZGdlIGNsaXBwaW5nIG5lZWRlZCwgY2FsbCBjbGlwIGJsaXQgKi8KICAgIGlmIChzcmNyZWN0LT54IHx8IHNyY3JlY3QtPncgIT0gc3JjLT53KSB7CiAgICAgICAgUkxFQWxwaGFDbGlwQmxpdCh3LCBzcmNidWYsIGRzdCwgZHN0YnVmLCBzcmNyZWN0KTsKICAgIH0gZWxzZSB7CgogICAgICAgIC8qCiAgICAgICAgICogbm9uLWNsaXBwZWQgYmxpdHRlci4gUHR5cGUgaXMgdGhlIGRlc3RpbmF0aW9uIHBpeGVsIHR5cGUsCiAgICAgICAgICogQ3R5cGUgdGhlIHRyYW5zbHVjZW50IGNvdW50IHR5cGUsIGFuZCBkb19ibGVuZCB0aGUKICAgICAgICAgKiBtYWNybyB0byBibGVuZCBvbmUgcGl4ZWwuCiAgICAgICAgICovCiNkZWZpbmUgUkxFQUxQSEFCTElUKFB0eXBlLCBDdHlwZSwgZG9fYmxlbmQpICAgICAgICAgICAgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGludCBsaW5lY291bnQgPSBzcmNyZWN0LT5oOyAgICAgICAgICAgICAgICAgIFwKICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaW50IG9mcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAvKiBibGl0IG9wYXF1ZSBwaXhlbHMgb24gb25lIGxpbmUgKi8gICAgICAgICAgICAgXAogICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgdW5zaWduZWQgcnVuOyAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBvZnMgKz0gKChDdHlwZSAqKXNyY2J1ZilbMF07ICAgICAgICAgICAgIFwKICAgICAgICAgICAgcnVuID0gKChDdHlwZSAqKXNyY2J1ZilbMV07ICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHNyY2J1ZiArPSAyICogc2l6ZW9mKEN0eXBlKTsgICAgICAgICAgICAgXAogICAgICAgICAgICBpZihydW4pIHsgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIFBJWEVMX0NPUFkoZHN0YnVmICsgb2ZzICogc2l6ZW9mKFB0eXBlKSwgc3JjYnVmLCBcCiAgICAgICAgICAgICAgICAgICBydW4sIHNpemVvZihQdHlwZSkpOyAgICAgICAgICBcCiAgICAgICAgICAgIHNyY2J1ZiArPSBydW4gKiBzaXplb2YoUHR5cGUpOyAgICAgICAgICAgXAogICAgICAgICAgICBvZnMgKz0gcnVuOyAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgfSBlbHNlIGlmKCFvZnMpICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBnb3RvIGRvbmU7ICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9IHdoaWxlKG9mcyA8IHcpOyAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIC8qIHNraXAgcGFkZGluZyBpZiBuZWNlc3NhcnkgKi8gICAgICAgICAgICAgIFwKICAgICAgICBpZihzaXplb2YoUHR5cGUpID09IDIpICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgc3JjYnVmICs9ICh1aW50cHRyX3Qpc3JjYnVmICYgMjsgICAgICAgICAgICAgXAogICAgICAgIC8qIGJsaXQgdHJhbnNsdWNlbnQgcGl4ZWxzIG9uIHRoZSBzYW1lIGxpbmUgKi8gICAgICAgXAogICAgICAgIG9mcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHVuc2lnbmVkIHJ1bjsgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgb2ZzICs9ICgoVWludDE2ICopc3JjYnVmKVswXTsgICAgICAgICAgICBcCiAgICAgICAgICAgIHJ1biA9ICgoVWludDE2ICopc3JjYnVmKVsxXTsgICAgICAgICAgICAgXAogICAgICAgICAgICBzcmNidWYgKz0gNDsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGlmKHJ1bikgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgUHR5cGUgKmRzdCA9IChQdHlwZSAqKWRzdGJ1ZiArIG9mczsgICAgICBcCiAgICAgICAgICAgIHVuc2lnbmVkIGk7ICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBydW47IGkrKykgeyAgICAgICAgICAgXAogICAgICAgICAgICAgICAgVWludDMyIHNyYyA9ICooVWludDMyICopc3JjYnVmOyAgICAgIFwKICAgICAgICAgICAgICAgIGRvX2JsZW5kKHNyYywgKmRzdCk7ICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIHNyY2J1ZiArPSA0OyAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgZHN0Kys7ICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgb2ZzICs9IHJ1bjsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gd2hpbGUob2ZzIDwgdyk7ICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZHN0YnVmICs9IGRzdC0+cGl0Y2g7ICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSB3aGlsZSgtLWxpbmVjb3VudCk7ICAgICAgICAgICAgICAgICAgICBcCiAgICB9IHdoaWxlKDApCgogICAgICAgIHN3aXRjaCAoZGYtPkJ5dGVzUGVyUGl4ZWwpIHsKICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgIGlmIChkZi0+R21hc2sgPT0gMHgwN2UwIHx8IGRmLT5SbWFzayA9PSAweDA3ZTAKICAgICAgICAgICAgICAgIHx8IGRmLT5CbWFzayA9PSAweDA3ZTApCiAgICAgICAgICAgICAgICBSTEVBTFBIQUJMSVQoVWludDE2LCBVaW50OCwgQkxJVF9UUkFOU0xfNTY1KTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgUkxFQUxQSEFCTElUKFVpbnQxNiwgVWludDgsIEJMSVRfVFJBTlNMXzU1NSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgUkxFQUxQSEFCTElUKFVpbnQzMiwgVWludDE2LCBCTElUX1RSQU5TTF84ODgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CgogIGRvbmU6CiAgICAvKiBVbmxvY2sgdGhlIGRlc3RpbmF0aW9uIGlmIG5lY2Vzc2FyeSAqLwogICAgaWYgKFNETF9NVVNUTE9DSyhkc3QpKSB7CiAgICAgICAgU0RMX1VubG9ja1N1cmZhY2UoZHN0KTsKICAgIH0KICAgIHJldHVybiAwOwp9CgovKgogKiBBdXhpbGlhcnkgZnVuY3Rpb25zOgogKiBUaGUgZW5jb2RpbmcgZnVuY3Rpb25zIHRha2UgMzJicHAgcmdiICsgYSwgYW5kCiAqIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCB0byB0aGUgZGVzdGluYXRpb24uCiAqIFRoZSBkZWNvZGluZyBmdW5jdGlvbnMgY29weSB0byAzMmJwcCByZ2IgKyBhLCBhbmQKICogcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkIGZyb20gdGhlIHNvdXJjZS4KICogVGhlc2UgYXJlIG9ubHkgdXNlZCBpbiB0aGUgZW5jb2RlciBhbmQgdW4tUkxFIGNvZGUgYW5kIGFyZSB0aGVyZWZvcmUgbm90CiAqIGhpZ2hseSBvcHRpbWlzZWQuCiAqLwoKLyogZW5jb2RlIDMyYnBwIHJnYiArIGEgaW50byAxNmJwcCByZ2IsIGxvc2luZyBhbHBoYSAqLwpzdGF0aWMgaW50CmNvcHlfb3BhcXVlXzE2KHZvaWQgKmRzdCwgVWludDMyICogc3JjLCBpbnQgbiwKICAgICAgICAgICAgICAgU0RMX1BpeGVsRm9ybWF0ICogc2ZtdCwgU0RMX1BpeGVsRm9ybWF0ICogZGZtdCkKewogICAgaW50IGk7CiAgICBVaW50MTYgKmQgPSBkc3Q7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgdW5zaWduZWQgciwgZywgYjsKICAgICAgICBSR0JfRlJPTV9QSVhFTCgqc3JjLCBzZm10LCByLCBnLCBiKTsKICAgICAgICBQSVhFTF9GUk9NX1JHQigqZCwgZGZtdCwgciwgZywgYik7CiAgICAgICAgc3JjKys7CiAgICAgICAgZCsrOwogICAgfQogICAgcmV0dXJuIG4gKiAyOwp9CgovKiBkZWNvZGUgb3BhcXVlIHBpeGVscyBmcm9tIDE2YnBwIHRvIDMyYnBwIHJnYiArIGEgKi8Kc3RhdGljIGludAp1bmNvcHlfb3BhcXVlXzE2KFVpbnQzMiAqIGRzdCwgdm9pZCAqc3JjLCBpbnQgbiwKICAgICAgICAgICAgICAgICBSTEVEZXN0Rm9ybWF0ICogc2ZtdCwgU0RMX1BpeGVsRm9ybWF0ICogZGZtdCkKewogICAgaW50IGk7CiAgICBVaW50MTYgKnMgPSBzcmM7CiAgICB1bnNpZ25lZCBhbHBoYSA9IGRmbXQtPkFtYXNrID8gMjU1IDogMDsKICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICB1bnNpZ25lZCByLCBnLCBiOwogICAgICAgIFJHQl9GUk9NX1BJWEVMKCpzLCBzZm10LCByLCBnLCBiKTsKICAgICAgICBQSVhFTF9GUk9NX1JHQkEoKmRzdCwgZGZtdCwgciwgZywgYiwgYWxwaGEpOwogICAgICAgIHMrKzsKICAgICAgICBkc3QrKzsKICAgIH0KICAgIHJldHVybiBuICogMjsKfQoKCgovKiBlbmNvZGUgMzJicHAgcmdiICsgYSBpbnRvIDMyYnBwIEcwUkFCIGZvcm1hdCBmb3IgYmxpdHRpbmcgaW50byA1NjUgKi8Kc3RhdGljIGludApjb3B5X3RyYW5zbF81NjUodm9pZCAqZHN0LCBVaW50MzIgKiBzcmMsIGludCBuLAogICAgICAgICAgICAgICAgU0RMX1BpeGVsRm9ybWF0ICogc2ZtdCwgU0RMX1BpeGVsRm9ybWF0ICogZGZtdCkKewogICAgaW50IGk7CiAgICBVaW50MzIgKmQgPSBkc3Q7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgdW5zaWduZWQgciwgZywgYiwgYTsKICAgICAgICBVaW50MTYgcGl4OwogICAgICAgIFJHQkFfRlJPTV84ODg4KCpzcmMsIHNmbXQsIHIsIGcsIGIsIGEpOwogICAgICAgIFBJWEVMX0ZST01fUkdCKHBpeCwgZGZtdCwgciwgZywgYik7CiAgICAgICAgKmQgPSAoKHBpeCAmIDB4N2UwKSA8PCAxNikgfCAocGl4ICYgMHhmODFmKSB8ICgoYSA8PCAyKSAmIDB4N2UwKTsKICAgICAgICBzcmMrKzsKICAgICAgICBkKys7CiAgICB9CiAgICByZXR1cm4gbiAqIDQ7Cn0KCi8qIGVuY29kZSAzMmJwcCByZ2IgKyBhIGludG8gMzJicHAgRzBSQUIgZm9ybWF0IGZvciBibGl0dGluZyBpbnRvIDU1NSAqLwpzdGF0aWMgaW50CmNvcHlfdHJhbnNsXzU1NSh2b2lkICpkc3QsIFVpbnQzMiAqIHNyYywgaW50IG4sCiAgICAgICAgICAgICAgICBTRExfUGl4ZWxGb3JtYXQgKiBzZm10LCBTRExfUGl4ZWxGb3JtYXQgKiBkZm10KQp7CiAgICBpbnQgaTsKICAgIFVpbnQzMiAqZCA9IGRzdDsKICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICB1bnNpZ25lZCByLCBnLCBiLCBhOwogICAgICAgIFVpbnQxNiBwaXg7CiAgICAgICAgUkdCQV9GUk9NXzg4ODgoKnNyYywgc2ZtdCwgciwgZywgYiwgYSk7CiAgICAgICAgUElYRUxfRlJPTV9SR0IocGl4LCBkZm10LCByLCBnLCBiKTsKICAgICAgICAqZCA9ICgocGl4ICYgMHgzZTApIDw8IDE2KSB8IChwaXggJiAweGZjMWYpIHwgKChhIDw8IDIpICYgMHgzZTApOwogICAgICAgIHNyYysrOwogICAgICAgIGQrKzsKICAgIH0KICAgIHJldHVybiBuICogNDsKfQoKLyogZGVjb2RlIHRyYW5zbHVjZW50IHBpeGVscyBmcm9tIDMyYnBwIEdPUkFCIHRvIDMyYnBwIHJnYiArIGEgKi8Kc3RhdGljIGludAp1bmNvcHlfdHJhbnNsXzE2KFVpbnQzMiAqIGRzdCwgdm9pZCAqc3JjLCBpbnQgbiwKICAgICAgICAgICAgICAgICBSTEVEZXN0Rm9ybWF0ICogc2ZtdCwgU0RMX1BpeGVsRm9ybWF0ICogZGZtdCkKewogICAgaW50IGk7CiAgICBVaW50MzIgKnMgPSBzcmM7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgdW5zaWduZWQgciwgZywgYiwgYTsKICAgICAgICBVaW50MzIgcGl4ID0gKnMrKzsKICAgICAgICBhID0gKHBpeCAmIDB4M2UwKSA+PiAyOwogICAgICAgIHBpeCA9IChwaXggJiB+MHgzZTApIHwgcGl4ID4+IDE2OwogICAgICAgIFJHQl9GUk9NX1BJWEVMKHBpeCwgc2ZtdCwgciwgZywgYik7CiAgICAgICAgUElYRUxfRlJPTV9SR0JBKCpkc3QsIGRmbXQsIHIsIGcsIGIsIGEpOwogICAgICAgIGRzdCsrOwogICAgfQogICAgcmV0dXJuIG4gKiA0Owp9CgovKiBlbmNvZGUgMzJicHAgcmdiYSBpbnRvIDMyYnBwIHJnYmEsIGtlZXBpbmcgYWxwaGEgKGR1YWwgcHVycG9zZSkgKi8Kc3RhdGljIGludApjb3B5XzMyKHZvaWQgKmRzdCwgVWludDMyICogc3JjLCBpbnQgbiwKICAgICAgICBTRExfUGl4ZWxGb3JtYXQgKiBzZm10LCBTRExfUGl4ZWxGb3JtYXQgKiBkZm10KQp7CiAgICBpbnQgaTsKICAgIFVpbnQzMiAqZCA9IGRzdDsKICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICB1bnNpZ25lZCByLCBnLCBiLCBhOwogICAgICAgIFJHQkFfRlJPTV84ODg4KCpzcmMsIHNmbXQsIHIsIGcsIGIsIGEpOwogICAgICAgIFBJWEVMX0ZST01fUkdCQSgqZCwgZGZtdCwgciwgZywgYiwgYSk7CiAgICAgICAgZCsrOwogICAgICAgIHNyYysrOwogICAgfQogICAgcmV0dXJuIG4gKiA0Owp9CgovKiBkZWNvZGUgMzJicHAgcmdiYSBpbnRvIDMyYnBwIHJnYmEsIGtlZXBpbmcgYWxwaGEgKGR1YWwgcHVycG9zZSkgKi8Kc3RhdGljIGludAp1bmNvcHlfMzIoVWludDMyICogZHN0LCB2b2lkICpzcmMsIGludCBuLAogICAgICAgICAgUkxFRGVzdEZvcm1hdCAqIHNmbXQsIFNETF9QaXhlbEZvcm1hdCAqIGRmbXQpCnsKICAgIGludCBpOwogICAgVWludDMyICpzID0gc3JjOwogICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIHVuc2lnbmVkIHIsIGcsIGIsIGE7CiAgICAgICAgVWludDMyIHBpeGVsID0gKnMrKzsKICAgICAgICBSR0JfRlJPTV9QSVhFTChwaXhlbCwgc2ZtdCwgciwgZywgYik7CiAgICAgICAgYSA9IHBpeGVsID4+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=