LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiAgICAgICAgIEFUTUVMIE1pY3JvY29udHJvbGxlciBTb2Z0d2FyZSBTdXBwb3J0IAogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIENvcHlyaWdodCAoYykgMjAwOCwgQXRtZWwgQ29ycG9yYXRpb24KICoKICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgogKgogKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKICogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBkaXNjbGFpbWVyIGJlbG93LgogKgogKiBBdG1lbCdzIG5hbWUgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KICoKICogRElTQ0xBSU1FUjogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBVE1FTCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUgogKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQgQVJFCiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFUTUVMIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCiAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsCiAqIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLAogKiBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIFx1bml0Ci8vLwovLy8gIVB1cnBvc2UKLy8vIAovLy8gQ0NJRCBkcml2ZXIKLy8vIAovLy8gIVVzYWdlCi8vLyAKLy8vIEV4cGxhbmF0aW9uIG9uIHRoZSB1c2FnZSBvZiB0aGUgY29kZSBtYWRlIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBoZWFkZXIgZmlsZS4KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICAgICAgIEhlYWRlcnMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiNpbmNsdWRlICJib2FyZC5oIgojaW5jbHVkZSAic2ltdHJhY2UuaCIKCiNpZmRlZiBIQVZFX0NDSUQKCiNpbmNsdWRlIDxVU0JERHJpdmVyLmg+CiNpbmNsdWRlIDxVU0JSZXF1ZXN0cy5oPgojaW5jbHVkZSA8VVNCRGVzY3JpcHRvcnMuaD4KLy8jaW5jbHVkZSA8dXNiL2RldmljZS9kZnUvZGZ1Lmg+CiNpbmNsdWRlIDxjY2lkZHJpdmVyZGVzY3JpcHRvcnMuaD4KCi8vIEZJWE1FOiBSZW1vdmUgREZVIHJlbGF0ZWQgc3R1ZmYgCi8qIG5vIERGVSBib290bG9hZGVyIGlzIGJlaW5nIHVzZWQgKi8KI2RlZmluZSBERlVfTlVNX0lGICAgICAgMAojZGVmaW5lIERGVV9JRl9ERVNDUklQVE9SU19TVFJVQ1QKI2RlZmluZSBERlVfSUZfREVTQ1JJUFRPUlMKCiNkZWZpbmUgREZVX05VTV9TVFJJTkdTIDAKI2RlZmluZSBERlVfU1RSSU5HX0RFU0NSSVBUT1JTCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyAgICAgICAgIExvY2FsIGRlZmluaXRpb24KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vLyBDb25zdGFudHM6IElEczogRGV2aWNlIHByb2R1Y3QgSUQuCi8vI2RlZmluZSBDQ0lERHJpdmVyRGVzY3JpcHRvcnNfUFJPRFVDVElEICAgICAgIDB4NjEyOQojZGVmaW5lIENDSUREcml2ZXJEZXNjcmlwdG9yc19QUk9EVUNUSUQgICAgICAgU0lNVFJBQ0VfUFJPRFVDVF9JRAovLy8gQ29uc3RhbnRzOiBJRHM6IERldmljZSB2ZW5kb3IgSUQuCiNkZWZpbmUgQ0NJRERyaXZlckRlc2NyaXB0b3JzX1ZFTkRPUklEICAgICAgICBBVE1FTF9WRU5ET1JfSUQKLy8jZGVmaW5lIENDSUREcml2ZXJEZXNjcmlwdG9yc19WRU5ET1JJRCAgICAgICAgMHgwM0VCCi8vLyBDb25zdGFudHM6IElEczogRGV2aWNlIHJlbGVhc2UgbnVtYmVyLgojZGVmaW5lIENDSUREcml2ZXJEZXNjcmlwdG9yc19SRUxFQVNFICAgICAgICAgMHgwMTAwCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyAgICAgICAgIFR5cGVzCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLy8gRHJpdmVyIHN0cnVjdHVyZSBmb3IgYW4gQ0NJRCBkZXZpY2UKdHlwZWRlZiBzdHJ1Y3QgewoKCS8vLyBDQ0lEIG1lc3NhZ2UKCVNfY2NpZF9idWxrX2luX2hlYWRlciAgc0NjaWRNZXNzYWdlOwoJLy8vIENDSUQgY29tbWFuZAoJU19jY2lkX2J1bGtfb3V0X2hlYWRlciBzQ2NpZENvbW1hbmQ7CgkvLy8gSW50ZXJydXB0IG1lc3NhZ2UgYW5zd2VyCgl1bnNpZ25lZCBjaGFyICAgICAgICAgIEJ1ZmZlcklOVFs0XTsKCS8vLyBCdWZmZXIgZGF0YSBvZiBtZXNzYWdlCgl1bnNpZ25lZCBjaGFyICAgICAgICAgIFByb3RvY29sRGF0YVN0cnVjdHVyZVsxMF07CgkvLy8gUHJvdG9jb2wgdXNlZAoJdW5zaWduZWQgY2hhciAgICAgICAgICBiUHJvdG9jb2w7CgkvLy8gU2xvdFN0YXR1cwoJLy8vIEJpdCAwID0gU2xvdCAwIGN1cnJlbnQgc3RhdGUKCS8vLyBCaXQgMSA9IFNsb3QgMCBjaGFuZ2VkIHN0YXR1cwoJLy8vIEJpdCAyID0gU2xvdCAxIGN1cnJlbnQgc3RhdGUKCS8vLyBCaXQgMyA9IFNsb3QgMSBjaGFuZ2VkIHN0YXR1cwoJLy8vIEJpdCA0ID0gU2xvdCAyIGN1cnJlbnQgc3RhdGUKCS8vLyBCaXQgNSA9IFNsb3QgMiBjaGFuZ2VkIHN0YXR1cwoJdW5zaWduZWQgY2hhciAgICAgICAgICBTbG90U3RhdHVzOwoKfSBDQ0lERHJpdmVyOwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gICAgICAgICBMb2NhbCB2YXJpYWJsZXMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vLyBTdGF0aWMgaW5zdGFuY2Ugb2YgdGhlIENDSUQgZGV2aWNlIGRyaXZlci4Kc3RhdGljIENDSUREcml2ZXIgY2NpZERyaXZlcjsKc3RhdGljIENDSUREcml2ZXJDb25maWd1cmF0aW9uRGVzY3JpcHRvcnMgKmNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yc0ZTOwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gICAgICBJbnRlcm5hbCBmdW5jdGlvbnMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBJbml0aWFsaXplcyB0aGUgQ0NJRCBkZXZpY2UgZHJpdmVyLgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp2b2lkIENDSUREcml2ZXJfSW5pdGlhbGl6ZSggdm9pZCApCnsKCWNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yc0ZTID0gKENDSUREcml2ZXJDb25maWd1cmF0aW9uRGVzY3JpcHRvcnMgKikgY29uZmlndXJhdGlvbkRlc2NyaXB0b3JzQXJyW0NGR19OVU1fQ0NJRC0xXTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIFJlc3BvbnNlIFBpcGUsIEJ1bGstSU4gTWVzc2FnZXMKLy8vIFJldHVybiB0aGUgU2xvdCBTdGF0dXMgdG8gdGhlIGhvc3QKLy8vIEFuc3dlciB0bzoKLy8vICAgUENfdG9fUkRSX0ljY1Bvd2VyT2ZmCi8vLyAgIFBDX3RvX1JEUl9HZXRTbG90U3RhdHVzCi8vLyAgIFBDX3RvX1JEUl9JY2NDbG9jawovLy8gICBQQ190b19SRFJfVDBBUERVCi8vLyAgIFBDX3RvX1JEUl9NZWNoYW5pY2FsCi8vLyAgIFBDX3RvX1JEUl9BYm9ydCBhbmQgQ2xhc3Mgc3BlY2lmaWMgQUJPUlQgcmVxdWVzdAovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBSRFJ0b1BDU2xvdFN0YXR1cyggdm9pZCApCnsKCS8vIEhlYWRlciBmaWVsZHMgc2V0dGluZ3MKCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJNZXNzYWdlVHlwZSA9IFJEUl9UT19QQ19TTE9UU1RBVFVTOwoJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2Uud0xlbmd0aCAgID0gMDsKCglpZiAoY2NpZERyaXZlci5TbG90U3RhdHVzID09IElDQ19JTlNFUlRFRF9FVkVOVCkgewoJCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAwOyAgICAvKiBJQ0MgcHJlc2VudCBhbmQgYWN0aXZlIGNhcmQgKi8KCX0gZWxzZSBpZiAoY2NpZERyaXZlci5TbG90U3RhdHVzID09IElDQ19OT1RfUFJFU0VOVCkgewoJCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAyOyAgICAvKiBObyBJQ0MgcHJlc2VudCovCgl9IGVsc2V7CgkJVFJBQ0VfRVJST1IoIlN0cmFuZ2UgYlN0YXR1cyIpOwoJCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAwOwoJfQoJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYkVycm9yICAgID0gMDsKCS8vIDAwaCBDbG9jayBydW5uaW5nCgkvLyAwMWggQ2xvY2sgc3RvcHBlZCBpbiBzdGF0ZSBMCgkvLyAwMmggQ2xvY2sgc3RvcHBlZCBpbiBzdGF0ZSBICgkvLyAwM2ggQ2xvY2sgc3RvcHBlZCBpbiBhbiB1bmtub3duIHN0YXRlCgkvLyBBbGwgb3RoZXIgdmFsdWVzIGFyZSBSZXNlcnZlZCBmb3IgRnV0dXJlIFVzZS4KCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTcGVjaWZpYyA9IDA7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBSZXNwb25zZSBQaXBlLCBCdWxrLUlOIE1lc3NhZ2VzCi8vLyBBbnN3ZXIgdG8gUENfdG9fUkRSX0ljY1Bvd2VyT24KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgUkRSdG9QQ0RhdGFibG9ja19BVFIoIHZvaWQgKQp7Cgl1bnNpZ25lZCBjaGFyIGk7Cgl1bnNpZ25lZCBjaGFyIEF0cltBVFJfU0laRV9NQVhdOwoJdW5zaWduZWQgY2hhciBsZW5ndGg7Cgl1aW50MzJfdCBzdGF0dXM7IAoKCVRSQUNFX0RFQlVHKCIuIik7CgoJc3RhdHVzID0gSVNPNzgxNl9EYXRhYmxvY2tfQVRSKCBBdHIsICZsZW5ndGggKTsKCUlTTzc4MTZfRGVjb2RlX0FUUiggQXRyICk7CgoJaWYgKHN0YXR1cyA9PSAwKSB7CgkJVFJBQ0VfREVCVUcoIlRpbWVvdXQgb2NjdXJlZCB3aGlsZSByZWFkaW5nIEFUUiIpOwovLyBGSVhNRTogcmVhY3QgcHJvcGVybHkgdG8gdGltZW91dC4uCi8vICAgICAgICByZXR1cm47Cgl9CgovLyBGSVhNRTogTW9yZSB0ZXN0cz8gSXMgYlByb3RvY29sID0gQXRyWzNdID8KCWlmKCBsZW5ndGggPiA1ICkgewoJCWNjaWREcml2ZXIuUHJvdG9jb2xEYXRhU3RydWN0dXJlWzFdID0gQXRyWzNdJjB4MEY7IC8vIFREKDEpCgkJY2NpZERyaXZlci5iUHJvdG9jb2wgPSBBdHJbM10mMHgwRjsgICAgICAgICAgIC8vIFREKDEpCgkJVFJBQ0VfSU5GTygiUHJvdG9jb2wgZGF0YSBzdHJ1Y3R1cmU6IDB4JXhcblxyIiwKCQkJCQkgICAgY2NpZERyaXZlci5Qcm90b2NvbERhdGFTdHJ1Y3R1cmVbMV0pOwoJfQoKCS8vIFNfY2NpZF9wcm90b2NvbF90MAoJLy8gYm1GaW5kZXhEaW5kZXgKCWNjaWREcml2ZXIuUHJvdG9jb2xEYXRhU3RydWN0dXJlWzBdID0gQXRyWzJdOyAgICAgLy8gVEEoMSkKCgkvLyBibVRDQ0tTVDAKCS8vIEZvciBUPTAgLEIwIJYgMGIsIEI3LTIgliAwMDAwMDBiCgkvLyBCMSCWIENvbnZlbnRpb24gdXNlZCAoYjE9MCBmb3IgZGlyZWN0LCBiMT0xIGZvciBpbnZlcnNlKQoKCS8vIGJHdWFyZFRpbWVUMAoJLy8gRXh0cmEgR3VhcmR0aW1lIGJldHdlZW4gdHdvIGNoYXJhY3RlcnMuIEFkZCAwIHRvIDI1NCBldHUgdG8gdGhlIG5vcm1hbCAKCS8vIGd1YXJkdGltZSBvZiAxMmV0dS4gRkZoIGlzIHRoZSBzYW1lIGFzIDAwaC4KCWNjaWREcml2ZXIuUHJvdG9jb2xEYXRhU3RydWN0dXJlWzJdID0gQXRyWzRdOyAgICAgLy8gVEMoMSkKCS8vIEFUOTFDX0JBU0VfVVMwLT5VU19UVEdSID0gMDsgIC8vIFRDMQoKCS8vIGJXYWl0aW5nSW50ZWdlclQwCgkvLyBXSSBmb3IgVD0wIHVzZWQgdG8gZGVmaW5lIFdXVAoJY2NpZERyaXZlci5Qcm90b2NvbERhdGFTdHJ1Y3R1cmVbM10gPSBBdHJbN107ICAgICAvLyBUQygyKQoKCS8vIGJDbG9ja1N0b3AKCS8vIElDQyBDbG9jayBTdG9wIFN1cHBvcnQKCS8vIDAwID0gU3RvcHBpbmcgdGhlIENsb2NrIGlzIG5vdCBhbGxvd2VkCgkvLyAwMSA9IFN0b3Agd2l0aCBDbG9jayBzaWduYWwgTG93CgkvLyAwMiA9IFN0b3Agd2l0aCBDbG9jayBzaWduYWwgSGlnaAoJLy8gMDMgPSBTdG9wIHdpdGggQ2xvY2sgZWl0aGVyIEhpZ2ggb3IgTG93CgljY2lkRHJpdmVyLlByb3RvY29sRGF0YVN0cnVjdHVyZVs0XSA9IDB4MDA7ICAgICAgIC8vIDAgdG8gMwoKCS8vIEhlYWRlciBmaWVsZHMgc2V0dGluZ3MKCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJNZXNzYWdlVHlwZSA9IFJEUl9UT19QQ19EQVRBQkxPQ0s7CgljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS53TGVuZ3RoICAgICAgPSBsZW5ndGg7ICAvLyBTaXplIG9mIEFUUgoJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlNpemVUb1NlbmQgKz0gbGVuZ3RoOyAgLy8gU2l6ZSBvZiBBVFIKCS8vIGJDaGFpblBhcmFtZXRlcjogMDAgdGhlIHJlc3BvbnNlIEFQRFUgYmVnaW5zIGFuZCBlbmRzIGluIHRoaXMgY29tbWFuZAoJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlNwZWNpZmljICAgID0gMDsKCglmb3IoIGk9MDsgaTxsZW5ndGg7IGkrKyApIHsKCgkJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYWJEYXRhW2ldICA9IEF0cltpXTsKCX0KCgkvLyBTZXQgdGhlIHNsb3QgdG8gYW4gYWN0aXZlIHN0YXR1cwoJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyA9IDA7CgljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iRXJyb3IgPSAwOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gUmVzcG9uc2UgUGlwZSwgQnVsay1JTiBNZXNzYWdlcwovLy8gSW4gb3RoZXIgY2FzZXMsIHRoZSByZXNwb25zZSBtZXNzYWdlIGhhcyB0aGUgZm9sbG93aW5nIGZvcm1hdDogCi8vLyBUaGUgcmVzcG9uc2UgZGF0YSB3aWxsIGNvbnRhaW4gdGhlIG9wdGlvbmFsIGRhdGEgcmV0dXJuZWQgYnkgdGhlIElDQywgCi8vLyBmb2xsb3dlZCBieSB0aGUgMiBieXRlLXNpemUgc3RhdHVzIHdvcmRzIFNXMS1TVzIuCi8vLwovLy8gQW5zd2VyIHRvOgovLy8gICBQQ190b19SRFJfWGZyQmxvY2sKLy8vICAgUENfdG9fUkRSX1NlY3VyZQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBSRFJ0b1BDRGF0YWJsb2NrKCB2b2lkICkKewoJLy9UUkFDRV9ERUJVRygiLiIpOwoKCS8vIEhlYWRlciBmaWVsZHMgc2V0dGluZ3MKCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJNZXNzYWdlVHlwZSA9IFJEUl9UT19QQ19EQVRBQkxPQ0s7CgljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU2l6ZVRvU2VuZCArPSBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS53TGVuZ3RoOwoJLy8gYkNoYWluUGFyYW1ldGVyOiAwMCB0aGUgcmVzcG9uc2UgQVBEVSBiZWdpbnMgYW5kIGVuZHMgaW4gdGhpcyBjb21tYW5kCgljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3BlY2lmaWMgPSAwOwoKCS8vIFNldCB0aGUgc2xvdCB0byBhbiBhY3RpdmUgc3RhdHVzCgljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3RhdHVzID0gMDsKCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJFcnJvciA9IDA7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBSZXNwb25zZSBQaXBlLCBCdWxrLUlOIE1lc3NhZ2VzCi8vLyBBbnN3ZXIgdG86Ci8vLyAgIFBDX3RvX1JEUl9HZXRQYXJhbWV0ZXJzCi8vLyAgIFBDX3RvX1JEUl9SZXNldFBhcmFtZXRlcnMKLy8vICAgUENfdG9fUkRSX1NldFBhcmFtZXRlcnMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgUkRSdG9QQ1BhcmFtZXRlcnMoIHZvaWQgKQp7Cgl1bnNpZ25lZCBpbnQgaTsKCglUUkFDRV9ERUJVRygiLiIpOwoKCS8vIEhlYWRlciBmaWVsZHMgc2V0dGluZ3MKCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJNZXNzYWdlVHlwZSA9IFJEUl9UT19QQ19QQVJBTUVURVJTOwoKCS8vY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyA9IDA7CgljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iRXJyb3IgID0gMDsKCglpZiggY2NpZERyaXZlci5Qcm90b2NvbERhdGFTdHJ1Y3R1cmVbMV0gPT0gUFJPVE9DT0xfVE8gKSB7CgoJCS8vIFQ9MAoJCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLndMZW5ndGggICA9IHNpemVvZihTX2NjaWRfcHJvdG9jb2xfdDApOwoJCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTcGVjaWZpYyA9IFBST1RPQ09MX1RPOwoJfQoJZWxzZSB7CgoJCS8vIFQ9MQoJCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLndMZW5ndGggICA9IHNpemVvZihTX2NjaWRfcHJvdG9jb2xfdDEpOwoJCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTcGVjaWZpYyA9IFBST1RPQ09MX1QxOwoJfQoKCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTaXplVG9TZW5kICs9IGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLndMZW5ndGg7CgoJZm9yKCBpPTA7IGk8Y2NpZERyaXZlci5zQ2NpZE1lc3NhZ2Uud0xlbmd0aDsgaSsrICkgewoJCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmFiRGF0YVtpXSA9IGNjaWREcml2ZXIuUHJvdG9jb2xEYXRhU3RydWN0dXJlW2ldOwoJfQoKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIFJlc3BvbnNlIFBpcGUsIEJ1bGstSU4gTWVzc2FnZXMKLy8vIEFuc3dlciB0bzoKLy8vICAgUENfdG9fUkRSX0VzY2FwZQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBSRFJ0b1BDRXNjYXBlKCB1bnNpZ25lZCBjaGFyIGxlbmd0aCwgdW5zaWduZWQgY2hhciAqZGF0YV9zZW5kX2Zyb21fQ0NJRCApCnsKCXVuc2lnbmVkIGludCBpOwoKCVRSQUNFX0RFQlVHKCIuIik7CgoJLy8gSGVhZGVyIGZpZWxkcyBzZXR0aW5ncwoJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYk1lc3NhZ2VUeXBlID0gUkRSX1RPX1BDX0VTQ0FQRTsKCgljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS53TGVuZ3RoICAgPSBsZW5ndGg7CgoJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyA9IDA7CgljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iRXJyb3IgID0gMDsKCgljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3BlY2lmaWMgPSAwOyAgLy8gYlJGVQoKCWZvciggaT0wOyBpPGxlbmd0aDsgaSsrICkgewoJCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmFiRGF0YVtpXSA9IGRhdGFfc2VuZF9mcm9tX0NDSURbaV07Cgl9Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBSZXNwb25zZSBQaXBlLCBCdWxrLUlOIE1lc3NhZ2VzCi8vLyBBbnN3ZXIgdG86IAovLy8gICBQQ190b19SRFJfU2V0RGF0YVJhdGVBbmRDbG9ja0ZyZXF1ZW5jeQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBSRFJ0b1BDRGF0YVJhdGVBbmRDbG9ja0ZyZXF1ZW5jeSggdW5zaWduZWQgaW50IGR3Q2xvY2tGcmVxdWVuY3ksIAoJCQkJCSAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZHdEYXRhUmF0ZSApCnsKCVRSQUNFX0RFQlVHKCIuIik7CgoJLy8gSGVhZGVyIGZpZWxkcyBzZXR0aW5ncwoJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYk1lc3NhZ2VUeXBlID0gUkRSX1RPX1BDX0RBVEFSQVRFQU5EQ0xPQ0tGUkVRVUVOQ1k7CgoJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2Uud0xlbmd0aCAgID0gODsKCgljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3RhdHVzID0gMDsKCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJFcnJvciAgPSAwOwoKCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTcGVjaWZpYyA9IDA7ICAvLyBiUkZVCgoJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYWJEYXRhWzBdID0gZHdDbG9ja0ZyZXF1ZW5jeTsKCQoJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYWJEYXRhWzRdID0gZHdEYXRhUmF0ZTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIENvbW1hbmQgUGlwZSwgQnVsay1PVVQgTWVzc2FnZXMKLy8vIFBvd2VyIE9uIENvbW1hbmQgLSBDb2xkIFJlc2V0ICYgV2FybSBSZXNldCAKLy8vIFJldHVybiB0aGUgQVRSIHRvIHRoZSBob3N0Ci8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIFBDdG9SRFJJY2NQb3dlck9uKCB2b2lkICkKewoJVFJBQ0VfREVCVUcoIi4iKTsKCWlmKCBDQ0lEX0ZFQVRVUkVTX0FVVE9fVk9MVCA9PSAoY29uZmlndXJhdGlvbkRlc2NyaXB0b3JzRlMtPmNjaWQuZHdGZWF0dXJlcyAmIENDSURfRkVBVFVSRVNfQVVUT19WT0xUKSApIHsKCgkJLy9iUG93ZXJTZWxlY3QgPSBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU3BlY2lmaWNfMDsKCQljY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU3BlY2lmaWNfMCA9IFZPTFRTX0FVVE87Cgl9CgoJSVNPNzgxNl93YXJtX3Jlc2V0KCk7Ci8vICAgIElTTzc4MTZfY29sZF9yZXNldCgpOwoKCS8vIGZvciBlbXVsYXRpb24gb25seSAvL0pDQiAKCWlmICggY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNwZWNpZmljXzAgIT0gVk9MVFNfNV8wICkgewoKCQlUUkFDRV9FUlJPUigiUE9XRVJfTk9UX1NVUFBPUlRFRFxuXHIiKTsKCX0KCgllbHNlIHsKCgkJUkRSdG9QQ0RhdGFibG9ja19BVFIoKTsKCgl9Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBDb21tYW5kIFBpcGUsIEJ1bGstT1VUIE1lc3NhZ2VzCi8vLyBQb3dlciBPZmYgQ29tbWFuZCAtIFNldCB0aGUgSUNDIGluIGFuIGluYWN0aXZlIHN0YXRlCi8vLyBSZXR1cm4gdGhlIHNsb3Qgc3RhdHVzIHRvIHRoZSBob3N0Ci8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIFBDdG9SRFJJY2NQb3dlck9mZiggdm9pZCApCnsKCXVuc2lnbmVkIGNoYXIgYlN0YXR1czsKCglUUkFDRV9ERUJVRygiLiIpOwoKCUlTTzc4MTZfSWNjUG93ZXJPZmYoKTsKCgkvL0pDQiBzdHViCgliU3RhdHVzID0gSUNDX0JTX1BSRVNFTlRfTk9UQUNUSVZBVEVEOwoKCS8vIFNldCB0aGUgc2xvdCB0byBhbiBpbmFjdGl2ZSBzdGF0dXMKCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAwOwoJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYkVycm9yID0gMDsKCgkvLyBpZiBlcnJvciwgc2VlIFRhYmxlIDYuMS0yIGVycm9ycwoKCS8vIFJldHVybiB0aGUgc2xvdCBzdGF0dXMgdG8gdGhlIGhvc3QKCVJEUnRvUENTbG90U3RhdHVzKCk7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBDb21tYW5kIFBpcGUsIEJ1bGstT1VUIE1lc3NhZ2VzCi8vLyBHZXQgc2xvdCBzdGF0dXMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgUEN0b1JEUkdldFNsb3RTdGF0dXMoIHZvaWQgKQp7CglUUkFDRV9ERUJVRygiLiIpOwoKCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAwOwoJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYkVycm9yID0gMDsKCgkvLyBSZXR1cm4gdGhlIHNsb3Qgc3RhdHVzIHRvIHRoZSBob3N0CglSRFJ0b1BDU2xvdFN0YXR1cygpOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gQ29tbWFuZCBQaXBlLCBCdWxrLU9VVCBNZXNzYWdlcwovLy8gSWYgdGhlIGNvbW1hbmQgaGVhZGVyIGlzIHZhbGlkLCBhbiBBUERVIGNvbW1hbmQgaXMgcmVjZWl2ZWQgYW5kIGNhbiBiZSByZWFkCi8vLyBieSB0aGUgYXBwbGljYXRpb24KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgUEN0b1JEUlhmckJsb2NrKCB2b2lkICkKewoJdWludDE2X3QgbXNnbGVuID0gMDsKCXVpbnQzMl90IHJldDsKCglUUkFDRV9ERUJVRygiUEN0b1JEUlhmckJsb2NrXG5cciIpOwoKCS8vIENoZWNrIHRoZSBibG9jayBsZW5ndGgKCWlmICggY2NpZERyaXZlci5zQ2NpZENvbW1hbmQud0xlbmd0aCA+IChjb25maWd1cmF0aW9uRGVzY3JpcHRvcnNGUy0+Y2NpZC5kd01heENDSURNZXNzYWdlTGVuZ3RoLTEwKSApIHsKCQlUUkFDRV9ERUJVRygiRXJyIGJsb2NrL21zZyBsZW4iKTsKCQljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3RhdHVzID0gMTsKCQljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iRXJyb3IgID0gMDsKCX0KCS8vIGNoZWNrIGJCV0kKCWVsc2UgaWYgKCAwICE9IGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJTcGVjaWZpY18wICkgewoKCQkgVFJBQ0VfRVJST1IoIkJhZCBiQldJXG5cciIpOwoJfQoJZWxzZSB7CgoJCS8vIEFQRFUgb3IgVFBEVQoJCXN3aXRjaChjb25maWd1cmF0aW9uRGVzY3JpcHRvcnNGUy0+Y2NpZC5kd0ZlYXR1cmVzIAoJCQkgICYgKENDSURfRkVBVFVSRVNfRVhDX1RQRFV8Q0NJRF9GRUFUVVJFU19FWENfU0FQRFV8Q0NJRF9GRUFUVVJFU19FWENfQVBEVSkpIHsKCgkJCWNhc2UgQ0NJRF9GRUFUVVJFU19FWENfVFBEVToKCQkJCWlmIChjY2lkRHJpdmVyLlByb3RvY29sRGF0YVN0cnVjdHVyZVsxXSA9PSBQUk9UT0NPTF9UTykgewoJCQkJCVRSQUNFX0RFQlVHKCJBUERVIGNtZDogJXggJXggJXggLi4iLCBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5BUERVWzBdLCBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5BUERVWzFdLGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLkFQRFVbMl0gKTsKCgkJCQkJLy8gU2VuZCBjb21tYW5kZSBBUERVCgkJCQkJcmV0ID0gSVNPNzgxNl9YZnJCbG9ja1RQRFVfVDAoIGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLkFQRFUgLAoJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmFiRGF0YSwKCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC53TGVuZ3RoLAoJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICZtc2dsZW4gKTsKCQkJCQlpZiAocmV0ICE9IDApIHsKCQkJCQkgICAgVFJBQ0VfRVJST1IoIkFQRFUgY291bGQgbm90IGJlIHNlbnQ6IChVU19DU1IgPSAweCV4KSIsIHJldCk7CgkJCQkJICAgIHJldHVybjsKCQkJCQl9CgkJCQl9CgkJCQllbHNlIHsKCQkJCQlpZiAoY2NpZERyaXZlci5Qcm90b2NvbERhdGFTdHJ1Y3R1cmVbMV0gPT0gUFJPVE9DT0xfVDEpIHsKCQkJCQkgICAgVFJBQ0VfREVCVUcoIk5vdCBzdXBwb3J0ZWQgVD0xXG5cciIpOwoJCQkJCX0KCQkJCQllbHNlIHsKCQkJCQkgICAgVFJBQ0VfREVCVUcoIk5vdCBzdXBwb3J0ZWQgMHgleFxuXHIiLCBjY2lkRHJpdmVyLlByb3RvY29sRGF0YVN0cnVjdHVyZVsxXSk7CgkJCQkJfQoJCQkJfQoJCQkJYnJlYWs7CgoJCQljYXNlIENDSURfRkVBVFVSRVNfRVhDX0FQRFU6CgkJCQlUUkFDRV9ERUJVRygiTm90IHN1cHBvcnRlZCBDQ0lEX0ZFQVRVUkVTX0VYQ19BUERVXG5cciIpOwoJCQkJYnJlYWs7CgoJCQlkZWZhdWx0OgoJCQkJYnJlYWs7CgkJfQoKCX0KCgljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS53TGVuZ3RoID0gbXNnbGVuOwoJVFJBQ0VfREVCVUcoIlVTQjogMHglWCwgMHglWCwgMHglWCwgMHglWCwgMHglWFxuXHIiLCBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5hYkRhdGFbMF0sIAoJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmFiRGF0YVsxXSwgCgkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYWJEYXRhWzJdLCAKCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5hYkRhdGFbM10sCgkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYWJEYXRhWzRdICk7CgkgUkRSdG9QQ0RhdGFibG9jaygpOwoKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIENvbW1hbmQgUGlwZSwgQnVsay1PVVQgTWVzc2FnZXMKLy8vIHJldHVybiBwYXJhbWV0ZXJzIGJ5IHRoZSBjb21tYW5kOiBSRFJfdG9fUENfUGFyYW1ldGVycwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBQQ3RvUkRSR2V0UGFyYW1ldGVycyggdm9pZCApCnsKCVRSQUNFX0RFQlVHKCIuIik7CgoJLy8gV2Ugc3VwcG9ydCBvbmx5IG9uZSBzbG90CgoJLy8gYm1JY2NTdGF0dXMKCWlmKCBJU083ODE2X1N0YXR1c1Jlc2V0KCkgKSB7CgkJLy8gMDogQW4gSUNDIGlzIHByZXNlbnQgYW5kIGFjdGl2ZSAocG93ZXIgaXMgb24gYW5kIHN0YWJsZSwgUlNUIGlzIGluYWN0aXZlCgkJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyA9IDA7Cgl9CgllbHNlIHsKCQkvLyAxOiBBbiBJQ0MgaXMgcHJlc2VudCBhbmQgaW5hY3RpdmUgKG5vdCBhY3RpdmF0ZWQgb3Igc2h1dCBkb3duIGJ5IGhhcmR3YXJlIGVycm9yKQoJCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAxOwoJfQoKCVJEUnRvUENQYXJhbWV0ZXJzKCk7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBDb21tYW5kIFBpcGUsIEJ1bGstT1VUIE1lc3NhZ2VzCi8vLyBUaGlzIGNvbW1hbmQgcmVzZXRzIHRoZSBzbG90IHBhcmFtZXRlcnMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgUEN0b1JEUlJlc2V0UGFyYW1ldGVycyggdm9pZCApCnsKCVRSQUNFX0RFQlVHKCIuIik7CgoJY2NpZERyaXZlci5TbG90U3RhdHVzID0gSUNDX05PVF9QUkVTRU5UOwoJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyA9IGNjaWREcml2ZXIuU2xvdFN0YXR1czsKCglSRFJ0b1BDUGFyYW1ldGVycygpOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gQ29tbWFuZCBQaXBlLCBCdWxrLU9VVCBNZXNzYWdlcwovLy8gVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gY2hhbmdlIHRoZSBwYXJhbWV0ZXJzIGZvciBhIGdpdmVuIHNsb3QuCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIFBDdG9SRFJTZXRQYXJhbWV0ZXJzKCB2b2lkICkKewoJVFJBQ0VfREVCVUcoIi4iKTsKCgljY2lkRHJpdmVyLlNsb3RTdGF0dXMgPSBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU2xvdDsKCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSBjY2lkRHJpdmVyLlNsb3RTdGF0dXM7CgkvLyBOb3QgYWxsIGZlYXR1cmUgc3VwcG9ydGVkCgoJUkRSdG9QQ1BhcmFtZXRlcnMoKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIENvbW1hbmQgUGlwZSwgQnVsay1PVVQgTWVzc2FnZXMKLy8vIFRoaXMgY29tbWFuZCBhbGxvd3MgdGhlIENDSUQgbWFudWZhY3R1cmVyIHRvIGRlZmluZSBhbmQgYWNjZXNzIGV4dGVuZGVkIAovLy8gZmVhdHVyZXMuIAovLy8gSW5mb3JtYXRpb24gc2VudCB2aWEgdGhpcyBjb21tYW5kIGlzIHByb2Nlc3NlZCBieSB0aGUgQ0NJRCBjb250cm9sIGxvZ2ljLgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBQQ3RvUkRSRXNjYXBlKCB2b2lkICkKewoJVFJBQ0VfREVCVUcoIi4iKTsKCgkvLyBJZiBuZWVkZWQgYnkgdGhlIHVzZXIKCUlTTzc4MTZfRXNjYXBlKCk7CgoJLy8gc3R1YiwgcmV0dXJuIGFsbCB2YWx1ZSBzZW5kCglSRFJ0b1BDRXNjYXBlKCBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC53TGVuZ3RoLCBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5BUERVKTsgICAgCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBDb21tYW5kIFBpcGUsIEJ1bGstT1VUIE1lc3NhZ2VzCi8vLyBUaGlzIGNvbW1hbmQgc3RvcHMgb3IgcmVzdGFydHMgdGhlIGNsb2NrLgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBQQ3RvUkRSSUNDQ2xvY2soIHZvaWQgKQp7CglUUkFDRV9ERUJVRygiLiIpOwoKCWlmKCAwID09IGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJTcGVjaWZpY18wICkgewoJCS8vIHJlc3RhcnRzIHRoZSBjbG9jawoJCUlTTzc4MTZfUmVzdGFydENsb2NrKCk7Cgl9CgllbHNlIHsKCQkvLyBzdG9wIGNsb2NrIGluIHRoZSBzdGF0ZSBzaG93biBpbiB0aGUgYkNsb2NrU3RvcCBmaWVsZAoJCUlTTzc4MTZfU3RvcENsb2NrKCk7Cgl9CgoJUkRSdG9QQ1Nsb3RTdGF0dXMoICk7ICAgIAp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gQ29tbWFuZCBQaXBlLCBCdWxrLU9VVCBNZXNzYWdlcwovLy8gVGhpcyBjb21tYW5kIGNoYW5nZXMgdGhlIHBhcmFtZXRlcnMgdXNlZCB0byBwZXJmb3JtIHRoZSB0cmFuc3BvcnRhdGlvbiBvZiAKLy8vIEFQRFUgbWVzc2FnZXMgYnkgdGhlIFQ9MCBwcm90b2NvbC4gCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIFBDdG9SRFJ0b0FQRFUoIHZvaWQgKQp7Cgl1bnNpZ25lZCBjaGFyIGJtQ2hhbmdlczsKCXVuc2lnbmVkIGNoYXIgYkNsYXNzR2V0UmVzcG9uc2U7Cgl1bnNpZ25lZCBjaGFyIGJDbGFzc0VudmVsb3BlOwoKCVRSQUNFX0lORk8oIi4iKTsKCglpZiggY29uZmlndXJhdGlvbkRlc2NyaXB0b3JzRlMtPmNjaWQuZHdGZWF0dXJlcyA9PSAoQ0NJRF9GRUFUVVJFU19FWENfU0FQRFV8Q0NJRF9GRUFUVVJFU19FWENfQVBEVSkgKSB7CgoJCWJtQ2hhbmdlcyA9IGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJTcGVjaWZpY18wOwoJCWJDbGFzc0dldFJlc3BvbnNlID0gY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNwZWNpZmljXzE7CgkJYkNsYXNzRW52ZWxvcGUgPSBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU3BlY2lmaWNfMjsKCgkJSVNPNzgxNl90b0FQRFUoKTsKCX0KCglSRFJ0b1BDU2xvdFN0YXR1cygpOyAgICAKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIENvbW1hbmQgUGlwZSwgQnVsay1PVVQgTWVzc2FnZXMKLy8vIFRoaXMgaXMgYSBjb21tYW5kIG1lc3NhZ2UgdG8gYWxsb3cgZW50ZXJpbmcgdGhlIFBJTiBmb3IgdmVyaWZpY2F0aW9uIG9yCi8vLyBtb2RpZmljYXRpb24uCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIFBDdG9SRFJTZWN1cmUoIHZvaWQgKQp7CglUUkFDRV9ERUJVRygiLiIpOwoKCVRSQUNFX0RFQlVHKCJGb3IgdXNlclxuXHIiKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIENvbW1hbmQgUGlwZSwgQnVsay1PVVQgTWVzc2FnZXMKLy8vIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIG1hbmFnZSBtb3Rvcml6ZWQgdHlwZSBDQ0lEIGZ1bmN0aW9uYWxpdHkuIAovLy8gVGhlIExvY2sgQ2FyZCBmdW5jdGlvbiBpcyB1c2VkIHRvIGhvbGQgdGhlIElDQy4gCi8vLyBUaGlzIHByZXZlbnRzIGFuIElDQyBmcm9tIGJlaW5nIGVhc2lseSByZW1vdmVkIGZyb20gdGhlIENDSUQuIAovLy8gVGhlIFVubG9jayBDYXJkIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVtb3ZlIHRoZSBob2xkIGluaXRpYXRlZCBieSB0aGUgTG9jayAKLy8vIENhcmQgZnVuY3Rpb24KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgUEN0b1JEUk1lY2hhbmljYWwoIHZvaWQgKQp7CglUUkFDRV9ERUJVRygiLiIpOwoJVFJBQ0VfREVCVUcoIk5vdCBpbXBsZW1lbnRlZFxuXHIiKTsKCglSRFJ0b1BDU2xvdFN0YXR1cygpOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gQ29tbWFuZCBQaXBlLCBCdWxrLU9VVCBNZXNzYWdlcwovLy8gVGhpcyBjb21tYW5kIGlzIHVzZWQgd2l0aCB0aGUgQ29udHJvbCBwaXBlIEFib3J0IHJlcXVlc3QgdG8gdGVsbCB0aGUgQ0NJRCAKLy8vIHRvIHN0b3AgYW55IGN1cnJlbnQgdHJhbnNmZXIgYXQgdGhlIHNwZWNpZmllZCBzbG90IGFuZCByZXR1cm4gdG8gYSBzdGF0ZSAKLy8vIHdoZXJlIHRoZSBzbG90IGlzIHJlYWR5IHRvIGFjY2VwdCBhIG5ldyBjb21tYW5kIHBpcGUgQnVsay1PVVQgbWVzc2FnZS4KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgUEN0b1JEUkFib3J0KCB2b2lkICkKewoJVFJBQ0VfREVCVUcoIi4iKTsKCglSRFJ0b1BDU2xvdFN0YXR1cygpOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gQ29tbWFuZCBQaXBlLCBCdWxrLU9VVCBNZXNzYWdlcwovLy8gVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gbWFudWFsbHkgc2V0IHRoZSBkYXRhIHJhdGUgYW5kIGNsb2NrIGZyZXF1ZW5jeSBvZiAKLy8vIGEgc3BlY2lmaWMgc2xvdC4KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgUEN0b1JEUlNldERhdGFSYXRlQW5kQ2xvY2tGcmVxdWVuY3koIHZvaWQgKQp7Cgl1bnNpZ25lZCBpbnQgZHdDbG9ja0ZyZXF1ZW5jeTsKCXVuc2lnbmVkIGludCBkd0RhdGFSYXRlOwoKCVRSQUNFX0RFQlVHKCIuIik7CgoJZHdDbG9ja0ZyZXF1ZW5jeSA9IGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLkFQRFVbMF0KCQkJCQkgKyAoY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuQVBEVVsxXTw8OCkKCQkJCQkgKyAoY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuQVBEVVsyXTw8MTYpCgkJCQkJICsgKGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLkFQRFVbM108PDI0KTsKCglkd0RhdGFSYXRlID0gY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuQVBEVVs0XQoJCQkgICArIChjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5BUERVWzVdPDw4KQoJCQkgICArIChjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5BUERVWzZdPDwxNikKCQkJICAgKyAoY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuQVBEVVs3XTw8MjQpOwoKCUlTTzc4MTZfU2V0RGF0YVJhdGVhbmRDbG9ja0ZyZXF1ZW5jeSggZHdDbG9ja0ZyZXF1ZW5jeSwgZHdEYXRhUmF0ZSApOwoKCVJEUnRvUENEYXRhUmF0ZUFuZENsb2NrRnJlcXVlbmN5KCBkd0Nsb2NrRnJlcXVlbmN5LCBkd0RhdGFSYXRlICk7Cgp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gUmVwb3J0IHRoZSBDTURfTk9UX1NVUFBPUlRFRCBlcnJvciB0byB0aGUgaG9zdAovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCB2Q0NJRENvbW1hbmROb3RTdXBwb3J0ZWQoIHZvaWQgKQp7CgkvLyBDb21tYW5kIG5vdCBzdXBwb3J0ZWQKCS8vIHZDQ0lEUmVwb3J0RXJyb3IoQ01EX05PVF9TVVBQT1JURUQpOwoKCVRSQUNFX0RFQlVHKCJDTURfTk9UX1NVUFBPUlRFRFxuXHIiKTsKCgkvLyBIZWFkZXIgZmllbGRzIHNldHRpbmdzCgljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iTWVzc2FnZVR5cGUgPSBSRFJfVE9fUENfU0xPVFNUQVRVUzsKCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLndMZW5ndGggICAgICA9IDA7CgljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3BlY2lmaWMgICAgPSAwOwoKCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgfD0gSUNDX0NTX0ZBSUxFRDsKCgkvLyBTZW5kIHRoZSByZXNwb25zZSB0byB0aGUgaG9zdAoJLy92Q0NJRFNlbmRSZXNwb25zZSgpOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gU2VudCBDQ0lEIHJlc3BvbnNlIG9uIFVTQgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCB2Q0NJRFNlbmRSZXNwb25zZSggdm9pZCApCnsKCXVuc2lnbmVkIGNoYXIgYlN0YXR1czsKCVRSQUNFX0RFQlVHKCIuIik7CgoJZG8gewoJCWJTdGF0dXMgPSBDQ0lEX1dyaXRlKCh2b2lkKikmY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UsCgkJCQkJICAgICAgICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTaXplVG9TZW5kLCAwLCAwICk7Cgl9IHdoaWxlIChiU3RhdHVzICE9IFVTQkRfU1RBVFVTX1NVQ0NFU1MpOwoKCVRSQUNFX0RFQlVHKCJiU3RhdHVzOiAweCV4XG5cciIsIGJTdGF0dXMpOwp9CgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vICBEZXNjcmlwdGlvbjogQ0NJRCBDb21tYW5kIGRpc3BhdGNoZXIKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgQ0NJRENvbW1hbmREaXNwYXRjaGVyKCB2b2lkICpwQXJnLCB1aW50OF90IHN0YXR1cywgdWludDMyX3QgdHJhbnNmZXJyZWQsIHVpbnQzMl90IHJlbWFpbmluZyApCnsKCXVuc2lnbmVkIGNoYXIgTWVzc2FnZVRvU2VuZCA9IDA7CgoJaWYgKHN0YXR1cyAhPSBVU0JEX1NUQVRVU19TVUNDRVNTKSB7CgkJVFJBQ0VfRVJST1IoIlVTQiBlcnJvcjogJWQiLCBzdGF0dXMpOwoJCXJldHVybjsKCX0KCVRSQUNFX0RFQlVHKCJDb21tYW5kOiAweCVYIDB4JXggMHglWCAweCVYIDB4JVggMHglWCAweCVYXG5cclxuXHIiLAoJCQkJICAgKHVuc2lnbmVkIGludCljY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iTWVzc2FnZVR5cGUsCgkJCQkgICAodW5zaWduZWQgaW50KWNjaWREcml2ZXIuc0NjaWRDb21tYW5kLndMZW5ndGgsCgkJCQkgICAodW5zaWduZWQgaW50KWNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJTbG90LAoJCQkJICAgKHVuc2lnbmVkIGludCljY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU2VxLAoJCQkJICAgKHVuc2lnbmVkIGludCljY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU3BlY2lmaWNfMCwKCQkJCSAgICh1bnNpZ25lZCBpbnQpY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNwZWNpZmljXzEsCgkJCQkgICAodW5zaWduZWQgaW50KWNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJTcGVjaWZpY18yKTsKCgkvLyBDaGVjayB0aGUgc2xvdCBudW1iZXIKCWlmICggY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNsb3QgPiAwICkgewoKCQlUUkFDRV9FUlJPUigiQkFEX1NMT1RfTlVNQkVSXG5cciIpOwoJfQoKCVRSQUNFX0lORk8oInR5cD0weCVYXG5cciIsIGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJNZXNzYWdlVHlwZSk7CgoJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyA9IDA7CgoJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlNlcSAgPSBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU2VxOwoJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlNsb3QgPSBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU2xvdDsKCgljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU2l6ZVRvU2VuZCA9IHNpemVvZihTX2NjaWRfYnVsa19pbl9oZWFkZXIpLShBQkRBVEFfU0laRSsxKTsKCgoJLy8gQ29tbWFuZCBkaXNwYXRjaGVyCglzd2l0Y2ggKCBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iTWVzc2FnZVR5cGUgKSB7CgoJCWNhc2UgUENfVE9fUkRSX0lDQ1BPV0VST046CgkJCVBDdG9SRFJJY2NQb3dlck9uKCk7CgkJCU1lc3NhZ2VUb1NlbmQgPSAxOwoJCQlicmVhazsKCgkJY2FzZSBQQ19UT19SRFJfSUNDUE9XRVJPRkY6CgkJCVBDdG9SRFJJY2NQb3dlck9mZigpOwoJCQlNZXNzYWdlVG9TZW5kID0gMTsKCQkJYnJlYWs7CgoJCWNhc2UgUENfVE9fUkRSX0dFVFNMT1RTVEFUVVM6CgkJCVBDdG9SRFJHZXRTbG90U3RhdHVzKCk7CgkJCU1lc3NhZ2VUb1NlbmQgPSAxOwoJCQlicmVhazsKCgkJY2FzZSBQQ19UT19SRFJfWEZSQkxPQ0s6CgkJCVBDdG9SRFJYZnJCbG9jaygpOwoJCQlNZXNzYWdlVG9TZW5kID0gMTsKCQkJYnJlYWs7CgoJCWNhc2UgUENfVE9fUkRSX0dFVFBBUkFNRVRFUlM6CgkJCVBDdG9SRFJHZXRQYXJhbWV0ZXJzKCk7CgkJCU1lc3NhZ2VUb1NlbmQgPSAxOwoJCQlicmVhazsKCgkJY2FzZSBQQ19UT19SRFJfUkVTRVRQQVJBTUVURVJTOgoJCQlQQ3RvUkRSUmVzZXRQYXJhbWV0ZXJzKCk7CgkJCU1lc3NhZ2VUb1NlbmQgPSAxOwoJCQlicmVhazsKCgkJY2FzZSBQQ19UT19SRFJfU0VUUEFSQU1FVEVSUzoKCQkJUEN0b1JEUlNldFBhcmFtZXRlcnMoKTsKCQkJTWVzc2FnZVRvU2VuZCA9IDE7CgkJCWJyZWFrOwoKCQljYXNlIFBDX1RPX1JEUl9FU0NBUEU6CgkJCVBDdG9SRFJFc2NhcGUoKTsKCQkJTWVzc2FnZVRvU2VuZCA9IDE7CgkJCWJyZWFrOwoKCQljYXNlIFBDX1RPX1JEUl9JQ0NDTE9DSzoKCQkJUEN0b1JEUklDQ0Nsb2NrKCk7CgkJCU1lc3NhZ2VUb1NlbmQgPSAxOwoJCQlicmVhazsKCgkJY2FzZSBQQ19UT19SRFJfVDBBUERVOgoJCQkvLyBPbmx5IENDSURzIHJlcG9ydGluZyBhIHNob3J0IG9yIGV4dGVuZGVkIEFQRFUgbGV2ZWwgaW4gdGhlIGR3RmVhdHVyZXMgCgkJCS8vIGZpZWxkIG9mIHRoZSBDQ0lEIGNsYXNzIGRlc2NyaXB0b3IgbWF5IHRha2UgdGhpcyBjb21tYW5kIGludG8gYWNjb3VudC4KCQkJaWYoIChDQ0lEX0ZFQVRVUkVTX0VYQ19TQVBEVSA9PSAoQ0NJRF9GRUFUVVJFU19FWENfU0FQRFUmY29uZmlndXJhdGlvbkRlc2NyaXB0b3JzRlMtPmNjaWQuZHdGZWF0dXJlcykpCgkJCXx8IChDQ0lEX0ZFQVRVUkVTX0VYQ19BUERVICA9PSAoQ0NJRF9GRUFUVVJFU19FWENfQVBEVSAmY29uZmlndXJhdGlvbkRlc2NyaXB0b3JzRlMtPmNjaWQuZHdGZWF0dXJlcykpICkgewoKCQkJCS8vIGNvbW1hbmQgc3VwcG9ydGVkCgkJCQlQQ3RvUkRSdG9BUERVKCk7CgkJCX0KCQkJZWxzZSB7CgkJCQkvLyBjb21tYW5kIG5vdCBzdXBwb3J0ZWQKCQkJCVRSQUNFX0lORk8oIk5vdCBzdXBwb3J0ZWQ6IFBDX1RPX1JEUl9UMEFQRFVcblxyIik7CgkJCQl2Q0NJRENvbW1hbmROb3RTdXBwb3J0ZWQoKTsKCQkJfQoJCQlNZXNzYWdlVG9TZW5kID0gMTsKCQkJYnJlYWs7CgoJCWNhc2UgUENfVE9fUkRSX1NFQ1VSRToKCQkJUEN0b1JEUlNlY3VyZSgpOwoJCQlNZXNzYWdlVG9TZW5kID0gMTsKCQkJYnJlYWs7CgoJCWNhc2UgUENfVE9fUkRSX01FQ0hBTklDQUw6CgkJCVBDdG9SRFJNZWNoYW5pY2FsKCk7CgkJCU1lc3NhZ2VUb1NlbmQgPSAxOwoJCQlicmVhazsKCgkJY2FzZSBQQ19UT19SRFJfQUJPUlQ6CgkJCVBDdG9SRFJBYm9ydCgpOwoJCQlNZXNzYWdlVG9TZW5kID0gMTsKCQkJYnJlYWs7CgoJCWNhc2UgUENfVE9fUkRSX1NFVERBVEFSQVRFQU5EQ0xPQ0tGUkVRVUVOQ1k6CgkJCVBDdG9SRFJTZXREYXRhUmF0ZUFuZENsb2NrRnJlcXVlbmN5KCk7CgkJCU1lc3NhZ2VUb1NlbmQgPSAxOwoJCQlicmVhazsKCgkJZGVmYXVsdDoKCQkJVFJBQ0VfREVCVUcoImRlZmF1bHQ6IE5vdCBzdXBwb3J0ZWQ6IDB4JVhcblxyIiwgY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYk1lc3NhZ2VUeXBlKTsKCQkJdkNDSURDb21tYW5kTm90U3VwcG9ydGVkKCk7CgkJCU1lc3NhZ2VUb1NlbmQgPSAxOwoJCQlicmVhazsKCgl9CgoJaWYoIE1lc3NhZ2VUb1NlbmQgPT0gMSApIHsKCQl2Q0NJRFNlbmRSZXNwb25zZSgpOwoJfQp9CgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIFNFVFVQIHJlcXVlc3QgaGFuZGxlciBmb3IgYSBDQ0lEIGRldmljZQovLy8gXHBhcmFtIHBSZXF1ZXN0IFBvaW50ZXIgdG8gYSBVU0JHZW5lcmljUmVxdWVzdCBpbnN0YW5jZQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBDQ0lEX1JlcXVlc3RIYW5kbGVyKGNvbnN0IFVTQkdlbmVyaWNSZXF1ZXN0ICpwUmVxdWVzdCkKewoJVFJBQ0VfREVCVUcoIkNDSURfUkhsXG5cciIpOwoKCS8vIENoZWNrIGlmIHRoaXMgaXMgYSBjbGFzcyByZXF1ZXN0CglpZiAoVVNCR2VuZXJpY1JlcXVlc3RfR2V0VHlwZShwUmVxdWVzdCkgPT0gVVNCR2VuZXJpY1JlcXVlc3RfQ0xBU1MpIHsKCgkJLy8gQ2hlY2sgaWYgdGhlIHJlcXVlc3QgaXMgc3VwcG9ydGVkCgkJc3dpdGNoIChVU0JHZW5lcmljUmVxdWVzdF9HZXRSZXF1ZXN0KHBSZXF1ZXN0KSkgewoKCQkJY2FzZSBDQ0lER2VuZXJpY1JlcXVlc3RfQUJPUlQ6CgkJCQlUUkFDRV9ERUJVRygiQ0NJREdlbmVyaWNSZXF1ZXN0X0FCT1JUXG5cciIpOwoJCQkJYnJlYWs7CgoJCQljYXNlIENDSURHZW5lcmljUmVxdWVzdF9HRVRfQ0xPQ0tfRlJFUVVFTkNJRVM6CgkJCQlUUkFDRV9ERUJVRygiTm90IHN1cHBvcnRlZDogQ0NJREdlbmVyaWNSZXF1ZXN0X0dFVF9DTE9DS19GUkVRVUVOQ0lFU1xuXHIiKTsKCQkJCS8vIEEgQ0NJRCB3aXRoIGJOdW1DbG9ja1N1cHBvcnRlZCBlcXVhbCB0byAwMGggZG9lcyBub3QgaGF2ZSAKCQkJCS8vIHRvIHN1cHBvcnQgdGhpcyByZXF1ZXN0CgkJCQlicmVhazsKCgkJCWNhc2UgQ0NJREdlbmVyaWNSZXF1ZXN0X0dFVF9EQVRBX1JBVEVTOgoJCQkJVFJBQ0VfREVCVUcoIk5vdCBzdXBwb3J0ZWQ6IENDSURHZW5lcmljUmVxdWVzdF9HRVRfREFUQV9SQVRFU1xuXHIiKTsKCQkJCS8vIEEgQ0NJRCB3aXRoIGJOdW1EYXRhUmF0ZXNTdXBwb3J0ZWQgZXF1YWwgdG8gMDBoIGRvZXMgbm90IGhhdmUgCgkJCQkvLyB0byBzdXBwb3J0IHRoaXMgcmVxdWVzdC4KCQkJCWJyZWFrOwoKCQkJZGVmYXVsdDoKCQkJCVRSQUNFX1dBUk5JTkcoICJDQ0lERHJpdmVyX1JlcXVlc3RIYW5kbGVyOiBVbnN1cHBvcnRlZCByZXF1ZXN0ICglZClcblxyIiwKCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQkdlbmVyaWNSZXF1ZXN0X0dldFJlcXVlc3QocFJlcXVlc3QpKTsKCQkJCVVTQkRfU3RhbGwoMCk7CgkJfQoJfQoKCWVsc2UgaWYgKFVTQkdlbmVyaWNSZXF1ZXN0X0dldFR5cGUocFJlcXVlc3QpID09IFVTQkdlbmVyaWNSZXF1ZXN0X1NUQU5EQVJEKSB7CgoJCS8vIEZvcndhcmQgcmVxdWVzdCB0byB0aGUgc3RhbmRhcmQgaGFuZGxlcgoJCVVTQkREcml2ZXJfUmVxdWVzdEhhbmRsZXIoVVNCRF9HZXREcml2ZXIoKSwgcFJlcXVlc3QpOwoJfQoJZWxzZSB7CgoJCS8vIFVuc3VwcG9ydGVkIHJlcXVlc3QgdHlwZQoJCVRSQUNFX1dBUk5JTkcoICJDQ0lERHJpdmVyX1JlcXVlc3RIYW5kbGVyOiBVbnN1cHBvcnRlZCByZXF1ZXN0IHR5cGUgKCVkKVxuXHIiLAoJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNCR2VuZXJpY1JlcXVlc3RfR2V0VHlwZShwUmVxdWVzdCkpOwoJCVVTQkRfU3RhbGwoMCk7Cgl9Cn0KCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyAgICAgIEV4cG9ydGVkIGZ1bmN0aW9ucwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIE9wdGlvbmFsIGNhbGxiYWNrIHJlLWltcGxlbWVudGF0aW9uCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiNpZiAhZGVmaW5lZChOT0FVVE9DQUxMQkFDSykKLy8gbm90IHN0YXRpYyBmdW5jdGlvbgp2b2lkIFVTQkRDYWxsYmFja3NfUmVxdWVzdFJlY2VpdmVkKGNvbnN0IFVTQkdlbmVyaWNSZXF1ZXN0ICpyZXF1ZXN0KQp7CglDQ0lEX1JlcXVlc3RIYW5kbGVyKHJlcXVlc3QpOwp9CiNlbmRpZgoKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBIYW5kbGVzIFNtYXJ0Q2FydCByZXF1ZXN0Ci8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnZvaWQgQ0NJRF9TbWFydENhcmRSZXF1ZXN0KCB2b2lkICkKewoJdW5zaWduZWQgY2hhciBiU3RhdHVzOwoJVFJBQ0VfREVCVUcoIkNDSURfcmVxXG5cciIpOwoKCWRvIHsKCgkJYlN0YXR1cyA9IENDSURfUmVhZCggKHZvaWQqKSZjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZCwKCQkJCQkgICAgICAgICBzaXplb2YoU19jY2lkX2J1bGtfb3V0X2hlYWRlciksCgkJCQkJICAgICAgICAgKFRyYW5zZmVyQ2FsbGJhY2spJkNDSURDb21tYW5kRGlzcGF0Y2hlciwKCQkJCQkgICAgICAgICAodm9pZCopMCApOwoJfQoJd2hpbGUgKDApOwp9CgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIFJlYWRzIGRhdGEgZnJvbSB0aGUgRGF0YSBPVVQgZW5kcG9pbnQKLy8vIFxwYXJhbSBwQnVmZmVyICAgQnVmZmVyIHRvIHN0b3JlIHRoZSByZWNlaXZlZCBkYXRhCi8vLyBccGFyYW0gZExlbmd0aCAgIGRhdGEgYnVmZmVyIGxlbmd0aAovLy8gXHBhcmFtIGZDYWxsYmFjayBPcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbgovLy8gXHBhcmFtIHBBcmd1bWVudCBPcHRpb25hbCBwYXJhbWV0ZXIgZm9yIHRoZSBjYWxsYmFjayBmdW5jdGlvbgovLy8gXHJldHVybiBVU0JEX1NUQVRVU19MT0NLRUQgb3IgVVNCRF9TVEFUVVNfU1VDQ0VTUwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp1bnNpZ25lZCBjaGFyIENDSURfUmVhZCh2b2lkICpwQnVmZmVyLAoJCQkJCSAgICB1bnNpZ25lZCBpbnQgZExlbmd0aCwKCQkJCQkgICAgVHJhbnNmZXJDYWxsYmFjayBmQ2FsbGJhY2ssCgkJCQkJICAgIHZvaWQgKnBBcmd1bWVudCkKewoJcmV0dXJuIFVTQkRfUmVhZChDQ0lEX0VQVF9EQVRBX09VVCwgcEJ1ZmZlciwgZExlbmd0aCwgZkNhbGxiYWNrLCBwQXJndW1lbnQpOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gU2VuZHMgZGF0YSB0aHJvdWdoIHRoZSBEYXRhIElOIGVuZHBvaW50Ci8vLyBccGFyYW0gcEJ1ZmZlciAgIEJ1ZmZlciBob2xkaW5nIHRoZSBkYXRhIHRvIHRyYW5zbWl0Ci8vLyBccGFyYW0gZExlbmd0aCAgIExlbmd0aCBvZiBkYXRhIGJ1ZmZlcgovLy8gXHBhcmFtIGZDYWxsYmFjayBPcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbgovLy8gXHBhcmFtIHBBcmd1bWVudCBPcHRpb25hbCBwYXJhbWV0ZXIgZm9yIHRoZSBjYWxsYmFjayBmdW5jdGlvbgovLy8gXHJldHVybiBVU0JEX1NUQVRVU19MT0NLRUQgb3IgVVNCRF9TVEFUVVNfU1VDQ0VTUwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp1bnNpZ25lZCBjaGFyIENDSURfV3JpdGUodm9pZCAqcEJ1ZmZlciwKCQkJCQkgICAgIHVuc2lnbmVkIGludCBkTGVuZ3RoLAoJCQkJCSAgICAgVHJhbnNmZXJDYWxsYmFjayBmQ2FsbGJhY2ssCgkJCQkJICAgICB2b2lkICpwQXJndW1lbnQpCnsKCXJldHVybiBVU0JEX1dyaXRlKENDSURfRVBUX0RBVEFfSU4sIHBCdWZmZXIsIGRMZW5ndGgsIGZDYWxsYmFjaywgcEFyZ3VtZW50KTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIFNlbmRzIGRhdGEgdGhyb3VnaCB0aGUgaW50ZXJydXB0IGVuZHBvaW50LCBJQ0MgaW5zZXJ0aW9uIGV2ZW50Ci8vLyBSRFJfdG9fUENfTm90aWZ5U2xvdENoYW5nZQovLy8gXHJldHVybiBVU0JEX1NUQVRVU19MT0NLRUQgb3IgVVNCRF9TVEFUVVNfU1VDQ0VTUwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp1bnNpZ25lZCBjaGFyIENDSURfSW5zZXJ0aW9uKCB2b2lkICkKewoJVFJBQ0VfREVCVUcoIi4iKTsKCgkvLyBCdWlsZCB0aGUgSW50ZXJydXB0LUlOIG1lc3NhZ2UKCWNjaWREcml2ZXIuQnVmZmVySU5UWzBdID0gUkRSX1RPX1BDX05PVElGWVNMT1RDSEFOR0U7CgljY2lkRHJpdmVyLkJ1ZmZlcklOVFsxXSA9IElDQ19JTlNFUlRFRF9FVkVOVDsKCWNjaWREcml2ZXIuU2xvdFN0YXR1cyAgID0gSUNDX0lOU0VSVEVEX0VWRU5UOwoKCS8vIE5vdGlmeSB0aGUgaG9zdCB0aGF0IGEgSUNDIGlzIGluc2VydGVkCglyZXR1cm4gVVNCRF9Xcml0ZSggQ0NJRF9FUFRfTk9USUZJQ0FUSU9OLCBjY2lkRHJpdmVyLkJ1ZmZlcklOVCwgMiwgMCwgMCApOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gU2VuZHMgZGF0YSB0aHJvdWdoIHRoZSBpbnRlcnJ1cHQgZW5kcG9pbnQsIElDQyByZW1vdmFsIGV2ZW50Ci8vLyBSRFJfdG9fUENfTm90aWZ5U2xvdENoYW5nZQovLy8gXHJldHVybiBVU0JEX1NUQVRVU19MT0NLRUQgb3IgVVNCRF9TVEFUVVNfU1VDQ0VTUwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp1bnNpZ25lZCBjaGFyIENDSURfUmVtb3ZhbCggdm9pZCApCnsKCVRSQUNFX0RFQlVHKCIuIik7CgoJLy8gQnVpbGQgdGhlIEludGVycnVwdC1JTiBtZXNzYWdlCgljY2lkRHJpdmVyLkJ1ZmZlcklOVFswXSA9IFJEUl9UT19QQ19OT1RJRllTTE9UQ0hBTkdFOwoJY2NpZERyaXZlci5CdWZmZXJJTlRbMV0gPSBJQ0NfTk9UX1BSRVNFTlQ7CgljY2lkRHJpdmVyLlNsb3RTdGF0dXMgICA9IElDQ19OT1RfUFJFU0VOVDsKCgkvLyBOb3RpZnkgdGhlIGhvc3QgdGhhdCBhIElDQyBpcyBpbnNlcnRlZAoJcmV0dXJuIFVTQkRfV3JpdGUoIENDSURfRVBUX05PVElGSUNBVElPTiwgY2NpZERyaXZlci5CdWZmZXJJTlQsIDIsIDAsIDAgKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIEludGVycnVwdC1JTiBNZXNzYWdlcwovLy8gVGhpcyBtZXNzYWdlIGlzIHNlbnQgd2hlbiBhbnkgYml0IGluIHRoZSBiSGFyZHdhcmVFcnJvckNvZGUgZmllbGQgaXMgc2V0LiAKLy8vIElmIHRoaXMgbWVzc2FnZSBpcyBzZW50IHdoZW4gdGhlcmUgaXMgbm8gk291dHN0YW5kaW5nlCBjb21tYW5kLCB0aGUgYlNlcSAKLy8vIGZpZWxkIHdpbGwgYmUgdW5kZWZpbmVkLgovLy8gXHBhcmFtIGJTbG90IElDQyBzbG90IG51bWJlcgovLy8gXHBhcmFtIGJTZXEgIFNlcXVlbmNlIG51bWJlciBvZiB0aGUgYnVsayBPVVQgY29tbWFuZCB3aGVuIHRoZSBoYXJkd2FyZSBlcnJvcgovLy8gb2NjdXJlZAovLy8gXHBhcmFtIGJIYXJkd2FyZUVycm9yQ29kZSBIYXJkd2FyZSBlcnJvciBjb2RlCi8vLyBccmV0dXJuIFVTQkRfU1RBVFVTX0xPQ0tFRCBvciBVU0JEX1NUQVRVU19TVUNDRVNTCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnVuc2lnbmVkIGNoYXIgUkRSdG9QQ0hhcmR3YXJlRXJyb3IoIHVuc2lnbmVkIGNoYXIgYlNsb3QsIAoJCQkJCSAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGJTZXEsIAoJCQkJCSAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGJIYXJkd2FyZUVycm9yQ29kZSApCnsKCVRSQUNFX0RFQlVHKCIuIik7CgoJLy8gQnVpbGQgdGhlIEludGVycnVwdC1JTiBtZXNzYWdlCgljY2lkRHJpdmVyLkJ1ZmZlcklOVFswXSA9IFJEUl9UT19QQ19IQVJEV0FSRUVSUk9SOwoJY2NpZERyaXZlci5CdWZmZXJJTlRbMV0gPSBiU2xvdDsKCWNjaWREcml2ZXIuQnVmZmVySU5UWzJdID0gYlNlcTsKCWNjaWREcml2ZXIuQnVmZmVySU5UWzNdID0gYkhhcmR3YXJlRXJyb3JDb2RlOwoKCS8vIE5vdGlmeSB0aGUgaG9zdCB0aGF0IGEgSUNDIGlzIGluc2VydGVkCglyZXR1cm4gVVNCRF9Xcml0ZSggQ0NJRF9FUFRfTk9USUZJQ0FUSU9OLCBjY2lkRHJpdmVyLkJ1ZmZlcklOVCwgNCwgMCwgMCApOwp9CgojZW5kaWYgLyogSEFWRV9DQ0lEICovCg==