LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgIHJwbmcyIC0gcHJvZ3Jlc3NpdmUtbW9kZWwgUE5HIGRpc3BsYXkgcHJvZ3JhbSAgICAgICAgICAgICAgICAgIHJwbmcyLXguYwoKICAgVGhpcyBwcm9ncmFtIGRlY29kZXMgYW5kIGRpc3BsYXlzIFBORyBmaWxlcyBwcm9ncmVzc2l2ZWx5LCBhcyBpZiBpdCB3ZXJlCiAgIGEgd2ViIGJyb3dzZXIgKHRob3VnaCB0aGUgZnJvbnQgZW5kIGlzIG9ubHkgc2V0IHVwIHRvIHJlYWQgZnJvbSBmaWxlcykuCiAgIEl0IHN1cHBvcnRzIGdhbW1hIGNvcnJlY3Rpb24sIHVzZXItc3BlY2lmaWVkIGJhY2tncm91bmQgY29sb3JzLCBhbmQgdXNlci0KICAgc3BlY2lmaWVkIGJhY2tncm91bmQgcGF0dGVybnMgKGZvciB0cmFuc3BhcmVudCBpbWFnZXMpLiAgVGhpcyB2ZXJzaW9uIGlzCiAgIGZvciB0aGUgWCBXaW5kb3cgU3lzdGVtICh0ZXN0ZWQgYnkgdGhlIGF1dGhvciB1bmRlciBVbml4IGFuZCBieSBNYXJ0aW4KICAgWmluc2VyIHVuZGVyIE9wZW5WTVM7IG1heSB3b3JrIHVuZGVyIE9TLzIgd2l0aCBhIGxpdHRsZSB0d2Vha2luZykuCgogICBUaGFua3MgdG8gQWRhbSBDb3N0ZWxsbyBhbmQgUGlldGVyIFMuIHZhbiBkZXIgTWV1bGVuIGZvciB0aGUgImRpYW1vbmQiCiAgIGFuZCAicmFkaWFsIHdhdmVzIiBwYXR0ZXJucywgcmVzcGVjdGl2ZWx5LgoKICAgdG8gZG8gKHNvbWVkYXksIG1heWJlKToKICAgIC0gZml4IGV4cG9zZS9yZWRyYXcgY29kZTogIGRvbid0IGRyYXcgZW50aXJlIHJvdyBpZiBvbmx5IHBhcnQgZXhwb3NlZAogICAgLSA4LWJpdCAoY29sb3JtYXBwZWQpIFggc3VwcG9ydAogICAgLSBmaW5pc2ggcmVzaXphYmxlIGNoZWNrZXJib2FyZC1ncmFkaWVudCAoc2l6ZXMgNC0xMjg/KQogICAgLSB1c2UgJS4xMDIzcyB0byBzaW1wbGlmeSB0cnVuY2F0aW9uIG9mIHRpdGxlLWJhciBzdHJpbmc/CgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgQ2hhbmdlbG9nOgogICAgLSAxLjAxOiAgaW5pdGlhbCBwdWJsaWMgcmVsZWFzZQogICAgLSAxLjAyOiAgbW9kaWZpZWQgdG8gYWxsb3cgYWJicmV2aWF0ZWQgb3B0aW9uczsgZml4ZWQgY2hhci91Y2hhciBtaXNtYXRjaAogICAgLSAxLjEwOiAgYWRkZWQgc3VwcG9ydCBmb3Igbm9uLWRlZmF1bHQgdmlzdWFsczsgZml4ZWQgWCBwaXhlbC1jb252ZXJzaW9uCiAgICAtIDEuMTE6ICBhZGRlZCAtdXNsZWVwIG9wdGlvbiBmb3IgZGVtb3M7IGZpeGVkIGNvbW1hbmQtbGluZSBwYXJzaW5nIGJ1ZwogICAgLSAxLjEyOiAgYWRkZWQgLXBhdXNlIG9wdGlvbiBmb3IgZGVtb3MgYW5kIHRlc3RpbmcKICAgIC0gMS4yMDogIGFkZGVkIHJ1bnRpbWUgTU1YLWVuYWJsaW5nL2Rpc2FibGluZyBhbmQgbmV3IC1tbXgqIG9wdGlvbnMKICAgIC0gMS4yMTogIGZpeGVkIHNvbWUgc21hbGwgWCBtZW1vcnkgbGVha3MgKHRoYW5rcyB0byBGcmFu529pcyBQZXRpdGplYW4pCiAgICAtIDEuMjI6ICBmaXhlZCBYRnJlZUdDKCkgY3Jhc2ggYnVnICh0aGFua3MgdG8gUGF0cmljayBXZWxjaGUpCiAgICAtIDEuMjM6ICBhZGRlZCAtYmdwYXQgMCBtb2RlIChzdGQgd2hpdGUvZ3JheSBjaGVja2VyYm9hcmQsIDh4OCBzcXVhcmVzKQogICAgLSAxLjMwOiAgYWRkZWQgLWxvb3Agb3B0aW9uIGZvciAtYmdwYXQgKGlmZGVmIEZFQVRVUkVfTE9PUCk7IGZpeGVkIGJwcCA9CiAgICAgICAgICAgICAgMjQ7IGFkZGVkIHN1cHBvcnQgZm9yIFggcmVzb3VyY2VzICh0aGFua3MgdG8gR2VyaGFyZCBOaWtsYXNjaCkKICAgIC0gMS4zMTogIGFkZGVkIGNvZGUgdG8gc2tpcCB1bnVzZWQgY2h1bmtzICh0aGFua3MgdG8gR2xlbm4gUmFuZGVycy1QZWhyc29uKQogICAgLSAxLjMyOiAgYWRkZWQgQU1ENjQvRU02NFQgc3VwcG9ydCAoX194ODZfNjRfXyk7IGFkZGVkIGJhc2ljIGV4cG9zZS9yZWRyYXcKICAgICAgICAgICAgICBoYW5kbGluZwogICAgLSAyLjAwOiAgZHVhbC1saWNlbnNlZCAoYWRkZWQgR05VIEdQTCkKICAgIC0gMi4wMTogIGZpeGVkIDY0LWJpdCB0eXBvIGluIHJlYWRwbmcyLmM7IGZpeGVkIC1wYXVzZSB1c2FnZSBkZXNjcmlwdGlvbgogICAgLSAyLjAyOiAgZml4ZWQgaW1wcm9wZXIgZGlzcGxheSBvZiB1c2FnZSBzY3JlZW4gb24gUE5HIGVycm9yKHMpOyBmaXhlZAogICAgICAgICAgICAgIHVuZXhwZWN0ZWQtRU9GIGFuZCBmaWxlLXJlYWQtZXJyb3IgY2FzZXM7IGZpeGVkIFRyYWNlKCkgY3V0LWFuZC0KICAgICAgICAgICAgICBwYXN0ZSBidWdzCiAgICAtIDIuMDM6ICBkZWxldGVkIHJ1bnRpbWUgTU1YLWVuYWJsaW5nL2Rpc2FibGluZyBhbmQgb2Jzb2xldGUgLW1teCogb3B0aW9ucwoKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDA4IEdyZWcgUm9lbG9mcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcywiIHdpdGhvdXQgd2FycmFudHkgb2YgYW55IGtpbmQsCiAgICAgIGV4cHJlc3Mgb3IgaW1wbGllZC4gIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBhdXRob3Igb3IgY29udHJpYnV0b3JzCiAgICAgIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIGluIGFueSB3YXkgZnJvbSB0aGUgdXNlIG9mCiAgICAgIHRoaXMgc29mdHdhcmUuCgogICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBEVUFMLUxJQ0VOU0VELiAgWW91IG1heSBtb2RpZnkgYW5kL29yCiAgICAgIHJlZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2Ygb25lIG9mIHRoZQogICAgICBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzIChhdCB5b3VyIG9wdGlvbik6CgoKICAgICAgTElDRU5TRSAxICgiQlNELWxpa2Ugd2l0aCBhZHZlcnRpc2luZyBjbGF1c2UiKToKCiAgICAgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAogICAgICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlCiAgICAgIGl0IGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKCiAgICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAgICAgICAgIG5vdGljZSwgZGlzY2xhaW1lciwgYW5kIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLgogICAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhLQogICAgICAgICB0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogICAgICAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKICAgICAgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CgogICAgICAgICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IEdyZWcgUm9lbG9mcwogICAgICAgICAgICBhbmQgY29udHJpYnV0b3JzIGZvciB0aGUgYm9vaywgIlBORzogVGhlIERlZmluaXRpdmUgR3VpZGUsIgogICAgICAgICAgICBwdWJsaXNoZWQgYnkgTydSZWlsbHkgYW5kIEFzc29jaWF0ZXMuCgoKICAgICAgTElDRU5TRSAyIChHTlUgR1BMIHYyIG9yIGxhdGVyKToKCiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKICAgICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQoKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKI2RlZmluZSBQUk9HTkFNRSAgInJwbmcyLXgiCiNkZWZpbmUgTE9OR05BTUUgICJQcm9ncmVzc2l2ZSBQTkcgVmlld2VyIGZvciBYIgojZGVmaW5lIFZFUlNJT04gICAiMi4wMyBvZiAyNSBGZWJydWFyeSAyMDEwIgojZGVmaW5lIFJFU05BTUUgICAicnBuZzIiICAgICAgIC8qIG91ciBYIHJlc291cmNlIGFwcGxpY2F0aW9uIG5hbWUgKi8KI2RlZmluZSBSRVNDTEFTUyAgIlJwbmciICAgICAgIC8qIG91ciBYIHJlc291cmNlIGNsYXNzIG5hbWUgKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzZXRqbXAuaD4gICAgICAgLyogZm9yIGptcGJ1ZiBkZWNsYXJhdGlvbiBpbiByZWFkcG5nMi5oICovCiNpbmNsdWRlIDx0aW1lLmg+CiNpbmNsdWRlIDxtYXRoLmg+ICAgICAgICAgLyogb25seSBmb3IgUHZkTSBiYWNrZ3JvdW5kIGNvZGUgKi8KI2luY2x1ZGUgPFgxMS9YbGliLmg+CiNpbmNsdWRlIDxYMTEvWHV0aWwuaD4KI2luY2x1ZGUgPFgxMS9Yb3MuaD4KI2luY2x1ZGUgPFgxMS9rZXlzeW0uaD4gICAvKiBkZWZpbmVzIFhLXyogbWFjcm9zICovCgojaWZkZWYgVk1TCiMgIGluY2x1ZGUgPHVuaXN0ZC5oPgojZW5kaWYKCi8qIGFsbCBmb3IgUHZkTSBiYWNrZ3JvdW5kIGNvZGU6ICovCiNpZm5kZWYgUEkKIyAgZGVmaW5lIFBJICAgICAgICAgICAgIDMuMTQxNTkyNjUzNTg5NzkzMjM4CiNlbmRpZgojZGVmaW5lIFBJXzIgICAgICAgICAgICAgKFBJKjAuNSkKI2RlZmluZSBJTlZfUElfMzYwICAgICAgICgzNjAuMCAvIFBJKQojZGVmaW5lIE1BWChhLGIpICAgICAgICAgKGE+Yj9hOmIpCiNkZWZpbmUgTUlOKGEsYikgICAgICAgICAoYTxiP2E6YikKI2RlZmluZSBDTElQKGEsbWluLG1heCkgIE1BWChtaW4sTUlOKChhKSxtYXgpKQojZGVmaW5lIEFCUyhhKSAgICAgICAgICAgKChhKTwwPy0oYSk6KGEpKQojZGVmaW5lIENMSVA4UChjKSAgICAgICAgTUFYKDAsKE1JTigoYyksMjU1KSkpICAgLyogOC1iaXQgcG9zLiBpbnRlZ2VyICh1Y2gpICovCiNkZWZpbmUgUk9VTkRGKGYpICAgICAgICAoKGludCkoZiArIDAuNSkpCgojZGVmaW5lIFFVSVQoZSxrKSAoKGUudHlwZSA9PSBCdXR0b25QcmVzcyAmJiBlLnhidXR0b24uYnV0dG9uID09IEJ1dHRvbjEpIHx8ICBcCiAgICAgICAgICAgICAgICAgIChlLnR5cGUgPT0gS2V5UHJlc3MgJiYgICAvKiAgdi0tLSBvciAxIGZvciBzaGlmdGVkIGtleXMgKi8gIFwKICAgICAgICAgICAgICAgICAgKChrID0gWExvb2t1cEtleXN5bSgmZS54a2V5LCAwKSkgPT0gWEtfcSB8fCBrID09IFhLX0VzY2FwZSkpKQoKI2RlZmluZSBOT18yNEJJVF9NQVNLUyAvKiB1bmRlZiBjYXNlIG5vdCBmdWxseSB3cml0dGVuLS1vbmx5IGZvciByZWRpc3BsYXkoKSAqLwoKI2RlZmluZSByZ2IxX21heCAgIGJnX2ZyZXEKI2RlZmluZSByZ2IxX21pbiAgIGJnX2dyYXkKI2RlZmluZSByZ2IyX21heCAgIGJnX2JzYXQKI2RlZmluZSByZ2IyX21pbiAgIGJnX2Jyb3QKCi8qICNkZWZpbmUgREVCVUcgKi8gICAgIC8qIHRoaXMgZW5hYmxlcyB0aGUgVHJhY2UoKSBtYWNyb3MgKi8KCiNpbmNsdWRlICJyZWFkcG5nMi5oIiAgIC8qIHR5cGVkZWZzLCBjb21tb24gbWFjcm9zLCByZWFkcG5nMiBwcm90b3R5cGVzICovCgoKLyogY291bGQganVzdCBpbmNsdWRlIHBuZy5oLCBidXQgdGhpcyBtYWNybyBpcyB0aGUgb25seSB0aGluZyB3ZSBuZWVkCiAqIChuYW1lIGFuZCB0eXBlZGVmcyBjaGFuZ2VkIHRvIGxvY2FsIHZlcnNpb25zKTsgbm90ZSB0aGF0IHNpZGUgZWZmZWN0cwogKiBvbmx5IGhhcHBlbiB3aXRoIGFscGhhICh3aGljaCBjb3VsZCBlYXNpbHkgYmUgYXZvaWRlZCB3aXRoCiAqICJ1c2ggYWNvcHkgPSAoYWxwaGEpOyIpICovCgojZGVmaW5lIGFscGhhX2NvbXBvc2l0ZShjb21wb3NpdGUsIGZnLCBhbHBoYSwgYmcpIHsgICAgICAgICAgICAgICBcCiAgICB1c2ggdGVtcCA9ICgodXNoKShmZykqKHVzaCkoYWxwaGEpICsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICh1c2gpKGJnKSoodXNoKSgyNTUgLSAodXNoKShhbHBoYSkpICsgKHVzaCkxMjgpOyAgXAogICAgKGNvbXBvc2l0ZSkgPSAodWNoKSgodGVtcCArICh0ZW1wID4+IDgpKSA+PiA4KTsgICAgICAgICAgICAgICBcCn0KCgojZGVmaW5lIElOQlVGU0laRSA0MDk2ICAgLyogd2l0aCBwc2V1ZG8tdGltaW5nIG9uICgxIHNlYyBkZWxheS9ibG9jayksIHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAqICBibG9jayBzaXplIGNvcnJlc3BvbmRzIHJvdWdobHkgdG8gYSBkb3dubG9hZAogICAgICAgICAgICAgICAgICAgICAgICAgICogIHNwZWVkIDEwJSBmYXN0ZXIgdGhhbiB0aGVvcmV0aWNhbCAzMy42SyBtYXhpbXVtCiAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgKGFzc3VtaW5nIDggZGF0YSBiaXRzLCAxIHN0b3AgYml0IGFuZCBubyBvdGhlcgogICAgICAgICAgICAgICAgICAgICAgICAgICogIG92ZXJoZWFkKSAqLwoKLyogbG9jYWwgcHJvdG90eXBlcyAqLwpzdGF0aWMgdm9pZCBycG5nMl94X2luaXQgKHZvaWQpOwpzdGF0aWMgaW50ICBycG5nMl94X2NyZWF0ZV93aW5kb3cgKHZvaWQpOwpzdGF0aWMgaW50ICBycG5nMl94X2xvYWRfYmdfaW1hZ2UgKHZvaWQpOwpzdGF0aWMgdm9pZCBycG5nMl94X2Rpc3BsYXlfcm93ICh1bGcgcm93KTsKc3RhdGljIHZvaWQgcnBuZzJfeF9maW5pc2hfZGlzcGxheSAodm9pZCk7CnN0YXRpYyB2b2lkIHJwbmcyX3hfcmVkaXNwbGF5X2ltYWdlICh1bGcgc3RhcnRjb2wsIHVsZyBzdGFydHJvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVsZyB3aWR0aCwgdWxnIGhlaWdodCk7CiNpZmRlZiBGRUFUVVJFX0xPT1AKc3RhdGljIHZvaWQgcnBuZzJfeF9yZWxvYWRfYmdfaW1hZ2UgKHZvaWQpOwpzdGF0aWMgaW50ICBpc19udW1iZXIgKGNoYXIgKnApOwojZW5kaWYKc3RhdGljIHZvaWQgcnBuZzJfeF9jbGVhbnVwICh2b2lkKTsKc3RhdGljIGludCAgcnBuZzJfeF9tc2IgKHVsZyB1MzJ2YWwpOwoKCnN0YXRpYyBjaGFyIHRpdGxlYmFyWzEwMjRdLCAqd2luZG93X25hbWUgPSB0aXRsZWJhcjsKc3RhdGljIGNoYXIgKmFwcG5hbWUgPSBMT05HTkFNRTsKc3RhdGljIGNoYXIgKmljb25fbmFtZSA9IFBST0dOQU1FOwpzdGF0aWMgY2hhciAqcmVzX25hbWUgPSBSRVNOQU1FOwpzdGF0aWMgY2hhciAqcmVzX2NsYXNzID0gUkVTQ0xBU1M7CnN0YXRpYyBjaGFyICpmaWxlbmFtZTsKc3RhdGljIEZJTEUgKmluZmlsZTsKCnN0YXRpYyBtYWlucHJvZ19pbmZvIHJwbmcyX2luZm87CgpzdGF0aWMgdWNoIGluYnVmW0lOQlVGU0laRV07CnN0YXRpYyBpbnQgaW5jb3VudDsKCnN0YXRpYyBpbnQgcGF0ID0gNjsgICAgICAgIC8qIG11c3QgYmUgbGVzcyB0aGFuIG51bV9iZ3BhdCAqLwpzdGF0aWMgaW50IGJnX2ltYWdlID0gMDsKc3RhdGljIGludCBiZ3NjYWxlLCBiZ3NjYWxlX2RlZmF1bHQgPSAxNjsKc3RhdGljIHVsZyBiZ19yb3dieXRlczsKc3RhdGljIHVjaCAqYmdfZGF0YTsKCmludCBwYXVzZV9hZnRlcl9wYXNzID0gRkFMU0U7CmludCBkZW1vX3RpbWluZyA9IEZBTFNFOwp1bGcgdXNsZWVwX2R1cmF0aW9uID0gMEw7CgpzdGF0aWMgc3RydWN0IHJnYl9jb2xvciB7CiAgICB1Y2ggciwgZywgYjsKfSByZ2JbXSA9IHsKICAgIHsgIDAsICAgMCwgICAwfSwgICAgLyogIDA6ICBibGFjayAqLwogICAgezI1NSwgMjU1LCAyNTV9LCAgICAvKiAgMTogIHdoaXRlICovCiAgICB7MTczLCAxMzIsICA1N30sICAgIC8qICAyOiAgdGFuICovCiAgICB7IDY0LCAxMzIsICAgMH0sICAgIC8qICAzOiAgbWVkaXVtIGdyZWVuICovCiAgICB7MTg5LCAxMTcsICAgMX0sICAgIC8qICA0OiAgZ29sZCAqLwogICAgezI1MywgMjQ5LCAgIDF9LCAgICAvKiAgNTogIHllbGxvdyAqLwogICAgeyAgMCwgICAwLCAyNTV9LCAgICAvKiAgNjogIGJsdWUgKi8KICAgIHsgIDAsICAgMCwgMTIwfSwgICAgLyogIDc6ICBtZWRpdW0gYmx1ZSAqLwogICAgezI1NSwgICAwLCAyNTV9LCAgICAvKiAgODogIG1hZ2VudGEgKi8KICAgIHsgNjQsICAgMCwgIDY0fSwgICAgLyogIDk6ICBkYXJrIG1hZ2VudGEgKi8KICAgIHsyNTUsICAgMCwgICAwfSwgICAgLyogMTA6ICByZWQgKi8KICAgIHsgNjQsICAgMCwgICAwfSwgICAgLyogMTE6ICBkYXJrIHJlZCAqLwogICAgezI1NSwgMTI3LCAgIDB9LCAgICAvKiAxMjogIG9yYW5nZSAqLwogICAgezE5MiwgIDk2LCAgIDB9LCAgICAvKiAxMzogIGRhcmtlciBvcmFuZ2UgKi8KICAgIHsgMjQsICA2MCwgICAwfSwgICAgLyogMTQ6ICBkYXJrIGdyZWVuLXllbGxvdyAqLwogICAgeyA4NSwgMTI1LCAyMDB9LCAgICAvKiAxNTogIGljZSBibHVlICovCiAgICB7MTkyLCAxOTIsIDE5Mn0gICAgIC8qIDE2OiAgTmV0c2NhcGUvTW9zYWljIGdyYXkgKi8KfTsKLyogbm90IHVzZWQgZm9yIG5vdywgYnV0IHNob3VsZCBiZSBmb3IgZXJyb3ItY2hlY2tpbmc6CnN0YXRpYyBpbnQgbnVtX3JnYiA9IHNpemVvZihyZ2IpIC8gc2l6ZW9mKHN0cnVjdCByZ2JfY29sb3IpOwogKi8KCi8qCiAgICBUaGlzIHdob2xlIHN0cnVjdCBpcyBhIGZhaXJseSBjaGVlc3kgd2F5IHRvIGtlZXAgdGhlIG51bWJlciBvZgogICAgY29tbWFuZC1saW5lIG9wdGlvbnMgdG8gYSBtaW5pbXVtLiAgVGhlIHJhZGlhbC13YXZlcyBiYWNrZ3JvdW5kCiAgICB0eXBlIGlzIGEgcGFydGljdWxhcmx5IHBvb3IgZml0IHRvIHRoZSBpbnRlZ2VyIGVsZW1lbnRzIG9mIHRoZQogICAgc3RydWN0Li4uYnV0IGEgZmV3IG1hY3JvcyBhbmQgYSBsaXR0bGUgZml4ZWQtcG9pbnQgbWF0aCB3aWxsIGRvCiAgICB3b25kZXJzIGZvciB5YS4KCiAgICB0eXBlIGJpdHM6CiAgICAgICBGIEUgRCBDIEIgQSA5IDggNyA2IDUgNCAzIDIgMSAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwgfCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8ICstKy0rLS0gMCA9IHNoYXJwLWVkZ2VkIGNoZWNrZXJib2FyZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCAgICAgICAgIDEgPSBzb2Z0IGRpYW1vbmRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8ICAgICAgICAgMiA9IHJhZGlhbCB3YXZlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCAgICAgICAzLTcgPSB1bmRlZmluZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICstLSBncmFkaWVudCAjMiBpbnZlcnRlZD8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0gYWx0ZXJuYXRpbmcgY29sdW1ucyBpbnZlcnRlZD8KICovCnN0YXRpYyBzdHJ1Y3QgYmFja2dyb3VuZF9wYXR0ZXJuIHsKICAgIHVzaCB0eXBlOwogICAgaW50IHJnYjFfbWF4LCByZ2IxX21pbjsgICAgIC8qIG9yIGJnX2ZyZXEsIGJnX2dyYXkgKi8KICAgIGludCByZ2IyX21heCwgcmdiMl9taW47ICAgICAvKiBvciBiZ19ic2F0LCBiZ19icm90IChib3RoIHNjYWxlZCBieSAxMCkqLwp9IGJnW10gPSB7CiAgICB7MCwgICAgIDEsMSwgMTYsMTZ9LCAgICAgICAgLyogY2hlY2tlcmVkOiAgd2hpdGUgdnMuIGxpZ2h0IGdyYXkgKGJhc2ljKSAqLwogICAgezArOCwgICAyLDAsICAxLDE1fSwgICAgICAgIC8qIGNoZWNrZXJlZDogIHRhbi9ibGFjayB2cy4gd2hpdGUvaWNlIGJsdWUgKi8KICAgIHswKzI0LCAgMiwwLCAgMSwwfSwgICAgICAgICAvKiBjaGVja2VyZWQ6ICB0YW4vYmxhY2sgdnMuIHdoaXRlL2JsYWNrICovCiAgICB7MCs4LCAgIDQsNSwgIDAsMn0sICAgICAgICAgLyogY2hlY2tlcmVkOiAgZ29sZC95ZWxsb3cgdnMuIGJsYWNrL3RhbiAqLwogICAgezArOCwgICA0LDUsICAwLDZ9LCAgICAgICAgIC8qIGNoZWNrZXJlZDogIGdvbGQveWVsbG93IHZzLiBibGFjay9ibHVlICovCiAgICB7MCwgICAgIDcsMCwgIDgsOX0sICAgICAgICAgLyogY2hlY2tlcmVkOiAgZGVlcCBibHVlL2JsYWNrIHZzLiBtYWdlbnRhICovCiAgICB7MCs4LCAgMTMsMCwgIDUsMTR9LCAgICAgICAgLyogY2hlY2tlcmVkOiAgb3JhbmdlL2JsYWNrIHZzLiB5ZWxsb3cgKi8KICAgIHswKzgsICAxMiwwLCAxMCwxMX0sICAgICAgICAvKiBjaGVja2VyZWQ6ICBvcmFuZ2UvYmxhY2sgdnMuIHJlZCAqLwogICAgezEsICAgICA3LDAsICA4LDB9LCAgICAgICAgIC8qIGRpYW1vbmRzOiAgZGVlcCBibHVlL2JsYWNrIHZzLiBtYWdlbnRhICovCiAgICB7MSwgICAgMTIsMCwgMTEsMH0sICAgICAgICAgLyogZGlhbW9uZHM6ICBvcmFuZ2UgdnMuIGRhcmsgcmVkICovCiAgICB7MSwgICAgMTAsMCwgIDcsMH0sICAgICAgICAgLyogZGlhbW9uZHM6ICByZWQgdnMuIG1lZGl1bSBibHVlICovCiAgICB7MSwgICAgIDQsMCwgIDUsMH0sICAgICAgICAgLyogZGlhbW9uZHM6ICBnb2xkIHZzLiB5ZWxsb3cgKi8KICAgIHsxLCAgICAgMywwLCAgMCwwfSwgICAgICAgICAvKiBkaWFtb25kczogIG1lZGl1bSBncmVlbiB2cy4gYmxhY2sgKi8KICAgIHsyLCAgICAxNiwgMTAwLCAgMjAsICAgMH0sICAvKiByYWRpYWw6ICB+aGFyZCByYWRpYWwgY29sb3ItYmVhbXMgKi8KICAgIHsyLCAgICAxOCwgMTAwLCAgMTAsICAgMn0sICAvKiByYWRpYWw6ICBzb2Z0LCBjdXJ2ZWQgcmFkaWFsIGNvbG9yLWJlYW1zICovCiAgICB7MiwgICAgMTYsIDI1NiwgMTAwLCAyNTB9LCAgLyogcmFkaWFsOiAgdmVyeSB0aWdodCBzcGlyYWwgKi8KICAgIHsyLCAxMDAwMCwgMjU2LCAgMTEsICAgMH0gICAvKiByYWRpYWw6ICBkaXBvbGUtbW9pcmUnIChhbG1vc3QgZnJhY3RhbCkgKi8KfTsKc3RhdGljIGludCBudW1fYmdwYXQgPSBzaXplb2YoYmcpIC8gc2l6ZW9mKHN0cnVjdCBiYWNrZ3JvdW5kX3BhdHRlcm4pOwoKCi8qIFgtc3BlY2lmaWMgdmFyaWFibGVzICovCnN0YXRpYyBjaGFyICpkaXNwbGF5bmFtZTsKc3RhdGljIFhJbWFnZSAqeGltYWdlOwpzdGF0aWMgRGlzcGxheSAqZGlzcGxheTsKc3RhdGljIGludCBkZXB0aDsKc3RhdGljIFZpc3VhbCAqdmlzdWFsOwpzdGF0aWMgWFZpc3VhbEluZm8gKnZpc3VhbF9saXN0OwpzdGF0aWMgaW50IFJTaGlmdCwgR1NoaWZ0LCBCU2hpZnQ7CnN0YXRpYyB1bGcgUk1hc2ssIEdNYXNrLCBCTWFzazsKc3RhdGljIFdpbmRvdyB3aW5kb3c7CnN0YXRpYyBHQyBnYzsKc3RhdGljIENvbG9ybWFwIGNvbG9ybWFwOwoKc3RhdGljIGludCBoYXZlX25vbmRlZmF1bHRfdmlzdWFsID0gRkFMU0U7CnN0YXRpYyBpbnQgaGF2ZV9jb2xvcm1hcCA9IEZBTFNFOwpzdGF0aWMgaW50IGhhdmVfd2luZG93ID0gRkFMU0U7CnN0YXRpYyBpbnQgaGF2ZV9nYyA9IEZBTFNFOwoKCgoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7CiNpZmRlZiBzZ2kKICAgIGNoYXIgdG1wbGluZVs4MF07CiNlbmRpZgogICAgY2hhciAqcCwgKmJnc3RyID0gTlVMTDsKICAgIGludCByYywgYWxlbiwgZmxlbjsKICAgIGludCBlcnJvciA9IDA7CiAgICBpbnQgdGltaW5nID0gRkFMU0U7CiAgICBpbnQgaGF2ZV9iZyA9IEZBTFNFOwojaWZkZWYgRkVBVFVSRV9MT09QCiAgICBpbnQgbG9vcCA9IEZBTFNFOwogICAgbG9uZyBsb29wX2ludGVydmFsID0gLTE7ICAgICAgICAgICAgLyogc2Vjb25kcyAoMTAwLDAwMCBtYXgpICovCiNlbmRpZgogICAgZG91YmxlIExVVF9leHBvbmVudDsgICAgICAgICAgICAgICAgLyoganVzdCB0aGUgbG9va3VwIHRhYmxlICovCiAgICBkb3VibGUgQ1JUX2V4cG9uZW50ID0gMi4yOyAgICAgICAgICAvKiBqdXN0IHRoZSBtb25pdG9yICovCiAgICBkb3VibGUgZGVmYXVsdF9kaXNwbGF5X2V4cG9uZW50OyAgICAvKiB3aG9sZSBkaXNwbGF5IHN5c3RlbSAqLwogICAgWEV2ZW50IGU7CiAgICBLZXlTeW0gazsKCgogICAgLyogRmlyc3QgaW5pdGlhbGl6ZSBhIGZldyB0aGluZ3MsIGp1c3QgdG8gYmUgc3VyZS0tbWVtc2V0IHRha2VzIGNhcmUgb2YKICAgICAqIGRlZmF1bHQgYmFja2dyb3VuZCBjb2xvciAoYmxhY2spLCBib29sZWFucyAoRkFMU0UpLCBwb2ludGVycyAoTlVMTCksCiAgICAgKiBldGMuICovCgogICAgZGlzcGxheW5hbWUgPSAoY2hhciAqKU5VTEw7CiAgICBmaWxlbmFtZSA9IChjaGFyICopTlVMTDsKICAgIG1lbXNldCgmcnBuZzJfaW5mbywgMCwgc2l6ZW9mKG1haW5wcm9nX2luZm8pKTsKCgogICAgLyogU2V0IHRoZSBkZWZhdWx0IHZhbHVlIGZvciBvdXIgZGlzcGxheS1zeXN0ZW0gZXhwb25lbnQsIGkuZS4sIHRoZQogICAgICogcHJvZHVjdCBvZiB0aGUgQ1JUIGV4cG9uZW50IGFuZCB0aGUgZXhwb25lbnQgY29ycmVzcG9uZGluZyB0bwogICAgICogdGhlIGZyYW1lLWJ1ZmZlcidzIGxvb2t1cCB0YWJsZSAoTFVUKSwgaWYgYW55LiAgVGhpcyBpcyBub3QgYW4KICAgICAqIGV4aGF1c3RpdmUgbGlzdCBvZiBMVVQgdmFsdWVzIChlLmcuLCBPcGVuU3RlcCBoYXMgYSBsb3Qgb2Ygd2VpcmQKICAgICAqIG9uZXMpLCBidXQgaXQgc2hvdWxkIGNvdmVyIDk5JSBvZiB0aGUgY3VycmVudCBwb3NzaWJpbGl0aWVzLiAqLwoKI2lmIGRlZmluZWQoTmVYVCkKICAgIC8qIHRoaXJkLXBhcnR5IHV0aWxpdGllcyBjYW4gbW9kaWZ5IHRoZSBkZWZhdWx0IExVVCBleHBvbmVudCAqLwogICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gMi4yOwogICAgLyoKICAgIGlmIChzb21lX25leHRfZnVuY3Rpb25fdGhhdF9yZXR1cm5zX2dhbW1hKCZuZXh0X2dhbW1hKSkKICAgICAgICBMVVRfZXhwb25lbnQgPSAxLjAgLyBuZXh0X2dhbW1hOwogICAgICovCiNlbGlmIGRlZmluZWQoc2dpKQogICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gMS43OwogICAgLyogdGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGFueSBkb2N1bWVudGVkIGZ1bmN0aW9uIHRvCiAgICAgKiBnZXQgdGhlICJnYW1tYSIgdmFsdWUsIHNvIHdlIGRvIGl0IHRoZSBoYXJkIHdheSAqLwogICAgaW5maWxlID0gZm9wZW4oIi9ldGMvY29uZmlnL3N5c3RlbS5nbEdhbW1hVmFsIiwgInIiKTsKICAgIGlmIChpbmZpbGUpIHsKICAgICAgICBkb3VibGUgc2dpX2dhbW1hOwoKICAgICAgICBmZ2V0cyh0bXBsaW5lLCA4MCwgaW5maWxlKTsKICAgICAgICBmY2xvc2UoaW5maWxlKTsKICAgICAgICBzZ2lfZ2FtbWEgPSBhdG9mKHRtcGxpbmUpOwogICAgICAgIGlmIChzZ2lfZ2FtbWEgPiAwLjApCiAgICAgICAgICAgIExVVF9leHBvbmVudCA9IDEuMCAvIHNnaV9nYW1tYTsKICAgIH0KI2VsaWYgZGVmaW5lZChNYWNpbnRvc2gpCiAgICBMVVRfZXhwb25lbnQgPSAxLjggLyAyLjYxOwogICAgLyoKICAgIGlmIChzb21lX21hY19mdW5jdGlvbl90aGF0X3JldHVybnNfZ2FtbWEoJm1hY19nYW1tYSkpCiAgICAgICAgTFVUX2V4cG9uZW50ID0gbWFjX2dhbW1hIC8gMi42MTsKICAgICAqLwojZWxzZQogICAgTFVUX2V4cG9uZW50ID0gMS4wOyAgIC8qIGFzc3VtZSBubyBMVVQ6ICBtb3N0IFBDcyAqLwojZW5kaWYKCiAgICAvKiB0aGUgZGVmYXVsdHMgYWJvdmUgZ2l2ZSAxLjAsIDEuMywgMS41IGFuZCAyLjIsIHJlc3BlY3RpdmVseTogKi8KICAgIGRlZmF1bHRfZGlzcGxheV9leHBvbmVudCA9IExVVF9leHBvbmVudCAqIENSVF9leHBvbmVudDsKCgogICAgLyogSWYgdGhlIHVzZXIgaGFzIHNldCB0aGUgU0NSRUVOX0dBTU1BIGVudmlyb25tZW50IHZhcmlhYmxlIGFzIHN1Z2dlc3RlZAogICAgICogKHNvbWV3aGF0IGltcHJlY2lzZWx5KSBpbiB0aGUgbGlicG5nIGRvY3VtZW50YXRpb24sIHVzZSB0aGF0OyBvdGhlcndpc2UKICAgICAqIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZSB3ZSBqdXN0IGNhbGN1bGF0ZWQuICBFaXRoZXIgd2F5LCB0aGUgdXNlciBtYXkKICAgICAqIG92ZXJyaWRlIHRoaXMgdmlhIGEgY29tbWFuZC1saW5lIG9wdGlvbi4gKi8KCiAgICBpZiAoKHAgPSBnZXRlbnYoIlNDUkVFTl9HQU1NQSIpKSAhPSBOVUxMKQogICAgICAgIHJwbmcyX2luZm8uZGlzcGxheV9leHBvbmVudCA9IGF0b2YocCk7CiAgICBlbHNlCiAgICAgICAgcnBuZzJfaW5mby5kaXNwbGF5X2V4cG9uZW50ID0gZGVmYXVsdF9kaXNwbGF5X2V4cG9uZW50OwoKCiAgICAvKiBOb3cgcGFyc2UgdGhlIGNvbW1hbmQgbGluZSBmb3Igb3B0aW9ucyBhbmQgdGhlIFBORyBmaWxlbmFtZS4gKi8KCiAgICB3aGlsZSAoKisrYXJndiAmJiAhZXJyb3IpIHsKICAgICAgICBpZiAoIXN0cm5jbXAoKmFyZ3YsICItZGlzcGxheSIsIDIpKSB7CiAgICAgICAgICAgIGlmICghKisrYXJndikKICAgICAgICAgICAgICAgICsrZXJyb3I7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGRpc3BsYXluYW1lID0gKmFyZ3Y7CiAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcCgqYXJndiwgIi1nYW1tYSIsIDIpKSB7CiAgICAgICAgICAgIGlmICghKisrYXJndikKICAgICAgICAgICAgICAgICsrZXJyb3I7CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcnBuZzJfaW5mby5kaXNwbGF5X2V4cG9uZW50ID0gYXRvZigqYXJndik7CiAgICAgICAgICAgICAgICBpZiAocnBuZzJfaW5mby5kaXNwbGF5X2V4cG9uZW50IDw9IDAuMCkKICAgICAgICAgICAgICAgICAgICArK2Vycm9yOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcCgqYXJndiwgIi1iZ2NvbG9yIiwgNCkpIHsKICAgICAgICAgICAgaWYgKCEqKythcmd2KQogICAgICAgICAgICAgICAgKytlcnJvcjsKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBiZ3N0ciA9ICphcmd2OwogICAgICAgICAgICAgICAgaWYgKHN0cmxlbihiZ3N0cikgIT0gNyB8fCBiZ3N0clswXSAhPSAnIycpCiAgICAgICAgICAgICAgICAgICAgKytlcnJvcjsKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGhhdmVfYmcgPSBUUlVFOwogICAgICAgICAgICAgICAgICAgIGJnX2ltYWdlID0gRkFMU0U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKCphcmd2LCAiLWJncGF0IiwgNCkpIHsKICAgICAgICAgICAgaWYgKCEqKythcmd2KQogICAgICAgICAgICAgICAgKytlcnJvcjsKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBwYXQgPSBhdG9pKCphcmd2KTsKICAgICAgICAgICAgICAgIGlmIChwYXQgPj0gMCAmJiBwYXQgPCBudW1fYmdwYXQpIHsKICAgICAgICAgICAgICAgICAgICBiZ19pbWFnZSA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgaGF2ZV9iZyA9IEZBTFNFOwogICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgKytlcnJvcjsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoKmFyZ3YsICItdXNsZWVwIiwgMikpIHsKICAgICAgICAgICAgaWYgKCEqKythcmd2KQogICAgICAgICAgICAgICAgKytlcnJvcjsKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB1c2xlZXBfZHVyYXRpb24gPSAodWxnKWF0b2woKmFyZ3YpOwogICAgICAgICAgICAgICAgZGVtb190aW1pbmcgPSBUUlVFOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcCgqYXJndiwgIi1wYXVzZSIsIDIpKSB7CiAgICAgICAgICAgIHBhdXNlX2FmdGVyX3Bhc3MgPSBUUlVFOwogICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoKmFyZ3YsICItdGltaW5nIiwgMikpIHsKICAgICAgICAgICAgdGltaW5nID0gVFJVRTsKI2lmZGVmIEZFQVRVUkVfTE9PUAogICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoKmFyZ3YsICItbG9vcCIsIDIpKSB7CiAgICAgICAgICAgIGxvb3AgPSBUUlVFOwogICAgICAgICAgICBpZiAoIWFyZ3ZbMV0gfHwgIWlzX251bWJlcihhcmd2WzFdKSkKICAgICAgICAgICAgICAgIGxvb3BfaW50ZXJ2YWwgPSAyOwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICsrYXJndjsKICAgICAgICAgICAgICAgIGxvb3BfaW50ZXJ2YWwgPSBhdG9sKCphcmd2KTsKICAgICAgICAgICAgICAgIGlmIChsb29wX2ludGVydmFsIDwgMCkKICAgICAgICAgICAgICAgICAgICBsb29wX2ludGVydmFsID0gMjsKICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxvb3BfaW50ZXJ2YWwgPiAxMDAwMDApICAgLyogYml0IG1vcmUgdGhhbiBvbmUgZGF5ICovCiAgICAgICAgICAgICAgICAgICAgbG9vcF9pbnRlcnZhbCA9IDEwMDAwMDsKICAgICAgICAgICAgfQojZW5kaWYKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoKiphcmd2ICE9ICctJykgewogICAgICAgICAgICAgICAgZmlsZW5hbWUgPSAqYXJndjsKICAgICAgICAgICAgICAgIGlmIChhcmd2WzFdKSAgIC8qIHNob3VsZG4ndCBiZSBhbnkgbW9yZSBhcmdzIGFmdGVyIGZpbGVuYW1lICovCiAgICAgICAgICAgICAgICAgICAgKytlcnJvcjsKICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICArK2Vycm9yOyAgIC8qIG5vdCBleHBlY3RpbmcgYW55IG90aGVyIG9wdGlvbnMgKi8KICAgICAgICB9CiAgICB9CgogICAgaWYgKCFmaWxlbmFtZSkKICAgICAgICArK2Vycm9yOwoKCiAgICAvKiBwcmludCB1c2FnZSBzY3JlZW4gaWYgYW55IGVycm9ycyB1cCB0byB0aGlzIHBvaW50ICovCgogICAgaWYgKGVycm9yKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiVzICVzOiAgJXNcblxuIiwgUFJPR05BTUUsIFZFUlNJT04sIGFwcG5hbWUpOwogICAgICAgIHJlYWRwbmcyX3ZlcnNpb25faW5mbygpOwogICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4iCiAgICAgICAgICAiVXNhZ2U6ICAlcyBbLWRpc3BsYXkgeGRweV0gWy1nYW1tYSBleHBdIFstYmdjb2xvciBiZyB8IC1iZ3BhdCBwYXRdXG4iCiNpZmRlZiBGRUFUVVJFX0xPT1AKICAgICAgICAgICIgICAgICAgICUqcyBbLXVzbGVlcCBkdXIgfCAtdGltaW5nXSBbLXBhdXNlXSBbLWxvb3AgW3NlY11dIGZpbGUucG5nXG5cbiIKI2Vsc2UKICAgICAgICAgICIgICAgICAgICUqcyBbLXVzbGVlcCBkdXIgfCAtdGltaW5nXSBbLXBhdXNlXSBmaWxlLnBuZ1xuXG4iCiNlbmRpZgogICAgICAgICAgIiAgICB4ZHB5XHRuYW1lIG9mIHRoZSB0YXJnZXQgWCBkaXNwbGF5IChlLmcuLCBgYGhvc3RuYW1lOjAnJylcbiIKICAgICAgICAgICIgICAgZXhwIFx0dHJhbnNmZXItZnVuY3Rpb24gZXhwb25lbnQgKGBgZ2FtbWEnJykgb2YgdGhlIGRpc3BsYXlcbiIKICAgICAgICAgICJcdFx0ICBzeXN0ZW0gaW4gZmxvYXRpbmctcG9pbnQgZm9ybWF0IChlLmcuLCBgYCUuMWYnJyk7IGVxdWFsXG4iCiAgICAgICAgICAiXHRcdCAgdG8gdGhlIHByb2R1Y3Qgb2YgdGhlIGxvb2t1cC10YWJsZSBleHBvbmVudCAodmFyaWVzKVxuIgogICAgICAgICAgIlx0XHQgIGFuZCB0aGUgQ1JUIGV4cG9uZW50ICh1c3VhbGx5IDIuMik7IG11c3QgYmUgcG9zaXRpdmVcbiIKICAgICAgICAgICIgICAgYmcgIFx0ZGVzaXJlZCBiYWNrZ3JvdW5kIGNvbG9yIGluIDctY2hhcmFjdGVyIGhleCBSR0IgZm9ybWF0XG4iCiAgICAgICAgICAiXHRcdCAgKGUuZy4sIGBgI2ZmNzcwMCcnIGZvciBvcmFuZ2U6ICBzYW1lIGFzIEhUTUwgY29sb3JzKTtcbiIKICAgICAgICAgICJcdFx0ICB1c2VkIHdpdGggdHJhbnNwYXJlbnQgaW1hZ2VzOyBvdmVycmlkZXMgLWJncGF0XG4iCiAgICAgICAgICAiICAgIHBhdCBcdGRlc2lyZWQgYmFja2dyb3VuZCBwYXR0ZXJuIG51bWJlciAoMC0lZCk7IHVzZWQgd2l0aFxuIgogICAgICAgICAgIlx0XHQgIHRyYW5zcGFyZW50IGltYWdlczsgb3ZlcnJpZGVzIC1iZ2NvbG9yXG4iCiNpZmRlZiBGRUFUVVJFX0xPT1AKICAgICAgICAgICIgICAgLWxvb3BcdGxvb3BzIHRocm91Z2ggYmFja2dyb3VuZCBpbWFnZXMgYWZ0ZXIgaW5pdGlhbCBkaXNwbGF5XG4iCiAgICAgICAgICAiXHRcdCAgaXMgY29tcGxldGUgKGRlcGVuZHMgb24gLWJncGF0KVxuIgogICAgICAgICAgIiAgICBzZWMgXHRzZWNvbmRzIHRvIGRpc3BsYXkgZWFjaCBiYWNrZ3JvdW5kIGltYWdlIChkZWZhdWx0ID0gMilcbiIKI2VuZGlmCiAgICAgICAgICAiICAgIGR1ciBcdGR1cmF0aW9uIGluIG1pY3Jvc2Vjb25kcyB0byB3YWl0IGFmdGVyIGRpc3BsYXlpbmcgZWFjaFxuIgogICAgICAgICAgIlx0XHQgIHJvdyAoZm9yIGRlbW8gcHVycG9zZXMpXG4iCiAgICAgICAgICAiICAgIC10aW1pbmdcdGVuYWJsZXMgZGVsYXkgZm9yIGV2ZXJ5IGJsb2NrIHJlYWQsIHRvIHNpbXVsYXRlIG1vZGVtXG4iCiAgICAgICAgICAiXHRcdCAgZG93bmxvYWQgb2YgaW1hZ2UgKH4zNiBLYnBzKVxuIgogICAgICAgICAgIiAgICAtcGF1c2VcdHBhdXNlcyBhZnRlciBkaXNwbGF5aW5nIGVhY2ggcGFzcyB1bnRpbCBtb3VzZSBjbGlja2VkXG4iCiAgICAgICAgICAiXG5QcmVzcyBRLCBFc2Mgb3IgbW91c2UgYnV0dG9uIDEgKHdpdGhpbiBpbWFnZSB3aW5kb3csIGFmdGVyIGltYWdlXG4iCiAgICAgICAgICAiaXMgZGlzcGxheWVkKSB0byBxdWl0LlxuIgogICAgICAgICAgIlxuIiwgUFJPR05BTUUsCiAgICAgICAgICAoaW50KXN0cmxlbihQUk9HTkFNRSksICIgIiwgZGVmYXVsdF9kaXNwbGF5X2V4cG9uZW50LCBudW1fYmdwYXQtMSk7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KCgogICAgaWYgKCEoaW5maWxlID0gZm9wZW4oZmlsZW5hbWUsICJyYiIpKSkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgY2FuJ3Qgb3BlbiBQTkcgZmlsZSBbJXNdXG4iLCBmaWxlbmFtZSk7CiAgICAgICAgKytlcnJvcjsKICAgIH0gZWxzZSB7CiAgICAgICAgaW5jb3VudCA9IGZyZWFkKGluYnVmLCAxLCBJTkJVRlNJWkUsIGluZmlsZSk7CiAgICAgICAgaWYgKGluY291bnQgPCA4IHx8ICFyZWFkcG5nMl9jaGVja19zaWcoaW5idWYsIDgpKSB7CiAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQogICAgICAgICAgICAgICI6ICBbJXNdIGlzIG5vdCBhIFBORyBmaWxlOiBpbmNvcnJlY3Qgc2lnbmF0dXJlXG4iLAogICAgICAgICAgICAgIGZpbGVuYW1lKTsKICAgICAgICAgICAgKytlcnJvcjsKICAgICAgICB9IGVsc2UgaWYgKChyYyA9IHJlYWRwbmcyX2luaXQoJnJwbmcyX2luZm8pKSAhPSAwKSB7CiAgICAgICAgICAgIHN3aXRjaCAocmMpIHsKICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKICAgICAgICAgICAgICAgICAgICAgICI6ICBbJXNdIGhhcyBiYWQgSUhEUiAobGlicG5nIGxvbmdqbXApXG4iLCBmaWxlbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBpbnN1ZmZpY2llbnQgbWVtb3J5XG4iKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCiAgICAgICAgICAgICAgICAgICAgICAiOiAgdW5rbm93biByZWFkcG5nMl9pbml0KCkgZXJyb3JcbiIpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgICsrZXJyb3I7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgVHJhY2UoKHN0ZGVyciwgImFib3V0IHRvIGNhbGwgWE9wZW5EaXNwbGF5KClcbiIpKQogICAgICAgICAgICBkaXNwbGF5ID0gWE9wZW5EaXNwbGF5KGRpc3BsYXluYW1lKTsKICAgICAgICAgICAgaWYgKCFkaXNwbGF5KSB7CiAgICAgICAgICAgICAgICByZWFkcG5nMl9jbGVhbnVwKCZycG5nMl9pbmZvKTsKICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgY2FuJ3Qgb3BlbiBYIGRpc3BsYXkgWyVzXVxuIiwKICAgICAgICAgICAgICAgICAgZGlzcGxheW5hbWU/IGRpc3BsYXluYW1lIDogImRlZmF1bHQiKTsKICAgICAgICAgICAgICAgICsrZXJyb3I7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGVycm9yKQogICAgICAgICAgICBmY2xvc2UoaW5maWxlKTsKICAgIH0KCgogICAgaWYgKGVycm9yKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBhYm9ydGluZy5cbiIpOwogICAgICAgIGV4aXQoMik7CiAgICB9CgoKICAgIC8qIHNldCB0aGUgdGl0bGUtYmFyIHN0cmluZywgYnV0IG1ha2Ugc3VyZSBidWZmZXIgZG9lc24ndCBvdmVyZmxvdyAqLwoKICAgIGFsZW4gPSBzdHJsZW4oYXBwbmFtZSk7CiAgICBmbGVuID0gc3RybGVuKGZpbGVuYW1lKTsKICAgIGlmIChhbGVuICsgZmxlbiArIDMgPiAxMDIzKQogICAgICAgIHNwcmludGYodGl0bGViYXIsICIlczogIC4uLiVzIiwgYXBwbmFtZSwgZmlsZW5hbWUrKGFsZW4rZmxlbis2LTEwMjMpKTsKICAgIGVsc2UKICAgICAgICBzcHJpbnRmKHRpdGxlYmFyLCAiJXM6ICAlcyIsIGFwcG5hbWUsIGZpbGVuYW1lKTsKCgogICAgLyogc2V0IHNvbWUgZmluYWwgcnBuZzJfaW5mbyB2YXJpYWJsZXMgYmVmb3JlIGVudGVyaW5nIG1haW4gZGF0YSBsb29wICovCgogICAgaWYgKGhhdmVfYmcpIHsKICAgICAgICB1bnNpZ25lZCByLCBnLCBiOyAgIC8qIHRoaXMgYXBwcm9hY2ggcXVpZXRzIGNvbXBpbGVyIHdhcm5pbmdzICovCgogICAgICAgIHNzY2FuZihiZ3N0cisxLCAiJTJ4JTJ4JTJ4IiwgJnIsICZnLCAmYik7CiAgICAgICAgcnBuZzJfaW5mby5iZ19yZWQgICA9ICh1Y2gpcjsKICAgICAgICBycG5nMl9pbmZvLmJnX2dyZWVuID0gKHVjaClnOwogICAgICAgIHJwbmcyX2luZm8uYmdfYmx1ZSAgPSAodWNoKWI7CiAgICB9IGVsc2UKICAgICAgICBycG5nMl9pbmZvLm5lZWRfYmdjb2xvciA9IFRSVUU7CgogICAgcnBuZzJfaW5mby5zdGF0ZSA9IGtQcmVJbml0OwogICAgcnBuZzJfaW5mby5tYWlucHJvZ19pbml0ID0gcnBuZzJfeF9pbml0OwogICAgcnBuZzJfaW5mby5tYWlucHJvZ19kaXNwbGF5X3JvdyA9IHJwbmcyX3hfZGlzcGxheV9yb3c7CiAgICBycG5nMl9pbmZvLm1haW5wcm9nX2ZpbmlzaF9kaXNwbGF5ID0gcnBuZzJfeF9maW5pc2hfZGlzcGxheTsKCgogICAgLyogT0ssIHRoaXMgaXMgdGhlIGZ1biBwYXJ0OiAgY2FsbCByZWFkcG5nMl9kZWNvZGVfZGF0YSgpIGF0IHRoZSBzdGFydCBvZgogICAgICogdGhlIGxvb3AgdG8gZGVhbCB3aXRoIG91ciBmaXJzdCBidWZmZXIgb2YgZGF0YSAocmVhZCBpbiBhYm92ZSB0byB2ZXJpZnkKICAgICAqIHRoYXQgdGhlIGZpbGUgaXMgYSBQTkcgaW1hZ2UpLCB0aGVuIGxvb3AgdGhyb3VnaCB0aGUgZmlsZSBhbmQgY29udGludWUKICAgICAqIGNhbGxpbmcgdGhlIHNhbWUgcm91dGluZSB0byBoYW5kbGUgZWFjaCBjaHVuayBvZiBkYXRhLiAgSXQgaW4gdHVybgogICAgICogcGFzc2VzIHRoZSBkYXRhIHRvIGxpYnBuZywgd2hpY2ggd2lsbCBpbnZva2Ugb25lIG9yIG1vcmUgb2Ygb3VyIGNhbGwtCiAgICAgKiBiYWNrcyBhcyBkZWNvZGVkIGRhdGEgYmVjb21lIGF2YWlsYWJsZS4gIFdlIG9wdGlvbmFsbHkgY2FsbCBzbGVlcCgpIGZvcgogICAgICogb25lIHNlY29uZCBwZXIgaXRlcmF0aW9uIHRvIHNpbXVsYXRlIGRvd25sb2FkaW5nIHRoZSBpbWFnZSB2aWEgYW4gYW5hbG9nCiAgICAgKiBtb2RlbS4gKi8KCiAgICBmb3IgKDs7KSB7CiAgICAgICAgVHJhY2UoKHN0ZGVyciwgImFib3V0IHRvIGNhbGwgcmVhZHBuZzJfZGVjb2RlX2RhdGEoKVxuIikpCiAgICAgICAgaWYgKHJlYWRwbmcyX2RlY29kZV9kYXRhKCZycG5nMl9pbmZvLCBpbmJ1ZiwgaW5jb3VudCkpCiAgICAgICAgICAgICsrZXJyb3I7CiAgICAgICAgVHJhY2UoKHN0ZGVyciwgImRvbmUgd2l0aCByZWFkcG5nMl9kZWNvZGVfZGF0YSgpXG4iKSkKCiAgICAgICAgaWYgKGVycm9yIHx8IGluY291bnQgIT0gSU5CVUZTSVpFIHx8IHJwbmcyX2luZm8uc3RhdGUgPT0ga0RvbmUpIHsKICAgICAgICAgICAgaWYgKHJwbmcyX2luZm8uc3RhdGUgPT0ga0RvbmUpIHsKICAgICAgICAgICAgICAgIFRyYWNlKChzdGRlcnIsICJkb25lIGRlY29kaW5nIFBORyBpbWFnZVxuIikpCiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmVycm9yKGluZmlsZSkpIHsKICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQogICAgICAgICAgICAgICAgICAiOiAgZXJyb3Igd2hpbGUgcmVhZGluZyBQTkcgaW1hZ2UgZmlsZVxuIik7CiAgICAgICAgICAgICAgICBleGl0KDMpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGZlb2YoaW5maWxlKSkgewogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBlbmQgb2YgZmlsZSByZWFjaGVkICIKICAgICAgICAgICAgICAgICAgIih1bmV4cGVjdGVkbHkpIHdoaWxlIHJlYWRpbmcgUE5HIGltYWdlIGZpbGVcbiIpOwogICAgICAgICAgICAgICAgZXhpdCgzKTsKICAgICAgICAgICAgfSBlbHNlIC8qIGlmIChlcnJvcikgKi8gewogICAgICAgICAgICAgICAgLyogd2lsbCBwcmludCBlcnJvciBtZXNzYWdlIGJlbG93ICovCiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBpZiAodGltaW5nKQogICAgICAgICAgICBzbGVlcCgxKTsKCiAgICAgICAgaW5jb3VudCA9IGZyZWFkKGluYnVmLCAxLCBJTkJVRlNJWkUsIGluZmlsZSk7CiAgICB9CgoKICAgIC8qIGNsZWFuIHVwIFBORyBzdHVmZiBhbmQgcmVwb3J0IGFueSBkZWNvZGluZyBlcnJvcnMgKi8KCiAgICBmY2xvc2UoaW5maWxlKTsKICAgIFRyYWNlKChzdGRlcnIsICJhYm91dCB0byBjYWxsIHJlYWRwbmcyX2NsZWFudXAoKVxuIikpCiAgICByZWFkcG5nMl9jbGVhbnVwKCZycG5nMl9pbmZvKTsKCiAgICBpZiAoZXJyb3IpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGxpYnBuZyBlcnJvciB3aGlsZSBkZWNvZGluZyBQTkcgaW1hZ2VcbiIpOwogICAgICAgIGV4aXQoMyk7CiAgICB9CgoKI2lmZGVmIEZFQVRVUkVfTE9PUAoKICAgIGlmIChsb29wICYmIGJnX2ltYWdlKSB7CiAgICAgICAgVHJhY2UoKHN0ZGVyciwgImVudGVyaW5nIC1sb29wIGxvb3AgKEZFQVRVUkVfTE9PUClcbiIpKQogICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgaW50IGksIHVzZV9zbGVlcDsKICAgICAgICAgICAgc3RydWN0IHRpbWV2YWwgbm93LCB0aGVuOwoKICAgICAgICAgICAgLyogZ2V0IGN1cnJlbnQgdGltZSBhbmQgYWRkIGxvb3BfaW50ZXJ2YWwgdG8gZ2V0IHRhcmdldCB0aW1lICovCiAgICAgICAgICAgIGlmIChnZXR0aW1lb2ZkYXkoJnRoZW4sIE5VTEwpID09IDApIHsKICAgICAgICAgICAgICAgIHRoZW4udHZfc2VjICs9IGxvb3BfaW50ZXJ2YWw7CiAgICAgICAgICAgICAgICB1c2Vfc2xlZXAgPSBGQUxTRTsKICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICB1c2Vfc2xlZXAgPSBUUlVFOwoKICAgICAgICAgICAgLyogZG8gcXVpY2sgY2hlY2sgZm9yIGEgcXVpdCBldmVudCBidXQgZG9uJ3Qgd2FpdCBmb3IgaXQgKi8KICAgICAgICAgICAgLyogR1JSIEJVRzogIHNob3VsZCBhbHNvIGNoZWNrIGZvciBFeHBvc2UgZXZlbnRzIGFuZCByZWRyYXcuLi4gKi8KICAgICAgICAgICAgaWYgKFhDaGVja01hc2tFdmVudChkaXNwbGF5LCBLZXlQcmVzc01hc2sgfCBCdXR0b25QcmVzc01hc2ssICZlKSkKICAgICAgICAgICAgICAgIGlmIChRVUlUKGUsaykpCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAvKiBnZW5lcmF0ZSBuZXh0IGJhY2tncm91bmQgaW1hZ2UgKi8KICAgICAgICAgICAgaWYgKCsrcGF0ID49IG51bV9iZ3BhdCkKICAgICAgICAgICAgICAgIHBhdCA9IDA7CiAgICAgICAgICAgIHJwbmcyX3hfcmVsb2FkX2JnX2ltYWdlKCk7CgogICAgICAgICAgICAvKiB3YWl0IGZvciB0aW1lb3V0LCB1c2luZyB3aGF0ZXZlciBtZWFucyBhcmUgYXZhaWxhYmxlICovCiAgICAgICAgICAgIGlmICh1c2Vfc2xlZXAgfHwgZ2V0dGltZW9mZGF5KCZub3csIE5VTEwpICE9IDApIHsKICAgICAgICAgICAgICAgIGZvciAoaSA9IGxvb3BfaW50ZXJ2YWw7ICBpID4gMDsgIC0taSkgewogICAgICAgICAgICAgICAgICAgIHNsZWVwKDEpOwogICAgICAgICAgICAgICAgICAgIC8qIEdSUiBCVUc6ICBhbHNvIG5lZWQgdG8gY2hlY2sgZm9yIEV4cG9zZSAoYW5kIHJlZHJhdyEpICovCiAgICAgICAgICAgICAgICAgICAgaWYgKFhDaGVja01hc2tFdmVudChkaXNwbGF5LCBLZXlQcmVzc01hc2sgfCBCdXR0b25QcmVzc01hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICZlKSAmJiBRVUlUKGUsaykpCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLyogWTIwMzggQlVHISAqLwogICAgICAgICAgICAgICAgaWYgKG5vdy50dl9zZWMgPCB0aGVuLnR2X3NlYyB8fAogICAgICAgICAgICAgICAgICAgIChub3cudHZfc2VjID09IHRoZW4udHZfc2VjICYmIG5vdy50dl91c2VjIDwgdGhlbi50dl91c2VjKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnQgcXVpdCA9IEZBTFNFOwogICAgICAgICAgICAgICAgICAgIGxvbmcgc2Vjb25kc190b19nbyA9IHRoZW4udHZfc2VjIC0gbm93LnR2X3NlYzsKICAgICAgICAgICAgICAgICAgICBsb25nIHVzbGVlcF91c2VjOwoKICAgICAgICAgICAgICAgICAgICAvKiBiYXNpY2FsbHkgY2hldyB1cCBtb3N0IG9mIHJlbWFpbmluZyBsb29wLWludGVydmFsIHdpdGgKICAgICAgICAgICAgICAgICAgICAgKiAgY2FsbHMgdG8gc2xlZXAoMSkgaW50ZXJsZWF2ZWQgd2l0aCBjaGVja3MgZm9yIHF1aXQKICAgICAgICAgICAgICAgICAgICAgKiAgZXZlbnRzLCBidXQgYWxzbyByZWNhbGMgdGltZS10by1nbyBwZXJpb2RpY2FsbHk7IHdoZW4KICAgICAgICAgICAgICAgICAgICAgKiAgZG9uZSwgY2xlYW4gdXAgYW55IHJlbWFpbmluZyB0aW1lIHdpdGggdXNsZWVwKCkgY2FsbAogICAgICAgICAgICAgICAgICAgICAqICAoY291bGQgYWxzbyB1c2UgU0lHQUxSTSwgYnV0IHNpZ25hbHMgYXJlIGEgcGFpbi4uLikgKi8KICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc2Vjb25kc190b19nby0tID4gMSkgewogICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vjb25kc19kb25lID0gMDsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IHNlY29uZHNfdG9fZ287ICBpID4gMCAmJiAhcXVpdDsgIC0taSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXAoMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHUlIgQlVHOiAgbmVlZCB0byBjaGVjayBmb3IgRXhwb3NlIGFuZCByZWRyYXcgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChYQ2hlY2tNYXNrRXZlbnQoZGlzcGxheSwgS2V5UHJlc3NNYXNrIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXR0b25QcmVzc01hc2ssICZlKSAmJiBRVUlUKGUsaykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVpdCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKytzZWNvbmRzX2RvbmUgPiAxMDAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgIC8qIHRpbWUgdG8gcmVkbyBzZWNvbmRzX3RvX2dvIG1lYXMuICovCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1aXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9LLCBtb3JlIHRoYW4gMTAwMCBzZWNvbmRzIHNpbmNlIGxhc3QgY2hlY2s6CiAgICAgICAgICAgICAgICAgICAgICAgICAqICBjb3JyZWN0IHRoZSB0aW1lLXRvLWdvIG1lYXN1cmVtZW50IGZvciBkcmlmdCAqLwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0dGltZW9mZGF5KCZub3csIE5VTEwpID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3cudHZfc2VjID49IHRoZW4udHZfc2VjKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kc190b19nbyA9IHRoZW4udHZfc2VjIC0gbm93LnR2X3NlYzsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICArK3NlY29uZHNfdG9fZ287ICAvKiByZXN0b3JlIHdoYXQgd2Ugc3VidHJhY3RlZCAqLwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAocXVpdCkKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgLyogYnJlYWtzIG91dGVyIGRvLWxvb3AsIHNraXBzIHJlZGlzcGxheSAqLwoKICAgICAgICAgICAgICAgICAgICAvKiBzaW5jZSBkaWZmZXJlbmNlIGJldHdlZW4gIm5vdyIgYW5kICJ0aGVuIiBpcyBhbHJlYWR5CiAgICAgICAgICAgICAgICAgICAgICogIGVhdGVuIHVwIHRvIHdpdGhpbiBhIGNvdXBsZSBvZiBzZWNvbmRzLCBkb24ndCBuZWVkIHRvCiAgICAgICAgICAgICAgICAgICAgICogIHdvcnJ5IGFib3V0IG92ZXJmbG93LS1idXQgbWlnaHQgaGF2ZSBvdmVyc2hvdCAobmVnLikgKi8KICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0dGltZW9mZGF5KCZub3csIE5VTEwpID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgdXNsZWVwX3VzZWMgPSAxMDAwMDAwTCoodGhlbi50dl9zZWMgLSBub3cudHZfc2VjKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbi50dl91c2VjIC0gbm93LnR2X3VzZWM7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2xlZXBfdXNlYyA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2xlZXAoKHVsZyl1c2xlZXBfdXNlYyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBjb21wb3NpdGUgaW1hZ2UgYWdhaW5zdCBuZXcgYmFja2dyb3VuZCBhbmQgZGlzcGxheSAobm90ZSB0aGF0CiAgICAgICAgICAgICAqICB3ZSBkbyBub3QgdGFrZSBpbnRvIGFjY291bnQgdGhlIHRpbWUgc3BlbnQgZG9pbmcgdGhpcy4uLikgKi8KICAgICAgICAgICAgcnBuZzJfeF9yZWRpc3BsYXlfaW1hZ2UgKDAsIDAsIHJwbmcyX2luZm8ud2lkdGgsIHJwbmcyX2luZm8uaGVpZ2h0KTsKICAgICAgICB9CgogICAgfSBlbHNlIC8qIEZBTEwgVEhST1VHSCBhbmQgZG8gdGhlIG5vcm1hbCB0aGluZyAqLwoKI2VuZGlmIC8qIEZFQVRVUkVfTE9PUCAqLwoKICAgIC8qIHdhaXQgZm9yIHRoZSB1c2VyIHRvIHRlbGwgdXMgd2hlbiB0byBxdWl0ICovCgogICAgaWYgKHJwbmcyX2luZm8uc3RhdGUgPj0ga1dpbmRvd0luaXQpIHsKICAgICAgICBUcmFjZSgoc3RkZXJyLCAiZW50ZXJpbmcgZmluYWwgd2FpdC1mb3ItcXVpdC1ldmVudCBsb29wXG4iKSkKICAgICAgICBkbyB7CiAgICAgICAgICAgIFhOZXh0RXZlbnQoZGlzcGxheSwgJmUpOwogICAgICAgICAgICBpZiAoZS50eXBlID09IEV4cG9zZSkgewogICAgICAgICAgICAgICAgWEV4cG9zZUV2ZW50ICpleCA9IChYRXhwb3NlRXZlbnQgKikmZTsKICAgICAgICAgICAgICAgIHJwbmcyX3hfcmVkaXNwbGF5X2ltYWdlIChleC0+eCwgZXgtPnksIGV4LT53aWR0aCwgZXgtPmhlaWdodCk7CiAgICAgICAgICAgIH0KICAgICAgICB9IHdoaWxlICghUVVJVChlLGspKTsKICAgIH0gZWxzZSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBpbml0IGNhbGxiYWNrIG5ldmVyIGNhbGxlZDogIHByb2JhYmxlICIKICAgICAgICAgICJsaWJwbmcgZXJyb3Igd2hpbGUgZGVjb2RpbmcgUE5HIG1ldGFkYXRhXG4iKTsKICAgICAgICBleGl0KDQpOwogICAgfQoKCiAgICAvKiB3ZSdyZSBkb25lOiAgY2xlYW4gdXAgYWxsIGltYWdlIGFuZCBYIHJlc291cmNlcyBhbmQgZ28gYXdheSAqLwoKICAgIFRyYWNlKChzdGRlcnIsICJhYm91dCB0byBjYWxsIHJwbmcyX3hfY2xlYW51cCgpXG4iKSkKICAgIHJwbmcyX3hfY2xlYW51cCgpOwoKICAgIHJldHVybiAwOwp9CgoKCgoKLyogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgcmVhZHBuZzJfaW5mb19jYWxsYmFjaygpIGluIHJlYWRwbmcyLmMsIHdoaWNoCiAqIGluIHR1cm4gaXMgY2FsbGVkIGJ5IGxpYnBuZyBhZnRlciBhbGwgb2YgdGhlIHByZS1JREFUIGNodW5rcyBoYXZlIGJlZW4KICogcmVhZCBhbmQgcHJvY2Vzc2VkLS1pLmUuLCB3ZSBub3cgaGF2ZSBlbm91Z2ggaW5mbyB0byBmaW5pc2ggaW5pdGlhbGl6aW5nICovCgpzdGF0aWMgdm9pZCBycG5nMl94X2luaXQodm9pZCkKewogICAgdWxnIGk7CiAgICB1bGcgcm93Ynl0ZXMgPSBycG5nMl9pbmZvLnJvd2J5dGVzOwoKICAgIFRyYWNlKChzdGRlcnIsICJiZWdpbm5pbmcgcnBuZzJfeF9pbml0KClcbiIpKQogICAgVHJhY2UoKHN0ZGVyciwgIiAgcm93Ynl0ZXMgPSAlZFxuIiwgcnBuZzJfaW5mby5yb3dieXRlcykpCiAgICBUcmFjZSgoc3RkZXJyLCAiICB3aWR0aCAgPSAlbGRcbiIsIHJwbmcyX2luZm8ud2lkdGgpKQogICAgVHJhY2UoKHN0ZGVyciwgIiAgaGVpZ2h0ID0gJWxkXG4iLCBycG5nMl9pbmZvLmhlaWdodCkpCgogICAgcnBuZzJfaW5mby5pbWFnZV9kYXRhID0gKHVjaCAqKW1hbGxvYyhyb3dieXRlcyAqIHJwbmcyX2luZm8uaGVpZ2h0KTsKICAgIGlmICghcnBuZzJfaW5mby5pbWFnZV9kYXRhKSB7CiAgICAgICAgcmVhZHBuZzJfY2xlYW51cCgmcnBuZzJfaW5mbyk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJwbmcyX2luZm8ucm93X3BvaW50ZXJzID0gKHVjaCAqKiltYWxsb2MocnBuZzJfaW5mby5oZWlnaHQgKiBzaXplb2YodWNoICopKTsKICAgIGlmICghcnBuZzJfaW5mby5yb3dfcG9pbnRlcnMpIHsKICAgICAgICBmcmVlKHJwbmcyX2luZm8uaW1hZ2VfZGF0YSk7CiAgICAgICAgcnBuZzJfaW5mby5pbWFnZV9kYXRhID0gTlVMTDsKICAgICAgICByZWFkcG5nMl9jbGVhbnVwKCZycG5nMl9pbmZvKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgZm9yIChpID0gMDsgIGkgPCBycG5nMl9pbmZvLmhlaWdodDsgICsraSkKICAgICAgICBycG5nMl9pbmZvLnJvd19wb2ludGVyc1tpXSA9IHJwbmcyX2luZm8uaW1hZ2VfZGF0YSArIGkqcm93Ynl0ZXM7CgoKICAgIC8qIGRvIHRoZSBiYXNpYyBYIGluaXRpYWxpemF0aW9uIHN0dWZmLCBtYWtlIHRoZSB3aW5kb3csIGFuZCBmaWxsIGl0IHdpdGgKICAgICAqIHRoZSB1c2VyLXNwZWNpZmllZCwgZmlsZS1zcGVjaWZpZWQgb3IgZGVmYXVsdCBiYWNrZ3JvdW5kIGNvbG9yIG9yCiAgICAgKiBwYXR0ZXJuICovCgogICAgaWYgKHJwbmcyX3hfY3JlYXRlX3dpbmRvdygpKSB7CgogICAgICAgIC8qIEdSUiBURU1QT1JBUlkgSEFDSzogIHRoaXMgaXMgZnVuZGFtZW50YWxseSBubyBkaWZmZXJlbnQgZnJvbSBjYXNlcwogICAgICAgICAqIGFib3ZlOyBsaWJwbmcgc2hvdWxkIGNhbGwgb3VyIGVycm9yIGhhbmRsZXIgdG8gbG9uZ2ptcCgpIGJhY2sgdG8gdXMKICAgICAgICAgKiB3aGVuIHBuZ19wdHIgZ29lcyBhd2F5LiAgSWYgd2UvaXQgc2VnZmF1bHQgaW5zdGVhZCwgc2VlbXMgbGlrZSBhCiAgICAgICAgICogbGlicG5nIGJ1Zy4uLiAqLwoKICAgICAgICAvKiB3ZSdyZSBoZXJlIHZpYSBsaWJwbmcgY2FsbGJhY2ssIHNvIGlmIHdpbmRvdyBmYWlscywgY2xlYW4gYW5kIGJhaWwgKi8KICAgICAgICByZWFkcG5nMl9jbGVhbnVwKCZycG5nMl9pbmZvKTsKICAgICAgICBycG5nMl94X2NsZWFudXAoKTsKICAgICAgICBleGl0KDIpOwogICAgfQoKICAgIHJwbmcyX2luZm8uc3RhdGUgPSBrV2luZG93SW5pdDsKfQoKCgoKCnN0YXRpYyBpbnQgcnBuZzJfeF9jcmVhdGVfd2luZG93KHZvaWQpCnsKICAgIHVsZyBiZ19yZWQgICA9IHJwbmcyX2luZm8uYmdfcmVkOwogICAgdWxnIGJnX2dyZWVuID0gcnBuZzJfaW5mby5iZ19ncmVlbjsKICAgIHVsZyBiZ19ibHVlICA9IHJwbmcyX2luZm8uYmdfYmx1ZTsKICAgIHVsZyBiZ19waXhlbCA9IDBMOwogICAgdWxnIGF0dHJtYXNrOwogICAgaW50IG5lZWRfY29sb3JtYXAgPSBGQUxTRTsKICAgIGludCBzY3JlZW4sIHBhZDsKICAgIHVjaCAqeGRhdGE7CiAgICBXaW5kb3cgcm9vdDsKICAgIFhFdmVudCBlOwogICAgWEdDVmFsdWVzIGdjdmFsdWVzOwogICAgWFNldFdpbmRvd0F0dHJpYnV0ZXMgYXR0cjsKICAgIFhUZXh0UHJvcGVydHkgd2luZG93TmFtZSwgKnBXaW5kb3dOYW1lID0gJndpbmRvd05hbWU7CiAgICBYVGV4dFByb3BlcnR5IGljb25OYW1lLCAqcEljb25OYW1lID0gJmljb25OYW1lOwogICAgWFZpc3VhbEluZm8gdmlzdWFsX2luZm87CiAgICBYU2l6ZUhpbnRzICpzaXplX2hpbnRzOwogICAgWFdNSGludHMgKndtX2hpbnRzOwogICAgWENsYXNzSGludCAqY2xhc3NfaGludHM7CgoKICAgIFRyYWNlKChzdGRlcnIsICJiZWdpbm5pbmcgcnBuZzJfeF9jcmVhdGVfd2luZG93KClcbiIpKQoKICAgIHNjcmVlbiA9IERlZmF1bHRTY3JlZW4oZGlzcGxheSk7CiAgICBkZXB0aCA9IERpc3BsYXlQbGFuZXMoZGlzcGxheSwgc2NyZWVuKTsKICAgIHJvb3QgPSBSb290V2luZG93KGRpc3BsYXksIHNjcmVlbik7CgojaWZkZWYgREVCVUcKICAgIFhTeW5jaHJvbml6ZShkaXNwbGF5LCBUcnVlKTsKI2VuZGlmCgogICAgaWYgKGRlcHRoICE9IDE2ICYmIGRlcHRoICE9IDI0ICYmIGRlcHRoICE9IDMyKSB7CiAgICAgICAgaW50IHZpc3VhbHNfbWF0Y2hlZCA9IDA7CgogICAgICAgIFRyYWNlKChzdGRlcnIsICJkZWZhdWx0IGRlcHRoIGlzICVkOiAgY2hlY2tpbmcgb3RoZXIgdmlzdWFsc1xuIiwKICAgICAgICAgIGRlcHRoKSkKCiAgICAgICAgLyogMjQtYml0IGZpcnN0ICovCiAgICAgICAgdmlzdWFsX2luZm8uc2NyZWVuID0gc2NyZWVuOwogICAgICAgIHZpc3VhbF9pbmZvLmRlcHRoID0gMjQ7CiAgICAgICAgdmlzdWFsX2xpc3QgPSBYR2V0VmlzdWFsSW5mbyhkaXNwbGF5LAogICAgICAgICAgVmlzdWFsU2NyZWVuTWFzayB8IFZpc3VhbERlcHRoTWFzaywgJnZpc3VhbF9pbmZvLCAmdmlzdWFsc19tYXRjaGVkKTsKICAgICAgICBpZiAodmlzdWFsc19tYXRjaGVkID09IDApIHsKLyogR1JSOiAgYWRkIDE1LSwgMTYtIGFuZCAzMi1iaXQgVHJ1ZUNvbG9yIHZpc3VhbHMgKGFsc28gRGlyZWN0Q29sb3I/KSAqLwogICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImRlZmF1bHQgc2NyZWVuIGRlcHRoICVkIG5vdCBzdXBwb3J0ZWQsIGFuZCBubyIKICAgICAgICAgICAgICAiIDI0LWJpdCB2aXN1YWxzIGZvdW5kXG4iLCBkZXB0aCk7CiAgICAgICAgICAgIHJldHVybiAyOwogICAgICAgIH0KICAgICAgICBUcmFjZSgoc3RkZXJyLCAiWEdldFZpc3VhbEluZm8oKSByZXR1cm5lZCAlZCAyNC1iaXQgdmlzdWFsc1xuIiwKICAgICAgICAgIHZpc3VhbHNfbWF0Y2hlZCkpCiAgICAgICAgdmlzdWFsID0gdmlzdWFsX2xpc3RbMF0udmlzdWFsOwogICAgICAgIGRlcHRoID0gdmlzdWFsX2xpc3RbMF0uZGVwdGg7Ci8qCiAgICAgICAgY29sb3JtYXBfc2l6ZSA9IHZpc3VhbF9saXN0WzBdLmNvbG9ybWFwX3NpemU7CiAgICAgICAgdmlzdWFsX2NsYXNzID0gdmlzdWFsLT5jbGFzczsKICAgICAgICB2aXN1YWxJRCA9IFhWaXN1YWxJREZyb21WaXN1YWwodmlzdWFsKTsKICovCiAgICAgICAgaGF2ZV9ub25kZWZhdWx0X3Zpc3VhbCA9IFRSVUU7CiAgICAgICAgbmVlZF9jb2xvcm1hcCA9IFRSVUU7CiAgICB9IGVsc2UgewogICAgICAgIFhNYXRjaFZpc3VhbEluZm8oZGlzcGxheSwgc2NyZWVuLCBkZXB0aCwgVHJ1ZUNvbG9yLCAmdmlzdWFsX2luZm8pOwogICAgICAgIHZpc3VhbCA9IHZpc3VhbF9pbmZvLnZpc3VhbDsKICAgIH0KCiAgICBSTWFzayA9IHZpc3VhbC0+cmVkX21hc2s7CiAgICBHTWFzayA9IHZpc3VhbC0+Z3JlZW5fbWFzazsKICAgIEJNYXNrID0gdmlzdWFsLT5ibHVlX21hc2s7CgovKiBHUlI6ICBhZGQvY2hlY2sgOC1iaXQgc3VwcG9ydCAqLwogICAgaWYgKGRlcHRoID09IDggfHwgbmVlZF9jb2xvcm1hcCkgewogICAgICAgIGNvbG9ybWFwID0gWENyZWF0ZUNvbG9ybWFwKGRpc3BsYXksIHJvb3QsIHZpc3VhbCwgQWxsb2NOb25lKTsKICAgICAgICBpZiAoIWNvbG9ybWFwKSB7CiAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiWENyZWF0ZUNvbG9ybWFwKCkgZmFpbGVkXG4iKTsKICAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgfQogICAgICAgIGhhdmVfY29sb3JtYXAgPSBUUlVFOwogICAgICAgIGlmIChkZXB0aCA9PSA4KQogICAgICAgICAgICBiZ19pbWFnZSA9IEZBTFNFOyAgIC8qIGdyYWRpZW50IGp1c3Qgd2FzdGVzIHBhbGV0dGUgZW50cmllcyAqLwogICAgfQogICAgaWYgKGRlcHRoID09IDE1IHx8IGRlcHRoID09IDE2KSB7CiAgICAgICAgUlNoaWZ0ID0gMTUgLSBycG5nMl94X21zYihSTWFzayk7ICAgIC8qIHRoZXNlIGFyZSByaWdodC1zaGlmdHMgKi8KICAgICAgICBHU2hpZnQgPSAxNSAtIHJwbmcyX3hfbXNiKEdNYXNrKTsKICAgICAgICBCU2hpZnQgPSAxNSAtIHJwbmcyX3hfbXNiKEJNYXNrKTsKICAgIH0gZWxzZSBpZiAoZGVwdGggPiAxNikgewogICAgICAgIFJTaGlmdCA9IHJwbmcyX3hfbXNiKFJNYXNrKSAtIDc7ICAgICAvKiB0aGVzZSBhcmUgbGVmdC1zaGlmdHMgKi8KICAgICAgICBHU2hpZnQgPSBycG5nMl94X21zYihHTWFzaykgLSA3OwogICAgICAgIEJTaGlmdCA9IHJwbmcyX3hfbXNiKEJNYXNrKSAtIDc7CiAgICB9CiAgICBpZiAoZGVwdGggPj0gMTUgJiYgKFJTaGlmdCA8IDAgfHwgR1NoaWZ0IDwgMCB8fCBCU2hpZnQgPCAwKSkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAicnBuZzIgaW50ZXJuYWwgbG9naWMgZXJyb3I6ICBuZWdhdGl2ZSBYIHNoaWZ0KHMpIVxuIik7CiAgICAgICAgcmV0dXJuIDI7CiAgICB9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRmluYWxseSwgY3JlYXRlIHRoZSB3aW5kb3cuCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBhdHRyLmJhY2tpbmdfc3RvcmUgPSBBbHdheXM7CiAgICBhdHRyLmV2ZW50X21hc2sgPSBFeHBvc3VyZU1hc2sgfCBLZXlQcmVzc01hc2sgfCBCdXR0b25QcmVzc01hc2s7CiAgICBhdHRybWFzayA9IENXQmFja2luZ1N0b3JlIHwgQ1dFdmVudE1hc2s7CiAgICBpZiAoaGF2ZV9ub25kZWZhdWx0X3Zpc3VhbCkgewogICAgICAgIGF0dHIuY29sb3JtYXAgPSBjb2xvcm1hcDsKICAgICAgICBhdHRyLmJhY2tncm91bmRfcGl4ZWwgPSAwOwogICAgICAgIGF0dHIuYm9yZGVyX3BpeGVsID0gMTsKICAgICAgICBhdHRybWFzayB8PSBDV0NvbG9ybWFwIHwgQ1dCYWNrUGl4ZWwgfCBDV0JvcmRlclBpeGVsOwogICAgfQoKICAgIHdpbmRvdyA9IFhDcmVhdGVXaW5kb3coZGlzcGxheSwgcm9vdCwgMCwgMCwgcnBuZzJfaW5mby53aWR0aCwKICAgICAgcnBuZzJfaW5mby5oZWlnaHQsIDAsIGRlcHRoLCBJbnB1dE91dHB1dCwgdmlzdWFsLCBhdHRybWFzaywgJmF0dHIpOwoKICAgIGlmICh3aW5kb3cgPT0gTm9uZSkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiWENyZWF0ZVdpbmRvdygpIGZhaWxlZFxuIik7CiAgICAgICAgcmV0dXJuIDI7CiAgICB9IGVsc2UKICAgICAgICBoYXZlX3dpbmRvdyA9IFRSVUU7CgogICAgaWYgKGRlcHRoID09IDgpCiAgICAgICAgWFNldFdpbmRvd0NvbG9ybWFwKGRpc3BsYXksIHdpbmRvdywgY29sb3JtYXApOwoKICAgIGlmICghWFN0cmluZ0xpc3RUb1RleHRQcm9wZXJ0eSgmd2luZG93X25hbWUsIDEsIHBXaW5kb3dOYW1lKSkKICAgICAgICBwV2luZG93TmFtZSA9IE5VTEw7CiAgICBpZiAoIVhTdHJpbmdMaXN0VG9UZXh0UHJvcGVydHkoJmljb25fbmFtZSwgMSwgcEljb25OYW1lKSkKICAgICAgICBwSWNvbk5hbWUgPSBOVUxMOwoKICAgIC8qIE9LIGlmIGVpdGhlciBoaW50cyBhbGxvY2F0aW9uIGZhaWxzOyBYU2V0V01Qcm9wZXJ0aWVzKCkgYWxsb3dzIE5VTExzICovCgogICAgaWYgKChzaXplX2hpbnRzID0gWEFsbG9jU2l6ZUhpbnRzKCkpICE9IE5VTEwpIHsKICAgICAgICAvKiB3aW5kb3cgd2lsbCBub3QgYmUgcmVzaXphYmxlICovCiAgICAgICAgc2l6ZV9oaW50cy0+ZmxhZ3MgPSBQTWluU2l6ZSB8IFBNYXhTaXplOwogICAgICAgIHNpemVfaGludHMtPm1pbl93aWR0aCA9IHNpemVfaGludHMtPm1heF93aWR0aCA9IChpbnQpcnBuZzJfaW5mby53aWR0aDsKICAgICAgICBzaXplX2hpbnRzLT5taW5faGVpZ2h0ID0gc2l6ZV9oaW50cy0+bWF4X2hlaWdodCA9CiAgICAgICAgICAoaW50KXJwbmcyX2luZm8uaGVpZ2h0OwogICAgfQoKICAgIGlmICgod21faGludHMgPSBYQWxsb2NXTUhpbnRzKCkpICE9IE5VTEwpIHsKICAgICAgICB3bV9oaW50cy0+aW5pdGlhbF9zdGF0ZSA9IE5vcm1hbFN0YXRlOwogICAgICAgIHdtX2hpbnRzLT5pbnB1dCA9IFRydWU7CiAgICAgLyogd21faGludHMtPmljb25fcGl4bWFwID0gaWNvbl9waXhtYXA7ICovCiAgICAgICAgd21faGludHMtPmZsYWdzID0gU3RhdGVIaW50IHwgSW5wdXRIaW50ICAvKiB8IEljb25QaXhtYXBIaW50ICovIDsKICAgIH0KCiAgICBpZiAoKGNsYXNzX2hpbnRzID0gWEFsbG9jQ2xhc3NIaW50KCkpICE9IE5VTEwpIHsKICAgICAgICBjbGFzc19oaW50cy0+cmVzX25hbWUgPSByZXNfbmFtZTsKICAgICAgICBjbGFzc19oaW50cy0+cmVzX2NsYXNzID0gcmVzX2NsYXNzOwogICAgfQoKICAgIFhTZXRXTVByb3BlcnRpZXMoZGlzcGxheSwgd2luZG93LCBwV2luZG93TmFtZSwgcEljb25OYW1lLCBOVUxMLCAwLAogICAgICBzaXplX2hpbnRzLCB3bV9oaW50cywgY2xhc3NfaGludHMpOwoKICAgIC8qIHZhcmlvdXMgcHJvcGVydGllcyBhbmQgaGludHMgbm8gbG9uZ2VyIG5lZWRlZDsgZnJlZSBtZW1vcnkgKi8KICAgIGlmIChwV2luZG93TmFtZSkKICAgICAgIFhGcmVlKHBXaW5kb3dOYW1lLT52YWx1ZSk7CiAgICBpZiAocEljb25OYW1lKQogICAgICAgWEZyZWUocEljb25OYW1lLT52YWx1ZSk7CiAgICBpZiAoc2l6ZV9oaW50cykKICAgICAgICBYRnJlZShzaXplX2hpbnRzKTsKICAgIGlmICh3bV9oaW50cykKICAgICAgIFhGcmVlKHdtX2hpbnRzKTsKICAgIGlmIChjbGFzc19oaW50cykKICAgICAgIFhGcmVlKGNsYXNzX2hpbnRzKTsKCiAgICBYTWFwV2luZG93KGRpc3BsYXksIHdpbmRvdyk7CgogICAgZ2MgPSBYQ3JlYXRlR0MoZGlzcGxheSwgd2luZG93LCAwLCAmZ2N2YWx1ZXMpOwogICAgaGF2ZV9nYyA9IFRSVUU7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgWC0gYW5kIGRpc3BsYXktc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGUgaW1hZ2UuCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBpZiAoZGVwdGggPT0gMjQgfHwgZGVwdGggPT0gMzIpIHsKICAgICAgICB4ZGF0YSA9ICh1Y2ggKiltYWxsb2MoNCpycG5nMl9pbmZvLndpZHRoKnJwbmcyX2luZm8uaGVpZ2h0KTsKICAgICAgICBwYWQgPSAzMjsKICAgIH0gZWxzZSBpZiAoZGVwdGggPT0gMTYpIHsKICAgICAgICB4ZGF0YSA9ICh1Y2ggKiltYWxsb2MoMipycG5nMl9pbmZvLndpZHRoKnJwbmcyX2luZm8uaGVpZ2h0KTsKICAgICAgICBwYWQgPSAxNjsKICAgIH0gZWxzZSAvKiBkZXB0aCA9PSA4ICovIHsKICAgICAgICB4ZGF0YSA9ICh1Y2ggKiltYWxsb2MocnBuZzJfaW5mby53aWR0aCpycG5nMl9pbmZvLmhlaWdodCk7CiAgICAgICAgcGFkID0gODsKICAgIH0KCiAgICBpZiAoIXhkYXRhKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICB1bmFibGUgdG8gYWxsb2NhdGUgaW1hZ2UgbWVtb3J5XG4iKTsKICAgICAgICByZXR1cm4gNDsKICAgIH0KCiAgICB4aW1hZ2UgPSBYQ3JlYXRlSW1hZ2UoZGlzcGxheSwgdmlzdWFsLCBkZXB0aCwgWlBpeG1hcCwgMCwKICAgICAgKGNoYXIgKil4ZGF0YSwgcnBuZzJfaW5mby53aWR0aCwgcnBuZzJfaW5mby5oZWlnaHQsIHBhZCwgMCk7CgogICAgaWYgKCF4aW1hZ2UpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIFhDcmVhdGVJbWFnZSgpIGZhaWxlZFxuIik7CiAgICAgICAgZnJlZSh4ZGF0YSk7CiAgICAgICAgcmV0dXJuIDM7CiAgICB9CgogICAgLyogdG8gYXZvaWQgdGVzdGluZyB0aGUgYnl0ZSBvcmRlciBldmVyeSBwaXhlbCAob3IgZG91YmxpbmcgdGhlIHNpemUgb2YKICAgICAqIHRoZSBkcmF3aW5nIHJvdXRpbmUgd2l0aCBhIGdpYW50IGlmLXRlc3QpLCB3ZSBhcmJpdHJhcmlseSBzZXQgdGhlIGJ5dGUKICAgICAqIG9yZGVyIHRvIE1TQkZpcnN0IGFuZCBsZXQgWGxpYiB3b3JyeSBhYm91dCBpbnZlcnRpbmcgdGhpbmdzIG9uIGxpdHRsZS0KICAgICAqIGVuZGlhbiBtYWNoaW5lcyAoZS5nLiwgTGludXgveDg2LCBvbGQgVkFYZW4sIGV0Yy4pLS10aGlzIGlzIG5vdCB0aGUKICAgICAqIG1vc3QgZWZmaWNpZW50IGFwcHJvYWNoICh0aGUgZ2lhbnQgaWYtdGVzdCB3b3VsZCBiZSBiZXR0ZXIpLCBidXQgaW4KICAgICAqIHRoZSBpbnRlcmVzdCBvZiBjbGFyaXR5LCB3ZSdsbCB0YWtlIHRoZSBlYXN5IHdheSBvdXQuLi4gKi8KCiAgICB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdDsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBGaWxsIHdpbmRvdyB3aXRoIHRoZSBzcGVjaWZpZWQgYmFja2dyb3VuZCBjb2xvciAoZGVmYXVsdCBpcyBibGFjaykgb3IKICAgIGZha2VkICJiYWNrZ3JvdW5kIGltYWdlIiAoYnV0IGxhdHRlciBpcyBkaXNhYmxlZCBpZiA4LWJpdDsgZ3JhZGllbnRzCiAgICBqdXN0IHdhc3RlIHBhbGV0dGUgZW50cmllcykuCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBpZiAoYmdfaW1hZ2UpCiAgICAgICAgcnBuZzJfeF9sb2FkX2JnX2ltYWdlKCk7ICAgIC8qIHJlc2V0cyBiZ19pbWFnZSBpZiBmYWlscyAqLwoKICAgIGlmICghYmdfaW1hZ2UpIHsKICAgICAgICBpZiAoZGVwdGggPT0gMjQgfHwgZGVwdGggPT0gMzIpIHsKICAgICAgICAgICAgYmdfcGl4ZWwgPSAoYmdfcmVkICAgPDwgUlNoaWZ0KSB8CiAgICAgICAgICAgICAgICAgICAgICAgKGJnX2dyZWVuIDw8IEdTaGlmdCkgfAogICAgICAgICAgICAgICAgICAgICAgIChiZ19ibHVlICA8PCBCU2hpZnQpOwogICAgICAgIH0gZWxzZSBpZiAoZGVwdGggPT0gMTYpIHsKICAgICAgICAgICAgYmdfcGl4ZWwgPSAoKChiZ19yZWQgICA8PCA4KSA+PiBSU2hpZnQpICYgUk1hc2spIHwKICAgICAgICAgICAgICAgICAgICAgICAoKChiZ19ncmVlbiA8PCA4KSA+PiBHU2hpZnQpICYgR01hc2spIHwKICAgICAgICAgICAgICAgICAgICAgICAoKChiZ19ibHVlICA8PCA4KSA+PiBCU2hpZnQpICYgQk1hc2spOwogICAgICAgIH0gZWxzZSAvKiBkZXB0aCA9PSA4ICovIHsKCiAgICAgICAgICAgIC8qIEdSUjogIGFkZCA4LWJpdCBzdXBwb3J0ICovCgogICAgICAgIH0KICAgICAgICBYU2V0Rm9yZWdyb3VuZChkaXNwbGF5LCBnYywgYmdfcGl4ZWwpOwogICAgICAgIFhGaWxsUmVjdGFuZ2xlKGRpc3BsYXksIHdpbmRvdywgZ2MsIDAsIDAsIHJwbmcyX2luZm8ud2lkdGgsCiAgICAgICAgICBycG5nMl9pbmZvLmhlaWdodCk7CiAgICB9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgV2FpdCBmb3IgZmlyc3QgRXhwb3NlIGV2ZW50IHRvIGRvIGFueSBkcmF3aW5nLCB0aGVuIGZsdXNoIGFuZCByZXR1cm4uCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBkbwogICAgICAgIFhOZXh0RXZlbnQoZGlzcGxheSwgJmUpOwogICAgd2hpbGUgKGUudHlwZSAhPSBFeHBvc2UgfHwgZS54ZXhwb3NlLmNvdW50KTsKCiAgICBYRmx1c2goZGlzcGxheSk7CgogICAgcmV0dXJuIDA7Cgp9IC8qIGVuZCBmdW5jdGlvbiBycG5nMl94X2NyZWF0ZV93aW5kb3coKSAqLwoKCgoKCnN0YXRpYyBpbnQgcnBuZzJfeF9sb2FkX2JnX2ltYWdlKHZvaWQpCnsKICAgIHVjaCAqc3JjOwogICAgY2hhciAqZGVzdDsKICAgIHVjaCByMSwgcjIsIGcxLCBnMiwgYjEsIGIyOwogICAgdWNoIHIxX2ludiwgcjJfaW52LCBnMV9pbnYsIGcyX2ludiwgYjFfaW52LCBiMl9pbnY7CiAgICBpbnQgaywgaG1heCwgbWF4OwogICAgaW50IHhpZHgsIHlpZHgsIHlpZHhfbWF4OwogICAgaW50IGV2ZW5fb2RkX3ZlcnQsIGV2ZW5fb2RkX2hvcml6LCBldmVuX29kZDsKICAgIGludCBpbnZlcnRfZ3JhZGllbnQyID0gKGJnW3BhdF0udHlwZSAmIDB4MDgpOwogICAgaW50IGludmVydF9jb2x1bW47CiAgICBpbnQgeGltYWdlX3Jvd2J5dGVzID0geGltYWdlLT5ieXRlc19wZXJfbGluZTsKICAgIHVsZyBpLCByb3c7CiAgICB1bGcgcGl4ZWw7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQWxsb2NhdGUgYnVmZmVyIGZvciBmYWtlIGJhY2tncm91bmQgaW1hZ2UgdG8gYmUgdXNlZCB3aXRoIHRyYW5zcGFyZW50CiAgICBpbWFnZXM7IGlmIHRoaXMgZmFpbHMsIHJldmVydCB0byBwbGFpbiBiYWNrZ3JvdW5kIGNvbG9yLgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgYmdfcm93Ynl0ZXMgPSAzICogcnBuZzJfaW5mby53aWR0aDsKICAgIGJnX2RhdGEgPSAodWNoICopbWFsbG9jKGJnX3Jvd2J5dGVzICogcnBuZzJfaW5mby5oZWlnaHQpOwogICAgaWYgKCFiZ19kYXRhKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCiAgICAgICAgICAiOiAgdW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgYmFja2dyb3VuZCBpbWFnZVxuIik7CiAgICAgICAgYmdfaW1hZ2UgPSAwOwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIGJnc2NhbGUgPSAocGF0ID09IDApPyA4IDogYmdzY2FsZV9kZWZhdWx0OwogICAgeWlkeF9tYXggPSBiZ3NjYWxlIC0gMTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBWZXJ0aWNhbCBncmFkaWVudHMgKHJhbXBzKSBpbiBOeE4gc3F1YXJlcywgYWx0ZXJuYXRpbmcgZGlyZWN0aW9uIGFuZAogICAgY29sb3JzIChOID09IGJnc2NhbGUpLgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgaWYgKChiZ1twYXRdLnR5cGUgJiAweDA3KSA9PSAwKSB7CiAgICAgICAgdWNoIHIxX21pbiAgPSByZ2JbYmdbcGF0XS5yZ2IxX21pbl0ucjsKICAgICAgICB1Y2ggZzFfbWluICA9IHJnYltiZ1twYXRdLnJnYjFfbWluXS5nOwogICAgICAgIHVjaCBiMV9taW4gID0gcmdiW2JnW3BhdF0ucmdiMV9taW5dLmI7CiAgICAgICAgdWNoIHIyX21pbiAgPSByZ2JbYmdbcGF0XS5yZ2IyX21pbl0ucjsKICAgICAgICB1Y2ggZzJfbWluICA9IHJnYltiZ1twYXRdLnJnYjJfbWluXS5nOwogICAgICAgIHVjaCBiMl9taW4gID0gcmdiW2JnW3BhdF0ucmdiMl9taW5dLmI7CiAgICAgICAgaW50IHIxX2RpZmYgPSByZ2JbYmdbcGF0XS5yZ2IxX21heF0uciAtIHIxX21pbjsKICAgICAgICBpbnQgZzFfZGlmZiA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5nIC0gZzFfbWluOwogICAgICAgIGludCBiMV9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMV9tYXhdLmIgLSBiMV9taW47CiAgICAgICAgaW50IHIyX2RpZmYgPSByZ2JbYmdbcGF0XS5yZ2IyX21heF0uciAtIHIyX21pbjsKICAgICAgICBpbnQgZzJfZGlmZiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5nIC0gZzJfbWluOwogICAgICAgIGludCBiMl9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMl9tYXhdLmIgLSBiMl9taW47CgogICAgICAgIGZvciAocm93ID0gMDsgIHJvdyA8IHJwbmcyX2luZm8uaGVpZ2h0OyAgKytyb3cpIHsKICAgICAgICAgICAgeWlkeCA9IChpbnQpKHJvdyAlIGJnc2NhbGUpOwogICAgICAgICAgICBldmVuX29kZF92ZXJ0ID0gKGludCkoKHJvdyAvIGJnc2NhbGUpICYgMSk7CgogICAgICAgICAgICByMSA9IHIxX21pbiArIChyMV9kaWZmICogeWlkeCkgLyB5aWR4X21heDsKICAgICAgICAgICAgZzEgPSBnMV9taW4gKyAoZzFfZGlmZiAqIHlpZHgpIC8geWlkeF9tYXg7CiAgICAgICAgICAgIGIxID0gYjFfbWluICsgKGIxX2RpZmYgKiB5aWR4KSAvIHlpZHhfbWF4OwogICAgICAgICAgICByMV9pbnYgPSByMV9taW4gKyAocjFfZGlmZiAqICh5aWR4X21heC15aWR4KSkgLyB5aWR4X21heDsKICAgICAgICAgICAgZzFfaW52ID0gZzFfbWluICsgKGcxX2RpZmYgKiAoeWlkeF9tYXgteWlkeCkpIC8geWlkeF9tYXg7CiAgICAgICAgICAgIGIxX2ludiA9IGIxX21pbiArIChiMV9kaWZmICogKHlpZHhfbWF4LXlpZHgpKSAvIHlpZHhfbWF4OwoKICAgICAgICAgICAgcjIgPSByMl9taW4gKyAocjJfZGlmZiAqIHlpZHgpIC8geWlkeF9tYXg7CiAgICAgICAgICAgIGcyID0gZzJfbWluICsgKGcyX2RpZmYgKiB5aWR4KSAvIHlpZHhfbWF4OwogICAgICAgICAgICBiMiA9IGIyX21pbiArIChiMl9kaWZmICogeWlkeCkgLyB5aWR4X21heDsKICAgICAgICAgICAgcjJfaW52ID0gcjJfbWluICsgKHIyX2RpZmYgKiAoeWlkeF9tYXgteWlkeCkpIC8geWlkeF9tYXg7CiAgICAgICAgICAgIGcyX2ludiA9IGcyX21pbiArIChnMl9kaWZmICogKHlpZHhfbWF4LXlpZHgpKSAvIHlpZHhfbWF4OwogICAgICAgICAgICBiMl9pbnYgPSBiMl9taW4gKyAoYjJfZGlmZiAqICh5aWR4X21heC15aWR4KSkgLyB5aWR4X21heDsKCiAgICAgICAgICAgIGRlc3QgPSAoY2hhciAqKWJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7CiAgICAgICAgICAgIGZvciAoaSA9IDA7ICBpIDwgcnBuZzJfaW5mby53aWR0aDsgICsraSkgewogICAgICAgICAgICAgICAgZXZlbl9vZGRfaG9yaXogPSAoaW50KSgoaSAvIGJnc2NhbGUpICYgMSk7CiAgICAgICAgICAgICAgICBldmVuX29kZCA9IGV2ZW5fb2RkX3ZlcnQgXiBldmVuX29kZF9ob3JpejsKICAgICAgICAgICAgICAgIGludmVydF9jb2x1bW4gPQogICAgICAgICAgICAgICAgICAoZXZlbl9vZGRfaG9yaXogJiYgKGJnW3BhdF0udHlwZSAmIDB4MTApKTsKICAgICAgICAgICAgICAgIGlmIChldmVuX29kZCA9PSAwKSB7ICAgICAgICAvKiBncmFkaWVudCAjMSAqLwogICAgICAgICAgICAgICAgICAgIGlmIChpbnZlcnRfY29sdW1uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSByMV9pbnY7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBnMV9pbnY7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBiMV9pbnY7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IHIxOwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gZzE7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBiMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgLyogZ3JhZGllbnQgIzIgKi8KICAgICAgICAgICAgICAgICAgICBpZiAoKGludmVydF9jb2x1bW4gJiYgaW52ZXJ0X2dyYWRpZW50MikgfHwKICAgICAgICAgICAgICAgICAgICAgICAgKCFpbnZlcnRfY29sdW1uICYmICFpbnZlcnRfZ3JhZGllbnQyKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSByMjsgICAgICAgLyogbm90IGludmVydGVkIG9yICovCiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBnMjsgICAgICAgLyogIGRvdWJseSBpbnZlcnRlZCAqLwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYjI7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IHIyX2ludjsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGcyX2ludjsgICAvKiBzaW5nbHkgaW52ZXJ0ZWQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGIyX2ludjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU29mdCBncmFkaWVudC1kaWFtb25kcyB3aXRoIHNjYWxlID0gYmdzY2FsZS4gIENvZGUgY29udHJpYnV0ZWQgYnkgQWRhbQogICAgTS4gQ29zdGVsbG8uCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICB9IGVsc2UgaWYgKChiZ1twYXRdLnR5cGUgJiAweDA3KSA9PSAxKSB7CgogICAgICAgIGhtYXggPSAoYmdzY2FsZS0xKS8yOyAgIC8qIGhhbGYgdGhlIG1heCB3ZWlnaHQgb2YgYSBjb2xvciAqLwogICAgICAgIG1heCA9IDIqaG1heDsgICAgICAgICAgIC8qIHRoZSBtYXggd2VpZ2h0IG9mIGEgY29sb3IgKi8KCiAgICAgICAgcjEgPSByZ2JbYmdbcGF0XS5yZ2IxX21heF0ucjsKICAgICAgICBnMSA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5nOwogICAgICAgIGIxID0gcmdiW2JnW3BhdF0ucmdiMV9tYXhdLmI7CiAgICAgICAgcjIgPSByZ2JbYmdbcGF0XS5yZ2IyX21heF0ucjsKICAgICAgICBnMiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5nOwogICAgICAgIGIyID0gcmdiW2JnW3BhdF0ucmdiMl9tYXhdLmI7CgogICAgICAgIGZvciAocm93ID0gMDsgIHJvdyA8IHJwbmcyX2luZm8uaGVpZ2h0OyAgKytyb3cpIHsKICAgICAgICAgICAgeWlkeCA9IChpbnQpKHJvdyAlIGJnc2NhbGUpOwogICAgICAgICAgICBpZiAoeWlkeCA+IGhtYXgpCiAgICAgICAgICAgICAgICB5aWR4ID0gYmdzY2FsZS0xIC0geWlkeDsKICAgICAgICAgICAgZGVzdCA9IChjaGFyICopYmdfZGF0YSArIHJvdypiZ19yb3dieXRlczsKICAgICAgICAgICAgZm9yIChpID0gMDsgIGkgPCBycG5nMl9pbmZvLndpZHRoOyAgKytpKSB7CiAgICAgICAgICAgICAgICB4aWR4ID0gKGludCkoaSAlIGJnc2NhbGUpOwogICAgICAgICAgICAgICAgaWYgKHhpZHggPiBobWF4KQogICAgICAgICAgICAgICAgICAgIHhpZHggPSBiZ3NjYWxlLTEgLSB4aWR4OwogICAgICAgICAgICAgICAgayA9IHhpZHggKyB5aWR4OwogICAgICAgICAgICAgICAgKmRlc3QrKyA9IChrKnIxICsgKG1heC1rKSpyMikgLyBtYXg7CiAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGsqZzEgKyAobWF4LWspKmcyKSAvIG1heDsKICAgICAgICAgICAgICAgICpkZXN0KysgPSAoaypiMSArIChtYXgtaykqYjIpIC8gbWF4OwogICAgICAgICAgICB9CiAgICAgICAgfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFJhZGlhbCAic3RhcmJ1cnN0IiB3aXRoIGF6aW11dGhhbCBzaW51c29pZHM7IFtldmVudHVhbGx5IG51bWJlciBvZiBzaW51LQogICAgc29pZHMgd2lsbCBlcXVhbCBiZ3NjYWxlP10uICBUaGlzIG9uZSBpcyBzbG93IGJ1dCB2ZXJ5IGNvb2wuICBDb2RlIGNvbi0KICAgIHRyaWJ1dGVkIGJ5IFBpZXRlciBTLiB2YW4gZGVyIE1ldWxlbiAob3JpZ2luYWxseSBpbiBTbWFsbHRhbGspLgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgfSBlbHNlIGlmICgoYmdbcGF0XS50eXBlICYgMHgwNykgPT0gMikgewogICAgICAgIHVjaCBjaDsKICAgICAgICBpbnQgaWksIHgsIHksIGh3LCBoaCwgZ3JheXNwb3Q7CiAgICAgICAgZG91YmxlIGZyZXEsIHJvdGF0ZSwgc2F0dXJhdGUsIGdyYXksIGludGVuc2l0eTsKICAgICAgICBkb3VibGUgYW5nbGU9MC4wLCBhb2Zmc2V0PTAuMCwgbWF4RGlzdCwgZGlzdDsKICAgICAgICBkb3VibGUgcmVkPTAuMCwgZ3JlZW49MC4wLCBibHVlPTAuMCwgaHVlLCBzLCB2LCBmLCBwLCBxLCB0OwoKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiAgY29tcHV0aW5nIHJhZGlhbCBiYWNrZ3JvdW5kLi4uIiwKICAgICAgICAgIFBST0dOQU1FKTsKICAgICAgICBmZmx1c2goc3RkZXJyKTsKCiAgICAgICAgaGggPSAoaW50KShycG5nMl9pbmZvLmhlaWdodCAvIDIpOwogICAgICAgIGh3ID0gKGludCkocnBuZzJfaW5mby53aWR0aCAvIDIpOwoKICAgICAgICAvKiB2YXJpYWJsZXMgZm9yIHJhZGlhbCB3YXZlczoKICAgICAgICAgKiAgIGFvZmZzZXQ6ICBudW1iZXIgb2YgZGVncmVlcyB0byByb3RhdGUgaHVlIFtDVVJSRU5UTFkgTk9UIFVTRURdCiAgICAgICAgICogICBmcmVxOiAgbnVtYmVyIG9mIGNvbG9yIGJlYW1zIG9yaWdpbmF0aW5nIGZyb20gdGhlIGNlbnRlcgogICAgICAgICAqICAgZ3JheXNwb3Q6ICBzaXplIG9mIHRoZSBncmF5aW5nIGNlbnRlciBhcmVhIChhbnRpLWFsaWFzKQogICAgICAgICAqICAgcm90YXRlOiAgcm90YXRpb24gb2YgdGhlIGJlYW1zIGFzIGEgZnVuY3Rpb24gb2YgcmFkaXVzCiAgICAgICAgICogICBzYXR1cmF0ZTogIHNhdHVyYXRpb24gb2YgYmVhbXMnIHNoYXBlIGF6aW11dGhhbGx5CiAgICAgICAgICovCiAgICAgICAgYW5nbGUgPSBDTElQKGFuZ2xlLCAwLjAsIDM2MC4wKTsKICAgICAgICBncmF5c3BvdCA9IENMSVAoYmdbcGF0XS5iZ19ncmF5LCAxLCAoaGggKyBodykpOwogICAgICAgIGZyZXEgPSBNQVgoKGRvdWJsZSliZ1twYXRdLmJnX2ZyZXEsIDAuMCk7CiAgICAgICAgc2F0dXJhdGUgPSAoZG91YmxlKWJnW3BhdF0uYmdfYnNhdCAqIDAuMTsKICAgICAgICByb3RhdGUgPSAoZG91YmxlKWJnW3BhdF0uYmdfYnJvdCAqIDAuMTsKICAgICAgICBncmF5ID0gMC4wOwogICAgICAgIGludGVuc2l0eSA9IDAuMDsKICAgICAgICBtYXhEaXN0ID0gKGRvdWJsZSkoKGh3Kmh3KSArIChoaCpoaCkpOwoKICAgICAgICBmb3IgKHJvdyA9IDA7ICByb3cgPCBycG5nMl9pbmZvLmhlaWdodDsgICsrcm93KSB7CiAgICAgICAgICAgIHkgPSAoaW50KShyb3cgLSBoaCk7CiAgICAgICAgICAgIGRlc3QgPSAoY2hhciAqKWJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7CiAgICAgICAgICAgIGZvciAoaSA9IDA7ICBpIDwgcnBuZzJfaW5mby53aWR0aDsgICsraSkgewogICAgICAgICAgICAgICAgeCA9IChpbnQpKGkgLSBodyk7CiAgICAgICAgICAgICAgICBhbmdsZSA9ICh4ID09IDApPyBQSV8yIDogYXRhbigoZG91YmxlKXkgLyAoZG91YmxlKXgpOwogICAgICAgICAgICAgICAgZ3JheSA9IChkb3VibGUpTUFYKEFCUyh5KSwgQUJTKHgpKSAvIGdyYXlzcG90OwogICAgICAgICAgICAgICAgZ3JheSA9IE1JTigxLjAsIGdyYXkpOwogICAgICAgICAgICAgICAgZGlzdCA9IChkb3VibGUpKCh4KngpICsgKHkqeSkpIC8gbWF4RGlzdDsKICAgICAgICAgICAgICAgIGludGVuc2l0eSA9IGNvcygoYW5nbGUrKHJvdGF0ZSpkaXN0KlBJKSkgKiBmcmVxKSAqCiAgICAgICAgICAgICAgICAgIGdyYXkgKiBzYXR1cmF0ZTsKICAgICAgICAgICAgICAgIGludGVuc2l0eSA9IChNQVgoTUlOKGludGVuc2l0eSwxLjApLC0xLjApICsgMS4wKSAqIDAuNTsKICAgICAgICAgICAgICAgIGh1ZSA9IChhbmdsZSArIFBJKSAqIElOVl9QSV8zNjAgKyBhb2Zmc2V0OwogICAgICAgICAgICAgICAgcyA9IGdyYXkgKiAoKGRvdWJsZSkoQUJTKHgpK0FCUyh5KSkgLyAoZG91YmxlKShodyArIGhoKSk7CiAgICAgICAgICAgICAgICBzID0gTUlOKE1BWChzLDAuMCksIDEuMCk7CiAgICAgICAgICAgICAgICB2ID0gTUlOKE1BWChpbnRlbnNpdHksMC4wKSwgMS4wKTsKCiAgICAgICAgICAgICAgICBpZiAocyA9PSAwLjApIHsKICAgICAgICAgICAgICAgICAgICBjaCA9ICh1Y2gpKHYgKiAyNTUuMCk7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGNoOwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBjaDsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gY2g7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICgoaHVlIDwgMC4wKSB8fCAoaHVlID49IDM2MC4wKSkKICAgICAgICAgICAgICAgICAgICAgICAgaHVlIC09ICgoKGludCkoaHVlIC8gMzYwLjApKSAqIDM2MC4wKTsKICAgICAgICAgICAgICAgICAgICBodWUgLz0gNjAuMDsKICAgICAgICAgICAgICAgICAgICBpaSA9IChpbnQpaHVlOwogICAgICAgICAgICAgICAgICAgIGYgPSBodWUgLSAoZG91YmxlKWlpOwogICAgICAgICAgICAgICAgICAgIHAgPSAoMS4wIC0gcykgKiB2OwogICAgICAgICAgICAgICAgICAgIHEgPSAoMS4wIC0gKHMgKiBmKSkgKiB2OwogICAgICAgICAgICAgICAgICAgIHQgPSAoMS4wIC0gKHMgKiAoMS4wIC0gZikpKSAqIHY7CiAgICAgICAgICAgICAgICAgICAgaWYgICAgICAoaWkgPT0gMCkgeyByZWQgPSB2OyBncmVlbiA9IHQ7IGJsdWUgPSBwOyB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaWkgPT0gMSkgeyByZWQgPSBxOyBncmVlbiA9IHY7IGJsdWUgPSBwOyB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaWkgPT0gMikgeyByZWQgPSBwOyBncmVlbiA9IHY7IGJsdWUgPSB0OyB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaWkgPT0gMykgeyByZWQgPSBwOyBncmVlbiA9IHE7IGJsdWUgPSB2OyB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaWkgPT0gNCkgeyByZWQgPSB0OyBncmVlbiA9IHA7IGJsdWUgPSB2OyB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaWkgPT0gNSkgeyByZWQgPSB2OyBncmVlbiA9IHA7IGJsdWUgPSBxOyB9CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9ICh1Y2gpKHJlZCAqIDI1NS4wKTsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKHVjaCkoZ3JlZW4gKiAyNTUuMCk7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9ICh1Y2gpKGJsdWUgKiAyNTUuMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJkb25lLlxuIik7CiAgICAgICAgZmZsdXNoKHN0ZGVycik7CiAgICB9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQmxhc3QgYmFja2dyb3VuZCBpbWFnZSB0byBkaXNwbGF5IGJ1ZmZlciBiZWZvcmUgYmVnaW5uaW5nIFBORyBkZWNvZGUuCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBpZiAoZGVwdGggPT0gMjQgfHwgZGVwdGggPT0gMzIpIHsKICAgICAgICB1bGcgcmVkLCBncmVlbiwgYmx1ZTsKICAgICAgICBpbnQgYnBwID0geGltYWdlLT5iaXRzX3Blcl9waXhlbDsKCiAgICAgICAgZm9yIChyb3cgPSAwOyAgcm93IDwgcnBuZzJfaW5mby5oZWlnaHQ7ICArK3JvdykgewogICAgICAgICAgICBzcmMgPSBiZ19kYXRhICsgcm93KmJnX3Jvd2J5dGVzOwogICAgICAgICAgICBkZXN0ID0geGltYWdlLT5kYXRhICsgcm93KnhpbWFnZV9yb3dieXRlczsKICAgICAgICAgICAgaWYgKGJwcCA9PSAzMikgeyAgICAvKiBzbGlnaHRseSBvcHRpbWl6ZWQgdmVyc2lvbiAqLwogICAgICAgICAgICAgICAgZm9yIChpID0gcnBuZzJfaW5mby53aWR0aDsgIGkgPiAwOyAgLS1pKSB7CiAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAqc3JjKys7CiAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAqc3JjKys7CiAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAqc3JjKys7CiAgICAgICAgICAgICAgICAgICAgcGl4ZWwgPSAocmVkICAgPDwgUlNoaWZ0KSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3JlZW4gPDwgR1NoaWZ0KSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmx1ZSAgPDwgQlNoaWZ0KTsKICAgICAgICAgICAgICAgICAgICAvKiByZWNhbGwgdGhhdCB3ZSBzZXQgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3QgYWJvdmUgKi8KICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAyNCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAxNikgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGZvciAoaSA9IHJwbmcyX2luZm8ud2lkdGg7ICBpID4gMDsgIC0taSkgewogICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKnNyYysrOwogICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKnNyYysrOwogICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKnNyYysrOwogICAgICAgICAgICAgICAgICAgIHBpeGVsID0gKHJlZCAgIDw8IFJTaGlmdCkgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdyZWVuIDw8IEdTaGlmdCkgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsdWUgIDw8IEJTaGlmdCk7CiAgICAgICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCiAgICAgICAgICAgICAgICAgICAgLyogR1JSIEJVRz8gIHRoaXMgYXNzdW1lcyBicHAgPT0gMjQgJiBiaXRzIGFyZSBwYWNrZWQgbG93ICovCiAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgIChwcm9iYWJseSBuZWVkIHRvIHVzZSBSU2hpZnQsIFJNYXNrLCBldGMuKSAqLwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgIH0gZWxzZSBpZiAoZGVwdGggPT0gMTYpIHsKICAgICAgICB1c2ggcmVkLCBncmVlbiwgYmx1ZTsKCiAgICAgICAgZm9yIChyb3cgPSAwOyAgcm93IDwgcnBuZzJfaW5mby5oZWlnaHQ7ICArK3JvdykgewogICAgICAgICAgICBzcmMgPSBiZ19kYXRhICsgcm93KmJnX3Jvd2J5dGVzOwogICAgICAgICAgICBkZXN0ID0geGltYWdlLT5kYXRhICsgcm93KnhpbWFnZV9yb3dieXRlczsKICAgICAgICAgICAgZm9yIChpID0gcnBuZzJfaW5mby53aWR0aDsgIGkgPiAwOyAgLS1pKSB7CiAgICAgICAgICAgICAgICByZWQgICA9ICgodXNoKSgqc3JjKSA8PCA4KTsgICsrc3JjOwogICAgICAgICAgICAgICAgZ3JlZW4gPSAoKHVzaCkoKnNyYykgPDwgOCk7ICArK3NyYzsKICAgICAgICAgICAgICAgIGJsdWUgID0gKCh1c2gpKCpzcmMpIDw8IDgpOyAgKytzcmM7CiAgICAgICAgICAgICAgICBwaXhlbCA9ICgocmVkICAgPj4gUlNoaWZ0KSAmIFJNYXNrKSB8CiAgICAgICAgICAgICAgICAgICAgICAgICgoZ3JlZW4gPj4gR1NoaWZ0KSAmIEdNYXNrKSB8CiAgICAgICAgICAgICAgICAgICAgICAgICgoYmx1ZSAgPj4gQlNoaWZ0KSAmIEJNYXNrKTsKICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLwogICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7CiAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICB9IGVsc2UgLyogZGVwdGggPT0gOCAqLyB7CgogICAgICAgIC8qIEdSUjogIGFkZCA4LWJpdCBzdXBwb3J0ICovCgogICAgfQoKICAgIFhQdXRJbWFnZShkaXNwbGF5LCB3aW5kb3csIGdjLCB4aW1hZ2UsIDAsIDAsIDAsIDAsIHJwbmcyX2luZm8ud2lkdGgsCiAgICAgIHJwbmcyX2luZm8uaGVpZ2h0KTsKCiAgICByZXR1cm4gMDsKCn0gLyogZW5kIGZ1bmN0aW9uIHJwbmcyX3hfbG9hZF9iZ19pbWFnZSgpICovCgoKCgoKc3RhdGljIHZvaWQgcnBuZzJfeF9kaXNwbGF5X3Jvdyh1bGcgcm93KQp7CiAgICB1Y2ggYmdfcmVkICAgPSBycG5nMl9pbmZvLmJnX3JlZDsKICAgIHVjaCBiZ19ncmVlbiA9IHJwbmcyX2luZm8uYmdfZ3JlZW47CiAgICB1Y2ggYmdfYmx1ZSAgPSBycG5nMl9pbmZvLmJnX2JsdWU7CiAgICB1Y2ggKnNyYywgKnNyYzI9TlVMTDsKICAgIGNoYXIgKmRlc3Q7CiAgICB1Y2ggciwgZywgYiwgYTsKICAgIGludCB4aW1hZ2Vfcm93Ynl0ZXMgPSB4aW1hZ2UtPmJ5dGVzX3Blcl9saW5lOwogICAgdWxnIGksIHBpeGVsOwogICAgc3RhdGljIGludCByb3dzPTAsIHByZXZwYXNzPSgtMSk7CiAgICBzdGF0aWMgdWxnIGZpcnN0cm93OwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHJvd3MgYW5kIGZpcnN0cm93IHNpbXBseSB0cmFjayBob3cgbWFueSByb3dzIChhbmQgd2hpY2ggb25lcykgaGF2ZSBub3QKICAgIHlldCBiZWVuIGRpc3BsYXllZDsgYWx0ZXJuYXRpdmVseSwgd2UgY291bGQgY2FsbCBYUHV0SW1hZ2UoKSBmb3IgZXZlcnkKICAgIHJvdyBhbmQgbm90IGJvdGhlciB3aXRoIHRoZSByZWNvcmRzLWtlZXBpbmcuCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBUcmFjZSgoc3RkZXJyLCAiYmVnaW5uaW5nIHJwbmcyX3hfZGlzcGxheV9yb3coKVxuIikpCgogICAgaWYgKHJwbmcyX2luZm8ucGFzcyAhPSBwcmV2cGFzcykgewogICAgICAgIGlmIChwYXVzZV9hZnRlcl9wYXNzICYmIHJwbmcyX2luZm8ucGFzcyA+IDApIHsKICAgICAgICAgICAgWEV2ZW50IGU7CiAgICAgICAgICAgIEtleVN5bSBrOwoKICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCiAgICAgICAgICAgICAgIiVzOiAgZW5kIG9mIHBhc3MgJWQgb2YgNzsgY2xpY2sgaW4gaW1hZ2Ugd2luZG93IHRvIGNvbnRpbnVlXG4iLAogICAgICAgICAgICAgIFBST0dOQU1FLCBwcmV2cGFzcyArIDEpOwogICAgICAgICAgICBkbwogICAgICAgICAgICAgICAgWE5leHRFdmVudChkaXNwbGF5LCAmZSk7CiAgICAgICAgICAgIHdoaWxlICghUVVJVChlLGspKTsKICAgICAgICB9CiAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogIHBhc3MgJWQgb2YgN1xyIiwgUFJPR05BTUUsIHJwbmcyX2luZm8ucGFzcyArIDEpOwogICAgICAgIGZmbHVzaChzdGRlcnIpOwogICAgICAgIHByZXZwYXNzID0gcnBuZzJfaW5mby5wYXNzOwogICAgfQoKICAgIGlmIChyb3dzID09IDApCiAgICAgICAgZmlyc3Ryb3cgPSByb3c7ICAgLyogZmlyc3Qgcm93IHRoYXQgaXMgbm90IHlldCBkaXNwbGF5ZWQgKi8KCiAgICArK3Jvd3M7ICAgLyogY291bnQgb2Ygcm93cyByZWNlaXZlZCBidXQgbm90IHlldCBkaXNwbGF5ZWQgKi8KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBBc2lkZSBmcm9tIHRoZSB1c2Ugb2YgdGhlIHJwbmcyX2luZm8gc3RydWN0LCB0aGUgbGFjayBvZiBhbiBvdXRlciBsb29wCiAgICAob3ZlciByb3dzKSBhbmQgbW92aW5nIHRoZSBYUHV0SW1hZ2UoKSBjYWxsIG91dHNpZGUgdGhlICJpZiAoZGVwdGgpIgogICAgdGVzdHMsIHRoaXMgcm91dGluZSBpcyBpZGVudGljYWwgdG8gcnBuZ194X2Rpc3BsYXlfaW1hZ2UoKSBpbiB0aGUgbm9uLQogICAgcHJvZ3Jlc3NpdmUgdmVyc2lvbiBvZiB0aGUgcHJvZ3JhbS4KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIGlmIChkZXB0aCA9PSAyNCB8fCBkZXB0aCA9PSAzMikgewogICAgICAgIHVsZyByZWQsIGdyZWVuLCBibHVlOwogICAgICAgIGludCBicHAgPSB4aW1hZ2UtPmJpdHNfcGVyX3BpeGVsOwoKICAgICAgICBzcmMgPSBycG5nMl9pbmZvLmltYWdlX2RhdGEgKyByb3cqcnBuZzJfaW5mby5yb3dieXRlczsKICAgICAgICBpZiAoYmdfaW1hZ2UpCiAgICAgICAgICAgIHNyYzIgPSBiZ19kYXRhICsgcm93KmJnX3Jvd2J5dGVzOwogICAgICAgIGRlc3QgPSB4aW1hZ2UtPmRhdGEgKyByb3cqeGltYWdlX3Jvd2J5dGVzOwogICAgICAgIGlmIChycG5nMl9pbmZvLmNoYW5uZWxzID09IDMpIHsKICAgICAgICAgICAgZm9yIChpID0gcnBuZzJfaW5mby53aWR0aDsgIGkgPiAwOyAgLS1pKSB7CiAgICAgICAgICAgICAgICByZWQgICA9ICpzcmMrKzsKICAgICAgICAgICAgICAgIGdyZWVuID0gKnNyYysrOwogICAgICAgICAgICAgICAgYmx1ZSAgPSAqc3JjKys7CiAgICAgICAgICAgICAgICBwaXhlbCA9IChyZWQgICA8PCBSU2hpZnQpIHwKICAgICAgICAgICAgICAgICAgICAgICAgKGdyZWVuIDw8IEdTaGlmdCkgfAogICAgICAgICAgICAgICAgICAgICAgICAoYmx1ZSAgPDwgQlNoaWZ0KTsKICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLwogICAgICAgICAgICAgICAgaWYgKGJwcCA9PSAzMikgewogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDI0KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvKiBHUlIgQlVHPyAgdGhpcyBhc3N1bWVzIGJwcCA9PSAyNCAmIGJpdHMgYXJlIHBhY2tlZCBsb3cgKi8KICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgKHByb2JhYmx5IG5lZWQgdG8gdXNlIFJTaGlmdCwgUk1hc2ssIGV0Yy4pICovCiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMTYpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgLyogaWYgKHJwbmcyX2luZm8uY2hhbm5lbHMgPT0gNCkgKi8gewogICAgICAgICAgICBmb3IgKGkgPSBycG5nMl9pbmZvLndpZHRoOyAgaSA+IDA7ICAtLWkpIHsKICAgICAgICAgICAgICAgIHIgPSAqc3JjKys7CiAgICAgICAgICAgICAgICBnID0gKnNyYysrOwogICAgICAgICAgICAgICAgYiA9ICpzcmMrKzsKICAgICAgICAgICAgICAgIGEgPSAqc3JjKys7CiAgICAgICAgICAgICAgICBpZiAoYmdfaW1hZ2UpIHsKICAgICAgICAgICAgICAgICAgICBiZ19yZWQgICA9ICpzcmMyKys7CiAgICAgICAgICAgICAgICAgICAgYmdfZ3JlZW4gPSAqc3JjMisrOwogICAgICAgICAgICAgICAgICAgIGJnX2JsdWUgID0gKnNyYzIrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChhID09IDI1NSkgewogICAgICAgICAgICAgICAgICAgIHJlZCAgID0gcjsKICAgICAgICAgICAgICAgICAgICBncmVlbiA9IGc7CiAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSBiOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhID09IDApIHsKICAgICAgICAgICAgICAgICAgICByZWQgICA9IGJnX3JlZDsKICAgICAgICAgICAgICAgICAgICBncmVlbiA9IGJnX2dyZWVuOwogICAgICAgICAgICAgICAgICAgIGJsdWUgID0gYmdfYmx1ZTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLyogdGhpcyBtYWNybyAoZnJvbSBwbmcuaCkgY29tcG9zaXRlcyB0aGUgZm9yZWdyb3VuZAogICAgICAgICAgICAgICAgICAgICAqIGFuZCBiYWNrZ3JvdW5kIHZhbHVlcyBhbmQgcHV0cyB0aGUgcmVzdWx0IGludG8gdGhlCiAgICAgICAgICAgICAgICAgICAgICogZmlyc3QgYXJndW1lbnQgKi8KICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUocmVkLCAgIHIsIGEsIGJnX3JlZCk7CiAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKGdyZWVuLCBnLCBhLCBiZ19ncmVlbik7CiAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKGJsdWUsICBiLCBhLCBiZ19ibHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHBpeGVsID0gKHJlZCAgIDw8IFJTaGlmdCkgfAogICAgICAgICAgICAgICAgICAgICAgICAoZ3JlZW4gPDwgR1NoaWZ0KSB8CiAgICAgICAgICAgICAgICAgICAgICAgIChibHVlICA8PCBCU2hpZnQpOwogICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCiAgICAgICAgICAgICAgICBpZiAoYnBwID09IDMyKSB7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMjQpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMTYpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8qIEdSUiBCVUc/ICB0aGlzIGFzc3VtZXMgYnBwID09IDI0ICYgYml0cyBhcmUgcGFja2VkIGxvdyAqLwogICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAocHJvYmFibHkgbmVlZCB0byB1c2UgUlNoaWZ0LCBSTWFzaywgZXRjLikgKi8KICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAxNikgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICB9IGVsc2UgaWYgKGRlcHRoID09IDE2KSB7CiAgICAgICAgdXNoIHJlZCwgZ3JlZW4sIGJsdWU7CgogICAgICAgIHNyYyA9IHJwbmcyX2luZm8ucm93X3BvaW50ZXJzW3Jvd107CiAgICAgICAgaWYgKGJnX2ltYWdlKQogICAgICAgICAgICBzcmMyID0gYmdfZGF0YSArIHJvdypiZ19yb3dieXRlczsKICAgICAgICBkZXN0ID0geGltYWdlLT5kYXRhICsgcm93KnhpbWFnZV9yb3dieXRlczsKICAgICAgICBpZiAocnBuZzJfaW5mby5jaGFubmVscyA9PSAzKSB7CiAgICAgICAgICAgIGZvciAoaSA9IHJwbmcyX2luZm8ud2lkdGg7ICBpID4gMDsgIC0taSkgewogICAgICAgICAgICAgICAgcmVkICAgPSAoKHVzaCkoKnNyYykgPDwgOCk7CiAgICAgICAgICAgICAgICArK3NyYzsKICAgICAgICAgICAgICAgIGdyZWVuID0gKCh1c2gpKCpzcmMpIDw8IDgpOwogICAgICAgICAgICAgICAgKytzcmM7CiAgICAgICAgICAgICAgICBibHVlICA9ICgodXNoKSgqc3JjKSA8PCA4KTsKICAgICAgICAgICAgICAgICsrc3JjOwogICAgICAgICAgICAgICAgcGl4ZWwgPSAoKHJlZCAgID4+IFJTaGlmdCkgJiBSTWFzaykgfAogICAgICAgICAgICAgICAgICAgICAgICAoKGdyZWVuID4+IEdTaGlmdCkgJiBHTWFzaykgfAogICAgICAgICAgICAgICAgICAgICAgICAoKGJsdWUgID4+IEJTaGlmdCkgJiBCTWFzayk7CiAgICAgICAgICAgICAgICAvKiByZWNhbGwgdGhhdCB3ZSBzZXQgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3QgYWJvdmUgKi8KICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgLyogaWYgKHJwbmcyX2luZm8uY2hhbm5lbHMgPT0gNCkgKi8gewogICAgICAgICAgICBmb3IgKGkgPSBycG5nMl9pbmZvLndpZHRoOyAgaSA+IDA7ICAtLWkpIHsKICAgICAgICAgICAgICAgIHIgPSAqc3JjKys7CiAgICAgICAgICAgICAgICBnID0gKnNyYysrOwogICAgICAgICAgICAgICAgYiA9ICpzcmMrKzsKICAgICAgICAgICAgICAgIGEgPSAqc3JjKys7CiAgICAgICAgICAgICAgICBpZiAoYmdfaW1hZ2UpIHsKICAgICAgICAgICAgICAgICAgICBiZ19yZWQgICA9ICpzcmMyKys7CiAgICAgICAgICAgICAgICAgICAgYmdfZ3JlZW4gPSAqc3JjMisrOwogICAgICAgICAgICAgICAgICAgIGJnX2JsdWUgID0gKnNyYzIrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChhID09IDI1NSkgewogICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKCh1c2gpciA8PCA4KTsKICAgICAgICAgICAgICAgICAgICBncmVlbiA9ICgodXNoKWcgPDwgOCk7CiAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAoKHVzaCliIDw8IDgpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhID09IDApIHsKICAgICAgICAgICAgICAgICAgICByZWQgICA9ICgodXNoKWJnX3JlZCAgIDw8IDgpOwogICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKCh1c2gpYmdfZ3JlZW4gPDwgOCk7CiAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAoKHVzaCliZ19ibHVlICA8PCA4KTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLyogdGhpcyBtYWNybyAoZnJvbSBwbmcuaCkgY29tcG9zaXRlcyB0aGUgZm9yZWdyb3VuZAogICAgICAgICAgICAgICAgICAgICAqIGFuZCBiYWNrZ3JvdW5kIHZhbHVlcyBhbmQgcHV0cyB0aGUgcmVzdWx0IGJhY2sgaW50bwogICAgICAgICAgICAgICAgICAgICAqIHRoZSBmaXJzdCBhcmd1bWVudCAoPT0gZmcgYnl0ZSBoZXJlOiAgc2FmZSkgKi8KICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUociwgciwgYSwgYmdfcmVkKTsKICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUoZywgZywgYSwgYmdfZ3JlZW4pOwogICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShiLCBiLCBhLCBiZ19ibHVlKTsKICAgICAgICAgICAgICAgICAgICByZWQgICA9ICgodXNoKXIgPDwgOCk7CiAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAoKHVzaClnIDw8IDgpOwogICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKCh1c2gpYiA8PCA4KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHBpeGVsID0gKChyZWQgICA+PiBSU2hpZnQpICYgUk1hc2spIHwKICAgICAgICAgICAgICAgICAgICAgICAgKChncmVlbiA+PiBHU2hpZnQpICYgR01hc2spIHwKICAgICAgICAgICAgICAgICAgICAgICAgKChibHVlICA+PiBCU2hpZnQpICYgQk1hc2spOwogICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCiAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgIH0gZWxzZSAvKiBkZXB0aCA9PSA4ICovIHsKCiAgICAgICAgLyogR1JSOiAgYWRkIDgtYml0IHN1cHBvcnQgKi8KCiAgICB9CgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIERpc3BsYXkgYWZ0ZXIgZXZlcnkgMTYgcm93cyBvciB3aGVuIG9uIG9uZSBvZiBsYXN0IHR3byByb3dzLiAgKFJlZ2lvbgogICAgbWF5IGluY2x1ZGUgcHJldmlvdXNseSBkaXNwbGF5ZWQgbGluZXMgZHVlIHRvIGludGVybGFjaW5nLS1pLmUuLCBub3QKICAgIGNvbnRpZ3VvdXMuICBBbHNvLCBzZWNvbmQtdG8tbGFzdCByb3cgaXMgZmluYWwgb25lIGluIGludGVybGFjZWQgaW1hZ2VzCiAgICB3aXRoIG9kZCBudW1iZXIgb2Ygcm93cy4pICBGb3IgZGVtb3MsIGZsdXNoIChhbmQgZGVsYXkpIGFmdGVyIGV2ZXJ5IDE2dGgKICAgIHJvdyBzbyAic3BhcnNlIiBwYXNzZXMgZG9uJ3QgZ28gdHdpY2UgYXMgZmFzdC4KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIGlmIChkZW1vX3RpbWluZyAmJiAocm93IC0gZmlyc3Ryb3cgPj0gMTYgfHwgcm93ID49IHJwbmcyX2luZm8uaGVpZ2h0LTIpKSB7CiAgICAgICAgWFB1dEltYWdlKGRpc3BsYXksIHdpbmRvdywgZ2MsIHhpbWFnZSwgMCwgKGludClmaXJzdHJvdywgMCwKICAgICAgICAgIChpbnQpZmlyc3Ryb3csIHJwbmcyX2luZm8ud2lkdGgsIHJvdyAtIGZpcnN0cm93ICsgMSk7CiAgICAgICAgWEZsdXNoKGRpc3BsYXkpOwogICAgICAgIHJvd3MgPSAwOwogICAgICAgIHVzbGVlcCh1c2xlZXBfZHVyYXRpb24pOwogICAgfSBlbHNlCiAgICBpZiAoIWRlbW9fdGltaW5nICYmICgocm93cyAmIDB4ZikgPT0gMCB8fCByb3cgPj0gcnBuZzJfaW5mby5oZWlnaHQtMikpIHsKICAgICAgICBYUHV0SW1hZ2UoZGlzcGxheSwgd2luZG93LCBnYywgeGltYWdlLCAwLCAoaW50KWZpcnN0cm93LCAwLAogICAgICAgICAgKGludClmaXJzdHJvdywgcnBuZzJfaW5mby53aWR0aCwgcm93IC0gZmlyc3Ryb3cgKyAxKTsKICAgICAgICBYRmx1c2goZGlzcGxheSk7CiAgICAgICAgcm93cyA9IDA7CiAgICB9Cgp9CgoKCgoKc3RhdGljIHZvaWQgcnBuZzJfeF9maW5pc2hfZGlzcGxheSh2b2lkKQp7CiAgICBUcmFjZSgoc3RkZXJyLCAiYmVnaW5uaW5nIHJwbmcyX3hfZmluaXNoX2Rpc3BsYXkoKVxuIikpCgogICAgLyogbGFzdCByb3cgaGFzIGFscmVhZHkgYmVlbiBkaXNwbGF5ZWQgYnkgcnBuZzJfeF9kaXNwbGF5X3JvdygpLCBzbyB3ZQogICAgICogaGF2ZSBub3RoaW5nIHRvIGRvIGhlcmUgZXhjZXB0IHNldCBhIGZsYWcgYW5kIGxldCB0aGUgdXNlciBrbm93IHRoYXQKICAgICAqIHRoZSBpbWFnZSBpcyBkb25lICovCgogICAgcnBuZzJfaW5mby5zdGF0ZSA9IGtEb25lOwogICAgcHJpbnRmKAogICAgICAiRG9uZS4gIFByZXNzIFEsIEVzYyBvciBtb3VzZSBidXR0b24gMSAod2l0aGluIGltYWdlIHdpbmRvdykgdG8gcXVpdC5cbiIpOwogICAgZmZsdXNoKHN0ZG91dCk7Cn0KCgoKCgpzdGF0aWMgdm9pZCBycG5nMl94X3JlZGlzcGxheV9pbWFnZSh1bGcgc3RhcnRjb2wsIHVsZyBzdGFydHJvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWxnIHdpZHRoLCB1bGcgaGVpZ2h0KQp7CiAgICB1Y2ggYmdfcmVkICAgPSBycG5nMl9pbmZvLmJnX3JlZDsKICAgIHVjaCBiZ19ncmVlbiA9IHJwbmcyX2luZm8uYmdfZ3JlZW47CiAgICB1Y2ggYmdfYmx1ZSAgPSBycG5nMl9pbmZvLmJnX2JsdWU7CiAgICB1Y2ggKnNyYywgKnNyYzI9TlVMTDsKICAgIGNoYXIgKmRlc3Q7CiAgICB1Y2ggciwgZywgYiwgYTsKICAgIHVsZyBpLCByb3csIGxhc3Ryb3cgPSAwOwogICAgdWxnIHBpeGVsOwogICAgaW50IHhpbWFnZV9yb3dieXRlcyA9IHhpbWFnZS0+Ynl0ZXNfcGVyX2xpbmU7CgoKICAgIFRyYWNlKChzdGRlcnIsICJiZWdpbm5pbmcgZGlzcGxheSBsb29wIChpbWFnZV9jaGFubmVscyA9PSAlZClcbiIsCiAgICAgIHJwbmcyX2luZm8uY2hhbm5lbHMpKQogICAgVHJhY2UoKHN0ZGVyciwgIiAgICh3aWR0aCA9ICVsZCwgcm93Ynl0ZXMgPSAlZCwgeGltYWdlX3Jvd2J5dGVzID0gJWQpXG4iLAogICAgICBycG5nMl9pbmZvLndpZHRoLCBycG5nMl9pbmZvLnJvd2J5dGVzLCB4aW1hZ2Vfcm93Ynl0ZXMpKQogICAgVHJhY2UoKHN0ZGVyciwgIiAgIChicHAgPSAlZClcbiIsIHhpbWFnZS0+Yml0c19wZXJfcGl4ZWwpKQogICAgVHJhY2UoKHN0ZGVyciwgIiAgIChieXRlX29yZGVyID0gJXMpXG4iLCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPT0gTVNCRmlyc3Q/CiAgICAgICJNU0JGaXJzdCIgOiAoeGltYWdlLT5ieXRlX29yZGVyID09IExTQkZpcnN0PyAiTFNCRmlyc3QiIDogInVua25vd24iKSkpCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQXNpZGUgZnJvbSB0aGUgdXNlIG9mIHRoZSBycG5nMl9pbmZvIHN0cnVjdCBhbmQgb2Ygc3JjMiAoZm9yIGJhY2tncm91bmQKICAgIGltYWdlKSwgdGhpcyByb3V0aW5lIGlzIGlkZW50aWNhbCB0byBycG5nX3hfZGlzcGxheV9pbWFnZSgpIGluIHRoZSBub24tCiAgICBwcm9ncmVzc2l2ZSB2ZXJzaW9uIG9mIHRoZSBwcm9ncmFtLS1mb3IgdGhlIHNpbXBsZSByZWFzb24gdGhhdCByZWRpc3BsYXkKICAgIG9mIHRoZSBpbWFnZSBhZ2FpbnN0IGEgbmV3IGJhY2tncm91bmQgaGFwcGVucyBhZnRlciB0aGUgaW1hZ2UgaXMgZnVsbHkKICAgIGRlY29kZWQgYW5kIHRoZXJlZm9yZSBpcywgYnkgZGVmaW5pdGlvbiwgbm9uLXByb2dyZXNzaXZlLgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgaWYgKGRlcHRoID09IDI0IHx8IGRlcHRoID09IDMyKSB7CiAgICAgICAgdWxnIHJlZCwgZ3JlZW4sIGJsdWU7CiAgICAgICAgaW50IGJwcCA9IHhpbWFnZS0+Yml0c19wZXJfcGl4ZWw7CgogICAgICAgIGZvciAobGFzdHJvdyA9IHJvdyA9IHN0YXJ0cm93OyAgcm93IDwgc3RhcnRyb3craGVpZ2h0OyAgKytyb3cpIHsKICAgICAgICAgICAgc3JjID0gcnBuZzJfaW5mby5pbWFnZV9kYXRhICsgcm93KnJwbmcyX2luZm8ucm93Ynl0ZXM7CiAgICAgICAgICAgIGlmIChiZ19pbWFnZSkKICAgICAgICAgICAgICAgIHNyYzIgPSBiZ19kYXRhICsgcm93KmJnX3Jvd2J5dGVzOwogICAgICAgICAgICBkZXN0ID0geGltYWdlLT5kYXRhICsgcm93KnhpbWFnZV9yb3dieXRlczsKICAgICAgICAgICAgaWYgKHJwbmcyX2luZm8uY2hhbm5lbHMgPT0gMykgewogICAgICAgICAgICAgICAgZm9yIChpID0gcnBuZzJfaW5mby53aWR0aDsgIGkgPiAwOyAgLS1pKSB7CiAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAqc3JjKys7CiAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAqc3JjKys7CiAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAqc3JjKys7CiNpZmRlZiBOT18yNEJJVF9NQVNLUwogICAgICAgICAgICAgICAgICAgIHBpeGVsID0gKHJlZCAgIDw8IFJTaGlmdCkgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdyZWVuIDw8IEdTaGlmdCkgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsdWUgIDw8IEJTaGlmdCk7CiAgICAgICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCiAgICAgICAgICAgICAgICAgICAgaWYgKGJwcCA9PSAzMikgewogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAyNCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMTYpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIGFzc3VtZXMgYnBwID09IDI0ICYgYml0cyBhcmUgcGFja2VkIGxvdyAqLwogICAgICAgICAgICAgICAgICAgICAgICAvKiAocHJvYmFibHkgbmVlZCB0byB1c2UgUlNoaWZ0LCBSTWFzaywgZXRjLikgKi8KICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMTYpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICB9CiNlbHNlCiAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAoUlNoaWZ0IDwgMCk/IHJlZCAgIDw8ICgtUlNoaWZ0KSA6IHJlZCAgID4+IFJTaGlmdDsKICAgICAgICAgICAgICAgICAgICBncmVlbiA9IChHU2hpZnQgPCAwKT8gZ3JlZW4gPDwgKC1HU2hpZnQpIDogZ3JlZW4gPj4gR1NoaWZ0OwogICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKEJTaGlmdCA8IDApPyBibHVlICA8PCAoLUJTaGlmdCkgOiBibHVlICA+PiBCU2hpZnQ7CiAgICAgICAgICAgICAgICAgICAgcGl4ZWwgPSAocmVkICYgUk1hc2spIHwgKGdyZWVuICYgR01hc2spIHwgKGJsdWUgJiBCTWFzayk7CiAgICAgICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCiAgICAgICAgICAgICAgICAgICAgaWYgKGJwcCA9PSAzMikgewogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAyNCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMTYpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvKiBHUlIgQlVHICovCiAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgYXNzdW1lcyBicHAgPT0gMjQgJiBiaXRzIGFyZSBwYWNrZWQgbG93ICovCiAgICAgICAgICAgICAgICAgICAgICAgIC8qIChwcm9iYWJseSBuZWVkIHRvIHVzZSBSU2hpZnQvUk1hc2svZXRjLiBoZXJlLCB0b28pICovCiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgfQojZW5kaWYKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0gZWxzZSAvKiBpZiAocnBuZzJfaW5mby5jaGFubmVscyA9PSA0KSAqLyB7CiAgICAgICAgICAgICAgICBmb3IgKGkgPSBycG5nMl9pbmZvLndpZHRoOyAgaSA+IDA7ICAtLWkpIHsKICAgICAgICAgICAgICAgICAgICByID0gKnNyYysrOwogICAgICAgICAgICAgICAgICAgIGcgPSAqc3JjKys7CiAgICAgICAgICAgICAgICAgICAgYiA9ICpzcmMrKzsKICAgICAgICAgICAgICAgICAgICBhID0gKnNyYysrOwogICAgICAgICAgICAgICAgICAgIGlmIChiZ19pbWFnZSkgewogICAgICAgICAgICAgICAgICAgICAgICBiZ19yZWQgICA9ICpzcmMyKys7CiAgICAgICAgICAgICAgICAgICAgICAgIGJnX2dyZWVuID0gKnNyYzIrKzsKICAgICAgICAgICAgICAgICAgICAgICAgYmdfYmx1ZSAgPSAqc3JjMisrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoYSA9PSAyNTUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVkICAgPSByOwogICAgICAgICAgICAgICAgICAgICAgICBncmVlbiA9IGc7CiAgICAgICAgICAgICAgICAgICAgICAgIGJsdWUgID0gYjsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGEgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICByZWQgICA9IGJnX3JlZDsKICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSBiZ19ncmVlbjsKICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSBiZ19ibHVlOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgbWFjcm8gKGZyb20gcG5nLmgpIGNvbXBvc2l0ZXMgdGhlIGZvcmVncm91bmQKICAgICAgICAgICAgICAgICAgICAgICAgICogYW5kIGJhY2tncm91bmQgdmFsdWVzIGFuZCBwdXRzIHRoZSByZXN1bHQgaW50byB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICogZmlyc3QgYXJndW1lbnQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKHJlZCwgICByLCBhLCBiZ19yZWQpOwogICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUoZ3JlZW4sIGcsIGEsIGJnX2dyZWVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKGJsdWUsICBiLCBhLCBiZ19ibHVlKTsKICAgICAgICAgICAgICAgICAgICB9CiNpZmRlZiBOT18yNEJJVF9NQVNLUwogICAgICAgICAgICAgICAgICAgIHBpeGVsID0gKHJlZCAgIDw8IFJTaGlmdCkgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdyZWVuIDw8IEdTaGlmdCkgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsdWUgIDw8IEJTaGlmdCk7CiAgICAgICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCiAgICAgICAgICAgICAgICAgICAgaWYgKGJwcCA9PSAzMikgewogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAyNCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMTYpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIGFzc3VtZXMgYnBwID09IDI0ICYgYml0cyBhcmUgcGFja2VkIGxvdyAqLwogICAgICAgICAgICAgICAgICAgICAgICAvKiAocHJvYmFibHkgbmVlZCB0byB1c2UgUlNoaWZ0LCBSTWFzaywgZXRjLikgKi8KICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMTYpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICB9CiNlbHNlCiAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAoUlNoaWZ0IDwgMCk/IHJlZCAgIDw8ICgtUlNoaWZ0KSA6IHJlZCAgID4+IFJTaGlmdDsKICAgICAgICAgICAgICAgICAgICBncmVlbiA9IChHU2hpZnQgPCAwKT8gZ3JlZW4gPDwgKC1HU2hpZnQpIDogZ3JlZW4gPj4gR1NoaWZ0OwogICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKEJTaGlmdCA8IDApPyBibHVlICA8PCAoLUJTaGlmdCkgOiBibHVlICA+PiBCU2hpZnQ7CiAgICAgICAgICAgICAgICAgICAgcGl4ZWwgPSAocmVkICYgUk1hc2spIHwgKGdyZWVuICYgR01hc2spIHwgKGJsdWUgJiBCTWFzayk7CiAgICAgICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCiAgICAgICAgICAgICAgICAgICAgaWYgKGJwcCA9PSAzMikgewogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAyNCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMTYpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvKiBHUlIgQlVHICovCiAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgYXNzdW1lcyBicHAgPT0gMjQgJiBiaXRzIGFyZSBwYWNrZWQgbG93ICovCiAgICAgICAgICAgICAgICAgICAgICAgIC8qIChwcm9iYWJseSBuZWVkIHRvIHVzZSBSU2hpZnQvUk1hc2svZXRjLiBoZXJlLCB0b28pICovCiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgfQojZW5kaWYKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvKiBkaXNwbGF5IGFmdGVyIGV2ZXJ5IDE2IGxpbmVzICovCiAgICAgICAgICAgIGlmICgoKHJvdysxKSAmIDB4ZikgPT0gMCkgewogICAgICAgICAgICAgICAgWFB1dEltYWdlKGRpc3BsYXksIHdpbmRvdywgZ2MsIHhpbWFnZSwgMCwgKGludClsYXN0cm93LCAwLAogICAgICAgICAgICAgICAgICAoaW50KWxhc3Ryb3csIHJwbmcyX2luZm8ud2lkdGgsIDE2KTsKICAgICAgICAgICAgICAgIFhGbHVzaChkaXNwbGF5KTsKICAgICAgICAgICAgICAgIGxhc3Ryb3cgPSByb3cgKyAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgIH0gZWxzZSBpZiAoZGVwdGggPT0gMTYpIHsKICAgICAgICB1c2ggcmVkLCBncmVlbiwgYmx1ZTsKCiAgICAgICAgZm9yIChsYXN0cm93ID0gcm93ID0gc3RhcnRyb3c7ICByb3cgPCBzdGFydHJvdytoZWlnaHQ7ICArK3JvdykgewogICAgICAgICAgICBzcmMgPSBycG5nMl9pbmZvLnJvd19wb2ludGVyc1tyb3ddOwogICAgICAgICAgICBpZiAoYmdfaW1hZ2UpCiAgICAgICAgICAgICAgICBzcmMyID0gYmdfZGF0YSArIHJvdypiZ19yb3dieXRlczsKICAgICAgICAgICAgZGVzdCA9IHhpbWFnZS0+ZGF0YSArIHJvdyp4aW1hZ2Vfcm93Ynl0ZXM7CiAgICAgICAgICAgIGlmIChycG5nMl9pbmZvLmNoYW5uZWxzID09IDMpIHsKICAgICAgICAgICAgICAgIGZvciAoaSA9IHJwbmcyX2luZm8ud2lkdGg7ICBpID4gMDsgIC0taSkgewogICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKCh1c2gpKCpzcmMpIDw8IDgpOwogICAgICAgICAgICAgICAgICAgICsrc3JjOwogICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKCh1c2gpKCpzcmMpIDw8IDgpOwogICAgICAgICAgICAgICAgICAgICsrc3JjOwogICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKCh1c2gpKCpzcmMpIDw8IDgpOwogICAgICAgICAgICAgICAgICAgICsrc3JjOwogICAgICAgICAgICAgICAgICAgIHBpeGVsID0gKChyZWQgICA+PiBSU2hpZnQpICYgUk1hc2spIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZ3JlZW4gPj4gR1NoaWZ0KSAmIEdNYXNrKSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGJsdWUgID4+IEJTaGlmdCkgJiBCTWFzayk7CiAgICAgICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSAvKiBpZiAocnBuZzJfaW5mby5jaGFubmVscyA9PSA0KSAqLyB7CiAgICAgICAgICAgICAgICBmb3IgKGkgPSBycG5nMl9pbmZvLndpZHRoOyAgaSA+IDA7ICAtLWkpIHsKICAgICAgICAgICAgICAgICAgICByID0gKnNyYysrOwogICAgICAgICAgICAgICAgICAgIGcgPSAqc3JjKys7CiAgICAgICAgICAgICAgICAgICAgYiA9ICpzcmMrKzsKICAgICAgICAgICAgICAgICAgICBhID0gKnNyYysrOwogICAgICAgICAgICAgICAgICAgIGlmIChiZ19pbWFnZSkgewogICAgICAgICAgICAgICAgICAgICAgICBiZ19yZWQgICA9ICpzcmMyKys7CiAgICAgICAgICAgICAgICAgICAgICAgIGJnX2dyZWVuID0gKnNyYzIrKzsKICAgICAgICAgICAgICAgICAgICAgICAgYmdfYmx1ZSAgPSAqc3JjMisrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoYSA9PSAyNTUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAoKHVzaClyIDw8IDgpOwogICAgICAgICAgICAgICAgICAgICAgICBncmVlbiA9ICgodXNoKWcgPDwgOCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKCh1c2gpYiA8PCA4KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGEgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICByZWQgICA9ICgodXNoKWJnX3JlZCAgIDw8IDgpOwogICAgICAgICAgICAgICAgICAgICAgICBncmVlbiA9ICgodXNoKWJnX2dyZWVuIDw8IDgpOwogICAgICAgICAgICAgICAgICAgICAgICBibHVlICA9ICgodXNoKWJnX2JsdWUgIDw8IDgpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgbWFjcm8gKGZyb20gcG5nLmgpIGNvbXBvc2l0ZXMgdGhlIGZvcmVncm91bmQKICAgICAgICAgICAgICAgICAgICAgICAgICogYW5kIGJhY2tncm91bmQgdmFsdWVzIGFuZCBwdXRzIHRoZSByZXN1bHQgYmFjayBpbnRvCiAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBmaXJzdCBhcmd1bWVudCAoPT0gZmcgYnl0ZSBoZXJlOiAgc2FmZSkgKi8KICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKHIsIHIsIGEsIGJnX3JlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShnLCBnLCBhLCBiZ19ncmVlbik7CiAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShiLCBiLCBhLCBiZ19ibHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAoKHVzaClyIDw8IDgpOwogICAgICAgICAgICAgICAgICAgICAgICBncmVlbiA9ICgodXNoKWcgPDwgOCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKCh1c2gpYiA8PCA4KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcGl4ZWwgPSAoKHJlZCAgID4+IFJTaGlmdCkgJiBSTWFzaykgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKChncmVlbiA+PiBHU2hpZnQpICYgR01hc2spIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYmx1ZSAgPj4gQlNoaWZ0KSAmIEJNYXNrKTsKICAgICAgICAgICAgICAgICAgICAvKiByZWNhbGwgdGhhdCB3ZSBzZXQgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3QgYWJvdmUgKi8KICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvKiBkaXNwbGF5IGFmdGVyIGV2ZXJ5IDE2IGxpbmVzICovCiAgICAgICAgICAgIGlmICgoKHJvdysxKSAmIDB4ZikgPT0gMCkgewogICAgICAgICAgICAgICAgWFB1dEltYWdlKGRpc3BsYXksIHdpbmRvdywgZ2MsIHhpbWFnZSwgMCwgKGludClsYXN0cm93LCAwLAogICAgICAgICAgICAgICAgICAoaW50KWxhc3Ryb3csIHJwbmcyX2luZm8ud2lkdGgsIDE2KTsKICAgICAgICAgICAgICAgIFhGbHVzaChkaXNwbGF5KTsKICAgICAgICAgICAgICAgIGxhc3Ryb3cgPSByb3cgKyAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgIH0gZWxzZSAvKiBkZXB0aCA9PSA4ICovIHsKCiAgICAgICAgLyogR1JSOiAgYWRkIDgtYml0IHN1cHBvcnQgKi8KCiAgICB9CgogICAgVHJhY2UoKHN0ZGVyciwgImNhbGxpbmcgZmluYWwgWFB1dEltYWdlKClcbiIpKQogICAgaWYgKGxhc3Ryb3cgPCBzdGFydHJvdytoZWlnaHQpIHsKICAgICAgICBYUHV0SW1hZ2UoZGlzcGxheSwgd2luZG93LCBnYywgeGltYWdlLCAwLCAoaW50KWxhc3Ryb3csIDAsCiAgICAgICAgICAoaW50KWxhc3Ryb3csIHJwbmcyX2luZm8ud2lkdGgsIHJwbmcyX2luZm8uaGVpZ2h0LWxhc3Ryb3cpOwogICAgICAgIFhGbHVzaChkaXNwbGF5KTsKICAgIH0KCn0gLyogZW5kIGZ1bmN0aW9uIHJwbmcyX3hfcmVkaXNwbGF5X2ltYWdlKCkgKi8KCgoKCgojaWZkZWYgRkVBVFVSRV9MT09QCgpzdGF0aWMgdm9pZCBycG5nMl94X3JlbG9hZF9iZ19pbWFnZSh2b2lkKQp7CiAgICBjaGFyICpkZXN0OwogICAgdWNoIHIxLCByMiwgZzEsIGcyLCBiMSwgYjI7CiAgICB1Y2ggcjFfaW52LCByMl9pbnYsIGcxX2ludiwgZzJfaW52LCBiMV9pbnYsIGIyX2ludjsKICAgIGludCBrLCBobWF4LCBtYXg7CiAgICBpbnQgeGlkeCwgeWlkeCwgeWlkeF9tYXg7CiAgICBpbnQgZXZlbl9vZGRfdmVydCwgZXZlbl9vZGRfaG9yaXosIGV2ZW5fb2RkOwogICAgaW50IGludmVydF9ncmFkaWVudDIgPSAoYmdbcGF0XS50eXBlICYgMHgwOCk7CiAgICBpbnQgaW52ZXJ0X2NvbHVtbjsKICAgIHVsZyBpLCByb3c7CgoKICAgIGJnc2NhbGUgPSAocGF0ID09IDApPyA4IDogYmdzY2FsZV9kZWZhdWx0OwogICAgeWlkeF9tYXggPSBiZ3NjYWxlIC0gMTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBWZXJ0aWNhbCBncmFkaWVudHMgKHJhbXBzKSBpbiBOeE4gc3F1YXJlcywgYWx0ZXJuYXRpbmcgZGlyZWN0aW9uIGFuZAogICAgY29sb3JzIChOID09IGJnc2NhbGUpLgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgaWYgKChiZ1twYXRdLnR5cGUgJiAweDA3KSA9PSAwKSB7CiAgICAgICAgdWNoIHIxX21pbiAgPSByZ2JbYmdbcGF0XS5yZ2IxX21pbl0ucjsKICAgICAgICB1Y2ggZzFfbWluICA9IHJnYltiZ1twYXRdLnJnYjFfbWluXS5nOwogICAgICAgIHVjaCBiMV9taW4gID0gcmdiW2JnW3BhdF0ucmdiMV9taW5dLmI7CiAgICAgICAgdWNoIHIyX21pbiAgPSByZ2JbYmdbcGF0XS5yZ2IyX21pbl0ucjsKICAgICAgICB1Y2ggZzJfbWluICA9IHJnYltiZ1twYXRdLnJnYjJfbWluXS5nOwogICAgICAgIHVjaCBiMl9taW4gID0gcmdiW2JnW3BhdF0ucmdiMl9taW5dLmI7CiAgICAgICAgaW50IHIxX2RpZmYgPSByZ2JbYmdbcGF0XS5yZ2IxX21heF0uciAtIHIxX21pbjsKICAgICAgICBpbnQgZzFfZGlmZiA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5nIC0gZzFfbWluOwogICAgICAgIGludCBiMV9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMV9tYXhdLmIgLSBiMV9taW47CiAgICAgICAgaW50IHIyX2RpZmYgPSByZ2JbYmdbcGF0XS5yZ2IyX21heF0uciAtIHIyX21pbjsKICAgICAgICBpbnQgZzJfZGlmZiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5nIC0gZzJfbWluOwogICAgICAgIGludCBiMl9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMl9tYXhdLmIgLSBiMl9taW47CgogICAgICAgIGZvciAocm93ID0gMDsgIHJvdyA8IHJwbmcyX2luZm8uaGVpZ2h0OyAgKytyb3cpIHsKICAgICAgICAgICAgeWlkeCA9IChpbnQpKHJvdyAlIGJnc2NhbGUpOwogICAgICAgICAgICBldmVuX29kZF92ZXJ0ID0gKGludCkoKHJvdyAvIGJnc2NhbGUpICYgMSk7CgogICAgICAgICAgICByMSA9IHIxX21pbiArIChyMV9kaWZmICogeWlkeCkgLyB5aWR4X21heDsKICAgICAgICAgICAgZzEgPSBnMV9taW4gKyAoZzFfZGlmZiAqIHlpZHgpIC8geWlkeF9tYXg7CiAgICAgICAgICAgIGIxID0gYjFfbWluICsgKGIxX2RpZmYgKiB5aWR4KSAvIHlpZHhfbWF4OwogICAgICAgICAgICByMV9pbnYgPSByMV9taW4gKyAocjFfZGlmZiAqICh5aWR4X21heC15aWR4KSkgLyB5aWR4X21heDsKICAgICAgICAgICAgZzFfaW52ID0gZzFfbWluICsgKGcxX2RpZmYgKiAoeWlkeF9tYXgteWlkeCkpIC8geWlkeF9tYXg7CiAgICAgICAgICAgIGIxX2ludiA9IGIxX21pbiArIChiMV9kaWZmICogKHlpZHhfbWF4LXlpZHgpKSAvIHlpZHhfbWF4OwoKICAgICAgICAgICAgcjIgPSByMl9taW4gKyAocjJfZGlmZiAqIHlpZHgpIC8geWlkeF9tYXg7CiAgICAgICAgICAgIGcyID0gZzJfbWluICsgKGcyX2RpZmYgKiB5aWR4KSAvIHlpZHhfbWF4OwogICAgICAgICAgICBiMiA9IGIyX21pbiArIChiMl9kaWZmICogeWlkeCkgLyB5aWR4X21heDsKICAgICAgICAgICAgcjJfaW52ID0gcjJfbWluICsgKHIyX2RpZmYgKiAoeWlkeF9tYXgteWlkeCkpIC8geWlkeF9tYXg7CiAgICAgICAgICAgIGcyX2ludiA9IGcyX21pbiArIChnMl9kaWZmICogKHlpZHhfbWF4LXlpZHgpKSAvIHlpZHhfbWF4OwogICAgICAgICAgICBiMl9pbnYgPSBiMl9taW4gKyAoYjJfZGlmZiAqICh5aWR4X21heC15aWR4KSkgLyB5aWR4X21heDsKCiAgICAgICAgICAgIGRlc3QgPSAoY2hhciAqKWJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7CiAgICAgICAgICAgIGZvciAoaSA9IDA7ICBpIDwgcnBuZzJfaW5mby53aWR0aDsgICsraSkgewogICAgICAgICAgICAgICAgZXZlbl9vZGRfaG9yaXogPSAoaW50KSgoaSAvIGJnc2NhbGUpICYgMSk7CiAgICAgICAgICAgICAgICBldmVuX29kZCA9IGV2ZW5fb2RkX3ZlcnQgXiBldmVuX29kZF9ob3JpejsKICAgICAgICAgICAgICAgIGludmVydF9jb2x1bW4gPQogICAgICAgICAgICAgICAgICAoZXZlbl9vZGRfaG9yaXogJiYgKGJnW3BhdF0udHlwZSAmIDB4MTApKTsKICAgICAgICAgICAgICAgIGlmIChldmVuX29kZCA9PSAwKSB7ICAgICAgICAvKiBncmFkaWVudCAjMSAqLwogICAgICAgICAgICAgICAgICAgIGlmIChpbnZlcnRfY29sdW1uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSByMV9pbnY7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBnMV9pbnY7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBiMV9pbnY7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IHIxOwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gZzE7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBiMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgLyogZ3JhZGllbnQgIzIgKi8KICAgICAgICAgICAgICAgICAgICBpZiAoKGludmVydF9jb2x1bW4gJiYgaW52ZXJ0X2dyYWRpZW50MikgfHwKICAgICAgICAgICAgICAgICAgICAgICAgKCFpbnZlcnRfY29sdW1uICYmICFpbnZlcnRfZ3JhZGllbnQyKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSByMjsgICAgICAgLyogbm90IGludmVydGVkIG9yICovCiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBnMjsgICAgICAgLyogIGRvdWJseSBpbnZlcnRlZCAqLwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYjI7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IHIyX2ludjsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGcyX2ludjsgICAvKiBzaW5nbHkgaW52ZXJ0ZWQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGIyX2ludjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU29mdCBncmFkaWVudC1kaWFtb25kcyB3aXRoIHNjYWxlID0gYmdzY2FsZS4gIENvZGUgY29udHJpYnV0ZWQgYnkgQWRhbQogICAgTS4gQ29zdGVsbG8uCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICB9IGVsc2UgaWYgKChiZ1twYXRdLnR5cGUgJiAweDA3KSA9PSAxKSB7CgogICAgICAgIGhtYXggPSAoYmdzY2FsZS0xKS8yOyAgIC8qIGhhbGYgdGhlIG1heCB3ZWlnaHQgb2YgYSBjb2xvciAqLwogICAgICAgIG1heCA9IDIqaG1heDsgICAgICAgICAgIC8qIHRoZSBtYXggd2VpZ2h0IG9mIGEgY29sb3IgKi8KCiAgICAgICAgcjEgPSByZ2JbYmdbcGF0XS5yZ2IxX21heF0ucjsKICAgICAgICBnMSA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5nOwogICAgICAgIGIxID0gcmdiW2JnW3BhdF0ucmdiMV9tYXhdLmI7CiAgICAgICAgcjIgPSByZ2JbYmdbcGF0XS5yZ2IyX21heF0ucjsKICAgICAgICBnMiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5nOwogICAgICAgIGIyID0gcmdiW2JnW3BhdF0ucmdiMl9tYXhdLmI7CgogICAgICAgIGZvciAocm93ID0gMDsgIHJvdyA8IHJwbmcyX2luZm8uaGVpZ2h0OyAgKytyb3cpIHsKICAgICAgICAgICAgeWlkeCA9IChpbnQpKHJvdyAlIGJnc2NhbGUpOwogICAgICAgICAgICBpZiAoeWlkeCA+IGhtYXgpCiAgICAgICAgICAgICAgICB5aWR4ID0gYmdzY2FsZS0xIC0geWlkeDsKICAgICAgICAgICAgZGVzdCA9IChjaGFyICopYmdfZGF0YSArIHJvdypiZ19yb3dieXRlczsKICAgICAgICAgICAgZm9yIChpID0gMDsgIGkgPCBycG5nMl9pbmZvLndpZHRoOyAgKytpKSB7CiAgICAgICAgICAgICAgICB4aWR4ID0gKGludCkoaSAlIGJnc2NhbGUpOwogICAgICAgICAgICAgICAgaWYgKHhpZHggPiBobWF4KQogICAgICAgICAgICAgICAgICAgIHhpZHggPSBiZ3NjYWxlLTEgLSB4aWR4OwogICAgICAgICAgICAgICAgayA9IHhpZHggKyB5aWR4OwogICAgICAgICAgICAgICAgKmRlc3QrKyA9IChrKnIxICsgKG1heC1rKSpyMikgLyBtYXg7CiAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGsqZzEgKyAobWF4LWspKmcyKSAvIG1heDsKICAgICAgICAgICAgICAgICpkZXN0KysgPSAoaypiMSArIChtYXgtaykqYjIpIC8gbWF4OwogICAgICAgICAgICB9CiAgICAgICAgfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFJhZGlhbCAic3RhcmJ1cnN0IiB3aXRoIGF6aW11dGhhbCBzaW51c29pZHM7IFtldmVudHVhbGx5IG51bWJlciBvZiBzaW51LQogICAgc29pZHMgd2lsbCBlcXVhbCBiZ3NjYWxlP10uICBUaGlzIG9uZSBpcyBzbG93IGJ1dCB2ZXJ5IGNvb2wuICBDb2RlIGNvbi0KICAgIHRyaWJ1dGVkIGJ5IFBpZXRlciBTLiB2YW4gZGVyIE1ldWxlbiAob3JpZ2luYWxseSBpbiBTbWFsbHRhbGspLgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgfSBlbHNlIGlmICgoYmdbcGF0XS50eXBlICYgMHgwNykgPT0gMikgewogICAgICAgIHVjaCBjaDsKICAgICAgICBpbnQgaWksIHgsIHksIGh3LCBoaCwgZ3JheXNwb3Q7CiAgICAgICAgZG91YmxlIGZyZXEsIHJvdGF0ZSwgc2F0dXJhdGUsIGdyYXksIGludGVuc2l0eTsKICAgICAgICBkb3VibGUgYW5nbGU9MC4wLCBhb2Zmc2V0PTAuMCwgbWF4RGlzdCwgZGlzdDsKICAgICAgICBkb3VibGUgcmVkPTAuMCwgZ3JlZW49MC4wLCBibHVlPTAuMCwgaHVlLCBzLCB2LCBmLCBwLCBxLCB0OwoKICAgICAgICBoaCA9IChpbnQpKHJwbmcyX2luZm8uaGVpZ2h0IC8gMik7CiAgICAgICAgaHcgPSAoaW50KShycG5nMl9pbmZvLndpZHRoIC8gMik7CgogICAgICAgIC8qIHZhcmlhYmxlcyBmb3IgcmFkaWFsIHdhdmVzOgogICAgICAgICAqICAgYW9mZnNldDogIG51bWJlciBvZiBkZWdyZWVzIHRvIHJvdGF0ZSBodWUgW0NVUlJFTlRMWSBOT1QgVVNFRF0KICAgICAgICAgKiAgIGZyZXE6ICBudW1iZXIgb2YgY29sb3IgYmVhbXMgb3JpZ2luYXRpbmcgZnJvbSB0aGUgY2VudGVyCiAgICAgICAgICogICBncmF5c3BvdDogIHNpemUgb2YgdGhlIGdyYXlpbmcgY2VudGVyIGFyZWEgKGFudGktYWxpYXMpCiAgICAgICAgICogICByb3RhdGU6ICByb3RhdGlvbiBvZiB0aGUgYmVhbXMgYXMgYSBmdW5jdGlvbiBvZiByYWRpdXMKICAgICAgICAgKiAgIHNhdHVyYXRlOiAgc2F0dXJhdGlvbiBvZiBiZWFtcycgc2hhcGUgYXppbXV0aGFsbHkKICAgICAgICAgKi8KICAgICAgICBhbmdsZSA9IENMSVAoYW5nbGUsIDAuMCwgMzYwLjApOwogICAgICAgIGdyYXlzcG90ID0gQ0xJUChiZ1twYXRdLmJnX2dyYXksIDEsIChoaCArIGh3KSk7CiAgICAgICAgZnJlcSA9IE1BWCgoZG91YmxlKWJnW3BhdF0uYmdfZnJlcSwgMC4wKTsKICAgICAgICBzYXR1cmF0ZSA9IChkb3VibGUpYmdbcGF0XS5iZ19ic2F0ICogMC4xOwogICAgICAgIHJvdGF0ZSA9IChkb3VibGUpYmdbcGF0XS5iZ19icm90ICogMC4xOwogICAgICAgIGdyYXkgPSAwLjA7CiAgICAgICAgaW50ZW5zaXR5ID0gMC4wOwogICAgICAgIG1heERpc3QgPSAoZG91YmxlKSgoaHcqaHcpICsgKGhoKmhoKSk7CgogICAgICAgIGZvciAocm93ID0gMDsgIHJvdyA8IHJwbmcyX2luZm8uaGVpZ2h0OyAgKytyb3cpIHsKICAgICAgICAgICAgeSA9IChpbnQpKHJvdyAtIGhoKTsKICAgICAgICAgICAgZGVzdCA9IChjaGFyICopYmdfZGF0YSArIHJvdypiZ19yb3dieXRlczsKICAgICAgICAgICAgZm9yIChpID0gMDsgIGkgPCBycG5nMl9pbmZvLndpZHRoOyAgKytpKSB7CiAgICAgICAgICAgICAgICB4ID0gKGludCkoaSAtIGh3KTsKICAgICAgICAgICAgICAgIGFuZ2xlID0gKHggPT0gMCk/IFBJXzIgOiBhdGFuKChkb3VibGUpeSAvIChkb3VibGUpeCk7CiAgICAgICAgICAgICAgICBncmF5ID0gKGRvdWJsZSlNQVgoQUJTKHkpLCBBQlMoeCkpIC8gZ3JheXNwb3Q7CiAgICAgICAgICAgICAgICBncmF5ID0gTUlOKDEuMCwgZ3JheSk7CiAgICAgICAgICAgICAgICBkaXN0ID0gKGRvdWJsZSkoKHgqeCkgKyAoeSp5KSkgLyBtYXhEaXN0OwogICAgICAgICAgICAgICAgaW50ZW5zaXR5ID0gY29zKChhbmdsZSsocm90YXRlKmRpc3QqUEkpKSAqIGZyZXEpICoKICAgICAgICAgICAgICAgICAgZ3JheSAqIHNhdHVyYXRlOwogICAgICAgICAgICAgICAgaW50ZW5zaXR5ID0gKE1BWChNSU4oaW50ZW5zaXR5LDEuMCksLTEuMCkgKyAxLjApICogMC41OwogICAgICAgICAgICAgICAgaHVlID0gKGFuZ2xlICsgUEkpICogSU5WX1BJXzM2MCArIGFvZmZzZXQ7CiAgICAgICAgICAgICAgICBzID0gZ3JheSAqICgoZG91YmxlKShBQlMoeCkrQUJTKHkpKSAvIChkb3VibGUpKGh3ICsgaGgpKTsKICAgICAgICAgICAgICAgIHMgPSBNSU4oTUFYKHMsMC4wKSwgMS4wKTsKICAgICAgICAgICAgICAgIHYgPSBNSU4oTUFYKGludGVuc2l0eSwwLjApLCAxLjApOwoKICAgICAgICAgICAgICAgIGlmIChzID09IDAuMCkgewogICAgICAgICAgICAgICAgICAgIGNoID0gKHVjaCkodiAqIDI1NS4wKTsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gY2g7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGNoOwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBjaDsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKChodWUgPCAwLjApIHx8IChodWUgPj0gMzYwLjApKQogICAgICAgICAgICAgICAgICAgICAgICBodWUgLT0gKCgoaW50KShodWUgLyAzNjAuMCkpICogMzYwLjApOwogICAgICAgICAgICAgICAgICAgIGh1ZSAvPSA2MC4wOwogICAgICAgICAgICAgICAgICAgIGlpID0gKGludClodWU7CiAgICAgICAgICAgICAgICAgICAgZiA9IGh1ZSAtIChkb3VibGUpaWk7CiAgICAgICAgICAgICAgICAgICAgcCA9ICgxLjAgLSBzKSAqIHY7CiAgICAgICAgICAgICAgICAgICAgcSA9ICgxLjAgLSAocyAqIGYpKSAqIHY7CiAgICAgICAgICAgICAgICAgICAgdCA9ICgxLjAgLSAocyAqICgxLjAgLSBmKSkpICogdjsKICAgICAgICAgICAgICAgICAgICBpZiAgICAgIChpaSA9PSAwKSB7IHJlZCA9IHY7IGdyZWVuID0gdDsgYmx1ZSA9IHA7IH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpaSA9PSAxKSB7IHJlZCA9IHE7IGdyZWVuID0gdjsgYmx1ZSA9IHA7IH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpaSA9PSAyKSB7IHJlZCA9IHA7IGdyZWVuID0gdjsgYmx1ZSA9IHQ7IH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpaSA9PSAzKSB7IHJlZCA9IHA7IGdyZWVuID0gcTsgYmx1ZSA9IHY7IH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpaSA9PSA0KSB7IHJlZCA9IHQ7IGdyZWVuID0gcDsgYmx1ZSA9IHY7IH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpaSA9PSA1KSB7IHJlZCA9IHY7IGdyZWVuID0gcDsgYmx1ZSA9IHE7IH0KICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKHVjaCkocmVkICogMjU1LjApOwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAodWNoKShncmVlbiAqIDI1NS4wKTsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKHVjaCkoYmx1ZSAqIDI1NS4wKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCn0gLyogZW5kIGZ1bmN0aW9uIHJwbmcyX3hfcmVsb2FkX2JnX2ltYWdlKCkgKi8KCgoKCgpzdGF0aWMgaW50IGlzX251bWJlcihjaGFyICpwKQp7CiAgICB3aGlsZSAoKnApIHsKICAgICAgICBpZiAoIWlzZGlnaXQoKnApKQogICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgKytwOwogICAgfQogICAgcmV0dXJuIFRSVUU7Cn0KCiNlbmRpZiAvKiBGRUFUVVJFX0xPT1AgKi8KCgoKCgpzdGF0aWMgdm9pZCBycG5nMl94X2NsZWFudXAodm9pZCkKewogICAgaWYgKGJnX2ltYWdlICYmIGJnX2RhdGEpIHsKICAgICAgICBmcmVlKGJnX2RhdGEpOwogICAgICAgIGJnX2RhdGEgPSBOVUxMOwogICAgfQoKICAgIGlmIChycG5nMl9pbmZvLmltYWdlX2RhdGEpIHsKICAgICAgICBmcmVlKHJwbmcyX2luZm8uaW1hZ2VfZGF0YSk7CiAgICAgICAgcnBuZzJfaW5mby5pbWFnZV9kYXRhID0gTlVMTDsKICAgIH0KCiAgICBpZiAocnBuZzJfaW5mby5yb3dfcG9pbnRlcnMpIHsKICAgICAgICBmcmVlKHJwbmcyX2luZm8ucm93X3BvaW50ZXJzKTsKICAgICAgICBycG5nMl9pbmZvLnJvd19wb2ludGVycyA9IE5VTEw7CiAgICB9CgogICAgaWYgKHhpbWFnZSkgewogICAgICAgIGlmICh4aW1hZ2UtPmRhdGEpIHsKICAgICAgICAgICAgZnJlZSh4aW1hZ2UtPmRhdGEpOyAgICAgICAgICAgLyogd2UgYWxsb2NhdGVkIGl0LCBzbyB3ZSBmcmVlIGl0ICovCiAgICAgICAgICAgIHhpbWFnZS0+ZGF0YSA9IChjaGFyICopTlVMTDsgIC8qICBpbnN0ZWFkIG9mIFhEZXN0cm95SW1hZ2UoKSAqLwogICAgICAgIH0KICAgICAgICBYRGVzdHJveUltYWdlKHhpbWFnZSk7CiAgICAgICAgeGltYWdlID0gTlVMTDsKICAgIH0KCiAgICBpZiAoaGF2ZV9nYykKICAgICAgICBYRnJlZUdDKGRpc3BsYXksIGdjKTsKCiAgICBpZiAoaGF2ZV93aW5kb3cpCiAgICAgICAgWERlc3Ryb3lXaW5kb3coZGlzcGxheSwgd2luZG93KTsKCiAgICBpZiAoaGF2ZV9jb2xvcm1hcCkKICAgICAgICBYRnJlZUNvbG9ybWFwKGRpc3BsYXksIGNvbG9ybWFwKTsKCiAgICBpZiAoaGF2ZV9ub25kZWZhdWx0X3Zpc3VhbCkKICAgICAgICBYRnJlZSh2aXN1YWxfbGlzdCk7Cn0KCgoKCgpzdGF0aWMgaW50IHJwbmcyX3hfbXNiKHVsZyB1MzJ2YWwpCnsKICAgIGludCBpOwoKICAgIGZvciAoaSA9IDMxOyAgaSA+PSAwOyAgLS1pKSB7CiAgICAgICAgaWYgKHUzMnZhbCAmIDB4ODAwMDAwMDBMKQogICAgICAgICAgICBicmVhazsKICAgICAgICB1MzJ2YWwgPDw9IDE7CiAgICB9CiAgICByZXR1cm4gaTsKfQo=