LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgIHJwbmcgLSBzaW1wbGUgUE5HIGRpc3BsYXkgcHJvZ3JhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBycG5nLXguYwoKICAgVGhpcyBwcm9ncmFtIGRlY29kZXMgYW5kIGRpc3BsYXlzIFBORyBpbWFnZXMsIHdpdGggZ2FtbWEgY29ycmVjdGlvbiBhbmQKICAgb3B0aW9uYWxseSB3aXRoIGEgdXNlci1zcGVjaWZpZWQgYmFja2dyb3VuZCBjb2xvciAoaW4gY2FzZSB0aGUgaW1hZ2UgaGFzCiAgIHRyYW5zcGFyZW5jeSkuICBJdCBpcyB2ZXJ5IG5lYXJseSB0aGUgbW9zdCBiYXNpYyBQTkcgdmlld2VyIHBvc3NpYmxlLgogICBUaGlzIHZlcnNpb24gaXMgZm9yIHRoZSBYIFdpbmRvdyBTeXN0ZW0gKHRlc3RlZCBieSBhdXRob3IgdW5kZXIgVW5peCBhbmQKICAgYnkgTWFydGluIFppbnNlciB1bmRlciBPcGVuVk1TOyBtYXkgd29yayB1bmRlciBPUy8yIHdpdGggc29tZSB0d2Vha2luZykuCgogICB0byBkbzoKICAgIC0gOC1iaXQgKGNvbG9ybWFwcGVkKSBYIHN1cHBvcnQKICAgIC0gdXNlICUuMTAyM3MgdG8gc2ltcGxpZnkgdHJ1bmNhdGlvbiBvZiB0aXRsZS1iYXIgc3RyaW5nPwoKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgIENoYW5nZWxvZzoKICAgIC0gMS4wMTogIGluaXRpYWwgcHVibGljIHJlbGVhc2UKICAgIC0gMS4wMjogIG1vZGlmaWVkIHRvIGFsbG93IGFiYnJldmlhdGVkIG9wdGlvbnM7IGZpeGVkIGxvbmcvdWxvbmcgbWlzLQogICAgICAgICAgICAgIG1hdGNoOyBzd2l0Y2hlZCB0byBwbmdfam1wYnVmKCkgbWFjcm8KICAgIC0gMS4xMDogIGFkZGVkIHN1cHBvcnQgZm9yIG5vbi1kZWZhdWx0IHZpc3VhbHM7IGZpeGVkIFggcGl4ZWwtY29udmVyc2lvbgogICAgLSAxLjExOiAgYWRkZWQgZXh0cmEgc2V0IG9mIHBhcmVudGhlc2VzIHRvIHBuZ19qbXBidWYoKSBtYWNybzsgZml4ZWQKICAgICAgICAgICAgICBjb21tYW5kLWxpbmUgcGFyc2luZyBidWcKICAgIC0gMS4xMjogIGZpeGVkIHNvbWUgc21hbGwgWCBtZW1vcnkgbGVha3MgKHRoYW5rcyB0byBGcmFu529pcyBQZXRpdGplYW4pCiAgICAtIDEuMTM6ICBmaXhlZCBYRnJlZUdDKCkgY3Jhc2ggYnVnICh0aGFua3MgdG8gUGF0cmljayBXZWxjaGUpCiAgICAtIDEuMTQ6ICBhZGRlZCBzdXBwb3J0IGZvciBYIHJlc291cmNlcyAodGhhbmtzIHRvIEdlcmhhcmQgTmlrbGFzY2gpCiAgICAtIDIuMDA6ICBkdWFsLWxpY2Vuc2VkIChhZGRlZCBHTlUgR1BMKQogICAgLSAyLjAxOiAgZml4ZWQgaW1wcm9wZXIgZGlzcGxheSBvZiB1c2FnZSBzY3JlZW4gb24gUE5HIGVycm9yKHMpCiAgICAtIDIuMDI6ICBBZGRlZCAidm9pZChhcmdjKTsiIHN0YXRlbWVudCB0byBxdWlldCBwZWRhbnRpYyBjb21waWxlciB3YXJuaW5ncwogICAgICAgICAgICAgYWJvdXQgdW51c2VkIHZhcmlhYmxlIChHUi1QKQogICAgLSAyLjAzOiAgY2hlY2sgZm9yIGludGVnZXIgb3ZlcmZsb3cgKEdsZW5uIFItUCkKCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwOCwgMjAxNyBHcmVnIFJvZWxvZnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgoKICAgICAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMsIiB3aXRob3V0IHdhcnJhbnR5IG9mIGFueSBraW5kLAogICAgICBleHByZXNzIG9yIGltcGxpZWQuICBJbiBubyBldmVudCBzaGFsbCB0aGUgYXV0aG9yIG9yIGNvbnRyaWJ1dG9ycwogICAgICBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBpbiBhbnkgd2F5IGZyb20gdGhlIHVzZSBvZgogICAgICB0aGlzIHNvZnR3YXJlLgoKICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgRFVBTC1MSUNFTlNFRC4gIFlvdSBtYXkgbW9kaWZ5IGFuZC9vcgogICAgICByZWRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIG9uZSBvZiB0aGUKICAgICAgZm9sbG93aW5nIHR3byBsaWNlbnNlcyAoYXQgeW91ciBvcHRpb24pOgoKCiAgICAgIExJQ0VOU0UgMSAoIkJTRC1saWtlIHdpdGggYWR2ZXJ0aXNpbmcgY2xhdXNlIik6CgogICAgICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKICAgICAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZQogICAgICBpdCBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CgogICAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucy4KICAgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICAgICAgICAgbm90aWNlLCBkaXNjbGFpbWVyLCBhbmQgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgaW4gdGhlIGRvY3VtZW50YS0KICAgICAgICAgdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICAgICAgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCiAgICAgICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgoKICAgICAgICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBHcmVnIFJvZWxvZnMKICAgICAgICAgICAgYW5kIGNvbnRyaWJ1dG9ycyBmb3IgdGhlIGJvb2ssICJQTkc6IFRoZSBEZWZpbml0aXZlIEd1aWRlLCIKICAgICAgICAgICAgcHVibGlzaGVkIGJ5IE8nUmVpbGx5IGFuZCBBc3NvY2lhdGVzLgoKCiAgICAgIExJQ0VOU0UgMiAoR05VIEdQTCB2MiBvciBsYXRlcik6CgogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCiAgICAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiNkZWZpbmUgUFJPR05BTUUgICJycG5nLXgiCiNkZWZpbmUgTE9OR05BTUUgICJTaW1wbGUgUE5HIFZpZXdlciBmb3IgWCIKI2RlZmluZSBWRVJTSU9OICAgIjIuMDIgb2YgMTUgSnVuZSAyMDE0IgojZGVmaW5lIFJFU05BTUUgICAicnBuZyIgICAgICAgIC8qIG91ciBYIHJlc291cmNlIGFwcGxpY2F0aW9uIG5hbWUgKi8KI2RlZmluZSBSRVNDTEFTUyAgIlJwbmciICAgICAgICAvKiBvdXIgWCByZXNvdXJjZSBjbGFzcyBuYW1lICovCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDx0aW1lLmg+CiNpbmNsdWRlIDxYMTEvWGxpYi5oPgojaW5jbHVkZSA8WDExL1h1dGlsLmg+CiNpbmNsdWRlIDxYMTEvWG9zLmg+CiNpbmNsdWRlIDxYMTEva2V5c3ltLmg+CgovKiAjZGVmaW5lIERFQlVHICA6ICB0aGlzIGVuYWJsZXMgdGhlIFRyYWNlKCkgbWFjcm9zICovCgojaW5jbHVkZSAicmVhZHBuZy5oIiAgIC8qIHR5cGVkZWZzLCBjb21tb24gbWFjcm9zLCByZWFkcG5nIHByb3RvdHlwZXMgKi8KCgovKiBjb3VsZCBqdXN0IGluY2x1ZGUgcG5nLmgsIGJ1dCB0aGlzIG1hY3JvIGlzIHRoZSBvbmx5IHRoaW5nIHdlIG5lZWQKICogKG5hbWUgYW5kIHR5cGVkZWZzIGNoYW5nZWQgdG8gbG9jYWwgdmVyc2lvbnMpOyBub3RlIHRoYXQgc2lkZSBlZmZlY3RzCiAqIG9ubHkgaGFwcGVuIHdpdGggYWxwaGEgKHdoaWNoIGNvdWxkIGVhc2lseSBiZSBhdm9pZGVkIHdpdGgKICogInVzaCBhY29weSA9IChhbHBoYSk7IikgKi8KCiNkZWZpbmUgYWxwaGFfY29tcG9zaXRlKGNvbXBvc2l0ZSwgZmcsIGFscGhhLCBiZykgeyAgICAgICAgICAgICAgIFwKICAgIHVzaCB0ZW1wID0gKCh1c2gpKGZnKSoodXNoKShhbHBoYSkgKyAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgKHVzaCkoYmcpKih1c2gpKDI1NSAtICh1c2gpKGFscGhhKSkgKyAodXNoKTEyOCk7ICBcCiAgICAoY29tcG9zaXRlKSA9ICh1Y2gpKCh0ZW1wICsgKHRlbXAgPj4gOCkpID4+IDgpOyAgICAgICAgICAgICAgIFwKfQoKCi8qIGxvY2FsIHByb3RvdHlwZXMgKi8Kc3RhdGljIGludCAgcnBuZ194X2NyZWF0ZV93aW5kb3codm9pZCk7CnN0YXRpYyBpbnQgIHJwbmdfeF9kaXNwbGF5X2ltYWdlKHZvaWQpOwpzdGF0aWMgdm9pZCBycG5nX3hfY2xlYW51cCh2b2lkKTsKc3RhdGljIGludCAgcnBuZ194X21zYih1bGcgdTMydmFsKTsKCgpzdGF0aWMgY2hhciB0aXRsZWJhclsxMDI0XSwgKndpbmRvd19uYW1lID0gdGl0bGViYXI7CnN0YXRpYyBjaGFyICphcHBuYW1lID0gTE9OR05BTUU7CnN0YXRpYyBjaGFyICppY29uX25hbWUgPSBQUk9HTkFNRTsKc3RhdGljIGNoYXIgKnJlc19uYW1lID0gUkVTTkFNRTsKc3RhdGljIGNoYXIgKnJlc19jbGFzcyA9IFJFU0NMQVNTOwpzdGF0aWMgY2hhciAqZmlsZW5hbWU7CnN0YXRpYyBGSUxFICppbmZpbGU7CgpzdGF0aWMgY2hhciAqYmdzdHI7CnN0YXRpYyB1Y2ggYmdfcmVkPTAsIGJnX2dyZWVuPTAsIGJnX2JsdWU9MDsKCnN0YXRpYyBkb3VibGUgZGlzcGxheV9leHBvbmVudDsKCnN0YXRpYyB1bGcgaW1hZ2Vfd2lkdGgsIGltYWdlX2hlaWdodCwgaW1hZ2Vfcm93Ynl0ZXM7CnN0YXRpYyBpbnQgaW1hZ2VfY2hhbm5lbHM7CnN0YXRpYyB1Y2ggKmltYWdlX2RhdGE7CgovKiBYLXNwZWNpZmljIHZhcmlhYmxlcyAqLwpzdGF0aWMgY2hhciAqZGlzcGxheW5hbWU7CnN0YXRpYyBYSW1hZ2UgKnhpbWFnZTsKc3RhdGljIERpc3BsYXkgKmRpc3BsYXk7CnN0YXRpYyBpbnQgZGVwdGg7CnN0YXRpYyBWaXN1YWwgKnZpc3VhbDsKc3RhdGljIFhWaXN1YWxJbmZvICp2aXN1YWxfbGlzdDsKc3RhdGljIGludCBSU2hpZnQsIEdTaGlmdCwgQlNoaWZ0OwpzdGF0aWMgdWxnIFJNYXNrLCBHTWFzaywgQk1hc2s7CnN0YXRpYyBXaW5kb3cgd2luZG93OwpzdGF0aWMgR0MgZ2M7CnN0YXRpYyBDb2xvcm1hcCBjb2xvcm1hcDsKCnN0YXRpYyBpbnQgaGF2ZV9ub25kZWZhdWx0X3Zpc3VhbCA9IEZBTFNFOwpzdGF0aWMgaW50IGhhdmVfY29sb3JtYXAgPSBGQUxTRTsKc3RhdGljIGludCBoYXZlX3dpbmRvdyA9IEZBTFNFOwpzdGF0aWMgaW50IGhhdmVfZ2MgPSBGQUxTRTsKLyoKdWxnIG51bWNvbG9ycz0wLCBwaXhlbHNbMjU2XTsKdXNoIHJlZHNbMjU2XSwgZ3JlZW5zWzI1Nl0sIGJsdWVzWzI1Nl07CiAqLwoKCgoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7CiNpZmRlZiBzZ2kKICAgIGNoYXIgdG1wbGluZVs4MF07CiNlbmRpZgogICAgY2hhciAqcDsKICAgIGludCByYywgYWxlbiwgZmxlbjsKICAgIGludCBlcnJvciA9IDA7CiAgICBpbnQgaGF2ZV9iZyA9IEZBTFNFOwogICAgZG91YmxlIExVVF9leHBvbmVudDsgICAgICAgICAgICAgICAvKiBqdXN0IHRoZSBsb29rdXAgdGFibGUgKi8KICAgIGRvdWJsZSBDUlRfZXhwb25lbnQgPSAyLjI7ICAgICAgICAgLyoganVzdCB0aGUgbW9uaXRvciAqLwogICAgZG91YmxlIGRlZmF1bHRfZGlzcGxheV9leHBvbmVudDsgICAvKiB3aG9sZSBkaXNwbGF5IHN5c3RlbSAqLwogICAgWEV2ZW50IGU7CiAgICBLZXlTeW0gazsKCgogICAgZGlzcGxheW5hbWUgPSAoY2hhciAqKU5VTEw7CiAgICBmaWxlbmFtZSA9IChjaGFyICopTlVMTDsKCgogICAgLyogRmlyc3Qgc2V0IHRoZSBkZWZhdWx0IHZhbHVlIGZvciBvdXIgZGlzcGxheS1zeXN0ZW0gZXhwb25lbnQsIGkuZS4sCiAgICAgKiB0aGUgcHJvZHVjdCBvZiB0aGUgQ1JUIGV4cG9uZW50IGFuZCB0aGUgZXhwb25lbnQgY29ycmVzcG9uZGluZyB0bwogICAgICogdGhlIGZyYW1lLWJ1ZmZlcidzIGxvb2t1cCB0YWJsZSAoTFVUKSwgaWYgYW55LiAgVGhpcyBpcyBub3QgYW4KICAgICAqIGV4aGF1c3RpdmUgbGlzdCBvZiBMVVQgdmFsdWVzIChlLmcuLCBPcGVuU3RlcCBoYXMgYSBsb3Qgb2Ygd2VpcmQKICAgICAqIG9uZXMpLCBidXQgaXQgc2hvdWxkIGNvdmVyIDk5JSBvZiB0aGUgY3VycmVudCBwb3NzaWJpbGl0aWVzLiAqLwoKI2lmIGRlZmluZWQoTmVYVCkKICAgIExVVF9leHBvbmVudCA9IDEuMCAvIDIuMjsKICAgIC8qCiAgICBpZiAoc29tZV9uZXh0X2Z1bmN0aW9uX3RoYXRfcmV0dXJuc19nYW1tYSgmbmV4dF9nYW1tYSkpCiAgICAgICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gbmV4dF9nYW1tYTsKICAgICAqLwojZWxpZiBkZWZpbmVkKHNnaSkKICAgIExVVF9leHBvbmVudCA9IDEuMCAvIDEuNzsKICAgIC8qIHRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhbnkgZG9jdW1lbnRlZCBmdW5jdGlvbiB0byBnZXQgdGhlCiAgICAgKiAiZ2FtbWEiIHZhbHVlLCBzbyB3ZSBkbyBpdCB0aGUgaGFyZCB3YXkgKi8KICAgIGluZmlsZSA9IGZvcGVuKCIvZXRjL2NvbmZpZy9zeXN0ZW0uZ2xHYW1tYVZhbCIsICJyIik7CiAgICBpZiAoaW5maWxlKSB7CiAgICAgICAgZG91YmxlIHNnaV9nYW1tYTsKCiAgICAgICAgZmdldHModG1wbGluZSwgODAsIGluZmlsZSk7CiAgICAgICAgZmNsb3NlKGluZmlsZSk7CiAgICAgICAgc2dpX2dhbW1hID0gYXRvZih0bXBsaW5lKTsKICAgICAgICBpZiAoc2dpX2dhbW1hID4gMC4wKQogICAgICAgICAgICBMVVRfZXhwb25lbnQgPSAxLjAgLyBzZ2lfZ2FtbWE7CiAgICB9CiNlbGlmIGRlZmluZWQoTWFjaW50b3NoKQogICAgTFVUX2V4cG9uZW50ID0gMS44IC8gMi42MTsKICAgIC8qCiAgICBpZiAoc29tZV9tYWNfZnVuY3Rpb25fdGhhdF9yZXR1cm5zX2dhbW1hKCZtYWNfZ2FtbWEpKQogICAgICAgIExVVF9leHBvbmVudCA9IG1hY19nYW1tYSAvIDIuNjE7CiAgICAgKi8KI2Vsc2UKICAgIExVVF9leHBvbmVudCA9IDEuMDsgICAvKiBhc3N1bWUgbm8gTFVUOiAgbW9zdCBQQ3MgKi8KI2VuZGlmCgogICAgLyogdGhlIGRlZmF1bHRzIGFib3ZlIGdpdmUgMS4wLCAxLjMsIDEuNSBhbmQgMi4yLCByZXNwZWN0aXZlbHk6ICovCiAgICBkZWZhdWx0X2Rpc3BsYXlfZXhwb25lbnQgPSBMVVRfZXhwb25lbnQgKiBDUlRfZXhwb25lbnQ7CgoKICAgIC8qIElmIHRoZSB1c2VyIGhhcyBzZXQgdGhlIFNDUkVFTl9HQU1NQSBlbnZpcm9ubWVudCB2YXJpYWJsZSBhcyBzdWdnZXN0ZWQKICAgICAqIChzb21ld2hhdCBpbXByZWNpc2VseSkgaW4gdGhlIGxpYnBuZyBkb2N1bWVudGF0aW9uLCB1c2UgdGhhdDsgb3RoZXJ3aXNlCiAgICAgKiB1c2UgdGhlIGRlZmF1bHQgdmFsdWUgd2UganVzdCBjYWxjdWxhdGVkLiAgRWl0aGVyIHdheSwgdGhlIHVzZXIgbWF5CiAgICAgKiBvdmVycmlkZSB0aGlzIHZpYSBhIGNvbW1hbmQtbGluZSBvcHRpb24uICovCgogICAgaWYgKChwID0gZ2V0ZW52KCJTQ1JFRU5fR0FNTUEiKSkgIT0gTlVMTCkKICAgICAgICBkaXNwbGF5X2V4cG9uZW50ID0gYXRvZihwKTsKICAgIGVsc2UKICAgICAgICBkaXNwbGF5X2V4cG9uZW50ID0gZGVmYXVsdF9kaXNwbGF5X2V4cG9uZW50OwoKCiAgICAvKiBOb3cgcGFyc2UgdGhlIGNvbW1hbmQgbGluZSBmb3Igb3B0aW9ucyBhbmQgdGhlIFBORyBmaWxlbmFtZS4gKi8KCiAgICB3aGlsZSAoKisrYXJndiAmJiAhZXJyb3IpIHsKICAgICAgICBpZiAoIXN0cm5jbXAoKmFyZ3YsICItZGlzcGxheSIsIDIpKSB7CiAgICAgICAgICAgIGlmICghKisrYXJndikKICAgICAgICAgICAgICAgICsrZXJyb3I7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGRpc3BsYXluYW1lID0gKmFyZ3Y7CiAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcCgqYXJndiwgIi1nYW1tYSIsIDIpKSB7CiAgICAgICAgICAgIGlmICghKisrYXJndikKICAgICAgICAgICAgICAgICsrZXJyb3I7CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgZGlzcGxheV9leHBvbmVudCA9IGF0b2YoKmFyZ3YpOwogICAgICAgICAgICAgICAgaWYgKGRpc3BsYXlfZXhwb25lbnQgPD0gMC4wKQogICAgICAgICAgICAgICAgICAgICsrZXJyb3I7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKCphcmd2LCAiLWJnY29sb3IiLCAyKSkgewogICAgICAgICAgICBpZiAoISorK2FyZ3YpCiAgICAgICAgICAgICAgICArK2Vycm9yOwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGJnc3RyID0gKmFyZ3Y7CiAgICAgICAgICAgICAgICBpZiAoc3RybGVuKGJnc3RyKSAhPSA3IHx8IGJnc3RyWzBdICE9ICcjJykKICAgICAgICAgICAgICAgICAgICArK2Vycm9yOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIGhhdmVfYmcgPSBUUlVFOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCoqYXJndiAhPSAnLScpIHsKICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gKmFyZ3Y7CiAgICAgICAgICAgICAgICBpZiAoYXJndlsxXSkgICAvKiBzaG91bGRuJ3QgYmUgYW55IG1vcmUgYXJncyBhZnRlciBmaWxlbmFtZSAqLwogICAgICAgICAgICAgICAgICAgICsrZXJyb3I7CiAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgKytlcnJvcjsgICAvKiBub3QgZXhwZWN0aW5nIGFueSBvdGhlciBvcHRpb25zICovCiAgICAgICAgfQogICAgfQoKICAgIGlmICghZmlsZW5hbWUpCiAgICAgICAgKytlcnJvcjsKCgogICAgLyogcHJpbnQgdXNhZ2Ugc2NyZWVuIGlmIGFueSBlcnJvcnMgdXAgdG8gdGhpcyBwb2ludCAqLwoKICAgIGlmIChlcnJvcikgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4lcyAlczogICVzXG4iLCBQUk9HTkFNRSwgVkVSU0lPTiwgYXBwbmFtZSk7CiAgICAgICAgcmVhZHBuZ192ZXJzaW9uX2luZm8oKTsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIgogICAgICAgICAgIlVzYWdlOiAgJXMgWy1kaXNwbGF5IHhkcHldIFstZ2FtbWEgZXhwXSBbLWJnY29sb3IgYmddIGZpbGUucG5nXG4iCiAgICAgICAgICAiICAgIHhkcHlcdG5hbWUgb2YgdGhlIHRhcmdldCBYIGRpc3BsYXkgKGUuZy4sIGBgaG9zdG5hbWU6MCcnKVxuIgogICAgICAgICAgIiAgICBleHAgXHR0cmFuc2Zlci1mdW5jdGlvbiBleHBvbmVudCAoYGBnYW1tYScnKSBvZiB0aGUgZGlzcGxheVxuIgogICAgICAgICAgIlx0XHQgIHN5c3RlbSBpbiBmbG9hdGluZy1wb2ludCBmb3JtYXQgKGUuZy4sIGBgJS4xZicnKTsgZXF1YWxcbiIsCiAgICAgICAgICBQUk9HTkFNRSwgZGVmYXVsdF9kaXNwbGF5X2V4cG9uZW50KTsKCiAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIKICAgICAgICAgICJcdFx0ICB0byB0aGUgcHJvZHVjdCBvZiB0aGUgbG9va3VwLXRhYmxlIGV4cG9uZW50ICh2YXJpZXMpXG4iCiAgICAgICAgICAiXHRcdCAgYW5kIHRoZSBDUlQgZXhwb25lbnQgKHVzdWFsbHkgMi4yKTsgbXVzdCBiZSBwb3NpdGl2ZVxuIgogICAgICAgICAgIiAgICBiZyAgXHRkZXNpcmVkIGJhY2tncm91bmQgY29sb3IgaW4gNy1jaGFyYWN0ZXIgaGV4IFJHQiBmb3JtYXRcbiIKICAgICAgICAgICJcdFx0ICAoZS5nLiwgYGAjZmY3NzAwJycgZm9yIG9yYW5nZTogIHNhbWUgYXMgSFRNTCBjb2xvcnMpO1xuIgogICAgICAgICAgIlx0XHQgIHVzZWQgd2l0aCB0cmFuc3BhcmVudCBpbWFnZXNcbiIKICAgICAgICAgICJcblByZXNzIFEsIEVzYyBvciBtb3VzZSBidXR0b24gMSAod2l0aGluIGltYWdlIHdpbmRvdywgYWZ0ZXIgaW1hZ2VcbiIKICAgICAgICAgICJpcyBkaXNwbGF5ZWQpIHRvIHF1aXQuXG4iKTsKICAgICAgICBleGl0KDEpOwogICAgfQoKCiAgICBpZiAoIShpbmZpbGUgPSBmb3BlbihmaWxlbmFtZSwgInJiIikpKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBjYW4ndCBvcGVuIFBORyBmaWxlIFslc11cbiIsIGZpbGVuYW1lKTsKICAgICAgICArK2Vycm9yOwogICAgfSBlbHNlIHsKICAgICAgICBpZiAoKHJjID0gcmVhZHBuZ19pbml0KGluZmlsZSwgJmltYWdlX3dpZHRoLCAmaW1hZ2VfaGVpZ2h0KSkgIT0gMCkgewogICAgICAgICAgICBzd2l0Y2ggKHJjKSB7CiAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCiAgICAgICAgICAgICAgICAgICAgICAiOiAgWyVzXSBpcyBub3QgYSBQTkcgZmlsZTogaW5jb3JyZWN0IHNpZ25hdHVyZVxuIiwKICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKICAgICAgICAgICAgICAgICAgICAgICI6ICBbJXNdIGhhcyBiYWQgSUhEUiAobGlicG5nIGxvbmdqbXApXG4iLCBmaWxlbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBpbnN1ZmZpY2llbnQgbWVtb3J5XG4iKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCiAgICAgICAgICAgICAgICAgICAgICAiOiAgdW5rbm93biByZWFkcG5nX2luaXQoKSBlcnJvclxuIik7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKytlcnJvcjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkaXNwbGF5ID0gWE9wZW5EaXNwbGF5KGRpc3BsYXluYW1lKTsKICAgICAgICAgICAgaWYgKCFkaXNwbGF5KSB7CiAgICAgICAgICAgICAgICByZWFkcG5nX2NsZWFudXAoVFJVRSk7CiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGNhbid0IG9wZW4gWCBkaXNwbGF5IFslc11cbiIsCiAgICAgICAgICAgICAgICAgIGRpc3BsYXluYW1lPyBkaXNwbGF5bmFtZSA6ICJkZWZhdWx0Iik7CiAgICAgICAgICAgICAgICArK2Vycm9yOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChlcnJvcikKICAgICAgICAgICAgZmNsb3NlKGluZmlsZSk7CiAgICB9CgoKICAgIGlmIChlcnJvcikgewogICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgYWJvcnRpbmcuXG4iKTsKICAgICAgICBleGl0KDIpOwogICAgfQoKCiAgICAvKiBzZXQgdGhlIHRpdGxlLWJhciBzdHJpbmcsIGJ1dCBtYWtlIHN1cmUgYnVmZmVyIGRvZXNuJ3Qgb3ZlcmZsb3cgKi8KCiAgICBhbGVuID0gc3RybGVuKGFwcG5hbWUpOwogICAgZmxlbiA9IHN0cmxlbihmaWxlbmFtZSk7CiAgICBpZiAoYWxlbiArIGZsZW4gKyAzID4gMTAyMykKICAgICAgICBzcHJpbnRmKHRpdGxlYmFyLCAiJXM6ICAuLi4lcyIsIGFwcG5hbWUsIGZpbGVuYW1lKyhhbGVuK2ZsZW4rNi0xMDIzKSk7CiAgICBlbHNlCiAgICAgICAgc3ByaW50Zih0aXRsZWJhciwgIiVzOiAgJXMiLCBhcHBuYW1lLCBmaWxlbmFtZSk7CgoKICAgIC8qIGlmIHRoZSB1c2VyIGRpZG4ndCBzcGVjaWZ5IGEgYmFja2dyb3VuZCBjb2xvciBvbiB0aGUgY29tbWFuZCBsaW5lLAogICAgICogY2hlY2sgZm9yIG9uZSBpbiB0aGUgUE5HIGZpbGUtLWlmIG5vdCwgdGhlIGluaXRpYWxpemVkIHZhbHVlcyBvZiAwCiAgICAgKiAoYmxhY2spIHdpbGwgYmUgdXNlZCAqLwoKICAgIGlmIChoYXZlX2JnKSB7CiAgICAgICAgdW5zaWduZWQgciwgZywgYjsgICAvKiB0aGlzIGFwcHJvYWNoIHF1aWV0cyBjb21waWxlciB3YXJuaW5ncyAqLwoKICAgICAgICBzc2NhbmYoYmdzdHIrMSwgIiUyeCUyeCUyeCIsICZyLCAmZywgJmIpOwogICAgICAgIGJnX3JlZCAgID0gKHVjaClyOwogICAgICAgIGJnX2dyZWVuID0gKHVjaClnOwogICAgICAgIGJnX2JsdWUgID0gKHVjaCliOwogICAgfSBlbHNlIGlmIChyZWFkcG5nX2dldF9iZ2NvbG9yKCZiZ19yZWQsICZiZ19ncmVlbiwgJmJnX2JsdWUpID4gMSkgewogICAgICAgIHJlYWRwbmdfY2xlYW51cChUUlVFKTsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKICAgICAgICAgICI6ICBsaWJwbmcgZXJyb3Igd2hpbGUgY2hlY2tpbmcgZm9yIGJhY2tncm91bmQgY29sb3JcbiIpOwogICAgICAgIGV4aXQoMik7CiAgICB9CgoKICAgIC8qIGRvIHRoZSBiYXNpYyBYIGluaXRpYWxpemF0aW9uIHN0dWZmLCBtYWtlIHRoZSB3aW5kb3cgYW5kIGZpbGwgaXQKICAgICAqIHdpdGggdGhlIGJhY2tncm91bmQgY29sb3IgKi8KCiAgICBpZiAocnBuZ194X2NyZWF0ZV93aW5kb3coKSkKICAgICAgICBleGl0KDIpOwoKCiAgICAvKiBkZWNvZGUgdGhlIGltYWdlLCBhbGwgYXQgb25jZSAqLwoKICAgIFRyYWNlKChzdGRlcnIsICJjYWxsaW5nIHJlYWRwbmdfZ2V0X2ltYWdlKClcbiIpKQogICAgaW1hZ2VfZGF0YSA9IHJlYWRwbmdfZ2V0X2ltYWdlKGRpc3BsYXlfZXhwb25lbnQsICZpbWFnZV9jaGFubmVscywKICAgICAgJmltYWdlX3Jvd2J5dGVzKTsKICAgIFRyYWNlKChzdGRlcnIsICJkb25lIHdpdGggcmVhZHBuZ19nZXRfaW1hZ2UoKVxuIikpCgoKICAgIC8qIGRvbmUgd2l0aCBQTkcgZmlsZSwgc28gY2xlYW4gdXAgdG8gbWluaW1pemUgbWVtb3J5IHVzYWdlIChidXQgZG8gTk9UCiAgICAgKiBudWtlIGltYWdlX2RhdGEhKSAqLwoKICAgIHJlYWRwbmdfY2xlYW51cChGQUxTRSk7CiAgICBmY2xvc2UoaW5maWxlKTsKCiAgICBpZiAoIWltYWdlX2RhdGEpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIHVuYWJsZSB0byBkZWNvZGUgUE5HIGltYWdlXG4iKTsKICAgICAgICBleGl0KDMpOwogICAgfQoKCiAgICAvKiBkaXNwbGF5IGltYWdlIChjb21wb3NpdGUgd2l0aCBiYWNrZ3JvdW5kIGlmIHJlcXVlc3RlZCkgKi8KCiAgICBUcmFjZSgoc3RkZXJyLCAiY2FsbGluZyBycG5nX3hfZGlzcGxheV9pbWFnZSgpXG4iKSkKICAgIGlmIChycG5nX3hfZGlzcGxheV9pbWFnZSgpKSB7CiAgICAgICAgZnJlZShpbWFnZV9kYXRhKTsKICAgICAgICBleGl0KDQpOwogICAgfQogICAgVHJhY2UoKHN0ZGVyciwgImRvbmUgd2l0aCBycG5nX3hfZGlzcGxheV9pbWFnZSgpXG4iKSkKCgogICAgLyogd2FpdCBmb3IgdGhlIHVzZXIgdG8gdGVsbCB1cyB3aGVuIHRvIHF1aXQgKi8KCiAgICBwcmludGYoCiAgICAgICJEb25lLiAgUHJlc3MgUSwgRXNjIG9yIG1vdXNlIGJ1dHRvbiAxICh3aXRoaW4gaW1hZ2Ugd2luZG93KSB0byBxdWl0LlxuIik7CiAgICBmZmx1c2goc3Rkb3V0KTsKCiAgICBkbwogICAgICAgIFhOZXh0RXZlbnQoZGlzcGxheSwgJmUpOwogICAgd2hpbGUgKCEoZS50eXBlID09IEJ1dHRvblByZXNzICYmIGUueGJ1dHRvbi5idXR0b24gPT0gQnV0dG9uMSkgJiYKICAgICAgICAgICAhKGUudHlwZSA9PSBLZXlQcmVzcyAmJiAgICAvKiAgdi0tLSBvciAxIGZvciBzaGlmdGVkIGtleXMgKi8KICAgICAgICAgICAgICgoayA9IFhMb29rdXBLZXlzeW0oJmUueGtleSwgMCkpID09IFhLX3EgfHwgayA9PSBYS19Fc2NhcGUpICkpOwoKCiAgICAvKiBPSywgd2UncmUgZG9uZTogIGNsZWFuIHVwIGFsbCBpbWFnZSBhbmQgWCByZXNvdXJjZXMgYW5kIGdvIGF3YXkgKi8KCiAgICBycG5nX3hfY2xlYW51cCgpOwoKICAgICh2b2lkKWFyZ2M7IC8qIFVudXNlZCAqLwoKICAgIHJldHVybiAwOwp9CgoKCgoKc3RhdGljIGludCBycG5nX3hfY3JlYXRlX3dpbmRvdyh2b2lkKQp7CiAgICB1Y2ggKnhkYXRhOwogICAgaW50IG5lZWRfY29sb3JtYXAgPSBGQUxTRTsKICAgIGludCBzY3JlZW4sIHBhZDsKICAgIHVsZyBiZ19waXhlbCA9IDBMOwogICAgdWxnIGF0dHJtYXNrOwogICAgV2luZG93IHJvb3Q7CiAgICBYRXZlbnQgZTsKICAgIFhHQ1ZhbHVlcyBnY3ZhbHVlczsKICAgIFhTZXRXaW5kb3dBdHRyaWJ1dGVzIGF0dHI7CiAgICBYVGV4dFByb3BlcnR5IHdpbmRvd05hbWUsICpwV2luZG93TmFtZSA9ICZ3aW5kb3dOYW1lOwogICAgWFRleHRQcm9wZXJ0eSBpY29uTmFtZSwgKnBJY29uTmFtZSA9ICZpY29uTmFtZTsKICAgIFhWaXN1YWxJbmZvIHZpc3VhbF9pbmZvOwogICAgWFNpemVIaW50cyAqc2l6ZV9oaW50czsKICAgIFhXTUhpbnRzICp3bV9oaW50czsKICAgIFhDbGFzc0hpbnQgKmNsYXNzX2hpbnRzOwoKCiAgICBzY3JlZW4gPSBEZWZhdWx0U2NyZWVuKGRpc3BsYXkpOwogICAgZGVwdGggPSBEaXNwbGF5UGxhbmVzKGRpc3BsYXksIHNjcmVlbik7CiAgICByb290ID0gUm9vdFdpbmRvdyhkaXNwbGF5LCBzY3JlZW4pOwoKI2lmZGVmIERFQlVHCiAgICBYU3luY2hyb25pemUoZGlzcGxheSwgVHJ1ZSk7CiNlbmRpZgoKI2lmIDAKLyogR1JSOiAgYWRkIDgtYml0IHN1cHBvcnQgKi8KICAgIGlmICgvKiBkZXB0aCAhPSA4ICYmICovIGRlcHRoICE9IDE2ICYmIGRlcHRoICE9IDI0ICYmIGRlcHRoICE9IDMyKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsCiAgICAgICAgICAic2NyZWVuIGRlcHRoICVkIG5vdCBzdXBwb3J0ZWQgKG9ubHkgMTYtLCAyNC0gb3IgMzItYml0IFRydWVDb2xvcilcbiIsCiAgICAgICAgICBkZXB0aCk7CiAgICAgICAgcmV0dXJuIDI7CiAgICB9CgogICAgWE1hdGNoVmlzdWFsSW5mbyhkaXNwbGF5LCBzY3JlZW4sIGRlcHRoLAogICAgICAoZGVwdGggPT0gOCk/IFBzZXVkb0NvbG9yIDogVHJ1ZUNvbG9yLCAmdmlzdWFsX2luZm8pOwogICAgdmlzdWFsID0gdmlzdWFsX2luZm8udmlzdWFsOwojZWxzZQogICAgaWYgKGRlcHRoICE9IDE2ICYmIGRlcHRoICE9IDI0ICYmIGRlcHRoICE9IDMyKSB7CiAgICAgICAgaW50IHZpc3VhbHNfbWF0Y2hlZCA9IDA7CgogICAgICAgIFRyYWNlKChzdGRlcnIsICJkZWZhdWx0IGRlcHRoIGlzICVkOiAgY2hlY2tpbmcgb3RoZXIgdmlzdWFsc1xuIiwKICAgICAgICAgIGRlcHRoKSkKCiAgICAgICAgLyogMjQtYml0IGZpcnN0ICovCiAgICAgICAgdmlzdWFsX2luZm8uc2NyZWVuID0gc2NyZWVuOwogICAgICAgIHZpc3VhbF9pbmZvLmRlcHRoID0gMjQ7CiAgICAgICAgdmlzdWFsX2xpc3QgPSBYR2V0VmlzdWFsSW5mbyhkaXNwbGF5LAogICAgICAgICAgVmlzdWFsU2NyZWVuTWFzayB8IFZpc3VhbERlcHRoTWFzaywgJnZpc3VhbF9pbmZvLCAmdmlzdWFsc19tYXRjaGVkKTsKICAgICAgICBpZiAodmlzdWFsc19tYXRjaGVkID09IDApIHsKLyogR1JSOiAgYWRkIDE1LSwgMTYtIGFuZCAzMi1iaXQgVHJ1ZUNvbG9yIHZpc3VhbHMgKGFsc28gRGlyZWN0Q29sb3I/KSAqLwogICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImRlZmF1bHQgc2NyZWVuIGRlcHRoICVkIG5vdCBzdXBwb3J0ZWQsIGFuZCBubyIKICAgICAgICAgICAgICAiIDI0LWJpdCB2aXN1YWxzIGZvdW5kXG4iLCBkZXB0aCk7CiAgICAgICAgICAgIHJldHVybiAyOwogICAgICAgIH0KICAgICAgICBUcmFjZSgoc3RkZXJyLCAiWEdldFZpc3VhbEluZm8oKSByZXR1cm5lZCAlZCAyNC1iaXQgdmlzdWFsc1xuIiwKICAgICAgICAgIHZpc3VhbHNfbWF0Y2hlZCkpCiAgICAgICAgdmlzdWFsID0gdmlzdWFsX2xpc3RbMF0udmlzdWFsOwogICAgICAgIGRlcHRoID0gdmlzdWFsX2xpc3RbMF0uZGVwdGg7Ci8qCiAgICAgICAgY29sb3JtYXBfc2l6ZSA9IHZpc3VhbF9saXN0WzBdLmNvbG9ybWFwX3NpemU7CiAgICAgICAgdmlzdWFsX2NsYXNzID0gdmlzdWFsLT5jbGFzczsKICAgICAgICB2aXN1YWxJRCA9IFhWaXN1YWxJREZyb21WaXN1YWwodmlzdWFsKTsKICovCiAgICAgICAgaGF2ZV9ub25kZWZhdWx0X3Zpc3VhbCA9IFRSVUU7CiAgICAgICAgbmVlZF9jb2xvcm1hcCA9IFRSVUU7CiAgICB9IGVsc2UgewogICAgICAgIFhNYXRjaFZpc3VhbEluZm8oZGlzcGxheSwgc2NyZWVuLCBkZXB0aCwgVHJ1ZUNvbG9yLCAmdmlzdWFsX2luZm8pOwogICAgICAgIHZpc3VhbCA9IHZpc3VhbF9pbmZvLnZpc3VhbDsKICAgIH0KI2VuZGlmCgogICAgUk1hc2sgPSB2aXN1YWwtPnJlZF9tYXNrOwogICAgR01hc2sgPSB2aXN1YWwtPmdyZWVuX21hc2s7CiAgICBCTWFzayA9IHZpc3VhbC0+Ymx1ZV9tYXNrOwoKLyogR1JSOiAgYWRkL2NoZWNrIDgtYml0IHN1cHBvcnQgKi8KICAgIGlmIChkZXB0aCA9PSA4IHx8IG5lZWRfY29sb3JtYXApIHsKICAgICAgICBjb2xvcm1hcCA9IFhDcmVhdGVDb2xvcm1hcChkaXNwbGF5LCByb290LCB2aXN1YWwsIEFsbG9jTm9uZSk7CiAgICAgICAgaWYgKCFjb2xvcm1hcCkgewogICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlhDcmVhdGVDb2xvcm1hcCgpIGZhaWxlZFxuIik7CiAgICAgICAgICAgIHJldHVybiAyOwogICAgICAgIH0KICAgICAgICBoYXZlX2NvbG9ybWFwID0gVFJVRTsKICAgIH0KICAgIGlmIChkZXB0aCA9PSAxNSB8fCBkZXB0aCA9PSAxNikgewogICAgICAgIFJTaGlmdCA9IDE1IC0gcnBuZ194X21zYihSTWFzayk7ICAgIC8qIHRoZXNlIGFyZSByaWdodC1zaGlmdHMgKi8KICAgICAgICBHU2hpZnQgPSAxNSAtIHJwbmdfeF9tc2IoR01hc2spOwogICAgICAgIEJTaGlmdCA9IDE1IC0gcnBuZ194X21zYihCTWFzayk7CiAgICB9IGVsc2UgaWYgKGRlcHRoID4gMTYpIHsKI2RlZmluZSBOT18yNEJJVF9NQVNLUwojaWZkZWYgTk9fMjRCSVRfTUFTS1MKICAgICAgICBSU2hpZnQgPSBycG5nX3hfbXNiKFJNYXNrKSAtIDc7ICAgICAvKiB0aGVzZSBhcmUgbGVmdC1zaGlmdHMgKi8KICAgICAgICBHU2hpZnQgPSBycG5nX3hfbXNiKEdNYXNrKSAtIDc7CiAgICAgICAgQlNoaWZ0ID0gcnBuZ194X21zYihCTWFzaykgLSA3OwojZWxzZQogICAgICAgIFJTaGlmdCA9IDcgLSBycG5nX3hfbXNiKFJNYXNrKTsgICAgIC8qIHRoZXNlIGFyZSByaWdodC1zaGlmdHMsIHRvbyAqLwogICAgICAgIEdTaGlmdCA9IDcgLSBycG5nX3hfbXNiKEdNYXNrKTsKICAgICAgICBCU2hpZnQgPSA3IC0gcnBuZ194X21zYihCTWFzayk7CiNlbmRpZgogICAgfQogICAgaWYgKGRlcHRoID49IDE1ICYmIChSU2hpZnQgPCAwIHx8IEdTaGlmdCA8IDAgfHwgQlNoaWZ0IDwgMCkpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInJwbmcgaW50ZXJuYWwgbG9naWMgZXJyb3I6ICBuZWdhdGl2ZSBYIHNoaWZ0KHMpIVxuIik7CiAgICAgICAgcmV0dXJuIDI7CiAgICB9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRmluYWxseSwgY3JlYXRlIHRoZSB3aW5kb3cuCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBhdHRyLmJhY2tpbmdfc3RvcmUgPSBBbHdheXM7CiAgICBhdHRyLmV2ZW50X21hc2sgPSBFeHBvc3VyZU1hc2sgfCBLZXlQcmVzc01hc2sgfCBCdXR0b25QcmVzc01hc2s7CiAgICBhdHRybWFzayA9IENXQmFja2luZ1N0b3JlIHwgQ1dFdmVudE1hc2s7CiAgICBpZiAoaGF2ZV9ub25kZWZhdWx0X3Zpc3VhbCkgewogICAgICAgIGF0dHIuY29sb3JtYXAgPSBjb2xvcm1hcDsKICAgICAgICBhdHRyLmJhY2tncm91bmRfcGl4ZWwgPSAwOwogICAgICAgIGF0dHIuYm9yZGVyX3BpeGVsID0gMTsKICAgICAgICBhdHRybWFzayB8PSBDV0NvbG9ybWFwIHwgQ1dCYWNrUGl4ZWwgfCBDV0JvcmRlclBpeGVsOwogICAgfQoKICAgIHdpbmRvdyA9IFhDcmVhdGVXaW5kb3coZGlzcGxheSwgcm9vdCwgMCwgMCwgaW1hZ2Vfd2lkdGgsIGltYWdlX2hlaWdodCwgMCwKICAgICAgZGVwdGgsIElucHV0T3V0cHV0LCB2aXN1YWwsIGF0dHJtYXNrLCAmYXR0cik7CgogICAgaWYgKHdpbmRvdyA9PSBOb25lKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJYQ3JlYXRlV2luZG93KCkgZmFpbGVkXG4iKTsKICAgICAgICByZXR1cm4gMjsKICAgIH0gZWxzZQogICAgICAgIGhhdmVfd2luZG93ID0gVFJVRTsKCiAgICBpZiAoZGVwdGggPT0gOCkKICAgICAgICBYU2V0V2luZG93Q29sb3JtYXAoZGlzcGxheSwgd2luZG93LCBjb2xvcm1hcCk7CgogICAgaWYgKCFYU3RyaW5nTGlzdFRvVGV4dFByb3BlcnR5KCZ3aW5kb3dfbmFtZSwgMSwgcFdpbmRvd05hbWUpKQogICAgICAgIHBXaW5kb3dOYW1lID0gTlVMTDsKICAgIGlmICghWFN0cmluZ0xpc3RUb1RleHRQcm9wZXJ0eSgmaWNvbl9uYW1lLCAxLCBwSWNvbk5hbWUpKQogICAgICAgIHBJY29uTmFtZSA9IE5VTEw7CgogICAgLyogT0sgaWYgYW55IGhpbnRzIGFsbG9jYXRpb24gZmFpbHM7IFhTZXRXTVByb3BlcnRpZXMoKSBhbGxvd3MgTlVMTHMgKi8KCiAgICBpZiAoKHNpemVfaGludHMgPSBYQWxsb2NTaXplSGludHMoKSkgIT0gTlVMTCkgewogICAgICAgIC8qIHdpbmRvdyB3aWxsIG5vdCBiZSByZXNpemFibGUgKi8KICAgICAgICBzaXplX2hpbnRzLT5mbGFncyA9IFBNaW5TaXplIHwgUE1heFNpemU7CiAgICAgICAgc2l6ZV9oaW50cy0+bWluX3dpZHRoID0gc2l6ZV9oaW50cy0+bWF4X3dpZHRoID0gKGludClpbWFnZV93aWR0aDsKICAgICAgICBzaXplX2hpbnRzLT5taW5faGVpZ2h0ID0gc2l6ZV9oaW50cy0+bWF4X2hlaWdodCA9IChpbnQpaW1hZ2VfaGVpZ2h0OwogICAgfQoKICAgIGlmICgod21faGludHMgPSBYQWxsb2NXTUhpbnRzKCkpICE9IE5VTEwpIHsKICAgICAgICB3bV9oaW50cy0+aW5pdGlhbF9zdGF0ZSA9IE5vcm1hbFN0YXRlOwogICAgICAgIHdtX2hpbnRzLT5pbnB1dCA9IFRydWU7CiAgICAgLyogd21faGludHMtPmljb25fcGl4bWFwID0gaWNvbl9waXhtYXA7ICovCiAgICAgICAgd21faGludHMtPmZsYWdzID0gU3RhdGVIaW50IHwgSW5wdXRIaW50ICAvKiB8IEljb25QaXhtYXBIaW50ICovIDsKICAgIH0KCiAgICBpZiAoKGNsYXNzX2hpbnRzID0gWEFsbG9jQ2xhc3NIaW50KCkpICE9IE5VTEwpIHsKICAgICAgICBjbGFzc19oaW50cy0+cmVzX25hbWUgPSByZXNfbmFtZTsKICAgICAgICBjbGFzc19oaW50cy0+cmVzX2NsYXNzID0gcmVzX2NsYXNzOwogICAgfQoKICAgIFhTZXRXTVByb3BlcnRpZXMoZGlzcGxheSwgd2luZG93LCBwV2luZG93TmFtZSwgcEljb25OYW1lLCBOVUxMLCAwLAogICAgICBzaXplX2hpbnRzLCB3bV9oaW50cywgY2xhc3NfaGludHMpOwoKICAgIC8qIHZhcmlvdXMgcHJvcGVydGllcyBhbmQgaGludHMgbm8gbG9uZ2VyIG5lZWRlZDsgZnJlZSBtZW1vcnkgKi8KICAgIGlmIChwV2luZG93TmFtZSkKICAgICAgIFhGcmVlKHBXaW5kb3dOYW1lLT52YWx1ZSk7CiAgICBpZiAocEljb25OYW1lKQogICAgICAgWEZyZWUocEljb25OYW1lLT52YWx1ZSk7CiAgICBpZiAoc2l6ZV9oaW50cykKICAgICAgICBYRnJlZShzaXplX2hpbnRzKTsKICAgIGlmICh3bV9oaW50cykKICAgICAgIFhGcmVlKHdtX2hpbnRzKTsKICAgIGlmIChjbGFzc19oaW50cykKICAgICAgIFhGcmVlKGNsYXNzX2hpbnRzKTsKCiAgICBYTWFwV2luZG93KGRpc3BsYXksIHdpbmRvdyk7CgogICAgZ2MgPSBYQ3JlYXRlR0MoZGlzcGxheSwgd2luZG93LCAwLCAmZ2N2YWx1ZXMpOwogICAgaGF2ZV9nYyA9IFRSVUU7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRmlsbCB3aW5kb3cgd2l0aCB0aGUgc3BlY2lmaWVkIGJhY2tncm91bmQgY29sb3IuCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBpZiAoZGVwdGggPT0gMjQgfHwgZGVwdGggPT0gMzIpIHsKICAgICAgICBiZ19waXhlbCA9ICgodWxnKWJnX3JlZCAgIDw8IFJTaGlmdCkgfAogICAgICAgICAgICAgICAgICAgKCh1bGcpYmdfZ3JlZW4gPDwgR1NoaWZ0KSB8CiAgICAgICAgICAgICAgICAgICAoKHVsZyliZ19ibHVlICA8PCBCU2hpZnQpOwogICAgfSBlbHNlIGlmIChkZXB0aCA9PSAxNikgewogICAgICAgIGJnX3BpeGVsID0gKCgoKHVsZyliZ19yZWQgICA8PCA4KSA+PiBSU2hpZnQpICYgUk1hc2spIHwKICAgICAgICAgICAgICAgICAgICgoKCh1bGcpYmdfZ3JlZW4gPDwgOCkgPj4gR1NoaWZ0KSAmIEdNYXNrKSB8CiAgICAgICAgICAgICAgICAgICAoKCgodWxnKWJnX2JsdWUgIDw8IDgpID4+IEJTaGlmdCkgJiBCTWFzayk7CiAgICB9IGVsc2UgLyogZGVwdGggPT0gOCAqLyB7CgogICAgICAgIC8qIEdSUjogIGFkZCA4LWJpdCBzdXBwb3J0ICovCgogICAgfQoKICAgIFhTZXRGb3JlZ3JvdW5kKGRpc3BsYXksIGdjLCBiZ19waXhlbCk7CiAgICBYRmlsbFJlY3RhbmdsZShkaXNwbGF5LCB3aW5kb3csIGdjLCAwLCAwLCBpbWFnZV93aWR0aCwgaW1hZ2VfaGVpZ2h0KTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBXYWl0IGZvciBmaXJzdCBFeHBvc2UgZXZlbnQgdG8gZG8gYW55IGRyYXdpbmcsIHRoZW4gZmx1c2guCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBkbwogICAgICAgIFhOZXh0RXZlbnQoZGlzcGxheSwgJmUpOwogICAgd2hpbGUgKGUudHlwZSAhPSBFeHBvc2UgfHwgZS54ZXhwb3NlLmNvdW50KTsKCiAgICBYRmx1c2goZGlzcGxheSk7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgWC0gYW5kIGRpc3BsYXktc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGUgaW1hZ2UuCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBpZiAoZGVwdGggPT0gMjQgfHwgZGVwdGggPT0gMzIpIHsKICAgICAgICB4ZGF0YSA9ICh1Y2ggKiltYWxsb2MoNCppbWFnZV93aWR0aCppbWFnZV9oZWlnaHQpOwogICAgICAgIHBhZCA9IDMyOwogICAgfSBlbHNlIGlmIChkZXB0aCA9PSAxNikgewogICAgICAgIHhkYXRhID0gKHVjaCAqKW1hbGxvYygyKmltYWdlX3dpZHRoKmltYWdlX2hlaWdodCk7CiAgICAgICAgcGFkID0gMTY7CiAgICB9IGVsc2UgLyogZGVwdGggPT0gOCAqLyB7CiAgICAgICAgeGRhdGEgPSAodWNoICopbWFsbG9jKGltYWdlX3dpZHRoKmltYWdlX2hlaWdodCk7CiAgICAgICAgcGFkID0gODsKICAgIH0KCiAgICBpZiAoIXhkYXRhKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICB1bmFibGUgdG8gYWxsb2NhdGUgaW1hZ2UgbWVtb3J5XG4iKTsKICAgICAgICByZXR1cm4gNDsKICAgIH0KCiAgICB4aW1hZ2UgPSBYQ3JlYXRlSW1hZ2UoZGlzcGxheSwgdmlzdWFsLCBkZXB0aCwgWlBpeG1hcCwgMCwKICAgICAgKGNoYXIgKil4ZGF0YSwgaW1hZ2Vfd2lkdGgsIGltYWdlX2hlaWdodCwgcGFkLCAwKTsKCiAgICBpZiAoIXhpbWFnZSkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgWENyZWF0ZUltYWdlKCkgZmFpbGVkXG4iKTsKICAgICAgICBmcmVlKHhkYXRhKTsKICAgICAgICByZXR1cm4gMzsKICAgIH0KCiAgICAvKiB0byBhdm9pZCB0ZXN0aW5nIHRoZSBieXRlIG9yZGVyIGV2ZXJ5IHBpeGVsIChvciBkb3VibGluZyB0aGUgc2l6ZSBvZgogICAgICogdGhlIGRyYXdpbmcgcm91dGluZSB3aXRoIGEgZ2lhbnQgaWYtdGVzdCksIHdlIGFyYml0cmFyaWx5IHNldCB0aGUgYnl0ZQogICAgICogb3JkZXIgdG8gTVNCRmlyc3QgYW5kIGxldCBYbGliIHdvcnJ5IGFib3V0IGludmVydGluZyB0aGluZ3Mgb24gbGl0dGxlLQogICAgICogZW5kaWFuIG1hY2hpbmVzIChsaWtlIExpbnV4L3g4Niwgb2xkIFZBWGVuLCBldGMuKS0tdGhpcyBpcyBub3QgdGhlIG1vc3QKICAgICAqIGVmZmljaWVudCBhcHByb2FjaCAodGhlIGdpYW50IGlmLXRlc3Qgd291bGQgYmUgYmV0dGVyKSwgYnV0IGluIHRoZQogICAgICogaW50ZXJlc3Qgb2YgY2xhcml0eSwgd2UgdGFrZSB0aGUgZWFzeSB3YXkgb3V0Li4uICovCgogICAgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3Q7CgogICAgcmV0dXJuIDA7Cgp9IC8qIGVuZCBmdW5jdGlvbiBycG5nX3hfY3JlYXRlX3dpbmRvdygpICovCgoKCgoKc3RhdGljIGludCBycG5nX3hfZGlzcGxheV9pbWFnZSh2b2lkKQp7CiAgICB1Y2ggKnNyYzsKICAgIGNoYXIgKmRlc3Q7CiAgICB1Y2ggciwgZywgYiwgYTsKICAgIHVsZyBpLCByb3csIGxhc3Ryb3cgPSAwOwogICAgdWxnIHBpeGVsOwogICAgaW50IHhpbWFnZV9yb3dieXRlcyA9IHhpbWFnZS0+Ynl0ZXNfcGVyX2xpbmU7Ci8qICBpbnQgYnBwID0geGltYWdlLT5iaXRzX3Blcl9waXhlbDsgICovCgoKICAgIFRyYWNlKChzdGRlcnIsICJiZWdpbm5pbmcgZGlzcGxheSBsb29wIChpbWFnZV9jaGFubmVscyA9PSAlZClcbiIsCiAgICAgIGltYWdlX2NoYW5uZWxzKSkKICAgIFRyYWNlKChzdGRlcnIsICIgICAod2lkdGggPSAlbGQsIHJvd2J5dGVzID0gJWxkLCB4aW1hZ2Vfcm93Ynl0ZXMgPSAlZClcbiIsCiAgICAgIGltYWdlX3dpZHRoLCBpbWFnZV9yb3dieXRlcywgeGltYWdlX3Jvd2J5dGVzKSkKICAgIFRyYWNlKChzdGRlcnIsICIgICAoYnBwID0gJWQpXG4iLCB4aW1hZ2UtPmJpdHNfcGVyX3BpeGVsKSkKICAgIFRyYWNlKChzdGRlcnIsICIgICAoYnl0ZV9vcmRlciA9ICVzKVxuIiwgeGltYWdlLT5ieXRlX29yZGVyID09IE1TQkZpcnN0PwogICAgICAiTVNCRmlyc3QiIDogKHhpbWFnZS0+Ynl0ZV9vcmRlciA9PSBMU0JGaXJzdD8gIkxTQkZpcnN0IiA6ICJ1bmtub3duIikpKQoKICAgIGlmIChkZXB0aCA9PSAyNCB8fCBkZXB0aCA9PSAzMikgewogICAgICAgIHVsZyByZWQsIGdyZWVuLCBibHVlOwoKICAgICAgICBmb3IgKGxhc3Ryb3cgPSByb3cgPSAwOyAgcm93IDwgaW1hZ2VfaGVpZ2h0OyAgKytyb3cpIHsKICAgICAgICAgICAgc3JjID0gaW1hZ2VfZGF0YSArIHJvdyppbWFnZV9yb3dieXRlczsKICAgICAgICAgICAgZGVzdCA9IHhpbWFnZS0+ZGF0YSArIHJvdyp4aW1hZ2Vfcm93Ynl0ZXM7CiAgICAgICAgICAgIGlmIChpbWFnZV9jaGFubmVscyA9PSAzKSB7CiAgICAgICAgICAgICAgICBmb3IgKGkgPSBpbWFnZV93aWR0aDsgIGkgPiAwOyAgLS1pKSB7CiAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAqc3JjKys7CiAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAqc3JjKys7CiAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAqc3JjKys7CiNpZmRlZiBOT18yNEJJVF9NQVNLUwogICAgICAgICAgICAgICAgICAgIHBpeGVsID0gKHJlZCAgIDw8IFJTaGlmdCkgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdyZWVuIDw8IEdTaGlmdCkgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsdWUgIDw8IEJTaGlmdCk7CiAgICAgICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCiAgICAgICAgICAgICAgICAgICAgLyogR1JSIEJVRzogIHRoaXMgYXNzdW1lcyBicHAgPT0gMzIsIGJ1dCBtYXkgYmUgMjQ6ICovCiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMjQpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMTYpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CiNlbHNlCiAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAoUlNoaWZ0IDwgMCk/IHJlZCAgIDw8ICgtUlNoaWZ0KSA6IHJlZCAgID4+IFJTaGlmdDsKICAgICAgICAgICAgICAgICAgICBncmVlbiA9IChHU2hpZnQgPCAwKT8gZ3JlZW4gPDwgKC1HU2hpZnQpIDogZ3JlZW4gPj4gR1NoaWZ0OwogICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKEJTaGlmdCA8IDApPyBibHVlICA8PCAoLUJTaGlmdCkgOiBibHVlICA+PiBCU2hpZnQ7CiAgICAgICAgICAgICAgICAgICAgcGl4ZWwgPSAocmVkICYgUk1hc2spIHwgKGdyZWVuICYgR01hc2spIHwgKGJsdWUgJiBCTWFzayk7CiAgICAgICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMjQpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMTYpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CiNlbmRpZgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgLyogaWYgKGltYWdlX2NoYW5uZWxzID09IDQpICovIHsKICAgICAgICAgICAgICAgIGZvciAoaSA9IGltYWdlX3dpZHRoOyAgaSA+IDA7ICAtLWkpIHsKICAgICAgICAgICAgICAgICAgICByID0gKnNyYysrOwogICAgICAgICAgICAgICAgICAgIGcgPSAqc3JjKys7CiAgICAgICAgICAgICAgICAgICAgYiA9ICpzcmMrKzsKICAgICAgICAgICAgICAgICAgICBhID0gKnNyYysrOwogICAgICAgICAgICAgICAgICAgIGlmIChhID09IDI1NSkgewogICAgICAgICAgICAgICAgICAgICAgICByZWQgICA9IHI7CiAgICAgICAgICAgICAgICAgICAgICAgIGdyZWVuID0gZzsKICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSBiOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlZCAgID0gYmdfcmVkOwogICAgICAgICAgICAgICAgICAgICAgICBncmVlbiA9IGJnX2dyZWVuOwogICAgICAgICAgICAgICAgICAgICAgICBibHVlICA9IGJnX2JsdWU7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhpcyBtYWNybyAoZnJvbSBwbmcuaCkgY29tcG9zaXRlcyB0aGUgZm9yZWdyb3VuZAogICAgICAgICAgICAgICAgICAgICAgICAgKiBhbmQgYmFja2dyb3VuZCB2YWx1ZXMgYW5kIHB1dHMgdGhlIHJlc3VsdCBpbnRvIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgKiBmaXJzdCBhcmd1bWVudCAqLwogICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUocmVkLCAgIHIsIGEsIGJnX3JlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShncmVlbiwgZywgYSwgYmdfZ3JlZW4pOwogICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUoYmx1ZSwgIGIsIGEsIGJnX2JsdWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBwaXhlbCA9IChyZWQgICA8PCBSU2hpZnQpIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncmVlbiA8PCBHU2hpZnQpIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChibHVlICA8PCBCU2hpZnQpOwogICAgICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDI0KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIGRpc3BsYXkgYWZ0ZXIgZXZlcnkgMTYgbGluZXMgKi8KICAgICAgICAgICAgaWYgKCgocm93KzEpICYgMHhmKSA9PSAwKSB7CiAgICAgICAgICAgICAgICBYUHV0SW1hZ2UoZGlzcGxheSwgd2luZG93LCBnYywgeGltYWdlLCAwLCAoaW50KWxhc3Ryb3csIDAsCiAgICAgICAgICAgICAgICAgIChpbnQpbGFzdHJvdywgaW1hZ2Vfd2lkdGgsIDE2KTsKICAgICAgICAgICAgICAgIFhGbHVzaChkaXNwbGF5KTsKICAgICAgICAgICAgICAgIGxhc3Ryb3cgPSByb3cgKyAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgIH0gZWxzZSBpZiAoZGVwdGggPT0gMTYpIHsKICAgICAgICB1c2ggcmVkLCBncmVlbiwgYmx1ZTsKCiAgICAgICAgZm9yIChsYXN0cm93ID0gcm93ID0gMDsgIHJvdyA8IGltYWdlX2hlaWdodDsgICsrcm93KSB7CiAgICAgICAgICAgIHNyYyA9IGltYWdlX2RhdGEgKyByb3cqaW1hZ2Vfcm93Ynl0ZXM7CiAgICAgICAgICAgIGRlc3QgPSB4aW1hZ2UtPmRhdGEgKyByb3cqeGltYWdlX3Jvd2J5dGVzOwogICAgICAgICAgICBpZiAoaW1hZ2VfY2hhbm5lbHMgPT0gMykgewogICAgICAgICAgICAgICAgZm9yIChpID0gaW1hZ2Vfd2lkdGg7ICBpID4gMDsgIC0taSkgewogICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKCh1c2gpKCpzcmMpIDw8IDgpOwogICAgICAgICAgICAgICAgICAgICsrc3JjOwogICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKCh1c2gpKCpzcmMpIDw8IDgpOwogICAgICAgICAgICAgICAgICAgICsrc3JjOwogICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKCh1c2gpKCpzcmMpIDw8IDgpOwogICAgICAgICAgICAgICAgICAgICsrc3JjOwogICAgICAgICAgICAgICAgICAgIHBpeGVsID0gKChyZWQgICA+PiBSU2hpZnQpICYgUk1hc2spIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZ3JlZW4gPj4gR1NoaWZ0KSAmIEdNYXNrKSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGJsdWUgID4+IEJTaGlmdCkgJiBCTWFzayk7CiAgICAgICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSAvKiBpZiAoaW1hZ2VfY2hhbm5lbHMgPT0gNCkgKi8gewogICAgICAgICAgICAgICAgZm9yIChpID0gaW1hZ2Vfd2lkdGg7ICBpID4gMDsgIC0taSkgewogICAgICAgICAgICAgICAgICAgIHIgPSAqc3JjKys7CiAgICAgICAgICAgICAgICAgICAgZyA9ICpzcmMrKzsKICAgICAgICAgICAgICAgICAgICBiID0gKnNyYysrOwogICAgICAgICAgICAgICAgICAgIGEgPSAqc3JjKys7CiAgICAgICAgICAgICAgICAgICAgaWYgKGEgPT0gMjU1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKCh1c2gpciA8PCA4KTsKICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAoKHVzaClnIDw8IDgpOwogICAgICAgICAgICAgICAgICAgICAgICBibHVlICA9ICgodXNoKWIgPDwgOCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAoKHVzaCliZ19yZWQgICA8PCA4KTsKICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAoKHVzaCliZ19ncmVlbiA8PCA4KTsKICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAoKHVzaCliZ19ibHVlICA8PCA4KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIG1hY3JvIChmcm9tIHBuZy5oKSBjb21wb3NpdGVzIHRoZSBmb3JlZ3JvdW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAqIGFuZCBiYWNrZ3JvdW5kIHZhbHVlcyBhbmQgcHV0cyB0aGUgcmVzdWx0IGJhY2sgaW50bwogICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgZmlyc3QgYXJndW1lbnQgKD09IGZnIGJ5dGUgaGVyZTogIHNhZmUpICovCiAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShyLCByLCBhLCBiZ19yZWQpOwogICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUoZywgZywgYSwgYmdfZ3JlZW4pOwogICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUoYiwgYiwgYSwgYmdfYmx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKCh1c2gpciA8PCA4KTsKICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAoKHVzaClnIDw8IDgpOwogICAgICAgICAgICAgICAgICAgICAgICBibHVlICA9ICgodXNoKWIgPDwgOCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHBpeGVsID0gKChyZWQgICA+PiBSU2hpZnQpICYgUk1hc2spIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZ3JlZW4gPj4gR1NoaWZ0KSAmIEdNYXNrKSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGJsdWUgID4+IEJTaGlmdCkgJiBCTWFzayk7CiAgICAgICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyogZGlzcGxheSBhZnRlciBldmVyeSAxNiBsaW5lcyAqLwogICAgICAgICAgICBpZiAoKChyb3crMSkgJiAweGYpID09IDApIHsKICAgICAgICAgICAgICAgIFhQdXRJbWFnZShkaXNwbGF5LCB3aW5kb3csIGdjLCB4aW1hZ2UsIDAsIChpbnQpbGFzdHJvdywgMCwKICAgICAgICAgICAgICAgICAgKGludClsYXN0cm93LCBpbWFnZV93aWR0aCwgMTYpOwogICAgICAgICAgICAgICAgWEZsdXNoKGRpc3BsYXkpOwogICAgICAgICAgICAgICAgbGFzdHJvdyA9IHJvdyArIDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgfSBlbHNlIC8qIGRlcHRoID09IDggKi8gewoKICAgICAgICAvKiBHUlI6ICBhZGQgOC1iaXQgc3VwcG9ydCAqLwoKICAgIH0KCiAgICBUcmFjZSgoc3RkZXJyLCAiY2FsbGluZyBmaW5hbCBYUHV0SW1hZ2UoKVxuIikpCiAgICBpZiAobGFzdHJvdyA8IGltYWdlX2hlaWdodCkgewogICAgICAgIFhQdXRJbWFnZShkaXNwbGF5LCB3aW5kb3csIGdjLCB4aW1hZ2UsIDAsIChpbnQpbGFzdHJvdywgMCwKICAgICAgICAgIChpbnQpbGFzdHJvdywgaW1hZ2Vfd2lkdGgsIGltYWdlX2hlaWdodC1sYXN0cm93KTsKICAgICAgICBYRmx1c2goZGlzcGxheSk7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0KCgoKCnN0YXRpYyB2b2lkIHJwbmdfeF9jbGVhbnVwKHZvaWQpCnsKICAgIGlmIChpbWFnZV9kYXRhKSB7CiAgICAgICAgZnJlZShpbWFnZV9kYXRhKTsKICAgICAgICBpbWFnZV9kYXRhID0gTlVMTDsKICAgIH0KCiAgICBpZiAoeGltYWdlKSB7CiAgICAgICAgaWYgKHhpbWFnZS0+ZGF0YSkgewogICAgICAgICAgICBmcmVlKHhpbWFnZS0+ZGF0YSk7ICAgICAgICAgICAvKiB3ZSBhbGxvY2F0ZWQgaXQsIHNvIHdlIGZyZWUgaXQgKi8KICAgICAgICAgICAgeGltYWdlLT5kYXRhID0gKGNoYXIgKilOVUxMOyAgLyogIGluc3RlYWQgb2YgWERlc3Ryb3lJbWFnZSgpICovCiAgICAgICAgfQogICAgICAgIFhEZXN0cm95SW1hZ2UoeGltYWdlKTsKICAgICAgICB4aW1hZ2UgPSBOVUxMOwogICAgfQoKICAgIGlmIChoYXZlX2djKQogICAgICAgIFhGcmVlR0MoZGlzcGxheSwgZ2MpOwoKICAgIGlmIChoYXZlX3dpbmRvdykKICAgICAgICBYRGVzdHJveVdpbmRvdyhkaXNwbGF5LCB3aW5kb3cpOwoKICAgIGlmIChoYXZlX2NvbG9ybWFwKQogICAgICAgIFhGcmVlQ29sb3JtYXAoZGlzcGxheSwgY29sb3JtYXApOwoKICAgIGlmIChoYXZlX25vbmRlZmF1bHRfdmlzdWFsKQogICAgICAgIFhGcmVlKHZpc3VhbF9saXN0KTsKfQoKCgoKCnN0YXRpYyBpbnQgcnBuZ194X21zYih1bGcgdTMydmFsKQp7CiAgICBpbnQgaTsKCiAgICBmb3IgKGkgPSAzMTsgIGkgPj0gMDsgIC0taSkgewogICAgICAgIGlmICh1MzJ2YWwgJiAweDgwMDAwMDAwTCkKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgdTMydmFsIDw8PSAxOwogICAgfQogICAgcmV0dXJuIGk7Cn0K