LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQWdlcmUgU3lzdGVtcyBJbmMuCiAqIFdpcmVsZXNzIGRldmljZSBkcml2ZXIgZm9yIExpbnV4ICh3bGFnczQ5KS4KICoKICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KICoKICogSW5pdGlhbGx5IGRldmVsb3BlZCBieSBUcmlwbGVQb2ludCwgSW5jLgogKiAgIGh0dHA6Ly93d3cudHJpcGxlcG9pbnQuY29tCiAqCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqICAgVGhpcyBmaWxlIGRlZmluZXMgbWlzYyB1dGlsaXR5IGZ1bmN0aW9ucy4KICoKICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoKICogU09GVFdBUkUgTElDRU5TRQogKgogKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcwogKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCiAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KICoKICogQ29weXJpZ2h0IKkgMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgogKgogKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcwogKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcwogKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKICogICAgZGlzdHJpYnV0aW9uLgogKgogKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgogKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICoKICogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCiAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiBEaXNjbGFpbWVyCiAqCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgk0FTIElTlCBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAogKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKICogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQogKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwogKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CiAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAogKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKICogREFNQUdFLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIGluY2x1ZGUgZmlsZXMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2luY2x1ZGUgPHdsX3ZlcnNpb24uaD4KCiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLy8gI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci8vICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+Ci8vICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLy8gI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci8vICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLy8gI2luY2x1ZGUgPGxpbnV4L2luLmg+Ci8vICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgovLyAjaW5jbHVkZSA8YXNtL2lvLmg+Ci8vICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci8vICNpbmNsdWRlIDxhc20vYml0b3BzLmg+CgojaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgovLyAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci8vICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KLy8gI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgoKI2luY2x1ZGUgPGRlYnVnLmg+CiNpbmNsdWRlIDxoY2YuaD4KLy8gI2luY2x1ZGUgPGhjZmRlZi5oPgoKI2luY2x1ZGUgPHdsX2lmLmg+CiNpbmNsdWRlIDx3bF9pbnRlcm5hbC5oPgojaW5jbHVkZSA8d2xfdXRpbC5oPgojaW5jbHVkZSA8d2xfd2V4dC5oPgojaW5jbHVkZSA8d2xfbWFpbi5oPgoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBnbG9iYWwgdmFyaWFibGVzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBBIG1hdHJpeCB3aGljaCBtYXBzIGNoYW5uZWxzIHRvIGZyZXF1ZW5jaWVzICovCiNkZWZpbmUgTUFYX0NIQU5fRlJFUV9NQVBfRU5UUklFUyAgIDUwCnN0YXRpYyBjb25zdCBsb25nIGNoYW5fZnJlcV9saXN0W11bTUFYX0NIQU5fRlJFUV9NQVBfRU5UUklFU10gPQp7CiAgICB7MSwyNDEyfSwKICAgIHsyLDI0MTd9LAogICAgezMsMjQyMn0sCiAgICB7NCwyNDI3fSwKICAgIHs1LDI0MzJ9LAogICAgezYsMjQzN30sCiAgICB7NywyNDQyfSwKICAgIHs4LDI0NDd9LAogICAgezksMjQ1Mn0sCiAgICB7MTAsMjQ1N30sCiAgICB7MTEsMjQ2Mn0sCiAgICB7MTIsMjQ2N30sCiAgICB7MTMsMjQ3Mn0sCiAgICB7MTQsMjQ4NH0sCiAgICB7MzYsNTE4MH0sCiAgICB7NDAsNTIwMH0sCiAgICB7NDQsNTIyMH0sCiAgICB7NDgsNTI0MH0sCiAgICB7NTIsNTI2MH0sCiAgICB7NTYsNTI4MH0sCiAgICB7NjAsNTMwMH0sCiAgICB7NjQsNTMyMH0sCiAgICB7MTQ5LDU3NDV9LAogICAgezE1Myw1NzY1fSwKICAgIHsxNTcsNTc4NX0sCiAgICB7MTYxLDU4MDV9Cn07CgojaWYgREJHCmV4dGVybiBkYmdfaW5mb190ICpEYmdJbmZvOwojZW5kaWYgIC8qIERCRyAqLwoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJZGJtKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFJldHVybiBhbiBlbmVyZ3kgdmFsdWUgaW4gZEJtLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICB2YWx1ZSAtIHRoZSBlbmVyZ3kgdmFsdWUgdG8gYmUgY29udmVydGVkCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIHRoZSB2YWx1ZSBpbiBkQm0KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IGRibSggaW50IHZhbHVlICkKewogICAgLyogVHJ1bmNhdGUgdGhlIHZhbHVlIHRvIGJlIGJldHdlZW4gbWluIGFuZCBtYXguICovCiAgICBpZiggdmFsdWUgPCBIQ0ZfTUlOX1NJR05BTF9MRVZFTCApCiAgICAgICAgdmFsdWUgPSBIQ0ZfTUlOX1NJR05BTF9MRVZFTDsKCiAgICBpZiggdmFsdWUgPiBIQ0ZfTUFYX1NJR05BTF9MRVZFTCApCiAgICAgICAgdmFsdWUgPSBIQ0ZfTUFYX1NJR05BTF9MRVZFTDsKCiAgICAvKiBSZXR1cm4gdGhlIGVuZXJneSB2YWx1ZSBpbiBkQm0uICovCiAgICByZXR1cm4gKCB2YWx1ZSAtIEhDRl8wREJNX09GRlNFVCApOwp9IC8vIGRibQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJcGVyY2VudCgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBSZXR1cm4gYSB2YWx1ZSBhcyBhIHBlcmNlbnRhZ2Ugb2YgbWluIHRvIG1heC4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgdmFsdWUgICAtIHRoZSB2YWx1ZSBpbiBxdWVzdGlvbgogKiAgICAgIG1pbiAgICAgLSB0aGUgbWluaW11bSByYW5nZSB2YWx1ZQogKiAgICAgIG1heCAgICAgLSB0aGUgbWF4aW11bSByYW5nZSB2YWx1ZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICB0aGUgcGVyY2VudGFnZSB2YWx1ZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgcGVyY2VudCggaW50IHZhbHVlLCBpbnQgbWluLCBpbnQgbWF4ICkKewogICAgLyogVHJ1bmNhdGUgdGhlIHZhbHVlIHRvIGJlIGJldHdlZW4gbWluIGFuZCBtYXguICovCiAgICBpZiggdmFsdWUgPCBtaW4gKQogICAgICAgIHZhbHVlID0gbWluOwoKICAgIGlmKCB2YWx1ZSA+IG1heCApCiAgICAgICAgdmFsdWUgPSBtYXg7CgogICAgLyogUmV0dXJuIHRoZSB2YWx1ZSBhcyBhIHBlcmNlbnRhZ2Ugb2YgbWluIHRvIG1heC4gKi8KICAgIHJldHVybiAoKCggdmFsdWUgLSBtaW4gKSAqIDEwMCApIC8gKCBtYXggLSBtaW4gKSk7Cn0gLy8gcGVyY2VudAovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJaXNfdmFsaWRfa2V5X3N0cmluZygpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBDaGVja3MgdG8gZGV0ZXJtaW5lIGlmIHRoZSBXRVAga2V5IHN0cmluZyBpcyB2YWxpZAogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBzIC0gdGhlIHN0cmluZyBpbiBxdWVzdGlvbgogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBub24temVybyBpZiB0aGUgc3RyaW5nIGNvbnRhaW5zIGEgdmFsaWQga2V5CiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCBpc192YWxpZF9rZXlfc3RyaW5nKCBjaGFyICpzICkKewogICAgaW50IGw7CiAgICBpbnQgaTsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgogICAgbCA9IHN0cmxlbiggcyApOwoKICAgIC8qIDB4IGZvbGxvd2VkIGJ5IDUgb3IgMTMgaGV4YWRlY2ltYWwgZGlnaXQgcGFpcnMgaXMgdmFsaWQgKi8KICAgIGlmKCBzWzBdID09ICcwJyAmJiAoIHNbMV0gPT0gJ3gnIHx8IHNbMV0gPT0gJ1gnICkpIHsKICAgICAgICBpZiggbCA9PSAxMiB8fCBsID09IDI4ICkgewogICAgICAgICAgICBmb3IoIGkgPSAyOyBpIDwgbDsgaSsrICkgewogICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCggc1tpXSApKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgLyogc3RyaW5nIHdpdGggMCwgNSwgb3IgMTMgY2hhcmFjdGVycyBpcyB2YWxpZCAqLwogICAgZWxzZQogICAgewogICAgICAgIHJldHVybiggbCA9PSAwIHx8IGwgPT0gNSB8fCBsID09IDEzICk7CiAgICB9Cn0gLy8gaXNfdmFsaWRfa2V5X3N0cmluZwovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJaGV4ZGlnaXQyaW50KCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIENvbnZlcnRzIGEgaGV4YWRlY2ltYWwgZGlnaXQgY2hhcmFjdGVyIHRvIGFuIGludGVnZXIKICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgYyAgIC0gdGhlIGhleGFkZWNpbWFsIGRpZ2l0IGNoYXJhY3RlcgogKgogKiAgUkVUVVJOUzoKICoKICogICAgICB0aGUgY29udmVydGVkIGludGVnZXIKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IGhleGRpZ2l0MmludCggY2hhciBjICkKewogICBpZiggYyA+PSAnMCcgJiYgYyA8PSAnOScgKQogICAgICAgcmV0dXJuIGMgLSAnMCc7CgogICBpZiggYyA+PSAnQScgJiYgYyA8PSAnRicgKQogICAgICAgcmV0dXJuIGMgLSAnQScgKyAxMDsKCiAgIGlmKCBjID49ICdhJyAmJiBjIDw9ICdmJyApCiAgICAgICByZXR1cm4gYyAtICdhJyArIDEwOwoKICAgcmV0dXJuIDA7Cn0gLy8gaGV4ZGlnaXQyaW50Ci8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglrZXlfc3RyaW5nMmtleSgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBDb252ZXJ0cyBhIGtleV9zdHJpbmcgdG8gYSBrZXksIEFzc3VtZXMgdGhlIGtleV9zdHJpbmcgaXMgdmFsaWRhdGVkIHdpdGgKICogIGlzX3ZhbGlkX2tleV9zdHJpbmcoKS4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAga3MgIC0gdGhlIHZhbGlkIGtleSBzdHJpbmcKICogICAgICBrZXkgLSBhIHBvaW50ZXIgdG8gYSBLRVlfU1RSVUNUIHdoZXJlIHRoZSBjb252ZXJ0ZWQga2V5IGluZm9ybWF0aW9uIHdpbGwKICogICAgICAgICAgICBiZSBzdG9yZWQuCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE4vQQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIGtleV9zdHJpbmcya2V5KCBjaGFyICprcywgS0VZX1NUUkNUICprZXkgKQp7CiAgICBpbnQgbCxpLG47CiAgICBjaGFyICpwOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCiAgICBsID0gc3RybGVuKCBrcyApOwoKICAgIC8qIDB4IGZvbGxvd2VkIGJ5IGhleGFkZWNpbWFsIGRpZ2l0IHBhaXJzICovCiAgICBpZigga3NbMF0gPT0gJzAnICYmICgga3NbMV0gPT0gJ3gnIHx8IGtzWzFdID09ICdYJyApKSB7CiAgICAgICAgbiA9IDA7CiAgICAgICAgcCA9IChjaGFyICopa2V5LT5rZXk7CgogICAgICAgIGZvciggaSA9IDI7IGkgPCBsOyBpKz0yICkgewogICAgICAgICAgICpwKysgPSAoIGhleGRpZ2l0MmludCgga3NbaV0gKSA8PCA0ICkgKyBoZXhkaWdpdDJpbnQgKGtzW2krMV0gKTsKICAgICAgICAgICBuKys7CiAgICAgICAgfQoKICAgICAgICAvKiBOb3RlIHRoYXQgZW5kaWFuIHRyYW5zbGF0aW9uIG9mIHRoZSBsZW5ndGggZmllbGQgaXMgbm90IG5lZWRlZCBoZXJlCiAgICAgICAgICBiZWNhdXNlIGl0J3MgcGVyZm9ybWVkIGluIHdsX3B1dF9sdHYoKSAqLwogICAgICAgIGtleS0+bGVuID0gbjsKICAgIH0KICAgIC8qIGNoYXJhY3RlciBzdHJpbmcgKi8KICAgIGVsc2UKICAgIHsKICAgICAgICBzdHJjcHkoIChjaGFyICopa2V5LT5rZXksIGtzICk7CiAgICAgICAga2V5LT5sZW4gPSBsOwogICAgfQoKICAgIHJldHVybjsKfSAvLyBrZXlfc3RyaW5nMmtleQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKCgoKI2lmIERCRwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglEYmdId0FkZHIoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgQ29udmVydCBhIGhhcmR3YXJlIGV0aGVybmV0IGFkZHJlc3MgdG8gYSBjaGFyYWN0ZXIgc3RyaW5nCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGh3QWRkciAgLSBhbiBldGhlcm5ldCBhZGRyZXNzCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIGEgcG9pbnRlciB0byBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGV0aGVybmV0IGFkZHJlc3MKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KY29uc3QgY2hhciAqRGJnSHdBZGRyKHVuc2lnbmVkIGNoYXIgKmh3QWRkcikKewogICAgc3RhdGljIGNoYXIgICAgIGJ1ZmZlclsxOF07CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKICAgIHNwcmludGYoIGJ1ZmZlciwgIiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYIiwKICAgICAgICAgICAgIGh3QWRkclswXSwgaHdBZGRyWzFdLCBod0FkZHJbMl0sIGh3QWRkclszXSwgaHdBZGRyWzRdLCBod0FkZHJbNV0gKTsKCiAgICByZXR1cm4gYnVmZmVyOwp9IC8vIERiZ0h3QWRkcgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKI2VuZGlmIC8qIERCRyAqLwoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfaGFzX3dlcCgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBDaGVja3MgdG8gc2VlIGlmIHRoZSBkZXZpY2Ugc3VwcG9ydHMgV0VQCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGlmYnAgICAgLSB0aGUgSUZCIHBvaW50ZXIgb2YgdGhlIGRldmljZSBpbiBxdWVzdGlvbgogKgogKiAgUkVUVVJOUzoKICoKICogICAgICAxIGlmIFdFUCBpcyBrbm93biBlbmFibGVkLCBlbHNlIDAKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHdsX2hhc193ZXAgKElGQlAgaWZicCkKewogICAgQ0ZHX1BSSVZBQ1lfT1BUX0lNUExFTUVOVEVEX1NUUkNUIGx0djsKCWludCByYywgcHJpdmFjeTsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLyogVGhpcyBmdW5jdGlvbiBhbGxvd3MgdXMgdG8gZGlzdGlndWlzaCBicm9uemUgY2FyZHMgZnJvbSBvdGhlciB0eXBlcywgdG8KICAgICAgIGtub3cgaWYgV0VQIGV4aXN0cy4gRG9lcyBub3QgZGlzdGluZ3Vpc2ggKGJlY2F1c2UgdGhlcmUncyBubyB3YXkgdG8pCiAgICAgICBiZXR3ZWVuIHNpbHZlciBhbmQgZ29sZCBjYXJkcy4gKi8KICAgIGx0di5sZW4gPSAyOwogICAgbHR2LnR5cCA9IENGR19QUklWQUNZX09QVF9JTVBMRU1FTlRFRDsKCglyYyA9IGhjZl9nZXRfaW5mbyggaWZicCwgKExUVlApICZsdHYgKTsKCglwcml2YWN5ID0gQ05WX0xJVFRMRV9UT19JTlQoIGx0di5wcml2YWN5X29wdF9pbXBsZW1lbnRlZCApOwoKCS8vcmV0dXJuIHJjID8gMCA6IHByaXZhY3k7CiAgICByZXR1cm4gMTsKfSAvLyB3bF9oYXNfd2VwCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9oY2ZfZXJyb3IoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgUmVwb3J0IHRoZSB0eXBlIG9mIEhDRiBlcnJvciBtZXNzYWdlCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIG5vbmUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgQSBkZXNjcmlwdGl2ZSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgZXJyb3IsIHF1aWV0IG90aGVyd2lzZS4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCB3bF9oY2ZfZXJyb3IoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBoY2ZTdGF0dXMgKQp7CiAgICBjaGFyICAgICBidWZmZXJbNjRdLCAqcE1zZzsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgogICAgaWYoIGhjZlN0YXR1cyAhPSBIQ0ZfU1VDQ0VTUyApIHsKICAgICAgICBzd2l0Y2goIGhjZlN0YXR1cyApIHsKCiAgICAgICAgY2FzZSBIQ0ZfRVJSX1RJTUVfT1VUOgoKICAgICAgICAgICAgcE1zZyA9ICJFeHBlY3RlZCBhZGFwdGVyIGV2ZW50IGRpZCBub3Qgb2NjdXIgaW4gZXhwZWN0ZWQgdGltZSI7CiAgICAgICAgICAgIGJyZWFrOwoKCiAgICAgICAgY2FzZSBIQ0ZfRVJSX05PX05JQzoKCiAgICAgICAgICAgIHBNc2cgPSAiQ2FyZCBub3QgZm91bmQgKGVqZWN0ZWQgdW5leHBlY3RlZGx5KSI7CiAgICAgICAgICAgIGJyZWFrOwoKCiAgICAgICAgY2FzZSBIQ0ZfRVJSX0xFTjoKCiAgICAgICAgICAgIHBNc2cgPSAiQ29tbWFuZCBidWZmZXIgc2l6ZSBpbnN1ZmZpY2llbnQiOwogICAgICAgICAgICBicmVhazsKCgogICAgICAgIGNhc2UgSENGX0VSUl9JTkNPTVBfUFJJOgoKICAgICAgICAgICAgcE1zZyA9ICJQcmltYXJ5IGZ1bmN0aW9ucyBhcmUgbm90IGNvbXBhdGlibGUiOwogICAgICAgICAgICBicmVhazsKCgogICAgICAgIGNhc2UgSENGX0VSUl9JTkNPTVBfRlc6CgogICAgICAgICAgICBwTXNnID0gIlByaW1hcnkgZnVuY3Rpb25zIGFyZSBjb21wYXRpYmxlLCAiCiAgICAgICAgICAgICAgICAic3RhdGlvbi9hcCBmdW5jdGlvbnMgYXJlIG5vdCI7CiAgICAgICAgICAgIGJyZWFrOwoKCiAgICAgICAgY2FzZSBIQ0ZfRVJSX0JVU1k6CgogICAgICAgICAgICBwTXNnID0gIklucXVpcmUgY21kIHdoaWxlIGFub3RoZXIgSW5xdWlyZSBpbiBwcm9ncmVzcyI7CiAgICAgICAgICAgIGJyZWFrOwoKCiAgICAgICAgLy9jYXNlIEhDRl9FUlJfU0VRX0JVRzoKCiAgICAgICAgLy8gICAgcE1zZyA9ICJVbmV4cGVjdGVkIGNvbW1hbmQgY29tcGxldGVkIjsKICAgICAgICAvLyAgICBicmVhazsKCgogICAgICAgIGNhc2UgSENGX0VSUl9ERUZVTkNUX0FVWDoKCiAgICAgICAgICAgIHBNc2cgPSAiVGltZW91dCBvbiBhY2sgZm9yIGVuYWJsZS9kaXNhYmxlIG9mIEFVWCByZWdpc3RlcnMiOwogICAgICAgICAgICBicmVhazsKCgogICAgICAgIGNhc2UgSENGX0VSUl9ERUZVTkNUX1RJTUVSOgogICAgICAgICAgICBwTXNnID0gIlRpbWVvdXQgb24gdGltZXIgY2FsaWJyYXRpb24gZHVyaW5nIGluaXRpYWxpemF0aW9uIHByb2Nlc3MiOwogICAgICAgICAgICBicmVhazsKCgogICAgICAgIGNhc2UgSENGX0VSUl9ERUZVTkNUX1RJTUVfT1VUOgogICAgICAgICAgICBwTXNnID0gIlRpbWVvdXQgb24gQnVzeSBiaXQgZHJvcCBkdXJpbmcgQkFQIHNldHVwIjsKICAgICAgICAgICAgYnJlYWs7CgoKICAgICAgICBjYXNlIEhDRl9FUlJfREVGVU5DVF9DTURfU0VROgogICAgICAgICAgICBwTXNnID0gIkhlcm1lcyBhbmQgSENGIGFyZSBvdXQgb2Ygc3luYyI7CiAgICAgICAgICAgIGJyZWFrOwoKCiAgICAgICAgZGVmYXVsdDoKCiAgICAgICAgICAgIHNwcmludGYoIGJ1ZmZlciwgIkVycm9yIGNvZGUgJWQiLCBoY2ZTdGF0dXMgKTsKICAgICAgICAgICAgcE1zZyA9IGJ1ZmZlcjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBwcmludGsoIEtFUk5fSU5GTyAiJXM6IFdpcmVsZXNzLCBIQ0YgZmFpbHVyZTogXCIlc1wiXG4iLAogICAgICAgICAgICAgICAgZGV2LT5uYW1lLCBwTXNnICk7CiAgICB9Cn0gLy8gd2xfaGNmX2Vycm9yCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9lbmRpYW5fdHJhbnNsYXRlX2V2ZW50KCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIERldGVybWluZXMgd2hhdCB0eXBlIG9mIGRhdGEgaXMgaW4gdGhlIG1haWxib3ggYW5kIHBlcmZvcm1zIHRoZSBwcm9wZXIKICogIGVuZGlhbiB0cmFuc2xhdGlvbi4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgcEx0diAtIGFuIExUViBwb2ludGVyCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE4vQQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHdsX2VuZGlhbl90cmFuc2xhdGVfZXZlbnQoIGx0dl90ICpwTHR2ICkKewogICAgREJHX0ZVTkMoICJ3bF9lbmRpYW5fdHJhbnNsYXRlX2V2ZW50IiApOwogICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CgoKICAgIHN3aXRjaCggcEx0di0+dHlwICkgewogICAgY2FzZSBDRkdfVEFMTElFUzoKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDRkdfU0NBTjoKICAgICAgICB7CiAgICAgICAgICAgIGludCBudW1BUHM7CiAgICAgICAgICAgIFNDQU5fUlNfU1RSQ1QgKnBBcHMgPSAoU0NBTl9SU19TVFJDVCopJnBMdHYtPnUudThbMF07CgogICAgICAgICAgICBudW1BUHMgPSAoaGNmXzE2KSgoIChzaXplX3QpKCBwTHR2LT5sZW4gLSAxICkgKiAyICkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplb2YoIFNDQU5fUlNfU1RSQ1QgKSkpOwoKICAgICAgICAgICAgd2hpbGUoIG51bUFQcyA+PSAxICkgewogICAgICAgICAgICAgICAgbnVtQVBzLS07CgogICAgICAgICAgICAgICAgcEFwc1tudW1BUHNdLmNoYW5uZWxfaWQgICAgICAgICAgID0KICAgICAgICAgICAgICAgICAgICBDTlZfTElUVExFX1RPX0lOVCggcEFwc1tudW1BUHNdLmNoYW5uZWxfaWQgKTsKCiAgICAgICAgICAgICAgICBwQXBzW251bUFQc10ubm9pc2VfbGV2ZWwgICAgICAgICAgPQogICAgICAgICAgICAgICAgICAgIENOVl9MSVRUTEVfVE9fSU5UKCBwQXBzW251bUFQc10ubm9pc2VfbGV2ZWwgKTsKCiAgICAgICAgICAgICAgICBwQXBzW251bUFQc10uc2lnbmFsX2xldmVsICAgICAgICAgPQogICAgICAgICAgICAgICAgICAgIENOVl9MSVRUTEVfVE9fSU5UKCBwQXBzW251bUFQc10uc2lnbmFsX2xldmVsICk7CgogICAgICAgICAgICAgICAgcEFwc1tudW1BUHNdLmJlYWNvbl9pbnRlcnZhbF90aW1lID0KICAgICAgICAgICAgICAgICAgICBDTlZfTElUVExFX1RPX0lOVCggcEFwc1tudW1BUHNdLmJlYWNvbl9pbnRlcnZhbF90aW1lICk7CgogICAgICAgICAgICAgICAgcEFwc1tudW1BUHNdLmNhcGFiaWxpdHkgICAgICAgICAgID0KICAgICAgICAgICAgICAgICAgICBDTlZfTElUVExFX1RPX0lOVCggcEFwc1tudW1BUHNdLmNhcGFiaWxpdHkgKTsKCiAgICAgICAgICAgICAgICBwQXBzW251bUFQc10uc3NpZF9sZW4gICAgICAgICAgICAgPQogICAgICAgICAgICAgICAgICAgIENOVl9MSVRUTEVfVE9fSU5UKCBwQXBzW251bUFQc10uc3NpZF9sZW4gKTsKCiAgICAgICAgICAgICAgICBwQXBzW251bUFQc10uc3NpZF92YWxbcEFwc1tudW1BUHNdLnNzaWRfbGVuXSA9IDA7CgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIENGR19BQ1NfU0NBTjoKICAgICAgICB7CiAgICAgICAgICAgIFBST0JFX1JFU1AgKnByb2JlX3Jlc3AgPSAoUFJPQkVfUkVTUCAqKXBMdHY7CgogICAgICAgICAgICBwcm9iZV9yZXNwLT5mcmFtZUNvbnRyb2wgICA9IENOVl9MSVRUTEVfVE9fSU5UKCBwcm9iZV9yZXNwLT5mcmFtZUNvbnRyb2wgKTsKICAgICAgICAgICAgcHJvYmVfcmVzcC0+ZHVySUQgICAgICAgICAgPSBDTlZfTElUVExFX1RPX0lOVCggcHJvYmVfcmVzcC0+ZHVySUQgKTsKICAgICAgICAgICAgcHJvYmVfcmVzcC0+c2VxdWVuY2UgICAgICAgPSBDTlZfTElUVExFX1RPX0lOVCggcHJvYmVfcmVzcC0+c2VxdWVuY2UgKTsKICAgICAgICAgICAgcHJvYmVfcmVzcC0+ZGF0YUxlbmd0aCAgICAgPSBDTlZfTElUVExFX1RPX0lOVCggcHJvYmVfcmVzcC0+ZGF0YUxlbmd0aCApOwoKI2lmbmRlZiBXQVJQCiAgICAgICAgICAgIHByb2JlX3Jlc3AtPmxlblR5cGUgICAgICAgID0gQ05WX0xJVFRMRV9UT19JTlQoIHByb2JlX3Jlc3AtPmxlblR5cGUgKTsKI2VuZGlmIC8vIFdBUlAKCiAgICAgICAgICAgIHByb2JlX3Jlc3AtPmJlYWNvbkludGVydmFsID0gQ05WX0xJVFRMRV9UT19JTlQoIHByb2JlX3Jlc3AtPmJlYWNvbkludGVydmFsICk7CiAgICAgICAgICAgIHByb2JlX3Jlc3AtPmNhcGFiaWxpdHkgICAgID0gQ05WX0xJVFRMRV9UT19JTlQoIHByb2JlX3Jlc3AtPmNhcGFiaWxpdHkgKTsKICAgICAgICAgICAgcHJvYmVfcmVzcC0+ZmxhZ3MgICAgICAgICAgPSBDTlZfTElUVExFX1RPX0lOVCggcHJvYmVfcmVzcC0+ZmxhZ3MgKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ0ZHX0xJTktfU1RBVDoKI2RlZmluZSBscyAoKExJTktfU1RBVFVTX1NUUkNUICopcEx0dikKICAgICAgICAgICAgbHMtPmxpbmtTdGF0dXMgPSBDTlZfTElUVExFX1RPX0lOVCggbHMtPmxpbmtTdGF0dXMgKTsKICAgICAgICBicmVhazsKI3VuZGVmIGxzCgogICAgY2FzZSBDRkdfQVNTT0NfU1RBVDoKICAgICAgICB7CiAgICAgICAgICAgIEFTU09DX1NUQVRVU19TVFJDVCAqcEFzID0gKEFTU09DX1NUQVRVU19TVFJDVCAqKXBMdHY7CgogICAgICAgICAgICBwQXMtPmFzc29jU3RhdHVzID0gQ05WX0xJVFRMRV9UT19JTlQoIHBBcy0+YXNzb2NTdGF0dXMgKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ0ZHX1NFQ1VSSVRZX1NUQVQ6CiAgICAgICAgewogICAgICAgICAgICBTRUNVUklUWV9TVEFUVVNfU1RSQ1QgKnBTcyA9IChTRUNVUklUWV9TVEFUVVNfU1RSQ1QgKilwTHR2OwoKICAgICAgICAgICAgcFNzLT5zZWN1cml0eVN0YXR1cyA9IENOVl9MSVRUTEVfVE9fSU5UKCBwU3MtPnNlY3VyaXR5U3RhdHVzICk7CiAgICAgICAgICAgIHBTcy0+cmVhc29uICAgICAgICAgPSBDTlZfTElUVExFX1RPX0lOVCggcFNzLT5yZWFzb24gKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ0ZHX1dNUDoKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDRkdfTlVMTDoKICAgICAgICBicmVhazsKCgogICAgZGVmYXVsdDoKICAgICAgICBicmVhazsKICAgIH0KCiAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgIHJldHVybjsKfSAvLyB3bF9lbmRpYW5fdHJhbnNsYXRlX2V2ZW50Ci8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJbXNmX2Fzc2VydCgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBQcmludCBzdGF0ZW1lbnQgdXNlZCB0byBkaXNwbGF5IGFzc2VydHMgZnJvbSB3aXRoaW4gdGhlIEhDRi4gT25seSBjYWxsZWQKICogIHdoZW4gYXNzZXJ0cyBpbiB0aGUgSENGIGFyZSB0dXJuZWQgb24uIFNlZSBoY2ZjZmcuaCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgZmlsZV9uYW1lcCAgLSB0aGUgZmlsZW5hbWUgaW4gd2hpY2ggdGhlIGFzc2VydCBvY2N1cnJlZC4KICogICAgICBsaW5lX251bWJlciAtIHRoZSBsaW5lIG51bWJlciBvbiB3aGljaCB0aGUgYXNzZXJ0IG9jY3VycmVkLgogKiAgICAgIHRyYWNlICAgICAgIC0gYSBjb21tZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzZXJ0LgogKiAgICAgIHF1YWwgICAgICAgIC0gcmV0dXJuIGNvZGUgb3Igb3RoZXIgdmFsdWUgcmVsYXRlZCB0byB0aGUgYXNzZXJ0CiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE4vQQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIG1zZl9hc3NlcnQoIHVuc2lnbmVkIGludCBsaW5lX251bWJlciwgaGNmXzE2IHRyYWNlLCBoY2ZfMzIgcXVhbCApCnsKICAgIERCR19QUklOVCggIkhDRiBBU1NFUlQ6IExpbmUgJWQsIFZBTDogMHglLjh4XG4iLCBsaW5lX251bWJlciwgLyo7PyovKHUzMilxdWFsICk7Cn0gLy8gbXNmX2Fzc2VydAovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfcGFyc2VfZHNfaWUoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgVGhpcyBmdW5jdGlvbiBwYXJzZXMgdGhlIERpcmVjdCBTZXF1ZW5jZSBQYXJhbWV0ZXIgU2V0IElFLCB1c2VkIHRvCiAqICAgICAgZGV0ZXJtaW5lIGNoYW5uZWwvZnJlcXVlbmN5IGluZm9ybWF0aW9uLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBwcm9iZV9yc3AgLSBhIHBvaW50ZXIgdG8gYSBQUk9CRV9SRVNQIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBwcm9iZQogKiAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLgogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBUaGUgY2hhbm5lbCBvbiB3aGljaCB0aGUgQlNTIHJlcHJlc2VudGVkIGJ5IHRoaXMgcHJvYmUgcmVzcG9uc2UgaXMKICogICAgICB0cmFuc21pdHRpbmcuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmhjZl84IHdsX3BhcnNlX2RzX2llKCBQUk9CRV9SRVNQICpwcm9iZV9yc3AgKQp7CiAgICBpbnQgICAgIGk7CiAgICBpbnQgICAgIGllX2xlbmd0aCA9IDA7CiAgICBoY2ZfOCAgICpidWY7CiAgICBoY2ZfOCAgIGJ1Zl9zaXplOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCiAgICBpZiggcHJvYmVfcnNwID09IE5VTEwgKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgYnVmICAgICAgPSBwcm9iZV9yc3AtPnJhd0RhdGE7CiAgICBidWZfc2l6ZSA9IHNpemVvZiggcHJvYmVfcnNwLT5yYXdEYXRhICk7CgoKICAgIGZvciggaSA9IDA7IGkgPCBidWZfc2l6ZTsgaSsrICkgewogICAgICAgIGlmKCBidWZbaV0gPT0gRFNfSU5GT19FTEVNICkgewogICAgICAgICAgICAvKiBJbmNyZW1lbnQgYnkgMSB0byBnZXQgdGhlIGxlbmd0aCwgYW5kIHRlc3QgaXQ7IGluIGEgRFMgZWxlbWVudCwKICAgICAgICAgICAgICAgbGVuZ3RoIHNob3VsZCBhbHdheXMgYmUgMSAqLwogICAgICAgICAgICBpKys7CiAgICAgICAgICAgIGllX2xlbmd0aCA9IGJ1ZltpXTsKCiAgICAgICAgICAgIGlmKCBidWZbaV0gPT0gMSApIHsKICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgY2hhbm5lbCBpbmZvcm1hdGlvbiAqLwogICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZltpXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKiBJZiB3ZSBnZXQgaGVyZSwgd2UgZGlkbid0IGZpbmQgYSBEUy1JRSwgd2hpY2ggaXMgc3RyYW5nZSAqLwogICAgcmV0dXJuIDA7Cn0gLy8gd2xfcGFyc2VfZHNfaWUKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9wYXJzZV93cGFfaWUoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgVGhpcyBmdW5jdGlvbiBwYXJzZXMgdGhlIFByb2JlIFJlc3BvbnNlIGZvciBhIHZhbGlkIFdQQS1JRS4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgcHJvYmVfcnNwIC0gYSBwb2ludGVyIHRvIGEgUFJPQkVfUkVTUCBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgcHJvYmUKICogICAgICAgICAgICAgICAgICByZXNwb25zZQogKiAgICAgIGxlbmd0aCAgICAtIGEgcG9pbnRlciB0byBhbiBoY2ZfMTYgaW4gd2hpY2ggdGhlIHNpemUgb2YgdGhlIFdQQS1JRSB3aWxsCiAqICAgICAgICAgICAgICAgICAgYmUgc3RvcmVkIChpZiBmb3VuZCkuCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIEEgcG9pbnRlciB0byB0aGUgbG9jYXRpb24gaW4gdGhlIHByb2JlIHJlc3BvbnNlIGJ1ZmZlciB3aGVyZSBhIHZhbGlkCiAqICAgICAgV1BBLUlFIGxpdmVzLiBUaGUgbGVuZ3RoIG9mIHRoaXMgSUUgaXMgd3JpdHRlbiBiYWNrIHRvIHRoZSAnbGVuZ3RoJwogKiAgICAgIGFyZ3VtZW50IHBhc3NlZCB0byB0aGUgZnVuY3Rpb24uCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmhjZl84ICogd2xfcGFyc2Vfd3BhX2llKCBQUk9CRV9SRVNQICpwcm9iZV9yc3AsIGhjZl8xNiAqbGVuZ3RoICkKewogICAgaW50ICAgICBpOwogICAgaW50ICAgICBpZV9sZW5ndGggPSAwOwogICAgaGNmXzggICAqYnVmOwogICAgaGNmXzggICBidWZfc2l6ZTsKICAgIGhjZl84ICAgd3BhX291aVtdID0gV1BBX09VSV9UWVBFOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCiAgICBpZiggcHJvYmVfcnNwID09IE5VTEwgfHwgbGVuZ3RoID09IE5VTEwgKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgYnVmICAgICAgPSBwcm9iZV9yc3AtPnJhd0RhdGE7CiAgICBidWZfc2l6ZSA9IHNpemVvZiggcHJvYmVfcnNwLT5yYXdEYXRhICk7CiAgICAqbGVuZ3RoICA9IDA7CgoKICAgIGZvciggaSA9IDA7IGkgPCBidWZfc2l6ZTsgaSsrICkgewogICAgICAgIGlmKCBidWZbaV0gPT0gR0VORVJJQ19JTkZPX0VMRU0gKSB7CiAgICAgICAgICAgIC8qIEluY3JlbWVudCBieSBvbmUgdG8gZ2V0IHRoZSBJRSBsZW5ndGggKi8KICAgICAgICAgICAgaSsrOwogICAgICAgICAgICBpZV9sZW5ndGggPSBwcm9iZV9yc3AtPnJhd0RhdGFbaV07CgogICAgICAgICAgICAvKiBJbmNyZW1lbnQgYnkgb25lIHRvIHBvaW50IHRvIHRoZSBJRSBwYXlsb2FkICovCiAgICAgICAgICAgIGkrKzsKCiAgICAgICAgICAgIC8qIERvZXMgdGhlIElFIGNvbnRhaW4gYSBXUEEgT1VJPyBJZiBub3QsIGl0J3MgYSBwcm9wcmlldGFyeSBJRSAqLwogICAgICAgICAgICBpZiggbWVtY21wKCAmYnVmW2ldLCAmd3BhX291aSwgV1BBX1NFTEVDVE9SX0xFTiApID09IDAgKSB7CiAgICAgICAgICAgICAgICAvKiBQYXNzIGJhY2sgbGVuZ3RoIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBXUEEtSUUgKi8KICAgICAgICAgICAgICAgIC8qIE5PVEU6IExlbmd0aCBjb250YWluZWQgaW4gdGhlIFdQQS1JRSBpcyBvbmx5IHRoZSBsZW5ndGggb2YKICAgICAgICAgICAgICAgICAgIHRoZSBwYXlsb2FkLiBUaGUgZW50aXJlIFdQQS1JRSwgaW5jbHVkaW5nIHRoZSBJRSBpZGVudGlmaWVyCiAgICAgICAgICAgICAgICAgICBhbmQgdGhlIGxlbmd0aCwgaXMgMiBieXRlcyBsYXJnZXIgKi8KICAgICAgICAgICAgICAgICpsZW5ndGggPSBpZV9sZW5ndGggKyAyOwoKICAgICAgICAgICAgICAgIC8qIEJhY2sgdXAgdGhlIHBvaW50ZXIgMiBieXRlcyB0byBpbmNsdWRlIHRoZSBJRSBpZGVudGlmaWVyIGFuZAogICAgICAgICAgICAgICAgICAgdGhlIGxlbmd0aCBpbiB0aGUgYnVmZmVyIHJldHVybmVkICovCiAgICAgICAgICAgICAgICBpIC09IDI7CiAgICAgICAgICAgICAgICByZXR1cm4gJmJ1ZltpXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogSW5jcmVtZW50IHBhc3QgdGhpcyBub24tV1BBIElFIGFuZCBjb250aW51ZSBsb29raW5nICovCiAgICAgICAgICAgIGkgKz0gKCBpZV9sZW5ndGggLSAxICk7CiAgICAgICAgfQogICAgfQoKICAgIC8qIElmIHdlJ3JlIGhlcmUsIHdlIGRpZG4ndCBmaW5kIGEgV1BBLUlFIGluIHRoZSBidWZmZXIgKi8KICAgIHJldHVybiBOVUxMOwp9IC8vIHdsX3BhcnNlX3dwYV9pZQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3ByaW50X3dwYV9pZSgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBGdW5jdGlvbiB1c2VkIHRvIHRha2UgYSBXUEEgSW5mb3JtYXRpb24gRWxlbWVudCAoV1BBLUlFKSBidWZmZXIgYW5kCiAqICAgICAgZGlzcGxheSBpdCBpbiBhIHJlYWRhYmxlIGZvcm1hdC4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgYnVmZmVyIC0gdGhlIGJ5dGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIFdQQS1JRQogKiAgICAgIGxlbmd0aCAtIHRoZSBsZW5ndGggb2YgdGhlIGFib3ZlIGJ1ZmZlcgogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBBIHBvaW50ZXIgdG8gdGhlIGZvcm1hdHRlZCBXUEEtSUUgc3RyaW5nLiBOb3RlIHRoYXQgdGhlIGZvcm1hdCB1c2VkIGlzCiAqICAgICAgYnl0ZS1ieS1ieXRlIHByaW50aW5nIGFzICUwMnggaGV4IHZhbHVlcyB3aXRoIG5vIHNwYWNlcy4gVGhpcyBpcwogKiAgICAgIHJlcXVpcmVkIGZvciBwcm9wZXIgb3BlcmF0aW9uIHdpdGggc29tZSBXUEEgc3VwcGxpY2FudHMuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmhjZl84ICogd2xfcHJpbnRfd3BhX2llKCBoY2ZfOCAqYnVmZmVyLCBpbnQgbGVuZ3RoICkKewogICAgaW50IGNvdW50OwogICAgaW50IHJvd3M7CiAgICBpbnQgcmVtYWluZGVyOwogICAgaW50IHJvd3NpemUgPSA0OwogICAgaGNmXzggcm93X2J1Zls2NF07CiAgICBzdGF0aWMgaGNmXzggb3V0cHV0WzUxMl07CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKICAgIG1lbXNldCggb3V0cHV0LCAwLCBzaXplb2YoIG91dHB1dCApKTsKICAgIG1lbXNldCggcm93X2J1ZiwgMCwgc2l6ZW9mKCByb3dfYnVmICkpOwoKCiAgICAvKiBEZXRlcm1pbmUgaG93IG1hbnkgcm93cyB3aWxsIGJlIG5lZWRlZCwgYW5kIHRoZSByZW1haW5kZXIgKi8KICAgIHJvd3MgPSBsZW5ndGggLyByb3dzaXplOwogICAgcmVtYWluZGVyID0gbGVuZ3RoICUgcm93c2l6ZTsKCgogICAgLyogRm9ybWF0IHRoZSByb3dzICovCiAgICBmb3IoIGNvdW50ID0gMDsgY291bnQgPCByb3dzOyBjb3VudCsrICkgewogICAgICAgIHNwcmludGYoIHJvd19idWYsICIlMDJ4JTAyeCUwMnglMDJ4IiwKICAgICAgICAgICAgICAgICBidWZmZXJbY291bnQqcm93c2l6ZV0sIGJ1ZmZlcltjb3VudCpyb3dzaXplKzFdLAogICAgICAgICAgICAgICAgIGJ1ZmZlcltjb3VudCpyb3dzaXplKzJdLCBidWZmZXJbY291bnQqcm93c2l6ZSszXSk7CiAgICAgICAgc3RyY2F0KCBvdXRwdXQsIHJvd19idWYgKTsKICAgIH0KCiAgICBtZW1zZXQoIHJvd19idWYsIDAsIHNpemVvZiggcm93X2J1ZiApKTsKCgogICAgLyogRm9ybWF0IHRoZSByZW1haW5kZXIgKi8KICAgIGZvciggY291bnQgPSAwOyBjb3VudCA8IHJlbWFpbmRlcjsgY291bnQrKyApIHsKICAgICAgICBzcHJpbnRmKCByb3dfYnVmLCAiJTAyeCIsIGJ1ZmZlclsocm93cypyb3dzaXplKStjb3VudF0pOwogICAgICAgIHN0cmNhdCggb3V0cHV0LCByb3dfYnVmICk7CiAgICB9CgogICAgcmV0dXJuIG91dHB1dDsKfSAvLyB3bF9wcmludF93cGFfaWUKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX2lzX2FfdmFsaWRfY2hhbigpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBDaGVja3MgaWYgYSBnaXZlbiBjaGFubmVsIGlzIHZhbGlkCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGNoYW5uZWwgLSB0aGUgY2hhbm5lbAogKgogKiAgUkVUVVJOUzoKICoKICogICAgICAxIGlmIFRSVUUKICogICAgICAwIGlmIEZBTFNFCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF9pc19hX3ZhbGlkX2NoYW4oIGludCBjaGFubmVsICkKewogICAgaW50IGk7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKICAgIC8qIFN0cmlwIG91dCB0aGUgaGlnaCBiaXQgc2V0IGJ5IHRoZSBGVyBmb3IgODAyLjExYSBjaGFubmVscyAqLwogICAgaWYoIGNoYW5uZWwgJiAweDEwMCApIHsKICAgICAgICBjaGFubmVsID0gY2hhbm5lbCAmIDB4MEZGOwogICAgfQoKICAgIC8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgbWF0cml4IGFuZCByZXRyaWV2ZSB0aGUgZnJlcXVlbmN5ICovCiAgICBmb3IoIGkgPSAwOyBpIDwgTUFYX0NIQU5fRlJFUV9NQVBfRU5UUklFUzsgaSsrICkgewogICAgICAgIGlmKCBjaGFuX2ZyZXFfbGlzdFtpXVswXSA9PSBjaGFubmVsICkgewogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDA7Cn0gLy8gd2xfaXNfYV92YWxpZF9jaGFuCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9nZXRfY2hhbl9mcm9tX2ZyZXEoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgQ2hlY2tzIGlmIGEgZ2l2ZW4gZnJlcXVlbmN5IGlzIHZhbGlkCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGZyZXEgLSB0aGUgZnJlcXVlbmN5CiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIDEgaWYgVFJVRQogKiAgICAgIDAgaWYgRkFMU0UKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHdsX2lzX2FfdmFsaWRfZnJlcSggbG9uZyBmcmVxdWVuY3kgKQp7CiAgICBpbnQgaTsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgogICAgLyogSXRlcmF0ZSB0aHJvdWdoIHRoZSBtYXRyaXggYW5kIHJldHJpZXZlIHRoZSBjaGFubmVsICovCiAgICBmb3IoIGkgPSAwOyBpIDwgTUFYX0NIQU5fRlJFUV9NQVBfRU5UUklFUzsgaSsrICkgewogICAgICAgIGlmKCBjaGFuX2ZyZXFfbGlzdFtpXVsxXSA9PSBmcmVxdWVuY3kgKSB7CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMDsKfSAvLyB3bF9pc19hX3ZhbGlkX2ZyZXEKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX2dldF9mcmVxX2Zyb21fY2hhbigpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBGdW5jdGlvbiB1c2VkIHRvIGxvb2sgdXAgdGhlIGZyZXF1ZW5jeSBmb3IgYSBnaXZlbiBjaGFubmVsIG9uIHdoaWNoIHRoZQogKiAgICAgIGFkYXB0ZXIgaXMgVHgvUnguCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGNoYW5uZWwgLSB0aGUgY2hhbm5lbAogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBUaGUgY29ycmVzcG9uZGluZyBmcmVxdWVuY3kKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KbG9uZyB3bF9nZXRfZnJlcV9mcm9tX2NoYW4oIGludCBjaGFubmVsICkKewogICAgaW50IGk7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKICAgIC8qIFN0cmlwIG91dCB0aGUgaGlnaCBiaXQgc2V0IGJ5IHRoZSBGVyBmb3IgODAyLjExYSBjaGFubmVscyAqLwogICAgaWYoIGNoYW5uZWwgJiAweDEwMCApIHsKICAgICAgICBjaGFubmVsID0gY2hhbm5lbCAmIDB4MEZGOwogICAgfQoKICAgIC8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgbWF0cml4IGFuZCByZXRyaWV2ZSB0aGUgZnJlcXVlbmN5ICovCiAgICBmb3IoIGkgPSAwOyBpIDwgTUFYX0NIQU5fRlJFUV9NQVBfRU5UUklFUzsgaSsrICkgewogICAgICAgIGlmKCBjaGFuX2ZyZXFfbGlzdFtpXVswXSA9PSBjaGFubmVsICkgewogICAgICAgICAgICByZXR1cm4gY2hhbl9mcmVxX2xpc3RbaV1bMV07CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAwOwp9IC8vIHdsX2dldF9mcmVxX2Zyb21fY2hhbgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfZ2V0X2NoYW5fZnJvbV9mcmVxKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIEZ1bmN0aW9uIHVzZWQgdG8gbG9vayB1cCB0aGUgY2hhbm5lbCBmb3IgYSBnaXZlbiBmcmVxdWVuY3kgb24gd2hpY2ggdGhlCiAqICAgICAgYWRhcHRlciBpcyBUeC9SeC4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgZnJlcXVlbmN5IC0gdGhlIGZyZXF1ZW5jeQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBUaGUgY29ycmVzcG9uZGluZyBjaGFubmVsCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF9nZXRfY2hhbl9mcm9tX2ZyZXEoIGxvbmcgZnJlcXVlbmN5ICkKewogICAgaW50IGk7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKICAgIC8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgbWF0cml4IGFuZCByZXRyaWV2ZSB0aGUgY2hhbm5lbCAqLwogICAgZm9yKCBpID0gMDsgaSA8IE1BWF9DSEFOX0ZSRVFfTUFQX0VOVFJJRVM7IGkrKyApIHsKICAgICAgICBpZiggY2hhbl9mcmVxX2xpc3RbaV1bMV0gPT0gZnJlcXVlbmN5ICkgewogICAgICAgICAgICByZXR1cm4gY2hhbl9mcmVxX2xpc3RbaV1bMF07CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAwOwp9IC8vIHdsX2dldF9jaGFuX2Zyb21fZnJlcQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfcHJvY2Vzc19saW5rX3N0YXR1cygpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBQcm9jZXNzIHRoZSBsaW5rIHN0YXR1cyBtZXNzYWdlIHNpZ25hbGVkIGJ5IHRoZSBkZXZpY2UuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGxwIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBOL0EKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCB3bF9wcm9jZXNzX2xpbmtfc3RhdHVzKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQp7CiAgICBoY2ZfMTYgbGlua19zdGF0OwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIERCR19GVU5DKCAid2xfcHJvY2Vzc19saW5rX3N0YXR1cyIgKTsKICAgIERCR19FTlRFUiggRGJnSW5mbyApOwoKICAgIGlmKCBscCAhPSBOVUxMICkgewogICAgICAgIC8vbGlua19zdGF0ID0gbHAtPmhjZkN0eC5JRkJfRFNMaW5rU3RhdCAmIENGR19MSU5LX1NUQVRfRlc7CiAgICAgICAgbGlua19zdGF0ID0gbHAtPmhjZkN0eC5JRkJfTGlua1N0YXQgJiBDRkdfTElOS19TVEFUX0ZXOwogICAgICAgIHN3aXRjaCggbGlua19zdGF0ICkgewogICAgICAgIGNhc2UgMToKICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiTGluayBTdGF0dXMgOiBDb25uZWN0ZWRcbiIgKTsKICAgICAgICAgICAgd2xfd2V4dF9ldmVudF9hcCggbHAtPmRldiApOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIkxpbmsgU3RhdHVzIDogRGlzY29ubmVjdGVkXG4iICApOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIkxpbmsgU3RhdHVzIDogQWNjZXNzIFBvaW50IENoYW5nZVxuIiApOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIkxpbmsgU3RhdHVzIDogQWNjZXNzIFBvaW50IE91dCBvZiBSYW5nZVxuIiApOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIkxpbmsgU3RhdHVzIDogQWNjZXNzIFBvaW50IEluIFJhbmdlXG4iICk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIkxpbmsgU3RhdHVzIDogVU5LTk9XTiAoMHglMDR4KVxuIiwgbGlua19zdGF0ICk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIERCR19MRUFWRSggRGJnSW5mbyApOwogICAgcmV0dXJuOwp9IC8vIHdsX3Byb2Nlc3NfbGlua19zdGF0dXMKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3Byb2Nlc3NfcHJvYmVfcmVzcG9uc2UoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgUHJvY2VzcyB0aGUgcHJvYmUgcmVzcG9uc2VzIHJldHVucmVkIGJ5IHRoZSBkZXZpY2UgYXMgYSByZXN1bHQgb2YgYW4KICogICAgICBhY3RpdmUgc2Nhbi4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgbHAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgc3RydWN0dXJlCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE4vQQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHdsX3Byb2Nlc3NfcHJvYmVfcmVzcG9uc2UoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCnsKICAgIFBST0JFX1JFU1AgICpwcm9iZV9yc3A7CiAgICBoY2ZfOCAgICAgICAqd3BhX2llID0gTlVMTDsKICAgIGhjZl8xNiAgICAgIHdwYV9pZV9sZW4gPSAwOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCiAgICBEQkdfRlVOQyggIndsX3Byb2Nlc3NfcHJvYmVfcmVzcG9uc2UiICk7CiAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKCgogICAgaWYoIGxwICE9IE5VTEwgKSB7CiAgICAgICAgcHJvYmVfcnNwID0gKFBST0JFX1JFU1AgKikmbHAtPlByb2JlUmVzcDsKCiAgICAgICAgd2xfZW5kaWFuX3RyYW5zbGF0ZV9ldmVudCggKGx0dl90ICopcHJvYmVfcnNwICk7CgogICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIiglcykgPT09PT09PT09PT09PT09PT09PT09PT09PVxuIiwgbHAtPmRldi0+bmFtZSApOwogICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIiglcykgbGVuZ3RoICAgICAgOiAweCUwNHguXG4iLCAgbHAtPmRldi0+bmFtZSwKICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+bGVuZ3RoICk7CgogICAgICAgIGlmKCBwcm9iZV9yc3AtPmxlbmd0aCA+IDEgKSB7CiAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIiglcykgaW5mb1R5cGUgICAgOiAweCUwNHguXG4iLCBscC0+ZGV2LT5uYW1lLAogICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+aW5mb1R5cGUgKTsKCiAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIiglcykgc2lnbmFsICAgICAgOiAweCUwMnguXG4iLCBscC0+ZGV2LT5uYW1lLAogICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+c2lnbmFsICk7CgogICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIHNpbGVuY2UgICAgIDogMHglMDJ4LlxuIiwgbHAtPmRldi0+bmFtZSwKICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPnNpbGVuY2UgKTsKCiAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIiglcykgcnhGbG93ICAgICAgOiAweCUwMnguXG4iLCBscC0+ZGV2LT5uYW1lLAogICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+cnhGbG93ICk7CgogICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIHJhdGUgICAgICAgIDogMHglMDJ4LlxuIiwgbHAtPmRldi0+bmFtZSwKICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPnJhdGUgKTsKCiAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIiglcykgZnJhbWUgY250bCAgOiAweCUwNHguXG4iLCBscC0+ZGV2LT5uYW1lLAogICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+ZnJhbWVDb250cm9sICk7CgogICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIGR1cklEICAgICAgIDogMHglMDR4LlxuIiwgbHAtPmRldi0+bmFtZSwKICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPmR1cklEICk7CgogICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIGFkZHJlc3MxICAgIDogJXNcbiIsIGxwLT5kZXYtPm5hbWUsCiAgICAgICAgICAgICAgICAgICAgRGJnSHdBZGRyKCBwcm9iZV9yc3AtPmFkZHJlc3MxICkpOwoKICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBhZGRyZXNzMiAgICA6ICVzXG4iLCBscC0+ZGV2LT5uYW1lLAogICAgICAgICAgICAgICAgICAgIERiZ0h3QWRkciggcHJvYmVfcnNwLT5hZGRyZXNzMiApKTsKCiAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIiglcykgQlNTSUQgICAgICAgOiAlc1xuIiwgbHAtPmRldi0+bmFtZSwKICAgICAgICAgICAgICAgICAgICBEYmdId0FkZHIoIHByb2JlX3JzcC0+QlNTSUQgKSk7CgogICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIHNlcXVlbmNlICAgIDogMHglMDR4LlxuIiwgbHAtPmRldi0+bmFtZSwKICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPnNlcXVlbmNlICk7CgogICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIGFkZHJlc3M0ICAgIDogJXNcbiIsIGxwLT5kZXYtPm5hbWUsCiAgICAgICAgICAgICAgICAgICAgRGJnSHdBZGRyKCBwcm9iZV9yc3AtPmFkZHJlc3M0ICkpOwoKICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBkYXRhbGVuZ3RoICA6IDB4JTA0eC5cbiIsIGxwLT5kZXYtPm5hbWUsCiAgICAgICAgICAgICAgICAgICAgcHJvYmVfcnNwLT5kYXRhTGVuZ3RoICk7CgogICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIERBICAgICAgICAgIDogJXNcbiIsIGxwLT5kZXYtPm5hbWUsCiAgICAgICAgICAgICAgICAgICAgRGJnSHdBZGRyKCBwcm9iZV9yc3AtPkRBICkpOwoKICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBTQSAgICAgICAgICA6ICVzXG4iLCBscC0+ZGV2LT5uYW1lLAogICAgICAgICAgICAgICAgICAgIERiZ0h3QWRkciggcHJvYmVfcnNwLT5TQSApKTsKCiNpZmRlZiBXQVJQCgogICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIGNoYW5uZWwgICAgIDogJWRcbiIsIGxwLT5kZXYtPm5hbWUsCiAgICAgICAgICAgICAgICAgICAgcHJvYmVfcnNwLT5jaGFubmVsICk7CgogICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIGJhbmQgICAgICAgIDogJWRcbiIsIGxwLT5kZXYtPm5hbWUsCiAgICAgICAgICAgICAgICAgICAgcHJvYmVfcnNwLT5iYW5kICk7CiNlbHNlCiAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIiglcykgbGVuVHlwZSAgICAgOiAweCUwNHguXG4iLCBscC0+ZGV2LT5uYW1lLAogICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+bGVuVHlwZSApOwojZW5kaWYgIC8vIFdBUlAKCiAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIiglcykgdGltZVN0YW1wICAgOiAlZC4lZC4lZC4lZC4lZC4lZC4lZC4lZFxuIiwKICAgICAgICAgICAgICAgICAgICBscC0+ZGV2LT5uYW1lLAogICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+dGltZVN0YW1wWzBdLAogICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+dGltZVN0YW1wWzFdLAogICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+dGltZVN0YW1wWzJdLAogICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+dGltZVN0YW1wWzNdLAogICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+dGltZVN0YW1wWzRdLAogICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+dGltZVN0YW1wWzVdLAogICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+dGltZVN0YW1wWzZdLAogICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+dGltZVN0YW1wWzddKTsKCiAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIiglcykgYmVhY29uSW50ICAgOiAweCUwNHguXG4iLCBscC0+ZGV2LT5uYW1lLAogICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+YmVhY29uSW50ZXJ2YWwgKTsKCiAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIiglcykgY2FwYWJpbGl0eSAgOiAweCUwNHguXG4iLCBscC0+ZGV2LT5uYW1lLAogICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+Y2FwYWJpbGl0eSApOwoKICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBTU0lEIGxlbiAgICA6IDB4JTA0eC5cbiIsIGxwLT5kZXYtPm5hbWUsCiAgICAgICAgICAgICAgICAgICAgcHJvYmVfcnNwLT5yYXdEYXRhWzFdICk7CgoKICAgICAgICAgICAgaWYoIHByb2JlX3JzcC0+cmF3RGF0YVsxXSA+IDAgKSB7CiAgICAgICAgICAgICAgICBjaGFyIHNzaWRbSENGX01BWF9OQU1FX0xFTl07CgogICAgICAgICAgICAgICAgbWVtc2V0KCBzc2lkLCAwLCBzaXplb2YoIHNzaWQgKSk7CiAgICAgICAgICAgICAgICBzdHJuY3B5KCBzc2lkLCAmcHJvYmVfcnNwLT5yYXdEYXRhWzJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmVfcnNwLT5yYXdEYXRhWzFdICk7CgogICAgICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBTU0lEICAgICAgICA6ICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAtPmRldi0+bmFtZSwgc3NpZCApOwogICAgICAgICAgICB9CgoKICAgICAgICAgICAgLyogUGFyc2Ugb3V0IHRoZSBXUEEtSUUsIGlmIG9uZSBleGlzdHMgKi8KICAgICAgICAgICAgd3BhX2llID0gd2xfcGFyc2Vfd3BhX2llKCBwcm9iZV9yc3AsICZ3cGFfaWVfbGVuICk7CiAgICAgICAgICAgIGlmKCB3cGFfaWUgIT0gTlVMTCApIHsKICAgICAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIiglcykgV1BBLUlFICAgICAgOiAlc1xuIiwKICAgICAgICAgICAgICAgIGxwLT5kZXYtPm5hbWUsIHdsX3ByaW50X3dwYV9pZSggd3BhX2llLCB3cGFfaWVfbGVuICkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIGZsYWdzICAgICAgIDogMHglMDR4LlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgbHAtPmRldi0+bmFtZSwgcHJvYmVfcnNwLT5mbGFncyApOwogICAgICAgIH0KCiAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiXG4iICk7CgoKICAgICAgICAvKiBJZiBwcm9iZSByZXNwb25zZSBsZW5ndGggaXMgMSwgdGhlbiB0aGUgc2NhbiBpcyBjb21wbGV0ZSAqLwogICAgICAgIGlmKCBwcm9iZV9yc3AtPmxlbmd0aCA9PSAxICkgewogICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJTQ0FOIENPTVBMRVRFXG4iICk7CiAgICAgICAgICAgIGxwLT5wcm9iZV9yZXN1bHRzLm51bV9hcHMgPSBscC0+cHJvYmVfbnVtX2FwczsKICAgICAgICAgICAgbHAtPnByb2JlX3Jlc3VsdHMuc2Nhbl9jb21wbGV0ZSA9IFRSVUU7CgogICAgICAgICAgICAvKiBSZXNldCB0aGUgY291bnRlciBmb3IgdGhlIG5leHQgc2NhbiByZXF1ZXN0ICovCiAgICAgICAgICAgIGxwLT5wcm9iZV9udW1fYXBzID0gMDsKCiAgICAgICAgICAgIC8qIFNlbmQgYSB3aXJlbGVzcyBleHRlbnNpb25zIGV2ZW50IHRoYXQgdGhlIHNjYW4gY29tcGxldGVkICovCiAgICAgICAgICAgIHdsX3dleHRfZXZlbnRfc2Nhbl9jb21wbGV0ZSggbHAtPmRldiApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8qIE9ubHkgY29weSB0byB0aGUgdGFibGUgaWYgdGhlIGVudHJ5IGlzIHVuaXF1ZTsgQVBzIHNvbWV0aW1lcwogICAgICAgICAgICAgICAgcmVzcG9uZCBtb3JlIHRoYW4gb25jZSB0byBhIHByb2JlICovCiAgICAgICAgICAgIGlmKCBscC0+cHJvYmVfbnVtX2FwcyA9PSAwICkgewogICAgICAgICAgICAgICAgLyogQ29weSB0aGUgaW5mbyB0byB0aGUgU2NhblJlc3VsdCBzdHJ1Y3R1cmUgaW4gdGhlIHByaXZhdGUKICAgICAgICAgICAgICAgIGFkYXB0ZXIgc3RydWN0ICovCiAgICAgICAgICAgICAgICBtZW1jcHkoICYoIGxwLT5wcm9iZV9yZXN1bHRzLlByb2JlVGFibGVbbHAtPnByb2JlX251bV9hcHNdICksCiAgICAgICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcCwgc2l6ZW9mKCBQUk9CRV9SRVNQICkpOwoKICAgICAgICAgICAgICAgIC8qIEluY3JlbWVudCB0aGUgbnVtYmVyIG9mIEFQcyBkZXRlY3RlZCAqLwogICAgICAgICAgICAgICAgbHAtPnByb2JlX251bV9hcHMrKzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGludCBjb3VudDsKICAgICAgICAgICAgICAgIGludCB1bmlxdWUgPSAxOwoKICAgICAgICAgICAgICAgIGZvciggY291bnQgPSAwOyBjb3VudCA8IGxwLT5wcm9iZV9udW1fYXBzOyBjb3VudCsrICkgewogICAgICAgICAgICAgICAgICAgIGlmKCBtZW1jbXAoICYoIHByb2JlX3JzcC0+QlNTSUQgKSwKICAgICAgICAgICAgICAgICAgICAgICAgbHAtPnByb2JlX3Jlc3VsdHMuUHJvYmVUYWJsZVtjb3VudF0uQlNTSUQsCiAgICAgICAgICAgICAgICAgICAgICAgIEVUSF9BTEVOICkgPT0gMCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYoIHVuaXF1ZSApIHsKICAgICAgICAgICAgICAgICAgICAvKiBDb3B5IHRoZSBpbmZvIHRvIHRoZSBTY2FuUmVzdWx0IHN0cnVjdHVyZSBpbiB0aGUKICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGFkYXB0ZXIgc3RydWN0LiBPbmx5IGNvcHkgaWYgdGhlcmUncyByb29tIGluIHRoZQogICAgICAgICAgICAgICAgICAgIHRhYmxlICovCiAgICAgICAgICAgICAgICAgICAgaWYoIGxwLT5wcm9iZV9udW1fYXBzIDwgTUFYX05BUFMgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCAmKCBscC0+cHJvYmVfcmVzdWx0cy5Qcm9iZVRhYmxlW2xwLT5wcm9iZV9udW1fYXBzXSApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcCwgc2l6ZW9mKCBQUk9CRV9SRVNQICkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBEQkdfV0FSTklORyggRGJnSW5mbywgIk51bSBvZiBzY2FuIHJlc3VsdHMgZXhjZWVkcyBzdG9yYWdlLCB0cnVuY2F0aW5nXG4iICk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvKiBJbmNyZW1lbnQgdGhlIG51bWJlciBvZiBBUHMgZGV0ZWN0ZWQuIE5vdGUgSSBkbyB0aGlzCiAgICAgICAgICAgICAgICAgICAgICAgIGhlcmUgZXZlbiB3aGVuIEkgZG9uJ3QgY29weSB0aGUgcHJvYmUgcmVzcG9uc2UgdG8gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciBpbiBvcmRlciB0byBkZXRlY3QgdGhlIG92ZXJmbG93IGNvbmRpdGlvbiAqLwogICAgICAgICAgICAgICAgICAgIGxwLT5wcm9iZV9udW1fYXBzKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CiAgICByZXR1cm47Cn0gLy8gd2xfcHJvY2Vzc19wcm9iZV9yZXNwb25zZQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfcHJvY2Vzc191cGRhdGVkX3JlY29yZCgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBQcm9jZXNzIHRoZSB1cGRhdGVkIGluZm9ybWF0aW9uIHJlY29yZCBtZXNzYWdlIHNpZ25hbGVkIGJ5IHRoZSBkZXZpY2UuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGxwIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBOL0EKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCB3bF9wcm9jZXNzX3VwZGF0ZWRfcmVjb3JkKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQp7CiAgICBEQkdfRlVOQyggIndsX3Byb2Nlc3NfdXBkYXRlZF9yZWNvcmQiICk7CiAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKCgogICAgaWYoIGxwICE9IE5VTEwgKSB7CiAgICAgICAgbHAtPnVwZGF0ZWRSZWNvcmQudS51MTZbMF0gPSBDTlZfTElUVExFX1RPX0lOVCggbHAtPnVwZGF0ZWRSZWNvcmQudS51MTZbMF0gKTsKCiAgICAgICAgc3dpdGNoKCBscC0+dXBkYXRlZFJlY29yZC51LnUxNlswXSApIHsKICAgICAgICBjYXNlIENGR19DVVJfQ09VTlRSWV9JTkZPOgogICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJVcGRhdGVkIFJlY29yZDogQ0ZHX0NVUl9DT1VOVFJZX0lORk9cbiIgKTsKICAgICAgICAgICAgd2xfY29ubmVjdCggbHAgKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgQ0ZHX1BPUlRfU1RBVDoKICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiVXBkYXRlZCBSZWNvcmQ6IFdBSVRfRk9SX0NPTk5FQ1QgKDB4RkQ0MClcbiIgKTsKICAgICAgICAgICAgLy93bF9jb25uZWN0KCBscCApOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiVU5LTk9XTjogMHglMDR4XG4iLAogICAgICAgICAgICAgICAgICAgICAgIGxwLT51cGRhdGVkUmVjb3JkLnUudTE2WzBdICk7CiAgICAgICAgfQogICAgfQoKICAgIERCR19MRUFWRSggRGJnSW5mbyApOwogICAgcmV0dXJuOwp9IC8vIHdsX3Byb2Nlc3NfdXBkYXRlZF9yZWNvcmQKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3Byb2Nlc3NfYXNzb2Nfc3RhdHVzKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFByb2Nlc3MgdGhlIGFzc29jaWF0aW9uIHN0YXR1cyBldmVudCBzaWduYWxlZCBieSB0aGUgZGV2aWNlLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBscCAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBzdHJ1Y3R1cmUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgTi9BCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgd2xfcHJvY2Vzc19hc3NvY19zdGF0dXMoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCnsKICAgIEFTU09DX1NUQVRVU19TVFJDVCAqYXNzb2Nfc3RhdDsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgogICAgREJHX0ZVTkMoICJ3bF9wcm9jZXNzX2Fzc29jX3N0YXR1cyIgKTsKICAgIERCR19FTlRFUiggRGJnSW5mbyApOwoKCiAgICBpZiggbHAgIT0gTlVMTCApIHsKICAgICAgICBhc3NvY19zdGF0ID0gKEFTU09DX1NUQVRVU19TVFJDVCAqKSZscC0+YXNzb2Nfc3RhdDsKCiAgICAgICAgd2xfZW5kaWFuX3RyYW5zbGF0ZV9ldmVudCggKGx0dl90ICopYXNzb2Nfc3RhdCApOwoKICAgICAgICBzd2l0Y2goIGFzc29jX3N0YXQtPmFzc29jU3RhdHVzICkgewogICAgICAgIGNhc2UgMToKICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiQXNzb2NpYXRpb24gU3RhdHVzIDogU1RBIEFzc29jaWF0ZWRcbiIgKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiQXNzb2NpYXRpb24gU3RhdHVzIDogU1RBIFJlYXNzb2NpYXRlZFxuIiApOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAzOgogICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJBc3NvY2lhdGlvbiBTdGF0dXMgOiBTVEEgRGlzYXNzb2NpYXRlZFxuIiApOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiQXNzb2NpYXRpb24gU3RhdHVzIDogVU5LTk9XTiAoMHglMDR4KVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgYXNzb2Nfc3RhdC0+YXNzb2NTdGF0dXMgKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJTVEEgQWRkcmVzcyAgICAgICAgOiAlc1xuIiwKICAgICAgICAgICAgICAgICAgICBEYmdId0FkZHIoIGFzc29jX3N0YXQtPnN0YUFkZHIgKSk7CgogICAgICAgIGlmKCggYXNzb2Nfc3RhdC0+YXNzb2NTdGF0dXMgPT0gMiApICAmJiAoIGFzc29jX3N0YXQtPmxlbiA9PSA4ICkpIHsKICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiT2xkIEFQIEFkZHJlc3MgICAgIDogJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIERiZ0h3QWRkciggYXNzb2Nfc3RhdC0+b2xkQXBBZGRyICkpOwogICAgICAgIH0KICAgIH0KCiAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgIHJldHVybjsKfSAvLyB3bF9wcm9jZXNzX2Fzc29jX3N0YXR1cwovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfcHJvY2Vzc19zZWN1cml0eV9zdGF0dXMoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgUHJvY2VzcyB0aGUgc2VjdXJpdHkgc3RhdHVzIG1lc3NhZ2Ugc2lnbmFsZWQgYnkgdGhlIGRldmljZS4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgbHAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgc3RydWN0dXJlCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE4vQQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHdsX3Byb2Nlc3Nfc2VjdXJpdHlfc3RhdHVzKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQp7CiAgICBTRUNVUklUWV9TVEFUVVNfU1RSQ1QgKnNlY19zdGF0OwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCiAgICBEQkdfRlVOQyggIndsX3Byb2Nlc3Nfc2VjdXJpdHlfc3RhdHVzIiApOwogICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CgoKICAgIGlmKCBscCAhPSBOVUxMICkgewogICAgICAgIHNlY19zdGF0ID0gKFNFQ1VSSVRZX1NUQVRVU19TVFJDVCAqKSZscC0+c2VjX3N0YXQ7CgogICAgICAgIHdsX2VuZGlhbl90cmFuc2xhdGVfZXZlbnQoIChsdHZfdCAqKXNlY19zdGF0ICk7CgogICAgICAgIHN3aXRjaCggc2VjX3N0YXQtPnNlY3VyaXR5U3RhdHVzICkgewogICAgICAgIGNhc2UgMToKICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiU2VjdXJpdHkgU3RhdHVzIDogRGlzc2Fzc29jaWF0ZSBbQVBdXG4iICk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIlNlY3VyaXR5IFN0YXR1cyA6IERlYXV0aGVudGljYXRlIFtBUF1cbiIgKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiU2VjdXJpdHkgU3RhdHVzIDogQXV0aGVudGljYXRlIEZhaWwgW1NUQV0gb3IgW0FQXVxuIiApOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSA0OgogICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJTZWN1cml0eSBTdGF0dXMgOiBNSUMgRmFpbFxuIiApOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSA1OgogICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJTZWN1cml0eSBTdGF0dXMgOiBBc3NvY2lhdGUgRmFpbFxuIiApOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiU2VjdXJpdHkgU3RhdHVzIDogVU5LTk9XTiAoMHglMDR4KVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgc2VjX3N0YXQtPnNlY3VyaXR5U3RhdHVzICk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiU1RBIEFkZHJlc3MgICAgIDogJXNcbiIsCiAgICAgICAgICAgICAgICAgICBEYmdId0FkZHIoIHNlY19zdGF0LT5zdGFBZGRyICkpOwogICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIlJlYXNvbiAgICAgICAgICA6IDB4JTA0eCBcbiIsIHNlY19zdGF0LT5yZWFzb24gKTsKCiAgICB9CgogICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CiAgICByZXR1cm47Cn0gLy8gd2xfcHJvY2Vzc19zZWN1cml0eV9zdGF0dXMKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCmludCB3bF9nZXRfdGFsbGllcyhzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsCgkJICAgQ0ZHX0hFUk1FU19UQUxMSUVTX1NUUkNUICp0YWxsaWVzKQp7CiAgICBpbnQgcmV0ID0gMDsKICAgIGludCBzdGF0dXM7CiAgICBDRkdfSEVSTUVTX1RBTExJRVNfU1RSQ1QgKnBUYWxsaWVzOwoKICAgIERCR19GVU5DKCAid2xfZ2V0X3RhbGxpZXMiICk7CiAgICBEQkdfRU5URVIoRGJnSW5mbyk7CgogICAgLyogR2V0IHRoZSBjdXJyZW50IHRhbGxpZXMgZnJvbSB0aGUgYWRhcHRlciAqLwogICAgbHAtPmx0dlJlY29yZC5sZW4gPSAxICsgSENGX1RPVF9UQUxfQ05UICogc2l6ZW9mKGhjZl8xNik7CiAgICBscC0+bHR2UmVjb3JkLnR5cCA9IENGR19UQUxMSUVTOwoKICAgIHN0YXR1cyA9IGhjZl9nZXRfaW5mbygmKGxwLT5oY2ZDdHgpLCAoTFRWUCkmKGxwLT5sdHZSZWNvcmQpKTsKCiAgICBpZiggc3RhdHVzID09IEhDRl9TVUNDRVNTICkgewoJcFRhbGxpZXMgPSAoQ0ZHX0hFUk1FU19UQUxMSUVTX1NUUkNUICopJihscC0+bHR2UmVjb3JkLnUudTMyKTsKCW1lbWNweSh0YWxsaWVzLCBwVGFsbGllcywgc2l6ZW9mKCp0YWxsaWVzKSk7CiAgICAJREJHX1RSQUNFKCBEYmdJbmZvLCAiR2V0IHRhbGxpZXMgb2theSwgZGl4ZTogJWRcbiIsIHNpemVvZigqdGFsbGllcykgKTsKICAgIH0gZWxzZSB7CiAgICAJREJHX1RSQUNFKCBEYmdJbmZvLCAiR2V0IHRhbGxpZXMgZmFpbGVkXG4iICk7CglyZXQgPSAtRUZBVUxUOwogICAgfQoKICAgIERCR19MRUFWRSggRGJnSW5mbyApOwoKICAgIHJldHVybiByZXQ7Cn0KCg==