LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiAgICAgICAgIEFUTUVMIE1pY3JvY29udHJvbGxlciBTb2Z0d2FyZSBTdXBwb3J0IAogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIENvcHlyaWdodCAoYykgMjAwOCwgQXRtZWwgQ29ycG9yYXRpb24KICoKICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgogKgogKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKICogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBkaXNjbGFpbWVyIGJlbG93LgogKgogKiBBdG1lbCdzIG5hbWUgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KICoKICogRElTQ0xBSU1FUjogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBVE1FTCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUgogKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQgQVJFCiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFUTUVMIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCiAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsCiAqIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLAogKiBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIFx1bml0Ci8vLwovLy8gIVB1cnBvc2UKLy8vCi8vLyBEZWZpbml0aW9uIG9mIG1ldGhvZHMgZm9yIHVzaW5nIGEgQ0NJRCBkZXZpY2UgZHJpdmVyLgovLy8gCi8vLyAhVXNhZ2UKLy8vIAovLy8gLSMgQ0NJRERyaXZlcl9Jbml0aWFsaXplCi8vLyAtIyBDQ0lEX1JlYWQKLy8vIC0jIENDSURfV3JpdGUKLy8vIC0jIENDSURfU21hcnRDYXJkUmVxdWVzdAovLy8gLSMgQ0NJRF9JbnNlcnRpb24KLy8vIC0jIENDSURfUmVtb3ZhbAovLy8gLSMgUkRSdG9QQ0hhcmR3YXJlRXJyb3IKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiNpZm5kZWYgQ0NJRF9EUklWRVJfSAojZGVmaW5lIENDSURfRFJJVkVSX0gKCiNpbmNsdWRlICJVU0JELmgiCgovLy8gRm9yIHJlZmVyZW5jZSwgdGhlIGFic29sdXRlIG1heGltdW0gYmxvY2sgc2l6ZSAKLy8vIGZvciBhIFRQRFUgVD0wIGJsb2NrIGlzIDI2MCBieXRlcyAoNSBieXRlcyBjb21tYW5kOyAyNTUgYnl0ZXMgZGF0YSksIG9yIAovLy8gZm9yIGEgVFBEVSBUPTEgYmxvY2sgaXMgMjU5IGJ5dGVzLCBvciAKLy8vIGZvciBhIHNob3J0IEFQRFUgVD0xIGJsb2NrIGlzIDI2MSBieXRlcywgb3IgCi8vLyBmb3IgYW4gZXh0ZW5kZWQgQVBEVSBUPTEgYmxvY2sgaXMgNjU1NDQgYnl0ZXMuCiNkZWZpbmUgQUJEQVRBX1NJWkUgMjYwCgovLy8gZGVmaW5lIHByb3RvY29sIFQ9MAojZGVmaW5lIFBST1RPQ09MX1RPIDAKLy8vIGRlZmluZSBwcm90b2NvbCBUPTEKI2RlZmluZSBQUk9UT0NPTF9UMSAxCgovLy8gZGVmaW5lIGZvciBkd0ZlYXR1cmVzIHNlZSBUYWJsZSA1LjEtMSBTbWFydCBDYXJkIERldmljZSBDbGFzcyBEZXNjcmlwdG9ycwovLy8gTm8gc3BlY2lhbCBjaGFyYWN0ZXJpc3RpY3MKI2RlZmluZSBDQ0lEX0ZFQVRVUkVTX05BREEgICAgICAgMHgwMDAwMDAwMAovLy8gQXV0b21hdGljIHBhcmFtZXRlciBjb25maWd1cmF0aW9uIGJhc2VkIG9uIEFUUiBkYXRhCiNkZWZpbmUgQ0NJRF9GRUFUVVJFU19BVVRPX1BDT05GIDB4MDAwMDAwMDIKLy8vIEF1dG9tYXRpYyBhY3RpdmF0aW9uIG9mIElDQyBvbiBpbnNlcnRpbmcKI2RlZmluZSBDQ0lEX0ZFQVRVUkVTX0FVVE9fQUNUSVYgMHgwMDAwMDAwNCAKLy8vIEF1dG9tYXRpYyBJQ0Mgdm9sdGFnZSBzZWxlY3Rpb24KI2RlZmluZSBDQ0lEX0ZFQVRVUkVTX0FVVE9fVk9MVCAgMHgwMDAwMDAwOCAKLy8vIEF1dG9tYXRpYyBJQ0MgY2xvY2sgZnJlcXVlbmN5IGNoYW5nZSBhY2NvcmRpbmcgdG8gYWN0aXZlIHBhcmFtZXRlcnMgcHJvdmlkZWQgCi8vLyBieSB0aGUgSG9zdCBvciBzZWxmIGRldGVybWluZWQKI2RlZmluZSBDQ0lEX0ZFQVRVUkVTX0FVVE9fQ0xPQ0sgMHgwMDAwMDAxMCAKLy8vIEF1dG9tYXRpYyBiYXVkIHJhdGUgY2hhbmdlIGFjY29yZGluZyB0byBhY3RpdmUgcGFyYW1ldGVycyBwcm92aWRlZCBieSB0aGUgCi8vLyBIb3N0IG9yIHNlbGYgZGV0ZXJtaW5lZAojZGVmaW5lIENDSURfRkVBVFVSRVNfQVVUT19CQVVEICAweDAwMDAwMDIwIAovLy8gQXV0b21hdGljIHBhcmFtZXRlcnMgbmVnb3RpYXRpb24gbWFkZSBieSB0aGUgQ0NJRCAodXNlIG9mIHdhcm0gb3IgY29sZCAKLy8vIHJlc2V0cyBvciBQUFMgYWNjb3JkaW5nIHRvIGEgbWFudWZhY3R1cmVyIHByb3ByaWV0YXJ5IGFsZ29yaXRobSB0byBzZWxlY3QgCi8vLyB0aGUgY29tbXVuaWNhdGlvbiBwYXJhbWV0ZXJzIHdpdGggdGhlIElDQykKI2RlZmluZSBDQ0lEX0ZFQVRVUkVTX0FVVE9fUE5FR08gMHgwMDAwMDA0MCAKLy8vIEF1dG9tYXRpYyBQUFMgbWFkZSBieSB0aGUgQ0NJRCBhY2NvcmRpbmcgdG8gdGhlIGFjdGl2ZSBwYXJhbWV0ZXJzCiNkZWZpbmUgQ0NJRF9GRUFUVVJFU19BVVRPX1BQUyAgIDB4MDAwMDAwODAgCi8vLyBDQ0lEIGNhbiBzZXQgSUNDIGluIGNsb2NrIHN0b3AgbW9kZQojZGVmaW5lIENDSURfRkVBVFVSRVNfSUNDU1RPUCAgICAweDAwMDAwMTAwIAovLy8gTkFEIHZhbHVlIG90aGVyIHRoYW4gMDAgYWNjZXB0ZWQgKFQ9MSBwcm90b2NvbCBpbiB1c2UpCiNkZWZpbmUgQ0NJRF9GRUFUVVJFU19OQUQgICAgICAgIDB4MDAwMDAyMDAgCi8vLyBBdXRvbWF0aWMgSUZTRCBleGNoYW5nZSBhcyBmaXJzdCBleGNoYW5nZSAoVD0xIHByb3RvY29sIGluIHVzZSkKI2RlZmluZSBDQ0lEX0ZFQVRVUkVTX0FVVE9fSUZTRCAgMHgwMDAwMDQwMCAKLy8vIFRQRFUgbGV2ZWwgZXhjaGFuZ2VzIHdpdGggQ0NJRAojZGVmaW5lIENDSURfRkVBVFVSRVNfRVhDX1RQRFUgICAweDAwMDEwMDAwIAovLy8gU2hvcnQgQVBEVSBsZXZlbCBleGNoYW5nZSB3aXRoIENDSUQKI2RlZmluZSBDQ0lEX0ZFQVRVUkVTX0VYQ19TQVBEVSAgMHgwMDAyMDAwMCAKLy8vIFNob3J0IGFuZCBFeHRlbmRlZCBBUERVIGxldmVsIGV4Y2hhbmdlIHdpdGggQ0NJRAojZGVmaW5lIENDSURfRkVBVFVSRVNfRVhDX0FQRFUgICAweDAwMDQwMDAwIAovLy8gVVNCIFdha2UgdXAgc2lnbmFsaW5nIHN1cHBvcnRlZCBvbiBjYXJkIGluc2VydGlvbiBhbmQgcmVtb3ZhbAojZGVmaW5lIENDSURfRkVBVFVSRVNfV0FLRVVQICAgICAweDAwMTAwMDAwIAoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gICAgICAgICBUeXBlcwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8vIEJ1bGsgQ0NJRCBNZXNzYWdlIGhlYWRlciBzdHJ1Y3R1cmUKdHlwZWRlZiBzdHJ1Y3QKewogICB1bnNpZ25lZCBjaGFyIGJNZXNzYWdlVHlwZTsKICAgLy8vIE1lc3NhZ2Utc3BlY2lmaWMgZGF0YSBsZW5ndGgKICAgdW5zaWduZWQgbG9uZyB3TGVuZ3RoOwogICAvLy8gSWRlbnRpZmllcyB0aGUgc2xvdCBudW1iZXIgZm9yIHRoaXMgY29tbWFuZAogICB1bnNpZ25lZCBjaGFyIGJTbG90OwogICAvLy8gU2VxdWVuY2UgbnVtYmVyIGZvciBjb21tYW5kLgogICB1bnNpZ25lZCBjaGFyIGJTZXE7CiAgIC8vLyBTbG90IHN0YXR1cyByZWdpc3RlcgogICB1bnNpZ25lZCBjaGFyIGJTdGF0dXM7CiAgIC8vLyBTbG90IGVycm9yCiAgIHVuc2lnbmVkIGNoYXIgYkVycm9yOwogICAvLy8gc3BlY2lmaWMgcmVnaXN0ZXIKICAgdW5zaWduZWQgY2hhciBiU3BlY2lmaWM7CiAgIC8vLyBEYXRhIGJsb2NrIHNlbnQgdG8gdGhlIENDSUQuCiAgIHVuc2lnbmVkIGNoYXIgYWJEYXRhW0FCREFUQV9TSVpFXTsKICAgdW5zaWduZWQgY2hhciBiU2l6ZVRvU2VuZDsKfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgU19jY2lkX2J1bGtfaW5faGVhZGVyOwoKLy8vIDYuMSBCdWxrIFRyYW5zZmVycwp0eXBlZGVmIHN0cnVjdAp7CiAgIHVuc2lnbmVkIGNoYXIgYk1lc3NhZ2VUeXBlOwogICAvLy8gTWVzc2FnZS1zcGVjaWZpYyBkYXRhIGxlbmd0aAogICB1bnNpZ25lZCBsb25nIHdMZW5ndGg7CiAgIC8vLyBJZGVudGlmaWVzIHRoZSBzbG90IG51bWJlciBmb3IgdGhpcyBjb21tYW5kCiAgIHVuc2lnbmVkIGNoYXIgYlNsb3Q7CiAgIC8vLyBTZXF1ZW5jZSBudW1iZXIgZm9yIGNvbW1hbmQuCiAgIHVuc2lnbmVkIGNoYXIgYlNlcTsKICAgLy8vIHNwZWNpZmljIHJlZ2lzdGVyCiAgIHVuc2lnbmVkIGNoYXIgYlNwZWNpZmljXzA7CiAgIHVuc2lnbmVkIGNoYXIgYlNwZWNpZmljXzE7CiAgIHVuc2lnbmVkIGNoYXIgYlNwZWNpZmljXzI7CiAgIC8vLyBBcHBsaWNhdGlvbiBQcm90b2NvbCBEYXRhIFVuaXQKICAgdW5zaWduZWQgY2hhciBBUERVW0FCREFUQV9TSVpFXTsKfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgU19jY2lkX2J1bGtfb3V0X2hlYWRlcjsKCgovLy8gNi4xLjExLjIgUElOIFZlcmlmaWNhdGlvbiBEYXRhIFN0cnVjdHVyZQp0eXBlZGVmIHN0cnVjdAp7CiAgICAvLy8gTnVtYmVyIG9mIHNlY29uZHMuCiAgICB1bnNpZ25lZCBjaGFyIGJUaW1lck91dDsKICAgIC8vLyBTZXZlcmFsIHBhcmFtZXRlcnMgZm9yIHRoZSBQSU4gZm9ybWF0IG9wdGlvbnMKICAgIHVuc2lnbmVkIGNoYXIgYm1Gb3JtYXRTdHJpbmc7CiAgICAvLy8gRGVmaW5lIHRoZSBsZW5ndGggb2YgdGhlIFBJTiB0byBwcmVzZW50IGluIHRoZSBBUERVIGNvbW1hbmQKICAgIHVuc2lnbmVkIGNoYXIgYm1QSU5CbG9ja1N0cmluZzsKICAgIC8vLyBBbGxvd3MgdGhlIGxlbmd0aCBQSU4gaW5zZXJ0aW9uIGluIHRoZSBBUERVIGNvbW1hbmQKICAgIHVuc2lnbmVkIGNoYXIgYm1QSU5MZW5ndGhGb3JtYXQ7CiAgICAvLy8gTWluaW11bSBQSU4gc2l6ZSBpbiBkaWdpdCBhbmQgTWF4aW11bSBQSU4gc2l6ZSBpbiBkaWdpdAogICAgdW5zaWduZWQgY2hhciB3UElOTWF4RXh0cmFEaWdpdDsKICAgIC8vLyBUaGUgdmFsdWUgaXMgYSBiaXQgd2lzZSBPUiBvcGVyYXRpb24uCiAgICB1bnNpZ25lZCBjaGFyIGJFbnRyeVZhbGlkYXRpb25Db25kaXRpb247CiAgICAvLy8gTnVtYmVyIG9mIG1lc3NhZ2VzIHRvIGRpc3BsYXkgZm9yIHRoZSBQSU4gbW9kaWZ5IGNvbW1hbmQKICAgIHVuc2lnbmVkIGNoYXIgYk51bWJlck1lc3NhZ2U7CiAgICAvLy8gTGFuZ3VhZ2UgdXNlZCB0byBkaXNwbGF5IHRoZSBtZXNzYWdlcy4KICAgIHVuc2lnbmVkIGNoYXIgd0xhbmdJZDsKICAgIC8vLyBNZXNzYWdlIGluZGV4IGluIHRoZSBSZWFkZXIgbWVzc2FnZSB0YWJsZQogICAgdW5zaWduZWQgY2hhciBiTXNnSW5kZXg7CiAgICAvLy8gVD0xIEktYmxvY2sgcHJvbG9ndWUgZmllbGQgdG8gdXNlCiAgICB1bnNpZ25lZCBjaGFyIGJUZW9Qcm9sb2d1ZVszXTsKICAgIC8vLyBBUERVIHRvIHNlbmQgdG8gdGhlIElDQwogICAgdW5zaWduZWQgY2hhciBhYlBJTkFwZHVbMjU1XTsKfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBTX2NjaWRfUElOX1ZlcmlmaWNhdGlvbjsKCgovLy8gNi4xLjExLjcgUElOIE1vZGlmaWNhdGlvbiBEYXRhIFN0cnVjdHVyZQp0eXBlZGVmIHN0cnVjdAp7CiAgICAvLy8gTnVtYmVyIG9mIHNlY29uZHMuIElmIDAwaCB0aGVuIENDSUQgZGVmYXVsdCB2YWx1ZSBpcyB1c2VkLgogICAgdW5zaWduZWQgY2hhciBiVGltZU91dDsKICAgIC8vLyBTZXZlcmFsIHBhcmFtZXRlcnMgZm9yIHRoZSBQSU4gZm9ybWF0IG9wdGlvbnMgKGRlZmluZWQgaW4gpyA2LjEuMTEuNCkKICAgIHVuc2lnbmVkIGNoYXIgYm1Gb3JtYXRTdHJpbmc0OwogICAgLy8vIERlZmluZSB0aGUgbGVuZ3RoIG9mIHRoZSBQSU4gdG8gcHJlc2VudCBpbiB0aGUgQVBEVSBjb21tYW5kCiAgICB1bnNpZ25lZCBjaGFyIGJtUElOQmxvY2tTdHJpbmc7CiAgICAvLy8gQWxsb3dzIHRoZSBsZW5ndGggUElOIGluc2VydGlvbiBpbiB0aGUgQVBEVSBjb21tYW5kIChkZWZpbmVkIGluIKcgNi4xLjExLjYpCiAgICB1bnNpZ25lZCBjaGFyIGJtUGluTGVuZ3RoRm9ybWF0OwogICAgLy8vIEluc2VydGlvbiBwb3NpdGlvbiBvZmZzZXQgaW4gYnl0ZSBmb3IgdGhlIGN1cnJlbnQgUElOCiAgICB1bnNpZ25lZCBjaGFyIGJJbnNlcnRpb25PZmZzZXRPbGQ7CiAgICAvLy8gSW5zZXJ0aW9uIHBvc2l0aW9uIG9mZnNldCBpbiBieXRlIGZvciB0aGUgbmV3IFBJTgogICAgdW5zaWduZWQgY2hhciBiSW5zZXJ0aW9uT2Zmc2V0TmV3OwogICAgLy8vIFhYWVloCiAgICAvLy8gWFg6IE1pbmltdW0gUElOIHNpemUgaW4gZGlnaXQKICAgIC8vLyBZWTogTWF4aW11bSBQSU4gc2l6ZSBpbiBkaWdpdAogICAgdW5zaWduZWQgY2hhciB3UElOTWF4RXh0cmFEaWdpdDsKICAgIC8vLyAwMGgsMDFoLDAyaCwwM2gKICAgIC8vLyBJbmRpY2F0ZXMgaWYgYSBjb25maXJtYXRpb24gaXMgcmVxdWVzdGVkIGJlZm9yZSBhY2NlcHRhbmNlIG9mIGEgbmV3IFBJTiAobWVhbmluZyB0aGF0IHRoZSB1c2VyIGhhcyB0byBlbnRlciB0aGlzIG5ldyBQSU4gdHdpY2UgYmVmb3JlIGl0IGlzIGFjY2VwdGVkKQogICAgLy8vIEluZGljYXRlcyBpZiB0aGUgY3VycmVudCBQSU4gbXVzdCBiZSBlbnRlcmVkIGFuZCBzZXQgaW4gdGhlIHNhbWUgQVBEVSBmaWVsZCBvZiBub3QuCiAgICB1bnNpZ25lZCBjaGFyIGJDb25maXJtUElOOwogICAgLy8vIFRoZSB2YWx1ZSBpcyBhIGJpdCB3aXNlIE9SIG9wZXJhdGlvbi4KICAgIC8vLyAwMWggTWF4IHNpemUgcmVhY2hlZAogICAgLy8vIDAyaCBWYWxpZGF0aW9uIGtleSBwcmVzc2VkCiAgICAvLy8gMDRoIFRpbWVvdXQgb2NjdXJyZWQKICAgIHVuc2lnbmVkIGNoYXIgYkVudHJ5VmFsaWRhdGlvbkNvbmRpdGlvbjsKICAgIC8vLyAwMGgsMDFoLDAyaCwwM2gsb3IgRkZoCiAgICAvLy8gTnVtYmVyIG9mIG1lc3NhZ2VzIHRvIGRpc3BsYXkgZm9yIHRoZSBQSU4gbW9kaWZ5IGNvbW1hbmQuCiAgICB1bnNpZ25lZCBjaGFyIGJOdW1iZXJNZXNzYWdlOwogICAgLy8vIExhbmd1YWdlIHVzZWQgdG8gZGlzcGxheSB0aGUgbWVzc2FnZXMuIFRoZSAxNiBiaXQKICAgIHVuc2lnbmVkIGNoYXIgd0xhbmdJZDsKICAgIC8vLyBNZXNzYWdlIGluZGV4IGluIHRoZSBSZWFkZXIgbWVzc2FnZSB0YWJsZSAoc2hvdWxkIGJlIDAwaCBvciAwMWgpLgogICAgdW5zaWduZWQgY2hhciBiTXNnSW5kZXgxOwogICAgLy8vIE1lc3NhZ2UgaW5kZXggaW4gdGhlIFJlYWRlciBtZXNzYWdlIHRhYmxlIChzaG91bGQgYmUgMDFoIG9yIDAyaCkuCiAgICB1bnNpZ25lZCBjaGFyIGJNc2dJbmRleDI7CiAgICAvLy8gTWVzc2FnZSBpbmRleCBpbiB0aGUgUmVhZGVyIG1lc3NhZ2UgdGFibGUgKHNob3VsZCBiZSAwMmgpLgogICAgdW5zaWduZWQgY2hhciBiTXNnSW5kZXgzOwogICAgLy8vIFQ9MSBJLWJsb2NrIHByb2xvZ3VlIGZpZWxkIHRvIHVzZS4gU2lnbmlmaWNhbnQgb25seSBpZiBwcm90b2NvbCBpbiB1c2UgaXMgVD0xLgogICAgdW5zaWduZWQgY2hhciBiVGVvUHJvbG9ndWVbM107CiAgICAvLy8gQnl0ZSBhcnJheSBBUERVIHRvIHNlbmQgdG8gdGhlIElDQwogICAgdW5zaWduZWQgY2hhciBhYlBJTkFwZHVbMjU1XTsKfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBTX2NjaWRfUElOX01vZGlmaWNhdGlvbjsKCi8vLyBQcm90b2NvbCBEYXRhIFN0cnVjdHVyZSBmb3IgUHJvdG9jb2wgVD0wIChiUHJvdG9jb2xOdW09MCwgZHdMZW5ndGg9MDAwMDAwMDVoKQp0eXBlZGVmIHN0cnVjdAp7CiAgICAvLy8gQjctNCCWIEZJIJYgSW5kZXggaW50byB0aGUgdGFibGUgNyBpbiBJU08vSUVDIDc4MTYtMzoxOTk3IHNlbGVjdGluZyBhIAogICAgLy8vIGNsb2NrIHJhdGUgY29udmVyc2lvbiBmYWN0b3IKICAgIC8vLyBCMy0wIJYgREkgLSBJbmRleCBpbnRvIHRoZSB0YWJsZSA4IGluIElTTy9JRUMgNzgxNi0zOjE5OTcgc2VsZWN0aW5nIGEgCiAgICAvLy8gYmF1ZCByYXRlIGNvbnZlcnNpb24gZmFjdG9yCiAgICB1bnNpZ25lZCBjaGFyIGJtRmluZGV4RGluZGV4OwogICAgLy8vIEZvciBUPTAgLEIwIJYgMGIsIEI3LTIgliAwMDAwMDBiCiAgICAvLy8gQjEgliBDb252ZW50aW9uIHVzZWQgKGIxPTAgZm9yIGRpcmVjdCwgYjE9MSBmb3IgaW52ZXJzZSkKICAgIHVuc2lnbmVkIGNoYXIgYm1UQ0NLU1QwOyAgICAgICAgIC8vIDAgdG8gMgogICAgLy8vIEV4dHJhIEd1YXJkdGltZSBiZXR3ZWVuIHR3byBjaGFyYWN0ZXJzLiBBZGQgMCB0byAyNTQgZXR1IHRvIHRoZSBub3JtYWwgCiAgICAvLy8gZ3VhcmR0aW1lIG9mIDEyZXR1LiBGRmggaXMgdGhlIHNhbWUgYXMgMDBoLgogICAgdW5zaWduZWQgY2hhciBiR3VhcmRUaW1lVDA7ICAgICAgLy8gMCB0byBGRgogICAgLy8vIFdJIGZvciBUPTAgdXNlZCB0byBkZWZpbmUgV1dUCiAgICB1bnNpZ25lZCBjaGFyIGJXYWl0aW5nSW50ZWdlclQwOyAvLyAwIHRvIEZGCiAgICAvLy8gSUNDIENsb2NrIFN0b3AgU3VwcG9ydAogICAgLy8vIDAwID0gU3RvcHBpbmcgdGhlIENsb2NrIGlzIG5vdCBhbGxvd2VkCiAgICAvLy8gMDEgPSBTdG9wIHdpdGggQ2xvY2sgc2lnbmFsIExvdwogICAgLy8vIDAyID0gU3RvcCB3aXRoIENsb2NrIHNpZ25hbCBIaWdoCiAgICAvLy8gMDMgPSBTdG9wIHdpdGggQ2xvY2sgZWl0aGVyIEhpZ2ggb3IgTG93CiAgICB1bnNpZ25lZCBjaGFyIGJDbG9ja1N0b3A7ICAgICAgICAvLyAwIHRvIDMKfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgU19jY2lkX3Byb3RvY29sX3QwOwoKCi8vLyBQcm90b2NvbCBEYXRhIFN0cnVjdHVyZSBmb3IgUHJvdG9jb2wgVD0xIChiUHJvdG9jb2xOdW09MSwgZHdMZW5ndGg9MDAwMDAwMDdoKQp0eXBlZGVmIHN0cnVjdAp7CiAgICAvLy8gQjctNCCWIEZJIJYgSW5kZXggaW50byB0aGUgdGFibGUgNyBpbiBJU08vSUVDIDc4MTYtMzoxOTk3IHNlbGVjdGluZyBhIAogICAgLy8vIGNsb2NrIHJhdGUgY29udmVyc2lvbiBmYWN0b3IKICAgIC8vLyBCMy0wIJYgREkgLSBJbmRleCBpbnRvIHRoZSB0YWJsZSA4IGluIElTTy9JRUMgNzgxNi0zOjE5OTcgc2VsZWN0aW5nIGEgCiAgICAvLy8gYmF1ZCByYXRlIGNvbnZlcnNpb24gZmFjdG9yCiAgICB1bnNpZ25lZCBjaGFyIGJtRmluZGV4RGluZGV4OwogICAgLy8vIEZvciBUPTEsIEI3LTIgliAwMDAxMDBiCiAgICAvLy8gQjAgliBDaGVja3N1bSB0eXBlIChiMD0wIGZvciBMUkMsIGIwPTEgZm9yIENSQwogICAgLy8vIEIxIJYgQ29udmVudGlvbiB1c2VkIChiMT0wIGZvciBkaXJlY3QsIGIxPTEgZm9yIGludmVyc2UpCiAgICB1bnNpZ25lZCBjaGFyIGJtVENDS1NUMTsgICAgICAgICAgIC8vIDEwaCwgMTFoLCAxMmgsIDEzaAogICAgLy8vIEV4dHJhIEd1YXJkdGltZSAoMCB0byAyNTQgZXR1IGJldHdlZW4gdHdvIGNoYXJhY3RlcnMpLiAKICAgIC8vLyBJZiB2YWx1ZSBpcyBGRmgsIHRoZW4gZ3VhcmR0aW1lIGlzIHJlZHVjZWQgYnkgMS4KICAgIHVuc2lnbmVkIGNoYXIgYkd1YXJkVGltZVQxOyAgICAgICAgLy8gMCB0byBGRgogICAgLy8vIEI3LTQgPSBCV0kKICAgIC8vLyBCMy0wID0gQ1dJCiAgICB1bnNpZ25lZCBjaGFyIGJtV2FpdGluZ0ludGVnZXJzVDE7IC8vIDAgdG8gOQogICAgLy8vIElDQyBDbG9jayBTdG9wIFN1cHBvcnQKICAgIC8vLyAwMCA9IFN0b3BwaW5nIHRoZSBDbG9jayBpcyBub3QgYWxsb3dlZAogICAgLy8vIDAxID0gU3RvcCB3aXRoIENsb2NrIHNpZ25hbCBMb3cKICAgIC8vLyAwMiA9IFN0b3Agd2l0aCBDbG9jayBzaWduYWwgSGlnaAogICAgLy8vIDAzID0gU3RvcCB3aXRoIENsb2NrIGVpdGhlciBIaWdoIG9yIExvdwogICAgdW5zaWduZWQgY2hhciBiQ2xvY2tTdG9wOyAgICAgICAgICAvLyAwIHRvIDMKICAgIC8vLyBTaXplIG9mIG5lZ290aWF0ZWQgSUZTQwogICAgdW5zaWduZWQgY2hhciBiSUZTQzsgICAgICAgICAgICAgICAvLyAwIHRvIEZFCiAgICAvLy8gTmFkIHZhbHVlIHVzZWQgYnkgQ0NJRAogICAgdW5zaWduZWQgY2hhciBiTmFkVmFsdWU7ICAgICAgICAgICAvLyAwIHRvIEZGCn0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIFNfY2NpZF9wcm90b2NvbF90MTsKCgovLy8gSWRlbnRpZmllcyB0aGUgbGVuZ3RoIG9mIHR5cGUgb2Ygc3Vib3JkaW5hdGUgZGVzY3JpcHRvcnMgb2YgYSBDQ0lEIGRldmljZQovLy8gVGFibGUgNS4xLTEgU21hcnQgQ2FyZCBEZXZpY2UgQ2xhc3MgZGVzY3JpcHRvcnMKdHlwZWRlZiBzdHJ1Y3QKewogICAvLy8gU2l6ZSBvZiB0aGlzIGRlc2NyaXB0b3IsIGluIGJ5dGVzLgogICB1bnNpZ25lZCBjaGFyICBiTGVuZ3RoOwogICAvLy8gRnVuY3Rpb25hbCBEZXNjcmlwdG9yIHR5cGUKICAgdW5zaWduZWQgY2hhciAgYkRlc2NyaXB0b3JUeXBlOwogICAvLy8gSW50ZWdyYXRlZCBDaXJjdWl0KHMpIENhcmRzIEludGVyZmFjZSBEZXZpY2VzIChDQ0lEKSBTcGVjaWZpY2F0aW9uIAogICAvLy8gUmVsZWFzZSBOdW1iZXIKICAgdW5zaWduZWQgc2hvcnQgYmNkQ0NJRDsKICAgLy8vIEluZGV4IG9mIHRoZSBoaWdoZXN0IGF2YWlsYWJsZSBzbG90LiBBbiBVU0ItSUNDIGlzIHJlZ2FyZGVkIGFzIGEgc2luZ2xlCiAgIC8vLyBzbG90IENDSUQuCiAgIHVuc2lnbmVkIGNoYXIgIGJNYXhTbG90SW5kZXg7CiAgIC8vLyBUaGlzIHZhbHVlIGluZGljYXRlcyB3aGF0IHZvbHRhZ2VzIHRoZSBDQ0lEIGNhbiBzdXBwbHkgdG8gaXRzIHNsb3RzLgogICAvLy8gSXQgaXMgYSBiaXR3aXNlIE9SIG9wZXJhdGlvbiBwZXJmb3JtZWQgb24gdGhlIGZvbGxvd2luZyB2YWx1ZXM6CiAgIC8vLyAtIDAxaCA1LjBWCiAgIC8vLyAtIDAyaCAzLjBWCiAgIC8vLyAtIDA0aCAxLjhWCiAgIC8vLyBPdGhlciBiaXRzIGFyZSBSRlUuCiAgIHVuc2lnbmVkIGNoYXIgIGJWb2x0YWdlU3VwcG9ydDsKICAgLy8vIFJSUlIgllVwcGVyIFdvcmQtIGlzIFJGVSA9IDAwMDBoCiAgIC8vLyBQUFBQIJZMb3dlciBXb3JkLSBFbmNvZGVzIHRoZSBzdXBwb3J0ZWQgcHJvdG9jb2wgdHlwZXMuIEEgkTGSIGluIGEgZ2l2ZW4KICAgLy8vIGJpdCBwb3NpdGlvbiBpbmRpY2F0ZXMgc3VwcG9ydCBmb3IgdGhlIGFzc29jaWF0ZWQgSVNPIHByb3RvY29sLgogICAvLy8gMDAwMWggPSBQcm90b2NvbCBUPTAKICAgLy8vIDAwMDJoID0gUHJvdG9jb2wgVD0xCiAgIC8vLyBBbGwgb3RoZXIgYml0cyBhcmUgcmVzZXJ2ZWQgYW5kIG11c3QgYmUgc2V0IHRvIHplcm8uIFRoZSBmaWVsZCBpcyAKICAgLy8vIGludGVuZGVkIHRvIGNvcnJlc3BvbmQgdG8gdGhlIFBDU0Mgc3BlY2lmaWNhdGlvbiBkZWZpbml0aW9ucy4gCiAgIHVuc2lnbmVkIGxvbmcgIGR3UHJvdG9jb2xzOwogICAvLy8gRGVmYXVsdCBJQ0MgY2xvY2sgZnJlcXVlbmN5IGluIEtIei4gVGhpcyBpcyBhbiBpbnRlZ2VyIHZhbHVlLgogICB1bnNpZ25lZCBsb25nICBkd0RlZmF1bHRDbG9jazsKICAgLy8vIE1heGltdW0gc3VwcG9ydGVkIElDQyBjbG9jayBmcmVxdWVuY3kgaW4gS0h6LiBUaGlzIGlzIGFuIGludGVnZXIgdmFsdWUuCiAgIHVuc2lnbmVkIGxvbmcgIGR3TWF4aW11bUNsb2NrOwogICAvLy8gVGhlIG51bWJlciBvZiBjbG9jayBmcmVxdWVuY2llcyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgdGhlIENDSUQuIElmIHRoZSAKICAgLy8vIHZhbHVlIGlzIDAwaCwgdGhlIHN1cHBvcnRlZCBjbG9jayBmcmVxdWVuY2llcyBhcmUgYXNzdW1lZCB0byBiZSB0aGUgCiAgIC8vLyBkZWZhdWx0IGNsb2NrIGZyZXF1ZW5jeSBkZWZpbmVkIGJ5IGR3RGVmYXVsdENsb2NrIGFuZCB0aGUgbWF4aW11bSBjbG9jayAKICAgLy8vIGZyZXF1ZW5jeSBkZWZpbmVkIGJ5IGR3TWF4aW11bUNsb2NrLgogICB1bnNpZ25lZCBjaGFyICBiTnVtQ2xvY2tTdXBwb3J0ZWQ7CiAgIC8vLyBEZWZhdWx0IElDQyBJL08gZGF0YSByYXRlIGluIGJwcy4gVGhpcyBpcyBhbiBpbnRlZ2VyIHZhbHVlCiAgIHVuc2lnbmVkIGxvbmcgIGR3RGF0YVJhdGU7CiAgIC8vLyBNYXhpbXVtIHN1cHBvcnRlZCBJQ0MgSS9PIGRhdGEgcmF0ZSBpbiBicHMKICAgdW5zaWduZWQgbG9uZyAgZHdNYXhEYXRhUmF0ZTsKICAgLy8vIFRoZSBudW1iZXIgb2YgZGF0YSByYXRlcyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgdGhlIENDSUQuCiAgIHVuc2lnbmVkIGNoYXIgIGJOdW1EYXRhUmF0ZXNTdXBwb3J0ZWQ7CiAgIC8vLyBJbmRpY2F0ZXMgdGhlIG1heGltdW0gSUZTRCBzdXBwb3J0ZWQgYnkgQ0NJRCBmb3IgcHJvdG9jb2wgVD0xLgogICB1bnNpZ25lZCBsb25nICBkd01heElGU0Q7CiAgIC8vLyAtIFJSUlItVXBwZXIgV29yZC0gaXMgUkZVID0gMDAwMGgKICAgLy8vIC0gUFBQUC1Mb3dlciBXb3JkLSBlbmNvZGVzIHRoZSBzdXBwb3J0ZWQgcHJvdG9jb2wgdHlwZXMuIEEgkTGSIGluIGEgZ2l2ZW4KICAgLy8vICAgYml0IHBvc2l0aW9uIGluZGljYXRlcyBzdXBwb3J0IGZvciB0aGUgYXNzb2NpYXRlZCBwcm90b2NvbC4KICAgLy8vICAgMDAwMWggaW5kaWNhdGVzIHN1cHBvcnQgZm9yIHRoZSAyLXdpcmUgcHJvdG9jb2wgMQogICAvLy8gICAwMDAyaCBpbmRpY2F0ZXMgc3VwcG9ydCBmb3IgdGhlIDMtd2lyZSBwcm90b2NvbCAxCiAgIC8vLyAgIDAwMDRoIGluZGljYXRlcyBzdXBwb3J0IGZvciB0aGUgSTJDIHByb3RvY29sIDEKICAgLy8vIEFsbCBvdGhlciB2YWx1ZXMgYXJlIG91dHNpZGUgb2YgdGhpcyBzcGVjaWZpY2F0aW9uLCBhbmQgbXVzdCBiZSBoYW5kbGVkIAogICAvLy8gYnkgdmVuZG9yLXN1cHBsaWVkIGRyaXZlcnMuCiAgIHVuc2lnbmVkIGxvbmcgIGR3U3luY2hQcm90b2NvbHM7CiAgIC8vLyBUaGUgdmFsdWUgaXMgYSBiaXR3aXNlIE9SIG9wZXJhdGlvbiBwZXJmb3JtZWQgb24gdGhlIGZvbGxvd2luZyB2YWx1ZXM6CiAgIC8vLyAtIDAwMDAwMDAwaCBObyBzcGVjaWFsIGNoYXJhY3RlcmlzdGljcwogICAvLy8gLSAwMDAwMDAwMWggQ2FyZCBhY2NlcHQgbWVjaGFuaXNtIDIKICAgLy8vIC0gMDAwMDAwMDJoIENhcmQgZWplY3Rpb24gbWVjaGFuaXNtIDIKICAgLy8vIC0gMDAwMDAwMDRoIENhcmQgY2FwdHVyZSBtZWNoYW5pc20gMgogICAvLy8gLSAwMDAwMDAwOGggQ2FyZCBsb2NrL3VubG9jayBtZWNoYW5pc20KICAgdW5zaWduZWQgbG9uZyAgZHdNZWNoYW5pY2FsOwogICAvLy8gVGhpcyB2YWx1ZSBpbmRpY2F0ZXMgd2hhdCBpbnRlbGxpZ2VudCBmZWF0dXJlcyB0aGUgQ0NJRCBoYXMuCiAgIHVuc2lnbmVkIGxvbmcgIGR3RmVhdHVyZXM7CiAgIC8vLyBGb3IgZXh0ZW5kZWQgQVBEVSBsZXZlbCB0aGUgdmFsdWUgc2hhbGwgYmUgYmV0d2VlbiAyNjEgKyAxMCAoaGVhZGVyKSBhbmQgCiAgIC8vLyA2NTU0NCArMTAsIG90aGVyd2lzZSB0aGUgbWluaW11bSB2YWx1ZSBpcyB0aGUgd01heFBhY2tldFNpemUgb2YgdGhlIAogICAvLy8gQnVsay1PVVQgZW5kcG9pbnQuCiAgIHVuc2lnbmVkIGxvbmcgIGR3TWF4Q0NJRE1lc3NhZ2VMZW5ndGg7CiAgIC8vLyBTaWduaWZpY2FudCBvbmx5IGZvciBDQ0lEIHRoYXQgb2ZmZXJzIGFuIEFQRFUgbGV2ZWwgZm9yIGV4Y2hhbmdlcy4KICAgdW5zaWduZWQgY2hhciAgYkNsYXNzR2V0UmVzcG9uc2U7CiAgIC8vLyBTaWduaWZpY2FudCBvbmx5IGZvciBDQ0lEIHRoYXQgb2ZmZXJzIGFuIGV4dGVuZGVkIEFQRFUgbGV2ZWwgZm9yIGV4Y2hhbmdlcy4KICAgdW5zaWduZWQgY2hhciAgYkNsYXNzRW52ZWxvcGU7CiAgIC8vLyBOdW1iZXIgb2YgbGluZXMgYW5kIGNoYXJhY3RlcnMgZm9yIHRoZSBMQ0QgZGlzcGxheSB1c2VkIHRvIHNlbmQgbWVzc2FnZXMgZm9yIFBJTiBlbnRyeS4KICAgdW5zaWduZWQgc2hvcnQgd0xjZExheW91dDsKICAgLy8vIFRoaXMgdmFsdWUgaW5kaWNhdGVzIHdoYXQgUElOIHN1cHBvcnQgZmVhdHVyZXMgdGhlIENDSUQgaGFzLgogICB1bnNpZ25lZCBjaGFyICBiUElOU3VwcG9ydDsKICAgLy8vIE1heGltdW0gbnVtYmVyIG9mIHNsb3RzIHdoaWNoIGNhbiBiZSBzaW11bHRhbmVvdXNseSBidXN5LgogICB1bnNpZ25lZCBjaGFyICBiTWF4Q0NJREJ1c3lTbG90czsKCn0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIENDSUREZXNjcmlwdG9yOwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gICAgICAgICBFeHBvcnRlZCBmdW5jdGlvbnMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmV4dGVybiB1bnNpZ25lZCBjaGFyIFJEUnRvUENIYXJkd2FyZUVycm9yKCB1bnNpZ25lZCBjaGFyIGJTbG90LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYlNlcSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGJIYXJkd2FyZUVycm9yQ29kZSApOwoKLyoKI2lmICFkZWZpbmVkKE5PQVVUT0NBTExCQUNLKQpleHRlcm4gdm9pZCBVU0JEQ2FsbGJhY2tzX1JlcXVlc3RSZWNlaXZlZChjb25zdCBVU0JHZW5lcmljUmVxdWVzdCAqcmVxdWVzdCk7CiNlbmRpZgoqLwpleHRlcm4gdm9pZCBDQ0lEX1NtYXJ0Q2FyZFJlcXVlc3QoIHZvaWQgKTsKZXh0ZXJuIHZvaWQgQ0NJRERyaXZlcl9Jbml0aWFsaXplKCB2b2lkICk7CmV4dGVybiB1bnNpZ25lZCBjaGFyIENDSURfUmVhZCh2b2lkICpwQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2ZlckNhbGxiYWNrIGZDYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBBcmd1bWVudCk7CmV4dGVybiB1bnNpZ25lZCBjaGFyIENDSURfV3JpdGUodm9pZCAqcEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZExlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2ZlckNhbGxiYWNrIGZDYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwQXJndW1lbnQpOwpleHRlcm4gdW5zaWduZWQgY2hhciBDQ0lEX0luc2VydGlvbiggdm9pZCApOwpleHRlcm4gdW5zaWduZWQgY2hhciBDQ0lEX1JlbW92YWwoIHZvaWQgKTsKCiNlbmRpZiAvLyNpZm5kZWYgQ0NJRF9EUklWRVJfSAoK