LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiAgICAgICAgIEFUTUVMIE1pY3JvY29udHJvbGxlciBTb2Z0d2FyZSBTdXBwb3J0IAogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIENvcHlyaWdodCAoYykgMjAwOCwgQXRtZWwgQ29ycG9yYXRpb24KICoKICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgogKgogKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKICogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBkaXNjbGFpbWVyIGJlbG93LgogKgogKiBBdG1lbCdzIG5hbWUgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KICoKICogRElTQ0xBSU1FUjogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBVE1FTCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUgogKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQgQVJFCiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFUTUVMIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCiAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsCiAqIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLAogKiBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIFx1bml0Ci8vLwovLy8gIVB1cnBvc2UKLy8vIAovLy8gQ0NJRCBkcml2ZXIKLy8vIAovLy8gIVVzYWdlCi8vLyAKLy8vIEV4cGxhbmF0aW9uIG9uIHRoZSB1c2FnZSBvZiB0aGUgY29kZSBtYWRlIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBoZWFkZXIgZmlsZS4KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICAgICAgIEhlYWRlcnMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiNpbmNsdWRlICJib2FyZC5oIgojaW5jbHVkZSA8VVNCRERyaXZlci5oPgojaW5jbHVkZSA8VVNCUmVxdWVzdHMuaD4KI2luY2x1ZGUgPFVTQkRlc2NyaXB0b3JzLmg+Ci8vI2luY2x1ZGUgPHVzYi9kZXZpY2UvZGZ1L2RmdS5oPgojaW5jbHVkZSA8Y2NpZGRyaXZlcmRlc2NyaXB0b3JzLmg+CgovLyBGSVhNRTogUmVtb3ZlIERGVSByZWxhdGVkIHN0dWZmIAovKiBubyBERlUgYm9vdGxvYWRlciBpcyBiZWluZyB1c2VkICovCiNkZWZpbmUgREZVX05VTV9JRiAgICAgIDAKI2RlZmluZSBERlVfSUZfREVTQ1JJUFRPUlNfU1RSVUNUCiNkZWZpbmUgREZVX0lGX0RFU0NSSVBUT1JTCgojZGVmaW5lIERGVV9OVU1fU1RSSU5HUyAwCiNkZWZpbmUgREZVX1NUUklOR19ERVNDUklQVE9SUwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gICAgICAgICBMb2NhbCBkZWZpbml0aW9uCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLy8gQ29uc3RhbnRzOiBJRHM6IERldmljZSBwcm9kdWN0IElELgovLyNkZWZpbmUgQ0NJRERyaXZlckRlc2NyaXB0b3JzX1BST0RVQ1RJRCAgICAgICAweDYxMjkKI2RlZmluZSBDQ0lERHJpdmVyRGVzY3JpcHRvcnNfUFJPRFVDVElEICAgICAgIFNJTVRSQUNFX1BST0RVQ1RfSUQKLy8vIENvbnN0YW50czogSURzOiBEZXZpY2UgdmVuZG9yIElELgojZGVmaW5lIENDSUREcml2ZXJEZXNjcmlwdG9yc19WRU5ET1JJRCAgICAgICAgQVRNRUxfVkVORE9SX0lECi8vI2RlZmluZSBDQ0lERHJpdmVyRGVzY3JpcHRvcnNfVkVORE9SSUQgICAgICAgIDB4MDNFQgovLy8gQ29uc3RhbnRzOiBJRHM6IERldmljZSByZWxlYXNlIG51bWJlci4KI2RlZmluZSBDQ0lERHJpdmVyRGVzY3JpcHRvcnNfUkVMRUFTRSAgICAgICAgIDB4MDEwMAoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gICAgICAgICBUeXBlcwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8vIERyaXZlciBzdHJ1Y3R1cmUgZm9yIGFuIENDSUQgZGV2aWNlCnR5cGVkZWYgc3RydWN0IHsKCiAgICAvLy8gU3RhbmRhcmQgVVNCIGRldmljZSBkcml2ZXIgaW5zdGFuY2UKICAgIFVTQkREcml2ZXIgICAgICAgICAgICAgdXNiZERyaXZlcjsKICAgIC8vLyBDQ0lEIG1lc3NhZ2UKICAgIFNfY2NpZF9idWxrX2luX2hlYWRlciAgc0NjaWRNZXNzYWdlOwogICAgLy8vIENDSUQgY29tbWFuZAogICAgU19jY2lkX2J1bGtfb3V0X2hlYWRlciBzQ2NpZENvbW1hbmQ7CiAgICAvLy8gSW50ZXJydXB0IG1lc3NhZ2UgYW5zd2VyCiAgICB1bnNpZ25lZCBjaGFyICAgICAgICAgIEJ1ZmZlcklOVFs0XTsKICAgIC8vLyBCdWZmZXIgZGF0YSBvZiBtZXNzYWdlCiAgICB1bnNpZ25lZCBjaGFyICAgICAgICAgIFByb3RvY29sRGF0YVN0cnVjdHVyZVsxMF07CiAgICAvLy8gUHJvdG9jb2wgdXNlZAogICAgdW5zaWduZWQgY2hhciAgICAgICAgICBiUHJvdG9jb2w7CiAgICAvLy8gU2xvdFN0YXR1cwogICAgLy8vIEJpdCAwID0gU2xvdCAwIGN1cnJlbnQgc3RhdGUKICAgIC8vLyBCaXQgMSA9IFNsb3QgMCBjaGFuZ2VkIHN0YXR1cwogICAgLy8vIEJpdCAyID0gU2xvdCAxIGN1cnJlbnQgc3RhdGUKICAgIC8vLyBCaXQgMyA9IFNsb3QgMSBjaGFuZ2VkIHN0YXR1cwogICAgLy8vIEJpdCA0ID0gU2xvdCAyIGN1cnJlbnQgc3RhdGUKICAgIC8vLyBCaXQgNSA9IFNsb3QgMiBjaGFuZ2VkIHN0YXR1cwogICAgdW5zaWduZWQgY2hhciAgICAgICAgICBTbG90U3RhdHVzOwoKfSBDQ0lERHJpdmVyOwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gICAgICAgICBMb2NhbCB2YXJpYWJsZXMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vLyBTdGF0aWMgaW5zdGFuY2Ugb2YgdGhlIENDSUQgZGV2aWNlIGRyaXZlci4Kc3RhdGljIENDSUREcml2ZXIgY2NpZERyaXZlcjsKc3RhdGljIENDSUREcml2ZXJDb25maWd1cmF0aW9uRGVzY3JpcHRvcnMgKmNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yc0ZTOwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gICAgICBJbnRlcm5hbCBmdW5jdGlvbnMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBJbml0aWFsaXplcyB0aGUgQ0NJRCBkZXZpY2UgZHJpdmVyLgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp2b2lkIENDSUREcml2ZXJfSW5pdGlhbGl6ZSggdm9pZCApCnsKICAgIGNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yc0ZTID0gKENDSUREcml2ZXJDb25maWd1cmF0aW9uRGVzY3JpcHRvcnMgKikgY29uZmlndXJhdGlvbkRlc2NyaXB0b3JzQXJyW0NGR19OVU1fQ0NJRC0xXTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIFJlc3BvbnNlIFBpcGUsIEJ1bGstSU4gTWVzc2FnZXMKLy8vIFJldHVybiB0aGUgU2xvdCBTdGF0dXMgdG8gdGhlIGhvc3QKLy8vIEFuc3dlciB0bzoKLy8vICAgUENfdG9fUkRSX0ljY1Bvd2VyT2ZmCi8vLyAgIFBDX3RvX1JEUl9HZXRTbG90U3RhdHVzCi8vLyAgIFBDX3RvX1JEUl9JY2NDbG9jawovLy8gICBQQ190b19SRFJfVDBBUERVCi8vLyAgIFBDX3RvX1JEUl9NZWNoYW5pY2FsCi8vLyAgIFBDX3RvX1JEUl9BYm9ydCBhbmQgQ2xhc3Mgc3BlY2lmaWMgQUJPUlQgcmVxdWVzdAovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBSRFJ0b1BDU2xvdFN0YXR1cyggdm9pZCApCnsKICAgIC8vIEhlYWRlciBmaWVsZHMgc2V0dGluZ3MKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJNZXNzYWdlVHlwZSA9IFJEUl9UT19QQ19TTE9UU1RBVFVTOwogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2Uud0xlbmd0aCAgID0gMDsKCiAgICBpZiAoY2NpZERyaXZlci5TbG90U3RhdHVzID09IElDQ19JTlNFUlRFRF9FVkVOVCkgewogICAgICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAwOyAgICAvKiBJQ0MgcHJlc2VudCBhbmQgYWN0aXZlIGNhcmQgKi8KICAgIH0gZWxzZSBpZiAoY2NpZERyaXZlci5TbG90U3RhdHVzID09IElDQ19OT1RfUFJFU0VOVCkgewogICAgICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAyOyAgICAvKiBObyBJQ0MgcHJlc2VudCovCiAgICB9IGVsc2V7CiAgICAgICAgVFJBQ0VfRVJST1IoIlN0cmFuZ2UgYlN0YXR1cyIpOwogICAgICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAwOwogICAgfQogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYkVycm9yICAgID0gMDsKICAgIC8vIDAwaCBDbG9jayBydW5uaW5nCiAgICAvLyAwMWggQ2xvY2sgc3RvcHBlZCBpbiBzdGF0ZSBMCiAgICAvLyAwMmggQ2xvY2sgc3RvcHBlZCBpbiBzdGF0ZSBICiAgICAvLyAwM2ggQ2xvY2sgc3RvcHBlZCBpbiBhbiB1bmtub3duIHN0YXRlCiAgICAvLyBBbGwgb3RoZXIgdmFsdWVzIGFyZSBSZXNlcnZlZCBmb3IgRnV0dXJlIFVzZS4KICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTcGVjaWZpYyA9IDA7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBSZXNwb25zZSBQaXBlLCBCdWxrLUlOIE1lc3NhZ2VzCi8vLyBBbnN3ZXIgdG8gUENfdG9fUkRSX0ljY1Bvd2VyT24KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgUkRSdG9QQ0RhdGFibG9ja19BVFIoIHZvaWQgKQp7CiAgICB1bnNpZ25lZCBjaGFyIGk7CiAgICB1bnNpZ25lZCBjaGFyIEF0cltBVFJfU0laRV9NQVhdOwogICAgdW5zaWduZWQgY2hhciBsZW5ndGg7CiAgICB1aW50MzJfdCBzdGF0dXM7IAoKICAgIFRSQUNFX0RFQlVHKCIuIik7CgogICAgc3RhdHVzID0gSVNPNzgxNl9EYXRhYmxvY2tfQVRSKCBBdHIsICZsZW5ndGggKTsKICAgIElTTzc4MTZfRGVjb2RlX0FUUiggQXRyICk7CgogICAgaWYgKHN0YXR1cyA9PSAwKSB7CiAgICAgICAgVFJBQ0VfREVCVUcoIlRpbWVvdXQgb2NjdXJlZCB3aGlsZSByZWFkaW5nIEFUUiIpOwovLyBGSVhNRTogcmVhY3QgcHJvcGVybHkgdG8gdGltZW91dC4uCi8vICAgICAgICByZXR1cm47CiAgICB9CgovLyBGSVhNRTogTW9yZSB0ZXN0cz8gSXMgYlByb3RvY29sID0gQXRyWzNdID8KICAgIGlmKCBsZW5ndGggPiA1ICkgewogICAgICAgIGNjaWREcml2ZXIuUHJvdG9jb2xEYXRhU3RydWN0dXJlWzFdID0gQXRyWzNdJjB4MEY7IC8vIFREKDEpCiAgICAgICAgY2NpZERyaXZlci5iUHJvdG9jb2wgPSBBdHJbM10mMHgwRjsgICAgICAgICAgIC8vIFREKDEpCiAgICAgICAgVFJBQ0VfSU5GTygiUHJvdG9jb2wgZGF0YSBzdHJ1Y3R1cmU6IDB4JXhcblxyIiwKICAgICAgICAgICAgICAgICAgICAgICAgY2NpZERyaXZlci5Qcm90b2NvbERhdGFTdHJ1Y3R1cmVbMV0pOwogICAgfQoKICAgIC8vIFNfY2NpZF9wcm90b2NvbF90MAogICAgLy8gYm1GaW5kZXhEaW5kZXgKICAgIGNjaWREcml2ZXIuUHJvdG9jb2xEYXRhU3RydWN0dXJlWzBdID0gQXRyWzJdOyAgICAgLy8gVEEoMSkKCiAgICAvLyBibVRDQ0tTVDAKICAgIC8vIEZvciBUPTAgLEIwIJYgMGIsIEI3LTIgliAwMDAwMDBiCiAgICAvLyBCMSCWIENvbnZlbnRpb24gdXNlZCAoYjE9MCBmb3IgZGlyZWN0LCBiMT0xIGZvciBpbnZlcnNlKQoKICAgIC8vIGJHdWFyZFRpbWVUMAogICAgLy8gRXh0cmEgR3VhcmR0aW1lIGJldHdlZW4gdHdvIGNoYXJhY3RlcnMuIEFkZCAwIHRvIDI1NCBldHUgdG8gdGhlIG5vcm1hbCAKICAgIC8vIGd1YXJkdGltZSBvZiAxMmV0dS4gRkZoIGlzIHRoZSBzYW1lIGFzIDAwaC4KICAgIGNjaWREcml2ZXIuUHJvdG9jb2xEYXRhU3RydWN0dXJlWzJdID0gQXRyWzRdOyAgICAgLy8gVEMoMSkKICAgIC8vIEFUOTFDX0JBU0VfVVMwLT5VU19UVEdSID0gMDsgIC8vIFRDMQoKICAgIC8vIGJXYWl0aW5nSW50ZWdlclQwCiAgICAvLyBXSSBmb3IgVD0wIHVzZWQgdG8gZGVmaW5lIFdXVAogICAgY2NpZERyaXZlci5Qcm90b2NvbERhdGFTdHJ1Y3R1cmVbM10gPSBBdHJbN107ICAgICAvLyBUQygyKQoKICAgIC8vIGJDbG9ja1N0b3AKICAgIC8vIElDQyBDbG9jayBTdG9wIFN1cHBvcnQKICAgIC8vIDAwID0gU3RvcHBpbmcgdGhlIENsb2NrIGlzIG5vdCBhbGxvd2VkCiAgICAvLyAwMSA9IFN0b3Agd2l0aCBDbG9jayBzaWduYWwgTG93CiAgICAvLyAwMiA9IFN0b3Agd2l0aCBDbG9jayBzaWduYWwgSGlnaAogICAgLy8gMDMgPSBTdG9wIHdpdGggQ2xvY2sgZWl0aGVyIEhpZ2ggb3IgTG93CiAgICBjY2lkRHJpdmVyLlByb3RvY29sRGF0YVN0cnVjdHVyZVs0XSA9IDB4MDA7ICAgICAgIC8vIDAgdG8gMwoKICAgIC8vIEhlYWRlciBmaWVsZHMgc2V0dGluZ3MKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJNZXNzYWdlVHlwZSA9IFJEUl9UT19QQ19EQVRBQkxPQ0s7CiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS53TGVuZ3RoICAgICAgPSBsZW5ndGg7ICAvLyBTaXplIG9mIEFUUgogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlNpemVUb1NlbmQgKz0gbGVuZ3RoOyAgLy8gU2l6ZSBvZiBBVFIKICAgIC8vIGJDaGFpblBhcmFtZXRlcjogMDAgdGhlIHJlc3BvbnNlIEFQRFUgYmVnaW5zIGFuZCBlbmRzIGluIHRoaXMgY29tbWFuZAogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlNwZWNpZmljICAgID0gMDsKCiAgICBmb3IoIGk9MDsgaTxsZW5ndGg7IGkrKyApIHsKCiAgICAgICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYWJEYXRhW2ldICA9IEF0cltpXTsKICAgIH0KCiAgICAvLyBTZXQgdGhlIHNsb3QgdG8gYW4gYWN0aXZlIHN0YXR1cwogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyA9IDA7CiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iRXJyb3IgPSAwOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gUmVzcG9uc2UgUGlwZSwgQnVsay1JTiBNZXNzYWdlcwovLy8gSW4gb3RoZXIgY2FzZXMsIHRoZSByZXNwb25zZSBtZXNzYWdlIGhhcyB0aGUgZm9sbG93aW5nIGZvcm1hdDogCi8vLyBUaGUgcmVzcG9uc2UgZGF0YSB3aWxsIGNvbnRhaW4gdGhlIG9wdGlvbmFsIGRhdGEgcmV0dXJuZWQgYnkgdGhlIElDQywgCi8vLyBmb2xsb3dlZCBieSB0aGUgMiBieXRlLXNpemUgc3RhdHVzIHdvcmRzIFNXMS1TVzIuCi8vLwovLy8gQW5zd2VyIHRvOgovLy8gICBQQ190b19SRFJfWGZyQmxvY2sKLy8vICAgUENfdG9fUkRSX1NlY3VyZQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBSRFJ0b1BDRGF0YWJsb2NrKCB2b2lkICkKewogICAgLy9UUkFDRV9ERUJVRygiLiIpOwoKICAgIC8vIEhlYWRlciBmaWVsZHMgc2V0dGluZ3MKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJNZXNzYWdlVHlwZSA9IFJEUl9UT19QQ19EQVRBQkxPQ0s7CiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU2l6ZVRvU2VuZCArPSBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS53TGVuZ3RoOwogICAgLy8gYkNoYWluUGFyYW1ldGVyOiAwMCB0aGUgcmVzcG9uc2UgQVBEVSBiZWdpbnMgYW5kIGVuZHMgaW4gdGhpcyBjb21tYW5kCiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3BlY2lmaWMgPSAwOwoKICAgIC8vIFNldCB0aGUgc2xvdCB0byBhbiBhY3RpdmUgc3RhdHVzCiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3RhdHVzID0gMDsKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJFcnJvciA9IDA7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBSZXNwb25zZSBQaXBlLCBCdWxrLUlOIE1lc3NhZ2VzCi8vLyBBbnN3ZXIgdG86Ci8vLyAgIFBDX3RvX1JEUl9HZXRQYXJhbWV0ZXJzCi8vLyAgIFBDX3RvX1JEUl9SZXNldFBhcmFtZXRlcnMKLy8vICAgUENfdG9fUkRSX1NldFBhcmFtZXRlcnMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgUkRSdG9QQ1BhcmFtZXRlcnMoIHZvaWQgKQp7CiAgICB1bnNpZ25lZCBpbnQgaTsKCiAgICBUUkFDRV9ERUJVRygiLiIpOwoKICAgIC8vIEhlYWRlciBmaWVsZHMgc2V0dGluZ3MKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJNZXNzYWdlVHlwZSA9IFJEUl9UT19QQ19QQVJBTUVURVJTOwoKICAgIC8vY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyA9IDA7CiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iRXJyb3IgID0gMDsKCiAgICBpZiggY2NpZERyaXZlci5Qcm90b2NvbERhdGFTdHJ1Y3R1cmVbMV0gPT0gUFJPVE9DT0xfVE8gKSB7CgogICAgICAgIC8vIFQ9MAogICAgICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLndMZW5ndGggICA9IHNpemVvZihTX2NjaWRfcHJvdG9jb2xfdDApOwogICAgICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTcGVjaWZpYyA9IFBST1RPQ09MX1RPOwogICAgfQogICAgZWxzZSB7CgogICAgICAgIC8vIFQ9MQogICAgICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLndMZW5ndGggICA9IHNpemVvZihTX2NjaWRfcHJvdG9jb2xfdDEpOwogICAgICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTcGVjaWZpYyA9IFBST1RPQ09MX1QxOwogICAgfQoKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTaXplVG9TZW5kICs9IGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLndMZW5ndGg7CgogICAgZm9yKCBpPTA7IGk8Y2NpZERyaXZlci5zQ2NpZE1lc3NhZ2Uud0xlbmd0aDsgaSsrICkgewogICAgICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmFiRGF0YVtpXSA9IGNjaWREcml2ZXIuUHJvdG9jb2xEYXRhU3RydWN0dXJlW2ldOwogICAgfQoKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIFJlc3BvbnNlIFBpcGUsIEJ1bGstSU4gTWVzc2FnZXMKLy8vIEFuc3dlciB0bzoKLy8vICAgUENfdG9fUkRSX0VzY2FwZQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBSRFJ0b1BDRXNjYXBlKCB1bnNpZ25lZCBjaGFyIGxlbmd0aCwgdW5zaWduZWQgY2hhciAqZGF0YV9zZW5kX2Zyb21fQ0NJRCApCnsKICAgIHVuc2lnbmVkIGludCBpOwoKICAgIFRSQUNFX0RFQlVHKCIuIik7CgogICAgLy8gSGVhZGVyIGZpZWxkcyBzZXR0aW5ncwogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYk1lc3NhZ2VUeXBlID0gUkRSX1RPX1BDX0VTQ0FQRTsKCiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS53TGVuZ3RoICAgPSBsZW5ndGg7CgogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyA9IDA7CiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iRXJyb3IgID0gMDsKCiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3BlY2lmaWMgPSAwOyAgLy8gYlJGVQoKICAgIGZvciggaT0wOyBpPGxlbmd0aDsgaSsrICkgewogICAgICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmFiRGF0YVtpXSA9IGRhdGFfc2VuZF9mcm9tX0NDSURbaV07CiAgICB9Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBSZXNwb25zZSBQaXBlLCBCdWxrLUlOIE1lc3NhZ2VzCi8vLyBBbnN3ZXIgdG86IAovLy8gICBQQ190b19SRFJfU2V0RGF0YVJhdGVBbmRDbG9ja0ZyZXF1ZW5jeQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBSRFJ0b1BDRGF0YVJhdGVBbmRDbG9ja0ZyZXF1ZW5jeSggdW5zaWduZWQgaW50IGR3Q2xvY2tGcmVxdWVuY3ksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZHdEYXRhUmF0ZSApCnsKICAgIFRSQUNFX0RFQlVHKCIuIik7CgogICAgLy8gSGVhZGVyIGZpZWxkcyBzZXR0aW5ncwogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYk1lc3NhZ2VUeXBlID0gUkRSX1RPX1BDX0RBVEFSQVRFQU5EQ0xPQ0tGUkVRVUVOQ1k7CgogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2Uud0xlbmd0aCAgID0gODsKCiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3RhdHVzID0gMDsKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJFcnJvciAgPSAwOwoKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTcGVjaWZpYyA9IDA7ICAvLyBiUkZVCgogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYWJEYXRhWzBdID0gZHdDbG9ja0ZyZXF1ZW5jeTsKICAgIAogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYWJEYXRhWzRdID0gZHdEYXRhUmF0ZTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIENvbW1hbmQgUGlwZSwgQnVsay1PVVQgTWVzc2FnZXMKLy8vIFBvd2VyIE9uIENvbW1hbmQgLSBDb2xkIFJlc2V0ICYgV2FybSBSZXNldCAKLy8vIFJldHVybiB0aGUgQVRSIHRvIHRoZSBob3N0Ci8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIFBDdG9SRFJJY2NQb3dlck9uKCB2b2lkICkKewogICAgVFJBQ0VfREVCVUcoIi4iKTsKICAgIGlmKCBDQ0lEX0ZFQVRVUkVTX0FVVE9fVk9MVCA9PSAoY29uZmlndXJhdGlvbkRlc2NyaXB0b3JzRlMtPmNjaWQuZHdGZWF0dXJlcyAmIENDSURfRkVBVFVSRVNfQVVUT19WT0xUKSApIHsKCiAgICAgICAgLy9iUG93ZXJTZWxlY3QgPSBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU3BlY2lmaWNfMDsKICAgICAgICBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU3BlY2lmaWNfMCA9IFZPTFRTX0FVVE87CiAgICB9CgogICAgSVNPNzgxNl93YXJtX3Jlc2V0KCk7Ci8vICAgIElTTzc4MTZfY29sZF9yZXNldCgpOwoKICAgIC8vIGZvciBlbXVsYXRpb24gb25seSAvL0pDQiAKICAgIGlmICggY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNwZWNpZmljXzAgIT0gVk9MVFNfNV8wICkgewoKICAgICAgICBUUkFDRV9FUlJPUigiUE9XRVJfTk9UX1NVUFBPUlRFRFxuXHIiKTsKICAgIH0KCiAgICBlbHNlIHsKCiAgICAgICAgUkRSdG9QQ0RhdGFibG9ja19BVFIoKTsKCiAgICB9Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBDb21tYW5kIFBpcGUsIEJ1bGstT1VUIE1lc3NhZ2VzCi8vLyBQb3dlciBPZmYgQ29tbWFuZCAtIFNldCB0aGUgSUNDIGluIGFuIGluYWN0aXZlIHN0YXRlCi8vLyBSZXR1cm4gdGhlIHNsb3Qgc3RhdHVzIHRvIHRoZSBob3N0Ci8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIFBDdG9SRFJJY2NQb3dlck9mZiggdm9pZCApCnsKICAgIHVuc2lnbmVkIGNoYXIgYlN0YXR1czsKCiAgICBUUkFDRV9ERUJVRygiLiIpOwoKICAgIElTTzc4MTZfSWNjUG93ZXJPZmYoKTsKCiAgICAvL0pDQiBzdHViCiAgICBiU3RhdHVzID0gSUNDX0JTX1BSRVNFTlRfTk9UQUNUSVZBVEVEOwoKICAgIC8vIFNldCB0aGUgc2xvdCB0byBhbiBpbmFjdGl2ZSBzdGF0dXMKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAwOwogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYkVycm9yID0gMDsKCiAgICAvLyBpZiBlcnJvciwgc2VlIFRhYmxlIDYuMS0yIGVycm9ycwoKICAgIC8vIFJldHVybiB0aGUgc2xvdCBzdGF0dXMgdG8gdGhlIGhvc3QKICAgIFJEUnRvUENTbG90U3RhdHVzKCk7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBDb21tYW5kIFBpcGUsIEJ1bGstT1VUIE1lc3NhZ2VzCi8vLyBHZXQgc2xvdCBzdGF0dXMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgUEN0b1JEUkdldFNsb3RTdGF0dXMoIHZvaWQgKQp7CiAgICBUUkFDRV9ERUJVRygiLiIpOwoKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAwOwogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYkVycm9yID0gMDsKCiAgICAvLyBSZXR1cm4gdGhlIHNsb3Qgc3RhdHVzIHRvIHRoZSBob3N0CiAgICBSRFJ0b1BDU2xvdFN0YXR1cygpOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gQ29tbWFuZCBQaXBlLCBCdWxrLU9VVCBNZXNzYWdlcwovLy8gSWYgdGhlIGNvbW1hbmQgaGVhZGVyIGlzIHZhbGlkLCBhbiBBUERVIGNvbW1hbmQgaXMgcmVjZWl2ZWQgYW5kIGNhbiBiZSByZWFkCi8vLyBieSB0aGUgYXBwbGljYXRpb24KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgUEN0b1JEUlhmckJsb2NrKCB2b2lkICkKewogICAgdWludDE2X3QgbXNnbGVuID0gMDsKICAgIHVpbnQzMl90IHJldDsKCiAgICBUUkFDRV9ERUJVRygiUEN0b1JEUlhmckJsb2NrXG4iKTsKCiAgICAvLyBDaGVjayB0aGUgYmxvY2sgbGVuZ3RoCiAgICBpZiAoIGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLndMZW5ndGggPiAoY29uZmlndXJhdGlvbkRlc2NyaXB0b3JzRlMtPmNjaWQuZHdNYXhDQ0lETWVzc2FnZUxlbmd0aC0xMCkgKSB7CiAgICAgICAgVFJBQ0VfREVCVUcoIkVyciBibG9jay9tc2cgbGVuIik7CiAgICAgICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyA9IDE7CiAgICAgICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYkVycm9yICA9IDA7CiAgICB9CiAgICAvLyBjaGVjayBiQldJCiAgICBlbHNlIGlmICggMCAhPSBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU3BlY2lmaWNfMCApIHsKCiAgICAgICAgIFRSQUNFX0VSUk9SKCJCYWQgYkJXSVxuXHIiKTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAvLyBBUERVIG9yIFRQRFUKICAgICAgICBzd2l0Y2goY29uZmlndXJhdGlvbkRlc2NyaXB0b3JzRlMtPmNjaWQuZHdGZWF0dXJlcyAKICAgICAgICAgICAgICAmIChDQ0lEX0ZFQVRVUkVTX0VYQ19UUERVfENDSURfRkVBVFVSRVNfRVhDX1NBUERVfENDSURfRkVBVFVSRVNfRVhDX0FQRFUpKSB7CgogICAgICAgICAgICBjYXNlIENDSURfRkVBVFVSRVNfRVhDX1RQRFU6CiAgICAgICAgICAgICAgICBpZiAoY2NpZERyaXZlci5Qcm90b2NvbERhdGFTdHJ1Y3R1cmVbMV0gPT0gUFJPVE9DT0xfVE8pIHsKICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRygiQVBEVSBjbWQ6ICV4ICV4ICV4IC4uIiwgY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuQVBEVVswXSwgY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuQVBEVVsxXSxjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5BUERVWzJdICk7CgogICAgICAgICAgICAgICAgICAgIC8vIFNlbmQgY29tbWFuZGUgQVBEVQogICAgICAgICAgICAgICAgICAgIHJldCA9IElTTzc4MTZfWGZyQmxvY2tUUERVX1QwKCBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5BUERVICwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5hYkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NpZERyaXZlci5zQ2NpZENvbW1hbmQud0xlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXNnbGVuICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0VSUk9SKCJBUERVIGNvdWxkIG5vdCBiZSBzZW50OiAoVVNfQ1NSID0gMHgleCkiLCByZXQpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNjaWREcml2ZXIuUHJvdG9jb2xEYXRhU3RydWN0dXJlWzFdID09IFBST1RPQ09MX1QxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKCJOb3Qgc3VwcG9ydGVkIFQ9MVxuXHIiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKCJOb3Qgc3VwcG9ydGVkIDB4JXhcblxyIiwgY2NpZERyaXZlci5Qcm90b2NvbERhdGFTdHJ1Y3R1cmVbMV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBDQ0lEX0ZFQVRVUkVTX0VYQ19BUERVOgogICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoIk5vdCBzdXBwb3J0ZWQgQ0NJRF9GRUFUVVJFU19FWENfQVBEVVxuXHIiKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICB9CgogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2Uud0xlbmd0aCA9IG1zZ2xlbjsKICAgIFRSQUNFX0RFQlVHKCJVU0I6IDB4JVgsIDB4JVgsIDB4JVgsIDB4JVgsIDB4JVhcblxyIiwgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYWJEYXRhWzBdLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5hYkRhdGFbMV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmFiRGF0YVsyXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYWJEYXRhWzNdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmFiRGF0YVs0XSApOwogICAgIFJEUnRvUENEYXRhYmxvY2soKTsKCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBDb21tYW5kIFBpcGUsIEJ1bGstT1VUIE1lc3NhZ2VzCi8vLyByZXR1cm4gcGFyYW1ldGVycyBieSB0aGUgY29tbWFuZDogUkRSX3RvX1BDX1BhcmFtZXRlcnMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgUEN0b1JEUkdldFBhcmFtZXRlcnMoIHZvaWQgKQp7CiAgICBUUkFDRV9ERUJVRygiLiIpOwoKICAgIC8vIFdlIHN1cHBvcnQgb25seSBvbmUgc2xvdAoKICAgIC8vIGJtSWNjU3RhdHVzCiAgICBpZiggSVNPNzgxNl9TdGF0dXNSZXNldCgpICkgewogICAgICAgIC8vIDA6IEFuIElDQyBpcyBwcmVzZW50IGFuZCBhY3RpdmUgKHBvd2VyIGlzIG9uIGFuZCBzdGFibGUsIFJTVCBpcyBpbmFjdGl2ZQogICAgICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAwOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgLy8gMTogQW4gSUNDIGlzIHByZXNlbnQgYW5kIGluYWN0aXZlIChub3QgYWN0aXZhdGVkIG9yIHNodXQgZG93biBieSBoYXJkd2FyZSBlcnJvcikKICAgICAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3RhdHVzID0gMTsKICAgIH0KCiAgICBSRFJ0b1BDUGFyYW1ldGVycygpOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gQ29tbWFuZCBQaXBlLCBCdWxrLU9VVCBNZXNzYWdlcwovLy8gVGhpcyBjb21tYW5kIHJlc2V0cyB0aGUgc2xvdCBwYXJhbWV0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIFBDdG9SRFJSZXNldFBhcmFtZXRlcnMoIHZvaWQgKQp7CiAgICBUUkFDRV9ERUJVRygiLiIpOwoKICAgIGNjaWREcml2ZXIuU2xvdFN0YXR1cyA9IElDQ19OT1RfUFJFU0VOVDsKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSBjY2lkRHJpdmVyLlNsb3RTdGF0dXM7CgogICAgUkRSdG9QQ1BhcmFtZXRlcnMoKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIENvbW1hbmQgUGlwZSwgQnVsay1PVVQgTWVzc2FnZXMKLy8vIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgcGFyYW1ldGVycyBmb3IgYSBnaXZlbiBzbG90LgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBQQ3RvUkRSU2V0UGFyYW1ldGVycyggdm9pZCApCnsKICAgIFRSQUNFX0RFQlVHKCIuIik7CgogICAgY2NpZERyaXZlci5TbG90U3RhdHVzID0gY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNsb3Q7CiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3RhdHVzID0gY2NpZERyaXZlci5TbG90U3RhdHVzOwogICAgLy8gTm90IGFsbCBmZWF0dXJlIHN1cHBvcnRlZAoKICAgIFJEUnRvUENQYXJhbWV0ZXJzKCk7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBDb21tYW5kIFBpcGUsIEJ1bGstT1VUIE1lc3NhZ2VzCi8vLyBUaGlzIGNvbW1hbmQgYWxsb3dzIHRoZSBDQ0lEIG1hbnVmYWN0dXJlciB0byBkZWZpbmUgYW5kIGFjY2VzcyBleHRlbmRlZCAKLy8vIGZlYXR1cmVzLiAKLy8vIEluZm9ybWF0aW9uIHNlbnQgdmlhIHRoaXMgY29tbWFuZCBpcyBwcm9jZXNzZWQgYnkgdGhlIENDSUQgY29udHJvbCBsb2dpYy4KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgUEN0b1JEUkVzY2FwZSggdm9pZCApCnsKICAgIFRSQUNFX0RFQlVHKCIuIik7CgogICAgLy8gSWYgbmVlZGVkIGJ5IHRoZSB1c2VyCiAgICBJU083ODE2X0VzY2FwZSgpOwoKICAgIC8vIHN0dWIsIHJldHVybiBhbGwgdmFsdWUgc2VuZAogICAgUkRSdG9QQ0VzY2FwZSggY2NpZERyaXZlci5zQ2NpZENvbW1hbmQud0xlbmd0aCwgY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuQVBEVSk7ICAgIAp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gQ29tbWFuZCBQaXBlLCBCdWxrLU9VVCBNZXNzYWdlcwovLy8gVGhpcyBjb21tYW5kIHN0b3BzIG9yIHJlc3RhcnRzIHRoZSBjbG9jay4KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgUEN0b1JEUklDQ0Nsb2NrKCB2b2lkICkKewogICAgVFJBQ0VfREVCVUcoIi4iKTsKCiAgICBpZiggMCA9PSBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU3BlY2lmaWNfMCApIHsKICAgICAgICAvLyByZXN0YXJ0cyB0aGUgY2xvY2sKICAgICAgICBJU083ODE2X1Jlc3RhcnRDbG9jaygpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgLy8gc3RvcCBjbG9jayBpbiB0aGUgc3RhdGUgc2hvd24gaW4gdGhlIGJDbG9ja1N0b3AgZmllbGQKICAgICAgICBJU083ODE2X1N0b3BDbG9jaygpOwogICAgfQoKICAgIFJEUnRvUENTbG90U3RhdHVzKCApOyAgICAKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIENvbW1hbmQgUGlwZSwgQnVsay1PVVQgTWVzc2FnZXMKLy8vIFRoaXMgY29tbWFuZCBjaGFuZ2VzIHRoZSBwYXJhbWV0ZXJzIHVzZWQgdG8gcGVyZm9ybSB0aGUgdHJhbnNwb3J0YXRpb24gb2YgCi8vLyBBUERVIG1lc3NhZ2VzIGJ5IHRoZSBUPTAgcHJvdG9jb2wuIAovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBQQ3RvUkRSdG9BUERVKCB2b2lkICkKewogICAgdW5zaWduZWQgY2hhciBibUNoYW5nZXM7CiAgICB1bnNpZ25lZCBjaGFyIGJDbGFzc0dldFJlc3BvbnNlOwogICAgdW5zaWduZWQgY2hhciBiQ2xhc3NFbnZlbG9wZTsKCiAgICBUUkFDRV9JTkZPKCIuIik7CgogICAgaWYoIGNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yc0ZTLT5jY2lkLmR3RmVhdHVyZXMgPT0gKENDSURfRkVBVFVSRVNfRVhDX1NBUERVfENDSURfRkVBVFVSRVNfRVhDX0FQRFUpICkgewoKICAgICAgICBibUNoYW5nZXMgPSBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU3BlY2lmaWNfMDsKICAgICAgICBiQ2xhc3NHZXRSZXNwb25zZSA9IGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJTcGVjaWZpY18xOwogICAgICAgIGJDbGFzc0VudmVsb3BlID0gY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNwZWNpZmljXzI7CgogICAgICAgIElTTzc4MTZfdG9BUERVKCk7CiAgICB9CgogICAgUkRSdG9QQ1Nsb3RTdGF0dXMoKTsgICAgCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBDb21tYW5kIFBpcGUsIEJ1bGstT1VUIE1lc3NhZ2VzCi8vLyBUaGlzIGlzIGEgY29tbWFuZCBtZXNzYWdlIHRvIGFsbG93IGVudGVyaW5nIHRoZSBQSU4gZm9yIHZlcmlmaWNhdGlvbiBvcgovLy8gbW9kaWZpY2F0aW9uLgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBQQ3RvUkRSU2VjdXJlKCB2b2lkICkKewogICAgVFJBQ0VfREVCVUcoIi4iKTsKCiAgICBUUkFDRV9ERUJVRygiRm9yIHVzZXJcblxyIik7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBDb21tYW5kIFBpcGUsIEJ1bGstT1VUIE1lc3NhZ2VzCi8vLyBUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBtYW5hZ2UgbW90b3JpemVkIHR5cGUgQ0NJRCBmdW5jdGlvbmFsaXR5LiAKLy8vIFRoZSBMb2NrIENhcmQgZnVuY3Rpb24gaXMgdXNlZCB0byBob2xkIHRoZSBJQ0MuIAovLy8gVGhpcyBwcmV2ZW50cyBhbiBJQ0MgZnJvbSBiZWluZyBlYXNpbHkgcmVtb3ZlZCBmcm9tIHRoZSBDQ0lELiAKLy8vIFRoZSBVbmxvY2sgQ2FyZCBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlbW92ZSB0aGUgaG9sZCBpbml0aWF0ZWQgYnkgdGhlIExvY2sgCi8vLyBDYXJkIGZ1bmN0aW9uCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIFBDdG9SRFJNZWNoYW5pY2FsKCB2b2lkICkKewogICAgVFJBQ0VfREVCVUcoIi4iKTsKICAgIFRSQUNFX0RFQlVHKCJOb3QgaW1wbGVtZW50ZWRcblxyIik7CgogICAgUkRSdG9QQ1Nsb3RTdGF0dXMoKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIENvbW1hbmQgUGlwZSwgQnVsay1PVVQgTWVzc2FnZXMKLy8vIFRoaXMgY29tbWFuZCBpcyB1c2VkIHdpdGggdGhlIENvbnRyb2wgcGlwZSBBYm9ydCByZXF1ZXN0IHRvIHRlbGwgdGhlIENDSUQgCi8vLyB0byBzdG9wIGFueSBjdXJyZW50IHRyYW5zZmVyIGF0IHRoZSBzcGVjaWZpZWQgc2xvdCBhbmQgcmV0dXJuIHRvIGEgc3RhdGUgCi8vLyB3aGVyZSB0aGUgc2xvdCBpcyByZWFkeSB0byBhY2NlcHQgYSBuZXcgY29tbWFuZCBwaXBlIEJ1bGstT1VUIG1lc3NhZ2UuCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIFBDdG9SRFJBYm9ydCggdm9pZCApCnsKICAgIFRSQUNFX0RFQlVHKCIuIik7CgogICAgUkRSdG9QQ1Nsb3RTdGF0dXMoKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIENvbW1hbmQgUGlwZSwgQnVsay1PVVQgTWVzc2FnZXMKLy8vIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIG1hbnVhbGx5IHNldCB0aGUgZGF0YSByYXRlIGFuZCBjbG9jayBmcmVxdWVuY3kgb2YgCi8vLyBhIHNwZWNpZmljIHNsb3QuCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIFBDdG9SRFJTZXREYXRhUmF0ZUFuZENsb2NrRnJlcXVlbmN5KCB2b2lkICkKewogICAgdW5zaWduZWQgaW50IGR3Q2xvY2tGcmVxdWVuY3k7CiAgICB1bnNpZ25lZCBpbnQgZHdEYXRhUmF0ZTsKCiAgICBUUkFDRV9ERUJVRygiLiIpOwoKICAgIGR3Q2xvY2tGcmVxdWVuY3kgPSBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5BUERVWzBdCiAgICAgICAgICAgICAgICAgICAgICsgKGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLkFQRFVbMV08PDgpCiAgICAgICAgICAgICAgICAgICAgICsgKGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLkFQRFVbMl08PDE2KQogICAgICAgICAgICAgICAgICAgICArIChjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5BUERVWzNdPDwyNCk7CgogICAgZHdEYXRhUmF0ZSA9IGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLkFQRFVbNF0KICAgICAgICAgICAgICAgKyAoY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuQVBEVVs1XTw8OCkKICAgICAgICAgICAgICAgKyAoY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuQVBEVVs2XTw8MTYpCiAgICAgICAgICAgICAgICsgKGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLkFQRFVbN108PDI0KTsKCiAgICBJU083ODE2X1NldERhdGFSYXRlYW5kQ2xvY2tGcmVxdWVuY3koIGR3Q2xvY2tGcmVxdWVuY3ksIGR3RGF0YVJhdGUgKTsKCiAgICBSRFJ0b1BDRGF0YVJhdGVBbmRDbG9ja0ZyZXF1ZW5jeSggZHdDbG9ja0ZyZXF1ZW5jeSwgZHdEYXRhUmF0ZSApOwoKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIFJlcG9ydCB0aGUgQ01EX05PVF9TVVBQT1JURUQgZXJyb3IgdG8gdGhlIGhvc3QKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgdkNDSURDb21tYW5kTm90U3VwcG9ydGVkKCB2b2lkICkKewogICAgLy8gQ29tbWFuZCBub3Qgc3VwcG9ydGVkCiAgICAvLyB2Q0NJRFJlcG9ydEVycm9yKENNRF9OT1RfU1VQUE9SVEVEKTsKCiAgICBUUkFDRV9ERUJVRygiQ01EX05PVF9TVVBQT1JURURcblxyIik7CgogICAgLy8gSGVhZGVyIGZpZWxkcyBzZXR0aW5ncwogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYk1lc3NhZ2VUeXBlID0gUkRSX1RPX1BDX1NMT1RTVEFUVVM7CiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS53TGVuZ3RoICAgICAgPSAwOwogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlNwZWNpZmljICAgID0gMDsKCiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3RhdHVzIHw9IElDQ19DU19GQUlMRUQ7CgogICAgLy8gU2VuZCB0aGUgcmVzcG9uc2UgdG8gdGhlIGhvc3QKICAgIC8vdkNDSURTZW5kUmVzcG9uc2UoKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIFNlbnQgQ0NJRCByZXNwb25zZSBvbiBVU0IKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgdkNDSURTZW5kUmVzcG9uc2UoIHZvaWQgKQp7CiAgICB1bnNpZ25lZCBjaGFyIGJTdGF0dXM7CiAgICBUUkFDRV9ERUJVRygiLiIpOwoKICAgIGRvIHsKICAgICAgICBiU3RhdHVzID0gQ0NJRF9Xcml0ZSgodm9pZCopJmNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU2l6ZVRvU2VuZCwgMCwgMCApOwogICAgfSB3aGlsZSAoYlN0YXR1cyAhPSBVU0JEX1NUQVRVU19TVUNDRVNTKTsKCiAgICBUUkFDRV9ERUJVRygiYlN0YXR1czogMHgleFxuXHIiLCBiU3RhdHVzKTsKfQoKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyAgRGVzY3JpcHRpb246IENDSUQgQ29tbWFuZCBkaXNwYXRjaGVyCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIENDSURDb21tYW5kRGlzcGF0Y2hlciggdm9pZCAqcEFyZywgdWludDhfdCBzdGF0dXMsIHVpbnQzMl90IHRyYW5zZmVycmVkLCB1aW50MzJfdCByZW1haW5pbmcgKQp7CiAgICB1bnNpZ25lZCBjaGFyIE1lc3NhZ2VUb1NlbmQgPSAwOwoKICAgIGlmIChzdGF0dXMgIT0gVVNCRF9TVEFUVVNfU1VDQ0VTUykgewogICAgICAgIFRSQUNFX0VSUk9SKCJVU0IgZXJyb3I6ICVkIiwgc3RhdHVzKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBUUkFDRV9ERUJVRygiQ29tbWFuZDogMHglWCAweCV4IDB4JVggMHglWCAweCVYIDB4JVggMHglWFxuXHJcblxyIiwKICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYk1lc3NhZ2VUeXBlLAogICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCljY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC53TGVuZ3RoLAogICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCljY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU2xvdCwKICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNlcSwKICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNwZWNpZmljXzAsCiAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KWNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJTcGVjaWZpY18xLAogICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCljY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU3BlY2lmaWNfMik7CgogICAgLy8gQ2hlY2sgdGhlIHNsb3QgbnVtYmVyCiAgICBpZiAoIGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJTbG90ID4gMCApIHsKCiAgICAgICAgVFJBQ0VfRVJST1IoIkJBRF9TTE9UX05VTUJFUlxuXHIiKTsKICAgIH0KCiAgICBUUkFDRV9JTkZPKCJ0eXA9MHglWFxuXHIiLCBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iTWVzc2FnZVR5cGUpOwoKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAwOwoKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTZXEgID0gY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNlcTsKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTbG90ID0gY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNsb3Q7CgogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlNpemVUb1NlbmQgPSBzaXplb2YoU19jY2lkX2J1bGtfaW5faGVhZGVyKS0oQUJEQVRBX1NJWkUrMSk7CgoKICAgIC8vIENvbW1hbmQgZGlzcGF0Y2hlcgogICAgc3dpdGNoICggY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYk1lc3NhZ2VUeXBlICkgewoKICAgICAgICBjYXNlIFBDX1RPX1JEUl9JQ0NQT1dFUk9OOgogICAgICAgICAgICBQQ3RvUkRSSWNjUG93ZXJPbigpOwogICAgICAgICAgICBNZXNzYWdlVG9TZW5kID0gMTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgUENfVE9fUkRSX0lDQ1BPV0VST0ZGOgogICAgICAgICAgICBQQ3RvUkRSSWNjUG93ZXJPZmYoKTsKICAgICAgICAgICAgTWVzc2FnZVRvU2VuZCA9IDE7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFBDX1RPX1JEUl9HRVRTTE9UU1RBVFVTOgogICAgICAgICAgICBQQ3RvUkRSR2V0U2xvdFN0YXR1cygpOwogICAgICAgICAgICBNZXNzYWdlVG9TZW5kID0gMTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgUENfVE9fUkRSX1hGUkJMT0NLOgogICAgICAgICAgICBQQ3RvUkRSWGZyQmxvY2soKTsKICAgICAgICAgICAgTWVzc2FnZVRvU2VuZCA9IDE7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFBDX1RPX1JEUl9HRVRQQVJBTUVURVJTOgogICAgICAgICAgICBQQ3RvUkRSR2V0UGFyYW1ldGVycygpOwogICAgICAgICAgICBNZXNzYWdlVG9TZW5kID0gMTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgUENfVE9fUkRSX1JFU0VUUEFSQU1FVEVSUzoKICAgICAgICAgICAgUEN0b1JEUlJlc2V0UGFyYW1ldGVycygpOwogICAgICAgICAgICBNZXNzYWdlVG9TZW5kID0gMTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgUENfVE9fUkRSX1NFVFBBUkFNRVRFUlM6CiAgICAgICAgICAgIFBDdG9SRFJTZXRQYXJhbWV0ZXJzKCk7CiAgICAgICAgICAgIE1lc3NhZ2VUb1NlbmQgPSAxOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBQQ19UT19SRFJfRVNDQVBFOgogICAgICAgICAgICBQQ3RvUkRSRXNjYXBlKCk7CiAgICAgICAgICAgIE1lc3NhZ2VUb1NlbmQgPSAxOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBQQ19UT19SRFJfSUNDQ0xPQ0s6CiAgICAgICAgICAgIFBDdG9SRFJJQ0NDbG9jaygpOwogICAgICAgICAgICBNZXNzYWdlVG9TZW5kID0gMTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgUENfVE9fUkRSX1QwQVBEVToKICAgICAgICAgICAgLy8gT25seSBDQ0lEcyByZXBvcnRpbmcgYSBzaG9ydCBvciBleHRlbmRlZCBBUERVIGxldmVsIGluIHRoZSBkd0ZlYXR1cmVzIAogICAgICAgICAgICAvLyBmaWVsZCBvZiB0aGUgQ0NJRCBjbGFzcyBkZXNjcmlwdG9yIG1heSB0YWtlIHRoaXMgY29tbWFuZCBpbnRvIGFjY291bnQuCiAgICAgICAgICAgIGlmKCAoQ0NJRF9GRUFUVVJFU19FWENfU0FQRFUgPT0gKENDSURfRkVBVFVSRVNfRVhDX1NBUERVJmNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yc0ZTLT5jY2lkLmR3RmVhdHVyZXMpKQogICAgICAgICAgICB8fCAoQ0NJRF9GRUFUVVJFU19FWENfQVBEVSAgPT0gKENDSURfRkVBVFVSRVNfRVhDX0FQRFUgJmNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yc0ZTLT5jY2lkLmR3RmVhdHVyZXMpKSApIHsKCiAgICAgICAgICAgICAgICAvLyBjb21tYW5kIHN1cHBvcnRlZAogICAgICAgICAgICAgICAgUEN0b1JEUnRvQVBEVSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLy8gY29tbWFuZCBub3Qgc3VwcG9ydGVkCiAgICAgICAgICAgICAgICBUUkFDRV9JTkZPKCJOb3Qgc3VwcG9ydGVkOiBQQ19UT19SRFJfVDBBUERVXG5cciIpOwogICAgICAgICAgICAgICAgdkNDSURDb21tYW5kTm90U3VwcG9ydGVkKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgTWVzc2FnZVRvU2VuZCA9IDE7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFBDX1RPX1JEUl9TRUNVUkU6CiAgICAgICAgICAgIFBDdG9SRFJTZWN1cmUoKTsKICAgICAgICAgICAgTWVzc2FnZVRvU2VuZCA9IDE7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFBDX1RPX1JEUl9NRUNIQU5JQ0FMOgogICAgICAgICAgICBQQ3RvUkRSTWVjaGFuaWNhbCgpOwogICAgICAgICAgICBNZXNzYWdlVG9TZW5kID0gMTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgUENfVE9fUkRSX0FCT1JUOgogICAgICAgICAgICBQQ3RvUkRSQWJvcnQoKTsKICAgICAgICAgICAgTWVzc2FnZVRvU2VuZCA9IDE7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFBDX1RPX1JEUl9TRVREQVRBUkFURUFORENMT0NLRlJFUVVFTkNZOgogICAgICAgICAgICBQQ3RvUkRSU2V0RGF0YVJhdGVBbmRDbG9ja0ZyZXF1ZW5jeSgpOwogICAgICAgICAgICBNZXNzYWdlVG9TZW5kID0gMTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIFRSQUNFX0RFQlVHKCJkZWZhdWx0OiBOb3Qgc3VwcG9ydGVkOiAweCVYXG5cciIsIGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJNZXNzYWdlVHlwZSk7CiAgICAgICAgICAgIHZDQ0lEQ29tbWFuZE5vdFN1cHBvcnRlZCgpOwogICAgICAgICAgICBNZXNzYWdlVG9TZW5kID0gMTsKICAgICAgICAgICAgYnJlYWs7CgogICAgfQoKICAgIGlmKCBNZXNzYWdlVG9TZW5kID09IDEgKSB7CiAgICAgICAgdkNDSURTZW5kUmVzcG9uc2UoKTsKICAgIH0KfQoKCiNpZiAwCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBTRVRVUCByZXF1ZXN0IGhhbmRsZXIgZm9yIGEgQ0NJRCBkZXZpY2UKLy8vIFxwYXJhbSBwUmVxdWVzdCBQb2ludGVyIHRvIGEgVVNCR2VuZXJpY1JlcXVlc3QgaW5zdGFuY2UKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgQ0NJRF9SZXF1ZXN0SGFuZGxlcihjb25zdCBVU0JHZW5lcmljUmVxdWVzdCAqcFJlcXVlc3QpCnsKICAgIFRSQUNFX0RFQlVHKCJDQ0lEX1JIbFxuXHIiKTsKCiAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgY2xhc3MgcmVxdWVzdAogICAgaWYgKFVTQkdlbmVyaWNSZXF1ZXN0X0dldFR5cGUocFJlcXVlc3QpID09IFVTQkdlbmVyaWNSZXF1ZXN0X0NMQVNTKSB7CgogICAgICAgIC8vIENoZWNrIGlmIHRoZSByZXF1ZXN0IGlzIHN1cHBvcnRlZAogICAgICAgIHN3aXRjaCAoVVNCR2VuZXJpY1JlcXVlc3RfR2V0UmVxdWVzdChwUmVxdWVzdCkpIHsKCiAgICAgICAgICAgIGNhc2UgQ0NJREdlbmVyaWNSZXF1ZXN0X0FCT1JUOgogICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoIkNDSURHZW5lcmljUmVxdWVzdF9BQk9SVFxuXHIiKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBDQ0lER2VuZXJpY1JlcXVlc3RfR0VUX0NMT0NLX0ZSRVFVRU5DSUVTOgogICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoIk5vdCBzdXBwb3J0ZWQ6IENDSURHZW5lcmljUmVxdWVzdF9HRVRfQ0xPQ0tfRlJFUVVFTkNJRVNcblxyIik7CiAgICAgICAgICAgICAgICAvLyBBIENDSUQgd2l0aCBiTnVtQ2xvY2tTdXBwb3J0ZWQgZXF1YWwgdG8gMDBoIGRvZXMgbm90IGhhdmUgCiAgICAgICAgICAgICAgICAvLyB0byBzdXBwb3J0IHRoaXMgcmVxdWVzdAogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIENDSURHZW5lcmljUmVxdWVzdF9HRVRfREFUQV9SQVRFUzoKICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKCJOb3Qgc3VwcG9ydGVkOiBDQ0lER2VuZXJpY1JlcXVlc3RfR0VUX0RBVEFfUkFURVNcblxyIik7CiAgICAgICAgICAgICAgICAvLyBBIENDSUQgd2l0aCBiTnVtRGF0YVJhdGVzU3VwcG9ydGVkIGVxdWFsIHRvIDAwaCBkb2VzIG5vdCBoYXZlIAogICAgICAgICAgICAgICAgLy8gdG8gc3VwcG9ydCB0aGlzIHJlcXVlc3QuCiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBUUkFDRV9XQVJOSU5HKCAiQ0NJRERyaXZlcl9SZXF1ZXN0SGFuZGxlcjogVW5zdXBwb3J0ZWQgcmVxdWVzdCAoJWQpXG5cciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0JHZW5lcmljUmVxdWVzdF9HZXRSZXF1ZXN0KHBSZXF1ZXN0KSk7CiAgICAgICAgICAgICAgICBVU0JEX1N0YWxsKDApOwogICAgICAgIH0KICAgIH0KCiAgICBlbHNlIGlmIChVU0JHZW5lcmljUmVxdWVzdF9HZXRUeXBlKHBSZXF1ZXN0KSA9PSBVU0JHZW5lcmljUmVxdWVzdF9TVEFOREFSRCkgewoKICAgICAgICAvLyBGb3J3YXJkIHJlcXVlc3QgdG8gdGhlIHN0YW5kYXJkIGhhbmRsZXIKICAgICAgICBVU0JERHJpdmVyX1JlcXVlc3RIYW5kbGVyKCYoY2NpZERyaXZlci51c2JkRHJpdmVyKSwgcFJlcXVlc3QpOwogICAgfQogICAgZWxzZSB7CgogICAgICAgIC8vIFVuc3VwcG9ydGVkIHJlcXVlc3QgdHlwZQogICAgICAgIFRSQUNFX1dBUk5JTkcoICJDQ0lERHJpdmVyX1JlcXVlc3RIYW5kbGVyOiBVbnN1cHBvcnRlZCByZXF1ZXN0IHR5cGUgKCVkKVxuXHIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNCR2VuZXJpY1JlcXVlc3RfR2V0VHlwZShwUmVxdWVzdCkpOwogICAgICAgIFVTQkRfU3RhbGwoMCk7CiAgICB9Cn0KCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyAgICAgIEV4cG9ydGVkIGZ1bmN0aW9ucwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIE9wdGlvbmFsIGNhbGxiYWNrIHJlLWltcGxlbWVudGF0aW9uCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiNpZiAhZGVmaW5lZChOT0FVVE9DQUxMQkFDSykKLy8gbm90IHN0YXRpYyBmdW5jdGlvbgp2b2lkIFVTQkRDYWxsYmFja3NfUmVxdWVzdFJlY2VpdmVkKGNvbnN0IFVTQkdlbmVyaWNSZXF1ZXN0ICpyZXF1ZXN0KQp7CiAgICBDQ0lEX1JlcXVlc3RIYW5kbGVyKHJlcXVlc3QpOwp9CiNlbmRpZgojZW5kaWYKCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gSGFuZGxlcyBTbWFydENhcnQgcmVxdWVzdAovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp2b2lkIENDSURfU21hcnRDYXJkUmVxdWVzdCggdm9pZCApCnsKICAgIHVuc2lnbmVkIGNoYXIgYlN0YXR1czsKICAgIFRSQUNFX0RFQlVHKCJDQ0lEX3JlcVxuIik7CgogICAgZG8gewoKICAgICAgICBiU3RhdHVzID0gQ0NJRF9SZWFkKCAodm9pZCopJmNjaWREcml2ZXIuc0NjaWRDb21tYW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihTX2NjaWRfYnVsa19vdXRfaGVhZGVyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVHJhbnNmZXJDYWxsYmFjaykmQ0NJRENvbW1hbmREaXNwYXRjaGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKikwICk7CiAgICB9CiAgICB3aGlsZSAoMCk7Cn0KCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gUmVhZHMgZGF0YSBmcm9tIHRoZSBEYXRhIE9VVCBlbmRwb2ludAovLy8gXHBhcmFtIHBCdWZmZXIgICBCdWZmZXIgdG8gc3RvcmUgdGhlIHJlY2VpdmVkIGRhdGEKLy8vIFxwYXJhbSBkTGVuZ3RoICAgZGF0YSBidWZmZXIgbGVuZ3RoCi8vLyBccGFyYW0gZkNhbGxiYWNrIE9wdGlvbmFsIGNhbGxiYWNrIGZ1bmN0aW9uCi8vLyBccGFyYW0gcEFyZ3VtZW50IE9wdGlvbmFsIHBhcmFtZXRlciBmb3IgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uCi8vLyBccmV0dXJuIFVTQkRfU1RBVFVTX0xPQ0tFRCBvciBVU0JEX1NUQVRVU19TVUNDRVNTCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnVuc2lnbmVkIGNoYXIgQ0NJRF9SZWFkKHZvaWQgKnBCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2ZlckNhbGxiYWNrIGZDYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcEFyZ3VtZW50KQp7CiAgICByZXR1cm4gVVNCRF9SZWFkKENDSURfRVBUX0RBVEFfT1VULCBwQnVmZmVyLCBkTGVuZ3RoLCBmQ2FsbGJhY2ssIHBBcmd1bWVudCk7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBTZW5kcyBkYXRhIHRocm91Z2ggdGhlIERhdGEgSU4gZW5kcG9pbnQKLy8vIFxwYXJhbSBwQnVmZmVyICAgQnVmZmVyIGhvbGRpbmcgdGhlIGRhdGEgdG8gdHJhbnNtaXQKLy8vIFxwYXJhbSBkTGVuZ3RoICAgTGVuZ3RoIG9mIGRhdGEgYnVmZmVyCi8vLyBccGFyYW0gZkNhbGxiYWNrIE9wdGlvbmFsIGNhbGxiYWNrIGZ1bmN0aW9uCi8vLyBccGFyYW0gcEFyZ3VtZW50IE9wdGlvbmFsIHBhcmFtZXRlciBmb3IgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uCi8vLyBccmV0dXJuIFVTQkRfU1RBVFVTX0xPQ0tFRCBvciBVU0JEX1NUQVRVU19TVUNDRVNTCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnVuc2lnbmVkIGNoYXIgQ0NJRF9Xcml0ZSh2b2lkICpwQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2ZlckNhbGxiYWNrIGZDYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBBcmd1bWVudCkKewogICAgcmV0dXJuIFVTQkRfV3JpdGUoQ0NJRF9FUFRfREFUQV9JTiwgcEJ1ZmZlciwgZExlbmd0aCwgZkNhbGxiYWNrLCBwQXJndW1lbnQpOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gU2VuZHMgZGF0YSB0aHJvdWdoIHRoZSBpbnRlcnJ1cHQgZW5kcG9pbnQsIElDQyBpbnNlcnRpb24gZXZlbnQKLy8vIFJEUl90b19QQ19Ob3RpZnlTbG90Q2hhbmdlCi8vLyBccmV0dXJuIFVTQkRfU1RBVFVTX0xPQ0tFRCBvciBVU0JEX1NUQVRVU19TVUNDRVNTCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnVuc2lnbmVkIGNoYXIgQ0NJRF9JbnNlcnRpb24oIHZvaWQgKQp7CiAgICBUUkFDRV9ERUJVRygiLiIpOwoKICAgIC8vIEJ1aWxkIHRoZSBJbnRlcnJ1cHQtSU4gbWVzc2FnZQogICAgY2NpZERyaXZlci5CdWZmZXJJTlRbMF0gPSBSRFJfVE9fUENfTk9USUZZU0xPVENIQU5HRTsKICAgIGNjaWREcml2ZXIuQnVmZmVySU5UWzFdID0gSUNDX0lOU0VSVEVEX0VWRU5UOwogICAgY2NpZERyaXZlci5TbG90U3RhdHVzICAgPSBJQ0NfSU5TRVJURURfRVZFTlQ7CgogICAgLy8gTm90aWZ5IHRoZSBob3N0IHRoYXQgYSBJQ0MgaXMgaW5zZXJ0ZWQKICAgIHJldHVybiBVU0JEX1dyaXRlKCBDQ0lEX0VQVF9OT1RJRklDQVRJT04sIGNjaWREcml2ZXIuQnVmZmVySU5ULCAyLCAwLCAwICk7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBTZW5kcyBkYXRhIHRocm91Z2ggdGhlIGludGVycnVwdCBlbmRwb2ludCwgSUNDIHJlbW92YWwgZXZlbnQKLy8vIFJEUl90b19QQ19Ob3RpZnlTbG90Q2hhbmdlCi8vLyBccmV0dXJuIFVTQkRfU1RBVFVTX0xPQ0tFRCBvciBVU0JEX1NUQVRVU19TVUNDRVNTCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnVuc2lnbmVkIGNoYXIgQ0NJRF9SZW1vdmFsKCB2b2lkICkKewogICAgVFJBQ0VfREVCVUcoIi4iKTsKCiAgICAvLyBCdWlsZCB0aGUgSW50ZXJydXB0LUlOIG1lc3NhZ2UKICAgIGNjaWREcml2ZXIuQnVmZmVySU5UWzBdID0gUkRSX1RPX1BDX05PVElGWVNMT1RDSEFOR0U7CiAgICBjY2lkRHJpdmVyLkJ1ZmZlcklOVFsxXSA9IElDQ19OT1RfUFJFU0VOVDsKICAgIGNjaWREcml2ZXIuU2xvdFN0YXR1cyAgID0gSUNDX05PVF9QUkVTRU5UOwoKICAgIC8vIE5vdGlmeSB0aGUgaG9zdCB0aGF0IGEgSUNDIGlzIGluc2VydGVkCiAgICByZXR1cm4gVVNCRF9Xcml0ZSggQ0NJRF9FUFRfTk9USUZJQ0FUSU9OLCBjY2lkRHJpdmVyLkJ1ZmZlcklOVCwgMiwgMCwgMCApOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gSW50ZXJydXB0LUlOIE1lc3NhZ2VzCi8vLyBUaGlzIG1lc3NhZ2UgaXMgc2VudCB3aGVuIGFueSBiaXQgaW4gdGhlIGJIYXJkd2FyZUVycm9yQ29kZSBmaWVsZCBpcyBzZXQuIAovLy8gSWYgdGhpcyBtZXNzYWdlIGlzIHNlbnQgd2hlbiB0aGVyZSBpcyBubyCTb3V0c3RhbmRpbmeUIGNvbW1hbmQsIHRoZSBiU2VxIAovLy8gZmllbGQgd2lsbCBiZSB1bmRlZmluZWQuCi8vLyBccGFyYW0gYlNsb3QgSUNDIHNsb3QgbnVtYmVyCi8vLyBccGFyYW0gYlNlcSAgU2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBidWxrIE9VVCBjb21tYW5kIHdoZW4gdGhlIGhhcmR3YXJlIGVycm9yCi8vLyBvY2N1cmVkCi8vLyBccGFyYW0gYkhhcmR3YXJlRXJyb3JDb2RlIEhhcmR3YXJlIGVycm9yIGNvZGUKLy8vIFxyZXR1cm4gVVNCRF9TVEFUVVNfTE9DS0VEIG9yIFVTQkRfU1RBVFVTX1NVQ0NFU1MKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdW5zaWduZWQgY2hhciBSRFJ0b1BDSGFyZHdhcmVFcnJvciggdW5zaWduZWQgY2hhciBiU2xvdCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYlNlcSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYkhhcmR3YXJlRXJyb3JDb2RlICkKewogICAgVFJBQ0VfREVCVUcoIi4iKTsKCiAgICAvLyBCdWlsZCB0aGUgSW50ZXJydXB0LUlOIG1lc3NhZ2UKICAgIGNjaWREcml2ZXIuQnVmZmVySU5UWzBdID0gUkRSX1RPX1BDX0hBUkRXQVJFRVJST1I7CiAgICBjY2lkRHJpdmVyLkJ1ZmZlcklOVFsxXSA9IGJTbG90OwogICAgY2NpZERyaXZlci5CdWZmZXJJTlRbMl0gPSBiU2VxOwogICAgY2NpZERyaXZlci5CdWZmZXJJTlRbM10gPSBiSGFyZHdhcmVFcnJvckNvZGU7CgogICAgLy8gTm90aWZ5IHRoZSBob3N0IHRoYXQgYSBJQ0MgaXMgaW5zZXJ0ZWQKICAgIHJldHVybiBVU0JEX1dyaXRlKCBDQ0lEX0VQVF9OT1RJRklDQVRJT04sIGNjaWREcml2ZXIuQnVmZmVySU5ULCA0LCAwLCAwICk7Cn0KCgo=