LyoKICBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKICBDb3B5cmlnaHQgKEMpIDE5OTctMjAyMCBTYW0gTGFudGluZ2EgPHNsb3VrZW5AbGlic2RsLm9yZz4KCiAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCiAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KCiAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCiAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAogIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKCiAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQogICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQogICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCiAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCiAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKi8KI2luY2x1ZGUgIi4uL1NETF9pbnRlcm5hbC5oIgoKI2lmIFNETF9IQVZFX1JMRQoKLyoKICogUkxFIGVuY29kaW5nIGZvciBzb2Z0d2FyZSBjb2xvcmtleSBhbmQgYWxwaGEtY2hhbm5lbCBhY2NlbGVyYXRpb24KICoKICogT3JpZ2luYWwgdmVyc2lvbiBieSBTYW0gTGFudGluZ2EKICoKICogTWF0dGlhcyBFbmdkZWflcmQgKFlvcmljayk6IFJld3JpdGUuIE5ldyBlbmNvZGluZyBmb3JtYXQsIGVuY29kZXIgYW5kCiAqIGRlY29kZXIuIEFkZGVkIHBlci1zdXJmYWNlIGFscGhhIGJsaXR0ZXIuIEFkZGVkIHBlci1waXhlbCBhbHBoYQogKiBmb3JtYXQsIGVuY29kZXIgYW5kIGJsaXR0ZXIuCiAqCiAqIE1hbnkgdGhhbmtzIHRvIFhhcmsgYW5kIGpvaG5zIGZvciBoaW50cywgYmVuY2htYXJrcyBhbmQgdXNlZnVsIGNvbW1lbnRzCiAqIGxlYWRpbmcgdG8gdGhpcyBjb2RlLgogKgogKiBXZWxjb21lIHRvIE1hY3JvIE1heWhlbS4KICovCgovKgogKiBUaGUgZW5jb2RpbmcgdHJhbnNsYXRlcyB0aGUgaW1hZ2UgZGF0YSB0byBhIHN0cmVhbSBvZiBzZWdtZW50cyBvZiB0aGUgZm9ybQogKgogKiA8c2tpcD4gPHJ1bj4gPGRhdGE+CiAqCiAqIHdoZXJlIDxza2lwPiBpcyB0aGUgbnVtYmVyIG9mIHRyYW5zcGFyZW50IHBpeGVscyB0byBza2lwLAogKiAgICAgICA8cnVuPiAgaXMgdGhlIG51bWJlciBvZiBvcGFxdWUgcGl4ZWxzIHRvIGJsaXQsCiAqIGFuZCAgIDxkYXRhPiBhcmUgdGhlIHBpeGVscyB0aGVtc2VsdmVzLgogKgogKiBUaGlzIGJhc2ljIHN0cnVjdHVyZSBpcyB1c2VkIGJvdGggZm9yIGNvbG9ya2V5ZWQgc3VyZmFjZXMsIHVzZWQgZm9yIHNpbXBsZQogKiBiaW5hcnkgdHJhbnNwYXJlbmN5IGFuZCBmb3IgcGVyLXN1cmZhY2UgYWxwaGEgYmxlbmRpbmcsIGFuZCBmb3Igc3VyZmFjZXMKICogd2l0aCBwZXItcGl4ZWwgYWxwaGEuIFRoZSBkZXRhaWxzIGRpZmZlciwgaG93ZXZlcjoKICoKICogRW5jb2Rpbmcgb2YgY29sb3JrZXllZCBzdXJmYWNlczoKICoKICogICBFbmNvZGVkIHBpeGVscyBhbHdheXMgaGF2ZSB0aGUgc2FtZSBmb3JtYXQgYXMgdGhlIHRhcmdldCBzdXJmYWNlLgogKiAgIDxza2lwPiBhbmQgPHJ1bj4gYXJlIHVuc2lnbmVkIDggYml0IGludGVnZXJzLCBleGNlcHQgZm9yIDMyIGJpdCBkZXB0aAogKiAgIHdoZXJlIHRoZXkgYXJlIDE2IGJpdC4gVGhpcyBtYWtlcyB0aGUgcGl4ZWwgZGF0YSBhbGlnbmVkIGF0IGFsbCB0aW1lcy4KICogICBTZWdtZW50cyBuZXZlciB3cmFwIGFyb3VuZCBmcm9tIG9uZSBzY2FuIGxpbmUgdG8gdGhlIG5leHQuCiAqCiAqICAgVGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UgaXMgbWFya2VkIGJ5IGEgemVybyA8c2tpcD4sPHJ1bj4gcGFpciBhdCB0aGUgKgogKiAgIGJlZ2lubmluZyBvZiBhIGxpbmUuCiAqCiAqIEVuY29kaW5nIG9mIHN1cmZhY2VzIHdpdGggcGVyLXBpeGVsIGFscGhhOgogKgogKiAgIFRoZSBzZXF1ZW5jZSBiZWdpbnMgd2l0aCBhIHN0cnVjdCBSTEVEZXN0Rm9ybWF0IGRlc2NyaWJpbmcgdGhlIHRhcmdldAogKiAgIHBpeGVsIGZvcm1hdCwgdG8gcHJvdmlkZSByZWxpYWJsZSB1bi1lbmNvZGluZy4KICoKICogICBFYWNoIHNjYW4gbGluZSBpcyBlbmNvZGVkIHR3aWNlOiBGaXJzdCBhbGwgY29tcGxldGVseSBvcGFxdWUgcGl4ZWxzLAogKiAgIGVuY29kZWQgaW4gdGhlIHRhcmdldCBmb3JtYXQgYXMgZGVzY3JpYmVkIGFib3ZlLCBhbmQgdGhlbiBhbGwKICogICBwYXJ0aWFsbHkgdHJhbnNwYXJlbnQgKHRyYW5zbHVjZW50KSBwaXhlbHMgKHdoZXJlIDEgPD0gYWxwaGEgPD0gMjU0KSwKICogICBpbiB0aGUgZm9sbG93aW5nIDMyLWJpdCBmb3JtYXQ6CiAqCiAqICAgRm9yIDMyLWJpdCB0YXJnZXRzLCBlYWNoIHBpeGVsIGhhcyB0aGUgdGFyZ2V0IFJHQiBmb3JtYXQgYnV0IHdpdGgKICogICB0aGUgYWxwaGEgdmFsdWUgb2NjdXB5aW5nIHRoZSBoaWdoZXN0IDggYml0cy4gVGhlIDxza2lwPiBhbmQgPHJ1bj4KICogICBjb3VudHMgYXJlIDE2IGJpdC4KICoKICogICBGb3IgMTYtYml0IHRhcmdldHMsIGVhY2ggcGl4ZWwgaGFzIHRoZSB0YXJnZXQgUkdCIGZvcm1hdCwgYnV0IHdpdGgKICogICB0aGUgbWlkZGxlIGNvbXBvbmVudCAodXN1YWxseSBncmVlbikgc2hpZnRlZCAxNiBzdGVwcyB0byB0aGUgbGVmdCwKICogICBhbmQgdGhlIGhvbGUgZmlsbGVkIHdpdGggdGhlIDUgbW9zdCBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSBhbHBoYSB2YWx1ZS4KICogICBpLmUuIGlmIHRoZSB0YXJnZXQgaGFzIHRoZSBmb3JtYXQgICAgICAgICBycnJycmdnZ2dnZ2JiYmJiLAogKiAgIHRoZSBlbmNvZGVkIHBpeGVsIHdpbGwgYmUgMDAwMDBnZ2dnZ2cwMDAwMHJycnJyMGFhYWFhYmJiYmIuCiAqICAgVGhlIDxza2lwPiBhbmQgPHJ1bj4gY291bnRzIGFyZSA4IGJpdCBmb3IgdGhlIG9wYXF1ZSBsaW5lcywgMTYgYml0CiAqICAgZm9yIHRoZSB0cmFuc2x1Y2VudCBsaW5lcy4gVHdvIHBhZGRpbmcgYnl0ZXMgbWF5IGJlIGluc2VydGVkCiAqICAgYmVmb3JlIGVhY2ggdHJhbnNsdWNlbnQgbGluZSB0byBrZWVwIHRoZW0gMzItYml0IGFsaWduZWQuCiAqCiAqICAgVGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UgaXMgbWFya2VkIGJ5IGEgemVybyA8c2tpcD4sPHJ1bj4gcGFpciBhdCB0aGUKICogICBiZWdpbm5pbmcgb2YgYW4gb3BhcXVlIGxpbmUuCiAqLwoKI2luY2x1ZGUgIlNETF92aWRlby5oIgojaW5jbHVkZSAiU0RMX3N5c3ZpZGVvLmgiCiNpbmNsdWRlICJTRExfYmxpdC5oIgojaW5jbHVkZSAiU0RMX1JMRWFjY2VsX2MuaCIKCiNpZm5kZWYgTUlOCiNkZWZpbmUgTUlOKGEsIGIpICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCiNlbmRpZgoKI2RlZmluZSBQSVhFTF9DT1BZKHRvLCBmcm9tLCBsZW4sIGJwcCkgICAgICAgICAgXAogICAgU0RMX21lbWNweSh0bywgZnJvbSwgKHNpemVfdCkobGVuKSAqIChicHApKQoKLyoKICogVmFyaW91cyBjb2xvcmtleSBibGl0IG1ldGhvZHMsIGZvciBvcGFxdWUgYW5kIHBlci1zdXJmYWNlIGFscGhhCiAqLwoKI2RlZmluZSBPUEFRVUVfQkxJVCh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhKSAgIFwKICAgIFBJWEVMX0NPUFkodG8sIGZyb20sIGxlbmd0aCwgYnBwKQoKLyoKICogRm9yIDMyYnBwIHBpeGVscyBvbiB0aGUgZm9ybSAweDAwcnJnZ2JiOgogKiBJZiB3ZSB0cmVhdCB0aGUgbWlkZGxlIGNvbXBvbmVudCBzZXBhcmF0ZWx5LCB3ZSBjYW4gcHJvY2VzcyB0aGUgdHdvCiAqIHJlbWFpbmluZyBpbiBwYXJhbGxlbC4gVGhpcyBpcyBzYWZlIHRvIGRvIGJlY2F1c2Ugb2YgdGhlIGdhcCB0byB0aGUgbGVmdAogKiBvZiBlYWNoIGNvbXBvbmVudCwgc28gdGhlIGJpdHMgZnJvbSB0aGUgbXVsdGlwbGljYXRpb24gZG9uJ3QgY29sbGlkZS4KICogVGhpcyBjYW4gYmUgdXNlZCBmb3IgYW55IFJHQiBwZXJtdXRhdGlvbiBvZiBjb3Vyc2UuCiAqLwojZGVmaW5lIEFMUEhBX0JMSVQzMl84ODgodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSkgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIFVpbnQzMiAqc3JjID0gKFVpbnQzMiAqKShmcm9tKTsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDMyICpkc3QgPSAoVWludDMyICopKHRvKTsgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludCkobGVuZ3RoKTsgaSsrKSB7ICAgICAgICAgICAgICAgXAogICAgICAgICAgICBVaW50MzIgcyA9ICpzcmMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIFVpbnQzMiBkID0gKmRzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgVWludDMyIHMxID0gcyAmIDB4ZmYwMGZmOyAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBVaW50MzIgZDEgPSBkICYgMHhmZjAwZmY7ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGQxID0gKGQxICsgKChzMSAtIGQxKSAqIGFscGhhID4+IDgpKSAmIDB4ZmYwMGZmOyBcCiAgICAgICAgICAgIHMgJj0gMHhmZjAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgZCAmPSAweGZmMDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBkID0gKGQgKyAoKHMgLSBkKSAqIGFscGhhID4+IDgpKSAmIDB4ZmYwMDsgICAgICBcCiAgICAgICAgICAgICpkc3QrKyA9IGQxIHwgZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgfSB3aGlsZSAoMCkKCi8qCiAqIEZvciAxNmJwcCBwaXhlbHMgd2UgY2FuIGdvIGEgc3RlcCBmdXJ0aGVyOiBwdXQgdGhlIG1pZGRsZSBjb21wb25lbnQKICogaW4gdGhlIGhpZ2ggMTYgYml0cyBvZiBhIDMyIGJpdCB3b3JkLCBhbmQgcHJvY2VzcyBhbGwgdGhyZWUgUkdCCiAqIGNvbXBvbmVudHMgYXQgdGhlIHNhbWUgdGltZS4gU2luY2UgdGhlIHNtYWxsZXN0IGdhcCBpcyBoZXJlIGp1c3QKICogNSBiaXRzLCB3ZSBoYXZlIHRvIHNjYWxlIGFscGhhIGRvd24gdG8gNSBiaXRzIGFzIHdlbGwuCiAqLwojZGVmaW5lIEFMUEhBX0JMSVQxNl81NjUodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSkgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIFVpbnQxNiAqc3JjID0gKFVpbnQxNiAqKShmcm9tKTsgICAgICAgICAgICAgICAgIFwKICAgICAgICBVaW50MTYgKmRzdCA9IChVaW50MTYgKikodG8pOyAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDMyIEFMUEhBID0gYWxwaGEgPj4gMzsgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGZvcihpID0gMDsgaSA8IChpbnQpKGxlbmd0aCk7IGkrKykgeyAgICAgICAgICAgIFwKICAgICAgICAgICAgVWludDMyIHMgPSAqc3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIFVpbnQzMiBkID0gKmRzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBzID0gKHMgfCBzIDw8IDE2KSAmIDB4MDdlMGY4MWY7ICAgICAgICAgICAgIFwKICAgICAgICAgICAgZCA9IChkIHwgZCA8PCAxNikgJiAweDA3ZTBmODFmOyAgICAgICAgICAgICBcCiAgICAgICAgICAgIGQgKz0gKHMgLSBkKSAqIEFMUEhBID4+IDU7ICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBkICY9IDB4MDdlMGY4MWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgKmRzdCsrID0gKFVpbnQxNikoZCB8IGQgPj4gMTYpOyAgICAgICAgICAgICBcCiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgfSB3aGlsZSgwKQoKI2RlZmluZSBBTFBIQV9CTElUMTZfNTU1KHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEpICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBVaW50MTYgKnNyYyA9IChVaW50MTYgKikoZnJvbSk7ICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDE2ICpkc3QgPSAoVWludDE2ICopKHRvKTsgICAgICAgICAgICAgICAgICAgXAogICAgICAgIFVpbnQzMiBBTFBIQSA9IGFscGhhID4+IDM7ICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBmb3IoaSA9IDA7IGkgPCAoaW50KShsZW5ndGgpOyBpKyspIHsgICAgICAgICAgICBcCiAgICAgICAgICAgIFVpbnQzMiBzID0gKnNyYysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBVaW50MzIgZCA9ICpkc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgcyA9IChzIHwgcyA8PCAxNikgJiAweDAzZTA3YzFmOyAgICAgICAgICAgICBcCiAgICAgICAgICAgIGQgPSAoZCB8IGQgPDwgMTYpICYgMHgwM2UwN2MxZjsgICAgICAgICAgICAgXAogICAgICAgICAgICBkICs9IChzIC0gZCkgKiBBTFBIQSA+PiA1OyAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgZCAmPSAweDAzZTA3YzFmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICpkc3QrKyA9IChVaW50MTYpKGQgfCBkID4+IDE2KTsgICAgICAgICAgICAgXAogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIH0gd2hpbGUoMCkKCi8qCiAqIFRoZSBnZW5lcmFsIHNsb3cgY2F0Y2gtYWxsIGZ1bmN0aW9uLCBmb3IgcmVtYWluaW5nIGRlcHRocyBhbmQgZm9ybWF0cwogKi8KI2RlZmluZSBBTFBIQV9CTElUX0FOWSh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhKSAgICAgICAgICAgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBVaW50OCAqc3JjID0gZnJvbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBVaW50OCAqZHN0ID0gdG87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludCkobGVuZ3RoKTsgaSsrKSB7ICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgVWludDMyIHMsIGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgdW5zaWduZWQgcnMsIGdzLCBicywgcmQsIGdkLCBiZDsgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgc3dpdGNoIChicHApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgY2FzZSAyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIHMgPSAqKFVpbnQxNiAqKXNyYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGQgPSAqKFVpbnQxNiAqKWRzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGlmIChTRExfQllURU9SREVSID09IFNETF9CSUdfRU5ESUFOKSB7ICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICBzID0gKHNyY1swXSA8PCAxNikgfCAoc3JjWzFdIDw8IDgpIHwgc3JjWzJdOyBcCiAgICAgICAgICAgICAgICAgICAgZCA9IChkc3RbMF0gPDwgMTYpIHwgKGRzdFsxXSA8PCA4KSB8IGRzdFsyXTsgXAogICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIHMgPSAoc3JjWzJdIDw8IDE2KSB8IChzcmNbMV0gPDwgOCkgfCBzcmNbMF07IFwKICAgICAgICAgICAgICAgICAgICBkID0gKGRzdFsyXSA8PCAxNikgfCAoZHN0WzFdIDw8IDgpIHwgZHN0WzBdOyBcCiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNhc2UgNDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBzID0gKihVaW50MzIgKilzcmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBkID0gKihVaW50MzIgKilkc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIFJHQl9GUk9NX1BJWEVMKHMsIGZtdCwgcnMsIGdzLCBicyk7ICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIFJHQl9GUk9NX1BJWEVMKGQsIGZtdCwgcmQsIGdkLCBiZCk7ICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHJkICs9IChycyAtIHJkKSAqIGFscGhhID4+IDg7ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGdkICs9IChncyAtIGdkKSAqIGFscGhhID4+IDg7ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGJkICs9IChicyAtIGJkKSAqIGFscGhhID4+IDg7ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIFBJWEVMX0ZST01fUkdCKGQsIGZtdCwgcmQsIGdkLCBiZCk7ICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHN3aXRjaCAoYnBwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAqKFVpbnQxNiAqKWRzdCA9IChVaW50MTYpZDsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBpZiAoU0RMX0JZVEVPUkRFUiA9PSBTRExfQklHX0VORElBTikgeyAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgZHN0WzBdID0gKFVpbnQ4KShkID4+IDE2KTsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgZHN0WzFdID0gKFVpbnQ4KShkID4+IDgpOyAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgZHN0WzJdID0gKFVpbnQ4KShkKTsgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgZHN0WzBdID0gKFVpbnQ4KWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgZHN0WzFdID0gKFVpbnQ4KShkID4+IDgpOyAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgZHN0WzJdID0gKFVpbnQ4KShkID4+IDE2KTsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNhc2UgNDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAqKFVpbnQzMiAqKWRzdCA9IGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHNyYyArPSBicHA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGRzdCArPSBicHA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICB9IHdoaWxlKDApCgovKgogKiBTcGVjaWFsIGNhc2U6IDUwJSBhbHBoYSAoYWxwaGE9MTI4KQogKiBUaGlzIGlzIHRyZWF0ZWQgc3BlY2lhbGx5IGJlY2F1c2UgaXQgY2FuIGJlIG9wdGltaXplZCB2ZXJ5IHdlbGwsIGFuZAogKiBzaW5jZSBpdCBpcyBnb29kIGZvciBtYW55IGNhc2VzIG9mIHNlbWktdHJhbnNsdWNlbmN5LgogKiBUaGUgdGhlb3J5IGlzIHRvIGRvIGFsbCB0aHJlZSBjb21wb25lbnRzIGF0IHRoZSBzYW1lIHRpbWU6CiAqIEZpcnN0IHplcm8gdGhlIGxvd2VzdCBiaXQgb2YgZWFjaCBjb21wb25lbnQsIHdoaWNoIGdpdmVzIHVzIHJvb20gdG8KICogYWRkIHRoZW0uIFRoZW4gc2hpZnQgcmlnaHQgYW5kIGFkZCB0aGUgc3VtIG9mIHRoZSBsb3dlc3QgYml0cy4KICovCiNkZWZpbmUgQUxQSEFfQkxJVDMyXzg4OF81MCh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhKSAgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDMyICpzcmMgPSAoVWludDMyICopKGZyb20pOyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDMyICpkc3QgPSAoVWludDMyICopKHRvKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZm9yKGkgPSAwOyBpIDwgKGludCkobGVuZ3RoKTsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIFVpbnQzMiBzID0gKnNyYysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIFVpbnQzMiBkID0gKmRzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICpkc3QrKyA9ICgoKHMgJiAweDAwZmVmZWZlKSArIChkICYgMHgwMGZlZmVmZSkpID4+IDEpIFwKICAgICAgICAgICAgICAgICArIChzICYgZCAmIDB4MDAwMTAxMDEpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIH0gd2hpbGUoMCkKCi8qCiAqIEZvciAxNmJwcCwgd2UgY2FuIGFjdHVhbGx5IGJsZW5kIHR3byBwaXhlbHMgaW4gcGFyYWxsZWwsIGlmIHdlIHRha2UKICogY2FyZSB0byBzaGlmdCBiZWZvcmUgd2UgYWRkLCBub3QgYWZ0ZXIuCiAqLwoKLyogaGVscGVyOiBibGVuZCBhIHNpbmdsZSAxNiBiaXQgcGl4ZWwgYXQgNTAlICovCiNkZWZpbmUgQkxFTkQxNl81MChkc3QsIHNyYywgbWFzaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDMyIHMgPSAqc3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDMyIGQgPSAqZHN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgKmRzdCsrID0gKFVpbnQxNikoKCgocyAmIG1hc2spICsgKGQgJiBtYXNrKSkgPj4gMSkgKyAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgKHMgJiBkICYgKH5tYXNrICYgMHhmZmZmKSkpOyAgICAgICAgICBcCiAgICB9IHdoaWxlKDApCgovKiBiYXNpYyAxNmJwcCBibGVuZGVyLiBtYXNrIGlzIHRoZSBwaXhlbHMgdG8ga2VlcCB3aGVuIGFkZGluZy4gKi8KI2RlZmluZSBBTFBIQV9CTElUMTZfNTAodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSwgbWFzaykgICAgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB1bnNpZ25lZCBuID0gKGxlbmd0aCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBVaW50MTYgKnNyYyA9IChVaW50MTYgKikoZnJvbSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBVaW50MTYgKmRzdCA9IChVaW50MTYgKikodG8pOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpZiAoKCh1aW50cHRyX3Qpc3JjIF4gKHVpbnRwdHJfdClkc3QpICYgMykgeyAgICAgICAgICAgIFwKICAgICAgICAgICAgLyogc291cmNlIGFuZCBkZXN0aW5hdGlvbiBub3QgaW4gcGhhc2UsIGJsaXQgb25lIGJ5IG9uZSAqLyBcCiAgICAgICAgICAgIHdoaWxlIChuLS0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBCTEVORDE2XzUwKGRzdCwgc3JjLCBtYXNrKTsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGlmICgodWludHB0cl90KXNyYyAmIDMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAvKiBmaXJzdCBvZGQgcGl4ZWwgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBCTEVORDE2XzUwKGRzdCwgc3JjLCBtYXNrKTsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBuLS07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGZvciAoOyBuID4gMTsgbiAtPSAyKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBVaW50MzIgcyA9ICooVWludDMyICopc3JjOyAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBVaW50MzIgZCA9ICooVWludDMyICopZHN0OyAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAqKFVpbnQzMiAqKWRzdCA9ICgocyAmIChtYXNrIHwgbWFzayA8PCAxNikpID4+IDEpIFwKICAgICAgICAgICAgICAgICAgICArICgoZCAmIChtYXNrIHwgbWFzayA8PCAxNikpID4+IDEpICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICArIChzICYgZCAmICh+KG1hc2sgfCBtYXNrIDw8IDE2KSkpOyAgICAgICAgIFwKICAgICAgICAgICAgICAgIHNyYyArPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGRzdCArPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaWYgKG4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIEJMRU5EMTZfNTAoZHN0LCBzcmMsIG1hc2spOyAvKiBsYXN0IG9kZCBwaXhlbCAqLyBcCiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICB9IHdoaWxlKDApCgojZGVmaW5lIEFMUEhBX0JMSVQxNl81NjVfNTAodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSkgICAgICAgXAogICAgQUxQSEFfQkxJVDE2XzUwKHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEsIDB4ZjdkZVUpCgojZGVmaW5lIEFMUEhBX0JMSVQxNl81NTVfNTAodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSkgICAgICAgXAogICAgQUxQSEFfQkxJVDE2XzUwKHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEsIDB4ZmJkZVUpCgojZGVmaW5lIENIT09TRV9CTElUKGJsaXR0ZXIsIGFscGhhLCBmbXQpICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGlmIChhbHBoYSA9PSAyNTUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBzd2l0Y2ggKGZtdC0+Qnl0ZXNQZXJQaXhlbCkgeyAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBjYXNlIDE6IGJsaXR0ZXIoMSwgVWludDgsIE9QQVFVRV9CTElUKTsgYnJlYWs7ICAgICAgXAogICAgICAgICAgICBjYXNlIDI6IGJsaXR0ZXIoMiwgVWludDgsIE9QQVFVRV9CTElUKTsgYnJlYWs7ICAgICAgXAogICAgICAgICAgICBjYXNlIDM6IGJsaXR0ZXIoMywgVWludDgsIE9QQVFVRV9CTElUKTsgYnJlYWs7ICAgICAgXAogICAgICAgICAgICBjYXNlIDQ6IGJsaXR0ZXIoNCwgVWludDE2LCBPUEFRVUVfQkxJVCk7IGJyZWFrOyAgICAgXAogICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBzd2l0Y2ggKGZtdC0+Qnl0ZXNQZXJQaXhlbCkgeyAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgLyogTm8gOGJwcCBhbHBoYSBibGl0dGluZyAqLyAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgc3dpdGNoIChmbXQtPlJtYXNrIHwgZm10LT5HbWFzayB8IGZtdC0+Qm1hc2spIHsgXAogICAgICAgICAgICAgICAgY2FzZSAweGZmZmY6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIGlmIChmbXQtPkdtYXNrID09IDB4MDdlMCAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICB8fCBmbXQtPlJtYXNrID09IDB4MDdlMCAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICB8fCBmbXQtPkJtYXNrID09IDB4MDdlMCkgeyAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxwaGEgPT0gMTI4KSB7ICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxpdHRlcigyLCBVaW50OCwgQUxQSEFfQkxJVDE2XzU2NV81MCk7IFwKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsaXR0ZXIoMiwgVWludDgsIEFMUEhBX0JMSVQxNl81NjUpOyBcCiAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZ2VuZXJhbDE2OyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBjYXNlIDB4N2ZmZjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgaWYgKGZtdC0+R21hc2sgPT0gMHgwM2UwICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgIHx8IGZtdC0+Um1hc2sgPT0gMHgwM2UwICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgIHx8IGZtdC0+Qm1hc2sgPT0gMHgwM2UwKSB7ICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbHBoYSA9PSAxMjgpIHsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGl0dGVyKDIsIFVpbnQ4LCBBTFBIQV9CTElUMTZfNTU1XzUwKTsgXAogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxpdHRlcigyLCBVaW50OCwgQUxQSEFfQkxJVDE2XzU1NSk7IFwKICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgZ290byBnZW5lcmFsMTY7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIGdlbmVyYWwxNjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICBibGl0dGVyKDIsIFVpbnQ4LCBBTFBIQV9CTElUX0FOWSk7ICAgICAgICAgIFwKICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGJsaXR0ZXIoMywgVWludDgsIEFMUEhBX0JMSVRfQU5ZKTsgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgY2FzZSA0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGlmICgoZm10LT5SbWFzayB8IGZtdC0+R21hc2sgfCBmbXQtPkJtYXNrKSA9PSAweDAwZmZmZmZmIFwKICAgICAgICAgICAgICAgICAgICAmJiAoZm10LT5HbWFzayA9PSAweGZmMDAgfHwgZm10LT5SbWFzayA9PSAweGZmMDAgXAogICAgICAgICAgICAgICAgICAgIHx8IGZtdC0+Qm1hc2sgPT0gMHhmZjAwKSkgeyAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIGlmIChhbHBoYSA9PSAxMjgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICBibGl0dGVyKDQsIFVpbnQxNiwgQUxQSEFfQkxJVDMyXzg4OF81MCk7IFwKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgYmxpdHRlcig0LCBVaW50MTYsIEFMUEhBX0JMSVQzMl84ODgpOyAgIFwKICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIH0gZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICBibGl0dGVyKDQsIFVpbnQxNiwgQUxQSEFfQkxJVF9BTlkpOyAgICAgICAgIFwKICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIH0gd2hpbGUoMCkKCi8qCiAqIFNldCBhIHBpeGVsIHZhbHVlIHVzaW5nIHRoZSBnaXZlbiBmb3JtYXQsIGV4Y2VwdCB0aGF0IHRoZSBhbHBoYSB2YWx1ZSBpcwogKiBwbGFjZWQgaW4gdGhlIHRvcCBieXRlLiBUaGlzIGlzIHRoZSBmb3JtYXQgdXNlZCBmb3IgUkxFIHdpdGggYWxwaGEuCiAqLwojZGVmaW5lIFJMRVBJWEVMX0ZST01fUkdCQShQaXhlbCwgZm10LCByLCBnLCBiLCBhKSAgICAgICAgICAgICAgICAgICAgICBcCnsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIFBpeGVsID0gKChyPj5mbXQtPlJsb3NzKTw8Zm10LT5Sc2hpZnQpfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICgoZz4+Zm10LT5HbG9zcyk8PGZtdC0+R3NoaWZ0KXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgKChiPj5mbXQtPkJsb3NzKTw8Zm10LT5Cc2hpZnQpfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAoYTw8MjQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAp9CgovKgogKiBUaGlzIHRha2VzIGNhcmUgb2YgdGhlIGNhc2Ugd2hlbiB0aGUgc3VyZmFjZSBpcyBjbGlwcGVkIG9uIHRoZSBsZWZ0IGFuZC9vcgogKiByaWdodC4gVG9wIGNsaXBwaW5nIGhhcyBhbHJlYWR5IGJlZW4gdGFrZW4gY2FyZSBvZi4KICovCnN0YXRpYyB2b2lkClJMRUNsaXBCbGl0KGludCB3LCBVaW50OCAqIHNyY2J1ZiwgU0RMX1N1cmZhY2UgKiBzdXJmX2RzdCwKICAgICAgICAgICAgVWludDggKiBkc3RidWYsIFNETF9SZWN0ICogc3JjcmVjdCwgdW5zaWduZWQgYWxwaGEpCnsKICAgIFNETF9QaXhlbEZvcm1hdCAqZm10ID0gc3VyZl9kc3QtPmZvcm1hdDsKCiNkZWZpbmUgUkxFQ0xJUEJMSVQoYnBwLCBUeXBlLCBkb19ibGl0KSAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaW50IGxpbmVjb3VudCA9IHNyY3JlY3QtPmg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaW50IG9mcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaW50IGxlZnQgPSBzcmNyZWN0LT54OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaW50IHJpZ2h0ID0gbGVmdCArIHNyY3JlY3QtPnc7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZHN0YnVmIC09IGxlZnQgKiBicHA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZm9yICg7OykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGludCBydW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIG9mcyArPSAqKFR5cGUgKilzcmNidWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHJ1biA9ICgoVHlwZSAqKXNyY2J1ZilbMV07ICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHNyY2J1ZiArPSAyICogc2l6ZW9mKFR5cGUpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGlmIChydW4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAvKiBjbGlwIHRvIGxlZnQgYW5kIHJpZ2h0IGJvcmRlcnMgKi8gICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBpZiAob2ZzIDwgcmlnaHQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgaW50IGxlbiA9IHJ1bjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0Y29sOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgaWYgKGxlZnQgLSBvZnMgPiAwKSB7ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gbGVmdCAtIG9mczsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtPSBzdGFydDsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPD0gMCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG5vY29weSAjIyBicHAgIyMgZG9fYmxpdDsgICAgICBcCiAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgc3RhcnRjb2wgPSBvZnMgKyBzdGFydDsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA+IHJpZ2h0IC0gc3RhcnRjb2wpICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IHJpZ2h0IC0gc3RhcnRjb2w7ICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgZG9fYmxpdChkc3RidWYgKyBzdGFydGNvbCAqIGJwcCwgc3JjYnVmICsgc3RhcnQgKiBicHAsIFwKICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBicHAsIGFscGhhKTsgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIG5vY29weSAjIyBicHAgIyMgZG9fYmxpdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIHNyY2J1ZiArPSBydW4gKiBicHA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIG9mcyArPSBydW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgfSBlbHNlIGlmICghb2ZzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaWYgKG9mcyA9PSB3KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIG9mcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGRzdGJ1ZiArPSBzdXJmX2RzdC0+cGl0Y2g7ICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGlmICghLS1saW5lY291bnQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIH0gd2hpbGUoMCkKCiAgICBDSE9PU0VfQkxJVChSTEVDTElQQkxJVCwgYWxwaGEsIGZtdCk7CgojdW5kZWYgUkxFQ0xJUEJMSVQKCn0KCgovKiBibGl0IGEgY29sb3JrZXllZCBSTEUgc3VyZmFjZSAqLwpzdGF0aWMgaW50IFNETENBTEwKU0RMX1JMRUJsaXQoU0RMX1N1cmZhY2UgKiBzdXJmX3NyYywgU0RMX1JlY3QgKiBzcmNyZWN0LAogICAgICAgICAgICBTRExfU3VyZmFjZSAqIHN1cmZfZHN0LCBTRExfUmVjdCAqIGRzdHJlY3QpCnsKICAgIFVpbnQ4ICpkc3RidWY7CiAgICBVaW50OCAqc3JjYnVmOwogICAgaW50IHgsIHk7CiAgICBpbnQgdyA9IHN1cmZfc3JjLT53OwogICAgdW5zaWduZWQgYWxwaGE7CgogICAgLyogTG9jayB0aGUgZGVzdGluYXRpb24gaWYgbmVjZXNzYXJ5ICovCiAgICBpZiAoU0RMX01VU1RMT0NLKHN1cmZfZHN0KSkgewogICAgICAgIGlmIChTRExfTG9ja1N1cmZhY2Uoc3VyZl9kc3QpIDwgMCkgewogICAgICAgICAgICByZXR1cm4gKC0xKTsKICAgICAgICB9CiAgICB9CgogICAgLyogU2V0IHVwIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHBvaW50ZXJzICovCiAgICB4ID0gZHN0cmVjdC0+eDsKICAgIHkgPSBkc3RyZWN0LT55OwogICAgZHN0YnVmID0gKFVpbnQ4ICopIHN1cmZfZHN0LT5waXhlbHMKICAgICAgICArIHkgKiBzdXJmX2RzdC0+cGl0Y2ggKyB4ICogc3VyZl9zcmMtPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbDsKICAgIHNyY2J1ZiA9IChVaW50OCAqKSBzdXJmX3NyYy0+bWFwLT5kYXRhOwoKICAgIHsKICAgICAgICAvKiBza2lwIGxpbmVzIGF0IHRoZSB0b3AgaWYgbmVjZXNzYXJ5ICovCiAgICAgICAgaW50IHZza2lwID0gc3JjcmVjdC0+eTsKICAgICAgICBpbnQgb2ZzID0gMDsKICAgICAgICBpZiAodnNraXApIHsKCiNkZWZpbmUgUkxFU0tJUChicHAsIFR5cGUpICAgICAgICAgIFwKICAgICAgICBmb3IoOzspIHsgICAgICAgICAgIFwKICAgICAgICAgICAgaW50IHJ1bjsgICAgICAgICAgICBcCiAgICAgICAgICAgIG9mcyArPSAqKFR5cGUgKilzcmNidWY7IFwKICAgICAgICAgICAgcnVuID0gKChUeXBlICopc3JjYnVmKVsxXTsgIFwKICAgICAgICAgICAgc3JjYnVmICs9IHNpemVvZihUeXBlKSAqIDI7IFwKICAgICAgICAgICAgaWYocnVuKSB7ICAgICAgICAgICBcCiAgICAgICAgICAgIHNyY2J1ZiArPSBydW4gKiBicHA7ICAgIFwKICAgICAgICAgICAgb2ZzICs9IHJ1bjsgICAgIFwKICAgICAgICAgICAgfSBlbHNlIGlmKCFvZnMpICAgICBcCiAgICAgICAgICAgIGdvdG8gZG9uZTsgICAgICBcCiAgICAgICAgICAgIGlmKG9mcyA9PSB3KSB7ICAgICAgXAogICAgICAgICAgICBvZnMgPSAwOyAgICAgICAgXAogICAgICAgICAgICBpZighLS12c2tpcCkgICAgICAgIFwKICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgIFwKICAgICAgICAgICAgfSAgICAgICAgICAgICAgIFwKICAgICAgICB9CgogICAgICAgICAgICBzd2l0Y2ggKHN1cmZfc3JjLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWwpIHsKICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgUkxFU0tJUCgxLCBVaW50OCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgUkxFU0tJUCgyLCBVaW50OCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgUkxFU0tJUCgzLCBVaW50OCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgUkxFU0tJUCg0LCBVaW50MTYpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiN1bmRlZiBSTEVTS0lQCgogICAgICAgIH0KICAgIH0KCiAgICBhbHBoYSA9IHN1cmZfc3JjLT5tYXAtPmluZm8uYTsKICAgIC8qIGlmIGxlZnQgb3IgcmlnaHQgZWRnZSBjbGlwcGluZyBuZWVkZWQsIGNhbGwgY2xpcCBibGl0ICovCiAgICBpZiAoc3JjcmVjdC0+eCB8fCBzcmNyZWN0LT53ICE9IHN1cmZfc3JjLT53KSB7CiAgICAgICAgUkxFQ2xpcEJsaXQodywgc3JjYnVmLCBzdXJmX2RzdCwgZHN0YnVmLCBzcmNyZWN0LCBhbHBoYSk7CiAgICB9IGVsc2UgewogICAgICAgIFNETF9QaXhlbEZvcm1hdCAqZm10ID0gc3VyZl9zcmMtPmZvcm1hdDsKCiNkZWZpbmUgUkxFQkxJVChicHAsIFR5cGUsIGRvX2JsaXQpICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaW50IGxpbmVjb3VudCA9IHNyY3JlY3QtPmg7ICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpbnQgb2ZzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZm9yKDs7KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHVuc2lnbmVkIHJ1bjsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBvZnMgKz0gKihUeXBlICopc3JjYnVmOyAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHJ1biA9ICgoVHlwZSAqKXNyY2J1ZilbMV07ICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHNyY2J1ZiArPSAyICogc2l6ZW9mKFR5cGUpOyAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGlmKHJ1bikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBkb19ibGl0KGRzdGJ1ZiArIG9mcyAqIGJwcCwgc3JjYnVmLCBydW4sIGJwcCwgYWxwaGEpOyBcCiAgICAgICAgICAgIHNyY2J1ZiArPSBydW4gKiBicHA7ICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgb2ZzICs9IHJ1bjsgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgfSBlbHNlIGlmKCFvZnMpICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGlmKG9mcyA9PSB3KSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBvZnMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBkc3RidWYgKz0gc3VyZl9kc3QtPnBpdGNoOyAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaWYoIS0tbGluZWNvdW50KSAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9IHdoaWxlKDApCgogICAgICAgIENIT09TRV9CTElUKFJMRUJMSVQsIGFscGhhLCBmbXQpOwoKI3VuZGVmIFJMRUJMSVQKICAgIH0KCiAgZG9uZToKICAgIC8qIFVubG9jayB0aGUgZGVzdGluYXRpb24gaWYgbmVjZXNzYXJ5ICovCiAgICBpZiAoU0RMX01VU1RMT0NLKHN1cmZfZHN0KSkgewogICAgICAgIFNETF9VbmxvY2tTdXJmYWNlKHN1cmZfZHN0KTsKICAgIH0KICAgIHJldHVybiAoMCk7Cn0KCiN1bmRlZiBPUEFRVUVfQkxJVAoKLyoKICogUGVyLXBpeGVsIGJsaXR0aW5nIG1hY3JvcyBmb3IgdHJhbnNsdWNlbnQgcGl4ZWxzOgogKiBUaGVzZSB1c2UgdGhlIHNhbWUgdGVjaG5pcXVlcyBhcyB0aGUgcGVyLXN1cmZhY2UgYmxpdHRpbmcgbWFjcm9zCiAqLwoKLyoKICogRm9yIDMyYnBwIHBpeGVscywgd2UgaGF2ZSBtYWRlIHN1cmUgdGhlIGFscGhhIGlzIHN0b3JlZCBpbiB0aGUgdG9wCiAqIDggYml0cywgc28gcHJvY2VlZCBhcyB1c3VhbAogKi8KI2RlZmluZSBCTElUX1RSQU5TTF84ODgoc3JjLCBkc3QpICAgICAgICAgICAgICAgXAogICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDMyIHMgPSBzcmM7ICAgICAgICAgICAgICAgICAgICAgXAogICAgVWludDMyIGQgPSBkc3Q7ICAgICAgICAgICAgICAgICAgICAgXAogICAgdW5zaWduZWQgYWxwaGEgPSBzID4+IDI0OyAgICAgICAgICAgICAgIFwKICAgIFVpbnQzMiBzMSA9IHMgJiAweGZmMDBmZjsgICAgICAgICAgICAgICBcCiAgICBVaW50MzIgZDEgPSBkICYgMHhmZjAwZmY7ICAgICAgICAgICAgICAgXAogICAgZDEgPSAoZDEgKyAoKHMxIC0gZDEpICogYWxwaGEgPj4gOCkpICYgMHhmZjAwZmY7ICAgIFwKICAgIHMgJj0gMHhmZjAwOyAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIGQgJj0gMHhmZjAwOyAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIGQgPSAoZCArICgocyAtIGQpICogYWxwaGEgPj4gOCkpICYgMHhmZjAwOyAgICAgIFwKICAgIGRzdCA9IGQxIHwgZCB8IDB4ZmYwMDAwMDA7ICAgICAgICAgICAgICBcCiAgICB9IHdoaWxlKDApCgovKgogKiBGb3IgMTZicHAgcGl4ZWxzLCB3ZSBoYXZlIHN0b3JlZCB0aGUgNSBtb3N0IHNpZ25pZmljYW50IGFscGhhIGJpdHMgaW4KICogYml0cyA1LTEwLiBBcyBiZWZvcmUsIHdlIGNhbiBwcm9jZXNzIGFsbCAzIFJHQiBjb21wb25lbnRzIGF0IHRoZSBzYW1lIHRpbWUuCiAqLwojZGVmaW5lIEJMSVRfVFJBTlNMXzU2NShzcmMsIGRzdCkgICAgICAgXAogICAgZG8geyAgICAgICAgICAgICAgICAgICAgXAogICAgVWludDMyIHMgPSBzcmM7ICAgICAgICAgICAgIFwKICAgIFVpbnQzMiBkID0gZHN0OyAgICAgICAgICAgICBcCiAgICB1bnNpZ25lZCBhbHBoYSA9IChzICYgMHgzZTApID4+IDU7ICBcCiAgICBzICY9IDB4MDdlMGY4MWY7ICAgICAgICAgICAgXAogICAgZCA9IChkIHwgZCA8PCAxNikgJiAweDA3ZTBmODFmOyAgICAgXAogICAgZCArPSAocyAtIGQpICogYWxwaGEgPj4gNTsgICAgICBcCiAgICBkICY9IDB4MDdlMGY4MWY7ICAgICAgICAgICAgXAogICAgZHN0ID0gKFVpbnQxNikoZCB8IGQgPj4gMTYpOyAgICAgICAgICAgIFwKICAgIH0gd2hpbGUoMCkKCiNkZWZpbmUgQkxJVF9UUkFOU0xfNTU1KHNyYywgZHN0KSAgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICBcCiAgICBVaW50MzIgcyA9IHNyYzsgICAgICAgICAgICAgXAogICAgVWludDMyIGQgPSBkc3Q7ICAgICAgICAgICAgIFwKICAgIHVuc2lnbmVkIGFscGhhID0gKHMgJiAweDNlMCkgPj4gNTsgIFwKICAgIHMgJj0gMHgwM2UwN2MxZjsgICAgICAgICAgICBcCiAgICBkID0gKGQgfCBkIDw8IDE2KSAmIDB4MDNlMDdjMWY7ICAgICBcCiAgICBkICs9IChzIC0gZCkgKiBhbHBoYSA+PiA1OyAgICAgIFwKICAgIGQgJj0gMHgwM2UwN2MxZjsgICAgICAgICAgICBcCiAgICBkc3QgPSAoVWludDE2KShkIHwgZCA+PiAxNik7ICAgICAgICAgICAgXAogICAgfSB3aGlsZSgwKQoKLyogdXNlZCB0byBzYXZlIHRoZSBkZXN0aW5hdGlvbiBmb3JtYXQgaW4gdGhlIGVuY29kaW5nLiBEZXNpZ25lZCB0byBiZQogICBtYWNyby1jb21wYXRpYmxlIHdpdGggU0RMX1BpeGVsRm9ybWF0IGJ1dCB3aXRob3V0IHRoZSB1bm5lZWRlZCBmaWVsZHMgKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgVWludDggQnl0ZXNQZXJQaXhlbDsKICAgIFVpbnQ4IHBhZGRpbmdbM107CiAgICBVaW50MzIgUm1hc2s7CiAgICBVaW50MzIgR21hc2s7CiAgICBVaW50MzIgQm1hc2s7CiAgICBVaW50MzIgQW1hc2s7CiAgICBVaW50OCBSbG9zczsKICAgIFVpbnQ4IEdsb3NzOwogICAgVWludDggQmxvc3M7CiAgICBVaW50OCBBbG9zczsKICAgIFVpbnQ4IFJzaGlmdDsKICAgIFVpbnQ4IEdzaGlmdDsKICAgIFVpbnQ4IEJzaGlmdDsKICAgIFVpbnQ4IEFzaGlmdDsKfSBSTEVEZXN0Rm9ybWF0OwoKLyogYmxpdCBhIHBpeGVsLWFscGhhIFJMRSBzdXJmYWNlIGNsaXBwZWQgYXQgdGhlIHJpZ2h0IGFuZC9vciBsZWZ0IGVkZ2VzICovCnN0YXRpYyB2b2lkClJMRUFscGhhQ2xpcEJsaXQoaW50IHcsIFVpbnQ4ICogc3JjYnVmLCBTRExfU3VyZmFjZSAqIHN1cmZfZHN0LAogICAgICAgICAgICAgICAgIFVpbnQ4ICogZHN0YnVmLCBTRExfUmVjdCAqIHNyY3JlY3QpCnsKICAgIFNETF9QaXhlbEZvcm1hdCAqZGYgPSBzdXJmX2RzdC0+Zm9ybWF0OwogICAgLyoKICAgICAqIGNsaXBwZWQgYmxpdHRlcjogUHR5cGUgaXMgdGhlIGRlc3RpbmF0aW9uIHBpeGVsIHR5cGUsCiAgICAgKiBDdHlwZSB0aGUgdHJhbnNsdWNlbnQgY291bnQgdHlwZSwgYW5kIGRvX2JsZW5kIHRoZSBtYWNybwogICAgICogdG8gYmxlbmQgb25lIHBpeGVsLgogICAgICovCiNkZWZpbmUgUkxFQUxQSEFDTElQQkxJVChQdHlwZSwgQ3R5cGUsIGRvX2JsZW5kKSAgICAgICAgICAgICAgXAogICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBpbnQgbGluZWNvdW50ID0gc3JjcmVjdC0+aDsgICAgICAgICAgICAgICAgICAgXAogICAgaW50IGxlZnQgPSBzcmNyZWN0LT54OyAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIGludCByaWdodCA9IGxlZnQgKyBzcmNyZWN0LT53OyAgICAgICAgICAgICAgICAgICAgXAogICAgZHN0YnVmIC09IGxlZnQgKiBzaXplb2YoUHR5cGUpOyAgICAgICAgICAgICAgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpbnQgb2ZzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAvKiBibGl0IG9wYXF1ZSBwaXhlbHMgb24gb25lIGxpbmUgKi8gICAgICAgICAgICAgIFwKICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIHVuc2lnbmVkIHJ1bjsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIG9mcyArPSAoKEN0eXBlICopc3JjYnVmKVswXTsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgcnVuID0gKChDdHlwZSAqKXNyY2J1ZilbMV07ICAgICAgICAgICAgICAgXAogICAgICAgIHNyY2J1ZiArPSAyICogc2l6ZW9mKEN0eXBlKTsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaWYocnVuKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgLyogY2xpcCB0byBsZWZ0IGFuZCByaWdodCBib3JkZXJzICovICAgICAgICAgIFwKICAgICAgICAgICAgaW50IGNvZnMgPSBvZnM7ICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaW50IGNydW4gPSBydW47ICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaWYobGVmdCAtIGNvZnMgPiAwKSB7ICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNydW4gLT0gbGVmdCAtIGNvZnM7ICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBjb2ZzID0gbGVmdDsgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGlmKGNydW4gPiByaWdodCAtIGNvZnMpICAgICAgICAgICAgICAgXAogICAgICAgICAgICBjcnVuID0gcmlnaHQgLSBjb2ZzOyAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaWYoY3J1biA+IDApICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgUElYRUxfQ09QWShkc3RidWYgKyBjb2ZzICogc2l6ZW9mKFB0eXBlKSwgICAgIFwKICAgICAgICAgICAgICAgICAgIHNyY2J1ZiArIChjb2ZzIC0gb2ZzKSAqIHNpemVvZihQdHlwZSksIFwKICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCljcnVuLCBzaXplb2YoUHR5cGUpKTsgICAgXAogICAgICAgICAgICBzcmNidWYgKz0gcnVuICogc2l6ZW9mKFB0eXBlKTsgICAgICAgICAgICBcCiAgICAgICAgICAgIG9mcyArPSBydW47ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSBlbHNlIGlmKCFvZnMpICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9IHdoaWxlKG9mcyA8IHcpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgLyogc2tpcCBwYWRkaW5nIGlmIG5lY2Vzc2FyeSAqLyAgICAgICAgICAgICAgIFwKICAgICAgICBpZihzaXplb2YoUHR5cGUpID09IDIpICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgc3JjYnVmICs9ICh1aW50cHRyX3Qpc3JjYnVmICYgMjsgICAgICAgICAgICAgIFwKICAgICAgICAvKiBibGl0IHRyYW5zbHVjZW50IHBpeGVscyBvbiB0aGUgc2FtZSBsaW5lICovICAgICAgICBcCiAgICAgICAgb2ZzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB1bnNpZ25lZCBydW47ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBvZnMgKz0gKChVaW50MTYgKilzcmNidWYpWzBdOyAgICAgICAgICAgICAgICAgXAogICAgICAgIHJ1biA9ICgoVWludDE2ICopc3JjYnVmKVsxXTsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgc3JjYnVmICs9IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaWYocnVuKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgLyogY2xpcCB0byBsZWZ0IGFuZCByaWdodCBib3JkZXJzICovICAgICAgICAgIFwKICAgICAgICAgICAgaW50IGNvZnMgPSBvZnM7ICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaW50IGNydW4gPSBydW47ICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaWYobGVmdCAtIGNvZnMgPiAwKSB7ICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNydW4gLT0gbGVmdCAtIGNvZnM7ICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBjb2ZzID0gbGVmdDsgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGlmKGNydW4gPiByaWdodCAtIGNvZnMpICAgICAgICAgICAgICAgXAogICAgICAgICAgICBjcnVuID0gcmlnaHQgLSBjb2ZzOyAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaWYoY3J1biA+IDApIHsgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgUHR5cGUgKmRzdCA9IChQdHlwZSAqKWRzdGJ1ZiArIGNvZnM7ICAgICAgICAgIFwKICAgICAgICAgICAgVWludDMyICpzcmMgPSAoVWludDMyICopc3JjYnVmICsgKGNvZnMgLSBvZnMpOyAgICBcCiAgICAgICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgY3J1bjsgaSsrKSAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBkb19ibGVuZChzcmNbaV0sIGRzdFtpXSk7ICAgICAgICAgICAgIFwKICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBzcmNidWYgKz0gcnVuICogNDsgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgb2ZzICs9IHJ1bjsgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSB3aGlsZShvZnMgPCB3KTsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGRzdGJ1ZiArPSBzdXJmX2RzdC0+cGl0Y2g7ICAgICAgICAgICAgICAgICAgICAgXAogICAgfSB3aGlsZSgtLWxpbmVjb3VudCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIH0gd2hpbGUoMCkKCiAgICBzd2l0Y2ggKGRmLT5CeXRlc1BlclBpeGVsKSB7CiAgICBjYXNlIDI6CiAgICAgICAgaWYgKGRmLT5HbWFzayA9PSAweDA3ZTAgfHwgZGYtPlJtYXNrID09IDB4MDdlMCB8fCBkZi0+Qm1hc2sgPT0gMHgwN2UwKQogICAgICAgICAgICBSTEVBTFBIQUNMSVBCTElUKFVpbnQxNiwgVWludDgsIEJMSVRfVFJBTlNMXzU2NSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBSTEVBTFBIQUNMSVBCTElUKFVpbnQxNiwgVWludDgsIEJMSVRfVFJBTlNMXzU1NSk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDQ6CiAgICAgICAgUkxFQUxQSEFDTElQQkxJVChVaW50MzIsIFVpbnQxNiwgQkxJVF9UUkFOU0xfODg4KTsKICAgICAgICBicmVhazsKICAgIH0KfQoKLyogYmxpdCBhIHBpeGVsLWFscGhhIFJMRSBzdXJmYWNlICovCnN0YXRpYyBpbnQgU0RMQ0FMTApTRExfUkxFQWxwaGFCbGl0KFNETF9TdXJmYWNlICogc3VyZl9zcmMsIFNETF9SZWN0ICogc3JjcmVjdCwKICAgICAgICAgICAgICAgICBTRExfU3VyZmFjZSAqIHN1cmZfZHN0LCBTRExfUmVjdCAqIGRzdHJlY3QpCnsKICAgIGludCB4LCB5OwogICAgaW50IHcgPSBzdXJmX3NyYy0+dzsKICAgIFVpbnQ4ICpzcmNidWYsICpkc3RidWY7CiAgICBTRExfUGl4ZWxGb3JtYXQgKmRmID0gc3VyZl9kc3QtPmZvcm1hdDsKCiAgICAvKiBMb2NrIHRoZSBkZXN0aW5hdGlvbiBpZiBuZWNlc3NhcnkgKi8KICAgIGlmIChTRExfTVVTVExPQ0soc3VyZl9kc3QpKSB7CiAgICAgICAgaWYgKFNETF9Mb2NrU3VyZmFjZShzdXJmX2RzdCkgPCAwKSB7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICB9CgogICAgeCA9IGRzdHJlY3QtPng7CiAgICB5ID0gZHN0cmVjdC0+eTsKICAgIGRzdGJ1ZiA9IChVaW50OCAqKSBzdXJmX2RzdC0+cGl4ZWxzICsgeSAqIHN1cmZfZHN0LT5waXRjaCArIHggKiBkZi0+Qnl0ZXNQZXJQaXhlbDsKICAgIHNyY2J1ZiA9IChVaW50OCAqKSBzdXJmX3NyYy0+bWFwLT5kYXRhICsgc2l6ZW9mKFJMRURlc3RGb3JtYXQpOwoKICAgIHsKICAgICAgICAvKiBza2lwIGxpbmVzIGF0IHRoZSB0b3AgaWYgbmVjZXNzYXJ5ICovCiAgICAgICAgaW50IHZza2lwID0gc3JjcmVjdC0+eTsKICAgICAgICBpZiAodnNraXApIHsKICAgICAgICAgICAgaW50IG9mczsKICAgICAgICAgICAgaWYgKGRmLT5CeXRlc1BlclBpeGVsID09IDIpIHsKICAgICAgICAgICAgICAgIC8qIHRoZSAxNi8zMiBpbnRlcmxlYXZlZCBmb3JtYXQgKi8KICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICAvKiBza2lwIG9wYXF1ZSBsaW5lICovCiAgICAgICAgICAgICAgICAgICAgb2ZzID0gMDsKICAgICAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgICAgIGludCBydW47CiAgICAgICAgICAgICAgICAgICAgICAgIG9mcyArPSBzcmNidWZbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIHJ1biA9IHNyY2J1ZlsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgc3JjYnVmICs9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY2J1ZiArPSAyICogcnVuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZzICs9IHJ1bjsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghb2ZzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOwogICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKG9mcyA8IHcpOwoKICAgICAgICAgICAgICAgICAgICAvKiBza2lwIHBhZGRpbmcgKi8KICAgICAgICAgICAgICAgICAgICBzcmNidWYgKz0gKHVpbnRwdHJfdCkgc3JjYnVmICYgMjsKCiAgICAgICAgICAgICAgICAgICAgLyogc2tpcCB0cmFuc2x1Y2VudCBsaW5lICovCiAgICAgICAgICAgICAgICAgICAgb2ZzID0gMDsKICAgICAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgICAgIGludCBydW47CiAgICAgICAgICAgICAgICAgICAgICAgIG9mcyArPSAoKFVpbnQxNiAqKSBzcmNidWYpWzBdOwogICAgICAgICAgICAgICAgICAgICAgICBydW4gPSAoKFVpbnQxNiAqKSBzcmNidWYpWzFdOwogICAgICAgICAgICAgICAgICAgICAgICBzcmNidWYgKz0gNCAqIChydW4gKyAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgb2ZzICs9IHJ1bjsKICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChvZnMgPCB3KTsKICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tdnNraXApOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLyogdGhlIDMyLzMyIGludGVybGVhdmVkIGZvcm1hdCAqLwogICAgICAgICAgICAgICAgdnNraXAgPDw9IDE7ICAgIC8qIG9wYXF1ZSBhbmQgdHJhbnNsdWNlbnQgaGF2ZSBzYW1lIGZvcm1hdCAqLwogICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgIG9mcyA9IDA7CiAgICAgICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgICAgICBpbnQgcnVuOwogICAgICAgICAgICAgICAgICAgICAgICBvZnMgKz0gKChVaW50MTYgKikgc3JjYnVmKVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgcnVuID0gKChVaW50MTYgKikgc3JjYnVmKVsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgc3JjYnVmICs9IDQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY2J1ZiArPSA0ICogcnVuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZzICs9IHJ1bjsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghb2ZzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOwogICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKG9mcyA8IHcpOwogICAgICAgICAgICAgICAgfSB3aGlsZSAoLS12c2tpcCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyogaWYgbGVmdCBvciByaWdodCBlZGdlIGNsaXBwaW5nIG5lZWRlZCwgY2FsbCBjbGlwIGJsaXQgKi8KICAgIGlmIChzcmNyZWN0LT54IHx8IHNyY3JlY3QtPncgIT0gc3VyZl9zcmMtPncpIHsKICAgICAgICBSTEVBbHBoYUNsaXBCbGl0KHcsIHNyY2J1Ziwgc3VyZl9kc3QsIGRzdGJ1Ziwgc3JjcmVjdCk7CiAgICB9IGVsc2UgewoKICAgICAgICAvKgogICAgICAgICAqIG5vbi1jbGlwcGVkIGJsaXR0ZXIuIFB0eXBlIGlzIHRoZSBkZXN0aW5hdGlvbiBwaXhlbCB0eXBlLAogICAgICAgICAqIEN0eXBlIHRoZSB0cmFuc2x1Y2VudCBjb3VudCB0eXBlLCBhbmQgZG9fYmxlbmQgdGhlCiAgICAgICAgICogbWFjcm8gdG8gYmxlbmQgb25lIHBpeGVsLgogICAgICAgICAqLwojZGVmaW5lIFJMRUFMUEhBQkxJVChQdHlwZSwgQ3R5cGUsIGRvX2JsZW5kKSAgICAgICAgICAgICAgICAgXAogICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpbnQgbGluZWNvdW50ID0gc3JjcmVjdC0+aDsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGludCBvZnMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgLyogYmxpdCBvcGFxdWUgcGl4ZWxzIG9uIG9uZSBsaW5lICovICAgICAgICAgICAgIFwKICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHVuc2lnbmVkIHJ1bjsgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgb2ZzICs9ICgoQ3R5cGUgKilzcmNidWYpWzBdOyAgICAgICAgICAgICBcCiAgICAgICAgICAgIHJ1biA9ICgoQ3R5cGUgKilzcmNidWYpWzFdOyAgICAgICAgICAgICAgXAogICAgICAgICAgICBzcmNidWYgKz0gMiAqIHNpemVvZihDdHlwZSk7ICAgICAgICAgICAgIFwKICAgICAgICAgICAgaWYocnVuKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBQSVhFTF9DT1BZKGRzdGJ1ZiArIG9mcyAqIHNpemVvZihQdHlwZSksIHNyY2J1ZiwgXAogICAgICAgICAgICAgICAgICAgcnVuLCBzaXplb2YoUHR5cGUpKTsgICAgICAgICAgXAogICAgICAgICAgICBzcmNidWYgKz0gcnVuICogc2l6ZW9mKFB0eXBlKTsgICAgICAgICAgIFwKICAgICAgICAgICAgb2ZzICs9IHJ1bjsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gZWxzZSBpZighb2ZzKSAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgZ290byBkb25lOyAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSB3aGlsZShvZnMgPCB3KTsgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAvKiBza2lwIHBhZGRpbmcgaWYgbmVjZXNzYXJ5ICovICAgICAgICAgICAgICBcCiAgICAgICAgaWYoc2l6ZW9mKFB0eXBlKSA9PSAyKSAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHNyY2J1ZiArPSAodWludHB0cl90KXNyY2J1ZiAmIDI7ICAgICAgICAgICAgIFwKICAgICAgICAvKiBibGl0IHRyYW5zbHVjZW50IHBpeGVscyBvbiB0aGUgc2FtZSBsaW5lICovICAgICAgIFwKICAgICAgICBvZnMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICB1bnNpZ25lZCBydW47ICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIG9mcyArPSAoKFVpbnQxNiAqKXNyY2J1ZilbMF07ICAgICAgICAgICAgXAogICAgICAgICAgICBydW4gPSAoKFVpbnQxNiAqKXNyY2J1ZilbMV07ICAgICAgICAgICAgIFwKICAgICAgICAgICAgc3JjYnVmICs9IDQ7ICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpZihydW4pIHsgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIFB0eXBlICpkc3QgPSAoUHR5cGUgKilkc3RidWYgKyBvZnM7ICAgICAgXAogICAgICAgICAgICB1bnNpZ25lZCBpOyAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgcnVuOyBpKyspIHsgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIFVpbnQzMiBzcmMgPSAqKFVpbnQzMiAqKXNyY2J1ZjsgICAgICBcCiAgICAgICAgICAgICAgICBkb19ibGVuZChzcmMsICpkc3QpOyAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBzcmNidWYgKz0gNDsgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGRzdCsrOyAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIG9mcyArPSBydW47ICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9IHdoaWxlKG9mcyA8IHcpOyAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGRzdGJ1ZiArPSBzdXJmX2RzdC0+cGl0Y2g7ICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSB3aGlsZSgtLWxpbmVjb3VudCk7ICAgICAgICAgICAgICAgICAgICBcCiAgICB9IHdoaWxlKDApCgogICAgICAgIHN3aXRjaCAoZGYtPkJ5dGVzUGVyUGl4ZWwpIHsKICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgIGlmIChkZi0+R21hc2sgPT0gMHgwN2UwIHx8IGRmLT5SbWFzayA9PSAweDA3ZTAKICAgICAgICAgICAgICAgIHx8IGRmLT5CbWFzayA9PSAweDA3ZTApCiAgICAgICAgICAgICAgICBSTEVBTFBIQUJMSVQoVWludDE2LCBVaW50OCwgQkxJVF9UUkFOU0xfNTY1KTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgUkxFQUxQSEFCTElUKFVpbnQxNiwgVWludDgsIEJMSVRfVFJBTlNMXzU1NSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgUkxFQUxQSEFCTElUKFVpbnQzMiwgVWludDE2LCBCTElUX1RSQU5TTF84ODgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CgogIGRvbmU6CiAgICAvKiBVbmxvY2sgdGhlIGRlc3RpbmF0aW9uIGlmIG5lY2Vzc2FyeSAqLwogICAgaWYgKFNETF9NVVNUTE9DSyhzdXJmX2RzdCkpIHsKICAgICAgICBTRExfVW5sb2NrU3VyZmFjZShzdXJmX2RzdCk7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKLyoKICogQXV4aWxpYXJ5IGZ1bmN0aW9uczoKICogVGhlIGVuY29kaW5nIGZ1bmN0aW9ucyB0YWtlIDMyYnBwIHJnYiArIGEsIGFuZAogKiByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQgdG8gdGhlIGRlc3RpbmF0aW9uLgogKiBUaGUgZGVjb2RpbmcgZnVuY3Rpb25zIGNvcHkgdG8gMzJicHAgcmdiICsgYSwgYW5kCiAqIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBmcm9tIHRoZSBzb3VyY2UuCiAqIFRoZXNlIGFyZSBvbmx5IHVzZWQgaW4gdGhlIGVuY29kZXIgYW5kIHVuLVJMRSBjb2RlIGFuZCBhcmUgdGhlcmVmb3JlIG5vdAogKiBoaWdobHkgb3B0aW1pc2VkLgogKi8KCi8qIGVuY29kZSAzMmJwcCByZ2IgKyBhIGludG8gMTZicHAgcmdiLCBsb3NpbmcgYWxwaGEgKi8Kc3RhdGljIGludApjb3B5X29wYXF1ZV8xNih2b2lkICpkc3QsIFVpbnQzMiAqIHNyYywgaW50IG4sCiAgICAgICAgICAgICAgIFNETF9QaXhlbEZvcm1hdCAqIHNmbXQsIFNETF9QaXhlbEZvcm1hdCAqIGRmbXQpCnsKICAgIGludCBpOwogICAgVWludDE2ICpkID0gZHN0OwogICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIHVuc2lnbmVkIHIsIGcsIGI7CiAgICAgICAgUkdCX0ZST01fUElYRUwoKnNyYywgc2ZtdCwgciwgZywgYik7CiAgICAgICAgUElYRUxfRlJPTV9SR0IoKmQsIGRmbXQsIHIsIGcsIGIpOwogICAgICAgIHNyYysrOwogICAgICAgIGQrKzsKICAgIH0KICAgIHJldHVybiBuICogMjsKfQoKLyogZGVjb2RlIG9wYXF1ZSBwaXhlbHMgZnJvbSAxNmJwcCB0byAzMmJwcCByZ2IgKyBhICovCnN0YXRpYyBpbnQKdW5jb3B5X29wYXF1ZV8xNihVaW50MzIgKiBkc3QsIHZvaWQgKnNyYywgaW50IG4sCiAgICAgICAgICAgICAgICAgUkxFRGVzdEZvcm1hdCAqIHNmbXQsIFNETF9QaXhlbEZvcm1hdCAqIGRmbXQpCnsKICAgIGludCBpOwogICAgVWludDE2ICpzID0gc3JjOwogICAgdW5zaWduZWQgYWxwaGEgPSBkZm10LT5BbWFzayA/IDI1NSA6IDA7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgdW5zaWduZWQgciwgZywgYjsKICAgICAgICBSR0JfRlJPTV9QSVhFTCgqcywgc2ZtdCwgciwgZywgYik7CiAgICAgICAgUElYRUxfRlJPTV9SR0JBKCpkc3QsIGRmbXQsIHIsIGcsIGIsIGFscGhhKTsKICAgICAgICBzKys7CiAgICAgICAgZHN0Kys7CiAgICB9CiAgICByZXR1cm4gbiAqIDI7Cn0KCgoKLyogZW5jb2RlIDMyYnBwIHJnYiArIGEgaW50byAzMmJwcCBHMFJBQiBmb3JtYXQgZm9yIGJsaXR0aW5nIGludG8gNTY1ICovCnN0YXRpYyBpbnQKY29weV90cmFuc2xfNTY1KHZvaWQgKmRzdCwgVWludDMyICogc3JjLCBpbnQgbiwKICAgICAgICAgICAgICAgIFNETF9QaXhlbEZvcm1hdCAqIHNmbXQsIFNETF9QaXhlbEZvcm1hdCAqIGRmbXQpCnsKICAgIGludCBpOwogICAgVWludDMyICpkID0gZHN0OwogICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIHVuc2lnbmVkIHIsIGcsIGIsIGE7CiAgICAgICAgVWludDE2IHBpeDsKICAgICAgICBSR0JBX0ZST01fODg4OCgqc3JjLCBzZm10LCByLCBnLCBiLCBhKTsKICAgICAgICBQSVhFTF9GUk9NX1JHQihwaXgsIGRmbXQsIHIsIGcsIGIpOwogICAgICAgICpkID0gKChwaXggJiAweDdlMCkgPDwgMTYpIHwgKHBpeCAmIDB4ZjgxZikgfCAoKGEgPDwgMikgJiAweDdlMCk7CiAgICAgICAgc3JjKys7CiAgICAgICAgZCsrOwogICAgfQogICAgcmV0dXJuIG4gKiA0Owp9CgovKiBlbmNvZGUgMzJicHAgcmdiICsgYSBpbnRvIDMyYnBwIEcwUkFCIGZvcm1hdCBmb3IgYmxpdHRpbmcgaW50byA1NTUgKi8Kc3RhdGljIGludApjb3B5X3RyYW5zbF81NTUodm9pZCAqZHN0LCBVaW50MzIgKiBzcmMsIGludCBuLAogICAgICAgICAgICAgICAgU0RMX1BpeGVsRm9ybWF0ICogc2ZtdCwgU0RMX1BpeGVsRm9ybWF0ICogZGZtdCkKewogICAgaW50IGk7CiAgICBVaW50MzIgKmQgPSBkc3Q7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgdW5zaWduZWQgciwgZywgYiwgYTsKICAgICAgICBVaW50MTYgcGl4OwogICAgICAgIFJHQkFfRlJPTV84ODg4KCpzcmMsIHNmbXQsIHIsIGcsIGIsIGEpOwogICAgICAgIFBJWEVMX0ZST01fUkdCKHBpeCwgZGZtdCwgciwgZywgYik7CiAgICAgICAgKmQgPSAoKHBpeCAmIDB4M2UwKSA8PCAxNikgfCAocGl4ICYgMHhmYzFmKSB8ICgoYSA8PCAyKSAmIDB4M2UwKTsKICAgICAgICBzcmMrKzsKICAgICAgICBkKys7CiAgICB9CiAgICByZXR1cm4gbiAqIDQ7Cn0KCi8qIGRlY29kZSB0cmFuc2x1Y2VudCBwaXhlbHMgZnJvbSAzMmJwcCBHT1JBQiB0byAzMmJwcCByZ2IgKyBhICovCnN0YXRpYyBpbnQKdW5jb3B5X3RyYW5zbF8xNihVaW50MzIgKiBkc3QsIHZvaWQgKnNyYywgaW50IG4sCiAgICAgICAgICAgICAgICAgUkxFRGVzdEZvcm1hdCAqIHNmbXQsIFNETF9QaXhlbEZvcm1hdCAqIGRmbXQpCnsKICAgIGludCBpOwogICAgVWludDMyICpzID0gc3JjOwogICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIHVuc2lnbmVkIHIsIGcsIGIsIGE7CiAgICAgICAgVWludDMyIHBpeCA9ICpzKys7CiAgICAgICAgYSA9IChwaXggJiAweDNlMCkgPj4gMjsKICAgICAgICBwaXggPSAocGl4ICYgfjB4M2UwKSB8IHBpeCA+PiAxNjsKICAgICAgICBSR0JfRlJPTV9QSVhFTChwaXgsIHNmbXQsIHIsIGcsIGIpOwogICAgICAgIFBJWEVMX0ZST01fUkdCQSgqZHN0LCBkZm10LCByLCBnLCBiLCBhKTsKICAgICAgICBkc3QrKzsKICAgIH0KICAgIHJldHVybiBuICogNDsKfQoKLyogZW5jb2RlIDMyYnBwIHJnYmEgaW50byAzMmJwcCByZ2JhLCBrZWVwaW5nIGFscGhhIChkdWFsIHB1cnBvc2UpICovCnN0YXRpYyBpbnQKY29weV8zMih2b2lkICpkc3QsIFVpbnQzMiAqIHNyYywgaW50IG4sCiAgICAgICAgU0RMX1BpeGVsRm9ybWF0ICogc2ZtdCwgU0RMX1BpeGVsRm9ybWF0ICogZGZtdCkKewogICAgaW50IGk7CiAgICBVaW50MzIgKmQgPSBkc3Q7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgdW5zaWduZWQgciwgZywgYiwgYTsKICAgICAgICBSR0JBX0ZST01fODg4OCgqc3JjLCBzZm10LCByLCBnLCBiLCBhKTsKICAgICAgICBSTEVQSVhFTF9GUk9NX1JHQkEoKmQsIGRmbXQsIHIsIGcsIGIsIGEpOwogICAgICAgIGQrKzsKICAgICAgICBzcmMrKzsKICAgIH0KICAgIHJldHVybiBuICogNDsKfQoKLyogZGVjb2RlIDMyYnBwIHJnYmEgaW50byAzMmJwcCByZ2JhLCBrZWVwaW5nIGFscGhhIChkdWFsIHB1cnBvc2UpICovCnN0YXRpYyBpbnQKdW5jb3B5XzMyKFVpbnQzMiAqIGRzdCwgdm9pZCAqc3JjLCBpbnQgbiwKICAgICAgICAgIFJMRURlc3RGb3JtYXQgKiBzZm10LCBTRExfUGl4ZWxGb3JtYXQgKiBkZm10KQp7CiAgICBpbnQgaTsKICAgIFVpbnQzMiAqcyA9IHNyYzsKICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICB1bnNpZ25lZCByLCBnLCBiLCBhOwogICAgICAgIFVpbnQzMiBwaXhlbCA9ICpzKys7CiAgICAgICAgUkdCX0ZST01fUElYRUwocGl4ZWwsIHNmbXQsIHIsIGcsIGIpOwogICAgICAgIGEgPSBwaXhlbCA+PiAyNDsKICAgICAgICBQSVhFTF9GUk9NX1JHQkEoKmRzdCwgZGZtdCwgciwgZywgYiwgYSk7CiAgICAgICAgZHN0Kys7CiAgICB9CiAgICByZXR1cm4gbiAqIDQ7Cn0KCiNkZWZpbmUgSVNPUEFRVUUocGl4ZWwsIGZtdCkgKCgoKHBpeGVsKSAmIGZtdC0+QW1hc2spID4+IGZtdC0+QXNoaWZ0KSA9PSAyNTUpCgojZGVmaW5lIElTVFJBTlNMKHBpeGVsLCBmbXQpICAgIFwKICAgICgodW5zaWduZWQpKCgoKHBpeGVsKSAmIGZtdC0+QW1hc2spID4+IGZtdC0+QXNoaWZ0KSAtIDFVKSA8IDI1NFUpCgovKiBjb252ZXJ0IHN1cmZhY2UgdG8gYmUgcXVpY2tseSBhbHBoYS1ibGl0dGFibGUgb250byBkZXN0LCBpZiBwb3NzaWJsZSAqLwpzdGF0aWMgaW50ClJMRUFscGhhU3VyZmFjZShTRExfU3VyZmFjZSAqIHN1cmZhY2UpCnsKICAgIFNETF9TdXJmYWNlICpkZXN0OwogICAgU0RMX1BpeGVsRm9ybWF0ICpkZjsKICAgIGludCBtYXhzaXplID0gMDsKICAgIGludCBtYXhfb3BhcXVlX3J1bjsKICAgIGludCBtYXhfdHJhbnNsX3J1biA9IDY1NTM1OwogICAgdW5zaWduZWQgbWFza3N1bTsKICAgIFVpbnQ4ICpybGVidWYsICpkc3Q7CiAgICBpbnQgKCpjb3B5X29wYXF1ZSkgKHZvaWQgKiwgVWludDMyICosIGludCwKICAgICAgICAgICAgICAgICAgICAgICAgU0RMX1BpeGVsRm9ybWF0ICosIFNETF9QaXhlbEZvcm1hdCAqKTsKICAgIGludCAoKmNvcHlfdHJhbnNsKSAodm9pZCAqLCBVaW50MzIgKiwgaW50LAogICAgICAgICAgICAgICAgICAgICAgICBTRExfUGl4ZWxGb3JtYXQgKiwgU0RMX1BpeGVsRm9ybWF0ICopOwoKICAgIGRlc3QgPSBzdXJmYWNlLT5tYXAtPmRzdDsKICAgIGlmICghZGVzdCkKICAgICAgICByZXR1cm4gLTE7CiAgICBkZiA9IGRlc3QtPmZvcm1hdDsKICAgIGlmIChzdXJmYWNlLT5mb3JtYXQtPkJpdHNQZXJQaXhlbCAhPSAzMikKICAgICAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAvKiBvbmx5IDMyYnBwIHNvdXJjZSBzdXBwb3J0ZWQgKi8KCiAgICAvKiBmaW5kIG91dCB3aGV0aGVyIHRoZSBkZXN0aW5hdGlvbiBpcyBvbmUgd2Ugc3VwcG9ydCwKICAgICAgIGFuZCBkZXRlcm1pbmUgdGhlIG1heCBzaXplIG9mIHRoZSBlbmNvZGVkIHJlc3VsdCAqLwogICAgbWFza3N1bSA9IGRmLT5SbWFzayB8IGRmLT5HbWFzayB8IGRmLT5CbWFzazsKICAgIHN3aXRjaCAoZGYtPkJ5dGVzUGVyUGl4ZWwpIHsKICAgIGNhc2UgMjoKICAgICAgICAvKiAxNmJwcDogb25seSBzdXBwb3J0IDU2NSBhbmQgNTU1IGZvcm1hdHMgKi8KICAgICAgICBzd2l0Y2ggKG1hc2tzdW0pIHsKICAgICAgICBjYXNlIDB4ZmZmZjoKICAgICAgICAgICAgaWYgKGRmLT5HbWFzayA9PSAweDA3ZTAKICAgICAgICAgICAgICAgIHx8IGRmLT5SbWFzayA9PSAweDA3ZTAgfHwgZGYtPkJtYXNrID09IDB4MDdlMCkgewogICAgICAgICAgICAgICAgY29weV9vcGFxdWUgPSBjb3B5X29wYXF1ZV8xNjsKICAgICAgICAgICAgICAgIGNvcHlfdHJhbnNsID0gY29weV90cmFuc2xfNTY1OwogICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDdmZmY6CiAgICAgICAgICAgIGlmIChkZi0+R21hc2sgPT0gMHgwM2UwCiAgICAgICAgICAgICAgICB8fCBkZi0+Um1hc2sgPT0gMHgwM2UwIHx8IGRmLT5CbWFzayA9PSAweDAzZTApIHsKICAgICAgICAgICAgICAgIGNvcHlfb3BhcXVlID0gY29weV9vcGFxdWVfMTY7CiAgICAgICAgICAgICAgICBjb3B5X3RyYW5zbCA9IGNvcHlfdHJhbnNsXzU1NTsKICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgbWF4X29wYXF1ZV9ydW4gPSAyNTU7ICAgLyogcnVucyBzdG9yZWQgYXMgYnl0ZXMgKi8KCiAgICAgICAgLyogd29yc3QgY2FzZSBpcyBhbHRlcm5hdGluZyBvcGFxdWUgYW5kIHRyYW5zbHVjZW50IHBpeGVscywKICAgICAgICAgICB3aXRoIHJvb20gZm9yIGFsaWdubWVudCBwYWRkaW5nIGJldHdlZW4gbGluZXMgKi8KICAgICAgICBtYXhzaXplID0gc3VyZmFjZS0+aCAqICgyICsgKDQgKyAyKSAqIChzdXJmYWNlLT53ICsgMSkpICsgMjsKICAgICAgICBicmVhazsKICAgIGNhc2UgNDoKICAgICAgICBpZiAobWFza3N1bSAhPSAweDAwZmZmZmZmKQogICAgICAgICAgICByZXR1cm4gLTE7ICAgICAgICAgIC8qIHJlcXVpcmVzIHVudXNlZCBoaWdoIGJ5dGUgKi8KICAgICAgICBjb3B5X29wYXF1ZSA9IGNvcHlfMzI7CiAgICAgICAgY29weV90cmFuc2wgPSBjb3B5XzMyOwogICAgICAgIG1heF9vcGFxdWVfcnVuID0gMjU1OyAgIC8qIHJ1bnMgc3RvcmVkIGFzIHNob3J0IGludHMgKi8KCiAgICAgICAgLyogd29yc3QgY2FzZSBpcyBhbHRlcm5hdGluZyBvcGFxdWUgYW5kIHRyYW5zbHVjZW50IHBpeGVscyAqLwogICAgICAgIG1heHNpemUgPSBzdXJmYWNlLT5oICogMiAqIDQgKiAoc3VyZmFjZS0+dyArIDEpICsgNDsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgLyogYW55dGhpbmcgZWxzZSB1bnN1cHBvcnRlZCByaWdodCBub3cgKi8KICAgIH0KCiAgICBtYXhzaXplICs9IHNpemVvZihSTEVEZXN0Rm9ybWF0KTsKICAgIHJsZWJ1ZiA9IChVaW50OCAqKSBTRExfbWFsbG9jKG1heHNpemUpOwogICAgaWYgKCFybGVidWYpIHsKICAgICAgICByZXR1cm4gU0RMX091dE9mTWVtb3J5KCk7CiAgICB9CiAgICB7CiAgICAgICAgLyogc2F2ZSB0aGUgZGVzdGluYXRpb24gZm9ybWF0IHNvIHdlIGNhbiB1bmRvIHRoZSBlbmNvZGluZyBsYXRlciAqLwogICAgICAgIFJMRURlc3RGb3JtYXQgKnIgPSAoUkxFRGVzdEZvcm1hdCAqKSBybGVidWY7CiAgICAgICAgci0+Qnl0ZXNQZXJQaXhlbCA9IGRmLT5CeXRlc1BlclBpeGVsOwogICAgICAgIHItPlJtYXNrID0gZGYtPlJtYXNrOwogICAgICAgIHItPkdtYXNrID0gZGYtPkdtYXNrOwogICAgICAgIHItPkJtYXNrID0gZGYtPkJtYXNrOwogICAgICAgIHItPkFtYXNrID0gZGYtPkFtYXNrOwogICAgICAgIHItPlJsb3NzID0gZGYtPlJsb3NzOwogICAgICAgIHItPkdsb3NzID0gZGYtPkdsb3NzOwogICAgICAgIHItPkJsb3NzID0gZGYtPkJsb3NzOwogICAgICAgIHItPkFsb3NzID0gZGYtPkFsb3NzOwogICAgICAgIHItPlJzaGlmdCA9IGRmLT5Sc2hpZnQ7CiAgICAgICAgci0+R3NoaWZ0ID0gZGYtPkdzaGlmdDsKICAgICAgICByLT5Cc2hpZnQgPSBkZi0+QnNoaWZ0OwogICAgICAgIHItPkFzaGlmdCA9IGRmLT5Bc2hpZnQ7CiAgICB9CiAgICBkc3QgPSBybGVidWYgKyBzaXplb2YoUkxFRGVzdEZvcm1hdCk7CgogICAgLyogRG8gdGhlIGFjdHVhbCBlbmNvZGluZyAqLwogICAgewogICAgICAgIGludCB4LCB5OwogICAgICAgIGludCBoID0gc3VyZmFjZS0+aCwgdyA9IHN1cmZhY2UtPnc7CiAgICAgICAgU0RMX1BpeGVsRm9ybWF0ICpzZiA9IHN1cmZhY2UtPmZvcm1hdDsKICAgICAgICBVaW50MzIgKnNyYyA9IChVaW50MzIgKikgc3VyZmFjZS0+cGl4ZWxzOwogICAgICAgIFVpbnQ4ICpsYXN0bGluZSA9IGRzdDsgIC8qIGVuZCBvZiBsYXN0IG5vbi1ibGFuayBsaW5lICovCgogICAgICAgIC8qIG9wYXF1ZSBjb3VudHMgYXJlIDggb3IgMTYgYml0cywgZGVwZW5kaW5nIG9uIHRhcmdldCBkZXB0aCAqLwojZGVmaW5lIEFERF9PUEFRVUVfQ09VTlRTKG4sIG0pICAgICAgICAgXAogICAgaWYoZGYtPkJ5dGVzUGVyUGl4ZWwgPT0gNCkgeyAgICAgICAgXAogICAgICAgICgoVWludDE2ICopZHN0KVswXSA9IG47ICAgICBcCiAgICAgICAgKChVaW50MTYgKilkc3QpWzFdID0gbTsgICAgIFwKICAgICAgICBkc3QgKz0gNDsgICAgICAgICAgICAgICBcCiAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICBcCiAgICAgICAgZHN0WzBdID0gbjsgICAgICAgICAgICAgXAogICAgICAgIGRzdFsxXSA9IG07ICAgICAgICAgICAgIFwKICAgICAgICBkc3QgKz0gMjsgICAgICAgICAgICAgICBcCiAgICB9CgogICAgICAgIC8qIHRyYW5zbHVjZW50IGNvdW50cyBhcmUgYWx3YXlzIDE2IGJpdCAqLwojZGVmaW5lIEFERF9UUkFOU0xfQ09VTlRTKG4sIG0pICAgICBcCiAgICAoKChVaW50MTYgKilkc3QpWzBdID0gbiwgKChVaW50MTYgKilkc3QpWzFdID0gbSwgZHN0ICs9IDQpCgogICAgICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKICAgICAgICAgICAgaW50IHJ1bnN0YXJ0LCBza2lwc3RhcnQ7CiAgICAgICAgICAgIGludCBibGFua2xpbmUgPSAwOwogICAgICAgICAgICAvKiBGaXJzdCBlbmNvZGUgYWxsIG9wYXF1ZSBwaXhlbHMgb2YgYSBzY2FuIGxpbmUgKi8KICAgICAgICAgICAgeCA9IDA7CiAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgIGludCBydW4sIHNraXAsIGxlbjsKICAgICAgICAgICAgICAgIHNraXBzdGFydCA9IHg7CiAgICAgICAgICAgICAgICB3aGlsZSAoeCA8IHcgJiYgIUlTT1BBUVVFKHNyY1t4XSwgc2YpKQogICAgICAgICAgICAgICAgICAgIHgrKzsKICAgICAgICAgICAgICAgIHJ1bnN0YXJ0ID0geDsKICAgICAgICAgICAgICAgIHdoaWxlICh4IDwgdyAmJiBJU09QQVFVRShzcmNbeF0sIHNmKSkKICAgICAgICAgICAgICAgICAgICB4Kys7CiAgICAgICAgICAgICAgICBza2lwID0gcnVuc3RhcnQgLSBza2lwc3RhcnQ7CiAgICAgICAgICAgICAgICBpZiAoc2tpcCA9PSB3KQogICAgICAgICAgICAgICAgICAgIGJsYW5rbGluZSA9IDE7CiAgICAgICAgICAgICAgICBydW4gPSB4IC0gcnVuc3RhcnQ7CiAgICAgICAgICAgICAgICB3aGlsZSAoc2tpcCA+IG1heF9vcGFxdWVfcnVuKSB7CiAgICAgICAgICAgICAgICAgICAgQUREX09QQVFVRV9DT1VOVFMobWF4X29wYXF1ZV9ydW4sIDApOwogICAgICAgICAgICAgICAgICAgIHNraXAgLT0gbWF4X29wYXF1ZV9ydW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsZW4gPSBNSU4ocnVuLCBtYXhfb3BhcXVlX3J1bik7CiAgICAgICAgICAgICAgICBBRERfT1BBUVVFX0NPVU5UUyhza2lwLCBsZW4pOwogICAgICAgICAgICAgICAgZHN0ICs9IGNvcHlfb3BhcXVlKGRzdCwgc3JjICsgcnVuc3RhcnQsIGxlbiwgc2YsIGRmKTsKICAgICAgICAgICAgICAgIHJ1bnN0YXJ0ICs9IGxlbjsKICAgICAgICAgICAgICAgIHJ1biAtPSBsZW47CiAgICAgICAgICAgICAgICB3aGlsZSAocnVuKSB7CiAgICAgICAgICAgICAgICAgICAgbGVuID0gTUlOKHJ1biwgbWF4X29wYXF1ZV9ydW4pOwogICAgICAgICAgICAgICAgICAgIEFERF9PUEFRVUVfQ09VTlRTKDAsIGxlbik7CiAgICAgICAgICAgICAgICAgICAgZHN0ICs9IGNvcHlfb3BhcXVlKGRzdCwgc3JjICsgcnVuc3RhcnQsIGxlbiwgc2YsIGRmKTsKICAgICAgICAgICAgICAgICAgICBydW5zdGFydCArPSBsZW47CiAgICAgICAgICAgICAgICAgICAgcnVuIC09IGxlbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSB3aGlsZSAoeCA8IHcpOwoKICAgICAgICAgICAgLyogTWFrZSBzdXJlIHRoZSBuZXh0IG91dHB1dCBhZGRyZXNzIGlzIDMyLWJpdCBhbGlnbmVkICovCiAgICAgICAgICAgIGRzdCArPSAodWludHB0cl90KSBkc3QgJiAyOwoKICAgICAgICAgICAgLyogTmV4dCwgZW5jb2RlIGFsbCB0cmFuc2x1Y2VudCBwaXhlbHMgb2YgdGhlIHNhbWUgc2NhbiBsaW5lICovCiAgICAgICAgICAgIHggPSAwOwogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICBpbnQgcnVuLCBza2lwLCBsZW47CiAgICAgICAgICAgICAgICBza2lwc3RhcnQgPSB4OwogICAgICAgICAgICAgICAgd2hpbGUgKHggPCB3ICYmICFJU1RSQU5TTChzcmNbeF0sIHNmKSkKICAgICAgICAgICAgICAgICAgICB4Kys7CiAgICAgICAgICAgICAgICBydW5zdGFydCA9IHg7CiAgICAgICAgICAgICAgICB3aGlsZSAoeCA8IHcgJiYgSVNUUkFOU0woc3JjW3hdLCBzZikpCiAgICAgICAgICAgICAgICAgICAgeCsrOwogICAgICAgICAgICAgICAgc2tpcCA9IHJ1bnN0YXJ0IC0gc2tpcHN0YXJ0OwogICAgICAgICAgICAgICAgYmxhbmtsaW5lICY9IChza2lwID09IHcpOwogICAgICAgICAgICAgICAgcnVuID0geCAtIHJ1bnN0YXJ0OwogICAgICAgICAgICAgICAgd2hpbGUgKHNraXAgPiBtYXhfdHJhbnNsX3J1bikgewogICAgICAgICAgICAgICAgICAgIEFERF9UUkFOU0xfQ09VTlRTKG1heF90cmFuc2xfcnVuLCAwKTsKICAgICAgICAgICAgICAgICAgICBza2lwIC09IG1heF90cmFuc2xfcnVuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGVuID0gTUlOKHJ1biwgbWF4X3RyYW5zbF9ydW4pOwogICAgICAgICAgICAgICAgQUREX1RSQU5TTF9DT1VOVFMoc2tpcCwgbGVuKTsKICAgICAgICAgICAgICAgIGRzdCArPSBjb3B5X3RyYW5zbChkc3QsIHNyYyArIHJ1bnN0YXJ0LCBsZW4sIHNmLCBkZik7CiAgICAgICAgICAgICAgICBydW5zdGFydCArPSBsZW47CiAgICAgICAgICAgICAgICBydW4gLT0gbGVuOwogICAgICAgICAgICAgICAgd2hpbGUgKHJ1bikgewogICAgICAgICAgICAgICAgICAgIGxlbiA9IE1JTihydW4sIG1heF90cmFuc2xfcnVuKTsKICAgICAgICAgICAgICAgICAgICBBRERfVFJBTlNMX0NPVU5UUygwLCBsZW4pOwogICAgICAgICAgICAgICAgICAgIGRzdCArPSBjb3B5X3RyYW5zbChkc3QsIHNyYyArIHJ1bnN0YXJ0LCBsZW4sIHNmLCBkZik7CiAgICAgICAgICAgICAgICAgICAgcnVuc3RhcnQgKz0gbGVuOwogICAgICAgICAgICAgICAgICAgIHJ1biAtPSBsZW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIWJsYW5rbGluZSkKICAgICAgICAgICAgICAgICAgICBsYXN0bGluZSA9IGRzdDsKICAgICAgICAgICAgfSB3aGlsZSAoeCA8IHcpOwoKICAgICAgICAgICAgc3JjICs9IHN1cmZhY2UtPnBpdGNoID4+IDI7CiAgICAgICAgfQogICAgICAgIGRzdCA9IGxhc3RsaW5lOyAgICAgICAgIC8qIGJhY2sgdXAgcGFzdCB0cmFpbGluZyBibGFuayBsaW5lcyAqLwogICAgICAgIEFERF9PUEFRVUVfQ09VTlRTKDAsIDApOwogICAgfQoKI3VuZGVmIEFERF9PUEFRVUVfQ09VTlRTCiN1bmRlZiBBRERfVFJBTlNMX0NPVU5UUwoKICAgIC8qIE5vdyB0aGF0IHdlIGhhdmUgaXQgZW5jb2RlZCwgcmVsZWFzZSB0aGUgb3JpZ2luYWwgcGl4ZWxzICovCiAgICBpZiAoIShzdXJmYWNlLT5mbGFncyAmIFNETF9QUkVBTExPQykpIHsKICAgICAgICBTRExfU0lNREZyZWUoc3VyZmFjZS0+cGl4ZWxzKTsKICAgICAgICBzdXJmYWNlLT5waXhlbHMgPSBOVUxMOwogICAgICAgIHN1cmZhY2UtPmZsYWdzICY9IH5TRExfU0lNRF9BTElHTkVEOwogICAgfQoKICAgIC8qIHJlYWxsb2MgdGhlIGJ1ZmZlciB0byByZWxlYXNlIHVudXNlZCBtZW1vcnkgKi8KICAgIHsKICAgICAgICBVaW50OCAqcCA9IFNETF9yZWFsbG9jKHJsZWJ1ZiwgZHN0IC0gcmxlYnVmKTsKICAgICAgICBpZiAoIXApCiAgICAgICAgICAgIHAgPSBybGVidWY7CiAgICAgICAgc3VyZmFjZS0+bWFwLT5kYXRhID0gcDsKICAgIH0KCiAgICByZXR1cm4gMDsKfQoKc3RhdGljIFVpbnQzMgpnZXRwaXhfOChjb25zdCBVaW50OCAqIHNyY2J1ZikKewogICAgcmV0dXJuICpzcmNidWY7Cn0KCnN0YXRpYyBVaW50MzIKZ2V0cGl4XzE2KGNvbnN0IFVpbnQ4ICogc3JjYnVmKQp7CiAgICByZXR1cm4gKihjb25zdCBVaW50MTYgKikgc3JjYnVmOwp9CgpzdGF0aWMgVWludDMyCmdldHBpeF8yNChjb25zdCBVaW50OCAqIHNyY2J1ZikKewojaWYgU0RMX0JZVEVPUkRFUiA9PSBTRExfTElMX0VORElBTgogICAgcmV0dXJuIHNyY2J1ZlswXSArIChzcmNidWZbMV0gPDwgOCkgKyAoc3JjYnVmWzJdIDw8IDE2KTsKI2Vsc2UKICAgIHJldHVybiAoc3JjYnVmWzBdIDw8IDE2KSArIChzcmNidWZbMV0gPDwgOCkgKyBzcmNidWZbMl07CiNlbmRpZgp9CgpzdGF0aWMgVWludDMyCmdldHBpeF8zMihjb25zdCBVaW50OCAqIHNyY2J1ZikKewogICAgcmV0dXJuICooY29uc3QgVWludDMyICopIHNyY2J1ZjsKfQoKdHlwZWRlZiBVaW50MzIoKmdldHBpeF9mdW5jKSAoY29uc3QgVWludDggKik7CgpzdGF0aWMgY29uc3QgZ2V0cGl4X2Z1bmMgZ2V0cGl4ZXNbNF0gPSB7CiAgICBnZXRwaXhfOCwgZ2V0cGl4XzE2LCBnZXRwaXhfMjQsIGdldHBpeF8zMgp9OwoKc3RhdGljIGludApSTEVDb2xvcmtleVN1cmZhY2UoU0RMX1N1cmZhY2UgKiBzdXJmYWNlKQp7CiAgICBVaW50OCAqcmxlYnVmLCAqZHN0OwogICAgaW50IG1heG47CiAgICBpbnQgeTsKICAgIFVpbnQ4ICpzcmNidWYsICpsYXN0bGluZTsKICAgIGludCBtYXhzaXplID0gMDsKICAgIGNvbnN0IGludCBicHAgPSBzdXJmYWNlLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWw7CiAgICBnZXRwaXhfZnVuYyBnZXRwaXg7CiAgICBVaW50MzIgY2tleSwgcmdibWFzazsKICAgIGludCB3LCBoOwoKICAgIC8qIGNhbGN1bGF0ZSB0aGUgd29yc3QgY2FzZSBzaXplIGZvciB0aGUgY29tcHJlc3NlZCBzdXJmYWNlICovCiAgICBzd2l0Y2ggKGJwcCkgewogICAgY2FzZSAxOgogICAgICAgIC8qIHdvcnN0IGNhc2UgaXMgYWx0ZXJuYXRpbmcgb3BhcXVlIGFuZCB0cmFuc3BhcmVudCBwaXhlbHMsCiAgICAgICAgICAgc3RhcnRpbmcgd2l0aCBhbiBvcGFxdWUgcGl4ZWwgKi8KICAgICAgICBtYXhzaXplID0gc3VyZmFjZS0+aCAqIDMgKiAoc3VyZmFjZS0+dyAvIDIgKyAxKSArIDI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDI6CiAgICBjYXNlIDM6CiAgICAgICAgLyogd29yc3QgY2FzZSBpcyBzb2xpZCBydW5zLCBhdCBtb3N0IDI1NSBwaXhlbHMgd2lkZSAqLwogICAgICAgIG1heHNpemUgPSBzdXJmYWNlLT5oICogKDIgKiAoc3VyZmFjZS0+dyAvIDI1NSArIDEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdXJmYWNlLT53ICogYnBwKSArIDI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDQ6CiAgICAgICAgLyogd29yc3QgY2FzZSBpcyBzb2xpZCBydW5zLCBhdCBtb3N0IDY1NTM1IHBpeGVscyB3aWRlICovCiAgICAgICAgbWF4c2l6ZSA9IHN1cmZhY2UtPmggKiAoNCAqIChzdXJmYWNlLT53IC8gNjU1MzUgKyAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3VyZmFjZS0+dyAqIDQpICsgNDsKICAgICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBybGVidWYgPSAoVWludDggKikgU0RMX21hbGxvYyhtYXhzaXplKTsKICAgIGlmIChybGVidWYgPT0gTlVMTCkgewogICAgICAgIHJldHVybiBTRExfT3V0T2ZNZW1vcnkoKTsKICAgIH0KCiAgICAvKiBTZXQgdXAgdGhlIGNvbnZlcnNpb24gKi8KICAgIHNyY2J1ZiA9IChVaW50OCAqKSBzdXJmYWNlLT5waXhlbHM7CiAgICBtYXhuID0gYnBwID09IDQgPyA2NTUzNSA6IDI1NTsKICAgIGRzdCA9IHJsZWJ1ZjsKICAgIHJnYm1hc2sgPSB+c3VyZmFjZS0+Zm9ybWF0LT5BbWFzazsKICAgIGNrZXkgPSBzdXJmYWNlLT5tYXAtPmluZm8uY29sb3JrZXkgJiByZ2JtYXNrOwogICAgbGFzdGxpbmUgPSBkc3Q7CiAgICBnZXRwaXggPSBnZXRwaXhlc1ticHAgLSAxXTsKICAgIHcgPSBzdXJmYWNlLT53OwogICAgaCA9IHN1cmZhY2UtPmg7CgojZGVmaW5lIEFERF9DT1VOVFMobiwgbSkgICAgICAgICAgICBcCiAgICBpZihicHAgPT0gNCkgeyAgICAgICAgICAgICAgXAogICAgICAgICgoVWludDE2ICopZHN0KVswXSA9IG47ICAgICBcCiAgICAgICAgKChVaW50MTYgKilkc3QpWzFdID0gbTsgICAgIFwKICAgICAgICBkc3QgKz0gNDsgICAgICAgICAgICAgICBcCiAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICBcCiAgICAgICAgZHN0WzBdID0gbjsgICAgICAgICAgICAgXAogICAgICAgIGRzdFsxXSA9IG07ICAgICAgICAgICAgIFwKICAgICAgICBkc3QgKz0gMjsgICAgICAgICAgICAgICBcCiAgICB9CgogICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgewogICAgICAgIGludCB4ID0gMDsKICAgICAgICBpbnQgYmxhbmtsaW5lID0gMDsKICAgICAgICBkbyB7CiAgICAgICAgICAgIGludCBydW4sIHNraXAsIGxlbjsKICAgICAgICAgICAgaW50IHJ1bnN0YXJ0OwogICAgICAgICAgICBpbnQgc2tpcHN0YXJ0ID0geDsKCiAgICAgICAgICAgIC8qIGZpbmQgcnVuIG9mIHRyYW5zcGFyZW50LCB0aGVuIG9wYXF1ZSBwaXhlbHMgKi8KICAgICAgICAgICAgd2hpbGUgKHggPCB3ICYmIChnZXRwaXgoc3JjYnVmICsgeCAqIGJwcCkgJiByZ2JtYXNrKSA9PSBja2V5KQogICAgICAgICAgICAgICAgeCsrOwogICAgICAgICAgICBydW5zdGFydCA9IHg7CiAgICAgICAgICAgIHdoaWxlICh4IDwgdyAmJiAoZ2V0cGl4KHNyY2J1ZiArIHggKiBicHApICYgcmdibWFzaykgIT0gY2tleSkKICAgICAgICAgICAgICAgIHgrKzsKICAgICAgICAgICAgc2tpcCA9IHJ1bnN0YXJ0IC0gc2tpcHN0YXJ0OwogICAgICAgICAgICBpZiAoc2tpcCA9PSB3KQogICAgICAgICAgICAgICAgYmxhbmtsaW5lID0gMTsKICAgICAgICAgICAgcnVuID0geCAtIHJ1bnN0YXJ0OwoKICAgICAgICAgICAgLyogZW5jb2RlIHNlZ21lbnQgKi8KICAgICAgICAgICAgd2hpbGUgKHNraXAgPiBtYXhuKSB7CiAgICAgICAgICAgICAgICBBRERfQ09VTlRTKG1heG4sIDApOwogICAgICAgICAgICAgICAgc2tpcCAtPSBtYXhuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxlbiA9IE1JTihydW4sIG1heG4pOwogICAgICAgICAgICBBRERfQ09VTlRTKHNraXAsIGxlbik7CiAgICAgICAgICAgIFNETF9tZW1jcHkoZHN0LCBzcmNidWYgKyBydW5zdGFydCAqIGJwcCwgbGVuICogYnBwKTsKICAgICAgICAgICAgZHN0ICs9IGxlbiAqIGJwcDsKICAgICAgICAgICAgcnVuIC09IGxlbjsKICAgICAgICAgICAgcnVuc3RhcnQgKz0gbGVuOwogICAgICAgICAgICB3aGlsZSAocnVuKSB7CiAgICAgICAgICAgICAgICBsZW4gPSBNSU4ocnVuLCBtYXhuKTsKICAgICAgICAgICAgICAgIEFERF9DT1VOVFMoMCwgbGVuKTsKICAgICAgICAgICAgICAgIFNETF9tZW1jcHkoZHN0LCBzcmNidWYgKyBydW5zdGFydCAqIGJwcCwgbGVuICogYnBwKTsKICAgICAgICAgICAgICAgIGRzdCArPSBsZW4gKiBicHA7CiAgICAgICAgICAgICAgICBydW5zdGFydCArPSBsZW47CiAgICAgICAgICAgICAgICBydW4gLT0gbGVuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYmxhbmtsaW5lKQogICAgICAgICAgICAgICAgbGFzdGxpbmUgPSBkc3Q7CiAgICAgICAgfSB3aGlsZSAoeCA8IHcpOwoKICAgICAgICBzcmNidWYgKz0gc3VyZmFjZS0+cGl0Y2g7CiAgICB9CiAgICBkc3QgPSBsYXN0bGluZTsgICAgICAgICAgICAgLyogYmFjayB1cCBiYXN0IHRyYWlsaW5nIGJsYW5rIGxpbmVzICovCiAgICBBRERfQ09VTlRTKDAsIDApOwoKI3VuZGVmIEFERF9DT1VOVFMKCiAgICAvKiBOb3cgdGhhdCB3ZSBoYXZlIGl0IGVuY29kZWQsIHJlbGVhc2UgdGhlIG9yaWdpbmFsIHBpeGVscyAqLwogICAgaWYgKCEoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfUFJFQUxMT0MpKSB7CiAgICAgICAgU0RMX1NJTURGcmVlKHN1cmZhY2UtPnBpeGVscyk7CiAgICAgICAgc3VyZmFjZS0+cGl4ZWxzID0gTlVMTDsKICAgICAgICBzdXJmYWNlLT5mbGFncyAmPSB+U0RMX1NJTURfQUxJR05FRDsKICAgIH0KCiAgICAvKiByZWFsbG9jIHRoZSBidWZmZXIgdG8gcmVsZWFzZSB1bnVzZWQgbWVtb3J5ICovCiAgICB7CiAgICAgICAgLyogSWYgcmVhbGxvYyByZXR1cm5zIE5VTEwsIHRoZSBvcmlnaW5hbCBibG9jayBpcyBsZWZ0IGludGFjdCAqLwogICAgICAgIFVpbnQ4ICpwID0gU0RMX3JlYWxsb2MocmxlYnVmLCBkc3QgLSBybGVidWYpOwogICAgICAgIGlmICghcCkKICAgICAgICAgICAgcCA9IHJsZWJ1ZjsKICAgICAgICBzdXJmYWNlLT5tYXAtPmRhdGEgPSBwOwogICAgfQoKICAgIHJldHVybiAwOwp9CgppbnQKU0RMX1JMRVN1cmZhY2UoU0RMX1N1cmZhY2UgKiBzdXJmYWNlKQp7CiAgICBpbnQgZmxhZ3M7CgogICAgLyogQ2xlYXIgYW55IHByZXZpb3VzIFJMRSBjb252ZXJzaW9uICovCiAgICBpZiAoKHN1cmZhY2UtPmZsYWdzICYgU0RMX1JMRUFDQ0VMKSA9PSBTRExfUkxFQUNDRUwpIHsKICAgICAgICBTRExfVW5STEVTdXJmYWNlKHN1cmZhY2UsIDEpOwogICAgfQoKICAgIC8qIFdlIGRvbid0IHN1cHBvcnQgUkxFIGVuY29kaW5nIG9mIGJpdG1hcHMgKi8KICAgIGlmIChzdXJmYWNlLT5mb3JtYXQtPkJpdHNQZXJQaXhlbCA8IDgpIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgLyogTWFrZSBzdXJlIHRoZSBwaXhlbHMgYXJlIGF2YWlsYWJsZSAqLwogICAgaWYgKCFzdXJmYWNlLT5waXhlbHMpIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgLyogSWYgd2UgZG9uJ3QgaGF2ZSBjb2xvcmtleSBvciBibGVuZGluZywgbm90aGluZyB0byBkby4uLiAqLwogICAgZmxhZ3MgPSBzdXJmYWNlLT5tYXAtPmluZm8uZmxhZ3M7CiAgICBpZiAoIShmbGFncyAmIChTRExfQ09QWV9DT0xPUktFWSB8IFNETF9DT1BZX0JMRU5EKSkpIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgLyogUGFzcyBvbiBjb21iaW5hdGlvbnMgbm90IHN1cHBvcnRlZCAqLwogICAgaWYgKChmbGFncyAmIFNETF9DT1BZX01PRFVMQVRFX0NPTE9SKSB8fAogICAgICAgICgoZmxhZ3MgJiBTRExfQ09QWV9NT0RVTEFURV9BTFBIQSkgJiYgc3VyZmFjZS0+Zm9ybWF0LT5BbWFzaykgfHwKICAgICAgICAoZmxhZ3MgJiAoU0RMX0NPUFlfQUREIHwgU0RMX0NPUFlfTU9EIHwgU0RMX0NPUFlfTVVMKSkgfHwKICAgICAgICAoZmxhZ3MgJiBTRExfQ09QWV9ORUFSRVNUKSkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICAvKiBFbmNvZGUgYW5kIHNldCB1cCB0aGUgYmxpdCAqLwogICAgaWYgKCFzdXJmYWNlLT5mb3JtYXQtPkFtYXNrIHx8ICEoZmxhZ3MgJiBTRExfQ09QWV9CTEVORCkpIHsKICAgICAgICBpZiAoIXN1cmZhY2UtPm1hcC0+aWRlbnRpdHkpIHsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICBpZiAoUkxFQ29sb3JrZXlTdXJmYWNlKHN1cmZhY2UpIDwgMCkgewogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgICAgIHN1cmZhY2UtPm1hcC0+YmxpdCA9IFNETF9STEVCbGl0OwogICAgICAgIHN1cmZhY2UtPm1hcC0+aW5mby5mbGFncyB8PSBTRExfQ09QWV9STEVfQ09MT1JLRVk7CiAgICB9IGVsc2UgewogICAgICAgIGlmIChSTEVBbHBoYVN1cmZhY2Uoc3VyZmFjZSkgPCAwKSB7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgc3VyZmFjZS0+bWFwLT5ibGl0ID0gU0RMX1JMRUFscGhhQmxpdDsKICAgICAgICBzdXJmYWNlLT5tYXAtPmluZm8uZmxhZ3MgfD0gU0RMX0NPUFlfUkxFX0FMUEhBS0VZOwogICAgfQoKICAgIC8qIFRoZSBzdXJmYWNlIGlzIG5vdyBhY2NlbGVyYXRlZCAqLwogICAgc3VyZmFjZS0+ZmxhZ3MgfD0gU0RMX1JMRUFDQ0VMOwoKICAgIHJldHVybiAoMCk7Cn0KCi8qCiAqIFVuLVJMRSBhIHN1cmZhY2Ugd2l0aCBwaXhlbCBhbHBoYQogKiBUaGlzIG1heSBub3QgZ2l2ZSBiYWNrIGV4YWN0bHkgdGhlIGltYWdlIGJlZm9yZSBSTEUtZW5jb2Rpbmc7IGFsbAogKiBjb21wbGV0ZWx5IHRyYW5zcGFyZW50IHBpeGVscyB3aWxsIGJlIGxvc3QsIGFuZCBjb2xvciBhbmQgYWxwaGEgZGVwdGgKICogbWF5IGhhdmUgYmVlbiByZWR1Y2VkICh3aGVuIGVuY29kaW5nIGZvciAxNmJwcCB0YXJnZXRzKS4KICovCnN0YXRpYyBTRExfYm9vbApVblJMRUFscGhhKFNETF9TdXJmYWNlICogc3VyZmFjZSkKewogICAgVWludDggKnNyY2J1ZjsKICAgIFVpbnQzMiAqZHN0OwogICAgU0RMX1BpeGVsRm9ybWF0ICpzZiA9IHN1cmZhY2UtPmZvcm1hdDsKICAgIFJMRURlc3RGb3JtYXQgKmRmID0gc3VyZmFjZS0+bWFwLT5kYXRhOwogICAgaW50ICgqdW5jb3B5X29wYXF1ZSkgKFVpbnQzMiAqLCB2b2lkICosIGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICBSTEVEZXN0Rm9ybWF0ICosIFNETF9QaXhlbEZvcm1hdCAqKTsKICAgIGludCAoKnVuY29weV90cmFuc2wpIChVaW50MzIgKiwgdm9pZCAqLCBpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgUkxFRGVzdEZvcm1hdCAqLCBTRExfUGl4ZWxGb3JtYXQgKik7CiAgICBpbnQgdyA9IHN1cmZhY2UtPnc7CiAgICBpbnQgYnBwID0gZGYtPkJ5dGVzUGVyUGl4ZWw7CgogICAgaWYgKGJwcCA9PSAyKSB7CiAgICAgICAgdW5jb3B5X29wYXF1ZSA9IHVuY29weV9vcGFxdWVfMTY7CiAgICAgICAgdW5jb3B5X3RyYW5zbCA9IHVuY29weV90cmFuc2xfMTY7CiAgICB9IGVsc2UgewogICAgICAgIHVuY29weV9vcGFxdWUgPSB1bmNvcHlfdHJhbnNsID0gdW5jb3B5XzMyOwogICAgfQoKICAgIHN1cmZhY2UtPnBpeGVscyA9IFNETF9TSU1EQWxsb2Moc3VyZmFjZS0+aCAqIHN1cmZhY2UtPnBpdGNoKTsKICAgIGlmICghc3VyZmFjZS0+cGl4ZWxzKSB7CiAgICAgICAgcmV0dXJuIChTRExfRkFMU0UpOwogICAgfQogICAgc3VyZmFjZS0+ZmxhZ3MgfD0gU0RMX1NJTURfQUxJR05FRDsKICAgIC8qIGZpbGwgYmFja2dyb3VuZCB3aXRoIHRyYW5zcGFyZW50IHBpeGVscyAqLwogICAgU0RMX21lbXNldChzdXJmYWNlLT5waXhlbHMsIDAsIHN1cmZhY2UtPmggKiBzdXJmYWNlLT5waXRjaCk7CgogICAgZHN0ID0gc3VyZmFjZS0+cGl4ZWxzOwogICAgc3JjYnVmID0gKFVpbnQ4ICopIChkZiArIDEpOwogICAgZm9yICg7OykgewogICAgICAgIC8qIGNvcHkgb3BhcXVlIHBpeGVscyAqLwogICAgICAgIGludCBvZnMgPSAwOwogICAgICAgIGRvIHsKICAgICAgICAgICAgdW5zaWduZWQgcnVuOwogICAgICAgICAgICBpZiAoYnBwID09IDIpIHsKICAgICAgICAgICAgICAgIG9mcyArPSBzcmNidWZbMF07CiAgICAgICAgICAgICAgICBydW4gPSBzcmNidWZbMV07CiAgICAgICAgICAgICAgICBzcmNidWYgKz0gMjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG9mcyArPSAoKFVpbnQxNiAqKSBzcmNidWYpWzBdOwogICAgICAgICAgICAgICAgcnVuID0gKChVaW50MTYgKikgc3JjYnVmKVsxXTsKICAgICAgICAgICAgICAgIHNyY2J1ZiArPSA0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChydW4pIHsKICAgICAgICAgICAgICAgIHNyY2J1ZiArPSB1bmNvcHlfb3BhcXVlKGRzdCArIG9mcywgc3JjYnVmLCBydW4sIGRmLCBzZik7CiAgICAgICAgICAgICAgICBvZnMgKz0gcnVuOwogICAgICAgICAgICB9IGVsc2UgaWYgKCFvZnMpIHsKICAgICAgICAgICAgICAgIGdvdG8gZW5kX2Z1bmN0aW9uOwogICAgICAgICAgICB9CiAgICAgICAgfSB3aGlsZSAob2ZzIDwgdyk7CgogICAgICAgIC8qIHNraXAgcGFkZGluZyBpZiBuZWVkZWQgKi8KICAgICAgICBpZiAoYnBwID09IDIpCiAgICAgICAgICAgIHNyY2J1ZiArPSAodWludHB0cl90KSBzcmNidWYgJiAyOwoKICAgICAgICAvKiBjb3B5IHRyYW5zbHVjZW50IHBpeGVscyAqLwogICAgICAgIG9mcyA9IDA7CiAgICAgICAgZG8gewogICAgICAgICAgICB1bnNpZ25lZCBydW47CiAgICAgICAgICAgIG9mcyArPSAoKFVpbnQxNiAqKSBzcmNidWYpWzBdOwogICAgICAgICAgICBydW4gPSAoKFVpbnQxNiAqKSBzcmNidWYpWzFdOwogICAgICAgICAgICBzcmNidWYgKz0gNDsKICAgICAgICAgICAgaWYgKHJ1bikgewogICAgICAgICAgICAgICAgc3JjYnVmICs9IHVuY29weV90cmFuc2woZHN0ICsgb2ZzLCBzcmNidWYsIHJ1biwgZGYsIHNmKTsKICAgICAgICAgICAgICAgIG9mcyArPSBydW47CiAgICAgICAgICAgIH0KICAgICAgICB9IHdoaWxlIChvZnMgPCB3KTsKICAgICAgICBkc3QgKz0gc3VyZmFjZS0+cGl0Y2ggPj4gMjsKICAgIH0KCmVuZF9mdW5jdGlvbjoKICAgIHJldHVybiAoU0RMX1RSVUUpOwp9Cgp2b2lkClNETF9VblJMRVN1cmZhY2UoU0RMX1N1cmZhY2UgKiBzdXJmYWNlLCBpbnQgcmVjb2RlKQp7CiAgICBpZiAoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfUkxFQUNDRUwpIHsKICAgICAgICBzdXJmYWNlLT5mbGFncyAmPSB+U0RMX1JMRUFDQ0VMOwoKICAgICAgICBpZiAocmVjb2RlICYmICEoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfUFJFQUxMT0MpKSB7CiAgICAgICAgICAgIGlmIChzdXJmYWNlLT5tYXAtPmluZm8uZmxhZ3MgJiBTRExfQ09QWV9STEVfQ09MT1JLRVkpIHsKICAgICAgICAgICAgICAgIFNETF9SZWN0IGZ1bGw7CgogICAgICAgICAgICAgICAgLyogcmUtY3JlYXRlIHRoZSBvcmlnaW5hbCBzdXJmYWNlICovCiAgICAgICAgICAgICAgICBzdXJmYWNlLT5waXhlbHMgPSBTRExfU0lNREFsbG9jKHN1cmZhY2UtPmggKiBzdXJmYWNlLT5waXRjaCk7CiAgICAgICAgICAgICAgICBpZiAoIXN1cmZhY2UtPnBpeGVscykgewogICAgICAgICAgICAgICAgICAgIC8qIE9oIGNyYXAuLi4gKi8KICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLT5mbGFncyB8PSBTRExfUkxFQUNDRUw7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc3VyZmFjZS0+ZmxhZ3MgfD0gU0RMX1NJTURfQUxJR05FRDsKCiAgICAgICAgICAgICAgICAvKiBmaWxsIGl0IHdpdGggdGhlIGJhY2tncm91bmQgY29sb3IgKi8KICAgICAgICAgICAgICAgIFNETF9GaWxsUmVjdChzdXJmYWNlLCBOVUxMLCBzdXJmYWNlLT5tYXAtPmluZm8uY29sb3JrZXkpOwoKICAgICAgICAgICAgICAgIC8qIG5vdyByZW5kZXIgdGhlIGVuY29kZWQgc3VyZmFjZSAqLwogICAgICAgICAgICAgICAgZnVsbC54ID0gZnVsbC55ID0gMDsKICAgICAgICAgICAgICAgIGZ1bGwudyA9IHN1cmZhY2UtPnc7CiAgICAgICAgICAgICAgICBmdWxsLmggPSBzdXJmYWNlLT5oOwogICAgICAgICAgICAgICAgU0RMX1JMRUJsaXQoc3VyZmFjZSwgJmZ1bGwsIHN1cmZhY2UsICZmdWxsKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICghVW5STEVBbHBoYShzdXJmYWNlKSkgewogICAgICAgICAgICAgICAgICAgIC8qIE9oIGNyYXAuLi4gKi8KICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLT5mbGFncyB8PSBTRExfUkxFQUNDRUw7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHN1cmZhY2UtPm1hcC0+aW5mby5mbGFncyAmPQogICAgICAgICAgICB+KFNETF9DT1BZX1JMRV9DT0xPUktFWSB8IFNETF9DT1BZX1JMRV9BTFBIQUtFWSk7CgogICAgICAgIFNETF9mcmVlKHN1cmZhY2UtPm1hcC0+ZGF0YSk7CiAgICAgICAgc3VyZmFjZS0+bWFwLT5kYXRhID0gTlVMTDsKICAgIH0KfQoKI2VuZGlmIC8qIFNETF9IQVZFX1JMRSAqLwoKLyogdmk6IHNldCB0cz00IHN3PTQgZXhwYW5kdGFiOiAqLwo=