LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgIHJwbmcyIC0gcHJvZ3Jlc3NpdmUtbW9kZWwgUE5HIGRpc3BsYXkgcHJvZ3JhbSAgICAgICAgICAgICAgICAgIHJwbmcyLXguYwoKICAgVGhpcyBwcm9ncmFtIGRlY29kZXMgYW5kIGRpc3BsYXlzIFBORyBmaWxlcyBwcm9ncmVzc2l2ZWx5LCBhcyBpZiBpdCB3ZXJlCiAgIGEgd2ViIGJyb3dzZXIgKHRob3VnaCB0aGUgZnJvbnQgZW5kIGlzIG9ubHkgc2V0IHVwIHRvIHJlYWQgZnJvbSBmaWxlcykuCiAgIEl0IHN1cHBvcnRzIGdhbW1hIGNvcnJlY3Rpb24sIHVzZXItc3BlY2lmaWVkIGJhY2tncm91bmQgY29sb3JzLCBhbmQgdXNlci0KICAgc3BlY2lmaWVkIGJhY2tncm91bmQgcGF0dGVybnMgKGZvciB0cmFuc3BhcmVudCBpbWFnZXMpLiAgVGhpcyB2ZXJzaW9uIGlzCiAgIGZvciB0aGUgWCBXaW5kb3cgU3lzdGVtICh0ZXN0ZWQgYnkgdGhlIGF1dGhvciB1bmRlciBVbml4IGFuZCBieSBNYXJ0aW4KICAgWmluc2VyIHVuZGVyIE9wZW5WTVM7IG1heSB3b3JrIHVuZGVyIE9TLzIgd2l0aCBhIGxpdHRsZSB0d2Vha2luZykuCgogICBUaGFua3MgdG8gQWRhbSBDb3N0ZWxsbyBhbmQgUGlldGVyIFMuIHZhbiBkZXIgTWV1bGVuIGZvciB0aGUgImRpYW1vbmQiCiAgIGFuZCAicmFkaWFsIHdhdmVzIiBwYXR0ZXJucywgcmVzcGVjdGl2ZWx5LgoKICAgdG8gZG8gKHNvbWVkYXksIG1heWJlKToKICAgIC0gZml4IGV4cG9zZS9yZWRyYXcgY29kZTogIGRvbid0IGRyYXcgZW50aXJlIHJvdyBpZiBvbmx5IHBhcnQgZXhwb3NlZAogICAgLSA4LWJpdCAoY29sb3JtYXBwZWQpIFggc3VwcG9ydAogICAgLSBmaW5pc2ggcmVzaXphYmxlIGNoZWNrZXJib2FyZC1ncmFkaWVudCAoc2l6ZXMgNC0xMjg/KQogICAgLSB1c2UgJS4xMDIzcyB0byBzaW1wbGlmeSB0cnVuY2F0aW9uIG9mIHRpdGxlLWJhciBzdHJpbmc/CgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgQ2hhbmdlbG9nOgogICAgLSAxLjAxOiAgaW5pdGlhbCBwdWJsaWMgcmVsZWFzZQogICAgLSAxLjAyOiAgbW9kaWZpZWQgdG8gYWxsb3cgYWJicmV2aWF0ZWQgb3B0aW9uczsgZml4ZWQgY2hhci91Y2hhciBtaXNtYXRjaAogICAgLSAxLjEwOiAgYWRkZWQgc3VwcG9ydCBmb3Igbm9uLWRlZmF1bHQgdmlzdWFsczsgZml4ZWQgWCBwaXhlbC1jb252ZXJzaW9uCiAgICAtIDEuMTE6ICBhZGRlZCAtdXNsZWVwIG9wdGlvbiBmb3IgZGVtb3M7IGZpeGVkIGNvbW1hbmQtbGluZSBwYXJzaW5nIGJ1ZwogICAgLSAxLjEyOiAgYWRkZWQgLXBhdXNlIG9wdGlvbiBmb3IgZGVtb3MgYW5kIHRlc3RpbmcKICAgIC0gMS4yMDogIGFkZGVkIHJ1bnRpbWUgTU1YLWVuYWJsaW5nL2Rpc2FibGluZyBhbmQgbmV3IC1tbXgqIG9wdGlvbnMKICAgIC0gMS4yMTogIGZpeGVkIHNvbWUgc21hbGwgWCBtZW1vcnkgbGVha3MgKHRoYW5rcyB0byBGcmFu529pcyBQZXRpdGplYW4pCiAgICAtIDEuMjI6ICBmaXhlZCBYRnJlZUdDKCkgY3Jhc2ggYnVnICh0aGFua3MgdG8gUGF0cmljayBXZWxjaGUpCiAgICAtIDEuMjM6ICBhZGRlZCAtYmdwYXQgMCBtb2RlIChzdGQgd2hpdGUvZ3JheSBjaGVja2VyYm9hcmQsIDh4OCBzcXVhcmVzKQogICAgLSAxLjMwOiAgYWRkZWQgLWxvb3Agb3B0aW9uIGZvciAtYmdwYXQgKGlmZGVmIEZFQVRVUkVfTE9PUCk7IGZpeGVkIGJwcCA9CiAgICAgICAgICAgICAgMjQ7IGFkZGVkIHN1cHBvcnQgZm9yIFggcmVzb3VyY2VzICh0aGFua3MgdG8gR2VyaGFyZCBOaWtsYXNjaCkKICAgIC0gMS4zMTogIGFkZGVkIGNvZGUgdG8gc2tpcCB1bnVzZWQgY2h1bmtzICh0aGFua3MgdG8gR2xlbm4gUmFuZGVycy1QZWhyc29uKQogICAgLSAxLjMyOiAgYWRkZWQgQU1ENjQvRU02NFQgc3VwcG9ydCAoX194ODZfNjRfXyk7IGFkZGVkIGJhc2ljIGV4cG9zZS9yZWRyYXcKICAgICAgICAgICAgICBoYW5kbGluZwogICAgLSAyLjAwOiAgZHVhbC1saWNlbnNlZCAoYWRkZWQgR05VIEdQTCkKICAgIC0gMi4wMTogIGZpeGVkIDY0LWJpdCB0eXBvIGluIHJlYWRwbmcyLmM7IGZpeGVkIC1wYXVzZSB1c2FnZSBkZXNjcmlwdGlvbgogICAgLSAyLjAyOiAgZml4ZWQgaW1wcm9wZXIgZGlzcGxheSBvZiB1c2FnZSBzY3JlZW4gb24gUE5HIGVycm9yKHMpOyBmaXhlZAogICAgICAgICAgICAgIHVuZXhwZWN0ZWQtRU9GIGFuZCBmaWxlLXJlYWQtZXJyb3IgY2FzZXM7IGZpeGVkIFRyYWNlKCkgY3V0LWFuZC0KICAgICAgICAgICAgICBwYXN0ZSBidWdzCiAgICAtIDIuMDM6ICBkZWxldGVkIHJ1bnRpbWUgTU1YLWVuYWJsaW5nL2Rpc2FibGluZyBhbmQgb2Jzb2xldGUgLW1teCogb3B0aW9ucwoKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDA4IEdyZWcgUm9lbG9mcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcywiIHdpdGhvdXQgd2FycmFudHkgb2YgYW55IGtpbmQsCiAgICAgIGV4cHJlc3Mgb3IgaW1wbGllZC4gIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBhdXRob3Igb3IgY29udHJpYnV0b3JzCiAgICAgIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIGluIGFueSB3YXkgZnJvbSB0aGUgdXNlIG9mCiAgICAgIHRoaXMgc29mdHdhcmUuCgogICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBEVUFMLUxJQ0VOU0VELiAgWW91IG1heSBtb2RpZnkgYW5kL29yCiAgICAgIHJlZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2Ygb25lIG9mIHRoZQogICAgICBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzIChhdCB5b3VyIG9wdGlvbik6CgoKICAgICAgTElDRU5TRSAxICgiQlNELWxpa2Ugd2l0aCBhZHZlcnRpc2luZyBjbGF1c2UiKToKCiAgICAgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAogICAgICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlCiAgICAgIGl0IGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKCiAgICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAgICAgICAgIG5vdGljZSwgZGlzY2xhaW1lciwgYW5kIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLgogICAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhLQogICAgICAgICB0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogICAgICAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKICAgICAgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CgogICAgICAgICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IEdyZWcgUm9lbG9mcwogICAgICAgICAgICBhbmQgY29udHJpYnV0b3JzIGZvciB0aGUgYm9vaywgIlBORzogVGhlIERlZmluaXRpdmUgR3VpZGUsIgogICAgICAgICAgICBwdWJsaXNoZWQgYnkgTydSZWlsbHkgYW5kIEFzc29jaWF0ZXMuCgoKICAgICAgTElDRU5TRSAyIChHTlUgR1BMIHYyIG9yIGxhdGVyKToKCiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKICAgICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQoKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKI2RlZmluZSBQUk9HTkFNRSAgInJwbmcyLXgiCiNkZWZpbmUgTE9OR05BTUUgICJQcm9ncmVzc2l2ZSBQTkcgVmlld2VyIGZvciBYIgojZGVmaW5lIFZFUlNJT04gICAiMi4wMyBvZiAyNSBGZWJydWFyeSAyMDEwIgojZGVmaW5lIFJFU05BTUUgICAicnBuZzIiCS8qIG91ciBYIHJlc291cmNlIGFwcGxpY2F0aW9uIG5hbWUgKi8KI2RlZmluZSBSRVNDTEFTUyAgIlJwbmciCS8qIG91ciBYIHJlc291cmNlIGNsYXNzIG5hbWUgKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzZXRqbXAuaD4gICAgICAgLyogZm9yIGptcGJ1ZiBkZWNsYXJhdGlvbiBpbiByZWFkcG5nMi5oICovCiNpbmNsdWRlIDx0aW1lLmg+CiNpbmNsdWRlIDxtYXRoLmg+ICAgICAgICAgLyogb25seSBmb3IgUHZkTSBiYWNrZ3JvdW5kIGNvZGUgKi8KI2luY2x1ZGUgPFgxMS9YbGliLmg+CiNpbmNsdWRlIDxYMTEvWHV0aWwuaD4KI2luY2x1ZGUgPFgxMS9Yb3MuaD4KI2luY2x1ZGUgPFgxMS9rZXlzeW0uaD4gICAvKiBkZWZpbmVzIFhLXyogbWFjcm9zICovCgojaWZkZWYgVk1TCiMgIGluY2x1ZGUgPHVuaXN0ZC5oPgojZW5kaWYKCi8qIGFsbCBmb3IgUHZkTSBiYWNrZ3JvdW5kIGNvZGU6ICovCiNpZm5kZWYgUEkKIyAgZGVmaW5lIFBJICAgICAgICAgICAgIDMuMTQxNTkyNjUzNTg5NzkzMjM4CiNlbmRpZgojZGVmaW5lIFBJXzIgICAgICAgICAgICAgKFBJKjAuNSkKI2RlZmluZSBJTlZfUElfMzYwICAgICAgICgzNjAuMCAvIFBJKQojZGVmaW5lIE1BWChhLGIpICAgICAgICAgKGE+Yj9hOmIpCiNkZWZpbmUgTUlOKGEsYikgICAgICAgICAoYTxiP2E6YikKI2RlZmluZSBDTElQKGEsbWluLG1heCkgIE1BWChtaW4sTUlOKChhKSxtYXgpKQojZGVmaW5lIEFCUyhhKSAgICAgICAgICAgKChhKTwwPy0oYSk6KGEpKQojZGVmaW5lIENMSVA4UChjKSAgICAgICAgTUFYKDAsKE1JTigoYyksMjU1KSkpICAgLyogOC1iaXQgcG9zLiBpbnRlZ2VyICh1Y2gpICovCiNkZWZpbmUgUk9VTkRGKGYpICAgICAgICAoKGludCkoZiArIDAuNSkpCgojZGVmaW5lIFFVSVQoZSxrKSAoKGUudHlwZSA9PSBCdXR0b25QcmVzcyAmJiBlLnhidXR0b24uYnV0dG9uID09IEJ1dHRvbjEpIHx8ICBcCiAgICAgICAgICAgICAgICAgIChlLnR5cGUgPT0gS2V5UHJlc3MgJiYgICAvKiAgdi0tLSBvciAxIGZvciBzaGlmdGVkIGtleXMgKi8gIFwKICAgICAgICAgICAgICAgICAgKChrID0gWExvb2t1cEtleXN5bSgmZS54a2V5LCAwKSkgPT0gWEtfcSB8fCBrID09IFhLX0VzY2FwZSkpKQoKI2RlZmluZSBOT18yNEJJVF9NQVNLUwkvKiB1bmRlZiBjYXNlIG5vdCBmdWxseSB3cml0dGVuLS1vbmx5IGZvciByZWRpc3BsYXkoKSAqLwoKI2RlZmluZSByZ2IxX21heCAgIGJnX2ZyZXEKI2RlZmluZSByZ2IxX21pbiAgIGJnX2dyYXkKI2RlZmluZSByZ2IyX21heCAgIGJnX2JzYXQKI2RlZmluZSByZ2IyX21pbiAgIGJnX2Jyb3QKCi8qICNkZWZpbmUgREVCVUcgKi8gICAgIC8qIHRoaXMgZW5hYmxlcyB0aGUgVHJhY2UoKSBtYWNyb3MgKi8KCiNpbmNsdWRlICJyZWFkcG5nMi5oIiAgIC8qIHR5cGVkZWZzLCBjb21tb24gbWFjcm9zLCByZWFkcG5nMiBwcm90b3R5cGVzICovCgoKLyogY291bGQganVzdCBpbmNsdWRlIHBuZy5oLCBidXQgdGhpcyBtYWNybyBpcyB0aGUgb25seSB0aGluZyB3ZSBuZWVkCiAqIChuYW1lIGFuZCB0eXBlZGVmcyBjaGFuZ2VkIHRvIGxvY2FsIHZlcnNpb25zKTsgbm90ZSB0aGF0IHNpZGUgZWZmZWN0cwogKiBvbmx5IGhhcHBlbiB3aXRoIGFscGhhICh3aGljaCBjb3VsZCBlYXNpbHkgYmUgYXZvaWRlZCB3aXRoCiAqICJ1c2ggYWNvcHkgPSAoYWxwaGEpOyIpICovCgojZGVmaW5lIGFscGhhX2NvbXBvc2l0ZShjb21wb3NpdGUsIGZnLCBhbHBoYSwgYmcpIHsgICAgICAgICAgICAgICBcCiAgICB1c2ggdGVtcCA9ICgodXNoKShmZykqKHVzaCkoYWxwaGEpICsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICh1c2gpKGJnKSoodXNoKSgyNTUgLSAodXNoKShhbHBoYSkpICsgKHVzaCkxMjgpOyAgXAogICAgKGNvbXBvc2l0ZSkgPSAodWNoKSgodGVtcCArICh0ZW1wID4+IDgpKSA+PiA4KTsgICAgICAgICAgICAgICBcCn0KCgojZGVmaW5lIElOQlVGU0laRSA0MDk2ICAgLyogd2l0aCBwc2V1ZG8tdGltaW5nIG9uICgxIHNlYyBkZWxheS9ibG9jayksIHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAqICBibG9jayBzaXplIGNvcnJlc3BvbmRzIHJvdWdobHkgdG8gYSBkb3dubG9hZAogICAgICAgICAgICAgICAgICAgICAgICAgICogIHNwZWVkIDEwJSBmYXN0ZXIgdGhhbiB0aGVvcmV0aWNhbCAzMy42SyBtYXhpbXVtCiAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgKGFzc3VtaW5nIDggZGF0YSBiaXRzLCAxIHN0b3AgYml0IGFuZCBubyBvdGhlcgogICAgICAgICAgICAgICAgICAgICAgICAgICogIG92ZXJoZWFkKSAqLwoKLyogbG9jYWwgcHJvdG90eXBlcyAqLwpzdGF0aWMgdm9pZCBycG5nMl94X2luaXQgKHZvaWQpOwpzdGF0aWMgaW50ICBycG5nMl94X2NyZWF0ZV93aW5kb3cgKHZvaWQpOwpzdGF0aWMgaW50ICBycG5nMl94X2xvYWRfYmdfaW1hZ2UgKHZvaWQpOwpzdGF0aWMgdm9pZCBycG5nMl94X2Rpc3BsYXlfcm93ICh1bGcgcm93KTsKc3RhdGljIHZvaWQgcnBuZzJfeF9maW5pc2hfZGlzcGxheSAodm9pZCk7CnN0YXRpYyB2b2lkIHJwbmcyX3hfcmVkaXNwbGF5X2ltYWdlICh1bGcgc3RhcnRjb2wsIHVsZyBzdGFydHJvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVsZyB3aWR0aCwgdWxnIGhlaWdodCk7CiNpZmRlZiBGRUFUVVJFX0xPT1AKc3RhdGljIHZvaWQgcnBuZzJfeF9yZWxvYWRfYmdfaW1hZ2UgKHZvaWQpOwpzdGF0aWMgaW50ICBpc19udW1iZXIgKGNoYXIgKnApOwojZW5kaWYKc3RhdGljIHZvaWQgcnBuZzJfeF9jbGVhbnVwICh2b2lkKTsKc3RhdGljIGludCAgcnBuZzJfeF9tc2IgKHVsZyB1MzJ2YWwpOwoKCnN0YXRpYyBjaGFyIHRpdGxlYmFyWzEwMjRdLCAqd2luZG93X25hbWUgPSB0aXRsZWJhcjsKc3RhdGljIGNoYXIgKmFwcG5hbWUgPSBMT05HTkFNRTsKc3RhdGljIGNoYXIgKmljb25fbmFtZSA9IFBST0dOQU1FOwpzdGF0aWMgY2hhciAqcmVzX25hbWUgPSBSRVNOQU1FOwpzdGF0aWMgY2hhciAqcmVzX2NsYXNzID0gUkVTQ0xBU1M7CnN0YXRpYyBjaGFyICpmaWxlbmFtZTsKc3RhdGljIEZJTEUgKmluZmlsZTsKCnN0YXRpYyBtYWlucHJvZ19pbmZvIHJwbmcyX2luZm87CgpzdGF0aWMgdWNoIGluYnVmW0lOQlVGU0laRV07CnN0YXRpYyBpbnQgaW5jb3VudDsKCnN0YXRpYyBpbnQgcGF0ID0gNjsgICAgICAgIC8qIG11c3QgYmUgbGVzcyB0aGFuIG51bV9iZ3BhdCAqLwpzdGF0aWMgaW50IGJnX2ltYWdlID0gMDsKc3RhdGljIGludCBiZ3NjYWxlLCBiZ3NjYWxlX2RlZmF1bHQgPSAxNjsKc3RhdGljIHVsZyBiZ19yb3dieXRlczsKc3RhdGljIHVjaCAqYmdfZGF0YTsKCmludCBwYXVzZV9hZnRlcl9wYXNzID0gRkFMU0U7CmludCBkZW1vX3RpbWluZyA9IEZBTFNFOwp1bGcgdXNsZWVwX2R1cmF0aW9uID0gMEw7CgpzdGF0aWMgc3RydWN0IHJnYl9jb2xvciB7CiAgICB1Y2ggciwgZywgYjsKfSByZ2JbXSA9IHsKICAgIHsgIDAsICAgMCwgICAwfSwgICAgLyogIDA6ICBibGFjayAqLwogICAgezI1NSwgMjU1LCAyNTV9LCAgICAvKiAgMTogIHdoaXRlICovCiAgICB7MTczLCAxMzIsICA1N30sICAgIC8qICAyOiAgdGFuICovCiAgICB7IDY0LCAxMzIsICAgMH0sICAgIC8qICAzOiAgbWVkaXVtIGdyZWVuICovCiAgICB7MTg5LCAxMTcsICAgMX0sICAgIC8qICA0OiAgZ29sZCAqLwogICAgezI1MywgMjQ5LCAgIDF9LCAgICAvKiAgNTogIHllbGxvdyAqLwogICAgeyAgMCwgICAwLCAyNTV9LCAgICAvKiAgNjogIGJsdWUgKi8KICAgIHsgIDAsICAgMCwgMTIwfSwgICAgLyogIDc6ICBtZWRpdW0gYmx1ZSAqLwogICAgezI1NSwgICAwLCAyNTV9LCAgICAvKiAgODogIG1hZ2VudGEgKi8KICAgIHsgNjQsICAgMCwgIDY0fSwgICAgLyogIDk6ICBkYXJrIG1hZ2VudGEgKi8KICAgIHsyNTUsICAgMCwgICAwfSwgICAgLyogMTA6ICByZWQgKi8KICAgIHsgNjQsICAgMCwgICAwfSwgICAgLyogMTE6ICBkYXJrIHJlZCAqLwogICAgezI1NSwgMTI3LCAgIDB9LCAgICAvKiAxMjogIG9yYW5nZSAqLwogICAgezE5MiwgIDk2LCAgIDB9LCAgICAvKiAxMzogIGRhcmtlciBvcmFuZ2UgKi8KICAgIHsgMjQsICA2MCwgICAwfSwgICAgLyogMTQ6ICBkYXJrIGdyZWVuLXllbGxvdyAqLwogICAgeyA4NSwgMTI1LCAyMDB9LCAgICAvKiAxNTogIGljZSBibHVlICovCiAgICB7MTkyLCAxOTIsIDE5Mn0gICAgIC8qIDE2OiAgTmV0c2NhcGUvTW9zYWljIGdyYXkgKi8KfTsKLyogbm90IHVzZWQgZm9yIG5vdywgYnV0IHNob3VsZCBiZSBmb3IgZXJyb3ItY2hlY2tpbmc6CnN0YXRpYyBpbnQgbnVtX3JnYiA9IHNpemVvZihyZ2IpIC8gc2l6ZW9mKHN0cnVjdCByZ2JfY29sb3IpOwogKi8KCi8qCiAgICBUaGlzIHdob2xlIHN0cnVjdCBpcyBhIGZhaXJseSBjaGVlc3kgd2F5IHRvIGtlZXAgdGhlIG51bWJlciBvZgogICAgY29tbWFuZC1saW5lIG9wdGlvbnMgdG8gYSBtaW5pbXVtLiAgVGhlIHJhZGlhbC13YXZlcyBiYWNrZ3JvdW5kCiAgICB0eXBlIGlzIGEgcGFydGljdWxhcmx5IHBvb3IgZml0IHRvIHRoZSBpbnRlZ2VyIGVsZW1lbnRzIG9mIHRoZQogICAgc3RydWN0Li4uYnV0IGEgZmV3IG1hY3JvcyBhbmQgYSBsaXR0bGUgZml4ZWQtcG9pbnQgbWF0aCB3aWxsIGRvCiAgICB3b25kZXJzIGZvciB5YS4KCiAgICB0eXBlIGJpdHM6CiAgICAgICBGIEUgRCBDIEIgQSA5IDggNyA2IDUgNCAzIDIgMSAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwgfCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8ICstKy0rLS0gMCA9IHNoYXJwLWVkZ2VkIGNoZWNrZXJib2FyZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCAgICAgICAgIDEgPSBzb2Z0IGRpYW1vbmRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8ICAgICAgICAgMiA9IHJhZGlhbCB3YXZlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCAgICAgICAzLTcgPSB1bmRlZmluZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICstLSBncmFkaWVudCAjMiBpbnZlcnRlZD8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0gYWx0ZXJuYXRpbmcgY29sdW1ucyBpbnZlcnRlZD8KICovCnN0YXRpYyBzdHJ1Y3QgYmFja2dyb3VuZF9wYXR0ZXJuIHsKICAgIHVzaCB0eXBlOwogICAgaW50IHJnYjFfbWF4LCByZ2IxX21pbjsgICAgIC8qIG9yIGJnX2ZyZXEsIGJnX2dyYXkgKi8KICAgIGludCByZ2IyX21heCwgcmdiMl9taW47ICAgICAvKiBvciBiZ19ic2F0LCBiZ19icm90IChib3RoIHNjYWxlZCBieSAxMCkqLwp9IGJnW10gPSB7CiAgICB7MCwgICAgIDEsMSwgMTYsMTZ9LCAgICAgICAgLyogY2hlY2tlcmVkOiAgd2hpdGUgdnMuIGxpZ2h0IGdyYXkgKGJhc2ljKSAqLwogICAgezArOCwgICAyLDAsICAxLDE1fSwgICAgICAgIC8qIGNoZWNrZXJlZDogIHRhbi9ibGFjayB2cy4gd2hpdGUvaWNlIGJsdWUgKi8KICAgIHswKzI0LCAgMiwwLCAgMSwwfSwgICAgICAgICAvKiBjaGVja2VyZWQ6ICB0YW4vYmxhY2sgdnMuIHdoaXRlL2JsYWNrICovCiAgICB7MCs4LCAgIDQsNSwgIDAsMn0sICAgICAgICAgLyogY2hlY2tlcmVkOiAgZ29sZC95ZWxsb3cgdnMuIGJsYWNrL3RhbiAqLwogICAgezArOCwgICA0LDUsICAwLDZ9LCAgICAgICAgIC8qIGNoZWNrZXJlZDogIGdvbGQveWVsbG93IHZzLiBibGFjay9ibHVlICovCiAgICB7MCwgICAgIDcsMCwgIDgsOX0sICAgICAgICAgLyogY2hlY2tlcmVkOiAgZGVlcCBibHVlL2JsYWNrIHZzLiBtYWdlbnRhICovCiAgICB7MCs4LCAgMTMsMCwgIDUsMTR9LCAgICAgICAgLyogY2hlY2tlcmVkOiAgb3JhbmdlL2JsYWNrIHZzLiB5ZWxsb3cgKi8KICAgIHswKzgsICAxMiwwLCAxMCwxMX0sICAgICAgICAvKiBjaGVja2VyZWQ6ICBvcmFuZ2UvYmxhY2sgdnMuIHJlZCAqLwogICAgezEsICAgICA3LDAsICA4LDB9LCAgICAgICAgIC8qIGRpYW1vbmRzOiAgZGVlcCBibHVlL2JsYWNrIHZzLiBtYWdlbnRhICovCiAgICB7MSwgICAgMTIsMCwgMTEsMH0sICAgICAgICAgLyogZGlhbW9uZHM6ICBvcmFuZ2UgdnMuIGRhcmsgcmVkICovCiAgICB7MSwgICAgMTAsMCwgIDcsMH0sICAgICAgICAgLyogZGlhbW9uZHM6ICByZWQgdnMuIG1lZGl1bSBibHVlICovCiAgICB7MSwgICAgIDQsMCwgIDUsMH0sICAgICAgICAgLyogZGlhbW9uZHM6ICBnb2xkIHZzLiB5ZWxsb3cgKi8KICAgIHsxLCAgICAgMywwLCAgMCwwfSwgICAgICAgICAvKiBkaWFtb25kczogIG1lZGl1bSBncmVlbiB2cy4gYmxhY2sgKi8KICAgIHsyLCAgICAxNiwgMTAwLCAgMjAsICAgMH0sICAvKiByYWRpYWw6ICB+aGFyZCByYWRpYWwgY29sb3ItYmVhbXMgKi8KICAgIHsyLCAgICAxOCwgMTAwLCAgMTAsICAgMn0sICAvKiByYWRpYWw6ICBzb2Z0LCBjdXJ2ZWQgcmFkaWFsIGNvbG9yLWJlYW1zICovCiAgICB7MiwgICAgMTYsIDI1NiwgMTAwLCAyNTB9LCAgLyogcmFkaWFsOiAgdmVyeSB0aWdodCBzcGlyYWwgKi8KICAgIHsyLCAxMDAwMCwgMjU2LCAgMTEsICAgMH0gICAvKiByYWRpYWw6ICBkaXBvbGUtbW9pcmUnIChhbG1vc3QgZnJhY3RhbCkgKi8KfTsKc3RhdGljIGludCBudW1fYmdwYXQgPSBzaXplb2YoYmcpIC8gc2l6ZW9mKHN0cnVjdCBiYWNrZ3JvdW5kX3BhdHRlcm4pOwoKCi8qIFgtc3BlY2lmaWMgdmFyaWFibGVzICovCnN0YXRpYyBjaGFyICpkaXNwbGF5bmFtZTsKc3RhdGljIFhJbWFnZSAqeGltYWdlOwpzdGF0aWMgRGlzcGxheSAqZGlzcGxheTsKc3RhdGljIGludCBkZXB0aDsKc3RhdGljIFZpc3VhbCAqdmlzdWFsOwpzdGF0aWMgWFZpc3VhbEluZm8gKnZpc3VhbF9saXN0OwpzdGF0aWMgaW50IFJTaGlmdCwgR1NoaWZ0LCBCU2hpZnQ7CnN0YXRpYyB1bGcgUk1hc2ssIEdNYXNrLCBCTWFzazsKc3RhdGljIFdpbmRvdyB3aW5kb3c7CnN0YXRpYyBHQyBnYzsKc3RhdGljIENvbG9ybWFwIGNvbG9ybWFwOwoKc3RhdGljIGludCBoYXZlX25vbmRlZmF1bHRfdmlzdWFsID0gRkFMU0U7CnN0YXRpYyBpbnQgaGF2ZV9jb2xvcm1hcCA9IEZBTFNFOwpzdGF0aWMgaW50IGhhdmVfd2luZG93ID0gRkFMU0U7CnN0YXRpYyBpbnQgaGF2ZV9nYyA9IEZBTFNFOwoKCgoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7CiNpZmRlZiBzZ2kKICAgIGNoYXIgdG1wbGluZVs4MF07CiNlbmRpZgogICAgY2hhciAqcCwgKmJnc3RyID0gTlVMTDsKICAgIGludCByYywgYWxlbiwgZmxlbjsKICAgIGludCBlcnJvciA9IDA7CiAgICBpbnQgdGltaW5nID0gRkFMU0U7CiAgICBpbnQgaGF2ZV9iZyA9IEZBTFNFOwojaWZkZWYgRkVBVFVSRV9MT09QCiAgICBpbnQgbG9vcCA9IEZBTFNFOwogICAgbG9uZyBsb29wX2ludGVydmFsID0gLTE7CQkvKiBzZWNvbmRzICgxMDAsMDAwIG1heCkgKi8KI2VuZGlmCiAgICBkb3VibGUgTFVUX2V4cG9uZW50OyAgICAgICAgICAgICAgICAvKiBqdXN0IHRoZSBsb29rdXAgdGFibGUgKi8KICAgIGRvdWJsZSBDUlRfZXhwb25lbnQgPSAyLjI7ICAgICAgICAgIC8qIGp1c3QgdGhlIG1vbml0b3IgKi8KICAgIGRvdWJsZSBkZWZhdWx0X2Rpc3BsYXlfZXhwb25lbnQ7ICAgIC8qIHdob2xlIGRpc3BsYXkgc3lzdGVtICovCiAgICBYRXZlbnQgZTsKICAgIEtleVN5bSBrOwoKCiAgICAvKiBGaXJzdCBpbml0aWFsaXplIGEgZmV3IHRoaW5ncywganVzdCB0byBiZSBzdXJlLS1tZW1zZXQgdGFrZXMgY2FyZSBvZgogICAgICogZGVmYXVsdCBiYWNrZ3JvdW5kIGNvbG9yIChibGFjayksIGJvb2xlYW5zIChGQUxTRSksIHBvaW50ZXJzIChOVUxMKSwKICAgICAqIGV0Yy4gKi8KCiAgICBkaXNwbGF5bmFtZSA9IChjaGFyICopTlVMTDsKICAgIGZpbGVuYW1lID0gKGNoYXIgKilOVUxMOwogICAgbWVtc2V0KCZycG5nMl9pbmZvLCAwLCBzaXplb2YobWFpbnByb2dfaW5mbykpOwoKCiAgICAvKiBTZXQgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIG91ciBkaXNwbGF5LXN5c3RlbSBleHBvbmVudCwgaS5lLiwgdGhlCiAgICAgKiBwcm9kdWN0IG9mIHRoZSBDUlQgZXhwb25lbnQgYW5kIHRoZSBleHBvbmVudCBjb3JyZXNwb25kaW5nIHRvCiAgICAgKiB0aGUgZnJhbWUtYnVmZmVyJ3MgbG9va3VwIHRhYmxlIChMVVQpLCBpZiBhbnkuICBUaGlzIGlzIG5vdCBhbgogICAgICogZXhoYXVzdGl2ZSBsaXN0IG9mIExVVCB2YWx1ZXMgKGUuZy4sIE9wZW5TdGVwIGhhcyBhIGxvdCBvZiB3ZWlyZAogICAgICogb25lcyksIGJ1dCBpdCBzaG91bGQgY292ZXIgOTklIG9mIHRoZSBjdXJyZW50IHBvc3NpYmlsaXRpZXMuICovCgojaWYgZGVmaW5lZChOZVhUKQogICAgLyogdGhpcmQtcGFydHkgdXRpbGl0aWVzIGNhbiBtb2RpZnkgdGhlIGRlZmF1bHQgTFVUIGV4cG9uZW50ICovCiAgICBMVVRfZXhwb25lbnQgPSAxLjAgLyAyLjI7CiAgICAvKgogICAgaWYgKHNvbWVfbmV4dF9mdW5jdGlvbl90aGF0X3JldHVybnNfZ2FtbWEoJm5leHRfZ2FtbWEpKQogICAgICAgIExVVF9leHBvbmVudCA9IDEuMCAvIG5leHRfZ2FtbWE7CiAgICAgKi8KI2VsaWYgZGVmaW5lZChzZ2kpCiAgICBMVVRfZXhwb25lbnQgPSAxLjAgLyAxLjc7CiAgICAvKiB0aGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYW55IGRvY3VtZW50ZWQgZnVuY3Rpb24gdG8KICAgICAqIGdldCB0aGUgImdhbW1hIiB2YWx1ZSwgc28gd2UgZG8gaXQgdGhlIGhhcmQgd2F5ICovCiAgICBpbmZpbGUgPSBmb3BlbigiL2V0Yy9jb25maWcvc3lzdGVtLmdsR2FtbWFWYWwiLCAiciIpOwogICAgaWYgKGluZmlsZSkgewogICAgICAgIGRvdWJsZSBzZ2lfZ2FtbWE7CgogICAgICAgIGZnZXRzKHRtcGxpbmUsIDgwLCBpbmZpbGUpOwogICAgICAgIGZjbG9zZShpbmZpbGUpOwogICAgICAgIHNnaV9nYW1tYSA9IGF0b2YodG1wbGluZSk7CiAgICAgICAgaWYgKHNnaV9nYW1tYSA+IDAuMCkKICAgICAgICAgICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gc2dpX2dhbW1hOwogICAgfQojZWxpZiBkZWZpbmVkKE1hY2ludG9zaCkKICAgIExVVF9leHBvbmVudCA9IDEuOCAvIDIuNjE7CiAgICAvKgogICAgaWYgKHNvbWVfbWFjX2Z1bmN0aW9uX3RoYXRfcmV0dXJuc19nYW1tYSgmbWFjX2dhbW1hKSkKICAgICAgICBMVVRfZXhwb25lbnQgPSBtYWNfZ2FtbWEgLyAyLjYxOwogICAgICovCiNlbHNlCiAgICBMVVRfZXhwb25lbnQgPSAxLjA7ICAgLyogYXNzdW1lIG5vIExVVDogIG1vc3QgUENzICovCiNlbmRpZgoKICAgIC8qIHRoZSBkZWZhdWx0cyBhYm92ZSBnaXZlIDEuMCwgMS4zLCAxLjUgYW5kIDIuMiwgcmVzcGVjdGl2ZWx5OiAqLwogICAgZGVmYXVsdF9kaXNwbGF5X2V4cG9uZW50ID0gTFVUX2V4cG9uZW50ICogQ1JUX2V4cG9uZW50OwoKCiAgICAvKiBJZiB0aGUgdXNlciBoYXMgc2V0IHRoZSBTQ1JFRU5fR0FNTUEgZW52aXJvbm1lbnQgdmFyaWFibGUgYXMgc3VnZ2VzdGVkCiAgICAgKiAoc29tZXdoYXQgaW1wcmVjaXNlbHkpIGluIHRoZSBsaWJwbmcgZG9jdW1lbnRhdGlvbiwgdXNlIHRoYXQ7IG90aGVyd2lzZQogICAgICogdXNlIHRoZSBkZWZhdWx0IHZhbHVlIHdlIGp1c3QgY2FsY3VsYXRlZC4gIEVpdGhlciB3YXksIHRoZSB1c2VyIG1heQogICAgICogb3ZlcnJpZGUgdGhpcyB2aWEgYSBjb21tYW5kLWxpbmUgb3B0aW9uLiAqLwoKICAgIGlmICgocCA9IGdldGVudigiU0NSRUVOX0dBTU1BIikpICE9IE5VTEwpCiAgICAgICAgcnBuZzJfaW5mby5kaXNwbGF5X2V4cG9uZW50ID0gYXRvZihwKTsKICAgIGVsc2UKICAgICAgICBycG5nMl9pbmZvLmRpc3BsYXlfZXhwb25lbnQgPSBkZWZhdWx0X2Rpc3BsYXlfZXhwb25lbnQ7CgoKICAgIC8qIE5vdyBwYXJzZSB0aGUgY29tbWFuZCBsaW5lIGZvciBvcHRpb25zIGFuZCB0aGUgUE5HIGZpbGVuYW1lLiAqLwoKICAgIHdoaWxlICgqKythcmd2ICYmICFlcnJvcikgewogICAgICAgIGlmICghc3RybmNtcCgqYXJndiwgIi1kaXNwbGF5IiwgMikpIHsKICAgICAgICAgICAgaWYgKCEqKythcmd2KQogICAgICAgICAgICAgICAgKytlcnJvcjsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZGlzcGxheW5hbWUgPSAqYXJndjsKICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKCphcmd2LCAiLWdhbW1hIiwgMikpIHsKICAgICAgICAgICAgaWYgKCEqKythcmd2KQogICAgICAgICAgICAgICAgKytlcnJvcjsKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBycG5nMl9pbmZvLmRpc3BsYXlfZXhwb25lbnQgPSBhdG9mKCphcmd2KTsKICAgICAgICAgICAgICAgIGlmIChycG5nMl9pbmZvLmRpc3BsYXlfZXhwb25lbnQgPD0gMC4wKQogICAgICAgICAgICAgICAgICAgICsrZXJyb3I7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKCphcmd2LCAiLWJnY29sb3IiLCA0KSkgewogICAgICAgICAgICBpZiAoISorK2FyZ3YpCiAgICAgICAgICAgICAgICArK2Vycm9yOwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGJnc3RyID0gKmFyZ3Y7CiAgICAgICAgICAgICAgICBpZiAoc3RybGVuKGJnc3RyKSAhPSA3IHx8IGJnc3RyWzBdICE9ICcjJykKICAgICAgICAgICAgICAgICAgICArK2Vycm9yOwogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaGF2ZV9iZyA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgYmdfaW1hZ2UgPSBGQUxTRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoKmFyZ3YsICItYmdwYXQiLCA0KSkgewogICAgICAgICAgICBpZiAoISorK2FyZ3YpCiAgICAgICAgICAgICAgICArK2Vycm9yOwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHBhdCA9IGF0b2koKmFyZ3YpOwogICAgICAgICAgICAgICAgaWYgKHBhdCA+PSAwICYmIHBhdCA8IG51bV9iZ3BhdCkgewogICAgICAgICAgICAgICAgICAgIGJnX2ltYWdlID0gVFJVRTsKICAgICAgICAgICAgICAgICAgICBoYXZlX2JnID0gRkFMU0U7CiAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICArK2Vycm9yOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcCgqYXJndiwgIi11c2xlZXAiLCAyKSkgewogICAgICAgICAgICBpZiAoISorK2FyZ3YpCiAgICAgICAgICAgICAgICArK2Vycm9yOwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHVzbGVlcF9kdXJhdGlvbiA9ICh1bGcpYXRvbCgqYXJndik7CiAgICAgICAgICAgICAgICBkZW1vX3RpbWluZyA9IFRSVUU7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKCphcmd2LCAiLXBhdXNlIiwgMikpIHsKICAgICAgICAgICAgcGF1c2VfYWZ0ZXJfcGFzcyA9IFRSVUU7CiAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcCgqYXJndiwgIi10aW1pbmciLCAyKSkgewogICAgICAgICAgICB0aW1pbmcgPSBUUlVFOwojaWZkZWYgRkVBVFVSRV9MT09QCiAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcCgqYXJndiwgIi1sb29wIiwgMikpIHsKICAgICAgICAgICAgbG9vcCA9IFRSVUU7CiAgICAgICAgICAgIGlmICghYXJndlsxXSB8fCAhaXNfbnVtYmVyKGFyZ3ZbMV0pKQogICAgICAgICAgICAgICAgbG9vcF9pbnRlcnZhbCA9IDI7CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgKythcmd2OwogICAgICAgICAgICAgICAgbG9vcF9pbnRlcnZhbCA9IGF0b2woKmFyZ3YpOwogICAgICAgICAgICAgICAgaWYgKGxvb3BfaW50ZXJ2YWwgPCAwKQogICAgICAgICAgICAgICAgICAgIGxvb3BfaW50ZXJ2YWwgPSAyOwogICAgICAgICAgICAgICAgZWxzZSBpZiAobG9vcF9pbnRlcnZhbCA+IDEwMDAwMCkgICAvKiBiaXQgbW9yZSB0aGFuIG9uZSBkYXkgKi8KICAgICAgICAgICAgICAgICAgICBsb29wX2ludGVydmFsID0gMTAwMDAwOwogICAgICAgICAgICB9CiNlbmRpZgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgqKmFyZ3YgIT0gJy0nKSB7CiAgICAgICAgICAgICAgICBmaWxlbmFtZSA9ICphcmd2OwogICAgICAgICAgICAgICAgaWYgKGFyZ3ZbMV0pICAgLyogc2hvdWxkbid0IGJlIGFueSBtb3JlIGFyZ3MgYWZ0ZXIgZmlsZW5hbWUgKi8KICAgICAgICAgICAgICAgICAgICArK2Vycm9yOwogICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICsrZXJyb3I7ICAgLyogbm90IGV4cGVjdGluZyBhbnkgb3RoZXIgb3B0aW9ucyAqLwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIWZpbGVuYW1lKQogICAgICAgICsrZXJyb3I7CgoKICAgIC8qIHByaW50IHVzYWdlIHNjcmVlbiBpZiBhbnkgZXJyb3JzIHVwIHRvIHRoaXMgcG9pbnQgKi8KCiAgICBpZiAoZXJyb3IpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuJXMgJXM6ICAlc1xuXG4iLCBQUk9HTkFNRSwgVkVSU0lPTiwgYXBwbmFtZSk7CiAgICAgICAgcmVhZHBuZzJfdmVyc2lvbl9pbmZvKCk7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIKICAgICAgICAgICJVc2FnZTogICVzIFstZGlzcGxheSB4ZHB5XSBbLWdhbW1hIGV4cF0gWy1iZ2NvbG9yIGJnIHwgLWJncGF0IHBhdF1cbiIKI2lmZGVmIEZFQVRVUkVfTE9PUAogICAgICAgICAgIiAgICAgICAgJSpzIFstdXNsZWVwIGR1ciB8IC10aW1pbmddIFstcGF1c2VdIFstbG9vcCBbc2VjXV0gZmlsZS5wbmdcblxuIgojZWxzZQogICAgICAgICAgIiAgICAgICAgJSpzIFstdXNsZWVwIGR1ciB8IC10aW1pbmddIFstcGF1c2VdIGZpbGUucG5nXG5cbiIKI2VuZGlmCiAgICAgICAgICAiICAgIHhkcHlcdG5hbWUgb2YgdGhlIHRhcmdldCBYIGRpc3BsYXkgKGUuZy4sIGBgaG9zdG5hbWU6MCcnKVxuIgogICAgICAgICAgIiAgICBleHAgXHR0cmFuc2Zlci1mdW5jdGlvbiBleHBvbmVudCAoYGBnYW1tYScnKSBvZiB0aGUgZGlzcGxheVxuIgogICAgICAgICAgIlx0XHQgIHN5c3RlbSBpbiBmbG9hdGluZy1wb2ludCBmb3JtYXQgKGUuZy4sIGBgJS4xZicnKTsgZXF1YWxcbiIKICAgICAgICAgICJcdFx0ICB0byB0aGUgcHJvZHVjdCBvZiB0aGUgbG9va3VwLXRhYmxlIGV4cG9uZW50ICh2YXJpZXMpXG4iCiAgICAgICAgICAiXHRcdCAgYW5kIHRoZSBDUlQgZXhwb25lbnQgKHVzdWFsbHkgMi4yKTsgbXVzdCBiZSBwb3NpdGl2ZVxuIgogICAgICAgICAgIiAgICBiZyAgXHRkZXNpcmVkIGJhY2tncm91bmQgY29sb3IgaW4gNy1jaGFyYWN0ZXIgaGV4IFJHQiBmb3JtYXRcbiIKICAgICAgICAgICJcdFx0ICAoZS5nLiwgYGAjZmY3NzAwJycgZm9yIG9yYW5nZTogIHNhbWUgYXMgSFRNTCBjb2xvcnMpO1xuIgogICAgICAgICAgIlx0XHQgIHVzZWQgd2l0aCB0cmFuc3BhcmVudCBpbWFnZXM7IG92ZXJyaWRlcyAtYmdwYXRcbiIKICAgICAgICAgICIgICAgcGF0IFx0ZGVzaXJlZCBiYWNrZ3JvdW5kIHBhdHRlcm4gbnVtYmVyICgwLSVkKTsgdXNlZCB3aXRoXG4iCiAgICAgICAgICAiXHRcdCAgdHJhbnNwYXJlbnQgaW1hZ2VzOyBvdmVycmlkZXMgLWJnY29sb3JcbiIKI2lmZGVmIEZFQVRVUkVfTE9PUAogICAgICAgICAgIiAgICAtbG9vcFx0bG9vcHMgdGhyb3VnaCBiYWNrZ3JvdW5kIGltYWdlcyBhZnRlciBpbml0aWFsIGRpc3BsYXlcbiIKICAgICAgICAgICJcdFx0ICBpcyBjb21wbGV0ZSAoZGVwZW5kcyBvbiAtYmdwYXQpXG4iCiAgICAgICAgICAiICAgIHNlYyBcdHNlY29uZHMgdG8gZGlzcGxheSBlYWNoIGJhY2tncm91bmQgaW1hZ2UgKGRlZmF1bHQgPSAyKVxuIgojZW5kaWYKICAgICAgICAgICIgICAgZHVyIFx0ZHVyYXRpb24gaW4gbWljcm9zZWNvbmRzIHRvIHdhaXQgYWZ0ZXIgZGlzcGxheWluZyBlYWNoXG4iCiAgICAgICAgICAiXHRcdCAgcm93IChmb3IgZGVtbyBwdXJwb3NlcylcbiIKICAgICAgICAgICIgICAgLXRpbWluZ1x0ZW5hYmxlcyBkZWxheSBmb3IgZXZlcnkgYmxvY2sgcmVhZCwgdG8gc2ltdWxhdGUgbW9kZW1cbiIKICAgICAgICAgICJcdFx0ICBkb3dubG9hZCBvZiBpbWFnZSAofjM2IEticHMpXG4iCiAgICAgICAgICAiICAgIC1wYXVzZVx0cGF1c2VzIGFmdGVyIGRpc3BsYXlpbmcgZWFjaCBwYXNzIHVudGlsIG1vdXNlIGNsaWNrZWRcbiIKICAgICAgICAgICJcblByZXNzIFEsIEVzYyBvciBtb3VzZSBidXR0b24gMSAod2l0aGluIGltYWdlIHdpbmRvdywgYWZ0ZXIgaW1hZ2VcbiIKICAgICAgICAgICJpcyBkaXNwbGF5ZWQpIHRvIHF1aXQuXG4iCiAgICAgICAgICAiXG4iLCBQUk9HTkFNRSwKI2lmIChkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9NX0lYODYpIHx8IGRlZmluZWQoX194ODZfNjRfXykpCiAgICAgICAgICAoaW50KXN0cmxlbihQUk9HTkFNRSksICIgIiwKI2VuZGlmCiAgICAgICAgICAoaW50KXN0cmxlbihQUk9HTkFNRSksICIgIiwgZGVmYXVsdF9kaXNwbGF5X2V4cG9uZW50LCBudW1fYmdwYXQtMSk7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KCgogICAgaWYgKCEoaW5maWxlID0gZm9wZW4oZmlsZW5hbWUsICJyYiIpKSkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgY2FuJ3Qgb3BlbiBQTkcgZmlsZSBbJXNdXG4iLCBmaWxlbmFtZSk7CiAgICAgICAgKytlcnJvcjsKICAgIH0gZWxzZSB7CiAgICAgICAgaW5jb3VudCA9IGZyZWFkKGluYnVmLCAxLCBJTkJVRlNJWkUsIGluZmlsZSk7CiAgICAgICAgaWYgKGluY291bnQgPCA4IHx8ICFyZWFkcG5nMl9jaGVja19zaWcoaW5idWYsIDgpKSB7CiAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQogICAgICAgICAgICAgICI6ICBbJXNdIGlzIG5vdCBhIFBORyBmaWxlOiBpbmNvcnJlY3Qgc2lnbmF0dXJlXG4iLAogICAgICAgICAgICAgIGZpbGVuYW1lKTsKICAgICAgICAgICAgKytlcnJvcjsKICAgICAgICB9IGVsc2UgaWYgKChyYyA9IHJlYWRwbmcyX2luaXQoJnJwbmcyX2luZm8pKSAhPSAwKSB7CiAgICAgICAgICAgIHN3aXRjaCAocmMpIHsKICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKICAgICAgICAgICAgICAgICAgICAgICI6ICBbJXNdIGhhcyBiYWQgSUhEUiAobGlicG5nIGxvbmdqbXApXG4iLCBmaWxlbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBpbnN1ZmZpY2llbnQgbWVtb3J5XG4iKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCiAgICAgICAgICAgICAgICAgICAgICAiOiAgdW5rbm93biByZWFkcG5nMl9pbml0KCkgZXJyb3JcbiIpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgICsrZXJyb3I7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgVHJhY2UoKHN0ZGVyciwgImFib3V0IHRvIGNhbGwgWE9wZW5EaXNwbGF5KClcbiIpKQogICAgICAgICAgICBkaXNwbGF5ID0gWE9wZW5EaXNwbGF5KGRpc3BsYXluYW1lKTsKICAgICAgICAgICAgaWYgKCFkaXNwbGF5KSB7CiAgICAgICAgICAgICAgICByZWFkcG5nMl9jbGVhbnVwKCZycG5nMl9pbmZvKTsKICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgY2FuJ3Qgb3BlbiBYIGRpc3BsYXkgWyVzXVxuIiwKICAgICAgICAgICAgICAgICAgZGlzcGxheW5hbWU/IGRpc3BsYXluYW1lIDogImRlZmF1bHQiKTsKICAgICAgICAgICAgICAgICsrZXJyb3I7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGVycm9yKQogICAgICAgICAgICBmY2xvc2UoaW5maWxlKTsKICAgIH0KCgogICAgaWYgKGVycm9yKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBhYm9ydGluZy5cbiIpOwogICAgICAgIGV4aXQoMik7CiAgICB9CgoKICAgIC8qIHNldCB0aGUgdGl0bGUtYmFyIHN0cmluZywgYnV0IG1ha2Ugc3VyZSBidWZmZXIgZG9lc24ndCBvdmVyZmxvdyAqLwoKICAgIGFsZW4gPSBzdHJsZW4oYXBwbmFtZSk7CiAgICBmbGVuID0gc3RybGVuKGZpbGVuYW1lKTsKICAgIGlmIChhbGVuICsgZmxlbiArIDMgPiAxMDIzKQogICAgICAgIHNwcmludGYodGl0bGViYXIsICIlczogIC4uLiVzIiwgYXBwbmFtZSwgZmlsZW5hbWUrKGFsZW4rZmxlbis2LTEwMjMpKTsKICAgIGVsc2UKICAgICAgICBzcHJpbnRmKHRpdGxlYmFyLCAiJXM6ICAlcyIsIGFwcG5hbWUsIGZpbGVuYW1lKTsKCgogICAgLyogc2V0IHNvbWUgZmluYWwgcnBuZzJfaW5mbyB2YXJpYWJsZXMgYmVmb3JlIGVudGVyaW5nIG1haW4gZGF0YSBsb29wICovCgogICAgaWYgKGhhdmVfYmcpIHsKICAgICAgICB1bnNpZ25lZCByLCBnLCBiOyAgIC8qIHRoaXMgYXBwcm9hY2ggcXVpZXRzIGNvbXBpbGVyIHdhcm5pbmdzICovCgogICAgICAgIHNzY2FuZihiZ3N0cisxLCAiJTJ4JTJ4JTJ4IiwgJnIsICZnLCAmYik7CiAgICAgICAgcnBuZzJfaW5mby5iZ19yZWQgICA9ICh1Y2gpcjsKICAgICAgICBycG5nMl9pbmZvLmJnX2dyZWVuID0gKHVjaClnOwogICAgICAgIHJwbmcyX2luZm8uYmdfYmx1ZSAgPSAodWNoKWI7CiAgICB9IGVsc2UKICAgICAgICBycG5nMl9pbmZvLm5lZWRfYmdjb2xvciA9IFRSVUU7CgogICAgcnBuZzJfaW5mby5zdGF0ZSA9IGtQcmVJbml0OwogICAgcnBuZzJfaW5mby5tYWlucHJvZ19pbml0ID0gcnBuZzJfeF9pbml0OwogICAgcnBuZzJfaW5mby5tYWlucHJvZ19kaXNwbGF5X3JvdyA9IHJwbmcyX3hfZGlzcGxheV9yb3c7CiAgICBycG5nMl9pbmZvLm1haW5wcm9nX2ZpbmlzaF9kaXNwbGF5ID0gcnBuZzJfeF9maW5pc2hfZGlzcGxheTsKCgogICAgLyogT0ssIHRoaXMgaXMgdGhlIGZ1biBwYXJ0OiAgY2FsbCByZWFkcG5nMl9kZWNvZGVfZGF0YSgpIGF0IHRoZSBzdGFydCBvZgogICAgICogdGhlIGxvb3AgdG8gZGVhbCB3aXRoIG91ciBmaXJzdCBidWZmZXIgb2YgZGF0YSAocmVhZCBpbiBhYm92ZSB0byB2ZXJpZnkKICAgICAqIHRoYXQgdGhlIGZpbGUgaXMgYSBQTkcgaW1hZ2UpLCB0aGVuIGxvb3AgdGhyb3VnaCB0aGUgZmlsZSBhbmQgY29udGludWUKICAgICAqIGNhbGxpbmcgdGhlIHNhbWUgcm91dGluZSB0byBoYW5kbGUgZWFjaCBjaHVuayBvZiBkYXRhLiAgSXQgaW4gdHVybgogICAgICogcGFzc2VzIHRoZSBkYXRhIHRvIGxpYnBuZywgd2hpY2ggd2lsbCBpbnZva2Ugb25lIG9yIG1vcmUgb2Ygb3VyIGNhbGwtCiAgICAgKiBiYWNrcyBhcyBkZWNvZGVkIGRhdGEgYmVjb21lIGF2YWlsYWJsZS4gIFdlIG9wdGlvbmFsbHkgY2FsbCBzbGVlcCgpIGZvcgogICAgICogb25lIHNlY29uZCBwZXIgaXRlcmF0aW9uIHRvIHNpbXVsYXRlIGRvd25sb2FkaW5nIHRoZSBpbWFnZSB2aWEgYW4gYW5hbG9nCiAgICAgKiBtb2RlbS4gKi8KCiAgICBmb3IgKDs7KSB7CiAgICAgICAgVHJhY2UoKHN0ZGVyciwgImFib3V0IHRvIGNhbGwgcmVhZHBuZzJfZGVjb2RlX2RhdGEoKVxuIikpCiAgICAgICAgaWYgKHJlYWRwbmcyX2RlY29kZV9kYXRhKCZycG5nMl9pbmZvLCBpbmJ1ZiwgaW5jb3VudCkpCiAgICAgICAgICAgICsrZXJyb3I7CiAgICAgICAgVHJhY2UoKHN0ZGVyciwgImRvbmUgd2l0aCByZWFkcG5nMl9kZWNvZGVfZGF0YSgpXG4iKSkKCiAgICAgICAgaWYgKGVycm9yIHx8IGluY291bnQgIT0gSU5CVUZTSVpFIHx8IHJwbmcyX2luZm8uc3RhdGUgPT0ga0RvbmUpIHsKICAgICAgICAgICAgaWYgKHJwbmcyX2luZm8uc3RhdGUgPT0ga0RvbmUpIHsKICAgICAgICAgICAgICAgIFRyYWNlKChzdGRlcnIsICJkb25lIGRlY29kaW5nIFBORyBpbWFnZVxuIikpCiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmVycm9yKGluZmlsZSkpIHsKICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQogICAgICAgICAgICAgICAgICAiOiAgZXJyb3Igd2hpbGUgcmVhZGluZyBQTkcgaW1hZ2UgZmlsZVxuIik7CiAgICAgICAgICAgICAgICBleGl0KDMpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGZlb2YoaW5maWxlKSkgewogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBlbmQgb2YgZmlsZSByZWFjaGVkICIKICAgICAgICAgICAgICAgICAgIih1bmV4cGVjdGVkbHkpIHdoaWxlIHJlYWRpbmcgUE5HIGltYWdlIGZpbGVcbiIpOwogICAgICAgICAgICAgICAgZXhpdCgzKTsKICAgICAgICAgICAgfSBlbHNlIC8qIGlmIChlcnJvcikgKi8gewogICAgICAgICAgICAgICAgLy8gd2lsbCBwcmludCBlcnJvciBtZXNzYWdlIGJlbG93CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBpZiAodGltaW5nKQogICAgICAgICAgICBzbGVlcCgxKTsKCiAgICAgICAgaW5jb3VudCA9IGZyZWFkKGluYnVmLCAxLCBJTkJVRlNJWkUsIGluZmlsZSk7CiAgICB9CgoKICAgIC8qIGNsZWFuIHVwIFBORyBzdHVmZiBhbmQgcmVwb3J0IGFueSBkZWNvZGluZyBlcnJvcnMgKi8KCiAgICBmY2xvc2UoaW5maWxlKTsKICAgIFRyYWNlKChzdGRlcnIsICJhYm91dCB0byBjYWxsIHJlYWRwbmcyX2NsZWFudXAoKVxuIikpCiAgICByZWFkcG5nMl9jbGVhbnVwKCZycG5nMl9pbmZvKTsKCiAgICBpZiAoZXJyb3IpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGxpYnBuZyBlcnJvciB3aGlsZSBkZWNvZGluZyBQTkcgaW1hZ2VcbiIpOwogICAgICAgIGV4aXQoMyk7CiAgICB9CgoKI2lmZGVmIEZFQVRVUkVfTE9PUAoKICAgIGlmIChsb29wICYmIGJnX2ltYWdlKSB7CiAgICAgICAgVHJhY2UoKHN0ZGVyciwgImVudGVyaW5nIC1sb29wIGxvb3AgKEZFQVRVUkVfTE9PUClcbiIpKQogICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgaW50IGksIHVzZV9zbGVlcDsKICAgICAgICAgICAgc3RydWN0IHRpbWV2YWwgbm93LCB0aGVuOwoKICAgICAgICAgICAgLyogZ2V0IGN1cnJlbnQgdGltZSBhbmQgYWRkIGxvb3BfaW50ZXJ2YWwgdG8gZ2V0IHRhcmdldCB0aW1lICovCiAgICAgICAgICAgIGlmIChnZXR0aW1lb2ZkYXkoJnRoZW4sIE5VTEwpID09IDApIHsKICAgICAgICAgICAgICAgIHRoZW4udHZfc2VjICs9IGxvb3BfaW50ZXJ2YWw7CiAgICAgICAgICAgICAgICB1c2Vfc2xlZXAgPSBGQUxTRTsKICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICB1c2Vfc2xlZXAgPSBUUlVFOwoKICAgICAgICAgICAgLyogZG8gcXVpY2sgY2hlY2sgZm9yIGEgcXVpdCBldmVudCBidXQgZG9uJ3Qgd2FpdCBmb3IgaXQgKi8KICAgICAgICAgICAgLyogR1JSIEJVRzogIHNob3VsZCBhbHNvIGNoZWNrIGZvciBFeHBvc2UgZXZlbnRzIGFuZCByZWRyYXcuLi4gKi8KICAgICAgICAgICAgaWYgKFhDaGVja01hc2tFdmVudChkaXNwbGF5LCBLZXlQcmVzc01hc2sgfCBCdXR0b25QcmVzc01hc2ssICZlKSkKICAgICAgICAgICAgICAgIGlmIChRVUlUKGUsaykpCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAvKiBnZW5lcmF0ZSBuZXh0IGJhY2tncm91bmQgaW1hZ2UgKi8KICAgICAgICAgICAgaWYgKCsrcGF0ID49IG51bV9iZ3BhdCkKICAgICAgICAgICAgICAgIHBhdCA9IDA7CiAgICAgICAgICAgIHJwbmcyX3hfcmVsb2FkX2JnX2ltYWdlKCk7CgogICAgICAgICAgICAvKiB3YWl0IGZvciB0aW1lb3V0LCB1c2luZyB3aGF0ZXZlciBtZWFucyBhcmUgYXZhaWxhYmxlICovCiAgICAgICAgICAgIGlmICh1c2Vfc2xlZXAgfHwgZ2V0dGltZW9mZGF5KCZub3csIE5VTEwpICE9IDApIHsKICAgICAgICAgICAgICAgIGZvciAoaSA9IGxvb3BfaW50ZXJ2YWw7ICBpID4gMDsgIC0taSkgewogICAgICAgICAgICAgICAgICAgIHNsZWVwKDEpOwogICAgICAgICAgICAgICAgICAgIC8qIEdSUiBCVUc6ICBhbHNvIG5lZWQgdG8gY2hlY2sgZm9yIEV4cG9zZSAoYW5kIHJlZHJhdyEpICovCiAgICAgICAgICAgICAgICAgICAgaWYgKFhDaGVja01hc2tFdmVudChkaXNwbGF5LCBLZXlQcmVzc01hc2sgfCBCdXR0b25QcmVzc01hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICZlKSAmJiBRVUlUKGUsaykpCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLyogWTIwMzggQlVHISAqLwogICAgICAgICAgICAgICAgaWYgKG5vdy50dl9zZWMgPCB0aGVuLnR2X3NlYyB8fAogICAgICAgICAgICAgICAgICAgIChub3cudHZfc2VjID09IHRoZW4udHZfc2VjICYmIG5vdy50dl91c2VjIDwgdGhlbi50dl91c2VjKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnQgcXVpdCA9IEZBTFNFOwogICAgICAgICAgICAgICAgICAgIGxvbmcgc2Vjb25kc190b19nbyA9IHRoZW4udHZfc2VjIC0gbm93LnR2X3NlYzsKICAgICAgICAgICAgICAgICAgICBsb25nIHVzbGVlcF91c2VjOwoKICAgICAgICAgICAgICAgICAgICAvKiBiYXNpY2FsbHkgY2hldyB1cCBtb3N0IG9mIHJlbWFpbmluZyBsb29wLWludGVydmFsIHdpdGgKICAgICAgICAgICAgICAgICAgICAgKiAgY2FsbHMgdG8gc2xlZXAoMSkgaW50ZXJsZWF2ZWQgd2l0aCBjaGVja3MgZm9yIHF1aXQKICAgICAgICAgICAgICAgICAgICAgKiAgZXZlbnRzLCBidXQgYWxzbyByZWNhbGMgdGltZS10by1nbyBwZXJpb2RpY2FsbHk7IHdoZW4KICAgICAgICAgICAgICAgICAgICAgKiAgZG9uZSwgY2xlYW4gdXAgYW55IHJlbWFpbmluZyB0aW1lIHdpdGggdXNsZWVwKCkgY2FsbAogICAgICAgICAgICAgICAgICAgICAqICAoY291bGQgYWxzbyB1c2UgU0lHQUxSTSwgYnV0IHNpZ25hbHMgYXJlIGEgcGFpbi4uLikgKi8KICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc2Vjb25kc190b19nby0tID4gMSkgewogICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vjb25kc19kb25lID0gMDsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IHNlY29uZHNfdG9fZ287ICBpID4gMCAmJiAhcXVpdDsgIC0taSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXAoMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHUlIgQlVHOiAgbmVlZCB0byBjaGVjayBmb3IgRXhwb3NlIGFuZCByZWRyYXcgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChYQ2hlY2tNYXNrRXZlbnQoZGlzcGxheSwgS2V5UHJlc3NNYXNrIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXR0b25QcmVzc01hc2ssICZlKSAmJiBRVUlUKGUsaykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVpdCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKytzZWNvbmRzX2RvbmUgPiAxMDAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgIC8qIHRpbWUgdG8gcmVkbyBzZWNvbmRzX3RvX2dvIG1lYXMuICovCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1aXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9LLCBtb3JlIHRoYW4gMTAwMCBzZWNvbmRzIHNpbmNlIGxhc3QgY2hlY2s6CiAgICAgICAgICAgICAgICAgICAgICAgICAqICBjb3JyZWN0IHRoZSB0aW1lLXRvLWdvIG1lYXN1cmVtZW50IGZvciBkcmlmdCAqLwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0dGltZW9mZGF5KCZub3csIE5VTEwpID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3cudHZfc2VjID49IHRoZW4udHZfc2VjKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kc190b19nbyA9IHRoZW4udHZfc2VjIC0gbm93LnR2X3NlYzsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICArK3NlY29uZHNfdG9fZ287ICAvKiByZXN0b3JlIHdoYXQgd2Ugc3VidHJhY3RlZCAqLwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAocXVpdCkKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgLyogYnJlYWtzIG91dGVyIGRvLWxvb3AsIHNraXBzIHJlZGlzcGxheSAqLwoKICAgICAgICAgICAgICAgICAgICAvKiBzaW5jZSBkaWZmZXJlbmNlIGJldHdlZW4gIm5vdyIgYW5kICJ0aGVuIiBpcyBhbHJlYWR5CiAgICAgICAgICAgICAgICAgICAgICogIGVhdGVuIHVwIHRvIHdpdGhpbiBhIGNvdXBsZSBvZiBzZWNvbmRzLCBkb24ndCBuZWVkIHRvCiAgICAgICAgICAgICAgICAgICAgICogIHdvcnJ5IGFib3V0IG92ZXJmbG93LS1idXQgbWlnaHQgaGF2ZSBvdmVyc2hvdCAobmVnLikgKi8KICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0dGltZW9mZGF5KCZub3csIE5VTEwpID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgdXNsZWVwX3VzZWMgPSAxMDAwMDAwTCoodGhlbi50dl9zZWMgLSBub3cudHZfc2VjKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbi50dl91c2VjIC0gbm93LnR2X3VzZWM7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2xlZXBfdXNlYyA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2xlZXAoKHVsZyl1c2xlZXBfdXNlYyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBjb21wb3NpdGUgaW1hZ2UgYWdhaW5zdCBuZXcgYmFja2dyb3VuZCBhbmQgZGlzcGxheSAobm90ZSB0aGF0CiAgICAgICAgICAgICAqICB3ZSBkbyBub3QgdGFrZSBpbnRvIGFjY291bnQgdGhlIHRpbWUgc3BlbnQgZG9pbmcgdGhpcy4uLikgKi8KICAgICAgICAgICAgcnBuZzJfeF9yZWRpc3BsYXlfaW1hZ2UgKDAsIDAsIHJwbmcyX2luZm8ud2lkdGgsIHJwbmcyX2luZm8uaGVpZ2h0KTsKICAgICAgICB9CgogICAgfSBlbHNlIC8qIEZBTEwgVEhST1VHSCBhbmQgZG8gdGhlIG5vcm1hbCB0aGluZyAqLwoKI2VuZGlmIC8qIEZFQVRVUkVfTE9PUCAqLwoKICAgIC8qIHdhaXQgZm9yIHRoZSB1c2VyIHRvIHRlbGwgdXMgd2hlbiB0byBxdWl0ICovCgogICAgaWYgKHJwbmcyX2luZm8uc3RhdGUgPj0ga1dpbmRvd0luaXQpIHsKICAgICAgICBUcmFjZSgoc3RkZXJyLCAiZW50ZXJpbmcgZmluYWwgd2FpdC1mb3ItcXVpdC1ldmVudCBsb29wXG4iKSkKICAgICAgICBkbyB7CiAgICAgICAgICAgIFhOZXh0RXZlbnQoZGlzcGxheSwgJmUpOwogICAgICAgICAgICBpZiAoZS50eXBlID09IEV4cG9zZSkgewogICAgICAgICAgICAgICAgWEV4cG9zZUV2ZW50ICpleCA9IChYRXhwb3NlRXZlbnQgKikmZTsKICAgICAgICAgICAgICAgIHJwbmcyX3hfcmVkaXNwbGF5X2ltYWdlIChleC0+eCwgZXgtPnksIGV4LT53aWR0aCwgZXgtPmhlaWdodCk7CiAgICAgICAgICAgIH0KICAgICAgICB9IHdoaWxlICghUVVJVChlLGspKTsKICAgIH0gZWxzZSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBpbml0IGNhbGxiYWNrIG5ldmVyIGNhbGxlZDogIHByb2JhYmxlICIKICAgICAgICAgICJsaWJwbmcgZXJyb3Igd2hpbGUgZGVjb2RpbmcgUE5HIG1ldGFkYXRhXG4iKTsKICAgICAgICBleGl0KDQpOwogICAgfQoKCiAgICAvKiB3ZSdyZSBkb25lOiAgY2xlYW4gdXAgYWxsIGltYWdlIGFuZCBYIHJlc291cmNlcyBhbmQgZ28gYXdheSAqLwoKICAgIFRyYWNlKChzdGRlcnIsICJhYm91dCB0byBjYWxsIHJwbmcyX3hfY2xlYW51cCgpXG4iKSkKICAgIHJwbmcyX3hfY2xlYW51cCgpOwoKICAgIHJldHVybiAwOwp9CgoKCgoKLyogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgcmVhZHBuZzJfaW5mb19jYWxsYmFjaygpIGluIHJlYWRwbmcyLmMsIHdoaWNoCiAqIGluIHR1cm4gaXMgY2FsbGVkIGJ5IGxpYnBuZyBhZnRlciBhbGwgb2YgdGhlIHByZS1JREFUIGNodW5rcyBoYXZlIGJlZW4KICogcmVhZCBhbmQgcHJvY2Vzc2VkLS1pLmUuLCB3ZSBub3cgaGF2ZSBlbm91Z2ggaW5mbyB0byBmaW5pc2ggaW5pdGlhbGl6aW5nICovCgpzdGF0aWMgdm9pZCBycG5nMl94X2luaXQodm9pZCkKewogICAgdWxnIGk7CiAgICB1bGcgcm93Ynl0ZXMgPSBycG5nMl9pbmZvLnJvd2J5dGVzOwoKICAgIFRyYWNlKChzdGRlcnIsICJiZWdpbm5pbmcgcnBuZzJfeF9pbml0KClcbiIpKQogICAgVHJhY2UoKHN0ZGVyciwgIiAgcm93Ynl0ZXMgPSAlZFxuIiwgcnBuZzJfaW5mby5yb3dieXRlcykpCiAgICBUcmFjZSgoc3RkZXJyLCAiICB3aWR0aCAgPSAlbGRcbiIsIHJwbmcyX2luZm8ud2lkdGgpKQogICAgVHJhY2UoKHN0ZGVyciwgIiAgaGVpZ2h0ID0gJWxkXG4iLCBycG5nMl9pbmZvLmhlaWdodCkpCgogICAgcnBuZzJfaW5mby5pbWFnZV9kYXRhID0gKHVjaCAqKW1hbGxvYyhyb3dieXRlcyAqIHJwbmcyX2luZm8uaGVpZ2h0KTsKICAgIGlmICghcnBuZzJfaW5mby5pbWFnZV9kYXRhKSB7CiAgICAgICAgcmVhZHBuZzJfY2xlYW51cCgmcnBuZzJfaW5mbyk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJwbmcyX2luZm8ucm93X3BvaW50ZXJzID0gKHVjaCAqKiltYWxsb2MocnBuZzJfaW5mby5oZWlnaHQgKiBzaXplb2YodWNoICopKTsKICAgIGlmICghcnBuZzJfaW5mby5yb3dfcG9pbnRlcnMpIHsKICAgICAgICBmcmVlKHJwbmcyX2luZm8uaW1hZ2VfZGF0YSk7CiAgICAgICAgcnBuZzJfaW5mby5pbWFnZV9kYXRhID0gTlVMTDsKICAgICAgICByZWFkcG5nMl9jbGVhbnVwKCZycG5nMl9pbmZvKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgZm9yIChpID0gMDsgIGkgPCBycG5nMl9pbmZvLmhlaWdodDsgICsraSkKICAgICAgICBycG5nMl9pbmZvLnJvd19wb2ludGVyc1tpXSA9IHJwbmcyX2luZm8uaW1hZ2VfZGF0YSArIGkqcm93Ynl0ZXM7CgoKICAgIC8qIGRvIHRoZSBiYXNpYyBYIGluaXRpYWxpemF0aW9uIHN0dWZmLCBtYWtlIHRoZSB3aW5kb3csIGFuZCBmaWxsIGl0IHdpdGgKICAgICAqIHRoZSB1c2VyLXNwZWNpZmllZCwgZmlsZS1zcGVjaWZpZWQgb3IgZGVmYXVsdCBiYWNrZ3JvdW5kIGNvbG9yIG9yCiAgICAgKiBwYXR0ZXJuICovCgogICAgaWYgKHJwbmcyX3hfY3JlYXRlX3dpbmRvdygpKSB7CgogICAgICAgIC8qIEdSUiBURU1QT1JBUlkgSEFDSzogIHRoaXMgaXMgZnVuZGFtZW50YWxseSBubyBkaWZmZXJlbnQgZnJvbSBjYXNlcwogICAgICAgICAqIGFib3ZlOyBsaWJwbmcgc2hvdWxkIGxvbmdqbXAoKSBiYWNrIHRvIHVzIHdoZW4gcG5nX3B0ciBnb2VzIGF3YXkuCiAgICAgICAgICogSWYgd2UvaXQgc2VnZmF1bHQgaW5zdGVhZCwgc2VlbXMgbGlrZSBhIGxpYnBuZyBidWcuLi4gKi8KCiAgICAgICAgLyogd2UncmUgaGVyZSB2aWEgbGlicG5nIGNhbGxiYWNrLCBzbyBpZiB3aW5kb3cgZmFpbHMsIGNsZWFuIGFuZCBiYWlsICovCiAgICAgICAgcmVhZHBuZzJfY2xlYW51cCgmcnBuZzJfaW5mbyk7CiAgICAgICAgcnBuZzJfeF9jbGVhbnVwKCk7CiAgICAgICAgZXhpdCgyKTsKICAgIH0KCiAgICBycG5nMl9pbmZvLnN0YXRlID0ga1dpbmRvd0luaXQ7Cn0KCgoKCgpzdGF0aWMgaW50IHJwbmcyX3hfY3JlYXRlX3dpbmRvdyh2b2lkKQp7CiAgICB1bGcgYmdfcmVkICAgPSBycG5nMl9pbmZvLmJnX3JlZDsKICAgIHVsZyBiZ19ncmVlbiA9IHJwbmcyX2luZm8uYmdfZ3JlZW47CiAgICB1bGcgYmdfYmx1ZSAgPSBycG5nMl9pbmZvLmJnX2JsdWU7CiAgICB1bGcgYmdfcGl4ZWwgPSAwTDsKICAgIHVsZyBhdHRybWFzazsKICAgIGludCBuZWVkX2NvbG9ybWFwID0gRkFMU0U7CiAgICBpbnQgc2NyZWVuLCBwYWQ7CiAgICB1Y2ggKnhkYXRhOwogICAgV2luZG93IHJvb3Q7CiAgICBYRXZlbnQgZTsKICAgIFhHQ1ZhbHVlcyBnY3ZhbHVlczsKICAgIFhTZXRXaW5kb3dBdHRyaWJ1dGVzIGF0dHI7CiAgICBYVGV4dFByb3BlcnR5IHdpbmRvd05hbWUsICpwV2luZG93TmFtZSA9ICZ3aW5kb3dOYW1lOwogICAgWFRleHRQcm9wZXJ0eSBpY29uTmFtZSwgKnBJY29uTmFtZSA9ICZpY29uTmFtZTsKICAgIFhWaXN1YWxJbmZvIHZpc3VhbF9pbmZvOwogICAgWFNpemVIaW50cyAqc2l6ZV9oaW50czsKICAgIFhXTUhpbnRzICp3bV9oaW50czsKICAgIFhDbGFzc0hpbnQgKmNsYXNzX2hpbnRzOwoKCiAgICBUcmFjZSgoc3RkZXJyLCAiYmVnaW5uaW5nIHJwbmcyX3hfY3JlYXRlX3dpbmRvdygpXG4iKSkKCiAgICBzY3JlZW4gPSBEZWZhdWx0U2NyZWVuKGRpc3BsYXkpOwogICAgZGVwdGggPSBEaXNwbGF5UGxhbmVzKGRpc3BsYXksIHNjcmVlbik7CiAgICByb290ID0gUm9vdFdpbmRvdyhkaXNwbGF5LCBzY3JlZW4pOwoKI2lmZGVmIERFQlVHCiAgICBYU3luY2hyb25pemUoZGlzcGxheSwgVHJ1ZSk7CiNlbmRpZgoKICAgIGlmIChkZXB0aCAhPSAxNiAmJiBkZXB0aCAhPSAyNCAmJiBkZXB0aCAhPSAzMikgewogICAgICAgIGludCB2aXN1YWxzX21hdGNoZWQgPSAwOwoKICAgICAgICBUcmFjZSgoc3RkZXJyLCAiZGVmYXVsdCBkZXB0aCBpcyAlZDogIGNoZWNraW5nIG90aGVyIHZpc3VhbHNcbiIsCiAgICAgICAgICBkZXB0aCkpCgogICAgICAgIC8qIDI0LWJpdCBmaXJzdCAqLwogICAgICAgIHZpc3VhbF9pbmZvLnNjcmVlbiA9IHNjcmVlbjsKICAgICAgICB2aXN1YWxfaW5mby5kZXB0aCA9IDI0OwogICAgICAgIHZpc3VhbF9saXN0ID0gWEdldFZpc3VhbEluZm8oZGlzcGxheSwKICAgICAgICAgIFZpc3VhbFNjcmVlbk1hc2sgfCBWaXN1YWxEZXB0aE1hc2ssICZ2aXN1YWxfaW5mbywgJnZpc3VhbHNfbWF0Y2hlZCk7CiAgICAgICAgaWYgKHZpc3VhbHNfbWF0Y2hlZCA9PSAwKSB7Ci8qIEdSUjogIGFkZCAxNS0sIDE2LSBhbmQgMzItYml0IFRydWVDb2xvciB2aXN1YWxzIChhbHNvIERpcmVjdENvbG9yPykgKi8KICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJkZWZhdWx0IHNjcmVlbiBkZXB0aCAlZCBub3Qgc3VwcG9ydGVkLCBhbmQgbm8iCiAgICAgICAgICAgICAgIiAyNC1iaXQgdmlzdWFscyBmb3VuZFxuIiwgZGVwdGgpOwogICAgICAgICAgICByZXR1cm4gMjsKICAgICAgICB9CiAgICAgICAgVHJhY2UoKHN0ZGVyciwgIlhHZXRWaXN1YWxJbmZvKCkgcmV0dXJuZWQgJWQgMjQtYml0IHZpc3VhbHNcbiIsCiAgICAgICAgICB2aXN1YWxzX21hdGNoZWQpKQogICAgICAgIHZpc3VhbCA9IHZpc3VhbF9saXN0WzBdLnZpc3VhbDsKICAgICAgICBkZXB0aCA9IHZpc3VhbF9saXN0WzBdLmRlcHRoOwovKgogICAgICAgIGNvbG9ybWFwX3NpemUgPSB2aXN1YWxfbGlzdFswXS5jb2xvcm1hcF9zaXplOwogICAgICAgIHZpc3VhbF9jbGFzcyA9IHZpc3VhbC0+Y2xhc3M7CiAgICAgICAgdmlzdWFsSUQgPSBYVmlzdWFsSURGcm9tVmlzdWFsKHZpc3VhbCk7CiAqLwogICAgICAgIGhhdmVfbm9uZGVmYXVsdF92aXN1YWwgPSBUUlVFOwogICAgICAgIG5lZWRfY29sb3JtYXAgPSBUUlVFOwogICAgfSBlbHNlIHsKICAgICAgICBYTWF0Y2hWaXN1YWxJbmZvKGRpc3BsYXksIHNjcmVlbiwgZGVwdGgsIFRydWVDb2xvciwgJnZpc3VhbF9pbmZvKTsKICAgICAgICB2aXN1YWwgPSB2aXN1YWxfaW5mby52aXN1YWw7CiAgICB9CgogICAgUk1hc2sgPSB2aXN1YWwtPnJlZF9tYXNrOwogICAgR01hc2sgPSB2aXN1YWwtPmdyZWVuX21hc2s7CiAgICBCTWFzayA9IHZpc3VhbC0+Ymx1ZV9tYXNrOwoKLyogR1JSOiAgYWRkL2NoZWNrIDgtYml0IHN1cHBvcnQgKi8KICAgIGlmIChkZXB0aCA9PSA4IHx8IG5lZWRfY29sb3JtYXApIHsKICAgICAgICBjb2xvcm1hcCA9IFhDcmVhdGVDb2xvcm1hcChkaXNwbGF5LCByb290LCB2aXN1YWwsIEFsbG9jTm9uZSk7CiAgICAgICAgaWYgKCFjb2xvcm1hcCkgewogICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlhDcmVhdGVDb2xvcm1hcCgpIGZhaWxlZFxuIik7CiAgICAgICAgICAgIHJldHVybiAyOwogICAgICAgIH0KICAgICAgICBoYXZlX2NvbG9ybWFwID0gVFJVRTsKICAgICAgICBpZiAoZGVwdGggPT0gOCkKICAgICAgICAgICAgYmdfaW1hZ2UgPSBGQUxTRTsgICAvKiBncmFkaWVudCBqdXN0IHdhc3RlcyBwYWxldHRlIGVudHJpZXMgKi8KICAgIH0KICAgIGlmIChkZXB0aCA9PSAxNSB8fCBkZXB0aCA9PSAxNikgewogICAgICAgIFJTaGlmdCA9IDE1IC0gcnBuZzJfeF9tc2IoUk1hc2spOyAgICAvKiB0aGVzZSBhcmUgcmlnaHQtc2hpZnRzICovCiAgICAgICAgR1NoaWZ0ID0gMTUgLSBycG5nMl94X21zYihHTWFzayk7CiAgICAgICAgQlNoaWZ0ID0gMTUgLSBycG5nMl94X21zYihCTWFzayk7CiAgICB9IGVsc2UgaWYgKGRlcHRoID4gMTYpIHsKICAgICAgICBSU2hpZnQgPSBycG5nMl94X21zYihSTWFzaykgLSA3OyAgICAgLyogdGhlc2UgYXJlIGxlZnQtc2hpZnRzICovCiAgICAgICAgR1NoaWZ0ID0gcnBuZzJfeF9tc2IoR01hc2spIC0gNzsKICAgICAgICBCU2hpZnQgPSBycG5nMl94X21zYihCTWFzaykgLSA3OwogICAgfQogICAgaWYgKGRlcHRoID49IDE1ICYmIChSU2hpZnQgPCAwIHx8IEdTaGlmdCA8IDAgfHwgQlNoaWZ0IDwgMCkpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInJwbmcyIGludGVybmFsIGxvZ2ljIGVycm9yOiAgbmVnYXRpdmUgWCBzaGlmdChzKSFcbiIpOwogICAgICAgIHJldHVybiAyOwogICAgfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEZpbmFsbHksIGNyZWF0ZSB0aGUgd2luZG93LgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgYXR0ci5iYWNraW5nX3N0b3JlID0gQWx3YXlzOwogICAgYXR0ci5ldmVudF9tYXNrID0gRXhwb3N1cmVNYXNrIHwgS2V5UHJlc3NNYXNrIHwgQnV0dG9uUHJlc3NNYXNrOwogICAgYXR0cm1hc2sgPSBDV0JhY2tpbmdTdG9yZSB8IENXRXZlbnRNYXNrOwogICAgaWYgKGhhdmVfbm9uZGVmYXVsdF92aXN1YWwpIHsKICAgICAgICBhdHRyLmNvbG9ybWFwID0gY29sb3JtYXA7CiAgICAgICAgYXR0ci5iYWNrZ3JvdW5kX3BpeGVsID0gMDsKICAgICAgICBhdHRyLmJvcmRlcl9waXhlbCA9IDE7CiAgICAgICAgYXR0cm1hc2sgfD0gQ1dDb2xvcm1hcCB8IENXQmFja1BpeGVsIHwgQ1dCb3JkZXJQaXhlbDsKICAgIH0KCiAgICB3aW5kb3cgPSBYQ3JlYXRlV2luZG93KGRpc3BsYXksIHJvb3QsIDAsIDAsIHJwbmcyX2luZm8ud2lkdGgsCiAgICAgIHJwbmcyX2luZm8uaGVpZ2h0LCAwLCBkZXB0aCwgSW5wdXRPdXRwdXQsIHZpc3VhbCwgYXR0cm1hc2ssICZhdHRyKTsKCiAgICBpZiAod2luZG93ID09IE5vbmUpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlhDcmVhdGVXaW5kb3coKSBmYWlsZWRcbiIpOwogICAgICAgIHJldHVybiAyOwogICAgfSBlbHNlCiAgICAgICAgaGF2ZV93aW5kb3cgPSBUUlVFOwoKICAgIGlmIChkZXB0aCA9PSA4KQogICAgICAgIFhTZXRXaW5kb3dDb2xvcm1hcChkaXNwbGF5LCB3aW5kb3csIGNvbG9ybWFwKTsKCiAgICBpZiAoIVhTdHJpbmdMaXN0VG9UZXh0UHJvcGVydHkoJndpbmRvd19uYW1lLCAxLCBwV2luZG93TmFtZSkpCiAgICAgICAgcFdpbmRvd05hbWUgPSBOVUxMOwogICAgaWYgKCFYU3RyaW5nTGlzdFRvVGV4dFByb3BlcnR5KCZpY29uX25hbWUsIDEsIHBJY29uTmFtZSkpCiAgICAgICAgcEljb25OYW1lID0gTlVMTDsKCiAgICAvKiBPSyBpZiBlaXRoZXIgaGludHMgYWxsb2NhdGlvbiBmYWlsczsgWFNldFdNUHJvcGVydGllcygpIGFsbG93cyBOVUxMcyAqLwoKICAgIGlmICgoc2l6ZV9oaW50cyA9IFhBbGxvY1NpemVIaW50cygpKSAhPSBOVUxMKSB7CiAgICAgICAgLyogd2luZG93IHdpbGwgbm90IGJlIHJlc2l6YWJsZSAqLwogICAgICAgIHNpemVfaGludHMtPmZsYWdzID0gUE1pblNpemUgfCBQTWF4U2l6ZTsKICAgICAgICBzaXplX2hpbnRzLT5taW5fd2lkdGggPSBzaXplX2hpbnRzLT5tYXhfd2lkdGggPSAoaW50KXJwbmcyX2luZm8ud2lkdGg7CiAgICAgICAgc2l6ZV9oaW50cy0+bWluX2hlaWdodCA9IHNpemVfaGludHMtPm1heF9oZWlnaHQgPQogICAgICAgICAgKGludClycG5nMl9pbmZvLmhlaWdodDsKICAgIH0KCiAgICBpZiAoKHdtX2hpbnRzID0gWEFsbG9jV01IaW50cygpKSAhPSBOVUxMKSB7CiAgICAgICAgd21faGludHMtPmluaXRpYWxfc3RhdGUgPSBOb3JtYWxTdGF0ZTsKICAgICAgICB3bV9oaW50cy0+aW5wdXQgPSBUcnVlOwogICAgIC8qIHdtX2hpbnRzLT5pY29uX3BpeG1hcCA9IGljb25fcGl4bWFwOyAqLwogICAgICAgIHdtX2hpbnRzLT5mbGFncyA9IFN0YXRlSGludCB8IElucHV0SGludCAgLyogfCBJY29uUGl4bWFwSGludCAqLyA7CiAgICB9CgogICAgaWYgKChjbGFzc19oaW50cyA9IFhBbGxvY0NsYXNzSGludCgpKSAhPSBOVUxMKSB7CiAgICAgICAgY2xhc3NfaGludHMtPnJlc19uYW1lID0gcmVzX25hbWU7CiAgICAgICAgY2xhc3NfaGludHMtPnJlc19jbGFzcyA9IHJlc19jbGFzczsKICAgIH0KCiAgICBYU2V0V01Qcm9wZXJ0aWVzKGRpc3BsYXksIHdpbmRvdywgcFdpbmRvd05hbWUsIHBJY29uTmFtZSwgTlVMTCwgMCwKICAgICAgc2l6ZV9oaW50cywgd21faGludHMsIGNsYXNzX2hpbnRzKTsKCiAgICAvKiB2YXJpb3VzIHByb3BlcnRpZXMgYW5kIGhpbnRzIG5vIGxvbmdlciBuZWVkZWQ7IGZyZWUgbWVtb3J5ICovCiAgICBpZiAocFdpbmRvd05hbWUpCiAgICAgICBYRnJlZShwV2luZG93TmFtZS0+dmFsdWUpOwogICAgaWYgKHBJY29uTmFtZSkKICAgICAgIFhGcmVlKHBJY29uTmFtZS0+dmFsdWUpOwogICAgaWYgKHNpemVfaGludHMpCiAgICAgICAgWEZyZWUoc2l6ZV9oaW50cyk7CiAgICBpZiAod21faGludHMpCiAgICAgICBYRnJlZSh3bV9oaW50cyk7CiAgICBpZiAoY2xhc3NfaGludHMpCiAgICAgICBYRnJlZShjbGFzc19oaW50cyk7CgogICAgWE1hcFdpbmRvdyhkaXNwbGF5LCB3aW5kb3cpOwoKICAgIGdjID0gWENyZWF0ZUdDKGRpc3BsYXksIHdpbmRvdywgMCwgJmdjdmFsdWVzKTsKICAgIGhhdmVfZ2MgPSBUUlVFOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIFgtIGFuZCBkaXNwbGF5LXNwZWNpZmljIHZlcnNpb24gb2YgdGhlIGltYWdlLgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgaWYgKGRlcHRoID09IDI0IHx8IGRlcHRoID09IDMyKSB7CiAgICAgICAgeGRhdGEgPSAodWNoICopbWFsbG9jKDQqcnBuZzJfaW5mby53aWR0aCpycG5nMl9pbmZvLmhlaWdodCk7CiAgICAgICAgcGFkID0gMzI7CiAgICB9IGVsc2UgaWYgKGRlcHRoID09IDE2KSB7CiAgICAgICAgeGRhdGEgPSAodWNoICopbWFsbG9jKDIqcnBuZzJfaW5mby53aWR0aCpycG5nMl9pbmZvLmhlaWdodCk7CiAgICAgICAgcGFkID0gMTY7CiAgICB9IGVsc2UgLyogZGVwdGggPT0gOCAqLyB7CiAgICAgICAgeGRhdGEgPSAodWNoICopbWFsbG9jKHJwbmcyX2luZm8ud2lkdGgqcnBuZzJfaW5mby5oZWlnaHQpOwogICAgICAgIHBhZCA9IDg7CiAgICB9CgogICAgaWYgKCF4ZGF0YSkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgdW5hYmxlIHRvIGFsbG9jYXRlIGltYWdlIG1lbW9yeVxuIik7CiAgICAgICAgcmV0dXJuIDQ7CiAgICB9CgogICAgeGltYWdlID0gWENyZWF0ZUltYWdlKGRpc3BsYXksIHZpc3VhbCwgZGVwdGgsIFpQaXhtYXAsIDAsCiAgICAgIChjaGFyICopeGRhdGEsIHJwbmcyX2luZm8ud2lkdGgsIHJwbmcyX2luZm8uaGVpZ2h0LCBwYWQsIDApOwoKICAgIGlmICgheGltYWdlKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBYQ3JlYXRlSW1hZ2UoKSBmYWlsZWRcbiIpOwogICAgICAgIGZyZWUoeGRhdGEpOwogICAgICAgIHJldHVybiAzOwogICAgfQoKICAgIC8qIHRvIGF2b2lkIHRlc3RpbmcgdGhlIGJ5dGUgb3JkZXIgZXZlcnkgcGl4ZWwgKG9yIGRvdWJsaW5nIHRoZSBzaXplIG9mCiAgICAgKiB0aGUgZHJhd2luZyByb3V0aW5lIHdpdGggYSBnaWFudCBpZi10ZXN0KSwgd2UgYXJiaXRyYXJpbHkgc2V0IHRoZSBieXRlCiAgICAgKiBvcmRlciB0byBNU0JGaXJzdCBhbmQgbGV0IFhsaWIgd29ycnkgYWJvdXQgaW52ZXJ0aW5nIHRoaW5ncyBvbiBsaXR0bGUtCiAgICAgKiBlbmRpYW4gbWFjaGluZXMgKGUuZy4sIExpbnV4L3g4Niwgb2xkIFZBWGVuLCBldGMuKS0tdGhpcyBpcyBub3QgdGhlCiAgICAgKiBtb3N0IGVmZmljaWVudCBhcHByb2FjaCAodGhlIGdpYW50IGlmLXRlc3Qgd291bGQgYmUgYmV0dGVyKSwgYnV0IGluCiAgICAgKiB0aGUgaW50ZXJlc3Qgb2YgY2xhcml0eSwgd2UnbGwgdGFrZSB0aGUgZWFzeSB3YXkgb3V0Li4uICovCgogICAgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3Q7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRmlsbCB3aW5kb3cgd2l0aCB0aGUgc3BlY2lmaWVkIGJhY2tncm91bmQgY29sb3IgKGRlZmF1bHQgaXMgYmxhY2spIG9yCiAgICBmYWtlZCAiYmFja2dyb3VuZCBpbWFnZSIgKGJ1dCBsYXR0ZXIgaXMgZGlzYWJsZWQgaWYgOC1iaXQ7IGdyYWRpZW50cwogICAganVzdCB3YXN0ZSBwYWxldHRlIGVudHJpZXMpLgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgaWYgKGJnX2ltYWdlKQogICAgICAgIHJwbmcyX3hfbG9hZF9iZ19pbWFnZSgpOyAgICAvKiByZXNldHMgYmdfaW1hZ2UgaWYgZmFpbHMgKi8KCiAgICBpZiAoIWJnX2ltYWdlKSB7CiAgICAgICAgaWYgKGRlcHRoID09IDI0IHx8IGRlcHRoID09IDMyKSB7CiAgICAgICAgICAgIGJnX3BpeGVsID0gKGJnX3JlZCAgIDw8IFJTaGlmdCkgfAogICAgICAgICAgICAgICAgICAgICAgIChiZ19ncmVlbiA8PCBHU2hpZnQpIHwKICAgICAgICAgICAgICAgICAgICAgICAoYmdfYmx1ZSAgPDwgQlNoaWZ0KTsKICAgICAgICB9IGVsc2UgaWYgKGRlcHRoID09IDE2KSB7CiAgICAgICAgICAgIGJnX3BpeGVsID0gKCgoYmdfcmVkICAgPDwgOCkgPj4gUlNoaWZ0KSAmIFJNYXNrKSB8CiAgICAgICAgICAgICAgICAgICAgICAgKCgoYmdfZ3JlZW4gPDwgOCkgPj4gR1NoaWZ0KSAmIEdNYXNrKSB8CiAgICAgICAgICAgICAgICAgICAgICAgKCgoYmdfYmx1ZSAgPDwgOCkgPj4gQlNoaWZ0KSAmIEJNYXNrKTsKICAgICAgICB9IGVsc2UgLyogZGVwdGggPT0gOCAqLyB7CgogICAgICAgICAgICAvKiBHUlI6ICBhZGQgOC1iaXQgc3VwcG9ydCAqLwoKICAgICAgICB9CiAgICAgICAgWFNldEZvcmVncm91bmQoZGlzcGxheSwgZ2MsIGJnX3BpeGVsKTsKICAgICAgICBYRmlsbFJlY3RhbmdsZShkaXNwbGF5LCB3aW5kb3csIGdjLCAwLCAwLCBycG5nMl9pbmZvLndpZHRoLAogICAgICAgICAgcnBuZzJfaW5mby5oZWlnaHQpOwogICAgfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFdhaXQgZm9yIGZpcnN0IEV4cG9zZSBldmVudCB0byBkbyBhbnkgZHJhd2luZywgdGhlbiBmbHVzaCBhbmQgcmV0dXJuLgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgZG8KICAgICAgICBYTmV4dEV2ZW50KGRpc3BsYXksICZlKTsKICAgIHdoaWxlIChlLnR5cGUgIT0gRXhwb3NlIHx8IGUueGV4cG9zZS5jb3VudCk7CgogICAgWEZsdXNoKGRpc3BsYXkpOwoKICAgIHJldHVybiAwOwoKfSAvKiBlbmQgZnVuY3Rpb24gcnBuZzJfeF9jcmVhdGVfd2luZG93KCkgKi8KCgoKCgpzdGF0aWMgaW50IHJwbmcyX3hfbG9hZF9iZ19pbWFnZSh2b2lkKQp7CiAgICB1Y2ggKnNyYzsKICAgIGNoYXIgKmRlc3Q7CiAgICB1Y2ggcjEsIHIyLCBnMSwgZzIsIGIxLCBiMjsKICAgIHVjaCByMV9pbnYsIHIyX2ludiwgZzFfaW52LCBnMl9pbnYsIGIxX2ludiwgYjJfaW52OwogICAgaW50IGssIGhtYXgsIG1heDsKICAgIGludCB4aWR4LCB5aWR4LCB5aWR4X21heDsKICAgIGludCBldmVuX29kZF92ZXJ0LCBldmVuX29kZF9ob3JpeiwgZXZlbl9vZGQ7CiAgICBpbnQgaW52ZXJ0X2dyYWRpZW50MiA9IChiZ1twYXRdLnR5cGUgJiAweDA4KTsKICAgIGludCBpbnZlcnRfY29sdW1uOwogICAgaW50IHhpbWFnZV9yb3dieXRlcyA9IHhpbWFnZS0+Ynl0ZXNfcGVyX2xpbmU7CiAgICB1bGcgaSwgcm93OwogICAgdWxnIHBpeGVsOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEFsbG9jYXRlIGJ1ZmZlciBmb3IgZmFrZSBiYWNrZ3JvdW5kIGltYWdlIHRvIGJlIHVzZWQgd2l0aCB0cmFuc3BhcmVudAogICAgaW1hZ2VzOyBpZiB0aGlzIGZhaWxzLCByZXZlcnQgdG8gcGxhaW4gYmFja2dyb3VuZCBjb2xvci4KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIGJnX3Jvd2J5dGVzID0gMyAqIHJwbmcyX2luZm8ud2lkdGg7CiAgICBiZ19kYXRhID0gKHVjaCAqKW1hbGxvYyhiZ19yb3dieXRlcyAqIHJwbmcyX2luZm8uaGVpZ2h0KTsKICAgIGlmICghYmdfZGF0YSkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQogICAgICAgICAgIjogIHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGJhY2tncm91bmQgaW1hZ2VcbiIpOwogICAgICAgIGJnX2ltYWdlID0gMDsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICBiZ3NjYWxlID0gKHBhdCA9PSAwKT8gOCA6IGJnc2NhbGVfZGVmYXVsdDsKICAgIHlpZHhfbWF4ID0gYmdzY2FsZSAtIDE7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgVmVydGljYWwgZ3JhZGllbnRzIChyYW1wcykgaW4gTnhOIHNxdWFyZXMsIGFsdGVybmF0aW5nIGRpcmVjdGlvbiBhbmQKICAgIGNvbG9ycyAoTiA9PSBiZ3NjYWxlKS4KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIGlmICgoYmdbcGF0XS50eXBlICYgMHgwNykgPT0gMCkgewogICAgICAgIHVjaCByMV9taW4gID0gcmdiW2JnW3BhdF0ucmdiMV9taW5dLnI7CiAgICAgICAgdWNoIGcxX21pbiAgPSByZ2JbYmdbcGF0XS5yZ2IxX21pbl0uZzsKICAgICAgICB1Y2ggYjFfbWluICA9IHJnYltiZ1twYXRdLnJnYjFfbWluXS5iOwogICAgICAgIHVjaCByMl9taW4gID0gcmdiW2JnW3BhdF0ucmdiMl9taW5dLnI7CiAgICAgICAgdWNoIGcyX21pbiAgPSByZ2JbYmdbcGF0XS5yZ2IyX21pbl0uZzsKICAgICAgICB1Y2ggYjJfbWluICA9IHJnYltiZ1twYXRdLnJnYjJfbWluXS5iOwogICAgICAgIGludCByMV9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMV9tYXhdLnIgLSByMV9taW47CiAgICAgICAgaW50IGcxX2RpZmYgPSByZ2JbYmdbcGF0XS5yZ2IxX21heF0uZyAtIGcxX21pbjsKICAgICAgICBpbnQgYjFfZGlmZiA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5iIC0gYjFfbWluOwogICAgICAgIGludCByMl9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMl9tYXhdLnIgLSByMl9taW47CiAgICAgICAgaW50IGcyX2RpZmYgPSByZ2JbYmdbcGF0XS5yZ2IyX21heF0uZyAtIGcyX21pbjsKICAgICAgICBpbnQgYjJfZGlmZiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5iIC0gYjJfbWluOwoKICAgICAgICBmb3IgKHJvdyA9IDA7ICByb3cgPCBycG5nMl9pbmZvLmhlaWdodDsgICsrcm93KSB7CiAgICAgICAgICAgIHlpZHggPSAoaW50KShyb3cgJSBiZ3NjYWxlKTsKICAgICAgICAgICAgZXZlbl9vZGRfdmVydCA9IChpbnQpKChyb3cgLyBiZ3NjYWxlKSAmIDEpOwoKICAgICAgICAgICAgcjEgPSByMV9taW4gKyAocjFfZGlmZiAqIHlpZHgpIC8geWlkeF9tYXg7CiAgICAgICAgICAgIGcxID0gZzFfbWluICsgKGcxX2RpZmYgKiB5aWR4KSAvIHlpZHhfbWF4OwogICAgICAgICAgICBiMSA9IGIxX21pbiArIChiMV9kaWZmICogeWlkeCkgLyB5aWR4X21heDsKICAgICAgICAgICAgcjFfaW52ID0gcjFfbWluICsgKHIxX2RpZmYgKiAoeWlkeF9tYXgteWlkeCkpIC8geWlkeF9tYXg7CiAgICAgICAgICAgIGcxX2ludiA9IGcxX21pbiArIChnMV9kaWZmICogKHlpZHhfbWF4LXlpZHgpKSAvIHlpZHhfbWF4OwogICAgICAgICAgICBiMV9pbnYgPSBiMV9taW4gKyAoYjFfZGlmZiAqICh5aWR4X21heC15aWR4KSkgLyB5aWR4X21heDsKCiAgICAgICAgICAgIHIyID0gcjJfbWluICsgKHIyX2RpZmYgKiB5aWR4KSAvIHlpZHhfbWF4OwogICAgICAgICAgICBnMiA9IGcyX21pbiArIChnMl9kaWZmICogeWlkeCkgLyB5aWR4X21heDsKICAgICAgICAgICAgYjIgPSBiMl9taW4gKyAoYjJfZGlmZiAqIHlpZHgpIC8geWlkeF9tYXg7CiAgICAgICAgICAgIHIyX2ludiA9IHIyX21pbiArIChyMl9kaWZmICogKHlpZHhfbWF4LXlpZHgpKSAvIHlpZHhfbWF4OwogICAgICAgICAgICBnMl9pbnYgPSBnMl9taW4gKyAoZzJfZGlmZiAqICh5aWR4X21heC15aWR4KSkgLyB5aWR4X21heDsKICAgICAgICAgICAgYjJfaW52ID0gYjJfbWluICsgKGIyX2RpZmYgKiAoeWlkeF9tYXgteWlkeCkpIC8geWlkeF9tYXg7CgogICAgICAgICAgICBkZXN0ID0gKGNoYXIgKiliZ19kYXRhICsgcm93KmJnX3Jvd2J5dGVzOwogICAgICAgICAgICBmb3IgKGkgPSAwOyAgaSA8IHJwbmcyX2luZm8ud2lkdGg7ICArK2kpIHsKICAgICAgICAgICAgICAgIGV2ZW5fb2RkX2hvcml6ID0gKGludCkoKGkgLyBiZ3NjYWxlKSAmIDEpOwogICAgICAgICAgICAgICAgZXZlbl9vZGQgPSBldmVuX29kZF92ZXJ0IF4gZXZlbl9vZGRfaG9yaXo7CiAgICAgICAgICAgICAgICBpbnZlcnRfY29sdW1uID0KICAgICAgICAgICAgICAgICAgKGV2ZW5fb2RkX2hvcml6ICYmIChiZ1twYXRdLnR5cGUgJiAweDEwKSk7CiAgICAgICAgICAgICAgICBpZiAoZXZlbl9vZGQgPT0gMCkgeyAgICAgICAgLyogZ3JhZGllbnQgIzEgKi8KICAgICAgICAgICAgICAgICAgICBpZiAoaW52ZXJ0X2NvbHVtbikgewogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gcjFfaW52OwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gZzFfaW52OwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYjFfaW52OwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSByMTsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGcxOwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYjE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgIC8qIGdyYWRpZW50ICMyICovCiAgICAgICAgICAgICAgICAgICAgaWYgKChpbnZlcnRfY29sdW1uICYmIGludmVydF9ncmFkaWVudDIpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICghaW52ZXJ0X2NvbHVtbiAmJiAhaW52ZXJ0X2dyYWRpZW50MikpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gcjI7ICAgICAgIC8qIG5vdCBpbnZlcnRlZCBvciAqLwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gZzI7ICAgICAgIC8qICBkb3VibHkgaW52ZXJ0ZWQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGIyOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSByMl9pbnY7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBnMl9pbnY7ICAgLyogc2luZ2x5IGludmVydGVkICovCiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBiMl9pbnY7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNvZnQgZ3JhZGllbnQtZGlhbW9uZHMgd2l0aCBzY2FsZSA9IGJnc2NhbGUuICBDb2RlIGNvbnRyaWJ1dGVkIGJ5IEFkYW0KICAgIE0uIENvc3RlbGxvLgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgfSBlbHNlIGlmICgoYmdbcGF0XS50eXBlICYgMHgwNykgPT0gMSkgewoKICAgICAgICBobWF4ID0gKGJnc2NhbGUtMSkvMjsgICAvKiBoYWxmIHRoZSBtYXggd2VpZ2h0IG9mIGEgY29sb3IgKi8KICAgICAgICBtYXggPSAyKmhtYXg7ICAgICAgICAgICAvKiB0aGUgbWF4IHdlaWdodCBvZiBhIGNvbG9yICovCgogICAgICAgIHIxID0gcmdiW2JnW3BhdF0ucmdiMV9tYXhdLnI7CiAgICAgICAgZzEgPSByZ2JbYmdbcGF0XS5yZ2IxX21heF0uZzsKICAgICAgICBiMSA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5iOwogICAgICAgIHIyID0gcmdiW2JnW3BhdF0ucmdiMl9tYXhdLnI7CiAgICAgICAgZzIgPSByZ2JbYmdbcGF0XS5yZ2IyX21heF0uZzsKICAgICAgICBiMiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5iOwoKICAgICAgICBmb3IgKHJvdyA9IDA7ICByb3cgPCBycG5nMl9pbmZvLmhlaWdodDsgICsrcm93KSB7CiAgICAgICAgICAgIHlpZHggPSAoaW50KShyb3cgJSBiZ3NjYWxlKTsKICAgICAgICAgICAgaWYgKHlpZHggPiBobWF4KQogICAgICAgICAgICAgICAgeWlkeCA9IGJnc2NhbGUtMSAtIHlpZHg7CiAgICAgICAgICAgIGRlc3QgPSAoY2hhciAqKWJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7CiAgICAgICAgICAgIGZvciAoaSA9IDA7ICBpIDwgcnBuZzJfaW5mby53aWR0aDsgICsraSkgewogICAgICAgICAgICAgICAgeGlkeCA9IChpbnQpKGkgJSBiZ3NjYWxlKTsKICAgICAgICAgICAgICAgIGlmICh4aWR4ID4gaG1heCkKICAgICAgICAgICAgICAgICAgICB4aWR4ID0gYmdzY2FsZS0xIC0geGlkeDsKICAgICAgICAgICAgICAgIGsgPSB4aWR4ICsgeWlkeDsKICAgICAgICAgICAgICAgICpkZXN0KysgPSAoaypyMSArIChtYXgtaykqcjIpIC8gbWF4OwogICAgICAgICAgICAgICAgKmRlc3QrKyA9IChrKmcxICsgKG1heC1rKSpnMikgLyBtYXg7CiAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGsqYjEgKyAobWF4LWspKmIyKSAvIG1heDsKICAgICAgICAgICAgfQogICAgICAgIH0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBSYWRpYWwgInN0YXJidXJzdCIgd2l0aCBhemltdXRoYWwgc2ludXNvaWRzOyBbZXZlbnR1YWxseSBudW1iZXIgb2Ygc2ludS0KICAgIHNvaWRzIHdpbGwgZXF1YWwgYmdzY2FsZT9dLiAgVGhpcyBvbmUgaXMgc2xvdyBidXQgdmVyeSBjb29sLiAgQ29kZSBjb24tCiAgICB0cmlidXRlZCBieSBQaWV0ZXIgUy4gdmFuIGRlciBNZXVsZW4gKG9yaWdpbmFsbHkgaW4gU21hbGx0YWxrKS4KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIH0gZWxzZSBpZiAoKGJnW3BhdF0udHlwZSAmIDB4MDcpID09IDIpIHsKICAgICAgICB1Y2ggY2g7CiAgICAgICAgaW50IGlpLCB4LCB5LCBodywgaGgsIGdyYXlzcG90OwogICAgICAgIGRvdWJsZSBmcmVxLCByb3RhdGUsIHNhdHVyYXRlLCBncmF5LCBpbnRlbnNpdHk7CiAgICAgICAgZG91YmxlIGFuZ2xlPTAuMCwgYW9mZnNldD0wLjAsIG1heERpc3QsIGRpc3Q7CiAgICAgICAgZG91YmxlIHJlZD0wLjAsIGdyZWVuPTAuMCwgYmx1ZT0wLjAsIGh1ZSwgcywgdiwgZiwgcCwgcSwgdDsKCiAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogIGNvbXB1dGluZyByYWRpYWwgYmFja2dyb3VuZC4uLiIsCiAgICAgICAgICBQUk9HTkFNRSk7CiAgICAgICAgZmZsdXNoKHN0ZGVycik7CgogICAgICAgIGhoID0gKGludCkocnBuZzJfaW5mby5oZWlnaHQgLyAyKTsKICAgICAgICBodyA9IChpbnQpKHJwbmcyX2luZm8ud2lkdGggLyAyKTsKCiAgICAgICAgLyogdmFyaWFibGVzIGZvciByYWRpYWwgd2F2ZXM6CiAgICAgICAgICogICBhb2Zmc2V0OiAgbnVtYmVyIG9mIGRlZ3JlZXMgdG8gcm90YXRlIGh1ZSBbQ1VSUkVOVExZIE5PVCBVU0VEXQogICAgICAgICAqICAgZnJlcTogIG51bWJlciBvZiBjb2xvciBiZWFtcyBvcmlnaW5hdGluZyBmcm9tIHRoZSBjZW50ZXIKICAgICAgICAgKiAgIGdyYXlzcG90OiAgc2l6ZSBvZiB0aGUgZ3JheWluZyBjZW50ZXIgYXJlYSAoYW50aS1hbGlhcykKICAgICAgICAgKiAgIHJvdGF0ZTogIHJvdGF0aW9uIG9mIHRoZSBiZWFtcyBhcyBhIGZ1bmN0aW9uIG9mIHJhZGl1cwogICAgICAgICAqICAgc2F0dXJhdGU6ICBzYXR1cmF0aW9uIG9mIGJlYW1zJyBzaGFwZSBhemltdXRoYWxseQogICAgICAgICAqLwogICAgICAgIGFuZ2xlID0gQ0xJUChhbmdsZSwgMC4wLCAzNjAuMCk7CiAgICAgICAgZ3JheXNwb3QgPSBDTElQKGJnW3BhdF0uYmdfZ3JheSwgMSwgKGhoICsgaHcpKTsKICAgICAgICBmcmVxID0gTUFYKChkb3VibGUpYmdbcGF0XS5iZ19mcmVxLCAwLjApOwogICAgICAgIHNhdHVyYXRlID0gKGRvdWJsZSliZ1twYXRdLmJnX2JzYXQgKiAwLjE7CiAgICAgICAgcm90YXRlID0gKGRvdWJsZSliZ1twYXRdLmJnX2Jyb3QgKiAwLjE7CiAgICAgICAgZ3JheSA9IDAuMDsKICAgICAgICBpbnRlbnNpdHkgPSAwLjA7CiAgICAgICAgbWF4RGlzdCA9IChkb3VibGUpKChodypodykgKyAoaGgqaGgpKTsKCiAgICAgICAgZm9yIChyb3cgPSAwOyAgcm93IDwgcnBuZzJfaW5mby5oZWlnaHQ7ICArK3JvdykgewogICAgICAgICAgICB5ID0gKGludCkocm93IC0gaGgpOwogICAgICAgICAgICBkZXN0ID0gKGNoYXIgKiliZ19kYXRhICsgcm93KmJnX3Jvd2J5dGVzOwogICAgICAgICAgICBmb3IgKGkgPSAwOyAgaSA8IHJwbmcyX2luZm8ud2lkdGg7ICArK2kpIHsKICAgICAgICAgICAgICAgIHggPSAoaW50KShpIC0gaHcpOwogICAgICAgICAgICAgICAgYW5nbGUgPSAoeCA9PSAwKT8gUElfMiA6IGF0YW4oKGRvdWJsZSl5IC8gKGRvdWJsZSl4KTsKICAgICAgICAgICAgICAgIGdyYXkgPSAoZG91YmxlKU1BWChBQlMoeSksIEFCUyh4KSkgLyBncmF5c3BvdDsKICAgICAgICAgICAgICAgIGdyYXkgPSBNSU4oMS4wLCBncmF5KTsKICAgICAgICAgICAgICAgIGRpc3QgPSAoZG91YmxlKSgoeCp4KSArICh5KnkpKSAvIG1heERpc3Q7CiAgICAgICAgICAgICAgICBpbnRlbnNpdHkgPSBjb3MoKGFuZ2xlKyhyb3RhdGUqZGlzdCpQSSkpICogZnJlcSkgKgogICAgICAgICAgICAgICAgICBncmF5ICogc2F0dXJhdGU7CiAgICAgICAgICAgICAgICBpbnRlbnNpdHkgPSAoTUFYKE1JTihpbnRlbnNpdHksMS4wKSwtMS4wKSArIDEuMCkgKiAwLjU7CiAgICAgICAgICAgICAgICBodWUgPSAoYW5nbGUgKyBQSSkgKiBJTlZfUElfMzYwICsgYW9mZnNldDsKICAgICAgICAgICAgICAgIHMgPSBncmF5ICogKChkb3VibGUpKEFCUyh4KStBQlMoeSkpIC8gKGRvdWJsZSkoaHcgKyBoaCkpOwogICAgICAgICAgICAgICAgcyA9IE1JTihNQVgocywwLjApLCAxLjApOwogICAgICAgICAgICAgICAgdiA9IE1JTihNQVgoaW50ZW5zaXR5LDAuMCksIDEuMCk7CgogICAgICAgICAgICAgICAgaWYgKHMgPT0gMC4wKSB7CiAgICAgICAgICAgICAgICAgICAgY2ggPSAodWNoKSh2ICogMjU1LjApOwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBjaDsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gY2g7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGNoOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoKGh1ZSA8IDAuMCkgfHwgKGh1ZSA+PSAzNjAuMCkpCiAgICAgICAgICAgICAgICAgICAgICAgIGh1ZSAtPSAoKChpbnQpKGh1ZSAvIDM2MC4wKSkgKiAzNjAuMCk7CiAgICAgICAgICAgICAgICAgICAgaHVlIC89IDYwLjA7CiAgICAgICAgICAgICAgICAgICAgaWkgPSAoaW50KWh1ZTsKICAgICAgICAgICAgICAgICAgICBmID0gaHVlIC0gKGRvdWJsZSlpaTsKICAgICAgICAgICAgICAgICAgICBwID0gKDEuMCAtIHMpICogdjsKICAgICAgICAgICAgICAgICAgICBxID0gKDEuMCAtIChzICogZikpICogdjsKICAgICAgICAgICAgICAgICAgICB0ID0gKDEuMCAtIChzICogKDEuMCAtIGYpKSkgKiB2OwogICAgICAgICAgICAgICAgICAgIGlmICAgICAgKGlpID09IDApIHsgcmVkID0gdjsgZ3JlZW4gPSB0OyBibHVlID0gcDsgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlpID09IDEpIHsgcmVkID0gcTsgZ3JlZW4gPSB2OyBibHVlID0gcDsgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlpID09IDIpIHsgcmVkID0gcDsgZ3JlZW4gPSB2OyBibHVlID0gdDsgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlpID09IDMpIHsgcmVkID0gcDsgZ3JlZW4gPSBxOyBibHVlID0gdjsgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlpID09IDQpIHsgcmVkID0gdDsgZ3JlZW4gPSBwOyBibHVlID0gdjsgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlpID09IDUpIHsgcmVkID0gdjsgZ3JlZW4gPSBwOyBibHVlID0gcTsgfQogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAodWNoKShyZWQgKiAyNTUuMCk7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9ICh1Y2gpKGdyZWVuICogMjU1LjApOwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAodWNoKShibHVlICogMjU1LjApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZwcmludGYoc3RkZXJyLCAiZG9uZS5cbiIpOwogICAgICAgIGZmbHVzaChzdGRlcnIpOwogICAgfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEJsYXN0IGJhY2tncm91bmQgaW1hZ2UgdG8gZGlzcGxheSBidWZmZXIgYmVmb3JlIGJlZ2lubmluZyBQTkcgZGVjb2RlLgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgaWYgKGRlcHRoID09IDI0IHx8IGRlcHRoID09IDMyKSB7CiAgICAgICAgdWxnIHJlZCwgZ3JlZW4sIGJsdWU7CiAgICAgICAgaW50IGJwcCA9IHhpbWFnZS0+Yml0c19wZXJfcGl4ZWw7CgogICAgICAgIGZvciAocm93ID0gMDsgIHJvdyA8IHJwbmcyX2luZm8uaGVpZ2h0OyAgKytyb3cpIHsKICAgICAgICAgICAgc3JjID0gYmdfZGF0YSArIHJvdypiZ19yb3dieXRlczsKICAgICAgICAgICAgZGVzdCA9IHhpbWFnZS0+ZGF0YSArIHJvdyp4aW1hZ2Vfcm93Ynl0ZXM7CiAgICAgICAgICAgIGlmIChicHAgPT0gMzIpIHsJLyogc2xpZ2h0bHkgb3B0aW1pemVkIHZlcnNpb24gKi8KICAgICAgICAgICAgICAgIGZvciAoaSA9IHJwbmcyX2luZm8ud2lkdGg7ICBpID4gMDsgIC0taSkgewogICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKnNyYysrOwogICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKnNyYysrOwogICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKnNyYysrOwogICAgICAgICAgICAgICAgICAgIHBpeGVsID0gKHJlZCAgIDw8IFJTaGlmdCkgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdyZWVuIDw8IEdTaGlmdCkgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsdWUgIDw8IEJTaGlmdCk7CiAgICAgICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMjQpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMTYpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBmb3IgKGkgPSBycG5nMl9pbmZvLndpZHRoOyAgaSA+IDA7ICAtLWkpIHsKICAgICAgICAgICAgICAgICAgICByZWQgICA9ICpzcmMrKzsKICAgICAgICAgICAgICAgICAgICBncmVlbiA9ICpzcmMrKzsKICAgICAgICAgICAgICAgICAgICBibHVlICA9ICpzcmMrKzsKICAgICAgICAgICAgICAgICAgICBwaXhlbCA9IChyZWQgICA8PCBSU2hpZnQpIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncmVlbiA8PCBHU2hpZnQpIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChibHVlICA8PCBCU2hpZnQpOwogICAgICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLwogICAgICAgICAgICAgICAgICAgIC8qIEdSUiBCVUc/ICB0aGlzIGFzc3VtZXMgYnBwID09IDI0ICYgYml0cyBhcmUgcGFja2VkIGxvdyAqLwogICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAocHJvYmFibHkgbmVlZCB0byB1c2UgUlNoaWZ0LCBSTWFzaywgZXRjLikgKi8KICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAxNikgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICB9IGVsc2UgaWYgKGRlcHRoID09IDE2KSB7CiAgICAgICAgdXNoIHJlZCwgZ3JlZW4sIGJsdWU7CgogICAgICAgIGZvciAocm93ID0gMDsgIHJvdyA8IHJwbmcyX2luZm8uaGVpZ2h0OyAgKytyb3cpIHsKICAgICAgICAgICAgc3JjID0gYmdfZGF0YSArIHJvdypiZ19yb3dieXRlczsKICAgICAgICAgICAgZGVzdCA9IHhpbWFnZS0+ZGF0YSArIHJvdyp4aW1hZ2Vfcm93Ynl0ZXM7CiAgICAgICAgICAgIGZvciAoaSA9IHJwbmcyX2luZm8ud2lkdGg7ICBpID4gMDsgIC0taSkgewogICAgICAgICAgICAgICAgcmVkICAgPSAoKHVzaCkoKnNyYykgPDwgOCk7ICArK3NyYzsKICAgICAgICAgICAgICAgIGdyZWVuID0gKCh1c2gpKCpzcmMpIDw8IDgpOyAgKytzcmM7CiAgICAgICAgICAgICAgICBibHVlICA9ICgodXNoKSgqc3JjKSA8PCA4KTsgICsrc3JjOwogICAgICAgICAgICAgICAgcGl4ZWwgPSAoKHJlZCAgID4+IFJTaGlmdCkgJiBSTWFzaykgfAogICAgICAgICAgICAgICAgICAgICAgICAoKGdyZWVuID4+IEdTaGlmdCkgJiBHTWFzaykgfAogICAgICAgICAgICAgICAgICAgICAgICAoKGJsdWUgID4+IEJTaGlmdCkgJiBCTWFzayk7CiAgICAgICAgICAgICAgICAvKiByZWNhbGwgdGhhdCB3ZSBzZXQgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3QgYWJvdmUgKi8KICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgfSBlbHNlIC8qIGRlcHRoID09IDggKi8gewoKICAgICAgICAvKiBHUlI6ICBhZGQgOC1iaXQgc3VwcG9ydCAqLwoKICAgIH0KCiAgICBYUHV0SW1hZ2UoZGlzcGxheSwgd2luZG93LCBnYywgeGltYWdlLCAwLCAwLCAwLCAwLCBycG5nMl9pbmZvLndpZHRoLAogICAgICBycG5nMl9pbmZvLmhlaWdodCk7CgogICAgcmV0dXJuIDA7Cgp9IC8qIGVuZCBmdW5jdGlvbiBycG5nMl94X2xvYWRfYmdfaW1hZ2UoKSAqLwoKCgoKCnN0YXRpYyB2b2lkIHJwbmcyX3hfZGlzcGxheV9yb3codWxnIHJvdykKewogICAgdWNoIGJnX3JlZCAgID0gcnBuZzJfaW5mby5iZ19yZWQ7CiAgICB1Y2ggYmdfZ3JlZW4gPSBycG5nMl9pbmZvLmJnX2dyZWVuOwogICAgdWNoIGJnX2JsdWUgID0gcnBuZzJfaW5mby5iZ19ibHVlOwogICAgdWNoICpzcmMsICpzcmMyPU5VTEw7CiAgICBjaGFyICpkZXN0OwogICAgdWNoIHIsIGcsIGIsIGE7CiAgICBpbnQgeGltYWdlX3Jvd2J5dGVzID0geGltYWdlLT5ieXRlc19wZXJfbGluZTsKICAgIHVsZyBpLCBwaXhlbDsKICAgIHN0YXRpYyBpbnQgcm93cz0wLCBwcmV2cGFzcz0oLTEpOwogICAgc3RhdGljIHVsZyBmaXJzdHJvdzsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICByb3dzIGFuZCBmaXJzdHJvdyBzaW1wbHkgdHJhY2sgaG93IG1hbnkgcm93cyAoYW5kIHdoaWNoIG9uZXMpIGhhdmUgbm90CiAgICB5ZXQgYmVlbiBkaXNwbGF5ZWQ7IGFsdGVybmF0aXZlbHksIHdlIGNvdWxkIGNhbGwgWFB1dEltYWdlKCkgZm9yIGV2ZXJ5CiAgICByb3cgYW5kIG5vdCBib3RoZXIgd2l0aCB0aGUgcmVjb3Jkcy1rZWVwaW5nLgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgVHJhY2UoKHN0ZGVyciwgImJlZ2lubmluZyBycG5nMl94X2Rpc3BsYXlfcm93KClcbiIpKQoKICAgIGlmIChycG5nMl9pbmZvLnBhc3MgIT0gcHJldnBhc3MpIHsKICAgICAgICBpZiAocGF1c2VfYWZ0ZXJfcGFzcyAmJiBycG5nMl9pbmZvLnBhc3MgPiAwKSB7CiAgICAgICAgICAgIFhFdmVudCBlOwogICAgICAgICAgICBLZXlTeW0gazsKCiAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAogICAgICAgICAgICAgICIlczogIGVuZCBvZiBwYXNzICVkIG9mIDc7IGNsaWNrIGluIGltYWdlIHdpbmRvdyB0byBjb250aW51ZVxuIiwKICAgICAgICAgICAgICBQUk9HTkFNRSwgcHJldnBhc3MgKyAxKTsKICAgICAgICAgICAgZG8KICAgICAgICAgICAgICAgIFhOZXh0RXZlbnQoZGlzcGxheSwgJmUpOwogICAgICAgICAgICB3aGlsZSAoIVFVSVQoZSxrKSk7CiAgICAgICAgfQogICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6ICBwYXNzICVkIG9mIDdcciIsIFBST0dOQU1FLCBycG5nMl9pbmZvLnBhc3MgKyAxKTsKICAgICAgICBmZmx1c2goc3RkZXJyKTsKICAgICAgICBwcmV2cGFzcyA9IHJwbmcyX2luZm8ucGFzczsKICAgIH0KCiAgICBpZiAocm93cyA9PSAwKQogICAgICAgIGZpcnN0cm93ID0gcm93OyAgIC8qIGZpcnN0IHJvdyB0aGF0IGlzIG5vdCB5ZXQgZGlzcGxheWVkICovCgogICAgKytyb3dzOyAgIC8qIGNvdW50IG9mIHJvd3MgcmVjZWl2ZWQgYnV0IG5vdCB5ZXQgZGlzcGxheWVkICovCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQXNpZGUgZnJvbSB0aGUgdXNlIG9mIHRoZSBycG5nMl9pbmZvIHN0cnVjdCwgdGhlIGxhY2sgb2YgYW4gb3V0ZXIgbG9vcAogICAgKG92ZXIgcm93cykgYW5kIG1vdmluZyB0aGUgWFB1dEltYWdlKCkgY2FsbCBvdXRzaWRlIHRoZSAiaWYgKGRlcHRoKSIKICAgIHRlc3RzLCB0aGlzIHJvdXRpbmUgaXMgaWRlbnRpY2FsIHRvIHJwbmdfeF9kaXNwbGF5X2ltYWdlKCkgaW4gdGhlIG5vbi0KICAgIHByb2dyZXNzaXZlIHZlcnNpb24gb2YgdGhlIHByb2dyYW0uCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBpZiAoZGVwdGggPT0gMjQgfHwgZGVwdGggPT0gMzIpIHsKICAgICAgICB1bGcgcmVkLCBncmVlbiwgYmx1ZTsKICAgICAgICBpbnQgYnBwID0geGltYWdlLT5iaXRzX3Blcl9waXhlbDsKCiAgICAgICAgc3JjID0gcnBuZzJfaW5mby5pbWFnZV9kYXRhICsgcm93KnJwbmcyX2luZm8ucm93Ynl0ZXM7CiAgICAgICAgaWYgKGJnX2ltYWdlKQogICAgICAgICAgICBzcmMyID0gYmdfZGF0YSArIHJvdypiZ19yb3dieXRlczsKICAgICAgICBkZXN0ID0geGltYWdlLT5kYXRhICsgcm93KnhpbWFnZV9yb3dieXRlczsKICAgICAgICBpZiAocnBuZzJfaW5mby5jaGFubmVscyA9PSAzKSB7CiAgICAgICAgICAgIGZvciAoaSA9IHJwbmcyX2luZm8ud2lkdGg7ICBpID4gMDsgIC0taSkgewogICAgICAgICAgICAgICAgcmVkICAgPSAqc3JjKys7CiAgICAgICAgICAgICAgICBncmVlbiA9ICpzcmMrKzsKICAgICAgICAgICAgICAgIGJsdWUgID0gKnNyYysrOwogICAgICAgICAgICAgICAgcGl4ZWwgPSAocmVkICAgPDwgUlNoaWZ0KSB8CiAgICAgICAgICAgICAgICAgICAgICAgIChncmVlbiA8PCBHU2hpZnQpIHwKICAgICAgICAgICAgICAgICAgICAgICAgKGJsdWUgIDw8IEJTaGlmdCk7CiAgICAgICAgICAgICAgICAvKiByZWNhbGwgdGhhdCB3ZSBzZXQgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3QgYWJvdmUgKi8KICAgICAgICAgICAgICAgIGlmIChicHAgPT0gMzIpIHsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAyNCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAxNikgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLyogR1JSIEJVRz8gIHRoaXMgYXNzdW1lcyBicHAgPT0gMjQgJiBiaXRzIGFyZSBwYWNrZWQgbG93ICovCiAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgIChwcm9iYWJseSBuZWVkIHRvIHVzZSBSU2hpZnQsIFJNYXNrLCBldGMuKSAqLwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIC8qIGlmIChycG5nMl9pbmZvLmNoYW5uZWxzID09IDQpICovIHsKICAgICAgICAgICAgZm9yIChpID0gcnBuZzJfaW5mby53aWR0aDsgIGkgPiAwOyAgLS1pKSB7CiAgICAgICAgICAgICAgICByID0gKnNyYysrOwogICAgICAgICAgICAgICAgZyA9ICpzcmMrKzsKICAgICAgICAgICAgICAgIGIgPSAqc3JjKys7CiAgICAgICAgICAgICAgICBhID0gKnNyYysrOwogICAgICAgICAgICAgICAgaWYgKGJnX2ltYWdlKSB7CiAgICAgICAgICAgICAgICAgICAgYmdfcmVkICAgPSAqc3JjMisrOwogICAgICAgICAgICAgICAgICAgIGJnX2dyZWVuID0gKnNyYzIrKzsKICAgICAgICAgICAgICAgICAgICBiZ19ibHVlICA9ICpzcmMyKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoYSA9PSAyNTUpIHsKICAgICAgICAgICAgICAgICAgICByZWQgICA9IHI7CiAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSBnOwogICAgICAgICAgICAgICAgICAgIGJsdWUgID0gYjsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmVkICAgPSBiZ19yZWQ7CiAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSBiZ19ncmVlbjsKICAgICAgICAgICAgICAgICAgICBibHVlICA9IGJnX2JsdWU7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgbWFjcm8gKGZyb20gcG5nLmgpIGNvbXBvc2l0ZXMgdGhlIGZvcmVncm91bmQKICAgICAgICAgICAgICAgICAgICAgKiBhbmQgYmFja2dyb3VuZCB2YWx1ZXMgYW5kIHB1dHMgdGhlIHJlc3VsdCBpbnRvIHRoZQogICAgICAgICAgICAgICAgICAgICAqIGZpcnN0IGFyZ3VtZW50ICovCiAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKHJlZCwgICByLCBhLCBiZ19yZWQpOwogICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShncmVlbiwgZywgYSwgYmdfZ3JlZW4pOwogICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShibHVlLCAgYiwgYSwgYmdfYmx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwaXhlbCA9IChyZWQgICA8PCBSU2hpZnQpIHwKICAgICAgICAgICAgICAgICAgICAgICAgKGdyZWVuIDw8IEdTaGlmdCkgfAogICAgICAgICAgICAgICAgICAgICAgICAoYmx1ZSAgPDwgQlNoaWZ0KTsKICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLwogICAgICAgICAgICAgICAgaWYgKGJwcCA9PSAzMikgewogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDI0KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvKiBHUlIgQlVHPyAgdGhpcyBhc3N1bWVzIGJwcCA9PSAyNCAmIGJpdHMgYXJlIHBhY2tlZCBsb3cgKi8KICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgKHByb2JhYmx5IG5lZWQgdG8gdXNlIFJTaGlmdCwgUk1hc2ssIGV0Yy4pICovCiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMTYpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgfSBlbHNlIGlmIChkZXB0aCA9PSAxNikgewogICAgICAgIHVzaCByZWQsIGdyZWVuLCBibHVlOwoKICAgICAgICBzcmMgPSBycG5nMl9pbmZvLnJvd19wb2ludGVyc1tyb3ddOwogICAgICAgIGlmIChiZ19pbWFnZSkKICAgICAgICAgICAgc3JjMiA9IGJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7CiAgICAgICAgZGVzdCA9IHhpbWFnZS0+ZGF0YSArIHJvdyp4aW1hZ2Vfcm93Ynl0ZXM7CiAgICAgICAgaWYgKHJwbmcyX2luZm8uY2hhbm5lbHMgPT0gMykgewogICAgICAgICAgICBmb3IgKGkgPSBycG5nMl9pbmZvLndpZHRoOyAgaSA+IDA7ICAtLWkpIHsKICAgICAgICAgICAgICAgIHJlZCAgID0gKCh1c2gpKCpzcmMpIDw8IDgpOwogICAgICAgICAgICAgICAgKytzcmM7CiAgICAgICAgICAgICAgICBncmVlbiA9ICgodXNoKSgqc3JjKSA8PCA4KTsKICAgICAgICAgICAgICAgICsrc3JjOwogICAgICAgICAgICAgICAgYmx1ZSAgPSAoKHVzaCkoKnNyYykgPDwgOCk7CiAgICAgICAgICAgICAgICArK3NyYzsKICAgICAgICAgICAgICAgIHBpeGVsID0gKChyZWQgICA+PiBSU2hpZnQpICYgUk1hc2spIHwKICAgICAgICAgICAgICAgICAgICAgICAgKChncmVlbiA+PiBHU2hpZnQpICYgR01hc2spIHwKICAgICAgICAgICAgICAgICAgICAgICAgKChibHVlICA+PiBCU2hpZnQpICYgQk1hc2spOwogICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCiAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIC8qIGlmIChycG5nMl9pbmZvLmNoYW5uZWxzID09IDQpICovIHsKICAgICAgICAgICAgZm9yIChpID0gcnBuZzJfaW5mby53aWR0aDsgIGkgPiAwOyAgLS1pKSB7CiAgICAgICAgICAgICAgICByID0gKnNyYysrOwogICAgICAgICAgICAgICAgZyA9ICpzcmMrKzsKICAgICAgICAgICAgICAgIGIgPSAqc3JjKys7CiAgICAgICAgICAgICAgICBhID0gKnNyYysrOwogICAgICAgICAgICAgICAgaWYgKGJnX2ltYWdlKSB7CiAgICAgICAgICAgICAgICAgICAgYmdfcmVkICAgPSAqc3JjMisrOwogICAgICAgICAgICAgICAgICAgIGJnX2dyZWVuID0gKnNyYzIrKzsKICAgICAgICAgICAgICAgICAgICBiZ19ibHVlICA9ICpzcmMyKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoYSA9PSAyNTUpIHsKICAgICAgICAgICAgICAgICAgICByZWQgICA9ICgodXNoKXIgPDwgOCk7CiAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAoKHVzaClnIDw8IDgpOwogICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKCh1c2gpYiA8PCA4KTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAoKHVzaCliZ19yZWQgICA8PCA4KTsKICAgICAgICAgICAgICAgICAgICBncmVlbiA9ICgodXNoKWJnX2dyZWVuIDw8IDgpOwogICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKCh1c2gpYmdfYmx1ZSAgPDwgOCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgbWFjcm8gKGZyb20gcG5nLmgpIGNvbXBvc2l0ZXMgdGhlIGZvcmVncm91bmQKICAgICAgICAgICAgICAgICAgICAgKiBhbmQgYmFja2dyb3VuZCB2YWx1ZXMgYW5kIHB1dHMgdGhlIHJlc3VsdCBiYWNrIGludG8KICAgICAgICAgICAgICAgICAgICAgKiB0aGUgZmlyc3QgYXJndW1lbnQgKD09IGZnIGJ5dGUgaGVyZTogIHNhZmUpICovCiAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKHIsIHIsIGEsIGJnX3JlZCk7CiAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKGcsIGcsIGEsIGJnX2dyZWVuKTsKICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUoYiwgYiwgYSwgYmdfYmx1ZSk7CiAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAoKHVzaClyIDw8IDgpOwogICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKCh1c2gpZyA8PCA4KTsKICAgICAgICAgICAgICAgICAgICBibHVlICA9ICgodXNoKWIgPDwgOCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwaXhlbCA9ICgocmVkICAgPj4gUlNoaWZ0KSAmIFJNYXNrKSB8CiAgICAgICAgICAgICAgICAgICAgICAgICgoZ3JlZW4gPj4gR1NoaWZ0KSAmIEdNYXNrKSB8CiAgICAgICAgICAgICAgICAgICAgICAgICgoYmx1ZSAgPj4gQlNoaWZ0KSAmIEJNYXNrKTsKICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLwogICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7CiAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICB9IGVsc2UgLyogZGVwdGggPT0gOCAqLyB7CgogICAgICAgIC8qIEdSUjogIGFkZCA4LWJpdCBzdXBwb3J0ICovCgogICAgfQoKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBEaXNwbGF5IGFmdGVyIGV2ZXJ5IDE2IHJvd3Mgb3Igd2hlbiBvbiBvbmUgb2YgbGFzdCB0d28gcm93cy4gIChSZWdpb24KICAgIG1heSBpbmNsdWRlIHByZXZpb3VzbHkgZGlzcGxheWVkIGxpbmVzIGR1ZSB0byBpbnRlcmxhY2luZy0taS5lLiwgbm90CiAgICBjb250aWd1b3VzLiAgQWxzbywgc2Vjb25kLXRvLWxhc3Qgcm93IGlzIGZpbmFsIG9uZSBpbiBpbnRlcmxhY2VkIGltYWdlcwogICAgd2l0aCBvZGQgbnVtYmVyIG9mIHJvd3MuKSAgRm9yIGRlbW9zLCBmbHVzaCAoYW5kIGRlbGF5KSBhZnRlciBldmVyeSAxNnRoCiAgICByb3cgc28gInNwYXJzZSIgcGFzc2VzIGRvbid0IGdvIHR3aWNlIGFzIGZhc3QuCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBpZiAoZGVtb190aW1pbmcgJiYgKHJvdyAtIGZpcnN0cm93ID49IDE2IHx8IHJvdyA+PSBycG5nMl9pbmZvLmhlaWdodC0yKSkgewogICAgICAgIFhQdXRJbWFnZShkaXNwbGF5LCB3aW5kb3csIGdjLCB4aW1hZ2UsIDAsIChpbnQpZmlyc3Ryb3csIDAsCiAgICAgICAgICAoaW50KWZpcnN0cm93LCBycG5nMl9pbmZvLndpZHRoLCByb3cgLSBmaXJzdHJvdyArIDEpOwogICAgICAgIFhGbHVzaChkaXNwbGF5KTsKICAgICAgICByb3dzID0gMDsKICAgICAgICB1c2xlZXAodXNsZWVwX2R1cmF0aW9uKTsKICAgIH0gZWxzZQogICAgaWYgKCFkZW1vX3RpbWluZyAmJiAoKHJvd3MgJiAweGYpID09IDAgfHwgcm93ID49IHJwbmcyX2luZm8uaGVpZ2h0LTIpKSB7CiAgICAgICAgWFB1dEltYWdlKGRpc3BsYXksIHdpbmRvdywgZ2MsIHhpbWFnZSwgMCwgKGludClmaXJzdHJvdywgMCwKICAgICAgICAgIChpbnQpZmlyc3Ryb3csIHJwbmcyX2luZm8ud2lkdGgsIHJvdyAtIGZpcnN0cm93ICsgMSk7CiAgICAgICAgWEZsdXNoKGRpc3BsYXkpOwogICAgICAgIHJvd3MgPSAwOwogICAgfQoKfQoKCgoKCnN0YXRpYyB2b2lkIHJwbmcyX3hfZmluaXNoX2Rpc3BsYXkodm9pZCkKewogICAgVHJhY2UoKHN0ZGVyciwgImJlZ2lubmluZyBycG5nMl94X2ZpbmlzaF9kaXNwbGF5KClcbiIpKQoKICAgIC8qIGxhc3Qgcm93IGhhcyBhbHJlYWR5IGJlZW4gZGlzcGxheWVkIGJ5IHJwbmcyX3hfZGlzcGxheV9yb3coKSwgc28gd2UKICAgICAqIGhhdmUgbm90aGluZyB0byBkbyBoZXJlIGV4Y2VwdCBzZXQgYSBmbGFnIGFuZCBsZXQgdGhlIHVzZXIga25vdyB0aGF0CiAgICAgKiB0aGUgaW1hZ2UgaXMgZG9uZSAqLwoKICAgIHJwbmcyX2luZm8uc3RhdGUgPSBrRG9uZTsKICAgIHByaW50ZigKICAgICAgIkRvbmUuICBQcmVzcyBRLCBFc2Mgb3IgbW91c2UgYnV0dG9uIDEgKHdpdGhpbiBpbWFnZSB3aW5kb3cpIHRvIHF1aXQuXG4iKTsKICAgIGZmbHVzaChzdGRvdXQpOwp9CgoKCgoKc3RhdGljIHZvaWQgcnBuZzJfeF9yZWRpc3BsYXlfaW1hZ2UodWxnIHN0YXJ0Y29sLCB1bGcgc3RhcnRyb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVsZyB3aWR0aCwgdWxnIGhlaWdodCkKewogICAgdWNoIGJnX3JlZCAgID0gcnBuZzJfaW5mby5iZ19yZWQ7CiAgICB1Y2ggYmdfZ3JlZW4gPSBycG5nMl9pbmZvLmJnX2dyZWVuOwogICAgdWNoIGJnX2JsdWUgID0gcnBuZzJfaW5mby5iZ19ibHVlOwogICAgdWNoICpzcmMsICpzcmMyPU5VTEw7CiAgICBjaGFyICpkZXN0OwogICAgdWNoIHIsIGcsIGIsIGE7CiAgICB1bGcgaSwgcm93LCBsYXN0cm93ID0gMDsKICAgIHVsZyBwaXhlbDsKICAgIGludCB4aW1hZ2Vfcm93Ynl0ZXMgPSB4aW1hZ2UtPmJ5dGVzX3Blcl9saW5lOwoKCiAgICBUcmFjZSgoc3RkZXJyLCAiYmVnaW5uaW5nIGRpc3BsYXkgbG9vcCAoaW1hZ2VfY2hhbm5lbHMgPT0gJWQpXG4iLAogICAgICBycG5nMl9pbmZvLmNoYW5uZWxzKSkKICAgIFRyYWNlKChzdGRlcnIsICIgICAod2lkdGggPSAlbGQsIHJvd2J5dGVzID0gJWQsIHhpbWFnZV9yb3dieXRlcyA9ICVkKVxuIiwKICAgICAgcnBuZzJfaW5mby53aWR0aCwgcnBuZzJfaW5mby5yb3dieXRlcywgeGltYWdlX3Jvd2J5dGVzKSkKICAgIFRyYWNlKChzdGRlcnIsICIgICAoYnBwID0gJWQpXG4iLCB4aW1hZ2UtPmJpdHNfcGVyX3BpeGVsKSkKICAgIFRyYWNlKChzdGRlcnIsICIgICAoYnl0ZV9vcmRlciA9ICVzKVxuIiwgeGltYWdlLT5ieXRlX29yZGVyID09IE1TQkZpcnN0PwogICAgICAiTVNCRmlyc3QiIDogKHhpbWFnZS0+Ynl0ZV9vcmRlciA9PSBMU0JGaXJzdD8gIkxTQkZpcnN0IiA6ICJ1bmtub3duIikpKQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEFzaWRlIGZyb20gdGhlIHVzZSBvZiB0aGUgcnBuZzJfaW5mbyBzdHJ1Y3QgYW5kIG9mIHNyYzIgKGZvciBiYWNrZ3JvdW5kCiAgICBpbWFnZSksIHRoaXMgcm91dGluZSBpcyBpZGVudGljYWwgdG8gcnBuZ194X2Rpc3BsYXlfaW1hZ2UoKSBpbiB0aGUgbm9uLQogICAgcHJvZ3Jlc3NpdmUgdmVyc2lvbiBvZiB0aGUgcHJvZ3JhbS0tZm9yIHRoZSBzaW1wbGUgcmVhc29uIHRoYXQgcmVkaXNwbGF5CiAgICBvZiB0aGUgaW1hZ2UgYWdhaW5zdCBhIG5ldyBiYWNrZ3JvdW5kIGhhcHBlbnMgYWZ0ZXIgdGhlIGltYWdlIGlzIGZ1bGx5CiAgICBkZWNvZGVkIGFuZCB0aGVyZWZvcmUgaXMsIGJ5IGRlZmluaXRpb24sIG5vbi1wcm9ncmVzc2l2ZS4KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIGlmIChkZXB0aCA9PSAyNCB8fCBkZXB0aCA9PSAzMikgewogICAgICAgIHVsZyByZWQsIGdyZWVuLCBibHVlOwogICAgICAgIGludCBicHAgPSB4aW1hZ2UtPmJpdHNfcGVyX3BpeGVsOwoKICAgICAgICBmb3IgKGxhc3Ryb3cgPSByb3cgPSBzdGFydHJvdzsgIHJvdyA8IHN0YXJ0cm93K2hlaWdodDsgICsrcm93KSB7CiAgICAgICAgICAgIHNyYyA9IHJwbmcyX2luZm8uaW1hZ2VfZGF0YSArIHJvdypycG5nMl9pbmZvLnJvd2J5dGVzOwogICAgICAgICAgICBpZiAoYmdfaW1hZ2UpCiAgICAgICAgICAgICAgICBzcmMyID0gYmdfZGF0YSArIHJvdypiZ19yb3dieXRlczsKICAgICAgICAgICAgZGVzdCA9IHhpbWFnZS0+ZGF0YSArIHJvdyp4aW1hZ2Vfcm93Ynl0ZXM7CiAgICAgICAgICAgIGlmIChycG5nMl9pbmZvLmNoYW5uZWxzID09IDMpIHsKICAgICAgICAgICAgICAgIGZvciAoaSA9IHJwbmcyX2luZm8ud2lkdGg7ICBpID4gMDsgIC0taSkgewogICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKnNyYysrOwogICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKnNyYysrOwogICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKnNyYysrOwojaWZkZWYgTk9fMjRCSVRfTUFTS1MKICAgICAgICAgICAgICAgICAgICBwaXhlbCA9IChyZWQgICA8PCBSU2hpZnQpIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncmVlbiA8PCBHU2hpZnQpIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChibHVlICA8PCBCU2hpZnQpOwogICAgICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLwogICAgICAgICAgICAgICAgICAgIGlmIChicHAgPT0gMzIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMjQpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhpcyBhc3N1bWVzIGJwcCA9PSAyNCAmIGJpdHMgYXJlIHBhY2tlZCBsb3cgKi8KICAgICAgICAgICAgICAgICAgICAgICAgLyogKHByb2JhYmx5IG5lZWQgdG8gdXNlIFJTaGlmdCwgUk1hc2ssIGV0Yy4pICovCiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgfQojZWxzZQogICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKFJTaGlmdCA8IDApPyByZWQgICA8PCAoLVJTaGlmdCkgOiByZWQgICA+PiBSU2hpZnQ7CiAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAoR1NoaWZ0IDwgMCk/IGdyZWVuIDw8ICgtR1NoaWZ0KSA6IGdyZWVuID4+IEdTaGlmdDsKICAgICAgICAgICAgICAgICAgICBibHVlICA9IChCU2hpZnQgPCAwKT8gYmx1ZSAgPDwgKC1CU2hpZnQpIDogYmx1ZSAgPj4gQlNoaWZ0OwogICAgICAgICAgICAgICAgICAgIHBpeGVsID0gKHJlZCAmIFJNYXNrKSB8IChncmVlbiAmIEdNYXNrKSB8IChibHVlICYgQk1hc2spOwogICAgICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLwogICAgICAgICAgICAgICAgICAgIGlmIChicHAgPT0gMzIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMjQpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyogR1JSIEJVRyAqLwogICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIGFzc3VtZXMgYnBwID09IDI0ICYgYml0cyBhcmUgcGFja2VkIGxvdyAqLwogICAgICAgICAgICAgICAgICAgICAgICAvKiAocHJvYmFibHkgbmVlZCB0byB1c2UgUlNoaWZ0L1JNYXNrL2V0Yy4gaGVyZSwgdG9vKSAqLwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAxNikgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgIH0KI2VuZGlmCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9IGVsc2UgLyogaWYgKHJwbmcyX2luZm8uY2hhbm5lbHMgPT0gNCkgKi8gewogICAgICAgICAgICAgICAgZm9yIChpID0gcnBuZzJfaW5mby53aWR0aDsgIGkgPiAwOyAgLS1pKSB7CiAgICAgICAgICAgICAgICAgICAgciA9ICpzcmMrKzsKICAgICAgICAgICAgICAgICAgICBnID0gKnNyYysrOwogICAgICAgICAgICAgICAgICAgIGIgPSAqc3JjKys7CiAgICAgICAgICAgICAgICAgICAgYSA9ICpzcmMrKzsKICAgICAgICAgICAgICAgICAgICBpZiAoYmdfaW1hZ2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmdfcmVkICAgPSAqc3JjMisrOwogICAgICAgICAgICAgICAgICAgICAgICBiZ19ncmVlbiA9ICpzcmMyKys7CiAgICAgICAgICAgICAgICAgICAgICAgIGJnX2JsdWUgID0gKnNyYzIrKzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGEgPT0gMjU1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlZCAgID0gcjsKICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSBnOwogICAgICAgICAgICAgICAgICAgICAgICBibHVlICA9IGI7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVkICAgPSBiZ19yZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGdyZWVuID0gYmdfZ3JlZW47CiAgICAgICAgICAgICAgICAgICAgICAgIGJsdWUgID0gYmdfYmx1ZTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIG1hY3JvIChmcm9tIHBuZy5oKSBjb21wb3NpdGVzIHRoZSBmb3JlZ3JvdW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAqIGFuZCBiYWNrZ3JvdW5kIHZhbHVlcyBhbmQgcHV0cyB0aGUgcmVzdWx0IGludG8gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAqIGZpcnN0IGFyZ3VtZW50ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShyZWQsICAgciwgYSwgYmdfcmVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKGdyZWVuLCBnLCBhLCBiZ19ncmVlbik7CiAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShibHVlLCAgYiwgYSwgYmdfYmx1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQojaWZkZWYgTk9fMjRCSVRfTUFTS1MKICAgICAgICAgICAgICAgICAgICBwaXhlbCA9IChyZWQgICA8PCBSU2hpZnQpIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncmVlbiA8PCBHU2hpZnQpIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChibHVlICA8PCBCU2hpZnQpOwogICAgICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLwogICAgICAgICAgICAgICAgICAgIGlmIChicHAgPT0gMzIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMjQpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhpcyBhc3N1bWVzIGJwcCA9PSAyNCAmIGJpdHMgYXJlIHBhY2tlZCBsb3cgKi8KICAgICAgICAgICAgICAgICAgICAgICAgLyogKHByb2JhYmx5IG5lZWQgdG8gdXNlIFJTaGlmdCwgUk1hc2ssIGV0Yy4pICovCiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgfQojZWxzZQogICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKFJTaGlmdCA8IDApPyByZWQgICA8PCAoLVJTaGlmdCkgOiByZWQgICA+PiBSU2hpZnQ7CiAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAoR1NoaWZ0IDwgMCk/IGdyZWVuIDw8ICgtR1NoaWZ0KSA6IGdyZWVuID4+IEdTaGlmdDsKICAgICAgICAgICAgICAgICAgICBibHVlICA9IChCU2hpZnQgPCAwKT8gYmx1ZSAgPDwgKC1CU2hpZnQpIDogYmx1ZSAgPj4gQlNoaWZ0OwogICAgICAgICAgICAgICAgICAgIHBpeGVsID0gKHJlZCAmIFJNYXNrKSB8IChncmVlbiAmIEdNYXNrKSB8IChibHVlICYgQk1hc2spOwogICAgICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLwogICAgICAgICAgICAgICAgICAgIGlmIChicHAgPT0gMzIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMjQpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyogR1JSIEJVRyAqLwogICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIGFzc3VtZXMgYnBwID09IDI0ICYgYml0cyBhcmUgcGFja2VkIGxvdyAqLwogICAgICAgICAgICAgICAgICAgICAgICAvKiAocHJvYmFibHkgbmVlZCB0byB1c2UgUlNoaWZ0L1JNYXNrL2V0Yy4gaGVyZSwgdG9vKSAqLwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAxNikgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgIH0KI2VuZGlmCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyogZGlzcGxheSBhZnRlciBldmVyeSAxNiBsaW5lcyAqLwogICAgICAgICAgICBpZiAoKChyb3crMSkgJiAweGYpID09IDApIHsKICAgICAgICAgICAgICAgIFhQdXRJbWFnZShkaXNwbGF5LCB3aW5kb3csIGdjLCB4aW1hZ2UsIDAsIChpbnQpbGFzdHJvdywgMCwKICAgICAgICAgICAgICAgICAgKGludClsYXN0cm93LCBycG5nMl9pbmZvLndpZHRoLCAxNik7CiAgICAgICAgICAgICAgICBYRmx1c2goZGlzcGxheSk7CiAgICAgICAgICAgICAgICBsYXN0cm93ID0gcm93ICsgMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICB9IGVsc2UgaWYgKGRlcHRoID09IDE2KSB7CiAgICAgICAgdXNoIHJlZCwgZ3JlZW4sIGJsdWU7CgogICAgICAgIGZvciAobGFzdHJvdyA9IHJvdyA9IHN0YXJ0cm93OyAgcm93IDwgc3RhcnRyb3craGVpZ2h0OyAgKytyb3cpIHsKICAgICAgICAgICAgc3JjID0gcnBuZzJfaW5mby5yb3dfcG9pbnRlcnNbcm93XTsKICAgICAgICAgICAgaWYgKGJnX2ltYWdlKQogICAgICAgICAgICAgICAgc3JjMiA9IGJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7CiAgICAgICAgICAgIGRlc3QgPSB4aW1hZ2UtPmRhdGEgKyByb3cqeGltYWdlX3Jvd2J5dGVzOwogICAgICAgICAgICBpZiAocnBuZzJfaW5mby5jaGFubmVscyA9PSAzKSB7CiAgICAgICAgICAgICAgICBmb3IgKGkgPSBycG5nMl9pbmZvLndpZHRoOyAgaSA+IDA7ICAtLWkpIHsKICAgICAgICAgICAgICAgICAgICByZWQgICA9ICgodXNoKSgqc3JjKSA8PCA4KTsKICAgICAgICAgICAgICAgICAgICArK3NyYzsKICAgICAgICAgICAgICAgICAgICBncmVlbiA9ICgodXNoKSgqc3JjKSA8PCA4KTsKICAgICAgICAgICAgICAgICAgICArK3NyYzsKICAgICAgICAgICAgICAgICAgICBibHVlICA9ICgodXNoKSgqc3JjKSA8PCA4KTsKICAgICAgICAgICAgICAgICAgICArK3NyYzsKICAgICAgICAgICAgICAgICAgICBwaXhlbCA9ICgocmVkICAgPj4gUlNoaWZ0KSAmIFJNYXNrKSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGdyZWVuID4+IEdTaGlmdCkgJiBHTWFzaykgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKChibHVlICA+PiBCU2hpZnQpICYgQk1hc2spOwogICAgICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgLyogaWYgKHJwbmcyX2luZm8uY2hhbm5lbHMgPT0gNCkgKi8gewogICAgICAgICAgICAgICAgZm9yIChpID0gcnBuZzJfaW5mby53aWR0aDsgIGkgPiAwOyAgLS1pKSB7CiAgICAgICAgICAgICAgICAgICAgciA9ICpzcmMrKzsKICAgICAgICAgICAgICAgICAgICBnID0gKnNyYysrOwogICAgICAgICAgICAgICAgICAgIGIgPSAqc3JjKys7CiAgICAgICAgICAgICAgICAgICAgYSA9ICpzcmMrKzsKICAgICAgICAgICAgICAgICAgICBpZiAoYmdfaW1hZ2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmdfcmVkICAgPSAqc3JjMisrOwogICAgICAgICAgICAgICAgICAgICAgICBiZ19ncmVlbiA9ICpzcmMyKys7CiAgICAgICAgICAgICAgICAgICAgICAgIGJnX2JsdWUgID0gKnNyYzIrKzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGEgPT0gMjU1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKCh1c2gpciA8PCA4KTsKICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAoKHVzaClnIDw8IDgpOwogICAgICAgICAgICAgICAgICAgICAgICBibHVlICA9ICgodXNoKWIgPDwgOCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAoKHVzaCliZ19yZWQgICA8PCA4KTsKICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAoKHVzaCliZ19ncmVlbiA8PCA4KTsKICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAoKHVzaCliZ19ibHVlICA8PCA4KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIG1hY3JvIChmcm9tIHBuZy5oKSBjb21wb3NpdGVzIHRoZSBmb3JlZ3JvdW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAqIGFuZCBiYWNrZ3JvdW5kIHZhbHVlcyBhbmQgcHV0cyB0aGUgcmVzdWx0IGJhY2sgaW50bwogICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgZmlyc3QgYXJndW1lbnQgKD09IGZnIGJ5dGUgaGVyZTogIHNhZmUpICovCiAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShyLCByLCBhLCBiZ19yZWQpOwogICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUoZywgZywgYSwgYmdfZ3JlZW4pOwogICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUoYiwgYiwgYSwgYmdfYmx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKCh1c2gpciA8PCA4KTsKICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAoKHVzaClnIDw8IDgpOwogICAgICAgICAgICAgICAgICAgICAgICBibHVlICA9ICgodXNoKWIgPDwgOCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHBpeGVsID0gKChyZWQgICA+PiBSU2hpZnQpICYgUk1hc2spIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZ3JlZW4gPj4gR1NoaWZ0KSAmIEdNYXNrKSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGJsdWUgID4+IEJTaGlmdCkgJiBCTWFzayk7CiAgICAgICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyogZGlzcGxheSBhZnRlciBldmVyeSAxNiBsaW5lcyAqLwogICAgICAgICAgICBpZiAoKChyb3crMSkgJiAweGYpID09IDApIHsKICAgICAgICAgICAgICAgIFhQdXRJbWFnZShkaXNwbGF5LCB3aW5kb3csIGdjLCB4aW1hZ2UsIDAsIChpbnQpbGFzdHJvdywgMCwKICAgICAgICAgICAgICAgICAgKGludClsYXN0cm93LCBycG5nMl9pbmZvLndpZHRoLCAxNik7CiAgICAgICAgICAgICAgICBYRmx1c2goZGlzcGxheSk7CiAgICAgICAgICAgICAgICBsYXN0cm93ID0gcm93ICsgMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICB9IGVsc2UgLyogZGVwdGggPT0gOCAqLyB7CgogICAgICAgIC8qIEdSUjogIGFkZCA4LWJpdCBzdXBwb3J0ICovCgogICAgfQoKICAgIFRyYWNlKChzdGRlcnIsICJjYWxsaW5nIGZpbmFsIFhQdXRJbWFnZSgpXG4iKSkKICAgIGlmIChsYXN0cm93IDwgc3RhcnRyb3craGVpZ2h0KSB7CiAgICAgICAgWFB1dEltYWdlKGRpc3BsYXksIHdpbmRvdywgZ2MsIHhpbWFnZSwgMCwgKGludClsYXN0cm93LCAwLAogICAgICAgICAgKGludClsYXN0cm93LCBycG5nMl9pbmZvLndpZHRoLCBycG5nMl9pbmZvLmhlaWdodC1sYXN0cm93KTsKICAgICAgICBYRmx1c2goZGlzcGxheSk7CiAgICB9Cgp9IC8qIGVuZCBmdW5jdGlvbiBycG5nMl94X3JlZGlzcGxheV9pbWFnZSgpICovCgoKCgoKI2lmZGVmIEZFQVRVUkVfTE9PUAoKc3RhdGljIHZvaWQgcnBuZzJfeF9yZWxvYWRfYmdfaW1hZ2Uodm9pZCkKewogICAgY2hhciAqZGVzdDsKICAgIHVjaCByMSwgcjIsIGcxLCBnMiwgYjEsIGIyOwogICAgdWNoIHIxX2ludiwgcjJfaW52LCBnMV9pbnYsIGcyX2ludiwgYjFfaW52LCBiMl9pbnY7CiAgICBpbnQgaywgaG1heCwgbWF4OwogICAgaW50IHhpZHgsIHlpZHgsIHlpZHhfbWF4OwogICAgaW50IGV2ZW5fb2RkX3ZlcnQsIGV2ZW5fb2RkX2hvcml6LCBldmVuX29kZDsKICAgIGludCBpbnZlcnRfZ3JhZGllbnQyID0gKGJnW3BhdF0udHlwZSAmIDB4MDgpOwogICAgaW50IGludmVydF9jb2x1bW47CiAgICB1bGcgaSwgcm93OwoKCiAgICBiZ3NjYWxlID0gKHBhdCA9PSAwKT8gOCA6IGJnc2NhbGVfZGVmYXVsdDsKICAgIHlpZHhfbWF4ID0gYmdzY2FsZSAtIDE7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgVmVydGljYWwgZ3JhZGllbnRzIChyYW1wcykgaW4gTnhOIHNxdWFyZXMsIGFsdGVybmF0aW5nIGRpcmVjdGlvbiBhbmQKICAgIGNvbG9ycyAoTiA9PSBiZ3NjYWxlKS4KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIGlmICgoYmdbcGF0XS50eXBlICYgMHgwNykgPT0gMCkgewogICAgICAgIHVjaCByMV9taW4gID0gcmdiW2JnW3BhdF0ucmdiMV9taW5dLnI7CiAgICAgICAgdWNoIGcxX21pbiAgPSByZ2JbYmdbcGF0XS5yZ2IxX21pbl0uZzsKICAgICAgICB1Y2ggYjFfbWluICA9IHJnYltiZ1twYXRdLnJnYjFfbWluXS5iOwogICAgICAgIHVjaCByMl9taW4gID0gcmdiW2JnW3BhdF0ucmdiMl9taW5dLnI7CiAgICAgICAgdWNoIGcyX21pbiAgPSByZ2JbYmdbcGF0XS5yZ2IyX21pbl0uZzsKICAgICAgICB1Y2ggYjJfbWluICA9IHJnYltiZ1twYXRdLnJnYjJfbWluXS5iOwogICAgICAgIGludCByMV9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMV9tYXhdLnIgLSByMV9taW47CiAgICAgICAgaW50IGcxX2RpZmYgPSByZ2JbYmdbcGF0XS5yZ2IxX21heF0uZyAtIGcxX21pbjsKICAgICAgICBpbnQgYjFfZGlmZiA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5iIC0gYjFfbWluOwogICAgICAgIGludCByMl9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMl9tYXhdLnIgLSByMl9taW47CiAgICAgICAgaW50IGcyX2RpZmYgPSByZ2JbYmdbcGF0XS5yZ2IyX21heF0uZyAtIGcyX21pbjsKICAgICAgICBpbnQgYjJfZGlmZiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5iIC0gYjJfbWluOwoKICAgICAgICBmb3IgKHJvdyA9IDA7ICByb3cgPCBycG5nMl9pbmZvLmhlaWdodDsgICsrcm93KSB7CiAgICAgICAgICAgIHlpZHggPSAoaW50KShyb3cgJSBiZ3NjYWxlKTsKICAgICAgICAgICAgZXZlbl9vZGRfdmVydCA9IChpbnQpKChyb3cgLyBiZ3NjYWxlKSAmIDEpOwoKICAgICAgICAgICAgcjEgPSByMV9taW4gKyAocjFfZGlmZiAqIHlpZHgpIC8geWlkeF9tYXg7CiAgICAgICAgICAgIGcxID0gZzFfbWluICsgKGcxX2RpZmYgKiB5aWR4KSAvIHlpZHhfbWF4OwogICAgICAgICAgICBiMSA9IGIxX21pbiArIChiMV9kaWZmICogeWlkeCkgLyB5aWR4X21heDsKICAgICAgICAgICAgcjFfaW52ID0gcjFfbWluICsgKHIxX2RpZmYgKiAoeWlkeF9tYXgteWlkeCkpIC8geWlkeF9tYXg7CiAgICAgICAgICAgIGcxX2ludiA9IGcxX21pbiArIChnMV9kaWZmICogKHlpZHhfbWF4LXlpZHgpKSAvIHlpZHhfbWF4OwogICAgICAgICAgICBiMV9pbnYgPSBiMV9taW4gKyAoYjFfZGlmZiAqICh5aWR4X21heC15aWR4KSkgLyB5aWR4X21heDsKCiAgICAgICAgICAgIHIyID0gcjJfbWluICsgKHIyX2RpZmYgKiB5aWR4KSAvIHlpZHhfbWF4OwogICAgICAgICAgICBnMiA9IGcyX21pbiArIChnMl9kaWZmICogeWlkeCkgLyB5aWR4X21heDsKICAgICAgICAgICAgYjIgPSBiMl9taW4gKyAoYjJfZGlmZiAqIHlpZHgpIC8geWlkeF9tYXg7CiAgICAgICAgICAgIHIyX2ludiA9IHIyX21pbiArIChyMl9kaWZmICogKHlpZHhfbWF4LXlpZHgpKSAvIHlpZHhfbWF4OwogICAgICAgICAgICBnMl9pbnYgPSBnMl9taW4gKyAoZzJfZGlmZiAqICh5aWR4X21heC15aWR4KSkgLyB5aWR4X21heDsKICAgICAgICAgICAgYjJfaW52ID0gYjJfbWluICsgKGIyX2RpZmYgKiAoeWlkeF9tYXgteWlkeCkpIC8geWlkeF9tYXg7CgogICAgICAgICAgICBkZXN0ID0gKGNoYXIgKiliZ19kYXRhICsgcm93KmJnX3Jvd2J5dGVzOwogICAgICAgICAgICBmb3IgKGkgPSAwOyAgaSA8IHJwbmcyX2luZm8ud2lkdGg7ICArK2kpIHsKICAgICAgICAgICAgICAgIGV2ZW5fb2RkX2hvcml6ID0gKGludCkoKGkgLyBiZ3NjYWxlKSAmIDEpOwogICAgICAgICAgICAgICAgZXZlbl9vZGQgPSBldmVuX29kZF92ZXJ0IF4gZXZlbl9vZGRfaG9yaXo7CiAgICAgICAgICAgICAgICBpbnZlcnRfY29sdW1uID0KICAgICAgICAgICAgICAgICAgKGV2ZW5fb2RkX2hvcml6ICYmIChiZ1twYXRdLnR5cGUgJiAweDEwKSk7CiAgICAgICAgICAgICAgICBpZiAoZXZlbl9vZGQgPT0gMCkgeyAgICAgICAgLyogZ3JhZGllbnQgIzEgKi8KICAgICAgICAgICAgICAgICAgICBpZiAoaW52ZXJ0X2NvbHVtbikgewogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gcjFfaW52OwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gZzFfaW52OwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYjFfaW52OwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSByMTsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGcxOwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYjE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgIC8qIGdyYWRpZW50ICMyICovCiAgICAgICAgICAgICAgICAgICAgaWYgKChpbnZlcnRfY29sdW1uICYmIGludmVydF9ncmFkaWVudDIpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICghaW52ZXJ0X2NvbHVtbiAmJiAhaW52ZXJ0X2dyYWRpZW50MikpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gcjI7ICAgICAgIC8qIG5vdCBpbnZlcnRlZCBvciAqLwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gZzI7ICAgICAgIC8qICBkb3VibHkgaW52ZXJ0ZWQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGIyOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSByMl9pbnY7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBnMl9pbnY7ICAgLyogc2luZ2x5IGludmVydGVkICovCiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBiMl9pbnY7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNvZnQgZ3JhZGllbnQtZGlhbW9uZHMgd2l0aCBzY2FsZSA9IGJnc2NhbGUuICBDb2RlIGNvbnRyaWJ1dGVkIGJ5IEFkYW0KICAgIE0uIENvc3RlbGxvLgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgfSBlbHNlIGlmICgoYmdbcGF0XS50eXBlICYgMHgwNykgPT0gMSkgewoKICAgICAgICBobWF4ID0gKGJnc2NhbGUtMSkvMjsgICAvKiBoYWxmIHRoZSBtYXggd2VpZ2h0IG9mIGEgY29sb3IgKi8KICAgICAgICBtYXggPSAyKmhtYXg7ICAgICAgICAgICAvKiB0aGUgbWF4IHdlaWdodCBvZiBhIGNvbG9yICovCgogICAgICAgIHIxID0gcmdiW2JnW3BhdF0ucmdiMV9tYXhdLnI7CiAgICAgICAgZzEgPSByZ2JbYmdbcGF0XS5yZ2IxX21heF0uZzsKICAgICAgICBiMSA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5iOwogICAgICAgIHIyID0gcmdiW2JnW3BhdF0ucmdiMl9tYXhdLnI7CiAgICAgICAgZzIgPSByZ2JbYmdbcGF0XS5yZ2IyX21heF0uZzsKICAgICAgICBiMiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5iOwoKICAgICAgICBmb3IgKHJvdyA9IDA7ICByb3cgPCBycG5nMl9pbmZvLmhlaWdodDsgICsrcm93KSB7CiAgICAgICAgICAgIHlpZHggPSAoaW50KShyb3cgJSBiZ3NjYWxlKTsKICAgICAgICAgICAgaWYgKHlpZHggPiBobWF4KQogICAgICAgICAgICAgICAgeWlkeCA9IGJnc2NhbGUtMSAtIHlpZHg7CiAgICAgICAgICAgIGRlc3QgPSAoY2hhciAqKWJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7CiAgICAgICAgICAgIGZvciAoaSA9IDA7ICBpIDwgcnBuZzJfaW5mby53aWR0aDsgICsraSkgewogICAgICAgICAgICAgICAgeGlkeCA9IChpbnQpKGkgJSBiZ3NjYWxlKTsKICAgICAgICAgICAgICAgIGlmICh4aWR4ID4gaG1heCkKICAgICAgICAgICAgICAgICAgICB4aWR4ID0gYmdzY2FsZS0xIC0geGlkeDsKICAgICAgICAgICAgICAgIGsgPSB4aWR4ICsgeWlkeDsKICAgICAgICAgICAgICAgICpkZXN0KysgPSAoaypyMSArIChtYXgtaykqcjIpIC8gbWF4OwogICAgICAgICAgICAgICAgKmRlc3QrKyA9IChrKmcxICsgKG1heC1rKSpnMikgLyBtYXg7CiAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGsqYjEgKyAobWF4LWspKmIyKSAvIG1heDsKICAgICAgICAgICAgfQogICAgICAgIH0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBSYWRpYWwgInN0YXJidXJzdCIgd2l0aCBhemltdXRoYWwgc2ludXNvaWRzOyBbZXZlbnR1YWxseSBudW1iZXIgb2Ygc2ludS0KICAgIHNvaWRzIHdpbGwgZXF1YWwgYmdzY2FsZT9dLiAgVGhpcyBvbmUgaXMgc2xvdyBidXQgdmVyeSBjb29sLiAgQ29kZSBjb24tCiAgICB0cmlidXRlZCBieSBQaWV0ZXIgUy4gdmFuIGRlciBNZXVsZW4gKG9yaWdpbmFsbHkgaW4gU21hbGx0YWxrKS4KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIH0gZWxzZSBpZiAoKGJnW3BhdF0udHlwZSAmIDB4MDcpID09IDIpIHsKICAgICAgICB1Y2ggY2g7CiAgICAgICAgaW50IGlpLCB4LCB5LCBodywgaGgsIGdyYXlzcG90OwogICAgICAgIGRvdWJsZSBmcmVxLCByb3RhdGUsIHNhdHVyYXRlLCBncmF5LCBpbnRlbnNpdHk7CiAgICAgICAgZG91YmxlIGFuZ2xlPTAuMCwgYW9mZnNldD0wLjAsIG1heERpc3QsIGRpc3Q7CiAgICAgICAgZG91YmxlIHJlZD0wLjAsIGdyZWVuPTAuMCwgYmx1ZT0wLjAsIGh1ZSwgcywgdiwgZiwgcCwgcSwgdDsKCiAgICAgICAgaGggPSAoaW50KShycG5nMl9pbmZvLmhlaWdodCAvIDIpOwogICAgICAgIGh3ID0gKGludCkocnBuZzJfaW5mby53aWR0aCAvIDIpOwoKICAgICAgICAvKiB2YXJpYWJsZXMgZm9yIHJhZGlhbCB3YXZlczoKICAgICAgICAgKiAgIGFvZmZzZXQ6ICBudW1iZXIgb2YgZGVncmVlcyB0byByb3RhdGUgaHVlIFtDVVJSRU5UTFkgTk9UIFVTRURdCiAgICAgICAgICogICBmcmVxOiAgbnVtYmVyIG9mIGNvbG9yIGJlYW1zIG9yaWdpbmF0aW5nIGZyb20gdGhlIGNlbnRlcgogICAgICAgICAqICAgZ3JheXNwb3Q6ICBzaXplIG9mIHRoZSBncmF5aW5nIGNlbnRlciBhcmVhIChhbnRpLWFsaWFzKQogICAgICAgICAqICAgcm90YXRlOiAgcm90YXRpb24gb2YgdGhlIGJlYW1zIGFzIGEgZnVuY3Rpb24gb2YgcmFkaXVzCiAgICAgICAgICogICBzYXR1cmF0ZTogIHNhdHVyYXRpb24gb2YgYmVhbXMnIHNoYXBlIGF6aW11dGhhbGx5CiAgICAgICAgICovCiAgICAgICAgYW5nbGUgPSBDTElQKGFuZ2xlLCAwLjAsIDM2MC4wKTsKICAgICAgICBncmF5c3BvdCA9IENMSVAoYmdbcGF0XS5iZ19ncmF5LCAxLCAoaGggKyBodykpOwogICAgICAgIGZyZXEgPSBNQVgoKGRvdWJsZSliZ1twYXRdLmJnX2ZyZXEsIDAuMCk7CiAgICAgICAgc2F0dXJhdGUgPSAoZG91YmxlKWJnW3BhdF0uYmdfYnNhdCAqIDAuMTsKICAgICAgICByb3RhdGUgPSAoZG91YmxlKWJnW3BhdF0uYmdfYnJvdCAqIDAuMTsKICAgICAgICBncmF5ID0gMC4wOwogICAgICAgIGludGVuc2l0eSA9IDAuMDsKICAgICAgICBtYXhEaXN0ID0gKGRvdWJsZSkoKGh3Kmh3KSArIChoaCpoaCkpOwoKICAgICAgICBmb3IgKHJvdyA9IDA7ICByb3cgPCBycG5nMl9pbmZvLmhlaWdodDsgICsrcm93KSB7CiAgICAgICAgICAgIHkgPSAoaW50KShyb3cgLSBoaCk7CiAgICAgICAgICAgIGRlc3QgPSAoY2hhciAqKWJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7CiAgICAgICAgICAgIGZvciAoaSA9IDA7ICBpIDwgcnBuZzJfaW5mby53aWR0aDsgICsraSkgewogICAgICAgICAgICAgICAgeCA9IChpbnQpKGkgLSBodyk7CiAgICAgICAgICAgICAgICBhbmdsZSA9ICh4ID09IDApPyBQSV8yIDogYXRhbigoZG91YmxlKXkgLyAoZG91YmxlKXgpOwogICAgICAgICAgICAgICAgZ3JheSA9IChkb3VibGUpTUFYKEFCUyh5KSwgQUJTKHgpKSAvIGdyYXlzcG90OwogICAgICAgICAgICAgICAgZ3JheSA9IE1JTigxLjAsIGdyYXkpOwogICAgICAgICAgICAgICAgZGlzdCA9IChkb3VibGUpKCh4KngpICsgKHkqeSkpIC8gbWF4RGlzdDsKICAgICAgICAgICAgICAgIGludGVuc2l0eSA9IGNvcygoYW5nbGUrKHJvdGF0ZSpkaXN0KlBJKSkgKiBmcmVxKSAqCiAgICAgICAgICAgICAgICAgIGdyYXkgKiBzYXR1cmF0ZTsKICAgICAgICAgICAgICAgIGludGVuc2l0eSA9IChNQVgoTUlOKGludGVuc2l0eSwxLjApLC0xLjApICsgMS4wKSAqIDAuNTsKICAgICAgICAgICAgICAgIGh1ZSA9IChhbmdsZSArIFBJKSAqIElOVl9QSV8zNjAgKyBhb2Zmc2V0OwogICAgICAgICAgICAgICAgcyA9IGdyYXkgKiAoKGRvdWJsZSkoQUJTKHgpK0FCUyh5KSkgLyAoZG91YmxlKShodyArIGhoKSk7CiAgICAgICAgICAgICAgICBzID0gTUlOKE1BWChzLDAuMCksIDEuMCk7CiAgICAgICAgICAgICAgICB2ID0gTUlOKE1BWChpbnRlbnNpdHksMC4wKSwgMS4wKTsKCiAgICAgICAgICAgICAgICBpZiAocyA9PSAwLjApIHsKICAgICAgICAgICAgICAgICAgICBjaCA9ICh1Y2gpKHYgKiAyNTUuMCk7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGNoOwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBjaDsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gY2g7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICgoaHVlIDwgMC4wKSB8fCAoaHVlID49IDM2MC4wKSkKICAgICAgICAgICAgICAgICAgICAgICAgaHVlIC09ICgoKGludCkoaHVlIC8gMzYwLjApKSAqIDM2MC4wKTsKICAgICAgICAgICAgICAgICAgICBodWUgLz0gNjAuMDsKICAgICAgICAgICAgICAgICAgICBpaSA9IChpbnQpaHVlOwogICAgICAgICAgICAgICAgICAgIGYgPSBodWUgLSAoZG91YmxlKWlpOwogICAgICAgICAgICAgICAgICAgIHAgPSAoMS4wIC0gcykgKiB2OwogICAgICAgICAgICAgICAgICAgIHEgPSAoMS4wIC0gKHMgKiBmKSkgKiB2OwogICAgICAgICAgICAgICAgICAgIHQgPSAoMS4wIC0gKHMgKiAoMS4wIC0gZikpKSAqIHY7CiAgICAgICAgICAgICAgICAgICAgaWYgICAgICAoaWkgPT0gMCkgeyByZWQgPSB2OyBncmVlbiA9IHQ7IGJsdWUgPSBwOyB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaWkgPT0gMSkgeyByZWQgPSBxOyBncmVlbiA9IHY7IGJsdWUgPSBwOyB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaWkgPT0gMikgeyByZWQgPSBwOyBncmVlbiA9IHY7IGJsdWUgPSB0OyB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaWkgPT0gMykgeyByZWQgPSBwOyBncmVlbiA9IHE7IGJsdWUgPSB2OyB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaWkgPT0gNCkgeyByZWQgPSB0OyBncmVlbiA9IHA7IGJsdWUgPSB2OyB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaWkgPT0gNSkgeyByZWQgPSB2OyBncmVlbiA9IHA7IGJsdWUgPSBxOyB9CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9ICh1Y2gpKHJlZCAqIDI1NS4wKTsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKHVjaCkoZ3JlZW4gKiAyNTUuMCk7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9ICh1Y2gpKGJsdWUgKiAyNTUuMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cgp9IC8qIGVuZCBmdW5jdGlvbiBycG5nMl94X3JlbG9hZF9iZ19pbWFnZSgpICovCgoKCgoKc3RhdGljIGludCBpc19udW1iZXIoY2hhciAqcCkKewogICAgd2hpbGUgKCpwKSB7CiAgICAgICAgaWYgKCFpc2RpZ2l0KCpwKSkKICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICsrcDsKICAgIH0KICAgIHJldHVybiBUUlVFOwp9CgojZW5kaWYgLyogRkVBVFVSRV9MT09QICovCgoKCgoKc3RhdGljIHZvaWQgcnBuZzJfeF9jbGVhbnVwKHZvaWQpCnsKICAgIGlmIChiZ19pbWFnZSAmJiBiZ19kYXRhKSB7CiAgICAgICAgZnJlZShiZ19kYXRhKTsKICAgICAgICBiZ19kYXRhID0gTlVMTDsKICAgIH0KCiAgICBpZiAocnBuZzJfaW5mby5pbWFnZV9kYXRhKSB7CiAgICAgICAgZnJlZShycG5nMl9pbmZvLmltYWdlX2RhdGEpOwogICAgICAgIHJwbmcyX2luZm8uaW1hZ2VfZGF0YSA9IE5VTEw7CiAgICB9CgogICAgaWYgKHJwbmcyX2luZm8ucm93X3BvaW50ZXJzKSB7CiAgICAgICAgZnJlZShycG5nMl9pbmZvLnJvd19wb2ludGVycyk7CiAgICAgICAgcnBuZzJfaW5mby5yb3dfcG9pbnRlcnMgPSBOVUxMOwogICAgfQoKICAgIGlmICh4aW1hZ2UpIHsKICAgICAgICBpZiAoeGltYWdlLT5kYXRhKSB7CiAgICAgICAgICAgIGZyZWUoeGltYWdlLT5kYXRhKTsgICAgICAgICAgIC8qIHdlIGFsbG9jYXRlZCBpdCwgc28gd2UgZnJlZSBpdCAqLwogICAgICAgICAgICB4aW1hZ2UtPmRhdGEgPSAoY2hhciAqKU5VTEw7ICAvKiAgaW5zdGVhZCBvZiBYRGVzdHJveUltYWdlKCkgKi8KICAgICAgICB9CiAgICAgICAgWERlc3Ryb3lJbWFnZSh4aW1hZ2UpOwogICAgICAgIHhpbWFnZSA9IE5VTEw7CiAgICB9CgogICAgaWYgKGhhdmVfZ2MpCiAgICAgICAgWEZyZWVHQyhkaXNwbGF5LCBnYyk7CgogICAgaWYgKGhhdmVfd2luZG93KQogICAgICAgIFhEZXN0cm95V2luZG93KGRpc3BsYXksIHdpbmRvdyk7CgogICAgaWYgKGhhdmVfY29sb3JtYXApCiAgICAgICAgWEZyZWVDb2xvcm1hcChkaXNwbGF5LCBjb2xvcm1hcCk7CgogICAgaWYgKGhhdmVfbm9uZGVmYXVsdF92aXN1YWwpCiAgICAgICAgWEZyZWUodmlzdWFsX2xpc3QpOwp9CgoKCgoKc3RhdGljIGludCBycG5nMl94X21zYih1bGcgdTMydmFsKQp7CiAgICBpbnQgaTsKCiAgICBmb3IgKGkgPSAzMTsgIGkgPj0gMDsgIC0taSkgewogICAgICAgIGlmICh1MzJ2YWwgJiAweDgwMDAwMDAwTCkKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgdTMydmFsIDw8PSAxOwogICAgfQogICAgcmV0dXJuIGk7Cn0K