LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiAgICAgICAgIEFUTUVMIE1pY3JvY29udHJvbGxlciBTb2Z0d2FyZSBTdXBwb3J0IAogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIENvcHlyaWdodCAoYykgMjAwOCwgQXRtZWwgQ29ycG9yYXRpb24KICoKICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgogKgogKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKICogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBkaXNjbGFpbWVyIGJlbG93LgogKgogKiBBdG1lbCdzIG5hbWUgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KICoKICogRElTQ0xBSU1FUjogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBVE1FTCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUgogKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQgQVJFCiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFUTUVMIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCiAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsCiAqIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLAogKiBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIFx1bml0Ci8vLwovLy8gIVB1cnBvc2UKLy8vIAovLy8gQ0NJRCBkcml2ZXIKLy8vIAovLy8gIVVzYWdlCi8vLyAKLy8vIEV4cGxhbmF0aW9uIG9uIHRoZSB1c2FnZSBvZiB0aGUgY29kZSBtYWRlIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBoZWFkZXIgZmlsZS4KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICAgICAgIEhlYWRlcnMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiNpbmNsdWRlICJib2FyZC5oIgojaW5jbHVkZSAic2ltdHJhY2UuaCIKCiNpZmRlZiBIQVZFX0NDSUQKCiNpbmNsdWRlIDxVU0JERHJpdmVyLmg+CiNpbmNsdWRlIDxVU0JSZXF1ZXN0cy5oPgojaW5jbHVkZSA8VVNCRGVzY3JpcHRvcnMuaD4KLy8jaW5jbHVkZSA8dXNiL2RldmljZS9kZnUvZGZ1Lmg+CiNpbmNsdWRlIDxjY2lkZHJpdmVyZGVzY3JpcHRvcnMuaD4KCi8vIEZJWE1FOiBSZW1vdmUgREZVIHJlbGF0ZWQgc3R1ZmYgCi8qIG5vIERGVSBib290bG9hZGVyIGlzIGJlaW5nIHVzZWQgKi8KI2RlZmluZSBERlVfTlVNX0lGICAgICAgMAojZGVmaW5lIERGVV9JRl9ERVNDUklQVE9SU19TVFJVQ1QKI2RlZmluZSBERlVfSUZfREVTQ1JJUFRPUlMKCiNkZWZpbmUgREZVX05VTV9TVFJJTkdTIDAKI2RlZmluZSBERlVfU1RSSU5HX0RFU0NSSVBUT1JTCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyAgICAgICAgIExvY2FsIGRlZmluaXRpb24KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vLyBDb25zdGFudHM6IElEczogRGV2aWNlIHByb2R1Y3QgSUQuCi8vI2RlZmluZSBDQ0lERHJpdmVyRGVzY3JpcHRvcnNfUFJPRFVDVElEICAgICAgIDB4NjEyOQojZGVmaW5lIENDSUREcml2ZXJEZXNjcmlwdG9yc19QUk9EVUNUSUQgICAgICAgU0lNVFJBQ0VfUFJPRFVDVF9JRAovLy8gQ29uc3RhbnRzOiBJRHM6IERldmljZSB2ZW5kb3IgSUQuCiNkZWZpbmUgQ0NJRERyaXZlckRlc2NyaXB0b3JzX1ZFTkRPUklEICAgICAgICBBVE1FTF9WRU5ET1JfSUQKLy8jZGVmaW5lIENDSUREcml2ZXJEZXNjcmlwdG9yc19WRU5ET1JJRCAgICAgICAgMHgwM0VCCi8vLyBDb25zdGFudHM6IElEczogRGV2aWNlIHJlbGVhc2UgbnVtYmVyLgojZGVmaW5lIENDSUREcml2ZXJEZXNjcmlwdG9yc19SRUxFQVNFICAgICAgICAgMHgwMTAwCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyAgICAgICAgIFR5cGVzCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLy8gRHJpdmVyIHN0cnVjdHVyZSBmb3IgYW4gQ0NJRCBkZXZpY2UKdHlwZWRlZiBzdHJ1Y3QgewoKICAgIC8vLyBTdGFuZGFyZCBVU0IgZGV2aWNlIGRyaXZlciBpbnN0YW5jZQogICAgVVNCRERyaXZlciAgICAgICAgICAgICB1c2JkRHJpdmVyOwogICAgLy8vIENDSUQgbWVzc2FnZQogICAgU19jY2lkX2J1bGtfaW5faGVhZGVyICBzQ2NpZE1lc3NhZ2U7CiAgICAvLy8gQ0NJRCBjb21tYW5kCiAgICBTX2NjaWRfYnVsa19vdXRfaGVhZGVyIHNDY2lkQ29tbWFuZDsKICAgIC8vLyBJbnRlcnJ1cHQgbWVzc2FnZSBhbnN3ZXIKICAgIHVuc2lnbmVkIGNoYXIgICAgICAgICAgQnVmZmVySU5UWzRdOwogICAgLy8vIEJ1ZmZlciBkYXRhIG9mIG1lc3NhZ2UKICAgIHVuc2lnbmVkIGNoYXIgICAgICAgICAgUHJvdG9jb2xEYXRhU3RydWN0dXJlWzEwXTsKICAgIC8vLyBQcm90b2NvbCB1c2VkCiAgICB1bnNpZ25lZCBjaGFyICAgICAgICAgIGJQcm90b2NvbDsKICAgIC8vLyBTbG90U3RhdHVzCiAgICAvLy8gQml0IDAgPSBTbG90IDAgY3VycmVudCBzdGF0ZQogICAgLy8vIEJpdCAxID0gU2xvdCAwIGNoYW5nZWQgc3RhdHVzCiAgICAvLy8gQml0IDIgPSBTbG90IDEgY3VycmVudCBzdGF0ZQogICAgLy8vIEJpdCAzID0gU2xvdCAxIGNoYW5nZWQgc3RhdHVzCiAgICAvLy8gQml0IDQgPSBTbG90IDIgY3VycmVudCBzdGF0ZQogICAgLy8vIEJpdCA1ID0gU2xvdCAyIGNoYW5nZWQgc3RhdHVzCiAgICB1bnNpZ25lZCBjaGFyICAgICAgICAgIFNsb3RTdGF0dXM7Cgp9IENDSUREcml2ZXI7CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyAgICAgICAgIExvY2FsIHZhcmlhYmxlcwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8vIFN0YXRpYyBpbnN0YW5jZSBvZiB0aGUgQ0NJRCBkZXZpY2UgZHJpdmVyLgpzdGF0aWMgQ0NJRERyaXZlciBjY2lkRHJpdmVyOwpzdGF0aWMgQ0NJRERyaXZlckNvbmZpZ3VyYXRpb25EZXNjcmlwdG9ycyAqY29uZmlndXJhdGlvbkRlc2NyaXB0b3JzRlM7CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyAgICAgIEludGVybmFsIGZ1bmN0aW9ucwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIEluaXRpYWxpemVzIHRoZSBDQ0lEIGRldmljZSBkcml2ZXIuCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnZvaWQgQ0NJRERyaXZlcl9Jbml0aWFsaXplKCB2b2lkICkKewogICAgY29uZmlndXJhdGlvbkRlc2NyaXB0b3JzRlMgPSAoQ0NJRERyaXZlckNvbmZpZ3VyYXRpb25EZXNjcmlwdG9ycyAqKSBjb25maWd1cmF0aW9uRGVzY3JpcHRvcnNBcnJbQ0ZHX05VTV9DQ0lELTFdOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gUmVzcG9uc2UgUGlwZSwgQnVsay1JTiBNZXNzYWdlcwovLy8gUmV0dXJuIHRoZSBTbG90IFN0YXR1cyB0byB0aGUgaG9zdAovLy8gQW5zd2VyIHRvOgovLy8gICBQQ190b19SRFJfSWNjUG93ZXJPZmYKLy8vICAgUENfdG9fUkRSX0dldFNsb3RTdGF0dXMKLy8vICAgUENfdG9fUkRSX0ljY0Nsb2NrCi8vLyAgIFBDX3RvX1JEUl9UMEFQRFUKLy8vICAgUENfdG9fUkRSX01lY2hhbmljYWwKLy8vICAgUENfdG9fUkRSX0Fib3J0IGFuZCBDbGFzcyBzcGVjaWZpYyBBQk9SVCByZXF1ZXN0Ci8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIFJEUnRvUENTbG90U3RhdHVzKCB2b2lkICkKewogICAgLy8gSGVhZGVyIGZpZWxkcyBzZXR0aW5ncwogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYk1lc3NhZ2VUeXBlID0gUkRSX1RPX1BDX1NMT1RTVEFUVVM7CiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS53TGVuZ3RoICAgPSAwOwoKICAgIGlmIChjY2lkRHJpdmVyLlNsb3RTdGF0dXMgPT0gSUNDX0lOU0VSVEVEX0VWRU5UKSB7CiAgICAgICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyA9IDA7ICAgIC8qIElDQyBwcmVzZW50IGFuZCBhY3RpdmUgY2FyZCAqLwogICAgfSBlbHNlIGlmIChjY2lkRHJpdmVyLlNsb3RTdGF0dXMgPT0gSUNDX05PVF9QUkVTRU5UKSB7CiAgICAgICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyA9IDI7ICAgIC8qIE5vIElDQyBwcmVzZW50Ki8KICAgIH0gZWxzZXsKICAgICAgICBUUkFDRV9FUlJPUigiU3RyYW5nZSBiU3RhdHVzIik7CiAgICAgICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyA9IDA7CiAgICB9CiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iRXJyb3IgICAgPSAwOwogICAgLy8gMDBoIENsb2NrIHJ1bm5pbmcKICAgIC8vIDAxaCBDbG9jayBzdG9wcGVkIGluIHN0YXRlIEwKICAgIC8vIDAyaCBDbG9jayBzdG9wcGVkIGluIHN0YXRlIEgKICAgIC8vIDAzaCBDbG9jayBzdG9wcGVkIGluIGFuIHVua25vd24gc3RhdGUKICAgIC8vIEFsbCBvdGhlciB2YWx1ZXMgYXJlIFJlc2VydmVkIGZvciBGdXR1cmUgVXNlLgogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlNwZWNpZmljID0gMDsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIFJlc3BvbnNlIFBpcGUsIEJ1bGstSU4gTWVzc2FnZXMKLy8vIEFuc3dlciB0byBQQ190b19SRFJfSWNjUG93ZXJPbgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBSRFJ0b1BDRGF0YWJsb2NrX0FUUiggdm9pZCApCnsKICAgIHVuc2lnbmVkIGNoYXIgaTsKICAgIHVuc2lnbmVkIGNoYXIgQXRyW0FUUl9TSVpFX01BWF07CiAgICB1bnNpZ25lZCBjaGFyIGxlbmd0aDsKICAgIHVpbnQzMl90IHN0YXR1czsgCgogICAgVFJBQ0VfREVCVUcoIi4iKTsKCiAgICBzdGF0dXMgPSBJU083ODE2X0RhdGFibG9ja19BVFIoIEF0ciwgJmxlbmd0aCApOwogICAgSVNPNzgxNl9EZWNvZGVfQVRSKCBBdHIgKTsKCiAgICBpZiAoc3RhdHVzID09IDApIHsKICAgICAgICBUUkFDRV9ERUJVRygiVGltZW91dCBvY2N1cmVkIHdoaWxlIHJlYWRpbmcgQVRSIik7Ci8vIEZJWE1FOiByZWFjdCBwcm9wZXJseSB0byB0aW1lb3V0Li4KLy8gICAgICAgIHJldHVybjsKICAgIH0KCi8vIEZJWE1FOiBNb3JlIHRlc3RzPyBJcyBiUHJvdG9jb2wgPSBBdHJbM10gPwogICAgaWYoIGxlbmd0aCA+IDUgKSB7CiAgICAgICAgY2NpZERyaXZlci5Qcm90b2NvbERhdGFTdHJ1Y3R1cmVbMV0gPSBBdHJbM10mMHgwRjsgLy8gVEQoMSkKICAgICAgICBjY2lkRHJpdmVyLmJQcm90b2NvbCA9IEF0clszXSYweDBGOyAgICAgICAgICAgLy8gVEQoMSkKICAgICAgICBUUkFDRV9JTkZPKCJQcm90b2NvbCBkYXRhIHN0cnVjdHVyZTogMHgleFxuXHIiLAogICAgICAgICAgICAgICAgICAgICAgICBjY2lkRHJpdmVyLlByb3RvY29sRGF0YVN0cnVjdHVyZVsxXSk7CiAgICB9CgogICAgLy8gU19jY2lkX3Byb3RvY29sX3QwCiAgICAvLyBibUZpbmRleERpbmRleAogICAgY2NpZERyaXZlci5Qcm90b2NvbERhdGFTdHJ1Y3R1cmVbMF0gPSBBdHJbMl07ICAgICAvLyBUQSgxKQoKICAgIC8vIGJtVENDS1NUMAogICAgLy8gRm9yIFQ9MCAsQjAgliAwYiwgQjctMiCWIDAwMDAwMGIKICAgIC8vIEIxIJYgQ29udmVudGlvbiB1c2VkIChiMT0wIGZvciBkaXJlY3QsIGIxPTEgZm9yIGludmVyc2UpCgogICAgLy8gYkd1YXJkVGltZVQwCiAgICAvLyBFeHRyYSBHdWFyZHRpbWUgYmV0d2VlbiB0d28gY2hhcmFjdGVycy4gQWRkIDAgdG8gMjU0IGV0dSB0byB0aGUgbm9ybWFsIAogICAgLy8gZ3VhcmR0aW1lIG9mIDEyZXR1LiBGRmggaXMgdGhlIHNhbWUgYXMgMDBoLgogICAgY2NpZERyaXZlci5Qcm90b2NvbERhdGFTdHJ1Y3R1cmVbMl0gPSBBdHJbNF07ICAgICAvLyBUQygxKQogICAgLy8gQVQ5MUNfQkFTRV9VUzAtPlVTX1RUR1IgPSAwOyAgLy8gVEMxCgogICAgLy8gYldhaXRpbmdJbnRlZ2VyVDAKICAgIC8vIFdJIGZvciBUPTAgdXNlZCB0byBkZWZpbmUgV1dUCiAgICBjY2lkRHJpdmVyLlByb3RvY29sRGF0YVN0cnVjdHVyZVszXSA9IEF0cls3XTsgICAgIC8vIFRDKDIpCgogICAgLy8gYkNsb2NrU3RvcAogICAgLy8gSUNDIENsb2NrIFN0b3AgU3VwcG9ydAogICAgLy8gMDAgPSBTdG9wcGluZyB0aGUgQ2xvY2sgaXMgbm90IGFsbG93ZWQKICAgIC8vIDAxID0gU3RvcCB3aXRoIENsb2NrIHNpZ25hbCBMb3cKICAgIC8vIDAyID0gU3RvcCB3aXRoIENsb2NrIHNpZ25hbCBIaWdoCiAgICAvLyAwMyA9IFN0b3Agd2l0aCBDbG9jayBlaXRoZXIgSGlnaCBvciBMb3cKICAgIGNjaWREcml2ZXIuUHJvdG9jb2xEYXRhU3RydWN0dXJlWzRdID0gMHgwMDsgICAgICAgLy8gMCB0byAzCgogICAgLy8gSGVhZGVyIGZpZWxkcyBzZXR0aW5ncwogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYk1lc3NhZ2VUeXBlID0gUkRSX1RPX1BDX0RBVEFCTE9DSzsKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLndMZW5ndGggICAgICA9IGxlbmd0aDsgIC8vIFNpemUgb2YgQVRSCiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU2l6ZVRvU2VuZCArPSBsZW5ndGg7ICAvLyBTaXplIG9mIEFUUgogICAgLy8gYkNoYWluUGFyYW1ldGVyOiAwMCB0aGUgcmVzcG9uc2UgQVBEVSBiZWdpbnMgYW5kIGVuZHMgaW4gdGhpcyBjb21tYW5kCiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3BlY2lmaWMgICAgPSAwOwoKICAgIGZvciggaT0wOyBpPGxlbmd0aDsgaSsrICkgewoKICAgICAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5hYkRhdGFbaV0gID0gQXRyW2ldOwogICAgfQoKICAgIC8vIFNldCB0aGUgc2xvdCB0byBhbiBhY3RpdmUgc3RhdHVzCiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3RhdHVzID0gMDsKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJFcnJvciA9IDA7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBSZXNwb25zZSBQaXBlLCBCdWxrLUlOIE1lc3NhZ2VzCi8vLyBJbiBvdGhlciBjYXNlcywgdGhlIHJlc3BvbnNlIG1lc3NhZ2UgaGFzIHRoZSBmb2xsb3dpbmcgZm9ybWF0OiAKLy8vIFRoZSByZXNwb25zZSBkYXRhIHdpbGwgY29udGFpbiB0aGUgb3B0aW9uYWwgZGF0YSByZXR1cm5lZCBieSB0aGUgSUNDLCAKLy8vIGZvbGxvd2VkIGJ5IHRoZSAyIGJ5dGUtc2l6ZSBzdGF0dXMgd29yZHMgU1cxLVNXMi4KLy8vCi8vLyBBbnN3ZXIgdG86Ci8vLyAgIFBDX3RvX1JEUl9YZnJCbG9jawovLy8gICBQQ190b19SRFJfU2VjdXJlCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIFJEUnRvUENEYXRhYmxvY2soIHZvaWQgKQp7CiAgICAvL1RSQUNFX0RFQlVHKCIuIik7CgogICAgLy8gSGVhZGVyIGZpZWxkcyBzZXR0aW5ncwogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYk1lc3NhZ2VUeXBlID0gUkRSX1RPX1BDX0RBVEFCTE9DSzsKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTaXplVG9TZW5kICs9IGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLndMZW5ndGg7CiAgICAvLyBiQ2hhaW5QYXJhbWV0ZXI6IDAwIHRoZSByZXNwb25zZSBBUERVIGJlZ2lucyBhbmQgZW5kcyBpbiB0aGlzIGNvbW1hbmQKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTcGVjaWZpYyA9IDA7CgogICAgLy8gU2V0IHRoZSBzbG90IHRvIGFuIGFjdGl2ZSBzdGF0dXMKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAwOwogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYkVycm9yID0gMDsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIFJlc3BvbnNlIFBpcGUsIEJ1bGstSU4gTWVzc2FnZXMKLy8vIEFuc3dlciB0bzoKLy8vICAgUENfdG9fUkRSX0dldFBhcmFtZXRlcnMKLy8vICAgUENfdG9fUkRSX1Jlc2V0UGFyYW1ldGVycwovLy8gICBQQ190b19SRFJfU2V0UGFyYW1ldGVycwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBSRFJ0b1BDUGFyYW1ldGVycyggdm9pZCApCnsKICAgIHVuc2lnbmVkIGludCBpOwoKICAgIFRSQUNFX0RFQlVHKCIuIik7CgogICAgLy8gSGVhZGVyIGZpZWxkcyBzZXR0aW5ncwogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYk1lc3NhZ2VUeXBlID0gUkRSX1RPX1BDX1BBUkFNRVRFUlM7CgogICAgLy9jY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3RhdHVzID0gMDsKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJFcnJvciAgPSAwOwoKICAgIGlmKCBjY2lkRHJpdmVyLlByb3RvY29sRGF0YVN0cnVjdHVyZVsxXSA9PSBQUk9UT0NPTF9UTyApIHsKCiAgICAgICAgLy8gVD0wCiAgICAgICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2Uud0xlbmd0aCAgID0gc2l6ZW9mKFNfY2NpZF9wcm90b2NvbF90MCk7CiAgICAgICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlNwZWNpZmljID0gUFJPVE9DT0xfVE87CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgLy8gVD0xCiAgICAgICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2Uud0xlbmd0aCAgID0gc2l6ZW9mKFNfY2NpZF9wcm90b2NvbF90MSk7CiAgICAgICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlNwZWNpZmljID0gUFJPVE9DT0xfVDE7CiAgICB9CgogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlNpemVUb1NlbmQgKz0gY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2Uud0xlbmd0aDsKCiAgICBmb3IoIGk9MDsgaTxjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS53TGVuZ3RoOyBpKysgKSB7CiAgICAgICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYWJEYXRhW2ldID0gY2NpZERyaXZlci5Qcm90b2NvbERhdGFTdHJ1Y3R1cmVbaV07CiAgICB9Cgp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gUmVzcG9uc2UgUGlwZSwgQnVsay1JTiBNZXNzYWdlcwovLy8gQW5zd2VyIHRvOgovLy8gICBQQ190b19SRFJfRXNjYXBlCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIFJEUnRvUENFc2NhcGUoIHVuc2lnbmVkIGNoYXIgbGVuZ3RoLCB1bnNpZ25lZCBjaGFyICpkYXRhX3NlbmRfZnJvbV9DQ0lEICkKewogICAgdW5zaWduZWQgaW50IGk7CgogICAgVFJBQ0VfREVCVUcoIi4iKTsKCiAgICAvLyBIZWFkZXIgZmllbGRzIHNldHRpbmdzCiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iTWVzc2FnZVR5cGUgPSBSRFJfVE9fUENfRVNDQVBFOwoKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLndMZW5ndGggICA9IGxlbmd0aDsKCiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3RhdHVzID0gMDsKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJFcnJvciAgPSAwOwoKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTcGVjaWZpYyA9IDA7ICAvLyBiUkZVCgogICAgZm9yKCBpPTA7IGk8bGVuZ3RoOyBpKysgKSB7CiAgICAgICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYWJEYXRhW2ldID0gZGF0YV9zZW5kX2Zyb21fQ0NJRFtpXTsKICAgIH0KfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIFJlc3BvbnNlIFBpcGUsIEJ1bGstSU4gTWVzc2FnZXMKLy8vIEFuc3dlciB0bzogCi8vLyAgIFBDX3RvX1JEUl9TZXREYXRhUmF0ZUFuZENsb2NrRnJlcXVlbmN5Ci8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIFJEUnRvUENEYXRhUmF0ZUFuZENsb2NrRnJlcXVlbmN5KCB1bnNpZ25lZCBpbnQgZHdDbG9ja0ZyZXF1ZW5jeSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkd0RhdGFSYXRlICkKewogICAgVFJBQ0VfREVCVUcoIi4iKTsKCiAgICAvLyBIZWFkZXIgZmllbGRzIHNldHRpbmdzCiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iTWVzc2FnZVR5cGUgPSBSRFJfVE9fUENfREFUQVJBVEVBTkRDTE9DS0ZSRVFVRU5DWTsKCiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS53TGVuZ3RoICAgPSA4OwoKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAwOwogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYkVycm9yICA9IDA7CgogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlNwZWNpZmljID0gMDsgIC8vIGJSRlUKCiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5hYkRhdGFbMF0gPSBkd0Nsb2NrRnJlcXVlbmN5OwogICAgCiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5hYkRhdGFbNF0gPSBkd0RhdGFSYXRlOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gQ29tbWFuZCBQaXBlLCBCdWxrLU9VVCBNZXNzYWdlcwovLy8gUG93ZXIgT24gQ29tbWFuZCAtIENvbGQgUmVzZXQgJiBXYXJtIFJlc2V0IAovLy8gUmV0dXJuIHRoZSBBVFIgdG8gdGhlIGhvc3QKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgUEN0b1JEUkljY1Bvd2VyT24oIHZvaWQgKQp7CiAgICBUUkFDRV9ERUJVRygiLiIpOwogICAgaWYoIENDSURfRkVBVFVSRVNfQVVUT19WT0xUID09IChjb25maWd1cmF0aW9uRGVzY3JpcHRvcnNGUy0+Y2NpZC5kd0ZlYXR1cmVzICYgQ0NJRF9GRUFUVVJFU19BVVRPX1ZPTFQpICkgewoKICAgICAgICAvL2JQb3dlclNlbGVjdCA9IGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJTcGVjaWZpY18wOwogICAgICAgIGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJTcGVjaWZpY18wID0gVk9MVFNfQVVUTzsKICAgIH0KCiAgICBJU083ODE2X3dhcm1fcmVzZXQoKTsKLy8gICAgSVNPNzgxNl9jb2xkX3Jlc2V0KCk7CgogICAgLy8gZm9yIGVtdWxhdGlvbiBvbmx5IC8vSkNCIAogICAgaWYgKCBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU3BlY2lmaWNfMCAhPSBWT0xUU181XzAgKSB7CgogICAgICAgIFRSQUNFX0VSUk9SKCJQT1dFUl9OT1RfU1VQUE9SVEVEXG5cciIpOwogICAgfQoKICAgIGVsc2UgewoKICAgICAgICBSRFJ0b1BDRGF0YWJsb2NrX0FUUigpOwoKICAgIH0KfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIENvbW1hbmQgUGlwZSwgQnVsay1PVVQgTWVzc2FnZXMKLy8vIFBvd2VyIE9mZiBDb21tYW5kIC0gU2V0IHRoZSBJQ0MgaW4gYW4gaW5hY3RpdmUgc3RhdGUKLy8vIFJldHVybiB0aGUgc2xvdCBzdGF0dXMgdG8gdGhlIGhvc3QKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgUEN0b1JEUkljY1Bvd2VyT2ZmKCB2b2lkICkKewogICAgdW5zaWduZWQgY2hhciBiU3RhdHVzOwoKICAgIFRSQUNFX0RFQlVHKCIuIik7CgogICAgSVNPNzgxNl9JY2NQb3dlck9mZigpOwoKICAgIC8vSkNCIHN0dWIKICAgIGJTdGF0dXMgPSBJQ0NfQlNfUFJFU0VOVF9OT1RBQ1RJVkFURUQ7CgogICAgLy8gU2V0IHRoZSBzbG90IHRvIGFuIGluYWN0aXZlIHN0YXR1cwogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyA9IDA7CiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iRXJyb3IgPSAwOwoKICAgIC8vIGlmIGVycm9yLCBzZWUgVGFibGUgNi4xLTIgZXJyb3JzCgogICAgLy8gUmV0dXJuIHRoZSBzbG90IHN0YXR1cyB0byB0aGUgaG9zdAogICAgUkRSdG9QQ1Nsb3RTdGF0dXMoKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIENvbW1hbmQgUGlwZSwgQnVsay1PVVQgTWVzc2FnZXMKLy8vIEdldCBzbG90IHN0YXR1cwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBQQ3RvUkRSR2V0U2xvdFN0YXR1cyggdm9pZCApCnsKICAgIFRSQUNFX0RFQlVHKCIuIik7CgogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyA9IDA7CiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iRXJyb3IgPSAwOwoKICAgIC8vIFJldHVybiB0aGUgc2xvdCBzdGF0dXMgdG8gdGhlIGhvc3QKICAgIFJEUnRvUENTbG90U3RhdHVzKCk7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBDb21tYW5kIFBpcGUsIEJ1bGstT1VUIE1lc3NhZ2VzCi8vLyBJZiB0aGUgY29tbWFuZCBoZWFkZXIgaXMgdmFsaWQsIGFuIEFQRFUgY29tbWFuZCBpcyByZWNlaXZlZCBhbmQgY2FuIGJlIHJlYWQKLy8vIGJ5IHRoZSBhcHBsaWNhdGlvbgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBQQ3RvUkRSWGZyQmxvY2soIHZvaWQgKQp7CiAgICB1aW50MTZfdCBtc2dsZW4gPSAwOwogICAgdWludDMyX3QgcmV0OwoKICAgIFRSQUNFX0RFQlVHKCJQQ3RvUkRSWGZyQmxvY2tcbiIpOwoKICAgIC8vIENoZWNrIHRoZSBibG9jayBsZW5ndGgKICAgIGlmICggY2NpZERyaXZlci5zQ2NpZENvbW1hbmQud0xlbmd0aCA+IChjb25maWd1cmF0aW9uRGVzY3JpcHRvcnNGUy0+Y2NpZC5kd01heENDSURNZXNzYWdlTGVuZ3RoLTEwKSApIHsKICAgICAgICBUUkFDRV9ERUJVRygiRXJyIGJsb2NrL21zZyBsZW4iKTsKICAgICAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3RhdHVzID0gMTsKICAgICAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iRXJyb3IgID0gMDsKICAgIH0KICAgIC8vIGNoZWNrIGJCV0kKICAgIGVsc2UgaWYgKCAwICE9IGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJTcGVjaWZpY18wICkgewoKICAgICAgICAgVFJBQ0VfRVJST1IoIkJhZCBiQldJXG5cciIpOwogICAgfQogICAgZWxzZSB7CgogICAgICAgIC8vIEFQRFUgb3IgVFBEVQogICAgICAgIHN3aXRjaChjb25maWd1cmF0aW9uRGVzY3JpcHRvcnNGUy0+Y2NpZC5kd0ZlYXR1cmVzIAogICAgICAgICAgICAgICYgKENDSURfRkVBVFVSRVNfRVhDX1RQRFV8Q0NJRF9GRUFUVVJFU19FWENfU0FQRFV8Q0NJRF9GRUFUVVJFU19FWENfQVBEVSkpIHsKCiAgICAgICAgICAgIGNhc2UgQ0NJRF9GRUFUVVJFU19FWENfVFBEVToKICAgICAgICAgICAgICAgIGlmIChjY2lkRHJpdmVyLlByb3RvY29sRGF0YVN0cnVjdHVyZVsxXSA9PSBQUk9UT0NPTF9UTykgewogICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKCJBUERVIGNtZDogJXggJXggJXggLi4iLCBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5BUERVWzBdLCBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5BUERVWzFdLGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLkFQRFVbMl0gKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gU2VuZCBjb21tYW5kZSBBUERVCiAgICAgICAgICAgICAgICAgICAgcmV0ID0gSVNPNzgxNl9YZnJCbG9ja1RQRFVfVDAoIGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLkFQRFUgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmFiRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC53TGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtc2dsZW4gKTsKICAgICAgICAgICAgICAgICAgICBpZiAocmV0ICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfRVJST1IoIkFQRFUgY291bGQgbm90IGJlIHNlbnQ6IChVU19DU1IgPSAweCV4KSIsIHJldCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY2NpZERyaXZlci5Qcm90b2NvbERhdGFTdHJ1Y3R1cmVbMV0gPT0gUFJPVE9DT0xfVDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoIk5vdCBzdXBwb3J0ZWQgVD0xXG5cciIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoIk5vdCBzdXBwb3J0ZWQgMHgleFxuXHIiLCBjY2lkRHJpdmVyLlByb3RvY29sRGF0YVN0cnVjdHVyZVsxXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIENDSURfRkVBVFVSRVNfRVhDX0FQRFU6CiAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRygiTm90IHN1cHBvcnRlZCBDQ0lEX0ZFQVRVUkVTX0VYQ19BUERVXG5cciIpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgIH0KCiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS53TGVuZ3RoID0gbXNnbGVuOwogICAgVFJBQ0VfREVCVUcoIlVTQjogMHglWCwgMHglWCwgMHglWCwgMHglWCwgMHglWFxuXHIiLCBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5hYkRhdGFbMF0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmFiRGF0YVsxXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYWJEYXRhWzJdLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5hYkRhdGFbM10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYWJEYXRhWzRdICk7CiAgICAgUkRSdG9QQ0RhdGFibG9jaygpOwoKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIENvbW1hbmQgUGlwZSwgQnVsay1PVVQgTWVzc2FnZXMKLy8vIHJldHVybiBwYXJhbWV0ZXJzIGJ5IHRoZSBjb21tYW5kOiBSRFJfdG9fUENfUGFyYW1ldGVycwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBQQ3RvUkRSR2V0UGFyYW1ldGVycyggdm9pZCApCnsKICAgIFRSQUNFX0RFQlVHKCIuIik7CgogICAgLy8gV2Ugc3VwcG9ydCBvbmx5IG9uZSBzbG90CgogICAgLy8gYm1JY2NTdGF0dXMKICAgIGlmKCBJU083ODE2X1N0YXR1c1Jlc2V0KCkgKSB7CiAgICAgICAgLy8gMDogQW4gSUNDIGlzIHByZXNlbnQgYW5kIGFjdGl2ZSAocG93ZXIgaXMgb24gYW5kIHN0YWJsZSwgUlNUIGlzIGluYWN0aXZlCiAgICAgICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyA9IDA7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAvLyAxOiBBbiBJQ0MgaXMgcHJlc2VudCBhbmQgaW5hY3RpdmUgKG5vdCBhY3RpdmF0ZWQgb3Igc2h1dCBkb3duIGJ5IGhhcmR3YXJlIGVycm9yKQogICAgICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAxOwogICAgfQoKICAgIFJEUnRvUENQYXJhbWV0ZXJzKCk7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBDb21tYW5kIFBpcGUsIEJ1bGstT1VUIE1lc3NhZ2VzCi8vLyBUaGlzIGNvbW1hbmQgcmVzZXRzIHRoZSBzbG90IHBhcmFtZXRlcnMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgUEN0b1JEUlJlc2V0UGFyYW1ldGVycyggdm9pZCApCnsKICAgIFRSQUNFX0RFQlVHKCIuIik7CgogICAgY2NpZERyaXZlci5TbG90U3RhdHVzID0gSUNDX05PVF9QUkVTRU5UOwogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyA9IGNjaWREcml2ZXIuU2xvdFN0YXR1czsKCiAgICBSRFJ0b1BDUGFyYW1ldGVycygpOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gQ29tbWFuZCBQaXBlLCBCdWxrLU9VVCBNZXNzYWdlcwovLy8gVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gY2hhbmdlIHRoZSBwYXJhbWV0ZXJzIGZvciBhIGdpdmVuIHNsb3QuCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIFBDdG9SRFJTZXRQYXJhbWV0ZXJzKCB2b2lkICkKewogICAgVFJBQ0VfREVCVUcoIi4iKTsKCiAgICBjY2lkRHJpdmVyLlNsb3RTdGF0dXMgPSBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU2xvdDsKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSBjY2lkRHJpdmVyLlNsb3RTdGF0dXM7CiAgICAvLyBOb3QgYWxsIGZlYXR1cmUgc3VwcG9ydGVkCgogICAgUkRSdG9QQ1BhcmFtZXRlcnMoKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIENvbW1hbmQgUGlwZSwgQnVsay1PVVQgTWVzc2FnZXMKLy8vIFRoaXMgY29tbWFuZCBhbGxvd3MgdGhlIENDSUQgbWFudWZhY3R1cmVyIHRvIGRlZmluZSBhbmQgYWNjZXNzIGV4dGVuZGVkIAovLy8gZmVhdHVyZXMuIAovLy8gSW5mb3JtYXRpb24gc2VudCB2aWEgdGhpcyBjb21tYW5kIGlzIHByb2Nlc3NlZCBieSB0aGUgQ0NJRCBjb250cm9sIGxvZ2ljLgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBQQ3RvUkRSRXNjYXBlKCB2b2lkICkKewogICAgVFJBQ0VfREVCVUcoIi4iKTsKCiAgICAvLyBJZiBuZWVkZWQgYnkgdGhlIHVzZXIKICAgIElTTzc4MTZfRXNjYXBlKCk7CgogICAgLy8gc3R1YiwgcmV0dXJuIGFsbCB2YWx1ZSBzZW5kCiAgICBSRFJ0b1BDRXNjYXBlKCBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC53TGVuZ3RoLCBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5BUERVKTsgICAgCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBDb21tYW5kIFBpcGUsIEJ1bGstT1VUIE1lc3NhZ2VzCi8vLyBUaGlzIGNvbW1hbmQgc3RvcHMgb3IgcmVzdGFydHMgdGhlIGNsb2NrLgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBQQ3RvUkRSSUNDQ2xvY2soIHZvaWQgKQp7CiAgICBUUkFDRV9ERUJVRygiLiIpOwoKICAgIGlmKCAwID09IGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJTcGVjaWZpY18wICkgewogICAgICAgIC8vIHJlc3RhcnRzIHRoZSBjbG9jawogICAgICAgIElTTzc4MTZfUmVzdGFydENsb2NrKCk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAvLyBzdG9wIGNsb2NrIGluIHRoZSBzdGF0ZSBzaG93biBpbiB0aGUgYkNsb2NrU3RvcCBmaWVsZAogICAgICAgIElTTzc4MTZfU3RvcENsb2NrKCk7CiAgICB9CgogICAgUkRSdG9QQ1Nsb3RTdGF0dXMoICk7ICAgIAp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gQ29tbWFuZCBQaXBlLCBCdWxrLU9VVCBNZXNzYWdlcwovLy8gVGhpcyBjb21tYW5kIGNoYW5nZXMgdGhlIHBhcmFtZXRlcnMgdXNlZCB0byBwZXJmb3JtIHRoZSB0cmFuc3BvcnRhdGlvbiBvZiAKLy8vIEFQRFUgbWVzc2FnZXMgYnkgdGhlIFQ9MCBwcm90b2NvbC4gCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIFBDdG9SRFJ0b0FQRFUoIHZvaWQgKQp7CiAgICB1bnNpZ25lZCBjaGFyIGJtQ2hhbmdlczsKICAgIHVuc2lnbmVkIGNoYXIgYkNsYXNzR2V0UmVzcG9uc2U7CiAgICB1bnNpZ25lZCBjaGFyIGJDbGFzc0VudmVsb3BlOwoKICAgIFRSQUNFX0lORk8oIi4iKTsKCiAgICBpZiggY29uZmlndXJhdGlvbkRlc2NyaXB0b3JzRlMtPmNjaWQuZHdGZWF0dXJlcyA9PSAoQ0NJRF9GRUFUVVJFU19FWENfU0FQRFV8Q0NJRF9GRUFUVVJFU19FWENfQVBEVSkgKSB7CgogICAgICAgIGJtQ2hhbmdlcyA9IGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJTcGVjaWZpY18wOwogICAgICAgIGJDbGFzc0dldFJlc3BvbnNlID0gY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNwZWNpZmljXzE7CiAgICAgICAgYkNsYXNzRW52ZWxvcGUgPSBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU3BlY2lmaWNfMjsKCiAgICAgICAgSVNPNzgxNl90b0FQRFUoKTsKICAgIH0KCiAgICBSRFJ0b1BDU2xvdFN0YXR1cygpOyAgICAKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIENvbW1hbmQgUGlwZSwgQnVsay1PVVQgTWVzc2FnZXMKLy8vIFRoaXMgaXMgYSBjb21tYW5kIG1lc3NhZ2UgdG8gYWxsb3cgZW50ZXJpbmcgdGhlIFBJTiBmb3IgdmVyaWZpY2F0aW9uIG9yCi8vLyBtb2RpZmljYXRpb24uCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIFBDdG9SRFJTZWN1cmUoIHZvaWQgKQp7CiAgICBUUkFDRV9ERUJVRygiLiIpOwoKICAgIFRSQUNFX0RFQlVHKCJGb3IgdXNlclxuXHIiKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIENvbW1hbmQgUGlwZSwgQnVsay1PVVQgTWVzc2FnZXMKLy8vIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIG1hbmFnZSBtb3Rvcml6ZWQgdHlwZSBDQ0lEIGZ1bmN0aW9uYWxpdHkuIAovLy8gVGhlIExvY2sgQ2FyZCBmdW5jdGlvbiBpcyB1c2VkIHRvIGhvbGQgdGhlIElDQy4gCi8vLyBUaGlzIHByZXZlbnRzIGFuIElDQyBmcm9tIGJlaW5nIGVhc2lseSByZW1vdmVkIGZyb20gdGhlIENDSUQuIAovLy8gVGhlIFVubG9jayBDYXJkIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVtb3ZlIHRoZSBob2xkIGluaXRpYXRlZCBieSB0aGUgTG9jayAKLy8vIENhcmQgZnVuY3Rpb24KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgUEN0b1JEUk1lY2hhbmljYWwoIHZvaWQgKQp7CiAgICBUUkFDRV9ERUJVRygiLiIpOwogICAgVFJBQ0VfREVCVUcoIk5vdCBpbXBsZW1lbnRlZFxuXHIiKTsKCiAgICBSRFJ0b1BDU2xvdFN0YXR1cygpOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gQ29tbWFuZCBQaXBlLCBCdWxrLU9VVCBNZXNzYWdlcwovLy8gVGhpcyBjb21tYW5kIGlzIHVzZWQgd2l0aCB0aGUgQ29udHJvbCBwaXBlIEFib3J0IHJlcXVlc3QgdG8gdGVsbCB0aGUgQ0NJRCAKLy8vIHRvIHN0b3AgYW55IGN1cnJlbnQgdHJhbnNmZXIgYXQgdGhlIHNwZWNpZmllZCBzbG90IGFuZCByZXR1cm4gdG8gYSBzdGF0ZSAKLy8vIHdoZXJlIHRoZSBzbG90IGlzIHJlYWR5IHRvIGFjY2VwdCBhIG5ldyBjb21tYW5kIHBpcGUgQnVsay1PVVQgbWVzc2FnZS4KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgUEN0b1JEUkFib3J0KCB2b2lkICkKewogICAgVFJBQ0VfREVCVUcoIi4iKTsKCiAgICBSRFJ0b1BDU2xvdFN0YXR1cygpOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gQ29tbWFuZCBQaXBlLCBCdWxrLU9VVCBNZXNzYWdlcwovLy8gVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gbWFudWFsbHkgc2V0IHRoZSBkYXRhIHJhdGUgYW5kIGNsb2NrIGZyZXF1ZW5jeSBvZiAKLy8vIGEgc3BlY2lmaWMgc2xvdC4KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgUEN0b1JEUlNldERhdGFSYXRlQW5kQ2xvY2tGcmVxdWVuY3koIHZvaWQgKQp7CiAgICB1bnNpZ25lZCBpbnQgZHdDbG9ja0ZyZXF1ZW5jeTsKICAgIHVuc2lnbmVkIGludCBkd0RhdGFSYXRlOwoKICAgIFRSQUNFX0RFQlVHKCIuIik7CgogICAgZHdDbG9ja0ZyZXF1ZW5jeSA9IGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLkFQRFVbMF0KICAgICAgICAgICAgICAgICAgICAgKyAoY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuQVBEVVsxXTw8OCkKICAgICAgICAgICAgICAgICAgICAgKyAoY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuQVBEVVsyXTw8MTYpCiAgICAgICAgICAgICAgICAgICAgICsgKGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLkFQRFVbM108PDI0KTsKCiAgICBkd0RhdGFSYXRlID0gY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuQVBEVVs0XQogICAgICAgICAgICAgICArIChjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5BUERVWzVdPDw4KQogICAgICAgICAgICAgICArIChjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5BUERVWzZdPDwxNikKICAgICAgICAgICAgICAgKyAoY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuQVBEVVs3XTw8MjQpOwoKICAgIElTTzc4MTZfU2V0RGF0YVJhdGVhbmRDbG9ja0ZyZXF1ZW5jeSggZHdDbG9ja0ZyZXF1ZW5jeSwgZHdEYXRhUmF0ZSApOwoKICAgIFJEUnRvUENEYXRhUmF0ZUFuZENsb2NrRnJlcXVlbmN5KCBkd0Nsb2NrRnJlcXVlbmN5LCBkd0RhdGFSYXRlICk7Cgp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gUmVwb3J0IHRoZSBDTURfTk9UX1NVUFBPUlRFRCBlcnJvciB0byB0aGUgaG9zdAovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCB2Q0NJRENvbW1hbmROb3RTdXBwb3J0ZWQoIHZvaWQgKQp7CiAgICAvLyBDb21tYW5kIG5vdCBzdXBwb3J0ZWQKICAgIC8vIHZDQ0lEUmVwb3J0RXJyb3IoQ01EX05PVF9TVVBQT1JURUQpOwoKICAgIFRSQUNFX0RFQlVHKCJDTURfTk9UX1NVUFBPUlRFRFxuXHIiKTsKCiAgICAvLyBIZWFkZXIgZmllbGRzIHNldHRpbmdzCiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iTWVzc2FnZVR5cGUgPSBSRFJfVE9fUENfU0xPVFNUQVRVUzsKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLndMZW5ndGggICAgICA9IDA7CiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3BlY2lmaWMgICAgPSAwOwoKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgfD0gSUNDX0NTX0ZBSUxFRDsKCiAgICAvLyBTZW5kIHRoZSByZXNwb25zZSB0byB0aGUgaG9zdAogICAgLy92Q0NJRFNlbmRSZXNwb25zZSgpOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gU2VudCBDQ0lEIHJlc3BvbnNlIG9uIFVTQgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCB2Q0NJRFNlbmRSZXNwb25zZSggdm9pZCApCnsKICAgIHVuc2lnbmVkIGNoYXIgYlN0YXR1czsKICAgIFRSQUNFX0RFQlVHKCIuIik7CgogICAgZG8gewogICAgICAgIGJTdGF0dXMgPSBDQ0lEX1dyaXRlKCh2b2lkKikmY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTaXplVG9TZW5kLCAwLCAwICk7CiAgICB9IHdoaWxlIChiU3RhdHVzICE9IFVTQkRfU1RBVFVTX1NVQ0NFU1MpOwoKICAgIFRSQUNFX0RFQlVHKCJiU3RhdHVzOiAweCV4XG5cciIsIGJTdGF0dXMpOwp9CgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vICBEZXNjcmlwdGlvbjogQ0NJRCBDb21tYW5kIGRpc3BhdGNoZXIKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgQ0NJRENvbW1hbmREaXNwYXRjaGVyKCB2b2lkICpwQXJnLCB1aW50OF90IHN0YXR1cywgdWludDMyX3QgdHJhbnNmZXJyZWQsIHVpbnQzMl90IHJlbWFpbmluZyApCnsKICAgIHVuc2lnbmVkIGNoYXIgTWVzc2FnZVRvU2VuZCA9IDA7CgogICAgaWYgKHN0YXR1cyAhPSBVU0JEX1NUQVRVU19TVUNDRVNTKSB7CiAgICAgICAgVFJBQ0VfRVJST1IoIlVTQiBlcnJvcjogJWQiLCBzdGF0dXMpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIFRSQUNFX0RFQlVHKCJDb21tYW5kOiAweCVYIDB4JXggMHglWCAweCVYIDB4JVggMHglWCAweCVYXG5cclxuXHIiLAogICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCljY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iTWVzc2FnZVR5cGUsCiAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KWNjaWREcml2ZXIuc0NjaWRDb21tYW5kLndMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KWNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJTbG90LAogICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCljY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU2VxLAogICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCljY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU3BlY2lmaWNfMCwKICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNwZWNpZmljXzEsCiAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KWNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJTcGVjaWZpY18yKTsKCiAgICAvLyBDaGVjayB0aGUgc2xvdCBudW1iZXIKICAgIGlmICggY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNsb3QgPiAwICkgewoKICAgICAgICBUUkFDRV9FUlJPUigiQkFEX1NMT1RfTlVNQkVSXG5cciIpOwogICAgfQoKICAgIFRSQUNFX0lORk8oInR5cD0weCVYXG5cciIsIGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJNZXNzYWdlVHlwZSk7CgogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyA9IDA7CgogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlNlcSAgPSBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU2VxOwogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlNsb3QgPSBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU2xvdDsKCiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU2l6ZVRvU2VuZCA9IHNpemVvZihTX2NjaWRfYnVsa19pbl9oZWFkZXIpLShBQkRBVEFfU0laRSsxKTsKCgogICAgLy8gQ29tbWFuZCBkaXNwYXRjaGVyCiAgICBzd2l0Y2ggKCBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iTWVzc2FnZVR5cGUgKSB7CgogICAgICAgIGNhc2UgUENfVE9fUkRSX0lDQ1BPV0VST046CiAgICAgICAgICAgIFBDdG9SRFJJY2NQb3dlck9uKCk7CiAgICAgICAgICAgIE1lc3NhZ2VUb1NlbmQgPSAxOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBQQ19UT19SRFJfSUNDUE9XRVJPRkY6CiAgICAgICAgICAgIFBDdG9SRFJJY2NQb3dlck9mZigpOwogICAgICAgICAgICBNZXNzYWdlVG9TZW5kID0gMTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgUENfVE9fUkRSX0dFVFNMT1RTVEFUVVM6CiAgICAgICAgICAgIFBDdG9SRFJHZXRTbG90U3RhdHVzKCk7CiAgICAgICAgICAgIE1lc3NhZ2VUb1NlbmQgPSAxOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBQQ19UT19SRFJfWEZSQkxPQ0s6CiAgICAgICAgICAgIFBDdG9SRFJYZnJCbG9jaygpOwogICAgICAgICAgICBNZXNzYWdlVG9TZW5kID0gMTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgUENfVE9fUkRSX0dFVFBBUkFNRVRFUlM6CiAgICAgICAgICAgIFBDdG9SRFJHZXRQYXJhbWV0ZXJzKCk7CiAgICAgICAgICAgIE1lc3NhZ2VUb1NlbmQgPSAxOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBQQ19UT19SRFJfUkVTRVRQQVJBTUVURVJTOgogICAgICAgICAgICBQQ3RvUkRSUmVzZXRQYXJhbWV0ZXJzKCk7CiAgICAgICAgICAgIE1lc3NhZ2VUb1NlbmQgPSAxOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBQQ19UT19SRFJfU0VUUEFSQU1FVEVSUzoKICAgICAgICAgICAgUEN0b1JEUlNldFBhcmFtZXRlcnMoKTsKICAgICAgICAgICAgTWVzc2FnZVRvU2VuZCA9IDE7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFBDX1RPX1JEUl9FU0NBUEU6CiAgICAgICAgICAgIFBDdG9SRFJFc2NhcGUoKTsKICAgICAgICAgICAgTWVzc2FnZVRvU2VuZCA9IDE7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFBDX1RPX1JEUl9JQ0NDTE9DSzoKICAgICAgICAgICAgUEN0b1JEUklDQ0Nsb2NrKCk7CiAgICAgICAgICAgIE1lc3NhZ2VUb1NlbmQgPSAxOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBQQ19UT19SRFJfVDBBUERVOgogICAgICAgICAgICAvLyBPbmx5IENDSURzIHJlcG9ydGluZyBhIHNob3J0IG9yIGV4dGVuZGVkIEFQRFUgbGV2ZWwgaW4gdGhlIGR3RmVhdHVyZXMgCiAgICAgICAgICAgIC8vIGZpZWxkIG9mIHRoZSBDQ0lEIGNsYXNzIGRlc2NyaXB0b3IgbWF5IHRha2UgdGhpcyBjb21tYW5kIGludG8gYWNjb3VudC4KICAgICAgICAgICAgaWYoIChDQ0lEX0ZFQVRVUkVTX0VYQ19TQVBEVSA9PSAoQ0NJRF9GRUFUVVJFU19FWENfU0FQRFUmY29uZmlndXJhdGlvbkRlc2NyaXB0b3JzRlMtPmNjaWQuZHdGZWF0dXJlcykpCiAgICAgICAgICAgIHx8IChDQ0lEX0ZFQVRVUkVTX0VYQ19BUERVICA9PSAoQ0NJRF9GRUFUVVJFU19FWENfQVBEVSAmY29uZmlndXJhdGlvbkRlc2NyaXB0b3JzRlMtPmNjaWQuZHdGZWF0dXJlcykpICkgewoKICAgICAgICAgICAgICAgIC8vIGNvbW1hbmQgc3VwcG9ydGVkCiAgICAgICAgICAgICAgICBQQ3RvUkRSdG9BUERVKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBjb21tYW5kIG5vdCBzdXBwb3J0ZWQKICAgICAgICAgICAgICAgIFRSQUNFX0lORk8oIk5vdCBzdXBwb3J0ZWQ6IFBDX1RPX1JEUl9UMEFQRFVcblxyIik7CiAgICAgICAgICAgICAgICB2Q0NJRENvbW1hbmROb3RTdXBwb3J0ZWQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBNZXNzYWdlVG9TZW5kID0gMTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgUENfVE9fUkRSX1NFQ1VSRToKICAgICAgICAgICAgUEN0b1JEUlNlY3VyZSgpOwogICAgICAgICAgICBNZXNzYWdlVG9TZW5kID0gMTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgUENfVE9fUkRSX01FQ0hBTklDQUw6CiAgICAgICAgICAgIFBDdG9SRFJNZWNoYW5pY2FsKCk7CiAgICAgICAgICAgIE1lc3NhZ2VUb1NlbmQgPSAxOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBQQ19UT19SRFJfQUJPUlQ6CiAgICAgICAgICAgIFBDdG9SRFJBYm9ydCgpOwogICAgICAgICAgICBNZXNzYWdlVG9TZW5kID0gMTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgUENfVE9fUkRSX1NFVERBVEFSQVRFQU5EQ0xPQ0tGUkVRVUVOQ1k6CiAgICAgICAgICAgIFBDdG9SRFJTZXREYXRhUmF0ZUFuZENsb2NrRnJlcXVlbmN5KCk7CiAgICAgICAgICAgIE1lc3NhZ2VUb1NlbmQgPSAxOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgVFJBQ0VfREVCVUcoImRlZmF1bHQ6IE5vdCBzdXBwb3J0ZWQ6IDB4JVhcblxyIiwgY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYk1lc3NhZ2VUeXBlKTsKICAgICAgICAgICAgdkNDSURDb21tYW5kTm90U3VwcG9ydGVkKCk7CiAgICAgICAgICAgIE1lc3NhZ2VUb1NlbmQgPSAxOwogICAgICAgICAgICBicmVhazsKCiAgICB9CgogICAgaWYoIE1lc3NhZ2VUb1NlbmQgPT0gMSApIHsKICAgICAgICB2Q0NJRFNlbmRSZXNwb25zZSgpOwogICAgfQp9CgoKI2lmIDAKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIFNFVFVQIHJlcXVlc3QgaGFuZGxlciBmb3IgYSBDQ0lEIGRldmljZQovLy8gXHBhcmFtIHBSZXF1ZXN0IFBvaW50ZXIgdG8gYSBVU0JHZW5lcmljUmVxdWVzdCBpbnN0YW5jZQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBDQ0lEX1JlcXVlc3RIYW5kbGVyKGNvbnN0IFVTQkdlbmVyaWNSZXF1ZXN0ICpwUmVxdWVzdCkKewogICAgVFJBQ0VfREVCVUcoIkNDSURfUkhsXG5cciIpOwoKICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBjbGFzcyByZXF1ZXN0CiAgICBpZiAoVVNCR2VuZXJpY1JlcXVlc3RfR2V0VHlwZShwUmVxdWVzdCkgPT0gVVNCR2VuZXJpY1JlcXVlc3RfQ0xBU1MpIHsKCiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHJlcXVlc3QgaXMgc3VwcG9ydGVkCiAgICAgICAgc3dpdGNoIChVU0JHZW5lcmljUmVxdWVzdF9HZXRSZXF1ZXN0KHBSZXF1ZXN0KSkgewoKICAgICAgICAgICAgY2FzZSBDQ0lER2VuZXJpY1JlcXVlc3RfQUJPUlQ6CiAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRygiQ0NJREdlbmVyaWNSZXF1ZXN0X0FCT1JUXG5cciIpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIENDSURHZW5lcmljUmVxdWVzdF9HRVRfQ0xPQ0tfRlJFUVVFTkNJRVM6CiAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRygiTm90IHN1cHBvcnRlZDogQ0NJREdlbmVyaWNSZXF1ZXN0X0dFVF9DTE9DS19GUkVRVUVOQ0lFU1xuXHIiKTsKICAgICAgICAgICAgICAgIC8vIEEgQ0NJRCB3aXRoIGJOdW1DbG9ja1N1cHBvcnRlZCBlcXVhbCB0byAwMGggZG9lcyBub3QgaGF2ZSAKICAgICAgICAgICAgICAgIC8vIHRvIHN1cHBvcnQgdGhpcyByZXF1ZXN0CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgQ0NJREdlbmVyaWNSZXF1ZXN0X0dFVF9EQVRBX1JBVEVTOgogICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoIk5vdCBzdXBwb3J0ZWQ6IENDSURHZW5lcmljUmVxdWVzdF9HRVRfREFUQV9SQVRFU1xuXHIiKTsKICAgICAgICAgICAgICAgIC8vIEEgQ0NJRCB3aXRoIGJOdW1EYXRhUmF0ZXNTdXBwb3J0ZWQgZXF1YWwgdG8gMDBoIGRvZXMgbm90IGhhdmUgCiAgICAgICAgICAgICAgICAvLyB0byBzdXBwb3J0IHRoaXMgcmVxdWVzdC4KICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIFRSQUNFX1dBUk5JTkcoICJDQ0lERHJpdmVyX1JlcXVlc3RIYW5kbGVyOiBVbnN1cHBvcnRlZCByZXF1ZXN0ICglZClcblxyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQkdlbmVyaWNSZXF1ZXN0X0dldFJlcXVlc3QocFJlcXVlc3QpKTsKICAgICAgICAgICAgICAgIFVTQkRfU3RhbGwoMCk7CiAgICAgICAgfQogICAgfQoKICAgIGVsc2UgaWYgKFVTQkdlbmVyaWNSZXF1ZXN0X0dldFR5cGUocFJlcXVlc3QpID09IFVTQkdlbmVyaWNSZXF1ZXN0X1NUQU5EQVJEKSB7CgogICAgICAgIC8vIEZvcndhcmQgcmVxdWVzdCB0byB0aGUgc3RhbmRhcmQgaGFuZGxlcgogICAgICAgIFVTQkREcml2ZXJfUmVxdWVzdEhhbmRsZXIoJihjY2lkRHJpdmVyLnVzYmREcml2ZXIpLCBwUmVxdWVzdCk7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgLy8gVW5zdXBwb3J0ZWQgcmVxdWVzdCB0eXBlCiAgICAgICAgVFJBQ0VfV0FSTklORyggIkNDSUREcml2ZXJfUmVxdWVzdEhhbmRsZXI6IFVuc3VwcG9ydGVkIHJlcXVlc3QgdHlwZSAoJWQpXG5cciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0JHZW5lcmljUmVxdWVzdF9HZXRUeXBlKHBSZXF1ZXN0KSk7CiAgICAgICAgVVNCRF9TdGFsbCgwKTsKICAgIH0KfQoKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICAgICAgRXhwb3J0ZWQgZnVuY3Rpb25zCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gT3B0aW9uYWwgY2FsbGJhY2sgcmUtaW1wbGVtZW50YXRpb24KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KI2lmICFkZWZpbmVkKE5PQVVUT0NBTExCQUNLKQovLyBub3Qgc3RhdGljIGZ1bmN0aW9uCnZvaWQgVVNCRENhbGxiYWNrc19SZXF1ZXN0UmVjZWl2ZWQoY29uc3QgVVNCR2VuZXJpY1JlcXVlc3QgKnJlcXVlc3QpCnsKICAgIENDSURfUmVxdWVzdEhhbmRsZXIocmVxdWVzdCk7Cn0KI2VuZGlmCiNlbmRpZgoKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBIYW5kbGVzIFNtYXJ0Q2FydCByZXF1ZXN0Ci8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnZvaWQgQ0NJRF9TbWFydENhcmRSZXF1ZXN0KCB2b2lkICkKewogICAgdW5zaWduZWQgY2hhciBiU3RhdHVzOwogICAgVFJBQ0VfREVCVUcoIkNDSURfcmVxXG4iKTsKCiAgICBkbyB7CgogICAgICAgIGJTdGF0dXMgPSBDQ0lEX1JlYWQoICh2b2lkKikmY2NpZERyaXZlci5zQ2NpZENvbW1hbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFNfY2NpZF9idWxrX291dF9oZWFkZXIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUcmFuc2ZlckNhbGxiYWNrKSZDQ0lEQ29tbWFuZERpc3BhdGNoZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKTAgKTsKICAgIH0KICAgIHdoaWxlICgwKTsKfQoKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBSZWFkcyBkYXRhIGZyb20gdGhlIERhdGEgT1VUIGVuZHBvaW50Ci8vLyBccGFyYW0gcEJ1ZmZlciAgIEJ1ZmZlciB0byBzdG9yZSB0aGUgcmVjZWl2ZWQgZGF0YQovLy8gXHBhcmFtIGRMZW5ndGggICBkYXRhIGJ1ZmZlciBsZW5ndGgKLy8vIFxwYXJhbSBmQ2FsbGJhY2sgT3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24KLy8vIFxwYXJhbSBwQXJndW1lbnQgT3B0aW9uYWwgcGFyYW1ldGVyIGZvciB0aGUgY2FsbGJhY2sgZnVuY3Rpb24KLy8vIFxyZXR1cm4gVVNCRF9TVEFUVVNfTE9DS0VEIG9yIFVTQkRfU1RBVFVTX1NVQ0NFU1MKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdW5zaWduZWQgY2hhciBDQ0lEX1JlYWQodm9pZCAqcEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZmVyQ2FsbGJhY2sgZkNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwQXJndW1lbnQpCnsKICAgIHJldHVybiBVU0JEX1JlYWQoQ0NJRF9FUFRfREFUQV9PVVQsIHBCdWZmZXIsIGRMZW5ndGgsIGZDYWxsYmFjaywgcEFyZ3VtZW50KTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIFNlbmRzIGRhdGEgdGhyb3VnaCB0aGUgRGF0YSBJTiBlbmRwb2ludAovLy8gXHBhcmFtIHBCdWZmZXIgICBCdWZmZXIgaG9sZGluZyB0aGUgZGF0YSB0byB0cmFuc21pdAovLy8gXHBhcmFtIGRMZW5ndGggICBMZW5ndGggb2YgZGF0YSBidWZmZXIKLy8vIFxwYXJhbSBmQ2FsbGJhY2sgT3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24KLy8vIFxwYXJhbSBwQXJndW1lbnQgT3B0aW9uYWwgcGFyYW1ldGVyIGZvciB0aGUgY2FsbGJhY2sgZnVuY3Rpb24KLy8vIFxyZXR1cm4gVVNCRF9TVEFUVVNfTE9DS0VEIG9yIFVTQkRfU1RBVFVTX1NVQ0NFU1MKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdW5zaWduZWQgY2hhciBDQ0lEX1dyaXRlKHZvaWQgKnBCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZExlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZmVyQ2FsbGJhY2sgZkNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcEFyZ3VtZW50KQp7CiAgICByZXR1cm4gVVNCRF9Xcml0ZShDQ0lEX0VQVF9EQVRBX0lOLCBwQnVmZmVyLCBkTGVuZ3RoLCBmQ2FsbGJhY2ssIHBBcmd1bWVudCk7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBTZW5kcyBkYXRhIHRocm91Z2ggdGhlIGludGVycnVwdCBlbmRwb2ludCwgSUNDIGluc2VydGlvbiBldmVudAovLy8gUkRSX3RvX1BDX05vdGlmeVNsb3RDaGFuZ2UKLy8vIFxyZXR1cm4gVVNCRF9TVEFUVVNfTE9DS0VEIG9yIFVTQkRfU1RBVFVTX1NVQ0NFU1MKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdW5zaWduZWQgY2hhciBDQ0lEX0luc2VydGlvbiggdm9pZCApCnsKICAgIFRSQUNFX0RFQlVHKCIuIik7CgogICAgLy8gQnVpbGQgdGhlIEludGVycnVwdC1JTiBtZXNzYWdlCiAgICBjY2lkRHJpdmVyLkJ1ZmZlcklOVFswXSA9IFJEUl9UT19QQ19OT1RJRllTTE9UQ0hBTkdFOwogICAgY2NpZERyaXZlci5CdWZmZXJJTlRbMV0gPSBJQ0NfSU5TRVJURURfRVZFTlQ7CiAgICBjY2lkRHJpdmVyLlNsb3RTdGF0dXMgICA9IElDQ19JTlNFUlRFRF9FVkVOVDsKCiAgICAvLyBOb3RpZnkgdGhlIGhvc3QgdGhhdCBhIElDQyBpcyBpbnNlcnRlZAogICAgcmV0dXJuIFVTQkRfV3JpdGUoIENDSURfRVBUX05PVElGSUNBVElPTiwgY2NpZERyaXZlci5CdWZmZXJJTlQsIDIsIDAsIDAgKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIFNlbmRzIGRhdGEgdGhyb3VnaCB0aGUgaW50ZXJydXB0IGVuZHBvaW50LCBJQ0MgcmVtb3ZhbCBldmVudAovLy8gUkRSX3RvX1BDX05vdGlmeVNsb3RDaGFuZ2UKLy8vIFxyZXR1cm4gVVNCRF9TVEFUVVNfTE9DS0VEIG9yIFVTQkRfU1RBVFVTX1NVQ0NFU1MKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdW5zaWduZWQgY2hhciBDQ0lEX1JlbW92YWwoIHZvaWQgKQp7CiAgICBUUkFDRV9ERUJVRygiLiIpOwoKICAgIC8vIEJ1aWxkIHRoZSBJbnRlcnJ1cHQtSU4gbWVzc2FnZQogICAgY2NpZERyaXZlci5CdWZmZXJJTlRbMF0gPSBSRFJfVE9fUENfTk9USUZZU0xPVENIQU5HRTsKICAgIGNjaWREcml2ZXIuQnVmZmVySU5UWzFdID0gSUNDX05PVF9QUkVTRU5UOwogICAgY2NpZERyaXZlci5TbG90U3RhdHVzICAgPSBJQ0NfTk9UX1BSRVNFTlQ7CgogICAgLy8gTm90aWZ5IHRoZSBob3N0IHRoYXQgYSBJQ0MgaXMgaW5zZXJ0ZWQKICAgIHJldHVybiBVU0JEX1dyaXRlKCBDQ0lEX0VQVF9OT1RJRklDQVRJT04sIGNjaWREcml2ZXIuQnVmZmVySU5ULCAyLCAwLCAwICk7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBJbnRlcnJ1cHQtSU4gTWVzc2FnZXMKLy8vIFRoaXMgbWVzc2FnZSBpcyBzZW50IHdoZW4gYW55IGJpdCBpbiB0aGUgYkhhcmR3YXJlRXJyb3JDb2RlIGZpZWxkIGlzIHNldC4gCi8vLyBJZiB0aGlzIG1lc3NhZ2UgaXMgc2VudCB3aGVuIHRoZXJlIGlzIG5vIJNvdXRzdGFuZGluZ5QgY29tbWFuZCwgdGhlIGJTZXEgCi8vLyBmaWVsZCB3aWxsIGJlIHVuZGVmaW5lZC4KLy8vIFxwYXJhbSBiU2xvdCBJQ0Mgc2xvdCBudW1iZXIKLy8vIFxwYXJhbSBiU2VxICBTZXF1ZW5jZSBudW1iZXIgb2YgdGhlIGJ1bGsgT1VUIGNvbW1hbmQgd2hlbiB0aGUgaGFyZHdhcmUgZXJyb3IKLy8vIG9jY3VyZWQKLy8vIFxwYXJhbSBiSGFyZHdhcmVFcnJvckNvZGUgSGFyZHdhcmUgZXJyb3IgY29kZQovLy8gXHJldHVybiBVU0JEX1NUQVRVU19MT0NLRUQgb3IgVVNCRF9TVEFUVVNfU1VDQ0VTUwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp1bnNpZ25lZCBjaGFyIFJEUnRvUENIYXJkd2FyZUVycm9yKCB1bnNpZ25lZCBjaGFyIGJTbG90LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBiU2VxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBiSGFyZHdhcmVFcnJvckNvZGUgKQp7CiAgICBUUkFDRV9ERUJVRygiLiIpOwoKICAgIC8vIEJ1aWxkIHRoZSBJbnRlcnJ1cHQtSU4gbWVzc2FnZQogICAgY2NpZERyaXZlci5CdWZmZXJJTlRbMF0gPSBSRFJfVE9fUENfSEFSRFdBUkVFUlJPUjsKICAgIGNjaWREcml2ZXIuQnVmZmVySU5UWzFdID0gYlNsb3Q7CiAgICBjY2lkRHJpdmVyLkJ1ZmZlcklOVFsyXSA9IGJTZXE7CiAgICBjY2lkRHJpdmVyLkJ1ZmZlcklOVFszXSA9IGJIYXJkd2FyZUVycm9yQ29kZTsKCiAgICAvLyBOb3RpZnkgdGhlIGhvc3QgdGhhdCBhIElDQyBpcyBpbnNlcnRlZAogICAgcmV0dXJuIFVTQkRfV3JpdGUoIENDSURfRVBUX05PVElGSUNBVElPTiwgY2NpZERyaXZlci5CdWZmZXJJTlQsIDQsIDAsIDAgKTsKfQoKI2VuZGlmIC8qIEhBVkVfQ0NJRCAqLwo=