LyoKICogTkRBIEFORCBORUVELVRPLUtOT1cgUkVRVUlSRUQKICoKICogQ29weXJpZ2h0IKkgMjAxMy0yMDE4IFN5bmFwdGljcyBJbmNvcnBvcmF0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFRoaXMgZmlsZSBjb250YWlucyBpbmZvcm1hdGlvbiB0aGF0IGlzIHByb3ByaWV0YXJ5IHRvIFN5bmFwdGljcwogKiBJbmNvcnBvcmF0ZWQgKCJTeW5hcHRpY3MiKS4gVGhlIGhvbGRlciBvZiB0aGlzIGZpbGUgc2hhbGwgdHJlYXQgYWxsCiAqIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBoZXJlaW4gYXMgY29uZmlkZW50aWFsLCBzaGFsbCB1c2UgdGhlCiAqIGluZm9ybWF0aW9uIG9ubHkgZm9yIGl0cyBpbnRlbmRlZCBwdXJwb3NlLCBhbmQgc2hhbGwgbm90IGR1cGxpY2F0ZSwKICogZGlzY2xvc2UsIG9yIGRpc3NlbWluYXRlIGFueSBvZiB0aGlzIGluZm9ybWF0aW9uIGluIGFueSBtYW5uZXIKICogdW5sZXNzIFN5bmFwdGljcyBoYXMgb3RoZXJ3aXNlIHByb3ZpZGVkIGV4cHJlc3MsIHdyaXR0ZW4KICogcGVybWlzc2lvbi4KICoKICogVXNlIG9mIHRoZSBtYXRlcmlhbHMgbWF5IHJlcXVpcmUgYSBsaWNlbnNlIG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eQogKiBmcm9tIGEgdGhpcmQgcGFydHkgb3IgZnJvbSBTeW5hcHRpY3MuIFRoaXMgZmlsZSBjb252ZXlzIG5vIGV4cHJlc3MKICogb3IgaW1wbGllZCBsaWNlbnNlcyB0byBhbnkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBiZWxvbmdpbmcKICogdG8gU3luYXB0aWNzLgogKgogKiBJTkZPUk1BVElPTiBDT05UQUlORUQgSU4gVEhJUyBET0NVTUVOVCBJUyBQUk9WSURFRCAiQVMtSVMsIiBBTkQKICogU1lOQVBUSUNTIEVYUFJFU1NMWSBESVNDTEFJTVMgQUxMIEVYUFJFU1MgQU5EIElNUExJRUQgV0FSUkFOVElFUywKICogSU5DTFVESU5HIEFOWSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgogKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgQU5EIEFOWSBXQVJSQU5USUVTIE9GIE5PTi1JTkZSSU5HRU1FTlQgT0YgQU5ZCiAqIElOVEVMTEVDVFVBTCBQUk9QRVJUWSBSSUdIVFMuIElOIE5PIEVWRU5UIFNIQUxMIFNZTkFQVElDUyBCRSBMSUFCTEUKICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBQVU5JVElWRSwgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFCiAqIE9GIFRIRSBJTkZPUk1BVElPTiBDT05UQUlORUQgSU4gVEhJUyBET0NVTUVOVCwgSE9XRVZFUiBDQVVTRUQgQU5ECiAqIEJBU0VEIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKICogTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFORCBFVkVOIElGIFNZTkFQVElDUyBXQVMKICogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIElGIEEgVFJJQlVOQUwgT0YKICogQ09NUEVURU5UIEpVUklTRElDVElPTiBET0VTIE5PVCBQRVJNSVQgVEhFIERJU0NMQUlNRVIgT0YgRElSRUNUCiAqIERBTUFHRVMgT1IgQU5ZIE9USEVSIERBTUFHRVMsIFNZTkFQVElDUycgVE9UQUwgQ1VNVUxBVElWRSBMSUFCSUxJVFkKICogVE8gQU5ZIFBBUlRZIFNIQUxMIE5PVCBFWENFRUQgT05FIEhVTkRSRUQgVS5TLiBET0xMQVJTLgogKi8KLy8jaW5jbHVkZSAiZGlhZ19jb21tb24uaCIKLy8jaW5jbHVkZSAiZGlhZ19jb25zb2xlLmgiCi8vI2luY2x1ZGUgImRpYWdfbWlzYy5oIgojaW5jbHVkZSAiY29tX3R5cGVfbG9jYWwuaCIKI2luY2x1ZGUgInByaW50Zi5oIgojaW5jbHVkZSAiZGVidWcuaCIKI2luY2x1ZGUgInN0cmluZy5oIgojaW5jbHVkZSAiaW8uaCIKCi8vI2luY2x1ZGUgImdpYy5oIgojaW5jbHVkZSAiR2Fsb2lzX21lbW1hcC5oIgojaW5jbHVkZSAiZ2xvYmFsLmgiCiNpbmNsdWRlICJzb2MuaCIKI2luY2x1ZGUgImlycS5oIgoKI2lmZGVmIENPTkZJR19EQ0FDSEUKI2luY2x1ZGUgImNhY2hlLmgiCiNlbmRpZgojaW5jbHVkZSAic2RtbWNfYXBpLmgiCiNpZmRlZiBfX1NESU9fSU5UX01PREVfXwojaW5jbHVkZSAiZ2ljX2RpYWcuaCIKI2VuZGlmIC8vX19TRElPX0lOVF9NT0RFX18KCiNpbmNsdWRlICJlbW1jSEMuaCIKI2luY2x1ZGUgImVtbWNEaWFnLmgiCgoKLy8jZGVmaW5lIERFQlVHX1BSTgojaWZkZWYgREVCVUdfUFJOCiNkZWZpbmUgRU1NQ19QUk4oUFJOX0xFVkVMLGZtdCwgYXJncy4uLikgZGJnX3ByaW50ZihQUk5fTEVWRUwsIGZtdCwgIyMgYXJncykKI2Vsc2UKI2RlZmluZSBFTU1DX1BSTihQUk5fTEVWRUwsZm10LCBhcmdzLi4uKSBkb3t9d2hpbGUoMCkKI2VuZGlmCgojZGVmaW5lIEVNTUNfUkVHX0JBU0UgCShNRU1NQVBfRU1NQ19SRUdfQkFTRSkKCiNkZWZpbmUgaHRvYmUxNih4KSAgICAgICgoeCYweDAwZmYpIDw8IDggfCAoeCYweGZmMDApID4+IDgpCiNkZWZpbmUgaHRvYmUzMih4KSAgICAgICgoeCYweDAwMDAwMGZmKSA8PCAyNCB8ICh4JjB4MDAwMGZmMDApIDw8IDggXAoJCXwgKHgmMHgwMGZmMDAwMCkgPj4gOCB8ICh4JjB4ZmYwMDAwMDApID4+IDI0KQoKc3RhdGljIFNETU1DX1Byb3BlcnRpZXNfVCBFTU1DX1Byb3A7CS8vIGZvciBlbW1jCnN0YXRpYyBQX01NNF9TRE1NQ19UIHBFTU1DQ1RSTDsKc3RhdGljIE1NNF9TRE1NQ19DT05URVhUX1QgRU1NQ0NvbnRleHQ7CgoKaW50IGdfQURNQV93ciA9IDA7CmludCBnX0FETUFfcmQgPSAwOwp1bnNpZ25lZCBpbnQgZ19kZXZpY2Vfc2VjdG9yX2NvdW50ID0gMDsKdW5zaWduZWQgaW50IGdfbWFudWZhY3R1cmVySUQgPSAwOwp1bnNpZ25lZCBpbnQgZ19zZXJpYWxOdW07Cgp1bnNpZ25lZCBpbnQgcnBtYlBhcnRfc2VjdG9yX2NvdW50ID0gMDsKdW5zaWduZWQgaW50IGdfZW1tY19XUF9pbmZvPTA7Ly9ieXRlWzNdPUNTRFsxM10sYnl0ZVsyXT1DU0RbMTJdLGJ5dGVbMV09RVhUX0NTRFsxNzNdLGJ5dGVbMF09RVhUX0NTRFsxNzFdCnN0YXRpYyBpbnQgYXV0b2NtZDEyID0gMDsKCi8vI2RlZmluZSBWRUxPQ0VfUExBVAojaWZkZWYgVkVMT0NFX1BMQVQKI2RlZmluZSBQTEFURk9STSBWRUxPQ0UKI2VuZGlmCgp2b2lkIEVNTUNfR2V0X0NTRChQX1NETU1DX1Byb3BlcnRpZXNfVCBwU0RNTUNQKTsKdm9pZCBFTU1DX0dldF9DSUQoUF9TRE1NQ19Qcm9wZXJ0aWVzX1QgcFNETU1DUCk7ClVJTlRfVCBFTU1DX1N3aXRjaF9IUyhQX1NETU1DX1Byb3BlcnRpZXNfVCBwU0RNTUNQKTsKCiNpZiAwCnZvaWQgZW1tY19JbnRyX09mZih2b2lkKQp7CiNpZmRlZiBfX1NESU9fSU5UX01PREVfXwogICAgZGlhZ19HSUNTZXRJbnQoZ2V0TVBpZCgpLCBNUF9CRVJMSU5fSU5UUl9JRChJUlFfZW1tY19pbnQpLCBJTlRfRElTQUJMRSk7CiNlbmRpZgkJLy8gX19TRElPX0lOVF9NT0RFX18KfQojZW5kaWYKClBfU0RNTUNfUHJvcGVydGllc19UIEVNTUNfR2V0UHJvcGVydGllcyh2b2lkKQp7CiAgICByZXR1cm4gJkVNTUNfUHJvcDsKfQoKdm9pZCBFTU1DX1NldHVwUHJvcCh2b2lkKQp7CgoJUF9TRE1NQ19Qcm9wZXJ0aWVzX1QgcFNETU1DUCA9IEVNTUNfR2V0UHJvcGVydGllcygpOwoJcFNETU1DUC0+cENvbnRleHQgPSAmKEVNTUNDb250ZXh0KTsKCVBfTU00X1NETU1DX0NPTlRFWFRfVCBwU0RDWFQgPSAoUF9NTTRfU0RNTUNfQ09OVEVYVF9UKXBTRE1NQ1AtPnBDb250ZXh0OwoKCXBFTU1DQ1RSTCA9IChQX01NNF9TRE1NQ19UKUVNTUNfUkVHX0JBU0U7CglFTU1DX1BSTihQUk5fSU5GTywgInBFTU1DQ1RSTFswXSBpcyAleFxuICIsKHVpbnRwdHJfdClwRU1NQ0NUUkwgKTsKCglwU0RDWFQtPnBNTUM0UmVnPShQX01NNF9TRE1NQ19UKXBFTU1DQ1RSTDsvLyBQb2ludGVyIHRvIE1NQyBjb250cm9sIHJlZ2lzdGVycwoJcFNETU1DUC0+U3RhdGU9VU5JTklUSUFMSVpFRDsJCQkJLy8gSW5kaWNhdGUgU3RhdGUgb2YgdGhlIGNhcmQKfQoKc3RhdGljIHZvaWQgc2V0X2JpdHModWludHB0cl90IHJlZ19hZGRyLCB1bnNpZ25lZCBpbnQgbWFzaywgaW50IHZhbHVlKQp7Cgl1bnNpZ25lZCBpbnQgcmVnX3ZhbHVlOwoKCXJlZ192YWx1ZSA9IHJlYWQzMigodm9pZCAqKXJlZ19hZGRyKTsKCXJlZ192YWx1ZSAmPSB+KG1hc2spOwoJcmVnX3ZhbHVlIHw9ICh2YWx1ZSZtYXNrKTsKCXdyaXRlMzIoKHZvaWQgKilyZWdfYWRkciwgcmVnX3ZhbHVlKTsKfQoKCiNpZiBkZWZpbmVkKEJFUkxJTl9TT0NfQVMzNzApCiNkZWZpbmUgSVJRX2VtbWNfaW50CUlSUV91X2VtbWNDb3JlX19pbnRyCgojZGVmaW5lIHBpbm11eF93cml0ZShiYXNlLCBhLCB2YWx1ZSkgXAp7IFwKCXNldF9iaXRzKGJhc2UgKyAoQkFfR2JsX3Bpbk11eENudGxCdXNfIyNhICYgKH4zKSksIFwKCQkJTVNLMzJHYmxfcGluTXV4Q250bEJ1c18jI2EsIFwKCQkJdmFsdWUgPDwgTFNiMzJHYmxfcGluTXV4Q250bEJ1c18jI2EpOyBcCn0KCnN0YXRpYyB2b2lkIGVtbWNfc2V0cGlubXV4KHZvaWQpCnsKCXVuc2lnbmVkIGludCBiYXNlID0gTUVNTUFQX0NISVBfQ1RSTF9SRUdfQkFTRTsKCXVuc2lnbmVkIGludCB2YWx1ZTsKCglFTU1DX1BSTihQUk5fUkVTLCAiQVMzNzAgc2V0dXAgcGlubXV4IGZvciBFTU1DIFxuIik7CglwaW5tdXhfd3JpdGUoYmFzZSwgTkFORF9JTzAsIDEpOwkvLyBFTU1DX0RBVEEwCglwaW5tdXhfd3JpdGUoYmFzZSwgTkFORF9JTzEsIDEpOwkvLyBFTU1DX0RBVEExCglwaW5tdXhfd3JpdGUoYmFzZSwgTkFORF9JTzIsIDEpOwkvLyBFTU1DX0RBVEEyCglwaW5tdXhfd3JpdGUoYmFzZSwgTkFORF9JTzMsIDEpOwkvLyBFTU1DX0RBVEEzCglwaW5tdXhfd3JpdGUoYmFzZSwgTkFORF9JTzQsIDEpOwkvLyBFTU1DX0RBVEE0CglwaW5tdXhfd3JpdGUoYmFzZSwgTkFORF9JTzUsIDEpOwkvLyBFTU1DX0RBVEE1CglwaW5tdXhfd3JpdGUoYmFzZSwgTkFORF9JTzYsIDEpOwkvLyBFTU1DX0RBVEE2CglwaW5tdXhfd3JpdGUoYmFzZSwgTkFORF9JTzcsIDEpOwkvLyBFTU1DX0RBVEE3CglwaW5tdXhfd3JpdGUoYmFzZSwgTkFORF9XUG4sIDEpOwkvLyBFTU1DX0NMSwoJcGlubXV4X3dyaXRlKGJhc2UsIE5BTkRfQ0VuLCAxKTsJLy8gRU1NQ19SU1RuCglwaW5tdXhfd3JpdGUoYmFzZSwgTkFORF9SRFksIDEpOwkvLyBFTU1DX0NNRAoKCWJhc2UgPSBNRU1NQVBfQ0hJUF9DVFJMX1JFR19CQVNFICsgUkFfR2JsX1BFUklGICsgUkFfUEVSSUZfUFhCQVJfQVNJQl9TRUw7IC8vMHhmN2VhMDAwMCArIDB4MDY2MCArIDB4MDgKCUJGTV9IT1NUX0J1c19SZWFkMzIoYmFzZSAsICZ2YWx1ZSk7Cgl2YWx1ZSB8PSBNU0szMlBFUklGX1BYQkFSX0FTSUJfU0VMX05BTkRfRU1NQzsKCUJGTV9IT1NUX0J1c19Xcml0ZTMyKGJhc2UgLCB2YWx1ZSk7CgoJRU1NQ19QUk4oUFJOX1JFUywiJXM6IEFmdGVyIDB4ZjdlYTA4NDQ9MHgleCwgMHhmN2VhMDg0OD0weCV4LCAweGY3ZWEwODRjPTB4JXgsMHhmN2VhMDY2OD0weCV4LCAweGY3ZWEwNTE0PTB4JXhcbiIsCgkJCQkJX19mdW5jX18sCgkJCQkJKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikweGY3ZWEwODQ0LAoJCQkJCSoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopMHhmN2VhMDg0OCwKCQkJCQkqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKTB4ZjdlYTA4NGMsCgkJCQkJKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikweGY3ZWEwNjY4LAoJCQkJCSoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopMHhmN2VhMDUxNCk7Cn0KI2VuZGlmCgp2b2lkIEVNTUNfU2V0dXBQaW5tdXgodm9pZCkKewogICAgRU1NQ19QUk4oUFJOX1JFUywic2V0dXAgcGlubXV4XG4iKTsKICAgIC8vcGlubXV4X3dyaXRlKDAsIEVfRU1NQ19SU1RuLDApOwogICAgZW1tY19zZXRwaW5tdXgoKTsKfQoKdm9pZCBlbW1jX0ludHJfT24odm9pZCkKewojaWZkZWYgX19TRElPX0lOVF9NT0RFX18KCWlmKHJlZ2lzdGVyX2lzcihFTU1DX0lTUiwgSVJRX2VtbWNfaW50KSkKICAgICAgICAgICAgRU1NQ19QUk4oUFJOX0VSUiwgIm1tYzQgaXNyIGNhbid0IGJlIHJlZ2lzdGVyZWRcbiIpOwoKICAgICAgICBzZXRfaXJxX2VuYWJsZShJUlFfZW1tY19pbnQpOwojZW5kaWYJCS8vIF9fU0RJT19JTlRfTU9ERV9fCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogICAgRU1NQ19DaGVja1ZvbHRhZ2VDb21wYXRpYmlsaXR5CioJCUNoZWNrcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgT0NSIHJlZ2lzdGVyIG9mIHRoZSBkZXZpY2Ugc3VwcG9ydHMgdGhlCioJCXZvbHRhZ2UgcmFuZ2UgdGhhdCB3YXMgc2VsZWN0ZWQgZm9yIHRoZSBjb250cm9sbGVyCiogICAgSW5wdXQ6CiogCQlQX01NNF9TRE1NQ19DT05URVhUX1QgcENvbnRleHQsIFVJTlRfVCBDb250cm9sbGVyVm9sdGFnZQoqICAgIE91dHB1dDoKKgkJbm9uZQoqICAgIFJldHVybnM6CiogICAgICAgbm9uZQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KVUlOVF9UIEVNTUNfQ2hlY2tWb2x0YWdlQ29tcGF0aWJpbGl0eShQX1NETU1DX1Byb3BlcnRpZXNfVCBwU0RNTUNQLCBVSU5UX1QgQ29udHJvbGxlclZvbHRhZ2UpCnsKI2lmIFBMQVRGT1JNPT1WRUxPQ0UKCXJldHVybiBOb0Vycm9yOwojZW5kaWYKCVVOVVNFRChDb250cm9sbGVyVm9sdGFnZSk7CglpZiAoKHBTRE1NQ1AtPkNhcmRSZWcuT0NSICYgKE1NQ19PQ1JfVk9MVEFHRV9BTEx8U0RfT0NSX1ZPTFRBR0VfMV84KSkgKQoJCXJldHVybiBOb0Vycm9yOwoJRU1NQ19QUk4oUFJOX1JFUywiZGV2aWNlIHZvbHRhZ2Ugbm90IHN1cHBvcnRlZCwgcFNETU1DUC0+Q2FyZFJlZy5PQ1I9MHgleFxuIixwU0RNTUNQLT5DYXJkUmVnLk9DUik7CgoJcmV0dXJuIFNETU1DRGV2aWNlVm9sdGFnZU5vdFN1cHBvcnRlZDsKfQoKI2lmIGRlZmluZWQoQkVSTElOX1NPQ19CRzRDRFApCnZvaWQgRU1NQ19TbG90X2luaXQodm9pZCkKewoJVUlOVF9UIGFkZHIsIHZhbHVlOwoJYWRkcj0gRU1NQ19SRUdfQkFTRTsKCgkvLyBUQjogYWRkIGRldGFpbGVkIGNvbW1lbnQKCS8vIDB4MTA4IFNESEMgU3lzdGVtIE9wZXJhdGlvbiBDb250cm9sIFJlZ2lzdGVycwoJLy8gNzowIFNsb3QgRW5hYmxlOiBlbmFibGUgc2xvdDEKCUJGTV9IT1NUX0J1c19SZWFkMzIoYWRkciArIDB4MDEwOCwgJnZhbHVlKTsKCUVNTUNfUFJOKFBSTl9JTkZPLCAiMHgleCA9IDB4JXhcbiIsIGFkZHIrMHgxMDgsIHZhbHVlKTsKCXZhbHVlID0gdmFsdWUgfDE7Cgl2YWx1ZSA9IHZhbHVlICYofigweDM8PDIxKSk7Cgl2YWx1ZSA9IHZhbHVlIHwoMHgyPDwyMSk7Cgl2YWx1ZSA9IHZhbHVlIHwoMHgxPDwyMCk7CglCRk1fSE9TVF9CdXNfV3JpdGUzMihhZGRyICsgMHgwMTA4LCB2YWx1ZSk7CglFTU1DX1BSTihQUk5fSU5GTywgIjB4JXggPSAweCV4XG4iLCBhZGRyKzB4MTA4LCB2YWx1ZSk7CgoJQkZNX0hPU1RfQnVzX1JlYWQzMihhZGRyICsgMHgwMTBDLCAmdmFsdWUpOwoJRU1NQ19QUk4oUFJOX0lORk8sICIweCV4ID0gMHgleFxuIiwgYWRkcisweDEwQywgdmFsdWUpOwoJdmFsdWUgPSB2YWx1ZSB8MTsKCUJGTV9IT1NUX0J1c19Xcml0ZTMyKGFkZHIgKyAweDAxMEMsIHZhbHVlKTsKCUVNTUNfUFJOKFBSTl9JTkZPLCAiMHgleCA9IDB4JXhcbiIsIGFkZHIrMHgxMEMsIHZhbHVlKTsKCgkvLzB4MTY4IGJpdFsyOF0mYml0WzI0fjI2XXNob3VsZCBiZSAxLCBiaXRbMTJ+MTVdIHNob3VsZCBiZSAxLgoJQkZNX0hPU1RfQnVzX1JlYWQzMihhZGRyICsgMHgwMTc4LCAmdmFsdWUpOwoJdmFsdWUgfD0gKDB4Rjw8MTIpOwoJLy8gICAgdmFsdWUgfD0gKDB4Rjw8MjApOwoJdmFsdWUgfD0gKDB4Nzw8MjQpOwoJdmFsdWUgfD0gKDB4MTw8MjgpOwoJQkZNX0hPU1RfQnVzX1dyaXRlMzIoYWRkciArIDB4MDE3OCwgdmFsdWUpOwoKCUJGTV9IT1NUX0J1c19SZWFkMzIoYWRkciArIDB4MDE3OCwgJnZhbHVlKTsKCUVNTUNfUFJOKFBSTl9JTkZPLCAiMHgleCA9IDB4JXhcbiIsIGFkZHIrMHgxNzgsIHZhbHVlKTsKCgkvLzB4MDE3MCBiaXRbMThdIHNldCAgICAgOyAgICBRU1Agc2FtbGUgZWRnZQoJQkZNX0hPU1RfQnVzX1JlYWQzMihhZGRyICsgMHgwMTcwLCAmdmFsdWUpOwoJRU1NQ19QUk4oUFJOX0lORk8sICIweCV4ID0gMHgleFxuIiwgYWRkcisweDE3MCwgdmFsdWUpOwojaWZkZWYgQ09ORklHX0ZQR0EKCXZhbHVlID0gdmFsdWUgfCgxPDwxOCk7CglCRk1fSE9TVF9CdXNfV3JpdGUzMihhZGRyICsgMHgwMTcwLCB2YWx1ZSk7CglFTU1DX1BSTihQUk5fSU5GTywgIjB4JXggPSAweCV4XG4iLCBhZGRyKzB4MTcwLCB2YWx1ZSk7CiNlbmRpZgoKCS8vSU8gdm9sdGFnZSA9IDEuOFYKCUJGTV9IT1NUX0J1c19SZWFkMzIoYWRkciArIDB4MDEzMCwgJnZhbHVlKTsKCUVNTUNfUFJOKFBSTl9JTkZPLCAiMHgleCA9IDB4JXhcbiIsIGFkZHIrMHgxMzAsIHZhbHVlKTsKCXZhbHVlID0gKHZhbHVlICYofjB4MykpfDB4MTsKCUJGTV9IT1NUX0J1c19Xcml0ZTMyKGFkZHIgKyAweDAxMzAsIHZhbHVlKTsKCUVNTUNfUFJOKFBSTl9JTkZPLCAiMHgleCA9IDB4JXhcbiIsIGFkZHIrMHgxMzAsIHZhbHVlKTsKCS8vMS44diBzaWduYWxpbmcKCUJGTV9IT1NUX0J1c19SZWFkMzIoYWRkcisweDNDLCZ2YWx1ZSk7CglFTU1DX1BSTihQUk5fSU5GTywgIjB4JXggPSAweCV4XG4iLCBhZGRyKzB4M0MsIHZhbHVlKTsKCXZhbHVlID0gdmFsdWUgfCgweDE8PDE5KTsKCUJGTV9IT1NUX0J1c19Xcml0ZTMyKGFkZHIgKyAweDNDLCB2YWx1ZSk7CglFTU1DX1BSTihQUk5fSU5GTywgIjB4JXggPSAweCV4XG4iLCBhZGRyKzB4M0MsIHZhbHVlKTsKfQoKCnZvaWQgRU1NQ19QaHlJbml0aWFsaXphdGlvbih2b2lkKQp7CglVSU5UX1QgYWRkciwgdmFsdWU7CgoJYWRkcj0gRU1NQ19SRUdfQkFTRTsKCglCRk1fSE9TVF9CdXNfUmVhZDMyKChhZGRyICsweDAxNzApLCAmdmFsdWUpOwoJdmFsdWUgPSB2YWx1ZSB8KDE8PDMxKSA7CglCRk1fSE9TVF9CdXNfV3JpdGUzMigoYWRkciArIDB4MDE3MCksIHZhbHVlKTsKCglkbwoJewoJCUJGTV9IT1NUX0J1c19SZWFkMzIoKGFkZHIgKyAweDAxNzApLCAmdmFsdWUpOwoJCUVNTUNfUFJOKFBSTl9JTkZPLCAiMHgleCA9IDB4JXhcbiIsIGFkZHIrMHgxNzAsIHZhbHVlKTsKCX13aGlsZSh2YWx1ZSYweDgwMDAwMDAwKTsKCWRlbGF5X21zKDEpOwp9CiNlbmRpZgoKI2lmIGRlZmluZWQoQkVSTElOX1NPQ19BUzM3MCkKdm9pZCBFTU1DX1Nsb3RfaW5pdCh2b2lkKQp7CglVSU5UX1QgYWRkciwgb2Zmc2V0LCB2YWx1ZTsKCgkvKiBjbG9jayBlbmFibGUgZm9yIG1vZHVsZXMgdXNpbmcgcGVyaWZTeXNDbGsgYXMgY2xvY2sgc291cmNlICovCglhZGRyID0gTUVNTUFQX0NISVBfQ1RSTF9SRUdfQkFTRSArIFJBX0dibF9jbGtFbmFibGU7CglCRk1fSE9TVF9CdXNfUmVhZDMyKGFkZHIsICZ2YWx1ZSk7Cgl2YWx1ZSB8PSAoMHgxIDw8IExTYjMyR2JsX2Nsa0VuYWJsZV9lbW1jU3lzQ2xrRW4pOwoJQkZNX0hPU1RfQnVzX1dyaXRlMzIoYWRkciwgdmFsdWUpOwoKCWFkZHI9IEVNTUNfUkVHX0JBU0U7CglCRk1fSE9TVF9CdXNfUmVhZDMyKGFkZHIgKyAweEU4LCAmb2Zmc2V0KTsKCUVNTUNfUFJOKFBSTl9JTkZPLCAiMHgleCA9IDB4JXhcbiIsIGFkZHIrMHhFOCwgb2Zmc2V0KTsKCW9mZnNldCAmPSAweEZGRjsKCW9mZnNldCArPSAweDJDOwoKCUJGTV9IT1NUX0J1c19SZWFkMzIoYWRkciArIG9mZnNldCwgJnZhbHVlKTsKCXZhbHVlIHw9IDB4MTsKCUJGTV9IT1NUX0J1c19Xcml0ZTMyKGFkZHIgKyBvZmZzZXQsIHZhbHVlKTsKCglFTU1DX1BSTihQUk5fUkVTLCIlczogQWZ0ZXIgMHhmN2VhMDUxND0weCV4XG4iLAoJCQkJCV9fZnVuY19fLAoJCQkJCSoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopMHhmN2VhMDUxNCk7Cn0KCnZvaWQgRU1NQ19QaHlJbml0aWFsaXphdGlvbih2b2lkKQp7Ci8qIGRvIG5vdGhpbmcgZm9yIEVNTUMgY29udHJvbGxlciB3aXRob3V0IHBoeSAqLwp9CiNlbmRpZgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiAgIEVNTUNIQ19Jbml0CiogICAgICBJbml0aWFsaXplcyB0aGUgSEMKKiAgIElucHV0OgoqCSAgIG5vbmUKKiAgIE91dHB1dDoKKiAgICAgIG5vbmUKKiAgIFJldHVybnM6CiogICAgICBXVFAgcmVjb2dpbml6ZWQgU3VjY2Vzcy9GYWlsIHJldHVybiBjb2RlCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpVSU5UX1QgRU1NQ0hDX0luaXQodm9pZCkKewoJLy91aW50cHRyX3QgYWRkcjsKICAgIC8vVUlOVF9UIHZhbHVlOwoKICAgIFBfTU00X1NETU1DX0NPTlRFWFRfVCBwQ29udGV4dDsKCiAgICAvLyBJbml0aWFsaXplIEZsYXNoIFByb3BlcnRpZXMKCiAgICBQX1NETU1DX1Byb3BlcnRpZXNfVCBwU0RNTUNQID0gRU1NQ19HZXRQcm9wZXJ0aWVzKCk7CgogICAgLy8gQXNzaWduIHBDb250ZXh0IGFuZCBjbG9jayB2YWx1ZXMKCgogICAgcENvbnRleHQgPSAoUF9NTTRfU0RNTUNfQ09OVEVYVF9UKSBwU0RNTUNQLT5wQ29udGV4dDsKICAgIC8vYWRkcj0gRU1NQ19SRUdfQkFTRTsKI2lmIDEKICAgIEVNTUNfU2xvdF9pbml0KCk7CiNlbmRpZgogICAgaWYoIUVNTUNIQ19TZXRDb250cm9sbGVyVm9sdGFnZShwQ29udGV4dCwgMykpCS8vMSAtLS0+MwogICAgewogICAgICAgIEVNTUNfUFJOKFBSTl9SRVMsICJIb3N0IGRvZXNuJ3Qgc3VwcG9ydCAxLjhWXG4iKTsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgoJLy8gRW5hYmxlIGNsb2NrcyB0byBzbG93IHNwZWVkCiNpZmRlZiBDT05GSUdfRlBHQQoJRU1NQ0hDX1NldEJ1c1JhdGUocENvbnRleHQsIFNEQ0xLX1NFTF9ESVZfMzIpOwojZWxpZiBkZWZpbmVkKEJFUkxJTl9TT0NfQVMzNzApCglFTU1DSENfU2V0QnVzUmF0ZShwQ29udGV4dCwgU0RDTEtfU0VMX0RJVl8yNTYpOyAvLyByZWZlcmVuY2UgMTAwTUh6CiNlbHNlCglFTU1DSENfU2V0QnVzUmF0ZShwQ29udGV4dCwgU0RDTEtfU0VMX0RJVl8xMDI0KTsKI2VuZGlmCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgkvLyBTZXQgUmVhZCBSZXNwb25zZSBUaW1lb3V0CglFTU1DSENfU2V0RGF0YVRpbWVvdXQocENvbnRleHQsIENMT0NLXzI3X01VTFQpOwoKCS8vIEVuYWJsZSBwb3dlcgoKCS8vIFVubWFzayBhbmQgRW5hYmxlIGludGVycnVwdHMKCglFTU1DSENfRW5hYmxlRGlzYWJsZUludFNvdXJjZXMocENvbnRleHQsIEVOQUJMRV9JTlRTKTsKCglyZXR1cm4gMDsKfQoKCmludCBFTU1DX1dhaXRGb3JDYXJkRGV0ZWN0KHZvaWQpCnsKICAgIFBfU0RNTUNfUHJvcGVydGllc19UIHBTRE1NQ1AgPSBFTU1DX0dldFByb3BlcnRpZXMoKTsKICAgIFBfTU00X1NETU1DX0NPTlRFWFRfVCBwU0RDWFQgPSAoUF9NTTRfU0RNTUNfQ09OVEVYVF9UKXBTRE1NQ1AtPnBDb250ZXh0OwogICAgaW50IGk9MDsKCiAgICB3aGlsZSgrK2k8ODAwMDAwMCkKICAgIHsKICAgICAgICBpZihwU0RDWFQtPnBNTUM0UmVnLT5tbTRfc3RhdGUgJiBTRElPX0NBUkRfUFJFU0VOVF9CSVQpCiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAoaT09ODAwMDAwMCkKICAgIHsKICAgICAgICBFTU1DX1BSTihQUk5fUkVTLCIgTm8gY2FyZCBwcmVzZXQhXG4iKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBFTU1DX1BSTihQUk5fUkVTLCIgY2FyZCBwcmVzZXQuIHN3aXRjaCBwb3dlciBvbiBcbiIpOwogICAgICAgIHJldHVybiAxOwogICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgRGVzY3JpcHRpb246CiAgICBTZXQgdXAgdGhlIHJlZ2lzdGVycyBvZiB0aGUgY29udHJvbGxlciB0byBzdGFydCB0aGUgdHJhbnNhY3Rpb24gdG8KICAgIGNvbW11bmljYXRlIHRvIHRoZSBjYXJkIGZvciBkYXRhIHJlbGF0ZWQgY29tbWFuZC4gIFRoZSBjb21tYW5kcyBhcmUgY2xlYXJseSBkZWZpbmVkIGluIHRoZSBNTUMKICAgIHNwZWNpZmljYXRpb24uCiAgSW5wdXQgUGFyYW1ldGVyczoKCSAgIFBfU0RNTUNfUHJvcGVydGllc19UIHBTRE1NQ1AgLSBHZW5lcmljIFNEL01NQyBkcml2ZXIgcHJvcGVydGllcyBzdHJ1Y3R1cmUKICBDbWQKCQlDb21tYW5kIEluZGV4IC0gU2VlIE1NQyBvciBTRCBzcGVjaWZpY2F0aW9uCiAgYXJndW1lbnQKICAgICAgCXRoZSBhcmd1bWVudCBvZiAgdGhlIGNvbW1hbmQuIE1TVyBpcyBmb3IgQVJHSCBhbmQgTFNXIGlzIGZvciBBUkdMCiAgQmxvY2tUeXBlCgkgIAlNdWx0aXBsZSBvciBTaW5nbGUgQmxvY2sgVHlwZQogIFJlc1R5cGUKCQlFeHBlY3RlZCByZXNwb25zZSB0eXBlCiAgT3V0cHV0IFBhcmFtZXRlcnM6CiAgICBOb25lCiAgUmV0dXJuczoKICAgIE5vbmUKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCBFTU1DX1NlbmREYXRhQ29tbWFuZCAoUF9TRE1NQ19Qcm9wZXJ0aWVzX1QgcFNETU1DUCwKICAgICAgICAgICAgICAgICAgVUlOVF9UIENtZCwKICAgICAgICAgICAgICAgICAgVUlOVF9UICBBcmd1bWVudCwKICAgICAgICAgICAgICAgICAgVUlOVF9UIEJsb2NrVHlwZSwKICAgICAgICAgICAgICAgICAgVUlOVF9UIERhdGFEaXJlY3Rpb24sCiAgICAgICAgICAgICAgICAgIFVJTlRfVCBSZXNUeXBlKQp7CgkgLy8gQXNzaWduIG91ciBjb250ZXh0IHZhbHVlCgkgUF9NTTRfU0RNTUNfQ09OVEVYVF9UIHBDb250ZXh0ID0gKFBfTU00X1NETU1DX0NPTlRFWFRfVCkgcFNETU1DUC0+cENvbnRleHQ7CgoJIC8vIG5vIG5lZWQgdG8gY2xlYXIgb3V0IGFueSBmYXVsdCBzdGF0ZSB0aGF0IG1heSBiZSBsZWZ0IG92ZXIgZnJvbSBhIHByZXZpb3VzbHkgZmFpbGVkIHRyYW5zYWN0aW9uLgoJIC8vIHRoYXQncyBiZWNhdXNlIHRoZSBjYWxsZXIgaGFzIHNldCBTdGF0ZSB0byByZWFkIG9yIHdyaXRlIGJlZm9yZSBjYWxsaW5nIGhlcmUuCgoJIC8vIE5vIFJlc3BvbnNlIHRvIHRoZSBjb21tYW5kIHlldAoJIHBTRE1NQ1AtPkNhcmRSZXBvbnNlLkNvbW1hbmRDb21wbGV0ZSA9IDA7CgkgcFNETU1DUC0+VHJhbnMuUmVzcFR5cGUgPSAoUmVzVHlwZSA+PiA4KSAmIDB4MDAwMDAwZmY7CgkgcFNETU1DUC0+VHJhbnMuQ21kID0gQ21kOwkvLyBGaXhtZTogaG93IHRvIGtub3cgd2hlbiB0byBzZXQgdGhlIEFDTUQgZmxhZz8KCgkgRU1NQ19QUk4oUFJOX0lORk8sIlxuIHJlYWR5IHRvIHNlbmQgY21kICUwMmQgYXJnPTB4JTA4eCAocmVzcF90eXBlPTB4JTAyWCkgIixDbWQsQXJndW1lbnQsUmVzVHlwZSk7CgoJIEVNTUNIQ19TZW5kRGF0YUNvbW1hbmQocENvbnRleHQsCgkgICAgICAgICAgICAgICAgICBDbWQsCgkgICAgICAgICAgICAgICAgICBBcmd1bWVudCwKCSAgICAgICAgICAgICAgICAgIEJsb2NrVHlwZSwKCSAgICAgICAgICAgICAgICAgIERhdGFEaXJlY3Rpb24sCgkgICAgICAgICAgICAgICAgICBSZXNUeXBlICYgMHgwMDAwMDBmZik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBEZXNjcmlwdGlvbjoKICAgIFNldCB1cCB0aGUgcmVnaXN0ZXJzIG9mIHRoZSBjb250cm9sbGVyIHRvIHN0YXJ0IHRoZSB0cmFuc2FjdGlvbiB0bwogICAgY29tbXVuaWNhdGUgdG8gdGhlIGNhcmQgZm9yIGRhdGEgcmVsYXRlZCBjb21tYW5kLiAgVGhlIGNvbW1hbmRzIGFyZSBjbGVhcmx5IGRlZmluZWQgaW4gdGhlIE1NQwogICAgc3BlY2lmaWNhdGlvbi4KICBJbnB1dCBQYXJhbWV0ZXJzOgoJICAgUF9TRE1NQ19Qcm9wZXJ0aWVzX1QgcFNETU1DUCAtIEdlbmVyaWMgU0QvTU1DIGRyaXZlciBwcm9wZXJ0aWVzIHN0cnVjdHVyZQogIENtZAoJCUNvbW1hbmQgSW5kZXggLSBTZWUgTU1DIG9yIFNEIHNwZWNpZmljYXRpb24KICBhcmd1bWVudAogICAgICAJdGhlIGFyZ3VtZW50IG9mICB0aGUgY29tbWFuZC4gTVNXIGlzIGZvciBBUkdIIGFuZCBMU1cgaXMgZm9yIEFSR0wKICBCbG9ja1R5cGUKCSAgCU11bHRpcGxlIG9yIFNpbmdsZSBCbG9jayBUeXBlCiAgUmVzVHlwZQoJCUV4cGVjdGVkIHJlc3BvbnNlIHR5cGUKICBPdXRwdXQgUGFyYW1ldGVyczoKICAgIE5vbmUKICBSZXR1cm5zOgogICAgTm9uZQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIEVNTUNfU2VuZERhdGFDb21tYW5kTm9BdXRvMTIgKFBfU0RNTUNfUHJvcGVydGllc19UIHBTRE1NQ1AsCiAgICAgICAgICAgICAgICAgIFVJTlRfVCBDbWQsCiAgICAgICAgICAgICAgICAgIFVJTlRfVCAgQXJndW1lbnQsCiAgICAgICAgICAgICAgICAgIFVJTlRfVCBCbG9ja1R5cGUsCiAgICAgICAgICAgICAgICAgIFVJTlRfVCBEYXRhRGlyZWN0aW9uLAogICAgICAgICAgICAgICAgICBVSU5UX1QgUmVzVHlwZSkKewoJIC8vIEFzc2lnbiBvdXIgY29udGV4dCB2YWx1ZQoJIFBfTU00X1NETU1DX0NPTlRFWFRfVCBwQ29udGV4dCA9IChQX01NNF9TRE1NQ19DT05URVhUX1QpIHBTRE1NQ1AtPnBDb250ZXh0OwoKCSAvLyBubyBuZWVkIHRvIGNsZWFyIG91dCBhbnkgZmF1bHQgc3RhdGUgdGhhdCBtYXkgYmUgbGVmdCBvdmVyIGZyb20gYSBwcmV2aW91c2x5IGZhaWxlZCB0cmFuc2FjdGlvbi4KCSAvLyB0aGF0J3MgYmVjYXVzZSB0aGUgY2FsbGVyIGhhcyBzZXQgU3RhdGUgdG8gcmVhZCBvciB3cml0ZSBiZWZvcmUgY2FsbGluZyBoZXJlLgoKCSAvLyBObyBSZXNwb25zZSB0byB0aGUgY29tbWFuZCB5ZXQKCSBwU0RNTUNQLT5DYXJkUmVwb25zZS5Db21tYW5kQ29tcGxldGUgPSAwOwoKCSAvLyBzYXZlIHRoZSBpbmZvIGZvciB1c2UgYnkgdGhlIGlzcjoKCSBwU0RNTUNQLT5UcmFucy5SZXNwVHlwZSA9IChSZXNUeXBlID4+IDgpICYgMHgwMDAwMDBmZjsKCSBwU0RNTUNQLT5UcmFucy5DbWQgPSBDbWQ7CS8vIEZpeG1lOiBob3cgdG8ga25vdyB3aGVuIHRvIHNldCB0aGUgQUNNRCBmbGFnPwoKCSBFTU1DX1BSTihQUk5fSU5GTywiXG4gcmVhZHkgdG8gc2VuZCBjbWQgJTAyZCBhcmc9MHglMDh4IChyZXNwX3R5cGU9MHglMDJYKSAiLENtZCxBcmd1bWVudCxSZXNUeXBlKTsKCgkgRU1NQ0hDX1NlbmREYXRhQ29tbWFuZE5vQXV0bzEyKHBDb250ZXh0LAoJICAgICAgICAgICAgICAgICAgQ21kLAoJICAgICAgICAgICAgICAgICAgQXJndW1lbnQsCgkgICAgICAgICAgICAgICAgICBCbG9ja1R5cGUsCgkgICAgICAgICAgICAgICAgICBEYXRhRGlyZWN0aW9uLAoJICAgICAgICAgICAgICAgICAgUmVzVHlwZSAmIDB4MDAwMDAwZmYpOyAvLyBjbGVhciBvdXQgYW55IGJpdHMgbm90IGZvciB0aGUgU0RfQ01ELlJFU19UWVBFIGZpZWxkCgp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIERlc2NyaXB0aW9uOgogICAgU2V0IHVwIHRoZSByZWdpc3RlcnMgb2YgdGhlIGNvbnRyb2xsZXIgdG8gc3RhcnQgdGhlIHRyYW5zYWN0aW9uIHRvCiAgICBjb21tdW5pY2F0ZSB0byB0aGUgY2FyZCBmb3Igc2V0dXAgcmVsYXRlZCBjb21tYW5kcy4KICAgIFRoZSBjb21tYW5kcyBhcmUgY2xlYXJseSBkZWZpbmVkIGluIHRoZSBNTUMgc3BlY2lmaWNhdGlvbi4KICBJbnB1dCBQYXJhbWV0ZXJzOgoJICAgUF9TRE1NQ19Qcm9wZXJ0aWVzX1QgcFNETU1DUCAtIEdlbmVyaWMgU0QvTU1DIGRyaXZlciBwcm9wZXJ0aWVzIHN0cnVjdHVyZQoJQ21kCgkJQ29tbWFuZCBJbmRleCAtIFNlZSBNTUMgb3IgU0Qgc3BlY2lmaWNhdGlvbgogICAgYXJndW1lbnQKICAgICAgCXRoZSBhcmd1bWVudCBvZiAgdGhlIGNvbW1hbmQuIE1TVyBpcyBmb3IgQVJHSCBhbmQgTFNXIGlzIGZvciBBUkdMCglSZXNUeXBlCgkJRXhwZWN0ZWQgcmVzcG9uc2UgdHlwZQogIE91dHB1dCBQYXJhbWV0ZXJzOgogICAgTm9uZQogIFJldHVybnM6CiAgICBOb25lCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgRU1NQ19TZW5kU2V0dXBDb21tYW5kKFBfU0RNTUNfUHJvcGVydGllc19UIHBTRE1NQ1AsCiAgICAgICAgICAgICAgICAgIFVJTlRfVCBDbWQsCiAgICAgICAgICAgICAgICAgIFVJTlRfVCBDbWRUeXBlLAogICAgICAgICAgICAgICAgICBVSU5UX1QgQXJndW1lbnQsCiAgICAgICAgICAgICAgICAgIFVJTlRfVCBSZXNUeXBlKQp7CgkgLy8gQXNzaWduIG91ciBjb250ZXh0IHZhbHVlCgkgUF9NTTRfU0RNTUNfQ09OVEVYVF9UIHBDb250ZXh0ID0gKFBfTU00X1NETU1DX0NPTlRFWFRfVCkgcFNETU1DUC0+cENvbnRleHQ7CgoJIHBTRE1NQ1AtPlN0YXRlID0gUkVBRFk7CgoJIC8vIE5vIFJlc3BvbnNlIHRvIHRoZSBjb21tYW5kIHlldAoJIHBTRE1NQ1AtPkNhcmRSZXBvbnNlLkNvbW1hbmRDb21wbGV0ZSA9IDA7CgoJIHBTRE1NQ1AtPlRyYW5zLlJlc3BUeXBlID0gKFJlc1R5cGUgPj4gOCkgJiAweDAwMDAwMGZmOwoKCSBFTU1DX1BSTihQUk5fSU5GTywiXG4gcmVhZHkgdG8gc2VuZCBjbWQgJTAyZCBhcmc9MHglMDh4IChyZXNwX3R5cGU9MHglMDJYKSAiLENtZCxBcmd1bWVudCxSZXNUeXBlKTsKCgkgRU1NQ0hDX1NlbmRTZXR1cENvbW1hbmQocENvbnRleHQsCgkgICAgICAgICAgICAgICAgICBDbWQsCgkgICAgICAgICAgICAgICAgICBDbWRUeXBlLAoJICAgICAgICAgICAgICAgICAgQXJndW1lbnQsCgkgICAgICAgICAgICAgICAgICBSZXNUeXBlKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogICBNTTRfUmVhZF9SZXNwb25zZQoqCSAgIAlSZWFkcyB0aGUgcmVzcG9uc2UgZnJvbSB0aGUgQ29udHJvbGxlciBCdWZmZXIgUmVnaXN0ZXJzIHRvIHRoZSBMb2NhbCBCdWZmZXIuCiogCQlBY2NvcmRpbmcgdG8gdGhlIGxhc3QgY29tbWFuZCBhbmQgcmVzcG9uc2UgdHlwZSBpdCBkb2VzIHRoZSBjb3JyZWN0IGludGVycHJldGF0aW9uLgoqCQlUaGVyZSBpcyBhbHNvIGEgdGltZW91dCBhcyB0aGUgcm91dGluZSB3YWl0cyBmb3IgdGhlIElTUiB0byBzaWduYWwgbGFzdCBjb21tYW5kIGNvbXBsZXRpb24uCiogICBJbnB1dDoKKgkgICAJUF9TRE1NQ19Qcm9wZXJ0aWVzX1QgcFNETU1DUCAtIEdlbmVyaWMgU0QvTU1DIGRyaXZlciBwcm9wZXJ0aWVzIHN0cnVjdHVyZQoqIAkJUmVzcG9uc2VUeXBlIC0gU2VlIFNEL01NQyBzcGVjaWZpY2F0aW9ucwoqCQlSZXNwb25zZVRpbWVPdXQgLSBBIHRpbWUgb3V0IHZhbHVlIGluIG1pbGxpc2VjJ3MKKiAgIE91dHB1dDoKKiAgICAgIAlub25lCiogICBSZXR1cm5zOgoqICAgICAgCVRpbWVPdXRFcnJvciBvciBOb0Vycm9yCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpVSU5UX1QgRU1NQ19JbnRlcnByZXRfUmVzcG9uc2UoUF9TRE1NQ19Qcm9wZXJ0aWVzX1QgcFNETU1DUCwgVUlOVF9UIFJlc3BvbnNlVHlwZSwgVUlOVF9UIFJlc3BvbnNlVGltZU91dCkKewogCVVJTlRfVCB0ZW1wLCB0ZW1wMiwgdGVtcDM7CS8vIEVsYXBzZWRNU2VjczsKIAlVSU5UX1QgUmV0dmFsID0gTm9FcnJvcjsKIAlQX01NNF9TRE1NQ19DT05URVhUX1QgcENvbnRleHQgPSAoUF9NTTRfU0RNTUNfQ09OVEVYVF9UKSBwU0RNTUNQLT5wQ29udGV4dDsJCS8vIEFzc2lnbiBvdXIgY29udGV4dCB2YWx1ZQogCVBfTU00X0NNRF9YRlJNRF9VTklPTiBwTU00X1hGUk1EOwoJdm9sYXRpbGUgdW5zaWduZWQgaW50IGkgPSAwOwoKCVVOVVNFRChSZXNwb25zZVRpbWVPdXQpOwogCUVNTUNfUFJOKFBSTl9JTkZPLCIgaW50ZXJwcmV0IHJlc3BvbnNlISBcbiIpOwovLwlkZWxheV8xdXMoNSk7CiAJLy8gU2V0dXAgT1MgVGltZXIgcmVnaXN0ZXIgKFJlZ2lzdGVyIDQpCiAJLy9wQ29udGV4dC0+cE9TVFJlZy0+b21jcjQgPSAweDQyOwkJCQkvLyBJbmNyZW1lbnQgZXZyZXkgbXNlYwogCS8vIENsZWFyIHRoZSB2YWx1ZTsKIAkvL3BDb250ZXh0LT5wT1NUUmVnLT5vc2NyNCA9IDA7CiAJLy8gT3ZlcmxhcCBYRlJNRCByZWdpc3RlciBjb250ZW50cyB1c2luZyB1bml1bgogCXBNTTRfWEZSTUQgPSAoUF9NTTRfQ01EX1hGUk1EX1VOSU9OKSAmcENvbnRleHQtPnBNTUM0UmVnLT5tbTRfY21kX3hmcm1kOwoJcFNETU1DUC0+Q2FyZFJlcG9uc2UuUjFfUkVTUCA9IDA7CiAJaT0wOwojaWZkZWYgX19TRElPX0lOVF9NT0RFX18KCQoJd2hpbGUgKCFwU0RNTUNQLT5DYXJkUmVwb25zZS5Db21tYW5kQ29tcGxldGUpCgl7CgkJaSsrOwoJCWRlbGF5X3VzKDEpOwoJCWlmIChpID49IDEwMDAwMDApIGJyZWFrOwoJfQoKCWlmIChpID49IDEwMDAwMDApCgl7CgkJRU1NQ19QUk4oUFJOX1JFUywiIFRpbWUgb3V0ISBcbiIpOwoJCVJldHZhbCA9IFRpbWVPdXRFcnJvcjsKCQlyZXR1cm4gUmV0dmFsOwoJfQojZWxzZSAJLy8gX19TRElPX0lOVF9NT0RFX18gbm90IGRlZmluZWQKIAlFTU1DX1BSTihQUk5fSU5GTywiXG4gd2FpdCBmb3IgY21kICUwMmQgKDB4JTA4WCkgcmVzcG9uc2VcbiIscE1NNF9YRlJNRC0+bW00X2NtZF94ZnJtZF9iaXRzLmNtZF9pZHgscE1NNF9YRlJNRC0+bW00X2NtZF94ZnJtZF92YWx1ZSk7CiAJLy8gV2FpdCBmb3IgdGhlIFJlc3BvbnNlIGJhc2VkIG9uIHRoZSBDb21tYW5kQ29tcGxldGUgaW50ZXJydXB0IHNpZ25hbAoJLy93aGlsZSAoKHBDb250ZXh0LT5wTU1DNFJlZy0+bW00X2lfc3RhdCAmIDB4MDAwMDAwMDEpPT0wKQkvL2NtZGNvbXAKCXdoaWxlICghcFNETU1DUC0+Q2FyZFJlcG9uc2UuQ29tbWFuZENvbXBsZXRlKQogCXsKIAkJaSsrOwoJCWRlbGF5X21zKDEpOwkvL3RoaXMgZGVsYXkgaXMgbm90IGFjY3VyYXRlCgkJRU1NQ19JU1IoKTsKCQlpZiAoaSA+PSAxMDAwMDApIGJyZWFrOwogCX0KCglpZiAoaSA+PSAxMDAwMDApCiAJewoJCUVNTUNfUFJOKFBSTl9SRVMsIiBUaW1lIG91dCBcbiIpOwogCQlSZXR2YWwgPSBUaW1lT3V0RXJyb3I7CiAJCS8vcmV0dXJuIFJldHZhbDsKIAl9CiNlbmRpZgoKIAkvLyBSZWFkIGluIHRoZSBCdWZmZXJzCiAgICBzd2l0Y2ggKFJlc3BvbnNlVHlwZSkKICAgIHsKICAgICAgICBjYXNlIE1NQ19SRVNQT05TRV9OT05FOgogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1NQ19SRVNQT05TRV9SMToKICAgICAgICBjYXNlIE1NQ19SRVNQT05TRV9SMUI6CiAgICAgICAgICAgIHBTRE1NQ1AtPkNhcmRSZXBvbnNlLlIxX1JFU1AgPSBwU0RNTUNQLT5DYXJkUmVwb25zZS5wQnVmZmVyWzBdOwoKICAgICAgICAgICAgRU1NQ19QUk4oUFJOX0lORk8sICJcbiBUaGUgcmVjZWl2ZWQgUjFCIHJlc3BvbnNlIGlzICV4IiwgcFNETU1DUC0+Q2FyZFJlcG9uc2UuUjFfUkVTUCk7CgogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1NQ19SRVNQT05TRV9SMjoJCQkvLyBUaGlzIGlzIGZvciBDSUQgb3IgQ1NEIHJlZ2lzdGVyCiAgICAgICAgewoJIAlpZiAocE1NNF9YRlJNRC0+bW00X2NtZF94ZnJtZF9iaXRzLmNtZF9pZHggPT0gWExMUF9NTUNfQ01EOSkgLy9DU0QKCSAJewoJCQkvLyBDb3B5IHRoZSBDU0QgdmFsdWVzIGZyb20gdGhlIGJ1ZmZlcgoJCQlmb3IgKGk9MDsgaTw0OyBpKyspCgkJCQlwU0RNTUNQLT5DYXJkUmVnLkNTRC5DU0RfVkFMVUVbaV0gPSBwU0RNTUNQLT5DYXJkUmVwb25zZS5wQnVmZmVyW2ldOwoKCQkJICAgLy8gT3B0aW9uYWxseSB3ZSBjb3VsZCByZWNvcmQgbWF4aW11bSBibG9jayBsZW5ndGhzIGZyb20gdGhlIENTRC4KCQkJLy8gQnV0IHNvbWUgZGV2aWNlcyBjaGVhdCBhbmQgcHV0IGluY29ycmVjdCB2YWx1ZXMgaW4gdGhpcyBmaWVsZC4KCQkJLy8gU2F2ZSBvZmYgcmVhZCBCbG9jayBTaXplLCBwbGF5IGl0IHNhZmUsIGZvciBub3cgaGFyZCBjb2RlIHRvIDUxMiBCeXRlcwoJCQlwU0RNTUNQLT5SZWFkQmxvY2tTaXplID0gSEFSRDUxMkJMT0NLTEVOR1RIOwoJCQkvLyBTYXZlIG9mZiBXcml0ZSBCbG9jayBTaXplCgkJCXBTRE1NQ1AtPldyaXRlQmxvY2tTaXplID0gSEFSRDUxMkJMT0NLTEVOR1RIOwoKCQkJLy8gQ2FwdHVyZSBFcmFzZSBHcmFudWxhcml0eS4KCQkJaWYgKHBTRE1NQ1AtPlNEID09IFhMTFBfTU1DKQoJCQl7CgkJCQlwU0RNTUNQLT5FcmFzZVNpemUgPSAoKHBTRE1NQ1AtPkNhcmRSZWcuQ1NELkNTRF9WQUxVRVsxXSA+PiA1KSAmIDB4MUYpICsgMTsgIAkJLy8gR2V0IEVSQVNFX0dSUF9NVUxUCgkJCQlwU0RNTUNQLT5FcmFzZVNpemUgKj0gKCgocFNETU1DUC0+Q2FyZFJlZy5DU0QuQ1NEX1ZBTFVFWzFdID4+IDEwKSAmIDB4MUYpICsgMSk7CS8vIEdldCBFUkFTRV9HUlBfU0laRQoJCQkJcFNETU1DUC0+RXJhc2VTaXplICo9IHBTRE1NQ1AtPldyaXRlQmxvY2tTaXplOwoJCQl9CgoJCQkvLyBOb3cgY2FsY3VsYXRlIHRoZSBjYXBhY2l0eSBvZiB0aGlzIGNhcmQKCQkJdGVtcCA9ICgocFNETU1DUC0+Q2FyZFJlZy5DU0QuQ1NEX1ZBTFVFWzJdID4+IDE2KSAmIDB4Rik7IAkJLy8gR2V0IFJFQURfQkxfTEVOCgkJCXRlbXAgPSAxIDw8IHRlbXA7IAkJCQkJCQkJCQkvLyBOb3cgd2UgaGF2ZSBNYXggQmxvY2sgTGVuZ3RoCgkJCXRlbXAyID0gKChwU0RNTUNQLT5DYXJkUmVnLkNTRC5DU0RfVkFMVUVbMV0gPj4gMTUpICYgMHg3KSArIDI7IAkvLyBHZXQgQ19TSVpFX01VTFQKCQkJdGVtcDIgPSAxIDw8IHRlbXAyOwoJCQl0ZW1wMyA9ICgocFNETU1DUC0+Q2FyZFJlZy5DU0QuQ1NEX1ZBTFVFWzFdID4+IDMwKSAmIDB4Myk7CQkvLyBHZXQgQ19TSVpFCgkJCXRlbXAzIHw9ICgocFNETU1DUC0+Q2FyZFJlZy5DU0QuQ1NEX1ZBTFVFWzJdICYgMHgzRkYpIDw8IDIpOwkvLyBHZXQgQ19TSVpFCgkJCXRlbXAzKys7CgkJCXBTRE1NQ1AtPkNhcmRDYXBhY2l0eSA9IHRlbXAzICogdGVtcDIgKiB0ZW1wOwkJLy8gVG90YWwgU2l6ZSBvZiB0aGUgY2FyZCBpbiBCeXRlcwoJCX0KCSAJZWxzZSAvLyBBc3N1bWUgQ0lECgkgCXsKCQkJLy8gQ29weSB0aGUgQ1NEIHZhbHVlcyBmcm9tIHRoZSBidWZmZXIKCQkJZm9yIChpPTA7IGk8NDsgaSsrKQoJCQkJcFNETU1DUC0+Q2FyZFJlZy5DSUQuQ0lEX1ZBTFVFW2ldID0gcFNETU1DUC0+Q2FyZFJlcG9uc2UucEJ1ZmZlcltpXTsKCgkJCS8vIE5vdyBjYXB0dXJlIHRoZSBzZXJpYWwgbnVtYmVyIGZyb20gdGhlIENJRCAtIDMyIGJpdCBudW1iZXIKCQkJaWYgKHBTRE1NQ1AtPlNEID09IFhMTFBfTU1DKQoJCQl7CgkJCQlwU0RNTUNQLT5DYXJkUmVnLkNJRC5TZXJpYWxOdW0gPSAocFNETU1DUC0+Q2FyZFJlZy5DSUQuQ0lEX1ZBTFVFWzBdID4+IDE2KSAmICgweEZGKTsKCQkJCXBTRE1NQ1AtPkNhcmRSZWcuQ0lELlNlcmlhbE51bSB8PSAocFNETU1DUC0+Q2FyZFJlZy5DSUQuQ0lEX1ZBTFVFWzFdIDw8IDE2KTsKCQkJfQoJIAl9CiAJCWJyZWFrOwogICAgICAgIH0KICAgICAgICBjYXNlIE1NQ19SRVNQT05TRV9SMzoKICAgICAgICB7CiAgICAgICAgICAgIHBTRE1NQ1AtPkNhcmRSZWcuT0NSID0gcFNETU1DUC0+Q2FyZFJlcG9uc2UucEJ1ZmZlclswXTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNhc2UgTU1DX1JFU1BPTlNFX1I0OgkJCQkvLyBUaGVzZSBtb2RlcyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgZHJpdmVyCiAgICAgICAgewogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY2FzZSBNTUNfUkVTUE9OU0VfUjU6CiAgICAgICAgewogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY2FzZSBNTUNfUkVTUE9OU0VfUjVCOgogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1NQ19SRVNQT05TRV9SNjoJCQkJLy8gUHVibGlzaGVzIFJDQSBmb3IgU0QgY2FyZHMKICAgICAgICB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjYXNlIE1NQ19SRVNQT05TRV9SNzoKICAgICAgICB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KCiAgICAgcmV0dXJuIFJldHZhbDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiAgIFNETU1DR2V0TWF0Y2hXYWl0Q2FyZFN0YXR1cwoqICAgICAgCUdldHMgdGhlIHN0YXR1cyBvZiB0aGUgY2FyZCBieSBpc3N1aW5nIENNRCAxMy4gVGhlIHJlcnR1cm4gZnJvbSB0aGUgcm91dGluZSBpcyBiYXNlZAoqIAkJb24gYSBjaGVjayBhZ2FpbnN0IHRoZSBleHBlY3RlZCB2YWx1ZSB3aGljaCBpcyBwYXNzZWQgaW4KKiAgIElucHV0OgoqICAgICAgCXBTRE1NQ1AgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGNvbnRleHQKKiAgICAgIAlNYXhXYWl0TVNlYyAtIE1heGltdW0gd2FpdCB0aW1lIGluIG1pbGxpc2VjCiogCSAgIAlSMV9SZXNwX01hdGNoIC0gRGVzaXJlZCBWYWx1ZSB0byBiZSBtYXRjaGVkCiogICBPdXRwdXQ6CiogICAgICAJbm9uZQoqICAgUmV0dXJuczoKKiAgICAgIAlub25lCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpVSU5UX1QgRU1NQ19DaGVja0NhcmRTdGF0dXMoUF9TRE1NQ19Qcm9wZXJ0aWVzX1QgcFNETU1DUCwgVUlOVF9UIFIxX1Jlc3BfTWF0Y2gsIFVJTlRfVCBNYXNrKQp7CiAgICBVSU5UX1QgYXJndW1lbnQsIGNhcmRTdGF0dXMsIHJldHZhbDsKCiAgICAvL3NlbmQgQ01EMTMgdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiB0aGUgY2FyZAogICAgYXJndW1lbnQgPSBwU0RNTUNQLT5DYXJkUmVnLlJDQTsKICAgIEVNTUNfU2VuZFNldHVwQ29tbWFuZChwU0RNTUNQLCBYTExQX01NQ19DTUQxMywgTU00X0NNRF9UWVBFX05PUk1BTCwgYXJndW1lbnQsIE1NNF9SVF9SMSB8IE1NNF80OF9SRVMpOwogICAgcmV0dmFsID0gRU1NQ19JbnRlcnByZXRfUmVzcG9uc2UocFNETU1DUCwgTU1DX1JFU1BPTlNFX1IxLCAweDEwMCk7CgogICAgLy8gTWFzayBvdXQgdW5kZXNpcmVkIGNoZWNrIGJpdHMKICAgIGNhcmRTdGF0dXMgPSAocFNETU1DUC0+Q2FyZFJlcG9uc2UuUjFfUkVTUCkgJiBNYXNrOwoKICAgIGlmKGNhcmRTdGF0dXMmVVJHRU5UX0JLT1BTKQogICAgey8vSHluaXggZW5naW5lZXIgdG9sZCB0byBpbmdvcmUgdGhpcyBiaXQgYmVjYXVzZSB3cml0ZSBjb21tYW5kIHdpbGwgY2xlYXIgaXQuCgkJY2FyZFN0YXR1cyY9flVSR0VOVF9CS09QUzsKCQlFTU1DX1BSTihQUk5fUkVTLCAiQmFja2dyb3VuZCBvcGVyYXRpb25zIG5lZWRlZC5cbiIpOwogICAgfQoKICAgIGlmICgoY2FyZFN0YXR1cyA9PSBSMV9SZXNwX01hdGNoKSAmJiAocmV0dmFsID09IE5vRXJyb3IpKSB7CgkJLy9FTU1DX1BSTihQUk5fUkVTLCAiY2FyZFN0YXR1cyA9IDB4JXhcbiIsIGNhcmRTdGF0dXMpOwogICAgICAgIHJldHVybiBOb0Vycm9yOwogICAgfSBlbHNlewogICAgICAgIEVNTUNfUFJOKFBSTl9SRVMsICJcbiBjaGVjayBzdGF0ZSBlcnJvciwgc3RhdGUgaXMgc3VwcG9zZSB0byBiZSAweCV4IFxuIiwgUjFfUmVzcF9NYXRjaCk7CiAgICAgICAgRU1NQ19QUk4oUFJOX1JFUywgIlxuIEN1cnJlbnQgc3RhdGUgaXMgMHgleC5cbiIsIGNhcmRTdGF0dXMpOwogICAgICAgIHJldHVybiBUaW1lT3V0RXJyb3IgOwogICAgfQp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgRU1NQ19TZXRCdXNXaWR0aCgpCiogCVNldHMgdGhlIEJ1cyB3aWR0aCBoaWdoZXN0IGJ1cyB3aWR0aCBzdXBwb3J0ZWQuCiogICBJbnB1dDogd2lkdGggPSAyOiA4Yml0IHdpZHRoLCB3aWR0aD02OjhiaXQgRERSCiogICBPdXRwdXQ6CiogICBSZXR1cm5zOiBOb0Vycm9yLCBSZWFkRXJyb3Igb3IgTm90U3VwcG9ydGVkRXJyb3IKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KVUlOVF9UIEVNTUNfU2V0QnVzV2lkdGgoUF9TRE1NQ19Qcm9wZXJ0aWVzX1QgcFNETU1DUCwgaW50IHdpZHRoKQp7CiAgICBVSU5UX1QgaTsKICAgIE1NQ19DTUQ2X09WRVJMQVkgQ21kNjsKICAgIFBfTU00X1NETU1DX0NPTlRFWFRfVCBwQ29udGV4dDsKICAgIHZvbGF0aWxlIFBfTU00X0NOVEwxIHBNTTRfQ05UTDE7CiAgICBVSU5UX1QgUmV0dmFsID0gTm9FcnJvcjsKCiAgICAvLyBBc3NpZ24gb3VyIGNvbnRleHQgdmFsdWUKICAgIHBDb250ZXh0ID0gKFBfTU00X1NETU1DX0NPTlRFWFRfVCkgcFNETU1DUC0+cENvbnRleHQ7CiAgICBwTU00X0NOVEwxID0gKHZvbGF0aWxlIFBfTU00X0NOVEwxKSAmcENvbnRleHQtPnBNTUM0UmVnLT5tbTRfY250bDE7CgogICAgLy8gSXNzdWUgQ01EIDYgdG8gc2V0IEJVUyBXSURUSCBiaXRzIGluIEVYVF9DU0QgcmVnaXN0ZXIgYnl0ZSAxODMKICAgIENtZDYuTU1DX0NNRDZfTGF5b3V0LkFjY2VzcyA9IEVYVF9DU0RfQUNDRVNTX1dSSVRFX0JZVEU7CQkJLy9Xcml0ZSBCeXRlCiAgICBDbWQ2Lk1NQ19DTUQ2X0xheW91dC5DbWRTZXQgPSAwOwkJCQkJLy8gRG9uJ3QgQ2FyZQogICAgQ21kNi5NTUNfQ01ENl9MYXlvdXQuSW5kZXggPSBCVVNfV0lEVEhfTU1DX0VYVF9DU0RfT0ZGU0VUOyAJCS8vIENob29zZSBCdXMgV2lkdGgKICAgIENtZDYuTU1DX0NNRDZfTGF5b3V0LlJlc2VydmVkMCA9IDA7CiAgICBDbWQ2Lk1NQ19DTUQ2X0xheW91dC5SZXNlcnZlZDEgPSAwOwogICAgQ21kNi5NTUNfQ01ENl9MYXlvdXQuVmFsdWUgPSAoVUlOVDhfVCkgd2lkdGg7CS8vIENob29zZSA4IGJpdCBtb2RlLgoKICAgIEVNTUNfU2VuZFNldHVwQ29tbWFuZChwU0RNTUNQLCBYTExQX01NQ19DTUQ2LCBNTTRfQ01EX1RZUEVfTk9STUFMLCBDbWQ2Lk1NQ19DTUQ2X0JpdHMsIE1NNF9SVF9SMSB8IE1NNF9SVF9CVVNZIHwgTU00XzQ4X1JFU19XSVRIX0JVU1kpOwogICAgUmV0dmFsID0gRU1NQ19JbnRlcnByZXRfUmVzcG9uc2UocFNETU1DUCwgTU1DX1JFU1BPTlNFX1IxQiwgMHgxMCk7CgojaWYgMAovL3NlbmQgQ01EMTMgdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiB0aGUgY2FyZAoJCVJldHZhbCB8PSBFTU1DX0NoZWNrQ2FyZFN0YXR1cyhwU0RNTUNQLCAweEUwMCwgUjFfTE9DS0VEQ0FSRE1BU0spOwkJLy8gTWFrZSBzdXJlIGNhcmQgaXMgcHJvZ3JhbW1pbmcgc3RhdGUKCQlpZiAoUmV0dmFsICE9IE5vRXJyb3IpCgkJewoJCQlFTU1DX1BSTihQUk5fRVJSLCJDTUQ2IHN0YXR1czooYWZ0ZXIgY2hhbmdpbmcgYnVzIHdpZHRoKSAweCV4XG4iLCBwU0RNTUNQLT5DYXJkUmVwb25zZS5SMV9SRVNQKTsKCSAJCXBTRE1NQ1AtPlN0YXRlID0gUkVBRFk7CgkJCXJldHVybiBTRE1NQ19TV0lUQ0hfRVJST1I7CgkJfQojZWxzZQoJLy8gdG8gY29tcGF0aWJsZSBzb21lIHNwZWNpYWwgZU1NQyBkZXZpY2UuCiAgICBkZWxheV9tcygxKTsKI2VuZGlmCiAgICAvL3NlbmQgQ01EMTMgdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiB0aGUgY2FyZAogICAgaSA9IDA7CiAgICBSZXR2YWwgPSBFTU1DX0NoZWNrQ2FyZFN0YXR1cyhwU0RNTUNQLCAweDkwMCwgUjFfTE9DS0VEQ0FSRE1BU0spOwkJLy8gTWFrZSBzdXJlIGNhcmQgaXMgdHJhbnNmZXIgbW9kZQogICAgd2hpbGUoUmV0dmFsICE9IE5vRXJyb3IpCiAgICB7CglkZWxheV9tcygxKTsKICAgICAgICBSZXR2YWwgPSBFTU1DX0NoZWNrQ2FyZFN0YXR1cyhwU0RNTUNQLCAweDkwMCwgUjFfTE9DS0VEQ0FSRE1BU0spOwkJLy8gTWFrZSBzdXJlIGNhcmQgaXMgdHJhbnNmZXIgbW9kZQogICAgICAgIGlmKGk+MTAwMDApCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGkrKzsKICAgIH0KICAgIGlmIChSZXR2YWwgIT0gTm9FcnJvcikKICAgIHsKICAgICAgICBFTU1DX1BSTihQUk5fRVJSLCJDTUQxMzogY2hlY2sgc3RhdHVzKGFmdGVyIGNoYW5naW5nIGJ1cyB3aWR0aClcbiIpOwogICAgICAgIHJldHVybiBTRE1NQ0luaXRpYWxpemF0aW9uRXJyb3I7CiAgICB9CgoJaWYod2lkdGggPT0gMiB8fCB3aWR0aCA9PSA2KSAgLy84Yml0IFNEUiBvciBERFIKCQlwTU00X0NOVEwxLT5leF9kYXRhX3dpZHRoID0gMTsKCWVsc2UgaWYod2lkdGggPT0gMCkgICAvLzFiaXQgZGF0WzBdCgl7CgkJcE1NNF9DTlRMMS0+ZXhfZGF0YV93aWR0aCA9IDA7CS8vIGJ1c3dpZHRoIGlzIGRlZmluZWQgYnkgZGF0YSB0cmFuc2ZlciB3aWR0aC4KCQlwTU00X0NOVEwxLT5kYXRhd2lkdGggPSAwOwkJLy8gMWJpdCAgREFUWzBdLgoJfQoJZWxzZSBpZih3aWR0aCA9PSAxIHx8IHdpZHRoID09IDUpICAgLy80Yml0IFNEUiBvciBERFIKCXsKCQlwTU00X0NOVEwxLT5leF9kYXRhX3dpZHRoID0gMDsJLy8gYnVzd2lkdGggaXMgZGVmaW5lZCBieSBkYXRhIHRyYW5zZmVyIHdpZHRoLgoJCXBNTTRfQ05UTDEtPmRhdGF3aWR0aCA9IDE7CQkvLyA0Yml0LgoJfQoKICAgIHJldHVybiBOb0Vycm9yOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiAgIEVNTUNfU2VuZFN0b3BDb21tYW5kCioJSXNzdWVzIGEgc3RvcCBjb21tYW5kIGZvciBvcGVuIGVuZGVkIHJlYWQgYW5kIHdyaXRlIGJsb2NrIG9wZXJhdGlvbnMKKgoqICAgSW5wdXQ6CiogICAgICBQX1NETU1DX1Byb3BlcnRpZXNfVCBwU0RNTUNQIC0gcG9pbnRlciB0byB0aGUgU0RNTUMgY29udGV4dCBzdHJ1Y3R1cmUKKiAgIE91dHB1dDoKKiAgICAgIG5vbmUKKiAgIFJldHVybnM6CiogICAgICBub25lCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIEVNTUNfU2VuZFN0b3BDb21tYW5kKFBfU0RNTUNfUHJvcGVydGllc19UIHBTRE1NQ1ApCnsKCS8vUF9NTTRfU0RNTUNfQ09OVEVYVF9UIHBDb250ZXh0OwogCS8vIEFzc2lnbiBvdXIgY29udGV4dCB2YWx1ZQogCS8vcENvbnRleHQgPSAoUF9NTTRfU0RNTUNfQ09OVEVYVF9UKSBwU0RNTUNQLT5wQ29udGV4dDsKCiAJLy8gU2VuZCBhIENNRCAxMiB0byBzdG9wIHRyYW5zbWlzc2lvbnMuCglFTU1DX1NlbmRTZXR1cENvbW1hbmQocFNETU1DUCwgWExMUF9NTUNfQ01EMTIsIE1NNF9DTURfVFlQRV9OT1JNQUwsICh1aW50cHRyX3QpTlVMTCwgTU00XzQ4X1JFU19XSVRIX0JVU1kpOwoJRU1NQ19JbnRlcnByZXRfUmVzcG9uc2UocFNETU1DUCwgTU1DX1JFU1BPTlNFX1IxLCAweDEwMCk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgRU1NQ19JZAoqICAgICAgSWRlbnRpZmllcyB3aGljaCB0eXBlIG9mIGNhcmQgd2FzIGluc2VydGVkCiogICBJbnB1dDoKKgkgICBub25lCiogICBPdXRwdXQ6CiogICAgICBub25lCiogICBSZXR1cm5zOgoqICAgICAgV1RQIHJlY29naW5pemVkIFN1Y2Nlc3MvRmFpbCByZXR1cm4gY29kZQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdW5zaWduZWQgaW50IEVNTUNfSWQoUF9TRE1NQ19Qcm9wZXJ0aWVzX1QgcFNETU1DUCkKewoJLy9VSU5UX1QgdmNjID0gMTsKCS8vIExvY2FsIFZhcmlhYmxlcwoJVUlOVF9UIEFueUVycm9yID0gMDsKCVVJTlRfVCBhcmd1bWVudCA9IDA7CiAgICAJVUlOVF9UIGNudCA9IDA7CiAJLy8gQXNzaWduIG91ciBjb250ZXh0IHZhbHVlCglQX01NNF9TRE1NQ19DT05URVhUX1QgcENvbnRleHQgPSAoUF9NTTRfU0RNTUNfQ09OVEVYVF9UKSBwU0RNTUNQLT5wQ29udGV4dDsKCgkvLyBFbmFibGUgcG93ZXIsCXBDb250cm9sbGVyVm9sdGFnZSB3aWxsIGJlIHJldHVybmVkIHRvIHVwLWxldmVsIGZ1bmN0aW9uIGZvciB2b2xhdGFnZSBjaGVja2luZy4KLyoJIGlmKEVNTUNIQ19TZXRDb250cm9sbGVyVm9sdGFnZShwQ29udGV4dCwgdmNjKSkKCQlFTU1DSENfVmNjKHZjYyk7CiAgICAgICAgZWxzZQogICAgICAgICAgICByZXR1cm4gU0RNTUNEZXZpY2VWb2x0YWdlTm90U3VwcG9ydGVkOwogICAgKi8KCXBDb250ZXh0LT5wTU1DNFJlZy0+bW00X2Jsa19jbnRsID0gMDsKCgkvLyBDaGVjayBmb3IgSGlnaCBDYXBhY2l0eSBDYXJkcyBGaXJzdAoJLy8gU2VuZCBDTUQwIChHT19JRExFX1NUQVRFKSB0byBnZXQgY2FyZCBpbnRvIGlkbGUgc3RhdGUKCglFTU1DX1BSTihQUk5fSU5GTywgIlxuIHNlbmQgQ01EMCAoR09fSURMRV9TVEFURSkgdG8gZ2V0IGNhcmQgaW50byBpZGxlIHN0YXRlXG4iKTsKCWFyZ3VtZW50PSAwIDsKCUVNTUNfU2VuZFNldHVwQ29tbWFuZChwU0RNTUNQLCBYTExQX01NQ19DTUQwLCBNTTRfQ01EX1RZUEVfTk9STUFMLCBhcmd1bWVudCwgTU00X1JUX05PTkUgfCBNTTRfTk9fUkVTKTsKCglBbnlFcnJvciArPSBFTU1DX0ludGVycHJldF9SZXNwb25zZShwU0RNTUNQLCBNTUNfUkVTUE9OU0VfTk9ORSwgMHgxMCk7CglFTU1DX1BSTihQUk5fSU5GTywgIlxuIENNRDAgKEdPX0lETEVfU1RBVEUpIGRvbmUuIEVycm9yIG51bWJlciBpcyAlZFxuIixBbnlFcnJvcik7CgoJcFNETU1DUC0+U0QgPSBYTExQX01NQzsKCgkvLyBGaXJzdCB0aW1lLCBwYXNzIE5VTEwgYXJndW1lbnQgdG8gZ2V0IGJhY2sgdmFsdWVzIGNhcmQgaXMgY29tcGF0aWJsZSB3aXRoCgkvLyBTZW5kIGFwcHJvcHJpYXRlIENNRCBTZXF1ZW5jZSB0byBJZGVudGlmeSB0aGUgdHlwZSBvZiBjYXJkIGluc2VydGVkCglhcmd1bWVudCA9IDA7CglwU0RNTUNQLT5DYXJkUmVnLk9DUiA9IDA7CQkJLy8gTWFrZSBzdXJlIHRvIGNsZWFyIG91dCBPQ1IuCgljbnQgPSAwOwoJZG8KCXsKCQlFTU1DX1BSTihQUk5fSU5GTywgIlNlbmQgWExMUF9NTUNfQ01EMSB0byBNTUMgY2FyZFxuIik7CgkJRU1NQ19TZW5kU2V0dXBDb21tYW5kKHBTRE1NQ1AsIFhMTFBfTU1DX0NNRDEsIE1NNF9DTURfVFlQRV9OT1JNQUwsIGFyZ3VtZW50LCAgTU00X1JUX1IzfE1NNF80OF9SRVMpOwoJCUFueUVycm9yICs9IEVNTUNfSW50ZXJwcmV0X1Jlc3BvbnNlKHBTRE1NQ1AsIE1NQ19SRVNQT05TRV9SMywgMHgxMCk7CgovLwkJaWYgKGNudDwyMCkKCQkJYXJndW1lbnQgPSBwU0RNTUNQLT5DYXJkUmVnLk9DUiB8IDB4NDAwMDAwMDA7Ci8vCQllbHNlCi8vCQkJYXJndW1lbnQgPSBwU0RNTUNQLT5DYXJkUmVnLk9DUjsKCgkJRU1NQ19QUk4oUFJOX0lORk8sICJcbiBDTUQxIGFyZyA9MHglMDhYXG4iLCBhcmd1bWVudCk7CgoJCWlmIChjbnQgPiAxMDAwMCkKCQkJYnJlYWs7CgkJY250Kys7Cgl9IHdoaWxlICgoKHBTRE1NQ1AtPkNhcmRSZWcuT0NSICYgMHg4MDAwMDAwMCkgIT0gMHg4MDAwMDAwMCkpOwoKCWlmICgocFNETU1DUC0+Q2FyZFJlZy5PQ1IgJiAweDgwMDAwMDAwKSAhPSAweDgwMDAwMDAwKQoJewoJCUVNTUNfUFJOKFBSTl9SRVMsIklEIENhcmQ6IE5vdEZvdW5kRXJyb3IscFNETU1DUC0+Q2FyZFJlZy5PQ1IgPTB4JVhcbiIscFNETU1DUC0+Q2FyZFJlZy5PQ1IpOwoJCXJldHVybiBOb3RGb3VuZEVycm9yOwoJfQoKICAgIGlmICghKHBTRE1NQ1AtPkNhcmRSZWcuT0NSICYgKE1NQ19PQ1JfVk9MVEFHRV9BTEx8U0RfT0NSX1ZPTFRBR0VfMV84KSkgKQogICAgewogICAgICAgIEVNTUNfUFJOKFBSTl9SRVMsImRldmljZSB2b2x0YWdlIG5vdCBzdXBwb3J0ZWQsIHBTRE1NQ1AtPkNhcmRSZWcuT0NSPTB4JXhcbiIscFNETU1DUC0+Q2FyZFJlZy5PQ1IpOwogICAgICAgIHJldHVybiBTRE1NQ0RldmljZVZvbHRhZ2VOb3RTdXBwb3J0ZWQ7CiAgICB9CgkvLyBBc3NpZ24gQWNjZXNzIE1vZGUuCglpZiAocFNETU1DUC0+Q2FyZFJlZy5PQ1IgJiBPQ1JfQUNDRVNTX01PREVfTUFTSykKCQlwU0RNTUNQLT5BY2Nlc3NNb2RlID0gU0VDVE9SX0FDQ0VTUzsKCWVsc2UKCQlwU0RNTUNQLT5BY2Nlc3NNb2RlID0gQllURV9BQ0NFU1M7CgoJRU1NQ19QUk4oUFJOX0lORk8sIlxuXG4gQ01EMSBDYXJkIE9DUj0weCUwOHggXG4iLHBTRE1NQ1AtPkNhcmRSZWcuT0NSKTsKCXJldHVybiBOb0Vycm9yOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiAgIEVNTUNfSW5pdAoqICAgICAgSW5pdGlhbGl6ZXMgdGhlIGluc2VydGVkIGNhcmQKKiAgIElucHV0OgoqCSAgIG5vbmUKKiAgIE91dHB1dDoKKiAgICAgIG5vbmUKKiAgIFJldHVybnM6CiogICAgICBXVFAgcmVjb2dpbml6ZWQgU3VjY2Vzcy9GYWlsIHJldHVybiBjb2RlCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpVSU5UX1QgRU1NQ19Jbml0KHZvaWQpCnsKICAgIFVJTlRfVCBhcmd1bWVudCwgUmV0dmFsOwogICAgLy9VSU5UX1QgY29udHJvbGxlcnZvbHRhZ2U7CiAgICB2b2xhdGlsZSB1bnNpZ25lZCBpbnQgaT0wOwoKICAgIFBfTU00X1NETU1DX0NPTlRFWFRfVCBwQ29udGV4dDsKICAgIFBfTU00X0JMS19DTlRMIHBNTTRfQkxLX0NOVEw7CiAgICAvLyBJbml0aWFsaXplIEZsYXNoIFByb3BlcnRpZXMKCiAgICBQX1NETU1DX1Byb3BlcnRpZXNfVCBwU0RNTUNQID0gRU1NQ19HZXRQcm9wZXJ0aWVzKCk7CgogICAgLy8gQXNzaWduIG91ciBjb250ZXh0IHZhbHVlCiAgICBwQ29udGV4dCA9IChQX01NNF9TRE1NQ19DT05URVhUX1QpIHBTRE1NQ1AtPnBDb250ZXh0OwoKICAgIC8vTXVzdCBzZXQgTU1DIE5VTUJMSwogICAgcE1NNF9CTEtfQ05UTCA9IChQX01NNF9CTEtfQ05UTCkgJnBDb250ZXh0LT5wTU1DNFJlZy0+bW00X2Jsa19jbnRsOwogICAgcE1NNF9CTEtfQ05UTC0+YmxrX2NudCA9IDE7CiAgICBwTU00X0JMS19DTlRMLT54ZnJfYmxrc3ogPTUxMjsgLy81MTIgYnl0ZQoKI2lmIFNESU9fRE1BCiAgICBwU0RNTUNQLT5TRE1BX01vZGUgPSBUUlVFOwojZWxzZQogICAgcFNETU1DUC0+U0RNQV9Nb2RlID0gRkFMU0U7CiNlbmRpZgoKCWRiZ19wcmludGYoUFJOX0lORk8sImdvIHRvIGlkZW50aWZpY2F0aW9uXG4iKTsKICAgIFJldHZhbCA9IEVNTUNfSWQocFNETU1DUCk7CgogICAgaWYgKFJldHZhbCAhPSBOb0Vycm9yKQoJCXJldHVybiBSZXR2YWw7CglkYmdfcHJpbnRmKFBSTl9JTkZPLCJkb25lIVxuIik7CgkvLyBTZXQgdXAgU3RhdGUKICAgIHBTRE1NQ1AtPlN0YXRlID0gSU5JVElBTElaRTsKLyoKICAgIFJldHZhbCA9IEVNTUNfQ2hlY2tWb2x0YWdlQ29tcGF0aWJpbGl0eShwU0RNTUNQLCBjb250cm9sbGVydm9sdGFnZSk7CiAgICBpZiAoUmV0dmFsICE9IE5vRXJyb3IpCgkJcmV0dXJuIFNETU1DSW5pdGlhbGl6YXRpb25FcnJvcjsgLy8gV2UgY291bGRuJ3QgZmluZCBhbnkgY2FyZHMKICAgIEVNTUNfUFJOKFBSTl9JTkZPLCJFTU1DX0NoZWNrVm9sdGFnZUNvbXBhdGliaWxpdHkgZG9uZSFcbiIpOwoqLwoJLy9zZW5kIENNRDIgdG8gZ2V0IHRoZSBDSUQgbnVtYmVycwogICAgYXJndW1lbnQgPSBOT19BUkdVTUVOVDsKICAgIEVNTUNfU2VuZFNldHVwQ29tbWFuZChwU0RNTUNQLCBYTExQX01NQ19DTUQyLCBNTTRfQ01EX1RZUEVfTk9STUFMLCBhcmd1bWVudCwgTU00X1JUX1IyfCBNTTRfMTM2X1JFUyk7CiAgICBSZXR2YWwgPSBFTU1DX0ludGVycHJldF9SZXNwb25zZShwU0RNTUNQLCBNTUNfUkVTUE9OU0VfUjIsIDB4MTAwKTsKICAgIGlmIChSZXR2YWwgIT0gTm9FcnJvcikKICAgIHsKCQlkYmdfcHJpbnRmKFBSTl9FUlIsIkNNRDI6IFNETU1DSW5pdCBFcnJvciBSZXR2YWw9MHgleCBcbiIsUmV0dmFsKTsKCQlyZXR1cm4gU0RNTUNJbml0aWFsaXphdGlvbkVycm9yOwogICAgfQoKICAgIEVNTUNfR2V0X0NJRChwU0RNTUNQKTsgICAvL0tUIGFkZGVkIDsgcHJpbnQgb3V0IENJRAoKICAgIHBTRE1NQ1AtPkNhcmRSZWcuUkNBID0gcFNETU1DUC0+Q2FyZFJlZy5DSUQuU2VyaWFsTnVtICYgMHhGRkZGMDAwMDsKICAgIGFyZ3VtZW50ID0gcFNETU1DUC0+Q2FyZFJlZy5SQ0E7CiAgICBFTU1DX1NlbmRTZXR1cENvbW1hbmQocFNETU1DUCwgWExMUF9NTUNfQ01EMywgTU00X0NNRF9UWVBFX05PUk1BTCwgYXJndW1lbnQsIE1NNF9SVF9SMSB8IE1NNF80OF9SRVMpOwogICAgUmV0dmFsID0gRU1NQ19JbnRlcnByZXRfUmVzcG9uc2UocFNETU1DUCwgTU1DX1JFU1BPTlNFX1IxLCAweDEwMCk7CgogICAgaWYgKFJldHZhbCAhPSBOb0Vycm9yKQogICAgewoJCWRiZ19wcmludGYoUFJOX0VSUiwiQ01EMzogU0RNTUNJbml0IEVycm9yIFJldHZhbD0weCV4IFxuIixSZXR2YWwpOwoJCXJldHVybiBTRE1NQ0luaXRpYWxpemF0aW9uRXJyb3I7CiAgICB9CgogICAgRU1NQ19QUk4oUFJOX0lORk8sIlxuIENJRF9TZXJpYWxOdW09JTA4eCAgUkNBPSV4IFxuIixwU0RNTUNQLT5DYXJkUmVnLkNJRC5TZXJpYWxOdW0scFNETU1DUC0+Q2FyZFJlZy5SQ0EpOwoKICAgIC8vc2VuZCBDTUQxMyB0byBjaGVjayB0aGUgc3RhdHVzIG9mIHRoZSBjYXJkCiAgICBSZXR2YWwgPSBFTU1DX0NoZWNrQ2FyZFN0YXR1cyhwU0RNTUNQLCAweDcwMCwgUjFfTE9DS0VEQ0FSRE1BU0spOwkJLy8gTWFrZSBzdXJlIGNhcmQgaXMgc3RkYnkgbW9kZQogICAgaWYgKFJldHZhbCAhPSBOb0Vycm9yKQogICAgewoJCWRiZ19wcmludGYoUFJOX0VSUiwiQ01EMTM6IGNoZWNrIHN0YXR1cyBFcnJvciBSZXR2YWw9MHgleCBcbiIsUmV0dmFsKTsKCQlyZXR1cm4gU0RNTUNJbml0aWFsaXphdGlvbkVycm9yOwogICAgfQoKICAgIC8vIFNlbmQgQ01EIDkgdG8gcmV0cmlldmUgdGhlIENTRAogICAgYXJndW1lbnQgPSBwU0RNTUNQLT5DYXJkUmVnLlJDQTsKICAgIEVNTUNfU2VuZFNldHVwQ29tbWFuZChwU0RNTUNQLCBYTExQX01NQ19DTUQ5LCBNTTRfQ01EX1RZUEVfTk9STUFMLCBhcmd1bWVudCwgTU00X1JUX1IyIHwgTU00XzEzNl9SRVMpOwogICAgUmV0dmFsID0gRU1NQ19JbnRlcnByZXRfUmVzcG9uc2UocFNETU1DUCwgTU1DX1JFU1BPTlNFX1IyLCAweDEwMCk7CgogICAgRU1NQ19HZXRfQ1NEKHBTRE1NQ1ApOyAgIC8vS1QgYWRkZWQ7IHByaW50IG91dCBDU0QKCiAgICAvL3NlbmQgQ01ENyB0byBnZXQgY2FyZCBpbnRvIHRyYW5zZmVyIHN0YXRlCiAgICBhcmd1bWVudCA9IHBTRE1NQ1AtPkNhcmRSZWcuUkNBOwogICAgRU1NQ19QUk4oUFJOX0lORk8sIlxuIENtZCVkIEFyZ3VtZW50PSV4ICBSQ0E9JXggXG4iLFhMTFBfTU1DX0NNRDcsYXJndW1lbnQscFNETU1DUC0+Q2FyZFJlZy5SQ0EpOwogICAgRU1NQ19TZW5kU2V0dXBDb21tYW5kKHBTRE1NQ1AsIFhMTFBfTU1DX0NNRDcsIE1NNF9DTURfVFlQRV9OT1JNQUwsIGFyZ3VtZW50LCBNTTRfNDhfUkVTX1dJVEhfQlVTWSk7CiAgICBSZXR2YWwgfD0gRU1NQ19JbnRlcnByZXRfUmVzcG9uc2UocFNETU1DUCwgTU1DX1JFU1BPTlNFX1IxQiwgMHgxMDApOwoKICAgIC8vc2VuZCBDTUQxMyB0byBjaGVjayB0aGUgc3RhdHVzIG9mIHRoZSBjYXJkCiAgICAvL1JldHZhbCB8PSBNTTRfQ2hlY2tDYXJkU3RhdHVzKHBTRE1NQ1AsIDB4NzAwKTsJCS8vIE1ha2Ugc3VyZSBjYXJkIGlzIHN0ZGJ5IG1vZGUKICAgIFJldHZhbCB8PSBFTU1DX0NoZWNrQ2FyZFN0YXR1cyhwU0RNTUNQLCAweDkwMCwgUjFfTE9DS0VEQ0FSRE1BU0spOwkJLy8gTWFrZSBzdXJlIGNhcmQgaXMgaW4gdHJhbnNmZXIgbW9kZQogICAgaSA9IDA7CiAgICB3aGlsZShSZXR2YWwgIT0gTm9FcnJvcikKCXsKCQlkZWxheV9tcygxKTsKCQlSZXR2YWwgPSBFTU1DX0NoZWNrQ2FyZFN0YXR1cyhwU0RNTUNQLCAweDkwMCwgUjFfTE9DS0VEQ0FSRE1BU0spOwkJLy8gTWFrZSBzdXJlIGNhcmQgaXMgdHJhbnNmZXIgbW9kZQoJCWlmKGk+MTAwMDApCgkJCWJyZWFrOwoJCWkrKzsKCX0KCWlmIChSZXR2YWwgIT0gTm9FcnJvcikKICAgIHsKCQlkYmdfcHJpbnRmKFBSTl9FUlIsIkNNRDEzOiBjaGVjayBzdGF0dXMoYWZ0ZXIgQ01ENykgRXJyb3IgUmV0dmFsPTB4JXggXG4iLFJldHZhbCk7CgkJcmV0dXJuIFNETU1DSW5pdGlhbGl6YXRpb25FcnJvcjsKICAgIH0KCgkvLyBDTUQgMTYgU2V0IEJsb2NrIExlbmd0aAogICAgYXJndW1lbnQgPSBwU0RNTUNQLT5SZWFkQmxvY2tTaXplOwogICAgRU1NQ19TZW5kU2V0dXBDb21tYW5kKHBTRE1NQ1AsIFhMTFBfTU1DX0NNRDE2LCBNTTRfQ01EX1RZUEVfTk9STUFMLCBhcmd1bWVudCwgTU00XzQ4X1JFUyk7CiAgICBSZXR2YWwgPSBFTU1DX0ludGVycHJldF9SZXNwb25zZShwU0RNTUNQLCBNTUNfUkVTUE9OU0VfUjEsIDB4MTAwKTsKICAgIC8vIFNldCB0aGUgYmxvY2sgbGVuZ3RoIGZvciB0aGUgY29udHJvbGxlcgogICAgcENvbnRleHQtPnBNTUM0UmVnLT5tbTRfYmxrX2NudGwgPSBhcmd1bWVudDsKCgkvLyBzZW5kIENNRDEzIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIGNhcmQKCVJldHZhbCB8PSBFTU1DX0NoZWNrQ2FyZFN0YXR1cyhwU0RNTUNQLCAweDkwMCwgUjFfTE9DS0VEQ0FSRE1BU0spOyAvLyBNYWtlIHN1cmUgY2FyZCBpcyBzdGRieSBtb2RlCiAgICBpZiAoUmV0dmFsICE9IE5vRXJyb3IpCiAgICB7CgkJZGJnX3ByaW50ZihQUk5fRVJSLCJDTUQxMzogY2hlY2sgc3RhdHVzKGFmdGVyIGNoYW5naW5nIGJsb2NrIGxlbmd0aCkgRXJyb3IgUmV0dmFsPTB4JXggXG4iLFJldHZhbCk7CgkJcmV0dXJuIFNETU1DSW5pdGlhbGl6YXRpb25FcnJvcjsKICAgIH0KCgkvLyBBZGp1c3QgY2xvY2sgc3BlZWQgdG8gPD0gMjZNSHogYWZ0ZXIgaWRlbnRpZmljYXRpb24KICAgIC8vIEZvciBFTU1DLCB0aGUgY29udHJvbGwncyBQTEwgaXMgTkFOREVDQ0NMT0NLIGNsb2NrLzQuIHRoZSBvdXRwdXQgY2xvY2sgaXMgU0RJTzNQTEwvKDIqcmF0ZSkKICAgIC8vIGlmIHJhdGUgPSAwLCBvdXRwdXQgY2xvY2sgaXMgc2FtZSB3aXRoIFNESU8zUExMLi4KI2lmIGRlZmluZWQoQkVSTElOX1NPQ19BUzM3MCkKCUVNTUNIQ19TZXRCdXNSYXRlKHBDb250ZXh0LCBTRENMS19TRUxfRElWXzE2KTsKI2Vsc2UKCUVNTUNIQ19TZXRCdXNSYXRlKHBDb250ZXh0LCBTRENMS19TRUxfRElWXzY0KTsJLy8gNDAwTUh6LzMyID0gMTIuNU1IegojZW5kaWYKCiAgICAvL3NlbmQgQ01EMTMgdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiB0aGUgY2FyZAogICAgUmV0dmFsIHw9IEVNTUNfQ2hlY2tDYXJkU3RhdHVzKHBTRE1NQ1AsIDB4OTAwLCBSMV9MT0NLRURDQVJETUFTSyk7CQkvLyBNYWtlIHN1cmUgY2FyZCBpcyBzdGRieSBtb2RlCiAgICBpZiAoUmV0dmFsICE9IE5vRXJyb3IpCiAgICB7CgkJZGJnX3ByaW50ZihQUk5fRVJSLCJDTUQxMzogY2hlY2sgc3RhdHVzKGFmdGVyIGNoYW5naW5nIGNsb2NrIHJhdGUpIEVycm9yIFJldHZhbD0weCV4IFxuIixSZXR2YWwpOwoJCXJldHVybiBTRE1NQ0luaXRpYWxpemF0aW9uRXJyb3I7CiAgICB9CgoJLy8gQXR0ZW1wdCB0byBJbmNyZWFzZSBCdXMgd2lkdGgKCS8vIDMvMTY6CXRoZSBmb2xsb3dpbmcgY29kZSBpcyBmcm9tIEFQU0UKCiAgICBSZXR2YWwgPSBFTU1DX1NldEJ1c1dpZHRoKHBTRE1NQ1AsIDIpOwogICAgaWYgKFJldHZhbCAhPSBOb0Vycm9yKQogICAgewoJCXJldHVybiBTRE1NQ0luaXRpYWxpemF0aW9uRXJyb3I7CiAgICB9CgoJUmV0dmFsID0gRU1NQ19Td2l0Y2hfSFMocFNETU1DUCk7CglpZiAoUmV0dmFsICE9IE5vRXJyb3IpCiAgICB7CgkJcmV0dXJuIFNETU1DSW5pdGlhbGl6YXRpb25FcnJvcjsKICAgIH0KCiNpZiBkZWZpbmVkKEJFUkxJTl9TT0NfQVMzNzApCglFTU1DSENfU2V0QnVzUmF0ZShwQ29udGV4dCwgU0RDTEtfU0VMX0RJVl8yKTsKI2Vsc2UKCUVNTUNIQ19TZXRCdXNSYXRlKHBDb250ZXh0LCBTRENMS19TRUxfRElWXzgpOwojZW5kaWYKCiAgICAvL3NlbmQgQ01EMTMgdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiB0aGUgY2FyZAogICAgUmV0dmFsIHw9IEVNTUNfQ2hlY2tDYXJkU3RhdHVzKHBTRE1NQ1AsIDB4OTAwLCBSMV9MT0NLRURDQVJETUFTSyk7CQkvLyBNYWtlIHN1cmUgY2FyZCBpcyBzdGRieSBtb2RlCiAgICBpZiAoUmV0dmFsICE9IE5vRXJyb3IpCiAgICB7CgkJZGJnX3ByaW50ZihQUk5fRVJSLCJDTUQxMzogY2hlY2sgc3RhdHVzKEhTIGFmdGVyIGNoYW5naW5nIGNsb2NrIHJhdGUpIEVycm9yIFJldHZhbD0weCV4IFxuIixSZXR2YWwpOwoJCXJldHVybiBTRE1NQ0luaXRpYWxpemF0aW9uRXJyb3I7CiAgICB9CgogICAgLy8gU2V0IHVwIFN0YXRlLCBSZWFkeSBmb3IgRGF0YSB0cmFuc2ZlcnMKICAgIHBTRE1NQ1AtPlN0YXRlID0gUkVBRFk7CgogICAgcmV0dXJuIE5vRXJyb3I7Cn0KCgp2b2xhdGlsZSBTRElPX0FETUFfREVTQ19QVFIgcEFEbWFfVHggOwp2b2xhdGlsZSBTRElPX0FETUFfREVTQ19QVFIgcEFEbWFfUnggOwpleHRlcm4gdm9pZCBFTU1DSENfRG1hU2VsZWN0KFBfTU00X1NETU1DX0NPTlRFWFRfVCBwQ29udGV4dCwgVUlOVF9UIHNlbGVjdCk7Cgp2b2lkIEVNTUNfU2V0dXBBRE1BKGludCBhZG1hX2RpciwgaW50IGJsb2NrcykKewogICAgaW50IGk7CiAgICB1bnNpZ25lZCBpbnQgYnVmOwogICAgU0RJT19BRE1BX0RFU0NfUFRSIHBEbWE7CiAgICBQX01NNF9TRE1NQ19UIHBTRFJFRzsKCiAgICBQX1NETU1DX1Byb3BlcnRpZXNfVCBwU0RNTUNQID0gRU1NQ19HZXRQcm9wZXJ0aWVzKCk7CgogICAgUF9NTTRfU0RNTUNfQ09OVEVYVF9UIHBTRENYVCA9IChQX01NNF9TRE1NQ19DT05URVhUX1QpcFNETU1DUC0+cENvbnRleHQ7CiAgICBwU0RSRUc9KFBfTU00X1NETU1DX1QpKHBTRENYVC0+cE1NQzRSZWcpOwoKICAgIGlmIChhZG1hX2Rpcj09MSkKICAgIHsKICAgICAgICBwRG1hPXBBRG1hX1R4OwogICAgICAgIGJ1Zj1TRElPX1dEX0JVRjsKICAgICAgICBwU0RSRUctPm1tNF9hZG1hX3N5c3RlbV9hZGRyZXNzWzBdPSh1aW50cHRyX3QpcEFEbWFfVHg7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgcERtYT1wQURtYV9SeDsKICAgICAgICBidWY9U0RJT19SRF9CVUY7CiAgICAgICAgcFNEUkVHLT5tbTRfYWRtYV9zeXN0ZW1fYWRkcmVzc1swXT0odWludHB0cl90KXBBRG1hX1J4OwogICAgfQogICAgRU1NQ19QUk4oUFJOX0lORk8sIlxuIEFETUEyIHNldHVwIGRlc2NyaXB0b3IgYXQgMHglMDh4IGFuZCBidWZmZXIgYXQgMHglMDh4LiAiLCh1bnNpZ25lZCBpbnQpKHVpbnRwdHJfdClwRG1hLCh1bnNpZ25lZCBpbnQpKHVpbnRwdHJfdClidWYpOwogICAgZm9yIChpPTA7IGk8YmxvY2tzLzI7aSsrKQogICAgewogICAgICAgIG1lbXNldChwRG1hLDAsOCk7CgogICAgICAgIHBEbWEtPnZhbGlkPTE7CiAgICAgICAgcERtYS0+ZW5kPTA7CiAgICAgICAgcERtYS0+aW50ZXJydXB0PTA7CgogICAgICAgIHBEbWEtPmFjdDE9MDsgIAkJLy9UcmFuCiAgICAgICAgcERtYS0+YWN0Mj0xOwoKICAgICAgICBwRG1hLT5sZW5ndGg9MHg0MDA7CS8vIHR3byBibG9jayBwZXIgZGVzY3JpcHRvcgogICAgICAgIHBEbWEtPmFkZHI9YnVmKyhpKjB4NDAwKTsKICAgICAgICAvL3BEbWEtPmFkZHI9YnVmKyhpKjB4NDAwKSsoaSo0KTsgIC8vIHRlc3RpbmcgcHVycG9zZQoKICAgICAgICAvL2VuZCBvZiBkZXNjcmlwdG9yIGZvciBldmVuIG51bSBvZiBibGsKICAgICAgICBpZiAoIShibG9ja3MlMikmJihpKzEpPj0oYmxvY2tzLzIpKQogICAgICAgIAlwRG1hLT5lbmQ9MTsgICAgICAvLyBlbmQgb2YgZGVzY3JpcHRvcgoKICAgICAgICBwRG1hKys7CiAgICB9CgogICAgaWYoYmxvY2tzJTIpLy9lbmQgb2YgZGVzY3JpcHRvciBmb3Igb2RkIG51bSBvZiBibGsKICAgIHsKICAgICAgICBtZW1zZXQocERtYSwwLDgpOwoKICAgICAgICBwRG1hLT52YWxpZD0xOwogICAgICAgIHBEbWEtPmVuZD0xOwogICAgICAgIHBEbWEtPmludGVycnVwdD0wOwoKICAgICAgICBwRG1hLT5hY3QxPTA7ICAJCS8vVHJhbgogICAgICAgIHBEbWEtPmFjdDI9MTsKCiAgICAgICAgcERtYS0+bGVuZ3RoPTB4MjAwOwkvLyB0d28gYmxvY2sgcGVyIGRlc2NyaXB0b3IKICAgICAgICBwRG1hLT5hZGRyPWJ1ZisoaSoweDQwMCk7Ly9pIGFscmVhZHkgKzEgaW4gdGhlIGxhc3QgaXRlcmF0aW9uCiAgICAgICAgcERtYSsrOwoKICAgIH0KCgkvL3BTRFJFRy0+bW00X2FkbWFfc3lzdGVtX2FkZHJlc3NbMF09cEFEbWFfVHg7CgkvLyBETUEgc2VsZWN0CglFTU1DSENfRG1hU2VsZWN0KHBTRENYVCwweDAyKTsgICAvLyBkbWEgc2VsZWN0PTEwYiAzMmJpdCBBRE1BMgoKCUVNTUNfUFJOKFBSTl9JTkZPLCJcbiBBRE1BMiBzZXR1cCBmb3IgJWQgZGVzY3JpcHRvci4gIixpKTsKfQoKI2lmbmRlZiBESVNBQkxFX0VSQVNFX1dSSVRFCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgIEVNTUNfRXJhc2VCbG9ja3MoKQoqCQlFcmFzZXMgcmVxdWlyZWQgbnVtYmVyIG9mIGJsb2NrcyBhdCBDYXJkQWRkcmVzcwoqICAgIGlucHV0OgoqCQlub25lCiogICAgb3V0cHV0OgoqCQlCbG9ja3MgZXJhc2VkIG9uIGVyYXNlIGdyb3VwIGFsaWdubWVudAoqICAgIHJldHVybnM6CiogICAgICAgbm9uZQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovClVJTlRfVCBFTU1DX0VyYXNlQmxvY2tzKHZvaWQpCnsKICAgIFVJTlRfVCAgQ21kOwogICAgVUlOVF9UIFJldHZhbCA9IE5vRXJyb3I7CiAgICBsb25nIGxvbmcgYXJndW1lbnQ7CiAgICAvL1VJTlRfVCBmbGFncyA9IE5PX0ZMQUdTOwogICAgLy9QX01NNF9TRE1NQ19DT05URVhUX1QgcENvbnRleHQ7CgogICAgLy8gSW5pdGlhbGl6ZSBGbGFzaCBQcm9wZXJ0aWVzCiAgICBQX1NETU1DX1Byb3BlcnRpZXNfVCBwU0RNTUNQID0gRU1NQ19HZXRQcm9wZXJ0aWVzKCk7CgogICAgLy8gQXNzaWduIG91ciBjb250ZXh0IHZhbHVlCiAgICAvL3BDb250ZXh0ID0gKFBfTU00X1NETU1DX0NPTlRFWFRfVCkgcFNETU1DUC0+cENvbnRleHQ7CgogICAgQ21kID0gWExMUF9NTUNfQ01EMzU7CgogICAgLy9hcmd1bWVudCA9IHBTRE1NQ1AtPlRyYW5zLkNhcmRBZGRyZXNzOwogICAgaWYgKHBTRE1NQ1AtPkNhcmRSZWcuT0NSICYgT0NSX0FDQ0VTU19NT0RFX01BU0spCiAgICAJYXJndW1lbnQgPSBwU0RNTUNQLT5UcmFucy5DYXJkQWRkcmVzcy9wU0RNTUNQLT5SZWFkQmxvY2tTaXplOy8vZm9yIGJsb2NrIG1vZGUKICAgIGVsc2UKICAgIAlhcmd1bWVudCA9IHBTRE1NQ1AtPlRyYW5zLkNhcmRBZGRyZXNzOwogICAgRU1NQ19TZW5kU2V0dXBDb21tYW5kKHBTRE1NQ1AsIENtZCwgTU00X0NNRF9UWVBFX05PUk1BTCwgKHVuc2lnbmVkIGludClhcmd1bWVudCwgTU00XzQ4X1JFUyk7CiAgICBSZXR2YWwgPSBFTU1DX0ludGVycHJldF9SZXNwb25zZShwU0RNTUNQLCBNTUNfUkVTUE9OU0VfUjEsIDB4MTAwKTsKICAgIGlmIChSZXR2YWwgIT0gTm9FcnJvcikKICAgIHsKCQlwU0RNTUNQLT5TdGF0ZSA9IEZBVUxUOwoJCXJldHVybiBFcmFzZUVycm9yOwogICAgfQoKICAgIENtZCA9IFhMTFBfTU1DX0NNRDM2OwoKICAgIC8vYXJndW1lbnQgPSBwU0RNTUNQLT5UcmFucy5DYXJkQWRkcmVzcyArIHBTRE1NQ1AtPlRyYW5zLlRyYW5zV29yZFNpemUqNDsKICAgIGlmIChwU0RNTUNQLT5DYXJkUmVnLk9DUiAmIE9DUl9BQ0NFU1NfTU9ERV9NQVNLKQogICAgICAgIGFyZ3VtZW50ID0gcFNETU1DUC0+VHJhbnMuQ2FyZEFkZHJlc3MvcFNETU1DUC0+UmVhZEJsb2NrU2l6ZSArIHBTRE1NQ1AtPlRyYW5zLk51bUJsb2Nrcy0xOy8vZm9yIGJsb2NrIG1vZGUKICAgIGVsc2UKICAgICAgICBhcmd1bWVudCA9IHBTRE1NQ1AtPlRyYW5zLkNhcmRBZGRyZXNzICsgKHBTRE1NQ1AtPlRyYW5zLlRyYW5zV29yZFNpemUtMSkqNDsKICAgIEVNTUNfU2VuZFNldHVwQ29tbWFuZChwU0RNTUNQLCBDbWQsIE1NNF9DTURfVFlQRV9OT1JNQUwsICh1bnNpZ25lZCBpbnQpYXJndW1lbnQsIE1NNF80OF9SRVMpOwogICAgUmV0dmFsID0gRU1NQ19JbnRlcnByZXRfUmVzcG9uc2UocFNETU1DUCwgTU1DX1JFU1BPTlNFX1IxLCAweDEwMCk7CiAgICBpZiAoUmV0dmFsICE9IE5vRXJyb3IpCiAgICB7CgkJcFNETU1DUC0+U3RhdGUgPSBGQVVMVDsKCQlyZXR1cm4gRXJhc2VFcnJvcjsKICAgIH0KCiAgICAvLyBDTUQgMzgKICAgIENtZD1YTExQX1NEX0NNRDM4OwogICAgYXJndW1lbnQgPSAweDAwMDAwMDAxOyAvLyBVc2UgVHJpbS4gZXJhc2UgdWludCBzaXplIGlzIHdyaXRlYmxvY2sgaW5zdGVhZCBvZiBlcmFzZSBncm91cAogICAgRU1NQ19TZW5kU2V0dXBDb21tYW5kKHBTRE1NQ1AsIENtZCwgTU00X0NNRF9UWVBFX05PUk1BTCwgKHVuc2lnbmVkIGludClhcmd1bWVudCwgTU00XzQ4X1JFU19XSVRIX0JVU1kpOwogICAgUmV0dmFsID0gRU1NQ19JbnRlcnByZXRfUmVzcG9uc2UocFNETU1DUCwgTU1DX1JFU1BPTlNFX1IxQiwgMHg4MDAwKTsKICAgIGlmIChSZXR2YWwgIT0gTm9FcnJvcikKICAgIHsKCQlSZXR2YWwgPSBFcmFzZUVycm9yOwoJCXBTRE1NQ1AtPlN0YXRlID0gRkFVTFQ7CiAgICB9CiAgICBlbHNlCiAgICB7CgkJcFNETU1DUC0+U3RhdGUgPSBSRUFEWTsKICAgIH0KICAgIHJldHVybiBSZXR2YWw7Cn0KI2VuZGlmCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgU0RNTUNHZXRDYXJkRXJyb3JTdGF0ZQoqCiogICBJbnB1dDoKKgkJcFNETU1DUCAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgY29udGV4dAoqICAgT3V0cHV0OgoqICAgICAgbm9uZQoqICAgUmV0dXJuczoKKiAgICAgIENvbnZlcnRzIHRoZSBlcnJvciBjb2RlIHJlYWQgaW4gZnJvbSB0aGUgY2FyZCBhcyBSMSB2YWx1ZSBpbiB0bwoqIAkgICBhIFdUUFRQIHJlY29nbml6ZWQgcmV0dXJuIHZhbHVlCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpVSU5UX1QgRU1NQ19HZXRDYXJkRXJyb3JTdGF0ZShQX1NETU1DX1Byb3BlcnRpZXNfVCBwU0RNTUNQKQp7CglFTU1DX1BSTihQUk5fSU5GTywgIlNESU9HZXRDYXJkRXJyb3JTdGF0ZToJcFNETU1DUC0+Q2FyZFJlcG9uc2UuUjFfUkVTUCA9IDB4JXgiLCBwU0RNTUNQLT5DYXJkUmVwb25zZS5SMV9SRVNQKTsKCglpZiAoKHBTRE1NQ1AtPkNhcmRSZXBvbnNlLlIxX1JFU1AgJiBSMV9TV0lUQ0hfRVJST1IpID09IFIxX1NXSVRDSF9FUlJPUil7CgkJRU1NQ19QUk4oUFJOX0lORk8sICJTRElPR2V0Q2FyZEVycm9yU3RhdGU6CVIxX1NXSVRDSF9FUlJPUiIpOwoJCXJldHVybiBTRE1NQ19TV0lUQ0hfRVJST1I7Cgl9CglpZiAoKHBTRE1NQ1AtPkNhcmRSZXBvbnNlLlIxX1JFU1AgJiBSMV9FUkFTRV9SRVNFVF9FUlJPUikgPT0gUjFfRVJBU0VfUkVTRVRfRVJST1IpewoJCUVNTUNfUFJOKFBSTl9JTkZPLCAiU0RJT0dldENhcmRFcnJvclN0YXRlOglSMV9FUkFTRV9SRVNFVF9FUlJPUiIpOwoJCXJldHVybiBTRE1NQ19FUkFTRV9SRVNFVF9FUlJPUiA7Cgl9CglpZiAoKHBTRE1NQ1AtPkNhcmRSZXBvbnNlLlIxX1JFU1AgJiBSMV9DSURDU0RfT1ZFUldSSVRFX0VSUk9SKSA9PSBSMV9DSURDU0RfT1ZFUldSSVRFX0VSUk9SKXsKCQlFTU1DX1BSTihQUk5fSU5GTywgIlNESU9HZXRDYXJkRXJyb3JTdGF0ZToJUjFfQ0lEQ1NEX09WRVJXUklURV9FUlJPUiIpOwoJCXJldHVybiBTRE1NQ19DSURDU0RfT1ZFUldSSVRFX0VSUk9SOwoJfQoJaWYgKChwU0RNTUNQLT5DYXJkUmVwb25zZS5SMV9SRVNQICYgUjFfT1ZFUlJVTl9FUlJPUikgPT0gUjFfT1ZFUlJVTl9FUlJPUil7CgkJRU1NQ19QUk4oUFJOX0lORk8sICJTRElPR2V0Q2FyZEVycm9yU3RhdGU6CVIxX09WRVJSVU5fRVJST1IiKTsKCQlyZXR1cm4gU0RNTUNfT1ZFUlJVTl9FUlJPUjsKCX0KCWlmICgocFNETU1DUC0+Q2FyZFJlcG9uc2UuUjFfUkVTUCAmIFIxX1VOREVSVU5fRVJST1IpID09IFIxX1VOREVSVU5fRVJST1IpewoJCUVNTUNfUFJOKFBSTl9JTkZPLCAiU0RJT0dldENhcmRFcnJvclN0YXRlOglSMV9VTkRFUlVOX0VSUk9SIik7CgkJcmV0dXJuIFNETU1DX1VOREVSVU5fRVJST1I7Cgl9CglpZiAoKHBTRE1NQ1AtPkNhcmRSZXBvbnNlLlIxX1JFU1AgJiBSMV9DQ19FUlJPUikgPT0gUjFfQ0NfRVJST1IpewoJCUVNTUNfUFJOKFBSTl9JTkZPLCAiU0RJT0dldENhcmRFcnJvclN0YXRlOglSMV9DQ19FUlJPUiIpOwoJCXJldHVybiBTRE1NQ19DQ19FUlJPUjsKCX0KCWlmICgocFNETU1DUC0+Q2FyZFJlcG9uc2UuUjFfUkVTUCAmIFIxX0VDQ19FUlJPUikgPT0gUjFfRUNDX0VSUk9SKXsKCQlFTU1DX1BSTihQUk5fSU5GTywgIlNESU9HZXRDYXJkRXJyb3JTdGF0ZToJUjFfRUNDX0VSUk9SIik7CgkJcmV0dXJuIFNETU1DX0VDQ19FUlJPUjsKCX0KCWlmICgocFNETU1DUC0+Q2FyZFJlcG9uc2UuUjFfUkVTUCAmIFIxX0lMTF9DTURfRVJST1IpID09IFIxX0lMTF9DTURfRVJST1IpewoJCUVNTUNfUFJOKFBSTl9JTkZPLCAiU0RJT0dldENhcmRFcnJvclN0YXRlOglSMV9JTExfQ01EX0VSUk9SIik7CgkJcmV0dXJuIFNETU1DX0lMTF9DTURfRVJST1I7Cgl9CglpZiAoKHBTRE1NQ1AtPkNhcmRSZXBvbnNlLlIxX1JFU1AgJiBSMV9DT01fQ1JDX0VSUk9SKSA9PSBSMV9DT01fQ1JDX0VSUk9SKXsKCQlFTU1DX1BSTihQUk5fSU5GTywgIlNESU9HZXRDYXJkRXJyb3JTdGF0ZToJUjFfQ09NX0NSQ19FUlJPUiIpOwoJCXJldHVybiBTRE1NQ19DT01fQ1JDX0VSUk9SOwoJfQoJaWYgKChwU0RNTUNQLT5DYXJkUmVwb25zZS5SMV9SRVNQICYgUjFfTE9DS19VTE9DS19FUlJST1IpID09IFIxX0xPQ0tfVUxPQ0tfRVJSUk9SKXsKCQlFTU1DX1BSTihQUk5fSU5GTywgIlNESU9HZXRDYXJkRXJyb3JTdGF0ZToJUjFfTE9DS19VTE9DS19FUlJST1IiKTsKCQlyZXR1cm4gU0RNTUNfTE9DS19VTE9DS19FUlJST1I7Cgl9CglpZiAoKHBTRE1NQ1AtPkNhcmRSZXBvbnNlLlIxX1JFU1AgJiBSMV9MT0NLX0VSUk9SKSA9PSBSMV9MT0NLX0VSUk9SKXsKCQlFTU1DX1BSTihQUk5fSU5GTywgIlNESU9HZXRDYXJkRXJyb3JTdGF0ZToJUjFfTE9DS19FUlJPUiIpOwoJCXJldHVybiBTRE1NQ19MT0NLX0VSUk9SOwoJfQoJaWYgKChwU0RNTUNQLT5DYXJkUmVwb25zZS5SMV9SRVNQICYgUjFfV1BfRVJST1IpID09IFIxX1dQX0VSUk9SKXsKCQlFTU1DX1BSTihQUk5fSU5GTywgIlNESU9HZXRDYXJkRXJyb3JTdGF0ZToJUjFfV1BfRVJST1IiKTsKCQlyZXR1cm4gU0RNTUNfV1BfRVJST1I7Cgl9CglpZiAoKHBTRE1NQ1AtPkNhcmRSZXBvbnNlLlIxX1JFU1AgJiBSMV9FUkFTRV9QQVJBTV9FUlJPUikgPT0gUjFfRVJBU0VfUEFSQU1fRVJST1IpewoJCUVNTUNfUFJOKFBSTl9JTkZPLCAiU0RJT0dldENhcmRFcnJvclN0YXRlOglSMV9FUkFTRV9QQVJBTV9FUlJPUiIpOwoJCXJldHVybiBTRE1NQ19FUkFTRV9QQVJBTV9FUlJPUjsKCX0KCWlmICgocFNETU1DUC0+Q2FyZFJlcG9uc2UuUjFfUkVTUCAmIFIxX0VSQVNFX1NFUV9FUlJPUikgPT0gUjFfRVJBU0VfU0VRX0VSUk9SKXsKCQlFTU1DX1BSTihQUk5fSU5GTywgIlNESU9HZXRDYXJkRXJyb3JTdGF0ZToJUjFfRVJBU0VfU0VRX0VSUk9SIik7CgkJcmV0dXJuIFNETU1DX0VSQVNFX1NFUV9FUlJPUjsKCX0KCWlmICgocFNETU1DUC0+Q2FyZFJlcG9uc2UuUjFfUkVTUCAmIFIxX0JMS19MRU5fRVJST1IpID09IFIxX0JMS19MRU5fRVJST1IpewoJCUVNTUNfUFJOKFBSTl9JTkZPLCAiU0RJT0dldENhcmRFcnJvclN0YXRlOglSMV9CTEtfTEVOX0VSUk9SIik7CgkJcmV0dXJuIFNETU1DX0JMS19MRU5fRVJST1I7Cgl9CglpZiAoKHBTRE1NQ1AtPkNhcmRSZXBvbnNlLlIxX1JFU1AgJiBSMV9BRERSX01JU0FMSUdOX0VSUk9SKSA9PSBSMV9BRERSX01JU0FMSUdOX0VSUk9SKXsKCQlFTU1DX1BSTihQUk5fSU5GTywgIlNESU9HZXRDYXJkRXJyb3JTdGF0ZToJUjFfQUREUl9NSVNBTElHTl9FUlJPUiIpOwoJCXJldHVybiBTRE1NQ19BRERSX01JU0FMSUdOX0VSUk9SOwoJfQoJaWYgKChwU0RNTUNQLT5DYXJkUmVwb25zZS5SMV9SRVNQICYgUjFfQUREUl9SQU5HRV9FUlJPUikgPT0gUjFfQUREUl9SQU5HRV9FUlJPUil7CgkJRU1NQ19QUk4oUFJOX0lORk8sICJTRElPR2V0Q2FyZEVycm9yU3RhdGU6CVIxX0FERFJfUkFOR0VfRVJST1IiKTsKCQlyZXR1cm4gU0RNTUNfQUREUl9SQU5HRV9FUlJPUjsKCX0KCXJldHVybiBTRE1NQ19HRU5FUkFMX0VSUk9SOwp9CgojaWZuZGVmIERJU0FCTEVfRVJBU0VfV1JJVEUKVUlOVF9UIEVNTUNfRXJhc2UgKGxvbmcgbG9uZyBGbGFzaE9mZnNldCwgdW5zaWduZWQgY2hhciAqIExvY2FsQnVmZmVyLCBsb25nIGxvbmcgU2l6ZSkKewoJVUlOVF9UIFJldHZhbCA9IE5vRXJyb3I7CglQX1NETU1DX1Byb3BlcnRpZXNfVCBwU0RNTUNQID0gRU1NQ19HZXRQcm9wZXJ0aWVzKCk7CgoJLy8gTWFrZSBzdXJlIFN0YXRlIGlzIGNvcnJlY3QKCWlmIChwU0RNTUNQLT5TdGF0ZSAhPSBSRUFEWSkKCQlyZXR1cm4gU0RNTUNEZXZpY2VOb3RSZWFkeUVycm9yOwoKLyojaWZuZGVmIE1VTFRJX1NESU8KCS8vIENoZWNrIGlmIFN0YXJ0IEFkZHJlc3MgYW5kIFNpemUgYXJlIHdvcmQgYWxpZ25lZAoJaWYgKCAoKFNpemUgJSA0KSAhPTApIHx8ICgoRmxhc2hPZmZzZXQgJSA0KSAhPTApIHx8ICgoTG9jYWxCdWZmZXIgJSA0KSAhPTApKQoJCXJldHVybiBTRE1NQ19BRERSX01JU0FMSUdOX0VSUk9SOwojZW5kaWYqLwoJLy8gU2V0IHVwIFN0YXRlCglwU0RNTUNQLT5TdGF0ZSA9IFJFQUQ7CgoJLy8gRG9lcyB0aGUgc3RhcnQvZW5kIGFkZHJlc3NlcyBhbGlnbiBvbiBCbG9jayBCb3VuZHJpZXM/IFByb2JhYmx5IG5vdCwgcmVjb3JkIGRpc2NhcmQgYnl0ZXMKCXBTRE1NQ1AtPlRyYW5zLkNhcmRBZGRyZXNzID0gRmxhc2hPZmZzZXQ7CglwU0RNTUNQLT5UcmFucy5TdGFydERpc2NhcmRXb3JkcyA9IEZsYXNoT2Zmc2V0ICUgcFNETU1DUC0+UmVhZEJsb2NrU2l6ZTsKCglpZiAoKChGbGFzaE9mZnNldCArIFNpemUpICUgcFNETU1DUC0+UmVhZEJsb2NrU2l6ZSkgPT0gMCkKCQlwU0RNTUNQLT5UcmFucy5FbmREaXNjYXJkV29yZHMgPSAwOwoJZWxzZQoJCXBTRE1NQ1AtPlRyYW5zLkVuZERpc2NhcmRXb3JkcyA9IHBTRE1NQ1AtPlJlYWRCbG9ja1NpemUgLSAoKEZsYXNoT2Zmc2V0ICsgU2l6ZSkgJSBwU0RNTUNQLT5SZWFkQmxvY2tTaXplKTsKCglwU0RNTUNQLT5UcmFucy5OdW1CbG9ja3MgPSAoKGxvbmcgbG9uZylwU0RNTUNQLT5UcmFucy5FbmREaXNjYXJkV29yZHMgKyAobG9uZyBsb25nKXBTRE1NQ1AtPlRyYW5zLlN0YXJ0RGlzY2FyZFdvcmRzICsgU2l6ZSkgLyBwU0RNTUNQLT5SZWFkQmxvY2tTaXplOwoJcFNETU1DUC0+VHJhbnMuVHJhbnNXb3JkU2l6ZSA9IHBTRE1NQ1AtPlRyYW5zLk51bUJsb2NrcyAqIHBTRE1NQ1AtPlJlYWRCbG9ja1NpemUgLyA0OyAJCS8vIFRvdGFsIFRyYW5zZmVyIFNpemUgaW5jbHVkaW5nIHByZSBhbmQgcG9zdCBieXRlcwoKCS8vIENvbnZlcnQgdG8gIyBvZiB3b3JkcwoJcFNETU1DUC0+VHJhbnMuU3RhcnREaXNjYXJkV29yZHMgLz00OwoJcFNETU1DUC0+VHJhbnMuRW5kRGlzY2FyZFdvcmRzIC89IDQ7CgoJcFNETU1DUC0+VHJhbnMuTG9jYWxBZGRyID0gKHVpbnRwdHJfdClMb2NhbEJ1ZmZlcjsKCXBTRE1NQ1AtPlRyYW5zLldvcmRJbmRleCA9IDA7CQkJCQkJCQkJLy8gU3RvcmVzIEluZGV4IG9mIEN1cnJlbnQgd3JpdGUgcG9zaXRpb24KCgkvLyBLaWNrIG9mZiB0aGUgUmVhZAoJLy9SZXR2YWwgPSBwU0RNTUNQLT5GdW5jcy5SZWFkX0YoKTsKCglSZXR2YWwgPSBFTU1DX0VyYXNlQmxvY2tzKCk7CgoJaWYgKHBTRE1NQ1AtPlN0YXRlID09IEZBVUxUKQoJCVJldHZhbCA9IChFTU1DX0dldENhcmRFcnJvclN0YXRlKHBTRE1NQ1ApKTsJCQkvLyBUQkQgcy93IHJlc2V0PwoKI2lmZGVmIF9fU0RJT19VU0VfSU5UX18KI2Vsc2UKCXBTRE1NQ1AtPlN0YXRlID0gUkVBRFk7CiNlbmRpZgoKCglyZXR1cm4gUmV0dmFsOwp9CgppbnQgZG9fZW1tY2VyYXNlKHVuc2lnbmVkIGxvbmcgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbG9uZyBzaXplKQp7CgkvL0ZJWE1FOiBzZXQgTG9jYWxCdWZmZXIgdG8gTlVMTCBmaXJzdAoJcmV0dXJuIEVNTUNfRXJhc2Uob2Zmc2V0LCBOVUxMLCBzaXplKTsKfQojZW5kaWYKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgIFNETU1DUmVhZE9uZUJsb2NrKCkKKiAgICAgICBSZWFkcyB0aGUgZ2l2ZW4gYmxvY2sgb2ZmIG9mIHRoZSBTRC9NTUMgY2FyZCBhbmQKKiAgICAgICBpbnRvIExvY2FsQWRkciBvciBlbXB0eSBidWZmZXIKKiAgICBpbnB1dDoKKgkJbm9uZQoqICAgIG91dHB1dDoKKiAgICAgICBMb2NhbEFkZHIgd2lsbCBjb250YWluIHRoZSBjb250ZW50cyBvZiB0aGUgYmxvY2sKKiAgICByZXR1cm5zOgoqICAgICAgIG5vbmUKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpVSU5UX1QgRU1NQ19SZWFkT25lQmxvY2sodm9pZCkKewoJVUlOVF9UIFJldHZhbCA9IE5vRXJyb3I7CglQX01NNF9TRE1NQ19DT05URVhUX1QgcENvbnRleHQ7CglQX01NNF9CTEtfQ05UTCBwTU00X0JMS19DTlRMOwoJbG9uZyBsb25nIGFyZ3VtZW50OwoJUF9TRE1NQ19Qcm9wZXJ0aWVzX1QgcFNETU1DUCA9IEVNTUNfR2V0UHJvcGVydGllcygpOwoKIAkvLyBBc3NpZ24gb3VyIGNvbnRleHQgdmFsdWUKIAlwQ29udGV4dCA9IChQX01NNF9TRE1NQ19DT05URVhUX1QpIHBTRE1NQ1AtPnBDb250ZXh0OwoKCS8vIE11c3Qgc2V0IE1NQyBOVU1CTEsKCXBNTTRfQkxLX0NOVEwgPSAoUF9NTTRfQkxLX0NOVEwpICZwQ29udGV4dC0+cE1NQzRSZWctPm1tNF9ibGtfY250bDsKCXBNTTRfQkxLX0NOVEwtPmJsa19jbnQgPSBwU0RNTUNQLT5UcmFucy5OdW1CbG9ja3M7CglwTU00X0JMS19DTlRMLT54ZnJfYmxrc3ogPSBwU0RNTUNQLT5SZWFkQmxvY2tTaXplOwoKCS8vIFNldCB1cCBTdGF0ZQoJcFNETU1DUC0+U3RhdGUgPSBSRUFEOwoKCS8vIERvIGEgQ01EIDE3IFJlYWQgU2luZ2xlIEJsb2NrCglpZiAocFNETU1DUC0+U0RNQV9Nb2RlKQoJewoJCXBNTTRfQkxLX0NOVEwtPmRtYV9idWZzeiA9IE1NNF81MTJfSE9TVF9ETUFfQkRSWTsKCSAgICBwQ29udGV4dC0+cE1NQzRSZWctPm1tNF9zeXNhZGRyID0gcFNETU1DUC0+VHJhbnMuTG9jYWxBZGRyOwoKCQlFTU1DSENfRG1hU2VsZWN0KHBDb250ZXh0LCAweDAwKTsgIC8vIHNldCBETUEgc2VsZWN0IFNETUEKCQlFTU1DX1BSTihQUk5fUkVTLCAiXG4gJXMsIFNETUEgTW9kZSwgQURNQSBpbmRleCAlZFxuICIsIF9fZnVuY19fLCBnX0FETUFfcmQpOwoJfQoKICAgICAgICBhcmd1bWVudCA9IHBTRE1NQ1AtPlRyYW5zLkNhcmRBZGRyZXNzOwoKCWlmIChwU0RNTUNQLT5BY2Nlc3NNb2RlID09IFNFQ1RPUl9BQ0NFU1MpCgkJCWFyZ3VtZW50IC89IEhBUkQ1MTJCTE9DS0xFTkdUSDsgCS8vIEluIHNlY3RvciBtb2RlIGFkZHJlc3Npbmc7IGFsbCBhZGRyZXNzZXMgbmVlZCB0byBiZSBzcGVjaWZpZWQgYXMgYmxvY2sgb2Zmc2V0cy4KCiAgICAvLyBvbmx5IG5lZWQgeGZlciBpbnRlcnJ1cHQKCiAgICAgICAgRU1NQ0hDX0VuYWJsZUNtZEludGVycnVwdChwQ29udGV4dCwgMCk7CgoJRU1NQ19QUk4oUFJOX0RCRywgIlxuIFNlbmQgQ01EMTcsIGRhdGEgYWRkcmVzcyBhcmd1bWVudCBpcyAweCV4XG4gIiwgYXJndW1lbnQpOwoKCUVNTUNfU2VuZERhdGFDb21tYW5kKHBTRE1NQ1AsIFhMTFBfTU1DX0NNRDE3LCAodW5zaWduZWQgaW50KWFyZ3VtZW50LCBNTTRfU0lOR0xFX0JMT0NLX1RSQU4sIE1NNF9DQVJEX1RPX0hPU1RfREFUQSwgTU00X1JUX1IxIHwgTU00XzQ4X1JFUyk7CgoJLy8gR2V0IHRoZSBDYXJkIFJlc3BvbnNlCglSZXR2YWwgPSBFTU1DX0ludGVycHJldF9SZXNwb25zZShwU0RNTUNQLCBNTUNfUkVTUE9OU0VfUjEsIDB4MTAwKTsKCgkvLyBlbmFibGUgY21kIGNvbXBsZXRlIGludGVycnVwdAoKCUVNTUNIQ19FbmFibGVDbWRJbnRlcnJ1cHQocENvbnRleHQsIDEpOwoKCUVNTUNfUFJOKFBSTl9EQkcsICJcblJldHZhbCA9IDB4JVggIVxuICIsUmV0dmFsICk7CS8vIEdldCB0aGUgQ2FyZCBSZXNwb25zZQojaWYgUExBVEZPUk0hPVZFTE9DRQogICAgaWYgKChSZXR2YWwgIT0gTm9FcnJvcikgfHwgKChwU0RNTUNQLT5DYXJkUmVwb25zZS5SMV9SRVNQJjB4RjAwKSAhPSAweDkwMCkpCiAgICB7CiAgICAgICAgUmV0dmFsID0gUmVhZEVycm9yOwogICAgICAgIHBTRE1NQ1AtPlN0YXRlID0gRkFVTFQ7CiAgICAgICAgLy8gU2VuZCBhIHN0b3AgY29tbWFuZAogICAgICAgIEVNTUNfU2VuZFN0b3BDb21tYW5kKHBTRE1NQ1ApOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHBTRE1NQ1AtPlN0YXRlID0gUkVBRFk7CiAgICB9CiNlbHNlCiAgICBSZXR2YWwgfD0gRU1NQ19DaGVja0NhcmRTdGF0dXMocFNETU1DUCwgMHg5MDAsIFIxX0xPQ0tFRENBUkRNQVNLKTsJCS8vIE1ha2Ugc3VyZSBjYXJkIGlzIHRyYW5zZmVyIG1vZGUKICAgIGlmIChSZXR2YWwgIT0gTm9FcnJvcikKICAgIHsKICAgICAgICBwU0RNTUNQLT5TdGF0ZSA9IFJFQURZOwogICAgICAgIHJldHVybiBTRE1NQ19TV0lUQ0hfRVJST1I7CiAgICB9CiNlbmRpZgogICAgRU1NQ19QUk4oUFJOX0RCRywgIlxuIFNlbmQgQ01EMTcgZG9uZSAsIHJlYWQgb25lIGJsb2NrIGRhdGEgZG9uZSFcbiAiLCBhcmd1bWVudCk7CgogICAgcmV0dXJuIFJldHZhbDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogICAgU0RNTUNSZWFkQmxvY2tzKCkKKiAgICAgICBSZWFkcyB0aGUgZ2l2ZW4gYmxvY2sgb2ZmIG9mIHRoZSBTRC9NTUMgY2FyZCBhbmQKKiAgICAgICBpbnRvIExvY2FsQWRkciBvciBlbXB0eSBidWZmZXIKKiAgICBpbnB1dDoKKgkJbm9uZQoqICAgIG91dHB1dDoKKiAgICAgICBMb2NhbEFkZHIgd2lsbCBjb250YWluIHRoZSBjb250ZW50cyBvZiB0aGUgYmxvY2sKKiAgICByZXR1cm5zOgoqICAgICAgIG5vbmUKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpVSU5UX1QgRU1NQ19SZWFkQmxvY2tzKHZvaWQpCnsKCVVJTlRfVCBSZXR2YWwgPSBOb0Vycm9yOwoJUF9NTTRfU0RNTUNfQ09OVEVYVF9UIHBDb250ZXh0OwoJUF9NTTRfQkxLX0NOVEwgcE1NNF9CTEtfQ05UTDsKCWxvbmcgbG9uZyBhcmd1bWVudDsKCWludCBpOwoJLy8gSW5pdGlhbGl6ZSBGbGFzaCBQcm9wZXJ0aWVzCgoJUF9TRE1NQ19Qcm9wZXJ0aWVzX1QgcFNETU1DUCA9IEVNTUNfR2V0UHJvcGVydGllcygpOwoKIAkvLyBBc3NpZ24gb3VyIGNvbnRleHQgdmFsdWUKIAlwQ29udGV4dCA9IChQX01NNF9TRE1NQ19DT05URVhUX1QpIHBTRE1NQ1AtPnBDb250ZXh0OwoKCS8vIE11c3Qgc2V0IE1NQyBOVU1CTEsKCXBNTTRfQkxLX0NOVEwgPSAoUF9NTTRfQkxLX0NOVEwpICZwQ29udGV4dC0+cE1NQzRSZWctPm1tNF9ibGtfY250bDsKCXBNTTRfQkxLX0NOVEwtPmJsa19jbnQgPSBwU0RNTUNQLT5UcmFucy5OdW1CbG9ja3M7CglwTU00X0JMS19DTlRMLT54ZnJfYmxrc3ogPSBwU0RNTUNQLT5SZWFkQmxvY2tTaXplOwoKCS8vIERvIGEgQ01EIDE4IFJlYWQgTXVsdGlwbGUgQmxvY2sKCWlmIChwU0RNTUNQLT5TRE1BX01vZGUpCgl7CgkJcE1NNF9CTEtfQ05UTC0+ZG1hX2J1ZnN6ID0gTU00XzUxMl9IT1NUX0RNQV9CRFJZOwoJICAgIHBDb250ZXh0LT5wTU1DNFJlZy0+bW00X3N5c2FkZHIgPSBwU0RNTUNQLT5UcmFucy5Mb2NhbEFkZHI7CgoJCUVNTUNIQ19EbWFTZWxlY3QocENvbnRleHQsIDB4MDApOyAgLy8gc2V0IERNQSBzZWxlY3QgU0RNQQoJCUVNTUNfUFJOKFBSTl9JTkZPLCAiXG4gJXMsIFNETUEgTW9kZSwgQURNQSBpbmRleCAlZFxuICIsIF9fZnVuY19fLCBnX0FETUFfcmQpOwoJfQoKICAgIGlmIChnX0FETUFfcmQgPT0gMSkKCQlFTU1DX1NldHVwQURNQSgwLCBwU0RNTUNQLT5UcmFucy5OdW1CbG9ja3MpOyAgICAvLyBmb3IgQURNQQoKCWFyZ3VtZW50ID0gcFNETU1DUC0+VHJhbnMuQ2FyZEFkZHJlc3M7CglpZiAocFNETU1DUC0+QWNjZXNzTW9kZSA9PSBTRUNUT1JfQUNDRVNTKQoJCWFyZ3VtZW50IC89IEhBUkQ1MTJCTE9DS0xFTkdUSDsgCS8vIEluIHNlY3RvciBtb2RlIGFkZHJlc3Npbmc7IGFsbCBhZGRyZXNzZXMgbmVlZCB0byBiZSBzcGVjaWZpZWQgYXMgYmxvY2sgb2Zmc2V0cy4KCglFTU1DX1NlbmRTZXR1cENvbW1hbmQocFNETU1DUCwgWExMUF9NTUNfQ01EMjMsIE1NNF9DTURfVFlQRV9OT1JNQUwsIHBNTTRfQkxLX0NOVEwtPmJsa19jbnQsIE1NNF9SVF9SMSB8IE1NNF80OF9SRVMpOwoJUmV0dmFsID0gRU1NQ19JbnRlcnByZXRfUmVzcG9uc2UocFNETU1DUCwgTU1DX1JFU1BPTlNFX1IxLCAweDEwMCk7CgogICAgRU1NQ19QUk4oUFJOX1JFUywgIlxuIFNlbmQgQ01EMTgsIE1VTFRJX0JMT0NLIFJFQUQsIGJsb2NrIGNudCBpcyAweCV4XG4gIiwgcFNETU1DUC0+VHJhbnMuTnVtQmxvY2tzKTsKCgkvLyBvbmx5IG5lZWQgeGZlciBpbnRlcnJ1cHQKCUVNTUNIQ19FbmFibGVDbWRJbnRlcnJ1cHQocENvbnRleHQsIDApOwoJaWYoYXV0b2NtZDEyID09IDApCgkJRU1NQ19TZW5kRGF0YUNvbW1hbmROb0F1dG8xMihwU0RNTUNQLCBYTExQX01NQ19DTUQxOCwgKHVuc2lnbmVkIGludClhcmd1bWVudCwgTU00X01VTFRJX0JMT0NLX1RSQU4sIE1NNF9DQVJEX1RPX0hPU1RfREFUQSwgTU00X1JUX1IxfE1NNF80OF9SRVMpOwoJZWxzZQoJCUVNTUNfU2VuZERhdGFDb21tYW5kKHBTRE1NQ1AsIFhMTFBfTU1DX0NNRDE4LCAodW5zaWduZWQgaW50KWFyZ3VtZW50LCBNTTRfTVVMVElfQkxPQ0tfVFJBTiwgTU00X0NBUkRfVE9fSE9TVF9EQVRBLCBNTTRfUlRfUjF8TU00XzQ4X1JFUyk7CgoJLy8gV2FpdCBmb3IgdGhlIFJlYWQgdG8gQ29tcGxldGUKCXdoaWxlICgocFNETU1DUC0+U3RhdGUgIT0gRkFVTFQpICYmIChwU0RNTUNQLT5TdGF0ZSAhPSBSRUFEWSkpOwkJLy8gVEJEIGFkZCB0aW1lb3V0IExldCB0aGUgSVNSIHJ1biwgd2UnbGwgZWl0aGVyIGdldCBhIGZhdWx0IG9yIGZpbmlzaAoJRU1NQ19QUk4oUFJOX0lORk8sICJcbnBTRE1NQ1AtPlN0YXRlID0gMHglWCAhXG4gIixwU0RNTUNQLT5TdGF0ZSApOwoJLy8gR2V0IHRoZSBDYXJkIFJlc3BvbnNlCglSZXR2YWwgPSBFTU1DX0ludGVycHJldF9SZXNwb25zZShwU0RNTUNQLCBNTUNfUkVTUE9OU0VfUjEsIDB4MTAwKTsKCS8vIGVuYWJsZSBjbWQgY29tcGxldGUgaW50ZXJydXB0CgoJRU1NQ0hDX0VuYWJsZUNtZEludGVycnVwdChwQ29udGV4dCwgMSk7CgojaWYgMC8vUExBVEZPUk0hPVZFTE9DRQoJaWYgKChSZXR2YWwgIT0gTm9FcnJvcikgfHwgKChwU0RNTUNQLT5DYXJkUmVwb25zZS5SMV9SRVNQJjB4RjAwKSAhPSAweDkwMCkpCgl7CgkJUmV0dmFsID0gUmVhZEVycm9yOwoJCXBTRE1NQ1AtPlN0YXRlID0gRkFVTFQ7CgkJLy8gU2VuZCBhIHN0b3AgY29tbWFuZAoJCUVNTUNfU2VuZFN0b3BDb21tYW5kKHBTRE1NQ1ApOwoJfQoJZWxzZQoJewoJCXBTRE1NQ1AtPlN0YXRlID0gUkVBRFk7Cgl9CiNlbHNlCiAgICBSZXR2YWwgfD0gRU1NQ19DaGVja0NhcmRTdGF0dXMocFNETU1DUCwgMHg5MDAsIFIxX0xPQ0tFRENBUkRNQVNLKTsJCS8vIE1ha2Ugc3VyZSBjYXJkIGlzIHRyYW5zZmVyIG1vZGUKICAgIGkgPSAwOwogICAgd2hpbGUoUmV0dmFsICE9IE5vRXJyb3IpCiAgICB7CiAgICAgICAgZGVsYXlfbXMoMSk7CiAgICAgICAgUmV0dmFsID0gRU1NQ19DaGVja0NhcmRTdGF0dXMocFNETU1DUCwgMHg5MDAsIFIxX0xPQ0tFRENBUkRNQVNLKTsJCS8vIE1ha2Ugc3VyZSBjYXJkIGlzIHRyYW5zZmVyIG1vZGUKICAgICAgICBpZigodW5zaWduZWQgaW50KWk+MzAqcFNETU1DUC0+VHJhbnMuTnVtQmxvY2tzKQogICAgICAgICAgICBicmVhazsKICAgICAgICBpKys7CiAgICB9CiAgICBpZiAoUmV0dmFsICE9IE5vRXJyb3IpCiAgICB7CiAgICAgICAgcFNETU1DUC0+U3RhdGUgPSBSRUFEWTsKICAgICAgICByZXR1cm4gU0RNTUNfU1dJVENIX0VSUk9SOwogICAgfQojZW5kaWYKICAgIEVNTUNIQ19EbWFTZWxlY3QocENvbnRleHQsMHgwMCk7ICAvLyBzZXQgRE1BIHNlbGVjdCBiYWNrIHRvIFNETUEKICAgIHJldHVybiBSZXR2YWw7Cn0KCiNpZm5kZWYgRElTQUJMRV9FUkFTRV9XUklURQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiAgICBFTU1DX1dyaXRlT25lQmxvY2soKQoqCQlXcml0ZXMgdGhlIHJlcXVpcmVkIG51bWJlciBvZiBibG9ja3MgdG8gQ2FyZEFkZHJlc3MKKiAgICBpbnB1dDoKKgkJbm9uZQoqICAgIG91dHB1dDoKKiAgICAgICBBZGRyZXNzIHN0YXJ0aW5nIHdpdGggQ2FyZEFkZHJlc3Mgd2lsbCBjb250YWluIGNvbnRlbnQgZnJvbSBMb2NhbEFkZHJlc3MKKiAgICByZXR1cm5zOgoqICAgICAgIG5vbmUKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpVSU5UX1QgRU1NQ19Xcml0ZU9uZUJsb2NrKHZvaWQpCnsKCVVJTlRfVCBSZXR2YWwgPSBOb0Vycm9yOwoJUF9NTTRfU0RNTUNfQ09OVEVYVF9UIHBDb250ZXh0OwoJUF9NTTRfQkxLX0NOVEwgcE1NNF9CTEtfQ05UTDsKCWxvbmcgbG9uZyBhcmd1bWVudDsKCS8vIEluaXRpYWxpemUgRmxhc2ggUHJvcGVydGllcwoKCVBfU0RNTUNfUHJvcGVydGllc19UIHBTRE1NQ1AgPSBFTU1DX0dldFByb3BlcnRpZXMoKTsKCiAJLy8gQXNzaWduIG91ciBjb250ZXh0IHZhbHVlCiAJcENvbnRleHQgPSAoUF9NTTRfU0RNTUNfQ09OVEVYVF9UKSBwU0RNTUNQLT5wQ29udGV4dDsKCgkvLyBNdXN0IHNldCBNTUMgTlVNQkxLCglwTU00X0JMS19DTlRMID0gKFBfTU00X0JMS19DTlRMKSAmcENvbnRleHQtPnBNTUM0UmVnLT5tbTRfYmxrX2NudGw7CglwTU00X0JMS19DTlRMLT5ibGtfY250ID0gcFNETU1DUC0+VHJhbnMuTnVtQmxvY2tzOwoKCS8vIERvIGEgQ01EIDI0IFdyaXRlIHNpbmdsZSBCbG9jawoJaWYgKHBTRE1NQ1AtPlNETUFfTW9kZSkKCXsKICAgICAgICAgICAgcE1NNF9CTEtfQ05UTC0+ZG1hX2J1ZnN6ID0gTU00XzUxMl9IT1NUX0RNQV9CRFJZOwogICAgICAgICAgICBwQ29udGV4dC0+cE1NQzRSZWctPm1tNF9zeXNhZGRyID0gcFNETU1DUC0+VHJhbnMuTG9jYWxBZGRyOwoJfQoKICAgICAgICBhcmd1bWVudCA9IHBTRE1NQ1AtPlRyYW5zLkNhcmRBZGRyZXNzOwoKCWlmIChwU0RNTUNQLT5BY2Nlc3NNb2RlID09IFNFQ1RPUl9BQ0NFU1MpewoJCWFyZ3VtZW50IC89IEhBUkQ1MTJCTE9DS0xFTkdUSDsgCS8vIEluIHNlY3RvciBtb2RlIGFkZHJlc3Npbmc7IGFsbCBhZGRyZXNzZXMgbmVlZCB0byBiZSBzcGVjaWZpZWQgYXMgYmxvY2sgb2Zmc2V0cy4KCX0KCgoJRU1NQ19QUk4oUFJOX0RCRywgIlxuIFNlbmQgQ01EMjQsIGRhdGEgYWRkcmVzcyBhcmd1bWVudCBpcyAweCV4XG4gIiwgYXJndW1lbnQpOwoKICAgIC8vIG9ubHkgbmVlZCB4ZmVyIGludGVycnVwdCAtS1QKCglFTU1DSENfRW5hYmxlQ21kSW50ZXJydXB0KHBDb250ZXh0LCAwKTsKCglFTU1DX1NlbmREYXRhQ29tbWFuZChwU0RNTUNQLCBYTExQX01NQ19DTUQyNCwgKHVuc2lnbmVkIGludClhcmd1bWVudCwgTU00X1NJTkdMRV9CTE9DS19UUkFOLCBNTTRfSE9TVF9UT19DQVJEX0RBVEEsIE1NNF9SVF9SMSB8IE1NNF80OF9SRVMpOwoKCVJldHZhbCA9IEVNTUNfSW50ZXJwcmV0X1Jlc3BvbnNlKHBTRE1NQ1AsIE1NQ19SRVNQT05TRV9SMSwgMHgxMDApOwoKCS8vIGVuYWJsZSBjbWQgY29tcGxldGUgaW50ZXJydXB0CgoJRU1NQ0hDX0VuYWJsZUNtZEludGVycnVwdChwQ29udGV4dCwgMSk7CglFTU1DX1BSTihQUk5fREJHLCAiXG5SZXR2YWwgPSAweCVYICFcbiAiLFJldHZhbCApOwkvLyBHZXQgdGhlIENhcmQgUmVzcG9uc2UKI2lmIFBMQVRGT1JNIT1WRUxPQ0UKCglpZiAoKFJldHZhbCAhPSBOb0Vycm9yKSB8fCAocFNETU1DUC0+U3RhdGUgPT0gRkFVTFQpIHx8ICgocFNETU1DUC0+Q2FyZFJlcG9uc2UuUjFfUkVTUCYweEYwMCkgIT0gMHg5MDApKQoJewoJCVJldHZhbCA9IFdyaXRlRXJyb3I7CgkJcFNETU1DUC0+U3RhdGUgPSBGQVVMVDsKCQkvLyBTZW5kIGEgc3RvcCBjb21tYW5kCgkJRU1NQ19TZW5kU3RvcENvbW1hbmQocFNETU1DUCk7Cgl9CgllbHNlCgl7CgkJcFNETU1DUC0+U3RhdGUgPSBSRUFEWTsKCX0KI2Vsc2UKICAgICAgICBSZXR2YWwgfD0gRU1NQ19DaGVja0NhcmRTdGF0dXMocFNETU1DUCwgMHg5MDAsIFIxX0xPQ0tFRENBUkRNQVNLKTsJCS8vIE1ha2Ugc3VyZSBjYXJkIGlzIHRyYW5zZmVyIG1vZGUKCWlmIChSZXR2YWwgIT0gTm9FcnJvcikKCXsKCSAJcFNETU1DUC0+U3RhdGUgPSBSRUFEWTsKCQlyZXR1cm4gU0RNTUNfU1dJVENIX0VSUk9SOwoJfQojZW5kaWYKCUVNTUNfUFJOKFBSTl9EQkcsICJcbiBDTUQyNCBjb21wbGV0ZSwgd3JpdGUgb25lIGJsb2NrIGRhdGEgZG9uZSAhXG4gIiwgYXJndW1lbnQpOwoJcmV0dXJuIFJldHZhbDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogICAgRU1NQ19Xcml0ZUJsb2NrcygpCioJCVdyaXRlcyB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mIGJsb2NrcyB0byBDYXJkQWRkcmVzcwoqICAgIGlucHV0OgoqCQlub25lCiogICAgb3V0cHV0OgoqICAgICAgIEFkZHJlc3Mgc3RhcnRpbmcgd2l0aCBDYXJkQWRkcmVzcyB3aWxsIGNvbnRhaW4gY29udGVudCBmcm9tIExvY2FsQWRkcmVzcwoqICAgIHJldHVybnM6CiogICAgICAgbm9uZQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovClVJTlRfVCBFTU1DX1dyaXRlQmxvY2tzKHZvaWQpCnsKCVVJTlRfVCBSZXR2YWwgPSBOb0Vycm9yOwoJUF9NTTRfU0RNTUNfQ09OVEVYVF9UIHBDb250ZXh0OwoJUF9NTTRfQkxLX0NOVEwgcE1NNF9CTEtfQ05UTDsKCWxvbmcgbG9uZyBhcmd1bWVudDsKCXVuc2lnbmVkIGludCBpOwoJLy8gSW5pdGlhbGl6ZSBGbGFzaCBQcm9wZXJ0aWVzCgoJUF9TRE1NQ19Qcm9wZXJ0aWVzX1QgcFNETU1DUCA9IEVNTUNfR2V0UHJvcGVydGllcygpOwoKIAkvLyBBc3NpZ24gb3VyIGNvbnRleHQgdmFsdWUKIAlwQ29udGV4dCA9IChQX01NNF9TRE1NQ19DT05URVhUX1QpIHBTRE1NQ1AtPnBDb250ZXh0OwoKCS8vIE11c3Qgc2V0IE1NQyBOVU1CTEsKCXBNTTRfQkxLX0NOVEwgPSAoUF9NTTRfQkxLX0NOVEwpICZwQ29udGV4dC0+cE1NQzRSZWctPm1tNF9ibGtfY250bDsKCXBNTTRfQkxLX0NOVEwtPmJsa19jbnQgPSBwU0RNTUNQLT5UcmFucy5OdW1CbG9ja3M7CglwTU00X0JMS19DTlRMLT54ZnJfYmxrc3ogPSBwU0RNTUNQLT5Xcml0ZUJsb2NrU2l6ZTsKCgkvLyBEbyBhIENNRCAyNSBXcml0ZSBNdWx0aXBsZSBCbG9ja3MKCWlmIChwU0RNTUNQLT5TRE1BX01vZGUpCgl7CiAgICAgICAgICAgIEVNTUNfUFJOKFBSTl9JTkZPLCAiXG4gTU00X0RNQSBtb2RlXG4gIik7CiAgICAgICAgICAgIHBNTTRfQkxLX0NOVEwtPmRtYV9idWZzeiA9IE1NNF81MTJfSE9TVF9ETUFfQkRSWTsKICAgICAgICAgICAgcENvbnRleHQtPnBNTUM0UmVnLT5tbTRfc3lzYWRkciA9IHBTRE1NQ1AtPlRyYW5zLkxvY2FsQWRkcjsKCQkJRU1NQ0hDX0RtYVNlbGVjdChwQ29udGV4dCwgMHgwMCk7ICAvLyBzZXQgRE1BIHNlbGVjdCBTRE1BCgl9CgogICAgICAgIGFyZ3VtZW50ID0gcFNETU1DUC0+VHJhbnMuQ2FyZEFkZHJlc3M7CgoJaWYgKHBTRE1NQ1AtPkFjY2Vzc01vZGUgPT0gU0VDVE9SX0FDQ0VTUykKCQlhcmd1bWVudCAvPSBIQVJENTEyQkxPQ0tMRU5HVEg7IAkvLyBJbiBzZWN0b3IgbW9kZSBhZGRyZXNzaW5nOyBhbGwgYWRkcmVzc2VzIG5lZWQgdG8gYmUgc3BlY2lmaWVkIGFzIGJsb2NrIG9mZnNldHMuCgoJRU1NQ19QUk4oUFJOX0RCRywgIlxuIEVNTUNfV3JpdGVCbG9ja3MsIHdyaXRlIDB4JXggYmxvY2tzIHRvIDB4JXhcbiAiLCBwTU00X0JMS19DTlRMLT5ibGtfY250LCBhcmd1bWVudCk7CgoJaWYgKGdfQURNQV93cj09MSkKCQlFTU1DX1NldHVwQURNQSggMSxwU0RNTUNQLT5UcmFucy5OdW1CbG9ja3MpOyAgICAvLyBmb3IgQURNQQoKICAgIC8vIG9ubHkgbmVlZCB4ZmVyIGludGVycnVwdCAtS1QKCgkvL0VNTUNIQ19FbmFibGVDbWRJbnRlcnJ1cHQocENvbnRleHQsIDApOwoKCUVNTUNfU2VuZFNldHVwQ29tbWFuZChwU0RNTUNQLCBYTExQX01NQ19DTUQyMywgTU00X0NNRF9UWVBFX05PUk1BTCwgcE1NNF9CTEtfQ05UTC0+YmxrX2NudCwgTU00X1JUX1IxIHwgTU00XzQ4X1JFUyk7CgoJUmV0dmFsID0gRU1NQ19JbnRlcnByZXRfUmVzcG9uc2UocFNETU1DUCwgTU1DX1JFU1BPTlNFX1IxLCAweDEwMCk7CgoJRU1NQ0hDX0VuYWJsZUNtZEludGVycnVwdChwQ29udGV4dCwgMCk7CgkvL3BTRE1NQ1AtPlN0YXRlID0gV1JJVEU7CglpZihhdXRvY21kMTIgPT0gMCkKCQlFTU1DX1NlbmREYXRhQ29tbWFuZE5vQXV0bzEyKHBTRE1NQ1AsIFhMTFBfTU1DX0NNRDI1LCAodW5zaWduZWQgaW50KWFyZ3VtZW50LCBNTTRfTVVMVElfQkxPQ0tfVFJBTiwgTU00X0hPU1RfVE9fQ0FSRF9EQVRBLCBNTTRfUlRfUjEgfCBNTTRfNDhfUkVTKTsKCWVsc2UKCQlFTU1DX1NlbmREYXRhQ29tbWFuZChwU0RNTUNQLCBYTExQX01NQ19DTUQyNSwgKHVuc2lnbmVkIGludClhcmd1bWVudCwgTU00X01VTFRJX0JMT0NLX1RSQU4sIE1NNF9IT1NUX1RPX0NBUkRfREFUQSwgTU00X1JUX1IxIHwgTU00XzQ4X1JFUyk7CgkvLyBXYWl0IGZvciB0aGUgV3JpdGUgdG8gQ29tcGxldGUKCXdoaWxlICgocFNETU1DUC0+U3RhdGUgIT0gRkFVTFQpICYmIChwU0RNTUNQLT5TdGF0ZSAhPSBSRUFEWSkpOwkJLy8gVEJEIGFkZCB0aW1lb3V0IExldCB0aGUgSVNSIHJ1biwgd2UnbGwgZWl0aGVyIGdldCBhIGZhdWx0IG9yIGZpbmlzaAoJRU1NQ19QUk4oUFJOX0RCRywgIlxucFNETU1DUC0+U3RhdGUgPSAweCVYICFcbiAiLHBTRE1NQ1AtPlN0YXRlICk7CgkvL1NESU9HZXRDYXJkRXJyb3JTdGF0ZShwU0RNTUNQKSA7CgkvLyBHZXQgdGhlIENhcmQgUmVzcG9uc2UKCVJldHZhbCA9IEVNTUNfSW50ZXJwcmV0X1Jlc3BvbnNlKHBTRE1NQ1AsIE1NQ19SRVNQT05TRV9SMSwgMHgxMDApOwoKCS8vIGVuYWJsZSBjbWQgY29tcGxldGUgaW50ZXJydXB0CglFTU1DSENfRW5hYmxlQ21kSW50ZXJydXB0KHBDb250ZXh0LCAxKTsKCiNpZiAwLy9QTEFURk9STSE9VkVMT0NFCgoJaWYgKChSZXR2YWwgIT0gTm9FcnJvcikgfHwgKHBTRE1NQ1AtPlN0YXRlID09IEZBVUxUKSB8fCAoKHBTRE1NQ1AtPkNhcmRSZXBvbnNlLlIxX1JFU1AmMHhGMDApICE9IDB4OTAwKSkKCXsKCQlSZXR2YWwgPSBXcml0ZUVycm9yOwoJCXBTRE1NQ1AtPlN0YXRlID0gRkFVTFQ7CgkJLy8gU2VuZCBhIHN0b3AgY29tbWFuZAoJCUVNTUNfU2VuZFN0b3BDb21tYW5kKHBTRE1NQ1ApOwoJfQoJZWxzZQoJewoJCXBTRE1NQ1AtPlN0YXRlID0gUkVBRFk7Cgl9CiNlbHNlCiAgICBSZXR2YWwgfD0gRU1NQ19DaGVja0NhcmRTdGF0dXMocFNETU1DUCwgMHg5MDAsIFIxX0xPQ0tFRENBUkRNQVNLKTsJCS8vIE1ha2Ugc3VyZSBjYXJkIGlzIHRyYW5zZmVyIG1vZGUKICAgIGkgPSAwOwogICAgd2hpbGUoUmV0dmFsICE9IE5vRXJyb3IpCiAgICB7CiAgICAgICAgZGVsYXlfbXMoMik7CiAgICAgICAgUmV0dmFsID0gRU1NQ19DaGVja0NhcmRTdGF0dXMocFNETU1DUCwgMHg5MDAsIFIxX0xPQ0tFRENBUkRNQVNLKTsJCS8vIE1ha2Ugc3VyZSBjYXJkIGlzIHRyYW5zZmVyIG1vZGUKICAgICAgICBpZihpID4gNTAqcFNETU1DUC0+VHJhbnMuTnVtQmxvY2tzKQogICAgICAgICAgICBicmVhazsKICAgICAgICBpKys7CiAgICB9CiAgICBpZiAoUmV0dmFsICE9IE5vRXJyb3IpCiAgICB7CiAgICAgICAgcFNETU1DUC0+U3RhdGUgPSBSRUFEWTsKICAgICAgICByZXR1cm4gU0RNTUNfU1dJVENIX0VSUk9SOwogICAgfQojZW5kaWYKCiAgICBFTU1DSENfRG1hU2VsZWN0KHBDb250ZXh0LDB4MDApOyAgLy8gc2V0IERNQSBzZWxlY3QgYmFjayB0byBTRE1BCiAgICByZXR1cm4gUmV0dmFsOwp9CiNlbmRpZgoKVUlOVF9UIEVNTUNfUmVhZEJsayAobG9uZyBsb25nICBGbGFzaE9mZnNldCwgdW5zaWduZWQgY2hhciAqIExvY2FsQnVmZmVyLCBsb25nIGxvbmcgIFNpemUsIHVuc2lnbmVkIGNoYXIgRm9yY2VNdWx0aUJsa3MpCnsKCVVJTlRfVCBSZXR2YWwgPSBOb0Vycm9yOwogICAgLy9VSU5UX1QgZmxhZ3MgPSBOT19GTEFHUzsKCS8vIEluaXRpYWxpemUgRmxhc2ggUHJvcGVydGllcwoKCVBfU0RNTUNfUHJvcGVydGllc19UIHBTRE1NQ1AgPSBFTU1DX0dldFByb3BlcnRpZXMoKTsKCgkvLyBNYWtlIHN1cmUgU3RhdGUgaXMgY29ycmVjdAoJaWYgKHBTRE1NQ1AtPlN0YXRlICE9IFJFQURZKQoJCXJldHVybiBTRE1NQ0RldmljZU5vdFJlYWR5RXJyb3I7CgoJLy8gU2V0IHVwIFN0YXRlCglwU0RNTUNQLT5TdGF0ZSA9IFJFQUQ7CglwU0RNTUNQLT5SZWFkQmxvY2tTaXplID0gSEFSRDUxMkJMT0NLTEVOR1RIOwoJLy8gRG9lcyB0aGUgc3RhcnQvZW5kIGFkZHJlc3NlcyBhbGlnbiBvbiBCbG9jayBCb3VuZHJpZXM/IFByb2JhYmx5IG5vdCwgcmVjb3JkIGRpc2NhcmQgYnl0ZXMKCXBTRE1NQ1AtPlRyYW5zLkNhcmRBZGRyZXNzID0gRmxhc2hPZmZzZXQ7CglwU0RNTUNQLT5UcmFucy5TdGFydERpc2NhcmRXb3JkcyA9IEZsYXNoT2Zmc2V0ICUgcFNETU1DUC0+UmVhZEJsb2NrU2l6ZTsKCglpZiAoKChGbGFzaE9mZnNldCArIFNpemUpICUgcFNETU1DUC0+UmVhZEJsb2NrU2l6ZSkgPT0gMCkKCQlwU0RNTUNQLT5UcmFucy5FbmREaXNjYXJkV29yZHMgPSAwOwoJZWxzZQoJCXBTRE1NQ1AtPlRyYW5zLkVuZERpc2NhcmRXb3JkcyA9IHBTRE1NQ1AtPlJlYWRCbG9ja1NpemUgLSAoKEZsYXNoT2Zmc2V0ICsgU2l6ZSkgJSBwU0RNTUNQLT5SZWFkQmxvY2tTaXplKTsKCglwU0RNTUNQLT5UcmFucy5OdW1CbG9ja3MgPSAoKGxvbmcgbG9uZylwU0RNTUNQLT5UcmFucy5FbmREaXNjYXJkV29yZHMgKyAobG9uZyBsb25nKXBTRE1NQ1AtPlRyYW5zLlN0YXJ0RGlzY2FyZFdvcmRzICsgU2l6ZSkgLyBwU0RNTUNQLT5SZWFkQmxvY2tTaXplOwoJcFNETU1DUC0+VHJhbnMuVHJhbnNXb3JkU2l6ZSA9IHBTRE1NQ1AtPlRyYW5zLk51bUJsb2NrcyAqIHBTRE1NQ1AtPlJlYWRCbG9ja1NpemUgLyA0OyAJCS8vIFRvdGFsIFRyYW5zZmVyIFNpemUgaW5jbHVkaW5nIHByZSBhbmQgcG9zdCBieXRlcwoKCS8vIENvbnZlcnQgdG8gIyBvZiB3b3JkcwoJcFNETU1DUC0+VHJhbnMuU3RhcnREaXNjYXJkV29yZHMgLz00OwoJcFNETU1DUC0+VHJhbnMuRW5kRGlzY2FyZFdvcmRzIC89IDQ7CgoJcFNETU1DUC0+VHJhbnMuTG9jYWxBZGRyID0gKHVpbnRwdHJfdClMb2NhbEJ1ZmZlcjsKCXBTRE1NQ1AtPlRyYW5zLldvcmRJbmRleCA9IDA7CQkJCQkJCQkJLy8gU3RvcmVzIEluZGV4IG9mIEN1cnJlbnQgd3JpdGUgcG9zaXRpb24KCgkvLyBLaWNrIG9mZiB0aGUgUmVhZAoJLy9SZXR2YWwgPSBwU0RNTUNQLT5GdW5jcy5SZWFkX0YoKTsKCWlmKEZvcmNlTXVsdGlCbGtzKQoJCQlSZXR2YWwgPSBFTU1DX1JlYWRCbG9ja3MoKTsKCWVsc2UgaWYocFNETU1DUC0+VHJhbnMuTnVtQmxvY2tzID09IDEpCiAgICAgICAgICAgIFJldHZhbCA9IEVNTUNfUmVhZE9uZUJsb2NrKCk7CgllbHNlIC8vIG11bHRpcGxlIGJsb2NrcwogICAgICAgICAgICBSZXR2YWwgPSBFTU1DX1JlYWRCbG9ja3MoKTsKCglpZiAocFNETU1DUC0+U3RhdGUgPT0gRkFVTFQpCiAgICAgICAgICAgIFJldHZhbCA9IChFTU1DX0dldENhcmRFcnJvclN0YXRlKHBTRE1NQ1ApKTsJCQkvLyBUQkQgcy93IHJlc2V0PwoKI2lmZGVmIF9fU0RJT19VU0VfSU5UX18KI2Vsc2UKCXBTRE1NQ1AtPlN0YXRlID0gUkVBRFk7CiNlbmRpZgoKCXJldHVybiBSZXR2YWw7Cn0KCiNpZm5kZWYgRElTQUJMRV9FUkFTRV9XUklURQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiAgICBFTU1DX1dyaXRlQmxrKCkKKiAgICBpbnB1dDoKKgkgRGVzY3JpcHRpb246CioJCVRoaXMgZnVuY3Rpb24gd2lsbCB3cml0ZSBhcyBtYW55IGJ5dGVzIGFzIHNwZWNpZmllZCBmcm9tIExvY2FsQnVmZmVyIHRvIEZsYXNoCioJCU9mZnNldC4gVGhlIGZsYXNoIGRyaXZlciBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IGluaXRpYWxpemVkIHVzaW5nCioJCUluaXRpYWxpemVTRE1NQ0RyaXZlci4gVGhlIHJlbGF2ZW50IGFkZHJlc3NlcyBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IGVyYXNlZC4KKiAJCUlmIHRoZSBmdW5jdGlvbiBlbmNvdW50ZXJzIGFuIGVycm9yIGl0IHdpbGwgbm90CiogCQlyZS1hdHRlbXB0IHRoZSBvcGVyYXRpb24uCiogICAgSW5wdXRzOgoqCSAgIEZsYXNoT2Zmc2V0IC0gVGhlIHNvdXJjZSBhZGRyZXNzIG9uIHRoZSBmbGFzaCB3aGVyZSBkYXRhIHdpbGwgYmUgd3JpdHRlbiB0bwoqCQkJc3BlY2lmaWVkIGFzIGEgYnl0ZSB2YWx1ZS4gTXVzdCBiZSAzMiBiaXRzIGFsaWduZWQKKgkJTG9jYWxCdWZmZXIgLSBMb2NhbCBhZGRyZXNzIHdoZXJlIGRhdGEgd2lsbCBiZSBjb3BpZWQgZnJvbS4KKgkJU2l6ZSAtIFNwZWNpZmllcyBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUgLSAzMiBiaXRzIGFsaWduZWQKKgkJRmxhc2hCb290VHlwZSAtIE5vcm1hbCBvciBTYXZlIFN0YXRlIGZsYXNoCiogICAgb3V0cHV0OgoqICAgICAgIERlc2lyZWQgVmFsdWVzIGFyZSB3cml0dGVuIHRvIGZsYXNoCiogICAgcmV0dXJuczoKKiAgICAgICBXVFBUUCByZWNvZ25pemVkIGVycm9ycwoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovClVJTlRfVCBFTU1DX1dyaXRlQmxrIChsb25nIGxvbmcgRmxhc2hPZmZzZXQsIHVuc2lnbmVkIGNoYXIgKiBMb2NhbEJ1ZmZlciwgbG9uZyBsb25nIFNpemUsIHVuc2lnbmVkIGNoYXIgRm9yY2VNdWx0aUJsa3MpCnsKCVVJTlRfVCBSZXR2YWwgPSBOb0Vycm9yOwogICAgLy9VSU5UX1QgZmxhZ3MgPSBOT19GTEFHUzsKCS8vIEluaXRpYWxpemUgRmxhc2ggUHJvcGVydGllcwoKCVBfU0RNTUNfUHJvcGVydGllc19UIHBTRE1NQ1AgPSBFTU1DX0dldFByb3BlcnRpZXMoKTsKCgkvLyBNYWtlIHN1cmUgU3RhdGUgaXMgY29ycmVjdAoJaWYgKHBTRE1NQ1AtPlN0YXRlICE9IFJFQURZKQoJCXJldHVybiBTRE1NQ0RldmljZU5vdFJlYWR5RXJyb3I7CgoJLy8gU2V0IHVwIFN0YXRlCglwU0RNTUNQLT5TdGF0ZSA9IFdSSVRFOwoKCS8vIERvZXMgdGhlIHN0YXJ0L2VuZCBhZGRyZXNzZXMgYWxpZ24gb24gQmxvY2sgQm91bmRyaWVzPyBQcm9iYWJseSBub3QsIHJlY29yZCBkaXNjYXJkIGJ5dGVzCglwU0RNTUNQLT5UcmFucy5DYXJkQWRkcmVzcyA9IEZsYXNoT2Zmc2V0OwoJcFNETU1DUC0+VHJhbnMuU3RhcnREaXNjYXJkV29yZHMgPSBGbGFzaE9mZnNldCAlIHBTRE1NQ1AtPldyaXRlQmxvY2tTaXplOwoKCWlmICgoKEZsYXNoT2Zmc2V0ICsgU2l6ZSkgJSBwU0RNTUNQLT5Xcml0ZUJsb2NrU2l6ZSkgPT0gMCkKCQlwU0RNTUNQLT5UcmFucy5FbmREaXNjYXJkV29yZHMgPSAwOwoJZWxzZQoJCXBTRE1NQ1AtPlRyYW5zLkVuZERpc2NhcmRXb3JkcyA9IHBTRE1NQ1AtPldyaXRlQmxvY2tTaXplIC0gKChGbGFzaE9mZnNldCArIFNpemUpICUgcFNETU1DUC0+V3JpdGVCbG9ja1NpemUpOwoKCXBTRE1NQ1AtPlRyYW5zLk51bUJsb2NrcyA9ICgobG9uZyBsb25nKXBTRE1NQ1AtPlRyYW5zLkVuZERpc2NhcmRXb3JkcyArIChsb25nIGxvbmcpcFNETU1DUC0+VHJhbnMuU3RhcnREaXNjYXJkV29yZHMgKyBTaXplKSAvIHBTRE1NQ1AtPlJlYWRCbG9ja1NpemU7CglwU0RNTUNQLT5UcmFucy5UcmFuc1dvcmRTaXplID0gcFNETU1DUC0+VHJhbnMuTnVtQmxvY2tzICogcFNETU1DUC0+V3JpdGVCbG9ja1NpemUgLyA0OyAJCS8vIFRvdGFsIFRyYW5zZmVyIFNpemUgaW5jbHVkaW5nIHByZSBhbmQgcG9zdCwgaW4gd29yZHMKCgkvLyBDb252ZXJ0IHRvICMgb2Ygd29yZHMKCXBTRE1NQ1AtPlRyYW5zLlN0YXJ0RGlzY2FyZFdvcmRzIC89IDQ7CglwU0RNTUNQLT5UcmFucy5FbmREaXNjYXJkV29yZHMgLz0gNDsKCXBTRE1NQ1AtPlRyYW5zLkxvY2FsQWRkciA9ICh1aW50cHRyX3QpTG9jYWxCdWZmZXI7CglwU0RNTUNQLT5UcmFucy5Xb3JkSW5kZXggPSAwOwkJCQkJCQkJCS8vIFN0b3JlcyBJbmRleCBvZiBDdXJyZW50IHdyaXRlIHBvc2l0aW9uCgoJaWYoRm9yY2VNdWx0aUJsa3MpCgkJUmV0dmFsID0gRU1NQ19Xcml0ZUJsb2NrcygpOwoJZWxzZSBpZihwU0RNTUNQLT5UcmFucy5OdW1CbG9ja3MgPT0gMSkKCQlSZXR2YWwgPSBFTU1DX1dyaXRlT25lQmxvY2soKTsKCWVsc2UKCQlSZXR2YWwgPSBFTU1DX1dyaXRlQmxvY2tzKCk7CgoJaWYgKHBTRE1NQ1AtPlN0YXRlID09IEZBVUxUKQoJCVJldHZhbCA9IChFTU1DX0dldENhcmRFcnJvclN0YXRlKHBTRE1NQ1ApKTsJCS8vIFRCRCBzL3cgcmVzZXQ/CiNpZmRlZiBfX1NESU9fVVNFX0lOVF9fCiNlbHNlCglwU0RNTUNQLT5TdGF0ZSA9IFJFQURZOwojZW5kaWYKCglyZXR1cm4gUmV0dmFsOwp9CiNlbmRpZgoKCmludCBFTU1DX1JFQUQoIHVuc2lnbmVkIGludCBzdGFydF9ibGssIHVuc2lnbmVkIGludCBibGssIHVuc2lnbmVkIGNoYXIgKnB1Y2hSZWFkQnVmZiwgdW5zaWduZWQgY2hhciBGb3JjZU11bHRpQmxrcykKewoJLy9pbnQgcnRuID0gMDsKCXVuc2lnbmVkIGludCBpUmVzdWx0PTB4RkZGRjsKCVBfU0RNTUNfUHJvcGVydGllc19UIHBTRE1NQ1AgPSBFTU1DX0dldFByb3BlcnRpZXMoKTsKCgl3aGlsZShpUmVzdWx0ICE9IE5vRXJyb3IpCgl7CgkJZGVsYXlfbXMoMSk7CiAgICAgICAgCVJFR19SRUFEMzIoKCh1aW50cHRyX3QpcEVNTUNDVFJMKzB4MjQpLCZpUmVzdWx0KTsKCQkJaWYoKGlSZXN1bHQmMHgzMDcpPT0wKQoJCQl7CgkJCQlpUmVzdWx0ID0gRU1NQ19DaGVja0NhcmRTdGF0dXMocFNETU1DUCwgMHg5MDAsIFIxX0xPQ0tFRENBUkRNQVNLKTsJCS8vIE1ha2Ugc3VyZSBjYXJkIGlzIHRyYW5zZmVyIG1vZGUKCQkJfQoJfQoJaVJlc3VsdCA9IEVNTUNfUmVhZEJsaygobG9uZyBsb25nKTB4MjAwICogc3RhcnRfYmxrLCBwdWNoUmVhZEJ1ZmYsIChsb25nIGxvbmcpMHgyMDAgKiBibGssIEZvcmNlTXVsdGlCbGtzKTsKCWlmIChpUmVzdWx0ICE9IE5vRXJyb3IpCgl7CgkJRU1NQ19QUk4oUFJOX1JFUywgIlxuIFJlYWQgZmFpbGVkLiBcbiIpOwoJCXJldHVybiAtMTsKCX0KCXJldHVybiAwOwp9CgppbnQgZG9fZW1tY3JlYWQodW5zaWduZWQgbG9uZyBsb25nIHN0YXJ0LCB1bnNpZ25lZCBpbnQgYmxrcywgdW5zaWduZWQgY2hhciAqIGJ1ZmZlcikKewoJdWludDMyX3Qgc3RhcnQxID0gKHVpbnQzMl90KShzdGFydC8weDIwMCk7CiNpZmRlZiBDT05GSUdfRENBQ0hFCglmbHVzaF9kY2FjaGVfYWxsKCk7CiNlbmRpZgoJRU1NQ19QUk4oUFJOX1JFUywgIlxuIHJlYWQgJXggJXggJXggXG4iLCBzdGFydDEsIGJsa3MsIGJ1ZmZlcik7CglyZXR1cm4gRU1NQ19SRUFEKHN0YXJ0MSwgYmxrcywgYnVmZmVyLCAweDApOwp9CgppbnQgRU1NQ19XUklURSggdW5zaWduZWQgaW50IHN0YXJ0X2JsaywgdW5zaWduZWQgaW50IGJsaywgdW5zaWduZWQgY2hhciAqcHVjaFdyaXRlQnVmZiwgdW5zaWduZWQgY2hhciBGb3JjZU11bHRpQmxrcykKewojaWZuZGVmIERJU0FCTEVfRVJBU0VfV1JJVEUKCS8vaW50IHJ0bjsKCXVuc2lnbmVkIGludCBpUmVzdWx0PTB4RkZGRjsKCVBfU0RNTUNfUHJvcGVydGllc19UIHBTRE1NQ1AgPSBFTU1DX0dldFByb3BlcnRpZXMoKTsKCgl3aGlsZShpUmVzdWx0ICE9IE5vRXJyb3IpCgl7CgkJZGVsYXlfbXMoMSk7CiAgICAgICAgCVJFR19SRUFEMzIoKCh1aW50cHRyX3QpcEVNTUNDVFJMKSsweDI0LCZpUmVzdWx0KTsKCQlpZigoaVJlc3VsdCYweDMwNyk9PTApCgkJewoJCQlpUmVzdWx0ID0gRU1NQ19DaGVja0NhcmRTdGF0dXMocFNETU1DUCwgMHg5MDAsIFIxX0xPQ0tFRENBUkRNQVNLKTsJCS8vIE1ha2Ugc3VyZSBjYXJkIGlzIHRyYW5zZmVyIG1vZGUKCQl9Cgl9CgoJaVJlc3VsdCA9IEVNTUNfV3JpdGVCbGsoKGxvbmcgbG9uZykweDIwMCAqIHN0YXJ0X2JsaywgcHVjaFdyaXRlQnVmZiwgKGxvbmcgbG9uZykweDIwMCAqIGJsaywgRm9yY2VNdWx0aUJsa3MpOwoKCWlmIChpUmVzdWx0ICE9IE5vRXJyb3IpCgl7CgkJRU1NQ19QUk4oUFJOX0VSUiwgIlxuIHdyaXRlIGZhaWxlZC4gXG4iKTsKCQlyZXR1cm4gLTE7Cgl9CiNlbmRpZgoJcmV0dXJuIDA7Cn0KCmludCBkb19lbW1jd3JpdGUodW5zaWduZWQgbG9uZyBsb25nIHN0YXJ0LCB1bnNpZ25lZCBpbnQgYmxrcywgdW5zaWduZWQgY2hhciAqIGJ1ZmZlcikKewoJdWludDMyX3Qgc3RhcnQxID0gKHVpbnQzMl90KShzdGFydC8weDIwMCk7CglFTU1DX1BSTihQUk5fRVJSLCAiXG4gd3JpdGUgJXggJXggJXggXG4iLCBzdGFydCwgYmxrcywgYnVmZmVyKTsKI2lmZGVmIENPTkZJR19EQ0FDSEUKCWZsdXNoX2RjYWNoZV9hbGwoKTsKI2VuZGlmCglyZXR1cm4gRU1NQ19XUklURShzdGFydDEsIGJsa3MsIGJ1ZmZlciwgMHgwKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgTU00X01NQ1JlYWRFWFRDU0QKKiAJUmVhZHMgaW4gNTEyIGJ5dGVzIG9mIEV4dGVuZGVkIENTRAoqICAgSW5wdXQ6IFBvaW50ZXIgdG8gNTEyIGJ5dGUgYnVmZmVyCiogICBPdXRwdXQ6CiogICBSZXR1cm5zOiBOb0Vycm9yLCBSZWFkRXJyb3Igb3IgTm90U3VwcG9ydGVkRXJyb3IKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KVUlOVF9UIEVNTUNfUmVhZEVYVENTRCAoVUlOVF9UICpwQnVmZmVyKQp7CglVSU5UX1QgUmV0dmFsOwoJUF9NTTRfU0RNTUNfQ09OVEVYVF9UIHBDb250ZXh0OwogCS8vUF9NTTRfQ05UTDEgcE1NNF9DTlRMMTsKIAlQX01NNF9CTEtfQ05UTCBwTU00X0JMS19DTlRMOwoJaW50IHRpbWVzID0gMTA7CgoJLy8gSW5pdGlhbGl6ZSBGbGFzaCBQcm9wZXJ0aWVzCglQX1NETU1DX1Byb3BlcnRpZXNfVCBwU0RNTUNQID0gRU1NQ19HZXRQcm9wZXJ0aWVzKCk7CgoJd2hpbGUgKHRpbWVzLS0pIHsKCQlkZWxheV9tcygxKTsKCQlSZXR2YWwgPSBFTU1DX0NoZWNrQ2FyZFN0YXR1cyhwU0RNTUNQLCAweDkwMCwgUjFfTE9DS0VEQ0FSRE1BU0spOwoJCWlmIChSZXR2YWwgPT0gTm9FcnJvcikKCQkJYnJlYWs7Cgl9CgoJaWYgKHRpbWVzID09IDApIHsKCQlkYmdfcHJpbnRmKFBSTl9FUlIsICJSZWFkRVhUQ1NEIGNoZWNrIGNhcmQgZmFpbFxuIik7Cgl9LyoqLwoKCS8vIEFzc2lnbiBvdXIgY29udGV4dCB2YWx1ZQoJcENvbnRleHQgPSAoUF9NTTRfU0RNTUNfQ09OVEVYVF9UKSBwU0RNTUNQLT5wQ29udGV4dDsKCS8vcE1NNF9DTlRMMSA9IChQX01NNF9DTlRMMSkgJnBDb250ZXh0LT5wTU1DNFJlZy0+bW00X2NudGwxOwoKCS8vIFNldCB1cCBTdGF0ZQoJcFNETU1DUC0+U3RhdGUgPSBSRUFEOwoJcFNETU1DUC0+UmVhZEJsb2NrU2l6ZSA9IEhBUkQ1MTJCTE9DS0xFTkdUSDsKCgkvLyBUaGlzIHJlcXVpcmVzIGEgdHJhbnNmZXIgb3ZlciB0aGUgZGF0YSBsaW5lcy4KCXBNTTRfQkxLX0NOVEwgPSAoUF9NTTRfQkxLX0NOVEwpICZwQ29udGV4dC0+cE1NQzRSZWctPm1tNF9ibGtfY250bDsKCXBNTTRfQkxLX0NOVEwtPmJsa19jbnQgPSAxOwoJcE1NNF9CTEtfQ05UTC0+eGZyX2Jsa3N6ID0gcFNETU1DUC0+UmVhZEJsb2NrU2l6ZTsKCWlmIChwU0RNTUNQLT5TRE1BX01vZGUpCgl7CgkJcE1NNF9CTEtfQ05UTC0+ZG1hX2J1ZnN6ID0gTU00XzUxMl9IT1NUX0RNQV9CRFJZOwoJCXBDb250ZXh0LT5wTU1DNFJlZy0+bW00X3N5c2FkZHIgPSAoVUlOVF9UKSh1aW50cHRyX3QpcEJ1ZmZlcjsKCgkJRU1NQ0hDX0RtYVNlbGVjdChwQ29udGV4dCwgMHgwMCk7ICAvLyBzZXQgRE1BIHNlbGVjdCBTRE1BCgkJRU1NQ19QUk4oUFJOX1JFUywgIlxuICVzLCBTRE1BIE1vZGUsIEFETUEgaW5kZXggJWRcbiAiLCBfX2Z1bmNfXywgZ19BRE1BX3JkKTsKCX0gLy9NTUNfU0RNQV9NT0RFCglwU0RNTUNQLT5UcmFucy5TdGFydERpc2NhcmRXb3JkcyA9IDA7CglwU0RNTUNQLT5UcmFucy5FbmREaXNjYXJkV29yZHMgPSAwOwkJCQkJCQkJLy8gV2UnbGwgdGFrZSBhbGwgNTEyIGJ5dGVzCglwU0RNTUNQLT5UcmFucy5UcmFuc1dvcmRTaXplID0gcFNETU1DUC0+UmVhZEJsb2NrU2l6ZSAvIDQ7IAkJLy8gVG90YWwgVHJhbnNmZXIgU2l6ZSBpbmNsdWRpbmcgcHJlIGFuZCBwb3N0IGJ5dGVzCglwU0RNTUNQLT5UcmFucy5Mb2NhbEFkZHIgPSAoVUlOVF9UKSh1aW50cHRyX3QpcEJ1ZmZlcjsKCXBTRE1NQ1AtPlRyYW5zLldvcmRJbmRleCA9IDA7CQkJCQkJCQkJLy8gU3RvcmVzIEluZGV4IG9mIEN1cnJlbnQgd3JpdGUgcG9zaXRpb24KCXBTRE1NQ1AtPlRyYW5zLk51bUJsb2NrcyA9IDE7CgoJLy8gb25seSBuZWVkIHhmZXIgaW50ZXJydXB0CglFTU1DSENfRW5hYmxlQ21kSW50ZXJydXB0KHBDb250ZXh0LCAwKTsKCglFTU1DX1NlbmREYXRhQ29tbWFuZE5vQXV0bzEyKHBTRE1NQ1AsIFhMTFBfTU1DX0NNRDgsIE5PX0FSR1VNRU5ULCBNTTRfU0lOR0xFX0JMT0NLX1RSQU4sIE1NNF9DQVJEX1RPX0hPU1RfREFUQSwgTU00X1JUX1IxIHwgTU00XzQ4X1JFUyk7CgoJLy8gR2V0IHRoZSBDYXJkIFJlc3BvbnNlCglSZXR2YWwgPSBFTU1DX0ludGVycHJldF9SZXNwb25zZShwU0RNTUNQLCBNTUNfUkVTUE9OU0VfUjEsIDB4MTAwKTsKCUVNTUNfUFJOKFBSTl9JTkZPLCAiXG5SZXR2YWwgPSAweCVYICEsIHN0YXRlID0gJWRcbiBSU1AxID0gMHgleFxuIixSZXR2YWwsIHBTRE1NQ1AtPlN0YXRlLCBwU0RNTUNQLT5DYXJkUmVwb25zZS5SMV9SRVNQKTsJLy8gR2V0IHRoZSBDYXJkIFJlc3BvbnNlCgoJLy8gZW5hYmxlIGNtZCBjb21wbGV0ZSBpbnRlcnJ1cHQKCUVNTUNIQ19FbmFibGVDbWRJbnRlcnJ1cHQocENvbnRleHQsIDEpOwoKCXRpbWVzID0gMTA7Cgl3aGlsZSAodGltZXMtLSkgewoJCWRlbGF5X21zKDIpOwoJCVJldHZhbCA9IEVNTUNfQ2hlY2tDYXJkU3RhdHVzKHBTRE1NQ1AsIDB4OTAwLCBSMV9MT0NLRURDQVJETUFTSyk7CgkJaWYgKFJldHZhbCA9PSBOb0Vycm9yKQoJCQlicmVhazsKCX0KCglpZiAoMCA9PSB0aW1lcykgewoJCWRiZ19wcmludGYoUFJOX0VSUiwgIlJlYWRFWFRDU0QgMiBjaGVjayBjYXJkIGZhaWxcbiIpOwoJfS8qKi8KCglwU0RNTUNQLT5TdGF0ZSA9IFJFQURZOwoKCWlmIChSZXR2YWwgIT0gTm9FcnJvcikKCQlyZXR1cm4gU0RNTUNfU1dJVENIX0VSUk9SOwoKCXJldHVybiBOb0Vycm9yOwp9CgpzdGF0aWMgdW5zaWduZWQgY2hhciBTRElPX1JEX0JVRkZbNTEyXTsKVUlOVF9UIEVNTUNfR2V0X0V4dGNzZCh2b2lkKQp7CiAgICBVSU5UX1QgaT0wLFJldHZhbD0wOwogICAgVUlOVF9UICogYnVmZmVyPShVSU5UX1QgKilTRElPX1JEX0JVRkY7CiAgICBQX1NETU1DX1Byb3BlcnRpZXNfVCBwU0RNTUNQID0gRU1NQ19HZXRQcm9wZXJ0aWVzKCk7CiNpZmRlZiBDT05GSUdfRENBQ0hFCiAgICBmbHVzaF9kY2FjaGVfYWxsKCk7CiNlbmRpZgoKICAgIFJldHZhbCA9IEVNTUNfUmVhZEVYVENTRChidWZmZXIpOwojaWZkZWYgQ09ORklHX0RDQUNIRQogICAgaW52YWxpZGF0ZV9kY2FjaGVfYWxsKCk7CiNlbmRpZgogICAgcFNETU1DUC0+U3RhdGUgPSBSRUFEWTsKICAgIEVNTUNfUFJOKFBSTl9JTkZPLCJlTU1DIEVYVCBDU0QgcmVnaXN0ZXJzOlxuIik7CgogICAgZm9yKGk9MDtpPDEyODtpKyspCiAgICB7CgkJaWYoaSU0PT0wKQoJCQlFTU1DX1BSTihQUk5fTk9USUNFLCAiXG5CeXRlcyAlZCB+ICVkOlx0IixpKjQsaSo0KzE1KTsKCQlFTU1DX1BSTihQUk5fTk9USUNFLCAiMHgleCAgMHgleCAgMHgleCAgMHgleCAgIiwgYnVmZmVyW2ldJjB4RkYsIChidWZmZXJbaV0mMHhGRjAwKT4+OCwKCQkJCShidWZmZXJbaV0mMHhGRjAwMDApPj4xNiwgKGJ1ZmZlcltpXSYweEZGMDAwMDAwKT4+MjQpOwogICAgfQoJZ19kZXZpY2Vfc2VjdG9yX2NvdW50PWJ1ZmZlcls1M107CglycG1iUGFydF9zZWN0b3JfY291bnQgPSAoKHVuc2lnbmVkIGNoYXIgKilidWZmZXIpWzE2OF07CglFTU1DX1BSTihQUk5fSU5GTywiXG5EZXZpY2Ugc2VjdG9yIGNvdW50IChjYXBhY2l0eSkgaXMgJWQgXG4iLGdfZGV2aWNlX3NlY3Rvcl9jb3VudCk7CgogICAgZ19lbW1jX1dQX2luZm8mPTB4RkZGRjAwMDA7CiAgICBnX2VtbWNfV1BfaW5mb3w9KCh1bnNpZ25lZCBjaGFyKilidWZmZXIpWzE3MV07CiAgICBnX2VtbWNfV1BfaW5mb3w9KCgodW5zaWduZWQgY2hhciopYnVmZmVyKVsxNzNdKTw8ODsKICAgIHJldHVybiBSZXR2YWw7Cn0KCmxvbmcgbG9uZyBkb19lbW1jX2NhcGFjaXR5KHZvaWQpCnsKCUVNTUNfR2V0X0V4dGNzZCgpOwoJRU1NQ19QUk4oUFJOX0lORk8sICJjbWRfRU1NQ19FWFRDU0QgY2FwYWNpdHk9MHgleCBCeXRlc1xuIiwgKGdfZGV2aWNlX3NlY3Rvcl9jb3VudCAqIDUxMikpOwoJcmV0dXJuIChnX2RldmljZV9zZWN0b3JfY291bnQgKiA1MTIpOwp9CgojaWYgMAppbnQgRU1NQ19NMk1fRVgodW5zaWduZWQgaW50IHN0YXJ0X2JsaywgdW5zaWduZWQgaW50IGNudCwgdW5zaWduZWQgY2hhciAqYnVmX3JkLCB1bnNpZ25lZCBjaGFyICpidWZfd3IsdW5zaWduZWQgaW50IGFsaWdubWVudCx1bnNpZ25lZCBpbnQgZmxhZykKewogICAgaW50IHJ0bixpLGosYnVmX3JkX2Jhc2UsYnVmX3dyX2Jhc2U7CiAgICB1bnNpZ25lZCBpbnQgYmxrOwoKICAgIHNyYW5kKDB4OTQ3MjU0MDgpOwoJLy8gcHJlLWZpbGwgd3JpdGUgcGF0dGVybgoKICAgCS8vbWVtWE9SKGJ1Zl93ciw1MTIsMSk7CiAgICBidWZfcmRfYmFzZT1idWZfcmQtYWxpZ25tZW50OwogICAgYnVmX3dyX2Jhc2U9YnVmX3dyLWFsaWdubWVudDsKCiAgICBmb3IgKGk9Y250O2k+MDtpLS0pCiAgICB7CiAgICAgICAgYmxrPXN0YXJ0X2JsazsKICAgICAgICBFTU1DX1BSTihQUk5fUkVTLCJcbiBibGsgaXMgMHgleCAiLCBibGspOwogICAgICAgIGJ1Zl9yZD1idWZfcmRfYmFzZTsKICAgICAgICBidWZfd3I9YnVmX3dyX2Jhc2U7CiAgICAgICAgbWVtc2V0KGJ1Zl9yZCwweDVBLDB4MjAwMDAwKTsKICAgICAgICBtZW1zZXQoYnVmX3dyLDB4NUEsMHgyMDAwMDApOwogICAgICAgIHJ0bj1FTU1DX1dyaXRlQmxrKChsb25nIGxvbmcpYmxrKjB4MjAwLCBidWZfd3IrYWxpZ25tZW50LCBTRElPXzY0S19CT1VOREFSWSoweDIwKTsKCiAgICAgICAgRU1NQ19QUk4oUFJOX1JFUywgIlxuKlxuIikgOwogICAgICAgIGZvcihqPTA7ajwweDIwO2orKykKICAgICAgICB7CiAgICAgICAgICAgIEVNTUNfUFJOKFBSTl9SRVMsICJAIikgOwogICAgICAgICAgICBidWZfcmQrPVNESU9fNjRLX0JPVU5EQVJZOwogICAgICAgICAgICBidWZfd3IrPVNESU9fNjRLX0JPVU5EQVJZOwoKICAgICAgICAgICAgaWYoZmxhZz09MCkKICAgICAgICAgICAgewoJCQlpZigodW5zaWduZWQgaW50KWJ1Zl9yZCUweDgwMDAwK1NESU9fNjRLX0JPVU5EQVJZPjB4ODAwMDApCgkJCXsKCQkJCWJ1Zl9yZCs9U0RJT182NEtfQk9VTkRBUlk7CgkJCQlFTU1DX1BSTihQUk5fUkVTLCJcbiBTa2lwIGJvdW5kYXJ5Ok5vdyBidXJfcmQgaXMgMHgleCBcbiIsYnVmX3JkKTsKCQkJfQoJCQlpZigodW5zaWduZWQgaW50KWJ1Zl93ciUweDgwMDAwK1NESU9fNjRLX0JPVU5EQVJZPjB4ODAwMDApCgkJCXsKCQkJCWJ1Zl93cis9U0RJT182NEtfQk9VTkRBUlk7CgkJCQlFTU1DX1BSTihQUk5fUkVTLCJcbiBTa2lwIGJvdW5kYXJ5Ok5vdyBidXJfd3IgaXMgMHgleCBcbiIsYnVmX3dyKTsKCQkJfQoJCX0KCiAgICAgICAgICAgIC8vCQkJbWVtWE9SKGJ1Zl93cixTRElPXzY0S19CT1VOREFSWSxpKTsKICAgICAgICAgICAgLy9ibGs9cmFuZCgpJTEwMjQrc3RhcnRfYmxrOwogICAgICAgICAgICBibGsrPVNESU9fNjRLX0JPVU5EQVJZLzB4MjAwOwogICAgICAgICAgICBFTU1DX1BSTihQUk5fSU5GTywiXG4gaXRlcmF0aW9uICVkIGJsb2NrICVkIE0yTSB0ZXN0ICIsaSxibGspOwoKICAgICAgICAgICAgLyojaWZuZGVmIE1VTFRJX1NESU8KICAgICAgICAgICAgcnRuPVNESU9Xcml0ZU9uZUJsaygweDIwMCpibGssYnVmX3dyLDB4MjAwKTsKICAgICAgICAgICAgcnRuPVNESU9SZWFkT25lQmxrKDB4MjAwKmJsayxidWZfcmQsMHgyMDApOwojZWxzZSovCiAgICAgICAgICAgIEVNTUNfUFJOKFBSTl9JTkZPLCJcbiB3cml0ZSBkYXRhIHRvIGJsb2NrIDB4JXggIiwgYmxrKTsKCiAgICAgICAgICAgIC8vcnRuPVNESU9Xcml0ZU9uZUJsayh1Y2hDYXJkSWQsIChsb25nIGxvbmcpYmxrKjB4MjAwLCBidWZfd3IsIFNESU9fNjRLX0JPVU5EQVJZKTsKICAgICAgICAgICAgcnRuPUVNTUNfV1JJVEUoYmxrLFNESU9fNjRLX0JPVU5EQVJZLzB4MjAwLGJ1Zl93cik7CgogICAgICAgICAgICBFTU1DX1BSTihQUk5fSU5GTywiXG4gcmVhZCBkYXRhIGZyb20gYmxvY2sgMHgleCAiLCBibGspOwogICAgICAgICAgICAvL3J0bj1TRElPUmVhZE9uZUJsayh1Y2hDYXJkSWQsIChsb25nIGxvbmcpYmxrKjB4MjAwLCBidWZfcmQsIFNESU9fNjRLX0JPVU5EQVJZKTsKICAgICAgICAgICAgcnRuPUVNTUNfUkVBRChibGssU0RJT182NEtfQk9VTkRBUlkvMHgyMDAsYnVmX3JkKTsKICAgICAgICAgICAgLy8jZW5kaWYKCiAgICAgICAgICAgIC8vcnRuID0gbWVtQ2hlY2soYnVmX3JkLCBidWZfd3IsNTEyLDEpOwogICAgICAgICAgICAvLwkJCXJ0biA9IAltZW1DaGVjayhidWZfcmQsIGJ1Zl93cixTRElPXzY0S19CT1VOREFSWSxpKTsKICAgICAgICAgICAgcnRuID0gCW1lbWNtcChidWZfcmQsIGJ1Zl93cixTRElPXzY0S19CT1VOREFSWSk7CiAgICAgICAgICAgIGlmIChydG4gPT0gMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRU1NQ19QUk4oUFJOX1JFUywiLi4uIEZhaWwgYXQgYnVmX3JkIHN0YXJ0aW5nIDB4JTA4WCwgYnVmX3dyIHN0YXJ0aW5nIDB4JTA4WFxuIixidWZfcmQsYnVmX3dyKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewoJCQkJRU1NQ19QUk4oUFJOX0lORk8sIi4uLiBQYXNzIGF0IGJ1Zl9yZCBzdGFydGluZyAweCUwOFgsIGJ1Zl93ciBzdGFydGluZyAweCUwOFhcbiIsYnVmX3JkLGJ1Zl93cik7CiAgICAgICAgICAgIH0KCgl9CgogICAgfQoKCWlmKHJ0biA9PSAxKXsKCQkvLwlkdW1wIHRoZSByZWFkIGFuZCB3cml0ZSBkYXRhCgkJRU1NQ19QUk4oUFJOX0lORk8sIi4uLi4uLi4uLi4uLi4gRGF0YSBpbiBXcml0ZSBidWZmZXIgLi4uLi4uLi4uLi5cbiIpOwoJCWZvcihpPTA7IGk8NTEyOyBpKyspewoJCQlFTU1DX1BSTihQUk5fSU5GTywgIjB4JTAyeFx0IiwgKigodW5zaWduZWQgY2hhciAqKShidWZfd3IraSkpICkgOwoJCQlpZihpJTggPT0gNylFTU1DX1BSTihQUk5fSU5GTywgIlxuIikgOwoJCX0KCgkJRU1NQ19QUk4oUFJOX0lORk8sIlxuXG5cbi4uLi4uLi4uLi4uLi4gRGF0YSBpbiByZWFkIGJ1ZmZlciAuLi4uLi4uLi4uLlxuIik7CgkJZm9yKGk9MDsgaTw1MTI7IGkrKyl7CgkJCUVNTUNfUFJOKFBSTl9JTkZPLCAiMHglMDJ4XHQiLCAqKCh1bnNpZ25lZCBjaGFyICopKGJ1Zl9yZCtpKSkgKSA7CgkJCWlmKGklOCA9PSA3KUVNTUNfUFJOKFBSTl9JTkZPLCAiXG4iKSA7CgkJfQoJfQoKCWlmICgwID09IHJ0bikKCQlFTU1DX1BSTihQUk5fUkVTLCAiXG4gU0RJTyBNMk0gUGFzc2VkIChETUEgYWxpZ25tZW50IGJ1Zl9yZCAweCVYLCBidWZfd3IgMHglWClcbiIsYnVmX3JkX2Jhc2UsYnVmX3dyX2Jhc2UpOwoJZWxzZQoJCUVNTUNfUFJOKFBSTl9SRVMsIlxuIFNESU8gTTJNIEZhaWxlZCAoRE1BIGFsaWdubWVudCBidWZfcmQgMHglWCwgYnVmX3dyIDB4JVgpXG4iLGJ1Zl9yZF9iYXNlLGJ1Zl93cl9iYXNlKTsKICAgICAgICByZXR1cm4gcnRuOwp9CiNlbmRpZgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBEZXNjcmlwdGlvbjoKICAgIFNldCB1cCB0aGUgcmVnaXN0ZXJzIG9mIHRoZSBjb250cm9sbGVyIHRvIHN0YXJ0IHRoZSB0cmFuc2FjdGlvbiB0bwogICAgY29tbXVuaWNhdGUgdG8gdGhlIGNhcmQgZm9yIHNldHVwIHJlbGF0ZWQgY29tbWFuZHMuCiAgICBUaGUgY29tbWFuZHMgYXJlIGNsZWFybHkgZGVmaW5lZCBpbiB0aGUgTU1DIHNwZWNpZmljYXRpb24uCiAgSW5wdXQgUGFyYW1ldGVyczoKCSAgIFBfU0RNTUNfUHJvcGVydGllc19UIHBTRE1NQ1AgLSBHZW5lcmljIFNEL01NQyBkcml2ZXIgcHJvcGVydGllcyBzdHJ1Y3R1cmUKCUNtZAoJCUNvbW1hbmQgSW5kZXggLSBTZWUgTU1DIG9yIFNEIHNwZWNpZmljYXRpb24KICAgIGFyZ3VtZW50CiAgICAgIAl0aGUgYXJndW1lbnQgb2YgIHRoZSBjb21tYW5kLiBNU1cgaXMgZm9yIEFSR0ggYW5kIExTVyBpcyBmb3IgQVJHTAoJUmVzVHlwZQoJCUV4cGVjdGVkIHJlc3BvbnNlIHR5cGUKICBPdXRwdXQgUGFyYW1ldGVyczoKICAgIE5vbmUKICBSZXR1cm5zOgogICAgTm9uZQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLwovLyBbMTI3OjhdIC0tPiBSRUdbMTE5OjBdCi8vCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCnZvaWQgRU1NQ19HZXRfQ0lEKFBfU0RNTUNfUHJvcGVydGllc19UIHBTRE1NQ1ApCnsKICAgIHVuc2lnbmVkIGludCAgIG1fY21kUmVzcG9uc2VbNF07CiAgICBTRElPX0NJRCBtX2NpZDsKICAgIG1fY21kUmVzcG9uc2VbMF09cFNETU1DUC0+Q2FyZFJlcG9uc2UucEJ1ZmZlclswXTsKICAgIG1fY21kUmVzcG9uc2VbMV09cFNETU1DUC0+Q2FyZFJlcG9uc2UucEJ1ZmZlclsxXTsKICAgIG1fY21kUmVzcG9uc2VbMl09cFNETU1DUC0+Q2FyZFJlcG9uc2UucEJ1ZmZlclsyXTsKICAgIG1fY21kUmVzcG9uc2VbM109cFNETU1DUC0+Q2FyZFJlcG9uc2UucEJ1ZmZlclszXTsKCgkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8gZGVjb2RlIG1fY2lkIGZpZWxkczogaGlnaCA4IGJpdHMgaWdub3JlZAogICAgLy8gTm90ZTogY2FyZCBpbmZvcm1hdGlvbiBpcyBub3QgdXNlZCBieSB0aGlzIGRyaXZlci4gSWYKICAgIC8vICAgICAgIE9FTSBhc2tzIGZvciB0aGlzLCBhZGQgYW4gQVBJLgoJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICBtX2NpZC5tYW51ZmFjdHVyZUlEID0gKHVuc2lnbmVkIGNoYXIpKG1fY21kUmVzcG9uc2VbM10+PjE2JjB4MDBmZik7CiAgICBtX2NpZC5PRU1bMF0gPSAobV9jbWRSZXNwb25zZVszXT4+OCAmMHhmZik7CiAgICBtX2NpZC5PRU1bMV0gPSAobV9jbWRSZXNwb25zZVszXSYweGZmKTsKICAgIG1fY2lkLk9FTVsyXSA9IDA7CiAgICBtX2NpZC5uYW1lWzBdID0gKG1fY21kUmVzcG9uc2VbMl0+PjI0ICYweGZmKTsKICAgIG1fY2lkLm5hbWVbMV0gPSAobV9jbWRSZXNwb25zZVsyXT4+MTYgJjB4ZmYpOwogICAgbV9jaWQubmFtZVsyXSA9IChtX2NtZFJlc3BvbnNlWzJdPj44ICYweGZmKTsKICAgIG1fY2lkLm5hbWVbM10gPSAobV9jbWRSZXNwb25zZVsyXSAmMHhmZik7CiAgICBtX2NpZC5uYW1lWzRdID0gKG1fY21kUmVzcG9uc2VbMV0+PjI0ICYweGZmKTs7CgoKICAgIG1fY2lkLm5hbWVbNV0gPSAobV9jbWRSZXNwb25zZVsxXT4+MTYgJjB4ZmYpOzsKICAgIG1fY2lkLm5hbWVbNl0gPQkwOwogICAgbV9jaWQucmV2aXNpb24gPSAobV9jbWRSZXNwb25zZVsxXT4+OCAmMHhmZik7OwogICAgbV9jaWQuc2VyaWFsTnVtYmVyID0obV9jbWRSZXNwb25zZVsxXSAmMHhGRik7CiAgICBtX2NpZC5zZXJpYWxOdW1iZXIgPDw9IDI0OwogICAgbV9jaWQuc2VyaWFsTnVtYmVyIHw9IChtX2NtZFJlc3BvbnNlWzBdPj44ICYweEZGRkZGRik7CiAgICBtX2NpZC5tYW51ZmFjdHVyZURhdGUgPSAobV9jbWRSZXNwb25zZVswXSAmMHhGRik7OwoKCiAgICBFTU1DX1BSTihQUk5fSU5GTywiXG4gQ0lEOiIpOwogICAgRU1NQ19QUk4oUFJOX0lORk8sIlxuICUwOHggJTA4eCAlMDh4ICUwOHg6IixtX2NtZFJlc3BvbnNlWzBdLG1fY21kUmVzcG9uc2VbMV0sbV9jbWRSZXNwb25zZVsyXSxtX2NtZFJlc3BvbnNlWzNdKTsKICAgIEVNTUNfUFJOKFBSTl9JTkZPLCJcbiBNYW51ZmFjdHVyZSBJRDolZCIsbV9jaWQubWFudWZhY3R1cmVJRCk7CiAgICBFTU1DX1BSTihQUk5fSU5GTywiXG4gUHJvZHVjdCBuYW1lOiVzIixtX2NpZC5uYW1lKTsKICAgIEVNTUNfUFJOKFBSTl9JTkZPLCJcbiBTZXJpYWwgTnVtYmVyOiV4IixtX2NpZC5zZXJpYWxOdW1iZXIpOwogICAgewojaWZkZWYgREVCVUdfUFJOCiAgICB1bnNpZ25lZCBzaG9ydCBtb250aCx5ZWFyOwogICAgbW9udGggPSBtX2NpZC5tYW51ZmFjdHVyZURhdGU+PjQmMHhGOwogICAgeWVhciA9IChtX2NpZC5tYW51ZmFjdHVyZURhdGUmMHgwRikrMTk5NzsKICAgIEVNTUNfUFJOKFBSTl9JTkZPLCJcbiBtb250aD0lZCwgeWVhcj0lZCIsbW9udGgseWVhcik7CiNlbmRpZgogICAgfQoKICAgIGdfbWFudWZhY3R1cmVySUQ9bV9jaWQubWFudWZhY3R1cmVJRCA7CiAgICBnX3NlcmlhbE51bT0obV9jaWQuc2VyaWFsTnVtYmVyJjB4RkZGRkZGRkYpOwp9CgoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vCi8vICBHZXQgY2FyZCBDU0QKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCnZvaWQgRU1NQ19HZXRfQ1NEKFBfU0RNTUNfUHJvcGVydGllc19UIHBTRE1NQ1ApCnsKCS8vdW5zaWduZWQgc2hvcnQgU0RJT19SZXNwb25zZVs4XTsKICAgIHVuc2lnbmVkIGludCAgIG1fY21kUmVzcG9uc2VbNF07CiAgICBTRElPX0NTRCBtX2NzZDsKICAgIG1fY21kUmVzcG9uc2VbMF0gPSBwU0RNTUNQLT5DYXJkUmVwb25zZS5wQnVmZmVyWzBdOwogICAgbV9jbWRSZXNwb25zZVsxXSA9IHBTRE1NQ1AtPkNhcmRSZXBvbnNlLnBCdWZmZXJbMV07CiAgICBtX2NtZFJlc3BvbnNlWzJdID0gcFNETU1DUC0+Q2FyZFJlcG9uc2UucEJ1ZmZlclsyXTsKICAgIG1fY21kUmVzcG9uc2VbM10gPSBwU0RNTUNQLT5DYXJkUmVwb25zZS5wQnVmZmVyWzNdOwoKCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvLyBkZWNvZGUgbV9jc2QgZGF0YQoJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIG1fY3NkLnN0cnVjdHVyZSA9IChtX2NtZFJlc3BvbnNlWzNdPj4gMjIpICYgMHgwMzsKCiAgICBtX2NzZC5zcGVjaWZpY2F0aW9uVmVyc2lvbiA9IChtX2NtZFJlc3BvbnNlWzNdPj4gMTYpICYgMHgzRjsKCiAgICBtX2NzZC5kYXRhUmVhZEFjY2Vzc1RpbWUxID0gKG1fY21kUmVzcG9uc2VbM10gPj4gOCkgJiAweEZGIDsKICAgIG1fY3NkLmRhdGFSZWFkQWNjZXNzVGltZTIgPSAobV9jbWRSZXNwb25zZVszXSkgJiAweEZGIDsKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICBtX2NzZC5tYXhEYXRhVHJhbnNmZXJSYXRlID0gKG1fY21kUmVzcG9uc2VbMl0gPj4gMjQpICYgMHhGRjsKICAgIG1fY3NkLmNhcmRDb21tYW5kQ2xhc3MgPShtX2NtZFJlc3BvbnNlWzJdID4+IDEyKSAmIDB4RkZGOwogICAgLy9tX2NzZC5jYXJkQ29tbWFuZENsYXNzIDw8PSA0OwogICAgLy9tX2NzZC5jYXJkQ29tbWFuZENsYXNzIHw9ICgoU0RJT19SZXNwb25zZVszXSA+PiAxMikgJiAweDAwMGYpOwoKICAgIG1fY3NkLnJlYWRCbG9ja0xlbmd0aCA9IChtX2NtZFJlc3BvbnNlWzJdID4+IDgpICYgMHgwRjsKICAgIG1fY3NkLnBhcnRpYWxSZWFkRmxhZyA9IChtX2NtZFJlc3BvbnNlWzJdID4+IDcpICYgMHgwMTs7CiAgICBtX2NzZC53cml0ZUJsb2NrTWlzYWxpZ24gPSAobV9jbWRSZXNwb25zZVsyXSA+PiA2KSAmIDB4MDE7CiAgICBtX2NzZC5yZWFkQmxvY2tNaXNhbGlnbiA9ICgobV9jbWRSZXNwb25zZVsyXSA+PiA1KSYgMHgwMDAxKTsKICAgIG1fY3NkLkRTUl9pbXBsZW1lbnRlZCA9ICgobV9jbWRSZXNwb25zZVsyXSA+PiA0KSYgMHgwMDAxKTsKICAgIC8vIDIgYml0IHJlc2VydmVkCiAgICBtX2NzZC5kZXZpY2VTaXplID0gKG1fY21kUmVzcG9uc2VbMl0pICYgMHgwMzsKICAgIG1fY3NkLmRldmljZVNpemUgPDw9IDEwOwogICAgbV9jc2QuZGV2aWNlU2l6ZSB8PSAobV9jbWRSZXNwb25zZVsxXSA+PiAyMikgJiAweDNGRjsKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgbV9jc2QubWF4cmVhZEN1cnJlbnRfVmRkTWluID0gKG1fY21kUmVzcG9uc2VbMV0gPj4gMTkpICYgMHgwNzsKICAgIG1fY3NkLm1heFJlYWRDdXJyZW50X1ZkZE1heCA9IChtX2NtZFJlc3BvbnNlWzFdID4+IDE2KSAmIDB4MDc7CiAgICBtX2NzZC5tYXhXcml0ZUN1cnJlbnRfVmRkTWluPSAobV9jbWRSZXNwb25zZVsxXSA+PiAxMykgJiAweDA3OwogICAgbV9jc2QubWF4V3JpdGVDdXJyZW50X1ZkZE1heD0gKG1fY21kUmVzcG9uc2VbMV0gPj4gMTApICYgMHgwNzsKICAgIG1fY3NkLmRldmljZVNpemVNdWx0aXBsaWVyID0gKG1fY21kUmVzcG9uc2VbMV0gPj4gNykgJiAweDA3OwogICAgbV9jc2QuZXJhc2VCbG9ja0VuYWJsZSA9ICAobV9jbWRSZXNwb25zZVsxXSA+PiA2KSAmIDB4MDE7ICAgICAgICAgICAgIC8vIDEgYml0CiAgICBtX2NzZC5lcmFzZVNlY3RvclNpemUgPSAobV9jbWRSZXNwb25zZVsxXSkgJiAweDNGOzsgICAgICAgICAgICAgICAgIC8vIDcgYml0czo2KzEKICAgIG1fY3NkLmVyYXNlU2VjdG9yU2l6ZSA8PD0gNjsKICAgIG1fY3NkLmVyYXNlU2VjdG9yU2l6ZSB8PSAobV9jbWRSZXNwb25zZVswXSA+PiAzMSkgJiAweDAxOwoKICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIG1fY3NkLldQX0dyb3VwU2l6ZSA9ICAgKG1fY21kUmVzcG9uc2VbMF0gPj4gMjQpICYgMHg3RjsgICAgICAgICAgICAgICAgIC8vIDcgYml0cwogICAgbV9jc2QuV1BfR3JvdXBFbmFibGUgPSAobV9jbWRSZXNwb25zZVswXSA+PiAyMykgJiAweDAxOwogICAgLy8gMiBiaXQgcmVzZXJ2ZWQKICAgIG1fY3NkLndyaXRlU3BlZWRGYWN0b3IgPSAobV9jbWRSZXNwb25zZVswXSA+PiAxOCkgJiAweDA3OyAgICAgICAgICAgICAgLy8gMyBiaXRzCiAgICBtX2NzZC53cml0ZUJsb2NrTGVuZ3RoID0gKG1fY21kUmVzcG9uc2VbMF0gPj4gMTQpICYgMHgwRjsgICAgICAgICAgICAgIC8vIDQgYml0czoKCiAgICBtX2NzZC5wYXJ0aWFsV3JpdGVGbGFnID0gKG1fY21kUmVzcG9uc2VbMF0gPj4gMTMpICYgMHgwMTsgICAgICAgICAgICAgLy8gMSBiaXQKICAgIC8vIDUgYml0cyByZXNlcnZlZAogICAgbV9jc2QuZmlsZUZvcm1hdEdyb3VwID0gKG1fY21kUmVzcG9uc2VbMF0+PiA3KSAmIDB4MDE7CiAgICBtX2NzZC5jb3B5RmxhZyA9IChtX2NtZFJlc3BvbnNlWzBdID4+IDYpICYgMHgwMTsKICAgIG1fY3NkLldQX3Blcm0gPSAgKG1fY21kUmVzcG9uc2VbMF0gPj4gNSkgJiAweDAxOwogICAgbV9jc2QuV1BfdGVtcCA9IChtX2NtZFJlc3BvbnNlWzBdID4+IDQpICYgMHgwMTsKICAgIG1fY3NkLmZpbGVGb3JtYXQgPSAobV9jbWRSZXNwb25zZVswXSA+PiAyKSAmIDB4MDM7OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENSQyBpcyBpZ25vcmVkCiAgICBnX2VtbWNfV1BfaW5mbyY9MHgwMDAwRkZGRjsKICAgIGdfZW1tY19XUF9pbmZvfD0obV9jc2QuV1BfcGVybTw8MjQpfChtX2NzZC5XUF90ZW1wPDwxNik7CgojaWYgMQkvLyBkZWJ1ZwoJewoJRU1NQ19QUk4oUFJOX0lORk8sIlxuXG4gQ1NEOiAlZCIscFNETU1DUC0+Q2FyZENhcGFjaXR5KTsKCUVNTUNfUFJOKFBSTl9JTkZPLCJcbiAlMDh4ICUwOHggJTA4eCAlMDh4OiIsbV9jbWRSZXNwb25zZVswXSxtX2NtZFJlc3BvbnNlWzFdLG1fY21kUmVzcG9uc2VbMl0sbV9jbWRSZXNwb25zZVszXSk7CglpZihtX2NzZC5zdHJ1Y3R1cmU9PTApCgl7CiAgICAgICAgCXVuc2lnbmVkIGludCBtdWx0ID0gMTw8KG1fY3NkLmRldmljZVNpemVNdWx0aXBsaWVyKzIpOwogICAgICAgIAl1bnNpZ25lZCBpbnQgY2FwYWNpdHk9IChtX2NzZC5kZXZpY2VTaXplKzEpICogbXVsdCAqICgxPDxtX2NzZC5yZWFkQmxvY2tMZW5ndGgpOwogICAgICAgIAlFTU1DX1BSTihQUk5fSU5GTywiXG4gRGV2aWNlIFNpemU6ICVkID0gY19zaXplKCVkKSB4IG11bHQoJWQpIHggYmxrX2xlbiglZCkiLGNhcGFjaXR5LChtX2NzZC5kZXZpY2VTaXplKzEpLG11bHQsKDE8PG1fY3NkLnJlYWRCbG9ja0xlbmd0aCkpOwoJCWdfZGV2aWNlX3NlY3Rvcl9jb3VudD1jYXBhY2l0eS81MTI7Cgl9CgllbHNlCgl7CgkJLy92Mi4wCgkJbV9jc2QuZGV2aWNlU2l6ZSA9IChtX2NtZFJlc3BvbnNlWzFdKT4+OCAmMHgwM0ZGRkZGOwoJCXVuc2lnbmVkIGludCBjYXBhY2l0eT0gKG1fY3NkLmRldmljZVNpemUrMSkgKjUxMjsKCQlFTU1DX1BSTihQUk5fSU5GTywiXG4gZGV0ZWN0ZWQgQ1NEIHYyLjAgU0RIQyBjc2Rfc3RydWN0dXJlPSV4IixtX2NzZC5zdHJ1Y3R1cmUpOwoJCUVNTUNfUFJOKFBSTl9JTkZPLCJcbiBEZXZpY2UgU2l6ZTogJWQgS0IiLGNhcGFjaXR5KTsKCQkvL0VNTUNfUFJOKFBSTl9SRVMsIlNEIEhpZ2ggQ2FwYWNpdHkgYW5kIEV4dGVuZGVkIENhcGFjaXR5XG4iKTs7CgkJLy9FTU1DX1BSTihQUk5fUkVTLCJEZXZpY2UgU2l6ZTogJWQgS0JcbiIsY2FwYWNpdHkpOwoJCWdfZGV2aWNlX3NlY3Rvcl9jb3VudD1jYXBhY2l0eSoyOwoKCX0KCglFTU1DX1BSTihQUk5fSU5GTywiXG4gY29tbWFuZCBjbGFzczoleCIsbV9jc2QuY2FyZENvbW1hbmRDbGFzcyk7CglFTU1DX1BSTihQUk5fSU5GTywiXG4gQWNjZXNzIHRpbWUoVEFBQyk6dW5pdD0lZCx2YWx1ZT0lZCIsbV9jc2QuZGF0YVJlYWRBY2Nlc3NUaW1lMSYweDA3LChtX2NzZC5kYXRhUmVhZEFjY2Vzc1RpbWUxJjB4NzgpPj4zKTsKCUVNTUNfUFJOKFBSTl9JTkZPLCJcbiBBY2Nlc3MgdGltZShOU0FDKTolZCIsbV9jc2QuZGF0YVJlYWRBY2Nlc3NUaW1lMik7CglFTU1DX1BSTihQUk5fSU5GTywiXG4gTWF4IHRyYW5zZmVyIHJhdGU6JXgiLG1fY3NkLm1heERhdGFUcmFuc2ZlclJhdGUpOwovLwlFTU1DX1BSTihQUk5fUkVTLCJcbiBNYXggdHJhbnNmZXIgcmF0ZTp1bml0PSVkLHZhbHVlPSVkIixtX2NzZC5tYXhEYXRhVHJhbnNmZXJSYXRlJjB4MDcsKG1fY3NkLm1heERhdGFUcmFuc2ZlclJhdGUmMHg3OCk+PjMpOwoJRU1NQ19QUk4oUFJOX0lORk8sIlxuIFJlYWQgYmxvY2sgbGVuOiVkIiwxPDxtX2NzZC5yZWFkQmxvY2tMZW5ndGgpOwoJRU1NQ19QUk4oUFJOX0lORk8sIlxuIFdyaXRlIGJsb2NrIGxlbjolZCIsMTw8bV9jc2Qud3JpdGVCbG9ja0xlbmd0aCk7CglFTU1DX1BSTihQUk5fSU5GTywiXG4gRXJhc2Ugc2VjdG9yIHNpemU6JWQiLG1fY3NkLmVyYXNlU2VjdG9yU2l6ZSsxKTsKCUVNTUNfUFJOKFBSTl9JTkZPLCJcbiBGaWxlIGZvcm1hdDolZCIsbV9jc2QuZmlsZUZvcm1hdCk7CglFTU1DX1BSTihQUk5fSU5GTywiXG4gRFNSIGltcGxlbWVudGVkOiVkIixtX2NzZC5EU1JfaW1wbGVtZW50ZWQpOwoJfQojZW5kaWYKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogICBTRE1NQ1dyaXRlRmlmbwoqICAgICAgV3JpdGVzIDIwNDggYnl0ZXMgKDUxMiB3b3JkcykgdG8gdGhlIEZJRk8KKiAgIElucHV0OgoqICAgICAgUF9TRE1NQ19Qcm9wZXJ0aWVzX1QgcFNETU1DUCAtIHBvaW50ZXIgdG8gdGhlIFNETU1DIGNvbnRleHQgc3RydWN0dXJlCiogICBPdXRwdXQ6CiogICAgICBub25lCiogICBSZXR1cm5zOgoqICAgICAgbm9uZQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIEVNTUNfV3JpdGVGaWZvKFBfU0RNTUNfUHJvcGVydGllc19UIHBTRE1NQ1ApCnsKICAgIGludCBpLCB0ID0gMDsKICAgIFVJTlRfVCBCdWZmZXIgPTB4MDsKICAgIFBfTU00X1NETU1DX0NPTlRFWFRfVCBwQ29udGV4dDsKICAgIHZvbGF0aWxlIFVJTlRfVCAqcE1NQ19UWF9GaWZvOwoKICAgIC8vIEFzc2lnbiBvdXIgY29udGV4dCB2YWx1ZQogICAgcENvbnRleHQgPSAoUF9NTTRfU0RNTUNfQ09OVEVYVF9UKSBwU0RNTUNQLT5wQ29udGV4dDsKCiAgICBwTU1DX1RYX0ZpZm8gPSAodm9sYXRpbGUgVUlOVF9UICopJihwQ29udGV4dC0+cE1NQzRSZWctPm1tNF9kcCk7CiAgICB0ID0gcFNETU1DUC0+VHJhbnMuV29yZEluZGV4OwoKICAgIC8vIElnbm9yZSBQcmUgQnl0ZXMKICAgIGZvciAoaT0wOyAoaSA8IE1NNEZJRk9XT1JEU0laRSkgJiYgKCh1bnNpZ25lZCBpbnQpdCA8IHBTRE1NQ1AtPlRyYW5zLlN0YXJ0RGlzY2FyZFdvcmRzKTsgaSsrLCB0KyspCiAgICAgICAgKnBNTUNfVFhfRmlmbyA9IEJ1ZmZlcjsKCiAgICAvLyBXcml0ZSBSZXF1ZXN0ZWQgRGF0YQogICAgZm9yICg7ICgoaSA8IE1NNEZJRk9XT1JEU0laRSkgJiYgKCh1bnNpZ25lZCBpbnQpdCA8IChwU0RNTUNQLT5UcmFucy5UcmFuc1dvcmRTaXplLXBTRE1NQ1AtPlRyYW5zLkVuZERpc2NhcmRXb3JkcykpKTsgaSsrLCB0KyspCiAgICAgICAgKnBNTUNfVFhfRmlmbyA9ICgoVUlOVF9UKikodWludHB0cl90KShwU0RNTUNQLT5UcmFucy5Mb2NhbEFkZHIpKVt0XTsKCiAgICAvLyBJZ25vcmUgVHJhaWxpbmcgQnl0ZXMKICAgIGZvciAoOyAoaSA8IE1NNEZJRk9XT1JEU0laRSkgJiYgKCh1bnNpZ25lZCBpbnQpdCA8IHBTRE1NQ1AtPlRyYW5zLlRyYW5zV29yZFNpemUpOyBpKyssIHQrKykKICAgICAgICAqcE1NQ19UWF9GaWZvID0gQnVmZmVyOwoKICAgIHBTRE1NQ1AtPlRyYW5zLldvcmRJbmRleCA9IHQ7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiAgIEVNTUNfUmVhZEZpZm8KKiAgICAgIFJlYWRzIHRoZSBjb250ZW50cyBvZiB0aGUgcmVhZCBmaWZvICg1MTIgd29yZHMpCiogICBJbnB1dDoKKiAgICAgIFBfU0RNTUNfUHJvcGVydGllc19UIHBTRE1NQ1AgLSBwb2ludGVyIHRvIHRoZSBTRE1NQyBjb250ZXh0IHN0cnVjdHVyZQoqICAgT3V0cHV0OgoqICAgICAgYnVmZmVyIHdpbGwgY29udGFpbiB0aGUgY29udGVudHMgb2YgdGhlIHJlYWQgZmlmbwoqICAgUmV0dXJuczoKKiAgICAgIG5vbmUKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCBFTU1DX1JlYWRGaWZvKFBfU0RNTUNfUHJvcGVydGllc19UIHBTRE1NQ1ApCnsKICAgIHZvbGF0aWxlIGludCBpLCB0ID0gMDsKICAgIC8vVUlOVF9UIEJ1ZmZlciA9MHgwOwogICAgUF9NTTRfU0RNTUNfQ09OVEVYVF9UIHBDb250ZXh0OwogICAgdm9sYXRpbGUgVUlOVF9UICpwTU1DX1JYX0ZpZm87CgogICAgCS8vIEFzc2lnbiBvdXIgY29udGV4dCB2YWx1ZQogICAgCXBDb250ZXh0ID0gKFBfTU00X1NETU1DX0NPTlRFWFRfVCkgcFNETU1DUC0+cENvbnRleHQ7CgogICAgcE1NQ19SWF9GaWZvID0gKHZvbGF0aWxlIFVJTlRfVCAqKSYocENvbnRleHQtPnBNTUM0UmVnLT5tbTRfZHApOwogICAgdCA9IHBTRE1NQ1AtPlRyYW5zLldvcmRJbmRleDsKCiAgICAvLyBJZ25vcmUgUHJlIEJ5dGVzCiAgICBmb3IgKGk9MDsgKGkgPCBNTTRGSUZPV09SRFNJWkUpICYmICgodW5zaWduZWQgaW50KXQgPCBwU0RNTUNQLT5UcmFucy5TdGFydERpc2NhcmRXb3Jkcyk7IGkrKywgdCsrKXsKICAgICAgICAvL0J1ZmZlciA9ICpwTU1DX1JYX0ZpZm87CiAgICB9CgogICAgLy8gUmVhZCBSZXF1ZXN0ZWQgRGF0YQogICAgZm9yICg7ICgoaSA8IE1NNEZJRk9XT1JEU0laRSkgJiYgKCh1bnNpZ25lZCBpbnQpdCA8IChwU0RNTUNQLT5UcmFucy5UcmFuc1dvcmRTaXplLXBTRE1NQ1AtPlRyYW5zLkVuZERpc2NhcmRXb3JkcykpKTsgaSsrLCB0KyspewogICAgICAgICgoVUlOVF9UKikodWludHB0cl90KSAocFNETU1DUC0+VHJhbnMuTG9jYWxBZGRyKSlbdF0gPSAodWludDMyX3QpKHVpbnRwdHJfdCkoKnBNTUNfUlhfRmlmbyk7CiAgICB9CgoJLy8gSWdub3JlIFRyYWlsaW5nIEJ5dGVzCiAgICBmb3IgKDsgKGkgPCBNTTRGSUZPV09SRFNJWkUpICYmICgodW5zaWduZWQgaW50KXQgPCBwU0RNTUNQLT5UcmFucy5UcmFuc1dvcmRTaXplKTsgaSsrLCB0KyspewogICAgICAgIC8vQnVmZmVyID0gKnBNTUNfUlhfRmlmbzsKICAgIH0KCiAgICBwU0RNTUNQLT5UcmFucy5Xb3JkSW5kZXggPSB0Owp9CgpleHRlcm4gdm9pZCBFTU1DSENfQ01EU1dSZXNldChQX01NNF9TRE1NQ19DT05URVhUX1QgcENvbnRleHQpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiAgIEVNTUNfSVNSCiogICAgICAJSW50ZXJydXB0IFNlcnZpY2UgUm91dGluZSBmb3IgU0RNTUMgY29udHJvbGxlcgoqCQlDb250cm9scyBmbG93IGFuZCBjYXRjaGVzIGZhdWx0cyBhc3luY2hyb25vdXNseQoqICAgSW5wdXQ6CioJICAgUF9TRE1NQ19Qcm9wZXJ0aWVzX1QgcFNETU1DUAoqICAgT3V0cHV0OgoqICAgICAgbm9uZQoqICAgUmV0dXJuczoKKiAgICAgIG5vbmUKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgRU1NQ19JU1IoKQp7CiAgICBVSU5UX1QgaTsKICAgIFZVSU5UX1QgKnBDb250cm9sbGVyQnVmZmVyOwogICAgVUlOVF9UIGlfc3RhdF9jb3B5OwogICAgVUlOVF9UIGlfZXJyX3N0YXQ7CQkvLyBLZWVwIGEgY29weSBvZiBpIHN0YXQgcmVnaXN0ZXIKICAgIFVJTlRfVCBpX2FjbWQxMl9lcnJfc3RhdDsKICAgIFBfTU00X0lfU1RBVCAgcF9pX3N0YXRfY29weTsJCQkvLyBQb2ludGVyIHRvIHRoZSBjb3B5LgogICAgUF9NTTRfSV9TVEFUX1VOSU9OIHBNTTRfSV9TVEFUX1U7CiAgICAvL3ZvbGF0aWxlIGludCBzdGF0ZSA7CiAgICBpbnQgY29tcGxldGU7CiAgICBQX1NETU1DX1Byb3BlcnRpZXNfVCBwU0RNTUNQID0gRU1NQ19HZXRQcm9wZXJ0aWVzKCk7CiAgICBQX01NNF9TRE1NQ19DT05URVhUX1QgcENvbnRleHQgPSAoUF9NTTRfU0RNTUNfQ09OVEVYVF9UKSBwU0RNTUNQLT5wQ29udGV4dDsJCS8vIEFzc2lnbiBvdXIgY29udGV4dCB2YWx1ZQogICAgLy9QX01NNF9DTURfWEZSTURfVU5JT04gcENtZFhmZXI9ICgJUF9NTTRfQ01EX1hGUk1EX1VOSU9OKSZwQ29udGV4dC0+cE1NQzRSZWctPm1tNF9jbWRfeGZybWQ7CiAgICAvL1BfTU00X1NUQVRFX1VOSU9OIHBTdGF0ZSA9IChQX01NNF9TVEFURV9VTklPTikmcENvbnRleHQtPnBNTUM0UmVnLT5tbTRfc3RhdGU7CiAgICBwX2lfc3RhdF9jb3B5ID0gKFBfTU00X0lfU1RBVCkmaV9zdGF0X2NvcHk7CiAgICBjb21wbGV0ZSA9ICBwU0RNTUNQLT5DYXJkUmVwb25zZS5Db21tYW5kQ29tcGxldGU7CgogICAgLy8gU2F2ZSBvZmYgdGhlIGludGVycnVwdCBzb3VyY2UgdG8gdGhlIGNvcHkKICAgIHBNTTRfSV9TVEFUX1UgPSAoUF9NTTRfSV9TVEFUX1VOSU9OKSAmcENvbnRleHQtPnBNTUM0UmVnLT5tbTRfaV9zdGF0OwogICAgaV9zdGF0X2NvcHkgPSBwTU00X0lfU1RBVF9VLT5tbTRfaV9zdGF0X3ZhbHVlOwoKICAgIEVNTUNfUFJOKFBSTl9JTkZPLCJcbiBlbnRlciBFTU1DX0lTUiBpX3N0YXRfY29weSA9IDB4JXggXG4iLCBpX3N0YXRfY29weSk7CgogICAgaWYocE1NNF9JX1NUQVRfVS0+bW00X2lfc3RhdF9iaXRzLmNkaW50KQogICAgewoJCUVNTUNfUFJOKFBSTl9SRVMsICJcbiBHb3QgY2FyZCBpbnRlcnJ1cHQgZnJvbSBEQVQxICFcbiAiKTsKICAgIAlFTU1DSENfY2RJbnRfZW5hYmxlKHBDb250ZXh0LCBESVNBQkxFX0lOVFMpOwogICAgfQoKI2lmZGVmIF9fU0RJT19JTlRfTU9ERV9fCiAgICBpZiAoaV9zdGF0X2NvcHkgJiAweGMwKSAgICAvLyBjYXJkIGRldGVjdCBpbnRlcnJ1cHQKICAgIHsKCQlFTU1DX1BSTihQUk5fUkVTLCJcbiBjYXJkIHJlbW92ZS9pbnNlcnQgaW50LS0+IGlfc3RhdD0weCUwOHhcbiIsaV9zdGF0X2NvcHkpOwogICAgCXBNTTRfSV9TVEFUX1UtPm1tNF9pX3N0YXRfdmFsdWUgPSBDTEVBUl9JTlRTX01BU0s7CiAgICAJaSA9IHBNTTRfSV9TVEFUX1UtPm1tNF9pX3N0YXRfdmFsdWU7CQkvLyBNdXN0IG1ha2UgYSBkdW1teSByZWFkIHRvIGFsbG93IGludGVycnVwdHMgdG8gY2xlYXIuCgogICAgCXJldHVybjsKICAgIH0KI2VuZGlmCgogICAgLy8gQ2hlY2sgZm9yIGFueSBlcnJvcgogICAgaWYgKHBfaV9zdGF0X2NvcHktPmVycmludCkKICAgIHsKICAgICAgICBpX2Vycl9zdGF0ID0gaV9zdGF0X2NvcHkgPj4gMTYgOwogICAgICAgIC8vIFRCRCBwU0RNTUNQLT5DYXJkUmVwb25zZS5Db21tYW5kRXJyb3IgPSAxOwogICAgICAgIC8vIFJlc2V0IE1NNENNRCBwaW4gaW4gY2FzZSBpdCdzIGh1bmcgd2FpdGluZyBvbiBhIHJlc3BvbnNlCiAgICAgICAgLy9wQ29udGV4dC0+cE1NQzRSZWctPm1tNF9jbnRsMiB8PSAweDAyMDAwMDAwOwogICAgICAgIEVNTUNIQ19DTURTV1Jlc2V0KHBDb250ZXh0KTsJLy8gdGhpcyBjbGVhcyB0aGUgY29tbWFuZCBpbmhpYml0IGZsYWcgaW4gc2RfcHJlc2VudF9zdGF0ZV8xLgogICAgICAgIEVNTUNIQ19EYXRhU1dSZXNldChwQ29udGV4dCk7CS8vIHRoaXMgY2xlYXJzIHRoZSBkYXRhIGluaGliaXQgZmxhZyBhbmQgc3RvcHMgbWNsawoKICAgICAgICBpZiAoKHBTRE1NQ1AtPlN0YXRlID09IFdSSVRFKSB8fCAocFNETU1DUC0+U3RhdGUgPT0gUkVBRCkgfHwgKHBTRE1NQ1AtPlN0YXRlID09IERBVEFUUkFOKSkKICAgICAgICB7CiAgICAgICAgICAgIEVNTUNfUFJOKFBSTl9FUlIsIlxuIGVycmludDppX3N0YXQ9MHglMDh4XG4iLGlfc3RhdF9jb3B5KTsKCQkJcFNETU1DUC0+U3RhdGUgPSBGQVVMVDsKICAgICAgICAgICAgcENvbnRleHQtPnBNTUM0UmVnLT5tbTRfaV9zdGF0ICY9IDB4MDAwMEZGRkY7CS8vU2F0eWEKICAgICAgICB9CgogICAgICAgIGlmKCBpX2Vycl9zdGF0ICYgU0RfRVJST1JfSU5UX1NUQVRVU19BVVRPX0NNRDEyX0VSUiApCiAgICAgICAgewogICAgICAgICAgICBpX2FjbWQxMl9lcnJfc3RhdCA9IHBDb250ZXh0LT5wTU1DNFJlZy0+bW00X2FjbWQxMl9lcjsKICAgICAgICAgICAgRU1NQ19QUk4oUFJOX0VSUiwiXG4gYWNtZDEyIGVycmluIHN0YXQ9IDB4JTA4eCBcbiIscENvbnRleHQtPnBNTUM0UmVnLT5tbTRfYWNtZDEyX2VyKTsKICAgICAgICAgICAgLy8gY2xlYXIgdGhlIGFjbWQxMiBlcnJvciBiaXRzLgogICAgICAgICAgICBwQ29udGV4dC0+cE1NQzRSZWctPm1tNF9hY21kMTJfZXIgPSBpX2FjbWQxMl9lcnJfc3RhdDsKICAgICAgICB9CiAgICB9CgogICAgLy8gaXMgdGhpcyBhbiBzZG1hIGludGVycnVwdCBldmVudD8KICAgIGlmKHBDb250ZXh0LT5wTU1DNFJlZy0+bW00X2lfc3RhdCAmICgxdTw8MykpCS8vIGJpdCAzIGlzIGRtYWludAogICAgewogICAgICAgIC8vIHRoZSB0cmFuc2ZlciBoYWx0ZWQgYmVjYXVzZSB0aGUgYm91bmRhcnkgc3BlY2lmaWVkIGluIC4uLiB3YXMgcmVhY2hlZC4KICAgICAgICAvLyByZXdyaXRpbmcgdGhlIHN5c2FkZHIgd2l0aCB0aGUgbmV4dCBhZGRyZXNzIGFsbG93cyB0aGUgdHJhbnNmZXIgdG8gcmVzdW1lLgogICAgICAgIC8vIGZvcnR1bmF0ZWx5IHRoZSBzeXNhZGRyIHJlZ2lzdGVyIGl0c2VsZiBjb250YWlucyB0aGUgbmV4dCBhZGRyZXNzLgogICAgICAgIC8vIHNvLCBqdXN0IHJlLXdyaXRlIHRoZSBzeXNhZGRyIHJlZ2lzdGVyIHdpdGggaXRzIG93biBjdXJyZW50IGNvbnRlbnRzLgogICAgICAgIHBDb250ZXh0LT5wTU1DNFJlZy0+bW00X3N5c2FkZHIgPSBwQ29udGV4dC0+cE1NQzRSZWctPm1tNF9zeXNhZGRyOwkvLyBzeXNhZGRyIHBvaW50cyB0byBuZXh0IGFkZHIgdG8gd3JpdGUuCiAgICB9CgoJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKIAkJcFNETU1DUC0+Q2FyZFJlcG9uc2UucEJ1ZmZlcltpXSA9IDA7CgoJLy8gSGFzIHRoZSBDb21tYW5kIGNvbXBsZXRlZD8gSWYgc28gcmVhZCB0aGUgcmVzcG9uc2UgcmVnaXN0ZXIKCXdoaWxlKHBfaV9zdGF0X2NvcHktPmNtZGNvbXAgIT0gMSkKCXsKCQlpX3N0YXRfY29weSA9IHBDb250ZXh0LT5wTU1DNFJlZy0+bW00X2lfc3RhdDsKCQlFTU1DX1BSTihQUk5fSU5GTywiXG4gaV9zdGF0X2NvcHkgPSAweCV4IFxuIiwgaV9zdGF0X2NvcHkpOwoJCWkrKzsKCQlpZihpPjYpCgkJCWJyZWFrOwoJfQoKCWlmIChwX2lfc3RhdF9jb3B5LT5jbWRjb21wKQoJewogCQkvLyBJbmRpY2F0ZSB0aGF0IHRoZSByZXNwb25zZSBoYXMgYmVlbiByZWFkCgkJLy8gVEJEIHBTRE1NQ1AtPkNhcmRSZXBvbnNlLkNvbW1hbmRFcnJvciA9IDA7CgkJY29tcGxldGUgPSAxOwoJCXBDb250cm9sbGVyQnVmZmVyID0gKFZVSU5UX1QgKikgJnBDb250ZXh0LT5wTU1DNFJlZy0+bW00X3Jlc3AwOwogCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQogCQkJcFNETU1DUC0+Q2FyZFJlcG9uc2UucEJ1ZmZlcltpXSA9IHBDb250cm9sbGVyQnVmZmVyW2ldOwoJfQoJLy9FTU1DX1BSTihQUk5fUkVTLCIgSVNSOiBpX3N0YXQgPSAweCUwOHggXG4iLGlfc3RhdF9jb3B5KTsKCgkvLyBBcmUgd2UgU0RNQSBtb2RlIGVuYWJsZWQ/CglpZiAocFNETU1DUC0+U0RNQV9Nb2RlKQoJewoJCWlmIChwX2lfc3RhdF9jb3B5LT54ZnJjb21wKQoJCXsKCQkJcFNETU1DUC0+U3RhdGUgPSBSRUFEWTsKCQkJY29tcGxldGUgPSAxOwoJCQkvLyBnZXQgcmVzcG9uc2UgaWYgY21kIGNvbXBsZXRlIGludGVycnVwdCBpcyBtYXNrZWQKCQkJcENvbnRyb2xsZXJCdWZmZXIgPSAoVlVJTlRfVCAqKSAmcENvbnRleHQtPnBNTUM0UmVnLT5tbTRfcmVzcDA7CiAJCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQogCQkJCXBTRE1NQ1AtPkNhcmRSZXBvbnNlLnBCdWZmZXJbaV0gPSBwQ29udHJvbGxlckJ1ZmZlcltpXTsKCQl9CiAJfQoKCS8vIENsZWFyIHRoZSBpbnRlcnJ1cHRzCglwTU00X0lfU1RBVF9VLT5tbTRfaV9zdGF0X3ZhbHVlID0gaV9zdGF0X2NvcHk7IAkvLyBDbGVhciB0aGUgaW50ZXJydXB0IHNvdXJjZS4KCWkgPSBwTU00X0lfU1RBVF9VLT5tbTRfaV9zdGF0X3ZhbHVlOwkJCS8vIE11c3QgbWFrZSBhIGR1bW15IHJlYWQgdG8gYWxsb3cgaW50ZXJydXB0cyB0byBjbGVhci4KCgoJLy8gSGFuZGxlIFN0YXRlIGJhc2VkIGludGVycnVwdHMgWEZSQ09NUCwgQlVGUkRSRFksIEJVRldSUkRZCgoJaWYgKHBTRE1NQ1AtPlNETUFfTW9kZSA9PSBGQUxTRSkKCXsKCQkvLyBIYW5kbGUgU3RhdGUgYmFzZWQgaW50ZXJydXB0cyBYRlJDT01QLCBCVUZSRFJEWSwgQlVGV1JSRFkKCQlzd2l0Y2ggKHBTRE1NQ1AtPlN0YXRlKQoJCXsKCQkJY2FzZSBXUklURToKCQkJewoJCQkJaWYgKHBfaV9zdGF0X2NvcHktPmJ1ZndycmR5KXsKCQkJCQlFTU1DX1BSTihQUk5fUkVTLCJNTTQgSVNSOiB3cml0ZSBmaWZvLCBibGtfY250bCA9IDB4JXhcbiIsIHBDb250ZXh0LT5wTU1DNFJlZy0+bW00X2Jsa19jbnRsKTsKCQkJCQlFTU1DX1dyaXRlRmlmbyhwU0RNTUNQKTsKCQkJCX0KCgkJCQkvLyBBcmUgd2UgZG9uZSBzZW5kaW5nIGFsbCBvZiBkYXRhPwoJCQkJaWYgKHBTRE1NQ1AtPlRyYW5zLlRyYW5zV29yZFNpemUgPT0gcFNETU1DUC0+VHJhbnMuV29yZEluZGV4KQoJCQkJCXBTRE1NQ1AtPlN0YXRlID0gREFUQVRSQU47CgkJCQlicmVhazsKCQkJfQoJCQljYXNlIFJFQUQ6CgkJCXsKCQkJCWlmIChwX2lfc3RhdF9jb3B5LT5idWZyZHJkeSl7CgkJCQkJRU1NQ19QUk4oUFJOX1JFUywiTU00IElTUjogcmVhZCBmaWZvLCBibGtfY250bCA9IDB4JXhcbiIsIHBDb250ZXh0LT5wTU1DNFJlZy0+bW00X2Jsa19jbnRsKTsKCQkJCQlFTU1DX1JlYWRGaWZvKHBTRE1NQ1ApOwoJCQkJfQoKCQkJCS8vIEFyZSB3ZSBkb25lIHNlbmRpbmcgYWxsIG9mIGRhdGE/CgkJCQlpZiAocFNETU1DUC0+VHJhbnMuVHJhbnNXb3JkU2l6ZSA9PSBwU0RNTUNQLT5UcmFucy5Xb3JkSW5kZXgpCgkJCQkJcFNETU1DUC0+U3RhdGUgPSBEQVRBVFJBTjsKCQkJCWJyZWFrOwoJCQl9CgkJCWNhc2UgREFUQVRSQU46CgkJCXsKCQkJCS8vIFdhaXQgZm9yIFRyYW5zZmVyIENvbXBsZXRlIFNpZ25hbAoJCQkJRU1NQ19QUk4oUFJOX1JFUywiTU00IElTUjogdHJhbnNmZXIgY29tcGxldGUsIGJsa19jbnRsID0gMHgleFxuIiwgcENvbnRleHQtPnBNTUM0UmVnLT5tbTRfYmxrX2NudGwpOwoJCQkJaWYgKHBfaV9zdGF0X2NvcHktPnhmcmNvbXApCgkJCQl7CgkJCQkJcFNETU1DUC0+U3RhdGUgPSBSRUFEWTsKCQkJCQljb21wbGV0ZSA9IDE7CgkJCQkJLy8gZ2V0IHJlc3BvbnNlIGlmIGNtZCBjb21wbGV0ZSBpbnRlcnJ1cHQgaXMgbWFza2VkCgkJCQkJcENvbnRyb2xsZXJCdWZmZXIgPSAoVlVJTlRfVCAqKSAmcENvbnRleHQtPnBNTUM0UmVnLT5tbTRfcmVzcDA7CiAJCQkJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCiAJCQkJCQlwU0RNTUNQLT5DYXJkUmVwb25zZS5wQnVmZmVyW2ldID0gcENvbnRyb2xsZXJCdWZmZXJbaV07CgkJCQl9CgkJCQlicmVhazsKCQkJfQoJCQlkZWZhdWx0OgoJCQkJYnJlYWs7CgkJfQoJfQoKICAgIHBTRE1NQ1AtPkNhcmRSZXBvbnNlLkNvbW1hbmRDb21wbGV0ZSA9IGNvbXBsZXRlOwogICAgRU1NQ19QUk4oUFJOX0RCRywiTU00IElTUiBlbmQsIG1tNF9pX3N0YXRfdmFsdWUgPSAweCV4ICBcbiIscE1NNF9JX1NUQVRfVS0+bW00X2lfc3RhdF92YWx1ZSk7CiAgICByZXR1cm47Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogICBNTTRTd2l0Y2hQYXJ0aXRpb25Gb3JBbHRlcm5hdGVCb290TW9kZQoqCQllTU1DIEFsdGVybmF0ZSBCb290IE1vZGUgU2V0dXAKKiAgIElucHV0OgoqCQlQYXJ0aXRpb25OdW1iZXIgLSBDb250YWlucyB0aGUgcGFydGl0aW9uIE51bWJlciB0byBzd2l0Y2ggdG8gYW5kIGVuYWJsZSBiaXRzIGZvciB0aGUgYm9vdCBwYXJ0aXRpb25zLgoqICAgT3V0cHV0OgoqICAgUmV0dXJuczogTm9FcnJvciwgUmVhZEVycm9yIG9yIE5vdFN1cHBvcnRlZEVycm9yCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovClVJTlRfVCBFTU1DU3dpdGNoUGFydGl0aW9uRm9yQWx0ZXJuYXRlQm9vdE1vZGUoaW50IHBhcnRpdGlvbikKewoJIFVJTlRfVCBSZXR2YWwgPSBOb0Vycm9yOwoJIC8vUF9NTTRfU0RNTUNfQ09OVEVYVF9UIHBDb250ZXh0OwoJIE1NQ19DTUQ2X09WRVJMQVkgQ21kNjsKCSB2b2xhdGlsZSBpbnQgZGVsYXksaWk7CgkgaW50IGkgPSAwOwoKCUVNTUNfUFJOKFBSTl9EQkcsIk1NNFN3aXRjaFBhcnRpdGlvbjogc3dpdGNoIHRvIHBhcnQgJWRcbjoiLCBwYXJ0aXRpb24pOwoJVU5VU0VEKHBhcnRpdGlvbik7CgkvLyBJbml0aWFsaXplIEZsYXNoIFByb3BlcnRpZXMKCVBfU0RNTUNfUHJvcGVydGllc19UIHBTRE1NQ1AgPSBFTU1DX0dldFByb3BlcnRpZXMoKTsKCgkgUmV0dmFsID0gRU1NQ19DaGVja0NhcmRTdGF0dXMocFNETU1DUCwgMHg5MDAsIFIxX0xPQ0tFRENBUkRNQVNLKTsKCgkgaWYgKFJldHZhbCAhPSBOb0Vycm9yKSB7CgkJRU1NQ19QUk4oUFJOX1JFUywiY2FyZCBzdGF0dXMgIGVycm9yICVkXG4iLCBSZXR2YWwpOwoJICAgICAgICByZXR1cm4gU0RNTUNJbml0aWFsaXphdGlvbkVycm9yOwoJfSBlbHNlIHsKCQlFTU1DX1BSTihQUk5fUkVTLCJjYXJkIHN0YXR1cyBubyBlcnJvclxuIik7Cgl9CgoJIC8vIEFzc2lnbiBvdXIgY29udGV4dCB2YWx1ZQoJIC8vcENvbnRleHQgPSAoUF9NTTRfU0RNTUNfQ09OVEVYVF9UKSBwU0RNTUNQLT5wQ29udGV4dDsKCgkgLy8gSXNzdWUgQ01EIDYgd3JpdGUgYnl0ZSAxNzkgKDB4QjMpCgkgQ21kNi5NTUNfQ01ENl9MYXlvdXQuQWNjZXNzID0gRVhUX0NTRF9BQ0NFU1NfV1JJVEVfQllURTsJCQkJLy8gV3JpdGUgYnl0ZQoJIENtZDYuTU1DX0NNRDZfTGF5b3V0LkNtZFNldCA9IDA7ICAgICAgICAgICAgICAgIAkJICAJCQkJLy8gRG9uJ3QgQ2FyZQoJIENtZDYuTU1DX0NNRDZfTGF5b3V0LkluZGV4ID0gUEFSVElUSU9OX0NPTkZJR19NTUNfRVhUX0NTRF9PRkZTRVQ7ICAgICAgIC8vIENob29zZSBCb290IENvbmZpZwoJIENtZDYuTU1DX0NNRDZfTGF5b3V0LlJlc2VydmVkMCA9IDA7CgkgQ21kNi5NTUNfQ01ENl9MYXlvdXQuUmVzZXJ2ZWQxID0gMDsKCSBDbWQ2Lk1NQ19DTUQ2X0xheW91dC5WYWx1ZSA9IDB4NDk7CSAvLyAweDQ5CQkJIAkJLy8gQm9vdCBmcm9tIFBhcnRpdGlvbiAxLCBubyBzZW5kIGJvb3QgYWNrbm93bGVkZ2UKCSBFTU1DX1NlbmRTZXR1cENvbW1hbmQocFNETU1DUCwgWExMUF9NTUNfQ01ENiwgTU00X0NNRF9UWVBFX05PUk1BTCwgQ21kNi5NTUNfQ01ENl9CaXRzLCBNTTRfNDhfUkVTX1dJVEhfQlVTWSk7CgkgUmV0dmFsID0gRU1NQ19JbnRlcnByZXRfUmVzcG9uc2UocFNETU1DUCwgTU1DX1JFU1BPTlNFX1IxQiwgMHgxMDApOwoKCWRvIHsKCQlmb3IoZGVsYXk9MDsgZGVsYXk8PTB4MTAwMDA7IGRlbGF5KyspCgkJCWlpKys7CgkJUmV0dmFsID0gRU1NQ19DaGVja0NhcmRTdGF0dXMocFNETU1DUCwgMHg5MDAsIFIxX0xPQ0tFRENBUkRNQVNLKTsKCQlpZiAoUmV0dmFsID09IE5vRXJyb3IpCgkJCWJyZWFrOwoJCWkrKzsKCX0gd2hpbGUoaSA8IDEwKTsKCgoJIC8vIElzc3VlIENNRCA2IHRvIHdyaXRlIGJ5dGUgMTc3ICgweEIxKQoJIENtZDYuTU1DX0NNRDZfTGF5b3V0LkFjY2VzcyA9IEVYVF9DU0RfQUNDRVNTX1dSSVRFX0JZVEU7CQkJCS8vIENsZWFyIGJpdHMKCSBDbWQ2Lk1NQ19DTUQ2X0xheW91dC5DbWRTZXQgPSAwOyAgICAgICAgICAgICAgICAJCSAgCQkJCS8vIERvbid0IENhcmUKCSBDbWQ2Lk1NQ19DTUQ2X0xheW91dC5JbmRleCA9IEJPT1RfQlVTX1dJRFRIX01NQ19FWFRfQ1NEX09GRlNFVDsgICAgICAgLy8gQ2hvb3NlIEJvb3QgQ29uZmlnCgkgQ21kNi5NTUNfQ01ENl9MYXlvdXQuUmVzZXJ2ZWQwID0gMDsKCSBDbWQ2Lk1NQ19DTUQ2X0xheW91dC5SZXNlcnZlZDEgPSAwOwoJIC8vCVNldCB0byA4IGJpdCBtb2RlCgkgQ21kNi5NTUNfQ01ENl9MYXlvdXQuVmFsdWUgPSAweEEgOyAvLzB4MjsgLy8weEE7IC8vICBVc2UgMiBmb3IgU2Ftc3VuZyA0LjMrIHBhcnRzLCB0aGV5IGRvbid0IGFsbG93IHNldHRpbmcgZmFzdCB0aW1pbmcgYml0cyAweDI7CgoJIGRvIHsKCSAJaSsrOwoJIAlFTU1DX1NlbmRTZXR1cENvbW1hbmQocFNETU1DUCwgWExMUF9NTUNfQ01ENiwgTU00X0NNRF9UWVBFX05PUk1BTCwgQ21kNi5NTUNfQ01ENl9CaXRzLCBNTTRfNDhfUkVTX1dJVEhfQlVTWSk7CgkJIFJldHZhbCA9IEVNTUNfSW50ZXJwcmV0X1Jlc3BvbnNlKHBTRE1NQ1AsIE1NQ19SRVNQT05TRV9SMUIsIDB4MTAwKTsKCQkgaWYgKFJldHZhbCAhPSBOb0Vycm9yKQoJCSAJY29udGludWU7CgkJIGZvcihkZWxheT0wOyBkZWxheTw9MHgxMDAwMDsgZGVsYXkrKykKCQkJIGlpKys7CgkJIFJldHZhbCA9IEVNTUNfQ2hlY2tDYXJkU3RhdHVzKHBTRE1NQ1AsIDB4OTAwLCBSMV9MT0NLRURDQVJETUFTSyk7CgkJIGlmIChSZXR2YWwgPT0gTm9FcnJvcikKCQkJYnJlYWs7CgkJIGVsc2UgewoJCQlFTU1DX1BSTihQUk5fUkVTLCJjYXJkIHN0YXR1cyBlbmQgZXJyb3IgJWRcbiIsIFJldHZhbCk7CgkJIH0KCX0gd2hpbGUoaSA8PSAxMCk7CgoJLy9NTTRfQ2hlY2tDYXJkU3RhdHVzKHBTRE1NQ1AsIDB4MDkwMCwgUjFfTE9DS0VEQ0FSRE1BU0spOwoKI2lmIDAKCSBSZXR2YWwgfD0gTU00X0NoZWNrQ2FyZFN0YXR1cyhwU0RNTUNQLCAweDA5MDAsIFIxX0xPQ0tFRENBUkRNQVNLKTsKCSAvL05vdCBpbiB0aGUgcmVhZHkgc3RhdGU/CgkgaWYoUmV0dmFsICE9IE5vRXJyb3IpCgkgewoJICAgIHBDb250ZXh0LT5wTU1DNFJlZy0+bW00X2NudGwyIHw9ICgxIDw8IDI1KTsgLy8gc2V0IHJlc2V0IGJpdAoJICAgIHBTRE1NQ1AtPlN0YXRlID0gUkVBRFk7ICAgICAgICAgICAvLyBJZ25vcmUgdGhlIGVycm9yIGlmIHRoZSBjYXJkIGRvZXNuJ3Qgc3VwcG9ydCBpdAoJICAgIHJldHVybiBTRE1NQ19TV0lUQ0hfRVJST1I7CgkgfQojZW5kaWYKIAlyZXR1cm4gUmV0dmFsOwp9CgpVSU5UX1QgRU1NQ1N3aXRjaFBhcnRpdGlvbihpbnQgUGFydGl0aW9uTnVtYmVyKQp7CiAgICBVSU5UX1QgUmV0dmFsID0gTm9FcnJvcjsKICAgIC8vUF9NTTRfU0RNTUNfQ09OVEVYVF9UIHBDb250ZXh0OwogICAgTU1DX0NNRDZfT1ZFUkxBWSBDbWQ2OwogICAgLy8gSW5pdGlhbGl6ZSBGbGFzaCBQcm9wZXJ0aWVzCiAgICBQX1NETU1DX1Byb3BlcnRpZXNfVCBwU0RNTUNQID0gRU1NQ19HZXRQcm9wZXJ0aWVzKCk7CgogICAgc3RhdGljIFVJTlRfVCBwb3dlcl9vbj0wOwoKCWludCBpOwogICAgdm9sYXRpbGUgaW50IGRlbGF5LGlpOwoKICAgIHN3aXRjaChQYXJ0aXRpb25OdW1iZXIpCiAgICB7CiAgICAJY2FzZSAwOgoJCQlFTU1DX1BSTihQUk5fUkVTLCJEZWZhdWx0IGFjY2VzcyB0byB1c2VyIGRhdGEgYXJlYVxuIik7CiAgICAJYnJlYWs7CiAgICAJY2FzZSAxOgoJCQlFTU1DX1BSTihQUk5fUkVTLCJTd2l0Y2ggYWNjZXNzIHRvIGJvb3QgcGFydGl0aW9uIDFcbiIpOwogICAgCWJyZWFrOwogICAgCWNhc2UgMjoKCQkJRU1NQ19QUk4oUFJOX1JFUywiU3dpdGNoIGFjY2VzcyB0byBib290IHBhcnRpdGlvbiAyXG4iKTsKICAgIAlicmVhazsKCQljYXNlIDM6CgkJCUVNTUNfUFJOKFBSTl9SRVMsIlN3aXRjaCBhY2Nlc3MgdG8gcGFydGl0aW9uIDNcbiIpOwoJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCUVNTUNfUFJOKFBSTl9SRVMsIk90aGVyIHBhcml0aW9uIGFjY2VzcyBmdW50aW9uIG5vdCBpbXBsZW1lbnQgeWV0LlBsZWFzZSB1c2UgMH4zXG4iKTsKCQlyZXR1cm4gMDsKICAgIH0KCiAgICAgLy8gQXNzaWduIG91ciBjb250ZXh0IHZhbHVlCiAgICAgLy9wQ29udGV4dCA9IChQX01NNF9TRE1NQ19DT05URVhUX1QpIHBTRE1NQ1AtPnBDb250ZXh0OwoKICAgICAvL3NlbmQgQ01EMTMgdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiB0aGUgY2FyZAogICAgUmV0dmFsID0gRU1NQ19DaGVja0NhcmRTdGF0dXMocFNETU1DUCwgMHg5MDAsIFIxX0xPQ0tFRENBUkRNQVNLKTsJCS8vIE1ha2Ugc3VyZSBjYXJkIGlzIHRyYW5zZmVyIG1vZGUKICAgIGlmIChSZXR2YWwgIT0gTm9FcnJvcikKICAgIAlyZXR1cm4gU0RNTUNJbml0aWFsaXphdGlvbkVycm9yOwogICAgIC8vIE11c3Qgc2V0IHBhcnRpdGlvbgogICAgIGlmIChwU0RNTUNQLT5TRCA9PSBYTExQX01NQykKICAgICB7CiAgICAgICAgaWYocG93ZXJfb249PTApCiAgICAgICAgewogICAgICAgIC8vIElzc3VlIENNRCA2IHRvIGNsZWFyIFBBUlRJVElPTl9BQ0NFU1MgYml0cyBpbiBFWFRfQ1NEIHJlZ2lzdGVyIGJ5dGUgMTc5CiAgICAgICAgICAgIENtZDYuTU1DX0NNRDZfTGF5b3V0LkFjY2VzcyA9IEVYVF9DU0RfQUNDRVNTX1NFVF9CSVRTOwkJCQkvLyBDbGVhciBiaXRzCiAgICAgICAgICAgIENtZDYuTU1DX0NNRDZfTGF5b3V0LkNtZFNldCA9IDA7ICAgICAgICAgICAgICAgIAkJICAJCQkJLy8gRG9uJ3QgQ2FyZQogICAgICAgICAgICBDbWQ2Lk1NQ19DTUQ2X0xheW91dC5JbmRleCA9IEVSQVNFX0dST1VQX0RFRjsgICAgICAgLy8gQ2hvb3NlIEJvb3QgQ29uZmlnCiAgICAgICAgICAgIENtZDYuTU1DX0NNRDZfTGF5b3V0LlJlc2VydmVkMCA9IDA7CiAgICAgICAgICAgIENtZDYuTU1DX0NNRDZfTGF5b3V0LlJlc2VydmVkMSA9IDA7CiAgICAgICAgICAgIENtZDYuTU1DX0NNRDZfTGF5b3V0LlZhbHVlID0gMTsJCQkJIAkJLy8gQ2xlYXIgb3V0IFBhcnRpdGlvbiBBY2Nlc3MgYml0cwoKICAgICAgICAgICAgRU1NQ19TZW5kU2V0dXBDb21tYW5kKHBTRE1NQ1AsIFhMTFBfTU1DX0NNRDYsIE1NNF9DTURfVFlQRV9OT1JNQUwsIENtZDYuTU1DX0NNRDZfQml0cywgTU00X1JUX1IxIHwgTU00X1JUX0JVU1kgfCBNTTRfNDhfUkVTX1dJVEhfQlVTWSk7CiAgICAgICAgICAgIFJldHZhbCA9IEVNTUNfSW50ZXJwcmV0X1Jlc3BvbnNlKHBTRE1NQ1AsIE1NQ19SRVNQT05TRV9SMUIsIDB4MTApOwoKCgkJCWRvIHsKCQkJCWRlbGF5X21zKDEwKTsKCQkJCVJldHZhbCA9IEVNTUNfQ2hlY2tDYXJkU3RhdHVzKHBTRE1NQ1AsIDB4OTAwLCBSMV9MT0NLRURDQVJETUFTSyk7CgkJCQlFTU1DX1BSTihQUk5fUkVTLCJSZXR2YWwgPSAlZFxuIiwgUmV0dmFsKTsKCQkJfSB3aGlsZShSZXR2YWwgIT0gTm9FcnJvcik7CiAgICAgICAgCXBvd2VyX29uPTE7CiAgICAgICAgfQoKCSAgICAvLyBJc3N1ZSBDTUQgNiB0byBjbGVhciBQQVJUSVRJT05fQUNDRVNTIGJpdHMgaW4gRVhUX0NTRCByZWdpc3RlciBieXRlIDE3OQogICAgICAgICAgICBDbWQ2Lk1NQ19DTUQ2X0xheW91dC5BY2Nlc3MgPSBFWFRfQ1NEX0FDQ0VTU19DTEVBUl9CSVRTOwkJCQkvLyBDbGVhciBiaXRzCiAgICAgICAgICAgIENtZDYuTU1DX0NNRDZfTGF5b3V0LkNtZFNldCA9IDA7ICAgICAgICAgICAgICAgIAkJICAJCQkJLy8gRG9uJ3QgQ2FyZQogICAgICAgICAgICBDbWQ2Lk1NQ19DTUQ2X0xheW91dC5JbmRleCA9IFBBUlRJVElPTl9DT05GSUdfTU1DX0VYVF9DU0RfT0ZGU0VUOyAgICAgICAvLyBDaG9vc2UgQm9vdCBDb25maWcKICAgICAgICAgICAgQ21kNi5NTUNfQ01ENl9MYXlvdXQuUmVzZXJ2ZWQwID0gMDsKICAgICAgICAgICAgQ21kNi5NTUNfQ01ENl9MYXlvdXQuUmVzZXJ2ZWQxID0gMDsKICAgICAgICAgICAgQ21kNi5NTUNfQ01ENl9MYXlvdXQuVmFsdWUgPSBQQVJUSVRJT05fQUNDRVNTX0JJVFM7CQkJCSAJCS8vIENsZWFyIG91dCBQYXJ0aXRpb24gQWNjZXNzIGJpdHMKCgoJCQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewoJCQkJRU1NQ19TZW5kU2V0dXBDb21tYW5kKHBTRE1NQ1AsIFhMTFBfTU1DX0NNRDYsIE1NNF9DTURfVFlQRV9OT1JNQUwsIENtZDYuTU1DX0NNRDZfQml0cywgTU00X1JUX1IxIHwgTU00X1JUX0JVU1kgfCBNTTRfNDhfUkVTX1dJVEhfQlVTWSk7CiAgICAgICAgICAgIAlSZXR2YWwgPSBFTU1DX0ludGVycHJldF9SZXNwb25zZShwU0RNTUNQLCBNTUNfUkVTUE9OU0VfUjFCLCAweDEwKTsKCQkJCWlmIChSZXR2YWwgIT0gTm9FcnJvcikgewoJCQkJCWZvcihkZWxheT0wOyBkZWxheTw9MHgxMDAwMDsgZGVsYXkrKykKCQkJCQkJaWkrKzsKCQkJCX0gZWxzZSB7CgkJCQkJZm9yKGRlbGF5PTA7IGRlbGF5PD0weDEwMDA7IGRlbGF5KyspCgkJCQkJCWlpKys7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkJCQl9CgkJCX0KCgkJCWRvIHsKCQkJCWRlbGF5X21zKDEwKTsKCQkJCVJldHZhbCA9IEVNTUNfQ2hlY2tDYXJkU3RhdHVzKHBTRE1NQ1AsIDB4OTAwLCBSMV9MT0NLRURDQVJETUFTSyk7CgkJCQlFTU1DX1BSTihQUk5fUkVTLCJSZXR2YWwgPSAlZFxuIiwgUmV0dmFsKTsKCQkJfSB3aGlsZShSZXR2YWwgIT0gTm9FcnJvcik7CgkJCSBpZiAoUmV0dmFsICE9IE5vRXJyb3IpCgkJCSB7CgkJCSAJcFNETU1DUC0+U3RhdGUgPSBSRUFEWTsKCQkJIAlyZXR1cm4gU0RNTUNfU1dJVENIX0VSUk9SOwoJCQkgfQoJCS8vIE5vdyBpc3N1ZSBDTUQgNiBhZ2FpbiB0byBzZXQgdGhlIHJpZ2h0IGJpdHMuCiAgICAgICAgICAgIENtZDYuTU1DX0NNRDZfTGF5b3V0LkFjY2VzcyA9IEVYVF9DU0RfQUNDRVNTX1NFVF9CSVRTOwkJCQkvLyBDbGVhciBiaXRzCiAgICAgICAgICAgIENtZDYuTU1DX0NNRDZfTGF5b3V0LkNtZFNldCA9IDA7ICAgICAgICAgICAgICAgIAkJICAJCQkvLyBEb24ndCBDYXJlCiAgICAgICAgICAgIENtZDYuTU1DX0NNRDZfTGF5b3V0LkluZGV4ID0gUEFSVElUSU9OX0NPTkZJR19NTUNfRVhUX0NTRF9PRkZTRVQ7ICAgLy8gQ2hvb3NlIEJvb3QgQ29uZmlnCiAgICAgICAgICAgIENtZDYuTU1DX0NNRDZfTGF5b3V0LlJlc2VydmVkMCA9IDA7CiAgICAgICAgICAgIENtZDYuTU1DX0NNRDZfTGF5b3V0LlJlc2VydmVkMSA9IDA7CiAgICAgICAgICAgIENtZDYuTU1DX0NNRDZfTGF5b3V0LlZhbHVlID0gUGFydGl0aW9uTnVtYmVyOwkJCSAJCQkvLyBTZXQgdGhlIGNvcnJlY3QgcGFydGl0aW9uCgoJCQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewoJCQkJRU1NQ19TZW5kU2V0dXBDb21tYW5kKHBTRE1NQ1AsIFhMTFBfTU1DX0NNRDYsIE1NNF9DTURfVFlQRV9OT1JNQUwsIENtZDYuTU1DX0NNRDZfQml0cywgTU00X1JUX1IxIHwgTU00X1JUX0JVU1kgfCBNTTRfNDhfUkVTX1dJVEhfQlVTWSk7CiAgICAgICAgICAgIAlSZXR2YWwgPSBFTU1DX0ludGVycHJldF9SZXNwb25zZShwU0RNTUNQLCBNTUNfUkVTUE9OU0VfUjFCLCAweDEwKTsKCQkJCWlmIChSZXR2YWwgIT0gTm9FcnJvcikgewoJCQkJCWZvcihkZWxheT0wOyBkZWxheTw9MHgxMDAwMDsgZGVsYXkrKykKCQkJCQkJaWkrKzsKCQkJCX0gZWxzZSB7CgkJCQkJZm9yKGRlbGF5PTA7IGRlbGF5PD0weDEwMDA7IGRlbGF5KyspCgkJCQkJCWlpKys7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkJCQl9CgkJCX0KCiAgICB9CgoKCSBkbyB7CgkJZGVsYXlfbXMoMTApOwoJCVJldHZhbCA9IEVNTUNfQ2hlY2tDYXJkU3RhdHVzKHBTRE1NQ1AsIDB4OTAwLCBSMV9MT0NLRURDQVJETUFTSyk7CgkJRU1NQ19QUk4oUFJOX1JFUywiUmV0dmFsID0gJWRcbiIsIFJldHZhbCk7Cgl9IHdoaWxlKFJldHZhbCAhPSBOb0Vycm9yKTsKCWlmIChSZXR2YWwgIT0gTm9FcnJvcikKCXsKCQlwU0RNTUNQLT5TdGF0ZSA9IFJFQURZOwoJCXJldHVybiBTRE1NQ19TV0lUQ0hfRVJST1I7Cgl9CglFTU1DX1BSTihQUk5fUkVTLCIjMlxuIik7CglyZXR1cm4gTm9FcnJvcjsKfQoKaW50IGRvX2VtbWNfc3dpdGNoX3BhcnQoVUlOVDMyIFBhcnRpdGlvbk51bWJlcikKewoJcmV0dXJuIEVNTUNTd2l0Y2hQYXJ0aXRpb24oUGFydGl0aW9uTnVtYmVyKTsKfQoKVUlOVF9UIEVNTUNfU2VuZFR1bmluZ0Z1bmNDbWQodm9pZCkKewoJdWludHB0cl90IGFkZHI7CiAgICBVSU5UX1QgIGkgLCB0aW1vdXQgPSAwOwogICAgVUlOVF9UIFJldHZhbCA9IFRpbWVPdXRFcnJvcjsKCiAgICBVSU5UX1QgVHVuaW5nUGF0WzE2XTsKCiAgICBhZGRyID0gKHVpbnRwdHJfdClwRU1NQ0NUUkw7CgogICAgLy9jaGFuZ2UgYmxvY2sgc2l6ZQogICAgUkVHX1dSSVRFMzIoYWRkciArIDB4NCwweDgwKTsKCiAgICAvL2Rpc2FibGUgc2lnbmFsIG9mIGJ1ZmZlciByZWFkeSBpbnRlcnJ1cHQKICAgIFJFR19SRUFEMzIoYWRkciArIDB4MzggLCAmaSk7CiAgICBpICY9IH4weDIwOwogICAgUkVHX1dSSVRFMzIoYWRkciArIDB4MzggLCBpKTsKCgoJLy8gaXNzdWUgQ01EMjEgdHVuaW5nIGNvbW1hbmQKICAgIFJFR19XUklURTMyKGFkZHIgKyAweEMgLCAweDE1M0EwMDEwKTsKCiAgCS8vIHdhaXQgYnVmZmVyIHJlYWR5IGludGVycnVwdAogICAgd2hpbGUodGltb3V0KysgIT0gMHgyMDAwMDApCiAgICB7CiAgICAgICAgUkVHX1JFQUQzMihhZGRyICsgMHgzMCAsICZpKTsKCiAgICAgICAgaWYoKGkmMHgyMCkgPT0gMHgyMCkKICAgICAgICB7CiAgICAgICAgCVJFR19XUklURTMyKGFkZHIgKyAweDMwICwgaSk7CiAgICAgICAgCVJldHZhbCA9IE5vRXJyb3I7CiAgICAgICAgCWJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIGlmKHRpbW91dCA+PSAweDIwMDAwMCkKICAgIHsKICAgICAgICBFTU1DX1BSTihQUk5fSU5GTywgInRpbWUgb3V0ICEgMHgleCA9IDB4ICV4ICAgUmV0dmFsID0gMHgleFxuIiwgYWRkciArIDB4MzAsIGksIFJldHZhbCk7CiAgICAgICAgcmV0dXJuIFJldHZhbDsKICAgIH0KCS8vZW5hYmxlIHNpZ25hbCBvZiBidWZmZXIgcmVhZHkgaW50ZXJydXB0CiAgICBSRUdfUkVBRDMyKGFkZHIgKyAweDM4ICwgJmkpOwovLyAgICBpIHw9IDB4MjA7CiAgICBSRUdfV1JJVEUzMihhZGRyICsgMHgzOCAsIGkpOwoKCiAgICBmb3IoaT0xO2k8MTc7aSsrKQogICAgewogICAgICAgIFJFR19SRUFEMzIoYWRkcisweDIwLCYoVHVuaW5nUGF0W2ktMV0pKTsKICAgICAgICBFTU1DX1BSTihQUk5fSU5GTywgIjB4JXggIiwgVHVuaW5nUGF0W2ktMV0pOwogICAgICAgIGlmKGklND09MCkKICAgICAgICAgICAgRU1NQ19QUk4oUFJOX0lORk8sICJcbiIpOwogICAgfQoKCS8vIFNldCB0aGUgYmxvY2sgbGVuZ3RoIGZvciB0aGUgY29udHJvbGxlcgogICAgUkVHX1dSSVRFMzIoYWRkciArIDB4NCwweDIwMCk7CgogICAgcmV0dXJuIFJldHZhbDsKfQoKCmludCBlTU1DX1NsZWVwKCkKewogICAgdW5zaWduZWQgaW50IGFyZ3VtZW50OwogICAgUF9TRE1NQ19Qcm9wZXJ0aWVzX1QgcFNETU1DUCA9IEVNTUNfR2V0UHJvcGVydGllcygpOwogICAgaW50IFJldHZhbDsKCiAgICAvLyBzZW5kIENNRDcgdG8gZ2V0IGNhcmQgaW50byBzdGFuZGJ5IHN0YXRlCiAgICBhcmd1bWVudCA9IDA7IC8vIGRlLXNlbGVjdAogICAgRU1NQ19QUk4oUFJOX0lORk8sIlxuIENtZCVkIEFyZ3VtZW50PSV4ICBSQ0E9JXggXG4iLFhMTFBfTU1DX0NNRDcsYXJndW1lbnQscFNETU1DUC0+Q2FyZFJlZy5SQ0EpOwogICAgRU1NQ19TZW5kU2V0dXBDb21tYW5kKHBTRE1NQ1AsIFhMTFBfTU1DX0NNRDcsIE1NNF9DTURfVFlQRV9OT1JNQUwsIGFyZ3VtZW50LCBNTTRfNDhfUkVTX1dJVEhfQlVTWSk7IC8vIG5vIHJlc3BvbnNlCgogICAgZGVsYXlfbXMoMSk7IC8vIGRlbGF5IHRvIG1ha2Ugc3VyZSBDTUQ3IGNvbXBsZXRlCgogICAgLy9zZW5kIENNRDEzIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIGNhcmQKICAgIFJldHZhbCA9IEVNTUNfQ2hlY2tDYXJkU3RhdHVzKHBTRE1NQ1AsIDB4NzAwLCBSMV9MT0NLRURDQVJETUFTSyk7CQkvLyBNYWtlIHN1cmUgY2FyZCBpcyBzdGRieSBtb2RlCiAgICBpZiAoUmV0dmFsICE9IE5vRXJyb3IpCiAgICB7CiAgICAgICAgRU1NQ19QUk4oUFJOX1JFUywiQ01EMTM6IGNoZWNrIHN0YXR1cyBFcnJvciBSZXR2YWw9MHgleCBcbiIsUmV0dmFsKTsKICAgICAgICByZXR1cm4gU0RNTUNEZXZpY2VOb3RSZWFkeUVycm9yOwogICAgfQoKICAgIC8vIHNlbmQgQ01ENSB0byBlbnRlciBzbGVlcAogICAgYXJndW1lbnQgPSBwU0RNTUNQLT5DYXJkUmVnLlJDQSB8KDE8PDE1KTsKICAgIEVNTUNfU2VuZFNldHVwQ29tbWFuZChwU0RNTUNQLCBYTExQX01NQ19DTUQ1LCBNTTRfQ01EX1RZUEVfTk9STUFMLCBhcmd1bWVudCwgTU00X1JUX1IxIHwgTU00X1JUX0JVU1kgfCBNTTRfNDhfUkVTX1dJVEhfQlVTWSk7CiAgICBSZXR2YWwgPSBFTU1DX0ludGVycHJldF9SZXNwb25zZShwU0RNTUNQLCBNTUNfUkVTUE9OU0VfUjFCLCAweDEwKTsKICAgIGlmIChSZXR2YWwgIT0gTm9FcnJvcikKICAgIHsKICAgICAgICBFTU1DX1BSTihQUk5fUkVTLCJDTUQ1OiBzbGVlcCBmYWlsLCBSZXR2YWw9MHgleCBcbiIsUmV0dmFsKTsKICAgICAgICByZXR1cm4gU0RNTUNEZXZpY2VOb3RSZWFkeUVycm9yOwogICAgfQoKICAgIEVNTUNfUFJOKFBSTl9SRVMsIkVNTUMgaXMgaW4gc2xlZXAgbm93LCByZWFjdHMgb25seSB0byB0aGUgY29tbWFuZHMgUkVTRVQgYW5kIFNMRUVQL0FXQUtFXG4iKTsKICAgIHJldHVybiAwOwp9CgppbnQgZU1NQ19XYWtldXAoKQp7CiAgICB1bnNpZ25lZCBpbnQgYXJndW1lbnQ7CiAgICBQX1NETU1DX1Byb3BlcnRpZXNfVCBwU0RNTUNQID0gRU1NQ19HZXRQcm9wZXJ0aWVzKCk7CiAgICBpbnQgUmV0dmFsOwogICAgaW50IHRpbWVvdXQ7CgogICAgLy8gc2VuZCBDTUQ1IHRvIHdha2V1cAogICAgYXJndW1lbnQgPSBwU0RNTUNQLT5DYXJkUmVnLlJDQSB8ICgwPDwxNSk7CiAgICBFTU1DX1NlbmRTZXR1cENvbW1hbmQocFNETU1DUCwgWExMUF9NTUNfQ01ENSwgTU00X0NNRF9UWVBFX05PUk1BTCwgYXJndW1lbnQsIE1NNF9SVF9SMSB8IE1NNF80OF9SRVNfV0lUSF9CVVNZKTsKICAgIFJldHZhbCA9IEVNTUNfSW50ZXJwcmV0X1Jlc3BvbnNlKHBTRE1NQ1AsIE1NQ19SRVNQT05TRV9SMUIsIDB4MTApOwogICAgaWYgKFJldHZhbCAhPSBOb0Vycm9yKQogICAgewogICAgICAgIEVNTUNfUFJOKFBSTl9SRVMsIkNNRDU6IHdha2V1cCBmYWlsLCBSZXR2YWw9MHgleCBcbiIsUmV0dmFsKTsKICAgICAgICByZXR1cm4gU0RNTUNEZXZpY2VOb3RSZWFkeUVycm9yOwogICAgfQoKICAgIC8vIHdhaXQgREFUMCB0byAxCiAgICB0aW1lb3V0ID0gMTAwMDA7CiAgICB3aGlsZSh0aW1lb3V0LS0gPiAwKQogICAgewogICAgICAgIHVuc2lnbmVkIGludCBzdGF0ZTsKICAgICAgICBSRUdfUkVBRDMyKCgodWludHB0cl90KXBFTU1DQ1RSTCkrMHgyNCwmc3RhdGUpOwogICAgICAgIGlmIChzdGF0ZSAmICgxPDwyMCkpCiAgICAgICAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKHRpbWVvdXQgPD0gMCkKICAgIHsKICAgICAgICBFTU1DX1BSTihQUk5fUkVTLCJXYWl0IENNRDUgY29tcGxldGUgdGltZW91dFxuIiwgUmV0dmFsKTsKICAgICAgICByZXR1cm4gU0RNTUNEZXZpY2VOb3RSZWFkeUVycm9yOwogICAgfQoKICAgIC8vc2VuZCBDTUQxMyB0byBjaGVjayB0aGUgc3RhdHVzIG9mIHRoZSBjYXJkCiAgICBSZXR2YWwgPSBFTU1DX0NoZWNrQ2FyZFN0YXR1cyhwU0RNTUNQLCAweDcwMCwgUjFfTE9DS0VEQ0FSRE1BU0spOyAgICAgICAgLy8gTWFrZSBzdXJlIGNhcmQgaXMgc3RkYnkgbW9kZQogICAgaWYgKFJldHZhbCAhPSBOb0Vycm9yKQogICAgewogICAgICAgIEVNTUNfUFJOKFBSTl9SRVMsIkNNRDEzOiBjaGVjayBzdGF0dXMgRXJyb3IgUmV0dmFsPTB4JXggXG4iLFJldHZhbCk7CiAgICAgICAgcmV0dXJuIFNETU1DRGV2aWNlTm90UmVhZHlFcnJvcjsKICAgIH0KCiAgICAvL3NlbmQgQ01ENyB0byBnZXQgY2FyZCBpbnRvIHRyYW5zZmVyIHN0YXRlCiAgICBhcmd1bWVudCA9IHBTRE1NQ1AtPkNhcmRSZWcuUkNBOwogICAgRU1NQ19QUk4oUFJOX0lORk8sIlxuIENtZCVkIEFyZ3VtZW50PSV4ICBSQ0E9JXggXG4iLFhMTFBfTU1DX0NNRDcsYXJndW1lbnQscFNETU1DUC0+Q2FyZFJlZy5SQ0EpOwogICAgRU1NQ19TZW5kU2V0dXBDb21tYW5kKHBTRE1NQ1AsIFhMTFBfTU1DX0NNRDcsIE1NNF9DTURfVFlQRV9OT1JNQUwsIGFyZ3VtZW50LCBNTTRfNDhfUkVTX1dJVEhfQlVTWSk7CiAgICBSZXR2YWwgPSBFTU1DX0ludGVycHJldF9SZXNwb25zZShwU0RNTUNQLCBNTUNfUkVTUE9OU0VfUjFCLCAweDEwMCk7CiAgICBpZiAoUmV0dmFsICE9IE5vRXJyb3IpCiAgICB7CiAgICAgICAgRU1NQ19QUk4oUFJOX1JFUywiQ01ENzogY2hlY2sgc3RhdHVzIEVycm9yIFJldHZhbD0weCV4IFxuIixSZXR2YWwpOwogICAgICAgIHJldHVybiBTRE1NQ0RldmljZU5vdFJlYWR5RXJyb3I7CiAgICB9CgogICAgLy9zZW5kIENNRDEzIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIGNhcmQKICAgIFJldHZhbCA9IEVNTUNfQ2hlY2tDYXJkU3RhdHVzKHBTRE1NQ1AsIDB4OTAwLCBSMV9MT0NLRURDQVJETUFTSyk7ICAgICAgICAvLyBNYWtlIHN1cmUgY2FyZCBpcyB0cmFucyBtb2RlCiAgICBpZiAoUmV0dmFsICE9IE5vRXJyb3IpCiAgICB7CiAgICAgICAgRU1NQ19QUk4oUFJOX1JFUywiQ01EMTM6IGNoZWNrIHN0YXR1cyBFcnJvciBSZXR2YWw9MHgleCBcbiIsUmV0dmFsKTsKICAgICAgICByZXR1cm4gU0RNTUNEZXZpY2VOb3RSZWFkeUVycm9yOwogICAgfQoKICAgIEVNTUNfUFJOKFBSTl9SRVMsIkVNTUMgaXMgYXdha2VcbiIpOwogICAgcmV0dXJuIDA7Cn0KCgppbnQgZU1NQ19TbGVlcF9jaGVjaygpCnsKICAgIHVuc2lnbmVkIGludCBhcmd1bWVudDsKICAgIFBfU0RNTUNfUHJvcGVydGllc19UIHBTRE1NQ1AgPSBFTU1DX0dldFByb3BlcnRpZXMoKTsKICAgIGludCBSZXR2YWw7CgogICAJLy9zZW5kIENNRDEzIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIGNhcmQKICAgCWFyZ3VtZW50ID0gcFNETU1DUC0+Q2FyZFJlZy5SQ0E7CiAgICBFTU1DX1NlbmRTZXR1cENvbW1hbmQocFNETU1DUCwgWExMUF9NTUNfQ01EMTMsIE1NNF9DTURfVFlQRV9OT1JNQUwsIGFyZ3VtZW50LCBNTTRfUlRfUjEgfCBNTTRfNDhfUkVTKTsKICAgIFJldHZhbCA9IEVNTUNfSW50ZXJwcmV0X1Jlc3BvbnNlKHBTRE1NQ1AsIE1NQ19SRVNQT05TRV9SMSwgMHgxMDApOwogICAgaWYgKFJldHZhbCAhPSBOb0Vycm9yKQogICAgewogICAgICAgIEVNTUNfUFJOKFBSTl9SRVMsIkNNRDEzIGhhcyBubyByZXNwb25zZSwgbWF5YmUgZU1NQyBpcyBpbiBzbGVlcFxuIik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBFTU1DX1BSTihQUk5fUkVTLCJlTU1DIGlzIGF3YWtlLCBDTUQxMyBSMT0weCUwOHhcbiIsIHBTRE1NQ1AtPkNhcmRSZXBvbnNlLlIxX1JFU1ApOwoKICAgIHJldHVybiAwOwp9CgpVSU5UX1QgY21kX0VNTUNfRVhUQ1NEKCkKewoJcmV0dXJuIEVNTUNfR2V0X0V4dGNzZCgpOwp9CgppbnQgY21kX0VNTUNfSU5JVCh2b2lkKQp7CglpbnQgaVJlc3VsdCA9IDA7CgoJRU1NQ19TZXR1cFByb3AoKTsJIC8vIHNldHVwIFNXIHN0cnVjdHVyZQoJRU1NQ19TZXR1cFBpbm11eCgpOwkgLy8gc2V0dXAgUGluTXV4CglpUmVzdWx0ID0gRU1NQ0hDX0luaXQoKTsJICAgLy8gSG9zdCBjb250cm9sbGVyIGluaXRpYWxpemF0aW9uCgllbW1jX0ludHJfT24oKSA7CgoJRU1NQ19QUk4oUFJOX1JFUywgIiBTRElPIGluaXRcbiIpOwoJcmV0dXJuIGlSZXN1bHQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqCnNldCBlbW1jIG1vZGUsIG1vZGUwOiBoaWdoIHNwZWVkIFNEUiwgbW9kZTE6aGlnaCBzcGVlZCBERFIsIG1vZGUyOkhTMjAwLCBtb2RlMzpIUzQwMAoqKioqKioqKioqKioqKioqKioqKioqKioqLwpVSU5UX1QgRU1NQ19Td2l0Y2hfSFMoUF9TRE1NQ19Qcm9wZXJ0aWVzX1QgcFNETU1DUCkKewoJVUlOVF9UIFJldHZhbCA9IE5vRXJyb3I7Cgl2b2xhdGlsZSBpbnQgaSA9IDA7CiAgICBNTUNfQ01ENl9PVkVSTEFZIENtZDY7CiAgICBQX01NNF9TRE1NQ19DT05URVhUX1QgcENvbnRleHQ7CgkvL1BfTU00X0NOVEwxIHBNTTRfQ05UTDE7CgogICAgcENvbnRleHQgPSAoUF9NTTRfU0RNTUNfQ09OVEVYVF9UKSBwU0RNTUNQLT5wQ29udGV4dDsKCS8vcE1NNF9DTlRMMSA9IChQX01NNF9DTlRMMSkgJnBDb250ZXh0LT5wTU1DNFJlZy0+bW00X2NudGwxOwoKCS8vIElzc3VlIENNRCA2IHRvIHNldCBIUyBUSU1JTkcgYml0cyBpbiBFWFRfQ1NEIHJlZ2lzdGVyIGJ5dGUgMTg1CiAgICAgICAgQ21kNi5NTUNfQ01ENl9MYXlvdXQuQWNjZXNzID0gRVhUX0NTRF9BQ0NFU1NfV1JJVEVfQllURTsJCQkvL1dyaXRlIEJ5dGUKICAgICAgICBDbWQ2Lk1NQ19DTUQ2X0xheW91dC5DbWRTZXQgPSAwOwkJCQkJCQkJCS8vIERvbid0IENhcmUKICAgICAgICBDbWQ2Lk1NQ19DTUQ2X0xheW91dC5JbmRleCA9IEhTX1RJTUlOR19NTUNfRVhUX0NTRF9PRkZTRVQ7IAkJCS8vIENob29zZSBIU19USU1JTkcKICAgICAgICBDbWQ2Lk1NQ19DTUQ2X0xheW91dC5SZXNlcnZlZDAgPSAwOwogICAgICAgIENtZDYuTU1DX0NNRDZfTGF5b3V0LlJlc2VydmVkMSA9IDA7CiAgICAgICAgLy9DbWQ2Lk1NQ19DTUQ2X0xheW91dC5WYWx1ZSA9IChVSU5UOF9UKSBNb2RlOwkvLyBTRVQgSFNfVElNSU5HLgoJCUNtZDYuTU1DX0NNRDZfTGF5b3V0LlZhbHVlID0gKFVJTlQ4X1QpIDE7CS8vIFNFVCBIU19USU1JTkcuCiAgICAgICAgcFNETU1DUC0+U3RhdGUgPSBXUklURTsKCiAgICAgICAgRU1NQ19TZW5kU2V0dXBDb21tYW5kKHBTRE1NQ1AsIFhMTFBfTU1DX0NNRDYsIE1NNF9DTURfVFlQRV9OT1JNQUwsIENtZDYuTU1DX0NNRDZfQml0cywgTU00X1JUX1IxIHwgTU00X1JUX0JVU1kgfCBNTTRfNDhfUkVTX1dJVEhfQlVTWSk7CiAgICAgICAgUmV0dmFsICs9IEVNTUNfSW50ZXJwcmV0X1Jlc3BvbnNlKHBTRE1NQ1AsIE1NQ19SRVNQT05TRV9SMUIsIDB4MTApOwoKCQlkZWxheV9tcygxKTsKCgkJaSA9IDA7CgkJUmV0dmFsID0gRU1NQ19DaGVja0NhcmRTdGF0dXMocFNETU1DUCwgMHg5MDAsIFIxX0xPQ0tFRENBUkRNQVNLKTsJCS8vIE1ha2Ugc3VyZSBjYXJkIGlzIHRyYW5zZmVyIG1vZGUKCQl3aGlsZShSZXR2YWwgIT0gTm9FcnJvcikKCQl7CgkJCWRlbGF5X21zKDEpOwoJCQlSZXR2YWwgPSBFTU1DX0NoZWNrQ2FyZFN0YXR1cyhwU0RNTUNQLCAweDkwMCwgUjFfTE9DS0VEQ0FSRE1BU0spOwkJLy8gTWFrZSBzdXJlIGNhcmQgaXMgdHJhbnNmZXIgbW9kZQoJCQlpZihpPjEwMDAwKQoJCQkJYnJlYWs7CgkJCWkrKzsKCQl9CgkJaWYgKFJldHZhbCAhPSBOb0Vycm9yKQoJCXsKCQkJRU1NQ19QUk4oUFJOX0VSUiwiQ01EMTMgZmFpbFxuIik7CgkJCUVNTUNfUFJOKFBSTl9FUlIsIlNXSVRDSCBNT0RFIGZhaWxcbiIpOwoJCQlyZXR1cm4gU0RNTUNJbml0aWFsaXphdGlvbkVycm9yOwoJCX0KCgkJRU1NQ0hDX0hpZ2hTcGVlZFNlbGVjdChwQ29udGV4dCwgMSk7ICAgLy9oaWdoIHNwZWVkCgojaWYgZGVmaW5lZChCRVJMSU5fU09DX0FTMzcwKQoJCUVNTUNIQ19ob3N0X21vZGUocENvbnRleHQsIDApOwkvL1NEUjUwCiNlbmRpZgoKCUVNTUNfUFJOKFBSTl9SRVMsIlNXSVRDSCBIUyBNT0RFIHBhc3NcbiIpOwoJcmV0dXJuIFJldHZhbDsKfQoKI2lmIGRlZmluZWQoQkVSTElOX1NPQ19BUzM3MCkKaW50IGNtZF9FTU1DX1JFU0VUKHZvaWQpCnsKCXVuc2lnbmVkIGludCB2YWw7Cgl1bnNpZ25lZCBpbnQgb2Zmc2V0OwoKCUJGTV9IT1NUX0J1c19SZWFkMzIoTUVNTUFQX0NISVBfQ1RSTF9SRUdfQkFTRSArIFJBX0dibF9wZXJpZlJlc2V0LCAmdmFsKTsKCXZhbCAmPSB+TVNLMzJHYmxfcGVyaWZSZXNldF9lbW1jU3luY1Jlc2V0OwoJdmFsIHw9IDB4MTw8TFNiMzJHYmxfcGVyaWZSZXNldF9lbW1jU3luY1Jlc2V0OwoJQkZNX0hPU1RfQnVzX1dyaXRlMzIoTUVNTUFQX0NISVBfQ1RSTF9SRUdfQkFTRStSQV9HYmxfcGVyaWZSZXNldCwgdmFsKTsKCWRlbGF5X21zKDEpOwoJdmFsICY9IH5NU0szMkdibF9wZXJpZlJlc2V0X2VtbWNTeW5jUmVzZXQ7CglCRk1fSE9TVF9CdXNfV3JpdGUzMihNRU1NQVBfQ0hJUF9DVFJMX1JFR19CQVNFK1JBX0dibF9wZXJpZlJlc2V0LCB2YWwpOwoKCglCRk1fSE9TVF9CdXNfUmVhZDMyKChFTU1DX1JFR19CQVNFICsgMHhFOCksICZvZmZzZXQpOwoJb2Zmc2V0ICY9IDB4RkZGOwoJb2Zmc2V0ICs9IDB4MkM7CgoJQkZNX0hPU1RfQnVzX1JlYWQzMigoRU1NQ19SRUdfQkFTRSArIG9mZnNldCksICZ2YWwpOwoJdmFsIHw9IDB4MTsKCXZhbCB8PSAweDEgPDwgMzsKCXZhbCAmPSB+KDB4MSA8PCAyKTsKCUJGTV9IT1NUX0J1c19Xcml0ZTMyKChFTU1DX1JFR19CQVNFICsgb2Zmc2V0KSwgdmFsKTsKCWRlbGF5X21zKDEpOwoKCUJGTV9IT1NUX0J1c19SZWFkMzIoKEVNTUNfUkVHX0JBU0UgKyBvZmZzZXQpLCAmdmFsKTsKCXZhbCB8PSAoMHgxPDwyKTsKCUJGTV9IT1NUX0J1c19Xcml0ZTMyKChFTU1DX1JFR19CQVNFICsgb2Zmc2V0KSwgdmFsKTsKCWRlbGF5X21zKDEpOwoJQkZNX0hPU1RfQnVzX1JlYWQzMigoRU1NQ19SRUdfQkFTRSArIG9mZnNldCksICZ2YWwpOwoKCWRiZ19wcmludGYoUFJOX0lORk8sICIgZU1NQyBjb250cm9sbGVyIHJlc2V0XG4iKTsKCXJldHVybiAwOwp9CiNlbmRpZgoKI2lmIGRlZmluZWQoQkVSTElOX1NPQ19CRzRDRFApCmludCBjbWRfRU1NQ19SRVNFVCh2b2lkKQp7CglUMzJHYmxfUmVzZXRUcmlnZ2VyIHJlZzsKCXVuc2lnbmVkIGludCBkYXRhMSA9IDA7CgoJcmVnLnUzMiA9IDA7CglCRk1fSE9TVF9CdXNfUmVhZDMyKE1FTU1BUF9DSElQX0NUUkxfUkVHX0JBU0UrUkFfR2JsX1Jlc2V0VHJpZ2dlciwmcmVnLnUzMik7CgkvLyAgICBkYmdfcHJpbnRmKFBSTl9SRVMsICIgMHgleCA9IDB4JXhcbiIsIE1FTU1BUF9DSElQX0NUUkxfUkVHX0JBU0UrUkFfR2JsX1Jlc2V0VHJpZ2dlciwgcmVnLnUzMik7CglyZWcudVJlc2V0VHJpZ2dlcl9lbW1jU3luY1Jlc2V0ID0gMTsKCUJGTV9IT1NUX0J1c19Xcml0ZTMyKE1FTU1BUF9DSElQX0NUUkxfUkVHX0JBU0UrUkFfR2JsX1Jlc2V0VHJpZ2dlcixyZWcudTMyKTsKCWRlbGF5X21zKDEpOwoJcmVnLnVSZXNldFRyaWdnZXJfZW1tY1N5bmNSZXNldCA9IDA7CglCRk1fSE9TVF9CdXNfV3JpdGUzMihNRU1NQVBfQ0hJUF9DVFJMX1JFR19CQVNFK1JBX0dibF9SZXNldFRyaWdnZXIscmVnLnUzMik7CgkvLyAgICBkYmdfcHJpbnRmKFBSTl9JTkZPLCAiIDB4JXggPSAweCV4XG4iLCBNRU1NQVBfQ0hJUF9DVFJMX1JFR19CQVNFK1JBX0dibF9SZXNldFRyaWdnZXIsIHJlZy51MzIpOwoKCUJGTV9IT1NUX0J1c19SZWFkMzIoKEVNTUNfUkVHX0JBU0UgKyAweDAxMzApLCAmZGF0YTEpOwoJLy8gICAgZGJnX3ByaW50ZihQUk5fUkVTLCAiIDB4JXggPSAweCV4XG4iLCBFTU1DX1JFR19CQVNFICsgMHgwMTMwLCBkYXRhMSk7CglkYXRhMSB8PSAoMTw8MTYpOwoJQkZNX0hPU1RfQnVzX1dyaXRlMzIoKEVNTUNfUkVHX0JBU0UgKyAweDAxMzApLGRhdGExKTsKCWRlbGF5X21zKDEpOwoJZGF0YTEgJj0gfigxPDwxNik7CglCRk1fSE9TVF9CdXNfV3JpdGUzMigoRU1NQ19SRUdfQkFTRSArIDB4MDEzMCksZGF0YTEpOwoKCWRiZ19wcmludGYoUFJOX0lORk8sICIgZU1NQyBjb250cm9sbGVyIHJlc2V0XG4iKTsKCglyZXR1cm4gMDsKfQojZW5kaWYKCmludCBjbWRfRU1NQ19TVEFSVCh2b2lkKQp7CiAgICBpbnQgaVJlc3VsdD0wOwoKICAgIGlmIChFTU1DX1dhaXRGb3JDYXJkRGV0ZWN0KCkgPT0gMSkKICAgIHsKICAgICAgICBpUmVzdWx0ID0gRU1NQ19Jbml0KCk7CiAgICB9CiAgICBlbHNlCiAgICAgICAgaVJlc3VsdCA9Tm90Rm91bmRFcnJvcjsKCiAgICByZXR1cm4gaVJlc3VsdDsKfQoKaW50IGRvX2VtbWNpbml0KHZvaWQpCnsKCWludCBpUmVzdWx0ID0gMDsKCgljbWRfRU1NQ19SRVNFVCgpOwoJRU1NQ19QUk4oUFJOX1JFUywgImNtZF9FTU1DX1JFU0VUXG4iKTsKCWlSZXN1bHQgPSBjbWRfRU1NQ19JTklUKCk7CglFTU1DX1BSTihQUk5fUkVTLCAiY21kX0VNTUNfSU5JVFxuIik7CglpUmVzdWx0ID0gY21kX0VNTUNfU1RBUlQoKTsKCUVNTUNfUFJOKFBSTl9SRVMsICJjbWRfRU1NQ19TVEFSVFxuIik7CgkvL2lSZXN1bHQgPSBjbWRfRU1NQ19FWFRDU0QoKTsKCS8vRU1NQ19QUk4oUFJOX05PVElDRSwgImNtZF9FTU1DX0VYVENTRFxuIik7CglyZXR1cm4gaVJlc3VsdDsKfQo=