LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiAgICAgICAgIEFUTUVMIE1pY3JvY29udHJvbGxlciBTb2Z0d2FyZSBTdXBwb3J0IAogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIENvcHlyaWdodCAoYykgMjAwOCwgQXRtZWwgQ29ycG9yYXRpb24KICoKICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgogKgogKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKICogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBkaXNjbGFpbWVyIGJlbG93LgogKgogKiBBdG1lbCdzIG5hbWUgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KICoKICogRElTQ0xBSU1FUjogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBVE1FTCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUgogKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQgQVJFCiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFUTUVMIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCiAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsCiAqIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLAogKiBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIFx1bml0Ci8vLwovLy8gIVB1cnBvc2UKLy8vCi8vLyBEZWZpbml0aW9uIG9mIG1ldGhvZHMgZm9yIHVzaW5nIGEgQ0NJRCBkZXZpY2UgZHJpdmVyLgovLy8gCi8vLyAhVXNhZ2UKLy8vIAovLy8gLSMgQ0NJRERyaXZlcl9Jbml0aWFsaXplCi8vLyAtIyBDQ0lEX1JlYWQKLy8vIC0jIENDSURfV3JpdGUKLy8vIC0jIENDSURfU21hcnRDYXJkUmVxdWVzdAovLy8gLSMgQ0NJRF9JbnNlcnRpb24KLy8vIC0jIENDSURfUmVtb3ZhbAovLy8gLSMgUkRSdG9QQ0hhcmR3YXJlRXJyb3IKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiNpZm5kZWYgQ0NJRF9EUklWRVJfSAojZGVmaW5lIENDSURfRFJJVkVSX0gKCi8vIEZJWE1FOiBUaGlzIGlzIGRpcnR5ISBUeXBlZGVmIGNvcGllZCBmcm9tIFVTQkQuaAp0eXBlZGVmIHZvaWQgKCpUcmFuc2ZlckNhbGxiYWNrKSh2b2lkICpwQXJnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHJhbnNmZXJyZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlbWFpbmluZyk7CgoKCi8vLyBGb3IgcmVmZXJlbmNlLCB0aGUgYWJzb2x1dGUgbWF4aW11bSBibG9jayBzaXplIAovLy8gZm9yIGEgVFBEVSBUPTAgYmxvY2sgaXMgMjYwIGJ5dGVzICg1IGJ5dGVzIGNvbW1hbmQ7IDI1NSBieXRlcyBkYXRhKSwgb3IgCi8vLyBmb3IgYSBUUERVIFQ9MSBibG9jayBpcyAyNTkgYnl0ZXMsIG9yIAovLy8gZm9yIGEgc2hvcnQgQVBEVSBUPTEgYmxvY2sgaXMgMjYxIGJ5dGVzLCBvciAKLy8vIGZvciBhbiBleHRlbmRlZCBBUERVIFQ9MSBibG9jayBpcyA2NTU0NCBieXRlcy4KI2RlZmluZSBBQkRBVEFfU0laRSAyNjAKCi8vLyBkZWZpbmUgcHJvdG9jb2wgVD0wCiNkZWZpbmUgUFJPVE9DT0xfVE8gMAovLy8gZGVmaW5lIHByb3RvY29sIFQ9MQojZGVmaW5lIFBST1RPQ09MX1QxIDEKCi8vLyBkZWZpbmUgZm9yIGR3RmVhdHVyZXMgc2VlIFRhYmxlIDUuMS0xIFNtYXJ0IENhcmQgRGV2aWNlIENsYXNzIERlc2NyaXB0b3JzCi8vLyBObyBzcGVjaWFsIGNoYXJhY3RlcmlzdGljcwojZGVmaW5lIENDSURfRkVBVFVSRVNfTkFEQSAgICAgICAweDAwMDAwMDAwCi8vLyBBdXRvbWF0aWMgcGFyYW1ldGVyIGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gQVRSIGRhdGEKI2RlZmluZSBDQ0lEX0ZFQVRVUkVTX0FVVE9fUENPTkYgMHgwMDAwMDAwMgovLy8gQXV0b21hdGljIGFjdGl2YXRpb24gb2YgSUNDIG9uIGluc2VydGluZwojZGVmaW5lIENDSURfRkVBVFVSRVNfQVVUT19BQ1RJViAweDAwMDAwMDA0IAovLy8gQXV0b21hdGljIElDQyB2b2x0YWdlIHNlbGVjdGlvbgojZGVmaW5lIENDSURfRkVBVFVSRVNfQVVUT19WT0xUICAweDAwMDAwMDA4IAovLy8gQXV0b21hdGljIElDQyBjbG9jayBmcmVxdWVuY3kgY2hhbmdlIGFjY29yZGluZyB0byBhY3RpdmUgcGFyYW1ldGVycyBwcm92aWRlZCAKLy8vIGJ5IHRoZSBIb3N0IG9yIHNlbGYgZGV0ZXJtaW5lZAojZGVmaW5lIENDSURfRkVBVFVSRVNfQVVUT19DTE9DSyAweDAwMDAwMDEwIAovLy8gQXV0b21hdGljIGJhdWQgcmF0ZSBjaGFuZ2UgYWNjb3JkaW5nIHRvIGFjdGl2ZSBwYXJhbWV0ZXJzIHByb3ZpZGVkIGJ5IHRoZSAKLy8vIEhvc3Qgb3Igc2VsZiBkZXRlcm1pbmVkCiNkZWZpbmUgQ0NJRF9GRUFUVVJFU19BVVRPX0JBVUQgIDB4MDAwMDAwMjAgCi8vLyBBdXRvbWF0aWMgcGFyYW1ldGVycyBuZWdvdGlhdGlvbiBtYWRlIGJ5IHRoZSBDQ0lEICh1c2Ugb2Ygd2FybSBvciBjb2xkIAovLy8gcmVzZXRzIG9yIFBQUyBhY2NvcmRpbmcgdG8gYSBtYW51ZmFjdHVyZXIgcHJvcHJpZXRhcnkgYWxnb3JpdGhtIHRvIHNlbGVjdCAKLy8vIHRoZSBjb21tdW5pY2F0aW9uIHBhcmFtZXRlcnMgd2l0aCB0aGUgSUNDKQojZGVmaW5lIENDSURfRkVBVFVSRVNfQVVUT19QTkVHTyAweDAwMDAwMDQwIAovLy8gQXV0b21hdGljIFBQUyBtYWRlIGJ5IHRoZSBDQ0lEIGFjY29yZGluZyB0byB0aGUgYWN0aXZlIHBhcmFtZXRlcnMKI2RlZmluZSBDQ0lEX0ZFQVRVUkVTX0FVVE9fUFBTICAgMHgwMDAwMDA4MCAKLy8vIENDSUQgY2FuIHNldCBJQ0MgaW4gY2xvY2sgc3RvcCBtb2RlCiNkZWZpbmUgQ0NJRF9GRUFUVVJFU19JQ0NTVE9QICAgIDB4MDAwMDAxMDAgCi8vLyBOQUQgdmFsdWUgb3RoZXIgdGhhbiAwMCBhY2NlcHRlZCAoVD0xIHByb3RvY29sIGluIHVzZSkKI2RlZmluZSBDQ0lEX0ZFQVRVUkVTX05BRCAgICAgICAgMHgwMDAwMDIwMCAKLy8vIEF1dG9tYXRpYyBJRlNEIGV4Y2hhbmdlIGFzIGZpcnN0IGV4Y2hhbmdlIChUPTEgcHJvdG9jb2wgaW4gdXNlKQojZGVmaW5lIENDSURfRkVBVFVSRVNfQVVUT19JRlNEICAweDAwMDAwNDAwIAovLy8gVFBEVSBsZXZlbCBleGNoYW5nZXMgd2l0aCBDQ0lECiNkZWZpbmUgQ0NJRF9GRUFUVVJFU19FWENfVFBEVSAgIDB4MDAwMTAwMDAgCi8vLyBTaG9ydCBBUERVIGxldmVsIGV4Y2hhbmdlIHdpdGggQ0NJRAojZGVmaW5lIENDSURfRkVBVFVSRVNfRVhDX1NBUERVICAweDAwMDIwMDAwIAovLy8gU2hvcnQgYW5kIEV4dGVuZGVkIEFQRFUgbGV2ZWwgZXhjaGFuZ2Ugd2l0aCBDQ0lECiNkZWZpbmUgQ0NJRF9GRUFUVVJFU19FWENfQVBEVSAgIDB4MDAwNDAwMDAgCi8vLyBVU0IgV2FrZSB1cCBzaWduYWxpbmcgc3VwcG9ydGVkIG9uIGNhcmQgaW5zZXJ0aW9uIGFuZCByZW1vdmFsCiNkZWZpbmUgQ0NJRF9GRUFUVVJFU19XQUtFVVAgICAgIDB4MDAxMDAwMDAgCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyAgICAgICAgIFR5cGVzCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLy8gQnVsayBDQ0lEIE1lc3NhZ2UgaGVhZGVyIHN0cnVjdHVyZQp0eXBlZGVmIHN0cnVjdAp7CiAgIHVuc2lnbmVkIGNoYXIgYk1lc3NhZ2VUeXBlOwogICAvLy8gTWVzc2FnZS1zcGVjaWZpYyBkYXRhIGxlbmd0aAogICB1bnNpZ25lZCBsb25nIHdMZW5ndGg7CiAgIC8vLyBJZGVudGlmaWVzIHRoZSBzbG90IG51bWJlciBmb3IgdGhpcyBjb21tYW5kCiAgIHVuc2lnbmVkIGNoYXIgYlNsb3Q7CiAgIC8vLyBTZXF1ZW5jZSBudW1iZXIgZm9yIGNvbW1hbmQuCiAgIHVuc2lnbmVkIGNoYXIgYlNlcTsKICAgLy8vIFNsb3Qgc3RhdHVzIHJlZ2lzdGVyCiAgIHVuc2lnbmVkIGNoYXIgYlN0YXR1czsKICAgLy8vIFNsb3QgZXJyb3IKICAgdW5zaWduZWQgY2hhciBiRXJyb3I7CiAgIC8vLyBzcGVjaWZpYyByZWdpc3RlcgogICB1bnNpZ25lZCBjaGFyIGJTcGVjaWZpYzsKICAgLy8vIERhdGEgYmxvY2sgc2VudCB0byB0aGUgQ0NJRC4KICAgdW5zaWduZWQgY2hhciBhYkRhdGFbQUJEQVRBX1NJWkVdOwogICB1bnNpZ25lZCBjaGFyIGJTaXplVG9TZW5kOwp9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBTX2NjaWRfYnVsa19pbl9oZWFkZXI7CgovLy8gNi4xIEJ1bGsgVHJhbnNmZXJzCnR5cGVkZWYgc3RydWN0CnsKICAgdW5zaWduZWQgY2hhciBiTWVzc2FnZVR5cGU7CiAgIC8vLyBNZXNzYWdlLXNwZWNpZmljIGRhdGEgbGVuZ3RoCiAgIHVuc2lnbmVkIGxvbmcgd0xlbmd0aDsKICAgLy8vIElkZW50aWZpZXMgdGhlIHNsb3QgbnVtYmVyIGZvciB0aGlzIGNvbW1hbmQKICAgdW5zaWduZWQgY2hhciBiU2xvdDsKICAgLy8vIFNlcXVlbmNlIG51bWJlciBmb3IgY29tbWFuZC4KICAgdW5zaWduZWQgY2hhciBiU2VxOwogICAvLy8gc3BlY2lmaWMgcmVnaXN0ZXIKICAgdW5zaWduZWQgY2hhciBiU3BlY2lmaWNfMDsKICAgdW5zaWduZWQgY2hhciBiU3BlY2lmaWNfMTsKICAgdW5zaWduZWQgY2hhciBiU3BlY2lmaWNfMjsKICAgLy8vIEFwcGxpY2F0aW9uIFByb3RvY29sIERhdGEgVW5pdAogICB1bnNpZ25lZCBjaGFyIEFQRFVbQUJEQVRBX1NJWkVdOwp9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBTX2NjaWRfYnVsa19vdXRfaGVhZGVyOwoKCi8vLyA2LjEuMTEuMiBQSU4gVmVyaWZpY2F0aW9uIERhdGEgU3RydWN0dXJlCnR5cGVkZWYgc3RydWN0CnsKICAgIC8vLyBOdW1iZXIgb2Ygc2Vjb25kcy4KICAgIHVuc2lnbmVkIGNoYXIgYlRpbWVyT3V0OwogICAgLy8vIFNldmVyYWwgcGFyYW1ldGVycyBmb3IgdGhlIFBJTiBmb3JtYXQgb3B0aW9ucwogICAgdW5zaWduZWQgY2hhciBibUZvcm1hdFN0cmluZzsKICAgIC8vLyBEZWZpbmUgdGhlIGxlbmd0aCBvZiB0aGUgUElOIHRvIHByZXNlbnQgaW4gdGhlIEFQRFUgY29tbWFuZAogICAgdW5zaWduZWQgY2hhciBibVBJTkJsb2NrU3RyaW5nOwogICAgLy8vIEFsbG93cyB0aGUgbGVuZ3RoIFBJTiBpbnNlcnRpb24gaW4gdGhlIEFQRFUgY29tbWFuZAogICAgdW5zaWduZWQgY2hhciBibVBJTkxlbmd0aEZvcm1hdDsKICAgIC8vLyBNaW5pbXVtIFBJTiBzaXplIGluIGRpZ2l0IGFuZCBNYXhpbXVtIFBJTiBzaXplIGluIGRpZ2l0CiAgICB1bnNpZ25lZCBjaGFyIHdQSU5NYXhFeHRyYURpZ2l0OwogICAgLy8vIFRoZSB2YWx1ZSBpcyBhIGJpdCB3aXNlIE9SIG9wZXJhdGlvbi4KICAgIHVuc2lnbmVkIGNoYXIgYkVudHJ5VmFsaWRhdGlvbkNvbmRpdGlvbjsKICAgIC8vLyBOdW1iZXIgb2YgbWVzc2FnZXMgdG8gZGlzcGxheSBmb3IgdGhlIFBJTiBtb2RpZnkgY29tbWFuZAogICAgdW5zaWduZWQgY2hhciBiTnVtYmVyTWVzc2FnZTsKICAgIC8vLyBMYW5ndWFnZSB1c2VkIHRvIGRpc3BsYXkgdGhlIG1lc3NhZ2VzLgogICAgdW5zaWduZWQgY2hhciB3TGFuZ0lkOwogICAgLy8vIE1lc3NhZ2UgaW5kZXggaW4gdGhlIFJlYWRlciBtZXNzYWdlIHRhYmxlCiAgICB1bnNpZ25lZCBjaGFyIGJNc2dJbmRleDsKICAgIC8vLyBUPTEgSS1ibG9jayBwcm9sb2d1ZSBmaWVsZCB0byB1c2UKICAgIHVuc2lnbmVkIGNoYXIgYlRlb1Byb2xvZ3VlWzNdOwogICAgLy8vIEFQRFUgdG8gc2VuZCB0byB0aGUgSUNDCiAgICB1bnNpZ25lZCBjaGFyIGFiUElOQXBkdVsyNTVdOwp9X19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIFNfY2NpZF9QSU5fVmVyaWZpY2F0aW9uOwoKCi8vLyA2LjEuMTEuNyBQSU4gTW9kaWZpY2F0aW9uIERhdGEgU3RydWN0dXJlCnR5cGVkZWYgc3RydWN0CnsKICAgIC8vLyBOdW1iZXIgb2Ygc2Vjb25kcy4gSWYgMDBoIHRoZW4gQ0NJRCBkZWZhdWx0IHZhbHVlIGlzIHVzZWQuCiAgICB1bnNpZ25lZCBjaGFyIGJUaW1lT3V0OwogICAgLy8vIFNldmVyYWwgcGFyYW1ldGVycyBmb3IgdGhlIFBJTiBmb3JtYXQgb3B0aW9ucyAoZGVmaW5lZCBpbiCnIDYuMS4xMS40KQogICAgdW5zaWduZWQgY2hhciBibUZvcm1hdFN0cmluZzQ7CiAgICAvLy8gRGVmaW5lIHRoZSBsZW5ndGggb2YgdGhlIFBJTiB0byBwcmVzZW50IGluIHRoZSBBUERVIGNvbW1hbmQKICAgIHVuc2lnbmVkIGNoYXIgYm1QSU5CbG9ja1N0cmluZzsKICAgIC8vLyBBbGxvd3MgdGhlIGxlbmd0aCBQSU4gaW5zZXJ0aW9uIGluIHRoZSBBUERVIGNvbW1hbmQgKGRlZmluZWQgaW4gpyA2LjEuMTEuNikKICAgIHVuc2lnbmVkIGNoYXIgYm1QaW5MZW5ndGhGb3JtYXQ7CiAgICAvLy8gSW5zZXJ0aW9uIHBvc2l0aW9uIG9mZnNldCBpbiBieXRlIGZvciB0aGUgY3VycmVudCBQSU4KICAgIHVuc2lnbmVkIGNoYXIgYkluc2VydGlvbk9mZnNldE9sZDsKICAgIC8vLyBJbnNlcnRpb24gcG9zaXRpb24gb2Zmc2V0IGluIGJ5dGUgZm9yIHRoZSBuZXcgUElOCiAgICB1bnNpZ25lZCBjaGFyIGJJbnNlcnRpb25PZmZzZXROZXc7CiAgICAvLy8gWFhZWWgKICAgIC8vLyBYWDogTWluaW11bSBQSU4gc2l6ZSBpbiBkaWdpdAogICAgLy8vIFlZOiBNYXhpbXVtIFBJTiBzaXplIGluIGRpZ2l0CiAgICB1bnNpZ25lZCBjaGFyIHdQSU5NYXhFeHRyYURpZ2l0OwogICAgLy8vIDAwaCwwMWgsMDJoLDAzaAogICAgLy8vIEluZGljYXRlcyBpZiBhIGNvbmZpcm1hdGlvbiBpcyByZXF1ZXN0ZWQgYmVmb3JlIGFjY2VwdGFuY2Ugb2YgYSBuZXcgUElOIChtZWFuaW5nIHRoYXQgdGhlIHVzZXIgaGFzIHRvIGVudGVyIHRoaXMgbmV3IFBJTiB0d2ljZSBiZWZvcmUgaXQgaXMgYWNjZXB0ZWQpCiAgICAvLy8gSW5kaWNhdGVzIGlmIHRoZSBjdXJyZW50IFBJTiBtdXN0IGJlIGVudGVyZWQgYW5kIHNldCBpbiB0aGUgc2FtZSBBUERVIGZpZWxkIG9mIG5vdC4KICAgIHVuc2lnbmVkIGNoYXIgYkNvbmZpcm1QSU47CiAgICAvLy8gVGhlIHZhbHVlIGlzIGEgYml0IHdpc2UgT1Igb3BlcmF0aW9uLgogICAgLy8vIDAxaCBNYXggc2l6ZSByZWFjaGVkCiAgICAvLy8gMDJoIFZhbGlkYXRpb24ga2V5IHByZXNzZWQKICAgIC8vLyAwNGggVGltZW91dCBvY2N1cnJlZAogICAgdW5zaWduZWQgY2hhciBiRW50cnlWYWxpZGF0aW9uQ29uZGl0aW9uOwogICAgLy8vIDAwaCwwMWgsMDJoLDAzaCxvciBGRmgKICAgIC8vLyBOdW1iZXIgb2YgbWVzc2FnZXMgdG8gZGlzcGxheSBmb3IgdGhlIFBJTiBtb2RpZnkgY29tbWFuZC4KICAgIHVuc2lnbmVkIGNoYXIgYk51bWJlck1lc3NhZ2U7CiAgICAvLy8gTGFuZ3VhZ2UgdXNlZCB0byBkaXNwbGF5IHRoZSBtZXNzYWdlcy4gVGhlIDE2IGJpdAogICAgdW5zaWduZWQgY2hhciB3TGFuZ0lkOwogICAgLy8vIE1lc3NhZ2UgaW5kZXggaW4gdGhlIFJlYWRlciBtZXNzYWdlIHRhYmxlIChzaG91bGQgYmUgMDBoIG9yIDAxaCkuCiAgICB1bnNpZ25lZCBjaGFyIGJNc2dJbmRleDE7CiAgICAvLy8gTWVzc2FnZSBpbmRleCBpbiB0aGUgUmVhZGVyIG1lc3NhZ2UgdGFibGUgKHNob3VsZCBiZSAwMWggb3IgMDJoKS4KICAgIHVuc2lnbmVkIGNoYXIgYk1zZ0luZGV4MjsKICAgIC8vLyBNZXNzYWdlIGluZGV4IGluIHRoZSBSZWFkZXIgbWVzc2FnZSB0YWJsZSAoc2hvdWxkIGJlIDAyaCkuCiAgICB1bnNpZ25lZCBjaGFyIGJNc2dJbmRleDM7CiAgICAvLy8gVD0xIEktYmxvY2sgcHJvbG9ndWUgZmllbGQgdG8gdXNlLiBTaWduaWZpY2FudCBvbmx5IGlmIHByb3RvY29sIGluIHVzZSBpcyBUPTEuCiAgICB1bnNpZ25lZCBjaGFyIGJUZW9Qcm9sb2d1ZVszXTsKICAgIC8vLyBCeXRlIGFycmF5IEFQRFUgdG8gc2VuZCB0byB0aGUgSUNDCiAgICB1bnNpZ25lZCBjaGFyIGFiUElOQXBkdVsyNTVdOwp9X19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIFNfY2NpZF9QSU5fTW9kaWZpY2F0aW9uOwoKLy8vIFByb3RvY29sIERhdGEgU3RydWN0dXJlIGZvciBQcm90b2NvbCBUPTAgKGJQcm90b2NvbE51bT0wLCBkd0xlbmd0aD0wMDAwMDAwNWgpCnR5cGVkZWYgc3RydWN0CnsKICAgIC8vLyBCNy00IJYgRkkgliBJbmRleCBpbnRvIHRoZSB0YWJsZSA3IGluIElTTy9JRUMgNzgxNi0zOjE5OTcgc2VsZWN0aW5nIGEgCiAgICAvLy8gY2xvY2sgcmF0ZSBjb252ZXJzaW9uIGZhY3RvcgogICAgLy8vIEIzLTAgliBESSAtIEluZGV4IGludG8gdGhlIHRhYmxlIDggaW4gSVNPL0lFQyA3ODE2LTM6MTk5NyBzZWxlY3RpbmcgYSAKICAgIC8vLyBiYXVkIHJhdGUgY29udmVyc2lvbiBmYWN0b3IKICAgIHVuc2lnbmVkIGNoYXIgYm1GaW5kZXhEaW5kZXg7CiAgICAvLy8gRm9yIFQ9MCAsQjAgliAwYiwgQjctMiCWIDAwMDAwMGIKICAgIC8vLyBCMSCWIENvbnZlbnRpb24gdXNlZCAoYjE9MCBmb3IgZGlyZWN0LCBiMT0xIGZvciBpbnZlcnNlKQogICAgdW5zaWduZWQgY2hhciBibVRDQ0tTVDA7ICAgICAgICAgLy8gMCB0byAyCiAgICAvLy8gRXh0cmEgR3VhcmR0aW1lIGJldHdlZW4gdHdvIGNoYXJhY3RlcnMuIEFkZCAwIHRvIDI1NCBldHUgdG8gdGhlIG5vcm1hbCAKICAgIC8vLyBndWFyZHRpbWUgb2YgMTJldHUuIEZGaCBpcyB0aGUgc2FtZSBhcyAwMGguCiAgICB1bnNpZ25lZCBjaGFyIGJHdWFyZFRpbWVUMDsgICAgICAvLyAwIHRvIEZGCiAgICAvLy8gV0kgZm9yIFQ9MCB1c2VkIHRvIGRlZmluZSBXV1QKICAgIHVuc2lnbmVkIGNoYXIgYldhaXRpbmdJbnRlZ2VyVDA7IC8vIDAgdG8gRkYKICAgIC8vLyBJQ0MgQ2xvY2sgU3RvcCBTdXBwb3J0CiAgICAvLy8gMDAgPSBTdG9wcGluZyB0aGUgQ2xvY2sgaXMgbm90IGFsbG93ZWQKICAgIC8vLyAwMSA9IFN0b3Agd2l0aCBDbG9jayBzaWduYWwgTG93CiAgICAvLy8gMDIgPSBTdG9wIHdpdGggQ2xvY2sgc2lnbmFsIEhpZ2gKICAgIC8vLyAwMyA9IFN0b3Agd2l0aCBDbG9jayBlaXRoZXIgSGlnaCBvciBMb3cKICAgIHVuc2lnbmVkIGNoYXIgYkNsb2NrU3RvcDsgICAgICAgIC8vIDAgdG8gMwp9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBTX2NjaWRfcHJvdG9jb2xfdDA7CgoKLy8vIFByb3RvY29sIERhdGEgU3RydWN0dXJlIGZvciBQcm90b2NvbCBUPTEgKGJQcm90b2NvbE51bT0xLCBkd0xlbmd0aD0wMDAwMDAwN2gpCnR5cGVkZWYgc3RydWN0CnsKICAgIC8vLyBCNy00IJYgRkkgliBJbmRleCBpbnRvIHRoZSB0YWJsZSA3IGluIElTTy9JRUMgNzgxNi0zOjE5OTcgc2VsZWN0aW5nIGEgCiAgICAvLy8gY2xvY2sgcmF0ZSBjb252ZXJzaW9uIGZhY3RvcgogICAgLy8vIEIzLTAgliBESSAtIEluZGV4IGludG8gdGhlIHRhYmxlIDggaW4gSVNPL0lFQyA3ODE2LTM6MTk5NyBzZWxlY3RpbmcgYSAKICAgIC8vLyBiYXVkIHJhdGUgY29udmVyc2lvbiBmYWN0b3IKICAgIHVuc2lnbmVkIGNoYXIgYm1GaW5kZXhEaW5kZXg7CiAgICAvLy8gRm9yIFQ9MSwgQjctMiCWIDAwMDEwMGIKICAgIC8vLyBCMCCWIENoZWNrc3VtIHR5cGUgKGIwPTAgZm9yIExSQywgYjA9MSBmb3IgQ1JDCiAgICAvLy8gQjEgliBDb252ZW50aW9uIHVzZWQgKGIxPTAgZm9yIGRpcmVjdCwgYjE9MSBmb3IgaW52ZXJzZSkKICAgIHVuc2lnbmVkIGNoYXIgYm1UQ0NLU1QxOyAgICAgICAgICAgLy8gMTBoLCAxMWgsIDEyaCwgMTNoCiAgICAvLy8gRXh0cmEgR3VhcmR0aW1lICgwIHRvIDI1NCBldHUgYmV0d2VlbiB0d28gY2hhcmFjdGVycykuIAogICAgLy8vIElmIHZhbHVlIGlzIEZGaCwgdGhlbiBndWFyZHRpbWUgaXMgcmVkdWNlZCBieSAxLgogICAgdW5zaWduZWQgY2hhciBiR3VhcmRUaW1lVDE7ICAgICAgICAvLyAwIHRvIEZGCiAgICAvLy8gQjctNCA9IEJXSQogICAgLy8vIEIzLTAgPSBDV0kKICAgIHVuc2lnbmVkIGNoYXIgYm1XYWl0aW5nSW50ZWdlcnNUMTsgLy8gMCB0byA5CiAgICAvLy8gSUNDIENsb2NrIFN0b3AgU3VwcG9ydAogICAgLy8vIDAwID0gU3RvcHBpbmcgdGhlIENsb2NrIGlzIG5vdCBhbGxvd2VkCiAgICAvLy8gMDEgPSBTdG9wIHdpdGggQ2xvY2sgc2lnbmFsIExvdwogICAgLy8vIDAyID0gU3RvcCB3aXRoIENsb2NrIHNpZ25hbCBIaWdoCiAgICAvLy8gMDMgPSBTdG9wIHdpdGggQ2xvY2sgZWl0aGVyIEhpZ2ggb3IgTG93CiAgICB1bnNpZ25lZCBjaGFyIGJDbG9ja1N0b3A7ICAgICAgICAgIC8vIDAgdG8gMwogICAgLy8vIFNpemUgb2YgbmVnb3RpYXRlZCBJRlNDCiAgICB1bnNpZ25lZCBjaGFyIGJJRlNDOyAgICAgICAgICAgICAgIC8vIDAgdG8gRkUKICAgIC8vLyBOYWQgdmFsdWUgdXNlZCBieSBDQ0lECiAgICB1bnNpZ25lZCBjaGFyIGJOYWRWYWx1ZTsgICAgICAgICAgIC8vIDAgdG8gRkYKfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgU19jY2lkX3Byb3RvY29sX3QxOwoKCi8vLyBJZGVudGlmaWVzIHRoZSBsZW5ndGggb2YgdHlwZSBvZiBzdWJvcmRpbmF0ZSBkZXNjcmlwdG9ycyBvZiBhIENDSUQgZGV2aWNlCi8vLyBUYWJsZSA1LjEtMSBTbWFydCBDYXJkIERldmljZSBDbGFzcyBkZXNjcmlwdG9ycwp0eXBlZGVmIHN0cnVjdAp7CiAgIC8vLyBTaXplIG9mIHRoaXMgZGVzY3JpcHRvciwgaW4gYnl0ZXMuCiAgIHVuc2lnbmVkIGNoYXIgIGJMZW5ndGg7CiAgIC8vLyBGdW5jdGlvbmFsIERlc2NyaXB0b3IgdHlwZQogICB1bnNpZ25lZCBjaGFyICBiRGVzY3JpcHRvclR5cGU7CiAgIC8vLyBJbnRlZ3JhdGVkIENpcmN1aXQocykgQ2FyZHMgSW50ZXJmYWNlIERldmljZXMgKENDSUQpIFNwZWNpZmljYXRpb24gCiAgIC8vLyBSZWxlYXNlIE51bWJlcgogICB1bnNpZ25lZCBzaG9ydCBiY2RDQ0lEOwogICAvLy8gSW5kZXggb2YgdGhlIGhpZ2hlc3QgYXZhaWxhYmxlIHNsb3QuIEFuIFVTQi1JQ0MgaXMgcmVnYXJkZWQgYXMgYSBzaW5nbGUKICAgLy8vIHNsb3QgQ0NJRC4KICAgdW5zaWduZWQgY2hhciAgYk1heFNsb3RJbmRleDsKICAgLy8vIFRoaXMgdmFsdWUgaW5kaWNhdGVzIHdoYXQgdm9sdGFnZXMgdGhlIENDSUQgY2FuIHN1cHBseSB0byBpdHMgc2xvdHMuCiAgIC8vLyBJdCBpcyBhIGJpdHdpc2UgT1Igb3BlcmF0aW9uIHBlcmZvcm1lZCBvbiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICAgLy8vIC0gMDFoIDUuMFYKICAgLy8vIC0gMDJoIDMuMFYKICAgLy8vIC0gMDRoIDEuOFYKICAgLy8vIE90aGVyIGJpdHMgYXJlIFJGVS4KICAgdW5zaWduZWQgY2hhciAgYlZvbHRhZ2VTdXBwb3J0OwogICAvLy8gUlJSUiCWVXBwZXIgV29yZC0gaXMgUkZVID0gMDAwMGgKICAgLy8vIFBQUFAglkxvd2VyIFdvcmQtIEVuY29kZXMgdGhlIHN1cHBvcnRlZCBwcm90b2NvbCB0eXBlcy4gQSCRMZIgaW4gYSBnaXZlbgogICAvLy8gYml0IHBvc2l0aW9uIGluZGljYXRlcyBzdXBwb3J0IGZvciB0aGUgYXNzb2NpYXRlZCBJU08gcHJvdG9jb2wuCiAgIC8vLyAwMDAxaCA9IFByb3RvY29sIFQ9MAogICAvLy8gMDAwMmggPSBQcm90b2NvbCBUPTEKICAgLy8vIEFsbCBvdGhlciBiaXRzIGFyZSByZXNlcnZlZCBhbmQgbXVzdCBiZSBzZXQgdG8gemVyby4gVGhlIGZpZWxkIGlzIAogICAvLy8gaW50ZW5kZWQgdG8gY29ycmVzcG9uZCB0byB0aGUgUENTQyBzcGVjaWZpY2F0aW9uIGRlZmluaXRpb25zLiAKICAgdW5zaWduZWQgbG9uZyAgZHdQcm90b2NvbHM7CiAgIC8vLyBEZWZhdWx0IElDQyBjbG9jayBmcmVxdWVuY3kgaW4gS0h6LiBUaGlzIGlzIGFuIGludGVnZXIgdmFsdWUuCiAgIHVuc2lnbmVkIGxvbmcgIGR3RGVmYXVsdENsb2NrOwogICAvLy8gTWF4aW11bSBzdXBwb3J0ZWQgSUNDIGNsb2NrIGZyZXF1ZW5jeSBpbiBLSHouIFRoaXMgaXMgYW4gaW50ZWdlciB2YWx1ZS4KICAgdW5zaWduZWQgbG9uZyAgZHdNYXhpbXVtQ2xvY2s7CiAgIC8vLyBUaGUgbnVtYmVyIG9mIGNsb2NrIGZyZXF1ZW5jaWVzIHRoYXQgYXJlIHN1cHBvcnRlZCBieSB0aGUgQ0NJRC4gSWYgdGhlIAogICAvLy8gdmFsdWUgaXMgMDBoLCB0aGUgc3VwcG9ydGVkIGNsb2NrIGZyZXF1ZW5jaWVzIGFyZSBhc3N1bWVkIHRvIGJlIHRoZSAKICAgLy8vIGRlZmF1bHQgY2xvY2sgZnJlcXVlbmN5IGRlZmluZWQgYnkgZHdEZWZhdWx0Q2xvY2sgYW5kIHRoZSBtYXhpbXVtIGNsb2NrIAogICAvLy8gZnJlcXVlbmN5IGRlZmluZWQgYnkgZHdNYXhpbXVtQ2xvY2suCiAgIHVuc2lnbmVkIGNoYXIgIGJOdW1DbG9ja1N1cHBvcnRlZDsKICAgLy8vIERlZmF1bHQgSUNDIEkvTyBkYXRhIHJhdGUgaW4gYnBzLiBUaGlzIGlzIGFuIGludGVnZXIgdmFsdWUKICAgdW5zaWduZWQgbG9uZyAgZHdEYXRhUmF0ZTsKICAgLy8vIE1heGltdW0gc3VwcG9ydGVkIElDQyBJL08gZGF0YSByYXRlIGluIGJwcwogICB1bnNpZ25lZCBsb25nICBkd01heERhdGFSYXRlOwogICAvLy8gVGhlIG51bWJlciBvZiBkYXRhIHJhdGVzIHRoYXQgYXJlIHN1cHBvcnRlZCBieSB0aGUgQ0NJRC4KICAgdW5zaWduZWQgY2hhciAgYk51bURhdGFSYXRlc1N1cHBvcnRlZDsKICAgLy8vIEluZGljYXRlcyB0aGUgbWF4aW11bSBJRlNEIHN1cHBvcnRlZCBieSBDQ0lEIGZvciBwcm90b2NvbCBUPTEuCiAgIHVuc2lnbmVkIGxvbmcgIGR3TWF4SUZTRDsKICAgLy8vIC0gUlJSUi1VcHBlciBXb3JkLSBpcyBSRlUgPSAwMDAwaAogICAvLy8gLSBQUFBQLUxvd2VyIFdvcmQtIGVuY29kZXMgdGhlIHN1cHBvcnRlZCBwcm90b2NvbCB0eXBlcy4gQSCRMZIgaW4gYSBnaXZlbgogICAvLy8gICBiaXQgcG9zaXRpb24gaW5kaWNhdGVzIHN1cHBvcnQgZm9yIHRoZSBhc3NvY2lhdGVkIHByb3RvY29sLgogICAvLy8gICAwMDAxaCBpbmRpY2F0ZXMgc3VwcG9ydCBmb3IgdGhlIDItd2lyZSBwcm90b2NvbCAxCiAgIC8vLyAgIDAwMDJoIGluZGljYXRlcyBzdXBwb3J0IGZvciB0aGUgMy13aXJlIHByb3RvY29sIDEKICAgLy8vICAgMDAwNGggaW5kaWNhdGVzIHN1cHBvcnQgZm9yIHRoZSBJMkMgcHJvdG9jb2wgMQogICAvLy8gQWxsIG90aGVyIHZhbHVlcyBhcmUgb3V0c2lkZSBvZiB0aGlzIHNwZWNpZmljYXRpb24sIGFuZCBtdXN0IGJlIGhhbmRsZWQgCiAgIC8vLyBieSB2ZW5kb3Itc3VwcGxpZWQgZHJpdmVycy4KICAgdW5zaWduZWQgbG9uZyAgZHdTeW5jaFByb3RvY29sczsKICAgLy8vIFRoZSB2YWx1ZSBpcyBhIGJpdHdpc2UgT1Igb3BlcmF0aW9uIHBlcmZvcm1lZCBvbiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICAgLy8vIC0gMDAwMDAwMDBoIE5vIHNwZWNpYWwgY2hhcmFjdGVyaXN0aWNzCiAgIC8vLyAtIDAwMDAwMDAxaCBDYXJkIGFjY2VwdCBtZWNoYW5pc20gMgogICAvLy8gLSAwMDAwMDAwMmggQ2FyZCBlamVjdGlvbiBtZWNoYW5pc20gMgogICAvLy8gLSAwMDAwMDAwNGggQ2FyZCBjYXB0dXJlIG1lY2hhbmlzbSAyCiAgIC8vLyAtIDAwMDAwMDA4aCBDYXJkIGxvY2svdW5sb2NrIG1lY2hhbmlzbQogICB1bnNpZ25lZCBsb25nICBkd01lY2hhbmljYWw7CiAgIC8vLyBUaGlzIHZhbHVlIGluZGljYXRlcyB3aGF0IGludGVsbGlnZW50IGZlYXR1cmVzIHRoZSBDQ0lEIGhhcy4KICAgdW5zaWduZWQgbG9uZyAgZHdGZWF0dXJlczsKICAgLy8vIEZvciBleHRlbmRlZCBBUERVIGxldmVsIHRoZSB2YWx1ZSBzaGFsbCBiZSBiZXR3ZWVuIDI2MSArIDEwIChoZWFkZXIpIGFuZCAKICAgLy8vIDY1NTQ0ICsxMCwgb3RoZXJ3aXNlIHRoZSBtaW5pbXVtIHZhbHVlIGlzIHRoZSB3TWF4UGFja2V0U2l6ZSBvZiB0aGUgCiAgIC8vLyBCdWxrLU9VVCBlbmRwb2ludC4KICAgdW5zaWduZWQgbG9uZyAgZHdNYXhDQ0lETWVzc2FnZUxlbmd0aDsKICAgLy8vIFNpZ25pZmljYW50IG9ubHkgZm9yIENDSUQgdGhhdCBvZmZlcnMgYW4gQVBEVSBsZXZlbCBmb3IgZXhjaGFuZ2VzLgogICB1bnNpZ25lZCBjaGFyICBiQ2xhc3NHZXRSZXNwb25zZTsKICAgLy8vIFNpZ25pZmljYW50IG9ubHkgZm9yIENDSUQgdGhhdCBvZmZlcnMgYW4gZXh0ZW5kZWQgQVBEVSBsZXZlbCBmb3IgZXhjaGFuZ2VzLgogICB1bnNpZ25lZCBjaGFyICBiQ2xhc3NFbnZlbG9wZTsKICAgLy8vIE51bWJlciBvZiBsaW5lcyBhbmQgY2hhcmFjdGVycyBmb3IgdGhlIExDRCBkaXNwbGF5IHVzZWQgdG8gc2VuZCBtZXNzYWdlcyBmb3IgUElOIGVudHJ5LgogICB1bnNpZ25lZCBzaG9ydCB3TGNkTGF5b3V0OwogICAvLy8gVGhpcyB2YWx1ZSBpbmRpY2F0ZXMgd2hhdCBQSU4gc3VwcG9ydCBmZWF0dXJlcyB0aGUgQ0NJRCBoYXMuCiAgIHVuc2lnbmVkIGNoYXIgIGJQSU5TdXBwb3J0OwogICAvLy8gTWF4aW11bSBudW1iZXIgb2Ygc2xvdHMgd2hpY2ggY2FuIGJlIHNpbXVsdGFuZW91c2x5IGJ1c3kuCiAgIHVuc2lnbmVkIGNoYXIgIGJNYXhDQ0lEQnVzeVNsb3RzOwoKfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgQ0NJRERlc2NyaXB0b3I7CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyAgICAgICAgIEV4cG9ydGVkIGZ1bmN0aW9ucwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKZXh0ZXJuIHVuc2lnbmVkIGNoYXIgUkRSdG9QQ0hhcmR3YXJlRXJyb3IoIHVuc2lnbmVkIGNoYXIgYlNsb3QsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBiU2VxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYkhhcmR3YXJlRXJyb3JDb2RlICk7CgovKgojaWYgIWRlZmluZWQoTk9BVVRPQ0FMTEJBQ0spCmV4dGVybiB2b2lkIFVTQkRDYWxsYmFja3NfUmVxdWVzdFJlY2VpdmVkKGNvbnN0IFVTQkdlbmVyaWNSZXF1ZXN0ICpyZXF1ZXN0KTsKI2VuZGlmCiovCmV4dGVybiB2b2lkIENDSURfU21hcnRDYXJkUmVxdWVzdCggdm9pZCApOwpleHRlcm4gdm9pZCBDQ0lERHJpdmVyX0luaXRpYWxpemUoIHZvaWQgKTsKZXh0ZXJuIHVuc2lnbmVkIGNoYXIgQ0NJRF9SZWFkKHZvaWQgKnBCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZExlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZmVyQ2FsbGJhY2sgZkNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcEFyZ3VtZW50KTsKZXh0ZXJuIHVuc2lnbmVkIGNoYXIgQ0NJRF9Xcml0ZSh2b2lkICpwQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZmVyQ2FsbGJhY2sgZkNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBBcmd1bWVudCk7CmV4dGVybiB1bnNpZ25lZCBjaGFyIENDSURfSW5zZXJ0aW9uKCB2b2lkICk7CmV4dGVybiB1bnNpZ25lZCBjaGFyIENDSURfUmVtb3ZhbCggdm9pZCApOwoKI2VuZGlmIC8vI2lmbmRlZiBDQ0lEX0RSSVZFUl9ICgo=