dWNwcC0xLjAgaXMgYSBDIHByZXByb2Nlc3NvciBtb3N0bHkgY29tcGxpYW50IHRvIElTTy1DOTkuCgpBdXRob3I6IFRob21hcyBQb3JuaW4gPHRob21hcy5wb3JuaW5AZW5zLmZyPgpNYWluIHNpdGU6IGh0dHA6Ly93d3cuZGkuZW5zLmZyL35wb3JuaW4vdWNwcC8KCgoKSU5UUk9EVUNUSU9OCi0tLS0tLS0tLS0tLQoKQSBDIHByZXByb2Nlc3NvciBpcyBhIHBhcnQgb2YgYSBDIGNvbXBpbGVyIHJlc3BvbnNpYmxlIGZvciBtYWNybwpyZXBsYWNlbWVudCwgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gYW5kIGluY2x1c2lvbiBvZiBoZWFkZXIgZmlsZXMuCkl0IGlzIG9mdGVuIGZvdW5kIGFzIGEgc3RhbmQtYWxvbmUgcHJvZ3JhbSBvbiBVbml4IHN5c3RlbXMuCgpVY3BwIGlzIHN1Y2ggYSBwcmVwcm9jZXNzb3I7IGl0IGlzIGRlc2lnbmVkIHRvIGJlIHF1aWNrIGFuZCBsaWdodCwKYnV0IGFueXdheSBmdWxseSBjb21wbGlhbnQgdG8gdGhlIElTTyBzdGFuZGFyZCA5ODk5OjE5OTksIGFsc28ga25vd24KYXMgQzk5LiBVY3BwIGNhbiBiZSBjb21waWxlZCBhcyBhIHN0YW5kLWFsb25lIHByb2dyYW0sIG9yIGxpbmtlZCB0bwpzb21lIG90aGVyIGNvZGU7IGluIHRoZSBsYXR0ZXIgY2FzZSwgdWNwcCB3aWxsIG91dHB1dCB0b2tlbnMsIG9uZQphdCBhIHRpbWUsIG9uIGRlbWFuZCwgYXMgYW4gaW50ZWdyYXRlZCBsZXhlci4KClVjcHAgb3BlcmF0ZXMgaW4gdHdvIG1vZGVzOgotLSBsZXhlciBtb2RlOiB1Y3BwIGlzIGxpbmtlZCB0byBzb21lIG90aGVyIGNvZGUgYW5kIG91dHB1dHMgYSBzdHJlYW0gb2YKdG9rZW5zIChlYWNoIGNhbGwgdG8gdGhlIGxleCgpIGZ1bmN0aW9uIHdpbGwgZ2l2ZSBvbmUgdG9rZW4pCi0tIG5vbi1sZXhlciBtb2RlOiB1Y3BwIHByZXByb2Nlc3NlcyB0ZXh0IGFuZCBvdXRwdXRzIHRoZSByZXN1bHRpbmcgdGV4dApvbiBhIGZpbGUgZGVzY3JpcHRvcjsgaWYgbGlua2VkIHRvIHNvbWUgb3RoZXIgY29kZSwgdGhlIGNwcCgpIGZ1bmN0aW9uCm11c3QgYmUgY2FsbGVkIHJlcGVhdGVkbHksIG90aGVyd2lzZSB1Y3BwIGlzIGEgc3RhbmQtYWxvbmUgYmluYXJ5LgoKCgpJTlNUQUxMQVRJT04KLS0tLS0tLS0tLS0tCgoxLiBVbmNvbXByZXNzIHRoZSBhcmNoaXZlIGZpbGUgYW5kIGV4dHJhY3QgdGhlIHNvdXJjZSBmaWxlcy4KCjIuIEVkaXQgdHVuZS5oLiBIZXJlIGlzIGEgc2hvcnQgZXhwbGFuYXRpb24gb2YgY29tcGlsZS10aW1lIG9wdGlvbnM6CgogIExPV19NRU0KICAgICBFbmFibGUgbWVtb3J5LXNhdmluZyBmdW5jdGlvbnM7IHRoaXMgaXMgZm9yIGxvdy1lbmQgYW5kIG9sZCBzeXN0ZW1zLAogICAgIGJ1dCBzZWVtcyB0byBiZSBnb29kIGZvciBsYXJnZXIgc3lzdGVtcyB0b28uIEtlZXAgaXQuCiAgTk9fTElCQ19CVUYKICBOT19VQ1BQX0JVRgogICAgIFR3byBvcHRpb25zIHVzZWQgdG8gZGlzYWJsZSB0aGUgdHdvIGJ1ZmZlcmluZ3MgaW5zaWRlIHVjcHAuIERlZmluZQogICAgIGJvdGggb3B0aW9ucyBmb3IgbWF4aW11bSBtZW1vcnkgc2F2aW5nIGJ1dCB5b3Ugd2lsbCBwcm9iYWJseSB3YW50CiAgICAgdG8ga2VlcCBsaWJjIGJ1ZmZlcmluZyBpZiB5b3Ugd2FudCBkZWNlbnQgcGVyZm9ybWFuY2UuIERlZmluZSBub25lCiAgICAgb24gbGFyZ2Ugc3lzdGVtcyAobW9kZXJuIDMyIG9yIDY0LWJpdCBzeXN0ZW1zKS4KICBVQ1BQX01NQVAKICAgICBXaXRoIHRoaXMgb3B0aW9uLCBpZiB1Y3BwIGludGVybmFsIGJ1ZmZlcmluZyBpcyBhY3RpdmUsIHVjcHAgd2lsbAogICAgIHRyeSB0byBtbWFwKCkgdGhlIGlucHV0IGZpbGVzLiBUaGlzIG1pZ2h0IGdpdmUgYSBzbGlnaHQgcGVyZm9ybWFuY2UKICAgICBpbXByb3ZlbWVudCwgYnV0IHdpbGwgd29yayBvbmx5IG9uIGEgbGltaXRlZCBzZXQgb2YgYXJjaGl0ZWN0dXJlcy4KICBQUkFHTUFfVE9LRU5JWkUKICAgICBNYWtlIHVjcHAgZ2VuZXJhdGUgdG9rZW5pemVkIFBSQUdNQSB0b2tlbnMgb24gI3ByYWdtYSBhbmQgX1ByYWdtYSgpOwogICAgIHRva2VuaXphdGlvbiBpcyBtYWRlIHRoaXMgd2F5OiB0b2tlbnMgYXJlIGFzc2VtYmxlZCBhcyBhIG51bGwKICAgICB0ZXJtaW5hdGVkIGFycmF5IG9mIHVuc2lnbmVkIGNoYXJzOyBpZiBhIHRva2VuIGhhcyBhIHN0cmluZyB2YWx1ZQogICAgIChhcyBkZWZpbmVkIGJ5IHRoZSBTVFJJTkdfVE9LRU4gbWFjcm8pLCB0aGUgdmFsdWUgZm9sbG93cyB0aGUgdG9rZW4sCiAgICAgdGVybWluYXRlZCBieSBQUkFHTUFfVE9LRU5fRU5EIChieSBkZWZhdWx0LCBhIG5ld2xpbmUgY2hhcmFjdGVyIGNhc3QKICAgICB0byB1bnNpZ25lZCBjaGFyKS4gV2hpdGVzcGFjZSB0b2tlbnMgYXJlIHNraXBwZWQuIFRoZSAibmFtZSIgdmFsdWUKICAgICBvZiB0aGUgUFJBR01BIHRva2VuIGlzIGEgcG9pbnRlciB0byB0aGF0IGFycmF5LiBUaGlzIHNldHRpbmcgaXMKICAgICBpcnJlbGV2YW50IGluIG5vbi1sZXhlciBtb2RlLgogIFBSQUdNQV9EVU1QCiAgICAgSW4gbm9uLWxleGVyIG1vZGUsIGtlZXAgI3ByYWdtYSBpbiBvdXRwdXQ7IG5vbi12b2lkIF9QcmFnbWEoKSBhcmUKICAgICB0cmFuc2xhdGVkIHRvIHRoZSBlcXVpdmFsZW50ICNwcmFnbWEuIElycmVsZXZhbnQgaW4gbGV4ZXIgbW9kZS4KICBOT19QUkFHTUFfSU5fRElSRUNUSVZFCiAgICAgRG8gbm90IGV2YWx1YXRlIF9QcmFnbWEoKSBpbnNpZGUgI2lmLCAjaW5jbHVkZSwgI2luY2x1ZGVfbmV4dCBhbmQgI2xpbmUKICAgICBkaXJlY3RpdmVzOyBpbnN0ZWFkLCBlbWl0IGFuIGVycm9yIChzaW5jZSB0aGUgcmVtYWluaW5nIF9QcmFnbWEgd2lsbAogICAgIHN1cmVseSBpbXBseSBhIHN5bnRheCBlcnJvcikuCiAgSU5NQUNST19GTEFHCiAgICAgSW4gbGV4ZXIgbW9kZSwgc2V0IHRoZSBpbm1hY3JvIGZsYWcgdG8gMSBpZiB0aGUgY3VycmVudCB0b2tlbiBjb21lcwogICAgIGZyb20gYSBtYWNybyByZXBsYWNlbWVudCwgMCBvdGhlcndpc2UuIG1hY3JvX2NvdW50IG1haW50YWlucyBhbgogICAgIGluY3JlYXNpbmcgY291bnRlciBvZiBzdWNoIHJlcGxhY2VtZW50cy4gQ09OVEVYVCB0b2tlbnMgY291bnQgYXMKICAgICBvbmUgbWFjcm8gcmVwbGFjZW1lbnQgZWFjaC4gI3ByYWdtYSwgYW5kIF9QcmFnbWEoKSB0aGF0IGRvIG5vdCBjb21lCiAgICAgZnJvbSBhIG1hY3JvIHJlcGxhY2VtZW50LCBhbHNvIGNvdW50IGFzIG9uZSBtYWNybyByZXBsYWNlbWVudCBlYWNoLgogICAgIFRoaXMgc2V0dGluZyBpcyBpcnJlbGV2YW50IGluIG5vbi1sZXhlciBtb2RlLgogIFNURF9JTkNMVURFX1BBVEgKICAgICBEZWZhdWx0IGluY2x1ZGUgcGF0aCBpbiBzdGFuZC1hbG9uZSB1Y3BwLgogIFNURF9NQUNST1MKICAgICBEZWZhdWx0IHByZWRlZmluZWQgbWFjcm9zIGluIHN0YW5kLWFsb25lIHVjcHAuCiAgU1REX0FTU0VSVAogICAgIERlZmF1bHQgYXNzZXJ0aW9ucyBpbiBzdGFuZC1hbG9uZSB1Y3BwLgogIE5BVElWRV9JTlRNQVgKICBOQVRJVkVfVUlOVE1BWAogIFNJTVVMX1VJTlRNQVgKICBXQ0hBUl9TSUdORURORVNTCiAgICAgVGhvc2Ugb3B0aW9ucyBkZWZpbmUgaG93ICNpZiBleHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkOyBzZWUgdGhlCiAgICAgY3Jvc3MtY29tcGlsYXRpb24gc2VjdGlvbiBvZiB0aGlzIGZpbGUgZm9yIG1vcmUgaW5mby4KICBERUZBVUxUX0xFWEVSX0ZMQUdTCiAgREVGQVVMVF9DUFBfRkxBR1MKICAgICBEZWZhdWx0IGZsYWdzIGluIHJlc3BlY3RpdmVseSBsZXhlciBhbmQgbm9uLWxleGVyIG1vZGVzLgogIFBPU0lYX0pNUAogICAgIERlZmluZSB0aGlzIGlmIHlvdXIgYXJjaGl0ZWN0dXJlIGRlZmluZXMgc2lnc2V0am1wKCkgYW5kCiAgICAgc2lnbG9uZ2ptcCgpOyBpdCBpcyBrbm93biB0byAodmVyeSBzbGlnaHRseSkgaW1wcm92ZSBwZXJmb3JtYW5jZQogICAgIG9uIEFJWCBzeXN0ZW1zLgogIE1BWF9DSEFSX1ZBTAogICAgIFVjcHAgd2lsbCBjb25zaWRlciBjaGFyYWN0ZXJzIHdob3NlIHZhbHVlIGlzIGVxdWFsIG9yIGFib3ZlCiAgICAgTUFYX0NIQVJfVkFMIGFzIG91dHNpZGUgdGhlIEMgc291cmNlIGNoYXJzZXQgKHNvIHRoZXkgd2lsbCBiZQogICAgIHRyZWF0ZWQganVzdCBsaWtlICdAJywgZm9yIGluc3RhbmNlKS4gRm9yIEFTQ0lJIHN5c3RlbXMsIDEyOAogICAgIGlzIGZpbmUuIDI1NiBpcyBhIHNhZmVyIHZhbHVlLCBidXQgdXNlcyBtb3JlIChzdGF0aWMpIG1lbW9yeS4KICAgICBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgdXNlIGEgcG93ZXIgb2YgdHdvLiBJZiBNQVhfQ0hBUl9WQUwgaXMKICAgICBjb3JyZWN0bHkgYWRqdXN0ZWQsIHVjcHAgc2hvdWxkIGJlIGNvbXBhdGlibGUgd2l0aCBhbnkgY2hhcmFjdGVyCiAgICAgc2V0LgogIFVOQlJFQUtBQkxFX1NQQUNFCiAgICAgSWYgeW91IHdhbnQgYW4gZXh0cmEtd2hpdGVzcGFjZSBjaGFyYWN0ZXIsIGRlZmluZSB0aGlzIG1hY3JvIHRvIHRoYXQKICAgICBjaGFyYWN0ZXIuIEZvciBpbnN0YW5jZSwgZGVmaW5lIHRoaXMgdG8gMTYwIG9uIGFuIElTTy04ODU5LTEgc3lzdGVtCiAgICAgaWYgeW91IHdhbnQgdGhlICd1bmJyZWFrYWJsZSBzcGFjZScgdG8gYmUgY29uc2lkZXJlZCBhcyB3aGl0ZXNwYWNlLgogIFNFTVBFUl9GSURFTElTCiAgICAgV2l0aCB0aGlzIG9wdGlvbiBzZXQsIHVjcHAsIHdoZW4gdXNlZCBhcyBhIGxleGVyLCB3aWxsIHBhc3MKICAgICB3aGl0ZXNwYWNlIHRva2VucyB0byBpdHMgY2FsbGVyLCBhbmQgdGhvc2UgdG9rZW5zIHdpbGwgaGF2ZSB0aGVpcgogICAgIHRydWUgY29udGVudDsgdGhpcyBpcyBpbnRlbmRlZCBmb3IgcmVjb25zdHJ1Y3Rpb24gb2YgdGhlIHNvdXJjZQogICAgIGxpbmUuIEJld2FyZSB0aGF0IHNvbWUgY29tbWVudHMgbWF5IGhhdmUgZW1iZWRkZWQgbmV3bGluZXMuCiAgQ09QWV9MSU5FX0xFTkdUSAogICAgIFVjcHAgY2FuIG1haW50YWluIGEgY29weSBvZiB0aGUgY3VycmVudCBzb3VyY2UgbGluZSwgdXAgdG8gdGhhdAogICAgIGxlbmd0aC4gSXJyZWxldmFudCB0byBzdGFuZC1hbG9uZSB2ZXJzaW9uLgogICpfTUVNRwogICAgIFRob3NlIHNldHRpbmdzIG1vZGlmeSB1Y3BwIGJlaGF2aW91ciwgd3J0IG1lbW9yeSBhbGxvY2F0aW9ucy4gV2l0aAogICAgIGhpZ2hlciB2YWx1ZXMsIHVjcHAgd2lsbCBwZXJmb3JtIGxlc3MgbWFsbG9jKCkgY2FsbHMgYW5kIHdpbGwgcnVuCiAgICAgZmFzdGVyLCBidXQgaXQgd2lsbCB1c2UgbW9yZSBtZW1vcnkuIFJlZHVjZSBJTlBVVF9CVUZfTUVNRyBhbmQKICAgICBPVVRQVVRfQlVGX01FTUcgb24gbG93LW1lbW9yeSBzeXN0ZW1zLCBpZiB5b3Uga2VwdCB1Y3BwIGJ1ZmZlcmluZwogICAgIChzZWUgTk9fVUNQUF9CVUYgb3B0aW9uKS4KCjMuIEVkaXQgdGhlIE1ha2VmaWxlLiBZb3Ugc2hvdWxkIGRlZmluZSB0aGUgdmFyaWFibGVzIENDIGFuZCBGTEFHUzsKICAgdGhlcmUgYXJlIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKCiAgLURBVURJVAogICAgIEVuYWJsZSBpbnRlcm5hbCBzYW5pdHkgY2hlY2tzOyB0aGlzIHNsb3dzIGRvd24gYSBiaXQgdWNwcC4gRG8gbm90CiAgICAgZGVmaW5lIHVubGVzcyB5b3UgcGxhbiB0byBkZWJ1ZyB1Y3BwLgogIC1ETUVNX0NIRUNLCiAgICAgV2l0aCB0aGlzIHNldHRpbmcsIHVjcHAgd2lsbCBjaGVjayBmb3IgdGhlIHJldHVybiB2YWx1ZSBvZiBtYWxsb2MoKQogICAgIGFuZCBleGl0IHdpdGggYSBkaWFnbm9zdGljIHdoZW4gb3V0IG9mIG1lbW9yeS4gTUVNX0NIRUNLIGlzIGltcGxpZWQKICAgICBieSBBVURJVC4KICAtRElOTElORT1mb29iYXIKICAgICBUaGUgdWNwcCBjb2RlIHVzZXMgImlubGluZSIgcXVhbGlmaWVyIGZvciBzb21lIGZ1bmN0aW9uczsgYnkKICAgICBkZWZhdWx0LCB0aGF0IHF1YWxpZmllciBpcyBtYWNyby1yZXBsYWNlZCB3aXRoIG5vdGhpbmcuIERlZmluZQogICAgIElOTElORSB0byB0aGUgY29ycmVjdCByZXBsYWNlbWVudCBmb3IgeW91ciBjb21waWxlciwgaWYgc3VwcG9ydGVkLgogICAgIE5vdGUgdGhhdCBhbGwgImlubGluZSIgZnVuY3Rpb25zIGluIHVjcHAgYXJlIGFsc28gInN0YXRpYyIuIEZvciBhbnkKICAgICBDOTktY29tcGxpYW50IGNvbXBpbGVyLCB0aGUgR05VIGNvbXBpbGVyIChnY2MpLCBhbmQgdGhlIENvbXBhcSBDCiAgICAgY29tcGlsZXIgdW5kZXIgTGludXgvQWxwaGEsIG5vIC1ESU5MSU5FIGlzIG5lZWRlZCAoc2VlIHR1bmUuaCBmb3IKICAgICBkZXRhaWxzKS4KCjQuIENvbXBpbGUgYnkgdHlwaW5nICJtYWtlIi4gVGhpcyBzaG91bGQgcHJvZHVjZSB0aGUgdWNwcCBleGVjdXRhYmxlCiAgIGZpbGUuCgo1LiBJbnN0YWxsIHdoZXJldmVyIHlvdSB3YW50IHRoZSBiaW5hcnkgYW5kIHRoZSBtYW4gcGFnZSB1Y3BwLjEuCgo2LiBJZiB5b3UgZG8gbm90IGhhdmUgdGhlIG1ha2UgdXRpbGl0eSwgY29tcGlsZSBlYWNoIGZpbGUgc2VwZXJhdGVseQogICBhbmQgbGluayB0aGVtIHRvZ2V0aGVyLiBUaGUgZXhhY3QgZGV0YWlscyBkZXBlbmQgb24geW91ciBjb21waWxlci4KICAgWW91IG11c3QgZGVmaW5lIHRoZSBtYWNybyBTVEFORF9BTE9ORSB3aGVuIGNvbXBpbGluZyBjcHAuYyAodGhlcmUKICAgaXMgc3VjaCBhIGRlZmluaXRpb24sIGNvbW1lbnRlZCBvdXQsIGluIGNwcC5jLCBsaW5lIDM0KS4KClRoZXJlIGlzIG5vICJjb25maWd1cmUiIHNjcmlwdCBzaW5jZToKLS0gSSBkbyBub3QgbGlrZSB0aGUgdmVyeSBpZGVhIG9mIGEgImNvbmZpZ3VyZSIgc2NyaXB0LgotLSBVY3BwIGlzIHdyaXR0ZW4gaW4gQU5TSS1DIGFuZCBzaG91bGQgYmUgZmFpcmx5IHBvcnRhYmxlLgotLSBUaGVyZSBpcyBubyBzdWNoIHRoaW5nIGFzICJzdGFuZGFyZCIgc2V0dGluZ3MgZm9yIGEgQyBwcmVwcm9jZXNzb3IuCiAgIFRoZSBwcmVkZWZpbmVkIHN5c3RlbSBtYWNyb3MsIHN0YW5kYXJkIGFzc2VydGlvbnMsLi4uIG11c3QgYmUgdHVuZWQKICAgYnkgdGhlIHN5c2FkbWluLgotLSBUaGUgcHJpbWFyeSBnb2FsIG9mIHVjcHAgaXMgdG8gYmUgaW5jbHVkZWQgaW4gY29tcGlsZXJzLiBUaGUKICAgc3RhbmQtYWxvbmUgdmVyc2lvbiBpcyBtYWlubHkgYSBkZWJ1Z2dpbmcgdG9vbC4KClBsZWFzZSBub3RlIHRoYXQgeW91IG5lZWQgYW4gSVNPLUM5MCAoZm9ybWVybHkgQU5TSSkgQyBjb21waWxlciBzdWl0ZQooaW5jbHVkaW5nIHRoZSBzdGFuZGFyZCBsaWJyYXJ5KSB0byBjb21waWxlIHVjcHAuIElmIHlvdXIgY29tcGlsZXIgaXMKbm90IEM5OSAob3IgbGF0ZXIpLCByZWFkIHRoZSBjcm9zcy1jb21waWxhdGlvbiBzZWN0aW9uIGluIHRoaXMgUkVBRE1FCmZpbGUuCgpUaGUgQzkwIGFuZCBDOTkgc3RhbmRhcmRzIHN0YXRlIHRoYXQgZXh0ZXJuYWwgbGlua2FnZSBuYW1lcyBtaWdodApiZSBjb25zaWRlcmVkIGVxdWFsIG9yIGRpZmZlcmVudCBiYXNlZCB1cG9uIG9ubHkgdGhlaXIgZmlyc3QgNgpjaGFyYWN0ZXJzOyB0aGlzIHJ1bGUgbWlnaHQgbWFrZSB1Y3BwIG5vdCB0byBjb21waWxlIG9uIGEgY29uZm9ybWFudCBDCmltcGxlbWVudGF0aW9uLiBJIGhhdmUgeWV0IHRvIHNlZSBzdWNoIGFuIGltcGxlbWVudGF0aW9uLCBob3dldmVyLgoKSWYgeW91IHdhbnQgdG8gdXNlIHVjcHAgYXMgYW4gaW50ZWdyYXRlZCBwcmVwcm9jZXNzb3IgYW5kIGxleGVyLCBzZWUgdGhlCnNlY3Rpb24gUkVVU0UuIENvbXBpbGluZyB1Y3BwIGFzIGEgbGlicmFyeSBpcyBhbiBleGVyY2lzZSBsZWZ0IHRvIHRoZQpyZWFkZXIuCgpXaXRoIHRoZSBMT1dfTUVNIGNvZGUgZW5hYmxlZCwgdWNwcCBjYW4gcnVuIG9uIGEgTWluaXgtODYgb3IgTXNkb3MKMTYtYml0IHNtYWxsLW1lbW9yeS1tb2RlbCBtYWNoaW5lLiBJdCB3aWxsIG5vdCBiZSBmdWxseSBjb21wbGlhbnQKb24gc3VjaCBhbiBhcmNoaXRlY3R1cmUgdG8gQzk5LCBzaW5jZSBDOTkgc3RhdGVzIHRoYXQgYXQgbGVhc3Qgb25lCnNvdXJjZSBjb2RlIHdpdGggNDA5NSBzaW11bHRhbmVvdXNseSBkZWZpbmVkIG1hY3JvcyBtdXN0IGJlIHByb2Nlc3NlZDsKdWNwcCB3aWxsIGJlIGxpbWl0ZWQgdG8gYWJvdXQgMTUwMCBtYWNyb3MgKGF0IG1vc3QpIGR1ZSB0byBtZW1vcnkKcmVzdHJpY3Rpb25zLiBBdCBsZWFzdCB1Y3BwIGNhbiBwcmVwcm9jZXNzIGl0cyBvd24gY29kZSBpbiB0aGVzZQpjb25kaXRpb25zLiBMT1dfTUVNIGlzIG9uIGJ5IGRlZmF1bHQgYmVjYXVzZSBpdCBzZWVtcyB0byBpbXByb3ZlCnBlcmZvcm1hbmNlIG9uIGxhcmdlIHN5c3RlbXMuCgoKCkxJQ0VOU0UKLS0tLS0tLQoKVGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UgaXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgTWFrZWZpbGUgYW5kCmVhY2ggc291cmNlIGZpbGUuIEl0IGlzIGJhc2ljYWxseSBhIEJTRCBsaWNlbnNlLCB3aXRob3V0IHRoZSBhZHZlcnRpc2luZwpzdWJjbGF1c2UgKHdoaWNoIEJTRCBkcm9wcGVkIHJlY2VudGx5IGFueXdheSkgYW5kIHdpdGggbm8gcmVmZXJlbmNlIHRvCkJlcmtlbGV5IChzaW5jZSB0aGUgY29kZSBpcyBhbGwgbWluZSwgd3JpdHRlbiBmcm9tIHNjcmF0Y2gpLiBJbmZvcm1hbGx5LAp0aGlzIG1lYW5zIHRoYXQgeW91IGNhbiByZXVzZSBhbmQgcmVkaXN0cmlidXRlIHRoZSBjb2RlIGFzIHlvdSB3YW50LApwcm92aWRlZCB0aGF0IHlvdSBzdGF0ZXMgaW4gdGhlIGRvY3VtZW50YXRpb24gKG9yIGFueSBzdWJzdGFudGlhbCBwYXJ0Cm9mIHRoZSBzb2Z0d2FyZSkgb2YgcmVkaXN0cmlidXRlZCBjb2RlIHRoYXQgSSBhbSB0aGUgb3JpZ2luYWwgYXV0aG9yLgooSWYgeW91IHByZXNzIGEgY2Ryb20gd2l0aCAyMDAgc29mdHdhcmUgcGFja2FnZXMsIEkgZG8gbm90IGluc2lzdCBvbgpoYXZpbmcgbXkgbmFtZSBvbiB0aGUgY292ZXIgb2YgdGhlIGNkcm9tIC0tIGp1c3Qga2VlcCBhIFJlYWRtZSBmaWxlCnNvbWV3aGVyZSBvbiB0aGUgY2Ryb20sIHdpdGggdGhlIGNvcHlyaWdodCBub3RpY2UgaW5jbHVkZWQpCgpBcyBhIGNvdXJ0ZW91cyBnZXN0dXJlLCBpZiB5b3UgcmV1c2UgbXkgY29kZSwgcGxlYXNlIGRyb3AgbWUgYSBtYWlsLgpJdCByYWlzZXMgbXkgc2VsZi1lc3RlZW0uCgoKClJFVVNFCi0tLS0tCgpUaGUgY29kZSBoYXMgYmVlbiB0aG91Z2h0IGFzIHBhcnQgb2YgYSBiaWdnZXIgcHJvamVjdDsgaXQgbWlnaHQgYmUKdXNlZCBhcyBhbiBpbnRlZ3JhdGVkIGxleGVyLCB0aGF0IHdpbGwgcmVhZCBmaWxlcywgcHJvY2VzcyB0aGVtIGFzIGEKQyBwcmVwcm9jZXNzb3IsIGFuZCBvdXRwdXQgYSBzdHJlYW0gb2YgQyB0b2tlbnMuIFRvIGluY2x1ZGUgdGhpcyBjb2RlCmludG8gYSBwcm9qZWN0LCBjb21waWxlIHdpdGggU1RBTkRfQUxPTkUgdW5kZWZpbmVkLgoKVG8gdXNlIHRoZSBwcmVwcm9jZXNzb3IgYW5kIGxleGVyLCBzZXZlcmFsIHN0ZXBzIHNob3VsZCBiZSBwZXJmb3JtZWQuClNlZSB0aGUgZmlsZSAnc2FtcGxlLmMnIGZvciBhbiBleGFtcGxlLgoKMS4gY2FsbCBpbml0X2NwcCgpLiBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBsZXhlciBhdXRvbWF0b24uCgoyLiBzZXQgdGhlIGZvbGxvd2luZyBnbG9iYWwgdmFyaWFibGVzOgoJbm9fc3BlY2lhbF9tYWNyb3MKCQlub24temVybyBpZiB0aGUgc3BlY2lhbCBtYWNyb3MgKF9fRklMRV9fIGFuZCBvdGhlcnMpCgkJc2hvdWxkIG5vdCBiZSBkZWZpbmVkLiBUaGlzIGlzIGEgZ2xvYmFsIGZsYWcgc2luY2UKCQlpdCBhZmZlY3RzIHRoZSByZWRlZmluaXRpb24gb2Ygc3VjaCBtYWNyb3MgKHdoaWNoIGFyZQoJCWFsbG93ZWQgaWYgdGhlIHNwZWNpYWwgbWFjcm9zIGFyZSBub3QgZGVmaW5lZCkKCWM5OV9jb21wbGlhbnQKCQlpZiBub24temVybywgZGVmaW5lIF9fU1REQ19WRVJTSU9OX18gdG8gMTk5OTAxTDsgdGhpcwoJCWlzIHRoZSBkZWZhdWx0OyBvdGhlcndpc2UsIGRvIG5vdCBkZWZpbmUgX19TVERDX1ZFUlNJT05fXy4KCQlOb3RlIHRoYXQgdWNwcCB3aWxsIGFjY2VwdCB0byB1bmRlZmluZSBfX1NURENfVkVSU0lPTl9fCgkJd2l0aCBhICN1bmRlZiBkaXJlY3RpdmUuCgljOTlfaG9zdGVkCgkJaWYgc3RyaWN0bHkgcG9zaXRpdmUsIGRlZmluZSBfX1NURENfSE9TVEVEX18gdG8gMS4KCQlJZiB6ZXJvLCBkZWZpbmUgX19TVERDX0hPU1RFRF9fIHRvIDAuIElmIG5lZ2F0aXZlLAoJCWRvIG5vdCBkZWZpbmUgX19TVERDX0hPU1RFRF9fLiBUaGUgZGVmYXVsdCBpcyAxLgoJZW1pdF9kZWZpbmVzIGFuZCBlbWl0X2Fzc2VydGlvbnMgc2hvdWxkIGJlIHNldCB0byAwIGZvcgoJdGhlIHN0ZXAgMy4KCjMuIGNhbGwgaW5pdF90YWJsZXMoKS4gVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgbWFjcm8gdGFibGUKICAgYW5kIG90aGVyIHRoaW5nczsgaXQgd2lsbCBpbnRpYWxpemUgYXNzZXJ0aW9ucyBpZiBpdCBoYXMgYSBub24temVybwogICBhcmd1bWVudC4KCjQuIGNhbGwgaW5pdF9pbmNsdWRlX3BhdGgoKS4gVGhpcyBmdW5jdGlvbiB3aWxsIHJlc2V0IHRoZSBpbmNsdWRlCiAgIHBhdGggdG8gdGhlIGxpc3Qgb2YgcGF0aHMgZ2l2ZW4gYXMgYXJndW1lbnQuCgo1LiBzZXQgdGhlIGZvbGxvd2luZyBnbG9iYWwgdmFyaWFibGVzCgllbWl0X2RlcGVuZGVuY2llcwoJCXNldCB0byAxIGlmIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgZW1pdHRlZCBkdXJpbmcKCQlwcmVwcm9jZXNzaW5nCgkJc2V0IHRvIDIgaWYgZGVwZW5kZW5jaWVzIHNob3VsZCBhbHNvIGJlIGVtaXR0ZWQgZm9yCgkJc3lzdGVtIGluY2x1ZGUgZmlsZXMKCWVtaXRfZGVmaW5lcwoJCXNldCB0byBub24temVybyBpZiAjZGVmaW5lIG1hY3JvIGRlZmluaXRpb25zIHNob3VsZCBiZQoJCWVtaXR0ZWQgd2hlbiBtYWNyb3MgYXJlIGRlZmluZWQKCWVtaXRfYXNzZXJ0aW9ucwoJCXNldCB0byBub24temVybyBpZiAjZGVmaW5lIG1hY3JvIGRlZmluaXRpb25zIHNob3VsZCBiZQoJCWVtaXR0ZWQgd2hlbiBtYWNyb3MgYXJlIGRlZmluZWQKCWVtaXRfb3V0cHV0CgkJdGhlIEZJTEUgKiB3aGVyZSB0aGUgYWJvdmUgaXRlbXMgYXJlIHNlbnQgaWYgb25lIG9mIHRoZQoJCXRocmVlIGVtaXRfIHZhcmlhYmxlcyBpcyBzZXQgdG8gbm9uIHplcm8KCXRyYW5zaWVudF9jaGFyYWN0ZXJzCgkJdGhpcyBpcyBmb3Igc29tZSBjcm9zcy1jb21waWxhdGlvbjsgc2VlIHRoZSByZWxldmFudAoJCXBhcnQgaW4gdGhpcyBSRUFETUUgZmlsZSBmb3IgZGV0YWlscwoKNi4gY2FsbCBzZXRfaW5pdF9maWxlbmFtZSgpIHdpdGggdGhlIGluaXRpYWwgZmlsZW5hbWUgYXMgYXJndW1lbnQ7CiAgIHRoZSBzZWNvbmQgYXJndW1lbnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZpbGVuYW1lIGlzIHJlYWwgb3IKICAgY29udmVudGlvbmFsICgicmVhbCIgbWVhbnMgImFuIGZvcGVuKCkgb24gaXQgd2lsbCB3b3JrIikuCgo3LiBpbml0aWFsaXplIHlvdXIgc3RydWN0IGxleGVyX3N0YXRlOgoJY2FsbCBpbml0X2xleGVyX3N0YXRlKCkKCWNhbGwgaW5pdF9sZXhlcl9tb2RlKCkgaWYgdGhlIHByZXByb2Nlc3NvciBpcyBzdXBwb3NlZCB0bwoJICAgb3V0cHV0IGEgbGlzdCBvZiB0b2tlbnMsIG90aGVyd2lzZSBzZXQgdGhlIGZsYWdzIGZpZWxkCgkgICB0byBERUZBVUxUX0NQUF9GTEFHUyBhbmQgc2V0IHRoZSBvdXRwdXQgZmllbGQgdG8gdGhlCgkgICBGSUxFICogd2hlcmUgb3V0cHV0IHNob3VsZCBiZSBzZW50CgkoaW5pdF9sZXhlcl9tb2RlKCksIGlmIGNhbGxlZCBhdCBhbGwsIG11c3QgYmUgY2FsbGVkIGFmdGVyCgkgaW5pdF9sZXhlcl9zdGF0ZSgpKQoJYWRqdXN0IHRoZSBmbGFncyBmaWVsZDsgaGVyZSBpcyB0aGUgbWVhbmluZyBvZiBmbGFnczoKCldBUk5fU1RBTkRBUkQKCWVtaXQgdGhlIHN0YW5kYXJkIHdhcm5pbmdzCldBUk5fQU5OT1lJTkcKCWVtaXQgdGhlIHVzZWxlc3MgYW5kIGFubm95aW5nIHdhcm5pbmdzCldBUk5fVFJJR1JBUEhTCgljb3VudCB0cmlncmFwaHMgZW5jb3VudGVyZWQ7IGl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gZW1pdAoJYSB3YXJuaW5nIGlmIHNvbWUgdHJpZ3JhcGhzIHdlcmUgaW5kZWVkIGVuY291bnRlcmVkOyB0aGUgY291bnQKCWlzIHN0b3JlZCBpbiB0aGUgY291bnRfdHJpZ3JhcGhzIGZpZWxkIG9mIHRoZSBzdHJ1Y3QgbGV4ZXJfc3RhdGUKV0FSTl9UUklHUkFQSFNfTU9SRQoJZW1pdCBhIHdhcm5pbmcgZm9yIGV2ZXJ5IHRyaWdyYXBoIGVuY291bnRlcmVkCldBUk5fUFJBR01BCgllbWl0IGEgd2FybmluZyBmb3IgZWFjaCBub24tdm9pZCBfUHJhZ21hIGVuY291bnRlcmVkIGluIG5vbi1sZXhlcgoJbW9kZSAoYmVjYXVzZSB0aGVzZSBhcmUgbm90IGR1bXBlZCBpbiB0aGUgb3V0cHV0KSBhbmQgZm9yIGVhY2gKCSNwcmFnbWEgdG9vLCBpZiB1Y3BwIHdhcyBjb21waWxlZCB3aXRob3V0IFBSQUdNQV9EVU1QCkZBSUxfU0hBUlAKCWVtaXQgZXJyb3JzIG9uICcjJyB0b2tlbnMgYmVnaW5uaW5nIGEgbGluZSBhbmQgbm90IGZvbGxvd2VkCglieSBhIHZhbGlkIGNwcCBkaXJlY3RpdmUKQ0NIQVJTRVQKCWVtaXQgZXJyb3JzIHdoZW4gbm9uLUMgY2hhcmFjdGVycyBhcmUgZW5jb3VudGVyZWQ7IGlmIHRoaXMgZmxhZwoJaXMgbm90IHNldCwgZWFjaCBub24tQyBjaGFyYWN0ZXIgd2lsbCBiZSBjb25zaWRlcmVkIGFzIGEgQlVOQ0gKCXRva2VuIChzaW5jZSBDOTkgc3RhdGVzIHRoYXQgbm9uLUMgY2hhcmFjdGVycyBhcmUgYWxsb3dlZCBhcwoJbG9uZyBhcyB0aGV5ICJkaXNhcHBlYXIiIGR1cmluZyBwcmVwcm9jZXNzaW5nIFt0aHJvdWdoIG1hY3JvCglyZXBsYWNlbWVudCBhbmQgc3RyaW5naWZpY2F0aW9uIGZvciBpbnN0YW5jZV0sIHRoaXMgZmxhZyBtdXN0Cglub3QgYmUgc2V0LCBmb3IgbWF4aW11bSBDOTkgY29tcGxpYW5jZSkKRElTQ0FSRF9DT01NRU5UUwoJZG8gbm90IGtlZXAgY29tbWVudHMgaW4gb3V0cHV0IChpcnJlbGV2YW50IGluIGxleGVyIG1vZGUpCkNQTFVTUExVU19DT01NRU5UUwoJdW5kZXJzdGFuZCBuZXcgc3R5bGUgY29tbWVudHMgKC8vKSAobWFuZGF0b3J5IGZvciBDOTkpCkxJTkVfTlVNCgllbWl0ICNsaW5lIGRpcmVjdGl2ZXMgd2hlbiBlbnRlcmluZyBhIGZpbGUsIGlmIG5vdCBpbiBsZXhlciBtb2RlOwoJZW1pdCBDT05URVhUIHRva2VuIGluIGxleGVyIG1vZGUgZm9yICNsaW5lIGFuZCBuZXcgZmlsZXMKR0NDX0xJTkVfTlVNCglpZiBMSU5FX05VTSBpcyBzZXQsIGVtaXQgZ2NjLWxpa2UgZGlyZWN0aXZlcyBpbnN0ZWFkIG9mICNsaW5lCkhBTkRMRV9BU1NFUlRJT05TCgl1bmRlcnN0YW5kIGFzc2VydGlvbnMgaW4gI2lmIGV4cHJlc3Npb25zIChhbmQgI2Fzc2VydCwgI3VuYXNzZXJ0KQpIQU5ETEVfUFJBR01BCgltYWtlIFBSQUdNQSB0b2tlbnMgZm9yICNwcmFnbWE7IGlycmVsZXZhbnQgaW4gbm9uLWxleGVyIG1vZGUKCShoYW5kbGluZyBvZiBzb21lIHByYWdtYXMgaXMgcmVxdWlyZWQgaW4gQzk5IGJ1dCBpcyBub3Qgb2YKCXRoZSBjb21wZXRlbmNlIG9mIHRoZSBwcmVwcm9jZXNzb3I7IHdpdGhvdXQgdGhpcyBmbGFnLCB1Y3BwIHdpbGwKCWlnbm9yZSB0aGUgY29udGVudHMgb2YgI3ByYWdtYSBhbmQgX1ByYWdtYSBkaXJlY3RpdmVzKQpNQUNST19WQUFSRwoJdW5kZXJzdGFuZCBtYWNyb3Mgd2l0aCBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMgKG1hbmRhdG9yeQoJZm9yIEM5OSkKVVRGOF9TT1VSQ0UKCXVuZGVyc3RhbmQgVVRGLTggZW5jb2Rpbmc6IG11bHRpYnl0ZSBjaGFyYWN0ZXJzIGFyZSBjb25zaWRlcmVkCgllcXVpdmFsZW50IHRvIGxldHRlcnMgYXMgZmFyIGFzIHN5bnRheCBpcyBjb25jZXJuZWQgKHRoZXkgY2FuCgliZSB1c2VkIGluIGlkZW50aWZpZXJzKQpMRVhFUgoJYWN0IGFzIGEgbGV4ZXIsIG91dHB1dHRpbmcgdG9rZW5zClRFWFRfT1VUUFVUCgl0aGlzIGZsYWcgc2hvdWxkIGJlIHNldCB0byAwIGlmIHVjcHAgd29ya3MgYXMgYSBsZXhlciwgMSBvdGhlcndpc2UuCglJdCBpcyBzb21laG93IHJlZHVuZGFudCB3aXRoIHRoZSBMRVhFUiBmbGFnLCBidXQgdGhlIHByZXNlbmNlIG9mCgl0aG9zZSB0d28gZGlmZmVyZW50IGZsYWdzIGlzIG5lZWRlZCBpbiB1Y3BwLgpLRUVQX09VVFBVVAoJaW4gbm9uLWxleGVyIG1vZGUsIGVtaXQgdGhlIHJlc3VsdCBvZiBwcmVwcm9jZXNzaW5nCkNPUFlfTElORQoJbWFpbnRhaW4gYSBjb3B5IG9mIHRoZSBsYXN0IHJlYWQgbGluZSBpbiB0aGUgY29weV9saW5lIGZpZWxkIG9mCgl0aGUgc3RydWN0IGxleGVyX3N0YXRlIDsgc2VlIGJlbG93IGZvciBob3cgdG8gdXNlIHRoaXMgYnVmZmVyCkhBTkRMRV9UUklHUkFQSFMKCXVuZGVyc3RhbmQgdHJpZ3JhcGhzLCBzdWNoIGFzID8/LyBmb3IgXC4gVGhpcyBvcHRpb24gc2hvdWxkIGJlCglzZXQgYnkgZGVmYXVsdCwgZXhjZXB0IGZvciBzb21lIGxlZ2FjeSBjb2RlLgoKCVRoZXJlIGFyZSBvdGhlciBmbGFncywgYnV0IHRoZXkgYXJlIGZvciBwcml2YXRlIHVzYWdlIG9mIHVjcHAuCgo4LiBhZGp1c3QgdGhlIGlucHV0IGZpZWxkIGluIHRoZSBsZXhlcl9zdGF0ZSB0byB0aGUgRklMRSAqIGZyb20gd2hlcmUKICAgc291cmNlIGZpbGUgaXMgcmVhZC4gSWYgeW91IHVzZSB0aGUgVUNQUF9NTUFQIGNvbXBpbGUtdGltZSBvcHRpb24sCiAgIGFuZCB5b3VyIGlucHV0IGZpbGUgaXMgZWxpZ2libGUgdG8gbW1hcCgpLCB0aGVuIHlvdSBjYW4gY2FsbAogICBmb3Blbl9tbWFwX2ZpbGUoKSB0byBvcGVuIGl0LCB0aGVuIHNldF9pbnB1dF9maWxlKCkgdG8gc2V0IGxzLT5pbnB1dAogICBhbmQgc29tZSBvdGhlciBpbnRlcm5hbCBvcHRpb25zLiBEbyBub3QgY2FsbCBzZXRfaW5wdXRfZmlsZSgpIHVubGVzcwogICB5b3UganVzdCBjYWxsZWQgZm9wZW5fbW1hcF9maWxlKCkganVzdCBiZWZvcmUgb24gdGhlIHNhbWUgZmlsZS4KCjkuIGNhbGwgYWRkX2luY3BhdGgoKSB0byBhZGQgYW4gaW5jbHVkZSBwYXRoLCBkZWZpbmVfbWFjcm8oKSBhbmQKICAgdW5kZWZfbWFjcm8oKSB0byBhZGQgb3IgcmVtb3ZlIG1hY3JvcywgbWFrZV9hc3NlcnRpb24oKSBhbmQKICAgZGVzdHJveV9hc3NlcnRpb24oKSB0byBhZGQgb3IgcmVtb3ZlIGFzc2VydGlvbnMuCgoxMC4gY2FsbCBlbnRlcl9maWxlKCkgKHRoaXMgaXMgbmVlZGVkIG9ubHkgaW4gbm9uLWxleGVyIG1vZGUsIG9yIGlmCiAgICBMSU5FX05VTSBpcyBzZXQpLgoKCkFmdGVyd2FyZHM6Ci0tIGlmIHlvdSBhcmUgaW4gbGV4ZXIgbW9kZSwgY2FsbCBsZXgoKTsgZWFjaCBjYWxsIHdpbGwgbWFrZSB0aGUgY3RvawogICBmaWVsZCBwb2ludCB0byB0aGUgbmV4dCB0b2tlbi4gQSBub24temVybyByZXR1cm4gdmFsdWUgaXMgYW4gZXJyb3IuCiAgIGxleCgpIHNraXBzIHdoaXRlc3BhY2UgdG9rZW5zLiBUaGUgbWVtb3J5IHVzZWQgYnkgdGhlIHN0cmluZyB2YWx1ZQogICBvZiBzb21lIHRva2VucyAoaWRlbnRpZmllcnMsIG51bWJlcnMuLi4pIGlzIGF1dG9tYXRpY2FsbHkgZnJlZWQsCiAgIHNvIGNvcHkgdGhlIGNvbnRlbnRzIG9mIGVhY2ggc3VjaCB0b2tlbiBpZiB5b3Ugd2FudCB0byBrZWVwIGl0CiAgICh0b2tlbnMgd2l0aCBhIHN0cmluZyBjb250ZW50IGFyZSBpZGVudGlmaWVkIGJ5IHRoZSBTVFJJTkdfVE9LRU4KICAgbWFjcm8gYXBwbGllZCB0byB0aGVpciB0eXBlKS4KICAgV2hlbiBsZXgoKSByZXR1cm5lZCBhIG5vbi16ZXJvIHZhbHVlOiBpZiBpdCBpcyBDUFBFUlJfRU9GLCB0aGVuCiAgIGVuZC1vZi1pbnB1dCB3YXMgcmVhY2hlZC4gT3RoZXJ3aXNlLCBpdCBpcyBhIGdlbnVpbmUgZXJyb3IgYW5kCiAgIGxzLT5jdG9rIGlzIGFuIHVuZGVmaW5lZCB0b2tlbjsgc2tpcCBpdCBhbmQgY2FsbCBsZXgoKSBhZ2FpbiB0bwogICBpZ25vcmUgdGhlIGVycm9yLgoKLS0gb3RoZXJ3aXNlLCBjYWxsIGNwcCgpOyBlYWNoIGNhbGwgd2lsbCBhbmFseXplIG9uZSBvciBtb3JlIHRva2VucwogICAob25lIHRva2VuIGlmIGl0IGRpZCBub3QgZm91bmQgYSBjcHAgZGlyZWN0aXZlLCBvciBhIG1hY3JvIG5hbWUpLgogICBBIHBvc2l0aXZlIHJldHVybiB2YWx1ZSBpcyBhbiBlcnJvci4KCkZvciBib3RoIGZ1bmN0aW9ucywgaWYgdGhlIHJldHVybiB2YWx1ZSBpcyBDUFBFUlJfRU9GICh3aGljaCBpcyBhCnN0cmljdGx5IHBvc2l0aXZlIHZhbHVlKSwgdGhlbiBpdCBtZWFucyB0aGF0IHRoZSBlbmQgb2YgZmlsZSB3YXMKcmVhY2hlZC4gQ2FsbCBjaGVja19jcHBfZXJyb3JzKCkgYWZ0ZXIgZW5kIG9mIGZpbGUgZm9yIHBlbmRpbmcgZXJyb3JzCih1bmZpbmlzaGVkICNpZiBjb25zdHJ1Y3Rpb25zIGZvciBpbnN0YW5jZSkuIEluIG5vbi1sZXhlciBtb2RlLApjYWxsIGZsdXNoX291dHB1dCgpLgoKSW4gdGhlIHN0cnVjdCBsZXhlcl9zdGF0ZSwgdGhlIGZvbGxvd2luZyBmaWVsZHMgbWlnaHQgYmUgcmVhZDoKCWxpbmUJCSAgIHRoZSBjdXJyZW50IGlucHV0IGxpbmUgbnVtYmVyCglvbGluZQkJICAgdGhlIGN1cnJlbnQgb3V0cHV0IGxpbmUgbnVtYmVyIChpbiBub24tbGV4ZXIgbW9kZSkKCWZsYWdzCQkgICB0aGUgZmxhZ3MgZGVzY3JpYmVkIGFib3ZlCgljb3VudF90cmlncmFwaHMJICAgdGhlIG51bWJlciBvZiB0cmlncmFwaHMgZW5jb3VudGVyZWQKCWlubWFjcm8JCSAgIHRoZSBjdXJyZW50IHRva2VuIGNvbWVzIGZyb20gYSBtYWNybwoJbWFjcm9fY291bnQJICAgdGhlIGN1cnJlbnQgbWFjcm8gY291bnRlcgoiZmxhZ3MiIGlzIGFuIHVuc2lnbmVkIGxvbmcgYW5kIG1pZ2h0IGJlIG1vZGlmaWVkOyB0aGUgdGhyZWUgb3RoZXJzCmFyZSBvZiBsb25nIHR5cGUuCgoKVG8gcGVyZm9ybSBhbm90aGVyIHByZXByb2Nlc3Npbmc6IHVzZSBmcmVlX2xleGVyX3N0YXRlKCkgdG8gcmVsZWFzZQptZW1vcnkgdXNlZCBieSB0aGUgYnVmZmVycyByZWZlcmVuY2VkIGluIGxleGVyX3N0YXRlLCBhbmQgZ28gYmFjayB0bwpzdGVwIDIuIFRoZSBkaWZmZXJlbnQgdGFibGVzIChtYWNyb3MsIGFzc2VydGlvbnMuLi4pIHNob3VsZCBiZSByZXNldCB0bwp0aGVpciByZXNwZWN0aXZlIGluaXRpYWwgY29udGVudHMuIChXYXJuaW5nOiB0aGlzIGlzIGN1cnJlbnRseSB1bnRlc3RlZCkKCgpUaGUgQ09QWV9MSU5FIGJ1ZmZlcjogdGhlIHN0cnVjdCBsZXhlcl9zdGF0ZSBjb250YWlucyB0d28gaW50ZXJlc3RpbmcKZmllbGRzLCBjb3B5X2xpbmVbXSBhbmQgY2xpLiBJZiB0aGUgQ09QWV9MSU5FIGZsYWcgaXMgb24sIGVhY2ggcmVhZApsaW5lIGlzIHN0b3JlZCBpbiB0aGlzIGJ1ZmZlciwgdXAgdG8gKGF0IG1vc3QpIENPUFlfTElORV9MRU5HVEggLSAxCmNoYXJhY3RlcnMgKENPUFlfTElORV9MRU5HVEggaXMgZGVmaW5lZCBpbiB0dW5lLmgpLiBUaGUgbGFzdCBjaGFyYWN0ZXIKb2YgdGhlIGJ1ZmZlciBpcyBhbHdheXMgYSB6ZXJvLCBhbmQgaWYgdGhlIGxpbmUgd2FzIHJlYWQgZW50aXJlbHksIGl0IGlzCnplcm8gdGVybWluYXRlZDsgdGhlIHRyYWlsaW5nIG5ld2xpbmUgaXMgbm90IGluY2x1ZGVkLgoKVGhlIHB1cnBvc2Ugb2YgdGhpcyBidWZmZXIgaXMgZXJyb3ItcmVwb3J0aW5nLiBXaGVuIGFuIGVycm9yIG9jY3VycwooY3BwKCkgcmV0dXJucyBhIHN0cmljdGx5IHBvc2l0aXZlIHZhbHVlLCBvciBsZXgoKSByZXR1cm5zIGEgbm9uLXplcm8KdmFsdWUpLCBpZiB5b3VyIHN0cnVjdCBsZXhlcl9zdGF0ZSBpcyBjYWxsZWQgbHMsIHVzZSB0aGlzIGNvZGU6CgoJaWYgKGxzLmNsaSAhPSAwKSBscy5jb3B5X2xpbmVbbHMuY2xpXSA9IDA7CgpUaGlzIHdpbGwgYWRkIGEgdHJhaWxpbmcgMCBpZiB0aGUgbGluZSB3YXMgbm90IHJlYWQgZW50aXJlbHkuCgoKCkNPTVBBVElCSUxJVFkgTk9URVMKLS0tLS0tLS0tLS0tLS0tLS0tLQoKVGhlIEMgbGFuZ3VhZ2UgaGFzIGEgbGVuZ3RoZW5pbmcgaGlzdG9yeS4gTm93YWRheXMsIEMgY29tZXMgaW4gdGhyZWUKZmxhdm91cnM6CgotLSBUcmFkaXRpb25hbCBDLCBha2EgIksmUiIuIFRoaXMgaXMgdGhlIGxhbmd1YWdlIGZpcnN0IGRlc2NyaWJlZCBieQpCcmlhbiBLZXJuaWdoYW4gYW5kIERlbm5pcyBSaXRjaGllLCBhbmQgaW1wbGVtZW50ZWQgaW4gdGhlIGZpcnN0IEMKY29tcGlsZXIgdGhhdCB3YXMgZXZlciBjb2RlZC4gVGhlcmUgYXJlIGFjdHVhbGx5IHNldmVyYWwgZGlhbGVjdHMgb2YKSyZSLCBhbmQgYWxsIG9mIHRoZW0gYXJlIGNvbnNpZGVyZWQgYXMgZGVwcmVjYXRlZC4KCi0tIElTTyA5ODk5OjE5OTAsIGFrYSBDOTAsIGFrYSBDODksIGFrYSBBTlNJLUMuIEZvcm1hbGl6ZWQgYnkgQU5TSQppbiAxOTg5IGFuZCBhZG9wdGVkIGJ5IElTTyB0aGUgbmV4dCB5ZWFyLCBpdCBpcyB0aGUgQyBmbGF2b3VyIG1hbnkgQwpjb21waWxlcnMgdW5kZXJzdGFuZC4gSXQgaXMgbW9zdGx5IGJhY2t3YXJkIGNvbXBhdGlibGUgd2l0aCBLJlIgQywgYnV0CndpdGggZW5oYW5jZW1lbnRzLCBjbGFyaWZpY2F0aW9ucyBhbmQgc2V2ZXJhbCBuZXcgZmVhdHVyZXMuCgotLSBJU08gOTg5OToxOTk5LCBha2EgQzk5LiBUaGlzIGlzIGFuIGV2b2x1dGlvbiBvbiBDOTAsIGFsbW9zdCBmdWxseQpiYWNrd2FyZCBjb21wYXRpYmxlIHdpdGggQzkwIChleGhpYml0dGluZyBhIGNvZGUgdGhhdCBtYWtlcyBhIGRpZmZlcmVuY2UKaXMgYSB0cmlja3kgZXhlcmNpc2UpLiBDOTkgaW50cm9kdWNlcyBtYW55IG5ldyBhbmQgdXNlZnVsIGZlYXR1cmVzLApob3dldmVyLCBpbmNsdWRpbmcgaW4gdGhlIHByZXByb2Nlc3Nvci4KClRoZXJlIHdhcyBhbHNvIGEgbm9ybWF0aXZlIGFkZGVuZHVtIGluIDE5OTUsIHRoYXQgYWRkZWQgYSBmZXcgZmVhdHVyZXMKdG8gQzkwIChmb3IgaW5zdGFuY2UsIGRpZ3JhcGhzKSB0aGF0IGFyZSBhbHNvIHByZXNlbnQgaW4gQzk5LgoKClVjcHAgaW1wbGVtZW50cyB0aGUgQzk5IHN0YW5kYXJkLCBidXQgY2FuIGJlIHVzZWQgaW4gYSBzdHJpY3RlciBtb2RlLAp0byBlbmZvcmNlIEM5MCBjb21wYXRpYmlsaXR5IChpdCB3aWxsLCBob3dldmVyLCBzdGlsbCByZWNvZ25pemUgc29tZQpjb25zdHJ1Y3Rpb25zIHRoYXQgYXJlIG5vdCBpbiBwbGFpbiBDOTApLgoKVWNwcCBhbHNvIGtub3dzIHNldmVyYWwgZXh0ZW5zaW9ucyB0byBDOTk6CgotLSBBc3NlcnRpb25zOiB0aGlzIGlzIGFuIGV4dGVuc2lvbiB0byB0aGUgZGVmaW5lZCgpIG9wZXJhdG9yLCB3aXRoCiAgIGl0cyBvd24gbmFtZXNwYWNlLiBBc3NlcnRpb25zIHNlZW0gdG8gYmUgdXNlZCBpbiBzZXZlcmFsIHBsYWNlcywKICAgdGhlcmVmb3JlIHVjcHAga25vd3MgYWJvdXQgdGhlbS4gSXQgaXMgcmVjb21tZW5kZWQgdG8gZW5hYmxlCiAgIGFzc2VydGlvbnMgYnkgZGVmYXVsdCBvbiBTb2xhcmlzIHN5c3RlbXMuCi0tIFVuaWNvZGU6IHRoZSBDOTkgbm9ybSBzcGVjaWZpZXMgdGhhdCBleHRlbmRlZCBjaGFyYWN0ZXJzLCBmcm9tCiAgIHRoZSBJU08tMTA2NDYgY2hhcnNldCAoYWthICJ1bmljb2RlIikgY2FuIGJlIHVzZWQgaW4gaWRlbnRpZmllcnMKICAgd2l0aCB0aGUgbm90YXRpb25zIFx1IGFuZCBcVS4gdWNwcCBhbHNvIGFjY2VwdHMgKHdpdGggdGhlIHByb3BlcgogICBmbGFnKSB0aGUgVVRGLTggZW5jb2RpbmcgaW4gdGhlIHNvdXJjZSBmaWxlIGZvciBzdWNoIGNoYXJhY3RlcnMuCi0tICNpbmNsdWRlX25leHQgZGlyZWN0aXZlOiBpdCB3b3JrcyBhcyBhICNpbmNsdWRlLCBidXQgd2lsbCBsb29rCiAgIGZvciBmaWxlcyBvbmx5IGluIHRoZSBkaXJlY3RvcmllcyBzcGVjaWZpZWQgaW4gdGhlIGluY2x1ZGUgcGF0aAogICBhZnRlciB0aGUgb25lIHRoZSBjdXJyZW50IGZpbGUgd2FzIGZvdW5kLiBUaGlzIGlzIGEgR05VLWlzbSB0aGF0CiAgIGlzIHVzZWZ1bCBmb3Igd3JpdGluZyB0cmFuc3BhcmVudCB3cmFwcGVycyBhcm91bmQgaGVhZGVyIGZpbGVzLgoKQXNzZXJ0aW9ucyBhbmQgdW5pY29kZSBhcmUgYWN0aXZhdGVkIGJ5IHNwZWNpZmljIGZsYWdzOyB0aGUgI2luY2x1ZGVfbmV4dApzdXBwb3J0IGlzIGFsd2F5cyBhY3RpdmUuCgpUaGUgdWNwcCBjb2RlIGl0c2VsZiBzaG91bGQgYmUgY29tcGF0aWJsZSB3aXRoIGFueSBJU08tQzkwIGNvbXBpbGVyLgpUaGUgY3BwLmMgZmlsZSBpcyByYXRoZXIgYmlnICh+IDUza0IpLCBpdCBtaWdodCBjb25mdXNlIG9sZCAxNi1iaXQgQwpjb21waWxlcnM7IHRoZSBtYWNyby5jIGZpbGUgaXMgc29tZXdoYXQgbGFyZ2UgYWxzbyAofiA0M2tCKS4KClRoZSBldmFsdWF0aW9uIG9mICNpZiBleHByZXNzaW9ucyBpcyBzdWJqZWN0IHRvIHNvbWUgc3VidGxldGllcywgc2VlIHRoZQpzZWN0aW9uICJjcm9zcy1jb21waWxhdGlvbiIuCgpUaGUgbGV4ZXIgY29kZSBtYWtlcyBubyBhc3N1bXB0aW9uIGFib3V0IHRoZSBzb3VyY2UgY2hhcmFjdGVyIHNldCwgYnV0CnRoZSBmb2xsb3dpbmc6IHNvdXJjZSBjaGFyYWN0ZXJzICh0aG9zZSB3aGljaCBoYXZlIGEgc3ludGFjdGljIHZhbHVlIGluCkM7IGNvbW1lbnQgYW5kIHN0cmluZyBsaXRlcmFsIGNvbnRlbnRzIGFyZSBub3QgY29uY2VybmVkKSBtdXN0IGhhdmUgYQpzdHJpY3RseSBwb3NpdGl2ZSB2YWx1ZSB0aGF0IGlzIHN0cmljdGx5IGxvd2VyIHRoYW4gTUFYX0NIQVJfVkFMLiBUaGUKc3RyaWN0IHBvc2l0aXZpdHkgaXMgYWxyZWFkeSBhc3N1cmVkIGJ5IHRoZSBDIHN0YW5kYXJkLCBzbyB5b3UganVzdCBuZWVkCnRvIGFkanVzdCBNQVhfQ0hBUl9WQUwuCgpVY3BwIGhhcyBiZWVuIHRlc3RlZCBzdWNjZXNmdWxseSBvbiBBU0NJSS9JU08tODg1OS0xIGFuZCBFQkNESUMgc3lzdGVtcy4KQmV3YXJlIHRoYXQgVVRGLTggaXMgTk9UIGNvbXBhdGlibGUgd2l0aCBFQkNESUMuCgpQcmFnbWEgaGFuZGxpbmc6IHdoZW4gdXNlZCBpbiBub24tbGV4ZXIgbW9kZSwgdWNwcCB0cmllcyB0byBvdXRwdXQKYSBzb3VyY2UgdGV4dCB0aGF0LCByZWFkIGFnYWluLCB3aWxsIGdpdmUgdGhlIGV4YWN0IHNhbWUgc3RyZWFtIG9mCnRva2Vucy4gVGhpcyBpcyBub3QgY29tcGxldGVseSB0cnVlIHdpdGggcmVnYXJkcyB0byBsaW5lIG51bWJlcmluZyBpbgpzb21lIHRyaWNreSBtYWNybyByZXBsYWNlbWVudHMsIGJ1dCBpdCBzaG91bGQgd29yayBjb3JyZWN0bHkgb3RoZXJ3aXNlLAplc3BlY2lhbGx5IHdpdGggcHJhZ21hIGRpcmVjdGl2ZXMgaWYgdGhlIGNvbXBpbGUtdGltZSBvcHRpb24gUFJBR01BX0RVTVAKd2FzIHNldDogI3ByYWdtYSBhcmUgZHVtcGVkLCBub24tdm9pZCBfUHJhZ21hKCkgYXJlIGNvbnZlcnRlZCB0byB0aGUKY29ycmVzcG9uZGluZyAjcHJhZ21hIGFuZCBkdW1wZWQgYWxzby4KClVjcHAgZG9lcyBub3QgbWFjcm8tcmVwbGFjZSB0aGUgY29udGVudHMgb2YgI3ByYWdtYSBhbmQgX1ByYWdtYSgpOwpJZiB5b3Ugd2FudCBhIG1hY3JvLXJlcGxhY2VkIHByYWdtYSwgdXNlIHRoaXM6CgojZGVmaW5lIHByYWdtYV8oeCkJX1ByYWdtYSgjeCkKI2RlZmluZSBwcmFnbWEoeCkJcHJhZ21hXyh4KQoKQW55d2F5LCBwcmFnbWFzIGRvIG5vdCBuZXN0IChhbiBfUHJhZ21hKCkgY2Fubm90IGJlIGV2YWx1YXRlZCBpZiBpdCBpcwppbnNpZGUgYSAjcHJhZ21hIG9yIGFub3RoZXIgX1ByYWdtYSkuCgoKSSB3cm90ZSB1Y3BwIGFjY29yZGluZyB0byB3aGF0IGlzIGZvdW5kIGluICJUaGUgTGFuZ3VhZ2UgQyIgZnJvbSBCcmlhbgpLZXJuaWdoYW4gYW5kIERlbm5pcyBSaXRjaGllICgybmQgZWRpdGlvbikgYW5kIHRoZSBDOTkgc3RhbmRhcmQ7IGJ1dCBJCmNvdWxkIGhhdmUgbWlzaW50ZXJwcmV0ZWQgc29tZSBwb2ludHMuIE9uIHNvbWUgdHJpY2t5IHBvaW50cyBJIGdvdCBoZWxwCmZyb20gdGhlIGhlbHBmdWwgcGVvcGxlIGZyb20gdGhlIGNvbXAuc3RkLmMgbmV3c2dyb3VwLiBGb3IgYXNzZXJ0aW9ucwphbmQgI2luY2x1ZGVfbmV4dCwgSSBtaW1pY2tlZCB0aGUgYmVoYXZpb3VyIG9mIEdOVSBjcHAsIGFzIGlzIHN0YXRlZAppbiB0aGUgR05VIGNwcCBpbmZvIGRvY3VtZW50YXRpb24uIEFuIG9wZW4gcXVlc3Rpb24gaXMgcmVsYXRlZCB0byB0aGUKZm9sbG93aW5nIGNvZGU6CgojZGVmaW5lIHVuZGVmaW5lZAkhCiNkZWZpbmUgbWFrZXVuKHgpCXVuICMjIHgKI2lmIG1ha2V1bihkZWZpbmVkIGZvbykKcXV4CiNlbHNlCmJhcgojZW5kaWYKClVjcHAgd2lsbCByZXBsYWNlICdkZWZpbmVkIGZvbycgd2l0aCAwIGZpcnN0IChzaW5jZSBmb28gaXMgbm90IGRlZmluZWQpLAp0aGVuIGl0IHdpbGwgcmVwbGFjZSB0aGUgbWFjcm8gbWFrZXVuLCBhbmQgdGhlIGV4cHJlc3Npb24gd2lsbCBiZWNvbWUKJ3VuMCcsIHdoaWNoIGlzIHJlcGxhY2VkIGJ5IDAgc2luY2UgdGhpcyBpcyBhIHJlbWFpbmluZyBpZGVudGlmaWVyLiBUaGUKZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gZmFsc2UsIGFuZCAnYmFyJyBpcyBlbWl0dGVkLgpIb3dldmVyLCBzb21lIG90aGVyIHByZXByb2Nlc3NvcnMgd2lsbCByZXBsYWNlIG1ha2V1biBmaXJzdCwgY29uc2lkZXJpbmcKdGhhdCBpdCBpcyBub3QgcGFydCBvZiBhICdkZWZpbmVkJyBvcGVyYXRvciBhcHBsaWNhdGlvbjsgdGhpcyB3aWxsCnByb2R1Y2UgdGhlIG1hY3JvICd1bmRlZmluZWQnLCB3aGljaCBpcyByZXBsYWNlZCwgYW5kIHRoZSBleHByZXNzaW9uCmJlY29tZXMgJyFmb28nLiAnZm9vJyBpcyByZXBsYWNlZCBieSAwLCB0aGUgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8KdHJ1ZSwgYW5kICdxdXgnIGlzIGVtaXR0ZWQuCgpNeSBvcGluaW9uIGlzIHRoYXQgdGhlIGJlaGF2aW91ciBpcyB1bmRlZmluZWQsIGJlY2F1c2UgdXNlIG9mIHRoZQonZGVmaW5lZCcgb3BlcmF0b3IgZG9lcyBub3QgbWF0Y2ggYW4gYWxsb3dlZCBmb3JtIHByaW9yIHRvIG1hY3JvCnJlcGxhY2VtZW50IChJIG1lYW4sIGl0cyBzeW50YXggbWF0Y2hlcywgYnV0IGl0cyB1c2UgaXMgcmVjb252ZXJ0ZWQKdG8gaW5leGlzdGFudCBhbmQgdGhlcmVmb3JlIGlzIG5vdCBhbnltb3JlIG1hdGNoaW5nKS4gT3RoZXIgcGVvcGxlCnRoaW5rIHRoYXQgdGhlIGJlaGF2aW91ciBpcyB3ZWxsLXNwZWNpZmllZCwgYW5kIGNvbnRyYXJ5IHRvIHdoYXQgdWNwcApkb2VzLiBUaGUgb25seSB0aGluZyBjbGVhciB0byBtZSBpcyB0aGF0IHRoZSB3b3JkaW5nIG9mIHRoZSBzdGFuZGFyZAoocGFyYWdyYXBoIDYuMTAuMS4zKSBpcyB1bmNsZWFyLgoKU2luY2UgdGhlIHVjcHAgYmVoYXZpb3VyIG1ha2VzIHVjcHAgY29kZSBzaW1wbGVyIGFuZCBjbGVhbmVyLCBhbmQKdGhhdCBpdCBpcyB1bmxpa2VseSB0aGF0IGFueSByZWFsLWxpZmUgY29kZSB3b3VsZCBldmVyIGJlIGRpc3R1cmJlZApieSB0aGF0IGludGVycHJldGF0aW9uIG9mIHRoZSBzdGFuZGFyZCwgdWNwcCB3aWxsIGtlZXAgaXRzIGN1cnJlbnQKYmVoYXZpb3VyIHVudGlsIGNvbnZpbmNpbmcgZXZpZGVuY2Ugb2YgbXkgbWlzaW50ZXJwcmV0YXRpb24gb2YgdGhlCnN0YW5kYXJkIGlzIGdpdmVuIHRvIG1lLiBUaGUgcHJvYmxlbSBjYW4gb25seSBvY2N1ciBpcyBvbmUgdXNlcyAjIyB0bwptYWtlIGEgJ2RlZmluZWQnIG9wZXJhdG9yIGRpc2FwcGVhciBmcm9tIGEgI2lmIGV4cHJlc3Npb24gKGV2ZXJ5Ym9keQphZ3JlZXMgdGhhdCB0aGUgZ2VuZXJhdGlvbiBvZiBhICdkZWZpbmVkJyBvcGVyYXRvciB0cmlnZ2VycyB1bmRlZmluZWQKYmVoYXZpb3VyKS4KCgpBYm91dCBfUHJhZ21hOiB0aGUgc3RhbmRhcmQgaXMgbm90IGNsZWFyIGFib3V0IHdoZW4gdGhpcyBvcGVyYXRvciBpcwpldmFsdWF0ZWQsIGFuZCBpZiBpdCBpcyBhbGxvd2VkIGluc2lkZSAjaWYgZGlyZWN0aXZlcyBhbmQgc3VjaC4gRm9yCnVjcHAsIEkgY29kZWQgX1ByYWdtYSBhcyBhIHNwZWNpYWwgbWFjcm8gd2l0aCBsYXp5IHJlcGxhY2VtZW50OiBpdCB3aWxsCmJlIGV2YWx1YXRlZCB3aGVyZXZlciBhIG1hY3JvIGNvdWxkIGJlIHJlcGxhY2VkLCBhbmQgb25seSBhdCB0aGUgZW5kIG9mCnRoZSBtYWNybyByZXBsYWNlbWVudCAoZm9yIHByYWN0aWNhbCBwdXJwb3NlcywgX1ByYWdtYSBjYW4gYmUgY29uc2lkZXJlZAphcyBhIG1hY3JvIHRha2luZyBvbmUgYXJndW1lbnQsIGFuZCBiZWluZyByZXBsYWNlZCBieSBub3RoaW5nLCBleGNlcHQKZm9yIHNvbWUgdHJpY2t5IHVzZXMgb2YgdGhlICMgYW5kICMjIG9wZXJhdG9ycykuIFRoaXMgbWVhbnMgdGhhdCwgYnkKZGVmYXVsdCwgdWNwcCB3aWxsIGV2YWx1YXRlIF9QcmFnbWEgaW5zaWRlIHNvbWUgZGlyZWN0aXZlcyAobWFpbmx5LCAjaWYsCiNpbmNsdWRlLCAjaW5jbHVkZV9uZXh0IGFuZCAjbGluZSksIGJ1dCBpdCBjYW4gYmUgdGF1Z2h0IG5vdCB0byBkbyBzbyBieQpkZWZpbmluZyBOT19QUkFHTUFfSU5fRElSRUNUSVZFIGluIHR1bmUuaC4KCgoKQ1JPU1MtQ09NUElMQVRJT04KLS0tLS0tLS0tLS0tLS0tLS0KCklmIGNvbXBpbGVkIHdpdGggYSBDOTkgZGV2ZWxvcG1lbnQgc3VpdGUsIHVjcHAgc2hvdWxkIGJlIGZ1bGx5CkM5OS1jb21wbGlhbnQgb24gdGhlIGhvc3QgcGxhdGZvcm0gKHVwIHRvIG15IG93biB1bmRlcnN0YW5kaW5nIG9mIHRoZQpzdGFuZGFyZCAtLSByZW1lbWJlciB0aGF0IHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgYXMtaXMsIHdpdGhvdXQKYW55IGd1YXJhbnRlZSkuIEhvd2V2ZXIsIGlmIGEgcHJlLUM5OSBjb21waWxlciBpcyB1c2VkLCBvciBpZiB0aGUKdGFyZ2V0IG1hY2hpbmUgaXMgbm90IHRoZSBob3N0IG1hY2hpbmUgKGZvciBpbnN0YW5jZSB3aGVuIHlvdSBidWlsZCBhCmNyb3NzLWNvbXBpbGVyKSwgdGhlIGV2YWx1YXRpb24gb2YgI2lmIGV4cHJlc3Npb25zIGlzIHN1YmplY3QgdG8gc29tZQpjcm9zcy1jb21waWxpbmcgaXNzdWVzOgoKCi0tIGNoYXJhY3RlciBjb25zdGFudHM6IHdoZW4gZXZhbHVhdGluZyBleHByZXNzaW9ucywgY2hhcmFjdGVyIGNvbnN0YW50cwphcmUgaW50ZXJwcmV0ZWQgaW4gdGhlIHNvdXJjZSBjaGFyYWN0ZXIgc2V0IGNvbnRleHQ7IHRoaXMgaXMgYWxsb3dlZApieSB0aGUgc3RhbmRhcmQgYnV0IHRoaXMgY2FuIGxlYWQgdG8gcHJvYmxlbXMgd2l0aCBjb2RlIHRoYXQgZXhwZWN0cwp0aGlzIGludGVycHJldGF0aW9uIHRvIG1hdGNoIHRoZSBvbmUgbWFkZSBpbiB0aGUgQyBjb2RlLiBUbyBlYXNlCmNyb3NzLWNvbXBpbGF0aW9uLCB5b3UgY2FuIGRlZmluZSBhIGNvbnZlcnNpb24gYXJyYXksIGFuZCBtYWtlIHRoZQpnbG9iYWwgdmFyaWFibGUgdHJhbnNpZW50X2NoYXJhY3RlcnMgcG9pbnQgdG8gaXQuIFRoZSBhcnJheSBzaG91bGQKY29udGFpbiAyNTYgaW50OyB0cmFuc2llbnRfY2hhcmFjdGVyc1t4XSBpcyB0aGUgdmFsdWUgb2YgdGhlIGNoYXJhY3Rlcgp3aG9zZSB2YWx1ZSBpcyB4IGluIHRoZSBzb3VyY2UgY2hhcmFjdGVyIHNldC4KClRoaXMgZmFjaWxpdHkgaXMgcHJvdmlkZWQgZm9yIGluY2x1c2lvbiBvZiB1Y3BwIGluc2lkZSBhbm90aGVyIGNvZGU7CmlmIHlvdSB3YW50IGEgc3RhbmQtYWxvbmUgdWNwcCB3aXRoIHRoYXQgY29udmVyc2lvbiwgaGFyZC1jb2RlIHRoZQpjb252ZXJzaW9uIHRhYmxlIGludG8gZXZhbC5jIGFuZCBtYWtlIHRyYW5zaWVudF9jaGFyYWN0ZXJzW10gc3RhdGljYWxseQpwb2ludCB0byBpdC4gQWx0ZXJuYXRpdmVseSwgeW91IGNvdWxkIHByb3ZpZGUgYW4gb3B0aW9uIHN5bnRheCB0bwpwcm92aWRlIHN1Y2ggYSB0YWJsZSBvbiBjb21tYW5kLWxpbmUsIGlmIHlvdSBmZWVsIGxpa2UgaXQuCgoKLS0gd2lkZSBjaGFyYWN0ZXIgY29uc3RhbnRzIHNpZ25lZG5lc3M6IGJ5IGRlZmF1bHQsIHVjcHAgbWFrZXMgd2lkZQpjaGFyYWN0ZXJzIGFzIHNpZ25lZCBhcyB3aGF0IHBsYWluIGNoYXJzIGFyZSBvbiB0aGUgYnVpbGQgaG9zdC4gVG8KZm9yY2Ugd2lkZSBjaGFyYWN0ZXIgY29uc3RhbnQgc2lnbmVkbmVzcywgZGVmaW5lIFdDSEFSX1NJR05FRE5FU1MgdG8gMAooZm9yIHVuc2lnbmVkKSBvciAxIChmb3Igc2lnbmVkKS4gQmV3YXJlLCBob3dldmVyLCB0aGF0ICJuYXRpdmUiIHdpZGUKY2hhcmFjdGVyIGNvbnN0YW50cywgZXZlbiBzaWduZWQsIGFyZSBjb25zaWRlcmVkIHBvc2l0aXZlLiBOb24td2lkZQpjaGFyYWN0ZXIgY29uc3RhbnRzIGFyZSwgYWNjb3JkaW5nIHRvIHRoZSBDOTkgc3RhbmRhcmQsIG9mIHR5cGUgaW50LCBhbmQKdGhlcmVmb3JlIGFsd2F5cyBzaWduZWQuCgoKLS0gZXZhbHVhdGlvbiB0eXBlOiBDOTAgc3RhdGVzIHRoYXQgYWxsIGNvbnN0YW50cyBpbiAjaWYgZXhwcmVzc2lvbnMKYXJlIGNvbnNpZGVyZWQgYXMgZWl0aGVyIGxvbmcgb3IgdW5zaWduZWQgbG9uZywgYW5kIHRoYXQgdGhlIGV2YWx1YXRpb24KaXMgcGVyZm9ybWVkIHdpdGggb3BlcmFuZHMgb2YgdGhhdCBzaXplLiBJbiBDOTksIHRoZSBzaXR1YXRpb24gaXMKZXF1aXZhbGVudCwgZXhjZXB0IHRoYXQgdGhlIHR5cGVzIHVzZWQgYXJlIGludG1heF90IGFuZCB1aW50bWF4X3QsIGFzCmRlZmluZWQgaW4gPHN0ZGludC5oPi4KClVjcHAgY2FuIHVzZSB0d28gZXhwcmVzc2lvbiBldmFsdWF0b3JzOiBvbmUgdXNlcyBuYXRpdmUgaW50ZWdlciB0eXBlcwoob25lIHNpZ25lZCBhbmQgb25lIHVuc2lnbmVkKSwgdGhlIG90aGVyIGV2YWx1YXRvciBlbXVsYXRlcyBiaWcgaW50ZWdlcgpudW1iZXJzIGJ5IHJlcHJlc2VudGluZyB0aGVtIHdpdGggdHdvICJ1bnNpZ25lZCBsb25nIi4gQnkgZGVmYXVsdCwgaXQKd2lsbCB1c2UgdGhlIGZpcnN0IGV2YWx1YXRvciwgdXNpbmcgKHUpaW50bWF4X3QgYXMgbmF0aXZlIHR5cGVzIGlmIHRoZQpjb21waWxlciBpcyBDOTktY29tcGxpYW50LCBvciAodW5zaWduZWQpIGxvbmcgb3RoZXJ3aXNlLiBJZiB5b3Ugd2FudAphbm90aGVyIGJlaGF2aW91ciwgbW9kaWZ5IHRoZSByZWxldmFudCBzZWN0aW9uIGluIHR1bmUuaC4gSGVyZSBhcmUKZXhhbXBsZXMgb2YgZGVmaW5pdGlvbnM6CgovKiBldmFsdWF0ZSBuYXRpdmVseSB3aXRoIHR5cGUgImxvbmcgbG9uZyIgKi8KI2RlZmluZSBOQVRJVkVfVUlOVE1BWAl1bnNpZ25lZCBsb25nIGxvbmcKI2RlZmluZSBOQVRJVkVfSU5UTUFYCWxvbmcgbG9uZwoKLyogZXZhbHVhdGUgbmF0aXZlbHkgd2l0aCB0eXBlICJsb25nIiAoZXZlbiBpZiBiaWdnZXIgaXMgYXZhaWxhYmxlKSAqLwojZGVmaW5lIE1BVElWRV9VSU5UTUFYCXVuc2lnbmVkIGxvbmcKI2RlZmluZSBNQVRJVkVfSU5UTUFYCWxvbmcKCi8qIGV2YWx1YXRlIHdpdGggYmlnbnVtIGV2YWx1YXRpb24gKi8KI3VuZGVmIE5BVElWRV9VSU5UTUFYCiNkZWZpbmUgU0lNVUxfVUlOVE1BWAoKVGhlIGJpZ251bSBldmFsdWF0aW9uIGhhbmRsZXMgc2lnbmVkIGludGVnZXJzIGluIHR3bydzIGNvbXBsZW1lbnQKcmVwcmVzZW50YXRpb24sIHdoZXRoZXIgdGhpcyBpcyB0aGUgbmF0aXZlIGludGVnZXIgcmVwcmVzZW50YXRpb24gb3IKbm90LiBUaGUgY29kZSBtYWtlcyB0aGUgbm9uLXN0YW5kYXJkIGFzc3VtcHRpb24gdGhhdCB1bnNpZ25lZCBsb25nIGFyZQpyZXByZXNlbnRlZCB1bnBhZGRlZCBpbiBtZW1vcnksIHRoYXQgaXMsIHVuc2lnbmVkIGxvbmcgYXJlIG1hZGUgdXAgb2YKZXhhY3RseSBzaXplb2YodW5zaWduZWQgbG9uZykgKiBDSEFSX0JJVCBiaXRzLiBJIGhhdmUgbmV2ZXIgaGVhcmQgb2YgYW55CmFyY2hpdGVjdHVyZSB3aGVyZSB0aGlzIGFzc3VtcHRpb24gd291bGQgYmUgZmFsc2UuCgoKCkZVVFVSRSBFVk9MVVRJT05TCi0tLS0tLS0tLS0tLS0tLS0tCgpVY3BwIGlzIHF1aXRlIGNvbXBsZXRlIG5vdy4gVGhlcmUgd2FzIGEgbG9uZ3N0YW5kaW5nIHByb2plY3Qgb2YKInRyYWRpdGlvbmFsIiBwcmVwcm9jZXNzaW5nLCBidXQgSSBkcm9wcGVkIGl0IGJlY2F1c2UgaXQgd291bGQgbm90Cm1hcCBjbGVhbmx5IG9uIHRoZSB0b2tlbi1iYXNlZCB1Y3BwIHN0cnVjdHVyZS4gTWF5YmUgSSB3aWxsIGNvZGUgYQpzdHJpbmctYmFzZWQgcHJlcHJvY2Vzc29yIG9uZSBkYXk7IGl0IHdvdWxkIGNlcnRhaW5seSB1c2Ugc29tZSBvZiB0aGUKY29kZSBmcm9tIGxleGVyLmMsIGV2YWwuYywgbWVtLmMgYW5kIGhhc2guYy4gSG93ZXZlciwgbWFraW5nIHN1Y2ggYSB0b29sCmlzIGFsbW9zdCBpcnJlbGV2YW50IG5vd2FkYXlzLiBJZiBvbmUgd2FudHMgdG8gaGFuZGxlIHN1Y2ggcHJvamVjdCwKdXNpbmcgdWNwcCBhcyBjb2RlIGJhc2UsIEkgd291bGQgaGFwcGlseSBwcm92aWRlIHNvbWUgaGVscCwgaWYgbmVlZGVkLgoKCgpDSEFOR0VTCi0tLS0tLS0KCkZyb20gMC45IHRvIDEuMDoKCiogYnVnZml4OiBjcmFzaCBhZnRlciBlcnJvbmVvdXMgI2Fzc2VydAoqIGNoYW5nZWQgRVJSX1NIQVJQIHRvIEZBSUxfU0hBUlAsIEVNVUxfVUlOVE1BWCB0byBTSU1VTF9VSU5UTUFYCiogbWFkZSAiaW5saW5lIiBkZWZhdWx0IG9uIGdjYyBhbmQgREVDIGNjYyAoTGludXgvQWxwaGEpCiogc2VtYW50aWMgb2YgLUkgaXMgbm93IFVuaXgtbGlrZSAoYWRkZWQgZGlyZWN0b3JpZXMgYXJlIGxvb2tlZCBmaXJzdCkKKiBhZGRlZCAtSiBmbGFnICh0byBhZGQgaW5jbHVkZSBkaXJlY3RvcmllcyBhZnRlciB0aGUgc3lzdGVtIG9uZXMpCiogY2xlYW5lZCB1cCBub24tYXNjaWkgaXNzdWVzCiogYnVnZml4OiBtaXNzaW5nIGJyYWNlIGluIG5vLUxPV19NRU0gY29kZQoqIGJ1Z2ZpeDogYXJndW1lbnQgbnVtYmVyIGNoZWNrIGluIHZhcmlhZGljIG1hY3JvcwoqIGJ1Z2ZpeDogY3Jhc2ggaW4gbm9uLWxleGVyIG1vZGUgYWZ0ZXIgc29tZSBjYXNlcyBvZiB1bnJlcGxhY2VkIG1hY3JvCiogYnVnZml4OiBfUHJhZ21hKCkgaGFuZGxpbmcgd3J0ICMgYW5kICMjCiogbWFkZSBldmFsdWF0aW9uIG9mIF9QcmFnbWEoKSBvcHRpb25hbCBpbiAjaWYsICNpbmNsdWRlIGFuZCAjbGluZQoqIGJ1Z2ZpeDogcmUtZHVtcCBvZiBtdWx0aWxpbmUgI3ByYWdtYQoqIGFkZGVkIHRoZSBpbm1hY3JvIGFuZCBtYWNyb19jb3VudCBmbGFncwoqIGFkZGVkIG1tYXAoKSBzdXBwb3J0CiogYWRkZWQgb3B0aW9uIHRvIHJldGFpbiB3aGl0ZXNwYWNlIGNvbnRlbnQgaW4gbGV4ZXIgbW9kZQoKRnJvbSAwLjggdG8gMC45OgoKKiBhZGRlZCBjaGVjayBmb3IgZGl2aXNpb24gYnkgMCBpbiAjaWYgZXZhbHVhdGlvbgoqIGFkZGVkIGNoZWNrIGZvciBub24tc3RhbmRhcmQgbGluZSBudW1iZXJzCiogYWRkZWQgY2hlY2sgZm9yIHRyYWlsaW5nIGdhcmJhZ2UgaW4gbW9zdCBkaXJlY3RpdmVzCiogY29ycmVjdGVkIHNpZ25lZG5lc3Mgb2YgY2hhciBjb25zdGFudHMgKGFsd2F5cyBpbnQsIHRoZXJlZm9yZSBhbHdheXMgc2lnbmVkKQoqIG1hZGUgTE9XX01FTSBjb2RlLCBzbyB0aGF0IHVjcHAgcnVucyBzbW9vdGhseSBvbiBsb3cgbWVtb3J5IGFyY2hpdGVjdHVyZXMKKiBtdWx0aXBsZSBidWdmaXhlcyAodXNpbmcgdGhlIEdOVSBjcHAgdGVzdHN1aXRlKQoqIGFkZGVkIGhhbmRsaW5nIG9mIF9QcmFnbWEgKGFzIGEgbWFjcm8pCiogYWRkZWQgdG9rZW5pemF0aW9uIG9mIHByYWdtYSBkaXJlY3RpdmVzCiogYWRkZWQgY29uc2VydmF0aW9uIG9mIHByYWdtYSBkaXJlY3RpdmVzIGluIHRleHQgb3V0cHV0CiogcHJvZHVjZWQgTXNkb3MgMTYtYml0IHNtYWxsIG1lbW9yeSBtb2RlbCBleGVjdXRhYmxlCiogcHJvZHVjZWQgTWluaXgtODYgZXhlY3V0YWJsZQoKRnJvbSAwLjcgdG8gMC44OgoKKiBhZGRlZCBzb21lIHN1cHBvcnQgZm9yIEFtaWdhIHN5c3RlbXMKKiBmaXhlZCBleHRyYSBzcGFjaW5nIGluIHN0cmluZ2lmaWVkIHRva2VucwoqIGZpeGVkIGJ1ZyByZWxhdGVkIHRvICU6JSBhbmQgdG9sZXJhdGVkIHJvZ3VlIHNoYXJwcwoqIG5hbWVzcGFjZSBjbGVhbnVwCiogYnVnZml4IGZvciBtYWNybyByZWRlZmluaXRpb24KKiBhZGRlZCB3YXJuaW5nIGZvciBldmFsdWF0ZWQgY29tbWEgb3BlcmF0b3JzIGluICNpZiAoSVNPIHJlcXVpcmVtZW50KQoqIC1EZm9vIG5vdyBkZWZpbmVzIGZvbyB3aXRoIGNvbnRlbnQgMSAoYW5kIG5vdCB2b2lkIGNvbnRlbnQpCiogdHJpZ3JhcGhzIGNhbiBiZSBkaXNhYmxlZCAoZm9yIGluY29ycmVjdCBidXQgbGVnYWN5IGNvZGUpCiogZml4ZWQgc2VtYW50aWNzIGZvciAjaW5jbHVkZSAiZmlsZSIgKGxvY2FsIGRpcmVjdG9yeSkKKiBmaXhlZCBkZXRlY3Rpb24gb2YgcHJvdGVjdGVkIGZpbGVzCiogcHJvZHVjZWQgYSBNc2RvcyAxNi1iaXQgZXhlY3V0YWJsZQoKRnJvbSAwLjYgdG8gMC43OgoKKiBvZmZpY2lhbGx5IGNoYW5nZWQgdGhlIGdvYWwgdG8gZnVsbCBDOTkgY29tcGxpYW5jZQoqIGFkZGVkIHRoZSBDT05URVhUIHRva2VuIGFuZCBsZXQgTkVXTElORSB0b2tlbnMgZ28KKiBhZGRlZCByZXBvcnRfY29udGV4dCgpIGZvciBlcnJvciByZXBvcnRpbmcKKiBlbmZvcmNlZCBtYXRjaGluZyBvZiAjaWYvI2VuZGlmIChmaWxlLWdsb2JhbCBuZXN0aW5nIGxldmVsID0gMCkKKiBhZGRlZCBzdXBwb3J0IG9mIEM5OSBkaWdyYXBocwoqIGFkZGVkIFVURi04IGVuY29kaW5nIHN1cHBvcnQKKiBhZGRlZCB1bml2ZXJzYWwgY2hhcmFjdGVyIG5hbWVzCiogcmV3cm90ZSAjaWYgZXhwcmVzc2lvbnMgKHNpemVzIGZpeGVkLCBiaWdudW0sIHNpZ25lZC91bnNpZ25lZCBmaXhlZCkKKiBmaXhlZCBpbmNvbXBsZXRlIGV2YWx1YXRpb24gb2YgI2lmIGV4cHJlc3Npb25zCiogYWRkZWQgdHJhbnNpZW50X2NoYXJhY3RlcnNbXQoKRnJvbSAwLjUgdG8gMC42OgoKKiBkaXNhcHBlYXJhbmNlIG9mIGVycm9yX25vbmwoKQoqIGFkZGVkIGV4dHJhIG9wdGlvbmFsIHdhcm5pbmdzIGZvciB0cmlncmFwaHMKKiBzb21lIGJ1Z2ZpeGVzLCBlc3BlY2lhbGx5IGluIGxleGVyIG1vZGUKKiBoYW5kbGVkIE1hY0ludG9zaCBmaWxlcyBjb3JyZWN0bHkKCkZyb20gMC40IHRvIDAuNToKCiogbmljZXIgI3ByYWdtYSBoYW5kbGluZyAoYSB0b2tlbiBjYW4gYmUgZW1pdHRlZCkKKiBidWdmaXggaW4gbGV4ZXIgbW9kZSBhZnRlciAjbGluZSBhbmQgI2Vycm9yCiogc2FtcGxlLmMgICBhbiBleGFtcGxlIG9mIGNvZGUgbGlua2VkIHdpdGggdWNwcAoqIG1hZGUgI2lmIGV4cHJlc3Npb25zIGNvbmZvcm1pbmcgdG8gc3RhbmRhcmQgc2lnbmVkL3Vuc2lnbmVkIGhhbmRsaW5nCiogYWRkZWQgdGhlIGNvcHlfbGluZVtdIGJ1ZmZlciBmZWF0dXJlCgpGcm9tIDAuMyB0byAwLjQ6CgoqIHJlbGF4ZWQgaW50ZXJwcmV0YXRpb24gb2YgJyNpbmNsdWRlIGZvbycgd2hlbiBmb28gZW5kcyB1cCwgYWZ0ZXIgbWFjcm8KICBzdWJzdGl0dXRpb24sIHdpdGggYSAnPGJhcj4nIGNvbnRlbnQKKiBjb3JyZWN0ZWQgdGhlICdkb3VibGUtZG90JyBidWcKKiBjb3JyZWN0ZWQgdHdvIGJ1Z3MgcmVsYXRlZCB0byB0aGUgdHJlYXRtZW50IG9mIG1hY3JvIGFib3J0ZWQgY2FsbHMgKGR1ZQogIHRvIGxhY2sgb2YgYXJndW1lbnRzKQoqIHNvbWUgbmFtZXNwYWNlcyBjbGVhbnVwLCB0byBlYXNlIGludGVncmF0aW9uIGludG8gb3RoZXIgY29kZQoqIGRvY3VtZW50ZWQgdGhlIHdheSB0byBpbmNsdWRlIHVjcHAgaW50byBhbm90aGVyIHByb2dyYW0KKiBtYWRlIG5ld2xpbmVzIGVtYmVkZGVkIGludG8gc3RyaW5ncyBpbGxlZ2FsIChhbmQgcmVwb3J0ZWQgYXMgc3VjaCkKCkZyb20gMC4yIHRvIDAuMzoKCiogYWRkZWQgc3VwcG9ydCBmb3Igc3lzdGVtIHByZWRlZmluZWQgbWFjcm9zCiogbWFkZSBzZXZlcmFsIGJ1Z2ZpeGVzCiogY2hlY2tlZCBDOTkgY29tcGxpYW5jZSBmb3IgbW9zdCBvZiB0aGUgZmVhdHVyZXMKKiB1Y3BwIG5vdyBhY2NlcHRzIG5vbi1DIGNoYXJhY3RlcnMgb24gc3RhbmRhcmQgd2hlbiB1c2VkIHN0YW5kLWFsb25lCiogcmVtb3ZlZCBtYW55IHVzZWxlc3Mgc3BhY2VzIGluIHRoZSBvdXRwdXQKCkZyb20gMC4xIHRvIDAuMjoKCiogYWRkZWQgc3VwcG9ydCBmb3IgYXNzZXJ0aW9ucwoqIGFkZGVkIHN1cHBvcnQgZm9yIG1hY3JvcyB3aXRoIHZhcmlhYmxlIGFyZ3VtZW50cwoqIHNwbGl0IHRoZSBwaGFyYW9uaWMgY3BwLmMgZmlsZSBpbnRvIG1hbnkKKiBtYWRlIHNldmVyYWwgYnVnZml4ZXMKKiByZWxheGVkIHRoZSBiZWhhdmlvdXIgd2l0aCByZWdhcmRzIHRvIHRoZSB2b2lkIGFyZ3VtZW50cwoqIG1hZGUgQysrLWxpa2UgY29tbWVudHMgYW4gb3B0aW9uCgoKClRIQU5LUyBUTwotLS0tLS0tLS0KClZvbGtlciBCYXJ0aGVsbWFubiwgTmVpbCBCb290aCwgU3TpcGhhbmUgRWNvbGl2ZXQsIEFudG9pbmUgTGVjYSwgQ3lyaWxsZQpMZWZldnJlLCBEYXZlIFJpdmVycywgTG9pYyBUb3J0YXkgYW5kIExhdXJlbnQgV2FjcmVuaWVyLCBmb3Igc3VnZ2VzdGlvbnMKYW5kIGJldGEtdGVzdGluZy4KClBhdWwgRWdnZXJ0LCBEb3VnbGFzIEEuIEd3eW4sIENsaXZlIEQuVy4gRmVhdGhlciwgYW5kIHRoZSBvdGhlciBndXlzIGZyb20KY29tcC5zdGQuYywgZm9yIGV4cGxhbmF0aW9ucyBhYm91dCB0aGUgc3RhbmRhcmQuCgpEYXZlIEJyb2xsZXksIEphbWllIExva2llciBhbmQgTmVpbCBCb290aCwgZm9yIGRpc2N1c3Npb24gYWJvdXQgdHJpY2t5CnBvaW50cyBvbiBuZXN0aW5nIG1hY3Jvcy4KCkJyaWFuIEtlcm5pZ2hhbiBhbmQgRGVubmlzIFJpdGNoaWUsIGZvciBicmluZ2luZyBDIHRvIG1vcnRhbCBNZW4uCg==