ZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL1JFQURNRSBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDU5NWI2Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvUkVBRE1FCkBAIC0wLDAgKzEsMyBAQAorVGhpcyBpcyBvdXIgdmVyc2lvbiBvZiBXUElMaWIuIFdlIGNvcHkgdGhlIHdwaWxpYmMvIGFuZCBoYWwvIGZvbGRlcnMgZnJvbQorb3VyIGN1c3RvbWl6ZWQgdmVyc2lvbiBwZXJpb2RpY2FsbHkuIFRoZSBjb21taXQgbWVzc2FnZXMgYWxsIGluY2x1ZGUgdGhlIGNvbW1pdAord2hpY2ggaXMgYmVpbmcgY29waWVkIGluIGFuZCB0aGUgY29ycmVzcG9uZGluZyBGUEdBIGltYWdlIHZlcnNpb24uCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvQ01ha2VMaXN0cy50eHQgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFkMmU2NAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDE3IEBACitjbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMi44KQorcHJvamVjdChIQUwpCisKK2ZpbGUoR0xPQl9SRUNVUlNFIFNSQ19GSUxFUyBsaWIvQXRoZW5hLyouY3BwKQoraW5jbHVkZV9kaXJlY3RvcmllcyhsaWIvQXRoZW5hIGxpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdCBpbmNsdWRlKQorYWRkX2xpYnJhcnkoSEFMQXRoZW5hIFNUQVRJQyAke1NSQ19GSUxFU30pCit0YXJnZXRfbGlua19saWJyYXJpZXMoSEFMQXRoZW5hICR7TklfTElCU30pCitJTlNUQUxMKFRBUkdFVFMgSEFMQXRoZW5hIEFSQ0hJVkUgREVTVElOQVRJT04gbGliIENPTVBPTkVOVCBsaWIpCitJTlNUQUxMKEZJTEVTICR7TklfTElCU30gJHtXUElfTERfTElCU30gREVTVElOQVRJT04gbGliIENPTVBPTkVOVCBuaV9saWIpCitJTlNUQUxMKERJUkVDVE9SWSBpbmNsdWRlIERFU1RJTkFUSU9OICR7Q01BS0VfSU5TVEFMTF9QUkVGSVh9IENPTVBPTkVOVCBoZWFkZXJzKQorCithZGRfbGlicmFyeShIQUxBdGhlbmFfc2hhcmVkIFNIQVJFRCAke1NSQ19GSUxFU30pCit0YXJnZXRfbGlua19saWJyYXJpZXMoSEFMQXRoZW5hX3NoYXJlZCAke05JX0xJQlN9KQorSU5TVEFMTChUQVJHRVRTIEhBTEF0aGVuYV9zaGFyZWQgTElCUkFSWSBERVNUSU5BVElPTiBsaWIgQ09NUE9ORU5UIGxpYikKKyMgbGliLyBjIG0gZ2NjX3MgbGQtbGludXgKKyMgdXNyL2xpYiAKKyMgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uIEZSQ19GUEdBX0NoaXBPYmplY3QgUm9ib1JJT19GUkNfQ2hpcE9iamVjdApkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL1JFQURNRS5vcmcgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvUkVBRE1FLm9yZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWIxMzJhCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL1JFQURNRS5vcmcKQEAgLTAsMCArMSw5NCBAQAorCisqIFB1cnBvc2UKK1RoZSBIQUwgaXMgYSBoYXJkd2FyZSBhYnN0cmFjdGlvbiBsYXllciB0aGF0IHByb3ZpZGVzIGEgdW5pZm9ybQoraW50ZXJmYWNlIHRoYXQgY2FuIGJlIHVzZWQgdG8gYWNjZXNzIGEgbnVtYmVyIG9mIHByaW1hcmlseSBJL08KK2ZlYXR1cmVzIGluIHRoZSB1bmRlcmx5aW5nIHBsYXRmb3JtLiBUaGUgZmVhdHVyZXMgaW5jbHVkZToKKy0gQW5hbG9nIGlucHV0LCBhY2N1bXVsYXRpb24gYW5kIHRyaWdnZXJzCistIFBXTSwgUmVsYXkgYW5kIFNvbGVub2lkIG91dHB1dAorLSBEaWdpdGFsIGlucHV0IGFuZCBvdXRwdXQKKy0gSTJDIGFuZCBTUEkgY29tbXVuaWNhdGlvbgorLSBFbmNvZGVycyBhbmQgY291bnRlcnMKKy0gSW50ZXJydXB0cyBhbmQgTm90aWZpZXJzCisKK1RoZSBpbml0aWFsIGdvYWwgaXMgdG8gYWxsb3cgYSBoaWdoZXIgbGV2ZWwgbGlrZSBXUElMaWIgdG8gc3VwcG9ydAorYm90aCB0aGUgQ1JJTyBhbmQgdGhlIHVwY29taW5nIEF0aGVuYSBwbGF0Zm9ybSBvbmx5IGJ5IGNoYW5naW5nIHdoaWNoCit2ZXJzaW9uIG9mIHRoZSBIQUwgaXQncyBydW5uaW5nIG9uLgorCisqIEVkaXRpbmcKK1lvdSBjYW4gYWx3YXlzIHVzZSBhbnkgdGV4dCBlZGl0b3IgYW5kIHRoZW4gYnVpbGQgd2l0aCBNYXZlbi4gVGhlcmUKK2FyZSBhbHNvIGVjbGlwc2UgcHJvamVjdCBmaWxlcyBzbyB0aGF0IGl0IGNhbiBiZSBlZGl0ZWQgaW4gdGhlIHNhbWUKK2VjbGlwc2UgZW52aXJvbm1lbnQgdGhhdCB0ZWFtcyBkZXZlbG9wIHdpdGguIEZvciB0aGUgQXRoZW5hWFgsIHRoaXMKK2NhbiBiZSBmb3VuZCBpbiB0aGUgPXJvb3Q9IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuIEl0IGltcG9ydHMgYXMgYW4KK0ZSQyBSb2JvdCBDKysgRWNsaXBzZSBwcm9qZWN0LiBUaGUgV2luZHJpdmVyIHByb2plY3QgY2FuIGJlIGltcG9ydGVkCitmcm9tIHRoZSA9c3JjPSBkaXJlY3RvcnkuCisKKyogQnVpbGRpbmcgd2l0aCBNYXZlbgorVGhlcmUgYXJlIG11bHRpcGxlIGJ1aWxkIHRhcmdldHMgdGhhdCB0aGUgSEFMIHN1cHBvcnRzLiBJbnN0cnVjdGlvbnMKK2ZvciBzZXR0aW5nIHVwIHRoZSBlbnZpcm9ubWVudCBhbmQgYnVpbGRpbmcgZWFjaCBvZiB0aGVzZSBpcyBkZXNjcmliZWQKK2JlbG93LiBDdXJyZW50IHRhcmdldHMgYXJlIGxpc3RlZCBiZWxvdzoKKy0gQWxsOiBBbGwgb2YgdGhlIGZvbGxvd2luZyB0YXJnZXRzLgorLSBpbmNsdWRlOiBUaGUgaGVhZGVyIGZpbGVzIGZvciB0aGUgSEFMLgorLSBBemFsZWE6IENSSU8gQysrIGJ1aWxkLgorLSBBdGhlbmFYWDogQXRoZW5hIERvcyBFcXVpcyBDKysgYnVpbGQuCistIEF0aGVuYVhYSmF2YTogQXRoZW5hIERvcyBFcXVpcyBKYXZhIGJ1aWxkIHdpdGggYXV0by1nZW5lcmF0ZWQgSk5BCisgIHdyYXBwZXJzLgorCitPdXRwdXQgZnJvbSBlYWNoIGJ1aWxkIHRhcmdldCBpcyBwbGFjZWQgaW4gdGhlIGRpcmVjdG9yeQorPXRhcmdldC88dGFyZ2V0LW5hbWU+PS4gU28sIHRoZSBBemFsZWEgb3V0cHV0IGlzIHBsYWNlZCBpbgorPXRhcmdldC9BemFsZWE9LgorCisqKiBBbGwKK05vdGU6IFdpbmRvd3Mgb25seSBkdWUgdG8gdGhlIFdpbmRyaXZlciByZXF1aXJlbWVudC4KKzEuIEVuc3VyZSB0aGF0ID1DOlxXaW5kUml2ZXJcZ251XDMuNC40LXZ4d29ya3MtNi4zXHg4Ni13aW4zMlxiaW49IGlzCisgICBvbiB0aGUgc3lzdGVtIHBhdGggc28gdGhhdCA9Y2NwcGM9IGFuZCA9YXJwcGM9IGNhbiBiZSBhY2Nlc3NlZC4KKzIuIFNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgPVdJTkRfQkFTRT0gdG8gPUM6XFdpbmRSaXZlclx2eHdvcmtzLTYuMz0uCiszLiBFbnN1cmUgdGhhdAorICAgPSRIT01FL3dwaWxpYi90b29sY2hhaW5zL2FybS1ub25lLWxpbnV4LWdudWVhYmktNC40LjEvYmluLz0gaXMgb24KKyAgIHRoZSBzeXN0ZW0gcGF0aCBzbyB0aGF0ID1hcm0tbm9uZS1saW51eC1nbnVlYWJpLWcrKz0gYW5kCisgICA9YXJtLW5vbmUtbGludXgtZ251ZWFiaS1hcj0gY2FuIGJlIGFjY2Vzc2VkLgorNC4gQ2hlY2tvdXQgYW5kIGluc3RhbGwgdGhlIE5JLUxpYnJhcmllcyBmcm9tIEdpdGh1YjoKKyAgIFtbaHR0cHM6Ly9naXRodWIuY29tL2ZpcnN0L05JLUxpYnJhcmllc11dLgorNS4gUnVuIHRoZSBmb2xsb3dpbmcgbWF2ZW4gY29tbWFuZDoKKyAgID1tdm4gY2xlYW4gaW5zdGFsbD0KKzYuIFN1Y2Nlc3MKKworKiogaW5jbHVkZQorMS4gPWNkPSBpbnRvIHRoZSBpbmNsdWRlIGRpcmVjdG9yeTogPWNkIGluY2x1ZGU9CisyLiBSdW4gdGhlIGZvbGxvd2luZyBtYXZlbiBjb21tYW5kOgorICAgPW12biBjbGVhbiBpbnN0YWxsPQorMy4gU3VjY2VzcworCisqKiBBemFsZWEKK05vdGU6IFdpbmRvd3Mgb25seS4KKzEuIEVuc3VyZSB0aGF0ID1DOlxXaW5kUml2ZXJcZ251XDMuNC40LXZ4d29ya3MtNi4zXHg4Ni13aW4zMlxiaW49IGlzCisgICBvbiB0aGUgc3lzdGVtIHBhdGggc28gdGhhdCA9Y2NwcGM9IGFuZCA9YXJwcGM9IGNhbiBiZSBhY2Nlc3NlZC4KKzIuIFNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgPVdJTkRfQkFTRT0gdG8gPUM6XFdpbmRSaXZlclx2eHdvcmtzLTYuMz0uCiszLiA9Y2Q9IGludG8gdGhlIEF0aGVuYVhYIGRpcmVjdG9yeTogPWNkIEF0aGVuYVhYPQorNC4gPWNkPSBpbnRvIHRoZSBBemFsZWEgZGlyZWN0b3J5OiAgPWNkIEF6YWxlYT0KKzUuIFJ1biB0aGUgZm9sbG93aW5nIG1hdmVuIGNvbW1hbmQ6CisgICA9bXZuIGNsZWFuIGluc3RhbGw9Cis2LiBTdWNjZXNzCisKKyoqIEF0aGVuYVhYCisxLiBFbnN1cmUgdGhhdAorICAgPSRIT01FL3dwaWxpYi90b29sY2hhaW5zL2FybS1ub25lLWxpbnV4LWdudWVhYmktNC40LjEvYmluLz0gaXMgb24KKyAgIHRoZSBzeXN0ZW0gcGF0aCBzbyB0aGF0ID1hcm0tbm9uZS1saW51eC1nbnVlYWJpLWcrKz0gYW5kCisgICA9YXJtLW5vbmUtbGludXgtZ251ZWFiaS1hcj0gY2FuIGJlIGFjY2Vzc2VkLgorMi4gSW5zdGFsbCB0aGUgaW5jbHVkZSB0YXJnZXQuCiszLiA9Y2Q9IGludG8gdGhlIEF0aGVuYVhYIGRpcmVjdG9yeTogPWNkIEF0aGVuYVhYPQorNC4gUnVuIHRoZSBmb2xsb3dpbmcgbWF2ZW4gY29tbWFuZDoKKyAgID1tdm4gY2xlYW4gaW5zdGFsbD0KKzUuIFN1Y2Nlc3MKKworKiogQXRoZW5hWFhKYXZhCisxLiBFbnN1cmUgdGhhdAorICAgPSRIT01FL3dwaWxpYi90b29sY2hhaW5zL2FybS1ub25lLWxpbnV4LWdudWVhYmktNC40LjEvYmluLz0gaXMgb24KKyAgIHRoZSBzeXN0ZW0gcGF0aCBzbyB0aGF0ID1hcm0tbm9uZS1saW51eC1nbnVlYWJpLWcrKz0gYW5kCisgICA9YXJtLW5vbmUtbGludXgtZ251ZWFiaS1hcj0gY2FuIGJlIGFjY2Vzc2VkLgorMi4gQ2hlY2tvdXQgYW5kIGluc3RhbGwgdGhlIE5JLUxpYnJhcmllcyBmcm9tIEdpdGh1YjoKKyAgIFtbaHR0cHM6Ly9naXRodWIuY29tL2ZpcnN0L05JLUxpYnJhcmllc11dLgorMy4gSW5zdGFsbCB0aGUgaW5jbHVkZSB0YXJnZXQuCis0LiA9Y2Q9IGludG8gdGhlIEF0aGVuYVhYSmF2YSBkaXJlY3Rvcnk6ID1jZCBBdGhlbmFYWEphdmE9Cis1LiBSdW4gdGhlIGZvbGxvd2luZyBtYXZlbiBjb21tYW5kOgorICAgPW12biBjbGVhbiBpbnN0YWxsPQorNi4gU3VjY2VzcwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2luY2x1ZGUvSEFML0FjY2VsZXJvbWV0ZXIuaHBwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2luY2x1ZGUvSEFML0FjY2VsZXJvbWV0ZXIuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwM2ZiMmEKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvaW5jbHVkZS9IQUwvQWNjZWxlcm9tZXRlci5ocHAKQEAgLTAsMCArMSwxNSBAQAorI3ByYWdtYSBvbmNlCisKK2VudW0gQWNjZWxlcm9tZXRlclJhbmdlIHsKKwlrUmFuZ2VfMkcgPSAwLAorCWtSYW5nZV80RyA9IDEsCisJa1JhbmdlXzhHID0gMiwKK307CisKK2V4dGVybiAiQyIgeworCXZvaWQgc2V0QWNjZWxlcm9tZXRlckFjdGl2ZShib29sKTsKKwl2b2lkIHNldEFjY2VsZXJvbWV0ZXJSYW5nZShBY2NlbGVyb21ldGVyUmFuZ2UpOworCWRvdWJsZSBnZXRBY2NlbGVyb21ldGVyWCgpOworCWRvdWJsZSBnZXRBY2NlbGVyb21ldGVyWSgpOworCWRvdWJsZSBnZXRBY2NlbGVyb21ldGVyWigpOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2luY2x1ZGUvSEFML0FuYWxvZy5ocHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvaW5jbHVkZS9IQUwvQW5hbG9nLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODFhYTllCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2luY2x1ZGUvSEFML0FuYWxvZy5ocHAKQEAgLTAsMCArMSw4MCBAQAorI3ByYWdtYSBvbmNlCisKKyNpZmRlZiBfX3Z4d29ya3MKKyNpbmNsdWRlIDx2eFdvcmtzLmg+CisjZWxzZQorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisKK2VudW0gQW5hbG9nVHJpZ2dlclR5cGUKK3sKKwlrSW5XaW5kb3cgPSAwLAorCWtTdGF0ZSA9IDEsCisJa1Jpc2luZ1B1bHNlID0gMiwKKwlrRmFsbGluZ1B1bHNlID0gMworfTsKKworZXh0ZXJuICJDIgoreworCS8vIEFuYWxvZyBvdXRwdXQgZnVuY3Rpb25zCisJdm9pZCogaW5pdGlhbGl6ZUFuYWxvZ091dHB1dFBvcnQodm9pZCogcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCXZvaWQgc2V0QW5hbG9nT3V0cHV0KHZvaWQqIGFuYWxvZ19wb3J0X3BvaW50ZXIsIGRvdWJsZSB2b2x0YWdlLCBpbnQzMl90ICpzdGF0dXMpOworCWRvdWJsZSBnZXRBbmFsb2dPdXRwdXQodm9pZCogYW5hbG9nX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwlib29sIGNoZWNrQW5hbG9nT3V0cHV0Q2hhbm5lbCh1aW50MzJfdCBwaW4pOworCisJLy8gQW5hbG9nIGlucHV0IGZ1bmN0aW9ucworCXZvaWQqIGluaXRpYWxpemVBbmFsb2dJbnB1dFBvcnQodm9pZCogcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCWJvb2wgY2hlY2tBbmFsb2dNb2R1bGUodWludDhfdCBtb2R1bGUpOworCWJvb2wgY2hlY2tBbmFsb2dJbnB1dENoYW5uZWwodWludDMyX3QgcGluKTsKKworCXZvaWQgc2V0QW5hbG9nU2FtcGxlUmF0ZShkb3VibGUgc2FtcGxlc1BlclNlY29uZCwgaW50MzJfdCAqc3RhdHVzKTsKKwlmbG9hdCBnZXRBbmFsb2dTYW1wbGVSYXRlKGludDMyX3QgKnN0YXR1cyk7CisJdm9pZCBzZXRBbmFsb2dBdmVyYWdlQml0cyh2b2lkKiBhbmFsb2dfcG9ydF9wb2ludGVyLCB1aW50MzJfdCBiaXRzLCBpbnQzMl90ICpzdGF0dXMpOworCXVpbnQzMl90IGdldEFuYWxvZ0F2ZXJhZ2VCaXRzKHZvaWQqIGFuYWxvZ19wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisJdm9pZCBzZXRBbmFsb2dPdmVyc2FtcGxlQml0cyh2b2lkKiBhbmFsb2dfcG9ydF9wb2ludGVyLCB1aW50MzJfdCBiaXRzLCBpbnQzMl90ICpzdGF0dXMpOworCXVpbnQzMl90IGdldEFuYWxvZ092ZXJzYW1wbGVCaXRzKHZvaWQqIGFuYWxvZ19wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisJaW50MTZfdCBnZXRBbmFsb2dWYWx1ZSh2b2lkKiBhbmFsb2dfcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCWludDMyX3QgZ2V0QW5hbG9nQXZlcmFnZVZhbHVlKHZvaWQqIGFuYWxvZ19wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisJaW50MzJfdCBnZXRBbmFsb2dWb2x0c1RvVmFsdWUodm9pZCogYW5hbG9nX3BvcnRfcG9pbnRlciwgZG91YmxlIHZvbHRhZ2UsIGludDMyX3QgKnN0YXR1cyk7CisJZmxvYXQgZ2V0QW5hbG9nVm9sdGFnZSh2b2lkKiBhbmFsb2dfcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCWZsb2F0IGdldEFuYWxvZ0F2ZXJhZ2VWb2x0YWdlKHZvaWQqIGFuYWxvZ19wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisJdWludDMyX3QgZ2V0QW5hbG9nTFNCV2VpZ2h0KHZvaWQqIGFuYWxvZ19wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisJaW50MzJfdCBnZXRBbmFsb2dPZmZzZXQodm9pZCogYW5hbG9nX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKworCWJvb2wgaXNBY2N1bXVsYXRvckNoYW5uZWwodm9pZCogYW5hbG9nX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkIGluaXRBY2N1bXVsYXRvcih2b2lkKiBhbmFsb2dfcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCXZvaWQgcmVzZXRBY2N1bXVsYXRvcih2b2lkKiBhbmFsb2dfcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCXZvaWQgc2V0QWNjdW11bGF0b3JDZW50ZXIodm9pZCogYW5hbG9nX3BvcnRfcG9pbnRlciwgaW50MzJfdCBjZW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisJdm9pZCBzZXRBY2N1bXVsYXRvckRlYWRiYW5kKHZvaWQqIGFuYWxvZ19wb3J0X3BvaW50ZXIsIGludDMyX3QgZGVhZGJhbmQsIGludDMyX3QgKnN0YXR1cyk7CisJaW50NjRfdCBnZXRBY2N1bXVsYXRvclZhbHVlKHZvaWQqIGFuYWxvZ19wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisJdWludDMyX3QgZ2V0QWNjdW11bGF0b3JDb3VudCh2b2lkKiBhbmFsb2dfcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCXZvaWQgZ2V0QWNjdW11bGF0b3JPdXRwdXQodm9pZCogYW5hbG9nX3BvcnRfcG9pbnRlciwgaW50NjRfdCAqdmFsdWUsIHVpbnQzMl90ICpjb3VudCwKKwkJCWludDMyX3QgKnN0YXR1cyk7CisKKwl2b2lkKiBpbml0aWFsaXplQW5hbG9nVHJpZ2dlcih2b2lkKiBwb3J0X3BvaW50ZXIsIHVpbnQzMl90ICppbmRleCwgaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkIGNsZWFuQW5hbG9nVHJpZ2dlcih2b2lkKiBhbmFsb2dfdHJpZ2dlcl9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCXZvaWQgc2V0QW5hbG9nVHJpZ2dlckxpbWl0c1Jhdyh2b2lkKiBhbmFsb2dfdHJpZ2dlcl9wb2ludGVyLCBpbnQzMl90IGxvd2VyLCBpbnQzMl90IHVwcGVyLAorCQkJaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkIHNldEFuYWxvZ1RyaWdnZXJMaW1pdHNWb2x0YWdlKHZvaWQqIGFuYWxvZ190cmlnZ2VyX3BvaW50ZXIsIGRvdWJsZSBsb3dlciwgZG91YmxlIHVwcGVyLAorCQkJaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkIHNldEFuYWxvZ1RyaWdnZXJBdmVyYWdlZCh2b2lkKiBhbmFsb2dfdHJpZ2dlcl9wb2ludGVyLCBib29sIHVzZUF2ZXJhZ2VkVmFsdWUsCisJCQlpbnQzMl90ICpzdGF0dXMpOworCXZvaWQgc2V0QW5hbG9nVHJpZ2dlckZpbHRlcmVkKHZvaWQqIGFuYWxvZ190cmlnZ2VyX3BvaW50ZXIsIGJvb2wgdXNlRmlsdGVyZWRWYWx1ZSwKKwkJCWludDMyX3QgKnN0YXR1cyk7CisJYm9vbCBnZXRBbmFsb2dUcmlnZ2VySW5XaW5kb3codm9pZCogYW5hbG9nX3RyaWdnZXJfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwlib29sIGdldEFuYWxvZ1RyaWdnZXJUcmlnZ2VyU3RhdGUodm9pZCogYW5hbG9nX3RyaWdnZXJfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwlib29sIGdldEFuYWxvZ1RyaWdnZXJPdXRwdXQodm9pZCogYW5hbG9nX3RyaWdnZXJfcG9pbnRlciwgQW5hbG9nVHJpZ2dlclR5cGUgdHlwZSwKKwkJCWludDMyX3QgKnN0YXR1cyk7CisKKwkvLy8vIEZsb2F0IEpOQSBIYWNrCisJLy8gRmxvYXQKKwlpbnQgZ2V0QW5hbG9nU2FtcGxlUmF0ZUludEhhY2soaW50MzJfdCAqc3RhdHVzKTsKKwlpbnQgZ2V0QW5hbG9nVm9sdGFnZUludEhhY2sodm9pZCogYW5hbG9nX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwlpbnQgZ2V0QW5hbG9nQXZlcmFnZVZvbHRhZ2VJbnRIYWNrKHZvaWQqIGFuYWxvZ19wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisKKwkvLyBEb3VibGVzCisJdm9pZCBzZXRBbmFsb2dTYW1wbGVSYXRlSW50SGFjayhpbnQgc2FtcGxlc1BlclNlY29uZCwgaW50MzJfdCAqc3RhdHVzKTsKKwlpbnQzMl90IGdldEFuYWxvZ1ZvbHRzVG9WYWx1ZUludEhhY2sodm9pZCogYW5hbG9nX3BvcnRfcG9pbnRlciwgaW50IHZvbHRhZ2UsIGludDMyX3QgKnN0YXR1cyk7CisJdm9pZCBzZXRBbmFsb2dUcmlnZ2VyTGltaXRzVm9sdGFnZUludEhhY2sodm9pZCogYW5hbG9nX3RyaWdnZXJfcG9pbnRlciwgaW50IGxvd2VyLCBpbnQgdXBwZXIsCisJCQlpbnQzMl90ICpzdGF0dXMpOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2luY2x1ZGUvSEFML0NBTi5ocHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvaW5jbHVkZS9IQUwvQ0FOLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGI1ODljCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2luY2x1ZGUvSEFML0NBTi5ocHAKQEAgLTAsMCArMSwyNiBAQAorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJOZXR3b3JrQ29tbXVuaWNhdGlvbi9DQU5TZXNzaW9uTXV4LmgiCisKK3ZvaWQgY2FuVHhTZW5kKHVpbnQzMl90IGFyYklELCB1aW50OF90IGxlbmd0aCwgaW50MzJfdCBwZXJpb2QgPSBDQU5fU0VORF9QRVJJT0RfTk9fUkVQRUFUKTsKKwordm9pZCBjYW5UeFBhY2tJbnQ4ICh1aW50MzJfdCBhcmJJRCwgdWludDhfdCBvZmZzZXQsIHVpbnQ4X3QgIHZhbHVlKTsKK3ZvaWQgY2FuVHhQYWNrSW50MTYodWludDMyX3QgYXJiSUQsIHVpbnQ4X3Qgb2Zmc2V0LCB1aW50MTZfdCB2YWx1ZSk7Cit2b2lkIGNhblR4UGFja0ludDMyKHVpbnQzMl90IGFyYklELCB1aW50OF90IG9mZnNldCwgdWludDMyX3QgdmFsdWUpOwordm9pZCBjYW5UeFBhY2tGWFAxNih1aW50MzJfdCBhcmJJRCwgdWludDhfdCBvZmZzZXQsIGRvdWJsZSAgIHZhbHVlKTsKK3ZvaWQgY2FuVHhQYWNrRlhQMzIodWludDMyX3QgYXJiSUQsIHVpbnQ4X3Qgb2Zmc2V0LCBkb3VibGUgICB2YWx1ZSk7CisKK3VpbnQ4X3QgIGNhblR4VW5wYWNrSW50OCAodWludDMyX3QgYXJiSUQsIHVpbnQ4X3Qgb2Zmc2V0KTsKK3VpbnQzMl90IGNhblR4VW5wYWNrSW50MzIodWludDMyX3QgYXJiSUQsIHVpbnQ4X3Qgb2Zmc2V0KTsKK3VpbnQxNl90IGNhblR4VW5wYWNrSW50MTYodWludDMyX3QgYXJiSUQsIHVpbnQ4X3Qgb2Zmc2V0KTsKK2RvdWJsZSAgIGNhblR4VW5wYWNrRlhQMTYodWludDMyX3QgYXJiSUQsIHVpbnQ4X3Qgb2Zmc2V0KTsKK2RvdWJsZSAgIGNhblR4VW5wYWNrRlhQMzIodWludDMyX3QgYXJiSUQsIHVpbnQ4X3Qgb2Zmc2V0KTsKKworYm9vbCBjYW5SeFJlY2VpdmUodWludDMyX3QgYXJiSUQpOworCit1aW50OF90ICBjYW5SeFVucGFja0ludDggKHVpbnQzMl90IGFyYklELCB1aW50OF90IG9mZnNldCk7Cit1aW50MTZfdCBjYW5SeFVucGFja0ludDE2KHVpbnQzMl90IGFyYklELCB1aW50OF90IG9mZnNldCk7Cit1aW50MzJfdCBjYW5SeFVucGFja0ludDMyKHVpbnQzMl90IGFyYklELCB1aW50OF90IG9mZnNldCk7Citkb3VibGUgICBjYW5SeFVucGFja0ZYUDE2KHVpbnQzMl90IGFyYklELCB1aW50OF90IG9mZnNldCk7Citkb3VibGUgICBjYW5SeFVucGFja0ZYUDMyKHVpbnQzMl90IGFyYklELCB1aW50OF90IG9mZnNldCk7CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvaW5jbHVkZS9IQUwvQ29tcHJlc3Nvci5ocHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvaW5jbHVkZS9IQUwvQ29tcHJlc3Nvci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMyMjJlYgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9pbmNsdWRlL0hBTC9Db21wcmVzc29yLmhwcApAQCAtMCwwICsxLDM3IEBACisvKioKKyAqIENvbXByZXNzb3IuaAorICogTWV0aG9kcyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBhIGNvbXByZXNzb3Igd2l0aCB0aGUgQ0FOIFBDTSBkZXZpY2UKKyAqLworCisjaWZkZWYgX192eHdvcmtzCisjaW5jbHVkZSA8dnhXb3Jrcy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9fSEFMX0NPTVBSRVNTT1JfSF9fCisjZGVmaW5lIF9fSEFMX0NPTVBSRVNTT1JfSF9fCisKK2V4dGVybiAiQyIgeworCXZvaWQgKmluaXRpYWxpemVDb21wcmVzc29yKHVpbnQ4X3QgbW9kdWxlKTsKKwlib29sIGNoZWNrQ29tcHJlc3Nvck1vZHVsZSh1aW50OF90IG1vZHVsZSk7CisJCisJYm9vbCBnZXRDb21wcmVzc29yKHZvaWQgKnBjbV9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCQorCXZvaWQgc2V0Q2xvc2VkTG9vcENvbnRyb2wodm9pZCAqcGNtX3BvaW50ZXIsIGJvb2wgdmFsdWUsIGludDMyX3QgKnN0YXR1cyk7CisJYm9vbCBnZXRDbG9zZWRMb29wQ29udHJvbCh2b2lkICpwY21fcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwkKKwlib29sIGdldFByZXNzdXJlU3dpdGNoKHZvaWQgKnBjbV9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCWZsb2F0IGdldENvbXByZXNzb3JDdXJyZW50KHZvaWQgKnBjbV9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCisJYm9vbCBnZXRDb21wcmVzc29yQ3VycmVudFRvb0hpZ2hGYXVsdCh2b2lkICpwY21fcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwlib29sIGdldENvbXByZXNzb3JDdXJyZW50VG9vSGlnaFN0aWNreUZhdWx0KHZvaWQgKnBjbV9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCWJvb2wgZ2V0Q29tcHJlc3NvclNob3J0ZWRTdGlja3lGYXVsdCh2b2lkICpwY21fcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwlib29sIGdldENvbXByZXNzb3JTaG9ydGVkRmF1bHQodm9pZCAqcGNtX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisJYm9vbCBnZXRDb21wcmVzc29yTm90Q29ubmVjdGVkU3RpY2t5RmF1bHQodm9pZCAqcGNtX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisJYm9vbCBnZXRDb21wcmVzc29yTm90Q29ubmVjdGVkRmF1bHQodm9pZCAqcGNtX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisJdm9pZCBjbGVhckFsbFBDTVN0aWNreUZhdWx0cyh2b2lkICpwY21fcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKK30KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9pbmNsdWRlL0hBTC9EaWdpdGFsLmhwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9pbmNsdWRlL0hBTC9EaWdpdGFsLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODYwMzgxCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2luY2x1ZGUvSEFML0RpZ2l0YWwuaHBwCkBAIC0wLDAgKzEsMTIyIEBACisjcHJhZ21hIG9uY2UKKyNpZmRlZiBfX3Z4d29ya3MKKyNpbmNsdWRlIDx2eFdvcmtzLmg+CisjZWxzZQorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaW5jbHVkZSAiSEFML2NwcC9TeW5jaHJvbml6ZWQuaHBwIgorCitlbnVtIE1vZGUKK3sKKwlrVHdvUHVsc2UgPSAwLAorCWtTZW1pcGVyaW9kID0gMSwKKwlrUHVsc2VMZW5ndGggPSAyLAorCWtFeHRlcm5hbERpcmVjdGlvbiA9IDMKK307CisKK2V4dGVybiAiQyIKK3sKKwl2b2lkKiBpbml0aWFsaXplRGlnaXRhbFBvcnQodm9pZCogcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCWJvb2wgY2hlY2tQV01DaGFubmVsKHZvaWQqIGRpZ2l0YWxfcG9ydF9wb2ludGVyKTsKKwlib29sIGNoZWNrUmVsYXlDaGFubmVsKHZvaWQqIGRpZ2l0YWxfcG9ydF9wb2ludGVyKTsKKworCXZvaWQgc2V0UFdNKHZvaWQqIGRpZ2l0YWxfcG9ydF9wb2ludGVyLCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSwgaW50MzJfdCAqc3RhdHVzKTsKKwlib29sIGFsbG9jYXRlUFdNQ2hhbm5lbCh2b2lkKiBkaWdpdGFsX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkIGZyZWVQV01DaGFubmVsKHZvaWQqIGRpZ2l0YWxfcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCXVuc2lnbmVkIHNob3J0IGdldFBXTSh2b2lkKiBkaWdpdGFsX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkIGxhdGNoUFdNWmVybyh2b2lkKiBkaWdpdGFsX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkIHNldFBXTVBlcmlvZFNjYWxlKHZvaWQqIGRpZ2l0YWxfcG9ydF9wb2ludGVyLCB1aW50MzJfdCBzcXVlbGNoTWFzaywgaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkKiBhbGxvY2F0ZVBXTShpbnQzMl90ICpzdGF0dXMpOworCXZvaWQgZnJlZVBXTSh2b2lkKiBwd21HZW5lcmF0b3IsIGludDMyX3QgKnN0YXR1cyk7CisJdm9pZCBzZXRQV01SYXRlKGRvdWJsZSByYXRlLCBpbnQzMl90ICpzdGF0dXMpOworCXZvaWQgc2V0UFdNRHV0eUN5Y2xlKHZvaWQqIHB3bUdlbmVyYXRvciwgZG91YmxlIGR1dHlDeWNsZSwgaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkIHNldFBXTU91dHB1dENoYW5uZWwodm9pZCogcHdtR2VuZXJhdG9yLCB1aW50MzJfdCBwaW4sIGludDMyX3QgKnN0YXR1cyk7CisKKwl2b2lkIHNldFJlbGF5Rm9yd2FyZCh2b2lkKiBkaWdpdGFsX3BvcnRfcG9pbnRlciwgYm9vbCBvbiwgaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkIHNldFJlbGF5UmV2ZXJzZSh2b2lkKiBkaWdpdGFsX3BvcnRfcG9pbnRlciwgYm9vbCBvbiwgaW50MzJfdCAqc3RhdHVzKTsKKwlib29sIGdldFJlbGF5Rm9yd2FyZCh2b2lkKiBkaWdpdGFsX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwlib29sIGdldFJlbGF5UmV2ZXJzZSh2b2lkKiBkaWdpdGFsX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKworCWJvb2wgYWxsb2NhdGVESU8odm9pZCogZGlnaXRhbF9wb3J0X3BvaW50ZXIsIGJvb2wgaW5wdXQsIGludDMyX3QgKnN0YXR1cyk7CisJdm9pZCBmcmVlRElPKHZvaWQqIGRpZ2l0YWxfcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCXZvaWQgc2V0RElPKHZvaWQqIGRpZ2l0YWxfcG9ydF9wb2ludGVyLCBzaG9ydCB2YWx1ZSwgaW50MzJfdCAqc3RhdHVzKTsKKwlib29sIGdldERJTyh2b2lkKiBkaWdpdGFsX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwlib29sIGdldERJT0RpcmVjdGlvbih2b2lkKiBkaWdpdGFsX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkIHB1bHNlKHZvaWQqIGRpZ2l0YWxfcG9ydF9wb2ludGVyLCBkb3VibGUgcHVsc2VMZW5ndGgsIGludDMyX3QgKnN0YXR1cyk7CisJYm9vbCBpc1B1bHNpbmcodm9pZCogZGlnaXRhbF9wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisJYm9vbCBpc0FueVB1bHNpbmcoaW50MzJfdCAqc3RhdHVzKTsKKworCXZvaWQgc2V0RmlsdGVyU2VsZWN0KHZvaWQqIGRpZ2l0YWxfcG9ydF9wb2ludGVyLCBpbnQgZmlsdGVyX2luZGV4LAorCSAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOworCWludCBnZXRGaWx0ZXJTZWxlY3Qodm9pZCogZGlnaXRhbF9wb3J0X3BvaW50ZXIsIGludDMyX3QqIHN0YXR1cyk7CisKKwl2b2lkIHNldEZpbHRlclBlcmlvZChpbnQgZmlsdGVyX2luZGV4LCB1aW50MzJfdCB2YWx1ZSwgaW50MzJfdCAqc3RhdHVzKTsKKwl1aW50MzJfdCBnZXRGaWx0ZXJQZXJpb2QoaW50IGZpbHRlcl9pbmRleCwgaW50MzJfdCAqc3RhdHVzKTsKKworCXZvaWQqIGluaXRpYWxpemVDb3VudGVyKE1vZGUgbW9kZSwgdWludDMyX3QgKmluZGV4LCBpbnQzMl90ICpzdGF0dXMpOworCXZvaWQgZnJlZUNvdW50ZXIodm9pZCogY291bnRlcl9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCXZvaWQgc2V0Q291bnRlckF2ZXJhZ2VTaXplKHZvaWQqIGNvdW50ZXJfcG9pbnRlciwgaW50MzJfdCBzaXplLCBpbnQzMl90ICpzdGF0dXMpOworCXZvaWQgc2V0Q291bnRlclVwU291cmNlKHZvaWQqIGNvdW50ZXJfcG9pbnRlciwgdWludDMyX3QgcGluLCBib29sIGFuYWxvZ1RyaWdnZXIsIGludDMyX3QgKnN0YXR1cyk7CisJdm9pZCBzZXRDb3VudGVyVXBTb3VyY2VFZGdlKHZvaWQqIGNvdW50ZXJfcG9pbnRlciwgYm9vbCByaXNpbmdFZGdlLCBib29sIGZhbGxpbmdFZGdlLAorCQkJaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkIGNsZWFyQ291bnRlclVwU291cmNlKHZvaWQqIGNvdW50ZXJfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkIHNldENvdW50ZXJEb3duU291cmNlKHZvaWQqIGNvdW50ZXJfcG9pbnRlciwgdWludDMyX3QgcGluLCBib29sIGFuYWxvZ1RyaWdnZXIsIGludDMyX3QgKnN0YXR1cyk7CisJdm9pZCBzZXRDb3VudGVyRG93blNvdXJjZUVkZ2Uodm9pZCogY291bnRlcl9wb2ludGVyLCBib29sIHJpc2luZ0VkZ2UsIGJvb2wgZmFsbGluZ0VkZ2UsCisJCQlpbnQzMl90ICpzdGF0dXMpOworCXZvaWQgY2xlYXJDb3VudGVyRG93blNvdXJjZSh2b2lkKiBjb3VudGVyX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisJdm9pZCBzZXRDb3VudGVyVXBEb3duTW9kZSh2b2lkKiBjb3VudGVyX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisJdm9pZCBzZXRDb3VudGVyRXh0ZXJuYWxEaXJlY3Rpb25Nb2RlKHZvaWQqIGNvdW50ZXJfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkIHNldENvdW50ZXJTZW1pUGVyaW9kTW9kZSh2b2lkKiBjb3VudGVyX3BvaW50ZXIsIGJvb2wgaGlnaFNlbWlQZXJpb2QsIGludDMyX3QgKnN0YXR1cyk7CisJdm9pZCBzZXRDb3VudGVyUHVsc2VMZW5ndGhNb2RlKHZvaWQqIGNvdW50ZXJfcG9pbnRlciwgZG91YmxlIHRocmVzaG9sZCwgaW50MzJfdCAqc3RhdHVzKTsKKwlpbnQzMl90IGdldENvdW50ZXJTYW1wbGVzVG9BdmVyYWdlKHZvaWQqIGNvdW50ZXJfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkIHNldENvdW50ZXJTYW1wbGVzVG9BdmVyYWdlKHZvaWQqIGNvdW50ZXJfcG9pbnRlciwgaW50IHNhbXBsZXNUb0F2ZXJhZ2UsIGludDMyX3QgKnN0YXR1cyk7CisJdm9pZCByZXNldENvdW50ZXIodm9pZCogY291bnRlcl9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCWludDMyX3QgZ2V0Q291bnRlcih2b2lkKiBjb3VudGVyX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisJZG91YmxlIGdldENvdW50ZXJQZXJpb2Qodm9pZCogY291bnRlcl9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCXZvaWQgc2V0Q291bnRlck1heFBlcmlvZCh2b2lkKiBjb3VudGVyX3BvaW50ZXIsIGRvdWJsZSBtYXhQZXJpb2QsIGludDMyX3QgKnN0YXR1cyk7CisJdm9pZCBzZXRDb3VudGVyVXBkYXRlV2hlbkVtcHR5KHZvaWQqIGNvdW50ZXJfcG9pbnRlciwgYm9vbCBlbmFibGVkLCBpbnQzMl90ICpzdGF0dXMpOworCWJvb2wgZ2V0Q291bnRlclN0b3BwZWQodm9pZCogY291bnRlcl9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCWJvb2wgZ2V0Q291bnRlckRpcmVjdGlvbih2b2lkKiBjb3VudGVyX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisJdm9pZCBzZXRDb3VudGVyUmV2ZXJzZURpcmVjdGlvbih2b2lkKiBjb3VudGVyX3BvaW50ZXIsIGJvb2wgcmV2ZXJzZURpcmVjdGlvbiwgaW50MzJfdCAqc3RhdHVzKTsKKworCXZvaWQqIGluaXRpYWxpemVFbmNvZGVyKHVpbnQ4X3QgcG9ydF9hX21vZHVsZSwgdWludDMyX3QgcG9ydF9hX3BpbiwgYm9vbCBwb3J0X2FfYW5hbG9nX3RyaWdnZXIsCisJCQl1aW50OF90IHBvcnRfYl9tb2R1bGUsIHVpbnQzMl90IHBvcnRfYl9waW4sIGJvb2wgcG9ydF9iX2FuYWxvZ190cmlnZ2VyLAorCQkJYm9vbCByZXZlcnNlRGlyZWN0aW9uLCBpbnQzMl90ICppbmRleCwgaW50MzJfdCAqc3RhdHVzKTsgLy8gVE9ETzogZml4IHJvdXRpbmcKKwl2b2lkIGZyZWVFbmNvZGVyKHZvaWQqIGVuY29kZXJfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkIHJlc2V0RW5jb2Rlcih2b2lkKiBlbmNvZGVyX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisJaW50MzJfdCBnZXRFbmNvZGVyKHZvaWQqIGVuY29kZXJfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsgLy8gUmF3IHZhbHVlCisJZG91YmxlIGdldEVuY29kZXJQZXJpb2Qodm9pZCogZW5jb2Rlcl9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCXZvaWQgc2V0RW5jb2Rlck1heFBlcmlvZCh2b2lkKiBlbmNvZGVyX3BvaW50ZXIsIGRvdWJsZSBtYXhQZXJpb2QsIGludDMyX3QgKnN0YXR1cyk7CisJYm9vbCBnZXRFbmNvZGVyU3RvcHBlZCh2b2lkKiBlbmNvZGVyX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisJYm9vbCBnZXRFbmNvZGVyRGlyZWN0aW9uKHZvaWQqIGVuY29kZXJfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkIHNldEVuY29kZXJSZXZlcnNlRGlyZWN0aW9uKHZvaWQqIGVuY29kZXJfcG9pbnRlciwgYm9vbCByZXZlcnNlRGlyZWN0aW9uLCBpbnQzMl90ICpzdGF0dXMpOworCXZvaWQgc2V0RW5jb2RlclNhbXBsZXNUb0F2ZXJhZ2Uodm9pZCogZW5jb2Rlcl9wb2ludGVyLCB1aW50MzJfdCBzYW1wbGVzVG9BdmVyYWdlLAorCQkJaW50MzJfdCAqc3RhdHVzKTsKKwl1aW50MzJfdCBnZXRFbmNvZGVyU2FtcGxlc1RvQXZlcmFnZSh2b2lkKiBlbmNvZGVyX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisKKwl1aW50MTZfdCBnZXRMb29wVGltaW5nKGludDMyX3QgKnN0YXR1cyk7CisKKwl2b2lkIHNwaUluaXRpYWxpemUodWludDhfdCBwb3J0LCBpbnQzMl90ICpzdGF0dXMpOworCWludDMyX3Qgc3BpVHJhbnNhY3Rpb24odWludDhfdCBwb3J0LCB1aW50OF90ICpkYXRhVG9TZW5kLCB1aW50OF90ICpkYXRhUmVjZWl2ZWQsIHVpbnQ4X3Qgc2l6ZSk7CisJaW50MzJfdCBzcGlXcml0ZSh1aW50OF90IHBvcnQsIHVpbnQ4X3QqIGRhdGFUb1NlbmQsIHVpbnQ4X3Qgc2VuZFNpemUpOworCWludDMyX3Qgc3BpUmVhZCh1aW50OF90IHBvcnQsIHVpbnQ4X3QgKmJ1ZmZlciwgdWludDhfdCBjb3VudCk7CisJdm9pZCBzcGlDbG9zZSh1aW50OF90IHBvcnQpOworCXZvaWQgc3BpU2V0U3BlZWQodWludDhfdCBwb3J0LCB1aW50MzJfdCBzcGVlZCk7CisJdm9pZCBzcGlTZXRCaXRzUGVyV29yZCh1aW50OF90IHBvcnQsIHVpbnQ4X3QgYnB3KTsKKwl2b2lkIHNwaVNldE9wdHModWludDhfdCBwb3J0LCBpbnQgbXNiX2ZpcnN0LCBpbnQgc2FtcGxlX29uX3RyYWlsaW5nLCBpbnQgY2xrX2lkbGVfaGlnaCk7CisJdm9pZCBzcGlTZXRDaGlwU2VsZWN0QWN0aXZlSGlnaCh1aW50OF90IHBvcnQsIGludDMyX3QgKnN0YXR1cyk7CisJdm9pZCBzcGlTZXRDaGlwU2VsZWN0QWN0aXZlTG93KHVpbnQ4X3QgcG9ydCwgaW50MzJfdCAqc3RhdHVzKTsKKwlpbnQzMl90IHNwaUdldEhhbmRsZSh1aW50OF90IHBvcnQpOworCXZvaWQgc3BpU2V0SGFuZGxlKHVpbnQ4X3QgcG9ydCwgaW50MzJfdCBoYW5kbGUpOworCisJdm9pZCBpMkNJbml0aWFsaXplKHVpbnQ4X3QgcG9ydCwgaW50MzJfdCAqc3RhdHVzKTsKKwlpbnQzMl90IGkyQ1RyYW5zYWN0aW9uKHVpbnQ4X3QgcG9ydCwgdWludDhfdCBkZXZpY2VBZGRyZXNzLCB1aW50OF90ICpkYXRhVG9TZW5kLCB1aW50OF90IHNlbmRTaXplLCB1aW50OF90ICpkYXRhUmVjZWl2ZWQsIHVpbnQ4X3QgcmVjZWl2ZVNpemUpOworCWludDMyX3QgaTJDV3JpdGUodWludDhfdCBwb3J0LCB1aW50OF90IGRldmljZUFkZHJlc3MsIHVpbnQ4X3QgKmRhdGFUb1NlbmQsIHVpbnQ4X3Qgc2VuZFNpemUpOworCWludDMyX3QgaTJDUmVhZCh1aW50OF90IHBvcnQsIHVpbnQ4X3QgZGV2aWNlQWRkcmVzcywgdWludDhfdCAqYnVmZmVyLCB1aW50OF90IGNvdW50KTsKKwl2b2lkIGkyQ0Nsb3NlKHVpbnQ4X3QgcG9ydCk7CisKKwkvLy8vIEZsb2F0IEpOQSBIYWNrCisJLy8gZG91YmxlCisJdm9pZCBzZXRQV01SYXRlSW50SGFjayhpbnQgcmF0ZSwgaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkIHNldFBXTUR1dHlDeWNsZUludEhhY2sodm9pZCogcHdtR2VuZXJhdG9yLCBpbnQzMl90IGR1dHlDeWNsZSwgaW50MzJfdCAqc3RhdHVzKTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9pbmNsdWRlL0hBTC9FcnJvcnMuaHBwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2luY2x1ZGUvSEFML0Vycm9ycy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVlZDk2MQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9pbmNsdWRlL0hBTC9FcnJvcnMuaHBwCkBAIC0wLDAgKzEsNjQgQEAKKyNwcmFnbWEgb25jZQorCisjZGVmaW5lIENUUl9SeFRpbWVvdXRfTUVTU0FHRSAiQ1RSRSBDQU4gUmVjaWV2ZSBUaW1lb3V0IgorI2RlZmluZSBDVFJfVHhUaW1lb3V0X01FU1NBR0UgIkNUUkUgQ0FOIFRyYW5zbWl0IFRpbWVvdXQiCisjZGVmaW5lIENUUl9JbnZhbGlkUGFyYW1WYWx1ZV9NRVNTQUdFICJDVFJFIENBTiBJbnZhbGlkIFBhcmFtZXRlciIKKyNkZWZpbmUgQ1RSX1VuZXhwZWN0ZWRBcmJJZF9NRVNTQUdFICJDVFJFIFVuZXhwZWN0ZWQgQXJiaXRyYXRpb24gSUQgKENBTiBOb2RlIElEKSIKKyNkZWZpbmUgQ1RSX1R4RmFpbGVkX01FU1NBR0UgIkNUUkUgQ0FOIFRyYW5zbWl0IEVycm9yIgorI2RlZmluZSBDVFJfU2lnTm90VXBkYXRlZF9NRVNTQUdFICJDVFJFIENBTiBTaWduYWwgTm90IFVwZGF0ZWQiCisKKyNkZWZpbmUgTmlGcGdhX1N0YXR1c19GaWZvVGltZW91dF9NRVNTQUdFICJOSUZQR0E6IEZJRk8gdGltZW91dCBlcnJvciIKKyNkZWZpbmUgTmlGcGdhX1N0YXR1c19UcmFuc2ZlckFib3J0ZWRfTUVTU0FHRSAiTklGUEdBOiBUcmFuc2ZlciBhYm9ydGVkIGVycm9yIgorI2RlZmluZSBOaUZwZ2FfU3RhdHVzX01lbW9yeUZ1bGxfTUVTU0FHRSAiTklGUEdBOiBNZW1vcnkgQWxsb2NhdGlvbiBmYWlsZWQsIG1lbW9yeSBmdWxsIgorI2RlZmluZSBOaUZwZ2FfU3RhdHVzX1NvZnR3YXJlRmF1bHRfTUVTU0FHRSAiTklGUEdBOiBVbmV4ZXBlY3RlZCBzb2Z0d2FyZSBlcnJvciIKKyNkZWZpbmUgTmlGcGdhX1N0YXR1c19JbnZhbGlkUGFyYW1ldGVyX01FU1NBR0UgIk5JRlBHQTogSW52YWxpZCBQYXJhbWV0ZXIiCisjZGVmaW5lIE5pRnBnYV9TdGF0dXNfUmVzb3VyY2VOb3RGb3VuZF9NRVNTQUdFICJOSUZQR0E6IFJlc291cmNlIG5vdCBmb3VuZCIKKyNkZWZpbmUgTmlGcGdhX1N0YXR1c19SZXNvdXJjZU5vdEluaXRpYWxpemVkX01FU1NBR0UgIk5JRlBHQTogUmVzb3VyY2Ugbm90IGluaXRpYWxpemVkIgorI2RlZmluZSBOaUZwZ2FfU3RhdHVzX0hhcmR3YXJlRmF1bHRfTUVTU0FHRSAiTklGUEdBOiBIYXJkd2FyZSBGYXVsdCIKKyNkZWZpbmUgTmlGcGdhX1N0YXR1c19JcnFUaW1lb3V0X01FU1NBR0UgIk5JRlBHQTogSW50ZXJydXB0IHRpbWVvdXQiCisKKyNkZWZpbmUgRVJSX0NBTlNlc3Npb25NdXhfSW52YWxpZEJ1ZmZlcl9NRVNTQUdFICJDQU46IEludmFsaWQgQnVmZmVyIgorI2RlZmluZSBFUlJfQ0FOU2Vzc2lvbk11eF9NZXNzYWdlTm90Rm91bmRfTUVTU0FHRSAiQ0FOOiBNZXNzYWdlIG5vdCBmb3VuZCIKKyNkZWZpbmUgV0FSTl9DQU5TZXNzaW9uTXV4X05vVG9rZW5fTUVTU0FHRSAiQ0FOOiBObyB0b2tlbiIKKyNkZWZpbmUgRVJSX0NBTlNlc3Npb25NdXhfTm90QWxsb3dlZF9NRVNTQUdFICJDQU46IE5vdCBhbGxvd2VkIgorI2RlZmluZSBFUlJfQ0FOU2Vzc2lvbk11eF9Ob3RJbml0aWFsaXplZF9NRVNTQUdFICJDQU46IE5vdCBpbml0aWFsaXplZCIgCisKKyNkZWZpbmUgU0FNUExFX1JBVEVfVE9PX0hJR0ggMTAwMQorI2RlZmluZSBTQU1QTEVfUkFURV9UT09fSElHSF9NRVNTQUdFICJIQUw6IEFuYWxvZyBtb2R1bGUgc2FtcGxlIHJhdGUgaXMgdG9vIGhpZ2giCisjZGVmaW5lIFZPTFRBR0VfT1VUX09GX1JBTkdFIDEwMDIKKyNkZWZpbmUgVk9MVEFHRV9PVVRfT0ZfUkFOR0VfTUVTU0FHRSAiSEFMOiBWb2x0YWdlIHRvIGNvbnZlcnQgdG8gcmF3IHZhbHVlIGlzIG91dCBvZiByYW5nZSBbMDsgNV0iCisjZGVmaW5lIExPT1BfVElNSU5HX0VSUk9SIDEwMDQKKyNkZWZpbmUgTE9PUF9USU1JTkdfRVJST1JfTUVTU0FHRSAiSEFMOiBEaWdpdGFsIG1vZHVsZSBsb29wIHRpbWluZyBpcyBub3QgdGhlIGV4cGVjdGVkIHZhbHVlIgorI2RlZmluZSBTUElfV1JJVEVfTk9fTU9TSSAxMDEyCisjZGVmaW5lIFNQSV9XUklURV9OT19NT1NJX01FU1NBR0UgIkhBTDogQ2Fubm90IHdyaXRlIHRvIFNQSSBwb3J0IHdpdGggbm8gTU9TSSBvdXRwdXQiCisjZGVmaW5lIFNQSV9SRUFEX05PX01JU08gMTAxMworI2RlZmluZSBTUElfUkVBRF9OT19NSVNPX01FU1NBR0UgIkhBTDogQ2Fubm90IHJlYWQgZnJvbSBTUEkgcG9ydCB3aXRoIG5vIE1JU08gaW5wdXQiCisjZGVmaW5lIFNQSV9SRUFEX05PX0RBVEEgMTAxNAorI2RlZmluZSBTUElfUkVBRF9OT19EQVRBX01FU1NBR0UgIkhBTDogTm8gZGF0YSBhdmFpbGFibGUgdG8gcmVhZCBmcm9tIFNQSSIKKyNkZWZpbmUgSU5DT01QQVRJQkxFX1NUQVRFIDEwMTUKKyNkZWZpbmUgSU5DT01QQVRJQkxFX1NUQVRFX01FU1NBR0UgIkhBTDogSW5jb21wYXRpYmxlIFN0YXRlOiBUaGUgb3BlcmF0aW9uIGNhbm5vdCBiZSBjb21wbGV0ZWQiCisjZGVmaW5lIE5PX0FWQUlMQUJMRV9SRVNPVVJDRVMgLTEwMDQKKyNkZWZpbmUgTk9fQVZBSUxBQkxFX1JFU09VUkNFU19NRVNTQUdFICJIQUw6IE5vIGF2YWlsYWJsZSByZXNvdXJjZXMgdG8gYWxsb2NhdGUiCisjZGVmaW5lIE5VTExfUEFSQU1FVEVSIC0xMDA1CisjZGVmaW5lIE5VTExfUEFSQU1FVEVSX01FU1NBR0UgIkhBTDogQSBwb2ludGVyIHBhcmFtZXRlciB0byBhIG1ldGhvZCBpcyBOVUxMIgorI2RlZmluZSBBTkFMT0dfVFJJR0dFUl9MSU1JVF9PUkRFUl9FUlJPUiAtMTAxMAorI2RlZmluZSBBTkFMT0dfVFJJR0dFUl9MSU1JVF9PUkRFUl9FUlJPUl9NRVNTQUdFICJIQUw6IEFuYWxvZ1RyaWdnZXIgbGltaXRzIGVycm9yLiAgTG93ZXIgbGltaXQgPiBVcHBlciBMaW1pdCIKKyNkZWZpbmUgQU5BTE9HX1RSSUdHRVJfUFVMU0VfT1VUUFVUX0VSUk9SIC0xMDExCisjZGVmaW5lIEFOQUxPR19UUklHR0VSX1BVTFNFX09VVFBVVF9FUlJPUl9NRVNTQUdFICJIQUw6IEF0dGVtcHRlZCB0byByZWFkIEFuYWxvZ1RyaWdnZXIgcHVsc2Ugb3V0cHV0LiIKKyNkZWZpbmUgUEFSQU1FVEVSX09VVF9PRl9SQU5HRSAtMTAyOAorI2RlZmluZSBQQVJBTUVURVJfT1VUX09GX1JBTkdFX01FU1NBR0UgIkhBTDogQSBwYXJhbWV0ZXIgaXMgb3V0IG9mIHJhbmdlLiIKKyNkZWZpbmUgUkVTT1VSQ0VfSVNfQUxMT0NBVEVEIC0xMDI5CisjZGVmaW5lIFJFU09VUkNFX0lTX0FMTE9DQVRFRF9NRVNTQUdFICJIQUw6IFJlc291cmNlIGFscmVhZHkgYWxsb2NhdGVkIgorCisjZGVmaW5lIFZJX0VSUk9SX1NZU1RFTV9FUlJPUl9NRVNTQUdFICJIQUwgLSBWSVNBOiBTeXN0ZW0gRXJyb3IiOworI2RlZmluZSBWSV9FUlJPUl9JTlZfT0JKRUNUX01FU1NBR0UgIkhBTCAtIFZJU0E6IEludmFsaWQgT2JqZWN0IgorI2RlZmluZSBWSV9FUlJPUl9SU1JDX0xPQ0tFRF9NRVNTQUdFICJIQUwgLSBWSVNBOiBSZXNvdXJjZSBMb2NrZWQiCisjZGVmaW5lIFZJX0VSUk9SX1JTUkNfTkZPVU5EX01FU1NBR0UgIkhBTCAtIFZJU0E6IFJlc291cmNlIE5vdCBGb3VuZCIKKyNkZWZpbmUgVklfRVJST1JfSU5WX1JTUkNfTkFNRV9NRVNTQUdFICJIQUwgLSBWSVNBOiBJbnZhbGlkIFJlc291cmNlIE5hbWUiICAKKyNkZWZpbmUgVklfRVJST1JfUVVFVUVfT1ZFUkZMT1dfTUVTU0FHRSAiSEFMIC0gVklTQTogUXVldWUgT3ZlcmZsb3ciIAorI2RlZmluZSBWSV9FUlJPUl9JT19NRVNTQUdFICJIQUwgLSBWSVNBOiBHZW5lcmFsIElPIEVycm9yIgorI2RlZmluZSBWSV9FUlJPUl9BU1JMX1BBUklUWV9NRVNTQUdFICJIQUwgLSBWSVNBOiBQYXJpdHkgRXJyb3IiCisjZGVmaW5lIFZJX0VSUk9SX0FTUkxfRlJBTUlOR19NRVNTQUdFICJIQUwgLSBWSVNBOiBGcmFtaW5nIEVycm9yIgorI2RlZmluZSBWSV9FUlJPUl9BU1JMX09WRVJSVU5fTUVTU0FHRSAiSEFMIC0gVklTQTogQnVmZmVyIE92ZXJydW4gRXJyb3IiIAorI2RlZmluZSBWSV9FUlJPUl9SU1JDX0JVU1lfTUVTU0FHRSAiSEFMIC0gVklTQTogUmVzb3VyY2UgQnVzeSIKKyNkZWZpbmUgVklfRVJST1JfSU5WX1BBUkFNRVRFUl9NRVNTQUdFICJIQUwgLSBWSVNBOiBJbnZhbGlkIFBhcmFtZXRlciIgCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvaW5jbHVkZS9IQUwvSEFMLmhwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9pbmNsdWRlL0hBTC9IQUwuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNmFjYjcKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvaW5jbHVkZS9IQUwvSEFMLmhwcApAQCAtMCwwICsxLDI1NyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxMy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gIAkJCSAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2lmZGVmIF9fdnh3b3JrcworI2luY2x1ZGUgPHZ4V29ya3MuaD4KKyNlbHNlCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxjbWF0aD4KKworI2luY2x1ZGUgIkFjY2VsZXJvbWV0ZXIuaHBwIgorI2luY2x1ZGUgIkFuYWxvZy5ocHAiCisjaW5jbHVkZSAiQ29tcHJlc3Nvci5ocHAiCisjaW5jbHVkZSAiRGlnaXRhbC5ocHAiCisjaW5jbHVkZSAiU29sZW5vaWQuaHBwIgorI2luY2x1ZGUgIk5vdGlmaWVyLmhwcCIKKyNpbmNsdWRlICJJbnRlcnJ1cHRzLmhwcCIKKyNpbmNsdWRlICJFcnJvcnMuaHBwIgorI2luY2x1ZGUgIlBEUC5ocHAiCisjaW5jbHVkZSAiUG93ZXIuaHBwIgorCisjaW5jbHVkZSAiVXRpbGl0aWVzLmhwcCIKKyNpbmNsdWRlICJTZW1hcGhvcmUuaHBwIgorI2luY2x1ZGUgIlRhc2suaHBwIgorCisjZGVmaW5lIEhBTF9JT19DT05GSUdfREFUQV9TSVpFIDMyCisjZGVmaW5lIEhBTF9TWVNfU1RBVFVTX0RBVEFfU0laRSA0NAorI2RlZmluZSBIQUxfVVNFUl9TVEFUVVNfREFUQV9TSVpFICg5ODQgLSBIQUxfSU9fQ09ORklHX0RBVEFfU0laRSAtIEhBTF9TWVNfU1RBVFVTX0RBVEFfU0laRSkKKworI2RlZmluZSBIQUxGUkNfTmV0d29ya0NvbW11bmljYXRpb25fRHluYW1pY1R5cGVfRFNFbmhhbmNlZElPX0lucHV0IDE3CisjZGVmaW5lIEhBTEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9EeW5hbWljVHlwZV9EU0VuaGFuY2VkSU9fT3V0cHV0IDE4CisjZGVmaW5lIEhBTEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9EeW5hbWljVHlwZV9LaW5lY3RfSGVhZGVyIDE5CisjZGVmaW5lIEhBTEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9EeW5hbWljVHlwZV9LaW5lY3RfRXh0cmExIDIwCisjZGVmaW5lIEhBTEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9EeW5hbWljVHlwZV9LaW5lY3RfVmVydGljZXMxIDIxCisjZGVmaW5lIEhBTEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9EeW5hbWljVHlwZV9LaW5lY3RfRXh0cmEyIDIyCisjZGVmaW5lIEhBTEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9EeW5hbWljVHlwZV9LaW5lY3RfVmVydGljZXMyIDIzCisjZGVmaW5lIEhBTEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9EeW5hbWljVHlwZV9LaW5lY3RfSm95c3RpY2sgMjQKKyNkZWZpbmUgSEFMRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0R5bmFtaWNUeXBlX0tpbmVjdF9DdXN0b20gMjUKKworbmFtZXNwYWNlIEhBTFVzYWdlUmVwb3J0aW5nCit7CisJZW51bSB0UmVzb3VyY2VUeXBlCisJeworCQlrUmVzb3VyY2VUeXBlX0NvbnRyb2xsZXIsCisJCWtSZXNvdXJjZVR5cGVfTW9kdWxlLAorCQlrUmVzb3VyY2VUeXBlX0xhbmd1YWdlLAorCQlrUmVzb3VyY2VUeXBlX0NBTlBsdWdpbiwKKwkJa1Jlc291cmNlVHlwZV9BY2NlbGVyb21ldGVyLAorCQlrUmVzb3VyY2VUeXBlX0FEWEwzNDUsCisJCWtSZXNvdXJjZVR5cGVfQW5hbG9nQ2hhbm5lbCwKKwkJa1Jlc291cmNlVHlwZV9BbmFsb2dUcmlnZ2VyLAorCQlrUmVzb3VyY2VUeXBlX0FuYWxvZ1RyaWdnZXJPdXRwdXQsCisJCWtSZXNvdXJjZVR5cGVfQ0FOSmFndWFyLAorCQlrUmVzb3VyY2VUeXBlX0NvbXByZXNzb3IsCisJCWtSZXNvdXJjZVR5cGVfQ291bnRlciwKKwkJa1Jlc291cmNlVHlwZV9EYXNoYm9hcmQsCisJCWtSZXNvdXJjZVR5cGVfRGlnaXRhbElucHV0LAorCQlrUmVzb3VyY2VUeXBlX0RpZ2l0YWxPdXRwdXQsCisJCWtSZXNvdXJjZVR5cGVfRHJpdmVyU3RhdGlvbkNJTywKKwkJa1Jlc291cmNlVHlwZV9Ecml2ZXJTdGF0aW9uRUlPLAorCQlrUmVzb3VyY2VUeXBlX0RyaXZlclN0YXRpb25MQ0QsCisJCWtSZXNvdXJjZVR5cGVfRW5jb2RlciwKKwkJa1Jlc291cmNlVHlwZV9HZWFyVG9vdGgsCisJCWtSZXNvdXJjZVR5cGVfR3lybywKKwkJa1Jlc291cmNlVHlwZV9JMkMsCisJCWtSZXNvdXJjZVR5cGVfRnJhbWV3b3JrLAorCQlrUmVzb3VyY2VUeXBlX0phZ3VhciwKKwkJa1Jlc291cmNlVHlwZV9Kb3lzdGljaywKKwkJa1Jlc291cmNlVHlwZV9LaW5lY3QsCisJCWtSZXNvdXJjZVR5cGVfS2luZWN0U3RpY2ssCisJCWtSZXNvdXJjZVR5cGVfUElEQ29udHJvbGxlciwKKwkJa1Jlc291cmNlVHlwZV9QcmVmZXJlbmNlcywKKwkJa1Jlc291cmNlVHlwZV9QV00sCisJCWtSZXNvdXJjZVR5cGVfUmVsYXksCisJCWtSZXNvdXJjZVR5cGVfUm9ib3REcml2ZSwKKwkJa1Jlc291cmNlVHlwZV9TZXJpYWxQb3J0LAorCQlrUmVzb3VyY2VUeXBlX1NlcnZvLAorCQlrUmVzb3VyY2VUeXBlX1NvbGVub2lkLAorCQlrUmVzb3VyY2VUeXBlX1NQSSwKKwkJa1Jlc291cmNlVHlwZV9UYXNrLAorCQlrUmVzb3VyY2VUeXBlX1VsdHJhc29uaWMsCisJCWtSZXNvdXJjZVR5cGVfVmljdG9yLAorCQlrUmVzb3VyY2VUeXBlX0J1dHRvbiwKKwkJa1Jlc291cmNlVHlwZV9Db21tYW5kLAorCQlrUmVzb3VyY2VUeXBlX0F4aXNDYW1lcmEsCisJCWtSZXNvdXJjZVR5cGVfUENWaWRlb1NlcnZlciwKKwkJa1Jlc291cmNlVHlwZV9TbWFydERhc2hib2FyZCwKKwkJa1Jlc291cmNlVHlwZV9UYWxvbiwKKwkJa1Jlc291cmNlVHlwZV9IaVRlY2huaWNDb2xvclNlbnNvciwKKwkJa1Jlc291cmNlVHlwZV9IaVRlY2huaWNBY2NlbCwKKwkJa1Jlc291cmNlVHlwZV9IaVRlY2huaWNDb21wYXNzLAorCQlrUmVzb3VyY2VUeXBlX1NSRjA4LAorCQlrUmVzb3VyY2VUeXBlX0RpZ2l0YWxHbGl0Y2hGaWx0ZXIsCisJfTsKKworCWVudW0gdEluc3RhbmNlcworCXsKKwkJa0xhbmd1YWdlX0xhYlZJRVcgPSAxLAorCQlrTGFuZ3VhZ2VfQ1BsdXNQbHVzID0gMiwKKwkJa0xhbmd1YWdlX0phdmEgPSAzLAorCQlrTGFuZ3VhZ2VfUHl0aG9uID0gNCwKKworCQlrQ0FOUGx1Z2luX0JsYWNrSmFnQnJpZGdlID0gMSwKKwkJa0NBTlBsdWdpbl8yQ0FOID0gMiwKKworCQlrRnJhbWV3b3JrX0l0ZXJhdGl2ZSA9IDEsCisJCWtGcmFtZXdvcmtfU2ltcGxlID0gMiwKKworCQlrUm9ib3REcml2ZV9BcmNhZGVTdGFuZGFyZCA9IDEsCisJCWtSb2JvdERyaXZlX0FyY2FkZUJ1dHRvblNwaW4gPSAyLAorCQlrUm9ib3REcml2ZV9BcmNhZGVSYXRpb0N1cnZlID0gMywKKwkJa1JvYm90RHJpdmVfVGFuayA9IDQsCisJCWtSb2JvdERyaXZlX01lY2FudW1Qb2xhciA9IDUsCisJCWtSb2JvdERyaXZlX01lY2FudW1DYXJ0ZXNpYW4gPSA2LAorCisJCWtEcml2ZXJTdGF0aW9uQ0lPX0FuYWxvZyA9IDEsCisJCWtEcml2ZXJTdGF0aW9uQ0lPX0RpZ2l0YWxJbiA9IDIsCisJCWtEcml2ZXJTdGF0aW9uQ0lPX0RpZ2l0YWxPdXQgPSAzLAorCisJCWtEcml2ZXJTdGF0aW9uRUlPX0FjY2VsZXJhdGlvbiA9IDEsCisJCWtEcml2ZXJTdGF0aW9uRUlPX0FuYWxvZ0luID0gMiwKKwkJa0RyaXZlclN0YXRpb25FSU9fQW5hbG9nT3V0ID0gMywKKwkJa0RyaXZlclN0YXRpb25FSU9fQnV0dG9uID0gNCwKKwkJa0RyaXZlclN0YXRpb25FSU9fTEVEID0gNSwKKwkJa0RyaXZlclN0YXRpb25FSU9fRGlnaXRhbEluID0gNiwKKwkJa0RyaXZlclN0YXRpb25FSU9fRGlnaXRhbE91dCA9IDcsCisJCWtEcml2ZXJTdGF0aW9uRUlPX0ZpeGVkRGlnaXRhbE91dCA9IDgsCisJCWtEcml2ZXJTdGF0aW9uRUlPX1BXTSA9IDksCisJCWtEcml2ZXJTdGF0aW9uRUlPX0VuY29kZXIgPSAxMCwKKwkJa0RyaXZlclN0YXRpb25FSU9fVG91Y2hTbGlkZXIgPSAxMSwKKworCQlrQURYTDM0NV9TUEkgPSAxLAorCQlrQURYTDM0NV9JMkMgPSAyLAorCisJCWtDb21tYW5kX1NjaGVkdWxlciA9IDEsCisKKwkJa1NtYXJ0RGFzaGJvYXJkX0luc3RhbmNlID0gMSwKKwl9OworfQorCitzdHJ1Y3QgSEFMQ29udHJvbFdvcmQgeworCXVpbnQzMl90IGVuYWJsZWQgOiAxOworCXVpbnQzMl90IGF1dG9ub21vdXMgOiAxOworCXVpbnQzMl90IHRlc3QgOjE7CisJdWludDMyX3QgZVN0b3AgOiAxOworCXVpbnQzMl90IGZtc0F0dGFjaGVkOjE7CisJdWludDMyX3QgZHNBdHRhY2hlZDoxOworCXVpbnQzMl90IGNvbnRyb2xfcmVzZXJ2ZWQgOiAyNjsKK307CisKK2VudW0gSEFMQWxsaWFuY2VTdGF0aW9uSUQgeworCWtIQUxBbGxpYW5jZVN0YXRpb25JRF9yZWQxLAorCWtIQUxBbGxpYW5jZVN0YXRpb25JRF9yZWQyLAorCWtIQUxBbGxpYW5jZVN0YXRpb25JRF9yZWQzLAorCWtIQUxBbGxpYW5jZVN0YXRpb25JRF9ibHVlMSwKKwlrSEFMQWxsaWFuY2VTdGF0aW9uSURfYmx1ZTIsCisJa0hBTEFsbGlhbmNlU3RhdGlvbklEX2JsdWUzLAorfTsKKworLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIGF4ZXMgdGhhdCB3aWxsIGJlIHN0b3JlZCBpbiBhIHNpbmdsZSBIQUxKb3lzdGlja0F4ZXMKKwlzdHJ1Y3QuIFRoaXMgaXMgdXNlZCBmb3IgYWxsb2NhdGluZyBidWZmZXJzLCBub3QgYm91bmRzIGNoZWNraW5nLCBzaW5jZQorCXRoZXJlIGFyZSB1c3VhbGx5IGxlc3MgYXhlcyBpbiBwcmFjdGljZS4gKi8KK3N0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNYXhKb3lzdGlja0F4ZXMgPSAxMjsKK3N0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNYXhKb3lzdGlja1BPVnMgPSAxMjsKKworc3RydWN0IEhBTEpveXN0aWNrQXhlcyB7CisJdWludDE2X3QgY291bnQ7CisJaW50MTZfdCBheGVzW2tNYXhKb3lzdGlja0F4ZXNdOworfTsKKworc3RydWN0IEhBTEpveXN0aWNrUE9WcyB7CisJdWludDE2X3QgY291bnQ7CisJaW50MTZfdCBwb3ZzW2tNYXhKb3lzdGlja1BPVnNdOworfTsKKworc3RydWN0IEhBTEpveXN0aWNrQnV0dG9ucyB7CisJdWludDMyX3QgYnV0dG9uczsKKwl1aW50OF90IGNvdW50OworfTsKKworc3RydWN0IEhBTEpveXN0aWNrRGVzY3JpcHRvciB7CisJdWludDhfdCBpc1hib3g7CisJdWludDhfdCB0eXBlOworCWNoYXIgbmFtZVsyNTZdOworCXVpbnQ4X3QgYXhpc0NvdW50OworCXVpbnQ4X3QgYXhpc1R5cGVzOworCXVpbnQ4X3QgYnV0dG9uQ291bnQ7CisJdWludDhfdCBwb3ZDb3VudDsKK307CisKK2lubGluZSBmbG9hdCBpbnRUb0Zsb2F0KGludCB2YWx1ZSkKK3sKKwlyZXR1cm4gKGZsb2F0KXZhbHVlOworfQorCitpbmxpbmUgaW50IGZsb2F0VG9JbnQoZmxvYXQgdmFsdWUpCit7CisJcmV0dXJuIHJvdW5kKHZhbHVlKTsKK30KKworZXh0ZXJuICJDIgoreworCWV4dGVybiBjb25zdCB1aW50MzJfdCBkaW9fa051bVN5c3RlbXM7CisJZXh0ZXJuIGNvbnN0IHVpbnQzMl90IHNvbGVub2lkX2tOdW1ETzdfMEVsZW1lbnRzOworCWV4dGVybiBjb25zdCB1aW50MzJfdCBpbnRlcnJ1cHRfa051bVN5c3RlbXM7CisJZXh0ZXJuIGNvbnN0IHVpbnQzMl90IGtTeXN0ZW1DbG9ja1RpY2tzUGVyTWljcm9zZWNvbmQ7CisKKwl2b2lkKiBnZXRQb3J0KHVpbnQ4X3QgcGluKTsKKwl2b2lkKiBnZXRQb3J0V2l0aE1vZHVsZSh1aW50OF90IG1vZHVsZSwgdWludDhfdCBwaW4pOworCWNvbnN0IGNoYXIqIGdldEhBTEVycm9yTWVzc2FnZShpbnQzMl90IGNvZGUpOworCisJdWludDE2X3QgZ2V0RlBHQVZlcnNpb24oaW50MzJfdCAqc3RhdHVzKTsKKwl1aW50MzJfdCBnZXRGUEdBUmV2aXNpb24oaW50MzJfdCAqc3RhdHVzKTsKKwl1aW50MzJfdCBnZXRGUEdBVGltZShpbnQzMl90ICpzdGF0dXMpOworCisJYm9vbCBnZXRGUEdBQnV0dG9uKGludDMyX3QgKnN0YXR1cyk7CisKKwlpbnQgSEFMU2V0RXJyb3JEYXRhKGNvbnN0IGNoYXIgKmVycm9ycywgaW50IGVycm9yc0xlbmd0aCwgaW50IHdhaXRfbXMpOworCisJaW50IEhBTEdldENvbnRyb2xXb3JkKEhBTENvbnRyb2xXb3JkICpkYXRhKTsKKwlpbnQgSEFMR2V0QWxsaWFuY2VTdGF0aW9uKGVudW0gSEFMQWxsaWFuY2VTdGF0aW9uSUQgKmFsbGlhbmNlU3RhdGlvbik7CisJaW50IEhBTEdldEpveXN0aWNrQXhlcyh1aW50OF90IGpveXN0aWNrTnVtLCBIQUxKb3lzdGlja0F4ZXMgKmF4ZXMpOworCWludCBIQUxHZXRKb3lzdGlja1BPVnModWludDhfdCBqb3lzdGlja051bSwgSEFMSm95c3RpY2tQT1ZzICpwb3ZzKTsKKwlpbnQgSEFMR2V0Sm95c3RpY2tCdXR0b25zKHVpbnQ4X3Qgam95c3RpY2tOdW0sIEhBTEpveXN0aWNrQnV0dG9ucyAqYnV0dG9ucyk7CisJaW50IEhBTEdldEpveXN0aWNrRGVzY3JpcHRvcih1aW50OF90IGpveXN0aWNrTnVtLCBIQUxKb3lzdGlja0Rlc2NyaXB0b3IgKmRlc2MpOworCWludCBIQUxTZXRKb3lzdGlja091dHB1dHModWludDhfdCBqb3lzdGlja051bSwgdWludDMyX3Qgb3V0cHV0cywgdWludDE2X3QgbGVmdFJ1bWJsZSwgdWludDE2X3QgcmlnaHRSdW1ibGUpOworCWludCBIQUxHZXRNYXRjaFRpbWUoZmxvYXQgKm1hdGNoVGltZSk7CisKKwl2b2lkIEhBTFNldE5ld0RhdGFTZW0oTVVMVElXQUlUX0lEIHNlbSk7CisJCisJYm9vbCBIQUxHZXRTeXN0ZW1BY3RpdmUoaW50MzJfdCAqc3RhdHVzKTsKKwlib29sIEhBTEdldEJyb3duZWRPdXQoaW50MzJfdCAqc3RhdHVzKTsKKworCWludCBIQUxJbml0aWFsaXplKGludCBtb2RlID0gMCk7CisJdm9pZCBIQUxOZXR3b3JrQ29tbXVuaWNhdGlvbk9ic2VydmVVc2VyUHJvZ3JhbVN0YXJ0aW5nKCk7CisJdm9pZCBIQUxOZXR3b3JrQ29tbXVuaWNhdGlvbk9ic2VydmVVc2VyUHJvZ3JhbURpc2FibGVkKCk7CisJdm9pZCBIQUxOZXR3b3JrQ29tbXVuaWNhdGlvbk9ic2VydmVVc2VyUHJvZ3JhbUF1dG9ub21vdXMoKTsKKwl2b2lkIEhBTE5ldHdvcmtDb21tdW5pY2F0aW9uT2JzZXJ2ZVVzZXJQcm9ncmFtVGVsZW9wKCk7CisJdm9pZCBIQUxOZXR3b3JrQ29tbXVuaWNhdGlvbk9ic2VydmVVc2VyUHJvZ3JhbVRlc3QoKTsKKworCXVpbnQzMl90IEhBTFJlcG9ydCh1aW50OF90IHJlc291cmNlLCB1aW50OF90IGluc3RhbmNlTnVtYmVyLCB1aW50OF90IGNvbnRleHQgPSAwLAorCQkJY29uc3QgY2hhciAqZmVhdHVyZSA9IE5VTEwpOworfQorCisvLyBUT0RPOiBIQUNLUyBmb3Igbm93Li4uCitleHRlcm4gIkMiCit7CisKKwl2b2lkIE51bWVyaWNBcnJheVJlc2l6ZSgpOworCXZvaWQgUlRTZXRDbGVhbnVwUHJvYygpOworCXZvaWQgRURWUl9DcmVhdGVSZWZlcmVuY2UoKTsKKwl2b2lkIE9jY3VyKCk7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvaW5jbHVkZS9IQUwvSW50ZXJydXB0cy5ocHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvaW5jbHVkZS9IQUwvSW50ZXJydXB0cy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM2ZTgwOQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9pbmNsdWRlL0hBTC9JbnRlcnJ1cHRzLmhwcApAQCAtMCwwICsxLDMwIEBACisjcHJhZ21hIG9uY2UKKworI2lmZGVmIF9fdnh3b3JrcworI2luY2x1ZGUgPHZ4V29ya3MuaD4KKyNlbHNlCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgImVycm5vLmgiCisKK2V4dGVybiAiQyIKK3sKKwl0eXBlZGVmIHZvaWQgKCpJbnRlcnJ1cHRIYW5kbGVyRnVuY3Rpb24pKHVpbnQzMl90IGludGVycnVwdEFzc2VydGVkTWFzaywgdm9pZCAqcGFyYW0pOworCisJdm9pZCogaW5pdGlhbGl6ZUludGVycnVwdHModWludDMyX3QgaW50ZXJydXB0SW5kZXgsIGJvb2wgd2F0Y2hlciwgaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkIGNsZWFuSW50ZXJydXB0cyh2b2lkKiBpbnRlcnJ1cHRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKworCXVpbnQzMl90IHdhaXRGb3JJbnRlcnJ1cHQodm9pZCogaW50ZXJydXB0X3BvaW50ZXIsIGRvdWJsZSB0aW1lb3V0LCBib29sIGlnbm9yZVByZXZpb3VzLCBpbnQzMl90ICpzdGF0dXMpOworCXZvaWQgZW5hYmxlSW50ZXJydXB0cyh2b2lkKiBpbnRlcnJ1cHRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkIGRpc2FibGVJbnRlcnJ1cHRzKHZvaWQqIGludGVycnVwdF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCWRvdWJsZSByZWFkUmlzaW5nVGltZXN0YW1wKHZvaWQqIGludGVycnVwdF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCWRvdWJsZSByZWFkRmFsbGluZ1RpbWVzdGFtcCh2b2lkKiBpbnRlcnJ1cHRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkIHJlcXVlc3RJbnRlcnJ1cHRzKHZvaWQqIGludGVycnVwdF9wb2ludGVyLCB1aW50OF90IHJvdXRpbmdfbW9kdWxlLCB1aW50MzJfdCByb3V0aW5nX3BpbiwKKwkJCWJvb2wgcm91dGluZ19hbmFsb2dfdHJpZ2dlciwgaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkIGF0dGFjaEludGVycnVwdEhhbmRsZXIodm9pZCogaW50ZXJydXB0X3BvaW50ZXIsIEludGVycnVwdEhhbmRsZXJGdW5jdGlvbiBoYW5kbGVyLAorCQkJdm9pZCogcGFyYW0sIGludDMyX3QgKnN0YXR1cyk7CisJdm9pZCBzZXRJbnRlcnJ1cHRVcFNvdXJjZUVkZ2Uodm9pZCogaW50ZXJydXB0X3BvaW50ZXIsIGJvb2wgcmlzaW5nRWRnZSwgYm9vbCBmYWxsaW5nRWRnZSwKKwkJCWludDMyX3QgKnN0YXR1cyk7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvaW5jbHVkZS9IQUwvTm90aWZpZXIuaHBwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2luY2x1ZGUvSEFML05vdGlmaWVyLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODc2ODZjCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2luY2x1ZGUvSEFML05vdGlmaWVyLmhwcApAQCAtMCwwICsxLDE1IEBACisjcHJhZ21hIG9uY2UKKworI2lmZGVmIF9fdnh3b3JrcworI2luY2x1ZGUgPHZ4V29ya3MuaD4KKyNlbHNlCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKworZXh0ZXJuICJDIgoreworCXZvaWQqIGluaXRpYWxpemVOb3RpZmllcih2b2lkICgqUHJvY2Vzc1F1ZXVlKSh1aW50MzJfdCwgdm9pZCopLCBpbnQzMl90ICpzdGF0dXMpOworCXZvaWQgY2xlYW5Ob3RpZmllcih2b2lkKiBub3RpZmllcl9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCisJdm9pZCB1cGRhdGVOb3RpZmllckFsYXJtKHZvaWQqIG5vdGlmaWVyX3BvaW50ZXIsIHVpbnQzMl90IHRyaWdnZXJUaW1lLCBpbnQzMl90ICpzdGF0dXMpOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2luY2x1ZGUvSEFML1BEUC5ocHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvaW5jbHVkZS9IQUwvUERQLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGRlMjJiCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2luY2x1ZGUvSEFML1BEUC5ocHAKQEAgLTAsMCArMSwxOSBAQAorI3ByYWdtYSBvbmNlCisKKyNpZmRlZiBfX3Z4d29ya3MKKyNpbmNsdWRlIDx2eFdvcmtzLmg+CisjZWxzZQorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisKK2V4dGVybiAiQyIKK3sKKwlkb3VibGUgZ2V0UERQVGVtcGVyYXR1cmUoaW50MzJfdCAqc3RhdHVzKTsKKwlkb3VibGUgZ2V0UERQVm9sdGFnZShpbnQzMl90ICpzdGF0dXMpOworCWRvdWJsZSBnZXRQRFBDaGFubmVsQ3VycmVudCh1aW50OF90IGNoYW5uZWwsIGludDMyX3QgKnN0YXR1cyk7CisJZG91YmxlIGdldFBEUFRvdGFsQ3VycmVudChpbnQzMl90ICpzdGF0dXMpOworCWRvdWJsZSBnZXRQRFBUb3RhbFBvd2VyKGludDMyX3QgKnN0YXR1cyk7CisJZG91YmxlIGdldFBEUFRvdGFsRW5lcmd5KGludDMyX3QgKnN0YXR1cyk7CisJdm9pZCByZXNldFBEUFRvdGFsRW5lcmd5KGludDMyX3QgKnN0YXR1cyk7CisJdm9pZCBjbGVhclBEUFN0aWNreUZhdWx0cyhpbnQzMl90ICpzdGF0dXMpOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2luY2x1ZGUvSEFML1Bvd2VyLmhwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9pbmNsdWRlL0hBTC9Qb3dlci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQzMGMxZQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9pbmNsdWRlL0hBTC9Qb3dlci5ocHAKQEAgLTAsMCArMSwyMSBAQAorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworZXh0ZXJuICJDIgoreworCWZsb2F0IGdldFZpblZvbHRhZ2UoaW50MzJfdCAqc3RhdHVzKTsKKwlmbG9hdCBnZXRWaW5DdXJyZW50KGludDMyX3QgKnN0YXR1cyk7CisJZmxvYXQgZ2V0VXNlclZvbHRhZ2U2VihpbnQzMl90ICpzdGF0dXMpOworCWZsb2F0IGdldFVzZXJDdXJyZW50NlYoaW50MzJfdCAqc3RhdHVzKTsKKwlib29sIGdldFVzZXJBY3RpdmU2VihpbnQzMl90ICpzdGF0dXMpOworCWludCBnZXRVc2VyQ3VycmVudEZhdWx0czZWKGludDMyX3QgKnN0YXR1cyk7CisJZmxvYXQgZ2V0VXNlclZvbHRhZ2U1VihpbnQzMl90ICpzdGF0dXMpOworCWZsb2F0IGdldFVzZXJDdXJyZW50NVYoaW50MzJfdCAqc3RhdHVzKTsKKwlib29sIGdldFVzZXJBY3RpdmU1VihpbnQzMl90ICpzdGF0dXMpOworCWludCBnZXRVc2VyQ3VycmVudEZhdWx0czVWKGludDMyX3QgKnN0YXR1cyk7CisJZmxvYXQgZ2V0VXNlclZvbHRhZ2UzVjMoaW50MzJfdCAqc3RhdHVzKTsKKwlmbG9hdCBnZXRVc2VyQ3VycmVudDNWMyhpbnQzMl90ICpzdGF0dXMpOworCWJvb2wgZ2V0VXNlckFjdGl2ZTNWMyhpbnQzMl90ICpzdGF0dXMpOworCWludCBnZXRVc2VyQ3VycmVudEZhdWx0czNWMyhpbnQzMl90ICpzdGF0dXMpOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2luY2x1ZGUvSEFML1NlbWFwaG9yZS5ocHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvaW5jbHVkZS9IQUwvU2VtYXBob3JlLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDIwMTFmCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2luY2x1ZGUvSEFML1NlbWFwaG9yZS5ocHAKQEAgLTAsMCArMSw1MyBAQAorI3ByYWdtYSBvbmNlCisKKyNpZmRlZiBfX3Z4d29ya3MKKyNpbmNsdWRlIDx2eFdvcmtzLmg+CisjZWxzZQorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxzZW1hcGhvcmUuaD4KKyNlbmRpZgorCisjaWZkZWYgX192eHdvcmtzCit0eXBlZGVmIFNFTV9JRCBNVVRFWF9JRDsKK3R5cGVkZWYgU0VNX0lEIFNFTUFQSE9SRV9JRDsKK3R5cGVkZWYgU0VNX0lEIE1VTFRJV0FJVF9JRDsKKyNlbHNlCitjbGFzcyBNdXRleEludGVyZmFjZTsKK3R5cGVkZWYgTXV0ZXhJbnRlcmZhY2UqIE1VVEVYX0lEOwordHlwZWRlZiBzZW1fdCogU0VNQVBIT1JFX0lEOwordHlwZWRlZiBwdGhyZWFkX2NvbmRfdCogTVVMVElXQUlUX0lEOworI2VuZGlmCisKK2V4dGVybiAiQyIKK3sKKwlleHRlcm4gY29uc3QgdWludDMyX3QgU0VNQVBIT1JFX1FfRklGTzsKKwlleHRlcm4gY29uc3QgdWludDMyX3QgU0VNQVBIT1JFX1FfUFJJT1JJVFk7CisJZXh0ZXJuIGNvbnN0IHVpbnQzMl90IFNFTUFQSE9SRV9ERUxFVEVfU0FGRTsKKwlleHRlcm4gY29uc3QgdWludDMyX3QgU0VNQVBIT1JFX0lOVkVSU0lPTl9TQUZFOworCisJZXh0ZXJuIGNvbnN0IGludDMyX3QgU0VNQVBIT1JFX05PX1dBSVQ7CisJZXh0ZXJuIGNvbnN0IGludDMyX3QgU0VNQVBIT1JFX1dBSVRfRk9SRVZFUjsKKworCWV4dGVybiBjb25zdCB1aW50MzJfdCBTRU1BUEhPUkVfRU1QVFk7CisJZXh0ZXJuIGNvbnN0IHVpbnQzMl90IFNFTUFQSE9SRV9GVUxMOworCisJTVVURVhfSUQgaW5pdGlhbGl6ZU11dGV4UmVjdXJzaXZlKCk7CisJTVVURVhfSUQgaW5pdGlhbGl6ZU11dGV4Tm9ybWFsKCk7CisJdm9pZCBkZWxldGVNdXRleChNVVRFWF9JRCBzZW0pOworCWludDhfdCBsb2NrTXV0ZXgoTVVURVhfSUQgc2VtKTsKKwlpbnQ4X3QgdHJ5TG9ja011dGV4KE1VVEVYX0lEIHNlbSk7CisJaW50OF90IHVubG9ja011dGV4KE1VVEVYX0lEIHNlbSk7CisKKwlTRU1BUEhPUkVfSUQgaW5pdGlhbGl6ZVNlbWFwaG9yZSh1aW50MzJfdCBpbml0aWFsX3ZhbHVlKTsKKwl2b2lkIGRlbGV0ZVNlbWFwaG9yZShTRU1BUEhPUkVfSUQgc2VtKTsKKwlpbnQ4X3QgdGFrZVNlbWFwaG9yZShTRU1BUEhPUkVfSUQgc2VtKTsKKwlpbnQ4X3QgdHJ5VGFrZVNlbWFwaG9yZShTRU1BUEhPUkVfSUQgc2VtKTsKKwlpbnQ4X3QgZ2l2ZVNlbWFwaG9yZShTRU1BUEhPUkVfSUQgc2VtKTsKKworCU1VTFRJV0FJVF9JRCBpbml0aWFsaXplTXVsdGlXYWl0KCk7CisJdm9pZCBkZWxldGVNdWx0aVdhaXQoTVVMVElXQUlUX0lEIHNlbSk7CisJaW50OF90IHRha2VNdWx0aVdhaXQoTVVMVElXQUlUX0lEIHNlbSwgTVVURVhfSUQgbSwgaW50MzJfdCB0aW1lb3V0KTsKKwlpbnQ4X3QgZ2l2ZU11bHRpV2FpdChNVUxUSVdBSVRfSUQgc2VtKTsKK30KKwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2luY2x1ZGUvSEFML1NvbGVub2lkLmhwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9pbmNsdWRlL0hBTC9Tb2xlbm9pZC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY1NGRjMgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9pbmNsdWRlL0hBTC9Tb2xlbm9pZC5ocHAKQEAgLTAsMCArMSwyMiBAQAorI3ByYWdtYSBvbmNlCisKKyNpZmRlZiBfX3Z4d29ya3MKKyNpbmNsdWRlIDx2eFdvcmtzLmg+CisjZWxzZQorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisKK2V4dGVybiAiQyIKK3sKKwl2b2lkKiBpbml0aWFsaXplU29sZW5vaWRQb3J0KHZvaWQqIHBvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwlib29sIGNoZWNrU29sZW5vaWRNb2R1bGUodWludDhfdCBtb2R1bGUpOworCisJYm9vbCBnZXRTb2xlbm9pZCh2b2lkKiBzb2xlbm9pZF9wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisJdm9pZCBzZXRTb2xlbm9pZCh2b2lkKiBzb2xlbm9pZF9wb3J0X3BvaW50ZXIsIGJvb2wgdmFsdWUsIGludDMyX3QgKnN0YXR1cyk7CisJdm9pZCBzZXRTb2xlbm9pZHModm9pZCogc29sZW5vaWRfcG9ydF9wb2ludGVyLCB1aW50OF90IHZhbHVlLCB1aW50OF90IG1hc2ssIGludDMyX3QgKnN0YXR1cyk7CisKKwlpbnQgZ2V0UENNU29sZW5vaWRCbGFja0xpc3Qodm9pZCogc29sZW5vaWRfcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCWJvb2wgZ2V0UENNU29sZW5vaWRWb2x0YWdlU3RpY2t5RmF1bHQodm9pZCogc29sZW5vaWRfcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCWJvb2wgZ2V0UENNU29sZW5vaWRWb2x0YWdlRmF1bHQodm9pZCogc29sZW5vaWRfcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCXZvaWQgY2xlYXJBbGxQQ01TdGlja3lGYXVsdHNfc29sKHZvaWQgKnNvbGVub2lkX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9pbmNsdWRlL0hBTC9UYXNrLmhwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9pbmNsdWRlL0hBTC9UYXNrLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzNlZDliCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2luY2x1ZGUvSEFML1Rhc2suaHBwCkBAIC0wLDAgKzEsNTUgQEAKKyNwcmFnbWEgb25jZQorCisjaWZkZWYgX192eHdvcmtzCisjaW5jbHVkZSA8dnhXb3Jrcy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjZW5kaWYKKworI2lmbmRlZiBfRlVOQ1BUUl9ERUZJTkVECisjZGVmaW5lIF9GVU5DUFRSX0RFRklORUQKKyNpZmRlZiBfX2NwbHVzcGx1cwordHlwZWRlZiBpbnQgKCpGVU5DUFRSKSguLi4pOworLyogcHRyIHRvIGZ1bmN0aW9uIHJldHVybmluZyBpbnQgKi8KKyNlbHNlCit0eXBlZGVmIGludCAoKkZVTkNQVFIpICgpOyAvKiBwdHIgdG8gZnVuY3Rpb24gcmV0dXJuaW5nIGludCAqLworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisjZW5kaWYgLyogX0ZVTkNQVFJfREVGSU5FRCAqLworCisjaWZuZGVmIF9TVEFUVVNfREVGSU5FRAorI2RlZmluZSBfU1RBVFVTX0RFRklORUQKK3R5cGVkZWYgaW50IFNUQVRVUzsKKyNlbmRpZiAvKiBfU1RBVFVTX0RFRklORUQgKi8KKworI2lmZGVmIF9fdnh3b3JrcworI2RlZmluZSBOVUxMX1RBU0sgLTEKK3R5cGVkZWYgaW50MzJfdCBUQVNLOworI2Vsc2UKKyNkZWZpbmUgTlVMTF9UQVNLIE5VTEwKK3R5cGVkZWYgcHRocmVhZF90KiBUQVNLOworI2VuZGlmCisKK2V4dGVybiAiQyIKK3sKKwlleHRlcm4gY29uc3QgdWludDMyX3QgVlhXT1JLU19GUF9UQVNLOworCWV4dGVybiBjb25zdCBpbnQzMl90IEhBTF9vYmpMaWJfT0JKX0lEX0VSUk9SOworCWV4dGVybiBjb25zdCBpbnQzMl90IEhBTF9vYmpMaWJfT0JKX0RFTEVURUQ7CisJZXh0ZXJuIGNvbnN0IGludDMyX3QgSEFMX3Rhc2tMaWJfSUxMRUdBTF9PUFRJT05TOworCWV4dGVybiBjb25zdCBpbnQzMl90IEhBTF9tZW1MaWJfTk9UX0VOT1VHSF9NRU1PUlk7CisJZXh0ZXJuIGNvbnN0IGludDMyX3QgSEFMX3Rhc2tMaWJfSUxMRUdBTF9QUklPUklUWTsKKworCVRBU0sgc3Bhd25UYXNrKGNoYXIgKiBuYW1lLCBpbnQgcHJpb3JpdHksIGludCBvcHRpb25zLCBpbnQgc3RhY2tTaXplLCBGVU5DUFRSIGVudHJ5UHQsCisJCQl1aW50MzJfdCBhcmcwLCB1aW50MzJfdCBhcmcxLCB1aW50MzJfdCBhcmcyLCB1aW50MzJfdCBhcmczLCB1aW50MzJfdCBhcmc0LAorCQkJdWludDMyX3QgYXJnNSwgdWludDMyX3QgYXJnNiwgdWludDMyX3QgYXJnNywgdWludDMyX3QgYXJnOCwgdWludDMyX3QgYXJnOSk7CisJU1RBVFVTIHJlc3RhcnRUYXNrKFRBU0sgdGFzayk7CisJU1RBVFVTIGRlbGV0ZVRhc2soVEFTSyB0YXNrKTsKKwlTVEFUVVMgaXNUYXNrUmVhZHkoVEFTSyB0YXNrKTsKKwlTVEFUVVMgaXNUYXNrU3VzcGVuZGVkKFRBU0sgdGFzayk7CisJU1RBVFVTIHN1c3BlbmRUYXNrKFRBU0sgdGFzayk7CisJU1RBVFVTIHJlc3VtZVRhc2soVEFTSyB0YXNrKTsKKwlTVEFUVVMgdmVyaWZ5VGFza0lEKFRBU0sgdGFzayk7CisJU1RBVFVTIHNldFRhc2tQcmlvcml0eShUQVNLIHRhc2ssIGludCBwcmlvcml0eSk7CisJU1RBVFVTIGdldFRhc2tQcmlvcml0eShUQVNLIHRhc2ssIGludCogcHJpb3JpdHkpOworfQorCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvaW5jbHVkZS9IQUwvVXRpbGl0aWVzLmhwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9pbmNsdWRlL0hBTC9VdGlsaXRpZXMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNGNkMjkKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvaW5jbHVkZS9IQUwvVXRpbGl0aWVzLmhwcApAQCAtMCwwICsxLDE3IEBACisjcHJhZ21hIG9uY2UKKworI2lmZGVmIF9fdnh3b3JrcworI2luY2x1ZGUgPHZ4V29ya3MuaD4KKyNlbHNlCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKworZXh0ZXJuICJDIgoreworCWV4dGVybiBjb25zdCBpbnQzMl90IEhBTF9OT19XQUlUOworCWV4dGVybiBjb25zdCBpbnQzMl90IEhBTF9XQUlUX0ZPUkVWRVI7CisKKwl2b2lkIGRlbGF5VGlja3MoaW50MzJfdCB0aWNrcyk7CisJdm9pZCBkZWxheU1pbGxpcyhkb3VibGUgbXMpOworCXZvaWQgZGVsYXlTZWNvbmRzKGRvdWJsZSBzKTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9pbmNsdWRlL0hBTC9jcHAvUmVzb3VyY2UuaHBwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2luY2x1ZGUvSEFML2NwcC9SZXNvdXJjZS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMxNDA3ZgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9pbmNsdWRlL0hBTC9jcHAvUmVzb3VyY2UuaHBwCkBAIC0wLDAgKzEsNDUgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiLi4vRXJyb3JzLmhwcCIKKyNpbmNsdWRlICJTeW5jaHJvbml6ZWQuaHBwIgorI2lmZGVmIF9fdnh3b3JrcworI2luY2x1ZGUgPHZ4V29ya3MuaD4KKyNlbHNlCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKworLyoqCisgKiBUaGUgUmVzb3VyY2UgY2xhc3MgaXMgYSBjb252ZW5pZW50IHdheSB0byB0cmFjayBhbGxvY2F0ZWQgcmVzb3VyY2VzLgorICogSXQgdHJhY2tzIHRoZW0gYXMgaW5kaWNpZXMgaW4gdGhlIHJhbmdlIFswIC4uIGVsZW1lbnRzIC0gMV0uCisgKiBFLmcuIHRoZSBsaWJyYXJ5IHVzZXMgdGhpcyB0byB0cmFjayBoYXJkd2FyZSBjaGFubmVsIGFsbG9jYXRpb24uCisgKgorICogVGhlIFJlc291cmNlIGNsYXNzIGRvZXMgbm90IGFsbG9jYXRlIHRoZSBoYXJkd2FyZSBjaGFubmVscyBvciBvdGhlcgorICogcmVzb3VyY2VzOyBpdCBqdXN0IHRyYWNrcyB3aGljaCBpbmRpY2VzIHdlcmUgbWFya2VkIGluIHVzZSBieQorICogQWxsb2NhdGUgYW5kIG5vdCB5ZXQgZnJlZWQgYnkgRnJlZS4KKyAqLworY2xhc3MgUmVzb3VyY2UKK3sKK3B1YmxpYzoKKwl2aXJ0dWFsIH5SZXNvdXJjZSgpOworCXN0YXRpYyB2b2lkIENyZWF0ZVJlc291cmNlT2JqZWN0KFJlc291cmNlICoqciwgdWludDMyX3QgZWxlbWVudHMpOworCXVpbnQzMl90IEFsbG9jYXRlKGNvbnN0IGNoYXIgKnJlc291cmNlRGVzYyk7CisJdWludDMyX3QgQWxsb2NhdGUodWludDMyX3QgaW5kZXgsIGNvbnN0IGNoYXIgKnJlc291cmNlRGVzYyk7CisJdm9pZCBGcmVlKHVpbnQzMl90IGluZGV4KTsKKworcHJpdmF0ZToKKwlleHBsaWNpdCBSZXNvdXJjZSh1aW50MzJfdCBzaXplKTsKKworCWJvb2wgKm1faXNBbGxvY2F0ZWQ7CisJUmVlbnRyYW50TXV0ZXggbV9hbGxvY2F0ZUxvY2s7CisJdWludDMyX3QgbV9zaXplOworCisJc3RhdGljIFJlZW50cmFudE11dGV4IG1fY3JlYXRlTG9jazsKKworCURJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihSZXNvdXJjZSk7Cit9OworCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvaW5jbHVkZS9IQUwvY3BwL1N5bmNocm9uaXplZC5ocHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvaW5jbHVkZS9IQUwvY3BwL1N5bmNocm9uaXplZC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY4YjE0OQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9pbmNsdWRlL0hBTC9jcHAvU3luY2hyb25pemVkLmhwcApAQCAtMCwwICsxLDE0NCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlICJIQUwvU2VtYXBob3JlLmhwcCIKKworLy8gQSBtYWNybyB0byBkaXNhbGxvdyB0aGUgY29weSBjb25zdHJ1Y3RvciBhbmQgb3BlcmF0b3I9IGZ1bmN0aW9ucworLy8gVGhpcyBzaG91bGQgYmUgdXNlZCBpbiB0aGUgcHJpdmF0ZTogZGVjbGFyYXRpb25zIGZvciBhIGNsYXNzCisjZGVmaW5lIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihUeXBlTmFtZSkgXAorICBUeXBlTmFtZShjb25zdCBUeXBlTmFtZSYpID0gZGVsZXRlOyAgICAgIFwKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVHlwZU5hbWUmKSA9IGRlbGV0ZQorCitjbGFzcyBTeW5jaHJvbml6ZWQ7CisKKy8qKgorICogV3JhcCBhIHB0aGVhZCBtdXRleCBmb3IgZWFzaWVyIHVzZSBpbiBDKysuIEZvciBhIHN0YXRpYworICogaW5zdGFuY2UsIHRoZSBjb25zdHJ1Y3RvciBydW5zIGF0IHByb2dyYW0gbG9hZCB0aW1lIGJlZm9yZSBtYWluKCkgY2FuIHNwYXduCisgKiBhbnkgdGFza3MuIFVzZSB0aGF0IHRvIGZpeCByYWNlIGNvbmRpdGlvbnMgaW4gc2V0dXAgY29kZS4KKyAqCisgKiBUaGlzIHVzZXMgYSBwdGhyZWFkIG11dGV4IHdoaWNoIGhhcyBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRSBzZXQsIG1ha2luZyBpdAorICogInJlZW50cmFudCIgaW4gdGhlIHNlbnNlIHRoYXQgdGhlIG93bmluZyB0YXNrIGNhbiBsb2NrIGl0IG1vcmUgdGhhbiBvbmNlLiBUaGUKKyAqIHRhc2sgd2lsbCBuZWVkIHRvIHVubG9jayB0aGUgbXV0ZXggdGhlIHNhbWUgbnVtYmVyIG9mIHRpbWVzIHRvIG1ha2UgaXQKKyAqIGF2YWlsYWJsZSBmb3Igb3RoZXIgdGhyZWFkcyB0byBhY3F1aXJlLgorICoKKyAqIFRoaXMgY2xhc3MgaXMgc2FmZSB0byB1c2UgaW4gc3RhdGljIHZhcmlhYmxlcyBiZWNhdXNlIGl0IGRvZXMgbm90IGRlcGVuZCBvbgorICogYW55IG90aGVyIEMrKyBzdGF0aWMgY29uc3RydWN0b3JzIG9yIGRlc3RydWN0b3JzLgorICovCitjbGFzcyBSZWVudHJhbnRNdXRleCB7CisgcHVibGljOgorICB0eXBlZGVmIHB0aHJlYWRfbXV0ZXhfdCAqbmF0aXZlX2hhbmRsZV90eXBlOworCisgIGNvbnN0ZXhwciBSZWVudHJhbnRNdXRleCgpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKyAgUmVlbnRyYW50TXV0ZXgoY29uc3QgUmVlbnRyYW50TXV0ZXggJikgPSBkZWxldGU7CisgIFJlZW50cmFudE11dGV4ICZvcGVyYXRvcj0oY29uc3QgUmVlbnRyYW50TXV0ZXggJikgPSBkZWxldGU7CisKKyAgLyoqCisgICAqIExvY2sgdGhlIG11dGV4LCBibG9ja2luZyB1bnRpbCBpdCdzIGF2YWlsYWJsZS4KKyAgICovCisgIHZvaWQgbG9jaygpIHsgcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleF8pOyB9CisKKyAgLyoqCisgICAqIFVubG9jayB0aGUgbXV0ZXguCisgICAqLworICB2b2lkIHVubG9jaygpIHsgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4Xyk7IH0KKworICAvKioKKyAgICogVHJpZXMgdG8gbG9jayB0aGUgbXV0ZXguCisgICAqLworICBib29sIHRyeV9sb2NrKCkgbm9leGNlcHQgeyByZXR1cm4gIXB0aHJlYWRfbXV0ZXhfdHJ5bG9jaygmbXV0ZXhfKTsgfQorCisgIHB0aHJlYWRfbXV0ZXhfdCAqbmF0aXZlX2hhbmRsZSgpIHsgcmV0dXJuICZtdXRleF87IH0KKworIHByaXZhdGU6CisgIC8vIERvIHRoZSBlcXVpdmFsZW50IG9mIHNldHRpbmcgUFRIUkVBRF9QUklPX0lOSEVSSVQgYW5kCisgIC8vIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFX05QLgorI2lmIF9fV09SRFNJWkUgPT0gNjQKKyAgI2Vycm9yICJTaG91bGQgd29yaywgYnV0IG5lZWQgdG8gcnVuIHRlc3QgY2FzZSB0byB2ZXJpZnkiCisgIHB0aHJlYWRfbXV0ZXhfdCBtdXRleF8gPSB7CisgICAgICB7MCwgMCwgMCwgMCwgMHgyMCB8IFBUSFJFQURfTVVURVhfUkVDVVJTSVZFX05QLCAwLCB7MCwgMH19fTsKKyNlbHNlCisgIHB0aHJlYWRfbXV0ZXhfdCBtdXRleF8gPSB7CisgICAgICB7MCwgMCwgMCwgMHgyMCB8IFBUSFJFQURfTVVURVhfUkVDVVJTSVZFX05QLCAwLCB7MH19fTsKKyNlbmRpZgorfTsKKworLyoqCisgKiBXcmFwIGEgcHRoZWFkIG11dGV4IGZvciBlYXNpZXIgdXNlIGluIEMrKy4gRm9yIGEgc3RhdGljCisgKiBpbnN0YW5jZSwgdGhlIGNvbnN0cnVjdG9yIHJ1bnMgYXQgcHJvZ3JhbSBsb2FkIHRpbWUgYmVmb3JlIG1haW4oKSBjYW4gc3Bhd24KKyAqIGFueSB0YXNrcy4gVXNlIHRoYXQgdG8gZml4IHJhY2UgY29uZGl0aW9ucyBpbiBzZXR1cCBjb2RlLgorICoKKyAqIFRoaXMgY2xhc3MgaXMgc2FmZSB0byB1c2UgaW4gc3RhdGljIHZhcmlhYmxlcyBiZWNhdXNlIGl0IGRvZXMgbm90IGRlcGVuZCBvbgorICogYW55IG90aGVyIEMrKyBzdGF0aWMgY29uc3RydWN0b3JzIG9yIGRlc3RydWN0b3JzLgorICovCitjbGFzcyBNdXRleCB7CisgcHVibGljOgorICB0eXBlZGVmIHB0aHJlYWRfbXV0ZXhfdCAqbmF0aXZlX2hhbmRsZV90eXBlOworCisgIGNvbnN0ZXhwciBNdXRleCgpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKyAgTXV0ZXgoY29uc3QgTXV0ZXggJikgPSBkZWxldGU7CisgIE11dGV4ICZvcGVyYXRvcj0oY29uc3QgTXV0ZXggJikgPSBkZWxldGU7CisKKyAgLyoqCisgICAqIExvY2sgdGhlIG11dGV4LCBibG9ja2luZyB1bnRpbCBpdCdzIGF2YWlsYWJsZS4KKyAgICovCisgIHZvaWQgbG9jaygpIHsgcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleF8pOyB9CisKKyAgLyoqCisgICAqIFVubG9jayB0aGUgbXV0ZXguCisgICAqLworICB2b2lkIHVubG9jaygpIHsgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4Xyk7IH0KKworICAvKioKKyAgICogVHJpZXMgdG8gbG9jayB0aGUgbXV0ZXguCisgICAqLworICBib29sIHRyeV9sb2NrKCkgbm9leGNlcHQgeyByZXR1cm4gIXB0aHJlYWRfbXV0ZXhfdHJ5bG9jaygmbXV0ZXhfKTsgfQorCisgIG5hdGl2ZV9oYW5kbGVfdHlwZSBuYXRpdmVfaGFuZGxlKCkgeyByZXR1cm4gJm11dGV4XzsgfQorCisgcHJpdmF0ZToKKyAgLy8gRG8gdGhlIGVxdWl2YWxlbnQgb2Ygc2V0dGluZyBQVEhSRUFEX1BSSU9fSU5IRVJJVC4KKyNpZiBfX1dPUkRTSVpFID09IDY0CisgICNlcnJvciAiU2hvdWxkIHdvcmssIGJ1dCBuZWVkIHRvIHJ1biB0ZXN0IGNhc2UgdG8gdmVyaWZ5IgorICBwdGhyZWFkX211dGV4X3QgbXV0ZXhfID0geyB7IDAsIDAsIDAsIDAsIDB4MjAsIDAsIHsgMCwgMCB9IH0gfTsKKyNlbHNlCisgIHB0aHJlYWRfbXV0ZXhfdCBtdXRleF8gPSB7IHsgMCwgMCwgMCwgMHgyMCwgMCwgeyAwIH0gfSB9OworI2VuZGlmCit9OworCisKKy8qKgorICogUHJvdmlkZSBlYXN5IHN1cHBvcnQgZm9yIGNyaXRpY2FsIHJlZ2lvbnMuCisgKgorICogQSBjcml0aWNhbCByZWdpb24gaXMgYW4gYXJlYSBvZiBjb2RlIHRoYXQgaXMgYWx3YXlzIGV4ZWN1dGVkIHVuZGVyIG11dHVhbCBleGNsdXNpb24uIE9ubHkKKyAqIG9uZSB0YXNrIGNhbiBiZSBleGVjdXRpbmcgdGhpcyBjb2RlIGF0IGFueSB0aW1lLiBUaGUgaWRlYSBpcyB0aGF0IGNvZGUgdGhhdCBtYW5pcHVsYXRlcyBkYXRhCisgKiB0aGF0IGlzIHNoYXJlZCBiZXR3ZWVuIHR3byBvciBtb3JlIHRhc2tzIGhhcyB0byBiZSBwcmV2ZW50ZWQgZnJvbSBleGVjdXRpbmcgYXQgdGhlIHNhbWUgdGltZQorICogb3RoZXJ3aXNlIGEgcmFjZSBjb25kaXRpb24gaXMgcG9zc2libGUgd2hlbiBib3RoIHRhc2tzIHRyeSB0byB1cGRhdGUgdGhlIGRhdGEuIFR5cGljYWxseQorICogc2VtYXBob3JlcyBhcmUgdXNlZCB0byBlbnN1cmUgb25seSBzaW5nbGUgdGFzayBhY2Nlc3MgdG8gdGhlIGRhdGEuCisgKgorICogU3luY2hyb25pemVkIG9iamVjdHMgYXJlIGEgc2ltcGxlIHdyYXBwZXIgYXJvdW5kIHNlbWFwaG9yZXMgdG8gaGVscCBlbnN1cmUKKyAqIHRoYXQgc2VtYXBob3JlcyBhcmUgYWx3YXlzIHVubG9ja2VkIChzZW1HaXZlKSBhZnRlciBsb2NraW5nIChzZW1UYWtlKS4KKyAqCisgKiBZb3UgYWxsb2NhdGUgYSBTeW5jaHJvbml6ZWQgYXMgYSBsb2NhbCB2YXJpYWJsZSwgKm5vdCogb24gdGhlIGhlYXAuIFRoYXQKKyAqIG1ha2VzIGl0IGEgInN0YWNrIG9iamVjdCIgd2hvc2UgZGVzdHJ1Y3RvciBydW5zIGF1dG9tYXRpY2FsbHkgd2hlbiBpdCBnb2VzCisgKiBvdXQgb2Ygc2NvcGUuIEUuZy4KKyAqCisgKiAgIHsgU3luY2hyb25pemVkIF9zeW5jKGFSZWVudHJhbnRTZW1hcGhvcmUpOyAuLi4gY3JpdGljYWwgcmVnaW9uIC4uLiB9CisgKi8KK2NsYXNzIFN5bmNocm9uaXplZAoreworcHVibGljOgorI2lmbmRlZiBfX3Z4d29ya3MKKwlleHBsaWNpdCBTeW5jaHJvbml6ZWQoU0VNQVBIT1JFX0lEKTsKKyNlbmRpZgorCXZpcnR1YWwgflN5bmNocm9uaXplZCgpOworcHJpdmF0ZToKKwlTRU1BUEhPUkVfSUQgbV9zZW1hcGhvcmU7CisKKwlESVNBTExPV19DT1BZX0FORF9BU1NJR04oU3luY2hyb25pemVkKTsKK307CisKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9pbmNsdWRlL0xvZy5ocHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvaW5jbHVkZS9Mb2cuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMjIxZTcKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvaW5jbHVkZS9Mb2cuaHBwCkBAIC0wLDAgKzEsMTAzIEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCitpbmxpbmUgc3RkOjpzdHJpbmcgTm93VGltZSgpOworCitlbnVtIFRMb2dMZXZlbCB7bG9nTk9ORSwgbG9nRVJST1IsIGxvZ1dBUk5JTkcsIGxvZ0lORk8sIGxvZ0RFQlVHLCBsb2dERUJVRzEsIGxvZ0RFQlVHMiwgbG9nREVCVUczLCBsb2dERUJVRzR9OworCitjbGFzcyBMb2cKK3sKK3B1YmxpYzoKKyAgICBMb2coKTsKKyAgICB2aXJ0dWFsIH5Mb2coKTsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0mIEdldChUTG9nTGV2ZWwgbGV2ZWwgPSBsb2dJTkZPKTsKK3B1YmxpYzoKKyAgICBzdGF0aWMgVExvZ0xldmVsJiBSZXBvcnRpbmdMZXZlbCgpOworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBUb1N0cmluZyhUTG9nTGV2ZWwgbGV2ZWwpOworICAgIHN0YXRpYyBUTG9nTGV2ZWwgRnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgbGV2ZWwpOworcHJvdGVjdGVkOgorICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKK3ByaXZhdGU6CisgICAgTG9nKGNvbnN0IExvZyYpOworICAgIExvZyYgb3BlcmF0b3IgPShjb25zdCBMb2cmKTsKK307CisKK2lubGluZSBMb2c6OkxvZygpCit7Cit9CisKK2lubGluZSBzdGQ6Om9zdHJpbmdzdHJlYW0mIExvZzo6R2V0KFRMb2dMZXZlbCBsZXZlbCkKK3sKKyAgICBvcyA8PCAiLSAiIDw8IE5vd1RpbWUoKTsKKyAgICBvcyA8PCAiICIgPDwgVG9TdHJpbmcobGV2ZWwpIDw8ICI6ICI7CisgICAgb3MgPDwgc3RkOjpzdHJpbmcobGV2ZWwgPiBsb2dERUJVRyA/IGxldmVsIC0gbG9nREVCVUcgOiAwLCAnXHQnKTsKKyAgICByZXR1cm4gb3M7Cit9CisKK2lubGluZSBMb2c6On5Mb2coKQoreworICAgIG9zIDw8IHN0ZDo6ZW5kbDsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIiwgb3Muc3RyKCkuY19zdHIoKSk7CisgICAgZmZsdXNoKHN0ZGVycik7Cit9CisKK2lubGluZSBUTG9nTGV2ZWwmIExvZzo6UmVwb3J0aW5nTGV2ZWwoKQoreworICAgIHN0YXRpYyBUTG9nTGV2ZWwgcmVwb3J0aW5nTGV2ZWwgPSBsb2dERUJVRzQ7CisgICAgcmV0dXJuIHJlcG9ydGluZ0xldmVsOworfQorCitpbmxpbmUgc3RkOjpzdHJpbmcgTG9nOjpUb1N0cmluZyhUTG9nTGV2ZWwgbGV2ZWwpCit7CisJc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGJ1ZmZlcltdID0geyJOT05FIiwgIkVSUk9SIiwgIldBUk5JTkciLCAiSU5GTyIsICJERUJVRyIsICJERUJVRzEiLCAiREVCVUcyIiwgIkRFQlVHMyIsICJERUJVRzQifTsKKyAgICByZXR1cm4gYnVmZmVyW2xldmVsXTsKK30KKworaW5saW5lIFRMb2dMZXZlbCBMb2c6OkZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGxldmVsKQoreworICAgIGlmIChsZXZlbCA9PSAiREVCVUc0IikKKyAgICAgICAgcmV0dXJuIGxvZ0RFQlVHNDsKKyAgICBpZiAobGV2ZWwgPT0gIkRFQlVHMyIpCisgICAgICAgIHJldHVybiBsb2dERUJVRzM7CisgICAgaWYgKGxldmVsID09ICJERUJVRzIiKQorICAgICAgICByZXR1cm4gbG9nREVCVUcyOworICAgIGlmIChsZXZlbCA9PSAiREVCVUcxIikKKyAgICAgICAgcmV0dXJuIGxvZ0RFQlVHMTsKKyAgICBpZiAobGV2ZWwgPT0gIkRFQlVHIikKKyAgICAgICAgcmV0dXJuIGxvZ0RFQlVHOworICAgIGlmIChsZXZlbCA9PSAiSU5GTyIpCisgICAgICAgIHJldHVybiBsb2dJTkZPOworICAgIGlmIChsZXZlbCA9PSAiV0FSTklORyIpCisgICAgICAgIHJldHVybiBsb2dXQVJOSU5HOworICAgIGlmIChsZXZlbCA9PSAiRVJST1IiKQorICAgICAgICByZXR1cm4gbG9nRVJST1I7CisgICAgaWYgKGxldmVsID09ICJOT05FIikKKyAgICAJcmV0dXJuIGxvZ05PTkU7CisgICAgTG9nKCkuR2V0KGxvZ1dBUk5JTkcpIDw8ICJVbmtub3duIGxvZ2dpbmcgbGV2ZWwgJyIgPDwgbGV2ZWwgPDwgIicuIFVzaW5nIElORk8gbGV2ZWwgYXMgZGVmYXVsdC4iOworICAgIHJldHVybiBsb2dJTkZPOworfQorCit0eXBlZGVmIExvZyBGSUxFTG9nOworCisjZGVmaW5lIEZJTEVfTE9HKGxldmVsKSBcCisgICAgaWYgKGxldmVsID4gRklMRUxvZzo6UmVwb3J0aW5nTGV2ZWwoKSkgOyBcCisgICAgZWxzZSBMb2coKS5HZXQobGV2ZWwpCisKK2lubGluZSBzdGQ6OnN0cmluZyBOb3dUaW1lKCkKK3sKKyAgICBjaGFyIGJ1ZmZlclsxMV07CisgICAgdGltZV90IHQ7CisgICAgdGltZSgmdCk7CisgICAgdG0gKiByID0gZ210aW1lKCZ0KTsKKyAgICBzdHJmdGltZShidWZmZXIsIHNpemVvZihidWZmZXIpLCAiJUg6JU06JVMiLCByKTsKKyAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgICBnZXR0aW1lb2ZkYXkoJnR2LCAwKTsKKyAgICBjaGFyIHJlc3VsdFsxMDBdID0gezB9OworICAgIHNwcmludGYocmVzdWx0LCAiJXMuJTAzbGQiLCBidWZmZXIsIChsb25nKXR2LnR2X3VzZWMgLyAxMDAwKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvQWNjZWxlcm9tZXRlci5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9BY2NlbGVyb21ldGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODk1YzljCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvQWNjZWxlcm9tZXRlci5jcHAKQEAgLTAsMCArMSwyMzQgQEAKKyNpbmNsdWRlICJIQUwvQWNjZWxlcm9tZXRlci5ocHAiCisKKyNpbmNsdWRlICJDaGlwT2JqZWN0LmgiCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworLy8gVGhlIDctYml0IEkyQyBhZGRyZXNzIHdpdGggYSAwICJzZW5kIiBiaXQKK3N0YXRpYyBjb25zdCB1aW50OF90IGtTZW5kQWRkcmVzcyA9ICgweDFjIDw8IDEpIHwgMDsKKworLy8gVGhlIDctYml0IEkyQyBhZGRyZXNzIHdpdGggYSAxICJyZWNlaXZlIiBiaXQKK3N0YXRpYyBjb25zdCB1aW50OF90IGtSZWNlaXZlQWRkcmVzcyA9ICgweDFjIDw8IDEpIHwgMTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0NvbnRyb2xUeFJ4ID0gMTsKK3N0YXRpYyBjb25zdCB1aW50OF90IGtDb250cm9sU3RhcnQgPSAyOworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0NvbnRyb2xTdG9wID0gNDsKKworc3RhdGljIHRBY2NlbCAqYWNjZWwgPSAwOworc3RhdGljIEFjY2VsZXJvbWV0ZXJSYW5nZSBhY2NlbGVyb21ldGVyUmFuZ2U7CisKKy8vIFJlZ2lzdGVyIGFkZHJlc3NlcworZW51bSBSZWdpc3RlciB7CisJa1JlZ19TdGF0dXMgPSAweDAwLAorCWtSZWdfT3V0WE1TQiA9IDB4MDEsCisJa1JlZ19PdXRYTFNCID0gMHgwMiwKKwlrUmVnX091dFlNU0IgPSAweDAzLAorCWtSZWdfT3V0WUxTQiA9IDB4MDQsCisJa1JlZ19PdXRaTVNCID0gMHgwNSwKKwlrUmVnX091dFpMU0IgPSAweDA2LAorCWtSZWdfU3lzbW9kID0gMHgwQiwKKwlrUmVnX0ludFNvdXJjZSA9IDB4MEMsCisJa1JlZ19XaG9BbUkgPSAweDBELAorCWtSZWdfWFlaRGF0YUNmZyA9IDB4MEUsCisJa1JlZ19IUEZpbHRlckN1dG9mZiA9IDB4MEYsCisJa1JlZ19QTFN0YXR1cyA9IDB4MTAsCisJa1JlZ19QTENmZyA9IDB4MTEsCisJa1JlZ19QTENvdW50ID0gMHgxMiwKKwlrUmVnX1BMQmZaY29tcCA9IDB4MTMsCisJa1JlZ19QTFRoc1JlZyA9IDB4MTQsCisJa1JlZ19GRk10Q2ZnID0gMHgxNSwKKwlrUmVnX0ZGTXRTcmMgPSAweDE2LAorCWtSZWdfRkZNdFRocyA9IDB4MTcsCisJa1JlZ19GRk10Q291bnQgPSAweDE4LAorCWtSZWdfVHJhbnNpZW50Q2ZnID0gMHgxRCwKKwlrUmVnX1RyYW5zaWVudFNyYyA9IDB4MUUsCisJa1JlZ19UcmFuc2llbnRUaHMgPSAweDFGLAorCWtSZWdfVHJhbnNpZW50Q291bnQgPSAweDIwLAorCWtSZWdfUHVsc2VDZmcgPSAweDIxLAorCWtSZWdfUHVsc2VTcmMgPSAweDIyLAorCWtSZWdfUHVsc2VUaHN4ID0gMHgyMywKKwlrUmVnX1B1bHNlVGhzeSA9IDB4MjQsCisJa1JlZ19QdWxzZVRoc3ogPSAweDI1LAorCWtSZWdfUHVsc2VUbWx0ID0gMHgyNiwKKwlrUmVnX1B1bHNlTHRjeSA9IDB4MjcsCisJa1JlZ19QdWxzZVdpbmQgPSAweDI4LAorCWtSZWdfQVNscENvdW50ID0gMHgyOSwKKwlrUmVnX0N0cmxSZWcxID0gMHgyQSwKKwlrUmVnX0N0cmxSZWcyID0gMHgyQiwKKwlrUmVnX0N0cmxSZWczID0gMHgyQywKKwlrUmVnX0N0cmxSZWc0ID0gMHgyRCwKKwlrUmVnX0N0cmxSZWc1ID0gMHgyRSwKKwlrUmVnX09mZlggPSAweDJGLAorCWtSZWdfT2ZmWSA9IDB4MzAsCisJa1JlZ19PZmZaID0gMHgzMQorfTsKKworZXh0ZXJuICJDIiB1aW50MzJfdCBnZXRGUEdBVGltZShpbnQzMl90ICpzdGF0dXMpOworCitzdGF0aWMgdm9pZCB3cml0ZVJlZ2lzdGVyKFJlZ2lzdGVyIHJlZywgdWludDhfdCBkYXRhKTsKK3N0YXRpYyB1aW50OF90IHJlYWRSZWdpc3RlcihSZWdpc3RlciByZWcpOworCisvKioKKyAqIEluaXRpYWxpemUgdGhlIGFjY2VsZXJvbWV0ZXIuCisgKi8KK3N0YXRpYyB2b2lkIGluaXRpYWxpemVBY2NlbGVyb21ldGVyKCkgeworCWludDMyX3Qgc3RhdHVzOworCisJaWYoIWFjY2VsKSB7CisJCWFjY2VsID0gdEFjY2VsOjpjcmVhdGUoJnN0YXR1cyk7CisKKwkJLy8gRW5hYmxlIEkyQworCQlhY2NlbC0+d3JpdGVDTkZHKDEsICZzdGF0dXMpOworCisJCS8vIFNldCB0aGUgY291bnRlciB0byAxMDAga2JwcworCQlhY2NlbC0+d3JpdGVDTlRSKDIxMywgJnN0YXR1cyk7CisKKwkJLy8gVGhlIGRldmljZSBpZGVudGlmaWNhdGlvbiBudW1iZXIgc2hvdWxkIGJlIDB4MmEKKwkJYXNzZXJ0KHJlYWRSZWdpc3RlcihrUmVnX1dob0FtSSkgPT0gMHgyYSk7CisJfQorfQorCitzdGF0aWMgdm9pZCB3cml0ZVJlZ2lzdGVyKFJlZ2lzdGVyIHJlZywgdWludDhfdCBkYXRhKSB7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCXVpbnQzMl90IGluaXRpYWxUaW1lOworCisJYWNjZWwtPndyaXRlQUREUihrU2VuZEFkZHJlc3MsICZzdGF0dXMpOworCisJLy8gU2VuZCBhIHN0YXJ0IHRyYW5zbWl0L3JlY2VpdmUgbWVzc2FnZSB3aXRoIHRoZSByZWdpc3RlciBhZGRyZXNzCisJYWNjZWwtPndyaXRlQ05UTChrQ29udHJvbFN0YXJ0IHwga0NvbnRyb2xUeFJ4LCAmc3RhdHVzKTsKKwlhY2NlbC0+d3JpdGVEQVRPKHJlZywgJnN0YXR1cyk7CisJYWNjZWwtPnN0cm9iZUdPKCZzdGF0dXMpOworCisJLy8gRXhlY3V0ZSBhbmQgd2FpdCB1bnRpbCBpdCdzIGRvbmUgKHVwIHRvIGEgbWlsbGlzZWNvbmQpCisJaW5pdGlhbFRpbWUgPSBnZXRGUEdBVGltZSgmc3RhdHVzKTsKKwl3aGlsZShhY2NlbC0+cmVhZFNUQVQoJnN0YXR1cykgJiAxKSB7CisJCWlmKGdldEZQR0FUaW1lKCZzdGF0dXMpID4gaW5pdGlhbFRpbWUgKyAxMDAwKSBicmVhazsKKwl9CisKKwkvLyBTZW5kIGEgc3RvcCB0cmFuc21pdC9yZWNlaXZlIG1lc3NhZ2Ugd2l0aCB0aGUgZGF0YQorCWFjY2VsLT53cml0ZUNOVEwoa0NvbnRyb2xTdG9wIHwga0NvbnRyb2xUeFJ4LCAmc3RhdHVzKTsKKwlhY2NlbC0+d3JpdGVEQVRPKGRhdGEsICZzdGF0dXMpOworCWFjY2VsLT5zdHJvYmVHTygmc3RhdHVzKTsKKworCS8vIEV4ZWN1dGUgYW5kIHdhaXQgdW50aWwgaXQncyBkb25lICh1cCB0byBhIG1pbGxpc2Vjb25kKQorCWluaXRpYWxUaW1lID0gZ2V0RlBHQVRpbWUoJnN0YXR1cyk7CisJd2hpbGUoYWNjZWwtPnJlYWRTVEFUKCZzdGF0dXMpICYgMSkgeworCQlpZihnZXRGUEdBVGltZSgmc3RhdHVzKSA+IGluaXRpYWxUaW1lICsgMTAwMCkgYnJlYWs7CisJfQorCisJZmZsdXNoKHN0ZG91dCk7Cit9CisKK3N0YXRpYyB1aW50OF90IHJlYWRSZWdpc3RlcihSZWdpc3RlciByZWcpIHsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJdWludDMyX3QgaW5pdGlhbFRpbWU7CisKKwkvLyBTZW5kIGEgc3RhcnQgdHJhbnNtaXQvcmVjZWl2ZSBtZXNzYWdlIHdpdGggdGhlIHJlZ2lzdGVyIGFkZHJlc3MKKwlhY2NlbC0+d3JpdGVBRERSKGtTZW5kQWRkcmVzcywgJnN0YXR1cyk7CisJYWNjZWwtPndyaXRlQ05UTChrQ29udHJvbFN0YXJ0IHwga0NvbnRyb2xUeFJ4LCAmc3RhdHVzKTsKKwlhY2NlbC0+d3JpdGVEQVRPKHJlZywgJnN0YXR1cyk7CisJYWNjZWwtPnN0cm9iZUdPKCZzdGF0dXMpOworCisJLy8gRXhlY3V0ZSBhbmQgd2FpdCB1bnRpbCBpdCdzIGRvbmUgKHVwIHRvIGEgbWlsbGlzZWNvbmQpCisJaW5pdGlhbFRpbWUgPSBnZXRGUEdBVGltZSgmc3RhdHVzKTsKKwl3aGlsZShhY2NlbC0+cmVhZFNUQVQoJnN0YXR1cykgJiAxKSB7CisJCWlmKGdldEZQR0FUaW1lKCZzdGF0dXMpID4gaW5pdGlhbFRpbWUgKyAxMDAwKSBicmVhazsKKwl9CisKKwkvLyBSZWNlaXZlIGEgbWVzc2FnZSB3aXRoIHRoZSBkYXRhIGFuZCBzdG9wCisJYWNjZWwtPndyaXRlQUREUihrUmVjZWl2ZUFkZHJlc3MsICZzdGF0dXMpOworCWFjY2VsLT53cml0ZUNOVEwoa0NvbnRyb2xTdGFydCB8IGtDb250cm9sU3RvcCB8IGtDb250cm9sVHhSeCwgJnN0YXR1cyk7CisJYWNjZWwtPnN0cm9iZUdPKCZzdGF0dXMpOworCisJLy8gRXhlY3V0ZSBhbmQgd2FpdCB1bnRpbCBpdCdzIGRvbmUgKHVwIHRvIGEgbWlsbGlzZWNvbmQpCisJaW5pdGlhbFRpbWUgPSBnZXRGUEdBVGltZSgmc3RhdHVzKTsKKwl3aGlsZShhY2NlbC0+cmVhZFNUQVQoJnN0YXR1cykgJiAxKSB7CisJCWlmKGdldEZQR0FUaW1lKCZzdGF0dXMpID4gaW5pdGlhbFRpbWUgKyAxMDAwKSBicmVhazsKKwl9CisKKwlmZmx1c2goc3Rkb3V0KTsKKworCXJldHVybiBhY2NlbC0+cmVhZERBVEkoJnN0YXR1cyk7Cit9CisKKy8qKgorICogQ29udmVydCBhIDEyLWJpdCByYXcgYWNjZWxlcmF0aW9uIHZhbHVlIGludG8gYSBzY2FsZWQgZG91YmxlIGluIHVuaXRzIG9mCisgKiAxIGctZm9yY2UsIHRha2luZyBpbnRvIGFjY291bnQgdGhlIGFjY2VsZXJvbWV0ZXIgcmFuZ2UuCisgKi8KK3N0YXRpYyBkb3VibGUgdW5wYWNrQXhpcyhpbnQxNl90IHJhdykgeworCS8vIFRoZSByYXcgdmFsdWUgaXMgYWN0dWFsbHkgMTIgYml0cywgbm90IDE2LCBzbyB3ZSBuZWVkIHRvIHByb3BvZ2F0ZSB0aGUKKwkvLyAyJ3MgY29tcGxlbWVudCBzaWduIGJpdCB0byB0aGUgdW51c2VkIDQgYml0cyBmb3IgdGhpcyB0byB3b3JrIHdpdGgKKwkvLyBuZWdhdGl2ZSBudW1iZXJzLgorCXJhdyA8PD0gNDsKKwlyYXcgPj49IDQ7CisKKwlzd2l0Y2goYWNjZWxlcm9tZXRlclJhbmdlKSB7CisJY2FzZSBrUmFuZ2VfMkc6IHJldHVybiByYXcgLyAxMDI0LjA7CisJY2FzZSBrUmFuZ2VfNEc6IHJldHVybiByYXcgLyA1MTIuMDsKKwljYXNlIGtSYW5nZV84RzogcmV0dXJuIHJhdyAvIDI1Ni4wOworCWRlZmF1bHQ6IHJldHVybiAwLjA7CisJfQorfQorCisvKioKKyAqIFNldCB0aGUgYWNjZWxlcm9tZXRlciB0byBhY3RpdmUgb3Igc3RhbmRieSBtb2RlLiAgSXQgbXVzdCBiZSBpbiBzdGFuZGJ5CisgKiBtb2RlIHRvIGNoYW5nZSBhbnkgY29uZmlndXJhdGlvbi4KKyAqLwordm9pZCBzZXRBY2NlbGVyb21ldGVyQWN0aXZlKGJvb2wgYWN0aXZlKSB7CisJaW5pdGlhbGl6ZUFjY2VsZXJvbWV0ZXIoKTsKKworCXVpbnQ4X3QgY3RybFJlZzEgPSByZWFkUmVnaXN0ZXIoa1JlZ19DdHJsUmVnMSk7CisJY3RybFJlZzEgJj0gfjE7IC8vIENsZWFyIHRoZSBleGlzdGluZyBhY3RpdmUgYml0CisJd3JpdGVSZWdpc3RlcihrUmVnX0N0cmxSZWcxLCBjdHJsUmVnMSB8IChhY3RpdmU/IDEgOiAwKSk7Cit9CisKKy8qKgorICogU2V0IHRoZSByYW5nZSBvZiB2YWx1ZXMgdGhhdCBjYW4gYmUgbWVhc3VyZWQgKGVpdGhlciAyLCA0LCBvciA4IGctZm9yY2VzKS4KKyAqIFRoZSBhY2NlbGVyb21ldGVyIHNob3VsZCBiZSBpbiBzdGFuZGJ5IG1vZGUgd2hlbiB0aGlzIGlzIGNhbGxlZC4KKyAqLwordm9pZCBzZXRBY2NlbGVyb21ldGVyUmFuZ2UoQWNjZWxlcm9tZXRlclJhbmdlIHJhbmdlKSB7CisJaW5pdGlhbGl6ZUFjY2VsZXJvbWV0ZXIoKTsKKworCWFjY2VsZXJvbWV0ZXJSYW5nZSA9IHJhbmdlOworCisJdWludDhfdCB4eXpEYXRhQ2ZnID0gcmVhZFJlZ2lzdGVyKGtSZWdfWFlaRGF0YUNmZyk7CisJeHl6RGF0YUNmZyAmPSB+MzsgLy8gQ2xlYXIgdGhlIGV4aXN0aW5nIHR3byByYW5nZSBiaXRzCisJd3JpdGVSZWdpc3RlcihrUmVnX1hZWkRhdGFDZmcsIHh5ekRhdGFDZmcgfCByYW5nZSk7Cit9CisKKy8qKgorICogR2V0IHRoZSB4LWF4aXMgYWNjZWxlcmF0aW9uCisgKgorICogVGhpcyBpcyBhIGZsb2F0aW5nIHBvaW50IHZhbHVlIGluIHVuaXRzIG9mIDEgZy1mb3JjZQorICovCitkb3VibGUgZ2V0QWNjZWxlcm9tZXRlclgoKSB7CisJaW5pdGlhbGl6ZUFjY2VsZXJvbWV0ZXIoKTsKKworCWludCByYXcgPSAocmVhZFJlZ2lzdGVyKGtSZWdfT3V0WE1TQikgPDwgNCkgfCAocmVhZFJlZ2lzdGVyKGtSZWdfT3V0WExTQikgPj4gNCk7CisJcmV0dXJuIHVucGFja0F4aXMocmF3KTsKK30KKworLyoqCisgKiBHZXQgdGhlIHktYXhpcyBhY2NlbGVyYXRpb24KKyAqCisgKiBUaGlzIGlzIGEgZmxvYXRpbmcgcG9pbnQgdmFsdWUgaW4gdW5pdHMgb2YgMSBnLWZvcmNlCisgKi8KK2RvdWJsZSBnZXRBY2NlbGVyb21ldGVyWSgpIHsKKwlpbml0aWFsaXplQWNjZWxlcm9tZXRlcigpOworCisJaW50IHJhdyA9IChyZWFkUmVnaXN0ZXIoa1JlZ19PdXRZTVNCKSA8PCA0KSB8IChyZWFkUmVnaXN0ZXIoa1JlZ19PdXRZTFNCKSA+PiA0KTsKKwlyZXR1cm4gdW5wYWNrQXhpcyhyYXcpOworfQorCisvKioKKyAqIEdldCB0aGUgei1heGlzIGFjY2VsZXJhdGlvbgorICoKKyAqIFRoaXMgaXMgYSBmbG9hdGluZyBwb2ludCB2YWx1ZSBpbiB1bml0cyBvZiAxIGctZm9yY2UKKyAqLworZG91YmxlIGdldEFjY2VsZXJvbWV0ZXJaKCkgeworCWluaXRpYWxpemVBY2NlbGVyb21ldGVyKCk7CisKKwlpbnQgcmF3ID0gKHJlYWRSZWdpc3RlcihrUmVnX091dFpNU0IpIDw8IDQpIHwgKHJlYWRSZWdpc3RlcihrUmVnX091dFpMU0IpID4+IDQpOworCXJldHVybiB1bnBhY2tBeGlzKHJhdyk7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9BbmFsb2cuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvQW5hbG9nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmE3MDQzCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvQW5hbG9nLmNwcApAQCAtMCwwICsxLDcyNSBAQAorCisjaW5jbHVkZSAiSEFML0FuYWxvZy5ocHAiCisKKyNpbmNsdWRlICJQb3J0LmgiCisjaW5jbHVkZSAiSEFML0hBTC5ocHAiCisjaW5jbHVkZSAiQ2hpcE9iamVjdC5oIgorI2luY2x1ZGUgIkhBTC9jcHAvU3luY2hyb25pemVkLmhwcCIKKyNpbmNsdWRlICJIQUwvY3BwL1Jlc291cmNlLmhwcCIKKyNpbmNsdWRlICJOZXR3b3JrQ29tbXVuaWNhdGlvbi9BSUNhbGlicmF0aW9uLmgiCisjaW5jbHVkZSAiTmV0d29ya0NvbW11bmljYXRpb24vTG9hZE91dC5oIgorCitzdGF0aWMgY29uc3QgbG9uZyBrVGltZWJhc2UgPSA0MDAwMDAwMDsgLy8vPCA0MCBNSHogY2xvY2sKK3N0YXRpYyBjb25zdCBsb25nIGtEZWZhdWx0T3ZlcnNhbXBsZUJpdHMgPSAwOworc3RhdGljIGNvbnN0IGxvbmcga0RlZmF1bHRBdmVyYWdlQml0cyA9IDc7CitzdGF0aWMgY29uc3QgZmxvYXQga0RlZmF1bHRTYW1wbGVSYXRlID0gNTAwMDAuMDsKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBrQW5hbG9nSW5wdXRQaW5zID0gODsKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBrQW5hbG9nT3V0cHV0UGlucyA9IDI7CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBrQWNjdW11bGF0b3JOdW1DaGFubmVscyA9IDI7CitzdGF0aWMgY29uc3QgdWludDMyX3Qga0FjY3VtdWxhdG9yQ2hhbm5lbHNbXSA9IHswLCAxfTsKKworc3RydWN0IEFuYWxvZ1BvcnQgeworICBQb3J0IHBvcnQ7CisgIHRBY2N1bXVsYXRvciAqYWNjdW11bGF0b3I7Cit9OworCitib29sIGFuYWxvZ1NhbXBsZVJhdGVTZXQgPSBmYWxzZTsKK1JlZW50cmFudE11dGV4IGFuYWxvZ1JlZ2lzdGVyV2luZG93TXV0ZXg7Cit0QUkqIGFuYWxvZ0lucHV0U3lzdGVtID0gTlVMTDsKK3RBTyogYW5hbG9nT3V0cHV0U3lzdGVtID0gTlVMTDsKK3VpbnQzMl90IGFuYWxvZ051bUNoYW5uZWxzVG9BY3RpdmF0ZSA9IDA7CisKKy8vIFV0aWxpdHkgbWV0aG9kcyBkZWZpbmVkIGJlbG93LgordWludDMyX3QgZ2V0QW5hbG9nTnVtQWN0aXZlQ2hhbm5lbHMoaW50MzJfdCAqc3RhdHVzKTsKK3VpbnQzMl90IGdldEFuYWxvZ051bUNoYW5uZWxzVG9BY3RpdmF0ZShpbnQzMl90ICpzdGF0dXMpOwordm9pZCBzZXRBbmFsb2dOdW1DaGFubmVsc1RvQWN0aXZhdGUodWludDMyX3QgY2hhbm5lbHMpOworCitib29sIGFuYWxvZ1N5c3RlbUluaXRpYWxpemVkID0gZmFsc2U7CisKKy8qKgorICogSW5pdGlhbGl6ZSB0aGUgYW5hbG9nIFN5c3RlbS4KKyAqLwordm9pZCBpbml0aWFsaXplQW5hbG9nKGludDMyX3QgKnN0YXR1cykgeworICA6OnN0ZDo6dW5pcXVlX2xvY2s8UmVlbnRyYW50TXV0ZXg+IHN5bmMoYW5hbG9nUmVnaXN0ZXJXaW5kb3dNdXRleCk7CisgIGlmIChhbmFsb2dTeXN0ZW1Jbml0aWFsaXplZCkgcmV0dXJuOworICBhbmFsb2dJbnB1dFN5c3RlbSA9IHRBSTo6Y3JlYXRlKHN0YXR1cyk7CisgIGFuYWxvZ091dHB1dFN5c3RlbSA9IHRBTzo6Y3JlYXRlKHN0YXR1cyk7CisgIHNldEFuYWxvZ051bUNoYW5uZWxzVG9BY3RpdmF0ZShrQW5hbG9nSW5wdXRQaW5zKTsKKyAgc2V0QW5hbG9nU2FtcGxlUmF0ZShrRGVmYXVsdFNhbXBsZVJhdGUsIHN0YXR1cyk7CisgIGFuYWxvZ1N5c3RlbUluaXRpYWxpemVkID0gdHJ1ZTsKK30KKworLyoqCisgKiBJbml0aWFsaXplIHRoZSBhbmFsb2cgaW5wdXQgcG9ydCB1c2luZyB0aGUgZ2l2ZW4gcG9ydCBvYmplY3QuCisgKi8KK3ZvaWQqIGluaXRpYWxpemVBbmFsb2dJbnB1dFBvcnQodm9pZCogcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgaW5pdGlhbGl6ZUFuYWxvZyhzdGF0dXMpOworICBQb3J0KiBwb3J0ID0gKFBvcnQqKSBwb3J0X3BvaW50ZXI7CisKKyAgLy8gSW5pdGlhbGl6ZSBwb3J0IHN0cnVjdHVyZQorICBBbmFsb2dQb3J0KiBhbmFsb2dfcG9ydCA9IG5ldyBBbmFsb2dQb3J0KCk7CisgIGFuYWxvZ19wb3J0LT5wb3J0ID0gKnBvcnQ7CisgIGlmIChpc0FjY3VtdWxhdG9yQ2hhbm5lbChhbmFsb2dfcG9ydCwgc3RhdHVzKSkgeworICAgIGFuYWxvZ19wb3J0LT5hY2N1bXVsYXRvciA9IHRBY2N1bXVsYXRvcjo6Y3JlYXRlKHBvcnQtPnBpbiwgc3RhdHVzKTsKKyAgfSBlbHNlIGFuYWxvZ19wb3J0LT5hY2N1bXVsYXRvciA9IE5VTEw7CisKKyAgLy8gU2V0IGRlZmF1bHQgY29uZmlndXJhdGlvbgorICBhbmFsb2dJbnB1dFN5c3RlbS0+d3JpdGVTY2FuTGlzdChwb3J0LT5waW4sIHBvcnQtPnBpbiwgc3RhdHVzKTsKKyAgc2V0QW5hbG9nQXZlcmFnZUJpdHMoYW5hbG9nX3BvcnQsIGtEZWZhdWx0QXZlcmFnZUJpdHMsIHN0YXR1cyk7CisgIHNldEFuYWxvZ092ZXJzYW1wbGVCaXRzKGFuYWxvZ19wb3J0LCBrRGVmYXVsdE92ZXJzYW1wbGVCaXRzLCBzdGF0dXMpOworICByZXR1cm4gYW5hbG9nX3BvcnQ7Cit9CisKKy8qKgorICogSW5pdGlhbGl6ZSB0aGUgYW5hbG9nIG91dHB1dCBwb3J0IHVzaW5nIHRoZSBnaXZlbiBwb3J0IG9iamVjdC4KKyAqLwordm9pZCogaW5pdGlhbGl6ZUFuYWxvZ091dHB1dFBvcnQodm9pZCogcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgaW5pdGlhbGl6ZUFuYWxvZyhzdGF0dXMpOworICBQb3J0KiBwb3J0ID0gKFBvcnQqKSBwb3J0X3BvaW50ZXI7CisKKyAgLy8gSW5pdGlhbGl6ZSBwb3J0IHN0cnVjdHVyZQorICBBbmFsb2dQb3J0KiBhbmFsb2dfcG9ydCA9IG5ldyBBbmFsb2dQb3J0KCk7CisgIGFuYWxvZ19wb3J0LT5wb3J0ID0gKnBvcnQ7CisgIHJldHVybiBhbmFsb2dfcG9ydDsKK30KKworCisvKioKKyAqIENoZWNrIHRoYXQgdGhlIGFuYWxvZyBtb2R1bGUgbnVtYmVyIGlzIHZhbGlkLgorICoKKyAqIEByZXR1cm4gQW5hbG9nIG1vZHVsZSBpcyB2YWxpZCBhbmQgcHJlc2VudAorICovCitib29sIGNoZWNrQW5hbG9nTW9kdWxlKHVpbnQ4X3QgbW9kdWxlKSB7CisgIHJldHVybiBtb2R1bGUgPT0gMTsKK30KKworLyoqCisgKiBDaGVjayB0aGF0IHRoZSBhbmFsb2cgb3V0cHV0IGNoYW5uZWwgbnVtYmVyIGlzIHZhbHVlLgorICogVmVyaWZ5IHRoYXQgdGhlIGFuYWxvZyBjaGFubmVsIG51bWJlciBpcyBvbmUgb2YgdGhlIGxlZ2FsIGNoYW5uZWwgbnVtYmVycy4gQ2hhbm5lbCBudW1iZXJzCisgKiBhcmUgMC1iYXNlZC4KKyAqCisgKiBAcmV0dXJuIEFuYWxvZyBjaGFubmVsIGlzIHZhbGlkCisgKi8KK2Jvb2wgY2hlY2tBbmFsb2dJbnB1dENoYW5uZWwodWludDMyX3QgcGluKSB7CisgIGlmIChwaW4gPCBrQW5hbG9nSW5wdXRQaW5zKQorICAgIHJldHVybiB0cnVlOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogQ2hlY2sgdGhhdCB0aGUgYW5hbG9nIG91dHB1dCBjaGFubmVsIG51bWJlciBpcyB2YWx1ZS4KKyAqIFZlcmlmeSB0aGF0IHRoZSBhbmFsb2cgY2hhbm5lbCBudW1iZXIgaXMgb25lIG9mIHRoZSBsZWdhbCBjaGFubmVsIG51bWJlcnMuIENoYW5uZWwgbnVtYmVycworICogYXJlIDAtYmFzZWQuCisgKgorICogQHJldHVybiBBbmFsb2cgY2hhbm5lbCBpcyB2YWxpZAorICovCitib29sIGNoZWNrQW5hbG9nT3V0cHV0Q2hhbm5lbCh1aW50MzJfdCBwaW4pIHsKKyAgaWYgKHBpbiA8IGtBbmFsb2dPdXRwdXRQaW5zKQorICAgIHJldHVybiB0cnVlOworICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgc2V0QW5hbG9nT3V0cHV0KHZvaWQqIGFuYWxvZ19wb3J0X3BvaW50ZXIsIGRvdWJsZSB2b2x0YWdlLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgQW5hbG9nUG9ydCogcG9ydCA9IChBbmFsb2dQb3J0KikgYW5hbG9nX3BvcnRfcG9pbnRlcjsKKworICB1aW50MTZfdCByYXdWYWx1ZSA9ICh1aW50MTZfdCkodm9sdGFnZSAvIDUuMCAqIDB4MTAwMCk7CisKKyAgaWYodm9sdGFnZSA8IDAuMCkgcmF3VmFsdWUgPSAwOworICBlbHNlIGlmKHZvbHRhZ2UgPiA1LjApIHJhd1ZhbHVlID0gMHgxMDAwOworCisgIGFuYWxvZ091dHB1dFN5c3RlbS0+d3JpdGVNWFAocG9ydC0+cG9ydC5waW4sIHJhd1ZhbHVlLCBzdGF0dXMpOworfQorCitkb3VibGUgZ2V0QW5hbG9nT3V0cHV0KHZvaWQqIGFuYWxvZ19wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cykgeworICBBbmFsb2dQb3J0KiBwb3J0ID0gKEFuYWxvZ1BvcnQqKSBhbmFsb2dfcG9ydF9wb2ludGVyOworCisgIHVpbnQxNl90IHJhd1ZhbHVlID0gYW5hbG9nT3V0cHV0U3lzdGVtLT5yZWFkTVhQKHBvcnQtPnBvcnQucGluLCBzdGF0dXMpOworCisgIHJldHVybiByYXdWYWx1ZSAqIDUuMCAvIDB4MTAwMDsKK30KKworLyoqCisgKiBTZXQgdGhlIHNhbXBsZSByYXRlLgorICoKKyAqIFRoaXMgaXMgYSBnbG9iYWwgc2V0dGluZyBmb3IgdGhlIEF0aGVuYSBhbmQgZWZmZWN0cyBhbGwgY2hhbm5lbHMuCisgKgorICogQHBhcmFtIHNhbXBsZXNQZXJTZWNvbmQgVGhlIG51bWJlciBvZiBzYW1wbGVzIHBlciBjaGFubmVsIHBlciBzZWNvbmQuCisgKi8KK3ZvaWQgc2V0QW5hbG9nU2FtcGxlUmF0ZShkb3VibGUgc2FtcGxlc1BlclNlY29uZCwgaW50MzJfdCAqc3RhdHVzKSB7CisgIC8vIFRPRE86IFRoaXMgd2lsbCBjaGFuZ2Ugd2hlbiB2YXJpYWJsZSBzaXplIHNjYW4gbGlzdHMgYXJlIGltcGxlbWVudGVkLgorICAvLyBUT0RPOiBOZWVkIGZsb2F0IGNvbXBhcmlzb24gd2l0aCBlcHNpbG9uLgorICAvL3dwaV9hc3NlcnQoIXNhbXBsZVJhdGVTZXQgfHwgR2V0U2FtcGxlUmF0ZSgpID09IHNhbXBsZXNQZXJTZWNvbmQpOworICBhbmFsb2dTYW1wbGVSYXRlU2V0ID0gdHJ1ZTsKKworICAvLyBDb21wdXRlIHRoZSBjb252ZXJ0IHJhdGUKKyAgdWludDMyX3QgdGlja3NQZXJTYW1wbGUgPSAodWludDMyX3QpKChmbG9hdClrVGltZWJhc2UgLyBzYW1wbGVzUGVyU2Vjb25kKTsKKyAgdWludDMyX3QgdGlja3NQZXJDb252ZXJzaW9uID0gdGlja3NQZXJTYW1wbGUgLyBnZXRBbmFsb2dOdW1DaGFubmVsc1RvQWN0aXZhdGUoc3RhdHVzKTsKKyAgLy8gdGlja3NQZXJDb252ZXJzaW9uIG11c3QgYmUgYXQgbGVhc3QgODAKKyAgaWYgKHRpY2tzUGVyQ29udmVyc2lvbiA8IDgwKSB7CisgICAgaWYgKCgqc3RhdHVzKSA+PSAwKSAqc3RhdHVzID0gU0FNUExFX1JBVEVfVE9PX0hJR0g7CisgICAgdGlja3NQZXJDb252ZXJzaW9uID0gODA7CisgIH0KKworICAvLyBBdG9taWNhbGx5IHNldCB0aGUgc2NhbiBzaXplIGFuZCB0aGUgY29udmVydCByYXRlIHNvIHRoYXQgdGhlIHNhbXBsZSByYXRlIGlzIGNvbnN0YW50CisgIHRBSTo6dENvbmZpZyBjb25maWc7CisgIGNvbmZpZy5TY2FuU2l6ZSA9IGdldEFuYWxvZ051bUNoYW5uZWxzVG9BY3RpdmF0ZShzdGF0dXMpOworICBjb25maWcuQ29udmVydFJhdGUgPSB0aWNrc1BlckNvbnZlcnNpb247CisgIGFuYWxvZ0lucHV0U3lzdGVtLT53cml0ZUNvbmZpZyhjb25maWcsIHN0YXR1cyk7CisKKyAgLy8gSW5kaWNhdGUgdGhhdCB0aGUgc2NhbiBzaXplIGhhcyBiZWVuIGNvbW1pdGVkIHRvIGhhcmR3YXJlLgorICBzZXRBbmFsb2dOdW1DaGFubmVsc1RvQWN0aXZhdGUoMCk7Cit9CisKKy8qKgorICogR2V0IHRoZSBjdXJyZW50IHNhbXBsZSByYXRlLgorICoKKyAqIFRoaXMgYXNzdW1lcyBvbmUgZW50cnkgaW4gdGhlIHNjYW4gbGlzdC4KKyAqIFRoaXMgaXMgYSBnbG9iYWwgc2V0dGluZyBmb3IgdGhlIEF0aGVuYSBhbmQgZWZmZWN0cyBhbGwgY2hhbm5lbHMuCisgKgorICogQHJldHVybiBTYW1wbGUgcmF0ZS4KKyAqLworZmxvYXQgZ2V0QW5hbG9nU2FtcGxlUmF0ZShpbnQzMl90ICpzdGF0dXMpIHsKKyAgdWludDMyX3QgdGlja3NQZXJDb252ZXJzaW9uID0gYW5hbG9nSW5wdXRTeXN0ZW0tPnJlYWRMb29wVGltaW5nKHN0YXR1cyk7CisgIHVpbnQzMl90IHRpY2tzUGVyU2FtcGxlID0gdGlja3NQZXJDb252ZXJzaW9uICogZ2V0QW5hbG9nTnVtQWN0aXZlQ2hhbm5lbHMoc3RhdHVzKTsKKyAgcmV0dXJuIChmbG9hdClrVGltZWJhc2UgLyAoZmxvYXQpdGlja3NQZXJTYW1wbGU7Cit9CisKKy8qKgorICogU2V0IHRoZSBudW1iZXIgb2YgYXZlcmFnaW5nIGJpdHMuCisgKgorICogVGhpcyBzZXRzIHRoZSBudW1iZXIgb2YgYXZlcmFnaW5nIGJpdHMuIFRoZSBhY3R1YWwgbnVtYmVyIG9mIGF2ZXJhZ2VkIHNhbXBsZXMgaXMgMioqYml0cy4KKyAqIFVzZSBhdmVyYWdpbmcgdG8gaW1wcm92ZSB0aGUgc3RhYmlsaXR5IG9mIHlvdXIgbWVhc3VyZW1lbnQgYXQgdGhlIGV4cGVuc2Ugb2Ygc2FtcGxpbmcgcmF0ZS4KKyAqIFRoZSBhdmVyYWdpbmcgaXMgZG9uZSBhdXRvbWF0aWNhbGx5IGluIHRoZSBGUEdBLgorICoKKyAqIEBwYXJhbSBhbmFsb2dfcG9ydF9wb2ludGVyIFBvaW50ZXIgdG8gdGhlIGFuYWxvZyBwb3J0IHRvIGNvbmZpZ3VyZS4KKyAqIEBwYXJhbSBiaXRzIE51bWJlciBvZiBiaXRzIHRvIGF2ZXJhZ2UuCisgKi8KK3ZvaWQgc2V0QW5hbG9nQXZlcmFnZUJpdHModm9pZCogYW5hbG9nX3BvcnRfcG9pbnRlciwgdWludDMyX3QgYml0cywgaW50MzJfdCAqc3RhdHVzKSB7CisgIEFuYWxvZ1BvcnQqIHBvcnQgPSAoQW5hbG9nUG9ydCopIGFuYWxvZ19wb3J0X3BvaW50ZXI7CisgIGFuYWxvZ0lucHV0U3lzdGVtLT53cml0ZUF2ZXJhZ2VCaXRzKHBvcnQtPnBvcnQucGluLCBiaXRzLCBzdGF0dXMpOworfQorCisvKioKKyAqIEdldCB0aGUgbnVtYmVyIG9mIGF2ZXJhZ2luZyBiaXRzLgorICoKKyAqIFRoaXMgZ2V0cyB0aGUgbnVtYmVyIG9mIGF2ZXJhZ2luZyBiaXRzIGZyb20gdGhlIEZQR0EuIFRoZSBhY3R1YWwgbnVtYmVyIG9mIGF2ZXJhZ2VkIHNhbXBsZXMgaXMgMioqYml0cy4KKyAqIFRoZSBhdmVyYWdpbmcgaXMgZG9uZSBhdXRvbWF0aWNhbGx5IGluIHRoZSBGUEdBLgorICoKKyAqIEBwYXJhbSBhbmFsb2dfcG9ydF9wb2ludGVyIFBvaW50ZXIgdG8gdGhlIGFuYWxvZyBwb3J0IHRvIHVzZS4KKyAqIEByZXR1cm4gQml0cyB0byBhdmVyYWdlLgorICovCit1aW50MzJfdCBnZXRBbmFsb2dBdmVyYWdlQml0cyh2b2lkKiBhbmFsb2dfcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgQW5hbG9nUG9ydCogcG9ydCA9IChBbmFsb2dQb3J0KikgYW5hbG9nX3BvcnRfcG9pbnRlcjsKKyAgdWludDMyX3QgcmVzdWx0ID0gYW5hbG9nSW5wdXRTeXN0ZW0tPnJlYWRBdmVyYWdlQml0cyhwb3J0LT5wb3J0LnBpbiwgc3RhdHVzKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBTZXQgdGhlIG51bWJlciBvZiBvdmVyc2FtcGxlIGJpdHMuCisgKgorICogVGhpcyBzZXRzIHRoZSBudW1iZXIgb2Ygb3ZlcnNhbXBsZSBiaXRzLiBUaGUgYWN0dWFsIG51bWJlciBvZiBvdmVyc2FtcGxlZCB2YWx1ZXMgaXMgMioqYml0cy4KKyAqIFVzZSBvdmVyc2FtcGxpbmcgdG8gaW1wcm92ZSB0aGUgcmVzb2x1dGlvbiBvZiB5b3VyIG1lYXN1cmVtZW50cyBhdCB0aGUgZXhwZW5zZSBvZiBzYW1wbGluZyByYXRlLgorICogVGhlIG92ZXJzYW1wbGluZyBpcyBkb25lIGF1dG9tYXRpY2FsbHkgaW4gdGhlIEZQR0EuCisgKgorICogQHBhcmFtIGFuYWxvZ19wb3J0X3BvaW50ZXIgUG9pbnRlciB0byB0aGUgYW5hbG9nIHBvcnQgdG8gdXNlLgorICogQHBhcmFtIGJpdHMgTnVtYmVyIG9mIGJpdHMgdG8gb3ZlcnNhbXBsZS4KKyAqLwordm9pZCBzZXRBbmFsb2dPdmVyc2FtcGxlQml0cyh2b2lkKiBhbmFsb2dfcG9ydF9wb2ludGVyLCB1aW50MzJfdCBiaXRzLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgQW5hbG9nUG9ydCogcG9ydCA9IChBbmFsb2dQb3J0KikgYW5hbG9nX3BvcnRfcG9pbnRlcjsKKyAgYW5hbG9nSW5wdXRTeXN0ZW0tPndyaXRlT3ZlcnNhbXBsZUJpdHMocG9ydC0+cG9ydC5waW4sIGJpdHMsIHN0YXR1cyk7Cit9CisKKworLyoqCisgKiBHZXQgdGhlIG51bWJlciBvZiBvdmVyc2FtcGxlIGJpdHMuCisgKgorICogVGhpcyBnZXRzIHRoZSBudW1iZXIgb2Ygb3ZlcnNhbXBsZSBiaXRzIGZyb20gdGhlIEZQR0EuIFRoZSBhY3R1YWwgbnVtYmVyIG9mIG92ZXJzYW1wbGVkIHZhbHVlcyBpcworICogMioqYml0cy4gVGhlIG92ZXJzYW1wbGluZyBpcyBkb25lIGF1dG9tYXRpY2FsbHkgaW4gdGhlIEZQR0EuCisgKgorICogQHBhcmFtIGFuYWxvZ19wb3J0X3BvaW50ZXIgUG9pbnRlciB0byB0aGUgYW5hbG9nIHBvcnQgdG8gdXNlLgorICogQHJldHVybiBCaXRzIHRvIG92ZXJzYW1wbGUuCisgKi8KK3VpbnQzMl90IGdldEFuYWxvZ092ZXJzYW1wbGVCaXRzKHZvaWQqIGFuYWxvZ19wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cykgeworICBBbmFsb2dQb3J0KiBwb3J0ID0gKEFuYWxvZ1BvcnQqKSBhbmFsb2dfcG9ydF9wb2ludGVyOworICB1aW50MzJfdCByZXN1bHQgPSBhbmFsb2dJbnB1dFN5c3RlbS0+cmVhZE92ZXJzYW1wbGVCaXRzKHBvcnQtPnBvcnQucGluLCBzdGF0dXMpOworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIEdldCBhIHNhbXBsZSBzdHJhaWdodCBmcm9tIHRoZSBjaGFubmVsIG9uIHRoaXMgbW9kdWxlLgorICoKKyAqIFRoZSBzYW1wbGUgaXMgYSAxMi1iaXQgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSAwViB0byA1ViByYW5nZSBvZiB0aGUgQS9EIGNvbnZlcnRlciBpbiB0aGUgbW9kdWxlLgorICogVGhlIHVuaXRzIGFyZSBpbiBBL0QgY29udmVydGVyIGNvZGVzLiAgVXNlIEdldFZvbHRhZ2UoKSB0byBnZXQgdGhlIGFuYWxvZyB2YWx1ZSBpbiBjYWxpYnJhdGVkIHVuaXRzLgorICoKKyAqIEBwYXJhbSBhbmFsb2dfcG9ydF9wb2ludGVyIFBvaW50ZXIgdG8gdGhlIGFuYWxvZyBwb3J0IHRvIHVzZS4KKyAqIEByZXR1cm4gQSBzYW1wbGUgc3RyYWlnaHQgZnJvbSB0aGUgY2hhbm5lbCBvbiB0aGlzIG1vZHVsZS4KKyAqLworaW50MTZfdCBnZXRBbmFsb2dWYWx1ZSh2b2lkKiBhbmFsb2dfcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgQW5hbG9nUG9ydCogcG9ydCA9IChBbmFsb2dQb3J0KikgYW5hbG9nX3BvcnRfcG9pbnRlcjsKKyAgaW50MTZfdCB2YWx1ZTsKKyAgY2hlY2tBbmFsb2dJbnB1dENoYW5uZWwocG9ydC0+cG9ydC5waW4pOworCisgIHRBSTo6dFJlYWRTZWxlY3QgcmVhZFNlbGVjdDsKKyAgcmVhZFNlbGVjdC5DaGFubmVsID0gcG9ydC0+cG9ydC5waW47CisgIHJlYWRTZWxlY3QuQXZlcmFnZWQgPSBmYWxzZTsKKworICB7CisgICAgOjpzdGQ6OnVuaXF1ZV9sb2NrPFJlZW50cmFudE11dGV4PiBzeW5jKGFuYWxvZ1JlZ2lzdGVyV2luZG93TXV0ZXgpOworICAgIGFuYWxvZ0lucHV0U3lzdGVtLT53cml0ZVJlYWRTZWxlY3QocmVhZFNlbGVjdCwgc3RhdHVzKTsKKyAgICBhbmFsb2dJbnB1dFN5c3RlbS0+c3Ryb2JlTGF0Y2hPdXRwdXQoc3RhdHVzKTsKKyAgICB2YWx1ZSA9IChpbnQxNl90KSBhbmFsb2dJbnB1dFN5c3RlbS0+cmVhZE91dHB1dChzdGF0dXMpOworICB9CisKKyAgcmV0dXJuIHZhbHVlOworfQorCisvKioKKyAqIEdldCBhIHNhbXBsZSBmcm9tIHRoZSBvdXRwdXQgb2YgdGhlIG92ZXJzYW1wbGUgYW5kIGF2ZXJhZ2UgZW5naW5lIGZvciB0aGUgY2hhbm5lbC4KKyAqCisgKiBUaGUgc2FtcGxlIGlzIDEyLWJpdCArIHRoZSB2YWx1ZSBjb25maWd1cmVkIGluIFNldE92ZXJzYW1wbGVCaXRzKCkuCisgKiBUaGUgdmFsdWUgY29uZmlndXJlZCBpbiBTZXRBdmVyYWdlQml0cygpIHdpbGwgY2F1c2UgdGhpcyB2YWx1ZSB0byBiZSBhdmVyYWdlZCAyKipiaXRzIG51bWJlciBvZiBzYW1wbGVzLgorICogVGhpcyBpcyBub3QgYSBzbGlkaW5nIHdpbmRvdy4gIFRoZSBzYW1wbGUgd2lsbCBub3QgY2hhbmdlIHVudGlsIDIqKihPdmVyc2FtcGxCaXRzICsgQXZlcmFnZUJpdHMpIHNhbXBsZXMKKyAqIGhhdmUgYmVlbiBhY3F1aXJlZCBmcm9tIHRoZSBtb2R1bGUgb24gdGhpcyBjaGFubmVsLgorICogVXNlIEdldEF2ZXJhZ2VWb2x0YWdlKCkgdG8gZ2V0IHRoZSBhbmFsb2cgdmFsdWUgaW4gY2FsaWJyYXRlZCB1bml0cy4KKyAqCisgKiBAcGFyYW0gYW5hbG9nX3BvcnRfcG9pbnRlciBQb2ludGVyIHRvIHRoZSBhbmFsb2cgcG9ydCB0byB1c2UuCisgKiBAcmV0dXJuIEEgc2FtcGxlIGZyb20gdGhlIG92ZXJzYW1wbGUgYW5kIGF2ZXJhZ2UgZW5naW5lIGZvciB0aGUgY2hhbm5lbC4KKyAqLworaW50MzJfdCBnZXRBbmFsb2dBdmVyYWdlVmFsdWUodm9pZCogYW5hbG9nX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisgIEFuYWxvZ1BvcnQqIHBvcnQgPSAoQW5hbG9nUG9ydCopIGFuYWxvZ19wb3J0X3BvaW50ZXI7CisgIGludDMyX3QgdmFsdWU7CisgIGNoZWNrQW5hbG9nSW5wdXRDaGFubmVsKHBvcnQtPnBvcnQucGluKTsKKworICB0QUk6OnRSZWFkU2VsZWN0IHJlYWRTZWxlY3Q7CisgIHJlYWRTZWxlY3QuQ2hhbm5lbCA9IHBvcnQtPnBvcnQucGluOworICByZWFkU2VsZWN0LkF2ZXJhZ2VkID0gdHJ1ZTsKKworICB7CisgICAgOjpzdGQ6OnVuaXF1ZV9sb2NrPFJlZW50cmFudE11dGV4PiBzeW5jKGFuYWxvZ1JlZ2lzdGVyV2luZG93TXV0ZXgpOworICAgIGFuYWxvZ0lucHV0U3lzdGVtLT53cml0ZVJlYWRTZWxlY3QocmVhZFNlbGVjdCwgc3RhdHVzKTsKKyAgICBhbmFsb2dJbnB1dFN5c3RlbS0+c3Ryb2JlTGF0Y2hPdXRwdXQoc3RhdHVzKTsKKyAgICB2YWx1ZSA9IChpbnQzMl90KSBhbmFsb2dJbnB1dFN5c3RlbS0+cmVhZE91dHB1dChzdGF0dXMpOworICB9CisKKyAgcmV0dXJuIHZhbHVlOworfQorCisvKioKKyAqIEdldCBhIHNjYWxlZCBzYW1wbGUgc3RyYWlnaHQgZnJvbSB0aGUgY2hhbm5lbCBvbiB0aGlzIG1vZHVsZS4KKyAqCisgKiBUaGUgdmFsdWUgaXMgc2NhbGVkIHRvIHVuaXRzIG9mIFZvbHRzIHVzaW5nIHRoZSBjYWxpYnJhdGVkIHNjYWxpbmcgZGF0YSBmcm9tIEdldExTQldlaWdodCgpIGFuZCBHZXRPZmZzZXQoKS4KKyAqCisgKiBAcGFyYW0gYW5hbG9nX3BvcnRfcG9pbnRlciBQb2ludGVyIHRvIHRoZSBhbmFsb2cgcG9ydCB0byB1c2UuCisgKiBAcmV0dXJuIEEgc2NhbGVkIHNhbXBsZSBzdHJhaWdodCBmcm9tIHRoZSBjaGFubmVsIG9uIHRoaXMgbW9kdWxlLgorICovCitmbG9hdCBnZXRBbmFsb2dWb2x0YWdlKHZvaWQqIGFuYWxvZ19wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cykgeworICBpbnQxNl90IHZhbHVlID0gZ2V0QW5hbG9nVmFsdWUoYW5hbG9nX3BvcnRfcG9pbnRlciwgc3RhdHVzKTsKKyAgdWludDMyX3QgTFNCV2VpZ2h0ID0gZ2V0QW5hbG9nTFNCV2VpZ2h0KGFuYWxvZ19wb3J0X3BvaW50ZXIsIHN0YXR1cyk7CisgIGludDMyX3Qgb2Zmc2V0ID0gZ2V0QW5hbG9nT2Zmc2V0KGFuYWxvZ19wb3J0X3BvaW50ZXIsIHN0YXR1cyk7CisgIGZsb2F0IHZvbHRhZ2UgPSBMU0JXZWlnaHQgKiAxLjBlLTkgKiB2YWx1ZSAtIG9mZnNldCAqIDEuMGUtOTsKKyAgcmV0dXJuIHZvbHRhZ2U7Cit9CisKKy8qKgorICogR2V0IGEgc2NhbGVkIHNhbXBsZSBmcm9tIHRoZSBvdXRwdXQgb2YgdGhlIG92ZXJzYW1wbGUgYW5kIGF2ZXJhZ2UgZW5naW5lIGZvciB0aGUgY2hhbm5lbC4KKyAqCisgKiBUaGUgdmFsdWUgaXMgc2NhbGVkIHRvIHVuaXRzIG9mIFZvbHRzIHVzaW5nIHRoZSBjYWxpYnJhdGVkIHNjYWxpbmcgZGF0YSBmcm9tIEdldExTQldlaWdodCgpIGFuZCBHZXRPZmZzZXQoKS4KKyAqIFVzaW5nIG92ZXJzYW1wbGluZyB3aWxsIGNhdXNlIHRoaXMgdmFsdWUgdG8gYmUgaGlnaGVyIHJlc29sdXRpb24sIGJ1dCBpdCB3aWxsIHVwZGF0ZSBtb3JlIHNsb3dseS4KKyAqIFVzaW5nIGF2ZXJhZ2luZyB3aWxsIGNhdXNlIHRoaXMgdmFsdWUgdG8gYmUgbW9yZSBzdGFibGUsIGJ1dCBpdCB3aWxsIHVwZGF0ZSBtb3JlIHNsb3dseS4KKyAqCisgKiBAcGFyYW0gYW5hbG9nX3BvcnRfcG9pbnRlciBQb2ludGVyIHRvIHRoZSBhbmFsb2cgcG9ydCB0byB1c2UuCisgKiBAcmV0dXJuIEEgc2NhbGVkIHNhbXBsZSBmcm9tIHRoZSBvdXRwdXQgb2YgdGhlIG92ZXJzYW1wbGUgYW5kIGF2ZXJhZ2UgZW5naW5lIGZvciB0aGUgY2hhbm5lbC4KKyAqLworZmxvYXQgZ2V0QW5hbG9nQXZlcmFnZVZvbHRhZ2Uodm9pZCogYW5hbG9nX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisgIGludDMyX3QgdmFsdWUgPSBnZXRBbmFsb2dBdmVyYWdlVmFsdWUoYW5hbG9nX3BvcnRfcG9pbnRlciwgc3RhdHVzKTsKKyAgdWludDMyX3QgTFNCV2VpZ2h0ID0gZ2V0QW5hbG9nTFNCV2VpZ2h0KGFuYWxvZ19wb3J0X3BvaW50ZXIsIHN0YXR1cyk7CisgIGludDMyX3Qgb2Zmc2V0ID0gZ2V0QW5hbG9nT2Zmc2V0KGFuYWxvZ19wb3J0X3BvaW50ZXIsIHN0YXR1cyk7CisgIHVpbnQzMl90IG92ZXJzYW1wbGVCaXRzID0gZ2V0QW5hbG9nT3ZlcnNhbXBsZUJpdHMoYW5hbG9nX3BvcnRfcG9pbnRlciwgc3RhdHVzKTsKKyAgZmxvYXQgdm9sdGFnZSA9ICgoTFNCV2VpZ2h0ICogMS4wZS05ICogdmFsdWUpIC8gKGZsb2F0KSgxIDw8IG92ZXJzYW1wbGVCaXRzKSkgLSBvZmZzZXQgKiAxLjBlLTk7CisgIHJldHVybiB2b2x0YWdlOworfQorCisvKioKKyAqIENvbnZlcnQgYSB2b2x0YWdlIHRvIGEgcmF3IHZhbHVlIGZvciBhIHNwZWNpZmllZCBjaGFubmVsLgorICoKKyAqIFRoaXMgcHJvY2VzcyBkZXBlbmRzIG9uIHRoZSBjYWxpYnJhdGlvbiBvZiBlYWNoIGNoYW5uZWwsIHNvIHRoZSBjaGFubmVsCisgKiBtdXN0IGJlIHNwZWNpZmllZC4KKyAqCisgKiBAdG9kbyBUaGlzIGFzc3VtZXMgcmF3IHZhbHVlcy4gIE92ZXJzYW1wbGluZyBub3Qgc3VwcG9ydGVkIGFzIGlzLgorICoKKyAqIEBwYXJhbSBhbmFsb2dfcG9ydF9wb2ludGVyIFBvaW50ZXIgdG8gdGhlIGFuYWxvZyBwb3J0IHRvIHVzZS4KKyAqIEBwYXJhbSB2b2x0YWdlIFRoZSB2b2x0YWdlIHRvIGNvbnZlcnQuCisgKiBAcmV0dXJuIFRoZSByYXcgdmFsdWUgZm9yIHRoZSBjaGFubmVsLgorICovCitpbnQzMl90IGdldEFuYWxvZ1ZvbHRzVG9WYWx1ZSh2b2lkKiBhbmFsb2dfcG9ydF9wb2ludGVyLCBkb3VibGUgdm9sdGFnZSwgaW50MzJfdCAqc3RhdHVzKSB7CisgIGlmICh2b2x0YWdlID4gNS4wKSB7CisgICAgdm9sdGFnZSA9IDUuMDsKKyAgICAqc3RhdHVzID0gVk9MVEFHRV9PVVRfT0ZfUkFOR0U7CisgIH0KKyAgaWYgKHZvbHRhZ2UgPCAwLjApIHsKKyAgICB2b2x0YWdlID0gMC4wOworICAgICpzdGF0dXMgPSBWT0xUQUdFX09VVF9PRl9SQU5HRTsKKyAgfQorICB1aW50MzJfdCBMU0JXZWlnaHQgPSBnZXRBbmFsb2dMU0JXZWlnaHQoYW5hbG9nX3BvcnRfcG9pbnRlciwgc3RhdHVzKTsKKyAgaW50MzJfdCBvZmZzZXQgPSBnZXRBbmFsb2dPZmZzZXQoYW5hbG9nX3BvcnRfcG9pbnRlciwgc3RhdHVzKTsKKyAgaW50MzJfdCB2YWx1ZSA9IChpbnQzMl90KSAoKHZvbHRhZ2UgKyBvZmZzZXQgKiAxLjBlLTkpIC8gKExTQldlaWdodCAqIDEuMGUtOSkpOworICByZXR1cm4gdmFsdWU7Cit9CisKKy8qKgorICogR2V0IHRoZSBmYWN0b3J5IHNjYWxpbmcgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHdlaWdodCBjb25zdGFudC4KKyAqIFRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgd2VpZ2h0IGNvbnN0YW50IGZvciB0aGUgY2hhbm5lbCB0aGF0IHdhcyBjYWxpYnJhdGVkIGluCisgKiBtYW51ZmFjdHVyaW5nIGFuZCBzdG9yZWQgaW4gYW4gZWVwcm9tIGluIHRoZSBtb2R1bGUuCisgKgorICogVm9sdHMgPSAoKExTQl9XZWlnaHQgKiAxZS05KSAqIHJhdykgLSAoT2Zmc2V0ICogMWUtOSkKKyAqCisgKiBAcGFyYW0gYW5hbG9nX3BvcnRfcG9pbnRlciBQb2ludGVyIHRvIHRoZSBhbmFsb2cgcG9ydCB0byB1c2UuCisgKiBAcmV0dXJuIExlYXN0IHNpZ25pZmljYW50IGJpdCB3ZWlnaHQuCisgKi8KK3VpbnQzMl90IGdldEFuYWxvZ0xTQldlaWdodCh2b2lkKiBhbmFsb2dfcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgQW5hbG9nUG9ydCogcG9ydCA9IChBbmFsb2dQb3J0KikgYW5hbG9nX3BvcnRfcG9pbnRlcjsKKyAgdWludDMyX3QgbHNiV2VpZ2h0ID0gRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX25BSUNhbGlicmF0aW9uX2dldExTQldlaWdodCgwLCBwb3J0LT5wb3J0LnBpbiwgc3RhdHVzKTsgLy8gWFhYOiBhaVN5c3RlbUluZGV4ID09IDA/CisgIHJldHVybiBsc2JXZWlnaHQ7Cit9CisKKy8qKgorICogR2V0IHRoZSBmYWN0b3J5IHNjYWxpbmcgb2Zmc2V0IGNvbnN0YW50LgorICogVGhlIG9mZnNldCBjb25zdGFudCBmb3IgdGhlIGNoYW5uZWwgdGhhdCB3YXMgY2FsaWJyYXRlZCBpbiBtYW51ZmFjdHVyaW5nIGFuZCBzdG9yZWQKKyAqIGluIGFuIGVlcHJvbSBpbiB0aGUgbW9kdWxlLgorICoKKyAqIFZvbHRzID0gKChMU0JfV2VpZ2h0ICogMWUtOSkgKiByYXcpIC0gKE9mZnNldCAqIDFlLTkpCisgKgorICogQHBhcmFtIGFuYWxvZ19wb3J0X3BvaW50ZXIgUG9pbnRlciB0byB0aGUgYW5hbG9nIHBvcnQgdG8gdXNlLgorICogQHJldHVybiBPZmZzZXQgY29uc3RhbnQuCisgKi8KK2ludDMyX3QgZ2V0QW5hbG9nT2Zmc2V0KHZvaWQqIGFuYWxvZ19wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cykgeworICBBbmFsb2dQb3J0KiBwb3J0ID0gKEFuYWxvZ1BvcnQqKSBhbmFsb2dfcG9ydF9wb2ludGVyOworICBpbnQzMl90IG9mZnNldCA9IEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9uQUlDYWxpYnJhdGlvbl9nZXRPZmZzZXQoMCwgcG9ydC0+cG9ydC5waW4sIHN0YXR1cyk7IC8vIFhYWDogYWlTeXN0ZW1JbmRleCA9PSAwPworICByZXR1cm4gb2Zmc2V0OworfQorCisKKy8qKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgb24gdGhlIG1vZHVsZSBpbiB1c2UuCisgKgorICogQHJldHVybiBBY3RpdmUgY2hhbm5lbHMuCisgKi8KK3VpbnQzMl90IGdldEFuYWxvZ051bUFjdGl2ZUNoYW5uZWxzKGludDMyX3QgKnN0YXR1cykgeworICB1aW50MzJfdCBzY2FuU2l6ZSA9IGFuYWxvZ0lucHV0U3lzdGVtLT5yZWFkQ29uZmlnX1NjYW5TaXplKHN0YXR1cyk7CisgIGlmIChzY2FuU2l6ZSA9PSAwKQorICAgIHJldHVybiA4OworICByZXR1cm4gc2NhblNpemU7Cit9CisKKy8qKgorICogR2V0IHRoZSBudW1iZXIgb2YgYWN0aXZlIGNoYW5uZWxzLgorICoKKyAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgZnVuY3Rpb24gdG8gYWxsb3cgdGhlIGF0b21pYyB1cGRhdGUgb2YgYm90aCB0aGUKKyAqIG51bWJlciBvZiBhY3RpdmUgY2hhbm5lbHMgYW5kIHRoZSBzYW1wbGUgcmF0ZS4KKyAqCisgKiBXaGVuIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgY2hhbmdlcywgdXNlIHRoZSBuZXcgdmFsdWUuICBPdGhlcndpc2UsCisgKiByZXR1cm4gdGhlIGN1cmVudCB2YWx1ZS4KKyAqCisgKiBAcmV0dXJuIFZhbHVlIHRvIHdyaXRlIHRvIHRoZSBhY3RpdmUgY2hhbm5lbHMgZmllbGQuCisgKi8KK3VpbnQzMl90IGdldEFuYWxvZ051bUNoYW5uZWxzVG9BY3RpdmF0ZShpbnQzMl90ICpzdGF0dXMpIHsKKyAgaWYoYW5hbG9nTnVtQ2hhbm5lbHNUb0FjdGl2YXRlID09IDApIHJldHVybiBnZXRBbmFsb2dOdW1BY3RpdmVDaGFubmVscyhzdGF0dXMpOworICByZXR1cm4gYW5hbG9nTnVtQ2hhbm5lbHNUb0FjdGl2YXRlOworfQorCisvKioKKyAqIFNldCB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBjaGFubmVscy4KKyAqCisgKiBTdG9yZSB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBjaGFubmVscyB0byBzZXQuICBEb24ndCBhY3R1YWxseSBjb21taXQgdG8gaGFyZHdhcmUKKyAqIHVudGlsIFNldFNhbXBsZVJhdGUoKS4KKyAqCisgKiBAcGFyYW0gY2hhbm5lbHMgTnVtYmVyIG9mIGFjdGl2ZSBjaGFubmVscy4KKyAqLwordm9pZCBzZXRBbmFsb2dOdW1DaGFubmVsc1RvQWN0aXZhdGUodWludDMyX3QgY2hhbm5lbHMpIHsKKyAgYW5hbG9nTnVtQ2hhbm5lbHNUb0FjdGl2YXRlID0gY2hhbm5lbHM7Cit9CisKKy8vLy8gQWNjdW11bGF0b3IgU3R1ZmYKKworLyoqCisgKiBJcyB0aGUgY2hhbm5lbCBhdHRhY2hlZCB0byBhbiBhY2N1bXVsYXRvci4KKyAqCisgKiBAcmV0dXJuIFRoZSBhbmFsb2cgY2hhbm5lbCBpcyBhdHRhY2hlZCB0byBhbiBhY2N1bXVsYXRvci4KKyAqLworYm9vbCBpc0FjY3VtdWxhdG9yQ2hhbm5lbCh2b2lkKiBhbmFsb2dfcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgQW5hbG9nUG9ydCogcG9ydCA9IChBbmFsb2dQb3J0KikgYW5hbG9nX3BvcnRfcG9pbnRlcjsKKyAgZm9yICh1aW50MzJfdCBpPTA7IGkgPCBrQWNjdW11bGF0b3JOdW1DaGFubmVsczsgaSsrKSB7CisgICAgaWYgKHBvcnQtPnBvcnQucGluID09IGtBY2N1bXVsYXRvckNoYW5uZWxzW2ldKSByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogSW5pdGlhbGl6ZSB0aGUgYWNjdW11bGF0b3IuCisgKi8KK3ZvaWQgaW5pdEFjY3VtdWxhdG9yKHZvaWQqIGFuYWxvZ19wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cykgeworICBzZXRBY2N1bXVsYXRvckNlbnRlcihhbmFsb2dfcG9ydF9wb2ludGVyLCAwLCBzdGF0dXMpOworICByZXNldEFjY3VtdWxhdG9yKGFuYWxvZ19wb3J0X3BvaW50ZXIsIHN0YXR1cyk7Cit9CisKKy8qKgorICogUmVzZXRzIHRoZSBhY2N1bXVsYXRvciB0byB0aGUgaW5pdGlhbCB2YWx1ZS4KKyAqLwordm9pZCByZXNldEFjY3VtdWxhdG9yKHZvaWQqIGFuYWxvZ19wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cykgeworICBBbmFsb2dQb3J0KiBwb3J0ID0gKEFuYWxvZ1BvcnQqKSBhbmFsb2dfcG9ydF9wb2ludGVyOworICBpZiAocG9ydC0+YWNjdW11bGF0b3IgPT0gTlVMTCkgeworICAgICpzdGF0dXMgPSBOVUxMX1BBUkFNRVRFUjsKKyAgICByZXR1cm47CisgIH0KKyAgcG9ydC0+YWNjdW11bGF0b3ItPnN0cm9iZVJlc2V0KHN0YXR1cyk7Cit9CisKKy8qKgorICogU2V0IHRoZSBjZW50ZXIgdmFsdWUgb2YgdGhlIGFjY3VtdWxhdG9yLgorICoKKyAqIFRoZSBjZW50ZXIgdmFsdWUgaXMgc3VidHJhY3RlZCBmcm9tIGVhY2ggQS9EIHZhbHVlIGJlZm9yZSBpdCBpcyBhZGRlZCB0byB0aGUgYWNjdW11bGF0b3IuIFRoaXMKKyAqIGlzIHVzZWQgZm9yIHRoZSBjZW50ZXIgdmFsdWUgb2YgZGV2aWNlcyBsaWtlIGd5cm9zIGFuZCBhY2NlbGVyb21ldGVycyB0byBtYWtlIGludGVncmF0aW9uIHdvcmsKKyAqIGFuZCB0byB0YWtlIHRoZSBkZXZpY2Ugb2Zmc2V0IGludG8gYWNjb3VudCB3aGVuIGludGVncmF0aW5nLgorICoKKyAqIFRoaXMgY2VudGVyIHZhbHVlIGlzIGJhc2VkIG9uIHRoZSBvdXRwdXQgb2YgdGhlIG92ZXJzYW1wbGVkIGFuZCBhdmVyYWdlZCBzb3VyY2UgZnJvbSBjaGFubmVsIDEuCisgKiBCZWNhdXNlIG9mIHRoaXMsIGFueSBub24temVybyBvdmVyc2FtcGxlIGJpdHMgd2lsbCBhZmZlY3QgdGhlIHNpemUgb2YgdGhlIHZhbHVlIGZvciB0aGlzIGZpZWxkLgorICovCit2b2lkIHNldEFjY3VtdWxhdG9yQ2VudGVyKHZvaWQqIGFuYWxvZ19wb3J0X3BvaW50ZXIsIGludDMyX3QgY2VudGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgQW5hbG9nUG9ydCogcG9ydCA9IChBbmFsb2dQb3J0KikgYW5hbG9nX3BvcnRfcG9pbnRlcjsKKyAgaWYgKHBvcnQtPmFjY3VtdWxhdG9yID09IE5VTEwpIHsKKyAgICAqc3RhdHVzID0gTlVMTF9QQVJBTUVURVI7CisgICAgcmV0dXJuOworICB9CisgIHBvcnQtPmFjY3VtdWxhdG9yLT53cml0ZUNlbnRlcihjZW50ZXIsIHN0YXR1cyk7Cit9CisKKy8qKgorICogU2V0IHRoZSBhY2N1bXVsYXRvcidzIGRlYWRiYW5kLgorICovCit2b2lkIHNldEFjY3VtdWxhdG9yRGVhZGJhbmQodm9pZCogYW5hbG9nX3BvcnRfcG9pbnRlciwgaW50MzJfdCBkZWFkYmFuZCwgaW50MzJfdCAqc3RhdHVzKSB7CisgIEFuYWxvZ1BvcnQqIHBvcnQgPSAoQW5hbG9nUG9ydCopIGFuYWxvZ19wb3J0X3BvaW50ZXI7CisgIGlmIChwb3J0LT5hY2N1bXVsYXRvciA9PSBOVUxMKSB7CisgICAgKnN0YXR1cyA9IE5VTExfUEFSQU1FVEVSOworICAgIHJldHVybjsKKyAgfQorICBwb3J0LT5hY2N1bXVsYXRvci0+d3JpdGVEZWFkYmFuZChkZWFkYmFuZCwgc3RhdHVzKTsKK30KKworLyoqCisgKiBSZWFkIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS4KKyAqCisgKiBSZWFkIHRoZSB2YWx1ZSB0aGF0IGhhcyBiZWVuIGFjY3VtdWxhdGluZyBvbiBjaGFubmVsIDEuCisgKiBUaGUgYWNjdW11bGF0b3IgaXMgYXR0YWNoZWQgYWZ0ZXIgdGhlIG92ZXJzYW1wbGUgYW5kIGF2ZXJhZ2UgZW5naW5lLgorICoKKyAqIEByZXR1cm4gVGhlIDY0LWJpdCB2YWx1ZSBhY2N1bXVsYXRlZCBzaW5jZSB0aGUgbGFzdCBSZXNldCgpLgorICovCitpbnQ2NF90IGdldEFjY3VtdWxhdG9yVmFsdWUodm9pZCogYW5hbG9nX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisgIEFuYWxvZ1BvcnQqIHBvcnQgPSAoQW5hbG9nUG9ydCopIGFuYWxvZ19wb3J0X3BvaW50ZXI7CisgIGlmIChwb3J0LT5hY2N1bXVsYXRvciA9PSBOVUxMKSB7CisgICAgKnN0YXR1cyA9IE5VTExfUEFSQU1FVEVSOworICAgIHJldHVybiAwOworICB9CisgIGludDY0X3QgdmFsdWUgPSBwb3J0LT5hY2N1bXVsYXRvci0+cmVhZE91dHB1dF9WYWx1ZShzdGF0dXMpOworICByZXR1cm4gdmFsdWU7Cit9CisKKy8qKgorICogUmVhZCB0aGUgbnVtYmVyIG9mIGFjY3VtdWxhdGVkIHZhbHVlcy4KKyAqCisgKiBSZWFkIHRoZSBjb3VudCBvZiB0aGUgYWNjdW11bGF0ZWQgdmFsdWVzIHNpbmNlIHRoZSBhY2N1bXVsYXRvciB3YXMgbGFzdCBSZXNldCgpLgorICoKKyAqIEByZXR1cm4gVGhlIG51bWJlciBvZiB0aW1lcyBzYW1wbGVzIGZyb20gdGhlIGNoYW5uZWwgd2VyZSBhY2N1bXVsYXRlZC4KKyAqLwordWludDMyX3QgZ2V0QWNjdW11bGF0b3JDb3VudCh2b2lkKiBhbmFsb2dfcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgQW5hbG9nUG9ydCogcG9ydCA9IChBbmFsb2dQb3J0KikgYW5hbG9nX3BvcnRfcG9pbnRlcjsKKyAgaWYgKHBvcnQtPmFjY3VtdWxhdG9yID09IE5VTEwpIHsKKyAgICAqc3RhdHVzID0gTlVMTF9QQVJBTUVURVI7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIHBvcnQtPmFjY3VtdWxhdG9yLT5yZWFkT3V0cHV0X0NvdW50KHN0YXR1cyk7Cit9CisKKy8qKgorICogUmVhZCB0aGUgYWNjdW11bGF0ZWQgdmFsdWUgYW5kIHRoZSBudW1iZXIgb2YgYWNjdW11bGF0ZWQgdmFsdWVzIGF0b21pY2FsbHkuCisgKgorICogVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgdmFsdWUgYW5kIGNvdW50IGZyb20gdGhlIEZQR0EgYXRvbWljYWxseS4KKyAqIFRoaXMgY2FuIGJlIHVzZWQgZm9yIGF2ZXJhZ2luZy4KKyAqCisgKiBAcGFyYW0gdmFsdWUgUG9pbnRlciB0byB0aGUgNjQtYml0IGFjY3VtdWxhdGVkIG91dHB1dC4KKyAqIEBwYXJhbSBjb3VudCBQb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgYWNjdW11bGF0aW9uIGN5Y2xlcy4KKyAqLwordm9pZCBnZXRBY2N1bXVsYXRvck91dHB1dCh2b2lkKiBhbmFsb2dfcG9ydF9wb2ludGVyLCBpbnQ2NF90ICp2YWx1ZSwgdWludDMyX3QgKmNvdW50LCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgQW5hbG9nUG9ydCogcG9ydCA9IChBbmFsb2dQb3J0KikgYW5hbG9nX3BvcnRfcG9pbnRlcjsKKyAgaWYgKHBvcnQtPmFjY3VtdWxhdG9yID09IE5VTEwpIHsKKyAgICAqc3RhdHVzID0gTlVMTF9QQVJBTUVURVI7CisgICAgcmV0dXJuOworICB9CisgIGlmICh2YWx1ZSA9PSBOVUxMIHx8IGNvdW50ID09IE5VTEwpIHsKKyAgICAqc3RhdHVzID0gTlVMTF9QQVJBTUVURVI7CisgICAgcmV0dXJuOworICB9CisKKyAgdEFjY3VtdWxhdG9yOjp0T3V0cHV0IG91dHB1dCA9IHBvcnQtPmFjY3VtdWxhdG9yLT5yZWFkT3V0cHV0KHN0YXR1cyk7CisKKyAgKnZhbHVlID0gb3V0cHV0LlZhbHVlOworICAqY291bnQgPSBvdXRwdXQuQ291bnQ7Cit9CisKKworc3RydWN0IHRyaWdnZXJfdCB7CisgIHRBbmFsb2dUcmlnZ2VyKiB0cmlnZ2VyOworICBBbmFsb2dQb3J0KiBwb3J0OworICB1aW50MzJfdCBpbmRleDsKK307Cit0eXBlZGVmIHN0cnVjdCB0cmlnZ2VyX3QgQW5hbG9nVHJpZ2dlcjsKKworc3RhdGljIFJlc291cmNlICp0cmlnZ2VycyA9IE5VTEw7CisKK3ZvaWQqIGluaXRpYWxpemVBbmFsb2dUcmlnZ2VyKHZvaWQqIHBvcnRfcG9pbnRlciwgdWludDMyX3QgKmluZGV4LCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgUG9ydCogcG9ydCA9IChQb3J0KikgcG9ydF9wb2ludGVyOworICBSZXNvdXJjZTo6Q3JlYXRlUmVzb3VyY2VPYmplY3QoJnRyaWdnZXJzLCB0QW5hbG9nVHJpZ2dlcjo6a051bVN5c3RlbXMpOworCisgIEFuYWxvZ1RyaWdnZXIqIHRyaWdnZXIgPSBuZXcgQW5hbG9nVHJpZ2dlcigpOworICB0cmlnZ2VyLT5wb3J0ID0gKEFuYWxvZ1BvcnQqKSBpbml0aWFsaXplQW5hbG9nSW5wdXRQb3J0KHBvcnQsIHN0YXR1cyk7CisgIHRyaWdnZXItPmluZGV4ID0gdHJpZ2dlcnMtPkFsbG9jYXRlKCJBbmFsb2cgVHJpZ2dlciIpOworICAqaW5kZXggPSB0cmlnZ2VyLT5pbmRleDsKKyAgLy8gVE9ETzogaWYgKGluZGV4ID09IH4wdWwpIHsgQ2xvbmVFcnJvcih0cmlnZ2Vycyk7IHJldHVybjsgfQorCisgIHRyaWdnZXItPnRyaWdnZXIgPSB0QW5hbG9nVHJpZ2dlcjo6Y3JlYXRlKHRyaWdnZXItPmluZGV4LCBzdGF0dXMpOworICB0cmlnZ2VyLT50cmlnZ2VyLT53cml0ZVNvdXJjZVNlbGVjdF9DaGFubmVsKHBvcnQtPnBpbiwgc3RhdHVzKTsKKworICByZXR1cm4gdHJpZ2dlcjsKK30KKwordm9pZCBjbGVhbkFuYWxvZ1RyaWdnZXIodm9pZCogYW5hbG9nX3RyaWdnZXJfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisgIEFuYWxvZ1RyaWdnZXIqIHRyaWdnZXIgPSAoQW5hbG9nVHJpZ2dlciopIGFuYWxvZ190cmlnZ2VyX3BvaW50ZXI7CisgIHRyaWdnZXJzLT5GcmVlKHRyaWdnZXItPmluZGV4KTsKKyAgZGVsZXRlIHRyaWdnZXItPnRyaWdnZXI7CisgIGRlbGV0ZSB0cmlnZ2VyOworfQorCit2b2lkIHNldEFuYWxvZ1RyaWdnZXJMaW1pdHNSYXcodm9pZCogYW5hbG9nX3RyaWdnZXJfcG9pbnRlciwgaW50MzJfdCBsb3dlciwgaW50MzJfdCB1cHBlciwgaW50MzJfdCAqc3RhdHVzKSB7CisgIEFuYWxvZ1RyaWdnZXIqIHRyaWdnZXIgPSAoQW5hbG9nVHJpZ2dlciopIGFuYWxvZ190cmlnZ2VyX3BvaW50ZXI7CisgIGlmIChsb3dlciA+IHVwcGVyKSB7CisJKnN0YXR1cyA9IEFOQUxPR19UUklHR0VSX0xJTUlUX09SREVSX0VSUk9SOworICB9CisgIHRyaWdnZXItPnRyaWdnZXItPndyaXRlTG93ZXJMaW1pdChsb3dlciwgc3RhdHVzKTsKKyAgdHJpZ2dlci0+dHJpZ2dlci0+d3JpdGVVcHBlckxpbWl0KHVwcGVyLCBzdGF0dXMpOworfQorCisvKioKKyAqIFNldCB0aGUgdXBwZXIgYW5kIGxvd2VyIGxpbWl0cyBvZiB0aGUgYW5hbG9nIHRyaWdnZXIuCisgKiBUaGUgbGltaXRzIGFyZSBnaXZlbiBhcyBmbG9hdGluZyBwb2ludCB2b2x0YWdlIHZhbHVlcy4KKyAqLwordm9pZCBzZXRBbmFsb2dUcmlnZ2VyTGltaXRzVm9sdGFnZSh2b2lkKiBhbmFsb2dfdHJpZ2dlcl9wb2ludGVyLCBkb3VibGUgbG93ZXIsIGRvdWJsZSB1cHBlciwgaW50MzJfdCAqc3RhdHVzKSB7CisgIEFuYWxvZ1RyaWdnZXIqIHRyaWdnZXIgPSAoQW5hbG9nVHJpZ2dlciopIGFuYWxvZ190cmlnZ2VyX3BvaW50ZXI7CisgIGlmIChsb3dlciA+IHVwcGVyKSB7CisJKnN0YXR1cyA9IEFOQUxPR19UUklHR0VSX0xJTUlUX09SREVSX0VSUk9SOworICB9CisgIC8vIFRPRE86IFRoaXMgZGVwZW5kcyBvbiB0aGUgYXZlcmFnZWQgc2V0dGluZy4gIE9ubHkgcmF3IHZhbHVlcyB3aWxsIHdvcmsgYXMgaXMuCisgIHRyaWdnZXItPnRyaWdnZXItPndyaXRlTG93ZXJMaW1pdChnZXRBbmFsb2dWb2x0c1RvVmFsdWUodHJpZ2dlci0+cG9ydCwgbG93ZXIsIHN0YXR1cyksIHN0YXR1cyk7CisgIHRyaWdnZXItPnRyaWdnZXItPndyaXRlVXBwZXJMaW1pdChnZXRBbmFsb2dWb2x0c1RvVmFsdWUodHJpZ2dlci0+cG9ydCwgdXBwZXIsIHN0YXR1cyksIHN0YXR1cyk7Cit9CisKKy8qKgorICogQ29uZmlndXJlIHRoZSBhbmFsb2cgdHJpZ2dlciB0byB1c2UgdGhlIGF2ZXJhZ2VkIHZzLiByYXcgdmFsdWVzLgorICogSWYgdGhlIHZhbHVlIGlzIHRydWUsIHRoZW4gdGhlIGF2ZXJhZ2VkIHZhbHVlIGlzIHNlbGVjdGVkIGZvciB0aGUgYW5hbG9nIHRyaWdnZXIsIG90aGVyd2lzZQorICogdGhlIGltbWVkaWF0ZSB2YWx1ZSBpcyB1c2VkLgorICovCit2b2lkIHNldEFuYWxvZ1RyaWdnZXJBdmVyYWdlZCh2b2lkKiBhbmFsb2dfdHJpZ2dlcl9wb2ludGVyLCBib29sIHVzZUF2ZXJhZ2VkVmFsdWUsIGludDMyX3QgKnN0YXR1cykgeworICBBbmFsb2dUcmlnZ2VyKiB0cmlnZ2VyID0gKEFuYWxvZ1RyaWdnZXIqKSBhbmFsb2dfdHJpZ2dlcl9wb2ludGVyOworICBpZiAodHJpZ2dlci0+dHJpZ2dlci0+cmVhZFNvdXJjZVNlbGVjdF9GaWx0ZXIoc3RhdHVzKSAhPSAwKSB7CisJKnN0YXR1cyA9IElOQ09NUEFUSUJMRV9TVEFURTsKKwkvLyBUT0RPOiB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChJbmNvbXBhdGlibGVNb2RlLCAiSGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCBhdmVyYWdlIGFuZCBmaWx0ZXJpbmcgYXQgdGhlIHNhbWUgdGltZS4iKTsKKyAgfQorICB0cmlnZ2VyLT50cmlnZ2VyLT53cml0ZVNvdXJjZVNlbGVjdF9BdmVyYWdlZCh1c2VBdmVyYWdlZFZhbHVlLCBzdGF0dXMpOworfQorCisvKioKKyAqIENvbmZpZ3VyZSB0aGUgYW5hbG9nIHRyaWdnZXIgdG8gdXNlIGEgZmlsdGVyZWQgdmFsdWUuCisgKiBUaGUgYW5hbG9nIHRyaWdnZXIgd2lsbCBvcGVyYXRlIHdpdGggYSAzIHBvaW50IGF2ZXJhZ2UgcmVqZWN0aW9uIGZpbHRlci4gVGhpcyBpcyBkZXNpZ25lZCB0bworICogaGVscCB3aXRoIDM2MCBkZWdyZWUgcG90IGFwcGxpY2F0aW9ucyBmb3IgdGhlIHBlcmlvZCB3aGVyZSB0aGUgcG90IGNyb3NzZXMgdGhyb3VnaCB6ZXJvLgorICovCit2b2lkIHNldEFuYWxvZ1RyaWdnZXJGaWx0ZXJlZCh2b2lkKiBhbmFsb2dfdHJpZ2dlcl9wb2ludGVyLCBib29sIHVzZUZpbHRlcmVkVmFsdWUsIGludDMyX3QgKnN0YXR1cykgeworICBBbmFsb2dUcmlnZ2VyKiB0cmlnZ2VyID0gKEFuYWxvZ1RyaWdnZXIqKSBhbmFsb2dfdHJpZ2dlcl9wb2ludGVyOworICBpZiAodHJpZ2dlci0+dHJpZ2dlci0+cmVhZFNvdXJjZVNlbGVjdF9BdmVyYWdlZChzdGF0dXMpICE9IDApIHsKKwkqc3RhdHVzID0gSU5DT01QQVRJQkxFX1NUQVRFOworCS8vIFRPRE86IHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KEluY29tcGF0aWJsZU1vZGUsICJIYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IGF2ZXJhZ2UgYW5kIGZpbHRlcmluZyBhdCB0aGUgc2FtZSB0aW1lLiIpOworICB9CisgIHRyaWdnZXItPnRyaWdnZXItPndyaXRlU291cmNlU2VsZWN0X0ZpbHRlcih1c2VGaWx0ZXJlZFZhbHVlLCBzdGF0dXMpOworfQorCisvKioKKyAqIFJldHVybiB0aGUgSW5XaW5kb3cgb3V0cHV0IG9mIHRoZSBhbmFsb2cgdHJpZ2dlci4KKyAqIFRydWUgaWYgdGhlIGFuYWxvZyBpbnB1dCBpcyBiZXR3ZWVuIHRoZSB1cHBlciBhbmQgbG93ZXIgbGltaXRzLgorICogQHJldHVybiBUaGUgSW5XaW5kb3cgb3V0cHV0IG9mIHRoZSBhbmFsb2cgdHJpZ2dlci4KKyAqLworYm9vbCBnZXRBbmFsb2dUcmlnZ2VySW5XaW5kb3codm9pZCogYW5hbG9nX3RyaWdnZXJfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisgIEFuYWxvZ1RyaWdnZXIqIHRyaWdnZXIgPSAoQW5hbG9nVHJpZ2dlciopIGFuYWxvZ190cmlnZ2VyX3BvaW50ZXI7CisgIHJldHVybiB0cmlnZ2VyLT50cmlnZ2VyLT5yZWFkT3V0cHV0X0luSHlzdGVyZXNpcyh0cmlnZ2VyLT5pbmRleCwgc3RhdHVzKSAhPSAwOworfQorCisvKioKKyAqIFJldHVybiB0aGUgVHJpZ2dlclN0YXRlIG91dHB1dCBvZiB0aGUgYW5hbG9nIHRyaWdnZXIuCisgKiBUcnVlIGlmIGFib3ZlIHVwcGVyIGxpbWl0LgorICogRmFsc2UgaWYgYmVsb3cgbG93ZXIgbGltaXQuCisgKiBJZiBpbiBIeXN0ZXJlc2lzLCBtYWludGFpbiBwcmV2aW91cyBzdGF0ZS4KKyAqIEByZXR1cm4gVGhlIFRyaWdnZXJTdGF0ZSBvdXRwdXQgb2YgdGhlIGFuYWxvZyB0cmlnZ2VyLgorICovCitib29sIGdldEFuYWxvZ1RyaWdnZXJUcmlnZ2VyU3RhdGUodm9pZCogYW5hbG9nX3RyaWdnZXJfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisgIEFuYWxvZ1RyaWdnZXIqIHRyaWdnZXIgPSAoQW5hbG9nVHJpZ2dlciopIGFuYWxvZ190cmlnZ2VyX3BvaW50ZXI7CisgIHJldHVybiB0cmlnZ2VyLT50cmlnZ2VyLT5yZWFkT3V0cHV0X092ZXJMaW1pdCh0cmlnZ2VyLT5pbmRleCwgc3RhdHVzKSAhPSAwOworfQorCisvKioKKyAqIEdldCB0aGUgc3RhdGUgb2YgdGhlIGFuYWxvZyB0cmlnZ2VyIG91dHB1dC4KKyAqIEByZXR1cm4gVGhlIHN0YXRlIG9mIHRoZSBhbmFsb2cgdHJpZ2dlciBvdXRwdXQuCisgKi8KK2Jvb2wgZ2V0QW5hbG9nVHJpZ2dlck91dHB1dCh2b2lkKiBhbmFsb2dfdHJpZ2dlcl9wb2ludGVyLCBBbmFsb2dUcmlnZ2VyVHlwZSB0eXBlLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgQW5hbG9nVHJpZ2dlciogdHJpZ2dlciA9IChBbmFsb2dUcmlnZ2VyKikgYW5hbG9nX3RyaWdnZXJfcG9pbnRlcjsKKyAgYm9vbCByZXN1bHQgPSBmYWxzZTsKKyAgc3dpdGNoKHR5cGUpIHsKKyAgY2FzZSBrSW5XaW5kb3c6CisJcmVzdWx0ID0gdHJpZ2dlci0+dHJpZ2dlci0+cmVhZE91dHB1dF9Jbkh5c3RlcmVzaXModHJpZ2dlci0+aW5kZXgsIHN0YXR1cyk7CisJYnJlYWs7IC8vIFhYWDogQmFja3BvcnQKKyAgY2FzZSBrU3RhdGU6CisJcmVzdWx0ID0gdHJpZ2dlci0+dHJpZ2dlci0+cmVhZE91dHB1dF9PdmVyTGltaXQodHJpZ2dlci0+aW5kZXgsIHN0YXR1cyk7CisJYnJlYWs7IC8vIFhYWDogQmFja3BvcnQKKyAgY2FzZSBrUmlzaW5nUHVsc2U6CisgIGNhc2Uga0ZhbGxpbmdQdWxzZToKKwkqc3RhdHVzID0gQU5BTE9HX1RSSUdHRVJfUFVMU0VfT1VUUFVUX0VSUk9SOworCXJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisKKworLy8vLyBGbG9hdCBKTkEgSGFjaworLy8gRmxvYXQKK2ludCBnZXRBbmFsb2dTYW1wbGVSYXRlSW50SGFjayhpbnQzMl90ICpzdGF0dXMpIHsKKyAgcmV0dXJuIGZsb2F0VG9JbnQoZ2V0QW5hbG9nU2FtcGxlUmF0ZShzdGF0dXMpKTsKK30KKworaW50IGdldEFuYWxvZ1ZvbHRhZ2VJbnRIYWNrKHZvaWQqIGFuYWxvZ19wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cykgeworICByZXR1cm4gZmxvYXRUb0ludChnZXRBbmFsb2dWb2x0YWdlKGFuYWxvZ19wb3J0X3BvaW50ZXIsIHN0YXR1cykpOworfQorCitpbnQgZ2V0QW5hbG9nQXZlcmFnZVZvbHRhZ2VJbnRIYWNrKHZvaWQqIGFuYWxvZ19wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cykgeworICByZXR1cm4gZmxvYXRUb0ludChnZXRBbmFsb2dBdmVyYWdlVm9sdGFnZShhbmFsb2dfcG9ydF9wb2ludGVyLCBzdGF0dXMpKTsKK30KKworCisvLyBEb3VibGVzCit2b2lkIHNldEFuYWxvZ1NhbXBsZVJhdGVJbnRIYWNrKGludCBzYW1wbGVzUGVyU2Vjb25kLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgc2V0QW5hbG9nU2FtcGxlUmF0ZShpbnRUb0Zsb2F0KHNhbXBsZXNQZXJTZWNvbmQpLCBzdGF0dXMpOworfQorCitpbnQzMl90IGdldEFuYWxvZ1ZvbHRzVG9WYWx1ZUludEhhY2sodm9pZCogYW5hbG9nX3BvcnRfcG9pbnRlciwgaW50IHZvbHRhZ2UsIGludDMyX3QgKnN0YXR1cykgeworICByZXR1cm4gZ2V0QW5hbG9nVm9sdHNUb1ZhbHVlKGFuYWxvZ19wb3J0X3BvaW50ZXIsIGludFRvRmxvYXQodm9sdGFnZSksIHN0YXR1cyk7Cit9CisKK3ZvaWQgc2V0QW5hbG9nVHJpZ2dlckxpbWl0c1ZvbHRhZ2VJbnRIYWNrKHZvaWQqIGFuYWxvZ190cmlnZ2VyX3BvaW50ZXIsIGludCBsb3dlciwgaW50IHVwcGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgc2V0QW5hbG9nVHJpZ2dlckxpbWl0c1ZvbHRhZ2UoYW5hbG9nX3RyaWdnZXJfcG9pbnRlciwgaW50VG9GbG9hdChsb3dlciksIGludFRvRmxvYXQodXBwZXIpLCBzdGF0dXMpOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvQ2hpcE9iamVjdC5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvQ2hpcE9iamVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMGMzNGQKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9DaGlwT2JqZWN0LmgKQEAgLTAsMCArMSw0MyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdwZWRhbnRpYyIKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdpZ25vcmVkLXF1YWxpZmllcnMiCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgIkZSQ19GUEdBX0NoaXBPYmplY3QvUm9ib1JJT19GUkNfQ2hpcE9iamVjdF9BbGlhc2VzLmgiCisjaW5jbHVkZSAiRlJDX0ZQR0FfQ2hpcE9iamVjdC90RE1BQ2hhbm5lbERlc2NyaXB0b3IuaCIKKyNpbmNsdWRlICJGUkNfRlBHQV9DaGlwT2JqZWN0L3RETUFNYW5hZ2VyLmgiCisjaW5jbHVkZSAiRlJDX0ZQR0FfQ2hpcE9iamVjdC90SW50ZXJydXB0TWFuYWdlci5oIgorI2luY2x1ZGUgIkZSQ19GUEdBX0NoaXBPYmplY3QvdFN5c3RlbS5oIgorI2luY2x1ZGUgIkZSQ19GUEdBX0NoaXBPYmplY3QvdFN5c3RlbUludGVyZmFjZS5oIgorCisjaW5jbHVkZSAiRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL25JbnRlcmZhY2VHbG9iYWxzLmgiCisjaW5jbHVkZSAiRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RBY2NlbC5oIgorI2luY2x1ZGUgIkZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90QWNjdW11bGF0b3IuaCIKKyNpbmNsdWRlICJGUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEFJLmgiCisjaW5jbHVkZSAiRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RBbGFybS5oIgorI2luY2x1ZGUgIkZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90QW5hbG9nVHJpZ2dlci5oIgorI2luY2x1ZGUgIkZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90QU8uaCIKKyNpbmNsdWRlICJGUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEJJU1QuaCIKKyNpbmNsdWRlICJGUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdENvdW50ZXIuaCIKKyNpbmNsdWRlICJGUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdERJTy5oIgorI2luY2x1ZGUgIkZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90RE1BLmgiCisjaW5jbHVkZSAiRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RFbmNvZGVyLmgiCisjaW5jbHVkZSAiRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RHbG9iYWwuaCIKKyNpbmNsdWRlICJGUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEludGVycnVwdC5oIgorI2luY2x1ZGUgIkZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90UG93ZXIuaCIKKyNpbmNsdWRlICJGUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdFBXTS5oIgorI2luY2x1ZGUgIkZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90UmVsYXkuaCIKKyNpbmNsdWRlICJGUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdFNQSS5oIgorI2luY2x1ZGUgIkZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90U3lzV2F0Y2hkb2cuaCIKKworLy8gRklYTUU6IHRoZXNlIHNob3VsZCBub3QgYmUgaGVyZSEKK3VzaW5nIG5hbWVzcGFjZSBuRlBHQTsKK3VzaW5nIG5hbWVzcGFjZSBuUm9ib1JJT19GUEdBTmFtZXNwYWNlOworI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0NvbXByZXNzb3IuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvQ29tcHJlc3Nvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMwNTA5NwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0NvbXByZXNzb3IuY3BwCkBAIC0wLDAgKzEsMTE2IEBACisjaW5jbHVkZSAiSEFML0NvbXByZXNzb3IuaHBwIgorI2luY2x1ZGUgImN0cmUvUENNLmgiCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK3N0YXRpYyBjb25zdCBpbnQgTlVNX01PRFVMRV9OVU1CRVJTID0gNjM7CitleHRlcm4gUENNICptb2R1bGVzW05VTV9NT0RVTEVfTlVNQkVSU107CitleHRlcm4gdm9pZCBpbml0aWFsaXplUENNKGludCBtb2R1bGUpOworCit2b2lkICppbml0aWFsaXplQ29tcHJlc3Nvcih1aW50OF90IG1vZHVsZSkgeworCWluaXRpYWxpemVQQ00obW9kdWxlKTsKKwkKKwlyZXR1cm4gbW9kdWxlc1ttb2R1bGVdOworfQorCitib29sIGNoZWNrQ29tcHJlc3Nvck1vZHVsZSh1aW50OF90IG1vZHVsZSkgeworCXJldHVybiBtb2R1bGUgPCBOVU1fTU9EVUxFX05VTUJFUlM7Cit9CisKK2Jvb2wgZ2V0Q29tcHJlc3Nvcih2b2lkICpwY21fcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisJUENNICptb2R1bGUgPSAoUENNICopcGNtX3BvaW50ZXI7CisJYm9vbCB2YWx1ZTsKKwkKKwkqc3RhdHVzID0gbW9kdWxlLT5HZXRDb21wcmVzc29yKHZhbHVlKTsKKwkKKwlyZXR1cm4gdmFsdWU7Cit9CisKKwordm9pZCBzZXRDbG9zZWRMb29wQ29udHJvbCh2b2lkICpwY21fcG9pbnRlciwgYm9vbCB2YWx1ZSwgaW50MzJfdCAqc3RhdHVzKSB7CisJUENNICptb2R1bGUgPSAoUENNICopcGNtX3BvaW50ZXI7CisJCisJKnN0YXR1cyA9IG1vZHVsZS0+U2V0Q2xvc2VkTG9vcENvbnRyb2wodmFsdWUpOworfQorCisKK2Jvb2wgZ2V0Q2xvc2VkTG9vcENvbnRyb2wodm9pZCAqcGNtX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cykgeworCVBDTSAqbW9kdWxlID0gKFBDTSAqKXBjbV9wb2ludGVyOworCWJvb2wgdmFsdWU7CisJCisJKnN0YXR1cyA9IG1vZHVsZS0+R2V0Q2xvc2VkTG9vcENvbnRyb2wodmFsdWUpOworCQorCXJldHVybiB2YWx1ZTsKK30KKworCitib29sIGdldFByZXNzdXJlU3dpdGNoKHZvaWQgKnBjbV9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKwlQQ00gKm1vZHVsZSA9IChQQ00gKilwY21fcG9pbnRlcjsKKwlib29sIHZhbHVlOworCQorCSpzdGF0dXMgPSBtb2R1bGUtPkdldFByZXNzdXJlKHZhbHVlKTsKKwkKKwlyZXR1cm4gdmFsdWU7Cit9CisKKworZmxvYXQgZ2V0Q29tcHJlc3NvckN1cnJlbnQodm9pZCAqcGNtX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cykgeworCVBDTSAqbW9kdWxlID0gKFBDTSAqKXBjbV9wb2ludGVyOworCWZsb2F0IHZhbHVlOworCQorCSpzdGF0dXMgPSBtb2R1bGUtPkdldENvbXByZXNzb3JDdXJyZW50KHZhbHVlKTsKKwkKKwlyZXR1cm4gdmFsdWU7Cit9Citib29sIGdldENvbXByZXNzb3JDdXJyZW50VG9vSGlnaEZhdWx0KHZvaWQgKnBjbV9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKwlQQ00gKm1vZHVsZSA9IChQQ00gKilwY21fcG9pbnRlcjsKKwlib29sIHZhbHVlOworCQorCSpzdGF0dXMgPSBtb2R1bGUtPkdldENvbXByZXNzb3JDdXJyZW50VG9vSGlnaEZhdWx0KHZhbHVlKTsKKwkKKwlyZXR1cm4gdmFsdWU7Cit9Citib29sIGdldENvbXByZXNzb3JDdXJyZW50VG9vSGlnaFN0aWNreUZhdWx0KHZvaWQgKnBjbV9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKwlQQ00gKm1vZHVsZSA9IChQQ00gKilwY21fcG9pbnRlcjsKKwlib29sIHZhbHVlOworCQorCSpzdGF0dXMgPSBtb2R1bGUtPkdldENvbXByZXNzb3JDdXJyZW50VG9vSGlnaFN0aWNreUZhdWx0KHZhbHVlKTsKKwkKKwlyZXR1cm4gdmFsdWU7Cit9Citib29sIGdldENvbXByZXNzb3JTaG9ydGVkU3RpY2t5RmF1bHQodm9pZCAqcGNtX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cykgeworCVBDTSAqbW9kdWxlID0gKFBDTSAqKXBjbV9wb2ludGVyOworCWJvb2wgdmFsdWU7CisJCisJKnN0YXR1cyA9IG1vZHVsZS0+R2V0Q29tcHJlc3NvclNob3J0ZWRTdGlja3lGYXVsdCh2YWx1ZSk7CisJCisJcmV0dXJuIHZhbHVlOworfQorYm9vbCBnZXRDb21wcmVzc29yU2hvcnRlZEZhdWx0KHZvaWQgKnBjbV9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKwlQQ00gKm1vZHVsZSA9IChQQ00gKilwY21fcG9pbnRlcjsKKwlib29sIHZhbHVlOworCQorCSpzdGF0dXMgPSBtb2R1bGUtPkdldENvbXByZXNzb3JTaG9ydGVkRmF1bHQodmFsdWUpOworCQorCXJldHVybiB2YWx1ZTsKK30KK2Jvb2wgZ2V0Q29tcHJlc3Nvck5vdENvbm5lY3RlZFN0aWNreUZhdWx0KHZvaWQgKnBjbV9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKwlQQ00gKm1vZHVsZSA9IChQQ00gKilwY21fcG9pbnRlcjsKKwlib29sIHZhbHVlOworCQorCSpzdGF0dXMgPSBtb2R1bGUtPkdldENvbXByZXNzb3JOb3RDb25uZWN0ZWRTdGlja3lGYXVsdCh2YWx1ZSk7CisJCisJcmV0dXJuIHZhbHVlOworfQorYm9vbCBnZXRDb21wcmVzc29yTm90Q29ubmVjdGVkRmF1bHQodm9pZCAqcGNtX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cykgeworCVBDTSAqbW9kdWxlID0gKFBDTSAqKXBjbV9wb2ludGVyOworCWJvb2wgdmFsdWU7CisJCisJKnN0YXR1cyA9IG1vZHVsZS0+R2V0Q29tcHJlc3Nvck5vdENvbm5lY3RlZEZhdWx0KHZhbHVlKTsKKwkKKwlyZXR1cm4gdmFsdWU7Cit9Cit2b2lkIGNsZWFyQWxsUENNU3RpY2t5RmF1bHRzKHZvaWQgKnBjbV9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKwlQQ00gKm1vZHVsZSA9IChQQ00gKilwY21fcG9pbnRlcjsKKwkKKwkqc3RhdHVzID0gbW9kdWxlLT5DbGVhclN0aWNreUZhdWx0cygpOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRGlnaXRhbC5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9EaWdpdGFsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDY5ODNmCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRGlnaXRhbC5jcHAKQEAgLTAsMCArMSwxNTUzIEBACisKKyNpbmNsdWRlICJIQUwvRGlnaXRhbC5ocHAiCisKKyNpbmNsdWRlICJQb3J0LmgiCisjaW5jbHVkZSAiSEFML0hBTC5ocHAiCisjaW5jbHVkZSAiQ2hpcE9iamVjdC5oIgorI2luY2x1ZGUgIkhBTC9jcHAvU3luY2hyb25pemVkLmhwcCIKKyNpbmNsdWRlICJIQUwvY3BwL1Jlc291cmNlLmhwcCIKKyNpbmNsdWRlICJOZXR3b3JrQ29tbXVuaWNhdGlvbi9Mb2FkT3V0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAiaTJjbGliL2kyYy1saWIuaCIKKyNpbmNsdWRlICJzcGlsaWIvc3BpLWxpYi5oIgorCitzdGF0aWMgY29uc3QgdWludDMyX3Qga0V4cGVjdGVkTG9vcFRpbWluZyA9IDQwOworc3RhdGljIGNvbnN0IHVpbnQzMl90IGtEaWdpdGFsUGlucyA9IDI2Oworc3RhdGljIGNvbnN0IHVpbnQzMl90IGtQd21QaW5zID0gMjA7CitzdGF0aWMgY29uc3QgdWludDMyX3Qga1JlbGF5UGlucyA9IDg7CitzdGF0aWMgY29uc3QgdWludDMyX3Qga051bUhlYWRlcnMgPSAxMDsgLy8gTnVtYmVyIG9mIG5vbi1NWFAgcGlucworCitSZWVudHJhbnRNdXRleCYgc3BpR2V0U2VtYXBob3JlKHVpbnQ4X3QgcG9ydCk7CisKKy8qKgorICoga0RlZmF1bHRQd21QZXJpb2QgaXMgaW4gbXMKKyAqCisgKiAtIDIwbXMgcGVyaW9kcyAoNTAgSHopIGFyZSB0aGUgInNhZmVzdCIgc2V0dGluZyBpbiB0aGF0IHRoaXMgd29ya3MgZm9yIGFsbCBkZXZpY2VzCisgKiAtIDIwbXMgcGVyaW9kcyBzZWVtIHRvIGJlIGRlc2lyYWJsZSBmb3IgVmV4IE1vdG9ycworICogLSAyMG1zIHBlcmlvZHMgYXJlIHRoZSBzcGVjaWZpZWQgcGVyaW9kIGZvciBIUy0zMjJIRCBzZXJ2b3MsIGJ1dCB3b3JrIHJlbGlhYmx5IGRvd24KKyAqICAgICAgdG8gMTAuMCBtczsgc3RhcnRpbmcgYXQgYWJvdXQgOC41bXMsIHRoZSBzZXJ2byBzb21ldGltZXMgaHVtcyBhbmQgZ2V0IGhvdDsKKyAqICAgICAgYnkgNS4wbXMgdGhlIGh1bSBpcyBuZWFybHkgY29udGludW91cworICogLSAxMG1zIHBlcmlvZHMgd29yayB3ZWxsIGZvciBWaWN0b3IgODg0CisgKiAtIDVtcyBwZXJpb2RzIGFsbG93cyBoaWdoZXIgdXBkYXRlIHJhdGVzIGZvciBMdW1pbmFyeSBNaWNybyBKYWd1YXIgc3BlZWQgY29udHJvbGxlcnMuCisgKiAgICAgIER1ZSB0byB0aGUgc2hpcHBpbmcgZmlybXdhcmUgb24gdGhlIEphZ3Vhciwgd2UgY2FuJ3QgcnVuIHRoZSB1cGRhdGUgcGVyaW9kIGxlc3MKKyAqICAgICAgdGhhbiA1LjA1IG1zLgorICoKKyAqIGtEZWZhdWx0UHdtUGVyaW9kIGlzIHRoZSAxeCBwZXJpb2QgKDUuMDUgbXMpLiAgSW4gaGFyZHdhcmUsIHRoZSBwZXJpb2Qgc2NhbGluZyBpcyBpbXBsZW1lbnRlZCBhcyBhbgorICogb3V0cHV0IHNxdWVsY2ggdG8gZ2V0IGxvbmdlciBwZXJpb2RzIGZvciBvbGQgZGV2aWNlcy4KKyAqLworc3RhdGljIGNvbnN0IGZsb2F0IGtEZWZhdWx0UHdtUGVyaW9kID0gNS4wNTsKKy8qKgorICoga0RlZmF1bHRQd21DZW50ZXIgaXMgdGhlIFBXTSByYW5nZSBjZW50ZXIgaW4gbXMKKyAqLworc3RhdGljIGNvbnN0IGZsb2F0IGtEZWZhdWx0UHdtQ2VudGVyID0gMS41OworLyoqCisgKiBrRGVmYXVsdFBXTVN0ZXBzRG93biBpcyB0aGUgbnVtYmVyIG9mIFBXTSBzdGVwcyBiZWxvdyB0aGUgY2VudGVycG9pbnQKKyAqLworc3RhdGljIGNvbnN0IGludDMyX3Qga0RlZmF1bHRQd21TdGVwc0Rvd24gPSAxMDAwOworc3RhdGljIGNvbnN0IGludDMyX3Qga1B3bURpc2FibGVkID0gMDsKKworc3RydWN0IERpZ2l0YWxQb3J0IHsKKyAgUG9ydCBwb3J0OworICB1aW50MzJfdCBQV01HZW5lcmF0b3JJRDsKK307CisKKy8vIFhYWDogU2V0IHRoZXNlIGJhY2sgdG8gc3RhdGljIG9uY2Ugd2UgZmlndXJlIG91dCB0aGUgbWVtb3J5IGNsb2JiZXJpbmcgaXNzdWUKKy8vIENyZWF0ZSBhIHNlbWFwaG9yZSB0byBwcm90ZWN0IGNoYW5nZXMgdG8gdGhlIGRpZ2l0YWwgb3V0cHV0IHZhbHVlcworUmVlbnRyYW50TXV0ZXggZGlnaXRhbERJT1NlbWFwaG9yZTsKKy8vIENyZWF0ZSBhIHNlbWFwaG9yZSB0byBwcm90ZWN0IGNoYW5nZXMgdG8gdGhlIHJlbGF5IHZhbHVlcworUmVlbnRyYW50TXV0ZXggZGlnaXRhbFJlbGF5U2VtYXBob3JlOworLy8gQ3JlYXRlIGEgc2VtYXBob3JlIHRvIHByb3RlY3QgY2hhbmdlcyB0byB0aGUgRE8gUFdNIGNvbmZpZworUmVlbnRyYW50TXV0ZXggZGlnaXRhbFB3bVNlbWFwaG9yZTsKK1JlZW50cmFudE11dGV4IGRpZ2l0YWxJMkNPbkJvYXJkU2VtYXBob3JlOworUmVlbnRyYW50TXV0ZXggZGlnaXRhbEkyQ01YUFNlbWFwaG9yZTsKKwordERJTyogZGlnaXRhbFN5c3RlbSA9IE5VTEw7Cit0UmVsYXkqIHJlbGF5U3lzdGVtID0gTlVMTDsKK3RQV00qIHB3bVN5c3RlbSA9IE5VTEw7CitSZXNvdXJjZSAqRElPQ2hhbm5lbHMgPSBOVUxMOworUmVzb3VyY2UgKkRPX1BXTUdlbmVyYXRvcnMgPSBOVUxMOworUmVzb3VyY2UgKlBXTUNoYW5uZWxzID0gTlVMTDsKKworYm9vbCBkaWdpdGFsU3lzdGVtc0luaXRpYWxpemVkID0gZmFsc2U7CisKK3VpbnQ4X3QgaTJDT25ib2FyZE9iakNvdW50ID0gMDsKK3VpbnQ4X3QgaTJDTVhQT2JqQ291bnQgPSAwOwordWludDhfdCBpMkNPbkJvYXJkSGFuZGxlID0gMDsKK3VpbnQ4X3QgaTJDTVhQSGFuZGxlID0gMDsKKworaW50MzJfdCBtX3NwaUNTMEhhbmRsZSA9IDA7CitpbnQzMl90IG1fc3BpQ1MxSGFuZGxlID0gMDsKK2ludDMyX3QgbV9zcGlDUzJIYW5kbGUgPSAwOworaW50MzJfdCBtX3NwaUNTM0hhbmRsZSA9IDA7CitpbnQzMl90IG1fc3BpTVhQSGFuZGxlID0gMDsKK1JlZW50cmFudE11dGV4IHNwaU9uYm9hcmRTZW1hcGhvcmU7CitSZWVudHJhbnRNdXRleCBzcGlNWFBTZW1hcGhvcmU7Cit0U1BJICpzcGlTeXN0ZW07CisKKy8qKgorICogSW5pdGlhbGl6ZSB0aGUgZGlnaXRhbCBzeXN0ZW0uCisgKi8KK3ZvaWQgaW5pdGlhbGl6ZURpZ2l0YWwoaW50MzJfdCAqc3RhdHVzKSB7CisgIGlmIChkaWdpdGFsU3lzdGVtc0luaXRpYWxpemVkKSByZXR1cm47CisKKyAgUmVzb3VyY2U6OkNyZWF0ZVJlc291cmNlT2JqZWN0KCZESU9DaGFubmVscywgdERJTzo6a051bVN5c3RlbXMgKiBrRGlnaXRhbFBpbnMpOworICBSZXNvdXJjZTo6Q3JlYXRlUmVzb3VyY2VPYmplY3QoJkRPX1BXTUdlbmVyYXRvcnMsIHRESU86OmtOdW1QV01EdXR5Q3ljbGVBRWxlbWVudHMgKyB0RElPOjprTnVtUFdNRHV0eUN5Y2xlQkVsZW1lbnRzKTsKKyAgUmVzb3VyY2U6OkNyZWF0ZVJlc291cmNlT2JqZWN0KCZQV01DaGFubmVscywgdFBXTTo6a051bVN5c3RlbXMgKiBrUHdtUGlucyk7CisgIGRpZ2l0YWxTeXN0ZW0gPSB0RElPOjpjcmVhdGUoc3RhdHVzKTsKKworICAvLyBSZWxheSBTZXR1cAorICByZWxheVN5c3RlbSA9IHRSZWxheTo6Y3JlYXRlKHN0YXR1cyk7CisKKyAgLy8gVHVybiBvZmYgYWxsIHJlbGF5IG91dHB1dHMuCisgIHJlbGF5U3lzdGVtLT53cml0ZVZhbHVlX0ZvcndhcmQoMCwgc3RhdHVzKTsKKyAgcmVsYXlTeXN0ZW0tPndyaXRlVmFsdWVfUmV2ZXJzZSgwLCBzdGF0dXMpOworCisgIC8vIFBXTSBTZXR1cAorICBwd21TeXN0ZW0gPSB0UFdNOjpjcmVhdGUoc3RhdHVzKTsKKworICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgOTQwMyBJT05vZGUgaGFzIGhhZCBhIGNoYW5jZSB0byBpbml0aWFsaXplIGJlZm9yZSBjb250aW51aW5nLgorICB3aGlsZShwd21TeXN0ZW0tPnJlYWRMb29wVGltaW5nKHN0YXR1cykgPT0gMCkgZGVsYXlUaWNrcygxKTsKKworICBpZiAocHdtU3lzdGVtLT5yZWFkTG9vcFRpbWluZyhzdGF0dXMpICE9IGtFeHBlY3RlZExvb3BUaW1pbmcpIHsKKwkvLyBUT0RPOiBjaGFyIGVyclsxMjhdOworCS8vIFRPRE86IHNwcmludGYoZXJyLCAiRElPIExvb3BUaW1pbmc6ICVkLCBleHBlY3Rpbmc6ICVsdVxuIiwgZGlnaXRhbE1vZHVsZXNbcG9ydC0+bW9kdWxlLTFdLT5yZWFkTG9vcFRpbWluZyhzdGF0dXMpLCBrRXhwZWN0ZWRMb29wVGltaW5nKTsKKwkqc3RhdHVzID0gTE9PUF9USU1JTkdfRVJST1I7IC8vIE5PVEU6IERvZXNuJ3QgZGlzcGxheSB0aGUgZXJyb3IKKyAgfQorCisgIC8vQ2FsY3VsYXRlIHRoZSBsZW5ndGgsIGluIG1zLCBvZiBvbmUgRElPIGxvb3AKKyAgZG91YmxlIGxvb3BUaW1lID0gcHdtU3lzdGVtLT5yZWFkTG9vcFRpbWluZyhzdGF0dXMpLyhrU3lzdGVtQ2xvY2tUaWNrc1Blck1pY3Jvc2Vjb25kKjFlMyk7CisKKyAgcHdtU3lzdGVtLT53cml0ZUNvbmZpZ19QZXJpb2QoKHVpbnQxNl90KSAoa0RlZmF1bHRQd21QZXJpb2QvbG9vcFRpbWUgKyAuNSksIHN0YXR1cyk7CisgIHVpbnQxNl90IG1pbkhpZ2ggPSAodWludDE2X3QpICgoa0RlZmF1bHRQd21DZW50ZXIta0RlZmF1bHRQd21TdGVwc0Rvd24qbG9vcFRpbWUpL2xvb3BUaW1lICsgLjUpOworICBwd21TeXN0ZW0tPndyaXRlQ29uZmlnX01pbkhpZ2gobWluSGlnaCwgc3RhdHVzKTsKKy8vICBwcmludGYoIk1pbkhpZ2g6ICVkXG4iLCBtaW5IaWdoKTsKKyAgLy8gRW5zdXJlIHRoYXQgUFdNIG91dHB1dCB2YWx1ZXMgYXJlIHNldCB0byBPRkYKKyAgZm9yICh1aW50MzJfdCBwd21faW5kZXggPSAwOyBwd21faW5kZXggPCBrUHdtUGluczsgcHdtX2luZGV4KyspIHsKKyAgICAvLyBJbml0aWFsaXplIHBvcnQgc3RydWN0dXJlCisgICAgRGlnaXRhbFBvcnQqIGRpZ2l0YWxfcG9ydCA9IG5ldyBEaWdpdGFsUG9ydCgpOworICAgIGRpZ2l0YWxfcG9ydC0+cG9ydC5waW4gPSBwd21faW5kZXg7CisKKyAgICBzZXRQV00oZGlnaXRhbF9wb3J0LCBrUHdtRGlzYWJsZWQsIHN0YXR1cyk7CisgICAgc2V0UFdNUGVyaW9kU2NhbGUoZGlnaXRhbF9wb3J0LCAzLCBzdGF0dXMpOyAvLyBTZXQgYWxsIHRvIDR4IGJ5IGRlZmF1bHQuCisgIH0KKworICBkaWdpdGFsU3lzdGVtc0luaXRpYWxpemVkID0gdHJ1ZTsKK30KKworLyoqCisgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgYSBkaWdpdGFsIHBvcnQuCisgKi8KK3ZvaWQqIGluaXRpYWxpemVEaWdpdGFsUG9ydCh2b2lkKiBwb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cykgeworICBpbml0aWFsaXplRGlnaXRhbChzdGF0dXMpOworICBQb3J0KiBwb3J0ID0gKFBvcnQqKSBwb3J0X3BvaW50ZXI7CisKKyAgLy8gSW5pdGlhbGl6ZSBwb3J0IHN0cnVjdHVyZQorICBEaWdpdGFsUG9ydCogZGlnaXRhbF9wb3J0ID0gbmV3IERpZ2l0YWxQb3J0KCk7CisgIGRpZ2l0YWxfcG9ydC0+cG9ydCA9ICpwb3J0OworCisgIHJldHVybiBkaWdpdGFsX3BvcnQ7Cit9CisKK2Jvb2wgY2hlY2tQV01DaGFubmVsKHZvaWQqIGRpZ2l0YWxfcG9ydF9wb2ludGVyKSB7CisgIERpZ2l0YWxQb3J0KiBwb3J0ID0gKERpZ2l0YWxQb3J0KikgZGlnaXRhbF9wb3J0X3BvaW50ZXI7CisgIHJldHVybiBwb3J0LT5wb3J0LnBpbiA8IGtQd21QaW5zOworfQorCitib29sIGNoZWNrUmVsYXlDaGFubmVsKHZvaWQqIGRpZ2l0YWxfcG9ydF9wb2ludGVyKSB7CisgIERpZ2l0YWxQb3J0KiBwb3J0ID0gKERpZ2l0YWxQb3J0KikgZGlnaXRhbF9wb3J0X3BvaW50ZXI7CisgIHJldHVybiBwb3J0LT5wb3J0LnBpbiA8IGtSZWxheVBpbnM7Cit9CisKKy8qKgorICogTWFwIERJTyBwaW4gbnVtYmVycyBmcm9tIHRoZWlyIHBoeXNpY2FsIG51bWJlciAoMTAgdG8gMjYpIHRvIHRoZWlyIHBvc2l0aW9uCisgKiBpbiB0aGUgYml0IGZpZWxkLgorICovCit1aW50MzJfdCByZW1hcE1YUENoYW5uZWwodWludDMyX3QgcGluKSB7CisgICAgcmV0dXJuIHBpbiAtIDEwOworfQorCit1aW50MzJfdCByZW1hcE1YUFBXTUNoYW5uZWwodWludDMyX3QgcGluKSB7CisJaWYocGluIDwgMTQpIHsKKwkJcmV0dXJuIHBpbiAtIDEwOwkvL2ZpcnN0IGJsb2NrIG9mIDQgcHdtcyAoTVhQIDAtMykKKwl9IGVsc2UgeworCQlyZXR1cm4gcGluIC0gNjsJLy9ibG9jayBvZiBQV01zIGFmdGVyIFNQSQorCX0KK30KKworLyoqCisgKiBTZXQgYSBQV00gY2hhbm5lbCB0byB0aGUgZGVzaXJlZCB2YWx1ZS4gVGhlIHZhbHVlcyByYW5nZSBmcm9tIDAgdG8gMjU1IGFuZCB0aGUgcGVyaW9kIGlzIGNvbnRyb2xsZWQKKyAqIGJ5IHRoZSBQV00gUGVyaW9kIGFuZCBNaW5IaWdoIHJlZ2lzdGVycy4KKyAqCisgKiBAcGFyYW0gY2hhbm5lbCBUaGUgUFdNIGNoYW5uZWwgdG8gc2V0LgorICogQHBhcmFtIHZhbHVlIFRoZSBQV00gdmFsdWUgdG8gc2V0LgorICovCit2b2lkIHNldFBXTSh2b2lkKiBkaWdpdGFsX3BvcnRfcG9pbnRlciwgdW5zaWduZWQgc2hvcnQgdmFsdWUsIGludDMyX3QgKnN0YXR1cykgeworICBEaWdpdGFsUG9ydCogcG9ydCA9IChEaWdpdGFsUG9ydCopIGRpZ2l0YWxfcG9ydF9wb2ludGVyOworICBjaGVja1BXTUNoYW5uZWwocG9ydCk7CisKKyAgaWYocG9ydC0+cG9ydC5waW4gPCB0UFdNOjprTnVtSGRyUmVnaXN0ZXJzKSB7CisgICAgcHdtU3lzdGVtLT53cml0ZUhkcihwb3J0LT5wb3J0LnBpbiwgdmFsdWUsIHN0YXR1cyk7CisgIH0gZWxzZSB7CisgICAgcHdtU3lzdGVtLT53cml0ZU1YUChwb3J0LT5wb3J0LnBpbiAtIHRQV006OmtOdW1IZHJSZWdpc3RlcnMsIHZhbHVlLCBzdGF0dXMpOworICB9Cit9CisKKy8qKgorICogR2V0IGEgdmFsdWUgZnJvbSBhIFBXTSBjaGFubmVsLiBUaGUgdmFsdWVzIHJhbmdlIGZyb20gMCB0byAyNTUuCisgKgorICogQHBhcmFtIGNoYW5uZWwgVGhlIFBXTSBjaGFubmVsIHRvIHJlYWQgZnJvbS4KKyAqIEByZXR1cm4gVGhlIHJhdyBQV00gdmFsdWUuCisgKi8KK3Vuc2lnbmVkIHNob3J0IGdldFBXTSh2b2lkKiBkaWdpdGFsX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisgIERpZ2l0YWxQb3J0KiBwb3J0ID0gKERpZ2l0YWxQb3J0KikgZGlnaXRhbF9wb3J0X3BvaW50ZXI7CisgIGNoZWNrUFdNQ2hhbm5lbChwb3J0KTsKKworICBpZihwb3J0LT5wb3J0LnBpbiA8IHRQV006OmtOdW1IZHJSZWdpc3RlcnMpIHsKKyAgICByZXR1cm4gcHdtU3lzdGVtLT5yZWFkSGRyKHBvcnQtPnBvcnQucGluLCBzdGF0dXMpOworICB9IGVsc2UgeworICAgIHJldHVybiBwd21TeXN0ZW0tPnJlYWRNWFAocG9ydC0+cG9ydC5waW4gLSB0UFdNOjprTnVtSGRyUmVnaXN0ZXJzLCBzdGF0dXMpOworICB9Cit9CisKK3ZvaWQgbGF0Y2hQV01aZXJvKHZvaWQqIGRpZ2l0YWxfcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKwlEaWdpdGFsUG9ydCogcG9ydCA9IChEaWdpdGFsUG9ydCopIGRpZ2l0YWxfcG9ydF9wb2ludGVyOworCXB3bVN5c3RlbS0+d3JpdGVaZXJvTGF0Y2gocG9ydC0+cG9ydC5waW4sIHRydWUsIHN0YXR1cyk7CisJcHdtU3lzdGVtLT53cml0ZVplcm9MYXRjaChwb3J0LT5wb3J0LnBpbiwgZmFsc2UsIHN0YXR1cyk7Cit9CisKKy8qKgorICogU2V0IGhvdyBob3cgb2Z0ZW4gdGhlIFBXTSBzaWduYWwgaXMgc3F1ZWxjaGVkLCB0aHVzIHNjYWxpbmcgdGhlIHBlcmlvZC4KKyAqCisgKiBAcGFyYW0gY2hhbm5lbCBUaGUgUFdNIGNoYW5uZWwgdG8gY29uZmlndXJlLgorICogQHBhcmFtIHNxdWVsY2hNYXNrIFRoZSAyLWJpdCBtYXNrIG9mIG91dHB1dHMgdG8gc3F1ZWxjaC4KKyAqLwordm9pZCBzZXRQV01QZXJpb2RTY2FsZSh2b2lkKiBkaWdpdGFsX3BvcnRfcG9pbnRlciwgdWludDMyX3Qgc3F1ZWxjaE1hc2ssIGludDMyX3QgKnN0YXR1cykgeworICBEaWdpdGFsUG9ydCogcG9ydCA9IChEaWdpdGFsUG9ydCopIGRpZ2l0YWxfcG9ydF9wb2ludGVyOworICBjaGVja1BXTUNoYW5uZWwocG9ydCk7CisKKyAgaWYocG9ydC0+cG9ydC5waW4gPCB0UFdNOjprTnVtUGVyaW9kU2NhbGVIZHJFbGVtZW50cykgeworICAgIHB3bVN5c3RlbS0+d3JpdGVQZXJpb2RTY2FsZUhkcihwb3J0LT5wb3J0LnBpbiwgc3F1ZWxjaE1hc2ssIHN0YXR1cyk7CisgIH0gZWxzZSB7CisgICAgcHdtU3lzdGVtLT53cml0ZVBlcmlvZFNjYWxlTVhQKHBvcnQtPnBvcnQucGluIC0gdFBXTTo6a051bVBlcmlvZFNjYWxlSGRyRWxlbWVudHMsIHNxdWVsY2hNYXNrLCBzdGF0dXMpOworICB9Cit9CisKKy8qKgorICogQWxsb2NhdGUgYSBETyBQV00gR2VuZXJhdG9yLgorICogQWxsb2NhdGUgUFdNIGdlbmVyYXRvcnMgc28gdGhhdCB0aGV5IGFyZSBub3QgYWNjaWRlbnRhbGx5IHJldXNlZC4KKyAqCisgKiBAcmV0dXJuIFBXTSBHZW5lcmF0b3IgcmVmbnVtCisgKi8KK3ZvaWQqIGFsbG9jYXRlUFdNKGludDMyX3QgKnN0YXR1cykgeworICByZXR1cm4gKHZvaWQqKURPX1BXTUdlbmVyYXRvcnMtPkFsbG9jYXRlKCJET19QV00iKTsKK30KKworLyoqCisgKiBGcmVlIHRoZSByZXNvdXJjZSBhc3NvY2lhdGVkIHdpdGggYSBETyBQV00gZ2VuZXJhdG9yLgorICoKKyAqIEBwYXJhbSBwd21HZW5lcmF0b3IgVGhlIHB3bUdlbiB0byBmcmVlIHRoYXQgd2FzIGFsbG9jYXRlZCB3aXRoIEFsbG9jYXRlRE9fUFdNKCkKKyAqLwordm9pZCBmcmVlUFdNKHZvaWQqIHB3bUdlbmVyYXRvciwgaW50MzJfdCAqc3RhdHVzKSB7CisgIHVpbnQzMl90IGlkID0gKHVpbnQzMl90KSBwd21HZW5lcmF0b3I7CisgIGlmIChpZCA9PSB+MHVsKSByZXR1cm47CisgIERPX1BXTUdlbmVyYXRvcnMtPkZyZWUoaWQpOworfQorCisvKioKKyAqIENoYW5nZSB0aGUgZnJlcXVlbmN5IG9mIHRoZSBETyBQV00gZ2VuZXJhdG9yLgorICoKKyAqIFRoZSB2YWxpZCByYW5nZSBpcyBmcm9tIDAuNiBIeiB0byAxOSBrSHouICBUaGUgZnJlcXVlbmN5IHJlc29sdXRpb24gaXMgbG9nYXJpdGhtaWMuCisgKgorICogQHBhcmFtIHJhdGUgVGhlIGZyZXF1ZW5jeSB0byBvdXRwdXQgYWxsIGRpZ2l0YWwgb3V0cHV0IFBXTSBzaWduYWxzLgorICovCit2b2lkIHNldFBXTVJhdGUoZG91YmxlIHJhdGUsIGludDMyX3QgKnN0YXR1cykgeworICAvLyBDdXJyZW50bHkgcm91bmRpbmcgaW4gdGhlIGxvZyByYXRlIGRvbWFpbi4uLiBoZWF2eSB3ZWlnaHQgdG93YXJkIHBpY2tpbmcgYSBoaWdoZXIgZnJlcS4KKyAgLy8gVE9ETzogUm91bmQgaW4gdGhlIGxpbmVhciByYXRlIGRvbWFpbi4KKyAgdWludDhfdCBwd21QZXJpb2RQb3dlciA9ICh1aW50OF90KShsb2coMS4wIC8gKHB3bVN5c3RlbS0+cmVhZExvb3BUaW1pbmcoc3RhdHVzKSAqIDAuMjVFLTYgKiByYXRlKSkvbG9nKDIuMCkgKyAwLjUpOworICBkaWdpdGFsU3lzdGVtLT53cml0ZVBXTVBlcmlvZFBvd2VyKHB3bVBlcmlvZFBvd2VyLCBzdGF0dXMpOworfQorCisKKy8qKgorICogQ29uZmlndXJlIHRoZSBkdXR5LWN5Y2xlIG9mIHRoZSBQV00gZ2VuZXJhdG9yCisgKgorICogQHBhcmFtIHB3bUdlbmVyYXRvciBUaGUgZ2VuZXJhdG9yIGluZGV4IHJlc2VydmVkIGJ5IEFsbG9jYXRlRE9fUFdNKCkKKyAqIEBwYXJhbSBkdXR5Q3ljbGUgVGhlIHBlcmNlbnQgZHV0eSBjeWNsZSB0byBvdXRwdXQgWzAuLjFdLgorICovCit2b2lkIHNldFBXTUR1dHlDeWNsZSh2b2lkKiBwd21HZW5lcmF0b3IsIGRvdWJsZSBkdXR5Q3ljbGUsIGludDMyX3QgKnN0YXR1cykgeworICB1aW50MzJfdCBpZCA9ICh1aW50MzJfdCkgcHdtR2VuZXJhdG9yOworICBpZiAoaWQgPT0gfjB1bCkgcmV0dXJuOworICBpZiAoZHV0eUN5Y2xlID4gMS4wKSBkdXR5Q3ljbGUgPSAxLjA7CisgIGlmIChkdXR5Q3ljbGUgPCAwLjApIGR1dHlDeWNsZSA9IDAuMDsKKyAgZmxvYXQgcmF3RHV0eUN5Y2xlID0gMjU2LjAgKiBkdXR5Q3ljbGU7CisgIGlmIChyYXdEdXR5Q3ljbGUgPiAyNTUuNSkgcmF3RHV0eUN5Y2xlID0gMjU1LjU7CisgIHsKKyAgICA6OnN0ZDo6dW5pcXVlX2xvY2s8UmVlbnRyYW50TXV0ZXg+IHN5bmMoZGlnaXRhbFB3bVNlbWFwaG9yZSk7CisgICAgdWludDhfdCBwd21QZXJpb2RQb3dlciA9IGRpZ2l0YWxTeXN0ZW0tPnJlYWRQV01QZXJpb2RQb3dlcihzdGF0dXMpOworICAgIGlmIChwd21QZXJpb2RQb3dlciA8IDQpIHsKKwkgIC8vIFRoZSByZXNvbHV0aW9uIG9mIHRoZSBkdXR5IGN5Y2xlIGRyb3BzIGNsb3NlIHRvIHRoZSBoaWdoZXN0IGZyZXF1ZW5jaWVzLgorCSAgcmF3RHV0eUN5Y2xlID0gcmF3RHV0eUN5Y2xlIC8gcG93KDIuMCwgNCAtIHB3bVBlcmlvZFBvd2VyKTsKKwl9CisJaWYoaWQgPCA0KQorCQlkaWdpdGFsU3lzdGVtLT53cml0ZVBXTUR1dHlDeWNsZUEoaWQsICh1aW50OF90KXJhd0R1dHlDeWNsZSwgc3RhdHVzKTsKKwllbHNlIAorCQlkaWdpdGFsU3lzdGVtLT53cml0ZVBXTUR1dHlDeWNsZUIoaWQgLSA0LCAodWludDhfdClyYXdEdXR5Q3ljbGUsIHN0YXR1cyk7CisgIH0KK30KKworLyoqCisgKiBDb25maWd1cmUgd2hpY2ggRE8gY2hhbm5lbCB0aGUgUFdNIHNpZ25hbCBpcyBvdXRwdXQgb24KKyAqCisgKiBAcGFyYW0gcHdtR2VuZXJhdG9yIFRoZSBnZW5lcmF0b3IgaW5kZXggcmVzZXJ2ZWQgYnkgQWxsb2NhdGVET19QV00oKQorICogQHBhcmFtIGNoYW5uZWwgVGhlIERpZ2l0YWwgT3V0cHV0IGNoYW5uZWwgdG8gb3V0cHV0IG9uCisgKi8KK3ZvaWQgc2V0UFdNT3V0cHV0Q2hhbm5lbCh2b2lkKiBwd21HZW5lcmF0b3IsIHVpbnQzMl90IHBpbiwgaW50MzJfdCAqc3RhdHVzKSB7CisgIHVpbnQzMl90IGlkID0gKHVpbnQzMl90KSBwd21HZW5lcmF0b3I7CisgIGlmIChpZCA+IDUpIHJldHVybjsKKyAgZGlnaXRhbFN5c3RlbS0+d3JpdGVQV01PdXRwdXRTZWxlY3QoaWQsIHBpbiwgc3RhdHVzKTsKK30KKworLyoqCisgKiBTZXQgdGhlIHN0YXRlIG9mIGEgcmVsYXkuCisgKiBTZXQgdGhlIHN0YXRlIG9mIGEgcmVsYXkgb3V0cHV0IHRvIGJlIGZvcndhcmQuIFJlbGF5cyBoYXZlIHR3byBvdXRwdXRzIGFuZCBlYWNoIGlzCisgKiBpbmRlcGVuZGVudGx5IHNldCB0byAwdiBvciAxMnYuCisgKi8KK3ZvaWQgc2V0UmVsYXlGb3J3YXJkKHZvaWQqIGRpZ2l0YWxfcG9ydF9wb2ludGVyLCBib29sIG9uLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgRGlnaXRhbFBvcnQqIHBvcnQgPSAoRGlnaXRhbFBvcnQqKSBkaWdpdGFsX3BvcnRfcG9pbnRlcjsKKyAgY2hlY2tSZWxheUNoYW5uZWwocG9ydCk7CisgIHsKKyAgICA6OnN0ZDo6dW5pcXVlX2xvY2s8UmVlbnRyYW50TXV0ZXg+IHN5bmMoZGlnaXRhbFJlbGF5U2VtYXBob3JlKTsKKyAgICB1aW50OF90IGZvcndhcmRSZWxheXMgPSByZWxheVN5c3RlbS0+cmVhZFZhbHVlX0ZvcndhcmQoc3RhdHVzKTsKKyAgICBpZiAob24pCisgICAgICBmb3J3YXJkUmVsYXlzIHw9IDEgPDwgcG9ydC0+cG9ydC5waW47CisgICAgZWxzZQorICAgICAgZm9yd2FyZFJlbGF5cyAmPSB+KDEgPDwgcG9ydC0+cG9ydC5waW4pOworICAgIHJlbGF5U3lzdGVtLT53cml0ZVZhbHVlX0ZvcndhcmQoZm9yd2FyZFJlbGF5cywgc3RhdHVzKTsKKyAgfQorfQorCisvKioKKyAqIFNldCB0aGUgc3RhdGUgb2YgYSByZWxheS4KKyAqIFNldCB0aGUgc3RhdGUgb2YgYSByZWxheSBvdXRwdXQgdG8gYmUgcmV2ZXJzZS4gUmVsYXlzIGhhdmUgdHdvIG91dHB1dHMgYW5kIGVhY2ggaXMKKyAqIGluZGVwZW5kZW50bHkgc2V0IHRvIDB2IG9yIDEydi4KKyAqLwordm9pZCBzZXRSZWxheVJldmVyc2Uodm9pZCogZGlnaXRhbF9wb3J0X3BvaW50ZXIsIGJvb2wgb24sIGludDMyX3QgKnN0YXR1cykgeworICBEaWdpdGFsUG9ydCogcG9ydCA9IChEaWdpdGFsUG9ydCopIGRpZ2l0YWxfcG9ydF9wb2ludGVyOworICBjaGVja1JlbGF5Q2hhbm5lbChwb3J0KTsKKyAgeworICAgIDo6c3RkOjp1bmlxdWVfbG9jazxSZWVudHJhbnRNdXRleD4gc3luYyhkaWdpdGFsUmVsYXlTZW1hcGhvcmUpOworICAgIHVpbnQ4X3QgcmV2ZXJzZVJlbGF5cyA9IHJlbGF5U3lzdGVtLT5yZWFkVmFsdWVfUmV2ZXJzZShzdGF0dXMpOworICAgIGlmIChvbikKKyAgICAgIHJldmVyc2VSZWxheXMgfD0gMSA8PCBwb3J0LT5wb3J0LnBpbjsKKyAgICBlbHNlCisgICAgICByZXZlcnNlUmVsYXlzICY9IH4oMSA8PCBwb3J0LT5wb3J0LnBpbik7CisgICAgcmVsYXlTeXN0ZW0tPndyaXRlVmFsdWVfUmV2ZXJzZShyZXZlcnNlUmVsYXlzLCBzdGF0dXMpOworICB9Cit9CisKKy8qKgorICogR2V0IHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBmb3J3YXJkIHJlbGF5IGNoYW5uZWwKKyAqLworYm9vbCBnZXRSZWxheUZvcndhcmQodm9pZCogZGlnaXRhbF9wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cykgeworICBEaWdpdGFsUG9ydCogcG9ydCA9IChEaWdpdGFsUG9ydCopIGRpZ2l0YWxfcG9ydF9wb2ludGVyOworICB1aW50OF90IGZvcndhcmRSZWxheXMgPSByZWxheVN5c3RlbS0+cmVhZFZhbHVlX0ZvcndhcmQoc3RhdHVzKTsKKyAgcmV0dXJuIChmb3J3YXJkUmVsYXlzICYgKDEgPDwgcG9ydC0+cG9ydC5waW4pKSAhPSAwOworfQorCisvKioKKyAqIEdldCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcmV2ZXJzZSByZWxheSBjaGFubmVsCisgKi8KK2Jvb2wgZ2V0UmVsYXlSZXZlcnNlKHZvaWQqIGRpZ2l0YWxfcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgRGlnaXRhbFBvcnQqIHBvcnQgPSAoRGlnaXRhbFBvcnQqKSBkaWdpdGFsX3BvcnRfcG9pbnRlcjsKKyAgdWludDhfdCByZXZlcnNlUmVsYXlzID0gcmVsYXlTeXN0ZW0tPnJlYWRWYWx1ZV9SZXZlcnNlKHN0YXR1cyk7CisgIHJldHVybiAocmV2ZXJzZVJlbGF5cyAmICgxIDw8IHBvcnQtPnBvcnQucGluKSkgIT0gMDsKK30KKworLyoqCisgKiBBbGxvY2F0ZSBEaWdpdGFsIEkvTyBjaGFubmVscy4KKyAqIEFsbG9jYXRlIGNoYW5uZWxzIHNvIHRoYXQgdGhleSBhcmUgbm90IGFjY2lkZW50bHkgcmV1c2VkLiBBbHNvIHRoZSBkaXJlY3Rpb24gaXMgc2V0IGF0IHRoZQorICogdGltZSBvZiB0aGUgYWxsb2NhdGlvbi4KKyAqCisgKiBAcGFyYW0gY2hhbm5lbCBUaGUgRGlnaXRhbCBJL08gY2hhbm5lbAorICogQHBhcmFtIGlucHV0IElmIHRydWUgb3BlbiBhcyBpbnB1dDsgaWYgZmFsc2Ugb3BlbiBhcyBvdXRwdXQKKyAqIEByZXR1cm4gV2FzIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQKKyAqLworYm9vbCBhbGxvY2F0ZURJTyh2b2lkKiBkaWdpdGFsX3BvcnRfcG9pbnRlciwgYm9vbCBpbnB1dCwgaW50MzJfdCAqc3RhdHVzKSB7CisgIERpZ2l0YWxQb3J0KiBwb3J0ID0gKERpZ2l0YWxQb3J0KikgZGlnaXRhbF9wb3J0X3BvaW50ZXI7CisgIGNoYXIgYnVmWzY0XTsKKyAgc25wcmludGYoYnVmLCA2NCwgIkRJTyAlZCIsIHBvcnQtPnBvcnQucGluKTsKKyAgaWYgKERJT0NoYW5uZWxzLT5BbGxvY2F0ZShwb3J0LT5wb3J0LnBpbiwgYnVmKSA9PSB+MHVsKSB7CisgICAgKnN0YXR1cyA9IFJFU09VUkNFX0lTX0FMTE9DQVRFRDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB7CisgICAgOjpzdGQ6OnVuaXF1ZV9sb2NrPFJlZW50cmFudE11dGV4PiBzeW5jKGRpZ2l0YWxESU9TZW1hcGhvcmUpOworCisgICAgdERJTzo6dE91dHB1dEVuYWJsZSBvdXRwdXRFbmFibGUgPSBkaWdpdGFsU3lzdGVtLT5yZWFkT3V0cHV0RW5hYmxlKHN0YXR1cyk7CisKKyAgICBpZihwb3J0LT5wb3J0LnBpbiA8IGtOdW1IZWFkZXJzKSB7CisgICAgICB1aW50MzJfdCBiaXRUb1NldCA9IDEgPDwgcG9ydC0+cG9ydC5waW47CisgICAgICBpZiAoaW5wdXQpIHsKKyAgICAgICAgb3V0cHV0RW5hYmxlLkhlYWRlcnMgPSBvdXRwdXRFbmFibGUuSGVhZGVycyAmICh+Yml0VG9TZXQpOyAvLyBjbGVhciB0aGUgYml0IGZvciByZWFkCisgICAgICB9IGVsc2UgeworICAgICAgICBvdXRwdXRFbmFibGUuSGVhZGVycyA9IG91dHB1dEVuYWJsZS5IZWFkZXJzIHwgYml0VG9TZXQ7IC8vIHNldCB0aGUgYml0IGZvciB3cml0ZQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICB1aW50MzJfdCBiaXRUb1NldCA9IDEgPDwgcmVtYXBNWFBDaGFubmVsKHBvcnQtPnBvcnQucGluKTsKKworICAgICAgLy8gRGlzYWJsZSBzcGVjaWFsIGZ1bmN0aW9ucyBvbiB0aGlzIHBpbgorICAgICAgc2hvcnQgc3BlY2lhbEZ1bmN0aW9ucyA9IGRpZ2l0YWxTeXN0ZW0tPnJlYWRFbmFibGVNWFBTcGVjaWFsRnVuY3Rpb24oc3RhdHVzKTsKKyAgICAgIGRpZ2l0YWxTeXN0ZW0tPndyaXRlRW5hYmxlTVhQU3BlY2lhbEZ1bmN0aW9uKHNwZWNpYWxGdW5jdGlvbnMgJiB+Yml0VG9TZXQsIHN0YXR1cyk7CisKKyAgICAgIGlmIChpbnB1dCkgeworICAgICAgICBvdXRwdXRFbmFibGUuTVhQID0gb3V0cHV0RW5hYmxlLk1YUCAmICh+Yml0VG9TZXQpOyAvLyBjbGVhciB0aGUgYml0IGZvciByZWFkCisgICAgICB9IGVsc2UgeworICAgICAgICBvdXRwdXRFbmFibGUuTVhQID0gb3V0cHV0RW5hYmxlLk1YUCB8IGJpdFRvU2V0OyAvLyBzZXQgdGhlIGJpdCBmb3Igd3JpdGUKKyAgICAgIH0KKyAgICB9CisKKyAgICBkaWdpdGFsU3lzdGVtLT53cml0ZU91dHB1dEVuYWJsZShvdXRwdXRFbmFibGUsIHN0YXR1cyk7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgYWxsb2NhdGVQV01DaGFubmVsKHZvaWQqIGRpZ2l0YWxfcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKwkJRGlnaXRhbFBvcnQqIHBvcnQgPSAoRGlnaXRhbFBvcnQqKSBkaWdpdGFsX3BvcnRfcG9pbnRlcjsKKwkJY2hhciBidWZbNjRdOworCQlzbnByaW50ZihidWYsIDY0LCAiUFdNICVkIiwgcG9ydC0+cG9ydC5waW4pOworCQlpZiAoUFdNQ2hhbm5lbHMtPkFsbG9jYXRlKHBvcnQtPnBvcnQucGluLCBidWYpID09IH4wdWwpIHsKKyAgICAgICpzdGF0dXMgPSBSRVNPVVJDRV9JU19BTExPQ0FURUQ7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisJCWlmIChwb3J0LT5wb3J0LnBpbiA+IHRQV006OmtOdW1IZHJSZWdpc3RlcnMtMSkgeworCQkJc25wcmludGYoYnVmLCA2NCwgIlBXTSAlZCBhbmQgRElPICVkIiwgcG9ydC0+cG9ydC5waW4sIHJlbWFwTVhQUFdNQ2hhbm5lbChwb3J0LT5wb3J0LnBpbikgKyAxMCk7CisJCQlpZiAoRElPQ2hhbm5lbHMtPkFsbG9jYXRlKHJlbWFwTVhQUFdNQ2hhbm5lbChwb3J0LT5wb3J0LnBpbikgKyAxMCwgYnVmKSA9PSB+MHVsKSByZXR1cm4gZmFsc2U7CisJCSAgICB1aW50MzJfdCBiaXRUb1NldCA9IDEgPDwgcmVtYXBNWFBQV01DaGFubmVsKHBvcnQtPnBvcnQucGluKTsKKwkJICAgIHNob3J0IHNwZWNpYWxGdW5jdGlvbnMgPSBkaWdpdGFsU3lzdGVtLT5yZWFkRW5hYmxlTVhQU3BlY2lhbEZ1bmN0aW9uKHN0YXR1cyk7CisJCSAgICBkaWdpdGFsU3lzdGVtLT53cml0ZUVuYWJsZU1YUFNwZWNpYWxGdW5jdGlvbihzcGVjaWFsRnVuY3Rpb25zIHwgYml0VG9TZXQsIHN0YXR1cyk7CisJCX0KKwkJcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgZnJlZVBXTUNoYW5uZWwodm9pZCogZGlnaXRhbF9wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cykgeworICAgIERpZ2l0YWxQb3J0KiBwb3J0ID0gKERpZ2l0YWxQb3J0KikgZGlnaXRhbF9wb3J0X3BvaW50ZXI7CisgICAgUFdNQ2hhbm5lbHMtPkZyZWUocG9ydC0+cG9ydC5waW4pOworICAgIGlmKHBvcnQtPnBvcnQucGluID4gdFBXTTo6a051bUhkclJlZ2lzdGVycy0xKSB7CisgICAgICAgIERJT0NoYW5uZWxzLT5GcmVlKHJlbWFwTVhQUFdNQ2hhbm5lbChwb3J0LT5wb3J0LnBpbikgKyAxMCk7CisgICAgICAgIHVpbnQzMl90IGJpdFRvVW5zZXQgPSAxIDw8IHJlbWFwTVhQUFdNQ2hhbm5lbChwb3J0LT5wb3J0LnBpbik7CisgICAgICAgIHNob3J0IHNwZWNpYWxGdW5jdGlvbnMgPSBkaWdpdGFsU3lzdGVtLT5yZWFkRW5hYmxlTVhQU3BlY2lhbEZ1bmN0aW9uKHN0YXR1cyk7CisgICAgICAgIGRpZ2l0YWxTeXN0ZW0tPndyaXRlRW5hYmxlTVhQU3BlY2lhbEZ1bmN0aW9uKHNwZWNpYWxGdW5jdGlvbnMgJiB+Yml0VG9VbnNldCwgc3RhdHVzKTsKKyAgICB9Cit9CisKKy8qKgorICogRnJlZSB0aGUgcmVzb3VyY2UgYXNzb2NpYXRlZCB3aXRoIGEgZGlnaXRhbCBJL08gY2hhbm5lbC4KKyAqCisgKiBAcGFyYW0gY2hhbm5lbCBUaGUgRGlnaXRhbCBJL08gY2hhbm5lbCB0byBmcmVlCisgKi8KK3ZvaWQgZnJlZURJTyh2b2lkKiBkaWdpdGFsX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisgIERpZ2l0YWxQb3J0KiBwb3J0ID0gKERpZ2l0YWxQb3J0KikgZGlnaXRhbF9wb3J0X3BvaW50ZXI7CisgIERJT0NoYW5uZWxzLT5GcmVlKHBvcnQtPnBvcnQucGluKTsKK30KKworLyoqCisgKiBXcml0ZSBhIGRpZ2l0YWwgSS9PIGJpdCB0byB0aGUgRlBHQS4KKyAqIFNldCBhIHNpbmdsZSB2YWx1ZSBvbiBhIGRpZ2l0YWwgSS9PIGNoYW5uZWwuCisgKgorICogQHBhcmFtIGNoYW5uZWwgVGhlIERpZ2l0YWwgSS9PIGNoYW5uZWwKKyAqIEBwYXJhbSB2YWx1ZSBUaGUgc3RhdGUgdG8gc2V0IHRoZSBkaWdpdGFsIGNoYW5uZWwgKGlmIGl0IGlzIGNvbmZpZ3VyZWQgYXMgYW4gb3V0cHV0KQorICovCit2b2lkIHNldERJTyh2b2lkKiBkaWdpdGFsX3BvcnRfcG9pbnRlciwgc2hvcnQgdmFsdWUsIGludDMyX3QgKnN0YXR1cykgeworICBEaWdpdGFsUG9ydCogcG9ydCA9IChEaWdpdGFsUG9ydCopIGRpZ2l0YWxfcG9ydF9wb2ludGVyOworICBpZiAodmFsdWUgIT0gMCAmJiB2YWx1ZSAhPSAxKSB7CisgICAgaWYgKHZhbHVlICE9IDApCisgICAgICB2YWx1ZSA9IDE7CisgIH0KKyAgeworICAgIDo6c3RkOjp1bmlxdWVfbG9jazxSZWVudHJhbnRNdXRleD4gc3luYyhkaWdpdGFsRElPU2VtYXBob3JlKTsKKyAgICB0RElPOjp0RE8gY3VycmVudERJTyA9IGRpZ2l0YWxTeXN0ZW0tPnJlYWRETyhzdGF0dXMpOworCisgICAgaWYocG9ydC0+cG9ydC5waW4gPCBrTnVtSGVhZGVycykgeworICAgICAgaWYodmFsdWUgPT0gMCkgeworICAgICAgICBjdXJyZW50RElPLkhlYWRlcnMgPSBjdXJyZW50RElPLkhlYWRlcnMgJiB+KDEgPDwgcG9ydC0+cG9ydC5waW4pOworICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAxKSB7CisgICAgICAgIGN1cnJlbnRESU8uSGVhZGVycyA9IGN1cnJlbnRESU8uSGVhZGVycyB8ICgxIDw8IHBvcnQtPnBvcnQucGluKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYodmFsdWUgPT0gMCkgeworICAgICAgICBjdXJyZW50RElPLk1YUCA9IGN1cnJlbnRESU8uTVhQICYgfigxIDw8IHJlbWFwTVhQQ2hhbm5lbChwb3J0LT5wb3J0LnBpbikpOworICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAxKSB7CisgICAgICAgIGN1cnJlbnRESU8uTVhQID0gY3VycmVudERJTy5NWFAgfCAoMSA8PCByZW1hcE1YUENoYW5uZWwocG9ydC0+cG9ydC5waW4pKTsKKyAgICAgIH0KKworICAgICAgdWludDMyX3QgYml0VG9TZXQgPSAxIDw8IHJlbWFwTVhQQ2hhbm5lbChwb3J0LT5wb3J0LnBpbik7CisgICAgICBzaG9ydCBzcGVjaWFsRnVuY3Rpb25zID0gZGlnaXRhbFN5c3RlbS0+cmVhZEVuYWJsZU1YUFNwZWNpYWxGdW5jdGlvbihzdGF0dXMpOworICAgICAgZGlnaXRhbFN5c3RlbS0+d3JpdGVFbmFibGVNWFBTcGVjaWFsRnVuY3Rpb24oc3BlY2lhbEZ1bmN0aW9ucyAmIH5iaXRUb1NldCwgc3RhdHVzKTsKKyAgICB9CisgICAgZGlnaXRhbFN5c3RlbS0+d3JpdGVETyhjdXJyZW50RElPLCBzdGF0dXMpOworICB9Cit9CisKKy8qKgorICogV3JpdGUgdGhlIGZpbHRlciBpbmRleCBmcm9tIHRoZSBGUEdBLgorICogU2V0IHRoZSBmaWx0ZXIgaW5kZXggdXNlZCB0byBmaWx0ZXIgb3V0IHNob3J0IHB1bHNlcy4KKyAqCisgKiBAcGFyYW0gZGlnaXRhbF9wb3J0X3BvaW50ZXIgVGhlIGRpZ2l0YWwgSS9PIGNoYW5uZWwKKyAqIEBwYXJhbSBmaWx0ZXJfaW5kZXggVGhlIGZpbHRlciBpbmRleC4gIE11c3QgYmUgYmV0d2VlbiAwIGFuZCAzLgorICovCit2b2lkIHNldEZpbHRlclNlbGVjdCh2b2lkKiBkaWdpdGFsX3BvcnRfcG9pbnRlciwgaW50IGZpbHRlcl9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgeworICBEaWdpdGFsUG9ydCogcG9ydCA9IChEaWdpdGFsUG9ydCopZGlnaXRhbF9wb3J0X3BvaW50ZXI7CisgIHsKKyAgICA6OnN0ZDo6dW5pcXVlX2xvY2s8UmVlbnRyYW50TXV0ZXg+IHN5bmMoZGlnaXRhbERJT1NlbWFwaG9yZSk7CisgICAgaWYgKHBvcnQtPnBvcnQucGluIDwga051bUhlYWRlcnMpIHsKKyAgICAgIGRpZ2l0YWxTeXN0ZW0tPndyaXRlRmlsdGVyU2VsZWN0SGRyKHBvcnQtPnBvcnQucGluLCBmaWx0ZXJfaW5kZXgsIHN0YXR1cyk7CisgICAgfSBlbHNlIHsKKyAgICAgIGRpZ2l0YWxTeXN0ZW0tPndyaXRlRmlsdGVyU2VsZWN0TVhQKHJlbWFwTVhQQ2hhbm5lbChwb3J0LT5wb3J0LnBpbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfaW5kZXgsIHN0YXR1cyk7CisgICAgfQorICB9Cit9CisKKy8qKgorICogUmVhZCB0aGUgZmlsdGVyIGluZGV4IGZyb20gdGhlIEZQR0EuCisgKiBHZXQgdGhlIGZpbHRlciBpbmRleCB1c2VkIHRvIGZpbHRlciBvdXQgc2hvcnQgcHVsc2VzLgorICoKKyAqIEBwYXJhbSBkaWdpdGFsX3BvcnRfcG9pbnRlciBUaGUgZGlnaXRhbCBJL08gY2hhbm5lbAorICogQHJldHVybiBmaWx0ZXJfaW5kZXggVGhlIGZpbHRlciBpbmRleC4gIE11c3QgYmUgYmV0d2VlbiAwIGFuZCAzLgorICovCitpbnQgZ2V0RmlsdGVyU2VsZWN0KHZvaWQqIGRpZ2l0YWxfcG9ydF9wb2ludGVyLCBpbnQzMl90KiBzdGF0dXMpIHsKKyAgRGlnaXRhbFBvcnQqIHBvcnQgPSAoRGlnaXRhbFBvcnQqKWRpZ2l0YWxfcG9ydF9wb2ludGVyOworICB7CisgICAgOjpzdGQ6OnVuaXF1ZV9sb2NrPFJlZW50cmFudE11dGV4PiBzeW5jKGRpZ2l0YWxESU9TZW1hcGhvcmUpOworICAgIGlmIChwb3J0LT5wb3J0LnBpbiA8IGtOdW1IZWFkZXJzKSB7CisgICAgICByZXR1cm4gZGlnaXRhbFN5c3RlbS0+cmVhZEZpbHRlclNlbGVjdEhkcihwb3J0LT5wb3J0LnBpbiwgc3RhdHVzKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGRpZ2l0YWxTeXN0ZW0tPnJlYWRGaWx0ZXJTZWxlY3RNWFAocmVtYXBNWFBDaGFubmVsKHBvcnQtPnBvcnQucGluKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7CisgICAgfQorICB9Cit9CisKKy8qKgorICogU2V0IHRoZSBmaWx0ZXIgcGVyaW9kIGZvciB0aGUgc3BlY2lmaWVkIGZpbHRlciBpbmRleC4KKyAqCisgKiBTZXQgdGhlIGZpbHRlciBwZXJpb2QgaW4gRlBHQSBjeWNsZXMuICBFdmVuIHRob3VnaCB0aGVyZSBhcmUgMiBkaWZmZXJlbnQKKyAqIGZpbHRlciBpbmRleCBkb21haW5zIChNWFAgdnMgSERSKSwgaWdub3JlIHRoYXQgZGlzdGluY3Rpb24gZm9yIG5vdyBzaW5jZSBpdAorICogY29tcGlsaWNhdGVzIHRoZSBpbnRlcmZhY2UuICBUaGF0IGNhbiBiZSBjaGFuZ2VkIGxhdGVyLgorICoKKyAqIEBwYXJhbSBmaWx0ZXJfaW5kZXggVGhlIGZpbHRlciBpbmRleCwgMCAtIDIuCisgKiBAcGFyYW0gdmFsdWUgVGhlIG51bWJlciBvZiBjeWNsZXMgdGhhdCB0aGUgc2lnbmFsIG11c3Qgbm90IHRyYW5zaXRpb24gdG8gYmUKKyAqIGNvdW50ZWQgYXMgYSB0cmFuc2l0aW9uLgorICovCit2b2lkIHNldEZpbHRlclBlcmlvZChpbnQgZmlsdGVyX2luZGV4LCB1aW50MzJfdCB2YWx1ZSwgaW50MzJfdCogc3RhdHVzKSB7CisgIHsKKyAgICA6OnN0ZDo6dW5pcXVlX2xvY2s8UmVlbnRyYW50TXV0ZXg+IHN5bmMoZGlnaXRhbERJT1NlbWFwaG9yZSk7CisgICAgZGlnaXRhbFN5c3RlbS0+d3JpdGVGaWx0ZXJQZXJpb2RIZHIoZmlsdGVyX2luZGV4LCB2YWx1ZSwgc3RhdHVzKTsKKyAgICBpZiAoKnN0YXR1cyA9PSAwKSB7CisgICAgICBwcmludGYoIk15IGVycm9yICVkIGluZGV4ICVkIHBlcmlvZCAlZFxuIiwgKnN0YXR1cywgZmlsdGVyX2luZGV4LCB2YWx1ZSk7CisgICAgICBkaWdpdGFsU3lzdGVtLT53cml0ZUZpbHRlclBlcmlvZE1YUChmaWx0ZXJfaW5kZXgsIHZhbHVlLCBzdGF0dXMpOworICAgICAgcHJpbnRmKCJNeSBlcnJvciAlZCBpbmRleCAlZCBwZXJpb2QgJWRcbiIsICpzdGF0dXMsIGZpbHRlcl9pbmRleCwgdmFsdWUpOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIEdldCB0aGUgZmlsdGVyIHBlcmlvZCBmb3IgdGhlIHNwZWNpZmllZCBmaWx0ZXIgaW5kZXguCisgKgorICogR2V0IHRoZSBmaWx0ZXIgcGVyaW9kIGluIEZQR0EgY3ljbGVzLiAgRXZlbiB0aG91Z2ggdGhlcmUgYXJlIDIgZGlmZmVyZW50CisgKiBmaWx0ZXIgaW5kZXggZG9tYWlucyAoTVhQIHZzIEhEUiksIGlnbm9yZSB0aGF0IGRpc3RpbmN0aW9uIGZvciBub3cgc2luY2UgaXQKKyAqIGNvbXBpbGljYXRlcyB0aGUgaW50ZXJmYWNlLiAgU2V0IHN0YXR1cyB0byBOaUZwZ2FfU3RhdHVzX1NvZnR3YXJlRmF1bHQgaWYgdGhlCisgKiBmaWx0ZXIgdmFsdWVzIG1pc3MtbWF0Y2guCisgKgorICogQHBhcmFtIGZpbHRlcl9pbmRleCBUaGUgZmlsdGVyIGluZGV4LCAwIC0gMi4KKyAqIEBwYXJhbSB2YWx1ZSBUaGUgbnVtYmVyIG9mIGN5Y2xlcyB0aGF0IHRoZSBzaWduYWwgbXVzdCBub3QgdHJhbnNpdGlvbiB0byBiZQorICogY291bnRlZCBhcyBhIHRyYW5zaXRpb24uCisgKi8KK3VpbnQzMl90IGdldEZpbHRlclBlcmlvZChpbnQgZmlsdGVyX2luZGV4LCBpbnQzMl90KiBzdGF0dXMpIHsKKyAgdWludDMyX3QgaGRyX3BlcmlvZCA9IDA7CisgIHVpbnQzMl90IG14cF9wZXJpb2QgPSAwOworICB7CisgICAgOjpzdGQ6OnVuaXF1ZV9sb2NrPFJlZW50cmFudE11dGV4PiBzeW5jKGRpZ2l0YWxESU9TZW1hcGhvcmUpOworICAgIGhkcl9wZXJpb2QgPSBkaWdpdGFsU3lzdGVtLT5yZWFkRmlsdGVyUGVyaW9kSGRyKGZpbHRlcl9pbmRleCwgc3RhdHVzKTsKKyAgICBwcmludGYoIk15IGVycm9yIGdldCAlZCBpbmRleCAlZCAlZFxuIiwgKnN0YXR1cywgZmlsdGVyX2luZGV4LCBoZHJfcGVyaW9kKTsKKyAgICBpZiAoKnN0YXR1cyA9PSAwKSB7CisgICAgICBteHBfcGVyaW9kID0gZGlnaXRhbFN5c3RlbS0+cmVhZEZpbHRlclBlcmlvZE1YUChmaWx0ZXJfaW5kZXgsIHN0YXR1cyk7CisgICAgICBwcmludGYoIk15IGVycm9yIGdldCAlZCBpbmRleCAlZCAlZFxuIiwgKnN0YXR1cywgZmlsdGVyX2luZGV4LCBteHBfcGVyaW9kKTsKKyAgICB9CisgIH0KKyAgaWYgKGhkcl9wZXJpb2QgIT0gbXhwX3BlcmlvZCkgeworICAgIHByaW50ZigiUGVyaW9kcyAlZCAlZFxuIiwgaGRyX3BlcmlvZCwgbXhwX3BlcmlvZCk7CisgICAgKnN0YXR1cyA9IE5pRnBnYV9TdGF0dXNfU29mdHdhcmVGYXVsdDsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIGhkcl9wZXJpb2Q7Cit9CisKKy8qKgorICogUmVhZCBhIGRpZ2l0YWwgSS9PIGJpdCBmcm9tIHRoZSBGUEdBLgorICogR2V0IGEgc2luZ2xlIHZhbHVlIGZyb20gYSBkaWdpdGFsIEkvTyBjaGFubmVsLgorICoKKyAqIEBwYXJhbSBjaGFubmVsIFRoZSBkaWdpdGFsIEkvTyBjaGFubmVsCisgKiBAcmV0dXJuIFRoZSBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGNoYW5uZWwKKyAqLworYm9vbCBnZXRESU8odm9pZCogZGlnaXRhbF9wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cykgeworICBEaWdpdGFsUG9ydCogcG9ydCA9IChEaWdpdGFsUG9ydCopIGRpZ2l0YWxfcG9ydF9wb2ludGVyOworICB0RElPOjp0REkgY3VycmVudERJTyA9IGRpZ2l0YWxTeXN0ZW0tPnJlYWRESShzdGF0dXMpOworICAvL1NoaWZ0IDAwMDAwMDAxIG92ZXIgY2hhbm5lbC0xIHBsYWNlcy4KKyAgLy9BTkQgaXQgYWdhaW5zdCB0aGUgY3VycmVudERJTworICAvL2lmIGl0ID09IDAsIHRoZW4gcmV0dXJuIGZhbHNlCisgIC8vZWxzZSByZXR1cm4gdHJ1ZQorCisgIGlmKHBvcnQtPnBvcnQucGluIDwga051bUhlYWRlcnMpIHsKKyAgICByZXR1cm4gKChjdXJyZW50RElPLkhlYWRlcnMgPj4gcG9ydC0+cG9ydC5waW4pICYgMSkgIT0gMDsKKyAgfSBlbHNlIHsKKyAgICAvLyBEaXNhYmxlIHNwZWNpYWwgZnVuY3Rpb25zCisgICAgdWludDMyX3QgYml0VG9TZXQgPSAxIDw8IHJlbWFwTVhQQ2hhbm5lbChwb3J0LT5wb3J0LnBpbik7CisgICAgc2hvcnQgc3BlY2lhbEZ1bmN0aW9ucyA9IGRpZ2l0YWxTeXN0ZW0tPnJlYWRFbmFibGVNWFBTcGVjaWFsRnVuY3Rpb24oc3RhdHVzKTsKKyAgICBkaWdpdGFsU3lzdGVtLT53cml0ZUVuYWJsZU1YUFNwZWNpYWxGdW5jdGlvbihzcGVjaWFsRnVuY3Rpb25zICYgfmJpdFRvU2V0LCBzdGF0dXMpOworCisgICAgcmV0dXJuICgoY3VycmVudERJTy5NWFAgPj4gcmVtYXBNWFBDaGFubmVsKHBvcnQtPnBvcnQucGluKSkgJiAxKSAhPSAwOworICB9Cit9CisKKy8qKgorICogUmVhZCB0aGUgZGlyZWN0aW9uIG9mIGEgdGhlIERpZ2l0YWwgSS9PIGxpbmVzCisgKiBBIDEgYml0IG1lYW5zIG91dHB1dCBhbmQgYSAwIGJpdCBtZWFucyBpbnB1dC4KKyAqCisgKiBAcGFyYW0gY2hhbm5lbCBUaGUgZGlnaXRhbCBJL08gY2hhbm5lbAorICogQHJldHVybiBUaGUgZGlyZWN0aW9uIG9mIHRoZSBzcGVjaWZpZWQgY2hhbm5lbAorICovCitib29sIGdldERJT0RpcmVjdGlvbih2b2lkKiBkaWdpdGFsX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisgIERpZ2l0YWxQb3J0KiBwb3J0ID0gKERpZ2l0YWxQb3J0KikgZGlnaXRhbF9wb3J0X3BvaW50ZXI7CisgIHRESU86OnRPdXRwdXRFbmFibGUgY3VycmVudE91dHB1dEVuYWJsZSA9IGRpZ2l0YWxTeXN0ZW0tPnJlYWRPdXRwdXRFbmFibGUoc3RhdHVzKTsKKwkvL1NoaWZ0IDAwMDAwMDAxIG92ZXIgcG9ydC0+cG9ydC5waW4tMSBwbGFjZXMuCisgIC8vQU5EIGl0IGFnYWluc3QgdGhlIGN1cnJlbnRPdXRwdXRFbmFibGUKKyAgLy9pZiBpdCA9PSAwLCB0aGVuIHJldHVybiBmYWxzZQorICAvL2Vsc2UgcmV0dXJuIHRydWUKKworICBpZihwb3J0LT5wb3J0LnBpbiA8IGtOdW1IZWFkZXJzKSB7CisgICAgcmV0dXJuICgoY3VycmVudE91dHB1dEVuYWJsZS5IZWFkZXJzID4+IHBvcnQtPnBvcnQucGluKSAmIDEpICE9IDA7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuICgoY3VycmVudE91dHB1dEVuYWJsZS5NWFAgPj4gcmVtYXBNWFBDaGFubmVsKHBvcnQtPnBvcnQucGluKSkgJiAxKSAhPSAwOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGUgYSBzaW5nbGUgcHVsc2UuCisgKiBXcml0ZSBhIHB1bHNlIHRvIHRoZSBzcGVjaWZpZWQgZGlnaXRhbCBvdXRwdXQgY2hhbm5lbC4gVGhlcmUgY2FuIG9ubHkgYmUgYSBzaW5nbGUgcHVsc2UgZ29pbmcgYXQgYW55IHRpbWUuCisgKgorICogQHBhcmFtIGNoYW5uZWwgVGhlIERpZ2l0YWwgT3V0cHV0IGNoYW5uZWwgdGhhdCB0aGUgcHVsc2Ugc2hvdWxkIGJlIG91dHB1dCBvbgorICogQHBhcmFtIHB1bHNlTGVuZ3RoIFRoZSBhY3RpdmUgbGVuZ3RoIG9mIHRoZSBwdWxzZSAoaW4gc2Vjb25kcykKKyAqLwordm9pZCBwdWxzZSh2b2lkKiBkaWdpdGFsX3BvcnRfcG9pbnRlciwgZG91YmxlIHB1bHNlTGVuZ3RoLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgRGlnaXRhbFBvcnQqIHBvcnQgPSAoRGlnaXRhbFBvcnQqKSBkaWdpdGFsX3BvcnRfcG9pbnRlcjsKKyAgdERJTzo6dFB1bHNlIHB1bHNlOworCisgIGlmKHBvcnQtPnBvcnQucGluIDwga051bUhlYWRlcnMpIHsKKyAgICBwdWxzZS5IZWFkZXJzID0gMSA8PCBwb3J0LT5wb3J0LnBpbjsKKyAgfSBlbHNlIHsKKyAgICBwdWxzZS5NWFAgPSAxIDw8IHJlbWFwTVhQQ2hhbm5lbChwb3J0LT5wb3J0LnBpbik7CisgIH0KKworICBkaWdpdGFsU3lzdGVtLT53cml0ZVB1bHNlTGVuZ3RoKCh1aW50OF90KSgxLjBlOSAqIHB1bHNlTGVuZ3RoIC8gKHB3bVN5c3RlbS0+cmVhZExvb3BUaW1pbmcoc3RhdHVzKSAqIDI1KSksIHN0YXR1cyk7CisgIGRpZ2l0YWxTeXN0ZW0tPndyaXRlUHVsc2UocHVsc2UsIHN0YXR1cyk7Cit9CisKKy8qKgorICogQ2hlY2sgYSBESU8gbGluZSB0byBzZWUgaWYgaXQgaXMgY3VycmVudGx5IGdlbmVyYXRpbmcgYSBwdWxzZS4KKyAqCisgKiBAcmV0dXJuIEEgcHVsc2UgaXMgaW4gcHJvZ3Jlc3MKKyAqLworYm9vbCBpc1B1bHNpbmcodm9pZCogZGlnaXRhbF9wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cykgeworICBEaWdpdGFsUG9ydCogcG9ydCA9IChEaWdpdGFsUG9ydCopIGRpZ2l0YWxfcG9ydF9wb2ludGVyOworICB0RElPOjp0UHVsc2UgcHVsc2VSZWdpc3RlciA9IGRpZ2l0YWxTeXN0ZW0tPnJlYWRQdWxzZShzdGF0dXMpOworCisgIGlmKHBvcnQtPnBvcnQucGluIDwga051bUhlYWRlcnMpIHsKKyAgICByZXR1cm4gKHB1bHNlUmVnaXN0ZXIuSGVhZGVycyAmICgxIDw8IHBvcnQtPnBvcnQucGluKSkgIT0gMDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gKHB1bHNlUmVnaXN0ZXIuTVhQICYgKDEgPDwgcmVtYXBNWFBDaGFubmVsKHBvcnQtPnBvcnQucGluKSkpICE9IDA7CisgIH0KK30KKworLyoqCisgKiBDaGVjayBpZiBhbnkgRElPIGxpbmUgaXMgY3VycmVudGx5IGdlbmVyYXRpbmcgYSBwdWxzZS4KKyAqCisgKiBAcmV0dXJuIEEgcHVsc2Ugb24gc29tZSBsaW5lIGlzIGluIHByb2dyZXNzCisgKi8KK2Jvb2wgaXNBbnlQdWxzaW5nKGludDMyX3QgKnN0YXR1cykgeworICB0RElPOjp0UHVsc2UgcHVsc2VSZWdpc3RlciA9IGRpZ2l0YWxTeXN0ZW0tPnJlYWRQdWxzZShzdGF0dXMpOworICByZXR1cm4gcHVsc2VSZWdpc3Rlci5IZWFkZXJzICE9IDAgJiYgcHVsc2VSZWdpc3Rlci5NWFAgIT0gMDsKK30KKworc3RydWN0IGNvdW50ZXJfdCB7CisgIHRDb3VudGVyKiBjb3VudGVyOworICB1aW50MzJfdCBpbmRleDsKK307Cit0eXBlZGVmIHN0cnVjdCBjb3VudGVyX3QgQ291bnRlcjsKKworc3RhdGljIFJlc291cmNlICpjb3VudGVycyA9IE5VTEw7CisKK3ZvaWQqIGluaXRpYWxpemVDb3VudGVyKE1vZGUgbW9kZSwgdWludDMyX3QgKmluZGV4LCBpbnQzMl90ICpzdGF0dXMpIHsKKwlSZXNvdXJjZTo6Q3JlYXRlUmVzb3VyY2VPYmplY3QoJmNvdW50ZXJzLCB0Q291bnRlcjo6a051bVN5c3RlbXMpOworCSppbmRleCA9IGNvdW50ZXJzLT5BbGxvY2F0ZSgiQ291bnRlciIpOworCWlmICgqaW5kZXggPT0gfjB1bCkgeworCQkqc3RhdHVzID0gTk9fQVZBSUxBQkxFX1JFU09VUkNFUzsKKwkJcmV0dXJuIE5VTEw7CisJfQorCUNvdW50ZXIqIGNvdW50ZXIgPSBuZXcgQ291bnRlcigpOworCWNvdW50ZXItPmNvdW50ZXIgPSB0Q291bnRlcjo6Y3JlYXRlKCppbmRleCwgc3RhdHVzKTsKKwljb3VudGVyLT5jb3VudGVyLT53cml0ZUNvbmZpZ19Nb2RlKG1vZGUsIHN0YXR1cyk7CisJY291bnRlci0+Y291bnRlci0+d3JpdGVUaW1lckNvbmZpZ19BdmVyYWdlU2l6ZSgxLCBzdGF0dXMpOworCWNvdW50ZXItPmluZGV4ID0gKmluZGV4OworCXJldHVybiBjb3VudGVyOworfQorCit2b2lkIGZyZWVDb3VudGVyKHZvaWQqIGNvdW50ZXJfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisgIGlmIChjb3VudGVyX3BvaW50ZXIgIT0gTlVMTCkgeworCSAgQ291bnRlciogY291bnRlciA9IChDb3VudGVyKikgY291bnRlcl9wb2ludGVyOworCSAgZGVsZXRlIGNvdW50ZXItPmNvdW50ZXI7CisJICBjb3VudGVycy0+RnJlZShjb3VudGVyLT5pbmRleCk7CisgIH0gZWxzZSB7CisJICAqc3RhdHVzID0gTlVMTF9QQVJBTUVURVI7CisgIH0KK30KKwordm9pZCBzZXRDb3VudGVyQXZlcmFnZVNpemUodm9pZCogY291bnRlcl9wb2ludGVyLCBpbnQzMl90IHNpemUsIGludDMyX3QgKnN0YXR1cykgeworICBDb3VudGVyKiBjb3VudGVyID0gKENvdW50ZXIqKSBjb3VudGVyX3BvaW50ZXI7CisgIGNvdW50ZXItPmNvdW50ZXItPndyaXRlVGltZXJDb25maWdfQXZlcmFnZVNpemUoc2l6ZSwgc3RhdHVzKTsKK30KKworLyoqCisgKiBTZXQgdGhlIHNvdXJjZSBvYmplY3QgdGhhdCBjYXVzZXMgdGhlIGNvdW50ZXIgdG8gY291bnQgdXAuCisgKiBTZXQgdGhlIHVwIGNvdW50aW5nIERpZ2l0YWxTb3VyY2UuCisgKi8KK3ZvaWQgc2V0Q291bnRlclVwU291cmNlKHZvaWQqIGNvdW50ZXJfcG9pbnRlciwgdWludDMyX3QgcGluLCBib29sIGFuYWxvZ1RyaWdnZXIsIGludDMyX3QgKnN0YXR1cykgeworICBDb3VudGVyKiBjb3VudGVyID0gKENvdW50ZXIqKSBjb3VudGVyX3BvaW50ZXI7CisKKyAgdWludDhfdCBtb2R1bGU7CisKKyAgaWYocGluID49IGtOdW1IZWFkZXJzKSB7CisgICAgcGluID0gcmVtYXBNWFBDaGFubmVsKHBpbik7CisgICAgbW9kdWxlID0gMTsKKyAgfSBlbHNlIHsKKyAgICBtb2R1bGUgPSAwOworICB9CisKKyAgY291bnRlci0+Y291bnRlci0+d3JpdGVDb25maWdfVXBTb3VyY2VfTW9kdWxlKG1vZHVsZSwgc3RhdHVzKTsKKyAgY291bnRlci0+Y291bnRlci0+d3JpdGVDb25maWdfVXBTb3VyY2VfQ2hhbm5lbChwaW4sIHN0YXR1cyk7CisgIGNvdW50ZXItPmNvdW50ZXItPndyaXRlQ29uZmlnX1VwU291cmNlX0FuYWxvZ1RyaWdnZXIoYW5hbG9nVHJpZ2dlciwgc3RhdHVzKTsKKworICBpZihjb3VudGVyLT5jb3VudGVyLT5yZWFkQ29uZmlnX01vZGUoc3RhdHVzKSA9PSBrVHdvUHVsc2UgfHwKKwkgY291bnRlci0+Y291bnRlci0+cmVhZENvbmZpZ19Nb2RlKHN0YXR1cykgPT0ga0V4dGVybmFsRGlyZWN0aW9uKSB7CisJc2V0Q291bnRlclVwU291cmNlRWRnZShjb3VudGVyX3BvaW50ZXIsIHRydWUsIGZhbHNlLCBzdGF0dXMpOworICB9CisgIGNvdW50ZXItPmNvdW50ZXItPnN0cm9iZVJlc2V0KHN0YXR1cyk7Cit9CisKKy8qKgorICogU2V0IHRoZSBlZGdlIHNlbnNpdGl2aXR5IG9uIGFuIHVwIGNvdW50aW5nIHNvdXJjZS4KKyAqIFNldCB0aGUgdXAgc291cmNlIHRvIGVpdGhlciBkZXRlY3QgcmlzaW5nIGVkZ2VzIG9yIGZhbGxpbmcgZWRnZXMuCisgKi8KK3ZvaWQgc2V0Q291bnRlclVwU291cmNlRWRnZSh2b2lkKiBjb3VudGVyX3BvaW50ZXIsIGJvb2wgcmlzaW5nRWRnZSwgYm9vbCBmYWxsaW5nRWRnZSwgaW50MzJfdCAqc3RhdHVzKSB7CisgIENvdW50ZXIqIGNvdW50ZXIgPSAoQ291bnRlciopIGNvdW50ZXJfcG9pbnRlcjsKKyAgY291bnRlci0+Y291bnRlci0+d3JpdGVDb25maWdfVXBSaXNpbmdFZGdlKHJpc2luZ0VkZ2UsIHN0YXR1cyk7CisgIGNvdW50ZXItPmNvdW50ZXItPndyaXRlQ29uZmlnX1VwRmFsbGluZ0VkZ2UoZmFsbGluZ0VkZ2UsIHN0YXR1cyk7Cit9CisKKy8qKgorICogRGlzYWJsZSB0aGUgdXAgY291bnRpbmcgc291cmNlIHRvIHRoZSBjb3VudGVyLgorICovCit2b2lkIGNsZWFyQ291bnRlclVwU291cmNlKHZvaWQqIGNvdW50ZXJfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisgIENvdW50ZXIqIGNvdW50ZXIgPSAoQ291bnRlciopIGNvdW50ZXJfcG9pbnRlcjsKKyAgY291bnRlci0+Y291bnRlci0+d3JpdGVDb25maWdfVXBGYWxsaW5nRWRnZShmYWxzZSwgc3RhdHVzKTsKKyAgY291bnRlci0+Y291bnRlci0+d3JpdGVDb25maWdfVXBSaXNpbmdFZGdlKGZhbHNlLCBzdGF0dXMpOworICAvLyBJbmRleCAwIG9mIGRpZ2l0YWwgaXMgYWx3YXlzIDAuCisgIGNvdW50ZXItPmNvdW50ZXItPndyaXRlQ29uZmlnX1VwU291cmNlX0NoYW5uZWwoMCwgc3RhdHVzKTsKKyAgY291bnRlci0+Y291bnRlci0+d3JpdGVDb25maWdfVXBTb3VyY2VfQW5hbG9nVHJpZ2dlcihmYWxzZSwgc3RhdHVzKTsKK30KKworLyoqCisgKiBTZXQgdGhlIHNvdXJjZSBvYmplY3QgdGhhdCBjYXVzZXMgdGhlIGNvdW50ZXIgdG8gY291bnQgZG93bi4KKyAqIFNldCB0aGUgZG93biBjb3VudGluZyBEaWdpdGFsU291cmNlLgorICovCit2b2lkIHNldENvdW50ZXJEb3duU291cmNlKHZvaWQqIGNvdW50ZXJfcG9pbnRlciwgdWludDMyX3QgcGluLCBib29sIGFuYWxvZ1RyaWdnZXIsIGludDMyX3QgKnN0YXR1cykgeworICBDb3VudGVyKiBjb3VudGVyID0gKENvdW50ZXIqKSBjb3VudGVyX3BvaW50ZXI7CisgIHVuc2lnbmVkIGNoYXIgbW9kZSA9IGNvdW50ZXItPmNvdW50ZXItPnJlYWRDb25maWdfTW9kZShzdGF0dXMpOworICBpZiAobW9kZSAhPSBrVHdvUHVsc2UgJiYgbW9kZSAhPSBrRXh0ZXJuYWxEaXJlY3Rpb24pIHsKKwkvLyBUT0RPOiB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChQYXJhbWV0ZXJPdXRPZlJhbmdlLCAiQ291bnRlciBvbmx5IHN1cHBvcnRzIERvd25Tb3VyY2UgaW4gVHdvUHVsc2UgYW5kIEV4dGVybmFsRGlyZWN0aW9uIG1vZGVzLiIpOworCSpzdGF0dXMgPSBQQVJBTUVURVJfT1VUX09GX1JBTkdFOworCXJldHVybjsKKyAgfQorCisgIHVpbnQ4X3QgbW9kdWxlOworCisgIGlmKHBpbiA+PSBrTnVtSGVhZGVycykgeworICAgIHBpbiA9IHJlbWFwTVhQQ2hhbm5lbChwaW4pOworICAgIG1vZHVsZSA9IDE7CisgIH0gZWxzZSB7CisgICAgbW9kdWxlID0gMDsKKyAgfQorCisgIGNvdW50ZXItPmNvdW50ZXItPndyaXRlQ29uZmlnX0Rvd25Tb3VyY2VfTW9kdWxlKG1vZHVsZSwgc3RhdHVzKTsKKyAgY291bnRlci0+Y291bnRlci0+d3JpdGVDb25maWdfRG93blNvdXJjZV9DaGFubmVsKHBpbiwgc3RhdHVzKTsKKyAgY291bnRlci0+Y291bnRlci0+d3JpdGVDb25maWdfRG93blNvdXJjZV9BbmFsb2dUcmlnZ2VyKGFuYWxvZ1RyaWdnZXIsIHN0YXR1cyk7CisKKyAgc2V0Q291bnRlckRvd25Tb3VyY2VFZGdlKGNvdW50ZXJfcG9pbnRlciwgdHJ1ZSwgZmFsc2UsIHN0YXR1cyk7CisgIGNvdW50ZXItPmNvdW50ZXItPnN0cm9iZVJlc2V0KHN0YXR1cyk7Cit9CisKKy8qKgorICogU2V0IHRoZSBlZGdlIHNlbnNpdGl2aXR5IG9uIGEgZG93biBjb3VudGluZyBzb3VyY2UuCisgKiBTZXQgdGhlIGRvd24gc291cmNlIHRvIGVpdGhlciBkZXRlY3QgcmlzaW5nIGVkZ2VzIG9yIGZhbGxpbmcgZWRnZXMuCisgKi8KK3ZvaWQgc2V0Q291bnRlckRvd25Tb3VyY2VFZGdlKHZvaWQqIGNvdW50ZXJfcG9pbnRlciwgYm9vbCByaXNpbmdFZGdlLCBib29sIGZhbGxpbmdFZGdlLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgQ291bnRlciogY291bnRlciA9IChDb3VudGVyKikgY291bnRlcl9wb2ludGVyOworICBjb3VudGVyLT5jb3VudGVyLT53cml0ZUNvbmZpZ19Eb3duUmlzaW5nRWRnZShyaXNpbmdFZGdlLCBzdGF0dXMpOworICBjb3VudGVyLT5jb3VudGVyLT53cml0ZUNvbmZpZ19Eb3duRmFsbGluZ0VkZ2UoZmFsbGluZ0VkZ2UsIHN0YXR1cyk7Cit9CisKKy8qKgorICogRGlzYWJsZSB0aGUgZG93biBjb3VudGluZyBzb3VyY2UgdG8gdGhlIGNvdW50ZXIuCisgKi8KK3ZvaWQgY2xlYXJDb3VudGVyRG93blNvdXJjZSh2b2lkKiBjb3VudGVyX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cykgeworICBDb3VudGVyKiBjb3VudGVyID0gKENvdW50ZXIqKSBjb3VudGVyX3BvaW50ZXI7CisgIGNvdW50ZXItPmNvdW50ZXItPndyaXRlQ29uZmlnX0Rvd25GYWxsaW5nRWRnZShmYWxzZSwgc3RhdHVzKTsKKyAgY291bnRlci0+Y291bnRlci0+d3JpdGVDb25maWdfRG93blJpc2luZ0VkZ2UoZmFsc2UsIHN0YXR1cyk7CisgIC8vIEluZGV4IDAgb2YgZGlnaXRhbCBpcyBhbHdheXMgMC4KKyAgY291bnRlci0+Y291bnRlci0+d3JpdGVDb25maWdfRG93blNvdXJjZV9DaGFubmVsKDAsIHN0YXR1cyk7CisgIGNvdW50ZXItPmNvdW50ZXItPndyaXRlQ29uZmlnX0Rvd25Tb3VyY2VfQW5hbG9nVHJpZ2dlcihmYWxzZSwgc3RhdHVzKTsKK30KKworLyoqCisgKiBTZXQgc3RhbmRhcmQgdXAgLyBkb3duIGNvdW50aW5nIG1vZGUgb24gdGhpcyBjb3VudGVyLgorICogVXAgYW5kIGRvd24gY291bnRzIGFyZSBzb3VyY2VkIGluZGVwZW5kZW50bHkgZnJvbSB0d28gaW5wdXRzLgorICovCit2b2lkIHNldENvdW50ZXJVcERvd25Nb2RlKHZvaWQqIGNvdW50ZXJfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisgIENvdW50ZXIqIGNvdW50ZXIgPSAoQ291bnRlciopIGNvdW50ZXJfcG9pbnRlcjsKKyAgY291bnRlci0+Y291bnRlci0+d3JpdGVDb25maWdfTW9kZShrVHdvUHVsc2UsIHN0YXR1cyk7Cit9CisKKy8qKgorICogU2V0IGV4dGVybmFsIGRpcmVjdGlvbiBtb2RlIG9uIHRoaXMgY291bnRlci4KKyAqIENvdW50cyBhcmUgc291cmNlZCBvbiB0aGUgVXAgY291bnRlciBpbnB1dC4KKyAqIFRoZSBEb3duIGNvdW50ZXIgaW5wdXQgcmVwcmVzZW50cyB0aGUgZGlyZWN0aW9uIHRvIGNvdW50LgorICovCit2b2lkIHNldENvdW50ZXJFeHRlcm5hbERpcmVjdGlvbk1vZGUodm9pZCogY291bnRlcl9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgQ291bnRlciogY291bnRlciA9IChDb3VudGVyKikgY291bnRlcl9wb2ludGVyOworICBjb3VudGVyLT5jb3VudGVyLT53cml0ZUNvbmZpZ19Nb2RlKGtFeHRlcm5hbERpcmVjdGlvbiwgc3RhdHVzKTsKK30KKworLyoqCisgKiBTZXQgU2VtaS1wZXJpb2QgbW9kZSBvbiB0aGlzIGNvdW50ZXIuCisgKiBDb3VudHMgdXAgb24gYm90aCByaXNpbmcgYW5kIGZhbGxpbmcgZWRnZXMuCisgKi8KK3ZvaWQgc2V0Q291bnRlclNlbWlQZXJpb2RNb2RlKHZvaWQqIGNvdW50ZXJfcG9pbnRlciwgYm9vbCBoaWdoU2VtaVBlcmlvZCwgaW50MzJfdCAqc3RhdHVzKSB7CisgIENvdW50ZXIqIGNvdW50ZXIgPSAoQ291bnRlciopIGNvdW50ZXJfcG9pbnRlcjsKKyAgY291bnRlci0+Y291bnRlci0+d3JpdGVDb25maWdfTW9kZShrU2VtaXBlcmlvZCwgc3RhdHVzKTsKKyAgY291bnRlci0+Y291bnRlci0+d3JpdGVDb25maWdfVXBSaXNpbmdFZGdlKGhpZ2hTZW1pUGVyaW9kLCBzdGF0dXMpOworICBzZXRDb3VudGVyVXBkYXRlV2hlbkVtcHR5KGNvdW50ZXJfcG9pbnRlciwgZmFsc2UsIHN0YXR1cyk7Cit9CisKKy8qKgorICogQ29uZmlndXJlIHRoZSBjb3VudGVyIHRvIGNvdW50IGluIHVwIG9yIGRvd24gYmFzZWQgb24gdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgcHVsc2UuCisgKiBUaGlzIG1vZGUgaXMgbW9zdCB1c2VmdWwgZm9yIGRpcmVjdGlvbiBzZW5zaXRpdmUgZ2VhciB0b290aCBzZW5zb3JzLgorICogQHBhcmFtIHRocmVzaG9sZCBUaGUgcHVsc2UgbGVuZ3RoIGJleW9uZCB3aGljaCB0aGUgY291bnRlciBjb3VudHMgdGhlIG9wcG9zaXRlIGRpcmVjdGlvbi4gIFVuaXRzIGFyZSBzZWNvbmRzLgorICovCit2b2lkIHNldENvdW50ZXJQdWxzZUxlbmd0aE1vZGUodm9pZCogY291bnRlcl9wb2ludGVyLCBkb3VibGUgdGhyZXNob2xkLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgQ291bnRlciogY291bnRlciA9IChDb3VudGVyKikgY291bnRlcl9wb2ludGVyOworICBjb3VudGVyLT5jb3VudGVyLT53cml0ZUNvbmZpZ19Nb2RlKGtQdWxzZUxlbmd0aCwgc3RhdHVzKTsKKyAgY291bnRlci0+Y291bnRlci0+d3JpdGVDb25maWdfUHVsc2VMZW5ndGhUaHJlc2hvbGQoKHVpbnQzMl90KSh0aHJlc2hvbGQgKiAxLjBlNikgKiBrU3lzdGVtQ2xvY2tUaWNrc1Blck1pY3Jvc2Vjb25kLCBzdGF0dXMpOworfQorCisvKioKKyAqIEdldCB0aGUgU2FtcGxlcyB0byBBdmVyYWdlIHdoaWNoIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgb2YgdGhlIHRpbWVyIHRvCisgKiBhdmVyYWdlIHdoZW4gY2FsY3VsYXRpbmcgdGhlIHBlcmlvZC4gUGVyZm9ybSBhdmVyYWdpbmcgdG8gYWNjb3VudCBmb3IKKyAqIG1lY2hhbmljYWwgaW1wZXJmZWN0aW9ucyBvciBhcyBvdmVyc2FtcGxpbmcgdG8gaW5jcmVhc2UgcmVzb2x1dGlvbi4KKyAqIEByZXR1cm4gU2FtcGxlc1RvQXZlcmFnZSBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgYmVpbmcgYXZlcmFnZWQgKGZyb20gMSB0byAxMjcpCisgKi8KK2ludDMyX3QgZ2V0Q291bnRlclNhbXBsZXNUb0F2ZXJhZ2Uodm9pZCogY291bnRlcl9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgQ291bnRlciogY291bnRlciA9IChDb3VudGVyKikgY291bnRlcl9wb2ludGVyOworICByZXR1cm4gY291bnRlci0+Y291bnRlci0+cmVhZFRpbWVyQ29uZmlnX0F2ZXJhZ2VTaXplKHN0YXR1cyk7Cit9CisKKy8qKgorICogU2V0IHRoZSBTYW1wbGVzIHRvIEF2ZXJhZ2Ugd2hpY2ggc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBvZiB0aGUgdGltZXIgdG8KKyAqIGF2ZXJhZ2Ugd2hlbiBjYWxjdWxhdGluZyB0aGUgcGVyaW9kLiBQZXJmb3JtIGF2ZXJhZ2luZyB0byBhY2NvdW50IGZvcgorICogbWVjaGFuaWNhbCBpbXBlcmZlY3Rpb25zIG9yIGFzIG92ZXJzYW1wbGluZyB0byBpbmNyZWFzZSByZXNvbHV0aW9uLgorICogQHBhcmFtIHNhbXBsZXNUb0F2ZXJhZ2UgVGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIGF2ZXJhZ2UgZnJvbSAxIHRvIDEyNy4KKyAqLwordm9pZCBzZXRDb3VudGVyU2FtcGxlc1RvQXZlcmFnZSh2b2lkKiBjb3VudGVyX3BvaW50ZXIsIGludCBzYW1wbGVzVG9BdmVyYWdlLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgQ291bnRlciogY291bnRlciA9IChDb3VudGVyKikgY291bnRlcl9wb2ludGVyOworICBpZiAoc2FtcGxlc1RvQXZlcmFnZSA8IDEgfHwgc2FtcGxlc1RvQXZlcmFnZSA+IDEyNykgeworCSpzdGF0dXMgPSBQQVJBTUVURVJfT1VUX09GX1JBTkdFOworICB9CisgIGNvdW50ZXItPmNvdW50ZXItPndyaXRlVGltZXJDb25maWdfQXZlcmFnZVNpemUoc2FtcGxlc1RvQXZlcmFnZSwgc3RhdHVzKTsKK30KKworLyoqCisgKiBSZXNldCB0aGUgQ291bnRlciB0byB6ZXJvLgorICogU2V0IHRoZSBjb3VudGVyIHZhbHVlIHRvIHplcm8uIFRoaXMgZG9lc24ndCBlZmZlY3QgdGhlIHJ1bm5pbmcgc3RhdGUgb2YgdGhlIGNvdW50ZXIsIGp1c3Qgc2V0cworICogdGhlIGN1cnJlbnQgdmFsdWUgdG8gemVyby4KKyAqLwordm9pZCByZXNldENvdW50ZXIodm9pZCogY291bnRlcl9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgQ291bnRlciogY291bnRlciA9IChDb3VudGVyKikgY291bnRlcl9wb2ludGVyOworICBjb3VudGVyLT5jb3VudGVyLT5zdHJvYmVSZXNldChzdGF0dXMpOworfQorCisvKioKKyAqIFJlYWQgdGhlIGN1cnJlbnQgY291bnRlciB2YWx1ZS4KKyAqIFJlYWQgdGhlIHZhbHVlIGF0IHRoaXMgaW5zdGFudC4gSXQgbWF5IHN0aWxsIGJlIHJ1bm5pbmcsIHNvIGl0IHJlZmxlY3RzIHRoZSBjdXJyZW50IHZhbHVlLiBOZXh0CisgKiB0aW1lIGl0IGlzIHJlYWQsIGl0IG1pZ2h0IGhhdmUgYSBkaWZmZXJlbnQgdmFsdWUuCisgKi8KK2ludDMyX3QgZ2V0Q291bnRlcih2b2lkKiBjb3VudGVyX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cykgeworICBDb3VudGVyKiBjb3VudGVyID0gKENvdW50ZXIqKSBjb3VudGVyX3BvaW50ZXI7CisgIGludDMyX3QgdmFsdWUgPSBjb3VudGVyLT5jb3VudGVyLT5yZWFkT3V0cHV0X1ZhbHVlKHN0YXR1cyk7CisgIHJldHVybiB2YWx1ZTsKK30KKworLyoKKyAqIEdldCB0aGUgUGVyaW9kIG9mIHRoZSBtb3N0IHJlY2VudCBjb3VudC4KKyAqIFJldHVybnMgdGhlIHRpbWUgaW50ZXJ2YWwgb2YgdGhlIG1vc3QgcmVjZW50IGNvdW50LiBUaGlzIGNhbiBiZSB1c2VkIGZvciB2ZWxvY2l0eSBjYWxjdWxhdGlvbnMKKyAqIHRvIGRldGVybWluZSBzaGFmdCBzcGVlZC4KKyAqIEByZXR1cm5zIFRoZSBwZXJpb2Qgb2YgdGhlIGxhc3QgdHdvIHB1bHNlcyBpbiB1bml0cyBvZiBzZWNvbmRzLgorICovCitkb3VibGUgZ2V0Q291bnRlclBlcmlvZCh2b2lkKiBjb3VudGVyX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cykgeworICBDb3VudGVyKiBjb3VudGVyID0gKENvdW50ZXIqKSBjb3VudGVyX3BvaW50ZXI7CisgIHRDb3VudGVyOjp0VGltZXJPdXRwdXQgb3V0cHV0ID0gY291bnRlci0+Y291bnRlci0+cmVhZFRpbWVyT3V0cHV0KHN0YXR1cyk7CisgIGRvdWJsZSBwZXJpb2Q7CisgIGlmIChvdXRwdXQuU3RhbGxlZCkJeworCS8vIFJldHVybiBpbmZpbml0eQorCWRvdWJsZSB6ZXJvID0gMC4wOworCXBlcmlvZCA9IDEuMCAvIHplcm87CisgIH0gZWxzZSB7CisJLy8gb3V0cHV0LlBlcmlvZCBpcyBhIGZpeGVkIHBvaW50IG51bWJlciB0aGF0IGNvdW50cyBieSAyICgyNCBiaXRzLCAyNSBpbnRlZ2VyIGJpdHMpCisJcGVyaW9kID0gKGRvdWJsZSkob3V0cHV0LlBlcmlvZCA8PCAxKSAvIChkb3VibGUpb3V0cHV0LkNvdW50OworICB9CisgIHJldHVybiBwZXJpb2QgKiAyLjVlLTg7ICAvLyByZXN1bHQgKiB0aW1lYmFzZSAoY3VycmVudGx5IDQwbnMpCit9CisKKy8qKgorICogU2V0IHRoZSBtYXhpbXVtIHBlcmlvZCB3aGVyZSB0aGUgZGV2aWNlIGlzIHN0aWxsIGNvbnNpZGVyZWQgIm1vdmluZyIuCisgKiBTZXRzIHRoZSBtYXhpbXVtIHBlcmlvZCB3aGVyZSB0aGUgZGV2aWNlIGlzIGNvbnNpZGVyZWQgbW92aW5nLiBUaGlzIHZhbHVlIGlzIHVzZWQgdG8gZGV0ZXJtaW5lCisgKiB0aGUgInN0b3BwZWQiIHN0YXRlIG9mIHRoZSBjb3VudGVyIHVzaW5nIHRoZSBHZXRTdG9wcGVkIG1ldGhvZC4KKyAqIEBwYXJhbSBtYXhQZXJpb2QgVGhlIG1heGltdW0gcGVyaW9kIHdoZXJlIHRoZSBjb3VudGVkIGRldmljZSBpcyBjb25zaWRlcmVkIG1vdmluZyBpbgorICogc2Vjb25kcy4KKyAqLwordm9pZCBzZXRDb3VudGVyTWF4UGVyaW9kKHZvaWQqIGNvdW50ZXJfcG9pbnRlciwgZG91YmxlIG1heFBlcmlvZCwgaW50MzJfdCAqc3RhdHVzKSB7CisgIENvdW50ZXIqIGNvdW50ZXIgPSAoQ291bnRlciopIGNvdW50ZXJfcG9pbnRlcjsKKyAgY291bnRlci0+Y291bnRlci0+d3JpdGVUaW1lckNvbmZpZ19TdGFsbFBlcmlvZCgodWludDMyX3QpKG1heFBlcmlvZCAqIDQuMGU4KSwgc3RhdHVzKTsKK30KKworLyoqCisgKiBTZWxlY3Qgd2hldGhlciB5b3Ugd2FudCB0byBjb250aW51ZSB1cGRhdGluZyB0aGUgZXZlbnQgdGltZXIgb3V0cHV0IHdoZW4gdGhlcmUgYXJlIG5vIHNhbXBsZXMgY2FwdHVyZWQuCisgKiBUaGUgb3V0cHV0IG9mIHRoZSBldmVudCB0aW1lciBoYXMgYSBidWZmZXIgb2YgcGVyaW9kcyB0aGF0IGFyZSBhdmVyYWdlZCBhbmQgcG9zdGVkIHRvCisgKiBhIHJlZ2lzdGVyIG9uIHRoZSBGUEdBLiAgV2hlbiB0aGUgdGltZXIgZGV0ZWN0cyB0aGF0IHRoZSBldmVudCBzb3VyY2UgaGFzIHN0b3BwZWQKKyAqIChiYXNlZCBvbiB0aGUgTWF4UGVyaW9kKSB0aGUgYnVmZmVyIG9mIHNhbXBsZXMgdG8gYmUgYXZlcmFnZWQgaXMgZW1wdGllZC4gIElmIHlvdQorICogZW5hYmxlIHRoZSB1cGRhdGUgd2hlbiBlbXB0eSwgeW91IHdpbGwgYmUgbm90aWZpZWQgb2YgdGhlIHN0b3BwZWQgc291cmNlIGFuZCB0aGUgZXZlbnQKKyAqIHRpbWUgd2lsbCByZXBvcnQgMCBzYW1wbGVzLiAgSWYgeW91IGRpc2FibGUgdXBkYXRlIHdoZW4gZW1wdHksIHRoZSBtb3N0IHJlY2VudCBhdmVyYWdlCisgKiB3aWxsIHJlbWFpbiBvbiB0aGUgb3V0cHV0IHVudGlsIGEgbmV3IHNhbXBsZSBpcyBhY3F1aXJlZC4gIFlvdSB3aWxsIG5ldmVyIHNlZSAwIHNhbXBsZXMKKyAqIG91dHB1dCAoZXhjZXB0IHdoZW4gdGhlcmUgaGF2ZSBiZWVuIG5vIGV2ZW50cyBzaW5jZSBhbiBGUEdBIHJlc2V0KSBhbmQgeW91IHdpbGwgbGlrZWx5IG5vdAorICogc2VlIHRoZSBzdG9wcGVkIGJpdCBiZWNvbWUgdHJ1ZSAoc2luY2UgaXQgaXMgdXBkYXRlZCBhdCB0aGUgZW5kIG9mIGFuIGF2ZXJhZ2UgYW5kIHRoZXJlIGFyZQorICogbm8gc2FtcGxlcyB0byBhdmVyYWdlKS4KKyAqLwordm9pZCBzZXRDb3VudGVyVXBkYXRlV2hlbkVtcHR5KHZvaWQqIGNvdW50ZXJfcG9pbnRlciwgYm9vbCBlbmFibGVkLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgQ291bnRlciogY291bnRlciA9IChDb3VudGVyKikgY291bnRlcl9wb2ludGVyOworICBjb3VudGVyLT5jb3VudGVyLT53cml0ZVRpbWVyQ29uZmlnX1VwZGF0ZVdoZW5FbXB0eShlbmFibGVkLCBzdGF0dXMpOworfQorCisvKioKKyAqIERldGVybWluZSBpZiB0aGUgY2xvY2sgaXMgc3RvcHBlZC4KKyAqIERldGVybWluZSBpZiB0aGUgY2xvY2tlZCBpbnB1dCBpcyBzdG9wcGVkIGJhc2VkIG9uIHRoZSBNYXhQZXJpb2QgdmFsdWUgc2V0IHVzaW5nIHRoZQorICogU2V0TWF4UGVyaW9kIG1ldGhvZC4gSWYgdGhlIGNsb2NrIGV4Y2VlZHMgdGhlIE1heFBlcmlvZCwgdGhlbiB0aGUgZGV2aWNlIChhbmQgY291bnRlcikgYXJlCisgKiBhc3N1bWVkIHRvIGJlIHN0b3BwZWQgYW5kIGl0IHJldHVybnMgdHJ1ZS4KKyAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIHRoZSBtb3N0IHJlY2VudCBjb3VudGVyIHBlcmlvZCBleGNlZWRzIHRoZSBNYXhQZXJpb2QgdmFsdWUgc2V0IGJ5CisgKiBTZXRNYXhQZXJpb2QuCisgKi8KK2Jvb2wgZ2V0Q291bnRlclN0b3BwZWQodm9pZCogY291bnRlcl9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgQ291bnRlciogY291bnRlciA9IChDb3VudGVyKikgY291bnRlcl9wb2ludGVyOworICByZXR1cm4gY291bnRlci0+Y291bnRlci0+cmVhZFRpbWVyT3V0cHV0X1N0YWxsZWQoc3RhdHVzKTsKK30KKworLyoqCisgKiBUaGUgbGFzdCBkaXJlY3Rpb24gdGhlIGNvdW50ZXIgdmFsdWUgY2hhbmdlZC4KKyAqIEByZXR1cm4gVGhlIGxhc3QgZGlyZWN0aW9uIHRoZSBjb3VudGVyIHZhbHVlIGNoYW5nZWQuCisgKi8KK2Jvb2wgZ2V0Q291bnRlckRpcmVjdGlvbih2b2lkKiBjb3VudGVyX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cykgeworICBDb3VudGVyKiBjb3VudGVyID0gKENvdW50ZXIqKSBjb3VudGVyX3BvaW50ZXI7CisgIGJvb2wgdmFsdWUgPSBjb3VudGVyLT5jb3VudGVyLT5yZWFkT3V0cHV0X0RpcmVjdGlvbihzdGF0dXMpOworICByZXR1cm4gdmFsdWU7Cit9CisKKy8qKgorICogU2V0IHRoZSBDb3VudGVyIHRvIHJldHVybiByZXZlcnNlZCBzZW5zaW5nIG9uIHRoZSBkaXJlY3Rpb24uCisgKiBUaGlzIGFsbG93cyBjb3VudGVycyB0byBjaGFuZ2UgdGhlIGRpcmVjdGlvbiB0aGV5IGFyZSBjb3VudGluZyBpbiB0aGUgY2FzZSBvZiAxWCBhbmQgMlgKKyAqIHF1YWRyYXR1cmUgZW5jb2Rpbmcgb25seS4gQW55IG90aGVyIGNvdW50ZXIgbW9kZSBpc24ndCBzdXBwb3J0ZWQuCisgKiBAcGFyYW0gcmV2ZXJzZURpcmVjdGlvbiB0cnVlIGlmIHRoZSB2YWx1ZSBjb3VudGVkIHNob3VsZCBiZSBuZWdhdGVkLgorICovCit2b2lkIHNldENvdW50ZXJSZXZlcnNlRGlyZWN0aW9uKHZvaWQqIGNvdW50ZXJfcG9pbnRlciwgYm9vbCByZXZlcnNlRGlyZWN0aW9uLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgQ291bnRlciogY291bnRlciA9IChDb3VudGVyKikgY291bnRlcl9wb2ludGVyOworICBpZiAoY291bnRlci0+Y291bnRlci0+cmVhZENvbmZpZ19Nb2RlKHN0YXR1cykgPT0ga0V4dGVybmFsRGlyZWN0aW9uKSB7CisJaWYgKHJldmVyc2VEaXJlY3Rpb24pCisJICBzZXRDb3VudGVyRG93blNvdXJjZUVkZ2UoY291bnRlcl9wb2ludGVyLCB0cnVlLCB0cnVlLCBzdGF0dXMpOworCWVsc2UKKwkgIHNldENvdW50ZXJEb3duU291cmNlRWRnZShjb3VudGVyX3BvaW50ZXIsIGZhbHNlLCB0cnVlLCBzdGF0dXMpOworICB9Cit9CisKK3N0cnVjdCBlbmNvZGVyX3QgeworICB0RW5jb2RlciogZW5jb2RlcjsKKyAgdWludDMyX3QgaW5kZXg7Cit9OwordHlwZWRlZiBzdHJ1Y3QgZW5jb2Rlcl90IEVuY29kZXI7CisKK3N0YXRpYyBjb25zdCBkb3VibGUgREVDT0RJTkdfU0NBTElOR19GQUNUT1IgPSAwLjI1Oworc3RhdGljIFJlc291cmNlICpxdWFkRW5jb2RlcnMgPSBOVUxMOworCit2b2lkKiBpbml0aWFsaXplRW5jb2Rlcih1aW50OF90IHBvcnRfYV9tb2R1bGUsIHVpbnQzMl90IHBvcnRfYV9waW4sIGJvb2wgcG9ydF9hX2FuYWxvZ190cmlnZ2VyLAorCQkJCQkJdWludDhfdCBwb3J0X2JfbW9kdWxlLCB1aW50MzJfdCBwb3J0X2JfcGluLCBib29sIHBvcnRfYl9hbmFsb2dfdHJpZ2dlciwKKwkJCQkJCWJvb2wgcmV2ZXJzZURpcmVjdGlvbiwgaW50MzJfdCAqaW5kZXgsIGludDMyX3QgKnN0YXR1cykgeworCisgIC8vIEluaXRpYWxpemUgZW5jb2RlciBzdHJ1Y3R1cmUKKyAgRW5jb2RlciogZW5jb2RlciA9IG5ldyBFbmNvZGVyKCk7CisKKyAgaWYocG9ydF9hX3BpbiA+PSBrTnVtSGVhZGVycykgeworICAgIHBvcnRfYV9waW4gPSByZW1hcE1YUENoYW5uZWwocG9ydF9hX3Bpbik7CisgICAgcG9ydF9hX21vZHVsZSA9IDE7CisgIH0KKworICBpZihwb3J0X2JfcGluID49IGtOdW1IZWFkZXJzKSB7CisgICAgcG9ydF9iX3BpbiA9IHJlbWFwTVhQQ2hhbm5lbChwb3J0X2JfcGluKTsKKyAgICBwb3J0X2JfbW9kdWxlID0gMTsKKyAgfQorCisgIFJlc291cmNlOjpDcmVhdGVSZXNvdXJjZU9iamVjdCgmcXVhZEVuY29kZXJzLCB0RW5jb2Rlcjo6a051bVN5c3RlbXMpOworICBlbmNvZGVyLT5pbmRleCA9IHF1YWRFbmNvZGVycy0+QWxsb2NhdGUoIjRYIEVuY29kZXIiKTsKKyAgKmluZGV4ID0gZW5jb2Rlci0+aW5kZXg7CisgIC8vIFRPRE86IGlmIChpbmRleCA9PSB+MHVsKSB7IENsb25lRXJyb3IocXVhZEVuY29kZXJzKTsgcmV0dXJuOyB9CisgIGVuY29kZXItPmVuY29kZXIgPSB0RW5jb2Rlcjo6Y3JlYXRlKGVuY29kZXItPmluZGV4LCBzdGF0dXMpOworICBlbmNvZGVyLT5lbmNvZGVyLT53cml0ZUNvbmZpZ19BU291cmNlX01vZHVsZShwb3J0X2FfbW9kdWxlLCBzdGF0dXMpOworICBlbmNvZGVyLT5lbmNvZGVyLT53cml0ZUNvbmZpZ19BU291cmNlX0NoYW5uZWwocG9ydF9hX3Bpbiwgc3RhdHVzKTsKKyAgZW5jb2Rlci0+ZW5jb2Rlci0+d3JpdGVDb25maWdfQVNvdXJjZV9BbmFsb2dUcmlnZ2VyKHBvcnRfYV9hbmFsb2dfdHJpZ2dlciwgc3RhdHVzKTsKKyAgZW5jb2Rlci0+ZW5jb2Rlci0+d3JpdGVDb25maWdfQlNvdXJjZV9Nb2R1bGUocG9ydF9iX21vZHVsZSwgc3RhdHVzKTsKKyAgZW5jb2Rlci0+ZW5jb2Rlci0+d3JpdGVDb25maWdfQlNvdXJjZV9DaGFubmVsKHBvcnRfYl9waW4sIHN0YXR1cyk7CisgIGVuY29kZXItPmVuY29kZXItPndyaXRlQ29uZmlnX0JTb3VyY2VfQW5hbG9nVHJpZ2dlcihwb3J0X2JfYW5hbG9nX3RyaWdnZXIsIHN0YXR1cyk7CisgIGVuY29kZXItPmVuY29kZXItPnN0cm9iZVJlc2V0KHN0YXR1cyk7CisgIGVuY29kZXItPmVuY29kZXItPndyaXRlQ29uZmlnX1JldmVyc2UocmV2ZXJzZURpcmVjdGlvbiwgc3RhdHVzKTsKKyAgZW5jb2Rlci0+ZW5jb2Rlci0+d3JpdGVUaW1lckNvbmZpZ19BdmVyYWdlU2l6ZSg0LCBzdGF0dXMpOworCisgIHJldHVybiBlbmNvZGVyOworfQorCit2b2lkIGZyZWVFbmNvZGVyKHZvaWQqIGVuY29kZXJfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisgIEVuY29kZXIqIGVuY29kZXIgPSAoRW5jb2RlciopIGVuY29kZXJfcG9pbnRlcjsKKyAgcXVhZEVuY29kZXJzLT5GcmVlKGVuY29kZXItPmluZGV4KTsKKyAgZGVsZXRlIGVuY29kZXItPmVuY29kZXI7Cit9CisKKy8qKgorICogUmVzZXQgdGhlIEVuY29kZXIgZGlzdGFuY2UgdG8gemVyby4KKyAqIFJlc2V0cyB0aGUgY3VycmVudCBjb3VudCB0byB6ZXJvIG9uIHRoZSBlbmNvZGVyLgorICovCit2b2lkIHJlc2V0RW5jb2Rlcih2b2lkKiBlbmNvZGVyX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cykgeworICBFbmNvZGVyKiBlbmNvZGVyID0gKEVuY29kZXIqKSBlbmNvZGVyX3BvaW50ZXI7CisgIGVuY29kZXItPmVuY29kZXItPnN0cm9iZVJlc2V0KHN0YXR1cyk7Cit9CisKKy8qKgorICogR2V0cyB0aGUgcmF3IHZhbHVlIGZyb20gdGhlIGVuY29kZXIuCisgKiBUaGUgcmF3IHZhbHVlIGlzIHRoZSBhY3R1YWwgY291bnQgdW5zY2FsZWQgYnkgdGhlIDF4LCAyeCwgb3IgNHggc2NhbGUKKyAqIGZhY3Rvci4KKyAqIEByZXR1cm4gQ3VycmVudCByYXcgY291bnQgZnJvbSB0aGUgZW5jb2RlcgorICovCitpbnQzMl90IGdldEVuY29kZXIodm9pZCogZW5jb2Rlcl9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgRW5jb2RlciogZW5jb2RlciA9IChFbmNvZGVyKikgZW5jb2Rlcl9wb2ludGVyOworICByZXR1cm4gZW5jb2Rlci0+ZW5jb2Rlci0+cmVhZE91dHB1dF9WYWx1ZShzdGF0dXMpOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIHBlcmlvZCBvZiB0aGUgbW9zdCByZWNlbnQgcHVsc2UuCisgKiBSZXR1cm5zIHRoZSBwZXJpb2Qgb2YgdGhlIG1vc3QgcmVjZW50IEVuY29kZXIgcHVsc2UgaW4gc2Vjb25kcy4KKyAqIFRoaXMgbWV0aG9kIGNvbXBlbnN0YXRlcyBmb3IgdGhlIGRlY29kaW5nIHR5cGUuCisgKgorICogQGRlcHJlY2F0ZWQgVXNlIEdldFJhdGUoKSBpbiBmYXZvciBvZiB0aGlzIG1ldGhvZC4gIFRoaXMgcmV0dXJucyB1bnNjYWxlZCBwZXJpb2RzIGFuZCBHZXRSYXRlKCkgc2NhbGVzIHVzaW5nIHZhbHVlIGZyb20gU2V0RGlzdGFuY2VQZXJQdWxzZSgpLgorICoKKyAqIEByZXR1cm4gUGVyaW9kIGluIHNlY29uZHMgb2YgdGhlIG1vc3QgcmVjZW50IHB1bHNlLgorICovCitkb3VibGUgZ2V0RW5jb2RlclBlcmlvZCh2b2lkKiBlbmNvZGVyX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cykgeworICBFbmNvZGVyKiBlbmNvZGVyID0gKEVuY29kZXIqKSBlbmNvZGVyX3BvaW50ZXI7CisgIHRFbmNvZGVyOjp0VGltZXJPdXRwdXQgb3V0cHV0ID0gZW5jb2Rlci0+ZW5jb2Rlci0+cmVhZFRpbWVyT3V0cHV0KHN0YXR1cyk7CisgIGRvdWJsZSB2YWx1ZTsKKyAgaWYgKG91dHB1dC5TdGFsbGVkKSB7CisJLy8gUmV0dXJuIGluZmluaXR5CisJZG91YmxlIHplcm8gPSAwLjA7CisJdmFsdWUgPSAxLjAgLyB6ZXJvOworICB9IGVsc2UgeworCS8vIG91dHB1dC5QZXJpb2QgaXMgYSBmaXhlZCBwb2ludCBudW1iZXIgdGhhdCBjb3VudHMgYnkgMiAoMjQgYml0cywgMjUgaW50ZWdlciBiaXRzKQorCXZhbHVlID0gKGRvdWJsZSkob3V0cHV0LlBlcmlvZCA8PCAxKSAvIChkb3VibGUpb3V0cHV0LkNvdW50OworICB9CisgIGRvdWJsZSBtZWFzdXJlZFBlcmlvZCA9IHZhbHVlICogMi41ZS04OworICByZXR1cm4gbWVhc3VyZWRQZXJpb2QgLyBERUNPRElOR19TQ0FMSU5HX0ZBQ1RPUjsKK30KKworLyoqCisgKiBTZXRzIHRoZSBtYXhpbXVtIHBlcmlvZCBmb3Igc3RvcHBlZCBkZXRlY3Rpb24uCisgKiBTZXRzIHRoZSB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgdGhlIG1heGltdW0gcGVyaW9kIG9mIHRoZSBFbmNvZGVyIGJlZm9yZSBpdCB3aWxsIGFzc3VtZQorICogdGhhdCB0aGUgYXR0YWNoZWQgZGV2aWNlIGlzIHN0b3BwZWQuIFRoaXMgdGltZW91dCBhbGxvd3MgdXNlcnMgdG8gZGV0ZXJtaW5lIGlmIHRoZSB3aGVlbHMgb3IKKyAqIG90aGVyIHNoYWZ0IGhhcyBzdG9wcGVkIHJvdGF0aW5nLgorICogVGhpcyBtZXRob2QgY29tcGVuc2F0ZXMgZm9yIHRoZSBkZWNvZGluZyB0eXBlLgorICoKKyAqIEBkZXByZWNhdGVkIFVzZSBTZXRNaW5SYXRlKCkgaW4gZmF2b3Igb2YgdGhpcyBtZXRob2QuICBUaGlzIHRha2VzIHVuc2NhbGVkIHBlcmlvZHMgYW5kIFNldE1pblJhdGUoKSBzY2FsZXMgdXNpbmcgdmFsdWUgZnJvbSBTZXREaXN0YW5jZVBlclB1bHNlKCkuCisgKgorICogQHBhcmFtIG1heFBlcmlvZCBUaGUgbWF4aW11bSB0aW1lIGJldHdlZW4gcmlzaW5nIGFuZCBmYWxsaW5nIGVkZ2VzIGJlZm9yZSB0aGUgRlBHQSB3aWxsCisgKiByZXBvcnQgdGhlIGRldmljZSBzdG9wcGVkLiBUaGlzIGlzIGV4cHJlc3NlZCBpbiBzZWNvbmRzLgorICovCit2b2lkIHNldEVuY29kZXJNYXhQZXJpb2Qodm9pZCogZW5jb2Rlcl9wb2ludGVyLCBkb3VibGUgbWF4UGVyaW9kLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgRW5jb2RlciogZW5jb2RlciA9IChFbmNvZGVyKikgZW5jb2Rlcl9wb2ludGVyOworICBlbmNvZGVyLT5lbmNvZGVyLT53cml0ZVRpbWVyQ29uZmlnX1N0YWxsUGVyaW9kKCh1aW50MzJfdCkobWF4UGVyaW9kICogNC4wZTggKiBERUNPRElOR19TQ0FMSU5HX0ZBQ1RPUiksIHN0YXR1cyk7Cit9CisKKy8qKgorICogRGV0ZXJtaW5lIGlmIHRoZSBlbmNvZGVyIGlzIHN0b3BwZWQuCisgKiBVc2luZyB0aGUgTWF4UGVyaW9kIHZhbHVlLCBhIGJvb2xlYW4gaXMgcmV0dXJuZWQgdGhhdCBpcyB0cnVlIGlmIHRoZSBlbmNvZGVyIGlzIGNvbnNpZGVyZWQKKyAqIHN0b3BwZWQgYW5kIGZhbHNlIGlmIGl0IGlzIHN0aWxsIG1vdmluZy4gQSBzdG9wcGVkIGVuY29kZXIgaXMgb25lIHdoZXJlIHRoZSBtb3N0IHJlY2VudCBwdWxzZQorICogd2lkdGggZXhjZWVkcyB0aGUgTWF4UGVyaW9kLgorICogQHJldHVybiBUcnVlIGlmIHRoZSBlbmNvZGVyIGlzIGNvbnNpZGVyZWQgc3RvcHBlZC4KKyAqLworYm9vbCBnZXRFbmNvZGVyU3RvcHBlZCh2b2lkKiBlbmNvZGVyX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cykgeworICBFbmNvZGVyKiBlbmNvZGVyID0gKEVuY29kZXIqKSBlbmNvZGVyX3BvaW50ZXI7CisgIHJldHVybiBlbmNvZGVyLT5lbmNvZGVyLT5yZWFkVGltZXJPdXRwdXRfU3RhbGxlZChzdGF0dXMpICE9IDA7Cit9CisKKy8qKgorICogVGhlIGxhc3QgZGlyZWN0aW9uIHRoZSBlbmNvZGVyIHZhbHVlIGNoYW5nZWQuCisgKiBAcmV0dXJuIFRoZSBsYXN0IGRpcmVjdGlvbiB0aGUgZW5jb2RlciB2YWx1ZSBjaGFuZ2VkLgorICovCitib29sIGdldEVuY29kZXJEaXJlY3Rpb24odm9pZCogZW5jb2Rlcl9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgRW5jb2RlciogZW5jb2RlciA9IChFbmNvZGVyKikgZW5jb2Rlcl9wb2ludGVyOworICByZXR1cm4gZW5jb2Rlci0+ZW5jb2Rlci0+cmVhZE91dHB1dF9EaXJlY3Rpb24oc3RhdHVzKTsKK30KKworLyoqCisgKiBTZXQgdGhlIGRpcmVjdGlvbiBzZW5zaW5nIGZvciB0aGlzIGVuY29kZXIuCisgKiBUaGlzIHNldHMgdGhlIGRpcmVjdGlvbiBzZW5zaW5nIG9uIHRoZSBlbmNvZGVyIHNvIHRoYXQgaXQgY291bGQgY291bnQgaW4gdGhlIGNvcnJlY3QKKyAqIHNvZnR3YXJlIGRpcmVjdGlvbiByZWdhcmRsZXNzIG9mIHRoZSBtb3VudGluZy4KKyAqIEBwYXJhbSByZXZlcnNlRGlyZWN0aW9uIHRydWUgaWYgdGhlIGVuY29kZXIgZGlyZWN0aW9uIHNob3VsZCBiZSByZXZlcnNlZAorICovCit2b2lkIHNldEVuY29kZXJSZXZlcnNlRGlyZWN0aW9uKHZvaWQqIGVuY29kZXJfcG9pbnRlciwgYm9vbCByZXZlcnNlRGlyZWN0aW9uLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgRW5jb2RlciogZW5jb2RlciA9IChFbmNvZGVyKikgZW5jb2Rlcl9wb2ludGVyOworICBlbmNvZGVyLT5lbmNvZGVyLT53cml0ZUNvbmZpZ19SZXZlcnNlKHJldmVyc2VEaXJlY3Rpb24sIHN0YXR1cyk7Cit9CisKKy8qKgorICogU2V0IHRoZSBTYW1wbGVzIHRvIEF2ZXJhZ2Ugd2hpY2ggc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBvZiB0aGUgdGltZXIgdG8KKyAqIGF2ZXJhZ2Ugd2hlbiBjYWxjdWxhdGluZyB0aGUgcGVyaW9kLiBQZXJmb3JtIGF2ZXJhZ2luZyB0byBhY2NvdW50IGZvcgorICogbWVjaGFuaWNhbCBpbXBlcmZlY3Rpb25zIG9yIGFzIG92ZXJzYW1wbGluZyB0byBpbmNyZWFzZSByZXNvbHV0aW9uLgorICogQHBhcmFtIHNhbXBsZXNUb0F2ZXJhZ2UgVGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIGF2ZXJhZ2UgZnJvbSAxIHRvIDEyNy4KKyAqLwordm9pZCBzZXRFbmNvZGVyU2FtcGxlc1RvQXZlcmFnZSh2b2lkKiBlbmNvZGVyX3BvaW50ZXIsIHVpbnQzMl90IHNhbXBsZXNUb0F2ZXJhZ2UsIGludDMyX3QgKnN0YXR1cykgeworICBFbmNvZGVyKiBlbmNvZGVyID0gKEVuY29kZXIqKSBlbmNvZGVyX3BvaW50ZXI7CisgIGlmIChzYW1wbGVzVG9BdmVyYWdlIDwgMSB8fCBzYW1wbGVzVG9BdmVyYWdlID4gMTI3KSB7CisJKnN0YXR1cyA9IFBBUkFNRVRFUl9PVVRfT0ZfUkFOR0U7CisgIH0KKyAgZW5jb2Rlci0+ZW5jb2Rlci0+d3JpdGVUaW1lckNvbmZpZ19BdmVyYWdlU2l6ZShzYW1wbGVzVG9BdmVyYWdlLCBzdGF0dXMpOworfQorCisvKioKKyAqIEdldCB0aGUgU2FtcGxlcyB0byBBdmVyYWdlIHdoaWNoIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgb2YgdGhlIHRpbWVyIHRvCisgKiBhdmVyYWdlIHdoZW4gY2FsY3VsYXRpbmcgdGhlIHBlcmlvZC4gUGVyZm9ybSBhdmVyYWdpbmcgdG8gYWNjb3VudCBmb3IKKyAqIG1lY2hhbmljYWwgaW1wZXJmZWN0aW9ucyBvciBhcyBvdmVyc2FtcGxpbmcgdG8gaW5jcmVhc2UgcmVzb2x1dGlvbi4KKyAqIEByZXR1cm4gU2FtcGxlc1RvQXZlcmFnZSBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgYmVpbmcgYXZlcmFnZWQgKGZyb20gMSB0byAxMjcpCisgKi8KK3VpbnQzMl90IGdldEVuY29kZXJTYW1wbGVzVG9BdmVyYWdlKHZvaWQqIGVuY29kZXJfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisgIEVuY29kZXIqIGVuY29kZXIgPSAoRW5jb2RlciopIGVuY29kZXJfcG9pbnRlcjsKKyAgcmV0dXJuIGVuY29kZXItPmVuY29kZXItPnJlYWRUaW1lckNvbmZpZ19BdmVyYWdlU2l6ZShzdGF0dXMpOworfQorCisvKioKKyAqIEdldCB0aGUgbG9vcCB0aW1pbmcgb2YgdGhlIFBXTSBzeXN0ZW0KKyAqCisgKiBAcmV0dXJuIFRoZSBsb29wIHRpbWUKKyAqLwordWludDE2X3QgZ2V0TG9vcFRpbWluZyhpbnQzMl90ICpzdGF0dXMpIHsKKyAgcmV0dXJuIHB3bVN5c3RlbS0+cmVhZExvb3BUaW1pbmcoc3RhdHVzKTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgdGhlIHNwaSBwb3J0LiBPcGVucyB0aGUgcG9ydCBpZiBuZWNlc3NhcnkgYW5kIHNhdmVzIHRoZSBoYW5kbGUuCisgKiBJZiBvcGVuaW5nIHRoZSBNWFAgcG9ydCwgYWxzbyBzZXRzIHVwIHRoZSBwaW4gZnVuY3Rpb25zIGFwcHJvcHJpYXRlbHkKKyAqIEBwYXJhbSBwb3J0IFRoZSBudW1iZXIgb2YgdGhlIHBvcnQgdG8gdXNlLiAwLTMgZm9yIE9uYm9hcmQgQ1MwLUNTMiwgNCBmb3IgTVhQCisgKi8KK3ZvaWQgc3BpSW5pdGlhbGl6ZSh1aW50OF90IHBvcnQsIGludDMyX3QgKnN0YXR1cykgeworCWlmKHNwaVN5c3RlbSA9PSBOVUxMKQorCQlzcGlTeXN0ZW0gPSB0U1BJOjpjcmVhdGUoc3RhdHVzKTsKKwlpZihzcGlHZXRIYW5kbGUocG9ydCkgIT0wICkgcmV0dXJuOworCXN3aXRjaChwb3J0KXsKKwljYXNlIDA6CisJCXNwaVNldEhhbmRsZSgwLCBzcGlsaWJfb3BlbigiL2Rldi9zcGlkZXYwLjAiKSk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJc3BpU2V0SGFuZGxlKDEsIHNwaWxpYl9vcGVuKCIvZGV2L3NwaWRldjAuMSIpKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlzcGlTZXRIYW5kbGUoMiwgc3BpbGliX29wZW4oIi9kZXYvc3BpZGV2MC4yIikpOworCQlicmVhazsKKwljYXNlIDM6CisJCXNwaVNldEhhbmRsZSgzLCBzcGlsaWJfb3BlbigiL2Rldi9zcGlkZXYwLjMiKSk7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJaW5pdGlhbGl6ZURpZ2l0YWwoc3RhdHVzKTsKKwkJaWYoIWFsbG9jYXRlRElPKGdldFBvcnQoMTQpLCBmYWxzZSwgc3RhdHVzKSl7cHJpbnRmKCJGYWlsZWQgdG8gYWxsb2NhdGUgRElPIDE0XG4iKTsgcmV0dXJuO30KKwkJaWYoIWFsbG9jYXRlRElPKGdldFBvcnQoMTUpLCBmYWxzZSwgc3RhdHVzKSkge3ByaW50ZigiRmFpbGVkIHRvIGFsbG9jYXRlIERJTyAxNVxuIik7IHJldHVybjt9CisJCWlmKCFhbGxvY2F0ZURJTyhnZXRQb3J0KDE2KSwgdHJ1ZSwgc3RhdHVzKSkge3ByaW50ZigiRmFpbGVkIHRvIGFsbG9jYXRlIERJTyAxNlxuIik7IHJldHVybjt9CisJCWlmKCFhbGxvY2F0ZURJTyhnZXRQb3J0KDE3KSwgZmFsc2UsIHN0YXR1cykpIHtwcmludGYoIkZhaWxlZCB0byBhbGxvY2F0ZSBESU8gMTdcbiIpOyByZXR1cm47fQorCQlkaWdpdGFsU3lzdGVtLT53cml0ZUVuYWJsZU1YUFNwZWNpYWxGdW5jdGlvbihkaWdpdGFsU3lzdGVtLT5yZWFkRW5hYmxlTVhQU3BlY2lhbEZ1bmN0aW9uKHN0YXR1cyl8MHgwMEYwLCBzdGF0dXMpOworCQlzcGlTZXRIYW5kbGUoNCwgc3BpbGliX29wZW4oIi9kZXYvc3BpZGV2MS4wIikpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuOworfQorCisvKioKKyAqIEdlbmVyaWMgdHJhbnNhY3Rpb24uCisgKgorICogVGhpcyBpcyBhIGxvd2VyLWxldmVsIGludGVyZmFjZSB0byB0aGUgc3BpIGhhcmR3YXJlIGdpdmluZyB5b3UgbW9yZSBjb250cm9sIG92ZXIgZWFjaCB0cmFuc2FjdGlvbi4KKyAqCisgKiBAcGFyYW0gcG9ydCBUaGUgbnVtYmVyIG9mIHRoZSBwb3J0IHRvIHVzZS4gMC0zIGZvciBPbmJvYXJkIENTMC1DUzIsIDQgZm9yIE1YUAorICogQHBhcmFtIGRhdGFUb1NlbmQgQnVmZmVyIG9mIGRhdGEgdG8gc2VuZCBhcyBwYXJ0IG9mIHRoZSB0cmFuc2FjdGlvbi4KKyAqIEBwYXJhbSBkYXRhUmVjZWl2ZWQgQnVmZmVyIHRvIHJlYWQgZGF0YSBpbnRvLgorICogQHBhcmFtIHNpemUgTnVtYmVyIG9mIGJ5dGVzIHRvIHRyYW5zZmVyLiBbMC4uN10KKyAqIEByZXR1cm4gTnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkLCAtMSBmb3IgZXJyb3IKKyAqLworaW50MzJfdCBzcGlUcmFuc2FjdGlvbih1aW50OF90IHBvcnQsIHVpbnQ4X3QgKmRhdGFUb1NlbmQsIHVpbnQ4X3QgKmRhdGFSZWNlaXZlZCwgdWludDhfdCBzaXplKQoreworCTo6c3RkOjp1bmlxdWVfbG9jazxSZWVudHJhbnRNdXRleD4gc3luYyhzcGlHZXRTZW1hcGhvcmUocG9ydCkpOworCXJldHVybiBzcGlsaWJfd3JpdGVyZWFkKHNwaUdldEhhbmRsZShwb3J0KSwgKGNvbnN0IGNoYXIqKSBkYXRhVG9TZW5kLCAoY2hhciopIGRhdGFSZWNlaXZlZCwgKGludDMyX3QpIHNpemUpOworfQorCisvKioKKyAqIEV4ZWN1dGUgYSB3cml0ZSB0cmFuc2FjdGlvbiB3aXRoIHRoZSBkZXZpY2UuCisgKgorICogV3JpdGUgdG8gYSBkZXZpY2UgYW5kIHdhaXQgdW50aWwgdGhlIHRyYW5zYWN0aW9uIGlzIGNvbXBsZXRlLgorICoKKyAqIEBwYXJhbSBwb3J0IFRoZSBudW1iZXIgb2YgdGhlIHBvcnQgdG8gdXNlLiAwLTMgZm9yIE9uYm9hcmQgQ1MwLUNTMiwgNCBmb3IgTVhQCisgKiBAcGFyYW0gZGF0VG9TZW5kIFRoZSBkYXRhIHRvIHdyaXRlIHRvIHRoZSByZWdpc3RlciBvbiB0aGUgZGV2aWNlLgorICogQHBhcmFtIHNlbmRTaXplIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgd3JpdHRlbgorICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uIC0xIGZvciBhbiBlcnJvcgorICovCitpbnQzMl90IHNwaVdyaXRlKHVpbnQ4X3QgcG9ydCwgdWludDhfdCogZGF0YVRvU2VuZCwgdWludDhfdCBzZW5kU2l6ZSkKK3sKKwk6OnN0ZDo6dW5pcXVlX2xvY2s8UmVlbnRyYW50TXV0ZXg+IHN5bmMoc3BpR2V0U2VtYXBob3JlKHBvcnQpKTsKKwlyZXR1cm4gc3BpbGliX3dyaXRlKHNwaUdldEhhbmRsZShwb3J0KSwgKGNvbnN0IGNoYXIqKSBkYXRhVG9TZW5kLCAoaW50MzJfdCkgc2VuZFNpemUpOworfQorCisvKioKKyAqIEV4ZWN1dGUgYSByZWFkIGZyb20gdGhlIGRldmljZS4KKyAqCisgKiAgIFRoaXMgbWV0aGRvZCBkb2VzIG5vdCB3cml0ZSBhbnkgZGF0YSBvdXQgdG8gdGhlIGRldmljZQorICogICBNb3N0IHNwaSBkZXZpY2VzIHdpbGwgcmVxdWlyZSBhIHJlZ2lzdGVyIGFkZHJlc3MgdG8gYmUgd3JpdHRlbiBiZWZvcmUKKyAqICAgdGhleSBiZWdpbiByZXR1cm5pbmcgZGF0YQorICoKKyAqIEBwYXJhbSBwb3J0IFRoZSBudW1iZXIgb2YgdGhlIHBvcnQgdG8gdXNlLiAwLTMgZm9yIE9uYm9hcmQgQ1MwLUNTMiwgNCBmb3IgTVhQCisgKiBAcGFyYW0gYnVmZmVyIEEgcG9pbnRlciB0byB0aGUgYXJyYXkgb2YgYnl0ZXMgdG8gc3RvcmUgdGhlIGRhdGEgcmVhZCBmcm9tIHRoZSBkZXZpY2UuCisgKiBAcGFyYW0gY291bnQgVGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkIGluIHRoZSB0cmFuc2FjdGlvbi4gWzEuLjddCisgKiBAcmV0dXJuIE51bWJlciBvZiBieXRlcyByZWFkLiAtMSBmb3IgZXJyb3IuCisgKi8KK2ludDMyX3Qgc3BpUmVhZCh1aW50OF90IHBvcnQsIHVpbnQ4X3QgKmJ1ZmZlciwgdWludDhfdCBjb3VudCkKK3sKKwk6OnN0ZDo6dW5pcXVlX2xvY2s8UmVlbnRyYW50TXV0ZXg+IHN5bmMoc3BpR2V0U2VtYXBob3JlKHBvcnQpKTsKKwlyZXR1cm4gc3BpbGliX3JlYWQoc3BpR2V0SGFuZGxlKHBvcnQpLCAoY2hhciopIGJ1ZmZlciwgKGludDMyX3QpIGNvdW50KTsKK30KKworLyoqCisgKiBDbG9zZSB0aGUgU1BJIHBvcnQKKyAqCisgKiBAcGFyYW0gcG9ydCBUaGUgbnVtYmVyIG9mIHRoZSBwb3J0IHRvIHVzZS4gMC0zIGZvciBPbmJvYXJkIENTMC1DUzIsIDQgZm9yIE1YUAorICovCit2b2lkIHNwaUNsb3NlKHVpbnQ4X3QgcG9ydCkgeworCTo6c3RkOjp1bmlxdWVfbG9jazxSZWVudHJhbnRNdXRleD4gc3luYyhzcGlHZXRTZW1hcGhvcmUocG9ydCkpOworCXNwaWxpYl9jbG9zZShzcGlHZXRIYW5kbGUocG9ydCkpOworCXNwaVNldEhhbmRsZShwb3J0LCAwKTsKKwlyZXR1cm47Cit9CisKKy8qKgorICogU2V0IHRoZSBjbG9jayBzcGVlZCBmb3IgdGhlIFNQSSBidXMuCisgKgorICogQHBhcmFtIHBvcnQgVGhlIG51bWJlciBvZiB0aGUgcG9ydCB0byB1c2UuIDAtMyBmb3IgT25ib2FyZCBDUzAtQ1MyLCA0IGZvciBNWFAKKyAqIEBwYXJhbSBzcGVlZCBUaGUgc3BlZWQgaW4gSHogKDAtMU1IeikKKyAqLwordm9pZCBzcGlTZXRTcGVlZCh1aW50OF90IHBvcnQsIHVpbnQzMl90IHNwZWVkKSB7CisJOjpzdGQ6OnVuaXF1ZV9sb2NrPFJlZW50cmFudE11dGV4PiBzeW5jKHNwaUdldFNlbWFwaG9yZShwb3J0KSk7CisJc3BpbGliX3NldHNwZWVkKHNwaUdldEhhbmRsZShwb3J0KSwgc3BlZWQpOworfQorCisvKioKKyAqIFNldCB0aGUgU1BJIG9wdGlvbnMKKyAqCisgKiBAcGFyYW0gcG9ydCBUaGUgbnVtYmVyIG9mIHRoZSBwb3J0IHRvIHVzZS4gMC0zIGZvciBPbmJvYXJkIENTMC1DUzIsIDQgZm9yIE1YUAorICogQHBhcmFtIG1zYl9maXJzdCBUcnVlIHRvIHdyaXRlIHRoZSBNU0IgZmlyc3QsIEZhbHNlIGZvciBMU0IgZmlyc3QKKyAqIEBwYXJhbSBzYW1wbGVfb25fdHJhaWxpbmcgVHJ1ZSB0byBzYW1wbGUgb24gdGhlIHRyYWlsaW5nIGVkZ2UsIEZhbHNlIHRvIHNhbXBsZSBvbiB0aGUgbGVhZGluZyBlZGdlCisgKiBAcGFyYW0gY2xrX2lkbGVfaGlnaCBUcnVlIHRvIHNldCB0aGUgY2xvY2sgdG8gYWN0aXZlIGxvdywgRmFsc2UgdG8gc2V0IHRoZSBjbG9jayBhY3RpdmUgaGlnaAorICovCit2b2lkIHNwaVNldE9wdHModWludDhfdCBwb3J0LCBpbnQgbXNiX2ZpcnN0LCBpbnQgc2FtcGxlX29uX3RyYWlsaW5nLCBpbnQgY2xrX2lkbGVfaGlnaCkgeworCTo6c3RkOjp1bmlxdWVfbG9jazxSZWVudHJhbnRNdXRleD4gc3luYyhzcGlHZXRTZW1hcGhvcmUocG9ydCkpOworCXNwaWxpYl9zZXRvcHRzKHNwaUdldEhhbmRsZShwb3J0KSwgbXNiX2ZpcnN0LCBzYW1wbGVfb25fdHJhaWxpbmcsIGNsa19pZGxlX2hpZ2gpOworfQorCisvKioKKyAqIFNldCB0aGUgQ1MgQWN0aXZlIGhpZ2ggZm9yIGEgU1BJIHBvcnQKKyAqCisgKiBAcGFyYW0gcG9ydCBUaGUgbnVtYmVyIG9mIHRoZSBwb3J0IHRvIHVzZS4gMC0zIGZvciBPbmJvYXJkIENTMC1DUzIsIDQgZm9yIE1YUAorICovCit2b2lkIHNwaVNldENoaXBTZWxlY3RBY3RpdmVIaWdoKHVpbnQ4X3QgcG9ydCwgaW50MzJfdCAqc3RhdHVzKXsKKwk6OnN0ZDo6dW5pcXVlX2xvY2s8UmVlbnRyYW50TXV0ZXg+IHN5bmMoc3BpR2V0U2VtYXBob3JlKHBvcnQpKTsKKwlpZihwb3J0IDwgNCkKKwl7CisJCXNwaVN5c3RlbS0+d3JpdGVDaGlwU2VsZWN0QWN0aXZlSGlnaF9IZHIoc3BpU3lzdGVtLT5yZWFkQ2hpcFNlbGVjdEFjdGl2ZUhpZ2hfSGRyKHN0YXR1cykgfCAoMTw8cG9ydCksIHN0YXR1cyk7CisJfQorCWVsc2UKKwl7CisJCXNwaVN5c3RlbS0+d3JpdGVDaGlwU2VsZWN0QWN0aXZlSGlnaF9NWFAoMSwgc3RhdHVzKTsKKwl9Cit9CisKKy8qKgorICogU2V0IHRoZSBDUyBBY3RpdmUgbG93IGZvciBhIFNQSSBwb3J0CisgKgorICogQHBhcmFtIHBvcnQgVGhlIG51bWJlciBvZiB0aGUgcG9ydCB0byB1c2UuIDAtMyBmb3IgT25ib2FyZCBDUzAtQ1MyLCA0IGZvciBNWFAKKyAqLwordm9pZCBzcGlTZXRDaGlwU2VsZWN0QWN0aXZlTG93KHVpbnQ4X3QgcG9ydCwgaW50MzJfdCAqc3RhdHVzKXsKKwk6OnN0ZDo6dW5pcXVlX2xvY2s8UmVlbnRyYW50TXV0ZXg+IHN5bmMoc3BpR2V0U2VtYXBob3JlKHBvcnQpKTsKKwlpZihwb3J0IDwgNCkKKwl7CisJCXNwaVN5c3RlbS0+d3JpdGVDaGlwU2VsZWN0QWN0aXZlSGlnaF9IZHIoc3BpU3lzdGVtLT5yZWFkQ2hpcFNlbGVjdEFjdGl2ZUhpZ2hfSGRyKHN0YXR1cykgJiB+KDE8PHBvcnQpLCBzdGF0dXMpOworCX0KKwllbHNlCisJeworCQlzcGlTeXN0ZW0tPndyaXRlQ2hpcFNlbGVjdEFjdGl2ZUhpZ2hfTVhQKDAsIHN0YXR1cyk7CisJfQorfQorCisvKioKKyAqIEdldCB0aGUgc3RvcmVkIGhhbmRsZSBmb3IgYSBTUEkgcG9ydAorICoKKyAqIEBwYXJhbSBwb3J0IFRoZSBudW1iZXIgb2YgdGhlIHBvcnQgdG8gdXNlLiAwLTMgZm9yIE9uYm9hcmQgQ1MwLUNTMiwgNCBmb3IgTVhQCisgKiBAcmV0dXJuIFRoZSBzdG9yZWQgaGFuZGxlIGZvciB0aGUgU1BJIHBvcnQuIDAgcmVwcmVzZW50cyBubyBzdG9yZWQgaGFuZGxlLgorICovCitpbnQzMl90IHNwaUdldEhhbmRsZSh1aW50OF90IHBvcnQpeworCTo6c3RkOjp1bmlxdWVfbG9jazxSZWVudHJhbnRNdXRleD4gc3luYyhzcGlHZXRTZW1hcGhvcmUocG9ydCkpOworCXN3aXRjaChwb3J0KXsKKwljYXNlIDA6CisJCXJldHVybiBtX3NwaUNTMEhhbmRsZTsKKwljYXNlIDE6CisJCXJldHVybiBtX3NwaUNTMUhhbmRsZTsKKwljYXNlIDI6CisJCXJldHVybiBtX3NwaUNTMkhhbmRsZTsKKwljYXNlIDM6CisJCXJldHVybiBtX3NwaUNTM0hhbmRsZTsKKwljYXNlIDQ6CisJCXJldHVybiBtX3NwaU1YUEhhbmRsZTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qKgorICogU2V0IHRoZSBzdG9yZWQgaGFuZGxlIGZvciBhIFNQSSBwb3J0CisgKgorICogQHBhcmFtIHBvcnQgVGhlIG51bWJlciBvZiB0aGUgcG9ydCB0byB1c2UuIDAtMyBmb3IgT25ib2FyZCBDUzAtQ1MyLCA0IGZvciBNWFAuCisgKiBAcGFyYW0gaGFuZGxlIFRoZSB2YWx1ZSBvZiB0aGUgaGFuZGxlIGZvciB0aGUgcG9ydC4KKyAqLwordm9pZCBzcGlTZXRIYW5kbGUodWludDhfdCBwb3J0LCBpbnQzMl90IGhhbmRsZSl7CisJOjpzdGQ6OnVuaXF1ZV9sb2NrPFJlZW50cmFudE11dGV4PiBzeW5jKHNwaUdldFNlbWFwaG9yZShwb3J0KSk7CisJc3dpdGNoKHBvcnQpeworCWNhc2UgMDoKKwkJbV9zcGlDUzBIYW5kbGUgPSBoYW5kbGU7CisJCWJyZWFrOworCWNhc2UgMToKKwkJbV9zcGlDUzFIYW5kbGUgPSBoYW5kbGU7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJbV9zcGlDUzJIYW5kbGUgPSBoYW5kbGU7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJbV9zcGlDUzNIYW5kbGUgPSBoYW5kbGU7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJbV9zcGlNWFBIYW5kbGUgPSBoYW5kbGU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworLyoqCisgKiBHZXQgdGhlIHNlbWFwaG9yZSBmb3IgYSBTUEkgcG9ydAorICoKKyAqIEBwYXJhbSBwb3J0IFRoZSBudW1iZXIgb2YgdGhlIHBvcnQgdG8gdXNlLiAwLTMgZm9yIE9uYm9hcmQgQ1MwLUNTMiwgNCBmb3IgTVhQCisgKiBAcmV0dXJuIFRoZSBzZW1hcGhvcmUgZm9yIHRoZSBTUEkgcG9ydC4KKyAqLworUmVlbnRyYW50TXV0ZXgmIHNwaUdldFNlbWFwaG9yZSh1aW50OF90IHBvcnQpIHsKKwlpZihwb3J0IDwgNCkKKwkJcmV0dXJuIHNwaU9uYm9hcmRTZW1hcGhvcmU7CisJZWxzZQorCQlyZXR1cm4gc3BpTVhQU2VtYXBob3JlOworfQorCisvKgorICogSW5pdGlhbGl6ZSB0aGUgSTJDIHBvcnQuIE9wZW5zIHRoZSBwb3J0IGlmIG5lY2Vzc2FyeSBhbmQgc2F2ZXMgdGhlIGhhbmRsZS4KKyAqIElmIG9wZW5pbmcgdGhlIE1YUCBwb3J0LCBhbHNvIHNldHMgdXAgdGhlIHBpbiBmdW5jdGlvbnMgYXBwcm9wcmlhdGVseQorICogQHBhcmFtIHBvcnQgVGhlIHBvcnQgdG8gb3BlbiwgMCBmb3IgdGhlIG9uLWJvYXJkLCAxIGZvciB0aGUgTVhQLgorICovCit2b2lkIGkyQ0luaXRpYWxpemUodWludDhfdCBwb3J0LCBpbnQzMl90ICpzdGF0dXMpIHsKKwlpbml0aWFsaXplRGlnaXRhbChzdGF0dXMpOworCisJaWYocG9ydCA+IDEpCisJeworCQkvL1NldCBwb3J0IG91dCBvZiByYW5nZSBlcnJvciBoZXJlCisJCXJldHVybjsKKwl9CisKKwlSZWVudHJhbnRNdXRleCAmbG9jayA9IHBvcnQgPT0gMCA/IGRpZ2l0YWxJMkNPbkJvYXJkU2VtYXBob3JlIDogZGlnaXRhbEkyQ01YUFNlbWFwaG9yZTsKKwl7CisgICAgOjpzdGQ6OnVuaXF1ZV9sb2NrPFJlZW50cmFudE11dGV4PiBzeW5jKGxvY2spOworCQlpZihwb3J0ID09IDApIHsKKwkJCWkyQ09uYm9hcmRPYmpDb3VudCsrOworCQkJaWYgKGkyQ09uQm9hcmRIYW5kbGUgPiAwKSByZXR1cm47CisJCQlpMkNPbkJvYXJkSGFuZGxlID0gaTJjbGliX29wZW4oIi9kZXYvaTJjLTIiKTsKKwkJfSBlbHNlIGlmKHBvcnQgPT0gMSkgeworCQkJaTJDTVhQT2JqQ291bnQrKzsKKwkJCWlmIChpMkNNWFBIYW5kbGUgPiAwKSByZXR1cm47CisJCQlpZighYWxsb2NhdGVESU8oZ2V0UG9ydCgyNCksIGZhbHNlLCBzdGF0dXMpKSByZXR1cm47CisJCQlpZighYWxsb2NhdGVESU8oZ2V0UG9ydCgyNSksIGZhbHNlLCBzdGF0dXMpKSByZXR1cm47CisJCQlkaWdpdGFsU3lzdGVtLT53cml0ZUVuYWJsZU1YUFNwZWNpYWxGdW5jdGlvbihkaWdpdGFsU3lzdGVtLT5yZWFkRW5hYmxlTVhQU3BlY2lhbEZ1bmN0aW9uKHN0YXR1cyl8MHhDMDAwLCBzdGF0dXMpOworCQkJaTJDTVhQSGFuZGxlID0gaTJjbGliX29wZW4oIi9kZXYvaTJjLTEiKTsKKwkJfQorCXJldHVybjsKKwl9Cit9CisKKy8qKgorICogR2VuZXJpYyB0cmFuc2FjdGlvbi4KKyAqCisgKiBUaGlzIGlzIGEgbG93ZXItbGV2ZWwgaW50ZXJmYWNlIHRvIHRoZSBJMkMgaGFyZHdhcmUgZ2l2aW5nIHlvdSBtb3JlIGNvbnRyb2wgb3ZlciBlYWNoIHRyYW5zYWN0aW9uLgorICoKKyAqIEBwYXJhbSBkYXRhVG9TZW5kIEJ1ZmZlciBvZiBkYXRhIHRvIHNlbmQgYXMgcGFydCBvZiB0aGUgdHJhbnNhY3Rpb24uCisgKiBAcGFyYW0gc2VuZFNpemUgTnVtYmVyIG9mIGJ5dGVzIHRvIHNlbmQgYXMgcGFydCBvZiB0aGUgdHJhbnNhY3Rpb24uIFswLi42XQorICogQHBhcmFtIGRhdGFSZWNlaXZlZCBCdWZmZXIgdG8gcmVhZCBkYXRhIGludG8uCisgKiBAcGFyYW0gcmVjZWl2ZVNpemUgTnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgZnJvbSB0aGUgZGV2aWNlLiBbMC4uN10KKyAqIEByZXR1cm4gVHJhbnNmZXIgQWJvcnRlZC4uLiBmYWxzZSBmb3Igc3VjY2VzcywgdHJ1ZSBmb3IgYWJvcnRlZC4KKyAqLworaW50MzJfdCBpMkNUcmFuc2FjdGlvbih1aW50OF90IHBvcnQsIHVpbnQ4X3QgZGV2aWNlQWRkcmVzcywgdWludDhfdCAqZGF0YVRvU2VuZCwgdWludDhfdCBzZW5kU2l6ZSwgdWludDhfdCAqZGF0YVJlY2VpdmVkLCB1aW50OF90IHJlY2VpdmVTaXplKQoreworCWlmKHBvcnQgPiAxKSB7CisJCS8vU2V0IHBvcnQgb3V0IG9mIHJhbmdlIGVycm9yIGhlcmUKKwkJcmV0dXJuIC0xOworCX0KKwkvKmlmIChzZW5kU2l6ZSA+IDYpIC8vIE9wdGlvbmFsLCBwcm92aWRlcyBiZXR0ZXIgZXJyb3IgbWVzc2FnZS4JVE9ETzogQXJlIHRoZXNlIGxpbWl0cyBzdGlsbCByaWdodD8gSW1wbGVtZW50IGVycm9yLiBDaGVjayBmb3IgbnVsbCBidWZmZXIKKwl7CisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFBhcmFtZXRlck91dE9mUmFuZ2UsICJzZW5kU2l6ZSIpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJaWYgKHJlY2VpdmVTaXplID4gNykgLy8gT3B0aW9uYWwsIHByb3ZpZGVzIGJldHRlciBlcnJvciBtZXNzYWdlLgorCXsKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoUGFyYW1ldGVyT3V0T2ZSYW5nZSwgInJlY2VpdmVTaXplIik7CisJCXJldHVybiB0cnVlOworCX0qLworCWludDMyX3QgaGFuZGxlID0gcG9ydCA9PSAwID8gaTJDT25Cb2FyZEhhbmRsZTppMkNNWFBIYW5kbGU7CisJUmVlbnRyYW50TXV0ZXggJmxvY2sgPSBwb3J0ID09IDAgPyBkaWdpdGFsSTJDT25Cb2FyZFNlbWFwaG9yZSA6IGRpZ2l0YWxJMkNNWFBTZW1hcGhvcmU7CisKKwl7CisgICAgOjpzdGQ6OnVuaXF1ZV9sb2NrPFJlZW50cmFudE11dGV4PiBzeW5jKGxvY2spOworCQlyZXR1cm4gaTJjbGliX3dyaXRlcmVhZChoYW5kbGUsIGRldmljZUFkZHJlc3MsIChjb25zdCBjaGFyKikgZGF0YVRvU2VuZCwgKGludDMyX3QpIHNlbmRTaXplLCAoY2hhciopIGRhdGFSZWNlaXZlZCwgKGludDMyX3QpIHJlY2VpdmVTaXplKTsKKwl9Cit9CisKKy8qKgorICogRXhlY3V0ZSBhIHdyaXRlIHRyYW5zYWN0aW9uIHdpdGggdGhlIGRldmljZS4KKyAqCisgKiBXcml0ZSBhIHNpbmdsZSBieXRlIHRvIGEgcmVnaXN0ZXIgb24gYSBkZXZpY2UgYW5kIHdhaXQgdW50aWwgdGhlCisgKiAgIHRyYW5zYWN0aW9uIGlzIGNvbXBsZXRlLgorICoKKyAqIEBwYXJhbSByZWdpc3RlckFkZHJlc3MgVGhlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lzdGVyIG9uIHRoZSBkZXZpY2UgdG8gYmUgd3JpdHRlbi4KKyAqIEBwYXJhbSBkYXRhIFRoZSBieXRlIHRvIHdyaXRlIHRvIHRoZSByZWdpc3RlciBvbiB0aGUgZGV2aWNlLgorICogQHJldHVybiBUcmFuc2ZlciBBYm9ydGVkLi4uIGZhbHNlIGZvciBzdWNjZXNzLCB0cnVlIGZvciBhYm9ydGVkLgorICovCitpbnQzMl90IGkyQ1dyaXRlKHVpbnQ4X3QgcG9ydCwgdWludDhfdCBkZXZpY2VBZGRyZXNzLCB1aW50OF90KiBkYXRhVG9TZW5kLCB1aW50OF90IHNlbmRTaXplKQoreworCWlmKHBvcnQgPiAxKSB7CisJCS8vU2V0IHBvcnQgb3V0IG9mIHJhbmdlIGVycm9yIGhlcmUKKwkJcmV0dXJuIC0xOworCX0KKwkvKmlmIChzZW5kU2l6ZSA+IDYpIC8vIE9wdGlvbmFsLCBwcm92aWRlcyBiZXR0ZXIgZXJyb3IgbWVzc2FnZS4JVE9ETzogQXJlIHRoZXNlIGxpbWl0cyBzdGlsbCByaWdodD8gSW1wbGVtZW50IGVycm9yLiBDaGVjayBmb3IgbnVsbCBidWZmZXIKKwl7CisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFBhcmFtZXRlck91dE9mUmFuZ2UsICJzZW5kU2l6ZSIpOworCQlyZXR1cm4gdHJ1ZTsKKwl9Ki8KKwlpbnQzMl90IGhhbmRsZSA9IHBvcnQgPT0gMCA/IGkyQ09uQm9hcmRIYW5kbGU6aTJDTVhQSGFuZGxlOworCVJlZW50cmFudE11dGV4ICZsb2NrID0gcG9ydCA9PSAwID8gZGlnaXRhbEkyQ09uQm9hcmRTZW1hcGhvcmUgOiBkaWdpdGFsSTJDTVhQU2VtYXBob3JlOworCXsKKyAgICA6OnN0ZDo6dW5pcXVlX2xvY2s8UmVlbnRyYW50TXV0ZXg+IHN5bmMobG9jayk7CisJCXJldHVybiBpMmNsaWJfd3JpdGUoaGFuZGxlLCBkZXZpY2VBZGRyZXNzLCAoY29uc3QgY2hhciopIGRhdGFUb1NlbmQsIChpbnQzMl90KSBzZW5kU2l6ZSk7CisJfQorfQorCisvKioKKyAqIEV4ZWN1dGUgYSByZWFkIHRyYW5zYWN0aW9uIHdpdGggdGhlIGRldmljZS4KKyAqCisgKiBSZWFkIDEgdG8gNyBieXRlcyBmcm9tIGEgZGV2aWNlLgorICogTW9zdCBJMkMgZGV2aWNlcyB3aWxsIGF1dG8taW5jcmVtZW50IHRoZSByZWdpc3RlciBwb2ludGVyIGludGVybmFsbHkKKyAqICAgYWxsb3dpbmcgeW91IHRvIHJlYWQgdXAgdG8gNyBjb25zZWN1dGl2ZSByZWdpc3RlcnMgb24gYSBkZXZpY2UgaW4gYQorICogICBzaW5nbGUgdHJhbnNhY3Rpb24uCisgKgorICogQHBhcmFtIHJlZ2lzdGVyQWRkcmVzcyBUaGUgcmVnaXN0ZXIgdG8gcmVhZCBmaXJzdCBpbiB0aGUgdHJhbnNhY3Rpb24uCisgKiBAcGFyYW0gY291bnQgVGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkIGluIHRoZSB0cmFuc2FjdGlvbi4gWzEuLjddCisgKiBAcGFyYW0gYnVmZmVyIEEgcG9pbnRlciB0byB0aGUgYXJyYXkgb2YgYnl0ZXMgdG8gc3RvcmUgdGhlIGRhdGEgcmVhZCBmcm9tIHRoZSBkZXZpY2UuCisgKiBAcmV0dXJuIFRyYW5zZmVyIEFib3J0ZWQuLi4gZmFsc2UgZm9yIHN1Y2Nlc3MsIHRydWUgZm9yIGFib3J0ZWQuCisgKi8KK2ludDMyX3QgaTJDUmVhZCh1aW50OF90IHBvcnQsIHVpbnQ4X3QgZGV2aWNlQWRkcmVzcywgdWludDhfdCAqYnVmZmVyLCB1aW50OF90IGNvdW50KQoreworCWlmKHBvcnQgPiAxKSB7CisJCS8vU2V0IHBvcnQgb3V0IG9mIHJhbmdlIGVycm9yIGhlcmUKKwkJcmV0dXJuIC0xOworCX0KKwkvKglpZiAoY291bnQgPCAxIHx8IGNvdW50ID4gNykgVG9kbzogQXJlIHRoZXNlIGxpbWl0cyBzdGlsbCByaWdodD8gSW1wbGVtZW50IGVycm9yCisJCXsKKwkJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFBhcmFtZXRlck91dE9mUmFuZ2UsICJjb3VudCIpOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJaWYgKGJ1ZmZlciA9PSBOVUxMKQorCQl7CisJCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChOdWxsUGFyYW1ldGVyLCAiYnVmZmVyIik7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfSovCisJaW50MzJfdCBoYW5kbGUgPSBwb3J0ID09IDAgPyBpMkNPbkJvYXJkSGFuZGxlOmkyQ01YUEhhbmRsZTsKKwlSZWVudHJhbnRNdXRleCAmbG9jayA9IHBvcnQgPT0gMCA/IGRpZ2l0YWxJMkNPbkJvYXJkU2VtYXBob3JlIDogZGlnaXRhbEkyQ01YUFNlbWFwaG9yZTsKKwl7CisgICAgOjpzdGQ6OnVuaXF1ZV9sb2NrPFJlZW50cmFudE11dGV4PiBzeW5jKGxvY2spOworCQlyZXR1cm4gaTJjbGliX3JlYWQoaGFuZGxlLCBkZXZpY2VBZGRyZXNzLCAoY2hhciopIGJ1ZmZlciwgKGludDMyX3QpIGNvdW50KTsKKwl9CisKK30KKwordm9pZCBpMkNDbG9zZSh1aW50OF90IHBvcnQpIHsKKwlpZihwb3J0ID4gMSkgeworCQkvL1NldCBwb3J0IG91dCBvZiByYW5nZSBlcnJvciBoZXJlCisJCXJldHVybjsKKwl9CisJUmVlbnRyYW50TXV0ZXggJmxvY2sgPSBwb3J0ID09IDAgPyBkaWdpdGFsSTJDT25Cb2FyZFNlbWFwaG9yZSA6IGRpZ2l0YWxJMkNNWFBTZW1hcGhvcmU7CisJeworICAgIDo6c3RkOjp1bmlxdWVfbG9jazxSZWVudHJhbnRNdXRleD4gc3luYyhsb2NrKTsKKwkJaWYoKHBvcnQgPT0gMCA/IGkyQ09uYm9hcmRPYmpDb3VudC0tOmkyQ01YUE9iakNvdW50LS0pID09IDApIHsKKwkJCWludDMyX3QgaGFuZGxlID0gcG9ydCA9PSAwID8gaTJDT25Cb2FyZEhhbmRsZTppMkNNWFBIYW5kbGU7CisJCQlpMmNsaWJfY2xvc2UoaGFuZGxlKTsKKwkJfQorCX0KKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L0ZSQ19GUEdBX0NoaXBPYmplY3RfQWxpYXNlcy5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9GUkNfRlBHQV9DaGlwT2JqZWN0X0FsaWFzZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWZiYTI1Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9GUkNfRlBHQV9DaGlwT2JqZWN0X0FsaWFzZXMuaApAQCAtMCwwICsxLDEwIEBACisvLyBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKy8vIERvIE5vdCBFZGl0Li4uIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQhDQorDQorI2lmbmRlZiBfX0ZSQ19GUEdBX0NoaXBPYmplY3RfQWxpYXNlc19oX18NCisjZGVmaW5lIF9fRlJDX0ZQR0FfQ2hpcE9iamVjdF9BbGlhc2VzX2hfXw0KKw0KKyNkZWZpbmUgblJ1bnRpbWVGUEdBTmFtZXNwYWNlIG5GUkNfMjAxMl8xXzZfNA0KKyNkZWZpbmUgbkludmFyaWFudEZQR0FOYW1lc3BhY2UgbkZSQ19DMEVGXzFfMV8wDQorDQorI2VuZGlmIC8vIF9fRlJDX0ZQR0FfQ2hpcE9iamVjdF9BbGlhc2VzX2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvUm9ib1JJT19GUkNfQ2hpcE9iamVjdF9BbGlhc2VzLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L1JvYm9SSU9fRlJDX0NoaXBPYmplY3RfQWxpYXNlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYWUwODIKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L1JvYm9SSU9fRlJDX0NoaXBPYmplY3RfQWxpYXNlcy5oCkBAIC0wLDAgKzEsOSBAQAorLy8gQ29weXJpZ2h0IChjKSBOYXRpb25hbCBJbnN0cnVtZW50cyAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCisvLyBEbyBOb3QgRWRpdC4uLiB0aGlzIGZpbGUgaXMgZ2VuZXJhdGVkIQ0KKw0KKyNpZm5kZWYgX19Sb2JvUklPX0ZSQ19DaGlwT2JqZWN0X0FsaWFzZXNfaF9fDQorI2RlZmluZSBfX1JvYm9SSU9fRlJDX0NoaXBPYmplY3RfQWxpYXNlc19oX18NCisNCisjZGVmaW5lIG5Sb2JvUklPX0ZQR0FOYW1lc3BhY2UgbkZSQ18yMDE1XzFfMF9BDQorDQorI2VuZGlmIC8vIF9fUm9ib1JJT19GUkNfQ2hpcE9iamVjdF9BbGlhc2VzX2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvZnBnYWludGVyZmFjZWNhcGkvTmlGcGdhLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L2ZwZ2FpbnRlcmZhY2VjYXBpL05pRnBnYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YjA2NjUKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L2ZwZ2FpbnRlcmZhY2VjYXBpL05pRnBnYS5oCkBAIC0wLDAgKzEsMjQ1MCBAQAorLyoNCisgKiBGUEdBIEludGVyZmFjZSBDIEFQSSAxNC4wIGhlYWRlciBmaWxlLg0KKyAqDQorICogQ29weXJpZ2h0IChjKSAyMDE0LA0KKyAqIE5hdGlvbmFsIEluc3RydW1lbnRzIENvcnBvcmF0aW9uLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorICovDQorDQorI2lmbmRlZiBfX05pRnBnYV9oX18NCisjZGVmaW5lIF9fTmlGcGdhX2hfXw0KKw0KKy8qDQorICogRGV0ZXJtaW5lIHBsYXRmb3JtIGRldGFpbHMuDQorICovDQorI2lmIGRlZmluZWQoX01fSVg4NikgXA0KKyB8fCBkZWZpbmVkKF9NX1g2NCkgXA0KKyB8fCBkZWZpbmVkKF9NX0FNRDY0KSBcDQorIHx8IGRlZmluZWQoaTM4NikgXA0KKyB8fCBkZWZpbmVkKF9faTM4NikgXA0KKyB8fCBkZWZpbmVkKF9faTM4Nl9fKSBcDQorIHx8IGRlZmluZWQoX19pNDg2X18pIFwNCisgfHwgZGVmaW5lZChfX2k1ODZfXykgXA0KKyB8fCBkZWZpbmVkKF9faTY4Nl9fKSBcDQorIHx8IGRlZmluZWQoX19hbWQ2NF9fKSBcDQorIHx8IGRlZmluZWQoX19hbWQ2NCkgXA0KKyB8fCBkZWZpbmVkKF9feDg2XzY0X18pIFwNCisgfHwgZGVmaW5lZChfX3g4Nl82NCkgXA0KKyB8fCBkZWZpbmVkKF9fSUEzMl9fKSBcDQorIHx8IGRlZmluZWQoX1g4Nl8pIFwNCisgfHwgZGVmaW5lZChfX1RIV19JTlRFTF9fKSBcDQorIHx8IGRlZmluZWQoX19JODZfXykgXA0KKyB8fCBkZWZpbmVkKF9fSU5URUxfXykgXA0KKyB8fCBkZWZpbmVkKF9fWDg2X18pIFwNCisgfHwgZGVmaW5lZChfXzM4Nl9fKSBcDQorIHx8IGRlZmluZWQoX19JODZfXykgXA0KKyB8fCBkZWZpbmVkKE1fSTM4NikgXA0KKyB8fCBkZWZpbmVkKE1fSTg2KSBcDQorIHx8IGRlZmluZWQoX01fSTM4NikgXA0KKyB8fCBkZWZpbmVkKF9NX0k4NikNCisgICAjaWYgZGVmaW5lZChfV0lOMzIpIFwNCisgICAgfHwgZGVmaW5lZChfV0lONjQpIFwNCisgICAgfHwgZGVmaW5lZChfX1dJTjMyX18pIFwNCisgICAgfHwgZGVmaW5lZChfX1RPU19XSU5fXykgXA0KKyAgICB8fCBkZWZpbmVkKF9fV0lORE9XU19fKSBcDQorICAgIHx8IGRlZmluZWQoX1dJTkRPV1MpIFwNCisgICAgfHwgZGVmaW5lZChfX1dJTkRPV1NfMzg2X18pIFwNCisgICAgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQ0KKyAgICAgIC8qIEVpdGhlciBXaW5kb3dzIG9yIFBoYXIgTGFwIEVUUy4gKi8NCisgICAgICAjZGVmaW5lIE5pRnBnYV9XaW5kb3dzIDENCisgICAjZWxpZiBkZWZpbmVkKF9fbGludXhfXykgXA0KKyAgICAgIHx8IGRlZmluZWQoX19saW51eCkgXA0KKyAgICAgIHx8IGRlZmluZWQobGludXgpIFwNCisgICAgICB8fCBkZWZpbmVkKF9fZ251X2xpbnV4X18pDQorICAgICAgI2RlZmluZSBOaUZwZ2FfTGludXggMQ0KKyAgICNlbGlmIGRlZmluZWQoX19BUFBMRV9fKSAmJiBkZWZpbmVkKF9fTUFDSF9fKQ0KKyAgICAgICNkZWZpbmUgTmlGcGdhX01hY09zWCAxDQorICAgI2Vsc2UNCisgICAgICAjZXJyb3IgVW5zdXBwb3J0ZWQgT1MuDQorICAgI2VuZGlmDQorI2VsaWYgZGVmaW5lZChfX3Bvd2VycGMpIFwNCisgICB8fCBkZWZpbmVkKF9fcG93ZXJwY19fKSBcDQorICAgfHwgZGVmaW5lZChfX1BPV0VSUENfXykgXA0KKyAgIHx8IGRlZmluZWQoX19wcGNfXykgXA0KKyAgIHx8IGRlZmluZWQoX19QUEMpIFwNCisgICB8fCBkZWZpbmVkKF9NX1BQQykgXA0KKyAgIHx8IGRlZmluZWQoX0FSQ0hfUFBDKSBcDQorICAgfHwgZGVmaW5lZChfX1BQQ19fKSBcDQorICAgfHwgZGVmaW5lZChfX3BwYykNCisgICAjaWYgZGVmaW5lZChfX3Z4d29ya3MpDQorICAgICAgI2RlZmluZSBOaUZwZ2FfVnhXb3JrcyAxDQorICAgI2Vsc2UNCisgICAgICAjZXJyb3IgVW5zdXBwb3J0ZWQgT1MuDQorICAgI2VuZGlmDQorI2VsaWYgZGVmaW5lZChfX2FybV9fKSBcDQorICAgfHwgZGVmaW5lZChfX3RodW1iX18pIFwNCisgICB8fCBkZWZpbmVkKF9fVEFSR0VUX0FSQ0hfQVJNKSBcDQorICAgfHwgZGVmaW5lZChfX1RBUkdFVF9BUkNIX1RIVU1CKSBcDQorICAgfHwgZGVmaW5lZChfQVJNKSBcDQorICAgfHwgZGVmaW5lZChfTV9BUk0pIFwNCisgICB8fCBkZWZpbmVkKF9NX0FSTVQpDQorI2lmIGRlZmluZWQoX19saW51eF9fKSBcDQorIHx8IGRlZmluZWQoX19saW51eCkgXA0KKyB8fCBkZWZpbmVkKGxpbnV4KSBcDQorIHx8IGRlZmluZWQoX19nbnVfbGludXhfXykNCisgICAjZGVmaW5lIE5pRnBnYV9MaW51eCAxDQorI2Vsc2UNCisgICAgICAjZXJyb3IgVW5zdXBwb3J0ZWQgT1MuDQorICAgI2VuZGlmDQorI2Vsc2UNCisgICAjZXJyb3IgVW5zdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlLg0KKyNlbmRpZg0KKw0KKy8qDQorICogRGV0ZXJtaW5lIGNvbXBpbGVyLg0KKyAqLw0KKyNpZiBkZWZpbmVkKF9NU0NfVkVSKQ0KKyAgICNkZWZpbmUgTmlGcGdhX01zdmMgMQ0KKyNlbGlmIGRlZmluZWQoX19HTlVDX18pDQorICAgI2RlZmluZSBOaUZwZ2FfR2NjIDENCisjZWxpZiBkZWZpbmVkKF9DVklfKSAmJiAhZGVmaW5lZChfVFBDXykNCisgICAjZGVmaW5lIE5pRnBnYV9DdmkgMQ0KKyAgIC8qIEVuYWJsZXMgQ1ZJIExpYnJhcnkgUHJvdGVjdGlvbiBFcnJvcnMuICovDQorICAgI3ByYWdtYSBFbmFibGVMaWJyYXJ5UnVudGltZUNoZWNraW5nDQorI2Vsc2UNCisgICAvKiBVbmtub3duIGNvbXBpbGVyLiAqLw0KKyNlbmRpZg0KKw0KKy8qDQorICogRGV0ZXJtaW5lIGNvbXBsaWFuY2Ugd2l0aCBkaWZmZXJlbnQgQy9DKysgbGFuZ3VhZ2Ugc3RhbmRhcmRzLg0KKyAqLw0KKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQ0KKyAgICNkZWZpbmUgTmlGcGdhX0NwcCAxDQorICAgI2lmIF9fY3BsdXNwbHVzID49IDE5OTcwN0wNCisgICAgICAjZGVmaW5lIE5pRnBnYV9DcHA5OCAxDQorICAgICAgI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wNCisgICAgICAgICAjZGVmaW5lIE5pRnBnYV9DcHAxMSAxDQorICAgICAgI2VuZGlmDQorICAgI2VuZGlmDQorI2VuZGlmDQorI2lmIGRlZmluZWQoX19TVERDX18pDQorICAgI2RlZmluZSBOaUZwZ2FfQzg5IDENCisgICAjaWYgZGVmaW5lZChfX1NURENfVkVSU0lPTl9fKQ0KKyAgICAgICNkZWZpbmUgTmlGcGdhX0M5MCAxDQorICAgICAgI2lmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5NDA5TA0KKyAgICAgICAgICNkZWZpbmUgTmlGcGdhX0M5NCAxDQorICAgICAgICAgI2lmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTA0KKyAgICAgICAgICAgICNkZWZpbmUgTmlGcGdhX0M5OSAxDQorICAgICAgICAgICAgI2lmIF9fU1REQ19WRVJTSU9OX18gPj0gMjAxMTEyTA0KKyAgICAgICAgICAgICAgICNkZWZpbmUgTmlGcGdhX0MxMSAxDQorICAgICAgICAgICAgI2VuZGlmDQorICAgICAgICAgI2VuZGlmDQorICAgICAgI2VuZGlmDQorICAgI2VuZGlmDQorI2VuZGlmDQorDQorLyoNCisgKiBEZXRlcm1pbmUgYWJpbGl0eSB0byBpbmxpbmUgZnVuY3Rpb25zLg0KKyAqLw0KKyNpZiBOaUZwZ2FfQ3BwIHx8IE5pRnBnYV9DOTkNCisgICAvKiBUaGUgaW5saW5lIGtleXdvcmQgZXhpc3RzIGluIEMrKyBhbmQgQzk5LiAqLw0KKyNkZWZpbmUgTmlGcGdhX0lubGluZSBpbmxpbmUNCisjZWxpZiBOaUZwZ2FfTXN2Yw0KKyAgIC8qIFZpc3VhbCBDKysgKGF0IGxlYXN0IHNpbmNlIDYuMCkgYWxzbyBzdXBwb3J0cyBhbiBhbHRlcm5hdGUga2V5d29yZC4gKi8NCisgICAjZGVmaW5lIE5pRnBnYV9JbmxpbmUgX19pbmxpbmUNCisjZWxpZiBOaUZwZ2FfR2NjDQorICAgLyogR0NDIChhdCBsZWFzdCBzaW5jZSAyLjk1LjIpIGFsc28gc3VwcG9ydHMgYW4gYWx0ZXJuYXRlIGtleXdvcmQuICovDQorICAgI2RlZmluZSBOaUZwZ2FfSW5saW5lIF9faW5saW5lX18NCisjZWxpZiAhZGVmaW5lZChOaUZwZ2FfSW5saW5lKQ0KKyAgIC8qDQorICAgICogRGlzYWJsZSBpbmxpbmluZyBpZiBpbmxpbmUgc3VwcG9ydCBpcyB1bmtub3duLiBUbyBtYW51YWxseSBlbmFibGUNCisgICAgKiBpbmxpbmluZywgI2RlZmluZSB0aGUgZm9sbG93aW5nIG1hY3JvIGJlZm9yZSAjaW5jbHVkaW5nIE5pRnBnYS5oOg0KKyAgICAqDQorICAgICogICAgI2RlZmluZSBOaUZwZ2FfSW5saW5lIGlubGluZQ0KKyAgICAqLw0KKyAgICNkZWZpbmUgTmlGcGdhX0lubGluZQ0KKyNlbmRpZg0KKw0KKy8qDQorICogRGVmaW5lIGV4YWN0LXdpZHRoIGludGVnZXIgdHlwZXMsIGlmIHRoZXkgaGF2ZSBub3QgYWxyZWFkeSBiZWVuIGRlZmluZWQuDQorICovDQorI2lmIE5pRnBnYV9FeGFjdFdpZHRoSW50ZWdlclR5cGVzRGVmaW5lZCBcDQorIHx8IGRlZmluZWQoX1NURElOVCkgXA0KKyB8fCBkZWZpbmVkKF9TVERJTlRfSCkgXA0KKyB8fCBkZWZpbmVkKF9TVERJTlRfSF8pIFwNCisgfHwgZGVmaW5lZChfSU5UVFlQRVNfSCkgXA0KKyB8fCBkZWZpbmVkKF9JTlRUWVBFU19IXykgXA0KKyB8fCBkZWZpbmVkKF9TWVNfU1RESU5UX0gpIFwNCisgfHwgZGVmaW5lZChfU1lTX1NURElOVF9IXykgXA0KKyB8fCBkZWZpbmVkKF9TWVNfSU5UVFlQRVNfSCkgXA0KKyB8fCBkZWZpbmVkKF9TWVNfSU5UVFlQRVNfSF8pIFwNCisgfHwgZGVmaW5lZChfU1RESU5UX0hfSU5DTFVERUQpIFwNCisgfHwgZGVmaW5lZChfTVNDX1NURElOVF9IXykgXA0KKyB8fCBkZWZpbmVkKF9QU1RESU5UX0hfSU5DTFVERUQpDQorICAgLyogQXNzdW1lIHRoYXQgZXhhY3Qtd2lkdGggaW50ZWdlciB0eXBlcyBoYXZlIGFscmVhZHkgYmVlbiBkZWZpbmVkLiAqLw0KKyNlbGlmIE5pRnBnYV9WeFdvcmtzDQorICAgLyogVnhXb3JrcyAoYXQgbGVhc3QgNi4zIGFuZCBlYXJsaWVyKSBkaWQgbm90IGhhdmUgc3RkaW50LmguICovDQorICAgI2luY2x1ZGUgPHR5cGVzL3Z4VHlwZXMuaD4NCisjZWxpZiBOaUZwZ2FfQzk5IFwNCisgICB8fCBOaUZwZ2FfR2NjIC8qIEdDQyAoYXQgbGVhc3Qgc2luY2UgMy4wKSBoYXMgYSBzdGRpbnQuaC4gKi8gXA0KKyAgIHx8IGRlZmluZWQoSEFWRV9TVERJTlRfSCkNCisgICAvKiBBc3N1bWUgdGhhdCBzdGRpbnQuaCBjYW4gYmUgaW5jbHVkZWQuICovDQorICAgI2luY2x1ZGUgPHN0ZGludC5oPg0KKyNlbGlmIE5pRnBnYV9Nc3ZjIFwNCisgICB8fCBOaUZwZ2FfQ3ZpDQorICAgLyogTWFudWFsbHkgZGVmaW5lIGV4YWN0LXdpZHRoIGludGVnZXIgdHlwZXMuICovDQorICAgdHlwZWRlZiAgIHNpZ25lZCAgICBjaGFyICBpbnQ4X3Q7DQorICAgdHlwZWRlZiB1bnNpZ25lZCAgICBjaGFyIHVpbnQ4X3Q7DQorICAgdHlwZWRlZiAgICAgICAgICAgIHNob3J0ICBpbnQxNl90Ow0KKyAgIHR5cGVkZWYgdW5zaWduZWQgICBzaG9ydCB1aW50MTZfdDsNCisgICB0eXBlZGVmICAgICAgICAgICAgICBpbnQgIGludDMyX3Q7DQorICAgdHlwZWRlZiB1bnNpZ25lZCAgICAgaW50IHVpbnQzMl90Ow0KKyAgIHR5cGVkZWYgICAgICAgICAgX19pbnQ2NCAgaW50NjRfdDsNCisgICB0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgdWludDY0X3Q7DQorI2Vsc2UNCisgICAvKg0KKyAgICAqIEV4YWN0LXdpZHRoIGludGVnZXIgdHlwZXMgbXVzdCBiZSBkZWZpbmVkIGJ5IHRoZSB1c2VyLCBhbmQgdGhlIGZvbGxvd2luZw0KKyAgICAqIG1hY3JvIG11c3QgYmUgI2RlZmluZWQsIGJlZm9yZSAjaW5jbHVkaW5nIE5pRnBnYS5oOg0KKyAgICAqDQorICAgICogICAgI2RlZmluZSBOaUZwZ2FfRXhhY3RXaWR0aEludGVnZXJUeXBlc0RlZmluZWQgMQ0KKyAgICAqLw0KKyAgICNlcnJvciBFeGFjdC13aWR0aCBpbnRlZ2VyIHR5cGVzIG11c3QgYmUgZGVmaW5lZCBieSB0aGUgdXNlci4gU2VlIGNvbW1lbnQuDQorI2VuZGlmDQorDQorLyogSW5jbHVkZWQgZm9yIGRlZmluaXRpb24gb2Ygc2l6ZV90LiAqLw0KKyNpbmNsdWRlIDxzdGRkZWYuaD4NCisNCisjaWYgTmlGcGdhX0NwcA0KK2V4dGVybiAiQyINCit7DQorI2VuZGlmDQorDQorLyoqDQorICogQSBib29sZWFuIHZhbHVlOyBlaXRoZXIgTmlGcGdhX0ZhbHNlIG9yIE5pRnBnYV9UcnVlLg0KKyAqLw0KK3R5cGVkZWYgdWludDhfdCBOaUZwZ2FfQm9vbDsNCisNCisvKioNCisgKiBSZXByZXNlbnRzIGEgZmFsc2UgY29uZGl0aW9uLg0KKyAqLw0KK3N0YXRpYyBjb25zdCBOaUZwZ2FfQm9vbCBOaUZwZ2FfRmFsc2UgPSAwOw0KKw0KKy8qKg0KKyAqIFJlcHJlc2VudHMgYSB0cnVlIGNvbmRpdGlvbi4NCisgKi8NCitzdGF0aWMgY29uc3QgTmlGcGdhX0Jvb2wgTmlGcGdhX1RydWUgPSAxOw0KKw0KKy8qKg0KKyAqIFJlcHJlc2VudHMgdGhlIHJlc3VsdGluZyBzdGF0dXMgb2YgYSBmdW5jdGlvbiBjYWxsIHRocm91Z2ggaXRzIHJldHVybiB2YWx1ZS4NCisgKiAwIGlzIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlcyBhcmUgZXJyb3JzLCBhbmQgcG9zaXRpdmUgdmFsdWVzIGFyZSB3YXJuaW5ncy4NCisgKi8NCit0eXBlZGVmIGludDMyX3QgTmlGcGdhX1N0YXR1czsNCisNCisvKioNCisgKiBObyBlcnJvcnMgb3Igd2FybmluZ3MuDQorICovDQorc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19TdWNjZXNzID0gMDsNCisNCisvKioNCisgKiBUaGUgdGltZW91dCBleHBpcmVkIGJlZm9yZSB0aGUgRklGTyBvcGVyYXRpb24gY291bGQgY29tcGxldGUuDQorICovDQorc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19GaWZvVGltZW91dCA9IC01MDQwMDsNCisNCisvKioNCisgKiBObyB0cmFuc2ZlciBpcyBpbiBwcm9ncmVzcyBiZWNhdXNlIHRoZSB0cmFuc2ZlciB3YXMgYWJvcnRlZCBieSB0aGUgY2xpZW50Lg0KKyAqIFRoZSBvcGVyYXRpb24gY291bGQgbm90IGJlIGNvbXBsZXRlZCBhcyBzcGVjaWZpZWQuDQorICovDQorc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19UcmFuc2ZlckFib3J0ZWQgPSAtNTA0MDU7DQorDQorLyoqDQorICogQSBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuIFRyeSBhZ2FpbiBhZnRlciByZWJvb3RpbmcuDQorICovDQorc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19NZW1vcnlGdWxsID0gLTUyMDAwOw0KKw0KKy8qKg0KKyAqIEFuIHVuZXhwZWN0ZWQgc29mdHdhcmUgZXJyb3Igb2NjdXJyZWQuDQorICovDQorc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19Tb2Z0d2FyZUZhdWx0ID0gLTUyMDAzOw0KKw0KKy8qKg0KKyAqIEEgcGFyYW1ldGVyIHRvIGEgZnVuY3Rpb24gd2FzIG5vdCB2YWxpZC4gVGhpcyBjb3VsZCBiZSBhIE5VTEwgcG9pbnRlciwgYSBiYWQNCisgKiB2YWx1ZSwgZXRjLg0KKyAqLw0KK3N0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfSW52YWxpZFBhcmFtZXRlciA9IC01MjAwNTsNCisNCisvKioNCisgKiBBIHJlcXVpcmVkIHJlc291cmNlIHdhcyBub3QgZm91bmQuIFRoZSBOaUZwZ2EuKiBsaWJyYXJ5LCB0aGUgUklPIHJlc291cmNlLCBvcg0KKyAqIHNvbWUgb3RoZXIgcmVzb3VyY2UgbWF5IGJlIG1pc3NpbmcuDQorICovDQorc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19SZXNvdXJjZU5vdEZvdW5kID0gLTUyMDA2Ow0KKw0KKy8qKg0KKyAqIEEgcmVxdWlyZWQgcmVzb3VyY2Ugd2FzIG5vdCBwcm9wZXJseSBpbml0aWFsaXplZC4gVGhpcyBjb3VsZCBvY2N1ciBpZg0KKyAqIE5pRnBnYV9Jbml0aWFsaXplIHdhcyBub3QgY2FsbGVkIG9yIGEgcmVxdWlyZWQgTmlGcGdhX0lycUNvbnRleHQgd2FzIG5vdA0KKyAqIHJlc2VydmVkLg0KKyAqLw0KK3N0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfUmVzb3VyY2VOb3RJbml0aWFsaXplZCA9IC01MjAxMDsNCisNCisvKioNCisgKiBBIGhhcmR3YXJlIGZhaWx1cmUgaGFzIG9jY3VycmVkLiBUaGUgb3BlcmF0aW9uIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQgYXMNCisgKiBzcGVjaWZpZWQuDQorICovDQorc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19IYXJkd2FyZUZhdWx0ID0gLTUyMDE4Ow0KKw0KKy8qKg0KKyAqIFRoZSBGUEdBIGlzIGFscmVhZHkgcnVubmluZy4NCisgKi8NCitzdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0ZwZ2FBbHJlYWR5UnVubmluZyA9IC02MTAwMzsNCisNCisvKioNCisgKiBBbiBlcnJvciBvY2N1cnJlZCBkb3dubG9hZGluZyB0aGUgVkkgdG8gdGhlIEZQR0EgZGV2aWNlLiBWZXJpZnkgdGhhdA0KKyAqIHRoZSB0YXJnZXQgaXMgY29ubmVjdGVkIGFuZCBwb3dlcmVkIGFuZCB0aGF0IHRoZSByZXNvdXJjZSBvZiB0aGUgdGFyZ2V0DQorICogaXMgcHJvcGVybHkgY29uZmlndXJlZC4NCisgKi8NCitzdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0Rvd25sb2FkRXJyb3IgPSAtNjEwMTg7DQorDQorLyoqDQorICogVGhlIGJpdGZpbGUgd2FzIG5vdCBjb21waWxlZCBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZSdzIGRldmljZSB0eXBlLg0KKyAqLw0KK3N0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfRGV2aWNlVHlwZU1pc21hdGNoID0gLTYxMDI0Ow0KKw0KKy8qKg0KKyAqIEFuIGVycm9yIHdhcyBkZXRlY3RlZCBpbiB0aGUgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZSBob3N0IGNvbXB1dGVyIGFuZCB0aGUNCisgKiBGUEdBIHRhcmdldC4NCisgKi8NCitzdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0NvbW11bmljYXRpb25UaW1lb3V0ID0gLTYxMDQ2Ow0KKw0KKy8qKg0KKyAqIFRoZSB0aW1lb3V0IGV4cGlyZWQgYmVmb3JlIGFueSBvZiB0aGUgSVJRcyB3ZXJlIGFzc2VydGVkLg0KKyAqLw0KK3N0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfSXJxVGltZW91dCA9IC02MTA2MDsNCisNCisvKioNCisgKiBUaGUgc3BlY2lmaWVkIGJpdGZpbGUgaXMgaW52YWxpZCBvciBjb3JydXB0Lg0KKyAqLw0KK3N0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfQ29ycnVwdEJpdGZpbGUgPSAtNjEwNzA7DQorDQorLyoqDQorICogVGhlIHJlcXVlc3RlZCBGSUZPIGRlcHRoIGlzIGludmFsaWQuIEl0IGlzIGVpdGhlciAwIG9yIGFuIGFtb3VudCBub3QNCisgKiBzdXBwb3J0ZWQgYnkgdGhlIGhhcmR3YXJlLg0KKyAqLw0KK3N0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfQmFkRGVwdGggPSAtNjEwNzI7DQorDQorLyoqDQorICogVGhlIG51bWJlciBvZiBGSUZPIGVsZW1lbnRzIGlzIGludmFsaWQuIEVpdGhlciB0aGUgbnVtYmVyIGlzIGdyZWF0ZXIgdGhhbiB0aGUNCisgKiBkZXB0aCBvZiB0aGUgaG9zdCBtZW1vcnkgRE1BIEZJRk8sIG9yIG1vcmUgZWxlbWVudHMgd2VyZSByZXF1ZXN0ZWQgZm9yDQorICogcmVsZWFzZSB0aGFuIGhhZCBiZWVuIGFjcXVpcmVkLg0KKyAqLw0KK3N0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfQmFkUmVhZFdyaXRlQ291bnQgPSAtNjEwNzM7DQorDQorLyoqDQorICogQSBoYXJkd2FyZSBjbG9ja2luZyBlcnJvciBvY2N1cnJlZC4gQSBkZXJpdmVkIGNsb2NrIGxvc3QgbG9jayB3aXRoIGl0cyBiYXNlDQorICogY2xvY2sgZHVyaW5nIHRoZSBleGVjdXRpb24gb2YgdGhlIExhYlZJRVcgRlBHQSBWSS4gSWYgYW55IGJhc2UgY2xvY2tzIHdpdGgNCisgKiBkZXJpdmVkIGNsb2NrcyBhcmUgcmVmZXJlbmNpbmcgYW4gZXh0ZXJuYWwgc291cmNlLCBtYWtlIHN1cmUgdGhhdCB0aGUNCisgKiBleHRlcm5hbCBzb3VyY2UgaXMgY29ubmVjdGVkIGFuZCB3aXRoaW4gdGhlIHN1cHBvcnRlZCBmcmVxdWVuY3ksIGppdHRlciwNCisgKiBhY2N1cmFjeSwgZHV0eSBjeWNsZSwgYW5kIHZvbHRhZ2Ugc3BlY2lmaWNhdGlvbnMuIEFsc28gdmVyaWZ5IHRoYXQgdGhlDQorICogY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBiYXNlIGNsb2NrIG1hdGNoIHRoZSBjb25maWd1cmF0aW9uIHNwZWNpZmllZCBpbiB0aGUNCisgKiBGUEdBIEJhc2UgQ2xvY2sgUHJvcGVydGllcy4gSWYgYWxsIGJhc2UgY2xvY2tzIHdpdGggZGVyaXZlZCBjbG9ja3MgYXJlDQorICogZ2VuZXJhdGVkIGZyb20gZnJlZS1ydW5uaW5nLCBvbi1ib2FyZCBzb3VyY2VzLCBwbGVhc2UgY29udGFjdCBOYXRpb25hbA0KKyAqIEluc3RydW1lbnRzIHRlY2huaWNhbCBzdXBwb3J0IGF0IG5pLmNvbS9zdXBwb3J0Lg0KKyAqLw0KK3N0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfQ2xvY2tMb3N0TG9jayA9IC02MTA4MzsNCisNCisvKioNCisgKiBUaGUgb3BlcmF0aW9uIGNvdWxkIG5vdCBiZSBwZXJmb3JtZWQgYmVjYXVzZSB0aGUgRlBHQSBpcyBidXN5LiBTdG9wIGFsbA0KKyAqIGFjdGl2aXRpZXMgb24gdGhlIEZQR0EgYmVmb3JlIHJlcXVlc3RpbmcgdGhpcyBvcGVyYXRpb24uIElmIHRoZSB0YXJnZXQgaXMgaW4NCisgKiBTY2FuIEludGVyZmFjZSBwcm9ncmFtbWluZyBtb2RlLCBwdXQgaXQgaW4gRlBHQSBJbnRlcmZhY2UgcHJvZ3JhbW1pbmcgbW9kZS4NCisgKi8NCitzdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0ZwZ2FCdXN5ID0gLTYxMTQxOw0KKw0KKy8qKg0KKyAqIFRoZSBvcGVyYXRpb24gY291bGQgbm90IGJlIHBlcmZvcm1lZCBiZWNhdXNlIHRoZSBGUEdBIGlzIGJ1c3kgb3BlcmF0aW5nIGluDQorICogRlBHQSBJbnRlcmZhY2UgQyBBUEkgbW9kZS4gU3RvcCBhbGwgYWN0aXZpdGllcyBvbiB0aGUgRlBHQSBiZWZvcmUgcmVxdWVzdGluZw0KKyAqIHRoaXMgb3BlcmF0aW9uLg0KKyAqLw0KK3N0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfRnBnYUJ1c3lGcGdhSW50ZXJmYWNlQ0FwaSA9IC02MTIwMDsNCisNCisvKioNCisgKiBUaGUgY2hhc3NpcyBpcyBpbiBTY2FuIEludGVyZmFjZSBwcm9ncmFtbWluZyBtb2RlLiBJbiBvcmRlciB0byBydW4gRlBHQSBWSXMsDQorICogeW91IG11c3QgZ28gdG8gdGhlIGNoYXNzaXMgcHJvcGVydGllcyBwYWdlLCBzZWxlY3QgRlBHQSBwcm9ncmFtbWluZyBtb2RlLCBhbmQNCisgKiBkZXBsb3kgc2V0dGluZ3MuDQorICovDQorc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19GcGdhQnVzeVNjYW5JbnRlcmZhY2UgPSAtNjEyMDE7DQorDQorLyoqDQorICogVGhlIG9wZXJhdGlvbiBjb3VsZCBub3QgYmUgcGVyZm9ybWVkIGJlY2F1c2UgdGhlIEZQR0EgaXMgYnVzeSBvcGVyYXRpbmcgaW4NCisgKiBGUEdBIEludGVyZmFjZSBtb2RlLiBTdG9wIGFsbCBhY3Rpdml0aWVzIG9uIHRoZSBGUEdBIGJlZm9yZSByZXF1ZXN0aW5nIHRoaXMNCisgKiBvcGVyYXRpb24uDQorICovDQorc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19GcGdhQnVzeUZwZ2FJbnRlcmZhY2UgPSAtNjEyMDI7DQorDQorLyoqDQorICogVGhlIG9wZXJhdGlvbiBjb3VsZCBub3QgYmUgcGVyZm9ybWVkIGJlY2F1c2UgdGhlIEZQR0EgaXMgYnVzeSBvcGVyYXRpbmcgaW4NCisgKiBJbnRlcmFjdGl2ZSBtb2RlLiBTdG9wIGFsbCBhY3Rpdml0aWVzIG9uIHRoZSBGUEdBIGJlZm9yZSByZXF1ZXN0aW5nIHRoaXMNCisgKiBvcGVyYXRpb24uDQorICovDQorc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19GcGdhQnVzeUludGVyYWN0aXZlID0gLTYxMjAzOw0KKw0KKy8qKg0KKyAqIFRoZSBvcGVyYXRpb24gY291bGQgbm90IGJlIHBlcmZvcm1lZCBiZWNhdXNlIHRoZSBGUEdBIGlzIGJ1c3kgb3BlcmF0aW5nIGluDQorICogRW11bGF0aW9uIG1vZGUuIFN0b3AgYWxsIGFjdGl2aXRpZXMgb24gdGhlIEZQR0EgYmVmb3JlIHJlcXVlc3RpbmcgdGhpcw0KKyAqIG9wZXJhdGlvbi4NCisgKi8NCitzdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0ZwZ2FCdXN5RW11bGF0aW9uID0gLTYxMjA0Ow0KKw0KKy8qKg0KKyAqIExhYlZJRVcgRlBHQSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBSZXNldCBtZXRob2QgZm9yIGJpdGZpbGVzIHRoYXQgYWxsb3cNCisgKiByZW1vdmFsIG9mIGltcGxpY2l0IGVuYWJsZSBzaWduYWxzIGluIHNpbmdsZS1jeWNsZSBUaW1lZCBMb29wcy4NCisgKi8NCitzdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX1Jlc2V0Q2FsbGVkV2l0aEltcGxpY2l0RW5hYmxlUmVtb3ZhbCA9IC02MTIxMTsNCisNCisvKioNCisgKiBMYWJWSUVXIEZQR0EgZG9lcyBub3Qgc3VwcG9ydCB0aGUgQWJvcnQgbWV0aG9kIGZvciBiaXRmaWxlcyB0aGF0IGFsbG93DQorICogcmVtb3ZhbCBvZiBpbXBsaWNpdCBlbmFibGUgc2lnbmFscyBpbiBzaW5nbGUtY3ljbGUgVGltZWQgTG9vcHMuDQorICovDQorc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19BYm9ydENhbGxlZFdpdGhJbXBsaWNpdEVuYWJsZVJlbW92YWwgPSAtNjEyMTI7DQorDQorLyoqDQorICogTGFiVklFVyBGUEdBIGRvZXMgbm90IHN1cHBvcnQgQ2xvc2UgYW5kIFJlc2V0IGlmIExhc3QgUmVmZXJlbmNlIGZvciBiaXRmaWxlcw0KKyAqIHRoYXQgYWxsb3cgcmVtb3ZhbCBvZiBpbXBsaWNpdCBlbmFibGUgc2lnbmFscyBpbiBzaW5nbGUtY3ljbGUgVGltZWQgTG9vcHMuDQorICogUGFzcyB0aGUgTmlGcGdhX0Nsb3NlQXR0cmlidXRlX05vUmVzZXRJZkxhc3RTZXNzaW9uIGF0dHJpYnV0ZSB0byBOaUZwZ2FfQ2xvc2UNCisgKiBpbnN0ZWFkIG9mIDAuDQorICovDQorc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19DbG9zZUFuZFJlc2V0Q2FsbGVkV2l0aEltcGxpY2l0RW5hYmxlUmVtb3ZhbCA9IC02MTIxMzsNCisNCisvKioNCisgKiBGb3IgYml0ZmlsZXMgdGhhdCBhbGxvdyByZW1vdmFsIG9mIGltcGxpY2l0IGVuYWJsZSBzaWduYWxzIGluIHNpbmdsZS1jeWNsZQ0KKyAqIFRpbWVkIExvb3BzLCBMYWJWSUVXIEZQR0EgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIG1ldGhvZCBwcmlvciB0byBydW5uaW5nIHRoZQ0KKyAqIGJpdGZpbGUuDQorICovDQorc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19JbXBsaWNpdEVuYWJsZVJlbW92YWxCdXROb3RZZXRSdW4gPSAtNjEyMTQ7DQorDQorLyoqDQorICogQml0ZmlsZXMgdGhhdCBhbGxvdyByZW1vdmFsIG9mIGltcGxpY2l0IGVuYWJsZSBzaWduYWxzIGluIHNpbmdsZS1jeWNsZSBUaW1lZA0KKyAqIExvb3BzIGNhbiBydW4gb25seSBvbmNlLiBEb3dubG9hZCB0aGUgYml0ZmlsZSBhZ2FpbiBiZWZvcmUgcmUtcnVubmluZyB0aGUgVkkuDQorICovDQorc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19SdW5BZnRlclN0b3BwZWRDYWxsZWRXaXRoSW1wbGljaXRFbmFibGVSZW1vdmFsID0gLTYxMjE1Ow0KKw0KKy8qKg0KKyAqIEEgZ2F0ZWQgY2xvY2sgaGFzIHZpb2xhdGVkIHRoZSBoYW5kc2hha2luZyBwcm90b2NvbC4gSWYgeW91IGFyZSB1c2luZw0KKyAqIGV4dGVybmFsIGdhdGVkIGNsb2NrcywgZW5zdXJlIHRoYXQgdGhleSBmb2xsb3cgdGhlIHJlcXVpcmVkIGNsb2NrIGdhdGluZw0KKyAqIHByb3RvY29sLiBJZiB5b3UgYXJlIGdlbmVyYXRpbmcgeW91ciBjbG9ja3MgaW50ZXJuYWxseSwgcGxlYXNlIGNvbnRhY3QNCisgKiBOYXRpb25hbCBJbnN0cnVtZW50cyBUZWNobmljYWwgU3VwcG9ydC4NCisgKi8NCitzdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0dhdGVkQ2xvY2tIYW5kc2hha2luZ1Zpb2xhdGlvbiA9IC02MTIxNjsNCisNCisvKioNCisgKiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHJlcXVlc3RlZCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mDQorICogdW5hY3F1aXJlZCBlbGVtZW50cyBsZWZ0IGluIHRoZSBob3N0IG1lbW9yeSBETUEgRklGTy4gVGhlcmUgYXJlIGN1cnJlbnRseQ0KKyAqIGZld2VyIHVuYWNxdWlyZWQgZWxlbWVudHMgbGVmdCBpbiB0aGUgRklGTyB0aGFuIGFyZSBiZWluZyByZXF1ZXN0ZWQuIFJlbGVhc2UNCisgKiBzb21lIGFjcXVpcmVkIGVsZW1lbnRzIGJlZm9yZSBhY3F1aXJpbmcgbW9yZSBlbGVtZW50cy4NCisgKi8NCitzdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0VsZW1lbnRzTm90UGVybWlzc2libGVUb0JlQWNxdWlyZWQgPSAtNjEyMTk7DQorDQorLyoqDQorICogQW4gdW5leHBlY3RlZCBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZC4NCisgKi8NCitzdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0ludGVybmFsRXJyb3IgPSAtNjE0OTk7DQorDQorLyoqDQorICogVGhlIE5JLVJJTyBkcml2ZXIgd2FzIHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGEgRklGTy4gVGhpcyBjYW4gaGFwcGVuDQorICogd2hlbiB0aGUgY29tYmluZWQgZGVwdGggb2YgYWxsIERNQSBGSUZPcyBleGNlZWRzIHRoZSBtYXhpbXVtIGRlcHRoIGZvciB0aGUNCisgKiBjb250cm9sbGVyLCBvciB3aGVuIHRoZSBjb250cm9sbGVyIHJ1bnMgb3V0IG9mIHN5c3RlbSBtZW1vcnkuIFlvdSBtYXkgYmUgYWJsZQ0KKyAqIHRvIHJlY29uZmlndXJlIHRoZSBjb250cm9sbGVyIHdpdGggYSBncmVhdGVyIG1heGltdW0gRklGTyBkZXB0aC4gRm9yIG1vcmUNCisgKiBpbmZvcm1hdGlvbiwgcmVmZXIgdG8gdGhlIE5JIEtub3dsZWRnZUJhc2UgYXJ0aWNsZSA2NU9GMkVSUS4NCisgKi8NCitzdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX1RvdGFsRG1hRmlmb0RlcHRoRXhjZWVkZWQgPSAtNjMwMDM7DQorDQorLyoqDQorICogQWNjZXNzIHRvIHRoZSByZW1vdGUgc3lzdGVtIHdhcyBkZW5pZWQuIFVzZSBNQVggdG8gY2hlY2sgdGhlIFJlbW90ZSBEZXZpY2UNCisgKiBBY2Nlc3Mgc2V0dGluZ3MgdW5kZXIgU29mdHdhcmU+Pk5JLVJJTz4+TkktUklPIFNldHRpbmdzIG9uIHRoZSByZW1vdGUgc3lzdGVtLg0KKyAqLw0KK3N0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfQWNjZXNzRGVuaWVkID0gLTYzMDMzOw0KKw0KKy8qKg0KKyAqIFRoZSBOSS1SSU8gc29mdHdhcmUgb24gdGhlIGhvc3QgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgc29mdHdhcmUgb24gdGhlDQorICogdGFyZ2V0LiBVcGdyYWRlIHRoZSBOSS1SSU8gc29mdHdhcmUgb24gdGhlIGhvc3QgaW4gb3JkZXIgdG8gY29ubmVjdCB0byB0aGlzDQorICogdGFyZ2V0Lg0KKyAqLw0KK3N0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfSG9zdFZlcnNpb25NaXNtYXRjaCA9IC02MzAzODsNCisNCisvKioNCisgKiBBIGNvbm5lY3Rpb24gY291bGQgbm90IGJlIGVzdGFibGlzaGVkIHRvIHRoZSBzcGVjaWZpZWQgcmVtb3RlIGRldmljZS4gRW5zdXJlDQorICogdGhhdCB0aGUgZGV2aWNlIGlzIG9uIGFuZCBhY2Nlc3NpYmxlIG92ZXIgdGhlIG5ldHdvcmssIHRoYXQgTkktUklPIHNvZnR3YXJlDQorICogaXMgaW5zdGFsbGVkLCBhbmQgdGhhdCB0aGUgUklPIHNlcnZlciBpcyBydW5uaW5nIGFuZCBwcm9wZXJseSBjb25maWd1cmVkLg0KKyAqLw0KK3N0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfUnBjQ29ubmVjdGlvbkVycm9yID0gLTYzMDQwOw0KKw0KKy8qKg0KKyAqIFRoZSBSUEMgc2Vzc2lvbiBpcyBpbnZhbGlkLiBUaGUgdGFyZ2V0IG1heSBoYXZlIHJlc2V0IG9yIGJlZW4gcmVib290ZWQuIENoZWNrDQorICogdGhlIG5ldHdvcmsgY29ubmVjdGlvbiBhbmQgcmV0cnkgdGhlIG9wZXJhdGlvbi4NCisgKi8NCitzdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX1JwY1Nlc3Npb25FcnJvciA9IC02MzA0MzsNCisNCisvKioNCisgKiBUaGUgb3BlcmF0aW9uIGNvdWxkIG5vdCBjb21wbGV0ZSBiZWNhdXNlIGFub3RoZXIgc2Vzc2lvbiBpcyBhY2Nlc3NpbmcgdGhlDQorICogRklGTy4gQ2xvc2UgdGhlIG90aGVyIHNlc3Npb24gYW5kIHJldHJ5Lg0KKyAqLw0KK3N0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfRmlmb1Jlc2VydmVkID0gLTYzMDgyOw0KKw0KKy8qKg0KKyAqIEEgQ29uZmlndXJlIEZJRk8sIFN0b3AgRklGTywgUmVhZCBGSUZPLCBvciBXcml0ZSBGSUZPIGZ1bmN0aW9uIHdhcyBjYWxsZWQNCisgKiB3aGlsZSB0aGUgaG9zdCBoYWQgYWNxdWlyZWQgZWxlbWVudHMgb2YgdGhlIEZJRk8uIFJlbGVhc2UgYWxsIGFjcXVpcmVkDQorICogZWxlbWVudHMgYmVmb3JlIGNvbmZpZ3VyaW5nLCBzdG9wcGluZywgcmVhZGluZywgb3Igd3JpdGluZy4NCisgKi8NCitzdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0ZpZm9FbGVtZW50c0N1cnJlbnRseUFjcXVpcmVkID0gLTYzMDgzOw0KKw0KKy8qKg0KKyAqIEEgZnVuY3Rpb24gd2FzIGNhbGxlZCB1c2luZyBhIG1pc2FsaWduZWQgYWRkcmVzcy4gVGhlIGFkZHJlc3MgbXVzdCBiZSBhDQorICogbXVsdGlwbGUgb2YgdGhlIHNpemUgb2YgdGhlIGRhdGF0eXBlLg0KKyAqLw0KK3N0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfTWlzYWxpZ25lZEFjY2VzcyA9IC02MzA4NDsNCisNCisvKioNCisgKiBUaGUgRlBHQSBSZWFkL1dyaXRlIENvbnRyb2wgRnVuY3Rpb24gaXMgYWNjZXNzaW5nIGEgY29udHJvbCBvciBpbmRpY2F0b3INCisgKiB3aXRoIGRhdGEgdGhhdCBleGNlZWRzIHRoZSBtYXhpbXVtIHNpemUgc3VwcG9ydGVkIG9uIHRoZSBjdXJyZW50IHRhcmdldC4NCisgKiBSZWZlciB0byB0aGUgaGFyZHdhcmUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGxpbWl0YXRpb25zIG9uIGRhdGEgdHlwZXMgZm9yDQorICogdGhpcyB0YXJnZXQuDQorICovDQorc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19Db250cm9sT3JJbmRpY2F0b3JUb29MYXJnZSA9IC02MzA4NTsNCisNCisvKioNCisgKiBBIHZhbGlkIC5sdmJpdHggYml0ZmlsZSBpcyByZXF1aXJlZC4gSWYgeW91IGFyZSB1c2luZyBhIHZhbGlkIC5sdmJpdHgNCisgKiBiaXRmaWxlLCB0aGUgYml0ZmlsZSBtYXkgbm90IGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgc29mdHdhcmUgeW91IGFyZSB1c2luZy4NCisgKiBEZXRlcm1pbmUgd2hpY2ggdmVyc2lvbiBvZiBMYWJWSUVXIHdhcyB1c2VkIHRvIG1ha2UgdGhlIGJpdGZpbGUsIHVwZGF0ZSB5b3VyDQorICogc29mdHdhcmUgdG8gdGhhdCB2ZXJzaW9uIG9yIGxhdGVyLCBhbmQgdHJ5IGFnYWluLg0KKyAqLw0KK3N0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfQml0ZmlsZVJlYWRFcnJvciA9IC02MzEwMTsNCisNCisvKioNCisgKiBUaGUgc3BlY2lmaWVkIHNpZ25hdHVyZSBkb2VzIG5vdCBtYXRjaCB0aGUgc2lnbmF0dXJlIG9mIHRoZSBiaXRmaWxlLiBJZiB0aGUNCisgKiBiaXRmaWxlIGhhcyBiZWVuIHJlY29tcGlsZWQsIHJlZ2VuZXJhdGUgdGhlIEMgQVBJIGFuZCByZWJ1aWxkIHRoZQ0KKyAqIGFwcGxpY2F0aW9uLg0KKyAqLw0KK3N0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfU2lnbmF0dXJlTWlzbWF0Y2ggPSAtNjMxMDY7DQorDQorLyoqDQorICogVGhlIGJpdGZpbGUgeW91IGFyZSB0cnlpbmcgdG8gdXNlIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIHZlcnNpb24gb2YNCisgKiBOSS1SSU8gaW5zdGFsbGVkIG9uIHRoZSB0YXJnZXQgYW5kL29yIHRoZSBob3N0LiBEZXRlcm1pbmUgd2hpY2ggdmVyc2lvbnMgb2YNCisgKiBOSS1SSU8gYW5kIExhYlZJRVcgd2VyZSB1c2VkIHRvIG1ha2UgdGhlIGJpdGZpbGUsIHVwZGF0ZSB0aGUgc29mdHdhcmUgb24gdGhlDQorICogdGFyZ2V0IGFuZCBob3N0IHRvIHRoYXQgdmVyc2lvbiBvciBsYXRlciwgYW5kIHRyeSBhZ2Fpbi4NCisgKi8NCitzdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0luY29tcGF0aWJsZUJpdGZpbGUgPSAtNjMxMDc7DQorDQorLyoqDQorICogRWl0aGVyIHRoZSBzdXBwbGllZCByZXNvdXJjZSBuYW1lIGlzIGludmFsaWQgYXMgYSBSSU8gcmVzb3VyY2UgbmFtZSwgb3IgdGhlDQorICogZGV2aWNlIHdhcyBub3QgZm91bmQuIFVzZSBNQVggdG8gZmluZCB0aGUgcHJvcGVyIHJlc291cmNlIG5hbWUgZm9yIHRoZQ0KKyAqIGludGVuZGVkIGRldmljZS4NCisgKi8NCitzdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0ludmFsaWRSZXNvdXJjZU5hbWUgPSAtNjMxOTI7DQorDQorLyoqDQorICogVGhlIHJlcXVlc3RlZCBmZWF0dXJlIGlzIG5vdCBzdXBwb3J0ZWQuDQorICovDQorc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19GZWF0dXJlTm90U3VwcG9ydGVkID0gLTYzMTkzOw0KKw0KKy8qKg0KKyAqIFRoZSBOSS1SSU8gc29mdHdhcmUgb24gdGhlIHRhcmdldCBzeXN0ZW0gaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGlzDQorICogc29mdHdhcmUuIFVwZ3JhZGUgdGhlIE5JLVJJTyBzb2Z0d2FyZSBvbiB0aGUgdGFyZ2V0IHN5c3RlbS4NCisgKi8NCitzdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX1ZlcnNpb25NaXNtYXRjaCA9IC02MzE5NDsNCisNCisvKioNCisgKiBUaGUgc2Vzc2lvbiBpcyBpbnZhbGlkIG9yIGhhcyBiZWVuIGNsb3NlZC4NCisgKi8NCitzdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0ludmFsaWRTZXNzaW9uID0gLTYzMTk1Ow0KKw0KKy8qKg0KKyAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBvcGVuIEZQR0Egc2Vzc2lvbnMgaGFzIGJlZW4gcmVhY2hlZC4gQ2xvc2Ugc29tZSBvcGVuDQorICogc2Vzc2lvbnMuDQorICovDQorc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19PdXRPZkhhbmRsZXMgPSAtNjMxOTg7DQorDQorLyoqDQorICogVGVzdHMgd2hldGhlciBhIHN0YXR1cyBpcyBhbiBlcnJvci4NCisgKg0KKyAqIEBwYXJhbSBzdGF0dXMgc3RhdHVzIHRvIGNoZWNrIGZvciBhbiBlcnJvcg0KKyAqIEByZXR1cm4gd2hldGhlciB0aGUgc3RhdHVzIHdhcyBhbiBlcnJvcg0KKyAqLw0KK3N0YXRpYyBOaUZwZ2FfSW5saW5lIE5pRnBnYV9Cb29sIE5pRnBnYV9Jc0Vycm9yKGNvbnN0IE5pRnBnYV9TdGF0dXMgc3RhdHVzKQ0KK3sNCisgICByZXR1cm4gc3RhdHVzIDwgTmlGcGdhX1N0YXR1c19TdWNjZXNzOw0KK30NCisNCisvKioNCisgKiBUZXN0cyB3aGV0aGVyIGEgc3RhdHVzIGlzIG5vdCBhbiBlcnJvci4gU3VjY2VzcyBhbmQgd2FybmluZ3MgYXJlIG5vdCBlcnJvcnMuDQorICoNCisgKiBAcGFyYW0gc3RhdHVzIHN0YXR1cyB0byBjaGVjayBmb3IgYW4gZXJyb3INCisgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHN0YXR1cyB3YXMgYSBzdWNjZXNzIG9yIHdhcm5pbmcNCisgKi8NCitzdGF0aWMgTmlGcGdhX0lubGluZSBOaUZwZ2FfQm9vbCBOaUZwZ2FfSXNOb3RFcnJvcihjb25zdCBOaUZwZ2FfU3RhdHVzIHN0YXR1cykNCit7DQorICAgcmV0dXJuIHN0YXR1cyA+PSBOaUZwZ2FfU3RhdHVzX1N1Y2Nlc3M7DQorfQ0KKw0KKy8qKg0KKyAqIENvbmRpdGlvbmFsbHkgc2V0cyB0aGUgc3RhdHVzIHRvIGEgbmV3IHZhbHVlLiBUaGUgcHJldmlvdXMgc3RhdHVzIGlzDQorICogcHJlc2VydmVkIHVubGVzcyB0aGUgbmV3IHN0YXR1cyBpcyBtb3JlIG9mIGFuIGVycm9yLCB3aGljaCBtZWFucyB0aGF0DQorICogd2FybmluZ3MgYW5kIGVycm9ycyBvdmVyd3JpdGUgc3VjY2Vzc2VzLCBhbmQgZXJyb3JzIG92ZXJ3cml0ZSB3YXJuaW5ncy4gTmV3DQorICogZXJyb3JzIGRvIG5vdCBvdmVyd3JpdGUgb2xkZXIgZXJyb3JzLCBhbmQgbmV3IHdhcm5pbmdzIGRvIG5vdCBvdmVyd3JpdGUNCisgKiBvbGRlciB3YXJuaW5ncy4NCisgKg0KKyAqIEBwYXJhbSBzdGF0dXMgc3RhdHVzIHRvIGNvbmRpdGlvbmFsbHkgc2V0DQorICogQHBhcmFtIG5ld1N0YXR1cyBuZXcgc3RhdHVzIHZhbHVlIHRoYXQgbWF5IGJlIHNldA0KKyAqIEByZXR1cm4gdGhlIHJlc3VsdGluZyBzdGF0dXMNCisgKi8NCitzdGF0aWMgTmlGcGdhX0lubGluZSBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9NZXJnZVN0YXR1cygNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5pRnBnYV9TdGF0dXMqIGNvbnN0IHN0YXR1cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5pRnBnYV9TdGF0dXMgIG5ld1N0YXR1cykNCit7DQorICAgaWYgKCFzdGF0dXMpDQorICAgICAgcmV0dXJuIE5pRnBnYV9TdGF0dXNfSW52YWxpZFBhcmFtZXRlcjsNCisgICBpZiAoTmlGcGdhX0lzTm90RXJyb3IoKnN0YXR1cykNCisgICAmJiAgKCpzdGF0dXMgPT0gTmlGcGdhX1N0YXR1c19TdWNjZXNzIHx8IE5pRnBnYV9Jc0Vycm9yKG5ld1N0YXR1cykpKQ0KKyAgICAgICpzdGF0dXMgPSBuZXdTdGF0dXM7DQorICAgcmV0dXJuICpzdGF0dXM7DQorfQ0KKw0KKy8qKg0KKyAqIFRoaXMgbWFjcm8gZXZhbHVhdGVzIHRoZSBleHByZXNzaW9uIG9ubHkgaWYgdGhlIHN0YXR1cyBpcyBub3QgYW4gZXJyb3IuIFRoZQ0KKyAqIGV4cHJlc3Npb24gbXVzdCBldmFsdWF0ZSB0byBhbiBOaUZwZ2FfU3RhdHVzLCBzdWNoIGFzIGEgY2FsbCB0byBhbnkgTmlGcGdhXyoNCisgKiBmdW5jdGlvbiwgYmVjYXVzZSB0aGUgc3RhdHVzIHdpbGwgYmUgc2V0IHRvIHRoZSByZXR1cm5lZCBzdGF0dXMgaWYgdGhlDQorICogZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQuDQorICoNCisgKiBZb3UgY2FuIHVzZSB0aGlzIG1hY3JvIHRvIG1pbWljIHN0YXR1cyBjaGFpbmluZyBpbiBMYWJWSUVXLCB3aGVyZSB0aGUgc3RhdHVzDQorICogZG9lcyBub3QgaGF2ZSB0byBiZSBleHBsaWNpdGx5IGNoZWNrZWQgYWZ0ZXIgZWFjaCBjYWxsLiBTdWNoIGNvZGUgbWF5IGxvb2sNCisgKiBsaWtlIHRoZSBmb2xsb3dpbmcgZXhhbXBsZS4NCisgKg0KKyAqICAgIE5pRnBnYV9TdGF0dXMgc3RhdHVzID0gTmlGcGdhX1N0YXR1c19TdWNjZXNzOw0KKyAqICAgIE5pRnBnYV9JZklzTm90RXJyb3Ioc3RhdHVzLCBOaUZwZ2FfV3JpdGVVMzIoLi4uKSk7DQorICogICAgTmlGcGdhX0lmSXNOb3RFcnJvcihzdGF0dXMsIE5pRnBnYV9Xcml0ZVUzMiguLi4pKTsNCisgKiAgICBOaUZwZ2FfSWZJc05vdEVycm9yKHN0YXR1cywgTmlGcGdhX1dyaXRlVTMyKC4uLikpOw0KKyAqDQorICogQHBhcmFtIHN0YXR1cyBzdGF0dXMgdG8gY2hlY2sgZm9yIGFuIGVycm9yDQorICogQHBhcmFtIGV4cHJlc3Npb24gZXhwcmVzc2lvbiB0byBjYWxsIGlmIHRoZSBpbmNvbWluZyBzdGF0dXMgaXMgbm90IGFuIGVycm9yDQorICovDQorI2RlZmluZSBOaUZwZ2FfSWZJc05vdEVycm9yKHN0YXR1cywgZXhwcmVzc2lvbikgXA0KKyAgIGlmIChOaUZwZ2FfSXNOb3RFcnJvcihzdGF0dXMpKSBcDQorICAgICAgTmlGcGdhX01lcmdlU3RhdHVzKCZzdGF0dXMsIChleHByZXNzaW9uKSk7IFwNCisNCisvKioNCisgKiBZb3UgbXVzdCBjYWxsIHRoaXMgZnVuY3Rpb24gYmVmb3JlIGFsbCBvdGhlciBmdW5jdGlvbiBjYWxscy4gVGhpcyBmdW5jdGlvbg0KKyAqIGxvYWRzIHRoZSBOaUZwZ2EgbGlicmFyeSBzbyB0aGF0IGFsbCB0aGUgb3RoZXIgZnVuY3Rpb25zIHdpbGwgd29yay4gSWYgdGhpcw0KKyAqIGZ1bmN0aW9uIHN1Y2NlZWRzLCB5b3UgbXVzdCBjYWxsIE5pRnBnYV9GaW5hbGl6ZSBhZnRlciBhbGwgb3RoZXIgZnVuY3Rpb24NCisgKiBjYWxscy4NCisgKg0KKyAqIEB3YXJuaW5nIFRoaXMgZnVuY3Rpb24gaXMgbm90IHRocmVhZCBzYWZlLg0KKyAqDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9Jbml0aWFsaXplKHZvaWQpOw0KKw0KKy8qKg0KKyAqIFlvdSBtdXN0IGNhbGwgdGhpcyBmdW5jdGlvbiBhZnRlciBhbGwgb3RoZXIgZnVuY3Rpb24gY2FsbHMgaWYNCisgKiBOaUZwZ2FfSW5pdGlhbGl6ZSBzdWNjZWVkcy4gVGhpcyBmdW5jdGlvbiB1bmxvYWRzIHRoZSBOaUZwZ2EgbGlicmFyeS4NCisgKg0KKyAqIEB3YXJuaW5nIFRoaXMgZnVuY3Rpb24gaXMgbm90IHRocmVhZCBzYWZlLg0KKyAqDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9GaW5hbGl6ZSh2b2lkKTsNCisNCisvKioNCisgKiBBIGhhbmRsZSB0byBhbiBGUEdBIHNlc3Npb24uDQorICovDQordHlwZWRlZiB1aW50MzJfdCBOaUZwZ2FfU2Vzc2lvbjsNCisNCisvKioNCisgKiBBdHRyaWJ1dGVzIHRoYXQgTmlGcGdhX09wZW4gYWNjZXB0cy4NCisgKi8NCit0eXBlZGVmIGVudW0NCit7DQorICAgTmlGcGdhX09wZW5BdHRyaWJ1dGVfTm9SdW4gPSAxDQorfSBOaUZwZ2FfT3BlbkF0dHJpYnV0ZTsNCisNCisvKioNCisgKiBPcGVucyBhIHNlc3Npb24gdG8gdGhlIEZQR0EuIFRoaXMgY2FsbCBlbnN1cmVzIHRoYXQgdGhlIGNvbnRlbnRzIG9mIHRoZQ0KKyAqIGJpdGZpbGUgYXJlIHByb2dyYW1tZWQgdG8gdGhlIEZQR0EuIFRoZSBGUEdBIHJ1bnMgdW5sZXNzIHRoZQ0KKyAqIE5pRnBnYV9PcGVuQXR0cmlidXRlX05vUnVuIGF0dHJpYnV0ZSBpcyB1c2VkLg0KKyAqDQorICogQmVjYXVzZSBkaWZmZXJlbnQgb3BlcmF0aW5nIHN5c3RlbXMgaGF2ZSBkaWZmZXJlbnQgZGVmYXVsdCBjdXJyZW50IHdvcmtpbmcNCisgKiBkaXJlY3RvcmllcyBmb3IgYXBwbGljYXRpb25zLCB5b3UgbXVzdCBwYXNzIGFuIGFic29sdXRlIHBhdGggZm9yIHRoZSBiaXRmaWxlDQorICogcGFyYW1ldGVyLiBJZiB5b3UgcGFzcyBvbmx5IHRoZSBmaWxlbmFtZSBpbnN0ZWFkIG9mIGFuIGFic29sdXRlIHBhdGgsIHRoZQ0KKyAqIG9wZXJhdGluZyBzeXN0ZW0gbWF5IG5vdCBiZSBhYmxlIHRvIGxvY2F0ZSB0aGUgYml0ZmlsZS4gRm9yIGV4YW1wbGUsIHRoZQ0KKyAqIGRlZmF1bHQgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yaWVzIGFyZSBDOlxuaS1ydFxzeXN0ZW1cIGZvciBQaGFyIExhcCBFVFMgYW5kDQorICogL2MvIGZvciBWeFdvcmtzLiBCZWNhdXNlIHRoZSBnZW5lcmF0ZWQgKl9CaXRmaWxlIGNvbnN0YW50IGlzIGEgI2RlZmluZSB0byBhDQorICogc3RyaW5nIGxpdGVyYWwsIHlvdSBjYW4gdXNlIEMvQysrIHN0cmluZy1saXRlcmFsIGNvbmNhdGVuYXRpb24gdG8gZm9ybSBhbg0KKyAqIGFic29sdXRlIHBhdGguIEZvciBleGFtcGxlLCBpZiB0aGUgYml0ZmlsZSBpcyBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgYQ0KKyAqIFBoYXIgTGFwIEVUUyBzeXN0ZW0sIHBhc3MgdGhlIGZvbGxvd2luZyBmb3IgdGhlIGJpdGZpbGUgcGFyYW1ldGVyLg0KKyAqDQorICogICAgIkM6XFwiIE5pRnBnYV9NeUFwcGxpY2F0aW9uX0JpdGZpbGUNCisgKg0KKyAqIEBwYXJhbSBiaXRmaWxlIHBhdGggdG8gdGhlIGJpdGZpbGUNCisgKiBAcGFyYW0gc2lnbmF0dXJlIHNpZ25hdHVyZSBvZiB0aGUgYml0ZmlsZQ0KKyAqIEBwYXJhbSByZXNvdXJjZSBSSU8gcmVzb3VyY2Ugc3RyaW5nIHRvIG9wZW4gKCJSSU8wIiBvciAicmlvOi8vbXlzeXN0ZW0vUklPIikNCisgKiBAcGFyYW0gYXR0cmlidXRlIGJpdHdpc2UgT1Igb2YgYW55IE5pRnBnYV9PcGVuQXR0cmlidXRlcywgb3IgMA0KKyAqIEBwYXJhbSBzZXNzaW9uIG91dHB1dHMgdGhlIHNlc3Npb24gaGFuZGxlLCB3aGljaCBtdXN0IGJlIGNsb3NlZCB3aGVuIG5vDQorICogICAgICAgICAgICAgICAgbG9uZ2VyIG5lZWRlZA0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfT3Blbihjb25zdCBjaGFyKiAgICAgYml0ZmlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAgICBzaWduYXR1cmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgICAgcmVzb3VyY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgYXR0cmlidXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgTmlGcGdhX1Nlc3Npb24qIHNlc3Npb24pOw0KKw0KKy8qKg0KKyAqIEF0dHJpYnV0ZXMgdGhhdCBOaUZwZ2FfQ2xvc2UgYWNjZXB0cy4NCisgKi8NCit0eXBlZGVmIGVudW0NCit7DQorICAgTmlGcGdhX0Nsb3NlQXR0cmlidXRlX05vUmVzZXRJZkxhc3RTZXNzaW9uID0gMQ0KK30gTmlGcGdhX0Nsb3NlQXR0cmlidXRlOw0KKw0KKy8qKg0KKyAqIENsb3NlcyB0aGUgc2Vzc2lvbiB0byB0aGUgRlBHQS4gVGhlIEZQR0EgcmVzZXRzIHVubGVzcyBlaXRoZXIgYW5vdGhlciBzZXNzaW9uDQorICogaXMgc3RpbGwgb3BlbiBvciB5b3UgdXNlIHRoZSBOaUZwZ2FfQ2xvc2VBdHRyaWJ1dGVfTm9SZXNldElmTGFzdFNlc3Npb24NCisgKiBhdHRyaWJ1dGUuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGF0dHJpYnV0ZSBiaXR3aXNlIE9SIG9mIGFueSBOaUZwZ2FfQ2xvc2VBdHRyaWJ1dGVzLCBvciAwDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9DbG9zZShOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGF0dHJpYnV0ZSk7DQorDQorLyoqDQorICogQXR0cmlidXRlcyB0aGF0IE5pRnBnYV9SdW4gYWNjZXB0cy4NCisgKi8NCit0eXBlZGVmIGVudW0NCit7DQorICAgTmlGcGdhX1J1bkF0dHJpYnV0ZV9XYWl0VW50aWxEb25lID0gMQ0KK30gTmlGcGdhX1J1bkF0dHJpYnV0ZTsNCisNCisvKioNCisgKiBSdW5zIHRoZSBGUEdBIFZJIG9uIHRoZSB0YXJnZXQuIElmIHlvdSB1c2UgTmlGcGdhX1J1bkF0dHJpYnV0ZV9XYWl0VW50aWxEb25lLA0KKyAqIE5pRnBnYV9SdW4gYmxvY2tzIHRoZSB0aHJlYWQgdW50aWwgdGhlIEZQR0EgZmluaXNoZXMgcnVubmluZy4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gYXR0cmlidXRlIGJpdHdpc2UgT1Igb2YgYW55IE5pRnBnYV9SdW5BdHRyaWJ1dGVzLCBvciAwDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9SdW4oTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgYXR0cmlidXRlKTsNCisNCisvKioNCisgKiBBYm9ydHMgdGhlIEZQR0EgVkkuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9BYm9ydChOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uKTsNCisNCisvKioNCisgKiBSZXNldHMgdGhlIEZQR0EgVkkuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9SZXNldChOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uKTsNCisNCisvKioNCisgKiBSZS1kb3dubG9hZHMgdGhlIEZQR0EgYml0c3RyZWFtIHRvIHRoZSB0YXJnZXQuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9Eb3dubG9hZChOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uKTsNCisNCisvKioNCisgKiBSZWFkcyBhIGJvb2xlYW4gdmFsdWUgZnJvbSBhIGdpdmVuIGluZGljYXRvciBvciBjb250cm9sLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBpbmRpY2F0b3IgaW5kaWNhdG9yIG9yIGNvbnRyb2wgZnJvbSB3aGljaCB0byByZWFkDQorICogQHBhcmFtIHZhbHVlIG91dHB1dHMgdGhlIHZhbHVlIHRoYXQgd2FzIHJlYWQNCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1JlYWRCb29sKE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgaW5kaWNhdG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5pRnBnYV9Cb29sKiAgIHZhbHVlKTsNCisNCisvKioNCisgKiBSZWFkcyBhIHNpZ25lZCA4LWJpdCBpbnRlZ2VyIHZhbHVlIGZyb20gYSBnaXZlbiBpbmRpY2F0b3Igb3IgY29udHJvbC4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gaW5kaWNhdG9yIGluZGljYXRvciBvciBjb250cm9sIGZyb20gd2hpY2ggdG8gcmVhZA0KKyAqIEBwYXJhbSB2YWx1ZSBvdXRwdXRzIHRoZSB2YWx1ZSB0aGF0IHdhcyByZWFkDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9SZWFkSTgoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgaW5kaWNhdG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QqICAgICAgICB2YWx1ZSk7DQorDQorLyoqDQorICogUmVhZHMgYW4gdW5zaWduZWQgOC1iaXQgaW50ZWdlciB2YWx1ZSBmcm9tIGEgZ2l2ZW4gaW5kaWNhdG9yIG9yIGNvbnRyb2wuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGluZGljYXRvciBpbmRpY2F0b3Igb3IgY29udHJvbCBmcm9tIHdoaWNoIHRvIHJlYWQNCisgKiBAcGFyYW0gdmFsdWUgb3V0cHV0cyB0aGUgdmFsdWUgdGhhdCB3YXMgcmVhZA0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfUmVhZFU4KE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGluZGljYXRvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogICAgICAgdmFsdWUpOw0KKw0KKy8qKg0KKyAqIFJlYWRzIGEgc2lnbmVkIDE2LWJpdCBpbnRlZ2VyIHZhbHVlIGZyb20gYSBnaXZlbiBpbmRpY2F0b3Igb3IgY29udHJvbC4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gaW5kaWNhdG9yIGluZGljYXRvciBvciBjb250cm9sIGZyb20gd2hpY2ggdG8gcmVhZA0KKyAqIEBwYXJhbSB2YWx1ZSBvdXRwdXRzIHRoZSB2YWx1ZSB0aGF0IHdhcyByZWFkDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9SZWFkSTE2KE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBpbmRpY2F0b3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90KiAgICAgICB2YWx1ZSk7DQorDQorLyoqDQorICogUmVhZHMgYW4gdW5zaWduZWQgMTYtYml0IGludGVnZXIgdmFsdWUgZnJvbSBhIGdpdmVuIGluZGljYXRvciBvciBjb250cm9sLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBpbmRpY2F0b3IgaW5kaWNhdG9yIG9yIGNvbnRyb2wgZnJvbSB3aGljaCB0byByZWFkDQorICogQHBhcmFtIHZhbHVlIG91dHB1dHMgdGhlIHZhbHVlIHRoYXQgd2FzIHJlYWQNCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1JlYWRVMTYoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGluZGljYXRvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiAgICAgIHZhbHVlKTsNCisNCisvKioNCisgKiBSZWFkcyBhIHNpZ25lZCAzMi1iaXQgaW50ZWdlciB2YWx1ZSBmcm9tIGEgZ2l2ZW4gaW5kaWNhdG9yIG9yIGNvbnRyb2wuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGluZGljYXRvciBpbmRpY2F0b3Igb3IgY29udHJvbCBmcm9tIHdoaWNoIHRvIHJlYWQNCisgKiBAcGFyYW0gdmFsdWUgb3V0cHV0cyB0aGUgdmFsdWUgdGhhdCB3YXMgcmVhZA0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfUmVhZEkzMihOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgaW5kaWNhdG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogICAgICAgdmFsdWUpOw0KKw0KKy8qKg0KKyAqIFJlYWRzIGFuIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyIHZhbHVlIGZyb20gYSBnaXZlbiBpbmRpY2F0b3Igb3IgY29udHJvbC4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gaW5kaWNhdG9yIGluZGljYXRvciBvciBjb250cm9sIGZyb20gd2hpY2ggdG8gcmVhZA0KKyAqIEBwYXJhbSB2YWx1ZSBvdXRwdXRzIHRoZSB2YWx1ZSB0aGF0IHdhcyByZWFkDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9SZWFkVTMyKE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBpbmRpY2F0b3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogICAgICB2YWx1ZSk7DQorDQorLyoqDQorICogUmVhZHMgYSBzaWduZWQgNjQtYml0IGludGVnZXIgdmFsdWUgZnJvbSBhIGdpdmVuIGluZGljYXRvciBvciBjb250cm9sLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBpbmRpY2F0b3IgaW5kaWNhdG9yIG9yIGNvbnRyb2wgZnJvbSB3aGljaCB0byByZWFkDQorICogQHBhcmFtIHZhbHVlIG91dHB1dHMgdGhlIHZhbHVlIHRoYXQgd2FzIHJlYWQNCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1JlYWRJNjQoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGluZGljYXRvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqICAgICAgIHZhbHVlKTsNCisNCisvKioNCisgKiBSZWFkcyBhbiB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlciB2YWx1ZSBmcm9tIGEgZ2l2ZW4gaW5kaWNhdG9yIG9yIGNvbnRyb2wuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGluZGljYXRvciBpbmRpY2F0b3Igb3IgY29udHJvbCBmcm9tIHdoaWNoIHRvIHJlYWQNCisgKiBAcGFyYW0gdmFsdWUgb3V0cHV0cyB0aGUgdmFsdWUgdGhhdCB3YXMgcmVhZA0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfUmVhZFU2NChOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgaW5kaWNhdG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QqICAgICAgdmFsdWUpOw0KKw0KKy8qKg0KKyAqIFdyaXRlcyBhIGJvb2xlYW4gdmFsdWUgdG8gYSBnaXZlbiBjb250cm9sIG9yIGluZGljYXRvci4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gY29udHJvbCBjb250cm9sIG9yIGluZGljYXRvciB0byB3aGljaCB0byB3cml0ZQ0KKyAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSB0byB3cml0ZQ0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfV3JpdGVCb29sKE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGNvbnRyb2wsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5pRnBnYV9Cb29sICAgIHZhbHVlKTsNCisNCisvKioNCisgKiBXcml0ZXMgYSBzaWduZWQgOC1iaXQgaW50ZWdlciB2YWx1ZSB0byBhIGdpdmVuIGNvbnRyb2wgb3IgaW5kaWNhdG9yLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBjb250cm9sIGNvbnRyb2wgb3IgaW5kaWNhdG9yIHRvIHdoaWNoIHRvIHdyaXRlDQorICogQHBhcmFtIHZhbHVlIHZhbHVlIHRvIHdyaXRlDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9Xcml0ZUk4KE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBjb250cm9sLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50OF90ICAgICAgICAgdmFsdWUpOw0KKw0KKy8qKg0KKyAqIFdyaXRlcyBhbiB1bnNpZ25lZCA4LWJpdCBpbnRlZ2VyIHZhbHVlIHRvIGEgZ2l2ZW4gY29udHJvbCBvciBpbmRpY2F0b3IuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGNvbnRyb2wgY29udHJvbCBvciBpbmRpY2F0b3IgdG8gd2hpY2ggdG8gd3JpdGUNCisgKiBAcGFyYW0gdmFsdWUgdmFsdWUgdG8gd3JpdGUNCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1dyaXRlVTgoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGNvbnRyb2wsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICB2YWx1ZSk7DQorDQorLyoqDQorICogV3JpdGVzIGEgc2lnbmVkIDE2LWJpdCBpbnRlZ2VyIHZhbHVlIHRvIGEgZ2l2ZW4gY29udHJvbCBvciBpbmRpY2F0b3IuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGNvbnRyb2wgY29udHJvbCBvciBpbmRpY2F0b3IgdG8gd2hpY2ggdG8gd3JpdGUNCisgKiBAcGFyYW0gdmFsdWUgdmFsdWUgdG8gd3JpdGUNCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1dyaXRlSTE2KE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgY29udHJvbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICB2YWx1ZSk7DQorDQorLyoqDQorICogV3JpdGVzIGFuIHVuc2lnbmVkIDE2LWJpdCBpbnRlZ2VyIHZhbHVlIHRvIGEgZ2l2ZW4gY29udHJvbCBvciBpbmRpY2F0b3IuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGNvbnRyb2wgY29udHJvbCBvciBpbmRpY2F0b3IgdG8gd2hpY2ggdG8gd3JpdGUNCisgKiBAcGFyYW0gdmFsdWUgdmFsdWUgdG8gd3JpdGUNCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1dyaXRlVTE2KE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgY29udHJvbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICB2YWx1ZSk7DQorDQorLyoqDQorICogV3JpdGVzIGEgc2lnbmVkIDMyLWJpdCBpbnRlZ2VyIHZhbHVlIHRvIGEgZ2l2ZW4gY29udHJvbCBvciBpbmRpY2F0b3IuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGNvbnRyb2wgY29udHJvbCBvciBpbmRpY2F0b3IgdG8gd2hpY2ggdG8gd3JpdGUNCisgKiBAcGFyYW0gdmFsdWUgdmFsdWUgdG8gd3JpdGUNCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1dyaXRlSTMyKE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgY29udHJvbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICB2YWx1ZSk7DQorDQorLyoqDQorICogV3JpdGVzIGFuIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyIHZhbHVlIHRvIGEgZ2l2ZW4gY29udHJvbCBvciBpbmRpY2F0b3IuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGNvbnRyb2wgY29udHJvbCBvciBpbmRpY2F0b3IgdG8gd2hpY2ggdG8gd3JpdGUNCisgKiBAcGFyYW0gdmFsdWUgdmFsdWUgdG8gd3JpdGUNCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1dyaXRlVTMyKE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgY29udHJvbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICB2YWx1ZSk7DQorDQorLyoqDQorICogV3JpdGVzIGEgc2lnbmVkIDY0LWJpdCBpbnRlZ2VyIHZhbHVlIHRvIGEgZ2l2ZW4gY29udHJvbCBvciBpbmRpY2F0b3IuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGNvbnRyb2wgY29udHJvbCBvciBpbmRpY2F0b3IgdG8gd2hpY2ggdG8gd3JpdGUNCisgKiBAcGFyYW0gdmFsdWUgdmFsdWUgdG8gd3JpdGUNCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1dyaXRlSTY0KE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgY29udHJvbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICAgICAgICB2YWx1ZSk7DQorDQorLyoqDQorICogV3JpdGVzIGFuIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyIHZhbHVlIHRvIGEgZ2l2ZW4gY29udHJvbCBvciBpbmRpY2F0b3IuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGNvbnRyb2wgY29udHJvbCBvciBpbmRpY2F0b3IgdG8gd2hpY2ggdG8gd3JpdGUNCisgKiBAcGFyYW0gdmFsdWUgdmFsdWUgdG8gd3JpdGUNCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1dyaXRlVTY0KE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgY29udHJvbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCAgICAgICB2YWx1ZSk7DQorDQorLyoqDQorICogUmVhZHMgYW4gZW50aXJlIGFycmF5IG9mIGJvb2xlYW4gdmFsdWVzIGZyb20gYSBnaXZlbiBhcnJheSBpbmRpY2F0b3Igb3INCisgKiBjb250cm9sLg0KKyAqDQorICogQHdhcm5pbmcgVGhlIHNpemUgcGFzc2VkIG11c3QgYmUgdGhlIGV4YWN0IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUNCisgKiAgICAgICAgICBpbmRpY2F0b3Igb3IgY29udHJvbC4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gaW5kaWNhdG9yIGluZGljYXRvciBvciBjb250cm9sIGZyb20gd2hpY2ggdG8gcmVhZA0KKyAqIEBwYXJhbSBhcnJheSBvdXRwdXRzIHRoZSBlbnRpcmUgYXJyYXkgdGhhdCB3YXMgcmVhZA0KKyAqIEBwYXJhbSBzaXplIGV4YWN0IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgaW5kaWNhdG9yIG9yIGNvbnRyb2wNCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1JlYWRBcnJheUJvb2woTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGluZGljYXRvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5pRnBnYV9Cb29sKiAgIGFycmF5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgc2l6ZSk7DQorDQorLyoqDQorICogUmVhZHMgYW4gZW50aXJlIGFycmF5IG9mIHNpZ25lZCA4LWJpdCBpbnRlZ2VyIHZhbHVlcyBmcm9tIGEgZ2l2ZW4gYXJyYXkNCisgKiBpbmRpY2F0b3Igb3IgY29udHJvbC4NCisgKg0KKyAqIEB3YXJuaW5nIFRoZSBzaXplIHBhc3NlZCBtdXN0IGJlIHRoZSBleGFjdCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlDQorICogICAgICAgICAgaW5kaWNhdG9yIG9yIGNvbnRyb2wuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGluZGljYXRvciBpbmRpY2F0b3Igb3IgY29udHJvbCBmcm9tIHdoaWNoIHRvIHJlYWQNCisgKiBAcGFyYW0gYXJyYXkgb3V0cHV0cyB0aGUgZW50aXJlIGFycmF5IHRoYXQgd2FzIHJlYWQNCisgKiBAcGFyYW0gc2l6ZSBleGFjdCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGluZGljYXRvciBvciBjb250cm9sDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9SZWFkQXJyYXlJOChOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGluZGljYXRvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QqICAgICAgICBhcnJheSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBzaXplKTsNCisNCisvKioNCisgKiBSZWFkcyBhbiBlbnRpcmUgYXJyYXkgb2YgdW5zaWduZWQgOC1iaXQgaW50ZWdlciB2YWx1ZXMgZnJvbSBhIGdpdmVuIGFycmF5DQorICogaW5kaWNhdG9yIG9yIGNvbnRyb2wuDQorICoNCisgKiBAd2FybmluZyBUaGUgc2l6ZSBwYXNzZWQgbXVzdCBiZSB0aGUgZXhhY3QgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZQ0KKyAqICAgICAgICAgIGluZGljYXRvciBvciBjb250cm9sLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBpbmRpY2F0b3IgaW5kaWNhdG9yIG9yIGNvbnRyb2wgZnJvbSB3aGljaCB0byByZWFkDQorICogQHBhcmFtIGFycmF5IG91dHB1dHMgdGhlIGVudGlyZSBhcnJheSB0aGF0IHdhcyByZWFkDQorICogQHBhcmFtIHNpemUgZXhhY3QgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBpbmRpY2F0b3Igb3IgY29udHJvbA0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfUmVhZEFycmF5VTgoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBpbmRpY2F0b3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogICAgICAgYXJyYXksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgc2l6ZSk7DQorDQorLyoqDQorICogUmVhZHMgYW4gZW50aXJlIGFycmF5IG9mIHNpZ25lZCAxNi1iaXQgaW50ZWdlciB2YWx1ZXMgZnJvbSBhIGdpdmVuIGFycmF5DQorICogaW5kaWNhdG9yIG9yIGNvbnRyb2wuDQorICoNCisgKiBAd2FybmluZyBUaGUgc2l6ZSBwYXNzZWQgbXVzdCBiZSB0aGUgZXhhY3QgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZQ0KKyAqICAgICAgICAgIGluZGljYXRvciBvciBjb250cm9sLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBpbmRpY2F0b3IgaW5kaWNhdG9yIG9yIGNvbnRyb2wgZnJvbSB3aGljaCB0byByZWFkDQorICogQHBhcmFtIGFycmF5IG91dHB1dHMgdGhlIGVudGlyZSBhcnJheSB0aGF0IHdhcyByZWFkDQorICogQHBhcmFtIHNpemUgZXhhY3QgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBpbmRpY2F0b3Igb3IgY29udHJvbA0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfUmVhZEFycmF5STE2KE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGluZGljYXRvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCogICAgICAgYXJyYXksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIHNpemUpOw0KKw0KKy8qKg0KKyAqIFJlYWRzIGFuIGVudGlyZSBhcnJheSBvZiB1bnNpZ25lZCAxNi1iaXQgaW50ZWdlciB2YWx1ZXMgZnJvbSBhIGdpdmVuIGFycmF5DQorICogaW5kaWNhdG9yIG9yIGNvbnRyb2wuDQorICoNCisgKiBAd2FybmluZyBUaGUgc2l6ZSBwYXNzZWQgbXVzdCBiZSB0aGUgZXhhY3QgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZQ0KKyAqICAgICAgICAgIGluZGljYXRvciBvciBjb250cm9sLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBpbmRpY2F0b3IgaW5kaWNhdG9yIG9yIGNvbnRyb2wgZnJvbSB3aGljaCB0byByZWFkDQorICogQHBhcmFtIGFycmF5IG91dHB1dHMgdGhlIGVudGlyZSBhcnJheSB0aGF0IHdhcyByZWFkDQorICogQHBhcmFtIHNpemUgZXhhY3QgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBpbmRpY2F0b3Igb3IgY29udHJvbA0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfUmVhZEFycmF5VTE2KE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGluZGljYXRvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqICAgICAgYXJyYXksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIHNpemUpOw0KKw0KKy8qKg0KKyAqIFJlYWRzIGFuIGVudGlyZSBhcnJheSBvZiBzaWduZWQgMzItYml0IGludGVnZXIgdmFsdWVzIGZyb20gYSBnaXZlbiBhcnJheQ0KKyAqIGluZGljYXRvciBvciBjb250cm9sLg0KKyAqDQorICogQHdhcm5pbmcgVGhlIHNpemUgcGFzc2VkIG11c3QgYmUgdGhlIGV4YWN0IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUNCisgKiAgICAgICAgICBpbmRpY2F0b3Igb3IgY29udHJvbC4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gaW5kaWNhdG9yIGluZGljYXRvciBvciBjb250cm9sIGZyb20gd2hpY2ggdG8gcmVhZA0KKyAqIEBwYXJhbSBhcnJheSBvdXRwdXRzIHRoZSBlbnRpcmUgYXJyYXkgdGhhdCB3YXMgcmVhZA0KKyAqIEBwYXJhbSBzaXplIGV4YWN0IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgaW5kaWNhdG9yIG9yIGNvbnRyb2wNCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1JlYWRBcnJheUkzMihOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBpbmRpY2F0b3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqICAgICAgIGFycmF5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBzaXplKTsNCisNCisvKioNCisgKiBSZWFkcyBhbiBlbnRpcmUgYXJyYXkgb2YgdW5zaWduZWQgMzItYml0IGludGVnZXIgdmFsdWVzIGZyb20gYSBnaXZlbiBhcnJheQ0KKyAqIGluZGljYXRvciBvciBjb250cm9sLg0KKyAqDQorICogQHdhcm5pbmcgVGhlIHNpemUgcGFzc2VkIG11c3QgYmUgdGhlIGV4YWN0IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUNCisgKiAgICAgICAgICBpbmRpY2F0b3Igb3IgY29udHJvbC4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gaW5kaWNhdG9yIGluZGljYXRvciBvciBjb250cm9sIGZyb20gd2hpY2ggdG8gcmVhZA0KKyAqIEBwYXJhbSBhcnJheSBvdXRwdXRzIHRoZSBlbnRpcmUgYXJyYXkgdGhhdCB3YXMgcmVhZA0KKyAqIEBwYXJhbSBzaXplIGV4YWN0IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgaW5kaWNhdG9yIG9yIGNvbnRyb2wNCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1JlYWRBcnJheVUzMihOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBpbmRpY2F0b3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiAgICAgIGFycmF5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBzaXplKTsNCisNCisvKioNCisgKiBSZWFkcyBhbiBlbnRpcmUgYXJyYXkgb2Ygc2lnbmVkIDY0LWJpdCBpbnRlZ2VyIHZhbHVlcyBmcm9tIGEgZ2l2ZW4gYXJyYXkNCisgKiBpbmRpY2F0b3Igb3IgY29udHJvbC4NCisgKg0KKyAqIEB3YXJuaW5nIFRoZSBzaXplIHBhc3NlZCBtdXN0IGJlIHRoZSBleGFjdCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlDQorICogICAgICAgICAgaW5kaWNhdG9yIG9yIGNvbnRyb2wuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGluZGljYXRvciBpbmRpY2F0b3Igb3IgY29udHJvbCBmcm9tIHdoaWNoIHRvIHJlYWQNCisgKiBAcGFyYW0gYXJyYXkgb3V0cHV0cyB0aGUgZW50aXJlIGFycmF5IHRoYXQgd2FzIHJlYWQNCisgKiBAcGFyYW0gc2l6ZSBleGFjdCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGluZGljYXRvciBvciBjb250cm9sDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9SZWFkQXJyYXlJNjQoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgaW5kaWNhdG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiAgICAgICBhcnJheSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgc2l6ZSk7DQorDQorLyoqDQorICogUmVhZHMgYW4gZW50aXJlIGFycmF5IG9mIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyIHZhbHVlcyBmcm9tIGEgZ2l2ZW4gYXJyYXkNCisgKiBpbmRpY2F0b3Igb3IgY29udHJvbC4NCisgKg0KKyAqIEB3YXJuaW5nIFRoZSBzaXplIHBhc3NlZCBtdXN0IGJlIHRoZSBleGFjdCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlDQorICogICAgICAgICAgaW5kaWNhdG9yIG9yIGNvbnRyb2wuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGluZGljYXRvciBpbmRpY2F0b3Igb3IgY29udHJvbCBmcm9tIHdoaWNoIHRvIHJlYWQNCisgKiBAcGFyYW0gYXJyYXkgb3V0cHV0cyB0aGUgZW50aXJlIGFycmF5IHRoYXQgd2FzIHJlYWQNCisgKiBAcGFyYW0gc2l6ZSBleGFjdCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGluZGljYXRvciBvciBjb250cm9sDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9SZWFkQXJyYXlVNjQoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgaW5kaWNhdG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCogICAgICBhcnJheSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgc2l6ZSk7DQorDQorLyoqDQorICogV3JpdGVzIGFuIGVudGlyZSBhcnJheSBvZiBib29sZWFuIHZhbHVlcyB0byBhIGdpdmVuIGFycmF5IGNvbnRyb2wgb3INCisgKiBpbmRpY2F0b3IuDQorICoNCisgKiBAd2FybmluZyBUaGUgc2l6ZSBwYXNzZWQgbXVzdCBiZSB0aGUgZXhhY3QgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZQ0KKyAqICAgICAgICAgIGNvbnRyb2wgb3IgaW5kaWNhdG9yLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBjb250cm9sIGNvbnRyb2wgb3IgaW5kaWNhdG9yIHRvIHdoaWNoIHRvIHdyaXRlDQorICogQHBhcmFtIGFycmF5IGVudGlyZSBhcnJheSB0byB3cml0ZQ0KKyAqIEBwYXJhbSBzaXplIGV4YWN0IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udHJvbCBvciBpbmRpY2F0b3INCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1dyaXRlQXJyYXlCb29sKE5pRnBnYV9TZXNzaW9uICAgICBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICBjb250cm9sLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5pRnBnYV9Cb29sKiBhcnJheSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgc2l6ZSk7DQorDQorLyoqDQorICogV3JpdGVzIGFuIGVudGlyZSBhcnJheSBvZiBzaWduZWQgOC1iaXQgaW50ZWdlciB2YWx1ZXMgdG8gYSBnaXZlbiBhcnJheQ0KKyAqIGNvbnRyb2wgb3IgaW5kaWNhdG9yLg0KKyAqDQorICogQHdhcm5pbmcgVGhlIHNpemUgcGFzc2VkIG11c3QgYmUgdGhlIGV4YWN0IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUNCisgKiAgICAgICAgICBjb250cm9sIG9yIGluZGljYXRvci4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gY29udHJvbCBjb250cm9sIG9yIGluZGljYXRvciB0byB3aGljaCB0byB3cml0ZQ0KKyAqIEBwYXJhbSBhcnJheSBlbnRpcmUgYXJyYXkgdG8gd3JpdGUNCisgKiBAcGFyYW0gc2l6ZSBleGFjdCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRyb2wgb3IgaW5kaWNhdG9yDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9Xcml0ZUFycmF5STgoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgY29udHJvbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90KiAgYXJyYXksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIHNpemUpOw0KKw0KKy8qKg0KKyAqIFdyaXRlcyBhbiBlbnRpcmUgYXJyYXkgb2YgdW5zaWduZWQgOC1iaXQgaW50ZWdlciB2YWx1ZXMgdG8gYSBnaXZlbiBhcnJheQ0KKyAqIGNvbnRyb2wgb3IgaW5kaWNhdG9yLg0KKyAqDQorICogQHdhcm5pbmcgVGhlIHNpemUgcGFzc2VkIG11c3QgYmUgdGhlIGV4YWN0IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUNCisgKiAgICAgICAgICBjb250cm9sIG9yIGluZGljYXRvci4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gY29udHJvbCBjb250cm9sIG9yIGluZGljYXRvciB0byB3aGljaCB0byB3cml0ZQ0KKyAqIEBwYXJhbSBhcnJheSBlbnRpcmUgYXJyYXkgdG8gd3JpdGUNCisgKiBAcGFyYW0gc2l6ZSBleGFjdCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRyb2wgb3IgaW5kaWNhdG9yDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9Xcml0ZUFycmF5VTgoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgY29udHJvbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogYXJyYXksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIHNpemUpOw0KKw0KKy8qKg0KKyAqIFdyaXRlcyBhbiBlbnRpcmUgYXJyYXkgb2Ygc2lnbmVkIDE2LWJpdCBpbnRlZ2VyIHZhbHVlcyB0byBhIGdpdmVuIGFycmF5DQorICogY29udHJvbCBvciBpbmRpY2F0b3IuDQorICoNCisgKiBAd2FybmluZyBUaGUgc2l6ZSBwYXNzZWQgbXVzdCBiZSB0aGUgZXhhY3QgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZQ0KKyAqICAgICAgICAgIGNvbnRyb2wgb3IgaW5kaWNhdG9yLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBjb250cm9sIGNvbnRyb2wgb3IgaW5kaWNhdG9yIHRvIHdoaWNoIHRvIHdyaXRlDQorICogQHBhcmFtIGFycmF5IGVudGlyZSBhcnJheSB0byB3cml0ZQ0KKyAqIEBwYXJhbSBzaXplIGV4YWN0IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udHJvbCBvciBpbmRpY2F0b3INCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1dyaXRlQXJyYXlJMTYoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGNvbnRyb2wsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90KiBhcnJheSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIHNpemUpOw0KKw0KKy8qKg0KKyAqIFdyaXRlcyBhbiBlbnRpcmUgYXJyYXkgb2YgdW5zaWduZWQgMTYtYml0IGludGVnZXIgdmFsdWVzIHRvIGEgZ2l2ZW4gYXJyYXkNCisgKiBjb250cm9sIG9yIGluZGljYXRvci4NCisgKg0KKyAqIEB3YXJuaW5nIFRoZSBzaXplIHBhc3NlZCBtdXN0IGJlIHRoZSBleGFjdCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlDQorICogICAgICAgICAgY29udHJvbCBvciBpbmRpY2F0b3IuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGNvbnRyb2wgY29udHJvbCBvciBpbmRpY2F0b3IgdG8gd2hpY2ggdG8gd3JpdGUNCisgKiBAcGFyYW0gYXJyYXkgZW50aXJlIGFycmF5IHRvIHdyaXRlDQorICogQHBhcmFtIHNpemUgZXhhY3QgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250cm9sIG9yIGluZGljYXRvcg0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfV3JpdGVBcnJheVUxNihOaUZwZ2FfU2Vzc2lvbiAgc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICBjb250cm9sLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIGFycmF5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgIHNpemUpOw0KKw0KKy8qKg0KKyAqIFdyaXRlcyBhbiBlbnRpcmUgYXJyYXkgb2Ygc2lnbmVkIDMyLWJpdCBpbnRlZ2VyIHZhbHVlcyB0byBhIGdpdmVuIGFycmF5DQorICogY29udHJvbCBvciBpbmRpY2F0b3IuDQorICoNCisgKiBAd2FybmluZyBUaGUgc2l6ZSBwYXNzZWQgbXVzdCBiZSB0aGUgZXhhY3QgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZQ0KKyAqICAgICAgICAgIGNvbnRyb2wgb3IgaW5kaWNhdG9yLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBjb250cm9sIGNvbnRyb2wgb3IgaW5kaWNhdG9yIHRvIHdoaWNoIHRvIHdyaXRlDQorICogQHBhcmFtIGFycmF5IGVudGlyZSBhcnJheSB0byB3cml0ZQ0KKyAqIEBwYXJhbSBzaXplIGV4YWN0IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udHJvbCBvciBpbmRpY2F0b3INCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1dyaXRlQXJyYXlJMzIoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGNvbnRyb2wsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90KiBhcnJheSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIHNpemUpOw0KKw0KKy8qKg0KKyAqIFdyaXRlcyBhbiBlbnRpcmUgYXJyYXkgb2YgdW5zaWduZWQgMzItYml0IGludGVnZXIgdmFsdWVzIHRvIGEgZ2l2ZW4gYXJyYXkNCisgKiBjb250cm9sIG9yIGluZGljYXRvci4NCisgKg0KKyAqIEB3YXJuaW5nIFRoZSBzaXplIHBhc3NlZCBtdXN0IGJlIHRoZSBleGFjdCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlDQorICogICAgICAgICAgY29udHJvbCBvciBpbmRpY2F0b3IuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGNvbnRyb2wgY29udHJvbCBvciBpbmRpY2F0b3IgdG8gd2hpY2ggdG8gd3JpdGUNCisgKiBAcGFyYW0gYXJyYXkgZW50aXJlIGFycmF5IHRvIHdyaXRlDQorICogQHBhcmFtIHNpemUgZXhhY3QgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250cm9sIG9yIGluZGljYXRvcg0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfV3JpdGVBcnJheVUzMihOaUZwZ2FfU2Vzc2lvbiAgc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICBjb250cm9sLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGFycmF5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgIHNpemUpOw0KKw0KKy8qKg0KKyAqIFdyaXRlcyBhbiBlbnRpcmUgYXJyYXkgb2Ygc2lnbmVkIDY0LWJpdCBpbnRlZ2VyIHZhbHVlcyB0byBhIGdpdmVuIGFycmF5DQorICogY29udHJvbCBvciBpbmRpY2F0b3IuDQorICoNCisgKiBAd2FybmluZyBUaGUgc2l6ZSBwYXNzZWQgbXVzdCBiZSB0aGUgZXhhY3QgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZQ0KKyAqICAgICAgICAgIGNvbnRyb2wgb3IgaW5kaWNhdG9yLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBjb250cm9sIGNvbnRyb2wgb3IgaW5kaWNhdG9yIHRvIHdoaWNoIHRvIHdyaXRlDQorICogQHBhcmFtIGFycmF5IGVudGlyZSBhcnJheSB0byB3cml0ZQ0KKyAqIEBwYXJhbSBzaXplIGV4YWN0IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udHJvbCBvciBpbmRpY2F0b3INCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1dyaXRlQXJyYXlJNjQoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGNvbnRyb2wsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90KiBhcnJheSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIHNpemUpOw0KKw0KKy8qKg0KKyAqIFdyaXRlcyBhbiBlbnRpcmUgYXJyYXkgb2YgdW5zaWduZWQgNjQtYml0IGludGVnZXIgdmFsdWVzIHRvIGEgZ2l2ZW4gYXJyYXkNCisgKiBjb250cm9sIG9yIGluZGljYXRvci4NCisgKg0KKyAqIEB3YXJuaW5nIFRoZSBzaXplIHBhc3NlZCBtdXN0IGJlIHRoZSBleGFjdCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlDQorICogICAgICAgICAgY29udHJvbCBvciBpbmRpY2F0b3IuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGNvbnRyb2wgY29udHJvbCBvciBpbmRpY2F0b3IgdG8gd2hpY2ggdG8gd3JpdGUNCisgKiBAcGFyYW0gYXJyYXkgZW50aXJlIGFycmF5IHRvIHdyaXRlDQorICogQHBhcmFtIHNpemUgZXhhY3QgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250cm9sIG9yIGluZGljYXRvcg0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfV3JpdGVBcnJheVU2NChOaUZwZ2FfU2Vzc2lvbiAgc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICBjb250cm9sLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDY0X3QqIGFycmF5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgIHNpemUpOw0KKw0KKy8qKg0KKyAqIEVudW1lcmF0aW9uIG9mIGFsbCAzMiBwb3NzaWJsZSBJUlFzLiBNdWx0aXBsZSBJUlFzIGNhbiBiZSBiaXR3aXNlIE9SZWQNCisgKiB0b2dldGhlciBsaWtlIHRoaXM6DQorICoNCisgKiAgICBOaUZwZ2FfSXJxXzMgfCBOaUZwZ2FfSXJxXzIzDQorICovDQordHlwZWRlZiBlbnVtDQorew0KKyAgIE5pRnBnYV9JcnFfMCAgPSAxIDw8IDAsDQorICAgTmlGcGdhX0lycV8xICA9IDEgPDwgMSwNCisgICBOaUZwZ2FfSXJxXzIgID0gMSA8PCAyLA0KKyAgIE5pRnBnYV9JcnFfMyAgPSAxIDw8IDMsDQorICAgTmlGcGdhX0lycV80ICA9IDEgPDwgNCwNCisgICBOaUZwZ2FfSXJxXzUgID0gMSA8PCA1LA0KKyAgIE5pRnBnYV9JcnFfNiAgPSAxIDw8IDYsDQorICAgTmlGcGdhX0lycV83ICA9IDEgPDwgNywNCisgICBOaUZwZ2FfSXJxXzggID0gMSA8PCA4LA0KKyAgIE5pRnBnYV9JcnFfOSAgPSAxIDw8IDksDQorICAgTmlGcGdhX0lycV8xMCA9IDEgPDwgMTAsDQorICAgTmlGcGdhX0lycV8xMSA9IDEgPDwgMTEsDQorICAgTmlGcGdhX0lycV8xMiA9IDEgPDwgMTIsDQorICAgTmlGcGdhX0lycV8xMyA9IDEgPDwgMTMsDQorICAgTmlGcGdhX0lycV8xNCA9IDEgPDwgMTQsDQorICAgTmlGcGdhX0lycV8xNSA9IDEgPDwgMTUsDQorICAgTmlGcGdhX0lycV8xNiA9IDEgPDwgMTYsDQorICAgTmlGcGdhX0lycV8xNyA9IDEgPDwgMTcsDQorICAgTmlGcGdhX0lycV8xOCA9IDEgPDwgMTgsDQorICAgTmlGcGdhX0lycV8xOSA9IDEgPDwgMTksDQorICAgTmlGcGdhX0lycV8yMCA9IDEgPDwgMjAsDQorICAgTmlGcGdhX0lycV8yMSA9IDEgPDwgMjEsDQorICAgTmlGcGdhX0lycV8yMiA9IDEgPDwgMjIsDQorICAgTmlGcGdhX0lycV8yMyA9IDEgPDwgMjMsDQorICAgTmlGcGdhX0lycV8yNCA9IDEgPDwgMjQsDQorICAgTmlGcGdhX0lycV8yNSA9IDEgPDwgMjUsDQorICAgTmlGcGdhX0lycV8yNiA9IDEgPDwgMjYsDQorICAgTmlGcGdhX0lycV8yNyA9IDEgPDwgMjcsDQorICAgTmlGcGdhX0lycV8yOCA9IDEgPDwgMjgsDQorICAgTmlGcGdhX0lycV8yOSA9IDEgPDwgMjksDQorICAgTmlGcGdhX0lycV8zMCA9IDEgPDwgMzAsDQorICAgTmlGcGdhX0lycV8zMSA9IDFVIDw8IDMxDQorfSBOaUZwZ2FfSXJxOw0KKw0KKy8qKg0KKyAqIFJlcHJlc2VudHMgYW4gaW5maW5pdGUgdGltZW91dC4NCisgKi8NCitzdGF0aWMgY29uc3QgdWludDMyX3QgTmlGcGdhX0luZmluaXRlVGltZW91dCA9IDB4RkZGRkZGRkY7DQorDQorLyoqDQorICogU2VlIE5pRnBnYV9SZXNlcnZlSXJxQ29udGV4dCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCisgKi8NCit0eXBlZGVmIHZvaWQqIE5pRnBnYV9JcnFDb250ZXh0Ow0KKw0KKy8qKg0KKyAqIElSUSBjb250ZXh0cyBhcmUgc2luZ2xlLXRocmVhZGVkOyBvbmx5IG9uZSB0aHJlYWQgY2FuIHdhaXQgd2l0aCBhDQorICogcGFydGljdWxhciBjb250ZXh0IGF0IGFueSBnaXZlbiB0aW1lLiBUbyBtaW5pbWl6ZSBqaXR0ZXIgd2hlbiBmaXJzdA0KKyAqIHdhaXRpbmcgb24gSVJRcywgcmVzZXJ2ZSBhcyBtYW55IGNvbnRleHRzIGFzIHRoZSBhcHBsaWNhdGlvbg0KKyAqIHJlcXVpcmVzLg0KKyAqDQorICogSWYgYSBjb250ZXh0IGlzIHN1Y2Nlc3NmdWxseSByZXNlcnZlZCAodGhlIHJldHVybmVkIHN0YXR1cyBpcyBub3QgYW4gZXJyb3IpLA0KKyAqIGl0IG11c3QgYmUgdW5yZXNlcnZlZCBsYXRlci4gT3RoZXJ3aXNlIGEgbWVtb3J5IGxlYWsgd2lsbCBvY2N1ci4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gY29udGV4dCBvdXRwdXRzIHRoZSBJUlEgY29udGV4dA0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfUmVzZXJ2ZUlycUNvbnRleHQoTmlGcGdhX1Nlc3Npb24gICAgIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmlGcGdhX0lycUNvbnRleHQqIGNvbnRleHQpOw0KKw0KKy8qKg0KKyAqIFVucmVzZXJ2ZXMgYW4gSVJRIGNvbnRleHQgb2J0YWluZWQgZnJvbSBOaUZwZ2FfUmVzZXJ2ZUlycUNvbnRleHQuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGNvbnRleHQgSVJRIGNvbnRleHQgdG8gdW5yZXNlcnZlDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9VbnJlc2VydmVJcnFDb250ZXh0KE5pRnBnYV9TZXNzaW9uICAgIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaUZwZ2FfSXJxQ29udGV4dCBjb250ZXh0KTsNCisNCisvKioNCisgKiBUaGlzIGlzIGEgYmxvY2tpbmcgZnVuY3Rpb24gdGhhdCBzdG9wcyB0aGUgY2FsbGluZyB0aHJlYWQgdW50aWwgdGhlDQorICogRlBHQSBhc3NlcnRzIGFueSBJUlEgaW4gdGhlIGlycXMgcGFyYW1ldGVyLCBvciB1bnRpbCB0aGUgZnVuY3Rpb24NCisgKiBjYWxsIHRpbWVzIG91dC4gIEJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24sIHVzZQ0KKyAqIE5pRnBnYV9SZXNlcnZlSXJxQ29udGV4dCB0byByZXNlcnZlIGFuIElSUSBjb250ZXh0LiBObyBvdGhlcg0KKyAqIHRocmVhZHMgY2FuIHVzZSB0aGUgc2FtZSBjb250ZXh0IHdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuDQorICoNCisgKiBZb3UgY2FuIHVzZSB0aGUgaXJxc0Fzc2VydGVkIHBhcmFtZXRlciB0byBkZXRlcm1pbmUgd2hpY2ggSVJRcyB3ZXJlIGFzc2VydGVkDQorICogZm9yIGVhY2ggZnVuY3Rpb24gY2FsbC4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gY29udGV4dCBJUlEgY29udGV4dCB3aXRoIHdoaWNoIHRvIHdhaXQNCisgKiBAcGFyYW0gaXJxcyBiaXR3aXNlIE9SIG9mIE5pRnBnYV9JcnFzDQorICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIE5pRnBnYV9JbmZpbml0ZVRpbWVvdXQNCisgKiBAcGFyYW0gaXJxc0Fzc2VydGVkIGlmIG5vbi1OVUxMLCBvdXRwdXRzIGJpdHdpc2UgT1Igb2YgSVJRcyB0aGF0IHdlcmUNCisgKiAgICAgICAgICAgICAgICAgICAgIGFzc2VydGVkDQorICogQHBhcmFtIHRpbWVkT3V0IGlmIG5vbi1OVUxMLCBvdXRwdXRzIHdoZXRoZXIgdGhlIHRpbWVvdXQgZXhwaXJlZA0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfV2FpdE9uSXJxcyhOaUZwZ2FfU2Vzc2lvbiAgICBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmlGcGdhX0lycUNvbnRleHQgY29udGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIGlycXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICB0aW1lb3V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqICAgICAgICAgaXJxc0Fzc2VydGVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmlGcGdhX0Jvb2wqICAgICAgdGltZWRPdXQpOw0KKw0KKy8qKg0KKyAqIEFja25vd2xlZGdlcyBhbiBJUlEgb3Igc2V0IG9mIElSUXMuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGlycXMgYml0d2lzZSBPUiBvZiBOaUZwZ2FfSXJxcw0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfQWNrbm93bGVkZ2VJcnFzKE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGlycXMpOw0KKw0KKy8qKg0KKyAqIFNwZWNpZmllcyB0aGUgZGVwdGggb2YgdGhlIGhvc3QgbWVtb3J5IHBhcnQgb2YgdGhlIERNQSBGSUZPLiBUaGlzIG1ldGhvZCBpcw0KKyAqIG9wdGlvbmFsLiBJbiBvcmRlciB0byBzZWUgdGhlIGFjdHVhbCBkZXB0aCBjb25maWd1cmVkLCB1c2UNCisgKiBOaUZwZ2FfQ29uZmlndXJlRmlmbzIuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGZpZm8gRklGTyB0byBjb25maWd1cmUNCisgKiBAcGFyYW0gZGVwdGggcmVxdWVzdGVkIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZiB0aGUNCisgKiAgICAgICAgICAgICAgRE1BIEZJRk8NCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX0NvbmZpZ3VyZUZpZm8oTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGZpZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBkZXB0aCk7DQorDQorLyoqDQorICogU3BlY2lmaWVzIHRoZSBkZXB0aCBvZiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZiB0aGUgRE1BIEZJRk8uIFRoaXMgbWV0aG9kIGlzDQorICogb3B0aW9uYWwuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGZpZm8gRklGTyB0byBjb25maWd1cmUNCisgKiBAcGFyYW0gcmVxdWVzdGVkRGVwdGggcmVxdWVzdGVkIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydA0KKyAqICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgRE1BIEZJRk8NCisgKiBAcGFyYW0gYWN0dWFsRGVwdGggaWYgbm9uLU5VTEwsIG91dHB1dHMgdGhlIGFjdHVhbCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlDQorICogICAgICAgICAgICAgICAgICAgIGhvc3QgbWVtb3J5IHBhcnQgb2YgdGhlIERNQSBGSUZPLCB3aGljaCBtYXkgYmUgbW9yZSB0aGFuDQorICogICAgICAgICAgICAgICAgICAgIHRoZSByZXF1ZXN0ZWQgbnVtYmVyDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9Db25maWd1cmVGaWZvMihOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGZpZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgcmVxdWVzdGVkRGVwdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgYWN0dWFsRGVwdGgpOw0KKw0KKy8qKg0KKyAqIFN0YXJ0cyBhIEZJRk8uIFRoaXMgbWV0aG9kIGlzIG9wdGlvbmFsLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBmaWZvIEZJRk8gdG8gc3RhcnQNCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXJ0RmlmbyhOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBmaWZvKTsNCisNCisvKioNCisgKiBTdG9wcyBhIEZJRk8uIFRoaXMgbWV0aG9kIGlzIG9wdGlvbmFsLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBmaWZvIEZJRk8gdG8gc3RvcA0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RvcEZpZm8oTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBmaWZvKTsNCisNCisvKioNCisgKiBSZWFkcyBmcm9tIGEgdGFyZ2V0LXRvLWhvc3QgRklGTyBvZiBib29sZWFucy4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gZmlmbyB0YXJnZXQtdG8taG9zdCBGSUZPIGZyb20gd2hpY2ggdG8gcmVhZA0KKyAqIEBwYXJhbSBkYXRhIG91dHB1dHMgdGhlIGRhdGEgdGhhdCB3YXMgcmVhZA0KKyAqIEBwYXJhbSBudW1iZXJPZkVsZW1lbnRzIG51bWJlciBvZiBlbGVtZW50cyB0byByZWFkDQorICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIE5pRnBnYV9JbmZpbml0ZVRpbWVvdXQNCisgKiBAcGFyYW0gZWxlbWVudHNSZW1haW5pbmcgaWYgbm9uLU5VTEwsIG91dHB1dHMgdGhlIG51bWJlciBvZiBlbGVtZW50cw0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgaW4gdGhlIGhvc3QgbWVtb3J5IHBhcnQgb2YgdGhlIERNQSBGSUZPDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9SZWFkRmlmb0Jvb2woTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgZmlmbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmlGcGdhX0Jvb2wqICAgZGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgbnVtYmVyT2ZFbGVtZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdGltZW91dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgZWxlbWVudHNSZW1haW5pbmcpOw0KKw0KKy8qKg0KKyAqIFJlYWRzIGZyb20gYSB0YXJnZXQtdG8taG9zdCBGSUZPIG9mIHNpZ25lZCA4LWJpdCBpbnRlZ2Vycy4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gZmlmbyB0YXJnZXQtdG8taG9zdCBGSUZPIGZyb20gd2hpY2ggdG8gcmVhZA0KKyAqIEBwYXJhbSBkYXRhIG91dHB1dHMgdGhlIGRhdGEgdGhhdCB3YXMgcmVhZA0KKyAqIEBwYXJhbSBudW1iZXJPZkVsZW1lbnRzIG51bWJlciBvZiBlbGVtZW50cyB0byByZWFkDQorICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIE5pRnBnYV9JbmZpbml0ZVRpbWVvdXQNCisgKiBAcGFyYW0gZWxlbWVudHNSZW1haW5pbmcgaWYgbm9uLU5VTEwsIG91dHB1dHMgdGhlIG51bWJlciBvZiBlbGVtZW50cw0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgaW4gdGhlIGhvc3QgbWVtb3J5IHBhcnQgb2YgdGhlIERNQSBGSUZPDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9SZWFkRmlmb0k4KE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBmaWZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50OF90KiAgICAgICAgZGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIG51bWJlck9mRWxlbWVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICB0aW1lb3V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgZWxlbWVudHNSZW1haW5pbmcpOw0KKw0KKy8qKg0KKyAqIFJlYWRzIGZyb20gYSB0YXJnZXQtdG8taG9zdCBGSUZPIG9mIHVuc2lnbmVkIDgtYml0IGludGVnZXJzLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBmaWZvIHRhcmdldC10by1ob3N0IEZJRk8gZnJvbSB3aGljaCB0byByZWFkDQorICogQHBhcmFtIGRhdGEgb3V0cHV0cyB0aGUgZGF0YSB0aGF0IHdhcyByZWFkDQorICogQHBhcmFtIG51bWJlck9mRWxlbWVudHMgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHJlYWQNCisgKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dA0KKyAqIEBwYXJhbSBlbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzDQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZiB0aGUgRE1BIEZJRk8NCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1JlYWRGaWZvVTgoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGZpZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiAgICAgICBkYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgbnVtYmVyT2ZFbGVtZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHRpbWVvdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbGVtZW50c1JlbWFpbmluZyk7DQorDQorLyoqDQorICogUmVhZHMgZnJvbSBhIHRhcmdldC10by1ob3N0IEZJRk8gb2Ygc2lnbmVkIDE2LWJpdCBpbnRlZ2Vycy4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gZmlmbyB0YXJnZXQtdG8taG9zdCBGSUZPIGZyb20gd2hpY2ggdG8gcmVhZA0KKyAqIEBwYXJhbSBkYXRhIG91dHB1dHMgdGhlIGRhdGEgdGhhdCB3YXMgcmVhZA0KKyAqIEBwYXJhbSBudW1iZXJPZkVsZW1lbnRzIG51bWJlciBvZiBlbGVtZW50cyB0byByZWFkDQorICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIE5pRnBnYV9JbmZpbml0ZVRpbWVvdXQNCisgKiBAcGFyYW0gZWxlbWVudHNSZW1haW5pbmcgaWYgbm9uLU5VTEwsIG91dHB1dHMgdGhlIG51bWJlciBvZiBlbGVtZW50cw0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgaW4gdGhlIGhvc3QgbWVtb3J5IHBhcnQgb2YgdGhlIERNQSBGSUZPDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9SZWFkRmlmb0kxNihOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGZpZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCogICAgICAgZGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBudW1iZXJPZkVsZW1lbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHRpbWVvdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgZWxlbWVudHNSZW1haW5pbmcpOw0KKw0KKy8qKg0KKyAqIFJlYWRzIGZyb20gYSB0YXJnZXQtdG8taG9zdCBGSUZPIG9mIHVuc2lnbmVkIDE2LWJpdCBpbnRlZ2Vycy4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gZmlmbyB0YXJnZXQtdG8taG9zdCBGSUZPIGZyb20gd2hpY2ggdG8gcmVhZA0KKyAqIEBwYXJhbSBkYXRhIG91dHB1dHMgdGhlIGRhdGEgdGhhdCB3YXMgcmVhZA0KKyAqIEBwYXJhbSBudW1iZXJPZkVsZW1lbnRzIG51bWJlciBvZiBlbGVtZW50cyB0byByZWFkDQorICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIE5pRnBnYV9JbmZpbml0ZVRpbWVvdXQNCisgKiBAcGFyYW0gZWxlbWVudHNSZW1haW5pbmcgaWYgbm9uLU5VTEwsIG91dHB1dHMgdGhlIG51bWJlciBvZiBlbGVtZW50cw0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgaW4gdGhlIGhvc3QgbWVtb3J5IHBhcnQgb2YgdGhlIERNQSBGSUZPDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9SZWFkRmlmb1UxNihOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGZpZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqICAgICAgZGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBudW1iZXJPZkVsZW1lbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHRpbWVvdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgZWxlbWVudHNSZW1haW5pbmcpOw0KKw0KKy8qKg0KKyAqIFJlYWRzIGZyb20gYSB0YXJnZXQtdG8taG9zdCBGSUZPIG9mIHNpZ25lZCAzMi1iaXQgaW50ZWdlcnMuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGZpZm8gdGFyZ2V0LXRvLWhvc3QgRklGTyBmcm9tIHdoaWNoIHRvIHJlYWQNCisgKiBAcGFyYW0gZGF0YSBvdXRwdXRzIHRoZSBkYXRhIHRoYXQgd2FzIHJlYWQNCisgKiBAcGFyYW0gbnVtYmVyT2ZFbGVtZW50cyBudW1iZXIgb2YgZWxlbWVudHMgdG8gcmVhZA0KKyAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciBOaUZwZ2FfSW5maW5pdGVUaW1lb3V0DQorICogQHBhcmFtIGVsZW1lbnRzUmVtYWluaW5nIGlmIG5vbi1OVUxMLCBvdXRwdXRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nIGluIHRoZSBob3N0IG1lbW9yeSBwYXJ0IG9mIHRoZSBETUEgRklGTw0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfUmVhZEZpZm9JMzIoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBmaWZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqICAgICAgIGRhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgbnVtYmVyT2ZFbGVtZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICB0aW1lb3V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgIGVsZW1lbnRzUmVtYWluaW5nKTsNCisNCisvKioNCisgKiBSZWFkcyBmcm9tIGEgdGFyZ2V0LXRvLWhvc3QgRklGTyBvZiB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlcnMuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGZpZm8gdGFyZ2V0LXRvLWhvc3QgRklGTyBmcm9tIHdoaWNoIHRvIHJlYWQNCisgKiBAcGFyYW0gZGF0YSBvdXRwdXRzIHRoZSBkYXRhIHRoYXQgd2FzIHJlYWQNCisgKiBAcGFyYW0gbnVtYmVyT2ZFbGVtZW50cyBudW1iZXIgb2YgZWxlbWVudHMgdG8gcmVhZA0KKyAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciBOaUZwZ2FfSW5maW5pdGVUaW1lb3V0DQorICogQHBhcmFtIGVsZW1lbnRzUmVtYWluaW5nIGlmIG5vbi1OVUxMLCBvdXRwdXRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nIGluIHRoZSBob3N0IG1lbW9yeSBwYXJ0IG9mIHRoZSBETUEgRklGTw0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfUmVhZEZpZm9VMzIoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBmaWZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiAgICAgIGRhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgbnVtYmVyT2ZFbGVtZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICB0aW1lb3V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgIGVsZW1lbnRzUmVtYWluaW5nKTsNCisNCisvKioNCisgKiBSZWFkcyBmcm9tIGEgdGFyZ2V0LXRvLWhvc3QgRklGTyBvZiBzaWduZWQgNjQtYml0IGludGVnZXJzLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBmaWZvIHRhcmdldC10by1ob3N0IEZJRk8gZnJvbSB3aGljaCB0byByZWFkDQorICogQHBhcmFtIGRhdGEgb3V0cHV0cyB0aGUgZGF0YSB0aGF0IHdhcyByZWFkDQorICogQHBhcmFtIG51bWJlck9mRWxlbWVudHMgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHJlYWQNCisgKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dA0KKyAqIEBwYXJhbSBlbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzDQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZiB0aGUgRE1BIEZJRk8NCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1JlYWRGaWZvSTY0KE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgZmlmbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiAgICAgICBkYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIG51bWJlck9mRWxlbWVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdGltZW91dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbGVtZW50c1JlbWFpbmluZyk7DQorDQorLyoqDQorICogUmVhZHMgZnJvbSBhIHRhcmdldC10by1ob3N0IEZJRk8gb2YgdW5zaWduZWQgNjQtYml0IGludGVnZXJzLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBmaWZvIHRhcmdldC10by1ob3N0IEZJRk8gZnJvbSB3aGljaCB0byByZWFkDQorICogQHBhcmFtIGRhdGEgb3V0cHV0cyB0aGUgZGF0YSB0aGF0IHdhcyByZWFkDQorICogQHBhcmFtIG51bWJlck9mRWxlbWVudHMgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHJlYWQNCisgKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dA0KKyAqIEBwYXJhbSBlbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzDQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZiB0aGUgRE1BIEZJRk8NCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1JlYWRGaWZvVTY0KE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgZmlmbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCogICAgICBkYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIG51bWJlck9mRWxlbWVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdGltZW91dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbGVtZW50c1JlbWFpbmluZyk7DQorDQorLyoqDQorICogV3JpdGVzIHRvIGEgaG9zdC10by10YXJnZXQgRklGTyBvZiBib29sZWFucy4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gZmlmbyBob3N0LXRvLXRhcmdldCBGSUZPIHRvIHdoaWNoIHRvIHdyaXRlDQorICogQHBhcmFtIGRhdGEgZGF0YSB0byB3cml0ZQ0KKyAqIEBwYXJhbSBudW1iZXJPZkVsZW1lbnRzIG51bWJlciBvZiBlbGVtZW50cyB0byB3cml0ZQ0KKyAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciBOaUZwZ2FfSW5maW5pdGVUaW1lb3V0DQorICogQHBhcmFtIGVtcHR5RWxlbWVudHNSZW1haW5pbmcgaWYgbm9uLU5VTEwsIG91dHB1dHMgdGhlIG51bWJlciBvZiBlbXB0eQ0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBETUEgRklGTw0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfV3JpdGVGaWZvQm9vbChOaUZwZ2FfU2Vzc2lvbiAgICAgc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICBmaWZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTmlGcGdhX0Jvb2wqIGRhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgbnVtYmVyT2ZFbGVtZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICB0aW1lb3V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgICAgIGVtcHR5RWxlbWVudHNSZW1haW5pbmcpOw0KKw0KKy8qKg0KKyAqIFdyaXRlcyB0byBhIGhvc3QtdG8tdGFyZ2V0IEZJRk8gb2Ygc2lnbmVkIDgtYml0IGludGVnZXJzLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBmaWZvIGhvc3QtdG8tdGFyZ2V0IEZJRk8gdG8gd2hpY2ggdG8gd3JpdGUNCisgKiBAcGFyYW0gZGF0YSBkYXRhIHRvIHdyaXRlDQorICogQHBhcmFtIG51bWJlck9mRWxlbWVudHMgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHdyaXRlDQorICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIE5pRnBnYV9JbmZpbml0ZVRpbWVvdXQNCisgKiBAcGFyYW0gZW1wdHlFbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVtcHR5DQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMgcmVtYWluaW5nIGluIHRoZSBob3N0IG1lbW9yeSBwYXJ0IG9mDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIERNQSBGSUZPDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9Xcml0ZUZpZm9JOChOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGZpZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90KiAgZGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBudW1iZXJPZkVsZW1lbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHRpbWVvdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgZW1wdHlFbGVtZW50c1JlbWFpbmluZyk7DQorDQorLyoqDQorICogV3JpdGVzIHRvIGEgaG9zdC10by10YXJnZXQgRklGTyBvZiB1bnNpZ25lZCA4LWJpdCBpbnRlZ2Vycy4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gZmlmbyBob3N0LXRvLXRhcmdldCBGSUZPIHRvIHdoaWNoIHRvIHdyaXRlDQorICogQHBhcmFtIGRhdGEgZGF0YSB0byB3cml0ZQ0KKyAqIEBwYXJhbSBudW1iZXJPZkVsZW1lbnRzIG51bWJlciBvZiBlbGVtZW50cyB0byB3cml0ZQ0KKyAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciBOaUZwZ2FfSW5maW5pdGVUaW1lb3V0DQorICogQHBhcmFtIGVtcHR5RWxlbWVudHNSZW1haW5pbmcgaWYgbm9uLU5VTEwsIG91dHB1dHMgdGhlIG51bWJlciBvZiBlbXB0eQ0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBETUEgRklGTw0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfV3JpdGVGaWZvVTgoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBmaWZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgbnVtYmVyT2ZFbGVtZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICB0aW1lb3V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgIGVtcHR5RWxlbWVudHNSZW1haW5pbmcpOw0KKw0KKy8qKg0KKyAqIFdyaXRlcyB0byBhIGhvc3QtdG8tdGFyZ2V0IEZJRk8gb2Ygc2lnbmVkIDE2LWJpdCBpbnRlZ2Vycy4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gZmlmbyBob3N0LXRvLXRhcmdldCBGSUZPIHRvIHdoaWNoIHRvIHdyaXRlDQorICogQHBhcmFtIGRhdGEgZGF0YSB0byB3cml0ZQ0KKyAqIEBwYXJhbSBudW1iZXJPZkVsZW1lbnRzIG51bWJlciBvZiBlbGVtZW50cyB0byB3cml0ZQ0KKyAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciBOaUZwZ2FfSW5maW5pdGVUaW1lb3V0DQorICogQHBhcmFtIGVtcHR5RWxlbWVudHNSZW1haW5pbmcgaWYgbm9uLU5VTEwsIG91dHB1dHMgdGhlIG51bWJlciBvZiBlbXB0eQ0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBETUEgRklGTw0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfV3JpdGVGaWZvSTE2KE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGZpZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QqIGRhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIG51bWJlck9mRWxlbWVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHRpbWVvdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgIGVtcHR5RWxlbWVudHNSZW1haW5pbmcpOw0KKw0KKy8qKg0KKyAqIFdyaXRlcyB0byBhIGhvc3QtdG8tdGFyZ2V0IEZJRk8gb2YgdW5zaWduZWQgMTYtYml0IGludGVnZXJzLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBmaWZvIGhvc3QtdG8tdGFyZ2V0IEZJRk8gdG8gd2hpY2ggdG8gd3JpdGUNCisgKiBAcGFyYW0gZGF0YSBkYXRhIHRvIHdyaXRlDQorICogQHBhcmFtIG51bWJlck9mRWxlbWVudHMgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHdyaXRlDQorICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIE5pRnBnYV9JbmZpbml0ZVRpbWVvdXQNCisgKiBAcGFyYW0gZW1wdHlFbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVtcHR5DQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMgcmVtYWluaW5nIGluIHRoZSBob3N0IG1lbW9yeSBwYXJ0IG9mDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIERNQSBGSUZPDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9Xcml0ZUZpZm9VMTYoTmlGcGdhX1Nlc3Npb24gIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICBmaWZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogZGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgIG51bWJlck9mRWxlbWVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICB0aW1lb3V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICAgZW1wdHlFbGVtZW50c1JlbWFpbmluZyk7DQorDQorLyoqDQorICogV3JpdGVzIHRvIGEgaG9zdC10by10YXJnZXQgRklGTyBvZiBzaWduZWQgMzItYml0IGludGVnZXJzLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBmaWZvIGhvc3QtdG8tdGFyZ2V0IEZJRk8gdG8gd2hpY2ggdG8gd3JpdGUNCisgKiBAcGFyYW0gZGF0YSBkYXRhIHRvIHdyaXRlDQorICogQHBhcmFtIG51bWJlck9mRWxlbWVudHMgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHdyaXRlDQorICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIE5pRnBnYV9JbmZpbml0ZVRpbWVvdXQNCisgKiBAcGFyYW0gZW1wdHlFbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVtcHR5DQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMgcmVtYWluaW5nIGluIHRoZSBob3N0IG1lbW9yeSBwYXJ0IG9mDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIERNQSBGSUZPDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9Xcml0ZUZpZm9JMzIoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgZmlmbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCogZGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgbnVtYmVyT2ZFbGVtZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdGltZW91dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgZW1wdHlFbGVtZW50c1JlbWFpbmluZyk7DQorDQorLyoqDQorICogV3JpdGVzIHRvIGEgaG9zdC10by10YXJnZXQgRklGTyBvZiB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlcnMuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGZpZm8gaG9zdC10by10YXJnZXQgRklGTyB0byB3aGljaCB0byB3cml0ZQ0KKyAqIEBwYXJhbSBkYXRhIGRhdGEgdG8gd3JpdGUNCisgKiBAcGFyYW0gbnVtYmVyT2ZFbGVtZW50cyBudW1iZXIgb2YgZWxlbWVudHMgdG8gd3JpdGUNCisgKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dA0KKyAqIEBwYXJhbSBlbXB0eUVsZW1lbnRzUmVtYWluaW5nIGlmIG5vbi1OVUxMLCBvdXRwdXRzIHRoZSBudW1iZXIgb2YgZW1wdHkNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyByZW1haW5pbmcgaW4gdGhlIGhvc3QgbWVtb3J5IHBhcnQgb2YNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgRE1BIEZJRk8NCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1dyaXRlRmlmb1UzMihOaUZwZ2FfU2Vzc2lvbiAgc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgIGZpZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBkYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgbnVtYmVyT2ZFbGVtZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgIHRpbWVvdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgICBlbXB0eUVsZW1lbnRzUmVtYWluaW5nKTsNCisNCisvKioNCisgKiBXcml0ZXMgdG8gYSBob3N0LXRvLXRhcmdldCBGSUZPIG9mIHNpZ25lZCA2NC1iaXQgaW50ZWdlcnMuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGZpZm8gaG9zdC10by10YXJnZXQgRklGTyB0byB3aGljaCB0byB3cml0ZQ0KKyAqIEBwYXJhbSBkYXRhIGRhdGEgdG8gd3JpdGUNCisgKiBAcGFyYW0gbnVtYmVyT2ZFbGVtZW50cyBudW1iZXIgb2YgZWxlbWVudHMgdG8gd3JpdGUNCisgKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dA0KKyAqIEBwYXJhbSBlbXB0eUVsZW1lbnRzUmVtYWluaW5nIGlmIG5vbi1OVUxMLCBvdXRwdXRzIHRoZSBudW1iZXIgb2YgZW1wdHkNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyByZW1haW5pbmcgaW4gdGhlIGhvc3QgbWVtb3J5IHBhcnQgb2YNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgRE1BIEZJRk8NCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1dyaXRlRmlmb0k2NChOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBmaWZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90KiBkYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBudW1iZXJPZkVsZW1lbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICB0aW1lb3V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbXB0eUVsZW1lbnRzUmVtYWluaW5nKTsNCisNCisvKioNCisgKiBXcml0ZXMgdG8gYSBob3N0LXRvLXRhcmdldCBGSUZPIG9mIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2Vycy4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gZmlmbyBob3N0LXRvLXRhcmdldCBGSUZPIHRvIHdoaWNoIHRvIHdyaXRlDQorICogQHBhcmFtIGRhdGEgZGF0YSB0byB3cml0ZQ0KKyAqIEBwYXJhbSBudW1iZXJPZkVsZW1lbnRzIG51bWJlciBvZiBlbGVtZW50cyB0byB3cml0ZQ0KKyAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciBOaUZwZ2FfSW5maW5pdGVUaW1lb3V0DQorICogQHBhcmFtIGVtcHR5RWxlbWVudHNSZW1haW5pbmcgaWYgbm9uLU5VTEwsIG91dHB1dHMgdGhlIG51bWJlciBvZiBlbXB0eQ0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBETUEgRklGTw0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfV3JpdGVGaWZvVTY0KE5pRnBnYV9TZXNzaW9uICBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgZmlmbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDY0X3QqIGRhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICBudW1iZXJPZkVsZW1lbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgdGltZW91dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgIGVtcHR5RWxlbWVudHNSZW1haW5pbmcpOw0KKw0KKy8qKg0KKyAqIEFjcXVpcmVzIGVsZW1lbnRzIGZvciByZWFkaW5nIGZyb20gYSB0YXJnZXQtdG8taG9zdCBGSUZPIG9mIGJvb2xlYW5zLg0KKyAqDQorICogQWNxdWlyaW5nLCByZWFkaW5nLCBhbmQgcmVsZWFzaW5nIEZJRk8gZWxlbWVudHMgcHJldmVudHMgdGhlIG5lZWQgdG8gY29weQ0KKyAqIHRoZSBjb250ZW50cyBvZiBlbGVtZW50cyBmcm9tIHRoZSBob3N0IG1lbW9yeSBidWZmZXIgdG8gYSBzZXBhcmF0ZQ0KKyAqIHVzZXItYWxsb2NhdGVkIGJ1ZmZlciBiZWZvcmUgcmVhZGluZy4gVGhlIEZQR0EgdGFyZ2V0IGNhbm5vdCB3cml0ZSB0bw0KKyAqIGVsZW1lbnRzIGFjcXVpcmVkIGJ5IHRoZSBob3N0LiBUaGVyZWZvcmUsIHRoZSBob3N0IG11c3QgcmVsZWFzZSBlbGVtZW50cw0KKyAqIGFmdGVyIHJlYWRpbmcgdGhlbS4gVGhlIG51bWJlciBvZiBlbGVtZW50cyBhY3F1aXJlZCBtYXkgZGlmZmVyIGZyb20gdGhlDQorICogbnVtYmVyIG9mIGVsZW1lbnRzIHJlcXVlc3RlZCBpZiwgZm9yIGV4YW1wbGUsIHRoZSBudW1iZXIgb2YgZWxlbWVudHMNCisgKiByZXF1ZXN0ZWQgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBob3N0IG1lbW9yeSBidWZmZXIuIEFsd2F5cyByZWxlYXNlIGFsbA0KKyAqIGFjcXVpcmVkIGVsZW1lbnRzIGJlZm9yZSBjbG9zaW5nIHRoZSBzZXNzaW9uLiBEbyBub3QgYXR0ZW1wdCB0byBhY2Nlc3MgRklGTw0KKyAqIGVsZW1lbnRzIGFmdGVyIHRoZSBlbGVtZW50cyBhcmUgcmVsZWFzZWQgb3IgdGhlIHNlc3Npb24gaXMgY2xvc2VkLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBmaWZvIHRhcmdldC10by1ob3N0IEZJRk8gZnJvbSB3aGljaCB0byByZWFkDQorICogQHBhcmFtIGVsZW1lbnRzIG91dHB1dHMgYSBwb2ludGVyIHRvIHRoZSBlbGVtZW50cyBhY3F1aXJlZA0KKyAqIEBwYXJhbSBlbGVtZW50c1JlcXVlc3RlZCByZXF1ZXN0ZWQgbnVtYmVyIG9mIGVsZW1lbnRzDQorICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIE5pRnBnYV9JbmZpbml0ZVRpbWVvdXQNCisgKiBAcGFyYW0gZWxlbWVudHNBY3F1aXJlZCBhY3R1YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGFjcXVpcmVkLCB3aGljaCBtYXkgYmUNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBsZXNzIHRoYW4gdGhlIHJlcXVlc3RlZCBudW1iZXINCisgKiBAcGFyYW0gZWxlbWVudHNSZW1haW5pbmcgaWYgbm9uLU5VTEwsIG91dHB1dHMgdGhlIG51bWJlciBvZiBlbGVtZW50cw0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgaW4gdGhlIGhvc3QgbWVtb3J5IHBhcnQgb2YgdGhlIERNQSBGSUZPDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9BY3F1aXJlRmlmb1JlYWRFbGVtZW50c0Jvb2woDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBmaWZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5pRnBnYV9Cb29sKiogIGVsZW1lbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIGVsZW1lbnRzUmVxdWVzdGVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHRpbWVvdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgZWxlbWVudHNBY3F1aXJlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbGVtZW50c1JlbWFpbmluZyk7DQorDQorLyoqDQorICogQWNxdWlyZXMgZWxlbWVudHMgZm9yIHJlYWRpbmcgZnJvbSBhIHRhcmdldC10by1ob3N0IEZJRk8gb2Ygc2lnbmVkIDgtYml0DQorICogaW50ZWdlcnMuDQorICoNCisgKiBBY3F1aXJpbmcsIHJlYWRpbmcsIGFuZCByZWxlYXNpbmcgRklGTyBlbGVtZW50cyBwcmV2ZW50cyB0aGUgbmVlZCB0byBjb3B5DQorICogdGhlIGNvbnRlbnRzIG9mIGVsZW1lbnRzIGZyb20gdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlciB0byBhIHNlcGFyYXRlDQorICogdXNlci1hbGxvY2F0ZWQgYnVmZmVyIGJlZm9yZSByZWFkaW5nLiBUaGUgRlBHQSB0YXJnZXQgY2Fubm90IHdyaXRlIHRvDQorICogZWxlbWVudHMgYWNxdWlyZWQgYnkgdGhlIGhvc3QuIFRoZXJlZm9yZSwgdGhlIGhvc3QgbXVzdCByZWxlYXNlIGVsZW1lbnRzDQorICogYWZ0ZXIgcmVhZGluZyB0aGVtLiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGFjcXVpcmVkIG1heSBkaWZmZXIgZnJvbSB0aGUNCisgKiBudW1iZXIgb2YgZWxlbWVudHMgcmVxdWVzdGVkIGlmLCBmb3IgZXhhbXBsZSwgdGhlIG51bWJlciBvZiBlbGVtZW50cw0KKyAqIHJlcXVlc3RlZCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlci4gQWx3YXlzIHJlbGVhc2UgYWxsDQorICogYWNxdWlyZWQgZWxlbWVudHMgYmVmb3JlIGNsb3NpbmcgdGhlIHNlc3Npb24uIERvIG5vdCBhdHRlbXB0IHRvIGFjY2VzcyBGSUZPDQorICogZWxlbWVudHMgYWZ0ZXIgdGhlIGVsZW1lbnRzIGFyZSByZWxlYXNlZCBvciB0aGUgc2Vzc2lvbiBpcyBjbG9zZWQuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGZpZm8gdGFyZ2V0LXRvLWhvc3QgRklGTyBmcm9tIHdoaWNoIHRvIHJlYWQNCisgKiBAcGFyYW0gZWxlbWVudHMgb3V0cHV0cyBhIHBvaW50ZXIgdG8gdGhlIGVsZW1lbnRzIGFjcXVpcmVkDQorICogQHBhcmFtIGVsZW1lbnRzUmVxdWVzdGVkIHJlcXVlc3RlZCBudW1iZXIgb2YgZWxlbWVudHMNCisgKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dA0KKyAqIEBwYXJhbSBlbGVtZW50c0FjcXVpcmVkIGFjdHVhbCBudW1iZXIgb2YgZWxlbWVudHMgYWNxdWlyZWQsIHdoaWNoIG1heSBiZQ0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGxlc3MgdGhhbiB0aGUgcmVxdWVzdGVkIG51bWJlcg0KKyAqIEBwYXJhbSBlbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzDQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZiB0aGUgRE1BIEZJRk8NCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX0FjcXVpcmVGaWZvUmVhZEVsZW1lbnRzSTgoDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBmaWZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCoqICAgICAgIGVsZW1lbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIGVsZW1lbnRzUmVxdWVzdGVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHRpbWVvdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgZWxlbWVudHNBY3F1aXJlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbGVtZW50c1JlbWFpbmluZyk7DQorDQorLyoqDQorICogQWNxdWlyZXMgZWxlbWVudHMgZm9yIHJlYWRpbmcgZnJvbSBhIHRhcmdldC10by1ob3N0IEZJRk8gb2YgdW5zaWduZWQgOC1iaXQNCisgKiBpbnRlZ2Vycy4NCisgKg0KKyAqIEFjcXVpcmluZywgcmVhZGluZywgYW5kIHJlbGVhc2luZyBGSUZPIGVsZW1lbnRzIHByZXZlbnRzIHRoZSBuZWVkIHRvIGNvcHkNCisgKiB0aGUgY29udGVudHMgb2YgZWxlbWVudHMgZnJvbSB0aGUgaG9zdCBtZW1vcnkgYnVmZmVyIHRvIGEgc2VwYXJhdGUNCisgKiB1c2VyLWFsbG9jYXRlZCBidWZmZXIgYmVmb3JlIHJlYWRpbmcuIFRoZSBGUEdBIHRhcmdldCBjYW5ub3Qgd3JpdGUgdG8NCisgKiBlbGVtZW50cyBhY3F1aXJlZCBieSB0aGUgaG9zdC4gVGhlcmVmb3JlLCB0aGUgaG9zdCBtdXN0IHJlbGVhc2UgZWxlbWVudHMNCisgKiBhZnRlciByZWFkaW5nIHRoZW0uIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgYWNxdWlyZWQgbWF5IGRpZmZlciBmcm9tIHRoZQ0KKyAqIG51bWJlciBvZiBlbGVtZW50cyByZXF1ZXN0ZWQgaWYsIGZvciBleGFtcGxlLCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzDQorICogcmVxdWVzdGVkIHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgaG9zdCBtZW1vcnkgYnVmZmVyLiBBbHdheXMgcmVsZWFzZSBhbGwNCisgKiBhY3F1aXJlZCBlbGVtZW50cyBiZWZvcmUgY2xvc2luZyB0aGUgc2Vzc2lvbi4gRG8gbm90IGF0dGVtcHQgdG8gYWNjZXNzIEZJRk8NCisgKiBlbGVtZW50cyBhZnRlciB0aGUgZWxlbWVudHMgYXJlIHJlbGVhc2VkIG9yIHRoZSBzZXNzaW9uIGlzIGNsb3NlZC4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gZmlmbyB0YXJnZXQtdG8taG9zdCBGSUZPIGZyb20gd2hpY2ggdG8gcmVhZA0KKyAqIEBwYXJhbSBlbGVtZW50cyBvdXRwdXRzIGEgcG9pbnRlciB0byB0aGUgZWxlbWVudHMgYWNxdWlyZWQNCisgKiBAcGFyYW0gZWxlbWVudHNSZXF1ZXN0ZWQgcmVxdWVzdGVkIG51bWJlciBvZiBlbGVtZW50cw0KKyAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciBOaUZwZ2FfSW5maW5pdGVUaW1lb3V0DQorICogQHBhcmFtIGVsZW1lbnRzQWNxdWlyZWQgYWN0dWFsIG51bWJlciBvZiBlbGVtZW50cyBhY3F1aXJlZCwgd2hpY2ggbWF5IGJlDQorICogICAgICAgICAgICAgICAgICAgICAgICAgbGVzcyB0aGFuIHRoZSByZXF1ZXN0ZWQgbnVtYmVyDQorICogQHBhcmFtIGVsZW1lbnRzUmVtYWluaW5nIGlmIG5vbi1OVUxMLCBvdXRwdXRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nIGluIHRoZSBob3N0IG1lbW9yeSBwYXJ0IG9mIHRoZSBETUEgRklGTw0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfQWNxdWlyZUZpZm9SZWFkRWxlbWVudHNVOCgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5pRnBnYV9TZXNzaW9uICBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgIGZpZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogICAgICAgZWxlbWVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgZWxlbWVudHNSZXF1ZXN0ZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgdGltZW91dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgICBlbGVtZW50c0FjcXVpcmVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgIGVsZW1lbnRzUmVtYWluaW5nKTsNCisNCisvKioNCisgKiBBY3F1aXJlcyBlbGVtZW50cyBmb3IgcmVhZGluZyBmcm9tIGEgdGFyZ2V0LXRvLWhvc3QgRklGTyBvZiBzaWduZWQgMTYtYml0DQorICogaW50ZWdlcnMuDQorICoNCisgKiBBY3F1aXJpbmcsIHJlYWRpbmcsIGFuZCByZWxlYXNpbmcgRklGTyBlbGVtZW50cyBwcmV2ZW50cyB0aGUgbmVlZCB0byBjb3B5DQorICogdGhlIGNvbnRlbnRzIG9mIGVsZW1lbnRzIGZyb20gdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlciB0byBhIHNlcGFyYXRlDQorICogdXNlci1hbGxvY2F0ZWQgYnVmZmVyIGJlZm9yZSByZWFkaW5nLiBUaGUgRlBHQSB0YXJnZXQgY2Fubm90IHdyaXRlIHRvDQorICogZWxlbWVudHMgYWNxdWlyZWQgYnkgdGhlIGhvc3QuIFRoZXJlZm9yZSwgdGhlIGhvc3QgbXVzdCByZWxlYXNlIGVsZW1lbnRzDQorICogYWZ0ZXIgcmVhZGluZyB0aGVtLiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGFjcXVpcmVkIG1heSBkaWZmZXIgZnJvbSB0aGUNCisgKiBudW1iZXIgb2YgZWxlbWVudHMgcmVxdWVzdGVkIGlmLCBmb3IgZXhhbXBsZSwgdGhlIG51bWJlciBvZiBlbGVtZW50cw0KKyAqIHJlcXVlc3RlZCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlci4gQWx3YXlzIHJlbGVhc2UgYWxsDQorICogYWNxdWlyZWQgZWxlbWVudHMgYmVmb3JlIGNsb3NpbmcgdGhlIHNlc3Npb24uIERvIG5vdCBhdHRlbXB0IHRvIGFjY2VzcyBGSUZPDQorICogZWxlbWVudHMgYWZ0ZXIgdGhlIGVsZW1lbnRzIGFyZSByZWxlYXNlZCBvciB0aGUgc2Vzc2lvbiBpcyBjbG9zZWQuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGZpZm8gdGFyZ2V0LXRvLWhvc3QgRklGTyBmcm9tIHdoaWNoIHRvIHJlYWQNCisgKiBAcGFyYW0gZWxlbWVudHMgb3V0cHV0cyBhIHBvaW50ZXIgdG8gdGhlIGVsZW1lbnRzIGFjcXVpcmVkDQorICogQHBhcmFtIGVsZW1lbnRzUmVxdWVzdGVkIHJlcXVlc3RlZCBudW1iZXIgb2YgZWxlbWVudHMNCisgKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dA0KKyAqIEBwYXJhbSBlbGVtZW50c0FjcXVpcmVkIGFjdHVhbCBudW1iZXIgb2YgZWxlbWVudHMgYWNxdWlyZWQsIHdoaWNoIG1heSBiZQ0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGxlc3MgdGhhbiB0aGUgcmVxdWVzdGVkIG51bWJlcg0KKyAqIEBwYXJhbSBlbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzDQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZiB0aGUgRE1BIEZJRk8NCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX0FjcXVpcmVGaWZvUmVhZEVsZW1lbnRzSTE2KA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmlGcGdhX1Nlc3Npb24gIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgZmlmbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QqKiAgICAgICBlbGVtZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICBlbGVtZW50c1JlcXVlc3RlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICB0aW1lb3V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgIGVsZW1lbnRzQWNxdWlyZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICAgZWxlbWVudHNSZW1haW5pbmcpOw0KKw0KKy8qKg0KKyAqIEFjcXVpcmVzIGVsZW1lbnRzIGZvciByZWFkaW5nIGZyb20gYSB0YXJnZXQtdG8taG9zdCBGSUZPIG9mIHVuc2lnbmVkIDE2LWJpdA0KKyAqIGludGVnZXJzLg0KKyAqDQorICogQWNxdWlyaW5nLCByZWFkaW5nLCBhbmQgcmVsZWFzaW5nIEZJRk8gZWxlbWVudHMgcHJldmVudHMgdGhlIG5lZWQgdG8gY29weQ0KKyAqIHRoZSBjb250ZW50cyBvZiBlbGVtZW50cyBmcm9tIHRoZSBob3N0IG1lbW9yeSBidWZmZXIgdG8gYSBzZXBhcmF0ZQ0KKyAqIHVzZXItYWxsb2NhdGVkIGJ1ZmZlciBiZWZvcmUgcmVhZGluZy4gVGhlIEZQR0EgdGFyZ2V0IGNhbm5vdCB3cml0ZSB0bw0KKyAqIGVsZW1lbnRzIGFjcXVpcmVkIGJ5IHRoZSBob3N0LiBUaGVyZWZvcmUsIHRoZSBob3N0IG11c3QgcmVsZWFzZSBlbGVtZW50cw0KKyAqIGFmdGVyIHJlYWRpbmcgdGhlbS4gVGhlIG51bWJlciBvZiBlbGVtZW50cyBhY3F1aXJlZCBtYXkgZGlmZmVyIGZyb20gdGhlDQorICogbnVtYmVyIG9mIGVsZW1lbnRzIHJlcXVlc3RlZCBpZiwgZm9yIGV4YW1wbGUsIHRoZSBudW1iZXIgb2YgZWxlbWVudHMNCisgKiByZXF1ZXN0ZWQgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBob3N0IG1lbW9yeSBidWZmZXIuIEFsd2F5cyByZWxlYXNlIGFsbA0KKyAqIGFjcXVpcmVkIGVsZW1lbnRzIGJlZm9yZSBjbG9zaW5nIHRoZSBzZXNzaW9uLiBEbyBub3QgYXR0ZW1wdCB0byBhY2Nlc3MgRklGTw0KKyAqIGVsZW1lbnRzIGFmdGVyIHRoZSBlbGVtZW50cyBhcmUgcmVsZWFzZWQgb3IgdGhlIHNlc3Npb24gaXMgY2xvc2VkLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBmaWZvIHRhcmdldC10by1ob3N0IEZJRk8gZnJvbSB3aGljaCB0byByZWFkDQorICogQHBhcmFtIGVsZW1lbnRzIG91dHB1dHMgYSBwb2ludGVyIHRvIHRoZSBlbGVtZW50cyBhY3F1aXJlZA0KKyAqIEBwYXJhbSBlbGVtZW50c1JlcXVlc3RlZCByZXF1ZXN0ZWQgbnVtYmVyIG9mIGVsZW1lbnRzDQorICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIE5pRnBnYV9JbmZpbml0ZVRpbWVvdXQNCisgKiBAcGFyYW0gZWxlbWVudHNBY3F1aXJlZCBhY3R1YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGFjcXVpcmVkLCB3aGljaCBtYXkgYmUNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBsZXNzIHRoYW4gdGhlIHJlcXVlc3RlZCBudW1iZXINCisgKiBAcGFyYW0gZWxlbWVudHNSZW1haW5pbmcgaWYgbm9uLU5VTEwsIG91dHB1dHMgdGhlIG51bWJlciBvZiBlbGVtZW50cw0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgaW4gdGhlIGhvc3QgbWVtb3J5IHBhcnQgb2YgdGhlIERNQSBGSUZPDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9BY3F1aXJlRmlmb1JlYWRFbGVtZW50c1UxNigNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmlGcGdhX1Nlc3Npb24gICBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgIGZpZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiogICAgICAgZWxlbWVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgZWxlbWVudHNSZXF1ZXN0ZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgdGltZW91dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgICBlbGVtZW50c0FjcXVpcmVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICAgIGVsZW1lbnRzUmVtYWluaW5nKTsNCisNCisvKioNCisgKiBBY3F1aXJlcyBlbGVtZW50cyBmb3IgcmVhZGluZyBmcm9tIGEgdGFyZ2V0LXRvLWhvc3QgRklGTyBvZiBzaWduZWQgMzItYml0DQorICogaW50ZWdlcnMuDQorICoNCisgKiBBY3F1aXJpbmcsIHJlYWRpbmcsIGFuZCByZWxlYXNpbmcgRklGTyBlbGVtZW50cyBwcmV2ZW50cyB0aGUgbmVlZCB0byBjb3B5DQorICogdGhlIGNvbnRlbnRzIG9mIGVsZW1lbnRzIGZyb20gdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlciB0byBhIHNlcGFyYXRlDQorICogdXNlci1hbGxvY2F0ZWQgYnVmZmVyIGJlZm9yZSByZWFkaW5nLiBUaGUgRlBHQSB0YXJnZXQgY2Fubm90IHdyaXRlIHRvDQorICogZWxlbWVudHMgYWNxdWlyZWQgYnkgdGhlIGhvc3QuIFRoZXJlZm9yZSwgdGhlIGhvc3QgbXVzdCByZWxlYXNlIGVsZW1lbnRzDQorICogYWZ0ZXIgcmVhZGluZyB0aGVtLiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGFjcXVpcmVkIG1heSBkaWZmZXIgZnJvbSB0aGUNCisgKiBudW1iZXIgb2YgZWxlbWVudHMgcmVxdWVzdGVkIGlmLCBmb3IgZXhhbXBsZSwgdGhlIG51bWJlciBvZiBlbGVtZW50cw0KKyAqIHJlcXVlc3RlZCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlci4gQWx3YXlzIHJlbGVhc2UgYWxsDQorICogYWNxdWlyZWQgZWxlbWVudHMgYmVmb3JlIGNsb3NpbmcgdGhlIHNlc3Npb24uIERvIG5vdCBhdHRlbXB0IHRvIGFjY2VzcyBGSUZPDQorICogZWxlbWVudHMgYWZ0ZXIgdGhlIGVsZW1lbnRzIGFyZSByZWxlYXNlZCBvciB0aGUgc2Vzc2lvbiBpcyBjbG9zZWQuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGZpZm8gdGFyZ2V0LXRvLWhvc3QgRklGTyBmcm9tIHdoaWNoIHRvIHJlYWQNCisgKiBAcGFyYW0gZWxlbWVudHMgb3V0cHV0cyBhIHBvaW50ZXIgdG8gdGhlIGVsZW1lbnRzIGFjcXVpcmVkDQorICogQHBhcmFtIGVsZW1lbnRzUmVxdWVzdGVkIHJlcXVlc3RlZCBudW1iZXIgb2YgZWxlbWVudHMNCisgKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dA0KKyAqIEBwYXJhbSBlbGVtZW50c0FjcXVpcmVkIGFjdHVhbCBudW1iZXIgb2YgZWxlbWVudHMgYWNxdWlyZWQsIHdoaWNoIG1heSBiZQ0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGxlc3MgdGhhbiB0aGUgcmVxdWVzdGVkIG51bWJlcg0KKyAqIEBwYXJhbSBlbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzDQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZiB0aGUgRE1BIEZJRk8NCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX0FjcXVpcmVGaWZvUmVhZEVsZW1lbnRzSTMyKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmlGcGdhX1Nlc3Npb24gIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgZmlmbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqKiAgICAgICBlbGVtZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICBlbGVtZW50c1JlcXVlc3RlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICB0aW1lb3V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgIGVsZW1lbnRzQWNxdWlyZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICAgZWxlbWVudHNSZW1haW5pbmcpOw0KKw0KKy8qKg0KKyAqIEFjcXVpcmVzIGVsZW1lbnRzIGZvciByZWFkaW5nIGZyb20gYSB0YXJnZXQtdG8taG9zdCBGSUZPIG9mIHVuc2lnbmVkIDMyLWJpdA0KKyAqIGludGVnZXJzLg0KKyAqDQorICogQWNxdWlyaW5nLCByZWFkaW5nLCBhbmQgcmVsZWFzaW5nIEZJRk8gZWxlbWVudHMgcHJldmVudHMgdGhlIG5lZWQgdG8gY29weQ0KKyAqIHRoZSBjb250ZW50cyBvZiBlbGVtZW50cyBmcm9tIHRoZSBob3N0IG1lbW9yeSBidWZmZXIgdG8gYSBzZXBhcmF0ZQ0KKyAqIHVzZXItYWxsb2NhdGVkIGJ1ZmZlciBiZWZvcmUgcmVhZGluZy4gVGhlIEZQR0EgdGFyZ2V0IGNhbm5vdCB3cml0ZSB0bw0KKyAqIGVsZW1lbnRzIGFjcXVpcmVkIGJ5IHRoZSBob3N0LiBUaGVyZWZvcmUsIHRoZSBob3N0IG11c3QgcmVsZWFzZSBlbGVtZW50cw0KKyAqIGFmdGVyIHJlYWRpbmcgdGhlbS4gVGhlIG51bWJlciBvZiBlbGVtZW50cyBhY3F1aXJlZCBtYXkgZGlmZmVyIGZyb20gdGhlDQorICogbnVtYmVyIG9mIGVsZW1lbnRzIHJlcXVlc3RlZCBpZiwgZm9yIGV4YW1wbGUsIHRoZSBudW1iZXIgb2YgZWxlbWVudHMNCisgKiByZXF1ZXN0ZWQgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBob3N0IG1lbW9yeSBidWZmZXIuIEFsd2F5cyByZWxlYXNlIGFsbA0KKyAqIGFjcXVpcmVkIGVsZW1lbnRzIGJlZm9yZSBjbG9zaW5nIHRoZSBzZXNzaW9uLiBEbyBub3QgYXR0ZW1wdCB0byBhY2Nlc3MgRklGTw0KKyAqIGVsZW1lbnRzIGFmdGVyIHRoZSBlbGVtZW50cyBhcmUgcmVsZWFzZWQgb3IgdGhlIHNlc3Npb24gaXMgY2xvc2VkLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBmaWZvIHRhcmdldC10by1ob3N0IEZJRk8gZnJvbSB3aGljaCB0byByZWFkDQorICogQHBhcmFtIGVsZW1lbnRzIG91dHB1dHMgYSBwb2ludGVyIHRvIHRoZSBlbGVtZW50cyBhY3F1aXJlZA0KKyAqIEBwYXJhbSBlbGVtZW50c1JlcXVlc3RlZCByZXF1ZXN0ZWQgbnVtYmVyIG9mIGVsZW1lbnRzDQorICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIE5pRnBnYV9JbmZpbml0ZVRpbWVvdXQNCisgKiBAcGFyYW0gZWxlbWVudHNBY3F1aXJlZCBhY3R1YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGFjcXVpcmVkLCB3aGljaCBtYXkgYmUNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBsZXNzIHRoYW4gdGhlIHJlcXVlc3RlZCBudW1iZXINCisgKiBAcGFyYW0gZWxlbWVudHNSZW1haW5pbmcgaWYgbm9uLU5VTEwsIG91dHB1dHMgdGhlIG51bWJlciBvZiBlbGVtZW50cw0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgaW4gdGhlIGhvc3QgbWVtb3J5IHBhcnQgb2YgdGhlIERNQSBGSUZPDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9BY3F1aXJlRmlmb1JlYWRFbGVtZW50c1UzMigNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmlGcGdhX1Nlc3Npb24gICBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgIGZpZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiogICAgICAgZWxlbWVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgZWxlbWVudHNSZXF1ZXN0ZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgdGltZW91dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgICBlbGVtZW50c0FjcXVpcmVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICAgIGVsZW1lbnRzUmVtYWluaW5nKTsNCisNCisvKioNCisgKiBBY3F1aXJlcyBlbGVtZW50cyBmb3IgcmVhZGluZyBmcm9tIGEgdGFyZ2V0LXRvLWhvc3QgRklGTyBvZiBzaWduZWQgNjQtYml0DQorICogaW50ZWdlcnMuDQorICoNCisgKiBBY3F1aXJpbmcsIHJlYWRpbmcsIGFuZCByZWxlYXNpbmcgRklGTyBlbGVtZW50cyBwcmV2ZW50cyB0aGUgbmVlZCB0byBjb3B5DQorICogdGhlIGNvbnRlbnRzIG9mIGVsZW1lbnRzIGZyb20gdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlciB0byBhIHNlcGFyYXRlDQorICogdXNlci1hbGxvY2F0ZWQgYnVmZmVyIGJlZm9yZSByZWFkaW5nLiBUaGUgRlBHQSB0YXJnZXQgY2Fubm90IHdyaXRlIHRvDQorICogZWxlbWVudHMgYWNxdWlyZWQgYnkgdGhlIGhvc3QuIFRoZXJlZm9yZSwgdGhlIGhvc3QgbXVzdCByZWxlYXNlIGVsZW1lbnRzDQorICogYWZ0ZXIgcmVhZGluZyB0aGVtLiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGFjcXVpcmVkIG1heSBkaWZmZXIgZnJvbSB0aGUNCisgKiBudW1iZXIgb2YgZWxlbWVudHMgcmVxdWVzdGVkIGlmLCBmb3IgZXhhbXBsZSwgdGhlIG51bWJlciBvZiBlbGVtZW50cw0KKyAqIHJlcXVlc3RlZCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlci4gQWx3YXlzIHJlbGVhc2UgYWxsDQorICogYWNxdWlyZWQgZWxlbWVudHMgYmVmb3JlIGNsb3NpbmcgdGhlIHNlc3Npb24uIERvIG5vdCBhdHRlbXB0IHRvIGFjY2VzcyBGSUZPDQorICogZWxlbWVudHMgYWZ0ZXIgdGhlIGVsZW1lbnRzIGFyZSByZWxlYXNlZCBvciB0aGUgc2Vzc2lvbiBpcyBjbG9zZWQuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGZpZm8gdGFyZ2V0LXRvLWhvc3QgRklGTyBmcm9tIHdoaWNoIHRvIHJlYWQNCisgKiBAcGFyYW0gZWxlbWVudHMgb3V0cHV0cyBhIHBvaW50ZXIgdG8gdGhlIGVsZW1lbnRzIGFjcXVpcmVkDQorICogQHBhcmFtIGVsZW1lbnRzUmVxdWVzdGVkIHJlcXVlc3RlZCBudW1iZXIgb2YgZWxlbWVudHMNCisgKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dA0KKyAqIEBwYXJhbSBlbGVtZW50c0FjcXVpcmVkIGFjdHVhbCBudW1iZXIgb2YgZWxlbWVudHMgYWNxdWlyZWQsIHdoaWNoIG1heSBiZQ0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGxlc3MgdGhhbiB0aGUgcmVxdWVzdGVkIG51bWJlcg0KKyAqIEBwYXJhbSBlbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzDQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZiB0aGUgRE1BIEZJRk8NCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX0FjcXVpcmVGaWZvUmVhZEVsZW1lbnRzSTY0KA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmlGcGdhX1Nlc3Npb24gIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgZmlmbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqKiAgICAgICBlbGVtZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICBlbGVtZW50c1JlcXVlc3RlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICB0aW1lb3V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgIGVsZW1lbnRzQWNxdWlyZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICAgZWxlbWVudHNSZW1haW5pbmcpOw0KKw0KKy8qKg0KKyAqIEFjcXVpcmVzIGVsZW1lbnRzIGZvciByZWFkaW5nIGZyb20gYSB0YXJnZXQtdG8taG9zdCBGSUZPIG9mIHVuc2lnbmVkIDY0LWJpdA0KKyAqIGludGVnZXJzLg0KKyAqDQorICogQWNxdWlyaW5nLCByZWFkaW5nLCBhbmQgcmVsZWFzaW5nIEZJRk8gZWxlbWVudHMgcHJldmVudHMgdGhlIG5lZWQgdG8gY29weQ0KKyAqIHRoZSBjb250ZW50cyBvZiBlbGVtZW50cyBmcm9tIHRoZSBob3N0IG1lbW9yeSBidWZmZXIgdG8gYSBzZXBhcmF0ZQ0KKyAqIHVzZXItYWxsb2NhdGVkIGJ1ZmZlciBiZWZvcmUgcmVhZGluZy4gVGhlIEZQR0EgdGFyZ2V0IGNhbm5vdCB3cml0ZSB0bw0KKyAqIGVsZW1lbnRzIGFjcXVpcmVkIGJ5IHRoZSBob3N0LiBUaGVyZWZvcmUsIHRoZSBob3N0IG11c3QgcmVsZWFzZSBlbGVtZW50cw0KKyAqIGFmdGVyIHJlYWRpbmcgdGhlbS4gVGhlIG51bWJlciBvZiBlbGVtZW50cyBhY3F1aXJlZCBtYXkgZGlmZmVyIGZyb20gdGhlDQorICogbnVtYmVyIG9mIGVsZW1lbnRzIHJlcXVlc3RlZCBpZiwgZm9yIGV4YW1wbGUsIHRoZSBudW1iZXIgb2YgZWxlbWVudHMNCisgKiByZXF1ZXN0ZWQgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBob3N0IG1lbW9yeSBidWZmZXIuIEFsd2F5cyByZWxlYXNlIGFsbA0KKyAqIGFjcXVpcmVkIGVsZW1lbnRzIGJlZm9yZSBjbG9zaW5nIHRoZSBzZXNzaW9uLiBEbyBub3QgYXR0ZW1wdCB0byBhY2Nlc3MgRklGTw0KKyAqIGVsZW1lbnRzIGFmdGVyIHRoZSBlbGVtZW50cyBhcmUgcmVsZWFzZWQgb3IgdGhlIHNlc3Npb24gaXMgY2xvc2VkLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBmaWZvIHRhcmdldC10by1ob3N0IEZJRk8gZnJvbSB3aGljaCB0byByZWFkDQorICogQHBhcmFtIGVsZW1lbnRzIG91dHB1dHMgYSBwb2ludGVyIHRvIHRoZSBlbGVtZW50cyBhY3F1aXJlZA0KKyAqIEBwYXJhbSBlbGVtZW50c1JlcXVlc3RlZCByZXF1ZXN0ZWQgbnVtYmVyIG9mIGVsZW1lbnRzDQorICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIE5pRnBnYV9JbmZpbml0ZVRpbWVvdXQNCisgKiBAcGFyYW0gZWxlbWVudHNBY3F1aXJlZCBhY3R1YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGFjcXVpcmVkLCB3aGljaCBtYXkgYmUNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBsZXNzIHRoYW4gdGhlIHJlcXVlc3RlZCBudW1iZXINCisgKiBAcGFyYW0gZWxlbWVudHNSZW1haW5pbmcgaWYgbm9uLU5VTEwsIG91dHB1dHMgdGhlIG51bWJlciBvZiBlbGVtZW50cw0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgaW4gdGhlIGhvc3QgbWVtb3J5IHBhcnQgb2YgdGhlIERNQSBGSUZPDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9BY3F1aXJlRmlmb1JlYWRFbGVtZW50c1U2NCgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmlGcGdhX1Nlc3Npb24gICBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgIGZpZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90KiogICAgICAgZWxlbWVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgZWxlbWVudHNSZXF1ZXN0ZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgdGltZW91dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgICBlbGVtZW50c0FjcXVpcmVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICAgIGVsZW1lbnRzUmVtYWluaW5nKTsNCisNCisvKioNCisgKiBBY3F1aXJlcyBlbGVtZW50cyBmb3Igd3JpdGluZyB0byBhIGhvc3QtdG8tdGFyZ2V0IEZJRk8gb2YgYm9vbGVhbnMuDQorICoNCisgKiBBY3F1aXJpbmcsIHdyaXRpbmcsIGFuZCByZWxlYXNpbmcgRklGTyBlbGVtZW50cyBwcmV2ZW50cyB0aGUgbmVlZCB0byB3cml0ZQ0KKyAqIGZpcnN0IGludG8gYSBzZXBhcmF0ZSB1c2VyLWFsbG9jYXRlZCBidWZmZXIgYW5kIHRoZW4gY29weSB0aGUgY29udGVudHMgb2YNCisgKiBlbGVtZW50cyB0byB0aGUgaG9zdCBtZW1vcnkgYnVmZmVyLiBUaGUgRlBHQSB0YXJnZXQgY2Fubm90IHJlYWQgZWxlbWVudHMNCisgKiBhY3F1aXJlZCBieSB0aGUgaG9zdC4gVGhlcmVmb3JlLCB0aGUgaG9zdCBtdXN0IHJlbGVhc2UgZWxlbWVudHMgYWZ0ZXINCisgKiB3cml0aW5nIHRvIHRoZW0uIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgYWNxdWlyZWQgbWF5IGRpZmZlciBmcm9tIHRoZSBudW1iZXINCisgKiBvZiBlbGVtZW50cyByZXF1ZXN0ZWQgaWYsIGZvciBleGFtcGxlLCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHJlcXVlc3RlZA0KKyAqIHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgaG9zdCBtZW1vcnkgYnVmZmVyLiBBbHdheXMgcmVsZWFzZSBhbGwgYWNxdWlyZWQNCisgKiBlbGVtZW50cyBiZWZvcmUgY2xvc2luZyB0aGUgc2Vzc2lvbi4gRG8gbm90IGF0dGVtcHQgdG8gYWNjZXNzIEZJRk8gZWxlbWVudHMNCisgKiBhZnRlciB0aGUgZWxlbWVudHMgYXJlIHJlbGVhc2VkIG9yIHRoZSBzZXNzaW9uIGlzIGNsb3NlZC4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gZmlmbyBob3N0LXRvLXRhcmdldCBGSUZPIHRvIHdoaWNoIHRvIHdyaXRlDQorICogQHBhcmFtIGVsZW1lbnRzIG91dHB1dHMgYSBwb2ludGVyIHRvIHRoZSBlbGVtZW50cyBhY3F1aXJlZA0KKyAqIEBwYXJhbSBlbGVtZW50c1JlcXVlc3RlZCByZXF1ZXN0ZWQgbnVtYmVyIG9mIGVsZW1lbnRzDQorICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIE5pRnBnYV9JbmZpbml0ZVRpbWVvdXQNCisgKiBAcGFyYW0gZWxlbWVudHNBY3F1aXJlZCBhY3R1YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGFjcXVpcmVkLCB3aGljaCBtYXkgYmUNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBsZXNzIHRoYW4gdGhlIHJlcXVlc3RlZCBudW1iZXINCisgKiBAcGFyYW0gZWxlbWVudHNSZW1haW5pbmcgaWYgbm9uLU5VTEwsIG91dHB1dHMgdGhlIG51bWJlciBvZiBlbGVtZW50cw0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgaW4gdGhlIGhvc3QgbWVtb3J5IHBhcnQgb2YgdGhlIERNQSBGSUZPDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9BY3F1aXJlRmlmb1dyaXRlRWxlbWVudHNCb29sKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgZmlmbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaUZwZ2FfQm9vbCoqICBlbGVtZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBlbGVtZW50c1JlcXVlc3RlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICB0aW1lb3V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgIGVsZW1lbnRzQWNxdWlyZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgZWxlbWVudHNSZW1haW5pbmcpOw0KKw0KKy8qKg0KKyAqIEFjcXVpcmVzIGVsZW1lbnRzIGZvciB3cml0aW5nIHRvIGEgaG9zdC10by10YXJnZXQgRklGTyBvZiBzaWduZWQgOC1iaXQNCisgKiBpbnRlZ2Vycy4NCisgKg0KKyAqIEFjcXVpcmluZywgd3JpdGluZywgYW5kIHJlbGVhc2luZyBGSUZPIGVsZW1lbnRzIHByZXZlbnRzIHRoZSBuZWVkIHRvIHdyaXRlDQorICogZmlyc3QgaW50byBhIHNlcGFyYXRlIHVzZXItYWxsb2NhdGVkIGJ1ZmZlciBhbmQgdGhlbiBjb3B5IHRoZSBjb250ZW50cyBvZg0KKyAqIGVsZW1lbnRzIHRvIHRoZSBob3N0IG1lbW9yeSBidWZmZXIuIFRoZSBGUEdBIHRhcmdldCBjYW5ub3QgcmVhZCBlbGVtZW50cw0KKyAqIGFjcXVpcmVkIGJ5IHRoZSBob3N0LiBUaGVyZWZvcmUsIHRoZSBob3N0IG11c3QgcmVsZWFzZSBlbGVtZW50cyBhZnRlcg0KKyAqIHdyaXRpbmcgdG8gdGhlbS4gVGhlIG51bWJlciBvZiBlbGVtZW50cyBhY3F1aXJlZCBtYXkgZGlmZmVyIGZyb20gdGhlIG51bWJlcg0KKyAqIG9mIGVsZW1lbnRzIHJlcXVlc3RlZCBpZiwgZm9yIGV4YW1wbGUsIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgcmVxdWVzdGVkDQorICogcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBob3N0IG1lbW9yeSBidWZmZXIuIEFsd2F5cyByZWxlYXNlIGFsbCBhY3F1aXJlZA0KKyAqIGVsZW1lbnRzIGJlZm9yZSBjbG9zaW5nIHRoZSBzZXNzaW9uLiBEbyBub3QgYXR0ZW1wdCB0byBhY2Nlc3MgRklGTyBlbGVtZW50cw0KKyAqIGFmdGVyIHRoZSBlbGVtZW50cyBhcmUgcmVsZWFzZWQgb3IgdGhlIHNlc3Npb24gaXMgY2xvc2VkLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBmaWZvIGhvc3QtdG8tdGFyZ2V0IEZJRk8gdG8gd2hpY2ggdG8gd3JpdGUNCisgKiBAcGFyYW0gZWxlbWVudHMgb3V0cHV0cyBhIHBvaW50ZXIgdG8gdGhlIGVsZW1lbnRzIGFjcXVpcmVkDQorICogQHBhcmFtIGVsZW1lbnRzUmVxdWVzdGVkIHJlcXVlc3RlZCBudW1iZXIgb2YgZWxlbWVudHMNCisgKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dA0KKyAqIEBwYXJhbSBlbGVtZW50c0FjcXVpcmVkIGFjdHVhbCBudW1iZXIgb2YgZWxlbWVudHMgYWNxdWlyZWQsIHdoaWNoIG1heSBiZQ0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGxlc3MgdGhhbiB0aGUgcmVxdWVzdGVkIG51bWJlcg0KKyAqIEBwYXJhbSBlbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzDQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZiB0aGUgRE1BIEZJRk8NCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX0FjcXVpcmVGaWZvV3JpdGVFbGVtZW50c0k4KA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgZmlmbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QqKiAgICAgICBlbGVtZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBlbGVtZW50c1JlcXVlc3RlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICB0aW1lb3V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgIGVsZW1lbnRzQWNxdWlyZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgZWxlbWVudHNSZW1haW5pbmcpOw0KKw0KKy8qKg0KKyAqIEFjcXVpcmVzIGVsZW1lbnRzIGZvciB3cml0aW5nIHRvIGEgaG9zdC10by10YXJnZXQgRklGTyBvZiB1bnNpZ25lZCA4LWJpdA0KKyAqIGludGVnZXJzLg0KKyAqDQorICogQWNxdWlyaW5nLCB3cml0aW5nLCBhbmQgcmVsZWFzaW5nIEZJRk8gZWxlbWVudHMgcHJldmVudHMgdGhlIG5lZWQgdG8gd3JpdGUNCisgKiBmaXJzdCBpbnRvIGEgc2VwYXJhdGUgdXNlci1hbGxvY2F0ZWQgYnVmZmVyIGFuZCB0aGVuIGNvcHkgdGhlIGNvbnRlbnRzIG9mDQorICogZWxlbWVudHMgdG8gdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlci4gVGhlIEZQR0EgdGFyZ2V0IGNhbm5vdCByZWFkIGVsZW1lbnRzDQorICogYWNxdWlyZWQgYnkgdGhlIGhvc3QuIFRoZXJlZm9yZSwgdGhlIGhvc3QgbXVzdCByZWxlYXNlIGVsZW1lbnRzIGFmdGVyDQorICogd3JpdGluZyB0byB0aGVtLiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGFjcXVpcmVkIG1heSBkaWZmZXIgZnJvbSB0aGUgbnVtYmVyDQorICogb2YgZWxlbWVudHMgcmVxdWVzdGVkIGlmLCBmb3IgZXhhbXBsZSwgdGhlIG51bWJlciBvZiBlbGVtZW50cyByZXF1ZXN0ZWQNCisgKiByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlci4gQWx3YXlzIHJlbGVhc2UgYWxsIGFjcXVpcmVkDQorICogZWxlbWVudHMgYmVmb3JlIGNsb3NpbmcgdGhlIHNlc3Npb24uIERvIG5vdCBhdHRlbXB0IHRvIGFjY2VzcyBGSUZPIGVsZW1lbnRzDQorICogYWZ0ZXIgdGhlIGVsZW1lbnRzIGFyZSByZWxlYXNlZCBvciB0aGUgc2Vzc2lvbiBpcyBjbG9zZWQuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGZpZm8gaG9zdC10by10YXJnZXQgRklGTyB0byB3aGljaCB0byB3cml0ZQ0KKyAqIEBwYXJhbSBlbGVtZW50cyBvdXRwdXRzIGEgcG9pbnRlciB0byB0aGUgZWxlbWVudHMgYWNxdWlyZWQNCisgKiBAcGFyYW0gZWxlbWVudHNSZXF1ZXN0ZWQgcmVxdWVzdGVkIG51bWJlciBvZiBlbGVtZW50cw0KKyAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciBOaUZwZ2FfSW5maW5pdGVUaW1lb3V0DQorICogQHBhcmFtIGVsZW1lbnRzQWNxdWlyZWQgYWN0dWFsIG51bWJlciBvZiBlbGVtZW50cyBhY3F1aXJlZCwgd2hpY2ggbWF5IGJlDQorICogICAgICAgICAgICAgICAgICAgICAgICAgbGVzcyB0aGFuIHRoZSByZXF1ZXN0ZWQgbnVtYmVyDQorICogQHBhcmFtIGVsZW1lbnRzUmVtYWluaW5nIGlmIG5vbi1OVUxMLCBvdXRwdXRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nIGluIHRoZSBob3N0IG1lbW9yeSBwYXJ0IG9mIHRoZSBETUEgRklGTw0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfQWNxdWlyZUZpZm9Xcml0ZUVsZW1lbnRzVTgoDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBmaWZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiAgICAgIGVsZW1lbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIGVsZW1lbnRzUmVxdWVzdGVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHRpbWVvdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgZWxlbWVudHNBY3F1aXJlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbGVtZW50c1JlbWFpbmluZyk7DQorDQorLyoqDQorICogQWNxdWlyZXMgZWxlbWVudHMgZm9yIHdyaXRpbmcgdG8gYSBob3N0LXRvLXRhcmdldCBGSUZPIG9mIHNpZ25lZCAxNi1iaXQNCisgKiBpbnRlZ2Vycy4NCisgKg0KKyAqIEFjcXVpcmluZywgd3JpdGluZywgYW5kIHJlbGVhc2luZyBGSUZPIGVsZW1lbnRzIHByZXZlbnRzIHRoZSBuZWVkIHRvIHdyaXRlDQorICogZmlyc3QgaW50byBhIHNlcGFyYXRlIHVzZXItYWxsb2NhdGVkIGJ1ZmZlciBhbmQgdGhlbiBjb3B5IHRoZSBjb250ZW50cyBvZg0KKyAqIGVsZW1lbnRzIHRvIHRoZSBob3N0IG1lbW9yeSBidWZmZXIuIFRoZSBGUEdBIHRhcmdldCBjYW5ub3QgcmVhZCBlbGVtZW50cw0KKyAqIGFjcXVpcmVkIGJ5IHRoZSBob3N0LiBUaGVyZWZvcmUsIHRoZSBob3N0IG11c3QgcmVsZWFzZSBlbGVtZW50cyBhZnRlcg0KKyAqIHdyaXRpbmcgdG8gdGhlbS4gVGhlIG51bWJlciBvZiBlbGVtZW50cyBhY3F1aXJlZCBtYXkgZGlmZmVyIGZyb20gdGhlIG51bWJlcg0KKyAqIG9mIGVsZW1lbnRzIHJlcXVlc3RlZCBpZiwgZm9yIGV4YW1wbGUsIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgcmVxdWVzdGVkDQorICogcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBob3N0IG1lbW9yeSBidWZmZXIuIEFsd2F5cyByZWxlYXNlIGFsbCBhY3F1aXJlZA0KKyAqIGVsZW1lbnRzIGJlZm9yZSBjbG9zaW5nIHRoZSBzZXNzaW9uLiBEbyBub3QgYXR0ZW1wdCB0byBhY2Nlc3MgRklGTyBlbGVtZW50cw0KKyAqIGFmdGVyIHRoZSBlbGVtZW50cyBhcmUgcmVsZWFzZWQgb3IgdGhlIHNlc3Npb24gaXMgY2xvc2VkLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBmaWZvIGhvc3QtdG8tdGFyZ2V0IEZJRk8gdG8gd2hpY2ggdG8gd3JpdGUNCisgKiBAcGFyYW0gZWxlbWVudHMgb3V0cHV0cyBhIHBvaW50ZXIgdG8gdGhlIGVsZW1lbnRzIGFjcXVpcmVkDQorICogQHBhcmFtIGVsZW1lbnRzUmVxdWVzdGVkIHJlcXVlc3RlZCBudW1iZXIgb2YgZWxlbWVudHMNCisgKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dA0KKyAqIEBwYXJhbSBlbGVtZW50c0FjcXVpcmVkIGFjdHVhbCBudW1iZXIgb2YgZWxlbWVudHMgYWNxdWlyZWQsIHdoaWNoIG1heSBiZQ0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGxlc3MgdGhhbiB0aGUgcmVxdWVzdGVkIG51bWJlcg0KKyAqIEBwYXJhbSBlbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzDQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZiB0aGUgRE1BIEZJRk8NCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX0FjcXVpcmVGaWZvV3JpdGVFbGVtZW50c0kxNigNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGZpZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCoqICAgICAgZWxlbWVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgZWxlbWVudHNSZXF1ZXN0ZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdGltZW91dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbGVtZW50c0FjcXVpcmVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgIGVsZW1lbnRzUmVtYWluaW5nKTsNCisNCisvKioNCisgKiBBY3F1aXJlcyBlbGVtZW50cyBmb3Igd3JpdGluZyB0byBhIGhvc3QtdG8tdGFyZ2V0IEZJRk8gb2YgdW5zaWduZWQgMTYtYml0DQorICogaW50ZWdlcnMuDQorICoNCisgKiBBY3F1aXJpbmcsIHdyaXRpbmcsIGFuZCByZWxlYXNpbmcgRklGTyBlbGVtZW50cyBwcmV2ZW50cyB0aGUgbmVlZCB0byB3cml0ZQ0KKyAqIGZpcnN0IGludG8gYSBzZXBhcmF0ZSB1c2VyLWFsbG9jYXRlZCBidWZmZXIgYW5kIHRoZW4gY29weSB0aGUgY29udGVudHMgb2YNCisgKiBlbGVtZW50cyB0byB0aGUgaG9zdCBtZW1vcnkgYnVmZmVyLiBUaGUgRlBHQSB0YXJnZXQgY2Fubm90IHJlYWQgZWxlbWVudHMNCisgKiBhY3F1aXJlZCBieSB0aGUgaG9zdC4gVGhlcmVmb3JlLCB0aGUgaG9zdCBtdXN0IHJlbGVhc2UgZWxlbWVudHMgYWZ0ZXINCisgKiB3cml0aW5nIHRvIHRoZW0uIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgYWNxdWlyZWQgbWF5IGRpZmZlciBmcm9tIHRoZSBudW1iZXINCisgKiBvZiBlbGVtZW50cyByZXF1ZXN0ZWQgaWYsIGZvciBleGFtcGxlLCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHJlcXVlc3RlZA0KKyAqIHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgaG9zdCBtZW1vcnkgYnVmZmVyLiBBbHdheXMgcmVsZWFzZSBhbGwgYWNxdWlyZWQNCisgKiBlbGVtZW50cyBiZWZvcmUgY2xvc2luZyB0aGUgc2Vzc2lvbi4gRG8gbm90IGF0dGVtcHQgdG8gYWNjZXNzIEZJRk8gZWxlbWVudHMNCisgKiBhZnRlciB0aGUgZWxlbWVudHMgYXJlIHJlbGVhc2VkIG9yIHRoZSBzZXNzaW9uIGlzIGNsb3NlZC4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gZmlmbyBob3N0LXRvLXRhcmdldCBGSUZPIHRvIHdoaWNoIHRvIHdyaXRlDQorICogQHBhcmFtIGVsZW1lbnRzIG91dHB1dHMgYSBwb2ludGVyIHRvIHRoZSBlbGVtZW50cyBhY3F1aXJlZA0KKyAqIEBwYXJhbSBlbGVtZW50c1JlcXVlc3RlZCByZXF1ZXN0ZWQgbnVtYmVyIG9mIGVsZW1lbnRzDQorICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIE5pRnBnYV9JbmZpbml0ZVRpbWVvdXQNCisgKiBAcGFyYW0gZWxlbWVudHNBY3F1aXJlZCBhY3R1YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGFjcXVpcmVkLCB3aGljaCBtYXkgYmUNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBsZXNzIHRoYW4gdGhlIHJlcXVlc3RlZCBudW1iZXINCisgKiBAcGFyYW0gZWxlbWVudHNSZW1haW5pbmcgaWYgbm9uLU5VTEwsIG91dHB1dHMgdGhlIG51bWJlciBvZiBlbGVtZW50cw0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgaW4gdGhlIGhvc3QgbWVtb3J5IHBhcnQgb2YgdGhlIERNQSBGSUZPDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9BY3F1aXJlRmlmb1dyaXRlRWxlbWVudHNVMTYoDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBmaWZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiogICAgIGVsZW1lbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIGVsZW1lbnRzUmVxdWVzdGVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHRpbWVvdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgZWxlbWVudHNBY3F1aXJlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbGVtZW50c1JlbWFpbmluZyk7DQorDQorLyoqDQorICogQWNxdWlyZXMgZWxlbWVudHMgZm9yIHdyaXRpbmcgdG8gYSBob3N0LXRvLXRhcmdldCBGSUZPIG9mIHNpZ25lZCAzMi1iaXQNCisgKiBpbnRlZ2Vycy4NCisgKg0KKyAqIEFjcXVpcmluZywgd3JpdGluZywgYW5kIHJlbGVhc2luZyBGSUZPIGVsZW1lbnRzIHByZXZlbnRzIHRoZSBuZWVkIHRvIHdyaXRlDQorICogZmlyc3QgaW50byBhIHNlcGFyYXRlIHVzZXItYWxsb2NhdGVkIGJ1ZmZlciBhbmQgdGhlbiBjb3B5IHRoZSBjb250ZW50cyBvZg0KKyAqIGVsZW1lbnRzIHRvIHRoZSBob3N0IG1lbW9yeSBidWZmZXIuIFRoZSBGUEdBIHRhcmdldCBjYW5ub3QgcmVhZCBlbGVtZW50cw0KKyAqIGFjcXVpcmVkIGJ5IHRoZSBob3N0LiBUaGVyZWZvcmUsIHRoZSBob3N0IG11c3QgcmVsZWFzZSBlbGVtZW50cyBhZnRlcg0KKyAqIHdyaXRpbmcgdG8gdGhlbS4gVGhlIG51bWJlciBvZiBlbGVtZW50cyBhY3F1aXJlZCBtYXkgZGlmZmVyIGZyb20gdGhlIG51bWJlcg0KKyAqIG9mIGVsZW1lbnRzIHJlcXVlc3RlZCBpZiwgZm9yIGV4YW1wbGUsIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgcmVxdWVzdGVkDQorICogcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBob3N0IG1lbW9yeSBidWZmZXIuIEFsd2F5cyByZWxlYXNlIGFsbCBhY3F1aXJlZA0KKyAqIGVsZW1lbnRzIGJlZm9yZSBjbG9zaW5nIHRoZSBzZXNzaW9uLiBEbyBub3QgYXR0ZW1wdCB0byBhY2Nlc3MgRklGTyBlbGVtZW50cw0KKyAqIGFmdGVyIHRoZSBlbGVtZW50cyBhcmUgcmVsZWFzZWQgb3IgdGhlIHNlc3Npb24gaXMgY2xvc2VkLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBmaWZvIGhvc3QtdG8tdGFyZ2V0IEZJRk8gdG8gd2hpY2ggdG8gd3JpdGUNCisgKiBAcGFyYW0gZWxlbWVudHMgb3V0cHV0cyBhIHBvaW50ZXIgdG8gdGhlIGVsZW1lbnRzIGFjcXVpcmVkDQorICogQHBhcmFtIGVsZW1lbnRzUmVxdWVzdGVkIHJlcXVlc3RlZCBudW1iZXIgb2YgZWxlbWVudHMNCisgKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dA0KKyAqIEBwYXJhbSBlbGVtZW50c0FjcXVpcmVkIGFjdHVhbCBudW1iZXIgb2YgZWxlbWVudHMgYWNxdWlyZWQsIHdoaWNoIG1heSBiZQ0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGxlc3MgdGhhbiB0aGUgcmVxdWVzdGVkIG51bWJlcg0KKyAqIEBwYXJhbSBlbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzDQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZiB0aGUgRE1BIEZJRk8NCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX0FjcXVpcmVGaWZvV3JpdGVFbGVtZW50c0kzMigNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGZpZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCoqICAgICAgZWxlbWVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgZWxlbWVudHNSZXF1ZXN0ZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdGltZW91dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbGVtZW50c0FjcXVpcmVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgIGVsZW1lbnRzUmVtYWluaW5nKTsNCisNCisvKioNCisgKiBBY3F1aXJlcyBlbGVtZW50cyBmb3Igd3JpdGluZyB0byBhIGhvc3QtdG8tdGFyZ2V0IEZJRk8gb2YgdW5zaWduZWQgMzItYml0DQorICogaW50ZWdlcnMuDQorICoNCisgKiBBY3F1aXJpbmcsIHdyaXRpbmcsIGFuZCByZWxlYXNpbmcgRklGTyBlbGVtZW50cyBwcmV2ZW50cyB0aGUgbmVlZCB0byB3cml0ZQ0KKyAqIGZpcnN0IGludG8gYSBzZXBhcmF0ZSB1c2VyLWFsbG9jYXRlZCBidWZmZXIgYW5kIHRoZW4gY29weSB0aGUgY29udGVudHMgb2YNCisgKiBlbGVtZW50cyB0byB0aGUgaG9zdCBtZW1vcnkgYnVmZmVyLiBUaGUgRlBHQSB0YXJnZXQgY2Fubm90IHJlYWQgZWxlbWVudHMNCisgKiBhY3F1aXJlZCBieSB0aGUgaG9zdC4gVGhlcmVmb3JlLCB0aGUgaG9zdCBtdXN0IHJlbGVhc2UgZWxlbWVudHMgYWZ0ZXINCisgKiB3cml0aW5nIHRvIHRoZW0uIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgYWNxdWlyZWQgbWF5IGRpZmZlciBmcm9tIHRoZSBudW1iZXINCisgKiBvZiBlbGVtZW50cyByZXF1ZXN0ZWQgaWYsIGZvciBleGFtcGxlLCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHJlcXVlc3RlZA0KKyAqIHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgaG9zdCBtZW1vcnkgYnVmZmVyLiBBbHdheXMgcmVsZWFzZSBhbGwgYWNxdWlyZWQNCisgKiBlbGVtZW50cyBiZWZvcmUgY2xvc2luZyB0aGUgc2Vzc2lvbi4gRG8gbm90IGF0dGVtcHQgdG8gYWNjZXNzIEZJRk8gZWxlbWVudHMNCisgKiBhZnRlciB0aGUgZWxlbWVudHMgYXJlIHJlbGVhc2VkIG9yIHRoZSBzZXNzaW9uIGlzIGNsb3NlZC4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gZmlmbyBob3N0LXRvLXRhcmdldCBGSUZPIHRvIHdoaWNoIHRvIHdyaXRlDQorICogQHBhcmFtIGVsZW1lbnRzIG91dHB1dHMgYSBwb2ludGVyIHRvIHRoZSBlbGVtZW50cyBhY3F1aXJlZA0KKyAqIEBwYXJhbSBlbGVtZW50c1JlcXVlc3RlZCByZXF1ZXN0ZWQgbnVtYmVyIG9mIGVsZW1lbnRzDQorICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIE5pRnBnYV9JbmZpbml0ZVRpbWVvdXQNCisgKiBAcGFyYW0gZWxlbWVudHNBY3F1aXJlZCBhY3R1YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGFjcXVpcmVkLCB3aGljaCBtYXkgYmUNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBsZXNzIHRoYW4gdGhlIHJlcXVlc3RlZCBudW1iZXINCisgKiBAcGFyYW0gZWxlbWVudHNSZW1haW5pbmcgaWYgbm9uLU5VTEwsIG91dHB1dHMgdGhlIG51bWJlciBvZiBlbGVtZW50cw0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgaW4gdGhlIGhvc3QgbWVtb3J5IHBhcnQgb2YgdGhlIERNQSBGSUZPDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9BY3F1aXJlRmlmb1dyaXRlRWxlbWVudHNVMzIoDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBmaWZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiogICAgIGVsZW1lbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIGVsZW1lbnRzUmVxdWVzdGVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHRpbWVvdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgZWxlbWVudHNBY3F1aXJlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbGVtZW50c1JlbWFpbmluZyk7DQorDQorLyoqDQorICogQWNxdWlyZXMgZWxlbWVudHMgZm9yIHdyaXRpbmcgdG8gYSBob3N0LXRvLXRhcmdldCBGSUZPIG9mIHNpZ25lZCA2NC1iaXQNCisgKiBpbnRlZ2Vycy4NCisgKg0KKyAqIEFjcXVpcmluZywgd3JpdGluZywgYW5kIHJlbGVhc2luZyBGSUZPIGVsZW1lbnRzIHByZXZlbnRzIHRoZSBuZWVkIHRvIHdyaXRlDQorICogZmlyc3QgaW50byBhIHNlcGFyYXRlIHVzZXItYWxsb2NhdGVkIGJ1ZmZlciBhbmQgdGhlbiBjb3B5IHRoZSBjb250ZW50cyBvZg0KKyAqIGVsZW1lbnRzIHRvIHRoZSBob3N0IG1lbW9yeSBidWZmZXIuIFRoZSBGUEdBIHRhcmdldCBjYW5ub3QgcmVhZCBlbGVtZW50cw0KKyAqIGFjcXVpcmVkIGJ5IHRoZSBob3N0LiBUaGVyZWZvcmUsIHRoZSBob3N0IG11c3QgcmVsZWFzZSBlbGVtZW50cyBhZnRlcg0KKyAqIHdyaXRpbmcgdG8gdGhlbS4gVGhlIG51bWJlciBvZiBlbGVtZW50cyBhY3F1aXJlZCBtYXkgZGlmZmVyIGZyb20gdGhlIG51bWJlcg0KKyAqIG9mIGVsZW1lbnRzIHJlcXVlc3RlZCBpZiwgZm9yIGV4YW1wbGUsIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgcmVxdWVzdGVkDQorICogcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBob3N0IG1lbW9yeSBidWZmZXIuIEFsd2F5cyByZWxlYXNlIGFsbCBhY3F1aXJlZA0KKyAqIGVsZW1lbnRzIGJlZm9yZSBjbG9zaW5nIHRoZSBzZXNzaW9uLiBEbyBub3QgYXR0ZW1wdCB0byBhY2Nlc3MgRklGTyBlbGVtZW50cw0KKyAqIGFmdGVyIHRoZSBlbGVtZW50cyBhcmUgcmVsZWFzZWQgb3IgdGhlIHNlc3Npb24gaXMgY2xvc2VkLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBmaWZvIGhvc3QtdG8tdGFyZ2V0IEZJRk8gdG8gd2hpY2ggdG8gd3JpdGUNCisgKiBAcGFyYW0gZWxlbWVudHMgb3V0cHV0cyBhIHBvaW50ZXIgdG8gdGhlIGVsZW1lbnRzIGFjcXVpcmVkDQorICogQHBhcmFtIGVsZW1lbnRzUmVxdWVzdGVkIHJlcXVlc3RlZCBudW1iZXIgb2YgZWxlbWVudHMNCisgKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dA0KKyAqIEBwYXJhbSBlbGVtZW50c0FjcXVpcmVkIGFjdHVhbCBudW1iZXIgb2YgZWxlbWVudHMgYWNxdWlyZWQsIHdoaWNoIG1heSBiZQ0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGxlc3MgdGhhbiB0aGUgcmVxdWVzdGVkIG51bWJlcg0KKyAqIEBwYXJhbSBlbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzDQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZiB0aGUgRE1BIEZJRk8NCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX0FjcXVpcmVGaWZvV3JpdGVFbGVtZW50c0k2NCgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGZpZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCoqICAgICAgZWxlbWVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgZWxlbWVudHNSZXF1ZXN0ZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdGltZW91dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbGVtZW50c0FjcXVpcmVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgIGVsZW1lbnRzUmVtYWluaW5nKTsNCisNCisvKioNCisgKiBBY3F1aXJlcyBlbGVtZW50cyBmb3Igd3JpdGluZyB0byBhIGhvc3QtdG8tdGFyZ2V0IEZJRk8gb2YgdW5zaWduZWQgNjQtYml0DQorICogaW50ZWdlcnMuDQorICoNCisgKiBBY3F1aXJpbmcsIHdyaXRpbmcsIGFuZCByZWxlYXNpbmcgRklGTyBlbGVtZW50cyBwcmV2ZW50cyB0aGUgbmVlZCB0byB3cml0ZQ0KKyAqIGZpcnN0IGludG8gYSBzZXBhcmF0ZSB1c2VyLWFsbG9jYXRlZCBidWZmZXIgYW5kIHRoZW4gY29weSB0aGUgY29udGVudHMgb2YNCisgKiBlbGVtZW50cyB0byB0aGUgaG9zdCBtZW1vcnkgYnVmZmVyLiBUaGUgRlBHQSB0YXJnZXQgY2Fubm90IHJlYWQgZWxlbWVudHMNCisgKiBhY3F1aXJlZCBieSB0aGUgaG9zdC4gVGhlcmVmb3JlLCB0aGUgaG9zdCBtdXN0IHJlbGVhc2UgZWxlbWVudHMgYWZ0ZXINCisgKiB3cml0aW5nIHRvIHRoZW0uIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgYWNxdWlyZWQgbWF5IGRpZmZlciBmcm9tIHRoZSBudW1iZXINCisgKiBvZiBlbGVtZW50cyByZXF1ZXN0ZWQgaWYsIGZvciBleGFtcGxlLCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHJlcXVlc3RlZA0KKyAqIHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgaG9zdCBtZW1vcnkgYnVmZmVyLiBBbHdheXMgcmVsZWFzZSBhbGwgYWNxdWlyZWQNCisgKiBlbGVtZW50cyBiZWZvcmUgY2xvc2luZyB0aGUgc2Vzc2lvbi4gRG8gbm90IGF0dGVtcHQgdG8gYWNjZXNzIEZJRk8gZWxlbWVudHMNCisgKiBhZnRlciB0aGUgZWxlbWVudHMgYXJlIHJlbGVhc2VkIG9yIHRoZSBzZXNzaW9uIGlzIGNsb3NlZC4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gZmlmbyBob3N0LXRvLXRhcmdldCBGSUZPIHRvIHdoaWNoIHRvIHdyaXRlDQorICogQHBhcmFtIGVsZW1lbnRzIG91dHB1dHMgYSBwb2ludGVyIHRvIHRoZSBlbGVtZW50cyBhY3F1aXJlZA0KKyAqIEBwYXJhbSBlbGVtZW50c1JlcXVlc3RlZCByZXF1ZXN0ZWQgbnVtYmVyIG9mIGVsZW1lbnRzDQorICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIE5pRnBnYV9JbmZpbml0ZVRpbWVvdXQNCisgKiBAcGFyYW0gZWxlbWVudHNBY3F1aXJlZCBhY3R1YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGFjcXVpcmVkLCB3aGljaCBtYXkgYmUNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBsZXNzIHRoYW4gdGhlIHJlcXVlc3RlZCBudW1iZXINCisgKiBAcGFyYW0gZWxlbWVudHNSZW1haW5pbmcgaWYgbm9uLU5VTEwsIG91dHB1dHMgdGhlIG51bWJlciBvZiBlbGVtZW50cw0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgaW4gdGhlIGhvc3QgbWVtb3J5IHBhcnQgb2YgdGhlIERNQSBGSUZPDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9BY3F1aXJlRmlmb1dyaXRlRWxlbWVudHNVNjQoDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBmaWZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90KiogICAgIGVsZW1lbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIGVsZW1lbnRzUmVxdWVzdGVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHRpbWVvdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgZWxlbWVudHNBY3F1aXJlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbGVtZW50c1JlbWFpbmluZyk7DQorDQorLyoqDQorICogUmVsZWFzZXMgcHJldmlvdXNseSBhY3F1aXJlZCBGSUZPIGVsZW1lbnRzLg0KKyAqDQorICogVGhlIEZQR0EgdGFyZ2V0IGNhbm5vdCByZWFkIGVsZW1lbnRzIGFjcXVpcmVkIGJ5IHRoZSBob3N0LiBUaGVyZWZvcmUsIHRoZQ0KKyAqIGhvc3QgbXVzdCByZWxlYXNlIGVsZW1lbnRzIGFmdGVyIGFjcXVpcmluZyB0aGVtLiBBbHdheXMgcmVsZWFzZSBhbGwgYWNxdWlyZWQNCisgKiBlbGVtZW50cyBiZWZvcmUgY2xvc2luZyB0aGUgc2Vzc2lvbi4gRG8gbm90IGF0dGVtcHQgdG8gYWNjZXNzIEZJRk8gZWxlbWVudHMNCisgKiBhZnRlciB0aGUgZWxlbWVudHMgYXJlIHJlbGVhc2VkIG9yIHRoZSBzZXNzaW9uIGlzIGNsb3NlZC4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gZmlmbyBGSUZPIGZyb20gd2hpY2ggdG8gcmVsZWFzZSBlbGVtZW50cw0KKyAqIEBwYXJhbSBlbGVtZW50cyBudW1iZXIgb2YgZWxlbWVudHMgdG8gcmVsZWFzZQ0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfUmVsZWFzZUZpZm9FbGVtZW50cyhOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgZmlmbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIGVsZW1lbnRzKTsNCisNCisvKioNCisgKiBHZXRzIGFuIGVuZHBvaW50IHJlZmVyZW5jZSB0byBhIHBlZXItdG8tcGVlciBGSUZPLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBmaWZvIHBlZXItdG8tcGVlciBGSUZPDQorICogQHBhcmFtIGVuZHBvaW50IG91dHB1dHMgdGhlIGVuZHBvaW50IHJlZmVyZW5jZQ0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfR2V0UGVlclRvUGVlckZpZm9FbmRwb2ludChOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgZmlmbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiAgICAgIGVuZHBvaW50KTsNCisNCisjaWYgTmlGcGdhX0NwcA0KK30NCisjZW5kaWYNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25JbnZhcmlhbnRGUEdBTmFtZXNwYWNlL25JbnRlcmZhY2VHbG9iYWxzLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25JbnZhcmlhbnRGUEdBTmFtZXNwYWNlL25JbnRlcmZhY2VHbG9iYWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJkMDdkNAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvbkludmFyaWFudEZQR0FOYW1lc3BhY2UvbkludGVyZmFjZUdsb2JhbHMuaApAQCAtMCwwICsxLDE1IEBACisvLyBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKy8vIERvIE5vdCBFZGl0Li4uIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQhDQorDQorI2lmbmRlZiBfX25GUkNfQzBFRl8xXzFfMF9uSW50ZXJmYWNlR2xvYmFsc19oX18NCisjZGVmaW5lIF9fbkZSQ19DMEVGXzFfMV8wX25JbnRlcmZhY2VHbG9iYWxzX2hfXw0KKw0KK25hbWVzcGFjZSBuRlBHQQ0KK3sNCituYW1lc3BhY2UgbkZSQ19DMEVGXzFfMV8wDQorew0KKyAgIGV4dGVybiB1bnNpZ25lZCBpbnQgZ19jdXJyZW50VGFyZ2V0Q2xhc3M7DQorfQ0KK30NCisNCisjZW5kaWYgLy8gX19uRlJDX0MwRUZfMV8xXzBfbkludGVyZmFjZUdsb2JhbHNfaF9fDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uSW52YXJpYW50RlBHQU5hbWVzcGFjZS90QUkuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvbkludmFyaWFudEZQR0FOYW1lc3BhY2UvdEFJLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQxMjFiNQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvbkludmFyaWFudEZQR0FOYW1lc3BhY2UvdEFJLmgKQEAgLTAsMCArMSw3MyBAQAorLy8gQ29weXJpZ2h0IChjKSBOYXRpb25hbCBJbnN0cnVtZW50cyAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCisvLyBEbyBOb3QgRWRpdC4uLiB0aGlzIGZpbGUgaXMgZ2VuZXJhdGVkIQ0KKw0KKyNpZm5kZWYgX19uRlJDX0MwRUZfMV8xXzBfQUlfaF9fDQorI2RlZmluZSBfX25GUkNfQzBFRl8xXzFfMF9BSV9oX18NCisNCisjaW5jbHVkZSAidFN5c3RlbUludGVyZmFjZS5oIg0KKw0KK25hbWVzcGFjZSBuRlBHQQ0KK3sNCituYW1lc3BhY2UgbkZSQ19DMEVGXzFfMV8wDQorew0KKw0KK2NsYXNzIHRBSQ0KK3sNCitwdWJsaWM6DQorICAgdEFJKCl7fQ0KKyAgIHZpcnR1YWwgfnRBSSgpe30NCisNCisgICB2aXJ0dWFsIHRTeXN0ZW1JbnRlcmZhY2UqIGdldFN5c3RlbUludGVyZmFjZSgpID0gMDsNCisgICBzdGF0aWMgdEFJKiBjcmVhdGUodW5zaWduZWQgY2hhciBzeXNfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciBnZXRTeXN0ZW1JbmRleCgpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bVN5c3RlbXMgPSAyLA0KKyAgIH0gdElmYWNlQ29uc3RhbnRzOw0KKw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRDYWxPS19JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENhbE9LKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0RG9uZVRpbWVfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcmVhZERvbmVUaW1lKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bU9mZnNldFJlZ2lzdGVycyA9IDgsDQorICAgfSB0T2Zmc2V0X0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgc2lnbmVkIGludCByZWFkT2Zmc2V0KHVuc2lnbmVkIGNoYXIgcmVnX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1MU0JXZWlnaHRSZWdpc3RlcnMgPSA4LA0KKyAgIH0gdExTQldlaWdodF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGludCByZWFkTFNCV2VpZ2h0KHVuc2lnbmVkIGNoYXIgcmVnX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorDQorcHJpdmF0ZToNCisgICB0QUkoY29uc3QgdEFJJik7DQorICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgdEFJJik7DQorfTsNCisNCit9DQorfQ0KKw0KKyNlbmRpZiAvLyBfX25GUkNfQzBFRl8xXzFfMF9BSV9oX18NCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25JbnZhcmlhbnRGUEdBTmFtZXNwYWNlL3RHbG9iYWwuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvbkludmFyaWFudEZQR0FOYW1lc3BhY2UvdEdsb2JhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNzQxMTcKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25JbnZhcmlhbnRGUEdBTmFtZXNwYWNlL3RHbG9iYWwuaApAQCAtMCwwICsxLDY5IEBACisvLyBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKy8vIERvIE5vdCBFZGl0Li4uIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQhDQorDQorI2lmbmRlZiBfX25GUkNfQzBFRl8xXzFfMF9HbG9iYWxfaF9fDQorI2RlZmluZSBfX25GUkNfQzBFRl8xXzFfMF9HbG9iYWxfaF9fDQorDQorI2luY2x1ZGUgInRTeXN0ZW1JbnRlcmZhY2UuaCINCisNCituYW1lc3BhY2UgbkZQR0ENCit7DQorbmFtZXNwYWNlIG5GUkNfQzBFRl8xXzFfMA0KK3sNCisNCitjbGFzcyB0R2xvYmFsDQorew0KK3B1YmxpYzoNCisgICB0R2xvYmFsKCl7fQ0KKyAgIHZpcnR1YWwgfnRHbG9iYWwoKXt9DQorDQorICAgdmlydHVhbCB0U3lzdGVtSW50ZXJmYWNlKiBnZXRTeXN0ZW1JbnRlcmZhY2UoKSA9IDA7DQorICAgc3RhdGljIHRHbG9iYWwqIGNyZWF0ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bVN5c3RlbXMgPSAxLA0KKyAgIH0gdElmYWNlQ29uc3RhbnRzOw0KKw0KKw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRWZXJzaW9uX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZFZlcnNpb24odFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRMb2NhbFRpbWVfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcmVhZExvY2FsVGltZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFJldmlzaW9uX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJlYWRSZXZpc2lvbih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFJlc2VydmVkX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkUmVzZXJ2ZWQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKw0KKw0KK3ByaXZhdGU6DQorICAgdEdsb2JhbChjb25zdCB0R2xvYmFsJik7DQorICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgdEdsb2JhbCYpOw0KK307DQorDQorfQ0KK30NCisNCisjZW5kaWYgLy8gX19uRlJDX0MwRUZfMV8xXzBfR2xvYmFsX2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvbkludmFyaWFudEZQR0FOYW1lc3BhY2UvdExvYWRPdXQuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvbkludmFyaWFudEZQR0FOYW1lc3BhY2UvdExvYWRPdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2M0ZWJiCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uSW52YXJpYW50RlBHQU5hbWVzcGFjZS90TG9hZE91dC5oCkBAIC0wLDAgKzEsNzkgQEAKKy8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorLy8gRG8gTm90IEVkaXQuLi4gdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCENCisNCisjaWZuZGVmIF9fbkZSQ19DMEVGXzFfMV8wX0xvYWRPdXRfaF9fDQorI2RlZmluZSBfX25GUkNfQzBFRl8xXzFfMF9Mb2FkT3V0X2hfXw0KKw0KKyNpbmNsdWRlICJ0U3lzdGVtSW50ZXJmYWNlLmgiDQorDQorbmFtZXNwYWNlIG5GUEdBDQorew0KK25hbWVzcGFjZSBuRlJDX0MwRUZfMV8xXzANCit7DQorDQorY2xhc3MgdExvYWRPdXQNCit7DQorcHVibGljOg0KKyAgIHRMb2FkT3V0KCl7fQ0KKyAgIHZpcnR1YWwgfnRMb2FkT3V0KCl7fQ0KKw0KKyAgIHZpcnR1YWwgdFN5c3RlbUludGVyZmFjZSogZ2V0U3lzdGVtSW50ZXJmYWNlKCkgPSAwOw0KKyAgIHN0YXRpYyB0TG9hZE91dCogY3JlYXRlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtU3lzdGVtcyA9IDEsDQorICAgfSB0SWZhY2VDb25zdGFudHM7DQorDQorDQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFJlYWR5X0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkUmVhZHkodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHREb25lVGltZV9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGludCByZWFkRG9uZVRpbWUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtVmVuZG9ySURSZWdpc3RlcnMgPSA4LA0KKyAgIH0gdFZlbmRvcklEX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZFZlbmRvcklEKHVuc2lnbmVkIGNoYXIgcmVnX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1TZXJpYWxOdW1iZXJSZWdpc3RlcnMgPSA4LA0KKyAgIH0gdFNlcmlhbE51bWJlcl9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGludCByZWFkU2VyaWFsTnVtYmVyKHVuc2lnbmVkIGNoYXIgcmVnX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1Nb2R1bGVJRFJlZ2lzdGVycyA9IDgsDQorICAgfSB0TW9kdWxlSURfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkTW9kdWxlSUQodW5zaWduZWQgY2hhciByZWdfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCitwcml2YXRlOg0KKyAgIHRMb2FkT3V0KGNvbnN0IHRMb2FkT3V0Jik7DQorICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgdExvYWRPdXQmKTsNCit9Ow0KKw0KK30NCit9DQorDQorI2VuZGlmIC8vIF9fbkZSQ19DMEVGXzFfMV8wX0xvYWRPdXRfaF9fDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL25JbnRlcmZhY2VHbG9iYWxzLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvbkludGVyZmFjZUdsb2JhbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmY1YTBlCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL25JbnRlcmZhY2VHbG9iYWxzLmgKQEAgLTAsMCArMSwxNSBAQAorLy8gQ29weXJpZ2h0IChjKSBOYXRpb25hbCBJbnN0cnVtZW50cyAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCisvLyBEbyBOb3QgRWRpdC4uLiB0aGlzIGZpbGUgaXMgZ2VuZXJhdGVkIQ0KKw0KKyNpZm5kZWYgX19uRlJDXzIwMTVfMV8wX0FfbkludGVyZmFjZUdsb2JhbHNfaF9fDQorI2RlZmluZSBfX25GUkNfMjAxNV8xXzBfQV9uSW50ZXJmYWNlR2xvYmFsc19oX18NCisNCituYW1lc3BhY2UgbkZQR0ENCit7DQorbmFtZXNwYWNlIG5GUkNfMjAxNV8xXzBfQQ0KK3sNCisgICBleHRlcm4gdW5zaWduZWQgaW50IGdfY3VycmVudFRhcmdldENsYXNzOw0KK30NCit9DQorDQorI2VuZGlmIC8vIF9fbkZSQ18yMDE1XzFfMF9BX25JbnRlcmZhY2VHbG9iYWxzX2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90QUkuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90QUkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYThmNjE0Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RBSS5oCkBAIC0wLDAgKzEsMTQzIEBACisvLyBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKy8vIERvIE5vdCBFZGl0Li4uIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQhDQorDQorI2lmbmRlZiBfX25GUkNfMjAxNV8xXzBfQV9BSV9oX18NCisjZGVmaW5lIF9fbkZSQ18yMDE1XzFfMF9BX0FJX2hfXw0KKw0KKyNpbmNsdWRlICJ0U3lzdGVtSW50ZXJmYWNlLmgiDQorDQorbmFtZXNwYWNlIG5GUEdBDQorew0KK25hbWVzcGFjZSBuRlJDXzIwMTVfMV8wX0ENCit7DQorDQorY2xhc3MgdEFJDQorew0KK3B1YmxpYzoNCisgICB0QUkoKXt9DQorICAgdmlydHVhbCB+dEFJKCl7fQ0KKw0KKyAgIHZpcnR1YWwgdFN5c3RlbUludGVyZmFjZSogZ2V0U3lzdGVtSW50ZXJmYWNlKCkgPSAwOw0KKyAgIHN0YXRpYyB0QUkqIGNyZWF0ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bVN5c3RlbXMgPSAxLA0KKyAgIH0gdElmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHR5cGVkZWYNCisgICB1bmlvbnsNCisgICAgICBzdHJ1Y3R7DQorI2lmZGVmIF9fdnh3b3Jrcw0KKyAgICAgICAgIHVuc2lnbmVkIFNjYW5TaXplIDogMzsNCisgICAgICAgICB1bnNpZ25lZCBDb252ZXJ0UmF0ZSA6IDI2Ow0KKyNlbHNlDQorICAgICAgICAgdW5zaWduZWQgQ29udmVydFJhdGUgOiAyNjsNCisgICAgICAgICB1bnNpZ25lZCBTY2FuU2l6ZSA6IDM7DQorI2VuZGlmDQorICAgICAgfTsNCisgICAgICBzdHJ1Y3R7DQorICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiAyOTsNCisgICAgICB9Ow0KKyAgIH0gdENvbmZpZzsNCisgICB0eXBlZGVmDQorICAgdW5pb257DQorICAgICAgc3RydWN0ew0KKyNpZmRlZiBfX3Z4d29ya3MNCisgICAgICAgICB1bnNpZ25lZCBDaGFubmVsIDogMzsNCisgICAgICAgICB1bnNpZ25lZCBBdmVyYWdlZCA6IDE7DQorI2Vsc2UNCisgICAgICAgICB1bnNpZ25lZCBBdmVyYWdlZCA6IDE7DQorICAgICAgICAgdW5zaWduZWQgQ2hhbm5lbCA6IDM7DQorI2VuZGlmDQorICAgICAgfTsNCisgICAgICBzdHJ1Y3R7DQorICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiA0Ow0KKyAgICAgIH07DQorICAgfSB0UmVhZFNlbGVjdDsNCisNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0T3V0cHV0X0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgc2lnbmVkIGludCByZWFkT3V0cHV0KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0Q29uZmlnX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZyh0Q29uZmlnIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX1NjYW5TaXplKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfQ29udmVydFJhdGUodW5zaWduZWQgaW50IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB0Q29uZmlnIHJlYWRDb25maWcodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ29uZmlnX1NjYW5TaXplKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGludCByZWFkQ29uZmlnX0NvbnZlcnRSYXRlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0TG9vcFRpbWluZ19JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGludCByZWFkTG9vcFRpbWluZyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1PdmVyc2FtcGxlQml0c0VsZW1lbnRzID0gOCwNCisgICB9IHRPdmVyc2FtcGxlQml0c19JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVPdmVyc2FtcGxlQml0cyh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRPdmVyc2FtcGxlQml0cyh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1BdmVyYWdlQml0c0VsZW1lbnRzID0gOCwNCisgICB9IHRBdmVyYWdlQml0c19JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVBdmVyYWdlQml0cyh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRBdmVyYWdlQml0cyh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1TY2FuTGlzdEVsZW1lbnRzID0gOCwNCisgICB9IHRTY2FuTGlzdF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVTY2FuTGlzdCh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRTY2FuTGlzdCh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdExhdGNoT3V0cHV0X0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCBzdHJvYmVMYXRjaE91dHB1dCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFJlYWRTZWxlY3RfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlUmVhZFNlbGVjdCh0UmVhZFNlbGVjdCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVJlYWRTZWxlY3RfQ2hhbm5lbCh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlUmVhZFNlbGVjdF9BdmVyYWdlZChib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB0UmVhZFNlbGVjdCByZWFkUmVhZFNlbGVjdCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRSZWFkU2VsZWN0X0NoYW5uZWwodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkUmVhZFNlbGVjdF9BdmVyYWdlZCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorDQorDQorcHJpdmF0ZToNCisgICB0QUkoY29uc3QgdEFJJik7DQorICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgdEFJJik7DQorfTsNCisNCit9DQorfQ0KKw0KKyNlbmRpZiAvLyBfX25GUkNfMjAxNV8xXzBfQV9BSV9oX18NCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEFPLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEFPLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE2MGYwNAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90QU8uaApAQCAtMCwwICsxLDUwIEBACisvLyBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKy8vIERvIE5vdCBFZGl0Li4uIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQhDQorDQorI2lmbmRlZiBfX25GUkNfMjAxNV8xXzBfQV9BT19oX18NCisjZGVmaW5lIF9fbkZSQ18yMDE1XzFfMF9BX0FPX2hfXw0KKw0KKyNpbmNsdWRlICJ0U3lzdGVtSW50ZXJmYWNlLmgiDQorDQorbmFtZXNwYWNlIG5GUEdBDQorew0KK25hbWVzcGFjZSBuRlJDXzIwMTVfMV8wX0ENCit7DQorDQorY2xhc3MgdEFPDQorew0KK3B1YmxpYzoNCisgICB0QU8oKXt9DQorICAgdmlydHVhbCB+dEFPKCl7fQ0KKw0KKyAgIHZpcnR1YWwgdFN5c3RlbUludGVyZmFjZSogZ2V0U3lzdGVtSW50ZXJmYWNlKCkgPSAwOw0KKyAgIHN0YXRpYyB0QU8qIGNyZWF0ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bVN5c3RlbXMgPSAxLA0KKyAgIH0gdElmYWNlQ29uc3RhbnRzOw0KKw0KKw0KKw0KKw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtTVhQUmVnaXN0ZXJzID0gMiwNCisgICB9IHRNWFBfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlTVhQKHVuc2lnbmVkIGNoYXIgcmVnX2luZGV4LCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZE1YUCh1bnNpZ25lZCBjaGFyIHJlZ19pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KK3ByaXZhdGU6DQorICAgdEFPKGNvbnN0IHRBTyYpOw0KKyAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHRBTyYpOw0KK307DQorDQorfQ0KK30NCisNCisjZW5kaWYgLy8gX19uRlJDXzIwMTVfMV8wX0FfQU9faF9fDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RBY2NlbC5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RBY2NlbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMzE4ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEFjY2VsLmgKQEAgLTAsMCArMSwxMDIgQEAKKy8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorLy8gRG8gTm90IEVkaXQuLi4gdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCENCisNCisjaWZuZGVmIF9fbkZSQ18yMDE1XzFfMF9BX0FjY2VsX2hfXw0KKyNkZWZpbmUgX19uRlJDXzIwMTVfMV8wX0FfQWNjZWxfaF9fDQorDQorI2luY2x1ZGUgInRTeXN0ZW1JbnRlcmZhY2UuaCINCisNCituYW1lc3BhY2UgbkZQR0ENCit7DQorbmFtZXNwYWNlIG5GUkNfMjAxNV8xXzBfQQ0KK3sNCisNCitjbGFzcyB0QWNjZWwNCit7DQorcHVibGljOg0KKyAgIHRBY2NlbCgpe30NCisgICB2aXJ0dWFsIH50QWNjZWwoKXt9DQorDQorICAgdmlydHVhbCB0U3lzdGVtSW50ZXJmYWNlKiBnZXRTeXN0ZW1JbnRlcmZhY2UoKSA9IDA7DQorICAgc3RhdGljIHRBY2NlbCogY3JlYXRlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtU3lzdGVtcyA9IDEsDQorICAgfSB0SWZhY2VDb25zdGFudHM7DQorDQorDQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFNUQVRfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRTVEFUKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0Q05UUl9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDTlRSKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZENOVFIodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHREQVRPX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZURBVE8odW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkREFUTyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdENORkdfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ05GRyh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRDTkZHKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0Q05UTF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDTlRMKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZENOVEwodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHREQVRJX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkREFUSSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdEdPX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCBzdHJvYmVHTyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdEFERFJfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlQUREUih1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRBRERSKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisNCisNCitwcml2YXRlOg0KKyAgIHRBY2NlbChjb25zdCB0QWNjZWwmKTsNCisgICB2b2lkIG9wZXJhdG9yPShjb25zdCB0QWNjZWwmKTsNCit9Ow0KKw0KK30NCit9DQorDQorI2VuZGlmIC8vIF9fbkZSQ18yMDE1XzFfMF9BX0FjY2VsX2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90QWNjdW11bGF0b3IuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90QWNjdW11bGF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTFjNWZiCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RBY2N1bXVsYXRvci5oCkBAIC0wLDAgKzEsODcgQEAKKy8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorLy8gRG8gTm90IEVkaXQuLi4gdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCENCisNCisjaWZuZGVmIF9fbkZSQ18yMDE1XzFfMF9BX0FjY3VtdWxhdG9yX2hfXw0KKyNkZWZpbmUgX19uRlJDXzIwMTVfMV8wX0FfQWNjdW11bGF0b3JfaF9fDQorDQorI2luY2x1ZGUgInRTeXN0ZW1JbnRlcmZhY2UuaCINCisNCituYW1lc3BhY2UgbkZQR0ENCit7DQorbmFtZXNwYWNlIG5GUkNfMjAxNV8xXzBfQQ0KK3sNCisNCitjbGFzcyB0QWNjdW11bGF0b3INCit7DQorcHVibGljOg0KKyAgIHRBY2N1bXVsYXRvcigpe30NCisgICB2aXJ0dWFsIH50QWNjdW11bGF0b3IoKXt9DQorDQorICAgdmlydHVhbCB0U3lzdGVtSW50ZXJmYWNlKiBnZXRTeXN0ZW1JbnRlcmZhY2UoKSA9IDA7DQorICAgc3RhdGljIHRBY2N1bXVsYXRvciogY3JlYXRlKHVuc2lnbmVkIGNoYXIgc3lzX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgZ2V0U3lzdGVtSW5kZXgoKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1TeXN0ZW1zID0gMiwNCisgICB9IHRJZmFjZUNvbnN0YW50czsNCisNCisgICB0eXBlZGVmDQorICAgdW5pb257DQorICAgICAgc3RydWN0ew0KKyAgICAgICAgIHNpZ25lZCBsb25nIGxvbmcgVmFsdWU7DQorICAgICAgICAgdW5zaWduZWQgQ291bnQgOiAzMjsNCisgICAgICB9Ow0KKyAgICAgIHN0cnVjdHsNCisgICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDMyOw0KKyAgICAgICAgIHVuc2lnbmVkIHZhbHVlMiA6IDMyOw0KKyAgICAgICAgIHVuc2lnbmVkIHZhbHVlMyA6IDMyOw0KKyAgICAgIH07DQorICAgfSB0T3V0cHV0Ow0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRPdXRwdXRfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB0T3V0cHV0IHJlYWRPdXRwdXQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgc2lnbmVkIGxvbmcgbG9uZyByZWFkT3V0cHV0X1ZhbHVlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGludCByZWFkT3V0cHV0X0NvdW50KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0Q2VudGVyX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNlbnRlcihzaWduZWQgaW50IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBzaWduZWQgaW50IHJlYWRDZW50ZXIodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHREZWFkYmFuZF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVEZWFkYmFuZChzaWduZWQgaW50IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBzaWduZWQgaW50IHJlYWREZWFkYmFuZCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFJlc2V0X0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCBzdHJvYmVSZXNldCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorDQorDQorDQorcHJpdmF0ZToNCisgICB0QWNjdW11bGF0b3IoY29uc3QgdEFjY3VtdWxhdG9yJik7DQorICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgdEFjY3VtdWxhdG9yJik7DQorfTsNCisNCit9DQorfQ0KKw0KKyNlbmRpZiAvLyBfX25GUkNfMjAxNV8xXzBfQV9BY2N1bXVsYXRvcl9oX18NCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEFsYXJtLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEFsYXJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODczOTQwNQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90QWxhcm0uaApAQCAtMCwwICsxLDU3IEBACisvLyBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKy8vIERvIE5vdCBFZGl0Li4uIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQhDQorDQorI2lmbmRlZiBfX25GUkNfMjAxNV8xXzBfQV9BbGFybV9oX18NCisjZGVmaW5lIF9fbkZSQ18yMDE1XzFfMF9BX0FsYXJtX2hfXw0KKw0KKyNpbmNsdWRlICJ0U3lzdGVtSW50ZXJmYWNlLmgiDQorDQorbmFtZXNwYWNlIG5GUEdBDQorew0KK25hbWVzcGFjZSBuRlJDXzIwMTVfMV8wX0ENCit7DQorDQorY2xhc3MgdEFsYXJtDQorew0KK3B1YmxpYzoNCisgICB0QWxhcm0oKXt9DQorICAgdmlydHVhbCB+dEFsYXJtKCl7fQ0KKw0KKyAgIHZpcnR1YWwgdFN5c3RlbUludGVyZmFjZSogZ2V0U3lzdGVtSW50ZXJmYWNlKCkgPSAwOw0KKyAgIHN0YXRpYyB0QWxhcm0qIGNyZWF0ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bVN5c3RlbXMgPSAxLA0KKyAgIH0gdElmYWNlQ29uc3RhbnRzOw0KKw0KKw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRFbmFibGVfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlRW5hYmxlKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZEVuYWJsZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFRyaWdnZXJUaW1lX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVRyaWdnZXJUaW1lKHVuc2lnbmVkIGludCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJlYWRUcmlnZ2VyVGltZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorDQorDQorcHJpdmF0ZToNCisgICB0QWxhcm0oY29uc3QgdEFsYXJtJik7DQorICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgdEFsYXJtJik7DQorfTsNCisNCit9DQorfQ0KKw0KKyNlbmRpZiAvLyBfX25GUkNfMjAxNV8xXzBfQV9BbGFybV9oX18NCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEFuYWxvZ1RyaWdnZXIuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90QW5hbG9nVHJpZ2dlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiODliYzIKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEFuYWxvZ1RyaWdnZXIuaApAQCAtMCwwICsxLDEyOSBAQAorLy8gQ29weXJpZ2h0IChjKSBOYXRpb25hbCBJbnN0cnVtZW50cyAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCisvLyBEbyBOb3QgRWRpdC4uLiB0aGlzIGZpbGUgaXMgZ2VuZXJhdGVkIQ0KKw0KKyNpZm5kZWYgX19uRlJDXzIwMTVfMV8wX0FfQW5hbG9nVHJpZ2dlcl9oX18NCisjZGVmaW5lIF9fbkZSQ18yMDE1XzFfMF9BX0FuYWxvZ1RyaWdnZXJfaF9fDQorDQorI2luY2x1ZGUgInRTeXN0ZW1JbnRlcmZhY2UuaCINCisNCituYW1lc3BhY2UgbkZQR0ENCit7DQorbmFtZXNwYWNlIG5GUkNfMjAxNV8xXzBfQQ0KK3sNCisNCitjbGFzcyB0QW5hbG9nVHJpZ2dlcg0KK3sNCitwdWJsaWM6DQorICAgdEFuYWxvZ1RyaWdnZXIoKXt9DQorICAgdmlydHVhbCB+dEFuYWxvZ1RyaWdnZXIoKXt9DQorDQorICAgdmlydHVhbCB0U3lzdGVtSW50ZXJmYWNlKiBnZXRTeXN0ZW1JbnRlcmZhY2UoKSA9IDA7DQorICAgc3RhdGljIHRBbmFsb2dUcmlnZ2VyKiBjcmVhdGUodW5zaWduZWQgY2hhciBzeXNfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciBnZXRTeXN0ZW1JbmRleCgpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bVN5c3RlbXMgPSA4LA0KKyAgIH0gdElmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHR5cGVkZWYNCisgICB1bmlvbnsNCisgICAgICBzdHJ1Y3R7DQorI2lmZGVmIF9fdnh3b3Jrcw0KKyAgICAgICAgIHVuc2lnbmVkIEluSHlzdGVyZXNpcyA6IDE7DQorICAgICAgICAgdW5zaWduZWQgT3ZlckxpbWl0IDogMTsNCisgICAgICAgICB1bnNpZ25lZCBSaXNpbmcgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEZhbGxpbmcgOiAxOw0KKyNlbHNlDQorICAgICAgICAgdW5zaWduZWQgRmFsbGluZyA6IDE7DQorICAgICAgICAgdW5zaWduZWQgUmlzaW5nIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBPdmVyTGltaXQgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEluSHlzdGVyZXNpcyA6IDE7DQorI2VuZGlmDQorICAgICAgfTsNCisgICAgICBzdHJ1Y3R7DQorICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiA0Ow0KKyAgICAgIH07DQorICAgfSB0T3V0cHV0Ow0KKyAgIHR5cGVkZWYNCisgICB1bmlvbnsNCisgICAgICBzdHJ1Y3R7DQorI2lmZGVmIF9fdnh3b3Jrcw0KKyAgICAgICAgIHVuc2lnbmVkIENoYW5uZWwgOiAzOw0KKyAgICAgICAgIHVuc2lnbmVkIEF2ZXJhZ2VkIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBGaWx0ZXIgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEZsb2F0aW5nUm9sbG92ZXIgOiAxOw0KKyAgICAgICAgIHNpZ25lZCBSb2xsb3ZlckxpbWl0IDogODsNCisjZWxzZQ0KKyAgICAgICAgIHNpZ25lZCBSb2xsb3ZlckxpbWl0IDogODsNCisgICAgICAgICB1bnNpZ25lZCBGbG9hdGluZ1JvbGxvdmVyIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBGaWx0ZXIgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEF2ZXJhZ2VkIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBDaGFubmVsIDogMzsNCisjZW5kaWYNCisgICAgICB9Ow0KKyAgICAgIHN0cnVjdHsNCisgICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDE0Ow0KKyAgICAgIH07DQorICAgfSB0U291cmNlU2VsZWN0Ow0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRTb3VyY2VTZWxlY3RfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlU291cmNlU2VsZWN0KHRTb3VyY2VTZWxlY3QgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVTb3VyY2VTZWxlY3RfQ2hhbm5lbCh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlU291cmNlU2VsZWN0X0F2ZXJhZ2VkKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVTb3VyY2VTZWxlY3RfRmlsdGVyKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVTb3VyY2VTZWxlY3RfRmxvYXRpbmdSb2xsb3Zlcihib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlU291cmNlU2VsZWN0X1JvbGxvdmVyTGltaXQoc2lnbmVkIHNob3J0IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB0U291cmNlU2VsZWN0IHJlYWRTb3VyY2VTZWxlY3QodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkU291cmNlU2VsZWN0X0NoYW5uZWwodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkU291cmNlU2VsZWN0X0F2ZXJhZ2VkKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZFNvdXJjZVNlbGVjdF9GaWx0ZXIodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkU291cmNlU2VsZWN0X0Zsb2F0aW5nUm9sbG92ZXIodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgc2lnbmVkIHNob3J0IHJlYWRTb3VyY2VTZWxlY3RfUm9sbG92ZXJMaW1pdCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFVwcGVyTGltaXRfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlVXBwZXJMaW1pdChzaWduZWQgaW50IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBzaWduZWQgaW50IHJlYWRVcHBlckxpbWl0KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0TG93ZXJMaW1pdF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVMb3dlckxpbWl0KHNpZ25lZCBpbnQgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHNpZ25lZCBpbnQgcmVhZExvd2VyTGltaXQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtT3V0cHV0RWxlbWVudHMgPSA4LA0KKyAgIH0gdE91dHB1dF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHRPdXRwdXQgcmVhZE91dHB1dCh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRPdXRwdXRfSW5IeXN0ZXJlc2lzKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZE91dHB1dF9PdmVyTGltaXQodW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkT3V0cHV0X1Jpc2luZyh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRPdXRwdXRfRmFsbGluZyh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorDQorDQorcHJpdmF0ZToNCisgICB0QW5hbG9nVHJpZ2dlcihjb25zdCB0QW5hbG9nVHJpZ2dlciYpOw0KKyAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHRBbmFsb2dUcmlnZ2VyJik7DQorfTsNCisNCit9DQorfQ0KKw0KKyNlbmRpZiAvLyBfX25GUkNfMjAxNV8xXzBfQV9BbmFsb2dUcmlnZ2VyX2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90QklTVC5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RCSVNULmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFiODYyNgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90QklTVC5oCkBAIC0wLDAgKzEsOTAgQEAKKy8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorLy8gRG8gTm90IEVkaXQuLi4gdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCENCisNCisjaWZuZGVmIF9fbkZSQ18yMDE1XzFfMF9BX0JJU1RfaF9fDQorI2RlZmluZSBfX25GUkNfMjAxNV8xXzBfQV9CSVNUX2hfXw0KKw0KKyNpbmNsdWRlICJ0U3lzdGVtSW50ZXJmYWNlLmgiDQorDQorbmFtZXNwYWNlIG5GUEdBDQorew0KK25hbWVzcGFjZSBuRlJDXzIwMTVfMV8wX0ENCit7DQorDQorY2xhc3MgdEJJU1QNCit7DQorcHVibGljOg0KKyAgIHRCSVNUKCl7fQ0KKyAgIHZpcnR1YWwgfnRCSVNUKCl7fQ0KKw0KKyAgIHZpcnR1YWwgdFN5c3RlbUludGVyZmFjZSogZ2V0U3lzdGVtSW50ZXJmYWNlKCkgPSAwOw0KKyAgIHN0YXRpYyB0QklTVCogY3JlYXRlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtU3lzdGVtcyA9IDEsDQorICAgfSB0SWZhY2VDb25zdGFudHM7DQorDQorDQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdERPMFNxdWFyZVRpY2tzX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZURPMFNxdWFyZVRpY2tzKHVuc2lnbmVkIGludCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJlYWRETzBTcXVhcmVUaWNrcyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdEVuYWJsZV9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVFbmFibGUoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkRW5hYmxlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0RE8xU3F1YXJlRW5hYmxlX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZURPMVNxdWFyZUVuYWJsZShib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRETzFTcXVhcmVFbmFibGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRETzBTcXVhcmVFbmFibGVfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlRE8wU3F1YXJlRW5hYmxlKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZERPMFNxdWFyZUVuYWJsZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdERPMVNxdWFyZVRpY2tzX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZURPMVNxdWFyZVRpY2tzKHVuc2lnbmVkIGludCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJlYWRETzFTcXVhcmVUaWNrcyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1ET1JlZ2lzdGVycyA9IDIsDQorICAgfSB0RE9fSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlRE8odW5zaWduZWQgY2hhciByZWdfaW5kZXgsIGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZERPKHVuc2lnbmVkIGNoYXIgcmVnX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorcHJpdmF0ZToNCisgICB0QklTVChjb25zdCB0QklTVCYpOw0KKyAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHRCSVNUJik7DQorfTsNCisNCit9DQorfQ0KKw0KKyNlbmRpZiAvLyBfX25GUkNfMjAxNV8xXzBfQV9CSVNUX2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90Q291bnRlci5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RDb3VudGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVmZjU0NAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90Q291bnRlci5oCkBAIC0wLDAgKzEsMjE5IEBACisvLyBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKy8vIERvIE5vdCBFZGl0Li4uIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQhDQorDQorI2lmbmRlZiBfX25GUkNfMjAxNV8xXzBfQV9Db3VudGVyX2hfXw0KKyNkZWZpbmUgX19uRlJDXzIwMTVfMV8wX0FfQ291bnRlcl9oX18NCisNCisjaW5jbHVkZSAidFN5c3RlbUludGVyZmFjZS5oIg0KKw0KK25hbWVzcGFjZSBuRlBHQQ0KK3sNCituYW1lc3BhY2UgbkZSQ18yMDE1XzFfMF9BDQorew0KKw0KK2NsYXNzIHRDb3VudGVyDQorew0KK3B1YmxpYzoNCisgICB0Q291bnRlcigpe30NCisgICB2aXJ0dWFsIH50Q291bnRlcigpe30NCisNCisgICB2aXJ0dWFsIHRTeXN0ZW1JbnRlcmZhY2UqIGdldFN5c3RlbUludGVyZmFjZSgpID0gMDsNCisgICBzdGF0aWMgdENvdW50ZXIqIGNyZWF0ZSh1bnNpZ25lZCBjaGFyIHN5c19pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIGdldFN5c3RlbUluZGV4KCkgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtU3lzdGVtcyA9IDgsDQorICAgfSB0SWZhY2VDb25zdGFudHM7DQorDQorICAgdHlwZWRlZg0KKyAgIHVuaW9uew0KKyAgICAgIHN0cnVjdHsNCisjaWZkZWYgX192eHdvcmtzDQorICAgICAgICAgdW5zaWduZWQgRGlyZWN0aW9uIDogMTsNCisgICAgICAgICBzaWduZWQgVmFsdWUgOiAzMTsNCisjZWxzZQ0KKyAgICAgICAgIHNpZ25lZCBWYWx1ZSA6IDMxOw0KKyAgICAgICAgIHVuc2lnbmVkIERpcmVjdGlvbiA6IDE7DQorI2VuZGlmDQorICAgICAgfTsNCisgICAgICBzdHJ1Y3R7DQorICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiAzMjsNCisgICAgICB9Ow0KKyAgIH0gdE91dHB1dDsNCisgICB0eXBlZGVmDQorICAgdW5pb257DQorICAgICAgc3RydWN0ew0KKyNpZmRlZiBfX3Z4d29ya3MNCisgICAgICAgICB1bnNpZ25lZCBVcFNvdXJjZV9DaGFubmVsIDogNDsNCisgICAgICAgICB1bnNpZ25lZCBVcFNvdXJjZV9Nb2R1bGUgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIFVwU291cmNlX0FuYWxvZ1RyaWdnZXIgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIERvd25Tb3VyY2VfQ2hhbm5lbCA6IDQ7DQorICAgICAgICAgdW5zaWduZWQgRG93blNvdXJjZV9Nb2R1bGUgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIERvd25Tb3VyY2VfQW5hbG9nVHJpZ2dlciA6IDE7DQorICAgICAgICAgdW5zaWduZWQgSW5kZXhTb3VyY2VfQ2hhbm5lbCA6IDQ7DQorICAgICAgICAgdW5zaWduZWQgSW5kZXhTb3VyY2VfTW9kdWxlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBJbmRleFNvdXJjZV9BbmFsb2dUcmlnZ2VyIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBJbmRleEFjdGl2ZUhpZ2ggOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEluZGV4RWRnZVNlbnNpdGl2ZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgVXBSaXNpbmdFZGdlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBVcEZhbGxpbmdFZGdlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBEb3duUmlzaW5nRWRnZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRG93bkZhbGxpbmdFZGdlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBNb2RlIDogMjsNCisgICAgICAgICB1bnNpZ25lZCBQdWxzZUxlbmd0aFRocmVzaG9sZCA6IDY7DQorI2Vsc2UNCisgICAgICAgICB1bnNpZ25lZCBQdWxzZUxlbmd0aFRocmVzaG9sZCA6IDY7DQorICAgICAgICAgdW5zaWduZWQgTW9kZSA6IDI7DQorICAgICAgICAgdW5zaWduZWQgRG93bkZhbGxpbmdFZGdlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBEb3duUmlzaW5nRWRnZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgVXBGYWxsaW5nRWRnZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgVXBSaXNpbmdFZGdlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBJbmRleEVkZ2VTZW5zaXRpdmUgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEluZGV4QWN0aXZlSGlnaCA6IDE7DQorICAgICAgICAgdW5zaWduZWQgSW5kZXhTb3VyY2VfQW5hbG9nVHJpZ2dlciA6IDE7DQorICAgICAgICAgdW5zaWduZWQgSW5kZXhTb3VyY2VfTW9kdWxlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBJbmRleFNvdXJjZV9DaGFubmVsIDogNDsNCisgICAgICAgICB1bnNpZ25lZCBEb3duU291cmNlX0FuYWxvZ1RyaWdnZXIgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIERvd25Tb3VyY2VfTW9kdWxlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBEb3duU291cmNlX0NoYW5uZWwgOiA0Ow0KKyAgICAgICAgIHVuc2lnbmVkIFVwU291cmNlX0FuYWxvZ1RyaWdnZXIgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIFVwU291cmNlX01vZHVsZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgVXBTb3VyY2VfQ2hhbm5lbCA6IDQ7DQorI2VuZGlmDQorICAgICAgfTsNCisgICAgICBzdHJ1Y3R7DQorICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiAzMjsNCisgICAgICB9Ow0KKyAgIH0gdENvbmZpZzsNCisgICB0eXBlZGVmDQorICAgdW5pb257DQorICAgICAgc3RydWN0ew0KKyNpZmRlZiBfX3Z4d29ya3MNCisgICAgICAgICB1bnNpZ25lZCBQZXJpb2QgOiAyMzsNCisgICAgICAgICBzaWduZWQgQ291bnQgOiA4Ow0KKyAgICAgICAgIHVuc2lnbmVkIFN0YWxsZWQgOiAxOw0KKyNlbHNlDQorICAgICAgICAgdW5zaWduZWQgU3RhbGxlZCA6IDE7DQorICAgICAgICAgc2lnbmVkIENvdW50IDogODsNCisgICAgICAgICB1bnNpZ25lZCBQZXJpb2QgOiAyMzsNCisjZW5kaWYNCisgICAgICB9Ow0KKyAgICAgIHN0cnVjdHsNCisgICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDMyOw0KKyAgICAgIH07DQorICAgfSB0VGltZXJPdXRwdXQ7DQorICAgdHlwZWRlZg0KKyAgIHVuaW9uew0KKyAgICAgIHN0cnVjdHsNCisjaWZkZWYgX192eHdvcmtzDQorICAgICAgICAgdW5zaWduZWQgU3RhbGxQZXJpb2QgOiAyNDsNCisgICAgICAgICB1bnNpZ25lZCBBdmVyYWdlU2l6ZSA6IDc7DQorICAgICAgICAgdW5zaWduZWQgVXBkYXRlV2hlbkVtcHR5IDogMTsNCisjZWxzZQ0KKyAgICAgICAgIHVuc2lnbmVkIFVwZGF0ZVdoZW5FbXB0eSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgQXZlcmFnZVNpemUgOiA3Ow0KKyAgICAgICAgIHVuc2lnbmVkIFN0YWxsUGVyaW9kIDogMjQ7DQorI2VuZGlmDQorICAgICAgfTsNCisgICAgICBzdHJ1Y3R7DQorICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiAzMjsNCisgICAgICB9Ow0KKyAgIH0gdFRpbWVyQ29uZmlnOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRPdXRwdXRfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB0T3V0cHV0IHJlYWRPdXRwdXQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkT3V0cHV0X0RpcmVjdGlvbih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBzaWduZWQgaW50IHJlYWRPdXRwdXRfVmFsdWUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRDb25maWdfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnKHRDb25maWcgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfVXBTb3VyY2VfQ2hhbm5lbCh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX1VwU291cmNlX01vZHVsZSh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX1VwU291cmNlX0FuYWxvZ1RyaWdnZXIoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19Eb3duU291cmNlX0NoYW5uZWwodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19Eb3duU291cmNlX01vZHVsZSh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0Rvd25Tb3VyY2VfQW5hbG9nVHJpZ2dlcihib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0luZGV4U291cmNlX0NoYW5uZWwodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19JbmRleFNvdXJjZV9Nb2R1bGUodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19JbmRleFNvdXJjZV9BbmFsb2dUcmlnZ2VyKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfSW5kZXhBY3RpdmVIaWdoKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfSW5kZXhFZGdlU2Vuc2l0aXZlKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfVXBSaXNpbmdFZGdlKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfVXBGYWxsaW5nRWRnZShib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0Rvd25SaXNpbmdFZGdlKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRG93bkZhbGxpbmdFZGdlKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfTW9kZSh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX1B1bHNlTGVuZ3RoVGhyZXNob2xkKHVuc2lnbmVkIHNob3J0IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB0Q29uZmlnIHJlYWRDb25maWcodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ29uZmlnX1VwU291cmNlX0NoYW5uZWwodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ29uZmlnX1VwU291cmNlX01vZHVsZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfVXBTb3VyY2VfQW5hbG9nVHJpZ2dlcih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRDb25maWdfRG93blNvdXJjZV9DaGFubmVsKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZENvbmZpZ19Eb3duU291cmNlX01vZHVsZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRG93blNvdXJjZV9BbmFsb2dUcmlnZ2VyKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZENvbmZpZ19JbmRleFNvdXJjZV9DaGFubmVsKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZENvbmZpZ19JbmRleFNvdXJjZV9Nb2R1bGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0luZGV4U291cmNlX0FuYWxvZ1RyaWdnZXIodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0luZGV4QWN0aXZlSGlnaCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfSW5kZXhFZGdlU2Vuc2l0aXZlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19VcFJpc2luZ0VkZ2UodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX1VwRmFsbGluZ0VkZ2UodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0Rvd25SaXNpbmdFZGdlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19Eb3duRmFsbGluZ0VkZ2UodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ29uZmlnX01vZGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZENvbmZpZ19QdWxzZUxlbmd0aFRocmVzaG9sZCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFRpbWVyT3V0cHV0X0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdFRpbWVyT3V0cHV0IHJlYWRUaW1lck91dHB1dCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcmVhZFRpbWVyT3V0cHV0X1BlcmlvZCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBzaWduZWQgY2hhciByZWFkVGltZXJPdXRwdXRfQ291bnQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkVGltZXJPdXRwdXRfU3RhbGxlZCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFJlc2V0X0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCBzdHJvYmVSZXNldCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFRpbWVyQ29uZmlnX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVRpbWVyQ29uZmlnKHRUaW1lckNvbmZpZyB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVRpbWVyQ29uZmlnX1N0YWxsUGVyaW9kKHVuc2lnbmVkIGludCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVRpbWVyQ29uZmlnX0F2ZXJhZ2VTaXplKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVUaW1lckNvbmZpZ19VcGRhdGVXaGVuRW1wdHkoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdFRpbWVyQ29uZmlnIHJlYWRUaW1lckNvbmZpZyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcmVhZFRpbWVyQ29uZmlnX1N0YWxsUGVyaW9kKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZFRpbWVyQ29uZmlnX0F2ZXJhZ2VTaXplKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZFRpbWVyQ29uZmlnX1VwZGF0ZVdoZW5FbXB0eSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorDQorDQorDQorcHJpdmF0ZToNCisgICB0Q291bnRlcihjb25zdCB0Q291bnRlciYpOw0KKyAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHRDb3VudGVyJik7DQorfTsNCisNCit9DQorfQ0KKw0KKyNlbmRpZiAvLyBfX25GUkNfMjAxNV8xXzBfQV9Db3VudGVyX2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90RElPLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdERJTy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkOTY1OWIKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdERJTy5oCkBAIC0wLDAgKzEsMjQ4IEBACisvLyBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKy8vIERvIE5vdCBFZGl0Li4uIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQhDQorDQorI2lmbmRlZiBfX25GUkNfMjAxNV8xXzBfQV9ESU9faF9fDQorI2RlZmluZSBfX25GUkNfMjAxNV8xXzBfQV9ESU9faF9fDQorDQorI2luY2x1ZGUgInRTeXN0ZW1JbnRlcmZhY2UuaCINCisNCituYW1lc3BhY2UgbkZQR0ENCit7DQorbmFtZXNwYWNlIG5GUkNfMjAxNV8xXzBfQQ0KK3sNCisNCitjbGFzcyB0RElPDQorew0KK3B1YmxpYzoNCisgICB0RElPKCl7fQ0KKyAgIHZpcnR1YWwgfnRESU8oKXt9DQorDQorICAgdmlydHVhbCB0U3lzdGVtSW50ZXJmYWNlKiBnZXRTeXN0ZW1JbnRlcmZhY2UoKSA9IDA7DQorICAgc3RhdGljIHRESU8qIGNyZWF0ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bVN5c3RlbXMgPSAxLA0KKyAgIH0gdElmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHR5cGVkZWYNCisgICB1bmlvbnsNCisgICAgICBzdHJ1Y3R7DQorI2lmZGVmIF9fdnh3b3Jrcw0KKyAgICAgICAgIHVuc2lnbmVkIEhlYWRlcnMgOiAxMDsNCisgICAgICAgICB1bnNpZ25lZCBSZXNlcnZlZCA6IDY7DQorICAgICAgICAgdW5zaWduZWQgTVhQIDogMTY7DQorI2Vsc2UNCisgICAgICAgICB1bnNpZ25lZCBNWFAgOiAxNjsNCisgICAgICAgICB1bnNpZ25lZCBSZXNlcnZlZCA6IDY7DQorICAgICAgICAgdW5zaWduZWQgSGVhZGVycyA6IDEwOw0KKyNlbmRpZg0KKyAgICAgIH07DQorICAgICAgc3RydWN0ew0KKyAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMzI7DQorICAgICAgfTsNCisgICB9IHRETzsNCisgICB0eXBlZGVmDQorICAgdW5pb257DQorICAgICAgc3RydWN0ew0KKyNpZmRlZiBfX3Z4d29ya3MNCisgICAgICAgICB1bnNpZ25lZCBIZWFkZXJzIDogMTA7DQorICAgICAgICAgdW5zaWduZWQgUmVzZXJ2ZWQgOiA2Ow0KKyAgICAgICAgIHVuc2lnbmVkIE1YUCA6IDE2Ow0KKyNlbHNlDQorICAgICAgICAgdW5zaWduZWQgTVhQIDogMTY7DQorICAgICAgICAgdW5zaWduZWQgUmVzZXJ2ZWQgOiA2Ow0KKyAgICAgICAgIHVuc2lnbmVkIEhlYWRlcnMgOiAxMDsNCisjZW5kaWYNCisgICAgICB9Ow0KKyAgICAgIHN0cnVjdHsNCisgICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDMyOw0KKyAgICAgIH07DQorICAgfSB0T3V0cHV0RW5hYmxlOw0KKyAgIHR5cGVkZWYNCisgICB1bmlvbnsNCisgICAgICBzdHJ1Y3R7DQorI2lmZGVmIF9fdnh3b3Jrcw0KKyAgICAgICAgIHVuc2lnbmVkIEhlYWRlcnMgOiAxMDsNCisgICAgICAgICB1bnNpZ25lZCBSZXNlcnZlZCA6IDY7DQorICAgICAgICAgdW5zaWduZWQgTVhQIDogMTY7DQorI2Vsc2UNCisgICAgICAgICB1bnNpZ25lZCBNWFAgOiAxNjsNCisgICAgICAgICB1bnNpZ25lZCBSZXNlcnZlZCA6IDY7DQorICAgICAgICAgdW5zaWduZWQgSGVhZGVycyA6IDEwOw0KKyNlbmRpZg0KKyAgICAgIH07DQorICAgICAgc3RydWN0ew0KKyAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMzI7DQorICAgICAgfTsNCisgICB9IHRQdWxzZTsNCisgICB0eXBlZGVmDQorICAgdW5pb257DQorICAgICAgc3RydWN0ew0KKyNpZmRlZiBfX3Z4d29ya3MNCisgICAgICAgICB1bnNpZ25lZCBIZWFkZXJzIDogMTA7DQorICAgICAgICAgdW5zaWduZWQgUmVzZXJ2ZWQgOiA2Ow0KKyAgICAgICAgIHVuc2lnbmVkIE1YUCA6IDE2Ow0KKyNlbHNlDQorICAgICAgICAgdW5zaWduZWQgTVhQIDogMTY7DQorICAgICAgICAgdW5zaWduZWQgUmVzZXJ2ZWQgOiA2Ow0KKyAgICAgICAgIHVuc2lnbmVkIEhlYWRlcnMgOiAxMDsNCisjZW5kaWYNCisgICAgICB9Ow0KKyAgICAgIHN0cnVjdHsNCisgICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDMyOw0KKyAgICAgIH07DQorICAgfSB0REk7DQorDQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdERPX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZURPKHRETyB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZURPX0hlYWRlcnModW5zaWduZWQgc2hvcnQgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVET19SZXNlcnZlZCh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlRE9fTVhQKHVuc2lnbmVkIHNob3J0IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB0RE8gcmVhZERPKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IHJlYWRET19IZWFkZXJzKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZERPX1Jlc2VydmVkKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IHJlYWRET19NWFAodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtUFdNRHV0eUN5Y2xlQUVsZW1lbnRzID0gNCwNCisgICB9IHRQV01EdXR5Q3ljbGVBX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVBXTUR1dHlDeWNsZUEodW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkUFdNRHV0eUN5Y2xlQSh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1QV01EdXR5Q3ljbGVCRWxlbWVudHMgPSAyLA0KKyAgIH0gdFBXTUR1dHlDeWNsZUJfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlUFdNRHV0eUN5Y2xlQih1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRQV01EdXR5Q3ljbGVCKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bUZpbHRlclNlbGVjdEhkckVsZW1lbnRzID0gMTYsDQorICAgfSB0RmlsdGVyU2VsZWN0SGRyX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUZpbHRlclNlbGVjdEhkcih1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRGaWx0ZXJTZWxlY3RIZHIodW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRPdXRwdXRFbmFibGVfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlT3V0cHV0RW5hYmxlKHRPdXRwdXRFbmFibGUgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVPdXRwdXRFbmFibGVfSGVhZGVycyh1bnNpZ25lZCBzaG9ydCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZU91dHB1dEVuYWJsZV9SZXNlcnZlZCh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlT3V0cHV0RW5hYmxlX01YUCh1bnNpZ25lZCBzaG9ydCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdE91dHB1dEVuYWJsZSByZWFkT3V0cHV0RW5hYmxlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IHJlYWRPdXRwdXRFbmFibGVfSGVhZGVycyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRPdXRwdXRFbmFibGVfUmVzZXJ2ZWQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZE91dHB1dEVuYWJsZV9NWFAodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtUFdNT3V0cHV0U2VsZWN0RWxlbWVudHMgPSA2LA0KKyAgIH0gdFBXTU91dHB1dFNlbGVjdF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVQV01PdXRwdXRTZWxlY3QodW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkUFdNT3V0cHV0U2VsZWN0KHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0UHVsc2VfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlUHVsc2UodFB1bHNlIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlUHVsc2VfSGVhZGVycyh1bnNpZ25lZCBzaG9ydCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVB1bHNlX1Jlc2VydmVkKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVQdWxzZV9NWFAodW5zaWduZWQgc2hvcnQgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHRQdWxzZSByZWFkUHVsc2UodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZFB1bHNlX0hlYWRlcnModFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkUHVsc2VfUmVzZXJ2ZWQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZFB1bHNlX01YUCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdERJX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdERJIHJlYWRESSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkRElfSGVhZGVycyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRESV9SZXNlcnZlZCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkRElfTVhQKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0RW5hYmxlTVhQU3BlY2lhbEZ1bmN0aW9uX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUVuYWJsZU1YUFNwZWNpYWxGdW5jdGlvbih1bnNpZ25lZCBzaG9ydCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZEVuYWJsZU1YUFNwZWNpYWxGdW5jdGlvbih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1GaWx0ZXJTZWxlY3RNWFBFbGVtZW50cyA9IDE2LA0KKyAgIH0gdEZpbHRlclNlbGVjdE1YUF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVGaWx0ZXJTZWxlY3RNWFAodW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkRmlsdGVyU2VsZWN0TVhQKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0UHVsc2VMZW5ndGhfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlUHVsc2VMZW5ndGgodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkUHVsc2VMZW5ndGgodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRQV01QZXJpb2RQb3dlcl9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVQV01QZXJpb2RQb3dlcih1bnNpZ25lZCBzaG9ydCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZFBXTVBlcmlvZFBvd2VyKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bUZpbHRlclBlcmlvZE1YUFJlZ2lzdGVycyA9IDMsDQorICAgfSB0RmlsdGVyUGVyaW9kTVhQX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUZpbHRlclBlcmlvZE1YUCh1bnNpZ25lZCBjaGFyIHJlZ19pbmRleCwgdW5zaWduZWQgaW50IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcmVhZEZpbHRlclBlcmlvZE1YUCh1bnNpZ25lZCBjaGFyIHJlZ19pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtRmlsdGVyUGVyaW9kSGRyUmVnaXN0ZXJzID0gMywNCisgICB9IHRGaWx0ZXJQZXJpb2RIZHJfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlRmlsdGVyUGVyaW9kSGRyKHVuc2lnbmVkIGNoYXIgcmVnX2luZGV4LCB1bnNpZ25lZCBpbnQgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGludCByZWFkRmlsdGVyUGVyaW9kSGRyKHVuc2lnbmVkIGNoYXIgcmVnX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorcHJpdmF0ZToNCisgICB0RElPKGNvbnN0IHRESU8mKTsNCisgICB2b2lkIG9wZXJhdG9yPShjb25zdCB0RElPJik7DQorfTsNCisNCit9DQorfQ0KKw0KKyNlbmRpZiAvLyBfX25GUkNfMjAxNV8xXzBfQV9ESU9faF9fDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RETUEuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90RE1BLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI1N2VkZgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90RE1BLmgKQEAgLTAsMCArMSwxODggQEAKKy8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorLy8gRG8gTm90IEVkaXQuLi4gdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCENCisNCisjaWZuZGVmIF9fbkZSQ18yMDE1XzFfMF9BX0RNQV9oX18NCisjZGVmaW5lIF9fbkZSQ18yMDE1XzFfMF9BX0RNQV9oX18NCisNCisjaW5jbHVkZSAidFN5c3RlbUludGVyZmFjZS5oIg0KKw0KK25hbWVzcGFjZSBuRlBHQQ0KK3sNCituYW1lc3BhY2UgbkZSQ18yMDE1XzFfMF9BDQorew0KKw0KK2NsYXNzIHRETUENCit7DQorcHVibGljOg0KKyAgIHRETUEoKXt9DQorICAgdmlydHVhbCB+dERNQSgpe30NCisNCisgICB2aXJ0dWFsIHRTeXN0ZW1JbnRlcmZhY2UqIGdldFN5c3RlbUludGVyZmFjZSgpID0gMDsNCisgICBzdGF0aWMgdERNQSogY3JlYXRlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtU3lzdGVtcyA9IDEsDQorICAgfSB0SWZhY2VDb25zdGFudHM7DQorDQorICAgdHlwZWRlZg0KKyAgIHVuaW9uew0KKyAgICAgIHN0cnVjdHsNCisjaWZkZWYgX192eHdvcmtzDQorICAgICAgICAgdW5zaWduZWQgUGF1c2UgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9BSTBfTG93IDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfQUkwX0hpZ2ggOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9BSUF2ZXJhZ2VkMF9Mb3cgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9BSUF2ZXJhZ2VkMF9IaWdoIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfQUkxX0xvdyA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0FJMV9IaWdoIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfQUlBdmVyYWdlZDFfTG93IDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfQUlBdmVyYWdlZDFfSGlnaCA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0FjY3VtdWxhdG9yMCA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0FjY3VtdWxhdG9yMSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0RJIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfQW5hbG9nVHJpZ2dlcnMgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9Db3VudGVyc19Mb3cgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9Db3VudGVyc19IaWdoIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfQ291bnRlclRpbWVyc19Mb3cgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9Db3VudGVyVGltZXJzX0hpZ2ggOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9FbmNvZGVycyA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0VuY29kZXJUaW1lcnMgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEV4dGVybmFsQ2xvY2sgOiAxOw0KKyNlbHNlDQorICAgICAgICAgdW5zaWduZWQgRXh0ZXJuYWxDbG9jayA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0VuY29kZXJUaW1lcnMgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9FbmNvZGVycyA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0NvdW50ZXJUaW1lcnNfSGlnaCA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0NvdW50ZXJUaW1lcnNfTG93IDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfQ291bnRlcnNfSGlnaCA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0NvdW50ZXJzX0xvdyA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0FuYWxvZ1RyaWdnZXJzIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfREkgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9BY2N1bXVsYXRvcjEgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9BY2N1bXVsYXRvcjAgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9BSUF2ZXJhZ2VkMV9IaWdoIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfQUlBdmVyYWdlZDFfTG93IDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfQUkxX0hpZ2ggOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9BSTFfTG93IDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfQUlBdmVyYWdlZDBfSGlnaCA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0FJQXZlcmFnZWQwX0xvdyA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0FJMF9IaWdoIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfQUkwX0xvdyA6IDE7DQorICAgICAgICAgdW5zaWduZWQgUGF1c2UgOiAxOw0KKyNlbmRpZg0KKyAgICAgIH07DQorICAgICAgc3RydWN0ew0KKyAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMjA7DQorICAgICAgfTsNCisgICB9IHRDb25maWc7DQorICAgdHlwZWRlZg0KKyAgIHVuaW9uew0KKyAgICAgIHN0cnVjdHsNCisjaWZkZWYgX192eHdvcmtzDQorICAgICAgICAgdW5zaWduZWQgRXh0ZXJuYWxDbG9ja1NvdXJjZV9DaGFubmVsIDogNDsNCisgICAgICAgICB1bnNpZ25lZCBFeHRlcm5hbENsb2NrU291cmNlX01vZHVsZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRXh0ZXJuYWxDbG9ja1NvdXJjZV9BbmFsb2dUcmlnZ2VyIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBSaXNpbmdFZGdlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBGYWxsaW5nRWRnZSA6IDE7DQorI2Vsc2UNCisgICAgICAgICB1bnNpZ25lZCBGYWxsaW5nRWRnZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgUmlzaW5nRWRnZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRXh0ZXJuYWxDbG9ja1NvdXJjZV9BbmFsb2dUcmlnZ2VyIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFeHRlcm5hbENsb2NrU291cmNlX01vZHVsZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRXh0ZXJuYWxDbG9ja1NvdXJjZV9DaGFubmVsIDogNDsNCisjZW5kaWYNCisgICAgICB9Ow0KKyAgICAgIHN0cnVjdHsNCisgICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDg7DQorICAgICAgfTsNCisgICB9IHRFeHRlcm5hbFRyaWdnZXJzOw0KKw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRSYXRlX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVJhdGUodW5zaWduZWQgaW50IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcmVhZFJhdGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRDb25maWdfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnKHRDb25maWcgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfUGF1c2UoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19FbmFibGVfQUkwX0xvdyhib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0VuYWJsZV9BSTBfSGlnaChib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0VuYWJsZV9BSUF2ZXJhZ2VkMF9Mb3coYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19FbmFibGVfQUlBdmVyYWdlZDBfSGlnaChib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0VuYWJsZV9BSTFfTG93KGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRW5hYmxlX0FJMV9IaWdoKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRW5hYmxlX0FJQXZlcmFnZWQxX0xvdyhib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0VuYWJsZV9BSUF2ZXJhZ2VkMV9IaWdoKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRW5hYmxlX0FjY3VtdWxhdG9yMChib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0VuYWJsZV9BY2N1bXVsYXRvcjEoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19FbmFibGVfREkoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19FbmFibGVfQW5hbG9nVHJpZ2dlcnMoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19FbmFibGVfQ291bnRlcnNfTG93KGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRW5hYmxlX0NvdW50ZXJzX0hpZ2goYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19FbmFibGVfQ291bnRlclRpbWVyc19Mb3coYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19FbmFibGVfQ291bnRlclRpbWVyc19IaWdoKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRW5hYmxlX0VuY29kZXJzKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRW5hYmxlX0VuY29kZXJUaW1lcnMoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19FeHRlcm5hbENsb2NrKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHRDb25maWcgcmVhZENvbmZpZyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfUGF1c2UodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0VuYWJsZV9BSTBfTG93KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19FbmFibGVfQUkwX0hpZ2godFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0VuYWJsZV9BSUF2ZXJhZ2VkMF9Mb3codFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0VuYWJsZV9BSUF2ZXJhZ2VkMF9IaWdoKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19FbmFibGVfQUkxX0xvdyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRW5hYmxlX0FJMV9IaWdoKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19FbmFibGVfQUlBdmVyYWdlZDFfTG93KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19FbmFibGVfQUlBdmVyYWdlZDFfSGlnaCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRW5hYmxlX0FjY3VtdWxhdG9yMCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRW5hYmxlX0FjY3VtdWxhdG9yMSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRW5hYmxlX0RJKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19FbmFibGVfQW5hbG9nVHJpZ2dlcnModFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0VuYWJsZV9Db3VudGVyc19Mb3codFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0VuYWJsZV9Db3VudGVyc19IaWdoKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19FbmFibGVfQ291bnRlclRpbWVyc19Mb3codFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0VuYWJsZV9Db3VudGVyVGltZXJzX0hpZ2godFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0VuYWJsZV9FbmNvZGVycyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRW5hYmxlX0VuY29kZXJUaW1lcnModFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0V4dGVybmFsQ2xvY2sodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtRXh0ZXJuYWxUcmlnZ2Vyc0VsZW1lbnRzID0gNCwNCisgICB9IHRFeHRlcm5hbFRyaWdnZXJzX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUV4dGVybmFsVHJpZ2dlcnModW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdEV4dGVybmFsVHJpZ2dlcnMgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVFeHRlcm5hbFRyaWdnZXJzX0V4dGVybmFsQ2xvY2tTb3VyY2VfQ2hhbm5lbCh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlRXh0ZXJuYWxUcmlnZ2Vyc19FeHRlcm5hbENsb2NrU291cmNlX01vZHVsZSh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlRXh0ZXJuYWxUcmlnZ2Vyc19FeHRlcm5hbENsb2NrU291cmNlX0FuYWxvZ1RyaWdnZXIodW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUV4dGVybmFsVHJpZ2dlcnNfUmlzaW5nRWRnZSh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCBib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlRXh0ZXJuYWxUcmlnZ2Vyc19GYWxsaW5nRWRnZSh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCBib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB0RXh0ZXJuYWxUcmlnZ2VycyByZWFkRXh0ZXJuYWxUcmlnZ2Vycyh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRFeHRlcm5hbFRyaWdnZXJzX0V4dGVybmFsQ2xvY2tTb3VyY2VfQ2hhbm5lbCh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRFeHRlcm5hbFRyaWdnZXJzX0V4dGVybmFsQ2xvY2tTb3VyY2VfTW9kdWxlKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZEV4dGVybmFsVHJpZ2dlcnNfRXh0ZXJuYWxDbG9ja1NvdXJjZV9BbmFsb2dUcmlnZ2VyKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZEV4dGVybmFsVHJpZ2dlcnNfUmlzaW5nRWRnZSh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRFeHRlcm5hbFRyaWdnZXJzX0ZhbGxpbmdFZGdlKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisNCisNCitwcml2YXRlOg0KKyAgIHRETUEoY29uc3QgdERNQSYpOw0KKyAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHRETUEmKTsNCit9Ow0KKw0KK30NCit9DQorDQorI2VuZGlmIC8vIF9fbkZSQ18yMDE1XzFfMF9BX0RNQV9oX18NCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEVuY29kZXIuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90RW5jb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NmI5YzEKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEVuY29kZXIuaApAQCAtMCwwICsxLDE5OSBAQAorLy8gQ29weXJpZ2h0IChjKSBOYXRpb25hbCBJbnN0cnVtZW50cyAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCisvLyBEbyBOb3QgRWRpdC4uLiB0aGlzIGZpbGUgaXMgZ2VuZXJhdGVkIQ0KKw0KKyNpZm5kZWYgX19uRlJDXzIwMTVfMV8wX0FfRW5jb2Rlcl9oX18NCisjZGVmaW5lIF9fbkZSQ18yMDE1XzFfMF9BX0VuY29kZXJfaF9fDQorDQorI2luY2x1ZGUgInRTeXN0ZW1JbnRlcmZhY2UuaCINCisNCituYW1lc3BhY2UgbkZQR0ENCit7DQorbmFtZXNwYWNlIG5GUkNfMjAxNV8xXzBfQQ0KK3sNCisNCitjbGFzcyB0RW5jb2Rlcg0KK3sNCitwdWJsaWM6DQorICAgdEVuY29kZXIoKXt9DQorICAgdmlydHVhbCB+dEVuY29kZXIoKXt9DQorDQorICAgdmlydHVhbCB0U3lzdGVtSW50ZXJmYWNlKiBnZXRTeXN0ZW1JbnRlcmZhY2UoKSA9IDA7DQorICAgc3RhdGljIHRFbmNvZGVyKiBjcmVhdGUodW5zaWduZWQgY2hhciBzeXNfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciBnZXRTeXN0ZW1JbmRleCgpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bVN5c3RlbXMgPSA4LA0KKyAgIH0gdElmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHR5cGVkZWYNCisgICB1bmlvbnsNCisgICAgICBzdHJ1Y3R7DQorI2lmZGVmIF9fdnh3b3Jrcw0KKyAgICAgICAgIHVuc2lnbmVkIERpcmVjdGlvbiA6IDE7DQorICAgICAgICAgc2lnbmVkIFZhbHVlIDogMzE7DQorI2Vsc2UNCisgICAgICAgICBzaWduZWQgVmFsdWUgOiAzMTsNCisgICAgICAgICB1bnNpZ25lZCBEaXJlY3Rpb24gOiAxOw0KKyNlbmRpZg0KKyAgICAgIH07DQorICAgICAgc3RydWN0ew0KKyAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMzI7DQorICAgICAgfTsNCisgICB9IHRPdXRwdXQ7DQorICAgdHlwZWRlZg0KKyAgIHVuaW9uew0KKyAgICAgIHN0cnVjdHsNCisjaWZkZWYgX192eHdvcmtzDQorICAgICAgICAgdW5zaWduZWQgQVNvdXJjZV9DaGFubmVsIDogNDsNCisgICAgICAgICB1bnNpZ25lZCBBU291cmNlX01vZHVsZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgQVNvdXJjZV9BbmFsb2dUcmlnZ2VyIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBCU291cmNlX0NoYW5uZWwgOiA0Ow0KKyAgICAgICAgIHVuc2lnbmVkIEJTb3VyY2VfTW9kdWxlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBCU291cmNlX0FuYWxvZ1RyaWdnZXIgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEluZGV4U291cmNlX0NoYW5uZWwgOiA0Ow0KKyAgICAgICAgIHVuc2lnbmVkIEluZGV4U291cmNlX01vZHVsZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgSW5kZXhTb3VyY2VfQW5hbG9nVHJpZ2dlciA6IDE7DQorICAgICAgICAgdW5zaWduZWQgSW5kZXhBY3RpdmVIaWdoIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBJbmRleEVkZ2VTZW5zaXRpdmUgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIFJldmVyc2UgOiAxOw0KKyNlbHNlDQorICAgICAgICAgdW5zaWduZWQgUmV2ZXJzZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgSW5kZXhFZGdlU2Vuc2l0aXZlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBJbmRleEFjdGl2ZUhpZ2ggOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEluZGV4U291cmNlX0FuYWxvZ1RyaWdnZXIgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEluZGV4U291cmNlX01vZHVsZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgSW5kZXhTb3VyY2VfQ2hhbm5lbCA6IDQ7DQorICAgICAgICAgdW5zaWduZWQgQlNvdXJjZV9BbmFsb2dUcmlnZ2VyIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBCU291cmNlX01vZHVsZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgQlNvdXJjZV9DaGFubmVsIDogNDsNCisgICAgICAgICB1bnNpZ25lZCBBU291cmNlX0FuYWxvZ1RyaWdnZXIgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEFTb3VyY2VfTW9kdWxlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBBU291cmNlX0NoYW5uZWwgOiA0Ow0KKyNlbmRpZg0KKyAgICAgIH07DQorICAgICAgc3RydWN0ew0KKyAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMjE7DQorICAgICAgfTsNCisgICB9IHRDb25maWc7DQorICAgdHlwZWRlZg0KKyAgIHVuaW9uew0KKyAgICAgIHN0cnVjdHsNCisjaWZkZWYgX192eHdvcmtzDQorICAgICAgICAgdW5zaWduZWQgUGVyaW9kIDogMjM7DQorICAgICAgICAgc2lnbmVkIENvdW50IDogODsNCisgICAgICAgICB1bnNpZ25lZCBTdGFsbGVkIDogMTsNCisjZWxzZQ0KKyAgICAgICAgIHVuc2lnbmVkIFN0YWxsZWQgOiAxOw0KKyAgICAgICAgIHNpZ25lZCBDb3VudCA6IDg7DQorICAgICAgICAgdW5zaWduZWQgUGVyaW9kIDogMjM7DQorI2VuZGlmDQorICAgICAgfTsNCisgICAgICBzdHJ1Y3R7DQorICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiAzMjsNCisgICAgICB9Ow0KKyAgIH0gdFRpbWVyT3V0cHV0Ow0KKyAgIHR5cGVkZWYNCisgICB1bmlvbnsNCisgICAgICBzdHJ1Y3R7DQorI2lmZGVmIF9fdnh3b3Jrcw0KKyAgICAgICAgIHVuc2lnbmVkIFN0YWxsUGVyaW9kIDogMjQ7DQorICAgICAgICAgdW5zaWduZWQgQXZlcmFnZVNpemUgOiA3Ow0KKyAgICAgICAgIHVuc2lnbmVkIFVwZGF0ZVdoZW5FbXB0eSA6IDE7DQorI2Vsc2UNCisgICAgICAgICB1bnNpZ25lZCBVcGRhdGVXaGVuRW1wdHkgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEF2ZXJhZ2VTaXplIDogNzsNCisgICAgICAgICB1bnNpZ25lZCBTdGFsbFBlcmlvZCA6IDI0Ow0KKyNlbmRpZg0KKyAgICAgIH07DQorICAgICAgc3RydWN0ew0KKyAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMzI7DQorICAgICAgfTsNCisgICB9IHRUaW1lckNvbmZpZzsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0T3V0cHV0X0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdE91dHB1dCByZWFkT3V0cHV0KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZE91dHB1dF9EaXJlY3Rpb24odFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgc2lnbmVkIGludCByZWFkT3V0cHV0X1ZhbHVlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0Q29uZmlnX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZyh0Q29uZmlnIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0FTb3VyY2VfQ2hhbm5lbCh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0FTb3VyY2VfTW9kdWxlKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfQVNvdXJjZV9BbmFsb2dUcmlnZ2VyKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfQlNvdXJjZV9DaGFubmVsKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfQlNvdXJjZV9Nb2R1bGUodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19CU291cmNlX0FuYWxvZ1RyaWdnZXIoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19JbmRleFNvdXJjZV9DaGFubmVsKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfSW5kZXhTb3VyY2VfTW9kdWxlKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfSW5kZXhTb3VyY2VfQW5hbG9nVHJpZ2dlcihib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0luZGV4QWN0aXZlSGlnaChib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0luZGV4RWRnZVNlbnNpdGl2ZShib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX1JldmVyc2UoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdENvbmZpZyByZWFkQ29uZmlnKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZENvbmZpZ19BU291cmNlX0NoYW5uZWwodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ29uZmlnX0FTb3VyY2VfTW9kdWxlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19BU291cmNlX0FuYWxvZ1RyaWdnZXIodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ29uZmlnX0JTb3VyY2VfQ2hhbm5lbCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRDb25maWdfQlNvdXJjZV9Nb2R1bGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0JTb3VyY2VfQW5hbG9nVHJpZ2dlcih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRDb25maWdfSW5kZXhTb3VyY2VfQ2hhbm5lbCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRDb25maWdfSW5kZXhTb3VyY2VfTW9kdWxlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19JbmRleFNvdXJjZV9BbmFsb2dUcmlnZ2VyKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19JbmRleEFjdGl2ZUhpZ2godFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0luZGV4RWRnZVNlbnNpdGl2ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfUmV2ZXJzZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFRpbWVyT3V0cHV0X0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdFRpbWVyT3V0cHV0IHJlYWRUaW1lck91dHB1dCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcmVhZFRpbWVyT3V0cHV0X1BlcmlvZCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBzaWduZWQgY2hhciByZWFkVGltZXJPdXRwdXRfQ291bnQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkVGltZXJPdXRwdXRfU3RhbGxlZCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFJlc2V0X0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCBzdHJvYmVSZXNldCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFRpbWVyQ29uZmlnX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVRpbWVyQ29uZmlnKHRUaW1lckNvbmZpZyB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVRpbWVyQ29uZmlnX1N0YWxsUGVyaW9kKHVuc2lnbmVkIGludCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVRpbWVyQ29uZmlnX0F2ZXJhZ2VTaXplKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVUaW1lckNvbmZpZ19VcGRhdGVXaGVuRW1wdHkoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdFRpbWVyQ29uZmlnIHJlYWRUaW1lckNvbmZpZyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcmVhZFRpbWVyQ29uZmlnX1N0YWxsUGVyaW9kKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZFRpbWVyQ29uZmlnX0F2ZXJhZ2VTaXplKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZFRpbWVyQ29uZmlnX1VwZGF0ZVdoZW5FbXB0eSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorDQorDQorDQorcHJpdmF0ZToNCisgICB0RW5jb2Rlcihjb25zdCB0RW5jb2RlciYpOw0KKyAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHRFbmNvZGVyJik7DQorfTsNCisNCit9DQorfQ0KKw0KKyNlbmRpZiAvLyBfX25GUkNfMjAxNV8xXzBfQV9FbmNvZGVyX2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90R2xvYmFsLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEdsb2JhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMDE0ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEdsb2JhbC5oCkBAIC0wLDAgKzEsMTA0IEBACisvLyBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKy8vIERvIE5vdCBFZGl0Li4uIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQhDQorDQorI2lmbmRlZiBfX25GUkNfMjAxNV8xXzBfQV9HbG9iYWxfaF9fDQorI2RlZmluZSBfX25GUkNfMjAxNV8xXzBfQV9HbG9iYWxfaF9fDQorDQorI2luY2x1ZGUgInRTeXN0ZW1JbnRlcmZhY2UuaCINCisNCituYW1lc3BhY2UgbkZQR0ENCit7DQorbmFtZXNwYWNlIG5GUkNfMjAxNV8xXzBfQQ0KK3sNCisNCitjbGFzcyB0R2xvYmFsDQorew0KK3B1YmxpYzoNCisgICB0R2xvYmFsKCl7fQ0KKyAgIHZpcnR1YWwgfnRHbG9iYWwoKXt9DQorDQorICAgdmlydHVhbCB0U3lzdGVtSW50ZXJmYWNlKiBnZXRTeXN0ZW1JbnRlcmZhY2UoKSA9IDA7DQorICAgc3RhdGljIHRHbG9iYWwqIGNyZWF0ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bVN5c3RlbXMgPSAxLA0KKyAgIH0gdElmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHR5cGVkZWYNCisgICB1bmlvbnsNCisgICAgICBzdHJ1Y3R7DQorI2lmZGVmIF9fdnh3b3Jrcw0KKyAgICAgICAgIHVuc2lnbmVkIFJhZGlvIDogODsNCisgICAgICAgICB1bnNpZ25lZCBDb21tIDogODsNCisgICAgICAgICB1bnNpZ25lZCBNb2RlIDogODsNCisgICAgICAgICB1bnNpZ25lZCBSU0wgOiAxOw0KKyNlbHNlDQorICAgICAgICAgdW5zaWduZWQgUlNMIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBNb2RlIDogODsNCisgICAgICAgICB1bnNpZ25lZCBDb21tIDogODsNCisgICAgICAgICB1bnNpZ25lZCBSYWRpbyA6IDg7DQorI2VuZGlmDQorICAgICAgfTsNCisgICAgICBzdHJ1Y3R7DQorICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiAyNTsNCisgICAgICB9Ow0KKyAgIH0gdExFRHM7DQorDQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdExFRHNfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlTEVEcyh0TEVEcyB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUxFRHNfUmFkaW8odW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUxFRHNfQ29tbSh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlTEVEc19Nb2RlKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVMRURzX1JTTChib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB0TEVEcyByZWFkTEVEcyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRMRURzX1JhZGlvKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZExFRHNfQ29tbSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRMRURzX01vZGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkTEVEc19SU0wodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRWZXJzaW9uX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZFZlcnNpb24odFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRMb2NhbFRpbWVfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcmVhZExvY2FsVGltZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFVzZXJCdXR0b25fSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCBib29sIHJlYWRVc2VyQnV0dG9uKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0UmV2aXNpb25fSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcmVhZFJldmlzaW9uKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisNCisNCitwcml2YXRlOg0KKyAgIHRHbG9iYWwoY29uc3QgdEdsb2JhbCYpOw0KKyAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHRHbG9iYWwmKTsNCit9Ow0KKw0KK30NCit9DQorDQorI2VuZGlmIC8vIF9fbkZSQ18yMDE1XzFfMF9BX0dsb2JhbF9oX18NCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEludGVycnVwdC5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RJbnRlcnJ1cHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjIzM2UxCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RJbnRlcnJ1cHQuaApAQCAtMCwwICsxLDEwMCBAQAorLy8gQ29weXJpZ2h0IChjKSBOYXRpb25hbCBJbnN0cnVtZW50cyAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCisvLyBEbyBOb3QgRWRpdC4uLiB0aGlzIGZpbGUgaXMgZ2VuZXJhdGVkIQ0KKw0KKyNpZm5kZWYgX19uRlJDXzIwMTVfMV8wX0FfSW50ZXJydXB0X2hfXw0KKyNkZWZpbmUgX19uRlJDXzIwMTVfMV8wX0FfSW50ZXJydXB0X2hfXw0KKw0KKyNpbmNsdWRlICJ0U3lzdGVtSW50ZXJmYWNlLmgiDQorDQorbmFtZXNwYWNlIG5GUEdBDQorew0KK25hbWVzcGFjZSBuRlJDXzIwMTVfMV8wX0ENCit7DQorDQorY2xhc3MgdEludGVycnVwdA0KK3sNCitwdWJsaWM6DQorICAgdEludGVycnVwdCgpe30NCisgICB2aXJ0dWFsIH50SW50ZXJydXB0KCl7fQ0KKw0KKyAgIHZpcnR1YWwgdFN5c3RlbUludGVyZmFjZSogZ2V0U3lzdGVtSW50ZXJmYWNlKCkgPSAwOw0KKyAgIHN0YXRpYyB0SW50ZXJydXB0KiBjcmVhdGUodW5zaWduZWQgY2hhciBzeXNfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciBnZXRTeXN0ZW1JbmRleCgpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bVN5c3RlbXMgPSA4LA0KKyAgIH0gdElmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHR5cGVkZWYNCisgICB1bmlvbnsNCisgICAgICBzdHJ1Y3R7DQorI2lmZGVmIF9fdnh3b3Jrcw0KKyAgICAgICAgIHVuc2lnbmVkIFNvdXJjZV9DaGFubmVsIDogNDsNCisgICAgICAgICB1bnNpZ25lZCBTb3VyY2VfTW9kdWxlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBTb3VyY2VfQW5hbG9nVHJpZ2dlciA6IDE7DQorICAgICAgICAgdW5zaWduZWQgUmlzaW5nRWRnZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRmFsbGluZ0VkZ2UgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIFdhaXRGb3JBY2sgOiAxOw0KKyNlbHNlDQorICAgICAgICAgdW5zaWduZWQgV2FpdEZvckFjayA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRmFsbGluZ0VkZ2UgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIFJpc2luZ0VkZ2UgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIFNvdXJjZV9BbmFsb2dUcmlnZ2VyIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBTb3VyY2VfTW9kdWxlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBTb3VyY2VfQ2hhbm5lbCA6IDQ7DQorI2VuZGlmDQorICAgICAgfTsNCisgICAgICBzdHJ1Y3R7DQorICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiA5Ow0KKyAgICAgIH07DQorICAgfSB0Q29uZmlnOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRGYWxsaW5nVGltZVN0YW1wX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJlYWRGYWxsaW5nVGltZVN0YW1wKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0Q29uZmlnX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZyh0Q29uZmlnIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX1NvdXJjZV9DaGFubmVsKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfU291cmNlX01vZHVsZSh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX1NvdXJjZV9BbmFsb2dUcmlnZ2VyKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfUmlzaW5nRWRnZShib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0ZhbGxpbmdFZGdlKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfV2FpdEZvckFjayhib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB0Q29uZmlnIHJlYWRDb25maWcodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ29uZmlnX1NvdXJjZV9DaGFubmVsKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZENvbmZpZ19Tb3VyY2VfTW9kdWxlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19Tb3VyY2VfQW5hbG9nVHJpZ2dlcih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfUmlzaW5nRWRnZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRmFsbGluZ0VkZ2UodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX1dhaXRGb3JBY2sodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRSaXNpbmdUaW1lU3RhbXBfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcmVhZFJpc2luZ1RpbWVTdGFtcCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorDQorDQorDQorcHJpdmF0ZToNCisgICB0SW50ZXJydXB0KGNvbnN0IHRJbnRlcnJ1cHQmKTsNCisgICB2b2lkIG9wZXJhdG9yPShjb25zdCB0SW50ZXJydXB0Jik7DQorfTsNCisNCit9DQorfQ0KKw0KKyNlbmRpZiAvLyBfX25GUkNfMjAxNV8xXzBfQV9JbnRlcnJ1cHRfaF9fDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RQV00uaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90UFdNLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRjZjVlMgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90UFdNLmgKQEAgLTAsMCArMSwxMjAgQEAKKy8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorLy8gRG8gTm90IEVkaXQuLi4gdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCENCisNCisjaWZuZGVmIF9fbkZSQ18yMDE1XzFfMF9BX1BXTV9oX18NCisjZGVmaW5lIF9fbkZSQ18yMDE1XzFfMF9BX1BXTV9oX18NCisNCisjaW5jbHVkZSAidFN5c3RlbUludGVyZmFjZS5oIg0KKw0KK25hbWVzcGFjZSBuRlBHQQ0KK3sNCituYW1lc3BhY2UgbkZSQ18yMDE1XzFfMF9BDQorew0KKw0KK2NsYXNzIHRQV00NCit7DQorcHVibGljOg0KKyAgIHRQV00oKXt9DQorICAgdmlydHVhbCB+dFBXTSgpe30NCisNCisgICB2aXJ0dWFsIHRTeXN0ZW1JbnRlcmZhY2UqIGdldFN5c3RlbUludGVyZmFjZSgpID0gMDsNCisgICBzdGF0aWMgdFBXTSogY3JlYXRlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtU3lzdGVtcyA9IDEsDQorICAgfSB0SWZhY2VDb25zdGFudHM7DQorDQorICAgdHlwZWRlZg0KKyAgIHVuaW9uew0KKyAgICAgIHN0cnVjdHsNCisjaWZkZWYgX192eHdvcmtzDQorICAgICAgICAgdW5zaWduZWQgUGVyaW9kIDogMTY7DQorICAgICAgICAgdW5zaWduZWQgTWluSGlnaCA6IDE2Ow0KKyNlbHNlDQorICAgICAgICAgdW5zaWduZWQgTWluSGlnaCA6IDE2Ow0KKyAgICAgICAgIHVuc2lnbmVkIFBlcmlvZCA6IDE2Ow0KKyNlbmRpZg0KKyAgICAgIH07DQorICAgICAgc3RydWN0ew0KKyAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMzI7DQorICAgICAgfTsNCisgICB9IHRDb25maWc7DQorDQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdENvbmZpZ19JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWcodENvbmZpZyB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19QZXJpb2QodW5zaWduZWQgc2hvcnQgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfTWluSGlnaCh1bnNpZ25lZCBzaG9ydCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdENvbmZpZyByZWFkQ29uZmlnKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IHJlYWRDb25maWdfUGVyaW9kKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IHJlYWRDb25maWdfTWluSGlnaCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdExvb3BUaW1pbmdfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkTG9vcFRpbWluZyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1QZXJpb2RTY2FsZU1YUEVsZW1lbnRzID0gMTAsDQorICAgfSB0UGVyaW9kU2NhbGVNWFBfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlUGVyaW9kU2NhbGVNWFAodW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkUGVyaW9kU2NhbGVNWFAodW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtUGVyaW9kU2NhbGVIZHJFbGVtZW50cyA9IDEwLA0KKyAgIH0gdFBlcmlvZFNjYWxlSGRyX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVBlcmlvZFNjYWxlSGRyKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZFBlcmlvZFNjYWxlSGRyKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bVplcm9MYXRjaEVsZW1lbnRzID0gMjAsDQorICAgfSB0WmVyb0xhdGNoX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVplcm9MYXRjaCh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCBib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRaZXJvTGF0Y2godW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtSGRyUmVnaXN0ZXJzID0gMTAsDQorICAgfSB0SGRyX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUhkcih1bnNpZ25lZCBjaGFyIHJlZ19pbmRleCwgdW5zaWduZWQgc2hvcnQgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IHJlYWRIZHIodW5zaWduZWQgY2hhciByZWdfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bU1YUFJlZ2lzdGVycyA9IDEwLA0KKyAgIH0gdE1YUF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVNWFAodW5zaWduZWQgY2hhciByZWdfaW5kZXgsIHVuc2lnbmVkIHNob3J0IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkTVhQKHVuc2lnbmVkIGNoYXIgcmVnX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorcHJpdmF0ZToNCisgICB0UFdNKGNvbnN0IHRQV00mKTsNCisgICB2b2lkIG9wZXJhdG9yPShjb25zdCB0UFdNJik7DQorfTsNCisNCit9DQorfQ0KKw0KKyNlbmRpZiAvLyBfX25GUkNfMjAxNV8xXzBfQV9QV01faF9fDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RQb3dlci5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RQb3dlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwODRjNjYKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdFBvd2VyLmgKQEAgLTAsMCArMSwyMTcgQEAKKy8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorLy8gRG8gTm90IEVkaXQuLi4gdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCENCisNCisjaWZuZGVmIF9fbkZSQ18yMDE1XzFfMF9BX1Bvd2VyX2hfXw0KKyNkZWZpbmUgX19uRlJDXzIwMTVfMV8wX0FfUG93ZXJfaF9fDQorDQorI2luY2x1ZGUgInRTeXN0ZW1JbnRlcmZhY2UuaCINCisNCituYW1lc3BhY2UgbkZQR0ENCit7DQorbmFtZXNwYWNlIG5GUkNfMjAxNV8xXzBfQQ0KK3sNCisNCitjbGFzcyB0UG93ZXINCit7DQorcHVibGljOg0KKyAgIHRQb3dlcigpe30NCisgICB2aXJ0dWFsIH50UG93ZXIoKXt9DQorDQorICAgdmlydHVhbCB0U3lzdGVtSW50ZXJmYWNlKiBnZXRTeXN0ZW1JbnRlcmZhY2UoKSA9IDA7DQorICAgc3RhdGljIHRQb3dlciogY3JlYXRlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtU3lzdGVtcyA9IDEsDQorICAgfSB0SWZhY2VDb25zdGFudHM7DQorDQorICAgdHlwZWRlZg0KKyAgIHVuaW9uew0KKyAgICAgIHN0cnVjdHsNCisjaWZkZWYgX192eHdvcmtzDQorICAgICAgICAgdW5zaWduZWQgVXNlcjNWMyA6IDg7DQorICAgICAgICAgdW5zaWduZWQgVXNlcjVWIDogODsNCisgICAgICAgICB1bnNpZ25lZCBVc2VyNlYgOiA4Ow0KKyNlbHNlDQorICAgICAgICAgdW5zaWduZWQgVXNlcjZWIDogODsNCisgICAgICAgICB1bnNpZ25lZCBVc2VyNVYgOiA4Ow0KKyAgICAgICAgIHVuc2lnbmVkIFVzZXIzVjMgOiA4Ow0KKyNlbmRpZg0KKyAgICAgIH07DQorICAgICAgc3RydWN0ew0KKyAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMjQ7DQorICAgICAgfTsNCisgICB9IHRTdGF0dXM7DQorICAgdHlwZWRlZg0KKyAgIHVuaW9uew0KKyAgICAgIHN0cnVjdHsNCisjaWZkZWYgX192eHdvcmtzDQorICAgICAgICAgdW5zaWduZWQgT3ZlckN1cnJlbnRGYXVsdENvdW50M1YzIDogMTA7DQorICAgICAgICAgdW5zaWduZWQgT3ZlckN1cnJlbnRGYXVsdENvdW50NVYgOiAxMDsNCisgICAgICAgICB1bnNpZ25lZCBPdmVyQ3VycmVudEZhdWx0Q291bnQ2ViA6IDEwOw0KKyNlbHNlDQorICAgICAgICAgdW5zaWduZWQgT3ZlckN1cnJlbnRGYXVsdENvdW50NlYgOiAxMDsNCisgICAgICAgICB1bnNpZ25lZCBPdmVyQ3VycmVudEZhdWx0Q291bnQ1ViA6IDEwOw0KKyAgICAgICAgIHVuc2lnbmVkIE92ZXJDdXJyZW50RmF1bHRDb3VudDNWMyA6IDEwOw0KKyNlbmRpZg0KKyAgICAgIH07DQorICAgICAgc3RydWN0ew0KKyAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMzA7DQorICAgICAgfTsNCisgICB9IHRPdmVyQ3VycmVudEZhdWx0Q291bnRzOw0KKyAgIHR5cGVkZWYNCisgICB1bmlvbnsNCisgICAgICBzdHJ1Y3R7DQorI2lmZGVmIF9fdnh3b3Jrcw0KKyAgICAgICAgIHVuc2lnbmVkIFVzZXIzVjMgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIFVzZXI1ViA6IDE7DQorICAgICAgICAgdW5zaWduZWQgVXNlcjZWIDogMTsNCisjZWxzZQ0KKyAgICAgICAgIHVuc2lnbmVkIFVzZXI2ViA6IDE7DQorICAgICAgICAgdW5zaWduZWQgVXNlcjVWIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBVc2VyM1YzIDogMTsNCisjZW5kaWYNCisgICAgICB9Ow0KKyAgICAgIHN0cnVjdHsNCisgICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDM7DQorICAgICAgfTsNCisgICB9IHREaXNhYmxlOw0KKw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRVc2VyVm9sdGFnZTNWM19JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IHJlYWRVc2VyVm9sdGFnZTNWMyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFN0YXR1c19JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHRTdGF0dXMgcmVhZFN0YXR1cyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRTdGF0dXNfVXNlcjNWMyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRTdGF0dXNfVXNlcjVWKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZFN0YXR1c19Vc2VyNlYodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRVc2VyVm9sdGFnZTZWX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZFVzZXJWb2x0YWdlNlYodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRPbkNoaXBUZW1wZXJhdHVyZV9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IHJlYWRPbkNoaXBUZW1wZXJhdHVyZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFVzZXJWb2x0YWdlNVZfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkVXNlclZvbHRhZ2U1Vih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFJlc2V0RmF1bHRDb3VudHNfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHN0cm9iZVJlc2V0RmF1bHRDb3VudHModFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRPdmVyQ3VycmVudEZhdWx0Q291bnRzX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdE92ZXJDdXJyZW50RmF1bHRDb3VudHMgcmVhZE92ZXJDdXJyZW50RmF1bHRDb3VudHModFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZE92ZXJDdXJyZW50RmF1bHRDb3VudHNfT3ZlckN1cnJlbnRGYXVsdENvdW50M1YzKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IHJlYWRPdmVyQ3VycmVudEZhdWx0Q291bnRzX092ZXJDdXJyZW50RmF1bHRDb3VudDVWKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IHJlYWRPdmVyQ3VycmVudEZhdWx0Q291bnRzX092ZXJDdXJyZW50RmF1bHRDb3VudDZWKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0SW50ZWdyYXRlZElPX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZEludGVncmF0ZWRJTyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdE1YUF9ESU9Wb2x0YWdlX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZE1YUF9ESU9Wb2x0YWdlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0VXNlckN1cnJlbnQzVjNfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkVXNlckN1cnJlbnQzVjModFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRWaW5Wb2x0YWdlX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZFZpblZvbHRhZ2UodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRVc2VyQ3VycmVudDZWX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZFVzZXJDdXJyZW50NlYodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRVc2VyQ3VycmVudDVWX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZFVzZXJDdXJyZW50NVYodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRBT1ZvbHRhZ2VfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkQU9Wb2x0YWdlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0VmluQ3VycmVudF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IHJlYWRWaW5DdXJyZW50KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0RGlzYWJsZV9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVEaXNhYmxlKHREaXNhYmxlIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlRGlzYWJsZV9Vc2VyM1YzKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVEaXNhYmxlX1VzZXI1Vihib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlRGlzYWJsZV9Vc2VyNlYoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdERpc2FibGUgcmVhZERpc2FibGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkRGlzYWJsZV9Vc2VyM1YzKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZERpc2FibGVfVXNlcjVWKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZERpc2FibGVfVXNlcjZWKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisNCisNCitwcml2YXRlOg0KKyAgIHRQb3dlcihjb25zdCB0UG93ZXImKTsNCisgICB2b2lkIG9wZXJhdG9yPShjb25zdCB0UG93ZXImKTsNCit9Ow0KKw0KK30NCit9DQorDQorI2VuZGlmIC8vIF9fbkZSQ18yMDE1XzFfMF9BX1Bvd2VyX2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90UmVsYXkuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90UmVsYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2YwMjg2Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RSZWxheS5oCkBAIC0wLDAgKzEsNjggQEAKKy8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorLy8gRG8gTm90IEVkaXQuLi4gdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCENCisNCisjaWZuZGVmIF9fbkZSQ18yMDE1XzFfMF9BX1JlbGF5X2hfXw0KKyNkZWZpbmUgX19uRlJDXzIwMTVfMV8wX0FfUmVsYXlfaF9fDQorDQorI2luY2x1ZGUgInRTeXN0ZW1JbnRlcmZhY2UuaCINCisNCituYW1lc3BhY2UgbkZQR0ENCit7DQorbmFtZXNwYWNlIG5GUkNfMjAxNV8xXzBfQQ0KK3sNCisNCitjbGFzcyB0UmVsYXkNCit7DQorcHVibGljOg0KKyAgIHRSZWxheSgpe30NCisgICB2aXJ0dWFsIH50UmVsYXkoKXt9DQorDQorICAgdmlydHVhbCB0U3lzdGVtSW50ZXJmYWNlKiBnZXRTeXN0ZW1JbnRlcmZhY2UoKSA9IDA7DQorICAgc3RhdGljIHRSZWxheSogY3JlYXRlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtU3lzdGVtcyA9IDEsDQorICAgfSB0SWZhY2VDb25zdGFudHM7DQorDQorICAgdHlwZWRlZg0KKyAgIHVuaW9uew0KKyAgICAgIHN0cnVjdHsNCisjaWZkZWYgX192eHdvcmtzDQorICAgICAgICAgdW5zaWduZWQgRm9yd2FyZCA6IDQ7DQorICAgICAgICAgdW5zaWduZWQgUmV2ZXJzZSA6IDQ7DQorI2Vsc2UNCisgICAgICAgICB1bnNpZ25lZCBSZXZlcnNlIDogNDsNCisgICAgICAgICB1bnNpZ25lZCBGb3J3YXJkIDogNDsNCisjZW5kaWYNCisgICAgICB9Ow0KKyAgICAgIHN0cnVjdHsNCisgICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDg7DQorICAgICAgfTsNCisgICB9IHRWYWx1ZTsNCisNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0VmFsdWVfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlVmFsdWUodFZhbHVlIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlVmFsdWVfRm9yd2FyZCh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlVmFsdWVfUmV2ZXJzZSh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB0VmFsdWUgcmVhZFZhbHVlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZFZhbHVlX0ZvcndhcmQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkVmFsdWVfUmV2ZXJzZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorDQorDQorcHJpdmF0ZToNCisgICB0UmVsYXkoY29uc3QgdFJlbGF5Jik7DQorICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgdFJlbGF5Jik7DQorfTsNCisNCit9DQorfQ0KKw0KKyNlbmRpZiAvLyBfX25GUkNfMjAxNV8xXzBfQV9SZWxheV9oX18NCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdFNQSS5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RTUEkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2EyYjNlCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RTUEkuaApAQCAtMCwwICsxLDY4IEBACisvLyBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKy8vIERvIE5vdCBFZGl0Li4uIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQhDQorDQorI2lmbmRlZiBfX25GUkNfMjAxNV8xXzBfQV9TUElfaF9fDQorI2RlZmluZSBfX25GUkNfMjAxNV8xXzBfQV9TUElfaF9fDQorDQorI2luY2x1ZGUgInRTeXN0ZW1JbnRlcmZhY2UuaCINCisNCituYW1lc3BhY2UgbkZQR0ENCit7DQorbmFtZXNwYWNlIG5GUkNfMjAxNV8xXzBfQQ0KK3sNCisNCitjbGFzcyB0U1BJDQorew0KK3B1YmxpYzoNCisgICB0U1BJKCl7fQ0KKyAgIHZpcnR1YWwgfnRTUEkoKXt9DQorDQorICAgdmlydHVhbCB0U3lzdGVtSW50ZXJmYWNlKiBnZXRTeXN0ZW1JbnRlcmZhY2UoKSA9IDA7DQorICAgc3RhdGljIHRTUEkqIGNyZWF0ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bVN5c3RlbXMgPSAxLA0KKyAgIH0gdElmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHR5cGVkZWYNCisgICB1bmlvbnsNCisgICAgICBzdHJ1Y3R7DQorI2lmZGVmIF9fdnh3b3Jrcw0KKyAgICAgICAgIHVuc2lnbmVkIEhkciA6IDQ7DQorICAgICAgICAgdW5zaWduZWQgTVhQIDogMTsNCisjZWxzZQ0KKyAgICAgICAgIHVuc2lnbmVkIE1YUCA6IDE7DQorICAgICAgICAgdW5zaWduZWQgSGRyIDogNDsNCisjZW5kaWYNCisgICAgICB9Ow0KKyAgICAgIHN0cnVjdHsNCisgICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDU7DQorICAgICAgfTsNCisgICB9IHRDaGlwU2VsZWN0QWN0aXZlSGlnaDsNCisNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0Q2hpcFNlbGVjdEFjdGl2ZUhpZ2hfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ2hpcFNlbGVjdEFjdGl2ZUhpZ2godENoaXBTZWxlY3RBY3RpdmVIaWdoIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ2hpcFNlbGVjdEFjdGl2ZUhpZ2hfSGRyKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDaGlwU2VsZWN0QWN0aXZlSGlnaF9NWFAodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdENoaXBTZWxlY3RBY3RpdmVIaWdoIHJlYWRDaGlwU2VsZWN0QWN0aXZlSGlnaCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRDaGlwU2VsZWN0QWN0aXZlSGlnaF9IZHIodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ2hpcFNlbGVjdEFjdGl2ZUhpZ2hfTVhQKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisNCisNCitwcml2YXRlOg0KKyAgIHRTUEkoY29uc3QgdFNQSSYpOw0KKyAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHRTUEkmKTsNCit9Ow0KKw0KK30NCit9DQorDQorI2VuZGlmIC8vIF9fbkZSQ18yMDE1XzFfMF9BX1NQSV9oX18NCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdFN5c1dhdGNoZG9nLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdFN5c1dhdGNoZG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdkY2QxMwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90U3lzV2F0Y2hkb2cuaApAQCAtMCwwICsxLDEwOCBAQAorLy8gQ29weXJpZ2h0IChjKSBOYXRpb25hbCBJbnN0cnVtZW50cyAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCisvLyBEbyBOb3QgRWRpdC4uLiB0aGlzIGZpbGUgaXMgZ2VuZXJhdGVkIQ0KKw0KKyNpZm5kZWYgX19uRlJDXzIwMTVfMV8wX0FfU3lzV2F0Y2hkb2dfaF9fDQorI2RlZmluZSBfX25GUkNfMjAxNV8xXzBfQV9TeXNXYXRjaGRvZ19oX18NCisNCisjaW5jbHVkZSAidFN5c3RlbUludGVyZmFjZS5oIg0KKw0KK25hbWVzcGFjZSBuRlBHQQ0KK3sNCituYW1lc3BhY2UgbkZSQ18yMDE1XzFfMF9BDQorew0KKw0KK2NsYXNzIHRTeXNXYXRjaGRvZw0KK3sNCitwdWJsaWM6DQorICAgdFN5c1dhdGNoZG9nKCl7fQ0KKyAgIHZpcnR1YWwgfnRTeXNXYXRjaGRvZygpe30NCisNCisgICB2aXJ0dWFsIHRTeXN0ZW1JbnRlcmZhY2UqIGdldFN5c3RlbUludGVyZmFjZSgpID0gMDsNCisgICBzdGF0aWMgdFN5c1dhdGNoZG9nKiBjcmVhdGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7DQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1TeXN0ZW1zID0gMSwNCisgICB9IHRJZmFjZUNvbnN0YW50czsNCisNCisgICB0eXBlZGVmDQorICAgdW5pb257DQorICAgICAgc3RydWN0ew0KKyNpZmRlZiBfX3Z4d29ya3MNCisgICAgICAgICB1bnNpZ25lZCBTeXN0ZW1BY3RpdmUgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIFBvd2VyQWxpdmUgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIFN5c0Rpc2FibGVDb3VudCA6IDE1Ow0KKyAgICAgICAgIHVuc2lnbmVkIFBvd2VyRGlzYWJsZUNvdW50IDogMTU7DQorI2Vsc2UNCisgICAgICAgICB1bnNpZ25lZCBQb3dlckRpc2FibGVDb3VudCA6IDE1Ow0KKyAgICAgICAgIHVuc2lnbmVkIFN5c0Rpc2FibGVDb3VudCA6IDE1Ow0KKyAgICAgICAgIHVuc2lnbmVkIFBvd2VyQWxpdmUgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIFN5c3RlbUFjdGl2ZSA6IDE7DQorI2VuZGlmDQorICAgICAgfTsNCisgICAgICBzdHJ1Y3R7DQorICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiAzMjsNCisgICAgICB9Ow0KKyAgIH0gdFN0YXR1czsNCisNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0U3RhdHVzX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdFN0YXR1cyByZWFkU3RhdHVzKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZFN0YXR1c19TeXN0ZW1BY3RpdmUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkU3RhdHVzX1Bvd2VyQWxpdmUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZFN0YXR1c19TeXNEaXNhYmxlQ291bnQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZFN0YXR1c19Qb3dlckRpc2FibGVDb3VudCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdENvbW1hbmRfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29tbWFuZCh1bnNpZ25lZCBzaG9ydCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZENvbW1hbmQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRDaGFsbGVuZ2VfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRDaGFsbGVuZ2UodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRBY3RpdmVfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlQWN0aXZlKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZEFjdGl2ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFRpbWVyX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJlYWRUaW1lcih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdEZvcmNlZEtpbGxzX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZEZvcmNlZEtpbGxzKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisNCisNCitwcml2YXRlOg0KKyAgIHRTeXNXYXRjaGRvZyhjb25zdCB0U3lzV2F0Y2hkb2cmKTsNCisgICB2b2lkIG9wZXJhdG9yPShjb25zdCB0U3lzV2F0Y2hkb2cmKTsNCit9Ow0KKw0KK30NCit9DQorDQorI2VuZGlmIC8vIF9fbkZSQ18yMDE1XzFfMF9BX1N5c1dhdGNoZG9nX2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJ1bnRpbWVGUEdBTmFtZXNwYWNlL25JbnRlcmZhY2VHbG9iYWxzLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25SdW50aW1lRlBHQU5hbWVzcGFjZS9uSW50ZXJmYWNlR2xvYmFscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNGNjNzQKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25SdW50aW1lRlBHQU5hbWVzcGFjZS9uSW50ZXJmYWNlR2xvYmFscy5oCkBAIC0wLDAgKzEsMTUgQEAKKy8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorLy8gRG8gTm90IEVkaXQuLi4gdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCENCisNCisjaWZuZGVmIF9fbkZSQ18yMDEyXzFfNl80X25JbnRlcmZhY2VHbG9iYWxzX2hfXw0KKyNkZWZpbmUgX19uRlJDXzIwMTJfMV82XzRfbkludGVyZmFjZUdsb2JhbHNfaF9fDQorDQorbmFtZXNwYWNlIG5GUEdBDQorew0KK25hbWVzcGFjZSBuRlJDXzIwMTJfMV82XzQNCit7DQorICAgZXh0ZXJuIHVuc2lnbmVkIGludCBnX2N1cnJlbnRUYXJnZXRDbGFzczsNCit9DQorfQ0KKw0KKyNlbmRpZiAvLyBfX25GUkNfMjAxMl8xXzZfNF9uSW50ZXJmYWNlR2xvYmFsc19oX18NCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25SdW50aW1lRlBHQU5hbWVzcGFjZS90QUkuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJ1bnRpbWVGUEdBTmFtZXNwYWNlL3RBSS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4YzQyM2EKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25SdW50aW1lRlBHQU5hbWVzcGFjZS90QUkuaApAQCAtMCwwICsxLDE0OSBAQAorLy8gQ29weXJpZ2h0IChjKSBOYXRpb25hbCBJbnN0cnVtZW50cyAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCisvLyBEbyBOb3QgRWRpdC4uLiB0aGlzIGZpbGUgaXMgZ2VuZXJhdGVkIQ0KKw0KKyNpZm5kZWYgX19uRlJDXzIwMTJfMV82XzRfQUlfaF9fDQorI2RlZmluZSBfX25GUkNfMjAxMl8xXzZfNF9BSV9oX18NCisNCisjaW5jbHVkZSAidFN5c3RlbUludGVyZmFjZS5oIg0KKw0KK25hbWVzcGFjZSBuRlBHQQ0KK3sNCituYW1lc3BhY2UgbkZSQ18yMDEyXzFfNl80DQorew0KKw0KK2NsYXNzIHRBSQ0KK3sNCitwdWJsaWM6DQorICAgdEFJKCl7fQ0KKyAgIHZpcnR1YWwgfnRBSSgpe30NCisNCisgICB2aXJ0dWFsIHRTeXN0ZW1JbnRlcmZhY2UqIGdldFN5c3RlbUludGVyZmFjZSgpID0gMDsNCisgICBzdGF0aWMgdEFJKiBjcmVhdGUodW5zaWduZWQgY2hhciBzeXNfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciBnZXRTeXN0ZW1JbmRleCgpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bVN5c3RlbXMgPSAyLA0KKyAgIH0gdElmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHR5cGVkZWYNCisgICB1bmlvbnsNCisgICAgICBzdHJ1Y3R7DQorI2lmZGVmIF9fdnh3b3Jrcw0KKyAgICAgICAgIHVuc2lnbmVkIENoYW5uZWwgOiAzOw0KKyAgICAgICAgIHVuc2lnbmVkIE1vZHVsZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgQXZlcmFnZWQgOiAxOw0KKyNlbHNlDQorICAgICAgICAgdW5zaWduZWQgQXZlcmFnZWQgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIE1vZHVsZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgQ2hhbm5lbCA6IDM7DQorI2VuZGlmDQorICAgICAgfTsNCisgICAgICBzdHJ1Y3R7DQorICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiA1Ow0KKyAgICAgIH07DQorICAgfSB0UmVhZFNlbGVjdDsNCisgICB0eXBlZGVmDQorICAgdW5pb257DQorICAgICAgc3RydWN0ew0KKyNpZmRlZiBfX3Z4d29ya3MNCisgICAgICAgICB1bnNpZ25lZCBTY2FuU2l6ZSA6IDM7DQorICAgICAgICAgdW5zaWduZWQgQ29udmVydFJhdGUgOiAyNjsNCisjZWxzZQ0KKyAgICAgICAgIHVuc2lnbmVkIENvbnZlcnRSYXRlIDogMjY7DQorICAgICAgICAgdW5zaWduZWQgU2NhblNpemUgOiAzOw0KKyNlbmRpZg0KKyAgICAgIH07DQorICAgICAgc3RydWN0ew0KKyAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMjk7DQorICAgICAgfTsNCisgICB9IHRDb25maWc7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdENvbmZpZ19JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWcodENvbmZpZyB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19TY2FuU2l6ZSh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0NvbnZlcnRSYXRlKHVuc2lnbmVkIGludCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdENvbmZpZyByZWFkQ29uZmlnKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZENvbmZpZ19TY2FuU2l6ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcmVhZENvbmZpZ19Db252ZXJ0UmF0ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdExvb3BUaW1pbmdfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcmVhZExvb3BUaW1pbmcodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtT3ZlcnNhbXBsZUJpdHNFbGVtZW50cyA9IDgsDQorICAgfSB0T3ZlcnNhbXBsZUJpdHNfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlT3ZlcnNhbXBsZUJpdHModW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkT3ZlcnNhbXBsZUJpdHModW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtQXZlcmFnZUJpdHNFbGVtZW50cyA9IDgsDQorICAgfSB0QXZlcmFnZUJpdHNfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlQXZlcmFnZUJpdHModW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQXZlcmFnZUJpdHModW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtU2Nhbkxpc3RFbGVtZW50cyA9IDgsDQorICAgfSB0U2Nhbkxpc3RfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlU2Nhbkxpc3QodW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkU2Nhbkxpc3QodW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRPdXRwdXRfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCBzaWduZWQgaW50IHJlYWRPdXRwdXQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRMYXRjaE91dHB1dF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgc3Ryb2JlTGF0Y2hPdXRwdXQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRSZWFkU2VsZWN0X0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVJlYWRTZWxlY3QodFJlYWRTZWxlY3QgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVSZWFkU2VsZWN0X0NoYW5uZWwodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVJlYWRTZWxlY3RfTW9kdWxlKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVSZWFkU2VsZWN0X0F2ZXJhZ2VkKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHRSZWFkU2VsZWN0IHJlYWRSZWFkU2VsZWN0KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZFJlYWRTZWxlY3RfQ2hhbm5lbCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRSZWFkU2VsZWN0X01vZHVsZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRSZWFkU2VsZWN0X0F2ZXJhZ2VkKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisNCisNCitwcml2YXRlOg0KKyAgIHRBSShjb25zdCB0QUkmKTsNCisgICB2b2lkIG9wZXJhdG9yPShjb25zdCB0QUkmKTsNCit9Ow0KKw0KK30NCit9DQorDQorI2VuZGlmIC8vIF9fbkZSQ18yMDEyXzFfNl80X0FJX2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJ1bnRpbWVGUEdBTmFtZXNwYWNlL3RBY2N1bXVsYXRvci5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUnVudGltZUZQR0FOYW1lc3BhY2UvdEFjY3VtdWxhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEwOTcyYQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJ1bnRpbWVGUEdBTmFtZXNwYWNlL3RBY2N1bXVsYXRvci5oCkBAIC0wLDAgKzEsODcgQEAKKy8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorLy8gRG8gTm90IEVkaXQuLi4gdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCENCisNCisjaWZuZGVmIF9fbkZSQ18yMDEyXzFfNl80X0FjY3VtdWxhdG9yX2hfXw0KKyNkZWZpbmUgX19uRlJDXzIwMTJfMV82XzRfQWNjdW11bGF0b3JfaF9fDQorDQorI2luY2x1ZGUgInRTeXN0ZW1JbnRlcmZhY2UuaCINCisNCituYW1lc3BhY2UgbkZQR0ENCit7DQorbmFtZXNwYWNlIG5GUkNfMjAxMl8xXzZfNA0KK3sNCisNCitjbGFzcyB0QWNjdW11bGF0b3INCit7DQorcHVibGljOg0KKyAgIHRBY2N1bXVsYXRvcigpe30NCisgICB2aXJ0dWFsIH50QWNjdW11bGF0b3IoKXt9DQorDQorICAgdmlydHVhbCB0U3lzdGVtSW50ZXJmYWNlKiBnZXRTeXN0ZW1JbnRlcmZhY2UoKSA9IDA7DQorICAgc3RhdGljIHRBY2N1bXVsYXRvciogY3JlYXRlKHVuc2lnbmVkIGNoYXIgc3lzX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgZ2V0U3lzdGVtSW5kZXgoKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1TeXN0ZW1zID0gMiwNCisgICB9IHRJZmFjZUNvbnN0YW50czsNCisNCisgICB0eXBlZGVmDQorICAgdW5pb257DQorICAgICAgc3RydWN0ew0KKyAgICAgICAgIHNpZ25lZCBsb25nIGxvbmcgVmFsdWU7DQorICAgICAgICAgdW5zaWduZWQgQ291bnQgOiAzMjsNCisgICAgICB9Ow0KKyAgICAgIHN0cnVjdHsNCisgICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDMyOw0KKyAgICAgICAgIHVuc2lnbmVkIHZhbHVlMiA6IDMyOw0KKyAgICAgICAgIHVuc2lnbmVkIHZhbHVlMyA6IDMyOw0KKyAgICAgIH07DQorICAgfSB0T3V0cHV0Ow0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRPdXRwdXRfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB0T3V0cHV0IHJlYWRPdXRwdXQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgc2lnbmVkIGxvbmcgbG9uZyByZWFkT3V0cHV0X1ZhbHVlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGludCByZWFkT3V0cHV0X0NvdW50KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0Q2VudGVyX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNlbnRlcihzaWduZWQgaW50IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBzaWduZWQgaW50IHJlYWRDZW50ZXIodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHREZWFkYmFuZF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVEZWFkYmFuZChzaWduZWQgaW50IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBzaWduZWQgaW50IHJlYWREZWFkYmFuZCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFJlc2V0X0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCBzdHJvYmVSZXNldCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorDQorDQorDQorcHJpdmF0ZToNCisgICB0QWNjdW11bGF0b3IoY29uc3QgdEFjY3VtdWxhdG9yJik7DQorICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgdEFjY3VtdWxhdG9yJik7DQorfTsNCisNCit9DQorfQ0KKw0KKyNlbmRpZiAvLyBfX25GUkNfMjAxMl8xXzZfNF9BY2N1bXVsYXRvcl9oX18NCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25SdW50aW1lRlBHQU5hbWVzcGFjZS90QWxhcm0uaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJ1bnRpbWVGUEdBTmFtZXNwYWNlL3RBbGFybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZWIzM2YKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25SdW50aW1lRlBHQU5hbWVzcGFjZS90QWxhcm0uaApAQCAtMCwwICsxLDU3IEBACisvLyBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKy8vIERvIE5vdCBFZGl0Li4uIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQhDQorDQorI2lmbmRlZiBfX25GUkNfMjAxMl8xXzZfNF9BbGFybV9oX18NCisjZGVmaW5lIF9fbkZSQ18yMDEyXzFfNl80X0FsYXJtX2hfXw0KKw0KKyNpbmNsdWRlICJ0U3lzdGVtSW50ZXJmYWNlLmgiDQorDQorbmFtZXNwYWNlIG5GUEdBDQorew0KK25hbWVzcGFjZSBuRlJDXzIwMTJfMV82XzQNCit7DQorDQorY2xhc3MgdEFsYXJtDQorew0KK3B1YmxpYzoNCisgICB0QWxhcm0oKXt9DQorICAgdmlydHVhbCB+dEFsYXJtKCl7fQ0KKw0KKyAgIHZpcnR1YWwgdFN5c3RlbUludGVyZmFjZSogZ2V0U3lzdGVtSW50ZXJmYWNlKCkgPSAwOw0KKyAgIHN0YXRpYyB0QWxhcm0qIGNyZWF0ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bVN5c3RlbXMgPSAxLA0KKyAgIH0gdElmYWNlQ29uc3RhbnRzOw0KKw0KKw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRFbmFibGVfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlRW5hYmxlKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZEVuYWJsZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFRyaWdnZXJUaW1lX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVRyaWdnZXJUaW1lKHVuc2lnbmVkIGludCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJlYWRUcmlnZ2VyVGltZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorDQorDQorcHJpdmF0ZToNCisgICB0QWxhcm0oY29uc3QgdEFsYXJtJik7DQorICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgdEFsYXJtJik7DQorfTsNCisNCit9DQorfQ0KKw0KKyNlbmRpZiAvLyBfX25GUkNfMjAxMl8xXzZfNF9BbGFybV9oX18NCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25SdW50aW1lRlBHQU5hbWVzcGFjZS90QW5hbG9nVHJpZ2dlci5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUnVudGltZUZQR0FOYW1lc3BhY2UvdEFuYWxvZ1RyaWdnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzE1MGY3Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUnVudGltZUZQR0FOYW1lc3BhY2UvdEFuYWxvZ1RyaWdnZXIuaApAQCAtMCwwICsxLDEzMyBAQAorLy8gQ29weXJpZ2h0IChjKSBOYXRpb25hbCBJbnN0cnVtZW50cyAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCisvLyBEbyBOb3QgRWRpdC4uLiB0aGlzIGZpbGUgaXMgZ2VuZXJhdGVkIQ0KKw0KKyNpZm5kZWYgX19uRlJDXzIwMTJfMV82XzRfQW5hbG9nVHJpZ2dlcl9oX18NCisjZGVmaW5lIF9fbkZSQ18yMDEyXzFfNl80X0FuYWxvZ1RyaWdnZXJfaF9fDQorDQorI2luY2x1ZGUgInRTeXN0ZW1JbnRlcmZhY2UuaCINCisNCituYW1lc3BhY2UgbkZQR0ENCit7DQorbmFtZXNwYWNlIG5GUkNfMjAxMl8xXzZfNA0KK3sNCisNCitjbGFzcyB0QW5hbG9nVHJpZ2dlcg0KK3sNCitwdWJsaWM6DQorICAgdEFuYWxvZ1RyaWdnZXIoKXt9DQorICAgdmlydHVhbCB+dEFuYWxvZ1RyaWdnZXIoKXt9DQorDQorICAgdmlydHVhbCB0U3lzdGVtSW50ZXJmYWNlKiBnZXRTeXN0ZW1JbnRlcmZhY2UoKSA9IDA7DQorICAgc3RhdGljIHRBbmFsb2dUcmlnZ2VyKiBjcmVhdGUodW5zaWduZWQgY2hhciBzeXNfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciBnZXRTeXN0ZW1JbmRleCgpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bVN5c3RlbXMgPSA4LA0KKyAgIH0gdElmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHR5cGVkZWYNCisgICB1bmlvbnsNCisgICAgICBzdHJ1Y3R7DQorI2lmZGVmIF9fdnh3b3Jrcw0KKyAgICAgICAgIHVuc2lnbmVkIEluSHlzdGVyZXNpcyA6IDE7DQorICAgICAgICAgdW5zaWduZWQgT3ZlckxpbWl0IDogMTsNCisgICAgICAgICB1bnNpZ25lZCBSaXNpbmcgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEZhbGxpbmcgOiAxOw0KKyNlbHNlDQorICAgICAgICAgdW5zaWduZWQgRmFsbGluZyA6IDE7DQorICAgICAgICAgdW5zaWduZWQgUmlzaW5nIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBPdmVyTGltaXQgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEluSHlzdGVyZXNpcyA6IDE7DQorI2VuZGlmDQorICAgICAgfTsNCisgICAgICBzdHJ1Y3R7DQorICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiA0Ow0KKyAgICAgIH07DQorICAgfSB0T3V0cHV0Ow0KKyAgIHR5cGVkZWYNCisgICB1bmlvbnsNCisgICAgICBzdHJ1Y3R7DQorI2lmZGVmIF9fdnh3b3Jrcw0KKyAgICAgICAgIHVuc2lnbmVkIENoYW5uZWwgOiAzOw0KKyAgICAgICAgIHVuc2lnbmVkIE1vZHVsZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgQXZlcmFnZWQgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEZpbHRlciA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRmxvYXRpbmdSb2xsb3ZlciA6IDE7DQorICAgICAgICAgc2lnbmVkIFJvbGxvdmVyTGltaXQgOiA4Ow0KKyNlbHNlDQorICAgICAgICAgc2lnbmVkIFJvbGxvdmVyTGltaXQgOiA4Ow0KKyAgICAgICAgIHVuc2lnbmVkIEZsb2F0aW5nUm9sbG92ZXIgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEZpbHRlciA6IDE7DQorICAgICAgICAgdW5zaWduZWQgQXZlcmFnZWQgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIE1vZHVsZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgQ2hhbm5lbCA6IDM7DQorI2VuZGlmDQorICAgICAgfTsNCisgICAgICBzdHJ1Y3R7DQorICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiAxNTsNCisgICAgICB9Ow0KKyAgIH0gdFNvdXJjZVNlbGVjdDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0U291cmNlU2VsZWN0X0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVNvdXJjZVNlbGVjdCh0U291cmNlU2VsZWN0IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlU291cmNlU2VsZWN0X0NoYW5uZWwodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVNvdXJjZVNlbGVjdF9Nb2R1bGUodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVNvdXJjZVNlbGVjdF9BdmVyYWdlZChib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlU291cmNlU2VsZWN0X0ZpbHRlcihib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlU291cmNlU2VsZWN0X0Zsb2F0aW5nUm9sbG92ZXIoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVNvdXJjZVNlbGVjdF9Sb2xsb3ZlckxpbWl0KHNpZ25lZCBzaG9ydCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdFNvdXJjZVNlbGVjdCByZWFkU291cmNlU2VsZWN0KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZFNvdXJjZVNlbGVjdF9DaGFubmVsKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZFNvdXJjZVNlbGVjdF9Nb2R1bGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkU291cmNlU2VsZWN0X0F2ZXJhZ2VkKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZFNvdXJjZVNlbGVjdF9GaWx0ZXIodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkU291cmNlU2VsZWN0X0Zsb2F0aW5nUm9sbG92ZXIodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgc2lnbmVkIHNob3J0IHJlYWRTb3VyY2VTZWxlY3RfUm9sbG92ZXJMaW1pdCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFVwcGVyTGltaXRfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlVXBwZXJMaW1pdChzaWduZWQgaW50IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBzaWduZWQgaW50IHJlYWRVcHBlckxpbWl0KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0TG93ZXJMaW1pdF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVMb3dlckxpbWl0KHNpZ25lZCBpbnQgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHNpZ25lZCBpbnQgcmVhZExvd2VyTGltaXQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtT3V0cHV0RWxlbWVudHMgPSA4LA0KKyAgIH0gdE91dHB1dF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHRPdXRwdXQgcmVhZE91dHB1dCh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRPdXRwdXRfSW5IeXN0ZXJlc2lzKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZE91dHB1dF9PdmVyTGltaXQodW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkT3V0cHV0X1Jpc2luZyh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRPdXRwdXRfRmFsbGluZyh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorDQorDQorcHJpdmF0ZToNCisgICB0QW5hbG9nVHJpZ2dlcihjb25zdCB0QW5hbG9nVHJpZ2dlciYpOw0KKyAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHRBbmFsb2dUcmlnZ2VyJik7DQorfTsNCisNCit9DQorfQ0KKw0KKyNlbmRpZiAvLyBfX25GUkNfMjAxMl8xXzZfNF9BbmFsb2dUcmlnZ2VyX2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJ1bnRpbWVGUEdBTmFtZXNwYWNlL3RDb3VudGVyLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25SdW50aW1lRlBHQU5hbWVzcGFjZS90Q291bnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyM2E3ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25SdW50aW1lRlBHQU5hbWVzcGFjZS90Q291bnRlci5oCkBAIC0wLDAgKzEsMjE5IEBACisvLyBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKy8vIERvIE5vdCBFZGl0Li4uIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQhDQorDQorI2lmbmRlZiBfX25GUkNfMjAxMl8xXzZfNF9Db3VudGVyX2hfXw0KKyNkZWZpbmUgX19uRlJDXzIwMTJfMV82XzRfQ291bnRlcl9oX18NCisNCisjaW5jbHVkZSAidFN5c3RlbUludGVyZmFjZS5oIg0KKw0KK25hbWVzcGFjZSBuRlBHQQ0KK3sNCituYW1lc3BhY2UgbkZSQ18yMDEyXzFfNl80DQorew0KKw0KK2NsYXNzIHRDb3VudGVyDQorew0KK3B1YmxpYzoNCisgICB0Q291bnRlcigpe30NCisgICB2aXJ0dWFsIH50Q291bnRlcigpe30NCisNCisgICB2aXJ0dWFsIHRTeXN0ZW1JbnRlcmZhY2UqIGdldFN5c3RlbUludGVyZmFjZSgpID0gMDsNCisgICBzdGF0aWMgdENvdW50ZXIqIGNyZWF0ZSh1bnNpZ25lZCBjaGFyIHN5c19pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIGdldFN5c3RlbUluZGV4KCkgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtU3lzdGVtcyA9IDgsDQorICAgfSB0SWZhY2VDb25zdGFudHM7DQorDQorICAgdHlwZWRlZg0KKyAgIHVuaW9uew0KKyAgICAgIHN0cnVjdHsNCisjaWZkZWYgX192eHdvcmtzDQorICAgICAgICAgdW5zaWduZWQgRGlyZWN0aW9uIDogMTsNCisgICAgICAgICBzaWduZWQgVmFsdWUgOiAzMTsNCisjZWxzZQ0KKyAgICAgICAgIHNpZ25lZCBWYWx1ZSA6IDMxOw0KKyAgICAgICAgIHVuc2lnbmVkIERpcmVjdGlvbiA6IDE7DQorI2VuZGlmDQorICAgICAgfTsNCisgICAgICBzdHJ1Y3R7DQorICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiAzMjsNCisgICAgICB9Ow0KKyAgIH0gdE91dHB1dDsNCisgICB0eXBlZGVmDQorICAgdW5pb257DQorICAgICAgc3RydWN0ew0KKyNpZmRlZiBfX3Z4d29ya3MNCisgICAgICAgICB1bnNpZ25lZCBVcFNvdXJjZV9DaGFubmVsIDogNDsNCisgICAgICAgICB1bnNpZ25lZCBVcFNvdXJjZV9Nb2R1bGUgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIFVwU291cmNlX0FuYWxvZ1RyaWdnZXIgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIERvd25Tb3VyY2VfQ2hhbm5lbCA6IDQ7DQorICAgICAgICAgdW5zaWduZWQgRG93blNvdXJjZV9Nb2R1bGUgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIERvd25Tb3VyY2VfQW5hbG9nVHJpZ2dlciA6IDE7DQorICAgICAgICAgdW5zaWduZWQgSW5kZXhTb3VyY2VfQ2hhbm5lbCA6IDQ7DQorICAgICAgICAgdW5zaWduZWQgSW5kZXhTb3VyY2VfTW9kdWxlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBJbmRleFNvdXJjZV9BbmFsb2dUcmlnZ2VyIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBJbmRleEFjdGl2ZUhpZ2ggOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIFVwUmlzaW5nRWRnZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgVXBGYWxsaW5nRWRnZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRG93blJpc2luZ0VkZ2UgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIERvd25GYWxsaW5nRWRnZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgTW9kZSA6IDI7DQorICAgICAgICAgdW5zaWduZWQgUHVsc2VMZW5ndGhUaHJlc2hvbGQgOiA2Ow0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZSA6IDE7DQorI2Vsc2UNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGUgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIFB1bHNlTGVuZ3RoVGhyZXNob2xkIDogNjsNCisgICAgICAgICB1bnNpZ25lZCBNb2RlIDogMjsNCisgICAgICAgICB1bnNpZ25lZCBEb3duRmFsbGluZ0VkZ2UgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIERvd25SaXNpbmdFZGdlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBVcEZhbGxpbmdFZGdlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBVcFJpc2luZ0VkZ2UgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEluZGV4QWN0aXZlSGlnaCA6IDE7DQorICAgICAgICAgdW5zaWduZWQgSW5kZXhTb3VyY2VfQW5hbG9nVHJpZ2dlciA6IDE7DQorICAgICAgICAgdW5zaWduZWQgSW5kZXhTb3VyY2VfTW9kdWxlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBJbmRleFNvdXJjZV9DaGFubmVsIDogNDsNCisgICAgICAgICB1bnNpZ25lZCBEb3duU291cmNlX0FuYWxvZ1RyaWdnZXIgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIERvd25Tb3VyY2VfTW9kdWxlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBEb3duU291cmNlX0NoYW5uZWwgOiA0Ow0KKyAgICAgICAgIHVuc2lnbmVkIFVwU291cmNlX0FuYWxvZ1RyaWdnZXIgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIFVwU291cmNlX01vZHVsZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgVXBTb3VyY2VfQ2hhbm5lbCA6IDQ7DQorI2VuZGlmDQorICAgICAgfTsNCisgICAgICBzdHJ1Y3R7DQorICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiAzMjsNCisgICAgICB9Ow0KKyAgIH0gdENvbmZpZzsNCisgICB0eXBlZGVmDQorICAgdW5pb257DQorICAgICAgc3RydWN0ew0KKyNpZmRlZiBfX3Z4d29ya3MNCisgICAgICAgICB1bnNpZ25lZCBQZXJpb2QgOiAyMzsNCisgICAgICAgICBzaWduZWQgQ291bnQgOiA4Ow0KKyAgICAgICAgIHVuc2lnbmVkIFN0YWxsZWQgOiAxOw0KKyNlbHNlDQorICAgICAgICAgdW5zaWduZWQgU3RhbGxlZCA6IDE7DQorICAgICAgICAgc2lnbmVkIENvdW50IDogODsNCisgICAgICAgICB1bnNpZ25lZCBQZXJpb2QgOiAyMzsNCisjZW5kaWYNCisgICAgICB9Ow0KKyAgICAgIHN0cnVjdHsNCisgICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDMyOw0KKyAgICAgIH07DQorICAgfSB0VGltZXJPdXRwdXQ7DQorICAgdHlwZWRlZg0KKyAgIHVuaW9uew0KKyAgICAgIHN0cnVjdHsNCisjaWZkZWYgX192eHdvcmtzDQorICAgICAgICAgdW5zaWduZWQgU3RhbGxQZXJpb2QgOiAyNDsNCisgICAgICAgICB1bnNpZ25lZCBBdmVyYWdlU2l6ZSA6IDc7DQorICAgICAgICAgdW5zaWduZWQgVXBkYXRlV2hlbkVtcHR5IDogMTsNCisjZWxzZQ0KKyAgICAgICAgIHVuc2lnbmVkIFVwZGF0ZVdoZW5FbXB0eSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgQXZlcmFnZVNpemUgOiA3Ow0KKyAgICAgICAgIHVuc2lnbmVkIFN0YWxsUGVyaW9kIDogMjQ7DQorI2VuZGlmDQorICAgICAgfTsNCisgICAgICBzdHJ1Y3R7DQorICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiAzMjsNCisgICAgICB9Ow0KKyAgIH0gdFRpbWVyQ29uZmlnOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRPdXRwdXRfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB0T3V0cHV0IHJlYWRPdXRwdXQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkT3V0cHV0X0RpcmVjdGlvbih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBzaWduZWQgaW50IHJlYWRPdXRwdXRfVmFsdWUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRDb25maWdfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnKHRDb25maWcgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfVXBTb3VyY2VfQ2hhbm5lbCh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX1VwU291cmNlX01vZHVsZSh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX1VwU291cmNlX0FuYWxvZ1RyaWdnZXIoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19Eb3duU291cmNlX0NoYW5uZWwodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19Eb3duU291cmNlX01vZHVsZSh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0Rvd25Tb3VyY2VfQW5hbG9nVHJpZ2dlcihib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0luZGV4U291cmNlX0NoYW5uZWwodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19JbmRleFNvdXJjZV9Nb2R1bGUodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19JbmRleFNvdXJjZV9BbmFsb2dUcmlnZ2VyKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfSW5kZXhBY3RpdmVIaWdoKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfVXBSaXNpbmdFZGdlKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfVXBGYWxsaW5nRWRnZShib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0Rvd25SaXNpbmdFZGdlKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRG93bkZhbGxpbmdFZGdlKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfTW9kZSh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX1B1bHNlTGVuZ3RoVGhyZXNob2xkKHVuc2lnbmVkIHNob3J0IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0VuYWJsZShib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB0Q29uZmlnIHJlYWRDb25maWcodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ29uZmlnX1VwU291cmNlX0NoYW5uZWwodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ29uZmlnX1VwU291cmNlX01vZHVsZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfVXBTb3VyY2VfQW5hbG9nVHJpZ2dlcih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRDb25maWdfRG93blNvdXJjZV9DaGFubmVsKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZENvbmZpZ19Eb3duU291cmNlX01vZHVsZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRG93blNvdXJjZV9BbmFsb2dUcmlnZ2VyKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZENvbmZpZ19JbmRleFNvdXJjZV9DaGFubmVsKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZENvbmZpZ19JbmRleFNvdXJjZV9Nb2R1bGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0luZGV4U291cmNlX0FuYWxvZ1RyaWdnZXIodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0luZGV4QWN0aXZlSGlnaCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfVXBSaXNpbmdFZGdlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19VcEZhbGxpbmdFZGdlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19Eb3duUmlzaW5nRWRnZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRG93bkZhbGxpbmdFZGdlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZENvbmZpZ19Nb2RlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IHJlYWRDb25maWdfUHVsc2VMZW5ndGhUaHJlc2hvbGQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0VuYWJsZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFRpbWVyT3V0cHV0X0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdFRpbWVyT3V0cHV0IHJlYWRUaW1lck91dHB1dCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcmVhZFRpbWVyT3V0cHV0X1BlcmlvZCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBzaWduZWQgY2hhciByZWFkVGltZXJPdXRwdXRfQ291bnQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkVGltZXJPdXRwdXRfU3RhbGxlZCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFJlc2V0X0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCBzdHJvYmVSZXNldCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFRpbWVyQ29uZmlnX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVRpbWVyQ29uZmlnKHRUaW1lckNvbmZpZyB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVRpbWVyQ29uZmlnX1N0YWxsUGVyaW9kKHVuc2lnbmVkIGludCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVRpbWVyQ29uZmlnX0F2ZXJhZ2VTaXplKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVUaW1lckNvbmZpZ19VcGRhdGVXaGVuRW1wdHkoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdFRpbWVyQ29uZmlnIHJlYWRUaW1lckNvbmZpZyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcmVhZFRpbWVyQ29uZmlnX1N0YWxsUGVyaW9kKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZFRpbWVyQ29uZmlnX0F2ZXJhZ2VTaXplKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZFRpbWVyQ29uZmlnX1VwZGF0ZVdoZW5FbXB0eSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorDQorDQorDQorcHJpdmF0ZToNCisgICB0Q291bnRlcihjb25zdCB0Q291bnRlciYpOw0KKyAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHRDb3VudGVyJik7DQorfTsNCisNCit9DQorfQ0KKw0KKyNlbmRpZiAvLyBfX25GUkNfMjAxMl8xXzZfNF9Db3VudGVyX2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJ1bnRpbWVGUEdBTmFtZXNwYWNlL3RESU8uaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJ1bnRpbWVGUEdBTmFtZXNwYWNlL3RESU8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWJiNjkxCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUnVudGltZUZQR0FOYW1lc3BhY2UvdERJTy5oCkBAIC0wLDAgKzEsMzMwIEBACisvLyBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKy8vIERvIE5vdCBFZGl0Li4uIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQhDQorDQorI2lmbmRlZiBfX25GUkNfMjAxMl8xXzZfNF9ESU9faF9fDQorI2RlZmluZSBfX25GUkNfMjAxMl8xXzZfNF9ESU9faF9fDQorDQorI2luY2x1ZGUgInRTeXN0ZW1JbnRlcmZhY2UuaCINCisNCituYW1lc3BhY2UgbkZQR0ENCit7DQorbmFtZXNwYWNlIG5GUkNfMjAxMl8xXzZfNA0KK3sNCisNCitjbGFzcyB0RElPDQorew0KK3B1YmxpYzoNCisgICB0RElPKCl7fQ0KKyAgIHZpcnR1YWwgfnRESU8oKXt9DQorDQorICAgdmlydHVhbCB0U3lzdGVtSW50ZXJmYWNlKiBnZXRTeXN0ZW1JbnRlcmZhY2UoKSA9IDA7DQorICAgc3RhdGljIHRESU8qIGNyZWF0ZSh1bnNpZ25lZCBjaGFyIHN5c19pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIGdldFN5c3RlbUluZGV4KCkgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtU3lzdGVtcyA9IDIsDQorICAgfSB0SWZhY2VDb25zdGFudHM7DQorDQorICAgdHlwZWRlZg0KKyAgIHVuaW9uew0KKyAgICAgIHN0cnVjdHsNCisjaWZkZWYgX192eHdvcmtzDQorICAgICAgICAgdW5zaWduZWQgUGVyaW9kIDogMTY7DQorICAgICAgICAgdW5zaWduZWQgTWluSGlnaCA6IDE2Ow0KKyNlbHNlDQorICAgICAgICAgdW5zaWduZWQgTWluSGlnaCA6IDE2Ow0KKyAgICAgICAgIHVuc2lnbmVkIFBlcmlvZCA6IDE2Ow0KKyNlbmRpZg0KKyAgICAgIH07DQorICAgICAgc3RydWN0ew0KKyAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMzI7DQorICAgICAgfTsNCisgICB9IHRQV01Db25maWc7DQorICAgdHlwZWRlZg0KKyAgIHVuaW9uew0KKyAgICAgIHN0cnVjdHsNCisjaWZkZWYgX192eHdvcmtzDQorICAgICAgICAgdW5zaWduZWQgUmVsYXlGd2QgOiA4Ow0KKyAgICAgICAgIHVuc2lnbmVkIFJlbGF5UmV2IDogODsNCisgICAgICAgICB1bnNpZ25lZCBJMkNIZWFkZXIgOiA0Ow0KKyNlbHNlDQorICAgICAgICAgdW5zaWduZWQgSTJDSGVhZGVyIDogNDsNCisgICAgICAgICB1bnNpZ25lZCBSZWxheVJldiA6IDg7DQorICAgICAgICAgdW5zaWduZWQgUmVsYXlGd2QgOiA4Ow0KKyNlbmRpZg0KKyAgICAgIH07DQorICAgICAgc3RydWN0ew0KKyAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMjA7DQorICAgICAgfTsNCisgICB9IHRTbG93VmFsdWU7DQorICAgdHlwZWRlZg0KKyAgIHVuaW9uew0KKyAgICAgIHN0cnVjdHsNCisjaWZkZWYgX192eHdvcmtzDQorICAgICAgICAgdW5zaWduZWQgVHJhbnNhY3Rpb24gOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIERvbmUgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEFib3J0ZWQgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIERhdGFSZWNlaXZlZEhpZ2ggOiAyNDsNCisjZWxzZQ0KKyAgICAgICAgIHVuc2lnbmVkIERhdGFSZWNlaXZlZEhpZ2ggOiAyNDsNCisgICAgICAgICB1bnNpZ25lZCBBYm9ydGVkIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBEb25lIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBUcmFuc2FjdGlvbiA6IDE7DQorI2VuZGlmDQorICAgICAgfTsNCisgICAgICBzdHJ1Y3R7DQorICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiAyNzsNCisgICAgICB9Ow0KKyAgIH0gdEkyQ1N0YXR1czsNCisgICB0eXBlZGVmDQorICAgdW5pb257DQorICAgICAgc3RydWN0ew0KKyNpZmRlZiBfX3Z4d29ya3MNCisgICAgICAgICB1bnNpZ25lZCBBZGRyZXNzIDogODsNCisgICAgICAgICB1bnNpZ25lZCBCeXRlc1RvUmVhZCA6IDM7DQorICAgICAgICAgdW5zaWduZWQgQnl0ZXNUb1dyaXRlIDogMzsNCisgICAgICAgICB1bnNpZ25lZCBEYXRhVG9TZW5kSGlnaCA6IDE2Ow0KKyAgICAgICAgIHVuc2lnbmVkIEJpdHdpc2VIYW5kc2hha2UgOiAxOw0KKyNlbHNlDQorICAgICAgICAgdW5zaWduZWQgQml0d2lzZUhhbmRzaGFrZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRGF0YVRvU2VuZEhpZ2ggOiAxNjsNCisgICAgICAgICB1bnNpZ25lZCBCeXRlc1RvV3JpdGUgOiAzOw0KKyAgICAgICAgIHVuc2lnbmVkIEJ5dGVzVG9SZWFkIDogMzsNCisgICAgICAgICB1bnNpZ25lZCBBZGRyZXNzIDogODsNCisjZW5kaWYNCisgICAgICB9Ow0KKyAgICAgIHN0cnVjdHsNCisgICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDMxOw0KKyAgICAgIH07DQorICAgfSB0STJDQ29uZmlnOw0KKyAgIHR5cGVkZWYNCisgICB1bmlvbnsNCisgICAgICBzdHJ1Y3R7DQorI2lmZGVmIF9fdnh3b3Jrcw0KKyAgICAgICAgIHVuc2lnbmVkIFBlcmlvZFBvd2VyIDogNDsNCisgICAgICAgICB1bnNpZ25lZCBPdXRwdXRTZWxlY3RfMCA6IDQ7DQorICAgICAgICAgdW5zaWduZWQgT3V0cHV0U2VsZWN0XzEgOiA0Ow0KKyAgICAgICAgIHVuc2lnbmVkIE91dHB1dFNlbGVjdF8yIDogNDsNCisgICAgICAgICB1bnNpZ25lZCBPdXRwdXRTZWxlY3RfMyA6IDQ7DQorI2Vsc2UNCisgICAgICAgICB1bnNpZ25lZCBPdXRwdXRTZWxlY3RfMyA6IDQ7DQorICAgICAgICAgdW5zaWduZWQgT3V0cHV0U2VsZWN0XzIgOiA0Ow0KKyAgICAgICAgIHVuc2lnbmVkIE91dHB1dFNlbGVjdF8xIDogNDsNCisgICAgICAgICB1bnNpZ25lZCBPdXRwdXRTZWxlY3RfMCA6IDQ7DQorICAgICAgICAgdW5zaWduZWQgUGVyaW9kUG93ZXIgOiA0Ow0KKyNlbmRpZg0KKyAgICAgIH07DQorICAgICAgc3RydWN0ew0KKyAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMjA7DQorICAgICAgfTsNCisgICB9IHRET19QV01Db25maWc7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1GaWx0ZXJTZWxlY3RFbGVtZW50cyA9IDE2LA0KKyAgIH0gdEZpbHRlclNlbGVjdF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVGaWx0ZXJTZWxlY3QodW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkRmlsdGVyU2VsZWN0KHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0STJDRGF0YVRvU2VuZF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVJMkNEYXRhVG9TZW5kKHVuc2lnbmVkIGludCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJlYWRJMkNEYXRhVG9TZW5kKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0RE9fSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlRE8odW5zaWduZWQgc2hvcnQgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IHJlYWRETyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1GaWx0ZXJQZXJpb2RFbGVtZW50cyA9IDMsDQorICAgfSB0RmlsdGVyUGVyaW9kX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUZpbHRlclBlcmlvZCh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRGaWx0ZXJQZXJpb2QodW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRPdXRwdXRFbmFibGVfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlT3V0cHV0RW5hYmxlKHVuc2lnbmVkIHNob3J0IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkT3V0cHV0RW5hYmxlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0UHVsc2VfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlUHVsc2UodW5zaWduZWQgc2hvcnQgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IHJlYWRQdWxzZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFNsb3dWYWx1ZV9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVTbG93VmFsdWUodFNsb3dWYWx1ZSB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVNsb3dWYWx1ZV9SZWxheUZ3ZCh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlU2xvd1ZhbHVlX1JlbGF5UmV2KHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVTbG93VmFsdWVfSTJDSGVhZGVyKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHRTbG93VmFsdWUgcmVhZFNsb3dWYWx1ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRTbG93VmFsdWVfUmVsYXlGd2QodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkU2xvd1ZhbHVlX1JlbGF5UmV2KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZFNsb3dWYWx1ZV9JMkNIZWFkZXIodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRJMkNTdGF0dXNfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB0STJDU3RhdHVzIHJlYWRJMkNTdGF0dXModFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkSTJDU3RhdHVzX1RyYW5zYWN0aW9uKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZEkyQ1N0YXR1c19Eb25lKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZEkyQ1N0YXR1c19BYm9ydGVkKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGludCByZWFkSTJDU3RhdHVzX0RhdGFSZWNlaXZlZEhpZ2godFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRJMkNEYXRhUmVjZWl2ZWRfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcmVhZEkyQ0RhdGFSZWNlaXZlZCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdERJX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZERJKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0UHVsc2VMZW5ndGhfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlUHVsc2VMZW5ndGgodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkUHVsc2VMZW5ndGgodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtUFdNUGVyaW9kU2NhbGVFbGVtZW50cyA9IDEwLA0KKyAgIH0gdFBXTVBlcmlvZFNjYWxlX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVBXTVBlcmlvZFNjYWxlKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZFBXTVBlcmlvZFNjYWxlKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bURPX1BXTUR1dHlDeWNsZUVsZW1lbnRzID0gNCwNCisgICB9IHRET19QV01EdXR5Q3ljbGVfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlRE9fUFdNRHV0eUN5Y2xlKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZERPX1BXTUR1dHlDeWNsZSh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdEJGTF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVCRkwoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQkZMKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0STJDQ29uZmlnX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUkyQ0NvbmZpZyh0STJDQ29uZmlnIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlSTJDQ29uZmlnX0FkZHJlc3ModW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUkyQ0NvbmZpZ19CeXRlc1RvUmVhZCh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlSTJDQ29uZmlnX0J5dGVzVG9Xcml0ZSh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlSTJDQ29uZmlnX0RhdGFUb1NlbmRIaWdoKHVuc2lnbmVkIHNob3J0IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlSTJDQ29uZmlnX0JpdHdpc2VIYW5kc2hha2UoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdEkyQ0NvbmZpZyByZWFkSTJDQ29uZmlnKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZEkyQ0NvbmZpZ19BZGRyZXNzKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZEkyQ0NvbmZpZ19CeXRlc1RvUmVhZCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRJMkNDb25maWdfQnl0ZXNUb1dyaXRlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IHJlYWRJMkNDb25maWdfRGF0YVRvU2VuZEhpZ2godFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkSTJDQ29uZmlnX0JpdHdpc2VIYW5kc2hha2UodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRET19QV01Db25maWdfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlRE9fUFdNQ29uZmlnKHRET19QV01Db25maWcgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVET19QV01Db25maWdfUGVyaW9kUG93ZXIodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZURPX1BXTUNvbmZpZ19PdXRwdXRTZWxlY3RfMCh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlRE9fUFdNQ29uZmlnX091dHB1dFNlbGVjdF8xKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVET19QV01Db25maWdfT3V0cHV0U2VsZWN0XzIodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZURPX1BXTUNvbmZpZ19PdXRwdXRTZWxlY3RfMyh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB0RE9fUFdNQ29uZmlnIHJlYWRET19QV01Db25maWcodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkRE9fUFdNQ29uZmlnX1BlcmlvZFBvd2VyKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZERPX1BXTUNvbmZpZ19PdXRwdXRTZWxlY3RfMCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRET19QV01Db25maWdfT3V0cHV0U2VsZWN0XzEodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkRE9fUFdNQ29uZmlnX091dHB1dFNlbGVjdF8yKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZERPX1BXTUNvbmZpZ19PdXRwdXRTZWxlY3RfMyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdEkyQ1N0YXJ0X0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCBzdHJvYmVJMkNTdGFydCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdExvb3BUaW1pbmdfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkTG9vcFRpbWluZyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFBXTUNvbmZpZ19JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVQV01Db25maWcodFBXTUNvbmZpZyB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVBXTUNvbmZpZ19QZXJpb2QodW5zaWduZWQgc2hvcnQgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVQV01Db25maWdfTWluSGlnaCh1bnNpZ25lZCBzaG9ydCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdFBXTUNvbmZpZyByZWFkUFdNQ29uZmlnKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IHJlYWRQV01Db25maWdfUGVyaW9kKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IHJlYWRQV01Db25maWdfTWluSGlnaCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1QV01WYWx1ZVJlZ2lzdGVycyA9IDEwLA0KKyAgIH0gdFBXTVZhbHVlX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVBXTVZhbHVlKHVuc2lnbmVkIGNoYXIgcmVnX2luZGV4LCB1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRQV01WYWx1ZSh1bnNpZ25lZCBjaGFyIHJlZ19pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKw0KK3ByaXZhdGU6DQorICAgdERJTyhjb25zdCB0RElPJik7DQorICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgdERJTyYpOw0KK307DQorDQorfQ0KK30NCisNCisjZW5kaWYgLy8gX19uRlJDXzIwMTJfMV82XzRfRElPX2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJ1bnRpbWVGUEdBTmFtZXNwYWNlL3RETUEuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJ1bnRpbWVGUEdBTmFtZXNwYWNlL3RETUEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDZlYzYwCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUnVudGltZUZQR0FOYW1lc3BhY2UvdERNQS5oCkBAIC0wLDAgKzEsMTg4IEBACisvLyBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKy8vIERvIE5vdCBFZGl0Li4uIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQhDQorDQorI2lmbmRlZiBfX25GUkNfMjAxMl8xXzZfNF9ETUFfaF9fDQorI2RlZmluZSBfX25GUkNfMjAxMl8xXzZfNF9ETUFfaF9fDQorDQorI2luY2x1ZGUgInRTeXN0ZW1JbnRlcmZhY2UuaCINCisNCituYW1lc3BhY2UgbkZQR0ENCit7DQorbmFtZXNwYWNlIG5GUkNfMjAxMl8xXzZfNA0KK3sNCisNCitjbGFzcyB0RE1BDQorew0KK3B1YmxpYzoNCisgICB0RE1BKCl7fQ0KKyAgIHZpcnR1YWwgfnRETUEoKXt9DQorDQorICAgdmlydHVhbCB0U3lzdGVtSW50ZXJmYWNlKiBnZXRTeXN0ZW1JbnRlcmZhY2UoKSA9IDA7DQorICAgc3RhdGljIHRETUEqIGNyZWF0ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bVN5c3RlbXMgPSAxLA0KKyAgIH0gdElmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHR5cGVkZWYNCisgICB1bmlvbnsNCisgICAgICBzdHJ1Y3R7DQorI2lmZGVmIF9fdnh3b3Jrcw0KKyAgICAgICAgIHVuc2lnbmVkIFBhdXNlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfQUkwX0xvdyA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0FJMF9IaWdoIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfQUlBdmVyYWdlZDBfTG93IDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfQUlBdmVyYWdlZDBfSGlnaCA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0FJMV9Mb3cgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9BSTFfSGlnaCA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0FJQXZlcmFnZWQxX0xvdyA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0FJQXZlcmFnZWQxX0hpZ2ggOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9BY2N1bXVsYXRvcjAgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9BY2N1bXVsYXRvcjEgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9ESSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0FuYWxvZ1RyaWdnZXJzIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfQ291bnRlcnNfTG93IDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfQ291bnRlcnNfSGlnaCA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0NvdW50ZXJUaW1lcnNfTG93IDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfQ291bnRlclRpbWVyc19IaWdoIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfRW5jb2RlcnMgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9FbmNvZGVyVGltZXJzIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFeHRlcm5hbENsb2NrIDogMTsNCisjZWxzZQ0KKyAgICAgICAgIHVuc2lnbmVkIEV4dGVybmFsQ2xvY2sgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9FbmNvZGVyVGltZXJzIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfRW5jb2RlcnMgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9Db3VudGVyVGltZXJzX0hpZ2ggOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9Db3VudGVyVGltZXJzX0xvdyA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0NvdW50ZXJzX0hpZ2ggOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9Db3VudGVyc19Mb3cgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9BbmFsb2dUcmlnZ2VycyA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0RJIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfQWNjdW11bGF0b3IxIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfQWNjdW11bGF0b3IwIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfQUlBdmVyYWdlZDFfSGlnaCA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0FJQXZlcmFnZWQxX0xvdyA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0FJMV9IaWdoIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfQUkxX0xvdyA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0FJQXZlcmFnZWQwX0hpZ2ggOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9BSUF2ZXJhZ2VkMF9Mb3cgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9BSTBfSGlnaCA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0FJMF9Mb3cgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIFBhdXNlIDogMTsNCisjZW5kaWYNCisgICAgICB9Ow0KKyAgICAgIHN0cnVjdHsNCisgICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDIwOw0KKyAgICAgIH07DQorICAgfSB0Q29uZmlnOw0KKyAgIHR5cGVkZWYNCisgICB1bmlvbnsNCisgICAgICBzdHJ1Y3R7DQorI2lmZGVmIF9fdnh3b3Jrcw0KKyAgICAgICAgIHVuc2lnbmVkIEV4dGVybmFsQ2xvY2tTb3VyY2VfQ2hhbm5lbCA6IDQ7DQorICAgICAgICAgdW5zaWduZWQgRXh0ZXJuYWxDbG9ja1NvdXJjZV9Nb2R1bGUgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEV4dGVybmFsQ2xvY2tTb3VyY2VfQW5hbG9nVHJpZ2dlciA6IDE7DQorICAgICAgICAgdW5zaWduZWQgUmlzaW5nRWRnZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRmFsbGluZ0VkZ2UgOiAxOw0KKyNlbHNlDQorICAgICAgICAgdW5zaWduZWQgRmFsbGluZ0VkZ2UgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIFJpc2luZ0VkZ2UgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEV4dGVybmFsQ2xvY2tTb3VyY2VfQW5hbG9nVHJpZ2dlciA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRXh0ZXJuYWxDbG9ja1NvdXJjZV9Nb2R1bGUgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEV4dGVybmFsQ2xvY2tTb3VyY2VfQ2hhbm5lbCA6IDQ7DQorI2VuZGlmDQorICAgICAgfTsNCisgICAgICBzdHJ1Y3R7DQorICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiA4Ow0KKyAgICAgIH07DQorICAgfSB0RXh0ZXJuYWxUcmlnZ2VyczsNCisNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0UmF0ZV9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVSYXRlKHVuc2lnbmVkIGludCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJlYWRSYXRlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0Q29uZmlnX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZyh0Q29uZmlnIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX1BhdXNlKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRW5hYmxlX0FJMF9Mb3coYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19FbmFibGVfQUkwX0hpZ2goYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19FbmFibGVfQUlBdmVyYWdlZDBfTG93KGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRW5hYmxlX0FJQXZlcmFnZWQwX0hpZ2goYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19FbmFibGVfQUkxX0xvdyhib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0VuYWJsZV9BSTFfSGlnaChib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0VuYWJsZV9BSUF2ZXJhZ2VkMV9Mb3coYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19FbmFibGVfQUlBdmVyYWdlZDFfSGlnaChib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0VuYWJsZV9BY2N1bXVsYXRvcjAoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19FbmFibGVfQWNjdW11bGF0b3IxKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRW5hYmxlX0RJKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRW5hYmxlX0FuYWxvZ1RyaWdnZXJzKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRW5hYmxlX0NvdW50ZXJzX0xvdyhib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0VuYWJsZV9Db3VudGVyc19IaWdoKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRW5hYmxlX0NvdW50ZXJUaW1lcnNfTG93KGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRW5hYmxlX0NvdW50ZXJUaW1lcnNfSGlnaChib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0VuYWJsZV9FbmNvZGVycyhib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0VuYWJsZV9FbmNvZGVyVGltZXJzKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRXh0ZXJuYWxDbG9jayhib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB0Q29uZmlnIHJlYWRDb25maWcodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX1BhdXNlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19FbmFibGVfQUkwX0xvdyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRW5hYmxlX0FJMF9IaWdoKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19FbmFibGVfQUlBdmVyYWdlZDBfTG93KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19FbmFibGVfQUlBdmVyYWdlZDBfSGlnaCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRW5hYmxlX0FJMV9Mb3codFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0VuYWJsZV9BSTFfSGlnaCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRW5hYmxlX0FJQXZlcmFnZWQxX0xvdyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRW5hYmxlX0FJQXZlcmFnZWQxX0hpZ2godFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0VuYWJsZV9BY2N1bXVsYXRvcjAodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0VuYWJsZV9BY2N1bXVsYXRvcjEodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0VuYWJsZV9ESSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRW5hYmxlX0FuYWxvZ1RyaWdnZXJzKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19FbmFibGVfQ291bnRlcnNfTG93KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19FbmFibGVfQ291bnRlcnNfSGlnaCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRW5hYmxlX0NvdW50ZXJUaW1lcnNfTG93KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19FbmFibGVfQ291bnRlclRpbWVyc19IaWdoKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19FbmFibGVfRW5jb2RlcnModFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0VuYWJsZV9FbmNvZGVyVGltZXJzKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19FeHRlcm5hbENsb2NrKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bUV4dGVybmFsVHJpZ2dlcnNFbGVtZW50cyA9IDQsDQorICAgfSB0RXh0ZXJuYWxUcmlnZ2Vyc19JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVFeHRlcm5hbFRyaWdnZXJzKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRFeHRlcm5hbFRyaWdnZXJzIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlRXh0ZXJuYWxUcmlnZ2Vyc19FeHRlcm5hbENsb2NrU291cmNlX0NoYW5uZWwodW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUV4dGVybmFsVHJpZ2dlcnNfRXh0ZXJuYWxDbG9ja1NvdXJjZV9Nb2R1bGUodW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUV4dGVybmFsVHJpZ2dlcnNfRXh0ZXJuYWxDbG9ja1NvdXJjZV9BbmFsb2dUcmlnZ2VyKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVFeHRlcm5hbFRyaWdnZXJzX1Jpc2luZ0VkZ2UodW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUV4dGVybmFsVHJpZ2dlcnNfRmFsbGluZ0VkZ2UodW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdEV4dGVybmFsVHJpZ2dlcnMgcmVhZEV4dGVybmFsVHJpZ2dlcnModW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkRXh0ZXJuYWxUcmlnZ2Vyc19FeHRlcm5hbENsb2NrU291cmNlX0NoYW5uZWwodW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkRXh0ZXJuYWxUcmlnZ2Vyc19FeHRlcm5hbENsb2NrU291cmNlX01vZHVsZSh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRFeHRlcm5hbFRyaWdnZXJzX0V4dGVybmFsQ2xvY2tTb3VyY2VfQW5hbG9nVHJpZ2dlcih1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRFeHRlcm5hbFRyaWdnZXJzX1Jpc2luZ0VkZ2UodW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkRXh0ZXJuYWxUcmlnZ2Vyc19GYWxsaW5nRWRnZSh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorDQorDQorcHJpdmF0ZToNCisgICB0RE1BKGNvbnN0IHRETUEmKTsNCisgICB2b2lkIG9wZXJhdG9yPShjb25zdCB0RE1BJik7DQorfTsNCisNCit9DQorfQ0KKw0KKyNlbmRpZiAvLyBfX25GUkNfMjAxMl8xXzZfNF9ETUFfaF9fDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUnVudGltZUZQR0FOYW1lc3BhY2UvdEVuY29kZXIuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJ1bnRpbWVGUEdBTmFtZXNwYWNlL3RFbmNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI1NTkyMAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJ1bnRpbWVGUEdBTmFtZXNwYWNlL3RFbmNvZGVyLmgKQEAgLTAsMCArMSwxOTkgQEAKKy8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorLy8gRG8gTm90IEVkaXQuLi4gdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCENCisNCisjaWZuZGVmIF9fbkZSQ18yMDEyXzFfNl80X0VuY29kZXJfaF9fDQorI2RlZmluZSBfX25GUkNfMjAxMl8xXzZfNF9FbmNvZGVyX2hfXw0KKw0KKyNpbmNsdWRlICJ0U3lzdGVtSW50ZXJmYWNlLmgiDQorDQorbmFtZXNwYWNlIG5GUEdBDQorew0KK25hbWVzcGFjZSBuRlJDXzIwMTJfMV82XzQNCit7DQorDQorY2xhc3MgdEVuY29kZXINCit7DQorcHVibGljOg0KKyAgIHRFbmNvZGVyKCl7fQ0KKyAgIHZpcnR1YWwgfnRFbmNvZGVyKCl7fQ0KKw0KKyAgIHZpcnR1YWwgdFN5c3RlbUludGVyZmFjZSogZ2V0U3lzdGVtSW50ZXJmYWNlKCkgPSAwOw0KKyAgIHN0YXRpYyB0RW5jb2RlciogY3JlYXRlKHVuc2lnbmVkIGNoYXIgc3lzX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgZ2V0U3lzdGVtSW5kZXgoKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1TeXN0ZW1zID0gNCwNCisgICB9IHRJZmFjZUNvbnN0YW50czsNCisNCisgICB0eXBlZGVmDQorICAgdW5pb257DQorICAgICAgc3RydWN0ew0KKyNpZmRlZiBfX3Z4d29ya3MNCisgICAgICAgICB1bnNpZ25lZCBEaXJlY3Rpb24gOiAxOw0KKyAgICAgICAgIHNpZ25lZCBWYWx1ZSA6IDMxOw0KKyNlbHNlDQorICAgICAgICAgc2lnbmVkIFZhbHVlIDogMzE7DQorICAgICAgICAgdW5zaWduZWQgRGlyZWN0aW9uIDogMTsNCisjZW5kaWYNCisgICAgICB9Ow0KKyAgICAgIHN0cnVjdHsNCisgICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDMyOw0KKyAgICAgIH07DQorICAgfSB0T3V0cHV0Ow0KKyAgIHR5cGVkZWYNCisgICB1bmlvbnsNCisgICAgICBzdHJ1Y3R7DQorI2lmZGVmIF9fdnh3b3Jrcw0KKyAgICAgICAgIHVuc2lnbmVkIEFTb3VyY2VfQ2hhbm5lbCA6IDQ7DQorICAgICAgICAgdW5zaWduZWQgQVNvdXJjZV9Nb2R1bGUgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEFTb3VyY2VfQW5hbG9nVHJpZ2dlciA6IDE7DQorICAgICAgICAgdW5zaWduZWQgQlNvdXJjZV9DaGFubmVsIDogNDsNCisgICAgICAgICB1bnNpZ25lZCBCU291cmNlX01vZHVsZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgQlNvdXJjZV9BbmFsb2dUcmlnZ2VyIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBJbmRleFNvdXJjZV9DaGFubmVsIDogNDsNCisgICAgICAgICB1bnNpZ25lZCBJbmRleFNvdXJjZV9Nb2R1bGUgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEluZGV4U291cmNlX0FuYWxvZ1RyaWdnZXIgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEluZGV4QWN0aXZlSGlnaCA6IDE7DQorICAgICAgICAgdW5zaWduZWQgUmV2ZXJzZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlIDogMTsNCisjZWxzZQ0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgUmV2ZXJzZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgSW5kZXhBY3RpdmVIaWdoIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBJbmRleFNvdXJjZV9BbmFsb2dUcmlnZ2VyIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBJbmRleFNvdXJjZV9Nb2R1bGUgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEluZGV4U291cmNlX0NoYW5uZWwgOiA0Ow0KKyAgICAgICAgIHVuc2lnbmVkIEJTb3VyY2VfQW5hbG9nVHJpZ2dlciA6IDE7DQorICAgICAgICAgdW5zaWduZWQgQlNvdXJjZV9Nb2R1bGUgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEJTb3VyY2VfQ2hhbm5lbCA6IDQ7DQorICAgICAgICAgdW5zaWduZWQgQVNvdXJjZV9BbmFsb2dUcmlnZ2VyIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBBU291cmNlX01vZHVsZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgQVNvdXJjZV9DaGFubmVsIDogNDsNCisjZW5kaWYNCisgICAgICB9Ow0KKyAgICAgIHN0cnVjdHsNCisgICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDIxOw0KKyAgICAgIH07DQorICAgfSB0Q29uZmlnOw0KKyAgIHR5cGVkZWYNCisgICB1bmlvbnsNCisgICAgICBzdHJ1Y3R7DQorI2lmZGVmIF9fdnh3b3Jrcw0KKyAgICAgICAgIHVuc2lnbmVkIFBlcmlvZCA6IDIzOw0KKyAgICAgICAgIHNpZ25lZCBDb3VudCA6IDg7DQorICAgICAgICAgdW5zaWduZWQgU3RhbGxlZCA6IDE7DQorI2Vsc2UNCisgICAgICAgICB1bnNpZ25lZCBTdGFsbGVkIDogMTsNCisgICAgICAgICBzaWduZWQgQ291bnQgOiA4Ow0KKyAgICAgICAgIHVuc2lnbmVkIFBlcmlvZCA6IDIzOw0KKyNlbmRpZg0KKyAgICAgIH07DQorICAgICAgc3RydWN0ew0KKyAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMzI7DQorICAgICAgfTsNCisgICB9IHRUaW1lck91dHB1dDsNCisgICB0eXBlZGVmDQorICAgdW5pb257DQorICAgICAgc3RydWN0ew0KKyNpZmRlZiBfX3Z4d29ya3MNCisgICAgICAgICB1bnNpZ25lZCBTdGFsbFBlcmlvZCA6IDI0Ow0KKyAgICAgICAgIHVuc2lnbmVkIEF2ZXJhZ2VTaXplIDogNzsNCisgICAgICAgICB1bnNpZ25lZCBVcGRhdGVXaGVuRW1wdHkgOiAxOw0KKyNlbHNlDQorICAgICAgICAgdW5zaWduZWQgVXBkYXRlV2hlbkVtcHR5IDogMTsNCisgICAgICAgICB1bnNpZ25lZCBBdmVyYWdlU2l6ZSA6IDc7DQorICAgICAgICAgdW5zaWduZWQgU3RhbGxQZXJpb2QgOiAyNDsNCisjZW5kaWYNCisgICAgICB9Ow0KKyAgICAgIHN0cnVjdHsNCisgICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDMyOw0KKyAgICAgIH07DQorICAgfSB0VGltZXJDb25maWc7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdE91dHB1dF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHRPdXRwdXQgcmVhZE91dHB1dCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRPdXRwdXRfRGlyZWN0aW9uKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHNpZ25lZCBpbnQgcmVhZE91dHB1dF9WYWx1ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdENvbmZpZ19JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWcodENvbmZpZyB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19BU291cmNlX0NoYW5uZWwodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19BU291cmNlX01vZHVsZSh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0FTb3VyY2VfQW5hbG9nVHJpZ2dlcihib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0JTb3VyY2VfQ2hhbm5lbCh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0JTb3VyY2VfTW9kdWxlKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfQlNvdXJjZV9BbmFsb2dUcmlnZ2VyKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfSW5kZXhTb3VyY2VfQ2hhbm5lbCh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0luZGV4U291cmNlX01vZHVsZSh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0luZGV4U291cmNlX0FuYWxvZ1RyaWdnZXIoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19JbmRleEFjdGl2ZUhpZ2goYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19SZXZlcnNlKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRW5hYmxlKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHRDb25maWcgcmVhZENvbmZpZyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRDb25maWdfQVNvdXJjZV9DaGFubmVsKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZENvbmZpZ19BU291cmNlX01vZHVsZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfQVNvdXJjZV9BbmFsb2dUcmlnZ2VyKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZENvbmZpZ19CU291cmNlX0NoYW5uZWwodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ29uZmlnX0JTb3VyY2VfTW9kdWxlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19CU291cmNlX0FuYWxvZ1RyaWdnZXIodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ29uZmlnX0luZGV4U291cmNlX0NoYW5uZWwodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ29uZmlnX0luZGV4U291cmNlX01vZHVsZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfSW5kZXhTb3VyY2VfQW5hbG9nVHJpZ2dlcih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfSW5kZXhBY3RpdmVIaWdoKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19SZXZlcnNlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19FbmFibGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRUaW1lck91dHB1dF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHRUaW1lck91dHB1dCByZWFkVGltZXJPdXRwdXQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJlYWRUaW1lck91dHB1dF9QZXJpb2QodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgc2lnbmVkIGNoYXIgcmVhZFRpbWVyT3V0cHV0X0NvdW50KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZFRpbWVyT3V0cHV0X1N0YWxsZWQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRSZXNldF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgc3Ryb2JlUmVzZXQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRUaW1lckNvbmZpZ19JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVUaW1lckNvbmZpZyh0VGltZXJDb25maWcgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVUaW1lckNvbmZpZ19TdGFsbFBlcmlvZCh1bnNpZ25lZCBpbnQgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVUaW1lckNvbmZpZ19BdmVyYWdlU2l6ZSh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlVGltZXJDb25maWdfVXBkYXRlV2hlbkVtcHR5KGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHRUaW1lckNvbmZpZyByZWFkVGltZXJDb25maWcodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJlYWRUaW1lckNvbmZpZ19TdGFsbFBlcmlvZCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRUaW1lckNvbmZpZ19BdmVyYWdlU2l6ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRUaW1lckNvbmZpZ19VcGRhdGVXaGVuRW1wdHkodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKw0KKw0KKw0KK3ByaXZhdGU6DQorICAgdEVuY29kZXIoY29uc3QgdEVuY29kZXImKTsNCisgICB2b2lkIG9wZXJhdG9yPShjb25zdCB0RW5jb2RlciYpOw0KK307DQorDQorfQ0KK30NCisNCisjZW5kaWYgLy8gX19uRlJDXzIwMTJfMV82XzRfRW5jb2Rlcl9oX18NCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25SdW50aW1lRlBHQU5hbWVzcGFjZS90R2xvYmFsLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25SdW50aW1lRlBHQU5hbWVzcGFjZS90R2xvYmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc4MmYzNQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJ1bnRpbWVGUEdBTmFtZXNwYWNlL3RHbG9iYWwuaApAQCAtMCwwICsxLDcwIEBACisvLyBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKy8vIERvIE5vdCBFZGl0Li4uIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQhDQorDQorI2lmbmRlZiBfX25GUkNfMjAxMl8xXzZfNF9HbG9iYWxfaF9fDQorI2RlZmluZSBfX25GUkNfMjAxMl8xXzZfNF9HbG9iYWxfaF9fDQorDQorI2luY2x1ZGUgInRTeXN0ZW1JbnRlcmZhY2UuaCINCisNCituYW1lc3BhY2UgbkZQR0ENCit7DQorbmFtZXNwYWNlIG5GUkNfMjAxMl8xXzZfNA0KK3sNCisNCitjbGFzcyB0R2xvYmFsDQorew0KK3B1YmxpYzoNCisgICB0R2xvYmFsKCl7fQ0KKyAgIHZpcnR1YWwgfnRHbG9iYWwoKXt9DQorDQorICAgdmlydHVhbCB0U3lzdGVtSW50ZXJmYWNlKiBnZXRTeXN0ZW1JbnRlcmZhY2UoKSA9IDA7DQorICAgc3RhdGljIHRHbG9iYWwqIGNyZWF0ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bVN5c3RlbXMgPSAxLA0KKyAgIH0gdElmYWNlQ29uc3RhbnRzOw0KKw0KKw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRWZXJzaW9uX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZFZlcnNpb24odFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRMb2NhbFRpbWVfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcmVhZExvY2FsVGltZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdEZQR0FfTEVEX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUZQR0FfTEVEKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZEZQR0FfTEVEKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0UmV2aXNpb25fSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcmVhZFJldmlzaW9uKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisNCisNCitwcml2YXRlOg0KKyAgIHRHbG9iYWwoY29uc3QgdEdsb2JhbCYpOw0KKyAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHRHbG9iYWwmKTsNCit9Ow0KKw0KK30NCit9DQorDQorI2VuZGlmIC8vIF9fbkZSQ18yMDEyXzFfNl80X0dsb2JhbF9oX18NCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25SdW50aW1lRlBHQU5hbWVzcGFjZS90SW50ZXJydXB0LmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25SdW50aW1lRlBHQU5hbWVzcGFjZS90SW50ZXJydXB0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAxODZlNQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJ1bnRpbWVGUEdBTmFtZXNwYWNlL3RJbnRlcnJ1cHQuaApAQCAtMCwwICsxLDkzIEBACisvLyBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKy8vIERvIE5vdCBFZGl0Li4uIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQhDQorDQorI2lmbmRlZiBfX25GUkNfMjAxMl8xXzZfNF9JbnRlcnJ1cHRfaF9fDQorI2RlZmluZSBfX25GUkNfMjAxMl8xXzZfNF9JbnRlcnJ1cHRfaF9fDQorDQorI2luY2x1ZGUgInRTeXN0ZW1JbnRlcmZhY2UuaCINCisNCituYW1lc3BhY2UgbkZQR0ENCit7DQorbmFtZXNwYWNlIG5GUkNfMjAxMl8xXzZfNA0KK3sNCisNCitjbGFzcyB0SW50ZXJydXB0DQorew0KK3B1YmxpYzoNCisgICB0SW50ZXJydXB0KCl7fQ0KKyAgIHZpcnR1YWwgfnRJbnRlcnJ1cHQoKXt9DQorDQorICAgdmlydHVhbCB0U3lzdGVtSW50ZXJmYWNlKiBnZXRTeXN0ZW1JbnRlcmZhY2UoKSA9IDA7DQorICAgc3RhdGljIHRJbnRlcnJ1cHQqIGNyZWF0ZSh1bnNpZ25lZCBjaGFyIHN5c19pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIGdldFN5c3RlbUluZGV4KCkgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtU3lzdGVtcyA9IDgsDQorICAgfSB0SWZhY2VDb25zdGFudHM7DQorDQorICAgdHlwZWRlZg0KKyAgIHVuaW9uew0KKyAgICAgIHN0cnVjdHsNCisjaWZkZWYgX192eHdvcmtzDQorICAgICAgICAgdW5zaWduZWQgU291cmNlX0NoYW5uZWwgOiA0Ow0KKyAgICAgICAgIHVuc2lnbmVkIFNvdXJjZV9Nb2R1bGUgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIFNvdXJjZV9BbmFsb2dUcmlnZ2VyIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBSaXNpbmdFZGdlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBGYWxsaW5nRWRnZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgV2FpdEZvckFjayA6IDE7DQorI2Vsc2UNCisgICAgICAgICB1bnNpZ25lZCBXYWl0Rm9yQWNrIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBGYWxsaW5nRWRnZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgUmlzaW5nRWRnZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgU291cmNlX0FuYWxvZ1RyaWdnZXIgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIFNvdXJjZV9Nb2R1bGUgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIFNvdXJjZV9DaGFubmVsIDogNDsNCisjZW5kaWYNCisgICAgICB9Ow0KKyAgICAgIHN0cnVjdHsNCisgICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDk7DQorICAgICAgfTsNCisgICB9IHRDb25maWc7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFRpbWVTdGFtcF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGludCByZWFkVGltZVN0YW1wKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0Q29uZmlnX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZyh0Q29uZmlnIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX1NvdXJjZV9DaGFubmVsKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfU291cmNlX01vZHVsZSh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX1NvdXJjZV9BbmFsb2dUcmlnZ2VyKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfUmlzaW5nRWRnZShib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0ZhbGxpbmdFZGdlKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfV2FpdEZvckFjayhib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB0Q29uZmlnIHJlYWRDb25maWcodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ29uZmlnX1NvdXJjZV9DaGFubmVsKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZENvbmZpZ19Tb3VyY2VfTW9kdWxlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19Tb3VyY2VfQW5hbG9nVHJpZ2dlcih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfUmlzaW5nRWRnZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRmFsbGluZ0VkZ2UodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX1dhaXRGb3JBY2sodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKw0KKw0KKw0KK3ByaXZhdGU6DQorICAgdEludGVycnVwdChjb25zdCB0SW50ZXJydXB0Jik7DQorICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgdEludGVycnVwdCYpOw0KK307DQorDQorfQ0KK30NCisNCisjZW5kaWYgLy8gX19uRlJDXzIwMTJfMV82XzRfSW50ZXJydXB0X2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJ1bnRpbWVGUEdBTmFtZXNwYWNlL3RTUEkuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJ1bnRpbWVGUEdBTmFtZXNwYWNlL3RTUEkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWMyMDhjCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUnVudGltZUZQR0FOYW1lc3BhY2UvdFNQSS5oCkBAIC0wLDAgKzEsMjI4IEBACisvLyBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKy8vIERvIE5vdCBFZGl0Li4uIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQhDQorDQorI2lmbmRlZiBfX25GUkNfMjAxMl8xXzZfNF9TUElfaF9fDQorI2RlZmluZSBfX25GUkNfMjAxMl8xXzZfNF9TUElfaF9fDQorDQorI2luY2x1ZGUgInRTeXN0ZW1JbnRlcmZhY2UuaCINCisNCituYW1lc3BhY2UgbkZQR0ENCit7DQorbmFtZXNwYWNlIG5GUkNfMjAxMl8xXzZfNA0KK3sNCisNCitjbGFzcyB0U1BJDQorew0KK3B1YmxpYzoNCisgICB0U1BJKCl7fQ0KKyAgIHZpcnR1YWwgfnRTUEkoKXt9DQorDQorICAgdmlydHVhbCB0U3lzdGVtSW50ZXJmYWNlKiBnZXRTeXN0ZW1JbnRlcmZhY2UoKSA9IDA7DQorICAgc3RhdGljIHRTUEkqIGNyZWF0ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bVN5c3RlbXMgPSAxLA0KKyAgIH0gdElmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHR5cGVkZWYNCisgICB1bmlvbnsNCisgICAgICBzdHJ1Y3R7DQorI2lmZGVmIF9fdnh3b3Jrcw0KKyAgICAgICAgIHVuc2lnbmVkIFJlY2VpdmVkRGF0YU92ZXJmbG93IDogMTsNCisgICAgICAgICB1bnNpZ25lZCBJZGxlIDogMTsNCisjZWxzZQ0KKyAgICAgICAgIHVuc2lnbmVkIElkbGUgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIFJlY2VpdmVkRGF0YU92ZXJmbG93IDogMTsNCisjZW5kaWYNCisgICAgICB9Ow0KKyAgICAgIHN0cnVjdHsNCisgICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDI7DQorICAgICAgfTsNCisgICB9IHRTdGF0dXM7DQorICAgdHlwZWRlZg0KKyAgIHVuaW9uew0KKyAgICAgIHN0cnVjdHsNCisjaWZkZWYgX192eHdvcmtzDQorICAgICAgICAgdW5zaWduZWQgQnVzQml0V2lkdGggOiA4Ow0KKyAgICAgICAgIHVuc2lnbmVkIENsb2NrSGFsZlBlcmlvZERlbGF5IDogODsNCisgICAgICAgICB1bnNpZ25lZCBNU0JmaXJzdCA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRGF0YU9uRmFsbGluZyA6IDE7DQorICAgICAgICAgdW5zaWduZWQgTGF0Y2hGaXJzdCA6IDE7DQorICAgICAgICAgdW5zaWduZWQgTGF0Y2hMYXN0IDogMTsNCisgICAgICAgICB1bnNpZ25lZCBGcmFtZVBvbGFyaXR5IDogMTsNCisgICAgICAgICB1bnNpZ25lZCBXcml0ZU9ubHkgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIENsb2NrUG9sYXJpdHkgOiAxOw0KKyNlbHNlDQorICAgICAgICAgdW5zaWduZWQgQ2xvY2tQb2xhcml0eSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgV3JpdGVPbmx5IDogMTsNCisgICAgICAgICB1bnNpZ25lZCBGcmFtZVBvbGFyaXR5IDogMTsNCisgICAgICAgICB1bnNpZ25lZCBMYXRjaExhc3QgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIExhdGNoRmlyc3QgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIERhdGFPbkZhbGxpbmcgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIE1TQmZpcnN0IDogMTsNCisgICAgICAgICB1bnNpZ25lZCBDbG9ja0hhbGZQZXJpb2REZWxheSA6IDg7DQorICAgICAgICAgdW5zaWduZWQgQnVzQml0V2lkdGggOiA4Ow0KKyNlbmRpZg0KKyAgICAgIH07DQorICAgICAgc3RydWN0ew0KKyAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMjM7DQorICAgICAgfTsNCisgICB9IHRDb25maWc7DQorICAgdHlwZWRlZg0KKyAgIHVuaW9uew0KKyAgICAgIHN0cnVjdHsNCisjaWZkZWYgX192eHdvcmtzDQorICAgICAgICAgdW5zaWduZWQgU0NMS19DaGFubmVsIDogNDsNCisgICAgICAgICB1bnNpZ25lZCBTQ0xLX01vZHVsZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgTU9TSV9DaGFubmVsIDogNDsNCisgICAgICAgICB1bnNpZ25lZCBNT1NJX01vZHVsZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgTUlTT19DaGFubmVsIDogNDsNCisgICAgICAgICB1bnNpZ25lZCBNSVNPX01vZHVsZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgU1NfQ2hhbm5lbCA6IDQ7DQorICAgICAgICAgdW5zaWduZWQgU1NfTW9kdWxlIDogMTsNCisjZWxzZQ0KKyAgICAgICAgIHVuc2lnbmVkIFNTX01vZHVsZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgU1NfQ2hhbm5lbCA6IDQ7DQorICAgICAgICAgdW5zaWduZWQgTUlTT19Nb2R1bGUgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIE1JU09fQ2hhbm5lbCA6IDQ7DQorICAgICAgICAgdW5zaWduZWQgTU9TSV9Nb2R1bGUgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIE1PU0lfQ2hhbm5lbCA6IDQ7DQorICAgICAgICAgdW5zaWduZWQgU0NMS19Nb2R1bGUgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIFNDTEtfQ2hhbm5lbCA6IDQ7DQorI2VuZGlmDQorICAgICAgfTsNCisgICAgICBzdHJ1Y3R7DQorICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiAyMDsNCisgICAgICB9Ow0KKyAgIH0gdENoYW5uZWxzOw0KKw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRTdGF0dXNfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB0U3RhdHVzIHJlYWRTdGF0dXModFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkU3RhdHVzX1JlY2VpdmVkRGF0YU92ZXJmbG93KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZFN0YXR1c19JZGxlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0UmVjZWl2ZWREYXRhX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJlYWRSZWNlaXZlZERhdGEodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHREYXRhVG9Mb2FkX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZURhdGFUb0xvYWQodW5zaWduZWQgaW50IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcmVhZERhdGFUb0xvYWQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRDb25maWdfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnKHRDb25maWcgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfQnVzQml0V2lkdGgodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19DbG9ja0hhbGZQZXJpb2REZWxheSh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX01TQmZpcnN0KGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRGF0YU9uRmFsbGluZyhib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0xhdGNoRmlyc3QoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19MYXRjaExhc3QoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19GcmFtZVBvbGFyaXR5KGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfV3JpdGVPbmx5KGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfQ2xvY2tQb2xhcml0eShib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB0Q29uZmlnIHJlYWRDb25maWcodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ29uZmlnX0J1c0JpdFdpZHRoKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZENvbmZpZ19DbG9ja0hhbGZQZXJpb2REZWxheSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfTVNCZmlyc3QodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0RhdGFPbkZhbGxpbmcodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0xhdGNoRmlyc3QodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0xhdGNoTGFzdCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRnJhbWVQb2xhcml0eSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfV3JpdGVPbmx5KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19DbG9ja1BvbGFyaXR5KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0Q2xlYXJSZWNlaXZlZERhdGFfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHN0cm9iZUNsZWFyUmVjZWl2ZWREYXRhKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0UmVjZWl2ZWRFbGVtZW50c19JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IHJlYWRSZWNlaXZlZEVsZW1lbnRzKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0TG9hZF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgc3Ryb2JlTG9hZCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFJlc2V0X0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCBzdHJvYmVSZXNldCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdENoYW5uZWxzX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNoYW5uZWxzKHRDaGFubmVscyB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNoYW5uZWxzX1NDTEtfQ2hhbm5lbCh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ2hhbm5lbHNfU0NMS19Nb2R1bGUodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNoYW5uZWxzX01PU0lfQ2hhbm5lbCh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ2hhbm5lbHNfTU9TSV9Nb2R1bGUodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNoYW5uZWxzX01JU09fQ2hhbm5lbCh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ2hhbm5lbHNfTUlTT19Nb2R1bGUodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNoYW5uZWxzX1NTX0NoYW5uZWwodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNoYW5uZWxzX1NTX01vZHVsZSh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB0Q2hhbm5lbHMgcmVhZENoYW5uZWxzKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZENoYW5uZWxzX1NDTEtfQ2hhbm5lbCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRDaGFubmVsc19TQ0xLX01vZHVsZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRDaGFubmVsc19NT1NJX0NoYW5uZWwodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ2hhbm5lbHNfTU9TSV9Nb2R1bGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ2hhbm5lbHNfTUlTT19DaGFubmVsKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZENoYW5uZWxzX01JU09fTW9kdWxlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZENoYW5uZWxzX1NTX0NoYW5uZWwodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ2hhbm5lbHNfU1NfTW9kdWxlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0QXZhaWxhYmxlVG9Mb2FkX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZEF2YWlsYWJsZVRvTG9hZCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFJlYWRSZWNlaXZlZERhdGFfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHN0cm9iZVJlYWRSZWNlaXZlZERhdGEodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKw0KKw0KK3ByaXZhdGU6DQorICAgdFNQSShjb25zdCB0U1BJJik7DQorICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgdFNQSSYpOw0KK307DQorDQorfQ0KK30NCisNCisjZW5kaWYgLy8gX19uRlJDXzIwMTJfMV82XzRfU1BJX2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJ1bnRpbWVGUEdBTmFtZXNwYWNlL3RTb2xlbm9pZC5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUnVudGltZUZQR0FOYW1lc3BhY2UvdFNvbGVub2lkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYyN2VlYQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJ1bnRpbWVGUEdBTmFtZXNwYWNlL3RTb2xlbm9pZC5oCkBAIC0wLDAgKzEsNTAgQEAKKy8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorLy8gRG8gTm90IEVkaXQuLi4gdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCENCisNCisjaWZuZGVmIF9fbkZSQ18yMDEyXzFfNl80X1NvbGVub2lkX2hfXw0KKyNkZWZpbmUgX19uRlJDXzIwMTJfMV82XzRfU29sZW5vaWRfaF9fDQorDQorI2luY2x1ZGUgInRTeXN0ZW1JbnRlcmZhY2UuaCINCisNCituYW1lc3BhY2UgbkZQR0ENCit7DQorbmFtZXNwYWNlIG5GUkNfMjAxMl8xXzZfNA0KK3sNCisNCitjbGFzcyB0U29sZW5vaWQNCit7DQorcHVibGljOg0KKyAgIHRTb2xlbm9pZCgpe30NCisgICB2aXJ0dWFsIH50U29sZW5vaWQoKXt9DQorDQorICAgdmlydHVhbCB0U3lzdGVtSW50ZXJmYWNlKiBnZXRTeXN0ZW1JbnRlcmZhY2UoKSA9IDA7DQorICAgc3RhdGljIHRTb2xlbm9pZCogY3JlYXRlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtU3lzdGVtcyA9IDEsDQorICAgfSB0SWZhY2VDb25zdGFudHM7DQorDQorDQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1ETzdfMEVsZW1lbnRzID0gMiwNCisgICB9IHRETzdfMF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVETzdfMCh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRETzdfMCh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorDQorDQorcHJpdmF0ZToNCisgICB0U29sZW5vaWQoY29uc3QgdFNvbGVub2lkJik7DQorICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgdFNvbGVub2lkJik7DQorfTsNCisNCit9DQorfQ0KKw0KKyNlbmRpZiAvLyBfX25GUkNfMjAxMl8xXzZfNF9Tb2xlbm9pZF9oX18NCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25SdW50aW1lRlBHQU5hbWVzcGFjZS90U3lzV2F0Y2hkb2cuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJ1bnRpbWVGUEdBTmFtZXNwYWNlL3RTeXNXYXRjaGRvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZjAxZmYKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25SdW50aW1lRlBHQU5hbWVzcGFjZS90U3lzV2F0Y2hkb2cuaApAQCAtMCwwICsxLDcxIEBACisvLyBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKy8vIERvIE5vdCBFZGl0Li4uIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQhDQorDQorI2lmbmRlZiBfX25GUkNfMjAxMl8xXzZfNF9TeXNXYXRjaGRvZ19oX18NCisjZGVmaW5lIF9fbkZSQ18yMDEyXzFfNl80X1N5c1dhdGNoZG9nX2hfXw0KKw0KKyNpbmNsdWRlICJ0U3lzdGVtSW50ZXJmYWNlLmgiDQorDQorbmFtZXNwYWNlIG5GUEdBDQorew0KK25hbWVzcGFjZSBuRlJDXzIwMTJfMV82XzQNCit7DQorDQorY2xhc3MgdFN5c1dhdGNoZG9nDQorew0KK3B1YmxpYzoNCisgICB0U3lzV2F0Y2hkb2coKXt9DQorICAgdmlydHVhbCB+dFN5c1dhdGNoZG9nKCl7fQ0KKw0KKyAgIHZpcnR1YWwgdFN5c3RlbUludGVyZmFjZSogZ2V0U3lzdGVtSW50ZXJmYWNlKCkgPSAwOw0KKyAgIHN0YXRpYyB0U3lzV2F0Y2hkb2cqIGNyZWF0ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bVN5c3RlbXMgPSAxLA0KKyAgIH0gdElmYWNlQ29uc3RhbnRzOw0KKw0KKw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRDb21tYW5kX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbW1hbmQodW5zaWduZWQgc2hvcnQgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IHJlYWRDb21tYW5kKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0Q2hhbGxlbmdlX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ2hhbGxlbmdlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0QWN0aXZlX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUFjdGl2ZShib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRBY3RpdmUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRUaW1lcl9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGludCByZWFkVGltZXIodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKw0KKw0KK3ByaXZhdGU6DQorICAgdFN5c1dhdGNoZG9nKGNvbnN0IHRTeXNXYXRjaGRvZyYpOw0KKyAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHRTeXNXYXRjaGRvZyYpOw0KK307DQorDQorfQ0KK30NCisNCisjZW5kaWYgLy8gX19uRlJDXzIwMTJfMV82XzRfU3lzV2F0Y2hkb2dfaF9fDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUnVudGltZUZQR0FOYW1lc3BhY2UvdFdhdGNoZG9nLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25SdW50aW1lRlBHQU5hbWVzcGFjZS90V2F0Y2hkb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTg5ZWRhCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUnVudGltZUZQR0FOYW1lc3BhY2UvdFdhdGNoZG9nLmgKQEAgLTAsMCArMSwxMDggQEAKKy8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorLy8gRG8gTm90IEVkaXQuLi4gdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCENCisNCisjaWZuZGVmIF9fbkZSQ18yMDEyXzFfNl80X1dhdGNoZG9nX2hfXw0KKyNkZWZpbmUgX19uRlJDXzIwMTJfMV82XzRfV2F0Y2hkb2dfaF9fDQorDQorI2luY2x1ZGUgInRTeXN0ZW1JbnRlcmZhY2UuaCINCisNCituYW1lc3BhY2UgbkZQR0ENCit7DQorbmFtZXNwYWNlIG5GUkNfMjAxMl8xXzZfNA0KK3sNCisNCitjbGFzcyB0V2F0Y2hkb2cNCit7DQorcHVibGljOg0KKyAgIHRXYXRjaGRvZygpe30NCisgICB2aXJ0dWFsIH50V2F0Y2hkb2coKXt9DQorDQorICAgdmlydHVhbCB0U3lzdGVtSW50ZXJmYWNlKiBnZXRTeXN0ZW1JbnRlcmZhY2UoKSA9IDA7DQorICAgc3RhdGljIHRXYXRjaGRvZyogY3JlYXRlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtU3lzdGVtcyA9IDEsDQorICAgfSB0SWZhY2VDb25zdGFudHM7DQorDQorICAgdHlwZWRlZg0KKyAgIHVuaW9uew0KKyAgICAgIHN0cnVjdHsNCisjaWZkZWYgX192eHdvcmtzDQorICAgICAgICAgdW5zaWduZWQgU3lzdGVtQWN0aXZlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBBbGl2ZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgU3lzRGlzYWJsZUNvdW50IDogMTU7DQorICAgICAgICAgdW5zaWduZWQgRGlzYWJsZUNvdW50IDogMTU7DQorI2Vsc2UNCisgICAgICAgICB1bnNpZ25lZCBEaXNhYmxlQ291bnQgOiAxNTsNCisgICAgICAgICB1bnNpZ25lZCBTeXNEaXNhYmxlQ291bnQgOiAxNTsNCisgICAgICAgICB1bnNpZ25lZCBBbGl2ZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgU3lzdGVtQWN0aXZlIDogMTsNCisjZW5kaWYNCisgICAgICB9Ow0KKyAgICAgIHN0cnVjdHsNCisgICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDMyOw0KKyAgICAgIH07DQorICAgfSB0U3RhdHVzOw0KKw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRTdGF0dXNfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB0U3RhdHVzIHJlYWRTdGF0dXModFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkU3RhdHVzX1N5c3RlbUFjdGl2ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRTdGF0dXNfQWxpdmUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZFN0YXR1c19TeXNEaXNhYmxlQ291bnQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZFN0YXR1c19EaXNhYmxlQ291bnQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRLaWxsX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCBzdHJvYmVLaWxsKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0RmVlZF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgc3Ryb2JlRmVlZCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFRpbWVyX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJlYWRUaW1lcih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdEV4cGlyYXRpb25fSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlRXhwaXJhdGlvbih1bnNpZ25lZCBpbnQgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGludCByZWFkRXhwaXJhdGlvbih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdEltbW9ydGFsX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUltbW9ydGFsKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZEltbW9ydGFsKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisNCisNCitwcml2YXRlOg0KKyAgIHRXYXRjaGRvZyhjb25zdCB0V2F0Y2hkb2cmKTsNCisgICB2b2lkIG9wZXJhdG9yPShjb25zdCB0V2F0Y2hkb2cmKTsNCit9Ow0KKw0KK30NCit9DQorDQorI2VuZGlmIC8vIF9fbkZSQ18yMDEyXzFfNl80X1dhdGNoZG9nX2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvcHJpbnRGcGdhVmVyc2lvbi5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9wcmludEZwZ2FWZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg4ZjFkZgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvcHJpbnRGcGdhVmVyc2lvbi5oCkBAIC0wLDAgKzEsNDIgQEAKKy8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorDQorI2lmbmRlZiBfX3ByaW50RlBHQVZlcnNpb25faF9fDQorI2RlZmluZSBfX3ByaW50RlBHQVZlcnNpb25faF9fDQorDQorbmFtZXNwYWNlIG5GUEdBDQorew0KKw0KK3RlbXBsYXRlPHR5cGVuYW1lIHR0R2xvYmFsPg0KK2lubGluZSB2b2lkIHByaW50RlBHQVZlcnNpb24odHRHbG9iYWwgJmdsb2JhbCkNCit7DQorICAgdFJpb1N0YXR1c0NvZGUgY2xlYW5TdGF0dXM9MDsNCisgICB1aW50MzJfdCBoYXJkd2FyZUd1aWRbNF07DQorICAgdFN5c3RlbUludGVyZmFjZSAmc3lzdGVtID0gKmdsb2JhbC5nZXRTeXN0ZW1JbnRlcmZhY2UoKTsNCisgICBzeXN0ZW0uZ2V0SGFyZHdhcmVGcGdhU2lnbmF0dXJlKGhhcmR3YXJlR3VpZCwgJmNsZWFuU3RhdHVzKTsNCisgICBjb25zdCB1aW50MzJfdCAqc29mdHdhcmVHdWlkID0gc3lzdGVtLmdldEV4cGVjdGVkRlBHQVNpZ25hdHVyZSgpOw0KKyAgIHByaW50ZigiRlBHQSBIYXJkd2FyZSBHVUlEOiAweCIpOw0KKyAgIGZvcihpbnQgaT0wOyBpPDQ7IGkrKykNCisgICB7DQorICAgICAgcHJpbnRmKCIlMDhYIiwgaGFyZHdhcmVHdWlkW2ldKTsNCisgICB9DQorICAgcHJpbnRmKCJcbiIpOw0KKyAgIHByaW50ZigiRlBHQSBTb2Z0d2FyZSBHVUlEOiAweCIpOw0KKyAgIGZvcihpbnQgaT0wOyBpPDQ7IGkrKykNCisgICB7DQorICAgICAgcHJpbnRmKCIlMDhYIiwgc29mdHdhcmVHdWlkW2ldKTsNCisgICB9DQorICAgcHJpbnRmKCJcbiIpOw0KKyAgIHVpbnQxNl90IGZwZ2FIYXJkd2FyZVZlcnNpb24gPSBnbG9iYWwucmVhZFZlcnNpb24oJmNsZWFuU3RhdHVzKTsNCisgICB1aW50MTZfdCBmcGdhU29mdHdhcmVWZXJzaW9uID0gc3lzdGVtLmdldEV4cGVjdGVkRlBHQVZlcnNpb24oKTsNCisgICBwcmludGYoIkZQR0EgSGFyZHdhcmUgVmVyc2lvbjogJVhcbiIsIGZwZ2FIYXJkd2FyZVZlcnNpb24pOw0KKyAgIHByaW50ZigiRlBHQSBTb2Z0d2FyZSBWZXJzaW9uOiAlWFxuIiwgZnBnYVNvZnR3YXJlVmVyc2lvbik7DQorICAgdWludDMyX3QgZnBnYUhhcmR3YXJlUmV2aXNpb24gPSBnbG9iYWwucmVhZFJldmlzaW9uKCZjbGVhblN0YXR1cyk7DQorICAgdWludDMyX3QgZnBnYVNvZnR3YXJlUmV2aXNpb24gPSBzeXN0ZW0uZ2V0RXhwZWN0ZWRGUEdBUmV2aXNpb24oKTsNCisgICBwcmludGYoIkZQR0EgSGFyZHdhcmUgUmV2aXNpb246ICVYLiVYLiVYXG4iLCAoZnBnYUhhcmR3YXJlUmV2aXNpb24gPj4gMjApICYgMHhGRkYsIChmcGdhSGFyZHdhcmVSZXZpc2lvbiA+PiAxMikgJiAweEZGLCBmcGdhSGFyZHdhcmVSZXZpc2lvbiAmIDB4RkZGKTsNCisgICBwcmludGYoIkZQR0EgU29mdHdhcmUgUmV2aXNpb246ICVYLiVYLiVYXG4iLCAoZnBnYVNvZnR3YXJlUmV2aXNpb24gPj4gMjApICYgMHhGRkYsIChmcGdhU29mdHdhcmVSZXZpc2lvbiA+PiAxMikgJiAweEZGLCBmcGdhU29mdHdhcmVSZXZpc2lvbiAmIDB4RkZGKTsNCit9DQorDQorfQ0KKw0KKyNlbmRpZiAvLyBfX3ByaW50RlBHQVZlcnNpb25faF9fDQorDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC90RE1BQ2hhbm5lbERlc2NyaXB0b3IuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvdERNQUNoYW5uZWxEZXNjcmlwdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZhNTkzNQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvdERNQUNoYW5uZWxEZXNjcmlwdG9yLmgKQEAgLTAsMCArMSwxNyBAQAorLy8gRGVzY3JpYmVzIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gY29uZmlndXJlIGEgRE1BIGNoYW5uZWwuDQorLy8gQ29weXJpZ2h0IChjKSBOYXRpb25hbCBJbnN0cnVtZW50cyAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCisNCisjaW5jbHVkZSA8c3RkaW50Lmg+DQorDQorI2lmbmRlZiBfX3RETUFDaGFubmVsRGVzY3JpcHRvcl9oX18NCisjZGVmaW5lIF9fdERNQUNoYW5uZWxEZXNjcmlwdG9yX2hfXw0KKw0KK3N0cnVjdCB0RE1BQ2hhbm5lbERlc2NyaXB0b3INCit7DQorICAgdWludDMyX3QgY2hhbm5lbDsNCisgICB1aW50MzJfdCBiYXNlQWRkcmVzczsNCisgICB1aW50MzJfdCBkZXB0aDsNCisgICBib29sIHRhcmdldFRvSG9zdDsNCit9Ow0KKw0KKyNlbmRpZiAvLyBfX3RETUFDaGFubmVsRGVzY3JpcHRvcl9oX18NCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L3RETUFNYW5hZ2VyLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L3RETUFNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I5NTIwMwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvdERNQU1hbmFnZXIuaApAQCAtMCwwICsxLDQxIEBACisvLyBDbGFzcyBmb3IgaGFuZGxpbmcgRE1BIHRyYW5zZmVycy4NCisvLyBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKw0KKyNpZm5kZWYgX190RE1BTWFuYWdlcl9oX18NCisjZGVmaW5lIF9fdERNQU1hbmFnZXJfaF9fDQorDQorI2luY2x1ZGUgInRTeXN0ZW0uaCINCisjaW5jbHVkZSA8c3RkaW50Lmg+DQorDQorbmFtZXNwYWNlIG5GUEdBDQorew0KK2NsYXNzIHRETUFNYW5hZ2VyIDogcHVibGljIHRTeXN0ZW0NCit7DQorcHVibGljOg0KKyAgIHRETUFNYW5hZ2VyKHVpbnQzMl90IGRtYUNoYW5uZWwsIHVpbnQzMl90IGhvc3RCdWZmZXJTaXplLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsNCisgICB+dERNQU1hbmFnZXIoKTsNCisgICB2b2lkIHN0YXJ0KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KKyAgIHZvaWQgc3RvcCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsNCisgICBib29sIGlzU3RhcnRlZCgpIHtyZXR1cm4gX3N0YXJ0ZWQ7fQ0KKyAgIHZvaWQgcmVhZCgNCisgICAgICB1aW50MzJfdCogICAgICBidWYsDQorICAgICAgc2l6ZV90ICAgICAgICAgbnVtLA0KKyAgICAgIHVpbnQzMl90ICAgICAgIHRpbWVvdXQsDQorICAgICAgc2l6ZV90KiAgICAgICAgcmVtYWluaW5nLA0KKyAgICAgIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KKyAgIHZvaWQgd3JpdGUoDQorICAgICAgdWludDMyX3QqICAgICAgYnVmLA0KKyAgICAgIHNpemVfdCAgICAgICAgIG51bSwNCisgICAgICB1aW50MzJfdCAgICAgICB0aW1lb3V0LA0KKyAgICAgIHNpemVfdCogICAgICAgIHJlbWFpbmluZywNCisgICAgICB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsNCitwcml2YXRlOg0KKyAgIGJvb2wgX3N0YXJ0ZWQ7DQorICAgdWludDMyX3QgX2RtYUNoYW5uZWw7DQorICAgdWludDMyX3QgX2hvc3RCdWZmZXJTaXplOw0KKw0KK307DQorDQorfQ0KKw0KKyNlbmRpZiAvLyBfX3RETUFNYW5hZ2VyX2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvdEludGVycnVwdE1hbmFnZXIuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvdEludGVycnVwdE1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjY3ODNkCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC90SW50ZXJydXB0TWFuYWdlci5oCkBAIC0wLDAgKzEsNjEgQEAKKy8vIENsYXNzIGZvciBoYW5kbGluZyBpbnRlcnJ1cHRzLg0KKy8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorDQorI2lmbmRlZiBfX3RJbnRlcnJ1cHRNYW5hZ2VyX2hfXw0KKyNkZWZpbmUgX190SW50ZXJydXB0TWFuYWdlcl9oX18NCisNCisjaW5jbHVkZSAidFN5c3RlbS5oIg0KKw0KK25hbWVzcGFjZSBuaQ0KK3sNCisgICBuYW1lc3BhY2UgZHNjDQorICAgew0KKyAgICAgIG5hbWVzcGFjZSBvc2RlcA0KKyAgICAgIHsNCisgICAgICAgICBjbGFzcyBDcml0aWNhbFNlY3Rpb247DQorICAgICAgfQ0KKyAgIH0NCit9DQorDQorbmFtZXNwYWNlIG5GUEdBDQorew0KKw0KK3R5cGVkZWYgdm9pZCAoKnRJbnRlcnJ1cHRIYW5kbGVyKSh1aW50MzJfdCBpbnRlcnJ1cHRBc3NlcnRlZE1hc2ssIHZvaWQgKnBhcmFtKTsNCisNCitjbGFzcyB0SW50ZXJydXB0TWFuYWdlciA6IHB1YmxpYyB0U3lzdGVtDQorew0KK3B1YmxpYzoNCisgICB0SW50ZXJydXB0TWFuYWdlcih1aW50MzJfdCBpbnRlcnJ1cHRNYXNrLCBib29sIHdhdGNoZXIsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KKyAgIH50SW50ZXJydXB0TWFuYWdlcigpOw0KKyAgIHZvaWQgcmVnaXN0ZXJIYW5kbGVyKHRJbnRlcnJ1cHRIYW5kbGVyIGhhbmRsZXIsIHZvaWQgKnBhcmFtLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsNCisgICB1aW50MzJfdCB3YXRjaChpbnQzMl90IHRpbWVvdXRJbk1zLCBib29sIGlnbm9yZVByZXZpb3VzLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsNCisgICB2b2lkIGVuYWJsZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsNCisgICB2b2lkIGRpc2FibGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7DQorICAgYm9vbCBpc0VuYWJsZWQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7DQorcHJpdmF0ZToNCisgICBjbGFzcyB0SW50ZXJydXB0VGhyZWFkOw0KKyAgIGZyaWVuZCBjbGFzcyB0SW50ZXJydXB0VGhyZWFkOw0KKyAgIHZvaWQgaGFuZGxlcigpOw0KKyAgIHN0YXRpYyBpbnQgaGFuZGxlcldyYXBwZXIodEludGVycnVwdE1hbmFnZXIgKnBJbnRlcnJ1cHQpOw0KKw0KKyAgIHZvaWQgYWNrbm93bGVkZ2UodFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7DQorICAgdm9pZCByZXNlcnZlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KKyAgIHZvaWQgdW5yZXNlcnZlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KKyAgIHRJbnRlcnJ1cHRIYW5kbGVyIF9oYW5kbGVyOw0KKyAgIHVpbnQzMl90IF9pbnRlcnJ1cHRNYXNrOw0KKyAgIHRJbnRlcnJ1cHRUaHJlYWQgKl90aHJlYWQ7DQorICAgTmlGcGdhX0lycUNvbnRleHQgX3Jpb0NvbnRleHQ7DQorICAgYm9vbCBfd2F0Y2hlcjsNCisgICBib29sIF9lbmFibGVkOw0KKyAgIHZvaWQgKl91c2VyUGFyYW07DQorDQorICAgLy8gbWFpbnRhaW4gdGhlIGludGVycnVwdHMgdGhhdCBhcmUgYWxyZWFkeSBkZWFsdCB3aXRoLg0KKyAgIHN0YXRpYyB1aW50MzJfdCBfZ2xvYmFsSW50ZXJydXB0TWFzazsNCisgICBzdGF0aWMgbmk6OmRzYzo6b3NkZXA6OkNyaXRpY2FsU2VjdGlvbiAqX2dsb2JhbEludGVycnVwdE1hc2tTZW1hcGhvcmU7DQorfTsNCisNCit9DQorDQorDQorI2VuZGlmIC8vIF9fdEludGVycnVwdE1hbmFnZXJfaF9fDQorDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC90U3lzdGVtLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L3RTeXN0ZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDU5ZTUxCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC90U3lzdGVtLmgKQEAgLTAsMCArMSw0OCBAQAorLy8gQmFzZSBjbGFzcyBmb3IgZ2VuZXJhdGVkIGNoaXAgb2JqZWN0cw0KKy8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorDQorI2lmbmRlZiBfX3RTeXN0ZW1faF9fDQorI2RlZmluZSBfX3RTeXN0ZW1faF9fDQorDQorI2luY2x1ZGUgImZwZ2FpbnRlcmZhY2VjYXBpL05pRnBnYS5oIg0KK3R5cGVkZWYgTmlGcGdhX1N0YXR1cyB0UmlvU3RhdHVzQ29kZTsNCisNCisjZGVmaW5lIEZSQ19GUEdBX1BSRUxPQURfQklURklMRQ0KKw0KK3R5cGVkZWYgdWludDMyX3QgTmlGcGdhX1Nlc3Npb247DQorDQorbmFtZXNwYWNlIG5GUEdBDQorew0KKw0KK2NsYXNzIHRTeXN0ZW0NCit7DQorcHVibGljOg0KKyAgIHRTeXN0ZW0odFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7DQorICAgfnRTeXN0ZW0oKTsNCisgICB2b2lkIGdldEZwZ2FHdWlkKHVpbnQzMl90ICpndWlkX3B0ciwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7DQorICAgdm9pZCByZXNldCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsNCisNCitwcm90ZWN0ZWQ6DQorICAgc3RhdGljIE5pRnBnYV9TZXNzaW9uIF9EZXZpY2VIYW5kbGU7DQorDQorI2lmZGVmIEZSQ19GUEdBX1BSRUxPQURfQklURklMRQ0KKyAgIHZvaWQgTmlGcGdhX1NoYXJlZE9wZW5fY29tbW9uKGNvbnN0IGNoYXIqICAgICBiaXRmaWxlKTsNCisgICBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TaGFyZWRPcGVuKGNvbnN0IGNoYXIqICAgICBiaXRmaWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgICAgc2lnbmF0dXJlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgICAgcmVzb3VyY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICBhdHRyaWJ1dGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5pRnBnYV9TZXNzaW9uKiBzZXNzaW9uKTsNCisgICBOaUZwZ2FfU3RhdHVzIE5pRnBnYUx2X1NoYXJlZE9wZW4oY29uc3QgY2hhciogY29uc3QgICAgIGJpdGZpbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0ICAgICBhcGlTaWduYXR1cmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0ICAgICByZXNvdXJjZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgICAgICAgIGF0dHJpYnV0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmlGcGdhX1Nlc3Npb24qIGNvbnN0IHNlc3Npb24pOw0KK3ByaXZhdGU6DQorICAgIHN0YXRpYyBjaGFyICpfRmlsZU5hbWU7DQorICAgIHN0YXRpYyBjaGFyICpfQml0ZmlsZTsNCisjZW5kaWYNCit9Ow0KKw0KK30NCisNCisjZW5kaWYgLy8gX190U3lzdGVtX2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvdFN5c3RlbUludGVyZmFjZS5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC90U3lzdGVtSW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU5NDE4NwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvdFN5c3RlbUludGVyZmFjZS5oCkBAIC0wLDAgKzEsMjcgQEAKKy8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorDQorI2lmbmRlZiBfX3RTeXN0ZW1JbnRlcmZhY2VfaF9fDQorI2RlZmluZSBfX3RTeXN0ZW1JbnRlcmZhY2VfaF9fDQorDQorbmFtZXNwYWNlIG5GUEdBDQorew0KKw0KK2NsYXNzIHRTeXN0ZW1JbnRlcmZhY2UNCit7DQorcHVibGljOg0KKyAgIHRTeXN0ZW1JbnRlcmZhY2UoKXt9DQorICAgdmlydHVhbCB+dFN5c3RlbUludGVyZmFjZSgpe30NCisNCisgICB2aXJ0dWFsIGNvbnN0IHVpbnQxNl90IGdldEV4cGVjdGVkRlBHQVZlcnNpb24oKT0wOw0KKyAgIHZpcnR1YWwgY29uc3QgdWludDMyX3QgZ2V0RXhwZWN0ZWRGUEdBUmV2aXNpb24oKT0wOw0KKyAgIHZpcnR1YWwgY29uc3QgdWludDMyX3QgKiBjb25zdCBnZXRFeHBlY3RlZEZQR0FTaWduYXR1cmUoKT0wOw0KKyAgIHZpcnR1YWwgdm9pZCBnZXRIYXJkd2FyZUZwZ2FTaWduYXR1cmUodWludDMyX3QgKmd1aWRfcHRyLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKT0wOw0KKyAgIHZpcnR1YWwgdWludDMyX3QgZ2V0TFZIYW5kbGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk9MDsNCisgICB2aXJ0dWFsIHVpbnQzMl90IGdldEhhbmRsZSgpPTA7DQorICAgdmlydHVhbCB2b2lkIHJlc2V0KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpPTA7DQorfTsNCisNCit9DQorDQorI2VuZGlmIC8vIF9fdFN5c3RlbUludGVyZmFjZV9oX18NCisNCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9IQUwuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvSEFMLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGEwMTI2Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvSEFMLmNwcApAQCAtMCwwICsxLDM3MSBAQAorI2luY2x1ZGUgIkhBTC9IQUwuaHBwIgorCisjaW5jbHVkZSAiUG9ydC5oIgorI2luY2x1ZGUgIkhBTC9FcnJvcnMuaHBwIgorI2luY2x1ZGUgImN0cmUvY3RyZS5oIgorI2luY2x1ZGUgInZpc2EvdmlzYS5oIgorI2luY2x1ZGUgIkNoaXBPYmplY3QuaCIKKyNpbmNsdWRlICJOZXR3b3JrQ29tbXVuaWNhdGlvbi9GUkNDb21tLmgiCisjaW5jbHVkZSAiTmV0d29ya0NvbW11bmljYXRpb24vVXNhZ2VSZXBvcnRpbmcuaCIKKyNpbmNsdWRlICJOZXR3b3JrQ29tbXVuaWNhdGlvbi9Mb2FkT3V0LmgiCisjaW5jbHVkZSAiTmV0d29ya0NvbW11bmljYXRpb24vQ0FOU2Vzc2lvbk11eC5oIgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+IC8vIGxpbnV4IGZvciBraWxsCitjb25zdCB1aW50MzJfdCBzb2xlbm9pZF9rTnVtRE83XzBFbGVtZW50cyA9IDg7Citjb25zdCB1aW50MzJfdCBkaW9fa051bVN5c3RlbXMgPSB0RElPOjprTnVtU3lzdGVtczsKK2NvbnN0IHVpbnQzMl90IGludGVycnVwdF9rTnVtU3lzdGVtcyA9IHRJbnRlcnJ1cHQ6OmtOdW1TeXN0ZW1zOworY29uc3QgdWludDMyX3Qga1N5c3RlbUNsb2NrVGlja3NQZXJNaWNyb3NlY29uZCA9IDQwOworCitzdGF0aWMgdEdsb2JhbCAqZ2xvYmFsOworc3RhdGljIHRTeXNXYXRjaGRvZyAqd2F0Y2hkb2c7CisKK3ZvaWQqIGdldFBvcnQodWludDhfdCBwaW4pCit7CisJUG9ydCogcG9ydCA9IG5ldyBQb3J0KCk7CisJcG9ydC0+cGluID0gcGluOworCXBvcnQtPm1vZHVsZSA9IDE7CisJcmV0dXJuIHBvcnQ7Cit9CisKKy8qKgorICogQGRlcHJlY2F0ZWQgVXNlcyBtb2R1bGUgbnVtYmVycworICovCit2b2lkKiBnZXRQb3J0V2l0aE1vZHVsZSh1aW50OF90IG1vZHVsZSwgdWludDhfdCBwaW4pCit7CisJUG9ydCogcG9ydCA9IG5ldyBQb3J0KCk7CisJcG9ydC0+cGluID0gcGluOworCXBvcnQtPm1vZHVsZSA9IG1vZHVsZTsKKwlyZXR1cm4gcG9ydDsKK30KKworY29uc3QgY2hhciogZ2V0SEFMRXJyb3JNZXNzYWdlKGludDMyX3QgY29kZSkKK3sKKwlzd2l0Y2goY29kZSkgeworCQljYXNlIDA6CisJCQlyZXR1cm4gIiI7CisJCWNhc2UgQ1RSX1J4VGltZW91dDoKKwkJCXJldHVybiBDVFJfUnhUaW1lb3V0X01FU1NBR0U7CisJCWNhc2UgQ1RSX1R4VGltZW91dDoKKwkJCXJldHVybiBDVFJfVHhUaW1lb3V0X01FU1NBR0U7CisJCWNhc2UgQ1RSX0ludmFsaWRQYXJhbVZhbHVlOgorCQkJcmV0dXJuIENUUl9JbnZhbGlkUGFyYW1WYWx1ZV9NRVNTQUdFOworCQljYXNlIENUUl9VbmV4cGVjdGVkQXJiSWQ6CisJCQlyZXR1cm4gQ1RSX1VuZXhwZWN0ZWRBcmJJZF9NRVNTQUdFOworICAgICAgICAgICAgICAgIGNhc2UgQ1RSX1R4RmFpbGVkOgorCQkJcmV0dXJuIENUUl9UeEZhaWxlZF9NRVNTQUdFOworICAgICAgICAgICAgICAgIGNhc2UgQ1RSX1NpZ05vdFVwZGF0ZWQ6CisJCQlyZXR1cm4gQ1RSX1NpZ05vdFVwZGF0ZWRfTUVTU0FHRTsKKwkJY2FzZSBOaUZwZ2FfU3RhdHVzX0ZpZm9UaW1lb3V0OgorCQkJcmV0dXJuIE5pRnBnYV9TdGF0dXNfRmlmb1RpbWVvdXRfTUVTU0FHRTsKKwkJY2FzZSBOaUZwZ2FfU3RhdHVzX1RyYW5zZmVyQWJvcnRlZDoKKwkJCXJldHVybiBOaUZwZ2FfU3RhdHVzX1RyYW5zZmVyQWJvcnRlZF9NRVNTQUdFOworCQljYXNlIE5pRnBnYV9TdGF0dXNfTWVtb3J5RnVsbDogCisJCQlyZXR1cm4gTmlGcGdhX1N0YXR1c19NZW1vcnlGdWxsX01FU1NBR0U7CisJCWNhc2UgTmlGcGdhX1N0YXR1c19Tb2Z0d2FyZUZhdWx0OgorCQkJcmV0dXJuIE5pRnBnYV9TdGF0dXNfU29mdHdhcmVGYXVsdF9NRVNTQUdFOworCQljYXNlIE5pRnBnYV9TdGF0dXNfSW52YWxpZFBhcmFtZXRlcjoKKwkJCXJldHVybiBOaUZwZ2FfU3RhdHVzX0ludmFsaWRQYXJhbWV0ZXJfTUVTU0FHRTsKKwkJY2FzZSBOaUZwZ2FfU3RhdHVzX1Jlc291cmNlTm90Rm91bmQ6CisJCQlyZXR1cm4gTmlGcGdhX1N0YXR1c19SZXNvdXJjZU5vdEZvdW5kX01FU1NBR0U7IAorCQljYXNlIE5pRnBnYV9TdGF0dXNfUmVzb3VyY2VOb3RJbml0aWFsaXplZDoKKwkJCXJldHVybiBOaUZwZ2FfU3RhdHVzX1Jlc291cmNlTm90SW5pdGlhbGl6ZWRfTUVTU0FHRTsgCisJCWNhc2UgTmlGcGdhX1N0YXR1c19IYXJkd2FyZUZhdWx0OgorCQkJcmV0dXJuIE5pRnBnYV9TdGF0dXNfSGFyZHdhcmVGYXVsdF9NRVNTQUdFOworCQljYXNlIE5pRnBnYV9TdGF0dXNfSXJxVGltZW91dDoKKwkJCXJldHVybiBOaUZwZ2FfU3RhdHVzX0lycVRpbWVvdXRfTUVTU0FHRTsKKwkJY2FzZSBTQU1QTEVfUkFURV9UT09fSElHSDoKKwkJCXJldHVybiBTQU1QTEVfUkFURV9UT09fSElHSF9NRVNTQUdFOworCQljYXNlIFZPTFRBR0VfT1VUX09GX1JBTkdFOgorCQkJcmV0dXJuIFZPTFRBR0VfT1VUX09GX1JBTkdFX01FU1NBR0U7CisJCWNhc2UgTE9PUF9USU1JTkdfRVJST1I6CisJCQlyZXR1cm4gTE9PUF9USU1JTkdfRVJST1JfTUVTU0FHRTsKKwkJY2FzZSBTUElfV1JJVEVfTk9fTU9TSToKKwkJCXJldHVybiBTUElfV1JJVEVfTk9fTU9TSV9NRVNTQUdFOworCQljYXNlIFNQSV9SRUFEX05PX01JU086CisJCQlyZXR1cm4gU1BJX1JFQURfTk9fTUlTT19NRVNTQUdFOworCQljYXNlIFNQSV9SRUFEX05PX0RBVEE6CisJCQlyZXR1cm4gU1BJX1JFQURfTk9fREFUQV9NRVNTQUdFOworCQljYXNlIElOQ09NUEFUSUJMRV9TVEFURToKKwkJCXJldHVybiBJTkNPTVBBVElCTEVfU1RBVEVfTUVTU0FHRTsKKwkJY2FzZSBOT19BVkFJTEFCTEVfUkVTT1VSQ0VTOgorCQkJcmV0dXJuIE5PX0FWQUlMQUJMRV9SRVNPVVJDRVNfTUVTU0FHRTsKKwkJY2FzZSBOVUxMX1BBUkFNRVRFUjoKKwkJCXJldHVybiBOVUxMX1BBUkFNRVRFUl9NRVNTQUdFOworCQljYXNlIEFOQUxPR19UUklHR0VSX0xJTUlUX09SREVSX0VSUk9SOgorCQkJcmV0dXJuIEFOQUxPR19UUklHR0VSX0xJTUlUX09SREVSX0VSUk9SX01FU1NBR0U7CisJCWNhc2UgQU5BTE9HX1RSSUdHRVJfUFVMU0VfT1VUUFVUX0VSUk9SOgorCQkJcmV0dXJuIEFOQUxPR19UUklHR0VSX1BVTFNFX09VVFBVVF9FUlJPUl9NRVNTQUdFOworCQljYXNlIFBBUkFNRVRFUl9PVVRfT0ZfUkFOR0U6CisJCQlyZXR1cm4gUEFSQU1FVEVSX09VVF9PRl9SQU5HRV9NRVNTQUdFOworCQljYXNlIEVSUl9DQU5TZXNzaW9uTXV4X0ludmFsaWRCdWZmZXI6CisJCQlyZXR1cm4gRVJSX0NBTlNlc3Npb25NdXhfSW52YWxpZEJ1ZmZlcl9NRVNTQUdFOworCQljYXNlIEVSUl9DQU5TZXNzaW9uTXV4X01lc3NhZ2VOb3RGb3VuZDoKKwkJCXJldHVybiBFUlJfQ0FOU2Vzc2lvbk11eF9NZXNzYWdlTm90Rm91bmRfTUVTU0FHRTsKKwkJY2FzZSBXQVJOX0NBTlNlc3Npb25NdXhfTm9Ub2tlbjoKKwkJCXJldHVybiBXQVJOX0NBTlNlc3Npb25NdXhfTm9Ub2tlbl9NRVNTQUdFOworCQljYXNlIEVSUl9DQU5TZXNzaW9uTXV4X05vdEFsbG93ZWQ6CisJCQlyZXR1cm4gRVJSX0NBTlNlc3Npb25NdXhfTm90QWxsb3dlZF9NRVNTQUdFOworCQljYXNlIEVSUl9DQU5TZXNzaW9uTXV4X05vdEluaXRpYWxpemVkOgorCQkJcmV0dXJuIEVSUl9DQU5TZXNzaW9uTXV4X05vdEluaXRpYWxpemVkX01FU1NBR0U7CisJCWNhc2UgVklfRVJST1JfU1lTVEVNX0VSUk9SOgorCQkJcmV0dXJuIFZJX0VSUk9SX1NZU1RFTV9FUlJPUl9NRVNTQUdFOworCQljYXNlIFZJX0VSUk9SX0lOVl9PQkpFQ1Q6CisJCQlyZXR1cm4gVklfRVJST1JfSU5WX09CSkVDVF9NRVNTQUdFOworCQljYXNlIFZJX0VSUk9SX1JTUkNfTE9DS0VEOgorCQkJcmV0dXJuIFZJX0VSUk9SX1JTUkNfTE9DS0VEX01FU1NBR0U7CisJCWNhc2UgVklfRVJST1JfUlNSQ19ORk9VTkQ6CisJCQlyZXR1cm4gVklfRVJST1JfUlNSQ19ORk9VTkRfTUVTU0FHRTsKKwkJY2FzZSBWSV9FUlJPUl9JTlZfUlNSQ19OQU1FOgorCQkJcmV0dXJuIFZJX0VSUk9SX0lOVl9SU1JDX05BTUVfTUVTU0FHRTsKKwkJY2FzZSBWSV9FUlJPUl9RVUVVRV9PVkVSRkxPVzoKKwkJCXJldHVybiBWSV9FUlJPUl9RVUVVRV9PVkVSRkxPV19NRVNTQUdFOworCQljYXNlIFZJX0VSUk9SX0lPOgorCQkJcmV0dXJuIFZJX0VSUk9SX0lPX01FU1NBR0U7CisJCWNhc2UgVklfRVJST1JfQVNSTF9QQVJJVFk6CisJCQlyZXR1cm4gVklfRVJST1JfQVNSTF9QQVJJVFlfTUVTU0FHRTsKKwkJY2FzZSBWSV9FUlJPUl9BU1JMX0ZSQU1JTkc6CisJCQlyZXR1cm4gVklfRVJST1JfQVNSTF9GUkFNSU5HX01FU1NBR0U7CisJCWNhc2UgVklfRVJST1JfQVNSTF9PVkVSUlVOOgorCQkJcmV0dXJuIFZJX0VSUk9SX0FTUkxfT1ZFUlJVTl9NRVNTQUdFOworCQljYXNlIFZJX0VSUk9SX1JTUkNfQlVTWToKKwkJCXJldHVybiBWSV9FUlJPUl9SU1JDX0JVU1lfTUVTU0FHRTsKKwkJY2FzZSBWSV9FUlJPUl9JTlZfUEFSQU1FVEVSOgorCQkJcmV0dXJuIFZJX0VSUk9SX0lOVl9QQVJBTUVURVJfTUVTU0FHRTsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAiVW5rbm93biBlcnJvciBzdGF0dXMiOworCX0KK30KKworLyoqCisgKiBSZXR1cm4gdGhlIEZQR0EgVmVyc2lvbiBudW1iZXIuCisgKiBGb3Igbm93LCBleHBlY3QgdGhpcyB0byBiZSBjb21wZXRpdGlvbiB5ZWFyLgorICogQHJldHVybiBGUEdBIFZlcnNpb24gbnVtYmVyLgorICovCit1aW50MTZfdCBnZXRGUEdBVmVyc2lvbihpbnQzMl90ICpzdGF0dXMpCit7CisJcmV0dXJuIGdsb2JhbC0+cmVhZFZlcnNpb24oc3RhdHVzKTsKK30KKworLyoqCisgKiBSZXR1cm4gdGhlIEZQR0EgUmV2aXNpb24gbnVtYmVyLgorICogVGhlIGZvcm1hdCBvZiB0aGUgcmV2aXNpb24gaXMgMyBudW1iZXJzLgorICogVGhlIDEyIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBhcmUgdGhlIE1ham9yIFJldmlzaW9uLgorICogdGhlIG5leHQgOCBiaXRzIGFyZSB0aGUgTWlub3IgUmV2aXNpb24uCisgKiBUaGUgMTIgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBhcmUgdGhlIEJ1aWxkIE51bWJlci4KKyAqIEByZXR1cm4gRlBHQSBSZXZpc2lvbiBudW1iZXIuCisgKi8KK3VpbnQzMl90IGdldEZQR0FSZXZpc2lvbihpbnQzMl90ICpzdGF0dXMpCit7CisJcmV0dXJuIGdsb2JhbC0+cmVhZFJldmlzaW9uKHN0YXR1cyk7Cit9CisKKy8qKgorICogUmVhZCB0aGUgbWljcm9zZWNvbmQtcmVzb2x1dGlvbiB0aW1lciBvbiB0aGUgRlBHQS4KKyAqCisgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHRpbWUgaW4gbWljcm9zZWNvbmRzIGFjY29yZGluZyB0byB0aGUgRlBHQSAoc2luY2UgRlBHQSByZXNldCkuCisgKi8KK3VpbnQzMl90IGdldEZQR0FUaW1lKGludDMyX3QgKnN0YXR1cykKK3sKKwlyZXR1cm4gZ2xvYmFsLT5yZWFkTG9jYWxUaW1lKHN0YXR1cyk7Cit9CisKKy8qKgorICogR2V0IHRoZSBzdGF0ZSBvZiB0aGUgIlVTRVIiIGJ1dHRvbiBvbiB0aGUgUm9ib1JJTworICogQHJldHVybiB0cnVlIGlmIHRoZSBidXR0b24gaXMgY3VycmVudGx5IHByZXNzZWQgZG93bgorICovCitib29sIGdldEZQR0FCdXR0b24oaW50MzJfdCAqc3RhdHVzKQoreworCXJldHVybiBnbG9iYWwtPnJlYWRVc2VyQnV0dG9uKHN0YXR1cyk7Cit9CisKK2ludCBIQUxTZXRFcnJvckRhdGEoY29uc3QgY2hhciAqZXJyb3JzLCBpbnQgZXJyb3JzTGVuZ3RoLCBpbnQgd2FpdF9tcykKK3sKKwlyZXR1cm4gc2V0RXJyb3JEYXRhKGVycm9ycywgZXJyb3JzTGVuZ3RoLCB3YWl0X21zKTsKK30KKworaW50IEhBTEdldENvbnRyb2xXb3JkKEhBTENvbnRyb2xXb3JkICpkYXRhKQoreworCXJldHVybiBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fZ2V0Q29udHJvbFdvcmQoKENvbnRyb2xXb3JkX3QqKSBkYXRhKTsKK30KKworaW50IEhBTEdldEFsbGlhbmNlU3RhdGlvbihlbnVtIEhBTEFsbGlhbmNlU3RhdGlvbklEICphbGxpYW5jZVN0YXRpb24pCit7CisJcmV0dXJuIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9nZXRBbGxpYW5jZVN0YXRpb24oKEFsbGlhbmNlU3RhdGlvbklEX3QqKSBhbGxpYW5jZVN0YXRpb24pOworfQorCitpbnQgSEFMR2V0Sm95c3RpY2tBeGVzKHVpbnQ4X3Qgam95c3RpY2tOdW0sIEhBTEpveXN0aWNrQXhlcyAqYXhlcykKK3sKKwlyZXR1cm4gRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX2dldEpveXN0aWNrQXhlcyhqb3lzdGlja051bSwgKEpveXN0aWNrQXhlc190KikgYXhlcywga01heEpveXN0aWNrQXhlcyk7Cit9CisKK2ludCBIQUxHZXRKb3lzdGlja1BPVnModWludDhfdCBqb3lzdGlja051bSwgSEFMSm95c3RpY2tQT1ZzICpwb3ZzKQoreworCXJldHVybiBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fZ2V0Sm95c3RpY2tQT1ZzKGpveXN0aWNrTnVtLCAoSm95c3RpY2tQT1ZfdCopIHBvdnMsIGtNYXhKb3lzdGlja1BPVnMpOworfQorCitpbnQgSEFMR2V0Sm95c3RpY2tCdXR0b25zKHVpbnQ4X3Qgam95c3RpY2tOdW0sIEhBTEpveXN0aWNrQnV0dG9ucyAqYnV0dG9ucykKK3sKKwlyZXR1cm4gRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX2dldEpveXN0aWNrQnV0dG9ucyhqb3lzdGlja051bSwgJmJ1dHRvbnMtPmJ1dHRvbnMsICZidXR0b25zLT5jb3VudCk7Cit9CisKK2ludCBIQUxHZXRKb3lzdGlja0Rlc2NyaXB0b3IodWludDhfdCBqb3lzdGlja051bSwgSEFMSm95c3RpY2tEZXNjcmlwdG9yICpkZXNjKQoreworCXJldHVybiBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fZ2V0Sm95c3RpY2tEZXNjKGpveXN0aWNrTnVtLCAmZGVzYy0+aXNYYm94LCAmZGVzYy0+dHlwZSwgKGNoYXIgKikoJmRlc2MtPm5hbWUpLCAKKwkJJmRlc2MtPmF4aXNDb3VudCwgJmRlc2MtPmF4aXNUeXBlcywgJmRlc2MtPmJ1dHRvbkNvdW50LCAmZGVzYy0+cG92Q291bnQpOworfQorCitpbnQgSEFMU2V0Sm95c3RpY2tPdXRwdXRzKHVpbnQ4X3Qgam95c3RpY2tOdW0sIHVpbnQzMl90IG91dHB1dHMsIHVpbnQxNl90IGxlZnRSdW1ibGUsIHVpbnQxNl90IHJpZ2h0UnVtYmxlKQoreworCXJldHVybiBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fc2V0Sm95c3RpY2tPdXRwdXRzKGpveXN0aWNrTnVtLCBvdXRwdXRzLCBsZWZ0UnVtYmxlLCByaWdodFJ1bWJsZSk7Cit9CisKK2ludCBIQUxHZXRNYXRjaFRpbWUoZmxvYXQgKm1hdGNoVGltZSkKK3sKKwlyZXR1cm4gRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX2dldE1hdGNoVGltZShtYXRjaFRpbWUpOworfQorCit2b2lkIEhBTFNldE5ld0RhdGFTZW0oTVVMVElXQUlUX0lEIHNlbSkKK3sKKwlzZXROZXdEYXRhU2VtKHNlbSk7Cit9CisKK2Jvb2wgSEFMR2V0U3lzdGVtQWN0aXZlKGludDMyX3QgKnN0YXR1cykKK3sKKwlyZXR1cm4gd2F0Y2hkb2ctPnJlYWRTdGF0dXNfU3lzdGVtQWN0aXZlKHN0YXR1cyk7Cit9CisJCitib29sIEhBTEdldEJyb3duZWRPdXQoaW50MzJfdCAqc3RhdHVzKQoreworCXJldHVybiAhKHdhdGNoZG9nLT5yZWFkU3RhdHVzX1Bvd2VyQWxpdmUoc3RhdHVzKSk7Cit9CisKKy8qKgorICogQ2FsbCB0aGlzIHRvIHN0YXJ0IHVwIEhBTC4gVGhpcyBpcyByZXF1aXJlZCBmb3Igcm9ib3QgcHJvZ3JhbXMuCisgKi8KK2ludCBIQUxJbml0aWFsaXplKGludCBtb2RlKQoreworICAgIHNldGxpbmVidWYoc3RkaW4pOworICAgIHNldGxpbmVidWYoc3Rkb3V0KTsKKworICAgIHByY3RsKFBSX1NFVF9QREVBVEhTSUcsIFNJR1RFUk0pOworCisJRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX1Jlc2VydmUobnVsbHB0cik7CisJLy8gaW1hZ2UgNDsgRml4ZXMgZXJyb3JzIGNhdXNlZCBieSBtdWx0aXBsZSBwcm9jZXNzZXMuIFRhbGsgdG8gTkkgYWJvdXQgdGhpcworCW5GUEdBOjpuUm9ib1JJT19GUEdBTmFtZXNwYWNlOjpnX2N1cnJlbnRUYXJnZXRDbGFzcyA9CisJCQluTG9hZE91dDo6a1RhcmdldENsYXNzX1JvYm9SSU87CisKKwlpbnQzMl90IHN0YXR1czsKKwlnbG9iYWwgPSB0R2xvYmFsOjpjcmVhdGUoJnN0YXR1cyk7CisJd2F0Y2hkb2cgPSB0U3lzV2F0Y2hkb2c6OmNyZWF0ZSgmc3RhdHVzKTsKKworCS8vIEtpbGwgYW55IHByZXZpb3VzIHJvYm90IHByb2dyYW1zCisJc3RkOjpmc3RyZWFtIGZzOworCS8vIEJ5IG1ha2luZyB0aGlzIGJvdGggaW4vb3V0LCBpdCB3b24ndCBnaXZlIHVzIGFuIGVycm9yIGlmIGl0IGRvZXNudCBleGlzdAorCWZzLm9wZW4oIi92YXIvbG9jay9mcmMucGlkIiwgc3RkOjpmc3RyZWFtOjppbiB8IHN0ZDo6ZnN0cmVhbTo6b3V0KTsKKwlpZiAoZnMuYmFkKCkpCisJCXJldHVybiAwOworCisJcGlkX3QgcGlkID0gMDsKKwlpZiAoIWZzLmVvZigpICYmICFmcy5mYWlsKCkpCisJeworCQlmcyA+PiBwaWQ7CisJCS8vc2VlIGlmIHRoZSBwaWQgaXMgYXJvdW5kLCBidXQgd2UgZG9uJ3Qgd2FudCB0byBtZXNzIHdpdGggaW5pdCBpZD0xLCBvciBvdXJzZWx2ZXMKKwkJaWYgKHBpZCA+PSAyICYmIGtpbGwocGlkLCAwKSA9PSAwICYmIHBpZCAhPSBnZXRwaWQoKSkKKwkJeworCQkJc3RkOjpjb3V0IDw8ICJLaWxsaW5nIHByZXZpb3VzbHkgcnVubmluZyBGUkMgcHJvZ3JhbS4uLiIKKwkJCQkJPDwgc3RkOjplbmRsOworCQkJa2lsbChwaWQsIFNJR1RFUk0pOyAvLyB0cnkgdG8ga2lsbCBpdAorCQkJZGVsYXlNaWxsaXMoMTAwKTsKKwkJCWlmIChraWxsKHBpZCwgMCkgPT0gMCkKKwkJCXsKKwkJCQkvLyBzdGlsbCBub3Qgc3VjY2Vzc2Z1bGwKKwkJCQlpZiAobW9kZSA9PSAwKQorCQkJCXsKKwkJCQkJc3RkOjpjb3V0IDw8ICJGUkMgcGlkICIgPDwgcGlkCisJCQkJCQkJPDwgIiBkaWQgbm90IGRpZSB3aXRoaW4gMTEwbXMuIEFib3J0aW5nIgorCQkJCQkJCTw8IHN0ZDo6ZW5kbDsKKwkJCQkJcmV0dXJuIDA7IC8vIGp1c3QgZmFpbAorCQkJCX0KKwkJCQllbHNlIGlmIChtb2RlID09IDEpIC8vIGtpbGwgLTkgaXQKKwkJCQkJa2lsbChwaWQsIFNJR0tJTEwpOworCQkJCWVsc2UKKwkJCQl7CisJCQkJCXN0ZDo6Y291dCA8PCAiV0FSTklORzogRlJDIHBpZCAiIDw8IHBpZAorCQkJCQkJCTw8ICIgZGlkIG5vdCBkaWUgd2l0aGluIDExMG1zLiIgPDwgc3RkOjplbmRsOworCQkJCX0KKwkJCX0KKworCQl9CisJfQorCWZzLmNsb3NlKCk7CisJLy8gd2Ugd2lsbCByZS1vcGVuIGl0IHdyaXRlIG9ubHkgdG8gdHJ1bmNhdGUgdGhlIGZpbGUKKwlmcy5vcGVuKCIvdmFyL2xvY2svZnJjLnBpZCIsIHN0ZDo6ZnN0cmVhbTo6b3V0IHwgc3RkOjpmc3RyZWFtOjp0cnVuYyk7CisJZnMuc2Vla3AoMCk7CisJcGlkID0gZ2V0cGlkKCk7CisJZnMgPDwgcGlkIDw8IHN0ZDo6ZW5kbDsKKwlmcy5jbG9zZSgpOworCXJldHVybiAxOworfQorCit2b2lkIEhBTE5ldHdvcmtDb21tdW5pY2F0aW9uT2JzZXJ2ZVVzZXJQcm9ncmFtU3RhcnRpbmcodm9pZCkKK3sKKwlGUkNfTmV0d29ya0NvbW11bmljYXRpb25fb2JzZXJ2ZVVzZXJQcm9ncmFtU3RhcnRpbmcoKTsKK30KKwordm9pZCBIQUxOZXR3b3JrQ29tbXVuaWNhdGlvbk9ic2VydmVVc2VyUHJvZ3JhbURpc2FibGVkKHZvaWQpCit7CisJRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX29ic2VydmVVc2VyUHJvZ3JhbURpc2FibGVkKCk7Cit9CisKK3ZvaWQgSEFMTmV0d29ya0NvbW11bmljYXRpb25PYnNlcnZlVXNlclByb2dyYW1BdXRvbm9tb3VzKHZvaWQpCit7CisJRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX29ic2VydmVVc2VyUHJvZ3JhbUF1dG9ub21vdXMoKTsKK30KKwordm9pZCBIQUxOZXR3b3JrQ29tbXVuaWNhdGlvbk9ic2VydmVVc2VyUHJvZ3JhbVRlbGVvcCh2b2lkKQoreworCUZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9vYnNlcnZlVXNlclByb2dyYW1UZWxlb3AoKTsKK30KKwordm9pZCBIQUxOZXR3b3JrQ29tbXVuaWNhdGlvbk9ic2VydmVVc2VyUHJvZ3JhbVRlc3Qodm9pZCkKK3sKKwlGUkNfTmV0d29ya0NvbW11bmljYXRpb25fb2JzZXJ2ZVVzZXJQcm9ncmFtVGVzdCgpOworfQorCit1aW50MzJfdCBIQUxSZXBvcnQodWludDhfdCByZXNvdXJjZSwgdWludDhfdCBpbnN0YW5jZU51bWJlciwgdWludDhfdCBjb250ZXh0LAorCQljb25zdCBjaGFyICpmZWF0dXJlKQoreworCWlmKGZlYXR1cmUgPT0gTlVMTCkKKwl7CisJCWZlYXR1cmUgPSAiIjsKKwl9CisKKwlyZXR1cm4gRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX25Vc2FnZVJlcG9ydGluZ19yZXBvcnQocmVzb3VyY2UsIGluc3RhbmNlTnVtYmVyLCBjb250ZXh0LCBmZWF0dXJlKTsKK30KKworLy8gVE9ETzogSEFDS1MKK3ZvaWQgTnVtZXJpY0FycmF5UmVzaXplKCkKK3sKK30KK3ZvaWQgUlRTZXRDbGVhbnVwUHJvYygpCit7Cit9Cit2b2lkIEVEVlJfQ3JlYXRlUmVmZXJlbmNlKCkKK3sKK30KK3ZvaWQgT2NjdXIoKQoreworfQorCit2b2lkIGltYXFHZXRFcnJvclRleHQoKQoreworfQordm9pZCBpbWFxR2V0TGFzdEVycm9yKCkKK3sKK30KK3ZvaWQgbmlUaW1lc3RhbXA2NCgpCit7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9JbnRlcnJ1cHRzLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ludGVycnVwdHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YmQyYzkKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9JbnRlcnJ1cHRzLmNwcApAQCAtMCwwICsxLDEyMCBAQAorI2luY2x1ZGUgIkhBTC9JbnRlcnJ1cHRzLmhwcCIKKyNpbmNsdWRlICJDaGlwT2JqZWN0LmgiCisKK3N0cnVjdCBJbnRlcnJ1cHQgLy8gRklYTUU6IHdoeSBpcyB0aGlzIGludGVybmFsPworeworCXRJbnRlcnJ1cHQgKmFuSW50ZXJydXB0OworCXRJbnRlcnJ1cHRNYW5hZ2VyICptYW5hZ2VyOworfTsKKwordm9pZCogaW5pdGlhbGl6ZUludGVycnVwdHModWludDMyX3QgaW50ZXJydXB0SW5kZXgsIGJvb2wgd2F0Y2hlciwgaW50MzJfdCAqc3RhdHVzKQoreworCUludGVycnVwdCogYW5JbnRlcnJ1cHQgPSBuZXcgSW50ZXJydXB0KCk7CisJLy8gRXhwZWN0cyB0aGUgY2FsbGluZyBsZWFmIGNsYXNzIHRvIGFsbG9jYXRlIGFuIGludGVycnVwdCBpbmRleC4KKwlhbkludGVycnVwdC0+YW5JbnRlcnJ1cHQgPSB0SW50ZXJydXB0OjpjcmVhdGUoaW50ZXJydXB0SW5kZXgsIHN0YXR1cyk7CisJYW5JbnRlcnJ1cHQtPmFuSW50ZXJydXB0LT53cml0ZUNvbmZpZ19XYWl0Rm9yQWNrKGZhbHNlLCBzdGF0dXMpOworCWFuSW50ZXJydXB0LT5tYW5hZ2VyID0gbmV3IHRJbnRlcnJ1cHRNYW5hZ2VyKAorCQkoMSA8PCBpbnRlcnJ1cHRJbmRleCkgfCAoMSA8PCAoaW50ZXJydXB0SW5kZXggKyA4KSksIHdhdGNoZXIsIHN0YXR1cyk7CisJcmV0dXJuIGFuSW50ZXJydXB0OworfQorCit2b2lkIGNsZWFuSW50ZXJydXB0cyh2b2lkKiBpbnRlcnJ1cHRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKQoreworCUludGVycnVwdCogYW5JbnRlcnJ1cHQgPSAoSW50ZXJydXB0KilpbnRlcnJ1cHRfcG9pbnRlcjsKKwlkZWxldGUgYW5JbnRlcnJ1cHQtPmFuSW50ZXJydXB0OworCWRlbGV0ZSBhbkludGVycnVwdC0+bWFuYWdlcjsKKwlhbkludGVycnVwdC0+YW5JbnRlcnJ1cHQgPSBOVUxMOworCWFuSW50ZXJydXB0LT5tYW5hZ2VyID0gTlVMTDsKK30KKworLyoqCisgKiBJbiBzeW5jaHJvbm91cyBtb2RlLCB3YWl0IGZvciB0aGUgZGVmaW5lZCBpbnRlcnJ1cHQgdG8gb2NjdXIuCisgKiBAcGFyYW0gdGltZW91dCBUaW1lb3V0IGluIHNlY29uZHMKKyAqIEBwYXJhbSBpZ25vcmVQcmV2aW91cyBJZiB0cnVlLCBpZ25vcmUgaW50ZXJydXB0cyB0aGF0IGhhcHBlbmVkIGJlZm9yZQorICogd2FpdEZvckludGVycnVwdCB3YXMgY2FsbGVkLgorICogQHJldHVybiBUaGUgbWFzayBvZiBpbnRlcnJ1cHRzIHRoYXQgZmlyZWQuCisgKi8KK3VpbnQzMl90IHdhaXRGb3JJbnRlcnJ1cHQodm9pZCogaW50ZXJydXB0X3BvaW50ZXIsIGRvdWJsZSB0aW1lb3V0LCBib29sIGlnbm9yZVByZXZpb3VzLCBpbnQzMl90ICpzdGF0dXMpCit7CisJdWludDMyX3QgcmVzdWx0OworCUludGVycnVwdCogYW5JbnRlcnJ1cHQgPSAoSW50ZXJydXB0KilpbnRlcnJ1cHRfcG9pbnRlcjsKKworCXJlc3VsdCA9IGFuSW50ZXJydXB0LT5tYW5hZ2VyLT53YXRjaCgoaW50MzJfdCkodGltZW91dCAqIDFlMyksIGlnbm9yZVByZXZpb3VzLCBzdGF0dXMpOworCisJLy8gRG9uJ3QgcmVwb3J0IGEgdGltZW91dCBhcyBhbiBlcnJvciAtIHRoZSByZXR1cm4gY29kZSBpcyBlbm91Z2ggdG8gdGVsbAorCS8vIHRoYXQgYSB0aW1lb3V0IGhhcHBlbmVkLgorCWlmKCpzdGF0dXMgPT0gLU5pRnBnYV9TdGF0dXNfSXJxVGltZW91dCkgeworCQkqc3RhdHVzID0gTmlGcGdhX1N0YXR1c19TdWNjZXNzOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogRW5hYmxlIGludGVycnVwdHMgdG8gb2NjdXIgb24gdGhpcyBpbnB1dC4KKyAqIEludGVycnVwdHMgYXJlIGRpc2FibGVkIHdoZW4gdGhlIFJlcXVlc3RJbnRlcnJ1cHQgY2FsbCBpcyBtYWRlLiBUaGlzIGdpdmVzIHRpbWUgdG8gZG8gdGhlCisgKiBzZXR1cCBvZiB0aGUgb3RoZXIgb3B0aW9ucyBiZWZvcmUgc3RhcnRpbmcgdG8gZmllbGQgaW50ZXJydXB0cy4KKyAqLwordm9pZCBlbmFibGVJbnRlcnJ1cHRzKHZvaWQqIGludGVycnVwdF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpCit7CisJSW50ZXJydXB0KiBhbkludGVycnVwdCA9IChJbnRlcnJ1cHQqKWludGVycnVwdF9wb2ludGVyOworCWFuSW50ZXJydXB0LT5tYW5hZ2VyLT5lbmFibGUoc3RhdHVzKTsKK30KKworLyoqCisgKiBEaXNhYmxlIEludGVycnVwdHMgd2l0aG91dCB3aXRob3V0IGRlYWxsb2NhdGluZyBzdHJ1Y3R1cmVzLgorICovCit2b2lkIGRpc2FibGVJbnRlcnJ1cHRzKHZvaWQqIGludGVycnVwdF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpCit7CisJSW50ZXJydXB0KiBhbkludGVycnVwdCA9IChJbnRlcnJ1cHQqKWludGVycnVwdF9wb2ludGVyOworCWFuSW50ZXJydXB0LT5tYW5hZ2VyLT5kaXNhYmxlKHN0YXR1cyk7Cit9CisKKy8qKgorICogUmV0dXJuIHRoZSB0aW1lc3RhbXAgZm9yIHRoZSByaXNpbmcgaW50ZXJydXB0IHRoYXQgb2NjdXJyZWQgbW9zdCByZWNlbnRseS4KKyAqIFRoaXMgaXMgaW4gdGhlIHNhbWUgdGltZSBkb21haW4gYXMgR2V0Q2xvY2soKS4KKyAqIEByZXR1cm4gVGltZXN0YW1wIGluIHNlY29uZHMgc2luY2UgYm9vdC4KKyAqLworZG91YmxlIHJlYWRSaXNpbmdUaW1lc3RhbXAodm9pZCogaW50ZXJydXB0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cykKK3sKKwlJbnRlcnJ1cHQqIGFuSW50ZXJydXB0ID0gKEludGVycnVwdCopaW50ZXJydXB0X3BvaW50ZXI7CisJdWludDMyX3QgdGltZXN0YW1wID0gYW5JbnRlcnJ1cHQtPmFuSW50ZXJydXB0LT5yZWFkUmlzaW5nVGltZVN0YW1wKHN0YXR1cyk7CisJcmV0dXJuIHRpbWVzdGFtcCAqIDFlLTY7Cit9CisKKy8qKgorKiBSZXR1cm4gdGhlIHRpbWVzdGFtcCBmb3IgdGhlIGZhbGxpbmcgaW50ZXJydXB0IHRoYXQgb2NjdXJyZWQgbW9zdCByZWNlbnRseS4KKyogVGhpcyBpcyBpbiB0aGUgc2FtZSB0aW1lIGRvbWFpbiBhcyBHZXRDbG9jaygpLgorKiBAcmV0dXJuIFRpbWVzdGFtcCBpbiBzZWNvbmRzIHNpbmNlIGJvb3QuCisqLworZG91YmxlIHJlYWRGYWxsaW5nVGltZXN0YW1wKHZvaWQqIGludGVycnVwdF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpCit7CisJSW50ZXJydXB0KiBhbkludGVycnVwdCA9IChJbnRlcnJ1cHQqKWludGVycnVwdF9wb2ludGVyOworCXVpbnQzMl90IHRpbWVzdGFtcCA9IGFuSW50ZXJydXB0LT5hbkludGVycnVwdC0+cmVhZEZhbGxpbmdUaW1lU3RhbXAoc3RhdHVzKTsKKwlyZXR1cm4gdGltZXN0YW1wICogMWUtNjsKK30KKwordm9pZCByZXF1ZXN0SW50ZXJydXB0cyh2b2lkKiBpbnRlcnJ1cHRfcG9pbnRlciwgdWludDhfdCByb3V0aW5nX21vZHVsZSwgdWludDMyX3Qgcm91dGluZ19waW4sCisJCWJvb2wgcm91dGluZ19hbmFsb2dfdHJpZ2dlciwgaW50MzJfdCAqc3RhdHVzKQoreworCUludGVycnVwdCogYW5JbnRlcnJ1cHQgPSAoSW50ZXJydXB0KilpbnRlcnJ1cHRfcG9pbnRlcjsKKwlhbkludGVycnVwdC0+YW5JbnRlcnJ1cHQtPndyaXRlQ29uZmlnX1dhaXRGb3JBY2soZmFsc2UsIHN0YXR1cyk7CisJYW5JbnRlcnJ1cHQtPmFuSW50ZXJydXB0LT53cml0ZUNvbmZpZ19Tb3VyY2VfQW5hbG9nVHJpZ2dlcihyb3V0aW5nX2FuYWxvZ190cmlnZ2VyLCBzdGF0dXMpOworCWFuSW50ZXJydXB0LT5hbkludGVycnVwdC0+d3JpdGVDb25maWdfU291cmNlX0NoYW5uZWwocm91dGluZ19waW4sIHN0YXR1cyk7CisJYW5JbnRlcnJ1cHQtPmFuSW50ZXJydXB0LT53cml0ZUNvbmZpZ19Tb3VyY2VfTW9kdWxlKHJvdXRpbmdfbW9kdWxlLCBzdGF0dXMpOworfQorCit2b2lkIGF0dGFjaEludGVycnVwdEhhbmRsZXIodm9pZCogaW50ZXJydXB0X3BvaW50ZXIsIEludGVycnVwdEhhbmRsZXJGdW5jdGlvbiBoYW5kbGVyLCB2b2lkKiBwYXJhbSwKKwkJaW50MzJfdCAqc3RhdHVzKQoreworCUludGVycnVwdCogYW5JbnRlcnJ1cHQgPSAoSW50ZXJydXB0KilpbnRlcnJ1cHRfcG9pbnRlcjsKKwlhbkludGVycnVwdC0+bWFuYWdlci0+cmVnaXN0ZXJIYW5kbGVyKGhhbmRsZXIsIHBhcmFtLCBzdGF0dXMpOworfQorCit2b2lkIHNldEludGVycnVwdFVwU291cmNlRWRnZSh2b2lkKiBpbnRlcnJ1cHRfcG9pbnRlciwgYm9vbCByaXNpbmdFZGdlLCBib29sIGZhbGxpbmdFZGdlLAorCQlpbnQzMl90ICpzdGF0dXMpCit7CisJSW50ZXJydXB0KiBhbkludGVycnVwdCA9IChJbnRlcnJ1cHQqKWludGVycnVwdF9wb2ludGVyOworCWFuSW50ZXJydXB0LT5hbkludGVycnVwdC0+d3JpdGVDb25maWdfUmlzaW5nRWRnZShyaXNpbmdFZGdlLCBzdGF0dXMpOworCWFuSW50ZXJydXB0LT5hbkludGVycnVwdC0+d3JpdGVDb25maWdfRmFsbGluZ0VkZ2UoZmFsbGluZ0VkZ2UsIHN0YXR1cyk7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9OZXR3b3JrQ29tbXVuaWNhdGlvbi9BSUNhbGlicmF0aW9uLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9OZXR3b3JrQ29tbXVuaWNhdGlvbi9BSUNhbGlicmF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJmMzY2YwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL05ldHdvcmtDb21tdW5pY2F0aW9uL0FJQ2FsaWJyYXRpb24uaApAQCAtMCwwICsxLDE5IEBACisNCisjaWZuZGVmIF9fQUlDYWxpYnJhdGlvbl9oX18NCisjZGVmaW5lIF9fQUlDYWxpYnJhdGlvbl9oX18NCisNCisjaW5jbHVkZSA8c3RkaW50Lmg+DQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorZXh0ZXJuICJDIg0KK3sNCisjZW5kaWYNCisNCisJdWludDMyX3QgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX25BSUNhbGlicmF0aW9uX2dldExTQldlaWdodChjb25zdCB1aW50MzJfdCBhaVN5c3RlbUluZGV4LCBjb25zdCB1aW50MzJfdCBjaGFubmVsLCBpbnQzMl90ICpzdGF0dXMpOw0KKwlpbnQzMl90IEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9uQUlDYWxpYnJhdGlvbl9nZXRPZmZzZXQoY29uc3QgdWludDMyX3QgYWlTeXN0ZW1JbmRleCwgY29uc3QgdWludDMyX3QgY2hhbm5lbCwgaW50MzJfdCAqc3RhdHVzKTsNCisNCisjaWZkZWYgX19jcGx1c3BsdXMNCit9DQorI2VuZGlmDQorDQorI2VuZGlmIC8vIF9fQUlDYWxpYnJhdGlvbl9oX18NCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9OZXR3b3JrQ29tbXVuaWNhdGlvbi9DQU5JbnRlcmZhY2VQbHVnaW4uaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL05ldHdvcmtDb21tdW5pY2F0aW9uL0NBTkludGVyZmFjZVBsdWdpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZDk5MmMKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9OZXR3b3JrQ29tbXVuaWNhdGlvbi9DQU5JbnRlcmZhY2VQbHVnaW4uaApAQCAtMCwwICsxLDgyIEBACisvLyBDQU5JbnRlcmZhY2VQbHVnaW4uaA0KKy8vDQorLy8gIERlZmluZXMgdGhlIEFQSSBmb3IgYnVpbGRpbmcgYSBDQU4gSW50ZXJmYWNlIFBsdWdpbiB0byBzdXBwb3J0DQorLy8gICAgUFdNLWNhYmxlLWZyZWUgQ0FOIG1vdG9yIGNvbnRyb2wgb24gRlJDIHJvYm90cy4gIFRoaXMgYWxsb3dzIHlvdQ0KKy8vICAgIHRvIGNvbm5lY3QgYW55IENBTiBpbnRlcmZhY2UgdG8gdGhlIHNlY3VyZSBKYWd1YXIgQ0FOIGRyaXZlci4NCisvLw0KKw0KKyNpZm5kZWYgX19DQU5JbnRlcmZhY2VQbHVnaW5faF9fDQorI2RlZmluZSBfX0NBTkludGVyZmFjZVBsdWdpbl9oX18NCisNCisjaW5jbHVkZSA8c3RkaW50Lmg+DQorDQorI2RlZmluZSBDQU5fSVNfRlJBTUVfUkVNT1RFIDB4ODAwMDAwMDANCisjZGVmaW5lIENBTl9JU19GUkFNRV8xMUJJVCAgMHg0MDAwMDAwMA0KKyNkZWZpbmUgQ0FOXzI5QklUX01FU1NBR0VfSURfTUFTSyAweDFGRkZGRkZGDQorI2RlZmluZSBDQU5fMTFCSVRfTUVTU0FHRV9JRF9NQVNLIDB4MDAwMDA3RkYNCisNCitjbGFzcyBDQU5JbnRlcmZhY2VQbHVnaW4NCit7DQorcHVibGljOg0KKwlDQU5JbnRlcmZhY2VQbHVnaW4oKSB7fQ0KKwl2aXJ0dWFsIH5DQU5JbnRlcmZhY2VQbHVnaW4oKSB7fQ0KKw0KKwkvKioNCisJICogVGhpcyBlbnRyeS1wb2ludCBvZiB0aGUgQ0FOSW50ZXJmYWNlUGx1Z2luIGlzIHBhc3NlZCBhIG1lc3NhZ2UgdGhhdCB0aGUgZHJpdmVyIG5lZWRzIHRvIHNlbmQgdG8NCisJICogYSBkZXZpY2Ugb24gdGhlIENBTiBidXMuDQorCSAqIA0KKwkgKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgZnJvbSBtdWx0aXBsZSBjb250ZXh0cyBhbmQgbXVzdCB0aGVyZWZvcmUgYmUgcmVlbnRyYW50Lg0KKwkgKiANCisJICogQHBhcmFtIG1lc3NhZ2VJRCBUaGUgMjktYml0IENBTiBtZXNzYWdlIElEIGluIHRoZSBsc2JzLiAgVGhlIG1zYiBjYW4gaW5kaWNhdGUgYSByZW1vdGUgZnJhbWUuDQorCSAqIEBwYXJhbSBkYXRhIEEgcG9pbnRlciB0byBhIGJ1ZmZlciBjb250YWluaW5nIGJldHdlZW4gMCBhbmQgOCBieXRlcyB0byBzZW5kIHdpdGggdGhlIG1lc3NhZ2UuICBNYXkgYmUgTlVMTCBpZiBkYXRhU2l6ZSBpcyAwLg0KKwkgKiBAcGFyYW0gZGF0YVNpemUgVGhlIG51bWJlciBvZiBieXRlcyB0byBzZW5kIHdpdGggdGhlIG1lc3NhZ2UuDQorCSAqIEByZXR1cm4gUmV0dXJuIGFueSBlcnJvciBjb2RlLiAgT24gc3VjY2VzcyByZXR1cm4gMC4NCisJICovDQorCXZpcnR1YWwgaW50MzJfdCBzZW5kTWVzc2FnZSh1aW50MzJfdCBtZXNzYWdlSUQsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHVpbnQ4X3QgZGF0YVNpemUpID0gMDsNCisNCisJLyoqDQorCSAqIFRoaXMgZW50cnktcG9pbnQgb2YgdGhlIENBTkludGVyZmFjZVBsdWdpbiBpcyBwYXNzZWQgYnVmZmVycyB3aGljaCBzaG91bGQgYmUgcG9wdWxhdGVkIHdpdGgNCisJICogYW55IHJlY2VpdmVkIG1lc3NhZ2VzIGZyb20gZGV2aWNlcyBvbiB0aGUgQ0FOIGJ1cy4NCisJICogDQorCSAqIFRoaXMgZnVuY3Rpb24gaXMgYWx3YXlzIGNhbGxlZCBieSBhIHNpbmdsZSB0YXNrIGluIHRoZSBKYWd1YXIgZHJpdmVyLCBzbyBpdCBuZWVkIG5vdCBiZSByZWVudHJhbnQuDQorCSAqIA0KKwkgKiBUaGlzIGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvIGJsb2NrIGZvciBzb21lIHBlcmlvZCBvZiB0aW1lIHdhaXRpbmcgZm9yIGEgbWVzc2FnZSBmcm9tIHRoZSBDQU4gYnVzLg0KKwkgKiBJdCBtYXkgdGltZW91dCBwZXJpb2RpY2FsbHkgKHJldHVybmluZyBub24temVybyB0byBpbmRpY2F0ZSBubyBtZXNzYWdlIHdhcyBwb3B1bGF0ZWQpIHRvIGFsbG93IGZvcg0KKwkgKiBzaHV0ZG93biBhbmQgdW5sb2FkaW5nIG9mIHRoZSBwbHVnaW4uDQorCSAqIA0KKwkgKiBAcGFyYW0gbWVzc2FnZUlEIEEgcmVmZXJlbmNlIHRvIGJlIHBvcHVsYXRlZCB3aXRoIGEgcmVjZWl2ZWQgMjktYml0IENBTiBtZXNzYWdlIElEIGluIHRoZSBsc2JzLg0KKwkgKiBAcGFyYW0gZGF0YSBBIHBvaW50ZXIgdG8gYSBidWZmZXIgb2YgOCBieXRlcyB0byBiZSBwb3B1bGF0ZWQgd2l0aCBkYXRhIHJlY2VpdmVkIHdpdGggdGhlIG1lc3NhZ2UuDQorCSAqIEBwYXJhbSBkYXRhU2l6ZSBBIHJlZmVyZW5jZSB0byBiZSBwb3B1bGF0ZWQgd2l0aCB0aGUgc2l6ZSBvZiB0aGUgZGF0YSByZWNlaXZlZCAoMCAtIDggYnl0ZXMpLg0KKwkgKiBAcmV0dXJuIFRoaXMgc2hvdWxkIHJldHVybiAwIGlmIGEgbWVzc2FnZSB3YXMgcG9wdWxhdGVkLCBub24tMCBpZiBubyBtZXNzYWdlIHdhcyBub3QgcG9wdWxhdGVkLg0KKwkgKi8NCisJdmlydHVhbCBpbnQzMl90IHJlY2VpdmVNZXNzYWdlKHVpbnQzMl90ICZtZXNzYWdlSUQsIHVpbnQ4X3QgKmRhdGEsIHVpbnQ4X3QgJmRhdGFTaXplKSA9IDA7DQorDQorI2lmIGRlZmluZWQoX19saW51eCkNCisJLyoqDQorCSAqIFRoaXMgZW50cnktcG9pbnQgb2YgdGhlIENBTkludGVyZmFjZVBsdWdpbiByZXR1cm5zIHN0YXR1cyBvZiB0aGUgQ0FOIGJ1cy4NCisJICogDQorCSAqIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBmcm9tIG11bHRpcGxlIGNvbnRleHRzIGFuZCBtdXN0IHRoZXJlZm9yZSBiZSByZWVudHJhbnQuDQorCSAqIA0KKwkgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGRldGFpbGVkIGhhcmR3YXJlIHN0YXR1cyBpZiBhdmFpbGFibGUgZm9yIGRpYWdub3N0aWNzIG9mIHRoZSBDQU4gaW50ZXJmYWNlLg0KKwkgKiANCisJICogQHBhcmFtIGJ1c09mZkNvdW50IFRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCBzZW5kTWVzc2FnZSBmYWlsZWQgd2l0aCBhIGJ1c09mZiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgbWVzc2FnZXMNCisJICogIGFyZSBub3Qgc3VjY2Vzc2Z1bGx5IHRyYW5zbWl0dGVkIG9uIHRoZSBidXMuDQorCSAqIEBwYXJhbSB0eEZ1bGxDb3VudCBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgc2VuZE1lc3NhZ2UgZmFpbGVkIHdpdGggYSB0eEZpZm9GdWxsIGVycm9yIGluZGljYXRpbmcgdGhhdCBtZXNzYWdlcw0KKwkgKiAgYXJlIG5vdCBzdWNjZXNzZnVsbHkgcmVjZWl2ZWQgYnkgYW55IENBTiBkZXZpY2UuDQorCSAqIEBwYXJhbSByZWNlaXZlRXJyb3JDb3VudCBUaGUgY291bnQgb2YgcmVjZWl2ZSBlcnJvcnMgYXMgcmVwb3J0ZWQgYnkgdGhlIENBTiBkcml2ZXIuDQorCSAqIEBwYXJhbSB0cmFuc21pdEVycm9yQ291bnQgVGhlIGNvdW50IG9mIHRyYW5zbWl0IGVycm9ycyBhcyByZXBvcnRlZCBieSB0aGUgQ0FOIGRyaXZlci4NCisJICogQHJldHVybiBUaGlzIHNob3VsZCByZXR1cm4gMCBpZiBhbGwgc3RhdHVzIHdhcyByZXRyaWV2ZWQgc3VjY2Vzc2Z1bGx5IG9yIGFuIGVycm9yIGNvZGUgaWYgbm90Lg0KKwkgKi8NCisJdmlydHVhbCBpbnQzMl90IGdldFN0YXR1cyh1aW50MzJfdCAmYnVzT2ZmQ291bnQsIHVpbnQzMl90ICZ0eEZ1bGxDb3VudCwgdWludDMyX3QgJnJlY2VpdmVFcnJvckNvdW50LCB1aW50MzJfdCAmdHJhbnNtaXRFcnJvckNvdW50KSB7cmV0dXJuIDA7fQ0KKyNlbmRpZg0KK307DQorDQorLyoqDQorICogVGhpcyBmdW5jdGlvbiBhbGxvd3MgeW91IHRvIHJlZ2lzdGVyIGEgQ0FOSW50ZXJmYWNlUGx1Z2luIHRvIHByb3ZpZGUgYWNjZXNzIGEgQ0FOIGJ1cy4NCisgKiANCisgKiBAcGFyYW0gaW50ZXJmYWNlIEEgcG9pbnRlciB0byBhbiBvYmplY3QgdGhhdCBpbmhlcml0cyBmcm9tIENBTkludGVyZmFjZVBsdWdpbiBhbmQgaW1wbGVtZW50cw0KKyAqIHRoZSBwdXJlIHZpcnR1YWwgaW50ZXJmYWNlLiAgSWYgTlVMTCwgdW5yZWdpc3RlciB0aGUgY3VycmVudCBwbHVnaW4uDQorICovDQordm9pZCBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fQ0FOU2Vzc2lvbk11eF9yZWdpc3RlckludGVyZmFjZShDQU5JbnRlcmZhY2VQbHVnaW4qIGludGVyZmFjZSk7DQorDQorI2VuZGlmIC8vIF9fQ0FOSW50ZXJmYWNlUGx1Z2luX2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL05ldHdvcmtDb21tdW5pY2F0aW9uL0NBTlNlc3Npb25NdXguaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL05ldHdvcmtDb21tdW5pY2F0aW9uL0NBTlNlc3Npb25NdXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjhhNmYxCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvTmV0d29ya0NvbW11bmljYXRpb24vQ0FOU2Vzc2lvbk11eC5oCkBAIC0wLDAgKzEsNjQgQEAKKy8vIENBTlNlc3Npb25NdXguaA0KKy8vDQorLy8gIERlZmluZXMgdGhlIEFQSSBmb3IgYnVpbGRpbmcgYSBDQU4gSW50ZXJmYWNlIFBsdWdpbiB0byBzdXBwb3J0DQorLy8gICAgUFdNLWNhYmxlLWZyZWUgQ0FOIG1vdG9yIGNvbnRyb2wgb24gRlJDIHJvYm90cy4gIFRoaXMgYWxsb3dzIHlvdQ0KKy8vICAgIHRvIGNvbm5lY3QgYW55IENBTiBpbnRlcmZhY2UgdG8gdGhlIHNlY3VyZSBKYWd1YXIgQ0FOIGRyaXZlci4NCisvLw0KKw0KKyNpZm5kZWYgX19DQU5TZXNzaW9uTXV4X2hfXw0KKyNkZWZpbmUgX19DQU5TZXNzaW9uTXV4X2hfXw0KKw0KKyNpZiBkZWZpbmVkKF9fdnh3b3JrcykNCisjaW5jbHVkZSA8dnhXb3Jrcy5oPg0KKyNlbHNlDQorI2luY2x1ZGUgPHN0ZGludC5oPg0KKyNlbmRpZg0KKw0KKyNkZWZpbmUgQ0FOX1NFTkRfUEVSSU9EX05PX1JFUEVBVCAwDQorI2RlZmluZSBDQU5fU0VORF9QRVJJT0RfU1RPUF9SRVBFQVRJTkcgLTENCisNCisvKiBGbGFncyBpbiB0aGUgdXBwZXIgYml0cyBvZiB0aGUgbWVzc2FnZUlEICovDQorI2RlZmluZSBDQU5fSVNfRlJBTUVfUkVNT1RFIDB4ODAwMDAwMDANCisjZGVmaW5lIENBTl9JU19GUkFNRV8xMUJJVCAgMHg0MDAwMDAwMA0KKw0KKyNkZWZpbmUgRVJSX0NBTlNlc3Npb25NdXhfSW52YWxpZEJ1ZmZlciAgIC00NDA4Ng0KKyNkZWZpbmUgRVJSX0NBTlNlc3Npb25NdXhfTWVzc2FnZU5vdEZvdW5kIC00NDA4Nw0KKyNkZWZpbmUgV0FSTl9DQU5TZXNzaW9uTXV4X05vVG9rZW4gICAgICAgICA0NDA4Nw0KKyNkZWZpbmUgRVJSX0NBTlNlc3Npb25NdXhfTm90QWxsb3dlZCAgICAgIC00NDA4OA0KKyNkZWZpbmUgRVJSX0NBTlNlc3Npb25NdXhfTm90SW5pdGlhbGl6ZWQgIC00NDA4OQ0KKyNkZWZpbmUgRVJSX0NBTlNlc3Npb25NdXhfU2Vzc2lvbk92ZXJydW4gICA0NDA1MA0KKw0KK3N0cnVjdCB0Q0FOU3RyZWFtTWVzc2FnZXsNCisJdWludDMyX3QgbWVzc2FnZUlEOw0KKwl1aW50MzJfdCB0aW1lU3RhbXA7DQorCXVpbnQ4X3QgZGF0YVs4XTsNCisJdWludDhfdCBkYXRhU2l6ZTsNCit9Ow0KKw0KK25hbWVzcGFjZSBuQ0FOU2Vzc2lvbk11eA0KK3sNCisJdm9pZCBzZW5kTWVzc2FnZV93cmFwcGVyKHVpbnQzMl90IG1lc3NhZ2VJRCwgY29uc3QgdWludDhfdCAqZGF0YSwgdWludDhfdCBkYXRhU2l6ZSwgaW50MzJfdCBwZXJpb2RNcywgaW50MzJfdCAqc3RhdHVzKTsNCisJdm9pZCByZWNlaXZlTWVzc2FnZV93cmFwcGVyKHVpbnQzMl90ICptZXNzYWdlSUQsIHVpbnQzMl90IG1lc3NhZ2VJRE1hc2ssIHVpbnQ4X3QgKmRhdGEsIHVpbnQ4X3QgKmRhdGFTaXplLCB1aW50MzJfdCAqdGltZVN0YW1wLCBpbnQzMl90ICpzdGF0dXMpOw0KKwl2b2lkIG9wZW5TdHJlYW1TZXNzaW9uKHVpbnQzMl90ICpzZXNzaW9uSGFuZGxlLCB1aW50MzJfdCBtZXNzYWdlSUQsIHVpbnQzMl90IG1lc3NhZ2VJRE1hc2ssIHVpbnQzMl90IG1heE1lc3NhZ2VzLCBpbnQzMl90ICpzdGF0dXMpOw0KKwl2b2lkIGNsb3NlU3RyZWFtU2Vzc2lvbih1aW50MzJfdCBzZXNzaW9uSGFuZGxlKTsNCisJdm9pZCByZWFkU3RyZWFtU2Vzc2lvbih1aW50MzJfdCBzZXNzaW9uSGFuZGxlLCBzdHJ1Y3QgdENBTlN0cmVhbU1lc3NhZ2UgKm1lc3NhZ2VzLCB1aW50MzJfdCBtZXNzYWdlc1RvUmVhZCwgdWludDMyX3QgKm1lc3NhZ2VzUmVhZCwgaW50MzJfdCAqc3RhdHVzKTsNCisJdm9pZCBnZXRDQU5TdGF0dXMoZmxvYXQgKnBlcmNlbnRCdXNVdGlsaXphdGlvbiwgdWludDMyX3QgKmJ1c09mZkNvdW50LCB1aW50MzJfdCAqdHhGdWxsQ291bnQsIHVpbnQzMl90ICpyZWNlaXZlRXJyb3JDb3VudCwgdWludDMyX3QgKnRyYW5zbWl0RXJyb3JDb3VudCwgaW50MzJfdCAqc3RhdHVzKTsNCit9DQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorZXh0ZXJuICJDIg0KK3sNCisjZW5kaWYNCisNCisJdm9pZCBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fQ0FOU2Vzc2lvbk11eF9zZW5kTWVzc2FnZSh1aW50MzJfdCBtZXNzYWdlSUQsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHVpbnQ4X3QgZGF0YVNpemUsIGludDMyX3QgcGVyaW9kTXMsIGludDMyX3QgKnN0YXR1cyk7DQorCXZvaWQgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0NBTlNlc3Npb25NdXhfcmVjZWl2ZU1lc3NhZ2UodWludDMyX3QgKm1lc3NhZ2VJRCwgdWludDMyX3QgbWVzc2FnZUlETWFzaywgdWludDhfdCAqZGF0YSwgdWludDhfdCAqZGF0YVNpemUsIHVpbnQzMl90ICp0aW1lU3RhbXAsIGludDMyX3QgKnN0YXR1cyk7DQorCXZvaWQgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0NBTlNlc3Npb25NdXhfb3BlblN0cmVhbVNlc3Npb24odWludDMyX3QgKnNlc3Npb25IYW5kbGUsIHVpbnQzMl90IG1lc3NhZ2VJRCwgdWludDMyX3QgbWVzc2FnZUlETWFzaywgdWludDMyX3QgbWF4TWVzc2FnZXMsIGludDMyX3QgKnN0YXR1cyk7DQorCXZvaWQgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0NBTlNlc3Npb25NdXhfY2xvc2VTdHJlYW1TZXNzaW9uKHVpbnQzMl90IHNlc3Npb25IYW5kbGUpOw0KKwl2b2lkIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9DQU5TZXNzaW9uTXV4X3JlYWRTdHJlYW1TZXNzaW9uKHVpbnQzMl90IHNlc3Npb25IYW5kbGUsIHN0cnVjdCB0Q0FOU3RyZWFtTWVzc2FnZSAqbWVzc2FnZXMsIHVpbnQzMl90IG1lc3NhZ2VzVG9SZWFkLCB1aW50MzJfdCAqbWVzc2FnZXNSZWFkLCBpbnQzMl90ICpzdGF0dXMpOw0KKwl2b2lkIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9DQU5TZXNzaW9uTXV4X2dldENBTlN0YXR1cyhmbG9hdCAqcGVyY2VudEJ1c1V0aWxpemF0aW9uLCB1aW50MzJfdCAqYnVzT2ZmQ291bnQsIHVpbnQzMl90ICp0eEZ1bGxDb3VudCwgdWludDMyX3QgKnJlY2VpdmVFcnJvckNvdW50LCB1aW50MzJfdCAqdHJhbnNtaXRFcnJvckNvdW50LCBpbnQzMl90ICpzdGF0dXMpOw0KKw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK30NCisjZW5kaWYNCisNCisjZW5kaWYgLy8gX19DQU5TZXNzaW9uTXV4X2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL05ldHdvcmtDb21tdW5pY2F0aW9uL0ZSQ0NvbW0uaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL05ldHdvcmtDb21tdW5pY2F0aW9uL0ZSQ0NvbW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzA4MTM2Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvTmV0d29ya0NvbW11bmljYXRpb24vRlJDQ29tbS5oCkBAIC0wLDAgKzEsMTI5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIAkJCQkJTk9USUNFDQorICogDQorICogCVRoZXNlIGFyZSB0aGUgb25seSBleHRlcm5hbGx5IGV4cG9zZWQgZnVuY3Rpb25zIHRvIHRoZQ0KKyAqICAgTmV0d29ya0NvbW11bmljYXRpb24gbGlicmFyeQ0KKyAqIA0KKyAqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgRlJDIFNwZWMgZm9yIENvbW0gUHJvdG9jb2wNCisgKiBSZXZpc2lvbiA0LjUsIEp1bmUgMzAsIDIwMDgNCisgKg0KKyAqIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorICogDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2lmbmRlZiBfX0ZSQ19DT01NX0hfXw0KKyNkZWZpbmUgX19GUkNfQ09NTV9IX18NCisNCisjaWZkZWYgU0lNVUxBVElPTg0KKyNpbmNsdWRlIDx2eFdvcmtzX2NvbXBhdC5oPg0KKyNpZmRlZiBVU0VfVEhSSUZUDQorI2RlZmluZSBFWFBPUlRfRlVOQw0KKyNlbHNlDQorI2RlZmluZSBFWFBPUlRfRlVOQyBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgX19jZGVjbA0KKyNlbmRpZg0KKyNlbHNlDQorI2lmIGRlZmluZWQoX192eHdvcmtzKQ0KKyNpbmNsdWRlIDx2eFdvcmtzLmg+DQorI2RlZmluZSBFWFBPUlRfRlVOQw0KKyNlbHNlDQorI2luY2x1ZGUgPHN0ZGludC5oPg0KKyNpbmNsdWRlIDxwdGhyZWFkLmg+DQorI2RlZmluZSBFWFBPUlRfRlVOQw0KKyNlbmRpZg0KKyNlbmRpZg0KKw0KKyNkZWZpbmUgRVJSX0ZSQ1N5c3RlbV9OZXRDb21tTm90UmVzcG9uZGluZyAtNDQwNDkNCisjZGVmaW5lIEVSUl9GUkNTeXN0ZW1fTm9EU0Nvbm5lY3Rpb24gLTQ0MDE4DQorDQorZW51bSBBbGxpYW5jZVN0YXRpb25JRF90IHsNCisJa0FsbGlhbmNlU3RhdGlvbklEX3JlZDEsDQorCWtBbGxpYW5jZVN0YXRpb25JRF9yZWQyLA0KKwlrQWxsaWFuY2VTdGF0aW9uSURfcmVkMywNCisJa0FsbGlhbmNlU3RhdGlvbklEX2JsdWUxLA0KKwlrQWxsaWFuY2VTdGF0aW9uSURfYmx1ZTIsDQorCWtBbGxpYW5jZVN0YXRpb25JRF9ibHVlMywNCit9Ow0KKw0KK2VudW0gTWF0Y2hUeXBlX3Qgew0KKwlrTWF0Y2hUeXBlX25vbmUsDQorCWtNYXRjaFR5cGVfcHJhY3RpY2UsDQorCWtNYXRjaFR5cGVfcXVhbGlmaWNhdGlvbiwNCisJa01hdGNoVHlwZV9lbGltaW5hdGlvbiwNCit9Ow0KKw0KK3N0cnVjdCBDb250cm9sV29yZF90IHsNCisjaWZuZGVmIF9fdnh3b3Jrcw0KKwl1aW50MzJfdCBlbmFibGVkIDogMTsNCisJdWludDMyX3QgYXV0b25vbW91cyA6IDE7DQorCXVpbnQzMl90IHRlc3QgOjE7DQorCXVpbnQzMl90IGVTdG9wIDogMTsNCisJdWludDMyX3QgZm1zQXR0YWNoZWQ6MTsNCisJdWludDMyX3QgZHNBdHRhY2hlZDoxOw0KKwl1aW50MzJfdCBjb250cm9sX3Jlc2VydmVkIDogMjY7DQorI2Vsc2UNCisJdWludDMyX3QgY29udHJvbF9yZXNlcnZlZCA6IDI2Ow0KKwl1aW50MzJfdCBkc0F0dGFjaGVkOjE7DQorCXVpbnQzMl90IGZtc0F0dGFjaGVkOjE7DQorCXVpbnQzMl90IGVTdG9wIDogMTsNCisJdWludDMyX3QgdGVzdCA6MTsNCisJdWludDMyX3QgYXV0b25vbW91cyA6IDE7DQorCXVpbnQzMl90IGVuYWJsZWQgOiAxOw0KKyNlbmRpZg0KK307DQorDQorc3RydWN0IEpveXN0aWNrQXhlc190IHsNCisJdWludDE2X3QgY291bnQ7DQorCWludDE2X3QgYXhlc1sxXTsNCit9Ow0KKw0KK3N0cnVjdCBKb3lzdGlja1BPVl90IHsNCisJdWludDE2X3QgY291bnQ7DQorCWludDE2X3QgcG92c1sxXTsNCit9Ow0KKw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK2V4dGVybiAiQyIgew0KKyNlbmRpZg0KKwlpbnQgRVhQT1JUX0ZVTkMgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX1Jlc2VydmUodm9pZCAqaW5zdGFuY2UpOw0KKyNpZm5kZWYgU0lNVUxBVElPTg0KKwl2b2lkIEVYUE9SVF9GVU5DIGdldEZQR0FIYXJkd2FyZVZlcnNpb24odWludDE2X3QgKmZwZ2FWZXJzaW9uLCB1aW50MzJfdCAqZnBnYVJldmlzaW9uKTsNCisjZW5kaWYNCisJaW50IEVYUE9SVF9GVU5DIHNldFN0YXR1c0RhdGEoZmxvYXQgYmF0dGVyeSwgdWludDhfdCBkc0RpZ2l0YWxPdXQsIHVpbnQ4X3QgdXBkYXRlTnVtYmVyLA0KKwkJCWNvbnN0IGNoYXIgKnVzZXJEYXRhSGlnaCwgaW50IHVzZXJEYXRhSGlnaExlbmd0aCwNCisJCQljb25zdCBjaGFyICp1c2VyRGF0YUxvdywgaW50IHVzZXJEYXRhTG93TGVuZ3RoLCBpbnQgd2FpdF9tcyk7DQorCWludCBFWFBPUlRfRlVOQyBzZXRFcnJvckRhdGEoY29uc3QgY2hhciAqZXJyb3JzLCBpbnQgZXJyb3JzTGVuZ3RoLCBpbnQgd2FpdF9tcyk7DQorCQ0KKyNpZmRlZiBTSU1VTEFUSU9ODQorCXZvaWQgRVhQT1JUX0ZVTkMgc2V0TmV3RGF0YVNlbShIQU5ETEUpOw0KKyNlbHNlDQorIyBpZiBkZWZpbmVkIChfX3Z4d29ya3MpDQorCXZvaWQgRVhQT1JUX0ZVTkMgc2V0TmV3RGF0YVNlbShTRU1fSUQpOw0KKyMgZWxzZQ0KKwl2b2lkIEVYUE9SVF9GVU5DIHNldE5ld0RhdGFTZW0ocHRocmVhZF9jb25kX3QgKik7DQorIyBlbmRpZg0KKyNlbmRpZg0KKw0KKwkvLyB0aGlzIHVpbnQzMl90IGlzIHJlYWxseSBhIExWUmVmTnVtDQorCWludCBFWFBPUlRfRlVOQyBzZXROZXdEYXRhT2NjdXJSZWYodWludDMyX3QgcmVmbnVtKTsNCisNCisJaW50IEVYUE9SVF9GVU5DIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9nZXRDb250cm9sV29yZChzdHJ1Y3QgQ29udHJvbFdvcmRfdCAqY29udHJvbFdvcmQpOw0KKwlpbnQgRVhQT1JUX0ZVTkMgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX2dldEFsbGlhbmNlU3RhdGlvbihlbnVtIEFsbGlhbmNlU3RhdGlvbklEX3QgKmFsbGlhbmNlU3RhdGlvbik7DQorCWludCBFWFBPUlRfRlVOQyBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fZ2V0TWF0Y2hUaW1lKGZsb2F0ICptYXRjaFRpbWUpOw0KKwlpbnQgRVhQT1JUX0ZVTkMgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX2dldEpveXN0aWNrQXhlcyh1aW50OF90IGpveXN0aWNrTnVtLCBzdHJ1Y3QgSm95c3RpY2tBeGVzX3QgKmF4ZXMsIHVpbnQ4X3QgbWF4QXhlcyk7DQorCWludCBFWFBPUlRfRlVOQyBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fZ2V0Sm95c3RpY2tCdXR0b25zKHVpbnQ4X3Qgam95c3RpY2tOdW0sIHVpbnQzMl90ICpidXR0b25zLCB1aW50OF90ICpjb3VudCk7DQorCWludCBFWFBPUlRfRlVOQyBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fZ2V0Sm95c3RpY2tQT1ZzKHVpbnQ4X3Qgam95c3RpY2tOdW0sIHN0cnVjdCBKb3lzdGlja1BPVl90ICpwb3ZzLCB1aW50OF90IG1heFBPVnMpOw0KKwlpbnQgRVhQT1JUX0ZVTkMgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX3NldEpveXN0aWNrT3V0cHV0cyh1aW50OF90IGpveXN0aWNrTnVtLCB1aW50MzJfdCBoaWRPdXRwdXRzLCB1aW50MTZfdCBsZWZ0UnVtYmxlLCB1aW50MTZfdCByaWdodFJ1bWJsZSk7DQorCWludCBFWFBPUlRfRlVOQyBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fZ2V0Sm95c3RpY2tEZXNjKHVpbnQ4X3Qgam95c3RpY2tOdW0sIHVpbnQ4X3QgKmlzWEJveCwgdWludDhfdCAqdHlwZSwgY2hhciAqbmFtZSwNCisJCXVpbnQ4X3QgKmF4aXNDb3VudCwgdWludDhfdCAqYXhpc1R5cGVzLCB1aW50OF90ICpidXR0b25Db3VudCwgdWludDhfdCAqcG92Q291bnQpOw0KKw0KKwl2b2lkIEVYUE9SVF9GVU5DIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9nZXRWZXJzaW9uU3RyaW5nKGNoYXIgKnZlcnNpb24pOw0KKwlpbnQgRVhQT1JUX0ZVTkMgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX29ic2VydmVVc2VyUHJvZ3JhbVN0YXJ0aW5nKHZvaWQpOw0KKwl2b2lkIEVYUE9SVF9GVU5DIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9vYnNlcnZlVXNlclByb2dyYW1EaXNhYmxlZCh2b2lkKTsNCisJdm9pZCBFWFBPUlRfRlVOQyBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fb2JzZXJ2ZVVzZXJQcm9ncmFtQXV0b25vbW91cyh2b2lkKTsNCisJdm9pZCBFWFBPUlRfRlVOQyBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fb2JzZXJ2ZVVzZXJQcm9ncmFtVGVsZW9wKHZvaWQpOw0KKwl2b2lkIEVYUE9SVF9GVU5DIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9vYnNlcnZlVXNlclByb2dyYW1UZXN0KHZvaWQpOw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK30NCisjZW5kaWYNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9OZXR3b3JrQ29tbXVuaWNhdGlvbi9Mb2FkT3V0LmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9OZXR3b3JrQ29tbXVuaWNhdGlvbi9Mb2FkT3V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNlODhhMgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL05ldHdvcmtDb21tdW5pY2F0aW9uL0xvYWRPdXQuaApAQCAtMCwwICsxLDU4IEBACisNCisjaWZuZGVmIF9fTG9hZE91dF9oX18NCisjZGVmaW5lIF9fTG9hZE91dF9oX18NCisNCisjaWZkZWYgU0lNVUxBVElPTg0KKyNpbmNsdWRlIDx2eFdvcmtzX2NvbXBhdC5oPg0KKyNkZWZpbmUgRVhQT1JUX0ZVTkMgX19kZWNsc3BlYyhkbGxleHBvcnQpIF9fY2RlY2wNCisjZWxpZiBkZWZpbmVkIChfX3Z4d29ya3MpDQorI2luY2x1ZGUgPHZ4V29ya3MuaD4NCisjZGVmaW5lIEVYUE9SVF9GVU5DDQorI2Vsc2UNCisjaW5jbHVkZSA8c3RkaW50Lmg+DQorI2RlZmluZSBFWFBPUlRfRlVOQw0KKyNlbmRpZg0KKw0KKyNkZWZpbmUga01heE1vZHVsZU51bWJlciAyDQorbmFtZXNwYWNlIG5Mb2FkT3V0DQorew0KKyNpZiBkZWZpbmVkKF9fdnh3b3JrcykgfHwgZGVmaW5lZChTSU1VTEFUSU9OKQ0KKyAgICB0eXBlZGVmIGVudW0gew0KKyAgICAgICAga01vZHVsZVR5cGVfVW5rbm93biA9IDB4MDAsDQorICAgICAgICBrTW9kdWxlVHlwZV9BbmFsb2cgPSAweDAxLA0KKyAgICAgICAga01vZHVsZVR5cGVfRGlnaXRhbCA9IDB4MDIsDQorICAgICAgICBrTW9kdWxlVHlwZV9Tb2xlbm9pZCA9IDB4MDMsDQorICAgIH0gdE1vZHVsZVR5cGU7DQorICAgIGJvb2wgRVhQT1JUX0ZVTkMgZ2V0TW9kdWxlUHJlc2VuY2UodE1vZHVsZVR5cGUgbW9kdWxlVHlwZSwgdWludDhfdCBtb2R1bGVOdW1iZXIpOw0KKyNlbmRpZg0KKyAgICB0eXBlZGVmIGVudW0gew0KKyAgICAgICAga1RhcmdldENsYXNzX1Vua25vd24gPSAweDAwLA0KKyAgICAgICAga1RhcmdldENsYXNzX0ZSQzEgPSAweDEwLA0KKyAgICAgICAga1RhcmdldENsYXNzX0ZSQzIgPSAweDIwLA0KKyAgICAgICAga1RhcmdldENsYXNzX0ZSQzMgPSAweDMwLA0KKyAgICAgICAga1RhcmdldENsYXNzX1JvYm9SSU8gPSAweDQwLA0KKyNpZiBkZWZpbmVkKF9fdnh3b3JrcykgfHwgZGVmaW5lZChTSU1VTEFUSU9OKQ0KKyAgICAgICAga1RhcmdldENsYXNzX0ZSQzJfQW5hbG9nID0ga1RhcmdldENsYXNzX0ZSQzIgfCBrTW9kdWxlVHlwZV9BbmFsb2csDQorICAgICAgICBrVGFyZ2V0Q2xhc3NfRlJDMl9EaWdpdGFsID0ga1RhcmdldENsYXNzX0ZSQzIgfCBrTW9kdWxlVHlwZV9EaWdpdGFsLA0KKyAgICAgICAga1RhcmdldENsYXNzX0ZSQzJfU29sZW5vaWQgPSBrVGFyZ2V0Q2xhc3NfRlJDMiB8IGtNb2R1bGVUeXBlX1NvbGVub2lkLA0KKyNlbmRpZg0KKyAgICAgICAga1RhcmdldENsYXNzX0ZhbWlseU1hc2sgPSAweEYwLA0KKyAgICAgICAga1RhcmdldENsYXNzX01vZHVsZU1hc2sgPSAweDBGLA0KKyAgICB9IHRUYXJnZXRDbGFzczsNCisgICAgdFRhcmdldENsYXNzIEVYUE9SVF9GVU5DIGdldFRhcmdldENsYXNzKCk7DQorfQ0KKw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK2V4dGVybiAiQyIgew0KKyNlbmRpZg0KKw0KKyNpZiBkZWZpbmVkKF9fdnh3b3JrcykgfHwgZGVmaW5lZChTSU1VTEFUSU9OKQ0KKyAgICB1aW50MzJfdCBFWFBPUlRfRlVOQyBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fbkxvYWRPdXRfZ2V0TW9kdWxlUHJlc2VuY2UodWludDMyX3QgbW9kdWxlVHlwZSwgdWludDhfdCBtb2R1bGVOdW1iZXIpOw0KKyNlbmRpZg0KKyAgICB1aW50MzJfdCBFWFBPUlRfRlVOQyBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fbkxvYWRPdXRfZ2V0VGFyZ2V0Q2xhc3MoKTsNCisNCisjaWZkZWYgX19jcGx1c3BsdXMNCit9DQorI2VuZGlmDQorDQorI2VuZGlmIC8vIF9fTG9hZE91dF9oX18NCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9OZXR3b3JrQ29tbXVuaWNhdGlvbi9Vc2FnZVJlcG9ydGluZy5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvTmV0d29ya0NvbW11bmljYXRpb24vVXNhZ2VSZXBvcnRpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWMyYTNhCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvTmV0d29ya0NvbW11bmljYXRpb24vVXNhZ2VSZXBvcnRpbmcuaApAQCAtMCwwICsxLDE0MyBAQAorDQorI2lmbmRlZiBfX1VzYWdlUmVwb3J0aW5nX2hfXw0KKyNkZWZpbmUgX19Vc2FnZVJlcG9ydGluZ19oX18NCisNCisjaWZkZWYgU0lNVUxBVElPTg0KKyNpbmNsdWRlIDx2eFdvcmtzX2NvbXBhdC5oPg0KKyNkZWZpbmUgRVhQT1JUX0ZVTkMgX19kZWNsc3BlYyhkbGxleHBvcnQpIF9fY2RlY2wNCisjZWxpZiBkZWZpbmVkIChfX3Z4d29ya3MpDQorI2luY2x1ZGUgPHZ4V29ya3MuaD4NCisjZGVmaW5lIEVYUE9SVF9GVU5DDQorI2Vsc2UNCisjaW5jbHVkZSA8c3RkaW50Lmg+DQorI2luY2x1ZGUgPHN0ZGxpYi5oPg0KKyNkZWZpbmUgRVhQT1JUX0ZVTkMNCisjZW5kaWYNCisNCisjZGVmaW5lIGtVc2FnZVJlcG9ydGluZ192ZXJzaW9uIDENCisNCituYW1lc3BhY2UgblVzYWdlUmVwb3J0aW5nDQorew0KKyAgICB0eXBlZGVmIGVudW0NCisgICAgew0KKyAgICAgICAga1Jlc291cmNlVHlwZV9Db250cm9sbGVyLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9Nb2R1bGUsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0xhbmd1YWdlLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9DQU5QbHVnaW4sDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0FjY2VsZXJvbWV0ZXIsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0FEWEwzNDUsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0FuYWxvZ0NoYW5uZWwsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0FuYWxvZ1RyaWdnZXIsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0FuYWxvZ1RyaWdnZXJPdXRwdXQsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0NBTkphZ3VhciwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfQ29tcHJlc3NvciwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfQ291bnRlciwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfRGFzaGJvYXJkLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9EaWdpdGFsSW5wdXQsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0RpZ2l0YWxPdXRwdXQsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0RyaXZlclN0YXRpb25DSU8sDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0RyaXZlclN0YXRpb25FSU8sDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0RyaXZlclN0YXRpb25MQ0QsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0VuY29kZXIsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0dlYXJUb290aCwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfR3lybywNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfSTJDLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9GcmFtZXdvcmssDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0phZ3VhciwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfSm95c3RpY2ssDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0tpbmVjdCwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfS2luZWN0U3RpY2ssDQorICAgICAgICBrUmVzb3VyY2VUeXBlX1BJRENvbnRyb2xsZXIsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX1ByZWZlcmVuY2VzLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9QV00sDQorICAgICAgICBrUmVzb3VyY2VUeXBlX1JlbGF5LA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9Sb2JvdERyaXZlLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9TZXJpYWxQb3J0LA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9TZXJ2bywNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfU29sZW5vaWQsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX1NQSSwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfVGFzaywNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfVWx0cmFzb25pYywNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfVmljdG9yLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9CdXR0b24sDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0NvbW1hbmQsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0F4aXNDYW1lcmEsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX1BDVmlkZW9TZXJ2ZXIsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX1NtYXJ0RGFzaGJvYXJkLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9UYWxvbiwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfSGlUZWNobmljQ29sb3JTZW5zb3IsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0hpVGVjaG5pY0FjY2VsLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9IaVRlY2huaWNDb21wYXNzLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9TUkYwOCwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfQW5hbG9nT3V0cHV0LA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9WaWN0b3JTUCwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfVGFsb25TUlgsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0NBTlRhbG9uU1JYLA0KKyAgICB9IHRSZXNvdXJjZVR5cGU7DQorDQorICAgIHR5cGVkZWYgZW51bQ0KKyAgICB7DQorICAgICAgICBrTGFuZ3VhZ2VfTGFiVklFVyA9IDEsDQorICAgICAgICBrTGFuZ3VhZ2VfQ1BsdXNQbHVzID0gMiwNCisgICAgICAgIGtMYW5ndWFnZV9KYXZhID0gMywNCisgICAgICAgIGtMYW5ndWFnZV9QeXRob24gPSA0LA0KKw0KKyAgICAgICAga0NBTlBsdWdpbl9CbGFja0phZ0JyaWRnZSA9IDEsDQorICAgICAgICBrQ0FOUGx1Z2luXzJDQU4gPSAyLA0KKw0KKyAgICAgICAga0ZyYW1ld29ya19JdGVyYXRpdmUgPSAxLA0KKyAgICAgICAga0ZyYW1ld29ya19TaW1wbGUgPSAyLA0KKw0KKyAgICAgICAga1JvYm90RHJpdmVfQXJjYWRlU3RhbmRhcmQgPSAxLA0KKyAgICAgICAga1JvYm90RHJpdmVfQXJjYWRlQnV0dG9uU3BpbiA9IDIsDQorICAgICAgICBrUm9ib3REcml2ZV9BcmNhZGVSYXRpb0N1cnZlID0gMywNCisgICAgICAgIGtSb2JvdERyaXZlX1RhbmsgPSA0LA0KKyAgICAgICAga1JvYm90RHJpdmVfTWVjYW51bVBvbGFyID0gNSwNCisgICAgICAgIGtSb2JvdERyaXZlX01lY2FudW1DYXJ0ZXNpYW4gPSA2LA0KKw0KKyAgICAgICAga0RyaXZlclN0YXRpb25DSU9fQW5hbG9nID0gMSwNCisgICAgICAgIGtEcml2ZXJTdGF0aW9uQ0lPX0RpZ2l0YWxJbiA9IDIsDQorICAgICAgICBrRHJpdmVyU3RhdGlvbkNJT19EaWdpdGFsT3V0ID0gMywNCisNCisgICAgICAgIGtEcml2ZXJTdGF0aW9uRUlPX0FjY2VsZXJhdGlvbiA9IDEsDQorICAgICAgICBrRHJpdmVyU3RhdGlvbkVJT19BbmFsb2dJbiA9IDIsDQorICAgICAgICBrRHJpdmVyU3RhdGlvbkVJT19BbmFsb2dPdXQgPSAzLA0KKyAgICAgICAga0RyaXZlclN0YXRpb25FSU9fQnV0dG9uID0gNCwNCisgICAgICAgIGtEcml2ZXJTdGF0aW9uRUlPX0xFRCA9IDUsDQorICAgICAgICBrRHJpdmVyU3RhdGlvbkVJT19EaWdpdGFsSW4gPSA2LA0KKyAgICAgICAga0RyaXZlclN0YXRpb25FSU9fRGlnaXRhbE91dCA9IDcsDQorICAgICAgICBrRHJpdmVyU3RhdGlvbkVJT19GaXhlZERpZ2l0YWxPdXQgPSA4LA0KKyAgICAgICAga0RyaXZlclN0YXRpb25FSU9fUFdNID0gOSwNCisgICAgICAgIGtEcml2ZXJTdGF0aW9uRUlPX0VuY29kZXIgPSAxMCwNCisgICAgICAgIGtEcml2ZXJTdGF0aW9uRUlPX1RvdWNoU2xpZGVyID0gMTEsDQorDQorICAgICAgICBrQURYTDM0NV9TUEkgPSAxLA0KKyAgICAgICAga0FEWEwzNDVfSTJDID0gMiwNCisNCisgICAgICAgIGtDb21tYW5kX1NjaGVkdWxlciA9IDEsDQorDQorICAgICAgICBrU21hcnREYXNoYm9hcmRfSW5zdGFuY2UgPSAxLA0KKyAgICB9IHRJbnN0YW5jZXM7DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXBvcnQgdGhlIHVzYWdlIG9mIGEgcmVzb3VyY2Ugb2YgaW50ZXJlc3QuDQorICAgICAqIA0KKyAgICAgKiBAcGFyYW0gcmVzb3VyY2Ugb25lIG9mIHRoZSB2YWx1ZXMgaW4gdGhlIHRSZXNvdXJjZVR5cGUgYWJvdmUgKG1heCB2YWx1ZSA1MSkuDQorICAgICAqIEBwYXJhbSBpbnN0YW5jZU51bWJlciBhbiBpbmRleCB0aGF0IGlkZW50aWZpZXMgdGhlIHJlc291cmNlIGluc3RhbmNlLg0KKyAgICAgKiBAcGFyYW0gY29udGV4dCBhbiBvcHRpb25hbCBhZGRpdGlvbmFsIGNvbnRleHQgbnVtYmVyIGZvciBzb21lIGNhc2VzIChzdWNoIGFzIG1vZHVsZSBudW1iZXIpLiAgU2V0IHRvIDAgdG8gb21pdC4NCisgICAgICogQHBhcmFtIGZlYXR1cmUgYSBzdHJpbmcgdG8gYmUgaW5jbHVkZWQgZGVzY3JpYmluZyBmZWF0dXJlcyBpbiB1c2Ugb24gYSBzcGVjaWZpYyByZXNvdXJjZS4gIFNldHRpbmcgdGhlIHNhbWUgcmVzb3VyY2UgbW9yZSB0aGFuIG9uY2UgYWxsb3dzIHlvdSB0byBjaGFuZ2UgdGhlIGZlYXR1cmUgc3RyaW5nLg0KKyAgICAgKi8NCisgICAgdWludDMyX3QgRVhQT1JUX0ZVTkMgcmVwb3J0KHRSZXNvdXJjZVR5cGUgcmVzb3VyY2UsIHVpbnQ4X3QgaW5zdGFuY2VOdW1iZXIsIHVpbnQ4X3QgY29udGV4dCA9IDAsIGNvbnN0IGNoYXIgKmZlYXR1cmUgPSBOVUxMKTsNCit9DQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorZXh0ZXJuICJDIiB7DQorI2VuZGlmDQorDQorICAgIHVpbnQzMl90IEVYUE9SVF9GVU5DIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9uVXNhZ2VSZXBvcnRpbmdfcmVwb3J0KHVpbnQ4X3QgcmVzb3VyY2UsIHVpbnQ4X3QgaW5zdGFuY2VOdW1iZXIsIHVpbnQ4X3QgY29udGV4dCwgY29uc3QgY2hhciAqZmVhdHVyZSk7DQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorfQ0KKyNlbmRpZg0KKw0KKyNlbmRpZiAvLyBfX1VzYWdlUmVwb3J0aW5nX2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL05vdGlmaWVyLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL05vdGlmaWVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTMyNTEyCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvTm90aWZpZXIuY3BwCkBAIC0wLDAgKzEsNDAgQEAKKyNpbmNsdWRlICJIQUwvTm90aWZpZXIuaHBwIgorI2luY2x1ZGUgIkNoaXBPYmplY3QuaCIKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IGtUaW1lckludGVycnVwdE51bWJlciA9IDI4OworCitzdHJ1Y3QgTm90aWZpZXIKK3sKKwl0QWxhcm0gKmFsYXJtOworCXRJbnRlcnJ1cHRNYW5hZ2VyICptYW5hZ2VyOworfTsKKwordm9pZCogaW5pdGlhbGl6ZU5vdGlmaWVyKHZvaWQgKCpQcm9jZXNzUXVldWUpKHVpbnQzMl90LCB2b2lkKiksIGludDMyX3QgKnN0YXR1cykKK3sKKwlOb3RpZmllciogbm90aWZpZXIgPSBuZXcgTm90aWZpZXIoKTsKKwlub3RpZmllci0+bWFuYWdlciA9IG5ldyB0SW50ZXJydXB0TWFuYWdlcigxIDw8IGtUaW1lckludGVycnVwdE51bWJlciwgZmFsc2UsIHN0YXR1cyk7CisJbm90aWZpZXItPm1hbmFnZXItPnJlZ2lzdGVySGFuZGxlcihQcm9jZXNzUXVldWUsIE5VTEwsIHN0YXR1cyk7CisJbm90aWZpZXItPm1hbmFnZXItPmVuYWJsZShzdGF0dXMpOworCW5vdGlmaWVyLT5hbGFybSA9IHRBbGFybTo6Y3JlYXRlKHN0YXR1cyk7CisJcmV0dXJuIG5vdGlmaWVyOworfQorCit2b2lkIGNsZWFuTm90aWZpZXIodm9pZCogbm90aWZpZXJfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKQoreworCU5vdGlmaWVyKiBub3RpZmllciA9IChOb3RpZmllciopbm90aWZpZXJfcG9pbnRlcjsKKwlub3RpZmllci0+YWxhcm0tPndyaXRlRW5hYmxlKGZhbHNlLCBzdGF0dXMpOworCWRlbGV0ZSBub3RpZmllci0+YWxhcm07CisJbm90aWZpZXItPmFsYXJtID0gTlVMTDsKKwlub3RpZmllci0+bWFuYWdlci0+ZGlzYWJsZShzdGF0dXMpOworCWRlbGV0ZSBub3RpZmllci0+bWFuYWdlcjsKKwlub3RpZmllci0+bWFuYWdlciA9IE5VTEw7Cit9CisKK3ZvaWQgdXBkYXRlTm90aWZpZXJBbGFybSh2b2lkKiBub3RpZmllcl9wb2ludGVyLCB1aW50MzJfdCB0cmlnZ2VyVGltZSwgaW50MzJfdCAqc3RhdHVzKQoreworCU5vdGlmaWVyKiBub3RpZmllciA9IChOb3RpZmllciopbm90aWZpZXJfcG9pbnRlcjsKKwkvLyB3cml0ZSB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgcXVldWUgaW50byB0aGUgdHJpZ2dlciB0aW1lCisJbm90aWZpZXItPmFsYXJtLT53cml0ZVRyaWdnZXJUaW1lKHRyaWdnZXJUaW1lLCBzdGF0dXMpOworCS8vIEVuYWJsZSB0aGUgYWxhcm0uICBUaGUgaGFyZHdhcmUgZGlzYWJsZXMgaXRzZWxmIGFmdGVyIGVhY2ggYWxhcm0uCisJbm90aWZpZXItPmFsYXJtLT53cml0ZUVuYWJsZSh0cnVlLCBzdGF0dXMpOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvUERQLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL1BEUC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEyOWMwNgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL1BEUC5jcHAKQEAgLTAsMCArMSw2MSBAQAorI2luY2x1ZGUgIkhBTC9QRFAuaHBwIgorI2luY2x1ZGUgImN0cmUvUERQLmgiCitzdGF0aWMgUERQIHBkcDsKKworZG91YmxlIGdldFBEUFRlbXBlcmF0dXJlKGludDMyX3QgKnN0YXR1cykgeworCWRvdWJsZSB0ZW1wZXJhdHVyZTsKKwkKKwkqc3RhdHVzID0gcGRwLkdldFRlbXBlcmF0dXJlKHRlbXBlcmF0dXJlKTsKKwkKKwlyZXR1cm4gdGVtcGVyYXR1cmU7Cit9CisKK2RvdWJsZSBnZXRQRFBWb2x0YWdlKGludDMyX3QgKnN0YXR1cykgeworCWRvdWJsZSB2b2x0YWdlOworCQorCSpzdGF0dXMgPSBwZHAuR2V0Vm9sdGFnZSh2b2x0YWdlKTsKKwkKKwlyZXR1cm4gdm9sdGFnZTsKK30KKworZG91YmxlIGdldFBEUENoYW5uZWxDdXJyZW50KHVpbnQ4X3QgY2hhbm5lbCwgaW50MzJfdCAqc3RhdHVzKSB7CisJZG91YmxlIGN1cnJlbnQ7CisJCisJKnN0YXR1cyA9IHBkcC5HZXRDaGFubmVsQ3VycmVudChjaGFubmVsLCBjdXJyZW50KTsKKwkKKwlyZXR1cm4gY3VycmVudDsKK30KKworZG91YmxlIGdldFBEUFRvdGFsQ3VycmVudChpbnQzMl90ICpzdGF0dXMpIHsKKwlkb3VibGUgY3VycmVudDsKKwkKKwkqc3RhdHVzID0gcGRwLkdldFRvdGFsQ3VycmVudChjdXJyZW50KTsKKwkKKwlyZXR1cm4gY3VycmVudDsKK30KKworZG91YmxlIGdldFBEUFRvdGFsUG93ZXIoaW50MzJfdCAqc3RhdHVzKSB7CisJZG91YmxlIHBvd2VyOworCQorCSpzdGF0dXMgPSBwZHAuR2V0VG90YWxQb3dlcihwb3dlcik7CisJCisJcmV0dXJuIHBvd2VyOworfQorCitkb3VibGUgZ2V0UERQVG90YWxFbmVyZ3koaW50MzJfdCAqc3RhdHVzKSB7CisJZG91YmxlIGVuZXJneTsKKwkKKwkqc3RhdHVzID0gcGRwLkdldFRvdGFsRW5lcmd5KGVuZXJneSk7CisJCisJcmV0dXJuIGVuZXJneTsKK30KKwordm9pZCByZXNldFBEUFRvdGFsRW5lcmd5KGludDMyX3QgKnN0YXR1cykgeworCSpzdGF0dXMgPSBwZHAuUmVzZXRFbmVyZ3koKTsKK30KKwordm9pZCBjbGVhclBEUFN0aWNreUZhdWx0cyhpbnQzMl90ICpzdGF0dXMpIHsKKwkqc3RhdHVzID0gcGRwLkNsZWFyU3RpY2t5RmF1bHRzKCk7Cit9CisKKwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvUG9ydC5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvUG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NzljMjYKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9Qb3J0LmgKQEAgLTAsMCArMSw3IEBACisjcHJhZ21hIG9uY2UKKwordHlwZWRlZiBzdHJ1Y3QgcG9ydF90Cit7CisJdWludDhfdCBwaW47CisJdWludDhfdCBtb2R1bGU7Cit9IFBvcnQ7CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9Qb3dlci5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9Qb3dlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRkYjA0MwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL1Bvd2VyLmNwcApAQCAtMCwwICsxLDEyNyBAQAorI2luY2x1ZGUgIkhBTC9Qb3dlci5ocHAiCisjaW5jbHVkZSAiQ2hpcE9iamVjdC5oIgorCitzdGF0aWMgdFBvd2VyICpwb3dlciA9IE5VTEw7CisKK3N0YXRpYyB2b2lkIGluaXRpYWxpemVQb3dlcihpbnQzMl90ICpzdGF0dXMpIHsKKwlpZihwb3dlciA9PSBOVUxMKSB7CisJCXBvd2VyID0gdFBvd2VyOjpjcmVhdGUoc3RhdHVzKTsKKwl9Cit9CisKKy8qKgorICogR2V0IHRoZSByb2JvUklPIGlucHV0IHZvbHRhZ2UKKyAqLworZmxvYXQgZ2V0VmluVm9sdGFnZShpbnQzMl90ICpzdGF0dXMpIHsKKwlpbml0aWFsaXplUG93ZXIoc3RhdHVzKTsKKwlyZXR1cm4gcG93ZXItPnJlYWRWaW5Wb2x0YWdlKHN0YXR1cykgLyA0LjA5NmYgKiAwLjAyNTczM2YgLSAwLjAyOWY7Cit9CisKKy8qKgorICogR2V0IHRoZSByb2JvUklPIGlucHV0IGN1cnJlbnQKKyAqLworZmxvYXQgZ2V0VmluQ3VycmVudChpbnQzMl90ICpzdGF0dXMpIHsKKwlpbml0aWFsaXplUG93ZXIoc3RhdHVzKTsKKwlyZXR1cm4gcG93ZXItPnJlYWRWaW5DdXJyZW50KHN0YXR1cykgLyA0LjA5NmYgKiAwLjAxNzA0MiAtIDAuMDcxZjsKK30KKworLyoqCisgKiBHZXQgdGhlIDZWIHJhaWwgdm9sdGFnZQorICovCitmbG9hdCBnZXRVc2VyVm9sdGFnZTZWKGludDMyX3QgKnN0YXR1cykgeworCWluaXRpYWxpemVQb3dlcihzdGF0dXMpOworCXJldHVybiBwb3dlci0+cmVhZFVzZXJWb2x0YWdlNlYoc3RhdHVzKSAvIDQuMDk2ZiAqIDAuMDA3MDE5ZiAtIDAuMDE0ZjsKK30KKworLyoqCisgKiBHZXQgdGhlIDZWIHJhaWwgY3VycmVudAorICovCitmbG9hdCBnZXRVc2VyQ3VycmVudDZWKGludDMyX3QgKnN0YXR1cykgeworCWluaXRpYWxpemVQb3dlcihzdGF0dXMpOworCXJldHVybiBwb3dlci0+cmVhZFVzZXJDdXJyZW50NlYoc3RhdHVzKSAvIDQuMDk2ZiAqIDAuMDA1NTY2ZiAtIDAuMDA5ZjsKK30KKworLyoqCisgKiBHZXQgdGhlIGFjdGl2ZSBzdGF0ZSBvZiB0aGUgNlYgcmFpbAorICovCitib29sIGdldFVzZXJBY3RpdmU2VihpbnQzMl90ICpzdGF0dXMpIHsKKwlpbml0aWFsaXplUG93ZXIoc3RhdHVzKTsKKwlyZXR1cm4gcG93ZXItPnJlYWRTdGF0dXNfVXNlcjZWKHN0YXR1cykgPT0gNDsKK30KKworLyoqCisgKiBHZXQgdGhlIGZhdWx0IGNvdW50IGZvciB0aGUgNlYgcmFpbAorICovCitpbnQgZ2V0VXNlckN1cnJlbnRGYXVsdHM2VihpbnQzMl90ICpzdGF0dXMpIHsKKwlpbml0aWFsaXplUG93ZXIoc3RhdHVzKTsKKwlyZXR1cm4gKGludClwb3dlci0+cmVhZE92ZXJDdXJyZW50RmF1bHRDb3VudHNfT3ZlckN1cnJlbnRGYXVsdENvdW50NlYoc3RhdHVzKTsKK30KKworLyoqCisgKiBHZXQgdGhlIDVWIHJhaWwgdm9sdGFnZQorICovCitmbG9hdCBnZXRVc2VyVm9sdGFnZTVWKGludDMyX3QgKnN0YXR1cykgeworCWluaXRpYWxpemVQb3dlcihzdGF0dXMpOworCXJldHVybiBwb3dlci0+cmVhZFVzZXJWb2x0YWdlNVYoc3RhdHVzKSAvIDQuMDk2ZiAqIDAuMDA1OTYyZiAtIDAuMDEzZjsKK30KKworLyoqCisgKiBHZXQgdGhlIDVWIHJhaWwgY3VycmVudAorICovCitmbG9hdCBnZXRVc2VyQ3VycmVudDVWKGludDMyX3QgKnN0YXR1cykgeworCWluaXRpYWxpemVQb3dlcihzdGF0dXMpOworCXJldHVybiBwb3dlci0+cmVhZFVzZXJDdXJyZW50NVYoc3RhdHVzKSAvIDQuMDk2ZiAqIDAuMDAxOTk2ZiAtIDAuMDAyZjsKK30KKworLyoqCisgKiBHZXQgdGhlIGFjdGl2ZSBzdGF0ZSBvZiB0aGUgNVYgcmFpbAorICovCitib29sIGdldFVzZXJBY3RpdmU1VihpbnQzMl90ICpzdGF0dXMpIHsKKwlpbml0aWFsaXplUG93ZXIoc3RhdHVzKTsKKwlyZXR1cm4gcG93ZXItPnJlYWRTdGF0dXNfVXNlcjVWKHN0YXR1cykgPT0gNDsKK30KKworLyoqCisgKiBHZXQgdGhlIGZhdWx0IGNvdW50IGZvciB0aGUgNVYgcmFpbAorICovCitpbnQgZ2V0VXNlckN1cnJlbnRGYXVsdHM1VihpbnQzMl90ICpzdGF0dXMpIHsKKwlpbml0aWFsaXplUG93ZXIoc3RhdHVzKTsKKwlyZXR1cm4gKGludClwb3dlci0+cmVhZE92ZXJDdXJyZW50RmF1bHRDb3VudHNfT3ZlckN1cnJlbnRGYXVsdENvdW50NVYoc3RhdHVzKTsKK30KKwordW5zaWduZWQgY2hhciBnZXRVc2VyU3RhdHVzNVYoaW50MzJfdCAqc3RhdHVzKSB7CisJaW5pdGlhbGl6ZVBvd2VyKHN0YXR1cyk7CisJcmV0dXJuIHBvd2VyLT5yZWFkU3RhdHVzX1VzZXI1VihzdGF0dXMpOworfQorCisvKioKKyAqIEdldCB0aGUgMy4zViByYWlsIHZvbHRhZ2UKKyAqLworZmxvYXQgZ2V0VXNlclZvbHRhZ2UzVjMoaW50MzJfdCAqc3RhdHVzKSB7CisJaW5pdGlhbGl6ZVBvd2VyKHN0YXR1cyk7CisJcmV0dXJuIHBvd2VyLT5yZWFkVXNlclZvbHRhZ2UzVjMoc3RhdHVzKSAvIDQuMDk2ZiAqIDAuMDA0OTAyZiAtIDAuMDFmOworfQorCisvKioKKyAqIEdldCB0aGUgMy4zViByYWlsIGN1cnJlbnQKKyAqLworZmxvYXQgZ2V0VXNlckN1cnJlbnQzVjMoaW50MzJfdCAqc3RhdHVzKSB7CisJaW5pdGlhbGl6ZVBvd2VyKHN0YXR1cyk7CisJcmV0dXJuIHBvd2VyLT5yZWFkVXNlckN1cnJlbnQzVjMoc3RhdHVzKSAvIDQuMDk2ZiAqIDAuMDAyNDg2ZiAtIDAuMDAzZjsKK30KKworLyoqCisgKiBHZXQgdGhlIGFjdGl2ZSBzdGF0ZSBvZiB0aGUgMy4zViByYWlsCisgKi8KK2Jvb2wgZ2V0VXNlckFjdGl2ZTNWMyhpbnQzMl90ICpzdGF0dXMpIHsKKwlpbml0aWFsaXplUG93ZXIoc3RhdHVzKTsKKwlyZXR1cm4gcG93ZXItPnJlYWRTdGF0dXNfVXNlcjNWMyhzdGF0dXMpID09IDQ7Cit9CisKKy8qKgorICogR2V0IHRoZSBmYXVsdCBjb3VudCBmb3IgdGhlIDMuM1YgcmFpbAorICovCitpbnQgZ2V0VXNlckN1cnJlbnRGYXVsdHMzVjMoaW50MzJfdCAqc3RhdHVzKSB7CisJaW5pdGlhbGl6ZVBvd2VyKHN0YXR1cyk7CisJcmV0dXJuIChpbnQpcG93ZXItPnJlYWRPdmVyQ3VycmVudEZhdWx0Q291bnRzX092ZXJDdXJyZW50RmF1bHRDb3VudDNWMyhzdGF0dXMpOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvU2VtYXBob3JlLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL1NlbWFwaG9yZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYzMGYzYwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL1NlbWFwaG9yZS5jcHAKQEAgLTAsMCArMSwxNTAgQEAKKyNpbmNsdWRlICJIQUwvU2VtYXBob3JlLmhwcCIKKyNpbmNsdWRlICJIQUwvY3BwL1N5bmNocm9uaXplZC5ocHAiCisKKyNpbmNsdWRlICJMb2cuaHBwIgorCisvLyBzZXQgdGhlIGxvZ2dpbmcgbGV2ZWwKK1RMb2dMZXZlbCBzZW1hcGhvcmVMb2dMZXZlbCA9IGxvZ0RFQlVHOworCisjZGVmaW5lIFNFTUFQSE9SRV9MT0cobGV2ZWwpIFwKKyAgICBpZiAobGV2ZWwgPiBzZW1hcGhvcmVMb2dMZXZlbCkgOyBcCisgICAgZWxzZSBMb2coKS5HZXQobGV2ZWwpCisKKy8vIFNlZTogaHR0cDovL3d3dy52eGRldi5jb20vZG9jcy92eDU1bWFuL3Z4d29ya3MvcmVmL3NlbU1MaWIuaHRtbAorY29uc3QgdWludDMyX3QgU0VNQVBIT1JFX1FfRklGTz0gMHgwMTsgLy8gVE9ETzogU3VwcG9ydAorY29uc3QgdWludDMyX3QgU0VNQVBIT1JFX1FfUFJJT1JJVFkgPSAweDAxOyAvLyBUT0RPOiBTdXBwb3J0Citjb25zdCB1aW50MzJfdCBTRU1BUEhPUkVfREVMRVRFX1NBRkUgPSAweDA0OyAvLyBUT0RPOiBTdXBwb3J0Citjb25zdCB1aW50MzJfdCBTRU1BUEhPUkVfSU5WRVJTSU9OX1NBRkUgPSAweDA4OyAvLyBUT0RPOiBTdXBwb3J0CisKK2NvbnN0IGludDMyX3QgU0VNQVBIT1JFX05PX1dBSVQgPSAwOworY29uc3QgaW50MzJfdCBTRU1BUEhPUkVfV0FJVF9GT1JFVkVSID0gLTE7CisKK2NvbnN0IHVpbnQzMl90IFNFTUFQSE9SRV9FTVBUWSA9IDA7Citjb25zdCB1aW50MzJfdCBTRU1BUEhPUkVfRlVMTCA9IDE7CisKK2NsYXNzIE11dGV4SW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBsb2NrKCkgPSAwOworICB2aXJ0dWFsIHZvaWQgdW5sb2NrKCkgPSAwOworICB2aXJ0dWFsIGJvb2wgdHJ5X2xvY2soKSA9IDA7CisgIHZpcnR1YWwgcHRocmVhZF9tdXRleF90ICpuYXRpdmVfaGFuZGxlKCkgPSAwOworICB2aXJ0dWFsIH5NdXRleEludGVyZmFjZSgpIHt9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0ZXhUeXBlPgorY2xhc3MgVGVtcGxhdGVkTXV0ZXhXcmFwcGVyIDogcHVibGljIE11dGV4SW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBsb2NrKCkgeyBtXy5sb2NrKCk7IH0KKyAgdmlydHVhbCB2b2lkIHVubG9jaygpIHsgbV8udW5sb2NrKCk7IH0KKyAgdmlydHVhbCBib29sIHRyeV9sb2NrKCkgeyByZXR1cm4gbV8udHJ5X2xvY2soKTsgfQorICBwdGhyZWFkX211dGV4X3QgKm5hdGl2ZV9oYW5kbGUoKSB7IHJldHVybiBtXy5uYXRpdmVfaGFuZGxlKCk7IH0KKworIHByaXZhdGU6CisgIE11dGV4VHlwZSBtXzsKK307CisKK01VVEVYX0lEIGluaXRpYWxpemVNdXRleFJlY3Vyc2l2ZSgpCit7CisgIHJldHVybiBuZXcgVGVtcGxhdGVkTXV0ZXhXcmFwcGVyPFJlZW50cmFudE11dGV4PigpOworfQorCitNVVRFWF9JRCBpbml0aWFsaXplTXV0ZXhOb3JtYWwoKQoreworICByZXR1cm4gbmV3IFRlbXBsYXRlZE11dGV4V3JhcHBlcjxNdXRleD4oKTsKK30KKwordm9pZCBkZWxldGVNdXRleChNVVRFWF9JRCBtdXRleCkKK3sKKwlkZWxldGUgbXV0ZXg7Cit9CisKKy8qKgorICogTG9jayB0aGUgc2VtYXBob3JlLCBibG9ja2luZyB1bnRpbCBpdCdzIGF2YWlsYWJsZS4KKyAqIEByZXR1cm4gMCBmb3Igc3VjY2VzcywgLTEgZm9yIGVycm9yLiBJZiAtMSwgdGhlIGVycm9yIHdpbGwgYmUgaW4gZXJybm8uCisgKi8KK2ludDhfdCBsb2NrTXV0ZXgoTVVURVhfSUQgbXV0ZXgpCit7CisgICAgbXV0ZXgtPmxvY2soKTsKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBUcmllcyB0byBsb2NrIHRoZSBtdXRleC4KKyAqIEByZXR1cm4gMSBpZiB3ZSBnb3QgdGhlIGxvY2ssIDAgb3RoZXJ3aXNlLgorICovCitpbnQ4X3QgdHJ5TG9ja011dGV4KE1VVEVYX0lEIG11dGV4KQoreworICAgIHJldHVybiBtdXRleC0+dHJ5X2xvY2soKTsKK30KKworLyoqCisgKiBVbmxvY2sgdGhlIHNlbWFwaG9yZS4KKyAqIEByZXR1cm4gMCBmb3Igc3VjY2VzcywgLTEgZm9yIGVycm9yLiBJZiAtMSwgdGhlIGVycm9yIHdpbGwgYmUgaW4gZXJybm8uCisgKi8KK2ludDhfdCB1bmxvY2tNdXRleChNVVRFWF9JRCBtdXRleCkKK3sKKwltdXRleC0+dW5sb2NrKCk7CisgIHJldHVybiAwOworfQorCitTRU1BUEhPUkVfSUQgaW5pdGlhbGl6ZVNlbWFwaG9yZSh1aW50MzJfdCBpbml0aWFsX3ZhbHVlKSB7CisgIFNFTUFQSE9SRV9JRCBzZW0gPSBuZXcgc2VtX3Q7CisgIHNlbV9pbml0KHNlbSwgMCwgaW5pdGlhbF92YWx1ZSk7CisgIHJldHVybiBzZW07Cit9CisKK3ZvaWQgZGVsZXRlU2VtYXBob3JlKFNFTUFQSE9SRV9JRCBzZW0pIHsKKyAgc2VtX2Rlc3Ryb3koc2VtKTsKKyAgZGVsZXRlIHNlbTsKK30KKworLyoqCisgKiBMb2NrIHRoZSBzZW1hcGhvcmUsIGJsb2NraW5nIHVudGlsIGl0J3MgYXZhaWxhYmxlLgorICogQHJldHVybiAwIGZvciBzdWNjZXNzLCAtMSBmb3IgZXJyb3IuIElmIC0xLCB0aGUgZXJyb3Igd2lsbCBiZSBpbiBlcnJuby4KKyAqLworaW50OF90IHRha2VTZW1hcGhvcmUoU0VNQVBIT1JFX0lEIHNlbSkKK3sKKyAgICByZXR1cm4gc2VtX3dhaXQoc2VtKTsKK30KKworaW50OF90IHRyeVRha2VTZW1hcGhvcmUoU0VNQVBIT1JFX0lEIHNlbSkKK3sKKyAgICByZXR1cm4gc2VtX3RyeXdhaXQoc2VtKTsKK30KKworLyoqCisgKiBVbmxvY2sgdGhlIHNlbWFwaG9yZS4KKyAqIEByZXR1cm4gMCBmb3Igc3VjY2VzcywgLTEgZm9yIGVycm9yLiBJZiAtMSwgdGhlIGVycm9yIHdpbGwgYmUgaW4gZXJybm8uCisgKi8KK2ludDhfdCBnaXZlU2VtYXBob3JlKFNFTUFQSE9SRV9JRCBzZW0pCit7CisgIHJldHVybiBzZW1fcG9zdChzZW0pOworfQorCisKK01VTFRJV0FJVF9JRCBpbml0aWFsaXplTXVsdGlXYWl0KCkgeworICBwdGhyZWFkX2NvbmRhdHRyX3QgYXR0cjsKKyAgcHRocmVhZF9jb25kYXR0cl9pbml0KCZhdHRyKTsKKyAgTVVMVElXQUlUX0lEIGNvbmQgPSBuZXcgcHRocmVhZF9jb25kX3QoKTsKKyAgcHRocmVhZF9jb25kX2luaXQoY29uZCwgJmF0dHIpOworICBwdGhyZWFkX2NvbmRhdHRyX2Rlc3Ryb3koJmF0dHIpOworICByZXR1cm4gY29uZDsKK30KKwordm9pZCBkZWxldGVNdWx0aVdhaXQoTVVMVElXQUlUX0lEIHNlbSkgeworICBwdGhyZWFkX2NvbmRfZGVzdHJveShzZW0pOworICBkZWxldGUgc2VtOworfQorCitpbnQ4X3QgdGFrZU11bHRpV2FpdChNVUxUSVdBSVRfSUQgc2VtLCBNVVRFWF9JRCBtLCBpbnQzMl90IHRpbWVvdXQpIHsKKyAgbG9ja011dGV4KG0pOworICBpbnQ4X3QgdmFsID0gcHRocmVhZF9jb25kX3dhaXQoc2VtLCBtLT5uYXRpdmVfaGFuZGxlKCkpOworICB1bmxvY2tNdXRleChtKTsKKyAgcmV0dXJuIHZhbDsKK30KKworaW50OF90IGdpdmVNdWx0aVdhaXQoTVVMVElXQUlUX0lEIHNlbSkgeworICByZXR1cm4gcHRocmVhZF9jb25kX2Jyb2FkY2FzdChzZW0pOworfQorCisKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL1NvbGVub2lkLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL1NvbGVub2lkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjhiZmFmCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvU29sZW5vaWQuY3BwCkBAIC0wLDAgKzEsOTAgQEAKKworI2luY2x1ZGUgIkhBTC9Tb2xlbm9pZC5ocHAiCisKKyNpbmNsdWRlICJQb3J0LmgiCisjaW5jbHVkZSAiSEFML0Vycm9ycy5ocHAiCisjaW5jbHVkZSAiQ2hpcE9iamVjdC5oIgorI2luY2x1ZGUgIkhBTC9jcHAvU3luY2hyb25pemVkLmhwcCIKKyNpbmNsdWRlICJOZXR3b3JrQ29tbXVuaWNhdGlvbi9Mb2FkT3V0LmgiCisjaW5jbHVkZSAiY3RyZS9QQ00uaCIKKworc3RhdGljIGNvbnN0IGludCBOVU1fTU9EVUxFX05VTUJFUlMgPSA2MzsKKworUENNICptb2R1bGVzW05VTV9NT0RVTEVfTlVNQkVSU10gPSB7IE5VTEwgfTsKKworc3RydWN0IHNvbGVub2lkX3BvcnRfdCB7CisJUENNICptb2R1bGU7CisJdWludDMyX3QgcGluOworfTsKKwordm9pZCBpbml0aWFsaXplUENNKGludCBtb2R1bGUpIHsKKwlpZighbW9kdWxlc1ttb2R1bGVdKSB7CisJCW1vZHVsZXNbbW9kdWxlXSA9IG5ldyBQQ00obW9kdWxlKTsKKwl9Cit9CisKK3ZvaWQqIGluaXRpYWxpemVTb2xlbm9pZFBvcnQodm9pZCAqcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKwlQb3J0KiBwb3J0ID0gKFBvcnQqKSBwb3J0X3BvaW50ZXI7CisJaW5pdGlhbGl6ZVBDTShwb3J0LT5tb2R1bGUpOworCQorCXNvbGVub2lkX3BvcnRfdCAqc29sZW5vaWRfcG9ydCA9IG5ldyBzb2xlbm9pZF9wb3J0X3Q7CisJc29sZW5vaWRfcG9ydC0+bW9kdWxlID0gbW9kdWxlc1twb3J0LT5tb2R1bGVdOworCXNvbGVub2lkX3BvcnQtPnBpbiA9IHBvcnQtPnBpbjsKKworCXJldHVybiBzb2xlbm9pZF9wb3J0OworfQorCitib29sIGNoZWNrU29sZW5vaWRNb2R1bGUodWludDhfdCBtb2R1bGUpIHsKKwlyZXR1cm4gbW9kdWxlIDwgTlVNX01PRFVMRV9OVU1CRVJTOworfQorCitib29sIGdldFNvbGVub2lkKHZvaWQqIHNvbGVub2lkX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisJc29sZW5vaWRfcG9ydF90KiBwb3J0ID0gKHNvbGVub2lkX3BvcnRfdCopIHNvbGVub2lkX3BvcnRfcG9pbnRlcjsKKwlib29sIHZhbHVlOworCisJKnN0YXR1cyA9IHBvcnQtPm1vZHVsZS0+R2V0U29sZW5vaWQocG9ydC0+cGluLCB2YWx1ZSk7CisKKwlyZXR1cm4gdmFsdWU7Cit9CisKK3ZvaWQgc2V0U29sZW5vaWQodm9pZCogc29sZW5vaWRfcG9ydF9wb2ludGVyLCBib29sIHZhbHVlLCBpbnQzMl90ICpzdGF0dXMpIHsKKwlzb2xlbm9pZF9wb3J0X3QqIHBvcnQgPSAoc29sZW5vaWRfcG9ydF90Kikgc29sZW5vaWRfcG9ydF9wb2ludGVyOworCisJcG9ydC0+bW9kdWxlLT5TZXRTb2xlbm9pZHMoMSA8PCBwb3J0LT5waW4sIHZhbHVlID8gMHhGRiA6IDB4MDApOworfQorCit2b2lkIHNldFNvbGVub2lkcyh2b2lkKiBzb2xlbm9pZF9wb3J0X3BvaW50ZXIsIHVpbnQ4X3QgdmFsdWUsIHVpbnQ4X3QgbWFzaywgaW50MzJfdCAqc3RhdHVzKSB7CisJc29sZW5vaWRfcG9ydF90KiBwb3J0ID0gKHNvbGVub2lkX3BvcnRfdCopIHNvbGVub2lkX3BvcnRfcG9pbnRlcjsKKworCXBvcnQtPm1vZHVsZS0+U2V0U29sZW5vaWRzKHZhbHVlLCBtYXNrKTsKK30KKworaW50IGdldFBDTVNvbGVub2lkQmxhY2tMaXN0KHZvaWQqIHNvbGVub2lkX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKXsKKwlzb2xlbm9pZF9wb3J0X3QqIHBvcnQgPSAoc29sZW5vaWRfcG9ydF90Kikgc29sZW5vaWRfcG9ydF9wb2ludGVyOworCVVJTlQ4IHZhbHVlOworCQorCSpzdGF0dXMgPSBwb3J0LT5tb2R1bGUtPkdldFNvbGVub2lkQmxhY2tMaXN0KHZhbHVlKTsKKworCXJldHVybiB2YWx1ZTsKK30KK2Jvb2wgZ2V0UENNU29sZW5vaWRWb2x0YWdlU3RpY2t5RmF1bHQodm9pZCogc29sZW5vaWRfcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpeworCXNvbGVub2lkX3BvcnRfdCogcG9ydCA9IChzb2xlbm9pZF9wb3J0X3QqKSBzb2xlbm9pZF9wb3J0X3BvaW50ZXI7CisJYm9vbCB2YWx1ZTsKKworCSpzdGF0dXMgPSBwb3J0LT5tb2R1bGUtPkdldFNvbGVub2lkU3RpY2t5RmF1bHQodmFsdWUpOworCisJcmV0dXJuIHZhbHVlOworfQorYm9vbCBnZXRQQ01Tb2xlbm9pZFZvbHRhZ2VGYXVsdCh2b2lkKiBzb2xlbm9pZF9wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyl7CisJc29sZW5vaWRfcG9ydF90KiBwb3J0ID0gKHNvbGVub2lkX3BvcnRfdCopIHNvbGVub2lkX3BvcnRfcG9pbnRlcjsKKwlib29sIHZhbHVlOworCisJKnN0YXR1cyA9IHBvcnQtPm1vZHVsZS0+R2V0U29sZW5vaWRGYXVsdCh2YWx1ZSk7CisKKwlyZXR1cm4gdmFsdWU7Cit9Cit2b2lkIGNsZWFyQWxsUENNU3RpY2t5RmF1bHRzX3NvbCh2b2lkICpzb2xlbm9pZF9wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyl7CisJc29sZW5vaWRfcG9ydF90KiBwb3J0ID0gKHNvbGVub2lkX3BvcnRfdCopIHNvbGVub2lkX3BvcnRfcG9pbnRlcjsKKwkKKwkqc3RhdHVzID0gcG9ydC0+bW9kdWxlLT5DbGVhclN0aWNreUZhdWx0cygpOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvVGFzay5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9UYXNrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmU2NmY1Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvVGFzay5jcHAKQEAgLTAsMCArMSwxMDQgQEAKKworI2luY2x1ZGUgIkhBTC9UYXNrLmhwcCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisKKyNpZm5kZWYgT0sKKyNkZWZpbmUgT0sJCTAKKyNlbmRpZiAvKiBPSyAqLworI2lmbmRlZiBFUlJPUgorI2RlZmluZSBFUlJPUgkJKC0xKQorI2VuZGlmIC8qIEVSUk9SICovCisKK2NvbnN0IHVpbnQzMl90IFZYV09SS1NfRlBfVEFTSyA9IDB4MDEwMDAwMDA7Citjb25zdCBpbnQzMl90IEhBTF9vYmpMaWJfT0JKX0lEX0VSUk9SID0gLTE7IC8vIFRPRE86IHVwZGF0ZSB0byByZWxldmFudCBUYXNrSURFcnJvcgorY29uc3QgaW50MzJfdCBIQUxfb2JqTGliX09CSl9ERUxFVEVEID0gLTE7IC8vIFRPRE86IHVwZGF0ZSB0byByZWxldmFudCBUYXNrRGVsZXRlZEVycm9yCitjb25zdCBpbnQzMl90IEhBTF90YXNrTGliX0lMTEVHQUxfT1BUSU9OUyA9IC0xOyAvLyBUT0RPOiB1cGRhdGUgdG8gcmVsZXZhbnQgVGFza09wdGlvbnNFcnJvcgorY29uc3QgaW50MzJfdCBIQUxfbWVtTGliX05PVF9FTk9VR0hfTUVNT1JZID0gLTE7IC8vIFRPRE86IHVwZGF0ZSB0byByZWxldmFudCBUYXNrTWVtb3J5RXJyb3IKK2NvbnN0IGludDMyX3QgSEFMX3Rhc2tMaWJfSUxMRUdBTF9QUklPUklUWSA9IC0xOyAvLyBUT0RPOiB1cGRhdGUgdG8gcmVsZXZhbnQgVGFza1ByaW9yaXR5RXJyb3IKKworc3RydWN0IFRhc2tBcmdzIHsKKwlGVU5DUFRSIGZ1bjsKKwljaGFyKiBuYW1lOworCXB0aHJlYWRfdCoqIHRhc2s7CisJdWludDMyX3QgYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwKKwkgICAgICAgICBhcmc1LCBhcmc2LCBhcmc3LCBhcmc4LCBhcmc5OworfTsKKwordm9pZCogc3RhcnRSb3V0aW5lKHZvaWQqIGRhdGEpIHsKKwlUYXNrQXJncyogYXJncyA9IChUYXNrQXJncyopIGRhdGE7CisJcHJpbnRmKCJbSEFMXSBTdGFydGluZyB0YXNrICVzLi4uXG4iLCBhcmdzLT5uYW1lKTsKKwlpbnQgdmFsID0gYXJncy0+ZnVuKGFyZ3MtPmFyZzAsIGFyZ3MtPmFyZzEsIGFyZ3MtPmFyZzIsIGFyZ3MtPmFyZzMsIGFyZ3MtPmFyZzQsCisJCQkgICAgICAgICBhcmdzLT5hcmc1LCBhcmdzLT5hcmc2LCBhcmdzLT5hcmc3LCBhcmdzLT5hcmc4LCBhcmdzLT5hcmc5KTsKKwlwcmludGYoIltIQUxdIEV4aXRlZCB0YXNrICVzIHdpdGggY29kZSAlaVxuIiwgYXJncy0+bmFtZSwgdmFsKTsKKwkqYXJncy0+dGFzayA9IE5VTEw7CisJaW50KiByZXQgPSBuZXcgaW50KCk7ICpyZXQgPSB2YWw7CisJcmV0dXJuIHJldDsKK30KKworVEFTSyBzcGF3blRhc2soY2hhciAqIG5hbWUsIGludCBwcmlvcml0eSwgaW50IG9wdGlvbnMsIGludCBzdGFja1NpemUsIAorCQkgICAgICAgRlVOQ1BUUiBlbnRyeVB0LCB1aW50MzJfdCBhcmcwLCB1aW50MzJfdCBhcmcxLCB1aW50MzJfdCBhcmcyLAorCQkgICAgICAgdWludDMyX3QgYXJnMywgdWludDMyX3QgYXJnNCwgdWludDMyX3QgYXJnNSwgdWludDMyX3QgYXJnNiwKKwkJICAgICAgIHVpbnQzMl90IGFyZzcsIHVpbnQzMl90IGFyZzgsIHVpbnQzMl90IGFyZzkpIHsKKyAgcHJpbnRmKCJbSEFMXSBTcGF3bmluZyB0YXNrICVzLi4uXG4iLCBuYW1lKTsKKyAgcHRocmVhZF90KiB0YXNrID0gbmV3IHB0aHJlYWRfdDsKKyAgcHRocmVhZF9hdHRyX3QqIGF0dHIgPSBuZXcgcHRocmVhZF9hdHRyX3Q7CisgIHB0aHJlYWRfYXR0cl9pbml0KGF0dHIpOworICBUYXNrQXJncyogYXJncyA9IG5ldyBUYXNrQXJncygpOworICBhcmdzLT5mdW4gPSBlbnRyeVB0OworICBhcmdzLT5uYW1lID0gbmFtZTsKKyAgYXJncy0+dGFzayA9IG5ldyBwdGhyZWFkX3QqOworICAqYXJncy0+dGFzayA9IHRhc2s7CisgIGFyZ3MtPmFyZzAgPSBhcmcwOyBhcmdzLT5hcmcxID0gYXJnMTsgYXJncy0+YXJnMiA9IGFyZzI7IGFyZ3MtPmFyZzMgPSBhcmczOyBhcmdzLT5hcmc0ID0gYXJnNDsKKyAgYXJncy0+YXJnNSA9IGFyZzU7IGFyZ3MtPmFyZzYgPSBhcmc2OyBhcmdzLT5hcmc3ID0gYXJnNzsgYXJncy0+YXJnOCA9IGFyZzg7IGFyZ3MtPmFyZzkgPSBhcmc5OworICBpZiAocHRocmVhZF9jcmVhdGUodGFzaywgYXR0ciwgc3RhcnRSb3V0aW5lLCBhcmdzKSA9PSAwKSB7CisJICBwcmludGYoIltIQUxdIFN1Y2Nlc3NcbiIpOworCSAgcHRocmVhZF9kZXRhY2goKnRhc2spOworICB9IGVsc2UgeworCSAgcHJpbnRmKCJbSEFMXSBGYWlsdXJlXG4iKTsKKwkgIHRhc2sgPSBOVUxMOworICB9CisgIHB0aHJlYWRfYXR0cl9kZXN0cm95KGF0dHIpOworICByZXR1cm4gdGFzazsKK30KKworU1RBVFVTIHJlc3RhcnRUYXNrKFRBU0sgdGFzaykgeworICByZXR1cm4gRVJST1I7IC8vIFRPRE86IGltcGxlbWVudDsKK30KKworU1RBVFVTIGRlbGV0ZVRhc2soVEFTSyB0YXNrKSB7CisgIHJldHVybiBFUlJPUjsgLy8gVE9ETzogaW1wbGVtZW50Cit9CisKK1NUQVRVUyBpc1Rhc2tSZWFkeShUQVNLIHRhc2spIHsKKyAgcmV0dXJuIEVSUk9SOyAvLyBUT0RPOiBpbXBsZW1lbnQKK30KKworU1RBVFVTIGlzVGFza1N1c3BlbmRlZChUQVNLIHRhc2spIHsKKyAgcmV0dXJuIEVSUk9SOyAvLyBUT0RPOiBpbXBsZW1lbnQKK30KKworU1RBVFVTIHN1c3BlbmRUYXNrKFRBU0sgdGFzaykgeworICByZXR1cm4gRVJST1I7IC8vIFRPRE86IGltcGxlbWVudAorfQorCitTVEFUVVMgcmVzdW1lVGFzayhUQVNLIHRhc2spIHsKKyAgcmV0dXJuIEVSUk9SOyAvLyBUT0RPOiBpbXBsZW1lbnQKK30KKworU1RBVFVTIHZlcmlmeVRhc2tJRChUQVNLIHRhc2spIHsKKyAgaWYgKHRhc2sgIT0gTlVMTCAmJiBwdGhyZWFkX2tpbGwoKnRhc2ssIDApID09IDApIHsKKwlyZXR1cm4gT0s7CisgIH0gZWxzZSB7CisJcmV0dXJuIEVSUk9SOworICB9Cit9CisKK1NUQVRVUyBzZXRUYXNrUHJpb3JpdHkoVEFTSyB0YXNrLCBpbnQgcHJpb3JpdHkpIHsKKyAgcmV0dXJuIEVSUk9SOyAvLyBUT0RPOiBpbXBsZW1lbnQKK30KKworU1RBVFVTIGdldFRhc2tQcmlvcml0eShUQVNLIHRhc2ssIGludCogcHJpb3JpdHkpIHsKKyAgcmV0dXJuIEVSUk9SOyAvLyBUT0RPOiBpbXBsZW1lbnQKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL1V0aWxpdGllcy5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9VdGlsaXRpZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNDY3N2YKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9VdGlsaXRpZXMuY3BwCkBAIC0wLDAgKzEsNDQgQEAKKyNpbmNsdWRlICJIQUwvVXRpbGl0aWVzLmhwcCIKKyNpbmNsdWRlIDx0aW1lLmg+CisKK2NvbnN0IGludDMyX3QgSEFMX05PX1dBSVQgPSAwOworY29uc3QgaW50MzJfdCBIQUxfV0FJVF9GT1JFVkVSID0gLTE7CisKK3ZvaWQgZGVsYXlUaWNrcyhpbnQzMl90IHRpY2tzKQoreworCXN0cnVjdCB0aW1lc3BlYyB0ZXN0LCByZW1haW5pbmc7CisJdGVzdC50dl9zZWMgPSAwOworCXRlc3QudHZfbnNlYyA9IHRpY2tzICogMzsKKworCS8qIFNsZWVwIHVudGlsIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIHRpY2tzIGhhcyBwYXNzZWQsIHdpdGggYWRkaXRpb25hbAorCQl0aW1lIGFkZGVkIGlmIG5hbm9zbGVlcCBpcyBpbnRlcnJ1cHRlZC4gKi8KKwl3aGlsZShuYW5vc2xlZXAoJnRlc3QsICZyZW1haW5pbmcpID09IC0xKSB7CisJCXRlc3QgPSByZW1haW5pbmc7CisJfQorfQorCit2b2lkIGRlbGF5TWlsbGlzKGRvdWJsZSBtcykKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgdGVzdCwgcmVtYWluaW5nOworCXRlc3QudHZfc2VjID0gbXMgLyAxMDAwOworCXRlc3QudHZfbnNlYyA9IDEwMDAgKiAoKCh1aW50NjRfdCltcykgJSAxMDAwMDAwKTsKKworCS8qIFNsZWVwIHVudGlsIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBoYXMgcGFzc2VkLCB3aXRoCisJCWFkZGl0aW9uYWwgdGltZSBhZGRlZCBpZiBuYW5vc2xlZXAgaXMgaW50ZXJydXB0ZWQuICovCisJd2hpbGUobmFub3NsZWVwKCZ0ZXN0LCAmcmVtYWluaW5nKSA9PSAtMSkgeworCQl0ZXN0ID0gcmVtYWluaW5nOworCX0KK30KKwordm9pZCBkZWxheVNlY29uZHMoZG91YmxlIHMpCit7CisJc3RydWN0IHRpbWVzcGVjIHRlc3QsIHJlbWFpbmluZzsKKwl0ZXN0LnR2X3NlYyA9IChpbnQpczsKKwl0ZXN0LnR2X25zZWMgPSAocyAtIChpbnQpcykgKiAxMDAwMDAwMDAwLjA7CisKKwkvKiBTbGVlcCB1bnRpbCB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBzZWNvbmRzIGhhcyBwYXNzZWQsIHdpdGggYWRkaXRpb25hbAorCQl0aW1lIGFkZGVkIGlmIG5hbm9zbGVlcCBpcyBpbnRlcnJ1cHRlZC4gKi8KKwl3aGlsZShuYW5vc2xlZXAoJnRlc3QsICZyZW1haW5pbmcpID09IC0xKSB7CisJCXRlc3QgPSByZW1haW5pbmc7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvY3BwL1Jlc291cmNlLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL2NwcC9SZXNvdXJjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VlZDFiMQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL2NwcC9SZXNvdXJjZS5jcHAKQEAgLTAsMCArMSwxMjAgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkhBTC9jcHAvUmVzb3VyY2UuaHBwIgorI2luY2x1ZGUgIkhBTC9FcnJvcnMuaHBwIgorI2luY2x1ZGUgPGNzdGRkZWY+CisKK1JlZW50cmFudE11dGV4IFJlc291cmNlOjptX2NyZWF0ZUxvY2s7CisKKy8qKgorICogQWxsb2NhdGUgc3RvcmFnZSBmb3IgYSBuZXcgaW5zdGFuY2Ugb2YgUmVzb3VyY2UuCisgKiBBbGxvY2F0ZSBhIGJvb2wgYXJyYXkgb2YgdmFsdWVzIHRoYXQgd2lsbCBnZXQgaW5pdGlhbGl6ZWQgdG8gaW5kaWNhdGUgdGhhdCBubyByZXNvdXJjZXMKKyAqIGhhdmUgYmVlbiBhbGxvY2F0ZWQgeWV0LiBUaGUgaW5kaWNpZXMgb2YgdGhlIHJlc291cmNlcyBhcmUgWzAgLi4gZWxlbWVudHMgLSAxXS4KKyAqLworUmVzb3VyY2U6OlJlc291cmNlKHVpbnQzMl90IGVsZW1lbnRzKQoreworCTo6c3RkOjp1bmlxdWVfbG9jazxSZWVudHJhbnRNdXRleD4gc3luYyhtX2NyZWF0ZUxvY2spOworCW1fc2l6ZSA9IGVsZW1lbnRzOworCW1faXNBbGxvY2F0ZWQgPSBuZXcgYm9vbFttX3NpemVdOworCWZvciAodWludDMyX3QgaT0wOyBpIDwgbV9zaXplOyBpKyspCisJeworCQltX2lzQWxsb2NhdGVkW2ldID0gZmFsc2U7CisJfQorfQorCisvKioKKyAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIFJlc291cmNlIGFsbG9jYXRpb24tdHJhY2tlciAqaWYqIG5lZWRlZC4KKyAqCisgKiBAcGFyYW0gciAtLSBhZGRyZXNzIG9mIHRoZSBjYWxsZXIncyBSZXNvdXJjZSBwb2ludGVyLiBJZiAqciA9PSBOVUxMLCB0aGlzCisgKiAgICB3aWxsIGNvbnN0cnVjdCBhIFJlc291cmNlIGFuZCBtYWtlICpyIHBvaW50IHRvIGl0LiBJZiAqciAhPSBOVUxMLCBpLmUuCisgKiAgICB0aGUgY2FsbGVyIGFscmVhZHkgaGFzIGEgUmVzb3VyY2UgaW5zdGFuY2UsIHRoaXMgd29uJ3QgZG8gYW55dGhpbmcuCisgKiBAcGFyYW0gZWxlbWVudHMgLS0gdGhlIG51bWJlciBvZiBlbGVtZW50cyBmb3IgdGhpcyBSZXNvdXJjZSBhbGxvY2F0b3IgdG8KKyAqICAgIHRyYWNrLCB0aGF0IGlzLCBpdCB3aWxsIGFsbG9jYXRlIHJlc291cmNlIG51bWJlcnMgaW4gdGhlIHJhbmdlCisgKiAgICBbMCAuLiBlbGVtZW50cyAtIDFdLgorICovCisvKnN0YXRpYyovIHZvaWQgUmVzb3VyY2U6OkNyZWF0ZVJlc291cmNlT2JqZWN0KFJlc291cmNlICoqciwgdWludDMyX3QgZWxlbWVudHMpCit7CisJOjpzdGQ6OnVuaXF1ZV9sb2NrPFJlZW50cmFudE11dGV4PiBzeW5jKG1fY3JlYXRlTG9jayk7CisJaWYgKCpyID09IE5VTEwpCisJeworCQkqciA9IG5ldyBSZXNvdXJjZShlbGVtZW50cyk7CisJfQorfQorCisvKioKKyAqIERlbGV0ZSB0aGUgYWxsb2NhdGVkIGFycmF5IG9yIHJlc291cmNlcy4KKyAqIFRoaXMgaGFwcGVucyB3aGVuIHRoZSBtb2R1bGUgaXMgdW5sb2FkZWQgKHByb3ZpZGVkIGl0IHdhcyBzdGF0aWNhbGx5IGFsbG9jYXRlZCkuCisgKi8KK1Jlc291cmNlOjp+UmVzb3VyY2UoKQoreworCWRlbGV0ZVtdIG1faXNBbGxvY2F0ZWQ7Cit9CisKKy8qKgorICogQWxsb2NhdGUgYSByZXNvdXJjZS4KKyAqIFdoZW4gYSByZXNvdXJjZSBpcyByZXF1ZXN0ZWQsIG1hcmsgaXQgYWxsb2NhdGVkLiBJbiB0aGlzIGNhc2UsIGEgZnJlZSByZXNvdXJjZSB2YWx1ZQorICogd2l0aGluIHRoZSByYW5nZSBpcyBsb2NhdGVkIGFuZCByZXR1cm5lZCBhZnRlciBpdCBpcyBtYXJrZWQgYWxsb2NhdGVkLgorICovCit1aW50MzJfdCBSZXNvdXJjZTo6QWxsb2NhdGUoY29uc3QgY2hhciAqcmVzb3VyY2VEZXNjKQoreworCTo6c3RkOjp1bmlxdWVfbG9jazxSZWVudHJhbnRNdXRleD4gc3luYyhtX2FsbG9jYXRlTG9jayk7CisJZm9yICh1aW50MzJfdCBpPTA7IGkgPCBtX3NpemU7IGkrKykKKwl7CisJCWlmICghbV9pc0FsbG9jYXRlZFtpXSkKKwkJeworCQkJbV9pc0FsbG9jYXRlZFtpXSA9IHRydWU7CisJCQlyZXR1cm4gaTsKKwkJfQorCX0KKwkvLyBUT0RPOiB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChOb0F2YWlsYWJsZVJlc291cmNlcywgcmVzb3VyY2VEZXNjKTsKKwlyZXR1cm4gfjB1bDsKK30KKworLyoqCisgKiBBbGxvY2F0ZSBhIHNwZWNpZmljIHJlc291cmNlIHZhbHVlLgorICogVGhlIHVzZXIgcmVxdWVzdHMgYSBzcGVjaWZpYyByZXNvdXJjZSB2YWx1ZSwgaS5lLiBjaGFubmVsIG51bWJlciBhbmQgaXQgaXMgdmVyaWZpZWQKKyAqIHVuYWxsb2NhdGVkLCB0aGVuIHJldHVybmVkLgorICovCit1aW50MzJfdCBSZXNvdXJjZTo6QWxsb2NhdGUodWludDMyX3QgaW5kZXgsIGNvbnN0IGNoYXIgKnJlc291cmNlRGVzYykKK3sKKwk6OnN0ZDo6dW5pcXVlX2xvY2s8UmVlbnRyYW50TXV0ZXg+IHN5bmMobV9hbGxvY2F0ZUxvY2spOworCWlmIChpbmRleCA+PSBtX3NpemUpCisJeworCQkvLyBUT0RPOiB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChDaGFubmVsSW5kZXhPdXRPZlJhbmdlLCByZXNvdXJjZURlc2MpOworCQlyZXR1cm4gfjB1bDsKKwl9CisJaWYgKCBtX2lzQWxsb2NhdGVkW2luZGV4XSApCisJeworCQkvLyBUT0RPOiB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChSZXNvdXJjZUFscmVhZHlBbGxvY2F0ZWQsIHJlc291cmNlRGVzYyk7CisJCXJldHVybiB+MHVsOworCX0KKwltX2lzQWxsb2NhdGVkW2luZGV4XSA9IHRydWU7CisJcmV0dXJuIGluZGV4OworfQorCisKKy8qKgorICogRnJlZSBhbiBhbGxvY2F0ZWQgcmVzb3VyY2UuCisgKiBBZnRlciBhIHJlc291cmNlIGlzIG5vIGxvbmdlciBuZWVkZWQsIGZvciBleGFtcGxlIGEgZGVzdHJ1Y3RvciBpcyBjYWxsZWQgZm9yIGEgY2hhbm5lbCBhc3NpZ25tZW50CisgKiBjbGFzcywgRnJlZSB3aWxsIHJlbGVhc2UgdGhlIHJlc291cmNlIHZhbHVlIHNvIGl0IGNhbiBiZSByZXVzZWQgc29tZXdoZXJlIGVsc2UgaW4gdGhlIHByb2dyYW0uCisgKi8KK3ZvaWQgUmVzb3VyY2U6OkZyZWUodWludDMyX3QgaW5kZXgpCit7CisJOjpzdGQ6OnVuaXF1ZV9sb2NrPFJlZW50cmFudE11dGV4PiBzeW5jKG1fYWxsb2NhdGVMb2NrKTsKKwlpZiAoaW5kZXggPT0gfjB1bCkgcmV0dXJuOworCWlmIChpbmRleCA+PSBtX3NpemUpCisJeworCQkvLyBUT0RPOiB3cGlfc2V0V1BJRXJyb3IoTm90QWxsb2NhdGVkKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoIW1faXNBbGxvY2F0ZWRbaW5kZXhdKQorCXsKKwkJLy8gVE9ETzogd3BpX3NldFdQSUVycm9yKE5vdEFsbG9jYXRlZCk7CisJCXJldHVybjsKKwl9CisJbV9pc0FsbG9jYXRlZFtpbmRleF0gPSBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL2NwcC9TeW5jaHJvbml6ZWQuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvY3BwL1N5bmNocm9uaXplZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZjMmFkNQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL2NwcC9TeW5jaHJvbml6ZWQuY3BwCkBAIC0wLDAgKzEsMjggQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkhBTC9jcHAvU3luY2hyb25pemVkLmhwcCIKKyNpbmNsdWRlICJIQUwvU2VtYXBob3JlLmhwcCIKKworLyoqCisgKiBTeW5jaHJvbml6ZWQgY2xhc3MgZGVhbHMgd2l0aCBjcml0aWNhbCByZWdpb25zLgorICogRGVjbGFyZSBhIFN5bmNocm9uaXplZCBvYmplY3QgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGJsb2NrLiBUaGF0IHdpbGwgdGFrZSB0aGUgc2VtYXBob3JlLgorICogV2hlbiB0aGUgY29kZSBleGl0cyBmcm9tIHRoZSBibG9jayBpdCB3aWxsIGNhbGwgdGhlIGRlc3RydWN0b3Igd2hpY2ggd2lsbCBnaXZlIHRoZSBzZW1hcGhvcmUuCisgKiBUaGlzIGVuc3VyZXMgdGhhdCBubyBtYXR0ZXIgaG93IHRoZSBibG9jayBpcyBleGl0ZWQsIHRoZSBzZW1hcGhvcmUgd2lsbCBhbHdheXMgYmUgcmVsZWFzZWQuCisgKiBAcGFyYW0gc2VtYXBob3JlIFRoZSBzZW1hcGhvcmUgY29udHJvbGxpbmcgdGhpcyBjcml0aWNhbCByZWdpb24uCisgKi8KK1N5bmNocm9uaXplZDo6U3luY2hyb25pemVkKFNFTUFQSE9SRV9JRCBzZW1hcGhvcmUpCisgICAgOiBtX3NlbWFwaG9yZShzZW1hcGhvcmUpIHsKKyAgdGFrZVNlbWFwaG9yZShtX3NlbWFwaG9yZSk7Cit9CisKKy8qKgorICogVGhpcyBkZXN0cnVjdG9yIHVubG9ja3MgdGhlIHNlbWFwaG9yZS4KKyAqLworU3luY2hyb25pemVkOjp+U3luY2hyb25pemVkKCkKK3sKKwlnaXZlU2VtYXBob3JlKG1fc2VtYXBob3JlKTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL2N0cmUvQ2FuVGFsb25TUlguY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvY3RyZS9DYW5UYWxvblNSWC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNlNmFhYQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL2N0cmUvQ2FuVGFsb25TUlguY3BwCkBAIC0wLDAgKzEsMTI0MiBAQAorLyoqDQorICogQGJyaWVmIENBTiBUQUxPTiBTUlggZHJpdmVyLg0KKyAqDQorICogVGhlIFRBTE9OIFNSWCBpcyBkZXNpZ25lZCB0byBpbnN0cnVtZW50IGFsbCBydW50aW1lIHNpZ25hbHMgcGVyaW9kaWNhbGx5LiAgVGhlIGRlZmF1bHQgcGVyaW9kcyBhcmUgY2hvc2VuIHRvIHN1cHBvcnQgMTYgVEFMT05zDQorICogd2l0aCAxMG1zIHVwZGF0ZSByYXRlIGZvciBjb250cm9sICh0aHJvdHRsZSBvciBzZXRwb2ludCkuICBIb3dldmVyIHRoZXNlIGNhbiBiZSBvdmVycmlkZGVuIHdpdGggU2V0U3RhdHVzRnJhbWVSYXRlLiBAc2VlIFNldFN0YXR1c0ZyYW1lUmF0ZQ0KKyAqIFRoZSBnZXR0ZXJzIGZvciB0aGVzZSB1bnNvbGljaXRlZCBzaWduYWxzIGFyZSBhdXRvIGdlbmVyYXRlZCBhdCB0aGUgYm90dG9tIG9mIHRoaXMgbW9kdWxlLg0KKyAqDQorICogTGlrZXdpc2UgbW9zdCBjb250cm9sIHNpZ25hbHMgYXJlIHNlbnQgcGVyaW9kaWNhbGx5IHVzaW5nIHRoZSBmaXJlLWFuZC1mb3JnZXQgQ0FOIEFQSS4NCisgKiBUaGUgc2V0dGVycyBmb3IgdGhlc2UgdW5zb2xpY2l0ZWQgc2lnbmFscyBhcmUgYXV0byBnZW5lcmF0ZWQgYXQgdGhlIGJvdHRvbSBvZiB0aGlzIG1vZHVsZS4NCisgKg0KKyAqIFNpZ25hbHMgdGhhdCBhcmUgbm90IGF2YWlsYWJsZSBpbiBhbiB1bnNvbGljaXRlZCBmYXNoaW9uIGFyZSB0aGUgQ2xvc2UgTG9vcCBnYWlucy4NCisgKiBGb3IgdGVhbXMgdGhhdCBoYXZlIGEgc2luZ2xlIHByb2ZpbGUgZm9yIHRoZWlyIFRBTE9OIGNsb3NlIGxvb3AgdGhleSBjYW4gdXNlIGVpdGhlciB0aGUgd2VicGFnZSB0byBjb25maWd1cmUgdGhlaXIgVEFMT05zIG9uY2UNCisgKiAJb3Igc2V0IHRoZSBQSURGLEl6b25lLENsb3NlTG9vcFJhbXBSYXRlLGV0Yy4uLiBvbmNlIGluIHRoZSByb2JvdCBhcHBsaWNhdGlvbi4gIFRoZXNlIHBhcmFtZXRlcnMgYXJlIHNhdmVkIHRvIGZsYXNoIHNvIG9uY2UgdGhleSBhcmUNCisgKiAJbG9hZGVkIGluIHRoZSBUQUxPTiwgdGhleSB3aWxsIHBlcnNpc3QgdGhyb3VnaCBwb3dlciBjeWNsZXMgYW5kIG1vZGUgY2hhbmdlcy4NCisgKg0KKyAqIEZvciB0ZWFtcyB0aGF0IGhhdmUgb25lIG9yIHR3byBwcm9maWxlcyB0byBzd2l0Y2ggYmV0d2VlbiwgdGhleSBjYW4gdXNlIHRoZSBzYW1lIHN0cmF0ZWd5IHNpbmNlIHRoZXJlIGFyZSB0d28gc2xvdHMgdG8gY2hvb3NlIGZyb20NCisgKiBhbmQgdGhlIFByb2ZpbGVTbG90U2VsZWN0IGlzIHBlcmlvZGljYWxseSBzZW50IGluIHRoZSAxMCBtcyBjb250cm9sIGZyYW1lLg0KKyAqDQorICogRm9yIHRlYW1zIHRoYXQgcmVxdWlyZSBjaGFuZ2luZyBnYWlucyBmcmVxdWVudGx5LCB0aGV5IGNhbiB1c2UgdGhlIHNvbGljaXRpbmcgQVBJIHRvIGdldCBhbmQgc2V0IHRob3NlIHBhcmFtZXRlcnMuICBNb3N0IGxpa2VseQ0KKyAqIHRoZXkgd2lsbCBvbmx5IG5lZWQgdG8gc2V0IHRoZW0gaW4gYSBwZXJpb2RpYyBmYXNoaW9uIGFzIGEgZnVuY3Rpb24gb2Ygd2hhdCBtb3Rpb24gdGhlIGFwcGxpY2F0aW9uIGlzIGF0dGVtcHRpbmcuDQorICogSWYgdGhpcyBBUEkgaXMgdXNlZCwgYmUgbWluZGZ1bCBvZiB0aGUgQ0FOIHV0aWxpemF0aW9uIHJlcG9ydGVkIGluIHRoZSBkcml2ZXIgc3RhdGlvbi4NCisgKg0KKyAqIEVuY29kZXIgcG9zaXRpb24gaXMgbWVhc3VyZWQgaW4gZW5jb2RlciBlZGdlcy4gIEV2ZXJ5IGVkZ2UgaXMgY291bnRlZCAoc2ltaWxhciB0byByb2JvUklPIDRYIG1vZGUpLg0KKyAqIEFuYWxvZyBwb3NpdGlvbiBpcyAxMCBiaXRzLCBtZWFuaW5nIDEwMjQgdGlja3MgcGVyIHJvdGF0aW9uICgwViA9PiAzLjNWKS4NCisgKiBVc2UgU2V0RmVlZGJhY2tEZXZpY2VTZWxlY3QgdG8gc2VsZWN0IHdoaWNoIHNlbnNvciB0eXBlIHlvdSBuZWVkLiAgT25jZSB5b3UgZG8gdGhhdCB5b3UgY2FuIHVzZSBHZXRTZW5zb3JQb3NpdGlvbigpDQorICogYW5kIEdldFNlbnNvclZlbG9jaXR5KCkuICBUaGVzZSBzaWduYWxzIGFyZSB1cGRhdGVkIG9uIENBTkJ1cyBldmVyeSAyMG1zIChieSBkZWZhdWx0KS4NCisgKiBJZiBhIHJlbGF0aXZlIHNlbnNvciBpcyBzZWxlY3RlZCwgeW91IGNhbiB6ZXJvIChvciBjaGFuZ2UgdGhlIGN1cnJlbnQgdmFsdWUpIHVzaW5nIFNldFNlbnNvclBvc2l0aW9uLg0KKyAqDQorICogQW5hbG9nIElucHV0IGFuZCBxdWFkcmF0dXJlIHBvc2l0aW9uIChhbmQgdmVsb2NpdHkpIGFyZSBhbHNvIGV4cGxpY2l0bHkgcmVwb3J0ZWQgaW4gR2V0RW5jUG9zaXRpb24sIEdldEVuY1ZlbCwgR2V0QW5hbG9nSW5XaXRoT3YsIEdldEFuYWxvZ0luVmVsLg0KKyAqIFRoZXNlIHNpZ25hbHMgYXJlIGF2YWlsYWJsZSBhbGwgdGhlIHRpbWUsIHJlZ2FyZGxlc3Mgb2Ygd2hhdCBzZW5zb3IgaXMgc2VsZWN0ZWQgYXQgYSByYXRlIG9mIDEwMG1zLiAgVGhpcyBhbGxvd3MgZWFzeSBpbnN0cnVtZW50YXRpb24NCisgKiBmb3IgImluIHRoZSBwaXRzIiBjaGVja2luZyBvZiBhbGwgc2Vuc29ycyByZWdhcmRsZXNzIG9mIG1vZGVzZWxlY3QuICBUaGUgMTAwbXMgcmF0ZSBpcyBvdmVycmlkYWJsZSBmb3IgdGVhbXMgd2hvIHdhbnQgdG8gYWNxdWlyZSBzZW5zb3INCisgKiBkYXRhIGZvciBwcm9jZXNzaW5nLCBub3QganVzdCBpbnN0cnVtZW50YXRpb24uICBPciBqdXN0IHNlbGVjdCB0aGUgc2Vuc29yIHVzaW5nIFNldEZlZWRiYWNrRGV2aWNlU2VsZWN0IHRvIGdldCBpdCBhdCAyMG1zLg0KKyAqDQorICogVmVsb2NpdHkgaXMgaW4gcG9zaXRpb24gdGlja3MgLyAxMDBtcy4NCisgKg0KKyAqIEFsbCBvdXRwdXQgdW5pdHMgYXJlIGluIHJlc3BlY3QgdG8gZHV0eSBjeWNsZSAodGhyb3R0bGUpIHdoaWNoIGlzIC0xMDIzKGZ1bGwgcmV2ZXJzZSkgdG8gKzEwMjMgKGZ1bGwgZm9yd2FyZCkuDQorICogIFRoaXMgaW5jbHVkZXMgZGVtYW5kICh3aGljaCBzcGVjaWZpZXMgZHV0eSBjeWNsZSB3aGVuIGluIGR1dHkgY3ljbGUgbW9kZSkgYW5kIHJhbXBSYW1wLCB3aGljaCBpcyBpbiB0aHJvdHRsZSB1bml0cyBwZXIgMTBtcyAoaWYgbm9uemVybykuDQorICoNCisgKiBQb3MgYW5kIHZlbG9jaXR5IGNsb3NlIGxvb3BzIGFyZSBjYWxjJ2QgYXMNCisgKiAJCWVyciA9IHRhcmdldCAtIHBvc09yVmVsLg0KKyAqIAkJaUVyciArPSBlcnI7DQorICogCQlpZiggICAoSVpvbmUhPTApICBhbmQgIGFicyhlcnIpID4gSVpvbmUpDQorICogCQkJQ2xlYXJJYWNjdW0oKQ0KKyAqIAkJb3V0cHV0ID0gUCBYIGVyciArIEkgWCBpRXJyICsgRCBYIGRFcnIgKyBGIFggdGFyZ2V0DQorICogCQlkRXJyID0gZXJyIC0gbGFzdEVycg0KKyAqCVAsIEksYW5kIEQgZ2FpbnMgYXJlIGFsd2F5cyBwb3NpdGl2ZS4gRiBjYW4gYmUgbmVnYXRpdmUuDQorICoJTW90b3IgZGlyZWN0aW9uIGNhbiBiZSByZXZlcnNlZCB1c2luZyBTZXRSZXZNb3REdXJpbmdDbG9zZUxvb3BFbiBpZiBzZW5zb3IgYW5kIG1vdG9yIGFyZSBvdXQgb2YgcGhhc2UuDQorICoJU2ltaWxhcmx5IGZlZWRiYWNrIHNlbnNvciBjYW4gYWxzbyBiZSByZXZlcnNlZCAobXVsdGlwbGllZCBieSAtMSkgaWYgeW91IHByZWZlciB0aGUgc2Vuc29yIHRvIGJlIGludmVydGVkLg0KKyAqDQorICogUCBnYWluIGlzIHNwZWNpZmllZCBpbiB0aHJvdHRsZSBwZXIgZXJyb3IgdGljay4gIEZvciBleGFtcGxlLCBhIHZhbHVlIG9mIDEwMiBpcyB+OS45JSAod2hpY2ggaXMgMTAyLzEwMjMpIHRocm90dGxlIHBlciAxDQorICogCQlBREMgdW5pdCgxMGJpdCkgb3IgMSBxdWFkcmF0dXJlIGVuY29kZXIgZWRnZSBkZXBlbmRpbmcgb24gc2VsZWN0ZWQgc2Vuc29yLg0KKyAqDQorICogSSBnYWluIGlzIHNwZWNpZmllZCBpbiB0aHJvdHRsZSBwZXIgaW50ZWdyYXRlZCBlcnJvci4gRm9yIGV4YW1wbGUsIGEgdmFsdWUgb2YgMTAgZXF1YXRlcyB0byB+MC45OSUgKHdoaWNoIGlzIDEwLzEwMjMpDQorICogIAlmb3IgZWFjaCBhY2N1bXVsYXRlZCBBREMgdW5pdCgxMGJpdCkgb3IgMSBxdWFkcmF0dXJlIGVuY29kZXIgZWRnZSBkZXBlbmRpbmcgb24gc2VsZWN0ZWQgc2Vuc29yLg0KKyAqICAJQ2xvc2UgbG9vcCBhbmQgaW50ZWdyYWwgYWNjdW11bGF0b3IgcnVucyBldmVyeSAxbXMuDQorICoNCisgKiBEIGdhaW4gaXMgc3BlY2lmaWVkIGluIHRocm90dGxlIHBlciBkZXJpdmF0aXZlIGVycm9yLiBGb3IgZXhhbXBsZSBhIHZhbHVlIG9mIDEwMiBlcXVhdGVzIHRvIH45LjklICh3aGljaCBpcyAxMDIvMTAyMykNCisgKiAJcGVyIGNoYW5nZSBvZiAxIHVuaXQgKEFEQyBvciBlbmNvZGVyKSBwZXIgbXMuDQorICoNCisgKiBJIFpvbmUgaXMgc3BlY2lmaWVkIGluIHRoZSBzYW1lIHVuaXRzIGFzIHNlbnNvciBwb3NpdGlvbiAoQURDIHVuaXRzIG9yIHF1YWRyYXR1cmUgZWRnZXMpLiAgSWYgcG9zL3ZlbCBlcnJvciBpcyBvdXRzaWRlIG9mDQorICogCQl0aGlzIHZhbHVlLCB0aGUgaW50ZWdyYXRlZCBlcnJvciB3aWxsIGF1dG8tY2xlYXIuLi4NCisgKiAJCWlmKCAgIChJWm9uZSE9MCkgIGFuZCAgYWJzKGVycikgPiBJWm9uZSkNCisgKiAJCQlDbGVhcklhY2N1bSgpDQorICogCQkuLi50aGlzIGlzIHZlcnkgdXNlZnVsIGluIHByZXZlbnRpbmcgaW50ZWdyYWwgd2luZHVwIGFuZCBpcyBoaWdobHkgcmVjb21tZW5kZWQgaWYgdXNpbmcgZnVsbCBQSUQgdG8ga2VlcCBzdGFiaWxpdHkgbG93Lg0KKyAqDQorICogQ2xvc2VMb29wUmFtcFJhdGUgaXMgaW4gdGhyb3R0bGUgdW5pdHMgcGVyIDFtcy4gIFNldCB0byB6ZXJvIHRvIGRpc2FibGUgcmFtcGluZy4NCisgKiAJCVdvcmtzIHRoZSBzYW1lIGFzIFJhbXBUaHJvdHRsZSBidXQgb25seSBpcyBpbiBlZmZlY3Qgd2hlbiBhIGNsb3NlIGxvb3AgbW9kZSBhbmQgcHJvZmlsZSBzbG90IGlzIHNlbGVjdGVkLg0KKyAqDQorICogYXV0byBnZW5lcmF0ZWQgdXNpbmcgc3ByZWFkc2hlZXQgYW5kIFdwaUNsYXNzR2VuLmNzcHJvag0KKyAqIEBsaW5rIGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLzFPVV9aVjdmWkxHWVVRLVVoYzhzVkFtVW1XVGxUOFhCRllLOGxmamdfdGFjL2VkaXQjZ2lkPTE3NjYwNDY5NjcNCisgKi8NCisjaW5jbHVkZSAiQ2FuVGFsb25TUlguaCINCisjaW5jbHVkZSAiTmV0d29ya0NvbW11bmljYXRpb24vQ0FOU2Vzc2lvbk11eC5oIgkvL0NBTiBDb21tDQorI2luY2x1ZGUgPHN0cmluZy5oPiAvLyBtZW1zZXQNCisjaW5jbHVkZSA8dW5pc3RkLmg+IC8vIHVzbGVlcA0KKw0KKyNkZWZpbmUgU1RBVFVTXzEgIAkJMHgwMjA0MTQwMA0KKyNkZWZpbmUgU1RBVFVTXzIgIAkJMHgwMjA0MTQ0MA0KKyNkZWZpbmUgU1RBVFVTXzMgIAkJMHgwMjA0MTQ4MA0KKyNkZWZpbmUgU1RBVFVTXzQgIAkJMHgwMjA0MTRDMA0KKyNkZWZpbmUgU1RBVFVTXzUgIAkJMHgwMjA0MTUwMA0KKyNkZWZpbmUgU1RBVFVTXzYgIAkJMHgwMjA0MTU0MA0KKyNkZWZpbmUgU1RBVFVTXzcgIAkJMHgwMjA0MTU4MA0KKw0KKyNkZWZpbmUgQ09OVFJPTF8xIAkJCTB4MDIwNDAwMDANCisjZGVmaW5lIENPTlRST0xfMiAJCQkweDAyMDQwMDQwDQorI2RlZmluZSBDT05UUk9MXzMgCQkJMHgwMjA0MDA4MA0KKw0KKyNkZWZpbmUgRVhQRUNURURfUkVTUE9OU0VfVElNRU9VVF9NUwkoMjAwKQ0KKyNkZWZpbmUgR0VUX1NUQVRVUzEoKSBDdHJlQ2FuTm9kZTo6cmVjTXNnPFRBTE9OX1N0YXR1c18xX0dlbmVyYWxfMTBtc190CQk+IHJ4ID0gR2V0Ung8VEFMT05fU3RhdHVzXzFfR2VuZXJhbF8xMG1zX3Q+KFNUQVRVU18xCSAgfCBHZXREZXZpY2VOdW1iZXIoKSwgRVhQRUNURURfUkVTUE9OU0VfVElNRU9VVF9NUykNCisjZGVmaW5lIEdFVF9TVEFUVVMyKCkgQ3RyZUNhbk5vZGU6OnJlY01zZzxUQUxPTl9TdGF0dXNfMl9GZWVkYmFja18yMG1zX3QJPiByeCA9IEdldFJ4PFRBTE9OX1N0YXR1c18yX0ZlZWRiYWNrXzIwbXNfdD4oU1RBVFVTXzIJICB8IEdldERldmljZU51bWJlcigpLCBFWFBFQ1RFRF9SRVNQT05TRV9USU1FT1VUX01TKQ0KKyNkZWZpbmUgR0VUX1NUQVRVUzMoKSBDdHJlQ2FuTm9kZTo6cmVjTXNnPFRBTE9OX1N0YXR1c18zX0VuY18xMDBtc190CQk+IHJ4ID0gR2V0Ung8VEFMT05fU3RhdHVzXzNfRW5jXzEwMG1zX3Q+KFNUQVRVU18zCQkgIHwgR2V0RGV2aWNlTnVtYmVyKCksIEVYUEVDVEVEX1JFU1BPTlNFX1RJTUVPVVRfTVMpDQorI2RlZmluZSBHRVRfU1RBVFVTNCgpIEN0cmVDYW5Ob2RlOjpyZWNNc2c8VEFMT05fU3RhdHVzXzRfQWluVGVtcFZiYXRfMTAwbXNfdD4gcnggPSBHZXRSeDxUQUxPTl9TdGF0dXNfNF9BaW5UZW1wVmJhdF8xMDBtc190PihTVEFUVVNfNCB8IEdldERldmljZU51bWJlcigpLCBFWFBFQ1RFRF9SRVNQT05TRV9USU1FT1VUX01TKQ0KKyNkZWZpbmUgR0VUX1NUQVRVUzUoKSBDdHJlQ2FuTm9kZTo6cmVjTXNnPFRBTE9OX1N0YXR1c181X1N0YXJ0dXBfT25lU2hvdF90CT4gcnggPSBHZXRSeDxUQUxPTl9TdGF0dXNfNV9TdGFydHVwX09uZVNob3RfdD4oU1RBVFVTXzUJICB8IEdldERldmljZU51bWJlcigpLCBFWFBFQ1RFRF9SRVNQT05TRV9USU1FT1VUX01TKQ0KKyNkZWZpbmUgR0VUX1NUQVRVUzYoKSBDdHJlQ2FuTm9kZTo6cmVjTXNnPFRBTE9OX1N0YXR1c182X0VvbF90CQkJCT4gcnggPSBHZXRSeDxUQUxPTl9TdGF0dXNfNl9Fb2xfdD4oU1RBVFVTXzYJCQkJICB8IEdldERldmljZU51bWJlcigpLCBFWFBFQ1RFRF9SRVNQT05TRV9USU1FT1VUX01TKQ0KKyNkZWZpbmUgR0VUX1NUQVRVUzcoKSBDdHJlQ2FuTm9kZTo6cmVjTXNnPFRBTE9OX1N0YXR1c183X0RlYnVnXzIwMG1zX3QJCT4gcnggPSBHZXRSeDxUQUxPTl9TdGF0dXNfN19EZWJ1Z18yMDBtc190PihTVEFUVVNfNwkJICB8IEdldERldmljZU51bWJlcigpLCBFWFBFQ1RFRF9SRVNQT05TRV9USU1FT1VUX01TKQ0KKw0KKyNkZWZpbmUgUEFSQU1fUkVRVUVTVCAJCTB4MDIwNDE4MDANCisjZGVmaW5lIFBBUkFNX1JFU1BPTlNFIAkJMHgwMjA0MTg0MA0KKyNkZWZpbmUgUEFSQU1fU0VUCQkJMHgwMjA0MTg4MA0KKw0KK2NvbnN0IGludCBrUGFyYW1BcmJJZFZhbHVlID0gCVBBUkFNX1JFU1BPTlNFOw0KK2NvbnN0IGludCBrUGFyYW1BcmJJZE1hc2sgPSAJMHhGRkZGRkZGRjsNCisNCitjb25zdCBkb3VibGUgRkxPQVRfVE9fRlhQID0gKGRvdWJsZSkweDQwMDAwMDsNCitjb25zdCBkb3VibGUgRlhQX1RPX0ZMT0FUID0gMC4wMDAwMDAyMzg0MTg1NzkxMDE1NjI1Ow0KKw0KKy8qIGVuY29kZXIvZGVjb2RlcnMgKi8NCisvKiogY29udHJvbCAqLw0KK3R5cGVkZWYgc3RydWN0IF9UQUxPTl9Db250cm9sXzFfR2VuZXJhbF8xMG1zX3Qgew0KKwl1bnNpZ25lZCBUb2tlbkg6ODsNCisJdW5zaWduZWQgVG9rZW5MOjg7DQorCXVuc2lnbmVkIERlbWFuZEg6ODsNCisJdW5zaWduZWQgRGVtYW5kTTo4Ow0KKwl1bnNpZ25lZCBEZW1hbmRMOjg7DQorCXVuc2lnbmVkIFByb2ZpbGVTbG90U2VsZWN0OjE7DQorCXVuc2lnbmVkIEZlZWRiYWNrRGV2aWNlU2VsZWN0OjQ7DQorCXVuc2lnbmVkIE92ZXJyaWRlTGltaXRTd2l0Y2hFbjozOw0KKwl1bnNpZ25lZCBSZXZGZWVkYmFja1NlbnNvcjoxOw0KKwl1bnNpZ25lZCBSZXZNb3REdXJpbmdDbG9zZUxvb3BFbjoxOw0KKwl1bnNpZ25lZCBPdmVycmlkZUJyYWtlVHlwZToyOw0KKwl1bnNpZ25lZCBNb2RlU2VsZWN0OjQ7DQorCXVuc2lnbmVkIFJhbXBUaHJvdHRsZTo4Ow0KK30gVEFMT05fQ29udHJvbF8xX0dlbmVyYWxfMTBtc190IDsNCit0eXBlZGVmIHN0cnVjdCBfVEFMT05fQ29udHJvbF8yX1JhdGVzX09uZVNob3RfdCB7DQorCXVuc2lnbmVkIFN0YXR1czFNczo4Ow0KKwl1bnNpZ25lZCBTdGF0dXMyTXM6ODsNCisJdW5zaWduZWQgU3RhdHVzM01zOjg7DQorCXVuc2lnbmVkIFN0YXR1czRNczo4Ow0KK30gVEFMT05fQ29udHJvbF8yX1JhdGVzX09uZVNob3RfdCA7DQordHlwZWRlZiBzdHJ1Y3QgX1RBTE9OX0NvbnRyb2xfM19DbGVhckZsYWdzX09uZVNob3RfdCB7DQorCXVuc2lnbmVkIFplcm9GZWVkYmFja1NlbnNvcjoxOw0KKwl1bnNpZ25lZCBDbGVhclN0aWNreUZhdWx0czoxOw0KK30gVEFMT05fQ29udHJvbF8zX0NsZWFyRmxhZ3NfT25lU2hvdF90IDsNCisNCisvKiogc3RhdHVzICovDQordHlwZWRlZiBzdHJ1Y3QgX1RBTE9OX1N0YXR1c18xX0dlbmVyYWxfMTBtc190IHsNCisJdW5zaWduZWQgQ2xvc2VMb29wRXJySDo4Ow0KKwl1bnNpZ25lZCBDbG9zZUxvb3BFcnJNOjg7DQorCXVuc2lnbmVkIENsb3NlTG9vcEVyckw6ODsNCisJdW5zaWduZWQgQXBwbGllZFRocm90dGxlX2gzOjM7DQorCXVuc2lnbmVkIEZhdWx0X1JldlNvZnRMaW06MTsNCisJdW5zaWduZWQgRmF1bHRfRm9yU29mdExpbToxOw0KKwl1bnNpZ25lZCBUb2tMb2NrZWQ6MTsNCisJdW5zaWduZWQgTGltaXRTd2l0Y2hDbG9zZWRSZXY6MTsNCisJdW5zaWduZWQgTGltaXRTd2l0Y2hDbG9zZWRGb3I6MTsNCisJdW5zaWduZWQgQXBwbGllZFRocm90dGxlX2w4Ojg7DQorCXVuc2lnbmVkIE1vZGVTZWxlY3RfaDE6MTsNCisJdW5zaWduZWQgRmVlZGJhY2tEZXZpY2VTZWxlY3Q6NDsNCisJdW5zaWduZWQgTGltaXRTd2l0Y2hFbjozOw0KKwl1bnNpZ25lZCBGYXVsdF9IYXJkd2FyZUZhaWx1cmU6MTsNCisJdW5zaWduZWQgRmF1bHRfUmV2TGltOjE7DQorCXVuc2lnbmVkIEZhdWx0X0ZvckxpbToxOw0KKwl1bnNpZ25lZCBGYXVsdF9VbmRlclZvbHRhZ2U6MTsNCisJdW5zaWduZWQgRmF1bHRfT3ZlclRlbXA6MTsNCisJdW5zaWduZWQgTW9kZVNlbGVjdF9iMzozOw0KKwl1bnNpZ25lZCBUb2tlblNlZWQ6ODsNCit9IFRBTE9OX1N0YXR1c18xX0dlbmVyYWxfMTBtc190IDsNCit0eXBlZGVmIHN0cnVjdCBfVEFMT05fU3RhdHVzXzJfRmVlZGJhY2tfMjBtc190IHsNCisJdW5zaWduZWQgU2Vuc29yUG9zaXRpb25IOjg7DQorCXVuc2lnbmVkIFNlbnNvclBvc2l0aW9uTTo4Ow0KKwl1bnNpZ25lZCBTZW5zb3JQb3NpdGlvbkw6ODsNCisJdW5zaWduZWQgU2Vuc29yVmVsb2NpdHlIOjg7DQorCXVuc2lnbmVkIFNlbnNvclZlbG9jaXR5TDo4Ow0KKwl1bnNpZ25lZCBDdXJyZW50X2g4Ojg7DQorCXVuc2lnbmVkIFN0Y2t5RmF1bHRfUmV2U29mdExpbToxOw0KKwl1bnNpZ25lZCBTdGNreUZhdWx0X0ZvclNvZnRMaW06MTsNCisJdW5zaWduZWQgU3Rja3lGYXVsdF9SZXZMaW06MTsNCisJdW5zaWduZWQgU3Rja3lGYXVsdF9Gb3JMaW06MTsNCisJdW5zaWduZWQgU3Rja3lGYXVsdF9VbmRlclZvbHRhZ2U6MTsNCisJdW5zaWduZWQgU3Rja3lGYXVsdF9PdmVyVGVtcDoxOw0KKwl1bnNpZ25lZCBDdXJyZW50X2wyOjI7DQorCXVuc2lnbmVkIHJlc2VydmVkOjY7DQorCXVuc2lnbmVkIFByb2ZpbGVTbG90U2VsZWN0OjE7DQorCXVuc2lnbmVkIEJyYWtlSXNFbmFibGVkOjE7DQorfSBUQUxPTl9TdGF0dXNfMl9GZWVkYmFja18yMG1zX3QgOw0KK3R5cGVkZWYgc3RydWN0IF9UQUxPTl9TdGF0dXNfM19FbmNfMTAwbXNfdCB7DQorCXVuc2lnbmVkIEVuY1Bvc2l0aW9uSDo4Ow0KKwl1bnNpZ25lZCBFbmNQb3NpdGlvbk06ODsNCisJdW5zaWduZWQgRW5jUG9zaXRpb25MOjg7DQorCXVuc2lnbmVkIEVuY1ZlbEg6ODsNCisJdW5zaWduZWQgRW5jVmVsTDo4Ow0KKwl1bnNpZ25lZCBFbmNJbmRleFJpc2VFdmVudHNIOjg7DQorCXVuc2lnbmVkIEVuY0luZGV4UmlzZUV2ZW50c0w6ODsNCisJdW5zaWduZWQgcmVzZXJ2ZWQ6NTsNCisJdW5zaWduZWQgUXVhZElkeHBpbjoxOw0KKwl1bnNpZ25lZCBRdWFkQnBpbjoxOw0KKwl1bnNpZ25lZCBRdWFkQXBpbjoxOw0KK30gVEFMT05fU3RhdHVzXzNfRW5jXzEwMG1zX3QgOw0KK3R5cGVkZWYgc3RydWN0IF9UQUxPTl9TdGF0dXNfNF9BaW5UZW1wVmJhdF8xMDBtc190IHsNCisJdW5zaWduZWQgQW5hbG9nSW5XaXRoT3ZIOjg7DQorCXVuc2lnbmVkIEFuYWxvZ0luV2l0aE92TTo4Ow0KKwl1bnNpZ25lZCBBbmFsb2dJbldpdGhPdkw6ODsNCisJdW5zaWduZWQgQW5hbG9nSW5WZWxIOjg7DQorCXVuc2lnbmVkIEFuYWxvZ0luVmVsTDo4Ow0KKwl1bnNpZ25lZCBUZW1wOjg7DQorCXVuc2lnbmVkIEJhdHRlcnlWOjg7DQorCXVuc2lnbmVkIHJlc2VydmVkOjg7DQorfSBUQUxPTl9TdGF0dXNfNF9BaW5UZW1wVmJhdF8xMDBtc190IDsNCit0eXBlZGVmIHN0cnVjdCBfVEFMT05fU3RhdHVzXzVfU3RhcnR1cF9PbmVTaG90X3Qgew0KKwl1bnNpZ25lZCBSZXNldENvdW50SDo4Ow0KKwl1bnNpZ25lZCBSZXNldENvdW50TDo4Ow0KKwl1bnNpZ25lZCBSZXNldEZsYWdzSDo4Ow0KKwl1bnNpZ25lZCBSZXNldEZsYWdzTDo4Ow0KKwl1bnNpZ25lZCBGaXJtVmVyc0g6ODsNCisJdW5zaWduZWQgRmlybVZlcnNMOjg7DQorfSBUQUxPTl9TdGF0dXNfNV9TdGFydHVwX09uZVNob3RfdCA7DQordHlwZWRlZiBzdHJ1Y3QgX1RBTE9OX1N0YXR1c182X0VvbF90IHsNCisJdW5zaWduZWQgY3VycmVudEFkY1VuY2FsX2gyOjI7DQorCXVuc2lnbmVkIHJlc2VydmVkMTo1Ow0KKwl1bnNpZ25lZCBTcGlDc1Bpbl9HYWRnZXRlZXJQaW42OjE7DQorCXVuc2lnbmVkIGN1cnJlbnRBZGNVbmNhbF9sODo4Ow0KKwl1bnNpZ25lZCB0ZW1wQWRjVW5jYWxfaDI6MjsNCisJdW5zaWduZWQgcmVzZXJ2ZWQyOjY7DQorCXVuc2lnbmVkIHRlbXBBZGNVbmNhbF9sODo4Ow0KKwl1bnNpZ25lZCB2YmF0QWRjVW5jYWxfaDI6MjsNCisJdW5zaWduZWQgcmVzZXJ2ZWQzOjY7DQorCXVuc2lnbmVkIHZiYXRBZGNVbmNhbF9sODo4Ow0KKwl1bnNpZ25lZCBhbmFsb2dBZGNVbmNhbF9oMjoyOw0KKwl1bnNpZ25lZCByZXNlcnZlZDQ6NjsNCisJdW5zaWduZWQgYW5hbG9nQWRjVW5jYWxfbDg6ODsNCit9IFRBTE9OX1N0YXR1c182X0VvbF90IDsNCit0eXBlZGVmIHN0cnVjdCBfVEFMT05fU3RhdHVzXzdfRGVidWdfMjAwbXNfdCB7DQorCXVuc2lnbmVkIFRva2VuaXphdGlvbkZhaWxzX2g4Ojg7DQorCXVuc2lnbmVkIFRva2VuaXphdGlvbkZhaWxzX2w4Ojg7DQorCXVuc2lnbmVkIExhc3RGYWlsZWRUb2tlbl9oODo4Ow0KKwl1bnNpZ25lZCBMYXN0RmFpbGVkVG9rZW5fbDg6ODsNCisJdW5zaWduZWQgVG9rZW5pemF0aW9uU3VjY2VzZXNfaDg6ODsNCisJdW5zaWduZWQgVG9rZW5pemF0aW9uU3VjY2VzZXNfbDg6ODsNCit9IFRBTE9OX1N0YXR1c183X0RlYnVnXzIwMG1zX3QgOw0KK3R5cGVkZWYgc3RydWN0IF9UQUxPTl9QYXJhbV9SZXF1ZXN0X3Qgew0KKwl1bnNpZ25lZCBQYXJhbUVudW06ODsNCit9IFRBTE9OX1BhcmFtX1JlcXVlc3RfdCA7DQordHlwZWRlZiBzdHJ1Y3QgX1RBTE9OX1BhcmFtX1Jlc3BvbnNlX3Qgew0KKwl1bnNpZ25lZCBQYXJhbUVudW06ODsNCisJdW5zaWduZWQgUGFyYW1WYWx1ZUw6ODsNCisJdW5zaWduZWQgUGFyYW1WYWx1ZU1MOjg7DQorCXVuc2lnbmVkIFBhcmFtVmFsdWVNSDo4Ow0KKwl1bnNpZ25lZCBQYXJhbVZhbHVlSDo4Ow0KK30gVEFMT05fUGFyYW1fUmVzcG9uc2VfdCA7DQorDQorDQorQ2FuVGFsb25TUlg6OkNhblRhbG9uU1JYKGludCBkZXZpY2VOdW1iZXIsaW50IGNvbnRyb2xQZXJpb2RNcyk6IEN0cmVDYW5Ob2RlKGRldmljZU51bWJlciksIF9jYW5faCgwKSwgX2Nhbl9zdGF0KDApDQorew0KKwkvKiBib3VuZCBwZXJpb2QgdG8gYmUgd2l0aGluIFsxIG1zLDk1IG1zXSAqLw0KKwlpZihjb250cm9sUGVyaW9kTXMgPCAxKQ0KKwkJY29udHJvbFBlcmlvZE1zID0gMTsNCisJZWxzZSBpZihjb250cm9sUGVyaW9kTXMgPiA5NSkNCisJCWNvbnRyb2xQZXJpb2RNcyA9IDk1Ow0KKwlSZWdpc3RlclJ4KFNUQVRVU18xIHwgKFVJTlQ4KWRldmljZU51bWJlciApOw0KKwlSZWdpc3RlclJ4KFNUQVRVU18yIHwgKFVJTlQ4KWRldmljZU51bWJlciApOw0KKwlSZWdpc3RlclJ4KFNUQVRVU18zIHwgKFVJTlQ4KWRldmljZU51bWJlciApOw0KKwlSZWdpc3RlclJ4KFNUQVRVU180IHwgKFVJTlQ4KWRldmljZU51bWJlciApOw0KKwlSZWdpc3RlclJ4KFNUQVRVU181IHwgKFVJTlQ4KWRldmljZU51bWJlciApOw0KKwlSZWdpc3RlclJ4KFNUQVRVU182IHwgKFVJTlQ4KWRldmljZU51bWJlciApOw0KKwlSZWdpc3RlclJ4KFNUQVRVU183IHwgKFVJTlQ4KWRldmljZU51bWJlciApOw0KKwlSZWdpc3RlclR4KENPTlRST0xfMSB8IChVSU5UOClkZXZpY2VOdW1iZXIsIChVSU5UOCljb250cm9sUGVyaW9kTXMpOw0KKwkvKiBkZWZhdWx0IG91ciBmcmFtZSByYXRlIHRhYmxlIHRvIHdoYXQgZmlybXdhcmUgZGVmYXVsdHMgdG8uICovDQorCV9zdGF0dXNSYXRlTXNbMF0gPSAxMDsJLyogCVRBTE9OX1N0YXR1c18xX0dlbmVyYWxfMTBtc190IAkJKi8NCisJX3N0YXR1c1JhdGVNc1sxXSA9IDIwOwkvKiAJVEFMT05fU3RhdHVzXzJfRmVlZGJhY2tfMjBtc190IAkJKi8NCisJX3N0YXR1c1JhdGVNc1syXSA9IDEwMDsJLyogCVRBTE9OX1N0YXR1c18zX0VuY18xMDBtc190IAkJCSovDQorCV9zdGF0dXNSYXRlTXNbM10gPSAxMDA7CS8qIAlUQUxPTl9TdGF0dXNfNF9BaW5UZW1wVmJhdF8xMDBtc190IAkqLw0KKwkvKiB0aGUgb25seSBkZWZhdWx0IHBhcmFtIHRoYXQgaXMgbm9uemVybyBpcyBsaW1pdCBzd2l0Y2guDQorCSAqIERlZmF1bHQgdG8gdXNpbmcgdGhlIGZsYXNoIHNldHRpbmdzLiAqLw0KKwlTZXRPdmVycmlkZUxpbWl0U3dpdGNoRW4oa0xpbWl0U3dpdGNoT3ZlcnJpZGVfVXNlRGVmYXVsdHNGcm9tRmxhc2gpOw0KK30NCisvKiBDYW5UYWxvblNSWCBEJ3Rvcg0KKyAqLw0KK0NhblRhbG9uU1JYOjp+Q2FuVGFsb25TUlgoKQ0KK3sNCisJaWYoX2Nhbl9oKXsNCisJCUZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9DQU5TZXNzaW9uTXV4X2Nsb3NlU3RyZWFtU2Vzc2lvbihfY2FuX2gpOw0KKwkJX2Nhbl9oID0gMDsNCisJfQ0KK30NCit2b2lkIENhblRhbG9uU1JYOjpPcGVuU2Vzc2lvbklmTmVlZEJlKCkNCit7DQorCV9jYW5fc3RhdCA9IDA7DQorCWlmIChfY2FuX2ggPT0gMCkgew0KKwkJLyogYml0MzAgLSBiaXQ4IG11c3QgbWF0Y2ggJDAwMDAwMlhYLiAgVG9wIGJpdCBpcyBub3QgbWFza2VkIHRvIGdldCByZW1vdGUgZnJhbWVzICovDQorCQlGUkNfTmV0d29ya0NvbW11bmljYXRpb25fQ0FOU2Vzc2lvbk11eF9vcGVuU3RyZWFtU2Vzc2lvbigmX2Nhbl9oLGtQYXJhbUFyYklkVmFsdWUgfCBHZXREZXZpY2VOdW1iZXIoKSwga1BhcmFtQXJiSWRNYXNrLCBrTXNnQ2FwYWNpdHksICZfY2FuX3N0YXQpOw0KKwkJaWYgKF9jYW5fc3RhdCA9PSAwKSB7DQorCQkJLyogc3VjY2VzcyAqLw0KKwkJfSBlbHNlIHsNCisJCQkvKiBzb21ldGhpbmcgd2VudCB3cm9uZywgdHJ5IGFnYWluIGxhdGVyICovDQorCQkJX2Nhbl9oID0gMDsNCisJCX0NCisJfQ0KK30NCit2b2lkIENhblRhbG9uU1JYOjpQcm9jZXNzU3RyZWFtTWVzc2FnZXMoKQ0KK3sNCisJaWYoMCA9PSBfY2FuX2gpDQorCQlPcGVuU2Vzc2lvbklmTmVlZEJlKCk7DQorCS8qIHByb2Nlc3MgcmVjZWl2ZSBtZXNzYWdlcyAqLw0KKwl1aW50MzJfdCBpOw0KKwl1aW50MzJfdCBtZXNzYWdlc1RvUmVhZCA9IHNpemVvZihfbXNnQnVmZikgLyBzaXplb2YoX21zZ0J1ZmZbMF0pOw0KKwl1aW50MzJfdCBtZXNzYWdlc1JlYWQgPSAwOw0KKwkvKiByZWFkIG91dCBsYXRlc3QgYnVuY2ggb2YgbWVzc2FnZXMgKi8NCisJX2Nhbl9zdGF0ID0gMDsNCisJaWYgKF9jYW5faCl7DQorCQlGUkNfTmV0d29ya0NvbW11bmljYXRpb25fQ0FOU2Vzc2lvbk11eF9yZWFkU3RyZWFtU2Vzc2lvbihfY2FuX2gsX21zZ0J1ZmYsIG1lc3NhZ2VzVG9SZWFkLCAmbWVzc2FnZXNSZWFkLCAmX2Nhbl9zdGF0KTsNCisJfQ0KKwkvKiBsb29wIHRocnUgZWFjaCBtZXNzYWdlIG9mIGludGVyZXN0ICovDQorCWZvciAoaSA9IDA7IGkgPCBtZXNzYWdlc1JlYWQ7ICsraSkgew0KKwkJdENBTlN0cmVhbU1lc3NhZ2UgKiBtc2cgPSBfbXNnQnVmZiArIGk7DQorCQlpZihtc2ctPm1lc3NhZ2VJRCA9PSAoUEFSQU1fUkVTUE9OU0UgfCBHZXREZXZpY2VOdW1iZXIoKSkgKXsNCisJCQlUQUxPTl9QYXJhbV9SZXNwb25zZV90IHBhcmFtUmVzcDsKKyAgICAgIG1lbWNweSgmcGFyYW1SZXNwLCBtc2ctPmRhdGEsIHNpemVvZihwYXJhbVJlc3ApKTsKKwkJCS8qIGRlY29kZSB2YWx1ZSAqLw0KKwkJCWludDMyX3QgdmFsID0gcGFyYW1SZXNwLlBhcmFtVmFsdWVIOw0KKwkJCXZhbCA8PD0gODsNCisJCQl2YWwgfD0gIHBhcmFtUmVzcC5QYXJhbVZhbHVlTUg7DQorCQkJdmFsIDw8PSA4Ow0KKwkJCXZhbCB8PSAgcGFyYW1SZXNwLlBhcmFtVmFsdWVNTDsNCisJCQl2YWwgPDw9IDg7DQorCQkJdmFsIHw9ICBwYXJhbVJlc3AuUGFyYW1WYWx1ZUw7DQorCQkJLyogc2F2ZSBsYXRlc3Qgc2lnbmFsICovDQorCQkJX3NpZ3NbcGFyYW1SZXNwLlBhcmFtRW51bV0gPSB2YWw7DQorCQl9ZWxzZXsNCisJCQlpbnQgYnJrcHRoZXJlID0gNDI7DQorCQkJKyticmtwdGhlcmU7DQorCQl9DQorCX0NCit9DQordm9pZCBDYW5UYWxvblNSWDo6U2V0KGRvdWJsZSB2YWx1ZSkNCit7DQorCWlmKHZhbHVlID4gMSkNCisJCXZhbHVlID0gMTsNCisJZWxzZSBpZih2YWx1ZSA8IC0xKQ0KKwkJdmFsdWUgPSAtMTsNCisJU2V0RGVtYW5kKDEwMjMqdmFsdWUpOyAvKiBtdXN0IGJlIHdpdGhpbiBbLTEwMjMsMTAyM10gKi8NCit9DQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS1zZXR0ZXJzIGFuZCBnZXR0ZXJzIHRoYXQgdXNlIHRoZSBwYXJhbSByZXF1ZXN0L3Jlc3BvbnNlLS0tLS0tLS0tLS0tLSovDQorLyoqDQorICogU2VuZCBhIG9uZSBzaG90IGZyYW1lIHRvIHNldCBhbiBhcmJpdHJhcnkgc2lnbmFsLg0KKyAqIE1vc3Qgc2lnbmFscyBhcmUgaW4gdGhlIGNvbnRyb2wgZnJhbWUgc28gYXZvaWQgdXNpbmcgdGhpcyBBUEkgdW5sZXNzIHlvdSBoYXZlIHRvLg0KKyAqIFVzZSB0aGlzIGFwaSBmb3IuLi4NCisgKiAtQSBtb3RvciBjb250cm9sbGVyIHByb2ZpbGUgc2lnbmFsIGVQcm9maWxlUGFyYW1fWFhYcy4gIFRoZXNlIGFyZSBiYWNrZWQgdXAgaW4gZmxhc2guICBJZiB5b3UgYXJlIGdhaW4tc2NoZWR1bGluZyB0aGVuIGNhbGwgdGhpcyBwZXJpb2RpY2FsbHkuDQorICogLURlZmF1bHQgYnJha2UgYW5kIGxpbWl0IHN3aXRjaCBzaWduYWxzLi4uIGVPbkJvb3RfWFhYcy4gIEF2b2lkIGRvaW5nIHRoaXMsIHVzZSB0aGUgb3ZlcnJpZGUgc2lnbmFscyBpbiB0aGUgY29udHJvbCBmcmFtZS4NCisgKiBUYWxvbiB3aWxsIGF1dG9tYXRpY2FsbHkgc2VuZCBhIFBBUkFNX1JFU1BPTlNFIGFmdGVyIHRoZSBzZXQsIHNvIEdldFBhcmFtUmVzcG9uc2Ugd2lsbCBjYXRjaCB0aGUgbGF0ZXN0IHZhbHVlIGFmdGVyIGEgY291cGxlIG1zLg0KKyAqLw0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpTZXRQYXJhbVJhdyh1bnNpZ25lZCBwYXJhbUVudW0sIGludCByYXdCaXRzKQ0KK3sNCisJLyogY2FsbGVyIGlzIHVzaW5nIHBhcmFtIEFQSS4gIE9wZW4gc2Vzc2lvbiBpZiBpdCBoYXNuJ1QgYmVlbiBkb25lLiAqLw0KKwlpZigwID09IF9jYW5faCkNCisJCU9wZW5TZXNzaW9uSWZOZWVkQmUoKTsNCisJVEFMT05fUGFyYW1fUmVzcG9uc2VfdCBmcmFtZTsNCisJbWVtc2V0KCZmcmFtZSwwLHNpemVvZihmcmFtZSkpOw0KKwlmcmFtZS5QYXJhbUVudW0gPSBwYXJhbUVudW07DQorCWZyYW1lLlBhcmFtVmFsdWVIID0gcmF3Qml0cyA+PiAweDE4Ow0KKwlmcmFtZS5QYXJhbVZhbHVlTUggPSByYXdCaXRzID4+IDB4MTA7DQorCWZyYW1lLlBhcmFtVmFsdWVNTCA9IHJhd0JpdHMgPj4gMHgwODsNCisJZnJhbWUuUGFyYW1WYWx1ZUwgPSByYXdCaXRzOw0KKwlpbnQzMl90IHN0YXR1cyA9IDA7DQorCUZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9DQU5TZXNzaW9uTXV4X3NlbmRNZXNzYWdlKFBBUkFNX1NFVCB8IEdldERldmljZU51bWJlcigpLCAoY29uc3QgdWludDhfdCopJmZyYW1lLCA1LCAwLCAmc3RhdHVzKTsNCisJaWYoc3RhdHVzKQ0KKwkJcmV0dXJuIENUUl9UeEZhaWxlZDsNCisJcmV0dXJuIENUUl9PS0FZOw0KK30NCisvKioNCisgKiBDaGVja3MgY2FjaGVkIENBTiBmcmFtZXMgYW5kIHVwZGF0aW5nIHNvbGljaXRlZCBzaWduYWxzLg0KKyAqLw0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpHZXRQYXJhbVJlc3BvbnNlUmF3KHVuc2lnbmVkIHBhcmFtRW51bSwgaW50ICYgcmF3Qml0cykNCit7DQorCUNUUl9Db2RlIHJldHZhbCA9IENUUl9PS0FZOw0KKwkvKiBwcm9jZXNzIHJlY2VpdmVkIHBhcmFtIGV2ZW50cy4gV2UgZG9uJ3QgZXhwZWN0IG1hbnkgc2luY2UgdGhpcyBBUEkgaXMgbm90IHVzZWQgb2Z0ZW4uICovDQorCVByb2Nlc3NTdHJlYW1NZXNzYWdlcygpOw0KKwkvKiBncmFiIHRoZSBzb2xpY2l0ZWQgc2lnbmFsIHZhbHVlICovDQorCXNpZ3NfdDo6aXRlcmF0b3IgaSA9IF9zaWdzLmZpbmQocGFyYW1FbnVtKTsNCisJaWYoaSA9PSBfc2lncy5lbmQoKSl7DQorCQlyZXR2YWwgPSBDVFJfU2lnTm90VXBkYXRlZDsNCisJfWVsc2V7DQorCQlyYXdCaXRzID0gaS0+c2Vjb25kOw0KKwl9DQorCXJldHVybiByZXR2YWw7DQorfQ0KKy8qKg0KKyAqIEFza3MgVEFMT04gdG8gaW1tZWRpZXRlbHkgcmVzcG9uZCB3aXRoIHNpZ25hbCB2YWx1ZS4gIFRoaXMgQVBJIGlzIG9ubHkgdXNlZCBmb3Igc2lnbmFscyB0aGF0IGFyZSBub3Qgc2VudCBwZXJpb2RpY2FsbHkuDQorICogVGhpcyBjYW4gYmUgdXNlZnVsIGZvciByZWFkaW5nIHBhcmFtcyB0aGF0IHJhcmVseSBjaGFuZ2UgbGlrZSBMaW1pdCBTd2l0Y2ggc2V0dGluZ3MgYW5kIFBJREYgdmFsdWVzLg0KKyAgKiBAcGFyYW0gcGFyYW0gdG8gcmVxdWVzdC4NCisgKi8NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6UmVxdWVzdFBhcmFtKHBhcmFtX3QgcGFyYW1FbnVtKQ0KK3sNCisJLyogcHJvY2VzcyByZWNlaXZlZCBwYXJhbSBldmVudHMuIFdlIGRvbid0IGV4cGVjdCBtYW55IHNpbmNlIHRoaXMgQVBJIGlzIG5vdCB1c2VkIG9mdGVuLiAqLw0KKwlQcm9jZXNzU3RyZWFtTWVzc2FnZXMoKTsNCisJVEFMT05fUGFyYW1fUmVxdWVzdF90IGZyYW1lOw0KKwltZW1zZXQoJmZyYW1lLDAsc2l6ZW9mKGZyYW1lKSk7DQorCWZyYW1lLlBhcmFtRW51bSA9IHBhcmFtRW51bTsNCisJaW50MzJfdCBzdGF0dXMgPSAwOw0KKwlGUkNfTmV0d29ya0NvbW11bmljYXRpb25fQ0FOU2Vzc2lvbk11eF9zZW5kTWVzc2FnZShQQVJBTV9SRVFVRVNUIHwgR2V0RGV2aWNlTnVtYmVyKCksIChjb25zdCB1aW50OF90KikmZnJhbWUsIDEsIDAsICZzdGF0dXMpOw0KKwlpZihzdGF0dXMpDQorCQlyZXR1cm4gQ1RSX1R4RmFpbGVkOw0KKwlyZXR1cm4gQ1RSX09LQVk7DQorfQ0KKw0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpTZXRQYXJhbShwYXJhbV90IHBhcmFtRW51bSwgZG91YmxlIHZhbHVlKQ0KK3sNCisJaW50MzJfdCByYXdiaXRzID0gMDsNCisJc3dpdGNoKHBhcmFtRW51bSl7DQorCQljYXNlIGVQcm9maWxlUGFyYW1TbG90MF9QOi8qIHVuc2lnbmVkIDEwLjIyIGZpeGVkIHB0IHZhbHVlICovDQorCQljYXNlIGVQcm9maWxlUGFyYW1TbG90MF9JOg0KKwkJY2FzZSBlUHJvZmlsZVBhcmFtU2xvdDBfRDoNCisJCWNhc2UgZVByb2ZpbGVQYXJhbVNsb3QxX1A6DQorCQljYXNlIGVQcm9maWxlUGFyYW1TbG90MV9JOg0KKwkJY2FzZSBlUHJvZmlsZVBhcmFtU2xvdDFfRDoNCisJCXsNCisJCQl1aW50MzJfdCB1cmF3Yml0czsNCisJCQl2YWx1ZSA9IHN0ZDo6bWluKHZhbHVlLDEwMjMuMCk7IC8qIGJvdW5kcyBjaGVjayBkb3VibGVzIHRoYXQgYXJlIG91dHNpZGUgdTEwLjIyICovDQorCQkJdmFsdWUgPSBzdGQ6Om1heCh2YWx1ZSwwLjApOw0KKwkJCXVyYXdiaXRzID0gdmFsdWUgKiBGTE9BVF9UT19GWFA7IC8qIHBlcmZvcm0gdW5zaWduIGFyaXRobWV0aWMgKi8NCisJCQlyYXdiaXRzID0gdXJhd2JpdHM7IC8qIGNvcHkgYml0cyBvdmVyLiAgU2V0UGFyYW1SYXcganVzdCBzdHVmZnMgaW50byBDQU4gZnJhbWUgd2l0aCBubyBzZW5zZSBvZiBzaWduZWRuZXNzICovDQorCQl9CWJyZWFrOw0KKwkJY2FzZSBlUHJvZmlsZVBhcmFtU2xvdDFfRjoJLyogc2lnbmVkIDEwLjIyIGZpeGVkIHB0IHZhbHVlICovDQorCQljYXNlIGVQcm9maWxlUGFyYW1TbG90MF9GOg0KKwkJCXZhbHVlID0gc3RkOjptaW4odmFsdWUsIDUxMi4wKTsgLyogYm91bmRzIGNoZWNrIGRvdWJsZXMgdGhhdCBhcmUgb3V0c2lkZSBzMTAuMjIgKi8NCisJCQl2YWx1ZSA9IHN0ZDo6bWF4KHZhbHVlLC01MTIuMCk7DQorCQkJcmF3Yml0cyA9IHZhbHVlICogRkxPQVRfVE9fRlhQOw0KKwkJCWJyZWFrOw0KKwkJZGVmYXVsdDogLyogZXZlcnl0aGluZyBlbHNlIGlzIGludGVncmFsICovDQorCQkJcmF3Yml0cyA9IChpbnQzMl90KXZhbHVlOw0KKwkJCWJyZWFrOw0KKwl9DQorCXJldHVybiBTZXRQYXJhbVJhdyhwYXJhbUVudW0scmF3Yml0cyk7DQorfQ0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpHZXRQYXJhbVJlc3BvbnNlKHBhcmFtX3QgcGFyYW1FbnVtLCBkb3VibGUgJiB2YWx1ZSkNCit7DQorCWludDMyX3QgcmF3Yml0cyA9IDA7DQorCUNUUl9Db2RlIHJldHZhbCA9IEdldFBhcmFtUmVzcG9uc2VSYXcocGFyYW1FbnVtLHJhd2JpdHMpOw0KKwlzd2l0Y2gocGFyYW1FbnVtKXsNCisJCWNhc2UgZVByb2ZpbGVQYXJhbVNsb3QwX1A6LyogMTAuMjIgZml4ZWQgcHQgdmFsdWUgKi8NCisJCWNhc2UgZVByb2ZpbGVQYXJhbVNsb3QwX0k6DQorCQljYXNlIGVQcm9maWxlUGFyYW1TbG90MF9EOg0KKwkJY2FzZSBlUHJvZmlsZVBhcmFtU2xvdDBfRjoNCisJCWNhc2UgZVByb2ZpbGVQYXJhbVNsb3QxX1A6DQorCQljYXNlIGVQcm9maWxlUGFyYW1TbG90MV9JOg0KKwkJY2FzZSBlUHJvZmlsZVBhcmFtU2xvdDFfRDoNCisJCWNhc2UgZVByb2ZpbGVQYXJhbVNsb3QxX0Y6DQorCQljYXNlIGVDdXJyZW50Og0KKwkJY2FzZSBlVGVtcDoNCisJCWNhc2UgZUJhdHRlcnlWOg0KKwkJCXZhbHVlID0gKChkb3VibGUpcmF3Yml0cykgKiBGWFBfVE9fRkxPQVQ7DQorCQkJYnJlYWs7DQorCQlkZWZhdWx0OiAvKiBldmVyeXRoaW5nIGVsc2UgaXMgaW50ZWdyYWwgKi8NCisJCQl2YWx1ZSA9IChkb3VibGUpcmF3Yml0czsNCisJCQlicmVhazsNCisJfQ0KKwlyZXR1cm4gcmV0dmFsOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0UGFyYW1SZXNwb25zZUludDMyKHBhcmFtX3QgcGFyYW1FbnVtLCBpbnQgJiB2YWx1ZSkNCit7DQorCWRvdWJsZSBkdmFsdWUgPSAwOw0KKwlDVFJfQ29kZSByZXR2YWwgPSBHZXRQYXJhbVJlc3BvbnNlKHBhcmFtRW51bSwgZHZhbHVlKTsNCisJdmFsdWUgPSAoaW50MzJfdClkdmFsdWU7DQorCXJldHVybiByZXR2YWw7DQorfQ0KKy8qLS0tLS0gZ2V0dGVycyBhbmQgc2V0dGVycyB0aGF0IHVzZSBwYXJhbSByZXF1ZXN0L3Jlc3BvbnNlLiBUaGVzZSBzaWduYWxzIGFyZSBiYWNrZWQgdXAgaW4gZmxhc2ggYW5kIHdpbGwgc3Vydml2ZSBhIHBvd2VyIGN5Y2xlLiAtLS0tLS0tLS0qLw0KKy8qLS0tLS0gSWYgeW91ciBhcHBsaWNhdGlvbiByZXF1aXJlcyBjaGFuZ2luZyB0aGVzZSB2YWx1ZXMgY29uc2lkZXIgdXNpbmcgYm90aCBzbG90cyBhbmQgc3dpdGNoIGJldHdlZW4gc2xvdDAgPD0+IHNsb3QxLiAtLS0tLS0tLS0tLS0tLS0tLS0qLw0KKy8qLS0tLS0gSWYgeW91ciBhcHBsaWNhdGlvbiByZXF1aXJlcyBjaGFuZ2luZyB0aGVzZSBzaWduYWxzIGZyZXF1ZW50bHkgdGhlbiBpdCBtYWtlcyBzZW5zZSB0byBsZXZlcmFnZSB0aGlzIEFQSS4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKy8qLS0tLS0gR2V0dGVycyBkb24ndCBibG9jaywgc28gaXQgbWF5IHJlcXVpcmUgc2V2ZXJhbCBjYWxscyB0byBnZXQgdGhlIGxhdGVzdCB2YWx1ZS4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpTZXRQZ2Fpbih1bnNpZ25lZCBzbG90SWR4LGRvdWJsZSBnYWluKQ0KK3sNCisJaWYoc2xvdElkeCA9PSAwKQ0KKwkJcmV0dXJuIFNldFBhcmFtKGVQcm9maWxlUGFyYW1TbG90MF9QLCBnYWluKTsNCisJcmV0dXJuIFNldFBhcmFtKGVQcm9maWxlUGFyYW1TbG90MV9QLCBnYWluKTsNCit9DQorQ1RSX0NvZGUgQ2FuVGFsb25TUlg6OlNldElnYWluKHVuc2lnbmVkIHNsb3RJZHgsZG91YmxlIGdhaW4pDQorew0KKwlpZihzbG90SWR4ID09IDApDQorCQlyZXR1cm4gU2V0UGFyYW0oZVByb2ZpbGVQYXJhbVNsb3QwX0ksIGdhaW4pOw0KKwlyZXR1cm4gU2V0UGFyYW0oZVByb2ZpbGVQYXJhbVNsb3QxX0ksIGdhaW4pOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6U2V0RGdhaW4odW5zaWduZWQgc2xvdElkeCxkb3VibGUgZ2FpbikNCit7DQorCWlmKHNsb3RJZHggPT0gMCkNCisJCXJldHVybiBTZXRQYXJhbShlUHJvZmlsZVBhcmFtU2xvdDBfRCwgZ2Fpbik7DQorCXJldHVybiBTZXRQYXJhbShlUHJvZmlsZVBhcmFtU2xvdDFfRCwgZ2Fpbik7DQorfQ0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpTZXRGZ2Fpbih1bnNpZ25lZCBzbG90SWR4LGRvdWJsZSBnYWluKQ0KK3sNCisJaWYoc2xvdElkeCA9PSAwKQ0KKwkJcmV0dXJuIFNldFBhcmFtKGVQcm9maWxlUGFyYW1TbG90MF9GLCBnYWluKTsNCisJcmV0dXJuIFNldFBhcmFtKGVQcm9maWxlUGFyYW1TbG90MV9GLCBnYWluKTsNCit9DQorQ1RSX0NvZGUgQ2FuVGFsb25TUlg6OlNldEl6b25lKHVuc2lnbmVkIHNsb3RJZHgsaW50IHpvbmUpDQorew0KKwlpZihzbG90SWR4ID09IDApDQorCQlyZXR1cm4gU2V0UGFyYW0oZVByb2ZpbGVQYXJhbVNsb3QwX0lab25lLCB6b25lKTsNCisJcmV0dXJuIFNldFBhcmFtKGVQcm9maWxlUGFyYW1TbG90MV9JWm9uZSwgem9uZSk7DQorfQ0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpTZXRDbG9zZUxvb3BSYW1wUmF0ZSh1bnNpZ25lZCBzbG90SWR4LGludCBjbG9zZUxvb3BSYW1wUmF0ZSkNCit7DQorCWlmKHNsb3RJZHggPT0gMCkNCisJCXJldHVybiBTZXRQYXJhbShlUHJvZmlsZVBhcmFtU2xvdDBfQ2xvc2VMb29wUmFtcFJhdGUsIGNsb3NlTG9vcFJhbXBSYXRlKTsNCisJcmV0dXJuIFNldFBhcmFtKGVQcm9maWxlUGFyYW1TbG90MV9DbG9zZUxvb3BSYW1wUmF0ZSwgY2xvc2VMb29wUmFtcFJhdGUpOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0UGdhaW4odW5zaWduZWQgc2xvdElkeCxkb3VibGUgJiBnYWluKQ0KK3sNCisJaWYoc2xvdElkeCA9PSAwKQ0KKwkJcmV0dXJuIEdldFBhcmFtUmVzcG9uc2UoZVByb2ZpbGVQYXJhbVNsb3QwX1AsIGdhaW4pOw0KKwlyZXR1cm4gR2V0UGFyYW1SZXNwb25zZShlUHJvZmlsZVBhcmFtU2xvdDFfUCwgZ2Fpbik7DQorfQ0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpHZXRJZ2Fpbih1bnNpZ25lZCBzbG90SWR4LGRvdWJsZSAmIGdhaW4pDQorew0KKwlpZihzbG90SWR4ID09IDApDQorCQlyZXR1cm4gR2V0UGFyYW1SZXNwb25zZShlUHJvZmlsZVBhcmFtU2xvdDBfSSwgZ2Fpbik7DQorCXJldHVybiBHZXRQYXJhbVJlc3BvbnNlKGVQcm9maWxlUGFyYW1TbG90MV9JLCBnYWluKTsNCit9DQorQ1RSX0NvZGUgQ2FuVGFsb25TUlg6OkdldERnYWluKHVuc2lnbmVkIHNsb3RJZHgsZG91YmxlICYgZ2FpbikNCit7DQorCWlmKHNsb3RJZHggPT0gMCkNCisJCXJldHVybiBHZXRQYXJhbVJlc3BvbnNlKGVQcm9maWxlUGFyYW1TbG90MF9ELCBnYWluKTsNCisJcmV0dXJuIEdldFBhcmFtUmVzcG9uc2UoZVByb2ZpbGVQYXJhbVNsb3QxX0QsIGdhaW4pOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0RmdhaW4odW5zaWduZWQgc2xvdElkeCxkb3VibGUgJiBnYWluKQ0KK3sNCisJaWYoc2xvdElkeCA9PSAwKQ0KKwkJcmV0dXJuIEdldFBhcmFtUmVzcG9uc2UoZVByb2ZpbGVQYXJhbVNsb3QwX0YsIGdhaW4pOw0KKwlyZXR1cm4gR2V0UGFyYW1SZXNwb25zZShlUHJvZmlsZVBhcmFtU2xvdDFfRiwgZ2Fpbik7DQorfQ0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpHZXRJem9uZSh1bnNpZ25lZCBzbG90SWR4LGludCAmIHpvbmUpDQorew0KKwlpZihzbG90SWR4ID09IDApDQorCQlyZXR1cm4gR2V0UGFyYW1SZXNwb25zZUludDMyKGVQcm9maWxlUGFyYW1TbG90MF9JWm9uZSwgem9uZSk7DQorCXJldHVybiBHZXRQYXJhbVJlc3BvbnNlSW50MzIoZVByb2ZpbGVQYXJhbVNsb3QxX0lab25lLCB6b25lKTsNCit9DQorQ1RSX0NvZGUgQ2FuVGFsb25TUlg6OkdldENsb3NlTG9vcFJhbXBSYXRlKHVuc2lnbmVkIHNsb3RJZHgsaW50ICYgY2xvc2VMb29wUmFtcFJhdGUpDQorew0KKwlpZihzbG90SWR4ID09IDApDQorCQlyZXR1cm4gR2V0UGFyYW1SZXNwb25zZUludDMyKGVQcm9maWxlUGFyYW1TbG90MF9DbG9zZUxvb3BSYW1wUmF0ZSwgY2xvc2VMb29wUmFtcFJhdGUpOw0KKwlyZXR1cm4gR2V0UGFyYW1SZXNwb25zZUludDMyKGVQcm9maWxlUGFyYW1TbG90MV9DbG9zZUxvb3BSYW1wUmF0ZSwgY2xvc2VMb29wUmFtcFJhdGUpOw0KK30NCisNCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6U2V0U2Vuc29yUG9zaXRpb24oaW50IHBvcykNCit7DQorCXJldHVybiBTZXRQYXJhbShlU2Vuc29yUG9zaXRpb24sIHBvcyk7DQorfQ0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpTZXRGb3J3YXJkU29mdExpbWl0KGludCBmb3J3YXJkTGltaXQpDQorew0KKwlyZXR1cm4gU2V0UGFyYW0oZVByb2ZpbGVQYXJhbVNvZnRMaW1pdEZvclRocmVzaG9sZCwgZm9yd2FyZExpbWl0KTsNCit9DQorQ1RSX0NvZGUgQ2FuVGFsb25TUlg6OlNldFJldmVyc2VTb2Z0TGltaXQoaW50IHJldmVyc2VMaW1pdCkNCit7DQorCXJldHVybiBTZXRQYXJhbShlUHJvZmlsZVBhcmFtU29mdExpbWl0UmV2VGhyZXNob2xkLCByZXZlcnNlTGltaXQpOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6U2V0Rm9yd2FyZFNvZnRFbmFibGUoaW50IGVuYWJsZSkNCit7DQorCXJldHVybiBTZXRQYXJhbShlUHJvZmlsZVBhcmFtU29mdExpbWl0Rm9yRW5hYmxlLCBlbmFibGUpOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6U2V0UmV2ZXJzZVNvZnRFbmFibGUoaW50IGVuYWJsZSkNCit7DQorCXJldHVybiBTZXRQYXJhbShlUHJvZmlsZVBhcmFtU29mdExpbWl0UmV2RW5hYmxlLCBlbmFibGUpOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0Rm9yd2FyZFNvZnRMaW1pdChpbnQgJiBmb3J3YXJkTGltaXQpDQorew0KKwlyZXR1cm4gR2V0UGFyYW1SZXNwb25zZUludDMyKGVQcm9maWxlUGFyYW1Tb2Z0TGltaXRGb3JUaHJlc2hvbGQsIGZvcndhcmRMaW1pdCk7DQorfQ0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpHZXRSZXZlcnNlU29mdExpbWl0KGludCAmIHJldmVyc2VMaW1pdCkNCit7DQorCXJldHVybiBHZXRQYXJhbVJlc3BvbnNlSW50MzIoZVByb2ZpbGVQYXJhbVNvZnRMaW1pdFJldlRocmVzaG9sZCwgcmV2ZXJzZUxpbWl0KTsNCit9DQorQ1RSX0NvZGUgQ2FuVGFsb25TUlg6OkdldEZvcndhcmRTb2Z0RW5hYmxlKGludCAmIGVuYWJsZSkNCit7DQorCXJldHVybiBHZXRQYXJhbVJlc3BvbnNlSW50MzIoZVByb2ZpbGVQYXJhbVNvZnRMaW1pdEZvckVuYWJsZSwgZW5hYmxlKTsNCit9DQorQ1RSX0NvZGUgQ2FuVGFsb25TUlg6OkdldFJldmVyc2VTb2Z0RW5hYmxlKGludCAmIGVuYWJsZSkNCit7DQorCXJldHVybiBHZXRQYXJhbVJlc3BvbnNlSW50MzIoZVByb2ZpbGVQYXJhbVNvZnRMaW1pdFJldkVuYWJsZSwgZW5hYmxlKTsNCit9DQorLyoqDQorICogQ2hhbmdlIHRoZSBwZXJpb2RNcyBvZiBhIFRBTE9OJ3Mgc3RhdHVzIGZyYW1lLiAgU2VlIGtTdGF0dXNGcmFtZV8qIGVudW1zIGZvciB3aGF0J3MgYXZhaWxhYmxlLg0KKyAqLw0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpTZXRTdGF0dXNGcmFtZVJhdGUodW5zaWduZWQgZnJhbWVFbnVtLCB1bnNpZ25lZCBwZXJpb2RNcykNCit7DQorCWludDMyX3Qgc3RhdHVzID0gMDsNCisJLyogYm91bmRzIGNoZWNrIHRoZSBwZXJpb2QgKi8NCisJaWYocGVyaW9kTXMgPCAxKQ0KKwkJcGVyaW9kTXMgPSAxOw0KKwllbHNlIGlmIChwZXJpb2RNcyA+IDI1NSkNCisJCXBlcmlvZE1zID0gMjU1Ow0KKyAgdWludDhfdCBwZXJpb2QgPSAodWludDhfdClwZXJpb2RNczsNCisJLyogdHdlYWsganVzdCB0aGUgc3RhdHVzIG1lc3NzYWdlIHJhdGUgdGhlIGNhbGxlciBjYXJlcyBhYm91dCAqLw0KKwlzd2l0Y2goZnJhbWVFbnVtKXsNCisJCWNhc2Uga1N0YXR1c0ZyYW1lX0dlbmVyYWw6DQorCQkJX3N0YXR1c1JhdGVNc1swXSA9IHBlcmlvZDsNCisJCQlicmVhazsNCisJCWNhc2Uga1N0YXR1c0ZyYW1lX0ZlZWRiYWNrOg0KKwkJCV9zdGF0dXNSYXRlTXNbMV0gPSBwZXJpb2Q7DQorCQkJYnJlYWs7DQorCQljYXNlIGtTdGF0dXNGcmFtZV9FbmNvZGVyOg0KKwkJCV9zdGF0dXNSYXRlTXNbMl0gPSBwZXJpb2Q7DQorCQkJYnJlYWs7DQorCQljYXNlIGtTdGF0dXNGcmFtZV9BbmFsb2dUZW1wVmJhdDoNCisJCQlfc3RhdHVzUmF0ZU1zWzNdID0gcGVyaW9kOw0KKwkJCWJyZWFrOw0KKwl9DQorCS8qIGJ1aWxkIG91ciByZXF1ZXN0IGZyYW1lICovDQorCVRBTE9OX0NvbnRyb2xfMl9SYXRlc19PbmVTaG90X3QgZnJhbWU7DQorCW1lbXNldCgmZnJhbWUsMCxzaXplb2YoZnJhbWUpKTsNCisJZnJhbWUuU3RhdHVzMU1zID0gX3N0YXR1c1JhdGVNc1swXTsNCisJZnJhbWUuU3RhdHVzMk1zID0gX3N0YXR1c1JhdGVNc1sxXTsNCisJZnJhbWUuU3RhdHVzM01zID0gX3N0YXR1c1JhdGVNc1syXTsNCisJZnJhbWUuU3RhdHVzNE1zID0gX3N0YXR1c1JhdGVNc1szXTsNCisJRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0NBTlNlc3Npb25NdXhfc2VuZE1lc3NhZ2UoQ09OVFJPTF8yIHwgR2V0RGV2aWNlTnVtYmVyKCksIChjb25zdCB1aW50OF90KikmZnJhbWUsIHNpemVvZihmcmFtZSksIDAsICZzdGF0dXMpOw0KKwlpZihzdGF0dXMpDQorCQlyZXR1cm4gQ1RSX1R4RmFpbGVkOw0KKwlyZXR1cm4gQ1RSX09LQVk7DQorfQ0KKy8qKg0KKyAqIENsZWFyIGFsbCBzdGlja3kgZmF1bHRzIGluIFRBTE9OLg0KKyAqLw0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpDbGVhclN0aWNreUZhdWx0cygpDQorew0KKwlpbnQzMl90IHN0YXR1cyA9IDA7DQorCS8qIGJ1aWxkIHJlcXVlc3QgZnJhbWUgKi8NCisJVEFMT05fQ29udHJvbF8zX0NsZWFyRmxhZ3NfT25lU2hvdF90IGZyYW1lOw0KKwltZW1zZXQoJmZyYW1lLDAsc2l6ZW9mKGZyYW1lKSk7DQorCWZyYW1lLkNsZWFyU3RpY2t5RmF1bHRzID0gMTsNCisJRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0NBTlNlc3Npb25NdXhfc2VuZE1lc3NhZ2UoQ09OVFJPTF8zIHwgR2V0RGV2aWNlTnVtYmVyKCksIChjb25zdCB1aW50OF90KikmZnJhbWUsIHNpemVvZihmcmFtZSksIDAsICZzdGF0dXMpOw0KKwlpZihzdGF0dXMpDQorCQlyZXR1cm4gQ1RSX1R4RmFpbGVkOw0KKwlyZXR1cm4gQ1RSX09LQVk7DQorfQ0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGF1dG8gZ2VuZXJhdGVkLiAgVGhpcyBBUEkgaXMgb3B0aW1hbCBzaW5jZSBpdCB1c2VzIHRoZSBmaXJlLWFuZC1mb3JnZXQgQ0FOIGludGVyZmFjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUaGVzZSBzaWduYWxzIHNob3VsZCBjb3ZlciB0aGUgbWFqb3JpdHkgb2YgYWxsIHVzZSBjYXNlcy4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorQ1RSX0NvZGUgQ2FuVGFsb25TUlg6OkdldEZhdWx0X092ZXJUZW1wKGludCAmcGFyYW0pDQorew0KKwlHRVRfU1RBVFVTMSgpOw0KKwlwYXJhbSA9IHJ4LT5GYXVsdF9PdmVyVGVtcDsNCisJcmV0dXJuIHJ4LmVycjsNCit9DQorQ1RSX0NvZGUgQ2FuVGFsb25TUlg6OkdldEZhdWx0X1VuZGVyVm9sdGFnZShpbnQgJnBhcmFtKQ0KK3sNCisJR0VUX1NUQVRVUzEoKTsNCisJcGFyYW0gPSByeC0+RmF1bHRfVW5kZXJWb2x0YWdlOw0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0RmF1bHRfRm9yTGltKGludCAmcGFyYW0pDQorew0KKwlHRVRfU1RBVFVTMSgpOw0KKwlwYXJhbSA9IHJ4LT5GYXVsdF9Gb3JMaW07DQorCXJldHVybiByeC5lcnI7DQorfQ0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpHZXRGYXVsdF9SZXZMaW0oaW50ICZwYXJhbSkNCit7DQorCUdFVF9TVEFUVVMxKCk7DQorCXBhcmFtID0gcngtPkZhdWx0X1JldkxpbTsNCisJcmV0dXJuIHJ4LmVycjsNCit9DQorQ1RSX0NvZGUgQ2FuVGFsb25TUlg6OkdldEZhdWx0X0hhcmR3YXJlRmFpbHVyZShpbnQgJnBhcmFtKQ0KK3sNCisJR0VUX1NUQVRVUzEoKTsNCisJcGFyYW0gPSByeC0+RmF1bHRfSGFyZHdhcmVGYWlsdXJlOw0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0RmF1bHRfRm9yU29mdExpbShpbnQgJnBhcmFtKQ0KK3sNCisJR0VUX1NUQVRVUzEoKTsNCisJcGFyYW0gPSByeC0+RmF1bHRfRm9yU29mdExpbTsNCisJcmV0dXJuIHJ4LmVycjsNCit9DQorQ1RSX0NvZGUgQ2FuVGFsb25TUlg6OkdldEZhdWx0X1JldlNvZnRMaW0oaW50ICZwYXJhbSkNCit7DQorCUdFVF9TVEFUVVMxKCk7DQorCXBhcmFtID0gcngtPkZhdWx0X1JldlNvZnRMaW07DQorCXJldHVybiByeC5lcnI7DQorfQ0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpHZXRTdGNreUZhdWx0X092ZXJUZW1wKGludCAmcGFyYW0pDQorew0KKwlHRVRfU1RBVFVTMigpOw0KKwlwYXJhbSA9IHJ4LT5TdGNreUZhdWx0X092ZXJUZW1wOw0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0U3Rja3lGYXVsdF9VbmRlclZvbHRhZ2UoaW50ICZwYXJhbSkNCit7DQorCUdFVF9TVEFUVVMyKCk7DQorCXBhcmFtID0gcngtPlN0Y2t5RmF1bHRfVW5kZXJWb2x0YWdlOw0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0U3Rja3lGYXVsdF9Gb3JMaW0oaW50ICZwYXJhbSkNCit7DQorCUdFVF9TVEFUVVMyKCk7DQorCXBhcmFtID0gcngtPlN0Y2t5RmF1bHRfRm9yTGltOw0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0U3Rja3lGYXVsdF9SZXZMaW0oaW50ICZwYXJhbSkNCit7DQorCUdFVF9TVEFUVVMyKCk7DQorCXBhcmFtID0gcngtPlN0Y2t5RmF1bHRfUmV2TGltOw0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0U3Rja3lGYXVsdF9Gb3JTb2Z0TGltKGludCAmcGFyYW0pDQorew0KKwlHRVRfU1RBVFVTMigpOw0KKwlwYXJhbSA9IHJ4LT5TdGNreUZhdWx0X0ZvclNvZnRMaW07DQorCXJldHVybiByeC5lcnI7DQorfQ0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpHZXRTdGNreUZhdWx0X1JldlNvZnRMaW0oaW50ICZwYXJhbSkNCit7DQorCUdFVF9TVEFUVVMyKCk7DQorCXBhcmFtID0gcngtPlN0Y2t5RmF1bHRfUmV2U29mdExpbTsNCisJcmV0dXJuIHJ4LmVycjsNCit9DQorQ1RSX0NvZGUgQ2FuVGFsb25TUlg6OkdldEFwcGxpZWRUaHJvdHRsZShpbnQgJnBhcmFtKQ0KK3sNCisJR0VUX1NUQVRVUzEoKTsNCisJaW50MzJfdCByYXcgPSAwOw0KKwlyYXcgfD0gcngtPkFwcGxpZWRUaHJvdHRsZV9oMzsNCisJcmF3IDw8PSA4Ow0KKwlyYXcgfD0gcngtPkFwcGxpZWRUaHJvdHRsZV9sODsNCisJcmF3IDw8PSAoMzItMTEpOyAvKiBzaWduIGV4dGVuZCAqLw0KKwlyYXcgPj49ICgzMi0xMSk7IC8qIHNpZ24gZXh0ZW5kICovDQorCXBhcmFtID0gKGludClyYXc7DQorCXJldHVybiByeC5lcnI7DQorfQ0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpHZXRDbG9zZUxvb3BFcnIoaW50ICZwYXJhbSkNCit7DQorCUdFVF9TVEFUVVMxKCk7DQorCWludDMyX3QgcmF3ID0gMDsNCisJcmF3IHw9IHJ4LT5DbG9zZUxvb3BFcnJIOw0KKwlyYXcgPDw9IDg7DQorCXJhdyB8PSByeC0+Q2xvc2VMb29wRXJyTTsNCisJcmF3IDw8PSA4Ow0KKwlyYXcgfD0gcngtPkNsb3NlTG9vcEVyckw7DQorCXJhdyA8PD0gKDMyLTI0KTsgLyogc2lnbiBleHRlbmQgKi8NCisJcmF3ID4+PSAoMzItMjQpOyAvKiBzaWduIGV4dGVuZCAqLw0KKwlwYXJhbSA9IChpbnQpcmF3Ow0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0RmVlZGJhY2tEZXZpY2VTZWxlY3QoaW50ICZwYXJhbSkNCit7DQorCUdFVF9TVEFUVVMxKCk7DQorCXBhcmFtID0gcngtPkZlZWRiYWNrRGV2aWNlU2VsZWN0Ow0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0TW9kZVNlbGVjdChpbnQgJnBhcmFtKQ0KK3sNCisJR0VUX1NUQVRVUzEoKTsNCisJdWludDMyX3QgcmF3ID0gMDsNCisJcmF3IHw9IHJ4LT5Nb2RlU2VsZWN0X2gxOw0KKwlyYXcgPDw9IDM7DQorCXJhdyB8PSByeC0+TW9kZVNlbGVjdF9iMzsNCisJcGFyYW0gPSAoaW50KXJhdzsNCisJcmV0dXJuIHJ4LmVycjsNCit9DQorQ1RSX0NvZGUgQ2FuVGFsb25TUlg6OkdldExpbWl0U3dpdGNoRW4oaW50ICZwYXJhbSkNCit7DQorCUdFVF9TVEFUVVMxKCk7DQorCXBhcmFtID0gcngtPkxpbWl0U3dpdGNoRW47DQorCXJldHVybiByeC5lcnI7DQorfQ0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpHZXRMaW1pdFN3aXRjaENsb3NlZEZvcihpbnQgJnBhcmFtKQ0KK3sNCisJR0VUX1NUQVRVUzEoKTsNCisJcGFyYW0gPSByeC0+TGltaXRTd2l0Y2hDbG9zZWRGb3I7DQorCXJldHVybiByeC5lcnI7DQorfQ0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpHZXRMaW1pdFN3aXRjaENsb3NlZFJldihpbnQgJnBhcmFtKQ0KK3sNCisJR0VUX1NUQVRVUzEoKTsNCisJcGFyYW0gPSByeC0+TGltaXRTd2l0Y2hDbG9zZWRSZXY7DQorCXJldHVybiByeC5lcnI7DQorfQ0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpHZXRTZW5zb3JQb3NpdGlvbihpbnQgJnBhcmFtKQ0KK3sNCisJR0VUX1NUQVRVUzIoKTsNCisJaW50MzJfdCByYXcgPSAwOw0KKwlyYXcgfD0gcngtPlNlbnNvclBvc2l0aW9uSDsNCisJcmF3IDw8PSA4Ow0KKwlyYXcgfD0gcngtPlNlbnNvclBvc2l0aW9uTTsNCisJcmF3IDw8PSA4Ow0KKwlyYXcgfD0gcngtPlNlbnNvclBvc2l0aW9uTDsNCisJcmF3IDw8PSAoMzItMjQpOyAvKiBzaWduIGV4dGVuZCAqLw0KKwlyYXcgPj49ICgzMi0yNCk7IC8qIHNpZ24gZXh0ZW5kICovDQorCXBhcmFtID0gKGludClyYXc7DQorCXJldHVybiByeC5lcnI7DQorfQ0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpHZXRTZW5zb3JWZWxvY2l0eShpbnQgJnBhcmFtKQ0KK3sNCisJR0VUX1NUQVRVUzIoKTsNCisJaW50MzJfdCByYXcgPSAwOw0KKwlyYXcgfD0gcngtPlNlbnNvclZlbG9jaXR5SDsNCisJcmF3IDw8PSA4Ow0KKwlyYXcgfD0gcngtPlNlbnNvclZlbG9jaXR5TDsNCisJcmF3IDw8PSAoMzItMTYpOyAvKiBzaWduIGV4dGVuZCAqLw0KKwlyYXcgPj49ICgzMi0xNik7IC8qIHNpZ24gZXh0ZW5kICovDQorCXBhcmFtID0gKGludClyYXc7DQorCXJldHVybiByeC5lcnI7DQorfQ0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpHZXRDdXJyZW50KGRvdWJsZSAmcGFyYW0pDQorew0KKwlHRVRfU1RBVFVTMigpOw0KKwl1aW50MzJfdCByYXcgPSAwOw0KKwlyYXcgfD0gcngtPkN1cnJlbnRfaDg7DQorCXJhdyA8PD0gMjsNCisJcmF3IHw9IHJ4LT5DdXJyZW50X2wyOw0KKwlwYXJhbSA9IChkb3VibGUpcmF3ICogMC4xMjUgKyAwOw0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0QnJha2VJc0VuYWJsZWQoaW50ICZwYXJhbSkNCit7DQorCUdFVF9TVEFUVVMyKCk7DQorCXBhcmFtID0gcngtPkJyYWtlSXNFbmFibGVkOw0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0RW5jUG9zaXRpb24oaW50ICZwYXJhbSkNCit7DQorCUdFVF9TVEFUVVMzKCk7DQorCWludDMyX3QgcmF3ID0gMDsNCisJcmF3IHw9IHJ4LT5FbmNQb3NpdGlvbkg7DQorCXJhdyA8PD0gODsNCisJcmF3IHw9IHJ4LT5FbmNQb3NpdGlvbk07DQorCXJhdyA8PD0gODsNCisJcmF3IHw9IHJ4LT5FbmNQb3NpdGlvbkw7DQorCXJhdyA8PD0gKDMyLTI0KTsgLyogc2lnbiBleHRlbmQgKi8NCisJcmF3ID4+PSAoMzItMjQpOyAvKiBzaWduIGV4dGVuZCAqLw0KKwlwYXJhbSA9IChpbnQpcmF3Ow0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0RW5jVmVsKGludCAmcGFyYW0pDQorew0KKwlHRVRfU1RBVFVTMygpOw0KKwlpbnQzMl90IHJhdyA9IDA7DQorCXJhdyB8PSByeC0+RW5jVmVsSDsNCisJcmF3IDw8PSA4Ow0KKwlyYXcgfD0gcngtPkVuY1ZlbEw7DQorCXJhdyA8PD0gKDMyLTE2KTsgLyogc2lnbiBleHRlbmQgKi8NCisJcmF3ID4+PSAoMzItMTYpOyAvKiBzaWduIGV4dGVuZCAqLw0KKwlwYXJhbSA9IChpbnQpcmF3Ow0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0RW5jSW5kZXhSaXNlRXZlbnRzKGludCAmcGFyYW0pDQorew0KKwlHRVRfU1RBVFVTMygpOw0KKwl1aW50MzJfdCByYXcgPSAwOw0KKwlyYXcgfD0gcngtPkVuY0luZGV4UmlzZUV2ZW50c0g7DQorCXJhdyA8PD0gODsNCisJcmF3IHw9IHJ4LT5FbmNJbmRleFJpc2VFdmVudHNMOw0KKwlwYXJhbSA9IChpbnQpcmF3Ow0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0UXVhZEFwaW4oaW50ICZwYXJhbSkNCit7DQorCUdFVF9TVEFUVVMzKCk7DQorCXBhcmFtID0gcngtPlF1YWRBcGluOw0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0UXVhZEJwaW4oaW50ICZwYXJhbSkNCit7DQorCUdFVF9TVEFUVVMzKCk7DQorCXBhcmFtID0gcngtPlF1YWRCcGluOw0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0UXVhZElkeHBpbihpbnQgJnBhcmFtKQ0KK3sNCisJR0VUX1NUQVRVUzMoKTsNCisJcGFyYW0gPSByeC0+UXVhZElkeHBpbjsNCisJcmV0dXJuIHJ4LmVycjsNCit9DQorQ1RSX0NvZGUgQ2FuVGFsb25TUlg6OkdldEFuYWxvZ0luV2l0aE92KGludCAmcGFyYW0pDQorew0KKwlHRVRfU1RBVFVTNCgpOw0KKwlpbnQzMl90IHJhdyA9IDA7DQorCXJhdyB8PSByeC0+QW5hbG9nSW5XaXRoT3ZIOw0KKwlyYXcgPDw9IDg7DQorCXJhdyB8PSByeC0+QW5hbG9nSW5XaXRoT3ZNOw0KKwlyYXcgPDw9IDg7DQorCXJhdyB8PSByeC0+QW5hbG9nSW5XaXRoT3ZMOw0KKwlyYXcgPDw9ICgzMi0yNCk7IC8qIHNpZ24gZXh0ZW5kICovDQorCXJhdyA+Pj0gKDMyLTI0KTsgLyogc2lnbiBleHRlbmQgKi8NCisJcGFyYW0gPSAoaW50KXJhdzsNCisJcmV0dXJuIHJ4LmVycjsNCit9DQorQ1RSX0NvZGUgQ2FuVGFsb25TUlg6OkdldEFuYWxvZ0luVmVsKGludCAmcGFyYW0pDQorew0KKwlHRVRfU1RBVFVTNCgpOw0KKwlpbnQzMl90IHJhdyA9IDA7DQorCXJhdyB8PSByeC0+QW5hbG9nSW5WZWxIOw0KKwlyYXcgPDw9IDg7DQorCXJhdyB8PSByeC0+QW5hbG9nSW5WZWxMOw0KKwlyYXcgPDw9ICgzMi0xNik7IC8qIHNpZ24gZXh0ZW5kICovDQorCXJhdyA+Pj0gKDMyLTE2KTsgLyogc2lnbiBleHRlbmQgKi8NCisJcGFyYW0gPSAoaW50KXJhdzsNCisJcmV0dXJuIHJ4LmVycjsNCit9DQorQ1RSX0NvZGUgQ2FuVGFsb25TUlg6OkdldFRlbXAoZG91YmxlICZwYXJhbSkNCit7DQorCUdFVF9TVEFUVVM0KCk7DQorCXVpbnQzMl90IHJhdyA9IHJ4LT5UZW1wOw0KKwlwYXJhbSA9IChkb3VibGUpcmF3ICogMC42NDUxNjEyOTAzICsgLTUwOw0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0QmF0dGVyeVYoZG91YmxlICZwYXJhbSkNCit7DQorCUdFVF9TVEFUVVM0KCk7DQorCXVpbnQzMl90IHJhdyA9IHJ4LT5CYXR0ZXJ5VjsNCisJcGFyYW0gPSAoZG91YmxlKXJhdyAqIDAuMDUgKyA0Ow0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0UmVzZXRDb3VudChpbnQgJnBhcmFtKQ0KK3sNCisJR0VUX1NUQVRVUzUoKTsNCisJdWludDMyX3QgcmF3ID0gMDsNCisJcmF3IHw9IHJ4LT5SZXNldENvdW50SDsNCisJcmF3IDw8PSA4Ow0KKwlyYXcgfD0gcngtPlJlc2V0Q291bnRMOw0KKwlwYXJhbSA9IChpbnQpcmF3Ow0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0UmVzZXRGbGFncyhpbnQgJnBhcmFtKQ0KK3sNCisJR0VUX1NUQVRVUzUoKTsNCisJdWludDMyX3QgcmF3ID0gMDsNCisJcmF3IHw9IHJ4LT5SZXNldEZsYWdzSDsNCisJcmF3IDw8PSA4Ow0KKwlyYXcgfD0gcngtPlJlc2V0RmxhZ3NMOw0KKwlwYXJhbSA9IChpbnQpcmF3Ow0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0RmlybVZlcnMoaW50ICZwYXJhbSkNCit7DQorCUdFVF9TVEFUVVM1KCk7DQorCXVpbnQzMl90IHJhdyA9IDA7DQorCXJhdyB8PSByeC0+RmlybVZlcnNIOw0KKwlyYXcgPDw9IDg7DQorCXJhdyB8PSByeC0+RmlybVZlcnNMOw0KKwlwYXJhbSA9IChpbnQpcmF3Ow0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6U2V0RGVtYW5kKGludCBwYXJhbSkNCit7DQorCUN0cmVDYW5Ob2RlOjp0eFRhc2s8VEFMT05fQ29udHJvbF8xX0dlbmVyYWxfMTBtc190PiB0b0ZpbGwgPSBHZXRUeDxUQUxPTl9Db250cm9sXzFfR2VuZXJhbF8xMG1zX3Q+KENPTlRST0xfMSB8IEdldERldmljZU51bWJlcigpKTsNCisJaWYgKHRvRmlsbC5Jc0VtcHR5KCkpIHJldHVybiBDVFJfVW5leHBlY3RlZEFyYklkOw0KKwl0b0ZpbGwtPkRlbWFuZEggPSBwYXJhbT4+MTY7DQorCXRvRmlsbC0+RGVtYW5kTSA9IHBhcmFtPj44Ow0KKwl0b0ZpbGwtPkRlbWFuZEwgPSBwYXJhbT4+MDsNCisJRmx1c2hUeCh0b0ZpbGwpOw0KKwlyZXR1cm4gQ1RSX09LQVk7DQorfQ0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpTZXRPdmVycmlkZUxpbWl0U3dpdGNoRW4oaW50IHBhcmFtKQ0KK3sNCisJQ3RyZUNhbk5vZGU6OnR4VGFzazxUQUxPTl9Db250cm9sXzFfR2VuZXJhbF8xMG1zX3Q+IHRvRmlsbCA9IEdldFR4PFRBTE9OX0NvbnRyb2xfMV9HZW5lcmFsXzEwbXNfdD4oQ09OVFJPTF8xIHwgR2V0RGV2aWNlTnVtYmVyKCkpOw0KKwlpZiAodG9GaWxsLklzRW1wdHkoKSkgcmV0dXJuIENUUl9VbmV4cGVjdGVkQXJiSWQ7DQorCXRvRmlsbC0+T3ZlcnJpZGVMaW1pdFN3aXRjaEVuID0gcGFyYW07DQorCUZsdXNoVHgodG9GaWxsKTsNCisJcmV0dXJuIENUUl9PS0FZOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6U2V0RmVlZGJhY2tEZXZpY2VTZWxlY3QoaW50IHBhcmFtKQ0KK3sNCisJQ3RyZUNhbk5vZGU6OnR4VGFzazxUQUxPTl9Db250cm9sXzFfR2VuZXJhbF8xMG1zX3Q+IHRvRmlsbCA9IEdldFR4PFRBTE9OX0NvbnRyb2xfMV9HZW5lcmFsXzEwbXNfdD4oQ09OVFJPTF8xIHwgR2V0RGV2aWNlTnVtYmVyKCkpOw0KKwlpZiAodG9GaWxsLklzRW1wdHkoKSkgcmV0dXJuIENUUl9VbmV4cGVjdGVkQXJiSWQ7DQorCXRvRmlsbC0+RmVlZGJhY2tEZXZpY2VTZWxlY3QgPSBwYXJhbTsNCisJRmx1c2hUeCh0b0ZpbGwpOw0KKwlyZXR1cm4gQ1RSX09LQVk7DQorfQ0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpTZXRSZXZNb3REdXJpbmdDbG9zZUxvb3BFbihpbnQgcGFyYW0pDQorew0KKwlDdHJlQ2FuTm9kZTo6dHhUYXNrPFRBTE9OX0NvbnRyb2xfMV9HZW5lcmFsXzEwbXNfdD4gdG9GaWxsID0gR2V0VHg8VEFMT05fQ29udHJvbF8xX0dlbmVyYWxfMTBtc190PihDT05UUk9MXzEgfCBHZXREZXZpY2VOdW1iZXIoKSk7DQorCWlmICh0b0ZpbGwuSXNFbXB0eSgpKSByZXR1cm4gQ1RSX1VuZXhwZWN0ZWRBcmJJZDsNCisJdG9GaWxsLT5SZXZNb3REdXJpbmdDbG9zZUxvb3BFbiA9IHBhcmFtOw0KKwlGbHVzaFR4KHRvRmlsbCk7DQorCXJldHVybiBDVFJfT0tBWTsNCit9DQorQ1RSX0NvZGUgQ2FuVGFsb25TUlg6OlNldE92ZXJyaWRlQnJha2VUeXBlKGludCBwYXJhbSkNCit7DQorCUN0cmVDYW5Ob2RlOjp0eFRhc2s8VEFMT05fQ29udHJvbF8xX0dlbmVyYWxfMTBtc190PiB0b0ZpbGwgPSBHZXRUeDxUQUxPTl9Db250cm9sXzFfR2VuZXJhbF8xMG1zX3Q+KENPTlRST0xfMSB8IEdldERldmljZU51bWJlcigpKTsNCisJaWYgKHRvRmlsbC5Jc0VtcHR5KCkpIHJldHVybiBDVFJfVW5leHBlY3RlZEFyYklkOw0KKwl0b0ZpbGwtPk92ZXJyaWRlQnJha2VUeXBlID0gcGFyYW07DQorCUZsdXNoVHgodG9GaWxsKTsNCisJcmV0dXJuIENUUl9PS0FZOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6U2V0TW9kZVNlbGVjdChpbnQgcGFyYW0pDQorew0KKwlDdHJlQ2FuTm9kZTo6dHhUYXNrPFRBTE9OX0NvbnRyb2xfMV9HZW5lcmFsXzEwbXNfdD4gdG9GaWxsID0gR2V0VHg8VEFMT05fQ29udHJvbF8xX0dlbmVyYWxfMTBtc190PihDT05UUk9MXzEgfCBHZXREZXZpY2VOdW1iZXIoKSk7DQorCWlmICh0b0ZpbGwuSXNFbXB0eSgpKSByZXR1cm4gQ1RSX1VuZXhwZWN0ZWRBcmJJZDsNCisJdG9GaWxsLT5Nb2RlU2VsZWN0ID0gcGFyYW07DQorCUZsdXNoVHgodG9GaWxsKTsNCisJcmV0dXJuIENUUl9PS0FZOw0KK30NCisvKioNCisgKiBAcGFyYW0gbW9kZVNlbGVjdCBzZWxlY3RzIHdoaWNoIG1vZGUuDQorICogQHBhcmFtIGRlbWFuZCBzZXRwdCBvciB0aHJvdHRsZSBvciBtYXN0ZXJJZCB0byBmb2xsb3cuDQorICogQHJldHVybiBlcnJvciBjb2RlLCAwIGlmZiBzdWNjZXNzZnVsLg0KKyAqIFRoaXMgZnVuY3Rpb24gaGFzIHRoZSBhZHZhbnRhZ2Ugb2YgYXRvbWljYWxseSBzZXR0aW5nIG1vZGUgYW5kIGRlbWFuZC4NCisgKi8NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6U2V0TW9kZVNlbGVjdChpbnQgbW9kZVNlbGVjdCxpbnQgZGVtYW5kKQ0KK3sNCisJQ3RyZUNhbk5vZGU6OnR4VGFzazxUQUxPTl9Db250cm9sXzFfR2VuZXJhbF8xMG1zX3Q+IHRvRmlsbCA9IEdldFR4PFRBTE9OX0NvbnRyb2xfMV9HZW5lcmFsXzEwbXNfdD4oQ09OVFJPTF8xIHwgR2V0RGV2aWNlTnVtYmVyKCkpOw0KKwlpZiAodG9GaWxsLklzRW1wdHkoKSkgcmV0dXJuIENUUl9VbmV4cGVjdGVkQXJiSWQ7DQorCXRvRmlsbC0+TW9kZVNlbGVjdCA9IG1vZGVTZWxlY3Q7DQorCXRvRmlsbC0+RGVtYW5kSCA9IGRlbWFuZD4+MTY7DQorCXRvRmlsbC0+RGVtYW5kTSA9IGRlbWFuZD4+ODsNCisJdG9GaWxsLT5EZW1hbmRMID0gZGVtYW5kPj4wOw0KKwlGbHVzaFR4KHRvRmlsbCk7DQorCXJldHVybiBDVFJfT0tBWTsNCit9DQorQ1RSX0NvZGUgQ2FuVGFsb25TUlg6OlNldFByb2ZpbGVTbG90U2VsZWN0KGludCBwYXJhbSkNCit7DQorCUN0cmVDYW5Ob2RlOjp0eFRhc2s8VEFMT05fQ29udHJvbF8xX0dlbmVyYWxfMTBtc190PiB0b0ZpbGwgPSBHZXRUeDxUQUxPTl9Db250cm9sXzFfR2VuZXJhbF8xMG1zX3Q+KENPTlRST0xfMSB8IEdldERldmljZU51bWJlcigpKTsNCisJaWYgKHRvRmlsbC5Jc0VtcHR5KCkpIHJldHVybiBDVFJfVW5leHBlY3RlZEFyYklkOw0KKwl0b0ZpbGwtPlByb2ZpbGVTbG90U2VsZWN0ID0gcGFyYW07DQorCUZsdXNoVHgodG9GaWxsKTsNCisJcmV0dXJuIENUUl9PS0FZOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6U2V0UmFtcFRocm90dGxlKGludCBwYXJhbSkNCit7DQorCUN0cmVDYW5Ob2RlOjp0eFRhc2s8VEFMT05fQ29udHJvbF8xX0dlbmVyYWxfMTBtc190PiB0b0ZpbGwgPSBHZXRUeDxUQUxPTl9Db250cm9sXzFfR2VuZXJhbF8xMG1zX3Q+KENPTlRST0xfMSB8IEdldERldmljZU51bWJlcigpKTsNCisJaWYgKHRvRmlsbC5Jc0VtcHR5KCkpIHJldHVybiBDVFJfVW5leHBlY3RlZEFyYklkOw0KKwl0b0ZpbGwtPlJhbXBUaHJvdHRsZSA9IHBhcmFtOw0KKwlGbHVzaFR4KHRvRmlsbCk7DQorCXJldHVybiBDVFJfT0tBWTsNCit9DQorQ1RSX0NvZGUgQ2FuVGFsb25TUlg6OlNldFJldkZlZWRiYWNrU2Vuc29yKGludCBwYXJhbSkNCit7DQorCUN0cmVDYW5Ob2RlOjp0eFRhc2s8VEFMT05fQ29udHJvbF8xX0dlbmVyYWxfMTBtc190PiB0b0ZpbGwgPSBHZXRUeDxUQUxPTl9Db250cm9sXzFfR2VuZXJhbF8xMG1zX3Q+KENPTlRST0xfMSB8IEdldERldmljZU51bWJlcigpKTsNCisJaWYgKHRvRmlsbC5Jc0VtcHR5KCkpIHJldHVybiBDVFJfVW5leHBlY3RlZEFyYklkOw0KKwl0b0ZpbGwtPlJldkZlZWRiYWNrU2Vuc29yID0gcGFyYW0gPyAxIDogMDsNCisJRmx1c2hUeCh0b0ZpbGwpOw0KKwlyZXR1cm4gQ1RSX09LQVk7DQorfQ0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tIEMgaW50ZXJmYWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8NCitleHRlcm4gIkMiIHsNCit2b2lkICpjX1RhbG9uU1JYX0NyZWF0ZShpbnQgZGV2aWNlTnVtYmVyLCBpbnQgY29udHJvbFBlcmlvZE1zKQ0KK3sNCisJcmV0dXJuIG5ldyBDYW5UYWxvblNSWChkZXZpY2VOdW1iZXIsIGNvbnRyb2xQZXJpb2RNcyk7DQorfQ0KK3ZvaWQgY19UYWxvblNSWF9EZXN0cm95KHZvaWQgKmhhbmRsZSkNCit7DQorCWRlbGV0ZSAoQ2FuVGFsb25TUlgqKWhhbmRsZTsNCit9DQorQ1RSX0NvZGUgY19UYWxvblNSWF9TZXRQYXJhbSh2b2lkICpoYW5kbGUsIGludCBwYXJhbUVudW0sIGRvdWJsZSB2YWx1ZSkNCit7DQorCXJldHVybiAoKENhblRhbG9uU1JYKiloYW5kbGUpLT5TZXRQYXJhbSgoQ2FuVGFsb25TUlg6OnBhcmFtX3QpcGFyYW1FbnVtLCB2YWx1ZSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfUmVxdWVzdFBhcmFtKHZvaWQgKmhhbmRsZSwgaW50IHBhcmFtRW51bSkNCit7DQorCXJldHVybiAoKENhblRhbG9uU1JYKiloYW5kbGUpLT5SZXF1ZXN0UGFyYW0oKENhblRhbG9uU1JYOjpwYXJhbV90KXBhcmFtRW51bSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfR2V0UGFyYW1SZXNwb25zZSh2b2lkICpoYW5kbGUsIGludCBwYXJhbUVudW0sIGRvdWJsZSAqdmFsdWUpDQorew0KKwlyZXR1cm4gKChDYW5UYWxvblNSWCopaGFuZGxlKS0+R2V0UGFyYW1SZXNwb25zZSgoQ2FuVGFsb25TUlg6OnBhcmFtX3QpcGFyYW1FbnVtLCAqdmFsdWUpOw0KK30NCitDVFJfQ29kZSBjX1RhbG9uU1JYX0dldFBhcmFtUmVzcG9uc2VJbnQzMih2b2lkICpoYW5kbGUsIGludCBwYXJhbUVudW0sIGludCAqdmFsdWUpDQorew0KKwlyZXR1cm4gKChDYW5UYWxvblNSWCopaGFuZGxlKS0+R2V0UGFyYW1SZXNwb25zZUludDMyKChDYW5UYWxvblNSWDo6cGFyYW1fdClwYXJhbUVudW0sICp2YWx1ZSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfU2V0U3RhdHVzRnJhbWVSYXRlKHZvaWQgKmhhbmRsZSwgdW5zaWduZWQgZnJhbWVFbnVtLCB1bnNpZ25lZCBwZXJpb2RNcykNCit7DQorCXJldHVybiAoKENhblRhbG9uU1JYKiloYW5kbGUpLT5TZXRTdGF0dXNGcmFtZVJhdGUoZnJhbWVFbnVtLCBwZXJpb2RNcyk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfQ2xlYXJTdGlja3lGYXVsdHModm9pZCAqaGFuZGxlKQ0KK3sNCisJcmV0dXJuICgoQ2FuVGFsb25TUlgqKWhhbmRsZSktPkNsZWFyU3RpY2t5RmF1bHRzKCk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfR2V0RmF1bHRfT3ZlclRlbXAodm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKQ0KK3sNCisJcmV0dXJuICgoQ2FuVGFsb25TUlgqKWhhbmRsZSktPkdldEZhdWx0X092ZXJUZW1wKCpwYXJhbSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfR2V0RmF1bHRfVW5kZXJWb2x0YWdlKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSkNCit7DQorCXJldHVybiAoKENhblRhbG9uU1JYKiloYW5kbGUpLT5HZXRGYXVsdF9VbmRlclZvbHRhZ2UoKnBhcmFtKTsNCit9DQorQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRGYXVsdF9Gb3JMaW0odm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKQ0KK3sNCisJcmV0dXJuICgoQ2FuVGFsb25TUlgqKWhhbmRsZSktPkdldEZhdWx0X0ZvckxpbSgqcGFyYW0pOw0KK30NCitDVFJfQ29kZSBjX1RhbG9uU1JYX0dldEZhdWx0X1JldkxpbSh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pDQorew0KKwlyZXR1cm4gKChDYW5UYWxvblNSWCopaGFuZGxlKS0+R2V0RmF1bHRfUmV2TGltKCpwYXJhbSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfR2V0RmF1bHRfSGFyZHdhcmVGYWlsdXJlKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSkNCit7DQorCXJldHVybiAoKENhblRhbG9uU1JYKiloYW5kbGUpLT5HZXRGYXVsdF9IYXJkd2FyZUZhaWx1cmUoKnBhcmFtKTsNCit9DQorQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRGYXVsdF9Gb3JTb2Z0TGltKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSkNCit7DQorCXJldHVybiAoKENhblRhbG9uU1JYKiloYW5kbGUpLT5HZXRGYXVsdF9Gb3JTb2Z0TGltKCpwYXJhbSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfR2V0RmF1bHRfUmV2U29mdExpbSh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pDQorew0KKwlyZXR1cm4gKChDYW5UYWxvblNSWCopaGFuZGxlKS0+R2V0RmF1bHRfUmV2U29mdExpbSgqcGFyYW0pOw0KK30NCitDVFJfQ29kZSBjX1RhbG9uU1JYX0dldFN0Y2t5RmF1bHRfT3ZlclRlbXAodm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKQ0KK3sNCisJcmV0dXJuICgoQ2FuVGFsb25TUlgqKWhhbmRsZSktPkdldFN0Y2t5RmF1bHRfT3ZlclRlbXAoKnBhcmFtKTsNCit9DQorQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRTdGNreUZhdWx0X1VuZGVyVm9sdGFnZSh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pDQorew0KKwlyZXR1cm4gKChDYW5UYWxvblNSWCopaGFuZGxlKS0+R2V0U3Rja3lGYXVsdF9VbmRlclZvbHRhZ2UoKnBhcmFtKTsNCit9DQorQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRTdGNreUZhdWx0X0ZvckxpbSh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pDQorew0KKwlyZXR1cm4gKChDYW5UYWxvblNSWCopaGFuZGxlKS0+R2V0U3Rja3lGYXVsdF9Gb3JMaW0oKnBhcmFtKTsNCit9DQorQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRTdGNreUZhdWx0X1JldkxpbSh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pDQorew0KKwlyZXR1cm4gKChDYW5UYWxvblNSWCopaGFuZGxlKS0+R2V0U3Rja3lGYXVsdF9SZXZMaW0oKnBhcmFtKTsNCit9DQorQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRTdGNreUZhdWx0X0ZvclNvZnRMaW0odm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKQ0KK3sNCisJcmV0dXJuICgoQ2FuVGFsb25TUlgqKWhhbmRsZSktPkdldFN0Y2t5RmF1bHRfRm9yU29mdExpbSgqcGFyYW0pOw0KK30NCitDVFJfQ29kZSBjX1RhbG9uU1JYX0dldFN0Y2t5RmF1bHRfUmV2U29mdExpbSh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pDQorew0KKwlyZXR1cm4gKChDYW5UYWxvblNSWCopaGFuZGxlKS0+R2V0U3Rja3lGYXVsdF9SZXZTb2Z0TGltKCpwYXJhbSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfR2V0QXBwbGllZFRocm90dGxlKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSkNCit7DQorCXJldHVybiAoKENhblRhbG9uU1JYKiloYW5kbGUpLT5HZXRBcHBsaWVkVGhyb3R0bGUoKnBhcmFtKTsNCit9DQorQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRDbG9zZUxvb3BFcnIodm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKQ0KK3sNCisJcmV0dXJuICgoQ2FuVGFsb25TUlgqKWhhbmRsZSktPkdldENsb3NlTG9vcEVycigqcGFyYW0pOw0KK30NCitDVFJfQ29kZSBjX1RhbG9uU1JYX0dldEZlZWRiYWNrRGV2aWNlU2VsZWN0KHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSkNCit7DQorCXJldHVybiAoKENhblRhbG9uU1JYKiloYW5kbGUpLT5HZXRGZWVkYmFja0RldmljZVNlbGVjdCgqcGFyYW0pOw0KK30NCitDVFJfQ29kZSBjX1RhbG9uU1JYX0dldE1vZGVTZWxlY3Qodm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKQ0KK3sNCisJcmV0dXJuICgoQ2FuVGFsb25TUlgqKWhhbmRsZSktPkdldE1vZGVTZWxlY3QoKnBhcmFtKTsNCit9DQorQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRMaW1pdFN3aXRjaEVuKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSkNCit7DQorCXJldHVybiAoKENhblRhbG9uU1JYKiloYW5kbGUpLT5HZXRMaW1pdFN3aXRjaEVuKCpwYXJhbSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfR2V0TGltaXRTd2l0Y2hDbG9zZWRGb3Iodm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKQ0KK3sNCisJcmV0dXJuICgoQ2FuVGFsb25TUlgqKWhhbmRsZSktPkdldExpbWl0U3dpdGNoQ2xvc2VkRm9yKCpwYXJhbSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfR2V0TGltaXRTd2l0Y2hDbG9zZWRSZXYodm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKQ0KK3sNCisJcmV0dXJuICgoQ2FuVGFsb25TUlgqKWhhbmRsZSktPkdldExpbWl0U3dpdGNoQ2xvc2VkUmV2KCpwYXJhbSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfR2V0U2Vuc29yUG9zaXRpb24odm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKQ0KK3sNCisJcmV0dXJuICgoQ2FuVGFsb25TUlgqKWhhbmRsZSktPkdldFNlbnNvclBvc2l0aW9uKCpwYXJhbSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfR2V0U2Vuc29yVmVsb2NpdHkodm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKQ0KK3sNCisJcmV0dXJuICgoQ2FuVGFsb25TUlgqKWhhbmRsZSktPkdldFNlbnNvclZlbG9jaXR5KCpwYXJhbSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfR2V0Q3VycmVudCh2b2lkICpoYW5kbGUsIGRvdWJsZSAqcGFyYW0pDQorew0KKwlyZXR1cm4gKChDYW5UYWxvblNSWCopaGFuZGxlKS0+R2V0Q3VycmVudCgqcGFyYW0pOw0KK30NCitDVFJfQ29kZSBjX1RhbG9uU1JYX0dldEJyYWtlSXNFbmFibGVkKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSkNCit7DQorCXJldHVybiAoKENhblRhbG9uU1JYKiloYW5kbGUpLT5HZXRCcmFrZUlzRW5hYmxlZCgqcGFyYW0pOw0KK30NCitDVFJfQ29kZSBjX1RhbG9uU1JYX0dldEVuY1Bvc2l0aW9uKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSkNCit7DQorCXJldHVybiAoKENhblRhbG9uU1JYKiloYW5kbGUpLT5HZXRFbmNQb3NpdGlvbigqcGFyYW0pOw0KK30NCitDVFJfQ29kZSBjX1RhbG9uU1JYX0dldEVuY1ZlbCh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pDQorew0KKwlyZXR1cm4gKChDYW5UYWxvblNSWCopaGFuZGxlKS0+R2V0RW5jVmVsKCpwYXJhbSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfR2V0RW5jSW5kZXhSaXNlRXZlbnRzKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSkNCit7DQorCXJldHVybiAoKENhblRhbG9uU1JYKiloYW5kbGUpLT5HZXRFbmNJbmRleFJpc2VFdmVudHMoKnBhcmFtKTsNCit9DQorQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRRdWFkQXBpbih2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pDQorew0KKwlyZXR1cm4gKChDYW5UYWxvblNSWCopaGFuZGxlKS0+R2V0UXVhZEFwaW4oKnBhcmFtKTsNCit9DQorQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRRdWFkQnBpbih2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pDQorew0KKwlyZXR1cm4gKChDYW5UYWxvblNSWCopaGFuZGxlKS0+R2V0UXVhZEJwaW4oKnBhcmFtKTsNCit9DQorQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRRdWFkSWR4cGluKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSkNCit7DQorCXJldHVybiAoKENhblRhbG9uU1JYKiloYW5kbGUpLT5HZXRRdWFkSWR4cGluKCpwYXJhbSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfR2V0QW5hbG9nSW5XaXRoT3Yodm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKQ0KK3sNCisJcmV0dXJuICgoQ2FuVGFsb25TUlgqKWhhbmRsZSktPkdldEFuYWxvZ0luV2l0aE92KCpwYXJhbSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfR2V0QW5hbG9nSW5WZWwodm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKQ0KK3sNCisJcmV0dXJuICgoQ2FuVGFsb25TUlgqKWhhbmRsZSktPkdldEFuYWxvZ0luVmVsKCpwYXJhbSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfR2V0VGVtcCh2b2lkICpoYW5kbGUsIGRvdWJsZSAqcGFyYW0pDQorew0KKwlyZXR1cm4gKChDYW5UYWxvblNSWCopaGFuZGxlKS0+R2V0VGVtcCgqcGFyYW0pOw0KK30NCitDVFJfQ29kZSBjX1RhbG9uU1JYX0dldEJhdHRlcnlWKHZvaWQgKmhhbmRsZSwgZG91YmxlICpwYXJhbSkNCit7DQorCXJldHVybiAoKENhblRhbG9uU1JYKiloYW5kbGUpLT5HZXRCYXR0ZXJ5VigqcGFyYW0pOw0KK30NCitDVFJfQ29kZSBjX1RhbG9uU1JYX0dldFJlc2V0Q291bnQodm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKQ0KK3sNCisJcmV0dXJuICgoQ2FuVGFsb25TUlgqKWhhbmRsZSktPkdldFJlc2V0Q291bnQoKnBhcmFtKTsNCit9DQorQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRSZXNldEZsYWdzKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSkNCit7DQorCXJldHVybiAoKENhblRhbG9uU1JYKiloYW5kbGUpLT5HZXRSZXNldEZsYWdzKCpwYXJhbSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfR2V0RmlybVZlcnModm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKQ0KK3sNCisJcmV0dXJuICgoQ2FuVGFsb25TUlgqKWhhbmRsZSktPkdldEZpcm1WZXJzKCpwYXJhbSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfU2V0RGVtYW5kKHZvaWQgKmhhbmRsZSwgaW50IHBhcmFtKQ0KK3sNCisJcmV0dXJuICgoQ2FuVGFsb25TUlgqKWhhbmRsZSktPlNldERlbWFuZChwYXJhbSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfU2V0T3ZlcnJpZGVMaW1pdFN3aXRjaEVuKHZvaWQgKmhhbmRsZSwgaW50IHBhcmFtKQ0KK3sNCisJcmV0dXJuICgoQ2FuVGFsb25TUlgqKWhhbmRsZSktPlNldE92ZXJyaWRlTGltaXRTd2l0Y2hFbihwYXJhbSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfU2V0RmVlZGJhY2tEZXZpY2VTZWxlY3Qodm9pZCAqaGFuZGxlLCBpbnQgcGFyYW0pDQorew0KKwlyZXR1cm4gKChDYW5UYWxvblNSWCopaGFuZGxlKS0+U2V0RmVlZGJhY2tEZXZpY2VTZWxlY3QocGFyYW0pOw0KK30NCitDVFJfQ29kZSBjX1RhbG9uU1JYX1NldFJldk1vdER1cmluZ0Nsb3NlTG9vcEVuKHZvaWQgKmhhbmRsZSwgaW50IHBhcmFtKQ0KK3sNCisJcmV0dXJuICgoQ2FuVGFsb25TUlgqKWhhbmRsZSktPlNldFJldk1vdER1cmluZ0Nsb3NlTG9vcEVuKHBhcmFtKTsNCit9DQorQ1RSX0NvZGUgY19UYWxvblNSWF9TZXRPdmVycmlkZUJyYWtlVHlwZSh2b2lkICpoYW5kbGUsIGludCBwYXJhbSkNCit7DQorCXJldHVybiAoKENhblRhbG9uU1JYKiloYW5kbGUpLT5TZXRPdmVycmlkZUJyYWtlVHlwZShwYXJhbSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfU2V0TW9kZVNlbGVjdCh2b2lkICpoYW5kbGUsIGludCBwYXJhbSkNCit7DQorCXJldHVybiAoKENhblRhbG9uU1JYKiloYW5kbGUpLT5TZXRNb2RlU2VsZWN0KHBhcmFtKTsNCit9DQorQ1RSX0NvZGUgY19UYWxvblNSWF9TZXRNb2RlU2VsZWN0Mih2b2lkICpoYW5kbGUsIGludCBtb2RlU2VsZWN0LCBpbnQgZGVtYW5kKQ0KK3sNCisJcmV0dXJuICgoQ2FuVGFsb25TUlgqKWhhbmRsZSktPlNldE1vZGVTZWxlY3QobW9kZVNlbGVjdCwgZGVtYW5kKTsNCit9DQorQ1RSX0NvZGUgY19UYWxvblNSWF9TZXRQcm9maWxlU2xvdFNlbGVjdCh2b2lkICpoYW5kbGUsIGludCBwYXJhbSkNCit7DQorCXJldHVybiAoKENhblRhbG9uU1JYKiloYW5kbGUpLT5TZXRQcm9maWxlU2xvdFNlbGVjdChwYXJhbSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfU2V0UmFtcFRocm90dGxlKHZvaWQgKmhhbmRsZSwgaW50IHBhcmFtKQ0KK3sNCisJcmV0dXJuICgoQ2FuVGFsb25TUlgqKWhhbmRsZSktPlNldFJhbXBUaHJvdHRsZShwYXJhbSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfU2V0UmV2RmVlZGJhY2tTZW5zb3Iodm9pZCAqaGFuZGxlLCBpbnQgcGFyYW0pDQorew0KKwlyZXR1cm4gKChDYW5UYWxvblNSWCopaGFuZGxlKS0+U2V0UmV2RmVlZGJhY2tTZW5zb3IocGFyYW0pOw0KK30NCit9DQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvY3RyZS9DYW5UYWxvblNSWC5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvY3RyZS9DYW5UYWxvblNSWC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMjIzNmIKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9jdHJlL0NhblRhbG9uU1JYLmgKQEAgLTAsMCArMSwzNzUgQEAKKy8qKg0KKyAqIEBicmllZiBDQU4gVEFMT04gU1JYIGRyaXZlci4NCisgKg0KKyAqIFRoZSBUQUxPTiBTUlggaXMgZGVzaWduZWQgdG8gaW5zdHJ1bWVudCBhbGwgcnVudGltZSBzaWduYWxzIHBlcmlvZGljYWxseS4gIFRoZSBkZWZhdWx0IHBlcmlvZHMgYXJlIGNob3NlbiB0byBzdXBwb3J0IDE2IFRBTE9Ocw0KKyAqIHdpdGggMTBtcyB1cGRhdGUgcmF0ZSBmb3IgY29udHJvbCAodGhyb3R0bGUgb3Igc2V0cG9pbnQpLiAgSG93ZXZlciB0aGVzZSBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIFNldFN0YXR1c0ZyYW1lUmF0ZS4gQHNlZSBTZXRTdGF0dXNGcmFtZVJhdGUNCisgKiBUaGUgZ2V0dGVycyBmb3IgdGhlc2UgdW5zb2xpY2l0ZWQgc2lnbmFscyBhcmUgYXV0byBnZW5lcmF0ZWQgYXQgdGhlIGJvdHRvbSBvZiB0aGlzIG1vZHVsZS4NCisgKg0KKyAqIExpa2V3aXNlIG1vc3QgY29udHJvbCBzaWduYWxzIGFyZSBzZW50IHBlcmlvZGljYWxseSB1c2luZyB0aGUgZmlyZS1hbmQtZm9yZ2V0IENBTiBBUEkuDQorICogVGhlIHNldHRlcnMgZm9yIHRoZXNlIHVuc29saWNpdGVkIHNpZ25hbHMgYXJlIGF1dG8gZ2VuZXJhdGVkIGF0IHRoZSBib3R0b20gb2YgdGhpcyBtb2R1bGUuDQorICoNCisgKiBTaWduYWxzIHRoYXQgYXJlIG5vdCBhdmFpbGFibGUgaW4gYW4gdW5zb2xpY2l0ZWQgZmFzaGlvbiBhcmUgdGhlIENsb3NlIExvb3AgZ2FpbnMuDQorICogRm9yIHRlYW1zIHRoYXQgaGF2ZSBhIHNpbmdsZSBwcm9maWxlIGZvciB0aGVpciBUQUxPTiBjbG9zZSBsb29wIHRoZXkgY2FuIHVzZSBlaXRoZXIgdGhlIHdlYnBhZ2UgdG8gY29uZmlndXJlIHRoZWlyIFRBTE9OcyBvbmNlDQorICogCW9yIHNldCB0aGUgUElERixJem9uZSxDbG9zZUxvb3BSYW1wUmF0ZSxldGMuLi4gb25jZSBpbiB0aGUgcm9ib3QgYXBwbGljYXRpb24uICBUaGVzZSBwYXJhbWV0ZXJzIGFyZSBzYXZlZCB0byBmbGFzaCBzbyBvbmNlIHRoZXkgYXJlDQorICogCWxvYWRlZCBpbiB0aGUgVEFMT04sIHRoZXkgd2lsbCBwZXJzaXN0IHRocm91Z2ggcG93ZXIgY3ljbGVzIGFuZCBtb2RlIGNoYW5nZXMuDQorICoNCisgKiBGb3IgdGVhbXMgdGhhdCBoYXZlIG9uZSBvciB0d28gcHJvZmlsZXMgdG8gc3dpdGNoIGJldHdlZW4sIHRoZXkgY2FuIHVzZSB0aGUgc2FtZSBzdHJhdGVneSBzaW5jZSB0aGVyZSBhcmUgdHdvIHNsb3RzIHRvIGNob29zZSBmcm9tDQorICogYW5kIHRoZSBQcm9maWxlU2xvdFNlbGVjdCBpcyBwZXJpb2RpY2FsbHkgc2VudCBpbiB0aGUgMTAgbXMgY29udHJvbCBmcmFtZS4NCisgKg0KKyAqIEZvciB0ZWFtcyB0aGF0IHJlcXVpcmUgY2hhbmdpbmcgZ2FpbnMgZnJlcXVlbnRseSwgdGhleSBjYW4gdXNlIHRoZSBzb2xpY2l0aW5nIEFQSSB0byBnZXQgYW5kIHNldCB0aG9zZSBwYXJhbWV0ZXJzLiAgTW9zdCBsaWtlbHkNCisgKiB0aGV5IHdpbGwgb25seSBuZWVkIHRvIHNldCB0aGVtIGluIGEgcGVyaW9kaWMgZmFzaGlvbiBhcyBhIGZ1bmN0aW9uIG9mIHdoYXQgbW90aW9uIHRoZSBhcHBsaWNhdGlvbiBpcyBhdHRlbXB0aW5nLg0KKyAqIElmIHRoaXMgQVBJIGlzIHVzZWQsIGJlIG1pbmRmdWwgb2YgdGhlIENBTiB1dGlsaXphdGlvbiByZXBvcnRlZCBpbiB0aGUgZHJpdmVyIHN0YXRpb24uDQorICoNCisgKiBFbmNvZGVyIHBvc2l0aW9uIGlzIG1lYXN1cmVkIGluIGVuY29kZXIgZWRnZXMuICBFdmVyeSBlZGdlIGlzIGNvdW50ZWQgKHNpbWlsYXIgdG8gcm9ib1JJTyA0WCBtb2RlKS4NCisgKiBBbmFsb2cgcG9zaXRpb24gaXMgMTAgYml0cywgbWVhbmluZyAxMDI0IHRpY2tzIHBlciByb3RhdGlvbiAoMFYgPT4gMy4zVikuDQorICogVXNlIFNldEZlZWRiYWNrRGV2aWNlU2VsZWN0IHRvIHNlbGVjdCB3aGljaCBzZW5zb3IgdHlwZSB5b3UgbmVlZC4gIE9uY2UgeW91IGRvIHRoYXQgeW91IGNhbiB1c2UgR2V0U2Vuc29yUG9zaXRpb24oKQ0KKyAqIGFuZCBHZXRTZW5zb3JWZWxvY2l0eSgpLiAgVGhlc2Ugc2lnbmFscyBhcmUgdXBkYXRlZCBvbiBDQU5CdXMgZXZlcnkgMjBtcyAoYnkgZGVmYXVsdCkuDQorICogSWYgYSByZWxhdGl2ZSBzZW5zb3IgaXMgc2VsZWN0ZWQsIHlvdSBjYW4gemVybyAob3IgY2hhbmdlIHRoZSBjdXJyZW50IHZhbHVlKSB1c2luZyBTZXRTZW5zb3JQb3NpdGlvbi4NCisgKg0KKyAqIEFuYWxvZyBJbnB1dCBhbmQgcXVhZHJhdHVyZSBwb3NpdGlvbiAoYW5kIHZlbG9jaXR5KSBhcmUgYWxzbyBleHBsaWNpdGx5IHJlcG9ydGVkIGluIEdldEVuY1Bvc2l0aW9uLCBHZXRFbmNWZWwsIEdldEFuYWxvZ0luV2l0aE92LCBHZXRBbmFsb2dJblZlbC4NCisgKiBUaGVzZSBzaWduYWxzIGFyZSBhdmFpbGFibGUgYWxsIHRoZSB0aW1lLCByZWdhcmRsZXNzIG9mIHdoYXQgc2Vuc29yIGlzIHNlbGVjdGVkIGF0IGEgcmF0ZSBvZiAxMDBtcy4gIFRoaXMgYWxsb3dzIGVhc3kgaW5zdHJ1bWVudGF0aW9uDQorICogZm9yICJpbiB0aGUgcGl0cyIgY2hlY2tpbmcgb2YgYWxsIHNlbnNvcnMgcmVnYXJkbGVzcyBvZiBtb2Rlc2VsZWN0LiAgVGhlIDEwMG1zIHJhdGUgaXMgb3ZlcnJpZGFibGUgZm9yIHRlYW1zIHdobyB3YW50IHRvIGFjcXVpcmUgc2Vuc29yDQorICogZGF0YSBmb3IgcHJvY2Vzc2luZywgbm90IGp1c3QgaW5zdHJ1bWVudGF0aW9uLiAgT3IganVzdCBzZWxlY3QgdGhlIHNlbnNvciB1c2luZyBTZXRGZWVkYmFja0RldmljZVNlbGVjdCB0byBnZXQgaXQgYXQgMjBtcy4NCisgKg0KKyAqIFZlbG9jaXR5IGlzIGluIHBvc2l0aW9uIHRpY2tzIC8gMTAwbXMuDQorICoNCisgKiBBbGwgb3V0cHV0IHVuaXRzIGFyZSBpbiByZXNwZWN0IHRvIGR1dHkgY3ljbGUgKHRocm90dGxlKSB3aGljaCBpcyAtMTAyMyhmdWxsIHJldmVyc2UpIHRvICsxMDIzIChmdWxsIGZvcndhcmQpLg0KKyAqICBUaGlzIGluY2x1ZGVzIGRlbWFuZCAod2hpY2ggc3BlY2lmaWVzIGR1dHkgY3ljbGUgd2hlbiBpbiBkdXR5IGN5Y2xlIG1vZGUpIGFuZCByYW1wUmFtcCwgd2hpY2ggaXMgaW4gdGhyb3R0bGUgdW5pdHMgcGVyIDEwbXMgKGlmIG5vbnplcm8pLg0KKyAqDQorICogUG9zIGFuZCB2ZWxvY2l0eSBjbG9zZSBsb29wcyBhcmUgY2FsYydkIGFzDQorICogCQllcnIgPSB0YXJnZXQgLSBwb3NPclZlbC4NCisgKiAJCWlFcnIgKz0gZXJyOw0KKyAqIAkJaWYoICAgKElab25lIT0wKSAgYW5kICBhYnMoZXJyKSA+IElab25lKQ0KKyAqIAkJCUNsZWFySWFjY3VtKCkNCisgKiAJCW91dHB1dCA9IFAgWCBlcnIgKyBJIFggaUVyciArIEQgWCBkRXJyICsgRiBYIHRhcmdldA0KKyAqIAkJZEVyciA9IGVyciAtIGxhc3RFcnINCisgKglQLCBJLGFuZCBEIGdhaW5zIGFyZSBhbHdheXMgcG9zaXRpdmUuIEYgY2FuIGJlIG5lZ2F0aXZlLg0KKyAqCU1vdG9yIGRpcmVjdGlvbiBjYW4gYmUgcmV2ZXJzZWQgdXNpbmcgU2V0UmV2TW90RHVyaW5nQ2xvc2VMb29wRW4gaWYgc2Vuc29yIGFuZCBtb3RvciBhcmUgb3V0IG9mIHBoYXNlLg0KKyAqCVNpbWlsYXJseSBmZWVkYmFjayBzZW5zb3IgY2FuIGFsc28gYmUgcmV2ZXJzZWQgKG11bHRpcGxpZWQgYnkgLTEpIGlmIHlvdSBwcmVmZXIgdGhlIHNlbnNvciB0byBiZSBpbnZlcnRlZC4NCisgKg0KKyAqIFAgZ2FpbiBpcyBzcGVjaWZpZWQgaW4gdGhyb3R0bGUgcGVyIGVycm9yIHRpY2suICBGb3IgZXhhbXBsZSwgYSB2YWx1ZSBvZiAxMDIgaXMgfjkuOSUgKHdoaWNoIGlzIDEwMi8xMDIzKSB0aHJvdHRsZSBwZXIgMQ0KKyAqIAkJQURDIHVuaXQoMTBiaXQpIG9yIDEgcXVhZHJhdHVyZSBlbmNvZGVyIGVkZ2UgZGVwZW5kaW5nIG9uIHNlbGVjdGVkIHNlbnNvci4NCisgKg0KKyAqIEkgZ2FpbiBpcyBzcGVjaWZpZWQgaW4gdGhyb3R0bGUgcGVyIGludGVncmF0ZWQgZXJyb3IuIEZvciBleGFtcGxlLCBhIHZhbHVlIG9mIDEwIGVxdWF0ZXMgdG8gfjAuOTklICh3aGljaCBpcyAxMC8xMDIzKQ0KKyAqICAJZm9yIGVhY2ggYWNjdW11bGF0ZWQgQURDIHVuaXQoMTBiaXQpIG9yIDEgcXVhZHJhdHVyZSBlbmNvZGVyIGVkZ2UgZGVwZW5kaW5nIG9uIHNlbGVjdGVkIHNlbnNvci4NCisgKiAgCUNsb3NlIGxvb3AgYW5kIGludGVncmFsIGFjY3VtdWxhdG9yIHJ1bnMgZXZlcnkgMW1zLg0KKyAqDQorICogRCBnYWluIGlzIHNwZWNpZmllZCBpbiB0aHJvdHRsZSBwZXIgZGVyaXZhdGl2ZSBlcnJvci4gRm9yIGV4YW1wbGUgYSB2YWx1ZSBvZiAxMDIgZXF1YXRlcyB0byB+OS45JSAod2hpY2ggaXMgMTAyLzEwMjMpDQorICogCXBlciBjaGFuZ2Ugb2YgMSB1bml0IChBREMgb3IgZW5jb2RlcikgcGVyIG1zLg0KKyAqDQorICogSSBab25lIGlzIHNwZWNpZmllZCBpbiB0aGUgc2FtZSB1bml0cyBhcyBzZW5zb3IgcG9zaXRpb24gKEFEQyB1bml0cyBvciBxdWFkcmF0dXJlIGVkZ2VzKS4gIElmIHBvcy92ZWwgZXJyb3IgaXMgb3V0c2lkZSBvZg0KKyAqIAkJdGhpcyB2YWx1ZSwgdGhlIGludGVncmF0ZWQgZXJyb3Igd2lsbCBhdXRvLWNsZWFyLi4uDQorICogCQlpZiggICAoSVpvbmUhPTApICBhbmQgIGFicyhlcnIpID4gSVpvbmUpDQorICogCQkJQ2xlYXJJYWNjdW0oKQ0KKyAqIAkJLi4udGhpcyBpcyB2ZXJ5IHVzZWZ1bCBpbiBwcmV2ZW50aW5nIGludGVncmFsIHdpbmR1cCBhbmQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIGlmIHVzaW5nIGZ1bGwgUElEIHRvIGtlZXAgc3RhYmlsaXR5IGxvdy4NCisgKg0KKyAqIENsb3NlTG9vcFJhbXBSYXRlIGlzIGluIHRocm90dGxlIHVuaXRzIHBlciAxbXMuICBTZXQgdG8gemVybyB0byBkaXNhYmxlIHJhbXBpbmcuDQorICogCQlXb3JrcyB0aGUgc2FtZSBhcyBSYW1wVGhyb3R0bGUgYnV0IG9ubHkgaXMgaW4gZWZmZWN0IHdoZW4gYSBjbG9zZSBsb29wIG1vZGUgYW5kIHByb2ZpbGUgc2xvdCBpcyBzZWxlY3RlZC4NCisgKg0KKyAqIGF1dG8gZ2VuZXJhdGVkIHVzaW5nIHNwcmVhZHNoZWV0IGFuZCBXcGlDbGFzc0dlbi5jc3Byb2oNCisgKiBAbGluayBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC8xT1VfWlY3ZlpMR1lVUS1VaGM4c1ZBbVVtV1RsVDhYQkZZSzhsZmpnX3RhYy9lZGl0I2dpZD0xNzY2MDQ2OTY3DQorICovDQorI2lmbmRlZiBDYW5UYWxvblNSWF9IXw0KKyNkZWZpbmUgQ2FuVGFsb25TUlhfSF8NCisjaW5jbHVkZSAiY3RyZS5oIgkJCQkvL0JJVCBEZWZpbmVzICsgVHlwZWRlZnMNCisjaW5jbHVkZSAiQ3RyZUNhbk5vZGUuaCINCisjaW5jbHVkZSA8TmV0d29ya0NvbW11bmljYXRpb24vQ0FOU2Vzc2lvbk11eC5oPgkvL0NBTiBDb21tDQorI2luY2x1ZGUgPG1hcD4NCitjbGFzcyBDYW5UYWxvblNSWCA6IHB1YmxpYyBDdHJlQ2FuTm9kZQ0KK3sNCitwcml2YXRlOg0KKw0KKwkvKioganVzdCBpbiBjYXNlIHVzZXIgd2FudHMgdG8gbW9kaWZ5IHBlcmlvZHMgb2YgY2VydGFpbiBzdGF0dXMgZnJhbWVzLg0KKwkgKiAJRGVmYXVsdCB0aGUgdmFycyB0byBtYXRjaCB0aGUgZmlybXdhcmUgZGVmYXVsdC4gKi8NCisJdWludDMyX3QgX3N0YXR1c1JhdGVNc1s0XTsNCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFZhcnMgZm9yIG9wZW5pbmcgYSBDQU4gc3RyZWFtIGlmIGNhbGxlciBuZWVkcyBzaWduYWxzIHRoYXQgcmVxdWlyZSBzb2xpY2l0aW5nICovDQorCXVpbnQzMl90IF9jYW5faDsgCS8vITwgU2Vzc2lvbiBoYW5kbGUgZm9yIGNhdGNoaW5nIHJlc3BvbnNlIHBhcmFtcy4NCisJaW50MzJfdCBfY2FuX3N0YXQ7IC8vITwgU2Vzc2lvbiBoYW5kbGUgc3RhdHVzLg0KKwlzdHJ1Y3QgdENBTlN0cmVhbU1lc3NhZ2UgX21zZ0J1ZmZbMjBdOw0KKwlzdGF0aWMgaW50IGNvbnN0IGtNc2dDYXBhY2l0eQk9IDIwOw0KKwl0eXBlZGVmIHN0ZDo6bWFwPHVpbnQzMl90LCB1aW50MzJfdD4gc2lnc190Ow0KKwlzaWdzX3QgX3NpZ3M7IC8vITwgQ2F0Y2hlcyBzaWduYWwgdXBkYXRlcyB0aGF0IGFyZSBzb2xpY2l0ZWQuICBFeHBlY3QgdGhpcyB0byBiZSB2ZXJ5IGZldy4NCisJdm9pZCBPcGVuU2Vzc2lvbklmTmVlZEJlKCk7DQorCXZvaWQgUHJvY2Vzc1N0cmVhbU1lc3NhZ2VzKCk7DQorCS8qKg0KKwkgKiBTZW5kIGEgb25lIHNob3QgZnJhbWUgdG8gc2V0IGFuIGFyYml0cmFyeSBzaWduYWwuDQorCSAqIE1vc3Qgc2lnbmFscyBhcmUgaW4gdGhlIGNvbnRyb2wgZnJhbWUgc28gYXZvaWQgdXNpbmcgdGhpcyBBUEkgdW5sZXNzIHlvdSBoYXZlIHRvLg0KKwkgKiBVc2UgdGhpcyBhcGkgZm9yLi4uDQorCSAqIC1BIG1vdG9yIGNvbnRyb2xsZXIgcHJvZmlsZSBzaWduYWwgZVByb2ZpbGVQYXJhbV9YWFhzLiAgVGhlc2UgYXJlIGJhY2tlZCB1cCBpbiBmbGFzaC4gIElmIHlvdSBhcmUgZ2Fpbi1zY2hlZHVsaW5nIHRoZW4gY2FsbCB0aGlzIHBlcmlvZGljYWxseS4NCisJICogLURlZmF1bHQgYnJha2UgYW5kIGxpbWl0IHN3aXRjaCBzaWduYWxzLi4uIGVPbkJvb3RfWFhYcy4gIEF2b2lkIGRvaW5nIHRoaXMsIHVzZSB0aGUgb3ZlcnJpZGUgc2lnbmFscyBpbiB0aGUgY29udHJvbCBmcmFtZS4NCisJICogVGFsb24gd2lsbCBhdXRvbWF0aWNhbGx5IHNlbmQgYSBQQVJBTV9SRVNQT05TRSBhZnRlciB0aGUgc2V0LCBzbyBHZXRQYXJhbVJlc3BvbnNlIHdpbGwgY2F0Y2ggdGhlIGxhdGVzdCB2YWx1ZSBhZnRlciBhIGNvdXBsZSBtcy4NCisJICovDQorCUNUUl9Db2RlIFNldFBhcmFtUmF3KHVpbnQzMl90IHBhcmFtRW51bSwgaW50MzJfdCByYXdCaXRzKTsNCisJLyoqDQorCSAqIENoZWNrcyBjYWNoZWQgQ0FOIGZyYW1lcyBhbmQgdXBkYXRpbmcgc29saWNpdGVkIHNpZ25hbHMuDQorCSAqLw0KKwlDVFJfQ29kZSBHZXRQYXJhbVJlc3BvbnNlUmF3KHVpbnQzMl90IHBhcmFtRW51bSwgaW50MzJfdCAmIHJhd0JpdHMpOw0KK3B1YmxpYzoNCisJc3RhdGljIGNvbnN0IGludCBrRGVmYXVsdENvbnRyb2xQZXJpb2RNcyA9IDEwOyAvLyE8IGRlZmF1bHQgY29udHJvbCB1cGRhdGUgcmF0ZSBpcyAxMG1zLg0KKwlDYW5UYWxvblNSWChpbnQgZGV2aWNlTnVtYmVyID0gMCxpbnQgY29udHJvbFBlcmlvZE1zID0ga0RlZmF1bHRDb250cm9sUGVyaW9kTXMpOw0KKwl+Q2FuVGFsb25TUlgoKTsNCisJdm9pZCBTZXQoZG91YmxlIHZhbHVlKTsNCisJLyogbW9kZSBzZWxlY3QgZW51bWVyYXRpb25zICovDQorCXN0YXRpYyBjb25zdCBpbnQga01vZGVfRHV0eUN5Y2xlID0gMDsgLy8hPCBEZW1hbmQgaXMgMTFiaXQgc2lnbmVkIGR1dHkgY3ljbGUgWy0xMDIzLDEwMjNdLg0KKwlzdGF0aWMgY29uc3QgaW50IGtNb2RlX1Bvc2l0aW9uQ2xvc2VMb29wID0gMTsgLy8hPCBQb3NpdGlvbiBQSURGLg0KKwlzdGF0aWMgY29uc3QgaW50IGtNb2RlX1ZlbG9jaXR5Q2xvc2VMb29wID0gMjsgLy8hPCBWZWxvY2l0eSBQSURGLg0KKwlzdGF0aWMgY29uc3QgaW50IGtNb2RlX0N1cnJlbnRDbG9zZUxvb3AgPSAzOyAvLyE8IEN1cnJlbnQgY2xvc2UgbG9vcCAtIG5vdCBkb25lLg0KKwlzdGF0aWMgY29uc3QgaW50IGtNb2RlX1ZvbHRDb21wZW4gPSA0OyAvLyE8IFZvbHRhZ2UgQ29tcGVuc2F0aW9uIE1vZGUgLSBub3QgZG9uZS4gIERlbWFuZCBpcyBmaXhlZCBwdCB0YXJnZXQgOC44IHZvbHRzLg0KKwlzdGF0aWMgY29uc3QgaW50IGtNb2RlX1NsYXZlRm9sbG93ZXIgPSA1OyAvLyE8IERlbWFuZCBpcyB0aGUgNiBiaXQgRGV2aWNlIElEIG9mIHRoZSAnbWFzdGVyJyBUQUxPTiBTUlguDQorCXN0YXRpYyBjb25zdCBpbnQga01vZGVfTm9Ecml2ZSA9IDE1OyAvLyE8IFplcm8gdGhlIG91dHB1dCAoaG9ub3JzIGJyYWtlL2NvYXN0KSByZWdhcmRsZXNzIG9mIGRlbWFuZC4gIE1pZ2h0IGJlIHVzZWZ1bCBpZiB3ZSBuZWVkIHRvIGNoYW5nZSBtb2RlcyBidXQgY2FuJ3QgYXRvbWljYWxseSBjaGFuZ2UgYWxsIHRoZSBzaWduYWxzIHdlIHdhbnQgaW4gYmV0d2Vlbi4NCisJLyogbGltaXQgc3dpdGNoIGVudW1lcmF0aW9ucyAqLw0KKwlzdGF0aWMgY29uc3QgaW50IGtMaW1pdFN3aXRjaE92ZXJyaWRlX1VzZURlZmF1bHRzRnJvbUZsYXNoID0gMTsNCisJc3RhdGljIGNvbnN0IGludCBrTGltaXRTd2l0Y2hPdmVycmlkZV9EaXNhYmxlRndkX0Rpc2FibGVSZXYgPSA0Ow0KKwlzdGF0aWMgY29uc3QgaW50IGtMaW1pdFN3aXRjaE92ZXJyaWRlX0Rpc2FibGVGd2RfRW5hYmxlUmV2ID0gNTsNCisJc3RhdGljIGNvbnN0IGludCBrTGltaXRTd2l0Y2hPdmVycmlkZV9FbmFibGVGd2RfRGlzYWJsZVJldiA9IDY7DQorCXN0YXRpYyBjb25zdCBpbnQga0xpbWl0U3dpdGNoT3ZlcnJpZGVfRW5hYmxlRndkX0VuYWJsZVJldiA9IDc7DQorCS8qIGJyYWtlIG92ZXJyaWRlIGVudW1lcmF0aW9ucyAqLw0KKwlzdGF0aWMgY29uc3QgaW50IGtCcmFrZU92ZXJyaWRlX1VzZURlZmF1bHRzRnJvbUZsYXNoID0gMDsNCisJc3RhdGljIGNvbnN0IGludCBrQnJha2VPdmVycmlkZV9PdmVycmlkZUNvYXN0ID0gMTsNCisJc3RhdGljIGNvbnN0IGludCBrQnJha2VPdmVycmlkZV9PdmVycmlkZUJyYWtlID0gMjsNCisJLyogZmVlZGJhY2sgZGV2aWNlIGVudW1lcmF0aW9ucyAqLw0KKwlzdGF0aWMgY29uc3QgaW50IGtGZWVkYmFja0Rldl9EaWdpdGFsUXVhZEVuYz0wOw0KKwlzdGF0aWMgY29uc3QgaW50IGtGZWVkYmFja0Rldl9BbmFsb2dQb3Q9MjsNCisJc3RhdGljIGNvbnN0IGludCBrRmVlZGJhY2tEZXZfQW5hbG9nRW5jb2Rlcj0zOw0KKwlzdGF0aWMgY29uc3QgaW50IGtGZWVkYmFja0Rldl9Db3VudEV2ZXJ5UmlzaW5nRWRnZT00Ow0KKwlzdGF0aWMgY29uc3QgaW50IGtGZWVkYmFja0Rldl9Db3VudEV2ZXJ5RmFsbGluZ0VkZ2U9NTsNCisJc3RhdGljIGNvbnN0IGludCBrRmVlZGJhY2tEZXZfUG9zSXNQdWxzZVdpZHRoPTg7DQorCS8qIFByb2ZpbGVTbG90U2VsZWN0IGVudW1lcmF0aW9ucyovDQorCXN0YXRpYyBjb25zdCBpbnQga1Byb2ZpbGVTbG90U2VsZWN0X1Nsb3QwID0gMDsNCisJc3RhdGljIGNvbnN0IGludCBrUHJvZmlsZVNsb3RTZWxlY3RfU2xvdDEgPSAxOw0KKyAgICAvKiBzdGF0dXMgZnJhbWUgcmF0ZSB0eXBlcyAqLw0KKyAgICBzdGF0aWMgY29uc3QgaW50IGtTdGF0dXNGcmFtZV9HZW5lcmFsID0gMDsNCisgICAgc3RhdGljIGNvbnN0IGludCBrU3RhdHVzRnJhbWVfRmVlZGJhY2sgPSAxOw0KKyAgICBzdGF0aWMgY29uc3QgaW50IGtTdGF0dXNGcmFtZV9FbmNvZGVyID0gMjsNCisgICAgc3RhdGljIGNvbnN0IGludCBrU3RhdHVzRnJhbWVfQW5hbG9nVGVtcFZiYXQgPSAzOw0KKwkvKioNCisJICogU2lnbmFsIGVudW1lcmF0aW9uIGZvciBnZW5lcmljIHNpZ25hbCBhY2Nlc3MuDQorCSAqIEFsdGhvdWdoIGV2ZXJ5IHNpZ25hbCBpcyBlbnVtZXJhdGVkLCBvbmx5IHVzZSB0aGlzIGZvciB0cmFmZmljIHRoYXQgbXVzdCBiZSBzb2xpY2l0ZWQuDQorCSAqIFVzZSB0aGUgYXV0byBnZW5lcmF0ZWQgZ2V0dGVycy9zZXR0ZXJzIGF0IGJvdHRvbSBvZiB0aGlzIGhlYWRlciBhcyBtdWNoIGFzIHBvc3NpYmxlLg0KKwkgKi8NCisJdHlwZWRlZiBlbnVtIF9wYXJhbV90ew0KKwkJZVByb2ZpbGVQYXJhbVNsb3QwX1A9MSwNCisJCWVQcm9maWxlUGFyYW1TbG90MF9JPTIsDQorCQllUHJvZmlsZVBhcmFtU2xvdDBfRD0zLA0KKwkJZVByb2ZpbGVQYXJhbVNsb3QwX0Y9NCwNCisJCWVQcm9maWxlUGFyYW1TbG90MF9JWm9uZT01LA0KKwkJZVByb2ZpbGVQYXJhbVNsb3QwX0Nsb3NlTG9vcFJhbXBSYXRlPTYsDQorCQllUHJvZmlsZVBhcmFtU2xvdDFfUD0xMSwNCisJCWVQcm9maWxlUGFyYW1TbG90MV9JPTEyLA0KKwkJZVByb2ZpbGVQYXJhbVNsb3QxX0Q9MTMsDQorCQllUHJvZmlsZVBhcmFtU2xvdDFfRj0xNCwNCisJCWVQcm9maWxlUGFyYW1TbG90MV9JWm9uZT0xNSwNCisJCWVQcm9maWxlUGFyYW1TbG90MV9DbG9zZUxvb3BSYW1wUmF0ZT0xNiwNCisJCWVQcm9maWxlUGFyYW1Tb2Z0TGltaXRGb3JUaHJlc2hvbGQ9MjEsDQorCQllUHJvZmlsZVBhcmFtU29mdExpbWl0UmV2VGhyZXNob2xkPTIyLA0KKwkJZVByb2ZpbGVQYXJhbVNvZnRMaW1pdEZvckVuYWJsZT0yMywNCisJCWVQcm9maWxlUGFyYW1Tb2Z0TGltaXRSZXZFbmFibGU9MjQsDQorCQllT25Cb290X0JyYWtlTW9kZT0zMSwNCisJCWVPbkJvb3RfTGltaXRTd2l0Y2hfRm9yd2FyZF9Ob3JtYWxseUNsb3NlZD0zMiwNCisJCWVPbkJvb3RfTGltaXRTd2l0Y2hfUmV2ZXJzZV9Ob3JtYWxseUNsb3NlZD0zMywNCisJCWVPbkJvb3RfTGltaXRTd2l0Y2hfRm9yd2FyZF9EaXNhYmxlPTM0LA0KKwkJZU9uQm9vdF9MaW1pdFN3aXRjaF9SZXZlcnNlX0Rpc2FibGU9MzUsDQorCQllRmF1bHRfT3ZlclRlbXA9NDEsDQorCQllRmF1bHRfVW5kZXJWb2x0YWdlPTQyLA0KKwkJZUZhdWx0X0ZvckxpbT00MywNCisJCWVGYXVsdF9SZXZMaW09NDQsDQorCQllRmF1bHRfSGFyZHdhcmVGYWlsdXJlPTQ1LA0KKwkJZUZhdWx0X0ZvclNvZnRMaW09NDYsDQorCQllRmF1bHRfUmV2U29mdExpbT00NywNCisJCWVTdGNreUZhdWx0X092ZXJUZW1wPTQ4LA0KKwkJZVN0Y2t5RmF1bHRfVW5kZXJWb2x0YWdlPTQ5LA0KKwkJZVN0Y2t5RmF1bHRfRm9yTGltPTUwLA0KKwkJZVN0Y2t5RmF1bHRfUmV2TGltPTUxLA0KKwkJZVN0Y2t5RmF1bHRfRm9yU29mdExpbT01MiwNCisJCWVTdGNreUZhdWx0X1JldlNvZnRMaW09NTMsDQorCQllQXBwbGllZFRocm90dGxlPTYxLA0KKwkJZUNsb3NlTG9vcEVycj02MiwNCisJCWVGZWVkYmFja0RldmljZVNlbGVjdD02MywNCisJCWVSZXZNb3REdXJpbmdDbG9zZUxvb3BFbj02NCwNCisJCWVNb2RlU2VsZWN0PTY1LA0KKwkJZVByb2ZpbGVTbG90U2VsZWN0PTY2LA0KKwkJZVJhbXBUaHJvdHRsZT02NywNCisJCWVSZXZGZWVkYmFja1NlbnNvcj02OCwNCisJCWVMaW1pdFN3aXRjaEVuPTY5LA0KKwkJZUxpbWl0U3dpdGNoQ2xvc2VkRm9yPTcwLA0KKwkJZUxpbWl0U3dpdGNoQ2xvc2VkUmV2PTcxLA0KKwkJZVNlbnNvclBvc2l0aW9uPTczLA0KKwkJZVNlbnNvclZlbG9jaXR5PTc0LA0KKwkJZUN1cnJlbnQ9NzUsDQorCQllQnJha2VJc0VuYWJsZWQ9NzYsDQorCQllRW5jUG9zaXRpb249NzcsDQorCQllRW5jVmVsPTc4LA0KKwkJZUVuY0luZGV4UmlzZUV2ZW50cz03OSwNCisJCWVRdWFkQXBpbj04MCwNCisJCWVRdWFkQnBpbj04MSwNCisJCWVRdWFkSWR4cGluPTgyLA0KKwkJZUFuYWxvZ0luV2l0aE92PTgzLA0KKwkJZUFuYWxvZ0luVmVsPTg0LA0KKwkJZVRlbXA9ODUsDQorCQllQmF0dGVyeVY9ODYsDQorCQllUmVzZXRDb3VudD04NywNCisJCWVSZXNldEZsYWdzPTg4LA0KKwkJZUZpcm1WZXJzPTg5LA0KKwkJZVNldHRpbmdzQ2hhbmdlZD05MCwNCisJCWVRdWFkRmlsdGVyRW49OTEsCQ0KKwkJZVBpZElhY2N1bT05MywNCisJfXBhcmFtX3Q7DQorICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tc2V0dGVycyBhbmQgZ2V0dGVycyB0aGF0IHVzZSB0aGUgc29saWNhdGVkIHBhcmFtIHJlcXVlc3QvcmVzcG9uc2UtLS0tLS0tLS0tLS0tKi8vKioNCisgICAgICogU2VuZCBhIG9uZSBzaG90IGZyYW1lIHRvIHNldCBhbiBhcmJpdHJhcnkgc2lnbmFsLg0KKyAgICAgKiBNb3N0IHNpZ25hbHMgYXJlIGluIHRoZSBjb250cm9sIGZyYW1lIHNvIGF2b2lkIHVzaW5nIHRoaXMgQVBJIHVubGVzcyB5b3UgaGF2ZSB0by4NCisgICAgICogVXNlIHRoaXMgYXBpIGZvci4uLg0KKyAgICAgKiAtQSBtb3RvciBjb250cm9sbGVyIHByb2ZpbGUgc2lnbmFsIGVQcm9maWxlUGFyYW1fWFhYcy4gIFRoZXNlIGFyZSBiYWNrZWQgdXAgaW4gZmxhc2guICBJZiB5b3UgYXJlIGdhaW4tc2NoZWR1bGluZyB0aGVuIGNhbGwgdGhpcyBwZXJpb2RpY2FsbHkuDQorICAgICAqIC1EZWZhdWx0IGJyYWtlIGFuZCBsaW1pdCBzd2l0Y2ggc2lnbmFscy4uLiBlT25Cb290X1hYWHMuICBBdm9pZCBkb2luZyB0aGlzLCB1c2UgdGhlIG92ZXJyaWRlIHNpZ25hbHMgaW4gdGhlIGNvbnRyb2wgZnJhbWUuDQorICAgICAqIFRhbG9uIHdpbGwgYXV0b21hdGljYWxseSBzZW5kIGEgUEFSQU1fUkVTUE9OU0UgYWZ0ZXIgdGhlIHNldCwgc28gR2V0UGFyYW1SZXNwb25zZSB3aWxsIGNhdGNoIHRoZSBsYXRlc3QgdmFsdWUgYWZ0ZXIgYSBjb3VwbGUgbXMuDQorICAgICAqLw0KKwlDVFJfQ29kZSBTZXRQYXJhbShwYXJhbV90IHBhcmFtRW51bSwgZG91YmxlIHZhbHVlKTsNCisJLyoqDQorCSAqIEFza3MgVEFMT04gdG8gaW1tZWRpZXRlbHkgcmVzcG9uZCB3aXRoIHNpZ25hbCB2YWx1ZS4gIFRoaXMgQVBJIGlzIG9ubHkgdXNlZCBmb3Igc2lnbmFscyB0aGF0IGFyZSBub3Qgc2VudCBwZXJpb2RpY2FsbHkuDQorCSAqIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgcmVhZGluZyBwYXJhbXMgdGhhdCByYXJlbHkgY2hhbmdlIGxpa2UgTGltaXQgU3dpdGNoIHNldHRpbmdzIGFuZCBQSURGIHZhbHVlcy4NCisJICAqIEBwYXJhbSBwYXJhbSB0byByZXF1ZXN0Lg0KKwkgKi8NCisJQ1RSX0NvZGUgUmVxdWVzdFBhcmFtKHBhcmFtX3QgcGFyYW1FbnVtKTsNCisJQ1RSX0NvZGUgR2V0UGFyYW1SZXNwb25zZShwYXJhbV90IHBhcmFtRW51bSwgZG91YmxlICYgdmFsdWUpOw0KKwlDVFJfQ29kZSBHZXRQYXJhbVJlc3BvbnNlSW50MzIocGFyYW1fdCBwYXJhbUVudW0sIGludCAmIHZhbHVlKTsNCisgICAgLyotLS0tLSBnZXR0ZXJzIGFuZCBzZXR0ZXJzIHRoYXQgdXNlIHBhcmFtIHJlcXVlc3QvcmVzcG9uc2UuIFRoZXNlIHNpZ25hbHMgYXJlIGJhY2tlZCB1cCBpbiBmbGFzaCBhbmQgd2lsbCBzdXJ2aXZlIGEgcG93ZXIgY3ljbGUuIC0tLS0tLS0tLSovDQorCS8qLS0tLS0gSWYgeW91ciBhcHBsaWNhdGlvbiByZXF1aXJlcyBjaGFuZ2luZyB0aGVzZSB2YWx1ZXMgY29uc2lkZXIgdXNpbmcgYm90aCBzbG90cyBhbmQgc3dpdGNoIGJldHdlZW4gc2xvdDAgPD0+IHNsb3QxLiAtLS0tLS0tLS0tLS0tLS0tLS0qLw0KKwkvKi0tLS0tIElmIHlvdXIgYXBwbGljYXRpb24gcmVxdWlyZXMgY2hhbmdpbmcgdGhlc2Ugc2lnbmFscyBmcmVxdWVudGx5IHRoZW4gaXQgbWFrZXMgc2Vuc2UgdG8gbGV2ZXJhZ2UgdGhpcyBBUEkuIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisJLyotLS0tLSBHZXR0ZXJzIGRvbid0IGJsb2NrLCBzbyBpdCBtYXkgcmVxdWlyZSBzZXZlcmFsIGNhbGxzIHRvIGdldCB0aGUgbGF0ZXN0IHZhbHVlLiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorCUNUUl9Db2RlIFNldFBnYWluKHVuc2lnbmVkIHNsb3RJZHgsZG91YmxlIGdhaW4pOw0KKwlDVFJfQ29kZSBTZXRJZ2Fpbih1bnNpZ25lZCBzbG90SWR4LGRvdWJsZSBnYWluKTsNCisJQ1RSX0NvZGUgU2V0RGdhaW4odW5zaWduZWQgc2xvdElkeCxkb3VibGUgZ2Fpbik7DQorCUNUUl9Db2RlIFNldEZnYWluKHVuc2lnbmVkIHNsb3RJZHgsZG91YmxlIGdhaW4pOw0KKwlDVFJfQ29kZSBTZXRJem9uZSh1bnNpZ25lZCBzbG90SWR4LGludCB6b25lKTsNCisJQ1RSX0NvZGUgU2V0Q2xvc2VMb29wUmFtcFJhdGUodW5zaWduZWQgc2xvdElkeCxpbnQgY2xvc2VMb29wUmFtcFJhdGUpOw0KKwlDVFJfQ29kZSBTZXRTZW5zb3JQb3NpdGlvbihpbnQgcG9zKTsNCisJQ1RSX0NvZGUgU2V0Rm9yd2FyZFNvZnRMaW1pdChpbnQgZm9yd2FyZExpbWl0KTsNCisJQ1RSX0NvZGUgU2V0UmV2ZXJzZVNvZnRMaW1pdChpbnQgcmV2ZXJzZUxpbWl0KTsNCisJQ1RSX0NvZGUgU2V0Rm9yd2FyZFNvZnRFbmFibGUoaW50IGVuYWJsZSk7DQorCUNUUl9Db2RlIFNldFJldmVyc2VTb2Z0RW5hYmxlKGludCBlbmFibGUpOw0KKwlDVFJfQ29kZSBHZXRQZ2Fpbih1bnNpZ25lZCBzbG90SWR4LGRvdWJsZSAmIGdhaW4pOw0KKwlDVFJfQ29kZSBHZXRJZ2Fpbih1bnNpZ25lZCBzbG90SWR4LGRvdWJsZSAmIGdhaW4pOw0KKwlDVFJfQ29kZSBHZXREZ2Fpbih1bnNpZ25lZCBzbG90SWR4LGRvdWJsZSAmIGdhaW4pOw0KKwlDVFJfQ29kZSBHZXRGZ2Fpbih1bnNpZ25lZCBzbG90SWR4LGRvdWJsZSAmIGdhaW4pOw0KKwlDVFJfQ29kZSBHZXRJem9uZSh1bnNpZ25lZCBzbG90SWR4LGludCAmIHpvbmUpOw0KKwlDVFJfQ29kZSBHZXRDbG9zZUxvb3BSYW1wUmF0ZSh1bnNpZ25lZCBzbG90SWR4LGludCAmIGNsb3NlTG9vcFJhbXBSYXRlKTsNCisJQ1RSX0NvZGUgR2V0Rm9yd2FyZFNvZnRMaW1pdChpbnQgJiBmb3J3YXJkTGltaXQpOw0KKwlDVFJfQ29kZSBHZXRSZXZlcnNlU29mdExpbWl0KGludCAmIHJldmVyc2VMaW1pdCk7DQorCUNUUl9Db2RlIEdldEZvcndhcmRTb2Z0RW5hYmxlKGludCAmIGVuYWJsZSk7DQorCUNUUl9Db2RlIEdldFJldmVyc2VTb2Z0RW5hYmxlKGludCAmIGVuYWJsZSk7DQorCS8qKg0KKwkgKiBDaGFuZ2UgdGhlIHBlcmlvZE1zIG9mIGEgVEFMT04ncyBzdGF0dXMgZnJhbWUuICBTZWUga1N0YXR1c0ZyYW1lXyogZW51bXMgZm9yIHdoYXQncyBhdmFpbGFibGUuDQorCSAqLw0KKwlDVFJfQ29kZSBTZXRTdGF0dXNGcmFtZVJhdGUodW5zaWduZWQgZnJhbWVFbnVtLCB1bnNpZ25lZCBwZXJpb2RNcyk7DQorCS8qKg0KKwkgKiBDbGVhciBhbGwgc3RpY2t5IGZhdWx0cyBpbiBUQUxPTi4NCisJICovDQorCUNUUl9Db2RlIENsZWFyU3RpY2t5RmF1bHRzKCk7DQorICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGF1dG8gZ2VuZXJhdGVkLiAgVGhpcyBBUEkgaXMgb3B0aW1hbCBzaW5jZSBpdCB1c2VzIHRoZSBmaXJlLWFuZC1mb3JnZXQgQ0FOIGludGVyZmFjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGhlc2Ugc2lnbmFscyBzaG91bGQgY292ZXIgdGhlIG1ham9yaXR5IG9mIGFsbCB1c2UgY2FzZXMuIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKwlDVFJfQ29kZSBHZXRGYXVsdF9PdmVyVGVtcChpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0RmF1bHRfVW5kZXJWb2x0YWdlKGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRGYXVsdF9Gb3JMaW0oaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldEZhdWx0X1JldkxpbShpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0RmF1bHRfSGFyZHdhcmVGYWlsdXJlKGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRGYXVsdF9Gb3JTb2Z0TGltKGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRGYXVsdF9SZXZTb2Z0TGltKGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRTdGNreUZhdWx0X092ZXJUZW1wKGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRTdGNreUZhdWx0X1VuZGVyVm9sdGFnZShpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0U3Rja3lGYXVsdF9Gb3JMaW0oaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldFN0Y2t5RmF1bHRfUmV2TGltKGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRTdGNreUZhdWx0X0ZvclNvZnRMaW0oaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldFN0Y2t5RmF1bHRfUmV2U29mdExpbShpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0QXBwbGllZFRocm90dGxlKGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRDbG9zZUxvb3BFcnIoaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldEZlZWRiYWNrRGV2aWNlU2VsZWN0KGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRNb2RlU2VsZWN0KGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRMaW1pdFN3aXRjaEVuKGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRMaW1pdFN3aXRjaENsb3NlZEZvcihpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0TGltaXRTd2l0Y2hDbG9zZWRSZXYoaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldFNlbnNvclBvc2l0aW9uKGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRTZW5zb3JWZWxvY2l0eShpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0Q3VycmVudChkb3VibGUgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0QnJha2VJc0VuYWJsZWQoaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldEVuY1Bvc2l0aW9uKGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRFbmNWZWwoaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldEVuY0luZGV4UmlzZUV2ZW50cyhpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0UXVhZEFwaW4oaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldFF1YWRCcGluKGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRRdWFkSWR4cGluKGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRBbmFsb2dJbldpdGhPdihpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0QW5hbG9nSW5WZWwoaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldFRlbXAoZG91YmxlICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldEJhdHRlcnlWKGRvdWJsZSAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRSZXNldENvdW50KGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRSZXNldEZsYWdzKGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRGaXJtVmVycyhpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgU2V0RGVtYW5kKGludCBwYXJhbSk7DQorCUNUUl9Db2RlIFNldE92ZXJyaWRlTGltaXRTd2l0Y2hFbihpbnQgcGFyYW0pOw0KKwlDVFJfQ29kZSBTZXRGZWVkYmFja0RldmljZVNlbGVjdChpbnQgcGFyYW0pOw0KKwlDVFJfQ29kZSBTZXRSZXZNb3REdXJpbmdDbG9zZUxvb3BFbihpbnQgcGFyYW0pOw0KKwlDVFJfQ29kZSBTZXRPdmVycmlkZUJyYWtlVHlwZShpbnQgcGFyYW0pOw0KKwlDVFJfQ29kZSBTZXRNb2RlU2VsZWN0KGludCBwYXJhbSk7DQorCUNUUl9Db2RlIFNldE1vZGVTZWxlY3QoaW50IG1vZGVTZWxlY3QsaW50IGRlbWFuZCk7DQorCUNUUl9Db2RlIFNldFByb2ZpbGVTbG90U2VsZWN0KGludCBwYXJhbSk7DQorCUNUUl9Db2RlIFNldFJhbXBUaHJvdHRsZShpbnQgcGFyYW0pOw0KKwlDVFJfQ29kZSBTZXRSZXZGZWVkYmFja1NlbnNvcihpbnQgcGFyYW0pOw0KK307DQorZXh0ZXJuICJDIiB7DQorCXZvaWQgKmNfVGFsb25TUlhfQ3JlYXRlKGludCBkZXZpY2VOdW1iZXIsIGludCBjb250cm9sUGVyaW9kTXMpOw0KKwl2b2lkIGNfVGFsb25TUlhfRGVzdHJveSh2b2lkICpoYW5kbGUpOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX1NldFBhcmFtKHZvaWQgKmhhbmRsZSwgaW50IHBhcmFtRW51bSwgZG91YmxlIHZhbHVlKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9SZXF1ZXN0UGFyYW0odm9pZCAqaGFuZGxlLCBpbnQgcGFyYW1FbnVtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRQYXJhbVJlc3BvbnNlKHZvaWQgKmhhbmRsZSwgaW50IHBhcmFtRW51bSwgZG91YmxlICp2YWx1ZSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0UGFyYW1SZXNwb25zZUludDMyKHZvaWQgKmhhbmRsZSwgaW50IHBhcmFtRW51bSwgaW50ICp2YWx1ZSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfU2V0U3RhdHVzRnJhbWVSYXRlKHZvaWQgKmhhbmRsZSwgdW5zaWduZWQgZnJhbWVFbnVtLCB1bnNpZ25lZCBwZXJpb2RNcyk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfQ2xlYXJTdGlja3lGYXVsdHModm9pZCAqaGFuZGxlKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRGYXVsdF9PdmVyVGVtcCh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldEZhdWx0X1VuZGVyVm9sdGFnZSh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldEZhdWx0X0ZvckxpbSh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldEZhdWx0X1JldkxpbSh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldEZhdWx0X0hhcmR3YXJlRmFpbHVyZSh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldEZhdWx0X0ZvclNvZnRMaW0odm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRGYXVsdF9SZXZTb2Z0TGltKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0U3Rja3lGYXVsdF9PdmVyVGVtcCh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldFN0Y2t5RmF1bHRfVW5kZXJWb2x0YWdlKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0U3Rja3lGYXVsdF9Gb3JMaW0odm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRTdGNreUZhdWx0X1JldkxpbSh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldFN0Y2t5RmF1bHRfRm9yU29mdExpbSh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldFN0Y2t5RmF1bHRfUmV2U29mdExpbSh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldEFwcGxpZWRUaHJvdHRsZSh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldENsb3NlTG9vcEVycih2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldEZlZWRiYWNrRGV2aWNlU2VsZWN0KHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0TW9kZVNlbGVjdCh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldExpbWl0U3dpdGNoRW4odm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRMaW1pdFN3aXRjaENsb3NlZEZvcih2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldExpbWl0U3dpdGNoQ2xvc2VkUmV2KHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0U2Vuc29yUG9zaXRpb24odm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRTZW5zb3JWZWxvY2l0eSh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldEN1cnJlbnQodm9pZCAqaGFuZGxlLCBkb3VibGUgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRCcmFrZUlzRW5hYmxlZCh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldEVuY1Bvc2l0aW9uKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0RW5jVmVsKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0RW5jSW5kZXhSaXNlRXZlbnRzKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0UXVhZEFwaW4odm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRRdWFkQnBpbih2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldFF1YWRJZHhwaW4odm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRBbmFsb2dJbldpdGhPdih2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldEFuYWxvZ0luVmVsKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0VGVtcCh2b2lkICpoYW5kbGUsIGRvdWJsZSAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldEJhdHRlcnlWKHZvaWQgKmhhbmRsZSwgZG91YmxlICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0UmVzZXRDb3VudCh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldFJlc2V0RmxhZ3Modm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRGaXJtVmVycyh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX1NldERlbWFuZCh2b2lkICpoYW5kbGUsIGludCBwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfU2V0T3ZlcnJpZGVMaW1pdFN3aXRjaEVuKHZvaWQgKmhhbmRsZSwgaW50IHBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9TZXRGZWVkYmFja0RldmljZVNlbGVjdCh2b2lkICpoYW5kbGUsIGludCBwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfU2V0UmV2TW90RHVyaW5nQ2xvc2VMb29wRW4odm9pZCAqaGFuZGxlLCBpbnQgcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX1NldE92ZXJyaWRlQnJha2VUeXBlKHZvaWQgKmhhbmRsZSwgaW50IHBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9TZXRNb2RlU2VsZWN0KHZvaWQgKmhhbmRsZSwgaW50IHBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9TZXRNb2RlU2VsZWN0Mih2b2lkICpoYW5kbGUsIGludCBtb2RlU2VsZWN0LCBpbnQgZGVtYW5kKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9TZXRQcm9maWxlU2xvdFNlbGVjdCh2b2lkICpoYW5kbGUsIGludCBwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfU2V0UmFtcFRocm90dGxlKHZvaWQgKmhhbmRsZSwgaW50IHBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9TZXRSZXZGZWVkYmFja1NlbnNvcih2b2lkICpoYW5kbGUsIGludCBwYXJhbSk7DQorfQ0KKyNlbmRpZg0KKw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL2N0cmUvQ3RyZUNhbk5vZGUuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvY3RyZS9DdHJlQ2FuTm9kZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJlMzYyMAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL2N0cmUvQ3RyZUNhbk5vZGUuY3BwCkBAIC0wLDAgKzEsMTAxIEBACisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMiDQorDQorI2luY2x1ZGUgIkN0cmVDYW5Ob2RlLmgiDQorI2luY2x1ZGUgIk5ldHdvcmtDb21tdW5pY2F0aW9uL0NBTlNlc3Npb25NdXguaCINCisjaW5jbHVkZSA8c3RyaW5nLmg+IC8vIG1lbXNldA0KKyNpbmNsdWRlIDx1bmlzdGQuaD4gLy8gdXNsZWVwDQorDQorc3RhdGljIGNvbnN0IFVJTlQzMiBrRnVsbE1lc3NhZ2VJRE1hc2sgPSAweDFmZmZmZmZmOw0KKw0KK0N0cmVDYW5Ob2RlOjpDdHJlQ2FuTm9kZShVSU5UOCBkZXZpY2VOdW1iZXIpDQorew0KKwlfZGV2aWNlTnVtYmVyID0gZGV2aWNlTnVtYmVyOw0KK30NCitDdHJlQ2FuTm9kZTo6fkN0cmVDYW5Ob2RlKCkNCit7DQorfQ0KK3ZvaWQgQ3RyZUNhbk5vZGU6OlJlZ2lzdGVyUngodWludDMyX3QgYXJiSWQpDQorew0KKwkvKiBubyBuZWVkIHRvIGRvIGFueXRoaW5nLCB3ZSBqdXN0IHVzZSBuZXcgQVBJIHRvIHBvbGwgbGFzdCByZWNlaXZlZCBtZXNzYWdlICovDQorfQ0KK3ZvaWQgQ3RyZUNhbk5vZGU6OlJlZ2lzdGVyVHgodWludDMyX3QgYXJiSWQsIHVpbnQzMl90IHBlcmlvZE1zKQ0KK3sNCisJaW50MzJfdCBzdGF0dXMgPSAwOw0KKw0KKwl0eEpvYl90IGpvYiA9IHswfTsNCisJam9iLmFyYklkID0gYXJiSWQ7DQorCWpvYi5wZXJpb2RNcyA9IHBlcmlvZE1zOw0KKwlfdHhKb2JzW2FyYklkXSA9IGpvYjsNCisJRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0NBTlNlc3Npb25NdXhfc2VuZE1lc3NhZ2UoCWpvYi5hcmJJZCwNCisJCQkJCQkJCQkJCQkJCWpvYi50b1NlbmQsDQorCQkJCQkJCQkJCQkJCQk4LA0KKwkJCQkJCQkJCQkJCQkJam9iLnBlcmlvZE1zLA0KKwkJCQkJCQkJCQkJCQkJJnN0YXR1cyk7DQorfQ0KK3RpbWVzcGVjIGRpZmYoY29uc3QgdGltZXNwZWMgJiBzdGFydCwgY29uc3QgdGltZXNwZWMgJiBlbmQpDQorew0KKwl0aW1lc3BlYyB0ZW1wOw0KKwlpZiAoKGVuZC50dl9uc2VjLXN0YXJ0LnR2X25zZWMpPDApIHsNCisJCXRlbXAudHZfc2VjID0gZW5kLnR2X3NlYy1zdGFydC50dl9zZWMtMTsNCisJCXRlbXAudHZfbnNlYyA9IDEwMDAwMDAwMDArZW5kLnR2X25zZWMtc3RhcnQudHZfbnNlYzsNCisJfSBlbHNlIHsNCisJCXRlbXAudHZfc2VjID0gZW5kLnR2X3NlYy1zdGFydC50dl9zZWM7DQorCQl0ZW1wLnR2X25zZWMgPSBlbmQudHZfbnNlYy1zdGFydC50dl9uc2VjOw0KKwl9DQorCXJldHVybiB0ZW1wOw0KK30NCitDVFJfQ29kZSBDdHJlQ2FuTm9kZTo6R2V0UngodWludDMyX3QgYXJiSWQsdWludDhfdCAqIGRhdGFCeXRlcywgdWludDMyX3QgdGltZW91dE1zKQ0KK3sNCisJQ1RSX0NvZGUgcmV0dmFsID0gQ1RSX09LQVk7DQorCWludDMyX3Qgc3RhdHVzID0gMDsNCisJdWludDhfdCBsZW4gPSAwOw0KKwl1aW50MzJfdCB0aW1lU3RhbXA7DQorCS8qIGNhcCB0aW1lb3V0IGF0IDk5OW1zICovDQorCWlmKHRpbWVvdXRNcyA+IDk5OSkNCisJCXRpbWVvdXRNcyA9IDk5OTsNCisJRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0NBTlNlc3Npb25NdXhfcmVjZWl2ZU1lc3NhZ2UoJmFyYklkLGtGdWxsTWVzc2FnZUlETWFzayxkYXRhQnl0ZXMsJmxlbiwmdGltZVN0YW1wLCZzdGF0dXMpOw0KKwlpZihzdGF0dXMgPT0gMCl7DQorCQkvKiBmcmVzaCB1cGRhdGUgKi8NCisJCXJ4RXZlbnRfdCAmIHIgPSBfcnhSeEV2ZW50c1thcmJJZF07IC8qIGxvb2t1cCBlbnRyeSBvciBtYWtlIGEgZGVmYXVsdCBuZXcgb25lIHdpdGggYWxsIHplcm9lcyAqLw0KKwkJY2xvY2tfZ2V0dGltZSgyLCZyLnRpbWUpOyAJCQkvKiBmaWxsIGluIHRpbWUgKi8NCisJCW1lbWNweShyLmJ5dGVzLCAgZGF0YUJ5dGVzLCAgOCk7CS8qIGZpbGwgaW4gZGF0YWJ5dGVzICovDQorCX1lbHNlew0KKwkJLyogZGlkIG5vdCBnZXQgdGhlIG1lc3NhZ2UgKi8NCisJCXJ4UnhFdmVudHNfdDo6aXRlcmF0b3IgaSA9IF9yeFJ4RXZlbnRzLmZpbmQoYXJiSWQpOw0KKwkJaWYoaSA9PSBfcnhSeEV2ZW50cy5lbmQoKSl7DQorCQkJLyogd2UndmUgbmV2ZXIgZ290dGVuIHRoaXMgbWVzYWdlICovDQorCQkJcmV0dmFsID0gQ1RSX1J4VGltZW91dDsNCisJCQkvKiBmaWxsIGNhbGxlcidzIGJ1ZmZlciB3aXRoIHplcm9zICovDQorCQkJbWVtc2V0KGRhdGFCeXRlcywwLDgpOw0KKwkJfWVsc2V7DQorCQkJLyogd2UndmUgZ290dGVuIHRoaXMgbWVzc2FnZSBiZWZvcmUgYnV0IG5vdCByZWNlbnRseSAqLw0KKwkJCW1lbWNweShkYXRhQnl0ZXMsaS0+c2Vjb25kLmJ5dGVzLDgpOw0KKwkJCS8qIGdldCB0aGUgdGltZSBub3cgKi8NCisJCQlzdHJ1Y3QgdGltZXNwZWMgdGVtcDsNCisJCQljbG9ja19nZXR0aW1lKDIsJnRlbXApOyAvKiBnZXQgbm93ICovDQorCQkJLyogaG93IGxvbmcgaGFzIGl0IGJlZW4/ICovDQorCQkJdGVtcCA9IGRpZmYoaS0+c2Vjb25kLnRpbWUsdGVtcCk7IC8qIHRlbXAgPSBub3cgLSBsYXN0ICovDQorCQkJaWYodGVtcC50dl9zZWMgPiAwKXsNCisJCQkJcmV0dmFsID0gQ1RSX1J4VGltZW91dDsNCisJCQl9ZWxzZSBpZih0ZW1wLnR2X25zZWMgPiAoKGludDMyX3QpdGltZW91dE1zKjEwMDAqMTAwMCkpew0KKwkJCQlyZXR2YWwgPSBDVFJfUnhUaW1lb3V0Ow0KKwkJCX1lbHNlIHsNCisJCQkJLyogb3VyIGxhc3QgdXBkYXRlIHdhcyByZWNlbnQgZW5vdWdoICovDQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCXJldHVybiByZXR2YWw7DQorfQ0KK3ZvaWQgQ3RyZUNhbk5vZGU6OkZsdXNoVHgodWludDMyX3QgYXJiSWQpDQorew0KKwlpbnQzMl90IHN0YXR1cyA9IDA7DQorCXR4Sm9ic190OjppdGVyYXRvciBpdGVyID0gX3R4Sm9icy5maW5kKGFyYklkKTsNCisJaWYoaXRlciAhPSBfdHhKb2JzLmVuZCgpKQ0KKwkJRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0NBTlNlc3Npb25NdXhfc2VuZE1lc3NhZ2UoCWl0ZXItPnNlY29uZC5hcmJJZCwNCisJCQkJCQkJCQkJCQkJCQlpdGVyLT5zZWNvbmQudG9TZW5kLA0KKwkJCQkJCQkJCQkJCQkJCTgsDQorCQkJCQkJCQkJCQkJCQkJaXRlci0+c2Vjb25kLnBlcmlvZE1zLA0KKwkJCQkJCQkJCQkJCQkJCSZzdGF0dXMpOw0KK30NCisNCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9jdHJlL0N0cmVDYW5Ob2RlLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9jdHJlL0N0cmVDYW5Ob2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVmYTk0OAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL2N0cmUvQ3RyZUNhbk5vZGUuaApAQCAtMCwwICsxLDEyMCBAQAorI2lmbmRlZiBDdHJlQ2FuTm9kZV9IXw0KKyNkZWZpbmUgQ3RyZUNhbk5vZGVfSF8NCisjaW5jbHVkZSAiY3RyZS5oIgkJCQkvL0JJVCBEZWZpbmVzICsgVHlwZWRlZnMNCisjaW5jbHVkZSA8TmV0d29ya0NvbW11bmljYXRpb24vQ0FOU2Vzc2lvbk11eC5oPgkvL0NBTiBDb21tDQorI2luY2x1ZGUgPHB0aHJlYWQuaD4NCisjaW5jbHVkZSA8bWFwPg0KKyNpbmNsdWRlIDxzdHJpbmcuaD4gLy8gbWVtY3B5DQorI2luY2x1ZGUgPHN5cy90aW1lLmg+DQorY2xhc3MgQ3RyZUNhbk5vZGUNCit7DQorcHVibGljOg0KKwlDdHJlQ2FuTm9kZShVSU5UOCBkZXZpY2VOdW1iZXIpOw0KKyAgICB+Q3RyZUNhbk5vZGUoKTsNCisNCisJVUlOVDggR2V0RGV2aWNlTnVtYmVyKCkNCisJew0KKwkJcmV0dXJuIF9kZXZpY2VOdW1iZXI7DQorCX0NCitwcm90ZWN0ZWQ6DQorDQorDQorCXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyB0eFRhc2t7DQorCQlwdWJsaWM6DQorCQkJdWludDMyX3QgYXJiSWQ7DQorCQkJVCAqIHRvU2VuZDsNCisJCQlUICogb3BlcmF0b3IgLT4gKCkNCisJCQl7DQorCQkJCXJldHVybiB0b1NlbmQ7DQorCQkJfQ0KKwkJCVQgJiBvcGVyYXRvciooKQ0KKwkJCXsNCisJCQkJcmV0dXJuICp0b1NlbmQ7DQorCQkJfQ0KKwkJCWJvb2wgSXNFbXB0eSgpDQorCQkJew0KKwkJCQlpZih0b1NlbmQgPT0gMCkNCisJCQkJCXJldHVybiB0cnVlOw0KKwkJCQlyZXR1cm4gZmFsc2U7DQorCQkJfQ0KKwl9Ow0KKwl0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgcmVjTXNnew0KKwkJcHVibGljOg0KKwkJCXVpbnQzMl90IGFyYklkOw0KKwkJCXVpbnQ4X3QgYnl0ZXNbOF07DQorCQkJQ1RSX0NvZGUgZXJyOw0KKwkJCVQgKiBvcGVyYXRvciAtPiAoKQ0KKwkJCXsNCisgICAgICAgIFQgKnI7CisgICAgICAgIG1lbWNweSgmciwgJmJ5dGVzLCBzaXplb2YocikpOworICAgICAgICByZXR1cm4gcjsKKwkJCX0NCisJCQlUICYgb3BlcmF0b3IqKCkNCisJCQl7DQorICAgICAgICBUICpyOworICAgICAgICBtZW1jcHkoJnIsICZieXRlcywgc2l6ZW9mKHIpKTsKKyAgICAgICAgcmV0dXJuICpyOworCQkJfQ0KKwl9Ow0KKwlVSU5UOCBfZGV2aWNlTnVtYmVyOw0KKwl2b2lkIFJlZ2lzdGVyUngodWludDMyX3QgYXJiSWQpOw0KKwl2b2lkIFJlZ2lzdGVyVHgodWludDMyX3QgYXJiSWQsIHVpbnQzMl90IHBlcmlvZE1zKTsNCisNCisJQ1RSX0NvZGUgR2V0UngodWludDMyX3QgYXJiSWQsdWludDhfdCAqIGRhdGFCeXRlcyx1aW50MzJfdCB0aW1lb3V0TXMpOw0KKwl2b2lkIEZsdXNoVHgodWludDMyX3QgYXJiSWQpOw0KKw0KKwl0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB0eFRhc2s8VD4gR2V0VHgodWludDMyX3QgYXJiSWQpDQorCXsNCisJCXR4VGFzazxUPiByZXR2YWwgPSB7MCwgbnVsbHB0cn07DQorCQl0eEpvYnNfdDo6aXRlcmF0b3IgaSA9IF90eEpvYnMuZmluZChhcmJJZCk7DQorCQlpZihpICE9IF90eEpvYnMuZW5kKCkpew0KKwkJCXJldHZhbC5hcmJJZCA9IGktPnNlY29uZC5hcmJJZDsNCisgICAgICBtZW1jcHkoJnJldHZhbC50b1NlbmQsICZpLT5zZWNvbmQudG9TZW5kLCBzaXplb2YocmV0dmFsLnRvU2VuZCkpOworCQl9DQorCQlyZXR1cm4gcmV0dmFsOw0KKwl9DQorCXRlbXBsYXRlPGNsYXNzIFQ+IHZvaWQgRmx1c2hUeChUICYgcGFyKQ0KKwl7DQorCQlGbHVzaFR4KHBhci5hcmJJZCk7DQorCX0NCisNCisJdGVtcGxhdGU8Y2xhc3MgVD4gcmVjTXNnPFQ+IEdldFJ4KHVpbnQzMl90IGFyYklkLCB1aW50MzJfdCB0aW1lb3V0TXMpDQorCXsNCisJCXJlY01zZzxUPiByZXR2YWw7DQorCQlyZXR2YWwuZXJyID0gR2V0UngoYXJiSWQscmV0dmFsLmJ5dGVzLCB0aW1lb3V0TXMpOw0KKwkJcmV0dXJuIHJldHZhbDsNCisJfQ0KKw0KK3ByaXZhdGU6DQorDQorCWNsYXNzIHR4Sm9iX3Qgew0KKwkJcHVibGljOg0KKwkJCXVpbnQzMl90IGFyYklkOw0KKwkJCXVpbnQ4X3QgdG9TZW5kWzhdOw0KKwkJCXVpbnQzMl90IHBlcmlvZE1zOw0KKwl9Ow0KKw0KKwljbGFzcyByeEV2ZW50X3R7DQorCQlwdWJsaWM6DQorCQkJdWludDhfdCBieXRlc1s4XTsNCisJCQlzdHJ1Y3QgdGltZXNwZWMgdGltZTsNCisJCQlyeEV2ZW50X3QoKQ0KKwkJCXsNCisJCQkJYnl0ZXNbMF0gPSAwOw0KKwkJCQlieXRlc1sxXSA9IDA7DQorCQkJCWJ5dGVzWzJdID0gMDsNCisJCQkJYnl0ZXNbM10gPSAwOw0KKwkJCQlieXRlc1s0XSA9IDA7DQorCQkJCWJ5dGVzWzVdID0gMDsNCisJCQkJYnl0ZXNbNl0gPSAwOw0KKwkJCQlieXRlc1s3XSA9IDA7DQorCQkJfQ0KKwl9Ow0KKw0KKwl0eXBlZGVmIHN0ZDo6bWFwPHVpbnQzMl90LHR4Sm9iX3Q+IHR4Sm9ic190Ow0KKwl0eEpvYnNfdCBfdHhKb2JzOw0KKw0KKwl0eXBlZGVmIHN0ZDo6bWFwPHVpbnQzMl90LHJ4RXZlbnRfdD4gcnhSeEV2ZW50c190Ow0KKwlyeFJ4RXZlbnRzX3QgX3J4UnhFdmVudHM7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9jdHJlL1BDTS5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9jdHJlL1BDTS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJmNjU1NQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL2N0cmUvUENNLmNwcApAQCAtMCwwICsxLDU0MSBAQAorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV21pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzIg0KKw0KKyNpbmNsdWRlICJQQ00uaCINCisjaW5jbHVkZSAiTmV0d29ya0NvbW11bmljYXRpb24vQ0FOU2Vzc2lvbk11eC5oIg0KKyNpbmNsdWRlIDxzdHJpbmcuaD4gLy8gbWVtc2V0DQorI2luY2x1ZGUgPHVuaXN0ZC5oPiAvLyB1c2xlZXANCisvKiBUaGlzIGNhbiBiZSBhIGNvbnN0YW50LCBhcyBsb25nIGFzIG5vYm9keSBuZWVkcyB0byB1cGRhdGllIHNvbGVub2lkcyB3aXRoaW4NCisgICAgMS81MCBvZiBhIHNlY29uZC4gKi8NCitzdGF0aWMgY29uc3QgSU5UMzIga0NBTlBlcmlvZCA9IDIwOw0KKw0KKyNkZWZpbmUgU1RBVFVTXzEgIAkJCTB4OTA0MTQwMA0KKyNkZWZpbmUgU1RBVFVTX1NPTF9GQVVMVFMgIAkweDkwNDE0NDANCisjZGVmaW5lIFNUQVRVU19ERUJVRyAgCQkweDkwNDE0ODANCisNCisjZGVmaW5lIEVYUEVDVEVEX1JFU1BPTlNFX1RJTUVPVVRfTVMJKDUwKQ0KKyNkZWZpbmUgR0VUX1BDTV9TVEFUVVMoKQkJCUN0cmVDYW5Ob2RlOjpyZWNNc2c8UGNtU3RhdHVzX3Q+IAkJcnggPSBHZXRSeDxQY21TdGF0dXNfdD4JCQkoU1RBVFVTXzEsRVhQRUNURURfUkVTUE9OU0VfVElNRU9VVF9NUykNCisjZGVmaW5lIEdFVF9QQ01fU09MX0ZBVUxUUygpCQlDdHJlQ2FuTm9kZTo6cmVjTXNnPFBjbVN0YXR1c0ZhdWx0X3Q+IAlyeCA9IEdldFJ4PFBjbVN0YXR1c0ZhdWx0X3Q+CShTVEFUVVNfU09MX0ZBVUxUUyxFWFBFQ1RFRF9SRVNQT05TRV9USU1FT1VUX01TKQ0KKyNkZWZpbmUgR0VUX1BDTV9ERUJVRygpCQkJCUN0cmVDYW5Ob2RlOjpyZWNNc2c8UGNtRGVidWdfdD4gCQlyeCA9IEdldFJ4PFBjbURlYnVnX3Q+CQkJKFNUQVRVU19ERUJVRyxFWFBFQ1RFRF9SRVNQT05TRV9USU1FT1VUX01TKQ0KKw0KKyNkZWZpbmUgQ09OVFJPTF8xIAkJCTB4MDkwNDFDMDAJLyogUENNX0NvbnRyb2wgKi8NCisjZGVmaW5lIENPTlRST0xfMiAJCQkweDA5MDQxQzQwCS8qIFBDTV9TdXBwbGVtQ29udHJvbCAqLw0KKyNkZWZpbmUgQ09OVFJPTF8zIAkJCTB4MDkwNDFDODAJLyogUGNtQ29udHJvbFNldE9uZVNob3REdXJfdCAqLw0KKw0KKy8qIGVuY29kZXIvZGVjb2RlcnMgKi8NCit0eXBlZGVmIHN0cnVjdCBfUGNtU3RhdHVzX3R7DQorCS8qIEJ5dGUgMCAqLw0KKwl1bnNpZ25lZCBTb2xlbm9pZEJpdHM6ODsNCisJLyogQnl0ZSAxICovDQorCXVuc2lnbmVkIGNvbXByZXNzb3JPbjoxOw0KKwl1bnNpZ25lZCBzdGlja3lGYXVsdEZ1c2VUcmlwcGVkOjE7DQorCXVuc2lnbmVkIHN0aWNreUZhdWx0Q29tcEN1cnJlbnRUb29IaWdoOjE7DQorCXVuc2lnbmVkIGZhdWx0RnVzZVRyaXBwZWQ6MTsNCisJdW5zaWduZWQgZmF1bHRDb21wQ3VycmVudFRvb0hpZ2g6MTsNCisJdW5zaWduZWQgZmF1bHRIYXJkd2FyZUZhaWx1cmU6MTsNCisJdW5zaWduZWQgaXNDbG9zZWxvb3BFbmFibGVkOjE7DQorCXVuc2lnbmVkIHByZXNzdXJlU3dpdGNoRW46MTsNCisJLyogQnl0ZSAyKi8NCisJdW5zaWduZWQgYmF0dFZvbHRhZ2U6ODsNCisJLyogQnl0ZSAzICovDQorCXVuc2lnbmVkIHNvbGVub2lkVm9sdGFnZVRvcDg6ODsNCisJLyogQnl0ZSA0ICovDQorCXVuc2lnbmVkIGNvbXByZXNzb3JDdXJyZW50VG9wNjo2Ow0KKwl1bnNpZ25lZCBzb2xlbm9pZFZvbHRhZ2VCdG0yOjI7DQorCS8qIEJ5dGUgNSAqLw0KKwl1bnNpZ25lZCBTdGlja3lGYXVsdF9kSXRvb0hpZ2ggOjE7DQorCXVuc2lnbmVkIEZhdWx0X2RJdG9vSGlnaCA6MTsNCisJdW5zaWduZWQgbW9kdWxlRW5hYmxlZDoxOw0KKwl1bnNpZ25lZCBjbG9zZWRMb29wT3V0cHV0OjE7DQorCXVuc2lnbmVkIGNvbXByZXNzb3JDdXJyZW50QnRtNDo0Ow0KKwkvKiBCeXRlIDYgKi8NCisJdW5zaWduZWQgdG9rZW5TZWVkVG9wODo4Ow0KKwkvKiBCeXRlIDcgKi8NCisJdW5zaWduZWQgdG9rZW5TZWVkQnRtODo4Ow0KK31QY21TdGF0dXNfdDsNCisNCit0eXBlZGVmIHN0cnVjdCBfUGNtQ29udHJvbF90ew0KKwkvKiBCeXRlIDAgKi8NCisJdW5zaWduZWQgdG9rZW5Ub3A4Ojg7DQorCS8qIEJ5dGUgMSAqLw0KKwl1bnNpZ25lZCB0b2tlbkJ0bTg6ODsNCisJLyogQnl0ZSAyICovDQorCXVuc2lnbmVkIHNvbGVub2lkQml0czo4Ow0KKwkvKiBCeXRlIDMqLw0KKwl1bnNpZ25lZCByZXNlcnZlZDo0Ow0KKwl1bnNpZ25lZCBjbG9zZUxvb3BPdXRwdXQ6MTsNCisJdW5zaWduZWQgY29tcHJlc3Nvck9uOjE7DQorCXVuc2lnbmVkIGNsb3NlZExvb3BFbmFibGU6MTsNCisJdW5zaWduZWQgY2xlYXJTdGlja3lGYXVsdHM6MTsNCisJLyogQnl0ZSA0ICovDQorCXVuc2lnbmVkIE9uZVNob3RGaWVsZF9oODo4Ow0KKwkvKiBCeXRlIDUgKi8NCisJdW5zaWduZWQgT25lU2hvdEZpZWxkX2w4Ojg7DQorfVBjbUNvbnRyb2xfdDsNCisNCit0eXBlZGVmIHN0cnVjdCBfUGNtQ29udHJvbFNldE9uZVNob3REdXJfdHsNCisJdWludDhfdCBzb2wxME1zUGVyVW5pdFs4XTsNCit9UGNtQ29udHJvbFNldE9uZVNob3REdXJfdDsNCisNCit0eXBlZGVmIHN0cnVjdCBfUGNtU3RhdHVzRmF1bHRfdHsNCisJLyogQnl0ZSAwICovDQorCXVuc2lnbmVkIFNvbGVub2lkQmxhY2tsaXN0Ojg7DQorCS8qIEJ5dGUgMSAqLw0KKwl1bnNpZ25lZCByZXNlcnZlZF9iaXQwIDoxOw0KKwl1bnNpZ25lZCByZXNlcnZlZF9iaXQxIDoxOw0KKwl1bnNpZ25lZCByZXNlcnZlZF9iaXQyIDoxOw0KKwl1bnNpZ25lZCByZXNlcnZlZF9iaXQzIDoxOw0KKwl1bnNpZ25lZCBTdGlja3lGYXVsdF9Db21wTm9DdXJyZW50IDoxOw0KKwl1bnNpZ25lZCBGYXVsdF9Db21wTm9DdXJyZW50IDoxOw0KKwl1bnNpZ25lZCBTdGlja3lGYXVsdF9Tb2xlbm9pZEp1bXBlciA6MTsNCisJdW5zaWduZWQgRmF1bHRfU29sZW5vaWRKdW1wZXIgOjE7DQorfVBjbVN0YXR1c0ZhdWx0X3Q7DQorDQordHlwZWRlZiBzdHJ1Y3QgX1BjbURlYnVnX3R7DQorCXVuc2lnbmVkIHRva0ZhaWxzVG9wODo4Ow0KKwl1bnNpZ25lZCB0b2tGYWlsc0J0bTg6ODsNCisJdW5zaWduZWQgbGFzdEZhaWxlZFRva1RvcDg6ODsNCisJdW5zaWduZWQgbGFzdEZhaWxlZFRva0J0bTg6ODsNCisJdW5zaWduZWQgdG9rU3VjY2Vzc1RvcDg6ODsNCisJdW5zaWduZWQgdG9rU3VjY2Vzc0J0bTg6ODsNCit9UGNtRGVidWdfdDsNCisNCisNCisvKiBQQ00gQ29uc3RydWN0b3IgLSBDbGVhcnMgYWxsIHZhcnMsIGVzdGFibGlzaGVzIGRlZmF1bHQgc2V0dGluZ3MsIHN0YXJ0cyBQQ00gYmFja2dyb3VuZCBwcm9jZXNzDQorICoNCisgKiBAUmV0dXJuCS0Jdm9pZA0KKyAqDQorICogQFBhcmFtIAktCWRldmljZU51bWJlcgktIAlEZXZpY2UgSUQgb2YgUENNIHRvIGJlIGNvbnRyb2xsZWQNCisgKi8NCitQQ006OlBDTShVSU5UOCBkZXZpY2VOdW1iZXIpOiBDdHJlQ2FuTm9kZShkZXZpY2VOdW1iZXIpDQorew0KKwlSZWdpc3RlclJ4KFNUQVRVU18xIHwgZGV2aWNlTnVtYmVyICk7DQorCVJlZ2lzdGVyUngoU1RBVFVTX1NPTF9GQVVMVFMgfCBkZXZpY2VOdW1iZXIgKTsNCisJUmVnaXN0ZXJSeChTVEFUVVNfREVCVUcgfCBkZXZpY2VOdW1iZXIgKTsNCisJUmVnaXN0ZXJUeChDT05UUk9MXzEgfCBkZXZpY2VOdW1iZXIsIGtDQU5QZXJpb2QpOw0KKwkvKiBlbmFibGUgY2xvc2UgbG9vcCAqLw0KKwlTZXRDbG9zZWRMb29wQ29udHJvbCgxKTsNCit9DQorLyogUENNIEQndG9yDQorICovDQorUENNOjp+UENNKCkNCit7DQorDQorfQ0KKw0KKy8qIFNldCBQQ00gc29sZW5vaWQgc3RhdGUNCisgKg0KKyAqIEBSZXR1cm4JLQlDVFJfQ29kZQktCUVycm9yIGNvZGUgKGlmIGFueSkgZm9yIHNldHRpbmcgc29sZW5vaWQNCisgKg0KKyAqIEBQYXJhbSAJLQlpZHgJCQktIAlJRCBvZiBzb2xlbm9pZCAoMC03KQ0KKyAqIEBQYXJhbSAJLQllbgkJCS0gCUVuYWJsZSAvIERpc2FibGUgaWRlbnRpZmllZCBzb2xlbm9pZA0KKyAqLw0KK0NUUl9Db2RlIFBDTTo6U2V0U29sZW5vaWRzKHVpbnQ4X3QgdmFsdWUsIHVpbnQ4X3QgbWFzaykNCit7DQorCUN0cmVDYW5Ob2RlOjp0eFRhc2s8UGNtQ29udHJvbF90PiB0b0ZpbGwgPSBHZXRUeDxQY21Db250cm9sX3Q+KENPTlRST0xfMSB8IEdldERldmljZU51bWJlcigpKTsNCisJaWYodG9GaWxsLklzRW1wdHkoKSlyZXR1cm4gQ1RSX1VuZXhwZWN0ZWRBcmJJZDsNCisJdG9GaWxsLT5zb2xlbm9pZEJpdHMgfD0gbWFzayAmIHZhbHVlOw0KKwl0b0ZpbGwtPnNvbGVub2lkQml0cyAmPSB+KG1hc2sgJiB+dmFsdWUpOw0KKwlGbHVzaFR4KHRvRmlsbCk7DQorCXJldHVybiBDVFJfT0tBWTsNCit9DQorDQorLyogQ2xlYXJzIFBDTSBzdGlja3kgZmF1bHRzIChpbmRpY2F0b3JzIG9mIHBhc3QgZmF1bHRzDQorICoNCisgKiBAUmV0dXJuCS0JQ1RSX0NvZGUJLQlFcnJvciBjb2RlIChpZiBhbnkpIGZvciBzZXR0aW5nIHNvbGVub2lkDQorICoNCisgKiBAUGFyYW0gCS0JY2xyCQktIAlDbGVhciAvIGRvIG5vdCBjbGVhciBmYXVsdHMNCisgKi8NCitDVFJfQ29kZSBQQ006OkNsZWFyU3RpY2t5RmF1bHRzKCkNCit7DQorCWludDMyX3Qgc3RhdHVzID0gMDsNCisJdWludDhfdCBwY21TdXBwbGVtQ29udHJvbFtdID0geyAwLCAwLCAwLCAweDgwIH07IC8qIG9ubHkgYml0IHNldCBpcyBDbGVhclN0aWNreUZhdWx0cyAqLw0KKwlGUkNfTmV0d29ya0NvbW11bmljYXRpb25fQ0FOU2Vzc2lvbk11eF9zZW5kTWVzc2FnZShDT05UUk9MXzIgIHwgR2V0RGV2aWNlTnVtYmVyKCksIHBjbVN1cHBsZW1Db250cm9sLCBzaXplb2YocGNtU3VwcGxlbUNvbnRyb2wpLCAwLCAmc3RhdHVzKTsNCisJaWYoc3RhdHVzKQ0KKwkJcmV0dXJuIENUUl9UeEZhaWxlZDsNCisJcmV0dXJuIENUUl9PS0FZOw0KK30NCisNCisvKiBFbmFibGVzIFBDTSBDbG9zZWQgTG9vcCBDb250cm9sIG9mIENvbXByZXNzb3IgdmlhIHByZXNzdXJlIHN3aXRjaA0KKyAqDQorICogQFJldHVybgktCUNUUl9Db2RlCS0JRXJyb3IgY29kZSAoaWYgYW55KSBmb3Igc2V0dGluZyBzb2xlbm9pZA0KKyAqDQorICogQFBhcmFtIAktCWVuCQktIAlFbmFibGUgLyBEaXNhYmxlIENsb3NlZCBMb29wIENvbnRyb2wNCisgKi8NCitDVFJfQ29kZSBQQ006OlNldENsb3NlZExvb3BDb250cm9sKGJvb2wgZW4pDQorew0KKwlDdHJlQ2FuTm9kZTo6dHhUYXNrPFBjbUNvbnRyb2xfdD4gdG9GaWxsID0gR2V0VHg8UGNtQ29udHJvbF90PihDT05UUk9MXzEgfCBHZXREZXZpY2VOdW1iZXIoKSk7DQorCWlmKHRvRmlsbC5Jc0VtcHR5KCkpcmV0dXJuIENUUl9VbmV4cGVjdGVkQXJiSWQ7DQorCXRvRmlsbC0+Y2xvc2VkTG9vcEVuYWJsZSA9IGVuOw0KKwlGbHVzaFR4KHRvRmlsbCk7DQorCXJldHVybiBDVFJfT0tBWTsNCit9DQorLyogR2V0IHNvbGVub2lkIEJsYWNrbGlzdCBzdGF0dXMNCisgKiBAUmV0dXJuCS0JQ1RSX0NvZGUJLQlFcnJvciBjb2RlIChpZiBhbnkpDQorICogQFBhcmFtCS0JaWR4CQkJLQlJRCBvZiBzb2xlbm9pZCBbMCw3XSB0byBmaXJlIG9uZSBzaG90IHB1bHNlLg0KKyAqLw0KK0NUUl9Db2RlIFBDTTo6RmlyZU9uZVNob3RTb2xlbm9pZChVSU5UOCBpZHgpDQorew0KKwlDdHJlQ2FuTm9kZTo6dHhUYXNrPFBjbUNvbnRyb2xfdD4gdG9GaWxsID0gR2V0VHg8UGNtQ29udHJvbF90PihDT05UUk9MXzEgfCBHZXREZXZpY2VOdW1iZXIoKSk7DQorCWlmKHRvRmlsbC5Jc0VtcHR5KCkpcmV0dXJuIENUUl9VbmV4cGVjdGVkQXJiSWQ7DQorCS8qIGdyYWIgZmllbGQgYXMgaXQgaXMgbm93ICovDQorCXVpbnQxNl90IG9uZVNob3RGaWVsZDsNCisJb25lU2hvdEZpZWxkID0gdG9GaWxsLT5PbmVTaG90RmllbGRfaDg7DQorCW9uZVNob3RGaWVsZCA8PD0gODsNCisJb25lU2hvdEZpZWxkIHw9IHRvRmlsbC0+T25lU2hvdEZpZWxkX2w4Ow0KKwkvKiBnZXQgdGhlIGNhbGxlcidzIGNoYW5uZWwgKi8NCisJdWludDE2X3Qgc2hpZnQgPSAyKmlkeDsNCisJdWludDE2X3QgbWFzayA9IDM7IC8qIHR3byBiaXRzIHdpZGUgKi8NCisJdWludDhfdCBjaEJpdHMgPSAob25lU2hvdEZpZWxkID4+IHNoaWZ0KSAmIG1hc2s7DQorCS8qIGZsaXAgaXQgKi8NCisJY2hCaXRzID0gKGNoQml0cyklMyArIDE7DQorCS8qIGNsZWFyIG91dCAyYml0cyBmb3IgdGhpcyBjaGFubmVsKi8NCisJb25lU2hvdEZpZWxkICY9IH4obWFzayA8PCBzaGlmdCk7DQorCS8qIHB1dCBuZXcgZmllbGQgaW4gKi8NCisJb25lU2hvdEZpZWxkIHw9IGNoQml0cyA8PCBzaGlmdDsNCisJLyogYXBwbHkgZmllbGQgYXMgaXQgaXMgbm93ICovDQorCXRvRmlsbC0+T25lU2hvdEZpZWxkX2g4ID0gb25lU2hvdEZpZWxkID4+IDg7DQorCXRvRmlsbC0+T25lU2hvdEZpZWxkX2w4ID0gb25lU2hvdEZpZWxkOw0KKwlGbHVzaFR4KHRvRmlsbCk7DQorCXJldHVybiBDVFJfT0tBWTsNCit9DQorLyogQ29uZmlndXJlIHRoZSBwdWxzZSB3aWR0aCBvZiBhIHNvbGVub2lkIGNoYW5uZWwgZm9yIG9uZS1zaG90IHB1bHNlLg0KKyAqIFByZXByb2dyYW1tZWQgcHVsc2V3aWR0aCBpcyAxMG1zIHJlc29sdXRlIGFuZCBjYW4gYmUgYmV0d2VlbiAyMG1zIGFuZCA1LjFzLg0KKyAqIEBSZXR1cm4JLQlDVFJfQ29kZQktCUVycm9yIGNvZGUgKGlmIGFueSkNCisgKiBAUGFyYW0JLQlpZHgJCQktCUlEIG9mIHNvbGVub2lkIFswLDddIHRvIGNvbmZpZ3VyZS4NCisgKiBAUGFyYW0JLQlkdXJNcwkJLQlwdWxzZSB3aWR0aCBpbiBtcy4NCisgKi8NCitDVFJfQ29kZSBQQ006OlNldE9uZVNob3REdXJhdGlvbk1zKFVJTlQ4IGlkeCx1aW50MzJfdCBkdXJNcykNCit7DQorCS8qIHNhbml0eSBjaGVjayBjYWxsZXIncyBwYXJhbSAqLw0KKwlpZihpZHggPiA4KQ0KKwkJcmV0dXJuIENUUl9JbnZhbGlkUGFyYW1WYWx1ZTsNCisJLyogZ2V0IGxhdGVzdCB0eCBmcmFtZSAqLw0KKwlDdHJlQ2FuTm9kZTo6dHhUYXNrPFBjbUNvbnRyb2xTZXRPbmVTaG90RHVyX3Q+IHRvRmlsbCA9IEdldFR4PFBjbUNvbnRyb2xTZXRPbmVTaG90RHVyX3Q+KENPTlRST0xfMyB8IEdldERldmljZU51bWJlcigpKTsNCisJaWYodG9GaWxsLklzRW1wdHkoKSl7DQorCQkvKiBvbmx5IHNlbmQgdGhpcyBvdXQgaWYgY2FsbGVyIHdhbnRzIHRvIGRvIG9uZS1zaG90cyAqLw0KKwkJUmVnaXN0ZXJUeChDT05UUk9MXzMgfCBfZGV2aWNlTnVtYmVyLCBrQ0FOUGVyaW9kKTsNCisJCS8qIGdyYWIgaXQgKi8NCisJCXRvRmlsbCA9IEdldFR4PFBjbUNvbnRyb2xTZXRPbmVTaG90RHVyX3Q+KENPTlRST0xfMyB8IEdldERldmljZU51bWJlcigpKTsNCisJfQ0KKwl0b0ZpbGwtPnNvbDEwTXNQZXJVbml0W2lkeF0gPSBzdGQ6Om1pbihkdXJNcy8xMCwodWludDMyX3QpMHhGRik7DQorCS8qIGFwcGx5IHRoZSBuZXcgZGF0YSBieXRlcyAqLw0KKwlGbHVzaFR4KHRvRmlsbCk7DQorCXJldHVybiBDVFJfT0tBWTsNCit9DQorDQorLyogR2V0IHNvbGVub2lkIHN0YXRlDQorICoNCisgKiBAUmV0dXJuCS0JVHJ1ZS9GYWxzZQktCVRydWUgaWYgc29sZW5vaWQgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlDQorICoNCisgKiBAUGFyYW0gCS0JaWR4CQktIAlJRCBvZiBzb2xlbm9pZCAoMC03KSB0byByZXR1cm4gc3RhdHVzIG9mDQorICovDQorQ1RSX0NvZGUgUENNOjpHZXRTb2xlbm9pZChVSU5UOCBpZHgsIGJvb2wgJnN0YXR1cykNCit7DQorCUdFVF9QQ01fU1RBVFVTKCk7DQorCXN0YXR1cyA9IChyeC0+U29sZW5vaWRCaXRzICYgKDF1bDw8KGlkeCkpICkgPyAxIDogMDsNCisJcmV0dXJuIHJ4LmVycjsNCit9DQorDQorLyogR2V0IHByZXNzdXJlIHN3aXRjaCBzdGF0ZQ0KKyAqDQorICogQFJldHVybgktCVRydWUvRmFsc2UJLQlUcnVlIGlmIHByZXNzdXJlIGFkZXF1YXRlLCBmYWxzZSBpZiBsb3cNCisgKi8NCitDVFJfQ29kZSBQQ006OkdldFByZXNzdXJlKGJvb2wgJnN0YXR1cykNCit7DQorCUdFVF9QQ01fU1RBVFVTKCk7DQorCXN0YXR1cyA9IChyeC0+cHJlc3N1cmVTd2l0Y2hFbiApID8gMSA6IDA7DQorCXJldHVybiByeC5lcnI7DQorfQ0KKw0KKy8qIEdldCBjb21wcmVzc29yIHN0YXRlDQorICoNCisgKiBAUmV0dXJuCS0JVHJ1ZS9GYWxzZQktCVRydWUgaWYgZW5hYmxlZCwgZmFsc2UgaWYgb3RoZXJ3aXNlDQorICovDQorQ1RSX0NvZGUgUENNOjpHZXRDb21wcmVzc29yKGJvb2wgJnN0YXR1cykNCit7DQorCUdFVF9QQ01fU1RBVFVTKCk7DQorCXN0YXR1cyA9IChyeC0+Y29tcHJlc3Nvck9uKTsNCisJcmV0dXJuIHJ4LmVycjsNCit9DQorDQorLyogR2V0IGNsb3NlZCBsb29wIGNvbnRyb2wgc3RhdGUNCisgKg0KKyAqIEBSZXR1cm4JLQlUcnVlL0ZhbHNlCS0JVHJ1ZSBpZiBjbG9zZWQgbG9vcCBlbmFibGVkLCBmYWxzZSBpZiBvdGhlcndpc2UNCisgKi8NCitDVFJfQ29kZSBQQ006OkdldENsb3NlZExvb3BDb250cm9sKGJvb2wgJnN0YXR1cykNCit7DQorCUdFVF9QQ01fU1RBVFVTKCk7DQorCXN0YXR1cyA9IChyeC0+aXNDbG9zZWxvb3BFbmFibGVkKTsNCisJcmV0dXJuIHJ4LmVycjsNCit9DQorDQorLyogR2V0IGNvbXByZXNzb3IgY3VycmVudCBkcmF3DQorICoNCisgKiBAUmV0dXJuCS0JQW1wZXJlcwktCUNvbXByZXNzb3IgY3VycmVudA0KKyAqLw0KK0NUUl9Db2RlIFBDTTo6R2V0Q29tcHJlc3NvckN1cnJlbnQoZmxvYXQgJnN0YXR1cykNCit7DQorCUdFVF9QQ01fU1RBVFVTKCk7DQorCXVpbnQzMl90IHRlbXAgPShyeC0+Y29tcHJlc3NvckN1cnJlbnRUb3A2KTsNCisJdGVtcCA8PD0gNDsNCisJdGVtcCB8PSAgcngtPmNvbXByZXNzb3JDdXJyZW50QnRtNDsNCisJc3RhdHVzID0gdGVtcCAqIDAuMDMxMjU7IC8qIDUuNSBmaXhlZCBwdCB2YWx1ZSBpbiBBbXBzICovDQorCXJldHVybiByeC5lcnI7DQorfQ0KKw0KKy8qIEdldCB2b2x0YWdlIGFjcm9zcyBzb2xlbm9pZCByYWlsDQorICoNCisgKiBAUmV0dXJuCS0JVm9sdHMJLQlWb2x0YWdlIGFjcm9zcyBzb2xlbm9pZCByYWlsDQorICovDQorQ1RSX0NvZGUgUENNOjpHZXRTb2xlbm9pZFZvbHRhZ2UoZmxvYXQgJnN0YXR1cykNCit7DQorCUdFVF9QQ01fU1RBVFVTKCk7DQorCXVpbnQzMl90IHJhdyA9KHJ4LT5zb2xlbm9pZFZvbHRhZ2VUb3A4KTsNCisJcmF3IDw8PSAyOw0KKwlyYXcgfD0gIHJ4LT5zb2xlbm9pZFZvbHRhZ2VCdG0yOw0KKwlzdGF0dXMgPSAoZG91YmxlKSByYXcgKiAwLjAzMTI1OyAvKiA1LjUgZml4ZWQgcHQgdmFsdWUgaW4gVm9sdHMgKi8NCisJcmV0dXJuIHJ4LmVycjsNCit9DQorDQorLyogR2V0IGhhcmR3YXJlIGZhdWx0IHZhbHVlDQorICoNCisgKiBAUmV0dXJuCS0JVHJ1ZS9GYWxzZQktCVRydWUgaWYgaGFyZHdhcmUgZmFpbHVyZSBkZXRlY3RlZCwgZmFsc2UgaWYgb3RoZXJ3aXNlDQorICovDQorQ1RSX0NvZGUgUENNOjpHZXRIYXJkd2FyZUZhdWx0KGJvb2wgJnN0YXR1cykNCit7DQorCUdFVF9QQ01fU1RBVFVTKCk7DQorCXN0YXR1cyA9IHJ4LT5mYXVsdEhhcmR3YXJlRmFpbHVyZTsNCisJcmV0dXJuIHJ4LmVycjsNCit9DQorDQorLyogR2V0IGNvbXByZXNzb3IgZmF1bHQgdmFsdWUNCisgKg0KKyAqIEBSZXR1cm4JLQlUcnVlL0ZhbHNlCS0JVHJ1ZSBpZiBzaG9ydGVkIGNvbXByZXNzb3IgZGV0ZWN0ZWQsIGZhbHNlIGlmIG90aGVyd2lzZQ0KKyAqLw0KK0NUUl9Db2RlIFBDTTo6R2V0Q29tcHJlc3NvckN1cnJlbnRUb29IaWdoRmF1bHQoYm9vbCAmc3RhdHVzKQ0KK3sNCisJR0VUX1BDTV9TVEFUVVMoKTsNCisJc3RhdHVzID0gcngtPmZhdWx0Q29tcEN1cnJlbnRUb29IaWdoOw0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBQQ006OkdldENvbXByZXNzb3JTaG9ydGVkU3RpY2t5RmF1bHQoYm9vbCAmc3RhdHVzKQ0KK3sNCisJR0VUX1BDTV9TVEFUVVMoKTsNCisJc3RhdHVzID0gcngtPlN0aWNreUZhdWx0X2RJdG9vSGlnaDsNCisJcmV0dXJuIHJ4LmVycjsNCit9DQorQ1RSX0NvZGUgUENNOjpHZXRDb21wcmVzc29yU2hvcnRlZEZhdWx0KGJvb2wgJnN0YXR1cykNCit7DQorCUdFVF9QQ01fU1RBVFVTKCk7DQorCXN0YXR1cyA9IHJ4LT5GYXVsdF9kSXRvb0hpZ2g7DQorCXJldHVybiByeC5lcnI7DQorfQ0KK0NUUl9Db2RlIFBDTTo6R2V0Q29tcHJlc3Nvck5vdENvbm5lY3RlZFN0aWNreUZhdWx0KGJvb2wgJnN0YXR1cykNCit7DQorCUdFVF9QQ01fU09MX0ZBVUxUUygpOw0KKwlzdGF0dXMgPSByeC0+U3RpY2t5RmF1bHRfQ29tcE5vQ3VycmVudDsNCisJcmV0dXJuIHJ4LmVycjsNCit9DQorQ1RSX0NvZGUgUENNOjpHZXRDb21wcmVzc29yTm90Q29ubmVjdGVkRmF1bHQoYm9vbCAmc3RhdHVzKQ0KK3sNCisJR0VUX1BDTV9TT0xfRkFVTFRTKCk7DQorCXN0YXR1cyA9IHJ4LT5GYXVsdF9Db21wTm9DdXJyZW50Ow0KKwlyZXR1cm4gcnguZXJyOw0KK30NCisNCisvKiBHZXQgc29sZW5vaWQgZmF1bHQgdmFsdWUNCisgKg0KKyAqIEBSZXR1cm4JLQlUcnVlL0ZhbHNlCS0JVHJ1ZSBpZiBzaG9ydGVkIHNvbGVub2lkIGRldGVjdGVkLCBmYWxzZSBpZiBvdGhlcndpc2UNCisgKi8NCitDVFJfQ29kZSBQQ006OkdldFNvbGVub2lkRmF1bHQoYm9vbCAmc3RhdHVzKQ0KK3sNCisJR0VUX1BDTV9TVEFUVVMoKTsNCisJc3RhdHVzID0gcngtPmZhdWx0RnVzZVRyaXBwZWQ7DQorCXJldHVybiByeC5lcnI7DQorfQ0KKw0KKy8qIEdldCBjb21wcmVzc29yIHN0aWNreSBmYXVsdCB2YWx1ZQ0KKyAqDQorICogQFJldHVybgktCVRydWUvRmFsc2UJLQlUcnVlIGlmIHNvbGVub2lkIGhhZCBwcmV2aW91c2x5IGJlZW4gc2hvcnRlZA0KKyAqIAkJCQkJCQkJKGFuZCBzdGlja3kgZmF1bHQgd2FzIG5vdCBjbGVhcmVkKSwgZmFsc2UgaWYgb3RoZXJ3aXNlDQorICovDQorQ1RSX0NvZGUgUENNOjpHZXRDb21wcmVzc29yQ3VycmVudFRvb0hpZ2hTdGlja3lGYXVsdChib29sICZzdGF0dXMpDQorew0KKwlHRVRfUENNX1NUQVRVUygpOw0KKwlzdGF0dXMgPSByeC0+c3RpY2t5RmF1bHRDb21wQ3VycmVudFRvb0hpZ2g7DQorCXJldHVybiByeC5lcnI7DQorfQ0KKw0KKy8qIEdldCBzb2xlbm9pZCBzdGlja3kgZmF1bHQgdmFsdWUNCisgKg0KKyAqIEBSZXR1cm4JLQlUcnVlL0ZhbHNlCS0JVHJ1ZSBpZiBjb21wcmVzc29yIGhhZCBwcmV2aW91c2x5IGJlZW4gc2hvcnRlZA0KKyAqIAkJCQkJCQkJKGFuZCBzdGlja3kgZmF1bHQgd2FzIG5vdCBjbGVhcmVkKSwgZmFsc2UgaWYgb3RoZXJ3aXNlDQorICovDQorQ1RSX0NvZGUgUENNOjpHZXRTb2xlbm9pZFN0aWNreUZhdWx0KGJvb2wgJnN0YXR1cykNCit7DQorCUdFVF9QQ01fU1RBVFVTKCk7DQorCXN0YXR1cyA9IHJ4LT5zdGlja3lGYXVsdEZ1c2VUcmlwcGVkOw0KKwlyZXR1cm4gcnguZXJyOw0KK30NCisvKiBHZXQgYmF0dGVyeSB2b2x0YWdlDQorICoNCisgKiBAUmV0dXJuCS0JVm9sdHMJLQlWb2x0YWdlIGFjcm9zcyBQQ00gcG93ZXIgcG9ydHMNCisgKi8NCitDVFJfQ29kZSBQQ006OkdldEJhdHRlcnlWb2x0YWdlKGZsb2F0ICZzdGF0dXMpDQorew0KKwlHRVRfUENNX1NUQVRVUygpOw0KKwlzdGF0dXMgPSAoZmxvYXQpcngtPmJhdHRWb2x0YWdlICogMC4wNSArIDQuMDsgLyogNTBtViBwZXIgdW5pdCBwbHVzIDRWLiAqLw0KKwlyZXR1cm4gcnguZXJyOw0KK30NCisvKiBSZXR1cm4gc3RhdHVzIG9mIG1vZHVsZSBlbmFibGUvZGlzYWJsZQ0KKyAqDQorICogQFJldHVybgktCWJvb2wJCS0JUmV0dXJucyBUUlVFIGlmIFBDTSBpcyBlbmFibGVkLCBGQUxTRSBpZiBkaXNhYmxlZA0KKyAqLw0KK0NUUl9Db2RlIFBDTTo6aXNNb2R1bGVFbmFibGVkKGJvb2wgJnN0YXR1cykNCit7DQorCUdFVF9QQ01fU1RBVFVTKCk7DQorCXN0YXR1cyA9IHJ4LT5tb2R1bGVFbmFibGVkOw0KKwlyZXR1cm4gcnguZXJyOw0KK30NCisvKiBHZXQgbnVtYmVyIG9mIHRvdGFsIGZhaWxlZCBQQ00gQ29udHJvbCBGcmFtZQ0KKyAqDQorICogQFJldHVybgktCUZhaWxlZCBDb250cm9sIEZyYW1lcwktCU51bWJlciBvZiBmYWlsZWQgY29udHJvbCBmcmFtZXMgKHRva2VuaXphdGlvbiBmYWlscykNCisgKg0KKyAqIEBXQVJOSU5HCS0JUmV0dXJuIG9ubHkgdmFsaWQgaWYgW1NlZWtEZWJ1Z0ZyYW1lc10gaXMgZW5hYmxlZA0KKyAqIAkJCQlTZWUgZnVuY3Rpb24gU2Vla0RlYnVnRnJhbWVzDQorICogCQkJCVNlZSBmdW5jdGlvbiBFbmFibGVTZWVrRGVidWdGcmFtZXMNCisgKi8NCitDVFJfQ29kZSBQQ006OkdldE51bWJlck9mRmFpbGVkQ29udHJvbEZyYW1lcyhVSU5UMTYgJnN0YXR1cykNCit7DQorCUdFVF9QQ01fREVCVUcoKTsNCisJc3RhdHVzID0gcngtPnRva0ZhaWxzVG9wODsNCisJc3RhdHVzIDw8PSA4Ow0KKwlzdGF0dXMgfD0gcngtPnRva0ZhaWxzQnRtODsNCisJcmV0dXJuIHJ4LmVycjsNCit9DQorLyogR2V0IHJhdyBTb2xlbm9pZCBCbGFja2xpc3QNCisgKg0KKyAqIEBSZXR1cm4JLQlCSU5BUlkJLQlSYXcgYmluYXJ5IGJyZWFrZG93biBvZiBTb2xlbm9pZCBCbGFja2xpc3QNCisgKiAJCQkJCQkJQklUNyA9IFNvbGVub2lkIDEsIEJJVDYgPSBTb2xlbm9pZCAyLCBldGMuDQorICoNCisgKiBAV0FSTklORwktCVJldHVybiBvbmx5IHZhbGlkIGlmIFtTZWVrU3RhdHVzRmF1bHRGcmFtZXNdIGlzIGVuYWJsZWQNCisgKiAJCQkJU2VlIGZ1bmN0aW9uIFNlZWtTdGF0dXNGYXVsdEZyYW1lcw0KKyAqIAkJCQlTZWUgZnVuY3Rpb24gRW5hYmxlU2Vla1N0YXR1c0ZhdWx0RnJhbWVzDQorICovDQorQ1RSX0NvZGUgUENNOjpHZXRTb2xlbm9pZEJsYWNrTGlzdChVSU5UOCAmc3RhdHVzKQ0KK3sNCisJR0VUX1BDTV9TT0xfRkFVTFRTKCk7DQorCXN0YXR1cyA9IHJ4LT5Tb2xlbm9pZEJsYWNrbGlzdDsNCisJcmV0dXJuIHJ4LmVycjsNCit9DQorLyogR2V0IHNvbGVub2lkIEJsYWNrbGlzdCBzdGF0dXMNCisgKiAtIEJsYWNrbGlzdGVkIHNvbGVub2lkcyBjYW5ub3QgYmUgZW5hYmxlZCB1bnRpbCBQQ00gaXMgcG93ZXIgY3ljbGVkDQorICoNCisgKiBAUmV0dXJuCS0JVHJ1ZS9GYWxzZQktCVRydWUgaWYgU29sZW5vaWQgaXMgYmxhY2tsaXN0ZWQsIGZhbHNlIGlmIG90aGVyd2lzZQ0KKyAqDQorICogQFBhcmFtCS0JaWR4CQkJLQlJRCBvZiBzb2xlbm9pZCBbMCw3XQ0KKyAqDQorICogQFdBUk5JTkcJLQlSZXR1cm4gb25seSB2YWxpZCBpZiBbU2Vla1N0YXR1c0ZhdWx0RnJhbWVzXSBpcyBlbmFibGVkDQorICogCQkJCVNlZSBmdW5jdGlvbiBTZWVrU3RhdHVzRmF1bHRGcmFtZXMNCisgKiAJCQkJU2VlIGZ1bmN0aW9uIEVuYWJsZVNlZWtTdGF0dXNGYXVsdEZyYW1lcw0KKyAqLw0KK0NUUl9Db2RlIFBDTTo6SXNTb2xlbm9pZEJsYWNrbGlzdGVkKFVJTlQ4IGlkeCwgYm9vbCAmc3RhdHVzKQ0KK3sNCisJR0VUX1BDTV9TT0xfRkFVTFRTKCk7DQorCXN0YXR1cyA9IChyeC0+U29sZW5vaWRCbGFja2xpc3QgJiAoMXVsPDwoaWR4KSkgKT8gMSA6IDA7DQorCXJldHVybiByeC5lcnI7DQorfQ0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tIEMgaW50ZXJmYWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8NCitleHRlcm4gIkMiIHsNCisJdm9pZCAqIGNfUENNX0luaXQodm9pZCkgew0KKwkJcmV0dXJuIG5ldyBQQ00oKTsNCisJfQ0KKwlDVFJfQ29kZSBjX1NldFNvbGVub2lkKHZvaWQgKiBoYW5kbGUsIHVpbnQ4X3QgdmFsdWUsIHVpbnQ4X3QgbWFzaykgew0KKwkJcmV0dXJuICgoUENNKikgaGFuZGxlKS0+U2V0U29sZW5vaWRzKHZhbHVlLCBtYXNrKTsNCisJfQ0KKwlDVFJfQ29kZSBjX1NldENsb3NlZExvb3BDb250cm9sKHZvaWQgKiBoYW5kbGUsIElOVDggcGFyYW0pIHsNCisJCXJldHVybiAoKFBDTSopIGhhbmRsZSktPlNldENsb3NlZExvb3BDb250cm9sKHBhcmFtKTsNCisJfQ0KKwlDVFJfQ29kZSBjX0NsZWFyU3RpY2t5RmF1bHRzKHZvaWQgKiBoYW5kbGUsIElOVDggcGFyYW0pIHsNCisJCXJldHVybiAoKFBDTSopIGhhbmRsZSktPkNsZWFyU3RpY2t5RmF1bHRzKCk7DQorCX0NCisJQ1RSX0NvZGUgY19HZXRTb2xlbm9pZCh2b2lkICogaGFuZGxlLCBVSU5UOCBpZHgsIElOVDggKiBzdGF0dXMpIHsNCisJCWJvb2wgYnN0YXR1czsNCisJCUNUUl9Db2RlIHJldHZhbCA9ICgoUENNKikgaGFuZGxlKS0+R2V0U29sZW5vaWQoaWR4LCBic3RhdHVzKTsNCisJCSpzdGF0dXMgPSBic3RhdHVzOw0KKwkJcmV0dXJuIHJldHZhbDsNCisJfQ0KKwlDVFJfQ29kZSBjX0dldFByZXNzdXJlKHZvaWQgKiBoYW5kbGUsIElOVDggKiBzdGF0dXMpIHsNCisJCWJvb2wgYnN0YXR1czsNCisJCUNUUl9Db2RlIHJldHZhbCA9ICgoUENNKikgaGFuZGxlKS0+R2V0UHJlc3N1cmUoYnN0YXR1cyk7DQorCQkqc3RhdHVzID0gYnN0YXR1czsNCisJCXJldHVybiByZXR2YWw7DQorCX0NCisJQ1RSX0NvZGUgY19HZXRDb21wcmVzc29yKHZvaWQgKiBoYW5kbGUsIElOVDggKiBzdGF0dXMpIHsNCisJCWJvb2wgYnN0YXR1czsNCisJCUNUUl9Db2RlIHJldHZhbCA9ICgoUENNKikgaGFuZGxlKS0+R2V0Q29tcHJlc3Nvcihic3RhdHVzKTsNCisJCSpzdGF0dXMgPSBic3RhdHVzOw0KKwkJcmV0dXJuIHJldHZhbDsNCisJfQ0KKwlDVFJfQ29kZSBjX0dldENsb3NlZExvb3BDb250cm9sKHZvaWQgKiBoYW5kbGUsIElOVDggKiBzdGF0dXMpIHsNCisJCWJvb2wgYnN0YXR1czsNCisJCUNUUl9Db2RlIHJldHZhbCA9ICgoUENNKikgaGFuZGxlKS0+R2V0Q2xvc2VkTG9vcENvbnRyb2woYnN0YXR1cyk7DQorCQkqc3RhdHVzID0gYnN0YXR1czsNCisJCXJldHVybiByZXR2YWw7DQorCX0NCisJQ1RSX0NvZGUgY19HZXRDb21wcmVzc29yQ3VycmVudCh2b2lkICogaGFuZGxlLCBmbG9hdCAqIHN0YXR1cykgew0KKwkJQ1RSX0NvZGUgcmV0dmFsID0gKChQQ00qKSBoYW5kbGUpLT5HZXRDb21wcmVzc29yQ3VycmVudCgqc3RhdHVzKTsNCisJCXJldHVybiByZXR2YWw7DQorCX0NCisJQ1RSX0NvZGUgY19HZXRTb2xlbm9pZFZvbHRhZ2Uodm9pZCAqIGhhbmRsZSwgZmxvYXQqc3RhdHVzKSB7DQorCQlyZXR1cm4gKChQQ00qKSBoYW5kbGUpLT5HZXRTb2xlbm9pZFZvbHRhZ2UoKnN0YXR1cyk7DQorCX0NCisJQ1RSX0NvZGUgY19HZXRIYXJkd2FyZUZhdWx0KHZvaWQgKiBoYW5kbGUsIElOVDgqc3RhdHVzKSB7DQorCQlib29sIGJzdGF0dXM7DQorCQlDVFJfQ29kZSByZXR2YWwgPSAoKFBDTSopIGhhbmRsZSktPkdldEhhcmR3YXJlRmF1bHQoYnN0YXR1cyk7DQorCQkqc3RhdHVzID0gYnN0YXR1czsNCisJCXJldHVybiByZXR2YWw7DQorCX0NCisJQ1RSX0NvZGUgY19HZXRDb21wcmVzc29yRmF1bHQodm9pZCAqIGhhbmRsZSwgSU5UOCpzdGF0dXMpIHsNCisJCWJvb2wgYnN0YXR1czsNCisJCUNUUl9Db2RlIHJldHZhbCA9ICgoUENNKikgaGFuZGxlKS0+R2V0Q29tcHJlc3NvckN1cnJlbnRUb29IaWdoRmF1bHQoYnN0YXR1cyk7DQorCQkqc3RhdHVzID0gYnN0YXR1czsNCisJCXJldHVybiByZXR2YWw7DQorCX0NCisJQ1RSX0NvZGUgY19HZXRTb2xlbm9pZEZhdWx0KHZvaWQgKiBoYW5kbGUsIElOVDgqc3RhdHVzKSB7DQorCQlib29sIGJzdGF0dXM7DQorCQlDVFJfQ29kZSByZXR2YWwgPSAoKFBDTSopIGhhbmRsZSktPkdldFNvbGVub2lkRmF1bHQoYnN0YXR1cyk7DQorCQkqc3RhdHVzID0gYnN0YXR1czsNCisJCXJldHVybiByZXR2YWw7DQorCX0NCisJQ1RSX0NvZGUgY19HZXRDb21wcmVzc29yU3RpY2t5RmF1bHQodm9pZCAqIGhhbmRsZSwgSU5UOCpzdGF0dXMpIHsNCisJCWJvb2wgYnN0YXR1czsNCisJCUNUUl9Db2RlIHJldHZhbCA9ICgoUENNKikgaGFuZGxlKS0+R2V0Q29tcHJlc3NvckN1cnJlbnRUb29IaWdoU3RpY2t5RmF1bHQoYnN0YXR1cyk7DQorCQkqc3RhdHVzID0gYnN0YXR1czsNCisJCXJldHVybiByZXR2YWw7DQorCX0NCisJQ1RSX0NvZGUgY19HZXRTb2xlbm9pZFN0aWNreUZhdWx0KHZvaWQgKiBoYW5kbGUsIElOVDgqc3RhdHVzKSB7DQorCQlib29sIGJzdGF0dXM7DQorCQlDVFJfQ29kZSByZXR2YWwgPSAoKFBDTSopIGhhbmRsZSktPkdldFNvbGVub2lkU3RpY2t5RmF1bHQoYnN0YXR1cyk7DQorCQkqc3RhdHVzID0gYnN0YXR1czsNCisJCXJldHVybiByZXR2YWw7DQorCX0NCisJQ1RSX0NvZGUgY19HZXRCYXR0ZXJ5Vm9sdGFnZSh2b2lkICogaGFuZGxlLCBmbG9hdCpzdGF0dXMpIHsNCisJCUNUUl9Db2RlIHJldHZhbCA9ICgoUENNKikgaGFuZGxlKS0+R2V0QmF0dGVyeVZvbHRhZ2UoKnN0YXR1cyk7DQorCQlyZXR1cm4gcmV0dmFsOw0KKwl9DQorCXZvaWQgY19TZXREZXZpY2VOdW1iZXJfUENNKHZvaWQgKiBoYW5kbGUsIFVJTlQ4IGRldmljZU51bWJlcikgew0KKwl9DQorCUNUUl9Db2RlIGNfR2V0TnVtYmVyT2ZGYWlsZWRDb250cm9sRnJhbWVzKHZvaWQgKiBoYW5kbGUsIFVJTlQxNipzdGF0dXMpIHsNCisJCXJldHVybiAoKFBDTSopIGhhbmRsZSktPkdldE51bWJlck9mRmFpbGVkQ29udHJvbEZyYW1lcygqc3RhdHVzKTsNCisJfQ0KKwlDVFJfQ29kZSBjX0dldFNvbGVub2lkQmxhY2tMaXN0KHZvaWQgKiBoYW5kbGUsIFVJTlQ4ICpzdGF0dXMpIHsNCisJCXJldHVybiAoKFBDTSopIGhhbmRsZSktPkdldFNvbGVub2lkQmxhY2tMaXN0KCpzdGF0dXMpOw0KKwl9DQorCUNUUl9Db2RlIGNfSXNTb2xlbm9pZEJsYWNrbGlzdGVkKHZvaWQgKiBoYW5kbGUsIFVJTlQ4IGlkeCwgSU5UOCpzdGF0dXMpIHsNCisJCWJvb2wgYnN0YXR1czsNCisJCUNUUl9Db2RlIHJldHZhbCA9ICgoUENNKikgaGFuZGxlKS0+SXNTb2xlbm9pZEJsYWNrbGlzdGVkKGlkeCwgYnN0YXR1cyk7DQorCQkqc3RhdHVzID0gYnN0YXR1czsNCisJCXJldHVybiByZXR2YWw7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvY3RyZS9QQ00uaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL2N0cmUvUENNLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlkZmM1NAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL2N0cmUvUENNLmgKQEAgLTAsMCArMSwyMTIgQEAKKyNpZm5kZWYgUENNX0hfDQorI2RlZmluZSBQQ01fSF8NCisjaW5jbHVkZSAiY3RyZS5oIgkJCQkvL0JJVCBEZWZpbmVzICsgVHlwZWRlZnMNCisjaW5jbHVkZSA8TmV0d29ya0NvbW11bmljYXRpb24vQ0FOU2Vzc2lvbk11eC5oPgkvL0NBTiBDb21tDQorI2luY2x1ZGUgIkN0cmVDYW5Ob2RlLmgiDQorI2luY2x1ZGUgPHB0aHJlYWQuaD4NCitjbGFzcyBQQ00gOiBwdWJsaWMgQ3RyZUNhbk5vZGUNCit7DQorcHVibGljOg0KKyAgICBQQ00oVUlOVDggZGV2aWNlTnVtYmVyPTApOw0KKyAgICB+UENNKCk7DQorICAgIA0KKyAgICAvKiBTZXQgUENNIHNvbGVub2lkcyBzdGF0ZQ0KKyAgICAgKg0KKyAgICAgKiBAUmV0dXJuCS0JQ1RSX0NvZGUJLQlFcnJvciBjb2RlIChpZiBhbnkpIGZvciBzZXR0aW5nIHNvbGVub2lkcw0KKyAgICAgKiBAUGFyYW0gCS0JdmFsdWUJCS0gCVZhbHVlcyBmb3Igc3BlY2lmaWVkIHNvbGVub2lkcw0KKyAgICAgKiBAUGFyYW0gCS0JbWFzawkJLSAJTWFzayBvZiBzb2xlbm9pZHMgdG8gc2V0DQorICAgICAqLw0KKyAgICBDVFJfQ29kZSAJU2V0U29sZW5vaWRzKHVpbnQ4X3QgdmFsdWUsIHVpbnQ4X3QgbWFzayk7DQorDQorICAgIC8qIEVuYWJsZXMgUENNIENsb3NlZCBMb29wIENvbnRyb2wgb2YgQ29tcHJlc3NvciB2aWEgcHJlc3N1cmUgc3dpdGNoDQorICAgICAqIEBSZXR1cm4JLQlDVFJfQ29kZQktCUVycm9yIGNvZGUgKGlmIGFueSkgZm9yIHNldHRpbmcgc29sZW5vaWQNCisgICAgICogQFBhcmFtIAktCWVuCQktIAlFbmFibGUgLyBEaXNhYmxlIENsb3NlZCBMb29wIENvbnRyb2wNCisgICAgICovDQorICAgIENUUl9Db2RlIAlTZXRDbG9zZWRMb29wQ29udHJvbChib29sIGVuKTsNCisNCisgICAgLyogQ2xlYXJzIFBDTSBzdGlja3kgZmF1bHRzIChpbmRpY2F0b3JzIG9mIHBhc3QgZmF1bHRzDQorICAgICAqIEBSZXR1cm4JLQlDVFJfQ29kZQktCUVycm9yIGNvZGUgKGlmIGFueSkgZm9yIHNldHRpbmcgc29sZW5vaWQNCisgICAgICovDQorICAgIENUUl9Db2RlIAlDbGVhclN0aWNreUZhdWx0cygpOw0KKyAgICANCisgICAgLyogR2V0IHNvbGVub2lkIHN0YXRlDQorICAgICAqDQorICAgICAqIEBSZXR1cm4JLQlDVFJfQ29kZQktCUVycm9yIGNvZGUgKGlmIGFueSkNCisgICAgICogQFBhcmFtIAktCWlkeAkJLSAJSUQgb2Ygc29sZW5vaWQgKDAtNykgdG8gcmV0dXJuIGlmIHNvbGVub2lkIGlzIG9uLg0KKyAgICAgKiBAUGFyYW0JLQlzdGF0dXMJLQlPSyBpZiBzb2xlbm9pZCBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UNCisgICAgICovDQorICAgIENUUl9Db2RlIAlHZXRTb2xlbm9pZChVSU5UOCBpZHgsIGJvb2wgJnN0YXR1cyk7DQorDQorICAgIC8qIEdldCBwcmVzc3VyZSBzd2l0Y2ggc3RhdGUNCisgICAgICogQFJldHVybgktCUNUUl9Db2RlCS0JRXJyb3IgY29kZSAoaWYgYW55KQ0KKyAgICAgKiBAUGFyYW0JLQlzdGF0dXMJCS0JVHJ1ZSBpZiBwcmVzc3VyZSBhZGVxdWF0ZSwgZmFsc2UgaWYgbG93DQorICAgICAqLw0KKyAgICBDVFJfQ29kZSAJR2V0UHJlc3N1cmUoYm9vbCAmc3RhdHVzKTsNCisNCisgICAgLyogR2V0IGNvbXByZXNzb3Igc3RhdGUNCisgICAgICogQFJldHVybgktCUNUUl9Db2RlCS0JRXJyb3IgY29kZSAoaWYgYW55KQ0KKyAgICAgKiBAUGFyYW0JLQlzdGF0dXMJCS0JVHJ1ZSBpZiBjb21wcmVzcyBvdXB1dCBpcyBvbiwgZmFsc2UgaWYgb3RoZXJ3aXNlDQorICAgICAqLw0KKyAgICBDVFJfQ29kZQlHZXRDb21wcmVzc29yKGJvb2wgJnN0YXR1cyk7DQorDQorICAgIC8qIEdldCBjbG9zZWQgbG9vcCBjb250cm9sIHN0YXRlDQorICAgICAqIEBSZXR1cm4JLQlDVFJfQ29kZQktCUVycm9yIGNvZGUgKGlmIGFueSkNCisgICAgICogQFBhcmFtCS0Jc3RhdHVzCS0JVHJ1ZSBpZiBjbG9zZWQgbG9vcCBlbmFibGVkLCBmYWxzZSBpZiBvdGhlcndpc2UNCisgICAgICovDQorICAgIENUUl9Db2RlIAlHZXRDbG9zZWRMb29wQ29udHJvbChib29sICZzdGF0dXMpOw0KKw0KKyAgICAvKiBHZXQgY29tcHJlc3NvciBjdXJyZW50IGRyYXcNCisgICAgICogQFJldHVybgktCUNUUl9Db2RlCS0JRXJyb3IgY29kZSAoaWYgYW55KQ0KKyAgICAgKiBAUGFyYW0JLQlzdGF0dXMJCS0JQ29tcHJlc3NvciBjdXJyZW50IHJldHVybmVkIGluIEFtcGVyZXMgKEEpDQorICAgICAqLw0KKyAgICBDVFJfQ29kZSAJR2V0Q29tcHJlc3NvckN1cnJlbnQoZmxvYXQgJnN0YXR1cyk7DQorDQorICAgIC8qIEdldCB2b2x0YWdlIGFjcm9zcyBzb2xlbm9pZCByYWlsDQorICAgICAqIEBSZXR1cm4JLQlDVFJfQ29kZQktCUVycm9yIGNvZGUgKGlmIGFueSkNCisgICAgICogQFBhcmFtCS0Jc3RhdHVzCQktCVZvbHRhZ2UgYWNyb3NzIHNvbGVub2lkIHJhaWwgaW4gVm9sdHMgKFYpDQorICAgICAqLw0KKyAgICBDVFJfQ29kZSAJR2V0U29sZW5vaWRWb2x0YWdlKGZsb2F0ICZzdGF0dXMpOw0KKw0KKyAgICAvKiBHZXQgaGFyZHdhcmUgZmF1bHQgdmFsdWUNCisgICAgICogQFJldHVybgktCUNUUl9Db2RlCS0JRXJyb3IgY29kZSAoaWYgYW55KQ0KKyAgICAgKiBAUGFyYW0JLQlzdGF0dXMJCS0JVHJ1ZSBpZiBoYXJkd2FyZSBmYWlsdXJlIGRldGVjdGVkLCBmYWxzZSBpZiBvdGhlcndpc2UNCisgICAgICovDQorICAgIENUUl9Db2RlIAlHZXRIYXJkd2FyZUZhdWx0KGJvb2wgJnN0YXR1cyk7DQorDQorICAgIC8qIEdldCBjb21wcmVzc29yIGZhdWx0IHZhbHVlDQorICAgICAqIEBSZXR1cm4JLQlDVFJfQ29kZQktCUVycm9yIGNvZGUgKGlmIGFueSkNCisgICAgICogQFBhcmFtCS0Jc3RhdHVzCQktCVRydWUgaWYgYWJub3JtYWxseSBoaWdoIGNvbXByZXNzb3IgY3VycmVudCBkZXRlY3RlZCwgZmFsc2UgaWYgb3RoZXJ3aXNlDQorICAgICAqLw0KKyAgICBDVFJfQ29kZSAJR2V0Q29tcHJlc3NvckN1cnJlbnRUb29IaWdoRmF1bHQoYm9vbCAmc3RhdHVzKTsNCisNCisgICAgLyogR2V0IHNvbGVub2lkIGZhdWx0IHZhbHVlDQorICAgICAqIEBSZXR1cm4JLQlDVFJfQ29kZQktCUVycm9yIGNvZGUgKGlmIGFueSkNCisgICAgICogQFBhcmFtCS0Jc3RhdHVzCQktCVRydWUgaWYgc2hvcnRlZCBzb2xlbm9pZCBkZXRlY3RlZCwgZmFsc2UgaWYgb3RoZXJ3aXNlDQorICAgICAqLw0KKyAgICBDVFJfQ29kZSAJR2V0U29sZW5vaWRGYXVsdChib29sICZzdGF0dXMpOw0KKw0KKyAgICAvKiBHZXQgY29tcHJlc3NvciBzdGlja3kgZmF1bHQgdmFsdWUNCisgICAgICogQFJldHVybgktCUNUUl9Db2RlCS0JRXJyb3IgY29kZSAoaWYgYW55KQ0KKyAgICAgKiBAUGFyYW0JLQlzdGF0dXMJCS0JVHJ1ZSBpZiBzb2xlbm9pZCBoYWQgcHJldmlvdXNseSBiZWVuIHNob3J0ZWQNCisgICAgICogCQkJCQkJCQkoYW5kIHN0aWNreSBmYXVsdCB3YXMgbm90IGNsZWFyZWQpLCBmYWxzZSBpZiBvdGhlcndpc2UNCisgICAgICovDQorICAgIENUUl9Db2RlIAlHZXRDb21wcmVzc29yQ3VycmVudFRvb0hpZ2hTdGlja3lGYXVsdChib29sICZzdGF0dXMpOw0KKyAgICAvKiBHZXQgY29tcHJlc3NvciBzaG9ydGVkIHN0aWNreSBmYXVsdCB2YWx1ZQ0KKyAgICAgKiBAUmV0dXJuCS0JQ1RSX0NvZGUJLQlFcnJvciBjb2RlIChpZiBhbnkpDQorICAgICAqIEBQYXJhbQktCXN0YXR1cwkJLQlUcnVlIGlmIGNvbXByZXNzb3Igb3V0cHV0IGlzIHNob3J0ZWQsIGZhbHNlIGlmIG90aGVyd2lzZQ0KKyAgICAgKi8NCisgICAgQ1RSX0NvZGUgCUdldENvbXByZXNzb3JTaG9ydGVkU3RpY2t5RmF1bHQoYm9vbCAmc3RhdHVzKTsNCisgICAgLyogR2V0IGNvbXByZXNzb3Igc2hvcnRlZCBmYXVsdCB2YWx1ZQ0KKyAgICAgKiBAUmV0dXJuCS0JQ1RSX0NvZGUJLQlFcnJvciBjb2RlIChpZiBhbnkpDQorICAgICAqIEBQYXJhbQktCXN0YXR1cwkJLQlUcnVlIGlmIGNvbXByZXNzb3Igb3V0cHV0IGlzIHNob3J0ZWQsIGZhbHNlIGlmIG90aGVyd2lzZQ0KKyAgICAgKi8NCisgICAgQ1RSX0NvZGUgCUdldENvbXByZXNzb3JTaG9ydGVkRmF1bHQoYm9vbCAmc3RhdHVzKTsNCisgICAgLyogR2V0IGNvbXByZXNzb3IgaXMgbm90IGNvbm5lY3RlZCBzdGlja3kgZmF1bHQgdmFsdWUNCisgICAgICogQFJldHVybgktCUNUUl9Db2RlCS0JRXJyb3IgY29kZSAoaWYgYW55KQ0KKyAgICAgKiBAUGFyYW0JLQlzdGF0dXMJCS0JVHJ1ZSBpZiBjb21wcmVzc29yIGN1cnJlbnQgaXMgdG9vIGxvdywgDQorICAgICAqIAkJCQkJaW5kaWNhdGluZyBjb21wcmVzc29yIGlzIG5vdCBjb25uZWN0ZWQsIGZhbHNlIGlmIG90aGVyd2lzZQ0KKyAgICAgKi8NCisgICAgQ1RSX0NvZGUgCUdldENvbXByZXNzb3JOb3RDb25uZWN0ZWRTdGlja3lGYXVsdChib29sICZzdGF0dXMpOw0KKyAgICAvKiBHZXQgY29tcHJlc3NvciBpcyBub3QgY29ubmVjdGVkIGZhdWx0IHZhbHVlDQorICAgICAqIEBSZXR1cm4JLQlDVFJfQ29kZQktCUVycm9yIGNvZGUgKGlmIGFueSkNCisgICAgICogQFBhcmFtCS0Jc3RhdHVzCQktCVRydWUgaWYgY29tcHJlc3NvciBjdXJyZW50IGlzIHRvbyBsb3csIA0KKyAgICAgKiAJCQkJCWluZGljYXRpbmcgY29tcHJlc3NvciBpcyBub3QgY29ubmVjdGVkLCBmYWxzZSBpZiBvdGhlcndpc2UNCisgICAgICovDQorICAgIENUUl9Db2RlIAlHZXRDb21wcmVzc29yTm90Q29ubmVjdGVkRmF1bHQoYm9vbCAmc3RhdHVzKTsNCisNCisgICAgLyogR2V0IHNvbGVub2lkIHN0aWNreSBmYXVsdCB2YWx1ZQ0KKyAgICAgKiBAUmV0dXJuCS0JQ1RSX0NvZGUJLQlFcnJvciBjb2RlIChpZiBhbnkpDQorICAgICAqIEBQYXJhbQktCXN0YXR1cwkJLQlUcnVlIGlmIGNvbXByZXNzb3IgaGFkIHByZXZpb3VzbHkgYmVlbiBzaG9ydGVkDQorICAgICAqIAkJCQkJCQkJKGFuZCBzdGlja3kgZmF1bHQgd2FzIG5vdCBjbGVhcmVkKSwgZmFsc2UgaWYgb3RoZXJ3aXNlDQorICAgICAqLw0KKyAgICBDVFJfQ29kZSAJR2V0U29sZW5vaWRTdGlja3lGYXVsdChib29sICZzdGF0dXMpOw0KKw0KKyAgICAvKiBHZXQgYmF0dGVyeSB2b2x0YWdlDQorICAgICAqIEBSZXR1cm4JLQlDVFJfQ29kZQktCUVycm9yIGNvZGUgKGlmIGFueSkNCisgICAgICogQFBhcmFtCS0Jc3RhdHVzCQktCVZvbHRhZ2UgYWNyb3NzIFBDTSBwb3dlciBwb3J0cyBpbiBWb2x0cyAoVikNCisgICAgICovDQorICAgIENUUl9Db2RlIAlHZXRCYXR0ZXJ5Vm9sdGFnZShmbG9hdCAmc3RhdHVzKTsNCisgICAgDQorICAgIC8qIFNldCBQQ00gRGV2aWNlIE51bWJlciBhbmQgYWNjb3JkaW5nIENBTiBmcmFtZSBJRHMNCisgICAgICogQFJldHVybgktCXZvaWQNCisgICAgICogQFBhcmFtCS0JZGV2aWNlTnVtYmVyCS0JRGV2aWNlIG51bWJlciBvZiBQQ00gdG8gY29udHJvbA0KKyAgICAgKi8NCisgICAgdm9pZAlTZXREZXZpY2VOdW1iZXIoVUlOVDggZGV2aWNlTnVtYmVyKTsNCisgICAgLyogR2V0IG51bWJlciBvZiB0b3RhbCBmYWlsZWQgUENNIENvbnRyb2wgRnJhbWUNCisgICAgICogQFJldHVybgktCUNUUl9Db2RlCS0JRXJyb3IgY29kZSAoaWYgYW55KQ0KKyAgICAgKiBAUGFyYW0JLQlzdGF0dXMJCS0JTnVtYmVyIG9mIGZhaWxlZCBjb250cm9sIGZyYW1lcyAodG9rZW5pemF0aW9uIGZhaWxzKQ0KKyAgICAgKiBAV0FSTklORwktCVJldHVybiBvbmx5IHZhbGlkIGlmIFtTZWVrRGVidWdGcmFtZXNdIGlzIGVuYWJsZWQNCisgICAgICogCQkJCVNlZSBmdW5jdGlvbiBTZWVrRGVidWdGcmFtZXMNCisgICAgICogCQkJCVNlZSBmdW5jdGlvbiBFbmFibGVTZWVrRGVidWdGcmFtZXMNCisgICAgICovDQorCUNUUl9Db2RlIEdldE51bWJlck9mRmFpbGVkQ29udHJvbEZyYW1lcyhVSU5UMTYgJnN0YXR1cyk7DQorICAgIA0KKyAgICAvKiBHZXQgcmF3IFNvbGVub2lkIEJsYWNrbGlzdA0KKyAgICAgKiBAUmV0dXJuCS0JQ1RSX0NvZGUJLQlFcnJvciBjb2RlIChpZiBhbnkpDQorICAgICAqIEBQYXJhbQktCXN0YXR1cwkJLQlSYXcgYmluYXJ5IGJyZWFrZG93biBvZiBTb2xlbm9pZCBCbGFja2xpc3QNCisgICAgICogCQkJCQkJCQlCSVQ3ID0gU29sZW5vaWQgMSwgQklUNiA9IFNvbGVub2lkIDIsIGV0Yy4NCisgICAgICogQFdBUk5JTkcJLQlSZXR1cm4gb25seSB2YWxpZCBpZiBbU2Vla1N0YXR1c0ZhdWx0RnJhbWVzXSBpcyBlbmFibGVkDQorICAgICAqIAkJCQlTZWUgZnVuY3Rpb24gU2Vla1N0YXR1c0ZhdWx0RnJhbWVzDQorICAgICAqIAkJCQlTZWUgZnVuY3Rpb24gRW5hYmxlU2Vla1N0YXR1c0ZhdWx0RnJhbWVzDQorICAgICAqLw0KKyAgICBDVFJfQ29kZSAJR2V0U29sZW5vaWRCbGFja0xpc3QoVUlOVDggJnN0YXR1cyk7DQorDQorICAgIC8qIEdldCBzb2xlbm9pZCBCbGFja2xpc3Qgc3RhdHVzDQorICAgICAqIC0gQmxhY2tsaXN0ZWQgc29sZW5vaWRzIGNhbm5vdCBiZSBlbmFibGVkIHVudGlsIFBDTSBpcyBwb3dlciBjeWNsZWQNCisgICAgICogQFJldHVybgktCUNUUl9Db2RlCS0JRXJyb3IgY29kZSAoaWYgYW55KQ0KKyAgICAgKiBAUGFyYW0JLQlpZHgJCQktCUlEIG9mIHNvbGVub2lkIFswLDddDQorICAgICAqIEBQYXJhbQktCXN0YXR1cwkJLQlUcnVlIGlmIFNvbGVub2lkIGlzIGJsYWNrbGlzdGVkLCBmYWxzZSBpZiBvdGhlcndpc2UNCisgICAgICogQFdBUk5JTkcJLQlSZXR1cm4gb25seSB2YWxpZCBpZiBbU2Vla1N0YXR1c0ZhdWx0RnJhbWVzXSBpcyBlbmFibGVkDQorICAgICAqIAkJCQlTZWUgZnVuY3Rpb24gU2Vla1N0YXR1c0ZhdWx0RnJhbWVzDQorICAgICAqIAkJCQlTZWUgZnVuY3Rpb24gRW5hYmxlU2Vla1N0YXR1c0ZhdWx0RnJhbWVzDQorICAgICAqLw0KKyAgICBDVFJfQ29kZSAJSXNTb2xlbm9pZEJsYWNrbGlzdGVkKFVJTlQ4IGlkeCwgYm9vbCAmc3RhdHVzKTsNCisNCisgICAgLyogUmV0dXJuIHN0YXR1cyBvZiBtb2R1bGUgZW5hYmxlL2Rpc2FibGUNCisgICAgICogQFJldHVybgktCUNUUl9Db2RlCS0JRXJyb3IgY29kZSAoaWYgYW55KQ0KKyAgICAgKiBAUGFyYW0JLQlzdGF0dXMJCS0JUmV0dXJucyBUUlVFIGlmIFBDTSBpcyBlbmFibGVkLCBGQUxTRSBpZiBkaXNhYmxlZA0KKyAgICAgKi8NCisgICAgQ1RSX0NvZGUJaXNNb2R1bGVFbmFibGVkKGJvb2wgJnN0YXR1cyk7DQorDQorICAgIC8qIEdldCBzb2xlbm9pZCBCbGFja2xpc3Qgc3RhdHVzDQorICAgICAqIEBSZXR1cm4JLQlDVFJfQ29kZQktCUVycm9yIGNvZGUgKGlmIGFueSkNCisgICAgICogQFBhcmFtCS0JaWR4CQkJLQlJRCBvZiBzb2xlbm9pZCBbMCw3XSB0byBmaXJlIG9uZSBzaG90IHB1bHNlLg0KKyAgICAgKi8NCisgICAgQ1RSX0NvZGUgRmlyZU9uZVNob3RTb2xlbm9pZChVSU5UOCBpZHgpOw0KKw0KKyAgICAvKiBDb25maWd1cmUgdGhlIHB1bHNlIHdpZHRoIG9mIGEgc29sZW5vaWQgY2hhbm5lbCBmb3Igb25lLXNob3QgcHVsc2UuDQorCSAqIFByZXByb2dyYW1tZWQgcHVsc2V3aWR0aCBpcyAxMG1zIHJlc29sdXRlIGFuZCBjYW4gYmUgYmV0d2VlbiAyMG1zIGFuZCA1LjFzLg0KKyAgICAgKiBAUmV0dXJuCS0JQ1RSX0NvZGUJLQlFcnJvciBjb2RlIChpZiBhbnkpDQorICAgICAqIEBQYXJhbQktCWlkeAkJCS0JSUQgb2Ygc29sZW5vaWQgWzAsN10gdG8gY29uZmlndXJlLg0KKyAgICAgKiBAUGFyYW0JLQlkdXJNcwkJLQlwdWxzZSB3aWR0aCBpbiBtcy4NCisgICAgICovDQorICAgIENUUl9Db2RlIFNldE9uZVNob3REdXJhdGlvbk1zKFVJTlQ4IGlkeCx1aW50MzJfdCBkdXJNcyk7DQorDQorfTsNCisvLy0tLS0tLS0tLS0tLS0tLS0tLSBDIGludGVyZmFjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vDQorZXh0ZXJuICJDIiB7DQorCXZvaWQgKiBjX1BDTV9Jbml0KHZvaWQpOw0KKwlDVFJfQ29kZSBjX1NldFNvbGVub2lkcyh2b2lkICogaGFuZGxlLHVpbnQ4X3QgdmFsdWUsdWludDhfdCBtYXNrKTsNCisJQ1RSX0NvZGUgY19TZXRDbG9zZWRMb29wQ29udHJvbCh2b2lkICogaGFuZGxlLElOVDggcGFyYW0pOw0KKwlDVFJfQ29kZSBjX0NsZWFyU3RpY2t5RmF1bHRzKHZvaWQgKiBoYW5kbGUsSU5UOCBwYXJhbSk7DQorCUNUUl9Db2RlIGNfR2V0U29sZW5vaWQodm9pZCAqIGhhbmRsZSxVSU5UOCBpZHgsSU5UOCAqIHN0YXR1cyk7DQorCUNUUl9Db2RlIGNfR2V0UHJlc3N1cmUodm9pZCAqIGhhbmRsZSxJTlQ4ICogc3RhdHVzKTsNCisJQ1RSX0NvZGUgY19HZXRDb21wcmVzc29yKHZvaWQgKiBoYW5kbGUsSU5UOCAqIHN0YXR1cyk7DQorCUNUUl9Db2RlIGNfR2V0Q2xvc2VkTG9vcENvbnRyb2wodm9pZCAqIGhhbmRsZSxJTlQ4ICogc3RhdHVzKTsNCisJQ1RSX0NvZGUgY19HZXRDb21wcmVzc29yQ3VycmVudCh2b2lkICogaGFuZGxlLGZsb2F0ICogc3RhdHVzKTsNCisJQ1RSX0NvZGUgY19HZXRTb2xlbm9pZFZvbHRhZ2Uodm9pZCAqIGhhbmRsZSxmbG9hdCpzdGF0dXMpOw0KKwlDVFJfQ29kZSBjX0dldEhhcmR3YXJlRmF1bHQodm9pZCAqIGhhbmRsZSxJTlQ4KnN0YXR1cyk7DQorCUNUUl9Db2RlIGNfR2V0Q29tcHJlc3NvckZhdWx0KHZvaWQgKiBoYW5kbGUsSU5UOCpzdGF0dXMpOw0KKwlDVFJfQ29kZSBjX0dldFNvbGVub2lkRmF1bHQodm9pZCAqIGhhbmRsZSxJTlQ4KnN0YXR1cyk7DQorCUNUUl9Db2RlIGNfR2V0Q29tcHJlc3NvclN0aWNreUZhdWx0KHZvaWQgKiBoYW5kbGUsSU5UOCpzdGF0dXMpOw0KKwlDVFJfQ29kZSBjX0dldFNvbGVub2lkU3RpY2t5RmF1bHQodm9pZCAqIGhhbmRsZSxJTlQ4KnN0YXR1cyk7DQorCUNUUl9Db2RlIGNfR2V0QmF0dGVyeVZvbHRhZ2Uodm9pZCAqIGhhbmRsZSxmbG9hdCpzdGF0dXMpOw0KKwl2b2lkIGNfU2V0RGV2aWNlTnVtYmVyX1BDTSh2b2lkICogaGFuZGxlLFVJTlQ4IGRldmljZU51bWJlcik7DQorCXZvaWQgY19FbmFibGVTZWVrU3RhdHVzRnJhbWVzKHZvaWQgKiBoYW5kbGUsSU5UOCBlbmFibGUpOw0KKwl2b2lkIGNfRW5hYmxlU2Vla1N0YXR1c0ZhdWx0RnJhbWVzKHZvaWQgKiBoYW5kbGUsSU5UOCBlbmFibGUpOw0KKwl2b2lkIGNfRW5hYmxlU2Vla0RlYnVnRnJhbWVzKHZvaWQgKiBoYW5kbGUsSU5UOCBlbmFibGUpOw0KKwlDVFJfQ29kZSBjX0dldE51bWJlck9mRmFpbGVkQ29udHJvbEZyYW1lcyh2b2lkICogaGFuZGxlLFVJTlQxNipzdGF0dXMpOw0KKwlDVFJfQ29kZSBjX0dldFNvbGVub2lkQmxhY2tMaXN0KHZvaWQgKiBoYW5kbGUsVUlOVDggKnN0YXR1cyk7DQorCUNUUl9Db2RlIGNfSXNTb2xlbm9pZEJsYWNrbGlzdGVkKHZvaWQgKiBoYW5kbGUsVUlOVDggaWR4LElOVDgqc3RhdHVzKTsNCit9DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvY3RyZS9QRFAuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvY3RyZS9QRFAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmYjRjOGYKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9jdHJlL1BEUC5jcHAKQEAgLTAsMCArMSwyMzAgQEAKKyNpbmNsdWRlICJQRFAuaCINCisjaW5jbHVkZSAiTmV0d29ya0NvbW11bmljYXRpb24vQ0FOU2Vzc2lvbk11eC5oIgkvL0NBTiBDb21tDQorI2luY2x1ZGUgPHN0cmluZy5oPiAvLyBtZW1zZXQNCisjaW5jbHVkZSA8dW5pc3RkLmg+IC8vIHVzbGVlcA0KKw0KKyNkZWZpbmUgU1RBVFVTXzEgIAkJMHg4MDQxNDAwDQorI2RlZmluZSBTVEFUVVNfMiAgCQkweDgwNDE0NDANCisjZGVmaW5lIFNUQVRVU18zICAJCTB4ODA0MTQ4MA0KKyNkZWZpbmUgU1RBVFVTX0VORVJHWQkweDgwNDE3NDANCisNCisjZGVmaW5lIENPTlRST0xfMQkJMHgwODA0MUMwMAkvKiBQRFBfQ29udHJvbF9DbGVhclN0YXRzICovDQorDQorI2RlZmluZSBFWFBFQ1RFRF9SRVNQT05TRV9USU1FT1VUX01TCSg1MCkNCisjZGVmaW5lIEdFVF9TVEFUVVMxKCkJCUN0cmVDYW5Ob2RlOjpyZWNNc2c8UGRwU3RhdHVzMV90PiByeCA9IEdldFJ4PFBkcFN0YXR1czFfdD4oU1RBVFVTXzEsRVhQRUNURURfUkVTUE9OU0VfVElNRU9VVF9NUykNCisjZGVmaW5lIEdFVF9TVEFUVVMyKCkJCUN0cmVDYW5Ob2RlOjpyZWNNc2c8UGRwU3RhdHVzMl90PiByeCA9IEdldFJ4PFBkcFN0YXR1czJfdD4oU1RBVFVTXzIsRVhQRUNURURfUkVTUE9OU0VfVElNRU9VVF9NUykNCisjZGVmaW5lIEdFVF9TVEFUVVMzKCkJCUN0cmVDYW5Ob2RlOjpyZWNNc2c8UGRwU3RhdHVzM190PiByeCA9IEdldFJ4PFBkcFN0YXR1czNfdD4oU1RBVFVTXzMsRVhQRUNURURfUkVTUE9OU0VfVElNRU9VVF9NUykNCisjZGVmaW5lIEdFVF9TVEFUVVNfRU5FUkdZKCkJQ3RyZUNhbk5vZGU6OnJlY01zZzxQRFBfU3RhdHVzX0VuZXJneV90PiByeCA9IEdldFJ4PFBEUF9TdGF0dXNfRW5lcmd5X3Q+KFNUQVRVU19FTkVSR1ksRVhQRUNURURfUkVTUE9OU0VfVElNRU9VVF9NUykNCisNCisvKiBlbmNvZGVyL2RlY29kZXJzICovDQordHlwZWRlZiBzdHJ1Y3QgX1BkcFN0YXR1czFfdHsNCisJdW5zaWduZWQgY2hhbjFfaDg6ODsNCisJdW5zaWduZWQgY2hhbjJfaDY6NjsNCisJdW5zaWduZWQgY2hhbjFfbDI6MjsNCisJdW5zaWduZWQgY2hhbjNfaDQ6NDsNCisJdW5zaWduZWQgY2hhbjJfbDQ6NDsNCisJdW5zaWduZWQgY2hhbjRfaDI6MjsNCisJdW5zaWduZWQgY2hhbjNfbDY6NjsNCisJdW5zaWduZWQgY2hhbjRfbDg6ODsNCisJdW5zaWduZWQgY2hhbjVfaDg6ODsNCisJdW5zaWduZWQgY2hhbjZfaDY6NjsNCisJdW5zaWduZWQgY2hhbjVfbDI6MjsNCisJdW5zaWduZWQgcmVzZXJ2ZWQ0OjQ7DQorCXVuc2lnbmVkIGNoYW42X2w0OjQ7DQorfVBkcFN0YXR1czFfdDsNCit0eXBlZGVmIHN0cnVjdCBfUGRwU3RhdHVzMl90ew0KKwl1bnNpZ25lZCBjaGFuN19oODo4Ow0KKwl1bnNpZ25lZCBjaGFuOF9oNjo2Ow0KKwl1bnNpZ25lZCBjaGFuN19sMjoyOw0KKwl1bnNpZ25lZCBjaGFuOV9oNDo0Ow0KKwl1bnNpZ25lZCBjaGFuOF9sNDo0Ow0KKwl1bnNpZ25lZCBjaGFuMTBfaDI6MjsNCisJdW5zaWduZWQgY2hhbjlfbDY6NjsNCisJdW5zaWduZWQgY2hhbjEwX2w4Ojg7DQorCXVuc2lnbmVkIGNoYW4xMV9oODo4Ow0KKwl1bnNpZ25lZCBjaGFuMTJfaDY6NjsNCisJdW5zaWduZWQgY2hhbjExX2wyOjI7DQorCXVuc2lnbmVkIHJlc2VydmVkNDo0Ow0KKwl1bnNpZ25lZCBjaGFuMTJfbDQ6NDsNCit9UGRwU3RhdHVzMl90Ow0KK3R5cGVkZWYgc3RydWN0IF9QZHBTdGF0dXMzX3R7DQorCXVuc2lnbmVkIGNoYW4xM19oODo4Ow0KKwl1bnNpZ25lZCBjaGFuMTRfaDY6NjsNCisJdW5zaWduZWQgY2hhbjEzX2wyOjI7DQorCXVuc2lnbmVkIGNoYW4xNV9oNDo0Ow0KKwl1bnNpZ25lZCBjaGFuMTRfbDQ6NDsNCisJdW5zaWduZWQgY2hhbjE2X2gyOjI7DQorCXVuc2lnbmVkIGNoYW4xNV9sNjo2Ow0KKwl1bnNpZ25lZCBjaGFuMTZfbDg6ODsNCisJdW5zaWduZWQgaW50ZXJuYWxSZXNCYXR0ZXJ5X21PaG1zOjg7DQorCXVuc2lnbmVkIGJ1c1ZvbHRhZ2U6ODsNCisJdW5zaWduZWQgdGVtcDo4Ow0KK31QZHBTdGF0dXMzX3Q7DQordHlwZWRlZiBzdHJ1Y3QgX1BEUF9TdGF0dXNfRW5lcmd5X3Qgew0KKwl1bnNpZ25lZCBUbWVhc01zX2xpa2VseXdpbGxiZTIwbXNfOjg7DQorCXVuc2lnbmVkIFRvdGFsQ3VycmVudF8xMjVtQXBlcnVuaXRfaDg6ODsNCisJdW5zaWduZWQgUG93ZXJfMTI1bVdwZXJ1bml0X2g0OjQ7DQorCXVuc2lnbmVkIFRvdGFsQ3VycmVudF8xMjVtQXBlcnVuaXRfbDQ6NDsNCisJdW5zaWduZWQgUG93ZXJfMTI1bVdwZXJ1bml0X204Ojg7DQorCXVuc2lnbmVkIEVuZXJneV8xMjVtV1BlclVuaXRYVG1lYXNfaDQ6NDsNCisJdW5zaWduZWQgUG93ZXJfMTI1bVdwZXJ1bml0X2w0OjQ7DQorCXVuc2lnbmVkIEVuZXJneV8xMjVtV1BlclVuaXRYVG1lYXNfbWg4Ojg7DQorCXVuc2lnbmVkIEVuZXJneV8xMjVtV1BlclVuaXRYVG1lYXNfbWw4Ojg7DQorCXVuc2lnbmVkIEVuZXJneV8xMjVtV1BlclVuaXRYVG1lYXNfbDg6ODsNCit9IFBEUF9TdGF0dXNfRW5lcmd5X3QgOw0KKw0KK1BEUDo6UERQKFVJTlQ4IGRldmljZU51bWJlcik6IEN0cmVDYW5Ob2RlKGRldmljZU51bWJlcikNCit7DQorCVJlZ2lzdGVyUngoU1RBVFVTXzEgfCBkZXZpY2VOdW1iZXIgKTsNCisJUmVnaXN0ZXJSeChTVEFUVVNfMiB8IGRldmljZU51bWJlciApOw0KKwlSZWdpc3RlclJ4KFNUQVRVU18zIHwgZGV2aWNlTnVtYmVyICk7DQorfQ0KKy8qIFBEUCBEJ3Rvcg0KKyAqLw0KK1BEUDo6flBEUCgpDQorew0KK30NCisNCitDVFJfQ29kZSBQRFA6OkdldENoYW5uZWxDdXJyZW50KFVJTlQ4IGlkeCwgZG91YmxlICZjdXJyZW50KQ0KK3sNCisJQ1RSX0NvZGUgcmV0dmFsID0gQ1RSX0ludmFsaWRQYXJhbVZhbHVlOw0KKwl1aW50MzJfdCByYXcgPSAwOw0KKw0KKwlpZihpZHggPD0gNSl7DQorCQlHRVRfU1RBVFVTMSgpOw0KKwkgICAgcmV0dmFsID0gcnguZXJyOw0KKwkJc3dpdGNoKGlkeCl7DQorCQkJY2FzZSAwOglyYXcgPSAoKHVpbnQzMl90KXJ4LT5jaGFuMV9oOCA8PCAyKSB8IHJ4LT5jaGFuMV9sMjsJYnJlYWs7DQorCQkJY2FzZSAxOglyYXcgPSAoKHVpbnQzMl90KXJ4LT5jaGFuMl9oNiA8PCA0KSB8IHJ4LT5jaGFuMl9sNDsJYnJlYWs7DQorCQkJY2FzZSAyOglyYXcgPSAoKHVpbnQzMl90KXJ4LT5jaGFuM19oNCA8PCA2KSB8IHJ4LT5jaGFuM19sNjsJYnJlYWs7DQorCQkJY2FzZSAzOglyYXcgPSAoKHVpbnQzMl90KXJ4LT5jaGFuNF9oMiA8PCA4KSB8IHJ4LT5jaGFuNF9sODsJYnJlYWs7DQorCQkJY2FzZSA0OglyYXcgPSAoKHVpbnQzMl90KXJ4LT5jaGFuNV9oOCA8PCAyKSB8IHJ4LT5jaGFuNV9sMjsJYnJlYWs7DQorCQkJY2FzZSA1OglyYXcgPSAoKHVpbnQzMl90KXJ4LT5jaGFuNl9oNiA8PCA0KSB8IHJ4LT5jaGFuNl9sNDsJYnJlYWs7DQorCQkJZGVmYXVsdDoJcmV0dmFsID0gQ1RSX0ludmFsaWRQYXJhbVZhbHVlOwlicmVhazsNCisJCX0NCisJfWVsc2UgaWYoaWR4IDw9IDExKXsNCisJCUdFVF9TVEFUVVMyKCk7DQorCSAgICByZXR2YWwgPSByeC5lcnI7DQorCQlzd2l0Y2goaWR4KXsNCisJCQljYXNlICA2OglyYXcgPSAoKHVpbnQzMl90KXJ4LT5jaGFuN19oOCAgPDwgMikgfCByeC0+Y2hhbjdfbDI7CWJyZWFrOw0KKwkJCWNhc2UgIDc6CXJhdyA9ICgodWludDMyX3QpcngtPmNoYW44X2g2ICA8PCA0KSB8IHJ4LT5jaGFuOF9sNDsJYnJlYWs7DQorCQkJY2FzZSAgODoJcmF3ID0gKCh1aW50MzJfdClyeC0+Y2hhbjlfaDQgIDw8IDYpIHwgcngtPmNoYW45X2w2OwlicmVhazsNCisJCQljYXNlICA5OglyYXcgPSAoKHVpbnQzMl90KXJ4LT5jaGFuMTBfaDIgPDwgOCkgfCByeC0+Y2hhbjEwX2w4OwlicmVhazsNCisJCQljYXNlIDEwOglyYXcgPSAoKHVpbnQzMl90KXJ4LT5jaGFuMTFfaDggPDwgMikgfCByeC0+Y2hhbjExX2wyOwlicmVhazsNCisJCQljYXNlIDExOglyYXcgPSAoKHVpbnQzMl90KXJ4LT5jaGFuMTJfaDYgPDwgNCkgfCByeC0+Y2hhbjEyX2w0OwlicmVhazsNCisJCQlkZWZhdWx0OglyZXR2YWwgPSBDVFJfSW52YWxpZFBhcmFtVmFsdWU7CWJyZWFrOw0KKwkJfQ0KKwl9ZWxzZSBpZihpZHggPD0gMTUpew0KKwkJR0VUX1NUQVRVUzMoKTsNCisJICAgIHJldHZhbCA9IHJ4LmVycjsNCisJCXN3aXRjaChpZHgpew0KKwkJCWNhc2UgMTI6CXJhdyA9ICgodWludDMyX3QpcngtPmNoYW4xM19oOCAgPDwgMikgfCByeC0+Y2hhbjEzX2wyOwlicmVhazsNCisJCQljYXNlIDEzOglyYXcgPSAoKHVpbnQzMl90KXJ4LT5jaGFuMTRfaDYgIDw8IDQpIHwgcngtPmNoYW4xNF9sNDsJYnJlYWs7DQorCQkJY2FzZSAxNDoJcmF3ID0gKCh1aW50MzJfdClyeC0+Y2hhbjE1X2g0ICA8PCA2KSB8IHJ4LT5jaGFuMTVfbDY7CWJyZWFrOw0KKwkJCWNhc2UgMTU6CXJhdyA9ICgodWludDMyX3QpcngtPmNoYW4xNl9oMiAgPDwgOCkgfCByeC0+Y2hhbjE2X2w4OwlicmVhazsNCisJCQlkZWZhdWx0OglyZXR2YWwgPSBDVFJfSW52YWxpZFBhcmFtVmFsdWU7CWJyZWFrOw0KKwkJfQ0KKwl9DQorCS8qIGNvbnZlcnQgdG8gYW1wcyAqLw0KKwljdXJyZW50ID0gKGRvdWJsZSlyYXcgKiAwLjEyNTsgIC8qIDcuMyBmaXhlZCBwdCB2YWx1ZSBpbiBBbXBzICovDQorCS8qIHNpZ25hbCBjYWxsZXIgd2l0aCBzdWNjZXNzICovDQorCXJldHVybiByZXR2YWw7DQorfQ0KK0NUUl9Db2RlIFBEUDo6R2V0Vm9sdGFnZShkb3VibGUgJnZvbHRhZ2UpDQorew0KKwlHRVRfU1RBVFVTMygpOw0KKwl1aW50MzJfdCByYXcgPSByeC0+YnVzVm9sdGFnZTsNCisJdm9sdGFnZSA9IChkb3VibGUpcmF3ICogMC4wNSArIDQuMDsgLyogNTBtViBwZXIgdW5pdCBwbHVzIDRWLiAqLzsNCisJcmV0dXJuIHJ4LmVycjsNCit9DQorQ1RSX0NvZGUgUERQOjpHZXRUZW1wZXJhdHVyZShkb3VibGUgJnRlbXBDKQ0KK3sNCisJR0VUX1NUQVRVUzMoKTsNCisJdWludDMyX3QgcmF3ID0gcngtPnRlbXA7DQorCXRlbXBDID0JKGRvdWJsZSlyYXcgKiAxLjAzMjUwODM2OTU3NTQyIC0gNjcuODU2NDUwMDQ4NDk2NjsNCisJcmV0dXJuIHJ4LmVycjsNCit9DQorQ1RSX0NvZGUgUERQOjpHZXRUb3RhbEN1cnJlbnQoZG91YmxlICZjdXJyZW50QW1wcykNCit7DQorCUdFVF9TVEFUVVNfRU5FUkdZKCk7DQorCXVpbnQzMl90IHJhdzsNCisJcmF3ID0gcngtPlRvdGFsQ3VycmVudF8xMjVtQXBlcnVuaXRfaDg7DQorCXJhdyA8PD0gNDsNCisJcmF3IHw9ICByeC0+VG90YWxDdXJyZW50XzEyNW1BcGVydW5pdF9sNDsNCisJY3VycmVudEFtcHMgPSAwLjEyNSAqIHJhdzsNCisJcmV0dXJuIHJ4LmVycjsNCit9DQorQ1RSX0NvZGUgUERQOjpHZXRUb3RhbFBvd2VyKGRvdWJsZSAmcG93ZXJXYXR0cykNCit7DQorCUdFVF9TVEFUVVNfRU5FUkdZKCk7DQorCXVpbnQzMl90IHJhdzsNCisJcmF3ID0gcngtPlBvd2VyXzEyNW1XcGVydW5pdF9oNDsNCisJcmF3IDw8PSA4Ow0KKwlyYXcgfD0gIHJ4LT5Qb3dlcl8xMjVtV3BlcnVuaXRfbTg7DQorCXJhdyA8PD0gNDsNCisJcmF3IHw9ICByeC0+UG93ZXJfMTI1bVdwZXJ1bml0X2w0Ow0KKwlwb3dlcldhdHRzID0gMC4xMjUgKiByYXc7DQorCXJldHVybiByeC5lcnI7DQorfQ0KK0NUUl9Db2RlIFBEUDo6R2V0VG90YWxFbmVyZ3koZG91YmxlICZlbmVyZ3lKb3VsZXMpDQorew0KKwlHRVRfU1RBVFVTX0VORVJHWSgpOw0KKwl1aW50MzJfdCByYXc7DQorCXJhdyA9IHJ4LT5FbmVyZ3lfMTI1bVdQZXJVbml0WFRtZWFzX2g0Ow0KKwlyYXcgPDw9IDg7DQorCXJhdyB8PSAgcngtPkVuZXJneV8xMjVtV1BlclVuaXRYVG1lYXNfbWg4Ow0KKwlyYXcgPDw9IDg7DQorCXJhdyB8PSAgcngtPkVuZXJneV8xMjVtV1BlclVuaXRYVG1lYXNfbWw4Ow0KKwlyYXcgPDw9IDg7DQorCXJhdyB8PSAgcngtPkVuZXJneV8xMjVtV1BlclVuaXRYVG1lYXNfbDg7DQorCWVuZXJneUpvdWxlcyA9IDAuMTI1ICogcmF3OyAJCQkJCQkvKiBtVyBpbnRlZ3JhdGVkIGV2ZXJ5IFRtZWFzTXMgKi8NCisJZW5lcmd5Sm91bGVzICo9IHJ4LT5UbWVhc01zX2xpa2VseXdpbGxiZTIwbXNfOwkvKiBtdWx0aXBsaWVkIGJ5IFRtZWFzTXMgPSBqb3VsZXMgKi8NCisJcmV0dXJuIHJ4LmVycjsNCit9DQorLyogQ2xlYXIgc3RpY2t5IGZhdWx0cy4NCisgKiBAUmV0dXJuCS0JQ1RSX0NvZGUJLQlFcnJvciBjb2RlIChpZiBhbnkpDQorICovDQorQ1RSX0NvZGUgUERQOjpDbGVhclN0aWNreUZhdWx0cygpDQorew0KKwlpbnQzMl90IHN0YXR1cyA9IDA7DQorCXVpbnQ4X3QgcGRwQ29udHJvbFtdID0geyAweDgwIH07IC8qIG9ubHkgYml0IHNldCBpcyBDbGVhclN0aWNreUZhdWx0cyAqLw0KKwlGUkNfTmV0d29ya0NvbW11bmljYXRpb25fQ0FOU2Vzc2lvbk11eF9zZW5kTWVzc2FnZShDT05UUk9MXzEgIHwgR2V0RGV2aWNlTnVtYmVyKCksIHBkcENvbnRyb2wsIHNpemVvZihwZHBDb250cm9sKSwgMCwgJnN0YXR1cyk7DQorCWlmKHN0YXR1cykNCisJCXJldHVybiBDVFJfVHhGYWlsZWQ7DQorCXJldHVybiBDVFJfT0tBWTsNCit9DQorDQorLyogUmVzZXQgRW5lcmd5IFNpZ25hbHMNCisgKiBAUmV0dXJuCS0JQ1RSX0NvZGUJLQlFcnJvciBjb2RlIChpZiBhbnkpDQorICovDQorQ1RSX0NvZGUgUERQOjpSZXNldEVuZXJneSgpDQorew0KKwlpbnQzMl90IHN0YXR1cyA9IDA7DQorCXVpbnQ4X3QgcGRwQ29udHJvbFtdID0geyAweDQwIH07IC8qIG9ubHkgYml0IHNldCBpcyBSZXNldEVuZXJneSAqLw0KKwlGUkNfTmV0d29ya0NvbW11bmljYXRpb25fQ0FOU2Vzc2lvbk11eF9zZW5kTWVzc2FnZShDT05UUk9MXzEgIHwgR2V0RGV2aWNlTnVtYmVyKCksIHBkcENvbnRyb2wsIHNpemVvZihwZHBDb250cm9sKSwgMCwgJnN0YXR1cyk7DQorCWlmKHN0YXR1cykNCisJCXJldHVybiBDVFJfVHhGYWlsZWQ7DQorCXJldHVybiBDVFJfT0tBWTsNCit9DQorLy8tLS0tLS0tLS0tLS0tLS0tLS0gQyBpbnRlcmZhY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLw0KK2V4dGVybiAiQyIgew0KKwl2b2lkICogY19QRFBfSW5pdCh2b2lkKQ0KKwl7DQorCQlyZXR1cm4gbmV3IFBEUCgpOw0KKwl9DQorCUNUUl9Db2RlIGNfR2V0Q2hhbm5lbEN1cnJlbnQodm9pZCAqIGhhbmRsZSxVSU5UOCBpZHgsIGRvdWJsZSAqc3RhdHVzKQ0KKwl7DQorCQlyZXR1cm4gKChQRFAqKWhhbmRsZSktPiBHZXRDaGFubmVsQ3VycmVudChpZHgsKnN0YXR1cyk7DQorCX0NCisJQ1RSX0NvZGUgY19HZXRWb2x0YWdlKHZvaWQgKiBoYW5kbGUsZG91YmxlICpzdGF0dXMpDQorCXsNCisJCXJldHVybiAoKFBEUCopaGFuZGxlKS0+IEdldFZvbHRhZ2UoKnN0YXR1cyk7DQorCX0NCisJQ1RSX0NvZGUgY19HZXRUZW1wZXJhdHVyZSh2b2lkICogaGFuZGxlLGRvdWJsZSAqc3RhdHVzKQ0KKwl7DQorCQlyZXR1cm4gKChQRFAqKWhhbmRsZSktPiBHZXRUZW1wZXJhdHVyZSgqc3RhdHVzKTsNCisJfQ0KKwl2b2lkIGNfU2V0RGV2aWNlTnVtYmVyX1BEUCh2b2lkICogaGFuZGxlLFVJTlQ4IGRldmljZU51bWJlcikNCisJew0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL2N0cmUvUERQLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9jdHJlL1BEUC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyODlkMWEKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9jdHJlL1BEUC5oCkBAIC0wLDAgKzEsNjQgQEAKKyNpZm5kZWYgUERQX0hfDQorI2RlZmluZSBQRFBfSF8NCisjaW5jbHVkZSAiY3RyZS5oIgkJCQkvL0JJVCBEZWZpbmVzICsgVHlwZWRlZnMNCisjaW5jbHVkZSA8TmV0d29ya0NvbW11bmljYXRpb24vQ0FOU2Vzc2lvbk11eC5oPgkvL0NBTiBDb21tDQorI2luY2x1ZGUgIkN0cmVDYW5Ob2RlLmgiDQorI2luY2x1ZGUgPHB0aHJlYWQuaD4NCitjbGFzcyBQRFAgOiBwdWJsaWMgQ3RyZUNhbk5vZGUNCit7DQorcHVibGljOg0KKyAgICAvKiBHZXQgUERQIENoYW5uZWwgQ3VycmVudA0KKyAgICAgKg0KKyAgICAgKiBAUGFyYW0JLQlkZXZpY2VOdW1iZXIJLQlEZXZpY2UgSUQgZm9yIFBEUC4gRmFjdG9yeSBkZWZhdWx0IGlzIDYwLiBGdW5jdGlvbiBkZWZhdWx0cyB0byA2MC4NCisgICAgICovDQorICAgIFBEUChVSU5UOCBkZXZpY2VOdW1iZXI9MCk7DQorICAgIH5QRFAoKTsNCisgICAgLyogR2V0IFBEUCBDaGFubmVsIEN1cnJlbnQNCisgICAgICoNCisgICAgICogQFJldHVybgktCUNUUl9Db2RlCS0JRXJyb3IgY29kZSAoaWYgYW55KQ0KKyAgICAgKg0KKyAgICAgKiBAUGFyYW0JLQlpZHgJCQktCUlEIG9mIGNoYW5uZWwgdG8gcmV0dXJuIGN1cnJlbnQgZm9yIChjaGFubmVscyAxLTE2KQ0KKyAgICAgKg0KKyAgICAgKiBAUGFyYW0JLQlzdGF0dXMJCS0JQ3VycmVudCBvZiBjaGFubmVsICdpZHgnIGluIEFtcHMgKEEpDQorICAgICAqLw0KKyAgICBDVFJfQ29kZSBHZXRDaGFubmVsQ3VycmVudChVSU5UOCBpZHgsIGRvdWJsZSAmc3RhdHVzKTsNCisNCisgICAgLyogR2V0IEJ1cyBWb2x0YWdlIG9mIFBEUA0KKyAgICAgKg0KKyAgICAgKiBAUmV0dXJuCS0JQ1RSX0NvZGUJLSAJRXJyb3IgY29kZSAoaWYgYW55KQ0KKyAgICAgKg0KKyAgICAgKiBAUGFyYW0JLQlzdGF0dXMJCS0gCVZvbHRhZ2UgKFYpIGFjcm9zcyBQRFANCisgICAgICovDQorICAgIENUUl9Db2RlIEdldFZvbHRhZ2UoZG91YmxlICZzdGF0dXMpOw0KKw0KKyAgICAvKiBHZXQgVGVtcGVyYXR1cmUgb2YgUERQDQorICAgICAqDQorICAgICAqIEBSZXR1cm4JLQlDVFJfQ29kZQktCUVycm9yIGNvZGUgKGlmIGFueSkNCisgICAgICoNCisgICAgICogQFBhcmFtCS0Jc3RhdHVzCQktCVRlbXBlcmF0dXJlIG9mIFBEUCBpbiBDZW50aWdyYWRlIC8gQ2VsY2l1cyAoQykNCisgICAgICovDQorICAgIENUUl9Db2RlIEdldFRlbXBlcmF0dXJlKGRvdWJsZSAmc3RhdHVzKTsNCisNCisJQ1RSX0NvZGUgR2V0VG90YWxDdXJyZW50KGRvdWJsZSAmY3VycmVudEFtcHMpOw0KKwlDVFJfQ29kZSBHZXRUb3RhbFBvd2VyKGRvdWJsZSAmcG93ZXJXYXR0cyk7DQorCUNUUl9Db2RlIEdldFRvdGFsRW5lcmd5KGRvdWJsZSAmZW5lcmd5Sm91bGVzKTsNCisgICAgLyogQ2xlYXIgc3RpY2t5IGZhdWx0cy4NCisgICAgICogQFJldHVybgktCUNUUl9Db2RlCS0JRXJyb3IgY29kZSAoaWYgYW55KQ0KKyAgICAgKi8NCisJQ1RSX0NvZGUgQ2xlYXJTdGlja3lGYXVsdHMoKTsNCisNCisJLyogUmVzZXQgRW5lcmd5IFNpZ25hbHMNCisJICogQFJldHVybgktCUNUUl9Db2RlCS0JRXJyb3IgY29kZSAoaWYgYW55KQ0KKwkgKi8NCisJQ1RSX0NvZGUgUmVzZXRFbmVyZ3koKTsNCitwcml2YXRlOg0KKyAgICB1aW50NjRfdCBSZWFkQ3VycmVudHModWludDhfdCBhcGkpOw0KK307DQorZXh0ZXJuICJDIiB7DQorCXZvaWQgKiBjX1BEUF9Jbml0KCk7DQorCUNUUl9Db2RlIGNfR2V0Q2hhbm5lbEN1cnJlbnQodm9pZCAqIGhhbmRsZSxVSU5UOCBpZHgsIGRvdWJsZSAqc3RhdHVzKTsNCisJQ1RSX0NvZGUgY19HZXRWb2x0YWdlKHZvaWQgKiBoYW5kbGUsZG91YmxlICpzdGF0dXMpOw0KKwlDVFJfQ29kZSBjX0dldFRlbXBlcmF0dXJlKHZvaWQgKiBoYW5kbGUsZG91YmxlICpzdGF0dXMpOw0KKwl2b2lkIGNfU2V0RGV2aWNlTnVtYmVyX1BEUCh2b2lkICogaGFuZGxlLFVJTlQ4IGRldmljZU51bWJlcik7DQorfQ0KKyNlbmRpZiAvKiBQRFBfSF8gKi8NCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9jdHJlL2N0cmUuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL2N0cmUvY3RyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZDNmNjkKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9jdHJlL2N0cmUuaApAQCAtMCwwICsxLDUwIEBACisjaWZuZGVmIEdMT0JBTF9IDQorI2RlZmluZSBHTE9CQUxfSA0KKw0KKy8vQml0IERlZmluZXMNCisjZGVmaW5lIEJJVDAgMHgwMQ0KKyNkZWZpbmUgQklUMSAweDAyDQorI2RlZmluZSBCSVQyIDB4MDQNCisjZGVmaW5lIEJJVDMgMHgwOA0KKyNkZWZpbmUgQklUNCAweDEwDQorI2RlZmluZSBCSVQ1IDB4MjANCisjZGVmaW5lIEJJVDYgMHg0MA0KKyNkZWZpbmUgQklUNyAweDgwDQorI2RlZmluZSBCSVQ4ICAweDAxMDANCisjZGVmaW5lIEJJVDkgIDB4MDIwMA0KKyNkZWZpbmUgQklUMTAgMHgwNDAwDQorI2RlZmluZSBCSVQxMSAweDA4MDANCisjZGVmaW5lIEJJVDEyIDB4MTAwMA0KKyNkZWZpbmUgQklUMTMgMHgyMDAwDQorI2RlZmluZSBCSVQxNCAweDQwMDANCisjZGVmaW5lIEJJVDE1IDB4ODAwMA0KKw0KKy8vU2lnbmVkDQordHlwZWRlZglzaWduZWQgY2hhcglJTlQ4Ow0KK3R5cGVkZWYJc2lnbmVkIHNob3J0CUlOVDE2Ow0KK3R5cGVkZWYJc2lnbmVkIGludAlJTlQzMjsNCit0eXBlZGVmCXNpZ25lZCBsb25nIGxvbmcgSU5UNjQ7DQorDQorLy9VbnNpZ25lZA0KK3R5cGVkZWYJdW5zaWduZWQgY2hhcglVSU5UODsNCit0eXBlZGVmCXVuc2lnbmVkIHNob3J0CVVJTlQxNjsNCit0eXBlZGVmCXVuc2lnbmVkIGludAlVSU5UMzI7DQordHlwZWRlZgl1bnNpZ25lZCBsb25nIGxvbmcgVUlOVDY0Ow0KKw0KKy8vT3RoZXINCit0eXBlZGVmCXVuc2lnbmVkIGNoYXIJVUNIQVI7DQordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlVU0hPUlQ7DQordHlwZWRlZgl1bnNpZ25lZCBpbnQJVUlOVDsNCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcJVUxPTkc7DQorDQordHlwZWRlZiBlbnVtIHsNCisJCUNUUl9PS0FZLAkJCQkvLyE8IE5vIEVycm9yIC0gRnVuY3Rpb24gZXhlY3V0ZWQgYXMgZXhwZWN0ZWQNCisJCUNUUl9SeFRpbWVvdXQsCQkJLy8hPCBDQU4gZnJhbWUgaGFzIG5vdCBiZWVuIHJlY2VpdmVkIHdpdGhpbiBzcGVjaWZpZWQgcGVyaW9kIG9mIHRpbWUuDQorCQlDVFJfVHhUaW1lb3V0LAkJCS8vITwgTm90IHVzZWQuDQorCQlDVFJfSW52YWxpZFBhcmFtVmFsdWUsIAkvLyE8IENhbGxlciBwYXNzZWQgYW4gaW52YWxpZCBwYXJhbQ0KKwkJQ1RSX1VuZXhwZWN0ZWRBcmJJZCwJLy8hPCBTcGVjaWZpZWQgQ0FOIElkIGlzIGludmFsaWQuDQorCQlDVFJfVHhGYWlsZWQsCQkJLy8hPCBDb3VsZCBub3QgdHJhbnNtaXQgdGhlIENBTiBmcmFtZS4NCisJCUNUUl9TaWdOb3RVcGRhdGVkLAkJLy8hPCBIYXZlIG5vdCByZWNlaXZlZCBhbiB2YWx1ZSByZXNwb25zZSBmb3Igc2lnbmFsLg0KK31DVFJfQ29kZTsNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9pMmNsaWIvaTJjLWxpYi5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvaTJjbGliL2kyYy1saWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzRjYjMzCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvaTJjbGliL2kyYy1saWIuaApAQCAtMCwwICsxLDE2IEBACisjaWZuZGVmIF9fSTJDX0xJQl9IX18NCisjZGVmaW5lIF9fSTJDX0xJQl9IX18NCisNCisjaWZkZWYgX19jcGx1c3BsdXMNCitleHRlcm4gIkMiIHsNCisjZW5kaWYNCitpbnQgaTJjbGliX29wZW4oY29uc3QgY2hhciAqZGV2aWNlKTsNCit2b2lkIGkyY2xpYl9jbG9zZShpbnQgaGFuZGxlKTsNCitpbnQgaTJjbGliX3JlYWQoaW50IGhhbmRsZSwgdWludDhfdCBkZXZfYWRkciwgY2hhciAqcmVjdl9idWYsIGludDMyX3QgcmVjdl9zaXplKTsNCitpbnQgaTJjbGliX3dyaXRlKGludCBoYW5kbGUsIHVpbnQ4X3QgZGV2X2FkZHIsIGNvbnN0IGNoYXIgKnNlbmRfYnVmLCBpbnQzMl90IHNlbmRfc2l6ZSk7DQoraW50IGkyY2xpYl93cml0ZXJlYWQoaW50IGhhbmRsZSwgdWludDhfdCBkZXZfYWRkciwgY29uc3QgY2hhciAqc2VuZF9idWYsIGludDMyX3Qgc2VuZF9zaXplLCBjaGFyICpyZWN2X2J1ZiwgaW50MzJfdCByZWN2X3NpemUpOw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK30NCisjZW5kaWYNCisNCisjZW5kaWYgLyogX19JMkNfTElCX0hfXyAqLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL2kyY2xpYi9pMmNsaWIvZW52aXJvbnMuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL2kyY2xpYi9pMmNsaWIvZW52aXJvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjUwNTg1Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvaTJjbGliL2kyY2xpYi9lbnZpcm9ucy5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qIQ0KKyAgIFxmaWxlIGVudmlyb25zLmgNCisgICBcYnJpZWYgRGVmaW5lcyBleHBvcnQgc3ltYm9scyBhbmQgbmFtZXNwYWNlIGFsaWFzZXMNCisqLw0KKy8qDQorICAgQ29weXJpZ2h0IChjKSAyMDE0LA0KKyAgIE5hdGlvbmFsIEluc3RydW1lbnRzIENvcnBvcmF0aW9uLg0KKyAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorDQorICAgRmlsZTogICAgICAgICRJZDogLy9sdmFkZG9uL0ZJUlNUL0ZSQy90cnVuay8yMDE1L3Rvb2xzL2ZyY3J0aS9leHBvcnQvMS4wLzEuMC4wYTYvaW5jbHVkZXMvd3BpbGliL2kyY2xpYi9pMmNsaWIvZW52aXJvbnMuaCMxICQNCisgICBBdXRob3I6ICAgICAgbmlwZy5wbA0KKyAgIE9yaWdpbmF0ZWQ6ICBNb24gRmViIDEwIDEwOjM5OjQyIDIwMTQNCisqLw0KKw0KKyNpZm5kZWYgX19faTJjbGliX2Vudmlyb25zX2hfX18NCisjZGVmaW5lIF9fX2kyY2xpYl9lbnZpcm9uc19oX19fDQorDQorI2luY2x1ZGUgPG5pYnVpbGQvcGxhdGZvcm0uaD4NCisNCisvKg0KKyAqIGtJMkNMSUJFeHBvcnRTeW1ib2xzIGRpcmVjdHMgdGhlIGJ1aWxkIHRvIGV4cG9ydCBzeW1ib2xzIG1vZGlmaWVkIGJ5DQorICogdGhlIGtJMkNMSUJFeHBvcnQga2V5d29yZC4ga0kyQ0xJQk5vRXhwb3J0U3ltYm9scyBkaXJlY3RzIHRoZSBidWlsZCB0byBub3QNCisgKiBpbXBvcnQgb3IgZXhwb3J0IHN5bWJvbHMgbW9kaWZpZWQgYnkgdGhlIGtJMkNMSUJFeHBvcnQga2V5d29yZC4gSWYNCisgKiBuZWl0aGVyIG9mIHRoZXNlIGFyZSBkZWZpbmVkLCB0aGUgc3ltYm9scyBtb2RpZmllZCBieSBrSTJDTElCRXhwb3J0IGFyZQ0KKyAqIGltcG9ydGVkLiBUaGVzZSBzaG91bGQgYmUgZGVmaW5lZCBvbmx5IHdoZW4gYnVpbGRpbmcgdGhlIGNvbXBvbmVudCwNCisgKiBzbyBjbGllbnRzIGRvIG5vdCBuZWVkIHRvIHRyb3VibGUgdGhlbXNlbHZlcyB3aXRoIGl0Lg0KKyAqLw0KKyNpZiBkZWZpbmVkKGtJMkNMSUJFeHBvcnRTeW1ib2xzKQ0KKyAgICNkZWZpbmUga0kyQ0xJQkV4cG9ydCBrTklFeHBvcnQNCisgICAjZGVmaW5lIGtJMkNMSUJFeHBvcnRQcmUga05JRXhwb3J0UHJlDQorICAgI2RlZmluZSBrSTJDTElCRXhwb3J0UG9zdCBrTklFeHBvcnRQb3N0DQorICAgI2RlZmluZSBrSTJDTElCRXhwb3J0SW5saW5lIGtOSUV4cG9ydElubGluZQ0KKyAgICNkZWZpbmUga0kyQ0xJQkV4cG9ydERhdGEga05JRXhwb3J0RGF0YQ0KKyNlbGlmIGRlZmluZWQoa0kyQ0xJQk5vRXhwb3J0U3ltYm9scykNCisgICAjZGVmaW5lIGtJMkNMSUJFeHBvcnQNCisgICAjZGVmaW5lIGtJMkNMSUJFeHBvcnRQcmUNCisgICAjZGVmaW5lIGtJMkNMSUJFeHBvcnRQb3N0DQorICAgI2RlZmluZSBrSTJDTElCRXhwb3J0SW5saW5lDQorICAgI2RlZmluZSBrSTJDTElCRXhwb3J0RGF0YQ0KKyNlbHNlDQorICAgI2RlZmluZSBrSTJDTElCRXhwb3J0IGtOSUltcG9ydA0KKyAgICNkZWZpbmUga0kyQ0xJQkV4cG9ydFByZSBrTklJbXBvcnRQcmUNCisgICAjZGVmaW5lIGtJMkNMSUJFeHBvcnRQb3N0IGtOSUltcG9ydFBvc3QNCisgICAjZGVmaW5lIGtJMkNMSUJFeHBvcnRJbmxpbmUga05JSW1wb3J0SW5saW5lDQorICAgI2RlZmluZSBrSTJDTElCRXhwb3J0RGF0YSBrTklJbXBvcnREYXRhDQorI2VuZGlmDQorDQorLy8gbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyBmb3IgYWxpYXNpbmcgLi4uDQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorDQorDQorLyohDQorICAgXG5hbWVzcGFjZSBuSTJDTElCXzFfMA0KKyAgIFxicmllZiBpMmMgdXNlci1tb2RlIGxpYnJhcnkgUmVsZWFzZSAxLjANCisqLw0KK25hbWVzcGFjZSBuSTJDTElCXzFfMA0KK3sNCisgICAvLyBjdXJyZW50IHZlcnNpb25lZCBuYW1lc3BhY2UgYWxpYXNlcyB1c2VkIGJ5IHRoaXMgcGFja2FnZQ0KKw0KK30NCisNCisjZW5kaWYgLy8gX19jcGx1c3BsdXMNCisNCisjZW5kaWYgLy8gX19faTJjbGliX2Vudmlyb25zX2hfX18NCisNCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9zcGlsaWIvc3BpLWxpYi5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvc3BpbGliL3NwaS1saWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWMyYTdhCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvc3BpbGliL3NwaS1saWIuaApAQCAtMCwwICsxLDE5IEBACisjaWZuZGVmIF9fU1BJX0xJQl9IX18NCisjZGVmaW5lIF9fU1BJX0xJQl9IX18NCisNCisjaWZkZWYgX19jcGx1c3BsdXMNCitleHRlcm4gIkMiIHsNCisjZW5kaWYNCitpbnQgc3BpbGliX29wZW4oY29uc3QgY2hhciAqZGV2aWNlKTsNCit2b2lkIHNwaWxpYl9jbG9zZShpbnQgaGFuZGxlKTsNCitpbnQgc3BpbGliX3NldHNwZWVkKGludCBoYW5kbGUsIHVpbnQzMl90IHNwZWVkKTsNCitpbnQgc3BpbGliX3NldGJpdHNwZXJ3b3JkKGludCBoYW5kbGUsIHVpbnQ4X3QgYnB3KTsNCitpbnQgc3BpbGliX3NldG9wdHMoaW50IGhhbmRsZSwgaW50IG1zYl9maXJzdCwgaW50IHNhbXBsZV9vbl90cmFpbGluZywgaW50IGNsa19pZGxlX2hpZ2gpOw0KK2ludCBzcGlsaWJfcmVhZChpbnQgaGFuZGxlLCBjaGFyICpyZWN2X2J1ZiwgaW50MzJfdCBzaXplKTsNCitpbnQgc3BpbGliX3dyaXRlKGludCBoYW5kbGUsIGNvbnN0IGNoYXIgKnNlbmRfYnVmLCBpbnQzMl90IHNpemUpOw0KK2ludCBzcGlsaWJfd3JpdGVyZWFkKGludCBoYW5kbGUsIGNvbnN0IGNoYXIgKnNlbmRfYnVmLCBjaGFyICpyZWN2X2J1ZiwgaW50MzJfdCBzaXplKTsNCisjaWZkZWYgX19jcGx1c3BsdXMNCit9DQorI2VuZGlmDQorDQorI2VuZGlmIC8qIF9fU1BJX0xJQl9IX18gKi8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS92aXNhL3Zpc2EuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL3Zpc2EvdmlzYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNmFkMzAKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS92aXNhL3Zpc2EuaApAQCAtMCwwICsxLDEwNjQgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIERpc3RyaWJ1dGVkIGJ5IElWSSBGb3VuZGF0aW9uIEluYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIENvbnRhaW5zIE5hdGlvbmFsIEluc3RydW1lbnRzIGV4dGVuc2lvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERvIG5vdCBtb2RpZnkgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRpdGxlICAgOiBWSVNBLkggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERhdGUgICAgOiAxMC0wOS0yMDA2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFB1cnBvc2UgOiBJbmNsdWRlIGZpbGUgZm9yIHRoZSBWSVNBIExpYnJhcnkgNC4wIHNwZWNpZmljYXRpb24gICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFdoZW4gdXNpbmcgTkktVklTQSBleHRlbnNpb25zLCB5b3UgbXVzdCBsaW5rIHdpdGggdGhlIFZJU0EgbGlicmFyeSB0aGF0ICAgKi8KKy8qIGNvbWVzIHdpdGggTkktVklTQS4gIEN1cnJlbnRseSwgdGhlIGV4dGVuc2lvbnMgcHJvdmlkZWQgYnkgTkktVklTQSBhcmU6ICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBYSSAoQ29tcGFjdCBQQ0kgZVh0ZW5zaW9ucyBmb3IgSW5zdHJ1bWVudGF0aW9uKSBhbmQgUENJIHN1cHBvcnQuICBUbyB1c2UgKi8KKy8qIHRoaXMsIHlvdSBtdXN0IGRlZmluZSB0aGUgbWFjcm8gTklWSVNBX1BYSSBiZWZvcmUgaW5jbHVkaW5nIHRoaXMgaGVhZGVyLiAgKi8KKy8qIFlvdSBtdXN0IGFsc28gY3JlYXRlIGFuIElORiBmaWxlIHdpdGggdGhlIFZJU0EgRHJpdmVyIERldmVsb3BtZW50IFdpemFyZC4gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEEgZmFzdCBzZXQgb2YgbWFjcm9zIGZvciB2aVBlZWtYWC92aVBva2VYWCB0aGF0IGd1YXJhbnRlZXMgYmluYXJ5ICAgICAgICAgKi8KKy8qIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBpbXBsZW1lbnRhdGlvbnMgb2YgVklTQS4gIFRvIHVzZSB0aGlzLCB5b3UgbXVzdCAgKi8KKy8qIGRlZmluZSB0aGUgbWFjcm8gTklWSVNBX1BFRUtQT0tFIGJlZm9yZSBpbmNsdWRpbmcgdGhpcyBoZWFkZXIuICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFN1cHBvcnQgZm9yIFVTQiBkZXZpY2VzIHRoYXQgZG8gbm90IGNvbmZvcm0gdG8gYSBzcGVjaWZpYyBjbGFzcy4gIFRvIHVzZSAgKi8KKy8qIHRoaXMsIHlvdSBtdXN0IGRlZmluZSB0aGUgbWFjcm8gTklWSVNBX1VTQiBiZWZvcmUgaW5jbHVkaW5nIHRoaXMgaGVhZGVyLiAgKi8KKy8qIFlvdSBtdXN0IGFsc28gY3JlYXRlIGFuIElORiBmaWxlIHdpdGggdGhlIFZJU0EgRHJpdmVyIERldmVsb3BtZW50IFdpemFyZC4gKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBfX1ZJU0FfSEVBREVSX18KKyNkZWZpbmUgX19WSVNBX0hFQURFUl9fCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2lmICFkZWZpbmVkKF9fVklTQVRZUEVfSEVBREVSX18pCisjaW5jbHVkZSAidmlzYXR5cGUuaCIKKyNlbmRpZgorCisjZGVmaW5lIFZJX1NQRUNfVkVSU0lPTiAgICAgKDB4MDA0MDAwMDBVTCkKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoX19jcGx1c3BsdXNfXykKKyAgIGV4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9DVklfKQorI3ByYWdtYSBFbmFibGVMaWJyYXJ5UnVudGltZUNoZWNraW5nCisjZW5kaWYKKworLyotIFZJU0EgVHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIFZpT2JqZWN0ICAgICAgICAgICAgIFZpRXZlbnQ7Cit0eXBlZGVmIFZpRXZlbnQgICAgICBfVklfUFRSIFZpUEV2ZW50OwordHlwZWRlZiBWaU9iamVjdCAgICAgICAgICAgICBWaUZpbmRMaXN0OwordHlwZWRlZiBWaUZpbmRMaXN0ICAgX1ZJX1BUUiBWaVBGaW5kTGlzdDsKKworI2lmIGRlZmluZWQoX1ZJX0lOVDY0X1VJTlQ2NF9ERUZJTkVEKSAmJiBkZWZpbmVkKF9WSVNBX0VOVl9JU182NF9CSVQpCit0eXBlZGVmIFZpVUludDY0ICAgICAgICAgICAgIFZpQnVzQWRkcmVzczsKK3R5cGVkZWYgVmlVSW50NjQgICAgICAgICAgICAgVmlCdXNTaXplOwordHlwZWRlZiBWaVVJbnQ2NCAgICAgICAgICAgICBWaUF0dHJTdGF0ZTsKKyNlbHNlCit0eXBlZGVmIFZpVUludDMyICAgICAgICAgICAgIFZpQnVzQWRkcmVzczsKK3R5cGVkZWYgVmlVSW50MzIgICAgICAgICAgICAgVmlCdXNTaXplOwordHlwZWRlZiBWaVVJbnQzMiAgICAgICAgICAgICBWaUF0dHJTdGF0ZTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfVklfSU5UNjRfVUlOVDY0X0RFRklORUQpCit0eXBlZGVmIFZpVUludDY0ICAgICAgICAgICAgIFZpQnVzQWRkcmVzczY0OwordHlwZWRlZiBWaUJ1c0FkZHJlc3M2NCBfVklfUFRSIFZpUEJ1c0FkZHJlc3M2NDsKKyNlbmRpZgorCit0eXBlZGVmIFZpVUludDMyICAgICAgICAgICAgIFZpRXZlbnRUeXBlOwordHlwZWRlZiBWaUV2ZW50VHlwZSAgX1ZJX1BUUiBWaVBFdmVudFR5cGU7Cit0eXBlZGVmIFZpRXZlbnRUeXBlICBfVklfUFRSIFZpQUV2ZW50VHlwZTsKK3R5cGVkZWYgdm9pZCAgICAgICAgIF9WSV9QVFIgVmlQQXR0clN0YXRlOwordHlwZWRlZiBWaUF0dHIgICAgICAgX1ZJX1BUUiBWaVBBdHRyOwordHlwZWRlZiBWaUF0dHIgICAgICAgX1ZJX1BUUiBWaUFBdHRyOworCit0eXBlZGVmIFZpU3RyaW5nICAgICAgICAgICAgIFZpS2V5SWQ7Cit0eXBlZGVmIFZpUFN0cmluZyAgICAgICAgICAgIFZpUEtleUlkOwordHlwZWRlZiBWaVVJbnQzMiAgICAgICAgICAgICBWaUpvYklkOwordHlwZWRlZiBWaUpvYklkICAgICAgX1ZJX1BUUiBWaVBKb2JJZDsKK3R5cGVkZWYgVmlVSW50MzIgICAgICAgICAgICAgVmlBY2Nlc3NNb2RlOwordHlwZWRlZiBWaUFjY2Vzc01vZGUgX1ZJX1BUUiBWaVBBY2Nlc3NNb2RlOwordHlwZWRlZiBWaUJ1c0FkZHJlc3MgX1ZJX1BUUiBWaVBCdXNBZGRyZXNzOwordHlwZWRlZiBWaVVJbnQzMiAgICAgICAgICAgICBWaUV2ZW50RmlsdGVyOworCit0eXBlZGVmIHZhX2xpc3QgICAgICAgICAgICAgIFZpVkFMaXN0OworCit0eXBlZGVmIFZpU3RhdHVzIChfVklfRlVOQ0ggX1ZJX1BUUiBWaUhuZGxyKQorICAgKFZpU2Vzc2lvbiB2aSwgVmlFdmVudFR5cGUgZXZlbnRUeXBlLCBWaUV2ZW50IGV2ZW50LCBWaUFkZHIgdXNlckhhbmRsZSk7CisKKy8qLSBSZXNvdXJjZSBNYW5hZ2VyIEZ1bmN0aW9ucyBhbmQgT3BlcmF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpT3BlbkRlZmF1bHRSTSAoVmlQU2Vzc2lvbiB2aSk7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlGaW5kUnNyYyAgICAgIChWaVNlc3Npb24gc2VzbiwgVmlTdHJpbmcgZXhwciwgVmlQRmluZExpc3QgdmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaVBVSW50MzIgcmV0Q250LCBWaUNoYXIgX1ZJX0ZBUiBkZXNjW10pOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpRmluZE5leHQgICAgICAoVmlGaW5kTGlzdCB2aSwgVmlDaGFyIF9WSV9GQVIgZGVzY1tdKTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aVBhcnNlUnNyYyAgICAgKFZpU2Vzc2lvbiBybVNlc24sIFZpUnNyYyByc3JjTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpUFVJbnQxNiBpbnRmVHlwZSwgVmlQVUludDE2IGludGZOdW0pOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpUGFyc2VSc3JjRXggICAoVmlTZXNzaW9uIHJtU2VzbiwgVmlSc3JjIHJzcmNOYW1lLCBWaVBVSW50MTYgaW50ZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaVBVSW50MTYgaW50Zk51bSwgVmlDaGFyIF9WSV9GQVIgcnNyY0NsYXNzW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUNoYXIgX1ZJX0ZBUiBleHBhbmRlZFVuYWxpYXNlZE5hbWVbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQ2hhciBfVklfRkFSIGFsaWFzSWZFeGlzdHNbXSk7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlPcGVuICAgICAgICAgIChWaVNlc3Npb24gc2VzbiwgVmlSc3JjIG5hbWUsIFZpQWNjZXNzTW9kZSBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlVSW50MzIgdGltZW91dCwgVmlQU2Vzc2lvbiB2aSk7CisKKy8qLSBSZXNvdXJjZSBUZW1wbGF0ZSBPcGVyYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpQ2xvc2UgICAgICAgICAoVmlPYmplY3QgdmkpOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpU2V0QXR0cmlidXRlICAoVmlPYmplY3QgdmksIFZpQXR0ciBhdHRyTmFtZSwgVmlBdHRyU3RhdGUgYXR0clZhbHVlKTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aUdldEF0dHJpYnV0ZSAgKFZpT2JqZWN0IHZpLCBWaUF0dHIgYXR0ck5hbWUsIHZvaWQgX1ZJX1BUUiBhdHRyVmFsdWUpOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpU3RhdHVzRGVzYyAgICAoVmlPYmplY3QgdmksIFZpU3RhdHVzIHN0YXR1cywgVmlDaGFyIF9WSV9GQVIgZGVzY1tdKTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aVRlcm1pbmF0ZSAgICAgKFZpT2JqZWN0IHZpLCBWaVVJbnQxNiBkZWdyZWUsIFZpSm9iSWQgam9iSWQpOworCitWaVN0YXR1cyBfVklfRlVOQyAgdmlMb2NrICAgICAgICAgIChWaVNlc3Npb24gdmksIFZpQWNjZXNzTW9kZSBsb2NrVHlwZSwgVmlVSW50MzIgdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpS2V5SWQgcmVxdWVzdGVkS2V5LCBWaUNoYXIgX1ZJX0ZBUiBhY2Nlc3NLZXlbXSk7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlVbmxvY2sgICAgICAgIChWaVNlc3Npb24gdmkpOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpRW5hYmxlRXZlbnQgICAoVmlTZXNzaW9uIHZpLCBWaUV2ZW50VHlwZSBldmVudFR5cGUsIFZpVUludDE2IG1lY2hhbmlzbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpRXZlbnRGaWx0ZXIgY29udGV4dCk7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlEaXNhYmxlRXZlbnQgIChWaVNlc3Npb24gdmksIFZpRXZlbnRUeXBlIGV2ZW50VHlwZSwgVmlVSW50MTYgbWVjaGFuaXNtKTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aURpc2NhcmRFdmVudHMgKFZpU2Vzc2lvbiB2aSwgVmlFdmVudFR5cGUgZXZlbnRUeXBlLCBWaVVJbnQxNiBtZWNoYW5pc20pOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpV2FpdE9uRXZlbnQgICAoVmlTZXNzaW9uIHZpLCBWaUV2ZW50VHlwZSBpbkV2ZW50VHlwZSwgVmlVSW50MzIgdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpUEV2ZW50VHlwZSBvdXRFdmVudFR5cGUsIFZpUEV2ZW50IG91dENvbnRleHQpOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpSW5zdGFsbEhhbmRsZXIoVmlTZXNzaW9uIHZpLCBWaUV2ZW50VHlwZSBldmVudFR5cGUsIFZpSG5kbHIgaGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQWRkciB1c2VySGFuZGxlKTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aVVuaW5zdGFsbEhhbmRsZXIoVmlTZXNzaW9uIHZpLCBWaUV2ZW50VHlwZSBldmVudFR5cGUsIFZpSG5kbHIgaGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlBZGRyIHVzZXJIYW5kbGUpOworCisvKi0gQmFzaWMgSS9PIE9wZXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aVJlYWQgICAgICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlQQnVmIGJ1ZiwgVmlVSW50MzIgY250LCBWaVBVSW50MzIgcmV0Q250KTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aVJlYWRBc3luYyAgICAgKFZpU2Vzc2lvbiB2aSwgVmlQQnVmIGJ1ZiwgVmlVSW50MzIgY250LCBWaVBKb2JJZCAgam9iSWQpOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpUmVhZFRvRmlsZSAgICAoVmlTZXNzaW9uIHZpLCBWaUNvbnN0U3RyaW5nIGZpbGVuYW1lLCBWaVVJbnQzMiBjbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaVBVSW50MzIgcmV0Q250KTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aVdyaXRlICAgICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlCdWYgIGJ1ZiwgVmlVSW50MzIgY250LCBWaVBVSW50MzIgcmV0Q250KTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aVdyaXRlQXN5bmMgICAgKFZpU2Vzc2lvbiB2aSwgVmlCdWYgIGJ1ZiwgVmlVSW50MzIgY250LCBWaVBKb2JJZCAgam9iSWQpOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpV3JpdGVGcm9tRmlsZSAoVmlTZXNzaW9uIHZpLCBWaUNvbnN0U3RyaW5nIGZpbGVuYW1lLCBWaVVJbnQzMiBjbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaVBVSW50MzIgcmV0Q250KTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aUFzc2VydFRyaWdnZXIgKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgcHJvdG9jb2wpOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpUmVhZFNUQiAgICAgICAoVmlTZXNzaW9uIHZpLCBWaVBVSW50MTYgc3RhdHVzKTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aUNsZWFyICAgICAgICAgKFZpU2Vzc2lvbiB2aSk7CisKKy8qLSBGb3JtYXR0ZWQgYW5kIEJ1ZmZlcmVkIEkvTyBPcGVyYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpU2V0QnVmICAgICAgICAoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBtYXNrLCBWaVVJbnQzMiBzaXplKTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aUZsdXNoICAgICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgbWFzayk7CisKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aUJ1ZldyaXRlICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlCdWYgIGJ1ZiwgVmlVSW50MzIgY250LCBWaVBVSW50MzIgcmV0Q250KTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aUJ1ZlJlYWQgICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlQQnVmIGJ1ZiwgVmlVSW50MzIgY250LCBWaVBVSW50MzIgcmV0Q250KTsKKworVmlTdGF0dXMgX1ZJX0ZVTkNDIHZpUHJpbnRmICAgICAgICAoVmlTZXNzaW9uIHZpLCBWaVN0cmluZyB3cml0ZUZtdCwgLi4uKTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aVZQcmludGYgICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlTdHJpbmcgd3JpdGVGbXQsIFZpVkFMaXN0IHBhcmFtcyk7CitWaVN0YXR1cyBfVklfRlVOQ0MgdmlTUHJpbnRmICAgICAgIChWaVNlc3Npb24gdmksIFZpUEJ1ZiBidWYsIFZpU3RyaW5nIHdyaXRlRm10LCAuLi4pOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpVlNQcmludGYgICAgICAoVmlTZXNzaW9uIHZpLCBWaVBCdWYgYnVmLCBWaVN0cmluZyB3cml0ZUZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpVkFMaXN0IHBhcm1zKTsKKworVmlTdGF0dXMgX1ZJX0ZVTkNDIHZpU2NhbmYgICAgICAgICAoVmlTZXNzaW9uIHZpLCBWaVN0cmluZyByZWFkRm10LCAuLi4pOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpVlNjYW5mICAgICAgICAoVmlTZXNzaW9uIHZpLCBWaVN0cmluZyByZWFkRm10LCBWaVZBTGlzdCBwYXJhbXMpOworVmlTdGF0dXMgX1ZJX0ZVTkNDIHZpU1NjYW5mICAgICAgICAoVmlTZXNzaW9uIHZpLCBWaUJ1ZiBidWYsIFZpU3RyaW5nIHJlYWRGbXQsIC4uLik7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlWU1NjYW5mICAgICAgIChWaVNlc3Npb24gdmksIFZpQnVmIGJ1ZiwgVmlTdHJpbmcgcmVhZEZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpVkFMaXN0IHBhcm1zKTsKKworVmlTdGF0dXMgX1ZJX0ZVTkNDIHZpUXVlcnlmICAgICAgICAoVmlTZXNzaW9uIHZpLCBWaVN0cmluZyB3cml0ZUZtdCwgVmlTdHJpbmcgcmVhZEZtdCwgLi4uKTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aVZRdWVyeWYgICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlTdHJpbmcgd3JpdGVGbXQsIFZpU3RyaW5nIHJlYWRGbXQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlWQUxpc3QgcGFyYW1zKTsKKworLyotIE1lbW9yeSBJL08gT3BlcmF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitWaVN0YXR1cyBfVklfRlVOQyAgdmlJbjggICAgICAgICAgIChWaVNlc3Npb24gdmksIFZpVUludDE2IHNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNBZGRyZXNzIG9mZnNldCwgVmlQVUludDggIHZhbDgpOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpT3V0OCAgICAgICAgICAoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzQWRkcmVzcyBvZmZzZXQsIFZpVUludDggICB2YWw4KTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aUluMTYgICAgICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c0FkZHJlc3Mgb2Zmc2V0LCBWaVBVSW50MTYgdmFsMTYpOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpT3V0MTYgICAgICAgICAoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzQWRkcmVzcyBvZmZzZXQsIFZpVUludDE2ICB2YWwxNik7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlJbjMyICAgICAgICAgIChWaVNlc3Npb24gdmksIFZpVUludDE2IHNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNBZGRyZXNzIG9mZnNldCwgVmlQVUludDMyIHZhbDMyKTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aU91dDMyICAgICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c0FkZHJlc3Mgb2Zmc2V0LCBWaVVJbnQzMiAgdmFsMzIpOworCisjaWYgZGVmaW5lZChfVklfSU5UNjRfVUlOVDY0X0RFRklORUQpCitWaVN0YXR1cyBfVklfRlVOQyAgdmlJbjY0ICAgICAgICAgIChWaVNlc3Npb24gdmksIFZpVUludDE2IHNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNBZGRyZXNzIG9mZnNldCwgVmlQVUludDY0IHZhbDY0KTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aU91dDY0ICAgICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c0FkZHJlc3Mgb2Zmc2V0LCBWaVVJbnQ2NCAgdmFsNjQpOworCitWaVN0YXR1cyBfVklfRlVOQyAgdmlJbjhFeCAgICAgICAgIChWaVNlc3Npb24gdmksIFZpVUludDE2IHNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNBZGRyZXNzNjQgb2Zmc2V0LCBWaVBVSW50OCAgdmFsOCk7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlPdXQ4RXggICAgICAgIChWaVNlc3Npb24gdmksIFZpVUludDE2IHNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNBZGRyZXNzNjQgb2Zmc2V0LCBWaVVJbnQ4ICAgdmFsOCk7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlJbjE2RXggICAgICAgIChWaVNlc3Npb24gdmksIFZpVUludDE2IHNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNBZGRyZXNzNjQgb2Zmc2V0LCBWaVBVSW50MTYgdmFsMTYpOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpT3V0MTZFeCAgICAgICAoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzQWRkcmVzczY0IG9mZnNldCwgVmlVSW50MTYgIHZhbDE2KTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aUluMzJFeCAgICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c0FkZHJlc3M2NCBvZmZzZXQsIFZpUFVJbnQzMiB2YWwzMik7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlPdXQzMkV4ICAgICAgIChWaVNlc3Npb24gdmksIFZpVUludDE2IHNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNBZGRyZXNzNjQgb2Zmc2V0LCBWaVVJbnQzMiAgdmFsMzIpOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpSW42NEV4ICAgICAgICAoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzQWRkcmVzczY0IG9mZnNldCwgVmlQVUludDY0IHZhbDY0KTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aU91dDY0RXggICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c0FkZHJlc3M2NCBvZmZzZXQsIFZpVUludDY0ICB2YWw2NCk7CisjZW5kaWYKKworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpTW92ZUluOCAgICAgICAoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBzcGFjZSwgVmlCdXNBZGRyZXNzIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzU2l6ZSBsZW5ndGgsIFZpQVVJbnQ4ICBidWY4KTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aU1vdmVPdXQ4ICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgc3BhY2UsIFZpQnVzQWRkcmVzcyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c1NpemUgbGVuZ3RoLCBWaUFVSW50OCAgYnVmOCk7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlNb3ZlSW4xNiAgICAgIChWaVNlc3Npb24gdmksIFZpVUludDE2IHNwYWNlLCBWaUJ1c0FkZHJlc3Mgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNTaXplIGxlbmd0aCwgVmlBVUludDE2IGJ1ZjE2KTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aU1vdmVPdXQxNiAgICAgKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgc3BhY2UsIFZpQnVzQWRkcmVzcyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c1NpemUgbGVuZ3RoLCBWaUFVSW50MTYgYnVmMTYpOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpTW92ZUluMzIgICAgICAoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBzcGFjZSwgVmlCdXNBZGRyZXNzIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzU2l6ZSBsZW5ndGgsIFZpQVVJbnQzMiBidWYzMik7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlNb3ZlT3V0MzIgICAgIChWaVNlc3Npb24gdmksIFZpVUludDE2IHNwYWNlLCBWaUJ1c0FkZHJlc3Mgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNTaXplIGxlbmd0aCwgVmlBVUludDMyIGJ1ZjMyKTsKKworI2lmIGRlZmluZWQoX1ZJX0lOVDY0X1VJTlQ2NF9ERUZJTkVEKQorVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpTW92ZUluNjQgICAgICAoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBzcGFjZSwgVmlCdXNBZGRyZXNzIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzU2l6ZSBsZW5ndGgsIFZpQVVJbnQ2NCBidWY2NCk7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlNb3ZlT3V0NjQgICAgIChWaVNlc3Npb24gdmksIFZpVUludDE2IHNwYWNlLCBWaUJ1c0FkZHJlc3Mgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNTaXplIGxlbmd0aCwgVmlBVUludDY0IGJ1ZjY0KTsKKworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpTW92ZUluOEV4ICAgICAoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBzcGFjZSwgVmlCdXNBZGRyZXNzNjQgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNTaXplIGxlbmd0aCwgVmlBVUludDggIGJ1ZjgpOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpTW92ZU91dDhFeCAgICAoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBzcGFjZSwgVmlCdXNBZGRyZXNzNjQgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNTaXplIGxlbmd0aCwgVmlBVUludDggIGJ1ZjgpOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpTW92ZUluMTZFeCAgICAoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBzcGFjZSwgVmlCdXNBZGRyZXNzNjQgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNTaXplIGxlbmd0aCwgVmlBVUludDE2IGJ1ZjE2KTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aU1vdmVPdXQxNkV4ICAgKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgc3BhY2UsIFZpQnVzQWRkcmVzczY0IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzU2l6ZSBsZW5ndGgsIFZpQVVJbnQxNiBidWYxNik7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlNb3ZlSW4zMkV4ICAgIChWaVNlc3Npb24gdmksIFZpVUludDE2IHNwYWNlLCBWaUJ1c0FkZHJlc3M2NCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c1NpemUgbGVuZ3RoLCBWaUFVSW50MzIgYnVmMzIpOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpTW92ZU91dDMyRXggICAoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBzcGFjZSwgVmlCdXNBZGRyZXNzNjQgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNTaXplIGxlbmd0aCwgVmlBVUludDMyIGJ1ZjMyKTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aU1vdmVJbjY0RXggICAgKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgc3BhY2UsIFZpQnVzQWRkcmVzczY0IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzU2l6ZSBsZW5ndGgsIFZpQVVJbnQ2NCBidWY2NCk7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlNb3ZlT3V0NjRFeCAgIChWaVNlc3Npb24gdmksIFZpVUludDE2IHNwYWNlLCBWaUJ1c0FkZHJlc3M2NCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c1NpemUgbGVuZ3RoLCBWaUFVSW50NjQgYnVmNjQpOworI2VuZGlmCisKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aU1vdmUgICAgICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgc3JjU3BhY2UsIFZpQnVzQWRkcmVzcyBzcmNPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaVVJbnQxNiBzcmNXaWR0aCwgVmlVSW50MTYgZGVzdFNwYWNlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzQWRkcmVzcyBkZXN0T2Zmc2V0LCBWaVVJbnQxNiBkZXN0V2lkdGgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNTaXplIHNyY0xlbmd0aCk7IAorVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpTW92ZUFzeW5jICAgICAoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBzcmNTcGFjZSwgVmlCdXNBZGRyZXNzIHNyY09mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpVUludDE2IHNyY1dpZHRoLCBWaVVJbnQxNiBkZXN0U3BhY2UsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNBZGRyZXNzIGRlc3RPZmZzZXQsIFZpVUludDE2IGRlc3RXaWR0aCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c1NpemUgc3JjTGVuZ3RoLCBWaVBKb2JJZCBqb2JJZCk7CisKKyNpZiBkZWZpbmVkKF9WSV9JTlQ2NF9VSU5UNjRfREVGSU5FRCkKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aU1vdmVFeCAgICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgc3JjU3BhY2UsIFZpQnVzQWRkcmVzczY0IHNyY09mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpVUludDE2IHNyY1dpZHRoLCBWaVVJbnQxNiBkZXN0U3BhY2UsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNBZGRyZXNzNjQgZGVzdE9mZnNldCwgVmlVSW50MTYgZGVzdFdpZHRoLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzU2l6ZSBzcmNMZW5ndGgpOyAKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aU1vdmVBc3luY0V4ICAgKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgc3JjU3BhY2UsIFZpQnVzQWRkcmVzczY0IHNyY09mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpVUludDE2IHNyY1dpZHRoLCBWaVVJbnQxNiBkZXN0U3BhY2UsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNBZGRyZXNzNjQgZGVzdE9mZnNldCwgVmlVSW50MTYgZGVzdFdpZHRoLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzU2l6ZSBzcmNMZW5ndGgsIFZpUEpvYklkIGpvYklkKTsKKyNlbmRpZgorCitWaVN0YXR1cyBfVklfRlVOQyAgdmlNYXBBZGRyZXNzICAgIChWaVNlc3Npb24gdmksIFZpVUludDE2IG1hcFNwYWNlLCBWaUJ1c0FkZHJlc3MgbWFwT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNTaXplIG1hcFNpemUsIFZpQm9vbGVhbiBhY2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUFkZHIgc3VnZ2VzdGVkLCBWaVBBZGRyIGFkZHJlc3MpOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpVW5tYXBBZGRyZXNzICAoVmlTZXNzaW9uIHZpKTsKKworI2lmIGRlZmluZWQoX1ZJX0lOVDY0X1VJTlQ2NF9ERUZJTkVEKQorVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpTWFwQWRkcmVzc0V4ICAoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBtYXBTcGFjZSwgVmlCdXNBZGRyZXNzNjQgbWFwT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNTaXplIG1hcFNpemUsIFZpQm9vbGVhbiBhY2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUFkZHIgc3VnZ2VzdGVkLCBWaVBBZGRyIGFkZHJlc3MpOworI2VuZGlmCisKK3ZvaWQgICAgIF9WSV9GVU5DICB2aVBlZWs4ICAgICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlBZGRyIGFkZHJlc3MsIFZpUFVJbnQ4ICB2YWw4KTsKK3ZvaWQgICAgIF9WSV9GVU5DICB2aVBva2U4ICAgICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlBZGRyIGFkZHJlc3MsIFZpVUludDggICB2YWw4KTsKK3ZvaWQgICAgIF9WSV9GVU5DICB2aVBlZWsxNiAgICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlBZGRyIGFkZHJlc3MsIFZpUFVJbnQxNiB2YWwxNik7Cit2b2lkICAgICBfVklfRlVOQyAgdmlQb2tlMTYgICAgICAgIChWaVNlc3Npb24gdmksIFZpQWRkciBhZGRyZXNzLCBWaVVJbnQxNiAgdmFsMTYpOwordm9pZCAgICAgX1ZJX0ZVTkMgIHZpUGVlazMyICAgICAgICAoVmlTZXNzaW9uIHZpLCBWaUFkZHIgYWRkcmVzcywgVmlQVUludDMyIHZhbDMyKTsKK3ZvaWQgICAgIF9WSV9GVU5DICB2aVBva2UzMiAgICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlBZGRyIGFkZHJlc3MsIFZpVUludDMyICB2YWwzMik7CisKKyNpZiBkZWZpbmVkKF9WSV9JTlQ2NF9VSU5UNjRfREVGSU5FRCkKK3ZvaWQgICAgIF9WSV9GVU5DICB2aVBlZWs2NCAgICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlBZGRyIGFkZHJlc3MsIFZpUFVJbnQ2NCB2YWw2NCk7Cit2b2lkICAgICBfVklfRlVOQyAgdmlQb2tlNjQgICAgICAgIChWaVNlc3Npb24gdmksIFZpQWRkciBhZGRyZXNzLCBWaVVJbnQ2NCAgdmFsNjQpOworI2VuZGlmCisKKy8qLSBTaGFyZWQgTWVtb3J5IE9wZXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpTWVtQWxsb2MgICAgICAoVmlTZXNzaW9uIHZpLCBWaUJ1c1NpemUgc2l6ZSwgVmlQQnVzQWRkcmVzcyBvZmZzZXQpOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpTWVtRnJlZSAgICAgICAoVmlTZXNzaW9uIHZpLCBWaUJ1c0FkZHJlc3Mgb2Zmc2V0KTsKKworI2lmIGRlZmluZWQoX1ZJX0lOVDY0X1VJTlQ2NF9ERUZJTkVEKQorVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpTWVtQWxsb2NFeCAgICAoVmlTZXNzaW9uIHZpLCBWaUJ1c1NpemUgc2l6ZSwgVmlQQnVzQWRkcmVzczY0IG9mZnNldCk7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlNZW1GcmVlRXggICAgIChWaVNlc3Npb24gdmksIFZpQnVzQWRkcmVzczY0IG9mZnNldCk7CisjZW5kaWYKKworLyotIEludGVyZmFjZSBTcGVjaWZpYyBPcGVyYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitWaVN0YXR1cyBfVklfRlVOQyAgdmlHcGliQ29udHJvbFJFTihWaVNlc3Npb24gdmksIFZpVUludDE2IG1vZGUpOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpR3BpYkNvbnRyb2xBVE4oVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBtb2RlKTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aUdwaWJTZW5kSUZDICAgKFZpU2Vzc2lvbiB2aSk7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlHcGliQ29tbWFuZCAgIChWaVNlc3Npb24gdmksIFZpQnVmIGNtZCwgVmlVSW50MzIgY250LCBWaVBVSW50MzIgcmV0Q250KTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aUdwaWJQYXNzQ29udHJvbChWaVNlc3Npb24gdmksIFZpVUludDE2IHByaW1BZGRyLCBWaVVJbnQxNiBzZWNBZGRyKTsKKworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpVnhpQ29tbWFuZFF1ZXJ5KFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgbW9kZSwgVmlVSW50MzIgY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpUFVJbnQzMiByZXNwb25zZSk7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlBc3NlcnRVdGlsU2lnbmFsKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgbGluZSk7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlBc3NlcnRJbnRyU2lnbmFsKFZpU2Vzc2lvbiB2aSwgVmlJbnQxNiBtb2RlLCBWaVVJbnQzMiBzdGF0dXNJRCk7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlNYXBUcmlnZ2VyICAgIChWaVNlc3Npb24gdmksIFZpSW50MTYgdHJpZ1NyYywgVmlJbnQxNiB0cmlnRGVzdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaVVJbnQxNiBtb2RlKTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aVVubWFwVHJpZ2dlciAgKFZpU2Vzc2lvbiB2aSwgVmlJbnQxNiB0cmlnU3JjLCBWaUludDE2IHRyaWdEZXN0KTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aVVzYkNvbnRyb2xPdXQgKFZpU2Vzc2lvbiB2aSwgVmlJbnQxNiBibVJlcXVlc3RUeXBlLCBWaUludDE2IGJSZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlVSW50MTYgd1ZhbHVlLCBWaVVJbnQxNiB3SW5kZXgsIFZpVUludDE2IHdMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1ZiBidWYpOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpVXNiQ29udHJvbEluICAoVmlTZXNzaW9uIHZpLCBWaUludDE2IGJtUmVxdWVzdFR5cGUsIFZpSW50MTYgYlJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaVVJbnQxNiB3VmFsdWUsIFZpVUludDE2IHdJbmRleCwgVmlVSW50MTYgd0xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpUEJ1ZiBidWYsIFZpUFVJbnQxNiByZXRDbnQpOworCisvKi0gQXR0cmlidXRlcyAocGxhdGZvcm0gaW5kZXBlbmRlbnQgc2l6ZSkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgVklfQVRUUl9SU1JDX0NMQVNTICAgICAgICAgICgweEJGRkYwMDAxVUwpCisjZGVmaW5lIFZJX0FUVFJfUlNSQ19OQU1FICAgICAgICAgICAoMHhCRkZGMDAwMlVMKQorI2RlZmluZSBWSV9BVFRSX1JTUkNfSU1QTF9WRVJTSU9OICAgKDB4M0ZGRjAwMDNVTCkKKyNkZWZpbmUgVklfQVRUUl9SU1JDX0xPQ0tfU1RBVEUgICAgICgweDNGRkYwMDA0VUwpCisjZGVmaW5lIFZJX0FUVFJfTUFYX1FVRVVFX0xFTkdUSCAgICAoMHgzRkZGMDAwNVVMKQorI2RlZmluZSBWSV9BVFRSX1VTRVJfREFUQV8zMiAgICAgICAgKDB4M0ZGRjAwMDdVTCkKKyNkZWZpbmUgVklfQVRUUl9GRENfQ0hOTCAgICAgICAgICAgICgweDNGRkYwMDBEVUwpCisjZGVmaW5lIFZJX0FUVFJfRkRDX01PREUgICAgICAgICAgICAoMHgzRkZGMDAwRlVMKQorI2RlZmluZSBWSV9BVFRSX0ZEQ19HRU5fU0lHTkFMX0VOICAgKDB4M0ZGRjAwMTFVTCkKKyNkZWZpbmUgVklfQVRUUl9GRENfVVNFX1BBSVIgICAgICAgICgweDNGRkYwMDEzVUwpCisjZGVmaW5lIFZJX0FUVFJfU0VORF9FTkRfRU4gICAgICAgICAoMHgzRkZGMDAxNlVMKQorI2RlZmluZSBWSV9BVFRSX1RFUk1DSEFSICAgICAgICAgICAgKDB4M0ZGRjAwMThVTCkKKyNkZWZpbmUgVklfQVRUUl9UTU9fVkFMVUUgICAgICAgICAgICgweDNGRkYwMDFBVUwpCisjZGVmaW5lIFZJX0FUVFJfR1BJQl9SRUFERFJfRU4gICAgICAoMHgzRkZGMDAxQlVMKQorI2RlZmluZSBWSV9BVFRSX0lPX1BST1QgICAgICAgICAgICAgKDB4M0ZGRjAwMUNVTCkKKyNkZWZpbmUgVklfQVRUUl9ETUFfQUxMT1dfRU4gICAgICAgICgweDNGRkYwMDFFVUwpCisjZGVmaW5lIFZJX0FUVFJfQVNSTF9CQVVEICAgICAgICAgICAoMHgzRkZGMDAyMVVMKQorI2RlZmluZSBWSV9BVFRSX0FTUkxfREFUQV9CSVRTICAgICAgKDB4M0ZGRjAwMjJVTCkKKyNkZWZpbmUgVklfQVRUUl9BU1JMX1BBUklUWSAgICAgICAgICgweDNGRkYwMDIzVUwpCisjZGVmaW5lIFZJX0FUVFJfQVNSTF9TVE9QX0JJVFMgICAgICAoMHgzRkZGMDAyNFVMKQorI2RlZmluZSBWSV9BVFRSX0FTUkxfRkxPV19DTlRSTCAgICAgKDB4M0ZGRjAwMjVVTCkKKyNkZWZpbmUgVklfQVRUUl9SRF9CVUZfT1BFUl9NT0RFICAgICgweDNGRkYwMDJBVUwpCisjZGVmaW5lIFZJX0FUVFJfUkRfQlVGX1NJWkUgICAgICAgICAoMHgzRkZGMDAyQlVMKQorI2RlZmluZSBWSV9BVFRSX1dSX0JVRl9PUEVSX01PREUgICAgKDB4M0ZGRjAwMkRVTCkKKyNkZWZpbmUgVklfQVRUUl9XUl9CVUZfU0laRSAgICAgICAgICgweDNGRkYwMDJFVUwpCisjZGVmaW5lIFZJX0FUVFJfU1VQUFJFU1NfRU5EX0VOICAgICAoMHgzRkZGMDAzNlVMKQorI2RlZmluZSBWSV9BVFRSX1RFUk1DSEFSX0VOICAgICAgICAgKDB4M0ZGRjAwMzhVTCkKKyNkZWZpbmUgVklfQVRUUl9ERVNUX0FDQ0VTU19QUklWICAgICgweDNGRkYwMDM5VUwpCisjZGVmaW5lIFZJX0FUVFJfREVTVF9CWVRFX09SREVSICAgICAoMHgzRkZGMDAzQVVMKQorI2RlZmluZSBWSV9BVFRSX1NSQ19BQ0NFU1NfUFJJViAgICAgKDB4M0ZGRjAwM0NVTCkKKyNkZWZpbmUgVklfQVRUUl9TUkNfQllURV9PUkRFUiAgICAgICgweDNGRkYwMDNEVUwpCisjZGVmaW5lIFZJX0FUVFJfU1JDX0lOQ1JFTUVOVCAgICAgICAoMHgzRkZGMDA0MFVMKQorI2RlZmluZSBWSV9BVFRSX0RFU1RfSU5DUkVNRU5UICAgICAgKDB4M0ZGRjAwNDFVTCkKKyNkZWZpbmUgVklfQVRUUl9XSU5fQUNDRVNTX1BSSVYgICAgICgweDNGRkYwMDQ1VUwpCisjZGVmaW5lIFZJX0FUVFJfV0lOX0JZVEVfT1JERVIgICAgICAoMHgzRkZGMDA0N1VMKQorI2RlZmluZSBWSV9BVFRSX0dQSUJfQVROX1NUQVRFICAgICAgKDB4M0ZGRjAwNTdVTCkKKyNkZWZpbmUgVklfQVRUUl9HUElCX0FERFJfU1RBVEUgICAgICgweDNGRkYwMDVDVUwpCisjZGVmaW5lIFZJX0FUVFJfR1BJQl9DSUNfU1RBVEUgICAgICAoMHgzRkZGMDA1RVVMKQorI2RlZmluZSBWSV9BVFRSX0dQSUJfTkRBQ19TVEFURSAgICAgKDB4M0ZGRjAwNjJVTCkKKyNkZWZpbmUgVklfQVRUUl9HUElCX1NSUV9TVEFURSAgICAgICgweDNGRkYwMDY3VUwpCisjZGVmaW5lIFZJX0FUVFJfR1BJQl9TWVNfQ05UUkxfU1RBVEUgKDB4M0ZGRjAwNjhVTCkKKyNkZWZpbmUgVklfQVRUUl9HUElCX0hTNDg4X0NCTF9MRU4gICgweDNGRkYwMDY5VUwpCisjZGVmaW5lIFZJX0FUVFJfQ01EUl9MQSAgICAgICAgICAgICAoMHgzRkZGMDA2QlVMKQorI2RlZmluZSBWSV9BVFRSX1ZYSV9ERVZfQ0xBU1MgICAgICAgKDB4M0ZGRjAwNkNVTCkKKyNkZWZpbmUgVklfQVRUUl9NQUlORlJBTUVfTEEgICAgICAgICgweDNGRkYwMDcwVUwpCisjZGVmaW5lIFZJX0FUVFJfTUFORl9OQU1FICAgICAgICAgICAoMHhCRkZGMDA3MlVMKQorI2RlZmluZSBWSV9BVFRSX01PREVMX05BTUUgICAgICAgICAgKDB4QkZGRjAwNzdVTCkKKyNkZWZpbmUgVklfQVRUUl9WWElfVk1FX0lOVFJfU1RBVFVTICgweDNGRkYwMDhCVUwpCisjZGVmaW5lIFZJX0FUVFJfVlhJX1RSSUdfU1RBVFVTICAgICAoMHgzRkZGMDA4RFVMKQorI2RlZmluZSBWSV9BVFRSX1ZYSV9WTUVfU1lTRkFJTF9TVEFURSAoMHgzRkZGMDA5NFVMKQorI2RlZmluZSBWSV9BVFRSX1dJTl9CQVNFX0FERFJfMzIgICAgKDB4M0ZGRjAwOThVTCkKKyNkZWZpbmUgVklfQVRUUl9XSU5fU0laRV8zMiAgICAgICAgICgweDNGRkYwMDlBVUwpCisjZGVmaW5lIFZJX0FUVFJfQVNSTF9BVkFJTF9OVU0gICAgICAoMHgzRkZGMDBBQ1VMKQorI2RlZmluZSBWSV9BVFRSX01FTV9CQVNFXzMyICAgICAgICAgKDB4M0ZGRjAwQURVTCkKKyNkZWZpbmUgVklfQVRUUl9BU1JMX0NUU19TVEFURSAgICAgICgweDNGRkYwMEFFVUwpCisjZGVmaW5lIFZJX0FUVFJfQVNSTF9EQ0RfU1RBVEUgICAgICAoMHgzRkZGMDBBRlVMKQorI2RlZmluZSBWSV9BVFRSX0FTUkxfRFNSX1NUQVRFICAgICAgKDB4M0ZGRjAwQjFVTCkKKyNkZWZpbmUgVklfQVRUUl9BU1JMX0RUUl9TVEFURSAgICAgICgweDNGRkYwMEIyVUwpCisjZGVmaW5lIFZJX0FUVFJfQVNSTF9FTkRfSU4gICAgICAgICAoMHgzRkZGMDBCM1VMKQorI2RlZmluZSBWSV9BVFRSX0FTUkxfRU5EX09VVCAgICAgICAgKDB4M0ZGRjAwQjRVTCkKKyNkZWZpbmUgVklfQVRUUl9BU1JMX1JFUExBQ0VfQ0hBUiAgICgweDNGRkYwMEJFVUwpCisjZGVmaW5lIFZJX0FUVFJfQVNSTF9SSV9TVEFURSAgICAgICAoMHgzRkZGMDBCRlVMKQorI2RlZmluZSBWSV9BVFRSX0FTUkxfUlRTX1NUQVRFICAgICAgKDB4M0ZGRjAwQzBVTCkKKyNkZWZpbmUgVklfQVRUUl9BU1JMX1hPTl9DSEFSICAgICAgICgweDNGRkYwMEMxVUwpCisjZGVmaW5lIFZJX0FUVFJfQVNSTF9YT0ZGX0NIQVIgICAgICAoMHgzRkZGMDBDMlVMKQorI2RlZmluZSBWSV9BVFRSX1dJTl9BQ0NFU1MgICAgICAgICAgKDB4M0ZGRjAwQzNVTCkKKyNkZWZpbmUgVklfQVRUUl9STV9TRVNTSU9OICAgICAgICAgICgweDNGRkYwMEM0VUwpCisjZGVmaW5lIFZJX0FUVFJfVlhJX0xBICAgICAgICAgICAgICAoMHgzRkZGMDBENVVMKQorI2RlZmluZSBWSV9BVFRSX01BTkZfSUQgICAgICAgICAgICAgKDB4M0ZGRjAwRDlVTCkKKyNkZWZpbmUgVklfQVRUUl9NRU1fU0laRV8zMiAgICAgICAgICgweDNGRkYwMEREVUwpCisjZGVmaW5lIFZJX0FUVFJfTUVNX1NQQUNFICAgICAgICAgICAoMHgzRkZGMDBERVVMKQorI2RlZmluZSBWSV9BVFRSX01PREVMX0NPREUgICAgICAgICAgKDB4M0ZGRjAwREZVTCkKKyNkZWZpbmUgVklfQVRUUl9TTE9UICAgICAgICAgICAgICAgICgweDNGRkYwMEU4VUwpCisjZGVmaW5lIFZJX0FUVFJfSU5URl9JTlNUX05BTUUgICAgICAoMHhCRkZGMDBFOVVMKQorI2RlZmluZSBWSV9BVFRSX0lNTUVESUFURV9TRVJWICAgICAgKDB4M0ZGRjAxMDBVTCkKKyNkZWZpbmUgVklfQVRUUl9JTlRGX1BBUkVOVF9OVU0gICAgICgweDNGRkYwMTAxVUwpCisjZGVmaW5lIFZJX0FUVFJfUlNSQ19TUEVDX1ZFUlNJT04gICAoMHgzRkZGMDE3MFVMKQorI2RlZmluZSBWSV9BVFRSX0lOVEZfVFlQRSAgICAgICAgICAgKDB4M0ZGRjAxNzFVTCkKKyNkZWZpbmUgVklfQVRUUl9HUElCX1BSSU1BUllfQUREUiAgICgweDNGRkYwMTcyVUwpCisjZGVmaW5lIFZJX0FUVFJfR1BJQl9TRUNPTkRBUllfQUREUiAoMHgzRkZGMDE3M1VMKQorI2RlZmluZSBWSV9BVFRSX1JTUkNfTUFORl9OQU1FICAgICAgKDB4QkZGRjAxNzRVTCkKKyNkZWZpbmUgVklfQVRUUl9SU1JDX01BTkZfSUQgICAgICAgICgweDNGRkYwMTc1VUwpCisjZGVmaW5lIFZJX0FUVFJfSU5URl9OVU0gICAgICAgICAgICAoMHgzRkZGMDE3NlVMKQorI2RlZmluZSBWSV9BVFRSX1RSSUdfSUQgICAgICAgICAgICAgKDB4M0ZGRjAxNzdVTCkKKyNkZWZpbmUgVklfQVRUUl9HUElCX1JFTl9TVEFURSAgICAgICgweDNGRkYwMTgxVUwpCisjZGVmaW5lIFZJX0FUVFJfR1BJQl9VTkFERFJfRU4gICAgICAoMHgzRkZGMDE4NFVMKQorI2RlZmluZSBWSV9BVFRSX0RFVl9TVEFUVVNfQllURSAgICAgKDB4M0ZGRjAxODlVTCkKKyNkZWZpbmUgVklfQVRUUl9GSUxFX0FQUEVORF9FTiAgICAgICgweDNGRkYwMTkyVUwpCisjZGVmaW5lIFZJX0FUVFJfVlhJX1RSSUdfU1VQUE9SVCAgICAoMHgzRkZGMDE5NFVMKQorI2RlZmluZSBWSV9BVFRSX1RDUElQX0FERFIgICAgICAgICAgKDB4QkZGRjAxOTVVTCkKKyNkZWZpbmUgVklfQVRUUl9UQ1BJUF9IT1NUTkFNRSAgICAgICgweEJGRkYwMTk2VUwpCisjZGVmaW5lIFZJX0FUVFJfVENQSVBfUE9SVCAgICAgICAgICAoMHgzRkZGMDE5N1VMKQorI2RlZmluZSBWSV9BVFRSX1RDUElQX0RFVklDRV9OQU1FICAgKDB4QkZGRjAxOTlVTCkKKyNkZWZpbmUgVklfQVRUUl9UQ1BJUF9OT0RFTEFZICAgICAgICgweDNGRkYwMTlBVUwpCisjZGVmaW5lIFZJX0FUVFJfVENQSVBfS0VFUEFMSVZFICAgICAoMHgzRkZGMDE5QlVMKQorI2RlZmluZSBWSV9BVFRSXzQ4ODJfQ09NUExJQU5UICAgICAgKDB4M0ZGRjAxOUZVTCkKKyNkZWZpbmUgVklfQVRUUl9VU0JfU0VSSUFMX05VTSAgICAgICgweEJGRkYwMUEwVUwpCisjZGVmaW5lIFZJX0FUVFJfVVNCX0lOVEZDX05VTSAgICAgICAoMHgzRkZGMDFBMVVMKQorI2RlZmluZSBWSV9BVFRSX1VTQl9QUk9UT0NPTCAgICAgICAgKDB4M0ZGRjAxQTdVTCkKKyNkZWZpbmUgVklfQVRUUl9VU0JfTUFYX0lOVFJfU0laRSAgICgweDNGRkYwMUFGVUwpCisjZGVmaW5lIFZJX0FUVFJfUFhJX0RFVl9OVU0gICAgICAgICAoMHgzRkZGMDIwMVVMKQorI2RlZmluZSBWSV9BVFRSX1BYSV9GVU5DX05VTSAgICAgICAgKDB4M0ZGRjAyMDJVTCkKKyNkZWZpbmUgVklfQVRUUl9QWElfQlVTX05VTSAgICAgICAgICgweDNGRkYwMjA1VUwpCisjZGVmaW5lIFZJX0FUVFJfUFhJX0NIQVNTSVMgICAgICAgICAoMHgzRkZGMDIwNlVMKQorI2RlZmluZSBWSV9BVFRSX1BYSV9TTE9UUEFUSCAgICAgICAgKDB4QkZGRjAyMDdVTCkKKyNkZWZpbmUgVklfQVRUUl9QWElfU0xPVF9MQlVTX0xFRlQgICgweDNGRkYwMjA4VUwpCisjZGVmaW5lIFZJX0FUVFJfUFhJX1NMT1RfTEJVU19SSUdIVCAoMHgzRkZGMDIwOVVMKQorI2RlZmluZSBWSV9BVFRSX1BYSV9UUklHX0JVUyAgICAgICAgKDB4M0ZGRjAyMEFVTCkKKyNkZWZpbmUgVklfQVRUUl9QWElfU1RBUl9UUklHX0JVUyAgICgweDNGRkYwMjBCVUwpCisjZGVmaW5lIFZJX0FUVFJfUFhJX1NUQVJfVFJJR19MSU5FICAoMHgzRkZGMDIwQ1VMKQorI2RlZmluZSBWSV9BVFRSX1BYSV9NRU1fVFlQRV9CQVIwICAgKDB4M0ZGRjAyMTFVTCkKKyNkZWZpbmUgVklfQVRUUl9QWElfTUVNX1RZUEVfQkFSMSAgICgweDNGRkYwMjEyVUwpCisjZGVmaW5lIFZJX0FUVFJfUFhJX01FTV9UWVBFX0JBUjIgICAoMHgzRkZGMDIxM1VMKQorI2RlZmluZSBWSV9BVFRSX1BYSV9NRU1fVFlQRV9CQVIzICAgKDB4M0ZGRjAyMTRVTCkKKyNkZWZpbmUgVklfQVRUUl9QWElfTUVNX1RZUEVfQkFSNCAgICgweDNGRkYwMjE1VUwpCisjZGVmaW5lIFZJX0FUVFJfUFhJX01FTV9UWVBFX0JBUjUgICAoMHgzRkZGMDIxNlVMKQorI2RlZmluZSBWSV9BVFRSX1BYSV9NRU1fQkFTRV9CQVIwICAgKDB4M0ZGRjAyMjFVTCkKKyNkZWZpbmUgVklfQVRUUl9QWElfTUVNX0JBU0VfQkFSMSAgICgweDNGRkYwMjIyVUwpCisjZGVmaW5lIFZJX0FUVFJfUFhJX01FTV9CQVNFX0JBUjIgICAoMHgzRkZGMDIyM1VMKQorI2RlZmluZSBWSV9BVFRSX1BYSV9NRU1fQkFTRV9CQVIzICAgKDB4M0ZGRjAyMjRVTCkKKyNkZWZpbmUgVklfQVRUUl9QWElfTUVNX0JBU0VfQkFSNCAgICgweDNGRkYwMjI1VUwpCisjZGVmaW5lIFZJX0FUVFJfUFhJX01FTV9CQVNFX0JBUjUgICAoMHgzRkZGMDIyNlVMKQorI2RlZmluZSBWSV9BVFRSX1BYSV9NRU1fU0laRV9CQVIwICAgKDB4M0ZGRjAyMzFVTCkKKyNkZWZpbmUgVklfQVRUUl9QWElfTUVNX1NJWkVfQkFSMSAgICgweDNGRkYwMjMyVUwpCisjZGVmaW5lIFZJX0FUVFJfUFhJX01FTV9TSVpFX0JBUjIgICAoMHgzRkZGMDIzM1VMKQorI2RlZmluZSBWSV9BVFRSX1BYSV9NRU1fU0laRV9CQVIzICAgKDB4M0ZGRjAyMzRVTCkKKyNkZWZpbmUgVklfQVRUUl9QWElfTUVNX1NJWkVfQkFSNCAgICgweDNGRkYwMjM1VUwpCisjZGVmaW5lIFZJX0FUVFJfUFhJX01FTV9TSVpFX0JBUjUgICAoMHgzRkZGMDIzNlVMKQorI2RlZmluZSBWSV9BVFRSX1BYSV9JU19FWFBSRVNTICAgICAgKDB4M0ZGRjAyNDBVTCkKKyNkZWZpbmUgVklfQVRUUl9QWElfU0xPVF9MV0lEVEggICAgICgweDNGRkYwMjQxVUwpCisjZGVmaW5lIFZJX0FUVFJfUFhJX01BWF9MV0lEVEggICAgICAoMHgzRkZGMDI0MlVMKQorI2RlZmluZSBWSV9BVFRSX1BYSV9BQ1RVQUxfTFdJRFRIICAgKDB4M0ZGRjAyNDNVTCkKKyNkZWZpbmUgVklfQVRUUl9QWElfRFNUQVJfQlVTICAgICAgICgweDNGRkYwMjQ0VUwpCisjZGVmaW5lIFZJX0FUVFJfUFhJX0RTVEFSX1NFVCAgICAgICAoMHgzRkZGMDI0NVVMKQorCisjZGVmaW5lIFZJX0FUVFJfSk9CX0lEICAgICAgICAgICAgICAoMHgzRkZGNDAwNlVMKQorI2RlZmluZSBWSV9BVFRSX0VWRU5UX1RZUEUgICAgICAgICAgKDB4M0ZGRjQwMTBVTCkKKyNkZWZpbmUgVklfQVRUUl9TSUdQX1NUQVRVU19JRCAgICAgICgweDNGRkY0MDExVUwpCisjZGVmaW5lIFZJX0FUVFJfUkVDVl9UUklHX0lEICAgICAgICAoMHgzRkZGNDAxMlVMKQorI2RlZmluZSBWSV9BVFRSX0lOVFJfU1RBVFVTX0lEICAgICAgKDB4M0ZGRjQwMjNVTCkKKyNkZWZpbmUgVklfQVRUUl9TVEFUVVMgICAgICAgICAgICAgICgweDNGRkY0MDI1VUwpCisjZGVmaW5lIFZJX0FUVFJfUkVUX0NPVU5UXzMyICAgICAgICAoMHgzRkZGNDAyNlVMKQorI2RlZmluZSBWSV9BVFRSX0JVRkZFUiAgICAgICAgICAgICAgKDB4M0ZGRjQwMjdVTCkKKyNkZWZpbmUgVklfQVRUUl9SRUNWX0lOVFJfTEVWRUwgICAgICgweDNGRkY0MDQxVUwpCisjZGVmaW5lIFZJX0FUVFJfT1BFUl9OQU1FICAgICAgICAgICAoMHhCRkZGNDA0MlVMKQorI2RlZmluZSBWSV9BVFRSX0dQSUJfUkVDVl9DSUNfU1RBVEUgKDB4M0ZGRjQxOTNVTCkKKyNkZWZpbmUgVklfQVRUUl9SRUNWX1RDUElQX0FERFIgICAgICgweEJGRkY0MTk4VUwpCisjZGVmaW5lIFZJX0FUVFJfVVNCX1JFQ1ZfSU5UUl9TSVpFICAoMHgzRkZGNDFCMFVMKQorI2RlZmluZSBWSV9BVFRSX1VTQl9SRUNWX0lOVFJfREFUQSAgKDB4QkZGRjQxQjFVTCkKKworLyotIEF0dHJpYnV0ZXMgKHBsYXRmb3JtIGRlcGVuZGVudCBzaXplKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChfVklfSU5UNjRfVUlOVDY0X0RFRklORUQpICYmIGRlZmluZWQoX1ZJU0FfRU5WX0lTXzY0X0JJVCkKKyNkZWZpbmUgVklfQVRUUl9VU0VSX0RBVEFfNjQgICAgICAgICgweDNGRkYwMDBBVUwpCisjZGVmaW5lIFZJX0FUVFJfUkVUX0NPVU5UXzY0ICAgICAgICAoMHgzRkZGNDAyOFVMKQorI2RlZmluZSBWSV9BVFRSX1VTRVJfREFUQSAgICAgICAgICAgKFZJX0FUVFJfVVNFUl9EQVRBXzY0KQorI2RlZmluZSBWSV9BVFRSX1JFVF9DT1VOVCAgICAgICAgICAgKFZJX0FUVFJfUkVUX0NPVU5UXzY0KQorI2Vsc2UKKyNkZWZpbmUgVklfQVRUUl9VU0VSX0RBVEEgICAgICAgICAgIChWSV9BVFRSX1VTRVJfREFUQV8zMikKKyNkZWZpbmUgVklfQVRUUl9SRVRfQ09VTlQgICAgICAgICAgIChWSV9BVFRSX1JFVF9DT1VOVF8zMikKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfVklfSU5UNjRfVUlOVDY0X0RFRklORUQpCisjZGVmaW5lIFZJX0FUVFJfV0lOX0JBU0VfQUREUl82NCAgICAoMHgzRkZGMDA5QlVMKQorI2RlZmluZSBWSV9BVFRSX1dJTl9TSVpFXzY0ICAgICAgICAgKDB4M0ZGRjAwOUNVTCkKKyNkZWZpbmUgVklfQVRUUl9NRU1fQkFTRV82NCAgICAgICAgICgweDNGRkYwMEQwVUwpCisjZGVmaW5lIFZJX0FUVFJfTUVNX1NJWkVfNjQgICAgICAgICAoMHgzRkZGMDBEMVVMKQorI2VuZGlmCisjaWYgZGVmaW5lZChfVklfSU5UNjRfVUlOVDY0X0RFRklORUQpICYmIGRlZmluZWQoX1ZJU0FfRU5WX0lTXzY0X0JJVCkKKyNkZWZpbmUgVklfQVRUUl9XSU5fQkFTRV9BRERSICAgICAgIChWSV9BVFRSX1dJTl9CQVNFX0FERFJfNjQpCisjZGVmaW5lIFZJX0FUVFJfV0lOX1NJWkUgICAgICAgICAgICAoVklfQVRUUl9XSU5fU0laRV82NCkKKyNkZWZpbmUgVklfQVRUUl9NRU1fQkFTRSAgICAgICAgICAgIChWSV9BVFRSX01FTV9CQVNFXzY0KQorI2RlZmluZSBWSV9BVFRSX01FTV9TSVpFICAgICAgICAgICAgKFZJX0FUVFJfTUVNX1NJWkVfNjQpCisjZWxzZQorI2RlZmluZSBWSV9BVFRSX1dJTl9CQVNFX0FERFIgICAgICAgKFZJX0FUVFJfV0lOX0JBU0VfQUREUl8zMikKKyNkZWZpbmUgVklfQVRUUl9XSU5fU0laRSAgICAgICAgICAgIChWSV9BVFRSX1dJTl9TSVpFXzMyKQorI2RlZmluZSBWSV9BVFRSX01FTV9CQVNFICAgICAgICAgICAgKFZJX0FUVFJfTUVNX0JBU0VfMzIpCisjZGVmaW5lIFZJX0FUVFJfTUVNX1NJWkUgICAgICAgICAgICAoVklfQVRUUl9NRU1fU0laRV8zMikKKyNlbmRpZgorCisvKi0gRXZlbnQgVHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgVklfRVZFTlRfSU9fQ09NUExFVElPTiAgICAgICgweDNGRkYyMDA5VUwpCisjZGVmaW5lIFZJX0VWRU5UX1RSSUcgICAgICAgICAgICAgICAoMHhCRkZGMjAwQVVMKQorI2RlZmluZSBWSV9FVkVOVF9TRVJWSUNFX1JFUSAgICAgICAgKDB4M0ZGRjIwMEJVTCkKKyNkZWZpbmUgVklfRVZFTlRfQ0xFQVIgICAgICAgICAgICAgICgweDNGRkYyMDBEVUwpCisjZGVmaW5lIFZJX0VWRU5UX0VYQ0VQVElPTiAgICAgICAgICAoMHhCRkZGMjAwRVVMKQorI2RlZmluZSBWSV9FVkVOVF9HUElCX0NJQyAgICAgICAgICAgKDB4M0ZGRjIwMTJVTCkKKyNkZWZpbmUgVklfRVZFTlRfR1BJQl9UQUxLICAgICAgICAgICgweDNGRkYyMDEzVUwpCisjZGVmaW5lIFZJX0VWRU5UX0dQSUJfTElTVEVOICAgICAgICAoMHgzRkZGMjAxNFVMKQorI2RlZmluZSBWSV9FVkVOVF9WWElfVk1FX1NZU0ZBSUwgICAgKDB4M0ZGRjIwMURVTCkKKyNkZWZpbmUgVklfRVZFTlRfVlhJX1ZNRV9TWVNSRVNFVCAgICgweDNGRkYyMDFFVUwpCisjZGVmaW5lIFZJX0VWRU5UX1ZYSV9TSUdQICAgICAgICAgICAoMHgzRkZGMjAyMFVMKQorI2RlZmluZSBWSV9FVkVOVF9WWElfVk1FX0lOVFIgICAgICAgKDB4QkZGRjIwMjFVTCkKKyNkZWZpbmUgVklfRVZFTlRfUFhJX0lOVFIgICAgICAgICAgICgweDNGRkYyMDIyVUwpCisjZGVmaW5lIFZJX0VWRU5UX1RDUElQX0NPTk5FQ1QgICAgICAoMHgzRkZGMjAzNlVMKQorI2RlZmluZSBWSV9FVkVOVF9VU0JfSU5UUiAgICAgICAgICAgKDB4M0ZGRjIwMzdVTCkKKworI2RlZmluZSBWSV9BTExfRU5BQkxFRF9FVkVOVFMgICAgICAgKDB4M0ZGRjdGRkZVTCkKKworLyotIENvbXBsZXRpb24gYW5kIEVycm9yIENvZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIFZJX1NVQ0NFU1NfRVZFTlRfRU4gICAgICAgICAgICAgICAgICAgKDB4M0ZGRjAwMDJMKSAvKiAzRkZGMDAwMiwgIDEwNzM2NzYyOTAgKi8KKyNkZWZpbmUgVklfU1VDQ0VTU19FVkVOVF9ESVMgICAgICAgICAgICAgICAgICAoMHgzRkZGMDAwM0wpIC8qIDNGRkYwMDAzLCAgMTA3MzY3NjI5MSAqLworI2RlZmluZSBWSV9TVUNDRVNTX1FVRVVFX0VNUFRZICAgICAgICAgICAgICAgICgweDNGRkYwMDA0TCkgLyogM0ZGRjAwMDQsICAxMDczNjc2MjkyICovCisjZGVmaW5lIFZJX1NVQ0NFU1NfVEVSTV9DSEFSICAgICAgICAgICAgICAgICAgKDB4M0ZGRjAwMDVMKSAvKiAzRkZGMDAwNSwgIDEwNzM2NzYyOTMgKi8KKyNkZWZpbmUgVklfU1VDQ0VTU19NQVhfQ05UICAgICAgICAgICAgICAgICAgICAoMHgzRkZGMDAwNkwpIC8qIDNGRkYwMDA2LCAgMTA3MzY3NjI5NCAqLworI2RlZmluZSBWSV9TVUNDRVNTX0RFVl9OUFJFU0VOVCAgICAgICAgICAgICAgICgweDNGRkYwMDdETCkgLyogM0ZGRjAwN0QsICAxMDczNjc2NDEzICovCisjZGVmaW5lIFZJX1NVQ0NFU1NfVFJJR19NQVBQRUQgICAgICAgICAgICAgICAgKDB4M0ZGRjAwN0VMKSAvKiAzRkZGMDA3RSwgIDEwNzM2NzY0MTQgKi8KKyNkZWZpbmUgVklfU1VDQ0VTU19RVUVVRV9ORU1QVFkgICAgICAgICAgICAgICAoMHgzRkZGMDA4MEwpIC8qIDNGRkYwMDgwLCAgMTA3MzY3NjQxNiAqLworI2RlZmluZSBWSV9TVUNDRVNTX05DSEFJTiAgICAgICAgICAgICAgICAgICAgICgweDNGRkYwMDk4TCkgLyogM0ZGRjAwOTgsICAxMDczNjc2NDQwICovCisjZGVmaW5lIFZJX1NVQ0NFU1NfTkVTVEVEX1NIQVJFRCAgICAgICAgICAgICAgKDB4M0ZGRjAwOTlMKSAvKiAzRkZGMDA5OSwgIDEwNzM2NzY0NDEgKi8KKyNkZWZpbmUgVklfU1VDQ0VTU19ORVNURURfRVhDTFVTSVZFICAgICAgICAgICAoMHgzRkZGMDA5QUwpIC8qIDNGRkYwMDlBLCAgMTA3MzY3NjQ0MiAqLworI2RlZmluZSBWSV9TVUNDRVNTX1NZTkMgICAgICAgICAgICAgICAgICAgICAgICgweDNGRkYwMDlCTCkgLyogM0ZGRjAwOUIsICAxMDczNjc2NDQzICovCisKKyNkZWZpbmUgVklfV0FSTl9RVUVVRV9PVkVSRkxPVyAgICAgICAgICAgICAgICAoMHgzRkZGMDAwQ0wpIC8qIDNGRkYwMDBDLCAgMTA3MzY3NjMwMCAqLworI2RlZmluZSBWSV9XQVJOX0NPTkZJR19OTE9BREVEICAgICAgICAgICAgICAgICgweDNGRkYwMDc3TCkgLyogM0ZGRjAwNzcsICAxMDczNjc2NDA3ICovCisjZGVmaW5lIFZJX1dBUk5fTlVMTF9PQkpFQ1QgICAgICAgICAgICAgICAgICAgKDB4M0ZGRjAwODJMKSAvKiAzRkZGMDA4MiwgIDEwNzM2NzY0MTggKi8KKyNkZWZpbmUgVklfV0FSTl9OU1VQX0FUVFJfU1RBVEUgICAgICAgICAgICAgICAoMHgzRkZGMDA4NEwpIC8qIDNGRkYwMDg0LCAgMTA3MzY3NjQyMCAqLworI2RlZmluZSBWSV9XQVJOX1VOS05PV05fU1RBVFVTICAgICAgICAgICAgICAgICgweDNGRkYwMDg1TCkgLyogM0ZGRjAwODUsICAxMDczNjc2NDIxICovCisjZGVmaW5lIFZJX1dBUk5fTlNVUF9CVUYgICAgICAgICAgICAgICAgICAgICAgKDB4M0ZGRjAwODhMKSAvKiAzRkZGMDA4OCwgIDEwNzM2NzY0MjQgKi8KKyNkZWZpbmUgVklfV0FSTl9FWFRfRlVOQ19OSU1QTCAgICAgICAgICAgICAgICAoMHgzRkZGMDBBOUwpIC8qIDNGRkYwMEE5LCAgMTA3MzY3NjQ1NyAqLworCisjZGVmaW5lIFZJX0VSUk9SX1NZU1RFTV9FUlJPUiAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwMDBMKSAvKiBCRkZGMDAwMCwgLTEwNzM4MDczNjAgKi8KKyNkZWZpbmUgVklfRVJST1JfSU5WX09CSkVDVCAgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDAwRUwpIC8qIEJGRkYwMDBFLCAtMTA3MzgwNzM0NiAqLworI2RlZmluZSBWSV9FUlJPUl9SU1JDX0xPQ0tFRCAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDBGTCkgLyogQkZGRjAwMEYsIC0xMDczODA3MzQ1ICovCisjZGVmaW5lIFZJX0VSUk9SX0lOVl9FWFBSICAgICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwMTBMKSAvKiBCRkZGMDAxMCwgLTEwNzM4MDczNDQgKi8KKyNkZWZpbmUgVklfRVJST1JfUlNSQ19ORk9VTkQgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDAxMUwpIC8qIEJGRkYwMDExLCAtMTA3MzgwNzM0MyAqLworI2RlZmluZSBWSV9FUlJPUl9JTlZfUlNSQ19OQU1FICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDEyTCkgLyogQkZGRjAwMTIsIC0xMDczODA3MzQyICovCisjZGVmaW5lIFZJX0VSUk9SX0lOVl9BQ0NfTU9ERSAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwMTNMKSAvKiBCRkZGMDAxMywgLTEwNzM4MDczNDEgKi8KKyNkZWZpbmUgVklfRVJST1JfVE1PICAgICAgICAgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDAxNUwpIC8qIEJGRkYwMDE1LCAtMTA3MzgwNzMzOSAqLworI2RlZmluZSBWSV9FUlJPUl9DTE9TSU5HX0ZBSUxFRCAgICAgKF9WSV9FUlJPUisweDNGRkYwMDE2TCkgLyogQkZGRjAwMTYsIC0xMDczODA3MzM4ICovCisjZGVmaW5lIFZJX0VSUk9SX0lOVl9ERUdSRUUgICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwMUJMKSAvKiBCRkZGMDAxQiwgLTEwNzM4MDczMzMgKi8KKyNkZWZpbmUgVklfRVJST1JfSU5WX0pPQl9JRCAgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDAxQ0wpIC8qIEJGRkYwMDFDLCAtMTA3MzgwNzMzMiAqLworI2RlZmluZSBWSV9FUlJPUl9OU1VQX0FUVFIgICAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDFETCkgLyogQkZGRjAwMUQsIC0xMDczODA3MzMxICovCisjZGVmaW5lIFZJX0VSUk9SX05TVVBfQVRUUl9TVEFURSAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwMUVMKSAvKiBCRkZGMDAxRSwgLTEwNzM4MDczMzAgKi8KKyNkZWZpbmUgVklfRVJST1JfQVRUUl9SRUFET05MWSAgICAgIChfVklfRVJST1IrMHgzRkZGMDAxRkwpIC8qIEJGRkYwMDFGLCAtMTA3MzgwNzMyOSAqLworI2RlZmluZSBWSV9FUlJPUl9JTlZfTE9DS19UWVBFICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDIwTCkgLyogQkZGRjAwMjAsIC0xMDczODA3MzI4ICovCisjZGVmaW5lIFZJX0VSUk9SX0lOVl9BQ0NFU1NfS0VZICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwMjFMKSAvKiBCRkZGMDAyMSwgLTEwNzM4MDczMjcgKi8KKyNkZWZpbmUgVklfRVJST1JfSU5WX0VWRU5UICAgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDAyNkwpIC8qIEJGRkYwMDI2LCAtMTA3MzgwNzMyMiAqLworI2RlZmluZSBWSV9FUlJPUl9JTlZfTUVDSCAgICAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDI3TCkgLyogQkZGRjAwMjcsIC0xMDczODA3MzIxICovCisjZGVmaW5lIFZJX0VSUk9SX0hORExSX05JTlNUQUxMRUQgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwMjhMKSAvKiBCRkZGMDAyOCwgLTEwNzM4MDczMjAgKi8KKyNkZWZpbmUgVklfRVJST1JfSU5WX0hORExSX1JFRiAgICAgIChfVklfRVJST1IrMHgzRkZGMDAyOUwpIC8qIEJGRkYwMDI5LCAtMTA3MzgwNzMxOSAqLworI2RlZmluZSBWSV9FUlJPUl9JTlZfQ09OVEVYVCAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDJBTCkgLyogQkZGRjAwMkEsIC0xMDczODA3MzE4ICovCisjZGVmaW5lIFZJX0VSUk9SX1FVRVVFX09WRVJGTE9XICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwMkRMKSAvKiBCRkZGMDAyRCwgLTEwNzM4MDczMTUgKi8KKyNkZWZpbmUgVklfRVJST1JfTkVOQUJMRUQgICAgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDAyRkwpIC8qIEJGRkYwMDJGLCAtMTA3MzgwNzMxMyAqLworI2RlZmluZSBWSV9FUlJPUl9BQk9SVCAgICAgICAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDMwTCkgLyogQkZGRjAwMzAsIC0xMDczODA3MzEyICovCisjZGVmaW5lIFZJX0VSUk9SX1JBV19XUl9QUk9UX1ZJT0wgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwMzRMKSAvKiBCRkZGMDAzNCwgLTEwNzM4MDczMDggKi8KKyNkZWZpbmUgVklfRVJST1JfUkFXX1JEX1BST1RfVklPTCAgIChfVklfRVJST1IrMHgzRkZGMDAzNUwpIC8qIEJGRkYwMDM1LCAtMTA3MzgwNzMwNyAqLworI2RlZmluZSBWSV9FUlJPUl9PVVRQX1BST1RfVklPTCAgICAgKF9WSV9FUlJPUisweDNGRkYwMDM2TCkgLyogQkZGRjAwMzYsIC0xMDczODA3MzA2ICovCisjZGVmaW5lIFZJX0VSUk9SX0lOUF9QUk9UX1ZJT0wgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwMzdMKSAvKiBCRkZGMDAzNywgLTEwNzM4MDczMDUgKi8KKyNkZWZpbmUgVklfRVJST1JfQkVSUiAgICAgICAgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDAzOEwpIC8qIEJGRkYwMDM4LCAtMTA3MzgwNzMwNCAqLworI2RlZmluZSBWSV9FUlJPUl9JTl9QUk9HUkVTUyAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDM5TCkgLyogQkZGRjAwMzksIC0xMDczODA3MzAzICovCisjZGVmaW5lIFZJX0VSUk9SX0lOVl9TRVRVUCAgICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwM0FMKSAvKiBCRkZGMDAzQSwgLTEwNzM4MDczMDIgKi8KKyNkZWZpbmUgVklfRVJST1JfUVVFVUVfRVJST1IgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDAzQkwpIC8qIEJGRkYwMDNCLCAtMTA3MzgwNzMwMSAqLworI2RlZmluZSBWSV9FUlJPUl9BTExPQyAgICAgICAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDNDTCkgLyogQkZGRjAwM0MsIC0xMDczODA3MzAwICovCisjZGVmaW5lIFZJX0VSUk9SX0lOVl9NQVNLICAgICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwM0RMKSAvKiBCRkZGMDAzRCwgLTEwNzM4MDcyOTkgKi8KKyNkZWZpbmUgVklfRVJST1JfSU8gICAgICAgICAgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDAzRUwpIC8qIEJGRkYwMDNFLCAtMTA3MzgwNzI5OCAqLworI2RlZmluZSBWSV9FUlJPUl9JTlZfRk1UICAgICAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDNGTCkgLyogQkZGRjAwM0YsIC0xMDczODA3Mjk3ICovCisjZGVmaW5lIFZJX0VSUk9SX05TVVBfRk1UICAgICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwNDFMKSAvKiBCRkZGMDA0MSwgLTEwNzM4MDcyOTUgKi8KKyNkZWZpbmUgVklfRVJST1JfTElORV9JTl9VU0UgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDA0MkwpIC8qIEJGRkYwMDQyLCAtMTA3MzgwNzI5NCAqLworI2RlZmluZSBWSV9FUlJPUl9OU1VQX01PREUgICAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDQ2TCkgLyogQkZGRjAwNDYsIC0xMDczODA3MjkwICovCisjZGVmaW5lIFZJX0VSUk9SX1NSUV9OT0NDVVJSRUQgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwNEFMKSAvKiBCRkZGMDA0QSwgLTEwNzM4MDcyODYgKi8KKyNkZWZpbmUgVklfRVJST1JfSU5WX1NQQUNFICAgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDA0RUwpIC8qIEJGRkYwMDRFLCAtMTA3MzgwNzI4MiAqLworI2RlZmluZSBWSV9FUlJPUl9JTlZfT0ZGU0VUICAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDUxTCkgLyogQkZGRjAwNTEsIC0xMDczODA3Mjc5ICovCisjZGVmaW5lIFZJX0VSUk9SX0lOVl9XSURUSCAgICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwNTJMKSAvKiBCRkZGMDA1MiwgLTEwNzM4MDcyNzggKi8KKyNkZWZpbmUgVklfRVJST1JfTlNVUF9PRkZTRVQgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDA1NEwpIC8qIEJGRkYwMDU0LCAtMTA3MzgwNzI3NiAqLworI2RlZmluZSBWSV9FUlJPUl9OU1VQX1ZBUl9XSURUSCAgICAgKF9WSV9FUlJPUisweDNGRkYwMDU1TCkgLyogQkZGRjAwNTUsIC0xMDczODA3Mjc1ICovCisjZGVmaW5lIFZJX0VSUk9SX1dJTkRPV19OTUFQUEVEICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwNTdMKSAvKiBCRkZGMDA1NywgLTEwNzM4MDcyNzMgKi8KKyNkZWZpbmUgVklfRVJST1JfUkVTUF9QRU5ESU5HICAgICAgIChfVklfRVJST1IrMHgzRkZGMDA1OUwpIC8qIEJGRkYwMDU5LCAtMTA3MzgwNzI3MSAqLworI2RlZmluZSBWSV9FUlJPUl9OTElTVEVORVJTICAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDVGTCkgLyogQkZGRjAwNUYsIC0xMDczODA3MjY1ICovCisjZGVmaW5lIFZJX0VSUk9SX05DSUMgICAgICAgICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwNjBMKSAvKiBCRkZGMDA2MCwgLTEwNzM4MDcyNjQgKi8KKyNkZWZpbmUgVklfRVJST1JfTlNZU19DTlRMUiAgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDA2MUwpIC8qIEJGRkYwMDYxLCAtMTA3MzgwNzI2MyAqLworI2RlZmluZSBWSV9FUlJPUl9OU1VQX09QRVIgICAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDY3TCkgLyogQkZGRjAwNjcsIC0xMDczODA3MjU3ICovCisjZGVmaW5lIFZJX0VSUk9SX0lOVFJfUEVORElORyAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwNjhMKSAvKiBCRkZGMDA2OCwgLTEwNzM4MDcyNTYgKi8KKyNkZWZpbmUgVklfRVJST1JfQVNSTF9QQVJJVFkgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDA2QUwpIC8qIEJGRkYwMDZBLCAtMTA3MzgwNzI1NCAqLworI2RlZmluZSBWSV9FUlJPUl9BU1JMX0ZSQU1JTkcgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDZCTCkgLyogQkZGRjAwNkIsIC0xMDczODA3MjUzICovCisjZGVmaW5lIFZJX0VSUk9SX0FTUkxfT1ZFUlJVTiAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwNkNMKSAvKiBCRkZGMDA2QywgLTEwNzM4MDcyNTIgKi8KKyNkZWZpbmUgVklfRVJST1JfVFJJR19OTUFQUEVEICAgICAgIChfVklfRVJST1IrMHgzRkZGMDA2RUwpIC8qIEJGRkYwMDZFLCAtMTA3MzgwNzI1MCAqLworI2RlZmluZSBWSV9FUlJPUl9OU1VQX0FMSUdOX09GRlNFVCAgKF9WSV9FUlJPUisweDNGRkYwMDcwTCkgLyogQkZGRjAwNzAsIC0xMDczODA3MjQ4ICovCisjZGVmaW5lIFZJX0VSUk9SX1VTRVJfQlVGICAgICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwNzFMKSAvKiBCRkZGMDA3MSwgLTEwNzM4MDcyNDcgKi8KKyNkZWZpbmUgVklfRVJST1JfUlNSQ19CVVNZICAgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDA3MkwpIC8qIEJGRkYwMDcyLCAtMTA3MzgwNzI0NiAqLworI2RlZmluZSBWSV9FUlJPUl9OU1VQX1dJRFRIICAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDc2TCkgLyogQkZGRjAwNzYsIC0xMDczODA3MjQyICovCisjZGVmaW5lIFZJX0VSUk9SX0lOVl9QQVJBTUVURVIgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwNzhMKSAvKiBCRkZGMDA3OCwgLTEwNzM4MDcyNDAgKi8KKyNkZWZpbmUgVklfRVJST1JfSU5WX1BST1QgICAgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDA3OUwpIC8qIEJGRkYwMDc5LCAtMTA3MzgwNzIzOSAqLworI2RlZmluZSBWSV9FUlJPUl9JTlZfU0laRSAgICAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDdCTCkgLyogQkZGRjAwN0IsIC0xMDczODA3MjM3ICovCisjZGVmaW5lIFZJX0VSUk9SX1dJTkRPV19NQVBQRUQgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwODBMKSAvKiBCRkZGMDA4MCwgLTEwNzM4MDcyMzIgKi8KKyNkZWZpbmUgVklfRVJST1JfTklNUExfT1BFUiAgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDA4MUwpIC8qIEJGRkYwMDgxLCAtMTA3MzgwNzIzMSAqLworI2RlZmluZSBWSV9FUlJPUl9JTlZfTEVOR1RIICAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDgzTCkgLyogQkZGRjAwODMsIC0xMDczODA3MjI5ICovCisjZGVmaW5lIFZJX0VSUk9SX0lOVl9NT0RFICAgICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwOTFMKSAvKiBCRkZGMDA5MSwgLTEwNzM4MDcyMTUgKi8KKyNkZWZpbmUgVklfRVJST1JfU0VTTl9OTE9DS0VEICAgICAgIChfVklfRVJST1IrMHgzRkZGMDA5Q0wpIC8qIEJGRkYwMDlDLCAtMTA3MzgwNzIwNCAqLworI2RlZmluZSBWSV9FUlJPUl9NRU1fTlNIQVJFRCAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDlETCkgLyogQkZGRjAwOUQsIC0xMDczODA3MjAzICovCisjZGVmaW5lIFZJX0VSUk9SX0xJQlJBUllfTkZPVU5EICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwOUVMKSAvKiBCRkZGMDA5RSwgLTEwNzM4MDcyMDIgKi8KKyNkZWZpbmUgVklfRVJST1JfTlNVUF9JTlRSICAgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDA5RkwpIC8qIEJGRkYwMDlGLCAtMTA3MzgwNzIwMSAqLworI2RlZmluZSBWSV9FUlJPUl9JTlZfTElORSAgICAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMEEwTCkgLyogQkZGRjAwQTAsIC0xMDczODA3MjAwICovCisjZGVmaW5lIFZJX0VSUk9SX0ZJTEVfQUNDRVNTICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwQTFMKSAvKiBCRkZGMDBBMSwgLTEwNzM4MDcxOTkgKi8KKyNkZWZpbmUgVklfRVJST1JfRklMRV9JTyAgICAgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDBBMkwpIC8qIEJGRkYwMEEyLCAtMTA3MzgwNzE5OCAqLworI2RlZmluZSBWSV9FUlJPUl9OU1VQX0xJTkUgICAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMEEzTCkgLyogQkZGRjAwQTMsIC0xMDczODA3MTk3ICovCisjZGVmaW5lIFZJX0VSUk9SX05TVVBfTUVDSCAgICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwQTRMKSAvKiBCRkZGMDBBNCwgLTEwNzM4MDcxOTYgKi8KKyNkZWZpbmUgVklfRVJST1JfSU5URl9OVU1fTkNPTkZJRyAgIChfVklfRVJST1IrMHgzRkZGMDBBNUwpIC8qIEJGRkYwMEE1LCAtMTA3MzgwNzE5NSAqLworI2RlZmluZSBWSV9FUlJPUl9DT05OX0xPU1QgICAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMEE2TCkgLyogQkZGRjAwQTYsIC0xMDczODA3MTk0ICovCisjZGVmaW5lIFZJX0VSUk9SX01BQ0hJTkVfTkFWQUlMICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwQTdMKSAvKiBCRkZGMDBBNywgLTEwNzM4MDcxOTMgKi8KKyNkZWZpbmUgVklfRVJST1JfTlBFUk1JU1NJT04gICAgICAgIChfVklfRVJST1IrMHgzRkZGMDBBOEwpIC8qIEJGRkYwMEE4LCAtMTA3MzgwNzE5MiAqLworCisvKi0gT3RoZXIgVklTQSBEZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgVklfVkVSU0lPTl9NQUpPUih2ZXIpICAgICAgICgoKChWaVZlcnNpb24pdmVyKSAmIDB4RkZGMDAwMDBVTCkgPj4gMjApCisjZGVmaW5lIFZJX1ZFUlNJT05fTUlOT1IodmVyKSAgICAgICAoKCgoVmlWZXJzaW9uKXZlcikgJiAweDAwMEZGRjAwVUwpID4+ICA4KQorI2RlZmluZSBWSV9WRVJTSU9OX1NVQk1JTk9SKHZlcikgICAgKCgoKFZpVmVyc2lvbil2ZXIpICYgMHgwMDAwMDBGRlVMKSAgICAgICkKKworI2RlZmluZSBWSV9GSU5EX0JVRkxFTiAgICAgICAgICAgICAgKDI1NikKKworI2RlZmluZSBWSV9JTlRGX0dQSUIgICAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIFZJX0lOVEZfVlhJICAgICAgICAgICAgICAgICAoMikKKyNkZWZpbmUgVklfSU5URl9HUElCX1ZYSSAgICAgICAgICAgICgzKQorI2RlZmluZSBWSV9JTlRGX0FTUkwgICAgICAgICAgICAgICAgKDQpCisjZGVmaW5lIFZJX0lOVEZfUFhJICAgICAgICAgICAgICAgICAoNSkKKyNkZWZpbmUgVklfSU5URl9UQ1BJUCAgICAgICAgICAgICAgICg2KQorI2RlZmluZSBWSV9JTlRGX1VTQiAgICAgICAgICAgICAgICAgKDcpCisKKyNkZWZpbmUgVklfUFJPVF9OT1JNQUwgICAgICAgICAgICAgICgxKQorI2RlZmluZSBWSV9QUk9UX0ZEQyAgICAgICAgICAgICAgICAgKDIpCisjZGVmaW5lIFZJX1BST1RfSFM0ODggICAgICAgICAgICAgICAoMykKKyNkZWZpbmUgVklfUFJPVF80ODgyX1NUUlMgICAgICAgICAgICg0KQorI2RlZmluZSBWSV9QUk9UX1VTQlRNQ19WRU5ET1IgICAgICAgKDUpCisKKyNkZWZpbmUgVklfRkRDX05PUk1BTCAgICAgICAgICAgICAgICgxKQorI2RlZmluZSBWSV9GRENfU1RSRUFNICAgICAgICAgICAgICAgKDIpCisKKyNkZWZpbmUgVklfTE9DQUxfU1BBQ0UgICAgICAgICAgICAgICgwKQorI2RlZmluZSBWSV9BMTZfU1BBQ0UgICAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIFZJX0EyNF9TUEFDRSAgICAgICAgICAgICAgICAoMikKKyNkZWZpbmUgVklfQTMyX1NQQUNFICAgICAgICAgICAgICAgICgzKQorI2RlZmluZSBWSV9BNjRfU1BBQ0UgICAgICAgICAgICAgICAgKDQpCisjZGVmaW5lIFZJX1BYSV9BTExPQ19TUEFDRSAgICAgICAgICAoOSkKKyNkZWZpbmUgVklfUFhJX0NGR19TUEFDRSAgICAgICAgICAgICgxMCkKKyNkZWZpbmUgVklfUFhJX0JBUjBfU1BBQ0UgICAgICAgICAgICgxMSkKKyNkZWZpbmUgVklfUFhJX0JBUjFfU1BBQ0UgICAgICAgICAgICgxMikKKyNkZWZpbmUgVklfUFhJX0JBUjJfU1BBQ0UgICAgICAgICAgICgxMykKKyNkZWZpbmUgVklfUFhJX0JBUjNfU1BBQ0UgICAgICAgICAgICgxNCkKKyNkZWZpbmUgVklfUFhJX0JBUjRfU1BBQ0UgICAgICAgICAgICgxNSkKKyNkZWZpbmUgVklfUFhJX0JBUjVfU1BBQ0UgICAgICAgICAgICgxNikKKyNkZWZpbmUgVklfT1BBUVVFX1NQQUNFICAgICAgICAgICAgICgweEZGRkYpCisKKyNkZWZpbmUgVklfVU5LTk9XTl9MQSAgICAgICAgICAgICAgICgtMSkKKyNkZWZpbmUgVklfVU5LTk9XTl9TTE9UICAgICAgICAgICAgICgtMSkKKyNkZWZpbmUgVklfVU5LTk9XTl9MRVZFTCAgICAgICAgICAgICgtMSkKKyNkZWZpbmUgVklfVU5LTk9XTl9DSEFTU0lTICAgICAgICAgICgtMSkKKworI2RlZmluZSBWSV9RVUVVRSAgICAgICAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIFZJX0hORExSICAgICAgICAgICAgICAgICAgICAoMikKKyNkZWZpbmUgVklfU1VTUEVORF9ITkRMUiAgICAgICAgICAgICg0KQorI2RlZmluZSBWSV9BTExfTUVDSCAgICAgICAgICAgICAgICAgKDB4RkZGRikKKworI2RlZmluZSBWSV9BTllfSE5ETFIgICAgICAgICAgICAgICAgKDApCisKKyNkZWZpbmUgVklfVFJJR19BTEwgICAgICAgICAgICAgICAgICgtMikKKyNkZWZpbmUgVklfVFJJR19TVyAgICAgICAgICAgICAgICAgICgtMSkKKyNkZWZpbmUgVklfVFJJR19UVEwwICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBWSV9UUklHX1RUTDEgICAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIFZJX1RSSUdfVFRMMiAgICAgICAgICAgICAgICAoMikKKyNkZWZpbmUgVklfVFJJR19UVEwzICAgICAgICAgICAgICAgICgzKQorI2RlZmluZSBWSV9UUklHX1RUTDQgICAgICAgICAgICAgICAgKDQpCisjZGVmaW5lIFZJX1RSSUdfVFRMNSAgICAgICAgICAgICAgICAoNSkKKyNkZWZpbmUgVklfVFJJR19UVEw2ICAgICAgICAgICAgICAgICg2KQorI2RlZmluZSBWSV9UUklHX1RUTDcgICAgICAgICAgICAgICAgKDcpCisjZGVmaW5lIFZJX1RSSUdfRUNMMCAgICAgICAgICAgICAgICAoOCkKKyNkZWZpbmUgVklfVFJJR19FQ0wxICAgICAgICAgICAgICAgICg5KQorI2RlZmluZSBWSV9UUklHX1BBTkVMX0lOICAgICAgICAgICAgKDI3KQorI2RlZmluZSBWSV9UUklHX1BBTkVMX09VVCAgICAgICAgICAgKDI4KQorCisjZGVmaW5lIFZJX1RSSUdfUFJPVF9ERUZBVUxUICAgICAgICAoMCkKKyNkZWZpbmUgVklfVFJJR19QUk9UX09OICAgICAgICAgICAgICgxKQorI2RlZmluZSBWSV9UUklHX1BST1RfT0ZGICAgICAgICAgICAgKDIpCisjZGVmaW5lIFZJX1RSSUdfUFJPVF9TWU5DICAgICAgICAgICAoNSkKKyNkZWZpbmUgVklfVFJJR19QUk9UX1JFU0VSVkUgICAgICAgICg2KQorI2RlZmluZSBWSV9UUklHX1BST1RfVU5SRVNFUlZFICAgICAgKDcpCisKKyNkZWZpbmUgVklfUkVBRF9CVUYgICAgICAgICAgICAgICAgICgxKQorI2RlZmluZSBWSV9XUklURV9CVUYgICAgICAgICAgICAgICAgKDIpCisjZGVmaW5lIFZJX1JFQURfQlVGX0RJU0NBUkQgICAgICAgICAoNCkKKyNkZWZpbmUgVklfV1JJVEVfQlVGX0RJU0NBUkQgICAgICAgICg4KQorI2RlZmluZSBWSV9JT19JTl9CVUYgICAgICAgICAgICAgICAgKDE2KQorI2RlZmluZSBWSV9JT19PVVRfQlVGICAgICAgICAgICAgICAgKDMyKQorI2RlZmluZSBWSV9JT19JTl9CVUZfRElTQ0FSRCAgICAgICAgKDY0KQorI2RlZmluZSBWSV9JT19PVVRfQlVGX0RJU0NBUkQgICAgICAgKDEyOCkKKworI2RlZmluZSBWSV9GTFVTSF9PTl9BQ0NFU1MgICAgICAgICAgKDEpCisjZGVmaW5lIFZJX0ZMVVNIX1dIRU5fRlVMTCAgICAgICAgICAoMikKKyNkZWZpbmUgVklfRkxVU0hfRElTQUJMRSAgICAgICAgICAgICgzKQorCisjZGVmaW5lIFZJX05NQVBQRUQgICAgICAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgVklfVVNFX09QRVJTICAgICAgICAgICAgICAgICgyKQorI2RlZmluZSBWSV9ERVJFRl9BRERSICAgICAgICAgICAgICAgKDMpCisjZGVmaW5lIFZJX0RFUkVGX0FERFJfQllURV9TV0FQICAgICAoNCkKKworI2RlZmluZSBWSV9UTU9fSU1NRURJQVRFICAgICAgICAgICAgKDBMKQorI2RlZmluZSBWSV9UTU9fSU5GSU5JVEUgICAgICAgICAgICAgKDB4RkZGRkZGRkZVTCkKKworI2RlZmluZSBWSV9OT19MT0NLICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIFZJX0VYQ0xVU0lWRV9MT0NLICAgICAgICAgICAoMSkKKyNkZWZpbmUgVklfU0hBUkVEX0xPQ0sgICAgICAgICAgICAgICgyKQorI2RlZmluZSBWSV9MT0FEX0NPTkZJRyAgICAgICAgICAgICAgKDQpCisKKyNkZWZpbmUgVklfTk9fU0VDX0FERFIgICAgICAgICAgICAgICgweEZGRkYpCisKKyNkZWZpbmUgVklfQVNSTF9QQVJfTk9ORSAgICAgICAgICAgICgwKQorI2RlZmluZSBWSV9BU1JMX1BBUl9PREQgICAgICAgICAgICAgKDEpCisjZGVmaW5lIFZJX0FTUkxfUEFSX0VWRU4gICAgICAgICAgICAoMikKKyNkZWZpbmUgVklfQVNSTF9QQVJfTUFSSyAgICAgICAgICAgICgzKQorI2RlZmluZSBWSV9BU1JMX1BBUl9TUEFDRSAgICAgICAgICAgKDQpCisKKyNkZWZpbmUgVklfQVNSTF9TVE9QX09ORSAgICAgICAgICAgICgxMCkKKyNkZWZpbmUgVklfQVNSTF9TVE9QX09ORTUgICAgICAgICAgICgxNSkKKyNkZWZpbmUgVklfQVNSTF9TVE9QX1RXTyAgICAgICAgICAgICgyMCkKKworI2RlZmluZSBWSV9BU1JMX0ZMT1dfTk9ORSAgICAgICAgICAgKDApCisjZGVmaW5lIFZJX0FTUkxfRkxPV19YT05fWE9GRiAgICAgICAoMSkKKyNkZWZpbmUgVklfQVNSTF9GTE9XX1JUU19DVFMgICAgICAgICgyKQorI2RlZmluZSBWSV9BU1JMX0ZMT1dfRFRSX0RTUiAgICAgICAgKDQpCisKKyNkZWZpbmUgVklfQVNSTF9FTkRfTk9ORSAgICAgICAgICAgICgwKQorI2RlZmluZSBWSV9BU1JMX0VORF9MQVNUX0JJVCAgICAgICAgKDEpCisjZGVmaW5lIFZJX0FTUkxfRU5EX1RFUk1DSEFSICAgICAgICAoMikKKyNkZWZpbmUgVklfQVNSTF9FTkRfQlJFQUsgICAgICAgICAgICgzKQorCisjZGVmaW5lIFZJX1NUQVRFX0FTU0VSVEVEICAgICAgICAgICAoMSkKKyNkZWZpbmUgVklfU1RBVEVfVU5BU1NFUlRFRCAgICAgICAgICgwKQorI2RlZmluZSBWSV9TVEFURV9VTktOT1dOICAgICAgICAgICAgKC0xKQorCisjZGVmaW5lIFZJX0JJR19FTkRJQU4gICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgVklfTElUVExFX0VORElBTiAgICAgICAgICAgICgxKQorCisjZGVmaW5lIFZJX0RBVEFfUFJJViAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgVklfREFUQV9OUFJJViAgICAgICAgICAgICAgICgxKQorI2RlZmluZSBWSV9QUk9HX1BSSVYgICAgICAgICAgICAgICAgKDIpCisjZGVmaW5lIFZJX1BST0dfTlBSSVYgICAgICAgICAgICAgICAoMykKKyNkZWZpbmUgVklfQkxDS19QUklWICAgICAgICAgICAgICAgICg0KQorI2RlZmluZSBWSV9CTENLX05QUklWICAgICAgICAgICAgICAgKDUpCisjZGVmaW5lIFZJX0Q2NF9QUklWICAgICAgICAgICAgICAgICAoNikKKyNkZWZpbmUgVklfRDY0X05QUklWICAgICAgICAgICAgICAgICg3KQorCisjZGVmaW5lIFZJX1dJRFRIXzggICAgICAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgVklfV0lEVEhfMTYgICAgICAgICAgICAgICAgICgyKQorI2RlZmluZSBWSV9XSURUSF8zMiAgICAgICAgICAgICAgICAgKDQpCisjZGVmaW5lIFZJX1dJRFRIXzY0ICAgICAgICAgICAgICAgICAoOCkKKworI2RlZmluZSBWSV9HUElCX1JFTl9ERUFTU0VSVCAgICAgICAgKDApCisjZGVmaW5lIFZJX0dQSUJfUkVOX0FTU0VSVCAgICAgICAgICAoMSkKKyNkZWZpbmUgVklfR1BJQl9SRU5fREVBU1NFUlRfR1RMICAgICgyKQorI2RlZmluZSBWSV9HUElCX1JFTl9BU1NFUlRfQUREUkVTUyAgKDMpCisjZGVmaW5lIFZJX0dQSUJfUkVOX0FTU0VSVF9MTE8gICAgICAoNCkKKyNkZWZpbmUgVklfR1BJQl9SRU5fQVNTRVJUX0FERFJFU1NfTExPICg1KQorI2RlZmluZSBWSV9HUElCX1JFTl9BRERSRVNTX0dUTCAgICAgKDYpCisKKyNkZWZpbmUgVklfR1BJQl9BVE5fREVBU1NFUlQgICAgICAgICgwKQorI2RlZmluZSBWSV9HUElCX0FUTl9BU1NFUlQgICAgICAgICAgKDEpCisjZGVmaW5lIFZJX0dQSUJfQVROX0RFQVNTRVJUX0hBTkRTSEFLRSAoMikKKyNkZWZpbmUgVklfR1BJQl9BVE5fQVNTRVJUX0lNTUVESUFURSAoMykKKworI2RlZmluZSBWSV9HUElCX0hTNDg4X0RJU0FCTEVEICAgICAgKDApCisjZGVmaW5lIFZJX0dQSUJfSFM0ODhfTklNUEwgICAgICAgICAoLTEpCisKKyNkZWZpbmUgVklfR1BJQl9VTkFERFJFU1NFRCAgICAgICAgICgwKQorI2RlZmluZSBWSV9HUElCX1RBTEtFUiAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIFZJX0dQSUJfTElTVEVORVIgICAgICAgICAgICAoMikKKworI2RlZmluZSBWSV9WWElfQ01EMTYgICAgICAgICAgICAgICAgKDB4MDIwMCkKKyNkZWZpbmUgVklfVlhJX0NNRDE2X1JFU1AxNiAgICAgICAgICgweDAyMDIpCisjZGVmaW5lIFZJX1ZYSV9SRVNQMTYgICAgICAgICAgICAgICAoMHgwMDAyKQorI2RlZmluZSBWSV9WWElfQ01EMzIgICAgICAgICAgICAgICAgKDB4MDQwMCkKKyNkZWZpbmUgVklfVlhJX0NNRDMyX1JFU1AxNiAgICAgICAgICgweDA0MDIpCisjZGVmaW5lIFZJX1ZYSV9DTUQzMl9SRVNQMzIgICAgICAgICAoMHgwNDA0KQorI2RlZmluZSBWSV9WWElfUkVTUDMyICAgICAgICAgICAgICAgKDB4MDAwNCkKKworI2RlZmluZSBWSV9BU1NFUlRfU0lHTkFMICAgICAgICAgICAgKC0xKQorI2RlZmluZSBWSV9BU1NFUlRfVVNFX0FTU0lHTkVEICAgICAgKDApCisjZGVmaW5lIFZJX0FTU0VSVF9JUlExICAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgVklfQVNTRVJUX0lSUTIgICAgICAgICAgICAgICgyKQorI2RlZmluZSBWSV9BU1NFUlRfSVJRMyAgICAgICAgICAgICAgKDMpCisjZGVmaW5lIFZJX0FTU0VSVF9JUlE0ICAgICAgICAgICAgICAoNCkKKyNkZWZpbmUgVklfQVNTRVJUX0lSUTUgICAgICAgICAgICAgICg1KQorI2RlZmluZSBWSV9BU1NFUlRfSVJRNiAgICAgICAgICAgICAgKDYpCisjZGVmaW5lIFZJX0FTU0VSVF9JUlE3ICAgICAgICAgICAgICAoNykKKworI2RlZmluZSBWSV9VVElMX0FTU0VSVF9TWVNSRVNFVCAgICAgKDEpCisjZGVmaW5lIFZJX1VUSUxfQVNTRVJUX1NZU0ZBSUwgICAgICAoMikKKyNkZWZpbmUgVklfVVRJTF9ERUFTU0VSVF9TWVNGQUlMICAgICgzKQorCisjZGVmaW5lIFZJX1ZYSV9DTEFTU19NRU1PUlkgICAgICAgICAoMCkKKyNkZWZpbmUgVklfVlhJX0NMQVNTX0VYVEVOREVEICAgICAgICgxKQorI2RlZmluZSBWSV9WWElfQ0xBU1NfTUVTU0FHRSAgICAgICAgKDIpCisjZGVmaW5lIFZJX1ZYSV9DTEFTU19SRUdJU1RFUiAgICAgICAoMykKKyNkZWZpbmUgVklfVlhJX0NMQVNTX09USEVSICAgICAgICAgICg0KQorCisjZGVmaW5lIFZJX1BYSV9BRERSX05PTkUgICAgICAgICAgICAoMCkKKyNkZWZpbmUgVklfUFhJX0FERFJfTUVNICAgICAgICAgICAgICgxKQorI2RlZmluZSBWSV9QWElfQUREUl9JTyAgICAgICAgICAgICAgKDIpCisjZGVmaW5lIFZJX1BYSV9BRERSX0NGRyAgICAgICAgICAgICAoMykKKworI2RlZmluZSBWSV9UUklHX1VOS05PV04gICAgICAgICAgICAgKC0xKQorCisjZGVmaW5lIFZJX1BYSV9MQlVTX1VOS05PV04gICAgICAgICAoLTEpCisjZGVmaW5lIFZJX1BYSV9MQlVTX05PTkUgICAgICAgICAgICAoMCkKKyNkZWZpbmUgVklfUFhJX0xCVVNfU1RBUl9UUklHX0JVU18wICgxMDAwKQorI2RlZmluZSBWSV9QWElfTEJVU19TVEFSX1RSSUdfQlVTXzEgKDEwMDEpCisjZGVmaW5lIFZJX1BYSV9MQlVTX1NUQVJfVFJJR19CVVNfMiAoMTAwMikKKyNkZWZpbmUgVklfUFhJX0xCVVNfU1RBUl9UUklHX0JVU18zICgxMDAzKQorI2RlZmluZSBWSV9QWElfTEJVU19TVEFSX1RSSUdfQlVTXzQgKDEwMDQpCisjZGVmaW5lIFZJX1BYSV9MQlVTX1NUQVJfVFJJR19CVVNfNSAoMTAwNSkKKyNkZWZpbmUgVklfUFhJX0xCVVNfU1RBUl9UUklHX0JVU182ICgxMDA2KQorI2RlZmluZSBWSV9QWElfTEJVU19TVEFSX1RSSUdfQlVTXzcgKDEwMDcpCisjZGVmaW5lIFZJX1BYSV9MQlVTX1NUQVJfVFJJR19CVVNfOCAoMTAwOCkKKyNkZWZpbmUgVklfUFhJX0xCVVNfU1RBUl9UUklHX0JVU185ICgxMDA5KQorI2RlZmluZSBWSV9QWElfU1RBUl9UUklHX0NPTlRST0xMRVIgKDE0MTMpCisKKy8qLSBCYWNrd2FyZCBDb21wYXRpYmlsaXR5IE1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSB2aUdldERlZmF1bHRSTSh2aSkgICAgICAgICAgdmlPcGVuRGVmYXVsdFJNKHZpKQorI2RlZmluZSBWSV9FUlJPUl9JTlZfU0VTU0lPTiAgICAgICAgKFZJX0VSUk9SX0lOVl9PQkpFQ1QpCisjZGVmaW5lIFZJX0lORklOSVRFICAgICAgICAgICAgICAgICAoVklfVE1PX0lORklOSVRFKQorI2RlZmluZSBWSV9OT1JNQUwgICAgICAgICAgICAgICAgICAgKFZJX1BST1RfTk9STUFMKQorI2RlZmluZSBWSV9GREMgICAgICAgICAgICAgICAgICAgICAgKFZJX1BST1RfRkRDKQorI2RlZmluZSBWSV9IUzQ4OCAgICAgICAgICAgICAgICAgICAgKFZJX1BST1RfSFM0ODgpCisjZGVmaW5lIFZJX0FTUkw0ODggICAgICAgICAgICAgICAgICAoVklfUFJPVF80ODgyX1NUUlMpCisjZGVmaW5lIFZJX0FTUkxfSU5fQlVGICAgICAgICAgICAgICAoVklfSU9fSU5fQlVGKQorI2RlZmluZSBWSV9BU1JMX09VVF9CVUYgICAgICAgICAgICAgKFZJX0lPX09VVF9CVUYpCisjZGVmaW5lIFZJX0FTUkxfSU5fQlVGX0RJU0NBUkQgICAgICAoVklfSU9fSU5fQlVGX0RJU0NBUkQpCisjZGVmaW5lIFZJX0FTUkxfT1VUX0JVRl9ESVNDQVJEICAgICAoVklfSU9fT1VUX0JVRl9ESVNDQVJEKQorCisvKi0gTmF0aW9uYWwgSW5zdHJ1bWVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgVklfSU5URl9SSU8gICAgICAgICAgICAgICAgICg4KQorI2RlZmluZSBWSV9JTlRGX0ZJUkVXSVJFICAgICAgICAgICAgKDkpIAorCisjZGVmaW5lIFZJX0FUVFJfU1lOQ19NWElfQUxMT1dfRU4gICAoMHgzRkZGMDE2MVVMKSAvKiBWaUJvb2xlYW4sIHJlYWQvd3JpdGUgKi8KKworLyogVGhpcyBpcyBmb3IgVlhJIFNFUlZBTlQgcmVzb3VyY2VzICovCisKKyNkZWZpbmUgVklfRVZFTlRfVlhJX0RFVl9DTUQgICAgICAgICgweEJGRkYyMDBGVUwpCisjZGVmaW5lIFZJX0FUVFJfVlhJX0RFVl9DTURfVFlQRSAgICAoMHgzRkZGNDAzN1VMKSAvKiBWaUludDE2LCByZWFkLW9ubHkgKi8KKyNkZWZpbmUgVklfQVRUUl9WWElfREVWX0NNRF9WQUxVRSAgICgweDNGRkY0MDM4VUwpIC8qIFZpVUludDMyLCByZWFkLW9ubHkgKi8KKworI2RlZmluZSBWSV9WWElfREVWX0NNRF9UWVBFXzE2ICAgICAgKDE2KQorI2RlZmluZSBWSV9WWElfREVWX0NNRF9UWVBFXzMyICAgICAgKDMyKQorCitWaVN0YXR1cyBfVklfRlVOQyB2aVZ4aVNlcnZhbnRSZXNwb25zZShWaVNlc3Npb24gdmksIFZpSW50MTYgbW9kZSwgVmlVSW50MzIgcmVzcCk7CisvKiBtb2RlIHZhbHVlcyBpbmNsdWRlIFZJX1ZYSV9SRVNQMTYsIFZJX1ZYSV9SRVNQMzIsIGFuZCB0aGUgbmV4dCAyIHZhbHVlcyAqLworI2RlZmluZSBWSV9WWElfUkVTUF9OT05FICAgICAgICAgICAgKDApCisjZGVmaW5lIFZJX1ZYSV9SRVNQX1BST1RfRVJST1IgICAgICAoLTEpCisKKy8qIFRoaXMgYWxsb3dzIGV4dGVuZGVkIFNlcmlhbCBzdXBwb3J0IG9uIFdpbjMyIGFuZCBvbiBOSSBFTkVUIFNlcmlhbCBwcm9kdWN0cyAqLworCisjZGVmaW5lIFZJX0FUVFJfQVNSTF9ESVNDQVJEX05VTEwgICAoMHgzRkZGMDBCMFVMKQorI2RlZmluZSBWSV9BVFRSX0FTUkxfQ09OTkVDVEVEICAgICAgKDB4M0ZGRjAxQkJVTCkKKyNkZWZpbmUgVklfQVRUUl9BU1JMX0JSRUFLX1NUQVRFICAgICgweDNGRkYwMUJDVUwpCisjZGVmaW5lIFZJX0FUVFJfQVNSTF9CUkVBS19MRU4gICAgICAoMHgzRkZGMDFCRFVMKQorI2RlZmluZSBWSV9BVFRSX0FTUkxfQUxMT1dfVFJBTlNNSVQgKDB4M0ZGRjAxQkVVTCkKKyNkZWZpbmUgVklfQVRUUl9BU1JMX1dJUkVfTU9ERSAgICAgICgweDNGRkYwMUJGVUwpCisKKyNkZWZpbmUgVklfQVNSTF9XSVJFXzQ4NV80ICAgICAgICAgICgwKQorI2RlZmluZSBWSV9BU1JMX1dJUkVfNDg1XzJfRFRSX0VDSE8gKDEpCisjZGVmaW5lIFZJX0FTUkxfV0lSRV80ODVfMl9EVFJfQ1RSTCAoMikKKyNkZWZpbmUgVklfQVNSTF9XSVJFXzQ4NV8yX0FVVE8gICAgICgzKQorI2RlZmluZSBWSV9BU1JMX1dJUkVfMjMyX0RURSAgICAgICAgKDEyOCkKKyNkZWZpbmUgVklfQVNSTF9XSVJFXzIzMl9EQ0UgICAgICAgICgxMjkpCisjZGVmaW5lIFZJX0FTUkxfV0lSRV8yMzJfQVVUTyAgICAgICAoMTMwKQorCisjZGVmaW5lIFZJX0VWRU5UX0FTUkxfQlJFQUsgICAgICAgICAoMHgzRkZGMjAyM1VMKQorI2RlZmluZSBWSV9FVkVOVF9BU1JMX0NUUyAgICAgICAgICAgKDB4M0ZGRjIwMjlVTCkKKyNkZWZpbmUgVklfRVZFTlRfQVNSTF9EU1IgICAgICAgICAgICgweDNGRkYyMDJBVUwpCisjZGVmaW5lIFZJX0VWRU5UX0FTUkxfRENEICAgICAgICAgICAoMHgzRkZGMjAyQ1VMKQorI2RlZmluZSBWSV9FVkVOVF9BU1JMX1JJICAgICAgICAgICAgKDB4M0ZGRjIwMkVVTCkKKyNkZWZpbmUgVklfRVZFTlRfQVNSTF9DSEFSICAgICAgICAgICgweDNGRkYyMDM1VUwpCisjZGVmaW5lIFZJX0VWRU5UX0FTUkxfVEVSTUNIQVIgICAgICAoMHgzRkZGMjAyNFVMKQorCisvKiBUaGlzIGlzIGZvciBmYXN0IHZpUGVlay92aVBva2UgbWFjcm9zICovCisKKyNpZiBkZWZpbmVkKE5JVklTQV9QRUVLUE9LRSkKKworI2lmIGRlZmluZWQoTklWSVNBX1BFRUtQT0tFX1NVUFApCisjdW5kZWYgTklWSVNBX1BFRUtQT0tFX1NVUFAKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykgfHwgZGVmaW5lZChfX05UX18pKSAmJiAhZGVmaW5lZChfTklfbXN3aW4xNl8pCisvKiBUaGlzIG1hY3JvIGlzIHN1cHBvcnRlZCBmb3IgYWxsIFdpbjMyIGNvbXBpbGVycywgaW5jbHVkaW5nIENWSS4gKi8KKyNkZWZpbmUgTklWSVNBX1BFRUtQT0tFX1NVUFAKKyNlbGlmIChkZWZpbmVkKF9XSU5ET1dTKSB8fCBkZWZpbmVkKF9XaW5kb3dzKSkgJiYgIWRlZmluZWQoX0NWSV8pICYmICFkZWZpbmVkKF9OSV9tc3dpbjE2XykKKy8qIFRoaXMgbWFjcm8gaXMgc3VwcG9ydGVkIGZvciBCb3JsYW5kIGFuZCBNaWNyb3NvZnQgY29tcGlsZXJzIG9uIFdpbjE2LCBidXQgbm90IENWSS4gKi8KKyNkZWZpbmUgTklWSVNBX1BFRUtQT0tFX1NVUFAKKyNlbGlmIGRlZmluZWQoX0NWSV8pICYmIGRlZmluZWQoX05JX3NwYXJjXykKKy8qIFRoaXMgbWFjcm8gaXMgc3VwcG9ydGVkIGZvciBTb2xhcmlzIDEgYW5kIDIsIGZyb20gQ1ZJIG9ubHkuICovCisjZGVmaW5lIE5JVklTQV9QRUVLUE9LRV9TVVBQCisjZWxzZQorLyogVGhpcyBtYWNybyBpcyBub3Qgc3VwcG9ydGVkIG9uIG90aGVyIHBsYXRmb3Jtcy4gKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChOSVZJU0FfUEVFS1BPS0VfU1VQUCkKKworZXh0ZXJuIFZpQm9vbGVhbiBOSV92aUltcGxWSVNBMTsKK1ZpU3RhdHVzIF9WSV9GVU5DIE5JX3ZpT3BlbkRlZmF1bHRSTSAoVmlQU2Vzc2lvbiB2aSk7CisjZGVmaW5lIHZpT3BlbkRlZmF1bHRSTSh2aSkgTklfdmlPcGVuRGVmYXVsdFJNKHZpKQorCisjZGVmaW5lIHZpUGVlazgodmksYWRkcix2YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmICgoTklfdmlJbXBsVklTQTEpICYmICgqKChWaVBVSW50MzIpKHZpKSkpKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgZG8gKCooKFZpUFVJbnQ4KSh2YWwpKSA9ICooKHZvbGF0aWxlIFZpVUludDggX1ZJX1BUUikoYWRkcikpKTsgICAgIFwKKyAgICAgICAgIHdoaWxlICgqKigodm9sYXRpbGUgVmlVSW50OCBfVklfUFRSIF9WSV9QVFIpKHZpKSkgJiAweDEwKTsgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAodmlQZWVrOCkoKHZpKSwoYWRkciksKHZhbCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIH0KKworI2RlZmluZSB2aVBva2U4KHZpLGFkZHIsdmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoKE5JX3ZpSW1wbFZJU0ExKSAmJiAoKigoVmlQVUludDMyKSh2aSkpKSkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIGRvICgqKCh2b2xhdGlsZSBWaVVJbnQ4IF9WSV9QVFIpKGFkZHIpKSA9ICgoVmlVSW50OCkodmFsKSkpOyAgICAgICBcCisgICAgICAgICB3aGlsZSAoKiooKHZvbGF0aWxlIFZpVUludDggX1ZJX1BUUiBfVklfUFRSKSh2aSkpICYgMHgxMCk7ICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgKHZpUG9rZTgpKCh2aSksKGFkZHIpLCh2YWwpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB9CisKKyNkZWZpbmUgdmlQZWVrMTYodmksYWRkcix2YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKChOSV92aUltcGxWSVNBMSkgJiYgKCooKFZpUFVJbnQzMikodmkpKSkpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBkbyAoKigoVmlQVUludDE2KSh2YWwpKSA9ICooKHZvbGF0aWxlIFZpVUludDE2IF9WSV9QVFIpKGFkZHIpKSk7ICAgXAorICAgICAgICAgd2hpbGUgKCoqKCh2b2xhdGlsZSBWaVVJbnQ4IF9WSV9QVFIgX1ZJX1BUUikodmkpKSAmIDB4MTApOyAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICh2aVBlZWsxNikoKHZpKSwoYWRkciksKHZhbCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfQorCisjZGVmaW5lIHZpUG9rZTE2KHZpLGFkZHIsdmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmICgoTklfdmlJbXBsVklTQTEpICYmICgqKChWaVBVSW50MzIpKHZpKSkpKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgZG8gKCooKHZvbGF0aWxlIFZpVUludDE2IF9WSV9QVFIpKGFkZHIpKSA9ICgoVmlVSW50MTYpKHZhbCkpKTsgICAgIFwKKyAgICAgICAgIHdoaWxlICgqKigodm9sYXRpbGUgVmlVSW50OCBfVklfUFRSIF9WSV9QVFIpKHZpKSkgJiAweDEwKTsgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAodmlQb2tlMTYpKCh2aSksKGFkZHIpLCh2YWwpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIH0KKworI2RlZmluZSB2aVBlZWszMih2aSxhZGRyLHZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoKE5JX3ZpSW1wbFZJU0ExKSAmJiAoKigoVmlQVUludDMyKSh2aSkpKSkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIGRvICgqKChWaVBVSW50MzIpKHZhbCkpID0gKigodm9sYXRpbGUgVmlVSW50MzIgX1ZJX1BUUikoYWRkcikpKTsgICBcCisgICAgICAgICB3aGlsZSAoKiooKHZvbGF0aWxlIFZpVUludDggX1ZJX1BUUiBfVklfUFRSKSh2aSkpICYgMHgxMCk7ICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgKHZpUGVlazMyKSgodmkpLChhZGRyKSwodmFsKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB9CisKKyNkZWZpbmUgdmlQb2tlMzIodmksYWRkcix2YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKChOSV92aUltcGxWSVNBMSkgJiYgKCooKFZpUFVJbnQzMikodmkpKSkpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBkbyAoKigodm9sYXRpbGUgVmlVSW50MzIgX1ZJX1BUUikoYWRkcikpID0gKChWaVVJbnQzMikodmFsKSkpOyAgICAgXAorICAgICAgICAgd2hpbGUgKCoqKCh2b2xhdGlsZSBWaVVJbnQ4IF9WSV9QVFIgX1ZJX1BUUikodmkpKSAmIDB4MTApOyAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICh2aVBva2UzMikoKHZpKSwoYWRkciksKHZhbCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfQorCisjZW5kaWYKKworI2VuZGlmCisKKyNpZiBkZWZpbmVkKE5JVklTQV9QWEkpIHx8IGRlZmluZWQoUFhJU0FWSVNBX1BYSSkKKworI2lmIDAKKy8qIFRoZSBmb2xsb3dpbmcgMiBhdHRyaWJ1dGVzIHdlcmUgaW5jb3JyZWN0bHkgaW1wbGVtZW50ZWQgaW4gZWFybGllcgorICAgdmVyc2lvbnMgb2YgTkktVklTQS4gIFlvdSBzaG91bGQgbm93IHF1ZXJ5IFZJX0FUVFJfTUFORl9JRCBvcgorICAgVklfQVRUUl9NT0RFTF9DT0RFLiAgVGhvc2UgYXR0cmlidXRlcyBjb250YWluIHN1Yi12ZW5kb3IgaW5mb3JtYXRpb24KKyAgIHdoZW4gaXQgZXhpc3RzLiAgVG8gZ2V0IGJvdGggdGhlIGFjdHVhbCBwcmltYXJ5IGFuZCBzdWJ2ZW5kb3IgY29kZXMKKyAgIGZyb20gdGhlIGRldmljZSwgeW91IHNob3VsZCBjYWxsIHZpSW4xNiB1c2luZyBWSV9QWElfQ0ZHX1NQQUNFLiAqLworI2RlZmluZSBWSV9BVFRSX1BYSV9TVUJfTUFORl9JRCAgICAgKDB4M0ZGRjAyMDNVTCkKKyNkZWZpbmUgVklfQVRUUl9QWElfU1VCX01PREVMX0NPREUgICgweDNGRkYwMjA0VUwpCisjZW5kaWYKKworI2RlZmluZSBWSV9BVFRSX1BYSV9TUkNfVFJJR19CVVMgICAgKDB4M0ZGRjAyMERVTCkKKyNkZWZpbmUgVklfQVRUUl9QWElfREVTVF9UUklHX0JVUyAgICgweDNGRkYwMjBFVUwpCisKKyNkZWZpbmUgVklfQVRUUl9QWElfUkVDVl9JTlRSX1NFUSAgICgweDNGRkY0MjQwVUwpCisjZGVmaW5lIFZJX0FUVFJfUFhJX1JFQ1ZfSU5UUl9EQVRBICAoMHgzRkZGNDI0MVVMKQorCisjZW5kaWYKKworI2lmIGRlZmluZWQoTklWSVNBX1VTQikKKworI2RlZmluZSBWSV9BVFRSX1VTQl9CVUxLX09VVF9QSVBFICAgKDB4M0ZGRjAxQTJVTCkKKyNkZWZpbmUgVklfQVRUUl9VU0JfQlVMS19JTl9QSVBFICAgICgweDNGRkYwMUEzVUwpCisjZGVmaW5lIFZJX0FUVFJfVVNCX0lOVFJfSU5fUElQRSAgICAoMHgzRkZGMDFBNFVMKQorI2RlZmluZSBWSV9BVFRSX1VTQl9DTEFTUyAgICAgICAgICAgKDB4M0ZGRjAxQTVVTCkKKyNkZWZpbmUgVklfQVRUUl9VU0JfU1VCQ0xBU1MgICAgICAgICgweDNGRkYwMUE2VUwpCisjZGVmaW5lIFZJX0FUVFJfVVNCX0FMVF9TRVRUSU5HICAgICAoMHgzRkZGMDFBOFVMKQorI2RlZmluZSBWSV9BVFRSX1VTQl9FTkRfSU4gICAgICAgICAgKDB4M0ZGRjAxQTlVTCkKKyNkZWZpbmUgVklfQVRUUl9VU0JfTlVNX0lOVEZDUyAgICAgICgweDNGRkYwMUFBVUwpCisjZGVmaW5lIFZJX0FUVFJfVVNCX05VTV9QSVBFUyAgICAgICAoMHgzRkZGMDFBQlVMKQorI2RlZmluZSBWSV9BVFRSX1VTQl9CVUxLX09VVF9TVEFUVVMgKDB4M0ZGRjAxQUNVTCkKKyNkZWZpbmUgVklfQVRUUl9VU0JfQlVMS19JTl9TVEFUVVMgICgweDNGRkYwMUFEVUwpCisjZGVmaW5lIFZJX0FUVFJfVVNCX0lOVFJfSU5fU1RBVFVTICAoMHgzRkZGMDFBRVVMKQorI2RlZmluZSBWSV9BVFRSX1VTQl9DVFJMX1BJUEUgICAgICAgKDB4M0ZGRjAxQjBVTCkKKworI2RlZmluZSBWSV9VU0JfUElQRV9TVEFURV9VTktOT1dOICAgKC0xKQorI2RlZmluZSBWSV9VU0JfUElQRV9SRUFEWSAgICAgICAgICAgKDApCisjZGVmaW5lIFZJX1VTQl9QSVBFX1NUQUxMRUQgICAgICAgICAoMSkKKworI2RlZmluZSBWSV9VU0JfRU5EX05PTkUgICAgICAgICAgICAgKDApCisjZGVmaW5lIFZJX1VTQl9FTkRfU0hPUlQgICAgICAgICAgICAoNCkKKyNkZWZpbmUgVklfVVNCX0VORF9TSE9SVF9PUl9DT1VOVCAgICg1KQorCisjZW5kaWYKKworI2RlZmluZSBWSV9BVFRSX0ZJUkVXSVJFX0RFU1RfVVBQRVJfT0ZGU0VUICgweDNGRkYwMUYwVUwpCisjZGVmaW5lIFZJX0FUVFJfRklSRVdJUkVfU1JDX1VQUEVSX09GRlNFVCAgKDB4M0ZGRjAxRjFVTCkKKyNkZWZpbmUgVklfQVRUUl9GSVJFV0lSRV9XSU5fVVBQRVJfT0ZGU0VUICAoMHgzRkZGMDFGMlVMKQorI2RlZmluZSBWSV9BVFRSX0ZJUkVXSVJFX1ZFTkRPUl9JRCAgICAgICAgICgweDNGRkYwMUYzVUwpCisjZGVmaW5lIFZJX0FUVFJfRklSRVdJUkVfTE9XRVJfQ0hJUF9JRCAgICAgKDB4M0ZGRjAxRjRVTCkKKyNkZWZpbmUgVklfQVRUUl9GSVJFV0lSRV9VUFBFUl9DSElQX0lEICAgICAoMHgzRkZGMDFGNVVMKQorCisjZGVmaW5lIFZJX0ZJUkVXSVJFX0RGTFRfU1BBQ0UgICAgICAgICAgICg1KQorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChfX2NwbHVzcGx1c19fKQorICAgfQorI2VuZGlmCisKKyNlbmRpZgorCisvKi0gVGhlIEVuZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS92aXNhL3Zpc2F0eXBlLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS92aXNhL3Zpc2F0eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYwODlkZAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL3Zpc2EvdmlzYXR5cGUuaApAQCAtMCwwICsxLDIwMSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRGlzdHJpYnV0ZWQgYnkgSVZJIEZvdW5kYXRpb24gSW5jLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRG8gbm90IG1vZGlmeSB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGl0bGUgICA6IFZJU0FUWVBFLkggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRGF0ZSAgICA6IDA0LTE0LTIwMDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUHVycG9zZSA6IEZ1bmRhbWVudGFsIFZJU0EgZGF0YSB0eXBlcyBhbmQgbWFjcm8gZGVmaW5pdGlvbnMgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIF9fVklTQVRZUEVfSEVBREVSX18KKyNkZWZpbmUgX19WSVNBVFlQRV9IRUFERVJfXworCisjaWYgZGVmaW5lZChfV0lONjQpCisjZGVmaW5lIF9WSV9GQVIKKyNkZWZpbmUgX1ZJX0ZVTkMgICAgICAgICAgICBfX2Zhc3RjYWxsCisjZGVmaW5lIF9WSV9GVU5DQyAgICAgICAgICAgX19mYXN0Y2FsbAorI2RlZmluZSBfVklfRlVOQ0ggICAgICAgICAgIF9fZmFzdGNhbGwKKyNkZWZpbmUgX1ZJX1NJR05FRCAgICAgICAgICBzaWduZWQKKyNlbGlmIChkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX1dJTjMyX18pIHx8IGRlZmluZWQoX19OVF9fKSkgJiYgIWRlZmluZWQoX05JX21zd2luMTZfKQorI2RlZmluZSBfVklfRkFSCisjZGVmaW5lIF9WSV9GVU5DICAgICAgICAgICAgX19zdGRjYWxsCisjZGVmaW5lIF9WSV9GVU5DQyAgICAgICAgICAgX19jZGVjbAorI2RlZmluZSBfVklfRlVOQ0ggICAgICAgICAgIF9fc3RkY2FsbAorI2RlZmluZSBfVklfU0lHTkVEICAgICAgICAgIHNpZ25lZAorI2VsaWYgZGVmaW5lZChfQ1ZJXykgJiYgZGVmaW5lZChfTklfaTM4Nl8pCisjZGVmaW5lIF9WSV9GQVIKKyNkZWZpbmUgX1ZJX0ZVTkMgICAgICAgICAgICBfcGFzY2FsCisjZGVmaW5lIF9WSV9GVU5DQworI2RlZmluZSBfVklfRlVOQ0ggICAgICAgICAgIF9wYXNjYWwKKyNkZWZpbmUgX1ZJX1NJR05FRCAgICAgICAgICBzaWduZWQKKyNlbGlmIChkZWZpbmVkKF9XSU5ET1dTKSB8fCBkZWZpbmVkKF9XaW5kb3dzKSkgJiYgIWRlZmluZWQoX05JX21zd2luMTZfKQorI2RlZmluZSBfVklfRkFSICAgICAgICAgICAgIF9mYXIKKyNkZWZpbmUgX1ZJX0ZVTkMgICAgICAgICAgICBfZmFyIF9wYXNjYWwgX2V4cG9ydAorI2RlZmluZSBfVklfRlVOQ0MgICAgICAgICAgIF9mYXIgX2NkZWNsICBfZXhwb3J0CisjZGVmaW5lIF9WSV9GVU5DSCAgICAgICAgICAgX2ZhciBfcGFzY2FsCisjZGVmaW5lIF9WSV9TSUdORUQgICAgICAgICAgc2lnbmVkCisjZWxpZiAoZGVmaW5lZChocHV4KSB8fCBkZWZpbmVkKF9faHB1eCkpICYmIChkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzX18pKQorI2RlZmluZSBfVklfRkFSCisjZGVmaW5lIF9WSV9GVU5DCisjZGVmaW5lIF9WSV9GVU5DQworI2RlZmluZSBfVklfRlVOQ0gKKyNkZWZpbmUgX1ZJX1NJR05FRAorI2Vsc2UKKyNkZWZpbmUgX1ZJX0ZBUgorI2RlZmluZSBfVklfRlVOQworI2RlZmluZSBfVklfRlVOQ0MKKyNkZWZpbmUgX1ZJX0ZVTkNICisjZGVmaW5lIF9WSV9TSUdORUQgICAgICAgICAgc2lnbmVkCisjZW5kaWYKKworI2RlZmluZSBfVklfRVJST1IgICAgICAgICAgICgtMjE0NzQ4MzY0N0wtMSkgIC8qIDB4ODAwMDAwMDAgKi8KKyNkZWZpbmUgX1ZJX1BUUiAgICAgICAgICAgICBfVklfRkFSICoKKworLyotIFZJU0EgVHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIF9WSV9JTlQ2NF9VSU5UNjRfREVGSU5FRAorI2lmIGRlZmluZWQoX1dJTjY0KSB8fCAoKGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykgfHwgZGVmaW5lZChfX05UX18pKSAmJiAhZGVmaW5lZChfTklfbXN3aW4xNl8pKQorI2lmIChkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkpIHx8IChkZWZpbmVkKF9DVklfKSAmJiAoX0NWSV8gPj0gNzAwKSkgfHwgKGRlZmluZWQoX19CT1JMQU5EQ19fKSAmJiAoX19CT1JMQU5EQ19fID49IDB4MDUyMCkpCit0eXBlZGVmIHVuc2lnbmVkICAgX19pbnQ2NCAgVmlVSW50NjQ7Cit0eXBlZGVmIF9WSV9TSUdORUQgX19pbnQ2NCAgVmlJbnQ2NDsKKyNkZWZpbmUgX1ZJX0lOVDY0X1VJTlQ2NF9ERUZJTkVECisjaWYgZGVmaW5lZChfV0lONjQpCisjZGVmaW5lIF9WSVNBX0VOVl9JU182NF9CSVQKKyNlbHNlCisvKiBUaGlzIGlzIGEgMzItYml0IE9TLCBub3QgYSA2NC1iaXQgT1MgKi8KKyNlbmRpZgorI2VuZGlmCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX18gPj0gMykKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KK3R5cGVkZWYgdV9pbnQ2NF90ICAgICAgICAgICBWaVVJbnQ2NDsKK3R5cGVkZWYgaW50NjRfdCAgICAgICAgICAgICBWaUludDY0OworI2RlZmluZSBfVklfSU5UNjRfVUlOVDY0X0RFRklORUQKKyNpZiBkZWZpbmVkKExPTkdfTUFYKSAmJiAoTE9OR19NQVggPiAweDdGRkZGRkZGTCkKKyNkZWZpbmUgX1ZJU0FfRU5WX0lTXzY0X0JJVAorI2Vsc2UKKy8qIFRoaXMgaXMgYSAzMi1iaXQgT1MsIG5vdCBhIDY0LWJpdCBPUyAqLworI2VuZGlmCisjZWxzZQorLyogVGhpcyBwbGF0Zm9ybSBkb2VzIG5vdCBzdXBwb3J0IDY0LWJpdCB0eXBlcyAqLworI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX1ZJX0lOVDY0X1VJTlQ2NF9ERUZJTkVEKQordHlwZWRlZiBWaVVJbnQ2NCAgICBfVklfUFRSIFZpUFVJbnQ2NDsKK3R5cGVkZWYgVmlVSW50NjQgICAgX1ZJX1BUUiBWaUFVSW50NjQ7Cit0eXBlZGVmIFZpSW50NjQgICAgIF9WSV9QVFIgVmlQSW50NjQ7Cit0eXBlZGVmIFZpSW50NjQgICAgIF9WSV9QVFIgVmlBSW50NjQ7CisjZW5kaWYKKworI2lmIGRlZmluZWQoTE9OR19NQVgpICYmIChMT05HX01BWCA+IDB4N0ZGRkZGRkZMKQordHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgIFZpVUludDMyOwordHlwZWRlZiBfVklfU0lHTkVEIGludCAgICAgIFZpSW50MzI7CisjZWxzZQordHlwZWRlZiB1bnNpZ25lZCBsb25nICAgICAgIFZpVUludDMyOwordHlwZWRlZiBfVklfU0lHTkVEIGxvbmcgICAgIFZpSW50MzI7CisjZW5kaWYKKwordHlwZWRlZiBWaVVJbnQzMiAgICBfVklfUFRSIFZpUFVJbnQzMjsKK3R5cGVkZWYgVmlVSW50MzIgICAgX1ZJX1BUUiBWaUFVSW50MzI7Cit0eXBlZGVmIFZpSW50MzIgICAgIF9WSV9QVFIgVmlQSW50MzI7Cit0eXBlZGVmIFZpSW50MzIgICAgIF9WSV9QVFIgVmlBSW50MzI7CisKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgICBWaVVJbnQxNjsKK3R5cGVkZWYgVmlVSW50MTYgICAgX1ZJX1BUUiBWaVBVSW50MTY7Cit0eXBlZGVmIFZpVUludDE2ICAgIF9WSV9QVFIgVmlBVUludDE2OworCit0eXBlZGVmIF9WSV9TSUdORUQgc2hvcnQgICAgVmlJbnQxNjsKK3R5cGVkZWYgVmlJbnQxNiAgICAgX1ZJX1BUUiBWaVBJbnQxNjsKK3R5cGVkZWYgVmlJbnQxNiAgICAgX1ZJX1BUUiBWaUFJbnQxNjsKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICAgIFZpVUludDg7Cit0eXBlZGVmIFZpVUludDggICAgIF9WSV9QVFIgVmlQVUludDg7Cit0eXBlZGVmIFZpVUludDggICAgIF9WSV9QVFIgVmlBVUludDg7CisKK3R5cGVkZWYgX1ZJX1NJR05FRCBjaGFyICAgICBWaUludDg7Cit0eXBlZGVmIFZpSW50OCAgICAgIF9WSV9QVFIgVmlQSW50ODsKK3R5cGVkZWYgVmlJbnQ4ICAgICAgX1ZJX1BUUiBWaUFJbnQ4OworCit0eXBlZGVmIGNoYXIgICAgICAgICAgICAgICAgVmlDaGFyOwordHlwZWRlZiBWaUNoYXIgICAgICBfVklfUFRSIFZpUENoYXI7Cit0eXBlZGVmIFZpQ2hhciAgICAgIF9WSV9QVFIgVmlBQ2hhcjsKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICAgIFZpQnl0ZTsKK3R5cGVkZWYgVmlCeXRlICAgICAgX1ZJX1BUUiBWaVBCeXRlOwordHlwZWRlZiBWaUJ5dGUgICAgICBfVklfUFRSIFZpQUJ5dGU7CisKK3R5cGVkZWYgdm9pZCAgICAgICAgX1ZJX1BUUiBWaUFkZHI7Cit0eXBlZGVmIFZpQWRkciAgICAgIF9WSV9QVFIgVmlQQWRkcjsKK3R5cGVkZWYgVmlBZGRyICAgICAgX1ZJX1BUUiBWaUFBZGRyOworCit0eXBlZGVmIGZsb2F0ICAgICAgICAgICAgICAgVmlSZWFsMzI7Cit0eXBlZGVmIFZpUmVhbDMyICAgIF9WSV9QVFIgVmlQUmVhbDMyOwordHlwZWRlZiBWaVJlYWwzMiAgICBfVklfUFRSIFZpQVJlYWwzMjsKKwordHlwZWRlZiBkb3VibGUgICAgICAgICAgICAgIFZpUmVhbDY0OwordHlwZWRlZiBWaVJlYWw2NCAgICBfVklfUFRSIFZpUFJlYWw2NDsKK3R5cGVkZWYgVmlSZWFsNjQgICAgX1ZJX1BUUiBWaUFSZWFsNjQ7CisKK3R5cGVkZWYgVmlQQnl0ZSAgICAgICAgICAgICBWaUJ1ZjsKK3R5cGVkZWYgVmlQQnl0ZSAgICAgICAgICAgICBWaVBCdWY7Cit0eXBlZGVmIFZpUEJ5dGUgICAgIF9WSV9QVFIgVmlBQnVmOworCit0eXBlZGVmIFZpUENoYXIgICAgICAgICAgICAgVmlTdHJpbmc7Cit0eXBlZGVmIFZpUENoYXIgICAgICAgICAgICAgVmlQU3RyaW5nOwordHlwZWRlZiBWaVBDaGFyICAgICBfVklfUFRSIFZpQVN0cmluZzsKKwordHlwZWRlZiBWaVN0cmluZyAgICAgICAgICAgIFZpUnNyYzsKK3R5cGVkZWYgVmlTdHJpbmcgICAgICAgICAgICBWaVBSc3JjOwordHlwZWRlZiBWaVN0cmluZyAgICBfVklfUFRSIFZpQVJzcmM7CisKK3R5cGVkZWYgVmlVSW50MTYgICAgICAgICAgICBWaUJvb2xlYW47Cit0eXBlZGVmIFZpQm9vbGVhbiAgIF9WSV9QVFIgVmlQQm9vbGVhbjsKK3R5cGVkZWYgVmlCb29sZWFuICAgX1ZJX1BUUiBWaUFCb29sZWFuOworCit0eXBlZGVmIFZpSW50MzIgICAgICAgICAgICAgVmlTdGF0dXM7Cit0eXBlZGVmIFZpU3RhdHVzICAgIF9WSV9QVFIgVmlQU3RhdHVzOwordHlwZWRlZiBWaVN0YXR1cyAgICBfVklfUFRSIFZpQVN0YXR1czsKKwordHlwZWRlZiBWaVVJbnQzMiAgICAgICAgICAgIFZpVmVyc2lvbjsKK3R5cGVkZWYgVmlWZXJzaW9uICAgX1ZJX1BUUiBWaVBWZXJzaW9uOwordHlwZWRlZiBWaVZlcnNpb24gICBfVklfUFRSIFZpQVZlcnNpb247CisKK3R5cGVkZWYgVmlVSW50MzIgICAgICAgICAgICBWaU9iamVjdDsKK3R5cGVkZWYgVmlPYmplY3QgICAgX1ZJX1BUUiBWaVBPYmplY3Q7Cit0eXBlZGVmIFZpT2JqZWN0ICAgIF9WSV9QVFIgVmlBT2JqZWN0OworCit0eXBlZGVmIFZpT2JqZWN0ICAgICAgICAgICAgVmlTZXNzaW9uOwordHlwZWRlZiBWaVNlc3Npb24gICBfVklfUFRSIFZpUFNlc3Npb247Cit0eXBlZGVmIFZpU2Vzc2lvbiAgIF9WSV9QVFIgVmlBU2Vzc2lvbjsKKwordHlwZWRlZiBWaVVJbnQzMiAgICAgICAgICAgICBWaUF0dHI7CisKKyNpZm5kZWYgX1ZJX0NPTlNUX1NUUklOR19ERUZJTkVECit0eXBlZGVmIGNvbnN0IFZpQ2hhciAqIFZpQ29uc3RTdHJpbmc7CisjZGVmaW5lIF9WSV9DT05TVF9TVFJJTkdfREVGSU5FRAorI2VuZGlmICAKKworLyotIENvbXBsZXRpb24gYW5kIEVycm9yIENvZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIFZJX1NVQ0NFU1MgICAgICAgICAgKDBMKQorCisvKi0gT3RoZXIgVklTQSBEZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgVklfTlVMTCAgICAgICAgICAgICAoMCkKKworI2RlZmluZSBWSV9UUlVFICAgICAgICAgICAgICgxKQorI2RlZmluZSBWSV9GQUxTRSAgICAgICAgICAgICgwKQorCisvKi0gQmFja3dhcmQgQ29tcGF0aWJpbGl0eSBNYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgVklTQUZOICAgICAgICAgICAgICBfVklfRlVOQworI2RlZmluZSBWaVB0ciAgICAgICAgICAgICAgIF9WSV9QVFIKKworI2VuZGlmCisKKy8qLSBUaGUgRW5kIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2dlbmxpbmtzIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2dlbmxpbmtzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY5MzFkYmMKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvZ2VubGlua3MKQEAgLTAsMCArMSwxMSBAQAorIyEvYmluL2Jhc2gKKworIyB0aGlzIGZpbGUgc2hvdWxkIGdlbmVyYXRlIHN5bWxpbmtzIChQT1NJWCwgVE9ETykgb3IgTEQgc2NyaXB0cyAoUE9TSVggb3Igd2luZG93cykgdG8gZW5hYmxlIHN0YW5kYXJkIHZlcnNpb24gbGlua2luZworCitmb3IgbGliIGluIGxpYiouc28uKjsgZG8KKwlsaWJvdXQ9IiR7bGliJS4qfSIKKwlybSAtcmYgJGxpYm91dAorCWVjaG8gIk9VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKSIgPiAkbGlib3V0CisJZWNobyAiR1JPVVAgKCAkbGliICkiID4+ICRsaWJvdXQKKwllY2hvICJHZW5lcmF0ZWQgTEQgbGluayAkbGlib3V0IC0+ICRsaWIiCitkb25lCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uLnNvIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYkZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjQyMThlCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYkZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbi5zbwpAQCAtMCwwICsxLDIgQEAKK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorR1JPVVAgKCBsaWJGUkNfTmV0d29ya0NvbW11bmljYXRpb24uc28uMSApCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uLnNvLjEgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uLnNvLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFlYzM4YQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJGUkNfTmV0d29ya0NvbW11bmljYXRpb24uc28uMQpAQCAtMCwwICsxLDIgQEAKK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorR1JPVVAgKCBsaWJGUkNfTmV0d29ya0NvbW11bmljYXRpb24uc28uMS41ICkKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJGUkNfTmV0d29ya0NvbW11bmljYXRpb24uc28uMS41IGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYkZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbi5zby4xLjUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ1Yzc1OQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJGUkNfTmV0d29ya0NvbW11bmljYXRpb24uc28uMS41CkBAIC0wLDAgKzEsMiBAQAorT1VUUFVUX0ZPUk1BVChlbGYzMi1saXR0bGVhcm0pCitHUk9VUCAoIGxpYkZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbi5zby4xLjUuMCApCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uLnNvLjEuNS4wIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYkZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbi5zby4xLjUuMApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41MDM5MTFiCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYkZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbi5zby4xLjUuMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uTFYuc28gYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uTFYuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdjMjY1MwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJGUkNfTmV0d29ya0NvbW11bmljYXRpb25MVi5zbwpAQCAtMCwwICsxLDIgQEAKK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorR1JPVVAgKCBsaWJGUkNfTmV0d29ya0NvbW11bmljYXRpb25MVi5zby4xICkKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJGUkNfTmV0d29ya0NvbW11bmljYXRpb25MVi5zby4xIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYkZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbkxWLnNvLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI1NGI2ZAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJGUkNfTmV0d29ya0NvbW11bmljYXRpb25MVi5zby4xCkBAIC0wLDAgKzEsMiBAQAorT1VUUFVUX0ZPUk1BVChlbGYzMi1saXR0bGVhcm0pCitHUk9VUCAoIGxpYkZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbkxWLnNvLjEuNSApCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uTFYuc28uMS41IGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYkZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbkxWLnNvLjEuNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDAyMmRiCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYkZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbkxWLnNvLjEuNQpAQCAtMCwwICsxLDIgQEAKK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorR1JPVVAgKCBsaWJGUkNfTmV0d29ya0NvbW11bmljYXRpb25MVi5zby4xLjUuMCApCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uTFYuc28uMS41LjAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uTFYuc28uMS41LjAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjU0ZDk5NwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJGUkNfTmV0d29ya0NvbW11bmljYXRpb25MVi5zby4xLjUuMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliR0NCYXNlX2djYy00LjQtYXJtX3YyXzMuc28gYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliR0NCYXNlX2djYy00LjQtYXJtX3YyXzMuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2JjZGE4ZAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJHQ0Jhc2VfZ2NjLTQuNC1hcm1fdjJfMy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliR2VuQXBpX2djYy00LjQtYXJtX3YyXzMuc28gYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliR2VuQXBpX2djYy00LjQtYXJtX3YyXzMuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2U2YTZkZgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJHZW5BcGlfZ2NjLTQuNC1hcm1fdjJfMy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliTG9nX2djYy00LjQtYXJtX3YyXzMuc28gYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliTG9nX2djYy00LjQtYXJtX3YyXzMuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmU4NzE5YgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJMb2dfZ2NjLTQuNC1hcm1fdjJfMy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliTWF0aFBhcnNlcl9nY2MtNC40LWFybV92Ml8zLnNvIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYk1hdGhQYXJzZXJfZ2NjLTQuNC1hcm1fdjJfMy5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNGQxMjc5Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYk1hdGhQYXJzZXJfZ2NjLTQuNC1hcm1fdjJfMy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliTmlGcGdhLnNvIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYk5pRnBnYS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTA2NDcwCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYk5pRnBnYS5zbwpAQCAtMCwwICsxLDIgQEAKK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorR1JPVVAgKCBsaWJOaUZwZ2Euc28uMTQgKQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYk5pRnBnYS5zby4xNCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJOaUZwZ2Euc28uMTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I2NmUzZQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJOaUZwZ2Euc28uMTQKQEAgLTAsMCArMSwyIEBACitPVVRQVVRfRk9STUFUKGVsZjMyLWxpdHRsZWFybSkKK0dST1VQICggbGliTmlGcGdhLnNvLjE0LjAgKQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYk5pRnBnYS5zby4xNC4wIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYk5pRnBnYS5zby4xNC4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNGUyODcKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliTmlGcGdhLnNvLjE0LjAKQEAgLTAsMCArMSwyIEBACitPVVRQVVRfRk9STUFUKGVsZjMyLWxpdHRsZWFybSkKK0dST1VQICggbGliTmlGcGdhLnNvLjE0LjAuMCApCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliTmlGcGdhLnNvLjE0LjAuMCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJOaUZwZ2Euc28uMTQuMC4wCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFmM2EyMzcKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliTmlGcGdhLnNvLjE0LjAuMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliTmlGcGdhTHYuc28gYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliTmlGcGdhTHYuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhiNWEyNAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJOaUZwZ2FMdi5zbwpAQCAtMCwwICsxLDIgQEAKK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorR1JPVVAgKCBsaWJOaUZwZ2FMdi5zby4xNCApCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliTmlGcGdhTHYuc28uMTQgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliTmlGcGdhTHYuc28uMTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FkYWUwOQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJOaUZwZ2FMdi5zby4xNApAQCAtMCwwICsxLDIgQEAKK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorR1JPVVAgKCBsaWJOaUZwZ2FMdi5zby4xNC4wICkKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJOaUZwZ2FMdi5zby4xNC4wIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYk5pRnBnYUx2LnNvLjE0LjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIwYjI4YwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJOaUZwZ2FMdi5zby4xNC4wCkBAIC0wLDAgKzEsMiBAQAorT1VUUFVUX0ZPUk1BVChlbGYzMi1saXR0bGVhcm0pCitHUk9VUCAoIGxpYk5pRnBnYUx2LnNvLjE0LjAuMCApCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliTmlGcGdhTHYuc28uMTQuMC4wIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYk5pRnBnYUx2LnNvLjE0LjAuMApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZWZlZThmCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYk5pRnBnYUx2LnNvLjE0LjAuMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliTmlSaW9TcnYuc28gYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliTmlSaW9TcnYuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThiNTViMQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJOaVJpb1Nydi5zbwpAQCAtMCwwICsxLDIgQEAKK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorR1JPVVAgKCBsaWJOaVJpb1Nydi5zby4xNCApCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliTmlSaW9TcnYuc28uMTQgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliTmlSaW9TcnYuc28uMTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY5OGQ1NgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJOaVJpb1Nydi5zby4xNApAQCAtMCwwICsxLDIgQEAKK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorR1JPVVAgKCBsaWJOaVJpb1Nydi5zby4xNC4wICkKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJOaVJpb1Nydi5zby4xNC4wIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYk5pUmlvU3J2LnNvLjE0LjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VlMjA3ZAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJOaVJpb1Nydi5zby4xNC4wCkBAIC0wLDAgKzEsMiBAQAorT1VUUFVUX0ZPUk1BVChlbGYzMi1saXR0bGVhcm0pCitHUk9VUCAoIGxpYk5pUmlvU3J2LnNvLjE0LjAuMCApCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliTmlSaW9TcnYuc28uMTQuMC4wIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYk5pUmlvU3J2LnNvLjE0LjAuMApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40OTE3YWY4Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYk5pUmlvU3J2LnNvLjE0LjAuMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliUm9ib1JJT19GUkNfQ2hpcE9iamVjdC5zbyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJSb2JvUklPX0ZSQ19DaGlwT2JqZWN0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NGRjMDMKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliUm9ib1JJT19GUkNfQ2hpcE9iamVjdC5zbwpAQCAtMCwwICsxLDIgQEAKK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorR1JPVVAgKCBsaWJSb2JvUklPX0ZSQ19DaGlwT2JqZWN0LnNvLjEgKQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYlJvYm9SSU9fRlJDX0NoaXBPYmplY3Quc28uMSBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJSb2JvUklPX0ZSQ19DaGlwT2JqZWN0LnNvLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZmNGY5NwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJSb2JvUklPX0ZSQ19DaGlwT2JqZWN0LnNvLjEKQEAgLTAsMCArMSwyIEBACitPVVRQVVRfRk9STUFUKGVsZjMyLWxpdHRsZWFybSkKK0dST1VQICggbGliUm9ib1JJT19GUkNfQ2hpcE9iamVjdC5zby4xLjIgKQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYlJvYm9SSU9fRlJDX0NoaXBPYmplY3Quc28uMS4yIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYlJvYm9SSU9fRlJDX0NoaXBPYmplY3Quc28uMS4yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2N2ZhMGUKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliUm9ib1JJT19GUkNfQ2hpcE9iamVjdC5zby4xLjIKQEAgLTAsMCArMSwyIEBACitPVVRQVVRfRk9STUFUKGVsZjMyLWxpdHRsZWFybSkKK0dST1VQICggbGliUm9ib1JJT19GUkNfQ2hpcE9iamVjdC5zby4xLjIuMCApCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliUm9ib1JJT19GUkNfQ2hpcE9iamVjdC5zby4xLjIuMCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJSb2JvUklPX0ZSQ19DaGlwT2JqZWN0LnNvLjEuMi4wCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMxNmJkY2UKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliUm9ib1JJT19GUkNfQ2hpcE9iamVjdC5zby4xLjIuMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliaTJjLnNvIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYmkyYy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzNjYTM3Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYmkyYy5zbwpAQCAtMCwwICsxLDIgQEAKK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorR1JPVVAgKCBsaWJpMmMuc28uMSApCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliaTJjLnNvLjEgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliaTJjLnNvLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEwNzU4YgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJpMmMuc28uMQpAQCAtMCwwICsxLDIgQEAKK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorR1JPVVAgKCBsaWJpMmMuc28uMS4wICkKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJpMmMuc28uMS4wIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYmkyYy5zby4xLjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhjNTg5MAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJpMmMuc28uMS4wCkBAIC0wLDAgKzEsMiBAQAorT1VUUFVUX0ZPUk1BVChlbGYzMi1saXR0bGVhcm0pCitHUk9VUCAoIGxpYmkyYy5zby4xLjAuMCApCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliaTJjLnNvLjEuMC4wIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYmkyYy5zby4xLjAuMApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNDc0MGNhCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYmkyYy5zby4xLjAuMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibG9nNGNwcF9nY2MtNC40LWFybV92Ml8zLnNvIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYmxvZzRjcHBfZ2NjLTQuNC1hcm1fdjJfMy5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40NmY2NzgwCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYmxvZzRjcHBfZ2NjLTQuNC1hcm1fdjJfMy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibmlfZW1iLnNvIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5pX2VtYi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzY3OGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5pX2VtYi5zbwpAQCAtMCwwICsxLDIgQEAKK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorR1JPVVAgKCBsaWJuaV9lbWIuc28uNyApCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibmlfZW1iLnNvLjcgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibmlfZW1iLnNvLjcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE3MDNiNwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaV9lbWIuc28uNwpAQCAtMCwwICsxLDIgQEAKK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorR1JPVVAgKCBsaWJuaV9lbWIuc28uNy4wICkKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaV9lbWIuc28uNy4wIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5pX2VtYi5zby43LjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE1MmMzNgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaV9lbWIuc28uNy4wCkBAIC0wLDAgKzEsMiBAQAorT1VUUFVUX0ZPUk1BVChlbGYzMi1saXR0bGVhcm0pCitHUk9VUCAoIGxpYm5pX2VtYi5zby43LjAuMCApCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibmlfZW1iLnNvLjcuMC4wIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5pX2VtYi5zby43LjAuMApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNjNiODUyCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5pX2VtYi5zby43LjAuMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibmlfcnRsb2cuc28gYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibmlfcnRsb2cuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA0NTY4MQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaV9ydGxvZy5zbwpAQCAtMCwwICsxLDIgQEAKK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorR1JPVVAgKCBsaWJuaV9ydGxvZy5zby4yICkKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaV9ydGxvZy5zby4yIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5pX3J0bG9nLnNvLjIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdmYzE5MwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaV9ydGxvZy5zby4yCkBAIC0wLDAgKzEsMiBAQAorT1VUUFVUX0ZPUk1BVChlbGYzMi1saXR0bGVhcm0pCitHUk9VUCAoIGxpYm5pX3J0bG9nLnNvLjIuMyApCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibmlfcnRsb2cuc28uMi4zIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5pX3J0bG9nLnNvLjIuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjczODY3Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5pX3J0bG9nLnNvLjIuMwpAQCAtMCwwICsxLDIgQEAKK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorR1JPVVAgKCBsaWJuaV9ydGxvZy5zby4yLjMuMCApCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibmlfcnRsb2cuc28uMi4zLjAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibmlfcnRsb2cuc28uMi4zLjAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmQ2ZDZhZQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaV9ydGxvZy5zby4yLjMuMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibmlpbWFxZHguc28gYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibmlpbWFxZHguc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ5N2NlNwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaWltYXFkeC5zbwpAQCAtMCwwICsxLDIgQEAKK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorR1JPVVAgKCBsaWJuaWltYXFkeC5zby4xNCApCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibmlpbWFxZHguc28uMTQgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibmlpbWFxZHguc28uMTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVkZWE5MgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaWltYXFkeC5zby4xNApAQCAtMCwwICsxLDIgQEAKK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorR1JPVVAgKCBsaWJuaWltYXFkeC5zby4xNC4wICkKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaWltYXFkeC5zby4xNC4wIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5paW1hcWR4LnNvLjE0LjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJiNjQyZQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaWltYXFkeC5zby4xNC4wCkBAIC0wLDAgKzEsMiBAQAorT1VUUFVUX0ZPUk1BVChlbGYzMi1saXR0bGVhcm0pCitHUk9VUCAoIGxpYm5paW1hcWR4LnNvLjE0LjAuMCApCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibmlpbWFxZHguc28uMTQuMC4wIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5paW1hcWR4LnNvLjE0LjAuMApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yN2NkMTg4Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5paW1hcWR4LnNvLjE0LjAuMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibmlyaW9fZW1iX2Nhbi5zbyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaXJpb19lbWJfY2FuLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYjgxMzMKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibmlyaW9fZW1iX2Nhbi5zbwpAQCAtMCwwICsxLDIgQEAKK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorR1JPVVAgKCBsaWJuaXJpb19lbWJfY2FuLnNvLjE0ICkKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaXJpb19lbWJfY2FuLnNvLjE0IGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5pcmlvX2VtYl9jYW4uc28uMTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA1NDhkNwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaXJpb19lbWJfY2FuLnNvLjE0CkBAIC0wLDAgKzEsMiBAQAorT1VUUFVUX0ZPUk1BVChlbGYzMi1saXR0bGVhcm0pCitHUk9VUCAoIGxpYm5pcmlvX2VtYl9jYW4uc28uMTQuMCApCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibmlyaW9fZW1iX2Nhbi5zby4xNC4wIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5pcmlvX2VtYl9jYW4uc28uMTQuMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGU4MzZmCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5pcmlvX2VtYl9jYW4uc28uMTQuMApAQCAtMCwwICsxLDIgQEAKK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorR1JPVVAgKCBsaWJuaXJpb19lbWJfY2FuLnNvLjE0LjAuMCApCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibmlyaW9fZW1iX2Nhbi5zby4xNC4wLjAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibmlyaW9fZW1iX2Nhbi5zby4xNC4wLjAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2UwNGVhOAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaXJpb19lbWJfY2FuLnNvLjE0LjAuMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibml2aXNpb24uc28gYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibml2aXNpb24uc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdjMGM1NwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaXZpc2lvbi5zbwpAQCAtMCwwICsxLDIgQEAKK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorR1JPVVAgKCBsaWJuaXZpc2lvbi5zby4xNCApCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibml2aXNpb24uc28uMTQgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibml2aXNpb24uc28uMTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMwNjk0NAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaXZpc2lvbi5zby4xNApAQCAtMCwwICsxLDIgQEAKK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorR1JPVVAgKCBsaWJuaXZpc2lvbi5zby4xNC4wICkKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaXZpc2lvbi5zby4xNC4wIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5pdmlzaW9uLnNvLjE0LjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E0ZDI2MwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaXZpc2lvbi5zby4xNC4wCkBAIC0wLDAgKzEsMiBAQAorT1VUUFVUX0ZPUk1BVChlbGYzMi1saXR0bGVhcm0pCitHUk9VUCAoIGxpYm5pdmlzaW9uLnNvLjE0LjAuMCApCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibml2aXNpb24uc28uMTQuMC4wIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5pdmlzaW9uLnNvLjE0LjAuMApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMGE0ODEwCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5pdmlzaW9uLnNvLjE0LjAuMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibml2aXNzdmMuc28gYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibml2aXNzdmMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBiYmQ0OAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaXZpc3N2Yy5zbwpAQCAtMCwwICsxLDIgQEAKK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorR1JPVVAgKCBsaWJuaXZpc3N2Yy5zby4xNCApCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibml2aXNzdmMuc28uMTQgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibml2aXNzdmMuc28uMTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA1Y2MzNQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaXZpc3N2Yy5zby4xNApAQCAtMCwwICsxLDIgQEAKK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorR1JPVVAgKCBsaWJuaXZpc3N2Yy5zby4xNC4wICkKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaXZpc3N2Yy5zby4xNC4wIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5pdmlzc3ZjLnNvLjE0LjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZmZmQ0MgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaXZpc3N2Yy5zby4xNC4wCkBAIC0wLDAgKzEsMiBAQAorT1VUUFVUX0ZPUk1BVChlbGYzMi1saXR0bGVhcm0pCitHUk9VUCAoIGxpYm5pdmlzc3ZjLnNvLjE0LjAuMCApCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibml2aXNzdmMuc28uMTQuMC4wIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5pdmlzc3ZjLnNvLjE0LjAuMApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ODA1NzhkCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5pdmlzc3ZjLnNvLjE0LjAuMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlic3BpLnNvIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYnNwaS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzc2MDZmCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYnNwaS5zbwpAQCAtMCwwICsxLDIgQEAKK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorR1JPVVAgKCBsaWJzcGkuc28uMSApCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlic3BpLnNvLjEgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlic3BpLnNvLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFhMDYzMgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJzcGkuc28uMQpAQCAtMCwwICsxLDIgQEAKK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorR1JPVVAgKCBsaWJzcGkuc28uMS4wICkKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJzcGkuc28uMS4wIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYnNwaS5zby4xLjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYwMTZkZgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJzcGkuc28uMS4wCkBAIC0wLDAgKzEsMiBAQAorT1VUUFVUX0ZPUk1BVChlbGYzMi1saXR0bGVhcm0pCitHUk9VUCAoIGxpYnNwaS5zby4xLjAuMCApCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlic3BpLnNvLjEuMC4wIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYnNwaS5zby4xLjAuMApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ZjY5ZjMxCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYnNwaS5zby4xLjAuMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlidmlzYS5zbyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJ2aXNhLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRjYTcxMWMKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlidmlzYS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlid3BpLnNvIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYndwaS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjlmZjgwCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYndwaS5zbwpAQCAtMCwwICsxLDMgQEAKKy8qIEdOVSBsZCBzY3JpcHQgKi8KK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorSU5QVVQgKCAtbHdwaV8yMDE1ICkKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJ3cGlfMjAxNS5zbyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJ3cGlfMjAxNS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTg5YWYyCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYndwaV8yMDE1LnNvCkBAIC0wLDAgKzEsMyBAQAorLyogR05VIGxkIHNjcmlwdCAqLworT1VUUFVUX0ZPUk1BVChlbGYzMi1saXR0bGVhcm0pCitHUk9VUCAoIEFTX05FRURFRCAoIC1sd3BpbGliX25vbnNoYXJlZCAtbEhBTEF0aGVuYSAtbE5ldHdvcmtUYWJsZXMgLWxGUkNfTmV0d29ya0NvbW11bmljYXRpb24gLWxpMmMgLWxuaV9lbWIgLWxOaUZwZ2FMdiAtbE5pRnBnYSAtbG5pcmlvX2VtYl9jYW4gLWxOaVJpb1NydiAtbG5pX3J0bG9nIC1sUm9ib1JJT19GUkNfQ2hpcE9iamVjdCAtbHNwaSAtbHZpc2EgLWxkbCAtbHB0aHJlYWQgLWxydCAtbEdDQmFzZV9nY2MtNC40LWFybV92Ml8zIC1sR2VuQXBpX2djYy00LjQtYXJtX3YyXzMgLWxMb2dfZ2NjLTQuNC1hcm1fdjJfMyAtbE1hdGhQYXJzZXJfZ2NjLTQuNC1hcm1fdjJfMyAtbGxvZzRjcHBfZ2NjLTQuNC1hcm1fdjJfMyAtbG5paW1hcWR4IC1sbml2aXNpb24gLWxuaXZpc3N2YyApICkKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3N5bmMuc2ggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9zeW5jLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhlMDUyMzMKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9zeW5jLnNoCkBAIC0wLDAgKzEsMjAgQEAKKyMhL2Jpbi9iYXNoIC1lCisKKyMgVGhpcyBzY3JpcHQgY29waWVzIHRoZSBjb3JyZWN0IGRpcmVjdG9yaWVzIG92ZXIgZnJvbSBhbiBhbGx3cGlsaWIgZ2l0CisjIHJlcG9zaXRvcnkgKHdoaWNoIG5lZWRzIHRvIGhhdmUgYSB3b3JraW5nIHRyZWUpLgorIyBUSElTIFdJTEwgRVJBU0UgQU5ZIExPQ0FMIENIQU5HRVMgVE8gVEhFIFdQSUxJQiBTT1VSQ0VTIQorCisjIFRha2VzIDEgYXJndW1lbnQ6IHRoZSBmb2xkZXIgdG8gY29weSBmcm9tLgorCitjZCAkKGRpcm5hbWUgJDApCisKK1NPVVJDRT0kMQorRElSUz0id3BpbGliYyBoYWwgbmktbGlicmFyaWVzIgorCitbIC1uICIke1NPVVJDRX0iIF0gfHwgKCBlY2hvICJOZWVkIGEgZGlyZWN0b3J5IHRvIHN5bmMgZnJvbSEiIDsgZXhpdCAxICkKK1sgLWQgIiR7U09VUkNFfSIgXSB8fCAoIGVjaG8gIiR7U09VUkNFfSBpcyBub3QgYSBkaXJlY3RvcnkuIEFib3J0aW5nISIgOyBleGl0IDEgKQorCitmb3IgZGlyIGluICR7RElSU307IGRvCisJWyAtZCAke2Rpcn0gXSAmJiBybSAtciAke2Rpcn0KKwljcCAtciAke1NPVVJDRX0vJHtkaXJ9IC4vCitkb25lCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL0NNYWtlTGlzdHMudHh0IGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTRhN2VmCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDUgQEAKK2NtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lPTiAyLjgpCitwcm9qZWN0KFdQSUxpYkMpCisKK2FkZF9zdWJkaXJlY3Rvcnkod3BpbGliQysrKQorYWRkX3N1YmRpcmVjdG9yeSh3cGlsaWJDKytEZXZpY2VzKQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvQ01ha2VMaXN0cy50eHQgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWYzZmM5Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw1IEBACitjbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMi44KQorcHJvamVjdChXUElMaWJDKyspCisKK0lOU1RBTEwoRElSRUNUT1JZIGluY2x1ZGUgREVTVElOQVRJT04gJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0gQ09NUE9ORU5UIGhlYWRlcnMpCisKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL2luY2x1ZGUvQmFzZS5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvaW5jbHVkZS9CYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQwNzNlOAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL2luY2x1ZGUvQmFzZS5oCkBAIC0wLDAgKzEsMTIgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKy8vIEEgbWFjcm8gdG8gZGlzYWxsb3cgdGhlIGNvcHkgY29uc3RydWN0b3IgYW5kIG9wZXJhdG9yPSBmdW5jdGlvbnMKKy8vIFRoaXMgc2hvdWxkIGJlIHVzZWQgaW4gdGhlIHByaXZhdGU6IGRlY2xhcmF0aW9ucyBmb3IgYSBjbGFzcworI2RlZmluZSBESVNBTExPV19DT1BZX0FORF9BU1NJR04oVHlwZU5hbWUpIFwKKyAgVHlwZU5hbWUoY29uc3QgVHlwZU5hbWUmKSA9IGRlbGV0ZTsgICAgICBcCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFR5cGVOYW1lJikgPSBkZWxldGUKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL2luY2x1ZGUvQ29udHJvbGxlci5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvaW5jbHVkZS9Db250cm9sbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTllYmE4OAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL2luY2x1ZGUvQ29udHJvbGxlci5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c2VtYXBob3JlLmg+CisKKy8qKgorICogSW50ZXJmYWNlIGZvciBDb250cm9sbGVycworICogQ29tbW9uIGludGVyZmFjZSBmb3IgY29udHJvbGxlcnMuIENvbnRyb2xsZXJzIHJ1biBjb250cm9sIGxvb3BzLCB0aGUgbW9zdCBjb21tb24KKyAqIGFyZSBQSUQgY29udHJvbGxlcnMgYW5kIHRoZWlyIHZhcmlhbnRzLCBidXQgdGhpcyBpbmNsdWRlcyBhbnl0aGluZyB0aGF0IGlzIGNvbnRyb2xsaW5nCisgKiBhbiBhY3R1YXRvciBpbiBhIHNlcGFyYXRlIHRocmVhZC4KKyAqLworY2xhc3MgQ29udHJvbGxlcgoreworcHVibGljOgorCXZpcnR1YWwgfkNvbnRyb2xsZXIoKSB7fTsKKwkKKwkvKioKKwkgKiBBbGxvd3MgdGhlIGNvbnRyb2wgbG9vcCB0byBydW4KKwkgKi8KKwl2aXJ0dWFsIHZvaWQgRW5hYmxlKCkgPSAwOworCQorCS8qKiAKKwkgKiBTdG9wcyB0aGUgY29udHJvbCBsb29wIGZyb20gcnVubmluZyB1bnRpbCBleHBsaWNpdGx5IHJlLWVuYWJsZWQgYnkgY2FsbGluZyBlbmFibGUoKQorCSAqLworCXZpcnR1YWwgdm9pZCBEaXNhYmxlKCkgPSAwOworfTsKKwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvaW5jbHVkZS9FcnJvci5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvaW5jbHVkZS9FcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYmUwZjAKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9pbmNsdWRlL0Vycm9yLmgKQEAgLTAsMCArMSw1NCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJCYXNlLmgiCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyAgRm9yd2FyZCBkZWNsYXJhdGlvbnMKK2NsYXNzIEVycm9yQmFzZTsKKworLyoqCisgKiBFcnJvciBvYmplY3QgcmVwcmVzZW50cyBhIGxpYnJhcnkgZXJyb3IuCisgKi8KK2NsYXNzIEVycm9yCit7CitwdWJsaWM6CisJdHlwZWRlZiBpbnQzMl90IENvZGU7CisKKwlFcnJvcigpOworCX5FcnJvcigpOworCXZvaWQgQ2xvbmUoRXJyb3IgJmVycm9yKTsKKwlDb2RlIEdldENvZGUoKSBjb25zdDsKKwljb25zdCBjaGFyICpHZXRNZXNzYWdlKCkgY29uc3Q7CisJY29uc3QgY2hhciAqR2V0RmlsZW5hbWUoKSBjb25zdDsKKwljb25zdCBjaGFyICpHZXRGdW5jdGlvbigpIGNvbnN0OworCXVpbnQzMl90IEdldExpbmVOdW1iZXIoKSBjb25zdDsKKwljb25zdCBFcnJvckJhc2UqIEdldE9yaWdpbmF0aW5nT2JqZWN0KCkgY29uc3Q7CisJZG91YmxlIEdldFRpbWVzdGFtcCgpIGNvbnN0OworCXZvaWQgQ2xlYXIoKTsKKwl2b2lkIFNldChDb2RlIGNvZGUsIGNvbnN0IGNoYXIqIGNvbnRleHRNZXNzYWdlLCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgY29uc3QgY2hhciAqZnVuY3Rpb24sCisJCQl1aW50MzJfdCBsaW5lTnVtYmVyLCBjb25zdCBFcnJvckJhc2UqIG9yaWdpbmF0aW5nT2JqZWN0KTsKKwlzdGF0aWMgdm9pZCBFbmFibGVTdXNwZW5kT25FcnJvcihib29sIGVuYWJsZSkKKwl7CisJCW1fc3VzcGVuZE9uRXJyb3JFbmFibGVkID0gZW5hYmxlOworCX0KKworcHJpdmF0ZToKKwl2b2lkIFJlcG9ydCgpOworCisJQ29kZSBtX2NvZGU7CisJc3RkOjpzdHJpbmcgbV9tZXNzYWdlOworCXN0ZDo6c3RyaW5nIG1fZmlsZW5hbWU7CisJc3RkOjpzdHJpbmcgbV9mdW5jdGlvbjsKKwl1aW50MzJfdCBtX2xpbmVOdW1iZXI7CisJY29uc3QgRXJyb3JCYXNlKiBtX29yaWdpbmF0aW5nT2JqZWN0OworCWRvdWJsZSBtX3RpbWVzdGFtcDsKKworCXN0YXRpYyBib29sIG1fc3VzcGVuZE9uRXJyb3JFbmFibGVkOworICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihFcnJvcik7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvaW5jbHVkZS9FcnJvckJhc2UuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL2luY2x1ZGUvRXJyb3JCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRlOTE2NAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL2luY2x1ZGUvRXJyb3JCYXNlLmgKQEAgLTAsMCArMSw2NCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJCYXNlLmgiCisjaW5jbHVkZSAiRXJyb3IuaCIKKyNpbmNsdWRlICJIQUwvY3BwL1N5bmNocm9uaXplZC5ocHAiCisKKyNkZWZpbmUgd3BpX3NldEVycm5vRXJyb3JXaXRoQ29udGV4dChjb250ZXh0KSAgICh0aGlzLT5TZXRFcnJub0Vycm9yKChjb250ZXh0KSwgX19GSUxFX18sIF9fRlVOQ1RJT05fXywgX19MSU5FX18pKQorI2RlZmluZSB3cGlfc2V0RXJybm9FcnJvcigpICAgKHdwaV9zZXRFcnJub0Vycm9yV2l0aENvbnRleHQoIiIpKQorI2RlZmluZSB3cGlfc2V0SW1hcUVycm9yV2l0aENvbnRleHQoY29kZSwgY29udGV4dCkgICAodGhpcy0+U2V0SW1hcUVycm9yKChjb2RlKSwgKGNvbnRleHQpLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBfX0xJTkVfXykpCisjZGVmaW5lIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KGNvZGUsIGNvbnRleHQpICAgKHRoaXMtPlNldEVycm9yKChjb2RlKSwgKGNvbnRleHQpLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBfX0xJTkVfXykpCisjZGVmaW5lIHdwaV9zZXRFcnJvcihjb2RlKSAgICh3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChjb2RlLCAiIikpCisjZGVmaW5lIHdwaV9zZXRTdGF0aWNFcnJvcldpdGhDb250ZXh0KG9iamVjdCwgY29kZSwgY29udGV4dCkgICAob2JqZWN0LT5TZXRFcnJvcigoY29kZSksIChjb250ZXh0KSwgX19GSUxFX18sIF9fRlVOQ1RJT05fXywgX19MSU5FX18pKQorI2RlZmluZSB3cGlfc2V0U3RhdGljRXJyb3Iob2JqZWN0LCBjb2RlKSAgICh3cGlfc2V0U3RhdGljRXJyb3JXaXRoQ29udGV4dChvYmplY3QsIGNvZGUsICIiKSkKKyNkZWZpbmUgd3BpX3NldEdsb2JhbEVycm9yV2l0aENvbnRleHQoY29kZSwgY29udGV4dCkgICAoRXJyb3JCYXNlOjpTZXRHbG9iYWxFcnJvcigoY29kZSksIChjb250ZXh0KSwgX19GSUxFX18sIF9fRlVOQ1RJT05fXywgX19MSU5FX18pKQorI2RlZmluZSB3cGlfc2V0R2xvYmFsRXJyb3IoY29kZSkgICAod3BpX3NldEdsb2JhbEVycm9yV2l0aENvbnRleHQoY29kZSwgIiIpKQorI2RlZmluZSB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChlcnJvciwgY29udGV4dCkgICAodGhpcy0+U2V0V1BJRXJyb3IoKHdwaV9lcnJvcl9zXyMjZXJyb3IpLCAod3BpX2Vycm9yX3ZhbHVlXyMjZXJyb3IpLCAoY29udGV4dCksIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKSkKKyNkZWZpbmUgd3BpX3NldFdQSUVycm9yKGVycm9yKSAgICh3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChlcnJvciwgIiIpKQorI2RlZmluZSB3cGlfc2V0U3RhdGljV1BJRXJyb3JXaXRoQ29udGV4dChvYmplY3QsIGVycm9yLCBjb250ZXh0KSAgIChvYmplY3QtPlNldFdQSUVycm9yKCh3cGlfZXJyb3Jfc18jI2Vycm9yKSwgKGNvbnRleHQpLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBfX0xJTkVfXykpCisjZGVmaW5lIHdwaV9zZXRTdGF0aWNXUElFcnJvcihvYmplY3QsIGVycm9yKSAgICh3cGlfc2V0U3RhdGljV1BJRXJyb3JXaXRoQ29udGV4dChvYmplY3QsIGVycm9yLCAiIikpCisjZGVmaW5lIHdwaV9zZXRHbG9iYWxXUElFcnJvcldpdGhDb250ZXh0KGVycm9yLCBjb250ZXh0KSAgIChFcnJvckJhc2U6OlNldEdsb2JhbFdQSUVycm9yKCh3cGlfZXJyb3Jfc18jI2Vycm9yKSwgKGNvbnRleHQpLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBfX0xJTkVfXykpCisjZGVmaW5lIHdwaV9zZXRHbG9iYWxXUElFcnJvcihlcnJvcikgICAod3BpX3NldEdsb2JhbFdQSUVycm9yV2l0aENvbnRleHQoZXJyb3IsICIiKSkKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciBtb3N0IG9iamVjdHMuCisgKiBFcnJvckJhc2UgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIG1vc3Qgb2JqZWN0cyBzaW5jZSBpdCBob2xkcyB0aGUgZ2VuZXJhdGVkIGVycm9yCisgKiBmb3IgdGhhdCBvYmplY3QuIEluIGFkZGl0aW9uLCB0aGVyZSBpcyBhIHNpbmdsZSBpbnN0YW5jZSBvZiBhIGdsb2JhbCBlcnJvciBvYmplY3QKKyAqLworY2xhc3MgRXJyb3JCYXNlCit7CisvL1RPRE86IENvbnNpZGVyIGluaXRpYWxpemluZyBpbnN0YW5jZSB2YXJpYWJsZXMgYW5kIGNsZWFudXAgaW4gZGVzdHJ1Y3RvcgorcHVibGljOgorCXZpcnR1YWwgfkVycm9yQmFzZSgpOworCXZpcnR1YWwgRXJyb3ImIEdldEVycm9yKCk7CisJdmlydHVhbCBjb25zdCBFcnJvciYgR2V0RXJyb3IoKSBjb25zdDsKKwl2aXJ0dWFsIHZvaWQgU2V0RXJybm9FcnJvcihjb25zdCBjaGFyICpjb250ZXh0TWVzc2FnZSwgY29uc3QgY2hhciogZmlsZW5hbWUsCisJCQljb25zdCBjaGFyKiBmdW5jdGlvbiwgdWludDMyX3QgbGluZU51bWJlcikgY29uc3Q7CisJdmlydHVhbCB2b2lkIFNldEltYXFFcnJvcihpbnQgc3VjY2VzcywgY29uc3QgY2hhciAqY29udGV4dE1lc3NhZ2UsIGNvbnN0IGNoYXIqIGZpbGVuYW1lLAorCQkJY29uc3QgY2hhciogZnVuY3Rpb24sIHVpbnQzMl90IGxpbmVOdW1iZXIpIGNvbnN0OworCXZpcnR1YWwgdm9pZCBTZXRFcnJvcihFcnJvcjo6Q29kZSBjb2RlLCBjb25zdCBjaGFyICpjb250ZXh0TWVzc2FnZSwgY29uc3QgY2hhciogZmlsZW5hbWUsCisJCQljb25zdCBjaGFyKiBmdW5jdGlvbiwgdWludDMyX3QgbGluZU51bWJlcikgY29uc3Q7CisJdmlydHVhbCB2b2lkIFNldFdQSUVycm9yKGNvbnN0IGNoYXIgKmVycm9yTWVzc2FnZSwgRXJyb3I6OkNvZGUgY29kZSwgY29uc3QgY2hhciAqY29udGV4dE1lc3NhZ2UsCisJCQljb25zdCBjaGFyKiBmaWxlbmFtZSwgY29uc3QgY2hhciogZnVuY3Rpb24sIHVpbnQzMl90IGxpbmVOdW1iZXIpIGNvbnN0OworCXZpcnR1YWwgdm9pZCBDbG9uZUVycm9yKEVycm9yQmFzZSAqcmhzKSBjb25zdDsKKwl2aXJ0dWFsIHZvaWQgQ2xlYXJFcnJvcigpIGNvbnN0OworCXZpcnR1YWwgYm9vbCBTdGF0dXNJc0ZhdGFsKCkgY29uc3Q7CisJc3RhdGljIHZvaWQgU2V0R2xvYmFsRXJyb3IoRXJyb3I6OkNvZGUgY29kZSwgY29uc3QgY2hhciAqY29udGV4dE1lc3NhZ2UsIGNvbnN0IGNoYXIqIGZpbGVuYW1lLAorCQkJY29uc3QgY2hhciogZnVuY3Rpb24sIHVpbnQzMl90IGxpbmVOdW1iZXIpOworCXN0YXRpYyB2b2lkIFNldEdsb2JhbFdQSUVycm9yKGNvbnN0IGNoYXIgKmVycm9yTWVzc2FnZSwgY29uc3QgY2hhciAqY29udGV4dE1lc3NhZ2UsCisJCQljb25zdCBjaGFyKiBmaWxlbmFtZSwgY29uc3QgY2hhciogZnVuY3Rpb24sIHVpbnQzMl90IGxpbmVOdW1iZXIpOworCXN0YXRpYyBFcnJvciYgR2V0R2xvYmFsRXJyb3IoKTsKK3Byb3RlY3RlZDoKKwltdXRhYmxlIEVycm9yIG1fZXJyb3I7CisJLy8gVE9ETzogUmVwbGFjZSBnbG9iYWxFcnJvciB3aXRoIGEgZ2xvYmFsIGxpc3Qgb2YgYWxsIGVycm9ycy4KKwlzdGF0aWMgTXV0ZXggX2dsb2JhbEVycm9yTXV0ZXg7CisJc3RhdGljIEVycm9yIF9nbG9iYWxFcnJvcjsKKwlFcnJvckJhc2UoKTsKK3ByaXZhdGU6CisJRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEVycm9yQmFzZSk7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvaW5jbHVkZS9HZW5lcmljSElELmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9pbmNsdWRlL0dlbmVyaWNISUQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjhkZmRlCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvaW5jbHVkZS9HZW5lcmljSElELmgKQEAgLTAsMCArMSwzOCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyoqIEdlbmVyaWNISUQgSW50ZXJmYWNlCisgKi8KK2NsYXNzIEdlbmVyaWNISUQKK3sKK3B1YmxpYzoKKwllbnVtIEpveXN0aWNrSGFuZAorCXsKKwkJa0xlZnRIYW5kID0gMCwKKwkJa1JpZ2h0SGFuZCA9IDEKKwl9OworCisJdmlydHVhbCB+R2VuZXJpY0hJRCgpCisJeworCX0KKworCXZpcnR1YWwgZmxvYXQgR2V0WChKb3lzdGlja0hhbmQgaGFuZCA9IGtSaWdodEhhbmQpID0gMDsKKwl2aXJ0dWFsIGZsb2F0IEdldFkoSm95c3RpY2tIYW5kIGhhbmQgPSBrUmlnaHRIYW5kKSA9IDA7CisJdmlydHVhbCBmbG9hdCBHZXRaKCkgPSAwOworCXZpcnR1YWwgZmxvYXQgR2V0VHdpc3QoKSA9IDA7CisJdmlydHVhbCBmbG9hdCBHZXRUaHJvdHRsZSgpID0gMDsKKwl2aXJ0dWFsIGZsb2F0IEdldFJhd0F4aXModWludDMyX3QgYXhpcykgPSAwOworCisJdmlydHVhbCBib29sIEdldFRyaWdnZXIoSm95c3RpY2tIYW5kIGhhbmQgPSBrUmlnaHRIYW5kKSA9IDA7CisJdmlydHVhbCBib29sIEdldFRvcChKb3lzdGlja0hhbmQgaGFuZCA9IGtSaWdodEhhbmQpID0gMDsKKwl2aXJ0dWFsIGJvb2wgR2V0QnVtcGVyKEpveXN0aWNrSGFuZCBoYW5kID0ga1JpZ2h0SGFuZCkgPSAwOworCXZpcnR1YWwgYm9vbCBHZXRSYXdCdXR0b24odWludDMyX3QgYnV0dG9uKSA9IDA7CisKKwl2aXJ0dWFsIGludCBHZXRQT1YodWludDMyX3QgcG92ID0gMCkgPSAwOworfTsKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL2luY2x1ZGUvSExVc2FnZVJlcG9ydGluZy5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvaW5jbHVkZS9ITFVzYWdlUmVwb3J0aW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU5YjE0OQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL2luY2x1ZGUvSExVc2FnZVJlcG9ydGluZy5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKK2NsYXNzIEhMVXNhZ2VSZXBvcnRpbmdJbnRlcmZhY2UKK3sKK3B1YmxpYzoKKwl2aXJ0dWFsIH5ITFVzYWdlUmVwb3J0aW5nSW50ZXJmYWNlKCkge307CisJdmlydHVhbCB2b2lkIFJlcG9ydFNjaGVkdWxlcigpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgUmVwb3J0U21hcnREYXNoYm9hcmQoKSA9IDA7Cit9OworCitjbGFzcyBITFVzYWdlUmVwb3J0aW5nCit7Citwcml2YXRlOgorCXN0YXRpYyBITFVzYWdlUmVwb3J0aW5nSW50ZXJmYWNlKiBpbXBsOworCQorcHVibGljOgorCXN0YXRpYyB2b2lkIFNldEltcGxlbWVudGF0aW9uKEhMVXNhZ2VSZXBvcnRpbmdJbnRlcmZhY2UqIGkpOworCXN0YXRpYyB2b2lkIFJlcG9ydFNjaGVkdWxlcigpOworICAgIHN0YXRpYyB2b2lkIFJlcG9ydFNtYXJ0RGFzaGJvYXJkKCk7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvaW5jbHVkZS9Ob3RpZmllci5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvaW5jbHVkZS9Ob3RpZmllci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NzllNjcKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9pbmNsdWRlL05vdGlmaWVyLmgKQEAgLTAsMCArMSw0NSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJFcnJvckJhc2UuaCIKKyNpbmNsdWRlICJUYXNrLmgiCisjaW5jbHVkZSAiSEFML2NwcC9TeW5jaHJvbml6ZWQuaHBwIgorCit0eXBlZGVmIHZvaWQgKCpUaW1lckV2ZW50SGFuZGxlcikodm9pZCAqcGFyYW0pOworCitjbGFzcyBOb3RpZmllciA6IHB1YmxpYyBFcnJvckJhc2UKK3sKK3B1YmxpYzoKKwlOb3RpZmllcihUaW1lckV2ZW50SGFuZGxlciBoYW5kbGVyLCB2b2lkICpwYXJhbSA9IE5VTEwpOworCXZpcnR1YWwgfk5vdGlmaWVyKCk7CisJdm9pZCBTdGFydFNpbmdsZShkb3VibGUgZGVsYXkpOworCXZvaWQgU3RhcnRQZXJpb2RpYyhkb3VibGUgcGVyaW9kKTsKKwl2b2lkIFN0b3AoKTsKK3ByaXZhdGU6CisJc3RhdGljIE5vdGlmaWVyICp0aW1lclF1ZXVlSGVhZDsKKwlzdGF0aWMgUmVlbnRyYW50TXV0ZXggcXVldWVTZW1hcGhvcmU7CisJc3RhdGljIHZvaWQqIG1fbm90aWZpZXI7CisJc3RhdGljIGludCByZWZjb3VudDsKKworCXN0YXRpYyB2b2lkIFByb2Nlc3NRdWV1ZSh1aW50MzJfdCBtYXNrLCB2b2lkICpwYXJhbXMpOyAvLyBwcm9jZXNzIHRoZSB0aW1lciBxdWV1ZSBvbiBhIHRpbWVyIGV2ZW50CisJc3RhdGljIHZvaWQgVXBkYXRlQWxhcm0oKTsJCQkvLyB1cGRhdGUgdGhlIEZQR0EgYWxhcm0gc2luY2UgdGhlIHF1ZXVlIGhhcyBjaGFuZ2VkCisJdm9pZCBJbnNlcnRJblF1ZXVlKGJvb2wgcmVzY2hlZHVsZSk7CS8vIGluc2VydCB0aGlzIE5vdGlmaWVyIGluIHRoZSB0aW1lciBxdWV1ZQorCXZvaWQgRGVsZXRlRnJvbVF1ZXVlKCk7CQkJCS8vIGRlbGV0ZSB0aGlzIE5vdGlmaWVyIGZyb20gdGhlIHRpbWVyIHF1ZXVlCisJVGltZXJFdmVudEhhbmRsZXIgbV9oYW5kbGVyOwkJCS8vIGFkZHJlc3Mgb2YgdGhlIGhhbmRsZXIKKwl2b2lkICptX3BhcmFtOwkJCQkJCQkvLyBhIHBhcmFtZXRlciB0byBwYXNzIHRvIHRoZSBoYW5kbGVyCisJZG91YmxlIG1fcGVyaW9kOwkJCQkJCS8vIHRoZSByZWxhdGl2ZSB0aW1lIChlaXRoZXIgcGVyaW9kaWMgb3Igc2luZ2xlKQorCWRvdWJsZSBtX2V4cGlyYXRpb25UaW1lOwkJCQkvLyBhYnNvbHV0ZSBleHBpcmF0aW9uIHRpbWUgZm9yIHRoZSBjdXJyZW50IGV2ZW50CisJTm90aWZpZXIgKm1fbmV4dEV2ZW50OwkJCQkJLy8gbmV4dCBOb2ZpZmllciBldmVudAorCWJvb2wgbV9wZXJpb2RpYzsJCQkJCQkvLyB0cnVlIGlmIHRoaXMgaXMgYSBwZXJpb2RpYyBldmVudAorCWJvb2wgbV9xdWV1ZWQ7CQkJCQkJCS8vIGluZGljYXRlcyBpZiB0aGlzIGVudHJ5IGlzIHF1ZXVlZAorCVNFTUFQSE9SRV9JRCBtX2hhbmRsZXJTZW1hcGhvcmU7CQkvLyBoZWxkIGJ5IGludGVycnVwdCBtYW5hZ2VyIHRhc2sgd2hpbGUgaGFuZGxlciBjYWxsIGlzIGluIHByb2dyZXNzCisKKwlESVNBTExPV19DT1BZX0FORF9BU1NJR04oTm90aWZpZXIpOworCisJc3RhdGljIFRhc2sgKnRhc2s7CisJc3RhdGljIHZvaWQgUnVuKCk7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvaW5jbHVkZS9QSURPdXRwdXQuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL2luY2x1ZGUvUElET3V0cHV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJlMmM5NQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL2luY2x1ZGUvUElET3V0cHV0LmgKQEAgLTAsMCArMSwyMCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJCYXNlLmgiCisKKy8qKgorICogUElET3V0cHV0IGludGVyZmFjZSBpcyBhIGdlbmVyaWMgb3V0cHV0IGZvciB0aGUgUElEIGNsYXNzLgorICogUFdNcyB1c2UgdGhpcyBjbGFzcy4KKyAqIFVzZXJzIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSB0byBhbGxvdyBmb3IgYSBQSURDb250cm9sbGVyIHRvIAorICogcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBpbnB1dHMKKyAqLworY2xhc3MgUElET3V0cHV0Cit7CitwdWJsaWM6CisJdmlydHVhbCB2b2lkIFBJRFdyaXRlKGZsb2F0IG91dHB1dCkgPSAwOworfTsKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL2luY2x1ZGUvUElEU291cmNlLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9pbmNsdWRlL1BJRFNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MWJkMjgKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9pbmNsdWRlL1BJRFNvdXJjZS5oCkBAIC0wLDAgKzEsMTggQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisvKioKKyAqIFBJRFNvdXJjZSBpbnRlcmZhY2UgaXMgYSBnZW5lcmljIHNlbnNvciBzb3VyY2UgZm9yIHRoZSBQSUQgY2xhc3MuCisgKiBBbGwgc2Vuc29ycyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggdGhlIFBJRCBjbGFzcyB3aWxsIGltcGxlbWVudCB0aGUgUElEU291cmNlIHRoYXQKKyAqIHJldHVybnMgYSBzdGFuZGFyZCB2YWx1ZSB0aGF0IHdpbGwgYmUgdXNlZCBpbiB0aGUgUElEIGNvZGUuCisgKi8KK2NsYXNzIFBJRFNvdXJjZQorewkKK3B1YmxpYzoKKwllbnVtIFBJRFNvdXJjZVBhcmFtZXRlciB7a0Rpc3RhbmNlLCBrUmF0ZSwga0FuZ2xlfTsKKwl2aXJ0dWFsIGRvdWJsZSBQSURHZXQoKSA9IDA7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvaW5jbHVkZS9SZXNvdXJjZS5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvaW5jbHVkZS9SZXNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYjk0MjcKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9pbmNsdWRlL1Jlc291cmNlLmgKQEAgLTAsMCArMSw0MCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJFcnJvckJhc2UuaCIKKyNpbmNsdWRlICJIQUwvY3BwL1N5bmNocm9uaXplZC5ocHAiCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qKgorICogVGhlIFJlc291cmNlIGNsYXNzIGlzIGEgY29udmVuaWVudCB3YXkgdG8gdHJhY2sgYWxsb2NhdGVkIHJlc291cmNlcy4KKyAqIEl0IHRyYWNrcyB0aGVtIGFzIGluZGljaWVzIGluIHRoZSByYW5nZSBbMCAuLiBlbGVtZW50cyAtIDFdLgorICogRS5nLiB0aGUgbGlicmFyeSB1c2VzIHRoaXMgdG8gdHJhY2sgaGFyZHdhcmUgY2hhbm5lbCBhbGxvY2F0aW9uLgorICoKKyAqIFRoZSBSZXNvdXJjZSBjbGFzcyBkb2VzIG5vdCBhbGxvY2F0ZSB0aGUgaGFyZHdhcmUgY2hhbm5lbHMgb3Igb3RoZXIKKyAqIHJlc291cmNlczsgaXQganVzdCB0cmFja3Mgd2hpY2ggaW5kaWNlcyB3ZXJlIG1hcmtlZCBpbiB1c2UgYnkKKyAqIEFsbG9jYXRlIGFuZCBub3QgeWV0IGZyZWVkIGJ5IEZyZWUuCisgKi8KK2NsYXNzIFJlc291cmNlIDogcHVibGljIEVycm9yQmFzZQoreworcHVibGljOgorCXZpcnR1YWwgflJlc291cmNlKCk7CisJc3RhdGljIHZvaWQgQ3JlYXRlUmVzb3VyY2VPYmplY3QoUmVzb3VyY2UgKipyLCB1aW50MzJfdCBlbGVtZW50cyk7CisJdWludDMyX3QgQWxsb2NhdGUoY29uc3QgY2hhciAqcmVzb3VyY2VEZXNjKTsKKwl1aW50MzJfdCBBbGxvY2F0ZSh1aW50MzJfdCBpbmRleCwgY29uc3QgY2hhciAqcmVzb3VyY2VEZXNjKTsKKwl2b2lkIEZyZWUodWludDMyX3QgaW5kZXgpOworCitwcml2YXRlOgorCWV4cGxpY2l0IFJlc291cmNlKHVpbnQzMl90IHNpemUpOworCisJYm9vbCAqbV9pc0FsbG9jYXRlZDsKKwlSZWVudHJhbnRNdXRleCBtX2FsbG9jYXRlTG9jazsKKwl1aW50MzJfdCBtX3NpemU7CisKKwlzdGF0aWMgUmVlbnRyYW50TXV0ZXggbV9jcmVhdGVMb2NrOworCisJRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFJlc291cmNlKTsKK307CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9pbmNsdWRlL1JvYm90U3RhdGUuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL2luY2x1ZGUvUm9ib3RTdGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMjU0OTMKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9pbmNsdWRlL1JvYm90U3RhdGUuaApAQCAtMCwwICsxLDMzIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCitjbGFzcyBSb2JvdFN0YXRlSW50ZXJmYWNlCit7CitwdWJsaWM6CisJdmlydHVhbCB+Um9ib3RTdGF0ZUludGVyZmFjZSgpIHt9OworICAgIHZpcnR1YWwgYm9vbCBJc0Rpc2FibGVkKCkgPSAwOworCXZpcnR1YWwgYm9vbCBJc0VuYWJsZWQoKSA9IDA7CisJdmlydHVhbCBib29sIElzT3BlcmF0b3JDb250cm9sKCkgPSAwOworCXZpcnR1YWwgYm9vbCBJc0F1dG9ub21vdXMoKSA9IDA7CisJdmlydHVhbCBib29sIElzVGVzdCgpID0gMDsKK307CisKK2NsYXNzIFJvYm90U3RhdGUKK3sKK3ByaXZhdGU6CisJc3RhdGljIFJvYm90U3RhdGVJbnRlcmZhY2UqIGltcGw7CisJCitwdWJsaWM6CisJc3RhdGljIHZvaWQgU2V0SW1wbGVtZW50YXRpb24oUm9ib3RTdGF0ZUludGVyZmFjZSogaSk7CisgICAgc3RhdGljIGJvb2wgSXNEaXNhYmxlZCgpOworCXN0YXRpYyBib29sIElzRW5hYmxlZCgpOworCXN0YXRpYyBib29sIElzT3BlcmF0b3JDb250cm9sKCk7CisJc3RhdGljIGJvb2wgSXNBdXRvbm9tb3VzKCk7CisJc3RhdGljIGJvb2wgSXNUZXN0KCk7Cit9OworCisKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL2luY2x1ZGUvU2Vuc29yQmFzZS5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvaW5jbHVkZS9TZW5zb3JCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYyOWUxOAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL2luY2x1ZGUvU2Vuc29yQmFzZS5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiRXJyb3JCYXNlLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJCYXNlLmgiCisKKy8qKgorICogQmFzZSBjbGFzcyBmb3IgYWxsIHNlbnNvcnMuCisgKiBTdG9yZXMgbW9zdCByZWNlbnQgc3RhdHVzIGluZm9ybWF0aW9uIGFzIHdlbGwgYXMgY29udGFpbmluZyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgY2hlY2tpbmcKKyAqIGNoYW5uZWxzIGFuZCBlcnJvciBwcm9jZXNzaW5nLgorICovCitjbGFzcyBTZW5zb3JCYXNlIDogcHVibGljIEVycm9yQmFzZQoreworcHVibGljOgorCVNlbnNvckJhc2UoKTsKKwl2aXJ0dWFsIH5TZW5zb3JCYXNlKCk7CisJc3RhdGljIHZvaWQgRGVsZXRlU2luZ2xldG9ucygpOworCisJc3RhdGljIHVpbnQzMl90IEdldERlZmF1bHRTb2xlbm9pZE1vZHVsZSgpCisJeworCQlyZXR1cm4gMDsKKwl9CisKKwlzdGF0aWMgYm9vbCBDaGVja1NvbGVub2lkTW9kdWxlKHVpbnQ4X3QgbW9kdWxlTnVtYmVyKTsKKwlzdGF0aWMgYm9vbCBDaGVja0RpZ2l0YWxDaGFubmVsKHVpbnQzMl90IGNoYW5uZWwpOworCXN0YXRpYyBib29sIENoZWNrUmVsYXlDaGFubmVsKHVpbnQzMl90IGNoYW5uZWwpOworCXN0YXRpYyBib29sIENoZWNrUFdNQ2hhbm5lbCh1aW50MzJfdCBjaGFubmVsKTsKKwlzdGF0aWMgYm9vbCBDaGVja0FuYWxvZ0lucHV0KHVpbnQzMl90IGNoYW5uZWwpOworCXN0YXRpYyBib29sIENoZWNrQW5hbG9nT3V0cHV0KHVpbnQzMl90IGNoYW5uZWwpOworCXN0YXRpYyBib29sIENoZWNrU29sZW5vaWRDaGFubmVsKHVpbnQzMl90IGNoYW5uZWwpOworCXN0YXRpYyBib29sIENoZWNrUERQQ2hhbm5lbCh1aW50MzJfdCBjaGFubmVsKTsKKworCXN0YXRpYyBjb25zdCB1aW50MzJfdCBrRGlnaXRhbENoYW5uZWxzID0gMjY7CisJc3RhdGljIGNvbnN0IHVpbnQzMl90IGtBbmFsb2dJbnB1dHMgPSA4OworCXN0YXRpYyBjb25zdCB1aW50MzJfdCBrQW5hbG9nT3V0cHV0cyA9IDI7CisJc3RhdGljIGNvbnN0IHVpbnQzMl90IGtTb2xlbm9pZENoYW5uZWxzID0gODsKKwlzdGF0aWMgY29uc3QgdWludDMyX3Qga1NvbGVub2lkTW9kdWxlcyA9IDI7CisJc3RhdGljIGNvbnN0IHVpbnQzMl90IGtQd21DaGFubmVscyA9IDIwOworCXN0YXRpYyBjb25zdCB1aW50MzJfdCBrUmVsYXlDaGFubmVscyA9IDg7CisJc3RhdGljIGNvbnN0IHVpbnQzMl90IGtQRFBDaGFubmVscyA9IDE2OworCXN0YXRpYyBjb25zdCB1aW50MzJfdCBrQ2hhc3Npc1Nsb3RzID0gODsKKworcHJvdGVjdGVkOgorCXZvaWQgQWRkVG9TaW5nbGV0b25MaXN0KCk7CisKKwlzdGF0aWMgdm9pZCogbV9kaWdpdGFsX3BvcnRzW2tEaWdpdGFsQ2hhbm5lbHNdOworCXN0YXRpYyB2b2lkKiBtX3JlbGF5X3BvcnRzW2tSZWxheUNoYW5uZWxzXTsKKwlzdGF0aWMgdm9pZCogbV9wd21fcG9ydHNba1B3bUNoYW5uZWxzXTsKKworcHJpdmF0ZToKKwlESVNBTExPV19DT1BZX0FORF9BU1NJR04oU2Vuc29yQmFzZSk7CisJc3RhdGljIFNlbnNvckJhc2UgKm1fc2luZ2xldG9uTGlzdDsKKwlTZW5zb3JCYXNlICptX25leHRTaW5nbGV0b247Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvaW5jbHVkZS9UYXNrLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9pbmNsdWRlL1Rhc2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTE3NTRhCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvaW5jbHVkZS9UYXNrLmgKQEAgLTAsMCArMSw1MiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJFcnJvckJhc2UuaCIKKyNpbmNsdWRlICJIQUwvVGFzay5ocHAiCisKKy8qKgorICogV1BJIHRhc2sgaXMgYSB3cmFwcGVyIGZvciB0aGUgbmF0aXZlIFRhc2sgb2JqZWN0LgorICogQWxsIFdQSUxpYiB0YXNrcyBhcmUgbWFuYWdlZCBieSBhIHN0YXRpYyB0YXNrIG1hbmFnZXIgZm9yIHNpbXBsaWZpZWQgY2xlYW51cC4KKyAqKi8KK2NsYXNzIFRhc2sgOiBwdWJsaWMgRXJyb3JCYXNlCit7CitwdWJsaWM6CisJc3RhdGljIGNvbnN0IHVpbnQzMl90IGtEZWZhdWx0UHJpb3JpdHkgPSAxMDE7CisKKwlUYXNrKGNvbnN0IGNoYXIqIG5hbWUsIEZVTkNQVFIgZnVuY3Rpb24sIGludDMyX3QgcHJpb3JpdHkgPSBrRGVmYXVsdFByaW9yaXR5LAorCQkJdWludDMyX3Qgc3RhY2tTaXplID0gMjAwMDApOworCXZpcnR1YWwgflRhc2soKTsKKworCWJvb2wgU3RhcnQodWludDMyX3QgYXJnMCA9IDAsIHVpbnQzMl90IGFyZzEgPSAwLCB1aW50MzJfdCBhcmcyID0gMCwgdWludDMyX3QgYXJnMyA9IDAsCisJCQl1aW50MzJfdCBhcmc0ID0gMCwgdWludDMyX3QgYXJnNSA9IDAsIHVpbnQzMl90IGFyZzYgPSAwLCB1aW50MzJfdCBhcmc3ID0gMCwKKwkJCXVpbnQzMl90IGFyZzggPSAwLCB1aW50MzJfdCBhcmc5ID0gMCk7CisJYm9vbCBSZXN0YXJ0KCk7CisJYm9vbCBTdG9wKCk7CisKKwlib29sIElzUmVhZHkoKTsKKwlib29sIElzU3VzcGVuZGVkKCk7CisKKwlib29sIFN1c3BlbmQoKTsKKwlib29sIFJlc3VtZSgpOworCisJYm9vbCBWZXJpZnkoKTsKKworCWludDMyX3QgR2V0UHJpb3JpdHkoKTsKKwlib29sIFNldFByaW9yaXR5KGludDMyX3QgcHJpb3JpdHkpOworCWNvbnN0IGNoYXIqIEdldE5hbWUoKTsKKwlUQVNLIEdldElEKCk7CisKK3ByaXZhdGU6CisJRlVOQ1BUUiBtX2Z1bmN0aW9uOworCWNoYXIqIG1fdGFza05hbWU7CisJVEFTSyBtX3Rhc2tJRDsKKwl1aW50MzJfdCBtX3N0YWNrU2l6ZTsKKwlpbnQgbV9wcmlvcml0eTsKKwlib29sIEhhbmRsZUVycm9yKFNUQVRVUyByZXN1bHRzKTsKKwlESVNBTExPV19DT1BZX0FORF9BU1NJR04oVGFzayk7Cit9OworCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9pbmNsdWRlL1RpbWVyLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9pbmNsdWRlL1RpbWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMzZjlhZgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL2luY2x1ZGUvVGltZXIuaApAQCAtMCwwICsxLDQ4IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkhBTC9jcHAvU3luY2hyb25pemVkLmhwcCIKKyNpbmNsdWRlICJCYXNlLmgiCisKK3R5cGVkZWYgdm9pZCAoKlRpbWVySW50ZXJydXB0SGFuZGxlcikodm9pZCAqcGFyYW0pOworCit2b2lkIFdhaXQoZG91YmxlIHNlY29uZHMpOworZG91YmxlIEdldENsb2NrKCk7Citkb3VibGUgR2V0VGltZSgpOworCisvKioKKyAqIFRpbWVyIG9iamVjdHMgbWVhc3VyZSBhY2N1bXVsYXRlZCB0aW1lIGluIHNlY29uZHMuCisgKiBUaGUgdGltZXIgb2JqZWN0IGZ1bmN0aW9ucyBsaWtlIGEgc3RvcHdhdGNoLiBJdCBjYW4gYmUgc3RhcnRlZCwgc3RvcHBlZCwgYW5kIGNsZWFyZWQuIFdoZW4gdGhlCisgKiB0aW1lciBpcyBydW5uaW5nIGl0cyB2YWx1ZSBjb3VudHMgdXAgaW4gc2Vjb25kcy4gV2hlbiBzdG9wcGVkLCB0aGUgdGltZXIgaG9sZHMgdGhlIGN1cnJlbnQKKyAqIHZhbHVlLiBUaGUgaW1wbGVtZW50YXRpb24gc2ltcGx5IHJlY29yZHMgdGhlIHRpbWUgd2hlbiBzdGFydGVkIGFuZCBzdWJ0cmFjdHMgdGhlIGN1cnJlbnQgdGltZQorICogd2hlbmV2ZXIgdGhlIHZhbHVlIGlzIHJlcXVlc3RlZC4KKyAqLworY2xhc3MgVGltZXIKK3sKK3B1YmxpYzoKKwlUaW1lcigpOworCXZpcnR1YWwgflRpbWVyKCk7CisJZG91YmxlIEdldCgpOworCXZvaWQgUmVzZXQoKTsKKwl2b2lkIFN0YXJ0KCk7CisJdm9pZCBTdG9wKCk7CisJYm9vbCBIYXNQZXJpb2RQYXNzZWQoZG91YmxlIHBlcmlvZCk7CisKKwlzdGF0aWMgZG91YmxlIEdldEZQR0FUaW1lc3RhbXAoKTsKKwlzdGF0aWMgZG91YmxlIEdldFBQQ1RpbWVzdGFtcCgpOworICAgIHN0YXRpYyBkb3VibGUgR2V0TWF0Y2hUaW1lKCk7CisJCisJLy8gVGhlIHRpbWUsIGluIHNlY29uZHMsIGF0IHdoaWNoIHRoZSAzMi1iaXQgRlBHQSB0aW1lc3RhbXAgcm9sbHMgb3ZlciB0byAwCisJc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga1JvbGxvdmVyVGltZSA9ICgxbGwgPDwgMzIpIC8gMWU2OworCitwcml2YXRlOgorCWRvdWJsZSBtX3N0YXJ0VGltZTsKKwlkb3VibGUgbV9hY2N1bXVsYXRlZFRpbWU7CisJYm9vbCBtX3J1bm5pbmc7CisJTXV0ZXggbV9sb2NrOworCURJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihUaW1lcik7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvaW5jbHVkZS9VdGlsaXR5LmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9pbmNsdWRlL1V0aWxpdHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmUzMjVmCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvaW5jbHVkZS9VdGlsaXR5LmgKQEAgLTAsMCArMSwzMCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjZGVmaW5lIHdwaV9hc3NlcnQoY29uZGl0aW9uKSB3cGlfYXNzZXJ0X2ltcGwoY29uZGl0aW9uLCAjY29uZGl0aW9uLCBOVUxMLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fRlVOQ1RJT05fXykKKyNkZWZpbmUgd3BpX2Fzc2VydFdpdGhNZXNzYWdlKGNvbmRpdGlvbiwgbWVzc2FnZSkgd3BpX2Fzc2VydF9pbXBsKGNvbmRpdGlvbiwgI2NvbmRpdGlvbiwgbWVzc2FnZSwgX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18pCisKKyNkZWZpbmUgd3BpX2Fzc2VydEVxdWFsKGEsIGIpIHdwaV9hc3NlcnRFcXVhbF9pbXBsKGEsIGIsICNhLCAjYiwgTlVMTCwgX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18pCisjZGVmaW5lIHdwaV9hc3NlcnRFcXVhbFdpdGhNZXNzYWdlKGEsIGIsIG1lc3NhZ2UpIHdwaV9hc3NlcnRFcXVhbF9pbXBsKGEsIGIsICNhLCAjYiwgbWVzc2FnZSwgX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18pCisKKyNkZWZpbmUgd3BpX2Fzc2VydE5vdEVxdWFsKGEsIGIpIHdwaV9hc3NlcnROb3RFcXVhbF9pbXBsKGEsIGIsICNhLCAjYiwgTlVMTCwgX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18pCisjZGVmaW5lIHdwaV9hc3NlcnROb3RFcXVhbFdpdGhNZXNzYWdlKGEsIGIsIG1lc3NhZ2UpIHdwaV9hc3NlcnROb3RFcXVhbF9pbXBsKGEsIGIsICNhLCAjYiwgbWVzc2FnZSwgX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18pCisKK2Jvb2wgd3BpX2Fzc2VydF9pbXBsKGJvb2wgY29uZGl0aW9uVmFsdWUsIGNvbnN0IGNoYXIgKmNvbmRpdGlvblRleHQsIGNvbnN0IGNoYXIgKm1lc3NhZ2UsIGNvbnN0IGNoYXIgKmZpbGVOYW1lLCB1aW50MzJfdCBsaW5lTnVtYmVyLCBjb25zdCBjaGFyICpmdW5jTmFtZSk7Citib29sIHdwaV9hc3NlcnRFcXVhbF9pbXBsKGludCB2YWx1ZUEsIGludCB2YWx1ZUIsIGNvbnN0IGNoYXIgKnZhbHVlQVN0cmluZywgY29uc3QgY2hhciAqdmFsdWVCU3RyaW5nLCBjb25zdCBjaGFyICptZXNzYWdlLCBjb25zdCBjaGFyICpmaWxlTmFtZSx1aW50MzJfdCBsaW5lTnVtYmVyLCBjb25zdCBjaGFyICpmdW5jTmFtZSk7Citib29sIHdwaV9hc3NlcnROb3RFcXVhbF9pbXBsKGludCB2YWx1ZUEsIGludCB2YWx1ZUIsIGNvbnN0IGNoYXIgKnZhbHVlQVN0cmluZywgY29uc3QgY2hhciAqdmFsdWVCU3RyaW5nLCBjb25zdCBjaGFyICptZXNzYWdlLCBjb25zdCBjaGFyICpmaWxlTmFtZSx1aW50MzJfdCBsaW5lTnVtYmVyLCBjb25zdCBjaGFyICpmdW5jTmFtZSk7CisKK3ZvaWQgd3BpX3N1c3BlbmRPbkFzc2VydEVuYWJsZWQoYm9vbCBlbmFibGVkKTsKKwordWludDE2X3QgR2V0RlBHQVZlcnNpb24oKTsKK3VpbnQzMl90IEdldEZQR0FSZXZpc2lvbigpOwordWludDMyX3QgR2V0RlBHQVRpbWUoKTsKK2Jvb2wgR2V0VXNlckJ1dHRvbigpOworc3RkOjpzdHJpbmcgR2V0U3RhY2tUcmFjZSh1aW50MzJfdCBvZmZzZXQpOwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvaW5jbHVkZS9XUElFcnJvcnMuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL2luY2x1ZGUvV1BJRXJyb3JzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUzNzcxNQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL2luY2x1ZGUvV1BJRXJyb3JzLmgKQEAgLTAsMCArMSw3OCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpZmRlZiBXUElfRVJST1JTX0RFRklORV9TVFJJTkdTCisjZGVmaW5lIFMobGFiZWwsIG9mZnNldCwgbWVzc2FnZSkgY29uc3QgY2hhciAqd3BpX2Vycm9yX3NfIyNsYWJlbCA9IG1lc3NhZ2UgOyBcCisJY29uc3QgaW50MzJfdCB3cGlfZXJyb3JfdmFsdWVfIyNsYWJlbCA9IG9mZnNldAorI2Vsc2UKKyNkZWZpbmUgUyhsYWJlbCwgb2Zmc2V0LCBtZXNzYWdlKSBleHRlcm4gY29uc3QgY2hhciAqd3BpX2Vycm9yX3NfIyNsYWJlbCA7IFwKKwljb25zdCBpbnQzMl90IHdwaV9lcnJvcl92YWx1ZV8jI2xhYmVsID0gb2Zmc2V0CisjZW5kaWYKKworLyoKKyAqIEZhdGFsIGVycm9ycworICovCitTKE1vZHVsZUluZGV4T3V0T2ZSYW5nZSwgLTEsICJBbGxvY2F0aW5nIG1vZHVsZSB0aGF0IGlzIG91dCBvZiByYW5nZSBvciBub3QgZm91bmQiKTsKK1MoQ2hhbm5lbEluZGV4T3V0T2ZSYW5nZSwgLTEsICJBbGxvY2F0aW5nIGNoYW5uZWwgdGhhdCBpcyBvdXQgb2YgcmFuZ2UiKTsKK1MoTm90QWxsb2NhdGVkLCAtMiwgIkF0dGVtcHRpbmcgdG8gZnJlZSB1bmFsbG9jYXRlZCByZXNvdXJjZSIpOworUyhSZXNvdXJjZUFscmVhZHlBbGxvY2F0ZWQsIC0zLCAiQXR0ZW1wdGVkIHRvIHJldXNlIGFuIGFsbG9jYXRlZCByZXNvdXJjZSIpOworUyhOb0F2YWlsYWJsZVJlc291cmNlcywgLTQsICJObyBhdmFpbGFibGUgcmVzb3VyY2VzIHRvIGFsbG9jYXRlIik7CitTKE51bGxQYXJhbWV0ZXIsIC01LCAiQSBwb2ludGVyIHBhcmFtZXRlciB0byBhIG1ldGhvZCBpcyBOVUxMIik7CitTKFRpbWVvdXQsIC02LCAiQSB0aW1lb3V0IGhhcyBiZWVuIGV4Y2VlZGVkIik7CitTKENvbXBhc3NNYW51ZmFjdHVyZXJFcnJvciwgLTcsICJDb21wYXNzIG1hbnVmYWN0dXJlciBkb2Vzbid0IG1hdGNoIEhpVGVjaG5pYyIpOworUyhDb21wYXNzVHlwZUVycm9yLCAtOCwgIkNvbXBhc3MgdHlwZSBkb2Vzbid0IG1hdGNoIGV4cGVjdGVkIHR5cGUgZm9yIEhpVGVjaG5pYyBjb21wYXNzIik7CitTKEluY29tcGF0aWJsZU1vZGUsIC05LCAiVGhlIG9iamVjdCBpcyBpbiBhbiBpbmNvbXBhdGlibGUgbW9kZSIpOworUyhBbmFsb2dUcmlnZ2VyTGltaXRPcmRlckVycm9yLCAtMTAsICJBbmFsb2dUcmlnZ2VyIGxpbWl0cyBlcnJvci4gIExvd2VyIGxpbWl0ID4gVXBwZXIgTGltaXQiKTsKK1MoQW5hbG9nVHJpZ2dlclB1bHNlT3V0cHV0RXJyb3IsIC0xMSwgIkF0dGVtcHRlZCB0byByZWFkIEFuYWxvZ1RyaWdnZXIgcHVsc2Ugb3V0cHV0LiIpOworUyhUYXNrRXJyb3IsIC0xMiwgIlRhc2sgY2FuJ3QgYmUgc3RhcnRlZCIpOworUyhUYXNrSURFcnJvciwgLTEzLCAiVGFzayBlcnJvcjogSW52YWxpZCBJRC4iKTsKK1MoVGFza0RlbGV0ZWRFcnJvciwgLTE0LCAiVGFzayBlcnJvcjogVGFzayBhbHJlYWR5IGRlbGV0ZWQuIik7CitTKFRhc2tPcHRpb25zRXJyb3IsIC0xNSwgIlRhc2sgZXJyb3I6IEludmFsaWQgb3B0aW9ucy4iKTsKK1MoVGFza01lbW9yeUVycm9yLCAtMTYsICJUYXNrIGNhbid0IGJlIHN0YXJ0ZWQgZHVlIHRvIGluc3VmZmljaWVudCBtZW1vcnkuIik7CitTKFRhc2tQcmlvcml0eUVycm9yLCAtMTcsICJUYXNrIGVycm9yOiBJbnZhbGlkIHByaW9yaXR5IFsxLTI1NV0uIik7CitTKERyaXZlVW5pbml0aWFsaXplZCwgLTE4LCAiUm9ib3REcml2ZSBub3QgaW5pdGlhbGl6ZWQgZm9yIHRoZSBDIGludGVyZmFjZSIpOworUyhDb21wcmVzc29yTm9uTWF0Y2hpbmcsIC0xOSwgIkNvbXByZXNzb3Igc2xvdC9jaGFubmVsIGRvZXNuJ3QgbWF0Y2ggcHJldmlvdXMgaW5zdGFuY2UiKTsKK1MoQ29tcHJlc3NvckFscmVhZHlEZWZpbmVkLCAtMjAsICJDcmVhdGluZyBhIHNlY29uZCBjb21wcmVzc29yIGluc3RhbmNlIik7CitTKENvbXByZXNzb3JVbmRlZmluZWQsIC0yMSwgIlVzaW5nIGNvbXByZXNzb3IgZnVuY3Rpb25zIHdpdGhvdXQgZGVmaW5pbmcgY29tcHJlc3NvciIpOworUyhJbmNvbnNpc3RlbnRBcnJheVZhbHVlQWRkZWQsIC0yMiwgIldoZW4gcGFja2luZyBkYXRhIGludG8gYW4gYXJyYXkgdG8gdGhlIGRhc2hib2FyZCwgbm90IGFsbCB2YWx1ZXMgYWRkZWQgd2VyZSBvZiB0aGUgc2FtZSB0eXBlLiIpOworUyhNaXNtYXRjaGVkQ29tcGxleFR5cGVDbG9zZSwgLTIzLCAiV2hlbiBwYWNraW5nIGRhdGEgdG8gdGhlIGRhc2hib2FyZCwgYSBDbG9zZSBmb3IgYSBjb21wbGV4IHR5cGUgd2FzIGNhbGxlZCB3aXRob3V0IGEgbWF0Y2hpbmcgT3Blbi4iKTsKK1MoRGFzaGJvYXJkRGF0YU92ZXJmbG93LCAtMjQsICJXaGVuIHBhY2tpbmcgZGF0YSB0byB0aGUgZGFzaGJvYXJkLCB0b28gbXVjaCBkYXRhIHdhcyBwYWNrZWQgYW5kIHRoZSBidWZmZXIgb3ZlcmZsb3dlZC4iKTsKK1MoRGFzaGJvYXJkRGF0YUNvbGxpc2lvbiwgLTI1LCAiVGhlIHNhbWUgYnVmZmVyIHdhcyB1c2VkIGZvciBwYWNraW5nIGRhdGEgYW5kIGZvciBwcmludGluZy4iKTsKK1MoRW5oYW5jZWRJT01pc3NpbmcsIC0yNiwgIklPIGlzIG5vdCBhdHRhY2hlZCBvciBFbmhhbmNlZCBJTyBpcyBub3QgZW5hYmxlZC4iKTsKK1MoTGluZU5vdE91dHB1dCwgLTI3LCAiQ2Fubm90IFNldERpZ2l0YWxPdXRwdXQgZm9yIGEgbGluZSBub3QgY29uZmlndXJlZCBmb3Igb3V0cHV0LiIpOworUyhQYXJhbWV0ZXJPdXRPZlJhbmdlLCAtMjgsICJBIHBhcmFtZXRlciBpcyBvdXQgb2YgcmFuZ2UuIik7CitTKFNQSUNsb2NrUmF0ZVRvb0xvdywgLTI5LCAiU1BJIGNsb2NrIHJhdGUgd2FzIGJlbG93IHRoZSBtaW5pbXVtIHN1cHBvcnRlZCIpOworUyhKYWd1YXJWZXJzaW9uRXJyb3IsIC0zMCwgIkphZ3VhciBmaXJtd2FyZSB2ZXJzaW9uIGVycm9yIik7CitTKEphZ3Vhck1lc3NhZ2VOb3RGb3VuZCwgLTMxLCAiSmFndWFyIG1lc3NhZ2Ugbm90IGZvdW5kIik7CitTKE5ldHdvcmtUYWJsZXNSZWFkRXJyb3IsIC00MCwgIkVycm9yIHJlYWRpbmcgTmV0d29ya1RhYmxlcyBzb2NrZXQiKTsKK1MoTmV0d29ya1RhYmxlc0J1ZmZlckZ1bGwsIC00MSwgIkJ1ZmZlciBmdWxsIHdyaXRpbmcgdG8gTmV0d29ya1RhYmxlcyBzb2NrZXQiKTsKK1MoTmV0d29ya1RhYmxlc1dyb25nVHlwZSwgLTQyLCAiVGhlIHdyb25nIHR5cGUgd2FzIHJlYWQgZnJvbSB0aGUgTmV0d29ya1RhYmxlcyBlbnRyeSIpOworUyhOZXR3b3JrVGFibGVzQ29ycnVwdCwgLTQzLCAiTmV0d29ya1RhYmxlcyBkYXRhIHN0cmVhbSBpcyBjb3JydXB0Iik7CitTKFNtYXJ0RGFzaGJvYXJkTWlzc2luZ0tleSwgLTQzLCAiU21hcnREYXNoYm9hcmQgZGF0YSBkb2VzIG5vdCBleGlzdCIpOworUyhDb21tYW5kSWxsZWdhbFVzZSwgLTUwLCAiSWxsZWdhbCB1c2Ugb2YgQ29tbWFuZCIpOworUyhVbnN1cHBvcnRlZEluU2ltdWxhdGlvbiwgLTgwLCAiVW5zdXBwb3J0ZWQgaW4gc2ltdWxhdGlvbiIpOworCisvKgorICogV2FybmluZ3MKKyAqLworUyhTYW1wbGVSYXRlVG9vSGlnaCwgMSwgIkFuYWxvZyBtb2R1bGUgc2FtcGxlIHJhdGUgaXMgdG9vIGhpZ2giKTsKK1MoVm9sdGFnZU91dE9mUmFuZ2UsIDIsICJWb2x0YWdlIHRvIGNvbnZlcnQgdG8gcmF3IHZhbHVlIGlzIG91dCBvZiByYW5nZSBbLTEwOyAxMF0iKTsKK1MoQ29tcHJlc3NvclRhc2tFcnJvciwgMywgIkNvbXByZXNzb3IgdGFzayB3b24ndCBzdGFydCIpOworUyhMb29wVGltaW5nRXJyb3IsIDQsICJEaWdpdGFsIG1vZHVsZSBsb29wIHRpbWluZyBpcyBub3QgdGhlIGV4cGVjdGVkIHZhbHVlIik7CitTKE5vbkJpbmFyeURpZ2l0YWxWYWx1ZSwgNSwgIkRpZ2l0YWwgb3V0cHV0IHZhbHVlIGlzIG5vdCAwIG9yIDEiKTsKK1MoSW5jb3JyZWN0QmF0dGVyeUNoYW5uZWwsIDYsICJCYXR0ZXJ5IG1lYXN1cmVtZW50IGNoYW5uZWwgaXMgbm90IGNvcnJlY3QgdmFsdWUiKTsKK1MoQmFkSm95c3RpY2tJbmRleCwgNywgIkpveXN0aWNrIGluZGV4IGlzIG91dCBvZiByYW5nZSwgc2hvdWxkIGJlIDAtMyIpOworUyhCYWRKb3lzdGlja0F4aXMsIDgsICJKb3lzdGljayBheGlzIG9yIFBPViBpcyBvdXQgb2YgcmFuZ2UiKTsKK1MoSW52YWxpZE1vdG9ySW5kZXgsIDksICJNb3RvciBpbmRleCBpcyBvdXQgb2YgcmFuZ2UsIHNob3VsZCBiZSAwLTMiKTsKK1MoRHJpdmVyU3RhdGlvblRhc2tFcnJvciwgMTAsICJEcml2ZXIgU3RhdGlvbiB0YXNrIHdvbid0IHN0YXJ0Iik7CitTKEVuaGFuY2VkSU9QV01QZXJpb2RPdXRPZlJhbmdlLCAxMSwgIkRyaXZlciBTdGF0aW9uIEVuaGFuY2VkIElPIFBXTSBPdXRwdXQgcGVyaW9kIG91dCBvZiByYW5nZS4iKTsKK1MoU1BJV3JpdGVOb01PU0ksIDEyLCAiQ2Fubm90IHdyaXRlIHRvIFNQSSBwb3J0IHdpdGggbm8gTU9TSSBvdXRwdXQiKTsKK1MoU1BJUmVhZE5vTUlTTywgMTMsICJDYW5ub3QgcmVhZCBmcm9tIFNQSSBwb3J0IHdpdGggbm8gTUlTTyBpbnB1dCIpOworUyhTUElSZWFkTm9EYXRhLCAxNCwgIk5vIGRhdGEgYXZhaWxhYmxlIHRvIHJlYWQgZnJvbSBTUEkiKTsKK1MoSW5jb21wYXRpYmxlU3RhdGUsIDE1LCAiSW5jb21wYXRpYmxlIFN0YXRlOiBUaGUgb3BlcmF0aW9uIGNhbm5vdCBiZSBjb21wbGV0ZWQiKTsKKworI3VuZGVmIFMKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL2luY2x1ZGUvaW50ZXJmYWNlcy9BY2NlbGVyb21ldGVyLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9pbmNsdWRlL2ludGVyZmFjZXMvQWNjZWxlcm9tZXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwOWU5YmMKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9pbmNsdWRlL2ludGVyZmFjZXMvQWNjZWxlcm9tZXRlci5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKy8qKgorICogSW50ZXJmYWNlIGZvciAzLWF4aXMgYWNjZWxlcm9tZXRlcnMKKyAqLworY2xhc3MgQWNjZWxlcm9tZXRlcgoreworcHVibGljOgorCXZpcnR1YWwgfkFjY2VsZXJvbWV0ZXIoKSB7fTsKKworCWVudW0gUmFuZ2UKKwl7CisJCWtSYW5nZV8yRyA9IDAsCisJCWtSYW5nZV80RyA9IDEsCisJCWtSYW5nZV84RyA9IDIsCisJCWtSYW5nZV8xNkcgPSAzCisJfTsKKworCS8qKgorCSAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIHNldHRpbmcgdGhlIG1lYXN1cmluZyByYW5nZSBvZiBhbiBhY2NlbGVyb21ldGVyLgorCSAqCisJICogQHBhcmFtIHJhbmdlIFRoZSBtYXhpbXVtIGFjY2VsZXJhdGlvbiwgcG9zaXRpdmUgb3IgbmVnYXRpdmUsIHRoYXQgdGhlCisJICogYWNjZWxlcm9tZXRlciB3aWxsIG1lYXN1cmUuICBOb3QgYWxsIGFjY2VsZXJvbWV0ZXJzIHN1cHBvcnQgYWxsIHJhbmdlcy4KKwkgKi8KKwl2aXJ0dWFsIHZvaWQgU2V0UmFuZ2UoUmFuZ2UgcmFuZ2UpID0gMDsKKworCS8qKgorCSAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIGdldHRpbmcgdGhlIHggYXhpcyBhY2NlbGVyYXRpb24KKwkgKgorCSAqIEByZXR1cm4gVGhlIGFjY2VsZXJhdGlvbiBhbG9uZyB0aGUgeCBheGlzIGluIGctZm9yY2VzCisJICovCisJdmlydHVhbCBkb3VibGUgR2V0WCgpID0gMDsKKworCS8qKgorCSAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIGdldHRpbmcgdGhlIHkgYXhpcyBhY2NlbGVyYXRpb24KKwkgKgorCSAqIEByZXR1cm4gVGhlIGFjY2VsZXJhdGlvbiBhbG9uZyB0aGUgeSBheGlzIGluIGctZm9yY2VzCisJICovCisJdmlydHVhbCBkb3VibGUgR2V0WSgpID0gMDsKKworCS8qKgorCSAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIGdldHRpbmcgdGhlIHogYXhpcyBhY2NlbGVyYXRpb24KKwkgKgorCSAqIEByZXR1cm4gVGhlIGFjY2VsZXJhdGlvbiBhbG9uZyB0aGUgeiBheGlzIGluIGctZm9yY2VzCisJICovCisJdmlydHVhbCBkb3VibGUgR2V0WigpID0gMDsKK307CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9pbmNsdWRlL2ludGVyZmFjZXMvUG90ZW50aW9tZXRlci5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvaW5jbHVkZS9pbnRlcmZhY2VzL1BvdGVudGlvbWV0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWY0NTY3Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvaW5jbHVkZS9pbnRlcmZhY2VzL1BvdGVudGlvbWV0ZXIuaApAQCAtMCwwICsxLDI3IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSU5URVJGQUNFU19QT1RFTlRJT01FVEVSX0gKKyNkZWZpbmUgSU5URVJGQUNFU19QT1RFTlRJT01FVEVSX0gKKworI2luY2x1ZGUgIlBJRFNvdXJjZS5oIgorCisvKioKKyAqIEludGVyZmFjZSBmb3IgcG90ZW50aW9tZXRlcnMuCisgKi8KK2NsYXNzIFBvdGVudGlvbWV0ZXIgOiBwdWJsaWMgUElEU291cmNlCit7CitwdWJsaWM6CisJdmlydHVhbCB+UG90ZW50aW9tZXRlcigpIHt9OworCS8qKgorCSAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIGdldHRpbmcgdGhlIGN1cnJlbnQgdmFsdWUgb2YgYSBwb3RlbnRpb21ldGVyLgorCSAqIAorCSAqIEByZXR1cm4gVGhlIGN1cnJlbnQgc2V0IHNwZWVkLiAgVmFsdWUgaXMgYmV0d2VlbiAtMS4wIGFuZCAxLjAuCisJICovCisJdmlydHVhbCBkb3VibGUgR2V0KCkgPSAwOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9zcmMvRXJyb3IuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvc3JjL0Vycm9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjRjNGZlCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvc3JjL0Vycm9yLmNwcApAQCAtMCwwICsxLDExMSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiRXJyb3IuaCIKKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgIkhBTC9UYXNrLmhwcCIKKworI2luY2x1ZGUgIkRyaXZlclN0YXRpb24uaCIKKyNpbmNsdWRlICJUaW1lci5oIgorI2luY2x1ZGUgIlV0aWxpdHkuaCIKK2Jvb2wgRXJyb3I6Om1fc3VzcGVuZE9uRXJyb3JFbmFibGVkID0gZmFsc2U7CisKK0Vycm9yOjpFcnJvcigpCisJOiBtX2NvZGUoMCkKKwksIG1fbGluZU51bWJlcigwKQorCSwgbV9vcmlnaW5hdGluZ09iamVjdChOVUxMKQorCSwgbV90aW1lc3RhbXAgKDAuMCkKK3t9CisKK0Vycm9yOjp+RXJyb3IoKQore30KKwordm9pZCBFcnJvcjo6Q2xvbmUoRXJyb3IgJmVycm9yKQoreworCW1fY29kZSA9IGVycm9yLm1fY29kZTsKKwltX21lc3NhZ2UgPSBlcnJvci5tX21lc3NhZ2U7CisJbV9maWxlbmFtZSA9IGVycm9yLm1fZmlsZW5hbWU7CisJbV9mdW5jdGlvbiA9IGVycm9yLm1fZnVuY3Rpb247CisJbV9saW5lTnVtYmVyID0gZXJyb3IubV9saW5lTnVtYmVyOworCW1fb3JpZ2luYXRpbmdPYmplY3QgPSBlcnJvci5tX29yaWdpbmF0aW5nT2JqZWN0OworCW1fdGltZXN0YW1wID0gZXJyb3IubV90aW1lc3RhbXA7Cit9CisKK0Vycm9yOjpDb2RlIEVycm9yOjpHZXRDb2RlKCkgY29uc3QKK3sJcmV0dXJuIG1fY29kZTsgIH0KKworY29uc3QgY2hhciAqIEVycm9yOjpHZXRNZXNzYWdlKCkgY29uc3QKK3sJcmV0dXJuIG1fbWVzc2FnZS5jX3N0cigpOyAgfQorCitjb25zdCBjaGFyICogRXJyb3I6OkdldEZpbGVuYW1lKCkgY29uc3QKK3sJcmV0dXJuIG1fZmlsZW5hbWUuY19zdHIoKTsgIH0KKworY29uc3QgY2hhciAqIEVycm9yOjpHZXRGdW5jdGlvbigpIGNvbnN0Cit7CXJldHVybiBtX2Z1bmN0aW9uLmNfc3RyKCk7ICB9CisKK3VpbnQzMl90IEVycm9yOjpHZXRMaW5lTnVtYmVyKCkgY29uc3QKK3sJcmV0dXJuIG1fbGluZU51bWJlcjsgIH0KKworY29uc3QgRXJyb3JCYXNlKiBFcnJvcjo6R2V0T3JpZ2luYXRpbmdPYmplY3QoKSBjb25zdAorewlyZXR1cm4gbV9vcmlnaW5hdGluZ09iamVjdDsgIH0KKworZG91YmxlIEVycm9yOjpHZXRUaW1lc3RhbXAoKSBjb25zdAorewlyZXR1cm4gbV90aW1lc3RhbXA7ICB9CisKK3ZvaWQgRXJyb3I6OlNldChDb2RlIGNvZGUsIGNvbnN0IGNoYXIqIGNvbnRleHRNZXNzYWdlLCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgY29uc3QgY2hhciogZnVuY3Rpb24sIHVpbnQzMl90IGxpbmVOdW1iZXIsIGNvbnN0IEVycm9yQmFzZSogb3JpZ2luYXRpbmdPYmplY3QpCit7CisJYm9vbCByZXBvcnQgPSB0cnVlOworCisJaWYoY29kZSA9PSBtX2NvZGUgJiYgR2V0VGltZSgpIC0gbV90aW1lc3RhbXAgPCAxKQorCXsKKwkJcmVwb3J0ID0gZmFsc2U7CisJfQorCisJbV9jb2RlID0gY29kZTsKKwltX21lc3NhZ2UgPSBjb250ZXh0TWVzc2FnZTsKKwltX2ZpbGVuYW1lID0gZmlsZW5hbWU7CisJbV9mdW5jdGlvbiA9IGZ1bmN0aW9uOworCW1fbGluZU51bWJlciA9IGxpbmVOdW1iZXI7CisJbV9vcmlnaW5hdGluZ09iamVjdCA9IG9yaWdpbmF0aW5nT2JqZWN0OworCisJaWYocmVwb3J0KQorCXsKKwkJbV90aW1lc3RhbXAgPSBHZXRUaW1lKCk7CisJCVJlcG9ydCgpOworCX0KKworICAgIGlmIChtX3N1c3BlbmRPbkVycm9yRW5hYmxlZCkgc3VzcGVuZFRhc2soMCk7Cit9CisKK3ZvaWQgRXJyb3I6OlJlcG9ydCgpCit7CisJc3RkOjpzdHJpbmdzdHJlYW0gZXJyb3JTdHJlYW07CisKKwllcnJvclN0cmVhbSA8PCAiRXJyb3Igb24gbGluZSAiIDw8IG1fbGluZU51bWJlciA8PCAiICI7CisJZXJyb3JTdHJlYW0gPDwgIm9mICI8PCBiYXNlbmFtZShtX2ZpbGVuYW1lLmNfc3RyKCkpIDw8ICI6ICI7CisJZXJyb3JTdHJlYW0gPDwgbV9tZXNzYWdlIDw8IHN0ZDo6ZW5kbDsKKwllcnJvclN0cmVhbSA8PCBHZXRTdGFja1RyYWNlKDQpOworCisJc3RkOjpzdHJpbmcgZXJyb3IgPSBlcnJvclN0cmVhbS5zdHIoKTsKKworCURyaXZlclN0YXRpb246OlJlcG9ydEVycm9yKGVycm9yKTsKK30KKwordm9pZCBFcnJvcjo6Q2xlYXIoKQoreworCW1fY29kZSA9IDA7CisJbV9tZXNzYWdlID0gIiI7CisJbV9maWxlbmFtZSA9ICIiOworCW1fZnVuY3Rpb24gPSAiIjsKKwltX2xpbmVOdW1iZXIgPSAwOworCW1fb3JpZ2luYXRpbmdPYmplY3QgPSBOVUxMOworCW1fdGltZXN0YW1wID0gMC4wOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvc3JjL0Vycm9yQmFzZS5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9zcmMvRXJyb3JCYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGRkYTRiCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvc3JjL0Vycm9yQmFzZS5jcHAKQEAgLTAsMCArMSwyMDUgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkVycm9yQmFzZS5oIgorI2luY2x1ZGUgIkhBTC9jcHAvU3luY2hyb25pemVkLmhwcCIKKyNkZWZpbmUgV1BJX0VSUk9SU19ERUZJTkVfU1RSSU5HUworI2luY2x1ZGUgIldQSUVycm9ycy5oIgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGNzdGRpbz4KKworTXV0ZXggRXJyb3JCYXNlOjpfZ2xvYmFsRXJyb3JNdXRleDsKK0Vycm9yIEVycm9yQmFzZTo6X2dsb2JhbEVycm9yOworLyoqCisgKiBAYnJpZWYgSW5pdGlhbGl6ZSB0aGUgaW5zdGFuY2Ugc3RhdHVzIHRvIDAgZm9yIG5vdy4KKyAqLworRXJyb3JCYXNlOjpFcnJvckJhc2UoKQore30KKworRXJyb3JCYXNlOjp+RXJyb3JCYXNlKCkKK3t9CisKKy8qKgorICogQGJyaWVmIFJldHJpZXZlIHRoZSBjdXJyZW50IGVycm9yLgorICogR2V0IHRoZSBjdXJyZW50IGVycm9yIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlbnNvci4KKyAqLworRXJyb3ImIEVycm9yQmFzZTo6R2V0RXJyb3IoKQoreworCXJldHVybiBtX2Vycm9yOworfQorCitjb25zdCBFcnJvciYgRXJyb3JCYXNlOjpHZXRFcnJvcigpIGNvbnN0Cit7CisJcmV0dXJuIG1fZXJyb3I7Cit9CisKKy8qKgorICogQGJyaWVmIENsZWFyIHRoZSBjdXJyZW50IGVycm9yIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlbnNvci4KKyAqLwordm9pZCBFcnJvckJhc2U6OkNsZWFyRXJyb3IoKSBjb25zdAoreworCW1fZXJyb3IuQ2xlYXIoKTsKK30KKworLyoqCisgKiBAYnJpZWYgU2V0IGVycm9yIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBhIEMgbGlicmFyeSBjYWxsIHRoYXQgc2V0IGFuIGVycm9yIHRvIHRoZSAiZXJybm8iIGdsb2JhbCB2YXJpYWJsZS4KKyAqCisgKiBAcGFyYW0gY29udGV4dE1lc3NhZ2UgQSBjdXN0b20gbWVzc2FnZSBmcm9tIHRoZSBjb2RlIHRoYXQgc2V0IHRoZSBlcnJvci4KKyAqIEBwYXJhbSBmaWxlbmFtZSBGaWxlbmFtZSBvZiB0aGUgZXJyb3Igc291cmNlCisgKiBAcGFyYW0gZnVuY3Rpb24gRnVuY3Rpb24gb2YgdGhlIGVycm9yIHNvdXJjZQorICogQHBhcmFtIGxpbmVOdW1iZXIgTGluZSBudW1iZXIgb2YgdGhlIGVycm9yIHNvdXJjZQorICovCit2b2lkIEVycm9yQmFzZTo6U2V0RXJybm9FcnJvcihjb25zdCBjaGFyICpjb250ZXh0TWVzc2FnZSwKKwkJY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IGNoYXIqIGZ1bmN0aW9uLCB1aW50MzJfdCBsaW5lTnVtYmVyKSBjb25zdAoreworCWNoYXIgZXJyWzI1Nl07CisJaW50IGVyck5vID0gZXJybm87CisJaWYgKGVyck5vID09IDApCisJeworCQlzcHJpbnRmKGVyciwgIk9LOiAlcyIsIGNvbnRleHRNZXNzYWdlKTsKKwl9CisJZWxzZQorCXsKKwkJc25wcmludGYoZXJyLCAyNTYsICIlcyAoMHglMDhYKTogJXMiLCBzdHJlcnJvcihlcnJObyksIGVyck5vLCBjb250ZXh0TWVzc2FnZSk7CisJfQorCisJLy8gIFNldCB0aGUgY3VycmVudCBlcnJvciBpbmZvcm1hdGlvbiBmb3IgdGhpcyBvYmplY3QuCisJbV9lcnJvci5TZXQoLTEsIGVyciwgZmlsZW5hbWUsIGZ1bmN0aW9uLCBsaW5lTnVtYmVyLCB0aGlzKTsKKworCS8vIFVwZGF0ZSB0aGUgZ2xvYmFsIGVycm9yIGlmIHRoZXJlIGlzIG5vdCBvbmUgYWxyZWFkeSBzZXQuCisJOjpzdGQ6OnVuaXF1ZV9sb2NrPE11dGV4PiBtdXRleChfZ2xvYmFsRXJyb3JNdXRleCk7CisJaWYgKF9nbG9iYWxFcnJvci5HZXRDb2RlKCkgPT0gMCkgeworCQlfZ2xvYmFsRXJyb3IuQ2xvbmUobV9lcnJvcik7CisJfQorfQorCisvKioKKyAqIEBicmllZiBTZXQgdGhlIGN1cnJlbnQgZXJyb3IgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCBmcm9tIHRoZSBuaXZpc2lvbiBJbWFxIEFQSS4KKyAqCisgKiBAcGFyYW0gc3VjY2VzcyBUaGUgcmV0dXJuIGZyb20gdGhlIGZ1bmN0aW9uCisgKiBAcGFyYW0gY29udGV4dE1lc3NhZ2UgQSBjdXN0b20gbWVzc2FnZSBmcm9tIHRoZSBjb2RlIHRoYXQgc2V0IHRoZSBlcnJvci4KKyAqIEBwYXJhbSBmaWxlbmFtZSBGaWxlbmFtZSBvZiB0aGUgZXJyb3Igc291cmNlCisgKiBAcGFyYW0gZnVuY3Rpb24gRnVuY3Rpb24gb2YgdGhlIGVycm9yIHNvdXJjZQorICogQHBhcmFtIGxpbmVOdW1iZXIgTGluZSBudW1iZXIgb2YgdGhlIGVycm9yIHNvdXJjZQorICovCit2b2lkIEVycm9yQmFzZTo6U2V0SW1hcUVycm9yKGludCBzdWNjZXNzLCBjb25zdCBjaGFyICpjb250ZXh0TWVzc2FnZSwgY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IGNoYXIqIGZ1bmN0aW9uLCB1aW50MzJfdCBsaW5lTnVtYmVyKSBjb25zdAoreworCS8vICBJZiB0aGVyZSB3YXMgYW4gZXJyb3IKKwlpZiAoc3VjY2VzcyA8PSAwKSB7CisJCWNoYXIgZXJyWzI1Nl07CisJCXNwcmludGYoZXJyLCAiJWk6ICVzIiwgc3VjY2VzcywgY29udGV4dE1lc3NhZ2UpOworCisJCS8vICBTZXQgdGhlIGN1cnJlbnQgZXJyb3IgaW5mb3JtYXRpb24gZm9yIHRoaXMgb2JqZWN0LgorCQltX2Vycm9yLlNldChzdWNjZXNzLCBlcnIsIGZpbGVuYW1lLCBmdW5jdGlvbiwgbGluZU51bWJlciwgdGhpcyk7CisKKwkJLy8gVXBkYXRlIHRoZSBnbG9iYWwgZXJyb3IgaWYgdGhlcmUgaXMgbm90IG9uZSBhbHJlYWR5IHNldC4KKwkJOjpzdGQ6OnVuaXF1ZV9sb2NrPE11dGV4PiBtdXRleChfZ2xvYmFsRXJyb3JNdXRleCk7CisJCWlmIChfZ2xvYmFsRXJyb3IuR2V0Q29kZSgpID09IDApIHsKKwkJCV9nbG9iYWxFcnJvci5DbG9uZShtX2Vycm9yKTsKKwkJfQorCX0KK30KKworLyoqCisgKiBAYnJpZWYgU2V0IHRoZSBjdXJyZW50IGVycm9yIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlbnNvci4KKyAqCisgKiBAcGFyYW0gY29kZSBUaGUgZXJyb3IgY29kZQorICogQHBhcmFtIGNvbnRleHRNZXNzYWdlIEEgY3VzdG9tIG1lc3NhZ2UgZnJvbSB0aGUgY29kZSB0aGF0IHNldCB0aGUgZXJyb3IuCisgKiBAcGFyYW0gZmlsZW5hbWUgRmlsZW5hbWUgb2YgdGhlIGVycm9yIHNvdXJjZQorICogQHBhcmFtIGZ1bmN0aW9uIEZ1bmN0aW9uIG9mIHRoZSBlcnJvciBzb3VyY2UKKyAqIEBwYXJhbSBsaW5lTnVtYmVyIExpbmUgbnVtYmVyIG9mIHRoZSBlcnJvciBzb3VyY2UKKyAqLwordm9pZCBFcnJvckJhc2U6OlNldEVycm9yKEVycm9yOjpDb2RlIGNvZGUsIGNvbnN0IGNoYXIgKmNvbnRleHRNZXNzYWdlLAorCQljb25zdCBjaGFyKiBmaWxlbmFtZSwgY29uc3QgY2hhciogZnVuY3Rpb24sIHVpbnQzMl90IGxpbmVOdW1iZXIpIGNvbnN0Cit7CisJLy8gIElmIHRoZXJlIHdhcyBhbiBlcnJvcgorCWlmIChjb2RlICE9IDApIHsKKwkJLy8gIFNldCB0aGUgY3VycmVudCBlcnJvciBpbmZvcm1hdGlvbiBmb3IgdGhpcyBvYmplY3QuCisJCW1fZXJyb3IuU2V0KGNvZGUsIGNvbnRleHRNZXNzYWdlLCBmaWxlbmFtZSwgZnVuY3Rpb24sIGxpbmVOdW1iZXIsIHRoaXMpOworCisJCS8vIFVwZGF0ZSB0aGUgZ2xvYmFsIGVycm9yIGlmIHRoZXJlIGlzIG5vdCBvbmUgYWxyZWFkeSBzZXQuCisJCTo6c3RkOjp1bmlxdWVfbG9jazxNdXRleD4gbXV0ZXgoX2dsb2JhbEVycm9yTXV0ZXgpOworCQlpZiAoX2dsb2JhbEVycm9yLkdldENvZGUoKSA9PSAwKSB7CisJCQlfZ2xvYmFsRXJyb3IuQ2xvbmUobV9lcnJvcik7CisJCX0KKwl9Cit9CisKKy8qKgorICogQGJyaWVmIFNldCB0aGUgY3VycmVudCBlcnJvciBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZW5zb3IuCisgKgorICogQHBhcmFtIGVycm9yTWVzc2FnZSBUaGUgZXJyb3IgbWVzc2FnZSBmcm9tIFdQSUVycm9ycy5oCisgKiBAcGFyYW0gY29udGV4dE1lc3NhZ2UgQSBjdXN0b20gbWVzc2FnZSBmcm9tIHRoZSBjb2RlIHRoYXQgc2V0IHRoZSBlcnJvci4KKyAqIEBwYXJhbSBmaWxlbmFtZSBGaWxlbmFtZSBvZiB0aGUgZXJyb3Igc291cmNlCisgKiBAcGFyYW0gZnVuY3Rpb24gRnVuY3Rpb24gb2YgdGhlIGVycm9yIHNvdXJjZQorICogQHBhcmFtIGxpbmVOdW1iZXIgTGluZSBudW1iZXIgb2YgdGhlIGVycm9yIHNvdXJjZQorICovCit2b2lkIEVycm9yQmFzZTo6U2V0V1BJRXJyb3IoY29uc3QgY2hhciAqZXJyb3JNZXNzYWdlLCBFcnJvcjo6Q29kZSBjb2RlICwgY29uc3QgY2hhciAqY29udGV4dE1lc3NhZ2UsCisJCWNvbnN0IGNoYXIqIGZpbGVuYW1lLCBjb25zdCBjaGFyKiBmdW5jdGlvbiwgdWludDMyX3QgbGluZU51bWJlcikgY29uc3QKK3sKKwljaGFyIGVyclsyNTZdOworCXNwcmludGYoZXJyLCAiJXM6ICVzIiwgZXJyb3JNZXNzYWdlLCBjb250ZXh0TWVzc2FnZSk7CisKKwkvLyAgU2V0IHRoZSBjdXJyZW50IGVycm9yIGluZm9ybWF0aW9uIGZvciB0aGlzIG9iamVjdC4KKwltX2Vycm9yLlNldChjb2RlLCBlcnIsIGZpbGVuYW1lLCBmdW5jdGlvbiwgbGluZU51bWJlciwgdGhpcyk7CisKKwkvLyBVcGRhdGUgdGhlIGdsb2JhbCBlcnJvciBpZiB0aGVyZSBpcyBub3Qgb25lIGFscmVhZHkgc2V0LgorCTo6c3RkOjp1bmlxdWVfbG9jazxNdXRleD4gbXV0ZXgoX2dsb2JhbEVycm9yTXV0ZXgpOworCWlmIChfZ2xvYmFsRXJyb3IuR2V0Q29kZSgpID09IDApIHsKKwkJX2dsb2JhbEVycm9yLkNsb25lKG1fZXJyb3IpOworCX0KK30KKwordm9pZCBFcnJvckJhc2U6OkNsb25lRXJyb3IoRXJyb3JCYXNlICpyaHMpIGNvbnN0Cit7CisJbV9lcnJvci5DbG9uZShyaHMtPkdldEVycm9yKCkpOworfQorCisvKioKK0BicmllZiBDaGVjayBpZiB0aGUgY3VycmVudCBlcnJvciBjb2RlIHJlcHJlc2VudHMgYSBmYXRhbCBlcnJvci4KKworQHJldHVybiB0cnVlIGlmIHRoZSBjdXJyZW50IGVycm9yIGlzIGZhdGFsLgorKi8KK2Jvb2wgRXJyb3JCYXNlOjpTdGF0dXNJc0ZhdGFsKCkgY29uc3QKK3sKKwlyZXR1cm4gbV9lcnJvci5HZXRDb2RlKCkgPCAwOworfQorCit2b2lkIEVycm9yQmFzZTo6U2V0R2xvYmFsRXJyb3IoRXJyb3I6OkNvZGUgY29kZSwgY29uc3QgY2hhciAqY29udGV4dE1lc3NhZ2UsCisJCWNvbnN0IGNoYXIqIGZpbGVuYW1lLCBjb25zdCBjaGFyKiBmdW5jdGlvbiwgdWludDMyX3QgbGluZU51bWJlcikKK3sKKwkvLyAgSWYgdGhlcmUgd2FzIGFuIGVycm9yCisJaWYgKGNvZGUgIT0gMCkgeworCQk6OnN0ZDo6dW5pcXVlX2xvY2s8TXV0ZXg+IG11dGV4KF9nbG9iYWxFcnJvck11dGV4KTsKKworCQkvLyAgU2V0IHRoZSBjdXJyZW50IGVycm9yIGluZm9ybWF0aW9uIGZvciB0aGlzIG9iamVjdC4KKwkJX2dsb2JhbEVycm9yLlNldChjb2RlLCBjb250ZXh0TWVzc2FnZSwgZmlsZW5hbWUsIGZ1bmN0aW9uLCBsaW5lTnVtYmVyLCBOVUxMKTsKKwl9Cit9CisKK3ZvaWQgRXJyb3JCYXNlOjpTZXRHbG9iYWxXUElFcnJvcihjb25zdCBjaGFyICplcnJvck1lc3NhZ2UsIGNvbnN0IGNoYXIgKmNvbnRleHRNZXNzYWdlLAorICAgICAgICBjb25zdCBjaGFyKiBmaWxlbmFtZSwgY29uc3QgY2hhciogZnVuY3Rpb24sIHVpbnQzMl90IGxpbmVOdW1iZXIpCit7CisJY2hhciBlcnJbMjU2XTsKKwlzcHJpbnRmKGVyciwgIiVzOiAlcyIsIGVycm9yTWVzc2FnZSwgY29udGV4dE1lc3NhZ2UpOworCisJOjpzdGQ6OnVuaXF1ZV9sb2NrPE11dGV4PiBtdXRleChfZ2xvYmFsRXJyb3JNdXRleCk7CisJaWYgKF9nbG9iYWxFcnJvci5HZXRDb2RlKCkgIT0gMCkgeworCQlfZ2xvYmFsRXJyb3IuQ2xlYXIoKTsKKwl9CisJX2dsb2JhbEVycm9yLlNldCgtMSwgZXJyLCBmaWxlbmFtZSwgZnVuY3Rpb24sIGxpbmVOdW1iZXIsIE5VTEwpOworfQorCisvKioKKyAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBnbG9iYWwgZXJyb3IuCisqLworRXJyb3ImIEVycm9yQmFzZTo6R2V0R2xvYmFsRXJyb3IoKQoreworCTo6c3RkOjp1bmlxdWVfbG9jazxNdXRleD4gbXV0ZXgoX2dsb2JhbEVycm9yTXV0ZXgpOworCXJldHVybiBfZ2xvYmFsRXJyb3I7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9zcmMvSExVc2FnZVJlcG9ydGluZy5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9zcmMvSExVc2FnZVJlcG9ydGluZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAwMzI5OAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL3NyYy9ITFVzYWdlUmVwb3J0aW5nLmNwcApAQCAtMCwwICsxLDIwIEBACisKKyNpbmNsdWRlICJITFVzYWdlUmVwb3J0aW5nLmgiCisKK0hMVXNhZ2VSZXBvcnRpbmdJbnRlcmZhY2UqIEhMVXNhZ2VSZXBvcnRpbmc6OmltcGwgPSAwOworCit2b2lkIEhMVXNhZ2VSZXBvcnRpbmc6OlNldEltcGxlbWVudGF0aW9uKEhMVXNhZ2VSZXBvcnRpbmdJbnRlcmZhY2UqIGkpIHsKKyAgICBpbXBsID0gaTsKK30KKwordm9pZCBITFVzYWdlUmVwb3J0aW5nOjpSZXBvcnRTY2hlZHVsZXIoKSB7CisgICAgaWYgKGltcGwgIT0gMCkgeworICAgICAgICBpbXBsLT5SZXBvcnRTY2hlZHVsZXIoKTsKKyAgICB9Cit9CisKK3ZvaWQgSExVc2FnZVJlcG9ydGluZzo6UmVwb3J0U21hcnREYXNoYm9hcmQoKSB7CisgICAgaWYgKGltcGwgIT0gMCkgeworICAgICAgICBpbXBsLT5SZXBvcnRTbWFydERhc2hib2FyZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL3NyYy9SZXNvdXJjZS5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9zcmMvUmVzb3VyY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ODIxNTUKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9zcmMvUmVzb3VyY2UuY3BwCkBAIC0wLDAgKzEsMTIwIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJSZXNvdXJjZS5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorI2luY2x1ZGUgIkVycm9yQmFzZS5oIgorCitSZWVudHJhbnRNdXRleCBSZXNvdXJjZTo6bV9jcmVhdGVMb2NrOworCisvKioKKyAqIEFsbG9jYXRlIHN0b3JhZ2UgZm9yIGEgbmV3IGluc3RhbmNlIG9mIFJlc291cmNlLgorICogQWxsb2NhdGUgYSBib29sIGFycmF5IG9mIHZhbHVlcyB0aGF0IHdpbGwgZ2V0IGluaXRpYWxpemVkIHRvIGluZGljYXRlIHRoYXQgbm8gcmVzb3VyY2VzCisgKiBoYXZlIGJlZW4gYWxsb2NhdGVkIHlldC4gVGhlIGluZGljaWVzIG9mIHRoZSByZXNvdXJjZXMgYXJlIFswIC4uIGVsZW1lbnRzIC0gMV0uCisgKi8KK1Jlc291cmNlOjpSZXNvdXJjZSh1aW50MzJfdCBlbGVtZW50cykKK3sKKwk6OnN0ZDo6dW5pcXVlX2xvY2s8UmVlbnRyYW50TXV0ZXg+IHN5bmMobV9jcmVhdGVMb2NrKTsKKwltX3NpemUgPSBlbGVtZW50czsKKwltX2lzQWxsb2NhdGVkID0gbmV3IGJvb2xbbV9zaXplXTsKKwlmb3IgKHVpbnQzMl90IGk9MDsgaSA8IG1fc2l6ZTsgaSsrKQorCXsKKwkJbV9pc0FsbG9jYXRlZFtpXSA9IGZhbHNlOworCX0KK30KKworLyoqCisgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBSZXNvdXJjZSBhbGxvY2F0aW9uLXRyYWNrZXIgKmlmKiBuZWVkZWQuCisgKgorICogQHBhcmFtIHIgLS0gYWRkcmVzcyBvZiB0aGUgY2FsbGVyJ3MgUmVzb3VyY2UgcG9pbnRlci4gSWYgKnIgPT0gTlVMTCwgdGhpcworICogICAgd2lsbCBjb25zdHJ1Y3QgYSBSZXNvdXJjZSBhbmQgbWFrZSAqciBwb2ludCB0byBpdC4gSWYgKnIgIT0gTlVMTCwgaS5lLgorICogICAgdGhlIGNhbGxlciBhbHJlYWR5IGhhcyBhIFJlc291cmNlIGluc3RhbmNlLCB0aGlzIHdvbid0IGRvIGFueXRoaW5nLgorICogQHBhcmFtIGVsZW1lbnRzIC0tIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgZm9yIHRoaXMgUmVzb3VyY2UgYWxsb2NhdG9yIHRvCisgKiAgICB0cmFjaywgdGhhdCBpcywgaXQgd2lsbCBhbGxvY2F0ZSByZXNvdXJjZSBudW1iZXJzIGluIHRoZSByYW5nZQorICogICAgWzAgLi4gZWxlbWVudHMgLSAxXS4KKyAqLworLypzdGF0aWMqLyB2b2lkIFJlc291cmNlOjpDcmVhdGVSZXNvdXJjZU9iamVjdChSZXNvdXJjZSAqKnIsIHVpbnQzMl90IGVsZW1lbnRzKQoreworCTo6c3RkOjp1bmlxdWVfbG9jazxSZWVudHJhbnRNdXRleD4gc3luYyhtX2NyZWF0ZUxvY2spOworCWlmICgqciA9PSBOVUxMKQorCXsKKwkJKnIgPSBuZXcgUmVzb3VyY2UoZWxlbWVudHMpOworCX0KK30KKworLyoqCisgKiBEZWxldGUgdGhlIGFsbG9jYXRlZCBhcnJheSBvciByZXNvdXJjZXMuCisgKiBUaGlzIGhhcHBlbnMgd2hlbiB0aGUgbW9kdWxlIGlzIHVubG9hZGVkIChwcm92aWRlZCBpdCB3YXMgc3RhdGljYWxseSBhbGxvY2F0ZWQpLgorICovCitSZXNvdXJjZTo6flJlc291cmNlKCkKK3sKKwlkZWxldGVbXSBtX2lzQWxsb2NhdGVkOworfQorCisvKioKKyAqIEFsbG9jYXRlIGEgcmVzb3VyY2UuCisgKiBXaGVuIGEgcmVzb3VyY2UgaXMgcmVxdWVzdGVkLCBtYXJrIGl0IGFsbG9jYXRlZC4gSW4gdGhpcyBjYXNlLCBhIGZyZWUgcmVzb3VyY2UgdmFsdWUKKyAqIHdpdGhpbiB0aGUgcmFuZ2UgaXMgbG9jYXRlZCBhbmQgcmV0dXJuZWQgYWZ0ZXIgaXQgaXMgbWFya2VkIGFsbG9jYXRlZC4KKyAqLwordWludDMyX3QgUmVzb3VyY2U6OkFsbG9jYXRlKGNvbnN0IGNoYXIgKnJlc291cmNlRGVzYykKK3sKKwk6OnN0ZDo6dW5pcXVlX2xvY2s8UmVlbnRyYW50TXV0ZXg+IHN5bmMobV9hbGxvY2F0ZUxvY2spOworCWZvciAodWludDMyX3QgaT0wOyBpIDwgbV9zaXplOyBpKyspCisJeworCQlpZiAoIW1faXNBbGxvY2F0ZWRbaV0pCisJCXsKKwkJCW1faXNBbGxvY2F0ZWRbaV0gPSB0cnVlOworCQkJcmV0dXJuIGk7CisJCX0KKwl9CisJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoTm9BdmFpbGFibGVSZXNvdXJjZXMsIHJlc291cmNlRGVzYyk7CisJcmV0dXJuIH4wdWw7Cit9CisKKy8qKgorICogQWxsb2NhdGUgYSBzcGVjaWZpYyByZXNvdXJjZSB2YWx1ZS4KKyAqIFRoZSB1c2VyIHJlcXVlc3RzIGEgc3BlY2lmaWMgcmVzb3VyY2UgdmFsdWUsIGkuZS4gY2hhbm5lbCBudW1iZXIgYW5kIGl0IGlzIHZlcmlmaWVkCisgKiB1bmFsbG9jYXRlZCwgdGhlbiByZXR1cm5lZC4KKyAqLwordWludDMyX3QgUmVzb3VyY2U6OkFsbG9jYXRlKHVpbnQzMl90IGluZGV4LCBjb25zdCBjaGFyICpyZXNvdXJjZURlc2MpCit7CisJOjpzdGQ6OnVuaXF1ZV9sb2NrPFJlZW50cmFudE11dGV4PiBzeW5jKG1fYWxsb2NhdGVMb2NrKTsKKwlpZiAoaW5kZXggPj0gbV9zaXplKQorCXsKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoQ2hhbm5lbEluZGV4T3V0T2ZSYW5nZSwgcmVzb3VyY2VEZXNjKTsKKwkJcmV0dXJuIH4wdWw7CisJfQorCWlmICggbV9pc0FsbG9jYXRlZFtpbmRleF0gKQorCXsKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoUmVzb3VyY2VBbHJlYWR5QWxsb2NhdGVkLCByZXNvdXJjZURlc2MpOworCQlyZXR1cm4gfjB1bDsKKwl9CisJbV9pc0FsbG9jYXRlZFtpbmRleF0gPSB0cnVlOworCXJldHVybiBpbmRleDsKK30KKworCisvKioKKyAqIEZyZWUgYW4gYWxsb2NhdGVkIHJlc291cmNlLgorICogQWZ0ZXIgYSByZXNvdXJjZSBpcyBubyBsb25nZXIgbmVlZGVkLCBmb3IgZXhhbXBsZSBhIGRlc3RydWN0b3IgaXMgY2FsbGVkIGZvciBhIGNoYW5uZWwgYXNzaWdubWVudAorICogY2xhc3MsIEZyZWUgd2lsbCByZWxlYXNlIHRoZSByZXNvdXJjZSB2YWx1ZSBzbyBpdCBjYW4gYmUgcmV1c2VkIHNvbWV3aGVyZSBlbHNlIGluIHRoZSBwcm9ncmFtLgorICovCit2b2lkIFJlc291cmNlOjpGcmVlKHVpbnQzMl90IGluZGV4KQoreworCTo6c3RkOjp1bmlxdWVfbG9jazxSZWVudHJhbnRNdXRleD4gc3luYyhtX2FsbG9jYXRlTG9jayk7CisJaWYgKGluZGV4ID09IH4wdWwpIHJldHVybjsKKwlpZiAoaW5kZXggPj0gbV9zaXplKQorCXsKKwkJd3BpX3NldFdQSUVycm9yKE5vdEFsbG9jYXRlZCk7CisJCXJldHVybjsKKwl9CisJaWYgKCFtX2lzQWxsb2NhdGVkW2luZGV4XSkKKwl7CisJCXdwaV9zZXRXUElFcnJvcihOb3RBbGxvY2F0ZWQpOworCQlyZXR1cm47CisJfQorCW1faXNBbGxvY2F0ZWRbaW5kZXhdID0gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9zcmMvUm9ib3RTdGF0ZS5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9zcmMvUm9ib3RTdGF0ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ3MDAwYQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL3NyYy9Sb2JvdFN0YXRlLmNwcApAQCAtMCwwICsxLDQyIEBACisjaW5jbHVkZSAiUm9ib3RTdGF0ZS5oIgorCitSb2JvdFN0YXRlSW50ZXJmYWNlKiBSb2JvdFN0YXRlOjppbXBsID0gMDsKKwordm9pZCBSb2JvdFN0YXRlOjpTZXRJbXBsZW1lbnRhdGlvbihSb2JvdFN0YXRlSW50ZXJmYWNlKiBpKSB7CisgICAgaW1wbCA9IGk7Cit9CisKK2Jvb2wgUm9ib3RTdGF0ZTo6SXNEaXNhYmxlZCgpIHsKKyAgICBpZiAoaW1wbCAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBpbXBsLT5Jc0Rpc2FibGVkKCk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIFJvYm90U3RhdGU6OklzRW5hYmxlZCgpIHsKKyAgICBpZiAoaW1wbCAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBpbXBsLT5Jc0VuYWJsZWQoKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFJvYm90U3RhdGU6OklzT3BlcmF0b3JDb250cm9sKCkgeworICAgIGlmIChpbXBsICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGltcGwtPklzT3BlcmF0b3JDb250cm9sKCk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIFJvYm90U3RhdGU6OklzQXV0b25vbW91cygpIHsKKyAgICBpZiAoaW1wbCAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBpbXBsLT5Jc0F1dG9ub21vdXMoKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFJvYm90U3RhdGU6OklzVGVzdCgpIHsKKyAgICBpZiAoaW1wbCAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBpbXBsLT5Jc1Rlc3QoKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL0NNYWtlTGlzdHMudHh0IGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MzUyMmMKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxMyBAQAorY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuOCkKK3Byb2plY3QoV1BJTGliQysrRGV2aWNlcykKKworZmlsZShHTE9CX1JFQ1VSU0UgU1JDX0ZJTEVTIHNyYy8qLmNwcCkKK2luY2x1ZGVfZGlyZWN0b3JpZXMoaW5jbHVkZS8gJHtXUElMSUJfSU5DTFVERVN9ICR7SEFMX0FQSV9JTkNMVURFU30gJHtOV1RfQVBJX0lOQ0xVREVTfSkKK2FkZF9saWJyYXJ5KHdwaWxpYl9ub25zaGFyZWQgU1RBVElDICR7U1JDX0ZJTEVTfSAke0NPTV9TUkNfRklMRVN9KQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKHdwaWxpYl9ub25zaGFyZWQgSEFMQXRoZW5hIE5ldHdvcmtUYWJsZXMgJHtOSV9MSUJTfSkKK0lOU1RBTEwoVEFSR0VUUyB3cGlsaWJfbm9uc2hhcmVkIEFSQ0hJVkUgREVTVElOQVRJT04gbGliIENPTVBPTkVOVCBsaWIpCitJTlNUQUxMKERJUkVDVE9SWSBpbmNsdWRlIERFU1RJTkFUSU9OICR7Q01BS0VfSU5TVEFMTF9QUkVGSVh9IENPTVBPTkVOVCBoZWFkZXJzKQorIyBsaWIvIGMgbSBnY2NfcyBsZC1saW51eAorIyB1c3IvbGliIHN0ZGMrKworIyBuaV9lbWIKKyMgSEFMIE5XVApkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQURYTDM0NV9JMkMuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0FEWEwzNDVfSTJDLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNmZjMzNQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0FEWEwzNDVfSTJDLmgKQEAgLTAsMCArMSw1MyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJpbnRlcmZhY2VzL0FjY2VsZXJvbWV0ZXIuaCIKKyNpbmNsdWRlICJJMkMuaCIKKworLyoqCisgKiBBRFhMMzQ1IEFjY2VsZXJvbWV0ZXIgb24gSTJDLgorICoKKyAqIFRoaXMgY2xhc3MgYWxsb3dzIGFjY2VzcyB0byBhIEFuYWxvZyBEZXZpY2VzIEFEWEwzNDUgMy1heGlzIGFjY2VsZXJvbWV0ZXIgb24gYW4gSTJDIGJ1cy4KKyAqIFRoaXMgY2xhc3MgYXNzdW1lcyB0aGUgZGVmYXVsdCAobm90IGFsdGVybmF0ZSkgc2Vuc29yIGFkZHJlc3Mgb2YgMHgxRCAoNy1iaXQgYWRkcmVzcykuCisgKi8KK2NsYXNzIEFEWEwzNDVfSTJDIDogcHVibGljIEFjY2VsZXJvbWV0ZXIsIHB1YmxpYyBJMkMKK3sKK3Byb3RlY3RlZDoKKwlzdGF0aWMgY29uc3QgdWludDhfdCBrQWRkcmVzcyA9IDB4MUQ7CisJc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1Bvd2VyQ3RsUmVnaXN0ZXIgPSAweDJEOworCXN0YXRpYyBjb25zdCB1aW50OF90IGtEYXRhRm9ybWF0UmVnaXN0ZXIgPSAweDMxOworCXN0YXRpYyBjb25zdCB1aW50OF90IGtEYXRhUmVnaXN0ZXIgPSAweDMyOworCXN0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtHc1BlckxTQiA9IDAuMDAzOTA2MjU7CisJZW51bSBQb3dlckN0bEZpZWxkcyB7a1Bvd2VyQ3RsX0xpbms9MHgyMCwga1Bvd2VyQ3RsX0F1dG9TbGVlcD0weDEwLCBrUG93ZXJDdGxfTWVhc3VyZT0weDA4LCBrUG93ZXJDdGxfU2xlZXA9MHgwNH07CisJZW51bSBEYXRhRm9ybWF0RmllbGRzIHtrRGF0YUZvcm1hdF9TZWxmVGVzdD0weDgwLCBrRGF0YUZvcm1hdF9TUEk9MHg0MCwga0RhdGFGb3JtYXRfSW50SW52ZXJ0PTB4MjAsCisJCWtEYXRhRm9ybWF0X0Z1bGxSZXM9MHgwOCwga0RhdGFGb3JtYXRfSnVzdGlmeT0weDA0fTsKKworcHVibGljOgorCWVudW0gQXhlcyB7a0F4aXNfWD0weDAwLCBrQXhpc19ZPTB4MDIsIGtBeGlzX1o9MHgwNH07CisJc3RydWN0IEFsbEF4ZXMKKwl7CisJCWRvdWJsZSBYQXhpczsKKwkJZG91YmxlIFlBeGlzOworCQlkb3VibGUgWkF4aXM7CisJfTsKKworcHVibGljOgorCWV4cGxpY2l0IEFEWEwzNDVfSTJDKFBvcnQgcG9ydCwgUmFuZ2UgcmFuZ2UgPSBrUmFuZ2VfMkcpOworCXZpcnR1YWwgfkFEWEwzNDVfSTJDKCk7CisKKwkvLyBBY2NlbGVyb21ldGVyIGludGVyZmFjZQorCXZpcnR1YWwgdm9pZCBTZXRSYW5nZShSYW5nZSByYW5nZSk7CisJdmlydHVhbCBkb3VibGUgR2V0WCgpOworCXZpcnR1YWwgZG91YmxlIEdldFkoKTsKKwl2aXJ0dWFsIGRvdWJsZSBHZXRaKCk7CisKKwl2aXJ0dWFsIGRvdWJsZSBHZXRBY2NlbGVyYXRpb24oQXhlcyBheGlzKTsKKwl2aXJ0dWFsIEFsbEF4ZXMgR2V0QWNjZWxlcmF0aW9ucygpOworCitwcm90ZWN0ZWQ6CisJLy9JMkMqIG1faTJjOworfTsKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0FEWEwzNDVfU1BJLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9BRFhMMzQ1X1NQSS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZmM2NGUKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9BRFhMMzQ1X1NQSS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiaW50ZXJmYWNlcy9BY2NlbGVyb21ldGVyLmgiCisjaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgorI2luY2x1ZGUgIlNQSS5oIgorCitjbGFzcyBEaWdpdGFsSW5wdXQ7CitjbGFzcyBEaWdpdGFsT3V0cHV0OworCisvKioKKyAqIEFEWEwzNDUgQWNjZWxlcm9tZXRlciBvbiBTUEkuCisgKgorICogVGhpcyBjbGFzcyBhbGxvd3MgYWNjZXNzIHRvIGFuIEFuYWxvZyBEZXZpY2VzIEFEWEwzNDUgMy1heGlzIGFjY2VsZXJvbWV0ZXIgdmlhIFNQSS4KKyAqIFRoaXMgY2xhc3MgYXNzdW1lcyB0aGUgc2Vuc29yIGlzIHdpcmVkIGluIDQtd2lyZSBTUEkgbW9kZS4KKyAqLworY2xhc3MgQURYTDM0NV9TUEkgOiBwdWJsaWMgQWNjZWxlcm9tZXRlciwgcHVibGljIFNlbnNvckJhc2UKK3sKK3Byb3RlY3RlZDoKKwlzdGF0aWMgY29uc3QgdWludDhfdCBrUG93ZXJDdGxSZWdpc3RlciA9IDB4MkQ7CisJc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0RhdGFGb3JtYXRSZWdpc3RlciA9IDB4MzE7CisJc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0RhdGFSZWdpc3RlciA9IDB4MzI7CisJc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga0dzUGVyTFNCID0gMC4wMDM5MDYyNTsKKwllbnVtIFNQSUFkZHJlc3NGaWVsZHMge2tBZGRyZXNzX1JlYWQ9MHg4MCwga0FkZHJlc3NfTXVsdGlCeXRlPTB4NDB9OworCWVudW0gUG93ZXJDdGxGaWVsZHMge2tQb3dlckN0bF9MaW5rPTB4MjAsIGtQb3dlckN0bF9BdXRvU2xlZXA9MHgxMCwga1Bvd2VyQ3RsX01lYXN1cmU9MHgwOCwga1Bvd2VyQ3RsX1NsZWVwPTB4MDR9OworCWVudW0gRGF0YUZvcm1hdEZpZWxkcyB7a0RhdGFGb3JtYXRfU2VsZlRlc3Q9MHg4MCwga0RhdGFGb3JtYXRfU1BJPTB4NDAsIGtEYXRhRm9ybWF0X0ludEludmVydD0weDIwLAorCQlrRGF0YUZvcm1hdF9GdWxsUmVzPTB4MDgsIGtEYXRhRm9ybWF0X0p1c3RpZnk9MHgwNH07CisKK3B1YmxpYzoKKwllbnVtIEF4ZXMge2tBeGlzX1g9MHgwMCwga0F4aXNfWT0weDAyLCBrQXhpc19aPTB4MDR9OworCXN0cnVjdCBBbGxBeGVzCisJeworCQlkb3VibGUgWEF4aXM7CisJCWRvdWJsZSBZQXhpczsKKwkJZG91YmxlIFpBeGlzOworCX07CisKK3B1YmxpYzoKKwlBRFhMMzQ1X1NQSShTUEk6OlBvcnQgcG9ydCwgUmFuZ2UgcmFuZ2U9a1JhbmdlXzJHKTsKKwl2aXJ0dWFsIH5BRFhMMzQ1X1NQSSgpOworCisJLy8gQWNjZWxlcm9tZXRlciBpbnRlcmZhY2UKKwl2aXJ0dWFsIHZvaWQgU2V0UmFuZ2UoUmFuZ2UgcmFuZ2UpOworCXZpcnR1YWwgZG91YmxlIEdldFgoKTsKKwl2aXJ0dWFsIGRvdWJsZSBHZXRZKCk7CisJdmlydHVhbCBkb3VibGUgR2V0WigpOworCisJdmlydHVhbCBkb3VibGUgR2V0QWNjZWxlcmF0aW9uKEF4ZXMgYXhpcyk7CisJdmlydHVhbCBBbGxBeGVzIEdldEFjY2VsZXJhdGlvbnMoKTsKKworcHJvdGVjdGVkOgorCXZvaWQgSW5pdChSYW5nZSByYW5nZSk7CisKKwlTUEkqIG1fc3BpOworCVNQSTo6UG9ydCBtX3BvcnQ7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQW5hbG9nQWNjZWxlcm9tZXRlci5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQW5hbG9nQWNjZWxlcm9tZXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkN2EzZjAKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9BbmFsb2dBY2NlbGVyb21ldGVyLmgKQEAgLTAsMCArMSwzNiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJBbmFsb2dJbnB1dC5oIgorI2luY2x1ZGUgIlNlbnNvckJhc2UuaCIKKyNpbmNsdWRlICJQSURTb3VyY2UuaCIKKworLyoqCisgKiBIYW5kbGUgb3BlcmF0aW9uIG9mIGFuIGFuYWxvZyBhY2NlbGVyb21ldGVyLgorICogVGhlIGFjY2VsZXJvbWV0ZXIgcmVhZHMgYWNjZWxlcmF0aW9uIGRpcmVjdGx5IHRocm91Z2ggdGhlIHNlbnNvci4gTWFueSBzZW5zb3JzIGhhdmUKKyAqIG11bHRpcGxlIGF4aXMgYW5kIGNhbiBiZSB0cmVhdGVkIGFzIG11bHRpcGxlIGRldmljZXMuIEVhY2ggaXMgY2FsaWJyYXRlZCBieSBmaW5kaW5nCisgKiB0aGUgY2VudGVyIHZhbHVlIG92ZXIgYSBwZXJpb2Qgb2YgdGltZS4KKyAqLworY2xhc3MgQW5hbG9nQWNjZWxlcm9tZXRlciA6IHB1YmxpYyBTZW5zb3JCYXNlLCBwdWJsaWMgUElEU291cmNlIHsKK3B1YmxpYzoKKwlleHBsaWNpdCBBbmFsb2dBY2NlbGVyb21ldGVyKGludDMyX3QgY2hhbm5lbCk7CisJZXhwbGljaXQgQW5hbG9nQWNjZWxlcm9tZXRlcihBbmFsb2dJbnB1dCAqY2hhbm5lbCk7CisJdmlydHVhbCB+QW5hbG9nQWNjZWxlcm9tZXRlcigpOworCisJZmxvYXQgR2V0QWNjZWxlcmF0aW9uKCk7CisJdm9pZCBTZXRTZW5zaXRpdml0eShmbG9hdCBzZW5zaXRpdml0eSk7CisJdm9pZCBTZXRaZXJvKGZsb2F0IHplcm8pOworCWRvdWJsZSBQSURHZXQoKTsKKworcHJpdmF0ZToKKwl2b2lkIEluaXRBY2NlbGVyb21ldGVyKCk7CisKKwlBbmFsb2dJbnB1dCAqbV9BbmFsb2dJbnB1dDsKKwlmbG9hdCBtX3ZvbHRzUGVyRzsKKwlmbG9hdCBtX3plcm9HVm9sdGFnZTsKKwlib29sIG1fYWxsb2NhdGVkQ2hhbm5lbDsKK307CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9BbmFsb2dJbnB1dC5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQW5hbG9nSW5wdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTEwODA4Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQW5hbG9nSW5wdXQuaApAQCAtMCwwICsxLDY4IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiSEFML0hBTC5ocHAiCisjaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgorI2luY2x1ZGUgIlBJRFNvdXJjZS5oIgorCisvKioKKyAqIEFuYWxvZyBpbnB1dCBjbGFzcy4KKyAqCisgKiBDb25uZWN0ZWQgdG8gZWFjaCBhbmFsb2cgY2hhbm5lbCBpcyBhbiBhdmVyYWdpbmcgYW5kIG92ZXJzYW1wbGluZyBlbmdpbmUuICBUaGlzIGVuZ2luZSBhY2N1bXVsYXRlcworICogdGhlIHNwZWNpZmllZCAoIGJ5IFNldEF2ZXJhZ2VCaXRzKCkgYW5kIFNldE92ZXJzYW1wbGVCaXRzKCkgKSBudW1iZXIgb2Ygc2FtcGxlcyBiZWZvcmUgcmV0dXJuaW5nIGEgbmV3CisgKiB2YWx1ZS4gIFRoaXMgaXMgbm90IGEgc2xpZGluZyB3aW5kb3cgYXZlcmFnZS4gIFRoZSBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgb3ZlcnNhbXBsZWQgc2FtcGxlcyBhbmQKKyAqIHRoZSBhdmVyYWdlZCBzYW1wbGVzIGlzIHRoYXQgdGhlIG92ZXJzYW1wbGVkIHNhbXBsZXMgYXJlIHNpbXBseSBhY2N1bXVsYXRlZCBlZmZlY3RpdmVseSBpbmNyZWFzaW5nIHRoZQorICogcmVzb2x1dGlvbiwgd2hpbGUgdGhlIGF2ZXJhZ2VkIHNhbXBsZXMgYXJlIGRpdmlkZWQgYnkgdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHJldGFpbiB0aGUgcmVzb2x1dGlvbiwKKyAqIGJ1dCBnZXQgbW9yZSBzdGFibGUgdmFsdWVzLgorICovCitjbGFzcyBBbmFsb2dJbnB1dCA6IHB1YmxpYyBTZW5zb3JCYXNlLCBwdWJsaWMgUElEU291cmNlCit7CitwdWJsaWM6CisJc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0FjY3VtdWxhdG9yTW9kdWxlTnVtYmVyID0gMTsKKwlzdGF0aWMgY29uc3QgdWludDMyX3Qga0FjY3VtdWxhdG9yTnVtQ2hhbm5lbHMgPSAyOworCXN0YXRpYyBjb25zdCB1aW50MzJfdCBrQWNjdW11bGF0b3JDaGFubmVsc1trQWNjdW11bGF0b3JOdW1DaGFubmVsc107CisKKwlleHBsaWNpdCBBbmFsb2dJbnB1dCh1aW50MzJfdCBjaGFubmVsKTsKKwl2aXJ0dWFsIH5BbmFsb2dJbnB1dCgpOworCisJaW50MTZfdCBHZXRWYWx1ZSgpOworCWludDMyX3QgR2V0QXZlcmFnZVZhbHVlKCk7CisKKwlmbG9hdCBHZXRWb2x0YWdlKCk7CisJZmxvYXQgR2V0QXZlcmFnZVZvbHRhZ2UoKTsKKworCXVpbnQzMl90IEdldENoYW5uZWwoKTsKKworCXZvaWQgU2V0QXZlcmFnZUJpdHModWludDMyX3QgYml0cyk7CisJdWludDMyX3QgR2V0QXZlcmFnZUJpdHMoKTsKKwl2b2lkIFNldE92ZXJzYW1wbGVCaXRzKHVpbnQzMl90IGJpdHMpOworCXVpbnQzMl90IEdldE92ZXJzYW1wbGVCaXRzKCk7CisKKwl1aW50MzJfdCBHZXRMU0JXZWlnaHQoKTsKKwlpbnQzMl90IEdldE9mZnNldCgpOworCisJYm9vbCBJc0FjY3VtdWxhdG9yQ2hhbm5lbCgpOworCXZvaWQgSW5pdEFjY3VtdWxhdG9yKCk7CisJdm9pZCBTZXRBY2N1bXVsYXRvckluaXRpYWxWYWx1ZShpbnQ2NF90IHZhbHVlKTsKKwl2b2lkIFJlc2V0QWNjdW11bGF0b3IoKTsKKwl2b2lkIFNldEFjY3VtdWxhdG9yQ2VudGVyKGludDMyX3QgY2VudGVyKTsKKwl2b2lkIFNldEFjY3VtdWxhdG9yRGVhZGJhbmQoaW50MzJfdCBkZWFkYmFuZCk7CisJaW50NjRfdCBHZXRBY2N1bXVsYXRvclZhbHVlKCk7CisJdWludDMyX3QgR2V0QWNjdW11bGF0b3JDb3VudCgpOworCXZvaWQgR2V0QWNjdW11bGF0b3JPdXRwdXQoaW50NjRfdCAqdmFsdWUsIHVpbnQzMl90ICpjb3VudCk7CisKKwlzdGF0aWMgdm9pZCBTZXRTYW1wbGVSYXRlKGZsb2F0IHNhbXBsZXNQZXJTZWNvbmQpOworCXN0YXRpYyBmbG9hdCBHZXRTYW1wbGVSYXRlKCk7CisKKwlkb3VibGUgUElER2V0KCk7CisKK3ByaXZhdGU6CisJdm9pZCBJbml0QW5hbG9nSW5wdXQodWludDMyX3QgY2hhbm5lbCk7CisJdWludDMyX3QgbV9jaGFubmVsOworCXZvaWQqIG1fcG9ydDsKKwlpbnQ2NF90IG1fYWNjdW11bGF0b3JPZmZzZXQ7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQW5hbG9nT3V0cHV0LmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9BbmFsb2dPdXRwdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGFiY2IyCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQW5hbG9nT3V0cHV0LmgKQEAgLTAsMCArMSwyOSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KKy8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkhBTC9IQUwuaHBwIgorI2luY2x1ZGUgIlNlbnNvckJhc2UuaCIKKworLyoqCisgKiBNWFAgYW5hbG9nIG91dHB1dCBjbGFzcy4KKyAqLworY2xhc3MgQW5hbG9nT3V0cHV0IDogcHVibGljIFNlbnNvckJhc2UKK3sKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBBbmFsb2dPdXRwdXQodWludDMyX3QgY2hhbm5lbCk7CisgICAgdmlydHVhbCB+QW5hbG9nT3V0cHV0KCk7CisKKyAgICB2b2lkIFNldFZvbHRhZ2UoZmxvYXQgdm9sdGFnZSk7CisgICAgZmxvYXQgR2V0Vm9sdGFnZSgpOworCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBJbml0QW5hbG9nT3V0cHV0KHVpbnQzMl90IGNoYW5uZWwpOworICAgIHVpbnQzMl90IG1fY2hhbm5lbDsKKyAgICB2b2lkKiBtX3BvcnQ7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQW5hbG9nUG90ZW50aW9tZXRlci5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQW5hbG9nUG90ZW50aW9tZXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiOGNkNzYKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9BbmFsb2dQb3RlbnRpb21ldGVyLmgKQEAgLTAsMCArMSw2NCBAQAorCisjaW5jbHVkZSAiQW5hbG9nSW5wdXQuaCIKKyNpbmNsdWRlICJpbnRlcmZhY2VzL1BvdGVudGlvbWV0ZXIuaCIKKworLyoqCisgKiBDbGFzcyBmb3IgcmVhZGluZyBhbmFsb2cgcG90ZW50aW9tZXRlcnMuIEFuYWxvZyBwb3RlbnRpb21ldGVycyByZWFkCisgKiBpbiBhbiBhbmFsb2cgdm9sdGFnZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgcG9zaXRpb24uIFRoZSBwb3NpdGlvbiBpcworICogaW4gd2hpY2hldmVyIHVuaXRzIHlvdSBjaG9vc2UsIGJ5IHdheSBvZiB0aGUgc2NhbGluZyBhbmQgb2Zmc2V0CisgKiBjb25zdGFudHMgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3Rvci4KKyAqCisgKiBAYXV0aG9yIEFsZXggSGVubmluZworICogQGF1dGhvciBDb2xieSBTa2VnZ3MgKHJhaWwgdm9sdGFnZSkKKyAqLworY2xhc3MgQW5hbG9nUG90ZW50aW9tZXRlciA6IHB1YmxpYyBQb3RlbnRpb21ldGVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBBbmFsb2dQb3RlbnRpb21ldGVyIGNvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogVXNlIHRoZSBmdWxsUmFuZ2UgYW5kIG9mZnNldCB2YWx1ZXMgc28gdGhhdCB0aGUgb3V0cHV0IHByb2R1Y2VzCisgICAgICogbWVhbmluZ2Z1bCB2YWx1ZXMuIEkuRTogeW91IGhhdmUgYSAyNzAgZGVncmVlIHBvdGVudGlvbWV0ZXIgYW5kCisgICAgICogeW91IHdhbnQgdGhlIG91dHB1dCB0byBiZSBkZWdyZWVzIHdpdGggdGhlIGhhbGZ3YXkgcG9pbnQgYXMgMAorICAgICAqIGRlZ3JlZXMuIFRoZSBmdWxsUmFuZ2UgdmFsdWUgaXMgMjcwLjAoZGVncmVlcykgYW5kIHRoZSBvZmZzZXQgaXMKKyAgICAgKiAtMTM1LjAgc2luY2UgdGhlIGhhbGZ3YXkgcG9pbnQgYWZ0ZXIgc2NhbGluZyBpcyAxMzUgZGVncmVlcy4KKyAgICAgKgorICAgICAqIFRoaXMgd2lsbCBjYWxjdWxhdGUgdGhlIHJlc3VsdCBmcm9tIHRoZSBmdWxsUmFuZ2UgdGltZXMgdGhlCisgICAgICogZnJhY3Rpb24gb2YgdGhlIHN1cHBseSB2b2x0YWdlLCBwbHVzIHRoZSBvZmZzZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2hhbm5lbCBUaGUgYW5hbG9nIGNoYW5uZWwgdGhpcyBwb3RlbnRpb21ldGVyIGlzIHBsdWdnZWQgaW50by4KKyAgICAgKiBAcGFyYW0gZnVsbFJhbmdlIFRoZSBzY2FsaW5nIHRvIG11bHRpcGx5IHRoZSB2b2x0YWdlIGJ5IHRvIGdldCBhIG1lYW5pbmdmdWwgdW5pdC4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgdG8gYWRkIHRvIHRoZSBzY2FsZWQgdmFsdWUgZm9yIGNvbnRyb2xsaW5nIHRoZSB6ZXJvIHZhbHVlCisgICAgICovCisgICAgZXhwbGljaXQgQW5hbG9nUG90ZW50aW9tZXRlcihpbnQgY2hhbm5lbCwgZG91YmxlIGZ1bGxSYW5nZSA9IDEuMCwgZG91YmxlIG9mZnNldCA9IDAuMCk7CisKKyAgICBleHBsaWNpdCBBbmFsb2dQb3RlbnRpb21ldGVyKEFuYWxvZ0lucHV0ICppbnB1dCwgZG91YmxlIGZ1bGxSYW5nZSA9IDEuMCwgZG91YmxlIG9mZnNldCA9IDAuMCk7CisKKyAgICBleHBsaWNpdCBBbmFsb2dQb3RlbnRpb21ldGVyKEFuYWxvZ0lucHV0ICZpbnB1dCwgZG91YmxlIGZ1bGxSYW5nZSA9IDEuMCwgZG91YmxlIG9mZnNldCA9IDAuMCk7CisKKyAgICB2aXJ0dWFsIH5BbmFsb2dQb3RlbnRpb21ldGVyKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGN1cnJlbnQgcmVhZGluZyBvZiB0aGUgcG90ZW50aW9tZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSBwb3RlbnRpb21ldGVyLgorICAgICAqLworICAgIHZpcnR1YWwgZG91YmxlIEdldCgpOworCisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgdGhlIFBJRFNvdXJjZSBpbnRlcmZhY2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHJlYWRpbmcuCisgICAgICovCisgICAgdmlydHVhbCBkb3VibGUgUElER2V0KCk7CisKK3ByaXZhdGU6CisgICAgZG91YmxlIG1fZnVsbFJhbmdlLCBtX29mZnNldDsKKyAgICBBbmFsb2dJbnB1dCogbV9hbmFsb2dfaW5wdXQ7CisgICAgYm9vbCBtX2luaXRfYW5hbG9nX2lucHV0OworCisgICAgLyoqCisgICAgICogQ29tbW9uIGluaXRpYWxpemF0aW9uIGNvZGUgY2FsbGVkIGJ5IGFsbCBjb25zdHJ1Y3RvcnMuCisgICAgICovCisgICAgdm9pZCBpbml0UG90KEFuYWxvZ0lucHV0ICppbnB1dCwgZG91YmxlIGZ1bGxSYW5nZSwgZG91YmxlIG9mZnNldCk7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQW5hbG9nVHJpZ2dlci5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQW5hbG9nVHJpZ2dlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMThhMzMKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9BbmFsb2dUcmlnZ2VyLmgKQEAgLTAsMCArMSwzNiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJIQUwvSEFMLmhwcCIKKyNpbmNsdWRlICJBbmFsb2dUcmlnZ2VyT3V0cHV0LmgiCisjaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgorCitjbGFzcyBBbmFsb2dJbnB1dDsKKworY2xhc3MgQW5hbG9nVHJpZ2dlciA6IHB1YmxpYyBTZW5zb3JCYXNlCit7CisJZnJpZW5kIGNsYXNzIEFuYWxvZ1RyaWdnZXJPdXRwdXQ7CitwdWJsaWM6CisJZXhwbGljaXQgQW5hbG9nVHJpZ2dlcihpbnQzMl90IGNoYW5uZWwpOworCWV4cGxpY2l0IEFuYWxvZ1RyaWdnZXIoQW5hbG9nSW5wdXQgKmNoYW5uZWwpOworCXZpcnR1YWwgfkFuYWxvZ1RyaWdnZXIoKTsKKworCXZvaWQgU2V0TGltaXRzVm9sdGFnZShmbG9hdCBsb3dlciwgZmxvYXQgdXBwZXIpOworCXZvaWQgU2V0TGltaXRzUmF3KGludDMyX3QgbG93ZXIsIGludDMyX3QgdXBwZXIpOworCXZvaWQgU2V0QXZlcmFnZWQoYm9vbCB1c2VBdmVyYWdlZFZhbHVlKTsKKwl2b2lkIFNldEZpbHRlcmVkKGJvb2wgdXNlRmlsdGVyZWRWYWx1ZSk7CisJdWludDMyX3QgR2V0SW5kZXgoKTsKKwlib29sIEdldEluV2luZG93KCk7CisJYm9vbCBHZXRUcmlnZ2VyU3RhdGUoKTsKKwlBbmFsb2dUcmlnZ2VyT3V0cHV0ICpDcmVhdGVPdXRwdXQoQW5hbG9nVHJpZ2dlclR5cGUgdHlwZSk7CisKK3ByaXZhdGU6CisJdm9pZCBJbml0VHJpZ2dlcih1aW50MzJfdCBjaGFubmVsKTsKKworCXVpbnQ4X3QgbV9pbmRleDsKKwl2b2lkKiBtX3RyaWdnZXI7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQW5hbG9nVHJpZ2dlck91dHB1dC5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQW5hbG9nVHJpZ2dlck91dHB1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZDhjZDUKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9BbmFsb2dUcmlnZ2VyT3V0cHV0LmgKQEAgLTAsMCArMSw1NyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJEaWdpdGFsU291cmNlLmgiCisKK2NsYXNzIEFuYWxvZ1RyaWdnZXI7CisKKy8qKgorICogQ2xhc3MgdG8gcmVwcmVzZW50IGEgc3BlY2lmaWMgb3V0cHV0IGZyb20gYW4gYW5hbG9nIHRyaWdnZXIuCisgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gZ2V0IHRoZSBjdXJyZW50IG91dHB1dCB2YWx1ZSBhbmQgYWxzbyBhcyBhIERpZ2l0YWxTb3VyY2UKKyAqIHRvIHByb3ZpZGUgcm91dGluZyBvZiBhbiBvdXRwdXQgdG8gZGlnaXRhbCBzdWJzeXN0ZW1zIG9uIHRoZSBGUEdBIHN1Y2ggYXMKKyAqIENvdW50ZXIsIEVuY29kZXIsIGFuZCBJbnRlcnJ1cHQuCisgKgorICogVGhlIFRyaWdnZXJTdGF0ZSBvdXRwdXQgaW5kaWNhdGVzIHRoZSBwcmltYXJ5IG91dHB1dCB2YWx1ZSBvZiB0aGUgdHJpZ2dlci4gIElmIHRoZSBhbmFsb2cKKyAqIHNpZ25hbCBpcyBsZXNzIHRoYW4gdGhlIGxvd2VyIGxpbWl0LCB0aGUgb3V0cHV0IGlzIGZhbHNlLiAgSWYgdGhlIGFuYWxvZyB2YWx1ZSBpcyBncmVhdGVyCisgKiB0aGFuIHRoZSB1cHBlciBsaW1pdCwgdGhlbiB0aGUgb3V0cHV0IGlzIHRydWUuICBJZiB0aGUgYW5hbG9nIHZhbHVlIGlzIGluIGJldHdlZW4sIHRoZW4KKyAqIHRoZSB0cmlnZ2VyIG91dHB1dCBzdGF0ZSBtYWludGFpbnMgaXRzIG1vc3QgcmVjZW50IHZhbHVlLgorICoKKyAqIFRoZSBJbldpbmRvdyBvdXRwdXQgaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBhbmFsb2cgc2lnbmFsIGlzIGluc2lkZSB0aGUgcmFuZ2UgZGVmaW5lZAorICogYnkgdGhlIGxpbWl0cy4KKyAqCisgKiBUaGUgUmlzaW5nUHVsc2UgYW5kIEZhbGxpbmdQdWxzZSBvdXRwdXRzIGRldGVjdCBhbiBpbnN0YW50YW5lb3VzIHRyYW5zaXRpb24gZnJvbSBhYm92ZSB0aGUKKyAqIHVwcGVyIGxpbWl0IHRvIGJlbG93IHRoZSBsb3dlciBsaW1pdCwgYW5kIHZpc2UgdmVyc2EuICBUaGVzZSBwdWxzZXMgcmVwcmVzZW50IGEgcm9sbG92ZXIKKyAqIGNvbmRpdGlvbiBvZiBhIHNlbnNvciBhbmQgY2FuIGJlIHJvdXRlZCB0byBhbiB1cCAvIGRvd24gY291dGVyIG9yIHRvIGludGVycnVwdHMuICBCZWNhdXNlCisgKiB0aGUgb3V0cHV0cyBnZW5lcmF0ZSBhIHB1bHNlLCB0aGV5IGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5LiAgVG8gaGVscCBlbnN1cmUgdGhhdCBhIHJvbGxvdmVyCisgKiBjb25kaXRpb24gaXMgbm90IG1pc3NlZCwgdGhlcmUgaXMgYW4gYXZlcmFnZSByZWplY3Rpb24gZmlsdGVyIGF2YWlsYWJsZSB0aGF0IG9wZXJhdGVzIG9uIHRoZQorICogdXBwZXIgOCBiaXRzIG9mIGEgMTIgYml0IG51bWJlciBhbmQgc2VsZWN0cyB0aGUgbmVhcmVzdCBvdXRseWVyIG9mIDMgc2FtcGxlcy4gIFRoaXMgd2lsbCByZWplY3QKKyAqIGEgc2FtcGxlIHRoYXQgaXMgKGR1ZSB0byBhdmVyYWdpbmcgb3Igc2FtcGxpbmcpIGVycmFudGx5IGJldHdlZW4gdGhlIHR3byBsaW1pdHMuICBUaGlzIGZpbHRlcgorICogd2lsbCBmYWlsIGlmIG1vcmUgdGhhbiBvbmUgc2FtcGxlIGluIGEgcm93IGlzIGVycmFudGx5IGluIGJldHdlZW4gdGhlIHR3byBsaW1pdHMuICBZb3UgbWF5IHNlZQorICogdGhpcyBwcm9ibGVtIGlmIGF0dGVtcHRpbmcgdG8gdXNlIHRoaXMgZmVhdHVyZSB3aXRoIGEgbWVjaGFuaWNhbCByb2xsb3ZlciBzZW5zb3IsIHN1Y2ggYXMgYQorICogMzYwIGRlZ3JlZSBuby1zdG9wIHBvdGVudGlvbWV0ZXIgd2l0aG91dCBzaWduYWwgY29uZGl0aW9uaW5nLCBiZWNhdXNlIHRoZSByb2xsb3ZlciB0cmFuc2l0aW9uCisgKiBpcyBub3Qgc2hhcnAgLyBjbGVhbiBlbm91Z2guICBVc2luZyB0aGUgYXZlcmFnaW5nIGVuZ2luZSBtYXkgaGVscCB3aXRoIHRoaXMsIGJ1dCByb3RhdGlvbmFsIHNwZWVkcyBvZgorICogdGhlIHNlbnNvciB3aWxsIHRoZW4gYmUgbGltaXRlZC4KKyAqLworY2xhc3MgQW5hbG9nVHJpZ2dlck91dHB1dCA6IHB1YmxpYyBEaWdpdGFsU291cmNlCit7CisJZnJpZW5kIGNsYXNzIEFuYWxvZ1RyaWdnZXI7CitwdWJsaWM6CisKKwl2aXJ0dWFsIH5BbmFsb2dUcmlnZ2VyT3V0cHV0KCk7CisJYm9vbCBHZXQoKTsKKworCS8vIERpZ2l0YWxTb3VyY2UgaW50ZXJmYWNlCisJdmlydHVhbCB1aW50MzJfdCBHZXRDaGFubmVsRm9yUm91dGluZygpOworCXZpcnR1YWwgdWludDMyX3QgR2V0TW9kdWxlRm9yUm91dGluZygpOworCXZpcnR1YWwgYm9vbCBHZXRBbmFsb2dUcmlnZ2VyRm9yUm91dGluZygpOworcHJvdGVjdGVkOgorCUFuYWxvZ1RyaWdnZXJPdXRwdXQoQW5hbG9nVHJpZ2dlciAqdHJpZ2dlciwgQW5hbG9nVHJpZ2dlclR5cGUgb3V0cHV0VHlwZSk7CisKK3ByaXZhdGU6CisJQW5hbG9nVHJpZ2dlciAqbV90cmlnZ2VyOworCUFuYWxvZ1RyaWdnZXJUeXBlIG1fb3V0cHV0VHlwZTsKK307CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9CdWlsdEluQWNjZWxlcm9tZXRlci5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQnVpbHRJbkFjY2VsZXJvbWV0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjNkZjk5Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQnVpbHRJbkFjY2VsZXJvbWV0ZXIuaApAQCAtMCwwICsxLDI3IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE0LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiaW50ZXJmYWNlcy9BY2NlbGVyb21ldGVyLmgiCisjaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgorCisvKioKKyAqIEJ1aWx0LWluIGFjY2VsZXJvbWV0ZXIuCisgKgorICogVGhpcyBjbGFzcyBhbGxvd3MgYWNjZXNzIHRvIHRoZSBSb2JvUklPJ3MgaW50ZXJuYWwgYWNjZWxlcm9tZXRlci4KKyAqLworY2xhc3MgQnVpbHRJbkFjY2VsZXJvbWV0ZXIgOiBwdWJsaWMgQWNjZWxlcm9tZXRlciwgcHVibGljIFNlbnNvckJhc2UKK3sKK3B1YmxpYzoKKwlCdWlsdEluQWNjZWxlcm9tZXRlcihSYW5nZSByYW5nZSA9IGtSYW5nZV84Ryk7CisgICAgICAgIHZpcnR1YWwgfkJ1aWx0SW5BY2NlbGVyb21ldGVyKCk7CisKKwkvLyBBY2NlbGVyb21ldGVyIGludGVyZmFjZQorCXZpcnR1YWwgdm9pZCBTZXRSYW5nZShSYW5nZSByYW5nZSk7CisJdmlydHVhbCBkb3VibGUgR2V0WCgpOworCXZpcnR1YWwgZG91YmxlIEdldFkoKTsKKwl2aXJ0dWFsIGRvdWJsZSBHZXRaKCk7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQ0FOL2Nhbl9wcm90by5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQ0FOL2Nhbl9wcm90by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMTNiMDIKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9DQU4vY2FuX3Byb3RvLmgKQEAgLTAsMCArMSw0MjggQEAKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBjYW5fcHJvdG8uaCAtIERlZmluaXRpb25zIGZvciB0aGUgQ0FOIHByb3RvY29sIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUKKy8vICAgICAgICAgICAgICAgQkRDIG1vdG9yIGNvbnRyb2xsZXIuCisvLworLy8gQ29weXJpZ2h0IChjKSAyMDA4IFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUSSBJbmZvcm1hdGlvbiAtIFNlbGVjdGl2ZSBEaXNjbG9zdXJlCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisjaWZuZGVmIF9fQ0FOX1BST1RPX0hfXworI2RlZmluZSBfX0NBTl9QUk9UT19IX18KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBtYXNrcyBvZiB0aGUgZmllbGRzIHRoYXQgYXJlIHVzZWQgaW4gdGhlIG1lc3NhZ2UgaWRlbnRpZmllci4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIENBTl9NU0dJRF9GVUxMX00gICAgICAgIDB4MWZmZmZmZmYKKyNkZWZpbmUgQ0FOX01TR0lEX0RFVk5PX00gICAgICAgMHgwMDAwMDAzZgorI2RlZmluZSBDQU5fTVNHSURfQVBJX00gICAgICAgICAweDAwMDBmZmMwCisjZGVmaW5lIENBTl9NU0dJRF9NRlJfTSAgICAgICAgIDB4MDBmZjAwMDAKKyNkZWZpbmUgQ0FOX01TR0lEX0RUWVBFX00gICAgICAgMHgxZjAwMDAwMAorI2RlZmluZSBDQU5fTVNHSURfREVWTk9fUyAgICAgICAwCisjZGVmaW5lIENBTl9NU0dJRF9BUElfUyAgICAgICAgIDYKKyNkZWZpbmUgQ0FOX01TR0lEX01GUl9TICAgICAgICAgMTYKKyNkZWZpbmUgQ0FOX01TR0lEX0RUWVBFX1MgICAgICAgMjQKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBSZXNlcnZlZCBkZXZpY2UgbnVtYmVyIHZhbHVlcyBpbiB0aGUgTWVzc2FnZSBJZC4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIENBTl9NU0dJRF9ERVZOT19CQ0FTVCAgIDB4MDAwMDAwMDAKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBSZXNlcnZlZCBzeXN0ZW0gY29udHJvbCBBUEkgbnVtYmVycyBpbiB0aGUgTWVzc2FnZSBJZC4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIENBTl9NU0dJRF9BUElfU1lTSEFMVCAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgQ0FOX01TR0lEX0FQSV9TWVNSU1QgICAgMHgwMDAwMDA0MAorI2RlZmluZSBDQU5fTVNHSURfQVBJX0RFVkFTU0lHTiAweDAwMDAwMDgwCisjZGVmaW5lIENBTl9NU0dJRF9BUElfREVWUVVFUlkgIDB4MDAwMDAwYzAKKyNkZWZpbmUgQ0FOX01TR0lEX0FQSV9IRUFSVEJFQVQgMHgwMDAwMDE0MAorI2RlZmluZSBDQU5fTVNHSURfQVBJX1NZTkMgICAgICAweDAwMDAwMTgwCisjZGVmaW5lIENBTl9NU0dJRF9BUElfVVBEQVRFICAgIDB4MDAwMDAxYzAKKyNkZWZpbmUgQ0FOX01TR0lEX0FQSV9GSVJNVkVSICAgMHgwMDAwMDIwMAorI2RlZmluZSBDQU5fTVNHSURfQVBJX0VOVU1FUkFURSAweDAwMDAwMjQwCisjZGVmaW5lIENBTl9NU0dJRF9BUElfU1lTUkVTVU1FIDB4MDAwMDAyODAKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSAzMiBiaXQgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgQ0FOX01TR0lEX0FQSV9TVEFUVVMgcmVxdWVzdC4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIENBTl9TVEFUVVNfQ09ERV9NICAgICAgIDB4MDAwMGZmZmYKKyNkZWZpbmUgQ0FOX1NUQVRVU19NRkdfTSAgICAgICAgMHgwMGZmMDAwMAorI2RlZmluZSBDQU5fU1RBVFVTX0RUWVBFX00gICAgICAweDFmMDAwMDAwCisjZGVmaW5lIENBTl9TVEFUVVNfQ09ERV9TICAgICAgIDAKKyNkZWZpbmUgQ0FOX1NUQVRVU19NRkdfUyAgICAgICAgMTYKKyNkZWZpbmUgQ0FOX1NUQVRVU19EVFlQRV9TICAgICAgMjQKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBSZXNlcnZlZCBtYW51ZmFjdHVyZXIgaWRlbnRpZmllcnMgaW4gdGhlIE1lc3NhZ2UgSWQuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBDQU5fTVNHSURfTUZSX05JICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIENBTl9NU0dJRF9NRlJfTE0gICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgQ0FOX01TR0lEX01GUl9ERUtBICAgICAgMHgwMDAzMDAwMAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIFJlc2VydmVkIGRldmljZSB0eXBlIGlkZW50aWZpZXJzIGluIHRoZSBNZXNzYWdlIElkLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgQ0FOX01TR0lEX0RUWVBFX0JDQVNUICAgMHgwMDAwMDAwMAorI2RlZmluZSBDQU5fTVNHSURfRFRZUEVfUk9CT1QgICAweDAxMDAwMDAwCisjZGVmaW5lIENBTl9NU0dJRF9EVFlQRV9NT1RPUiAgIDB4MDIwMDAwMDAKKyNkZWZpbmUgQ0FOX01TR0lEX0RUWVBFX1JFTEFZICAgMHgwMzAwMDAwMAorI2RlZmluZSBDQU5fTVNHSURfRFRZUEVfR1lSTyAgICAweDA0MDAwMDAwCisjZGVmaW5lIENBTl9NU0dJRF9EVFlQRV9BQ0NFTCAgIDB4MDUwMDAwMDAKKyNkZWZpbmUgQ0FOX01TR0lEX0RUWVBFX1VTT05JQyAgMHgwNjAwMDAwMAorI2RlZmluZSBDQU5fTVNHSURfRFRZUEVfR0VBUlQgICAweDA3MDAwMDAwCisjZGVmaW5lIENBTl9NU0dJRF9EVFlQRV9VUERBVEUgIDB4MWYwMDAwMDAKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIExNIE1vdG9yIENvbnRyb2wgQVBJIENsYXNzZXMgQVBJIENsYXNzIGFuZCBJRCBtYXNrcy4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIENBTl9NU0dJRF9BUElfQ0xBU1NfTSAgIDB4MDAwMGZjMDAKKyNkZWZpbmUgQ0FOX01TR0lEX0FQSV9JRF9NICAgICAgMHgwMDAwMDNjMAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gTE0gTW90b3IgQ29udHJvbCBBUEkgQ2xhc3NlcyBpbiB0aGUgTWVzc2FnZSBJZCBmb3Igbm9uLWJyb2FkY2FzdC4KKy8vIFRoZXNlIGFyZSB0aGUgdXBwZXIgNiBiaXRzIG9mIHRoZSBBUEkgZmllbGQsIHRoZSBsb3dlciA0IGJpdHMgZGV0ZXJtaW5lCisvLyB0aGUgQVBJSWQuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBDQU5fQVBJX01DX1ZPTFRBR0UgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIENBTl9BUElfTUNfU1BEICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgQ0FOX0FQSV9NQ19WQ09NUCAgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBDQU5fQVBJX01DX1BPUyAgICAgICAgICAweDAwMDAwYzAwCisjZGVmaW5lIENBTl9BUElfTUNfSUNUUkwgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgQ0FOX0FQSV9NQ19TVEFUVVMgICAgICAgMHgwMDAwMTQwMAorI2RlZmluZSBDQU5fQVBJX01DX1BTVEFUICAgICAgICAweDAwMDAxODAwCisjZGVmaW5lIENBTl9BUElfTUNfQ0ZHICAgICAgICAgIDB4MDAwMDFjMDAKKyNkZWZpbmUgQ0FOX0FQSV9NQ19BQ0sgICAgICAgICAgMHgwMDAwMjAwMAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIFN0ZWxsYXJpcyBNb3RvciBDbGFzcyBDb250cm9sIFZvbHRhZ2UgQVBJIGRlZmluaXRpb25zLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgTE1fQVBJX1ZPTFQgICAgICAgICAgICAgKENBTl9NU0dJRF9NRlJfTE0gfCBDQU5fTVNHSURfRFRZUEVfTU9UT1IgfCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTl9BUElfTUNfVk9MVEFHRSkKKyNkZWZpbmUgTE1fQVBJX1ZPTFRfRU4gICAgICAgICAgKExNX0FQSV9WT0xUIHwgKDAgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1ZPTFRfRElTICAgICAgICAgKExNX0FQSV9WT0xUIHwgKDEgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1ZPTFRfU0VUICAgICAgICAgKExNX0FQSV9WT0xUIHwgKDIgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1ZPTFRfU0VUX1JBTVAgICAgKExNX0FQSV9WT0xUIHwgKDMgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKy8vIyMjIyMgRklSU1QgQkVHSU4gIyMjIyMKKyNkZWZpbmUgTE1fQVBJX1ZPTFRfVF9FTiAgICAgICAgKExNX0FQSV9WT0xUIHwgKDQgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1ZPTFRfVF9TRVQgICAgICAgKExNX0FQSV9WT0xUIHwgKDUgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1ZPTFRfVF9TRVRfTk9fQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExNX0FQSV9WT0xUIHwgKDcgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKy8vIyMjIyMgRklSU1QgRU5EICMjIyMjCisjZGVmaW5lIExNX0FQSV9WT0xUX1NFVF9OT19BQ0sgIChMTV9BUElfVk9MVCB8ICg4IDw8IENBTl9NU0dJRF9BUElfUykpCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgU3RlbGxhcmlzIE1vdG9yIENsYXNzIENvbnRyb2wgQVBJIGRlZmluaXRpb25zIGZvciBMTV9BUElfVk9MVF9TRVRfUkFNUC4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIExNX0FQSV9WT0xUX1JBTVBfRElTICAgIDAKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBTdGVsbGFyaXMgTW90b3IgQ2xhc3MgQ29udHJvbCBBUEkgZGVmaW5pdGlvbnMgZm9yIENBTl9NU0dJRF9BUElfU1lOQy4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIExNX0FQSV9TWU5DX1BFTkRfTk9XICAgIDAKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBTdGVsbGFyaXMgTW90b3IgQ2xhc3MgU3BlZWQgQ29udHJvbCBBUEkgZGVmaW5pdGlvbnMuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBMTV9BUElfU1BEICAgICAgICAgICAgICAoQ0FOX01TR0lEX01GUl9MTSB8IENBTl9NU0dJRF9EVFlQRV9NT1RPUiB8ICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FOX0FQSV9NQ19TUEQpCisjZGVmaW5lIExNX0FQSV9TUERfRU4gICAgICAgICAgIChMTV9BUElfU1BEIHwgKDAgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1NQRF9ESVMgICAgICAgICAgKExNX0FQSV9TUEQgfCAoMSA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfU1BEX1NFVCAgICAgICAgICAoTE1fQVBJX1NQRCB8ICgyIDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9TUERfUEMgICAgICAgICAgIChMTV9BUElfU1BEIHwgKDMgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1NQRF9JQyAgICAgICAgICAgKExNX0FQSV9TUEQgfCAoNCA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfU1BEX0RDICAgICAgICAgICAoTE1fQVBJX1NQRCB8ICg1IDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9TUERfUkVGICAgICAgICAgIChMTV9BUElfU1BEIHwgKDYgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKy8vIyMjIyMgRklSU1QgQkVHSU4gIyMjIyMKKyNkZWZpbmUgTE1fQVBJX1NQRF9UX0VOICAgICAgICAgKExNX0FQSV9TUEQgfCAoNyA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfU1BEX1RfU0VUICAgICAgICAoTE1fQVBJX1NQRCB8ICg4IDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9TUERfVF9TRVRfTk9fQUNLIChMTV9BUElfU1BEIHwgKDEwIDw8IENBTl9NU0dJRF9BUElfUykpCisvLyMjIyMjIEZJUlNUIEVORCAjIyMjIworI2RlZmluZSBMTV9BUElfU1BEX1NFVF9OT19BQ0sgICAoTE1fQVBJX1NQRCB8ICgxMSA8PCBDQU5fTVNHSURfQVBJX1MpKQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIFN0ZWxsYXJpcyBNb3RvciBDb250cm9sIFZvbHRhZ2UgQ29tcGVuc2F0aW9uIENvbnRyb2wgQVBJIGRlZmluaXRpb25zLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgTE1fQVBJX1ZDT01QICAgICAgICAgICAgKENBTl9NU0dJRF9NRlJfTE0gfCBDQU5fTVNHSURfRFRZUEVfTU9UT1IgfCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTl9BUElfTUNfVkNPTVApCisjZGVmaW5lIExNX0FQSV9WQ09NUF9FTiAgICAgICAgIChMTV9BUElfVkNPTVAgfCAoMCA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfVkNPTVBfRElTICAgICAgICAoTE1fQVBJX1ZDT01QIHwgKDEgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1ZDT01QX1NFVCAgICAgICAgKExNX0FQSV9WQ09NUCB8ICgyIDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9WQ09NUF9JTl9SQU1QICAgIChMTV9BUElfVkNPTVAgfCAoMyA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfVkNPTVBfQ09NUF9SQU1QICAoTE1fQVBJX1ZDT01QIHwgKDQgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKy8vIyMjIyMgRklSU1QgQkVHSU4gIyMjIyMKKyNkZWZpbmUgTE1fQVBJX1ZDT01QX1RfRU4gICAgICAgKExNX0FQSV9WQ09NUCB8ICg1IDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9WQ09NUF9UX1NFVCAgICAgIChMTV9BUElfVkNPTVAgfCAoNiA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfVkNPTVBfVF9TRVRfTk9fQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTE1fQVBJX1ZDT01QIHwgKDggPDwgQ0FOX01TR0lEX0FQSV9TKSkKKy8vIyMjIyMgRklSU1QgRU5EICMjIyMjCisjZGVmaW5lIExNX0FQSV9WQ09NUF9TRVRfTk9fQUNLIChMTV9BUElfVkNPTVAgfCAoOSA8PCBDQU5fTVNHSURfQVBJX1MpKQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIFN0ZWxsYXJpcyBNb3RvciBDbGFzcyBQb3NpdGlvbiBDb250cm9sIEFQSSBkZWZpbml0aW9ucy4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIExNX0FQSV9QT1MgICAgICAgICAgICAgIChDQU5fTVNHSURfTUZSX0xNIHwgQ0FOX01TR0lEX0RUWVBFX01PVE9SIHwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU5fQVBJX01DX1BPUykKKyNkZWZpbmUgTE1fQVBJX1BPU19FTiAgICAgICAgICAgKExNX0FQSV9QT1MgfCAoMCA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfUE9TX0RJUyAgICAgICAgICAoTE1fQVBJX1BPUyB8ICgxIDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9QT1NfU0VUICAgICAgICAgIChMTV9BUElfUE9TIHwgKDIgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1BPU19QQyAgICAgICAgICAgKExNX0FQSV9QT1MgfCAoMyA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfUE9TX0lDICAgICAgICAgICAoTE1fQVBJX1BPUyB8ICg0IDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9QT1NfREMgICAgICAgICAgIChMTV9BUElfUE9TIHwgKDUgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1BPU19SRUYgICAgICAgICAgKExNX0FQSV9QT1MgfCAoNiA8PCBDQU5fTVNHSURfQVBJX1MpKQorLy8jIyMjIyBGSVJTVCBCRUdJTiAjIyMjIworI2RlZmluZSBMTV9BUElfUE9TX1RfRU4gICAgICAgICAoTE1fQVBJX1BPUyB8ICg3IDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9QT1NfVF9TRVQgICAgICAgIChMTV9BUElfUE9TIHwgKDggPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1BPU19UX1NFVF9OT19BQ0sgKExNX0FQSV9QT1MgfCAoMTAgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKy8vIyMjIyMgRklSU1QgRU5EICMjIyMjCisjZGVmaW5lIExNX0FQSV9QT1NfU0VUX05PX0FDSyAgIChMTV9BUElfUE9TIHwgKDExIDw8IENBTl9NU0dJRF9BUElfUykpCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgU3RlbGxhcmlzIE1vdG9yIENsYXNzIEN1cnJlbnQgQ29udHJvbCBBUEkgZGVmaW5pdGlvbnMuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBMTV9BUElfSUNUUkwgICAgICAgICAgICAoQ0FOX01TR0lEX01GUl9MTSB8IENBTl9NU0dJRF9EVFlQRV9NT1RPUiB8ICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FOX0FQSV9NQ19JQ1RSTCkKKyNkZWZpbmUgTE1fQVBJX0lDVFJMX0VOICAgICAgICAgKExNX0FQSV9JQ1RSTCB8ICgwIDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9JQ1RSTF9ESVMgICAgICAgIChMTV9BUElfSUNUUkwgfCAoMSA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfSUNUUkxfU0VUICAgICAgICAoTE1fQVBJX0lDVFJMIHwgKDIgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX0lDVFJMX1BDICAgICAgICAgKExNX0FQSV9JQ1RSTCB8ICgzIDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9JQ1RSTF9JQyAgICAgICAgIChMTV9BUElfSUNUUkwgfCAoNCA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfSUNUUkxfREMgICAgICAgICAoTE1fQVBJX0lDVFJMIHwgKDUgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKy8vIyMjIyMgRklSU1QgQkVHSU4gIyMjIyMKKyNkZWZpbmUgTE1fQVBJX0lDVFJMX1RfRU4gICAgICAgKExNX0FQSV9JQ1RSTCB8ICg2IDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9JQ1RSTF9UX1NFVCAgICAgIChMTV9BUElfSUNUUkwgfCAoNyA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfSUNUUkxfVF9TRVRfTk9fQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTE1fQVBJX0lDVFJMIHwgKDkgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKy8vIyMjIyMgRklSU1QgRU5EICMjIyMjCisjZGVmaW5lIExNX0FQSV9JQ1RSTF9TRVRfTk9fQUNLIChMTV9BUElfSUNUUkwgfCAoMTAgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBTdGVsbGFyaXMgTW90b3IgQ2xhc3MgRmlybXdhcmUgVXBkYXRlIEFQSSBkZWZpbml0aW9ucy4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIExNX0FQSV9VUEQgICAgICAgICAgICAgIChDQU5fTVNHSURfTUZSX0xNIHwgQ0FOX01TR0lEX0RUWVBFX1VQREFURSkKKyNkZWZpbmUgTE1fQVBJX1VQRF9QSU5HICAgICAgICAgKExNX0FQSV9VUEQgfCAoMCA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfVVBEX0RPV05MT0FEICAgICAoTE1fQVBJX1VQRCB8ICgxIDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9VUERfU0VORF9EQVRBICAgIChMTV9BUElfVVBEIHwgKDIgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1VQRF9SRVNFVCAgICAgICAgKExNX0FQSV9VUEQgfCAoMyA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfVVBEX0FDSyAgICAgICAgICAoTE1fQVBJX1VQRCB8ICg0IDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9IV1ZFUiAgICAgICAgICAgIChMTV9BUElfVVBEIHwgKDUgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1VQRF9SRVFVRVNUICAgICAgKExNX0FQSV9VUEQgfCAoNiA8PCBDQU5fTVNHSURfQVBJX1MpKQorLy8jIyMjIyBGSVJTVCBCRUdJTiAjIyMjIworI2RlZmluZSBMTV9BUElfVU5UUlVTVF9FTiAgICAgICAoTE1fQVBJX1VQRCB8ICgxMSA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfVFJVU1RfRU4gICAgICAgICAoTE1fQVBJX1VQRCB8ICgxMiA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfVFJVU1RfSEVBUlRCRUFUICAoTE1fQVBJX1VQRCB8ICgxMyA8PCBDQU5fTVNHSURfQVBJX1MpKQorLy8jIyMjIyBGSVJTVCBFTkQgIyMjIyMKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBTdGVsbGFyaXMgTW90b3IgQ2xhc3MgU3RhdHVzIEFQSSBkZWZpbml0aW9ucy4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIExNX0FQSV9TVEFUVVMgICAgICAgICAgIChDQU5fTVNHSURfTUZSX0xNIHwgQ0FOX01TR0lEX0RUWVBFX01PVE9SIHwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU5fQVBJX01DX1NUQVRVUykKKyNkZWZpbmUgTE1fQVBJX1NUQVRVU19WT0xUT1VUICAgKExNX0FQSV9TVEFUVVMgfCAoMCA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfU1RBVFVTX1ZPTFRCVVMgICAoTE1fQVBJX1NUQVRVUyB8ICgxIDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9TVEFUVVNfQ1VSUkVOVCAgIChMTV9BUElfU1RBVFVTIHwgKDIgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1NUQVRVU19URU1QICAgICAgKExNX0FQSV9TVEFUVVMgfCAoMyA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfU1RBVFVTX1BPUyAgICAgICAoTE1fQVBJX1NUQVRVUyB8ICg0IDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9TVEFUVVNfU1BEICAgICAgIChMTV9BUElfU1RBVFVTIHwgKDUgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1NUQVRVU19MSU1JVCAgICAgKExNX0FQSV9TVEFUVVMgfCAoNiA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfU1RBVFVTX0ZBVUxUICAgICAoTE1fQVBJX1NUQVRVUyB8ICg3IDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9TVEFUVVNfUE9XRVIgICAgIChMTV9BUElfU1RBVFVTIHwgKDggPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1NUQVRVU19DTU9ERSAgICAgKExNX0FQSV9TVEFUVVMgfCAoOSA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfU1RBVFVTX1ZPVVQgICAgICAoTE1fQVBJX1NUQVRVUyB8ICgxMCA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfU1RBVFVTX1NUS1lfRkxUICAoTE1fQVBJX1NUQVRVUyB8ICgxMSA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfU1RBVFVTX0ZMVF9DT1VOVCAoTE1fQVBJX1NUQVRVUyB8ICgxMiA8PCBDQU5fTVNHSURfQVBJX1MpKQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlc2UgZGVmaW5pdGlvbnMgYXJlIHVzZWQgd2l0aCB0aGUgYnl0ZSB0aGF0IGlzIHJldHVybmVkIGZyb20KKy8vIHRoZSBzdGF0dXMgcmVxdWVzdCBmb3IgTE1fQVBJX1NUQVRVU19MSU1JVC4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIExNX1NUQVRVU19MSU1JVF9GV0QgICAgIDB4MDEKKyNkZWZpbmUgTE1fU1RBVFVTX0xJTUlUX1JFViAgICAgMHgwMgorI2RlZmluZSBMTV9TVEFUVVNfTElNSVRfU0ZXRCAgICAweDA0CisjZGVmaW5lIExNX1NUQVRVU19MSU1JVF9TUkVWICAgIDB4MDgKKyNkZWZpbmUgTE1fU1RBVFVTX0xJTUlUX1NUS1lfRldEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBMTV9TVEFUVVNfTElNSVRfU1RLWV9SRVYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwCisjZGVmaW5lIExNX1NUQVRVU19MSU1JVF9TVEtZX1NGV0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgTE1fU1RBVFVTX0xJTUlUX1NUS1lfU1JFViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gTE0gTW90b3IgQ29udHJvbCBzdGF0dXMgY29kZXMgcmV0dXJuZWQgZHVlIHRvIHRoZSBDQU5fU1RBVFVTX0NPREVfTSBmaWVsZC4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIExNX1NUQVRVU19GQVVMVF9JTElNSVQgIDB4MDEKKyNkZWZpbmUgTE1fU1RBVFVTX0ZBVUxUX1RMSU1JVCAgMHgwMgorI2RlZmluZSBMTV9TVEFUVVNfRkFVTFRfVkxJTUlUICAweDA0CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgU3RlbGxhcmlzIE1vdG9yIENsYXNzIENvbmZpZ3VyYXRpb24gQVBJIGRlZmluaXRpb25zLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgTE1fQVBJX0NGRyAgICAgICAgICAgICAgKENBTl9NU0dJRF9NRlJfTE0gfCBDQU5fTVNHSURfRFRZUEVfTU9UT1IgfCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTl9BUElfTUNfQ0ZHKQorI2RlZmluZSBMTV9BUElfQ0ZHX05VTV9CUlVTSEVTICAoTE1fQVBJX0NGRyB8ICgwIDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9DRkdfRU5DX0xJTkVTICAgIChMTV9BUElfQ0ZHIHwgKDEgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX0NGR19QT1RfVFVSTlMgICAgKExNX0FQSV9DRkcgfCAoMiA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfQ0ZHX0JSQUtFX0NPQVNUICAoTE1fQVBJX0NGRyB8ICgzIDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9DRkdfTElNSVRfTU9ERSAgIChMTV9BUElfQ0ZHIHwgKDQgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX0NGR19MSU1JVF9GV0QgICAgKExNX0FQSV9DRkcgfCAoNSA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfQ0ZHX0xJTUlUX1JFViAgICAoTE1fQVBJX0NGRyB8ICg2IDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9DRkdfTUFYX1ZPVVQgICAgIChMTV9BUElfQ0ZHIHwgKDcgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX0NGR19GQVVMVF9USU1FICAgKExNX0FQSV9DRkcgfCAoOCA8PCBDQU5fTVNHSURfQVBJX1MpKQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIFN0ZWxsYXJpcyBBQ0sgQVBJIGRlZmluaXRpb24uCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBMTV9BUElfQUNLICAgICAgICAgICAgICAoQ0FOX01TR0lEX01GUl9MTSB8IENBTl9NU0dJRF9EVFlQRV9NT1RPUiB8ICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FOX0FQSV9NQ19BQ0spCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgOCBiaXQgdmFsdWVzIHRoYXQgY2FuIGJlIHJldHVybmVkIGJ5IGEgY2FsbCB0byBMTV9BUElfU1RBVFVTX0hXVkVSLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgTE1fSFdWRVJfVU5LTk9XTiAgICAgICAgMHgwMAorI2RlZmluZSBMTV9IV1ZFUl9KQUdfMV8wICAgICAgICAweDAxCisjZGVmaW5lIExNX0hXVkVSX0pBR18yXzAgICAgICAgIDB4MDIKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSA4IGJpdCB2YWx1ZXMgdGhhdCBjYW4gYmUgcmV0dXJuZWQgYnkgYSBjYWxsIHRvIExNX0FQSV9TVEFUVVNfQ01PREUuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBMTV9TVEFUVVNfQ01PREVfVk9MVCAgICAweDAwCisjZGVmaW5lIExNX1NUQVRVU19DTU9ERV9DVVJSRU5UIDB4MDEKKyNkZWZpbmUgTE1fU1RBVFVTX0NNT0RFX1NQRUVEICAgMHgwMgorI2RlZmluZSBMTV9TVEFUVVNfQ01PREVfUE9TICAgICAweDAzCisjZGVmaW5lIExNX1NUQVRVU19DTU9ERV9WQ09NUCAgIDB4MDQKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSB2YWx1ZXMgdGhhdCBjYW4gc3BlY2lmaWVkIGFzIHRoZSBwb3NpdGlvbiBvciBzcGVlZCByZWZlcmVuY2UuICBOb3QgYWxsCisvLyB2YWx1ZXMgYXJlIHZhbGlkIGZvciBlYWNoIHJlZmVyZW5jZTsgaWYgYW4gaW52YWxpZCByZWZlcmVuY2UgaXMgc2V0LCB0aGVuCisvLyBub25lIHdpbGwgYmUgc2VsZWN0ZWQuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBMTV9SRUZfRU5DT0RFUiAgICAgICAgICAweDAwCisjZGVmaW5lIExNX1JFRl9QT1QgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgTE1fUkVGX0lOVl9FTkNPREVSICAgICAgMHgwMgorI2RlZmluZSBMTV9SRUZfUVVBRF9FTkNPREVSICAgICAweDAzCisjZGVmaW5lIExNX1JFRl9OT05FICAgICAgICAgICAgIDB4ZmYKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBmbGFncyB0aGF0IGFyZSB1c2VkIHRvIGluZGljYXRlIHRoZSBjdXJyZW50bHkgYWN0aXZlIGZhdWx0IHNvdXJjZXMuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBMTV9GQVVMVF9DVVJSRU5UICAgICAgICAweDAxCisjZGVmaW5lIExNX0ZBVUxUX1RFTVAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgTE1fRkFVTFRfVkJVUyAgICAgICAgICAgMHgwNAorI2RlZmluZSBMTV9GQVVMVF9HQVRFX0RSSVZFICAgICAweDA4CisjZGVmaW5lIExNX0ZBVUxUX0NPTU0gICAgICAgICAgIDB4MTAKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBTdGVsbGFyaXMgTW90b3IgQ2xhc3MgUGVyaW9kaWMgU3RhdHVzIEFQSSBkZWZpbml0aW9ucy4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIExNX0FQSV9QU1RBVCAgICAgICAgICAgIChDQU5fTVNHSURfTUZSX0xNIHwgQ0FOX01TR0lEX0RUWVBFX01PVE9SIHwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU5fQVBJX01DX1BTVEFUKQorI2RlZmluZSBMTV9BUElfUFNUQVRfUEVSX0VOX1MwICAoTE1fQVBJX1BTVEFUIHwgKDAgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1BTVEFUX1BFUl9FTl9TMSAgKExNX0FQSV9QU1RBVCB8ICgxIDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9QU1RBVF9QRVJfRU5fUzIgIChMTV9BUElfUFNUQVQgfCAoMiA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfUFNUQVRfUEVSX0VOX1MzICAoTE1fQVBJX1BTVEFUIHwgKDMgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1BTVEFUX0NGR19TMCAgICAgKExNX0FQSV9QU1RBVCB8ICg0IDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9QU1RBVF9DRkdfUzEgICAgIChMTV9BUElfUFNUQVQgfCAoNSA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfUFNUQVRfQ0ZHX1MyICAgICAoTE1fQVBJX1BTVEFUIHwgKDYgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1BTVEFUX0NGR19TMyAgICAgKExNX0FQSV9QU1RBVCB8ICg3IDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9QU1RBVF9EQVRBX1MwICAgIChMTV9BUElfUFNUQVQgfCAoOCA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfUFNUQVRfREFUQV9TMSAgICAoTE1fQVBJX1BTVEFUIHwgKDkgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1BTVEFUX0RBVEFfUzIgICAgKExNX0FQSV9QU1RBVCB8ICgxMCA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfUFNUQVRfREFUQV9TMyAgICAoTE1fQVBJX1BTVEFUIHwgKDExIDw8IENBTl9NU0dJRF9BUElfUykpCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgdmFsdWVzIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBkYXRhIHRoZSBQZXJpb2RpYyBTdGF0dXMKKy8vIE1lc3NhZ2UgYnl0ZXMuICBCeXRlcyBvZiBhIG11bHRpLWJ5dGUgZGF0YSB2YWx1ZXMgYXJlIGVuY29kZWQgYXMKKy8vIGxpdHRsZS1lbmRpYW4sIHRoZXJlZm9yZSBCMCBpcyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZS4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIExNX1BTVEFUX0VORCAgICAgICAgICAgIDAKKyNkZWZpbmUgTE1fUFNUQVRfVk9MVE9VVF9CMCAgICAgMQorI2RlZmluZSBMTV9QU1RBVF9WT0xUT1VUX0IxICAgICAyCisjZGVmaW5lIExNX1BTVEFUX1ZPTFRCVVNfQjAgICAgIDMKKyNkZWZpbmUgTE1fUFNUQVRfVk9MVEJVU19CMSAgICAgNAorI2RlZmluZSBMTV9QU1RBVF9DVVJSRU5UX0IwICAgICA1CisjZGVmaW5lIExNX1BTVEFUX0NVUlJFTlRfQjEgICAgIDYKKyNkZWZpbmUgTE1fUFNUQVRfVEVNUF9CMCAgICAgICAgNworI2RlZmluZSBMTV9QU1RBVF9URU1QX0IxICAgICAgICA4CisjZGVmaW5lIExNX1BTVEFUX1BPU19CMCAgICAgICAgIDkKKyNkZWZpbmUgTE1fUFNUQVRfUE9TX0IxICAgICAgICAgMTAKKyNkZWZpbmUgTE1fUFNUQVRfUE9TX0IyICAgICAgICAgMTEKKyNkZWZpbmUgTE1fUFNUQVRfUE9TX0IzICAgICAgICAgMTIKKyNkZWZpbmUgTE1fUFNUQVRfU1BEX0IwICAgICAgICAgMTMKKyNkZWZpbmUgTE1fUFNUQVRfU1BEX0IxICAgICAgICAgMTQKKyNkZWZpbmUgTE1fUFNUQVRfU1BEX0IyICAgICAgICAgMTUKKyNkZWZpbmUgTE1fUFNUQVRfU1BEX0IzICAgICAgICAgMTYKKyNkZWZpbmUgTE1fUFNUQVRfTElNSVRfTkNMUiAgICAgMTcKKyNkZWZpbmUgTE1fUFNUQVRfTElNSVRfQ0xSICAgICAgMTgKKyNkZWZpbmUgTE1fUFNUQVRfRkFVTFQgICAgICAgICAgMTkKKyNkZWZpbmUgTE1fUFNUQVRfU1RLWV9GTFRfTkNMUiAgMjAKKyNkZWZpbmUgTE1fUFNUQVRfU1RLWV9GTFRfQ0xSICAgMjEKKyNkZWZpbmUgTE1fUFNUQVRfVk9VVF9CMCAgICAgICAgMjIKKyNkZWZpbmUgTE1fUFNUQVRfVk9VVF9CMSAgICAgICAgMjMKKyNkZWZpbmUgTE1fUFNUQVRfRkxUX0NPVU5UX0NVUlJFTlQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNAorI2RlZmluZSBMTV9QU1RBVF9GTFRfQ09VTlRfVEVNUCAyNQorI2RlZmluZSBMTV9QU1RBVF9GTFRfQ09VTlRfVk9MVEJVUyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2CisjZGVmaW5lIExNX1BTVEFUX0ZMVF9DT1VOVF9HQVRFIDI3CisjZGVmaW5lIExNX1BTVEFUX0ZMVF9DT1VOVF9DT01NIDI4CisjZGVmaW5lIExNX1BTVEFUX0NBTlNUUyAgICAgICAgIDI5CisjZGVmaW5lIExNX1BTVEFUX0NBTkVSUl9CMCAgICAgIDMwCisjZGVmaW5lIExNX1BTVEFUX0NBTkVSUl9CMSAgICAgIDMxCisKKyNlbmRpZiAvLyBfX0NBTl9QUk9UT19IX18KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0NBTkphZ3Vhci5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQ0FOSmFndWFyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdkNmRiMwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0NBTkphZ3Vhci5oCkBAIC0wLDAgKzEsMjA4IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA5LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiRXJyb3JCYXNlLmgiCisjaW5jbHVkZSAiTW90b3JTYWZldHkuaCIKKyNpbmNsdWRlICJSZXNvdXJjZS5oIgorI2luY2x1ZGUgIk1vdG9yU2FmZXR5SGVscGVyLmgiCisjaW5jbHVkZSAiUElET3V0cHV0LmgiCisjaW5jbHVkZSAiQ0FOU3BlZWRDb250cm9sbGVyLmgiCisjaW5jbHVkZSAiSEFML1NlbWFwaG9yZS5ocHAiCisjaW5jbHVkZSAiSEFML0hBTC5ocHAiCisjaW5jbHVkZSAiTmV0d29ya0NvbW11bmljYXRpb24vQ0FOU2Vzc2lvbk11eC5oIgorCisjaW5jbHVkZSA8dXRpbGl0eT4KKworLyoqCisgKiBMdW1pbmFyeSBNaWNybyAvIFZleCBSb2JvdGljcyBKYWd1YXIgU3BlZWQgQ29udHJvbAorICovCitjbGFzcyBDQU5KYWd1YXIgOiBwdWJsaWMgTW90b3JTYWZldHksCisJCQkJCXB1YmxpYyBDQU5TcGVlZENvbnRyb2xsZXIsCisJCQkJCXB1YmxpYyBFcnJvckJhc2UKK3sKK3B1YmxpYzoKKwkvLyBUaGUgaW50ZXJuYWwgUElEIGNvbnRyb2wgbG9vcCBpbiB0aGUgSmFndWFyIHJ1bnMgYXQgMWtIei4KKwlzdGF0aWMgY29uc3QgaW50MzJfdCBrQ29udHJvbGxlclJhdGUgPSAxMDAwOworCXN0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtBcHByb3hCdXNWb2x0YWdlID0gMTIuMDsKKworCS8vIENvbnRyb2wgbW9kZSB0YWdzCisJLyoqIFNldHMgYW4gZW5jb2RlciBhcyB0aGUgc3BlZWQgcmVmZXJlbmNlIG9ubHkuIDxicj4gUGFzc2VkIGFzIHRoZSAidGFnIiB3aGVuIHNldHRpbmcgdGhlIGNvbnRyb2wgbW9kZS4qLworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgRW5jb2RlclN0cnVjdCAgICAgICB7fSBFbmNvZGVyOworCS8qKiBTZXRzIGEgcXVhZHJhdHVyZSBlbmNvZGVyIGFzIHRoZSBwb3NpdGlvbiBhbmQgc3BlZWQgcmVmZXJlbmNlLiA8YnI+IFBhc3NlZCBhcyB0aGUgInRhZyIgd2hlbiBzZXR0aW5nIHRoZSBjb250cm9sIG1vZGUuKi8KKwlzdGF0aWMgY29uc3Qgc3RydWN0IFF1YWRFbmNvZGVyU3RydWN0ICAge30gUXVhZEVuY29kZXI7CisJLyoqIFNldHMgYSBwb3RlbnRpb21ldGVyIGFzIHRoZSBwb3NpdGlvbiByZWZlcmVuY2Ugb25seS4gPGJyPiBQYXNzZWQgYXMgdGhlICJ0YWciIHdoZW4gc2V0dGluZyB0aGUgY29udHJvbCBtb2RlLiAqLworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgUG90ZW50aW9tZXRlclN0cnVjdCB7fSBQb3RlbnRpb21ldGVyOworCisJZXhwbGljaXQgQ0FOSmFndWFyKHVpbnQ4X3QgZGV2aWNlTnVtYmVyKTsKKwl2aXJ0dWFsIH5DQU5KYWd1YXIoKTsKKworCXVpbnQ4X3QgZ2V0RGV2aWNlTnVtYmVyKCkgY29uc3Q7CisJdWludDhfdCBHZXRIYXJkd2FyZVZlcnNpb24oKTsKKworCS8vIFBJRE91dHB1dCBpbnRlcmZhY2UKKwl2aXJ0dWFsIHZvaWQgUElEV3JpdGUoZmxvYXQgb3V0cHV0KTsKKworCS8vIENvbnRyb2wgbW9kZSBtZXRob2RzCisJdm9pZCBFbmFibGVDb250cm9sKGRvdWJsZSBlbmNvZGVySW5pdGlhbFBvc2l0aW9uID0gMC4wKTsKKwl2b2lkIERpc2FibGVDb250cm9sKCk7CisKKwl2b2lkIFNldFBlcmNlbnRNb2RlKCk7CisJdm9pZCBTZXRQZXJjZW50TW9kZShFbmNvZGVyU3RydWN0LCB1aW50MTZfdCBjb2Rlc1BlclJldik7CisJdm9pZCBTZXRQZXJjZW50TW9kZShRdWFkRW5jb2RlclN0cnVjdCwgdWludDE2X3QgY29kZXNQZXJSZXYpOworCXZvaWQgU2V0UGVyY2VudE1vZGUoUG90ZW50aW9tZXRlclN0cnVjdCk7CisKKwl2b2lkIFNldEN1cnJlbnRNb2RlKGRvdWJsZSBwLCBkb3VibGUgaSwgZG91YmxlIGQpOworCXZvaWQgU2V0Q3VycmVudE1vZGUoRW5jb2RlclN0cnVjdCwgdWludDE2X3QgY29kZXNQZXJSZXYsIGRvdWJsZSBwLCBkb3VibGUgaSwgZG91YmxlIGQpOworCXZvaWQgU2V0Q3VycmVudE1vZGUoUXVhZEVuY29kZXJTdHJ1Y3QsIHVpbnQxNl90IGNvZGVzUGVyUmV2LCBkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkKTsKKwl2b2lkIFNldEN1cnJlbnRNb2RlKFBvdGVudGlvbWV0ZXJTdHJ1Y3QsIGRvdWJsZSBwLCBkb3VibGUgaSwgZG91YmxlIGQpOworCisJdm9pZCBTZXRTcGVlZE1vZGUoRW5jb2RlclN0cnVjdCwgdWludDE2X3QgY29kZXNQZXJSZXYsIGRvdWJsZSBwLCBkb3VibGUgaSwgZG91YmxlIGQpOworCXZvaWQgU2V0U3BlZWRNb2RlKFF1YWRFbmNvZGVyU3RydWN0LCB1aW50MTZfdCBjb2Rlc1BlclJldiwgZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCk7CisKKwl2b2lkIFNldFBvc2l0aW9uTW9kZShRdWFkRW5jb2RlclN0cnVjdCwgdWludDE2X3QgY29kZXNQZXJSZXYsIGRvdWJsZSBwLCBkb3VibGUgaSwgZG91YmxlIGQpOworCXZvaWQgU2V0UG9zaXRpb25Nb2RlKFBvdGVudGlvbWV0ZXJTdHJ1Y3QsIGRvdWJsZSBwLCBkb3VibGUgaSwgZG91YmxlIGQpOworCisJdm9pZCBTZXRWb2x0YWdlTW9kZSgpOworCXZvaWQgU2V0Vm9sdGFnZU1vZGUoRW5jb2RlclN0cnVjdCwgdWludDE2X3QgY29kZXNQZXJSZXYpOworCXZvaWQgU2V0Vm9sdGFnZU1vZGUoUXVhZEVuY29kZXJTdHJ1Y3QsIHVpbnQxNl90IGNvZGVzUGVyUmV2KTsKKwl2b2lkIFNldFZvbHRhZ2VNb2RlKFBvdGVudGlvbWV0ZXJTdHJ1Y3QpOworCisJLy8gQ0FOU3BlZWRDb250cm9sbGVyIGludGVyZmFjZQorCXZpcnR1YWwgZmxvYXQgR2V0KCkgb3ZlcnJpZGU7CisJdmlydHVhbCB2b2lkIFNldChmbG9hdCB2YWx1ZSwgdWludDhfdCBzeW5jR3JvdXA9MCkgb3ZlcnJpZGU7CisJdmlydHVhbCB2b2lkIERpc2FibGUoKSBvdmVycmlkZTsKKwl2aXJ0dWFsIHZvaWQgU2V0UChkb3VibGUgcCkgb3ZlcnJpZGU7CisJdmlydHVhbCB2b2lkIFNldEkoZG91YmxlIGkpIG92ZXJyaWRlOworCXZpcnR1YWwgdm9pZCBTZXREKGRvdWJsZSBkKSBvdmVycmlkZTsKKwl2aXJ0dWFsIHZvaWQgU2V0UElEKGRvdWJsZSBwLCBkb3VibGUgaSwgZG91YmxlIGQpIG92ZXJyaWRlOworCXZpcnR1YWwgZG91YmxlIEdldFAoKSBvdmVycmlkZTsKKwl2aXJ0dWFsIGRvdWJsZSBHZXRJKCkgb3ZlcnJpZGU7CisJdmlydHVhbCBkb3VibGUgR2V0RCgpIG92ZXJyaWRlOworCXZpcnR1YWwgZmxvYXQgR2V0QnVzVm9sdGFnZSgpIG92ZXJyaWRlOworCXZpcnR1YWwgZmxvYXQgR2V0T3V0cHV0Vm9sdGFnZSgpIG92ZXJyaWRlOworCXZpcnR1YWwgZmxvYXQgR2V0T3V0cHV0Q3VycmVudCgpIG92ZXJyaWRlOworCXZpcnR1YWwgZmxvYXQgR2V0VGVtcGVyYXR1cmUoKSBvdmVycmlkZTsKKwl2aXJ0dWFsIGRvdWJsZSBHZXRQb3NpdGlvbigpIG92ZXJyaWRlOworCXZpcnR1YWwgZG91YmxlIEdldFNwZWVkKCkgb3ZlcnJpZGU7CisJdmlydHVhbCBib29sIEdldEZvcndhcmRMaW1pdE9LKCkgb3ZlcnJpZGU7CisJdmlydHVhbCBib29sIEdldFJldmVyc2VMaW1pdE9LKCkgb3ZlcnJpZGU7CisJdmlydHVhbCB1aW50MTZfdCBHZXRGYXVsdHMoKSBvdmVycmlkZTsKKwl2aXJ0dWFsIHZvaWQgU2V0Vm9sdGFnZVJhbXBSYXRlKGRvdWJsZSByYW1wUmF0ZSkgb3ZlcnJpZGU7CisJdmlydHVhbCB1aW50MzJfdCBHZXRGaXJtd2FyZVZlcnNpb24oKSBvdmVycmlkZTsKKwl2aXJ0dWFsIHZvaWQgQ29uZmlnTmV1dHJhbE1vZGUoTmV1dHJhbE1vZGUgbW9kZSkgb3ZlcnJpZGU7CisJdmlydHVhbCB2b2lkIENvbmZpZ0VuY29kZXJDb2Rlc1BlclJldih1aW50MTZfdCBjb2Rlc1BlclJldikgb3ZlcnJpZGU7CisJdmlydHVhbCB2b2lkIENvbmZpZ1BvdGVudGlvbWV0ZXJUdXJucyh1aW50MTZfdCB0dXJucykgb3ZlcnJpZGU7CisJdmlydHVhbCB2b2lkIENvbmZpZ1NvZnRQb3NpdGlvbkxpbWl0cyhkb3VibGUgZm9yd2FyZExpbWl0UG9zaXRpb24sIGRvdWJsZSByZXZlcnNlTGltaXRQb3NpdGlvbikgb3ZlcnJpZGU7CisJdmlydHVhbCB2b2lkIERpc2FibGVTb2Z0UG9zaXRpb25MaW1pdHMoKSBvdmVycmlkZTsKKwl2aXJ0dWFsIHZvaWQgQ29uZmlnTGltaXRNb2RlKExpbWl0TW9kZSBtb2RlKSBvdmVycmlkZTsKKwl2aXJ0dWFsIHZvaWQgQ29uZmlnRm9yd2FyZExpbWl0KGRvdWJsZSBmb3J3YXJkTGltaXRQb3NpdGlvbikgb3ZlcnJpZGU7CisJdmlydHVhbCB2b2lkIENvbmZpZ1JldmVyc2VMaW1pdChkb3VibGUgcmV2ZXJzZUxpbWl0UG9zaXRpb24pIG92ZXJyaWRlOworCXZpcnR1YWwgdm9pZCBDb25maWdNYXhPdXRwdXRWb2x0YWdlKGRvdWJsZSB2b2x0YWdlKSBvdmVycmlkZTsKKwl2aXJ0dWFsIHZvaWQgQ29uZmlnRmF1bHRUaW1lKGZsb2F0IGZhdWx0VGltZSkgb3ZlcnJpZGU7CisJdmlydHVhbCB2b2lkIFNldENvbnRyb2xNb2RlKENvbnRyb2xNb2RlIG1vZGUpOworCXZpcnR1YWwgQ29udHJvbE1vZGUgR2V0Q29udHJvbE1vZGUoKTsKKworIAlzdGF0aWMgdm9pZCBVcGRhdGVTeW5jR3JvdXAodWludDhfdCBzeW5jR3JvdXApOworCisJdm9pZCBTZXRFeHBpcmF0aW9uKGZsb2F0IHRpbWVvdXQpOworCWZsb2F0IEdldEV4cGlyYXRpb24oKTsKKwlib29sIElzQWxpdmUoKTsKKwl2b2lkIFN0b3BNb3RvcigpOworCWJvb2wgSXNTYWZldHlFbmFibGVkKCk7CisJdm9pZCBTZXRTYWZldHlFbmFibGVkKGJvb2wgZW5hYmxlZCk7CisJdm9pZCBHZXREZXNjcmlwdGlvbihjaGFyICpkZXNjKTsKKwl1aW50OF90IEdldERldmljZUlEKCk7CisKK3Byb3RlY3RlZDoKKwkvLyBDb250cm9sIG1vZGUgaGVscGVycworCXZvaWQgU2V0U3BlZWRSZWZlcmVuY2UodWludDhfdCByZWZlcmVuY2UpOworCXVpbnQ4X3QgR2V0U3BlZWRSZWZlcmVuY2UoKTsKKworCXZvaWQgU2V0UG9zaXRpb25SZWZlcmVuY2UodWludDhfdCByZWZlcmVuY2UpOworCXVpbnQ4X3QgR2V0UG9zaXRpb25SZWZlcmVuY2UoKTsKKworCXVpbnQ4X3QgcGFja1BlcmNlbnRhZ2UodWludDhfdCAqYnVmZmVyLCBkb3VibGUgdmFsdWUpOworCXVpbnQ4X3QgcGFja0ZYUDhfOCh1aW50OF90ICpidWZmZXIsIGRvdWJsZSB2YWx1ZSk7CisJdWludDhfdCBwYWNrRlhQMTZfMTYodWludDhfdCAqYnVmZmVyLCBkb3VibGUgdmFsdWUpOworCXVpbnQ4X3QgcGFja2ludDE2X3QodWludDhfdCAqYnVmZmVyLCBpbnQxNl90IHZhbHVlKTsKKwl1aW50OF90IHBhY2tpbnQzMl90KHVpbnQ4X3QgKmJ1ZmZlciwgaW50MzJfdCB2YWx1ZSk7CisJZG91YmxlIHVucGFja1BlcmNlbnRhZ2UodWludDhfdCAqYnVmZmVyKTsKKwlkb3VibGUgdW5wYWNrRlhQOF84KHVpbnQ4X3QgKmJ1ZmZlcik7CisJZG91YmxlIHVucGFja0ZYUDE2XzE2KHVpbnQ4X3QgKmJ1ZmZlcik7CisJaW50MTZfdCB1bnBhY2tpbnQxNl90KHVpbnQ4X3QgKmJ1ZmZlcik7CisJaW50MzJfdCB1bnBhY2tpbnQzMl90KHVpbnQ4X3QgKmJ1ZmZlcik7CisKKwl2b2lkIHNlbmRNZXNzYWdlKHVpbnQzMl90IG1lc3NhZ2VJRCwgY29uc3QgdWludDhfdCAqZGF0YSwgdWludDhfdCBkYXRhU2l6ZSwgaW50MzJfdCBwZXJpb2QgPSBDQU5fU0VORF9QRVJJT0RfTk9fUkVQRUFUKTsKKwl2b2lkIHJlcXVlc3RNZXNzYWdlKHVpbnQzMl90IG1lc3NhZ2VJRCwgaW50MzJfdCBwZXJpb2QgPSBDQU5fU0VORF9QRVJJT0RfTk9fUkVQRUFUKTsKKwlib29sIGdldE1lc3NhZ2UodWludDMyX3QgbWVzc2FnZUlELCB1aW50MzJfdCBtYXNrLCB1aW50OF90ICpkYXRhLCB1aW50OF90ICpkYXRhU2l6ZSk7CisKKwl2b2lkIHNldHVwUGVyaW9kaWNTdGF0dXMoKTsKKwl2b2lkIHVwZGF0ZVBlcmlvZGljU3RhdHVzKCk7CisKKwl1aW50OF90IG1fZGV2aWNlTnVtYmVyOworCWZsb2F0IG1fdmFsdWU7CisKKwkvLyBQYXJhbWV0ZXJzL2NvbmZpZ3VyYXRpb24KKwlDb250cm9sTW9kZSBtX2NvbnRyb2xNb2RlOworCXVpbnQ4X3QgbV9zcGVlZFJlZmVyZW5jZTsKKwl1aW50OF90IG1fcG9zaXRpb25SZWZlcmVuY2U7CisJZG91YmxlIG1fcDsKKwlkb3VibGUgbV9pOworCWRvdWJsZSBtX2Q7CisJTmV1dHJhbE1vZGUgbV9uZXV0cmFsTW9kZTsKKwl1aW50MTZfdCBtX2VuY29kZXJDb2Rlc1BlclJldjsKKwl1aW50MTZfdCBtX3BvdGVudGlvbWV0ZXJUdXJuczsKKwlMaW1pdE1vZGUgbV9saW1pdE1vZGU7CisJZG91YmxlIG1fZm9yd2FyZExpbWl0OworCWRvdWJsZSBtX3JldmVyc2VMaW1pdDsKKwlkb3VibGUgbV9tYXhPdXRwdXRWb2x0YWdlOworCWRvdWJsZSBtX3ZvbHRhZ2VSYW1wUmF0ZTsKKwlmbG9hdCBtX2ZhdWx0VGltZTsKKworCS8vIFdoaWNoIHBhcmFtZXRlcnMgaGF2ZSBiZWVuIHZlcmlmaWVkIHNpbmNlIHRoZXkgd2VyZSBsYXN0IHNldD8KKwlib29sIG1fY29udHJvbE1vZGVWZXJpZmllZDsKKwlib29sIG1fc3BlZWRSZWZWZXJpZmllZDsKKwlib29sIG1fcG9zUmVmVmVyaWZpZWQ7CisJYm9vbCBtX3BWZXJpZmllZDsKKwlib29sIG1faVZlcmlmaWVkOworCWJvb2wgbV9kVmVyaWZpZWQ7CisJYm9vbCBtX25ldXRyYWxNb2RlVmVyaWZpZWQ7CisJYm9vbCBtX2VuY29kZXJDb2Rlc1BlclJldlZlcmlmaWVkOworCWJvb2wgbV9wb3RlbnRpb21ldGVyVHVybnNWZXJpZmllZDsKKwlib29sIG1fZm9yd2FyZExpbWl0VmVyaWZpZWQ7CisJYm9vbCBtX3JldmVyc2VMaW1pdFZlcmlmaWVkOworCWJvb2wgbV9saW1pdE1vZGVWZXJpZmllZDsKKwlib29sIG1fbWF4T3V0cHV0Vm9sdGFnZVZlcmlmaWVkOworCWJvb2wgbV92b2x0YWdlUmFtcFJhdGVWZXJpZmllZDsKKwlib29sIG1fZmF1bHRUaW1lVmVyaWZpZWQ7CisKKwkvLyBTdGF0dXMgZGF0YQorCWZsb2F0IG1fYnVzVm9sdGFnZTsKKwlmbG9hdCBtX291dHB1dFZvbHRhZ2U7CisJZmxvYXQgbV9vdXRwdXRDdXJyZW50OworCWZsb2F0IG1fdGVtcGVyYXR1cmU7CisJZG91YmxlIG1fcG9zaXRpb247CisJZG91YmxlIG1fc3BlZWQ7CisJdWludDhfdCBtX2xpbWl0czsKKwl1aW50MTZfdCBtX2ZhdWx0czsKKwl1aW50MzJfdCBtX2Zpcm13YXJlVmVyc2lvbjsKKwl1aW50OF90IG1faGFyZHdhcmVWZXJzaW9uOworCisJLy8gV2hpY2ggcGVyaW9kaWMgc3RhdHVzIG1lc3NhZ2VzIGhhdmUgd2UgcmVjZWl2ZWQgYXQgbGVhc3Qgb25jZT8KKwlib29sIG1fcmVjZWl2ZWRTdGF0dXNNZXNzYWdlMDsKKwlib29sIG1fcmVjZWl2ZWRTdGF0dXNNZXNzYWdlMTsKKwlib29sIG1fcmVjZWl2ZWRTdGF0dXNNZXNzYWdlMjsKKworCWJvb2wgbV9jb250cm9sRW5hYmxlZDsKKworCXZvaWQgdmVyaWZ5KCk7CisKKwlNb3RvclNhZmV0eUhlbHBlciAqbV9zYWZldHlIZWxwZXI7CisKK3ByaXZhdGU6CisJdm9pZCBJbml0Q0FOSmFndWFyKCk7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQ0FOU3BlZWRDb250cm9sbGVyLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9DQU5TcGVlZENvbnRyb2xsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmQzMDg4Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQ0FOU3BlZWRDb250cm9sbGVyLmgKQEAgLTAsMCArMSw5NyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIlNwZWVkQ29udHJvbGxlci5oIgorCisvKioKKyAqIEludGVyZmFjZSBmb3IgInNtYXJ0IiBDQU4tYmFzZWQgc3BlZWQgY29udHJvbGxlcnMuCisgKiBAc2VlIENBTkphZ3VhcgorICogQHNlZSBDQU5UYWxvbgorICovCitjbGFzcyBDQU5TcGVlZENvbnRyb2xsZXIgOiBwdWJsaWMgU3BlZWRDb250cm9sbGVyCit7CitwdWJsaWM6CisJZW51bSBDb250cm9sTW9kZSB7CisJCWtQZXJjZW50VmJ1cz0wLAorCQlrQ3VycmVudD0xLAorCQlrU3BlZWQ9MiwKKwkJa1Bvc2l0aW9uPTMsCisJCWtWb2x0YWdlPTQsCisgICAga0ZvbGxvd2VyPTUgLy8gTm90IHN1cHBvcnRlZCBpbiBKYWd1YXIuCisJfTsKKworCWVudW0gRmF1bHRzIHsKKwkJa0N1cnJlbnRGYXVsdCA9IDEsCisJCWtUZW1wZXJhdHVyZUZhdWx0ID0gMiwKKwkJa0J1c1ZvbHRhZ2VGYXVsdCA9IDQsCisJCWtHYXRlRHJpdmVyRmF1bHQgPSA4LAorCQkvKiBTUlggZXh0ZW5zaW9ucyAqLworCQlrRndkTGltaXRTd2l0Y2ggPSAweDEwLAorCQlrUmV2TGltaXRTd2l0Y2ggPSAweDIwLAorCQlrRndkU29mdExpbWl0ID0gMHg0MCwKKwkJa1JldlNvZnRMaW1pdCA9IDB4ODAsCisJfTsKKworCWVudW0gTGltaXRzIHsKKwkJa0ZvcndhcmRMaW1pdCA9IDEsCisJCWtSZXZlcnNlTGltaXQgPSAyCisJfTsKKworCWVudW0gTmV1dHJhbE1vZGUgeworCQkvKiogVXNlIHRoZSBOZXV0cmFsTW9kZSB0aGF0IGlzIHNldCBieSB0aGUganVtcGVyIHdpcmUgb24gdGhlIENBTiBkZXZpY2UgKi8KKwkJa05ldXRyYWxNb2RlX0p1bXBlciA9IDAsCisJCS8qKiBTdG9wIHRoZSBtb3RvcidzIHJvdGF0aW9uIGJ5IGFwcGx5aW5nIGEgZm9yY2UuICovCisJCWtOZXV0cmFsTW9kZV9CcmFrZSA9IDEsCisJCS8qKiBEbyBub3QgYXR0ZW1wdCB0byBzdG9wIHRoZSBtb3Rvci4gSW5zdGVhZCBhbGxvdyBpdCB0byBjb2FzdCB0byBhIHN0b3Agd2l0aG91dCBhcHBseWluZyByZXNpc3RhbmNlLiAqLworCQlrTmV1dHJhbE1vZGVfQ29hc3QgPSAyCisJfTsKKworCWVudW0gTGltaXRNb2RlIHsKKwkJLyoqIE9ubHkgdXNlIHN3aXRjaGVzIGZvciBsaW1pdHMgKi8KKwkJa0xpbWl0TW9kZV9Td2l0Y2hJbnB1dHNPbmx5ID0gMCwKKwkJLyoqIFVzZSBib3RoIHN3aXRjaGVzIGFuZCBzb2Z0IGxpbWl0cyAqLworCQlrTGltaXRNb2RlX1NvZnRQb3NpdGlvbkxpbWl0cyA9IDEsCisJCS8qIFNSWCBleHRlbnNpb25zICovCisJCS8qKiBEaXNhYmxlIHN3aXRjaGVzIGFuZCBkaXNhYmxlIHNvZnQgbGltaXRzICovCisJCWtMaW1pdE1vZGVfU3J4RGlzYWJsZVN3aXRjaElucHV0cyA9IDIsCisJfTsKKworCXZpcnR1YWwgZmxvYXQgR2V0KCkgPSAwOworCXZpcnR1YWwgdm9pZCBTZXQoZmxvYXQgdmFsdWUsIHVpbnQ4X3Qgc3luY0dyb3VwPTApID0gMDsKKwl2aXJ0dWFsIHZvaWQgRGlzYWJsZSgpID0gMDsKKwl2aXJ0dWFsIHZvaWQgU2V0UChkb3VibGUgcCkgPSAwOworCXZpcnR1YWwgdm9pZCBTZXRJKGRvdWJsZSBpKSA9IDA7CisJdmlydHVhbCB2b2lkIFNldEQoZG91YmxlIGQpID0gMDsKKwl2aXJ0dWFsIHZvaWQgU2V0UElEKGRvdWJsZSBwLCBkb3VibGUgaSwgZG91YmxlIGQpID0gMDsKKwl2aXJ0dWFsIGRvdWJsZSBHZXRQKCkgPSAwOworCXZpcnR1YWwgZG91YmxlIEdldEkoKSA9IDA7CisJdmlydHVhbCBkb3VibGUgR2V0RCgpID0gMDsKKwl2aXJ0dWFsIGZsb2F0IEdldEJ1c1ZvbHRhZ2UoKSA9IDA7CisJdmlydHVhbCBmbG9hdCBHZXRPdXRwdXRWb2x0YWdlKCkgPSAwOworCXZpcnR1YWwgZmxvYXQgR2V0T3V0cHV0Q3VycmVudCgpID0gMDsKKwl2aXJ0dWFsIGZsb2F0IEdldFRlbXBlcmF0dXJlKCkgPSAwOworCXZpcnR1YWwgZG91YmxlIEdldFBvc2l0aW9uKCkgPSAwOworCXZpcnR1YWwgZG91YmxlIEdldFNwZWVkKCkgPSAwOworCXZpcnR1YWwgYm9vbCBHZXRGb3J3YXJkTGltaXRPSygpID0gMDsKKwl2aXJ0dWFsIGJvb2wgR2V0UmV2ZXJzZUxpbWl0T0soKSA9IDA7CisJdmlydHVhbCB1aW50MTZfdCBHZXRGYXVsdHMoKSA9IDA7CisJdmlydHVhbCB2b2lkIFNldFZvbHRhZ2VSYW1wUmF0ZShkb3VibGUgcmFtcFJhdGUpID0gMDsKKwl2aXJ0dWFsIHVpbnQzMl90IEdldEZpcm13YXJlVmVyc2lvbigpID0gMDsKKwl2aXJ0dWFsIHZvaWQgQ29uZmlnTmV1dHJhbE1vZGUoTmV1dHJhbE1vZGUgbW9kZSkgPSAwOworCXZpcnR1YWwgdm9pZCBDb25maWdFbmNvZGVyQ29kZXNQZXJSZXYodWludDE2X3QgY29kZXNQZXJSZXYpID0gMDsKKwl2aXJ0dWFsIHZvaWQgQ29uZmlnUG90ZW50aW9tZXRlclR1cm5zKHVpbnQxNl90IHR1cm5zKSA9IDA7CisJdmlydHVhbCB2b2lkIENvbmZpZ1NvZnRQb3NpdGlvbkxpbWl0cyhkb3VibGUgZm9yd2FyZExpbWl0UG9zaXRpb24sIGRvdWJsZSByZXZlcnNlTGltaXRQb3NpdGlvbikgPSAwOworCXZpcnR1YWwgdm9pZCBEaXNhYmxlU29mdFBvc2l0aW9uTGltaXRzKCkgPSAwOworCXZpcnR1YWwgdm9pZCBDb25maWdMaW1pdE1vZGUoTGltaXRNb2RlIG1vZGUpID0gMDsKKwl2aXJ0dWFsIHZvaWQgQ29uZmlnRm9yd2FyZExpbWl0KGRvdWJsZSBmb3J3YXJkTGltaXRQb3NpdGlvbikgPSAwOworCXZpcnR1YWwgdm9pZCBDb25maWdSZXZlcnNlTGltaXQoZG91YmxlIHJldmVyc2VMaW1pdFBvc2l0aW9uKSA9IDA7CisJdmlydHVhbCB2b2lkIENvbmZpZ01heE91dHB1dFZvbHRhZ2UoZG91YmxlIHZvbHRhZ2UpID0gMDsKKwl2aXJ0dWFsIHZvaWQgQ29uZmlnRmF1bHRUaW1lKGZsb2F0IGZhdWx0VGltZSkgPSAwOworICAvLyBIb2xkIG9mZiBvbiBpbnRlcmZhY2UgdW50aWwgd2UgZmlndXJlIG91dCBDb250cm9sTW9kZSBlbnVtcy4KKy8vCXZpcnR1YWwgdm9pZCBTZXRDb250cm9sTW9kZShDb250cm9sTW9kZSBtb2RlKSA9IDA7CisvLwl2aXJ0dWFsIENvbnRyb2xNb2RlIEdldENvbnRyb2xNb2RlKCkgPSAwOworfTsKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0NBTlRhbG9uLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9DQU5UYWxvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MjBlYTAKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9DQU5UYWxvbi5oCkBAIC0wLDAgKzEsMTcxIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE0LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiU2FmZVBXTS5oIgorI2luY2x1ZGUgIkNBTlNwZWVkQ29udHJvbGxlci5oIgorI2luY2x1ZGUgIlBJRE91dHB1dC5oIgorI2luY2x1ZGUgIk1vdG9yU2FmZXR5SGVscGVyLmgiCisKK2NsYXNzIENhblRhbG9uU1JYOworCisvKioKKyAqIENUUkUgVGFsb24gU1JYIFNwZWVkIENvbnRyb2xsZXIgd2l0aCBDQU4gQ29udHJvbAorICovCitjbGFzcyBDQU5UYWxvbiA6IHB1YmxpYyBNb3RvclNhZmV0eSwKKyAgICAgICAgICAgICAgICAgcHVibGljIENBTlNwZWVkQ29udHJvbGxlciwKKyAgICAgICAgICAgICAgICAgcHVibGljIEVycm9yQmFzZQoreworcHVibGljOgorICBlbnVtIEZlZWRiYWNrRGV2aWNlIHsKKyAgICBRdWFkRW5jb2Rlcj0wLAorICAgIEFuYWxvZ1BvdD0yLAorICAgIEFuYWxvZ0VuY29kZXI9MywKKyAgICBFbmNSaXNpbmc9NCwKKyAgICBFbmNGYWxsaW5nPTUKKyAgfTsKKyAgZW51bSBTdGF0dXNGcmFtZVJhdGUgeworICAgIFN0YXR1c0ZyYW1lUmF0ZUdlbmVyYWw9MCwKKyAgICBTdGF0dXNGcmFtZVJhdGVGZWVkYmFjaz0xLAorICAgIFN0YXR1c0ZyYW1lUmF0ZVF1YWRFbmNvZGVyPTIsCisgICAgU3RhdHVzRnJhbWVSYXRlQW5hbG9nVGVtcFZiYXQ9MywKKyAgfTsKKwlleHBsaWNpdCBDQU5UYWxvbihpbnQgZGV2aWNlTnVtYmVyKTsKKwlleHBsaWNpdCBDQU5UYWxvbihpbnQgZGV2aWNlTnVtYmVyLGludCBjb250cm9sUGVyaW9kTXMpOworCXZpcnR1YWwgfkNBTlRhbG9uKCk7CisKKwkvLyBQSURDb250cm9sbGVyIGludGVyZmFjZQorCXZpcnR1YWwgdm9pZCBQSURXcml0ZShmbG9hdCBvdXRwdXQpIG92ZXJyaWRlOworCisJLy8gTW90b3JTYWZldHkgaW50ZXJmYWNlCisJdmlydHVhbCB2b2lkIFNldEV4cGlyYXRpb24oZmxvYXQgdGltZW91dCkgb3ZlcnJpZGU7CisJdmlydHVhbCBmbG9hdCBHZXRFeHBpcmF0aW9uKCkgb3ZlcnJpZGU7CisJdmlydHVhbCBib29sIElzQWxpdmUoKSBvdmVycmlkZTsKKwl2aXJ0dWFsIHZvaWQgU3RvcE1vdG9yKCkgb3ZlcnJpZGU7CisJdmlydHVhbCB2b2lkIFNldFNhZmV0eUVuYWJsZWQoYm9vbCBlbmFibGVkKSBvdmVycmlkZTsKKwl2aXJ0dWFsIGJvb2wgSXNTYWZldHlFbmFibGVkKCkgb3ZlcnJpZGU7CisJdmlydHVhbCB2b2lkIEdldERlc2NyaXB0aW9uKGNoYXIgKmRlc2MpIG92ZXJyaWRlOworCisJLy8gQ0FOU3BlZWRDb250cm9sbGVyIGludGVyZmFjZQorCXZpcnR1YWwgZmxvYXQgR2V0KCkgb3ZlcnJpZGU7CisJdmlydHVhbCB2b2lkIFNldChmbG9hdCB2YWx1ZSwgdWludDhfdCBzeW5jR3JvdXA9MCkgb3ZlcnJpZGU7CisJdmlydHVhbCB2b2lkIERpc2FibGUoKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIEVuYWJsZUNvbnRyb2woKTsKKwl2aXJ0dWFsIHZvaWQgU2V0UChkb3VibGUgcCkgb3ZlcnJpZGU7CisJdmlydHVhbCB2b2lkIFNldEkoZG91YmxlIGkpIG92ZXJyaWRlOworCXZpcnR1YWwgdm9pZCBTZXREKGRvdWJsZSBkKSBvdmVycmlkZTsKKwl2b2lkIFNldEYoZG91YmxlIGYpOworCXZvaWQgU2V0SXpvbmUodW5zaWduZWQgaXopOworCXZpcnR1YWwgdm9pZCBTZXRQSUQoZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCkgb3ZlcnJpZGU7CisJdm9pZCBTZXRQSUQoZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCwgZG91YmxlIGYpOworCXZpcnR1YWwgZG91YmxlIEdldFAoKSBvdmVycmlkZTsKKwl2aXJ0dWFsIGRvdWJsZSBHZXRJKCkgb3ZlcnJpZGU7CisJdmlydHVhbCBkb3VibGUgR2V0RCgpIG92ZXJyaWRlOworCWRvdWJsZSBHZXRGKCk7CisJdmlydHVhbCBmbG9hdCBHZXRCdXNWb2x0YWdlKCkgb3ZlcnJpZGU7CisJdmlydHVhbCBmbG9hdCBHZXRPdXRwdXRWb2x0YWdlKCkgb3ZlcnJpZGU7CisJdmlydHVhbCBmbG9hdCBHZXRPdXRwdXRDdXJyZW50KCkgb3ZlcnJpZGU7CisJdmlydHVhbCBmbG9hdCBHZXRUZW1wZXJhdHVyZSgpIG92ZXJyaWRlOworCXZvaWQgU2V0UG9zaXRpb24oZG91YmxlIHBvcyk7CisJdmlydHVhbCBkb3VibGUgR2V0UG9zaXRpb24oKSBvdmVycmlkZTsKKwl2aXJ0dWFsIGRvdWJsZSBHZXRTcGVlZCgpIG92ZXJyaWRlOworICB2aXJ0dWFsIGludCBHZXRDbG9zZWRMb29wRXJyb3IoKTsKKyAgdmlydHVhbCBpbnQgR2V0QW5hbG9nSW4oKTsKKyAgdmlydHVhbCBpbnQgR2V0QW5hbG9nSW5SYXcoKTsKKyAgdmlydHVhbCBpbnQgR2V0QW5hbG9nSW5WZWwoKTsKKyAgdmlydHVhbCBpbnQgR2V0RW5jUG9zaXRpb24oKTsKKyAgdmlydHVhbCBpbnQgR2V0RW5jVmVsKCk7CisJaW50IEdldFBpblN0YXRlUXVhZEEoKTsKKwlpbnQgR2V0UGluU3RhdGVRdWFkQigpOworCWludCBHZXRQaW5TdGF0ZVF1YWRJZHgoKTsKKwlpbnQgSXNGd2RMaW1pdFN3aXRjaENsb3NlZCgpOworCWludCBJc1JldkxpbWl0U3dpdGNoQ2xvc2VkKCk7CisJaW50IEdldE51bWJlck9mUXVhZElkeFJpc2VzKCk7CisJdm9pZCBTZXROdW1iZXJPZlF1YWRJZHhSaXNlcyhpbnQgcmlzZXMpOworCXZpcnR1YWwgYm9vbCBHZXRGb3J3YXJkTGltaXRPSygpIG92ZXJyaWRlOworCXZpcnR1YWwgYm9vbCBHZXRSZXZlcnNlTGltaXRPSygpIG92ZXJyaWRlOworCXZpcnR1YWwgdWludDE2X3QgR2V0RmF1bHRzKCkgb3ZlcnJpZGU7CisJdWludDE2X3QgR2V0U3RpY2t5RmF1bHRzKCk7CisJdm9pZCBDbGVhclN0aWNreUZhdWx0cygpOworCXZpcnR1YWwgdm9pZCBTZXRWb2x0YWdlUmFtcFJhdGUoZG91YmxlIHJhbXBSYXRlKSBvdmVycmlkZTsKKwl2aXJ0dWFsIHVpbnQzMl90IEdldEZpcm13YXJlVmVyc2lvbigpIG92ZXJyaWRlOworCXZpcnR1YWwgdm9pZCBDb25maWdOZXV0cmFsTW9kZShOZXV0cmFsTW9kZSBtb2RlKSBvdmVycmlkZTsKKwl2aXJ0dWFsIHZvaWQgQ29uZmlnRW5jb2RlckNvZGVzUGVyUmV2KHVpbnQxNl90IGNvZGVzUGVyUmV2KSBvdmVycmlkZTsKKwl2aXJ0dWFsIHZvaWQgQ29uZmlnUG90ZW50aW9tZXRlclR1cm5zKHVpbnQxNl90IHR1cm5zKSBvdmVycmlkZTsKKwl2aXJ0dWFsIHZvaWQgQ29uZmlnU29mdFBvc2l0aW9uTGltaXRzKGRvdWJsZSBmb3J3YXJkTGltaXRQb3NpdGlvbiwgZG91YmxlIHJldmVyc2VMaW1pdFBvc2l0aW9uKSBvdmVycmlkZTsKKwl2aXJ0dWFsIHZvaWQgRGlzYWJsZVNvZnRQb3NpdGlvbkxpbWl0cygpIG92ZXJyaWRlOworCXZpcnR1YWwgdm9pZCBDb25maWdMaW1pdE1vZGUoTGltaXRNb2RlIG1vZGUpIG92ZXJyaWRlOworCXZpcnR1YWwgdm9pZCBDb25maWdGb3J3YXJkTGltaXQoZG91YmxlIGZvcndhcmRMaW1pdFBvc2l0aW9uKSBvdmVycmlkZTsKKwl2aXJ0dWFsIHZvaWQgQ29uZmlnUmV2ZXJzZUxpbWl0KGRvdWJsZSByZXZlcnNlTGltaXRQb3NpdGlvbikgb3ZlcnJpZGU7CisJLyoqCisJICogQ2hhbmdlIHRoZSBmd2QgbGltaXQgc3dpdGNoIHNldHRpbmcgdG8gbm9ybWFsbHkgb3BlbiBvciBjbG9zZWQuCisJICogVGFsb24gd2lsbCBkaXNhYmxlIG1vbWVudGFyaWxseSBpZiB0aGUgVGFsb24ncyBjdXJyZW50IHNldHRpbmcKKwkgKiBpcyBkaXNzaW1pbGFyIHRvIHRoZSBjYWxsZXIncyByZXF1ZXN0ZWQgc2V0dGluZy4KKwkgKgorCSAqIFNpbmNlIFRhbG9uIHNhdmVzIHNldHRpbmcgdG8gZmxhc2ggdGhpcyBzaG91bGQgb25seSBhZmZlY3QKKwkgKiBhIGdpdmVuIFRhbG9uIGluaXRpYWxseSBkdXJpbmcgcm9ib3QgaW5zdGFsbC4KKwkgKgorCSAqIEBwYXJhbSBub3JtYWxseU9wZW4gdHJ1ZSBmb3Igbm9ybWFsbHkgb3Blbi4gIGZhbHNlIGZvciBub3JtYWxseSBjbG9zZWQuCisJICovCisJdm9pZCBDb25maWdGd2RMaW1pdFN3aXRjaE5vcm1hbGx5T3Blbihib29sIG5vcm1hbGx5T3Blbik7CisJLyoqCisJICogQ2hhbmdlIHRoZSByZXYgbGltaXQgc3dpdGNoIHNldHRpbmcgdG8gbm9ybWFsbHkgb3BlbiBvciBjbG9zZWQuCisJICogVGFsb24gd2lsbCBkaXNhYmxlIG1vbWVudGFyaWxseSBpZiB0aGUgVGFsb24ncyBjdXJyZW50IHNldHRpbmcKKwkgKiBpcyBkaXNzaW1pbGFyIHRvIHRoZSBjYWxsZXIncyByZXF1ZXN0ZWQgc2V0dGluZy4KKwkgKgorCSAqIFNpbmNlIFRhbG9uIHNhdmVzIHNldHRpbmcgdG8gZmxhc2ggdGhpcyBzaG91bGQgb25seSBhZmZlY3QKKwkgKiBhIGdpdmVuIFRhbG9uIGluaXRpYWxseSBkdXJpbmcgcm9ib3QgaW5zdGFsbC4KKwkgKgorCSAqIEBwYXJhbSBub3JtYWxseU9wZW4gdHJ1ZSBmb3Igbm9ybWFsbHkgb3Blbi4gIGZhbHNlIGZvciBub3JtYWxseSBjbG9zZWQuCisJICovCisJdm9pZCBDb25maWdSZXZMaW1pdFN3aXRjaE5vcm1hbGx5T3Blbihib29sIG5vcm1hbGx5T3Blbik7CisJdmlydHVhbCB2b2lkIENvbmZpZ01heE91dHB1dFZvbHRhZ2UoZG91YmxlIHZvbHRhZ2UpIG92ZXJyaWRlOworCXZpcnR1YWwgdm9pZCBDb25maWdGYXVsdFRpbWUoZmxvYXQgZmF1bHRUaW1lKSBvdmVycmlkZTsKKwl2aXJ0dWFsIHZvaWQgU2V0Q29udHJvbE1vZGUoQ29udHJvbE1vZGUgbW9kZSk7CisgIHZvaWQgU2V0RmVlZGJhY2tEZXZpY2UoRmVlZGJhY2tEZXZpY2UgZGV2aWNlKTsKKwl2b2lkIFNldFN0YXR1c0ZyYW1lUmF0ZU1zKFN0YXR1c0ZyYW1lUmF0ZSBzdGF0ZUZyYW1lLCBpbnQgcGVyaW9kTXMpOworCXZpcnR1YWwgQ29udHJvbE1vZGUgR2V0Q29udHJvbE1vZGUoKTsKKwl2b2lkIFNldFNlbnNvckRpcmVjdGlvbihib29sIHJldmVyc2VTZW5zb3IpOworCXZvaWQgU2V0Q2xvc2VMb29wUmFtcFJhdGUoZG91YmxlIHJhbXBSYXRlKTsKKwl2b2lkIFNlbGVjdFByb2ZpbGVTbG90KGludCBzbG90SWR4KTsKKwlpbnQgR2V0SXpvbmUoKTsKKwlpbnQgR2V0SWFjY3VtKCk7CisJdm9pZCBDbGVhcklhY2N1bSgpOworCWludCBHZXRCcmFrZUVuYWJsZUR1cmluZ05ldXRyYWwoKTsKKworICBib29sIElzQ29udHJvbEVuYWJsZWQoKTsKKyAgZG91YmxlIEdldFNldHBvaW50KCk7Citwcml2YXRlOgorICAvLyBWYWx1ZXMgZm9yIHZhcmlvdXMgbW9kZXMgYXMgaXMgc2VudCBpbiB0aGUgQ0FOIHBhY2tldHMgZm9yIHRoZSBUYWxvbi4KKyAgZW51bSBUYWxvbkNvbnRyb2xNb2RlIHsKKwkJa1Rocm90dGxlPTAsCisgICAga0ZvbGxvd2VyTW9kZT01LAorCQlrVm9sdGFnZU1vZGU9NCwKKwkJa1Bvc2l0aW9uTW9kZT0xLAorCQlrU3BlZWRNb2RlPTIsCisJCWtDdXJyZW50TW9kZT0zLAorICAgIGtEaXNhYmxlZD0xNQorICB9OworCisJaW50IG1fZGV2aWNlTnVtYmVyOworCUNhblRhbG9uU1JYICptX2ltcGw7CisJTW90b3JTYWZldHlIZWxwZXIgKm1fc2FmZXR5SGVscGVyOworICBpbnQgbV9wcm9maWxlOyAvLyBQcm9maWxlIGZyb20gQ0FOVGFsb24gdG8gdXNlLiBTZXQgdG8gemVybyB1bnRpbCB3ZSBjYW4gYWN0dWFsbHkgdGVzdCB0aGlzLgorCisgIGJvb2wgbV9jb250cm9sRW5hYmxlZDsKKyAgQ29udHJvbE1vZGUgbV9jb250cm9sTW9kZTsKKyAgVGFsb25Db250cm9sTW9kZSBtX3NlbmRNb2RlOworCisgIGRvdWJsZSBtX3NldFBvaW50OworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGtEZWxheUZvclNvbGljaXRlZFNpZ25hbHNVcyA9IDQwMDA7CisgIC8qKgorICAgKiBGaXh1cCB0aGUgc2VuZE1vZGUgc28gU2V0KCkgc2VyaWFsaXplcyB0aGUgY29ycmVjdCBkZW1hbmQgdmFsdWUuCisgICAqIEFsc28gZmlsbHMgdGhlIG1vZGVTZWxlY2V0IGluIHRoZSBjb250cm9sIGZyYW1lIHRvIGRpc2FibGVkLgorICAgKiBAcGFyYW0gbW9kZSBDb250cm9sIG1vZGUgdG8gdWx0aW1hdGVseSBlbnRlciBvbmNlIHVzZXIgY2FsbHMgU2V0KCkuCisgICAqIEBzZWUgU2V0KCkKKyAgICovCisgIHZvaWQgQXBwbHlDb250cm9sTW9kZShDQU5TcGVlZENvbnRyb2xsZXI6OkNvbnRyb2xNb2RlIG1vZGUpOworfTsKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0NvbXByZXNzb3IuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0NvbXByZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmU2ZTY1Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQ29tcHJlc3Nvci5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIENvbXByZXNzb3JfSF8KKyNkZWZpbmUgQ29tcHJlc3Nvcl9IXworCisjaW5jbHVkZSAiSEFML0hBTC5ocHAiCisjaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgorCisvKioKKyAqIFBDTSBjb21wcmVzc29yCisgKi8KK2NsYXNzIENvbXByZXNzb3I6IHB1YmxpYyBTZW5zb3JCYXNlIHsKK3B1YmxpYzoKKwlleHBsaWNpdCBDb21wcmVzc29yKHVpbnQ4X3QgcGNtSUQpOworCUNvbXByZXNzb3IoKTsKKwl2aXJ0dWFsIH5Db21wcmVzc29yKCk7CisKKwl2b2lkIFN0YXJ0KCk7CisJdm9pZCBTdG9wKCk7CisJYm9vbCBFbmFibGVkKCk7CisKKwlib29sIEdldFByZXNzdXJlU3dpdGNoVmFsdWUoKTsKKworCWZsb2F0IEdldENvbXByZXNzb3JDdXJyZW50KCk7CisKKwl2b2lkIFNldENsb3NlZExvb3BDb250cm9sKGJvb2wgb24pOworCWJvb2wgR2V0Q2xvc2VkTG9vcENvbnRyb2woKTsKKworCWJvb2wgR2V0Q29tcHJlc3NvckN1cnJlbnRUb29IaWdoRmF1bHQoKTsKKwlib29sIEdldENvbXByZXNzb3JDdXJyZW50VG9vSGlnaFN0aWNreUZhdWx0KCk7CisJYm9vbCBHZXRDb21wcmVzc29yU2hvcnRlZFN0aWNreUZhdWx0KCk7CisJYm9vbCBHZXRDb21wcmVzc29yU2hvcnRlZEZhdWx0KCk7CisJYm9vbCBHZXRDb21wcmVzc29yTm90Q29ubmVjdGVkU3RpY2t5RmF1bHQoKTsKKwlib29sIEdldENvbXByZXNzb3JOb3RDb25uZWN0ZWRGYXVsdCgpOworCXZvaWQgQ2xlYXJBbGxQQ01TdGlja3lGYXVsdHMoKTsKKworcHJvdGVjdGVkOgorCXZvaWQgKm1fcGNtX3BvaW50ZXI7CisKK3ByaXZhdGU6CisJdm9pZCBJbml0Q29tcHJlc3Nvcih1aW50OF90IG1vZHVsZSk7CisJdm9pZCBTZXRDb21wcmVzc29yKGJvb2wgb24pOworfTsKKworI2VuZGlmIC8qIENvbXByZXNzb3JfSF8gKi8KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0NvbnRyb2xsZXJQb3dlci5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQ29udHJvbGxlclBvd2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU0Y2ZiNQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0NvbnRyb2xsZXJQb3dlci5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTEuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBfX0NPTlRST0xMRVJfUE9XRVJfSF9fCisjZGVmaW5lIF9fQ09OVFJPTExFUl9QT1dFUl9IX18KKworCisKK2NsYXNzIENvbnRyb2xsZXJQb3dlcgoreworCXB1YmxpYzogCisJCXN0YXRpYyBkb3VibGUgR2V0SW5wdXRWb2x0YWdlKCk7CisJCXN0YXRpYyBkb3VibGUgR2V0SW5wdXRDdXJyZW50KCk7CisJCXN0YXRpYyBkb3VibGUgR2V0Vm9sdGFnZTNWMygpOworCQlzdGF0aWMgZG91YmxlIEdldEN1cnJlbnQzVjMoKTsKKwkJc3RhdGljIGJvb2wgR2V0RW5hYmxlZDNWMygpOworCQlzdGF0aWMgaW50IEdldEZhdWx0Q291bnQzVjMoKTsKKwkJc3RhdGljIGRvdWJsZSBHZXRWb2x0YWdlNVYoKTsKKwkJc3RhdGljIGRvdWJsZSBHZXRDdXJyZW50NVYoKTsKKwkJc3RhdGljIGJvb2wgR2V0RW5hYmxlZDVWKCk7CisJCXN0YXRpYyBpbnQgR2V0RmF1bHRDb3VudDVWKCk7CisJCXN0YXRpYyBkb3VibGUgR2V0Vm9sdGFnZTZWKCk7CisJCXN0YXRpYyBkb3VibGUgR2V0Q3VycmVudDZWKCk7CisJCXN0YXRpYyBib29sIEdldEVuYWJsZWQ2VigpOworCQlzdGF0aWMgaW50IEdldEZhdWx0Q291bnQ2VigpOworfTsKKyNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0NvdW50ZXIuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0NvdW50ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWFjZThjCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQ291bnRlci5oCkBAIC0wLDAgKzEsODggQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiSEFML0hBTC5ocHAiCisjaW5jbHVkZSAiQW5hbG9nVHJpZ2dlck91dHB1dC5oIgorI2luY2x1ZGUgIkNvdW50ZXJCYXNlLmgiCisjaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgorCitjbGFzcyBEaWdpdGFsR2xpdGNoRmlsdGVyOworCisvKioKKyAqIENsYXNzIGZvciBjb3VudGluZyB0aGUgbnVtYmVyIG9mIHRpY2tzIG9uIGEgZGlnaXRhbCBpbnB1dCBjaGFubmVsLgorICogVGhpcyBpcyBhIGdlbmVyYWwgcHVycG9zZSBjbGFzcyBmb3IgY291bnRpbmcgcmVwZXRpdGl2ZSBldmVudHMuIEl0IGNhbiByZXR1cm4gdGhlIG51bWJlcgorICogb2YgY291bnRzLCB0aGUgcGVyaW9kIG9mIHRoZSBtb3N0IHJlY2VudCBjeWNsZSwgYW5kIGRldGVjdCB3aGVuIHRoZSBzaWduYWwgYmVpbmcgY291bnRlZAorICogaGFzIHN0b3BwZWQgYnkgc3VwcGx5aW5nIGEgbWF4aW11bSBjeWNsZSB0aW1lLgorICoKKyAqIEFsbCBjb3VudGVycyB3aWxsIGltbWVkaWF0ZWx5IHN0YXJ0IGNvdW50aW5nIC0gUmVzZXQoKSB0aGVtIGlmIHlvdSBuZWVkIHRoZW0KKyAqIHRvIGJlIHplcm9lZCBiZWZvcmUgdXNlLgorICovCitjbGFzcyBDb3VudGVyIDogcHVibGljIFNlbnNvckJhc2UsIHB1YmxpYyBDb3VudGVyQmFzZQoreworcHVibGljOgorCisJQ291bnRlcigpOworCWV4cGxpY2l0IENvdW50ZXIoaW50MzJfdCBjaGFubmVsKTsKKwlleHBsaWNpdCBDb3VudGVyKERpZ2l0YWxTb3VyY2UgKnNvdXJjZSk7CisJZXhwbGljaXQgQ291bnRlcihEaWdpdGFsU291cmNlICZzb3VyY2UpOworCWV4cGxpY2l0IENvdW50ZXIoQW5hbG9nVHJpZ2dlciAqdHJpZ2dlcik7CisJZXhwbGljaXQgQ291bnRlcihBbmFsb2dUcmlnZ2VyICZ0cmlnZ2VyKTsKKwlDb3VudGVyKEVuY29kaW5nVHlwZSBlbmNvZGluZ1R5cGUsIERpZ2l0YWxTb3VyY2UgKnVwU291cmNlLCBEaWdpdGFsU291cmNlICpkb3duU291cmNlLAorCQkJYm9vbCBpbnZlcnRlZCk7CisJdmlydHVhbCB+Q291bnRlcigpOworCisJdm9pZCBTZXRVcFNvdXJjZShpbnQzMl90IGNoYW5uZWwpOworCXZvaWQgU2V0VXBTb3VyY2UoQW5hbG9nVHJpZ2dlciAqYW5hbG9nVHJpZ2dlciwgQW5hbG9nVHJpZ2dlclR5cGUgdHJpZ2dlclR5cGUpOworCXZvaWQgU2V0VXBTb3VyY2UoQW5hbG9nVHJpZ2dlciAmYW5hbG9nVHJpZ2dlciwgQW5hbG9nVHJpZ2dlclR5cGUgdHJpZ2dlclR5cGUpOworCXZvaWQgU2V0VXBTb3VyY2UoRGlnaXRhbFNvdXJjZSAqc291cmNlKTsKKwl2b2lkIFNldFVwU291cmNlKERpZ2l0YWxTb3VyY2UgJnNvdXJjZSk7CisJdm9pZCBTZXRVcFNvdXJjZUVkZ2UoYm9vbCByaXNpbmdFZGdlLCBib29sIGZhbGxpbmdFZGdlKTsKKwl2b2lkIENsZWFyVXBTb3VyY2UoKTsKKworCXZvaWQgU2V0RG93blNvdXJjZShpbnQzMl90IGNoYW5uZWwpOworCXZvaWQgU2V0RG93blNvdXJjZShBbmFsb2dUcmlnZ2VyICphbmFsb2dUcmlnZ2VyLCBBbmFsb2dUcmlnZ2VyVHlwZSB0cmlnZ2VyVHlwZSk7CisJdm9pZCBTZXREb3duU291cmNlKEFuYWxvZ1RyaWdnZXIgJmFuYWxvZ1RyaWdnZXIsIEFuYWxvZ1RyaWdnZXJUeXBlIHRyaWdnZXJUeXBlKTsKKwl2b2lkIFNldERvd25Tb3VyY2UoRGlnaXRhbFNvdXJjZSAqc291cmNlKTsKKwl2b2lkIFNldERvd25Tb3VyY2UoRGlnaXRhbFNvdXJjZSAmc291cmNlKTsKKwl2b2lkIFNldERvd25Tb3VyY2VFZGdlKGJvb2wgcmlzaW5nRWRnZSwgYm9vbCBmYWxsaW5nRWRnZSk7CisJdm9pZCBDbGVhckRvd25Tb3VyY2UoKTsKKworCXZvaWQgU2V0VXBEb3duQ291bnRlck1vZGUoKTsKKwl2b2lkIFNldEV4dGVybmFsRGlyZWN0aW9uTW9kZSgpOworCXZvaWQgU2V0U2VtaVBlcmlvZE1vZGUoYm9vbCBoaWdoU2VtaVBlcmlvZCk7CisJdm9pZCBTZXRQdWxzZUxlbmd0aE1vZGUoZmxvYXQgdGhyZXNob2xkKTsKKworCXZvaWQgU2V0UmV2ZXJzZURpcmVjdGlvbihib29sIHJldmVyc2VEaXJlY3Rpb24pOworCisJLy8gQ291bnRlckJhc2UgaW50ZXJmYWNlCisJaW50MzJfdCBHZXQoKTsKKwl2b2lkIFJlc2V0KCk7CisJZG91YmxlIEdldFBlcmlvZCgpOworCXZvaWQgU2V0TWF4UGVyaW9kKGRvdWJsZSBtYXhQZXJpb2QpOworCXZvaWQgU2V0VXBkYXRlV2hlbkVtcHR5KGJvb2wgZW5hYmxlZCk7CisJYm9vbCBHZXRTdG9wcGVkKCk7CisJYm9vbCBHZXREaXJlY3Rpb24oKTsKKwl2b2lkIFNldFNhbXBsZXNUb0F2ZXJhZ2UoaW50IHNhbXBsZXNUb0F2ZXJhZ2UpOworCWludCBHZXRTYW1wbGVzVG9BdmVyYWdlKCk7CisJdWludDMyX3QgR2V0RlBHQUluZGV4KCkKKwl7CisJCXJldHVybiBtX2luZGV4OworCX0KKworcHJvdGVjdGVkOgorCURpZ2l0YWxTb3VyY2UgKm1fdXBTb3VyY2U7CQkvLy88IFdoYXQgbWFrZXMgdGhlIGNvdW50ZXIgY291bnQgdXAuCisJRGlnaXRhbFNvdXJjZSAqbV9kb3duU291cmNlOwkvLy88IFdoYXQgbWFrZXMgdGhlIGNvdW50ZXIgY291bnQgZG93bi4KKwl2b2lkKiBtX2NvdW50ZXI7CQkJCS8vLzwgVGhlIEZQR0EgY291bnRlciBvYmplY3QuCitwcml2YXRlOgorCXZvaWQgSW5pdENvdW50ZXIoTW9kZSBtb2RlID0ga1R3b1B1bHNlKTsKKworCWJvb2wgbV9hbGxvY2F0ZWRVcFNvdXJjZTsJCS8vLzwgV2FzIHRoZSB1cFNvdXJjZSBhbGxvY2F0ZWQgbG9jYWxseT8KKwlib29sIG1fYWxsb2NhdGVkRG93blNvdXJjZTsJLy8vPCBXYXMgdGhlIGRvd25Tb3VyY2UgYWxsb2NhdGVkIGxvY2FsbHk/CisJdWludDMyX3QgbV9pbmRleDsJCQkJCS8vLzwgVGhlIGluZGV4IG9mIHRoaXMgY291bnRlci4KKworICBmcmllbmQgY2xhc3MgRGlnaXRhbEdsaXRjaEZpbHRlcjsKK307CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9Db3VudGVyQmFzZS5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQ291bnRlckJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDc1ZGRmCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQ291bnRlckJhc2UuaApAQCAtMCwwICsxLDM1IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKioKKyAqIEludGVyZmFjZSBmb3IgY291bnRpbmcgdGhlIG51bWJlciBvZiB0aWNrcyBvbiBhIGRpZ2l0YWwgaW5wdXQgY2hhbm5lbC4KKyAqIEVuY29kZXJzLCBHZWFyIHRvb3RoIHNlbnNvcnMsIGFuZCBjb3VudGVycyBzaG91bGQgYWxsIHN1YmNsYXNzIHRoaXMgc28gaXQgY2FuCisgKiBiZSB1c2VkIHRvIGJ1aWxkIG1vcmUgYWR2YW5jZWQgY2xhc3NlcyBmb3IgY29udHJvbCBhbmQgZHJpdmluZy4KKyAqCisgKiBBbGwgY291bnRlcnMgd2lsbCBpbW1lZGlhdGVseSBzdGFydCBjb3VudGluZyAtIFJlc2V0KCkgdGhlbSBpZiB5b3UgbmVlZCB0aGVtCisgKiB0byBiZSB6ZXJvZWQgYmVmb3JlIHVzZS4KKyAqLworY2xhc3MgQ291bnRlckJhc2UKK3sKK3B1YmxpYzoKKwllbnVtIEVuY29kaW5nVHlwZQorCXsKKwkJazFYLAorCQlrMlgsCisJCWs0WAorCX07CisKKwl2aXJ0dWFsIH5Db3VudGVyQmFzZSgpIHt9CisJdmlydHVhbCBpbnQzMl90IEdldCgpID0gMDsKKwl2aXJ0dWFsIHZvaWQgUmVzZXQoKSA9IDA7CisJdmlydHVhbCBkb3VibGUgR2V0UGVyaW9kKCkgPSAwOworCXZpcnR1YWwgdm9pZCBTZXRNYXhQZXJpb2QoZG91YmxlIG1heFBlcmlvZCkgPSAwOworCXZpcnR1YWwgYm9vbCBHZXRTdG9wcGVkKCkgPSAwOworCXZpcnR1YWwgYm9vbCBHZXREaXJlY3Rpb24oKSA9IDA7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvRGlnaXRhbElucHV0LmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9EaWdpdGFsSW5wdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjU0OGQzCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvRGlnaXRhbElucHV0LmgKQEAgLTAsMCArMSwxMTkgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8YXJyYXk+CisKKyNpbmNsdWRlICJEaWdpdGFsU291cmNlLmgiCisKK2NsYXNzIEVuY29kZXI7CitjbGFzcyBDb3VudGVyOworY2xhc3MgRGlnaXRhbEdsaXRjaEZpbHRlcjsKKworLyoqCisgKiBDbGFzcyB0byByZWFkIGEgZGlnaXRhbCBpbnB1dC4KKyAqIFRoaXMgY2xhc3Mgd2lsbCByZWFkIGRpZ2l0YWwgaW5wdXRzIGFuZCByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgb24gdGhlIGNoYW5uZWwuIE90aGVyIGRldmljZXMKKyAqIHN1Y2ggYXMgZW5jb2RlcnMsIGdlYXIgdG9vdGggc2Vuc29ycywgZXRjLiB0aGF0IGFyZSBpbXBsZW1lbnRlZCBlbHNld2hlcmUgd2lsbCBhdXRvbWF0aWNhbGx5CisgKiBhbGxvY2F0ZSBkaWdpdGFsIGlucHV0cyBhbmQgb3V0cHV0cyBhcyByZXF1aXJlZC4gVGhpcyBjbGFzcyBpcyBvbmx5IGZvciBkZXZpY2VzIGxpa2Ugc3dpdGNoZXMKKyAqIGV0Yy4gdGhhdCBhcmVuJ3QgaW1wbGVtZW50ZWQgYW55d2hlcmUgZWxzZS4KKyAqLworY2xhc3MgRGlnaXRhbElucHV0IDogcHVibGljIERpZ2l0YWxTb3VyY2UKK3sKK3B1YmxpYzoKKwlleHBsaWNpdCBEaWdpdGFsSW5wdXQodWludDMyX3QgY2hhbm5lbCk7CisJdmlydHVhbCB+RGlnaXRhbElucHV0KCk7CisJYm9vbCBHZXQoKTsKKwl1aW50MzJfdCBHZXRDaGFubmVsKCk7CisKKwkvLyBEaWdpdGFsIFNvdXJjZSBJbnRlcmZhY2UKKwl2aXJ0dWFsIHVpbnQzMl90IEdldENoYW5uZWxGb3JSb3V0aW5nKCk7CisJdmlydHVhbCB1aW50MzJfdCBHZXRNb2R1bGVGb3JSb3V0aW5nKCk7CisJdmlydHVhbCBib29sIEdldEFuYWxvZ1RyaWdnZXJGb3JSb3V0aW5nKCk7CisKK3ByaXZhdGU6CisJdm9pZCBJbml0RGlnaXRhbElucHV0KHVpbnQzMl90IGNoYW5uZWwpOworCXVpbnQzMl90IG1fY2hhbm5lbDsKKwlib29sIG1fbGFzdFZhbHVlOworCisgIGZyaWVuZCBEaWdpdGFsR2xpdGNoRmlsdGVyOworfTsKKworLyoqCisgKiBDbGFzcyB0byBlbmFibGUgZ2xpdGNoIGZpbHRlcmluZyBvbiBhIHNldCBvZiBkaWdpdGFsIGlucHV0cy4KKyAqIFRoaXMgY2xhc3Mgd2lsbCBtYW5hZ2UgYWRkaW5nIGFuZCByZW1vdmluZyBkaWdpdGFsIGlucHV0cyBmcm9tIGEgRlBHQSBnbGl0Y2gKKyAqIGZpbHRlci4gVGhlIGZpbHRlciBsZXRzIHRoZSB1c2VyIGNvbmZpZ3VyZSB0aGUgdGltZSB0aGF0IGFuIGlucHV0IG11c3QgcmVtYWluCisgKiBoaWdoIG9yIGxvdyBiZWZvcmUgaXQgaXMgY2xhc3NpZmllZCBhcyBoaWdoIG9yIGxvdy4KKyAqLworY2xhc3MgRGlnaXRhbEdsaXRjaEZpbHRlciA6IHB1YmxpYyBFcnJvckJhc2UgeworIHB1YmxpYzoKKyAgRGlnaXRhbEdsaXRjaEZpbHRlcigpOworICB+RGlnaXRhbEdsaXRjaEZpbHRlcigpOworCisgIC8qKgorICAgKiBBc3NpZ25zIHRoZSBEaWdpdGFsU291cmNlIHRvIHRoaXMgZ2xpdGNoIGZpbHRlci4KKyAgICoKKyAgICogQHBhcmFtIGlucHV0IFRoZSBEaWdpdGFsU291cmNlIHRvIGFkZC4KKyAgICovCisgIHZvaWQgQWRkKERpZ2l0YWxTb3VyY2UgKmlucHV0KTsKKworICAvKioKKyAgICogQXNzaWducyB0aGUgRW5jb2RlciB0byB0aGlzIGdsaXRjaCBmaWx0ZXIuCisgICAqCisgICAqIEBwYXJhbSBpbnB1dCBUaGUgRW5jb2RlciB0byBhZGQuCisgICAqLworICB2b2lkIEFkZChFbmNvZGVyICppbnB1dCk7CisKKyAgLyoqCisgICAqIEFzc2lnbnMgdGhlIENvdW50ZXIgdG8gdGhpcyBnbGl0Y2ggZmlsdGVyLgorICAgKgorICAgKiBAcGFyYW0gaW5wdXQgVGhlIENvdW50ZXIgdG8gYWRkLgorICAgKi8KKyAgdm9pZCBBZGQoQ291bnRlciAqaW5wdXQpOworCisgIC8qKgorICAgKiBSZW1vdmVzIGEgZGlnaXRhbCBpbnB1dCBmcm9tIHRoaXMgZmlsdGVyLgorICAgKgorICAgKiBSZW1vdmVzIHRoZSBEaWdpdGFsU291cmNlIGZyb20gdGhpcyBnbGl0Y2ggZmlsdGVyIGFuZCByZS1hc3NpZ25zIGl0IHRvIHRoZQorICAgKiBkZWZhdWx0IGZpbHRlci4KKyAgICoKKyAgICogQHBhcmFtIGlucHV0IFRoZSBEaWdpdGFsU291cmNlIHRvIHJlbW92ZS4KKyAgICovCisgIHZvaWQgUmVtb3ZlKERpZ2l0YWxTb3VyY2UgKmlucHV0KTsKKyAgdm9pZCBSZW1vdmUoRW5jb2RlciAqaW5wdXQpOworICB2b2lkIFJlbW92ZShDb3VudGVyICppbnB1dCk7CisKKyAgLyoqCisgICAqIFNldHMgdGhlIG51bWJlciBvZiBjeWNsZXMgdGhhdCB0aGUgaW5wdXQgbXVzdCBub3QgY2hhbmdlIHN0YXRlIGZvci4KKyAgICoKKyAgICogQHBhcmFtIGZwZ2FfY3ljbGVzIFRoZSBudW1iZXIgb2YgRlBHQSBjeWNsZXMuCisgICAqLworICB2b2lkIFNldFBlcmlvZEN5Y2xlcyh1aW50MzJfdCBmcGdhX2N5Y2xlcyk7CisKKyAgLyoqCisgICAqIFNldHMgdGhlIG51bWJlciBvZiBuYW5vc2Vjb25kcyB0aGF0IHRoZSBpbnB1dCBtdXN0IG5vdCBjaGFuZ2Ugc3RhdGUgZm9yLgorICAgKgorICAgKiBAcGFyYW0gbmFub3NlY29uZHMgVGhlIG51bWJlciBvZiBuYW5vc2Vjb25kcy4KKyAgICovCisgIHZvaWQgU2V0UGVyaW9kTmFub1NlY29uZHModWludDY0X3QgbmFub3NlY29uZHMpOworCisgIC8qKgorICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgY3ljbGVzIHRoYXQgdGhlIGlucHV0IG11c3Qgbm90IGNoYW5nZSBzdGF0ZSBmb3IuCisgICAqCisgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBjeWNsZXMuCisgICAqLworICB1aW50MzJfdCBHZXRQZXJpb2RDeWNsZXMoKTsKKyAgLyoqCisgICAqIEdldHMgdGhlIG51bWJlciBvZiBuYW5vc2Vjb25kcyB0aGF0IHRoZSBpbnB1dCBtdXN0IG5vdCBjaGFuZ2Ugc3RhdGUgZm9yLgorICAgKgorICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgbmFub3NlY29uZHMuCisgICAqLworICB1aW50NjRfdCBHZXRQZXJpb2ROYW5vU2Vjb25kcygpOworCisgcHJpdmF0ZToKKyAgaW50IGNoYW5uZWxfaW5kZXhfOworICBzdGF0aWMgTXV0ZXggbXV0ZXhfOworICBzdGF0aWMgOjpzdGQ6OmFycmF5PGludCwgMz4gZmlsdGVyX2FsbG9jYXRlZF87Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvRGlnaXRhbE91dHB1dC5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvRGlnaXRhbE91dHB1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNGVmMDUKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9EaWdpdGFsT3V0cHV0LmgKQEAgLTAsMCArMSwzOSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJEaWdpdGFsU291cmNlLmgiCisKKy8qKgorICogQ2xhc3MgdG8gd3JpdGUgdG8gZGlnaXRhbCBvdXRwdXRzLgorICogV3JpdGUgdmFsdWVzIHRvIHRoZSBkaWdpdGFsIG91dHB1dCBjaGFubmVscy4gT3RoZXIgZGV2aWNlcyBpbXBsZW1lbnRlZCBlbHNld2hlcmUgd2lsbCBhbGxvY2F0ZQorICogY2hhbm5lbHMgYXV0b21hdGljYWxseSBzbyBmb3IgdGhvc2UgZGV2aWNlcyBpdCBzaG91bGRuJ3QgYmUgZG9uZSBoZXJlLgorICovCitjbGFzcyBEaWdpdGFsT3V0cHV0IDogcHVibGljIERpZ2l0YWxTb3VyY2UKK3sKK3B1YmxpYzoKKwlleHBsaWNpdCBEaWdpdGFsT3V0cHV0KHVpbnQzMl90IGNoYW5uZWwpOworCXZpcnR1YWwgfkRpZ2l0YWxPdXRwdXQoKTsKKwl2b2lkIFNldCh1aW50MzJfdCB2YWx1ZSk7CisJdWludDMyX3QgR2V0Q2hhbm5lbCgpOworCXZvaWQgUHVsc2UoZmxvYXQgbGVuZ3RoKTsKKwlib29sIElzUHVsc2luZygpOworCXZvaWQgU2V0UFdNUmF0ZShmbG9hdCByYXRlKTsKKwl2b2lkIEVuYWJsZVBXTShmbG9hdCBpbml0aWFsRHV0eUN5Y2xlKTsKKwl2b2lkIERpc2FibGVQV00oKTsKKwl2b2lkIFVwZGF0ZUR1dHlDeWNsZShmbG9hdCBkdXR5Q3ljbGUpOworCisJLy8gRGlnaXRhbCBTb3VyY2UgSW50ZXJmYWNlCisJdmlydHVhbCB1aW50MzJfdCBHZXRDaGFubmVsRm9yUm91dGluZygpOworCXZpcnR1YWwgdWludDMyX3QgR2V0TW9kdWxlRm9yUm91dGluZygpOworCXZpcnR1YWwgYm9vbCBHZXRBbmFsb2dUcmlnZ2VyRm9yUm91dGluZygpOworCitwcml2YXRlOgorCXZvaWQgSW5pdERpZ2l0YWxPdXRwdXQodWludDMyX3QgY2hhbm5lbCk7CisKKwl1aW50MzJfdCBtX2NoYW5uZWw7CisJdm9pZCAqbV9wd21HZW5lcmF0b3I7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvRGlnaXRhbFNvdXJjZS5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvRGlnaXRhbFNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MWZhN2MKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9EaWdpdGFsU291cmNlLmgKQEAgLTAsMCArMSwyNCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZS5oIgorCisvKioKKyAqIERpZ2l0YWxTb3VyY2UgSW50ZXJmYWNlLgorICogVGhlIERpZ2l0YWxTb3VyY2UgcmVwcmVzZW50cyBhbGwgdGhlIHBvc3NpYmxlIGlucHV0cyBmb3IgYSBjb3VudGVyIG9yIGEgcXVhZHJhdHVyZSBlbmNvZGVyLiBUaGUgc291cmNlIG1heSBiZQorICogZWl0aGVyIGEgZGlnaXRhbCBpbnB1dCBvciBhbiBhbmFsb2cgaW5wdXQuIElmIHRoZSBjYWxsZXIganVzdCBwcm92aWRlcyBhIGNoYW5uZWwsIHRoZW4gYSBkaWdpdGFsIGlucHV0IHdpbGwgYmUKKyAqIGNvbnN0cnVjdGVkIGFuZCBmcmVlZCB3aGVuIGZpbmlzaGVkIGZvciB0aGUgc291cmNlLiBUaGUgc291cmNlIGNhbiBlaXRoZXIgYmUgYSBkaWdpdGFsIGlucHV0IG9yIGFuYWxvZyB0cmlnZ2VyCisgKiBidXQgbm90IGJvdGguCisgKi8KK2NsYXNzIERpZ2l0YWxTb3VyY2UgOiBwdWJsaWMgSW50ZXJydXB0YWJsZVNlbnNvckJhc2UKK3sKK3B1YmxpYzoKKwl2aXJ0dWFsIH5EaWdpdGFsU291cmNlKCk7CisJdmlydHVhbCB1aW50MzJfdCBHZXRDaGFubmVsRm9yUm91dGluZygpID0gMDsKKwl2aXJ0dWFsIHVpbnQzMl90IEdldE1vZHVsZUZvclJvdXRpbmcoKSA9IDA7CisJdmlydHVhbCBib29sIEdldEFuYWxvZ1RyaWdnZXJGb3JSb3V0aW5nKCkgPSAwOworfTsKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0RvdWJsZVNvbGVub2lkLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9Eb3VibGVTb2xlbm9pZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNDFmODkKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9Eb3VibGVTb2xlbm9pZC5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiU29sZW5vaWRCYXNlLmgiCisKKy8qKgorICogRG91YmxlU29sZW5vaWQgY2xhc3MgZm9yIHJ1bm5pbmcgMiBjaGFubmVscyBvZiBoaWdoIHZvbHRhZ2UgRGlnaXRhbCBPdXRwdXQKKyAqIChQQ00pLgorICoKKyAqIFRoZSBEb3VibGVTb2xlbm9pZCBjbGFzcyBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgcG5ldW1hdGljcyBzb2xlbm9pZHMgdGhhdAorICogaGF2ZSB0d28gcG9zaXRpb25zIGNvbnRyb2xsZWQgYnkgdHdvIHNlcGFyYXRlIGNoYW5uZWxzLgorICovCitjbGFzcyBEb3VibGVTb2xlbm9pZCA6IHB1YmxpYyBTb2xlbm9pZEJhc2UKK3sKK3B1YmxpYzoKKwllbnVtIFZhbHVlCisJeworCQlrT2ZmLAorCQlrRm9yd2FyZCwKKwkJa1JldmVyc2UKKwl9OworCisJZXhwbGljaXQgRG91YmxlU29sZW5vaWQodWludDMyX3QgZm9yd2FyZENoYW5uZWwsIHVpbnQzMl90IHJldmVyc2VDaGFubmVsKTsKKwlEb3VibGVTb2xlbm9pZCh1aW50OF90IG1vZHVsZU51bWJlciwgdWludDMyX3QgZm9yd2FyZENoYW5uZWwsIHVpbnQzMl90IHJldmVyc2VDaGFubmVsKTsKKwl2aXJ0dWFsIH5Eb3VibGVTb2xlbm9pZCgpOworCXZpcnR1YWwgdm9pZCBTZXQoVmFsdWUgdmFsdWUpOworCXZpcnR1YWwgVmFsdWUgR2V0KCk7CisJYm9vbCBJc0Z3ZFNvbGVub2lkQmxhY2tMaXN0ZWQoKTsKKwlib29sIElzUmV2U29sZW5vaWRCbGFja0xpc3RlZCgpOworCitwcml2YXRlOgorCXZpcnR1YWwgdm9pZCBJbml0U29sZW5vaWQoKTsKKworCXVpbnQzMl90IG1fZm9yd2FyZENoYW5uZWw7IC8vLzwgVGhlIGZvcndhcmQgY2hhbm5lbCBvbiB0aGUgbW9kdWxlIHRvIGNvbnRyb2wuCisJdWludDMyX3QgbV9yZXZlcnNlQ2hhbm5lbDsgLy8vPCBUaGUgcmV2ZXJzZSBjaGFubmVsIG9uIHRoZSBtb2R1bGUgdG8gY29udHJvbC4KKwl1aW50OF90IG1fZm9yd2FyZE1hc2s7IC8vLzwgVGhlIG1hc2sgZm9yIHRoZSBmb3J3YXJkIGNoYW5uZWwuCisJdWludDhfdCBtX3JldmVyc2VNYXNrOyAvLy88IFRoZSBtYXNrIGZvciB0aGUgcmV2ZXJzZSBjaGFubmVsLgorfTsKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0RyaXZlclN0YXRpb24uaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0RyaXZlclN0YXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzk3Y2EzCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvRHJpdmVyU3RhdGlvbi5oCkBAIC0wLDAgKzEsMTE0IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgorI2luY2x1ZGUgIlJvYm90U3RhdGUuaCIKKyNpbmNsdWRlICJUYXNrLmgiCisjaW5jbHVkZSAiSEFML0hBTC5ocHAiCisKK3N0cnVjdCBIQUxDb250cm9sV29yZDsKK2NsYXNzIEFuYWxvZ0lucHV0OworCisvKioKKyAqIFByb3ZpZGUgYWNjZXNzIHRvIHRoZSBuZXR3b3JrIGNvbW11bmljYXRpb24gZGF0YSB0byAvIGZyb20gdGhlIERyaXZlciBTdGF0aW9uLgorICovCitjbGFzcyBEcml2ZXJTdGF0aW9uIDogcHVibGljIFNlbnNvckJhc2UsIHB1YmxpYyBSb2JvdFN0YXRlSW50ZXJmYWNlCit7CitwdWJsaWM6CisJZW51bSBBbGxpYW5jZQorCXsKKwkJa1JlZCwKKwkJa0JsdWUsCisJCWtJbnZhbGlkCisJfTsKKworCXZpcnR1YWwgfkRyaXZlclN0YXRpb24oKTsKKwlzdGF0aWMgRHJpdmVyU3RhdGlvbiAqR2V0SW5zdGFuY2UoKTsKKwlzdGF0aWMgdm9pZCBSZXBvcnRFcnJvcihzdGQ6OnN0cmluZyBlcnJvcik7CisKKwlzdGF0aWMgY29uc3QgdWludDMyX3Qga0pveXN0aWNrUG9ydHMgPSA2OworCisJZmxvYXQgR2V0U3RpY2tBeGlzKHVpbnQzMl90IHN0aWNrLCB1aW50MzJfdCBheGlzKTsKKwlpbnQgR2V0U3RpY2tQT1YodWludDMyX3Qgc3RpY2ssIHVpbnQzMl90IHBvdik7CisJdWludDMyX3QgR2V0U3RpY2tCdXR0b25zKHVpbnQzMl90IHN0aWNrKTsKKwlib29sIEdldFN0aWNrQnV0dG9uKHVpbnQzMl90IHN0aWNrLCB1aW50OF90IGJ1dHRvbik7CisKKwlpbnQgR2V0U3RpY2tBeGlzQ291bnQodWludDMyX3Qgc3RpY2spOworCWludCBHZXRTdGlja1BPVkNvdW50KHVpbnQzMl90IHN0aWNrKTsKKwlpbnQgR2V0U3RpY2tCdXR0b25Db3VudCh1aW50MzJfdCBzdGljayk7CisKKwlib29sIElzRW5hYmxlZCgpOworCWJvb2wgSXNEaXNhYmxlZCgpOworCWJvb2wgSXNBdXRvbm9tb3VzKCk7CisJYm9vbCBJc09wZXJhdG9yQ29udHJvbCgpOworCWJvb2wgSXNUZXN0KCk7CisJYm9vbCBJc0RTQXR0YWNoZWQoKTsKKwlib29sIElzTmV3Q29udHJvbERhdGEoKTsKKwlib29sIElzRk1TQXR0YWNoZWQoKTsKKwlib29sIElzU3lzQWN0aXZlKCk7CisJYm9vbCBJc1N5c0Jyb3duZWRPdXQoKTsKKworCUFsbGlhbmNlIEdldEFsbGlhbmNlKCk7CisJdWludDMyX3QgR2V0TG9jYXRpb24oKTsKKwl2b2lkIFdhaXRGb3JEYXRhKCk7CisJZG91YmxlIEdldE1hdGNoVGltZSgpOworCWZsb2F0IEdldEJhdHRlcnlWb2x0YWdlKCk7CisKKwkvKiogT25seSB0byBiZSB1c2VkIHRvIHRlbGwgdGhlIERyaXZlciBTdGF0aW9uIHdoYXQgY29kZSB5b3UgY2xhaW0gdG8gYmUgZXhlY3V0aW5nCisJICogICBmb3IgZGlhZ25vc3RpYyBwdXJwb3NlcyBvbmx5CisJICogQHBhcmFtIGVudGVyaW5nIElmIHRydWUsIHN0YXJ0aW5nIGRpc2FibGVkIGNvZGU7IGlmIGZhbHNlLCBsZWF2aW5nIGRpc2FibGVkIGNvZGUgKi8KKwl2b2lkIEluRGlzYWJsZWQoYm9vbCBlbnRlcmluZykKKwl7CisJCW1fdXNlckluRGlzYWJsZWQgPSBlbnRlcmluZzsKKwl9CisJLyoqIE9ubHkgdG8gYmUgdXNlZCB0byB0ZWxsIHRoZSBEcml2ZXIgU3RhdGlvbiB3aGF0IGNvZGUgeW91IGNsYWltIHRvIGJlIGV4ZWN1dGluZworCSAqICAgZm9yIGRpYWdub3N0aWMgcHVycG9zZXMgb25seQorCSAqIEBwYXJhbSBlbnRlcmluZyBJZiB0cnVlLCBzdGFydGluZyBhdXRvbm9tb3VzIGNvZGU7IGlmIGZhbHNlLCBsZWF2aW5nIGF1dG9ub21vdXMgY29kZSAqLworCXZvaWQgSW5BdXRvbm9tb3VzKGJvb2wgZW50ZXJpbmcpCisJeworCQltX3VzZXJJbkF1dG9ub21vdXMgPSBlbnRlcmluZzsKKwl9CisJLyoqIE9ubHkgdG8gYmUgdXNlZCB0byB0ZWxsIHRoZSBEcml2ZXIgU3RhdGlvbiB3aGF0IGNvZGUgeW91IGNsYWltIHRvIGJlIGV4ZWN1dGluZworCSAqICAgZm9yIGRpYWdub3N0aWMgcHVycG9zZXMgb25seQorCSAqIEBwYXJhbSBlbnRlcmluZyBJZiB0cnVlLCBzdGFydGluZyB0ZWxlb3AgY29kZTsgaWYgZmFsc2UsIGxlYXZpbmcgdGVsZW9wIGNvZGUgKi8KKwl2b2lkIEluT3BlcmF0b3JDb250cm9sKGJvb2wgZW50ZXJpbmcpCisJeworCQltX3VzZXJJblRlbGVvcCA9IGVudGVyaW5nOworCX0KKwkvKiogT25seSB0byBiZSB1c2VkIHRvIHRlbGwgdGhlIERyaXZlciBTdGF0aW9uIHdoYXQgY29kZSB5b3UgY2xhaW0gdG8gYmUgZXhlY3V0aW5nCisJICogICBmb3IgZGlhZ25vc3RpYyBwdXJwb3NlcyBvbmx5CisJICogQHBhcmFtIGVudGVyaW5nIElmIHRydWUsIHN0YXJ0aW5nIHRlc3QgY29kZTsgaWYgZmFsc2UsIGxlYXZpbmcgdGVzdCBjb2RlICovCisJdm9pZCBJblRlc3QoYm9vbCBlbnRlcmluZykKKwl7CisJCW1fdXNlckluVGVzdCA9IGVudGVyaW5nOworCX0KKworcHJvdGVjdGVkOgorCURyaXZlclN0YXRpb24oKTsKKworCXZvaWQgR2V0RGF0YSgpOworcHJpdmF0ZToKKwlzdGF0aWMgdm9pZCBJbml0VGFzayhEcml2ZXJTdGF0aW9uICpkcyk7CisJc3RhdGljIERyaXZlclN0YXRpb24gKm1faW5zdGFuY2U7CisJdm9pZCBSZXBvcnRKb3lzdGlja1VucGx1Z2dlZEVycm9yKHN0ZDo6c3RyaW5nIG1lc3NhZ2UpOworCXZvaWQgUnVuKCk7CisKKwlIQUxKb3lzdGlja0F4ZXMgbV9qb3lzdGlja0F4ZXNba0pveXN0aWNrUG9ydHNdOworCUhBTEpveXN0aWNrUE9WcyBtX2pveXN0aWNrUE9Wc1trSm95c3RpY2tQb3J0c107CisJSEFMSm95c3RpY2tCdXR0b25zIG1fam95c3RpY2tCdXR0b25zW2tKb3lzdGlja1BvcnRzXTsKKwlUYXNrIG1fdGFzazsKKwlTRU1BUEhPUkVfSUQgbV9uZXdDb250cm9sRGF0YTsKKwlNVUxUSVdBSVRfSUQgbV9wYWNrZXREYXRhQXZhaWxhYmxlTXVsdGlXYWl0OworCU1VVEVYX0lEIG1fcGFja2V0RGF0YUF2YWlsYWJsZU11dGV4OworCU1VTFRJV0FJVF9JRCBtX3dhaXRGb3JEYXRhU2VtOworCU1VVEVYX0lEIG1fd2FpdEZvckRhdGFNdXRleDsKKwlib29sIG1fdXNlckluRGlzYWJsZWQ7CisJYm9vbCBtX3VzZXJJbkF1dG9ub21vdXM7CisJYm9vbCBtX3VzZXJJblRlbGVvcDsKKwlib29sIG1fdXNlckluVGVzdDsKKwlkb3VibGUgbV9uZXh0TWVzc2FnZVRpbWU7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvRW5jb2Rlci5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvRW5jb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YzRlNWYKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9FbmNvZGVyLmgKQEAgLTAsMCArMSw4MiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJIQUwvSEFMLmhwcCIKKyNpbmNsdWRlICJDb3VudGVyQmFzZS5oIgorI2luY2x1ZGUgIlNlbnNvckJhc2UuaCIKKyNpbmNsdWRlICJDb3VudGVyLmgiCisjaW5jbHVkZSAiUElEU291cmNlLmgiCisKK2NsYXNzIERpZ2l0YWxTb3VyY2U7CitjbGFzcyBEaWdpdGFsR2xpdGNoRmlsdGVyOworCisvKioKKyAqIENsYXNzIHRvIHJlYWQgcXVhZCBlbmNvZGVycy4KKyAqIFF1YWRyYXR1cmUgZW5jb2RlcnMgYXJlIGRldmljZXMgdGhhdCBjb3VudCBzaGFmdCByb3RhdGlvbiBhbmQgY2FuIHNlbnNlIGRpcmVjdGlvbi4gVGhlIG91dHB1dCBvZgorICogdGhlIFF1YWRFbmNvZGVyIGNsYXNzIGlzIGFuIGludGVnZXIgdGhhdCBjYW4gY291bnQgZWl0aGVyIHVwIG9yIGRvd24sIGFuZCBjYW4gZ28gbmVnYXRpdmUgZm9yCisgKiByZXZlcnNlIGRpcmVjdGlvbiBjb3VudGluZy4gV2hlbiBjcmVhdGluZyBRdWFkRW5jb2RlcnMsIGEgZGlyZWN0aW9uIGlzIHN1cHBsaWVkIHRoYXQgY2hhbmdlcyB0aGUKKyAqIHNlbnNlIG9mIHRoZSBvdXRwdXQgdG8gbWFrZSBjb2RlIG1vcmUgcmVhZGFibGUgaWYgdGhlIGVuY29kZXIgaXMgbW91bnRlZCBzdWNoIHRoYXQgZm9yd2FyZCBtb3ZlbWVudAorICogZ2VuZXJhdGVzIG5lZ2F0aXZlIHZhbHVlcy4gUXVhZHJhdHVyZSBlbmNvZGVycyBoYXZlIHR3byBkaWdpdGFsIG91dHB1dHMsIGFuIEEgQ2hhbm5lbCBhbmQgYSBCIENoYW5uZWwKKyAqIHRoYXQgYXJlIG91dCBvZiBwaGFzZSB3aXRoIGVhY2ggb3RoZXIgdG8gYWxsb3cgdGhlIEZQR0EgdG8gZG8gZGlyZWN0aW9uIHNlbnNpbmcuCisgKgorICogQWxsIGVuY29kZXJzIHdpbGwgaW1tZWRpYXRlbHkgc3RhcnQgY291bnRpbmcgLSBSZXNldCgpIHRoZW0gaWYgeW91IG5lZWQgdGhlbQorICogdG8gYmUgemVyb2VkIGJlZm9yZSB1c2UuCisgKi8KK2NsYXNzIEVuY29kZXIgOiBwdWJsaWMgU2Vuc29yQmFzZSwgcHVibGljIENvdW50ZXJCYXNlLCBwdWJsaWMgUElEU291cmNlCit7CitwdWJsaWM6CisKKwlFbmNvZGVyKHVpbnQzMl90IGFDaGFubmVsLCB1aW50MzJfdCBiQ2hhbm5lbCwgYm9vbCByZXZlcnNlRGlyZWN0aW9uID0gZmFsc2UsCisJCQlFbmNvZGluZ1R5cGUgZW5jb2RpbmdUeXBlID0gazRYKTsKKwlFbmNvZGVyKERpZ2l0YWxTb3VyY2UgKmFTb3VyY2UsIERpZ2l0YWxTb3VyY2UgKmJTb3VyY2UsIGJvb2wgcmV2ZXJzZURpcmVjdGlvbiA9IGZhbHNlLAorCQkJRW5jb2RpbmdUeXBlIGVuY29kaW5nVHlwZSA9IGs0WCk7CisJRW5jb2RlcihEaWdpdGFsU291cmNlICZhU291cmNlLCBEaWdpdGFsU291cmNlICZiU291cmNlLCBib29sIHJldmVyc2VEaXJlY3Rpb24gPSBmYWxzZSwKKwkJCUVuY29kaW5nVHlwZSBlbmNvZGluZ1R5cGUgPSBrNFgpOworCXZpcnR1YWwgfkVuY29kZXIoKTsKKworCS8vIENvdW50ZXJCYXNlIGludGVyZmFjZQorCWludDMyX3QgR2V0KCk7CisJaW50MzJfdCBHZXRSYXcoKTsKKwlpbnQzMl90IEdldEVuY29kaW5nU2NhbGUoKTsKKwl2b2lkIFJlc2V0KCk7CisJZG91YmxlIEdldFBlcmlvZCgpOworCXZvaWQgU2V0TWF4UGVyaW9kKGRvdWJsZSBtYXhQZXJpb2QpOworCWJvb2wgR2V0U3RvcHBlZCgpOworCWJvb2wgR2V0RGlyZWN0aW9uKCk7CisJZG91YmxlIEdldERpc3RhbmNlKCk7CisJZG91YmxlIEdldFJhdGUoKTsKKwl2b2lkIFNldE1pblJhdGUoZG91YmxlIG1pblJhdGUpOworCXZvaWQgU2V0RGlzdGFuY2VQZXJQdWxzZShkb3VibGUgZGlzdGFuY2VQZXJQdWxzZSk7CisJdm9pZCBTZXRSZXZlcnNlRGlyZWN0aW9uKGJvb2wgcmV2ZXJzZURpcmVjdGlvbik7CisJdm9pZCBTZXRTYW1wbGVzVG9BdmVyYWdlKGludCBzYW1wbGVzVG9BdmVyYWdlKTsKKwlpbnQgR2V0U2FtcGxlc1RvQXZlcmFnZSgpOworCXZvaWQgU2V0UElEU291cmNlUGFyYW1ldGVyKFBJRFNvdXJjZVBhcmFtZXRlciBwaWRTb3VyY2UpOworCWRvdWJsZSBQSURHZXQoKTsKKworCWludDMyX3QgR2V0RlBHQUluZGV4KCkKKwl7CisJCXJldHVybiBtX2luZGV4OworCX0KKworcHJpdmF0ZToKKwl2b2lkIEluaXRFbmNvZGVyKGJvb2wgX3JldmVyc2VEaXJlY3Rpb24sIEVuY29kaW5nVHlwZSBlbmNvZGluZ1R5cGUpOworCWRvdWJsZSBEZWNvZGluZ1NjYWxlRmFjdG9yKCk7CisKKwlEaWdpdGFsU291cmNlICptX2FTb3VyY2U7CQkvLyB0aGUgQSBwaGFzZSBvZiB0aGUgcXVhZCBlbmNvZGVyCisJRGlnaXRhbFNvdXJjZSAqbV9iU291cmNlOwkJLy8gdGhlIEIgcGhhc2Ugb2YgdGhlIHF1YWQgZW5jb2RlcgorCWJvb2wgbV9hbGxvY2F0ZWRBU291cmNlOwkJLy8gd2FzIHRoZSBBIHNvdXJjZSBhbGxvY2F0ZWQgbG9jYWxseT8KKwlib29sIG1fYWxsb2NhdGVkQlNvdXJjZTsJCS8vIHdhcyB0aGUgQiBzb3VyY2UgYWxsb2NhdGVkIGxvY2FsbHk/CisJdm9pZCogbV9lbmNvZGVyOworCWludDMyX3QgbV9pbmRleDsJCQkJLy8gVGhlIGVuY29kZXIncyBGUEdBIGluZGV4LgorCWRvdWJsZSBtX2Rpc3RhbmNlUGVyUHVsc2U7CQkvLyBkaXN0YW5jZSBvZiB0cmF2ZWwgZm9yIGVhY2ggZW5jb2RlciB0aWNrCisJQ291bnRlciAqbV9jb3VudGVyOwkJCQkvLyBDb3VudGVyIG9iamVjdCBmb3IgMXggYW5kIDJ4IGVuY29kaW5nCisJRW5jb2RpbmdUeXBlIG1fZW5jb2RpbmdUeXBlOwkvLyBFbmNvZGluZyB0eXBlCisJaW50MzJfdCBtX2VuY29kaW5nU2NhbGU7CQkvLyAxeCwgMngsIG9yIDR4LCBwZXIgdGhlIGVuY29kaW5nVHlwZQorCVBJRFNvdXJjZVBhcmFtZXRlciBtX3BpZFNvdXJjZTsJLy8gRW5jb2RlciBwYXJhbWV0ZXIgdGhhdCBzb3VyY2VzIGEgUElEIGNvbnRyb2xsZXIKKworICBmcmllbmQgY2xhc3MgRGlnaXRhbEdsaXRjaEZpbHRlcjsKK307CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9HZWFyVG9vdGguaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0dlYXJUb290aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMGU1MGQKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9HZWFyVG9vdGguaApAQCAtMCwwICsxLDI2IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkNvdW50ZXIuaCIKKworLyoqCisgKiBBbGlhcyBmb3IgY291bnRlciBjbGFzcy4KKyAqIEltcGxlbWVudCB0aGUgZ2VhciB0b290aCBzZW5zb3Igc3VwcGxpZWQgYnkgRklSU1QuIEN1cnJlbnRseSB0aGVyZSBpcyBubyByZXZlcnNlIHNlbnNpbmcgb24KKyAqIHRoZSBnZWFyIHRvb3RoIHNlbnNvciwgYnV0IGluIGZ1dHVyZSB2ZXJzaW9ucyB3ZSBtaWdodCBpbXBsZW1lbnQgdGhlIG5lY2Vzc2FyeSB0aW1pbmcgaW4gdGhlCisgKiBGUEdBIHRvIHNlbnNlIGRpcmVjdGlvbi4KKyAqLworY2xhc3MgR2VhclRvb3RoIDogcHVibGljIENvdW50ZXIKK3sKK3B1YmxpYzoKKwkvLy8gNTUgdVNlYyBmb3IgdGhyZXNob2xkCisJc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga0dlYXJUb290aFRocmVzaG9sZCA9IDU1ZS02OworCUdlYXJUb290aCh1aW50MzJfdCBjaGFubmVsLCBib29sIGRpcmVjdGlvblNlbnNpdGl2ZSA9IGZhbHNlKTsKKwlHZWFyVG9vdGgoRGlnaXRhbFNvdXJjZSAqc291cmNlLCBib29sIGRpcmVjdGlvblNlbnNpdGl2ZSA9IGZhbHNlKTsKKwlHZWFyVG9vdGgoRGlnaXRhbFNvdXJjZSAmc291cmNlLCBib29sIGRpcmVjdGlvblNlbnNpdGl2ZSA9IGZhbHNlKTsKKwl2aXJ0dWFsIH5HZWFyVG9vdGgoKTsKKwl2b2lkIEVuYWJsZURpcmVjdGlvblNlbnNpbmcoYm9vbCBkaXJlY3Rpb25TZW5zaXRpdmUpOworfTsKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0d5cm8uaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0d5cm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDBkOTgzCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvR3lyby5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgorI2luY2x1ZGUgIlBJRFNvdXJjZS5oIgorCitjbGFzcyBBbmFsb2dJbnB1dDsKKworLyoqCisgKiBVc2UgYSByYXRlIGd5cm8gdG8gcmV0dXJuIHRoZSByb2JvdHMgaGVhZGluZyByZWxhdGl2ZSB0byBhIHN0YXJ0aW5nIHBvc2l0aW9uLgorICogVGhlIEd5cm8gY2xhc3MgdHJhY2tzIHRoZSByb2JvdHMgaGVhZGluZyBiYXNlZCBvbiB0aGUgc3RhcnRpbmcgcG9zaXRpb24uIEFzIHRoZSByb2JvdAorICogcm90YXRlcyB0aGUgbmV3IGhlYWRpbmcgaXMgY29tcHV0ZWQgYnkgaW50ZWdyYXRpbmcgdGhlIHJhdGUgb2Ygcm90YXRpb24gcmV0dXJuZWQKKyAqIGJ5IHRoZSBzZW5zb3IuIFdoZW4gdGhlIGNsYXNzIGlzIGluc3RhbnRpYXRlZCwgaXQgZG9lcyBhIHNob3J0IGNhbGlicmF0aW9uIHJvdXRpbmUKKyAqIHdoZXJlIGl0IHNhbXBsZXMgdGhlIGd5cm8gd2hpbGUgYXQgcmVzdCB0byBkZXRlcm1pbmUgdGhlIGRlZmF1bHQgb2Zmc2V0LiBUaGlzIGlzCisgKiBzdWJ0cmFjdGVkIGZyb20gZWFjaCBzYW1wbGUgdG8gZGV0ZXJtaW5lIHRoZSBoZWFkaW5nLiBUaGlzIGd5cm8gY2xhc3MgbXVzdCBiZSB1c2VkCisgKiB3aXRoIGEgY2hhbm5lbCB0aGF0IGlzIGFzc2lnbmVkIG9uZSBvZiB0aGUgQW5hbG9nIGFjY3VtdWxhdG9ycyBmcm9tIHRoZSBGUEdBLiBTZWUKKyAqIEFuYWxvZ0lucHV0IGZvciB0aGUgY3VycmVudCBhY2N1bXVsYXRvciBhc3NpZ25tZW50cy4KKyAqLworY2xhc3MgR3lybyA6IHB1YmxpYyBTZW5zb3JCYXNlLCBwdWJsaWMgUElEU291cmNlCit7CitwdWJsaWM6CisJc3RhdGljIGNvbnN0IHVpbnQzMl90IGtPdmVyc2FtcGxlQml0cyA9IDEwOworCXN0YXRpYyBjb25zdCB1aW50MzJfdCBrQXZlcmFnZUJpdHMgPSAwOworCXN0YXRpYyBjb25zdGV4cHIgZmxvYXQga1NhbXBsZXNQZXJTZWNvbmQgPSA1MC4wOworCXN0YXRpYyBjb25zdGV4cHIgZmxvYXQga0NhbGlicmF0aW9uU2FtcGxlVGltZSA9IDUuMDsKKwlzdGF0aWMgY29uc3RleHByIGZsb2F0IGtEZWZhdWx0Vm9sdHNQZXJEZWdyZWVQZXJTZWNvbmQgPSAwLjAwNzsKKworCWV4cGxpY2l0IEd5cm8oaW50MzJfdCBjaGFubmVsKTsKKwlleHBsaWNpdCBHeXJvKEFuYWxvZ0lucHV0ICpjaGFubmVsKTsKKwlleHBsaWNpdCBHeXJvKEFuYWxvZ0lucHV0ICZjaGFubmVsKTsKKwl2aXJ0dWFsIH5HeXJvKCk7CisJdmlydHVhbCBmbG9hdCBHZXRBbmdsZSgpOworCXZpcnR1YWwgZG91YmxlIEdldFJhdGUoKTsKKwl2b2lkIFNldFNlbnNpdGl2aXR5KGZsb2F0IHZvbHRzUGVyRGVncmVlUGVyU2Vjb25kKTsKKwl2b2lkIFNldERlYWRiYW5kKGZsb2F0IHZvbHRzKTsKKwl2b2lkIFNldFBJRFNvdXJjZVBhcmFtZXRlcihQSURTb3VyY2VQYXJhbWV0ZXIgcGlkU291cmNlKTsKKwl2aXJ0dWFsIHZvaWQgUmVzZXQoKTsKKwl2b2lkIEluaXRHeXJvKCk7CisKKwkvLyBQSURTb3VyY2UgaW50ZXJmYWNlCisJZG91YmxlIFBJREdldCgpOworCitwcm90ZWN0ZWQ6CisJQW5hbG9nSW5wdXQgKm1fYW5hbG9nOworCitwcml2YXRlOgorCWZsb2F0IG1fdm9sdHNQZXJEZWdyZWVQZXJTZWNvbmQ7CisJZmxvYXQgbV9vZmZzZXQ7CisJYm9vbCBtX2NoYW5uZWxBbGxvY2F0ZWQ7CisJdWludDMyX3QgbV9jZW50ZXI7CisJUElEU291cmNlUGFyYW1ldGVyIG1fcGlkU291cmNlOworfTsKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0kyQy5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvSTJDLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkwZTRjNgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0kyQy5oCkBAIC0wLDAgKzEsMzggQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgorCisvKioKKyAqIEkyQyBidXMgaW50ZXJmYWNlIGNsYXNzLgorICoKKyAqIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBzZW5zb3IgKGFuZCBvdGhlciBJMkMgZGV2aWNlKSBkcml2ZXJzLgorICogSXQgcHJvYmFibHkgc2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5LgorICoKKyAqLworY2xhc3MgSTJDIDogU2Vuc29yQmFzZQoreworcHVibGljOgorCWVudW0gUG9ydCB7a09uYm9hcmQsIGtNWFB9OworCisJSTJDKFBvcnQgcG9ydCwgdWludDhfdCBkZXZpY2VBZGRyZXNzKTsKKwl2aXJ0dWFsIH5JMkMoKTsKKworCWJvb2wgVHJhbnNhY3Rpb24odWludDhfdCAqZGF0YVRvU2VuZCwgdWludDhfdCBzZW5kU2l6ZSwgdWludDhfdCAqZGF0YVJlY2VpdmVkLAorCQkJdWludDhfdCByZWNlaXZlU2l6ZSk7CisJYm9vbCBBZGRyZXNzT25seSgpOworCWJvb2wgV3JpdGUodWludDhfdCByZWdpc3RlckFkZHJlc3MsIHVpbnQ4X3QgZGF0YSk7CisJYm9vbCBXcml0ZUJ1bGsodWludDhfdCogZGF0YSwgdWludDhfdCBjb3VudCk7CisJYm9vbCBSZWFkKHVpbnQ4X3QgcmVnaXN0ZXJBZGRyZXNzLCB1aW50OF90IGNvdW50LCB1aW50OF90ICpkYXRhKTsKKwlib29sIFJlYWRPbmx5KHVpbnQ4X3QgY291bnQsIHVpbnQ4X3QgKmJ1ZmZlcik7CisJdm9pZCBCcm9hZGNhc3QodWludDhfdCByZWdpc3RlckFkZHJlc3MsIHVpbnQ4X3QgZGF0YSk7CisJYm9vbCBWZXJpZnlTZW5zb3IodWludDhfdCByZWdpc3RlckFkZHJlc3MsIHVpbnQ4X3QgY291bnQsIGNvbnN0IHVpbnQ4X3QgKmV4cGVjdGVkKTsKK3ByaXZhdGU6CisKKwlQb3J0IG1fcG9ydDsKKwl1aW50OF90IG1fZGV2aWNlQWRkcmVzczsKK307CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9JbnRlcm5hbC9IYXJkd2FyZUhMUmVwb3J0aW5nLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9JbnRlcm5hbC9IYXJkd2FyZUhMUmVwb3J0aW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE3ZWJjOAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0ludGVybmFsL0hhcmR3YXJlSExSZXBvcnRpbmcuaApAQCAtMCwwICsxLDkgQEAKKworI2luY2x1ZGUgIkhMVXNhZ2VSZXBvcnRpbmcuaCIKKworY2xhc3MgSGFyZHdhcmVITFJlcG9ydGluZyA6IHB1YmxpYyBITFVzYWdlUmVwb3J0aW5nSW50ZXJmYWNlCit7CitwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFJlcG9ydFNjaGVkdWxlcigpOworICAgIHZpcnR1YWwgdm9pZCBSZXBvcnRTbWFydERhc2hib2FyZCgpOworfTsKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0ludGVycnVwdGFibGVTZW5zb3JCYXNlLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9JbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMGRiNGYKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9JbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZS5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiSEFML0hBTC5ocHAiCisjaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgorI2luY2x1ZGUgIlJlc291cmNlLmgiCisKK2NsYXNzIEludGVycnVwdGFibGVTZW5zb3JCYXNlIDogcHVibGljIFNlbnNvckJhc2UKK3sKK3B1YmxpYzoKKwllbnVtIFdhaXRSZXN1bHQgeworCQlrVGltZW91dCA9IDB4MCwKKwkJa1Jpc2luZ0VkZ2UgPSAweDEsCisJCWtGYWxsaW5nRWRnZSA9IDB4MTAwLAorCQlrQm90aCA9IDB4MTAxLAorCX07CisKKwlJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZSgpOworCXZpcnR1YWwgfkludGVycnVwdGFibGVTZW5zb3JCYXNlKCk7CisJdmlydHVhbCB1aW50MzJfdCBHZXRDaGFubmVsRm9yUm91dGluZygpID0gMDsKKwl2aXJ0dWFsIHVpbnQzMl90IEdldE1vZHVsZUZvclJvdXRpbmcoKSA9IDA7CisJdmlydHVhbCBib29sIEdldEFuYWxvZ1RyaWdnZXJGb3JSb3V0aW5nKCkgPSAwOworCXZpcnR1YWwgdm9pZCBSZXF1ZXN0SW50ZXJydXB0cyhJbnRlcnJ1cHRIYW5kbGVyRnVuY3Rpb24gaGFuZGxlciwgdm9pZCAqcGFyYW0pOyAvLy88IEFzeW5jaHJvbnVzIGhhbmRsZXIgdmVyc2lvbi4KKwl2aXJ0dWFsIHZvaWQgUmVxdWVzdEludGVycnVwdHMoKTsJCS8vLzwgU3luY2hyb251cyBXYWl0IHZlcnNpb24uCisJdmlydHVhbCB2b2lkIENhbmNlbEludGVycnVwdHMoKTsJCQkvLy88IEZyZWUgdXAgdGhlIHVuZGVybHlpbmcgY2hpcG9iamVjdCBmdW5jdGlvbnMuCisJdmlydHVhbCBXYWl0UmVzdWx0IFdhaXRGb3JJbnRlcnJ1cHQoZmxvYXQgdGltZW91dCwgYm9vbCBpZ25vcmVQcmV2aW91cyA9IHRydWUpOyAvLy88IFN5bmNocm9udXMgdmVyc2lvbi4KKwl2aXJ0dWFsIHZvaWQgRW5hYmxlSW50ZXJydXB0cygpOwkJCS8vLzwgRW5hYmxlIGludGVycnVwdHMgLSBhZnRlciBmaW5pc2hpbmcgc2V0dXAuCisJdmlydHVhbCB2b2lkIERpc2FibGVJbnRlcnJ1cHRzKCk7CQkvLy88IERpc2FibGUsIGJ1dCBkb24ndCBkZWFsbG9jYXRlLgorCXZpcnR1YWwgZG91YmxlIFJlYWRSaXNpbmdUaW1lc3RhbXAoKTsvLy88IFJldHVybiB0aGUgdGltZXN0YW1wIGZvciB0aGUgcmlzaW5nIGludGVycnVwdCB0aGF0IG9jY3VycmVkLgorCXZpcnR1YWwgZG91YmxlIFJlYWRGYWxsaW5nVGltZXN0YW1wKCk7Ly8vPCBSZXR1cm4gdGhlIHRpbWVzdGFtcCBmb3IgdGhlIGZhbGxpbmcgaW50ZXJydXB0IHRoYXQgb2NjdXJyZWQuCisJdmlydHVhbCB2b2lkIFNldFVwU291cmNlRWRnZShib29sIHJpc2luZ0VkZ2UsIGJvb2wgZmFsbGluZ0VkZ2UpOworcHJvdGVjdGVkOgorCXZvaWQqIG1faW50ZXJydXB0OworCXVpbnQzMl90IG1faW50ZXJydXB0SW5kZXg7CisJdm9pZCBBbGxvY2F0ZUludGVycnVwdHMoYm9vbCB3YXRjaGVyKTsKKworCXN0YXRpYyBSZXNvdXJjZSAqbV9pbnRlcnJ1cHRzOworfTsKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0l0ZXJhdGl2ZVJvYm90LmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9JdGVyYXRpdmVSb2JvdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YTFjYzAKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9JdGVyYXRpdmVSb2JvdC5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiVGltZXIuaCIKKyNpbmNsdWRlICJSb2JvdEJhc2UuaCIKKworLyoqCisgKiBJdGVyYXRpdmVSb2JvdCBpbXBsZW1lbnRzIGEgc3BlY2lmaWMgdHlwZSBvZiBSb2JvdCBQcm9ncmFtIGZyYW1ld29yaywgZXh0ZW5kaW5nIHRoZSBSb2JvdEJhc2UgY2xhc3MuCisgKiAKKyAqIFRoZSBJdGVyYXRpdmVSb2JvdCBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIGJ5IGEgdXNlciBjcmVhdGluZyBhIHJvYm90IHByb2dyYW0uCisgKiAKKyAqIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgdG8gaW1wbGVtZW50IHRoZSAib2xkIHN0eWxlIiBkZWZhdWx0IGNvZGUsIGJ5IHByb3ZpZGluZworICogdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgd2hpY2ggYXJlIGNhbGxlZCBieSB0aGUgbWFpbiBsb29wLCBTdGFydENvbXBldGl0aW9uKCksIGF0IHRoZSBhcHByb3ByaWF0ZSB0aW1lczoKKyAqIAorICogUm9ib3RJbml0KCkgLS0gcHJvdmlkZSBmb3IgaW5pdGlhbGl6YXRpb24gYXQgcm9ib3QgcG93ZXItb24KKyAqIAorICogSW5pdCgpIGZ1bmN0aW9ucyAtLSBlYWNoIG9mIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGlzIGNhbGxlZCBvbmNlIHdoZW4gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgIGFwcHJvcHJpYXRlIG1vZGUgaXMgZW50ZXJlZDoKKyAqICAtIERpc2FibGVkSW5pdCgpICAgLS0gY2FsbGVkIG9ubHkgd2hlbiBmaXJzdCBkaXNhYmxlZAorICogIC0gQXV0b25vbW91c0luaXQoKSAtLSBjYWxsZWQgZWFjaCBhbmQgZXZlcnkgdGltZSBhdXRvbm9tb3VzIGlzIGVudGVyZWQgZnJvbSBhbm90aGVyIG1vZGUKKyAqICAtIFRlbGVvcEluaXQoKSAgICAgLS0gY2FsbGVkIGVhY2ggYW5kIGV2ZXJ5IHRpbWUgdGVsZW9wIGlzIGVudGVyZWQgZnJvbSBhbm90aGVyIG1vZGUKKyAqICAtIFRlc3RJbml0KCkgICAgICAgLS0gY2FsbGVkIGVhY2ggYW5kIGV2ZXJ5IHRpbWUgdGVzdCBpcyBlbnRlcmVkIGZyb20gYW5vdGhlciBtb2RlCisgKiAKKyAqIFBlcmlvZGljKCkgZnVuY3Rpb25zIC0tIGVhY2ggb2YgdGhlc2UgZnVuY3Rpb25zIGlzIGNhbGxlZCBpdGVyYXRpdmVseSBhdCB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGFwcHJvcHJpYXRlIHBlcmlvZGljIHJhdGUgKGFrYSB0aGUgInNsb3cgbG9vcCIpLiAgVGhlIGRlZmF1bHQgcGVyaW9kIG9mCisgKiAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaXRlcmF0aXZlIHJvYm90IGlzIHN5bmNlZCB0byB0aGUgZHJpdmVyIHN0YXRpb24gY29udHJvbCBwYWNrZXRzLAorICogICAgICAgICAgICAgICAgICAgICAgICAgZ2l2aW5nIGEgcGVyaW9kaWMgZnJlcXVlbmN5IG9mIGFib3V0IDUwSHogKDUwIHRpbWVzIHBlciBzZWNvbmQpLgorICogICAtIERpc2FibGVkUGVyaW9kaWMoKQorICogICAtIEF1dG9ub21vdXNQZXJpb2RpYygpCisgKiAgIC0gVGVsZW9wUGVyaW9kaWMoKQorICogICAtIFRlc3RQZXJpb2RpYygpCisgKiAKKyAqLworCitjbGFzcyBJdGVyYXRpdmVSb2JvdCA6IHB1YmxpYyBSb2JvdEJhc2UKK3sKK3B1YmxpYzoKKwkvKgorCSAqIFRoZSBkZWZhdWx0IHBlcmlvZCBmb3IgdGhlIHBlcmlvZGljIGZ1bmN0aW9uIGNhbGxzIChzZWNvbmRzKQorCSAqIFNldHRpbmcgdGhlIHBlcmlvZCB0byAwLjAgd2lsbCBjYXVzZSB0aGUgcGVyaW9kaWMgZnVuY3Rpb25zIHRvIGZvbGxvdworCSAqIHRoZSBEcml2ZXIgU3RhdGlvbiBwYWNrZXQgcmF0ZSBvZiBhYm91dCA1MEh6LgorCSAqLworCXN0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtEZWZhdWx0UGVyaW9kID0gMC4wOworCisJdmlydHVhbCB2b2lkIFN0YXJ0Q29tcGV0aXRpb24oKTsKKworCXZpcnR1YWwgdm9pZCBSb2JvdEluaXQoKTsKKwl2aXJ0dWFsIHZvaWQgRGlzYWJsZWRJbml0KCk7CisJdmlydHVhbCB2b2lkIEF1dG9ub21vdXNJbml0KCk7CisJdmlydHVhbCB2b2lkIFRlbGVvcEluaXQoKTsKKwl2aXJ0dWFsIHZvaWQgVGVzdEluaXQoKTsKKworCXZpcnR1YWwgdm9pZCBEaXNhYmxlZFBlcmlvZGljKCk7CisJdmlydHVhbCB2b2lkIEF1dG9ub21vdXNQZXJpb2RpYygpOworCXZpcnR1YWwgdm9pZCBUZWxlb3BQZXJpb2RpYygpOworCXZpcnR1YWwgdm9pZCBUZXN0UGVyaW9kaWMoKTsKKworcHJvdGVjdGVkOgorCXZpcnR1YWwgdm9pZCBQcmVzdGFydCgpOworCisJdmlydHVhbCB+SXRlcmF0aXZlUm9ib3QoKTsKKwlJdGVyYXRpdmVSb2JvdCgpOworCitwcml2YXRlOgorCWJvb2wgbV9kaXNhYmxlZEluaXRpYWxpemVkOworCWJvb2wgbV9hdXRvbm9tb3VzSW5pdGlhbGl6ZWQ7CisJYm9vbCBtX3RlbGVvcEluaXRpYWxpemVkOworCWJvb2wgbV90ZXN0SW5pdGlhbGl6ZWQ7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvSmFndWFyLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9KYWd1YXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2I3YjY5Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvSmFndWFyLmgKQEAgLTAsMCArMSwyOCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJTYWZlUFdNLmgiCisjaW5jbHVkZSAiU3BlZWRDb250cm9sbGVyLmgiCisjaW5jbHVkZSAiUElET3V0cHV0LmgiCisKKy8qKgorICogTHVtaW5hcnkgTWljcm8gLyBWZXggUm9ib3RpY3MgSmFndWFyIFNwZWVkIENvbnRyb2xsZXIgd2l0aCBQV00gY29udHJvbAorICovCitjbGFzcyBKYWd1YXIgOiBwdWJsaWMgU2FmZVBXTSwgcHVibGljIFNwZWVkQ29udHJvbGxlcgoreworcHVibGljOgorCWV4cGxpY2l0IEphZ3Vhcih1aW50MzJfdCBjaGFubmVsKTsKKwl2aXJ0dWFsIH5KYWd1YXIoKTsKKwl2aXJ0dWFsIHZvaWQgU2V0KGZsb2F0IHZhbHVlLCB1aW50OF90IHN5bmNHcm91cCA9IDApOworCXZpcnR1YWwgZmxvYXQgR2V0KCk7CisJdmlydHVhbCB2b2lkIERpc2FibGUoKTsKKworCXZpcnR1YWwgdm9pZCBQSURXcml0ZShmbG9hdCBvdXRwdXQpOworCitwcml2YXRlOgorCXZvaWQgSW5pdEphZ3VhcigpOworfTsKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0pveXN0aWNrLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9Kb3lzdGljay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZTA2ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9Kb3lzdGljay5oCkBAIC0wLDAgKzEsOTMgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBKT1lTVElDS19IXworI2RlZmluZSBKT1lTVElDS19IXworCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlICJHZW5lcmljSElELmgiCisjaW5jbHVkZSAiRXJyb3JCYXNlLmgiCisKK2NsYXNzIERyaXZlclN0YXRpb247CisKKy8qKgorICogSGFuZGxlIGlucHV0IGZyb20gc3RhbmRhcmQgSm95c3RpY2tzIGNvbm5lY3RlZCB0byB0aGUgRHJpdmVyIFN0YXRpb24uCisgKiBUaGlzIGNsYXNzIGhhbmRsZXMgc3RhbmRhcmQgaW5wdXQgdGhhdCBjb21lcyBmcm9tIHRoZSBEcml2ZXIgU3RhdGlvbi4gRWFjaCB0aW1lIGEgdmFsdWUgaXMgcmVxdWVzdGVkCisgKiB0aGUgbW9zdCByZWNlbnQgdmFsdWUgaXMgcmV0dXJuZWQuIFRoZXJlIGlzIGEgc2luZ2xlIGNsYXNzIGluc3RhbmNlIGZvciBlYWNoIGpveXN0aWNrIGFuZCB0aGUgbWFwcGluZworICogb2YgcG9ydHMgdG8gaGFyZHdhcmUgYnV0dG9ucyBkZXBlbmRzIG9uIHRoZSBjb2RlIGluIHRoZSBkcml2ZXIgc3RhdGlvbi4KKyAqLworY2xhc3MgSm95c3RpY2sgOiBwdWJsaWMgR2VuZXJpY0hJRCwgcHVibGljIEVycm9yQmFzZQoreworcHVibGljOgorCXN0YXRpYyBjb25zdCB1aW50MzJfdCBrRGVmYXVsdFhBeGlzID0gMDsKKwlzdGF0aWMgY29uc3QgdWludDMyX3Qga0RlZmF1bHRZQXhpcyA9IDE7CisJc3RhdGljIGNvbnN0IHVpbnQzMl90IGtEZWZhdWx0WkF4aXMgPSAyOworCXN0YXRpYyBjb25zdCB1aW50MzJfdCBrRGVmYXVsdFR3aXN0QXhpcyA9IDI7CisJc3RhdGljIGNvbnN0IHVpbnQzMl90IGtEZWZhdWx0VGhyb3R0bGVBeGlzID0gMzsKKwl0eXBlZGVmIGVudW0KKwl7CisJCWtYQXhpcywga1lBeGlzLCBrWkF4aXMsIGtUd2lzdEF4aXMsIGtUaHJvdHRsZUF4aXMsIGtOdW1BeGlzVHlwZXMKKwl9IEF4aXNUeXBlOworCXN0YXRpYyBjb25zdCB1aW50MzJfdCBrRGVmYXVsdFRyaWdnZXJCdXR0b24gPSAxOworCXN0YXRpYyBjb25zdCB1aW50MzJfdCBrRGVmYXVsdFRvcEJ1dHRvbiA9IDI7CisJdHlwZWRlZiBlbnVtCisJeworCQlrVHJpZ2dlckJ1dHRvbiwga1RvcEJ1dHRvbiwga051bUJ1dHRvblR5cGVzCisJfSBCdXR0b25UeXBlOworCXR5cGVkZWYgZW51bQorCXsKKwkJa0xlZnRSdW1ibGUsIGtSaWdodFJ1bWJsZQorCX0gUnVtYmxlVHlwZTsKKworCWV4cGxpY2l0IEpveXN0aWNrKHVpbnQzMl90IHBvcnQpOworCUpveXN0aWNrKHVpbnQzMl90IHBvcnQsIHVpbnQzMl90IG51bUF4aXNUeXBlcywgdWludDMyX3QgbnVtQnV0dG9uVHlwZXMpOworCXZpcnR1YWwgfkpveXN0aWNrKCk7CisKKwl1aW50MzJfdCBHZXRBeGlzQ2hhbm5lbChBeGlzVHlwZSBheGlzKTsKKwl2b2lkIFNldEF4aXNDaGFubmVsKEF4aXNUeXBlIGF4aXMsIHVpbnQzMl90IGNoYW5uZWwpOworCisJdmlydHVhbCBmbG9hdCBHZXRYKEpveXN0aWNrSGFuZCBoYW5kID0ga1JpZ2h0SGFuZCk7CisJdmlydHVhbCBmbG9hdCBHZXRZKEpveXN0aWNrSGFuZCBoYW5kID0ga1JpZ2h0SGFuZCk7CisJdmlydHVhbCBmbG9hdCBHZXRaKCk7CisJdmlydHVhbCBmbG9hdCBHZXRUd2lzdCgpOworCXZpcnR1YWwgZmxvYXQgR2V0VGhyb3R0bGUoKTsKKwl2aXJ0dWFsIGZsb2F0IEdldEF4aXMoQXhpc1R5cGUgYXhpcyk7CisJZmxvYXQgR2V0UmF3QXhpcyh1aW50MzJfdCBheGlzKTsKKworCXZpcnR1YWwgYm9vbCBHZXRUcmlnZ2VyKEpveXN0aWNrSGFuZCBoYW5kID0ga1JpZ2h0SGFuZCk7CisJdmlydHVhbCBib29sIEdldFRvcChKb3lzdGlja0hhbmQgaGFuZCA9IGtSaWdodEhhbmQpOworCXZpcnR1YWwgYm9vbCBHZXRCdW1wZXIoSm95c3RpY2tIYW5kIGhhbmQgPSBrUmlnaHRIYW5kKTsKKwl2aXJ0dWFsIGJvb2wgR2V0UmF3QnV0dG9uKHVpbnQzMl90IGJ1dHRvbik7CisJdmlydHVhbCBpbnQgR2V0UE9WKHVpbnQzMl90IHBvdiA9IDApOworCWJvb2wgR2V0QnV0dG9uKEJ1dHRvblR5cGUgYnV0dG9uKTsKKwlzdGF0aWMgSm95c3RpY2sqIEdldFN0aWNrRm9yUG9ydCh1aW50MzJfdCBwb3J0KTsKKworCXZpcnR1YWwgZmxvYXQgR2V0TWFnbml0dWRlKCk7CisJdmlydHVhbCBmbG9hdCBHZXREaXJlY3Rpb25SYWRpYW5zKCk7CisJdmlydHVhbCBmbG9hdCBHZXREaXJlY3Rpb25EZWdyZWVzKCk7CisKKwlpbnQgR2V0QXhpc0NvdW50KCk7CisJaW50IEdldEJ1dHRvbkNvdW50KCk7CisJaW50IEdldFBPVkNvdW50KCk7CisJCisJdm9pZCBTZXRSdW1ibGUoUnVtYmxlVHlwZSB0eXBlLCBmbG9hdCB2YWx1ZSk7CisJdm9pZCBTZXRPdXRwdXQodWludDhfdCBvdXRwdXROdW1iZXIsIGJvb2wgdmFsdWUpOworCXZvaWQgU2V0T3V0cHV0cyh1aW50MzJfdCB2YWx1ZSk7CisKK3ByaXZhdGU6CisJRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEpveXN0aWNrKTsKKwl2b2lkIEluaXRKb3lzdGljayh1aW50MzJfdCBudW1BeGlzVHlwZXMsIHVpbnQzMl90IG51bUJ1dHRvblR5cGVzKTsKKworCURyaXZlclN0YXRpb24gKm1fZHM7CisJdWludDMyX3QgbV9wb3J0OworCXVpbnQzMl90ICptX2F4ZXM7CisJdWludDMyX3QgKm1fYnV0dG9uczsKKwl1aW50MzJfdCBtX291dHB1dHM7CisJdWludDE2X3QgbV9sZWZ0UnVtYmxlOworCXVpbnQxNl90IG1fcmlnaHRSdW1ibGU7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL01vdG9yU2FmZXR5LmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9Nb3RvclNhZmV0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhN2RmYzQKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9Nb3RvclNhZmV0eS5oCkBAIC0wLDAgKzEsMjAgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjZGVmaW5lIERFRkFVTFRfU0FGRVRZX0VYUElSQVRJT04gMC4xCisKK2NsYXNzIE1vdG9yU2FmZXR5Cit7CitwdWJsaWM6CisJdmlydHVhbCB2b2lkIFNldEV4cGlyYXRpb24oZmxvYXQgdGltZW91dCkgPSAwOworCXZpcnR1YWwgZmxvYXQgR2V0RXhwaXJhdGlvbigpID0gMDsKKwl2aXJ0dWFsIGJvb2wgSXNBbGl2ZSgpID0gMDsKKwl2aXJ0dWFsIHZvaWQgU3RvcE1vdG9yKCkgPSAwOworCXZpcnR1YWwgdm9pZCBTZXRTYWZldHlFbmFibGVkKGJvb2wgZW5hYmxlZCkgPSAwOworCXZpcnR1YWwgYm9vbCBJc1NhZmV0eUVuYWJsZWQoKSA9IDA7CisJdmlydHVhbCB2b2lkIEdldERlc2NyaXB0aW9uKGNoYXIgKmRlc2MpID0gMDsKK307CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9Nb3RvclNhZmV0eUhlbHBlci5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvTW90b3JTYWZldHlIZWxwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDM0MjYzCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvTW90b3JTYWZldHlIZWxwZXIuaApAQCAtMCwwICsxLDM1IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkVycm9yQmFzZS5oIgorI2luY2x1ZGUgIkhBTC9jcHAvU3luY2hyb25pemVkLmhwcCIKKworY2xhc3MgTW90b3JTYWZldHk7CisKK2NsYXNzIE1vdG9yU2FmZXR5SGVscGVyIDogcHVibGljIEVycm9yQmFzZQoreworcHVibGljOgorCU1vdG9yU2FmZXR5SGVscGVyKE1vdG9yU2FmZXR5ICpzYWZlT2JqZWN0KTsKKwl+TW90b3JTYWZldHlIZWxwZXIoKTsKKwl2b2lkIEZlZWQoKTsKKwl2b2lkIFNldEV4cGlyYXRpb24oZmxvYXQgZXhwaXJhdGlvblRpbWUpOworCWZsb2F0IEdldEV4cGlyYXRpb24oKTsKKwlib29sIElzQWxpdmUoKTsKKwl2b2lkIENoZWNrKCk7CisJdm9pZCBTZXRTYWZldHlFbmFibGVkKGJvb2wgZW5hYmxlZCk7CisJYm9vbCBJc1NhZmV0eUVuYWJsZWQoKTsKKwlzdGF0aWMgdm9pZCBDaGVja01vdG9ycygpOworcHJpdmF0ZToKKwlkb3VibGUgbV9leHBpcmF0aW9uOwkJCS8vIHRoZSBleHBpcmF0aW9uIHRpbWUgZm9yIHRoaXMgb2JqZWN0CisJYm9vbCBtX2VuYWJsZWQ7CQkJCQkvLyB0cnVlIGlmIG1vdG9yIHNhZmV0eSBpcyBlbmFibGVkIGZvciB0aGlzIG1vdG9yCisJZG91YmxlIG1fc3RvcFRpbWU7IAkJCQkvLyB0aGUgRlBHQSBjbG9jayB2YWx1ZSB3aGVuIHRoaXMgbW90b3IgaGFzIGV4cGlyZWQKKwlSZWVudHJhbnRNdXRleCBtX3N5bmNNdXRleDsJCQkvLyBwcm90ZWN0IGFjY2Vzc2VzIHRvIHRoZSBzdGF0ZSBmb3IgdGhpcyBvYmplY3QKKwlNb3RvclNhZmV0eSAqbV9zYWZlT2JqZWN0OwkJLy8gdGhlIG9iamVjdCB0aGF0IGlzIHVzaW5nIHRoZSBoZWxwZXIKKwlNb3RvclNhZmV0eUhlbHBlciAqbV9uZXh0SGVscGVyOyAvLyBuZXh0IG9iamVjdCBpbiB0aGUgbGlzdCBvZiBNb3RvclNhZmV0eUhlbHBlcnMKKwlzdGF0aWMgTW90b3JTYWZldHlIZWxwZXIgKm1faGVhZEhlbHBlcjsgLy8gdGhlIGhlYWQgb2YgdGhlIGxpc3Qgb2YgTW90b3JTYWZldHlIZWxwZXIgb2JqZWN0cworCXN0YXRpYyBSZWVudHJhbnRNdXRleCBtX2xpc3RNdXRleDsJLy8gcHJvdGVjdCBhY2Nlc3NlcyB0byB0aGUgbGlzdCBvZiBoZWxwZXJzCit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvTklJTUFRZHguaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL05JSU1BUWR4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk0MDA2MwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL05JSU1BUWR4LmgKQEAgLTAsMCArMSw2NDYgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorLy8NCisvLyAgVGl0bGUJICA6IE5JSU1BUWR4LmgNCisvLyAgQ3JlYXRlZAkgIDogMTQwMzY4NTgzNCBzZWNvbmRzIGFmdGVyIDEvMS8xOTcwIDEyOjAwOjAwIFVUQyANCisvLyAgQ29weXJpZ2h0IDogqSBDb3B5cmlnaHQgMjAwNiwgTmF0aW9uYWwgSW5zdHJ1bWVudHMgQ29ycG9yYXRpb24sIEFsbCByaWdodHMgcmVzZXJ2ZWQNCisvLyAJUHVycG9zZQkgIDogSW5jbHVkZSBmaWxlIGZvciBOSS1JTUFRZHggbGlicmFyeSBzdXBwb3J0Lg0KKy8vDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisjaWZuZGVmIF9fX25paW1hcWR4X2hfX18NCisjZGVmaW5lIF9fX25paW1hcWR4X2hfX18NCisNCisNCisjaWZkZWYgX19jcGx1c3BsdXMNCitleHRlcm4gIkMiIHsNCisjZW5kaWYNCisNCisNCisjaWYgIWRlZmluZWQobmlpbWFxZHhfdHlwZXMpDQorI2RlZmluZSBuaWltYXFkeF90eXBlcw0KKw0KKyNpZmRlZiBfQ1ZJXw0KKyAgICAjcHJhZ21hICBFbmFibGVMaWJyYXJ5UnVudGltZUNoZWNraW5nDQorI2VuZGlmDQorDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisvLyAgVHlwZWRlZnMNCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKyNpZm5kZWYgX05JX3VJbnQ4X0RFRklORURfDQorICAgICNkZWZpbmUgX05JX3VJbnQ4X0RFRklORURfDQorICAgIHR5cGVkZWYgdW5zaWduZWQgY2hhciAgICAgICB1SW50ODsNCisjZW5kaWYNCisNCisjaWZuZGVmIF9OSV91SW50MTZfREVGSU5FRF8NCisgICAgI2RlZmluZSBfTklfdUludDE2X0RFRklORURfDQorICAgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50ICB1SW50MTY7DQorI2VuZGlmDQorDQorI2lmbmRlZiBfTklfdUludDMyX0RFRklORURfDQorICAgICNkZWZpbmUgX05JX3VJbnQzMl9ERUZJTkVEXw0KKyAgICAjaWYgZGVmaW5lZChfTVNDX1ZFUikNCisgICAgICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyAgICAgICB1SW50MzI7DQorICAgICNlbGlmIF9fR05VQ19fDQorICAgICAgICAjaWYgX194ODZfNjRfXw0KKyAgICAgICAgICAgIHR5cGVkZWYgdW5zaWduZWQgaW50ICAgIHVJbnQzMjsNCisgICAgICAgICNlbHNlDQorICAgICAgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgdUludDMyOw0KKyAgICAgICAgI2VuZGlmDQorICAgICNlbmRpZg0KKyNlbmRpZg0KKw0KKyNpZm5kZWYgX05JX3VJbnQ2NF9ERUZJTkVEXw0KKyAgICAjZGVmaW5lIF9OSV91SW50NjRfREVGSU5FRF8NCisgICAgI2lmIGRlZmluZWQoX01TQ19WRVIpIHx8IF9DVklfID49IDcwMA0KKyAgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0ICAgIHVJbnQ2NDsNCisgICAgI2VsaWYgX19HTlVDX18NCisgICAgICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nICB1SW50NjQ7DQorICAgICNlbmRpZg0KKyNlbmRpZg0KKw0KKyNpZm5kZWYgX05JX0ludDhfREVGSU5FRF8NCisgICAgI2RlZmluZSBfTklfSW50OF9ERUZJTkVEXw0KKyAgICB0eXBlZGVmIGNoYXIgICAgICAgICAgICAgICAgSW50ODsNCisjZW5kaWYNCisNCisjaWZuZGVmIF9OSV9JbnQxNl9ERUZJTkVEXw0KKyAgICAjZGVmaW5lIF9OSV9JbnQxNl9ERUZJTkVEXw0KKyAgICB0eXBlZGVmIHNob3J0IGludCAgICAgICAgICAgSW50MTY7DQorI2VuZGlmDQorDQorI2lmbmRlZiBfTklfSW50MzJfREVGSU5FRF8NCisgICAgI2RlZmluZSBfTklfSW50MzJfREVGSU5FRF8NCisgICAgI2lmIGRlZmluZWQoX01TQ19WRVIpDQorICAgICAgICB0eXBlZGVmIGxvbmcgICAgICAgICAgICBJbnQzMjsNCisgICAgI2VsaWYgX19HTlVDX18NCisgICAgICAgICNpZiBfX3g4Nl82NF9fDQorICAgICAgICAgICAgdHlwZWRlZiBpbnQgICAgICAgICBJbnQzMjsNCisgICAgICAgICNlbHNlDQorICAgICAgICAgICAgdHlwZWRlZiBsb25nICAgICAgICBJbnQzMjsNCisgICAgICAgICNlbmRpZg0KKyAgICAjZW5kaWYNCisjZW5kaWYgIA0KKw0KKyNpZm5kZWYgX05JX0ludDY0X0RFRklORURfDQorICAgICNkZWZpbmUgX05JX0ludDY0X0RFRklORURfDQorICAgICNpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBfQ1ZJXyA+PSA3MDANCisgICAgICAgIHR5cGVkZWYgX19pbnQ2NCAgICAgICAgSW50NjQ7DQorICAgICNlbGlmIF9fR05VQ19fDQorICAgICAgICB0eXBlZGVmIGxvbmcgbG9uZyBpbnQgIEludDY0Ow0KKyAgICAjZW5kaWYNCisjZW5kaWYNCisNCisjaWZuZGVmIF9OSV9mbG9hdDMyX0RFRklORURfDQorICAgICNkZWZpbmUgX05JX2Zsb2F0MzJfREVGSU5FRF8NCisgICAgdHlwZWRlZiBmbG9hdCAgICAgICAgICAgICAgIGZsb2F0MzI7DQorI2VuZGlmDQorDQorI2lmbmRlZiBfTklfZmxvYXQ2NF9ERUZJTkVEXw0KKyAgICAjZGVmaW5lIF9OSV9mbG9hdDY0X0RFRklORURfDQorICAgIHR5cGVkZWYgZG91YmxlICAgICAgICAgICAgICBmbG9hdDY0Ow0KKyNlbmRpZg0KKw0KKyNpZm5kZWYgVFJVRQ0KKyAgICAjZGVmaW5lIFRSVUUgICAgICAgICAgICAgICAgKDFMKQ0KKyNlbmRpZg0KKw0KKyNpZm5kZWYgRkFMU0UNCisgICAgI2RlZmluZSBGQUxTRSAgICAgICAgICAgICAgICgwTCkNCisjZW5kaWYNCisNCisjaWZuZGVmIF9OSV9HVUlESE5ETF9ERUZJTkVEDQorICAgIHR5cGVkZWYgdUludDMyICAgICAgICAgICAgICBHVUlITkRMOw0KKyNlbmRpZg0KKw0KKyNpZiAoZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfQ1ZJXykpDQorICAgICNpZm5kZWYgX05JX0ZVTkNfREVGSU5FRA0KKyAgICAgICAgI2RlZmluZSBOSV9GVU5DICAgICAgICAgX19zdGRjYWxsDQorICAgICNlbmRpZg0KKyAgICANCisgICAgI2lmbmRlZiBfTklfRlVOQ0NfREVGSU5FRA0KKyAgICAgICAgI2RlZmluZSBOSV9GVU5DQyAgICAgICAgX19jZGVjbA0KKyAgICAjZW5kaWYNCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKQ0KKyAgICAjaWZuZGVmIF9OSV9GVU5DX0RFRklORUQNCisgICAgICAgICNkZWZpbmUgTklfRlVOQw0KKyAgICAjZW5kaWYNCisgICAgDQorICAgICNpZm5kZWYgX05JX0ZVTkNDX0RFRklORUQNCisgICAgICAgICNkZWZpbmUgTklfRlVOQ0MNCisgICAgI2VuZGlmDQorI2VuZGlmDQorDQorI2lmbmRlZiBfTklfYm9vbDMyX0RFRklORURfDQorICAgICNkZWZpbmUgX05JX2Jvb2wzMl9ERUZJTkVEXw0KKyAgICB0eXBlZGVmIHVJbnQzMiAgICAgICAgICAgICAgYm9vbDMyOw0KKyNlbmRpZg0KKw0KKyNpZm5kZWYgX05JX0lNQVFkeFNlc3Npb25fREVGSU5FRF8NCisgICAgI2RlZmluZSBfTklfSU1BUWR4U2Vzc2lvbl9ERUZJTkVEXw0KKyAgICB0eXBlZGVmIHVJbnQzMiAgICAgICAgICAgICAgSU1BUWR4U2Vzc2lvbjsNCisjZW5kaWYNCisNCisjZGVmaW5lIElNQVFEWF9NQVhfQVBJX1NUUklOR19MRU5HVEggNTEyDQorDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisvLyAgRm9yd2FyZCBEZWNsYXJlIERhdGEgU3RydWN0dXJlcw0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQordHlwZWRlZiBzdHJ1Y3QgSW1hZ2Vfc3RydWN0IEltYWdlOw0KKw0KKw0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorLy8gIEVycm9yIENvZGVzIEVudW1lcmF0aW9uDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCit0eXBlZGVmIGVudW0gSU1BUWR4RXJyb3JfZW51bSB7DQorICAgIElNQVFkeEVycm9yU3VjY2VzcyA9IDB4MCwgICAgICAgICAgICAgICAgICAgLy8gU3VjY2Vzcw0KKyAgICBJTUFRZHhFcnJvclN5c3RlbU1lbW9yeUZ1bGwgPSAweEJGRjY5MDAwLCAgIC8vIE5vdCBlbm91Z2ggbWVtb3J5DQorICAgIElNQVFkeEVycm9ySW50ZXJuYWwsICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWwgZXJyb3INCisgICAgSU1BUWR4RXJyb3JJbnZhbGlkUGFyYW1ldGVyLCAgICAgICAgICAgICAgICAvLyBJbnZhbGlkIHBhcmFtZXRlcg0KKyAgICBJTUFRZHhFcnJvckludmFsaWRQb2ludGVyLCAgICAgICAgICAgICAgICAgIC8vIEludmFsaWQgcG9pbnRlcg0KKyAgICBJTUFRZHhFcnJvckludmFsaWRJbnRlcmZhY2UsICAgICAgICAgICAgICAgIC8vIEludmFsaWQgY2FtZXJhIHNlc3Npb24NCisgICAgSU1BUWR4RXJyb3JJbnZhbGlkUmVnaXN0cnlLZXksICAgICAgICAgICAgICAvLyBJbnZhbGlkIHJlZ2lzdHJ5IGtleQ0KKyAgICBJTUFRZHhFcnJvckludmFsaWRBZGRyZXNzLCAgICAgICAgICAgICAgICAgIC8vIEludmFsaWQgYWRkcmVzcw0KKyAgICBJTUFRZHhFcnJvckludmFsaWREZXZpY2VUeXBlLCAgICAgICAgICAgICAgIC8vIEludmFsaWQgZGV2aWNlIHR5cGUNCisgICAgSU1BUWR4RXJyb3JOb3RJbXBsZW1lbnRlZCwgICAgICAgICAgICAgICAgICAvLyBOb3QgaW1wbGVtZW50ZWQNCisgICAgSU1BUWR4RXJyb3JDYW1lcmFOb3RGb3VuZCwgICAgICAgICAgICAgICAgICAvLyBDYW1lcmEgbm90IGZvdW5kDQorICAgIElNQVFkeEVycm9yQ2FtZXJhSW5Vc2UsICAgICAgICAgICAgICAgICAgICAgLy8gQ2FtZXJhIGlzIGFscmVhZHkgaW4gdXNlLg0KKyAgICBJTUFRZHhFcnJvckNhbWVyYU5vdEluaXRpYWxpemVkLCAgICAgICAgICAgIC8vIENhbWVyYSBpcyBub3QgaW5pdGlhbGl6ZWQuDQorICAgIElNQVFkeEVycm9yQ2FtZXJhUmVtb3ZlZCwgICAgICAgICAgICAgICAgICAgLy8gQ2FtZXJhIGhhcyBiZWVuIHJlbW92ZWQuDQorICAgIElNQVFkeEVycm9yQ2FtZXJhUnVubmluZywgICAgICAgICAgICAgICAgICAgLy8gQWNxdWlzaXRpb24gaW4gcHJvZ3Jlc3MuDQorICAgIElNQVFkeEVycm9yQ2FtZXJhTm90UnVubmluZywgICAgICAgICAgICAgICAgLy8gTm8gYWNxdWlzaXRpb24gaW4gcHJvZ3Jlc3MuDQorICAgIElNQVFkeEVycm9yQXR0cmlidXRlTm90U3VwcG9ydGVkLCAgICAgICAgICAgLy8gQXR0cmlidXRlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGNhbWVyYS4NCisgICAgSU1BUWR4RXJyb3JBdHRyaWJ1dGVOb3RTZXR0YWJsZSwgICAgICAgICAgICAvLyBVbmFibGUgdG8gc2V0IGF0dHJpYnV0ZS4NCisgICAgSU1BUWR4RXJyb3JBdHRyaWJ1dGVOb3RSZWFkYWJsZSwgICAgICAgICAgICAvLyBVbmFibGUgdG8gZ2V0IGF0dHJpYnV0ZS4NCisgICAgSU1BUWR4RXJyb3JBdHRyaWJ1dGVPdXRPZlJhbmdlLCAgICAgICAgICAgICAvLyBBdHRyaWJ1dGUgdmFsdWUgaXMgb3V0IG9mIHJhbmdlLg0KKyAgICBJTUFRZHhFcnJvckJ1ZmZlck5vdEF2YWlsYWJsZSwgICAgICAgICAgICAgIC8vIFJlcXVlc3RlZCBidWZmZXIgaXMgdW5hdmFpbGFibGUuDQorICAgIElNQVFkeEVycm9yQnVmZmVyTGlzdEVtcHR5LCAgICAgICAgICAgICAgICAgLy8gQnVmZmVyIGxpc3QgaXMgZW1wdHkuIEFkZCBvbmUgb3IgbW9yZSBidWZmZXJzLg0KKyAgICBJTUFRZHhFcnJvckJ1ZmZlckxpc3RMb2NrZWQsICAgICAgICAgICAgICAgIC8vIEJ1ZmZlciBsaXN0IGlzIGFscmVhZHkgbG9ja2VkLiBSZWNvbmZpZ3VyZSBhY3F1aXNpdGlvbiBhbmQgdHJ5IGFnYWluLg0KKyAgICBJTUFRZHhFcnJvckJ1ZmZlckxpc3ROb3RMb2NrZWQsICAgICAgICAgICAgIC8vIE5vIGJ1ZmZlciBsaXN0LiBSZWNvbmZpZ3VyZSBhY3F1aXNpdGlvbiBhbmQgdHJ5IGFnYWluLg0KKyAgICBJTUFRZHhFcnJvclJlc291cmNlc0FsbG9jYXRlZCwgICAgICAgICAgICAgIC8vIFRyYW5zZmVyIGVuZ2luZSByZXNvdXJjZXMgYWxyZWFkeSBhbGxvY2F0ZWQuIFJlY29uZmlndXJlIGFjcXVpc2l0aW9uIGFuZCB0cnkgYWdhaW4uDQorICAgIElNQVFkeEVycm9yUmVzb3VyY2VzVW5hdmFpbGFibGUsICAgICAgICAgICAgLy8gSW5zdWZmaWNpZW50IHRyYW5zZmVyIGVuZ2luZSByZXNvdXJjZXMuDQorICAgIElNQVFkeEVycm9yQXN5bmNXcml0ZSwgICAgICAgICAgICAgICAgICAgICAgLy8gVW5hYmxlIHRvIHBlcmZvcm0gYXN5Y2hyb25vdXMgcmVnaXN0ZXIgd3JpdGUuDQorICAgIElNQVFkeEVycm9yQXN5bmNSZWFkLCAgICAgICAgICAgICAgICAgICAgICAgLy8gVW5hYmxlIHRvIHBlcmZvcm0gYXN5Y2hyb25vdXMgcmVnaXN0ZXIgcmVhZC4NCisgICAgSU1BUWR4RXJyb3JUaW1lb3V0LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaW1lb3V0Lg0KKyAgICBJTUFRZHhFcnJvckJ1c1Jlc2V0LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJ1cyByZXNldCBvY2N1cnJlZCBkdXJpbmcgYSB0cmFuc2FjdGlvbi4NCisgICAgSU1BUWR4RXJyb3JJbnZhbGlkWE1MLCAgICAgICAgICAgICAgICAgICAgICAvLyBVbmFibGUgdG8gbG9hZCBjYW1lcmEncyBYTUwgZmlsZS4NCisgICAgSU1BUWR4RXJyb3JGaWxlQWNjZXNzLCAgICAgICAgICAgICAgICAgICAgICAvLyBVbmFibGUgdG8gcmVhZC93cml0ZSB0byBmaWxlLg0KKyAgICBJTUFRZHhFcnJvckludmFsaWRDYW1lcmFVUkxTdHJpbmcsICAgICAgICAgIC8vIENhbWVyYSBoYXMgbWFsZm9ybWVkIFVSTCBzdHJpbmcuDQorICAgIElNQVFkeEVycm9ySW52YWxpZENhbWVyYUZpbGUsICAgICAgICAgICAgICAgLy8gSW52YWxpZCBjYW1lcmEgZmlsZS4NCisgICAgSU1BUWR4RXJyb3JHZW5JQ2FtRXJyb3IsICAgICAgICAgICAgICAgICAgICAvLyBVbmtub3duIEdlbmljYW0gZXJyb3IuDQorICAgIElNQVFkeEVycm9yRm9ybWF0N1BhcmFtZXRlcnMsICAgICAgICAgICAgICAgLy8gRm9yIGZvcm1hdCA3OiBUaGUgY29tYmluYXRpb24gb2Ygc3BlZWQsIGltYWdlIHBvc2l0aW9uLCBpbWFnZSBzaXplLCBhbmQgY29sb3IgY29kaW5nIGlzIGluY29ycmVjdC4NCisgICAgSU1BUWR4RXJyb3JJbnZhbGlkQXR0cmlidXRlVHlwZSwgICAgICAgICAgICAvLyBUaGUgYXR0cmlidXRlIHR5cGUgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgcGFzc2VkIHZhcmlhYmxlIHR5cGUuDQorICAgIElNQVFkeEVycm9yRExMTm90Rm91bmQsICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIERMTCBjb3VsZCBub3QgYmUgZm91bmQuDQorICAgIElNQVFkeEVycm9yRnVuY3Rpb25Ob3RGb3VuZCwgICAgICAgICAgICAgICAgLy8gVGhlIGZ1bmN0aW9uIGNvdWxkIG5vdCBiZSBmb3VuZC4NCisgICAgSU1BUWR4RXJyb3JMaWNlbnNlTm90QWN0aXZhdGVkLCAgICAgICAgICAgICAvLyBMaWNlbnNlIG5vdCBhY3RpdmF0ZWQuDQorICAgIElNQVFkeEVycm9yQ2FtZXJhTm90Q29uZmlndXJlZEZvckxpc3RlbmVyLCAgLy8gVGhlIGNhbWVyYSBpcyBub3QgY29uZmlndXJlZCBwcm9wZXJseSB0byBzdXBwb3J0IGEgbGlzdGVuZXIuDQorICAgIElNQVFkeEVycm9yQ2FtZXJhTXVsdGljYXN0Tm90QXZhaWxhYmxlLCAgICAgLy8gVW5hYmxlIHRvIGNvbmZpZ3VyZSB0aGUgc3lzdGVtIGZvciBtdWx0aWNhc3Qgc3VwcG9ydC4NCisgICAgSU1BUWR4RXJyb3JCdWZmZXJIYXNMb3N0UGFja2V0cywgICAgICAgICAgICAvLyBUaGUgcmVxdWVzdGVkIGJ1ZmZlciBoYXMgbG9zdCBwYWNrZXRzIGFuZCB0aGUgdXNlciByZXF1ZXN0ZWQgYW4gZXJyb3IgdG8gYmUgZ2VuZXJhdGVkLg0KKyAgICBJTUFRZHhFcnJvckdpR0VWaXNpb25FcnJvciwgICAgICAgICAgICAgICAgIC8vIFVua25vd24gR2lHRSBWaXNpb24gZXJyb3IuDQorICAgIElNQVFkeEVycm9yTmV0d29ya0Vycm9yLCAgICAgICAgICAgICAgICAgICAgLy8gVW5rbm93biBuZXR3b3JrIGVycm9yLg0KKyAgICBJTUFRZHhFcnJvckNhbWVyYVVucmVhY2hhYmxlLCAgICAgICAgICAgICAgIC8vIFVuYWJsZSB0byBjb25uZWN0IHRvIHRoZSBjYW1lcmEuDQorICAgIElNQVFkeEVycm9ySGlnaFBlcmZvcm1hbmNlTm90U3VwcG9ydGVkLCAgICAgLy8gSGlnaCBwZXJmb3JtYW5jZSBhY3F1aXNpdGlvbiBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSBzcGVjaWZpZWQgbmV0d29yayBpbnRlcmZhY2UuIENvbm5lY3QgdGhlIGNhbWVyYSB0byBhIG5ldHdvcmsgaW50ZXJmYWNlIHJ1bm5pbmcgdGhlIGhpZ2ggcGVyZm9ybWFuY2UgZHJpdmVyLg0KKyAgICBJTUFRZHhFcnJvckludGVyZmFjZU5vdFJlbmFtZWQsICAgICAgICAgICAgIC8vIFVuYWJsZSB0byByZW5hbWUgaW50ZXJmYWNlLiBJbnZhbGlkIG9yIGR1cGxpY2F0ZSBuYW1lIHNwZWNpZmllZC4NCisgICAgSU1BUWR4RXJyb3JOb1N1cHBvcnRlZFZpZGVvTW9kZXMsICAgICAgICAgICAvLyBUaGUgY2FtZXJhIGRvZXMgbm90IGhhdmUgYW55IHZpZGVvIG1vZGVzIHdoaWNoIGFyZSBzdXBwb3J0ZWQuDQorICAgIElNQVFkeEVycm9yU29mdHdhcmVUcmlnZ2VyT3ZlcnJ1biwgICAgICAgICAgLy8gU29mdHdhcmUgdHJpZ2dlciBvdmVycnVuLg0KKyAgICBJTUFRZHhFcnJvclRlc3RQYWNrZXROb3RSZWNlaXZlZCwgICAgICAgICAgIC8vIFRoZSBzeXN0ZW0gZGlkIG5vdCByZWNlaXZlIGEgdGVzdCBwYWNrZXQgZnJvbSB0aGUgY2FtZXJhLiBUaGUgcGFja2V0IHNpemUgbWF5IGJlIHRvbyBsYXJnZSBmb3IgdGhlIG5ldHdvcmsgY29uZmlndXJhdGlvbiBvciBhIGZpcmV3YWxsIG1heSBiZSBlbmFibGVkLg0KKyAgICBJTUFRZHhFcnJvckNvcnJ1cHRlZEltYWdlUmVjZWl2ZWQsICAgICAgICAgIC8vIFRoZSBjYW1lcmEgcmV0dXJuZWQgYSBjb3JydXB0ZWQgaW1hZ2UuDQorICAgIElNQVFkeEVycm9yQ2FtZXJhQ29uZmlndXJhdGlvbkhhc0NoYW5nZWQsICAgLy8gVGhlIGNhbWVyYSBkaWQgbm90IHJldHVybiBhbiBpbWFnZSBvZiB0aGUgY29ycmVjdCB0eXBlIGl0IHdhcyBjb25maWd1cmVkIGZvciBwcmV2aW91c2x5Lg0KKyAgICBJTUFRZHhFcnJvckNhbWVyYUludmFsaWRBdXRoZW50aWNhdGlvbiwgICAgIC8vIFRoZSBjYW1lcmEgaXMgY29uZmlndXJlZCB3aXRoIHBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uIGFuZCBlaXRoZXIgdGhlIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQgd2VyZSBub3QgY29uZmlndXJlZCBvciB0aGV5IGFyZSBpbmNvcnJlY3QuDQorICAgIElNQVFkeEVycm9yVW5rbm93bkhUVFBFcnJvciwgICAgICAgICAgICAgICAgLy8gVGhlIGNhbWVyYSByZXR1cm5lZCBhbiB1bmtub3duIEhUVFAgZXJyb3IuDQorICAgIElNQVFkeEVycm9yS2VybmVsRHJpdmVyVW5hdmFpbGFibGUsICAgICAgICAgLy8gVW5hYmxlIHRvIGF0dGFjaCB0byB0aGUga2VybmVsIG1vZGUgZHJpdmVyLg0KKyAgICBJTUFRZHhFcnJvclBpeGVsRm9ybWF0RGVjb2RlclVuYXZhaWxhYmxlLCAgIC8vIE5vIGRlY29kZXIgYXZhaWxhYmxlIGZvciBzZWxlY3RlZCBwaXhlbCBmb3JtYXQuDQorICAgIElNQVFkeEVycm9yRmlybXdhcmVVcGRhdGVOZWVkZWQsICAgICAgICAgICAgLy8gVGhlIGFjcXVpc2l0aW9uIGhhcmR3YXJlIG5lZWRzIGEgZmlybXdhcmUgdXBkYXRlIGJlZm9yZSBpdCBjYW4gYmUgdXNlZC4NCisgICAgSU1BUWR4RXJyb3JGaXJtd2FyZVVwZGF0ZVJlYm9vdE5lZWRlZCwgICAgICAvLyBUaGUgZmlybXdhcmUgb24gdGhlIGFjcXVpc2l0aW9uIGhhcmR3YXJlIGhhcyBiZWVuIHVwZGF0ZWQgYW5kIHRoZSBzeXN0ZW0gbXVzdCBiZSByZWJvb3RlZCBiZWZvcmUgdXNlLg0KKyAgICBJTUFRZHhFcnJvckxpZ2h0aW5nQ3VycmVudE91dE9mUmFuZ2UsICAgICAgIC8vIFRoZSByZXF1ZXN0ZWQgY3VycmVudCBsZXZlbCBmcm9tIHRoZSBsaWdodGluZyBjb250cm9sbGVyIGlzIG5vdCBwb3NzaWJsZS4NCisgICAgSU1BUWR4RXJyb3JVU0IzVmlzaW9uRXJyb3IsICAgICAgICAgICAgICAgICAvLyBVbmtub3duIFVTQjMgVmlzaW9uIGVycm9yLg0KKyAgICBJTUFRZHhFcnJvckludmFsaWRVM1ZVU0JEZXNjcmlwdG9yLCAgICAgICAgIC8vIFRoZSBjYW1lcmEgaGFzIGEgVVNCIGRlc2NyaXB0b3IgdGhhdCBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgVVNCMyBWaXNpb24gc3BlY2lmaWNhdGlvbi4NCisgICAgSU1BUWR4RXJyb3JVM1ZJbnZhbGlkQ29udHJvbEludGVyZmFjZSwgICAgICAvLyBUaGUgVVNCMyBWaXNpb24gY29udHJvbCBpbnRlcmZhY2UgaXMgbm90IGltcGxlbWVudGVkIG9yIGlzIGludmFsaWQgb24gdGhpcyBjYW1lcmEuDQorICAgIElNQVFkeEVycm9yVTNWQ29udHJvbEludGVyZmFjZUVycm9yLCAgICAgICAgLy8gVGhlcmUgd2FzIGFuIGVycm9yIGZyb20gdGhlIGNvbnRyb2wgaW50ZXJmYWNlIG9mIHRoZSBVU0IzIFZpc2lvbiBjYW1lcmEuDQorICAgIElNQVFkeEVycm9yVTNWSW52YWxpZEV2ZW50SW50ZXJmYWNlLCAgICAgICAgLy8gVGhlIFVTQjMgVmlzaW9uIGV2ZW50IGludGVyZmFjZSBpcyBub3QgaW1wbGVtZW50ZWQgb3IgaXMgaW52YWxpZCBvbiB0aGlzIGNhbWVyYS4NCisgICAgSU1BUWR4RXJyb3JVM1ZFdmVudEludGVyZmFjZUVycm9yLCAgICAgICAgICAvLyBUaGVyZSB3YXMgYW4gZXJyb3IgZnJvbSB0aGUgZXZlbnQgaW50ZXJmYWNlIG9mIHRoZSBVU0IzIFZpc2lvbiBjYW1lcmEuDQorICAgIElNQVFkeEVycm9yVTNWSW52YWxpZFN0cmVhbUludGVyZmFjZSwgICAgICAgLy8gVGhlIFVTQjMgVmlzaW9uIHN0cmVhbSBpbnRlcmZhY2UgaXMgbm90IGltcGxlbWVudGVkIG9yIGlzIGludmFsaWQgb24gdGhpcyBjYW1lcmEuDQorICAgIElNQVFkeEVycm9yVTNWU3RyZWFtSW50ZXJmYWNlRXJyb3IsICAgICAgICAgLy8gVGhlcmUgd2FzIGFuIGVycm9yIGZyb20gdGhlIHN0cmVhbSBpbnRlcmZhY2Ugb2YgdGhlIFVTQjMgVmlzaW9uIGNhbWVyYS4NCisgICAgSU1BUWR4RXJyb3JVM1ZVbnN1cHBvcnRlZENvbm5lY3Rpb25TcGVlZCwgICAvLyBUaGUgVVNCIGNvbm5lY3Rpb24gc3BlZWQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY2FtZXJhLiAgQ2hlY2sgd2hldGhlciB0aGUgY2FtZXJhIGlzIHBsdWdnZWQgaW50byBhIFVTQiAyLjAgcG9ydCBpbnN0ZWFkIG9mIGEgVVNCIDMuMCBwb3J0LiAgSWYgc28sIHZlcmlmeSB0aGF0IHRoZSBjYW1lcmEgc3VwcG9ydHMgdGhpcyB1c2UgY2FzZS4gICAgICAgDQorICAgIElNQVFkeEVycm9yVTNWSW5zdWZmaWNpZW50UG93ZXIsICAgICAgICAgICAgLy8gVGhlIFVTQjMgVmlzaW9uIGNhbWVyYSByZXF1aXJlcyBtb3JlIGN1cnJlbnQgdGhhbiBjYW4gYmUgc3VwcGxpZWQgYnkgdGhlIFVTQiBwb3J0IGluIHVzZS4NCisgICAgSU1BUWR4RXJyb3JVM1ZJbnZhbGlkTWF4Q3VycmVudCwgICAgICAgICAgICAvLyBUaGUgVTNWX01heGltdW1DdXJyZW50VVNCMjBfbUEgcmVnaXN0cnkgdmFsdWUgaXMgbm90IHZhbGlkIGZvciB0aGUgY29ubmVjdGVkIFVTQjMgVmlzaW9uIGNhbWVyYS4NCisgICAgSU1BUWR4RXJyb3JCdWZmZXJJbmNvbXBsZXRlRGF0YSwgICAgICAgICAgICAvLyBUaGUgcmVxdWVzdGVkIGJ1ZmZlciBoYXMgaW5jb21wbGV0ZSBkYXRhIGFuZCB0aGUgdXNlciByZXF1ZXN0ZWQgYW4gZXJyb3IgdG8gYmUgZ2VuZXJhdGVkLg0KKyAgICBJTUFRZHhFcnJvckNhbWVyYUFjcXVpc2l0aW9uQ29uZmlnRmFpbGVkLCAgIC8vIFRoZSBjYW1lcmEgcmV0dXJuZWQgYW4gZXJyb3Igc3RhcnRpbmcgdGhlIGFjcXVpc2l0aW9uLg0KKyAgICBJTUFRZHhFcnJvckNhbWVyYUNsb3NlUGVuZGluZywgICAgICAgICAgICAgIC8vIFRoZSBjYW1lcmEgc3RpbGwgaGFzIG91dHN0YW5kaW5nIHJlZmVyZW5jZXMgYW5kIHdpbGwgYmUgY2xvc2VkIHdoZW4gdGhlc2Ugb3BlcmF0aW9ucyBjb21wbGV0ZS4NCisgICAgSU1BUWR4RXJyb3JTb2Z0d2FyZUZhdWx0LCAgICAgICAgICAgICAgICAgICAvLyBBbiB1bmV4cGVjdGVkIHNvZnR3YXJlIGVycm9yIG9jY3VycmVkLg0KKyAgICBJTUFRZHhFcnJvckNhbWVyYVByb3BlcnR5SW52YWxpZCwgICAgICAgICAgIC8vIFRoZSB2YWx1ZSBmb3IgYW4gaW52YWxpZCBjYW1lcmEgcHJvcGVydHkgd2FzIHJlcXVlc3RlZC4NCisgICAgSU1BUWR4RXJyb3JKdW1ib0ZyYW1lc05vdEVuYWJsZWQsICAgICAgICAgICAvLyBKdW1ibyBmcmFtZXMgYXJlIG5vdCBlbmFibGVkIG9uIHRoZSBob3N0LiAgTWF4aW11bSBwYWNrZXQgc2l6ZSBpcyAxNTAwIGJ5dGVzLg0KKyAgICBJTUFRZHhFcnJvckJheWVyUGl4ZWxGb3JtYXROb3RTZWxlY3RlZCwgICAgIC8vIFRoaXMgb3BlcmF0aW9uIHJlcXVpcmVzIHRoYXQgdGhlIGNhbWVyYSBoYXMgYSBCYXllciBwaXhlbCBmb3JtYXQgc2VsZWN0ZWQuDQorICAgIElNQVFkeEVycm9yR3VhcmQgPSAweEZGRkZGRkZGLA0KK30gSU1BUWR4RXJyb3I7DQorDQorDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisvLyAgQnVzIFR5cGUgRW51bWVyYXRpb24NCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KK3R5cGVkZWYgZW51bSBJTUFRZHhCdXNUeXBlX2VudW0gew0KKyAgICBJTUFRZHhCdXNUeXBlRmlyZVdpcmUgPSAweDMxMzMzOTM0LA0KKyAgICBJTUFRZHhCdXNUeXBlRXRoZXJuZXQgPSAweDY5NzA3NjM0LA0KKyAgICBJTUFRZHhCdXNUeXBlU2ltdWxhdG9yID0gMHgyMDczNjk2RCwNCisgICAgSU1BUWR4QnVzVHlwZURpcmVjdFNob3cgPSAweDY0NzM2ODc3LA0KKyAgICBJTUFRZHhCdXNUeXBlSVAgPSAweDQ5NTA2MzZELA0KKyAgICBJTUFRZHhCdXNUeXBlU21hcnRDYW0yID0gMHg1MzQzNjEzMiwNCisgICAgSU1BUWR4QnVzVHlwZVVTQjNWaXNpb24gPSAweDU1NTM0MjMzLA0KKyAgICBJTUFRZHhCdXNUeXBlVVZDID0gMHg1NTU2NDMyMCwNCisgICAgSU1BUWR4QnVzVHlwZUd1YXJkID0gMHhGRkZGRkZGRiwNCit9IElNQVFkeEJ1c1R5cGU7DQorDQorDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisvLyAgQ2FtZXJhIENvbnRyb2wgTW9kZSBFbnVtZXJhdGlvbg0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQordHlwZWRlZiBlbnVtIElNQVFkeENhbWVyYUNvbnRyb2xNb2RlX2VudW0gew0KKyAgICBJTUFRZHhDYW1lcmFDb250cm9sTW9kZUNvbnRyb2xsZXIsDQorICAgIElNQVFkeENhbWVyYUNvbnRyb2xNb2RlTGlzdGVuZXIsDQorICAgIElNQVFkeENhbWVyYUNvbnRyb2xNb2RlR3VhcmQgPSAweEZGRkZGRkZGLA0KK30gSU1BUWR4Q2FtZXJhQ29udHJvbE1vZGU7DQorDQorDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisvLyAgQnVmZmVyIE51bWJlciBNb2RlIEVudW1lcmF0aW9uDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCit0eXBlZGVmIGVudW0gSU1BUWR4QnVmZmVyTnVtYmVyTW9kZV9lbnVtIHsNCisgICAgSU1BUWR4QnVmZmVyTnVtYmVyTW9kZU5leHQsDQorICAgIElNQVFkeEJ1ZmZlck51bWJlck1vZGVMYXN0LA0KKyAgICBJTUFRZHhCdWZmZXJOdW1iZXJNb2RlQnVmZmVyTnVtYmVyLA0KKyAgICBJTUFRZHhCdWZmZXJOdW1iZXJNb2RlR3VhcmQgPSAweEZGRkZGRkZGLA0KK30gSU1BUWR4QnVmZmVyTnVtYmVyTW9kZTsNCisNCisNCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKy8vICBQbHVnIG4gUGxheSBFdmVudCBFbnVtZXJhdGlvbg0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQordHlwZWRlZiBlbnVtIElNQVFkeFBucEV2ZW50X2VudW0gew0KKyAgICBJTUFRZHhQbnBFdmVudENhbWVyYUF0dGFjaGVkLA0KKyAgICBJTUFRZHhQbnBFdmVudENhbWVyYURldGFjaGVkLA0KKyAgICBJTUFRZHhQbnBFdmVudEJ1c1Jlc2V0LA0KKyAgICBJTUFRZHhQbnBFdmVudEd1YXJkID0gMHhGRkZGRkZGRiwNCit9IElNQVFkeFBucEV2ZW50Ow0KKw0KKw0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorLy8gIEJheWVyIFBhdHRlcm4gRW51bWVyYXRpb24NCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KK3R5cGVkZWYgZW51bSBJTUFRZHhCYXllclBhdHRlcm5fZW51bSB7DQorICAgIElNQVFkeEJheWVyUGF0dGVybk5vbmUsDQorICAgIElNQVFkeEJheWVyUGF0dGVybkdCLA0KKyAgICBJTUFRZHhCYXllclBhdHRlcm5HUiwNCisgICAgSU1BUWR4QmF5ZXJQYXR0ZXJuQkcsDQorICAgIElNQVFkeEJheWVyUGF0dGVyblJHLA0KKyAgICBJTUFRZHhCYXllclBhdHRlcm5IYXJkd2FyZSwNCisgICAgSU1BUWR4QmF5ZXJQYXR0ZXJuR3VhcmQgPSAweEZGRkZGRkZGLA0KK30gSU1BUWR4QmF5ZXJQYXR0ZXJuOw0KKw0KKw0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorLy8gIEJheWVyIERlY29kZSBBbGdvcml0aG0gRW51bWVyYXRpb24NCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KK3R5cGVkZWYgZW51bSBJTUFRZHhCYXllckFsZ29yaXRobV9lbnVtIHsNCisgICAgSU1BUWR4QmF5ZXJBbGdvcml0aG1CaWxpbmVhciwNCisgICAgSU1BUWR4QmF5ZXJBbGdvcml0aG1WTkcsDQorICAgIElNQVFkeEJheWVyQWxnb3JpdGhtR3VhcmQgPSAweEZGRkZGRkZGLA0KK30gSU1BUWR4QmF5ZXJBbGdvcml0aG07DQorDQorDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisvLyAgT3V0cHV0IEltYWdlIFR5cGVzIC0tIFZhbHVlcyBtYXRjaCBWaXNpb24gRGV2ZWxvcG1lbnQgTW9kdWxlIGltYWdlIHR5cGVzDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCit0eXBlZGVmIGVudW0gSU1BUWR4T3V0cHV0SW1hZ2VUeXBlX2VudW0gew0KKyAgICBJTUFRZHhPdXRwdXRJbWFnZVR5cGVVOCAgICA9IDAsDQorICAgIElNQVFkeE91dHB1dEltYWdlVHlwZUkxNiAgID0gMSwNCisgICAgSU1BUWR4T3V0cHV0SW1hZ2VUeXBlVTE2ICAgPSA3LA0KKyAgICBJTUFRZHhPdXRwdXRJbWFnZVR5cGVSR0IzMiA9IDQsDQorICAgIElNQVFkeE91dHB1dEltYWdlVHlwZVJHQjY0ID0gNiwNCisgICAgSU1BUWR4T3V0cHV0SW1hZ2VUeXBlQXV0byAgPSAweDdGRkZGRkZGLA0KKyAgICBJTUFRZHhPdXRwdXRJbWFnZVR5cGVHdWFyZCA9IDB4RkZGRkZGRkYsDQorfSBJTUFRZHhPdXRwdXRJbWFnZVR5cGU7DQorDQorDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisvLyAgQ29udHJvbGxlciBEZXN0aW5hdGlvbiBNb2RlIEVudW1lcmF0aW9uDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCit0eXBlZGVmIGVudW0gSU1BUWR4RGVzdGluYXRpb25Nb2RlX2VudW0gew0KKyAgICBJTUFRZHhEZXN0aW5hdGlvbk1vZGVVbmljYXN0LA0KKyAgICBJTUFRZHhEZXN0aW5hdGlvbk1vZGVCcm9hZGNhc3QsDQorICAgIElNQVFkeERlc3RpbmF0aW9uTW9kZU11bHRpY2FzdCwNCisgICAgSU1BUWR4RGVzdGluYXRpb25Nb2RlR3VhcmQgPSAweEZGRkZGRkZGLA0KK30gSU1BUWR4RGVzdGluYXRpb25Nb2RlOw0KKw0KKw0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorLy8gICBBdHRyaWJ1dGUgVHlwZSBFbnVtZXJhdGlvbg0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQordHlwZWRlZiBlbnVtIElNQVFkeEF0dHJpYnV0ZVR5cGVfZW51bSB7ICAgIA0KKyAgICBJTUFRZHhBdHRyaWJ1dGVUeXBlVTMyLA0KKyAgICBJTUFRZHhBdHRyaWJ1dGVUeXBlSTY0LA0KKyAgICBJTUFRZHhBdHRyaWJ1dGVUeXBlRjY0LA0KKyAgICBJTUFRZHhBdHRyaWJ1dGVUeXBlU3RyaW5nLA0KKyAgICBJTUFRZHhBdHRyaWJ1dGVUeXBlRW51bSwNCisgICAgSU1BUWR4QXR0cmlidXRlVHlwZUJvb2wsDQorICAgIElNQVFkeEF0dHJpYnV0ZVR5cGVDb21tYW5kLA0KKyAgICBJTUFRZHhBdHRyaWJ1dGVUeXBlQmxvYiwNCisgICAgSU1BUWR4QXR0cmlidXRlVHlwZUd1YXJkID0gMHhGRkZGRkZGRiwNCit9IElNQVFkeEF0dHJpYnV0ZVR5cGU7DQorDQorDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisvLyAgVmFsdWUgVHlwZSBFbnVtZXJhdGlvbg0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQordHlwZWRlZiBlbnVtIElNQVFkeFZhbHVlVHlwZV9lbnVtIHsgICAgDQorICAgIElNQVFkeFZhbHVlVHlwZVUzMiwNCisgICAgSU1BUWR4VmFsdWVUeXBlSTY0LA0KKyAgICBJTUFRZHhWYWx1ZVR5cGVGNjQsDQorICAgIElNQVFkeFZhbHVlVHlwZVN0cmluZywNCisgICAgSU1BUWR4VmFsdWVUeXBlRW51bUl0ZW0sDQorICAgIElNQVFkeFZhbHVlVHlwZUJvb2wsDQorICAgIElNQVFkeFZhbHVlVHlwZURpc3Bvc2FibGVTdHJpbmcsDQorICAgIElNQVFkeFZhbHVlVHlwZUd1YXJkID0gMHhGRkZGRkZGRiwNCit9IElNQVFkeFZhbHVlVHlwZTsNCisNCisNCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKy8vICBJbnRlcmZhY2UgRmlsZSBGbGFncyBFbnVtZXJhdGlvbg0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQordHlwZWRlZiBlbnVtIElNQVFkeEludGVyZmFjZUZpbGVGbGFnc19lbnVtIHsNCisgICAgSU1BUWR4SW50ZXJmYWNlRmlsZUZsYWdzQ29ubmVjdGVkID0gMHgxLA0KKyAgICBJTUFRZHhJbnRlcmZhY2VGaWxlRmxhZ3NEaXJ0eSA9IDB4MiwNCisgICAgSU1BUWR4SW50ZXJmYWNlRmlsZUZsYWdzR3VhcmQgPSAweEZGRkZGRkZGLA0KK30gSU1BUWR4SW50ZXJmYWNlRmlsZUZsYWdzOw0KKw0KKw0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorLy8gIE92ZXJ3cml0ZSBNb2RlIEVudW1lcmF0aW9uDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCit0eXBlZGVmIGVudW0gSU1BUWR4T3ZlcndyaXRlTW9kZV9lbnVtIHsNCisgICAgSU1BUWR4T3ZlcndyaXRlTW9kZUdldE9sZGVzdCA9IDB4MCwNCisgICAgSU1BUWR4T3ZlcndyaXRlTW9kZUZhaWwgPSAweDIsDQorICAgIElNQVFkeE92ZXJ3cml0ZU1vZGVHZXROZXdlc3QgPSAweDMsDQorICAgIElNQVFkeE92ZXJ3cml0ZU1vZGVHdWFyZCA9IDB4RkZGRkZGRkYsDQorfSBJTUFRZHhPdmVyd3JpdGVNb2RlOw0KKw0KKw0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorLy8gIEluY29tcGxldGUgQnVmZmVyIE1vZGUgRW51bWVyYXRpb24NCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KK3R5cGVkZWYgZW51bSBJTUFRZHhJbmNvbXBsZXRlQnVmZmVyTW9kZV9lbnVtIHsNCisgICAgSU1BUWR4SW5jb21wbGV0ZUJ1ZmZlck1vZGVJZ25vcmUsDQorICAgIElNQVFkeEluY29tcGxldGVCdWZmZXJNb2RlRmFpbCwNCisgICAgSU1BUWR4SW5jb21wbGV0ZUJ1ZmZlck1vZGVHdWFyZCA9IDB4RkZGRkZGRkYsDQorfSBJTUFRZHhJbmNvbXBsZXRlQnVmZmVyTW9kZTsNCisNCisNCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKy8vICBMb3N0IFBhY2tldCBNb2RlIEVudW1lcmF0aW9uDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCit0eXBlZGVmIGVudW0gSU1BUWR4TG9zdFBhY2tldE1vZGVfZW51bSB7DQorICAgIElNQVFkeExvc3RQYWNrZXRNb2RlSWdub3JlLA0KKyAgICBJTUFRZHhMb3N0UGFja2V0TW9kZUZhaWwsDQorICAgIElNQVFkeExvc3RQYWNrZXRNb2RlR3VhcmQgPSAweEZGRkZGRkZGLA0KK30gSU1BUWR4TG9zdFBhY2tldE1vZGU7DQorDQorDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisvLyAgQXR0cmlidXRlIFZpc2liaWxpdHkgRW51bWVyYXRpb24NCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KK3R5cGVkZWYgZW51bSBJTUFRZHhBdHRyaWJ1dGVWaXNpYmlsaXR5X2VudW0gew0KKyAgICBJTUFRZHhBdHRyaWJ1dGVWaXNpYmlsaXR5U2ltcGxlID0gMHgwMDAwMTAwMCwNCisgICAgSU1BUWR4QXR0cmlidXRlVmlzaWJpbGl0eUludGVybWVkaWF0ZSA9IDB4MDAwMDIwMDAsDQorICAgIElNQVFkeEF0dHJpYnV0ZVZpc2liaWxpdHlBZHZhbmNlZCA9IDB4MDAwMDQwMDAsDQorICAgIElNQVFkeEF0dHJpYnV0ZVZpc2liaWxpdHlHdWFyZCA9IDB4RkZGRkZGRkYsDQorfSBJTUFRZHhBdHRyaWJ1dGVWaXNpYmlsaXR5Ow0KKw0KKw0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorLy8gIFN0cmVhbSBDaGFubmVsIE1vZGUgRW51bWVyYXRpb24NCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KK3R5cGVkZWYgZW51bSBJTUFRZHhTdHJlYW1DaGFubmVsTW9kZV9lbnVtIHsNCisgICAgSU1BUWR4U3RyZWFtQ2hhbm5lbE1vZGVBdXRvbWF0aWMsDQorICAgIElNQVFkeFN0cmVhbUNoYW5uZWxNb2RlTWFudWFsLA0KKyAgICBJTUFRZHhTdHJlYW1DaGFubmVsTW9kZUd1YXJkID0gMHhGRkZGRkZGRiwNCit9IElNQVFkeFN0cmVhbUNoYW5uZWxNb2RlOw0KKw0KKw0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorLy8gIFBpeGVsIFNpZ25lZG5lc3MgRW51bWVyYXRpb24NCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KK3R5cGVkZWYgZW51bSBJTUFRZHhQaXhlbFNpZ25lZG5lc3NfZW51bSB7DQorICAgIElNQVFkeFBpeGVsU2lnbmVkbmVzc1Vuc2lnbmVkLA0KKyAgICBJTUFRZHhQaXhlbFNpZ25lZG5lc3NTaWduZWQsDQorICAgIElNQVFkeFBpeGVsU2lnbmVkbmVzc0hhcmR3YXJlLA0KKyAgICBJTUFRZHhQaXhlbFNpZ25lZG5lc3NHdWFyZCA9IDB4RkZGRkZGRkYsDQorfSBJTUFRZHhQaXhlbFNpZ25lZG5lc3M7DQorDQorDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisvLyAgVVNCIENvbm5lY3Rpb24gU3BlZWQgRW51bWVyYXRpb24NCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KK3R5cGVkZWYgZW51bSBJTUFRZHhVU0JDb25uZWN0aW9uU3BlZWRfZW51bSB7DQorICAgIElNQVFkeFVTQkNvbm5lY3Rpb25TcGVlZExvdyA9IDEsDQorICAgIElNQVFkeFVTQkNvbm5lY3Rpb25TcGVlZEZ1bGwgPSAyLA0KKyAgICBJTUFRZHhVU0JDb25uZWN0aW9uU3BlZWRIaWdoID0gNCwNCisgICAgSU1BUWR4VVNCQ29ubmVjdGlvblNwZWVkU3VwZXIgPSA4LA0KKyAgICBJTUFRZHhVU0JDb25uZWN0aW9uU3BlZWRHdWFyZCA9IDB4RkZGRkZGRkYsDQorfSBJTUFRZHhVU0JDb25uZWN0aW9uU3BlZWQ7DQorDQorDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisvLyAgQ1ZJIFN0cnVjdHVyZXMNCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKyNwcmFnbWEgcGFjayhwdXNoLCA0KQ0KKw0KKw0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorLy8gIENhbWVyYSBJbmZvcm1hdGlvbiBTdHJ1Y3R1cmUNCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KK3R5cGVkZWYgc3RydWN0IElNQVFkeENhbWVyYUluZm9ybWF0aW9uX3N0cnVjdCB7DQorICAgIHVJbnQzMiBUeXBlOw0KKyAgICB1SW50MzIgVmVyc2lvbjsNCisgICAgdUludDMyIEZsYWdzOw0KKyAgICB1SW50MzIgU2VyaWFsTnVtYmVySGk7DQorICAgIHVJbnQzMiBTZXJpYWxOdW1iZXJMbzsNCisgICAgSU1BUWR4QnVzVHlwZSBCdXNUeXBlOw0KKyAgICBjaGFyIEludGVyZmFjZU5hbWVbSU1BUURYX01BWF9BUElfU1RSSU5HX0xFTkdUSF07DQorICAgIGNoYXIgVmVuZG9yTmFtZVtJTUFRRFhfTUFYX0FQSV9TVFJJTkdfTEVOR1RIXTsNCisgICAgY2hhciBNb2RlbE5hbWVbSU1BUURYX01BWF9BUElfU1RSSU5HX0xFTkdUSF07DQorICAgIGNoYXIgQ2FtZXJhRmlsZU5hbWVbSU1BUURYX01BWF9BUElfU1RSSU5HX0xFTkdUSF07DQorICAgIGNoYXIgQ2FtZXJhQXR0cmlidXRlVVJMW0lNQVFEWF9NQVhfQVBJX1NUUklOR19MRU5HVEhdOw0KK30gSU1BUWR4Q2FtZXJhSW5mb3JtYXRpb247DQorDQorDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisvLyAgQ2FtZXJhIEZpbGUgU3RydWN0dXJlDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCit0eXBlZGVmIHN0cnVjdCBJTUFRZHhDYW1lcmFGaWxlX3N0cnVjdCB7DQorICAgIHVJbnQzMiBUeXBlOw0KKyAgICB1SW50MzIgVmVyc2lvbjsNCisgICAgY2hhciBGaWxlTmFtZVtJTUFRRFhfTUFYX0FQSV9TVFJJTkdfTEVOR1RIXTsNCit9IElNQVFkeENhbWVyYUZpbGU7DQorDQorDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisvLyAgQXR0cmlidXRlIEluZm9ybWF0aW9uIFN0cnVjdHVyZQ0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQordHlwZWRlZiBzdHJ1Y3QgSU1BUWR4QXR0cmlidXRlSW5mb3JtYXRpb25fc3RydWN0IHsNCisgICAgSU1BUWR4QXR0cmlidXRlVHlwZSBUeXBlOw0KKyAgICBib29sMzIgUmVhZGFibGU7DQorICAgIGJvb2wzMiBXcml0YWJsZTsNCisgICAgY2hhciBOYW1lW0lNQVFEWF9NQVhfQVBJX1NUUklOR19MRU5HVEhdOw0KK30gSU1BUWR4QXR0cmlidXRlSW5mb3JtYXRpb247DQorDQorDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisvLyAgRW51bWVyYXRpb24gSXRlbSBTdHJ1Y3R1cmUNCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KK3R5cGVkZWYgc3RydWN0IElNQVFkeEVudW1JdGVtX3N0cnVjdCB7DQorICAgIHVJbnQzMiBWYWx1ZTsNCisgICAgdUludDMyIFJlc2VydmVkOw0KKyAgICBjaGFyIE5hbWVbSU1BUURYX01BWF9BUElfU1RSSU5HX0xFTkdUSF07DQorfSBJTUFRZHhFbnVtSXRlbTsNCisNCisNCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKy8vICBDYW1lcmEgSW5mb3JtYXRpb24gU3RydWN0dXJlDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCit0eXBlZGVmIElNQVFkeEVudW1JdGVtIElNQVFkeFZpZGVvTW9kZTsNCisNCisNCisjcHJhZ21hIHBhY2socG9wKQ0KKw0KKw0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorLy8gIENhbGxiYWNrcw0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQordHlwZWRlZiAgICAgdUludDMyIChOSV9GVU5DICpGcmFtZURvbmVFdmVudENhbGxiYWNrUHRyKShJTUFRZHhTZXNzaW9uIGlkLCB1SW50MzIgYnVmZmVyTnVtYmVyLCB2b2lkKiBjYWxsYmFja0RhdGEpOw0KK3R5cGVkZWYgICAgIHVJbnQzMiAoTklfRlVOQyAqUG5wRXZlbnRDYWxsYmFja1B0cikoSU1BUWR4U2Vzc2lvbiBpZCwgSU1BUWR4UG5wRXZlbnQgcG5wRXZlbnQsIHZvaWQqIGNhbGxiYWNrRGF0YSk7DQordHlwZWRlZiAgICAgdm9pZCAoTklfRlVOQyAqQXR0cmlidXRlVXBkYXRlZEV2ZW50Q2FsbGJhY2tQdHIpKElNQVFkeFNlc3Npb24gaWQsIGNvbnN0IGNoYXIqIG5hbWUsIHZvaWQqIGNhbGxiYWNrRGF0YSk7DQorDQorI2VuZGlmIC8vbmlpbWFxZHhfdHlwZXMNCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKy8vICBBdHRyaWJ1dGVzDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZUJhc2VBZGRyZXNzICAgICAgICAgICAgICAgIkNhbWVyYUluZm9ybWF0aW9uOjpCYXNlQWRkcmVzcyIgICAgICAgICAvLyBSZWFkIG9ubHkuIEdldHMgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgY2FtZXJhIHJlZ2lzdGVycy4NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZUJ1c1R5cGUgICAgICAgICAgICAgICAgICAgIkNhbWVyYUluZm9ybWF0aW9uOjpCdXNUeXBlIiAgICAgICAgICAgICAvLyBSZWFkIG9ubHkuIEdldHMgdGhlIGJ1cyB0eXBlIG9mIHRoZSBjYW1lcmEuDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVNb2RlbE5hbWUgICAgICAgICAgICAgICAgICJDYW1lcmFJbmZvcm1hdGlvbjo6TW9kZWxOYW1lIiAgICAgICAgICAgLy8gUmVhZCBvbmx5LiBSZXR1cm5zIHRoZSBtb2RlbCBuYW1lLg0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlU2VyaWFsTnVtYmVySGlnaCAgICAgICAgICAiQ2FtZXJhSW5mb3JtYXRpb246OlNlcmlhbE51bWJlckhpZ2giICAgIC8vIFJlYWQgb25seS4gR2V0cyB0aGUgdXBwZXIgMzItYml0cyBvZiB0aGUgY2FtZXJhIDY0LWJpdCBzZXJpYWwgbnVtYmVyLg0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlU2VyaWFsTnVtYmVyTG93ICAgICAgICAgICAiQ2FtZXJhSW5mb3JtYXRpb246OlNlcmlhbE51bWJlckxvdyIgICAgIC8vIFJlYWQgb25seS4gR2V0cyB0aGUgbG93ZXIgMzItYml0cyBvZiB0aGUgY2FtZXJhIDY0LWJpdCBzZXJpYWwgbnVtYmVyLg0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlVmVuZG9yTmFtZSAgICAgICAgICAgICAgICAiQ2FtZXJhSW5mb3JtYXRpb246OlZlbmRvck5hbWUiICAgICAgICAgIC8vIFJlYWQgb25seS4gUmV0dXJucyB0aGUgdmVuZG9yIG5hbWUuDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVIb3N0SVBBZGRyZXNzICAgICAgICAgICAgICJDYW1lcmFJbmZvcm1hdGlvbjo6SG9zdElQQWRkcmVzcyIgICAgICAgLy8gUmVhZCBvbmx5LiBSZXR1cm5zIHRoZSBob3N0IGFkYXB0ZXIgSVAgYWRkcmVzcy4NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZUlQQWRkcmVzcyAgICAgICAgICAgICAgICAgIkNhbWVyYUluZm9ybWF0aW9uOjpJUEFkZHJlc3MiICAgICAgICAgICAvLyBSZWFkIG9ubHkuIFJldHVybnMgdGhlIElQIGFkZHJlc3MuDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVQcmltYXJ5VVJMU3RyaW5nICAgICAgICAgICJDYW1lcmFJbmZvcm1hdGlvbjo6UHJpbWFyeVVSTFN0cmluZyIgICAgLy8gUmVhZCBvbmx5LiBHZXRzIHRoZSBjYW1lcmEncyBwcmltYXJ5IFVSTCBzdHJpbmcuDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVTZWNvbmRhcnlVUkxTdHJpbmcgICAgICAgICJDYW1lcmFJbmZvcm1hdGlvbjo6U2Vjb25kYXJ5VVJMU3RyaW5nIiAgLy8gUmVhZCBvbmx5LiBHZXRzIHRoZSBjYW1lcmEncyBzZWNvbmRhcnkgVVJMIHN0cmluZy4NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZUFjcUluUHJvZ3Jlc3MgICAgICAgICAgICAgIlN0YXR1c0luZm9ybWF0aW9uOjpBY3FJblByb2dyZXNzIiAgICAgICAvLyBSZWFkIG9ubHkuIEdldHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGFjcXVpc2l0aW9uLiBUUlVFIGlmIGFjcXVpcmluZzsgb3RoZXJ3aXNlIEZBTFNFLg0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlTGFzdEJ1ZmZlckNvdW50ICAgICAgICAgICAiU3RhdHVzSW5mb3JtYXRpb246Okxhc3RCdWZmZXJDb3VudCIgICAgIC8vIFJlYWQgb25seS4gR2V0cyB0aGUgbnVtYmVyIG9mIHRyYW5zZmVycmVkIGJ1ZmZlcnMuDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVMYXN0QnVmZmVyTnVtYmVyICAgICAgICAgICJTdGF0dXNJbmZvcm1hdGlvbjo6TGFzdEJ1ZmZlck51bWJlciIgICAgLy8gUmVhZCBvbmx5LiBHZXRzIHRoZSBsYXN0IGN1bXVsYXRpdmUgYnVmZmVyIG51bWJlciB0cmFuc2ZlcnJlZC4NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZUxvc3RCdWZmZXJDb3VudCAgICAgICAgICAgIlN0YXR1c0luZm9ybWF0aW9uOjpMb3N0QnVmZmVyQ291bnQiICAgICAvLyBSZWFkIG9ubHkuIEdldHMgdGhlIG51bWJlciBvZiBsb3N0IGJ1ZmZlcnMgZHVyaW5nIGFuIGFjcXVpc2l0aW9uIHNlc3Npb24uDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVMb3N0UGFja2V0Q291bnQgICAgICAgICAgICJTdGF0dXNJbmZvcm1hdGlvbjo6TG9zdFBhY2tldENvdW50IiAgICAgLy8gUmVhZCBvbmx5LiBHZXRzIHRoZSBudW1iZXIgb2YgbG9zdCBwYWNrZXRzIGR1cmluZyBhbiBhY3F1aXNpdGlvbiBzZXNzaW9uLg0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlUmVxdWVzdGVkUmVzZW5kUGFja2V0cyAgICAiU3RhdHVzSW5mb3JtYXRpb246OlJlcXVlc3RlZFJlc2VuZFBhY2tldENvdW50IiAvLyBSZWFkIG9ubHkuIEdldHMgdGhlIG51bWJlciBvZiBwYWNrZXRzIHJlcXVlc3RlZCB0byBiZSByZXNlbnQgZHVyaW5nIGFuIGFjcXVpc2l0aW9uIHNlc3Npb24uDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVSZWNlaXZlZFJlc2VuZFBhY2tldHMgICAgICJTdGF0dXNJbmZvcm1hdGlvbjo6UmVjZWl2ZWRSZXNlbmRQYWNrZXRzIiAvLyBSZWFkIG9ubHkuIEdldHMgdGhlIG51bWJlciBvZiBwYWNrZXRzIHRoYXQgd2VyZSByZXF1ZXN0ZWQgdG8gYmUgcmVzZW50IGR1cmluZyBhbiBhY3F1aXNpdGlvbiBzZXNzaW9uIGFuZCB3ZXJlIGNvbXBsZXRlZC4NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZUhhbmRsZWRFdmVudENvdW50ICAgICAgICAgIlN0YXR1c0luZm9ybWF0aW9uOjpIYW5kbGVkRXZlbnRDb3VudCIgICAvLyBSZWFkIG9ubHkuIEdldHMgdGhlIG51bWJlciBvZiBoYW5kbGVkIGV2ZW50cyBkdXJpbmcgYW4gYWNxdWlzaXRpb24gc2Vzc2lvbi4NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZUxvc3RFdmVudENvdW50ICAgICAgICAgICAgIlN0YXR1c0luZm9ybWF0aW9uOjpMb3N0RXZlbnRDb3VudCIgICAgICAvLyBSZWFkIG9ubHkuIEdldHMgdGhlIG51bWJlciBvZiBsb3N0IGV2ZW50cyBkdXJpbmcgYW4gYWNxdWlzaXRpb24gc2Vzc2lvbi4NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZUJheWVyR2FpbkIgICAgICAgICAgICAgICAgIkFjcXVpc2l0aW9uQXR0cmlidXRlczo6QmF5ZXI6OkdhaW5CIiAgICAvLyBTZXRzL2dldHMgdGhlIHdoaXRlIGJhbGFuY2UgZ2FpbiBmb3IgdGhlIGJsdWUgY29tcG9uZW50IG9mIHRoZSBCYXllciBjb252ZXJzaW9uLg0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlQmF5ZXJHYWluRyAgICAgICAgICAgICAgICAiQWNxdWlzaXRpb25BdHRyaWJ1dGVzOjpCYXllcjo6R2FpbkciICAgIC8vIFNldHMvZ2V0cyB0aGUgd2hpdGUgYmFsYW5jZSBnYWluIGZvciB0aGUgZ3JlZW4gY29tcG9uZW50IG9mIHRoZSBCYXllciBjb252ZXJzaW9uLg0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlQmF5ZXJHYWluUiAgICAgICAgICAgICAgICAiQWNxdWlzaXRpb25BdHRyaWJ1dGVzOjpCYXllcjo6R2FpblIiICAgIC8vIFNldHMvZ2V0cyB0aGUgd2hpdGUgYmFsYW5jZSBnYWluIGZvciB0aGUgcmVkIGNvbXBvbmVudCBvZiB0aGUgQmF5ZXIgY29udmVyc2lvbi4NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZUJheWVyUGF0dGVybiAgICAgICAgICAgICAgIkFjcXVpc2l0aW9uQXR0cmlidXRlczo6QmF5ZXI6OlBhdHRlcm4iICAvLyBTZXRzL2dldHMgdGhlIEJheWVyIHBhdHRlcm4gdG8gdXNlLg0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlU3RyZWFtQ2hhbm5lbE1vZGUgICAgICAgICAiQWNxdWlzaXRpb25BdHRyaWJ1dGVzOjpDb250cm9sbGVyOjpTdHJlYW1DaGFubmVsTW9kZSIgLy8gR2V0cy9zZXRzIHRoZSBtb2RlIGZvciBhbGxvY2F0aW5nIGEgRmlyZVdpcmUgc3RyZWFtIGNoYW5uZWwuDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVEZXNpcmVkU3RyZWFtQ2hhbm5lbCAgICAgICJBY3F1aXNpdGlvbkF0dHJpYnV0ZXM6OkNvbnRyb2xsZXI6OkRlc2lyZWRTdHJlYW1DaGFubmVsIiAvLyBHZXRzL3NldHMgdGhlIHN0cmVhbSBjaGFubmVsIHRvIG1hbnVhbGx5IGFsbG9jYXRlLg0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlRnJhbWVJbnRlcnZhbCAgICAgICAgICAgICAiQWNxdWlzaXRpb25BdHRyaWJ1dGVzOjpGcmFtZUludGVydmFsIiAgIC8vIFJlYWQgb25seS4gR2V0cyB0aGUgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzIGJldHdlZW4gc3VjY2Vzc2l2ZSBmcmFtZXMuDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVJZ25vcmVGaXJzdEZyYW1lICAgICAgICAgICJBY3F1aXNpdGlvbkF0dHJpYnV0ZXM6Oklnbm9yZUZpcnN0RnJhbWUiIC8vIEdldHMvc2V0cyB0aGUgdmlkZW8gZGVsYXkgb2Ygb25lIGZyYW1lIGJldHdlZW4gc3RhcnRpbmcgdGhlIGNhbWVyYSBhbmQgcmVjZWl2aW5nIHRoZSB2aWRlbyBmZWVkLg0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlT2Zmc2V0WCAgICAgICAgICAgICAgICAgICAiT2Zmc2V0WCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldHMvc2V0cyB0aGUgbGVmdCBvZmZzZXQgb2YgdGhlIGltYWdlLg0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlT2Zmc2V0WSAgICAgICAgICAgICAgICAgICAiT2Zmc2V0WSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldHMvc2V0cyB0aGUgdG9wIG9mZnNldCBvZiB0aGUgaW1hZ2UuDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVXaWR0aCAgICAgICAgICAgICAgICAgICAgICJXaWR0aCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0cy9zZXRzIHRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UuDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVIZWlnaHQgICAgICAgICAgICAgICAgICAgICJIZWlnaHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0cy9zZXRzIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlLg0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlUGl4ZWxGb3JtYXQgICAgICAgICAgICAgICAiUGl4ZWxGb3JtYXQiICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldHMvc2V0cyB0aGUgcGl4ZWwgZm9ybWF0IG9mIHRoZSBzb3VyY2Ugc2Vuc29yLg0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlUGFja2V0U2l6ZSAgICAgICAgICAgICAgICAiUGFja2V0U2l6ZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldHMvc2V0cyB0aGUgcGFja2V0IHNpemUgaW4gYnl0ZXMuDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVQYXlsb2FkU2l6ZSAgICAgICAgICAgICAgICJQYXlsb2FkU2l6ZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0cy9zZXRzIHRoZSBmcmFtZSBzaXplIGluIGJ5dGVzLg0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlU3BlZWQgICAgICAgICAgICAgICAgICAgICAiQWNxdWlzaXRpb25BdHRyaWJ1dGVzOjpTcGVlZCIgICAgICAgICAgIC8vIEdldHMvc2V0cyB0aGUgdHJhbnNmZXIgc3BlZWQgaW4gTWJwcyBmb3IgYSBGaXJlV2lyZSBwYWNrZXQuDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVTaGlmdFBpeGVsQml0cyAgICAgICAgICAgICJBY3F1aXNpdGlvbkF0dHJpYnV0ZXM6OlNoaWZ0UGl4ZWxCaXRzIiAgLy8gR2V0cy9zZXRzIHRoZSBhbGlnbm1lbnQgb2YgMTYtYml0IGNhbWVyYXMuIERvd25zaGlmdCB0aGUgcGl4ZWwgYml0cyBpZiB0aGUgY2FtZXJhIHJldHVybnMgbW9zdCBzaWduaWZpY2FudCBiaXQtYWxpZ25lZCBkYXRhLg0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlU3dhcFBpeGVsQnl0ZXMgICAgICAgICAgICAiQWNxdWlzaXRpb25BdHRyaWJ1dGVzOjpTd2FwUGl4ZWxCeXRlcyIgIC8vIEdldHMvc2V0cyB0aGUgZW5kaWFubmVzcyBvZiAxNi1iaXQgY2FtZXJhcy4gU3dhcCB0aGUgcGl4ZWwgYnl0ZXMgaWYgdGhlIGNhbWVyYSByZXR1cm5zIGxpdHRsZSBlbmRpYW4gZGF0YS4NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZU92ZXJ3cml0ZU1vZGUgICAgICAgICAgICAgIkFjcXVpc2l0aW9uQXR0cmlidXRlczo6T3ZlcndyaXRlTW9kZSIgICAvLyBHZXRzL3NldHMgdGhlIG92ZXJ3cml0ZSBtb2RlLCB1c2VkIHRvIGRldGVybWluZSBhY3F1aXNpdGlvbiB3aGVuIGFuIGltYWdlIHRyYW5zZmVyIGNhbm5vdCBiZSBjb21wbGV0ZWQgZHVlIHRvIGFuIG92ZXJ3cml0dGVuIGludGVybmFsIGJ1ZmZlci4NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZVRpbWVvdXQgICAgICAgICAgICAgICAgICAgIkFjcXVpc2l0aW9uQXR0cmlidXRlczo6VGltZW91dCIgICAgICAgICAvLyBHZXRzL3NldHMgdGhlIHRpbWVvdXQgdmFsdWUgaW4gbWlsbGlzZWNvbmRzLCB1c2VkIHRvIGFib3J0IGFuIGFjcXVpc2l0aW9uIHdoZW4gdGhlIGltYWdlIHRyYW5zZmVyIGNhbm5vdCBiZSBjb21wbGV0ZWQgd2l0aGluIHRoZSBkZWxheS4NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZVZpZGVvTW9kZSAgICAgICAgICAgICAgICAgIkFjcXVpc2l0aW9uQXR0cmlidXRlczo6VmlkZW9Nb2RlIiAgICAgICAvLyBHZXRzL3NldHMgdGhlIHZpZGVvIG1vZGUgZm9yIGEgY2FtZXJhLg0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlQml0c1BlclBpeGVsICAgICAgICAgICAgICAiQWNxdWlzaXRpb25BdHRyaWJ1dGVzOjpCaXRzUGVyUGl4ZWwiICAgIC8vIEdldHMvc2V0cyB0aGUgYWN0dWFsIGJpdHMgcGVyIHBpeGVsLiBGb3IgMTYtYml0IGNvbXBvbmVudHMsIHRoaXMgcmVwcmVzZW50cyB0aGUgYWN0dWFsIGJpdCBkZXB0aCAoMTAtLCAxMi0sIDE0LSwgb3IgMTYtYml0KS4NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZVBpeGVsU2lnbmVkbmVzcyAgICAgICAgICAgIkFjcXVpc2l0aW9uQXR0cmlidXRlczo6UGl4ZWxTaWduZWRuZXNzIiAvLyBHZXRzL3NldHMgdGhlIHNpZ25lZG5lc3Mgb2YgdGhlIHBpeGVsLiBGb3IgMTYtYml0IGNvbXBvbmVudHMsIHRoaXMgcmVwcmVzZW50cyB0aGUgYWN0dWFsIHBpeGVsIHNpZ25lZG5lc3MgKFNpZ25lZCwgb3IgVW5zaWduZWQpLg0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlUmVzZXJ2ZUR1YWxQYWNrZXRzICAgICAgICAiQWNxdWlzaXRpb25BdHRyaWJ1dGVzOjpSZXNlcnZlRHVhbFBhY2tldHMiIC8vIEdldHMvc2V0cyBpZiBkdWFsIHBhY2tldHMgd2lsbCBiZSByZXNlcnZlZCBmb3IgYSB2ZXJ5IGxhcmdlIEZpcmVXaXJlIHBhY2tldC4NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZVJlY2VpdmVUaW1lc3RhbXBNb2RlICAgICAgIkFjcXVpc2l0aW9uQXR0cmlidXRlczo6UmVjZWl2ZVRpbWVzdGFtcE1vZGUiIC8vIEdldHMvc2V0cyB0aGUgbW9kZSBmb3IgdGltZXN0YW1waW5nIGltYWdlcyByZWNlaXZlZCBieSB0aGUgZHJpdmVyLg0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlQWN0dWFsUGVha0JhbmR3aWR0aCAgICAgICAiQWNxdWlzaXRpb25BdHRyaWJ1dGVzOjpBZHZhbmNlZEV0aGVybmV0OjpCYW5kd2lkdGhDb250cm9sOjpBY3R1YWxQZWFrQmFuZHdpZHRoIiAvLyBSZWFkIG9ubHkuIFJldHVybnMgdGhlIGFjdHVhbCBtYXhpbXVtIHBlYWsgYmFuZHdpZHRoIHRoZSBjYW1lcmEgd2lsbCBiZSBjb25maWd1cmVkIHRvIHVzZS4NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZURlc2lyZWRQZWFrQmFuZHdpZHRoICAgICAgIkFjcXVpc2l0aW9uQXR0cmlidXRlczo6QWR2YW5jZWRFdGhlcm5ldDo6QmFuZHdpZHRoQ29udHJvbDo6RGVzaXJlZFBlYWtCYW5kd2lkdGgiIC8vIEdldHMvc2V0cyB0aGUgZGVzaXJlZCBtYXhpbXVtIHBlYWsgYmFuZHdpZHRoIHRoZSBjYW1lcmEgc2hvdWxkIHVzZS4NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZURlc3RpbmF0aW9uTW9kZSAgICAgICAgICAgIkFjcXVpc2l0aW9uQXR0cmlidXRlczo6QWR2YW5jZWRFdGhlcm5ldDo6Q29udHJvbGxlcjo6RGVzdGluYXRpb25Nb2RlIiAvLyBHZXRzL1NldHMgd2hlcmUgdGhlIGNhbWVyYSBpcyBpbnN0cnVjdGVkIHRvIHNlbmQgdGhlIGltYWdlIHN0cmVhbS4NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZURlc3RpbmF0aW9uTXVsdGljYXN0QWRkcmVzcyAiQWNxdWlzaXRpb25BdHRyaWJ1dGVzOjpBZHZhbmNlZEV0aGVybmV0OjpDb250cm9sbGVyOjpEZXN0aW5hdGlvbk11bHRpY2FzdEFkZHJlc3MiIC8vIEdldHMvU2V0cyB0aGUgbXVsdGljYXN0IGFkZHJlc3MgdGhlIGNhbWVyYSBzaG91bGQgc2VuZCBkYXRhIGluIG11bHRpY2FzdCBtb2RlLg0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlRXZlbnRzRW5hYmxlZCAgICAgICAgICAgICAiQWNxdWlzaXRpb25BdHRyaWJ1dGVzOjpBZHZhbmNlZEV0aGVybmV0OjpFdmVudFBhcmFtZXRlcnM6OkV2ZW50c0VuYWJsZWQiIC8vIEdldHMvU2V0cyBpZiBldmVudHMgd2lsbCBiZSBoYW5kbGVkLg0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlTWF4T3V0c3RhbmRpbmdFdmVudHMgICAgICAiQWNxdWlzaXRpb25BdHRyaWJ1dGVzOjpBZHZhbmNlZEV0aGVybmV0OjpFdmVudFBhcmFtZXRlcnM6Ok1heE91dHN0YW5kaW5nRXZlbnRzIiAvLyBHZXRzL1NldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIG91dHN0YW5kaW5nIGV2ZW50cyB0byBxdWV1ZS4NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZVRlc3RQYWNrZXRFbmFibGVkICAgICAgICAgIkFjcXVpc2l0aW9uQXR0cmlidXRlczo6QWR2YW5jZWRFdGhlcm5ldDo6VGVzdFBhY2tldFBhcmFtZXRlcnM6OlRlc3RQYWNrZXRFbmFibGVkIiAvLyBHZXRzL1NldHMgd2hldGhlciB0aGUgZHJpdmVyIHdpbGwgdmFsaWRhdGUgdGhlIGltYWdlIHN0cmVhbWluZyBzZXR0aW5ncyB1c2luZyB0ZXN0IHBhY2tldHMgcHJpb3IgdG8gYW4gYWNxdWlzaXRpb24NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZVRlc3RQYWNrZXRUaW1lb3V0ICAgICAgICAgIkFjcXVpc2l0aW9uQXR0cmlidXRlczo6QWR2YW5jZWRFdGhlcm5ldDo6VGVzdFBhY2tldFBhcmFtZXRlcnM6OlRlc3RQYWNrZXRUaW1lb3V0IiAvLyBHZXRzL1NldHMgdGhlIHRpbWVvdXQgZm9yIHZhbGlkYXRpbmcgdGVzdCBwYWNrZXQgcmVjZXB0aW9uIChpZiBlbmFibGVkKQ0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlTWF4VGVzdFBhY2tldFJldHJpZXMgICAgICAiQWNxdWlzaXRpb25BdHRyaWJ1dGVzOjpBZHZhbmNlZEV0aGVybmV0OjpUZXN0UGFja2V0UGFyYW1ldGVyczo6TWF4VGVzdFBhY2tldFJldHJpZXMiIC8vIEdldHMvU2V0cyB0aGUgbnVtYmVyIG9mIHJldHJpZXMgZm9yIHZhbGlkYXRpbmcgdGVzdCBwYWNrZXQgcmVjZXB0aW9uIChpZiBlbmFibGVkKQ0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlQ2h1bmtEYXRhRGVjb2RpbmdFbmFibGVkICAiQWNxdWlzaXRpb25BdHRyaWJ1dGVzOjpDaHVua0RhdGFEZWNvZGluZzo6Q2h1bmtEYXRhRGVjb2RpbmdFbmFibGVkIiAvLyBHZXRzL1NldHMgd2hldGhlciB0aGUgZHJpdmVyIHdpbGwgZGVjb2RlIGFueSBjaHVuayBkYXRhIGluIHRoZSBpbWFnZSBzdHJlYW0NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZUNodW5rRGF0YURlY29kaW5nTWF4RWxlbWVudFNpemUgIkFjcXVpc2l0aW9uQXR0cmlidXRlczo6Q2h1bmtEYXRhRGVjb2Rpbmc6Ok1heGltdW1DaHVua0NvcHlTaXplIiAvLyBHZXRzL1NldHMgdGhlIG1heGltdW0gc2l6ZSBvZiBhbnkgc2luZ2xlIGNodW5rIGRhdGEgZWxlbWVudCB0aGF0IHdpbGwgYmUgbWFkZSBhdmFpbGFibGUNCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZUxvc3RQYWNrZXRNb2RlICAgICAgICAgICAgIkFjcXVpc2l0aW9uQXR0cmlidXRlczo6QWR2YW5jZWRFdGhlcm5ldDo6TG9zdFBhY2tldE1vZGUiIC8vIEdldHMvc2V0cyB0aGUgYmVoYXZpb3Igd2hlbiB0aGUgdXNlciBleHRyYWN0cyBhIGJ1ZmZlciB0aGF0IGhhcyBtaXNzaW5nIHBhY2tldHMuDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVNZW1vcnlXaW5kb3dTaXplICAgICAgICAgICJBY3F1aXNpdGlvbkF0dHJpYnV0ZXM6OkFkdmFuY2VkRXRoZXJuZXQ6OlJlc2VuZFBhcmFtZXRlcnM6Ok1lbW9yeVdpbmRvd1NpemUiIC8vIEdldHMvc2V0cyB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IHdpbmRvdyBvZiB0aGUgY2FtZXJhIGluIGtpbG9ieXRlcy4gU2hvdWxkIG1hdGNoIHRoZSBjYW1lcmEncyBpbnRlcm5hbCBidWZmZXIgc2l6ZS4NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZVJlc2VuZHNFbmFibGVkICAgICAgICAgICAgIkFjcXVpc2l0aW9uQXR0cmlidXRlczo6QWR2YW5jZWRFdGhlcm5ldDo6UmVzZW5kUGFyYW1ldGVyczo6UmVzZW5kc0VuYWJsZWQiIC8vIEdldHMvc2V0cyBpZiByZXNlbmRzIHdpbGwgYmUgaXNzdWVkIGZvciBtaXNzaW5nIHBhY2tldHMuDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVSZXNlbmRUaHJlc2hvbGRQZXJjZW50YWdlICJBY3F1aXNpdGlvbkF0dHJpYnV0ZXM6OkFkdmFuY2VkRXRoZXJuZXQ6OlJlc2VuZFBhcmFtZXRlcnM6OlJlc2VuZFRocmVzaG9sZFBlcmNlbnRhZ2UiIC8vIEdldHMvc2V0cyB0aGUgdGhyZXNob2xkIG9mIHRoZSBwYWNrZXQgcHJvY2Vzc2luZyB3aW5kb3cgdGhhdCB3aWxsIHRyaWdnZXIgcGFja2V0cyB0byBiZSByZXNlbnQuDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVSZXNlbmRCYXRjaGluZ1BlcmNlbnRhZ2UgICJBY3F1aXNpdGlvbkF0dHJpYnV0ZXM6OkFkdmFuY2VkRXRoZXJuZXQ6OlJlc2VuZFBhcmFtZXRlcnM6OlJlc2VuZEJhdGNoaW5nUGVyY2VudGFnZSIgLy8gR2V0cy9zZXRzIHRoZSBwZXJjZW50IG9mIHRoZSBwYWNrZXQgcmVzZW5kIHRocmVzaG9sZCB0aGF0IHdpbGwgYmUgaXNzdWVkIGFzIG9uZSBncm91cCBwYXN0IHRoZSBpbml0aWFsIHRocmVzaG9sZCBzZW50IGluIGEgc2luZ2xlIHJlcXVlc3QuDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVNYXhSZXNlbmRzUGVyUGFja2V0ICAgICAgICJBY3F1aXNpdGlvbkF0dHJpYnV0ZXM6OkFkdmFuY2VkRXRoZXJuZXQ6OlJlc2VuZFBhcmFtZXRlcnM6Ok1heFJlc2VuZHNQZXJQYWNrZXQiIC8vIEdldHMvc2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmVzZW5kIHJlcXVlc3RzIHRoYXQgd2lsbCBiZSBpc3N1ZWQgZm9yIGEgbWlzc2luZyBwYWNrZXQuDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVSZXNlbmRSZXNwb25zZVRpbWVvdXQgICAgICJBY3F1aXNpdGlvbkF0dHJpYnV0ZXM6OkFkdmFuY2VkRXRoZXJuZXQ6OlJlc2VuZFBhcmFtZXRlcnM6OlJlc2VuZFJlc3BvbnNlVGltZW91dCIgLy8gR2V0cy9zZXRzIHRoZSB0aW1lIHRvIHdhaXQgZm9yIGEgcmVzZW5kIHJlcXVlc3QgdG8gYmUgc2F0aXNmaWVkIGJlZm9yZSBzZW5kaW5nIGFub3RoZXIuDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVOZXdQYWNrZXRUaW1lb3V0ICAgICAgICAgICJBY3F1aXNpdGlvbkF0dHJpYnV0ZXM6OkFkdmFuY2VkRXRoZXJuZXQ6OlJlc2VuZFBhcmFtZXRlcnM6Ok5ld1BhY2tldFRpbWVvdXQiIC8vIEdldHMvc2V0cyB0aGUgdGltZSB0byB3YWl0IGZvciBuZXcgcGFja2V0cyB0byBhcnJpdmUgaW4gYSBwYXJ0aWFsbHkgY29tcGxldGVkIGltYWdlIGJlZm9yZSBhc3N1bWluZyB0aGUgcmVzdCBvZiB0aGUgaW1hZ2Ugd2FzIGxvc3QuDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVNaXNzaW5nUGFja2V0VGltZW91dCAgICAgICJBY3F1aXNpdGlvbkF0dHJpYnV0ZXM6OkFkdmFuY2VkRXRoZXJuZXQ6OlJlc2VuZFBhcmFtZXRlcnM6Ok1pc3NpbmdQYWNrZXRUaW1lb3V0IiAvLyBHZXRzL3NldHMgdGhlIHRpbWUgdG8gd2FpdCBmb3IgYSBtaXNzaW5nIHBhY2tldCBiZWZvcmUgaXNzdWluZyBhIHJlc2VuZC4NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZVJlc2VuZFRpbWVyUmVzb2x1dGlvbiAgICAgIkFjcXVpc2l0aW9uQXR0cmlidXRlczo6QWR2YW5jZWRFdGhlcm5ldDo6UmVzZW5kUGFyYW1ldGVyczo6UmVzZW5kVGltZXJSZXNvbHV0aW9uIiAvLyBHZXRzL3NldHMgdGhlIHJlc29sdXRpb24gb2YgdGhlIHBhY2tldCBwcm9jZXNzaW5nIHN5c3RlbSB0aGF0IGlzIHVzZWQgZm9yIGFsbCBwYWNrZXQtcmVsYXRlZCB0aW1lb3V0cy4NCisNCisNCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKy8vICBGdW5jdGlvbnMNCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4U25hcChJTUFRZHhTZXNzaW9uIGlkLCBJbWFnZSogaW1hZ2UpOw0KK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4Q29uZmlndXJlR3JhYihJTUFRZHhTZXNzaW9uIGlkKTsNCitJTUFRZHhFcnJvciBOSV9GVU5DIElNQVFkeEdyYWIoSU1BUWR4U2Vzc2lvbiBpZCwgSW1hZ2UqIGltYWdlLCBib29sMzIgd2FpdEZvck5leHRCdWZmZXIsIHVJbnQzMiogYWN0dWFsQnVmZmVyTnVtYmVyKTsNCitJTUFRZHhFcnJvciBOSV9GVU5DIElNQVFkeFNlcXVlbmNlKElNQVFkeFNlc3Npb24gaWQsIEltYWdlKiBpbWFnZXNbXSwgdUludDMyIGNvdW50KTsNCitJTUFRZHhFcnJvciBOSV9GVU5DIElNQVFkeERpc2NvdmVyRXRoZXJuZXRDYW1lcmFzKGNvbnN0IGNoYXIqIGFkZHJlc3MsIHVJbnQzMiB0aW1lb3V0KTsNCitJTUFRZHhFcnJvciBOSV9GVU5DIElNQVFkeEVudW1lcmF0ZUNhbWVyYXMoSU1BUWR4Q2FtZXJhSW5mb3JtYXRpb24gY2FtZXJhSW5mb3JtYXRpb25BcnJheVtdLCB1SW50MzIqIGNvdW50LCBib29sMzIgY29ubmVjdGVkT25seSk7DQorSU1BUWR4RXJyb3IgTklfRlVOQyBJTUFRZHhSZXNldENhbWVyYShjb25zdCBjaGFyKiBuYW1lLCBib29sMzIgcmVzZXRBbGwpOw0KK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4T3BlbkNhbWVyYShjb25zdCBjaGFyKiBuYW1lLCBJTUFRZHhDYW1lcmFDb250cm9sTW9kZSBtb2RlLCBJTUFRZHhTZXNzaW9uKiBpZCk7DQorSU1BUWR4RXJyb3IgTklfRlVOQyBJTUFRZHhDbG9zZUNhbWVyYShJTUFRZHhTZXNzaW9uIGlkKTsNCitJTUFRZHhFcnJvciBOSV9GVU5DIElNQVFkeENvbmZpZ3VyZUFjcXVpc2l0aW9uKElNQVFkeFNlc3Npb24gaWQsIGJvb2wzMiBjb250aW51b3VzLCB1SW50MzIgYnVmZmVyQ291bnQpOw0KK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4U3RhcnRBY3F1aXNpdGlvbihJTUFRZHhTZXNzaW9uIGlkKTsNCitJTUFRZHhFcnJvciBOSV9GVU5DIElNQVFkeEdldEltYWdlKElNQVFkeFNlc3Npb24gaWQsIEltYWdlKiBpbWFnZSwgSU1BUWR4QnVmZmVyTnVtYmVyTW9kZSBtb2RlLCB1SW50MzIgZGVzaXJlZEJ1ZmZlck51bWJlciwgdUludDMyKiBhY3R1YWxCdWZmZXJOdW1iZXIpOw0KK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4R2V0SW1hZ2VEYXRhKElNQVFkeFNlc3Npb24gaWQsIHZvaWQqIGJ1ZmZlciwgdUludDMyIGJ1ZmZlclNpemUsIElNQVFkeEJ1ZmZlck51bWJlck1vZGUgbW9kZSwgdUludDMyIGRlc2lyZWRCdWZmZXJOdW1iZXIsIHVJbnQzMiogYWN0dWFsQnVmZmVyTnVtYmVyKTsNCitJTUFRZHhFcnJvciBOSV9GVU5DIElNQVFkeFN0b3BBY3F1aXNpdGlvbihJTUFRZHhTZXNzaW9uIGlkKTsNCitJTUFRZHhFcnJvciBOSV9GVU5DIElNQVFkeFVuY29uZmlndXJlQWNxdWlzaXRpb24oSU1BUWR4U2Vzc2lvbiBpZCk7DQorSU1BUWR4RXJyb3IgTklfRlVOQyBJTUFRZHhFbnVtZXJhdGVWaWRlb01vZGVzKElNQVFkeFNlc3Npb24gaWQsIElNQVFkeFZpZGVvTW9kZSB2aWRlb01vZGVBcnJheVtdLCB1SW50MzIqIGNvdW50LCB1SW50MzIqIGN1cnJlbnRNb2RlKTsNCitJTUFRZHhFcnJvciBOSV9GVU5DIElNQVFkeEVudW1lcmF0ZUF0dHJpYnV0ZXMoSU1BUWR4U2Vzc2lvbiBpZCwgSU1BUWR4QXR0cmlidXRlSW5mb3JtYXRpb24gYXR0cmlidXRlSW5mb3JtYXRpb25BcnJheVtdLCB1SW50MzIqIGNvdW50LCBjb25zdCBjaGFyKiByb290KTsNCitJTUFRZHhFcnJvciBOSV9GVU5DIElNQVFkeEdldEF0dHJpYnV0ZShJTUFRZHhTZXNzaW9uIGlkLCBjb25zdCBjaGFyKiBuYW1lLCBJTUFRZHhWYWx1ZVR5cGUgdHlwZSwgdm9pZCogdmFsdWUpOw0KK0lNQVFkeEVycm9yIE5JX0ZVTkNDIElNQVFkeFNldEF0dHJpYnV0ZShJTUFRZHhTZXNzaW9uIGlkLCBjb25zdCBjaGFyKiBuYW1lLCBJTUFRZHhWYWx1ZVR5cGUgdHlwZSwgLi4uKTsNCitJTUFRZHhFcnJvciBOSV9GVU5DIElNQVFkeEdldEF0dHJpYnV0ZU1pbmltdW0oSU1BUWR4U2Vzc2lvbiBpZCwgY29uc3QgY2hhciogbmFtZSwgSU1BUWR4VmFsdWVUeXBlIHR5cGUsIHZvaWQqIHZhbHVlKTsNCitJTUFRZHhFcnJvciBOSV9GVU5DIElNQVFkeEdldEF0dHJpYnV0ZU1heGltdW0oSU1BUWR4U2Vzc2lvbiBpZCwgY29uc3QgY2hhciogbmFtZSwgSU1BUWR4VmFsdWVUeXBlIHR5cGUsIHZvaWQqIHZhbHVlKTsNCitJTUFRZHhFcnJvciBOSV9GVU5DIElNQVFkeEdldEF0dHJpYnV0ZUluY3JlbWVudChJTUFRZHhTZXNzaW9uIGlkLCBjb25zdCBjaGFyKiBuYW1lLCBJTUFRZHhWYWx1ZVR5cGUgdHlwZSwgdm9pZCogdmFsdWUpOw0KK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4R2V0QXR0cmlidXRlVHlwZShJTUFRZHhTZXNzaW9uIGlkLCBjb25zdCBjaGFyKiBuYW1lLCBJTUFRZHhBdHRyaWJ1dGVUeXBlKiB0eXBlKTsNCitJTUFRZHhFcnJvciBOSV9GVU5DIElNQVFkeElzQXR0cmlidXRlUmVhZGFibGUoSU1BUWR4U2Vzc2lvbiBpZCwgY29uc3QgY2hhciogbmFtZSwgYm9vbDMyKiByZWFkYWJsZSk7DQorSU1BUWR4RXJyb3IgTklfRlVOQyBJTUFRZHhJc0F0dHJpYnV0ZVdyaXRhYmxlKElNQVFkeFNlc3Npb24gaWQsIGNvbnN0IGNoYXIqIG5hbWUsIGJvb2wzMiogd3JpdGFibGUpOw0KK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4RW51bWVyYXRlQXR0cmlidXRlVmFsdWVzKElNQVFkeFNlc3Npb24gaWQsIGNvbnN0IGNoYXIqIG5hbWUsIElNQVFkeEVudW1JdGVtIGxpc3RbXSwgdUludDMyKiBzaXplKTsNCitJTUFRZHhFcnJvciBOSV9GVU5DIElNQVFkeEdldEF0dHJpYnV0ZVRvb2x0aXAoSU1BUWR4U2Vzc2lvbiBpZCwgY29uc3QgY2hhciogbmFtZSwgY2hhciogdG9vbHRpcCwgdUludDMyIGxlbmd0aCk7DQorSU1BUWR4RXJyb3IgTklfRlVOQyBJTUFRZHhHZXRBdHRyaWJ1dGVVbml0cyhJTUFRZHhTZXNzaW9uIGlkLCBjb25zdCBjaGFyKiBuYW1lLCBjaGFyKiB1bml0cywgdUludDMyIGxlbmd0aCk7DQorSU1BUWR4RXJyb3IgTklfRlVOQyBJTUFRZHhSZWdpc3RlckZyYW1lRG9uZUV2ZW50KElNQVFkeFNlc3Npb24gaWQsIHVJbnQzMiBidWZmZXJJbnRlcnZhbCwgRnJhbWVEb25lRXZlbnRDYWxsYmFja1B0ciBjYWxsYmFja0Z1bmN0aW9uLCB2b2lkKiBjYWxsYmFja0RhdGEpOw0KK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4UmVnaXN0ZXJQbnBFdmVudChJTUFRZHhTZXNzaW9uIGlkLCBJTUFRZHhQbnBFdmVudCBldmVudCwgUG5wRXZlbnRDYWxsYmFja1B0ciBjYWxsYmFja0Z1bmN0aW9uLCB2b2lkKiBjYWxsYmFja0RhdGEpOw0KK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4V3JpdGVSZWdpc3RlcihJTUFRZHhTZXNzaW9uIGlkLCB1SW50MzIgb2Zmc2V0LCB1SW50MzIgdmFsdWUpOw0KK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4UmVhZFJlZ2lzdGVyKElNQVFkeFNlc3Npb24gaWQsIHVJbnQzMiBvZmZzZXQsIHVJbnQzMiogdmFsdWUpOw0KK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4V3JpdGVNZW1vcnkoSU1BUWR4U2Vzc2lvbiBpZCwgdUludDMyIG9mZnNldCwgY29uc3QgY2hhciogdmFsdWVzLCB1SW50MzIgY291bnQpOw0KK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4UmVhZE1lbW9yeShJTUFRZHhTZXNzaW9uIGlkLCB1SW50MzIgb2Zmc2V0LCBjaGFyKiB2YWx1ZXMsIHVJbnQzMiBjb3VudCk7DQorSU1BUWR4RXJyb3IgTklfRlVOQyBJTUFRZHhHZXRFcnJvclN0cmluZyhJTUFRZHhFcnJvciBlcnJvciwgY2hhciogbWVzc2FnZSwgdUludDMyIG1lc3NhZ2VMZW5ndGgpOw0KK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4V3JpdGVBdHRyaWJ1dGVzKElNQVFkeFNlc3Npb24gaWQsIGNvbnN0IGNoYXIqIGZpbGVuYW1lKTsNCitJTUFRZHhFcnJvciBOSV9GVU5DIElNQVFkeFJlYWRBdHRyaWJ1dGVzKElNQVFkeFNlc3Npb24gaWQsIGNvbnN0IGNoYXIqIGZpbGVuYW1lKTsNCitJTUFRZHhFcnJvciBOSV9GVU5DIElNQVFkeFJlc2V0RXRoZXJuZXRDYW1lcmFBZGRyZXNzKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIGFkZHJlc3MsIGNvbnN0IGNoYXIqIHN1Ym5ldCwgY29uc3QgY2hhciogZ2F0ZXdheSwgdUludDMyIHRpbWVvdXQpOw0KK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4RW51bWVyYXRlQXR0cmlidXRlczIoSU1BUWR4U2Vzc2lvbiBpZCwgSU1BUWR4QXR0cmlidXRlSW5mb3JtYXRpb24gYXR0cmlidXRlSW5mb3JtYXRpb25BcnJheVtdLCB1SW50MzIqIGNvdW50LCBjb25zdCBjaGFyKiByb290LCBJTUFRZHhBdHRyaWJ1dGVWaXNpYmlsaXR5IHZpc2liaWxpdHkpOw0KK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4R2V0QXR0cmlidXRlVmlzaWJpbGl0eShJTUFRZHhTZXNzaW9uIGlkLCBjb25zdCBjaGFyKiBuYW1lLCBJTUFRZHhBdHRyaWJ1dGVWaXNpYmlsaXR5KiB2aXNpYmlsaXR5KTsNCitJTUFRZHhFcnJvciBOSV9GVU5DIElNQVFkeEdldEF0dHJpYnV0ZURlc2NyaXB0aW9uKElNQVFkeFNlc3Npb24gaWQsIGNvbnN0IGNoYXIqIG5hbWUsIGNoYXIqIGRlc2NyaXB0aW9uLCB1SW50MzIgbGVuZ3RoKTsNCitJTUFRZHhFcnJvciBOSV9GVU5DIElNQVFkeEdldEF0dHJpYnV0ZURpc3BsYXlOYW1lKElNQVFkeFNlc3Npb24gaWQsIGNvbnN0IGNoYXIqIG5hbWUsIGNoYXIqIGRpc3BsYXlOYW1lLCB1SW50MzIgbGVuZ3RoKTsNCitJTUFRZHhFcnJvciBOSV9GVU5DIElNQVFkeERpc3Bvc2Uodm9pZCogYnVmZmVyKTsNCitJTUFRZHhFcnJvciBOSV9GVU5DIElNQVFkeFJlZ2lzdGVyQXR0cmlidXRlVXBkYXRlZEV2ZW50KElNQVFkeFNlc3Npb24gaWQsIGNvbnN0IGNoYXIqIG5hbWUsIEF0dHJpYnV0ZVVwZGF0ZWRFdmVudENhbGxiYWNrUHRyIGNhbGxiYWNrRnVuY3Rpb24sIHZvaWQqIGNhbGxiYWNrRGF0YSk7DQorSU1BUWR4RXJyb3IgTklfRlVOQyBJTUFRZHhFbnVtZXJhdGVBdHRyaWJ1dGVzMyhJTUFRZHhTZXNzaW9uIGlkLCBJTUFRZHhBdHRyaWJ1dGVJbmZvcm1hdGlvbiBhdHRyaWJ1dGVJbmZvcm1hdGlvbkFycmF5W10sIHVJbnQzMiogY291bnQsIGNvbnN0IGNoYXIqIHJvb3QsIElNQVFkeEF0dHJpYnV0ZVZpc2liaWxpdHkgdmlzaWJpbGl0eSk7DQorDQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorfQ0KKyNlbmRpZg0KKw0KKw0KKyNlbmRpZiAvLyBfX19uaWltYXFkeF9oX19fDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvTmV0d29ya0NvbW11bmljYXRpb24vQUlDYWxpYnJhdGlvbi5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvTmV0d29ya0NvbW11bmljYXRpb24vQUlDYWxpYnJhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZjM2NmMKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9OZXR3b3JrQ29tbXVuaWNhdGlvbi9BSUNhbGlicmF0aW9uLmgKQEAgLTAsMCArMSwxOSBAQAorDQorI2lmbmRlZiBfX0FJQ2FsaWJyYXRpb25faF9fDQorI2RlZmluZSBfX0FJQ2FsaWJyYXRpb25faF9fDQorDQorI2luY2x1ZGUgPHN0ZGludC5oPg0KKw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK2V4dGVybiAiQyINCit7DQorI2VuZGlmDQorDQorCXVpbnQzMl90IEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9uQUlDYWxpYnJhdGlvbl9nZXRMU0JXZWlnaHQoY29uc3QgdWludDMyX3QgYWlTeXN0ZW1JbmRleCwgY29uc3QgdWludDMyX3QgY2hhbm5lbCwgaW50MzJfdCAqc3RhdHVzKTsNCisJaW50MzJfdCBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fbkFJQ2FsaWJyYXRpb25fZ2V0T2Zmc2V0KGNvbnN0IHVpbnQzMl90IGFpU3lzdGVtSW5kZXgsIGNvbnN0IHVpbnQzMl90IGNoYW5uZWwsIGludDMyX3QgKnN0YXR1cyk7DQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorfQ0KKyNlbmRpZg0KKw0KKyNlbmRpZiAvLyBfX0FJQ2FsaWJyYXRpb25faF9fDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvTmV0d29ya0NvbW11bmljYXRpb24vQ0FOSW50ZXJmYWNlUGx1Z2luLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9OZXR3b3JrQ29tbXVuaWNhdGlvbi9DQU5JbnRlcmZhY2VQbHVnaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGM0MDY0Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvTmV0d29ya0NvbW11bmljYXRpb24vQ0FOSW50ZXJmYWNlUGx1Z2luLmgKQEAgLTAsMCArMSw4MCBAQAorLy8gQ0FOSW50ZXJmYWNlUGx1Z2luLmgNCisvLw0KKy8vICBEZWZpbmVzIHRoZSBBUEkgZm9yIGJ1aWxkaW5nIGEgQ0FOIEludGVyZmFjZSBQbHVnaW4gdG8gc3VwcG9ydA0KKy8vICAgIFBXTS1jYWJsZS1mcmVlIENBTiBtb3RvciBjb250cm9sIG9uIEZSQyByb2JvdHMuICBUaGlzIGFsbG93cyB5b3UNCisvLyAgICB0byBjb25uZWN0IGFueSBDQU4gaW50ZXJmYWNlIHRvIHRoZSBzZWN1cmUgSmFndWFyIENBTiBkcml2ZXIuDQorLy8NCisNCisjaWZuZGVmIF9fQ0FOSW50ZXJmYWNlUGx1Z2luX2hfXw0KKyNkZWZpbmUgX19DQU5JbnRlcmZhY2VQbHVnaW5faF9fDQorDQorI2luY2x1ZGUgPHN0ZGludC5oPg0KKw0KKyNkZWZpbmUgQ0FOX0lTX0ZSQU1FX1JFTU9URSAweDgwMDAwMDAwDQorI2RlZmluZSBDQU5fSVNfRlJBTUVfMTFCSVQgIDB4NDAwMDAwMDANCisjZGVmaW5lIENBTl8yOUJJVF9NRVNTQUdFX0lEX01BU0sgMHgxRkZGRkZGRg0KKyNkZWZpbmUgQ0FOXzExQklUX01FU1NBR0VfSURfTUFTSyAweDAwMDAwN0ZGDQorDQorY2xhc3MgQ0FOSW50ZXJmYWNlUGx1Z2luDQorew0KK3B1YmxpYzoNCisJQ0FOSW50ZXJmYWNlUGx1Z2luKCkge30NCisJdmlydHVhbCB+Q0FOSW50ZXJmYWNlUGx1Z2luKCkge30NCisNCisJLyoqDQorCSAqIFRoaXMgZW50cnktcG9pbnQgb2YgdGhlIENBTkludGVyZmFjZVBsdWdpbiBpcyBwYXNzZWQgYSBtZXNzYWdlIHRoYXQgdGhlIGRyaXZlciBuZWVkcyB0byBzZW5kIHRvDQorCSAqIGEgZGV2aWNlIG9uIHRoZSBDQU4gYnVzLg0KKwkgKiANCisJICogVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGZyb20gbXVsdGlwbGUgY29udGV4dHMgYW5kIG11c3QgdGhlcmVmb3JlIGJlIHJlZW50cmFudC4NCisJICogDQorCSAqIEBwYXJhbSBtZXNzYWdlSUQgVGhlIDI5LWJpdCBDQU4gbWVzc2FnZSBJRCBpbiB0aGUgbHNicy4gIFRoZSBtc2IgY2FuIGluZGljYXRlIGEgcmVtb3RlIGZyYW1lLg0KKwkgKiBAcGFyYW0gZGF0YSBBIHBvaW50ZXIgdG8gYSBidWZmZXIgY29udGFpbmluZyBiZXR3ZWVuIDAgYW5kIDggYnl0ZXMgdG8gc2VuZCB3aXRoIHRoZSBtZXNzYWdlLiAgTWF5IGJlIE5VTEwgaWYgZGF0YVNpemUgaXMgMC4NCisJICogQHBhcmFtIGRhdGFTaXplIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gc2VuZCB3aXRoIHRoZSBtZXNzYWdlLg0KKwkgKiBAcmV0dXJuIFJldHVybiBhbnkgZXJyb3IgY29kZS4gIE9uIHN1Y2Nlc3MgcmV0dXJuIDAuDQorCSAqLw0KKwl2aXJ0dWFsIGludDMyX3Qgc2VuZE1lc3NhZ2UodWludDMyX3QgbWVzc2FnZUlELCBjb25zdCB1aW50OF90ICpkYXRhLCB1aW50OF90IGRhdGFTaXplKSA9IDA7DQorDQorCS8qKg0KKwkgKiBUaGlzIGVudHJ5LXBvaW50IG9mIHRoZSBDQU5JbnRlcmZhY2VQbHVnaW4gaXMgcGFzc2VkIGJ1ZmZlcnMgd2hpY2ggc2hvdWxkIGJlIHBvcHVsYXRlZCB3aXRoDQorCSAqIGFueSByZWNlaXZlZCBtZXNzYWdlcyBmcm9tIGRldmljZXMgb24gdGhlIENBTiBidXMuDQorCSAqIA0KKwkgKiBUaGlzIGZ1bmN0aW9uIGlzIGFsd2F5cyBjYWxsZWQgYnkgYSBzaW5nbGUgdGFzayBpbiB0aGUgSmFndWFyIGRyaXZlciwgc28gaXQgbmVlZCBub3QgYmUgcmVlbnRyYW50Lg0KKwkgKiANCisJICogVGhpcyBmdW5jdGlvbiBpcyBleHBlY3RlZCB0byBibG9jayBmb3Igc29tZSBwZXJpb2Qgb2YgdGltZSB3YWl0aW5nIGZvciBhIG1lc3NhZ2UgZnJvbSB0aGUgQ0FOIGJ1cy4NCisJICogSXQgbWF5IHRpbWVvdXQgcGVyaW9kaWNhbGx5IChyZXR1cm5pbmcgbm9uLXplcm8gdG8gaW5kaWNhdGUgbm8gbWVzc2FnZSB3YXMgcG9wdWxhdGVkKSB0byBhbGxvdyBmb3INCisJICogc2h1dGRvd24gYW5kIHVubG9hZGluZyBvZiB0aGUgcGx1Z2luLg0KKwkgKiANCisJICogQHBhcmFtIG1lc3NhZ2VJRCBBIHJlZmVyZW5jZSB0byBiZSBwb3B1bGF0ZWQgd2l0aCBhIHJlY2VpdmVkIDI5LWJpdCBDQU4gbWVzc2FnZSBJRCBpbiB0aGUgbHNicy4NCisJICogQHBhcmFtIGRhdGEgQSBwb2ludGVyIHRvIGEgYnVmZmVyIG9mIDggYnl0ZXMgdG8gYmUgcG9wdWxhdGVkIHdpdGggZGF0YSByZWNlaXZlZCB3aXRoIHRoZSBtZXNzYWdlLg0KKwkgKiBAcGFyYW0gZGF0YVNpemUgQSByZWZlcmVuY2UgdG8gYmUgcG9wdWxhdGVkIHdpdGggdGhlIHNpemUgb2YgdGhlIGRhdGEgcmVjZWl2ZWQgKDAgLSA4IGJ5dGVzKS4NCisJICogQHJldHVybiBUaGlzIHNob3VsZCByZXR1cm4gMCBpZiBhIG1lc3NhZ2Ugd2FzIHBvcHVsYXRlZCwgbm9uLTAgaWYgbm8gbWVzc2FnZSB3YXMgbm90IHBvcHVsYXRlZC4NCisJICovDQorCXZpcnR1YWwgaW50MzJfdCByZWNlaXZlTWVzc2FnZSh1aW50MzJfdCAmbWVzc2FnZUlELCB1aW50OF90ICpkYXRhLCB1aW50OF90ICZkYXRhU2l6ZSkgPSAwOw0KKw0KKwkvKioNCisJICogVGhpcyBlbnRyeS1wb2ludCBvZiB0aGUgQ0FOSW50ZXJmYWNlUGx1Z2luIHJldHVybnMgc3RhdHVzIG9mIHRoZSBDQU4gYnVzLg0KKwkgKiANCisJICogVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGZyb20gbXVsdGlwbGUgY29udGV4dHMgYW5kIG11c3QgdGhlcmVmb3JlIGJlIHJlZW50cmFudC4NCisJICogDQorCSAqIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gZGV0YWlsZWQgaGFyZHdhcmUgc3RhdHVzIGlmIGF2YWlsYWJsZSBmb3IgZGlhZ25vc3RpY3Mgb2YgdGhlIENBTiBpbnRlcmZhY2UuDQorCSAqIA0KKwkgKiBAcGFyYW0gYnVzT2ZmQ291bnQgVGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IHNlbmRNZXNzYWdlIGZhaWxlZCB3aXRoIGEgYnVzT2ZmIGVycm9yIGluZGljYXRpbmcgdGhhdCBtZXNzYWdlcw0KKwkgKiAgYXJlIG5vdCBzdWNjZXNzZnVsbHkgdHJhbnNtaXR0ZWQgb24gdGhlIGJ1cy4NCisJICogQHBhcmFtIHR4RnVsbENvdW50IFRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCBzZW5kTWVzc2FnZSBmYWlsZWQgd2l0aCBhIHR4Rmlmb0Z1bGwgZXJyb3IgaW5kaWNhdGluZyB0aGF0IG1lc3NhZ2VzDQorCSAqICBhcmUgbm90IHN1Y2Nlc3NmdWxseSByZWNlaXZlZCBieSBhbnkgQ0FOIGRldmljZS4NCisJICogQHBhcmFtIHJlY2VpdmVFcnJvckNvdW50IFRoZSBjb3VudCBvZiByZWNlaXZlIGVycm9ycyBhcyByZXBvcnRlZCBieSB0aGUgQ0FOIGRyaXZlci4NCisJICogQHBhcmFtIHRyYW5zbWl0RXJyb3JDb3VudCBUaGUgY291bnQgb2YgdHJhbnNtaXQgZXJyb3JzIGFzIHJlcG9ydGVkIGJ5IHRoZSBDQU4gZHJpdmVyLg0KKwkgKiBAcmV0dXJuIFRoaXMgc2hvdWxkIHJldHVybiAwIGlmIGFsbCBzdGF0dXMgd2FzIHJldHJpZXZlZCBzdWNjZXNzZnVsbHkgb3IgYW4gZXJyb3IgY29kZSBpZiBub3QuDQorCSAqLw0KKwl2aXJ0dWFsIGludDMyX3QgZ2V0U3RhdHVzKHVpbnQzMl90ICZidXNPZmZDb3VudCwgdWludDMyX3QgJnR4RnVsbENvdW50LCB1aW50MzJfdCAmcmVjZWl2ZUVycm9yQ291bnQsIHVpbnQzMl90ICZ0cmFuc21pdEVycm9yQ291bnQpIHtyZXR1cm4gMDt9DQorfTsNCisNCisvKioNCisgKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyB5b3UgdG8gcmVnaXN0ZXIgYSBDQU5JbnRlcmZhY2VQbHVnaW4gdG8gcHJvdmlkZSBhY2Nlc3MgYSBDQU4gYnVzLg0KKyAqIA0KKyAqIEBwYXJhbSBpbnRlcmZhY2UgQSBwb2ludGVyIHRvIGFuIG9iamVjdCB0aGF0IGluaGVyaXRzIGZyb20gQ0FOSW50ZXJmYWNlUGx1Z2luIGFuZCBpbXBsZW1lbnRzDQorICogdGhlIHB1cmUgdmlydHVhbCBpbnRlcmZhY2UuICBJZiBOVUxMLCB1bnJlZ2lzdGVyIHRoZSBjdXJyZW50IHBsdWdpbi4NCisgKi8NCit2b2lkIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9DQU5TZXNzaW9uTXV4X3JlZ2lzdGVySW50ZXJmYWNlKENBTkludGVyZmFjZVBsdWdpbiogaW50ZXJmYWNlKTsNCisNCisjZW5kaWYgLy8gX19DQU5JbnRlcmZhY2VQbHVnaW5faF9fDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvTmV0d29ya0NvbW11bmljYXRpb24vQ0FOU2Vzc2lvbk11eC5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvTmV0d29ya0NvbW11bmljYXRpb24vQ0FOU2Vzc2lvbk11eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZjYzYzUKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9OZXR3b3JrQ29tbXVuaWNhdGlvbi9DQU5TZXNzaW9uTXV4LmgKQEAgLTAsMCArMSw2MyBAQAorLy8gQ0FOU2Vzc2lvbk11eC5oDQorLy8NCisvLyAgRGVmaW5lcyB0aGUgQVBJIGZvciBidWlsZGluZyBhIENBTiBJbnRlcmZhY2UgUGx1Z2luIHRvIHN1cHBvcnQNCisvLyAgICBQV00tY2FibGUtZnJlZSBDQU4gbW90b3IgY29udHJvbCBvbiBGUkMgcm9ib3RzLiAgVGhpcyBhbGxvd3MgeW91DQorLy8gICAgdG8gY29ubmVjdCBhbnkgQ0FOIGludGVyZmFjZSB0byB0aGUgc2VjdXJlIEphZ3VhciBDQU4gZHJpdmVyLg0KKy8vDQorDQorI2lmbmRlZiBfX0NBTlNlc3Npb25NdXhfaF9fDQorI2RlZmluZSBfX0NBTlNlc3Npb25NdXhfaF9fDQorDQorI2lmIGRlZmluZWQoX192eHdvcmtzKQ0KKyNpbmNsdWRlIDx2eFdvcmtzLmg+DQorI2Vsc2UNCisjaW5jbHVkZSA8c3RkaW50Lmg+DQorI2VuZGlmDQorDQorI2RlZmluZSBDQU5fU0VORF9QRVJJT0RfTk9fUkVQRUFUIDANCisjZGVmaW5lIENBTl9TRU5EX1BFUklPRF9TVE9QX1JFUEVBVElORyAtMQ0KKw0KKy8qIEZsYWdzIGluIHRoZSB1cHBlciBiaXRzIG9mIHRoZSBtZXNzYWdlSUQgKi8NCisjZGVmaW5lIENBTl9JU19GUkFNRV9SRU1PVEUgMHg4MDAwMDAwMA0KKyNkZWZpbmUgQ0FOX0lTX0ZSQU1FXzExQklUICAweDQwMDAwMDAwDQorDQorI2RlZmluZSBFUlJfQ0FOU2Vzc2lvbk11eF9JbnZhbGlkQnVmZmVyICAgLTQ0MDg2DQorI2RlZmluZSBFUlJfQ0FOU2Vzc2lvbk11eF9NZXNzYWdlTm90Rm91bmQgLTQ0MDg3DQorI2RlZmluZSBXQVJOX0NBTlNlc3Npb25NdXhfTm9Ub2tlbiAgICAgICAgIDQ0MDg3DQorI2RlZmluZSBFUlJfQ0FOU2Vzc2lvbk11eF9Ob3RBbGxvd2VkICAgICAgLTQ0MDg4DQorI2RlZmluZSBFUlJfQ0FOU2Vzc2lvbk11eF9Ob3RJbml0aWFsaXplZCAgLTQ0MDg5DQorDQorc3RydWN0IHRDQU5TdHJlYW1NZXNzYWdlew0KKwl1aW50MzJfdCBtZXNzYWdlSUQ7DQorCXVpbnQzMl90IHRpbWVTdGFtcDsNCisJdWludDhfdCBkYXRhWzhdOw0KKwl1aW50OF90IGRhdGFTaXplOw0KK307DQorDQorbmFtZXNwYWNlIG5DQU5TZXNzaW9uTXV4DQorew0KKwl2b2lkIHNlbmRNZXNzYWdlX3dyYXBwZXIodWludDMyX3QgbWVzc2FnZUlELCBjb25zdCB1aW50OF90ICpkYXRhLCB1aW50OF90IGRhdGFTaXplLCBpbnQzMl90IHBlcmlvZE1zLCBpbnQzMl90ICpzdGF0dXMpOw0KKwl2b2lkIHJlY2VpdmVNZXNzYWdlX3dyYXBwZXIodWludDMyX3QgKm1lc3NhZ2VJRCwgdWludDMyX3QgbWVzc2FnZUlETWFzaywgdWludDhfdCAqZGF0YSwgdWludDhfdCAqZGF0YVNpemUsIHVpbnQzMl90ICp0aW1lU3RhbXAsIGludDMyX3QgKnN0YXR1cyk7DQorCXZvaWQgb3BlblN0cmVhbVNlc3Npb24odWludDMyX3QgKnNlc3Npb25IYW5kbGUsIHVpbnQzMl90IG1lc3NhZ2VJRCwgdWludDMyX3QgbWVzc2FnZUlETWFzaywgdWludDMyX3QgbWF4TWVzc2FnZXMsIGludDMyX3QgKnN0YXR1cyk7DQorCXZvaWQgY2xvc2VTdHJlYW1TZXNzaW9uKHVpbnQzMl90IHNlc3Npb25IYW5kbGUpOw0KKwl2b2lkIHJlYWRTdHJlYW1TZXNzaW9uKHVpbnQzMl90IHNlc3Npb25IYW5kbGUsIHN0cnVjdCB0Q0FOU3RyZWFtTWVzc2FnZSAqbWVzc2FnZXMsIHVpbnQzMl90IG1lc3NhZ2VzVG9SZWFkLCB1aW50MzJfdCAqbWVzc2FnZXNSZWFkLCBpbnQzMl90ICpzdGF0dXMpOw0KKwl2b2lkIGdldENBTlN0YXR1cyhmbG9hdCAqcGVyY2VudEJ1c1V0aWxpemF0aW9uLCB1aW50MzJfdCAqYnVzT2ZmQ291bnQsIHVpbnQzMl90ICp0eEZ1bGxDb3VudCwgdWludDMyX3QgKnJlY2VpdmVFcnJvckNvdW50LCB1aW50MzJfdCAqdHJhbnNtaXRFcnJvckNvdW50LCBpbnQzMl90ICpzdGF0dXMpOw0KK30NCisNCisjaWZkZWYgX19jcGx1c3BsdXMNCitleHRlcm4gIkMiDQorew0KKyNlbmRpZg0KKw0KKwl2b2lkIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9DQU5TZXNzaW9uTXV4X3NlbmRNZXNzYWdlKHVpbnQzMl90IG1lc3NhZ2VJRCwgY29uc3QgdWludDhfdCAqZGF0YSwgdWludDhfdCBkYXRhU2l6ZSwgaW50MzJfdCBwZXJpb2RNcywgaW50MzJfdCAqc3RhdHVzKTsNCisJdm9pZCBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fQ0FOU2Vzc2lvbk11eF9yZWNlaXZlTWVzc2FnZSh1aW50MzJfdCAqbWVzc2FnZUlELCB1aW50MzJfdCBtZXNzYWdlSURNYXNrLCB1aW50OF90ICpkYXRhLCB1aW50OF90ICpkYXRhU2l6ZSwgdWludDMyX3QgKnRpbWVTdGFtcCwgaW50MzJfdCAqc3RhdHVzKTsNCisJdm9pZCBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fQ0FOU2Vzc2lvbk11eF9vcGVuU3RyZWFtU2Vzc2lvbih1aW50MzJfdCAqc2Vzc2lvbkhhbmRsZSwgdWludDMyX3QgbWVzc2FnZUlELCB1aW50MzJfdCBtZXNzYWdlSURNYXNrLCB1aW50MzJfdCBtYXhNZXNzYWdlcywgaW50MzJfdCAqc3RhdHVzKTsNCisJdm9pZCBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fQ0FOU2Vzc2lvbk11eF9jbG9zZVN0cmVhbVNlc3Npb24odWludDMyX3Qgc2Vzc2lvbkhhbmRsZSk7DQorCXZvaWQgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0NBTlNlc3Npb25NdXhfcmVhZFN0cmVhbVNlc3Npb24odWludDMyX3Qgc2Vzc2lvbkhhbmRsZSwgc3RydWN0IHRDQU5TdHJlYW1NZXNzYWdlICptZXNzYWdlcywgdWludDMyX3QgbWVzc2FnZXNUb1JlYWQsIHVpbnQzMl90ICptZXNzYWdlc1JlYWQsIGludDMyX3QgKnN0YXR1cyk7DQorCXZvaWQgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0NBTlNlc3Npb25NdXhfZ2V0Q0FOU3RhdHVzKGZsb2F0ICpwZXJjZW50QnVzVXRpbGl6YXRpb24sIHVpbnQzMl90ICpidXNPZmZDb3VudCwgdWludDMyX3QgKnR4RnVsbENvdW50LCB1aW50MzJfdCAqcmVjZWl2ZUVycm9yQ291bnQsIHVpbnQzMl90ICp0cmFuc21pdEVycm9yQ291bnQsIGludDMyX3QgKnN0YXR1cyk7DQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorfQ0KKyNlbmRpZg0KKw0KKyNlbmRpZiAvLyBfX0NBTlNlc3Npb25NdXhfaF9fDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvTmV0d29ya0NvbW11bmljYXRpb24vRlJDQ29tbS5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvTmV0d29ya0NvbW11bmljYXRpb24vRlJDQ29tbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NDJlY2EKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9OZXR3b3JrQ29tbXVuaWNhdGlvbi9GUkNDb21tLmgKQEAgLTAsMCArMSwxMjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogCQkJCQlOT1RJQ0UNCisgKiANCisgKiAJVGhlc2UgYXJlIHRoZSBvbmx5IGV4dGVybmFsbHkgZXhwb3NlZCBmdW5jdGlvbnMgdG8gdGhlDQorICogICBOZXR3b3JrQ29tbXVuaWNhdGlvbiBsaWJyYXJ5DQorICogDQorICogVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBGUkMgU3BlYyBmb3IgQ29tbSBQcm90b2NvbA0KKyAqIFJldmlzaW9uIDQuNSwgSnVuZSAzMCwgMjAwOA0KKyAqDQorICogQ29weXJpZ2h0IChjKSBOYXRpb25hbCBJbnN0cnVtZW50cyAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCisgKiANCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaWZuZGVmIF9fRlJDX0NPTU1fSF9fDQorI2RlZmluZSBfX0ZSQ19DT01NX0hfXw0KKw0KKyNpZmRlZiBTSU1VTEFUSU9ODQorI2luY2x1ZGUgPHZ4V29ya3NfY29tcGF0Lmg+DQorI2lmZGVmIFVTRV9USFJJRlQNCisjZGVmaW5lIEVYUE9SVF9GVU5DDQorI2Vsc2UNCisjZGVmaW5lIEVYUE9SVF9GVU5DIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSBfX2NkZWNsDQorI2VuZGlmDQorI2Vsc2UNCisjaWYgZGVmaW5lZChfX3Z4d29ya3MpDQorI2luY2x1ZGUgPHZ4V29ya3MuaD4NCisjZGVmaW5lIEVYUE9SVF9GVU5DDQorI2Vsc2UNCisjaW5jbHVkZSA8c3RkaW50Lmg+DQorI2luY2x1ZGUgPHB0aHJlYWQuaD4NCisjZGVmaW5lIEVYUE9SVF9GVU5DDQorI2VuZGlmDQorI2VuZGlmDQorDQorI2RlZmluZSBFUlJfRlJDU3lzdGVtX05ldENvbW1Ob3RSZXNwb25kaW5nIC00NDA0OQ0KKw0KK2VudW0gQWxsaWFuY2VTdGF0aW9uSURfdCB7DQorCWtBbGxpYW5jZVN0YXRpb25JRF9yZWQxLA0KKwlrQWxsaWFuY2VTdGF0aW9uSURfcmVkMiwNCisJa0FsbGlhbmNlU3RhdGlvbklEX3JlZDMsDQorCWtBbGxpYW5jZVN0YXRpb25JRF9ibHVlMSwNCisJa0FsbGlhbmNlU3RhdGlvbklEX2JsdWUyLA0KKwlrQWxsaWFuY2VTdGF0aW9uSURfYmx1ZTMsDQorfTsNCisNCitzdHJ1Y3QgQ29udHJvbFdvcmRfdCB7DQorI2lmbmRlZiBfX3Z4d29ya3MNCisJdWludDMyX3QgZW5hYmxlZCA6IDE7DQorCXVpbnQzMl90IGF1dG9ub21vdXMgOiAxOw0KKwl1aW50MzJfdCB0ZXN0IDoxOw0KKwl1aW50MzJfdCBlU3RvcCA6IDE7DQorCXVpbnQzMl90IGZtc0F0dGFjaGVkOjE7DQorCXVpbnQzMl90IGRzQXR0YWNoZWQ6MTsNCisJdWludDMyX3QgY29udHJvbF9yZXNlcnZlZCA6IDI2Ow0KKyNlbHNlDQorCXVpbnQzMl90IGNvbnRyb2xfcmVzZXJ2ZWQgOiAyNjsNCisJdWludDMyX3QgZHNBdHRhY2hlZDoxOw0KKwl1aW50MzJfdCBmbXNBdHRhY2hlZDoxOw0KKwl1aW50MzJfdCBlU3RvcCA6IDE7DQorCXVpbnQzMl90IHRlc3QgOjE7DQorCXVpbnQzMl90IGF1dG9ub21vdXMgOiAxOw0KKwl1aW50MzJfdCBlbmFibGVkIDogMTsNCisjZW5kaWYNCit9Ow0KKw0KK3N0cnVjdCBKb3lzdGlja0F4ZXNfdCB7DQorCXVpbnQxNl90IGNvdW50Ow0KKwlpbnQxNl90IGF4ZXNbMV07DQorfTsNCisNCitzdHJ1Y3QgSm95c3RpY2tQT1ZfdCB7DQorCXVpbnQxNl90IGNvdW50Ow0KKwlpbnQxNl90IHBvdnNbMV07DQorfTsNCisNCisjaWZkZWYgX19jcGx1c3BsdXMNCitleHRlcm4gIkMiIHsNCisjZW5kaWYNCisJaW50IEVYUE9SVF9GVU5DIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9SZXNlcnZlKHZvaWQgKmluc3RhbmNlKTsNCisjaWZuZGVmIFNJTVVMQVRJT04NCisJdm9pZCBFWFBPUlRfRlVOQyBnZXRGUEdBSGFyZHdhcmVWZXJzaW9uKHVpbnQxNl90ICpmcGdhVmVyc2lvbiwgdWludDMyX3QgKmZwZ2FSZXZpc2lvbik7DQorI2VuZGlmDQorCWludCBFWFBPUlRfRlVOQyBzZXRTdGF0dXNEYXRhKGZsb2F0IGJhdHRlcnksIHVpbnQ4X3QgZHNEaWdpdGFsT3V0LCB1aW50OF90IHVwZGF0ZU51bWJlciwNCisJCQljb25zdCBjaGFyICp1c2VyRGF0YUhpZ2gsIGludCB1c2VyRGF0YUhpZ2hMZW5ndGgsDQorCQkJY29uc3QgY2hhciAqdXNlckRhdGFMb3csIGludCB1c2VyRGF0YUxvd0xlbmd0aCwgaW50IHdhaXRfbXMpOw0KKwlpbnQgRVhQT1JUX0ZVTkMgc2V0RXJyb3JEYXRhKGNvbnN0IGNoYXIgKmVycm9ycywgaW50IGVycm9yc0xlbmd0aCwgaW50IHdhaXRfbXMpOw0KKwkNCisjaWZkZWYgU0lNVUxBVElPTg0KKwl2b2lkIEVYUE9SVF9GVU5DIHNldE5ld0RhdGFTZW0oSEFORExFKTsNCisjZWxzZQ0KKyMgaWYgZGVmaW5lZCAoX192eHdvcmtzKQ0KKwl2b2lkIEVYUE9SVF9GVU5DIHNldE5ld0RhdGFTZW0oU0VNX0lEKTsNCisjIGVsc2UNCisJdm9pZCBFWFBPUlRfRlVOQyBzZXROZXdEYXRhU2VtKHB0aHJlYWRfbXV0ZXhfdCAqKTsNCisjIGVuZGlmDQorI2VuZGlmDQorDQorCS8vIHRoaXMgdWludDMyX3QgaXMgcmVhbGx5IGEgTFZSZWZOdW0NCisJaW50IEVYUE9SVF9GVU5DIHNldE5ld0RhdGFPY2N1clJlZih1aW50MzJfdCByZWZudW0pOw0KKw0KKwlpbnQgRVhQT1JUX0ZVTkMgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX2dldENvbnRyb2xXb3JkKHN0cnVjdCBDb250cm9sV29yZF90ICpjb250cm9sV29yZCk7DQorCWludCBFWFBPUlRfRlVOQyBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fZ2V0QWxsaWFuY2VTdGF0aW9uKGVudW0gQWxsaWFuY2VTdGF0aW9uSURfdCAqYWxsaWFuY2VTdGF0aW9uKTsNCisJaW50IEVYUE9SVF9GVU5DIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9nZXRNYXRjaFRpbWUoZmxvYXQgKm1hdGNoVGltZSk7DQorCWludCBFWFBPUlRfRlVOQyBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fZ2V0Sm95c3RpY2tBeGVzKHVpbnQ4X3Qgam95c3RpY2tOdW0sIHN0cnVjdCBKb3lzdGlja0F4ZXNfdCAqYXhlcywgdWludDhfdCBtYXhBeGVzKTsNCisJaW50IEVYUE9SVF9GVU5DIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9nZXRKb3lzdGlja0J1dHRvbnModWludDhfdCBqb3lzdGlja051bSwgdWludDMyX3QgKmJ1dHRvbnMsIHVpbnQ4X3QgKmNvdW50KTsNCisJaW50IEVYUE9SVF9GVU5DIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9nZXRKb3lzdGlja1BPVnModWludDhfdCBqb3lzdGlja051bSwgc3RydWN0IEpveXN0aWNrUE9WX3QgKnBvdnMsIHVpbnQ4X3QgbWF4UE9Wcyk7DQorCWludCBFWFBPUlRfRlVOQyBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fc2V0Sm95c3RpY2tPdXRwdXRzKHVpbnQ4X3Qgam95c3RpY2tOdW0sIHVpbnQzMl90IGhpZE91dHB1dHMsIHVpbnQxNl90IGxlZnRSdW1ibGUsIHVpbnQxNl90IHJpZ2h0UnVtYmxlKTsNCisJaW50IEVYUE9SVF9GVU5DIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9nZXRKb3lzdGlja0Rlc2ModWludDhfdCBqb3lzdGlja051bSwgdWludDhfdCAqaXNYQm94LCB1aW50OF90ICp0eXBlLCBjaGFyICpuYW1lLA0KKwkJdWludDhfdCAqYXhpc0NvdW50LCB1aW50OF90ICpheGlzVHlwZXMsIHVpbnQ4X3QgKmJ1dHRvbkNvdW50LCB1aW50OF90ICpwb3ZDb3VudCk7DQorDQorCXZvaWQgRVhQT1JUX0ZVTkMgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX2dldFZlcnNpb25TdHJpbmcoY2hhciAqdmVyc2lvbik7DQorCWludCBFWFBPUlRfRlVOQyBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fb2JzZXJ2ZVVzZXJQcm9ncmFtU3RhcnRpbmcodm9pZCk7DQorCXZvaWQgRVhQT1JUX0ZVTkMgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX29ic2VydmVVc2VyUHJvZ3JhbURpc2FibGVkKHZvaWQpOw0KKwl2b2lkIEVYUE9SVF9GVU5DIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9vYnNlcnZlVXNlclByb2dyYW1BdXRvbm9tb3VzKHZvaWQpOw0KKwl2b2lkIEVYUE9SVF9GVU5DIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9vYnNlcnZlVXNlclByb2dyYW1UZWxlb3Aodm9pZCk7DQorCXZvaWQgRVhQT1JUX0ZVTkMgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX29ic2VydmVVc2VyUHJvZ3JhbVRlc3Qodm9pZCk7DQorI2lmZGVmIF9fY3BsdXNwbHVzDQorfQ0KKyNlbmRpZg0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL05ldHdvcmtDb21tdW5pY2F0aW9uL0xvYWRPdXQuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL05ldHdvcmtDb21tdW5pY2F0aW9uL0xvYWRPdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2U4OGEyCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvTmV0d29ya0NvbW11bmljYXRpb24vTG9hZE91dC5oCkBAIC0wLDAgKzEsNTggQEAKKw0KKyNpZm5kZWYgX19Mb2FkT3V0X2hfXw0KKyNkZWZpbmUgX19Mb2FkT3V0X2hfXw0KKw0KKyNpZmRlZiBTSU1VTEFUSU9ODQorI2luY2x1ZGUgPHZ4V29ya3NfY29tcGF0Lmg+DQorI2RlZmluZSBFWFBPUlRfRlVOQyBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgX19jZGVjbA0KKyNlbGlmIGRlZmluZWQgKF9fdnh3b3JrcykNCisjaW5jbHVkZSA8dnhXb3Jrcy5oPg0KKyNkZWZpbmUgRVhQT1JUX0ZVTkMNCisjZWxzZQ0KKyNpbmNsdWRlIDxzdGRpbnQuaD4NCisjZGVmaW5lIEVYUE9SVF9GVU5DDQorI2VuZGlmDQorDQorI2RlZmluZSBrTWF4TW9kdWxlTnVtYmVyIDINCituYW1lc3BhY2UgbkxvYWRPdXQNCit7DQorI2lmIGRlZmluZWQoX192eHdvcmtzKSB8fCBkZWZpbmVkKFNJTVVMQVRJT04pDQorICAgIHR5cGVkZWYgZW51bSB7DQorICAgICAgICBrTW9kdWxlVHlwZV9Vbmtub3duID0gMHgwMCwNCisgICAgICAgIGtNb2R1bGVUeXBlX0FuYWxvZyA9IDB4MDEsDQorICAgICAgICBrTW9kdWxlVHlwZV9EaWdpdGFsID0gMHgwMiwNCisgICAgICAgIGtNb2R1bGVUeXBlX1NvbGVub2lkID0gMHgwMywNCisgICAgfSB0TW9kdWxlVHlwZTsNCisgICAgYm9vbCBFWFBPUlRfRlVOQyBnZXRNb2R1bGVQcmVzZW5jZSh0TW9kdWxlVHlwZSBtb2R1bGVUeXBlLCB1aW50OF90IG1vZHVsZU51bWJlcik7DQorI2VuZGlmDQorICAgIHR5cGVkZWYgZW51bSB7DQorICAgICAgICBrVGFyZ2V0Q2xhc3NfVW5rbm93biA9IDB4MDAsDQorICAgICAgICBrVGFyZ2V0Q2xhc3NfRlJDMSA9IDB4MTAsDQorICAgICAgICBrVGFyZ2V0Q2xhc3NfRlJDMiA9IDB4MjAsDQorICAgICAgICBrVGFyZ2V0Q2xhc3NfRlJDMyA9IDB4MzAsDQorICAgICAgICBrVGFyZ2V0Q2xhc3NfUm9ib1JJTyA9IDB4NDAsDQorI2lmIGRlZmluZWQoX192eHdvcmtzKSB8fCBkZWZpbmVkKFNJTVVMQVRJT04pDQorICAgICAgICBrVGFyZ2V0Q2xhc3NfRlJDMl9BbmFsb2cgPSBrVGFyZ2V0Q2xhc3NfRlJDMiB8IGtNb2R1bGVUeXBlX0FuYWxvZywNCisgICAgICAgIGtUYXJnZXRDbGFzc19GUkMyX0RpZ2l0YWwgPSBrVGFyZ2V0Q2xhc3NfRlJDMiB8IGtNb2R1bGVUeXBlX0RpZ2l0YWwsDQorICAgICAgICBrVGFyZ2V0Q2xhc3NfRlJDMl9Tb2xlbm9pZCA9IGtUYXJnZXRDbGFzc19GUkMyIHwga01vZHVsZVR5cGVfU29sZW5vaWQsDQorI2VuZGlmDQorICAgICAgICBrVGFyZ2V0Q2xhc3NfRmFtaWx5TWFzayA9IDB4RjAsDQorICAgICAgICBrVGFyZ2V0Q2xhc3NfTW9kdWxlTWFzayA9IDB4MEYsDQorICAgIH0gdFRhcmdldENsYXNzOw0KKyAgICB0VGFyZ2V0Q2xhc3MgRVhQT1JUX0ZVTkMgZ2V0VGFyZ2V0Q2xhc3MoKTsNCit9DQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorZXh0ZXJuICJDIiB7DQorI2VuZGlmDQorDQorI2lmIGRlZmluZWQoX192eHdvcmtzKSB8fCBkZWZpbmVkKFNJTVVMQVRJT04pDQorICAgIHVpbnQzMl90IEVYUE9SVF9GVU5DIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9uTG9hZE91dF9nZXRNb2R1bGVQcmVzZW5jZSh1aW50MzJfdCBtb2R1bGVUeXBlLCB1aW50OF90IG1vZHVsZU51bWJlcik7DQorI2VuZGlmDQorICAgIHVpbnQzMl90IEVYUE9SVF9GVU5DIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9uTG9hZE91dF9nZXRUYXJnZXRDbGFzcygpOw0KKw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK30NCisjZW5kaWYNCisNCisjZW5kaWYgLy8gX19Mb2FkT3V0X2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL05ldHdvcmtDb21tdW5pY2F0aW9uL1VzYWdlUmVwb3J0aW5nLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9OZXR3b3JrQ29tbXVuaWNhdGlvbi9Vc2FnZVJlcG9ydGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxOGFjNWEKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9OZXR3b3JrQ29tbXVuaWNhdGlvbi9Vc2FnZVJlcG9ydGluZy5oCkBAIC0wLDAgKzEsMTM5IEBACisNCisjaWZuZGVmIF9fVXNhZ2VSZXBvcnRpbmdfaF9fDQorI2RlZmluZSBfX1VzYWdlUmVwb3J0aW5nX2hfXw0KKw0KKyNpZmRlZiBTSU1VTEFUSU9ODQorI2luY2x1ZGUgPHZ4V29ya3NfY29tcGF0Lmg+DQorI2RlZmluZSBFWFBPUlRfRlVOQyBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgX19jZGVjbA0KKyNlbGlmIGRlZmluZWQgKF9fdnh3b3JrcykNCisjaW5jbHVkZSA8dnhXb3Jrcy5oPg0KKyNkZWZpbmUgRVhQT1JUX0ZVTkMNCisjZWxzZQ0KKyNpbmNsdWRlIDxzdGRpbnQuaD4NCisjaW5jbHVkZSA8c3RkbGliLmg+DQorI2RlZmluZSBFWFBPUlRfRlVOQw0KKyNlbmRpZg0KKw0KKyNkZWZpbmUga1VzYWdlUmVwb3J0aW5nX3ZlcnNpb24gMQ0KKw0KK25hbWVzcGFjZSBuVXNhZ2VSZXBvcnRpbmcNCit7DQorICAgIHR5cGVkZWYgZW51bQ0KKyAgICB7DQorICAgICAgICBrUmVzb3VyY2VUeXBlX0NvbnRyb2xsZXIsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX01vZHVsZSwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfTGFuZ3VhZ2UsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0NBTlBsdWdpbiwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfQWNjZWxlcm9tZXRlciwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfQURYTDM0NSwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfQW5hbG9nQ2hhbm5lbCwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfQW5hbG9nVHJpZ2dlciwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfQW5hbG9nVHJpZ2dlck91dHB1dCwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfQ0FOSmFndWFyLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9Db21wcmVzc29yLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9Db3VudGVyLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9EYXNoYm9hcmQsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0RpZ2l0YWxJbnB1dCwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfRGlnaXRhbE91dHB1dCwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfRHJpdmVyU3RhdGlvbkNJTywNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfRHJpdmVyU3RhdGlvbkVJTywNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfRHJpdmVyU3RhdGlvbkxDRCwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfRW5jb2RlciwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfR2VhclRvb3RoLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9HeXJvLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9JMkMsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0ZyYW1ld29yaywNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfSmFndWFyLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9Kb3lzdGljaywNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfS2luZWN0LA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9LaW5lY3RTdGljaywNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfUElEQ29udHJvbGxlciwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfUHJlZmVyZW5jZXMsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX1BXTSwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfUmVsYXksDQorICAgICAgICBrUmVzb3VyY2VUeXBlX1JvYm90RHJpdmUsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX1NlcmlhbFBvcnQsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX1NlcnZvLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9Tb2xlbm9pZCwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfU1BJLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9UYXNrLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9VbHRyYXNvbmljLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9WaWN0b3IsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0J1dHRvbiwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfQ29tbWFuZCwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfQXhpc0NhbWVyYSwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfUENWaWRlb1NlcnZlciwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfU21hcnREYXNoYm9hcmQsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX1RhbG9uLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9IaVRlY2huaWNDb2xvclNlbnNvciwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfSGlUZWNobmljQWNjZWwsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0hpVGVjaG5pY0NvbXBhc3MsDQorCQlrUmVzb3VyY2VUeXBlX1NSRjA4LA0KKyAgICB9IHRSZXNvdXJjZVR5cGU7DQorDQorICAgIHR5cGVkZWYgZW51bQ0KKyAgICB7DQorICAgICAgICBrTGFuZ3VhZ2VfTGFiVklFVyA9IDEsDQorICAgICAgICBrTGFuZ3VhZ2VfQ1BsdXNQbHVzID0gMiwNCisgICAgICAgIGtMYW5ndWFnZV9KYXZhID0gMywNCisgICAgICAgIGtMYW5ndWFnZV9QeXRob24gPSA0LA0KKw0KKyAgICAgICAga0NBTlBsdWdpbl9CbGFja0phZ0JyaWRnZSA9IDEsDQorICAgICAgICBrQ0FOUGx1Z2luXzJDQU4gPSAyLA0KKw0KKyAgICAgICAga0ZyYW1ld29ya19JdGVyYXRpdmUgPSAxLA0KKyAgICAgICAga0ZyYW1ld29ya19TaW1wbGUgPSAyLA0KKw0KKyAgICAgICAga1JvYm90RHJpdmVfQXJjYWRlU3RhbmRhcmQgPSAxLA0KKyAgICAgICAga1JvYm90RHJpdmVfQXJjYWRlQnV0dG9uU3BpbiA9IDIsDQorICAgICAgICBrUm9ib3REcml2ZV9BcmNhZGVSYXRpb0N1cnZlID0gMywNCisgICAgICAgIGtSb2JvdERyaXZlX1RhbmsgPSA0LA0KKyAgICAgICAga1JvYm90RHJpdmVfTWVjYW51bVBvbGFyID0gNSwNCisgICAgICAgIGtSb2JvdERyaXZlX01lY2FudW1DYXJ0ZXNpYW4gPSA2LA0KKw0KKyAgICAgICAga0RyaXZlclN0YXRpb25DSU9fQW5hbG9nID0gMSwNCisgICAgICAgIGtEcml2ZXJTdGF0aW9uQ0lPX0RpZ2l0YWxJbiA9IDIsDQorICAgICAgICBrRHJpdmVyU3RhdGlvbkNJT19EaWdpdGFsT3V0ID0gMywNCisNCisgICAgICAgIGtEcml2ZXJTdGF0aW9uRUlPX0FjY2VsZXJhdGlvbiA9IDEsDQorICAgICAgICBrRHJpdmVyU3RhdGlvbkVJT19BbmFsb2dJbiA9IDIsDQorICAgICAgICBrRHJpdmVyU3RhdGlvbkVJT19BbmFsb2dPdXQgPSAzLA0KKyAgICAgICAga0RyaXZlclN0YXRpb25FSU9fQnV0dG9uID0gNCwNCisgICAgICAgIGtEcml2ZXJTdGF0aW9uRUlPX0xFRCA9IDUsDQorICAgICAgICBrRHJpdmVyU3RhdGlvbkVJT19EaWdpdGFsSW4gPSA2LA0KKyAgICAgICAga0RyaXZlclN0YXRpb25FSU9fRGlnaXRhbE91dCA9IDcsDQorICAgICAgICBrRHJpdmVyU3RhdGlvbkVJT19GaXhlZERpZ2l0YWxPdXQgPSA4LA0KKyAgICAgICAga0RyaXZlclN0YXRpb25FSU9fUFdNID0gOSwNCisgICAgICAgIGtEcml2ZXJTdGF0aW9uRUlPX0VuY29kZXIgPSAxMCwNCisgICAgICAgIGtEcml2ZXJTdGF0aW9uRUlPX1RvdWNoU2xpZGVyID0gMTEsDQorDQorICAgICAgICBrQURYTDM0NV9TUEkgPSAxLA0KKyAgICAgICAga0FEWEwzNDVfSTJDID0gMiwNCisNCisgICAgICAgIGtDb21tYW5kX1NjaGVkdWxlciA9IDEsDQorDQorICAgICAgICBrU21hcnREYXNoYm9hcmRfSW5zdGFuY2UgPSAxLA0KKyAgICB9IHRJbnN0YW5jZXM7DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXBvcnQgdGhlIHVzYWdlIG9mIGEgcmVzb3VyY2Ugb2YgaW50ZXJlc3QuDQorICAgICAqIA0KKyAgICAgKiBAcGFyYW0gcmVzb3VyY2Ugb25lIG9mIHRoZSB2YWx1ZXMgaW4gdGhlIHRSZXNvdXJjZVR5cGUgYWJvdmUgKG1heCB2YWx1ZSA1MSkuDQorICAgICAqIEBwYXJhbSBpbnN0YW5jZU51bWJlciBhbiBpbmRleCB0aGF0IGlkZW50aWZpZXMgdGhlIHJlc291cmNlIGluc3RhbmNlLg0KKyAgICAgKiBAcGFyYW0gY29udGV4dCBhbiBvcHRpb25hbCBhZGRpdGlvbmFsIGNvbnRleHQgbnVtYmVyIGZvciBzb21lIGNhc2VzIChzdWNoIGFzIG1vZHVsZSBudW1iZXIpLiAgU2V0IHRvIDAgdG8gb21pdC4NCisgICAgICogQHBhcmFtIGZlYXR1cmUgYSBzdHJpbmcgdG8gYmUgaW5jbHVkZWQgZGVzY3JpYmluZyBmZWF0dXJlcyBpbiB1c2Ugb24gYSBzcGVjaWZpYyByZXNvdXJjZS4gIFNldHRpbmcgdGhlIHNhbWUgcmVzb3VyY2UgbW9yZSB0aGFuIG9uY2UgYWxsb3dzIHlvdSB0byBjaGFuZ2UgdGhlIGZlYXR1cmUgc3RyaW5nLg0KKyAgICAgKi8NCisgICAgdWludDMyX3QgRVhQT1JUX0ZVTkMgcmVwb3J0KHRSZXNvdXJjZVR5cGUgcmVzb3VyY2UsIHVpbnQ4X3QgaW5zdGFuY2VOdW1iZXIsIHVpbnQ4X3QgY29udGV4dCA9IDAsIGNvbnN0IGNoYXIgKmZlYXR1cmUgPSBOVUxMKTsNCit9DQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorZXh0ZXJuICJDIiB7DQorI2VuZGlmDQorDQorICAgIHVpbnQzMl90IEVYUE9SVF9GVU5DIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9uVXNhZ2VSZXBvcnRpbmdfcmVwb3J0KHVpbnQ4X3QgcmVzb3VyY2UsIHVpbnQ4X3QgaW5zdGFuY2VOdW1iZXIsIHVpbnQ4X3QgY29udGV4dCwgY29uc3QgY2hhciAqZmVhdHVyZSk7DQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorfQ0KKyNlbmRpZg0KKw0KKyNlbmRpZiAvLyBfX1VzYWdlUmVwb3J0aW5nX2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL05ldHdvcmtDb21tdW5pY2F0aW9uL3N5bU1vZHVsZUxpbmsuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL05ldHdvcmtDb21tdW5pY2F0aW9uL3N5bU1vZHVsZUxpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDg2N2E1Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvTmV0d29ya0NvbW11bmljYXRpb24vc3ltTW9kdWxlTGluay5oCkBAIC0wLDAgKzEsMjEgQEAKKyNpZm5kZWYgX19TWU1fTU9EVUxFX0xJTktfSF9fCisjZGVmaW5lIF9fU1lNX01PRFVMRV9MSU5LX0hfXworCisjaW5jbHVkZSAiSEFML0hBTC5ocHAiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworZXh0ZXJuIFNUQVRVUyAgICBtb2R1bGVOYW1lRmluZEJ5U3ltYm9sTmFtZQorICAgICgKKyAgICAgICAgY29uc3QgY2hhciAqICAgIHN5bWJvbCwgICAgICAgIC8qIHN5bWJvbCBuYW1lIHRvIGxvb2sgZm9yICovCisgICAgICAgIGNoYXIgKiBtb2R1bGUgICAgICAgIC8qIHdoZXJlIHRvIHJldHVybiBtb2R1bGUgbmFtZSAqLworICAgICk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9QV00uaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1BXTS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNzg1YmIKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9QV00uaApAQCAtMCwwICsxLDEyNiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJTZW5zb3JCYXNlLmgiCisKKy8qKgorICogQ2xhc3MgaW1wbGVtZW50cyB0aGUgUFdNIGdlbmVyYXRpb24gaW4gdGhlIEZQR0EuCisgKgorICogVGhlIHZhbHVlcyBzdXBwbGllZCBhcyBhcmd1bWVudHMgZm9yIFBXTSBvdXRwdXRzIHJhbmdlIGZyb20gLTEuMCB0byAxLjAuIFRoZXkgYXJlIG1hcHBlZAorICogdG8gdGhlIGhhcmR3YXJlIGRlcGVuZGVudCB2YWx1ZXMsIGluIHRoaXMgY2FzZSAwLTIwMDAgZm9yIHRoZSBGUEdBLgorICogQ2hhbmdlcyBhcmUgaW1tZWRpYXRlbHkgc2VudCB0byB0aGUgRlBHQSwgYW5kIHRoZSB1cGRhdGUgb2NjdXJzIGF0IHRoZSBuZXh0CisgKiBGUEdBIGN5Y2xlLiBUaGVyZSBpcyBubyBkZWxheS4KKyAqCisgKiBBcyBvZiByZXZpc2lvbiAwLjEuMTAgb2YgdGhlIEZQR0EsIHRoZSBGUEdBIGludGVycHJldHMgdGhlIDAtMjAwMCB2YWx1ZXMgYXMgZm9sbG93czoKKyAqICAgLSAyMDAwID0gbWF4aW11bSBwdWxzZSB3aWR0aAorICogICAtIDE5OTkgdG8gMTAwMSA9IGxpbmVhciBzY2FsaW5nIGZyb20gImZ1bGwgZm9yd2FyZCIgdG8gImNlbnRlciIKKyAqICAgLSAxMDAwID0gY2VudGVyIHZhbHVlCisgKiAgIC0gOTk5IHRvIDIgPSBsaW5lYXIgc2NhbGluZyBmcm9tICJjZW50ZXIiIHRvICJmdWxsIHJldmVyc2UiCisgKiAgIC0gMSA9IG1pbmltdW0gcHVsc2Ugd2lkdGggKGN1cnJlbnRseSAuNW1zKQorICogICAtIDAgPSBkaXNhYmxlZCAoaS5lLiBQV00gb3V0cHV0IGlzIGhlbGQgbG93KQorICovCitjbGFzcyBQV00gOiBwdWJsaWMgU2Vuc29yQmFzZQoreworcHVibGljOgorCWVudW0gUGVyaW9kTXVsdGlwbGllcgorCXsKKwkJa1BlcmlvZE11bHRpcGxpZXJfMVggPSAxLAorCQlrUGVyaW9kTXVsdGlwbGllcl8yWCA9IDIsCisJCWtQZXJpb2RNdWx0aXBsaWVyXzRYID0gNAorCX07CisKKwlleHBsaWNpdCBQV00odWludDMyX3QgY2hhbm5lbCk7CisJdmlydHVhbCB+UFdNKCk7CisJdmlydHVhbCB2b2lkIFNldFJhdyh1bnNpZ25lZCBzaG9ydCB2YWx1ZSk7CisJdmlydHVhbCB1bnNpZ25lZCBzaG9ydCBHZXRSYXcoKTsKKwl2b2lkIFNldFBlcmlvZE11bHRpcGxpZXIoUGVyaW9kTXVsdGlwbGllciBtdWx0KTsKKwl2b2lkIFNldFplcm9MYXRjaCgpOworCXZvaWQgRW5hYmxlRGVhZGJhbmRFbGltaW5hdGlvbihib29sIGVsaW1pbmF0ZURlYWRiYW5kKTsKKwl2b2lkIFNldEJvdW5kcyhpbnQzMl90IG1heCwgaW50MzJfdCBkZWFkYmFuZE1heCwgaW50MzJfdCBjZW50ZXIsIGludDMyX3QgZGVhZGJhbmRNaW4sCisJCQlpbnQzMl90IG1pbik7CisJdm9pZCBTZXRCb3VuZHMoZG91YmxlIG1heCwgZG91YmxlIGRlYWRiYW5kTWF4LCBkb3VibGUgY2VudGVyLCBkb3VibGUgZGVhZGJhbmRNaW4sIGRvdWJsZSBtaW4pOworCXVpbnQzMl90IEdldENoYW5uZWwoKQorCXsKKwkJcmV0dXJuIG1fY2hhbm5lbDsKKwl9CisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBrRGVmYXVsdFB3bVBlcmlvZCBpcyBpbiBtcworCSAqCisJICogLSAyMG1zIHBlcmlvZHMgKDUwIEh6KSBhcmUgdGhlICJzYWZlc3QiIHNldHRpbmcgaW4gdGhhdCB0aGlzIHdvcmtzIGZvciBhbGwgZGV2aWNlcworCSAqIC0gMjBtcyBwZXJpb2RzIHNlZW0gdG8gYmUgZGVzaXJhYmxlIGZvciBWZXggTW90b3JzCisJICogLSAyMG1zIHBlcmlvZHMgYXJlIHRoZSBzcGVjaWZpZWQgcGVyaW9kIGZvciBIUy0zMjJIRCBzZXJ2b3MsIGJ1dCB3b3JrIHJlbGlhYmx5IGRvd24KKwkgKiAgICAgIHRvIDEwLjAgbXM7IHN0YXJ0aW5nIGF0IGFib3V0IDguNW1zLCB0aGUgc2Vydm8gc29tZXRpbWVzIGh1bXMgYW5kIGdldCBob3Q7CisJICogICAgICBieSA1LjBtcyB0aGUgaHVtIGlzIG5lYXJseSBjb250aW51b3VzCisJICogLSAxMG1zIHBlcmlvZHMgd29yayB3ZWxsIGZvciBWaWN0b3IgODg0CisJICogLSA1bXMgcGVyaW9kcyBhbGxvd3MgaGlnaGVyIHVwZGF0ZSByYXRlcyBmb3IgTHVtaW5hcnkgTWljcm8gSmFndWFyIHNwZWVkIGNvbnRyb2xsZXJzLgorCSAqICAgICAgRHVlIHRvIHRoZSBzaGlwcGluZyBmaXJtd2FyZSBvbiB0aGUgSmFndWFyLCB3ZSBjYW4ndCBydW4gdGhlIHVwZGF0ZSBwZXJpb2QgbGVzcworCSAqICAgICAgdGhhbiA1LjA1IG1zLgorCSAqCisJICoga0RlZmF1bHRQd21QZXJpb2QgaXMgdGhlIDF4IHBlcmlvZCAoNS4wNSBtcykuICBJbiBoYXJkd2FyZSwgdGhlIHBlcmlvZCBzY2FsaW5nIGlzIGltcGxlbWVudGVkIGFzIGFuCisJICogb3V0cHV0IHNxdWVsY2ggdG8gZ2V0IGxvbmdlciBwZXJpb2RzIGZvciBvbGQgZGV2aWNlcy4KKwkgKi8KKwlzdGF0aWMgY29uc3RleHByIGZsb2F0IGtEZWZhdWx0UHdtUGVyaW9kID0gNS4wNTsKKwkvKioKKwkgKiBrRGVmYXVsdFB3bUNlbnRlciBpcyB0aGUgUFdNIHJhbmdlIGNlbnRlciBpbiBtcworCSAqLworCXN0YXRpYyBjb25zdGV4cHIgZmxvYXQga0RlZmF1bHRQd21DZW50ZXIgPSAxLjU7CisJLyoqCisJICoga0RlZmF1bHRQV01TdGVwc0Rvd24gaXMgdGhlIG51bWJlciBvZiBQV00gc3RlcHMgYmVsb3cgdGhlIGNlbnRlcnBvaW50CisJICovCisJc3RhdGljIGNvbnN0IGludDMyX3Qga0RlZmF1bHRQd21TdGVwc0Rvd24gPSAxMDAwOworCXN0YXRpYyBjb25zdCBpbnQzMl90IGtQd21EaXNhYmxlZCA9IDA7CisKKwl2aXJ0dWFsIHZvaWQgU2V0UG9zaXRpb24oZmxvYXQgcG9zKTsKKwl2aXJ0dWFsIGZsb2F0IEdldFBvc2l0aW9uKCk7CisJdmlydHVhbCB2b2lkIFNldFNwZWVkKGZsb2F0IHNwZWVkKTsKKwl2aXJ0dWFsIGZsb2F0IEdldFNwZWVkKCk7CisKKwlib29sIG1fZWxpbWluYXRlRGVhZGJhbmQ7CisJaW50MzJfdCBtX21heFB3bTsKKwlpbnQzMl90IG1fZGVhZGJhbmRNYXhQd207CisJaW50MzJfdCBtX2NlbnRlclB3bTsKKwlpbnQzMl90IG1fZGVhZGJhbmRNaW5Qd207CisJaW50MzJfdCBtX21pblB3bTsKKworcHJpdmF0ZToKKwl2b2lkIEluaXRQV00odWludDMyX3QgY2hhbm5lbCk7CisJdWludDMyX3QgbV9jaGFubmVsOworCWludDMyX3QgR2V0TWF4UG9zaXRpdmVQd20oKQorCXsKKwkJcmV0dXJuIG1fbWF4UHdtOworCX0KKwlpbnQzMl90IEdldE1pblBvc2l0aXZlUHdtKCkKKwl7CisJCXJldHVybiBtX2VsaW1pbmF0ZURlYWRiYW5kID8gbV9kZWFkYmFuZE1heFB3bSA6IG1fY2VudGVyUHdtICsgMTsKKwl9CisJaW50MzJfdCBHZXRDZW50ZXJQd20oKQorCXsKKwkJcmV0dXJuIG1fY2VudGVyUHdtOworCX0KKwlpbnQzMl90IEdldE1heE5lZ2F0aXZlUHdtKCkKKwl7CisJCXJldHVybiBtX2VsaW1pbmF0ZURlYWRiYW5kID8gbV9kZWFkYmFuZE1pblB3bSA6IG1fY2VudGVyUHdtIC0gMTsKKwl9CisJaW50MzJfdCBHZXRNaW5OZWdhdGl2ZVB3bSgpCisJeworCQlyZXR1cm4gbV9taW5Qd207CisJfQorCWludDMyX3QgR2V0UG9zaXRpdmVTY2FsZUZhY3RvcigpCisJeworCQlyZXR1cm4gR2V0TWF4UG9zaXRpdmVQd20oKSAtIEdldE1pblBvc2l0aXZlUHdtKCk7CisJfSAvLy88IFRoZSBzY2FsZSBmb3IgcG9zaXRpdmUgc3BlZWRzLgorCWludDMyX3QgR2V0TmVnYXRpdmVTY2FsZUZhY3RvcigpCisJeworCQlyZXR1cm4gR2V0TWF4TmVnYXRpdmVQd20oKSAtIEdldE1pbk5lZ2F0aXZlUHdtKCk7CisJfSAvLy88IFRoZSBzY2FsZSBmb3IgbmVnYXRpdmUgc3BlZWRzLgorCWludDMyX3QgR2V0RnVsbFJhbmdlU2NhbGVGYWN0b3IoKQorCXsKKwkJcmV0dXJuIEdldE1heFBvc2l0aXZlUHdtKCkgLSBHZXRNaW5OZWdhdGl2ZVB3bSgpOworCX0gLy8vPCBUaGUgc2NhbGUgZm9yIHBvc2l0aW9ucy4KK307CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9Qb3dlckRpc3RyaWJ1dGlvblBhbmVsLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9Qb3dlckRpc3RyaWJ1dGlvblBhbmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA5NGUwOAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1Bvd2VyRGlzdHJpYnV0aW9uUGFuZWwuaApAQCAtMCwwICsxLDMzIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE0LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNwcmFnbWEgb25jZQorI2lmbmRlZiBfX1dQSUxJQl9QT1dFUl9ESVNUUklCVVRJT05fUEFORUxfSF9fCisjZGVmaW5lIF9fV1BJTElCX1BPV0VSX0RJU1RSSUJVVElPTl9QQU5FTF9IX18KKworI2luY2x1ZGUgIlNlbnNvckJhc2UuaCIKKworLyoqCisgKiBDbGFzcyBmb3IgZ2V0dGluZyB2b2x0YWdlLCBjdXJyZW50LCB0ZW1wZXJhdHVyZSwgcG93ZXIgYW5kIGVuZXJneSBmcm9tIHRoZSBDQU4gUERQLgorICogVGhlIFBEUCBtdXN0IGJlIGF0IENBTiBBZGRyZXNzIDAuCisgKiBAYXV0aG9yIFRob21hcyBDbGFyaworICovCitjbGFzcyBQb3dlckRpc3RyaWJ1dGlvblBhbmVsIDogcHVibGljIFNlbnNvckJhc2UgeworCXB1YmxpYzoKKwkJUG93ZXJEaXN0cmlidXRpb25QYW5lbCgpOworCQkKKwkJZG91YmxlIEdldFZvbHRhZ2UoKTsKKwkJZG91YmxlIEdldFRlbXBlcmF0dXJlKCk7CisJCWRvdWJsZSBHZXRDdXJyZW50KHVpbnQ4X3QgY2hhbm5lbCk7CisJCWRvdWJsZSBHZXRUb3RhbEN1cnJlbnQoKTsKKwkJZG91YmxlIEdldFRvdGFsUG93ZXIoKTsKKwkJZG91YmxlIEdldFRvdGFsRW5lcmd5KCk7CisJCXZvaWQgUmVzZXRUb3RhbEVuZXJneSgpOworCQl2b2lkIENsZWFyU3RpY2t5RmF1bHRzKCk7Cit9OworCisjZW5kaWYgLyogX19XUElMSUJfUE9XRVJfRElTVFJJQlVUSU9OX1BBTkVMX0hfXyAqLworCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9SZWxheS5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvUmVsYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGM5Y2M5Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvUmVsYXkuaApAQCAtMCwwICsxLDQ3IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIlNlbnNvckJhc2UuaCIKKworLyoqCisgKiBDbGFzcyBmb3IgU3Bpa2Ugc3R5bGUgcmVsYXkgb3V0cHV0cy4KKyAqIFJlbGF5cyBhcmUgaW50ZW5kZWQgdG8gYmUgY29ubmVjdGVkIHRvIHNwaWtlcyBvciBzaW1pbGFyIHJlbGF5cy4gVGhlIHJlbGF5IGNoYW5uZWxzIGNvbnRyb2xzCisgKiBhIHBhaXIgb2YgcGlucyB0aGF0IGFyZSBlaXRoZXIgYm90aCBvZmYsIG9uZSBvbiwgdGhlIG90aGVyIG9uLCBvciBib3RoIG9uLiBUaGlzIHRyYW5zbGF0ZXMgaW50bworICogdHdvIHNwaWtlIG91dHB1dHMgYXQgMHYsIG9uZSBhdCAxMnYgYW5kIG9uZSBhdCAwdiwgb25lIGF0IDB2IGFuZCB0aGUgb3RoZXIgYXQgMTJ2LCBvciB0d28KKyAqIHNwaWtlIG91dHB1dHMgYXQgMTJWLiBUaGlzIGFsbG93cyBvZmYsIGZ1bGwgZm9yd2FyZCwgb3IgZnVsbCByZXZlcnNlIGNvbnRyb2wgb2YgbW90b3JzIHdpdGhvdXQKKyAqIHZhcmlhYmxlIHNwZWVkLiAgSXQgYWxzbyBhbGxvd3MgdGhlIHR3byBjaGFubmVscyAoZm9yd2FyZCBhbmQgcmV2ZXJzZSkgdG8gYmUgdXNlZCBpbmRlcGVuZGVudGx5CisgKiBmb3Igc29tZXRoaW5nIHRoYXQgZG9lcyBub3QgY2FyZSBhYm91dCB2b2x0YWdlIHBvbGF0aXJ5IChsaWtlIGEgc29sZW5vaWQpLgorICovCitjbGFzcyBSZWxheSA6IHB1YmxpYyBTZW5zb3JCYXNlCit7CitwdWJsaWM6CisJZW51bSBWYWx1ZQorCXsKKwkJa09mZiwKKwkJa09uLAorCQlrRm9yd2FyZCwKKwkJa1JldmVyc2UKKwl9OworCWVudW0gRGlyZWN0aW9uCisJeworCQlrQm90aERpcmVjdGlvbnMsCisJCWtGb3J3YXJkT25seSwKKwkJa1JldmVyc2VPbmx5CisJfTsKKworCVJlbGF5KHVpbnQzMl90IGNoYW5uZWwsIERpcmVjdGlvbiBkaXJlY3Rpb24gPSBrQm90aERpcmVjdGlvbnMpOworCXZpcnR1YWwgflJlbGF5KCk7CisKKwl2b2lkIFNldChWYWx1ZSB2YWx1ZSk7CisJVmFsdWUgR2V0KCk7CisKK3ByaXZhdGU6CisJdm9pZCBJbml0UmVsYXkoKTsKKworCXVpbnQzMl90IG1fY2hhbm5lbDsKKwlEaXJlY3Rpb24gbV9kaXJlY3Rpb247Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvUm9ib3RCYXNlLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9Sb2JvdEJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDUzMGJlCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvUm9ib3RCYXNlLmgKQEAgLTAsMCArMSw2MyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJCYXNlLmgiCisjaW5jbHVkZSAiVGFzay5oIgorCitjbGFzcyBEcml2ZXJTdGF0aW9uOworCisjZGVmaW5lIFNUQVJUX1JPQk9UX0NMQVNTKF9DbGFzc05hbWVfKSBcCisJaW50IG1haW4oKSBcCisJeyBcCisJCWlmICghSEFMSW5pdGlhbGl6ZSgpKXtzdGQ6OmNlcnI8PCJGQVRBTCBFUlJPUjogSEFMIGNvdWxkIG5vdCBiZSBpbml0aWFsaXplZCI8PHN0ZDo6ZW5kbDtyZXR1cm4gLTE7fQlcCisJCUhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9MYW5ndWFnZSwgSEFMVXNhZ2VSZXBvcnRpbmc6OmtMYW5ndWFnZV9DUGx1c1BsdXMpOyBcCisJCV9DbGFzc05hbWVfICpyb2JvdCA9IG5ldyBfQ2xhc3NOYW1lXygpOyBcCisJCVJvYm90QmFzZTo6cm9ib3RTZXR1cChyb2JvdCk7IFwKKwkJcmV0dXJuIDA7IFwKKwl9CisKKy8qKgorICogSW1wbGVtZW50IGEgUm9ib3QgUHJvZ3JhbSBmcmFtZXdvcmsuCisgKiBUaGUgUm9ib3RCYXNlIGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgYnkgYSB1c2VyIGNyZWF0aW5nIGEgcm9ib3QgcHJvZ3JhbS4KKyAqIE92ZXJyaWRkZW4gQXV0b25vbW91cygpIGFuZCBPcGVyYXRvckNvbnRyb2woKSBtZXRob2RzIGFyZSBjYWxsZWQgYXQgdGhlIGFwcHJvcHJpYXRlIHRpbWUKKyAqIGFzIHRoZSBtYXRjaCBwcm9jZWVkcy4gSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIHRoZSBBdXRvbm9tb3VzIGNvZGUgd2lsbCBydW4gdG8KKyAqIGNvbXBsZXRpb24gYmVmb3JlIHRoZSBPcGVyYXRvckNvbnRyb2wgY29kZSBjb3VsZCBzdGFydC4gSW4gdGhlIGZ1dHVyZSB0aGUgQXV0b25vbW91cyBjb2RlCisgKiBtaWdodCBiZSBzcGF3bmVkIGFzIGEgdGFzaywgdGhlbiBraWxsZWQgYXQgdGhlIGVuZCBvZiB0aGUgQXV0b25vbW91cyBwZXJpb2QuCisgKi8KK2NsYXNzIFJvYm90QmFzZQoreworCWZyaWVuZCBjbGFzcyBSb2JvdERlbGV0ZXI7CitwdWJsaWM6CisJc3RhdGljIFJvYm90QmFzZSAmZ2V0SW5zdGFuY2UoKTsKKwlzdGF0aWMgdm9pZCBzZXRJbnN0YW5jZShSb2JvdEJhc2UqIHJvYm90KTsKKworCWJvb2wgSXNFbmFibGVkKCk7CisJYm9vbCBJc0Rpc2FibGVkKCk7CisJYm9vbCBJc0F1dG9ub21vdXMoKTsKKwlib29sIElzT3BlcmF0b3JDb250cm9sKCk7CisJYm9vbCBJc1Rlc3QoKTsKKwlib29sIElzTmV3RGF0YUF2YWlsYWJsZSgpOworCXN0YXRpYyB2b2lkIHN0YXJ0Um9ib3RUYXNrKEZVTkNQVFIgZmFjdG9yeSk7CisJc3RhdGljIHZvaWQgcm9ib3RUYXNrKEZVTkNQVFIgZmFjdG9yeSwgVGFzayAqdGFzayk7CisJdmlydHVhbCB2b2lkIFN0YXJ0Q29tcGV0aXRpb24oKSA9IDA7CisJCisJc3RhdGljIHZvaWQgcm9ib3RTZXR1cChSb2JvdEJhc2UgKnJvYm90KTsKKworcHJvdGVjdGVkOgorCXZpcnR1YWwgflJvYm90QmFzZSgpOworCVJvYm90QmFzZSgpOworCisJdmlydHVhbCB2b2lkIFByZXN0YXJ0KCk7CisKKwlUYXNrICptX3Rhc2s7CisJRHJpdmVyU3RhdGlvbiAqbV9kczsKKworcHJpdmF0ZToKKwlzdGF0aWMgUm9ib3RCYXNlICptX2luc3RhbmNlOworCisJRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFJvYm90QmFzZSk7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvUm9ib3REcml2ZS5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvUm9ib3REcml2ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2Y2QwMzEKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9Sb2JvdERyaXZlLmgKQEAgLTAsMCArMSwxMTIgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiRXJyb3JCYXNlLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAiSEFML0hBTC5ocHAiCisjaW5jbHVkZSAiTW90b3JTYWZldHkuaCIKKyNpbmNsdWRlICJNb3RvclNhZmV0eUhlbHBlci5oIgorCitjbGFzcyBTcGVlZENvbnRyb2xsZXI7CitjbGFzcyBHZW5lcmljSElEOworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgZm9yIGhhbmRsaW5nIFJvYm90IGRyaXZlIGJhc2VkIG9uIGEgZGVmaW5pdGlvbiBvZiB0aGUgbW90b3IgY29uZmlndXJhdGlvbi4KKyAqIFRoZSByb2JvdCBkcml2ZSBjbGFzcyBoYW5kbGVzIGJhc2ljIGRyaXZpbmcgZm9yIGEgcm9ib3QuIEN1cnJlbnRseSwgMiBhbmQgNCBtb3RvciB0YW5rIGFuZAorICogbWVjYW51bSBkcml2ZSB0cmFpbnMgYXJlIHN1cHBvcnRlZC4gSW4gdGhlIGZ1dHVyZSBvdGhlciBkcml2ZSB0eXBlcyBsaWtlIHN3ZXJ2ZSBtaWdodCBiZQorICogaW1wbGVtZW50ZWQuIE1vdG9yIGNoYW5uZWwgbnVtYmVycyBhcmUgcGFzc2VkIHN1cHBsaWVkIG9uIGNyZWF0aW9uIG9mIHRoZSBjbGFzcy4gVGhvc2UKKyAqIGFyZSB1c2VkIGZvciBlaXRoZXIgdGhlIERyaXZlIGZ1bmN0aW9uIChpbnRlbmRlZCBmb3IgaGFuZCBjcmVhdGVkIGRyaXZlIGNvZGUsIHN1Y2ggYXMKKyAqIGF1dG9ub21vdXMpIG9yIHdpdGggdGhlIFRhbmsvQXJjYWRlIGZ1bmN0aW9ucyBpbnRlbmRlZCB0byBiZSB1c2VkIGZvciBPcGVyYXRvciBDb250cm9sCisgKiBkcml2aW5nLgorICovCitjbGFzcyBSb2JvdERyaXZlIDogcHVibGljIE1vdG9yU2FmZXR5LCBwdWJsaWMgRXJyb3JCYXNlCit7CitwdWJsaWM6CisJZW51bSBNb3RvclR5cGUKKwl7CisJCWtGcm9udExlZnRNb3RvciA9IDAsCisJCWtGcm9udFJpZ2h0TW90b3IgPSAxLAorCQlrUmVhckxlZnRNb3RvciA9IDIsCisJCWtSZWFyUmlnaHRNb3RvciA9IDMKKwl9OworCisJUm9ib3REcml2ZSh1aW50MzJfdCBsZWZ0TW90b3JDaGFubmVsLCB1aW50MzJfdCByaWdodE1vdG9yQ2hhbm5lbCk7CisJUm9ib3REcml2ZSh1aW50MzJfdCBmcm9udExlZnRNb3RvckNoYW5uZWwsIHVpbnQzMl90IHJlYXJMZWZ0TW90b3JDaGFubmVsLAorCQkJdWludDMyX3QgZnJvbnRSaWdodE1vdG9yQ2hhbm5lbCwgdWludDMyX3QgcmVhclJpZ2h0TW90b3JDaGFubmVsKTsKKwlSb2JvdERyaXZlKFNwZWVkQ29udHJvbGxlciAqbGVmdE1vdG9yLCBTcGVlZENvbnRyb2xsZXIgKnJpZ2h0TW90b3IpOworCVJvYm90RHJpdmUoU3BlZWRDb250cm9sbGVyICZsZWZ0TW90b3IsIFNwZWVkQ29udHJvbGxlciAmcmlnaHRNb3Rvcik7CisJUm9ib3REcml2ZShTcGVlZENvbnRyb2xsZXIgKmZyb250TGVmdE1vdG9yLCBTcGVlZENvbnRyb2xsZXIgKnJlYXJMZWZ0TW90b3IsCisJCQlTcGVlZENvbnRyb2xsZXIgKmZyb250UmlnaHRNb3RvciwgU3BlZWRDb250cm9sbGVyICpyZWFyUmlnaHRNb3Rvcik7CisJUm9ib3REcml2ZShTcGVlZENvbnRyb2xsZXIgJmZyb250TGVmdE1vdG9yLCBTcGVlZENvbnRyb2xsZXIgJnJlYXJMZWZ0TW90b3IsCisJCQlTcGVlZENvbnRyb2xsZXIgJmZyb250UmlnaHRNb3RvciwgU3BlZWRDb250cm9sbGVyICZyZWFyUmlnaHRNb3Rvcik7CisJdmlydHVhbCB+Um9ib3REcml2ZSgpOworCisJdm9pZCBEcml2ZShmbG9hdCBvdXRwdXRNYWduaXR1ZGUsIGZsb2F0IGN1cnZlKTsKKwl2b2lkIFRhbmtEcml2ZShHZW5lcmljSElEICpsZWZ0U3RpY2ssIEdlbmVyaWNISUQgKnJpZ2h0U3RpY2ssIGJvb2wgc3F1YXJlZElucHV0cyA9IHRydWUpOworCXZvaWQgVGFua0RyaXZlKEdlbmVyaWNISUQgJmxlZnRTdGljaywgR2VuZXJpY0hJRCAmcmlnaHRTdGljaywgYm9vbCBzcXVhcmVkSW5wdXRzID0gdHJ1ZSk7CisJdm9pZCBUYW5rRHJpdmUoR2VuZXJpY0hJRCAqbGVmdFN0aWNrLCB1aW50MzJfdCBsZWZ0QXhpcywgR2VuZXJpY0hJRCAqcmlnaHRTdGljaywKKwkJCXVpbnQzMl90IHJpZ2h0QXhpcywgYm9vbCBzcXVhcmVkSW5wdXRzID0gdHJ1ZSk7CisJdm9pZCBUYW5rRHJpdmUoR2VuZXJpY0hJRCAmbGVmdFN0aWNrLCB1aW50MzJfdCBsZWZ0QXhpcywgR2VuZXJpY0hJRCAmcmlnaHRTdGljaywKKwkJCXVpbnQzMl90IHJpZ2h0QXhpcywgYm9vbCBzcXVhcmVkSW5wdXRzID0gdHJ1ZSk7CisJdm9pZCBUYW5rRHJpdmUoZmxvYXQgbGVmdFZhbHVlLCBmbG9hdCByaWdodFZhbHVlLCBib29sIHNxdWFyZWRJbnB1dHMgPSB0cnVlKTsKKwl2b2lkIEFyY2FkZURyaXZlKEdlbmVyaWNISUQgKnN0aWNrLCBib29sIHNxdWFyZWRJbnB1dHMgPSB0cnVlKTsKKwl2b2lkIEFyY2FkZURyaXZlKEdlbmVyaWNISUQgJnN0aWNrLCBib29sIHNxdWFyZWRJbnB1dHMgPSB0cnVlKTsKKwl2b2lkIEFyY2FkZURyaXZlKEdlbmVyaWNISUQgKm1vdmVTdGljaywgdWludDMyX3QgbW92ZUNoYW5uZWwsIEdlbmVyaWNISUQgKnJvdGF0ZVN0aWNrLAorCQkJdWludDMyX3Qgcm90YXRlQ2hhbm5lbCwgYm9vbCBzcXVhcmVkSW5wdXRzID0gdHJ1ZSk7CisJdm9pZCBBcmNhZGVEcml2ZShHZW5lcmljSElEICZtb3ZlU3RpY2ssIHVpbnQzMl90IG1vdmVDaGFubmVsLCBHZW5lcmljSElEICZyb3RhdGVTdGljaywKKwkJCXVpbnQzMl90IHJvdGF0ZUNoYW5uZWwsIGJvb2wgc3F1YXJlZElucHV0cyA9IHRydWUpOworCXZvaWQgQXJjYWRlRHJpdmUoZmxvYXQgbW92ZVZhbHVlLCBmbG9hdCByb3RhdGVWYWx1ZSwgYm9vbCBzcXVhcmVkSW5wdXRzID0gdHJ1ZSk7CisJdm9pZCBNZWNhbnVtRHJpdmVfQ2FydGVzaWFuKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHJvdGF0aW9uLCBmbG9hdCBneXJvQW5nbGUgPSAwLjApOworCXZvaWQgTWVjYW51bURyaXZlX1BvbGFyKGZsb2F0IG1hZ25pdHVkZSwgZmxvYXQgZGlyZWN0aW9uLCBmbG9hdCByb3RhdGlvbik7CisJdm9pZCBIb2xvbm9taWNEcml2ZShmbG9hdCBtYWduaXR1ZGUsIGZsb2F0IGRpcmVjdGlvbiwgZmxvYXQgcm90YXRpb24pOworCXZpcnR1YWwgdm9pZCBTZXRMZWZ0UmlnaHRNb3Rvck91dHB1dHMoZmxvYXQgbGVmdE91dHB1dCwgZmxvYXQgcmlnaHRPdXRwdXQpOworCXZvaWQgU2V0SW52ZXJ0ZWRNb3RvcihNb3RvclR5cGUgbW90b3IsIGJvb2wgaXNJbnZlcnRlZCk7CisJdm9pZCBTZXRTZW5zaXRpdml0eShmbG9hdCBzZW5zaXRpdml0eSk7CisJdm9pZCBTZXRNYXhPdXRwdXQoZG91YmxlIG1heE91dHB1dCk7CisKKwl2b2lkIFNldEV4cGlyYXRpb24oZmxvYXQgdGltZW91dCk7CisJZmxvYXQgR2V0RXhwaXJhdGlvbigpOworCWJvb2wgSXNBbGl2ZSgpOworCXZvaWQgU3RvcE1vdG9yKCk7CisJYm9vbCBJc1NhZmV0eUVuYWJsZWQoKTsKKwl2b2lkIFNldFNhZmV0eUVuYWJsZWQoYm9vbCBlbmFibGVkKTsKKwl2b2lkIEdldERlc2NyaXB0aW9uKGNoYXIgKmRlc2MpOworCitwcm90ZWN0ZWQ6CisJdm9pZCBJbml0Um9ib3REcml2ZSgpOworCWZsb2F0IExpbWl0KGZsb2F0IG51bSk7CisJdm9pZCBOb3JtYWxpemUoZG91YmxlICp3aGVlbFNwZWVkcyk7CisJdm9pZCBSb3RhdGVWZWN0b3IoZG91YmxlICZ4LCBkb3VibGUgJnksIGRvdWJsZSBhbmdsZSk7CisKKwlzdGF0aWMgY29uc3QgaW50MzJfdCBrTWF4TnVtYmVyT2ZNb3RvcnMgPSA0OworCisJaW50MzJfdCBtX2ludmVydGVkTW90b3JzW2tNYXhOdW1iZXJPZk1vdG9yc107CisJZmxvYXQgbV9zZW5zaXRpdml0eTsKKwlkb3VibGUgbV9tYXhPdXRwdXQ7CisJYm9vbCBtX2RlbGV0ZVNwZWVkQ29udHJvbGxlcnM7CisJU3BlZWRDb250cm9sbGVyICptX2Zyb250TGVmdE1vdG9yOworCVNwZWVkQ29udHJvbGxlciAqbV9mcm9udFJpZ2h0TW90b3I7CisJU3BlZWRDb250cm9sbGVyICptX3JlYXJMZWZ0TW90b3I7CisJU3BlZWRDb250cm9sbGVyICptX3JlYXJSaWdodE1vdG9yOworCU1vdG9yU2FmZXR5SGVscGVyICptX3NhZmV0eUhlbHBlcjsKKworcHJpdmF0ZToKKwlpbnQzMl90IEdldE51bU1vdG9ycygpCisJeworCQlpbnQgbW90b3JzID0gMDsKKwkJaWYgKG1fZnJvbnRMZWZ0TW90b3IpCisJCQltb3RvcnMrKzsKKwkJaWYgKG1fZnJvbnRSaWdodE1vdG9yKQorCQkJbW90b3JzKys7CisJCWlmIChtX3JlYXJMZWZ0TW90b3IpCisJCQltb3RvcnMrKzsKKwkJaWYgKG1fcmVhclJpZ2h0TW90b3IpCisJCQltb3RvcnMrKzsKKwkJcmV0dXJuIG1vdG9yczsKKwl9CisJRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFJvYm90RHJpdmUpOworfTsKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1NQSS5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvU1BJLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M2ZDYxZgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1NQSS5oCkBAIC0wLDAgKzEsNTggQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiSEFML0hBTC5ocHAiCisjaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgorCitjbGFzcyBEaWdpdGFsT3V0cHV0OworY2xhc3MgRGlnaXRhbElucHV0OworCisvKioKKyAqIFNQSSBidXMgaW50ZXJmYWNlIGNsYXNzLgorICoKKyAqIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBzZW5zb3IgKGFuZCBvdGhlciBTUEkgZGV2aWNlKSBkcml2ZXJzLgorICogSXQgcHJvYmFibHkgc2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5LgorICoKKyAqLworY2xhc3MgU1BJIDogcHVibGljIFNlbnNvckJhc2UKK3sKK3B1YmxpYzoKKwllbnVtIFBvcnQge2tPbmJvYXJkQ1MwLCBrT25ib2FyZENTMSwga09uYm9hcmRDUzIsIGtPbmJvYXJkQ1MzLCBrTVhQfTsKKwlTUEkoUG9ydCBTUElwb3J0KTsKKwl2aXJ0dWFsIH5TUEkoKTsKKworCXZvaWQgU2V0Q2xvY2tSYXRlKGRvdWJsZSBoeik7CisKKwl2b2lkIFNldE1TQkZpcnN0KCk7CisJdm9pZCBTZXRMU0JGaXJzdCgpOworCisJdm9pZCBTZXRTYW1wbGVEYXRhT25GYWxsaW5nKCk7CisJdm9pZCBTZXRTYW1wbGVEYXRhT25SaXNpbmcoKTsKKworCisJdm9pZCBTZXRDbG9ja0FjdGl2ZUxvdygpOworCXZvaWQgU2V0Q2xvY2tBY3RpdmVIaWdoKCk7CisKKwl2b2lkIFNldENoaXBTZWxlY3RBY3RpdmVIaWdoKCk7CisJdm9pZCBTZXRDaGlwU2VsZWN0QWN0aXZlTG93KCk7CisKKwl2aXJ0dWFsIGludDMyX3QgV3JpdGUodWludDhfdCogZGF0YSwgdWludDhfdCBzaXplKTsKKwl2aXJ0dWFsIGludDMyX3QgUmVhZChib29sIGluaXRpYXRlLCB1aW50OF90KiBkYXRhUmVjZWl2ZWQsIHVpbnQ4X3Qgc2l6ZSk7CisJdmlydHVhbCBpbnQzMl90IFRyYW5zYWN0aW9uKHVpbnQ4X3QqIGRhdGFUb1NlbmQsIHVpbnQ4X3QqIGRhdGFSZWNlaXZlZCwgdWludDhfdCBzaXplKTsKKworCitwcm90ZWN0ZWQ6CisJdWludDhfdCBtX3BvcnQ7CisJYm9vbCBtX21zYkZpcnN0OworCWJvb2wgbV9zYW1wbGVPblRyYWlsaW5nOworCWJvb2wgbV9jbGtfaWRsZV9oaWdoOworCitwcml2YXRlOgorCXZvaWQgSW5pdCgpOworCisJRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFNQSSk7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvU2FmZVBXTS5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvU2FmZVBXTS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZDVjMjEKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9TYWZlUFdNLmgKQEAgLTAsMCArMSwzOCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJNb3RvclNhZmV0eS5oIgorI2luY2x1ZGUgIlBXTS5oIgorCitjbGFzcyBNb3RvclNhZmV0eUhlbHBlcjsKKworLyoqCisgKiBBIHNhZmUgdmVyc2lvbiBvZiB0aGUgUFdNIGNsYXNzLgorICogSXQgaXMgc2FmZSBiZWNhdXNlIGl0IGltcGxlbWVudHMgdGhlIE1vdG9yU2FmZXR5IGludGVyZmFjZSB0aGF0IHByb3ZpZGVzIHRpbWVvdXRzCisgKiBpbiB0aGUgZXZlbnQgdGhhdCB0aGUgbW90b3IgdmFsdWUgaXMgbm90IHVwZGF0ZWQgYmVmb3JlIHRoZSBleHBpcmF0aW9uIHRpbWUuCisgKiBUaGlzIGRlbGVnYXRlcyB0aGUgYWN0dWFsIHdvcmsgdG8gYSBNb3RvclNhZmV0eUhlbHBlciBvYmplY3QgdGhhdCBpcyB1c2VkIGZvciBhbGwKKyAqIG9iamVjdHMgdGhhdCBpbXBsZW1lbnQgTW90b3JTYWZldHkuCisgKi8KK2NsYXNzIFNhZmVQV00gOiBwdWJsaWMgUFdNLCBwdWJsaWMgTW90b3JTYWZldHkKK3sKK3B1YmxpYzoKKwlleHBsaWNpdCBTYWZlUFdNKHVpbnQzMl90IGNoYW5uZWwpOworCX5TYWZlUFdNKCk7CisKKwl2b2lkIFNldEV4cGlyYXRpb24oZmxvYXQgdGltZW91dCk7CisJZmxvYXQgR2V0RXhwaXJhdGlvbigpOworCWJvb2wgSXNBbGl2ZSgpOworCXZvaWQgU3RvcE1vdG9yKCk7CisJYm9vbCBJc1NhZmV0eUVuYWJsZWQoKTsKKwl2b2lkIFNldFNhZmV0eUVuYWJsZWQoYm9vbCBlbmFibGVkKTsKKwl2b2lkIEdldERlc2NyaXB0aW9uKGNoYXIgKmRlc2MpOworCisJdmlydHVhbCB2b2lkIFNldFNwZWVkKGZsb2F0IHNwZWVkKTsKK3ByaXZhdGU6CisJdm9pZCBJbml0U2FmZVBXTSgpOworCU1vdG9yU2FmZXR5SGVscGVyICptX3NhZmV0eUhlbHBlcjsKK307CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9TYW1wbGVSb2JvdC5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvU2FtcGxlUm9ib3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Njg0MmI2Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvU2FtcGxlUm9ib3QuaApAQCAtMCwwICsxLDI1IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIlJvYm90QmFzZS5oIgorCitjbGFzcyBTYW1wbGVSb2JvdCA6IHB1YmxpYyBSb2JvdEJhc2UKK3sKK3B1YmxpYzoKKwlTYW1wbGVSb2JvdCgpOworCXZpcnR1YWwgflNhbXBsZVJvYm90KCkge30KKwl2aXJ0dWFsIHZvaWQgUm9ib3RJbml0KCk7CisJdmlydHVhbCB2b2lkIERpc2FibGVkKCk7CisJdmlydHVhbCB2b2lkIEF1dG9ub21vdXMoKTsKKwl2aXJ0dWFsIHZvaWQgT3BlcmF0b3JDb250cm9sKCk7CisJdmlydHVhbCB2b2lkIFRlc3QoKTsKKwl2aXJ0dWFsIHZvaWQgUm9ib3RNYWluKCk7CisJdm9pZCBTdGFydENvbXBldGl0aW9uKCk7CisKK3ByaXZhdGU6CisJYm9vbCBtX3JvYm90TWFpbk92ZXJyaWRkZW47Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvU2Vydm8uaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1NlcnZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVjZmUxZgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1NlcnZvLmgKQEAgLTAsMCArMSw0OCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJTYWZlUFdNLmgiCisjaW5jbHVkZSAiU3BlZWRDb250cm9sbGVyLmgiCisKKy8qKgorICogU3RhbmRhcmQgaG9iYnkgc3R5bGUgc2Vydm8uCisgKgorICogVGhlIHJhbmdlIHBhcmFtZXRlcnMgZGVmYXVsdCB0byB0aGUgYXBwcm9wcmlhdGUgdmFsdWVzIGZvciB0aGUgSGl0ZWMgSFMtMzIySEQgc2Vydm8gcHJvdmlkZWQKKyAqIGluIHRoZSBGSVJTVCBLaXQgb2YgUGFydHMgaW4gMjAwOC4KKyAqLworY2xhc3MgU2Vydm8gOiBwdWJsaWMgU2FmZVBXTQoreworcHVibGljOgorCWV4cGxpY2l0IFNlcnZvKHVpbnQzMl90IGNoYW5uZWwpOworCXZpcnR1YWwgflNlcnZvKCk7CisJdm9pZCBTZXQoZmxvYXQgdmFsdWUpOworCXZvaWQgU2V0T2ZmbGluZSgpOworCWZsb2F0IEdldCgpOworCXZvaWQgU2V0QW5nbGUoZmxvYXQgYW5nbGUpOworCWZsb2F0IEdldEFuZ2xlKCk7CisJc3RhdGljIGZsb2F0IEdldE1heEFuZ2xlKCkKKwl7CisJCXJldHVybiBrTWF4U2Vydm9BbmdsZTsKKwl9CisJc3RhdGljIGZsb2F0IEdldE1pbkFuZ2xlKCkKKwl7CisJCXJldHVybiBrTWluU2Vydm9BbmdsZTsKKwl9CisKK3ByaXZhdGU6CisJdm9pZCBJbml0U2Vydm8oKTsKKwlmbG9hdCBHZXRTZXJ2b0FuZ2xlUmFuZ2UoKQorCXsKKwkJcmV0dXJuIGtNYXhTZXJ2b0FuZ2xlIC0ga01pblNlcnZvQW5nbGU7CisJfQorCisJc3RhdGljIGNvbnN0ZXhwciBmbG9hdCBrTWF4U2Vydm9BbmdsZSA9IDE4MC4wOworCXN0YXRpYyBjb25zdGV4cHIgZmxvYXQga01pblNlcnZvQW5nbGUgPSAwLjA7CisKKwlzdGF0aWMgY29uc3RleHByIGZsb2F0IGtEZWZhdWx0TWF4U2Vydm9QV00gPSAyLjQ7CisJc3RhdGljIGNvbnN0ZXhwciBmbG9hdCBrRGVmYXVsdE1pblNlcnZvUFdNID0gLjY7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvU29sZW5vaWQuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1NvbGVub2lkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU1NGVhMgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1NvbGVub2lkLmgKQEAgLTAsMCArMSwzMCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJTb2xlbm9pZEJhc2UuaCIKKworLyoqCisgKiBTb2xlbm9pZCBjbGFzcyBmb3IgcnVubmluZyBoaWdoIHZvbHRhZ2UgRGlnaXRhbCBPdXRwdXQgKFBDTSkuCisgKiAKKyAqIFRoZSBTb2xlbm9pZCBjbGFzcyBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgcG5ldW1hdGljcyBzb2xlbm9pZHMsIGJ1dCBjb3VsZCBiZSB1c2VkCisgKiBmb3IgYW55IGRldmljZSB3aXRoaW4gdGhlIGN1cnJlbnQgc3BlYyBvZiB0aGUgUENNLgorICovCitjbGFzcyBTb2xlbm9pZCA6IHB1YmxpYyBTb2xlbm9pZEJhc2UKK3sKK3B1YmxpYzoKKwlleHBsaWNpdCBTb2xlbm9pZCh1aW50MzJfdCBjaGFubmVsKTsKKwlTb2xlbm9pZCh1aW50OF90IG1vZHVsZU51bWJlciwgdWludDMyX3QgY2hhbm5lbCk7CisJdmlydHVhbCB+U29sZW5vaWQoKTsKKwl2aXJ0dWFsIHZvaWQgU2V0KGJvb2wgb24pOworCXZpcnR1YWwgYm9vbCBHZXQoKTsKKwlib29sIElzQmxhY2tMaXN0ZWQoKTsKKworcHJpdmF0ZToKKwl2b2lkIEluaXRTb2xlbm9pZCgpOworCisJdWludDMyX3QgbV9jaGFubmVsOyAvLy88IFRoZSBjaGFubmVsIG9uIHRoZSBtb2R1bGUgdG8gY29udHJvbC4KK307CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9Tb2xlbm9pZEJhc2UuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1NvbGVub2lkQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MDgyM2YKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9Tb2xlbm9pZEJhc2UuaApAQCAtMCwwICsxLDM3IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIlJlc291cmNlLmgiCisjaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgorI2luY2x1ZGUgIkhBTC9IQUwuaHBwIgorI2luY2x1ZGUgIkhBTC9jcHAvU3luY2hyb25pemVkLmhwcCIKKworLyoqCisgKiBTb2xlbm9pZEJhc2UgY2xhc3MgaXMgdGhlIGNvbW1vbiBiYXNlIGNsYXNzIGZvciB0aGUgU29sZW5vaWQgYW5kCisgKiBEb3VibGVTb2xlbm9pZCBjbGFzc2VzLgorICovCitjbGFzcyBTb2xlbm9pZEJhc2UgOiBwdWJsaWMgU2Vuc29yQmFzZQoreworcHVibGljOgorCXZpcnR1YWwgflNvbGVub2lkQmFzZSgpOworCXVpbnQ4X3QgR2V0QWxsKCk7CisKKwl1aW50OF90IEdldFBDTVNvbGVub2lkQmxhY2tMaXN0KCk7CisJYm9vbCBHZXRQQ01Tb2xlbm9pZFZvbHRhZ2VTdGlja3lGYXVsdCgpOworCWJvb2wgR2V0UENNU29sZW5vaWRWb2x0YWdlRmF1bHQoKTsKKwl2b2lkIENsZWFyQWxsUENNU3RpY2t5RmF1bHRzKCk7Citwcm90ZWN0ZWQ6CisJZXhwbGljaXQgU29sZW5vaWRCYXNlKHVpbnQ4X3QgcGNtSUQpOworCXZvaWQgU2V0KHVpbnQ4X3QgdmFsdWUsIHVpbnQ4X3QgbWFzayk7CisJdmlydHVhbCB2b2lkIEluaXRTb2xlbm9pZCgpID0gMDsKKworCXVpbnQzMl90IG1fbW9kdWxlTnVtYmVyOyAvLy88IFNsb3QgbnVtYmVyIHdoZXJlIHRoZSBtb2R1bGUgaXMgcGx1Z2dlZCBpbnRvIHRoZSBjaGFzc2lzLgorCXN0YXRpYyBSZXNvdXJjZSAqbV9hbGxvY2F0ZWQ7CisKK3ByaXZhdGU6CisJdm9pZCogbV9wb3J0c1trU29sZW5vaWRDaGFubmVsc107Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvU3BlZWRDb250cm9sbGVyLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9TcGVlZENvbnRyb2xsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmQ5MjY2Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvU3BlZWRDb250cm9sbGVyLmgKQEAgLTAsMCArMSwzNSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJIQUwvSEFMLmhwcCIKKyNpbmNsdWRlICJQSURPdXRwdXQuaCIKKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIHNwZWVkIGNvbnRyb2xsaW5nIGRldmljZXMuCisgKi8KK2NsYXNzIFNwZWVkQ29udHJvbGxlciA6IHB1YmxpYyBQSURPdXRwdXQKK3sKK3B1YmxpYzoKKwl2aXJ0dWFsIH5TcGVlZENvbnRyb2xsZXIoKSB7fQorCS8qKgorCSAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIHNldHRpbmcgdGhlIHNwZWVkIG9mIGEgc3BlZWQgY29udHJvbGxlci4KKwkgKiAKKwkgKiBAcGFyYW0gc3BlZWQgVGhlIHNwZWVkIHRvIHNldC4gIFZhbHVlIHNob3VsZCBiZSBiZXR3ZWVuIC0xLjAgYW5kIDEuMC4KKwkgKiBAcGFyYW0gc3luY0dyb3VwIFRoZSB1cGRhdGUgZ3JvdXAgdG8gYWRkIHRoaXMgU2V0KCkgdG8sIHBlbmRpbmcgVXBkYXRlU3luY0dyb3VwKCkuICBJZiAwLCB1cGRhdGUgaW1tZWRpYXRlbHkuCisJICovCisJdmlydHVhbCB2b2lkIFNldChmbG9hdCBzcGVlZCwgdWludDhfdCBzeW5jR3JvdXAgPSAwKSA9IDA7CisJLyoqCisJICogQ29tbW9uIGludGVyZmFjZSBmb3IgZ2V0dGluZyB0aGUgY3VycmVudCBzZXQgc3BlZWQgb2YgYSBzcGVlZCBjb250cm9sbGVyLgorCSAqIAorCSAqIEByZXR1cm4gVGhlIGN1cnJlbnQgc2V0IHNwZWVkLiAgVmFsdWUgaXMgYmV0d2VlbiAtMS4wIGFuZCAxLjAuCisJICovCisJdmlydHVhbCBmbG9hdCBHZXQoKSA9IDA7CisJLyoqCisJICogQ29tbW9uIGludGVyZmFjZSBmb3IgZGlzYWJsaW5nIGEgbW90b3IuCisJICovCisJdmlydHVhbCB2b2lkIERpc2FibGUoKSA9IDA7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvVGFsb24uaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1RhbG9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUxMWNjZAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1RhbG9uLmgKQEAgLTAsMCArMSwyOCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJTYWZlUFdNLmgiCisjaW5jbHVkZSAiU3BlZWRDb250cm9sbGVyLmgiCisjaW5jbHVkZSAiUElET3V0cHV0LmgiCisKKy8qKgorICogQ3Jvc3MgdGhlIFJvYWQgRWxlY3Ryb25pY3MgKENUUkUpIFRhbG9uIGFuZCBUYWxvbiBTUiBTcGVlZCBDb250cm9sbGVyCisgKi8KK2NsYXNzIFRhbG9uIDogcHVibGljIFNhZmVQV00sIHB1YmxpYyBTcGVlZENvbnRyb2xsZXIKK3sKK3B1YmxpYzoKKwlleHBsaWNpdCBUYWxvbih1aW50MzJfdCBjaGFubmVsKTsKKwl2aXJ0dWFsIH5UYWxvbigpOworCXZpcnR1YWwgdm9pZCBTZXQoZmxvYXQgdmFsdWUsIHVpbnQ4X3Qgc3luY0dyb3VwID0gMCk7CisJdmlydHVhbCBmbG9hdCBHZXQoKTsKKwl2aXJ0dWFsIHZvaWQgRGlzYWJsZSgpOworCisJdmlydHVhbCB2b2lkIFBJRFdyaXRlKGZsb2F0IG91dHB1dCk7CisKK3ByaXZhdGU6CisJdm9pZCBJbml0VGFsb24oKTsKK307CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9UYWxvblNSWC5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvVGFsb25TUlguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTM2YjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvVGFsb25TUlguaApAQCAtMCwwICsxLDI5IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIlNhZmVQV00uaCIKKyNpbmNsdWRlICJTcGVlZENvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJQSURPdXRwdXQuaCIKKworLyoqCisgKiBDcm9zcyB0aGUgUm9hZCBFbGVjdHJvbmljcyAoQ1RSRSkgVGFsb24gU1JYIFNwZWVkIENvbnRyb2xsZXIgd2l0aCBQV00gY29udHJvbAorICogQHNlZSBDQU5UYWxvbiBmb3IgQ0FOIGNvbnRyb2wKKyAqLworY2xhc3MgVGFsb25TUlggOiBwdWJsaWMgU2FmZVBXTSwgcHVibGljIFNwZWVkQ29udHJvbGxlcgoreworcHVibGljOgorCWV4cGxpY2l0IFRhbG9uU1JYKHVpbnQzMl90IGNoYW5uZWwpOworCXZpcnR1YWwgflRhbG9uU1JYKCk7CisJdmlydHVhbCB2b2lkIFNldChmbG9hdCB2YWx1ZSwgdWludDhfdCBzeW5jR3JvdXAgPSAwKTsKKwl2aXJ0dWFsIGZsb2F0IEdldCgpOworCXZpcnR1YWwgdm9pZCBEaXNhYmxlKCk7CisKKwl2aXJ0dWFsIHZvaWQgUElEV3JpdGUoZmxvYXQgb3V0cHV0KTsKKworcHJpdmF0ZToKKwl2b2lkIEluaXRUYWxvblNSWCgpOworfTsKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1VsdHJhc29uaWMuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1VsdHJhc29uaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODRlNGNhCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvVWx0cmFzb25pYy5oCkBAIC0wLDAgKzEsODAgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgorI2luY2x1ZGUgIlRhc2suaCIKKyNpbmNsdWRlICJQSURTb3VyY2UuaCIKKworY2xhc3MgQ291bnRlcjsKK2NsYXNzIERpZ2l0YWxJbnB1dDsKK2NsYXNzIERpZ2l0YWxPdXRwdXQ7CisKKy8qKgorICogVWx0cmFzb25pYyByYW5nZWZpbmRlciBjbGFzcy4KKyAqIFRoZSBVbHRyYXNvbmljIHJhbmdlZmluZGVyIG1lYXN1cmVzIGFic29sdXRlIGRpc3RhbmNlIGJhc2VkIG9uIHRoZSByb3VuZC10cmlwIHRpbWUKKyAqIG9mIGEgcGluZyBnZW5lcmF0ZWQgYnkgdGhlIGNvbnRyb2xsZXIuIFRoZXNlIHNlbnNvcnMgdXNlIHR3byB0cmFuc2R1Y2VycywgYSBzcGVha2VyIGFuZAorICogYSBtaWNyb3Bob25lIGJvdGggdHVuZWQgdG8gdGhlIHVsdHJhc29uaWMgcmFuZ2UuIEEgY29tbW9uIHVsdHJhc29uaWMgc2Vuc29yLCB0aGUgRGF2ZW50ZWNoIFNSRjA0CisgKiByZXF1aXJlcyBhIHNob3J0IHB1bHNlIHRvIGJlIGdlbmVyYXRlZCBvbiBhIGRpZ2l0YWwgY2hhbm5lbC4gVGhpcyBjYXVzZXMgdGhlIGNoaXJwIHRvIGJlCisgKiBlbW1pdHRlZC4gQSBzZWNvbmQgbGluZSBiZWNvbWVzIGhpZ2ggYXMgdGhlIHBpbmcgaXMgdHJhbnNtaXR0ZWQgYW5kIGdvZXMgbG93IHdoZW4KKyAqIHRoZSBlY2hvIGlzIHJlY2VpdmVkLiBUaGUgdGltZSB0aGF0IHRoZSBsaW5lIGlzIGhpZ2ggZGV0ZXJtaW5lcyB0aGUgcm91bmQgdHJpcCBkaXN0YW5jZQorICogKHRpbWUgb2YgZmxpZ2h0KS4KKyAqLworY2xhc3MgVWx0cmFzb25pYyA6IHB1YmxpYyBTZW5zb3JCYXNlLCBwdWJsaWMgUElEU291cmNlCit7CitwdWJsaWM6CisJZW51bSBEaXN0YW5jZVVuaXQKKwl7CisJCWtJbmNoZXMgPSAwLAorCQlrTWlsbGlNZXRlcnMgPSAxCisJfTsKKworCVVsdHJhc29uaWMoRGlnaXRhbE91dHB1dCAqcGluZ0NoYW5uZWwsIERpZ2l0YWxJbnB1dCAqZWNob0NoYW5uZWwsIERpc3RhbmNlVW5pdCB1bml0cyA9IGtJbmNoZXMpOworCVVsdHJhc29uaWMoRGlnaXRhbE91dHB1dCAmcGluZ0NoYW5uZWwsIERpZ2l0YWxJbnB1dCAmZWNob0NoYW5uZWwsIERpc3RhbmNlVW5pdCB1bml0cyA9IGtJbmNoZXMpOworCVVsdHJhc29uaWModWludDMyX3QgcGluZ0NoYW5uZWwsIHVpbnQzMl90IGVjaG9DaGFubmVsLCBEaXN0YW5jZVVuaXQgdW5pdHMgPSBrSW5jaGVzKTsKKwl2aXJ0dWFsIH5VbHRyYXNvbmljKCk7CisKKwl2b2lkIFBpbmcoKTsKKwlib29sIElzUmFuZ2VWYWxpZCgpOworCXN0YXRpYyB2b2lkIFNldEF1dG9tYXRpY01vZGUoYm9vbCBlbmFibGluZyk7CisJZG91YmxlIEdldFJhbmdlSW5jaGVzKCk7CisJZG91YmxlIEdldFJhbmdlTU0oKTsKKwlib29sIElzRW5hYmxlZCgpCisJeworCQlyZXR1cm4gbV9lbmFibGVkOworCX0KKwl2b2lkIFNldEVuYWJsZWQoYm9vbCBlbmFibGUpCisJeworCQltX2VuYWJsZWQgPSBlbmFibGU7CisJfQorCisJZG91YmxlIFBJREdldCgpOworCXZvaWQgU2V0RGlzdGFuY2VVbml0cyhEaXN0YW5jZVVuaXQgdW5pdHMpOworCURpc3RhbmNlVW5pdCBHZXREaXN0YW5jZVVuaXRzKCk7CisKK3ByaXZhdGU6CisJdm9pZCBJbml0aWFsaXplKCk7CisKKwlzdGF0aWMgdm9pZCBVbHRyYXNvbmljQ2hlY2tlcigpOworCisJc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga1BpbmdUaW1lID0gMTAgKiAxZS02OwkvLy88IFRpbWUgKHNlYykgZm9yIHRoZSBwaW5nIHRyaWdnZXIgcHVsc2UuCisJc3RhdGljIGNvbnN0IHVpbnQzMl90IGtQcmlvcml0eSA9IDkwOwkvLy88IFByaW9yaXR5IHRoYXQgdGhlIHVsdHJhc29uaWMgcm91bmQgcm9iaW4gdGFzayBydW5zLgorCXN0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtNYXhVbHRyYXNvbmljVGltZSA9IDAuMTsJLy8vPCBNYXggdGltZSAobXMpIGJldHdlZW4gcmVhZGluZ3MuCisJc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga1NwZWVkT2ZTb3VuZEluY2hlc1BlclNlYyA9IDExMzAuMCAqIDEyLjA7CisKKwlzdGF0aWMgVGFzayBtX3Rhc2s7IC8vIHRhc2sgZG9pbmcgdGhlIHJvdW5kLXJvYmluIGF1dG9tYXRpYyBzZW5zaW5nCisJc3RhdGljIFVsdHJhc29uaWMgKm1fZmlyc3RTZW5zb3I7IC8vIGhlYWQgb2YgdGhlIHVsdHJhc29uaWMgc2Vuc29yIGxpc3QKKwlzdGF0aWMgYm9vbCBtX2F1dG9tYXRpY0VuYWJsZWQ7IC8vIGF1dG9tYXRpYyByb3VuZCByb2JpbiBtb2RlCisJc3RhdGljIFNFTUFQSE9SRV9JRCBtX3NlbWFwaG9yZTsgLy8gc3luY2hyb25pemUgYWNjZXNzIHRvIHRoZSBsaXN0IG9mIHNlbnNvcnMKKworCURpZ2l0YWxJbnB1dCAqbV9lY2hvQ2hhbm5lbDsKKwlEaWdpdGFsT3V0cHV0ICptX3BpbmdDaGFubmVsOworCWJvb2wgbV9hbGxvY2F0ZWRDaGFubmVsczsKKwlib29sIG1fZW5hYmxlZDsKKwlDb3VudGVyICptX2NvdW50ZXI7CisJVWx0cmFzb25pYyAqbV9uZXh0U2Vuc29yOworCURpc3RhbmNlVW5pdCBtX3VuaXRzOworfTsKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1ZpY3Rvci5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvVmljdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE4MzUxOQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1ZpY3Rvci5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiU2FmZVBXTS5oIgorI2luY2x1ZGUgIlNwZWVkQ29udHJvbGxlci5oIgorI2luY2x1ZGUgIlBJRE91dHB1dC5oIgorCisvKioKKyAqIFZleCBSb2JvdGljcyBWaWN0b3IgODg4IFNwZWVkIENvbnRyb2xsZXIKKyAqCisgKiBUaGUgVmV4IFJvYm90aWNzIFZpY3RvciA4ODQgU3BlZWQgQ29udHJvbGxlciBjYW4gYWxzbyBiZSB1c2VkIHdpdGggdGhpcworICogY2xhc3MgYnV0IG1heSBuZWVkIHRvIGJlIGNhbGlicmF0ZWQgcGVyIHRoZSBWaWN0b3IgODg0IHVzZXIgbWFudWFsLgorICovCitjbGFzcyBWaWN0b3IgOiBwdWJsaWMgU2FmZVBXTSwgcHVibGljIFNwZWVkQ29udHJvbGxlcgoreworcHVibGljOgorCWV4cGxpY2l0IFZpY3Rvcih1aW50MzJfdCBjaGFubmVsKTsKKwl2aXJ0dWFsIH5WaWN0b3IoKTsKKwl2aXJ0dWFsIHZvaWQgU2V0KGZsb2F0IHZhbHVlLCB1aW50OF90IHN5bmNHcm91cCA9IDApOworCXZpcnR1YWwgZmxvYXQgR2V0KCk7CisJdmlydHVhbCB2b2lkIERpc2FibGUoKTsKKworCXZpcnR1YWwgdm9pZCBQSURXcml0ZShmbG9hdCBvdXRwdXQpOworCitwcml2YXRlOgorCXZvaWQgSW5pdFZpY3RvcigpOworfTsKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1ZpY3RvclNQLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9WaWN0b3JTUC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYmE0ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9WaWN0b3JTUC5oCkBAIC0wLDAgKzEsMjggQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiU2FmZVBXTS5oIgorI2luY2x1ZGUgIlNwZWVkQ29udHJvbGxlci5oIgorI2luY2x1ZGUgIlBJRE91dHB1dC5oIgorCisvKioKKyAqIFZleCBSb2JvdGljcyBWaWN0b3IgU1AgU3BlZWQgQ29udHJvbGxlcgorICovCitjbGFzcyBWaWN0b3JTUCA6IHB1YmxpYyBTYWZlUFdNLCBwdWJsaWMgU3BlZWRDb250cm9sbGVyCit7CitwdWJsaWM6CisJZXhwbGljaXQgVmljdG9yU1AodWludDMyX3QgY2hhbm5lbCk7CisJdmlydHVhbCB+VmljdG9yU1AoKTsKKwl2aXJ0dWFsIHZvaWQgU2V0KGZsb2F0IHZhbHVlLCB1aW50OF90IHN5bmNHcm91cCA9IDApOworCXZpcnR1YWwgZmxvYXQgR2V0KCk7CisJdmlydHVhbCB2b2lkIERpc2FibGUoKTsKKworCXZpcnR1YWwgdm9pZCBQSURXcml0ZShmbG9hdCBvdXRwdXQpOworCitwcml2YXRlOgorCXZvaWQgSW5pdFZpY3RvclNQKCk7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvVmlzaW9uL0F4aXNDYW1lcmEuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1Zpc2lvbi9BeGlzQ2FtZXJhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc5MjA5MwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1Zpc2lvbi9BeGlzQ2FtZXJhLmgKQEAgLTAsMCArMSwxMjcgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHRocmVhZD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8bXV0ZXg+CisKKyNpbmNsdWRlICJFcnJvckJhc2UuaCIKKyNpbmNsdWRlICJWaXNpb24vQ29sb3JJbWFnZS5oIgorI2luY2x1ZGUgIlZpc2lvbi9IU0xJbWFnZS5oIgorI2luY2x1ZGUgIm5pdmlzaW9uLmgiCisKKy8qKgorICogQXhpcyBNMTAxMSBuZXR3b3JrIGNhbWVyYQorICovCitjbGFzcyBBeGlzQ2FtZXJhOiBwdWJsaWMgRXJyb3JCYXNlCit7CitwdWJsaWM6CisJZW51bSBXaGl0ZUJhbGFuY2UKKwl7CisJCWtXaGl0ZUJhbGFuY2VfQXV0b21hdGljLAorCQlrV2hpdGVCYWxhbmNlX0hvbGQsCisJCWtXaGl0ZUJhbGFuY2VfRml4ZWRPdXRkb29yMSwKKwkJa1doaXRlQmFsYW5jZV9GaXhlZE91dGRvb3IyLAorCQlrV2hpdGVCYWxhbmNlX0ZpeGVkSW5kb29yLAorCQlrV2hpdGVCYWxhbmNlX0ZpeGVkRmx1b3Jlc2NlbnQxLAorCQlrV2hpdGVCYWxhbmNlX0ZpeGVkRmx1b3Jlc2NlbnQyCisJfTsKKworCWVudW0gRXhwb3N1cmVDb250cm9sCisJeworCQlrRXhwb3N1cmVDb250cm9sX0F1dG9tYXRpYywKKwkJa0V4cG9zdXJlQ29udHJvbF9Ib2xkLAorCQlrRXhwb3N1cmVDb250cm9sX0ZsaWNrZXJGcmVlNTBIeiwKKwkJa0V4cG9zdXJlQ29udHJvbF9GbGlja2VyRnJlZTYwSHoKKwl9OworCisJZW51bSBSZXNvbHV0aW9uCisJeworCQlrUmVzb2x1dGlvbl82NDB4NDgwLAorCQlrUmVzb2x1dGlvbl80ODB4MzYwLAorCQlrUmVzb2x1dGlvbl8zMjB4MjQwLAorCQlrUmVzb2x1dGlvbl8yNDB4MTgwLAorCQlrUmVzb2x1dGlvbl8xNzZ4MTQ0LAorCQlrUmVzb2x1dGlvbl8xNjB4MTIwLAorCX07CisKKwllbnVtIFJvdGF0aW9uCisJeworCQlrUm90YXRpb25fMCwga1JvdGF0aW9uXzE4MAorCX07CisKKwlleHBsaWNpdCBBeGlzQ2FtZXJhKHN0ZDo6c3RyaW5nIGNvbnN0JiBjYW1lcmFIb3N0KTsKKwl2aXJ0dWFsIH5BeGlzQ2FtZXJhKCk7CisKKwlib29sIElzRnJlc2hJbWFnZSgpIGNvbnN0OworCisJaW50IEdldEltYWdlKEltYWdlICppbWFnZSk7CisJaW50IEdldEltYWdlKENvbG9ySW1hZ2UgKmltYWdlKTsKKwlIU0xJbWFnZSAqR2V0SW1hZ2UoKTsKKwlpbnQgQ29weUpQRUcoY2hhciAqKmRlc3RJbWFnZSwgdW5zaWduZWQgaW50ICZkZXN0SW1hZ2VTaXplLCB1bnNpZ25lZCBpbnQgJmRlc3RJbWFnZUJ1ZmZlclNpemUpOworCisJdm9pZCBXcml0ZUJyaWdodG5lc3MoaW50IGJyaWdodG5lc3MpOworCWludCBHZXRCcmlnaHRuZXNzKCk7CisKKwl2b2lkIFdyaXRlV2hpdGVCYWxhbmNlKFdoaXRlQmFsYW5jZSB3aGl0ZUJhbGFuY2UpOworCVdoaXRlQmFsYW5jZSBHZXRXaGl0ZUJhbGFuY2UoKTsKKworCXZvaWQgV3JpdGVDb2xvckxldmVsKGludCBjb2xvckxldmVsKTsKKwlpbnQgR2V0Q29sb3JMZXZlbCgpOworCisJdm9pZCBXcml0ZUV4cG9zdXJlQ29udHJvbChFeHBvc3VyZUNvbnRyb2wgZXhwb3N1cmVDb250cm9sKTsKKwlFeHBvc3VyZUNvbnRyb2wgR2V0RXhwb3N1cmVDb250cm9sKCk7CisKKwl2b2lkIFdyaXRlRXhwb3N1cmVQcmlvcml0eShpbnQgZXhwb3N1cmVQcmlvcml0eSk7CisJaW50IEdldEV4cG9zdXJlUHJpb3JpdHkoKTsKKworCXZvaWQgV3JpdGVNYXhGUFMoaW50IG1heEZQUyk7CisJaW50IEdldE1heEZQUygpOworCisJdm9pZCBXcml0ZVJlc29sdXRpb24oUmVzb2x1dGlvbiByZXNvbHV0aW9uKTsKKwlSZXNvbHV0aW9uIEdldFJlc29sdXRpb24oKTsKKworCXZvaWQgV3JpdGVDb21wcmVzc2lvbihpbnQgY29tcHJlc3Npb24pOworCWludCBHZXRDb21wcmVzc2lvbigpOworCisJdm9pZCBXcml0ZVJvdGF0aW9uKFJvdGF0aW9uIHJvdGF0aW9uKTsKKwlSb3RhdGlvbiBHZXRSb3RhdGlvbigpOworCitwcml2YXRlOgorCXN0ZDo6dGhyZWFkIG1fY2FwdHVyZVRocmVhZDsKKwlzdGQ6OnN0cmluZyBtX2NhbWVyYUhvc3Q7CisJaW50IG1fY2FtZXJhU29ja2V0OworCXN0ZDo6bXV0ZXggbV9jYXB0dXJlTXV0ZXg7CisKKwlzdGQ6Om11dGV4IG1faW1hZ2VEYXRhTXV0ZXg7CisJc3RkOjp2ZWN0b3I8dWludDhfdD4gbV9pbWFnZURhdGE7CisJYm9vbCBtX2ZyZXNoSW1hZ2U7CisKKwlpbnQgbV9icmlnaHRuZXNzOworCVdoaXRlQmFsYW5jZSBtX3doaXRlQmFsYW5jZTsKKwlpbnQgbV9jb2xvckxldmVsOworCUV4cG9zdXJlQ29udHJvbCBtX2V4cG9zdXJlQ29udHJvbDsKKwlpbnQgbV9leHBvc3VyZVByaW9yaXR5OworCWludCBtX21heEZQUzsKKwlSZXNvbHV0aW9uIG1fcmVzb2x1dGlvbjsKKwlpbnQgbV9jb21wcmVzc2lvbjsKKwlSb3RhdGlvbiBtX3JvdGF0aW9uOworCWJvb2wgbV9wYXJhbWV0ZXJzRGlydHk7CisJYm9vbCBtX3N0cmVhbURpcnR5OworCXN0ZDo6bXV0ZXggbV9wYXJhbWV0ZXJzTXV0ZXg7CisKKwlib29sIG1fZG9uZTsKKworCXZvaWQgQ2FwdHVyZSgpOworCXZvaWQgUmVhZEltYWdlc0Zyb21DYW1lcmEoKTsKKwlib29sIFdyaXRlUGFyYW1ldGVycygpOworCisJaW50IENyZWF0ZUNhbWVyYVNvY2tldChzdGQ6OnN0cmluZyBjb25zdCYgcmVxdWVzdFN0cmluZywgYm9vbCBzZXRFcnJvcik7CisKKwlESVNBTExPV19DT1BZX0FORF9BU1NJR04oQXhpc0NhbWVyYSk7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvVmlzaW9uL0JhZVV0aWxpdGllcy5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvVmlzaW9uL0JhZVV0aWxpdGllcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ODRiMDcKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9WaXNpb24vQmFlVXRpbGl0aWVzLmgKQEAgLTAsMCArMSw1NyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNwcmFnbWEgb25jZQorCisvKiAgQ29uc3RhbnRzICovCisjZGVmaW5lIExPR19ERUJVRyAgICBfX0ZJTEVfXyxfX0ZVTkNUSU9OX18sX19MSU5FX18sREVCVUdfVFlQRQorI2RlZmluZSBMT0dfSU5GTyAgICAgX19GSUxFX18sX19GVU5DVElPTl9fLF9fTElORV9fLElORk9fVFlQRQorI2RlZmluZSBMT0dfRVJST1IgICAgX19GSUxFX18sX19GVU5DVElPTl9fLF9fTElORV9fLEVSUk9SX1RZUEUKKyNkZWZpbmUgTE9HX0NSSVRJQ0FMIF9fRklMRV9fLF9fRlVOQ1RJT05fXyxfX0xJTkVfXyxDUklUSUNBTF9UWVBFCisjZGVmaW5lIExPR19GQVRBTCAgICBfX0ZJTEVfXyxfX0ZVTkNUSU9OX18sX19MSU5FX18sRkFUQUxfVFlQRQorI2RlZmluZSBMT0dfREVCVUcgICAgX19GSUxFX18sX19GVU5DVElPTl9fLF9fTElORV9fLERFQlVHX1RZUEUKKworLyogICBFbnVtZXJhdGVkIFR5cGVzICovCisKKy8qKiBkZWJ1ZyBsZXZlbHMgKi8KK2VudW0gZHByaW50X3R5cGUge0RFQlVHX1RZUEUsIElORk9fVFlQRSwgRVJST1JfVFlQRSwgQ1JJVElDQUxfVFlQRSwgRkFUQUxfVFlQRX07CisKKy8qKiBkZWJ1ZyBvdXRwdXQgc2V0dGluZyAqLwordHlwZWRlZiBlbnVtIERlYnVnT3V0cHV0VHlwZV9lbnVtIHsgCisJREVCVUdfT0ZGLCBERUJVR19NT1NUTFlfT0ZGLCBERUJVR19TQ1JFRU5fT05MWSwgREVCVUdfRklMRV9PTkxZLCBERUJVR19TQ1JFRU5fQU5EX0ZJTEUKK31EZWJ1Z091dHB1dFR5cGU7CisKKy8qICBFbnVtZXJhdGVkIFR5cGVzICovCisKKy8qIFV0aWxpdHkgZnVuY3Rpb25zICovCisKKy8qIGRlYnVnICovCit2b2lkIFNldERlYnVnRmxhZyAoIERlYnVnT3V0cHV0VHlwZSBmbGFnICApOyAKK3ZvaWQgZHByaW50ZiAoIGNvbnN0IGNoYXIgKiB0ZW1wU3RyaW5nLCAuLi4gICk7ICAvKiBWYXJpYWJsZSBhcmd1bWVudCBsaXN0ICovCisKKy8qIHNldCBGUkMgcmFuZ2VzIGZvciBkcml2ZSAqLworZG91YmxlIFJhbmdlVG9Ob3JtYWxpemVkKGRvdWJsZSBwaXhlbCwgaW50IHJhbmdlKTsKKy8qIGNoYW5nZSBub3JtYWxpemVkIHZhbHVlIHRvIGFueSByYW5nZSAtIHVzZWQgZm9yIHNlcnZvICovCitmbG9hdCBOb3JtYWxpemVUb1JhbmdlKGZsb2F0IG5vcm1hbGl6ZWRWYWx1ZSwgZmxvYXQgbWluUmFuZ2UsIGZsb2F0IG1heFJhbmdlKTsKK2Zsb2F0IE5vcm1hbGl6ZVRvUmFuZ2UoZmxvYXQgbm9ybWFsaXplZFZhbHVlKTsKKworLyogc3lzdGVtIHV0aWxpdGllcyAqLwordm9pZCBTaG93QWN0aXZpdHkgKGNoYXIgKmZtdCwgLi4uKTsKK2RvdWJsZSBFbGFwc2VkVGltZSAoZG91YmxlIHN0YXJ0VGltZSk7CisKKy8qIHNlcnZvIHBhbm5pbmcgdXRpbGl0aWVzICovCitjbGFzcyBTZXJ2bzsKK2RvdWJsZSBTaW5Qb3NpdGlvbiAoZG91YmxlICpwZXJpb2QsIGRvdWJsZSBzaW5TdGFydCk7Cit2b2lkIHBhbkluaXQoKTsKK3ZvaWQgcGFuSW5pdChkb3VibGUgcGVyaW9kKTsKK3ZvaWQgcGFuRm9yVGFyZ2V0KFNlcnZvICpwYW5TZXJ2byk7Cit2b2lkIHBhbkZvclRhcmdldChTZXJ2byAqcGFuU2Vydm8sIGRvdWJsZSBzaW5TdGFydCk7CisKKy8qIGNvbmZpZyBmaWxlIHJlYWQgdXRpbGl0aWVzICovCitpbnQgcHJvY2Vzc0ZpbGUoY2hhciAqaW5wdXRGaWxlLCBjaGFyICpvdXRwdXRTdHJpbmcsIGludCBsaW5lTnVtYmVyKTsKK2ludCBlbXB0eVN0cmluZyhjaGFyICpzdHJpbmcpOwordm9pZCBzdHJpcFN0cmluZyhjaGFyICpzdHJpbmcpOworCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9WaXNpb24vQmluYXJ5SW1hZ2UuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1Zpc2lvbi9CaW5hcnlJbWFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMzNmNTQKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9WaXNpb24vQmluYXJ5SW1hZ2UuaApAQCAtMCwwICsxLDM5IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE0LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJNb25vSW1hZ2UuaCIKKy8qKgorICogSW5jbHVkZWQgZm9yIFBhcnRpY2xlQW5hbHlzaXNSZXBvcnQgZGVmaW5pdGlvbgorICogVE9ETzogRWxpbWluYXRlIHRoaXMgZGVwZW5kZW5jeSEgCisgKi8KKyNpbmNsdWRlICJWaXNpb24vVmlzaW9uQVBJLmgiCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCitjbGFzcyBCaW5hcnlJbWFnZSA6IHB1YmxpYyBNb25vSW1hZ2UKK3sKK3B1YmxpYzoKKwlCaW5hcnlJbWFnZSgpOworCXZpcnR1YWwgfkJpbmFyeUltYWdlKCk7CisJaW50IEdldE51bWJlclBhcnRpY2xlcygpOworCVBhcnRpY2xlQW5hbHlzaXNSZXBvcnQgR2V0UGFydGljbGVBbmFseXNpc1JlcG9ydChpbnQgcGFydGljbGVOdW1iZXIpOworCXZvaWQgR2V0UGFydGljbGVBbmFseXNpc1JlcG9ydChpbnQgcGFydGljbGVOdW1iZXIsIFBhcnRpY2xlQW5hbHlzaXNSZXBvcnQgKnBhcik7CisJc3RkOjp2ZWN0b3I8UGFydGljbGVBbmFseXNpc1JlcG9ydD4qIEdldE9yZGVyZWRQYXJ0aWNsZUFuYWx5c2lzUmVwb3J0cygpOworCUJpbmFyeUltYWdlICpSZW1vdmVTbWFsbE9iamVjdHMoYm9vbCBjb25uZWN0aXZpdHk4LCBpbnQgZXJvc2lvbnMpOworCUJpbmFyeUltYWdlICpSZW1vdmVMYXJnZU9iamVjdHMoYm9vbCBjb25uZWN0aXZpdHk4LCBpbnQgZXJvc2lvbnMpOworCUJpbmFyeUltYWdlICpDb252ZXhIdWxsKGJvb2wgY29ubmVjdGl2aXR5OCk7CisJQmluYXJ5SW1hZ2UgKlBhcnRpY2xlRmlsdGVyKFBhcnRpY2xlRmlsdGVyQ3JpdGVyaWEyICpjcml0ZXJpYSwgaW50IGNyaXRlcmlhQ291bnQpOworCXZpcnR1YWwgdm9pZCBXcml0ZShjb25zdCBjaGFyICpmaWxlTmFtZSk7Citwcml2YXRlOgorCWJvb2wgUGFydGljbGVNZWFzdXJlbWVudChpbnQgcGFydGljbGVOdW1iZXIsIE1lYXN1cmVtZW50VHlwZSB3aGF0VG9NZWFzdXJlLCBpbnQgKnJlc3VsdCk7CisJYm9vbCBQYXJ0aWNsZU1lYXN1cmVtZW50KGludCBwYXJ0aWNsZU51bWJlciwgTWVhc3VyZW1lbnRUeXBlIHdoYXRUb01lYXN1cmUsIGRvdWJsZSAqcmVzdWx0KTsKKwlzdGF0aWMgZG91YmxlIE5vcm1hbGl6ZUZyb21SYW5nZShkb3VibGUgcG9zaXRpb24sIGludCByYW5nZSk7CisJc3RhdGljIGJvb2wgQ29tcGFyZVBhcnRpY2xlU2l6ZXMoUGFydGljbGVBbmFseXNpc1JlcG9ydCBwYXJ0aWNsZTEsIFBhcnRpY2xlQW5hbHlzaXNSZXBvcnQgcGFydGljbGUyKTsKK307CisKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1Zpc2lvbi9Db2xvckltYWdlLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9WaXNpb24vQ29sb3JJbWFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NWVkODMKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9WaXNpb24vQ29sb3JJbWFnZS5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkltYWdlQmFzZS5oIgorI2luY2x1ZGUgIkJpbmFyeUltYWdlLmgiCisjaW5jbHVkZSAiVGhyZXNob2xkLmgiCisKK2NsYXNzIENvbG9ySW1hZ2UgOiBwdWJsaWMgSW1hZ2VCYXNlCit7CitwdWJsaWM6CisJQ29sb3JJbWFnZShJbWFnZVR5cGUgdHlwZSk7CisJdmlydHVhbCB+Q29sb3JJbWFnZSgpOworCUJpbmFyeUltYWdlICpUaHJlc2hvbGRSR0IoaW50IHJlZExvdywgaW50IHJlZEhpZ2gsIGludCBncmVlbkxvdywgaW50IGdyZWVuSGlnaCwgaW50IGJsdWVMb3csIGludCBibHVlSGlnaCk7CisJQmluYXJ5SW1hZ2UgKlRocmVzaG9sZEhTTChpbnQgaHVlTG93LCBpbnQgaHVlSGlnaCwgaW50IHNhdHVyYXRpb25Mb3csIGludCBzYXR1cmF0aW9uSGlnaCwgaW50IGx1bWluZW5jZUxvdywgaW50IGx1bWluZW5jZUhpZ2gpOworCUJpbmFyeUltYWdlICpUaHJlc2hvbGRIU1YoaW50IGh1ZUxvdywgaW50IGh1ZUhpZ2gsIGludCBzYXR1cmF0aW9uTG93LCBpbnQgc2F0dXJhdGlvbkhpZ2gsIGludCB2YWx1ZUhpZ2gsIGludCB2YWx1ZUxvdyk7CisJQmluYXJ5SW1hZ2UgKlRocmVzaG9sZEhTSShpbnQgaHVlTG93LCBpbnQgaHVlSGlnaCwgaW50IHNhdHVyYXRpb25Mb3csIGludCBzYXR1cmF0aW9uSGlnaCwgaW50IGludGVuc2l0eUxvdywgaW50IGludGVuc2l0eUhpZ2gpOworCUJpbmFyeUltYWdlICpUaHJlc2hvbGRSR0IoVGhyZXNob2xkICZ0aHJlc2hvbGQpOworCUJpbmFyeUltYWdlICpUaHJlc2hvbGRIU0woVGhyZXNob2xkICZ0aHJlc2hvbGQpOworCUJpbmFyeUltYWdlICpUaHJlc2hvbGRIU1YoVGhyZXNob2xkICZ0aHJlc2hvbGQpOworCUJpbmFyeUltYWdlICpUaHJlc2hvbGRIU0koVGhyZXNob2xkICZ0aHJlc2hvbGQpOworCU1vbm9JbWFnZSAqR2V0UmVkUGxhbmUoKTsKKwlNb25vSW1hZ2UgKkdldEdyZWVuUGxhbmUoKTsKKwlNb25vSW1hZ2UgKkdldEJsdWVQbGFuZSgpOworCU1vbm9JbWFnZSAqR2V0SFNMSHVlUGxhbmUoKTsKKwlNb25vSW1hZ2UgKkdldEhTVkh1ZVBsYW5lKCk7CisJTW9ub0ltYWdlICpHZXRIU0lIdWVQbGFuZSgpOworCU1vbm9JbWFnZSAqR2V0SFNMU2F0dXJhdGlvblBsYW5lKCk7CisJTW9ub0ltYWdlICpHZXRIU1ZTYXR1cmF0aW9uUGxhbmUoKTsKKwlNb25vSW1hZ2UgKkdldEhTSVNhdHVyYXRpb25QbGFuZSgpOworCU1vbm9JbWFnZSAqR2V0THVtaW5hbmNlUGxhbmUoKTsKKwlNb25vSW1hZ2UgKkdldFZhbHVlUGxhbmUoKTsKKwlNb25vSW1hZ2UgKkdldEludGVuc2l0eVBsYW5lKCk7CisJdm9pZCBSZXBsYWNlUmVkUGxhbmUoTW9ub0ltYWdlICpwbGFuZSk7CisJdm9pZCBSZXBsYWNlR3JlZW5QbGFuZShNb25vSW1hZ2UgKnBsYW5lKTsKKwl2b2lkIFJlcGxhY2VCbHVlUGxhbmUoTW9ub0ltYWdlICpwbGFuZSk7CisJdm9pZCBSZXBsYWNlSFNMSHVlUGxhbmUoTW9ub0ltYWdlICpwbGFuZSk7CisJdm9pZCBSZXBsYWNlSFNWSHVlUGxhbmUoTW9ub0ltYWdlICpwbGFuZSk7CisJdm9pZCBSZXBsYWNlSFNJSHVlUGxhbmUoTW9ub0ltYWdlICpwbGFuZSk7CisJdm9pZCBSZXBsYWNlSFNMU2F0dXJhdGlvblBsYW5lKE1vbm9JbWFnZSAqcGxhbmUpOworCXZvaWQgUmVwbGFjZUhTVlNhdHVyYXRpb25QbGFuZShNb25vSW1hZ2UgKnBsYW5lKTsKKwl2b2lkIFJlcGxhY2VIU0lTYXR1cmF0aW9uUGxhbmUoTW9ub0ltYWdlICpwbGFuZSk7CisJdm9pZCBSZXBsYWNlTHVtaW5hbmNlUGxhbmUoTW9ub0ltYWdlICpwbGFuZSk7CisJdm9pZCBSZXBsYWNlVmFsdWVQbGFuZShNb25vSW1hZ2UgKnBsYW5lKTsKKwl2b2lkIFJlcGxhY2VJbnRlbnNpdHlQbGFuZShNb25vSW1hZ2UgKnBsYW5lKTsKKwl2b2lkIENvbG9yRXF1YWxpemUoKTsKKwl2b2lkIEx1bWluYW5jZUVxdWFsaXplKCk7CisJCitwcml2YXRlOgorCUJpbmFyeUltYWdlICpDb21wdXRlVGhyZXNob2xkKENvbG9yTW9kZSBjb2xvck1vZGUsIGludCBsb3cxLCBpbnQgaGlnaDEsIGludCBsb3cyLCBpbnQgaGlnaDIsIGludCBsb3czLCBpbnQgaGlnaDMpOworCXZvaWQgRXF1YWxpemUoYm9vbCBhbGxQbGFuZXMpOworCU1vbm9JbWFnZSAqIEV4dHJhY3RDb2xvclBsYW5lKENvbG9yTW9kZSBtb2RlLCBpbnQgcGxhbmVOdW1iZXIpOworCU1vbm9JbWFnZSAqIEV4dHJhY3RGaXJzdENvbG9yUGxhbmUoQ29sb3JNb2RlIG1vZGUpOworCU1vbm9JbWFnZSAqIEV4dHJhY3RTZWNvbmRDb2xvclBsYW5lKENvbG9yTW9kZSBtb2RlKTsKKwlNb25vSW1hZ2UgKiBFeHRyYWN0VGhpcmRDb2xvclBsYW5lKENvbG9yTW9kZSBtb2RlKTsKKwl2b2lkIFJlcGxhY2VQbGFuZShDb2xvck1vZGUgbW9kZSwgTW9ub0ltYWdlICpwbGFuZSwgaW50IHBsYW5lTnVtYmVyKTsKKwl2b2lkIFJlcGxhY2VGaXJzdENvbG9yUGxhbmUoQ29sb3JNb2RlIG1vZGUsIE1vbm9JbWFnZSAqcGxhbmUpOworCXZvaWQgUmVwbGFjZVNlY29uZENvbG9yUGxhbmUoQ29sb3JNb2RlIG1vZGUsIE1vbm9JbWFnZSAqcGxhbmUpOworCXZvaWQgUmVwbGFjZVRoaXJkQ29sb3JQbGFuZShDb2xvck1vZGUgbW9kZSwgTW9ub0ltYWdlICpwbGFuZSk7Cit9OworCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9WaXNpb24vRnJjRXJyb3IuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1Zpc2lvbi9GcmNFcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZDQ3ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9WaXNpb24vRnJjRXJyb3IuaApAQCAtMCwwICsxLDMwIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE0LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI3ByYWdtYSBvbmNlCisKKy8qIEVycm9yIENvZGVzICovCisjZGVmaW5lIEVSUl9WSVNJT05fR0VORVJBTF9FUlJPUgkJCTE2NjAwMAkvLyAKKyNkZWZpbmUgRVJSX0NPTE9SX05PVF9GT1VORAkJCQkJMTY2MTAwCS8vIFRyYWNrQVBJLmNwcAorI2RlZmluZSBFUlJfUEFSVElDTEVfVE9PX1NNQUxMCQkJCTE2NjEwMQkvLyBUcmFja0FQSS5jcHAKKworI2RlZmluZSBFUlJfQ0FNRVJBX0ZBSUxVUkUJCQkJCTE2NjIwMAkvLyBBeGlzQ2FtZXJhLmNwcAorI2RlZmluZSBFUlJfQ0FNRVJBX1NPQ0tFVF9DUkVBVEVfRkFJTEVECQkxNjYyMDEJLy8gQXhpc0NhbWVyYS5jcHAKKyNkZWZpbmUgRVJSX0NBTUVSQV9DT05ORUNUX0ZBSUxFRAkJCTE2NjIwMgkvLyBBeGlzQ2FtZXJhLmNwcAorI2RlZmluZSBFUlJfQ0FNRVJBX1NUQUxFX0lNQUdFCQkJCTE2NjIwMwkvLyBBeGlzQ2FtZXJhLmNwcAorI2RlZmluZSBFUlJfQ0FNRVJBX05PVF9JTklUSUFMSVpFRAkJCTE2NjIwNAkvLyBBeGlzQ2FtZXJhLmNwcAorI2RlZmluZSBFUlJfQ0FNRVJBX05PX0JVRkZFUl9BVkFJTEFCTEUJCTE2NjIwNQkvLyBBeGlzQ2FtZXJhLmNwcAorI2RlZmluZSBFUlJfQ0FNRVJBX0hFQURFUl9FUlJPUgkJCQkxNjYyMDYJLy8gQXhpc0NhbWVyYS5jcHAKKyNkZWZpbmUgRVJSX0NBTUVSQV9CTE9DS0lOR19USU1FT1VUCQkJMTY2MjA3CS8vIEF4aXNDYW1lcmEuY3BwCisjZGVmaW5lIEVSUl9DQU1FUkFfQVVUSE9SSVpBVElPTl9GQUlMRUQJCTE2NjIwOAkvLyBBeGlzQ2FtZXJhLmNwcAorI2RlZmluZSBFUlJfQ0FNRVJBX1RBU0tfU1BBV05fRkFJTEVECQkxNjYyMDkJLy8gQXhpc0NhbWVyYS5jcHAKKyNkZWZpbmUgRVJSX0NBTUVSQV9UQVNLX0lOUFVUX09VVF9PRl9SQU5HRQkxNjYyMTAJLy8gQXhpc0NhbWVyYS5jcHAKKyNkZWZpbmUgRVJSX0NBTUVSQV9DT01NQU5EX0ZBSUxVUkUJCQkxNjYyMTEJLy8gQXhpc0NhbWVyYS5jcHAKKworLyogZXJyb3IgaGFuZGxpbmcgZnVuY3Rpb25zICovCitpbnQgR2V0TGFzdFZpc2lvbkVycm9yKCk7Citjb25zdCBjaGFyKiBHZXRWaXNpb25FcnJvclRleHQoaW50IGVycm9yQ29kZSk7CisKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1Zpc2lvbi9IU0xJbWFnZS5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvVmlzaW9uL0hTTEltYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE0MjhhYQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1Zpc2lvbi9IU0xJbWFnZS5oCkBAIC0wLDAgKzEsMjIgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkNvbG9ySW1hZ2UuaCIKKworLyoqCisgKiBBIGNvbG9yIGltYWdlIHJlcHJlc2VudGVkIGluIEhTTCBjb2xvciBzcGFjZSBhdCAzIGJ5dGVzIHBlciBwaXhlbC4KKyAqLworY2xhc3MgSFNMSW1hZ2UgOiBwdWJsaWMgQ29sb3JJbWFnZQoreworcHVibGljOgorICAgIEhTTEltYWdlKCk7CisgICAgSFNMSW1hZ2UoY29uc3QgY2hhciAqZmlsZU5hbWUpOworICAgIHZpcnR1YWwgfkhTTEltYWdlKCk7Cit9OworCisKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1Zpc2lvbi9JbWFnZUJhc2UuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1Zpc2lvbi9JbWFnZUJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTVlODk1Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvVmlzaW9uL0ltYWdlQmFzZS5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAibml2aXNpb24uaCIKKyNpbmNsdWRlICJFcnJvckJhc2UuaCIKKworI2RlZmluZSBERUZBVUxUX0JPUkRFUl9TSVpFIDMKKworY2xhc3MgSW1hZ2VCYXNlIDogcHVibGljIEVycm9yQmFzZQoreworcHVibGljOgorCUltYWdlQmFzZShJbWFnZVR5cGUgdHlwZSk7CisJdmlydHVhbCB+SW1hZ2VCYXNlKCk7CisJdmlydHVhbCB2b2lkIFdyaXRlKGNvbnN0IGNoYXIgKmZpbGVOYW1lKTsKKwlpbnQgR2V0SGVpZ2h0KCk7CisJaW50IEdldFdpZHRoKCk7CisJSW1hZ2UgKkdldEltYXFJbWFnZSgpOworcHJvdGVjdGVkOgorCUltYWdlICptX2ltYXFJbWFnZTsKK307CisKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1Zpc2lvbi9Nb25vSW1hZ2UuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1Zpc2lvbi9Nb25vSW1hZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGUzNWViCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvVmlzaW9uL01vbm9JbWFnZS5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE0LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLw0KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisjcHJhZ21hIG9uY2UNCisNCisjaW5jbHVkZSAiSW1hZ2VCYXNlLmgiDQorDQorI2luY2x1ZGUgPHZlY3Rvcj4NCisNCitjbGFzcyBNb25vSW1hZ2UgOiBwdWJsaWMgSW1hZ2VCYXNlDQorew0KK3B1YmxpYzoNCisJTW9ub0ltYWdlKCk7DQorCXZpcnR1YWwgfk1vbm9JbWFnZSgpOw0KKw0KKwlzdGQ6OnZlY3RvcjxFbGxpcHNlTWF0Y2g+ICpEZXRlY3RFbGxpcHNlcyhFbGxpcHNlRGVzY3JpcHRvciAqZWxsaXBzZURlc2NyaXB0b3IsDQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnZlT3B0aW9ucyAqY3VydmVPcHRpb25zLA0KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaGFwZURldGVjdGlvbk9wdGlvbnMgKnNoYXBlRGV0ZWN0aW9uT3B0aW9ucywNCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUk9JICpyb2kpOw0KKwlzdGQ6OnZlY3RvcjxFbGxpcHNlTWF0Y2g+ICogRGV0ZWN0RWxsaXBzZXMoRWxsaXBzZURlc2NyaXB0b3IgKmVsbGlwc2VEZXNjcmlwdG9yKTsNCit9Ow0KKw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1Zpc2lvbi9SR0JJbWFnZS5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvVmlzaW9uL1JHQkltYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVmMmQ3MgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1Zpc2lvbi9SR0JJbWFnZS5oCkBAIC0wLDAgKzEsMjEgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkNvbG9ySW1hZ2UuaCIKKworLyoqCisgKiBBIGNvbG9yIGltYWdlIHJlcHJlc2VudGVkIGluIFJHQiBjb2xvciBzcGFjZSBhdCAzIGJ5dGVzIHBlciBwaXhlbC4KKyAqLworY2xhc3MgUkdCSW1hZ2UgOiBwdWJsaWMgQ29sb3JJbWFnZQoreworcHVibGljOgorICAgIFJHQkltYWdlKCk7CisgICAgUkdCSW1hZ2UoY29uc3QgY2hhciAqZmlsZU5hbWUpOworICAgIHZpcnR1YWwgflJHQkltYWdlKCk7Cit9OworCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9WaXNpb24vVGhyZXNob2xkLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9WaXNpb24vVGhyZXNob2xkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA3MGNiZgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1Zpc2lvbi9UaHJlc2hvbGQuaApAQCAtMCwwICsxLDI4IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8NCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorI3ByYWdtYSBvbmNlDQorDQorLyoqDQorICogQ29sb3IgdGhyZXNob2xkIHZhbHVlcy4NCisgKiBUaGlzIG9iamVjdCByZXByZXNudHMgdGhlIHRocmVzaG9sZCB2YWx1ZXMgZm9yIGFueSB0eXBlIG9mIGNvbG9yIG9iamVjdA0KKyAqIHRoYXQgaXMgdXNlZCBpbiBhIHRocmVzaGhvbGQgb3BlcmF0aW9uLiBJdCBzaW1wbGlmaWVzIHBhc3NpbmcgdmFsdWVzDQorICogYXJvdW5kIGluIGEgcHJvZ3JhbSBmb3IgY29sb3IgZGV0ZWN0aW9uLg0KKyAqLw0KK2NsYXNzIFRocmVzaG9sZCANCit7DQorcHVibGljOg0KKwlpbnQgcGxhbmUxTG93Ow0KKwlpbnQgcGxhbmUxSGlnaDsNCisJaW50IHBsYW5lMkxvdzsNCisJaW50IHBsYW5lMkhpZ2g7DQorCWludCBwbGFuZTNMb3c7DQorCWludCBwbGFuZTNIaWdoOw0KKwlUaHJlc2hvbGQoaW50IHBsYW5lMUxvdywgaW50IHBsYW5lMUhpZ2gsDQorCSAgICAgICAgICBpbnQgcGxhbmUyTG93LCBpbnQgcGxhbmUySGlnaCwNCisJICAgICAgICAgIGludCBwbGFuZTNMb3csIGludCBwbGFuZTNIaWdoKTsNCit9Ow0KKw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1Zpc2lvbi9WaXNpb25BUEkuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1Zpc2lvbi9WaXNpb25BUEkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTI5MWJmCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvVmlzaW9uL1Zpc2lvbkFQSS5oCkBAIC0wLDAgKzEsMTQ4IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE0LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJuaXZpc2lvbi5oIiAKKworLyogICBDb25zdGFudHMgKi8KKworI2RlZmluZSBERUZBVUxUX0JPUkRFUl9TSVpFCQkJCTMJCS8vVmlzaW9uQVBJLmZyY0NyZWF0ZUltYWdlCisjZGVmaW5lIERFRkFVTFRfU0FUVVJBVElPTl9USFJFU0hPTEQJNDAJCS8vVHJhY2tBUEkuRmluZENvbG9yCisKKy8qICAgRm9yd2FyZCBEZWNsYXJlIERhdGEgU3RydWN0dXJlcyAqLwordHlwZWRlZiBzdHJ1Y3QgRmluZEVkZ2VPcHRpb25zX3N0cnVjdCBGaW5kRWRnZU9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBDaXJjdWxhckVkZ2VSZXBvcnRfc3RydWN0IENpcmN1bGFyRWRnZVJlcG9ydDsKKworLyogICBEYXRhIFN0cnVjdHVyZXMgKi8KKworLyoqICBmcmNQYXJ0aWNsZUFuYWx5c2lzIHJldHVybnMgdGhpcyBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IFBhcnRpY2xlQW5hbHlzaXNSZXBvcnRfc3RydWN0IHsKKwlpbnQgCWltYWdlSGVpZ2h0OworCWludCAJaW1hZ2VXaWR0aDsKKwlkb3VibGUgCWltYWdlVGltZXN0YW1wOwkJCQkKKwlpbnQJCXBhcnRpY2xlSW5kZXg7CQkJCS8vIHRoZSBwYXJ0aWNsZSBpbmRleCBhbmFseXplZAorCS8qIFgtY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQgcmVwcmVzZW50aW5nIHRoZSBhdmVyYWdlIHBvc2l0aW9uIG9mIHRoZSAKKwkgKiB0b3RhbCBwYXJ0aWNsZSBtYXNzLCBhc3N1bWluZyBldmVyeSBwb2ludCBpbiB0aGUgcGFydGljbGUgaGFzIGEgY29uc3RhbnQgZGVuc2l0eSAqLworCWludCAJY2VudGVyX21hc3NfeDsgIAkJCS8vIE1lYXN1cmVtZW50VHlwZTogSU1BUV9NVF9DRU5URVJfT0ZfTUFTU19YIAorCS8qIFktY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQgcmVwcmVzZW50aW5nIHRoZSBhdmVyYWdlIHBvc2l0aW9uIG9mIHRoZSAKKwkgKiB0b3RhbCBwYXJ0aWNsZSBtYXNzLCBhc3N1bWluZyBldmVyeSBwb2ludCBpbiB0aGUgcGFydGljbGUgaGFzIGEgY29uc3RhbnQgZGVuc2l0eSAqLworCWludCAJY2VudGVyX21hc3NfeTsgIAkJCS8vIE1lYXN1cmVtZW50VHlwZTogSU1BUV9NVF9DRU5URVJfT0ZfTUFTU19ZIAorCWRvdWJsZSAJY2VudGVyX21hc3NfeF9ub3JtYWxpemVkOyAgCS8vQ2VudGVyIG9mIG1hc3MgeCB2YWx1ZSBub3JtYWxpemVkIHRvIC0xLjAgdG8gKzEuMCByYW5nZQorCWRvdWJsZSAJY2VudGVyX21hc3NfeV9ub3JtYWxpemVkOyAgCS8vQ2VudGVyIG9mIG1hc3MgeSB2YWx1ZSBub3JtYWxpemVkIHRvIC0xLjAgdG8gKzEuMCByYW5nZQorCS8qIEFyZWEgb2YgdGhlIHBhcnRpY2xlICovCisJZG91YmxlIAlwYXJ0aWNsZUFyZWE7CQkJCS8vIE1lYXN1cmVtZW50VHlwZTogSU1BUV9NVF9BUkVBCisJLyogQm91bmRpbmcgUmVjdGFuZ2xlICovCisJUmVjdCAJYm91bmRpbmdSZWN0OwkJCQkvLyBsZWZ0L3RvcC93aWR0aC9oZWlnaHQKKwkvKiBQZXJjZW50YWdlIG9mIHRoZSBwYXJ0aWNsZSBBcmVhIGNvdmVyaW5nIHRoZSBJbWFnZSBBcmVhLiAqLworCWRvdWJsZSAJcGFydGljbGVUb0ltYWdlUGVyY2VudDsJCS8vIE1lYXN1cmVtZW50VHlwZTogSU1BUV9NVF9BUkVBX0JZX0lNQUdFX0FSRUEKKwkvKiBQZXJjZW50YWdlIG9mIHRoZSBwYXJ0aWNsZSBBcmVhIGluIHJlbGF0aW9uIHRvIGl0cyBQYXJ0aWNsZSBhbmQgSG9sZXMgQXJlYSAqLworCWRvdWJsZSAJcGFydGljbGVRdWFsaXR5OwkJCS8vIE1lYXN1cmVtZW50VHlwZTogSU1BUV9NVF9BUkVBX0JZX1BBUlRJQ0xFX0FORF9IT0xFU19BUkVBCit9IFBhcnRpY2xlQW5hbHlzaXNSZXBvcnQ7CisKKy8qKiBUcmFja2luZyBmdW5jdGlvbnMgcmV0dXJuIHRoaXMgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBDb2xvclJlcG9ydF9zdHJ1Y3QgeworCWludAkJbnVtYmVyUGFydGljbGVzRm91bmQ7CQkJCS8vIE51bWJlciBvZiBwYXJ0aWNsZXMgZm91bmQgZm9yIHRoaXMgY29sb3IKKwlpbnQgCWxhcmdlc3RQYXJ0aWNsZU51bWJlcjsJCQkJLy8gVGhlIHBhcnRpY2xlIGluZGV4IG9mIHRoZSBsYXJnZXN0IHBhcnRpY2xlCisJLyogQ29sb3IgaW5mb3JtYXRpb24gKi8KKwlmbG9hdCAJcGFydGljbGVIdWVNYXg7CQkJCS8vIEhpc3RvZ3JhbVJlcG9ydDogaHVlIG1heAorCWZsb2F0IAlwYXJ0aWNsZUh1ZU1pbjsJCQkJLy8gSGlzdG9ncmFtUmVwb3J0OiBodWUgbWF4CisJZmxvYXQgCXBhcnRpY2xlSHVlTWVhbjsJCQkvLyBIaXN0b2dyYW1SZXBvcnQ6IGh1ZSBtZWFuCisJZmxvYXQgCXBhcnRpY2xlU2F0TWF4OwkJCQkvLyBIaXN0b2dyYW1SZXBvcnQ6IHNhdHVyYXRpb24gbWF4CisJZmxvYXQgCXBhcnRpY2xlU2F0TWluOwkJCQkvLyBIaXN0b2dyYW1SZXBvcnQ6IHNhdHVyYXRpb24gbWF4CisJZmxvYXQgCXBhcnRpY2xlU2F0TWVhbjsJCQkvLyBIaXN0b2dyYW1SZXBvcnQ6IHNhdHVyYXRpb24gbWVhbgorCWZsb2F0IAlwYXJ0aWNsZUx1bU1heDsJCQkJLy8gSGlzdG9ncmFtUmVwb3J0OiBsdW1pbmFuY2UgbWF4CisJZmxvYXQgCXBhcnRpY2xlTHVtTWluOwkJCQkvLyBIaXN0b2dyYW1SZXBvcnQ6IGx1bWluYW5jZSAgbWF4CisJZmxvYXQgCXBhcnRpY2xlTHVtTWVhbjsJCQkvLyBIaXN0b2dyYW1SZXBvcnQ6IGx1bWluYW5jZSBtZWFuCit9IENvbG9yUmVwb3J0OworCisKKy8qICAgSW1hZ2UgTWFuYWdlbWVudCBmdW5jdGlvbnMgKi8KKworLyogQ3JlYXRlOiBjYWxscyBpbWFxQ3JlYXRlSW1hZ2UuIEJvcmRlciBzaXplIGlzIHNldCB0byBzb21lIGRlZmF1bHQgdmFsdWUgKi8KK0ltYWdlKiBmcmNDcmVhdGVJbWFnZSggSW1hZ2VUeXBlIHR5cGUgKTsKKworLyogRGlzcG9zZTogY2FsbHMgaW1hcURpc3Bvc2UgKi8KK2ludCBmcmNEaXNwb3NlKCB2b2lkKiBvYmplY3QgKTsKK2ludCBmcmNEaXNwb3NlKCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgLi4uICkgOworCisvKiBDb3B5OiBjYWxscyBpbWFxRHVwbGljYXRlSW1hZ2UgKi8KK2ludCBmcmNDb3B5SW1hZ2UoIEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlICk7CisKKy8qIEltYWdlIEV4dHJhY3Rpb246IENyb3A6IGNhbGxzIGltYXFTY2FsZSAqLworaW50IGZyY0Nyb3AoIEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBSZWN0IHJlY3QgKTsKKworLyogSW1hZ2UgRXh0cmFjdGlvbjogU2NhbGU6IGNhbGxzIGltYXFTY2FsZS4gIFNjYWxlcyBlbnRpcmUgaW1hZ2UgKi8KK2ludCBmcmNTY2FsZShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgaW50IHhTY2FsZSwgaW50IHlTY2FsZSwgU2NhbGluZ01vZGUgc2NhbGVNb2RlICk7CisKKy8qIFJlYWQgSW1hZ2UgOiBjYWxscyBpbWFxUmVhZEZpbGUgKi8KK2ludCBmcmNSZWFkSW1hZ2UoIEltYWdlKiBpbWFnZSwgY29uc3QgY2hhciogZmlsZU5hbWUgKTsKKy8qIFdyaXRlIEltYWdlIDogY2FsbHMgaW1hcVdyaXRlRmlsZSAqLworaW50IGZyY1dyaXRlSW1hZ2UoIGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgY2hhciogZmlsZU5hbWUpOworCisvKiAgIE1lYXN1cmUgSW50ZW5zaXR5IGZ1bmN0aW9ucyAqLworCisvKiBIaXN0b2dyYW06IGNhbGxzIGltYXFIaXN0b2dyYW0gKi8KK0hpc3RvZ3JhbVJlcG9ydCogZnJjSGlzdG9ncmFtKCBjb25zdCBJbWFnZSogaW1hZ2UsIGludCBudW1DbGFzc2VzLCBmbG9hdCBtaW4sIGZsb2F0IG1heCwgUmVjdCByZWN0ICk7CisvKiBDb2xvciBIaXN0b2dyYW06IGNhbGxzIGltYXFDb2xvckhpc3RvZ3JhbTIgKi8KK0NvbG9ySGlzdG9ncmFtUmVwb3J0KiBmcmNDb2xvckhpc3RvZ3JhbShjb25zdCBJbWFnZSogaW1hZ2UsIGludCBudW1DbGFzc2VzLCBDb2xvck1vZGUgbW9kZSwgSW1hZ2UqIG1hc2spOworCisvKiBHZXQgUGl4ZWwgVmFsdWU6IGNhbGxzIGltYXFHZXRQaXhlbCAqLworaW50IGZyY0dldFBpeGVsVmFsdWUoIGNvbnN0IEltYWdlKiBpbWFnZSwgUG9pbnQgcGl4ZWwsIFBpeGVsVmFsdWUqIHZhbHVlICk7CisKKy8qICAgUGFydGljbGUgQW5hbHlzaXMgZnVuY3Rpb25zICovCisKKy8qIFBhcnRpY2xlIEZpbHRlcjogY2FsbHMgaW1hcVBhcnRpY2xlRmlsdGVyMyAqLworaW50IGZyY1BhcnRpY2xlRmlsdGVyKEltYWdlKiBkZXN0LCBJbWFnZSogc291cmNlLCBjb25zdCBQYXJ0aWNsZUZpbHRlckNyaXRlcmlhMiogY3JpdGVyaWEsIAorCQlpbnQgY3JpdGVyaWFDb3VudCwgY29uc3QgUGFydGljbGVGaWx0ZXJPcHRpb25zKiBvcHRpb25zLCBSZWN0IHJlY3QsIGludCogbnVtUGFydGljbGVzKTsKK2ludCBmcmNQYXJ0aWNsZUZpbHRlcihJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSwgY29uc3QgUGFydGljbGVGaWx0ZXJDcml0ZXJpYTIqIGNyaXRlcmlhLCAKKwkJaW50IGNyaXRlcmlhQ291bnQsIGNvbnN0IFBhcnRpY2xlRmlsdGVyT3B0aW9ucyogb3B0aW9ucywgaW50KiBudW1QYXJ0aWNsZXMpOworLyogTW9ycGhvbG9neTogY2FsbHMgaW1hcU1vcnBob2xvZ3kgKi8KK2ludCBmcmNNb3JwaG9sb2d5KEltYWdlKiBkZXN0LCBJbWFnZSogc291cmNlLCBNb3JwaG9sb2d5TWV0aG9kIG1ldGhvZCk7CitpbnQgZnJjTW9ycGhvbG9neShJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSwgTW9ycGhvbG9neU1ldGhvZCBtZXRob2QsIGNvbnN0IFN0cnVjdHVyaW5nRWxlbWVudCogc3RydWN0dXJpbmdFbGVtZW50KTsKKy8qIFJlamVjdCBCb3JkZXI6IGNhbGxzIGltYXFSZWplY3RCb3JkZXIgKi8KK2ludCBmcmNSZWplY3RCb3JkZXIoSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UpOworaW50IGZyY1JlamVjdEJvcmRlcihJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSwgaW50IGNvbm5lY3Rpdml0eTgpOworLyogQ291bnQgUGFydGljbGVzOiBjYWxscyBpbWFxQ291bnRQYXJ0aWNsZXMgKi8KK2ludCBmcmNDb3VudFBhcnRpY2xlcyhJbWFnZSogaW1hZ2UsIGludCogbnVtUGFydGljbGVzKTsKKy8qIFBhcnRpY2xlIEFuYWx5c2lzIFJlcG9ydDogY2FsbHMgaW1hcU1lYXN1cmVQYXJ0aWNsZSAqLworaW50IGZyY1BhcnRpY2xlQW5hbHlzaXMoSW1hZ2UqIGltYWdlLCBpbnQgcGFydGljbGVOdW1iZXIsIFBhcnRpY2xlQW5hbHlzaXNSZXBvcnQqIHBhcik7CisKKy8qICAgSW1hZ2UgRW5oYW5jZW1lbnQgZnVuY3Rpb25zICovCisKKy8qIEVxdWFsaXplOiBjYWxscyBpbWFxRXF1YWxpemUgKi8KK2ludCBmcmNFcXVhbGl6ZShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgZmxvYXQgbWluLCBmbG9hdCBtYXgpOworaW50IGZyY0VxdWFsaXplKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBmbG9hdCBtaW4sIGZsb2F0IG1heCwgY29uc3QgSW1hZ2UqIG1hc2spOworCisvKiBDb2xvciBFcXVhbGl6ZTogY2FsbHMgaW1hcUNvbG9yRXF1YWxpemUgKi8KK2ludCBmcmNDb2xvckVxdWFsaXplKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlKTsKK2ludCBmcmNDb2xvckVxdWFsaXplKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBpbnQgY29sb3JFcXVhbGl6YXRpb24pOworCisvKiAgIEltYWdlIFRocmVzaG9sZGluZyAmIENvbnZlcnNpb24gZnVuY3Rpb25zICovCisKKy8qIFNtYXJ0IFRocmVzaG9sZDogY2FsbHMgaW1hcUxvY2FsVGhyZXNob2xkICovCitpbnQgZnJjU21hcnRUaHJlc2hvbGQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIHVuc2lnbmVkIGludCB3aW5kb3dXaWR0aCwgdW5zaWduZWQgaW50IHdpbmRvd0hlaWdodCwgCisJCUxvY2FsVGhyZXNob2xkTWV0aG9kIG1ldGhvZCwgZG91YmxlIGRldmlhdGlvbldlaWdodCwgT2JqZWN0VHlwZSB0eXBlKTsKK2ludCBmcmNTbWFydFRocmVzaG9sZChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgdW5zaWduZWQgaW50IHdpbmRvd1dpZHRoLCB1bnNpZ25lZCBpbnQgd2luZG93SGVpZ2h0LCAKKwkJTG9jYWxUaHJlc2hvbGRNZXRob2QgbWV0aG9kLCBkb3VibGUgZGV2aWF0aW9uV2VpZ2h0LCBPYmplY3RUeXBlIHR5cGUsIGZsb2F0IHJlcGxhY2VWYWx1ZSk7CisKKy8qIFNpbXBsZSBUaHJlc2hvbGQ6IGNhbGxzIGltYXFUaHJlc2hvbGQgKi8KK2ludCBmcmNTaW1wbGVUaHJlc2hvbGQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGZsb2F0IHJhbmdlTWluLCBmbG9hdCByYW5nZU1heCwgZmxvYXQgbmV3VmFsdWUpOworaW50IGZyY1NpbXBsZVRocmVzaG9sZChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgZmxvYXQgcmFuZ2VNaW4sIGZsb2F0IHJhbmdlTWF4KTsKKworLyogQ29sb3IvSHVlIFRocmVzaG9sZDogY2FsbHMgaW1hcUNvbG9yVGhyZXNob2xkICovCitpbnQgZnJjQ29sb3JUaHJlc2hvbGQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIENvbG9yTW9kZSBtb2RlLCAKKwkJY29uc3QgUmFuZ2UqIHBsYW5lMVJhbmdlLCBjb25zdCBSYW5nZSogcGxhbmUyUmFuZ2UsIGNvbnN0IFJhbmdlKiBwbGFuZTNSYW5nZSk7CitpbnQgZnJjQ29sb3JUaHJlc2hvbGQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGludCByZXBsYWNlVmFsdWUsIENvbG9yTW9kZSBtb2RlLCAKKwkJY29uc3QgUmFuZ2UqIHBsYW5lMVJhbmdlLCBjb25zdCBSYW5nZSogcGxhbmUyUmFuZ2UsIGNvbnN0IFJhbmdlKiBwbGFuZTNSYW5nZSk7CitpbnQgZnJjSHVlVGhyZXNob2xkKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBjb25zdCBSYW5nZSogaHVlUmFuZ2UpOworaW50IGZyY0h1ZVRocmVzaG9sZChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgY29uc3QgUmFuZ2UqIGh1ZVJhbmdlLCBpbnQgbWluU2F0dXJhdGlvbik7CisKKy8qIEV4dHJhY3QgQ29sb3JIdWUgUGxhbmU6IGNhbGxzIGltYXFFeHRyYWN0Q29sb3JQbGFuZXMgKi8KK2ludCBmcmNFeHRyYWN0Q29sb3JQbGFuZXMoY29uc3QgSW1hZ2UqIGltYWdlLCBDb2xvck1vZGUgbW9kZSwgSW1hZ2UqIHBsYW5lMSwgSW1hZ2UqIHBsYW5lMiwgSW1hZ2UqIHBsYW5lMyk7CitpbnQgZnJjRXh0cmFjdEh1ZVBsYW5lKGNvbnN0IEltYWdlKiBpbWFnZSwgSW1hZ2UqIGh1ZVBsYW5lKTsKK2ludCBmcmNFeHRyYWN0SHVlUGxhbmUoY29uc3QgSW1hZ2UqIGltYWdlLCBJbWFnZSogaHVlUGxhbmUsIGludCBtaW5TYXR1cmF0aW9uKTsKKwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvV1BJTGliLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9XUElMaWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGY2ZjkyCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvV1BJTGliLmgKQEAgLTAsMCArMSw5NyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNkZWZpbmUgUkVBTAorCisjaW5jbHVkZSAic3RyaW5nLmgiCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNpbmNsdWRlICJBRFhMMzQ1X0kyQy5oIgorI2luY2x1ZGUgIkFEWEwzNDVfU1BJLmgiCisjaW5jbHVkZSAiQW5hbG9nQWNjZWxlcm9tZXRlci5oIgorI2luY2x1ZGUgIkFuYWxvZ0lucHV0LmgiCisjaW5jbHVkZSAiQW5hbG9nT3V0cHV0LmgiCisjaW5jbHVkZSAiQW5hbG9nUG90ZW50aW9tZXRlci5oIgorI2luY2x1ZGUgIkFuYWxvZ1RyaWdnZXIuaCIKKyNpbmNsdWRlICJBbmFsb2dUcmlnZ2VyT3V0cHV0LmgiCisjaW5jbHVkZSAiQnVpbHRJbkFjY2VsZXJvbWV0ZXIuaCIKKyNpbmNsdWRlICJCdXR0b25zL0ludGVybmFsQnV0dG9uLmgiCisjaW5jbHVkZSAiQnV0dG9ucy9Kb3lzdGlja0J1dHRvbi5oIgorI2luY2x1ZGUgIkJ1dHRvbnMvTmV0d29ya0J1dHRvbi5oIgorI2luY2x1ZGUgIkNhbWVyYVNlcnZlci5oIgorI2luY2x1ZGUgIkNBTkphZ3Vhci5oIgorI2luY2x1ZGUgIkNBTlRhbG9uLmgiCisjaW5jbHVkZSAiQ29tbWFuZHMvQ29tbWFuZC5oIgorI2luY2x1ZGUgIkNvbW1hbmRzL0NvbW1hbmRHcm91cC5oIgorI2luY2x1ZGUgIkNvbW1hbmRzL1BJRENvbW1hbmQuaCIKKyNpbmNsdWRlICJDb21tYW5kcy9QSURTdWJzeXN0ZW0uaCIKKyNpbmNsdWRlICJDb21tYW5kcy9QcmludENvbW1hbmQuaCIKKyNpbmNsdWRlICJDb21tYW5kcy9TY2hlZHVsZXIuaCIKKyNpbmNsdWRlICJDb21tYW5kcy9TdGFydENvbW1hbmQuaCIKKyNpbmNsdWRlICJDb21tYW5kcy9TdWJzeXN0ZW0uaCIKKyNpbmNsdWRlICJDb21tYW5kcy9XYWl0Q29tbWFuZC5oIgorI2luY2x1ZGUgIkNvbW1hbmRzL1dhaXRGb3JDaGlsZHJlbi5oIgorI2luY2x1ZGUgIkNvbW1hbmRzL1dhaXRVbnRpbENvbW1hbmQuaCIKKyNpbmNsdWRlICJDb21wcmVzc29yLmgiCisjaW5jbHVkZSAiQ29udHJvbGxlclBvd2VyLmgiCisjaW5jbHVkZSAiQ291bnRlci5oIgorI2luY2x1ZGUgIkRpZ2l0YWxJbnB1dC5oIgorI2luY2x1ZGUgIkRpZ2l0YWxPdXRwdXQuaCIKKyNpbmNsdWRlICJEaWdpdGFsU291cmNlLmgiCisjaW5jbHVkZSAiRG91YmxlU29sZW5vaWQuaCIKKyNpbmNsdWRlICJEcml2ZXJTdGF0aW9uLmgiCisjaW5jbHVkZSAiRW5jb2Rlci5oIgorI2luY2x1ZGUgIkVycm9yQmFzZS5oIgorI2luY2x1ZGUgIkdlYXJUb290aC5oIgorI2luY2x1ZGUgIkdlbmVyaWNISUQuaCIKKyNpbmNsdWRlICJHeXJvLmgiCisjaW5jbHVkZSAiaW50ZXJmYWNlcy9BY2NlbGVyb21ldGVyLmgiCisjaW5jbHVkZSAiaW50ZXJmYWNlcy9Qb3RlbnRpb21ldGVyLmgiCisjaW5jbHVkZSAiSTJDLmgiCisjaW5jbHVkZSAiSXRlcmF0aXZlUm9ib3QuaCIKKyNpbmNsdWRlICJJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZS5oIgorI2luY2x1ZGUgIkphZ3Vhci5oIgorI2luY2x1ZGUgIkpveXN0aWNrLmgiCisjaW5jbHVkZSAiTm90aWZpZXIuaCIKKyNpbmNsdWRlICJQSURDb250cm9sbGVyLmgiCisjaW5jbHVkZSAiUElET3V0cHV0LmgiCisjaW5jbHVkZSAiUElEU291cmNlLmgiCisjaW5jbHVkZSAiUHJlZmVyZW5jZXMuaCIKKyNpbmNsdWRlICJQb3dlckRpc3RyaWJ1dGlvblBhbmVsLmgiCisjaW5jbHVkZSAiUFdNLmgiCisjaW5jbHVkZSAiUmVsYXkuaCIKKyNpbmNsdWRlICJSZXNvdXJjZS5oIgorI2luY2x1ZGUgIlJvYm90QmFzZS5oIgorI2luY2x1ZGUgIlJvYm90RHJpdmUuaCIKKyNpbmNsdWRlICJTZW5zb3JCYXNlLmgiCisjaW5jbHVkZSAiU2VyaWFsUG9ydC5oIgorI2luY2x1ZGUgIlNlcnZvLmgiCisjaW5jbHVkZSAiU2FtcGxlUm9ib3QuaCIKKyNpbmNsdWRlICJTbWFydERhc2hib2FyZC9TZW5kYWJsZUNob29zZXIuaCIKKyNpbmNsdWRlICJTbWFydERhc2hib2FyZC9TbWFydERhc2hib2FyZC5oIgorI2luY2x1ZGUgIlNvbGVub2lkLmgiCisjaW5jbHVkZSAiU3BlZWRDb250cm9sbGVyLmgiCisjaW5jbHVkZSAiU1BJLmgiCisjaW5jbHVkZSAiSEFML2NwcC9TeW5jaHJvbml6ZWQuaHBwIgorI2luY2x1ZGUgIlRhbG9uLmgiCisjaW5jbHVkZSAiVGFsb25TUlguaCIKKyNpbmNsdWRlICJUYXNrLmgiCisjaW5jbHVkZSAiVGltZXIuaCIKKyNpbmNsdWRlICJVbHRyYXNvbmljLmgiCisjaW5jbHVkZSAiVXRpbGl0eS5oIgorI2luY2x1ZGUgIlZpY3Rvci5oIgorI2luY2x1ZGUgIlZpY3RvclNQLmgiCisjaW5jbHVkZSAiVmlzaW9uL0F4aXNDYW1lcmEuaCIKKyNpbmNsdWRlICJWaXNpb24vQmluYXJ5SW1hZ2UuaCIKKyNpbmNsdWRlICJWaXNpb24vQ29sb3JJbWFnZS5oIgorI2luY2x1ZGUgIlZpc2lvbi9IU0xJbWFnZS5oIgorI2luY2x1ZGUgIlZpc2lvbi9JbWFnZUJhc2UuaCIKKyNpbmNsdWRlICJWaXNpb24vTW9ub0ltYWdlLmgiCisjaW5jbHVkZSAiVmlzaW9uL1JHQkltYWdlLmgiCisjaW5jbHVkZSAiVmlzaW9uL1RocmVzaG9sZC5oIgorLy8gWFhYOiAjaW5jbHVkZSAiVmlzaW9uL0F4aXNDYW1lcmEuaCIKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL2N0cmUvQ2FuVGFsb25TUlguaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL2N0cmUvQ2FuVGFsb25TUlguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2JkNWU0Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvY3RyZS9DYW5UYWxvblNSWC5oCkBAIC0wLDAgKzEsMzc0IEBACisvKioNCisgKiBAYnJpZWYgQ0FOIFRBTE9OIFNSWCBkcml2ZXIuDQorICoNCisgKiBUaGUgVEFMT04gU1JYIGlzIGRlc2lnbmVkIHRvIGluc3RydW1lbnQgYWxsIHJ1bnRpbWUgc2lnbmFscyBwZXJpb2RpY2FsbHkuICBUaGUgZGVmYXVsdCBwZXJpb2RzIGFyZSBjaG9zZW4gdG8gc3VwcG9ydCAxNiBUQUxPTnMNCisgKiB3aXRoIDEwbXMgdXBkYXRlIHJhdGUgZm9yIGNvbnRyb2wgKHRocm90dGxlIG9yIHNldHBvaW50KS4gIEhvd2V2ZXIgdGhlc2UgY2FuIGJlIG92ZXJyaWRkZW4gd2l0aCBTZXRTdGF0dXNGcmFtZVJhdGUuIEBzZWUgU2V0U3RhdHVzRnJhbWVSYXRlDQorICogVGhlIGdldHRlcnMgZm9yIHRoZXNlIHVuc29saWNpdGVkIHNpZ25hbHMgYXJlIGF1dG8gZ2VuZXJhdGVkIGF0IHRoZSBib3R0b20gb2YgdGhpcyBtb2R1bGUuDQorICoNCisgKiBMaWtld2lzZSBtb3N0IGNvbnRyb2wgc2lnbmFscyBhcmUgc2VudCBwZXJpb2RpY2FsbHkgdXNpbmcgdGhlIGZpcmUtYW5kLWZvcmdldCBDQU4gQVBJLg0KKyAqIFRoZSBzZXR0ZXJzIGZvciB0aGVzZSB1bnNvbGljaXRlZCBzaWduYWxzIGFyZSBhdXRvIGdlbmVyYXRlZCBhdCB0aGUgYm90dG9tIG9mIHRoaXMgbW9kdWxlLg0KKyAqDQorICogU2lnbmFscyB0aGF0IGFyZSBub3QgYXZhaWxhYmxlIGluIGFuIHVuc29saWNpdGVkIGZhc2hpb24gYXJlIHRoZSBDbG9zZSBMb29wIGdhaW5zLg0KKyAqIEZvciB0ZWFtcyB0aGF0IGhhdmUgYSBzaW5nbGUgcHJvZmlsZSBmb3IgdGhlaXIgVEFMT04gY2xvc2UgbG9vcCB0aGV5IGNhbiB1c2UgZWl0aGVyIHRoZSB3ZWJwYWdlIHRvIGNvbmZpZ3VyZSB0aGVpciBUQUxPTnMgb25jZQ0KKyAqIAlvciBzZXQgdGhlIFBJREYsSXpvbmUsQ2xvc2VMb29wUmFtcFJhdGUsZXRjLi4uIG9uY2UgaW4gdGhlIHJvYm90IGFwcGxpY2F0aW9uLiAgVGhlc2UgcGFyYW1ldGVycyBhcmUgc2F2ZWQgdG8gZmxhc2ggc28gb25jZSB0aGV5IGFyZQ0KKyAqIAlsb2FkZWQgaW4gdGhlIFRBTE9OLCB0aGV5IHdpbGwgcGVyc2lzdCB0aHJvdWdoIHBvd2VyIGN5Y2xlcyBhbmQgbW9kZSBjaGFuZ2VzLg0KKyAqDQorICogRm9yIHRlYW1zIHRoYXQgaGF2ZSBvbmUgb3IgdHdvIHByb2ZpbGVzIHRvIHN3aXRjaCBiZXR3ZWVuLCB0aGV5IGNhbiB1c2UgdGhlIHNhbWUgc3RyYXRlZ3kgc2luY2UgdGhlcmUgYXJlIHR3byBzbG90cyB0byBjaG9vc2UgZnJvbQ0KKyAqIGFuZCB0aGUgUHJvZmlsZVNsb3RTZWxlY3QgaXMgcGVyaW9kaWNhbGx5IHNlbnQgaW4gdGhlIDEwIG1zIGNvbnRyb2wgZnJhbWUuDQorICoNCisgKiBGb3IgdGVhbXMgdGhhdCByZXF1aXJlIGNoYW5naW5nIGdhaW5zIGZyZXF1ZW50bHksIHRoZXkgY2FuIHVzZSB0aGUgc29saWNpdGluZyBBUEkgdG8gZ2V0IGFuZCBzZXQgdGhvc2UgcGFyYW1ldGVycy4gIE1vc3QgbGlrZWx5DQorICogdGhleSB3aWxsIG9ubHkgbmVlZCB0byBzZXQgdGhlbSBpbiBhIHBlcmlvZGljIGZhc2hpb24gYXMgYSBmdW5jdGlvbiBvZiB3aGF0IG1vdGlvbiB0aGUgYXBwbGljYXRpb24gaXMgYXR0ZW1wdGluZy4NCisgKiBJZiB0aGlzIEFQSSBpcyB1c2VkLCBiZSBtaW5kZnVsIG9mIHRoZSBDQU4gdXRpbGl6YXRpb24gcmVwb3J0ZWQgaW4gdGhlIGRyaXZlciBzdGF0aW9uLg0KKyAqDQorICogRW5jb2RlciBwb3NpdGlvbiBpcyBtZWFzdXJlZCBpbiBlbmNvZGVyIGVkZ2VzLiAgRXZlcnkgZWRnZSBpcyBjb3VudGVkIChzaW1pbGFyIHRvIHJvYm9SSU8gNFggbW9kZSkuDQorICogQW5hbG9nIHBvc2l0aW9uIGlzIDEwIGJpdHMsIG1lYW5pbmcgMTAyNCB0aWNrcyBwZXIgcm90YXRpb24gKDBWID0+IDMuM1YpLg0KKyAqIFVzZSBTZXRGZWVkYmFja0RldmljZVNlbGVjdCB0byBzZWxlY3Qgd2hpY2ggc2Vuc29yIHR5cGUgeW91IG5lZWQuICBPbmNlIHlvdSBkbyB0aGF0IHlvdSBjYW4gdXNlIEdldFNlbnNvclBvc2l0aW9uKCkNCisgKiBhbmQgR2V0U2Vuc29yVmVsb2NpdHkoKS4gIFRoZXNlIHNpZ25hbHMgYXJlIHVwZGF0ZWQgb24gQ0FOQnVzIGV2ZXJ5IDIwbXMgKGJ5IGRlZmF1bHQpLg0KKyAqIElmIGEgcmVsYXRpdmUgc2Vuc29yIGlzIHNlbGVjdGVkLCB5b3UgY2FuIHplcm8gKG9yIGNoYW5nZSB0aGUgY3VycmVudCB2YWx1ZSkgdXNpbmcgU2V0U2Vuc29yUG9zaXRpb24uDQorICoNCisgKiBBbmFsb2cgSW5wdXQgYW5kIHF1YWRyYXR1cmUgcG9zaXRpb24gKGFuZCB2ZWxvY2l0eSkgYXJlIGFsc28gZXhwbGljaXRseSByZXBvcnRlZCBpbiBHZXRFbmNQb3NpdGlvbiwgR2V0RW5jVmVsLCBHZXRBbmFsb2dJbldpdGhPdiwgR2V0QW5hbG9nSW5WZWwuDQorICogVGhlc2Ugc2lnbmFscyBhcmUgYXZhaWxhYmxlIGFsbCB0aGUgdGltZSwgcmVnYXJkbGVzcyBvZiB3aGF0IHNlbnNvciBpcyBzZWxlY3RlZCBhdCBhIHJhdGUgb2YgMTAwbXMuICBUaGlzIGFsbG93cyBlYXN5IGluc3RydW1lbnRhdGlvbg0KKyAqIGZvciAiaW4gdGhlIHBpdHMiIGNoZWNraW5nIG9mIGFsbCBzZW5zb3JzIHJlZ2FyZGxlc3Mgb2YgbW9kZXNlbGVjdC4gIFRoZSAxMDBtcyByYXRlIGlzIG92ZXJyaWRhYmxlIGZvciB0ZWFtcyB3aG8gd2FudCB0byBhY3F1aXJlIHNlbnNvcg0KKyAqIGRhdGEgZm9yIHByb2Nlc3NpbmcsIG5vdCBqdXN0IGluc3RydW1lbnRhdGlvbi4gIE9yIGp1c3Qgc2VsZWN0IHRoZSBzZW5zb3IgdXNpbmcgU2V0RmVlZGJhY2tEZXZpY2VTZWxlY3QgdG8gZ2V0IGl0IGF0IDIwbXMuDQorICoNCisgKiBWZWxvY2l0eSBpcyBpbiBwb3NpdGlvbiB0aWNrcyAvIDEwMG1zLg0KKyAqDQorICogQWxsIG91dHB1dCB1bml0cyBhcmUgaW4gcmVzcGVjdCB0byBkdXR5IGN5Y2xlICh0aHJvdHRsZSkgd2hpY2ggaXMgLTEwMjMoZnVsbCByZXZlcnNlKSB0byArMTAyMyAoZnVsbCBmb3J3YXJkKS4NCisgKiAgVGhpcyBpbmNsdWRlcyBkZW1hbmQgKHdoaWNoIHNwZWNpZmllcyBkdXR5IGN5Y2xlIHdoZW4gaW4gZHV0eSBjeWNsZSBtb2RlKSBhbmQgcmFtcFJhbXAsIHdoaWNoIGlzIGluIHRocm90dGxlIHVuaXRzIHBlciAxMG1zIChpZiBub256ZXJvKS4NCisgKg0KKyAqIFBvcyBhbmQgdmVsb2NpdHkgY2xvc2UgbG9vcHMgYXJlIGNhbGMnZCBhcw0KKyAqIAkJZXJyID0gdGFyZ2V0IC0gcG9zT3JWZWwuDQorICogCQlpRXJyICs9IGVycjsNCisgKiAJCWlmKCAgIChJWm9uZSE9MCkgIGFuZCAgYWJzKGVycikgPiBJWm9uZSkNCisgKiAJCQlDbGVhcklhY2N1bSgpDQorICogCQlvdXRwdXQgPSBQIFggZXJyICsgSSBYIGlFcnIgKyBEIFggZEVyciArIEYgWCB0YXJnZXQNCisgKiAJCWRFcnIgPSBlcnIgLSBsYXN0RXJyDQorICoJUCwgSSxhbmQgRCBnYWlucyBhcmUgYWx3YXlzIHBvc2l0aXZlLiBGIGNhbiBiZSBuZWdhdGl2ZS4NCisgKglNb3RvciBkaXJlY3Rpb24gY2FuIGJlIHJldmVyc2VkIHVzaW5nIFNldFJldk1vdER1cmluZ0Nsb3NlTG9vcEVuIGlmIHNlbnNvciBhbmQgbW90b3IgYXJlIG91dCBvZiBwaGFzZS4NCisgKglTaW1pbGFybHkgZmVlZGJhY2sgc2Vuc29yIGNhbiBhbHNvIGJlIHJldmVyc2VkIChtdWx0aXBsaWVkIGJ5IC0xKSBpZiB5b3UgcHJlZmVyIHRoZSBzZW5zb3IgdG8gYmUgaW52ZXJ0ZWQuDQorICoNCisgKiBQIGdhaW4gaXMgc3BlY2lmaWVkIGluIHRocm90dGxlIHBlciBlcnJvciB0aWNrLiAgRm9yIGV4YW1wbGUsIGEgdmFsdWUgb2YgMTAyIGlzIH45LjklICh3aGljaCBpcyAxMDIvMTAyMykgdGhyb3R0bGUgcGVyIDENCisgKiAJCUFEQyB1bml0KDEwYml0KSBvciAxIHF1YWRyYXR1cmUgZW5jb2RlciBlZGdlIGRlcGVuZGluZyBvbiBzZWxlY3RlZCBzZW5zb3IuDQorICoNCisgKiBJIGdhaW4gaXMgc3BlY2lmaWVkIGluIHRocm90dGxlIHBlciBpbnRlZ3JhdGVkIGVycm9yLiBGb3IgZXhhbXBsZSwgYSB2YWx1ZSBvZiAxMCBlcXVhdGVzIHRvIH4wLjk5JSAod2hpY2ggaXMgMTAvMTAyMykNCisgKiAgCWZvciBlYWNoIGFjY3VtdWxhdGVkIEFEQyB1bml0KDEwYml0KSBvciAxIHF1YWRyYXR1cmUgZW5jb2RlciBlZGdlIGRlcGVuZGluZyBvbiBzZWxlY3RlZCBzZW5zb3IuDQorICogIAlDbG9zZSBsb29wIGFuZCBpbnRlZ3JhbCBhY2N1bXVsYXRvciBydW5zIGV2ZXJ5IDFtcy4NCisgKg0KKyAqIEQgZ2FpbiBpcyBzcGVjaWZpZWQgaW4gdGhyb3R0bGUgcGVyIGRlcml2YXRpdmUgZXJyb3IuIEZvciBleGFtcGxlIGEgdmFsdWUgb2YgMTAyIGVxdWF0ZXMgdG8gfjkuOSUgKHdoaWNoIGlzIDEwMi8xMDIzKQ0KKyAqIAlwZXIgY2hhbmdlIG9mIDEgdW5pdCAoQURDIG9yIGVuY29kZXIpIHBlciBtcy4NCisgKg0KKyAqIEkgWm9uZSBpcyBzcGVjaWZpZWQgaW4gdGhlIHNhbWUgdW5pdHMgYXMgc2Vuc29yIHBvc2l0aW9uIChBREMgdW5pdHMgb3IgcXVhZHJhdHVyZSBlZGdlcykuICBJZiBwb3MvdmVsIGVycm9yIGlzIG91dHNpZGUgb2YNCisgKiAJCXRoaXMgdmFsdWUsIHRoZSBpbnRlZ3JhdGVkIGVycm9yIHdpbGwgYXV0by1jbGVhci4uLg0KKyAqIAkJaWYoICAgKElab25lIT0wKSAgYW5kICBhYnMoZXJyKSA+IElab25lKQ0KKyAqIAkJCUNsZWFySWFjY3VtKCkNCisgKiAJCS4uLnRoaXMgaXMgdmVyeSB1c2VmdWwgaW4gcHJldmVudGluZyBpbnRlZ3JhbCB3aW5kdXAgYW5kIGlzIGhpZ2hseSByZWNvbW1lbmRlZCBpZiB1c2luZyBmdWxsIFBJRCB0byBrZWVwIHN0YWJpbGl0eSBsb3cuDQorICoNCisgKiBDbG9zZUxvb3BSYW1wUmF0ZSBpcyBpbiB0aHJvdHRsZSB1bml0cyBwZXIgMW1zLiAgU2V0IHRvIHplcm8gdG8gZGlzYWJsZSByYW1waW5nLg0KKyAqIAkJV29ya3MgdGhlIHNhbWUgYXMgUmFtcFRocm90dGxlIGJ1dCBvbmx5IGlzIGluIGVmZmVjdCB3aGVuIGEgY2xvc2UgbG9vcCBtb2RlIGFuZCBwcm9maWxlIHNsb3QgaXMgc2VsZWN0ZWQuDQorICoNCisgKiBhdXRvIGdlbmVyYXRlZCB1c2luZyBzcHJlYWRzaGVldCBhbmQgV3BpQ2xhc3NHZW4uY3Nwcm9qDQorICogQGxpbmsgaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvMU9VX1pWN2ZaTEdZVVEtVWhjOHNWQW1VbVdUbFQ4WEJGWUs4bGZqZ190YWMvZWRpdCNnaWQ9MTc2NjA0Njk2Nw0KKyAqLw0KKyNpZm5kZWYgQ2FuVGFsb25TUlhfSF8NCisjZGVmaW5lIENhblRhbG9uU1JYX0hfDQorI2luY2x1ZGUgImN0cmUuaCIJCQkJLy9CSVQgRGVmaW5lcyArIFR5cGVkZWZzDQorI2luY2x1ZGUgIkN0cmVDYW5Ob2RlLmgiDQorI2luY2x1ZGUgPE5ldHdvcmtDb21tdW5pY2F0aW9uL0NBTlNlc3Npb25NdXguaD4JLy9DQU4gQ29tbQ0KKyNpbmNsdWRlIDxtYXA+DQorY2xhc3MgQ2FuVGFsb25TUlggOiBwdWJsaWMgQ3RyZUNhbk5vZGUNCit7DQorcHJpdmF0ZToNCisNCisJLyoqIGp1c3QgaW4gY2FzZSB1c2VyIHdhbnRzIHRvIG1vZGlmeSBwZXJpb2RzIG9mIGNlcnRhaW4gc3RhdHVzIGZyYW1lcy4NCisJICogCURlZmF1bHQgdGhlIHZhcnMgdG8gbWF0Y2ggdGhlIGZpcm13YXJlIGRlZmF1bHQuICovDQorCXVpbnQzMl90IF9zdGF0dXNSYXRlTXNbNF07DQorCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBWYXJzIGZvciBvcGVuaW5nIGEgQ0FOIHN0cmVhbSBpZiBjYWxsZXIgbmVlZHMgc2lnbmFscyB0aGF0IHJlcXVpcmUgc29saWNpdGluZyAqLw0KKwl1aW50MzJfdCBfY2FuX2g7IAkvLyE8IFNlc3Npb24gaGFuZGxlIGZvciBjYXRjaGluZyByZXNwb25zZSBwYXJhbXMuDQorCWludDMyX3QgX2Nhbl9zdGF0OyAvLyE8IFNlc3Npb24gaGFuZGxlIHN0YXR1cy4NCisJc3RydWN0IHRDQU5TdHJlYW1NZXNzYWdlIF9tc2dCdWZmWzIwXTsNCisJc3RhdGljIGludCBjb25zdCBrTXNnQ2FwYWNpdHkJPSAyMDsNCisJdHlwZWRlZiBzdGQ6Om1hcDx1aW50MzJfdCwgdWludDMyX3Q+IHNpZ3NfdDsNCisJc2lnc190IF9zaWdzOyAvLyE8IENhdGNoZXMgc2lnbmFsIHVwZGF0ZXMgdGhhdCBhcmUgc29saWNpdGVkLiAgRXhwZWN0IHRoaXMgdG8gYmUgdmVyeSBmZXcuDQorCXZvaWQgT3BlblNlc3Npb25JZk5lZWRCZSgpOw0KKwl2b2lkIFByb2Nlc3NTdHJlYW1NZXNzYWdlcygpOw0KKwkvKioNCisJICogU2VuZCBhIG9uZSBzaG90IGZyYW1lIHRvIHNldCBhbiBhcmJpdHJhcnkgc2lnbmFsLg0KKwkgKiBNb3N0IHNpZ25hbHMgYXJlIGluIHRoZSBjb250cm9sIGZyYW1lIHNvIGF2b2lkIHVzaW5nIHRoaXMgQVBJIHVubGVzcyB5b3UgaGF2ZSB0by4NCisJICogVXNlIHRoaXMgYXBpIGZvci4uLg0KKwkgKiAtQSBtb3RvciBjb250cm9sbGVyIHByb2ZpbGUgc2lnbmFsIGVQcm9maWxlUGFyYW1fWFhYcy4gIFRoZXNlIGFyZSBiYWNrZWQgdXAgaW4gZmxhc2guICBJZiB5b3UgYXJlIGdhaW4tc2NoZWR1bGluZyB0aGVuIGNhbGwgdGhpcyBwZXJpb2RpY2FsbHkuDQorCSAqIC1EZWZhdWx0IGJyYWtlIGFuZCBsaW1pdCBzd2l0Y2ggc2lnbmFscy4uLiBlT25Cb290X1hYWHMuICBBdm9pZCBkb2luZyB0aGlzLCB1c2UgdGhlIG92ZXJyaWRlIHNpZ25hbHMgaW4gdGhlIGNvbnRyb2wgZnJhbWUuDQorCSAqIFRhbG9uIHdpbGwgYXV0b21hdGljYWxseSBzZW5kIGEgUEFSQU1fUkVTUE9OU0UgYWZ0ZXIgdGhlIHNldCwgc28gR2V0UGFyYW1SZXNwb25zZSB3aWxsIGNhdGNoIHRoZSBsYXRlc3QgdmFsdWUgYWZ0ZXIgYSBjb3VwbGUgbXMuDQorCSAqLw0KKwlDVFJfQ29kZSBTZXRQYXJhbVJhdyh1aW50MzJfdCBwYXJhbUVudW0sIGludDMyX3QgcmF3Qml0cyk7DQorCS8qKg0KKwkgKiBDaGVja3MgY2FjaGVkIENBTiBmcmFtZXMgYW5kIHVwZGF0aW5nIHNvbGljaXRlZCBzaWduYWxzLg0KKwkgKi8NCisJQ1RSX0NvZGUgR2V0UGFyYW1SZXNwb25zZVJhdyh1aW50MzJfdCBwYXJhbUVudW0sIGludDMyX3QgJiByYXdCaXRzKTsNCitwdWJsaWM6DQorCXN0YXRpYyBjb25zdCBpbnQga0RlZmF1bHRDb250cm9sUGVyaW9kTXMgPSAxMDsgLy8hPCBkZWZhdWx0IGNvbnRyb2wgdXBkYXRlIHJhdGUgaXMgMTBtcy4NCisJQ2FuVGFsb25TUlgoaW50IGRldmljZU51bWJlciA9IDAsaW50IGNvbnRyb2xQZXJpb2RNcyA9IGtEZWZhdWx0Q29udHJvbFBlcmlvZE1zKTsNCisJfkNhblRhbG9uU1JYKCk7DQorCXZvaWQgU2V0KGRvdWJsZSB2YWx1ZSk7DQorCS8qIG1vZGUgc2VsZWN0IGVudW1lcmF0aW9ucyAqLw0KKwlzdGF0aWMgY29uc3QgaW50IGtNb2RlX0R1dHlDeWNsZSA9IDA7IC8vITwgRGVtYW5kIGlzIDExYml0IHNpZ25lZCBkdXR5IGN5Y2xlIFstMTAyMywxMDIzXS4NCisJc3RhdGljIGNvbnN0IGludCBrTW9kZV9Qb3NpdGlvbkNsb3NlTG9vcCA9IDE7IC8vITwgUG9zaXRpb24gUElERi4NCisJc3RhdGljIGNvbnN0IGludCBrTW9kZV9WZWxvY2l0eUNsb3NlTG9vcCA9IDI7IC8vITwgVmVsb2NpdHkgUElERi4NCisJc3RhdGljIGNvbnN0IGludCBrTW9kZV9DdXJyZW50Q2xvc2VMb29wID0gMzsgLy8hPCBDdXJyZW50IGNsb3NlIGxvb3AgLSBub3QgZG9uZS4NCisJc3RhdGljIGNvbnN0IGludCBrTW9kZV9Wb2x0Q29tcGVuID0gNDsgLy8hPCBWb2x0YWdlIENvbXBlbnNhdGlvbiBNb2RlIC0gbm90IGRvbmUuICBEZW1hbmQgaXMgZml4ZWQgcHQgdGFyZ2V0IDguOCB2b2x0cy4NCisJc3RhdGljIGNvbnN0IGludCBrTW9kZV9TbGF2ZUZvbGxvd2VyID0gNTsgLy8hPCBEZW1hbmQgaXMgdGhlIDYgYml0IERldmljZSBJRCBvZiB0aGUgJ21hc3RlcicgVEFMT04gU1JYLg0KKwlzdGF0aWMgY29uc3QgaW50IGtNb2RlX05vRHJpdmUgPSAxNTsgLy8hPCBaZXJvIHRoZSBvdXRwdXQgKGhvbm9ycyBicmFrZS9jb2FzdCkgcmVnYXJkbGVzcyBvZiBkZW1hbmQuICBNaWdodCBiZSB1c2VmdWwgaWYgd2UgbmVlZCB0byBjaGFuZ2UgbW9kZXMgYnV0IGNhbid0IGF0b21pY2FsbHkgY2hhbmdlIGFsbCB0aGUgc2lnbmFscyB3ZSB3YW50IGluIGJldHdlZW4uDQorCS8qIGxpbWl0IHN3aXRjaCBlbnVtZXJhdGlvbnMgKi8NCisJc3RhdGljIGNvbnN0IGludCBrTGltaXRTd2l0Y2hPdmVycmlkZV9Vc2VEZWZhdWx0c0Zyb21GbGFzaCA9IDE7DQorCXN0YXRpYyBjb25zdCBpbnQga0xpbWl0U3dpdGNoT3ZlcnJpZGVfRGlzYWJsZUZ3ZF9EaXNhYmxlUmV2ID0gNDsNCisJc3RhdGljIGNvbnN0IGludCBrTGltaXRTd2l0Y2hPdmVycmlkZV9EaXNhYmxlRndkX0VuYWJsZVJldiA9IDU7DQorCXN0YXRpYyBjb25zdCBpbnQga0xpbWl0U3dpdGNoT3ZlcnJpZGVfRW5hYmxlRndkX0Rpc2FibGVSZXYgPSA2Ow0KKwlzdGF0aWMgY29uc3QgaW50IGtMaW1pdFN3aXRjaE92ZXJyaWRlX0VuYWJsZUZ3ZF9FbmFibGVSZXYgPSA3Ow0KKwkvKiBicmFrZSBvdmVycmlkZSBlbnVtZXJhdGlvbnMgKi8NCisJc3RhdGljIGNvbnN0IGludCBrQnJha2VPdmVycmlkZV9Vc2VEZWZhdWx0c0Zyb21GbGFzaCA9IDA7DQorCXN0YXRpYyBjb25zdCBpbnQga0JyYWtlT3ZlcnJpZGVfT3ZlcnJpZGVDb2FzdCA9IDE7DQorCXN0YXRpYyBjb25zdCBpbnQga0JyYWtlT3ZlcnJpZGVfT3ZlcnJpZGVCcmFrZSA9IDI7DQorCS8qIGZlZWRiYWNrIGRldmljZSBlbnVtZXJhdGlvbnMgKi8NCisJc3RhdGljIGNvbnN0IGludCBrRmVlZGJhY2tEZXZfRGlnaXRhbFF1YWRFbmM9MDsNCisJc3RhdGljIGNvbnN0IGludCBrRmVlZGJhY2tEZXZfQW5hbG9nUG90PTI7DQorCXN0YXRpYyBjb25zdCBpbnQga0ZlZWRiYWNrRGV2X0FuYWxvZ0VuY29kZXI9MzsNCisJc3RhdGljIGNvbnN0IGludCBrRmVlZGJhY2tEZXZfQ291bnRFdmVyeVJpc2luZ0VkZ2U9NDsNCisJc3RhdGljIGNvbnN0IGludCBrRmVlZGJhY2tEZXZfQ291bnRFdmVyeUZhbGxpbmdFZGdlPTU7DQorCXN0YXRpYyBjb25zdCBpbnQga0ZlZWRiYWNrRGV2X1Bvc0lzUHVsc2VXaWR0aD04Ow0KKwkvKiBQcm9maWxlU2xvdFNlbGVjdCBlbnVtZXJhdGlvbnMqLw0KKwlzdGF0aWMgY29uc3QgaW50IGtQcm9maWxlU2xvdFNlbGVjdF9TbG90MCA9IDA7DQorCXN0YXRpYyBjb25zdCBpbnQga1Byb2ZpbGVTbG90U2VsZWN0X1Nsb3QxID0gMTsNCisgICAgLyogc3RhdHVzIGZyYW1lIHJhdGUgdHlwZXMgKi8NCisgICAgc3RhdGljIGNvbnN0IGludCBrU3RhdHVzRnJhbWVfR2VuZXJhbCA9IDA7DQorICAgIHN0YXRpYyBjb25zdCBpbnQga1N0YXR1c0ZyYW1lX0ZlZWRiYWNrID0gMTsNCisgICAgc3RhdGljIGNvbnN0IGludCBrU3RhdHVzRnJhbWVfRW5jb2RlciA9IDI7DQorICAgIHN0YXRpYyBjb25zdCBpbnQga1N0YXR1c0ZyYW1lX0FuYWxvZ1RlbXBWYmF0ID0gMzsNCisJLyoqDQorCSAqIFNpZ25hbCBlbnVtZXJhdGlvbiBmb3IgZ2VuZXJpYyBzaWduYWwgYWNjZXNzLg0KKwkgKiBBbHRob3VnaCBldmVyeSBzaWduYWwgaXMgZW51bWVyYXRlZCwgb25seSB1c2UgdGhpcyBmb3IgdHJhZmZpYyB0aGF0IG11c3QgYmUgc29saWNpdGVkLg0KKwkgKiBVc2UgdGhlIGF1dG8gZ2VuZXJhdGVkIGdldHRlcnMvc2V0dGVycyBhdCBib3R0b20gb2YgdGhpcyBoZWFkZXIgYXMgbXVjaCBhcyBwb3NzaWJsZS4NCisJICovDQorCXR5cGVkZWYgZW51bSBfcGFyYW1fdHsNCisJCWVQcm9maWxlUGFyYW1TbG90MF9QPTEsDQorCQllUHJvZmlsZVBhcmFtU2xvdDBfST0yLA0KKwkJZVByb2ZpbGVQYXJhbVNsb3QwX0Q9MywNCisJCWVQcm9maWxlUGFyYW1TbG90MF9GPTQsDQorCQllUHJvZmlsZVBhcmFtU2xvdDBfSVpvbmU9NSwNCisJCWVQcm9maWxlUGFyYW1TbG90MF9DbG9zZUxvb3BSYW1wUmF0ZT02LA0KKwkJZVByb2ZpbGVQYXJhbVNsb3QxX1A9MTEsDQorCQllUHJvZmlsZVBhcmFtU2xvdDFfST0xMiwNCisJCWVQcm9maWxlUGFyYW1TbG90MV9EPTEzLA0KKwkJZVByb2ZpbGVQYXJhbVNsb3QxX0Y9MTQsDQorCQllUHJvZmlsZVBhcmFtU2xvdDFfSVpvbmU9MTUsDQorCQllUHJvZmlsZVBhcmFtU2xvdDFfQ2xvc2VMb29wUmFtcFJhdGU9MTYsDQorCQllUHJvZmlsZVBhcmFtU29mdExpbWl0Rm9yVGhyZXNob2xkPTIxLA0KKwkJZVByb2ZpbGVQYXJhbVNvZnRMaW1pdFJldlRocmVzaG9sZD0yMiwNCisJCWVQcm9maWxlUGFyYW1Tb2Z0TGltaXRGb3JFbmFibGU9MjMsDQorCQllUHJvZmlsZVBhcmFtU29mdExpbWl0UmV2RW5hYmxlPTI0LA0KKwkJZU9uQm9vdF9CcmFrZU1vZGU9MzEsDQorCQllT25Cb290X0xpbWl0U3dpdGNoX0ZvcndhcmRfTm9ybWFsbHlDbG9zZWQ9MzIsDQorCQllT25Cb290X0xpbWl0U3dpdGNoX1JldmVyc2VfTm9ybWFsbHlDbG9zZWQ9MzMsDQorCQllT25Cb290X0xpbWl0U3dpdGNoX0ZvcndhcmRfRGlzYWJsZT0zNCwNCisJCWVPbkJvb3RfTGltaXRTd2l0Y2hfUmV2ZXJzZV9EaXNhYmxlPTM1LA0KKwkJZUZhdWx0X092ZXJUZW1wPTQxLA0KKwkJZUZhdWx0X1VuZGVyVm9sdGFnZT00MiwNCisJCWVGYXVsdF9Gb3JMaW09NDMsDQorCQllRmF1bHRfUmV2TGltPTQ0LA0KKwkJZUZhdWx0X0hhcmR3YXJlRmFpbHVyZT00NSwNCisJCWVGYXVsdF9Gb3JTb2Z0TGltPTQ2LA0KKwkJZUZhdWx0X1JldlNvZnRMaW09NDcsDQorCQllU3Rja3lGYXVsdF9PdmVyVGVtcD00OCwNCisJCWVTdGNreUZhdWx0X1VuZGVyVm9sdGFnZT00OSwNCisJCWVTdGNreUZhdWx0X0ZvckxpbT01MCwNCisJCWVTdGNreUZhdWx0X1JldkxpbT01MSwNCisJCWVTdGNreUZhdWx0X0ZvclNvZnRMaW09NTIsDQorCQllU3Rja3lGYXVsdF9SZXZTb2Z0TGltPTUzLA0KKwkJZUFwcGxpZWRUaHJvdHRsZT02MSwNCisJCWVDbG9zZUxvb3BFcnI9NjIsDQorCQllRmVlZGJhY2tEZXZpY2VTZWxlY3Q9NjMsDQorCQllUmV2TW90RHVyaW5nQ2xvc2VMb29wRW49NjQsDQorCQllTW9kZVNlbGVjdD02NSwNCisJCWVQcm9maWxlU2xvdFNlbGVjdD02NiwNCisJCWVSYW1wVGhyb3R0bGU9NjcsDQorCQllUmV2RmVlZGJhY2tTZW5zb3I9NjgsDQorCQllTGltaXRTd2l0Y2hFbj02OSwNCisJCWVMaW1pdFN3aXRjaENsb3NlZEZvcj03MCwNCisJCWVMaW1pdFN3aXRjaENsb3NlZFJldj03MSwNCisJCWVTZW5zb3JQb3NpdGlvbj03MywNCisJCWVTZW5zb3JWZWxvY2l0eT03NCwNCisJCWVDdXJyZW50PTc1LA0KKwkJZUJyYWtlSXNFbmFibGVkPTc2LA0KKwkJZUVuY1Bvc2l0aW9uPTc3LA0KKwkJZUVuY1ZlbD03OCwNCisJCWVFbmNJbmRleFJpc2VFdmVudHM9NzksDQorCQllUXVhZEFwaW49ODAsDQorCQllUXVhZEJwaW49ODEsDQorCQllUXVhZElkeHBpbj04MiwNCisJCWVBbmFsb2dJbldpdGhPdj04MywNCisJCWVBbmFsb2dJblZlbD04NCwNCisJCWVUZW1wPTg1LA0KKwkJZUJhdHRlcnlWPTg2LA0KKwkJZVJlc2V0Q291bnQ9ODcsDQorCQllUmVzZXRGbGFncz04OCwNCisJCWVGaXJtVmVycz04OSwNCisJCWVTZXR0aW5nc0NoYW5nZWQ9OTAsDQorCQllUXVhZEZpbHRlckVuPTkxLAkNCisJCWVQaWRJYWNjdW09OTMsDQorCX1wYXJhbV90Ow0KKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLXNldHRlcnMgYW5kIGdldHRlcnMgdGhhdCB1c2UgdGhlIHNvbGljYXRlZCBwYXJhbSByZXF1ZXN0L3Jlc3BvbnNlLS0tLS0tLS0tLS0tLSovLyoqDQorICAgICAqIFNlbmQgYSBvbmUgc2hvdCBmcmFtZSB0byBzZXQgYW4gYXJiaXRyYXJ5IHNpZ25hbC4NCisgICAgICogTW9zdCBzaWduYWxzIGFyZSBpbiB0aGUgY29udHJvbCBmcmFtZSBzbyBhdm9pZCB1c2luZyB0aGlzIEFQSSB1bmxlc3MgeW91IGhhdmUgdG8uDQorICAgICAqIFVzZSB0aGlzIGFwaSBmb3IuLi4NCisgICAgICogLUEgbW90b3IgY29udHJvbGxlciBwcm9maWxlIHNpZ25hbCBlUHJvZmlsZVBhcmFtX1hYWHMuICBUaGVzZSBhcmUgYmFja2VkIHVwIGluIGZsYXNoLiAgSWYgeW91IGFyZSBnYWluLXNjaGVkdWxpbmcgdGhlbiBjYWxsIHRoaXMgcGVyaW9kaWNhbGx5Lg0KKyAgICAgKiAtRGVmYXVsdCBicmFrZSBhbmQgbGltaXQgc3dpdGNoIHNpZ25hbHMuLi4gZU9uQm9vdF9YWFhzLiAgQXZvaWQgZG9pbmcgdGhpcywgdXNlIHRoZSBvdmVycmlkZSBzaWduYWxzIGluIHRoZSBjb250cm9sIGZyYW1lLg0KKyAgICAgKiBUYWxvbiB3aWxsIGF1dG9tYXRpY2FsbHkgc2VuZCBhIFBBUkFNX1JFU1BPTlNFIGFmdGVyIHRoZSBzZXQsIHNvIEdldFBhcmFtUmVzcG9uc2Ugd2lsbCBjYXRjaCB0aGUgbGF0ZXN0IHZhbHVlIGFmdGVyIGEgY291cGxlIG1zLg0KKyAgICAgKi8NCisJQ1RSX0NvZGUgU2V0UGFyYW0ocGFyYW1fdCBwYXJhbUVudW0sIGRvdWJsZSB2YWx1ZSk7DQorCS8qKg0KKwkgKiBBc2tzIFRBTE9OIHRvIGltbWVkaWV0ZWx5IHJlc3BvbmQgd2l0aCBzaWduYWwgdmFsdWUuICBUaGlzIEFQSSBpcyBvbmx5IHVzZWQgZm9yIHNpZ25hbHMgdGhhdCBhcmUgbm90IHNlbnQgcGVyaW9kaWNhbGx5Lg0KKwkgKiBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIHJlYWRpbmcgcGFyYW1zIHRoYXQgcmFyZWx5IGNoYW5nZSBsaWtlIExpbWl0IFN3aXRjaCBzZXR0aW5ncyBhbmQgUElERiB2YWx1ZXMuDQorCSAgKiBAcGFyYW0gcGFyYW0gdG8gcmVxdWVzdC4NCisJICovDQorCUNUUl9Db2RlIFJlcXVlc3RQYXJhbShwYXJhbV90IHBhcmFtRW51bSk7DQorCUNUUl9Db2RlIEdldFBhcmFtUmVzcG9uc2UocGFyYW1fdCBwYXJhbUVudW0sIGRvdWJsZSAmIHZhbHVlKTsNCisJQ1RSX0NvZGUgR2V0UGFyYW1SZXNwb25zZUludDMyKHBhcmFtX3QgcGFyYW1FbnVtLCBpbnQgJiB2YWx1ZSk7DQorICAgIC8qLS0tLS0gZ2V0dGVycyBhbmQgc2V0dGVycyB0aGF0IHVzZSBwYXJhbSByZXF1ZXN0L3Jlc3BvbnNlLiBUaGVzZSBzaWduYWxzIGFyZSBiYWNrZWQgdXAgaW4gZmxhc2ggYW5kIHdpbGwgc3Vydml2ZSBhIHBvd2VyIGN5Y2xlLiAtLS0tLS0tLS0qLw0KKwkvKi0tLS0tIElmIHlvdXIgYXBwbGljYXRpb24gcmVxdWlyZXMgY2hhbmdpbmcgdGhlc2UgdmFsdWVzIGNvbnNpZGVyIHVzaW5nIGJvdGggc2xvdHMgYW5kIHN3aXRjaCBiZXR3ZWVuIHNsb3QwIDw9PiBzbG90MS4gLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisJLyotLS0tLSBJZiB5b3VyIGFwcGxpY2F0aW9uIHJlcXVpcmVzIGNoYW5naW5nIHRoZXNlIHNpZ25hbHMgZnJlcXVlbnRseSB0aGVuIGl0IG1ha2VzIHNlbnNlIHRvIGxldmVyYWdlIHRoaXMgQVBJLiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorCS8qLS0tLS0gR2V0dGVycyBkb24ndCBibG9jaywgc28gaXQgbWF5IHJlcXVpcmUgc2V2ZXJhbCBjYWxscyB0byBnZXQgdGhlIGxhdGVzdCB2YWx1ZS4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKwlDVFJfQ29kZSBTZXRQZ2Fpbih1bnNpZ25lZCBzbG90SWR4LGRvdWJsZSBnYWluKTsNCisJQ1RSX0NvZGUgU2V0SWdhaW4odW5zaWduZWQgc2xvdElkeCxkb3VibGUgZ2Fpbik7DQorCUNUUl9Db2RlIFNldERnYWluKHVuc2lnbmVkIHNsb3RJZHgsZG91YmxlIGdhaW4pOw0KKwlDVFJfQ29kZSBTZXRGZ2Fpbih1bnNpZ25lZCBzbG90SWR4LGRvdWJsZSBnYWluKTsNCisJQ1RSX0NvZGUgU2V0SXpvbmUodW5zaWduZWQgc2xvdElkeCxpbnQgem9uZSk7DQorCUNUUl9Db2RlIFNldENsb3NlTG9vcFJhbXBSYXRlKHVuc2lnbmVkIHNsb3RJZHgsaW50IGNsb3NlTG9vcFJhbXBSYXRlKTsNCisJQ1RSX0NvZGUgU2V0U2Vuc29yUG9zaXRpb24oaW50IHBvcyk7DQorCUNUUl9Db2RlIFNldEZvcndhcmRTb2Z0TGltaXQoaW50IGZvcndhcmRMaW1pdCk7DQorCUNUUl9Db2RlIFNldFJldmVyc2VTb2Z0TGltaXQoaW50IHJldmVyc2VMaW1pdCk7DQorCUNUUl9Db2RlIFNldEZvcndhcmRTb2Z0RW5hYmxlKGludCBlbmFibGUpOw0KKwlDVFJfQ29kZSBTZXRSZXZlcnNlU29mdEVuYWJsZShpbnQgZW5hYmxlKTsNCisJQ1RSX0NvZGUgR2V0UGdhaW4odW5zaWduZWQgc2xvdElkeCxkb3VibGUgJiBnYWluKTsNCisJQ1RSX0NvZGUgR2V0SWdhaW4odW5zaWduZWQgc2xvdElkeCxkb3VibGUgJiBnYWluKTsNCisJQ1RSX0NvZGUgR2V0RGdhaW4odW5zaWduZWQgc2xvdElkeCxkb3VibGUgJiBnYWluKTsNCisJQ1RSX0NvZGUgR2V0RmdhaW4odW5zaWduZWQgc2xvdElkeCxkb3VibGUgJiBnYWluKTsNCisJQ1RSX0NvZGUgR2V0SXpvbmUodW5zaWduZWQgc2xvdElkeCxpbnQgJiB6b25lKTsNCisJQ1RSX0NvZGUgR2V0Q2xvc2VMb29wUmFtcFJhdGUodW5zaWduZWQgc2xvdElkeCxpbnQgJiBjbG9zZUxvb3BSYW1wUmF0ZSk7DQorCUNUUl9Db2RlIEdldEZvcndhcmRTb2Z0TGltaXQoaW50ICYgZm9yd2FyZExpbWl0KTsNCisJQ1RSX0NvZGUgR2V0UmV2ZXJzZVNvZnRMaW1pdChpbnQgJiByZXZlcnNlTGltaXQpOw0KKwlDVFJfQ29kZSBHZXRGb3J3YXJkU29mdEVuYWJsZShpbnQgJiBlbmFibGUpOw0KKwlDVFJfQ29kZSBHZXRSZXZlcnNlU29mdEVuYWJsZShpbnQgJiBlbmFibGUpOw0KKwkvKioNCisJICogQ2hhbmdlIHRoZSBwZXJpb2RNcyBvZiBhIFRBTE9OJ3Mgc3RhdHVzIGZyYW1lLiAgU2VlIGtTdGF0dXNGcmFtZV8qIGVudW1zIGZvciB3aGF0J3MgYXZhaWxhYmxlLg0KKwkgKi8NCisJQ1RSX0NvZGUgU2V0U3RhdHVzRnJhbWVSYXRlKHVuc2lnbmVkIGZyYW1lRW51bSwgdW5zaWduZWQgcGVyaW9kTXMpOw0KKwkvKioNCisJICogQ2xlYXIgYWxsIHN0aWNreSBmYXVsdHMgaW4gVEFMT04uDQorCSAqLw0KKwlDVFJfQ29kZSBDbGVhclN0aWNreUZhdWx0cygpOw0KKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBhdXRvIGdlbmVyYXRlZC4gIFRoaXMgQVBJIGlzIG9wdGltYWwgc2luY2UgaXQgdXNlcyB0aGUgZmlyZS1hbmQtZm9yZ2V0IENBTiBpbnRlcmZhY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRoZXNlIHNpZ25hbHMgc2hvdWxkIGNvdmVyIHRoZSBtYWpvcml0eSBvZiBhbGwgdXNlIGNhc2VzLiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisJQ1RSX0NvZGUgR2V0RmF1bHRfT3ZlclRlbXAoaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldEZhdWx0X1VuZGVyVm9sdGFnZShpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0RmF1bHRfRm9yTGltKGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRGYXVsdF9SZXZMaW0oaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldEZhdWx0X0hhcmR3YXJlRmFpbHVyZShpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0RmF1bHRfRm9yU29mdExpbShpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0RmF1bHRfUmV2U29mdExpbShpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0U3Rja3lGYXVsdF9PdmVyVGVtcChpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0U3Rja3lGYXVsdF9VbmRlclZvbHRhZ2UoaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldFN0Y2t5RmF1bHRfRm9yTGltKGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRTdGNreUZhdWx0X1JldkxpbShpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0U3Rja3lGYXVsdF9Gb3JTb2Z0TGltKGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRTdGNreUZhdWx0X1JldlNvZnRMaW0oaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldEFwcGxpZWRUaHJvdHRsZShpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0Q2xvc2VMb29wRXJyKGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRGZWVkYmFja0RldmljZVNlbGVjdChpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0TW9kZVNlbGVjdChpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0TGltaXRTd2l0Y2hFbihpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0TGltaXRTd2l0Y2hDbG9zZWRGb3IoaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldExpbWl0U3dpdGNoQ2xvc2VkUmV2KGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRTZW5zb3JQb3NpdGlvbihpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0U2Vuc29yVmVsb2NpdHkoaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldEN1cnJlbnQoZG91YmxlICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldEJyYWtlSXNFbmFibGVkKGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRFbmNQb3NpdGlvbihpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0RW5jVmVsKGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRFbmNJbmRleFJpc2VFdmVudHMoaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldFF1YWRBcGluKGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRRdWFkQnBpbihpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0UXVhZElkeHBpbihpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0QW5hbG9nSW5XaXRoT3YoaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldEFuYWxvZ0luVmVsKGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRUZW1wKGRvdWJsZSAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRCYXR0ZXJ5Vihkb3VibGUgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0UmVzZXRDb3VudChpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0UmVzZXRGbGFncyhpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0RmlybVZlcnMoaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIFNldERlbWFuZChpbnQgcGFyYW0pOw0KKwlDVFJfQ29kZSBTZXRPdmVycmlkZUxpbWl0U3dpdGNoRW4oaW50IHBhcmFtKTsNCisJQ1RSX0NvZGUgU2V0RmVlZGJhY2tEZXZpY2VTZWxlY3QoaW50IHBhcmFtKTsNCisJQ1RSX0NvZGUgU2V0UmV2TW90RHVyaW5nQ2xvc2VMb29wRW4oaW50IHBhcmFtKTsNCisJQ1RSX0NvZGUgU2V0T3ZlcnJpZGVCcmFrZVR5cGUoaW50IHBhcmFtKTsNCisJQ1RSX0NvZGUgU2V0TW9kZVNlbGVjdChpbnQgcGFyYW0pOw0KKwlDVFJfQ29kZSBTZXRNb2RlU2VsZWN0KGludCBtb2RlU2VsZWN0LGludCBkZW1hbmQpOw0KKwlDVFJfQ29kZSBTZXRQcm9maWxlU2xvdFNlbGVjdChpbnQgcGFyYW0pOw0KKwlDVFJfQ29kZSBTZXRSYW1wVGhyb3R0bGUoaW50IHBhcmFtKTsNCisJQ1RSX0NvZGUgU2V0UmV2RmVlZGJhY2tTZW5zb3IoaW50IHBhcmFtKTsNCit9Ow0KK2V4dGVybiAiQyIgew0KKwl2b2lkICpjX1RhbG9uU1JYX0NyZWF0ZShpbnQgZGV2aWNlTnVtYmVyLCBpbnQgY29udHJvbFBlcmlvZE1zKTsNCisJdm9pZCBjX1RhbG9uU1JYX0Rlc3Ryb3kodm9pZCAqaGFuZGxlKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9TZXRQYXJhbSh2b2lkICpoYW5kbGUsIGludCBwYXJhbUVudW0sIGRvdWJsZSB2YWx1ZSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfUmVxdWVzdFBhcmFtKHZvaWQgKmhhbmRsZSwgaW50IHBhcmFtRW51bSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0UGFyYW1SZXNwb25zZSh2b2lkICpoYW5kbGUsIGludCBwYXJhbUVudW0sIGRvdWJsZSAqdmFsdWUpOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldFBhcmFtUmVzcG9uc2VJbnQzMih2b2lkICpoYW5kbGUsIGludCBwYXJhbUVudW0sIGludCAqdmFsdWUpOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX1NldFN0YXR1c0ZyYW1lUmF0ZSh2b2lkICpoYW5kbGUsIHVuc2lnbmVkIGZyYW1lRW51bSwgdW5zaWduZWQgcGVyaW9kTXMpOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0NsZWFyU3RpY2t5RmF1bHRzKHZvaWQgKmhhbmRsZSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0RmF1bHRfT3ZlclRlbXAodm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRGYXVsdF9VbmRlclZvbHRhZ2Uodm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRGYXVsdF9Gb3JMaW0odm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRGYXVsdF9SZXZMaW0odm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRGYXVsdF9IYXJkd2FyZUZhaWx1cmUodm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRGYXVsdF9Gb3JTb2Z0TGltKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0RmF1bHRfUmV2U29mdExpbSh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldFN0Y2t5RmF1bHRfT3ZlclRlbXAodm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRTdGNreUZhdWx0X1VuZGVyVm9sdGFnZSh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldFN0Y2t5RmF1bHRfRm9yTGltKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0U3Rja3lGYXVsdF9SZXZMaW0odm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRTdGNreUZhdWx0X0ZvclNvZnRMaW0odm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRTdGNreUZhdWx0X1JldlNvZnRMaW0odm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRBcHBsaWVkVGhyb3R0bGUodm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRDbG9zZUxvb3BFcnIodm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRGZWVkYmFja0RldmljZVNlbGVjdCh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldE1vZGVTZWxlY3Qodm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRMaW1pdFN3aXRjaEVuKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0TGltaXRTd2l0Y2hDbG9zZWRGb3Iodm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRMaW1pdFN3aXRjaENsb3NlZFJldih2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldFNlbnNvclBvc2l0aW9uKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0U2Vuc29yVmVsb2NpdHkodm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRDdXJyZW50KHZvaWQgKmhhbmRsZSwgZG91YmxlICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0QnJha2VJc0VuYWJsZWQodm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRFbmNQb3NpdGlvbih2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldEVuY1ZlbCh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldEVuY0luZGV4UmlzZUV2ZW50cyh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldFF1YWRBcGluKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0UXVhZEJwaW4odm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRRdWFkSWR4cGluKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0QW5hbG9nSW5XaXRoT3Yodm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRBbmFsb2dJblZlbCh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldFRlbXAodm9pZCAqaGFuZGxlLCBkb3VibGUgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRCYXR0ZXJ5Vih2b2lkICpoYW5kbGUsIGRvdWJsZSAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldFJlc2V0Q291bnQodm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRSZXNldEZsYWdzKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0RmlybVZlcnModm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9TZXREZW1hbmQodm9pZCAqaGFuZGxlLCBpbnQgcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX1NldE92ZXJyaWRlTGltaXRTd2l0Y2hFbih2b2lkICpoYW5kbGUsIGludCBwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfU2V0RmVlZGJhY2tEZXZpY2VTZWxlY3Qodm9pZCAqaGFuZGxlLCBpbnQgcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX1NldFJldk1vdER1cmluZ0Nsb3NlTG9vcEVuKHZvaWQgKmhhbmRsZSwgaW50IHBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9TZXRPdmVycmlkZUJyYWtlVHlwZSh2b2lkICpoYW5kbGUsIGludCBwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfU2V0TW9kZVNlbGVjdCh2b2lkICpoYW5kbGUsIGludCBwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfU2V0UHJvZmlsZVNsb3RTZWxlY3Qodm9pZCAqaGFuZGxlLCBpbnQgcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX1NldFJhbXBUaHJvdHRsZSh2b2lkICpoYW5kbGUsIGludCBwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfU2V0UmV2RmVlZGJhY2tTZW5zb3Iodm9pZCAqaGFuZGxlLCBpbnQgcGFyYW0pOw0KK30NCisjZW5kaWYNCisNCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9jdHJlL0N0cmVDYW5Ob2RlLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9jdHJlL0N0cmVDYW5Ob2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTllMDkzOQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL2N0cmUvQ3RyZUNhbk5vZGUuaApAQCAtMCwwICsxLDExNiBAQAorI2lmbmRlZiBDdHJlQ2FuTm9kZV9IXw0KKyNkZWZpbmUgQ3RyZUNhbk5vZGVfSF8NCisjaW5jbHVkZSAiY3RyZS5oIgkJCQkvL0JJVCBEZWZpbmVzICsgVHlwZWRlZnMNCisjaW5jbHVkZSA8TmV0d29ya0NvbW11bmljYXRpb24vQ0FOU2Vzc2lvbk11eC5oPgkvL0NBTiBDb21tDQorI2luY2x1ZGUgPHB0aHJlYWQuaD4NCisjaW5jbHVkZSA8bWFwPg0KKyNpbmNsdWRlIDxzdHJpbmcuaD4gLy8gbWVtY3B5DQorI2luY2x1ZGUgPHN5cy90aW1lLmg+DQorY2xhc3MgQ3RyZUNhbk5vZGUNCit7DQorcHVibGljOg0KKwlDdHJlQ2FuTm9kZShVSU5UOCBkZXZpY2VOdW1iZXIpOw0KKyAgICB+Q3RyZUNhbk5vZGUoKTsNCisNCisJVUlOVDggR2V0RGV2aWNlTnVtYmVyKCkNCisJew0KKwkJcmV0dXJuIF9kZXZpY2VOdW1iZXI7DQorCX0NCitwcm90ZWN0ZWQ6DQorDQorDQorCXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyB0eFRhc2t7DQorCQlwdWJsaWM6DQorCQkJdWludDMyX3QgYXJiSWQ7DQorCQkJVCAqIHRvU2VuZDsNCisJCQlUICogb3BlcmF0b3IgLT4gKCkNCisJCQl7DQorCQkJCXJldHVybiB0b1NlbmQ7DQorCQkJfQ0KKwkJCVQgJiBvcGVyYXRvciooKQ0KKwkJCXsNCisJCQkJcmV0dXJuICp0b1NlbmQ7DQorCQkJfQ0KKwkJCWJvb2wgSXNFbXB0eSgpDQorCQkJew0KKwkJCQlpZih0b1NlbmQgPT0gMCkNCisJCQkJCXJldHVybiB0cnVlOw0KKwkJCQlyZXR1cm4gZmFsc2U7DQorCQkJfQ0KKwl9Ow0KKwl0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgcmVjTXNnew0KKwkJcHVibGljOg0KKwkJCXVpbnQzMl90IGFyYklkOw0KKwkJCXVpbnQ4X3QgYnl0ZXNbOF07DQorCQkJQ1RSX0NvZGUgZXJyOw0KKwkJCVQgKiBvcGVyYXRvciAtPiAoKQ0KKwkJCXsNCisJCQkJcmV0dXJuIChUICopYnl0ZXM7DQorCQkJfQ0KKwkJCVQgJiBvcGVyYXRvciooKQ0KKwkJCXsNCisJCQkJcmV0dXJuICooVCAqKWJ5dGVzOw0KKwkJCX0NCisJfTsNCisJVUlOVDggX2RldmljZU51bWJlcjsNCisJdm9pZCBSZWdpc3RlclJ4KHVpbnQzMl90IGFyYklkKTsNCisJdm9pZCBSZWdpc3RlclR4KHVpbnQzMl90IGFyYklkLCB1aW50MzJfdCBwZXJpb2RNcyk7DQorDQorCUNUUl9Db2RlIEdldFJ4KHVpbnQzMl90IGFyYklkLHVpbnQ4X3QgKiBkYXRhQnl0ZXMsdWludDMyX3QgdGltZW91dE1zKTsNCisJdm9pZCBGbHVzaFR4KHVpbnQzMl90IGFyYklkKTsNCisNCisJdGVtcGxhdGU8dHlwZW5hbWUgVD4gdHhUYXNrPFQ+IEdldFR4KHVpbnQzMl90IGFyYklkKQ0KKwl7DQorCQl0eFRhc2s8VD4gcmV0dmFsID0gezB9Ow0KKwkJdHhKb2JzX3Q6Oml0ZXJhdG9yIGkgPSBfdHhKb2JzLmZpbmQoYXJiSWQpOw0KKwkJaWYoaSAhPSBfdHhKb2JzLmVuZCgpKXsNCisJCQlyZXR2YWwuYXJiSWQgPSBpLT5zZWNvbmQuYXJiSWQ7DQorCQkJcmV0dmFsLnRvU2VuZCA9IChUKilpLT5zZWNvbmQudG9TZW5kOw0KKwkJfQ0KKwkJcmV0dXJuIHJldHZhbDsNCisJfQ0KKwl0ZW1wbGF0ZTxjbGFzcyBUPiB2b2lkIEZsdXNoVHgoVCAmIHBhcikNCisJew0KKwkJRmx1c2hUeChwYXIuYXJiSWQpOw0KKwl9DQorDQorCXRlbXBsYXRlPGNsYXNzIFQ+IHJlY01zZzxUPiBHZXRSeCh1aW50MzJfdCBhcmJJZCwgdWludDMyX3QgdGltZW91dE1zKQ0KKwl7DQorCQlyZWNNc2c8VD4gcmV0dmFsOw0KKwkJcmV0dmFsLmVyciA9IEdldFJ4KGFyYklkLHJldHZhbC5ieXRlcywgdGltZW91dE1zKTsNCisJCXJldHVybiByZXR2YWw7DQorCX0NCisNCitwcml2YXRlOg0KKw0KKwljbGFzcyB0eEpvYl90IHsNCisJCXB1YmxpYzoNCisJCQl1aW50MzJfdCBhcmJJZDsNCisJCQl1aW50OF90IHRvU2VuZFs4XTsNCisJCQl1aW50MzJfdCBwZXJpb2RNczsNCisJfTsNCisNCisJY2xhc3MgcnhFdmVudF90ew0KKwkJcHVibGljOg0KKwkJCXVpbnQ4X3QgYnl0ZXNbOF07DQorCQkJc3RydWN0IHRpbWVzcGVjIHRpbWU7DQorCQkJcnhFdmVudF90KCkNCisJCQl7DQorCQkJCWJ5dGVzWzBdID0gMDsNCisJCQkJYnl0ZXNbMV0gPSAwOw0KKwkJCQlieXRlc1syXSA9IDA7DQorCQkJCWJ5dGVzWzNdID0gMDsNCisJCQkJYnl0ZXNbNF0gPSAwOw0KKwkJCQlieXRlc1s1XSA9IDA7DQorCQkJCWJ5dGVzWzZdID0gMDsNCisJCQkJYnl0ZXNbN10gPSAwOw0KKwkJCX0NCisJfTsNCisNCisJdHlwZWRlZiBzdGQ6Om1hcDx1aW50MzJfdCx0eEpvYl90PiB0eEpvYnNfdDsNCisJdHhKb2JzX3QgX3R4Sm9iczsNCisNCisJdHlwZWRlZiBzdGQ6Om1hcDx1aW50MzJfdCxyeEV2ZW50X3Q+IHJ4UnhFdmVudHNfdDsNCisJcnhSeEV2ZW50c190IF9yeFJ4RXZlbnRzOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvY3RyZS9jdHJlLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9jdHJlL2N0cmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmQzZjY5Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvY3RyZS9jdHJlLmgKQEAgLTAsMCArMSw1MCBAQAorI2lmbmRlZiBHTE9CQUxfSA0KKyNkZWZpbmUgR0xPQkFMX0gNCisNCisvL0JpdCBEZWZpbmVzDQorI2RlZmluZSBCSVQwIDB4MDENCisjZGVmaW5lIEJJVDEgMHgwMg0KKyNkZWZpbmUgQklUMiAweDA0DQorI2RlZmluZSBCSVQzIDB4MDgNCisjZGVmaW5lIEJJVDQgMHgxMA0KKyNkZWZpbmUgQklUNSAweDIwDQorI2RlZmluZSBCSVQ2IDB4NDANCisjZGVmaW5lIEJJVDcgMHg4MA0KKyNkZWZpbmUgQklUOCAgMHgwMTAwDQorI2RlZmluZSBCSVQ5ICAweDAyMDANCisjZGVmaW5lIEJJVDEwIDB4MDQwMA0KKyNkZWZpbmUgQklUMTEgMHgwODAwDQorI2RlZmluZSBCSVQxMiAweDEwMDANCisjZGVmaW5lIEJJVDEzIDB4MjAwMA0KKyNkZWZpbmUgQklUMTQgMHg0MDAwDQorI2RlZmluZSBCSVQxNSAweDgwMDANCisNCisvL1NpZ25lZA0KK3R5cGVkZWYJc2lnbmVkIGNoYXIJSU5UODsNCit0eXBlZGVmCXNpZ25lZCBzaG9ydAlJTlQxNjsNCit0eXBlZGVmCXNpZ25lZCBpbnQJSU5UMzI7DQordHlwZWRlZglzaWduZWQgbG9uZyBsb25nIElOVDY0Ow0KKw0KKy8vVW5zaWduZWQNCit0eXBlZGVmCXVuc2lnbmVkIGNoYXIJVUlOVDg7DQordHlwZWRlZgl1bnNpZ25lZCBzaG9ydAlVSU5UMTY7DQordHlwZWRlZgl1bnNpZ25lZCBpbnQJVUlOVDMyOw0KK3R5cGVkZWYJdW5zaWduZWQgbG9uZyBsb25nIFVJTlQ2NDsNCisNCisvL090aGVyDQordHlwZWRlZgl1bnNpZ25lZCBjaGFyCVVDSEFSOw0KK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJVVNIT1JUOw0KK3R5cGVkZWYJdW5zaWduZWQgaW50CVVJTlQ7DQordHlwZWRlZiB1bnNpZ25lZCBsb25nCVVMT05HOw0KKw0KK3R5cGVkZWYgZW51bSB7DQorCQlDVFJfT0tBWSwJCQkJLy8hPCBObyBFcnJvciAtIEZ1bmN0aW9uIGV4ZWN1dGVkIGFzIGV4cGVjdGVkDQorCQlDVFJfUnhUaW1lb3V0LAkJCS8vITwgQ0FOIGZyYW1lIGhhcyBub3QgYmVlbiByZWNlaXZlZCB3aXRoaW4gc3BlY2lmaWVkIHBlcmlvZCBvZiB0aW1lLg0KKwkJQ1RSX1R4VGltZW91dCwJCQkvLyE8IE5vdCB1c2VkLg0KKwkJQ1RSX0ludmFsaWRQYXJhbVZhbHVlLCAJLy8hPCBDYWxsZXIgcGFzc2VkIGFuIGludmFsaWQgcGFyYW0NCisJCUNUUl9VbmV4cGVjdGVkQXJiSWQsCS8vITwgU3BlY2lmaWVkIENBTiBJZCBpcyBpbnZhbGlkLg0KKwkJQ1RSX1R4RmFpbGVkLAkJCS8vITwgQ291bGQgbm90IHRyYW5zbWl0IHRoZSBDQU4gZnJhbWUuDQorCQlDVFJfU2lnTm90VXBkYXRlZCwJCS8vITwgSGF2ZSBub3QgcmVjZWl2ZWQgYW4gdmFsdWUgcmVzcG9uc2UgZm9yIHNpZ25hbC4NCit9Q1RSX0NvZGU7DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvbml2aXNpb24uaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL25pdmlzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDliYjk4NAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL25pdmlzaW9uLmgKQEAgLTAsMCArMSw1MzQ1IEBACisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogICAgICAgICAgICAgICAgICAgICAgICBJTUFRIFZpc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiAgICBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDEuICBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaXRsZTogICAgICAgTklWaXNpb24uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjaWYgIWRlZmluZWQoTmlWaXNpb25faCkKKyNkZWZpbmUgTmlWaXNpb25faAorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBJbmNsdWRlcworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgQ29udHJvbCBEZWZpbmVzCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNpZiAhZGVmaW5lZChJTUFRX0lNUE9SVCkKKwkjaWZuZGVmIF9fR05VQ19fCisJCSNkZWZpbmUgSU1BUV9JTVBPUlQgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisJI2Vsc2UKKwkJI2RlZmluZSBJTUFRX0lNUE9SVAorCSNlbmRpZgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChJTUFRX0ZVTkMpCisgICAgI2lmICFkZWZpbmVkKF9fY3BsdXNwbHVzKQorICAgICAgICAjZGVmaW5lIElNQVFfRlVOQyBJTUFRX0lNUE9SVAorICAgICNlbHNlCisgICAgICAgICNkZWZpbmUgSU1BUV9GVU5DIGV4dGVybiAiQyIgSU1BUV9JTVBPUlQKKyAgICAjZW5kaWYKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoSU1BUV9TVERDQUxMKQorCSNpZm5kZWYgX19HTlVDX18KKwkJI2RlZmluZSBJTUFRX1NURENBTEwgX19zdGRjYWxsCisJI2Vsc2UKKwkJI2RlZmluZSBJTUFRX1NURENBTEwgCisJI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIF9DVklfCisjcHJhZ21hIEVuYWJsZUxpYnJhcnlSdW50aW1lQ2hlY2tpbmcKKyNpbmNsdWRlIDxhbnNpX2MuaD4KKyNlbmRpZgorCisjZGVmaW5lIElNQVFfQ0FMTEJBQ0sgX19jZGVjbAorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBNYW5pZmVzdCBDb25zdGFudHMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2lmbmRlZiBOVUxMCisgICAgI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgICAgICNkZWZpbmUgTlVMTCAgICAwCisgICAgI2Vsc2UKKyAgICAgICAgI2RlZmluZSBOVUxMICAgICgodm9pZCAqKTApCisgICAgI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBGQUxTRQorICAgICNkZWZpbmUgRkFMU0UgICAgICAgICAgICAgICAwCisjZW5kaWYKKworI2lmbmRlZiBUUlVFCisgICAgI2RlZmluZSBUUlVFICAgICAgICAgICAgICAgIDEKKyNlbmRpZgorCisjZGVmaW5lIElNQVFfREVGQVVMVF9TSE9XX0NPT1JESU5BVEVTIFRSVUUKKyNkZWZpbmUgSU1BUV9ERUZBVUxUX01BWF9JQ09OU19QRVJfTElORSA0CisjZGVmaW5lIElNQVFfREVGQVVMVF9MRUFSTklOR19NT0RFIElNQVFfTEVBUk5fU0hJRlRfSU5GT1JNQVRJT04KKyNkZWZpbmUgSU1BUV9ERUZBVUxUX0JNUF9DT01QUkVTUyBGQUxTRQorI2RlZmluZSBJTUFRX0RFRkFVTFRfUE5HX1FVQUxJVFkgNzUwCisjZGVmaW5lIElNQVFfREVGQVVMVF9KUEVHX1FVQUxJVFkgNzUwCisjZGVmaW5lIElNQVFfQUxMX0NPTlRPVVJTIC0xCisjZGVmaW5lIElNQVFfQUxMX1dJTkRPV1MgLTEKKyNkZWZpbmUgSU1BUV9TSElGVCAgICAgIDEKKyNkZWZpbmUgSU1BUV9BTFQgICAgICAgIDIKKyNkZWZpbmUgSU1BUV9DVFJMICAgICAgIDQKKyNkZWZpbmUgSU1BUV9DQVBTX0xPQ0sgIDgKKyNkZWZpbmUgSU1BUV9NT0RBTF9ESUFMT0cgLTEKKyNkZWZpbmUgSU1BUV9JTklUX1JHQl9UUkFOU1BBUkVOVCB7ICAgMCwgICAwLCAgIDAsIDEgfQorI2RlZmluZSBJTUFRX0lOSVRfUkdCX1JFRCAgICAgICAgIHsgICAwLCAgIDAsIDI1NSwgMCB9CisjZGVmaW5lIElNQVFfSU5JVF9SR0JfQkxVRSAgICAgICAgeyAyNTUsICAgMCwgICAwLCAwIH0KKyNkZWZpbmUgSU1BUV9JTklUX1JHQl9HUkVFTiAgICAgICB7ICAgMCwgMjU1LCAgIDAsIDAgfQorI2RlZmluZSBJTUFRX0lOSVRfUkdCX1lFTExPVyAgICAgIHsgICAwLCAyNTUsIDI1NSwgMCB9CisjZGVmaW5lIElNQVFfSU5JVF9SR0JfV0hJVEUgICAgICAgeyAyNTUsIDI1NSwgMjU1LCAwIH0KKyNkZWZpbmUgSU1BUV9JTklUX1JHQl9CTEFDSyAgICAgICB7ICAgMCwgICAwLCAgIDAsIDAgfQorI2RlZmluZSBJTUFRX1VTRV9ERUZBVUxUX1FVQUxJVFkgIC0xCisjZGVmaW5lIElNQVFfQUxMX1NBTVBMRVMgICAgICAgICAgLTEKKyNkZWZpbmUgSU1BUV9BTExfT0JKRUNUUyAgICAgICAgICAtMQorI2RlZmluZSBJTUFRX0FMTF9DSEFSQUNURVJTICAgICAgIC0xCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIFByZWRlZmluZWQgVmFsaWQgQ2hhcmFjdGVycworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIElNQVFfQU5ZX0NIQVJBQ1RFUiAgICAgICAgICAiIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vQW55IENoYXJhY3RlcgorI2RlZmluZSBJTUFRX0FMUEhBQkVUSUMgICAgICAgICAgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiICAgICAgICAgICAgICAvL0FscGhhYmV0aWMKKyNkZWZpbmUgSU1BUV9BTFBIQU5VTUVSSUMgICAgICAgICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSIgICAgLy9BbHBoYW51bWVyaWMKKyNkZWZpbmUgSU1BUV9VUFBFUkNBU0VfTEVUVEVSUyAgICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9VcHBlcmNhc2UgTGV0dGVycworI2RlZmluZSBJTUFRX0xPV0VSQ0FTRV9MRVRURVJTICAgICAgImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0xvd2VyY2FzZSBMZXR0ZXJzCisjZGVmaW5lIElNQVFfREVDSU1BTF9ESUdJVFMgICAgICAgICAiMDEyMzQ1Njc4OSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRGVjaW1hbCBEaWdpdHMKKyNkZWZpbmUgSU1BUV9IRVhBREVDSU1BTF9ESUdJVFMgICAgICIwMTIzNDU2Nzg5QUJDREVGYWJjZGVmIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9IZXhhZGVjaW1hbCBEaWdpdHMKKyNkZWZpbmUgSU1BUV9QQVRURVJOICAgICAgICAgICAgICAgICJceEZGIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9QYXR0ZXJuIChBIHNpbmdsZSBjaGFyYWN0ZXIgc3RyaW5nIHdpdGggdGhlIGNoYXJhY3RlciB2YWx1ZSBzZXQgdG8gMjU1KQorI2RlZmluZSBJTUFRX0ZPUkNFX1NQQUNFICAgICAgICAgICAgIiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0ZvcmNlIFNwYWNlCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIE1hY3JvcworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIElNQVFfTk9fUkVDVCBpbWFxTWFrZVJlY3QoIDAsIDAsIDB4N0ZGRkZGRkYsIDB4N0ZGRkZGRkYpCisjZGVmaW5lIElNQVFfTk9fUk9UQVRFRF9SRUNUIGltYXFNYWtlUm90YXRlZFJlY3QoIDAsIDAsIDB4N0ZGRkZGRkYsIDB4N0ZGRkZGRkYsIDApCisjZGVmaW5lIElNQVFfTk9fUE9JTlQgaW1hcU1ha2VQb2ludCggLTEsIC0xKQorI2RlZmluZSBJTUFRX05PX1BPSU5UX0ZMT0FUIGltYXFNYWtlUG9pbnRGbG9hdCggLTEuMCwgLTEuMCApCisjZGVmaW5lIElNQVFfTk9fT0ZGU0VUIGltYXFNYWtlUG9pbnRGbG9hdCggMC4wLCAwLjAgKQorCisKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgV2hlbiBpbiBCb3JsYW5kLCBzb21lIGZ1bmN0aW9ucyBtdXN0IGJlIG1hcHBlZCB0byBkaWZmZXJlbnQgbmFtZXMuCisvLyAgVGhpcyBhY2NvbXBsaXNoZXMgc2FpZCB0YXNrLgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pIHx8IChkZWZpbmVkKF9DVklfKSAmJiBkZWZpbmVkKF9OSV9CQ18pKQorICAgICNkZWZpbmUgaW1hcU1ha2VQb2ludCBpbWFxTWFrZVBvaW50X0JDCisgICAgI2RlZmluZSBpbWFxTWFrZVBvaW50RmxvYXQgaW1hcU1ha2VQb2ludEZsb2F0X0JDCisjZW5kaWYKKworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBXaGVuIGluIFdhdGNvbSwgc29tZSBmdW5jdGlvbnMgbXVzdCBiZSBtYXBwZWQgdG8gZGlmZmVyZW50IG5hbWVzLgorLy8gIFRoaXMgYWNjb21wbGlzaGVzIHNhaWQgdGFzay4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2lmIGRlZmluZWQoX19XQVRDT01DX18pIHx8IChkZWZpbmVkKF9DVklfKSAmJiBkZWZpbmVkKF9OSV9XQ18pKQorICAgICNkZWZpbmUgaW1hcU1ha2VQb2ludCBpbWFxTWFrZVBvaW50X0JDCisgICAgI2RlZmluZSBpbWFxTWFrZVBvaW50RmxvYXQgaW1hcU1ha2VQb2ludEZsb2F0X0JDCisjZW5kaWYKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgSWYgdXNpbmcgVmlzdWFsIEMrKywgZm9yY2Ugc3RhcnR1cCAmIHNodXRkb3duIGNvZGUgdG8gcnVuLgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgIWRlZmluZWQoX0NWSV8pICYmICFkZWZpbmVkKF9fQk9STEFORENfXykKKyAgICAjcHJhZ21hIGNvbW1lbnQobGlua2VyLCAiL0lOQ0xVREU6X25pdmlzaW9uX3N0YXJ0dXBfc2h1dGRvd24iKQorICAgICNwcmFnbWEgY29tbWVudChsaW5rZXIsICIvREVGQVVMVExJQjpuaXZpc2lvbi5saWIiKQorI2VuZGlmCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIEVycm9yIENvZGVzCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNkZWZpbmUgRVJSX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLy8gTm8gZXJyb3IuCisjZGVmaW5lIEVSUl9TWVNURU1fRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjE2MCAvLyBTeXN0ZW0gZXJyb3IuCisjZGVmaW5lIEVSUl9PVVRfT0ZfTUVNT1JZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjE1OSAvLyBOb3QgZW5vdWdoIG1lbW9yeSBmb3IgcmVxdWVzdGVkIG9wZXJhdGlvbi4KKyNkZWZpbmUgRVJSX01FTU9SWV9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTU4IC8vIE1lbW9yeSBlcnJvci4KKyNkZWZpbmUgRVJSX1VOUkVHSVNURVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTU3IC8vIFVubGljZW5zZWQgY29weSBvZiBOSSBWaXNpb24uCisjZGVmaW5lIEVSUl9ORUVEX0ZVTExfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjE1NiAvLyBUaGUgZnVuY3Rpb24gcmVxdWlyZXMgYW4gTkkgVmlzaW9uIDUuMCBBZHZhbmNlZCBsaWNlbnNlLgorI2RlZmluZSBFUlJfVU5JTklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYxNTUgLy8gTkkgVmlzaW9uIGRpZCBub3QgaW5pdGlhbGl6ZSBwcm9wZXJseS4KKyNkZWZpbmUgRVJSX0lNQUdFX1RPT19TTUFMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTU0IC8vIFRoZSBpbWFnZSBpcyBub3QgbGFyZ2UgZW5vdWdoIGZvciB0aGUgb3BlcmF0aW9uLgorI2RlZmluZSBFUlJfQkFSQ09ERV9DT0RBQkFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYxNTMgLy8gVGhlIGJhcmNvZGUgaXMgbm90IGEgdmFsaWQgQ29kYWJhciBiYXJjb2RlLgorI2RlZmluZSBFUlJfQkFSQ09ERV9DT0RFMzkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYxNTIgLy8gVGhlIGJhcmNvZGUgaXMgbm90IGEgdmFsaWQgQ29kZSAzIG9mIDkgYmFyY29kZS4KKyNkZWZpbmUgRVJSX0JBUkNPREVfQ09ERTkzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTUxIC8vIFRoZSBiYXJjb2RlIGlzIG5vdCBhIHZhbGlkIENvZGU5MyBiYXJjb2RlLgorI2RlZmluZSBFUlJfQkFSQ09ERV9DT0RFMTI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYxNTAgLy8gVGhlIGJhcmNvZGUgaXMgbm90IGEgdmFsaWQgQ29kZTEyOCBiYXJjb2RlLgorI2RlZmluZSBFUlJfQkFSQ09ERV9FQU44ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYxNDkgLy8gVGhlIGJhcmNvZGUgaXMgbm90IGEgdmFsaWQgRUFOOCBiYXJjb2RlLgorI2RlZmluZSBFUlJfQkFSQ09ERV9FQU4xMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYxNDggLy8gVGhlIGJhcmNvZGUgaXMgbm90IGEgdmFsaWQgRUFOMTMgYmFyY29kZS4KKyNkZWZpbmUgRVJSX0JBUkNPREVfSTI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTQ3IC8vIFRoZSBiYXJjb2RlIGlzIG5vdCBhIHZhbGlkIEludGVybGVhdmVkIDIgb2YgNSBiYXJjb2RlLgorI2RlZmluZSBFUlJfQkFSQ09ERV9NU0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYxNDYgLy8gVGhlIGJhcmNvZGUgaXMgbm90IGEgdmFsaWQgTVNJIGJhcmNvZGUuCisjZGVmaW5lIEVSUl9CQVJDT0RFX1VQQ0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjE0NSAvLyBUaGUgYmFyY29kZSBpcyBub3QgYSB2YWxpZCBVUENBIGJhcmNvZGUuCisjZGVmaW5lIEVSUl9CQVJDT0RFX0NPREU5M19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjE0NCAvLyBUaGUgQ29kZTkzIGJhcmNvZGUgY29udGFpbnMgaW52YWxpZCBzaGlmdCBlbmNvZGluZy4KKyNkZWZpbmUgRVJSX0JBUkNPREVfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTQzIC8vIFRoZSBiYXJjb2RlIHR5cGUgaXMgaW52YWxpZC4KKyNkZWZpbmUgRVJSX0JBUkNPREVfSU5WQUxJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTQyIC8vIFRoZSBpbWFnZSBkb2VzIG5vdCByZXByZXNlbnQgYSB2YWxpZCBsaW5lYXIgYmFyY29kZS4KKyNkZWZpbmUgRVJSX0JBUkNPREVfQ09ERTEyOF9GTkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTQxIC8vIFRoZSBGTkMgdmFsdWUgaW4gdGhlIENvZGUxMjggYmFyY29kZSBpcyBub3QgbG9jYXRlZCBiZWZvcmUgdGhlIGZpcnN0IGRhdGEgdmFsdWUuCisjZGVmaW5lIEVSUl9CQVJDT0RFX0NPREUxMjhfU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjE0MCAvLyBUaGUgc3RhcnRpbmcgY29kZSBzZXQgaW4gdGhlIENvZGUxMjggYmFyY29kZSBpcyBub3QgdmFsaWQuCisjZGVmaW5lIEVSUl9ST0xMQkFDS19SRVNPVVJDRV9PVVRfT0ZfTUVNT1JZICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjEzOSAvLyBOb3QgZW5vdWdoIHJlc2VydmVkIG1lbW9yeSBpbiB0aGUgdGltZWQgZW52aXJvbm1lbnQgZm9yIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uLgorI2RlZmluZSBFUlJfUk9MTEJBQ0tfTk9UX1NVUFBPUlRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYxMzggLy8gVGhlIGZ1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgd2hlbiBhIHRpbWUgbGltaXQgaXMgYWN0aXZlLgorI2RlZmluZSBFUlJfRElSRUNUWF9ETExfTk9UX0ZPVU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYxMzcgLy8gUXVhcnR6LmRsbCBub3QgZm91bmQuICBJbnN0YWxsIERpcmVjdFggOC4xIG9yIGxhdGVyLgorI2RlZmluZSBFUlJfRElSRUNUWF9JTlZBTElEX0ZJTFRFUl9RVUFMSVRZICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYxMzYgLy8gVGhlIGZpbHRlciBxdWFsaXR5IHlvdSBwcm92aWRlZCBpcyBpbnZhbGlkLiBWYWxpZCBxdWFsaXR5IHZhbHVlcyByYW5nZSBmcm9tIC0xIHRvIDEwMDAuCisjZGVmaW5lIEVSUl9JTlZBTElEX0JVVFRPTl9MQUJFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjEzNSAvLyBJbnZhbGlkIGJ1dHRvbiBsYWJlbC4KKyNkZWZpbmUgRVJSX1RIUkVBRF9JTklUSUFMSVpJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTM0IC8vIENvdWxkIG5vdCBleGVjdXRlIHRoZSBmdW5jdGlvbiBpbiB0aGUgc2VwYXJhdGUgdGhyZWFkIGJlY2F1c2UgdGhlIHRocmVhZCBoYXMgbm90IGNvbXBsZXRlZCBpbml0aWFsaXphdGlvbi4KKyNkZWZpbmUgRVJSX1RIUkVBRF9DT1VMRF9OT1RfSU5JVElBTElaRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTMzIC8vIENvdWxkIG5vdCBleGVjdXRlIHRoZSBmdW5jdGlvbiBpbiB0aGUgc2VwYXJhdGUgdGhyZWFkIGJlY2F1c2UgdGhlIHRocmVhZCBjb3VsZCBub3QgaW5pdGlhbGl6ZS4KKyNkZWZpbmUgRVJSX01BU0tfTk9UX1RFTVBMQVRFX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTMyIC8vIFRoZSBtYXNrIG11c3QgYmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgdGVtcGxhdGUuCisjZGVmaW5lIEVSUl9OT1RfUkVDVF9PUl9ST1RBVEVEX1JFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjEzMCAvLyBUaGUgUk9JIG11c3Qgb25seSBoYXZlIGVpdGhlciBhIHNpbmdsZSBSZWN0YW5nbGUgY29udG91ciBvciBhIHNpbmdsZSBSb3RhdGVkIFJlY3RhbmdsZSBjb250b3VyLgorI2RlZmluZSBFUlJfUk9MTEJBQ0tfVU5CT1VOREVEX0lOVEVSRkFDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYxMjkgLy8gRHVyaW5nIHRpbWVkIGV4ZWN1dGlvbiwgeW91IG11c3QgdXNlIHRoZSBwcmVhbGxvY2F0ZWQgdmVyc2lvbiBvZiB0aGlzIG9wZXJhdGlvbi4KKyNkZWZpbmUgRVJSX1JPTExCQUNLX1JFU09VUkNFX0NPTkZMSUNUXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTI4IC8vIEFuIGltYWdlIGJlaW5nIG1vZGlmaWVkIGJ5IG9uZSBwcm9jZXNzIGNhbm5vdCBiZSByZXF1ZXN0ZWQgYnkgYW5vdGhlciBwcm9jZXNzIHdoaWxlIGEgdGltZSBsaW1pdCBpcyBhY3RpdmUuCisjZGVmaW5lIEVSUl9ST0xMQkFDS19SRVNPVVJDRV9DT05GTElDVF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjEyNyAvLyBBbiBpbWFnZSB3aXRoIHBhdHRlcm4gbWF0Y2hpbmcsIGNhbGlicmF0aW9uLCBvciBvdmVybGF5IGluZm9ybWF0aW9uIGNhbm5vdCBiZSBtYW5pcHVsYXRlZCB3aGlsZSBhIHRpbWUgbGltaXQgaXMgYWN0aXZlLgorI2RlZmluZSBFUlJfUk9MTEJBQ0tfUkVTT1VSQ0VfQ09ORkxJQ1RfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYxMjYgLy8gQW4gaW1hZ2UgY3JlYXRlZCBiZWZvcmUgYSB0aW1lIGxpbWl0IGlzIHN0YXJ0ZWQgY2Fubm90IGJlIHJlc2l6ZWQgd2hpbGUgYSB0aW1lIGxpbWl0IGlzIGFjdGl2ZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfQ09OVFJBU1RfVEhSRVNIT0xEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTI1IC8vIEludmFsaWQgY29udHJhc3QgdGhyZXNob2xkLiBUaGUgdGhyZXNob2xkIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAuIAorI2RlZmluZSBFUlJfSU5WQUxJRF9DQUxJQlJBVElPTl9ST0lfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYxMjQgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIGNhbGlicmF0aW9uIFJPSSBtb2RlIHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfQ0FMSUJSQVRJT05fTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTIzIC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBjYWxpYnJhdGlvbiBtb2RlIHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX0RSQVdURVhUX0NPTE9SX01VU1RfQkVfR1JBWVNDQUxFICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTIyIC8vIFNldCB0aGUgZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCB0ZXh0IGNvbG9ycyB0byBncmF5c2NhbGUgdG8gZHJhdyBvbiBhIFU4IGltYWdlLgorI2RlZmluZSBFUlJfU0FUVVJBVElPTl9USFJFU0hPTERfT1VUX09GX1JBTkdFICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYxMjEgLy8gVGhlIHZhbHVlIG9mIHRoZSBzYXR1cmF0aW9uIHRocmVzaG9sZCBtdXN0IGJlIGZyb20gMCB0byAyNTUuCisjZGVmaW5lIEVSUl9OT1RfSU1BR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjEyMCAvLyBOb3QgYW4gaW1hZ2UuCisjZGVmaW5lIEVSUl9DVVNUT01EQVRBX0lOVkFMSURfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjExOSAvLyBUaGV5IGN1c3RvbSBkYXRhIGtleSB5b3Ugc3VwcGxpZWQgaXMgaW52YWxpZC4gVGhlIG9ubHkgdmFsaWQgY2hhcmFjdGVyIHZhbHVlcyBhcmUgZGVjaW1hbCAzMi0xMjYgYW5kIDE2MS0yNTUuIFRoZXJlIG11c3QgYWxzbyBiZSBubyByZXBlYXRlZCwgbGVhZGluZywgb3IgdHJhaWxpbmcgc3BhY2VzLgorI2RlZmluZSBFUlJfSU5WQUxJRF9TVEVQX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYxMTggLy8gU3RlcCBzaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8gYW5kIGxlc3MgdGhhbiBJbWFnZSBzaXplCisjZGVmaW5lIEVSUl9NQVRSSVhfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjExNyAvLyBJbnZhbGlkIG1hdHJpeCBzaXplIGluIHRoZSBzdHJ1Y3R1cmluZyBlbGVtZW50LgorI2RlZmluZSBFUlJfQ0FMSUJSQVRJT05fSU5TRl9QT0lOVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYxMTYgLy8gSW5zdWZmaWNpZW50IG51bWJlciBvZiBjYWxpYnJhdGlvbiBmZWF0dXJlIHBvaW50cy4KKyNkZWZpbmUgRVJSX0NBTElCUkFUSU9OX0lNQUdFX0NPUlJFQ1RFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTE1IC8vIFRoZSBvcGVyYXRpb24gaXMgaW52YWxpZCBpbiBhIGNvcnJlY3RlZCBpbWFnZS4KKyNkZWZpbmUgRVJSX0NBTElCUkFUSU9OX0lOVkFMSURfUk9JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTE0IC8vIFRoZSBST0kgY29udGFpbnMgYW4gaW52YWxpZCBjb250b3VyIHR5cGUgb3IgaXMgbm90IGNvbnRhaW5lZCBpbiB0aGUgUk9JIGxlYXJuZWQgZm9yIGNhbGlicmF0aW9uLgorI2RlZmluZSBFUlJfQ0FMSUJSQVRJT05fSU1BR0VfVU5DQUxJQlJBVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYxMTMgLy8gVGhlIHNvdXJjZS9pbnB1dCBpbWFnZSBoYXMgbm90IGJlZW4gY2FsaWJyYXRlZC4KKyNkZWZpbmUgRVJSX0lOQ09NUF9NQVRSSVhfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTEyIC8vIFRoZSBudW1iZXIgb2YgcGl4ZWwgYW5kIHJlYWwtd29ybGQgY29vcmRpbmF0ZXMgbXVzdCBiZSBlcXVhbC4KKyNkZWZpbmUgRVJSX0NBTElCUkFUSU9OX0ZBSUxFRF9UT19GSU5EX0dSSUQgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTExIC8vIFVuYWJsZSB0byBhdXRvbWF0aWNhbGx5IGRldGVjdCBncmlkIGJlY2F1c2UgdGhlIGltYWdlIGlzIHRvbyBkaXN0b3J0ZWQuCisjZGVmaW5lIEVSUl9DQUxJQlJBVElPTl9JTkZPX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjExMCAvLyBJbnZhbGlkIGNhbGlicmF0aW9uIGluZm9ybWF0aW9uIHZlcnNpb24uCisjZGVmaW5lIEVSUl9DQUxJQlJBVElPTl9JTlZBTElEX1NDQUxJTkdfRkFDVE9SICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjEwOSAvLyBJbnZhbGlkIGNhbGlicmF0aW9uIHNjYWxpbmcgZmFjdG9yLgorI2RlZmluZSBFUlJfQ0FMSUJSQVRJT05fRVJST1JNQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYxMDggLy8gVGhlIGNhbGlicmF0aW9uIGVycm9yIG1hcCBjYW5ub3QgYmUgY29tcHV0ZWQuCisjZGVmaW5lIEVSUl9DQUxJQlJBVElPTl9JTkZPXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjEwNyAvLyBJbnZhbGlkIGNhbGlicmF0aW9uIHRlbXBsYXRlIGltYWdlLgorI2RlZmluZSBFUlJfQ0FMSUJSQVRJT05fSU5GT18yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYxMDYgLy8gSW52YWxpZCBjYWxpYnJhdGlvbiB0ZW1wbGF0ZSBpbWFnZS4KKyNkZWZpbmUgRVJSX0NBTElCUkFUSU9OX0lORk9fMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTA1IC8vIEludmFsaWQgY2FsaWJyYXRpb24gdGVtcGxhdGUgaW1hZ2UuCisjZGVmaW5lIEVSUl9DQUxJQlJBVElPTl9JTkZPXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjEwNCAvLyBJbnZhbGlkIGNhbGlicmF0aW9uIHRlbXBsYXRlIGltYWdlLgorI2RlZmluZSBFUlJfQ0FMSUJSQVRJT05fSU5GT181ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYxMDMgLy8gSW52YWxpZCBjYWxpYnJhdGlvbiB0ZW1wbGF0ZSBpbWFnZS4KKyNkZWZpbmUgRVJSX0NBTElCUkFUSU9OX0lORk9fNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTAyIC8vIEludmFsaWQgY2FsaWJyYXRpb24gdGVtcGxhdGUgaW1hZ2UuCisjZGVmaW5lIEVSUl9DQUxJQlJBVElPTl9JTkZPX01JQ1JPX1BMQU5FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjEwMSAvLyBJbnZhbGlkIGNhbGlicmF0aW9uIHRlbXBsYXRlIGltYWdlLgorI2RlZmluZSBFUlJfQ0FMSUJSQVRJT05fSU5GT19QRVJTUEVDVElWRV9QUk9KRUNUSU9OICAgICAgICAgICAgICAgICAgLTEwNzQzOTYxMDAgLy8gSW52YWxpZCBjYWxpYnJhdGlvbiB0ZW1wbGF0ZSBpbWFnZS4KKyNkZWZpbmUgRVJSX0NBTElCUkFUSU9OX0lORk9fU0lNUExFX1RSQU5TRk9STSAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDk5IC8vIEludmFsaWQgY2FsaWJyYXRpb24gdGVtcGxhdGUgaW1hZ2UuCisjZGVmaW5lIEVSUl9SRVNFUlZFRF9NVVNUX0JFX05VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjA5OCAvLyBZb3UgbXVzdCBwYXNzIE5VTEwgZm9yIHRoZSByZXNlcnZlZCBwYXJhbWV0ZXIuCisjZGVmaW5lIEVSUl9JTlZBTElEX1BBUlRJQ0xFX1BBUkFNRVRFUl9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjA5NyAvLyBZb3UgZW50ZXJlZCBhbiBpbnZhbGlkIHNlbGVjdGlvbiBpbiB0aGUgcGFydGljbGUgcGFyYW1ldGVyLgorI2RlZmluZSBFUlJfTk9UX0FOX09CSkVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwOTYgLy8gTm90IGFuIG9iamVjdC4KKyNkZWZpbmUgRVJSX0NBTElCUkFUSU9OX0RVUExJQ0FURV9SRUZFUkVOQ0VfUE9JTlQgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDk1IC8vIFRoZSByZWZlcmVuY2UgcG9pbnRzIHBhc3NlZCBhcmUgaW5jb25zaXN0ZW50LiAgQXQgbGVhc3QgdHdvIHNpbWlsYXIgcGl4ZWwgY29vcmRpbmF0ZXMgY29ycmVzcG9uZCB0byBkaWZmZXJlbnQgcmVhbC13b3JsZCBjb29yZGluYXRlcy4KKyNkZWZpbmUgRVJSX1JPTExCQUNLX1JFU09VUkNFX0NBTk5PVF9VTkxPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDk0IC8vIEEgcmVzb3VyY2UgY29uZmxpY3Qgb2NjdXJyZWQgaW4gdGhlIHRpbWVkIGVudmlyb25tZW50LiBUd28gcHJvY2Vzc2VzIGNhbm5vdCBtYW5hZ2UgdGhlIHNhbWUgcmVzb3VyY2UgYW5kIGJlIHRpbWUgYm91bmRlZC4KKyNkZWZpbmUgRVJSX1JPTExCQUNLX1JFU09VUkNFX0xPQ0tFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDkzIC8vIEEgcmVzb3VyY2UgY29uZmxpY3Qgb2NjdXJyZWQgaW4gdGhlIHRpbWVkIGVudmlyb25tZW50LiBUd28gcHJvY2Vzc2VzIGNhbm5vdCBhY2Nlc3MgdGhlIHNhbWUgcmVzb3VyY2UgYW5kIGJlIHRpbWUgYm91bmRlZC4KKyNkZWZpbmUgRVJSX1JPTExCQUNLX1JFU09VUkNFX05PTl9FTVBUWV9JTklUSUFMSVpFICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDkyIC8vIE11bHRpcGxlIHRpbWVkIGVudmlyb25tZW50cyBhcmUgbm90IHN1cHBvcnRlZC4KKyNkZWZpbmUgRVJSX1JPTExCQUNLX1JFU09VUkNFX1VOSU5JVElBTElaRURfRU5BQkxFICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDkxIC8vIEEgdGltZSBsaW1pdCBjYW5ub3QgYmUgc3RhcnRlZCB1bnRpbCB0aGUgdGltZWQgZW52aXJvbm1lbnQgaXMgaW5pdGlhbGl6ZWQuCisjZGVmaW5lIEVSUl9ST0xMQkFDS19SRVNPVVJDRV9FTkFCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjA5MCAvLyBNdWx0aXBsZSB0aW1lZCBlbnZpcm9ubWVudHMgYXJlIG5vdCBzdXBwb3J0ZWQuCisjZGVmaW5lIEVSUl9ST0xMQkFDS19SRVNPVVJDRV9SRUlOSVRJQUxJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjA4OSAvLyBUaGUgdGltZWQgZW52aXJvbm1lbnQgaXMgYWxyZWFkeSBpbml0aWFsaXplZC4KKyNkZWZpbmUgRVJSX1JPTExCQUNLX1JFU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDg4IC8vIFRoZSByZXN1bHRzIG9mIHRoZSBvcGVyYXRpb24gZXhjZWVkZWQgdGhlIHNpemUgbGltaXRzIG9uIHRoZSBvdXRwdXQgZGF0YSBhcnJheXMuCisjZGVmaW5lIEVSUl9ST0xMQkFDS19TVE9QX1RJTUVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjA4NyAvLyBObyB0aW1lIGxpbWl0IGlzIGF2YWlsYWJsZSB0byBzdG9wLgorI2RlZmluZSBFUlJfUk9MTEJBQ0tfU1RBUlRfVElNRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwODYgLy8gQSB0aW1lIGxpbWl0IGNvdWxkIG5vdCBiZSBzZXQuCisjZGVmaW5lIEVSUl9ST0xMQkFDS19JTklUX1RJTUVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjA4NSAvLyBUaGUgdGltZWQgZW52aXJvbm1lbnQgY291bGQgbm90IGJlIGluaXRpYWxpemVkLgorI2RlZmluZSBFUlJfUk9MTEJBQ0tfREVMRVRFX1RJTUVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwODQgLy8gTm8gaW5pdGlhbGl6ZWQgdGltZWQgZW52aXJvbm1lbnQgaXMgYXZhaWxhYmxlIHRvIGNsb3NlLgorI2RlZmluZSBFUlJfUk9MTEJBQ0tfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwODMgLy8gVGhlIHRpbWUgbGltaXQgaGFzIGV4cGlyZWQuCisjZGVmaW5lIEVSUl9QQUxFVFRFX05PVF9TVVBQT1JURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjA4MiAvLyBPbmx5IDgtYml0IGltYWdlcyBzdXBwb3J0IHRoZSB1c2Ugb2YgcGFsZXR0ZXMuICBFaXRoZXIgZG8gbm90IHVzZSBhIHBhbGV0dGUsIG9yIGNvbnZlcnQgeW91ciBpbWFnZSB0byBhbiA4LWJpdCBpbWFnZSBiZWZvcmUgdXNpbmcgYSBwYWxldHRlLgorI2RlZmluZSBFUlJfQkFEX1BBU1NXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwODEgLy8gSW5jb3JyZWN0IHBhc3N3b3JkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9JTUFHRV9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwODAgLy8gSW52YWxpZCBpbWFnZSB0eXBlLgorI2RlZmluZSBFUlJfSU5WQUxJRF9NRVRBRklMRV9IQU5ETEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwNzkgLy8gSW52YWxpZCBtZXRhZmlsZSBoYW5kbGUuCisjZGVmaW5lIEVSUl9JTkNPTVBfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjA3NyAvLyBJbmNvbXBhdGlibGUgaW1hZ2UgdHlwZS4KKyNkZWZpbmUgRVJSX0NPT1JEX1NZU19GSVJTVF9BWElTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDc2IC8vIFVuYWJsZSB0byBmaXQgYSBsaW5lIGZvciB0aGUgcHJpbWFyeSBheGlzLgorI2RlZmluZSBFUlJfQ09PUkRfU1lTX1NFQ09ORF9BWElTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwNzUgLy8gVW5hYmxlIHRvIGZpdCBhIGxpbmUgZm9yIHRoZSBzZWNvbmRhcnkgYXhpcy4KKyNkZWZpbmUgRVJSX0lOQ09NUF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDc0IC8vIEluY29tcGF0aWJsZSBpbWFnZSBzaXplLgorI2RlZmluZSBFUlJfTUFTS19PVVRTSURFX0lNQUdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwNzMgLy8gV2hlbiB0aGUgbWFzaydzIG9mZnNldCB3YXMgYXBwbGllZCwgdGhlIG1hc2sgd2FzIGVudGlyZWx5IG91dHNpZGUgb2YgdGhlIGltYWdlLgorI2RlZmluZSBFUlJfSU5WQUxJRF9CT1JERVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwNzIgLy8gSW52YWxpZCBpbWFnZSBib3JkZXIuCisjZGVmaW5lIEVSUl9JTlZBTElEX1NDQU5fRElSRUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjA3MSAvLyBJbnZhbGlkIHNjYW4gZGlyZWN0aW9uLgorI2RlZmluZSBFUlJfSU5WQUxJRF9GVU5DVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwNzAgLy8gVW5zdXBwb3J0ZWQgZnVuY3Rpb24uCisjZGVmaW5lIEVSUl9JTlZBTElEX0NPTE9SX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjA2OSAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgY29sb3IgbW9kZSB5b3Ugc3BlY2lmaWVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9BQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwNjggLy8gVGhlIGZ1bmN0aW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIHJlcXVlc3RlZCBhY3Rpb24uCisjZGVmaW5lIEVSUl9JTUFHRVNfTk9UX0RJRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjA2NyAvLyBUaGUgc291cmNlIGltYWdlIGFuZCBkZXN0aW5hdGlvbiBpbWFnZSBtdXN0IGJlIGRpZmZlcmVudC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfUE9JTlRTWU1CT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDY2IC8vIEludmFsaWQgcG9pbnQgc3ltYm9sLgorI2RlZmluZSBFUlJfQ0FOVF9SRVNJWkVfRVhURVJOQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwNjUgLy8gQ2Fubm90IHJlc2l6ZSBhbiBpbWFnZSBpbiBhbiBhY3F1aXNpdGlvbiBidWZmZXIuCisjZGVmaW5lIEVSUl9FWFRFUk5BTF9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjA2NCAvLyBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGZvciBpbWFnZXMgaW4gYW4gYWNxdWlzaXRpb24gYnVmZmVyLgorI2RlZmluZSBFUlJfRVhURVJOQUxfQUxJR05NRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwNjMgLy8gVGhlIGV4dGVybmFsIGJ1ZmZlciBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIFRoZSBsaW5lIHdpZHRoIGFuZCBib3JkZXIgcGl4ZWxzIG11c3QgYmUgNC1ieXRlIGFsaWduZWQsIGFzIHdlbGwuCisjZGVmaW5lIEVSUl9JTlZBTElEX1RPTEVSQU5DRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjA2MiAvLyBUaGUgdG9sZXJhbmNlIHBhcmFtZXRlciBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwLgorI2RlZmluZSBFUlJfSU5WQUxJRF9XSU5ET1dfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwNjEgLy8gVGhlIHNpemUgb2YgZWFjaCBkaW1lbnNpb24gb2YgdGhlIHdpbmRvdyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAyIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhlIGltYWdlIGluIHRoZSBjb3JyZXNwb25kaW5nIGRpbWVuc2lvbi4KKyNkZWZpbmUgRVJSX0pQRUcyMDAwX0xPU1NMRVNTX1dJVEhfRkxPQVRJTkdfUE9JTlQgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDYwIC8vIExvc3NsZXNzIGNvbXByZXNzaW9uIGNhbm5vdCBiZSB1c2VkIHdpdGggdGhlIGZsb2F0aW5nIHBvaW50IHdhdmVsZXQgdHJhbnNmb3JtIG1vZGUuIEVpdGhlciBzZXQgdGhlIHdhdmVsZXQgdHJhbnNmb3JtIG1vZGUgdG8gaW50ZWdlciwgb3IgdXNlIGxvc3N5IGNvbXByZXNzaW9uLgorI2RlZmluZSBFUlJfSU5WQUxJRF9NQVhfSVRFUkFUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwNTkgLy8gSW52YWxpZCBtYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zLiBNYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uCisjZGVmaW5lIEVSUl9JTlZBTElEX1JPVEFUSU9OX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjA1OCAvLyBJbnZhbGlkIHJvdGF0aW9uIG1vZGUuCisjZGVmaW5lIEVSUl9JTlZBTElEX1NFQVJDSF9WRUNUT1JfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjA1NyAvLyBJbnZhbGlkIHNlYXJjaCB2ZWN0b3Igd2lkdGguIFRoZSB3aWR0aCBtdXN0IGJlIGFuIG9kZCBudW1iZXIgZ3JlYXRlciB0aGFuIHplcm8uCisjZGVmaW5lIEVSUl9JTlZBTElEX01BVFJJWF9NSVJST1JfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjA1NiAvLyBJbnZhbGlkIG1hdHJpeCBtaXJyb3IgbW9kZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfQVNQRUNUX1JBVElPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDU1IC8vIEludmFsaWQgYXNwZWN0IHJhdGlvLiBWYWxpZCBhc3BlY3QgcmF0aW9zIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHplcm8uCisjZGVmaW5lIEVSUl9JTlZBTElEX0NFTExfRklMTF9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjA1NCAvLyBJbnZhbGlkIGNlbGwgZmlsbCB0eXBlLgorI2RlZmluZSBFUlJfSU5WQUxJRF9CT1JERVJfSU5URUdSSVRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwNTMgLy8gSW52YWxpZCBib3JkZXIgaW50ZWdyaXR5LiBWYWxpZCB2YWx1ZXMgcmFuZ2UgZnJvbSAwIHRvIDEwMC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfREVNT0RVTEFUSU9OX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDUyIC8vIEludmFsaWQgZGVtb2R1bGF0aW9uIG1vZGUuCisjZGVmaW5lIEVSUl9JTlZBTElEX0NFTExfRklMVEVSX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjA1MSAvLyBJbnZhbGlkIGNlbGwgZmlsdGVyIG1vZGUuCisjZGVmaW5lIEVSUl9JTlZBTElEX0VDQ19UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjA1MCAvLyBJbnZhbGlkIEVDQyB0eXBlLgorI2RlZmluZSBFUlJfSU5WQUxJRF9NQVRSSVhfUE9MQVJJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwNDkgLy8gSW52YWxpZCBtYXRyaXggcG9sYXJpdHkuCisjZGVmaW5lIEVSUl9JTlZBTElEX0NFTExfU0FNUExFX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjA0OCAvLyBJbnZhbGlkIGNlbGwgc2FtcGxlIHNpemUuCisjZGVmaW5lIEVSUl9JTlZBTElEX0xJTkVBUl9BVkVSQUdFX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjA0NyAvLyBJbnZhbGlkIGxpbmVhciBhdmVyYWdlIG1vZGUuCisjZGVmaW5lIEVSUl9JTlZBTElEXzJEX0JBUkNPREVfQ09OVFJBU1RfRk9SX1JPSSAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjA0NiAvLyBXaGVuIHVzaW5nIGEgcmVnaW9uIG9mIGludGVyZXN0IHRoYXQgaXMgbm90IGEgcmVjdGFuZ2xlLCB5b3UgbXVzdCBzcGVjaWZ5IHRoZSBjb250cmFzdCBtb2RlIG9mIHRoZSBiYXJjb2RlIGFzIGVpdGhlciBibGFjayBvbiB3aGl0ZSBvciB3aGl0ZSBvbiBibGFjay4KKyNkZWZpbmUgRVJSX0lOVkFMSURfMkRfQkFSQ09ERV9TVUJUWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDQ1IC8vIEludmFsaWQgMi1EIGJhcmNvZGUgRGF0YSBNYXRyaXggc3VidHlwZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfMkRfQkFSQ09ERV9TSEFQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDQ0IC8vIEludmFsaWQgMi1EIGJhcmNvZGUgc2hhcGUuCisjZGVmaW5lIEVSUl9JTlZBTElEXzJEX0JBUkNPREVfQ0VMTF9TSEFQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjA0MyAvLyBJbnZhbGlkIDItRCBiYXJjb2RlIGNlbGwgc2hhcGUuCisjZGVmaW5lIEVSUl9JTlZBTElEXzJEX0JBUkNPREVfQ09OVFJBU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjA0MiAvLyBJbnZhbGlkIDItRCBiYXJjb2RlIGNvbnRyYXN0LgorI2RlZmluZSBFUlJfSU5WQUxJRF8yRF9CQVJDT0RFX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwNDEgLy8gSW52YWxpZCAyLUQgYmFyY29kZSB0eXBlLgorI2RlZmluZSBFUlJfRFJJVkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwNDAgLy8gQ2Fubm90IGFjY2VzcyBOSS1JTUFRIGRyaXZlci4KKyNkZWZpbmUgRVJSX0lPX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDM5IC8vIEkvTyBlcnJvci4KKyNkZWZpbmUgRVJSX0ZJTkRfQ09PUkRTWVNfTU9SRV9USEFOX09ORV9FREdFICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDM4IC8vIFdoZW4gc2VhcmNoaW5nIGZvciBhIGNvb3JkaW5hdGUgc3lzdGVtLCB0aGUgbnVtYmVyIG9mIGxpbmVzIHRvIGZpdCBtdXN0IGJlIDEuCisjZGVmaW5lIEVSUl9USU1FT1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjAzNyAvLyBUcmlnZ2VyIHRpbWVvdXQuCisjZGVmaW5lIEVSUl9JTlZBTElEX1NLRUxFVE9OTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjAzNiAvLyBUaGUgU2tlbGV0b24gbW9kZSB5b3Ugc3BlY2lmaWVkIGlzIGludmFsaWQuCisjZGVmaW5lIEVSUl9URU1QTEFURUlNQUdFX05PQ0lSQ0xFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjAzNSAvLyBUaGUgdGVtcGxhdGUgaW1hZ2UgZG9lcyBub3QgY29udGFpbiBlbm91Z2ggaW5mb3JtYXRpb24gZm9yIGxlYXJuaW5nIHRoZSBhZ2dyZXNzaXZlIHNlYXJjaCBzdHJhdGVneS4KKyNkZWZpbmUgRVJSX1RFTVBMQVRFSU1BR0VfRURHRUlORk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDM0IC8vIFRoZSB0ZW1wbGF0ZSBpbWFnZSBkb2VzIG5vdCBjb250YWluIGVub3VnaCBlZGdlIGluZm9ybWF0aW9uIGZvciB0aGUgc2FtcGxlIHNpemUocykgcmVxdWVzdGVkLgorI2RlZmluZSBFUlJfVEVNUExBVEVERVNDUklQVE9SX0xFQVJOU0VUVVBEQVRBICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwMzMgLy8gSW52YWxpZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yLgorI2RlZmluZSBFUlJfVEVNUExBVEVERVNDUklQVE9SX1JPVEFUSU9OX1NFQVJDSFNUUkFURUdZICAgICAgICAgICAgICAgLTEwNzQzOTYwMzIgLy8gVGhlIHRlbXBsYXRlIGRlc2NyaXB0b3IgZG9lcyBub3QgY29udGFpbiBkYXRhIHJlcXVpcmVkIGZvciB0aGUgcmVxdWVzdGVkIHNlYXJjaCBzdHJhdGVneSBpbiByb3RhdGlvbi1pbnZhcmlhbnQgbWF0Y2hpbmcuCisjZGVmaW5lIEVSUl9JTlZBTElEX1RFVFJBR09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjAzMSAvLyBUaGUgaW5wdXQgdGV0cmFnb24gbXVzdCBoYXZlIGZvdXIgcG9pbnRzLiBUaGUgcG9pbnRzIGFyZSBzcGVjaWZpZWQgY2xvY2t3aXNlIHN0YXJ0aW5nIHdpdGggdGhlIHRvcCBsZWZ0IHBvaW50LiAKKyNkZWZpbmUgRVJSX1RPT19NQU5ZX0NMQVNTSUZJQ0FUSU9OX1NFU1NJT05TICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDMwIC8vIFRoZXJlIGFyZSB0b28gbWFueSBjbGFzc2lmaWNhdGlvbiBzZXNzaW9ucyBvcGVuLiAgWW91IG11c3QgY2xvc2UgYSBzZXNzaW9uIGJlZm9yZSB5b3UgY2FuIG9wZW4gYW5vdGhlciBvbmUuCisjZGVmaW5lIEVSUl9USU1FX0JPVU5ERURfRVhFQ1VUSU9OX05PVF9TVVBQT1JURUQgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjAyOCAvLyBOSSBWaXNpb24gbm8gbG9uZ2VyIHN1cHBvcnRzIHRpbWUtYm91bmRlZCBleGVjdXRpb24uCisjZGVmaW5lIEVSUl9JTlZBTElEX0NPTE9SX1JFU09MVVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjAyNyAvLyBJbnZhbGlkIENvbG9yIFJlc29sdXRpb24gZm9yIHRoZSBDb2xvciBDbGFzc2lmaWVyCisjZGVmaW5lIEVSUl9JTlZBTElEX1BST0NFU1NfVFlQRV9GT1JfRURHRV9ERVRFQ1RJT04gICAgICAgICAgICAgICAgICAtMTA3NDM5NjAyNiAvLyBJbnZhbGlkIHByb2Nlc3MgdHlwZSBmb3IgZWRnZSBkZXRlY3Rpb24uCisjZGVmaW5lIEVSUl9JTlZBTElEX0FOR0xFX1JBTkdFX0ZPUl9TVFJBSUdIVF9FREdFICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjAyNSAvLyBBbmdsZSByYW5nZSB2YWx1ZSBzaG91bGQgYmUgZXF1YWwgdG8gb3IgZ3JlYXRlciB0aGFuIHplcm8uCisjZGVmaW5lIEVSUl9JTlZBTElEX01JTl9DT1ZFUkFHRV9GT1JfU1RSQUlHSFRfRURHRSAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjAyNCAvLyBNaW5pbXVtIGNvdmVyYWdlIHZhbHVlIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gemVyby4KKyNkZWZpbmUgRVJSX0lOVkFMSURfQU5HTEVfVE9MX0ZPUl9TVFJBSUdIVF9FREdFICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDIzIC8vIFRoZSBhbmdsZSB0b2xlcmFuY2Ugc2hvdWxkIGJlIGVxdWFsIHRvIG9yIGdyZWF0ZXIgdGhhbiAwLjAwMS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfU0VBUkNIX01PREVfRk9SX1NUUkFJR0hUX0VER0UgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDIyIC8vIEludmFsaWQgc2VhcmNoIG1vZGUgZm9yIGRldGVjdGluZyBzdHJhaWdodCBlZGdlcworI2RlZmluZSBFUlJfSU5WQUxJRF9LRVJORUxfU0laRV9GT1JfRURHRV9ERVRFQ1RJT04gICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwMjEgLy8gSW52YWxpZCBrZXJuZWwgc2l6ZSBmb3IgZWRnZSBkZXRlY3Rpb24uIFRoZSBtaW5pbXVtIGtlcm5lbCBzaXplIGlzIDMsIHRoZSBtYXhpbXVtIGtlcm5lbCBzaXplIGlzIDEwNzM3NDE4MjMgYW5kIHRoZSBrZXJuZWwgc2l6ZSBtdXN0IGJlIG9kZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfR1JBRElOR19NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDIwIC8vIEludmFsaWQgZ3JhZGluZyBtb2RlLgorI2RlZmluZSBFUlJfSU5WQUxJRF9USFJFU0hPTERfUEVSQ0VOVEFHRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwMTkgLy8gSW52YWxpZCB0aHJlc2hvbGQgcGVyY2VudGFnZS4gVmFsaWQgdmFsdWVzIHJhbmdlIGZyb20gMCB0byAxMDAuCisjZGVmaW5lIEVSUl9JTlZBTElEX0VER0VfUE9MQVJJVFlfU0VBUkNIX01PREUgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjAxOCAvLyBJbnZhbGlkIGVkZ2UgcG9sYXJpdHkgc2VhcmNoIG1vZGUuCisjZGVmaW5lIEVSUl9PUEVOSU5HX05FV0VSX0FJTV9HUkFESU5HX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjAxNyAvLyBUaGUgQUlNIGdyYWRpbmcgZGF0YSBhdHRhY2hlZCB0byB0aGUgaW1hZ2UgeW91IHRyaWVkIHRvIG9wZW4gd2FzIGNyZWF0ZWQgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgTkkgVmlzaW9uLiBVcGdyYWRlIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBOSSBWaXNpb24gdG8gcmVhZCB0aGlzIGZpbGUuCisjZGVmaW5lIEVSUl9OT19WSURFT19EUklWRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjAxNiAvLyBObyB2aWRlbyBkcml2ZXIgaXMgaW5zdGFsbGVkLgorI2RlZmluZSBFUlJfUlBDX0VYRUNVVEVfSVZCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwMTUgLy8gVW5hYmxlIHRvIGVzdGFibGlzaCBuZXR3b3JrIGNvbm5lY3Rpb24gd2l0aCByZW1vdGUgc3lzdGVtLgorI2RlZmluZSBFUlJfSU5WQUxJRF9WSURFT19CTElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwMTQgLy8gUlQgVmlkZW8gT3V0IGRvZXMgbm90IHN1cHBvcnQgZGlzcGxheWluZyB0aGUgc3VwcGxpZWQgaW1hZ2UgdHlwZSBhdCB0aGUgc2VsZWN0ZWQgY29sb3IgZGVwdGguCisjZGVmaW5lIEVSUl9JTlZBTElEX1ZJREVPX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjAxMyAvLyBJbnZhbGlkIHZpZGVvIG1vZGUuCisjZGVmaW5lIEVSUl9SUENfRVhFQ1VURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjAxMiAvLyBVbmFibGUgdG8gZGlzcGxheSByZW1vdGUgaW1hZ2Ugb24gbmV0d29yayBjb25uZWN0aW9uLgorI2RlZmluZSBFUlJfUlBDX0JJTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwMTEgLy8gVW5hYmxlIHRvIGVzdGFibGlzaCBuZXR3b3JrIGNvbm5lY3Rpb24uCisjZGVmaW5lIEVSUl9JTlZBTElEX0ZSQU1FX05VTUJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjAxMCAvLyBJbnZhbGlkIGZyYW1lIG51bWJlci4KKyNkZWZpbmUgRVJSX0RJUkVDVFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDA5IC8vIEFuIGludGVybmFsIERpcmVjdFggZXJyb3IgaGFzIG9jY3VycmVkLiAgVHJ5IHVwZ3JhZGluZyB0byB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgRGlyZWN0WC4KKyNkZWZpbmUgRVJSX0RJUkVDVFhfTk9fRklMVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDA4IC8vIEFuIGFwcHJvcHJpYXRlIERpcmVjdFggZmlsdGVyIHRvIHByb2Nlc3MgdGhpcyBmaWxlIGNvdWxkIG5vdCBiZSBmb3VuZC4gIEluc3RhbGwgdGhlIGZpbHRlciB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGlzIEFWSS4gVXBncmFkaW5nIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBEaXJlY3RYIG1heSBjb3JyZWN0IHRoaXMgZXJyb3IuICBOSSBWaXNpb24gcmVxdWlyZXMgRGlyZWN0WCA4LjEgb3IgaGlnaGVyLgorI2RlZmluZSBFUlJfRElSRUNUWF9JTkNPTVBBVElCTEVfQ09NUFJFU1NJT05fRklMVEVSICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwMDcgLy8gSW5jb21wYXRpYmxlIGNvbXByZXNzaW9uIGZpbHRlci4KKyNkZWZpbmUgRVJSX0RJUkVDVFhfVU5LTk9XTl9DT01QUkVTU0lPTl9GSUxURVIgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDA2IC8vIFVua25vd24gY29tcHJlc3Npb24gZmlsdGVyLgorI2RlZmluZSBFUlJfSU5WQUxJRF9BVklfU0VTU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwMDUgLy8gSW52YWxpZCBBVkkgc2Vzc2lvbi4KKyNkZWZpbmUgRVJSX0RJUkVDVFhfQ0VSVElGSUNBVElPTl9GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDA0IC8vIEEgc29mdHdhcmUga2V5IGlzIHJlc3RyaWN0aW5nIHRoZSB1c2Ugb2YgdGhpcyBjb21wcmVzc2lvbiBmaWx0ZXIuCisjZGVmaW5lIEVSUl9BVklfREFUQV9FWENFRURTX0JVRkZFUl9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjAwMyAvLyBUaGUgZGF0YSBmb3IgdGhpcyBmcmFtZSBleGNlZWRzIHRoZSBkYXRhIGJ1ZmZlciBzaXplIHNwZWNpZmllZCB3aGVuIGNyZWF0aW5nIHRoZSBBVkkgZmlsZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTElORUdBVUdFTUVUSE9EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDAyIC8vIEludmFsaWQgbGluZSBnYXVnZSBtZXRob2QuCisjZGVmaW5lIEVSUl9UT09fTUFOWV9BVklfU0VTU0lPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjAwMSAvLyBUaGVyZSBhcmUgdG9vIG1hbnkgQVZJIHNlc3Npb25zIG9wZW4uICBZb3UgbXVzdCBjbG9zZSBhIHNlc3Npb24gYmVmb3JlIHlvdSBjYW4gb3BlbiBhbm90aGVyIG9uZS4KKyNkZWZpbmUgRVJSX0ZJTEVfRklMRV9IRUFERVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDAwIC8vIEludmFsaWQgZmlsZSBoZWFkZXIuCisjZGVmaW5lIEVSUl9GSUxFX0ZJTEVfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTk5OSAvLyBJbnZhbGlkIGZpbGUgdHlwZS4KKyNkZWZpbmUgRVJSX0ZJTEVfQ09MT1JfVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTk4IC8vIEludmFsaWQgY29sb3IgdGFibGUuCisjZGVmaW5lIEVSUl9GSUxFX0FSR0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTk5NyAvLyBJbnZhbGlkIHBhcmFtZXRlci4KKyNkZWZpbmUgRVJSX0ZJTEVfT1BFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTk2IC8vIEZpbGUgaXMgYWxyZWFkeSBvcGVuIGZvciB3cml0aW5nLgorI2RlZmluZSBFUlJfRklMRV9OT1RfRk9VTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5OTUgLy8gRmlsZSBub3QgZm91bmQuCisjZGVmaW5lIEVSUl9GSUxFX1RPT19NQU5ZX09QRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTk5NCAvLyBUb28gbWFueSBmaWxlcyBvcGVuLgorI2RlZmluZSBFUlJfRklMRV9JT19FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5OTMgLy8gRmlsZSBJL08gZXJyb3IuCisjZGVmaW5lIEVSUl9GSUxFX1BFUk1JU1NJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTk5MiAvLyBGaWxlIGFjY2VzcyBkZW5pZWQuCisjZGVmaW5lIEVSUl9GSUxFX0lOVkFMSURfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTk5MSAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgZmlsZSB0eXBlIHlvdSBzcGVjaWZpZWQuCisjZGVmaW5lIEVSUl9GSUxFX0dFVF9JTkZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTk5MCAvLyBDb3VsZCBub3QgcmVhZCBWaXNpb24gaW5mbyBmcm9tIGZpbGUuCisjZGVmaW5lIEVSUl9GSUxFX1JFQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTk4OSAvLyBVbmFibGUgdG8gcmVhZCBkYXRhLgorI2RlZmluZSBFUlJfRklMRV9XUklURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5ODggLy8gVW5hYmxlIHRvIHdyaXRlIGRhdGEuCisjZGVmaW5lIEVSUl9GSUxFX0VPRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTk4NyAvLyBQcmVtYXR1cmUgZW5kIG9mIGZpbGUuCisjZGVmaW5lIEVSUl9GSUxFX0ZPUk1BVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTk4NiAvLyBJbnZhbGlkIGZpbGUgZm9ybWF0LgorI2RlZmluZSBFUlJfRklMRV9PUEVSQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5ODUgLy8gSW52YWxpZCBmaWxlIG9wZXJhdGlvbi4KKyNkZWZpbmUgRVJSX0ZJTEVfSU5WQUxJRF9EQVRBX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTg0IC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBmaWxlIGRhdGEgdHlwZSB5b3Ugc3BlY2lmaWVkLgorI2RlZmluZSBFUlJfRklMRV9OT19TUEFDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5ODMgLy8gRGlzayBmdWxsLgorI2RlZmluZSBFUlJfSU5WQUxJRF9GUkFNRVNfUEVSX1NFQ09ORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5ODIgLy8gVGhlIGZyYW1lcyBwZXIgc2Vjb25kIGluIGFuIEFWSSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLgorI2RlZmluZSBFUlJfSU5TVUZGSUNJRU5UX0JVRkZFUl9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5ODEgLy8gVGhlIGJ1ZmZlciB0aGF0IHdhcyBwYXNzZWQgaW4gaXMgbm90IGJpZyBlbm91Z2ggdG8gaG9sZCBhbGwgb2YgdGhlIGRhdGEuCisjZGVmaW5lIEVSUl9DT01fSU5JVElBTElaRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTk4MCAvLyBFcnJvciBpbml0aWFsaXppbmcgQ09NLgorI2RlZmluZSBFUlJfSU5WQUxJRF9QQVJUSUNMRV9JTkZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5NzkgLy8gVGhlIGltYWdlIGhhcyBpbnZhbGlkIHBhcnRpY2xlIGluZm9ybWF0aW9uLiAgQ2FsbCBpbWFxQ291bnRQYXJ0aWNsZXMgb24gdGhlIGltYWdlIHRvIGNyZWF0ZSBwYXJ0aWNsZSBpbmZvcm1hdGlvbi4KKyNkZWZpbmUgRVJSX0lOVkFMSURfUEFSVElDTEVfTlVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTc4IC8vIEludmFsaWQgcGFydGljbGUgbnVtYmVyLgorI2RlZmluZSBFUlJfQVZJX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5NzcgLy8gVGhlIEFWSSBmaWxlIHdhcyBjcmVhdGVkIGluIGEgbmV3ZXIgdmVyc2lvbiBvZiBOSSBWaXNpb24uIFVwZ3JhZGUgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIE5JIFZpc2lvbiB0byByZWFkIHRoaXMgQVZJIGZpbGUuCisjZGVmaW5lIEVSUl9OVU1CRVJfT0ZfUEFMRVRURV9DT0xPUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTk3NiAvLyBUaGUgY29sb3IgcGFsZXR0ZSBtdXN0IGhhdmUgZXhhY3RseSAwIG9yIDI1NiBlbnRyaWVzLgorI2RlZmluZSBFUlJfQVZJX1RJTUVPVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5NzUgLy8gRGlyZWN0WCBoYXMgdGltZWQgb3V0IHJlYWRpbmcgb3Igd3JpdGluZyB0aGUgQVZJIGZpbGUuICBXaGVuIGNsb3NpbmcgYW4gQVZJIGZpbGUsIHRyeSBhZGRpbmcgYW4gYWRkaXRpb25hbCBkZWxheS4gIFdoZW4gcmVhZGluZyBhbiBBVkkgZmlsZSwgdHJ5IHJlZHVjaW5nIENQVSBhbmQgZGlzayBsb2FkLgorI2RlZmluZSBFUlJfVU5TVVBQT1JURURfSlBFRzIwMDBfQ09MT1JTUEFDRV9NRVRIT0QgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5NzQgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyBKUEVHMjAwMCBmaWxlcyB3aXRoIHRoaXMgY29sb3JzcGFjZSBtZXRob2QuCisjZGVmaW5lIEVSUl9KUEVHMjAwMF9VTlNVUFBPUlRFRF9NVUxUSVBMRV9MQVlFUlMgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTk3MyAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nIEpQRUcyMDAwIGZpbGVzIHdpdGggbW9yZSB0aGFuIG9uZSBsYXllci4KKyNkZWZpbmUgRVJSX0RJUkVDVFhfRU5VTUVSQVRFX0ZJTFRFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTcyIC8vIERpcmVjdFggaXMgdW5hYmxlIHRvIGVudW1lcmF0ZSB0aGUgY29tcHJlc3Npb24gZmlsdGVycy4gVGhpcyBpcyBjYXVzZWQgYnkgYSB0aGlyZC1wYXJ0eSBjb21wcmVzc2lvbiBmaWx0ZXIgdGhhdCBpcyBlaXRoZXIgaW1wcm9wZXJseSBpbnN0YWxsZWQgb3IgaXMgcHJldmVudGluZyBpdHNlbGYgZnJvbSBiZWluZyBlbnVtZXJhdGVkLiBSZW1vdmUgYW55IHJlY2VudGx5IGluc3RhbGxlZCBjb21wcmVzc2lvbiBmaWx0ZXJzIGFuZCB0cnkgYWdhaW4uCisjZGVmaW5lIEVSUl9JTlZBTElEX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTk3MSAvLyBUaGUgb2Zmc2V0IHlvdSBzcGVjaWZpZWQgbXVzdCBiZSBzaXplIDIuCisjZGVmaW5lIEVSUl9JTklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTk2MCAvLyBJbml0aWFsaXphdGlvbiBlcnJvci4KKyNkZWZpbmUgRVJSX0NSRUFURV9XSU5ET1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTU5IC8vIFVuYWJsZSB0byBjcmVhdGUgd2luZG93LgorI2RlZmluZSBFUlJfV0lORE9XX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5NTggLy8gSW52YWxpZCB3aW5kb3cgSUQuCisjZGVmaW5lIEVSUl9BUlJBWV9TSVpFX01JU01BVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTk1NyAvLyBUaGUgYXJyYXkgc2l6ZXMgYXJlIG5vdCBjb21wYXRpYmxlLgorI2RlZmluZSBFUlJfSU5WQUxJRF9RVUFMSVRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5NTYgLy8gVGhlIHF1YWxpdHkgeW91IHByb3ZpZGVkIGlzIGludmFsaWQuIFZhbGlkIHF1YWxpdHkgdmFsdWVzIHJhbmdlIGZyb20gLTEgdG8gMTAwMC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTUFYX1dBVkVMRVRfVFJBTlNGT1JNX0xFVkVMICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTU1IC8vIEludmFsaWQgbWF4aW11bSB3YXZlbGV0IHRyYW5zZm9ybSBsZXZlbC4gIFZhbGlkIHZhbHVlcyByYW5nZSBmcm9tIDAgdG8gMjU1LgorI2RlZmluZSBFUlJfSU5WQUxJRF9RVUFOVElaQVRJT05fU1RFUF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5NTQgLy8gVGhlIHF1YW50aXphdGlvbiBzdGVwIHNpemUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfV0FWRUxFVF9UUkFOU0ZPUk1fTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTUzIC8vIEludmFsaWQgd2F2ZWxldCB0cmFuc2Zvcm0gbW9kZS4KKyNkZWZpbmUgRVJSX1JPSV9OT1RfUE9JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTUyIC8vIFRoZSBST0kgbXVzdCBvbmx5IGhhdmUgYSBzaW5nbGUgUG9pbnQgY29udG91ci4KKyNkZWZpbmUgRVJSX1JPSV9OT1RfUE9JTlRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTUxIC8vIFRoZSBST0kgbXVzdCBvbmx5IGhhdmUgUG9pbnQgY29udG91cnMuCisjZGVmaW5lIEVSUl9ST0lfTk9UX0xJTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTk1MCAvLyBUaGUgUk9JIG11c3Qgb25seSBoYXZlIGEgc2luZ2xlIExpbmUgY29udG91ci4KKyNkZWZpbmUgRVJSX1JPSV9OT1RfQU5OVUxVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTQ5IC8vIFRoZSBST0kgbXVzdCBvbmx5IGhhdmUgYSBzaW5nbGUgQW5udWx1cyBjb250b3VyLgorI2RlZmluZSBFUlJfSU5WQUxJRF9NRUFTVVJFX1BBUlRJQ0xFU19DQUxJQlJBVElPTl9NT0RFICAgICAgICAgICAgICAgLTEwNzQzOTU5NDggLy8gSW52YWxpZCBtZWFzdXJlIHBhcnRpY2xlcyBjYWxpYnJhdGlvbiBtb2RlLgorI2RlZmluZSBFUlJfSU5WQUxJRF9QQVJUSUNMRV9DTEFTU0lGSUVSX1RIUkVTSE9MRF9UWVBFICAgICAgICAgICAgICAgLTEwNzQzOTU5NDcgLy8gSW52YWxpZCBwYXJ0aWNsZSBjbGFzc2lmaWVyIHRocmVzaG9sZCB0eXBlLgorI2RlZmluZSBFUlJfSU5WQUxJRF9ESVNUQU5DRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5NDYgLy8gSW52YWxpZCBDb2xvciBTZWdtZW50YXRpb24gRGlzdGFuY2UKKyNkZWZpbmUgRVJSX0lOVkFMSURfUEFSVElDTEVfQVJFQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTQ1IC8vIEludmFsaWQgQ29sb3IgU2VnbWVuYXRpb24gUGFydGljbGUgQXJlYQorI2RlZmluZSBFUlJfQ0xBU1NfTkFNRV9OT1RfRk9VTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5NDQgLy8gUmVxdWlyZWQgQ2xhc3MgbmFtZSBpcyBub3QgZm91bmQgaW4gdHJhaW5lZCBsYWJlbHMvQ2xhc3MgbmFtZXMKKyNkZWZpbmUgRVJSX05VTUJFUl9MQUJFTF9MSU1JVF9FWENFRURFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTQzIC8vIE51bWJlciBvZiBMYWJlbHMgZXhjZWVkZWQgbGltaXQgb2YgbGFiZWwgSW1hZ2UgdHlwZQorI2RlZmluZSBFUlJfSU5WQUxJRF9ESVNUQU5DRV9MRVZFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5NDIgLy8gSW52YWxpZCBDb2xvciBTZWdtZW50YXRpb24gZGlzdGFuY2UgbGV2ZWwKKyNkZWZpbmUgRVJSX0lOVkFMSURfU1ZNX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTQxIC8vIEludmFsaWQgU1ZNIG1vZGVsIHR5cGUKKyNkZWZpbmUgRVJSX0lOVkFMSURfU1ZNX0tFUk5FTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTQwIC8vIEludmFsaWQgU1ZNIGtlcm5lbCB0eXBlCisjZGVmaW5lIEVSUl9OT19TVVBQT1JUX1ZFQ1RPUl9GT1VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTkzOSAvLyBObyBTdXBwb3J0IFZlY3RvciBpcyBmb3VuZCBhdCBTVk0gdHJhaW5pbmcKKyNkZWZpbmUgRVJSX0NPU1RfTEFCRUxfTk9UX0ZPVU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTM4IC8vIExhYmVsIG5hbWUgaXMgbm90IGZvdW5kIGluIGFkZGVkIHNhbXBsZXMKKyNkZWZpbmUgRVJSX0VYQ0VFREVEX1NWTV9NQVhfSVRFUkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTM3IC8vIFNWTSB0cmFpbmluZyBleGNlZWRlZCBtYXhpbWltIEl0ZXJhdGlvbiBsaW1pdAorI2RlZmluZSBFUlJfSU5WQUxJRF9TVk1fUEFSQU1FVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5MzYgLy8gSW52YWxpZCBTVk0gUGFyYW1ldGVyCisjZGVmaW5lIEVSUl9JTlZBTElEX0lERU5USUZJQ0FUSU9OX1NDT1JFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTkzNSAvLyBJbnZhbGlkIElkZW50aWZpY2F0aW9uIHNjb3JlLiBNdXN0IGJlIGJldHdlZW4gMC0xMDAwLgorI2RlZmluZSBFUlJfSU5WQUxJRF9URVhUVVJFX0ZFQVRVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5MzQgLy8gUmVxdWVzdGVkIGZvciBpbnZhbGlkIHRleHR1cmUgZmVhdHVyZQorI2RlZmluZSBFUlJfSU5WQUxJRF9DT09DQ1VSUkVOQ0VfTEVWRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5MzMgLy8gVGhlIGNvT2NjdXJyZW5jZSBMZXZlbCBtdXN0IGxpZSBiZXR3ZWVuIDEgYW5kIHRoZSBtYXhpbXVtIHBpeGVsIHZhbHVlIG9mIGFuIGltYWdlICgyNTUgZm9yIFU4IGltYWdlKQorI2RlZmluZSBFUlJfSU5WQUxJRF9XQVZFTEVUX1NVQkJBTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5MzIgLy8gUmVxdWVzdCBmb3IgaW52YWxpZCB3YXZlbGV0IHN1YkJhbmQKKyNkZWZpbmUgRVJSX0lOVkFMSURfRklOQUxfU1RFUF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTMxIC8vIFRoZSBmaW5hbCBzdGVwIHNpemUgbXVzdCBiZSBsZXNzZXIgdGhhbiB0aGUgaW5pdGlhbCBzdGVwIHNpemUKKyNkZWZpbmUgRVJSX0lOVkFMSURfRU5FUkdZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTMwIC8vIE1pbmltdW0gRW5lcmd5IHNob3VsZCBsaWUgYmV0d2VlbiAwIGFuZCAxMDAKKyNkZWZpbmUgRVJSX0lOVkFMSURfVEVYVFVSRV9MQUJFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTI5IC8vIFRoZSBjbGFzc2lmaWNhdGlvbiBsYWJlbCBtdXN0IGJlIHRleHR1cmUgb3IgZGVmZWN0IGZvciB0ZXh0dXJlIGRlZmVjdCBjbGFzc2lmaWVyCisjZGVmaW5lIEVSUl9JTlZBTElEX1dBVkVMRVRfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTkyOCAvLyBUaGUgd2F2ZWxldCB0eXBlIGlzIGludmFsaWQKKyNkZWZpbmUgRVJSX1NBTUVfV0FWRUxFVF9CQU5EU19TRUxFQ1RFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTI3IC8vIFNhbWUgV2F2ZWxldCBiYW5kIGlzIHNlbGVjdGVkIG11bHRpcGxlIHRpbWVzCisjZGVmaW5lIEVSUl9JTUFHRV9TSVpFX01JU01BVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTkyNiAvLyBUaGUgdHdvIGlucHV0IGltYWdlIHNpemVzIGFyZSBkaWZmZXJlbnQgCisjZGVmaW5lIEVSUl9OVU1CRVJfQ0xBU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTkyMCAvLyBJbnZhbGlkIG51bWJlciBvZiBjbGFzc2VzLgorI2RlZmluZSBFUlJfSU5WQUxJRF9MVUNBU19LQU5BREVfV0lORE9XX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU4ODggLy8gQm90aCBkaW1lbnNpb25zIG9mIHRoZSB3aW5kb3cgc2l6ZSBzaG91bGQgYmUgb2RkLCBncmVhdGVyIHRoYW4gMiBhbmQgbGVzcyB0aGFuIDE2LgorI2RlZmluZSBFUlJfSU5WQUxJRF9NQVRSSVhfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU4ODcgLy8gVGhlIHR5cGUgb2YgbWF0cml4IHN1cHBsaWVkIHRvIHRoZSBmdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9PUFRJQ0FMX0ZMT1dfVEVSTUlOQVRJT05fQ1JJVEVSSUFfVFlQRSAgICAgICAgICAgLTEwNzQzOTU4ODYgLy8gQW4gaW52YWxpZCB0ZXJtaW5hdGlvbiBjcml0ZXJpYSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgb3B0aWNhbCBmbG93IGNvbXB1dGF0aW9uLgorI2RlZmluZSBFUlJfTEtQX05VTExfUFlSQU1JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU4ODUgLy8gVGhlIHB5cmFtaWQgbGV2ZWxzIHdoZXJlIG5vdCBwcm9wZXJseSBhbGxvY2F0ZWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX1BZUkFNSURfTEVWRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTg4NCAvLyBUaGUgcHlyYW1pZCBsZXZlbCBzcGVjaWZpZWQgY2Fubm90IGJlIG5lZ2F0aXZlCisjZGVmaW5lIEVSUl9JTlZBTElEX0xLUF9LRVJORUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTg4MyAvLyBUaGUga2VybmVsIG11c3QgYmUgc3ltbWV0cmljICB3aXRoIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBhbmQgb2Ygb2RkIHNpemUKKyNkZWZpbmUgRVJSX0lOVkFMSURfSE9STl9TQ0hVTkNLX0xBTUJEQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1ODgyIC8vIEludmFsaWQgc21vb3RoaW5nIHBhcmFtZXRlciBpbiBIb3JuIFNjaHVuY2sgb3BlcmF0aW9uLgorI2RlZmluZSBFUlJfSU5WQUxJRF9IT1JOX1NDSFVOQ0tfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU4ODEgLy8gSW52YWxpZCBzdG9wcGluZyBjcml0ZXJpYSB0eXBlIGZvciBIb3JuIFNjaHVuY2sgb3B0aWNhbCBmbG93LgorI2RlZmluZSBFUlJfUEFSVElDTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU4ODAgLy8gSW52YWxpZCBwYXJ0aWNsZS4KKyNkZWZpbmUgRVJSX0JBRF9NRUFTVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1ODc5IC8vIEludmFsaWQgbWVhc3VyZSBudW1iZXIuCisjZGVmaW5lIEVSUl9QUk9QX05PREVfV1JJVEVfTk9UX1NVUFBPUlRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTg3OCAvLyBUaGUgSW1hZ2UgRGlzcGxheSBjb250cm9sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyB0aGlzIHByb3BlcnR5IG5vZGUuCisjZGVmaW5lIEVSUl9DT0xPUk1PREVfUkVRVUlSRVNfQ0hBTkdFQ09MT1JTUEFDRTIgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTg3NyAvLyBUaGUgc3BlY2lmaWVkIGNvbG9yIG1vZGUgcmVxdWlyZXMgdGhlIHVzZSBvZiBpbWFxQ2hhbmdlQ29sb3JTcGFjZTIuCisjZGVmaW5lIEVSUl9VTlNVUFBPUlRFRF9DT0xPUl9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTg3NiAvLyBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGN1cnJlbnRseSBzdXBwb3J0IHRoZSBjb2xvciBtb2RlIHlvdSBzcGVjaWZpZWQuCisjZGVmaW5lIEVSUl9CQVJDT0RFX1BIQVJNQUNPREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTg3NSAvLyBUaGUgYmFyY29kZSBpcyBub3QgYSB2YWxpZCBQaGFybWFjb2RlIHN5bWJvbAorI2RlZmluZSBFUlJfQkFEX0lOREVYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU4NDAgLy8gSW52YWxpZCBoYW5kbGUgdGFibGUgaW5kZXguCisjZGVmaW5lIEVSUl9JTlZBTElEX0NPTVBSRVNTSU9OX1JBVElPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTgzNyAvLyBUaGUgY29tcHJlc3Npb24gcmF0aW8gbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMS4KKyNkZWZpbmUgRVJSX1RPT19NQU5ZX0NPTlRPVVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1ODAxIC8vIFRoZSBST0kgY29udGFpbnMgdG9vIG1hbnkgY29udG91cnMuCisjZGVmaW5lIEVSUl9QUk9URUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTgwMCAvLyBQcm90ZWN0aW9uIGVycm9yLgorI2RlZmluZSBFUlJfSU5URVJOQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3OTkgLy8gSW50ZXJuYWwgZXJyb3IuCisjZGVmaW5lIEVSUl9JTlZBTElEX0NVU1RPTV9TQU1QTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTc5OCAvLyBUaGUgc2l6ZSBvZiB0aGUgZmVhdHVyZSB2ZWN0b3IgaW4gdGhlIGN1c3RvbSBzYW1wbGUgbXVzdCBtYXRjaCB0aGUgc2l6ZSBvZiB0aG9zZSB5b3UgaGF2ZSBhbHJlYWR5IGFkZGVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9DTEFTU0lGSUVSX1NFU1NJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3OTcgLy8gTm90IGEgdmFsaWQgY2xhc3NpZmllciBzZXNzaW9uLgorI2RlZmluZSBFUlJfSU5WQUxJRF9LTk5fTUVUSE9EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3OTYgLy8gWW91IHJlcXVlc3RlZCBhbiBpbnZhbGlkIE5lYXJlc3QgTmVpZ2hib3IgY2xhc3NpZmllciBtZXRob2QuCisjZGVmaW5lIEVSUl9LX1RPT19MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTc5NSAvLyBUaGUgayBwYXJhbWV0ZXIgbXVzdCBiZSBncmVhdGVyIHRoYW4gdHdvLgorI2RlZmluZSBFUlJfS19UT09fSElHSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3OTQgLy8gVGhlIGsgcGFyYW1ldGVyIG11c3QgYmUgPD0gdGhlIG51bWJlciBvZiBzYW1wbGVzIGluIGVhY2ggY2xhc3MuCisjZGVmaW5lIEVSUl9JTlZBTElEX09QRVJBVElPTl9PTl9DT01QQUNUX1NFU1NJT05fQVRURU1QVEVEICAgICAgICAgICAtMTA3NDM5NTc5MyAvLyBUaGlzIGNsYXNzaWZpZXIgc2Vzc2lvbiBpcyBjb21wYWN0LiBPbmx5IHRoZSBDbGFzc2lmeSBhbmQgRGlzcG9zZSBmdW5jdGlvbnMgbWF5IGJlIGNhbGxlZCBvbiBhIGNvbXBhY3QgY2xhc3NpZmllciBzZXNzaW9uLgorI2RlZmluZSBFUlJfQ0xBU1NJRklFUl9TRVNTSU9OX05PVF9UUkFJTkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3OTIgLy8gVGhpcyBjbGFzc2lmaWVyIHNlc3Npb24gaXMgbm90IHRyYWluZWQuIFlvdSBtYXkgb25seSBjYWxsIHRoaXMgZnVuY3Rpb24gb24gYSB0cmFpbmVkIGNsYXNzaWZpZXIgc2Vzc2lvbi4KKyNkZWZpbmUgRVJSX0NMQVNTSUZJRVJfSU5WQUxJRF9TRVNTSU9OX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzkxIC8vIFRoaXMgY2xhc3NpZmllciBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIG9uIHRoaXMgdHlwZSBvZiBjbGFzc2lmaWVyIHNlc3Npb24uCisjZGVmaW5lIEVSUl9JTlZBTElEX0RJU1RBTkNFX01FVFJJQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTc5MCAvLyBZb3UgcmVxdWVzdGVkIGFuIGludmFsaWQgZGlzdGFuY2UgbWV0cmljLgorI2RlZmluZSBFUlJfT1BFTklOR19ORVdFUl9DTEFTU0lGSUVSX1NFU1NJT04gICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3ODkgLy8gVGhlIGNsYXNzaWZpZXIgc2Vzc2lvbiB5b3UgdHJpZWQgdG8gb3BlbiB3YXMgY3JlYXRlZCB3aXRoIGEgbmV3ZXIgdmVyc2lvbiBvZiBOSSBWaXNpb24uIFVwZ3JhZGUgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIE5JIFZpc2lvbiB0byByZWFkIHRoaXMgZmlsZS4KKyNkZWZpbmUgRVJSX05PX1NBTVBMRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1Nzg4IC8vIFRoaXMgb3BlcmF0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWQgYmVjYXVzZSB5b3UgaGF2ZSBub3QgYWRkZWQgYW55IHNhbXBsZXMuCisjZGVmaW5lIEVSUl9JTlZBTElEX0NMQVNTSUZJRVJfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTc4NyAvLyBZb3UgcmVxdWVzdGVkIGFuIGludmFsaWQgY2xhc3NpZmllciB0eXBlLgorI2RlZmluZSBFUlJfSU5WQUxJRF9QQVJUSUNMRV9PUFRJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3ODYgLy8gVGhlIHN1bSBvZiBTY2FsZSBEZXBlbmRlbmNlIGFuZCBTeW1tZXRyeSBEZXBlbmRlbmNlIG11c3QgYmUgbGVzcyB0aGFuIDEwMDAuCisjZGVmaW5lIEVSUl9OT19QQVJUSUNMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTc4NSAvLyBUaGUgaW1hZ2UgeWllbGRlZCBubyBwYXJ0aWNsZXMuCisjZGVmaW5lIEVSUl9JTlZBTElEX0xJTUlUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTc4NCAvLyBUaGUgbGltaXRzIHlvdSBzdXBwbGllZCBhcmUgbm90IHZhbGlkLgorI2RlZmluZSBFUlJfQkFEX1NBTVBMRV9JTkRFWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3ODMgLy8gVGhlIFNhbXBsZSBJbmRleCBmZWxsIG91dHNpZGUgdGhlIHJhbmdlIG9mIFNhbXBsZXMuCisjZGVmaW5lIEVSUl9ERVNDUklQVElPTl9UT09fTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTc4MiAvLyBUaGUgZGVzY3JpcHRpb24gbXVzdCBiZSA8PSAyNTUgY2hhcmFjdGVycy4KKyNkZWZpbmUgRVJSX0NMQVNTSUZJRVJfSU5WQUxJRF9FTkdJTkVfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzgxIC8vIFRoZSBlbmdpbmUgZm9yIHRoaXMgY2xhc3NpZmllciBzZXNzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBvcGVyYXRpb24uCisjZGVmaW5lIEVSUl9JTlZBTElEX1BBUlRJQ0xFX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTc4MCAvLyBZb3UgcmVxdWVzdGVkIGFuIGludmFsaWQgcGFydGljbGUgdHlwZS4KKyNkZWZpbmUgRVJSX0NBTk5PVF9DT01QQUNUX1VOVFJBSU5FRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1Nzc5IC8vIFlvdSBtYXkgb25seSBzYXZlIGEgc2Vzc2lvbiBpbiBjb21wYWN0IGZvcm0gaWYgaXQgaXMgdHJhaW5lZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfS0VSTkVMX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1Nzc4IC8vIFRoZSBLZXJuZWwgc2l6ZSBtdXN0IGJlIHNtYWxsZXIgdGhhbiB0aGUgaW1hZ2Ugc2l6ZS4KKyNkZWZpbmUgRVJSX0lOQ09NUEFUSUJMRV9DTEFTU0lGSUVSX1RZUEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1Nzc3IC8vIFRoZSBzZXNzaW9uIHlvdSByZWFkIGZyb20gZmlsZSBtdXN0IGJlIHRoZSBzYW1lIHR5cGUgYXMgdGhlIHNlc3Npb24geW91IHBhc3NlZCBpbi4KKyNkZWZpbmUgRVJSX0lOVkFMSURfVVNFX09GX0NPTVBBQ1RfU0VTU0lPTl9GSUxFICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1Nzc2IC8vIFlvdSBjYW4gbm90IHVzZSBhIGNvbXBhY3QgY2xhc3NpZmljYXRpb24gZmlsZSB3aXRoIHJlYWQgb3B0aW9ucyBvdGhlciB0aGFuIFJlYWQgQWxsLgorI2RlZmluZSBFUlJfUk9JX0hBU19PUEVOX0NPTlRPVVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3NzUgLy8gVGhlIFJPSSB5b3UgcGFzc2VkIGluIG1heSBvbmx5IGNvbnRhaW4gY2xvc2VkIGNvbnRvdXJzLgorI2RlZmluZSBFUlJfTk9fTEFCRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3NzQgLy8gWW91IG11c3QgcGFzcyBpbiBhIGxhYmVsLgorI2RlZmluZSBFUlJfTk9fREVTVF9JTUFHRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3NzMgLy8gWW91IG11c3QgcHJvdmlkZSBhIGRlc3RpbmF0aW9uIGltYWdlLgorI2RlZmluZSBFUlJfSU5WQUxJRF9SRUdJU1RSQVRJT05fTUVUSE9EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3NzIgLy8gWW91IHByb3ZpZGVkIGFuIGludmFsaWQgcmVnaXN0cmF0aW9uIG1ldGhvZC4KKyNkZWZpbmUgRVJSX09QRU5JTkdfTkVXRVJfSU5TUEVDVElPTl9URU1QTEFURSAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzcxIC8vIFRoZSBnb2xkZW4gdGVtcGxhdGUgeW91IHRyaWVkIHRvIG9wZW4gd2FzIGNyZWF0ZWQgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgTkkgVmlzaW9uLiBVcGdyYWRlIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBOSSBWaXNpb24gdG8gcmVhZCB0aGlzIGZpbGUuCisjZGVmaW5lIEVSUl9JTlZBTElEX0lOU1BFQ1RJT05fVEVNUExBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTc3MCAvLyBJbnZhbGlkIGdvbGRlbiB0ZW1wbGF0ZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfRURHRV9USElDS05FU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzY5IC8vIEVkZ2UgVGhpY2tuZXNzIHRvIElnbm9yZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLgorI2RlZmluZSBFUlJfSU5WQUxJRF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3NjggLy8gU2NhbGUgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4KKyNkZWZpbmUgRVJSX0lOVkFMSURfQUxJR05NRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzY3IC8vIFRoZSBzdXBwbGllZCBzY2FsZSBpcyBpbnZhbGlkIGZvciB5b3VyIHRlbXBsYXRlLgorI2RlZmluZSBFUlJfREVQUkVDQVRFRF9GVU5DVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3NjYgLy8gVGhpcyBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBmdW5jdGlvbiBjYW4gbm90IGJlIHVzZWQgd2l0aCB0aGlzIHNlc3Npb24uIFVzZSBuZXdlciwgc3VwcG9ydGVkIGZ1bmN0aW9ucyBpbnN0ZWFkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9OT1JNQUxJWkFUSU9OX01FVEhPRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3NjMgLy8gWW91IG11c3QgcHJvdmlkZSBhIHZhbGlkIG5vcm1hbGl6YXRpb24gbWV0aG9kLgorI2RlZmluZSBFUlJfSU5WQUxJRF9OSUJMQUNLX0RFVklBVElPTl9GQUNUT1IgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3NjIgLy8gVGhlIGRldmlhdGlvbiBmYWN0b3IgZm9yIE5pYmxhY2sgbG9jYWwgdGhyZXNob2xkIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxLgorI2RlZmluZSBFUlJfQk9BUkRfTk9UX0ZPVU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3NjAgLy8gQm9hcmQgbm90IGZvdW5kLgorI2RlZmluZSBFUlJfQk9BUkRfTk9UX09QRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3NTggLy8gQm9hcmQgbm90IG9wZW5lZC4KKyNkZWZpbmUgRVJSX0RMTF9OT1RfRk9VTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzU3IC8vIERMTCBub3QgZm91bmQuCisjZGVmaW5lIEVSUl9ETExfRlVOQ1RJT05fTk9UX0ZPVU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTc1NiAvLyBETEwgZnVuY3Rpb24gbm90IGZvdW5kLgorI2RlZmluZSBFUlJfVFJJR19USU1FT1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3NTQgLy8gVHJpZ2dlciB0aW1lb3V0LgorI2RlZmluZSBFUlJfQ09OVE9VUl9JTlZBTElEX1JFRklORU1FTlRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3NDYgLy8gSW52YWxpZCBudW1iZXIgc3BlY2lmaWVkIGZvciBtYXhpbXVtIGNvbnRvdXIgcmVmaW5lbWVudHMuCisjZGVmaW5lIEVSUl9UT09fTUFOWV9DVVJWRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTc0NSAvLyBUb28gbWFueSBjdXJ2ZXMgZXh0cmFjdGVkIGZyb20gaW1hZ2UuIFJhaXNlIHRoZSBlZGdlIHRocmVzaG9sZCBvciByZWR1Y2UgdGhlIFJPSS4KKyNkZWZpbmUgRVJSX0NPTlRPVVJfSU5WQUxJRF9LRVJORUxfRk9SX1NNT09USElORyAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzQ0IC8vIEludmFsaWQga2VybmVsIGZvciBjb250b3VyIHNtb290aGluZy4gWmVybyBpbmRpY2F0ZXMgbm8gc21vb3RoaW5nLCBvdGhlcndpc2UgdmFsdWUgbXVzdCBiZSBvZGQuIAorI2RlZmluZSBFUlJfQ09OVE9VUl9MSU5FX0lOVkFMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3NDMgLy8gVGhlIGNvbnRvdXIgbGluZSBmaXQgaXMgaW52YWxpZC4gTGluZSBzZWdtZW50IHN0YXJ0IGFuZCBzdG9wIG11c3QgZGlmZmVyLgorI2RlZmluZSBFUlJfQ09OVE9VUl9URU1QTEFURV9JTUFHRV9JTlZBTElEICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3NDIgLy8gVGhlIHRlbXBsYXRlIGltYWdlIG11c3QgYmUgdHJhaW5lZCB3aXRoIElNQVEgTGVhcm4gQ29udG91ciBQYXR0ZXJuIG9yIGJlIHRoZSBzYW1lIHNpemUgYXMgdGhlIHRhcmdldCBpbWFnZS4KKyNkZWZpbmUgRVJSX0NPTlRPVVJfR1BNX0ZBSUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzQxIC8vIE1hdGNoaW5nIGZhaWxlZCB0byBhbGlnbiB0aGUgdGVtcGxhdGUgYW5kIHRhcmdldCBjb250b3Vycy4KKyNkZWZpbmUgRVJSX0NPTlRPVVJfT1BFTklOR19ORVdFUl9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzQwIC8vIFRoZSBjb250b3VyIHlvdSB0cmllZCB0byBvcGVuIHdhcyBjcmVhdGVkIHdpdGggYSBuZXdlciB2ZXJzaW9uIG9mIE5JIFZpc2lvbi4gVXBncmFkZSB0byB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgTkkgVmlzaW9uIHRvIHJlYWQgdGhpcyBmaWxlLiAKKyNkZWZpbmUgRVJSX0NPTlRPVVJfQ09OTkVDVF9EVVBMSUNBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzM5IC8vIE9ubHkgb25lIHJhbmdlIGlzIGFsbG93ZWQgcGVyIGN1cnZlIGNvbm5lY3Rpb24gY29uc3RyYWludCB0eXBlLiAKKyNkZWZpbmUgRVJSX0NPTlRPVVJfQ09OTkVDVF9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzM4IC8vIEludmFsaWQgY29udG91ciBjb25uZWN0aW9uIGNvbnN0cmFpbnQgdHlwZS4gCisjZGVmaW5lIEVSUl9DT05UT1VSX01BVENIX1NUUl9OT1RfQVBQTElDQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTczNyAvLyBJbiBvcmRlciB0byB1c2UgY29udG91ciBtYXRjaGluZywgeW91IG11c3QgcHJvdmlkZSBhIHRlbXBsYXRlIGltYWdlIHRoYXQgaGFzIGJlZW4gdHJhaW5lZCB3aXRoIElNQVEgTGVhcm4gQ29udG91ciBQYXR0ZXJuCisjZGVmaW5lIEVSUl9DT05UT1VSX0NVUlZBVFVSRV9LRVJORUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTczNiAvLyBJbnZhbGlkIGtlcm5lbCB3aWR0aCBmb3IgY3VydmF0dXJlIGNhbGN1bGF0aW9uLiBNdXN0IGJlIGFuIG9kZCB2YWx1ZSBncmVhdGVyIHRoYW4gMS4gCisjZGVmaW5lIEVSUl9DT05UT1VSX0VYVFJBQ1RfU0VMRUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTczNSAvLyBJbnZhbGlkIENvbnRvdXIgU2VsZWN0aW9uIG1ldGhvZCBmb3IgY29udG91ciBleHRyYWN0aW9uLiAKKyNkZWZpbmUgRVJSX0NPTlRPVVJfRVhUUkFDVF9ESVJFQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzM0IC8vIEludmFsaWQgU2VhcmNoIERpcmVjdGlvbiBmb3IgY29udG91ciBleHRyYWN0aW9uLiAKKyNkZWZpbmUgRVJSX0NPTlRPVVJfRVhUUkFDVF9ST0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzMzIC8vIEludmFsaWQgUk9JIGZvciBjb250b3VyIGV4dHJhY3Rpb24uIFRoZSBST0kgbXVzdCBjb250YWluIGFuIGFubnVsdXMsIHJlY3RhbmdsZSBvciByb3RhdGVkIHJlY3RhbmdsZS4gCisjZGVmaW5lIEVSUl9DT05UT1VSX05PX0NVUlZFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTczMiAvLyBObyBjdXJ2ZXMgd2VyZSBmb3VuZCBpbiB0aGUgaW1hZ2UuCisjZGVmaW5lIEVSUl9DT05UT1VSX0NPTVBBUkVfS0VSTkVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTczMSAvLyBJbnZhbGlkIFNtb290aGluZyBLZXJuZWwgd2lkdGggZm9yIGNvbnRvdXIgY29tcGFyaXNvbi4gTXVzdCBiZSB6ZXJvIG9yIGFuIG9kZCBwb3NpdGl2ZSBpbnRlZ2VyLiAKKyNkZWZpbmUgRVJSX0NPTlRPVVJfQ09NUEFSRV9TSU5HTEVfSU1BR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzMwIC8vIElmIG5vIHRlbXBsYXRlIGltYWdlIGlzIHByb3ZpZGVkLCB0aGUgdGFyZ2V0IGltYWdlIG11c3QgY29udGFpbiBib3RoIGEgY29udG91ciB3aXRoIGV4dHJhY3RlZCBwb2ludHMgYW5kIGEgZml0dGVkIGVxdWF0aW9uLgorI2RlZmluZSBFUlJfQ09OVE9VUl9JTlZBTElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3MjkgLy8gSW52YWxpZCBjb250b3VyIGltYWdlLgorI2RlZmluZSBFUlJfSU5WQUxJRF8yRF9CQVJDT0RFX1NFQVJDSF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3MjggLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIHNlYXJjaCBtb2RlIHlvdSBwcm92aWRlZC4KKyNkZWZpbmUgRVJSX1VOU1VQUE9SVEVEXzJEX0JBUkNPREVfU0VBUkNIX01PREUgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzI3IC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBzZWFyY2ggbW9kZSB5b3UgcHJvdmlkZWQgZm9yIHRoZSB0eXBlIG9mIDJEIGJhcmNvZGUgZm9yIHdoaWNoIHlvdSBhcmUgc2VhcmNoaW5nLgorI2RlZmluZSBFUlJfTUFUQ0hGQUNUT1JfT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3MjYgLy8gbWF0Y2hGYWN0b3IgaGFzIGJlZW4gb2Jzb2xldGVkLiBJbnN0ZWFkLCBzZXQgdGhlIGluaXRpYWxNYXRjaExpc3RMZW5ndGggYW5kIG1hdGNoTGlzdFJlZHVjdGlvbkZhY3RvciBpbiB0aGUgTWF0Y2hQYXR0ZXJuQWR2YW5jZWRPcHRpb25zIHN0cnVjdHVyZS4KKyNkZWZpbmUgRVJSX0RBVEFfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzI1IC8vIFRoZSBkYXRhIHdhcyBzdG9yZWQgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgTkkgVmlzaW9uLiBVcGdyYWRlIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBOSSBWaXNpb24gdG8gcmVhZCB0aGlzIGRhdGEuCisjZGVmaW5lIEVSUl9DVVNUT01EQVRBX0lOVkFMSURfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTcyNCAvLyBUaGUgc2l6ZSB5b3Ugc3BlY2lmaWVkIGlzIG91dCBvZiB0aGUgdmFsaWQgcmFuZ2UuCisjZGVmaW5lIEVSUl9DVVNUT01EQVRBX0tFWV9OT1RfRk9VTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTcyMyAvLyBUaGUga2V5IHlvdSBzcGVjaWZpZWQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBpbWFnZS4KKyNkZWZpbmUgRVJSX0NMQVNTSUZJRVJfQ0xBU1NJRllfSU1BR0VfV0lUSF9DVVNUT01fU0VTU0lPTiAgICAgICAgICAgIC0xMDc0Mzk1NzIyIC8vIEN1c3RvbSBjbGFzc2lmaWVyIHNlc3Npb25zIG9ubHkgY2xhc3NpZnkgZmVhdHVyZSB2ZWN0b3JzLiBUaGV5IGRvIG5vdCBzdXBwb3J0IGNsYXNzaWZ5aW5nIGltYWdlcy4KKyNkZWZpbmUgRVJSX0lOVkFMSURfQklUX0RFUFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzIxIC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBiaXQgZGVwdGggeW91IHN1cHBsaWVkIGZvciB0aGUgaW1hZ2UgeW91IHN1cHBsaWVkLgorI2RlZmluZSBFUlJfQkFEX1JPSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3MjAgLy8gSW52YWxpZCBST0kuCisjZGVmaW5lIEVSUl9CQURfUk9JX0JPWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTcxOSAvLyBJbnZhbGlkIFJPSSBnbG9iYWwgcmVjdGFuZ2xlLgorI2RlZmluZSBFUlJfTEFCX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3MTggLy8gVGhlIHZlcnNpb24gb2YgTGFiVklFVyBvciBCcmlkZ2VWSUVXIHlvdSBhcmUgcnVubmluZyBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgb3BlcmF0aW9uLgorI2RlZmluZSBFUlJfSU5WQUxJRF9SQU5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3MTcgLy8gVGhlIHJhbmdlIHlvdSBzdXBwbGllZCBpcyBpbnZhbGlkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9TQ0FMSU5HX01FVEhPRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3MTYgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIHNjYWxpbmcgbWV0aG9kIHlvdSBwcm92aWRlZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfQ0FMSUJSQVRJT05fVU5JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzE1IC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBjYWxpYnJhdGlvbiB1bml0IHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfQVhJU19PUklFTlRBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzE0IC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBheGlzIG9yaWVudGF0aW9uIHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX1ZBTFVFX05PVF9JTl9FTlVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzEzIC8vIFZhbHVlIG5vdCBpbiBlbnVtZXJhdGlvbi4KKyNkZWZpbmUgRVJSX1dST05HX1JFR0lPTl9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzEyIC8vIFlvdSBzZWxlY3RlZCBhIHJlZ2lvbiB0aGF0IGlzIG5vdCBvZiB0aGUgcmlnaHQgdHlwZS4KKyNkZWZpbmUgRVJSX05PVF9FTk9VR0hfUkVHSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzExIC8vIFlvdSBzcGVjaWZpZWQgYSB2aWV3ZXIgdGhhdCBkb2VzIG5vdCBjb250YWluIGVub3VnaCByZWdpb25zLgorI2RlZmluZSBFUlJfVE9PX01BTllfUEFSVElDTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3MTAgLy8gVGhlIGltYWdlIGhhcyB0b28gbWFueSBwYXJ0aWNsZXMgZm9yIHRoaXMgcHJvY2Vzcy4KKyNkZWZpbmUgRVJSX0FWSV9VTk9QRU5FRF9TRVNTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzA5IC8vIFRoZSBBVkkgc2Vzc2lvbiBoYXMgbm90IGJlZW4gb3BlbmVkLgorI2RlZmluZSBFUlJfQVZJX1JFQURfU0VTU0lPTl9SRVFVSVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3MDggLy8gVGhlIEFWSSBzZXNzaW9uIGlzIGEgd3JpdGUgc2Vzc2lvbiwgYnV0IHRoaXMgb3BlcmF0aW9uIHJlcXVpcmVzIGEgcmVhZCBzZXNzaW9uLgorI2RlZmluZSBFUlJfQVZJX1dSSVRFX1NFU1NJT05fUkVRVUlSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3MDcgLy8gVGhlIEFWSSBzZXNzaW9uIGlzIGEgcmVhZCBzZXNzaW9uLCBidXQgdGhpcyBvcGVyYXRpb24gcmVxdWlyZXMgYSB3cml0ZSBzZXNzaW9uLgorI2RlZmluZSBFUlJfQVZJX1NFU1NJT05fQUxSRUFEWV9PUEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3MDYgLy8gVGhpcyBBVkkgc2Vzc2lvbiBpcyBhbHJlYWR5IG9wZW4uIFlvdSBtdXN0IGNsb3NlIGl0IGJlZm9yZSBjYWxsaW5nIHRoZSBDcmVhdGUgb3IgT3BlbiBmdW5jdGlvbnMuCisjZGVmaW5lIEVSUl9EQVRBX0NPUlJVUFRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTcwNSAvLyBUaGUgZGF0YSBpcyBjb3JydXB0ZWQgYW5kIGNhbm5vdCBiZSByZWFkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9DT01QUkVTU0lPTl9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3MDQgLy8gSW52YWxpZCBjb21wcmVzc2lvbiB0eXBlLgorI2RlZmluZSBFUlJfSU5WQUxJRF9UWVBFX09GX0ZMQVRURU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3MDMgLy8gSW52YWxpZCB0eXBlIG9mIGZsYXR0ZW4uCisjZGVmaW5lIEVSUl9JTlZBTElEX0xFTkdUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTcwMiAvLyBUaGUgbGVuZ3RoIG9mIHRoZSBlZGdlIGRldGVjdGlvbiBsaW5lIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uCisjZGVmaW5lIEVSUl9JTlZBTElEX01BVFJJWF9TSVpFX1JBTkdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTcwMSAvLyBUaGUgbWF4aW11bSBEYXRhIE1hdHJpeCBiYXJjb2RlIHNpemUgbXVzdCBiZSBlcXVhbCB0byBvciBncmVhdGVyIHRoYW4gdGhlIG1pbmltdW0gRGF0YSBNYXRyaXggYmFyY29kZSBzaXplLgorI2RlZmluZSBFUlJfUkVRVUlSRVNfV0lOMjAwMF9PUl9ORVdFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3MDAgLy8gVGhlIGZ1bmN0aW9uIHJlcXVpcmVzIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHRvIGJlIE1pY3Jvc29mdCBXaW5kb3dzIDIwMDAgb3IgbmV3ZXIuCisjZGVmaW5lIEVSUl9JTlZBTElEX0NBTElCUkFUSU9OX01FVEhPRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTY2MiAvLyBJbnZhbGlkIGNhbGlicmF0aW9uIG1ldGhvZCByZXF1ZXN0ZWQKKyNkZWZpbmUgRVJSX0lOVkFMSURfT1BFUkFUSU9OX09OX0NPTVBBQ1RfQ0FMSUJSQVRJT05fQVRURU1QVEVEICAgICAgIC0xMDc0Mzk1NjYxIC8vIFRoaXMgY2FsaWJyYXRpb24gaXMgY29tcGFjdC4gUmUtTGVhcm5pbmcgY2FsaWJyYXRpb24gYW5kIHJldHJpZXZpbmcgdGh1bWJuYWlscyBhcmUgbm90IHBvc3NpYmxlIHdpdGggdGhpcyBjYWxpYnJhdGlvbgorI2RlZmluZSBFUlJfSU5WQUxJRF9QT0xZTk9NSUFMX01PREVMX0tfQ09VTlQgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2NjAgLy8gSW52YWxpZCBudW1iZXIgb2YgSyB2YWx1ZXMgCisjZGVmaW5lIEVSUl9JTlZBTElEX0RJU1RPUlRJT05fTU9ERUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTY1OSAvLyBJbnZhbGlkIGRpc3RvcnRpb24gbW9kZWwgdHlwZQorI2RlZmluZSBFUlJfQ0FNRVJBX01PREVMX05PVF9BVkFJTEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2NTggLy8gQ2FtZXJhIE1vZGVsIGlzIG5vdCBsZWFybmVkCisjZGVmaW5lIEVSUl9JTlZBTElEX1RIVU1CTkFJTF9JTkRFWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTY1NyAvLyBTdXBwbGllZCB0aHVtYm5haWwgaW5kZXggaXMgaW52YWxpZAorI2RlZmluZSBFUlJfU01PT1RIX0NPTlRPVVJTX01VU1RfQkVfU0FNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2NTYgLy8gWW91IG11c3Qgc3BlY2lmeSB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhlIHNtb290aCBjb250b3VycyBhZHZhbmNlZCBtYXRjaCBvcHRpb24gZm9yIGFsbCB0ZW1wbGF0ZXMgeW91IHdhbnQgdG8gbWF0Y2guCisjZGVmaW5lIEVSUl9FTkFCTEVfQ0FMSUJSQVRJT05fU1VQUE9SVF9NVVNUX0JFX1NBTUUgICAgICAgICAgICAgICAgICAtMTA3NDM5NTY1NSAvLyBZb3UgbXVzdCBzcGVjaWZ5IHRoZSBzYW1lIHZhbHVlIGZvciB0aGUgZW5hYmxlIGNhbGlicmF0aW9uIHN1cHBvcnQgYWR2YW5jZWQgbWF0Y2ggb3B0aW9uIGZvciBhbGwgdGVtcGxhdGVzIHlvdSB3YW50IHRvIG1hdGNoLgorI2RlZmluZSBFUlJfR1JBRElOR19JTkZPUk1BVElPTl9OT1RfRk9VTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2NTQgLy8gVGhlIHNvdXJjZSBpbWFnZSBkb2VzIG5vdCBjb250YWluIGdyYWRpbmcgaW5mb3JtYXRpb24uIFlvdSBtdXN0IHByZXBhcmUgdGhlIHNvdXJjZSBpbWFnZSBmb3IgZ3JhZGluZyB3aGVuIHJlYWRpbmcgdGhlIERhdGEgTWF0cml4LCBhbmQgeW91IGNhbm5vdCBjaGFuZ2UgdGhlIGNvbnRlbnRzIG9mIHRoZSBzb3VyY2UgaW1hZ2UgYmV0d2VlbiByZWFkaW5nIGFuZCBncmFkaW5nIHRoZSBEYXRhIE1hdHJpeC4KKyNkZWZpbmUgRVJSX09QRU5JTkdfTkVXRVJfTVVMVElQTEVfR0VPTUVUUklDX1RFTVBMQVRFICAgICAgICAgICAgICAgIC0xMDc0Mzk1NjUzIC8vIFRoZSBtdWx0aXBsZSBnZW9tZXRyaWMgbWF0Y2hpbmcgdGVtcGxhdGUgeW91IHRyaWVkIHRvIG9wZW4gd2FzIGNyZWF0ZWQgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgTkkgVmlzaW9uLiBVcGdyYWRlIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBOSSBWaXNpb24gdG8gcmVhZCB0aGlzIGZpbGUuCisjZGVmaW5lIEVSUl9PUEVOSU5HX05FV0VSX0dFT01FVFJJQ19NQVRDSElOR19URU1QTEFURSAgICAgICAgICAgICAgICAtMTA3NDM5NTY1MiAvLyBUaGUgZ2VvbWV0cmljIG1hdGNoaW5nIHRlbXBsYXRlIHlvdSB0cmllZCB0byBvcGVuIHdhcyBjcmVhdGVkIHdpdGggYSBuZXdlciB2ZXJzaW9uIG9mIE5JIFZpc2lvbi4gVXBncmFkZSB0byB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgTkkgVmlzaW9uIHRvIHJlYWQgdGhpcyBmaWxlLgorI2RlZmluZSBFUlJfRURHRV9GSUxURVJfU0laRV9NVVNUX0JFX1NBTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2NTEgLy8gWW91IG11c3Qgc3BlY2lmeSB0aGUgc2FtZSBlZGdlIGZpbHRlciBzaXplIGZvciBhbGwgdGhlIHRlbXBsYXRlcyB5b3Ugd2FudCB0byBtYXRjaC4KKyNkZWZpbmUgRVJSX0NVUlZFX0VYVFJBQ1RJT05fTU9ERV9NVVNUX0JFX1NBTUUgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NjUwIC8vIFlvdSBtdXN0IHNwZWNpZnkgdGhlIHNhbWUgY3VydmUgZXh0cmFjdGlvbiBtb2RlIGZvciBhbGwgdGhlIHRlbXBsYXRlcyB5b3Ugd2FudCB0byBtYXRjaC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfR0VPTUVUUklDX0ZFQVRVUkVfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NjQ5IC8vIFRoZSBnZW9tZXRyaWMgZmVhdHVyZSB0eXBlIHNwZWNpZmllZCBpcyBpbnZhbGlkLgorI2RlZmluZSBFUlJfVEVNUExBVEVfTk9UX0xFQVJORUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2NDggLy8gWW91IHN1cHBsaWVkIGEgdGVtcGxhdGUgdGhhdCB3YXMgbm90IGxlYXJuZWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX01VTFRJUExFX0dFT01FVFJJQ19URU1QTEFURSAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTY0NyAvLyBJbnZhbGlkIG11bHRpcGxlIGdlb21ldHJpYyB0ZW1wbGF0ZS4KKyNkZWZpbmUgRVJSX05PX1RFTVBMQVRFX1RPX0xFQVJOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NjQ2IC8vIE5lZWQgYXQgbGVhc3Qgb25lIHRlbXBsYXRlIHRvIGxlYXJuLgorI2RlZmluZSBFUlJfSU5WQUxJRF9OVU1CRVJfT0ZfTEFCRUxTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2NDUgLy8gWW91IHN1cHBsaWVkIGFuIGludmFsaWQgbnVtYmVyIG9mIGxhYmVscy4KKyNkZWZpbmUgRVJSX0xBQkVMX1RPT19MT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NjQ0IC8vIExhYmVscyBtdXN0IGJlIDw9IDI1NSBjaGFyYWN0ZXJzLgorI2RlZmluZSBFUlJfSU5WQUxJRF9OVU1CRVJfT0ZfTUFUQ0hfT1BUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2NDMgLy8gWW91IHN1cHBsaWVkIGFuIGludmFsaWQgbnVtYmVyIG9mIG1hdGNoIG9wdGlvbnMuCisjZGVmaW5lIEVSUl9MQUJFTF9OT1RfRk9VTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTY0MiAvLyBDYW5ub3QgZmluZCBhIGxhYmVsIHRoYXQgbWF0Y2hlcyB0aGUgb25lIHlvdSBzcGVjaWZpZWQuCisjZGVmaW5lIEVSUl9EVVBMSUNBVEVfTEFCRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTY0MSAvLyBEdXBsaWNhdGUgbGFiZWxzIGFyZSBub3QgYWxsb3dlZC4KKyNkZWZpbmUgRVJSX1RPT19NQU5ZX1pPTkVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NjQwIC8vIFRoZSBudW1iZXIgb2Ygem9uZXMgZm91bmQgZXhjZWVkZWQgdGhlIGNhcGFjaXR5IG9mIHRoZSBhbGdvcml0aG0uCisjZGVmaW5lIEVSUl9JTlZBTElEX0hBVENIX1NUWUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTYzOSAvLyBUaGUgaGF0Y2ggc3R5bGUgZm9yIHRoZSB3aW5kb3cgYmFja2dyb3VuZCBpcyBpbnZhbGlkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9GSUxMX1NUWUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2MzggLy8gVGhlIGZpbGwgc3R5bGUgZm9yIHRoZSB3aW5kb3cgYmFja2dyb3VuZCBpcyBpbnZhbGlkLgorI2RlZmluZSBFUlJfSEFSRFdBUkVfRE9FU05UX1NVUFBPUlRfTk9OVEVBUklORyAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2MzcgLy8gWW91ciBoYXJkd2FyZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IERpcmVjdFggYW5kIGNhbm5vdCBiZSBwdXQgaW50byBOb25UZWFyaW5nIG1vZGUuCisjZGVmaW5lIEVSUl9ESVJFQ1RYX05PVF9GT1VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTYzNiAvLyBEaXJlY3RYIGlzIHJlcXVpcmVkIGZvciB0aGlzIGZlYXR1cmUuICBQbGVhc2UgaW5zdGFsbCB0aGUgbGF0ZXN0IHZlcnNpb24uLgorI2RlZmluZSBFUlJfSU5WQUxJRF9TSEFQRV9ERVNDUklQVE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2MzUgLy8gVGhlIHBhc3NlZCBzaGFwZSBkZXNjcmlwdG9yIGlzIGludmFsaWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX01BWF9NQVRDSF9PVkVSTEFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTYzNCAvLyBJbnZhbGlkIG1heCBtYXRjaCBvdmVybGFwLiAgVmFsdWVzIG11c3QgYmUgYmV0d2VlbiAtMSBhbmQgMTAwLgorI2RlZmluZSBFUlJfSU5WQUxJRF9NSU5fTUFUQ0hfU0VQQVJBVElPTl9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2MzMgLy8gSW52YWxpZCBtaW5pbXVtIG1hdGNoIHNlcGFyYXRpb24gc2NhbGUuICBWYWx1ZXMgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gLTEuCisjZGVmaW5lIEVSUl9JTlZBTElEX01JTl9NQVRDSF9TRVBBUkFUSU9OX0FOR0xFICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTYzMiAvLyBJbnZhbGlkIG1pbmltdW0gbWF0Y2ggc2VwYXJhdGlvbiBhbmdsZS4gIFZhbHVlcyBtdXN0IGJlIGJldHdlZW4gLTEgYW5kIDM2MC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTUlOX01BVENIX1NFUEFSQVRJT05fRElTVEFOQ0UgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NjMxIC8vIEludmFsaWQgbWluaW11bSBtYXRjaCBzZXBhcmF0aW9uIGRpc3RhbmNlLiAgVmFsdWVzIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIC0xLgorI2RlZmluZSBFUlJfSU5WQUxJRF9NQVhJTVVNX0ZFQVRVUkVTX0xFQVJORUQgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2MzAgLy8gSW52YWxpZCBtYXhpbXVtIG51bWJlciBvZiBmZWF0dXJlcyBsZWFybi4gVmFsdWVzIG11c3QgYmUgaW50ZWdlcnMgZ3JlYXRlciB0aGFuIHplcm8uCisjZGVmaW5lIEVSUl9JTlZBTElEX01BWElNVU1fUElYRUxfRElTVEFOQ0VfRlJPTV9MSU5FICAgICAgICAgICAgICAgICAtMTA3NDM5NTYyOSAvLyBJbnZhbGlkIG1heGltdW0gcGl4ZWwgZGlzdGFuY2UgZnJvbSBsaW5lLiBWYWx1ZXMgbXVzdCBiZSBwb3NpdGl2ZSByZWFsIG51bWJlcnMuCisjZGVmaW5lIEVSUl9JTlZBTElEX0dFT01FVFJJQ19NQVRDSElOR19URU1QTEFURSAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTYyOCAvLyBJbnZhbGlkIGdlb21ldHJpYyBtYXRjaGluZyB0ZW1wbGF0ZSBpbWFnZS4KKyNkZWZpbmUgRVJSX05PVF9FTk9VR0hfVEVNUExBVEVfRkVBVFVSRVNfMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NjI3IC8vIFRoZSB0ZW1wbGF0ZSBkb2VzIG5vdCBjb250YWluIGVub3VnaCBmZWF0dXJlcyBmb3IgZ2VvbWV0cmljIG1hdGNoaW5nLgorI2RlZmluZSBFUlJfTk9UX0VOT1VHSF9URU1QTEFURV9GRUFUVVJFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2MjYgLy8gVGhlIHRlbXBsYXRlIGRvZXMgbm90IGNvbnRhaW4gZW5vdWdoIGZlYXR1cmVzIGZvciBnZW9tZXRyaWMgbWF0Y2hpbmcuCisjZGVmaW5lIEVSUl9JTlZBTElEX01BVENIX0NPTlNUUkFJTlRfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTYyNSAvLyBZb3Ugc3BlY2lmaWVkIGFuIGludmFsaWQgdmFsdWUgZm9yIHRoZSBtYXRjaCBjb25zdHJhaW50IHZhbHVlIG9mIHRoZSAgcmFuZ2Ugc2V0dGluZ3MuCisjZGVmaW5lIEVSUl9JTlZBTElEX09DQ0xVU0lPTl9SQU5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTYyNCAvLyBJbnZhbGlkIG9jY2x1c2lvbiByYW5nZS4gVmFsaWQgdmFsdWVzIGZvciB0aGUgYm91bmRzIHJhbmdlIGZyb20gMCB0byAxMDAgYW5kIHRoZSB1cHBlciBib3VuZCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgbG93ZXIgYm91bmQuCisjZGVmaW5lIEVSUl9JTlZBTElEX1NDQUxFX1JBTkdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTYyMyAvLyBJbnZhbGlkIHNjYWxlIHJhbmdlLiBWYWx1ZXMgZm9yIHRoZSBsb3dlciBib3VuZCBtdXN0IGJlIGEgcG9zaXRpdmUgcmVhbCBudW1iZXJzIGFuZCB0aGUgdXBwZXIgYm91bmQgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGxvd2VyIGJvdW5kLgorI2RlZmluZSBFUlJfSU5WQUxJRF9NQVRDSF9HRU9NRVRSSUNfUEFUVEVSTl9TRVRVUF9EQVRBICAgICAgICAgICAgICAgLTEwNzQzOTU2MjIgLy8gSW52YWxpZCBtYXRjaCBnZW9tZXRyaWMgcGF0dGVybiBzZXR1cCBkYXRhLgorI2RlZmluZSBFUlJfSU5WQUxJRF9MRUFSTl9HRU9NRVRSSUNfUEFUVEVSTl9TRVRVUF9EQVRBICAgICAgICAgICAgICAgLTEwNzQzOTU2MjEgLy8gSW52YWxpZCBsZWFybiBnZW9tZXRyaWMgcGF0dGVybiBzZXR1cCBkYXRhLgorI2RlZmluZSBFUlJfSU5WQUxJRF9DVVJWRV9FWFRSQUNUSU9OX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2MjAgLy8gSW52YWxpZCBjdXJ2ZSBleHRyYWN0aW9uIG1vZGUuCisjZGVmaW5lIEVSUl9UT09fTUFOWV9PQ0NMVVNJT05fUkFOR0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTYxOSAvLyBZb3UgY2FuIHNwZWNpZnkgb25seSBvbmUgb2NjbHVzaW9uIHJhbmdlLgorI2RlZmluZSBFUlJfVE9PX01BTllfU0NBTEVfUkFOR0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2MTggLy8gWW91IGNhbiBzcGVjaWZ5IG9ubHkgb25lIHNjYWxlIHJhbmdlLgorI2RlZmluZSBFUlJfSU5WQUxJRF9OVU1CRVJfT0ZfRkVBVFVSRVNfUkFOR0UgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2MTcgLy8gVGhlIG1pbmltdW0gbnVtYmVyIG9mIGZlYXR1cmVzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBtYXhpbXVtIG51bWJlciBvZiBmZWF0dXJlcy4KKyNkZWZpbmUgRVJSX0lOVkFMSURfRURHRV9GSUxURVJfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NjE2IC8vIEludmFsaWQgZWRnZSBmaWx0ZXIgc2l6ZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTUlOSU1VTV9GRUFUVVJFX1NUUkVOR1RIICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NjE1IC8vIEludmFsaWQgbWluaW11bSBzdHJlbmd0aCBmb3IgZmVhdHVyZXMuIFZhbHVlcyBtdXN0IGJlIHBvc2l0aXZlIHJlYWwgbnVtYmVycy4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTUlOSU1VTV9GRUFUVVJFX0FTUEVDVF9SQVRJTyAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NjE0IC8vIEludmFsaWQgYXNwZWN0IHJhdGlvIGZvciByZWN0YW5ndWxhciBmZWF0dXJlcy4gVmFsdWVzIG11c3QgYmUgcG9zaXRpdmUgcmVhbCBudW1iZXJzIGluIHRoZSByYW5nZSAwLjAxIHRvIDEuMC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTUlOSU1VTV9GRUFUVVJFX0xFTkdUSCAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NjEzIC8vIEludmFsaWQgbWluaW11bSBsZW5ndGggZm9yIGxpbmVhciBmZWF0dXJlcy4gVmFsdWVzIG11c3QgYmUgaW50ZWdlcnMgZ3JlYXRlciB0aGFuIDAuCisjZGVmaW5lIEVSUl9JTlZBTElEX01JTklNVU1fRkVBVFVSRV9SQURJVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTYxMiAvLyBJbnZhbGlkIG1pbmltdW0gcmFkaXVzIGZvciBjaXJjdWxhciBmZWF0dXJlcy4gVmFsdWVzIG11c3QgYmUgaW50ZWdlcnMgZ3JlYXRlciB0aGFuIDAuCisjZGVmaW5lIEVSUl9JTlZBTElEX01JTklNVU1fUkVDVEFOR0xFX0RJTUVOU0lPTiAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTYxMSAvLyBJbnZhbGlkIG1pbmltdW0gcmVjdGFuZ2xlIGRpbWVuc2lvbi4gVmFsdWVzIG11c3QgYmUgaW50ZWdlcnMgZ3JlYXRlciB0aGFuIDAuCisjZGVmaW5lIEVSUl9JTlZBTElEX0lOSVRJQUxfTUFUQ0hfTElTVF9MRU5HVEggICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTYxMCAvLyBJbnZhbGlkIGluaXRpYWwgbWF0Y2ggbGlzdCBsZW5ndGguIFZhbHVlcyBtdXN0IGJlIGludGVnZXJzIGdyZWF0ZXIgdGhhbiA1LgorI2RlZmluZSBFUlJfSU5WQUxJRF9TVUJQSVhFTF9UT0xFUkFOQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2MDkgLy8gSW52YWxpZCBzdWJwaXhlbCB0b2xlcmFuY2UuIFZhbHVlcyBtdXN0IGJlIHBvc2l0aXZlIHJlYWwgbnVtYmVycy4KKyNkZWZpbmUgRVJSX0lOVkFMSURfU1VCUElYRUxfSVRFUkFUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NjA4IC8vIEludmFsaWQgbnVtYmVyIG9mIHN1YnBpeGVsIGl0ZXJhdGlvbnMuIFZhbHVlcyBtdXN0IGJlIGludGVnZXJzIGdyZWF0ZXIgMTAuCisjZGVmaW5lIEVSUl9JTlZBTElEX01BWElNVU1fRkVBVFVSRVNfUEVSX01BVENIICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTYwNyAvLyBJbnZhbGlkIG1heGltdW0gbnVtYmVyIG9mIGZlYXR1cmVzIHVzZWQgcGVyIG1hdGNoLiBWYWx1ZXMgbXVzdCBiZSBpbnRlZ2VycyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gemVyby4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTUlOSU1VTV9GRUFUVVJFU19UT19NQVRDSCAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NjA2IC8vIEludmFsaWQgbWluaW11bSBudW1iZXIgb2YgZmVhdHVyZXMgdXNlZCBmb3IgbWF0Y2hpbmcuIFZhbHVlcyBtdXN0IGJlIGludGVnZXJzIGdyZWF0ZXIgdGhhbiB6ZXJvLgorI2RlZmluZSBFUlJfSU5WQUxJRF9NQVhJTVVNX0VORF9QT0lOVF9HQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2MDUgLy8gSW52YWxpZCBtYXhpbXVtIGVuZCBwb2ludCBnYXAuIFZhbGlkIHZhbHVlcyByYW5nZSBmcm9tIDAgdG8gMzI3NjcuCisjZGVmaW5lIEVSUl9JTlZBTElEX0NPTFVNTl9TVEVQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTYwNCAvLyBJbnZhbGlkIGNvbHVtbiBzdGVwLiBWYWxpZCByYW5nZSBpcyAxIHRvIDI1NS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfUk9XX1NURVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NjAzIC8vIEludmFsaWQgcm93IHN0ZXAuIFZhbGlkIHJhbmdlIGlzIDEgdG8gMjU1LgorI2RlZmluZSBFUlJfSU5WQUxJRF9NSU5JTVVNX0NVUlZFX0xFTkdUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2MDIgLy8gSW52YWxpZCBtaW5pbXVtIGxlbmd0aC4gVmFsaWQgdmFsdWVzIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHplcm8uCisjZGVmaW5lIEVSUl9JTlZBTElEX0VER0VfVEhSRVNIT0xEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTYwMSAvLyBJbnZhbGlkIGVkZ2UgdGhyZXNob2xkLiBWYWxpZCB2YWx1ZXMgcmFuZ2UgZnJvbSAxIHRvIDM2MC4KKyNkZWZpbmUgRVJSX0lORk9fTk9UX0ZPVU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NjAwIC8vIFlvdSBtdXN0IHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN1YmltYWdlIHdpdGhpbiB0aGUgYnJvd3Nlci4KKyNkZWZpbmUgRVJSX05JT0NSX0lOVkFMSURfQUNDRVBUQU5DRV9MRVZFTCAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NTk4IC8vIFRoZSBhY2NlcHRhbmNlIGxldmVsIGlzIG91dHNpZGUgdGhlIHZhbGlkIHJhbmdlIG9mICAwIHRvIDEwMDAuCisjZGVmaW5lIEVSUl9OSU9DUl9OT1RfQV9WQUxJRF9TRVNTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTU5NyAvLyBOb3QgYSB2YWxpZCBPQ1Igc2Vzc2lvbi4KKyNkZWZpbmUgRVJSX05JT0NSX0lOVkFMSURfQ0hBUkFDVEVSX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NTk2IC8vIEludmFsaWQgY2hhcmFjdGVyIHNpemUuIENoYXJhY3RlciBzaXplIG11c3QgYmUgPj0gMS4KKyNkZWZpbmUgRVJSX05JT0NSX0lOVkFMSURfVEhSRVNIT0xEX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NTk1IC8vIEludmFsaWQgdGhyZXNob2xkIG1vZGUgdmFsdWUuCisjZGVmaW5lIEVSUl9OSU9DUl9JTlZBTElEX1NVQlNUSVRVVElPTl9DSEFSQUNURVIgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTU5NCAvLyBJbnZhbGlkIHN1YnN0aXR1dGlvbiBjaGFyYWN0ZXIuIFZhbGlkIHN1YnN0aXR1dGlvbiBjaGFyYWN0ZXJzIGFyZSBBU0NJSSB2YWx1ZXMgdGhhdCByYW5nZSBmcm9tIDEgdG8gMjU0LgorI2RlZmluZSBFUlJfTklPQ1JfSU5WQUxJRF9OVU1CRVJfT0ZfQkxPQ0tTICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU1OTMgLy8gSW52YWxpZCBudW1iZXIgb2YgYmxvY2tzLiBOdW1iZXIgb2YgYmxvY2tzIG11c3QgYmUgPj0gNCBhbmQgPD0gNTAuCisjZGVmaW5lIEVSUl9OSU9DUl9JTlZBTElEX1JFQURfU1RSQVRFR1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTU5MiAvLyBJbnZhbGlkIHJlYWQgc3RyYXRlZ3kuCisjZGVmaW5lIEVSUl9OSU9DUl9JTlZBTElEX0NIQVJBQ1RFUl9JTkRFWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTU5MSAvLyBJbnZhbGlkIGNoYXJhY3RlciBpbmRleC4KKyNkZWZpbmUgRVJSX05JT0NSX0lOVkFMSURfTlVNQkVSX09GX1ZBTElEX0NIQVJBQ1RFUl9QT1NJVElPTlMgICAgICAgIC0xMDc0Mzk1NTkwIC8vIEludmFsaWQgbnVtYmVyIG9mIGNoYXJhY3RlciBwb3NpdGlvbnMuIFZhbGlkIHZhbHVlcyByYW5nZSBmcm9tIDAgdG8gMjU1LgorI2RlZmluZSBFUlJfTklPQ1JfSU5WQUxJRF9MT1dfVEhSRVNIT0xEX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU1ODkgLy8gSW52YWxpZCBsb3cgdGhyZXNob2xkIHZhbHVlLiBWYWxpZCB0aHJlc2hvbGQgdmFsdWVzIHJhbmdlIGZyb20gMCB0byAyNTUuCisjZGVmaW5lIEVSUl9OSU9DUl9JTlZBTElEX0hJR0hfVEhSRVNIT0xEX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTU4OCAvLyBJbnZhbGlkIGhpZ2ggdGhyZXNob2xkIHZhbHVlLiBWYWxpZCB0aHJlc2hvbGQgdmFsdWVzIHJhbmdlIGZyb20gMCB0byAyNTUuCisjZGVmaW5lIEVSUl9OSU9DUl9JTlZBTElEX1RIUkVTSE9MRF9SQU5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTU4NyAvLyBUaGUgbG93IHRocmVzaG9sZCBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgaGlnaCB0aHJlc2hvbGQuCisjZGVmaW5lIEVSUl9OSU9DUl9JTlZBTElEX0xPV0VSX1RIUkVTSE9MRF9MSU1JVCAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTU4NiAvLyBJbnZhbGlkIGxvd2VyIHRocmVzaG9sZCBsaW1pdC4gVmFsaWQgbG93ZXIgdGhyZXNob2xkIGxpbWl0cyByYW5nZSBmcm9tIDAgdG8gMjU1LgorI2RlZmluZSBFUlJfTklPQ1JfSU5WQUxJRF9VUFBFUl9USFJFU0hPTERfTElNSVQgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU1ODUgLy8gSW52YWxpZCB1cHBlciB0aHJlc2hvbGQgbGltaXQuIFZhbGlkIHVwcGVyIHRocmVzaG9sZCBsaW1pdHMgcmFuZ2UgZnJvbSAwIHRvIDI1NS4KKyNkZWZpbmUgRVJSX05JT0NSX0lOVkFMSURfVEhSRVNIT0xEX0xJTUlUUyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NTg0IC8vIFRoZSBsb3dlciB0aHJlc2hvbGQgbGltaXQgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIHVwcGVyIHRocmVzaG9sZCBsaW1pdC4KKyNkZWZpbmUgRVJSX05JT0NSX0lOVkFMSURfTUlOX0NIQVJfU1BBQ0lORyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NTgzIC8vIEludmFsaWQgbWluaW11bSBjaGFyYWN0ZXIgc3BhY2luZyB2YWx1ZS4gQ2hhcmFjdGVyIHNwYWNpbmcgbXVzdCBiZSA+PSAxIHBpeGVsLgorI2RlZmluZSBFUlJfTklPQ1JfSU5WQUxJRF9NQVhfSE9SSVpfRUxFTUVOVF9TUEFDSU5HICAgICAgICAgICAgICAgICAgLTEwNzQzOTU1ODIgLy8gSW52YWxpZCBtYXhpbXVtIGhvcml6b250YWwgZWxlbWVudCBzcGFjaW5nIHZhbHVlLiBNYXhpbXVtIGhvcml6b250YWwgZWxlbWVudCBzcGFjaW5nIG11c3QgYmUgPj0gMC4KKyNkZWZpbmUgRVJSX05JT0NSX0lOVkFMSURfTUFYX1ZFUlRfRUxFTUVOVF9TUEFDSU5HICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NTgxIC8vIEludmFsaWQgbWF4aW11bSB2ZXJ0aWNhbCBlbGVtZW50IHNwYWNpbmcgdmFsdWUuIE1heGltdW0gdmVydGljYWwgZWxlbWVudCBzcGFjaW5nIG11c3QgYmUgPj0gMC4KKyNkZWZpbmUgRVJSX05JT0NSX0lOVkFMSURfTUlOX0JPVU5ESU5HX1JFQ1RfV0lEVEggICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NTgwIC8vIEludmFsaWQgbWluaW11bSBib3VuZGluZyByZWN0YW5nbGUgd2lkdGguIE1pbmltdW0gYm91bmRpbmcgcmVjdGFuZ2xlIHdpZHRoIG11c3QgYmUgPj0gMS4KKyNkZWZpbmUgRVJSX05JT0NSX0lOVkFMSURfQVNQRUNUX1JBVElPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NTc5IC8vIEludmFsaWQgYXNwZWN0IHJhdGlvIHZhbHVlLiBUaGUgYXNwZWN0IHJhdGlvIG11c3QgYmUgemVybyBvciA+PSAxMDAuCisjZGVmaW5lIEVSUl9OSU9DUl9JTlZBTElEX0NIQVJBQ1RFUl9TRVRfRklMRSAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTU3OCAvLyBJbnZhbGlkIG9yIGNvcnJ1cHQgY2hhcmFjdGVyIHNldCBmaWxlLgorI2RlZmluZSBFUlJfTklPQ1JfQ0hBUkFDVEVSX1ZBTFVFX0NBTk5PVF9CRV9FTVBUWVNUUklORyAgICAgICAgICAgICAgLTEwNzQzOTU1NzcgLy8gVGhlIGNoYXJhY3RlciB2YWx1ZSBtdXN0IG5vdCBiZSBhbiBlbXB0eSBzdHJpbmcuCisjZGVmaW5lIEVSUl9OSU9DUl9DSEFSQUNURVJfVkFMVUVfVE9PX0xPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTU3NiAvLyBDaGFyYWN0ZXIgdmFsdWVzIG11c3QgYmUgPD0yNTUgY2hhcmFjdGVycy4KKyNkZWZpbmUgRVJSX05JT0NSX0lOVkFMSURfTlVNQkVSX09GX0VST1NJT05TICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NTc1IC8vIEludmFsaWQgbnVtYmVyIG9mIGVyb3Npb25zLiBUaGUgbnVtYmVyIG9mIGVyb3Npb25zIG11c3QgYmUgPj0gMC4KKyNkZWZpbmUgRVJSX05JT0NSX0NIQVJBQ1RFUl9TRVRfREVTQ1JJUFRJT05fVE9PX0xPTkcgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NTc0IC8vIFRoZSBjaGFyYWN0ZXIgc2V0IGRlc2NyaXB0aW9uIG11c3QgYmUgPD0yNTUgY2hhcmFjdGVycy4KKyNkZWZpbmUgRVJSX05JT0NSX0lOVkFMSURfQ0hBUkFDVEVSX1NFVF9GSUxFX1ZFUlNJT04gICAgICAgICAgICAgICAgIC0xMDc0Mzk1NTczIC8vIFRoZSBjaGFyYWN0ZXIgc2V0IGZpbGUgd2FzIGNyZWF0ZWQgYnkgYSBuZXdlciB2ZXJzaW9uIG9mIE5JIFZpc2lvbi4gVXBncmFkZSB0byB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgTkkgVmlzaW9uIHRvIHJlYWQgdGhlIGNoYXJhY3RlciBzZXQgZmlsZS4KKyNkZWZpbmUgRVJSX05JT0NSX0lOVEVHRVJfVkFMVUVfRk9SX1NUUklOR19BVFRSSUJVVEUgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NTcyIC8vIFlvdSBtdXN0IHNwZWNpZnkgY2hhcmFjdGVycyBmb3IgYSBzdHJpbmcuIEEgc3RyaW5nIGNhbm5vdCBjb250YWluIGludGVnZXJzLgorI2RlZmluZSBFUlJfTklPQ1JfR0VUX09OTFlfQVRUUklCVVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU1NzEgLy8gVGhpcyBhdHRyaWJ1dGUgaXMgcmVhZC1vbmx5LgorI2RlZmluZSBFUlJfTklPQ1JfSU5URUdFUl9WQUxVRV9GT1JfQk9PTEVBTl9BVFRSSUJVVEUgICAgICAgICAgICAgICAgLTEwNzQzOTU1NzAgLy8gVGhpcyBhdHRyaWJ1dGUgcmVxdWlyZXMgYSBCb29sZWFuIHZhbHVlLgorI2RlZmluZSBFUlJfTklPQ1JfSU5WQUxJRF9BVFRSSUJVVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU1NjkgLy8gSW52YWxpZCBhdHRyaWJ1dGUuCisjZGVmaW5lIEVSUl9OSU9DUl9TVFJJTkdfVkFMVUVfRk9SX0lOVEVHRVJfQVRUUklCVVRFICAgICAgICAgICAgICAgICAtMTA3NDM5NTU2OCAvLyBUaGlzIGF0dHJpYnV0ZSByZXF1aXJlcyBpbnRlZ2VyIHZhbHVlcy4KKyNkZWZpbmUgRVJSX05JT0NSX1NUUklOR19WQUxVRV9GT1JfQk9PTEVBTl9BVFRSSUJVVEUgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NTY3IC8vIFN0cmluZyB2YWx1ZXMgYXJlIGludmFsaWQgZm9yIHRoaXMgYXR0cmlidXRlLiBFbnRlciBhIGJvb2xlYW4gdmFsdWUuCisjZGVmaW5lIEVSUl9OSU9DUl9CT09MRUFOX1ZBTFVFX0ZPUl9JTlRFR0VSX0FUVFJJQlVURSAgICAgICAgICAgICAgICAtMTA3NDM5NTU2NiAvLyBCb29sZWFuIHZhbHVlcyBhcmUgbm90IHZhbGlkIGZvciB0aGlzIGF0dHJpYnV0ZS4gRW50ZXIgYW4gaW50ZWdlciB2YWx1ZS4KKyNkZWZpbmUgRVJSX05JT0NSX01VU1RfQkVfU0lOR0xFX0NIQVJBQ1RFUiAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NTY1IC8vIFJlcXVpcmVzIGEgc2luZ2xlLWNoYXJhY3RlciBzdHJpbmcuCisjZGVmaW5lIEVSUl9OSU9DUl9JTlZBTElEX1BSRURFRklORURfQ0hBUkFDVEVSICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTU2NCAvLyBJbnZhbGlkIHByZWRlZmluZWQgY2hhcmFjdGVyIHZhbHVlLgorI2RlZmluZSBFUlJfTklPQ1JfVU5MSUNFTlNFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU1NjMgLy8gVGhpcyBjb3B5IG9mIE5JIE9DUiBpcyB1bmxpY2Vuc2VkLgorI2RlZmluZSBFUlJfTklPQ1JfQk9PTEVBTl9WQUxVRV9GT1JfU1RSSU5HX0FUVFJJQlVURSAgICAgICAgICAgICAgICAgLTEwNzQzOTU1NjIgLy8gU3RyaW5nIHZhbHVlcyBhcmUgbm90IHZhbGlkIGZvciB0aGlzIGF0dHJpYnV0ZS4gRW50ZXIgYSBCb29sZWFuIHZhbHVlLgorI2RlZmluZSBFUlJfTklPQ1JfSU5WQUxJRF9OVU1CRVJfT0ZfQ0hBUkFDVEVSUyAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU1NjEgLy8gVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBjaGFyYWN0ZXIgdmFsdWUgbXVzdCBtYXRjaCB0aGUgbnVtYmVyIG9mIG9iamVjdHMgaW4gdGhlIGltYWdlLgorI2RlZmluZSBFUlJfTklPQ1JfSU5WQUxJRF9PQkpFQ1RfSU5ERVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU1NjAgLy8gSW52YWxpZCBvYmplY3QgaW5kZXguCisjZGVmaW5lIEVSUl9OSU9DUl9JTlZBTElEX1JFQURfT1BUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTU1OSAvLyBJbnZhbGlkIHJlYWQgb3B0aW9uLgorI2RlZmluZSBFUlJfTklPQ1JfSU5WQUxJRF9DSEFSQUNURVJfU0laRV9SQU5HRSAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU1NTggLy8gVGhlIG1pbmltdW0gY2hhcmFjdGVyIHNpemUgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIG1heGltdW0gY2hhcmFjdGVyIHNpemUuCisjZGVmaW5lIEVSUl9OSU9DUl9JTlZBTElEX0JPVU5ESU5HX1JFQ1RfV0lEVEhfUkFOR0UgICAgICAgICAgICAgICAgICAtMTA3NDM5NTU1NyAvLyBUaGUgbWluaW11bSBjaGFyYWN0ZXIgYm91bmRpbmcgcmVjdGFuZ2xlIHdpZHRoIG11c3QgYmUgbGVzcyB0aGFuIHRoZSBtYXhpbXVtIGNoYXJhY3RlciBib3VuZGluZyByZWN0YW5nbGUgd2lkdGguCisjZGVmaW5lIEVSUl9OSU9DUl9JTlZBTElEX0JPVU5ESU5HX1JFQ1RfSEVJR0hUX1JBTkdFICAgICAgICAgICAgICAgICAtMTA3NDM5NTU1NiAvLyBUaGUgbWluaW11bSBjaGFyYWN0ZXIgYm91bmRpbmcgcmVjdGFuZ2xlIGhlaWdodCBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgbWF4aW11bSBjaGFyYWN0ZXIgYm91bmRpbmcgcmVjdGFuZ2xlIGhlaWdodC4KKyNkZWZpbmUgRVJSX05JT0NSX0lOVkFMSURfU1BBQ0lOR19SQU5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NTU1IC8vIFRoZSBtYXhpbXVtIGhvcml6b250YWwgZWxlbWVudCBzcGFjaW5nIHZhbHVlIG11c3Qgbm90IGV4Y2VlZCB0aGUgbWluaW11bSBjaGFyYWN0ZXIgc3BhY2luZyB2YWx1ZS4KKyNkZWZpbmUgRVJSX05JT0NSX0lOVkFMSURfUkVBRF9SRVNPTFVUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NTU0IC8vIEludmFsaWQgcmVhZCByZXNvbHV0aW9uLgorI2RlZmluZSBFUlJfTklPQ1JfSU5WQUxJRF9NSU5fQk9VTkRJTkdfUkVDVF9IRUlHSFQgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU1NTMgLy8gSW52YWxpZCBtaW5pbXVtIGJvdW5kaW5nIHJlY3RhbmdsZSBoZWlnaHQuIFRoZSBtaW5pbXVtIGJvdW5kaW5nIHJlY3RhbmdsZSBoZWlnaHQgbXVzdCBiZSA+PSAxLgorI2RlZmluZSBFUlJfTklPQ1JfTk9UX0FfVkFMSURfQ0hBUkFDVEVSX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU1NTIgLy8gTm90IGEgdmFsaWQgY2hhcmFjdGVyIHNldC4KKyNkZWZpbmUgRVJSX05JT0NSX1JFTkFNRV9SRUZDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NTUxIC8vIEEgdHJhaW5lZCBPQ1IgY2hhcmFjdGVyIGNhbm5vdCBiZSByZW5hbWVkIHdoaWxlIGl0IGlzIGEgcmVmZXJlbmNlIGNoYXJhY3Rlci4KKyNkZWZpbmUgRVJSX05JT0NSX0lOVkFMSURfQ0hBUkFDVEVSX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NTUwIC8vIEEgY2hhcmFjdGVyIGNhbm5vdCBoYXZlIGFuIEFTQ0lJIHZhbHVlIG9mIDI1NS4KKyNkZWZpbmUgRVJSX05JT0NSX0lOVkFMSURfTlVNQkVSX09GX09CSkVDVFNfVE9fVkVSSUZZICAgICAgICAgICAgICAgIC0xMDc0Mzk1NTQ5IC8vIFRoZSBudW1iZXIgb2Ygb2JqZWN0cyBmb3VuZCBkb2VzIG5vdCBtYXRjaCB0aGUgbnVtYmVyIG9mIGV4cGVjdGVkIGNoYXJhY3RlcnMgb3IgcGF0dGVybnMgdG8gdmVyaWZ5LgorI2RlZmluZSBFUlJfSU5WQUxJRF9TVEVSRU9fQkxPQ0tNQVRDSElOR19QUkVGSUxURVJfQ0FQICAgICAgICAgICAgICAgLTEwNzQzOTU0MjEgLy8gVGhlIHNwZWNpZmllZCB2YWx1ZSBmb3IgdGhlIGZpbHRlciBjYXAgZm9yIGJsb2NrIG1hdGNoaW5nIGlzIGludmFsaWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX1NURVJFT19CTE9DS01BVENISU5HX1BSRUZJTFRFUl9TSVpFICAgICAgICAgICAgICAtMTA3NDM5NTQyMCAvLyBUaGUgc3BlY2lmaWVkIHByZWZpbHRlciBzaXplIGZvciBibG9jayBtYXRjaGluZyBpcyBpbnZhbGlkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9TVEVSRU9fQkxPQ0tNQVRDSElOR19QUkVGSUxURVJfVFlQRSAgICAgICAgICAgICAgLTEwNzQzOTU0MTkgLy8gVGhlIHNwZWNpZmllZCBwcmVmaWx0ZXIgdHlwZSBmb3IgYmxvY2sgbWF0Y2hpbmcgaXMgaW52YWxpZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfU1RFUkVPX0JMT0NLTUFUQ0hJTkdfTlVNRElTUEFSSVRJRVMgICAgICAgICAgICAgIC0xMDc0Mzk1NDE4IC8vIFRoZSBzcGVjaWZlZCB2YWx1ZSBmb3IgbnVtYmVyIG9mIGRpc3Bhcml0aWVzIGlzIGludmFsaWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX1NURVJFT19CTE9DS01BVENISU5HX1dJTkRPV19TSVpFICAgICAgICAgICAgICAgICAtMTA3NDM5NTQxNyAvLyBUaGUgc3BlY2lmaWVkIHdpbmRvdyBzaXplIGZvciBibG9jayBtYXRjaGluZyBpcyBpbnZhbGlkLgorI2RlZmluZSBFUlJfM0RWSVNJT05fSU5WQUxJRF9TRVNTSU9OX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU0MTYgLy8gVGhpcyAzRCB2aXNpb24gZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBvbiB0aGlzIHR5cGUgb2YgM2QgdmlzaW9uIHNlc3Npb24uCisjZGVmaW5lIEVSUl9UT09fTUFOWV8zRFZJU0lPTl9TRVNTSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTQxNSAvLyBUaGVyZSBhcmUgdG9vIG1hbnkgM0QgdmlzaW9uIHNlc3Npb25zIG9wZW4uICBZb3UgbXVzdCBjbG9zZSBhIHNlc3Npb24gYmVmb3JlIHlvdSBjYW4gb3BlbiBhbm90aGVyIG9uZS4KKyNkZWZpbmUgRVJSX09QRU5JTkdfTkVXRVJfM0RWSVNJT05fU0VTU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NDE0IC8vIFRoZSAzRCB2aXNpb24gc2Vzc2lvbiB5b3UgdHJpZWQgdG8gb3BlbiB3YXMgY3JlYXRlZCB3aXRoIGEgbmV3ZXIgdmVyc2lvbiBvZiBOSSBWaXNpb24uIFVwZ3JhZGUgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIE5JIFZpc2lvbiB0byByZWFkIHRoaXMgZmlsZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfU1RFUkVPX0JMT0NLTUFUQ0hJTkdfRklMVEVSVFlQRSAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NDEzIC8vIFlvdSBoYXZlIHNwZWNpZmllZCBhbiBpbnZhbGlkIGZpbHRlciB0eXBlIGZvciBibG9jayBtYXRjaGluZy4KKyNkZWZpbmUgRVJSX0lOVkFMSURfU1RFUkVPX0NBTUVSQV9QT1NJVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NDEyIC8vIFlvdSBoYXZlIHJlcXVlc3RlZCByZXN1bHRzIGF0IGFuIGludmFsaWQgY2FtZXJhIHBvc2l0aW9uIGluIHRoZSBzdGVyZW8gc2V0dXAuCisjZGVmaW5lIEVSUl9JTlZBTElEXzNEVklTSU9OX1NFU1NJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTQxMSAvLyBOb3QgYSB2YWxpZCAzRCBWaXNpb24gc2Vzc2lvbi4KKyNkZWZpbmUgRVJSX0lOVkFMSURfSUNPTlNfUEVSX0xJTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NDEwIC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IGxlc3MgdGhhbiBvbmUgaWNvbiBwZXIgbGluZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfU1VCUElYRUxfRElWSVNJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NDA5IC8vIEludmFsaWQgc3VicGl4ZWwgZGl2aXNpb25zLgorI2RlZmluZSBFUlJfSU5WQUxJRF9ERVRFQ1RJT05fTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU0MDggLy8gSW52YWxpZCBkZXRlY3Rpb24gbW9kZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfQ09OVFJBU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NDA3IC8vIEludmFsaWQgY29udHJhc3QgdmFsdWUuIFZhbGlkIGNvbnRyYXN0IHZhbHVlcyByYW5nZSBmcm9tIDAgdG8gMjU1LgorI2RlZmluZSBFUlJfQ09PUkRTWVNfTk9UX0ZPVU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU0MDYgLy8gVGhlIGNvb3JkaW5hdGUgc3lzdGVtIGNvdWxkIG5vdCBiZSBmb3VuZCBvbiB0aGlzIGltYWdlLgorI2RlZmluZSBFUlJfSU5WQUxJRF9URVhUT1JJRU5UQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU0MDUgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIHRleHQgb3JpZW50YXRpb24gdmFsdWUgeW91IHN1cHBsaWVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9JTlRFUlBPTEFUSU9OTUVUSE9EX0ZPUl9VTldSQVAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU0MDQgLy8gVW53cmFwSW1hZ2UgZG9lcyBub3Qgc3VwcG9ydCB0aGUgaW50ZXJwb2xhdGlvbiBtZXRob2QgdmFsdWUgeW91IHN1cHBsaWVkLiAgVmFsaWQgaW50ZXJwb2xhdGlvbiBtZXRob2RzIGFyZSB6ZXJvIG9yZGVyIGFuZCBiaWxpbmVhci4gCisjZGVmaW5lIEVSUl9FWFRSQUlORk9fVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTQwMyAvLyBUaGUgaW1hZ2Ugd2FzIGNyZWF0ZWQgaW4gYSBuZXdlciB2ZXJzaW9uIG9mIE5JIFZpc2lvbi4gVXBncmFkZSB0byB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgTkkgVmlzaW9uIHRvIHVzZSB0aGlzIGltYWdlLgorI2RlZmluZSBFUlJfSU5WQUxJRF9NQVhQT0lOVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU0MDIgLy8gVGhlIGZ1bmN0aW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHBvaW50cyB0aGF0IHlvdSBzcGVjaWZpZWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX01BVENIRkFDVE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTQwMSAvLyBUaGUgZnVuY3Rpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgbWF0Y2hGYWN0b3IgdGhhdCB5b3Ugc3BlY2lmaWVkLgorI2RlZmluZSBFUlJfTVVMVElDT1JFX09QRVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU0MDAgLy8gVGhlIG9wZXJhdGlvbiB5b3UgaGF2ZSBnaXZlbiBNdWx0aWNvcmUgT3B0aW9ucyBpcyBpbnZhbGlkLiBQbGVhc2Ugc2VlIHRoZSBhdmFpbGFibGUgZW51bWVyYXRpb24gdmFsdWVzIGZvciBNdWx0aWNvcmUgT3BlcmF0aW9uLgorI2RlZmluZSBFUlJfTVVMVElDT1JFX0lOVkFMSURfQVJHVU1FTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzOTkgLy8gWW91IGhhdmUgZ2l2ZW4gTXVsdGljb3JlIE9wdGlvbnMgYW4gaW52YWxpZCBhcmd1bWVudC4KKyNkZWZpbmUgRVJSX0NPTVBMRVhfSU1BR0VfUkVRVUlSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1Mzk3IC8vIEEgY29tcGxleCBpbWFnZSBpcyByZXF1aXJlZC4KKyNkZWZpbmUgRVJSX0NPTE9SX0lNQUdFX1JFUVVJUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1Mzk1IC8vIFRoZSBpbnB1dCBpbWFnZSBtdXN0IGJlIGEgY29sb3IgaW1hZ2UuCisjZGVmaW5lIEVSUl9DT0xPUl9TUEVDVFJVTV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTM5NCAvLyBUaGUgY29sb3IgbWFzayByZW1vdmVzIHRvbyBtdWNoIGNvbG9yIGluZm9ybWF0aW9uLgorI2RlZmluZSBFUlJfQ09MT1JfVEVNUExBVEVfSU1BR0VfVE9PX1NNQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzOTMgLy8gVGhlIGNvbG9yIHRlbXBsYXRlIGltYWdlIGlzIHRvbyBzbWFsbC4KKyNkZWZpbmUgRVJSX0NPTE9SX1RFTVBMQVRFX0lNQUdFX1RPT19MQVJHRSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzkyIC8vIFRoZSBjb2xvciB0ZW1wbGF0ZSBpbWFnZSBpcyB0b28gbGFyZ2UuCisjZGVmaW5lIEVSUl9DT0xPUl9URU1QTEFURV9JTUFHRV9IVUVfQ09OVFJBU1RfVE9PX0xPVyAgICAgICAgICAgICAgICAtMTA3NDM5NTM5MSAvLyBUaGUgY29udHJhc3QgaW4gdGhlIGh1ZSBwbGFuZSBvZiB0aGUgaW1hZ2UgaXMgdG9vIGxvdyBmb3IgbGVhcm5pbmcgc2hhcGUgZmVhdHVyZXMuCisjZGVmaW5lIEVSUl9DT0xPUl9URU1QTEFURV9JTUFHRV9MVU1JTkFOQ0VfQ09OVFJBU1RfVE9PX0xPVyAgICAgICAgICAtMTA3NDM5NTM5MCAvLyBUaGUgY29udHJhc3QgaW4gdGhlIGx1bWluYW5jZSBwbGFuZSBvZiB0aGUgaW1hZ2UgaXMgdG9vIGxvdyB0byBsZWFybiBzaGFwZSBmZWF0dXJlcy4KKyNkZWZpbmUgRVJSX0NPTE9SX0xFQVJOX1NFVFVQX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1Mzg5IC8vIEludmFsaWQgY29sb3IgbGVhcm4gc2V0dXAgZGF0YS4KKyNkZWZpbmUgRVJSX0NPTE9SX0xFQVJOX1NFVFVQX0RBVEFfU0hBUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1Mzg4IC8vIEludmFsaWQgY29sb3IgbGVhcm4gc2V0dXAgZGF0YS4KKyNkZWZpbmUgRVJSX0NPTE9SX01BVENIX1NFVFVQX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1Mzg3IC8vIEludmFsaWQgY29sb3IgbWF0Y2ggc2V0dXAgZGF0YS4KKyNkZWZpbmUgRVJSX0NPTE9SX01BVENIX1NFVFVQX0RBVEFfU0hBUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1Mzg2IC8vIEludmFsaWQgY29sb3IgbWF0Y2ggc2V0dXAgZGF0YS4KKyNkZWZpbmUgRVJSX0NPTE9SX1JPVEFUSU9OX1JFUVVJUkVTX1NIQVBFX0ZFQVRVUkUgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1Mzg1IC8vIFJvdGF0aW9uLWludmFyaWFudCBjb2xvciBwYXR0ZXJuIG1hdGNoaW5nIHJlcXVpcmVzIGEgZmVhdHVyZSBtb2RlIGluY2x1ZGluZyBzaGFwZS4KKyNkZWZpbmUgRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1Mzg0IC8vIEludmFsaWQgY29sb3IgdGVtcGxhdGUgaW1hZ2UuCisjZGVmaW5lIEVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTM4MyAvLyBJbnZhbGlkIGNvbG9yIHRlbXBsYXRlIGltYWdlLgorI2RlZmluZSBFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzODIgLy8gSW52YWxpZCBjb2xvciB0ZW1wbGF0ZSBpbWFnZS4KKyNkZWZpbmUgRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1JfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzgxIC8vIEludmFsaWQgY29sb3IgdGVtcGxhdGUgaW1hZ2UuCisjZGVmaW5lIEVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTM4MCAvLyBJbnZhbGlkIGNvbG9yIHRlbXBsYXRlIGltYWdlLgorI2RlZmluZSBFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl81ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzNzkgLy8gSW52YWxpZCBjb2xvciB0ZW1wbGF0ZSBpbWFnZS4KKyNkZWZpbmUgRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1JfNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1Mzc4IC8vIEludmFsaWQgY29sb3IgdGVtcGxhdGUgaW1hZ2UuCisjZGVmaW5lIEVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTM3NyAvLyBJbnZhbGlkIGNvbG9yIHRlbXBsYXRlIGltYWdlLgorI2RlZmluZSBFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl9OT1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzNzYgLy8gVGhlIGNvbG9yIHRlbXBsYXRlIGltYWdlIGRvZXMgbm90IGNvbnRhaW4gZGF0YSByZXF1aXJlZCBmb3Igc2hpZnQtaW52YXJpYW50IGNvbG9yIG1hdGNoaW5nLgorI2RlZmluZSBFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl9TSElGVF8xICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzNzUgLy8gSW52YWxpZCBjb2xvciB0ZW1wbGF0ZSBpbWFnZS4KKyNkZWZpbmUgRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1JfU0hJRlRfMiAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1Mzc0IC8vIEludmFsaWQgY29sb3IgdGVtcGxhdGUgaW1hZ2UuCisjZGVmaW5lIEVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SX1JPVEFUSU9OICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTM3MyAvLyBJbnZhbGlkIGNvbG9yIHRlbXBsYXRlIGltYWdlLgorI2RlZmluZSBFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl9OT1JPVEFUSU9OICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzNzIgLy8gVGhlIGNvbG9yIHRlbXBsYXRlIGltYWdlIGRvZXMgbm90IGNvbnRhaW4gZGF0YSByZXF1aXJlZCBmb3Igcm90YXRpb24taW52YXJpYW50IGNvbG9yIG1hdGNoaW5nLgorI2RlZmluZSBFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl9ST1RBVElPTl8xICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzNzEgLy8gSW52YWxpZCBjb2xvciB0ZW1wbGF0ZSBpbWFnZS4KKyNkZWZpbmUgRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1JfUk9UQVRJT05fMiAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzcwIC8vIEludmFsaWQgY29sb3IgdGVtcGxhdGUgaW1hZ2UuCisjZGVmaW5lIEVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SX1JPVEFUSU9OXzMgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTM2OSAvLyBJbnZhbGlkIGNvbG9yIHRlbXBsYXRlIGltYWdlLgorI2RlZmluZSBFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl9ST1RBVElPTl80ICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzNjggLy8gSW52YWxpZCBjb2xvciB0ZW1wbGF0ZSBpbWFnZS4KKyNkZWZpbmUgRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1JfUk9UQVRJT05fNSAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzY3IC8vIEludmFsaWQgY29sb3IgdGVtcGxhdGUgaW1hZ2UuCisjZGVmaW5lIEVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SX05PU0hBUEUgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTM2NiAvLyBUaGUgY29sb3IgdGVtcGxhdGUgaW1hZ2UgZG9lcyBub3QgY29udGFpbiBkYXRhIHJlcXVpcmVkIGZvciBjb2xvciBtYXRjaGluZyBpbiBzaGFwZSBmZWF0dXJlIG1vZGUuCisjZGVmaW5lIEVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SX05PU1BFQ1RSVU0gICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTM2NSAvLyBUaGUgY29sb3IgdGVtcGxhdGUgaW1hZ2UgZG9lcyBub3QgY29udGFpbiBkYXRhIHJlcXVpcmVkIGZvciBjb2xvciBtYXRjaGluZyBpbiBjb2xvciBmZWF0dXJlIG1vZGUuCisjZGVmaW5lIEVSUl9JR05PUkVfQ09MT1JfU1BFQ1RSVU1fU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTM2NCAvLyBUaGUgaWdub3JlIGNvbG9yIHNwZWN0cmEgYXJyYXkgaXMgaW52YWxpZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfU1VCU0FNUExJTkdfUkFUSU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzYzIC8vIEludmFsaWQgc3Vic2FtcGxpbmcgcmF0aW8uCisjZGVmaW5lIEVSUl9JTlZBTElEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTM2MiAvLyBJbnZhbGlkIHBpeGVsIHdpZHRoLgorI2RlZmluZSBFUlJfSU5WQUxJRF9TVEVFUE5FU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzNjEgLy8gSW52YWxpZCBzdGVlcG5lc3MuCisjZGVmaW5lIEVSUl9DT01QTEVYX1BMQU5FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTM2MCAvLyBJbnZhbGlkIGNvbXBsZXggcGxhbmUuCisjZGVmaW5lIEVSUl9JTlZBTElEX0NPTE9SX0lHTk9SRV9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTM1NyAvLyBJbnZhbGlkIGNvbG9yIGlnbm9yZSBtb2RlLgorI2RlZmluZSBFUlJfSU5WQUxJRF9NSU5fTUFUQ0hfU0NPUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzNTYgLy8gSW52YWxpZCBtaW5pbXVtIG1hdGNoIHNjb3JlLiBBY2NlcHRhYmxlIHZhbHVlcyByYW5nZSBmcm9tIDAgdG8gMTAwMC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTlVNX01BVENIRVNfUkVRVUVTVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzU1IC8vIEludmFsaWQgbnVtYmVyIG9mIG1hdGNoZXMgcmVxdWVzdGVkLiBZb3UgbXVzdCByZXF1ZXN0IGEgbWluaW11bSBvZiBvbmUgbWF0Y2guCisjZGVmaW5lIEVSUl9JTlZBTElEX0NPTE9SX1dFSUdIVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTM1NCAvLyBJbnZhbGlkIGNvbG9yIHdlaWdodC4gQWNjZXB0YWJsZSB2YWx1ZXMgcmFuZ2UgZnJvbSAwIHRvIDEwMDAuCisjZGVmaW5lIEVSUl9JTlZBTElEX1NFQVJDSF9TVFJBVEVHWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTM1MyAvLyBJbnZhbGlkIHNlYXJjaCBzdHJhdGVneS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfRkVBVFVSRV9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzUyIC8vIEludmFsaWQgZmVhdHVyZSBtb2RlLgorI2RlZmluZSBFUlJfSU5WQUxJRF9SRUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzNTEgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgcmVjdGFuZ2xlcyB3aXRoIG5lZ2F0aXZlIHdpZHRocyBvciBuZWdhdGl2ZSBoZWlnaHRzLgorI2RlZmluZSBFUlJfSU5WQUxJRF9WSVNJT05fSU5GTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzNTAgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIHZpc2lvbiBpbmZvcm1hdGlvbiB0eXBlIHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfU0tFTEVUT05NRVRIT0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzQ5IC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBTa2VsZXRvbk1ldGhvZCB2YWx1ZSB5b3Ugc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9JTlZBTElEXzNEUExBTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTM0OCAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgM0RQbGFuZSB2YWx1ZSB5b3Ugc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9JTlZBTElEXzNERElSRUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTM0NyAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgM0REaXJlY3Rpb24gdmFsdWUgeW91IHN1cHBsaWVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9JTlRFUlBPTEFUSU9OTUVUSE9EX0ZPUl9ST1RBVEUgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzNDYgLy8gaW1hcVJvdGF0ZSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBJbnRlcnBvbGF0aW9uTWV0aG9kIHZhbHVlIHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfRkxJUEFYSVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzQ1IC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBheGlzIG9mIHN5bW1ldHJ5IHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX0ZJTEVfRklMRU5BTUVfTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzQzIC8vIFlvdSBtdXN0IHBhc3MgYSB2YWxpZCBmaWxlIG5hbWUuIERvIG5vdCBwYXNzIGluIE5VTEwuCisjZGVmaW5lIEVSUl9JTlZBTElEX1NJWkVUWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTM0MCAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgU2l6ZVR5cGUgdmFsdWUgeW91IHN1cHBsaWVkLgorI2RlZmluZSBFUlJfVU5LTk9XTl9BTEdPUklUSE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzMzYgLy8gWW91IHNwZWNpZmllZCB0aGUgZGlzcGF0Y2ggc3RhdHVzIG9mIGFuIHVua25vd24gYWxnb3JpdGhtLgorI2RlZmluZSBFUlJfRElTUEFUQ0hfU1RBVFVTX0NPTkZMSUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzMzUgLy8gWW91IGFyZSBhdHRlbXB0aW5nIHRvIHNldCB0aGUgc2FtZSBhbGdvcml0aG0gdG8gZGlzcGF0Y2ggYW5kIHRvIG5vdCBkaXNwYXRjaC4gUmVtb3ZlIG9uZSBvZiB0aGUgY29uZmxpY3Rpbmcgc2V0dGluZ3MuCisjZGVmaW5lIEVSUl9JTlZBTElEX0NPTlZFUlNJT05TVFlMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTMzNCAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgQ29udmVyc2lvbiBNZXRob2QgdmFsdWUgeW91IHN1cHBsaWVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9WRVJUSUNBTF9URVhUX0FMSUdOTUVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzMzMgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIFZlcnRpY2FsVGV4dEFsaWdubWVudCB2YWx1ZSB5b3Ugc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX0NPTVBBUkVGVU5DVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTMzMiAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgQ29tcGFyZUZ1bmN0aW9uIHZhbHVlIHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfQk9SREVSTUVUSE9EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzMxIC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBCb3JkZXJNZXRob2QgdmFsdWUgeW91IHN1cHBsaWVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9CT1JERVJfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzMzAgLy8gSW52YWxpZCBib3JkZXIgc2l6ZS4gQWNjZXB0YWJsZSB2YWx1ZXMgcmFuZ2UgZnJvbSAwIHRvIDUwLgorI2RlZmluZSBFUlJfSU5WQUxJRF9PVVRMSU5FTUVUSE9EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzMjkgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIE91dGxpbmVNZXRob2QgdmFsdWUgeW91IHN1cHBsaWVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9JTlRFUlBPTEFUSU9OTUVUSE9EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzMjggLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIEludGVycG9sYXRpb25NZXRob2QgdmFsdWUgeW91IHN1cHBsaWVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9TQ0FMSU5HTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzMjcgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIFNjYWxpbmdNb2RlIHZhbHVlIHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfRFJBV01PREVfRk9SX0xJTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzI2IC8vIGltYXFEcmF3TGluZU9uSW1hZ2UgZG9lcyBub3Qgc3VwcG9ydCB0aGUgRHJhd01vZGUgdmFsdWUgeW91IHN1cHBsaWVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9EUkFXTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzMjUgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIERyYXdNb2RlIHZhbHVlIHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfU0hBUEVNT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzI0IC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBTaGFwZU1vZGUgdmFsdWUgeW91IHN1cHBsaWVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9GT05UQ09MT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzMjMgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIEZvbnRDb2xvciB2YWx1ZSB5b3Ugc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX1RFWFRBTElHTk1FTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTMyMiAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgVGV4dEFsaWdubWVudCB2YWx1ZSB5b3Ugc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX01PUlBIT0xPR1lNRVRIT0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTMyMSAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgTW9ycGhvbG9neU1ldGhvZCB2YWx1ZSB5b3Ugc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9URU1QTEFURV9FTVBUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTMyMCAvLyBUaGUgdGVtcGxhdGUgaW1hZ2UgaXMgZW1wdHkuCisjZGVmaW5lIEVSUl9JTlZBTElEX1NVQlBJWF9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTMxOSAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgaW50ZXJwb2xhdGlvbiB0eXBlIHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX0lOU0ZfUE9JTlRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzE4IC8vIFlvdSBzdXBwbGllZCBhbiBpbnN1ZmZpY2llbnQgbnVtYmVyIG9mIHBvaW50cyB0byBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uLgorI2RlZmluZSBFUlJfVU5ERUZfUE9JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzMTcgLy8gWW91IHNwZWNpZmllZCBhIHBvaW50IHRoYXQgbGllcyBvdXRzaWRlIHRoZSBpbWFnZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfS0VSTkVMX0NPREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzE2IC8vIEludmFsaWQga2VybmVsIGNvZGUuCisjZGVmaW5lIEVSUl9JTkVGRklDSUVOVF9QT0lOVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTMxNSAvLyBZb3Ugc3VwcGxpZWQgYW4gaW5lZmZpY2llbnQgc2V0IG9mIHBvaW50cyB0byBtYXRjaCB0aGUgbWluaW11bSBzY29yZS4KKyNkZWZpbmUgRVJSX1dSSVRFX0ZJTEVfTk9UX1NVUFBPUlRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzEzIC8vIFdyaXRpbmcgZmlsZXMgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGRldmljZS4KKyNkZWZpbmUgRVJSX0xDRF9DQUxJQlJBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzEyIC8vIFRoZSBpbnB1dCBpbWFnZSBkb2VzIG5vdCBzZWVtIHRvIGJlIGEgdmFsaWQgTENEIG9yIExFRCBjYWxpYnJhdGlvbiBpbWFnZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfQ09MT1JfU1BFQ1RSVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzExIC8vIFRoZSBjb2xvciBzcGVjdHJ1bSBhcnJheSB5b3UgcHJvdmlkZWQgaGFzIGFuIGludmFsaWQgbnVtYmVyIG9mIGVsZW1lbnRzIG9yIGNvbnRhaW5zIGFuIGVsZW1lbnQgc2V0IHRvIG5vdC1hLW51bWJlciAoTmFOKS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfUEFMRVRURV9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzEwIC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBQYWxldHRlVHlwZSB2YWx1ZSB5b3Ugc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX1dJTkRPV19USFJFQURfUE9MSUNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTMwOSAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgV2luZG93VGhyZWFkUG9saWN5IHZhbHVlIHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfQ09MT1JTRU5TSVRJVklUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzA4IC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBDb2xvclNlbnNpdGl2aXR5IHZhbHVlIHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX1BSRUNJU0lPTl9OT1RfR1RSX1RIQU5fMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzA3IC8vIFRoZSBwcmVjaXNpb24gcGFyYW1ldGVyIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAuCisjZGVmaW5lIEVSUl9JTlZBTElEX1RPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTMwNiAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgVG9vbCB2YWx1ZSB5b3Ugc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX1JFRkVSRU5DRU1PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTMwNSAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgUmVmZXJlbmNlTW9kZSB2YWx1ZSB5b3Ugc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX01BVEhUUkFOU0ZPUk1NRVRIT0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTMwNCAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgTWF0aFRyYW5zZm9ybU1ldGhvZCB2YWx1ZSB5b3Ugc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX05VTV9PRl9DTEFTU0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTMwMyAvLyBJbnZhbGlkIG51bWJlciBvZiBjbGFzc2VzIGZvciBhdXRvIHRocmVzaG9sZC4gQWNjZXB0YWJsZSB2YWx1ZXMgcmFuZ2UgZnJvbSAyIHRvIDI1Ni4KKyNkZWZpbmUgRVJSX0lOVkFMSURfVEhSRVNIT0xETUVUSE9EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzAyIC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSB0aHJlc2hvbGQgbWV0aG9kIHZhbHVlIHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX1JPSV9OT1RfMl9MSU5FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzAxIC8vIFRoZSBST0kgeW91IHBhc3NlZCBpbnRvIGltYXFHZXRNZXRlckFyYyBtdXN0IGNvbnNpc3Qgb2YgdHdvIGxpbmVzLgorI2RlZmluZSBFUlJfSU5WQUxJRF9NRVRFUkFSQ01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzMDAgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIE1ldGVyQXJjTW9kZSB2YWx1ZSB5b3Ugc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX0NPTVBMRVhQTEFORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTI5OSAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgQ29tcGxleFBsYW5lIHZhbHVlIHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX0NPTVBMRVhQTEFORV9OT1RfUkVBTF9PUl9JTUFHSU5BUlkgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1Mjk4IC8vIFlvdSBjYW4gcGVyZm9ybSB0aGlzIG9wZXJhdGlvbiBvbiBhIHJlYWwgb3IgYW4gaW1hZ2luYXJ5IENvbXBsZXhQbGFuZSBvbmx5LgorI2RlZmluZSBFUlJfSU5WQUxJRF9QQVJUSUNMRUlORk9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyOTcgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIFBhcnRpY2xlSW5mb01vZGUgdmFsdWUgeW91IHN1cHBsaWVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9CQVJDT0RFVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyOTYgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIEJhcmNvZGVUeXBlIHZhbHVlIHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfSU5URVJQT0xBVElPTk1FVEhPRF9JTlRFUlBPTEFURVBPSU5UUyAgICAgICAgICAgIC0xMDc0Mzk1Mjk1IC8vIGltYXFJbnRlcnBvbGF0ZVBvaW50cyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBJbnRlcnBvbGF0aW9uTWV0aG9kIHZhbHVlIHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX0NPTlRPVVJfSU5ERVhfT1VUX09GX1JBTkdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1Mjk0IC8vIFRoZSBjb250b3VyIGluZGV4IHlvdSBzdXBwbGllZCBpcyBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGNvbnRvdXJzIGluIHRoZSBST0kuCisjZGVmaW5lIEVSUl9DT05UT1VSSURfTk9UX0ZPVU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTI5MyAvLyBUaGUgc3VwcGxpZWQgQ29udG91cklEIGRpZCBub3QgY29ycmVsYXRlIHRvIGEgY29udG91ciBpbnNpZGUgdGhlIFJPSS4KKyNkZWZpbmUgRVJSX1BPSU5UU19BUkVfQ09MTElORUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MjkyIC8vIERvIG5vdCBzdXBwbHkgY29sbGluZWFyIHBvaW50cyBmb3IgdGhpcyBvcGVyYXRpb24uCisjZGVmaW5lIEVSUl9TSEFQRU1BVENIX0JBRElNQUdFREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTI5MSAvLyBTaGFwZSBNYXRjaCByZXF1aXJlcyB0aGUgaW1hZ2UgdG8gY29udGFpbiBvbmx5IHBpeGVsIHZhbHVlcyBvZiAwIG9yIDEuCisjZGVmaW5lIEVSUl9TSEFQRU1BVENIX0JBRFRFTVBMQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTI5MCAvLyBUaGUgdGVtcGxhdGUgeW91IHN1cHBsaWVkIGZvciBTaGFwZU1hdGNoIGNvbnRhaW5zIG5vIHNoYXBlIGluZm9ybWF0aW9uLgorI2RlZmluZSBFUlJfQ09OVEFJTkVSX0NBUEFDSVRZX0VYQ0VFREVEX1VJTlRfTUFYICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyODkgLy8gVGhlIG9wZXJhdGlvbiB3b3VsZCBoYXZlIGV4Y2VlZGVkIHRoZSBjYXBhY2l0eSBvZiBhbiBpbnRlcm5hbCBjb250YWluZXIsIHdoaWNoIGlzIGxpbWl0ZWQgdG8gNDI5NDk2NzI5NiB1bmlxdWUgZWxlbWVudHMuCisjZGVmaW5lIEVSUl9DT05UQUlORVJfQ0FQQUNJVFlfRVhDRUVERURfSU5UX01BWCAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTI4OCAvLyBUaGUgb3BlcmF0aW9uIHdvdWxkIGhhdmUgZXhjZWVkZWQgdGhlIGNhcGFjaXR5IG9mIGFuIGludGVybmFsIGNvbnRhaW5lciwgd2hpY2ggaXMgbGltaXRlZCB0byAyMTQ3NDgzNjQ4IHVuaXF1ZSBlbGVtZW50cy4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTElORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1Mjg3IC8vIFRoZSBsaW5lIHlvdSBwcm92aWRlZCBjb250YWlucyB0d28gaWRlbnRpY2FsIHBvaW50cywgb3Igb25lIG9mIHRoZSBjb29yZGluYXRlIGxvY2F0aW9ucyBmb3IgdGhlIGxpbmUgaXMgbm90IGEgbnVtYmVyIChOYU4pLgorI2RlZmluZSBFUlJfSU5WQUxJRF9DT05DRU5UUklDX1JBS0VfRElSRUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyODYgLy8gSW52YWxpZCBjb25jZW50cmljIHJha2UgZGlyZWN0aW9uLgorI2RlZmluZSBFUlJfSU5WQUxJRF9TUE9LRV9ESVJFQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyODUgLy8gSW52YWxpZCBzcG9rZSBkaXJlY3Rpb24uCisjZGVmaW5lIEVSUl9JTlZBTElEX0VER0VfUFJPQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTI4NCAvLyBJbnZhbGlkIGVkZ2UgcHJvY2Vzcy4KKyNkZWZpbmUgRVJSX0lOVkFMSURfUkFLRV9ESVJFQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MjgzIC8vIEludmFsaWQgcmFrZSBkaXJlY3Rpb24uCisjZGVmaW5lIEVSUl9DQU5UX0RSQVdfSU5UT19WSUVXRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTI4MiAvLyBVbmFibGUgdG8gZHJhdyB0byB2aWV3ZXIuIFlvdSBtdXN0IGhhdmUgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBjb250cm9sLgorI2RlZmluZSBFUlJfSU1BR0VfU01BTExFUl9USEFOX0JPUkRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyODEgLy8gWW91ciBpbWFnZSBtdXN0IGJlIGxhcmdlciB0aGFuIGl0cyBib3JkZXIgc2l6ZSBmb3IgdGhpcyBvcGVyYXRpb24uCisjZGVmaW5lIEVSUl9ST0lfTk9UX1JFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTI4MCAvLyBUaGUgUk9JIG11c3Qgb25seSBoYXZlIGEgc2luZ2xlIFJlY3RhbmdsZSBjb250b3VyLgorI2RlZmluZSBFUlJfUk9JX05PVF9QT0xZR09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyNzkgLy8gUk9JIGlzIG5vdCBhIHBvbHlnb24uCisjZGVmaW5lIEVSUl9MQ0RfTk9UX05VTUVSSUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTI3OCAvLyBMQ0QgaW1hZ2UgaXMgbm90IGEgbnVtYmVyLgorI2RlZmluZSBFUlJfQkFSQ09ERV9DSEVDS1NVTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyNzcgLy8gVGhlIGRlY29kZWQgYmFyY29kZSBpbmZvcm1hdGlvbiBkaWQgbm90IHBhc3MgdGhlIGNoZWNrc3VtIHRlc3QuCisjZGVmaW5lIEVSUl9MSU5FU19QQVJBTExFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTI3NiAvLyBZb3Ugc3BlY2lmaWVkIHBhcmFsbGVsIGxpbmVzIGZvciB0aGUgbWV0ZXIgUk9JLgorI2RlZmluZSBFUlJfSU5WQUxJRF9CUk9XU0VSX0lNQUdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyNzUgLy8gSW52YWxpZCBicm93c2VyIGltYWdlLgorI2RlZmluZSBFUlJfRElWX0JZX1pFUk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyNzAgLy8gQ2Fubm90IGRpdmlkZSBieSB6ZXJvLgorI2RlZmluZSBFUlJfTlVMTF9QT0lOVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyNjkgLy8gTnVsbCBwb2ludGVyLgorI2RlZmluZSBFUlJfTElORUFSX0NPRUZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyNjggLy8gVGhlIGxpbmVhciBlcXVhdGlvbnMgYXJlIG5vdCBpbmRlcGVuZGVudC4KKyNkZWZpbmUgRVJSX0NPTVBMRVhfUk9PVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MjY3IC8vIFRoZSByb290cyBvZiB0aGUgZXF1YXRpb24gYXJlIGNvbXBsZXguCisjZGVmaW5lIEVSUl9CQVJDT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTI2NSAvLyBUaGUgYmFyY29kZSBkb2VzIG5vdCBtYXRjaCB0aGUgdHlwZSB5b3Ugc3BlY2lmaWVkLgorI2RlZmluZSBFUlJfTENEX05PX1NFR01FTlRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyNjMgLy8gTm8gbGl0IHNlZ21lbnQuCisjZGVmaW5lIEVSUl9MQ0RfQkFEX01BVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTI2MiAvLyBUaGUgTENEIGRvZXMgbm90IGZvcm0gYSBrbm93biBkaWdpdC4KKyNkZWZpbmUgRVJSX0dJUF9SQU5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MjYxIC8vIEFuIGludGVybmFsIGVycm9yIG9jY3VycmVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gYWNjZXNzIGFuIGludmFsaWQgY29vcmRpbmF0ZSBvbiBhbiBpbWFnZS4KKyNkZWZpbmUgRVJSX0hFQVBfVFJBU0hFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MjYwIC8vIEFuIGludGVybmFsIG1lbW9yeSBlcnJvciBvY2N1cnJlZC4KKyNkZWZpbmUgRVJSX0JBRF9GSUxURVJfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MjU4IC8vIFRoZSBmaWx0ZXIgd2lkdGggbXVzdCBiZSBvZGQgZm9yIHRoZSBDYW5ueSBvcGVyYXRvci4KKyNkZWZpbmUgRVJSX0lOVkFMSURfRURHRV9ESVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MjU3IC8vIFlvdSBzdXBwbGllZCBhbiBpbnZhbGlkIGVkZ2UgZGlyZWN0aW9uIGluIHRoZSBDYW5ueSBvcGVyYXRvci4KKyNkZWZpbmUgRVJSX0VWRU5fV0lORE9XX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MjU2IC8vIFRoZSB3aW5kb3cgc2l6ZSBtdXN0IGJlIG9kZCBmb3IgdGhlIENhbm55IG9wZXJhdG9yLgorI2RlZmluZSBFUlJfSU5WQUxJRF9MRUFSTl9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyNTMgLy8gSW52YWxpZCBsZWFybiBtb2RlLgorI2RlZmluZSBFUlJfTEVBUk5fU0VUVVBfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyNTIgLy8gSW52YWxpZCBsZWFybiBzZXR1cCBkYXRhLgorI2RlZmluZSBFUlJfSU5WQUxJRF9NQVRDSF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyNTEgLy8gSW52YWxpZCBtYXRjaCBtb2RlLgorI2RlZmluZSBFUlJfTUFUQ0hfU0VUVVBfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyNTAgLy8gSW52YWxpZCBtYXRjaCBzZXR1cCBkYXRhLgorI2RlZmluZSBFUlJfUk9UQVRJT05fQU5HTEVfUkFOR0VfVE9PX0xBUkdFICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyNDkgLy8gQXQgbGVhc3Qgb25lIHJhbmdlIGluIHRoZSBhcnJheSBvZiByb3RhdGlvbiBhbmdsZSByYW5nZXMgZXhjZWVkcyAzNjAgZGVncmVlcy4KKyNkZWZpbmUgRVJSX1RPT19NQU5ZX1JPVEFUSU9OX0FOR0xFX1JBTkdFUyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MjQ4IC8vIFRoZSBhcnJheSBvZiByb3RhdGlvbiBhbmdsZSByYW5nZXMgY29udGFpbnMgdG9vIG1hbnkgcmFuZ2VzLgorI2RlZmluZSBFUlJfVEVNUExBVEVfREVTQ1JJUFRPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyNDcgLy8gSW52YWxpZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yLgorI2RlZmluZSBFUlJfVEVNUExBVEVfREVTQ1JJUFRPUl8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyNDYgLy8gSW52YWxpZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yLgorI2RlZmluZSBFUlJfVEVNUExBVEVfREVTQ1JJUFRPUl8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyNDUgLy8gSW52YWxpZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yLgorI2RlZmluZSBFUlJfVEVNUExBVEVfREVTQ1JJUFRPUl8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyNDQgLy8gSW52YWxpZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yLgorI2RlZmluZSBFUlJfVEVNUExBVEVfREVTQ1JJUFRPUl80ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyNDMgLy8gVGhlIHRlbXBsYXRlIGRlc2NyaXB0b3Igd2FzIGNyZWF0ZWQgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgTkkgVmlzaW9uLiBVcGdyYWRlIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBOSSBWaXNpb24gdG8gdXNlIHRoaXMgdGVtcGxhdGUuCisjZGVmaW5lIEVSUl9URU1QTEFURV9ERVNDUklQVE9SX1JPVEFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTI0MiAvLyBJbnZhbGlkIHRlbXBsYXRlIGRlc2NyaXB0b3IuCisjZGVmaW5lIEVSUl9URU1QTEFURV9ERVNDUklQVE9SX05PUk9UQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTI0MSAvLyBUaGUgdGVtcGxhdGUgZGVzY3JpcHRvciBkb2VzIG5vdCBjb250YWluIGRhdGEgcmVxdWlyZWQgZm9yIHJvdGF0aW9uLWludmFyaWFudCBtYXRjaGluZy4KKyNkZWZpbmUgRVJSX1RFTVBMQVRFX0RFU0NSSVBUT1JfUk9UQVRJT05fMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MjQwIC8vIEludmFsaWQgdGVtcGxhdGUgZGVzY3JpcHRvci4KKyNkZWZpbmUgRVJSX1RFTVBMQVRFX0RFU0NSSVBUT1JfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MjM5IC8vIEludmFsaWQgdGVtcGxhdGUgZGVzY3JpcHRvci4KKyNkZWZpbmUgRVJSX1RFTVBMQVRFX0RFU0NSSVBUT1JfTk9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MjM4IC8vIFRoZSB0ZW1wbGF0ZSBkZXNjcmlwdG9yIGRvZXMgbm90IGNvbnRhaW4gZGF0YSByZXF1aXJlZCBmb3Igc2hpZnQtaW52YXJpYW50IG1hdGNoaW5nLgorI2RlZmluZSBFUlJfVEVNUExBVEVfREVTQ1JJUFRPUl9TSElGVF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyMzcgLy8gSW52YWxpZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yLgorI2RlZmluZSBFUlJfVEVNUExBVEVfREVTQ1JJUFRPUl9OT1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyMzYgLy8gVGhlIHRlbXBsYXRlIGRlc2NyaXB0b3IgZG9lcyBub3QgY29udGFpbiBkYXRhIHJlcXVpcmVkIGZvciBzY2FsZS1pbnZhcmlhbnQgbWF0Y2hpbmcuCisjZGVmaW5lIEVSUl9URU1QTEFURV9JTUFHRV9DT05UUkFTVF9UT09fTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTIzNSAvLyBUaGUgdGVtcGxhdGUgaW1hZ2UgZG9lcyBub3QgY29udGFpbiBlbm91Z2ggY29udHJhc3QuCisjZGVmaW5lIEVSUl9URU1QTEFURV9JTUFHRV9UT09fU01BTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTIzNCAvLyBUaGUgdGVtcGxhdGUgaW1hZ2UgaXMgdG9vIHNtYWxsLgorI2RlZmluZSBFUlJfVEVNUExBVEVfSU1BR0VfVE9PX0xBUkdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyMzMgLy8gVGhlIHRlbXBsYXRlIGltYWdlIGlzIHRvbyBsYXJnZS4KKyNkZWZpbmUgRVJSX1RPT19NQU5ZX09DUl9TRVNTSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MjE0IC8vIFRoZXJlIGFyZSB0b28gbWFueSBPQ1Igc2Vzc2lvbnMgb3Blbi4gIFlvdSBtdXN0IGNsb3NlIGEgc2Vzc2lvbiBiZWZvcmUgeW91IGNhbiBvcGVuIGFub3RoZXIgb25lLgorI2RlZmluZSBFUlJfT0NSX1RFTVBMQVRFX1dST05HX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyMTIgLy8gVGhlIHNpemUgb2YgdGhlIHRlbXBsYXRlIHN0cmluZyBtdXN0IG1hdGNoIHRoZSBzaXplIG9mIHRoZSBzdHJpbmcgeW91IGFyZSB0cnlpbmcgdG8gY29ycmVjdC4KKyNkZWZpbmUgRVJSX09DUl9CQURfVEVYVF9URU1QTEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MjExIC8vIFRoZSBzdXBwbGllZCB0ZXh0IHRlbXBsYXRlIGNvbnRhaW5zIG5vbnN0YW5kYXJkIGNoYXJhY3RlcnMgdGhhdCBjYW5ub3QgYmUgZ2VuZXJhdGVkIGJ5IE9DUi4KKyNkZWZpbmUgRVJSX09DUl9DQU5OT1RfTUFUQ0hfVEVYVF9URU1QTEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MjEwIC8vIEF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIgaW4gdGhlIHRleHQgdGVtcGxhdGUgd2FzIG9mIGEgbGV4aWNhbCBjbGFzcyB0aGF0IGRpZCBub3QgbWF0Y2ggdGhlIHN1cHBsaWVkIGNoYXJhY3RlciByZXBvcnRzLgorI2RlZmluZSBFUlJfT0NSX0xJQl9JTklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyMDMgLy8gVGhlIE9DUiBsaWJyYXJ5IGNhbm5vdCBiZSBpbml0aWFsaXplZCBjb3JyZWN0bHkuCisjZGVmaW5lIEVSUl9PQ1JfTE9BRF9MSUJSQVJZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTIwMSAvLyBUaGVyZSB3YXMgYSBmYWlsdXJlIHdoZW4gbG9hZGluZyBvbmUgb2YgdGhlIGludGVybmFsIE9DUiBlbmdpbmUgb3IgTGFiVmlldyBsaWJyYXJpZXMuCisjZGVmaW5lIEVSUl9PQ1JfSU5WQUxJRF9QQVJBTUVURVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTIwMCAvLyBPbmUgb2YgdGhlIHBhcmFtZXRlcnMgc3VwcGxpZWQgdG8gdGhlIE9DUiBmdW5jdGlvbiB0aGF0IGdlbmVyYXRlZCB0aGlzIGVycm9yIGlzIGludmFsaWQuCisjZGVmaW5lIEVSUl9NQVJLRVJfSU5GT1JNQVRJT05fTk9UX1NVUFBMSUVEICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTE5OSAvLyBNYXJrZXIgaW1hZ2UgYW5kIHBvaW50cyBhcmUgbm90IHN1cHBsaWVkCisjZGVmaW5lIEVSUl9JTkNPTVBBVElCTEVfTUFSS0VSX0lNQUdFX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTE5OCAvLyBTb3VyY2UgSW1hZ2UgYW5kIE1hcmtlciBJbWFnZSBzaG91bGQgYmUgb2Ygc2FtZSBzaXplLgorI2RlZmluZSBFUlJfQk9USF9NQVJLRVJfSU5QVVRTX1NVUFBMSUVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxOTcgLy8gQm90aCBNYXJrZXIgSW1hZ2UgYW5kIFBvaW50cyBhcmUgc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX01PUlBIT0xPR0lDQUxfT1BFUkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTE5NiAvLyBJbnZhbGlkIE1vcnBob2xvZ2ljYWwgT3BlcmF0aW9uLgorI2RlZmluZSBFUlJfSU1BR0VfQ09OVEFJTlNfTkFOX1ZBTFVFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxOTUgLy8gRmxvYXQgaW1hZ2UgY29udGFpbnMgTmFOIHZhbHVlcworI2RlZmluZSBFUlJfT1ZFUkxBWV9FWFRSQUlORk9fT1BFTklOR19ORVdfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxOTQgLy8gVGhlIG92ZXJsYXkgaW5mb3JtYXRpb24geW91IHRyaWVkIHRvIG9wZW4gd2FzIGNyZWF0ZWQgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgTkkgVmlzaW9uLiBVcGdyYWRlIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBOSSBWaXNpb24gdG8gcmVhZCB0aGlzIGZpbGUuCisjZGVmaW5lIEVSUl9OT19DTEFNUF9GT1VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTE5MyAvLyBObyB2YWxpZCBjbGFtcCB3YXMgZm91bmQgd2l0aCB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uCisjZGVmaW5lIEVSUl9OT19DTEFNUF9XSVRISU5fQU5HTEVfUkFOR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTE5MiAvLyBTdXBwbGllZCBhbmdsZSByYW5nZSBmb3IgY2xhbXAgaXMgaW5zdWZmaWNpZW50CisjZGVmaW5lIEVSUl9HSFRfSU5WQUxJRF9VU0VfQUxMX0NVUlZFU19WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTE4OCAvLyBUaGUgdXNlIGFsbCBjdXJ2ZXMgYWR2YW5jZWQgb3B0aW9uIHNwZWNpZmllZCBkdXJpbmcgbGVhcm4gaXMgbm90IHN1cHBvcnRlZAorI2RlZmluZSBFUlJfSU5WQUxJRF9HQVVTU19TSUdNQV9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxODcgLy8gVGhlIHNpZ21hIHZhbHVlIHNwZWNpZmllZCBmb3IgdGhlIEdhdXNzaWFuIGZpbHRlciBpcyB0b28gc21hbGwuCisjZGVmaW5lIEVSUl9JTlZBTElEX0dBVVNTX0ZJTFRFUl9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTE4NiAvLyBUaGUgc3BlY2lmaWVkIEdhdXNzaWFuIGZpbHRlciB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX0NPTlRSQVNUX1JFVkVSU0FMX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTE4NSAvLyBUaGUgY29udHJhc3QgcmV2ZXJzYWwgbW9kZSBzcGVjaWZpZWQgZHVyaW5nIG1hdGNoaW5nIGlzIGludmFsaWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX1JPVEFUSU9OX1JBTkdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTE4NCAvLyBJbnZhbGlkIHJvYXRpb24gYW5nbGUgcmFuZ2UuIFRoZSB1cHBlciBib3VuZCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgbG93ZXIgYm91bmQuCisjZGVmaW5lIEVSUl9HSFRfSU5WQUxJRF9NSU5JTVVNX0xFQVJOX0FOR0xFX1ZBTFVFICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTE4MyAvLyBUaGUgbWluaW11bSByb3RhdGlvbiBhbmdsZSB2YWx1ZSBzcGVjaWZlZCBkdXJpbmcgbGVhcm5pbmcgb2YgdGhlIHRlbXBsYXRlIGlzIG5vdCBzdXBwb3J0ZWQuCisjZGVmaW5lIEVSUl9HSFRfSU5WQUxJRF9NQVhJTVVNX0xFQVJOX0FOR0xFX1ZBTFVFICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTE4MiAvLyBUaGUgbWF4aW11bSByb3RhdGlvbiBhbmdsZSB2YWx1ZSBzcGVjaWZlZCBkdXJpbmcgbGVhcm5pbmcgb2YgdGhlIHRlbXBsYXRlIGlzIG5vdCBzdXBwb3J0ZWQuCisjZGVmaW5lIEVSUl9HSFRfSU5WQUxJRF9NQVhJTVVNX0xFQVJOX1NDQUxFX0ZBQ1RPUiAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTE4MSAvLyBUaGUgbWF4aW11bSBzY2FsZSBmYWN0b3Igc3BlY2lmZWQgZHVyaW5nIGxlYXJuaW5nIG9mIHRoZSB0ZW1wbGF0ZSBpcyBub3Qgc3VwcG9ydGVkLgorI2RlZmluZSBFUlJfR0hUX0lOVkFMSURfTUlOSU1VTV9MRUFSTl9TQ0FMRV9GQUNUT1IgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxODAgLy8gVGhlIG1pbmltdW0gc2NhbGUgZmFjdG9yIHNwZWNpZmVkIGR1cmluZyBsZWFybmluZyBvZiB0aGUgdGVtcGxhdGUgaXMgbm90IHN1cHBvcnRlZC4KKyNkZWZpbmUgRVJSX09DUl9QUkVQUk9DRVNTSU5HX0ZBSUxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MTc5IC8vIFRoZSBPQ1IgZW5naW5lIGZhaWxlZCBkdXJpbmcgdGhlIHByZXByb2Nlc3Npbmcgc3RhZ2UuCisjZGVmaW5lIEVSUl9PQ1JfUkVDT0dOSVRJT05fRkFJTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTE3OCAvLyBUaGUgT0NSIGVuZ2luZSBmYWlsZWQgZHVyaW5nIHRoZSByZWNvZ25pdGlvbiBzdGFnZS4KKyNkZWZpbmUgRVJSX09DUl9CQURfVVNFUl9ESUNUSU9OQVJZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MTc1IC8vIFRoZSBwcm92aWRlZCBmaWxlbmFtZSBpcyBub3QgdmFsaWQgdXNlciBkaWN0aW9uYXJ5IGZpbGVuYW1lLgorI2RlZmluZSBFUlJfT0NSX0lOVkFMSURfQVVUT09SSUVOVE1PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxNzQgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIEF1dG9PcmllbnRNb2RlIHZhbHVlIHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX09DUl9JTlZBTElEX0xBTkdVQUdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MTczIC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBMYW5ndWFnZSB2YWx1ZSB5b3Ugc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9PQ1JfSU5WQUxJRF9DSEFSQUNURVJTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTE3MiAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgQ2hhcmFjdGVyU2V0IHZhbHVlIHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX09DUl9JTklfRklMRV9OT1RfRk9VTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MTcxIC8vIFRoZSBzeXN0ZW0gY291bGQgbm90IGxvY2F0ZSB0aGUgaW5pdGlhbGl6YXRpb24gZmlsZSByZXF1aXJlZCBmb3IgT0NSIGluaXRpYWxpemF0aW9uLgorI2RlZmluZSBFUlJfT0NSX0lOVkFMSURfQ0hBUkFDVEVSVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxNzAgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIENoYXJhY3RlclR5cGUgdmFsdWUgeW91IHN1cHBsaWVkLgorI2RlZmluZSBFUlJfT0NSX0lOVkFMSURfUkVDT0dOSVRJT05NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxNjkgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIFJlY29nbml0aW9uTW9kZSB2YWx1ZSB5b3Ugc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9PQ1JfSU5WQUxJRF9BVVRPQ09SUkVDVElPTk1PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTE2OCAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgQXV0b0NvcnJlY3Rpb25Nb2RlIHZhbHVlIHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX09DUl9JTlZBTElEX09VVFBVVERFTElNSVRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MTY3IC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBPdXRwdXREZWxpbWl0ZXIgdmFsdWUgeW91IHN1cHBsaWVkLgorI2RlZmluZSBFUlJfT0NSX0JJTl9ESVJfTk9UX0ZPVU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxNjYgLy8gVGhlIHN5c3RlbSBjb3VsZCBub3QgbG9jYXRlIHRoZSBPQ1IgYmluYXJ5IGRpcmVjdG9yeSByZXF1aXJlZCBmb3IgT0NSIGluaXRpYWxpemF0aW9uLgorI2RlZmluZSBFUlJfT0NSX1dUU19ESVJfTk9UX0ZPVU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxNjUgLy8gVGhlIHN5c3RlbSBjb3VsZCBub3QgbG9jYXRlIHRoZSBPQ1Igd2VpZ2h0cyBkaXJlY3RvcnkgcmVxdWlyZWQgZm9yIE9DUiBpbml0aWFsaXphdGlvbi4KKyNkZWZpbmUgRVJSX09DUl9BRERfV09SRF9GQUlMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MTY0IC8vIFRoZSBzdXBwbGllZCB3b3JkIGNvdWxkIG5vdCBiZSBhZGRlZCB0byB0aGUgdXNlciBkaWN0aW9uYXJ5LgorI2RlZmluZSBFUlJfT0NSX0lOVkFMSURfQ0hBUkFDVEVSUFJFRkVSRU5DRSAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxNjMgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIENoYXJhY3RlclByZWZlcmVuY2UgdmFsdWUgeW91IHN1cHBsaWVkLgorI2RlZmluZSBFUlJfT0NSX0lOVkFMSURfQ09SUkVDVElPTk1PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxNjIgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIENvcnJlY3Rpb25NZXRob2QgdmFsdWUgeW91IHN1cHBsaWVkLgorI2RlZmluZSBFUlJfT0NSX0lOVkFMSURfQ09SUkVDVElPTkxFVkVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxNjEgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIENvcnJlY3Rpb25MZXZlbCB2YWx1ZSB5b3Ugc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9PQ1JfSU5WQUxJRF9NQVhQT0lOVFNJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTE2MCAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgbWF4aW11bSBwb2ludCBzaXplIHlvdSBzdXBwbGllZC4gIFZhbGlkIHZhbHVlcyByYW5nZSBmcm9tIDQgdG8gNzIuCisjZGVmaW5lIEVSUl9PQ1JfSU5WQUxJRF9UT0xFUkFOQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTE1OSAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgdG9sZXJhbmNlIHZhbHVlIHlvdSBzdXBwbGllZC4gIFZhbGlkIHZhbHVlcyBhcmUgbm9uLW5lZ2F0aXZlLgorI2RlZmluZSBFUlJfT0NSX0lOVkFMSURfQ09OVFJBU1RNT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxNTggLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIENvbnRyYXN0TW9kZSB2YWx1ZSB5b3Ugc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9PQ1JfU0tFV19ERVRFQ1RfRkFJTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTE1NiAvLyBUaGUgT0NSIGF0dGVtcHRlZCB0byBkZXRlY3RlZCB0aGUgdGV4dCBza2V3IGFuZCBmYWlsZWQuCisjZGVmaW5lIEVSUl9PQ1JfT1JJRU5UX0RFVEVDVF9GQUlMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTE1NSAvLyBUaGUgT0NSIGF0dGVtcHRlZCB0byBkZXRlY3RlZCB0aGUgdGV4dCBvcmllbnRhdGlvbiBhbmQgZmFpbGVkLgorI2RlZmluZSBFUlJfRk9OVF9GSUxFX0ZPUk1BVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxNTMgLy8gSW52YWxpZCBmb250IGZpbGUgZm9ybWF0LgorI2RlZmluZSBFUlJfRk9OVF9GSUxFX05PVF9GT1VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxNTIgLy8gRm9udCBmaWxlIG5vdCBmb3VuZC4KKyNkZWZpbmUgRVJSX09DUl9DT1JSRUNUSU9OX0ZBSUxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MTUxIC8vIFRoZSBPQ1IgZW5naW5lIGZhaWxlZCBkdXJpbmcgdGhlIGNvcnJlY3Rpb24gc3RhZ2UuCisjZGVmaW5lIEVSUl9JTlZBTElEX1JPVU5ESU5HX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTE1MCAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgUm91bmRpbmdNb2RlIHZhbHVlIHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX0RVUExJQ0FURV9UUkFOU0ZPUk1fVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MTQ5IC8vIEZvdW5kIGEgZHVwbGljYXRlIHRyYW5zZm9ybSB0eXBlIGluIHRoZSBwcm9wZXJ0aWVzIGFycmF5LiBFYWNoIHByb3BlcnRpZXMgYXJyYXkgbWF5IG9ubHkgY29udGFpbiBvbmUgYmVoYXZpb3IgZm9yIGVhY2ggdHJhbnNmb3JtIHR5cGUuCisjZGVmaW5lIEVSUl9PVkVSTEFZX0dST1VQX05PVF9GT1VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTE0OCAvLyBPdmVybGF5IEdyb3VwIE5vdCBGb3VuZC4KKyNkZWZpbmUgRVJSX0JBUkNPREVfUlNTTElNSVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MTQ3IC8vIFRoZSBiYXJjb2RlIGlzIG5vdCBhIHZhbGlkIFJTUyBMaW1pdGVkIHN5bWJvbAorI2RlZmluZSBFUlJfUVJfREVURUNUSU9OX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxNDYgLy8gQ291bGRuJ3QgZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IHZlcnNpb24gb2YgdGhlIFFSIGNvZGUuCisjZGVmaW5lIEVSUl9RUl9JTlZBTElEX1JFQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTE0NSAvLyBJbnZhbGlkIHJlYWQgb2YgdGhlIFFSIGNvZGUuCisjZGVmaW5lIEVSUl9RUl9JTlZBTElEX0JBUkNPREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTE0NCAvLyBUaGUgYmFyY29kZSB0aGF0IHdhcyByZWFkIGNvbnRhaW5zIGludmFsaWQgcGFyYW1ldGVycy4KKyNkZWZpbmUgRVJSX1FSX0RFVEVDVElPTl9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MTQzIC8vIFRoZSBkYXRhIHN0cmVhbSB0aGF0IHdhcyBkZW1vZHVsYXRlZCBjb3VsZCBub3QgYmUgcmVhZCBiZWNhdXNlIHRoZSBtb2RlIHdhcyBub3QgZGV0ZWN0ZWQuCisjZGVmaW5lIEVSUl9RUl9ERVRFQ1RJT05fTU9ERUxUWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTE0MiAvLyBDb3VsZG4ndCBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgbW9kZWwgb2YgdGhlIFFSIGNvZGUuCisjZGVmaW5lIEVSUl9PQ1JfTk9fVEVYVF9GT1VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTE0MSAvLyBUaGUgT0NSIGVuZ2luZSBjb3VsZCBub3QgZmluZCBhbnkgdGV4dCBpbiB0aGUgc3VwcGxpZWQgcmVnaW9uLgorI2RlZmluZSBFUlJfT0NSX0NIQVJfUkVQT1JUX0NPUlJVUFRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxNDAgLy8gT25lIG9mIHRoZSBjaGFyYWN0ZXIgcmVwb3J0cyBpcyBubyBsb25nZXIgdXNhYmxlIGJ5IHRoZSBzeXN0ZW0uCisjZGVmaW5lIEVSUl9JTUFRX1FSX0RJTUVOU0lPTl9JTlZBTElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTEzOSAvLyBJbnZhbGlkIERpbWVuc2lvbnMuCisjZGVmaW5lIEVSUl9PQ1JfUkVHSU9OX1RPT19TTUFMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTEzOCAvLyBUaGUgT0NSIHJlZ2lvbiBwcm92aWRlZCB3YXMgdG9vIHNtYWxsIHRvIGhhdmUgY29udGFpbmVkIGFueSBjaGFyYWN0ZXJzLgorI2RlZmluZSBfRklSU1RfRVJSICBFUlJfU1lTVEVNX0VSUk9SCisjZGVmaW5lIF9MQVNUX0VSUiAgIEVSUl9PQ1JfUkVHSU9OX1RPT19TTUFMTAorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBFbnVtZXJhdGVkIFR5cGVzCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3R5cGVkZWYgZW51bSBQb2ludFN5bWJvbF9lbnVtIHsKKyAgICBJTUFRX1BPSU5UX0FTX1BJWEVMICAgICAgICAgID0gMCwgICAgICAgICAgIC8vQSBzaW5nbGUgcGl4ZWwgcmVwcmVzZW50cyBhIHBvaW50IGluIHRoZSBvdmVybGF5LgorICAgIElNQVFfUE9JTlRfQVNfQ1JPU1MgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9BIGNyb3NzIHJlcHJlc2VudHMgYSBwb2ludCBpbiB0aGUgb3ZlcmxheS4KKyAgICBJTUFRX1BPSU5UX1VTRVJfREVGSU5FRCAgICAgID0gMiwgICAgICAgICAgIC8vVGhlIHBhdHRlcm4gc3VwcGxpZWQgYnkgdGhlIHVzZXIgcmVwcmVzZW50cyBhIHBvaW50IGluIHRoZSBvdmVybGF5LgorICAgIElNQVFfUE9JTlRfU1lNQk9MX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IFBvaW50U3ltYm9sOworCit0eXBlZGVmIGVudW0gTWVhc3VyZW1lbnRWYWx1ZV9lbnVtIHsKKyAgICBJTUFRX0FSRUEgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9TdXJmYWNlIGFyZWEgb2YgdGhlIHBhcnRpY2xlIGluIHBpeGVscy4KKyAgICBJTUFRX0FSRUFfQ0FMSUJSQVRFRCAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9TdXJmYWNlIGFyZWEgb2YgdGhlIHBhcnRpY2xlIGluIGNhbGlicmF0ZWQgdW5pdHMuCisgICAgSU1BUV9OVU1fSE9MRVMgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vTnVtYmVyIG9mIGhvbGVzIGluIHRoZSBwYXJ0aWNsZS4KKyAgICBJTUFRX0FSRUFfT0ZfSE9MRVMgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgLy9TdXJmYWNlIGFyZWEgb2YgdGhlIGhvbGVzIGluIGNhbGlicmF0ZWQgdW5pdHMuCisgICAgSU1BUV9UT1RBTF9BUkVBICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgIC8vVG90YWwgc3VyZmFjZSBhcmVhIChob2xlcyBhbmQgcGFydGljbGUpIGluIGNhbGlicmF0ZWQgdW5pdHMuCisgICAgSU1BUV9JTUFHRV9BUkVBICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgIC8vU3VyZmFjZSBhcmVhIG9mIHRoZSBlbnRpcmUgaW1hZ2UgaW4gY2FsaWJyYXRlZCB1bml0cy4KKyAgICBJTUFRX1BBUlRJQ0xFX1RPX0lNQUdFICAgICAgICAgICAgPSA2LCAgICAgICAgICAgLy9SYXRpbywgZXhwcmVzc2VkIGFzIGEgcGVyY2VudGFnZSwgb2YgdGhlIHN1cmZhY2UgYXJlYSBvZiBhIHBhcnRpY2xlIGluIHJlbGF0aW9uIHRvIHRoZSB0b3RhbCBhcmVhIG9mIHRoZSBwYXJ0aWNsZS4KKyAgICBJTUFRX1BBUlRJQ0xFX1RPX1RPVEFMICAgICAgICAgICAgPSA3LCAgICAgICAgICAgLy9SYXRpbywgZXhwcmVzc2VkIGFzIGEgcGVyY2VudGFnZSwgb2YgdGhlIHN1cmZhY2UgYXJlYSBvZiBhIHBhcnRpY2xlIGluIHJlbGF0aW9uIHRvIHRoZSB0b3RhbCBhcmVhIG9mIHRoZSBwYXJ0aWNsZS4KKyAgICBJTUFRX0NFTlRFUl9NQVNTX1ggICAgICAgICAgICAgICAgPSA4LCAgICAgICAgICAgLy9YLWNvb3JkaW5hdGUgb2YgdGhlIGNlbnRlciBvZiBtYXNzLgorICAgIElNQVFfQ0VOVEVSX01BU1NfWSAgICAgICAgICAgICAgICA9IDksICAgICAgICAgICAvL1ktY29vcmRpbmF0ZSBvZiB0aGUgY2VudGVyIG9mIG1hc3MuCisgICAgSU1BUV9MRUZUX0NPTFVNTiAgICAgICAgICAgICAgICAgID0gMTAsICAgICAgICAgIC8vTGVmdCBlZGdlIG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUuCisgICAgSU1BUV9UT1BfUk9XICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgICAgICAgIC8vVG9wIGVkZ2Ugb2YgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZS4KKyAgICBJTUFRX1JJR0hUX0NPTFVNTiAgICAgICAgICAgICAgICAgPSAxMiwgICAgICAgICAgLy9SaWdodCBlZGdlIG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUuCisgICAgSU1BUV9CT1RUT01fUk9XICAgICAgICAgICAgICAgICAgID0gMTMsICAgICAgICAgIC8vQm90dG9tIGVkZ2Ugb2YgYm91bmRpbmcgcmVjdGFuZ2xlLgorICAgIElNQVFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICA9IDE0LCAgICAgICAgICAvL1dpZHRoIG9mIGJvdW5kaW5nIHJlY3RhbmdsZSBpbiBjYWxpYnJhdGVkIHVuaXRzLgorICAgIElNQVFfSEVJR0hUICAgICAgICAgICAgICAgICAgICAgICA9IDE1LCAgICAgICAgICAvL0hlaWdodCBvZiBib3VuZGluZyByZWN0YW5nbGUgaW4gY2FsaWJyYXRlZCB1bml0cy4KKyAgICBJTUFRX01BWF9TRUdNRU5UX0xFTkdUSCAgICAgICAgICAgPSAxNiwgICAgICAgICAgLy9MZW5ndGggb2YgbG9uZ2VzdCBob3Jpem9udGFsIGxpbmUgc2VnbWVudC4KKyAgICBJTUFRX01BWF9TRUdNRU5UX0xFRlRfQ09MVU1OICAgICAgPSAxNywgICAgICAgICAgLy9MZWZ0bW9zdCB4LWNvb3JkaW5hdGUgb2YgbG9uZ2VzdCBob3Jpem9udGFsIGxpbmUgc2VnbWVudC4KKyAgICBJTUFRX01BWF9TRUdNRU5UX1RPUF9ST1cgICAgICAgICAgPSAxOCwgICAgICAgICAgLy9ZLWNvb3JkaW5hdGUgb2YgbG9uZ2VzdCBob3Jpem9udGFsIGxpbmUgc2VnbWVudC4KKyAgICBJTUFRX1BFUklNRVRFUiAgICAgICAgICAgICAgICAgICAgPSAxOSwgICAgICAgICAgLy9PdXRlciBwZXJpbWV0ZXIgb2YgdGhlIHBhcnRpY2xlLgorICAgIElNQVFfUEVSSU1FVEVSX09GX0hPTEVTICAgICAgICAgICA9IDIwLCAgICAgICAgICAvL1BlcmltZXRlciBvZiBhbGwgaG9sZXMgd2l0aGluIHRoZSBwYXJ0aWNsZS4KKyAgICBJTUFRX1NJR01BX1ggICAgICAgICAgICAgICAgICAgICAgPSAyMSwgICAgICAgICAgLy9TdW0gb2YgdGhlIHBhcnRpY2xlIHBpeGVscyBvbiB0aGUgeC1heGlzLgorICAgIElNQVFfU0lHTUFfWSAgICAgICAgICAgICAgICAgICAgICA9IDIyLCAgICAgICAgICAvL1N1bSBvZiB0aGUgcGFydGljbGUgcGl4ZWxzIG9uIHRoZSB5LWF4aXMuCisgICAgSU1BUV9TSUdNQV9YWCAgICAgICAgICAgICAgICAgICAgID0gMjMsICAgICAgICAgIC8vU3VtIG9mIHRoZSBwYXJ0aWNsZSBwaXhlbHMgb24gdGhlIHgtYXhpcyBzcXVhcmVkLgorICAgIElNQVFfU0lHTUFfWVkgICAgICAgICAgICAgICAgICAgICA9IDI0LCAgICAgICAgICAvL1N1bSBvZiB0aGUgcGFydGljbGUgcGl4ZWxzIG9uIHRoZSB5LWF4aXMgc3F1YXJlZC4KKyAgICBJTUFRX1NJR01BX1hZICAgICAgICAgICAgICAgICAgICAgPSAyNSwgICAgICAgICAgLy9TdW0gb2YgdGhlIHBhcnRpY2xlIHBpeGVscyBvbiB0aGUgeC1heGlzIGFuZCB5LWF4aXMuCisgICAgSU1BUV9QUk9KX1ggICAgICAgICAgICAgICAgICAgICAgID0gMjYsICAgICAgICAgIC8vUHJvamVjdGlvbiBjb3JyZWN0ZWQgaW4gWC4KKyAgICBJTUFRX1BST0pfWSAgICAgICAgICAgICAgICAgICAgICAgPSAyNywgICAgICAgICAgLy9Qcm9qZWN0aW9uIGNvcnJlY3RlZCBpbiBZLgorICAgIElNQVFfSU5FUlRJQV9YWCAgICAgICAgICAgICAgICAgICA9IDI4LCAgICAgICAgICAvL0luZXJ0aWEgbWF0cml4IGNvZWZmaWNpZW50IGluIFhYLgorICAgIElNQVFfSU5FUlRJQV9ZWSAgICAgICAgICAgICAgICAgICA9IDI5LCAgICAgICAgICAvL0luZXJ0aWEgbWF0cml4IGNvZWZmaWNpZW50IGluIFlZLgorICAgIElNQVFfSU5FUlRJQV9YWSAgICAgICAgICAgICAgICAgICA9IDMwLCAgICAgICAgICAvL0luZXJ0aWEgbWF0cml4IGNvZWZmaWNpZW50IGluIFhZLgorICAgIElNQVFfTUVBTl9IICAgICAgICAgICAgICAgICAgICAgICA9IDMxLCAgICAgICAgICAvL01lYW4gbGVuZ3RoIG9mIGhvcml6b250YWwgc2VnbWVudHMuCisgICAgSU1BUV9NRUFOX1YgICAgICAgICAgICAgICAgICAgICAgID0gMzIsICAgICAgICAgIC8vTWVhbiBsZW5ndGggb2YgdmVydGljYWwgc2VnbWVudHMuCisgICAgSU1BUV9NQVhfSU5URVJDRVBUICAgICAgICAgICAgICAgID0gMzMsICAgICAgICAgIC8vTGVuZ3RoIG9mIGxvbmdlc3Qgc2VnbWVudCBvZiB0aGUgY29udmV4IGh1bGwuCisgICAgSU1BUV9NRUFOX0lOVEVSQ0VQVCAgICAgICAgICAgICAgID0gMzQsICAgICAgICAgIC8vTWVhbiBsZW5ndGggb2YgdGhlIGNob3JkcyBpbiBhbiBvYmplY3QgcGVycGVuZGljdWxhciB0byBpdHMgbWF4IGludGVyY2VwdC4KKyAgICBJTUFRX09SSUVOVEFUSU9OICAgICAgICAgICAgICAgICAgPSAzNSwgICAgICAgICAgLy9UaGUgb3JpZW50YXRpb24gYmFzZWQgb24gdGhlIGluZXJ0aWEgb2YgdGhlIHBpeGVscyBpbiB0aGUgcGFydGljbGUuCisgICAgSU1BUV9FUVVJVl9FTExJUFNFX01JTk9SICAgICAgICAgID0gMzYsICAgICAgICAgIC8vVG90YWwgbGVuZ3RoIG9mIHRoZSBheGlzIG9mIHRoZSBlbGxpcHNlIGhhdmluZyB0aGUgc2FtZSBhcmVhIGFzIHRoZSBwYXJ0aWNsZSBhbmQgYSBtYWpvciBheGlzIGVxdWFsIHRvIGhhbGYgdGhlIG1heCBpbnRlcmNlcHQuCisgICAgSU1BUV9FTExJUFNFX01BSk9SICAgICAgICAgICAgICAgID0gMzcsICAgICAgICAgIC8vVG90YWwgbGVuZ3RoIG9mIG1ham9yIGF4aXMgaGF2aW5nIHRoZSBzYW1lIGFyZWEgYW5kIHBlcmltZXRlciBhcyB0aGUgcGFydGljbGUgaW4gY2FsaWJyYXRlZCB1bml0cy4KKyAgICBJTUFRX0VMTElQU0VfTUlOT1IgICAgICAgICAgICAgICAgPSAzOCwgICAgICAgICAgLy9Ub3RhbCBsZW5ndGggb2YgbWlub3IgYXhpcyBoYXZpbmcgdGhlIHNhbWUgYXJlYSBhbmQgcGVyaW1ldGVyIGFzIHRoZSBwYXJ0aWNsZSBpbiBjYWxpYnJhdGVkIHVuaXRzLgorICAgIElNQVFfRUxMSVBTRV9SQVRJTyAgICAgICAgICAgICAgICA9IDM5LCAgICAgICAgICAvL0ZyYWN0aW9uIG9mIG1ham9yIGF4aXMgdG8gbWlub3IgYXhpcy4KKyAgICBJTUFRX1JFQ1RfTE9OR19TSURFICAgICAgICAgICAgICAgPSA0MCwgICAgICAgICAgLy9MZW5ndGggb2YgdGhlIGxvbmcgc2lkZSBvZiBhIHJlY3RhbmdsZSBoYXZpbmcgdGhlIHNhbWUgYXJlYSBhbmQgcGVyaW1ldGVyIGFzIHRoZSBwYXJ0aWNsZSBpbiBjYWxpYnJhdGVkIHVuaXRzLgorICAgIElNQVFfUkVDVF9TSE9SVF9TSURFICAgICAgICAgICAgICA9IDQxLCAgICAgICAgICAvL0xlbmd0aCBvZiB0aGUgc2hvcnQgc2lkZSBvZiBhIHJlY3RhbmdsZSBoYXZpbmcgdGhlIHNhbWUgYXJlYSBhbmQgcGVyaW1ldGVyIGFzIHRoZSBwYXJ0aWNsZSBpbiBjYWxpYnJhdGVkIHVuaXRzLgorICAgIElNQVFfUkVDVF9SQVRJTyAgICAgICAgICAgICAgICAgICA9IDQyLCAgICAgICAgICAvL1JhdGlvIG9mIHJlY3RhbmdsZSBsb25nIHNpZGUgdG8gcmVjdGFuZ2xlIHNob3J0IHNpZGUuCisgICAgSU1BUV9FTE9OR0FUSU9OICAgICAgICAgICAgICAgICAgID0gNDMsICAgICAgICAgIC8vTWF4IGludGVyY2VwdC9tZWFuIHBlcnBlbmRpY3VsYXIgaW50ZXJjZXB0LgorICAgIElNQVFfQ09NUEFDVE5FU1MgICAgICAgICAgICAgICAgICA9IDQ0LCAgICAgICAgICAvL1BhcnRpY2xlIGFyZWEvKGhlaWdodCB4IHdpZHRoKS4KKyAgICBJTUFRX0hFWVdPT0QgICAgICAgICAgICAgICAgICAgICAgPSA0NSwgICAgICAgICAgLy9QYXJ0aWNsZSBwZXJpbWV0ZXIvcGVyaW1ldGVyIG9mIHRoZSBjaXJjbGUgaGF2aW5nIHRoZSBzYW1lIGFyZWEgYXMgdGhlIHBhcnRpY2xlLgorICAgIElNQVFfVFlQRV9GQUNUT1IgICAgICAgICAgICAgICAgICA9IDQ2LCAgICAgICAgICAvL0EgY29tcGxleCBmYWN0b3IgcmVsYXRpbmcgdGhlIHN1cmZhY2UgYXJlYSB0byB0aGUgbW9tZW50IG9mIGluZXJ0aWEuCisgICAgSU1BUV9IWURSQVVMSUMgICAgICAgICAgICAgICAgICAgID0gNDcsICAgICAgICAgIC8vUGFydGljbGUgYXJlYS9wYXJ0aWNsZSBwZXJpbWV0ZXIuCisgICAgSU1BUV9XQURETEVfRElTSyAgICAgICAgICAgICAgICAgID0gNDgsICAgICAgICAgIC8vRGlhbWV0ZXIgb2YgdGhlIGRpc2sgaGF2aW5nIHRoZSBzYW1lIGFyZWEgYXMgdGhlIHBhcnRpY2xlIGluIHVzZXIgdW5pdHMuCisgICAgSU1BUV9ESUFHT05BTCAgICAgICAgICAgICAgICAgICAgID0gNDksICAgICAgICAgIC8vRGlhZ29uYWwgb2YgYW4gZXF1aXZhbGVudCByZWN0YW5nbGUgaW4gdXNlciB1bml0cy4KKyAgICBJTUFRX01FQVNVUkVNRU5UX1ZBTFVFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IE1lYXN1cmVtZW50VmFsdWU7CisKK3R5cGVkZWYgZW51bSBTY2FsaW5nTW9kZV9lbnVtIHsKKyAgICBJTUFRX1NDQUxFX0xBUkdFUiAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIGR1cGxpY2F0ZXMgcGl4ZWxzIHRvIG1ha2UgdGhlIGltYWdlIGxhcmdlci4KKyAgICBJTUFRX1NDQUxFX1NNQUxMRVIgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHN1YnNhbXBsZXMgcGl4ZWxzIHRvIG1ha2UgdGhlIGltYWdlIHNtYWxsZXIuCisgICAgSU1BUV9TQ0FMSU5HX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gU2NhbGluZ01vZGU7CisKK3R5cGVkZWYgZW51bSBTY2FsaW5nTWV0aG9kX2VudW0geworICAgIElNQVFfU0NBTEVfVE9fUFJFU0VSVkVfQVJFQSAgICA9IDAsICAgICAgICAgICAvL0NvcnJlY3Rpb24gZnVuY3Rpb25zIHNjYWxlIHRoZSBpbWFnZSBzdWNoIHRoYXQgdGhlIGZlYXR1cmVzIGluIHRoZSBjb3JyZWN0ZWQgaW1hZ2UgaGF2ZSB0aGUgc2FtZSBhcmVhIGFzIHRoZSBmZWF0dXJlcyBpbiB0aGUgaW5wdXQgaW1hZ2UuCisgICAgSU1BUV9TQ0FMRV9UT19GSVQgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vQ29ycmVjdGlvbiBmdW5jdGlvbnMgc2NhbGUgdGhlIGltYWdlIHN1Y2ggdGhhdCB0aGUgY29ycmVjdGVkIGltYWdlIGlzIHRoZSBzYW1lIHNpemUgYXMgdGhlIGlucHV0IGltYWdlLgorICAgIElNQVFfU0NBTElOR19NRVRIT0RfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gU2NhbGluZ01ldGhvZDsKKwordHlwZWRlZiBlbnVtIFJlZmVyZW5jZU1vZGVfZW51bSB7CisgICAgSU1BUV9DT09SRF9YX1kgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vVGhpcyBtZXRob2QgcmVxdWlyZXMgdGhyZWUgZWxlbWVudHMgaW4gdGhlIHBvaW50cyBhcnJheS4KKyAgICBJTUFRX0NPT1JEX09SSUdJTl9YICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGlzIG1ldGhvZCByZXF1aXJlcyB0d28gZWxlbWVudHMgaW4gdGhlIHBvaW50cyBhcnJheS4KKyAgICBJTUFRX1JFRkVSRU5DRV9NT0RFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IFJlZmVyZW5jZU1vZGU7CisKK3R5cGVkZWYgZW51bSBSZWN0T3JpZW50YXRpb25fZW51bSB7CisgICAgSU1BUV9CQVNFX0lOU0lERSAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhhdCB0aGUgYmFzZSBvZiB0aGUgcmVjdGFuZ3VsYXIgaW1hZ2UgbGllcyBhbG9uZyB0aGUgaW5zaWRlIGVkZ2Ugb2YgdGhlIGFubnVsdXMuCisgICAgSU1BUV9CQVNFX09VVFNJREUgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhhdCB0aGUgYmFzZSBvZiB0aGUgcmVjdGFuZ3VsYXIgaW1hZ2UgbGllcyBhbG9uZyB0aGUgb3V0c2lkZSBlZGdlIG9mIHRoZSBhbm51bHVzLgorICAgIElNQVFfVEVYVF9PUklFTlRBVElPTl9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBSZWN0T3JpZW50YXRpb247CisKK3R5cGVkZWYgZW51bSBTaGFwZU1vZGVfZW51bSB7CisgICAgSU1BUV9TSEFQRV9SRUNUICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gZHJhd3MgYSByZWN0YW5nbGUuCisgICAgSU1BUV9TSEFQRV9PVkFMICAgICAgICAgICAgPSAyLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gZHJhd3MgYW4gb3ZhbC4KKyAgICBJTUFRX1NIQVBFX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gU2hhcGVNb2RlOworCit0eXBlZGVmIGVudW0gUG9sYXJpdHlUeXBlX2VudW0geworICAgIElNQVFfRURHRV9SSVNJTkcgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vVGhlIGVkZ2UgaXMgYSByaXNpbmcgZWRnZS4KKyAgICBJTUFRX0VER0VfRkFMTElORyAgICAgICAgICAgICA9IC0xLCAgICAgICAgICAvL1RoZSBlZGdlIGlzIGEgZmFsbGluZyBlZGdlLgorICAgIElNQVFfUE9MQVJJVFlfVFlQRV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBQb2xhcml0eVR5cGU7CisKK3R5cGVkZWYgZW51bSBTaXplVHlwZV9lbnVtIHsKKyAgICBJTUFRX0tFRVBfTEFSR0UgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIGtlZXBzIGxhcmdlIHBhcnRpY2xlcyByZW1haW5pbmcgYWZ0ZXIgdGhlIGVyb3Npb24uCisgICAgSU1BUV9LRUVQX1NNQUxMICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBrZWVwcyBzbWFsbCBwYXJ0aWNsZXMgZWxpbWluYXRlZCBieSB0aGUgZXJvc2lvbi4KKyAgICBJTUFRX1NJWkVfVFlQRV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBTaXplVHlwZTsKKwordHlwZWRlZiBlbnVtIFBsYW5lM0RfZW51bSB7CisgICAgSU1BUV8zRF9SRUFMICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHNob3dzIHRoZSByZWFsIHBhcnQgb2YgY29tcGxleCBpbWFnZXMuCisgICAgSU1BUV8zRF9JTUFHSU5BUlkgICAgICAgID0gMSwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHNob3dzIHRoZSBpbWFnaW5hcnkgcGFydCBvZiBjb21wbGV4IGltYWdlcy4KKyAgICBJTUFRXzNEX01BR05JVFVERSAgICAgICAgPSAyLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gc2hvd3MgdGhlIG1hZ25pdHVkZSBwYXJ0IG9mIGNvbXBsZXggaW1hZ2VzLgorICAgIElNQVFfM0RfUEhBU0UgICAgICAgICAgICA9IDMsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBzaG93cyB0aGUgcGhhc2UgcGFydCBvZiBjb21wbGV4IGltYWdlcy4KKyAgICBJTUFRX1BMQU5FXzNEX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IFBsYW5lM0Q7CisKK3R5cGVkZWYgZW51bSBQaG90b21ldHJpY01vZGVfZW51bSB7CisgICAgSU1BUV9XSElURV9JU19aRVJPICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gaW50ZXJwcmV0cyB6ZXJvLXZhbHVlIHBpeGVscyBhcyB3aGl0ZS4KKyAgICBJTUFRX0JMQUNLX0lTX1pFUk8gICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBpbnRlcnByZXRzIHplcm8tdmFsdWUgcGl4ZWxzIGFzIGJsYWNrLgorICAgIElNQVFfUEhPVE9NRVRSSUNfTU9ERV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBQaG90b21ldHJpY01vZGU7CisKK3R5cGVkZWYgZW51bSBQYXJ0aWNsZUluZm9Nb2RlX2VudW0geworICAgIElNQVFfQkFTSUNfSU5GTyAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gcmV0dXJucyBvbmx5IHRoZSBmb2xsb3dpbmcgZWxlbWVudHMgb2YgZWFjaCByZXBvcnQ6IGFyZWEsIGNhbGlicmF0ZWRBcmVhLCBib3VuZGluZ1JlY3QuCisgICAgSU1BUV9BTExfSU5GTyAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiByZXR1cm5zIGFsbCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgZWFjaCBwYXJ0aWNsZS4KKyAgICBJTUFRX1BBUlRJQ0xFX0lORk9fTU9ERV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBQYXJ0aWNsZUluZm9Nb2RlOworCit0eXBlZGVmIGVudW0gT3V0bGluZU1ldGhvZF9lbnVtIHsKKyAgICBJTUFRX0VER0VfRElGRkVSRU5DRSAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdXNlcyBhIG1ldGhvZCB0aGF0IHByb2R1Y2VzIGNvbnRpbnVvdXMgY29udG91cnMgYnkgaGlnaGxpZ2h0aW5nIGVhY2ggcGl4ZWwgd2hlcmUgYW4gaW50ZW5zaXR5IHZhcmlhdGlvbiBvY2N1cnMgYmV0d2VlbiBpdHNlbGYgYW5kIGl0cyB0aHJlZSB1cHBlci1sZWZ0IG5laWdoYm9ycy4KKyAgICBJTUFRX0VER0VfR1JBRElFTlQgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdXNlcyBhIG1ldGhvZCB0aGF0IG91dGxpbmVzIGNvbnRvdXJzIHdoZXJlIGFuIGludGVuc2l0eSB2YXJpYXRpb24gb2NjdXJzIGFsb25nIHRoZSB2ZXJ0aWNhbCBheGlzLgorICAgIElNQVFfRURHRV9QUkVXSVRUICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB1c2VzIGEgbWV0aG9kIHRoYXQgZXh0cmFjdHMgdGhlIG91dGVyIGNvbnRvdXJzIG9mIG9iamVjdHMuCisgICAgSU1BUV9FREdFX1JPQkVSVFMgICAgICAgICAgICAgID0gMywgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHVzZXMgYSBtZXRob2QgdGhhdCBvdXRsaW5lcyB0aGUgY29udG91cnMgdGhhdCBoaWdobGlnaHQgcGl4ZWxzIHdoZXJlIGFuIGludGVuc2l0eSB2YXJpYXRpb24gb2NjdXJzIGFsb25nIHRoZSBkaWFnb25hbCBheGVzLgorICAgIElNQVFfRURHRV9TSUdNQSAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB1c2VzIGEgbWV0aG9kIHRoYXQgb3V0bGluZXMgY29udG91cnMgYW5kIGRldGFpbHMgYnkgc2V0dGluZyBwaXhlbHMgdG8gdGhlIG1lYW4gdmFsdWUgZm91bmQgaW4gdGhlaXIgbmVpZ2hib3Job29kLCBpZiB0aGVpciBkZXZpYXRpb24gZnJvbSB0aGlzIHZhbHVlIGlzIG5vdCBzaWduaWZpY2FudC4KKyAgICBJTUFRX0VER0VfU09CRUwgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdXNlcyBhIG1ldGhvZCB0aGF0IGV4dHJhY3RzIHRoZSBvdXRlciBjb250b3VycyBvZiBvYmplY3RzLgorICAgIElNQVFfT1VUTElORV9NRVRIT0RfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gT3V0bGluZU1ldGhvZDsKKwordHlwZWRlZiBlbnVtIE1vcnBob2xvZ3lNZXRob2RfZW51bSB7CisgICAgSU1BUV9BVVRPTSAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHVzZXMgYSB0cmFuc2Zvcm1hdGlvbiB0aGF0IGdlbmVyYXRlcyBzaW1wbGVyIHBhcnRpY2xlcyB0aGF0IGNvbnRhaW4gZmV3ZXIgZGV0YWlscy4KKyAgICBJTUFRX0NMT1NFICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdXNlcyBhIHRyYW5zZm9ybWF0aW9uIHRoYXQgZmlsbHMgdGlueSBob2xlcyBhbmQgc21vb3RocyBib3VuZGFyaWVzLgorICAgIElNQVFfRElMQVRFICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB1c2VzIGEgdHJhbnNmb3JtYXRpb24gdGhhdCBlbGltaW5hdGVzIHRpbnkgaG9sZXMgaXNvbGF0ZWQgaW4gcGFydGljbGVzIGFuZCBleHBhbmRzIHRoZSBjb250b3VyIG9mIHRoZSBwYXJ0aWNsZXMgYWNjb3JkaW5nIHRvIHRoZSB0ZW1wbGF0ZSBkZWZpbmVkIGJ5IHRoZSBzdHJ1Y3R1cmluZyBlbGVtZW50LgorICAgIElNQVFfRVJPREUgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB1c2VzIGEgdHJhbnNmb3JtYXRpb24gdGhhdCBlbGltaW5hdGVzIHBpeGVscyBpc29sYXRlZCBpbiB0aGUgYmFja2dyb3VuZCBhbmQgZXJvZGVzIHRoZSBjb250b3VyIG9mIHBhcnRpY2xlcyBhY2NvcmRpbmcgdG8gdGhlIHRlbXBsYXRlIGRlZmluZWQgYnkgdGhlIHN0cnVjdHVyaW5nIGVsZW1lbnQuCisgICAgSU1BUV9HUkFESUVOVCAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHVzZXMgYSB0cmFuc2Zvcm1hdGlvbiB0aGF0IGxlYXZlcyBvbmx5IHRoZSBwaXhlbHMgdGhhdCB3b3VsZCBiZSBhZGRlZCBieSB0aGUgZGlsYXRpb24gcHJvY2VzcyBvciBlbGltaW5hdGVkIGJ5IHRoZSBlcm9zaW9uIHByb2Nlc3MuCisgICAgSU1BUV9HUkFESUVOVE9VVCAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHVzZXMgYSB0cmFuc2Zvcm1hdGlvbiB0aGF0IGxlYXZlcyBvbmx5IHRoZSBwaXhlbHMgdGhhdCB3b3VsZCBiZSBhZGRlZCBieSB0aGUgZGlsYXRpb24gcHJvY2Vzcy4KKyAgICBJTUFRX0dSQURJRU5USU4gICAgICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdXNlcyBhIHRyYW5zZm9ybWF0aW9uIHRoYXQgbGVhdmVzIG9ubHkgdGhlIHBpeGVscyB0aGF0IHdvdWxkIGJlIGVsaW1pbmF0ZWQgYnkgdGhlIGVyb3Npb24gcHJvY2Vzcy4KKyAgICBJTUFRX0hJVE1JU1MgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdXNlcyBhIHRyYW5zZm9ybWF0aW9uIHRoYXQgZXh0cmFjdHMgZWFjaCBwaXhlbCBsb2NhdGVkIGluIGEgbmVpZ2hib3Job29kIGV4YWN0bHkgbWF0Y2hpbmcgdGhlIHRlbXBsYXRlIGRlZmluZWQgYnkgdGhlIHN0cnVjdHVyaW5nIGVsZW1lbnQuCisgICAgSU1BUV9PUEVOICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHVzZXMgYSB0cmFuc2Zvcm1hdGlvbiB0aGF0IHJlbW92ZXMgc21hbGwgcGFydGljbGVzIGFuZCBzbW9vdGhzIGJvdW5kYXJpZXMuCisgICAgSU1BUV9QQ0xPU0UgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHVzZXMgYSB0cmFuc2Zvcm1hdGlvbiB0aGF0IGZpbGxzIHRpbnkgaG9sZXMgYW5kIHNtb290aHMgdGhlIGlubmVyIGNvbnRvdXIgb2YgcGFydGljbGVzIGFjY29yZGluZyB0byB0aGUgdGVtcGxhdGUgZGVmaW5lZCBieSB0aGUgc3RydWN0dXJpbmcgZWxlbWVudC4KKyAgICBJTUFRX1BPUEVOICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdXNlcyBhIHRyYW5zZm9ybWF0aW9uIHRoYXQgcmVtb3ZlcyBzbWFsbCBwYXJ0aWNsZXMgYW5kIHNtb290aHMgdGhlIGNvbnRvdXIgb2YgcGFydGljbGVzIGFjY29yZGluZyB0byB0aGUgdGVtcGxhdGUgZGVmaW5lZCBieSB0aGUgc3RydWN0dXJpbmcgZWxlbWVudC4KKyAgICBJTUFRX1RISUNLICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdXNlcyBhIHRyYW5zZm9ybWF0aW9uIHRoYXQgYWRkcyB0byBhbiBpbWFnZSB0aG9zZSBwaXhlbHMgbG9jYXRlZCBpbiBhIG5laWdoYm9yaG9vZCB0aGF0IG1hdGNoZXMgYSB0ZW1wbGF0ZSBzcGVjaWZpZWQgYnkgdGhlIHN0cnVjdHVyaW5nIGVsZW1lbnQuCisgICAgSU1BUV9USElOICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIsICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHVzZXMgYSB0cmFuc2Zvcm1hdGlvbiB0aGF0IGVsaW1pbmF0ZXMgcGl4ZWxzIHRoYXQgYXJlIGxvY2F0ZWQgaW4gYSBuZWlnaGJvcmhvb2QgbWF0Y2hpbmcgYSB0ZW1wbGF0ZSBzcGVjaWZpZWQgYnkgdGhlIHN0cnVjdHVyaW5nIGVsZW1lbnQuCisgICAgSU1BUV9NT1JQSE9MT0dZX01FVEhPRF9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBNb3JwaG9sb2d5TWV0aG9kOworCit0eXBlZGVmIGVudW0gTWV0ZXJBcmNNb2RlX2VudW0geworICAgIElNQVFfTUVURVJfQVJDX1JPSSAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB1c2VzIHRoZSByb2kgcGFyYW1ldGVyIGFuZCBpZ25vcmVzIHRoZSBiYXNlLCBzdGFydCwgYW5kIGVuZCBwYXJhbWV0ZXJzLgorICAgIElNQVFfTUVURVJfQVJDX1BPSU5UUyAgICAgICAgICA9IDEsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB1c2VzIHRoZSBiYXNlLHN0YXJ0LCBhbmQgZW5kIHBhcmFtZXRlcnMgYW5kIGlnbm9yZXMgdGhlIHJvaSBwYXJhbWV0ZXIuCisgICAgSU1BUV9NRVRFUl9BUkNfTU9ERV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBNZXRlckFyY01vZGU7CisKK3R5cGVkZWYgZW51bSBSYWtlRGlyZWN0aW9uX2VudW0geworICAgIElNQVFfTEVGVF9UT19SSUdIVCAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBzZWFyY2hlcyBmcm9tIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIHNlYXJjaCBhcmVhIHRvIHRoZSByaWdodCBzaWRlIG9mIHRoZSBzZWFyY2ggYXJlYS4KKyAgICBJTUFRX1JJR0hUX1RPX0xFRlQgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gc2VhcmNoZXMgZnJvbSB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgc2VhcmNoIGFyZWEgdG8gdGhlIGxlZnQgc2lkZSBvZiB0aGUgc2VhcmNoIGFyZWEuCisgICAgSU1BUV9UT1BfVE9fQk9UVE9NICAgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHNlYXJjaGVzIGZyb20gdGhlIHRvcCBzaWRlIG9mIHRoZSBzZWFyY2ggYXJlYSB0byB0aGUgYm90dG9tIHNpZGUgb2YgdGhlIHNlYXJjaCBhcmVhLgorICAgIElNQVFfQk9UVE9NX1RPX1RPUCAgICAgICAgICAgICA9IDMsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBzZWFyY2hlcyBmcm9tIHRoZSBib3R0b20gc2lkZSBvZiB0aGUgc2VhcmNoIGFyZWEgdG8gdGhlIHRvcCBzaWRlIG9mIHRoZSBzZWFyY2ggYXJlYS4KKyAgICBJTUFRX1JBS0VfRElSRUNUSU9OX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IFJha2VEaXJlY3Rpb247CisKK3R5cGVkZWYgZW51bSBUcnVuY2F0ZU1vZGVfZW51bSB7CisgICAgSU1BUV9UUlVOQ0FURV9MT1cgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdHJ1bmNhdGVzIGxvdyBmcmVxdWVuY2llcy4KKyAgICBJTUFRX1RSVU5DQVRFX0hJR0ggICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB0cnVuY2F0ZXMgaGlnaCBmcmVxdWVuY2llcy4KKyAgICBJTUFRX1RSVU5DQVRFX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gVHJ1bmNhdGVNb2RlOworCit0eXBlZGVmIGVudW0gQXR0ZW51YXRlTW9kZV9lbnVtIHsKKyAgICBJTUFRX0FUVEVOVUFURV9MT1cgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gYXR0ZW51YXRlcyBsb3cgZnJlcXVlbmNpZXMuCisgICAgSU1BUV9BVFRFTlVBVEVfSElHSCAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIGF0dGVudWF0ZXMgaGlnaCBmcmVxdWVuY2llcy4KKyAgICBJTUFRX0FUVEVOVUFURV9NT0RFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IEF0dGVudWF0ZU1vZGU7CisKK3R5cGVkZWYgZW51bSBXaW5kb3dUaHJlYWRQb2xpY3lfZW51bSB7CisgICAgSU1BUV9DQUxMSU5HX1RIUkVBRCAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vVXNpbmcgdGhpcyBwb2xpY3ksIE5JIFZpc2lvbiBjcmVhdGVzIHdpbmRvd3MgaW4gdGhlIHRocmVhZCB0aGF0IG1ha2VzIHRoZSBmaXJzdCBkaXNwbGF5IGZ1bmN0aW9uIGNhbGwgZm9yIGEgZ2l2ZW4gd2luZG93IG51bWJlci4KKyAgICBJTUFRX1NFUEFSQVRFX1RIUkVBRCAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9Vc2luZyB0aGlzIHBvbGljeSwgTkkgVmlzaW9uIGNyZWF0ZXMgd2luZG93cyBpbiBhIHNlcGFyYXRlIHRocmVhZCBhbmQgcHJvY2Vzc2VzIG1lc3NhZ2VzIGZvciB0aGUgd2luZG93cyBhdXRvbWF0aWNhbGx5LgorICAgIElNQVFfV0lORE9XX1RIUkVBRF9QT0xJQ1lfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gV2luZG93VGhyZWFkUG9saWN5OworCit0eXBlZGVmIGVudW0gV2luZG93T3B0aW9uc19lbnVtIHsKKyAgICBJTUFRX1dJTkRfUkVTSVpBQkxFICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9XaGVuIHByZXNlbnQsIHRoZSB1c2VyIG1heSByZXNpemUgdGhlIHdpbmRvdyBpbnRlcmFjdGl2ZWx5LgorICAgIElNQVFfV0lORF9USVRMRUJBUiAgICAgICAgICAgICA9IDIsICAgICAgICAgICAvL1doZW4gcHJlc2VudCwgdGhlIHRpdGxlIGJhciBvbiB0aGUgd2luZG93IGlzIHZpc2libGUuCisgICAgSU1BUV9XSU5EX0NMT1NFQUJMRSAgICAgICAgICAgID0gNCwgICAgICAgICAgIC8vV2hlbiBwcmVzZW50LCB0aGUgY2xvc2UgYm94IGlzIGF2YWlsYWJsZS4KKyAgICBJTUFRX1dJTkRfVE9QTU9TVCAgICAgICAgICAgICAgPSA4LCAgICAgICAgICAgLy9XaGVuIHByZXNlbnQsIHRoZSB3aW5kb3cgaXMgYWx3YXlzIG9uIHRvcC4KKyAgICBJTUFRX1dJTkRPV19PUFRJT05TX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IFdpbmRvd09wdGlvbnM7CisKK3R5cGVkZWYgZW51bSBXaW5kb3dFdmVudFR5cGVfZW51bSB7CisgICAgSU1BUV9OT19FVkVOVCAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vTm8gZXZlbnQgb2NjdXJyZWQgc2luY2UgdGhlIGxhc3QgY2FsbCB0byBpbWFxR2V0TGFzdEV2ZW50KCkuCisgICAgSU1BUV9DTElDS19FVkVOVCAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vVGhlIHVzZXIgY2xpY2tlZCBvbiBhIHdpbmRvdy4KKyAgICBJTUFRX0RSQVdfRVZFTlQgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgLy9UaGUgdXNlciBkcmV3IGFuIFJPSSBpbiBhIHdpbmRvdy4KKyAgICBJTUFRX01PVkVfRVZFTlQgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgLy9UaGUgdXNlciBtb3ZlZCBhIHdpbmRvdy4KKyAgICBJTUFRX1NJWkVfRVZFTlQgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgLy9UaGUgdXNlciBzaXplZCBhIHdpbmRvdy4KKyAgICBJTUFRX1NDUk9MTF9FVkVOVCAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgLy9UaGUgdXNlciBzY3JvbGxlZCBhIHdpbmRvdy4KKyAgICBJTUFRX0FDVElWQVRFX0VWRU5UICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgLy9UaGUgdXNlciBhY3RpdmF0ZWQgYSB3aW5kb3cuCisgICAgSU1BUV9DTE9TRV9FVkVOVCAgICAgICAgICAgICAgICAgID0gNywgICAgICAgICAgIC8vVGhlIHVzZXIgY2xvc2VkIGEgd2luZG93LgorICAgIElNQVFfRE9VQkxFX0NMSUNLX0VWRU5UICAgICAgICAgICA9IDgsICAgICAgICAgICAvL1RoZSB1c2VyIGRvdWJsZS1jbGlja2VkIGluIGEgd2luZG93LgorICAgIElNQVFfV0lORE9XX0VWRU5UX1RZUEVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gV2luZG93RXZlbnRUeXBlOworCit0eXBlZGVmIGVudW0gVmlzaW9uSW5mb1R5cGVfZW51bSB7CisgICAgSU1BUV9BTllfVklTSU9OX0lORk8gICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gY2hlY2tzIGlmIGFueSBleHRyYSB2aXNpb24gaW5mb3JtYXRpb24gaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbWFnZS4KKyAgICBJTUFRX1BBVFRFUk5fTUFUQ0hJTkdfSU5GTyAgICAgICA9IDEsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBjaGVja3MgaWYgYW55IHBhdHRlcm4gbWF0Y2hpbmcgdGVtcGxhdGUgaW5mb3JtYXRpb24gaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbWFnZS4KKyAgICBJTUFRX0NBTElCUkFUSU9OX0lORk8gICAgICAgICAgICA9IDIsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBjaGVja3MgaWYgYW55IGNhbGlicmF0aW9uIGluZm9ybWF0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW1hZ2UuCisgICAgSU1BUV9PVkVSTEFZX0lORk8gICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gY2hlY2tzIGlmIGFueSBvdmVybGF5IGluZm9ybWF0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW1hZ2UuCisgICAgSU1BUV9WSVNJT05fSU5GT19UWVBFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IFZpc2lvbkluZm9UeXBlOworCit0eXBlZGVmIGVudW0gU2VhcmNoU3RyYXRlZ3lfZW51bSB7CisgICAgSU1BUV9DT05TRVJWQVRJVkUgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL0luc3RydWN0cyB0aGUgcGF0dGVybiBtYXRjaGluZyBhbGdvcml0aG0gdG8gdXNlIHRoZSBsYXJnZXN0IHBvc3NpYmxlIGFtb3VudCBvZiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbWFnZSBhdCB0aGUgZXhwZW5zZSBvZiBzbG93aW5nIGRvd24gdGhlIHNwZWVkIG9mIHRoZSBhbGdvcml0aG0uCisgICAgSU1BUV9CQUxBTkNFRCAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAvL0luc3RydWN0cyB0aGUgcGF0dGVybiBtYXRjaGluZyBhbGdvcml0aG0gdG8gYmFsYW5jZSB0aGUgYW1vdW50IG9mIGluZm9ybWF0aW9uIGZyb20gdGhlIGltYWdlIGl0IHVzZXMgd2l0aCB0aGUgc3BlZWQgb2YgdGhlIGFsZ29yaXRobS4KKyAgICBJTUFRX0FHR1JFU1NJVkUgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgIC8vSW5zdHJ1Y3RzIHRoZSBwYXR0ZXJuIG1hdGNoaW5nIGFsZ29yaXRobSB0byB1c2UgYSBsb3dlciBhbW91bnQgb2YgaW5mb3JtYXRpb24gZnJvbSB0aGUgaW1hZ2UsIHdoaWNoIGFsbG93cyB0aGUgYWxnb3JpdGhtIHRvIHJ1biBxdWlja2x5IGJ1dCBhdCB0aGUgZXhwZW5zZSBvZiBhY2N1cmFjeS4KKyAgICBJTUFRX1ZFUllfQUdHUkVTU0lWRSAgICAgICAgICAgID0gNCwgICAgICAgICAgIC8vSW5zdHJ1Y3RzIHRoZSBwYXR0ZXJuIG1hdGNoaW5nIGFsZ29yaXRobSB0byB1c2UgdGhlIHNtYWxsZXN0IHBvc3NpYmxlIGFtb3VudCBvZiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbWFnZSwgd2hpY2ggYWxsb3dzIHRoZSBhbGdvcml0aG0gdG8gcnVuIGF0IHRoZSBoaWdoZXN0IHNwZWVkIHBvc3NpYmxlIGJ1dCBhdCB0aGUgZXhwZW5zZSBvZiBhY2N1cmFjeS4KKyAgICBJTUFRX1NFQVJDSF9TVFJBVEVHWV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBTZWFyY2hTdHJhdGVneTsKKwordHlwZWRlZiBlbnVtIFR3b0VkZ2VQb2xhcml0eVR5cGVfZW51bSB7CisgICAgSU1BUV9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gaWdub3JlcyB0aGUgcG9sYXJpdHkgb2YgdGhlIGVkZ2VzLgorICAgIElNQVFfUklTSU5HX0ZBTExJTkcgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vVGhlIHBvbGFyaXR5IG9mIHRoZSBmaXJzdCBlZGdlIGlzIHJpc2luZyAoZGFyayB0byBsaWdodCkgYW5kIHRoZSBwb2xhcml0eSBvZiB0aGUgc2Vjb25kIGVkZ2UgaXMgZmFsbGluZyAobGlnaHQgdG8gZGFyaykuCisgICAgSU1BUV9GQUxMSU5HX1JJU0lORyAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgLy9UaGUgcG9sYXJpdHkgb2YgdGhlIGZpcnN0IGVkZ2UgaXMgZmFsbGluZyAobGlnaHQgdG8gZGFyaykgYW5kIHRoZSBwb2xhcml0eSBvZiB0aGUgc2Vjb25kIGVkZ2UgaXMgcmlzaW5nIChkYXJrIHRvIGxpZ2h0KS4KKyAgICBJTUFRX1JJU0lOR19SSVNJTkcgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAvL1RoZSBwb2xhcml0eSBvZiB0aGUgZmlyc3QgZWRnZSBpcyByaXNpbmcgKGRhcmsgdG8gbGlnaHQpIGFuZCB0aGUgcG9sYXJpdHkgb2YgdGhlIHNlY29uZCBlZGdlIGlzIHJpc2luZyAoZGFyayB0byBsaWdodCkuCisgICAgSU1BUV9GQUxMSU5HX0ZBTExJTkcgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgLy9UaGUgcG9sYXJpdHkgb2YgdGhlIGZpcnN0IGVkZ2UgaXMgZmFsbGluZyAobGlnaHQgdG8gZGFyaykgYW5kIHRoZSBwb2xhcml0eSBvZiB0aGUgc2Vjb25kIGVkZ2UgaXMgZmFsbGluZyAobGlnaHQgdG8gZGFyaykuCisgICAgSU1BUV9UV09fRURHRV9QT0xBUklUWV9UWVBFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IFR3b0VkZ2VQb2xhcml0eVR5cGU7CisKK3R5cGVkZWYgZW51bSBPYmplY3RUeXBlX2VudW0geworICAgIElNQVFfQlJJR0hUX09CSkVDVFMgICAgICAgICA9IDAsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBkZXRlY3RzIGJyaWdodCBvYmplY3RzLgorICAgIElNQVFfREFSS19PQkpFQ1RTICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBkZXRlY3RzIGRhcmsgb2JqZWN0cy4KKyAgICBJTUFRX09CSkVDVF9UWVBFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IE9iamVjdFR5cGU7CisKK3R5cGVkZWYgZW51bSBUb29sX2VudW0geworICAgIElNQVFfTk9fVE9PTCAgICAgICAgICAgICAgPSAtMSwgICAgICAgICAgLy9ObyB0b29sIGlzIGluIHRoZSBzZWxlY3RlZCBzdGF0ZS4KKyAgICBJTUFRX1NFTEVDVElPTl9UT09MICAgICAgID0gMCwgICAgICAgICAgIC8vVGhlIHNlbGVjdGlvbiB0b29sIHNlbGVjdHMgYW4gZXhpc3RpbmcgUk9JIGluIGFuIGltYWdlLgorICAgIElNQVFfUE9JTlRfVE9PTCAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgcG9pbnQgdG9vbCBkcmF3cyBhIHBvaW50IG9uIHRoZSBpbWFnZS4KKyAgICBJTUFRX0xJTkVfVE9PTCAgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vVGhlIGxpbmUgdG9vbCBkcmF3cyBhIGxpbmUgb24gdGhlIGltYWdlLgorICAgIElNQVFfUkVDVEFOR0xFX1RPT0wgICAgICAgPSAzLCAgICAgICAgICAgLy9UaGUgcmVjdGFuZ2xlIHRvb2wgZHJhd3MgYSByZWN0YW5nbGUgb24gdGhlIGltYWdlLgorICAgIElNQVFfT1ZBTF9UT09MICAgICAgICAgICAgPSA0LCAgICAgICAgICAgLy9UaGUgb3ZhbCB0b29sIGRyYXdzIGFuIG92YWwgb24gdGhlIGltYWdlLgorICAgIElNQVFfUE9MWUdPTl9UT09MICAgICAgICAgPSA1LCAgICAgICAgICAgLy9UaGUgcG9seWdvbiB0b29sIGRyYXdzIGEgcG9seWdvbiBvbiB0aGUgaW1hZ2UuCisgICAgSU1BUV9DTE9TRURfRlJFRUhBTkRfVE9PTCA9IDYsICAgICAgICAgICAvL1RoZSBjbG9zZWQgZnJlZWhhbmQgdG9vbCBkcmF3cyBjbG9zZWQgZnJlZWhhbmQgc2hhcGVzIG9uIHRoZSBpbWFnZS4KKyAgICBJTUFRX0FOTlVMVVNfVE9PTCAgICAgICAgID0gNywgICAgICAgICAgIC8vVGhlIGFubnVsdXMgdG9vbCBkcmF3cyBhbm51bHVzZXMgb24gdGhlIGltYWdlLgorICAgIElNQVFfWk9PTV9UT09MICAgICAgICAgICAgPSA4LCAgICAgICAgICAgLy9UaGUgem9vbSB0b29sIGNvbnRyb2xzIHRoZSB6b29tIG9mIGFuIGltYWdlLgorICAgIElNQVFfUEFOX1RPT0wgICAgICAgICAgICAgPSA5LCAgICAgICAgICAgLy9UaGUgcGFuIHRvb2wgc2hpZnRzIHRoZSB2aWV3IG9mIHRoZSBpbWFnZS4KKyAgICBJTUFRX1BPTFlMSU5FX1RPT0wgICAgICAgID0gMTAsICAgICAgICAgIC8vVGhlIHBvbHlsaW5lIHRvb2wgZHJhd3MgYSBzZXJpZXMgb2YgY29ubmVjdGVkIHN0cmFpZ2h0IGxpbmVzIG9uIHRoZSBpbWFnZS4KKyAgICBJTUFRX0ZSRUVIQU5EX1RPT0wgICAgICAgID0gMTEsICAgICAgICAgIC8vVGhlIGZyZWVoYW5kIHRvb2wgZHJhd3MgZnJlZWhhbmQgbGluZXMgb24gdGhlIGltYWdlLgorICAgIElNQVFfUk9UQVRFRF9SRUNUX1RPT0wgICAgPSAxMiwgICAgICAgICAgLy9UaGUgcm90YXRlZCByZWN0YW5nbGUgdG9vbCBkcmF3cyByb3RhdGVkIHJlY3RhbmdsZXMgb24gdGhlIGltYWdlLgorICAgIElNQVFfWk9PTV9PVVRfVE9PTCAgICAgICAgPSAxMywgICAgICAgICAgLy9UaGUgem9vbSBvdXQgdG9vbCBjb250cm9scyB0aGUgem9vbSBvZiBhbiBpbWFnZS4KKyAgICBJTUFRX1RPT0xfU0laRV9HVUFSRCAgICAgID0gMHhGRkZGRkZGRiAgIAorfSBUb29sOworCit0eXBlZGVmIGVudW0gVElGRkNvbXByZXNzaW9uVHlwZV9lbnVtIHsKKyAgICBJTUFRX05PX0NPTVBSRVNTSU9OICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIGRvZXMgbm90IGNvbXByZXNzIHRoZSBUSUZGIGZpbGUuCisgICAgSU1BUV9KUEVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB1c2VzIHRoZSBKUEVHIGNvbXByZXNzaW9uIGFsZ29yaXRobSB0byBjb21wcmVzcyB0aGUgVElGRiBmaWxlLgorICAgIElNQVFfUlVOX0xFTkdUSCAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdXNlcyBhIHJ1biBsZW5ndGggY29tcHJlc3Npb24gYWxnb3JpdGhtIHRvIGNvbXByZXNzIHRoZSBUSUZGIGZpbGUuCisgICAgSU1BUV9aSVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB1c2VzIHRoZSBaSVAgY29tcHJlc3Npb24gYWxnb3JpdGhtIHRvIGNvbXByZXNzIHRoZSBUSUZGIGZpbGUuCisgICAgSU1BUV9USUZGX0NPTVBSRVNTSU9OX1RZUEVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gVElGRkNvbXByZXNzaW9uVHlwZTsKKwordHlwZWRlZiBlbnVtIFRocmVzaG9sZE1ldGhvZF9lbnVtIHsKKyAgICBJTUFRX1RIUkVTSF9DTFVTVEVSSU5HICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB1c2VzIGEgbWV0aG9kIHRoYXQgc29ydHMgdGhlIGhpc3RvZ3JhbSBvZiB0aGUgaW1hZ2Ugd2l0aGluIGEgZGlzY3JldGUgbnVtYmVyIG9mIGNsYXNzZXMgY29ycmVzcG9uZGluZyB0byB0aGUgbnVtYmVyIG9mIHBoYXNlcyBwZXJjZWl2ZWQgaW4gYW4gaW1hZ2UuCisgICAgSU1BUV9USFJFU0hfRU5UUk9QWSAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdXNlcyBhIG1ldGhvZCB0aGF0IGlzIGJlc3QgZm9yIGRldGVjdGluZyBwYXJ0aWNsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiBtaW51c2N1bGUgcHJvcG9ydGlvbnMgb24gdGhlIGltYWdlLgorICAgIElNQVFfVEhSRVNIX01FVFJJQyAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHVzZXMgYSBtZXRob2QgdGhhdCBpcyB3ZWxsLXN1aXRlZCBmb3IgaW1hZ2VzIGluIHdoaWNoIGNsYXNzZXMgYXJlIG5vdCB0b28gZGlzcHJvcG9ydGlvbmF0ZS4KKyAgICBJTUFRX1RIUkVTSF9NT01FTlRTICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB1c2VzIGEgbWV0aG9kIHRoYXQgaXMgc3VpdGVkIGZvciBpbWFnZXMgdGhhdCBoYXZlIHBvb3IgY29udHJhc3QuCisgICAgSU1BUV9USFJFU0hfSU5URVJDTEFTUyAgICAgICAgICAgPSA0LCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdXNlcyBhIG1ldGhvZCB0aGF0IGlzIHdlbGwtc3VpdGVkIGZvciBpbWFnZXMgaW4gd2hpY2ggY2xhc3NlcyBoYXZlIHdlbGwgc2VwYXJhdGVkIHBpeGVsIHZhbHVlIGRpc3RyaWJ1dGlvbnMuCisgICAgSU1BUV9USFJFU0hPTERfTUVUSE9EX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IFRocmVzaG9sZE1ldGhvZDsKKwordHlwZWRlZiBlbnVtIFRleHRBbGlnbm1lbnRfZW51bSB7CisgICAgSU1BUV9MRUZUICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vTGVmdCBhbGlnbnMgdGhlIHRleHQgYXQgdGhlIHJlZmVyZW5jZSBwb2ludC4KKyAgICBJTUFRX0NFTlRFUiAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9DZW50ZXJzIHRoZSB0ZXh0IGFyb3VuZCB0aGUgcmVmZXJlbmNlIHBvaW50LgorICAgIElNQVFfUklHSFQgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAvL1JpZ2h0IGFsaWducyB0aGUgdGV4dCBhdCB0aGUgcmVmZXJlbmNlIHBvaW50LgorICAgIElNQVFfVEVYVF9BTElHTk1FTlRfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gVGV4dEFsaWdubWVudDsKKwordHlwZWRlZiBlbnVtIFNwb2tlRGlyZWN0aW9uX2VudW0geworICAgIElNQVFfT1VUU0lERV9UT19JTlNJREUgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gc2VhcmNoZXMgZnJvbSB0aGUgb3V0c2lkZSBvZiB0aGUgc2VhcmNoIGFyZWEgdG8gdGhlIGluc2lkZSBvZiB0aGUgc2VhcmNoIGFyZWEuCisgICAgSU1BUV9JTlNJREVfVE9fT1VUU0lERSAgICAgICAgICA9IDEsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBzZWFyY2hlcyBmcm9tIHRoZSBpbnNpZGUgb2YgdGhlIHNlYXJjaCBhcmVhIHRvIHRoZSBvdXRzaWRlIG9mIHRoZSBzZWFyY2ggYXJlYS4KKyAgICBJTUFRX1NQT0tFX0RJUkVDVElPTl9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBTcG9rZURpcmVjdGlvbjsKKwordHlwZWRlZiBlbnVtIFNrZWxldG9uTWV0aG9kX2VudW0geworICAgIElNQVFfU0tFTEVUT05fTCAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9Vc2VzIGFuIEwtc2hhcGVkIHN0cnVjdHVyaW5nIGVsZW1lbnQgaW4gdGhlIHNrZWxldG9uIGZ1bmN0aW9uLgorICAgIElNQVFfU0tFTEVUT05fTSAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9Vc2VzIGFuIE0tc2hhcGVkIHN0cnVjdHVyaW5nIGVsZW1lbnQgaW4gdGhlIHNrZWxldG9uIGZ1bmN0aW9uLgorICAgIElNQVFfU0tFTEVUT05fSU5WRVJTRSAgICAgICAgICAgPSAyLCAgICAgICAgICAgLy9Vc2VzIGFuIEwtc2hhcGVkIHN0cnVjdHVyaW5nIGVsZW1lbnQgb24gYW4gaW52ZXJzZSBvZiB0aGUgaW1hZ2UgaW4gdGhlIHNrZWxldG9uIGZ1bmN0aW9uLgorICAgIElNQVFfU0tFTEVUT05fTUVUSE9EX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IFNrZWxldG9uTWV0aG9kOworCit0eXBlZGVmIGVudW0gVmVydGljYWxUZXh0QWxpZ25tZW50X2VudW0geworICAgIElNQVFfQk9UVE9NICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL0FsaWducyB0aGUgYm90dG9tIG9mIHRoZSB0ZXh0IGF0IHRoZSByZWZlcmVuY2UgcG9pbnQuCisgICAgSU1BUV9UT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vQWxpZ25zIHRoZSB0b3Agb2YgdGhlIHRleHQgYXQgdGhlIHJlZmVyZW5jZSBwb2ludC4KKyAgICBJTUFRX0JBU0VMSU5FICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgLy9BbGlnbnMgdGhlIGJhc2VsaW5lIG9mIHRoZSB0ZXh0IGF0IHRoZSByZWZlcmVuY2UgcG9pbnQuCisgICAgSU1BUV9WRVJUSUNBTF9URVhUX0FMSUdOTUVOVF9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBWZXJ0aWNhbFRleHRBbGlnbm1lbnQ7CisKK3R5cGVkZWYgZW51bSBDYWxpYnJhdGlvblJPSV9lbnVtIHsKKyAgICBJTUFRX0ZVTExfSU1BR0UgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vVGhlIGNvcnJlY3Rpb24gZnVuY3Rpb24gY29ycmVjdHMgdGhlIHdob2xlIGltYWdlLCByZWdhcmRsZXNzIG9mIHRoZSB1c2VyLWRlZmluZWQgb3IgY2FsaWJyYXRpb24tZGVmaW5lZCBST0lzLgorICAgIElNQVFfQ0FMSUJSQVRJT05fUk9JICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgY29ycmVjdGlvbiBmdW5jdGlvbiBjb3JyZWN0cyB0aGUgYXJlYSBkZWZpbmVkIGJ5IHRoZSBjYWxpYnJhdGlvbiBST0kuCisgICAgSU1BUV9VU0VSX1JPSSAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAvL1RoZSBjb3JyZWN0aW9uIGZ1bmN0aW9uIGNvcnJlY3RzIHRoZSBhcmVhIGRlZmluZWQgYnkgdGhlIHVzZXItZGVmaW5lZCBST0kuCisgICAgSU1BUV9DQUxJQlJBVElPTl9BTkRfVVNFUl9ST0kgICA9IDMsICAgICAgICAgICAvL1RoZSBjb3JyZWN0aW9uIGZ1bmN0aW9uIGNvcnJlY3RzIHRoZSBhcmVhIGRlZmluZWQgYnkgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgdXNlci1kZWZpbmVkIFJPSSBhbmQgdGhlIGNhbGlicmF0aW9uIFJPSS4KKyAgICBJTUFRX0NBTElCUkFUSU9OX09SX1VTRVJfUk9JICAgID0gNCwgICAgICAgICAgIC8vVGhlIGNvcnJlY3Rpb24gZnVuY3Rpb24gY29ycmVjdHMgdGhlIGFyZWEgZGVmaW5lZCBieSB0aGUgdW5pb24gb2YgdGhlIHVzZXItZGVmaW5lZCBST0kgYW5kIHRoZSBjYWxpYnJhdGlvbiBST0kuCisgICAgSU1BUV9DQUxJQlJBVElPTl9ST0lfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gQ2FsaWJyYXRpb25ST0k7CisKK3R5cGVkZWYgZW51bSBDb250b3VyVHlwZV9lbnVtIHsKKyAgICBJTUFRX0VNUFRZX0NPTlRPVVIgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vVGhlIGNvbnRvdXIgaXMgZW1wdHkuCisgICAgSU1BUV9QT0lOVCAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1RoZSBjb250b3VyIHJlcHJlc2VudHMgYSBwb2ludC4KKyAgICBJTUFRX0xJTkUgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vVGhlIGNvbnRvdXIgcmVwcmVzZW50cyBhIGxpbmUuCisgICAgSU1BUV9SRUNUICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAvL1RoZSBjb250b3VyIHJlcHJlc2VudHMgYSByZWN0YW5nbGUuCisgICAgSU1BUV9PVkFMICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAvL1RoZSBjb250b3VyIHJlcHJlc2VudHMgYW4gb3ZhbC4KKyAgICBJTUFRX0NMT1NFRF9DT05UT1VSICAgICAgICAgID0gNSwgICAgICAgICAgIC8vVGhlIGNvbnRvdXIgcmVwcmVzZW50cyBhIHNlcmllcyBvZiBjb25uZWN0ZWQgcG9pbnRzIHdoZXJlIHRoZSBsYXN0IHBvaW50IGNvbm5lY3RzIHRvIHRoZSBmaXJzdC4KKyAgICBJTUFRX09QRU5fQ09OVE9VUiAgICAgICAgICAgID0gNiwgICAgICAgICAgIC8vVGhlIGNvbnRvdXIgcmVwcmVzZW50cyBhIHNlcmllcyBvZiBjb25uZWN0ZWQgcG9pbnRzIHdoZXJlIHRoZSBsYXN0IHBvaW50IGRvZXMgbm90IGNvbm5lY3QgdG8gdGhlIGZpcnN0LgorICAgIElNQVFfQU5OVUxVUyAgICAgICAgICAgICAgICAgPSA3LCAgICAgICAgICAgLy9UaGUgY29udG91ciByZXByZXNlbnRzIGFuIGFubnVsdXMuCisgICAgSU1BUV9ST1RBVEVEX1JFQ1QgICAgICAgICAgICA9IDgsICAgICAgICAgICAvL1RoZSBjb250b3VyIHJlcHJlc2VudHMgYSByb3RhdGVkIHJlY3RhbmdsZS4KKyAgICBJTUFRX0NPTlRPVVJfVFlQRV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBDb250b3VyVHlwZTsKKwordHlwZWRlZiBlbnVtIE1hdGhUcmFuc2Zvcm1NZXRob2RfZW51bSB7CisgICAgSU1BUV9UUkFOU0ZPUk1fTElORUFSICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB1c2VzIGxpbmVhciByZW1hcHBpbmcuCisgICAgSU1BUV9UUkFOU0ZPUk1fTE9HICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB1c2VzIGxvZ2FyaXRobWljIHJlbWFwcGluZy4KKyAgICBJTUFRX1RSQU5TRk9STV9FWFAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHVzZXMgZXhwb25lbnRpYWwgcmVtYXBwaW5nLgorICAgIElNQVFfVFJBTlNGT1JNX1NRUiAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdXNlcyBzcXVhcmUgcmVtYXBwaW5nLgorICAgIElNQVFfVFJBTlNGT1JNX1NRUlQgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdXNlcyBzcXVhcmUgcm9vdCByZW1hcHBpbmcuCisgICAgSU1BUV9UUkFOU0ZPUk1fUE9XWCAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB1c2VzIHBvd2VyIFggcmVtYXBwaW5nLgorICAgIElNQVFfVFJBTlNGT1JNX1BPVzFYICAgICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdXNlcyBwb3dlciAxL1ggcmVtYXBwaW5nLgorICAgIElNQVFfTUFUSF9UUkFOU0ZPUk1fTUVUSE9EX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IE1hdGhUcmFuc2Zvcm1NZXRob2Q7CisKK3R5cGVkZWYgZW51bSBDb21wbGV4UGxhbmVfZW51bSB7CisgICAgSU1BUV9SRUFMICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24gdGhlIHJlYWwgcGxhbmUgb2YgdGhlIGNvbXBsZXggaW1hZ2UuCisgICAgSU1BUV9JTUFHSU5BUlkgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24gdGhlIGltYWdpbmFyeSBwbGFuZSBvZiB0aGUgY29tcGxleCBpbWFnZS4KKyAgICBJTUFRX01BR05JVFVERSAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbiB0aGUgbWFnbml0dWRlIHBsYW5lIG9mIHRoZSBjb21wbGV4IGltYWdlLgorICAgIElNQVFfUEhBU0UgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uIHRoZSBwaGFzZSBwbGFuZSBvZiB0aGUgY29tcGxleCBpbWFnZS4KKyAgICBJTUFRX0NPTVBMRVhfUExBTkVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gQ29tcGxleFBsYW5lOworCit0eXBlZGVmIGVudW0gUGFsZXR0ZVR5cGVfZW51bSB7CisgICAgSU1BUV9QQUxFVFRFX0dSQVkgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB1c2VzIGEgcGFsZXR0ZSB0aGF0IGhhcyBhIGdyYWR1YWwgZ3JheS1sZXZlbCB2YXJpYXRpb24gZnJvbSBibGFjayB0byB3aGl0ZS4KKyAgICBJTUFRX1BBTEVUVEVfQklOQVJZICAgICAgICAgID0gMSwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHVzZXMgYSBwYWxldHRlIG9mIDE2IGN5Y2xlcyBvZiAxNiBkaWZmZXJlbnQgY29sb3JzIHRoYXQgaXMgdXNlZnVsIHdpdGggYmluYXJ5IGltYWdlcy4KKyAgICBJTUFRX1BBTEVUVEVfR1JBRElFTlQgICAgICAgID0gMiwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHVzZXMgYSBwYWxldHRlIHRoYXQgaGFzIGEgZ3JhZGF0aW9uIGZyb20gcmVkIHRvIHdoaXRlIHdpdGggYSBwcm9taW5lbnQgcmFuZ2Ugb2YgbGlnaHQgYmx1ZSBpbiB0aGUgdXBwZXIgdmFsdWUgcmFuZ2UuCisgICAgSU1BUV9QQUxFVFRFX1JBSU5CT1cgICAgICAgICA9IDMsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB1c2VzIGEgcGFsZXR0ZSB0aGF0IGhhcyBhIGdyYWRhdGlvbiBmcm9tIGJsdWUgdG8gcmVkIHdpdGggYSBwcm9taW5lbnQgcmFuZ2Ugb2YgZ3JlZW5zIGluIHRoZSBtaWRkbGUgdmFsdWUgcmFuZ2UuCisgICAgSU1BUV9QQUxFVFRFX1RFTVBFUkFUVVJFICAgICA9IDQsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB1c2VzIGEgcGFsZXR0ZSB0aGF0IGhhcyBhIGdyYWRhdGlvbiBmcm9tIGxpZ2h0IGJyb3duIHRvIGRhcmsgYnJvd24uCisgICAgSU1BUV9QQUxFVFRFX1VTRVIgICAgICAgICAgICA9IDUsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB1c2VzIGEgcGFsZXR0ZSBkZWZpbmVkIGJ5IHRoZSB1c2VyLgorICAgIElNQVFfUEFMRVRURV9UWVBFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IFBhbGV0dGVUeXBlOworCit0eXBlZGVmIGVudW0gQ29sb3JTZW5zaXRpdml0eV9lbnVtIHsKKyAgICBJTUFRX1NFTlNJVElWSVRZX0xPVyAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9JbnN0cnVjdHMgdGhlIGFsZ29yaXRobSB0byBkaXZpZGUgdGhlIGh1ZSBwbGFuZSBpbnRvIGEgbG93IG51bWJlciBvZiBzZWN0b3JzLCBhbGxvd2luZyBmb3Igc2ltcGxlIGNvbG9yIGFuYWx5c2lzLgorICAgIElNQVFfU0VOU0lUSVZJVFlfTUVEICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL0luc3RydWN0cyB0aGUgYWxnb3JpdGhtIHRvIGRpdmlkZSB0aGUgaHVlIHBsYW5lIGludG8gYSBtZWRpdW0gbnVtYmVyIG9mIHNlY3RvcnMsIGFsbG93aW5nIGZvciBjb2xvciBhbmFseXNpcyB0aGF0IGJhbGFuY2VzIHNlbnNpdGl2aXR5IGFuZCBjb21wbGV4aXR5LgorICAgIElNQVFfU0VOU0lUSVZJVFlfSElHSCAgICAgICAgICAgICA9IDIsICAgICAgICAgICAvL0luc3RydWN0cyB0aGUgYWxnb3JpdGhtIHRvIGRpdmlkZSB0aGUgaHVlIHBsYW5lIGludG8gYSBoaWdoIG51bWJlciBvZiBzZWN0b3JzLCBhbGxvd2luZyBmb3IgY29tcGxleCwgc2Vuc2l0aXZlIGNvbG9yIGFuYWx5c2lzLgorICAgIElNQVFfQ09MT1JfU0VOU0lUSVZJVFlfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gQ29sb3JTZW5zaXRpdml0eTsKKwordHlwZWRlZiBlbnVtIENvbG9yTW9kZV9lbnVtIHsKKyAgICBJTUFRX1JHQiAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBvcGVyYXRlcyBpbiB0aGUgUkdCIChSZWQsIEJsdWUsIEdyZWVuKSBjb2xvciBzcGFjZS4KKyAgICBJTUFRX0hTTCAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBvcGVyYXRlcyBpbiB0aGUgSFNMIChIdWUsIFNhdHVyYXRpb24sIEx1bWluYW5jZSkgY29sb3Igc3BhY2UuCisgICAgSU1BUV9IU1YgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gb3BlcmF0ZXMgaW4gdGhlIEhTViAoSHVlLCBTYXR1cmF0aW9uLCBWYWx1ZSkgY29sb3Igc3BhY2UuCisgICAgSU1BUV9IU0kgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gb3BlcmF0ZXMgaW4gdGhlIEhTSSAoSHVlLCBTYXR1cmF0aW9uLCBJbnRlbnNpdHkpIGNvbG9yIHNwYWNlLgorICAgIElNQVFfQ0lFICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIG9wZXJhdGVzIGluIHRoZSBDSUUgTCphKmIqIGNvbG9yIHNwYWNlLgorICAgIElNQVFfQ0lFWFlaICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIG9wZXJhdGVzIGluIHRoZSBDSUUgWFlaIGNvbG9yIHNwYWNlLgorICAgIElNQVFfQ09MT1JfTU9ERV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBDb2xvck1vZGU7CisKK3R5cGVkZWYgZW51bSBEZXRlY3Rpb25Nb2RlX2VudW0geworICAgIElNQVFfREVURUNUX1BFQUtTICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBkZXRlY3RzIHBlYWtzLgorICAgIElNQVFfREVURUNUX1ZBTExFWVMgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBkZXRlY3RzIHZhbGxleXMuCisgICAgSU1BUV9ERVRFQ1RJT05fTU9ERV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBEZXRlY3Rpb25Nb2RlOworCit0eXBlZGVmIGVudW0gQ2FsaWJyYXRpb25Vbml0X2VudW0geworICAgIElNQVFfVU5ERUZJTkVEICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vVGhlIGltYWdlIGRvZXMgbm90IGhhdmUgYSBkZWZpbmVkIHVuaXQgb2YgbWVhc3VyZW1lbnQuCisgICAgSU1BUV9BTkdTVFJPTSAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgdW5pdCBvZiBtZWFzdXJlIGZvciB0aGUgaW1hZ2UgaXMgYW5nc3Ryb21zLgorICAgIElNQVFfTUlDUk9NRVRFUiAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vVGhlIHVuaXQgb2YgbWVhc3VyZSBmb3IgdGhlIGltYWdlIGlzIG1pY3JvbWV0ZXJzLgorICAgIElNQVFfTUlMTElNRVRFUiAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgIC8vVGhlIHVuaXQgb2YgbWVhc3VyZSBmb3IgdGhlIGltYWdlIGlzIG1pbGxpbWV0ZXJzLgorICAgIElNQVFfQ0VOVElNRVRFUiAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgIC8vVGhlIHVuaXQgb2YgbWVhc3VyZSBmb3IgdGhlIGltYWdlIGlzIGNlbnRpbWV0ZXJzLgorICAgIElNQVFfTUVURVIgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgIC8vVGhlIHVuaXQgb2YgbWVhc3VyZSBmb3IgdGhlIGltYWdlIGlzIG1ldGVycy4KKyAgICBJTUFRX0tJTE9NRVRFUiAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAvL1RoZSB1bml0IG9mIG1lYXN1cmUgZm9yIHRoZSBpbWFnZSBpcyBraWxvbWV0ZXJzLgorICAgIElNQVFfTUlDUk9JTkNIICAgICAgICAgICAgICAgICAgID0gNywgICAgICAgICAgIC8vVGhlIHVuaXQgb2YgbWVhc3VyZSBmb3IgdGhlIGltYWdlIGlzIG1pY3JvaW5jaGVzLgorICAgIElNQVFfSU5DSCAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgICAgICAgIC8vVGhlIHVuaXQgb2YgbWVhc3VyZSBmb3IgdGhlIGltYWdlIGlzIGluY2hlcy4KKyAgICBJTUFRX0ZPT1QgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgICAgICAgICAvL1RoZSB1bml0IG9mIG1lYXN1cmUgZm9yIHRoZSBpbWFnZSBpcyBmZWV0LgorICAgIElNQVFfTkFVVElDTUlMRSAgICAgICAgICAgICAgICAgID0gMTAsICAgICAgICAgIC8vVGhlIHVuaXQgb2YgbWVhc3VyZSBmb3IgdGhlIGltYWdlIGlzIG5hdXRpY2FsIG1pbGVzLgorICAgIElNQVFfR1JPVU5ETUlMRSAgICAgICAgICAgICAgICAgID0gMTEsICAgICAgICAgIC8vVGhlIHVuaXQgb2YgbWVhc3VyZSBmb3IgdGhlIGltYWdlIGlzIGdyb3VuZCBtaWxlcy4KKyAgICBJTUFRX1NURVAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLCAgICAgICAgICAvL1RoZSB1bml0IG9mIG1lYXN1cmUgZm9yIHRoZSBpbWFnZSBpcyBzdGVwcy4KKyAgICBJTUFRX0NBTElCUkFUSU9OX1VOSVRfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gQ2FsaWJyYXRpb25Vbml0OworCit0eXBlZGVmIGVudW0gQ29uY2VudHJpY1Jha2VEaXJlY3Rpb25fZW51bSB7CisgICAgSU1BUV9DT1VOVEVSX0NMT0NLV0lTRSAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gc2VhcmNoZXMgdGhlIHNlYXJjaCBhcmVhIGluIGEgY291bnRlci1jbG9ja3dpc2UgZGlyZWN0aW9uLgorICAgIElNQVFfQ0xPQ0tXSVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHNlYXJjaGVzIHRoZSBzZWFyY2ggYXJlYSBpbiBhIGNsb2Nrd2lzZSBkaXJlY3Rpb24uCisgICAgSU1BUV9DT05DRU5UUklDX1JBS0VfRElSRUNUSU9OX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IENvbmNlbnRyaWNSYWtlRGlyZWN0aW9uOworCit0eXBlZGVmIGVudW0gQ2FsaWJyYXRpb25Nb2RlX2VudW0geworICAgIElNQVFfUEVSU1BFQ1RJVkUgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vRnVuY3Rpb25zIGNvcnJlY3QgZm9yIGRpc3RvcnRpb24gY2F1c2VkIGJ5IHRoZSBjYW1lcmEncyBwZXJzcGVjdGl2ZS4KKyAgICBJTUFRX05PTkxJTkVBUiAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL0Z1bmN0aW9ucyBjb3JyZWN0IGZvciBkaXN0b3J0aW9uIGNhdXNlZCBieSB0aGUgY2FtZXJhJ3MgbGVucy4KKyAgICBJTUFRX1NJTVBMRV9DQUxJQlJBVElPTiAgICAgICAgICA9IDIsICAgICAgICAgICAvL0Z1bmN0aW9ucyBkbyBub3QgY29ycmVjdCBmb3IgZGlzdG9ydGlvbi4KKyAgICBJTUFRX0NPUlJFQ1RFRF9JTUFHRSAgICAgICAgICAgICA9IDMsICAgICAgICAgICAvL1RoZSBpbWFnZSBpcyBhbHJlYWR5IGNvcnJlY3RlZC4KKyAgICBJTUFRX0NBTElCUkFUSU9OX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gQ2FsaWJyYXRpb25Nb2RlOworCit0eXBlZGVmIGVudW0gQnJvd3NlckxvY2F0aW9uX2VudW0geworICAgIElNQVFfSU5TRVJUX0ZJUlNUX0ZSRUUgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vSW5zZXJ0cyB0aGUgdGh1bWJuYWlsIGluIHRoZSBmaXJzdCBhdmFpbGFibGUgY2VsbC4KKyAgICBJTUFRX0lOU0VSVF9FTkQgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL0luc2VydHMgdGhlIHRodW1ibmFpbCBhZnRlciB0aGUgbGFzdCBvY2N1cGllZCBjZWxsLgorICAgIElNQVFfQlJPV1NFUl9MT0NBVElPTl9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBCcm93c2VyTG9jYXRpb247CisKK3R5cGVkZWYgZW51bSBCcm93c2VyRnJhbWVTdHlsZV9lbnVtIHsKKyAgICBJTUFRX1JBSVNFRF9GUkFNRSAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL0VhY2ggdGh1bWJuYWlsIGhhcyBhIHJhaXNlZCBmcmFtZS4KKyAgICBJTUFRX0JFVkVMTEVEX0ZSQU1FICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL0VhY2ggdGh1bWJuYWlsIGhhcyBhIGJldmVsZWQgZnJhbWUuCisgICAgSU1BUV9PVVRMSU5FX0ZSQU1FICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgLy9FYWNoIHRodW1ibmFpbCBoYXMgYW4gb3V0bGluZWQgZnJhbWUuCisgICAgSU1BUV9ISURERU5fRlJBTUUgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgLy9FYWNoIHRodW1ibmFpbCBoYXMgYSBoaWRkZW4gZnJhbWUuCisgICAgSU1BUV9TVEVQX0ZSQU1FICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgLy9FYWNoIHRodW1ibmFpbCBoYXMgYSBzdGVwcGVkIGZyYW1lLgorICAgIElNQVFfUkFJU0VEX09VVExJTkVfRlJBTUUgICAgICAgICAgID0gNSwgICAgICAgICAgIC8vRWFjaCB0aHVtYm5haWwgaGFzIGEgcmFpc2VkLCBvdXRsaW5lZCBmcmFtZS4KKyAgICBJTUFRX0JST1dTRVJfRlJBTUVfU1RZTEVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gQnJvd3NlckZyYW1lU3R5bGU7CisKK3R5cGVkZWYgZW51bSBCb3JkZXJNZXRob2RfZW51bSB7CisgICAgSU1BUV9CT1JERVJfTUlSUk9SICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9TeW1tZXRyaWNhbGx5IGNvcGllcyBwaXhlbCB2YWx1ZXMgZnJvbSB0aGUgaW1hZ2UgaW50byB0aGUgYm9yZGVyLgorICAgIElNQVFfQk9SREVSX0NPUFkgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vQ29waWVzIHRoZSB2YWx1ZSBvZiB0aGUgcGl4ZWwgY2xvc2VzdCB0byB0aGUgZWRnZSBvZiB0aGUgaW1hZ2UgaW50byB0aGUgYm9yZGVyLgorICAgIElNQVFfQk9SREVSX0NMRUFSICAgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vU2V0cyBhbGwgcGl4ZWxzIGluIHRoZSBib3JkZXIgdG8gMC4KKyAgICBJTUFRX0JPUkRFUl9NRVRIT0RfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gQm9yZGVyTWV0aG9kOworCit0eXBlZGVmIGVudW0gQmFyY29kZVR5cGVfZW51bSB7CisgICAgSU1BUV9JTlZBTElEICAgICAgICAgICAgICAgICA9IC0xLCAgICAgICAgICAvL1RoZSBiYXJjb2RlIGlzIG5vdCBvZiBhIHR5cGUga25vd24gYnkgTkkgVmlzaW9uLgorICAgIElNQVFfQ09EQUJBUiAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgYmFyY29kZSBpcyBvZiB0eXBlIENvZGFiYXIuCisgICAgSU1BUV9DT0RFMzkgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAvL1RoZSBiYXJjb2RlIGlzIG9mIHR5cGUgQ29kZSAzOS4KKyAgICBJTUFRX0NPREU5MyAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgIC8vVGhlIGJhcmNvZGUgaXMgb2YgdHlwZSBDb2RlIDkzLgorICAgIElNQVFfQ09ERTEyOCAgICAgICAgICAgICAgICAgPSA4LCAgICAgICAgICAgLy9UaGUgYmFyY29kZSBpcyBvZiB0eXBlIENvZGUgMTI4LgorICAgIElNQVFfRUFOOCAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAgICAgICAgLy9UaGUgYmFyY29kZSBpcyBvZiB0eXBlIEVBTiA4LgorICAgIElNQVFfRUFOMTMgICAgICAgICAgICAgICAgICAgPSAzMiwgICAgICAgICAgLy9UaGUgYmFyY29kZSBpcyBvZiB0eXBlIEVBTiAxMy4KKyAgICBJTUFRX0kyX09GXzUgICAgICAgICAgICAgICAgID0gNjQsICAgICAgICAgIC8vVGhlIGJhcmNvZGUgaXMgb2YgdHlwZSBDb2RlIDI1LgorICAgIElNQVFfTVNJICAgICAgICAgICAgICAgICAgICAgPSAxMjgsICAgICAgICAgLy9UaGUgYmFyY29kZSBpcyBvZiB0eXBlIE1TSSBjb2RlLgorICAgIElNQVFfVVBDQSAgICAgICAgICAgICAgICAgICAgPSAyNTYsICAgICAgICAgLy9UaGUgYmFyY29kZSBpcyBvZiB0eXBlIFVQQyBBLgorICAgIElNQVFfUEhBUk1BQ09ERSAgICAgICAgICAgICAgPSA1MTIsICAgICAgICAgLy9UaGUgYmFyY29kZSBpcyBvZiB0eXBlIFBoYXJtYWNvZGUuCisgICAgSU1BUV9SU1NfTElNSVRFRCAgICAgICAgICAgICA9IDEwMjQsICAgICAgICAvL1RoZSBiYXJjb2RlIGlzIG9mIHR5cGUgUlNTIExpbWl0ZWQuCisgICAgSU1BUV9CQVJDT0RFX1RZUEVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gQmFyY29kZVR5cGU7CisKK3R5cGVkZWYgZW51bSBBeGlzT3JpZW50YXRpb25fZW51bSB7CisgICAgSU1BUV9ESVJFQ1QgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgeS1heGlzIGRpcmVjdGlvbiBjb3JyZXNwb25kcyB0byB0aGUgeS1heGlzIGRpcmVjdGlvbiBvZiB0aGUgQ2FydGVzaWFuIGNvb3JkaW5hdGUgc3lzdGVtLgorICAgIElNQVFfSU5ESVJFQ1QgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vVGhlIHktYXhpcyBkaXJlY3Rpb24gY29ycmVzcG9uZHMgdG8gdGhlIHktYXhpcyBkaXJlY3Rpb24gb2YgYW4gaW1hZ2UuCisgICAgSU1BUV9BWElTX09SSUVOVEFUSU9OX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IEF4aXNPcmllbnRhdGlvbjsKKwordHlwZWRlZiBlbnVtIENvbG9ySWdub3JlTW9kZV9lbnVtIHsKKyAgICBJTUFRX0lHTk9SRV9OT05FICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhhdCB0aGUgZnVuY3Rpb24gZG9lcyBub3QgaWdub3JlIGFueSBwaXhlbHMuCisgICAgSU1BUV9JR05PUkVfQkxBQ0sgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoYXQgdGhlIGZ1bmN0aW9uIGlnbm9yZXMgYmxhY2sgcGl4ZWxzLgorICAgIElNQVFfSUdOT1JFX1dISVRFICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAvL1NwZWNpZmllcyB0aGF0IHRoZSBmdW5jdGlvbiBpZ25vcmVzIHdoaXRlIHBpeGVscy4KKyAgICBJTUFRX0lHTk9SRV9CTEFDS19BTkRfV0hJVEUgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhhdCB0aGUgZnVuY3Rpb24gaWdub3JlcyBibGFjayBwaXhlbHMgYW5kIHdoaXRlIHBpeGVscy4KKyAgICBJTUFRX0JMQUNLX1dISVRFX0lHTk9SRV9NT0RFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IENvbG9ySWdub3JlTW9kZTsKKwordHlwZWRlZiBlbnVtIExldmVsVHlwZV9lbnVtIHsKKyAgICBJTUFRX0FCU09MVVRFICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBldmFsdWF0ZXMgdGhlIHRocmVzaG9sZCBhbmQgaHlzdGVyZXNpcyB2YWx1ZXMgYXMgYWJzb2x1dGUgdmFsdWVzLgorICAgIElNQVFfUkVMQVRJVkUgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIGV2YWx1YXRlcyB0aGUgdGhyZXNob2xkIGFuZCBoeXN0ZXJlc2lzIHZhbHVlcyByZWxhdGl2ZSB0byB0aGUgZHluYW1pYyByYW5nZSBvZiB0aGUgZ2l2ZW4gcGF0aC4KKyAgICBJTUFRX0xFVkVMX1RZUEVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gTGV2ZWxUeXBlOworCit0eXBlZGVmIGVudW0gTWF0Y2hpbmdNb2RlX2VudW0geworICAgIElNQVFfTUFUQ0hfU0hJRlRfSU5WQVJJQU5UICAgID0gMSwgICAgICAgICAgIC8vU2VhcmNoZXMgZm9yIG9jY3VycmVuY2VzIG9mIHRoZSB0ZW1wbGF0ZSBpbWFnZSBhbnl3aGVyZSBpbiB0aGUgc2VhcmNoUmVjdCwgYXNzdW1pbmcgdGhhdCB0aGUgcGF0dGVybiBpcyBub3Qgcm90YXRlZCBtb3JlIHRoYW4gcGx1cyBvciBtaW51cyA0IGRlZ3JlZXMuCisgICAgSU1BUV9NQVRDSF9ST1RBVElPTl9JTlZBUklBTlQgPSAyLCAgICAgICAgICAgLy9TZWFyY2hlcyBmb3Igb2NjdXJyZW5jZXMgb2YgdGhlIHBhdHRlcm4gaW4gdGhlIGltYWdlIHdpdGggbm8gcmVzdHJpY3Rpb24gb24gdGhlIHJvdGF0aW9uIG9mIHRoZSBwYXR0ZXJuLgorICAgIElNQVFfTUFUQ0hJTkdfTU9ERV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBNYXRjaGluZ01vZGU7CisKK3R5cGVkZWYgZW51bSBNYXBwaW5nTWV0aG9kX2VudW0geworICAgIElNQVFfRlVMTF9EWU5BTUlDICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvLyhPYnNvbGV0ZSkgV2hlbiB0aGUgaW1hZ2UgYml0IGRlcHRoIGlzIDAsIHRoZSBmdW5jdGlvbiBtYXBzIHRoZSBmdWxsIGR5bmFtaWMgcmFuZ2Ugb2YgdGhlIDE2LWJpdCBpbWFnZSB0byBhbiA4LWJpdCBzY2FsZS4KKyAgICBJTUFRX0RPV05TSElGVCAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy8oT2Jzb2xldGUpIFdoZW4gdGhlIGltYWdlIGJpdCBkZXB0aCBpcyAwLCB0aGUgZnVuY3Rpb24gc2hpZnRzIHRoZSAxNi1iaXQgaW1hZ2UgcGl4ZWxzIHRvIHRoZSByaWdodCB0aGUgbnVtYmVyIG9mIHRpbWVzIHNwZWNpZmllZCBieSB0aGUgc2hpZnRDb3VudCBlbGVtZW50IG9mIHRoZSBEaXNwbGF5TWFwcGluZyBzdHJ1Y3R1cmUuCisgICAgSU1BUV9SQU5HRSAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vKE9ic29sZXRlKSBXaGVuIHRoZSBpbWFnZSBiaXQgZGVwdGggaXMgMCwgdGhlIGZ1bmN0aW9uIG1hcHMgdGhlIHBpeGVsIHZhbHVlcyBpbiB0aGUgcmFuZ2Ugc3BlY2lmaWVkIGJ5IHRoZSBtaW5pbXVtVmFsdWUgYW5kIG1heGltdW1WYWx1ZSBlbGVtZW50cyBvZiB0aGUgRGlzcGxheU1hcHBpbmcgc3RydWN0dXJlIHRvIGFuIDgtYml0IHNjYWxlLgorICAgIElNQVFfOTBfUENUX0RZTkFNSUMgICAgICAgICAgICA9IDMsICAgICAgICAgICAvLyhPYnNvbGV0ZSkgV2hlbiB0aGUgaW1hZ2UgYml0IGRlcHRoIHRvIDAsIHRoZSBmdW5jdGlvbiBtYXBzIHRoZSBkeW5hbWljIHJhbmdlIGNvbnRhaW5pbmcgdGhlIG1pZGRsZSA5MCBwZXJjZW50IG9mIHRoZSBjdW11bGF0ZWQgaGlzdG9ncmFtIG9mIHRoZSBpbWFnZSB0byBhbiA4LWJpdCAoMjU2IGdyYXlzY2FsZSB2YWx1ZXMpIHNjYWxlLgorICAgIElNQVFfUEVSQ0VOVF9SQU5HRSAgICAgICAgICAgICA9IDQsICAgICAgICAgICAvLyhPYnNvbGV0ZSkgV2hlbiB0aGUgaW1hZ2UgYml0IGRlcHRoIGlzIDAsIHRoZSBmdW5jdGlvbiBtYXBzIHRoZSBwaXhlbCB2YWx1ZXMgaW4gdGhlIHJlbGF0aXZlIHBlcmNlbnRhZ2UgcmFuZ2UgKDAgdG8gMTAwKSBvZiB0aGUgY3VtdWxhdGVkIGhpc3RvZ3JhbSBzcGVjaWZpZWQgYnkgbWluaW11bVZhbHVlIGFuZCBtYXhpbXVtVmFsdWUgdG8gYW4gOC1iaXQgc2NhbGUuCisgICAgSU1BUV9ERUZBVUxUX01BUFBJTkcgICAgICAgICAgID0gMTAsICAgICAgICAgIC8vSWYgdGhlIGJpdCBkZXB0aCBpcyAwLCB0aGUgZnVuY3Rpb24gbWFwcyB0aGUgMTYtYml0IGltYWdlIHRvIDggYml0cyBieSBmb2xsb3dpbmcgdGhlIElNQVFfRlVMTF9EWU5BTUlDX0FMV0FZUyBiZWhhdmlvcjsgb3RoZXJ3aXNlLCB0aGUgZnVuY3Rpb24gc2hpZnRzIHRoZSBpbWFnZSBkYXRhIHRvIHRoZSByaWdodCBhY2NvcmRpbmcgdG8gdGhlIElNQVFfTU9TVF9TSUdOSUZJQ0FOVCBiZWhhdmlvci4KKyAgICBJTUFRX01PU1RfU0lHTklGSUNBTlQgICAgICAgICAgPSAxMSwgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gc2hpZnRzIHRoZSAxNi1iaXQgaW1hZ2UgcGl4ZWxzIHRvIHRoZSByaWdodCB1bnRpbCB0aGUgOCBtb3N0IHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIGltYWdlIGRhdGEgYXJlIHJlbWFpbmluZy4KKyAgICBJTUFRX0ZVTExfRFlOQU1JQ19BTFdBWVMgICAgICAgPSAxMiwgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gbWFwcyB0aGUgZnVsbCBkeW5hbWljIHJhbmdlIG9mIHRoZSAxNi1iaXQgaW1hZ2UgdG8gYW4gOC1iaXQgc2NhbGUuCisgICAgSU1BUV9ET1dOU0hJRlRfQUxXQVlTICAgICAgICAgID0gMTMsICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHNoaWZ0cyB0aGUgMTYtYml0IGltYWdlIHBpeGVscyB0byB0aGUgcmlnaHQgdGhlIG51bWJlciBvZiB0aW1lcyBzcGVjaWZpZWQgYnkgdGhlIHNoaWZ0Q291bnQgZWxlbWVudCBvZiB0aGUgRGlzcGxheU1hcHBpbmcgc3RydWN0dXJlLgorICAgIElNQVFfUkFOR0VfQUxXQVlTICAgICAgICAgICAgICA9IDE0LCAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBtYXBzIHRoZSBwaXhlbCB2YWx1ZXMgaW4gdGhlIHJhbmdlIHNwZWNpZmllZCBieSB0aGUgbWluaW11bVZhbHVlIGFuZCBtYXhpbXVtVmFsdWUgZWxlbWVudHMgb2YgdGhlIERpc3BsYXlNYXBwaW5nIHN0cnVjdHVyZSB0byBhbiA4LWJpdCBzY2FsZS4KKyAgICBJTUFRXzkwX1BDVF9EWU5BTUlDX0FMV0FZUyAgICAgPSAxNSwgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gbWFwcyB0aGUgZHluYW1pYyByYW5nZSBjb250YWluaW5nIHRoZSBtaWRkbGUgOTAgcGVyY2VudCBvZiB0aGUgY3VtdWxhdGVkIGhpc3RvZ3JhbSBvZiB0aGUgaW1hZ2UgdG8gYW4gOC1iaXQgKDI1NiBncmF5c2NhbGUgdmFsdWVzKSBzY2FsZS4KKyAgICBJTUFRX1BFUkNFTlRfUkFOR0VfQUxXQVlTICAgICAgPSAxNiwgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gbWFwcyB0aGUgcGl4ZWwgdmFsdWVzIGluIHRoZSByZWxhdGl2ZSBwZXJjZW50YWdlIHJhbmdlICgwIHRvIDEwMCkgb2YgdGhlIGN1bXVsYXRlZCBoaXN0b2dyYW0gc3BlY2lmaWVkIGJ5IG1pbmltdW1WYWx1ZSBhbmQgbWF4aW11bVZhbHVlIHRvIGFuIDgtYml0IHNjYWxlLgorICAgIElNQVFfTUFQUElOR19NRVRIT0RfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gTWFwcGluZ01ldGhvZDsKKwordHlwZWRlZiBlbnVtIENvbXBhcmlzb25GdW5jdGlvbl9lbnVtIHsKKyAgICBJTUFRX0NMRUFSX0xFU1MgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1RoZSBjb21wYXJpc29uIGlzIHRydWUgaWYgdGhlIHNvdXJjZSBwaXhlbCB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIGNvbXBhcmlzb24gaW1hZ2UgcGl4ZWwgdmFsdWUuCisgICAgSU1BUV9DTEVBUl9MRVNTX09SX0VRVUFMICAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgY29tcGFyaXNvbiBpcyB0cnVlIGlmIHRoZSBzb3VyY2UgcGl4ZWwgdmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBjb21wYXJpc29uIGltYWdlIHBpeGVsIHZhbHVlLgorICAgIElNQVFfQ0xFQVJfRVFVQUwgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vVGhlIGNvbXBhcmlzb24gaXMgdHJ1ZSBpZiB0aGUgc291cmNlIHBpeGVsIHZhbHVlIGlzIGVxdWFsIHRvIHRoZSBjb21wYXJpc29uIGltYWdlIHBpeGVsIHZhbHVlLgorICAgIElNQVFfQ0xFQVJfR1JFQVRFUl9PUl9FUVVBTCAgICAgID0gMywgICAgICAgICAgIC8vVGhlIGNvbXBhcmlzb24gaXMgdHJ1ZSBpZiB0aGUgc291cmNlIHBpeGVsIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgY29tcGFyaXNvbiBpbWFnZSBwaXhlbCB2YWx1ZS4KKyAgICBJTUFRX0NMRUFSX0dSRUFURVIgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAvL1RoZSBjb21wYXJpc29uIGlzIHRydWUgaWYgdGhlIHNvdXJjZSBwaXhlbCB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIGNvbXBhcmlzb24gaW1hZ2UgcGl4ZWwgdmFsdWUuCisgICAgSU1BUV9DT01QQVJFX0ZVTkNUSU9OX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IENvbXBhcmlzb25GdW5jdGlvbjsKKwordHlwZWRlZiBlbnVtIExpbmVHYXVnZU1ldGhvZF9lbnVtIHsKKyAgICBJTUFRX0VER0VfVE9fRURHRSAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9NZWFzdXJlcyBmcm9tIHRoZSBmaXJzdCBlZGdlIG9uIHRoZSBsaW5lIHRvIHRoZSBsYXN0IGVkZ2Ugb24gdGhlIGxpbmUuCisgICAgSU1BUV9FREdFX1RPX1BPSU5UICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vTWVhc3VyZXMgZnJvbSB0aGUgZmlyc3QgZWRnZSBvbiB0aGUgbGluZSB0byB0aGUgZW5kIHBvaW50IG9mIHRoZSBsaW5lLgorICAgIElNQVFfUE9JTlRfVE9fRURHRSAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAvL01lYXN1cmVzIGZyb20gdGhlIHN0YXJ0IHBvaW50IG9mIHRoZSBsaW5lIHRvIHRoZSBmaXJzdCBlZGdlIG9uIHRoZSBsaW5lLgorICAgIElNQVFfUE9JTlRfVE9fUE9JTlQgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAvL01lYXN1cmVzIGZyb20gdGhlIHN0YXJ0IHBvaW50IG9mIHRoZSBsaW5lIHRvIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGxpbmUuCisgICAgSU1BUV9MSU5FX0dBVUdFX01FVEhPRF9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBMaW5lR2F1Z2VNZXRob2Q7CisKK3R5cGVkZWYgZW51bSBEaXJlY3Rpb24zRF9lbnVtIHsKKyAgICBJTUFRXzNEX05XICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vVGhlIHZpZXdpbmcgYW5nbGUgZm9yIHRoZSAzRCBpbWFnZSBpcyBmcm9tIHRoZSBub3J0aHdlc3QuCisgICAgSU1BUV8zRF9TVyAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1RoZSB2aWV3aW5nIGFuZ2xlIGZvciB0aGUgM0QgaW1hZ2UgaXMgZnJvbSB0aGUgc291dGh3ZXN0LgorICAgIElNQVFfM0RfU0UgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgLy9UaGUgdmlld2luZyBhbmdsZSBmb3IgdGhlIDNEIGltYWdlIGlzIGZyb20gdGhlIHNvdXRoZWFzdC4KKyAgICBJTUFRXzNEX05FICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgIC8vVGhlIHZpZXdpbmcgYW5nbGUgZm9yIHRoZSAzRCBpbWFnZSBpcyBmcm9tIHRoZSBub3J0aGVhc3QuCisgICAgSU1BUV9ESVJFQ1RJT05fM0RfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gRGlyZWN0aW9uM0Q7CisKK3R5cGVkZWYgZW51bSBMZWFybmluZ01vZGVfZW51bSB7CisgICAgSU1BUV9MRUFSTl9BTEwgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBleHRyYWN0cyBpbmZvcm1hdGlvbiBmb3Igc2hpZnQtIGFuZCByb3RhdGlvbi1pbnZhcmlhbnQgbWF0Y2hpbmcuCisgICAgSU1BUV9MRUFSTl9TSElGVF9JTkZPUk1BVElPTiAgICA9IDEsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBleHRyYWN0cyBpbmZvcm1hdGlvbiBmb3Igc2hpZnQtaW52YXJpYW50IG1hdGNoaW5nLgorICAgIElNQVFfTEVBUk5fUk9UQVRJT05fSU5GT1JNQVRJT04gPSAyLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gZXh0cmFjdHMgaW5mb3JtYXRpb24gZm9yIHJvdGF0aW9uLWludmFyaWFudCBtYXRjaGluZy4KKyAgICBJTUFRX0xFQVJOSU5HX01PREVfU0laRV9HVUFSRCAgID0gMHhGRkZGRkZGRiAgIAorfSBMZWFybmluZ01vZGU7CisKK3R5cGVkZWYgZW51bSBLZXJuZWxGYW1pbHlfZW51bSB7CisgICAgSU1BUV9HUkFESUVOVF9GQU1JTFkgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUga2VybmVsIGlzIGluIHRoZSBncmFkaWVudCBmYW1pbHkuCisgICAgSU1BUV9MQVBMQUNJQU5fRkFNSUxZICAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUga2VybmVsIGlzIGluIHRoZSBMYXBsYWNpYW4gZmFtaWx5LgorICAgIElNQVFfU01PT1RISU5HX0ZBTUlMWSAgICAgICAgID0gMiwgICAgICAgICAgIC8vVGhlIGtlcm5lbCBpcyBpbiB0aGUgc21vb3RoaW5nIGZhbWlseS4KKyAgICBJTUFRX0dBVVNTSUFOX0ZBTUlMWSAgICAgICAgICA9IDMsICAgICAgICAgICAvL1RoZSBrZXJuZWwgaXMgaW4gdGhlIEdhdXNzaWFuIGZhbWlseS4KKyAgICBJTUFRX0tFUk5FTF9GQU1JTFlfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gS2VybmVsRmFtaWx5OworCit0eXBlZGVmIGVudW0gSW50ZXJwb2xhdGlvbk1ldGhvZF9lbnVtIHsKKyAgICBJTUFRX1pFUk9fT1JERVIgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdXNlcyBhbiBpbnRlcnBvbGF0aW9uIG1ldGhvZCB0aGF0IGludGVycG9sYXRlcyBuZXcgcGl4ZWwgdmFsdWVzIHVzaW5nIHRoZSBuZWFyZXN0IHZhbGlkIG5laWdoYm9yaW5nIHBpeGVsLgorICAgIElNQVFfQklMSU5FQVIgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB1c2VzIGFuIGludGVycG9sYXRpb24gbWV0aG9kIHRoYXQgaW50ZXJwb2xhdGVzIG5ldyBwaXhlbCB2YWx1ZXMgdXNpbmcgYSBiaWRpcmVjdGlvbmFsIGF2ZXJhZ2Ugb2YgdGhlIG5laWdoYm9yaW5nIHBpeGVscy4KKyAgICBJTUFRX1FVQURSQVRJQyAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdXNlcyBhbiBpbnRlcnBvbGF0aW9uIG1ldGhvZCB0aGF0IGludGVycG9sYXRlcyBuZXcgcGl4ZWwgdmFsdWVzIHVzaW5nIGEgcXVhZHJhdGljIGFwcHJveGltYXRpbmcgcG9seW5vbWlhbC4KKyAgICBJTUFRX0NVQklDX1NQTElORSAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdXNlcyBhbiBpbnRlcnBvbGF0aW9uIG1ldGhvZCB0aGF0IGludGVycG9sYXRlcyBuZXcgcGl4ZWwgdmFsdWVzIGJ5IGZpdHRpbmcgdGhlbSB0byBhIGN1YmljIHNwbGluZSBjdXJ2ZSwgd2hlcmUgdGhlIGN1cnZlIGlzIGJhc2VkIG9uIGtub3duIHBpeGVsIHZhbHVlcyBmcm9tIHRoZSBpbWFnZS4KKyAgICBJTUFRX0JJTElORUFSX0ZJWEVEICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdXNlcyBhbiBpbnRlcnBvbGF0aW9uIG1ldGhvZCB0aGF0IGludGVycG9sYXRlcyBuZXcgcGl4ZWwgdmFsdWVzIHVzaW5nIGEgYmlkaXJlY3Rpb25hbCBhdmVyYWdlIG9mIHRoZSBuZWlnaGJvcmluZyBwaXhlbHMuCisgICAgSU1BUV9JTlRFUlBPTEFUSU9OX01FVEhPRF9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBJbnRlcnBvbGF0aW9uTWV0aG9kOworCit0eXBlZGVmIGVudW0gSW1hZ2VUeXBlX2VudW0geworICAgIElNQVFfSU1BR0VfVTggICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vVGhlIGltYWdlIHR5cGUgaXMgOC1iaXQgdW5zaWduZWQgaW50ZWdlciBncmF5c2NhbGUuCisgICAgSU1BUV9JTUFHRV9VMTYgICAgICAgICAgICAgPSA3LCAgICAgICAgICAgLy9UaGUgaW1hZ2UgdHlwZSBpcyAxNi1iaXQgdW5zaWduZWQgaW50ZWdlciBncmF5c2NhbGUuCisgICAgSU1BUV9JTUFHRV9JMTYgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgaW1hZ2UgdHlwZSBpcyAxNi1iaXQgc2lnbmVkIGludGVnZXIgZ3JheXNjYWxlLgorICAgIElNQVFfSU1BR0VfU0dMICAgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vVGhlIGltYWdlIHR5cGUgaXMgMzItYml0IGZsb2F0aW5nLXBvaW50IGdyYXlzY2FsZS4KKyAgICBJTUFRX0lNQUdFX0NPTVBMRVggICAgICAgICA9IDMsICAgICAgICAgICAvL1RoZSBpbWFnZSB0eXBlIGlzIGNvbXBsZXguCisgICAgSU1BUV9JTUFHRV9SR0IgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgLy9UaGUgaW1hZ2UgdHlwZSBpcyBSR0IgY29sb3IuCisgICAgSU1BUV9JTUFHRV9IU0wgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgLy9UaGUgaW1hZ2UgdHlwZSBpcyBIU0wgY29sb3IuCisgICAgSU1BUV9JTUFHRV9SR0JfVTY0ICAgICAgICAgPSA2LCAgICAgICAgICAgLy9UaGUgaW1hZ2UgdHlwZSBpcyA2NC1iaXQgdW5zaWduZWQgUkdCIGNvbG9yLgorICAgIElNQVFfSU1BR0VfVFlQRV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBJbWFnZVR5cGU7CisKK3R5cGVkZWYgZW51bSBJbWFnZUZlYXR1cmVNb2RlX2VudW0geworICAgIElNQVFfQ09MT1JfQU5EX1NIQVBFX0ZFQVRVUkVTID0gMCwgICAgICAgICAgIC8vSW5zdHJ1Y3RzIHRoZSBmdW5jdGlvbiB0byB1c2UgdGhlIGNvbG9yIGFuZCB0aGUgc2hhcGUgZmVhdHVyZXMgb2YgdGhlIGNvbG9yIHBhdHRlcm4uCisgICAgSU1BUV9DT0xPUl9GRUFUVVJFUyAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9JbnN0cnVjdHMgdGhlIGZ1bmN0aW9uIHRvIHVzZSB0aGUgY29sb3IgZmVhdHVyZXMgb2YgdGhlIGNvbG9yIHBhdHRlcm4uCisgICAgSU1BUV9TSEFQRV9GRUFUVVJFUyAgICAgICAgICAgPSAyLCAgICAgICAgICAgLy9JbnN0cnVjdHMgdGhlIGZ1bmN0aW9uIHRvIHVzZSB0aGUgc2hhcGUgZmVhdHVyZXMgb2YgdGhlIGNvbG9yIHBhdHRlcm4uCisgICAgSU1BUV9GRUFUVVJFX01PREVfU0laRV9HVUFSRCAgPSAweEZGRkZGRkZGICAgCit9IEltYWdlRmVhdHVyZU1vZGU7CisKK3R5cGVkZWYgZW51bSBGb250Q29sb3JfZW51bSB7CisgICAgSU1BUV9XSElURSAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9EcmF3cyB0ZXh0IGluIHdoaXRlLgorICAgIElNQVFfQkxBQ0sgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vRHJhd3MgdGV4dCBpbiBibGFjay4KKyAgICBJTUFRX0lOVkVSVCAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAvL0ludmVydHMgdGhlIHRleHQgcGl4ZWxzLgorICAgIElNQVFfQkxBQ0tfT05fV0hJVEUgICAgICAgID0gMywgICAgICAgICAgIC8vRHJhd3MgdGV4dCBpbiBibGFjayB3aXRoIGEgd2hpdGUgYmFja2dyb3VuZC4KKyAgICBJTUFRX1dISVRFX09OX0JMQUNLICAgICAgICA9IDQsICAgICAgICAgICAvL0RyYXdzIHRleHQgaW4gd2hpdGUgd2l0aCBhIGJsYWNrIGJhY2tncm91bmQuCisgICAgSU1BUV9GT05UX0NPTE9SX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IEZvbnRDb2xvcjsKKwordHlwZWRlZiBlbnVtIEZsaXBBeGlzX2VudW0geworICAgIElNQVFfSE9SSVpPTlRBTF9BWElTICAgICAgPSAwLCAgICAgICAgICAgLy9GbGlwcyB0aGUgaW1hZ2Ugb3ZlciB0aGUgY2VudHJhbCBob3Jpem9udGFsIGF4aXMuCisgICAgSU1BUV9WRVJUSUNBTF9BWElTICAgICAgICA9IDEsICAgICAgICAgICAvL0ZsaXBzIHRoZSBpbWFnZSBvdmVyIHRoZSBjZW50cmFsIHZlcnRpY2FsIGF4aXMuCisgICAgSU1BUV9DRU5URVJfQVhJUyAgICAgICAgICA9IDIsICAgICAgICAgICAvL0ZsaXBzIHRoZSBpbWFnZSBvdmVyIGJvdGggdGhlIGNlbnRyYWwgdmVydGljYWwgYW5kIGhvcml6b250YWwgYXhlcy4KKyAgICBJTUFRX0RJQUdfTF9UT19SX0FYSVMgICAgID0gMywgICAgICAgICAgIC8vRmxpcHMgdGhlIGltYWdlIG92ZXIgYW4gYXhpcyBmcm9tIHRoZSB1cHBlciBsZWZ0IGNvcm5lciB0byBsb3dlciByaWdodCBjb3JuZXIuCisgICAgSU1BUV9ESUFHX1JfVE9fTF9BWElTICAgICA9IDQsICAgICAgICAgICAvL0ZsaXBzIHRoZSBpbWFnZSBvdmVyIGFuIGF4aXMgZnJvbSB0aGUgdXBwZXIgcmlnaHQgY29ybmVyIHRvIGxvd2VyIGxlZnQgY29ybmVyLgorICAgIElNQVFfRkxJUF9BWElTX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IEZsaXBBeGlzOworCit0eXBlZGVmIGVudW0gRWRnZVByb2Nlc3NfZW51bSB7CisgICAgSU1BUV9GSVJTVCAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBsb29rcyBmb3IgdGhlIGZpcnN0IGVkZ2UuCisgICAgSU1BUV9GSVJTVF9BTkRfTEFTVCAgICAgICAgICA9IDEsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBsb29rcyBmb3IgdGhlIGZpcnN0IGFuZCBsYXN0IGVkZ2UuCisgICAgSU1BUV9BTEwgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBsb29rcyBmb3IgYWxsIGVkZ2VzLgorICAgIElNQVFfQkVTVCAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gbG9va3MgZm9yIHRoZSBiZXN0IGVkZ2UuCisgICAgSU1BUV9FREdFX1BST0NFU1NfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gRWRnZVByb2Nlc3M7CisKK3R5cGVkZWYgZW51bSBEcmF3TW9kZV9lbnVtIHsKKyAgICBJTUFRX0RSQVdfVkFMVUUgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vRHJhd3MgdGhlIGJvdW5kYXJ5IG9mIHRoZSBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIHBpeGVsIHZhbHVlLgorICAgIElNQVFfRFJBV19JTlZFUlQgICAgICAgICAgPSAyLCAgICAgICAgICAgLy9JbnZlcnRzIHRoZSBwaXhlbCB2YWx1ZXMgb2YgdGhlIGJvdW5kYXJ5IG9mIHRoZSBvYmplY3QuCisgICAgSU1BUV9QQUlOVF9WQUxVRSAgICAgICAgICA9IDEsICAgICAgICAgICAvL0ZpbGxzIHRoZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gcGl4ZWwgdmFsdWUuCisgICAgSU1BUV9QQUlOVF9JTlZFUlQgICAgICAgICA9IDMsICAgICAgICAgICAvL0ludmVydHMgdGhlIHBpeGVsIHZhbHVlcyBvZiB0aGUgb2JqZWN0LgorICAgIElNQVFfSElHSExJR0hUX1ZBTFVFICAgICAgPSA0LCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gZmlsbHMgdGhlIG9iamVjdCBieSBoaWdobGlnaHRpbmcgdGhlIGVuY2xvc2VkIHBpeGVscyB3aXRoIHRoZSBjb2xvciBvZiB0aGUgb2JqZWN0LgorICAgIElNQVFfRFJBV19NT0RFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IERyYXdNb2RlOworCit0eXBlZGVmIGVudW0gTmVhcmVzdE5laWdoYm9yTWV0cmljX2VudW0geworICAgIElNQVFfTUVUUklDX01BWElNVU0gICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1RoZSBtYXhpbXVtIG1ldHJpYy4KKyAgICBJTUFRX01FVFJJQ19TVU0gICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgc3VtIG1ldHJpYy4KKyAgICBJTUFRX01FVFJJQ19FVUNMSURFQU4gICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgLy9UaGUgRXVjbGlkZWFuIG1ldHJpYy4KKyAgICBJTUFRX05FQVJFU1RfTkVJR0hCT1JfTUVUUklDX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IE5lYXJlc3ROZWlnaGJvck1ldHJpYzsKKwordHlwZWRlZiBlbnVtIFJlYWRSZXNvbHV0aW9uX2VudW0geworICAgIElNQVFfTE9XX1JFU09MVVRJT04gICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9Db25maWd1cmVzIE5JIFZpc2lvbiB0byB1c2UgbG93IHJlc29sdXRpb24gZHVyaW5nIHRoZSByZWFkIHByb2Nlc3MuCisgICAgSU1BUV9NRURJVU1fUkVTT0xVVElPTiAgICAgICAgICA9IDEsICAgICAgICAgICAvL0NvbmZpZ3VyZXMgTkkgVmlzaW9uIHRvIHVzZSBtZWRpdW0gcmVzb2x1dGlvbiBkdXJpbmcgdGhlIHJlYWQgcHJvY2Vzcy4KKyAgICBJTUFRX0hJR0hfUkVTT0xVVElPTiAgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vQ29uZmlndXJlcyBOSSBWaXNpb24gdG8gdXNlIGhpZ2ggcmVzb2x1dGlvbiBkdXJpbmcgdGhlIHJlYWQgcHJvY2Vzcy4KKyAgICBJTUFRX1JFQURfUkVTT0xVVElPTl9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBSZWFkUmVzb2x1dGlvbjsKKwordHlwZWRlZiBlbnVtIFRocmVzaG9sZE1vZGVfZW51bSB7CisgICAgSU1BUV9GSVhFRF9SQU5HRSAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vUGVyZm9ybXMgdGhyZXNob2xkaW5nIHVzaW5nIHRoZSB2YWx1ZXMgeW91IHByb3ZpZGUgaW4gdGhlIGxvd1RocmVzaG9sZCBhbmQgaGlnaFRocmVzaG9sZCBlbGVtZW50cyBvZiBPQ1JQcm9jZXNzaW5nT3B0aW9ucy4KKyAgICBJTUFRX0NPTVBVVEVEX1VOSUZPUk0gICAgICAgICAgPSAxLCAgICAgICAgICAgLy9DYWxjdWxhdGVzIGEgc2luZ2xlIHRocmVzaG9sZCB2YWx1ZSBmb3IgdGhlIGVudGlyZSBST0kuCisgICAgSU1BUV9DT01QVVRFRF9MSU5FQVIgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vQ2FsY3VsYXRlcyBhIHZhbHVlIG9uIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIFJPSSwgY2FsY3VsYXRlcyBhIHZhbHVlIG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBST0ksIGFuZCBsaW5lYXJseSBmaWxscyB0aGUgbWlkZGxlIHZhbHVlcyBmcm9tIGxlZnQgdG8gcmlnaHQuCisgICAgSU1BUV9DT01QVVRFRF9OT05MSU5FQVIgICAgICAgID0gMywgICAgICAgICAgIC8vRGl2aWRlcyB0aGUgUk9JIGludG8gdGhlIG51bWJlciBvZiBibG9ja3Mgc3BlY2lmaWVkIGJ5IHRoZSBibG9ja0NvdW50IGVsZW1lbnQgb2YgT0NSUHJvY2Vzc2luZ09wdGlvbnMgYW5kIGNhbGN1bGF0ZXMgYSB0aHJlc2hvbGQgdmFsdWUgZm9yIGVhY2ggYmxvY2suCisgICAgSU1BUV9USFJFU0hPTERfTU9ERV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBUaHJlc2hvbGRNb2RlOworCit0eXBlZGVmIGVudW0gUmVhZFN0cmF0ZWd5X2VudW0geworICAgIElNQVFfUkVBRF9BR0dSRVNTSVZFICAgICAgICAgID0gMCwgICAgICAgICAgIC8vQ29uZmlndXJlcyBOSSBWaXNpb24gdG8gcGVyZm9ybSBmZXdlciBjaGVja3Mgd2hlbiBhbmFseXppbmcgb2JqZWN0cyB0byBkZXRlcm1pbmUgaWYgdGhleSBtYXRjaCB0cmFpbmVkIGNoYXJhY3RlcnMuCisgICAgSU1BUV9SRUFEX0NPTlNFUlZBVElWRSAgICAgICAgPSAxLCAgICAgICAgICAgLy9Db25maWd1cmVzIE5JIFZpc2lvbiB0byBwZXJmb3JtIG1vcmUgY2hlY2tzIHRvIGRldGVybWluZSBpZiBhbiBvYmplY3QgbWF0Y2hlcyBhIHRyYWluZWQgY2hhcmFjdGVyLgorICAgIElNQVFfUkVBRF9TVFJBVEVHWV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBSZWFkU3RyYXRlZ3k7CisKK3R5cGVkZWYgZW51bSBNZWFzdXJlbWVudFR5cGVfZW51bSB7CisgICAgSU1BUV9NVF9DRU5URVJfT0ZfTUFTU19YICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1gtY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQgcmVwcmVzZW50aW5nIHRoZSBhdmVyYWdlIHBvc2l0aW9uIG9mIHRoZSB0b3RhbCBwYXJ0aWNsZSBtYXNzLCBhc3N1bWluZyBldmVyeSBwb2ludCBpbiB0aGUgcGFydGljbGUgaGFzIGEgY29uc3RhbnQgZGVuc2l0eS4KKyAgICBJTUFRX01UX0NFTlRFUl9PRl9NQVNTX1kgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vWS1jb29yZGluYXRlIG9mIHRoZSBwb2ludCByZXByZXNlbnRpbmcgdGhlIGF2ZXJhZ2UgcG9zaXRpb24gb2YgdGhlIHRvdGFsIHBhcnRpY2xlIG1hc3MsIGFzc3VtaW5nIGV2ZXJ5IHBvaW50IGluIHRoZSBwYXJ0aWNsZSBoYXMgYSBjb25zdGFudCBkZW5zaXR5LgorICAgIElNQVFfTVRfRklSU1RfUElYRUxfWCAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgLy9YLWNvb3JkaW5hdGUgb2YgdGhlIGhpZ2hlc3QsIGxlZnRtb3N0IHBhcnRpY2xlIHBpeGVsLgorICAgIElNQVFfTVRfRklSU1RfUElYRUxfWSAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgLy9ZLWNvb3JkaW5hdGUgb2YgdGhlIGhpZ2hlc3QsIGxlZnRtb3N0IHBhcnRpY2xlIHBpeGVsLgorICAgIElNQVFfTVRfQk9VTkRJTkdfUkVDVF9MRUZUICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgLy9YLWNvb3JkaW5hdGUgb2YgdGhlIGxlZnRtb3N0IHBhcnRpY2xlIHBvaW50LgorICAgIElNQVFfTVRfQk9VTkRJTkdfUkVDVF9UT1AgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgLy9ZLWNvb3JkaW5hdGUgb2YgaGlnaGVzdCBwYXJ0aWNsZSBwb2ludC4KKyAgICBJTUFRX01UX0JPVU5ESU5HX1JFQ1RfUklHSFQgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgIC8vWC1jb29yZGluYXRlIG9mIHRoZSByaWdodG1vc3QgcGFydGljbGUgcG9pbnQuCisgICAgSU1BUV9NVF9CT1VORElOR19SRUNUX0JPVFRPTSAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAvL1ktY29vcmRpbmF0ZSBvZiB0aGUgbG93ZXN0IHBhcnRpY2xlIHBvaW50LgorICAgIElNQVFfTVRfTUFYX0ZFUkVUX0RJQU1FVEVSX1NUQVJUX1ggICAgICAgICAgPSA4LCAgICAgICAgICAgLy9YLWNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lIHNlZ21lbnQgY29ubmVjdGluZyB0aGUgdHdvIHBlcmltZXRlciBwb2ludHMgdGhhdCBhcmUgdGhlIGZ1cnRoZXN0IGFwYXJ0LgorICAgIElNQVFfTVRfTUFYX0ZFUkVUX0RJQU1FVEVSX1NUQVJUX1kgICAgICAgICAgPSA5LCAgICAgICAgICAgLy9ZLWNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lIHNlZ21lbnQgY29ubmVjdGluZyB0aGUgdHdvIHBlcmltZXRlciBwb2ludHMgdGhhdCBhcmUgdGhlIGZ1cnRoZXN0IGFwYXJ0LgorICAgIElNQVFfTVRfTUFYX0ZFUkVUX0RJQU1FVEVSX0VORF9YICAgICAgICAgICAgPSAxMCwgICAgICAgICAgLy9YLWNvb3JkaW5hdGUgb2YgdGhlIGVuZCBvZiB0aGUgbGluZSBzZWdtZW50IGNvbm5lY3RpbmcgdGhlIHR3byBwZXJpbWV0ZXIgcG9pbnRzIHRoYXQgYXJlIHRoZSBmdXJ0aGVzdCBhcGFydC4KKyAgICBJTUFRX01UX01BWF9GRVJFVF9ESUFNRVRFUl9FTkRfWSAgICAgICAgICAgID0gMTEsICAgICAgICAgIC8vWS1jb29yZGluYXRlIG9mIHRoZSBlbmQgb2YgdGhlIGxpbmUgc2VnbWVudCBjb25uZWN0aW5nIHRoZSB0d28gcGVyaW1ldGVyIHBvaW50cyB0aGF0IGFyZSB0aGUgZnVydGhlc3QgYXBhcnQuCisgICAgSU1BUV9NVF9NQVhfSE9SSVpfU0VHTUVOVF9MRU5HVEhfTEVGVCAgICAgICA9IDEyLCAgICAgICAgICAvL1gtY29vcmRpbmF0ZSBvZiB0aGUgbGVmdG1vc3QgcGl4ZWwgaW4gdGhlIGxvbmdlc3Qgcm93IG9mIGNvbnRpZ3VvdXMgcGl4ZWxzIGluIHRoZSBwYXJ0aWNsZS4KKyAgICBJTUFRX01UX01BWF9IT1JJWl9TRUdNRU5UX0xFTkdUSF9SSUdIVCAgICAgID0gMTMsICAgICAgICAgIC8vWC1jb29yZGluYXRlIG9mIHRoZSByaWdodG1vc3QgcGl4ZWwgaW4gdGhlIGxvbmdlc3Qgcm93IG9mIGNvbnRpZ3VvdXMgcGl4ZWxzIGluIHRoZSBwYXJ0aWNsZS4KKyAgICBJTUFRX01UX01BWF9IT1JJWl9TRUdNRU5UX0xFTkdUSF9ST1cgICAgICAgID0gMTQsICAgICAgICAgIC8vWS1jb29yZGluYXRlIG9mIGFsbCBvZiB0aGUgcGl4ZWxzIGluIHRoZSBsb25nZXN0IHJvdyBvZiBjb250aWd1b3VzIHBpeGVscyBpbiB0aGUgcGFydGljbGUuCisgICAgSU1BUV9NVF9CT1VORElOR19SRUNUX1dJRFRIICAgICAgICAgICAgICAgICA9IDE2LCAgICAgICAgICAvL0Rpc3RhbmNlIGJldHdlZW4gdGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgbGVmdG1vc3QgcGFydGljbGUgcG9pbnQgYW5kIHRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIHJpZ2h0bW9zdCBwYXJ0aWNsZSBwb2ludC4KKyAgICBJTUFRX01UX0JPVU5ESU5HX1JFQ1RfSEVJR0hUICAgICAgICAgICAgICAgID0gMTcsICAgICAgICAgIC8vRGlzdGFuY2UgYmV0d2VlbiB0aGUgeS1jb29yZGluYXRlIG9mIGhpZ2hlc3QgcGFydGljbGUgcG9pbnQgYW5kIHRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGxvd2VzdCBwYXJ0aWNsZSBwb2ludC4KKyAgICBJTUFRX01UX0JPVU5ESU5HX1JFQ1RfRElBR09OQUwgICAgICAgICAgICAgID0gMTgsICAgICAgICAgIC8vRGlzdGFuY2UgYmV0d2VlbiBvcHBvc2l0ZSBjb3JuZXJzIG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUuCisgICAgSU1BUV9NVF9QRVJJTUVURVIgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5LCAgICAgICAgICAvL0xlbmd0aCBvZiB0aGUgb3V0ZXIgYm91bmRhcnkgb2YgdGhlIHBhcnRpY2xlLgorICAgIElNQVFfTVRfQ09OVkVYX0hVTExfUEVSSU1FVEVSICAgICAgICAgICAgICAgPSAyMCwgICAgICAgICAgLy9QZXJpbWV0ZXIgb2YgdGhlIHNtYWxsZXN0IGNvbnZleCBwb2x5Z29uIGNvbnRhaW5pbmcgYWxsIHBvaW50cyBpbiB0aGUgcGFydGljbGUuCisgICAgSU1BUV9NVF9IT0xFU19QRVJJTUVURVIgICAgICAgICAgICAgICAgICAgICA9IDIxLCAgICAgICAgICAvL1N1bSBvZiB0aGUgcGVyaW1ldGVycyBvZiBlYWNoIGhvbGUgaW4gdGhlIHBhcnRpY2xlLgorICAgIElNQVFfTVRfTUFYX0ZFUkVUX0RJQU1FVEVSICAgICAgICAgICAgICAgICAgPSAyMiwgICAgICAgICAgLy9EaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBsaW5lIHNlZ21lbnQgY29ubmVjdGluZyB0aGUgdHdvIHBlcmltZXRlciBwb2ludHMgdGhhdCBhcmUgdGhlIGZ1cnRoZXN0IGFwYXJ0LgorICAgIElNQVFfTVRfRVFVSVZBTEVOVF9FTExJUFNFX01BSk9SX0FYSVMgICAgICAgPSAyMywgICAgICAgICAgLy9MZW5ndGggb2YgdGhlIG1ham9yIGF4aXMgb2YgdGhlIGVsbGlwc2Ugd2l0aCB0aGUgc2FtZSBwZXJpbWV0ZXIgYW5kIGFyZWEgYXMgdGhlIHBhcnRpY2xlLgorICAgIElNQVFfTVRfRVFVSVZBTEVOVF9FTExJUFNFX01JTk9SX0FYSVMgICAgICAgPSAyNCwgICAgICAgICAgLy9MZW5ndGggb2YgdGhlIG1pbm9yIGF4aXMgb2YgdGhlIGVsbGlwc2Ugd2l0aCB0aGUgc2FtZSBwZXJpbWV0ZXIgYW5kIGFyZWEgYXMgdGhlIHBhcnRpY2xlLgorICAgIElNQVFfTVRfRVFVSVZBTEVOVF9FTExJUFNFX01JTk9SX0FYSVNfRkVSRVQgPSAyNSwgICAgICAgICAgLy9MZW5ndGggb2YgdGhlIG1pbm9yIGF4aXMgb2YgdGhlIGVsbGlwc2Ugd2l0aCB0aGUgc2FtZSBhcmVhIGFzIHRoZSBwYXJ0aWNsZSwgYW5kIE1ham9yIEF4aXMgZXF1YWwgaW4gbGVuZ3RoIHRvIHRoZSBNYXggRmVyZXQgRGlhbWV0ZXIuCisgICAgSU1BUV9NVF9FUVVJVkFMRU5UX1JFQ1RfTE9OR19TSURFICAgICAgICAgICA9IDI2LCAgICAgICAgICAvL0xvbmdlc3Qgc2lkZSBvZiB0aGUgcmVjdGFuZ2xlIHdpdGggdGhlIHNhbWUgcGVyaW1ldGVyIGFuZCBhcmVhIGFzIHRoZSBwYXJ0aWNsZS4KKyAgICBJTUFRX01UX0VRVUlWQUxFTlRfUkVDVF9TSE9SVF9TSURFICAgICAgICAgID0gMjcsICAgICAgICAgIC8vU2hvcnRlc3Qgc2lkZSBvZiB0aGUgcmVjdGFuZ2xlIHdpdGggdGhlIHNhbWUgcGVyaW1ldGVyIGFuZCBhcmVhIGFzIHRoZSBwYXJ0aWNsZS4KKyAgICBJTUFRX01UX0VRVUlWQUxFTlRfUkVDVF9ESUFHT05BTCAgICAgICAgICAgID0gMjgsICAgICAgICAgIC8vRGlzdGFuY2UgYmV0d2VlbiBvcHBvc2l0ZSBjb3JuZXJzIG9mIHRoZSByZWN0YW5nbGUgd2l0aCB0aGUgc2FtZSBwZXJpbWV0ZXIgYW5kIGFyZWEgYXMgdGhlIHBhcnRpY2xlLgorICAgIElNQVFfTVRfRVFVSVZBTEVOVF9SRUNUX1NIT1JUX1NJREVfRkVSRVQgICAgPSAyOSwgICAgICAgICAgLy9TaG9ydGVzdCBzaWRlIG9mIHRoZSByZWN0YW5nbGUgd2l0aCB0aGUgc2FtZSBhcmVhIGFzIHRoZSBwYXJ0aWNsZSwgYW5kIGxvbmdlc3Qgc2lkZSBlcXVhbCBpbiBsZW5ndGggdG8gdGhlIE1heCBGZXJldCBEaWFtZXRlci4KKyAgICBJTUFRX01UX0FWRVJBR0VfSE9SSVpfU0VHTUVOVF9MRU5HVEggICAgICAgID0gMzAsICAgICAgICAgIC8vQXZlcmFnZSBsZW5ndGggb2YgYSBob3Jpem9udGFsIHNlZ21lbnQgaW4gdGhlIHBhcnRpY2xlLgorICAgIElNQVFfTVRfQVZFUkFHRV9WRVJUX1NFR01FTlRfTEVOR1RIICAgICAgICAgPSAzMSwgICAgICAgICAgLy9BdmVyYWdlIGxlbmd0aCBvZiBhIHZlcnRpY2FsIHNlZ21lbnQgaW4gdGhlIHBhcnRpY2xlLgorICAgIElNQVFfTVRfSFlEUkFVTElDX1JBRElVUyAgICAgICAgICAgICAgICAgICAgPSAzMiwgICAgICAgICAgLy9UaGUgcGFydGljbGUgYXJlYSBkaXZpZGVkIGJ5IHRoZSBwYXJ0aWNsZSBwZXJpbWV0ZXIuCisgICAgSU1BUV9NVF9XQURERUxfRElTS19ESUFNRVRFUiAgICAgICAgICAgICAgICA9IDMzLCAgICAgICAgICAvL0RpYW1ldGVyIG9mIGEgZGlzayB3aXRoIHRoZSBzYW1lIGFyZWEgYXMgdGhlIHBhcnRpY2xlLgorICAgIElNQVFfTVRfQVJFQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNSwgICAgICAgICAgLy9BcmVhIG9mIHRoZSBwYXJ0aWNsZS4KKyAgICBJTUFRX01UX0hPTEVTX0FSRUEgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzYsICAgICAgICAgIC8vU3VtIG9mIHRoZSBhcmVhcyBvZiBlYWNoIGhvbGUgaW4gdGhlIHBhcnRpY2xlLgorICAgIElNQVFfTVRfUEFSVElDTEVfQU5EX0hPTEVTX0FSRUEgICAgICAgICAgICAgPSAzNywgICAgICAgICAgLy9BcmVhIG9mIGEgcGFydGljbGUgdGhhdCBjb21wbGV0ZWx5IGNvdmVycyB0aGUgaW1hZ2UuCisgICAgSU1BUV9NVF9DT05WRVhfSFVMTF9BUkVBICAgICAgICAgICAgICAgICAgICA9IDM4LCAgICAgICAgICAvL0FyZWEgb2YgdGhlIHNtYWxsZXN0IGNvbnZleCBwb2x5Z29uIGNvbnRhaW5pbmcgYWxsIHBvaW50cyBpbiB0aGUgcGFydGljbGUuCisgICAgSU1BUV9NVF9JTUFHRV9BUkVBICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM5LCAgICAgICAgICAvL0FyZWEgb2YgdGhlIGltYWdlLgorICAgIElNQVFfTVRfTlVNQkVSX09GX0hPTEVTICAgICAgICAgICAgICAgICAgICAgPSA0MSwgICAgICAgICAgLy9OdW1iZXIgb2YgaG9sZXMgaW4gdGhlIHBhcnRpY2xlLgorICAgIElNQVFfTVRfTlVNQkVSX09GX0hPUklaX1NFR01FTlRTICAgICAgICAgICAgPSA0MiwgICAgICAgICAgLy9OdW1iZXIgb2YgaG9yaXpvbnRhbCBzZWdtZW50cyBpbiB0aGUgcGFydGljbGUuCisgICAgSU1BUV9NVF9OVU1CRVJfT0ZfVkVSVF9TRUdNRU5UUyAgICAgICAgICAgICA9IDQzLCAgICAgICAgICAvL051bWJlciBvZiB2ZXJ0aWNhbCBzZWdtZW50cyBpbiB0aGUgcGFydGljbGUuCisgICAgSU1BUV9NVF9PUklFTlRBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ1LCAgICAgICAgICAvL1RoZSBhbmdsZSBvZiB0aGUgbGluZSB0aGF0IHBhc3NlcyB0aHJvdWdoIHRoZSBwYXJ0aWNsZSBDZW50ZXIgb2YgTWFzcyBhYm91dCB3aGljaCB0aGUgcGFydGljbGUgaGFzIHRoZSBsb3dlc3QgbW9tZW50IG9mIGluZXJ0aWEuCisgICAgSU1BUV9NVF9NQVhfRkVSRVRfRElBTUVURVJfT1JJRU5UQVRJT04gICAgICA9IDQ2LCAgICAgICAgICAvL1RoZSBhbmdsZSBvZiB0aGUgbGluZSBzZWdtZW50IGNvbm5lY3RpbmcgdGhlIHR3byBwZXJpbWV0ZXIgcG9pbnRzIHRoYXQgYXJlIHRoZSBmdXJ0aGVzdCBhcGFydC4KKyAgICBJTUFRX01UX0FSRUFfQllfSU1BR0VfQVJFQSAgICAgICAgICAgICAgICAgID0gNDgsICAgICAgICAgIC8vUGVyY2VudGFnZSBvZiB0aGUgcGFydGljbGUgQXJlYSBjb3ZlcmluZyB0aGUgSW1hZ2UgQXJlYS4KKyAgICBJTUFRX01UX0FSRUFfQllfUEFSVElDTEVfQU5EX0hPTEVTX0FSRUEgICAgID0gNDksICAgICAgICAgIC8vUGVyY2VudGFnZSBvZiB0aGUgcGFydGljbGUgQXJlYSBpbiByZWxhdGlvbiB0byBpdHMgUGFydGljbGUgYW5kIEhvbGVzIEFyZWEuCisgICAgSU1BUV9NVF9SQVRJT19PRl9FUVVJVkFMRU5UX0VMTElQU0VfQVhFUyAgICA9IDUwLCAgICAgICAgICAvL0VxdWl2YWxlbnQgRWxsaXBzZSBNYWpvciBBeGlzIGRpdmlkZWQgYnkgRXF1aXZhbGVudCBFbGxpcHNlIE1pbm9yIEF4aXMuCisgICAgSU1BUV9NVF9SQVRJT19PRl9FUVVJVkFMRU5UX1JFQ1RfU0lERVMgICAgICA9IDUxLCAgICAgICAgICAvL0VxdWl2YWxlbnQgUmVjdCBMb25nIFNpZGUgZGl2aWRlZCBieSBFcXVpdmFsZW50IFJlY3QgU2hvcnQgU2lkZS4KKyAgICBJTUFRX01UX0VMT05HQVRJT05fRkFDVE9SICAgICAgICAgICAgICAgICAgID0gNTMsICAgICAgICAgIC8vTWF4IEZlcmV0IERpYW1ldGVyIGRpdmlkZWQgYnkgRXF1aXZhbGVudCBSZWN0IFNob3J0IFNpZGUgKEZlcmV0KS4KKyAgICBJTUFRX01UX0NPTVBBQ1RORVNTX0ZBQ1RPUiAgICAgICAgICAgICAgICAgID0gNTQsICAgICAgICAgIC8vQXJlYSBkaXZpZGVkIGJ5IHRoZSBwcm9kdWN0IG9mIEJvdW5kaW5nIFJlY3QgV2lkdGggYW5kIEJvdW5kaW5nIFJlY3QgSGVpZ2h0LgorICAgIElNQVFfTVRfSEVZV09PRF9DSVJDVUxBUklUWV9GQUNUT1IgICAgICAgICAgPSA1NSwgICAgICAgICAgLy9QZXJpbWV0ZXIgZGl2aWRlZCBieSB0aGUgY2lyY3VtZmVyZW5jZSBvZiBhIGNpcmNsZSB3aXRoIHRoZSBzYW1lIGFyZWEuCisgICAgSU1BUV9NVF9UWVBFX0ZBQ1RPUiAgICAgICAgICAgICAgICAgICAgICAgICA9IDU2LCAgICAgICAgICAvL0ZhY3RvciByZWxhdGluZyBhcmVhIHRvIG1vbWVudCBvZiBpbmVydGlhLgorICAgIElNQVFfTVRfU1VNX1ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1OCwgICAgICAgICAgLy9UaGUgc3VtIG9mIGFsbCB4LWNvb3JkaW5hdGVzIGluIHRoZSBwYXJ0aWNsZS4KKyAgICBJTUFRX01UX1NVTV9ZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTksICAgICAgICAgIC8vVGhlIHN1bSBvZiBhbGwgeS1jb29yZGluYXRlcyBpbiB0aGUgcGFydGljbGUuCisgICAgSU1BUV9NVF9TVU1fWFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYwLCAgICAgICAgICAvL1RoZSBzdW0gb2YgYWxsIHgtY29vcmRpbmF0ZXMgc3F1YXJlZCBpbiB0aGUgcGFydGljbGUuCisgICAgSU1BUV9NVF9TVU1fWFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYxLCAgICAgICAgICAvL1RoZSBzdW0gb2YgYWxsIHgtY29vcmRpbmF0ZXMgdGltZXMgeS1jb29yZGluYXRlcyBpbiB0aGUgcGFydGljbGUuCisgICAgSU1BUV9NVF9TVU1fWVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYyLCAgICAgICAgICAvL1RoZSBzdW0gb2YgYWxsIHktY29vcmRpbmF0ZXMgc3F1YXJlZCBpbiB0aGUgcGFydGljbGUuCisgICAgSU1BUV9NVF9TVU1fWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYzLCAgICAgICAgICAvL1RoZSBzdW0gb2YgYWxsIHgtY29vcmRpbmF0ZXMgY3ViZWQgaW4gdGhlIHBhcnRpY2xlLgorICAgIElNQVFfTVRfU1VNX1hYWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NCwgICAgICAgICAgLy9UaGUgc3VtIG9mIGFsbCB4LWNvb3JkaW5hdGVzIHNxdWFyZWQgdGltZXMgeS1jb29yZGluYXRlcyBpbiB0aGUgcGFydGljbGUuCisgICAgSU1BUV9NVF9TVU1fWFlZICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY1LCAgICAgICAgICAvL1RoZSBzdW0gb2YgYWxsIHgtY29vcmRpbmF0ZXMgdGltZXMgeS1jb29yZGluYXRlcyBzcXVhcmVkIGluIHRoZSBwYXJ0aWNsZS4KKyAgICBJTUFRX01UX1NVTV9ZWVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjYsICAgICAgICAgIC8vVGhlIHN1bSBvZiBhbGwgeS1jb29yZGluYXRlcyBjdWJlZCBpbiB0aGUgcGFydGljbGUuCisgICAgSU1BUV9NVF9NT01FTlRfT0ZfSU5FUlRJQV9YWCAgICAgICAgICAgICAgICA9IDY4LCAgICAgICAgICAvL1RoZSBtb21lbnQgb2YgaW5lcnRpYSBpbiB0aGUgeC1kaXJlY3Rpb24gdHdpY2UuCisgICAgSU1BUV9NVF9NT01FTlRfT0ZfSU5FUlRJQV9YWSAgICAgICAgICAgICAgICA9IDY5LCAgICAgICAgICAvL1RoZSBtb21lbnQgb2YgaW5lcnRpYSBpbiB0aGUgeCBhbmQgeSBkaXJlY3Rpb25zLgorICAgIElNQVFfTVRfTU9NRU5UX09GX0lORVJUSUFfWVkgICAgICAgICAgICAgICAgPSA3MCwgICAgICAgICAgLy9UaGUgbW9tZW50IG9mIGluZXJ0aWEgaW4gdGhlIHktZGlyZWN0aW9uIHR3aWNlLgorICAgIElNQVFfTVRfTU9NRU5UX09GX0lORVJUSUFfWFhYICAgICAgICAgICAgICAgPSA3MSwgICAgICAgICAgLy9UaGUgbW9tZW50IG9mIGluZXJ0aWEgaW4gdGhlIHgtZGlyZWN0aW9uIHRocmVlIHRpbWVzLgorICAgIElNQVFfTVRfTU9NRU5UX09GX0lORVJUSUFfWFhZICAgICAgICAgICAgICAgPSA3MiwgICAgICAgICAgLy9UaGUgbW9tZW50IG9mIGluZXJ0aWEgaW4gdGhlIHgtZGlyZWN0aW9uIHR3aWNlIGFuZCB0aGUgeS1kaXJlY3Rpb24gb25jZS4KKyAgICBJTUFRX01UX01PTUVOVF9PRl9JTkVSVElBX1hZWSAgICAgICAgICAgICAgID0gNzMsICAgICAgICAgIC8vVGhlIG1vbWVudCBvZiBpbmVydGlhIGluIHRoZSB4LWRpcmVjdGlvbiBvbmNlIGFuZCB0aGUgeS1kaXJlY3Rpb24gdHdpY2UuCisgICAgSU1BUV9NVF9NT01FTlRfT0ZfSU5FUlRJQV9ZWVkgICAgICAgICAgICAgICA9IDc0LCAgICAgICAgICAvL1RoZSBtb21lbnQgb2YgaW5lcnRpYSBpbiB0aGUgeS1kaXJlY3Rpb24gdGhyZWUgdGltZXMuCisgICAgSU1BUV9NVF9OT1JNX01PTUVOVF9PRl9JTkVSVElBX1hYICAgICAgICAgICA9IDc1LCAgICAgICAgICAvL1RoZSBub3JtYWxpemVkIG1vbWVudCBvZiBpbmVydGlhIGluIHRoZSB4LWRpcmVjdGlvbiB0d2ljZS4KKyAgICBJTUFRX01UX05PUk1fTU9NRU5UX09GX0lORVJUSUFfWFkgICAgICAgICAgID0gNzYsICAgICAgICAgIC8vVGhlIG5vcm1hbGl6ZWQgbW9tZW50IG9mIGluZXJ0aWEgaW4gdGhlIHgtIGFuZCB5LWRpcmVjdGlvbnMuCisgICAgSU1BUV9NVF9OT1JNX01PTUVOVF9PRl9JTkVSVElBX1lZICAgICAgICAgICA9IDc3LCAgICAgICAgICAvL1RoZSBub3JtYWxpemVkIG1vbWVudCBvZiBpbmVydGlhIGluIHRoZSB5LWRpcmVjdGlvbiB0d2ljZS4KKyAgICBJTUFRX01UX05PUk1fTU9NRU5UX09GX0lORVJUSUFfWFhYICAgICAgICAgID0gNzgsICAgICAgICAgIC8vVGhlIG5vcm1hbGl6ZWQgbW9tZW50IG9mIGluZXJ0aWEgaW4gdGhlIHgtZGlyZWN0aW9uIHRocmVlIHRpbWVzLgorICAgIElNQVFfTVRfTk9STV9NT01FTlRfT0ZfSU5FUlRJQV9YWFkgICAgICAgICAgPSA3OSwgICAgICAgICAgLy9UaGUgbm9ybWFsaXplZCBtb21lbnQgb2YgaW5lcnRpYSBpbiB0aGUgeC1kaXJlY3Rpb24gdHdpY2UgYW5kIHRoZSB5LWRpcmVjdGlvbiBvbmNlLgorICAgIElNQVFfTVRfTk9STV9NT01FTlRfT0ZfSU5FUlRJQV9YWVkgICAgICAgICAgPSA4MCwgICAgICAgICAgLy9UaGUgbm9ybWFsaXplZCBtb21lbnQgb2YgaW5lcnRpYSBpbiB0aGUgeC1kaXJlY3Rpb24gb25jZSBhbmQgdGhlIHktZGlyZWN0aW9uIHR3aWNlLgorICAgIElNQVFfTVRfTk9STV9NT01FTlRfT0ZfSU5FUlRJQV9ZWVkgICAgICAgICAgPSA4MSwgICAgICAgICAgLy9UaGUgbm9ybWFsaXplZCBtb21lbnQgb2YgaW5lcnRpYSBpbiB0aGUgeS1kaXJlY3Rpb24gdGhyZWUgdGltZXMuCisgICAgSU1BUV9NVF9IVV9NT01FTlRfMSAgICAgICAgICAgICAgICAgICAgICAgICA9IDgyLCAgICAgICAgICAvL1RoZSBmaXJzdCBIdSBtb21lbnQuCisgICAgSU1BUV9NVF9IVV9NT01FTlRfMiAgICAgICAgICAgICAgICAgICAgICAgICA9IDgzLCAgICAgICAgICAvL1RoZSBzZWNvbmQgSHUgbW9tZW50LgorICAgIElNQVFfTVRfSFVfTU9NRU5UXzMgICAgICAgICAgICAgICAgICAgICAgICAgPSA4NCwgICAgICAgICAgLy9UaGUgdGhpcmQgSHUgbW9tZW50LgorICAgIElNQVFfTVRfSFVfTU9NRU5UXzQgICAgICAgICAgICAgICAgICAgICAgICAgPSA4NSwgICAgICAgICAgLy9UaGUgZm91cnRoIEh1IG1vbWVudC4KKyAgICBJTUFRX01UX0hVX01PTUVOVF81ICAgICAgICAgICAgICAgICAgICAgICAgID0gODYsICAgICAgICAgIC8vVGhlIGZpZnRoIEh1IG1vbWVudC4KKyAgICBJTUFRX01UX0hVX01PTUVOVF82ICAgICAgICAgICAgICAgICAgICAgICAgID0gODcsICAgICAgICAgIC8vVGhlIHNpeHRoIEh1IG1vbWVudC4KKyAgICBJTUFRX01UX0hVX01PTUVOVF83ICAgICAgICAgICAgICAgICAgICAgICAgID0gODgsICAgICAgICAgIC8vVGhlIHNldmVudGggSHUgbW9tZW50LgorICAgIElNQVFfTUVBU1VSRU1FTlRfVFlQRV9TSVpFX0dVQVJEICAgICAgICAgICAgPSAweEZGRkZGRkZGICAgCit9IE1lYXN1cmVtZW50VHlwZTsKKwordHlwZWRlZiBlbnVtIEdlb21ldHJpY01hdGNoaW5nTW9kZV9lbnVtIHsKKyAgICBJTUFRX0dFT01FVFJJQ19NQVRDSF9TSElGVF9JTlZBUklBTlQgICAgID0gMCwgICAgICAgICAgIC8vU2VhcmNoZXMgZm9yIG9jY3VycmVuY2VzIG9mIHRoZSBwYXR0ZXJuIGluIHRoZSBpbWFnZSwgYXNzdW1pbmcgdGhhdCB0aGUgcGF0dGVybiBpcyBub3Qgcm90YXRlZCBtb3JlIHRoYW4gcGx1cyBvciBtaW51cyA1IGRlZ3JlZXMuCisgICAgSU1BUV9HRU9NRVRSSUNfTUFUQ0hfUk9UQVRJT05fSU5WQVJJQU5UICA9IDEsICAgICAgICAgICAvL1NlYXJjaGVzIGZvciBvY2N1cnJlbmNlcyBvZiB0aGUgcGF0dGVybiBpbiB0aGUgaW1hZ2Ugd2l0aCByZWR1Y2VkIHJlc3RyaWN0aW9uIG9uIHRoZSByb3RhdGlvbiBvZiB0aGUgcGF0dGVybi4KKyAgICBJTUFRX0dFT01FVFJJQ19NQVRDSF9TQ0FMRV9JTlZBUklBTlQgICAgID0gMiwgICAgICAgICAgIC8vU2VhcmNoZXMgZm9yIG9jY3VycmVuY2VzIG9mIHRoZSBwYXR0ZXJuIGluIHRoZSBpbWFnZSB3aXRoIHJlZHVjZWQgcmVzdHJpY3Rpb24gb24gdGhlIHNpemUgb2YgdGhlIHBhdHRlcm4uCisgICAgSU1BUV9HRU9NRVRSSUNfTUFUQ0hfT0NDTFVTSU9OX0lOVkFSSUFOVCA9IDQsICAgICAgICAgICAvL1NlYXJjaGVzIGZvciBvY2N1cnJlbmNlcyBvZiB0aGUgcGF0dGVybiBpbiB0aGUgaW1hZ2UsIGFsbG93aW5nIGZvciBhIHNwZWNpZmllZCBwZXJjZW50YWdlIG9mIHRoZSBwYXR0ZXJuIHRvIGJlIG9jY2x1ZGVkLgorICAgIElNQVFfR0VPTUVUUklDX01BVENISU5HX01PREVfU0laRV9HVUFSRCAgPSAweEZGRkZGRkZGICAgCit9IEdlb21ldHJpY01hdGNoaW5nTW9kZTsKKwordHlwZWRlZiBlbnVtIEJ1dHRvbkxhYmVsX2VudW0geworICAgIElNQVFfQlVUVE9OX09LICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgbGFiZWwgIk9LIi4KKyAgICBJTUFRX0JVVFRPTl9TQVZFICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vVGhlIGxhYmVsICJTYXZlIi4KKyAgICBJTUFRX0JVVFRPTl9TRUxFQ1QgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vVGhlIGxhYmVsICJTZWxlY3QiLgorICAgIElNQVFfQlVUVE9OX0xPQUQgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgLy9UaGUgbGFiZWwgIkxvYWQiLgorICAgIElNQVFfQlVUVE9OX0xBQkVMX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IEJ1dHRvbkxhYmVsOworCit0eXBlZGVmIGVudW0gTmVhcmVzdE5laWdoYm9yTWV0aG9kX2VudW0geworICAgIElNQVFfTUlOSU1VTV9NRUFOX0RJU1RBTkNFICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1RoZSBtaW5pbXVtIG1lYW4gZGlzdGFuY2UgbWV0aG9kLgorICAgIElNQVFfS19ORUFSRVNUX05FSUdIQk9SICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1RoZSBrLW5lYXJlc3QgbmVpZ2hib3IgbWV0aG9kLgorICAgIElNQVFfTkVBUkVTVF9QUk9UT1RZUEUgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAvL1RoZSBuZWFyZXN0IHByb3RvdHlwZSBtZXRob2QuCisgICAgSU1BUV9ORUFSRVNUX05FSUdIQk9SX01FVEhPRF9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBOZWFyZXN0TmVpZ2hib3JNZXRob2Q7CisKK3R5cGVkZWYgZW51bSBRUk1pcnJvck1vZGVfZW51bSB7CisgICAgSU1BUV9RUl9NSVJST1JfTU9ERV9BVVRPX0RFVEVDVCA9IC0yLCAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBzaG91bGQgZGV0ZXJtaW5lIGlmIHRoZSBRUiBjb2RlIGlzIG1pcnJvcmVkLgorICAgIElNQVFfUVJfTUlSUk9SX01PREVfTUlSUk9SRUQgICAgPSAxLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gc2hvdWxkIGV4cGVjdCB0aGUgUVIgY29kZSB0byBhcHBlYXIgbWlycm9yZWQuCisgICAgSU1BUV9RUl9NSVJST1JfTU9ERV9OT1JNQUwgICAgICA9IDAsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBzaG91bGQgZXhwZWN0IHRoZSBRUiBjb2RlIHRvIGFwcGVhciBub3JtYWwuCisgICAgSU1BUV9RUl9NSVJST1JfTU9ERV9TSVpFX0dVQVJEICA9IDB4RkZGRkZGRkYgICAKK30gUVJNaXJyb3JNb2RlOworCit0eXBlZGVmIGVudW0gQ29sdW1uUHJvY2Vzc2luZ01vZGVfZW51bSB7CisgICAgSU1BUV9BVkVSQUdFX0NPTFVNTlMgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9BdmVyYWdlcyB0aGUgZGF0YSBleHRyYWN0ZWQgZm9yIGVkZ2UgZGV0ZWN0aW9uLgorICAgIElNQVFfTUVESUFOX0NPTFVNTlMgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vVGFrZXMgdGhlIG1lZGlhbiBvZiB0aGUgZGF0YSBleHRyYWN0ZWQgZm9yIGVkZ2UgZGV0ZWN0aW9uLgorICAgIElNQVFfQ09MVU1OX1BST0NFU1NJTkdfTU9ERV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBDb2x1bW5Qcm9jZXNzaW5nTW9kZTsKKwordHlwZWRlZiBlbnVtIEZpbmRSZWZlcmVuY2VEaXJlY3Rpb25fZW51bSB7CisgICAgSU1BUV9MRUZUX1RPX1JJR0hUX0RJUkVDVCAgICAgICAgICA9IDAsICAgICAgICAgICAvL1NlYXJjaGVzIGZyb20gdGhlIGxlZnQgc2lkZSBvZiB0aGUgc2VhcmNoIGFyZWEgdG8gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIHNlYXJjaCBhcmVhIGZvciBhIGRpcmVjdCBheGlzLgorICAgIElNQVFfTEVGVF9UT19SSUdIVF9JTkRJUkVDVCAgICAgICAgPSAxLCAgICAgICAgICAgLy9TZWFyY2hlcyBmcm9tIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIHNlYXJjaCBhcmVhIHRvIHRoZSByaWdodCBzaWRlIG9mIHRoZSBzZWFyY2ggYXJlYSBmb3IgYW4gaW5kaXJlY3QgYXhpcy4KKyAgICBJTUFRX1RPUF9UT19CT1RUT01fRElSRUNUICAgICAgICAgID0gMiwgICAgICAgICAgIC8vU2VhcmNoZXMgZnJvbSB0aGUgdG9wIG9mIHRoZSBzZWFyY2ggYXJlYSB0byB0aGUgYm90dG9tIG9mIHRoZSBzZWFyY2ggYXJlYSBmb3IgYSBkaXJlY3QgYXhpcy4KKyAgICBJTUFRX1RPUF9UT19CT1RUT01fSU5ESVJFQ1QgICAgICAgID0gMywgICAgICAgICAgIC8vU2VhcmNoZXMgZnJvbSB0aGUgdG9wIG9mIHRoZSBzZWFyY2ggYXJlYSB0byB0aGUgYm90dG9tIG9mIHRoZSBzZWFyY2ggYXJlYSBmb3IgYW4gaW5kaXJlY3QgYXhpcy4KKyAgICBJTUFRX1JJR0hUX1RPX0xFRlRfRElSRUNUICAgICAgICAgID0gNCwgICAgICAgICAgIC8vU2VhcmNoZXMgZnJvbSB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgc2VhcmNoIGFyZWEgdG8gdGhlIGxlZnQgc2lkZSBvZiB0aGUgc2VhcmNoIGFyZWEgZm9yIGEgZGlyZWN0IGF4aXMuCisgICAgSU1BUV9SSUdIVF9UT19MRUZUX0lORElSRUNUICAgICAgICA9IDUsICAgICAgICAgICAvL1NlYXJjaGVzIGZyb20gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIHNlYXJjaCBhcmVhIHRvIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIHNlYXJjaCBhcmVhIGZvciBhbiBpbmRpcmVjdCBheGlzLgorICAgIElNQVFfQk9UVE9NX1RPX1RPUF9ESVJFQ1QgICAgICAgICAgPSA2LCAgICAgICAgICAgLy9TZWFyY2hlcyBmcm9tIHRoZSBib3R0b20gb2YgdGhlIHNlYXJjaCBhcmVhIHRvIHRoZSB0b3Agb2YgdGhlIHNlYXJjaCBhcmVhIGZvciBhIGRpcmVjdCBheGlzLgorICAgIElNQVFfQk9UVE9NX1RPX1RPUF9JTkRJUkVDVCAgICAgICAgPSA3LCAgICAgICAgICAgLy9TZWFyY2hlcyBmcm9tIHRoZSBib3R0b20gb2YgdGhlIHNlYXJjaCBhcmVhIHRvIHRoZSB0b3Agb2YgdGhlIHNlYXJjaCBhcmVhIGZvciBhbiBpbmRpcmVjdCBheGlzLgorICAgIElNQVFfRklORF9DT09SRF9TWVNfRElSX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IEZpbmRSZWZlcmVuY2VEaXJlY3Rpb247CisKK3R5cGVkZWYgZW51bSBNdWx0aWNvcmVPcGVyYXRpb25fZW51bSB7CisgICAgSU1BUV9HRVRfQ09SRVMgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgbnVtYmVyIG9mIHByb2Nlc3NvciBjb3JlcyBOSSBWaXNpb24gaXMgY3VycmVudGx5IHVzaW5nLgorICAgIElNQVFfU0VUX0NPUkVTICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vVGhlIG51bWJlciBvZiBwcm9jZXNzb3IgY29yZXMgZm9yIE5JIFZpc2lvbiB0byB1c2UuCisgICAgSU1BUV9VU0VfTUFYX0FWQUlMQUJMRSAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgLy9Vc2UgdGhlIG1heGltdW0gbnVtYmVyIG9mIGF2YWlsYWJsZSBwcm9jZXNzb3IgY29yZXMuCisgICAgSU1BUV9NVUxUSUNPUkVfT1BFUkFUSU9OX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IE11bHRpY29yZU9wZXJhdGlvbjsKKwordHlwZWRlZiBlbnVtIEdyb3VwQmVoYXZpb3JfZW51bSB7CisgICAgSU1BUV9HUk9VUF9DTEVBUiAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vU2V0cyB0aGUgYmVoYXZpb3Igb2YgdGhlIG92ZXJsYXkgZ3JvdXAgdG8gY2xlYXIgdGhlIGN1cnJlbnQgc2V0dGluZ3Mgd2hlbiBhbiBpbWFnZSBpcyB0cmFuc2Zvcm1lZC4KKyAgICBJTUFRX0dST1VQX0tFRVAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9TZXRzIHRoZSBiZWhhdmlvciBvZiB0aGUgb3ZlcmxheSBncm91cCB0byBrZWVwIHRoZSBjdXJyZW50IHNldHRpbmdzIHdoZW4gYW4gaW1hZ2UgaXMgdHJhbnNmb3JtZWQuCisgICAgSU1BUV9HUk9VUF9UUkFOU0ZPUk0gICAgICAgICAgID0gMiwgICAgICAgICAgIC8vU2V0cyB0aGUgYmVoYXZpb3Igb2YgdGhlIG92ZXJsYXkgZ3JvdXAgdG8gdHJhbnNmb3JtIHdpdGggdGhlIGltYWdlLgorICAgIElNQVFfR1JPVVBfQkVIQVZJT1JfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gR3JvdXBCZWhhdmlvcjsKKwordHlwZWRlZiBlbnVtIFFSRGltZW5zaW9uc19lbnVtIHsKKyAgICBJTUFRX1FSX0RJTUVOU0lPTlNfQVVUT19ERVRFQ1QgPSAwLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gd2lsbCBhdXRvbWF0aWNhbGx5IGRldGVybWluZSB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUVIgY29kZS4KKyAgICBJTUFRX1FSX0RJTUVOU0lPTlNfMTF4MTEgICAgICAgPSAxMSwgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgMTEgeCAxMS4KKyAgICBJTUFRX1FSX0RJTUVOU0lPTlNfMTN4MTMgICAgICAgPSAxMywgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgMTMgeCAxMy4KKyAgICBJTUFRX1FSX0RJTUVOU0lPTlNfMTV4MTUgICAgICAgPSAxNSwgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgMTUgeCAxNS4KKyAgICBJTUFRX1FSX0RJTUVOU0lPTlNfMTd4MTcgICAgICAgPSAxNywgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgMTcgeCAxNy4KKyAgICBJTUFRX1FSX0RJTUVOU0lPTlNfMjF4MjEgICAgICAgPSAyMSwgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgMjEgeCAyMS4KKyAgICBJTUFRX1FSX0RJTUVOU0lPTlNfMjV4MjUgICAgICAgPSAyNSwgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgMjUgeCAyNS4KKyAgICBJTUFRX1FSX0RJTUVOU0lPTlNfMjl4MjkgICAgICAgPSAyOSwgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgMjkgeCAyOS4KKyAgICBJTUFRX1FSX0RJTUVOU0lPTlNfMzN4MzMgICAgICAgPSAzMywgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgMzMgeCAzMy4KKyAgICBJTUFRX1FSX0RJTUVOU0lPTlNfMzd4MzcgICAgICAgPSAzNywgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgMzcgeCAzNy4KKyAgICBJTUFRX1FSX0RJTUVOU0lPTlNfNDF4NDEgICAgICAgPSA0MSwgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgNDEgeCA0MS4KKyAgICBJTUFRX1FSX0RJTUVOU0lPTlNfNDV4NDUgICAgICAgPSA0NSwgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgNDUgeCA0NS4KKyAgICBJTUFRX1FSX0RJTUVOU0lPTlNfNDl4NDkgICAgICAgPSA0OSwgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgNDkgeCA0OS4KKyAgICBJTUFRX1FSX0RJTUVOU0lPTlNfNTN4NTMgICAgICAgPSA1MywgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgNTMgeCA1My4KKyAgICBJTUFRX1FSX0RJTUVOU0lPTlNfNTd4NTcgICAgICAgPSA1NywgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgNTcgeCA1Ny4KKyAgICBJTUFRX1FSX0RJTUVOU0lPTlNfNjF4NjEgICAgICAgPSA2MSwgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgNjEgeCA2MS4KKyAgICBJTUFRX1FSX0RJTUVOU0lPTlNfNjV4NjUgICAgICAgPSA2NSwgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgNjUgeCA2NS4KKyAgICBJTUFRX1FSX0RJTUVOU0lPTlNfNjl4NjkgICAgICAgPSA2OSwgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgNjkgeCA2OS4KKyAgICBJTUFRX1FSX0RJTUVOU0lPTlNfNzN4NzMgICAgICAgPSA3MywgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgNzMgeCA3My4KKyAgICBJTUFRX1FSX0RJTUVOU0lPTlNfNzd4NzcgICAgICAgPSA3NywgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgNzcgeCA3Ny4KKyAgICBJTUFRX1FSX0RJTUVOU0lPTlNfODF4ODEgICAgICAgPSA4MSwgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgODEgeCA4MS4KKyAgICBJTUFRX1FSX0RJTUVOU0lPTlNfODV4ODUgICAgICAgPSA4NSwgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgODUgeCA4NS4KKyAgICBJTUFRX1FSX0RJTUVOU0lPTlNfODl4ODkgICAgICAgPSA4OSwgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgODkgeCA4OS4KKyAgICBJTUFRX1FSX0RJTUVOU0lPTlNfOTN4OTMgICAgICAgPSA5MywgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgOTMgeCA5My4KKyAgICBJTUFRX1FSX0RJTUVOU0lPTlNfOTd4OTcgICAgICAgPSA5NywgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgOTcgeCA5Ny4KKyAgICBJTUFRX1FSX0RJTUVOU0lPTlNfMTAxeDEwMSAgICAgPSAxMDEsICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgMTAxIHggMTAxLgorICAgIElNQVFfUVJfRElNRU5TSU9OU18xMDV4MTA1ICAgICA9IDEwNSwgICAgICAgICAvL1NwZWNpZmllcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUVIgY29kZSBhcyAxMDUgeCAxMDUuCisgICAgSU1BUV9RUl9ESU1FTlNJT05TXzEwOXgxMDkgICAgID0gMTA5LCAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDEwOSB4IDEwOS4KKyAgICBJTUFRX1FSX0RJTUVOU0lPTlNfMTEzeDExMyAgICAgPSAxMTMsICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgMTEzIHggMTEzLgorICAgIElNQVFfUVJfRElNRU5TSU9OU18xMTd4MTE3ICAgICA9IDExNywgICAgICAgICAvL1NwZWNpZmllcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUVIgY29kZSBhcyAxMTcgeCAxMTcuCisgICAgSU1BUV9RUl9ESU1FTlNJT05TXzEyMXgxMjEgICAgID0gMTIxLCAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDEyMSB4IDEyMS4KKyAgICBJTUFRX1FSX0RJTUVOU0lPTlNfMTI1eDEyNSAgICAgPSAxMjUsICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgMTI1IHggMTI1LgorICAgIElNQVFfUVJfRElNRU5TSU9OU18xMjl4MTI5ICAgICA9IDEyOSwgICAgICAgICAvL1NwZWNpZmllcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUVIgY29kZSBhcyAxMjkgeCAxMjkuCisgICAgSU1BUV9RUl9ESU1FTlNJT05TXzEzM3gxMzMgICAgID0gMTMzLCAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDEzMyB4IDEzMy4KKyAgICBJTUFRX1FSX0RJTUVOU0lPTlNfMTM3eDEzNyAgICAgPSAxMzcsICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgMTM3IHggMTM3LgorICAgIElNQVFfUVJfRElNRU5TSU9OU18xNDF4MTQxICAgICA9IDE0MSwgICAgICAgICAvL1NwZWNpZmllcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUVIgY29kZSBhcyAxNDEgeCAxNDEuCisgICAgSU1BUV9RUl9ESU1FTlNJT05TXzE0NXgxNDUgICAgID0gMTQ1LCAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDE0NSB4IDE0NS4KKyAgICBJTUFRX1FSX0RJTUVOU0lPTlNfMTQ5eDE0OSAgICAgPSAxNDksICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgMTQ5IHggMTQ5LgorICAgIElNQVFfUVJfRElNRU5TSU9OU18xNTN4MTUzICAgICA9IDE1MywgICAgICAgICAvL1NwZWNpZmllcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUVIgY29kZSBhcyAxNTMgeCAxNTMuCisgICAgSU1BUV9RUl9ESU1FTlNJT05TXzE1N3gxNTcgICAgID0gMTU3LCAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDE1NyB4IDE1MzcuCisgICAgSU1BUV9RUl9ESU1FTlNJT05TXzE2MXgxNjEgICAgID0gMTYxLCAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDE2MSB4IDE2MS4KKyAgICBJTUFRX1FSX0RJTUVOU0lPTlNfMTY1eDE2NSAgICAgPSAxNjUsICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgMTY1IHggMTY1LgorICAgIElNQVFfUVJfRElNRU5TSU9OU18xNjl4MTY5ICAgICA9IDE2OSwgICAgICAgICAvL1NwZWNpZmllcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUVIgY29kZSBhcyAxNjkgeCAxNjkuCisgICAgSU1BUV9RUl9ESU1FTlNJT05TXzE3M3gxNzMgICAgID0gMTczLCAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDE3MyB4IDE3My4KKyAgICBJTUFRX1FSX0RJTUVOU0lPTlNfMTc3eDE3NyAgICAgPSAxNzcsICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgMTc3IHggMTc3LgorICAgIElNQVFfUVJfRElNRU5TSU9OU19TSVpFX0dVQVJEICA9IDB4RkZGRkZGRkYgICAKK30gUVJEaW1lbnNpb25zOworCit0eXBlZGVmIGVudW0gUVJDZWxsRmlsdGVyTW9kZV9lbnVtIHsKKyAgICBJTUFRX1FSX0NFTExfRklMVEVSX01PREVfQVVUT19ERVRFQ1QgICAgICAgPSAtMiwgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gd2lsbCB0cnkgYWxsIGZpbHRlciBtb2RlcyBhbmQgdXNlcyB0aGUgb25lIHRoYXQgZGVjb2RlcyB0aGUgUVIgY29kZSB3aXRoaW4gdGhlIGZld2VzdCBpdGVyYXRpb25zIGFuZCB1dGlsaXppbmcgdGhlIGxlYXN0IGFtb3VudCBvZiBlcnJvciBjb3JyZWN0aW9uLgorICAgIElNQVFfUVJfQ0VMTF9GSUxURVJfTU9ERV9BVkVSQUdFICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBzZXRzIHRoZSBwaXhlbCB2YWx1ZSBmb3IgdGhlIGNlbGwgdG8gdGhlIGF2ZXJhZ2Ugb2YgdGhlIHNhbXBsZWQgcGl4ZWxzLgorICAgIElNQVFfUVJfQ0VMTF9GSUxURVJfTU9ERV9NRURJQU4gICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBzZXRzIHRoZSBwaXhlbCB2YWx1ZSBmb3IgdGhlIGNlbGwgdG8gdGhlIG1lZGlhbiBvZiB0aGUgc2FtcGxlZCBwaXhlbHMuCisgICAgSU1BUV9RUl9DRUxMX0ZJTFRFUl9NT0RFX0NFTlRSQUxfQVZFUkFHRSAgID0gMiwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHNldHMgdGhlIHBpeGVsIHZhbHVlIGZvciB0aGUgY2VsbCB0byB0aGUgYXZlcmFnZSBvZiB0aGUgcGl4ZWxzIGluIHRoZSBjZW50ZXIgb2YgdGhlIGNlbGwgc2FtcGxlLgorICAgIElNQVFfUVJfQ0VMTF9GSUxURVJfTU9ERV9ISUdIX0FWRVJBR0UgICAgICA9IDMsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBzZXRzIHRoZSBwaXhlbCB2YWx1ZSBmb3IgdGhlIGNlbGwgdG8gdGhlIGF2ZXJhZ2UgdmFsdWUgb2YgdGhlIGhhbGYgb2YgdGhlIHNhbXBsZWQgcGl4ZWxzIHdpdGggdGhlIGhpZ2hlc3QgcGl4ZWwgdmFsdWVzLgorICAgIElNQVFfUVJfQ0VMTF9GSUxURVJfTU9ERV9MT1dfQVZFUkFHRSAgICAgICA9IDQsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBzZXRzIHRoZSBwaXhlbCB2YWx1ZSBmb3IgdGhlIGNlbGwgdG8gdGhlIGF2ZXJhZ2UgdmFsdWUgb2YgdGhlIGhhbGYgb2YgdGhlIHNhbXBsZWQgcGl4ZWxzIHdpdGggdGhlIGxvd2VzdCBwaXhlbCB2YWx1ZXMuCisgICAgSU1BUV9RUl9DRUxMX0ZJTFRFUl9NT0RFX1ZFUllfSElHSF9BVkVSQUdFID0gNSwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHNldHMgdGhlIHBpeGVsIHZhbHVlIGZvciB0aGUgY2VsbCB0byB0aGUgYXZlcmFnZSB2YWx1ZSBvZiB0aGUgbmludGggb2YgdGhlIHNhbXBsZWQgcGl4ZWxzIHdpdGggdGhlIGhpZ2hlc3QgcGl4ZWwgdmFsdWVzLgorICAgIElNQVFfUVJfQ0VMTF9GSUxURVJfTU9ERV9WRVJZX0xPV19BVkVSQUdFICA9IDYsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBzZXRzIHRoZSBwaXhlbCB2YWx1ZSBmb3IgdGhlIGNlbGwgdG8gdGhlIGF2ZXJhZ2UgdmFsdWUgb2YgdGhlIG5pbnRoIG9mIHRoZSBzYW1wbGVkIHBpeGVscyB3aXRoIHRoZSBsb3dlc3QgcGl4ZWwgdmFsdWVzLgorICAgIElNQVFfUVJfQ0VMTF9GSUxURVJfTU9ERV9BTEwgICAgICAgICAgICAgICA9IDgsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB0cmllcyBlYWNoIGZpbHRlciBtb2RlLCBzdGFydGluZyB3aXRoIElNQVFfUVJfQ0VMTF9GSUxURVJfTU9ERV9BVkVSQUdFIGFuZCBlbmRpbmcgd2l0aCBJTUFRX1FSX0NFTExfRklMVEVSX01PREVfVkVSWV9MT1dfQVZFUkFHRSwgc3RvcHBpbmcgb25jZSBhIGZpbHRlciBtb2RlIGRlY29kZXMgY29ycmVjdGx5LgorICAgIElNQVFfUVJfQ0VMTF9GSUxURVJfTU9ERV9TSVpFX0dVQVJEICAgICAgICA9IDB4RkZGRkZGRkYgICAKK30gUVJDZWxsRmlsdGVyTW9kZTsKKwordHlwZWRlZiBlbnVtIFJvdW5kaW5nTW9kZV9lbnVtIHsKKyAgICBJTUFRX1JPVU5ESU5HX01PREVfT1BUSU1JWkUgICA9IDAsICAgICAgICAgICAvL1JvdW5kcyB0aGUgcmVzdWx0IG9mIGEgZGl2aXNpb24gdXNpbmcgdGhlIGJlc3QgYXZhaWxhYmxlIG1ldGhvZC4KKyAgICBJTUFRX1JPVU5ESU5HX01PREVfVFJVTkNBVEUgICA9IDEsICAgICAgICAgICAvL1RydW5jYXRlcyB0aGUgcmVzdWx0IG9mIGEgZGl2aXNpb24uCisgICAgSU1BUV9ST1VORElOR19NT0RFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IFJvdW5kaW5nTW9kZTsKKwordHlwZWRlZiBlbnVtIFFSRGVtb2R1bGF0aW9uTW9kZV9lbnVtIHsKKyAgICBJTUFRX1FSX0RFTU9EVUxBVElPTl9NT0RFX0FVVE9fREVURUNUICAgID0gLTIsICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHdpbGwgdHJ5IGVhY2ggZGVtb2R1bGF0aW9uIG1vZGUgYW5kIHVzZSB0aGUgb25lIHdoaWNoIGRlY29kZXMgdGhlIFFSIGNvZGUgd2l0aGluIHRoZSBmZXdlc3QgaXRlcmF0aW9ucyBhbmQgdXRpbGl6aW5nIHRoZSBsZWFzdCBhbW91bnQgb2YgZXJyb3IgY29ycmVjdGlvbi4KKyAgICBJTUFRX1FSX0RFTU9EVUxBVElPTl9NT0RFX0hJU1RPR1JBTSAgICAgID0gMCwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHVzZXMgYSBoaXN0b2dyYW0gb2YgYWxsIG9mIHRoZSBRUiBjZWxscyB0byBjYWxjdWxhdGUgYSB0aHJlc2hvbGQuCisgICAgSU1BUV9RUl9ERU1PRFVMQVRJT05fTU9ERV9MT0NBTF9DT05UUkFTVCA9IDEsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBleGFtaW5lcyBlYWNoIG9mIHRoZSBjZWxsJ3MgbmVpZ2hib3JzIHRvIGRldGVybWluZSBpZiB0aGUgY2VsbCBpcyBvbiBvciBvZmYuCisgICAgSU1BUV9RUl9ERU1PRFVMQVRJT05fTU9ERV9DT01CSU5FRCAgICAgICA9IDIsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB1c2VzIHRoZSBoaXN0b2dyYW0gb2YgdGhlIFFSIGNvZGUgdG8gY2FsY3VsYXRlIGEgdGhyZXNob2xkLgorICAgIElNQVFfUVJfREVNT0RVTEFUSU9OX01PREVfQUxMICAgICAgICAgICAgPSAzLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdHJpZXMgSU1BUV9RUl9ERU1PRFVMQVRJT05fTU9ERV9ISVNUT0dSQU0sIHRoZW4gSU1BUV9RUl9ERU1PRFVMQVRJT05fTU9ERV9MT0NBTF9DT05UUkFTVCBhbmQgdGhlbiBJTUFRX1FSX0RFTU9EVUxBVElPTl9NT0RFX0NPTUJJTkVELCBzdG9wcGluZyBvbmNlIG9uZSBtb2RlIGlzIHN1Y2Nlc3NmdWwuCisgICAgSU1BUV9RUl9ERU1PRFVMQVRJT05fTU9ERV9TSVpFX0dVQVJEICAgICA9IDB4RkZGRkZGRkYgICAKK30gUVJEZW1vZHVsYXRpb25Nb2RlOworCit0eXBlZGVmIGVudW0gQ29udHJhc3RNb2RlX2VudW0geworICAgIElNQVFfT1JJR0lOQUxfQ09OVFJBU1QgPSAwLCAgLy9JbnN0cnVjdHMgdGhlIGdlb21ldHJpYyBtYXRjaGluZyBhbGdvcml0aG0gdG8gZmluZCBtYXRjaGVzIHdpdGggdGhlIHNhbWUgY29udHJhc3QgYXMgdGhlIHRlbXBsYXRlLgorICAgIElNQVFfUkVWRVJTRURfQ09OVFJBU1QgPSAxLCAgLy9JbnN0cnVjdHMgdGhlIGdlb21ldHJpYyBtYXRjaGluZyBhbGdvcml0aG0gdG8gZmluZCBtYXRjaGVzIHdpdGggdGhlIGludmVydGVkIGNvbnRyYXN0IG9mIHRoZSB0ZW1wbGF0ZS4KKyAgICBJTUFRX0JPVEhfQ09OVFJBU1RTICAgID0gMiwgIC8vSW5zdHJ1Y3RzIHRoZSBnZW9tZXRyaWMgbWF0Y2hpbmcgYWxnb3JpdGhtIHRvIGZpbmQgbWF0Y2hlcyB3aXRoIHRoZSBzYW1lIGFuZCBpbnZlcnRlZCBjb250cmFzdCBvZiB0aGUgdGVtcGxhdGUuCit9IENvbnRyYXN0TW9kZTsKKwordHlwZWRlZiBlbnVtIFFSUG9sYXJpdGllc19lbnVtIHsKKyAgICBJTUFRX1FSX1BPTEFSSVRZX0FVVE9fREVURUNUICAgICA9IC0yLCAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBzaG91bGQgZGV0ZXJtaW5lIHRoZSBwb2xhcml0eSBvZiB0aGUgUVIgY29kZS4KKyAgICBJTUFRX1FSX1BPTEFSSVRZX0JMQUNLX09OX1dISVRFICA9IDAsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBzaG91bGQgc2VhcmNoIGZvciBhIFFSIGNvZGUgd2l0aCBkYXJrIGRhdGEgb24gYSBicmlnaHQgYmFja2dyb3VuZC4KKyAgICBJTUFRX1FSX1BPTEFSSVRZX1dISVRFX09OX0JMQUNLICA9IDEsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBzaG91bGQgc2VhcmNoIGZvciBhIFFSIGNvZGUgd2l0aCBicmlnaHQgZGF0YSBvbiBhIGRhcmsgYmFja2dyb3VuZC4KKyAgICBJTUFRX1FSX1BPTEFSSVRZX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gUVJQb2xhcml0aWVzOworCit0eXBlZGVmIGVudW0gUVJSb3RhdGlvbk1vZGVfZW51bSB7CisgICAgSU1BUV9RUl9ST1RBVElPTl9NT0RFX1VOTElNSVRFRCAgID0gMCwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIGFsbG93cyBmb3IgdW5saW1pdGVkIHJvdGF0aW9uLgorICAgIElNQVFfUVJfUk9UQVRJT05fTU9ERV8wX0RFR1JFRVMgICA9IDEsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBhbGxvd3MgZm9yID8/PyA1IGRlZ3JlZXMgb2Ygcm90YXRpb24uCisgICAgSU1BUV9RUl9ST1RBVElPTl9NT0RFXzkwX0RFR1JFRVMgID0gMiwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIGFsbG93cyBmb3IgYmV0d2VlbiA4NSBhbmQgOTUgZGVncmVlcyBvZiByb3RhdGlvbi4KKyAgICBJTUFRX1FSX1JPVEFUSU9OX01PREVfMTgwX0RFR1JFRVMgPSAzLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gYWxsb3dzIGZvciBiZXR3ZWVuIDE3NSBhbmQgMTg1IGRlZ3JlZXMgb2Ygcm90YXRpb24uCisgICAgSU1BUV9RUl9ST1RBVElPTl9NT0RFXzI3MF9ERUdSRUVTID0gNCwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIGFsbG93cyBmb3IgYmV0d2VlbiAyNjUgYW5kIDI3NSBkZWdyZWVzIG9mIHJvdGF0aW9uLgorICAgIElNQVFfUVJfUk9UQVRJT05fTU9ERV9TSVpFX0dVQVJEICA9IDB4RkZGRkZGRkYgICAKK30gUVJSb3RhdGlvbk1vZGU7CisKK3R5cGVkZWYgZW51bSBRUkdyYWRpbmdNb2RlX2VudW0geworICAgIElNQVFfUVJfTk9fR1JBRElORyAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gZG9lcyBub3QgbWFrZSBhbnkgcHJlcGFyYXRvcnkgY2FsY3VsYXRpb25zLgorICAgIElNQVFfUVJfR1JBRElOR19NT0RFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IFFSR3JhZGluZ01vZGU7CisKK3R5cGVkZWYgZW51bSBTdHJhaWdodEVkZ2VTZWFyY2hNb2RlX2VudW0geworICAgIElNQVFfVVNFX0ZJUlNUX1JBS0VfRURHRVMgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL0ZpdHMgYSBzdHJhaWdodCBlZGdlIG9uIHRoZSBmaXJzdCBwb2ludHMgZGV0ZWN0ZWQgdXNpbmcgYSByYWtlLgorICAgIElNQVFfVVNFX0JFU1RfUkFLRV9FREdFUyAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL0ZpdHMgYSBzdHJhaWdodCBlZGdlIG9uIHRoZSBiZXN0IHBvaW50cyBkZXRlY3RlZCB1c2luZyBhIHJha2UuCisgICAgSU1BUV9VU0VfQkVTVF9IT1VHSF9MSU5FICAgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vRmluZHMgdGhlIHN0cm9uZ2VzdCBzdHJhaWdodCBlZGdlIHVzaW5nIGFsbCBwb2ludHMgZGV0ZWN0ZWQgb24gYSByYWtlLgorICAgIElNQVFfVVNFX0ZJUlNUX1BST0pFQ1RJT05fRURHRSAgICAgICA9IDMsICAgICAgICAgICAvL1VzZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBmaXJzdCBwcm9qZWN0ZWQgZWRnZSBhcyB0aGUgc3RyYWlnaHQgZWRnZS4KKyAgICBJTUFRX1VTRV9CRVNUX1BST0pFQ1RJT05fRURHRSAgICAgICAgPSA0LCAgICAgICAgICAgLy9GaW5kcyB0aGUgc3Ryb25nZXN0IHByb2plY3RlZCBlZGdlIGxvY2F0aW9uIHRvIGRldGVybWluZSB0aGUgc3RyYWlnaHQgZWRnZS4KKyAgICBJTUFRX1NUUkFJR0hUX0VER0VfU0VBUkNIX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IFN0cmFpZ2h0RWRnZVNlYXJjaE1vZGU7CisKK3R5cGVkZWYgZW51bSBTZWFyY2hEaXJlY3Rpb25fZW51bSB7CisgICAgSU1BUV9TRUFSQ0hfRElSRUNUSU9OX0xFRlRfVE9fUklHSFQgPSAwLCAgICAgICAgICAgLy9TZWFyY2hlcyBmcm9tIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIHNlYXJjaCBhcmVhIHRvIHRoZSByaWdodCBzaWRlIG9mIHRoZSBzZWFyY2ggYXJlYS4KKyAgICBJTUFRX1NFQVJDSF9ESVJFQ1RJT05fUklHSFRfVE9fTEVGVCA9IDEsICAgICAgICAgICAvL1NlYXJjaGVzIGZyb20gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIHNlYXJjaCBhcmVhIHRvIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIHNlYXJjaCBhcmVhLgorICAgIElNQVFfU0VBUkNIX0RJUkVDVElPTl9UT1BfVE9fQk9UVE9NID0gMiwgICAgICAgICAgIC8vU2VhcmNoZXMgZnJvbSB0aGUgdG9wIHNpZGUgb2YgdGhlIHNlYXJjaCBhcmVhIHRvIHRoZSBib3R0b20gc2lkZSBvZiB0aGUgc2VhcmNoIGFyZWEuCisgICAgSU1BUV9TRUFSQ0hfRElSRUNUSU9OX0JPVFRPTV9UT19UT1AgPSAzLCAgICAgICAgICAgLy9TZWFyY2hlcyBmcm9tIHRoZSBib3R0b20gc2lkZSBvZiB0aGUgc2VhcmNoIGFyZWEgdG8gdGhlIHRvcCBzaWRlIG9mIHRoZSBzZWFyY2ggYXJlYS4KKyAgICBJTUFRX1NFQVJDSF9ESVJFQ1RJT05fU0laRV9HVUFSRCAgICA9IDB4RkZGRkZGRkYgICAKK30gU2VhcmNoRGlyZWN0aW9uOworCit0eXBlZGVmIGVudW0gUVJTdHJlYW1Nb2RlX2VudW0geworICAgIElNQVFfUVJfTU9ERV9OVU1FUklDICAgICAgPSAwLCAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhhdCB0aGUgZGF0YSB3YXMgZW5jb2RlZCB1c2luZyBudW1lcmljIG1vZGUuCisgICAgSU1BUV9RUl9NT0RFX0FMUEhBTlVNRVJJQyA9IDEsICAgICAgICAgICAvL1NwZWNpZmllcyB0aGF0IHRoZSBkYXRhIHdhcyBlbmNvZGVkIHVzaW5nIGFscGhhLW51bWVyaWMgbW9kZS4KKyAgICBJTUFRX1FSX01PREVfUkFXX0JZVEUgICAgID0gMiwgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoYXQgdGhlIGRhdGEgd2FzIG5vdCBlbmNvZGVkIGJ1dCBpcyBvbmx5IHJhdyBiaW5hcnkgYnl0ZXMsIG9yIGVuY29kZWQgaW4gSklTLTguCisgICAgSU1BUV9RUl9NT0RFX0VBTjEyOF9UT0tFTiA9IDMsICAgICAgICAgICAvL1NwZWNpZmllcyB0aGF0IHRoZSBkYXRhIGhhcyBhIHNwZWNpYWwgbWVhbmluZyByZXByZXNlbnRlZCBieSB0aGUgYXBwbGljYXRpb24gSUQuCisgICAgSU1BUV9RUl9NT0RFX0VBTjEyOF9EQVRBICA9IDQsICAgICAgICAgICAvL1NwZWNpZmllcyB0aGF0IHRoZSBkYXRhIGhhcyBhIHNwZWNpYWwgbWVhbmluZyByZXByZXNlbnRlZCBieSB0aGUgYXBwbGljYXRpb24gSUQuCisgICAgSU1BUV9RUl9NT0RFX0VDSSAgICAgICAgICA9IDUsICAgICAgICAgICAvL1NwZWNpZmllcyB0aGF0IHRoZSBkYXRhIHdhcyBtZWFudCB0byBiZSByZWFkIHVzaW5nIHRoZSBsYW5ndWFnZSByZXByZXNlbnRlZCBpbiB0aGUgbGFuZ3VhZ2UgSUQuCisgICAgSU1BUV9RUl9NT0RFX0tBTkpJICAgICAgICA9IDYsICAgICAgICAgICAvL1NwZWNpZmllcyB0aGF0IHRoZSBkYXRhIHdhcyBlbmNvZGVkIGluIFNoaWZ0LUpJUzE2IEphcGFuZXNlLgorICAgIElNQVFfUVJfTU9ERV9TSVpFX0dVQVJEICAgPSAweEZGRkZGRkZGICAgCit9IFFSU3RyZWFtTW9kZTsKKwordHlwZWRlZiBlbnVtIFBhcnRpY2xlQ2xhc3NpZmllclR5cGVfZW51bSB7CisgICAgSU1BUV9QQVJUSUNMRV9MQVJHRVNUICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1VzZSBvbmx5IHRoZSBsYXJnZXN0IHBhcnRpY2xlIGluIHRoZSBpbWFnZS4KKyAgICBJTUFRX1BBUlRJQ0xFX0FMTCAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vVXNlIGFsbCBwYXJ0aWNsZXMgaW4gdGhlIGltYWdlLgorICAgIElNQVFfUEFSVElDTEVfQ0xBU1NJRklFUl9UWVBFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IFBhcnRpY2xlQ2xhc3NpZmllclR5cGU7CisKK3R5cGVkZWYgZW51bSBRUkNlbGxTYW1wbGVTaXplX2VudW0geworICAgIElNQVFfUVJfQ0VMTF9TQU1QTEVfU0laRV9BVVRPX0RFVEVDVCA9IC0yLCAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB3aWxsIHRyeSBlYWNoIHNhbXBsZSBzaXplIGFuZCB1c2UgdGhlIG9uZSB3aGljaCBkZWNvZGVzIHRoZSBRUiBjb2RlIHdpdGhpbiB0aGUgZmV3ZXN0IGl0ZXJhdGlvbnMgYW5kIHV0aWxpemluZyB0aGUgbGVhc3QgYW1vdW50IG9mIGVycm9yIGNvcnJlY3Rpb24uCisgICAgSU1BUV9RUl9DRUxMX1NBTVBMRV9TSVpFMVgxICAgICAgICAgID0gMSwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHdpbGwgdXNlIGEgMXgxIHNpemVkIHNhbXBsZSBmcm9tIGVhY2ggY2VsbC4KKyAgICBJTUFRX1FSX0NFTExfU0FNUExFX1NJWkUyWDIgICAgICAgICAgPSAyLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gd2lsbCB1c2UgYSAyeDIgc2l6ZWQgc2FtcGxlIGZyb20gZWFjaCBjZWxsLgorICAgIElNQVFfUVJfQ0VMTF9TQU1QTEVfU0laRTNYMyAgICAgICAgICA9IDMsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB3aWxsIHVzZSBhIDN4MyBzaXplZCBzYW1wbGUgZnJvbSBlYWNoIGNlbGwuCisgICAgSU1BUV9RUl9DRUxMX1NBTVBMRV9TSVpFNFg0ICAgICAgICAgID0gNCwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHdpbGwgdXNlIGEgNHg0IHNpemVkIHNhbXBsZSBmcm9tIGVhY2ggY2VsbC4KKyAgICBJTUFRX1FSX0NFTExfU0FNUExFX1NJWkU1WDUgICAgICAgICAgPSA1LCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gd2lsbCB1c2UgYSA1eDUgc2l6ZWQgc2FtcGxlIGZyb20gZWFjaCBjZWxsLgorICAgIElNQVFfUVJfQ0VMTF9TQU1QTEVfU0laRTZYNiAgICAgICAgICA9IDYsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB3aWxsIHVzZSBhIDZ4NiBzaXplZCBzYW1wbGUgZnJvbSBlYWNoIGNlbGwuCisgICAgSU1BUV9RUl9DRUxMX1NBTVBMRV9TSVpFN1g3ICAgICAgICAgID0gNywgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHdpbGwgdXNlIGEgN3g3IHNpemVkIHNhbXBsZSBmcm9tIGVhY2ggY2VsbC4KKyAgICBJTUFRX1FSX0NFTExfU0FNUExFX1RZUEVfU0laRV9HVUFSRCAgPSAweEZGRkZGRkZGICAgCit9IFFSQ2VsbFNhbXBsZVNpemU7CisKK3R5cGVkZWYgZW51bSBSYWtlUHJvY2Vzc1R5cGVfZW51bSB7CisgICAgSU1BUV9HRVRfRklSU1RfRURHRVMgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIAorICAgIElNQVFfR0VUX0ZJUlNUX0FORF9MQVNUX0VER0VTICAgICA9IDEsICAgICAgICAgICAKKyAgICBJTUFRX0dFVF9BTExfRURHRVMgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgCisgICAgSU1BUV9HRVRfQkVTVF9FREdFUyAgICAgICAgICAgICAgID0gMywgICAgICAgICAgIAorICAgIElNQVFfUkFLRV9QUk9DRVNTX1RZUEVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gUmFrZVByb2Nlc3NUeXBlOworCit0eXBlZGVmIGVudW0gR2VvbWV0cmljU2V0dXBEYXRhSXRlbV9lbnVtIHsKKyAgICBJTUFRX0NVUlZFX0VYVFJBQ1RJT05fTU9ERSAgICAgICAgICAgICA9IDAsICAgLy9TcGVjaWZpZXMgaG93IHRoZSBmdW5jdGlvbiBpZGVudGlmaWVzIGN1cnZlcyBpbiB0aGUgaW1hZ2UuCisgICAgSU1BUV9DVVJWRV9FREdFX1RIUlNIT0xEICAgICAgICAgICAgICAgPSAxLCAgIC8vU3BlY2lmaWVzIHRoZSBtaW5pbXVtIGNvbnRyYXN0IGFuIGVkZ2UgcGl4ZWwgbXVzdCBoYXZlIGZvciBpdCB0byBiZSBjb25zaWRlcmVkIHBhcnQgb2YgYSBjdXJ2ZS4KKyAgICBJTUFRX0NVUlZFX0VER0VfRklMVEVSICAgICAgICAgICAgICAgICA9IDIsICAgLy9TcGVjaWZpZXMgdGhlIHdpZHRoIG9mIHRoZSBlZGdlIGZpbHRlciB0aGF0IHRoZSBmdW5jdGlvbiB1c2VzIHRvIGlkZW50aWZ5IGN1cnZlcyBpbiB0aGUgaW1hZ2UuCisgICAgSU1BUV9NSU5JTVVNX0NVUlZFX0xFTkdUSCAgICAgICAgICAgICAgPSAzLCAgIC8vU3BlY2lmaWVzIHRoZSBsZW5ndGgsIGluIHBpeGVscywgb2YgdGhlIHNtYWxsZXN0IGN1cnZlIHRoYXQgeW91IHdhbnQgdGhlIGZ1bmN0aW9uIHRvIGlkZW50aWZ5LgorICAgIElNQVFfQ1VSVkVfUk9XX1NFQVJDSF9TVEVQX1NJWkUgICAgICAgID0gNCwgICAvL1NwZWNpZmllcyB0aGUgZGlzdGFuY2UsIGluIHRoZSB5IGRpcmVjdGlvbiwgYmV0d2VlbiB0aGUgaW1hZ2Ugcm93cyB0aGF0IHRoZSBhbGdvcml0aG0gaW5zcGVjdHMgZm9yIGN1cnZlIHNlZWQgcG9pbnRzLgorICAgIElNQVFfQ1VSVkVfQ09MX1NFQVJDSF9TVEVQX1NJWkUgICAgICAgID0gNSwgICAvL1NwZWNpZmllcyB0aGUgZGlzdGFuY2UsIGluIHRoZSB4IGRpcmVjdGlvbiwgYmV0d2VlbiB0aGUgaW1hZ2UgY29sdW1ucyB0aGF0IHRoZSBhbGdvcml0aG0gaW5zcGVjdHMgZm9yIGN1cnZlIHNlZWQgcG9pbnRzLgorICAgIElNQVFfQ1VSVkVfTUFYX0VORF9QT0lOVF9HQVAgICAgICAgICAgID0gNiwgICAvL1NwZWNpZmllcyB0aGUgbWF4aW11bSBnYXAsIGluIHBpeGVscywgYmV0d2VlbiB0aGUgZW5kcG9pbnRzIG9mIGEgY3VydmUgdGhhdCB0aGUgZnVuY3Rpb24gaWRlbnRpZmllcyBhcyBhIGNsb3NlZCBjdXJ2ZS4KKyAgICBJTUFRX0VYVFJBQ1RfQ0xPU0VEX0NVUlZFUyAgICAgICAgICAgICA9IDcsICAgLy9TcGVjaWZpZXMgd2hldGhlciB0byBpZGVudGlmeSBvbmx5IGNsb3NlZCBjdXJ2ZXMgaW4gdGhlIGltYWdlLgorICAgIElNQVFfRU5BQkxFX1NVQlBJWEVMX0NVUlZFX0VYVFJBQ1RJT04gID0gOCwgICAvL1RoZSBmdW5jdGlvbiBpZ25vcmVzIHRoaXMgb3B0aW9uLgorICAgIElNQVFfRU5BQkxFX0NPUlJFTEFUSU9OX1NDT1JFICAgICAgICAgID0gOSwgICAvL1NwZWNpZmllcyB0aGF0IHRoZSBmdW5jdGlvbiBzaG91bGQgY2FsY3VsYXRlIHRoZSBDb3JyZWxhdGlvbiBTY29yZSBhbmQgcmV0dXJuIGl0IGZvciBlYWNoIG1hdGNoIHJlc3VsdC4KKyAgICBJTUFRX0VOQUJMRV9TVUJQSVhFTF9BQ0NVUkFDWSAgICAgICAgICA9IDEwLCAgLy9EZXRlcm1pbmVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZSBtYXRjaCByZXN1bHRzIHdpdGggc3VicGl4ZWwgYWNjdXJhY3kuCisgICAgSU1BUV9TVUJQSVhFTF9JVEVSQVRJT05TICAgICAgICAgICAgICAgPSAxMSwgIC8vU3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpbmNyZW1lbnRhbCBpbXByb3ZlbWVudHMgdXNlZCB0byByZWZpbmUgbWF0Y2hlcyB1c2luZyBzdWJwaXhlbCBpbmZvcm1hdGlvbi4KKyAgICBJTUFRX1NVQlBJWEVMX1RPTEVSQU5DRSAgICAgICAgICAgICAgICA9IDEyLCAgLy9TcGVjaWZpZXMgdGhlIG1heGltdW0gYW1vdW50IG9mIGNoYW5nZSwgaW4gcGl4ZWxzLCBiZXR3ZWVuIGNvbnNlY3V0aXZlIGluY3JlbWVudGFsIGltcHJvdmVtZW50cyBpbiB0aGUgbWF0Y2ggcG9zaXRpb24gYmVmb3JlIHRoZSBmdW5jdGlvbiBzdG9wcyByZWZpbmluZyB0aGUgbWF0Y2ggcG9zaXRpb24uCisgICAgSU1BUV9JTklUSUFMX01BVENIX0xJU1RfTEVOR1RIICAgICAgICAgPSAxMywgIC8vU3BlY2lmaWVzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIG1hdGNoIGxpc3QuCisgICAgSU1BUV9FTkFCTEVfVEFSR0VUX1RFTVBMQVRFX0NVUlZFU0NPUkUgPSAxNCwgIC8vU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIHNob3VsZCBjYWxjdWxhdGUgdGhlIG1hdGNoIGN1cnZlIHRvIHRlbXBsYXRlIGN1cnZlIHNjb3JlIGFuZCByZXR1cm4gaXQgZm9yIGVhY2ggbWF0Y2ggcmVzdWx0LgorICAgIElNQVFfTUlOSU1VTV9NQVRDSF9TRVBBUkFUSU9OX0RJU1RBTkNFID0gMTUsICAvL1NwZWNpZmllcyB0aGUgbWluaW11bSBzZXBhcmF0aW9uIGRpc3RhbmNlLCBpbiBwaXhlbHMsIGJldHdlZW4gdGhlIG9yaWdpbnMgb2YgdHdvIG1hdGNoZXMgdGhhdCBoYXZlIHVuaXF1ZSBwb3NpdGlvbnMuCisgICAgSU1BUV9NSU5JTVVNX01BVENIX1NFUEFSQVRJT05fQU5HTEUgICAgPSAxNiwgIC8vU3BlY2lmaWVzIHRoZSBtaW5pbXVtIGFuZ3VsYXIgZGlmZmVyZW5jZSwgaW4gZGVncmVlcywgYmV0d2VlbiB0d28gbWF0Y2hlcyB0aGF0IGhhdmUgdW5pcXVlIGFuZ2xlcy4KKyAgICBJTUFRX01JTklNVU1fTUFUQ0hfU0VQQVJBVElPTl9TQ0FMRSAgICA9IDE3LCAgLy9TcGVjaWZpZXMgdGhlIG1pbmltdW0gZGlmZmVyZW5jZSBpbiBzY2FsZSwgZXhwcmVzc2VkIGFzIGEgcGVyY2VudGFnZSwgYmV0d2VlbiB0d28gbWF0Y2hlcyB0aGF0IGhhdmUgdW5pcXVlIHNjYWxlcy4KKyAgICBJTUFRX01BWElNVU1fTUFUQ0hfT1ZFUkxBUCAgICAgICAgICAgICA9IDE4LCAgLy9TcGVjaWZpZXMgd2hldGhlciB5b3Ugd2FudCB0aGUgYWxnb3JpdGhtIHRvIHNwZW5kIGxlc3MgdGltZSBhY2N1cmF0ZWx5IGVzdGltYXRpbmcgdGhlIGxvY2F0aW9uIG9mIGEgbWF0Y2guCisgICAgSU1BUV9FTkFCTEVfQ09BUlNFX1JFU1VMVCAgICAgICAgICAgICAgPSAxOSwgIC8vU3BlY2lmaWVzIHdoZXRoZXIgeW91IHdhbnQgdGhlIGFsZ29yaXRobSB0byBzcGVuZCBsZXNzIHRpbWUgYWNjdXJhdGVseSBlc3RpbWF0aW5nIHRoZSBsb2NhdGlvbiBvZiBhIG1hdGNoLgorICAgIElNQVFfRU5BQkxFX0NBTElCUkFUSU9OX1NVUFBPUlQgICAgICAgID0gMjAsICAvL1NwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0aGUgYWxnb3JpdGhtIHRyZWF0IHRoZSBpbnNwZWN0aW9uIGltYWdlIGFzIGEgY2FsaWJyYXRlZCBpbWFnZS4KKyAgICBJTUFRX0VOQUJMRV9DT05UUkFTVF9SRVZFUlNBTCAgICAgICAgICA9IDIxLCAgLy9TcGVjaWZpZXMgdGhlIGNvbnRyYXN0IG9mIHRoZSBtYXRjaGVzIHRvIHNlYXJjaCBmb3IuCisgICAgSU1BUV9TRUFSQ0hfU1RSQVRFR1kgICAgICAgICAgICAgICAgICAgPSAyMiwgIC8vU3BlY2lmaWVzIHRoZSBhZ2dyZXNzaXZlbmVzcyBvZiB0aGUgc3RyYXRlZ3kgdXNlZCB0byBmaW5kIG1hdGNoZXMgaW4gdGhlIGltYWdlLgorICAgIElNQVFfUkVGSU5FTUVOVF9NQVRDSF9GQUNUT1IgICAgICAgICAgID0gMjMsICAvL1NwZWNpZmllcyB0aGUgZmFjdG9yIGFwcGxpZWQgdG8gdGhlIG51bWJlciBvZiBtYXRjaGVzIHJlcXVlc3RlZCB0byBkZXRlcm1pbmUgaG93IG1hbnkgbWF0Y2hlcyBhcmUgcmVmaW5lZCBpbiB0aGUgcHlyYW1pZCBzdGFnZS4KKyAgICBJTUFRX1NVQlBJWEVMX01BVENIX0ZBQ1RPUiAgICAgICAgICAgICA9IDI0LCAgLy9TcGVjaWZpZXMgdGhlIGZhY3RvciBhcHBsaWVkIHRvIHRoZSBudW1iZXIgZm9yIG1hdGNoZXMgcmVxdWVzdGVkIHRvIGRldGVybWluZSBob3cgbWFueSBtYXRjaGVzIGFyZSB1c2VkIGZvciB0aGUgZmluYWwgKHN1YnBpeGVsKSBzdGFnZS4KKyAgICBJTUFRX01BWF9SRUZJTkVNRU5UX0lURVJBVElPTlMgICAgICAgICA9IDI1LCAgLy9TcGVjaWZpZXMgbWF4aW11bSByZWZpbmVtZW50IGl0ZXJhdGlvbi4KK30gR2VvbWV0cmljU2V0dXBEYXRhSXRlbTsKKwordHlwZWRlZiBlbnVtIERpc3RvcnRpb25Nb2RlbF9lbnVtIHsKKyAgICBJTUFRX1BPTFlOT01JQUxfTU9ERUwgICAgPSAwLCAgIC8vUG9seW5vbWlhbCBtb2RlbC4KKyAgICBJTUFRX0RJVklTSU9OX01PREVMICAgICAgPSAxLCAgIC8vRGl2aXNpb24gTW9kZWwuCisgICAgSU1BUV9OT19ESVNUT1JUSU9OX01PREVMID0gLTEsICAvL05vdCBhIGRpc3RvcnRpb24gbW9kZWwuCit9IERpc3RvcnRpb25Nb2RlbDsKKwordHlwZWRlZiBlbnVtIENhbGlicmF0aW9uVGh1bWJuYWlsVHlwZV9lbnVtIHsKKyAgICBJTUFRX0NBTUFSQV9NT0RFTF9UWVBFICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9DYW1hcmEgbW9kZWwgdGh1bWJuYWlsIHR5cGUuCisgICAgSU1BUV9QRVJTUEVDVElWRV9UWVBFICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vUGVyc3BlY3RpdmUgdGh1bWJuYWlsIHR5cGUuCisgICAgSU1BUV9NSUNST19QTEFORV9UWVBFICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vTWljcm8gUGxhbmUgdGh1bWJuYWlsIHR5cGUuCisgICAgSU1BUV9DQUxJQlJBVElPTl9USFVNQk5BSUxfVFlQRV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBDYWxpYnJhdGlvblRodW1ibmFpbFR5cGU7CisKK3R5cGVkZWYgZW51bSBTZXR0aW5nVHlwZV9lbnVtIHsKKyAgICBJTUFRX1JPVEFUSU9OX0FOR0xFX1JBTkdFICAgID0gMCwgICAgICAgICAgIC8vU2V0IGEgcmFuZ2UgZm9yIHRoaXMgb3B0aW9uIHRvIHNwZWNpZnkgdGhlIGFuZ2xlcyBhdCB3aGljaCB5b3UgZXhwZWN0IHRoZSBGdW5jdGlvbiB0byBmaW5kIHRlbXBsYXRlIG1hdGNoZXMgaW4gdGhlIGluc3BlY3Rpb24gaW1hZ2UuCisgICAgSU1BUV9TQ0FMRV9SQU5HRSAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1NldCBhIHJhbmdlIGZvciB0aGlzIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBzaXplcyBhdCB3aGljaCB5b3UgZXhwZWN0IHRoZSBGdW5jdGlvbiB0byBmaW5kIHRlbXBsYXRlIG1hdGNoZXMgaW4gdGhlIGluc3BlY3Rpb24gaW1hZ2UuCisgICAgSU1BUV9PQ0NMVVNJT05fUkFOR0UgICAgICAgICA9IDIsICAgICAgICAgICAvL1NldCBhIHJhbmdlIGZvciB0aGlzIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBhbW91bnQgb2Ygb2NjbHVzaW9uIHlvdSBleHBlY3QgZm9yIGEgbWF0Y2ggaW4gdGhlIGluc3BlY3Rpb24gaW1hZ2UuCisgICAgSU1BUV9TRVRUSU5HX1RZUEVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gU2V0dGluZ1R5cGU7CisKK3R5cGVkZWYgZW51bSBTZWdtZW50YXRpb25EaXN0YW5jZUxldmVsX2VudW0geworICAgIElNQVFfU0VHTUVOVEFUSU9OX0xFVkVMX0NPTlNFUlZBVElWRSA9IDAsICAgICAgICAgICAvL1VzZXMgZXh0ZW5zaXZlIGNyaXRlcmlhIHRvIGRldGVybWluZSB0aGUgTWF4aW11bSBEaXN0YW5jZS4KKyAgICBJTUFRX1NFR01FTlRBVElPTl9MRVZFTF9BR0dSRVNTSVZFICAgPSAxLCAgICAgICAgICAgLy9Vc2VzIGZldyBjcml0ZXJpYSB0byBkZXRlcm1pbmUgdGhlIE1heGltdW0gRGlzdGFuY2UuCisgICAgSU1BUV9TRUdNRU5UQVRJT05fTEVWRUxfU0laRV9HVUFSRCAgID0gMHhGRkZGRkZGRiAgIAorfSBTZWdtZW50YXRpb25EaXN0YW5jZUxldmVsOworCit0eXBlZGVmIGVudW0gRXh0cmFjdENvbnRvdXJTZWxlY3Rpb25fZW51bSB7CisgICAgSU1BUV9DTE9TRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9TZWxlY3RzIHRoZSBjdXJ2ZSBjbG9zZXN0IHRvIHRoZSBST0kuCisgICAgSU1BUV9MT05HRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9TZWxlY3RzIHRoZSBsb25nZXN0IGN1cnZlLgorICAgIElNQVFfU1RST05HRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vU2VsZWN0cyB0aGUgY3VydmUgd2l0aCB0aGUgaGlnaGVzdCBlZGdlIHN0cmVuZ3RoIGF2ZXJhZ2VkIGZyb20gZWFjaCBwb2ludCBvbiB0aGUgY3VydmUuCisgICAgSU1BUV9FWFRSQUNUX0NPTlRPVVJfU0VMRUNUSU9OX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IEV4dHJhY3RDb250b3VyU2VsZWN0aW9uOworCit0eXBlZGVmIGVudW0gRmluZFRyYW5zZm9ybU1vZGVfZW51bSB7CisgICAgSU1BUV9GSU5EX1JFRkVSRU5DRSAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9VcGRhdGUgYm90aCBwYXJ0cyBvZiB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0uCisgICAgSU1BUV9VUERBVEVfVFJBTlNGT1JNICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9VcGRhdGUgb25seSB0aGUgbmV3IHJlZmVyZW5jZSBzeXN0ZW0uCisgICAgSU1BUV9GSU5EX1RSQU5TRk9STV9NT0RFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IEZpbmRUcmFuc2Zvcm1Nb2RlOworCit0eXBlZGVmIGVudW0gRXh0cmFjdENvbnRvdXJEaXJlY3Rpb25fZW51bSB7CisgICAgSU1BUV9SRUNUX0xFRlRfUklHSFQgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9TZWFyY2hlcyB0aGUgUk9JIGZyb20gbGVmdCB0byByaWdodC4KKyAgICBJTUFRX1JFQ1RfUklHSFRfTEVGVCAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1NlYXJjaGVzIHRoZSBST0kgZnJvbSByaWdodCB0byBsZWZ0LgorICAgIElNQVFfUkVDVF9UT1BfQk9UVE9NICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vU2VhcmNoZXMgdGhlIFJPSSBmcm9tIHRvcCB0byBib3R0b20uCisgICAgSU1BUV9SRUNUX0JPVFRPTV9UT1AgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgLy9TZWFyY2hlcyB0aGUgUk9JIGZyb20gYm90dG9tIHRvIHRvcC4KKyAgICBJTUFRX0FOTlVMVVNfSU5ORVJfT1VURVIgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAvL1NlYXJjaGVzIHRoZSBST0kgZnJvbSB0aGUgaW5uZXIgcmFkaXVzIHRvIHRoZSBvdXRlciByYWRpdXMuCisgICAgSU1BUV9BTk5VTFVTX09VVEVSX0lOTkVSICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgLy9TZWFyY2hlcyB0aGUgUk9JIGZyb20gdGhlIG91dGVyIHJhZGl1cyB0byB0aGUgaW5uZXIgcmFkaXVzLgorICAgIElNQVFfQU5OVUxVU19TVEFSVF9TVE9QICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgIC8vU2VhcmNoZXMgdGhlIFJPSSBmcm9tIHN0YXJ0IGFuZ2xlIHRvIGVuZCBhbmdsZS4KKyAgICBJTUFRX0FOTlVMVVNfU1RPUF9TVEFSVCAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAvL1NlYXJjaGVzIHRoZSBST0kgZnJvbSBlbmQgYW5nbGUgdG8gc3RhcnQgYW5nbGUuCisgICAgSU1BUV9FWFRSQUNUX0NPTlRPVVJfRElSRUNUSU9OX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IEV4dHJhY3RDb250b3VyRGlyZWN0aW9uOworCit0eXBlZGVmIGVudW0gRWRnZVBvbGFyaXR5U2VhcmNoTW9kZV9lbnVtIHsKKyAgICBJTUFRX1NFQVJDSF9GT1JfQUxMX0VER0VTICAgICAgICAgID0gMCwgICAgICAgICAgIC8vU2VhcmNoZXMgZm9yIGFsbCBlZGdlcy4KKyAgICBJTUFRX1NFQVJDSF9GT1JfUklTSU5HX0VER0VTICAgICAgID0gMSwgICAgICAgICAgIC8vU2VhcmNoZXMgZm9yIHJpc2luZyBlZGdlcyBvbmx5LgorICAgIElNQVFfU0VBUkNIX0ZPUl9GQUxMSU5HX0VER0VTICAgICAgPSAyLCAgICAgICAgICAgLy9TZWFyY2hlcyBmb3IgZmFsbGluZyBlZGdlcyBvbmx5LgorICAgIElNQVFfRURHRV9QT0xBUklUWV9NT0RFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IEVkZ2VQb2xhcml0eVNlYXJjaE1vZGU7CisKK3R5cGVkZWYgZW51bSBDb25uZWN0aXZpdHlfZW51bSB7CisgICAgSU1BUV9GT1VSX0NPTk5FQ1RFRCAgICAgICAgICA9IDAsICAgICAgICAgICAvL01vcnBob2xvZ2ljYWwgcmVjb25zdHJ1Y3Rpb24gaXMgcGVyZm9ybWVkIGluIGNvbm5lY3Rpdml0eSBtb2RlIDQuCisgICAgSU1BUV9FSUdIVF9DT05ORUNURUQgICAgICAgICA9IDEsICAgICAgICAgICAvL01vcnBob2xvZ2ljYWwgcmVjb25zdHJ1Y3Rpb24gaXMgcGVyZm9ybWVkIGluIGNvbm5lY3Rpdml0eSBtb2RlIDguCisgICAgSU1BUV9DT05ORUNUSVZJVFlfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gQ29ubmVjdGl2aXR5OworCit0eXBlZGVmIGVudW0gTW9ycGhvbG9neVJlY29uc3RydWN0T3BlcmF0aW9uX2VudW0geworICAgIElNQVFfRElMQVRFX1JFQ09OU1RSVUNUICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1BlcmZvcm1zIFJlY29uc3RydWN0aW9uIGJ5IGRpbGF0aW9uLgorICAgIElNQVFfRVJPREVfUkVDT05TVFJVQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1BlcmZvcm1zIFJlY29uc3RydWN0aW9uIGJ5IGVyb3Npb24uCisgICAgSU1BUV9NT1JQSE9MT0dZX1JFQ09OU1RSVUNUX09QRVJBVElPTl9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBNb3JwaG9sb2d5UmVjb25zdHJ1Y3RPcGVyYXRpb247CisKK3R5cGVkZWYgZW51bSBXYXZlbGV0VHlwZV9lbnVtIHsKKyAgICBJTUFRX0RCMDIgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIAorICAgIElNQVFfREIwMyAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgCisgICAgSU1BUV9EQjA0ICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgV2F2ZWxldCBUeXBlIGFzIERCMDIuCisgICAgSU1BUV9EQjA1ICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAKKyAgICBJTUFRX0RCMDYgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgIAorICAgIElNQVFfREIwNyAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgCisgICAgSU1BUV9EQjA4ICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAKKyAgICBJTUFRX0RCMDkgICAgICAgICAgICAgICAgID0gNywgICAgICAgICAgIAorICAgIElNQVFfREIxMCAgICAgICAgICAgICAgICAgPSA4LCAgICAgICAgICAgCisgICAgSU1BUV9EQjExICAgICAgICAgICAgICAgICA9IDksICAgICAgICAgICAKKyAgICBJTUFRX0RCMTIgICAgICAgICAgICAgICAgID0gMTAsICAgICAgICAgIAorICAgIElNQVFfREIxMyAgICAgICAgICAgICAgICAgPSAxMSwgICAgICAgICAgCisgICAgSU1BUV9EQjE0ICAgICAgICAgICAgICAgICA9IDEyLCAgICAgICAgICAKKyAgICBJTUFRX0hBQVIgICAgICAgICAgICAgICAgID0gMTMsICAgICAgICAgIAorICAgIElNQVFfQklPUjFfMyAgICAgICAgICAgICAgPSAxNCwgICAgICAgICAgCisgICAgSU1BUV9CSU9SMV81ICAgICAgICAgICAgICA9IDE1LCAgICAgICAgICAKKyAgICBJTUFRX0JJT1IyXzIgICAgICAgICAgICAgID0gMTYsICAgICAgICAgIAorICAgIElNQVFfQklPUjJfNCAgICAgICAgICAgICAgPSAxNywgICAgICAgICAgCisgICAgSU1BUV9CSU9SMl82ICAgICAgICAgICAgICA9IDE4LCAgICAgICAgICAKKyAgICBJTUFRX0JJT1IyXzggICAgICAgICAgICAgID0gMTksICAgICAgICAgIAorICAgIElNQVFfQklPUjNfMSAgICAgICAgICAgICAgPSAyMCwgICAgICAgICAgCisgICAgSU1BUV9CSU9SM18zICAgICAgICAgICAgICA9IDIxLCAgICAgICAgICAKKyAgICBJTUFRX0JJT1IzXzUgICAgICAgICAgICAgID0gMjIsICAgICAgICAgIAorICAgIElNQVFfQklPUjNfNyAgICAgICAgICAgICAgPSAyMywgICAgICAgICAgCisgICAgSU1BUV9CSU9SM185ICAgICAgICAgICAgICA9IDI0LCAgICAgICAgICAKKyAgICBJTUFRX0JJT1I0XzQgICAgICAgICAgICAgID0gMjUsICAgICAgICAgIAorICAgIElNQVFfQ09JRjEgICAgICAgICAgICAgICAgPSAyNiwgICAgICAgICAgCisgICAgSU1BUV9DT0lGMiAgICAgICAgICAgICAgICA9IDI3LCAgICAgICAgICAKKyAgICBJTUFRX0NPSUYzICAgICAgICAgICAgICAgID0gMjgsICAgICAgICAgIAorICAgIElNQVFfQ09JRjQgICAgICAgICAgICAgICAgPSAyOSwgICAgICAgICAgCisgICAgSU1BUV9DT0lGNSAgICAgICAgICAgICAgICA9IDMwLCAgICAgICAgICAKKyAgICBJTUFRX1NZTTIgICAgICAgICAgICAgICAgID0gMzEsICAgICAgICAgIAorICAgIElNQVFfU1lNMyAgICAgICAgICAgICAgICAgPSAzMiwgICAgICAgICAgCisgICAgSU1BUV9TWU00ICAgICAgICAgICAgICAgICA9IDMzLCAgICAgICAgICAKKyAgICBJTUFRX1NZTTUgICAgICAgICAgICAgICAgID0gMzQsICAgICAgICAgIAorICAgIElNQVFfU1lNNiAgICAgICAgICAgICAgICAgPSAzNSwgICAgICAgICAgCisgICAgSU1BUV9TWU03ICAgICAgICAgICAgICAgICA9IDM2LCAgICAgICAgICAKKyAgICBJTUFRX1NZTTggICAgICAgICAgICAgICAgID0gMzcsICAgICAgICAgIAorICAgIElNQVFfQklPUjVfNSAgICAgICAgICAgICAgPSAzOCwgICAgICAgICAgCisgICAgSU1BUV9CSU9SNl84ICAgICAgICAgICAgICA9IDM5LCAgICAgICAgICAKKyAgICBJTUFRX1dBVkVfVFlQRV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBXYXZlbGV0VHlwZTsKKwordHlwZWRlZiBlbnVtIFBhcnRpY2xlQ2xhc3NpZmllclRocmVzaG9sZFR5cGVfZW51bSB7CisgICAgSU1BUV9USFJFU0hPTERfTUFOVUFMID0gMCwgIC8vVGhlIGNsYXNzaWZpZXIgcGVyZm9ybXMgYSBtYW51YWwgdGhyZXNob2xkIG9uIHRoZSBpbWFnZSBkdXJpbmcgcHJlcHJvY2Vzc2luZy4KKyAgICBJTUFRX1RIUkVTSE9MRF9BVVRPICAgPSAxLCAgLy9UaGUgY2xhc3NpZmllciBwZXJmb3JtcyBhbiBhdXRvIHRocmVzaG9sZCBvbiB0aGUgaW1hZ2UgZHVyaW5nIHByZXByb2Nlc3NpbmcuCisgICAgSU1BUV9USFJFU0hPTERfTE9DQUwgID0gMiwgIC8vVGhlIGNsYXNzaWZpZXIgcGVyZm9ybXMgYSBsb2NhbCB0aHJlc2hvbGQgb24gdGhlIGltYWdlIGR1cmluZyBwcmVwcm9jZXNzaW5nLgorfSBQYXJ0aWNsZUNsYXNzaWZpZXJUaHJlc2hvbGRUeXBlOworCit0eXBlZGVmIGVudW0gTWVhc3VyZVBhcnRpY2xlc0NhbGlicmF0aW9uTW9kZV9lbnVtIHsKKyAgICBJTUFRX0NBTElCUkFUSU9OX01PREVfUElYRUwgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB0YWtlcyBvbmx5IHBpeGVsIG1lYXN1cmVtZW50cyBvbiB0aGUgcGFydGljbGVzIGluIHRoZSBpbWFnZS4KKyAgICBJTUFRX0NBTElCUkFUSU9OX01PREVfQ0FMSUJSQVRFRCAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB0YWtlcyBvbmx5IGNhbGlicmF0ZWQgbWVhc3VyZW1lbnRzIG9uIHRoZSBwYXJ0aWNsZXMgaW4gdGhlIGltYWdlLgorICAgIElNQVFfQ0FMSUJSQVRJT05fTU9ERV9CT1RIICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHRha2VzIGJvdGggcGl4ZWwgYW5kIGNhbGlicmF0ZWQgbWVhc3VyZW1lbnRzIG9uIHRoZSBwYXJ0aWNsZXMgaW4gdGhlIGltYWdlLgorICAgIElNQVFfTUVBU1VSRV9QQVJUSUNMRVNfQ0FMSUJSQVRJT05fTU9ERV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBNZWFzdXJlUGFydGljbGVzQ2FsaWJyYXRpb25Nb2RlOworCit0eXBlZGVmIGVudW0gR2VvbWV0cmljTWF0Y2hpbmdTZWFyY2hTdHJhdGVneV9lbnVtIHsKKyAgICBJTUFRX0dFT01FVFJJQ19NQVRDSElOR19DT05TRVJWQVRJVkUgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL0luc3RydWN0cyB0aGUgcGF0dGVybiBtYXRjaGluZyBhbGdvcml0aG0gdG8gdXNlIHRoZSBsYXJnZXN0IHBvc3NpYmxlIGFtb3VudCBvZiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbWFnZSBhdCB0aGUgZXhwZW5zZSBvZiBzbG93aW5nIGRvd24gdGhlIHNwZWVkIG9mIHRoZSBhbGdvcml0aG0uCisgICAgSU1BUV9HRU9NRVRSSUNfTUFUQ0hJTkdfQkFMQU5DRUQgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9JbnN0cnVjdHMgdGhlIHBhdHRlcm4gbWF0Y2hpbmcgYWxnb3JpdGhtIHRvIGJhbGFuY2UgdGhlIGFtb3VudCBvZiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbWFnZSBpdCB1c2VzIHdpdGggdGhlIHNwZWVkIG9mIHRoZSBhbGdvcml0aG0uCisgICAgSU1BUV9HRU9NRVRSSUNfTUFUQ0hJTkdfQUdHUkVTU0lWRSAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgLy9JbnN0cnVjdHMgdGhlIHBhdHRlcm4gbWF0Y2hpbmcgYWxnb3JpdGhtIHRvIHVzZSBhIGxvd2VyIGFtb3VudCBvZiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbWFnZSwgd2hpY2ggYWxsb3dzIHRoZSBhbGdvcml0aG0gdG8gcnVuIHF1aWNrbHkgYnV0IGF0IHRoZSBleHBlbnNlIG9mIGFjY3VyYWN5LgorICAgIElNQVFfR0VPTUVUUklDX01BVENISU5HX1NFQVJDSF9TVFJBVEVHWV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBHZW9tZXRyaWNNYXRjaGluZ1NlYXJjaFN0cmF0ZWd5OworCit0eXBlZGVmIGVudW0gQ29sb3JDbGFzc2lmaWNhdGlvblJlc29sdXRpb25fZW51bSB7CisgICAgSU1BUV9DTEFTU0lGSUVSX0xPV19SRVNPTFVUSU9OICAgICAgICA9IDAsICAgICAgICAgICAvL0xvdyByZXNvbHV0aW9uIHZlcnNpb24gb2YgdGhlIGNvbG9yIGNsYXNzaWZpZXIuCisgICAgSU1BUV9DTEFTU0lGSUVSX01FRElVTV9SRVNPTFVUSU9OICAgICA9IDEsICAgICAgICAgICAvL01lZGl1bSByZXNvbHV0aW9uIHZlcnNpb24gb2YgdGhlIGNvbG9yIGNsYXNzaWZpZXIuCisgICAgSU1BUV9DTEFTU0lGSUVSX0hJR0hfUkVTT0xVVElPTiAgICAgICA9IDIsICAgICAgICAgICAvL0hpZ2ggcmVzb2x1dGlvbiB2ZXJzaW9uIG9mIHRoZSBjb2xvciBjbGFzc2lmaWVyLgorICAgIElNQVFfQ0xBU1NJRklFUl9SRVNPTFVUSU9OX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IENvbG9yQ2xhc3NpZmljYXRpb25SZXNvbHV0aW9uOworCit0eXBlZGVmIGVudW0gQ29ubmVjdGlvbkNvbnN0cmFpbnRUeXBlX2VudW0geworICAgIElNQVFfRElTVEFOQ0VfQ09OU1RSQUlOVCAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpc3RhbmNlLCBpbiBwaXhlbHMsIHdpdGhpbiB3aGljaCB0aGUgZW5kIHBvaW50cyBvZiB0d28gY3VydmVzIG11c3QgbGllIGluIG9yZGVyIHRvIGJlIGNvbnNpZGVyZWQgcGFydCBvZiBhIGNvbnRvdXIuCisgICAgSU1BUV9BTkdMRV9DT05TVFJBSU5UICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgcmFuZ2UsIGluIGRlZ3JlZXMsIHdpdGhpbiB3aGljaCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBhbmdsZSBvZiB0d28gY3VydmVzLCBtZWFzdXJlZCBhdCB0aGUgZW5kIHBvaW50cywgbXVzdCBsaWUgaW4gb3JkZXIgZm9yIHRoZSB0d28gY3VydmVzIHRvIGJlIGNvbnNpZGVyZWQgcGFydCBvZiBhIGNvbnRvdXIuCisgICAgSU1BUV9DT05ORUNUSVZJVFlfQ09OU1RSQUlOVCAgICAgICAgICA9IDIsICAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgZGlzdGFuY2UsIGluIHBpeGVscywgd2l0aGluIHdoaWNoIGEgbGluZSBleHRlbmRlZCBmcm9tIHRoZSBlbmQgcG9pbnQgb2YgYSBjdXJ2ZSBtdXN0IHBhc3MgdGhlIGVuZCBwb2ludCBvZiBhbm90aGVyIGN1cnZlIGluIG9yZGVyIGZvciB0aGUgdHdvIGN1cnZlcyB0byBiZSBjb25zaWRlcmVkIHBhcnQgb2YgYSBjb250b3VyLgorICAgIElNQVFfR1JBRElFTlRfQ09OU1RSQUlOVCAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIHJhbmdlLCBpbiBkZWdyZWVzLCB3aXRoaW4gd2hpY2ggdGhlIGdyYWRpZW50IGFuZ2xlcyBvZiB0d28gY3VydmVzLCBtZWFzdXJlZCBhdCB0aGUgZW5kIHBvaW50cywgbXVzdCBsaWUgaW4gb3JkZXIgZm9yIHRoZSB0d28gY3VydmVzIHRvIGJlIGNvbnNpZGVyZWQgcGFydCBvZiBhIGNvbnRvdXIuCisgICAgSU1BUV9OVU1fQ09OTkVDVElPTl9DT05TVFJBSU5UX1RZUEVTICA9IDQsICAgICAgICAgICAvLy4KKyAgICBJTUFRX0NPTk5FQ1RJT05fQ09OU1RSQUlOVF9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBDb25uZWN0aW9uQ29uc3RyYWludFR5cGU7CisKK3R5cGVkZWYgZW51bSBCYXJjb2RlMkRDb250cmFzdF9lbnVtIHsKKyAgICBJTUFRX0FMTF9CQVJDT0RFXzJEX0NPTlRSQVNUUyAgICAgICA9IDAsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBzZWFyY2hlcyBmb3IgYmFyY29kZXMgb2YgZWFjaCBjb250cmFzdCB0eXBlLgorICAgIElNQVFfQkxBQ0tfT05fV0hJVEVfQkFSQ09ERV8yRCAgICAgID0gMSwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHNlYXJjaGVzIGZvciAyRCBiYXJjb2RlcyBjb250YWluaW5nIGJsYWNrIGRhdGEgb24gYSB3aGl0ZSBiYWNrZ3JvdW5kLgorICAgIElNQVFfV0hJVEVfT05fQkxBQ0tfQkFSQ09ERV8yRCAgICAgID0gMiwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHNlYXJjaGVzIGZvciAyRCBiYXJjb2RlcyBjb250YWluaW5nIHdoaXRlIGRhdGEgb24gYSBibGFjayBiYWNrZ3JvdW5kLgorICAgIElNQVFfQkFSQ09ERV8yRF9DT05UUkFTVF9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBCYXJjb2RlMkRDb250cmFzdDsKKwordHlwZWRlZiBlbnVtIFFSTW9kZWxUeXBlX2VudW0geworICAgIElNQVFfUVJfTU9ERUxUWVBFX0FVVE9fREVURUNUID0gMCwgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoYXQgdGhlIGZ1bmN0aW9uIHdpbGwgYXV0by1kZXRlY3QgdGhlIHR5cGUgb2YgUVIgY29kZS4KKyAgICBJTUFRX1FSX01PREVMVFlQRV9NSUNSTyAgICAgICA9IDEsICAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgUVIgY29kZSBpcyBvZiBhIG1pY3JvIHR5cGUuCisgICAgSU1BUV9RUl9NT0RFTFRZUEVfTU9ERUwxICAgICAgPSAyLCAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIFFSIGNvZGUgaXMgb2YgYSBtb2RlbDEgdHlwZS4KKyAgICBJTUFRX1FSX01PREVMVFlQRV9NT0RFTDIgICAgICA9IDMsICAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgUVIgY29kZSBpcyBvZiBhIG1vZGVsMiB0eXBlLgorICAgIElNQVFfUVJfTU9ERUxfVFlQRV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBRUk1vZGVsVHlwZTsKKwordHlwZWRlZiBlbnVtIFdpbmRvd0JhY2tncm91bmRGaWxsU3R5bGVfZW51bSB7CisgICAgSU1BUV9GSUxMX1NUWUxFX1NPTElEICAgICAgPSAwLCAgICAgICAgICAgLy9GaWxsIHRoZSBkaXNwbGF5IHdpbmRvdyB3aXRoIGEgc29saWQgY29sb3IuCisgICAgSU1BUV9GSUxMX1NUWUxFX0hBVENIICAgICAgPSAyLCAgICAgICAgICAgLy9GaWxsIHRoZSBkaXNwbGF5IHdpbmRvdyB3aXRoIGEgcGF0dGVybiBkZWZpbmVkIGJ5IFdpbmRvd0JhY2tncm91bmRIYXRjaFN0eWxlLgorICAgIElNQVFfRklMTF9TVFlMRV9ERUZBVUxUICAgID0gMywgICAgICAgICAgIC8vRmlsbCB0aGUgZGlzcGxheSB3aW5kb3cgd2l0aCB0aGUgTkkgVmlzaW9uIGRlZmF1bHQgcGF0dGVybi4KKyAgICBJTUFRX0ZJTExfU1RZTEVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gV2luZG93QmFja2dyb3VuZEZpbGxTdHlsZTsKKwordHlwZWRlZiBlbnVtIEV4dHJhY3Rpb25Nb2RlX2VudW0geworICAgIElNQVFfTk9STUFMX0lNQUdFICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhhdCB0aGUgZnVuY3Rpb24gbWFrZXMgbm8gYXNzdW1wdGlvbnMgYWJvdXQgdGhlIHVuaWZvcm1pdHkgb2Ygb2JqZWN0cyBpbiB0aGUgaW1hZ2Ugb3IgdGhlIGltYWdlIGJhY2tncm91bmQuCisgICAgSU1BUV9VTklGT1JNX1JFR0lPTlMgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1NwZWNpZmllcyB0aGF0IHRoZSBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgZWl0aGVyIHRoZSBvYmplY3RzIGluIHRoZSBpbWFnZSBvciB0aGUgaW1hZ2UgYmFja2dyb3VuZCBjb25zaXN0cyBvZiB1bmlmb3JtIHBpeGVsIHZhbHVlcy4KKyAgICBJTUFRX0VYVFJBQ1RJT05fTU9ERV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBFeHRyYWN0aW9uTW9kZTsKKwordHlwZWRlZiBlbnVtIEVkZ2VGaWx0ZXJTaXplX2VudW0geworICAgIElNQVFfRklORSAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoYXQgdGhlIGZ1bmN0aW9uIHVzZXMgYSBmaW5lIChuYXJyb3cpIGVkZ2UgZmlsdGVyLgorICAgIElNQVFfTk9STUFMICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoYXQgdGhlIGZ1bmN0aW9uIHVzZXMgYSBub3JtYWwgZWRnZSBmaWx0ZXIuCisgICAgSU1BUV9DT05UT1VSX1RSQUNJTkcgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgLy9TZXRzIHRoZSBFZGdlIEZpbHRlciBTaXplIHRvIGNvbnRvdXIgdHJhY2luZywgd2hpY2ggcHJvdmlkZXMgdGhlIGJlc3QgcmVzdWx0cyBmb3IgY29udG91ciBleHRyYWN0aW9uIGJ1dCBpbmNyZWFzZXMgdGhlIHRpbWUgcmVxdWlyZWQgdG8gcHJvY2VzcyB0aGUgaW1hZ2UuCisgICAgSU1BUV9FREdFX0ZJTFRFUl9TSVpFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IEVkZ2VGaWx0ZXJTaXplOworCit0eXBlZGVmIGVudW0gQmFyY29kZTJEU2VhcmNoTW9kZV9lbnVtIHsKKyAgICBJTUFRX1NFQVJDSF9NVUxUSVBMRSAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBzZWFyY2hlcyBmb3IgbXVsdGlwbGUgMkQgYmFyY29kZXMuCisgICAgSU1BUV9TRUFSQ0hfU0lOR0xFX0NPTlNFUlZBVElWRSAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gc2VhcmNoZXMgZm9yIDJEIGJhcmNvZGVzIHVzaW5nIHRoZSBzYW1lIHNlYXJjaGluZyBhbGdvcml0aG0gYXMgSU1BUV9TRUFSQ0hfTVVMVElQTEUgYnV0IHN0b3BzIHNlYXJjaGluZyBhZnRlciBsb2NhdGluZyBvbmUgdmFsaWQgYmFyY29kZS4KKyAgICBJTUFRX1NFQVJDSF9TSU5HTEVfQUdHUkVTU0lWRSAgICAgICAgICA9IDIsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBzZWFyY2hlcyBmb3IgYSBzaW5nbGUgMkQgYmFyY29kZSB1c2luZyBhIG1ldGhvZCB0aGF0IGFzc3VtZXMgdGhlIGJhcmNvZGUgb2NjdXBpZXMgYSBtYWpvcml0eSBvZiB0aGUgc2VhcmNoIHJlZ2lvbi4KKyAgICBJTUFRX0JBUkNPREVfMkRfU0VBUkNIX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gQmFyY29kZTJEU2VhcmNoTW9kZTsKKwordHlwZWRlZiBlbnVtIERhdGFNYXRyaXhTdWJ0eXBlX2VudW0geworICAgIElNQVFfQUxMX0RBVEFfTUFUUklYX1NVQlRZUEVTICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHNlYXJjaGVzIGZvciBEYXRhIE1hdHJpeCBiYXJjb2RlcyBvZiBhbGwgc3VidHlwZXMuCisgICAgSU1BUV9EQVRBX01BVFJJWF9TVUJUWVBFU19FQ0NfMDAwX0VDQ18xNDAgPSAxLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gc2VhcmNoZXMgZm9yIERhdGEgTWF0cml4IGJhcmNvZGVzIG9mIHN1YnR5cGVzIEVDQyAwMDAsIEVDQyAwNTAsIEVDQyAwODAsIEVDQyAxMDAgYW5kIEVDQyAxNDAuCisgICAgSU1BUV9EQVRBX01BVFJJWF9TVUJUWVBFX0VDQ18yMDAgICAgICAgICAgPSAyLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gc2VhcmNoZXMgZm9yIERhdGEgTWF0cml4IEVDQyAyMDAgYmFyY29kZXMuCisgICAgSU1BUV9EQVRBX01BVFJJWF9TVUJUWVBFX1NJWkVfR1VBUkQgICAgICAgPSAweEZGRkZGRkZGICAgCit9IERhdGFNYXRyaXhTdWJ0eXBlOworCit0eXBlZGVmIGVudW0gRmVhdHVyZVR5cGVfZW51bSB7CisgICAgSU1BUV9OT1RfRk9VTkRfRkVBVFVSRSAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgZmVhdHVyZSBpcyBub3QgZm91bmQuCisgICAgSU1BUV9DSVJDTEVfRkVBVFVSRSAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgZmVhdHVyZSBpcyBhIGNpcmNsZS4KKyAgICBJTUFRX0VMTElQU0VfRkVBVFVSRSAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBmZWF0dXJlIGlzIGFuIGVsbGlwc2UuCisgICAgSU1BUV9DT05TVF9DVVJWRV9GRUFUVVJFICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgZmVhdHVyZXMgaXMgYSBjb25zdGFudCBjdXJ2ZS4KKyAgICBJTUFRX1JFQ1RBTkdMRV9GRUFUVVJFICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBmZWF0dXJlIGlzIGEgcmVjdGFuZ2xlLgorICAgIElNQVFfTEVHX0ZFQVRVUkUgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGZlYXR1cmUgaXMgYSBsZWcuCisgICAgSU1BUV9DT1JORVJfRkVBVFVSRSAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgZmVhdHVyZSBpcyBhIGNvcm5lci4KKyAgICBJTUFRX1BBUkFMTEVMX0xJTkVfUEFJUl9GRUFUVVJFICAgICAgICAgID0gNywgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBmZWF0dXJlIGlzIGEgcGFyYWxsZWwgbGluZSBwYWlyLgorICAgIElNQVFfUEFJUl9PRl9QQVJBTExFTF9MSU5FX1BBSVJTX0ZFQVRVUkUgPSA4LCAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGZlYXR1cmUgaXMgYSBwYWlyIG9mIHBhcmFsbGVsIGxpbmUgcGFpcnMuCisgICAgSU1BUV9MSU5FX0ZFQVRVUkUgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgZmVhdHVyZSBpcyBhIGxpbmUuCisgICAgSU1BUV9DTE9TRURfQ1VSVkVfRkVBVFVSRSAgICAgICAgICAgICAgICA9IDEwLCAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgZmVhdHVyZSBpcyBhIGNsb3NlZCBjdXJ2ZS4KKyAgICBJTUFRX0ZFQVRVUkVfVFlQRV9TSVpFX0dVQVJEICAgICAgICAgICAgID0gMHhGRkZGRkZGRiAgIAorfSBGZWF0dXJlVHlwZTsKKwordHlwZWRlZiBlbnVtIEJhcmNvZGUyRENlbGxTaGFwZV9lbnVtIHsKKyAgICBJTUFRX1NRVUFSRV9DRUxMUyAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHVzZXMgYW4gYWxnb3JpdGhtIGZvciBkZWNvZGluZyB0aGUgMkQgYmFyY29kZSB0aGF0IHdvcmtzIHdpdGggc3F1YXJlIGRhdGEgY2VsbHMuCisgICAgSU1BUV9ST1VORF9DRUxMUyAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB1c2VzIGFuIGFsZ29yaXRobSBmb3IgZGVjb2RpbmcgdGhlIDJEIGJhcmNvZGUgdGhhdCB3b3JrcyB3aXRoIHJvdW5kIGRhdGEgY2VsbHMuCisgICAgSU1BUV9CQVJDT0RFXzJEX0NFTExfU0hBUEVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gQmFyY29kZTJEQ2VsbFNoYXBlOworCit0eXBlZGVmIGVudW0gTG9jYWxUaHJlc2hvbGRNZXRob2RfZW51bSB7CisgICAgSU1BUV9OSUJMQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gY29tcHV0ZXMgdGhyZXNob2xkcyBmb3IgZWFjaCBwaXhlbCBiYXNlZCBvbiBpdHMgbG9jYWwgc3RhdGlzdGljcyB1c2luZyB0aGUgTmlibGFjayBsb2NhbCB0aHJlc2hvbGRpbmcgYWxnb3JpdGhtLgorICAgIElNQVFfQkFDS0dST1VORF9DT1JSRUNUSU9OICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHBlcmZvcm1zIGJhY2tncm91bmQgY29ycmVjdGlvbiBmaXJzdCB0byBlbGltaW5hdGUgbm9uLXVuaWZvcm0gbGlnaHRpbmcgZWZmZWN0cywgdGhlbiBwZXJmb3JtcyB0aHJlc2hvbGRpbmcgdXNpbmcgdGhlIE90c3UgdGhyZXNob2xkaW5nIGFsZ29yaXRobS4KKyAgICBJTUFRX0xPQ0FMX1RIUkVTSE9MRF9NRVRIT0RfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gTG9jYWxUaHJlc2hvbGRNZXRob2Q7CisKK3R5cGVkZWYgZW51bSBCYXJjb2RlMkRUeXBlX2VudW0geworICAgIElNQVFfUERGNDE3ICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgMkQgYmFyY29kZSBpcyBvZiB0eXBlIFBERjQxNy4KKyAgICBJTUFRX0RBVEFfTUFUUklYX0VDQ18wMDAgICAgICAgID0gMSwgICAgICAgICAgIC8vVGhlIDJEIGJhcmNvZGUgaXMgb2YgdHlwZSBEYXRhIE1hdHJpeCBFQ0MgMDAwLgorICAgIElNQVFfREFUQV9NQVRSSVhfRUNDXzA1MCAgICAgICAgPSAyLCAgICAgICAgICAgLy9UaGUgMkQgYmFyY29kZSBpcyBvZiB0eXBlIERhdGEgTWF0cml4IEVDQyAwNTAuCisgICAgSU1BUV9EQVRBX01BVFJJWF9FQ0NfMDgwICAgICAgICA9IDMsICAgICAgICAgICAvL1RoZSAyRCBiYXJjb2RlIGlzIG9mIHR5cGUgRGF0YSBNYXRyaXggRUNDIDA4MC4KKyAgICBJTUFRX0RBVEFfTUFUUklYX0VDQ18xMDAgICAgICAgID0gNCwgICAgICAgICAgIC8vVGhlIDJEIGJhcmNvZGUgaXMgb2YgdHlwZSBEYXRhIE1hdHJpeCBFQ0MgMTAwLgorICAgIElNQVFfREFUQV9NQVRSSVhfRUNDXzE0MCAgICAgICAgPSA1LCAgICAgICAgICAgLy9UaGUgMkQgYmFyY29kZSBpcyBvZiB0eXBlIERhdGEgTWF0cml4IEVDQyAxNDAuCisgICAgSU1BUV9EQVRBX01BVFJJWF9FQ0NfMjAwICAgICAgICA9IDYsICAgICAgICAgICAvL1RoZSAyRCBiYXJjb2RlIGlzIG9mIHR5cGUgRGF0YSBNYXRyaXggRUNDIDIwMC4KKyAgICBJTUFRX0JBUkNPREVfMkRfVFlQRV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBCYXJjb2RlMkRUeXBlOworCit0eXBlZGVmIGVudW0gQ2xhc3NpZmllckVuZ2luZVR5cGVfZW51bSB7CisgICAgSU1BUV9FTkdJTkVfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9ObyBlbmdpbmUgaGFzIGJlZW4gc2V0IG9uIHRoaXMgY2xhc3NpZmllciBzZXNzaW9uLgorICAgIElNQVFfRU5HSU5FX05FQVJFU1RfTkVJR0hCT1IgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vTmVhcmVzdCBuZWlnaGJvciBlbmdpbmUuCisgICAgSU1BUV9FTkdJTkVfU1VQUE9SVF9WRUNUT1JfTUFDSElORSAgICAgPSAyLCAgICAgICAgICAgCisgICAgSU1BUV9DTEFTU0lGSUVSX0VOR0lORV9UWVBFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IENsYXNzaWZpZXJFbmdpbmVUeXBlOworCit0eXBlZGVmIGVudW0gQ2xhc3NpZmllclR5cGVfZW51bSB7CisgICAgSU1BUV9DTEFTU0lGSUVSX0NVU1RPTSAgICAgICAgICA9IDAsICAgICAgICAgICAvL1RoZSBjbGFzc2lmaWVyIHNlc3Npb24gY2xhc3NpZmllcyB2ZWN0b3JzIG9mIGRvdWJsZXMuCisgICAgSU1BUV9DTEFTU0lGSUVSX1BBUlRJQ0xFICAgICAgICA9IDEsICAgICAgICAgICAvL1RoZSBjbGFzc2lmaWVyIHNlc3Npb24gY2xhc3NpZmllcyBwYXJ0aWNsZXMgaW4gYmluYXJ5IGltYWdlcy4KKyAgICBJTUFRX0NMQVNTSUZJRVJfQ09MT1IgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vVGhlIGNsYXNzaWZpZXIgc2Vzc2lvbiBjbGFzc2lmaWVzIGFuIGltYWdlIGJhc2VkIG9uIGl0cyBjb2xvci4KKyAgICBJTUFRX0NMQVNTSUZJRVJfVEVYVFVSRSAgICAgICAgID0gMywgICAgICAgICAgIC8vVGhlIGNsYXNzaWZpZXIgc2Vzc2lvbiBjbGFzc2lmaWVzIGFuIGltYWdlIGJhc2VkIG9uIGl0cyB0ZXh0dXJlLgorICAgIElNQVFfQ0xBU1NJRklFUl9UWVBFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IENsYXNzaWZpZXJUeXBlOworCit0eXBlZGVmIGVudW0gUGFydGljbGVUeXBlX2VudW0geworICAgIElNQVFfUEFSVElDTEVfQlJJR0hUICAgICAgICAgID0gMCwgICAgICAgICAgIC8vQnJpZ2h0IHBhcnRpY2xlcy4KKyAgICBJTUFRX1BBUlRJQ0xFX0RBUksgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL0RhcmsgcGFydGljbGVzLgorICAgIElNQVFfUEFSVElDTEVfVFlQRV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBQYXJ0aWNsZVR5cGU7CisKK3R5cGVkZWYgZW51bSBWaXNpb25JbmZvVHlwZTJfZW51bSB7CisgICAgSU1BUV9WSVNJT05JTkZPX0NBTElCUkFUSU9OICAgICAgICA9IDB4MDEsICAgICAgICAvL1VzZWQgdG8gaW5kaWNhdGUgaW50ZXJhY3Rpb24gd2l0aCB0aGUgQ2FsaWJyYXRpb24gaW5mb3JtYXRpb24gaW4gYW4gaW1hZ2UuCisgICAgSU1BUV9WSVNJT05JTkZPX09WRVJMQVkgICAgICAgICAgICA9IDB4MDIsICAgICAgICAvL1VzZWQgdG8gaW5kaWNhdGUgaW50ZXJhY3Rpb24gd2l0aCB0aGUgT3ZlcmxheSBpbmZvcm1hdGlvbiBpbiBhbiBpbWFnZS4KKyAgICBJTUFRX1ZJU0lPTklORk9fR1JBWVRFTVBMQVRFICAgICAgID0gMHgwNCwgICAgICAgIC8vVXNlZCB0byBpbmRpY2F0ZSBpbnRlcmFjdGlvbiB3aXRoIHRoZSBncmF5c2NhbGUgdGVtcGxhdGUgaW5mb3JtYXRpb24gaW4gYW4gaW1hZ2UuCisgICAgSU1BUV9WSVNJT05JTkZPX0NPTE9SVEVNUExBVEUgICAgICA9IDB4MDgsICAgICAgICAvL1VzZWQgdG8gaW5kaWNhdGUgaW50ZXJhY3Rpb24gd2l0aCB0aGUgY29sb3IgdGVtcGxhdGUgaW5mb3JtYXRpb24gaW4gYW4gaW1hZ2UuCisgICAgSU1BUV9WSVNJT05JTkZPX0dFT01FVFJJQ1RFTVBMQVRFICA9IDB4MTAsICAgICAgICAvL1VzZWQgdG8gaW5kaWNhdGUgaW50ZXJhY3Rpb24gd2l0aCB0aGUgZ2VvbWV0cmljIHRlbXBsYXRlIGluZm9ybWF0aW9uIGluIGFuIGltYWdlLgorICAgIElNQVFfVklTSU9OSU5GT19DVVNUT01EQVRBICAgICAgICAgPSAweDIwLCAgICAgICAgLy9Vc2VkIHRvIGluZGljYXRlIGludGVyYWN0aW9uIHdpdGggdGhlIGJpbmFyeSBvciB0ZXh0IEN1c3RvbSBEYXRhIGluIGFuIGltYWdlLgorICAgIElNQVFfVklTSU9OSU5GT19HT0xERU5URU1QTEFURSAgICAgPSAweDQwLCAgICAgICAgLy9Vc2VkIHRvIGluZGljYXRlIGludGVyYWN0aW9uIHdpdGggdGhlIGdvbGRlbiB0ZW1wbGF0ZSBpbmZvcm1hdGlvbiBpbiBhbiBpbWFnZS4KKyAgICBJTUFRX1ZJU0lPTklORk9fR0VPTUVUUklDVEVNUExBVEUyID0gMHg4MCwgICAgICAgIC8vVXNlZCB0byBpbmRpY2F0ZSBpbnRlcmFjdGlvbiB3aXRoIHRoZSBnZW9tZXRyaWMgdGVtcGxhdGUgMiBpbmZvcm1hdGlvbiBpbiBhbiBpbWFnZS4KKyAgICBJTUFRX1ZJU0lPTklORk9fQUxMICAgICAgICAgICAgICAgID0gMHhGRkZGRkZGRiwgIC8vUmVtb3ZlcywgY2hlY2tzIGZvciwgb3IgaW5kaWNhdGVzIHRoZSBwcmVzZW5jZSBvZiBhbGwgdHlwZXMgb2YgZXh0cmEgaW5mb3JtYXRpb24gaW4gYW4gaW1hZ2UuCit9IFZpc2lvbkluZm9UeXBlMjsKKwordHlwZWRlZiBlbnVtIFJlYWRDbGFzc2lmaWVyRmlsZU1vZGVfZW51bSB7CisgICAgSU1BUV9DTEFTU0lGSUVSX1JFQURfQUxMICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vUmVhZCBhbGwgaW5mb3JtYXRpb24gZnJvbSB0aGUgY2xhc3NpZmllciBmaWxlLgorICAgIElNQVFfQ0xBU1NJRklFUl9SRUFEX1NBTVBMRVMgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1JlYWQgb25seSB0aGUgc2FtcGxlcyBmcm9tIHRoZSBjbGFzc2lmaWVyIGZpbGUuCisgICAgSU1BUV9DTEFTU0lGSUVSX1JFQURfUFJPUEVSVElFUyAgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vUmVhZCBvbmx5IHRoZSBwcm9wZXJ0aWVzIGZyb20gdGhlIGNsYXNzaWZpZXIgZmlsZS4KKyAgICBJTUFRX1JFQURfQ0xBU1NJRklFUl9GSUxFX01PREVTX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IFJlYWRDbGFzc2lmaWVyRmlsZU1vZGU7CisKK3R5cGVkZWYgZW51bSBXcml0ZUNsYXNzaWZpZXJGaWxlTW9kZV9lbnVtIHsKKyAgICBJTUFRX0NMQVNTSUZJRVJfV1JJVEVfQUxMICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vV3JpdGVzIGFsbCBpbmZvcm1hdGlvbiB0byB0aGUgY2xhc3NpZmllciBmaWxlLgorICAgIElNQVFfQ0xBU1NJRklFUl9XUklURV9DTEFTU0lGWV9PTkxZICAgICAgICAgPSAxLCAgICAgICAgICAgLy9Xcml0ZSBvbmx5IHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gY2xhc3NpZnkgdG8gdGhlIGNsYXNzaWZpZXIgZmlsZS4KKyAgICBJTUFRX1dSSVRFX0NMQVNTSUZJRVJfRklMRV9NT0RFU19TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBXcml0ZUNsYXNzaWZpZXJGaWxlTW9kZTsKKwordHlwZWRlZiBlbnVtIEJhcmNvZGUyRFNoYXBlX2VudW0geworICAgIElNQVFfU1FVQVJFX0JBUkNPREVfMkQgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHNlYXJjaGVzIGZvciBzcXVhcmUgMkQgYmFyY29kZXMuCisgICAgSU1BUV9SRUNUQU5HVUxBUl9CQVJDT0RFXzJEICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gc2VhcmNoZXMgZm9yIHJlY3Rhbmd1bGFyIDJEIGJhcmNvZGVzLgorICAgIElNQVFfQkFSQ09ERV8yRF9TSEFQRV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBCYXJjb2RlMkRTaGFwZTsKKwordHlwZWRlZiBlbnVtIERhdGFNYXRyaXhSb3RhdGlvbk1vZGVfZW51bSB7CisgICAgSU1BUV9VTkxJTUlURURfUk9UQVRJT04gICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gYWxsb3dzIGZvciB1bmxpbWl0ZWQgcm90YXRpb24uCisgICAgSU1BUV8wX0RFR1JFRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gYWxsb3dzIGZvciBiZXR3ZWVuIC01IGFuZCA1IGRlZ3JlZXMgb2Ygcm90YXRpb24uCisgICAgSU1BUV85MF9ERUdSRUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gYWxsb3dzIGZvciBiZXR3ZWVuIDg1IGFuZCA5NSBkZWdyZWVzIG9mIHJvdGF0aW9uLgorICAgIElNQVFfMTgwX0RFR1JFRVMgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIGFsbG93cyBmb3IgYmV0d2VlbiAxNzUgYW5kIDE4NSBkZWdyZWVzIG9mIHJvdGF0aW9uLgorICAgIElNQVFfMjcwX0RFR1JFRVMgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIGFsbG93cyBmb3IgYmV0d2VlbiAyNjUgYW5kIDI3NSBkZWdyZWVzIG9mIHJvdGF0aW9uLgorICAgIElNQVFfREFUQV9NQVRSSVhfUk9UQVRJT05fTU9ERV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBEYXRhTWF0cml4Um90YXRpb25Nb2RlOworCit0eXBlZGVmIGVudW0gQUlNR3JhZGVfZW51bSB7CisgICAgSU1BUV9BSU1fR1JBREVfRiAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1RoZSBEYXRhIE1hdHJpeCBiYXJjb2RlIHJlY2VpdmVkIGEgZ3JhZGUgb2YgRi4KKyAgICBJTUFRX0FJTV9HUkFERV9EICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vVGhlIERhdGEgTWF0cml4IGJhcmNvZGUgcmVjZWl2ZWQgYSBncmFkZSBvZiBELgorICAgIElNQVFfQUlNX0dSQURFX0MgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgLy9UaGUgRGF0YSBNYXRyaXggYmFyY29kZSByZWNlaXZlZCBhIGdyYWRlIG9mIEMuCisgICAgSU1BUV9BSU1fR1JBREVfQiAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAvL1RoZSBEYXRhIE1hdHJpeCBiYXJjb2RlIHJlY2VpdmVkIGEgZ3JhZGUgb2YgQi4KKyAgICBJTUFRX0FJTV9HUkFERV9BICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgIC8vVGhlIERhdGEgTWF0cml4IGJhcmNvZGUgcmVjZWl2ZWQgYSBncmFkZSBvZiBBLgorICAgIElNQVFfREFUQV9NQVRSSVhfQUlNX0dSQURFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IEFJTUdyYWRlOworCit0eXBlZGVmIGVudW0gRGF0YU1hdHJpeENlbGxGaWxsTW9kZV9lbnVtIHsKKyAgICBJTUFRX0FVVE9fREVURUNUX0NFTExfRklMTF9NT0RFICAgICAgICAgICAgPSAtMiwgICAgICAgICAgLy9TZXRzIHRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgdGhlIERhdGEgTWF0cml4IGJhcmNvZGUgY2VsbCBmaWxsIHBlcmNlbnRhZ2UgYXV0b21hdGljYWxseS4KKyAgICBJTUFRX0xPV19GSUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9TZXRzIHRoZSBmdW5jdGlvbiB0byByZWFkIERhdGEgTWF0cml4IGJhcmNvZGVzIHdpdGggYSBjZWxsIGZpbGwgcGVyY2VudGFnZSBvZiBsZXNzIHRoYW4gMzAgcGVyY2VudC4KKyAgICBJTUFRX05PUk1BTF9GSUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9TZXRzIHRoZSBmdW5jdGlvbiB0byByZWFkIERhdGEgTWF0cml4IGJhcmNvZGVzIHdpdGggYSBjZWxsIGZpbGwgcGVyY2VudGFnZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMzAgcGVyY2VudC4KKyAgICBJTUFRX0RBVEFfTUFUUklYX0NFTExfRklMTF9NT0RFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IERhdGFNYXRyaXhDZWxsRmlsbE1vZGU7CisKK3R5cGVkZWYgZW51bSBEYXRhTWF0cml4RGVtb2R1bGF0aW9uTW9kZV9lbnVtIHsKKyAgICBJTUFRX0FVVE9fREVURUNUX0RFTU9EVUxBVElPTl9NT0RFICAgICAgICAgICAgPSAtMiwgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gd2lsbCB0cnkgZWFjaCBkZW1vZHVsYXRpb24gbW9kZSBhbmQgdXNlIHRoZSBvbmUgd2hpY2ggZGVjb2RlcyB0aGUgRGF0YSBNYXRyaXggYmFyY29kZSB3aXRoaW4gdGhlIGZld2VzdCBpdGVyYXRpb25zIGFuZCB1dGlsaXppbmcgdGhlIGxlYXN0IGFtb3VudCBvZiBlcnJvciBjb3JyZWN0aW9uLgorICAgIElNQVFfSElTVE9HUkFNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB1c2VzIGEgaGlzdG9ncmFtIG9mIGFsbCBvZiB0aGUgRGF0YSBNYXRyaXggY2VsbHMgdG8gY2FsY3VsYXRlIGEgdGhyZXNob2xkLgorICAgIElNQVFfTE9DQUxfQ09OVFJBU1QgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBleGFtaW5lcyBlYWNoIG9mIHRoZSBjZWxsJ3MgbmVpZ2hib3JzIHRvIGRldGVybWluZSBpZiB0aGUgY2VsbCBpcyBvbiBvciBvZmYuCisgICAgSU1BUV9DT01CSU5FRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHVzZXMgdGhlIGhpc3RvZ3JhbSBvZiB0aGUgRGF0YSBNYXRyaXggYmFyY29kZSB0byBjYWxjdWxhdGUgYSB0aHJlc2hvbGQuCisgICAgSU1BUV9BTExfREVNT0RVTEFUSU9OX01PREVTICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHRyaWVzIElNQVFfSElTVE9HUkFNLCB0aGVuIElNQVFfTE9DQUxfQ09OVFJBU1QgYW5kIHRoZW4gSU1BUV9DT01CSU5BVElPTiwgc3RvcHBpbmcgb25jZSBvbmUgbW9kZSBpcyBzdWNjZXNzZnVsLgorICAgIElNQVFfREFUQV9NQVRSSVhfREVNT0RVTEFUSU9OX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gRGF0YU1hdHJpeERlbW9kdWxhdGlvbk1vZGU7CisKK3R5cGVkZWYgZW51bSBEYXRhTWF0cml4RUNDX2VudW0geworICAgIElNQVFfQVVUT19ERVRFQ1RfRUNDICAgICAgICAgICAgPSAtMiwgICAgICAgICAgLy9TZXRzIHRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgdGhlIERhdGEgTWF0cml4IGJhcmNvZGUgRUNDIGF1dG9tYXRpY2FsbHkuCisgICAgSU1BUV9FQ0NfMDAwICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1NldHMgdGhlIGZ1bmN0aW9uIHRvIHJlYWQgRGF0YSBNYXRyaXggYmFyY29kZXMgb2YgRUNDIDAwMCBvbmx5LgorICAgIElNQVFfRUNDXzA1MCAgICAgICAgICAgICAgICAgICAgPSA1MCwgICAgICAgICAgLy9TZXRzIHRoZSBmdW5jdGlvbiB0byByZWFkIERhdGEgTWF0cml4IGJhcmNvZGVzIG9mIEVDQyAwNTAgb25seS4KKyAgICBJTUFRX0VDQ18wODAgICAgICAgICAgICAgICAgICAgID0gODAsICAgICAgICAgIC8vU2V0cyB0aGUgZnVuY3Rpb24gdG8gcmVhZCBEYXRhIE1hdHJpeCBiYXJjb2RlcyBvZiBFQ0MgMDgwIG9ubHkuCisgICAgSU1BUV9FQ0NfMTAwICAgICAgICAgICAgICAgICAgICA9IDEwMCwgICAgICAgICAvL1NldHMgdGhlIGZ1bmN0aW9uIHRvIHJlYWQgRGF0YSBNYXRyaXggYmFyY29kZXMgb2YgRUNDIDEwMCBvbmx5LgorICAgIElNQVFfRUNDXzE0MCAgICAgICAgICAgICAgICAgICAgPSAxNDAsICAgICAgICAgLy9TZXRzIHRoZSBmdW5jdGlvbiB0byByZWFkIERhdGEgTWF0cml4IGJhcmNvZGVzIG9mIEVDQyAxNDAgb25seS4KKyAgICBJTUFRX0VDQ18wMDBfMTQwICAgICAgICAgICAgICAgID0gMTkwLCAgICAgICAgIC8vU2V0cyB0aGUgZnVuY3Rpb24gdG8gcmVhZCBEYXRhIE1hdHJpeCBiYXJjb2RlcyBvZiBFQ0MgMDAwLCBFQ0MgMDUwLCBFQ0MgMDgwLCBFQ0MgMTAwLCBhbmQgRUNDIDE0MCBvbmx5LgorICAgIElNQVFfRUNDXzIwMCAgICAgICAgICAgICAgICAgICAgPSAyMDAsICAgICAgICAgLy9TZXRzIHRoZSBmdW5jdGlvbiB0byByZWFkIERhdGEgTWF0cml4IGJhcmNvZGVzIG9mIEVDQyAyMDAgb25seS4KKyAgICBJTUFRX0RBVEFfTUFUUklYX0VDQ19TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBEYXRhTWF0cml4RUNDOworCit0eXBlZGVmIGVudW0gRGF0YU1hdHJpeFBvbGFyaXR5X2VudW0geworICAgIElNQVFfQVVUT19ERVRFQ1RfUE9MQVJJVFkgICAgICAgICAgICA9IC0yLCAgICAgICAgICAvL1NldHMgdGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSB0aGUgRGF0YSBNYXRyaXggYmFyY29kZSBwb2xhcml0eSBhdXRvbWF0aWNhbGx5LgorICAgIElNQVFfQkxBQ0tfREFUQV9PTl9XSElURV9CQUNLR1JPVU5EICA9IDAsICAgICAgICAgICAvL1NldHMgdGhlIGZ1bmN0aW9uIHRvIHJlYWQgRGF0YSBNYXRyaXggYmFyY29kZXMgd2l0aCBkYXJrIGRhdGEgb24gYSBicmlnaHQgYmFja2dyb3VuZC4KKyAgICBJTUFRX1dISVRFX0RBVEFfT05fQkxBQ0tfQkFDS0dST1VORCAgPSAxLCAgICAgICAgICAgLy9TZXRzIHRoZSBmdW5jdGlvbiB0byByZWFkIERhdGEgTWF0cml4IGJhcmNvZGVzIHdpdGggYnJpZ2h0IGRhdGEgb24gYSBkYXJrIGJhY2tncm91bmQuCisgICAgSU1BUV9EQVRBX01BVFJJWF9QT0xBUklUWV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBEYXRhTWF0cml4UG9sYXJpdHk7CisKK3R5cGVkZWYgZW51bSBEYXRhTWF0cml4Q2VsbEZpbHRlck1vZGVfZW51bSB7CisgICAgSU1BUV9BVVRPX0RFVEVDVF9DRUxMX0ZJTFRFUl9NT0RFICAgICAgICAgICAgPSAtMiwgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gd2lsbCB0cnkgYWxsIGZpbHRlciBtb2RlcyBhbmQgdXNlcyB0aGUgb25lIHRoYXQgZGVjb2RlcyB0aGUgRGF0YSBNYXRyaXggYmFyY29kZSB3aXRoaW4gdGhlIGZld2VzdCBpdGVyYXRpb25zIGFuZCB1dGlsaXppbmcgdGhlIGxlYXN0IGFtb3VudCBvZiBlcnJvciBjb3JyZWN0aW9uLgorICAgIElNQVFfQVZFUkFHRV9GSUxURVIgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHNldHMgdGhlIHBpeGVsIHZhbHVlIGZvciB0aGUgY2VsbCB0byB0aGUgYXZlcmFnZSBvZiB0aGUgc2FtcGxlZCBwaXhlbHMuCisgICAgSU1BUV9NRURJQU5fRklMVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gc2V0cyB0aGUgcGl4ZWwgdmFsdWUgZm9yIHRoZSBjZWxsIHRvIHRoZSBtZWRpYW4gb2YgdGhlIHNhbXBsZWQgcGl4ZWxzLgorICAgIElNQVFfQ0VOVFJBTF9BVkVSQUdFX0ZJTFRFUiAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHNldHMgdGhlIHBpeGVsIHZhbHVlIGZvciB0aGUgY2VsbCB0byB0aGUgYXZlcmFnZSBvZiB0aGUgcGl4ZWxzIGluIHRoZSBjZW50ZXIgb2YgdGhlIGNlbGwgc2FtcGxlLgorICAgIElNQVFfSElHSF9BVkVSQUdFX0ZJTFRFUiAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHNldHMgdGhlIHBpeGVsIHZhbHVlIGZvciB0aGUgY2VsbCB0byB0aGUgYXZlcmFnZSB2YWx1ZSBvZiB0aGUgaGFsZiBvZiB0aGUgc2FtcGxlZCBwaXhlbHMgd2l0aCB0aGUgaGlnaGVzdCBwaXhlbCB2YWx1ZXMuCisgICAgSU1BUV9MT1dfQVZFUkFHRV9GSUxURVIgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gc2V0cyB0aGUgcGl4ZWwgdmFsdWUgZm9yIHRoZSBjZWxsIHRvIHRoZSBhdmVyYWdlIHZhbHVlIG9mIHRoZSBoYWxmIG9mIHRoZSBzYW1wbGVkIHBpeGVscyB3aXRoIHRoZSBsb3dlc3QgcGl4ZWwgdmFsdWVzLgorICAgIElNQVFfVkVSWV9ISUdIX0FWRVJBR0VfRklMVEVSICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHNldHMgdGhlIHBpeGVsIHZhbHVlIGZvciB0aGUgY2VsbCB0byB0aGUgYXZlcmFnZSB2YWx1ZSBvZiB0aGUgbmludGggb2YgdGhlIHNhbXBsZWQgcGl4ZWxzIHdpdGggdGhlIGhpZ2hlc3QgcGl4ZWwgdmFsdWVzLgorICAgIElNQVFfVkVSWV9MT1dfQVZFUkFHRV9GSUxURVIgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHNldHMgdGhlIHBpeGVsIHZhbHVlIGZvciB0aGUgY2VsbCB0byB0aGUgYXZlcmFnZSB2YWx1ZSBvZiB0aGUgbmludGggb2YgdGhlIHNhbXBsZWQgcGl4ZWxzIHdpdGggdGhlIGxvd2VzdCBwaXhlbCB2YWx1ZXMuCisgICAgSU1BUV9BTExfQ0VMTF9GSUxURVJTICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdHJpZXMgZWFjaCBmaWx0ZXIgbW9kZSwgc3RhcnRpbmcgd2l0aCBJTUFRX0FWRVJBR0VfRklMVEVSIGFuZCBlbmRpbmcgd2l0aCBJTUFRX1ZFUllfTE9XX0FWRVJBR0VfRklMVEVSLCBzdG9wcGluZyBvbmNlIGEgZmlsdGVyIG1vZGUgZGVjb2RlcyBjb3JyZWN0bHkuCisgICAgSU1BUV9EQVRBX01BVFJJWF9DRUxMX0ZJTFRFUl9NT0RFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IERhdGFNYXRyaXhDZWxsRmlsdGVyTW9kZTsKKwordHlwZWRlZiBlbnVtIFdpbmRvd0JhY2tncm91bmRIYXRjaFN0eWxlX2VudW0geworICAgIElNQVFfSEFUQ0hfU1RZTEVfSE9SSVpPTlRBTCAgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgYmFja2dyb3VuZCBvZiB0aGUgZGlzcGxheSB3aW5kb3cgd2lsbCBiZSBob3Jpem9udGFsIGJhcnMuCisgICAgSU1BUV9IQVRDSF9TVFlMRV9WRVJUSUNBTCAgICAgICAgICA9IDEsICAgICAgICAgICAvL1RoZSBiYWNrZ3JvdW5kIG9mIHRoZSBkaXNwbGF5IHdpbmRvdyB3aWxsIGJlIHZlcnRpY2FsIGJhcnMuCisgICAgSU1BUV9IQVRDSF9TVFlMRV9GT1JXQVJEX0RJQUdPTkFMICA9IDIsICAgICAgICAgICAvL1RoZSBiYWNrZ3JvdW5kIG9mIHRoZSBkaXNwbGF5IHdpbmRvdyB3aWxsIGJlIGRpYWdvbmFsIGJhcnMuCisgICAgSU1BUV9IQVRDSF9TVFlMRV9CQUNLV0FSRF9ESUFHT05BTCA9IDMsICAgICAgICAgICAvL1RoZSBiYWNrZ3JvdW5kIG9mIHRoZSBkaXNwbGF5IHdpbmRvdyB3aWxsIGJlIGRpYWdvbmFsIGJhcnMuCisgICAgSU1BUV9IQVRDSF9TVFlMRV9DUk9TUyAgICAgICAgICAgICA9IDQsICAgICAgICAgICAvL1RoZSBiYWNrZ3JvdW5kIG9mIHRoZSBkaXNwbGF5IHdpbmRvdyB3aWxsIGJlIGludGVyc2VjdGluZyBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBiYXJzLgorICAgIElNQVFfSEFUQ0hfU1RZTEVfQ1JPU1NfSEFUQ0ggICAgICAgPSA1LCAgICAgICAgICAgLy9UaGUgYmFja2dyb3VuZCBvZiB0aGUgZGlzcGxheSB3aW5kb3cgd2lsbCBiZSBpbnRlcnNlY3RpbmcgZm9yd2FyZCBhbmQgYmFja3dhcmQgZGlhZ29uYWwgYmFycy4KKyAgICBJTUFRX0hBVENIX1NUWUxFX1NJWkVfR1VBUkQgICAgICAgID0gMHhGRkZGRkZGRiAgIAorfSBXaW5kb3dCYWNrZ3JvdW5kSGF0Y2hTdHlsZTsKKwordHlwZWRlZiBlbnVtIERhdGFNYXRyaXhNaXJyb3JNb2RlX2VudW0geworICAgIElNQVFfQVVUT19ERVRFQ1RfTUlSUk9SICAgICAgICAgICAgICAgICA9IC0yLCAgICAgICAgICAvL1NwZWNpZmllcyB0aGF0IHRoZSBmdW5jdGlvbiBzaG91bGQgZGV0ZXJtaW5lIGlmIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlIGlzIG1pcnJvcmVkLgorICAgIElNQVFfQVBQRUFSU19OT1JNQUwgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1NwZWNpZmllcyB0aGF0IHRoZSBmdW5jdGlvbiBzaG91bGQgZXhwZWN0IHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlIHRvIGFwcGVhciBub3JtYWwuCisgICAgSU1BUV9BUFBFQVJTX01JUlJPUkVEICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoYXQgdGhlIGZ1bmN0aW9uIHNob3VsZCBleHBlY3QgdGhlIERhdGEgTWF0cml4IGJhcmNvZGUgdG8gYXBwZWFyIG1pcnJvcmVkLgorICAgIElNQVFfREFUQV9NQVRSSVhfTUlSUk9SX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gRGF0YU1hdHJpeE1pcnJvck1vZGU7CisKK3R5cGVkZWYgZW51bSBDYWxpYnJhdGlvbk1vZGUyX2VudW0geworICAgIElNQVFfUEVSU1BFQ1RJVkVfTU9ERSAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL0Z1bmN0aW9ucyBjb3JyZWN0IGZvciBkaXN0b3J0aW9uIGNhdXNlZCBieSB0aGUgY2FtZXJhJ3MgcGVyc3BlY3RpdmUuCisgICAgSU1BUV9NSUNST1BMQU5FX01PREUgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vRnVuY3Rpb25zIGNvcnJlY3QgZm9yIGRpc3RvcnRpb24gY2F1c2VkIGJ5IHRoZSBjYW1lcmEncyBsZW5zLgorICAgIElNQVFfU0lNUExFX0NBTElCUkFUSU9OX01PREUgICAgICA9IDIsICAgICAgICAgICAvL0Z1bmN0aW9ucyBkbyBub3QgY29ycmVjdCBmb3IgZGlzdG9ydGlvbi4KKyAgICBJTUFRX0NPUlJFQ1RFRF9JTUFHRV9NT0RFICAgICAgICAgPSAzLCAgICAgICAgICAgLy9UaGUgaW1hZ2UgaXMgYWxyZWFkeSBjb3JyZWN0ZWQuCisgICAgSU1BUV9OT19DQUxJQlJBVElPTl9NT0RFICAgICAgICAgID0gNCwgICAgICAgICAgIC8vSW1hZ2Ugd2l0aCBObyBjYWxpYnJhdGlvbi4KKyAgICBJTUFRX0NBTElCUkFUSU9OX01PREUyX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IENhbGlicmF0aW9uTW9kZTI7CisKK3R5cGVkZWYgZW51bSBEYXRhTWF0cml4R3JhZGluZ01vZGVfZW51bSB7CisgICAgSU1BUV9OT19HUkFESU5HICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBkb2VzIG5vdCBtYWtlIGFueSBwcmVwYXJhdG9yeSBjYWxjdWxhdGlvbnMuCisgICAgSU1BUV9QUkVQQVJFX0ZPUl9BSU0gICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBwcmVwYXJlcyB0aGUgaW1hZ2UgZm9yIGdyYWRpbmcgdXNpbmcgdGhlIEFJTSBQcmludCBRdWFsaXR5IG1ldHJpY3MuCisgICAgSU1BUV9EQVRBX01BVFJJWF9HUkFESU5HX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gRGF0YU1hdHJpeEdyYWRpbmdNb2RlOworCit0eXBlZGVmIGVudW0gV2F2ZWxldFRyYW5zZm9ybU1vZGVfZW51bSB7CisgICAgSU1BUV9XQVZFTEVUX1RSQU5TRk9STV9JTlRFR0VSICAgICAgICAgPSAwLCAgICAgICAgICAgLy9Vc2VzIGEgNS0zIHJldmVyc2libGUgaW50ZWdlciB0cmFuc2Zvcm0uCisgICAgSU1BUV9XQVZFTEVUX1RSQU5TRk9STV9GTE9BVElOR19QT0lOVCAgPSAxLCAgICAgICAgICAgLy9QZXJmb3JtcyBhIDktNyBpcnJldmVyc2libGUgZmxvYXRpbmctcG9pbnQgdHJhbnNmb3JtLgorICAgIElNQVFfV0FWRUxFVF9UUkFOU0ZPUk1fTU9ERV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBXYXZlbGV0VHJhbnNmb3JtTW9kZTsKKwordHlwZWRlZiBlbnVtIE5vcm1hbGl6YXRpb25NZXRob2RfZW51bSB7CisgICAgSU1BUV9OT1JNQUxJWkFUSU9OX05PTkUgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL05vIG5vcm1hbGl6YXRpb24uCisgICAgSU1BUV9OT1JNQUxJWkFUSU9OX0hJU1RPR1JBTV9NQVRDSElORyA9IDEsICAgICAgICAgICAvL0FkanVzdCBpbWFnZSBzbyBpdHMgaGlzdG9ncmFtIGlzIHNpbWlsYXIgdG8gdGhlIGdvbGRlbiB0ZW1wbGF0ZSdzIGhpc3RvZ3JhbS4KKyAgICBJTUFRX05PUk1BTElaQVRJT05fQVZFUkFHRV9NQVRDSElORyAgID0gMiwgICAgICAgICAgIC8vQWRqdXN0IGltYWdlIHNvIGl0cyBtZWFuIHBpeGVsIHZhbHVlIGVxdWFscyB0aGUgZ29sZGVuIHRlbXBsYXRlJ3MgbWVhbiBwaXhlbCB2YWx1ZS4KKyAgICBJTUFRX05PUk1BTElaQVRJT05fU0laRV9HVUFSRCAgICAgICAgID0gMHhGRkZGRkZGRiAgIAorfSBOb3JtYWxpemF0aW9uTWV0aG9kOworCit0eXBlZGVmIGVudW0gUmVnaXN0cmF0aW9uTWV0aG9kX2VudW0geworICAgIElNQVFfUkVHSVNUUkFUSU9OX05PTkUgICAgICAgID0gMCwgICAgICAgICAgIC8vTm8gcmVnaXN0cmF0aW9uLgorICAgIElNQVFfUkVHSVNUUkFUSU9OX1BFUlNQRUNUSVZFID0gMSwgICAgICAgICAgIC8vQWRqdXN0IGltYWdlIHRvIGNvcnJlY3QgZm9yIG1pbm9yIHZhcmlhdGlvbnMgaW4gYWxpZ25tZW50IG9yIHBlcnNwZWN0aXZlLgorICAgIElNQVFfUkVHSVNUUkFUSU9OX1NJWkVfR1VBUkQgID0gMHhGRkZGRkZGRiAgIAorfSBSZWdpc3RyYXRpb25NZXRob2Q7CisKK3R5cGVkZWYgZW51bSBMaW5lYXJBdmVyYWdlc01vZGVfZW51bSB7CisgICAgSU1BUV9DT0xVTU5fQVZFUkFHRVMgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoYXQgdGhlIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIG1lYW4gcGl4ZWwgdmFsdWUgb2YgZWFjaCBjb2x1bW4uCisgICAgSU1BUV9ST1dfQVZFUkFHRVMgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoYXQgdGhlIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIG1lYW4gcGl4ZWwgdmFsdWUgb2YgZWFjaCByb3cuCisgICAgSU1BUV9SSVNJTkdfRElBR09OQUxfQVZFUkFHRVMgICAgICAgID0gNCwgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoYXQgdGhlIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIG1lYW4gcGl4ZWwgdmFsdWUgb2YgZWFjaCBkaWFnb25hbCBydW5uaW5nIGZyb20gdGhlIGxvd2VyIGxlZnQgdG8gdGhlIHVwcGVyIHJpZ2h0IG9mIHRoZSBpbnNwZWN0ZWQgYXJlYSBvZiB0aGUgaW1hZ2UuCisgICAgSU1BUV9GQUxMSU5HX0RJQUdPTkFMX0FWRVJBR0VTICAgICAgID0gOCwgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoYXQgdGhlIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIG1lYW4gcGl4ZWwgdmFsdWUgb2YgZWFjaCBkaWFnb25hbCBydW5uaW5nIGZyb20gdGhlIHVwcGVyIGxlZnQgdG8gdGhlIGxvd2VyIHJpZ2h0IG9mIHRoZSBpbnNwZWN0ZWQgYXJlYSBvZiB0aGUgaW1hZ2UuCisgICAgSU1BUV9BTExfTElORUFSX0FWRVJBR0VTICAgICAgICAgICAgID0gMTUsICAgICAgICAgIC8vU3BlY2lmaWVzIHRoYXQgdGhlIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgYWxsIGZvdXIgbGluZWFyIG1lYW4gcGl4ZWwgdmFsdWVzLgorICAgIElNQVFfTElORUFSX0FWRVJBR0VTX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gTGluZWFyQXZlcmFnZXNNb2RlOworCit0eXBlZGVmIGVudW0gQ29tcHJlc3Npb25UeXBlX2VudW0geworICAgIElNQVFfQ09NUFJFU1NJT05fTk9ORSAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoYXQgdGhlIGZ1bmN0aW9uIHNob3VsZCBub3QgY29tcHJlc3MgdGhlIGltYWdlLgorICAgIElNQVFfQ09NUFJFU1NJT05fSlBFRyAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoYXQgdGhlIGZ1bmN0aW9uIHNob3VsZCB1c2UgbG9zc3kgSlBFRyBjb21wcmVzc2lvbiBvbiB0aGUgaW1hZ2UuCisgICAgSU1BUV9DT01QUkVTU0lPTl9QQUNLRURfQklOQVJZICAgPSAyLCAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhhdCB0aGUgZnVuY3Rpb24gc2hvdWxkIHVzZSBsb3NzbGVzcyBiaW5hcnkgcGFja2luZyBvbiB0aGUgaW1hZ2UuCisgICAgSU1BUV9DT01QUkVTU0lPTl9UWVBFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IENvbXByZXNzaW9uVHlwZTsKKwordHlwZWRlZiBlbnVtIEZsYXR0ZW5UeXBlX2VudW0geworICAgIElNQVFfRkxBVFRFTl9JTUFHRSAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9GbGF0dGVucyBqdXN0IHRoZSBpbWFnZSBkYXRhLgorICAgIElNQVFfRkxBVFRFTl9JTUFHRV9BTkRfVklTSU9OX0lORk8gPSAxLCAgICAgICAgICAgLy9GbGF0dGVucyB0aGUgaW1hZ2UgZGF0YSBhbmQgYW55IFZpc2lvbiBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGltYWdlLgorICAgIElNQVFfRkxBVFRFTl9UWVBFX1NJWkVfR1VBUkQgICAgICAgPSAweEZGRkZGRkZGICAgCit9IEZsYXR0ZW5UeXBlOworCit0eXBlZGVmIGVudW0gRGF0YU1hdHJpeENlbGxTYW1wbGVTaXplX2VudW0geworICAgIElNQVFfQVVUT19ERVRFQ1RfQ0VMTF9TQU1QTEVfU0laRSAgICAgICAgICAgID0gLTIsICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHdpbGwgdHJ5IGVhY2ggc2FtcGxlIHNpemUgYW5kIHVzZSB0aGUgb25lIHdoaWNoIGRlY29kZXMgdGhlIERhdGEgTWF0cml4IGJhcmNvZGUgd2l0aGluIHRoZSBmZXdlc3QgaXRlcmF0aW9ucyBhbmQgdXRpbGl6aW5nIHRoZSBsZWFzdCBhbW91bnQgb2YgZXJyb3IgY29ycmVjdGlvbi4KKyAgICBJTUFRXzF4MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB3aWxsIHVzZSBhIDF4MSBzaXplZCBzYW1wbGUgZnJvbSBlYWNoIGNlbGwuCisgICAgSU1BUV8yeDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gd2lsbCB1c2UgYSAyeDIgc2l6ZWQgc2FtcGxlIGZyb20gZWFjaCBjZWxsLgorICAgIElNQVFfM3gzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHdpbGwgdXNlIGEgM3gzIHNpemVkIHNhbXBsZSBmcm9tIGVhY2ggY2VsbC4KKyAgICBJTUFRXzR4NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB3aWxsIHVzZSBhIDR4NCBzaXplZCBzYW1wbGUgZnJvbSBlYWNoIGNlbGwuCisgICAgSU1BUV81eDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gd2lsbCB1c2UgYSA1eDUgc2l6ZWQgc2FtcGxlIGZyb20gZWFjaCBjZWxsLgorICAgIElNQVFfNng2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHdpbGwgdXNlIGEgNng2IHNpemVkIHNhbXBsZSBmcm9tIGVhY2ggY2VsbC4KKyAgICBJTUFRXzd4NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB3aWxsIHVzZSBhIDd4NyBzaXplZCBzYW1wbGUgZnJvbSBlYWNoIGNlbGwuCisgICAgSU1BUV9EQVRBX01BVFJJWF9DRUxMX1NBTVBMRV9TSVpFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IERhdGFNYXRyaXhDZWxsU2FtcGxlU2l6ZTsKKworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBGb3J3YXJkIERlY2xhcmUgRGF0YSBTdHJ1Y3R1cmVzCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3R5cGVkZWYgc3RydWN0IEltYWdlX3N0cnVjdCBJbWFnZTsKK3R5cGVkZWYgc3RydWN0IFJPSV9zdHJ1Y3QgUk9JOwordHlwZWRlZiBzdHJ1Y3QgT3ZlcmxheV9zdHJ1Y3QgT3ZlcmxheTsKK3R5cGVkZWYgc3RydWN0IENsYXNzaWZpZXJTZXNzaW9uX3N0cnVjdCBDbGFzc2lmaWVyU2Vzc2lvbjsKK3R5cGVkZWYgc3RydWN0IE11bHRpcGxlR2VvbWV0cmljUGF0dGVybl9zdHJ1Y3QgTXVsdGlwbGVHZW9tZXRyaWNQYXR0ZXJuOwordHlwZWRlZiBpbnQgQ29udG91cklEOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIFNFU1NJT05fSUQ7Cit0eXBlZGVmIGludAlBVklTZXNzaW9uOwordHlwZWRlZiBjaGFyKiBGaWx0ZXJOYW1lOwordHlwZWRlZiBjaGFyIFN0cmluZzI1NVsyNTZdOwordHlwZWRlZiBzdHJ1Y3QgQ2hhclNldF9zdHJ1Y3QgQ2hhclNldDsKK3R5cGVkZWYgc3RydWN0IE9DUlNwYWNpbmdPcHRpb25zX3N0cnVjdCBPQ1JTcGFjaW5nT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IE9DUlByb2Nlc3NpbmdPcHRpb25zX3N0cnVjdCBPQ1JQcm9jZXNzaW5nT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IFJlYWRUZXh0T3B0aW9uc19zdHJ1Y3QgUmVhZFRleHRPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgQ2hhckluZm9fc3RydWN0IENoYXJJbmZvOwordHlwZWRlZiBzdHJ1Y3QgQ2hhclJlcG9ydF9zdHJ1Y3QgQ2hhclJlcG9ydDsKK3R5cGVkZWYgc3RydWN0IFJlYWRUZXh0UmVwb3J0X3N0cnVjdCBSZWFkVGV4dFJlcG9ydDsKK3R5cGVkZWYgc3RydWN0IERpdmlzaW9uTW9kZWxfc3RydWN0IERpdmlzaW9uTW9kZWw7Cit0eXBlZGVmIHN0cnVjdCBGb2NhbExlbmd0aF9zdHJ1Y3QgRm9jYWxMZW5ndGg7Cit0eXBlZGVmIHN0cnVjdCBQb2x5TW9kZWxfc3RydWN0IFBvbHlNb2RlbDsKK3R5cGVkZWYgc3RydWN0IERpc3RvcnRpb25Nb2RlbFBhcmFtc19zdHJ1Y3QgRGlzdG9ydGlvbk1vZGVsUGFyYW1zOwordHlwZWRlZiBzdHJ1Y3QgUG9pbnRGbG9hdF9zdHJ1Y3QgUG9pbnRGbG9hdDsKK3R5cGVkZWYgc3RydWN0IEludGVybmFsUGFyYW1ldGVyc19zdHJ1Y3QgSW50ZXJuYWxQYXJhbWV0ZXJzOwordHlwZWRlZiBzdHJ1Y3QgTWF4R3JpZFNpemVfc3RydWN0IE1heEdyaWRTaXplOwordHlwZWRlZiBzdHJ1Y3QgSW1hZ2VTaXplX3N0cnVjdCBJbWFnZVNpemU7Cit0eXBlZGVmIHN0cnVjdCBDYWxpYnJhdGlvblJlZmVyZW5jZVBvaW50c19zdHJ1Y3QgQ2FsaWJyYXRpb25SZWZlcmVuY2VQb2ludHM7Cit0eXBlZGVmIHN0cnVjdCBHZXRDYW1lcmFQYXJhbWV0ZXJzUmVwb3J0X3N0cnVjdCBHZXRDYW1lcmFQYXJhbWV0ZXJzUmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgQ2FsaWJyYXRpb25BeGlzSW5mb19zdHJ1Y3QgQ2FsaWJyYXRpb25BeGlzSW5mbzsKK3R5cGVkZWYgc3RydWN0IENhbGlicmF0aW9uTGVhcm5TZXR1cEluZm9fc3RydWN0IENhbGlicmF0aW9uTGVhcm5TZXR1cEluZm87Cit0eXBlZGVmIHN0cnVjdCBHcmlkRGVzY3JpcHRvcl9zdHJ1Y3QgR3JpZERlc2NyaXB0b3I7Cit0eXBlZGVmIHN0cnVjdCBFcnJvclN0YXRpc3RpY3Nfc3RydWN0IEVycm9yU3RhdGlzdGljczsKK3R5cGVkZWYgc3RydWN0IEdldENhbGlicmF0aW9uSW5mb1JlcG9ydF9zdHJ1Y3QgR2V0Q2FsaWJyYXRpb25JbmZvUmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgRWRnZVBvbGFyaXR5X3N0cnVjdCBFZGdlUG9sYXJpdHk7Cit0eXBlZGVmIHN0cnVjdCBDbGFtcFNldHRpbmdzX3N0cnVjdCBDbGFtcFNldHRpbmdzOwordHlwZWRlZiBzdHJ1Y3QgUG9pbnREb3VibGVfc3RydWN0IFBvaW50RG91YmxlOwordHlwZWRlZiBzdHJ1Y3QgUG9pbnREb3VibGVQYWlyX3N0cnVjdCBQb2ludERvdWJsZVBhaXI7Cit0eXBlZGVmIHN0cnVjdCBDbGFtcFJlc3VsdHNfc3RydWN0IENsYW1wUmVzdWx0czsKK3R5cGVkZWYgc3RydWN0IENsYW1wUG9pbnRzX3N0cnVjdCBDbGFtcFBvaW50czsKK3R5cGVkZWYgc3RydWN0IFJHQlZhbHVlX3N0cnVjdCBSR0JWYWx1ZTsKK3R5cGVkZWYgc3RydWN0IENsYW1wT3ZlcmxheVNldHRpbmdzX3N0cnVjdCBDbGFtcE92ZXJsYXlTZXR0aW5nczsKK3R5cGVkZWYgc3RydWN0IENsYW1wTWF4MlJlcG9ydF9zdHJ1Y3QgQ2xhbXBNYXgyUmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgQ29udG91ckZpdFNwbGluZVJlcG9ydF9zdHJ1Y3QgQ29udG91ckZpdFNwbGluZVJlcG9ydDsKK3R5cGVkZWYgc3RydWN0IExpbmVGbG9hdF9zdHJ1Y3QgTGluZUZsb2F0OwordHlwZWRlZiBzdHJ1Y3QgTGluZUVxdWF0aW9uX3N0cnVjdCBMaW5lRXF1YXRpb247Cit0eXBlZGVmIHN0cnVjdCBDb250b3VyRml0TGluZVJlcG9ydF9zdHJ1Y3QgQ29udG91ckZpdExpbmVSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBDb250b3VyRml0UG9seW5vbWlhbFJlcG9ydF9zdHJ1Y3QgQ29udG91ckZpdFBvbHlub21pYWxSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBQYXJ0aWFsQ2lyY2xlX3N0cnVjdCBQYXJ0aWFsQ2lyY2xlOwordHlwZWRlZiBzdHJ1Y3QgUGFydGlhbEVsbGlwc2Vfc3RydWN0IFBhcnRpYWxFbGxpcHNlOwordHlwZWRlZiBzdHJ1Y3QgU2V0dXBNYXRjaFBhdHRlcm5EYXRhX3N0cnVjdCBTZXR1cE1hdGNoUGF0dGVybkRhdGE7Cit0eXBlZGVmIHN0cnVjdCBSYW5nZVNldHRpbmdEb3VibGVfc3RydWN0IFJhbmdlU2V0dGluZ0RvdWJsZTsKK3R5cGVkZWYgc3RydWN0IEdlb21ldHJpY0FkdmFuY2VkU2V0dXBEYXRhT3B0aW9uX3N0cnVjdCBHZW9tZXRyaWNBZHZhbmNlZFNldHVwRGF0YU9wdGlvbjsKK3R5cGVkZWYgc3RydWN0IENvbnRvdXJJbmZvUmVwb3J0X3N0cnVjdCBDb250b3VySW5mb1JlcG9ydDsKK3R5cGVkZWYgc3RydWN0IFJPSUxhYmVsX3N0cnVjdCBST0lMYWJlbDsKK3R5cGVkZWYgc3RydWN0IFN1cGVydmlzZWRDb2xvclNlZ21lbnRhdGlvblJlcG9ydF9zdHJ1Y3QgU3VwZXJ2aXNlZENvbG9yU2VnbWVudGF0aW9uUmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgTGFiZWxUb1JPSVJlcG9ydF9zdHJ1Y3QgTGFiZWxUb1JPSVJlcG9ydDsKK3R5cGVkZWYgc3RydWN0IENvbG9yU2VnbWVuYXRpb25PcHRpb25zX3N0cnVjdCBDb2xvclNlZ21lbmF0aW9uT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IENsYXNzaWZpZWRDdXJ2ZV9zdHJ1Y3QgQ2xhc3NpZmllZEN1cnZlOwordHlwZWRlZiBzdHJ1Y3QgUmFuZ2VEb3VibGVfc3RydWN0IFJhbmdlRG91YmxlOwordHlwZWRlZiBzdHJ1Y3QgUmFuZ2VMYWJlbF9zdHJ1Y3QgUmFuZ2VMYWJlbDsKK3R5cGVkZWYgc3RydWN0IEN1cnZhdHVyZUFuYWx5c2lzUmVwb3J0X3N0cnVjdCBDdXJ2YXR1cmVBbmFseXNpc1JlcG9ydDsKK3R5cGVkZWYgc3RydWN0IERpc3Bhcml0eV9zdHJ1Y3QgRGlzcGFyaXR5OwordHlwZWRlZiBzdHJ1Y3QgQ29tcHV0ZURpc3RhbmNlc1JlcG9ydF9zdHJ1Y3QgQ29tcHV0ZURpc3RhbmNlc1JlcG9ydDsKK3R5cGVkZWYgc3RydWN0IE1hdGNoTW9kZV9zdHJ1Y3QgTWF0Y2hNb2RlOwordHlwZWRlZiBzdHJ1Y3QgQ2xhc3NpZmllZERpc3Bhcml0eV9zdHJ1Y3QgQ2xhc3NpZmllZERpc3Bhcml0eTsKK3R5cGVkZWYgc3RydWN0IENsYXNzaWZ5RGlzdGFuY2VzUmVwb3J0X3N0cnVjdCBDbGFzc2lmeURpc3RhbmNlc1JlcG9ydDsKK3R5cGVkZWYgc3RydWN0IENvbnRvdXJDb21wdXRlQ3VydmF0dXJlUmVwb3J0X3N0cnVjdCBDb250b3VyQ29tcHV0ZUN1cnZhdHVyZVJlcG9ydDsKK3R5cGVkZWYgc3RydWN0IENvbnRvdXJPdmVybGF5U2V0dGluZ3Nfc3RydWN0IENvbnRvdXJPdmVybGF5U2V0dGluZ3M7Cit0eXBlZGVmIHN0cnVjdCBDdXJ2ZVBhcmFtZXRlcnNfc3RydWN0IEN1cnZlUGFyYW1ldGVyczsKK3R5cGVkZWYgc3RydWN0IEV4dHJhY3RDb250b3VyUmVwb3J0X3N0cnVjdCBFeHRyYWN0Q29udG91clJlcG9ydDsKK3R5cGVkZWYgc3RydWN0IENvbm5lY3Rpb25Db25zdHJhaW50X3N0cnVjdCBDb25uZWN0aW9uQ29uc3RyYWludDsKK3R5cGVkZWYgc3RydWN0IEV4dHJhY3RUZXh0dXJlRmVhdHVyZXNSZXBvcnRfc3RydWN0IEV4dHJhY3RUZXh0dXJlRmVhdHVyZXNSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBXYXZlbGV0QmFuZHNSZXBvcnRfc3RydWN0IFdhdmVsZXRCYW5kc1JlcG9ydDsKK3R5cGVkZWYgc3RydWN0IENpcmNsZUZpdE9wdGlvbnNfc3RydWN0IENpcmNsZUZpdE9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBFZGdlT3B0aW9uczJfc3RydWN0IEVkZ2VPcHRpb25zMjsKK3R5cGVkZWYgc3RydWN0IEZpbmRDaXJjdWxhckVkZ2VPcHRpb25zX3N0cnVjdCBGaW5kQ2lyY3VsYXJFZGdlT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IEZpbmRDb25jZW50cmljRWRnZU9wdGlvbnNfc3RydWN0IEZpbmRDb25jZW50cmljRWRnZU9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBDb25jZW50cmljRWRnZUZpdE9wdGlvbnNfc3RydWN0IENvbmNlbnRyaWNFZGdlRml0T3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IEZpbmRDb25jZW50cmljRWRnZVJlcG9ydF9zdHJ1Y3QgRmluZENvbmNlbnRyaWNFZGdlUmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgRmluZENpcmN1bGFyRWRnZVJlcG9ydF9zdHJ1Y3QgRmluZENpcmN1bGFyRWRnZVJlcG9ydDsKK3R5cGVkZWYgc3RydWN0IFdpbmRvd1NpemVfc3RydWN0IFdpbmRvd1NpemU7Cit0eXBlZGVmIHN0cnVjdCBEaXNwbGFjZW1lbnRWZWN0b3Jfc3RydWN0IERpc3BsYWNlbWVudFZlY3RvcjsKK3R5cGVkZWYgc3RydWN0IFdhdmVsZXRPcHRpb25zX3N0cnVjdCBXYXZlbGV0T3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IENvb2NjdXJyZW5jZU9wdGlvbnNfc3RydWN0IENvb2NjdXJyZW5jZU9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBQYXJ0aWNsZUNsYXNzaWZpZXJMb2NhbFRocmVzaG9sZE9wdGlvbnNfc3RydWN0IFBhcnRpY2xlQ2xhc3NpZmllckxvY2FsVGhyZXNob2xkT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IFJhbmdlRmxvYXRfc3RydWN0IFJhbmdlRmxvYXQ7Cit0eXBlZGVmIHN0cnVjdCBQYXJ0aWNsZUNsYXNzaWZpZXJBdXRvVGhyZXNob2xkT3B0aW9uc19zdHJ1Y3QgUGFydGljbGVDbGFzc2lmaWVyQXV0b1RocmVzaG9sZE9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBQYXJ0aWNsZUNsYXNzaWZpZXJQcmVwcm9jZXNzaW5nT3B0aW9uczJfc3RydWN0IFBhcnRpY2xlQ2xhc3NpZmllclByZXByb2Nlc3NpbmdPcHRpb25zMjsKK3R5cGVkZWYgc3RydWN0IE1lYXN1cmVQYXJ0aWNsZXNSZXBvcnRfc3RydWN0IE1lYXN1cmVQYXJ0aWNsZXNSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBHZW9tZXRyaWNQYXR0ZXJuTWF0Y2gzX3N0cnVjdCBHZW9tZXRyaWNQYXR0ZXJuTWF0Y2gzOwordHlwZWRlZiBzdHJ1Y3QgTWF0Y2hHZW9tZXRyaWNQYXR0ZXJuQWR2YW5jZWRPcHRpb25zM19zdHJ1Y3QgTWF0Y2hHZW9tZXRyaWNQYXR0ZXJuQWR2YW5jZWRPcHRpb25zMzsKK3R5cGVkZWYgc3RydWN0IENvbG9yT3B0aW9uc19zdHJ1Y3QgQ29sb3JPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgU2FtcGxlU2NvcmVfc3RydWN0IFNhbXBsZVNjb3JlOwordHlwZWRlZiBzdHJ1Y3QgQ2xhc3NpZmllclJlcG9ydEFkdmFuY2VkX3N0cnVjdCBDbGFzc2lmaWVyUmVwb3J0QWR2YW5jZWQ7Cit0eXBlZGVmIHN0cnVjdCBMZWFybkdlb21ldHJpY1BhdHRlcm5BZHZhbmNlZE9wdGlvbnMyX3N0cnVjdCBMZWFybkdlb21ldHJpY1BhdHRlcm5BZHZhbmNlZE9wdGlvbnMyOwordHlwZWRlZiBzdHJ1Y3QgUGFydGljbGVGaWx0ZXJPcHRpb25zMl9zdHJ1Y3QgUGFydGljbGVGaWx0ZXJPcHRpb25zMjsKK3R5cGVkZWYgc3RydWN0IEZpbmRFZGdlT3B0aW9uczJfc3RydWN0IEZpbmRFZGdlT3B0aW9uczI7Cit0eXBlZGVmIHN0cnVjdCBGaW5kRWRnZVJlcG9ydF9zdHJ1Y3QgRmluZEVkZ2VSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBGaW5kVHJhbnNmb3JtUmVjdE9wdGlvbnMyX3N0cnVjdCBGaW5kVHJhbnNmb3JtUmVjdE9wdGlvbnMyOwordHlwZWRlZiBzdHJ1Y3QgRmluZFRyYW5zZm9ybVJlY3RzT3B0aW9uczJfc3RydWN0IEZpbmRUcmFuc2Zvcm1SZWN0c09wdGlvbnMyOwordHlwZWRlZiBzdHJ1Y3QgUmVhZFRleHRSZXBvcnQzX3N0cnVjdCBSZWFkVGV4dFJlcG9ydDM7Cit0eXBlZGVmIHN0cnVjdCBDaGFyYWN0ZXJTdGF0aXN0aWNzX3N0cnVjdCBDaGFyYWN0ZXJTdGF0aXN0aWNzOwordHlwZWRlZiBzdHJ1Y3QgQ2hhclJlcG9ydDNfc3RydWN0IENoYXJSZXBvcnQzOwordHlwZWRlZiBzdHJ1Y3QgQXJjSW5mbzJfc3RydWN0IEFyY0luZm8yOwordHlwZWRlZiBzdHJ1Y3QgRWRnZVJlcG9ydDJfc3RydWN0IEVkZ2VSZXBvcnQyOwordHlwZWRlZiBzdHJ1Y3QgU2VhcmNoQXJjSW5mb19zdHJ1Y3QgU2VhcmNoQXJjSW5mbzsKK3R5cGVkZWYgc3RydWN0IENvbmNlbnRyaWNSYWtlUmVwb3J0Ml9zdHJ1Y3QgQ29uY2VudHJpY1Jha2VSZXBvcnQyOwordHlwZWRlZiBzdHJ1Y3QgU3Bva2VSZXBvcnQyX3N0cnVjdCBTcG9rZVJlcG9ydDI7Cit0eXBlZGVmIHN0cnVjdCBFZGdlSW5mb19zdHJ1Y3QgRWRnZUluZm87Cit0eXBlZGVmIHN0cnVjdCBTZWFyY2hMaW5lSW5mb19zdHJ1Y3QgU2VhcmNoTGluZUluZm87Cit0eXBlZGVmIHN0cnVjdCBSYWtlUmVwb3J0Ml9zdHJ1Y3QgUmFrZVJlcG9ydDI7Cit0eXBlZGVmIHN0cnVjdCBUcmFuc2Zvcm1CZWhhdmlvcnNfc3RydWN0IFRyYW5zZm9ybUJlaGF2aW9yczsKK3R5cGVkZWYgc3RydWN0IFFSQ29kZURhdGFUb2tlbl9zdHJ1Y3QgUVJDb2RlRGF0YVRva2VuOwordHlwZWRlZiBzdHJ1Y3QgUGFydGljbGVGaWx0ZXJPcHRpb25zX3N0cnVjdCBQYXJ0aWNsZUZpbHRlck9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBTdHJhaWdodEVkZ2VSZXBvcnQyX3N0cnVjdCBTdHJhaWdodEVkZ2VSZXBvcnQyOwordHlwZWRlZiBzdHJ1Y3QgU3RyYWlnaHRFZGdlT3B0aW9uc19zdHJ1Y3QgU3RyYWlnaHRFZGdlT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IFN0cmFpZ2h0RWRnZV9zdHJ1Y3QgU3RyYWlnaHRFZGdlOwordHlwZWRlZiBzdHJ1Y3QgUVJDb2RlU2VhcmNoT3B0aW9uc19zdHJ1Y3QgUVJDb2RlU2VhcmNoT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IFFSQ29kZVNpemVPcHRpb25zX3N0cnVjdCBRUkNvZGVTaXplT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IFFSQ29kZURlc2NyaXB0aW9uT3B0aW9uc19zdHJ1Y3QgUVJDb2RlRGVzY3JpcHRpb25PcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgUVJDb2RlUmVwb3J0X3N0cnVjdCBRUkNvZGVSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBBSU1HcmFkZVJlcG9ydF9zdHJ1Y3QgQUlNR3JhZGVSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBEYXRhTWF0cml4U2l6ZU9wdGlvbnNfc3RydWN0IERhdGFNYXRyaXhTaXplT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IERhdGFNYXRyaXhEZXNjcmlwdGlvbk9wdGlvbnNfc3RydWN0IERhdGFNYXRyaXhEZXNjcmlwdGlvbk9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBEYXRhTWF0cml4U2VhcmNoT3B0aW9uc19zdHJ1Y3QgRGF0YU1hdHJpeFNlYXJjaE9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBEYXRhTWF0cml4UmVwb3J0X3N0cnVjdCBEYXRhTWF0cml4UmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgSlBFRzIwMDBGaWxlQWR2YW5jZWRPcHRpb25zX3N0cnVjdCBKUEVHMjAwMEZpbGVBZHZhbmNlZE9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBNYXRjaEdlb21ldHJpY1BhdHRlcm5BZHZhbmNlZE9wdGlvbnMyX3N0cnVjdCBNYXRjaEdlb21ldHJpY1BhdHRlcm5BZHZhbmNlZE9wdGlvbnMyOwordHlwZWRlZiBzdHJ1Y3QgSW5zcGVjdGlvbkFsaWdubWVudF9zdHJ1Y3QgSW5zcGVjdGlvbkFsaWdubWVudDsKK3R5cGVkZWYgc3RydWN0IEluc3BlY3Rpb25PcHRpb25zX3N0cnVjdCBJbnNwZWN0aW9uT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IENoYXJSZXBvcnQyX3N0cnVjdCBDaGFyUmVwb3J0MjsKK3R5cGVkZWYgc3RydWN0IENoYXJJbmZvMl9zdHJ1Y3QgQ2hhckluZm8yOwordHlwZWRlZiBzdHJ1Y3QgUmVhZFRleHRSZXBvcnQyX3N0cnVjdCBSZWFkVGV4dFJlcG9ydDI7Cit0eXBlZGVmIHN0cnVjdCBFbGxpcHNlRmVhdHVyZV9zdHJ1Y3QgRWxsaXBzZUZlYXR1cmU7Cit0eXBlZGVmIHN0cnVjdCBDaXJjbGVGZWF0dXJlX3N0cnVjdCBDaXJjbGVGZWF0dXJlOwordHlwZWRlZiBzdHJ1Y3QgQ29uc3RDdXJ2ZUZlYXR1cmVfc3RydWN0IENvbnN0Q3VydmVGZWF0dXJlOwordHlwZWRlZiBzdHJ1Y3QgUmVjdGFuZ2xlRmVhdHVyZV9zdHJ1Y3QgUmVjdGFuZ2xlRmVhdHVyZTsKK3R5cGVkZWYgc3RydWN0IExlZ0ZlYXR1cmVfc3RydWN0IExlZ0ZlYXR1cmU7Cit0eXBlZGVmIHN0cnVjdCBDb3JuZXJGZWF0dXJlX3N0cnVjdCBDb3JuZXJGZWF0dXJlOwordHlwZWRlZiBzdHJ1Y3QgTGluZUZlYXR1cmVfc3RydWN0IExpbmVGZWF0dXJlOwordHlwZWRlZiBzdHJ1Y3QgUGFyYWxsZWxMaW5lUGFpckZlYXR1cmVfc3RydWN0IFBhcmFsbGVsTGluZVBhaXJGZWF0dXJlOwordHlwZWRlZiBzdHJ1Y3QgUGFpck9mUGFyYWxsZWxMaW5lUGFpcnNGZWF0dXJlX3N0cnVjdCBQYWlyT2ZQYXJhbGxlbExpbmVQYWlyc0ZlYXR1cmU7Cit0eXBlZGVmIHVuaW9uIEdlb21ldHJpY0ZlYXR1cmVfdW5pb24gR2VvbWV0cmljRmVhdHVyZTsKK3R5cGVkZWYgc3RydWN0IEZlYXR1cmVEYXRhX3N0cnVjdCBGZWF0dXJlRGF0YTsKK3R5cGVkZWYgc3RydWN0IEdlb21ldHJpY1BhdHRlcm5NYXRjaDJfc3RydWN0IEdlb21ldHJpY1BhdHRlcm5NYXRjaDI7Cit0eXBlZGVmIHN0cnVjdCBDbG9zZWRDdXJ2ZUZlYXR1cmVfc3RydWN0IENsb3NlZEN1cnZlRmVhdHVyZTsKK3R5cGVkZWYgc3RydWN0IExpbmVNYXRjaF9zdHJ1Y3QgTGluZU1hdGNoOwordHlwZWRlZiBzdHJ1Y3QgTGluZURlc2NyaXB0b3Jfc3RydWN0IExpbmVEZXNjcmlwdG9yOwordHlwZWRlZiBzdHJ1Y3QgUmVjdGFuZ2xlRGVzY3JpcHRvcl9zdHJ1Y3QgUmVjdGFuZ2xlRGVzY3JpcHRvcjsKK3R5cGVkZWYgc3RydWN0IFJlY3RhbmdsZU1hdGNoX3N0cnVjdCBSZWN0YW5nbGVNYXRjaDsKK3R5cGVkZWYgc3RydWN0IEVsbGlwc2VEZXNjcmlwdG9yX3N0cnVjdCBFbGxpcHNlRGVzY3JpcHRvcjsKK3R5cGVkZWYgc3RydWN0IEVsbGlwc2VNYXRjaF9zdHJ1Y3QgRWxsaXBzZU1hdGNoOwordHlwZWRlZiBzdHJ1Y3QgQ2lyY2xlTWF0Y2hfc3RydWN0IENpcmNsZU1hdGNoOwordHlwZWRlZiBzdHJ1Y3QgQ2lyY2xlRGVzY3JpcHRvcl9zdHJ1Y3QgQ2lyY2xlRGVzY3JpcHRvcjsKK3R5cGVkZWYgc3RydWN0IFNoYXBlRGV0ZWN0aW9uT3B0aW9uc19zdHJ1Y3QgU2hhcGVEZXRlY3Rpb25PcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgQ3VydmVfc3RydWN0IEN1cnZlOwordHlwZWRlZiBzdHJ1Y3QgQ3VydmVPcHRpb25zX3N0cnVjdCBDdXJ2ZU9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBCYXJjb2RlMkRJbmZvX3N0cnVjdCBCYXJjb2RlMkRJbmZvOwordHlwZWRlZiBzdHJ1Y3QgRGF0YU1hdHJpeE9wdGlvbnNfc3RydWN0IERhdGFNYXRyaXhPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgQ2xhc3NpZmllckFjY3VyYWN5UmVwb3J0X3N0cnVjdCBDbGFzc2lmaWVyQWNjdXJhY3lSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBOZWFyZXN0TmVpZ2hib3JDbGFzc1Jlc3VsdF9zdHJ1Y3QgTmVhcmVzdE5laWdoYm9yQ2xhc3NSZXN1bHQ7Cit0eXBlZGVmIHN0cnVjdCBOZWFyZXN0TmVpZ2hib3JUcmFpbmluZ1JlcG9ydF9zdHJ1Y3QgTmVhcmVzdE5laWdoYm9yVHJhaW5pbmdSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBQYXJ0aWNsZUNsYXNzaWZpZXJQcmVwcm9jZXNzaW5nT3B0aW9uc19zdHJ1Y3QgUGFydGljbGVDbGFzc2lmaWVyUHJlcHJvY2Vzc2luZ09wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBDbGFzc2lmaWVyU2FtcGxlSW5mb19zdHJ1Y3QgQ2xhc3NpZmllclNhbXBsZUluZm87Cit0eXBlZGVmIHN0cnVjdCBDbGFzc1Njb3JlX3N0cnVjdCBDbGFzc1Njb3JlOwordHlwZWRlZiBzdHJ1Y3QgQ2xhc3NpZmllclJlcG9ydF9zdHJ1Y3QgQ2xhc3NpZmllclJlcG9ydDsKK3R5cGVkZWYgc3RydWN0IE5lYXJlc3ROZWlnaGJvck9wdGlvbnNfc3RydWN0IE5lYXJlc3ROZWlnaGJvck9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBQYXJ0aWNsZUNsYXNzaWZpZXJPcHRpb25zX3N0cnVjdCBQYXJ0aWNsZUNsYXNzaWZpZXJPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgUkdCVTY0VmFsdWVfc3RydWN0IFJHQlU2NFZhbHVlOwordHlwZWRlZiBzdHJ1Y3QgR2VvbWV0cmljUGF0dGVybk1hdGNoX3N0cnVjdCBHZW9tZXRyaWNQYXR0ZXJuTWF0Y2g7Cit0eXBlZGVmIHN0cnVjdCBNYXRjaEdlb21ldHJpY1BhdHRlcm5BZHZhbmNlZE9wdGlvbnNfc3RydWN0IE1hdGNoR2VvbWV0cmljUGF0dGVybkFkdmFuY2VkT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IE1hdGNoR2VvbWV0cmljUGF0dGVybk9wdGlvbnNfc3RydWN0IE1hdGNoR2VvbWV0cmljUGF0dGVybk9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBMZWFybkdlb21ldHJpY1BhdHRlcm5BZHZhbmNlZE9wdGlvbnNfc3RydWN0IExlYXJuR2VvbWV0cmljUGF0dGVybkFkdmFuY2VkT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IEZpdEVsbGlwc2VPcHRpb25zX3N0cnVjdCBGaXRFbGxpcHNlT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IEZpdENpcmNsZU9wdGlvbnNfc3RydWN0IEZpdENpcmNsZU9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBDb25zdHJ1Y3RST0lPcHRpb25zMl9zdHJ1Y3QgQ29uc3RydWN0Uk9JT3B0aW9uczI7Cit0eXBlZGVmIHN0cnVjdCBIU0xWYWx1ZV9zdHJ1Y3QgSFNMVmFsdWU7Cit0eXBlZGVmIHN0cnVjdCBIU1ZWYWx1ZV9zdHJ1Y3QgSFNWVmFsdWU7Cit0eXBlZGVmIHN0cnVjdCBIU0lWYWx1ZV9zdHJ1Y3QgSFNJVmFsdWU7Cit0eXBlZGVmIHN0cnVjdCBDSUVMYWJWYWx1ZV9zdHJ1Y3QgQ0lFTGFiVmFsdWU7Cit0eXBlZGVmIHN0cnVjdCBDSUVYWVpWYWx1ZV9zdHJ1Y3QgQ0lFWFlaVmFsdWU7Cit0eXBlZGVmIHVuaW9uIENvbG9yMl91bmlvbiBDb2xvcjI7Cit0eXBlZGVmIHN0cnVjdCBCZXN0RWxsaXBzZTJfc3RydWN0IEJlc3RFbGxpcHNlMjsKK3R5cGVkZWYgc3RydWN0IExlYXJuUGF0dGVybkFkdmFuY2VkT3B0aW9uc19zdHJ1Y3QgTGVhcm5QYXR0ZXJuQWR2YW5jZWRPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgQVZJSW5mb19zdHJ1Y3QgQVZJSW5mbzsKK3R5cGVkZWYgc3RydWN0IExlYXJuUGF0dGVybkFkdmFuY2VkU2hpZnRPcHRpb25zX3N0cnVjdCBMZWFyblBhdHRlcm5BZHZhbmNlZFNoaWZ0T3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IExlYXJuUGF0dGVybkFkdmFuY2VkUm90YXRpb25PcHRpb25zX3N0cnVjdCBMZWFyblBhdHRlcm5BZHZhbmNlZFJvdGF0aW9uT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IE1hdGNoUGF0dGVybkFkdmFuY2VkT3B0aW9uc19zdHJ1Y3QgTWF0Y2hQYXR0ZXJuQWR2YW5jZWRPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgUGFydGljbGVGaWx0ZXJDcml0ZXJpYTJfc3RydWN0IFBhcnRpY2xlRmlsdGVyQ3JpdGVyaWEyOwordHlwZWRlZiBzdHJ1Y3QgQmVzdENpcmNsZTJfc3RydWN0IEJlc3RDaXJjbGUyOwordHlwZWRlZiBzdHJ1Y3QgT0NSU3BhY2luZ09wdGlvbnNfc3RydWN0IE9DUlNwYWNpbmdPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgT0NSUHJvY2Vzc2luZ09wdGlvbnNfc3RydWN0IE9DUlByb2Nlc3NpbmdPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgUmVhZFRleHRPcHRpb25zX3N0cnVjdCBSZWFkVGV4dE9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBDaGFySW5mb19zdHJ1Y3QgQ2hhckluZm87CisjaWYgIWRlZmluZWQoVVNFUklOVF9IRUFERVIpICYmICFkZWZpbmVkKF9DVklfUkVDVF9ERUZJTkVEKQordHlwZWRlZiBzdHJ1Y3QgUmVjdF9zdHJ1Y3QgUmVjdDsKKyNlbmRpZgordHlwZWRlZiBzdHJ1Y3QgQ2hhclJlcG9ydF9zdHJ1Y3QgQ2hhclJlcG9ydDsKK3R5cGVkZWYgc3RydWN0IFJlYWRUZXh0UmVwb3J0X3N0cnVjdCBSZWFkVGV4dFJlcG9ydDsKKyNpZiAhZGVmaW5lZChVU0VSSU5UX0hFQURFUikgJiYgIWRlZmluZWQoX0NWSV9QT0lOVF9ERUZJTkVEKQordHlwZWRlZiBzdHJ1Y3QgUG9pbnRfc3RydWN0IFBvaW50OworI2VuZGlmCit0eXBlZGVmIHN0cnVjdCBBbm51bHVzX3N0cnVjdCBBbm51bHVzOwordHlwZWRlZiBzdHJ1Y3QgRWRnZUxvY2F0aW9uUmVwb3J0X3N0cnVjdCBFZGdlTG9jYXRpb25SZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBFZGdlT3B0aW9uc19zdHJ1Y3QgRWRnZU9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBFZGdlUmVwb3J0X3N0cnVjdCBFZGdlUmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgRXh0cmVtZVJlcG9ydF9zdHJ1Y3QgRXh0cmVtZVJlcG9ydDsKK3R5cGVkZWYgc3RydWN0IEZpdExpbmVPcHRpb25zX3N0cnVjdCBGaXRMaW5lT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IERpc3BsYXlNYXBwaW5nX3N0cnVjdCBEaXNwbGF5TWFwcGluZzsKK3R5cGVkZWYgc3RydWN0IERldGVjdEV4dHJlbWVzT3B0aW9uc19zdHJ1Y3QgRGV0ZWN0RXh0cmVtZXNPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgSW1hZ2VJbmZvX3N0cnVjdCBJbWFnZUluZm87Cit0eXBlZGVmIHN0cnVjdCBMQ0RPcHRpb25zX3N0cnVjdCBMQ0RPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgTENEUmVwb3J0X3N0cnVjdCBMQ0RSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBMQ0RTZWdtZW50c19zdHJ1Y3QgTENEU2VnbWVudHM7Cit0eXBlZGVmIHN0cnVjdCBMZWFybkNhbGlicmF0aW9uT3B0aW9uc19zdHJ1Y3QgTGVhcm5DYWxpYnJhdGlvbk9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBMZWFybkNvbG9yUGF0dGVybk9wdGlvbnNfc3RydWN0IExlYXJuQ29sb3JQYXR0ZXJuT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IExpbmVfc3RydWN0IExpbmU7Cit0eXBlZGVmIHN0cnVjdCBMaW5lYXJBdmVyYWdlc19zdHJ1Y3QgTGluZWFyQXZlcmFnZXM7Cit0eXBlZGVmIHN0cnVjdCBMaW5lUHJvZmlsZV9zdHJ1Y3QgTGluZVByb2ZpbGU7Cit0eXBlZGVmIHN0cnVjdCBNYXRjaENvbG9yUGF0dGVybk9wdGlvbnNfc3RydWN0IE1hdGNoQ29sb3JQYXR0ZXJuT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IEhpc3RvZ3JhbVJlcG9ydF9zdHJ1Y3QgSGlzdG9ncmFtUmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgQXJjSW5mb19zdHJ1Y3QgQXJjSW5mbzsKK3R5cGVkZWYgc3RydWN0IEF4aXNSZXBvcnRfc3RydWN0IEF4aXNSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBCYXJjb2RlSW5mb19zdHJ1Y3QgQmFyY29kZUluZm87Cit0eXBlZGVmIHN0cnVjdCBCQ0dPcHRpb25zX3N0cnVjdCBCQ0dPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgQmVzdENpcmNsZV9zdHJ1Y3QgQmVzdENpcmNsZTsKK3R5cGVkZWYgc3RydWN0IEJlc3RFbGxpcHNlX3N0cnVjdCBCZXN0RWxsaXBzZTsKK3R5cGVkZWYgc3RydWN0IEJlc3RMaW5lX3N0cnVjdCBCZXN0TGluZTsKK3R5cGVkZWYgc3RydWN0IEJyb3dzZXJPcHRpb25zX3N0cnVjdCBCcm93c2VyT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IENvb3JkaW5hdGVTeXN0ZW1fc3RydWN0IENvb3JkaW5hdGVTeXN0ZW07Cit0eXBlZGVmIHN0cnVjdCBDYWxpYnJhdGlvbkluZm9fc3RydWN0IENhbGlicmF0aW9uSW5mbzsKK3R5cGVkZWYgc3RydWN0IENhbGlicmF0aW9uUG9pbnRzX3N0cnVjdCBDYWxpYnJhdGlvblBvaW50czsKK3R5cGVkZWYgc3RydWN0IENhbGlwZXJPcHRpb25zX3N0cnVjdCBDYWxpcGVyT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IENhbGlwZXJSZXBvcnRfc3RydWN0IENhbGlwZXJSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBEcmF3VGV4dE9wdGlvbnNfc3RydWN0IERyYXdUZXh0T3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IENpcmNsZVJlcG9ydF9zdHJ1Y3QgQ2lyY2xlUmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgQ2xvc2VkQ29udG91cl9zdHJ1Y3QgQ2xvc2VkQ29udG91cjsKK3R5cGVkZWYgc3RydWN0IENvbG9ySGlzdG9ncmFtUmVwb3J0X3N0cnVjdCBDb2xvckhpc3RvZ3JhbVJlcG9ydDsKK3R5cGVkZWYgc3RydWN0IENvbG9ySW5mb3JtYXRpb25fc3RydWN0IENvbG9ySW5mb3JtYXRpb247Cit0eXBlZGVmIHN0cnVjdCBDb21wbGV4X3N0cnVjdCBDb21wbGV4OwordHlwZWRlZiBzdHJ1Y3QgQ29uY2VudHJpY1Jha2VSZXBvcnRfc3RydWN0IENvbmNlbnRyaWNSYWtlUmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgQ29uc3RydWN0Uk9JT3B0aW9uc19zdHJ1Y3QgQ29uc3RydWN0Uk9JT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IENvbnRvdXJJbmZvX3N0cnVjdCBDb250b3VySW5mbzsKK3R5cGVkZWYgdW5pb24gQ29udG91clVuaW9uX3VuaW9uIENvbnRvdXJVbmlvbjsKK3R5cGVkZWYgc3RydWN0IENvbnRvdXJJbmZvMl9zdHJ1Y3QgQ29udG91ckluZm8yOwordHlwZWRlZiBzdHJ1Y3QgQ29udG91clBvaW50X3N0cnVjdCBDb250b3VyUG9pbnQ7Cit0eXBlZGVmIHN0cnVjdCBDb29yZGluYXRlVHJhbnNmb3JtX3N0cnVjdCBDb29yZGluYXRlVHJhbnNmb3JtOwordHlwZWRlZiBzdHJ1Y3QgQ29vcmRpbmF0ZVRyYW5zZm9ybTJfc3RydWN0IENvb3JkaW5hdGVUcmFuc2Zvcm0yOwordHlwZWRlZiBzdHJ1Y3QgQ2FubnlPcHRpb25zX3N0cnVjdCBDYW5ueU9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBSYW5nZV9zdHJ1Y3QgUmFuZ2U7Cit0eXBlZGVmIHN0cnVjdCBVc2VyUG9pbnRTeW1ib2xfc3RydWN0IFVzZXJQb2ludFN5bWJvbDsKK3R5cGVkZWYgc3RydWN0IFZpZXczRE9wdGlvbnNfc3RydWN0IFZpZXczRE9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBNYXRjaFBhdHRlcm5PcHRpb25zX3N0cnVjdCBNYXRjaFBhdHRlcm5PcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgVElGRkZpbGVPcHRpb25zX3N0cnVjdCBUSUZGRmlsZU9wdGlvbnM7Cit0eXBlZGVmIHVuaW9uIENvbG9yX3VuaW9uIENvbG9yOwordHlwZWRlZiB1bmlvbiBQaXhlbFZhbHVlX3VuaW9uIFBpeGVsVmFsdWU7Cit0eXBlZGVmIHN0cnVjdCBPcGVuQ29udG91cl9zdHJ1Y3QgT3BlbkNvbnRvdXI7Cit0eXBlZGVmIHN0cnVjdCBPdmVybGF5VGV4dE9wdGlvbnNfc3RydWN0IE92ZXJsYXlUZXh0T3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IFBhcnRpY2xlRmlsdGVyQ3JpdGVyaWFfc3RydWN0IFBhcnRpY2xlRmlsdGVyQ3JpdGVyaWE7Cit0eXBlZGVmIHN0cnVjdCBQYXJ0aWNsZVJlcG9ydF9zdHJ1Y3QgUGFydGljbGVSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBQYXR0ZXJuTWF0Y2hfc3RydWN0IFBhdHRlcm5NYXRjaDsKK3R5cGVkZWYgc3RydWN0IFF1YW50aWZ5RGF0YV9zdHJ1Y3QgUXVhbnRpZnlEYXRhOwordHlwZWRlZiBzdHJ1Y3QgUXVhbnRpZnlSZXBvcnRfc3RydWN0IFF1YW50aWZ5UmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgUmFrZU9wdGlvbnNfc3RydWN0IFJha2VPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgUmFrZVJlcG9ydF9zdHJ1Y3QgUmFrZVJlcG9ydDsKK3R5cGVkZWYgc3RydWN0IFRyYW5zZm9ybVJlcG9ydF9zdHJ1Y3QgVHJhbnNmb3JtUmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgU2hhcGVSZXBvcnRfc3RydWN0IFNoYXBlUmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgTWV0ZXJBcmNfc3RydWN0IE1ldGVyQXJjOwordHlwZWRlZiBzdHJ1Y3QgVGhyZXNob2xkRGF0YV9zdHJ1Y3QgVGhyZXNob2xkRGF0YTsKK3R5cGVkZWYgc3RydWN0IFN0cnVjdHVyaW5nRWxlbWVudF9zdHJ1Y3QgU3RydWN0dXJpbmdFbGVtZW50OwordHlwZWRlZiBzdHJ1Y3QgU3Bva2VSZXBvcnRfc3RydWN0IFNwb2tlUmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgU2ltcGxlRWRnZU9wdGlvbnNfc3RydWN0IFNpbXBsZUVkZ2VPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgU2VsZWN0UGFydGljbGVDcml0ZXJpYV9zdHJ1Y3QgU2VsZWN0UGFydGljbGVDcml0ZXJpYTsKK3R5cGVkZWYgc3RydWN0IFNlZ21lbnRJbmZvX3N0cnVjdCBTZWdtZW50SW5mbzsKK3R5cGVkZWYgc3RydWN0IFJvdGF0aW9uQW5nbGVSYW5nZV9zdHJ1Y3QgUm90YXRpb25BbmdsZVJhbmdlOwordHlwZWRlZiBzdHJ1Y3QgUm90YXRlZFJlY3Rfc3RydWN0IFJvdGF0ZWRSZWN0OwordHlwZWRlZiBzdHJ1Y3QgUk9JUHJvZmlsZV9zdHJ1Y3QgUk9JUHJvZmlsZTsKK3R5cGVkZWYgc3RydWN0IFRvb2xXaW5kb3dPcHRpb25zX3N0cnVjdCBUb29sV2luZG93T3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IFNwb2tlT3B0aW9uc19zdHJ1Y3QgU3Bva2VPcHRpb25zOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIERhdGEgU3RydWN0dXJlcworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjaWYgIWRlZmluZWQgX19HTlVDX18gJiYgIWRlZmluZWQgX01fWDY0CisjcHJhZ21hIHBhY2socHVzaCwxKQorI2VuZGlmCit0eXBlZGVmIHN0cnVjdCBEaXZpc2lvbk1vZGVsX3N0cnVjdCB7CisgICAgZmxvYXQga2FwcGE7IC8vVGhlIGxlYXJuZWQga2FwcGEgY29lZmZpY2llbnQgb2YgZGl2aXNpb24gbW9kZWwuCit9IERpdmlzaW9uTW9kZWw7CisKK3R5cGVkZWYgc3RydWN0IEZvY2FsTGVuZ3RoX3N0cnVjdCB7CisgICAgZmxvYXQgZng7IC8vRm9jYWwgbGVuZ3RoIGluIFggZGlyZWN0aW9uLgorICAgIGZsb2F0IGZ5OyAvL0ZvY2FsIGxlbmd0aCBpbiBZIGRpcmVjdGlvbi4KK30gRm9jYWxMZW5ndGg7CisKK3R5cGVkZWYgc3RydWN0IFBvbHlNb2RlbF9zdHJ1Y3QgeworICAgIGZsb2F0KiAgICAgICBrQ29lZmZzOyAgICAvL1RoZSBsZWFybmVkIHJhZGlhbCBjb2VmZmljaWVudHMgb2YgcG9seW5vbWlhbCBtb2RlbC4KKyAgICB1bnNpZ25lZCBpbnQgbnVtS0NvZWZmczsgLy9OdW1iZXIgb2YgSyBjb2VmZmljaWVudHMuCisgICAgZmxvYXQgICAgICAgIHAxOyAgICAgICAgIC8vVGhlIFAxKGxlYXJuZWQgdGFuZ2VudGlhbCBjb2VmZmljaWVudHMgb2YgcG9seW5vbWlhbCBtb2RlbCkuCisgICAgZmxvYXQgICAgICAgIHAyOyAgICAgICAgIC8vVGhlIFAyKGxlYXJuZWQgdGFuZ2VudGlhbCBjb2VmZmljaWVudHMgb2YgcG9seW5vbWlhbCBtb2RlbCkuCit9IFBvbHlNb2RlbDsKKwordHlwZWRlZiBzdHJ1Y3QgRGlzdG9ydGlvbk1vZGVsUGFyYW1zX3N0cnVjdCB7CisgICAgRGlzdG9ydGlvbk1vZGVsIGRpc3RvcnRpb25Nb2RlbDsgLy9UeXBlIG9mIGxlYXJuZWQgZGlzdG9ydGlvbiBtb2RlbC4KKyAgICBQb2x5TW9kZWwgICAgICAgcG9seU1vZGVsOyAgICAgICAvL1RoZSBsZWFybmVkIGNvZWZmaWNpZW50cyBvZiBwb2x5bm9taWFsIG1vZGVsLgorICAgIERpdmlzaW9uTW9kZWwgICBkaXZpc2lvbk1vZGVsOyAgIC8vVGhlIGxlYXJuZWQgY29lZmZpY2llbnQgb2YgZGl2aXNpb24gbW9kZWwuCit9IERpc3RvcnRpb25Nb2RlbFBhcmFtczsKKwordHlwZWRlZiBzdHJ1Y3QgUG9pbnRGbG9hdF9zdHJ1Y3QgeworICAgIGZsb2F0IHg7IC8vVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQuCisgICAgZmxvYXQgeTsgLy9UaGUgeS1jb29yZGluYXRlIG9mIHRoZSBwb2ludC4KK30gUG9pbnRGbG9hdDsKKwordHlwZWRlZiBzdHJ1Y3QgSW50ZXJuYWxQYXJhbWV0ZXJzX3N0cnVjdCB7CisgICAgY2hhciAgICAgICAgaXNJbnN1ZmZpY2llbnREYXRhOyAKKyAgICBGb2NhbExlbmd0aCBmb2NhbExlbmd0aDsgICAgICAgIAorICAgIFBvaW50RmxvYXQgIG9wdGljYWxDZW50ZXI7ICAgICAgCit9IEludGVybmFsUGFyYW1ldGVyczsKKwordHlwZWRlZiBzdHJ1Y3QgTWF4R3JpZFNpemVfc3RydWN0IHsKKyAgICB1bnNpZ25lZCBpbnQgeE1heDsgLy9NYXhpbXVtIHggbGltaXQgZm9yIHRoZSBncmlkIHNpemUuCisgICAgdW5zaWduZWQgaW50IHlNYXg7IC8vTWF4aW11bSB5IGxpbWl0IGZvciB0aGUgZ3JpZCBzaXplLgorfSBNYXhHcmlkU2l6ZTsKKwordHlwZWRlZiBzdHJ1Y3QgSW1hZ2VTaXplX3N0cnVjdCB7CisgICAgdW5zaWduZWQgaW50IHhSZXM7IC8vWCByZXNvbHV0aW9uIG9mIHRoZSBpbWFnZS4KKyAgICB1bnNpZ25lZCBpbnQgeVJlczsgLy9ZIHJlc29sdXRpb24gb2YgdGhlIGltYWdlLgorfSBJbWFnZVNpemU7CisKK3R5cGVkZWYgc3RydWN0IENhbGlicmF0aW9uUmVmZXJlbmNlUG9pbnRzX3N0cnVjdCB7CisgICAgUG9pbnREb3VibGUqICAgIHBpeGVsQ29vcmRzOyAgICAvL1NwZWNpZmllcyB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHBpeGVsIHJlZmVyZW5jZSBwb2ludHMuCisgICAgdW5zaWduZWQgaW50ICAgIG51bVBpeGVsQ29vcmRzOyAvL051bWJlciBvZiBwaXhlbCBjb29yZGluYXRlcy4KKyAgICBQb2ludERvdWJsZSogICAgcmVhbENvb3JkczsgICAgIC8vU3BlY2lmaWVzIHRoZSBtZWFzdXJpbmcgdW5pdCBhc3NvY2lhdGVkIHdpdGggdGhlIGltYWdlLgorICAgIHVuc2lnbmVkIGludCAgICBudW1SZWFsQ29vcmRzOyAgLy9OdW1iZXIgb2YgcmVhbCBjb29yZGluYXRlcy4KKyAgICBDYWxpYnJhdGlvblVuaXQgdW5pdHM7ICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSB1bml0cyBvZiBYIFN0ZXAgYW5kIFkgU3RlcC4KKyAgICBJbWFnZVNpemUgICAgICAgaW1hZ2VTaXplOyAgICAgIC8vU3BlY2lmaWVzIHRoZSBzaXplIG9mIGNhbGlicmF0aW9uIHRlbXBsYXRlIGltYWdlLgorfSBDYWxpYnJhdGlvblJlZmVyZW5jZVBvaW50czsKKwordHlwZWRlZiBzdHJ1Y3QgR2V0Q2FtZXJhUGFyYW1ldGVyc1JlcG9ydF9zdHJ1Y3QgeworICAgIGRvdWJsZSogICAgICAgICAgICAgICBwcm9qZWN0aW9uTWF0cml4OyAgICAgLy9UaGUgcHJvamVjdGlvbihob21vZ3JhcGh5KSBtYXRyaXggb2Ygd29ya2luZyBwbGFuZS4KKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgcHJvamVjdGlvbk1hdHJpeFJvd3M7IC8vTnVtYmVyIG9mIHJvd3MgaW4gcHJvamVjdGlvbiBtYXRyaXguCisgICAgdW5zaWduZWQgaW50ICAgICAgICAgIHByb2plY3Rpb25NYXRyaXhDb2xzOyAvL051bWJlciBvZiBjb2x1bW5zIGluIHByb2plY3Rpb24gbWF0cml4LgorICAgIERpc3RvcnRpb25Nb2RlbFBhcmFtcyBkaXN0b3J0aW9uOyAgICAgICAgICAgLy9EaXN0b3J0aW9uIG1vZGVsIENvZWZmaWNpZW50cy4KKyAgICBJbnRlcm5hbFBhcmFtZXRlcnMgICAgaW50ZXJuYWxQYXJhbXM7ICAgICAgIC8vVGhlIGxlYXJuZWQgaW50ZXJuYWwgcGFyYW10ZXJzIG9mIGNhbWVyYSBtb2RlbCBzdWNoIGFzIGZvY2FsIGxlbmd0aCBhbmQgb3B0aWNhbCBjZW50ZXIuCit9IEdldENhbWVyYVBhcmFtZXRlcnNSZXBvcnQ7CisKK3R5cGVkZWYgc3RydWN0IENhbGlicmF0aW9uQXhpc0luZm9fc3RydWN0IHsKKyAgICBQb2ludEZsb2F0ICAgICAgY2VudGVyOyAgICAgICAgLy9UaGUgb3JpZ2luIG9mIHRoZSByZWZlcmVuY2UgY29vcmRpbmF0ZSBzeXN0ZW0sIGV4cHJlc3NlZCBpbiBwaXhlbCB1bml0cy4KKyAgICBmbG9hdCAgICAgICAgICAgcm90YXRpb25BbmdsZTsgLy9UaGUgYW5nbGUgb2YgdGhlIHgtYXhpcyBvZiB0aGUgcmVhbC13b3JsZCBjb29yZGluYXRlIHN5c3RlbSwgaW4gcmVsYXRpb24gdG8gdGhlIGhvcml6b250YWwuCisgICAgQXhpc09yaWVudGF0aW9uIGF4aXNEaXJlY3Rpb247IC8vU3BlY2lmaWVzIHRoZSBkaXJlY3Rpb24gb2YgdGhlIGNhbGlicmFpdG9uIGF4aXMgd2hpY2ggaXMgZWl0aGVyIERpcmVjdCBvciBJbmRpcmVjdC4KK30gQ2FsaWJyYXRpb25BeGlzSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgQ2FsaWJyYXRpb25MZWFyblNldHVwSW5mb19zdHJ1Y3QgeworICAgIENhbGlicmF0aW9uTW9kZTIgY2FsaWJyYXRpb25NZXRob2Q7ICAgIC8vVHlwZSBvZiBjYWxpYnJhdGlvbiBtZXRob2QgdXNlZC4KKyAgICBEaXN0b3J0aW9uTW9kZWwgIGRpc3RvcnRpb25Nb2RlbDsgICAgICAvL1R5cGUgb2YgbGVhcm5lZCBkaXN0b3J0aW9uIG1vZGVsLgorICAgIFNjYWxpbmdNZXRob2QgICAgc2NhbGVNb2RlOyAgICAgICAgICAgIC8vVGhlIGFzcGVjdCBzY2FsaW5nIHRvIHVzZSB3aGVuIGNvcnJlY3RpbmcgYW4gaW1hZ2UuCisgICAgQ2FsaWJyYXRpb25ST0kgICByb2lNb2RlOyAgICAgICAgICAgICAgLy9UaGUgUk9JIHRvIHVzZSB3aGVuIGNvcnJlY3RpbmcgYW4gaW1hZ2UuCisgICAgY2hhciAgICAgICAgICAgICBsZWFybkNvcnJlY3Rpb25UYWJsZTsgLy9TZXQgdGhpcyBpbnB1dCB0byB0cnVlIHZhbHVlIGlmIHlvdSB3YW50IHRoZSBjb3JyZWN0aW9uIHRhYmxlIHRvIGJlIGRldGVybWluZWQgYW5kIHN0b3JlZC4KK30gQ2FsaWJyYXRpb25MZWFyblNldHVwSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgR3JpZERlc2NyaXB0b3Jfc3RydWN0IHsKKyAgICBmbG9hdCAgICAgICAgICAgeFN0ZXA7IC8vVGhlIGRpc3RhbmNlIGluIHRoZSB4IGRpcmVjdGlvbiBiZXR3ZWVuIHR3byBhZGphY2VudCBwaXhlbHMgaW4gdW5pdHMgc3BlY2lmaWVkIGJ5IHVuaXQuCisgICAgZmxvYXQgICAgICAgICAgIHlTdGVwOyAvL1RoZSBkaXN0YW5jZSBpbiB0aGUgeSBkaXJlY3Rpb24gYmV0d2VlbiB0d28gYWRqYWNlbnQgcGl4ZWxzIGluIHVuaXRzIHNwZWNpZmllZCBieSB1bml0LgorICAgIENhbGlicmF0aW9uVW5pdCB1bml0OyAgLy9UaGUgdW5pdCBvZiBtZWFzdXJlIGZvciB0aGUgaW1hZ2UuCit9IEdyaWREZXNjcmlwdG9yOworCit0eXBlZGVmIHN0cnVjdCBFcnJvclN0YXRpc3RpY3Nfc3RydWN0IHsKKyAgICBkb3VibGUgbWVhbjsgICAgICAgICAgICAgIC8vTWVhbiBlcnJvciBzdGF0aXN0aWNzIHZhbHVlLgorICAgIGRvdWJsZSBtYXhpbXVtOyAgICAgICAgICAgLy9NYXhpbXVtIHZhbHVlIG9mIGVycm9yLgorICAgIGRvdWJsZSBzdGFuZGFyZERldmlhdGlvbjsgLy9UaGUgc3RhbmRhcmQgZGV2aWF0aW9uIGVycm9yIHN0YXRpc3Rpc2NzIHZhbHVlLgorICAgIGRvdWJsZSBkaXN0b3J0aW9uOyAgICAgICAgLy9UaGUgZGlzdG9ydGlvbiBlcnJvciBzdGF0aXN0aWNzIHZhbHVlLgorfSBFcnJvclN0YXRpc3RpY3M7CisKK3R5cGVkZWYgc3RydWN0IEdldENhbGlicmF0aW9uSW5mb1JlcG9ydF9zdHJ1Y3QgeworICAgIFJPSSogICAgICAgICAgICAgICAgICAgICAgdXNlclJvaTsgICAgICAgICAvL1NwZWNpZmllcyB0aGUgUk9JIHRoZSB1c2VyIHByb3ZpZGVkIHdoZW4gbGVhcm5pbmcgdGhlIGNhbGlicmF0aW9uLgorICAgIFJPSSogICAgICAgICAgICAgICAgICAgICAgY2FsaWJyYXRpb25Sb2k7ICAvL1NwZWNpZmllcyB0aGUgUk9JIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHJlZ2lvbiBvZiB0aGUgaW1hZ2Ugd2hlcmUgdGhlIGNhbGlicmF0aW9uIGluZm9ybWF0aW9uIGlzIGFjY3VyYXRlLgorICAgIENhbGlicmF0aW9uQXhpc0luZm8gICAgICAgYXhpc0luZm87ICAgICAgICAvL1JlZmVyZW5jZSBDb29yZGluYXRlIFN5c3RlbSBmb3IgdGhlIHJlYWwtd29ybGQgY29vcmRpbmF0ZXMuCisgICAgQ2FsaWJyYXRpb25MZWFyblNldHVwSW5mbyBsZWFyblNldHVwSW5mbzsgIC8vQ2FsaWJyYXRpb24gbGVhcm4gc2V0dXAgaW5mb3JtYXRpb24uCisgICAgR3JpZERlc2NyaXB0b3IgICAgICAgICAgICBncmlkRGVzY3JpcHRvcjsgIC8vU3BlY2lmaWVzIHNjYWxpbmcgY29uc3RhbnRzIHVzZWQgdG8gY2FsaWJyYXRlIHRoZSBpbWFnZS4KKyAgICBmbG9hdCogICAgICAgICAgICAgICAgICAgIGVycm9yTWFwOyAgICAgICAgLy9UaGUgdGhlIGVycm9yIG1hcCBvZiBjYWxpYnJhdGlvbiB0ZW1wbGF0ZSBpbWFnZS4KKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgIGVycm9yTWFwUm93czsgICAgLy9OdW1iZXIgb2Ygcm93cyBpbiBlcnJvciBtYXAuCisgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICBlcnJvck1hcENvbHM7ICAgIC8vTnVtYmVyIG9mIENvbHVtbnMgaW4gZXJyb3IgbWFwLgorICAgIEVycm9yU3RhdGlzdGljcyAgICAgICAgICAgZXJyb3JTdGF0aXN0aWNzOyAvL0Vycm9yIHN0YXRpc3RpY3Mgb2YgdGhlIGNhbGlicmF0aW9uLgorfSBHZXRDYWxpYnJhdGlvbkluZm9SZXBvcnQ7CisKK3R5cGVkZWYgc3RydWN0IEVkZ2VQb2xhcml0eV9zdHJ1Y3QgeworICAgIEVkZ2VQb2xhcml0eVNlYXJjaE1vZGUgc3RhcnQ7IAorICAgIEVkZ2VQb2xhcml0eVNlYXJjaE1vZGUgZW5kOyAgIAorfSBFZGdlUG9sYXJpdHk7CisKK3R5cGVkZWYgc3RydWN0IENsYW1wU2V0dGluZ3Nfc3RydWN0IHsKKyAgICBkb3VibGUgICAgICAgYW5nbGVSYW5nZTsgICAvL1NwZWNpZmllcyB0aGUgYW5nbGUgcmFuZ2UuCisgICAgRWRnZVBvbGFyaXR5IGVkZ2VQb2xhcml0eTsgLy9TcGVjaWZpZXMgdGhlIGVkZ2UgcG9sYXJpdHkuCit9IENsYW1wU2V0dGluZ3M7CisKK3R5cGVkZWYgc3RydWN0IFBvaW50RG91YmxlX3N0cnVjdCB7CisgICAgZG91YmxlIHg7IC8vVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQuCisgICAgZG91YmxlIHk7IC8vVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQuCit9IFBvaW50RG91YmxlOworCit0eXBlZGVmIHN0cnVjdCBQb2ludERvdWJsZVBhaXJfc3RydWN0IHsKKyAgICBQb2ludERvdWJsZSBzdGFydDsgLy9UaGUgU3RhcnQgY28tb3JkaW5hdGUgb2YgdGhlIHBhaXIuCisgICAgUG9pbnREb3VibGUgZW5kOyAgIC8vVGhlIEVuZCBjby1vcmRpbmF0ZSBvZiB0aGUgcGFpci4KK30gUG9pbnREb3VibGVQYWlyOworCit0eXBlZGVmIHN0cnVjdCBDbGFtcFJlc3VsdHNfc3RydWN0IHsKKyAgICBkb3VibGUgZGlzdGFuY2VQaXg7ICAgICAgIC8vRGVmaW5lcyB0aGUgUGl4ZWwgd29ybGQgZGlzdGFuY2UuCisgICAgZG91YmxlIGRpc3RhbmNlUmVhbFdvcmxkOyAvL0RlZmluZXMgdGhlIHJlYWwgd29ybGQgZGlzdGFuY2UuCisgICAgZG91YmxlIGFuZ2xlQWJzOyAgICAgICAgICAvL0RlZmluZXMgdGhlIGFic29sdXRlIGFuZ2xlLgorICAgIGRvdWJsZSBhbmdsZVJlbGF0aXZlOyAgICAgLy9EZWZpbmVzIHRoZSByZWxhdGl2ZSBhbmdsZS4KK30gQ2xhbXBSZXN1bHRzOworCit0eXBlZGVmIHN0cnVjdCBDbGFtcFBvaW50c19zdHJ1Y3QgeworICAgIFBvaW50RG91YmxlUGFpciBwaXhlbDsgICAgIC8vU3BlY2lmaWVzIHRoZSBwaXhlbCB3b3JsZCBwb2ludCBwYWlyIGZvciBjbGFtcC4KKyAgICBQb2ludERvdWJsZVBhaXIgcmVhbFdvcmxkOyAvL1NwZWNpZmllcyB0aGUgcmVhbCB3b3JsZCBwb2ludCBwYWlyIGZvciBjbGFtcC4KK30gQ2xhbXBQb2ludHM7CisKK3R5cGVkZWYgc3RydWN0IFJHQlZhbHVlX3N0cnVjdCB7CisgICAgdW5zaWduZWQgY2hhciBCOyAgICAgLy9UaGUgYmx1ZSB2YWx1ZSBvZiB0aGUgY29sb3IuCisgICAgdW5zaWduZWQgY2hhciBHOyAgICAgLy9UaGUgZ3JlZW4gdmFsdWUgb2YgdGhlIGNvbG9yLgorICAgIHVuc2lnbmVkIGNoYXIgUjsgICAgIC8vVGhlIHJlZCB2YWx1ZSBvZiB0aGUgY29sb3IuCisgICAgdW5zaWduZWQgY2hhciBhbHBoYTsgLy9UaGUgYWxwaGEgdmFsdWUgb2YgdGhlIGNvbG9yLCB3aGljaCByZXByZXNlbnRzIGV4dHJhIGluZm9ybWF0aW9uIGFib3V0IGEgY29sb3IgaW1hZ2UsIHN1Y2ggYXMgZ2FtbWEgY29ycmVjdGlvbi4KK30gUkdCVmFsdWU7CisKK3R5cGVkZWYgc3RydWN0IENsYW1wT3ZlcmxheVNldHRpbmdzX3N0cnVjdCB7CisgICAgaW50ICAgICAgc2hvd1NlYXJjaEFyZWE7ICAgICAgLy9JZiBUUlVFLCB0aGUgZnVuY3Rpb24gb3ZlcmxheXMgdGhlIHNlYXJjaCBhcmVhIG9uIHRoZSBpbWFnZS4KKyAgICBpbnQgICAgICBzaG93Q3VydmVzOyAgICAgICAgICAvL0lmIFRSVUUsIHRoZSBmdW5jdGlvbiBvdmVybGF5cyB0aGUgY3VydmVzIG9uIHRoZSBpbWFnZS4KKyAgICBpbnQgICAgICBzaG93Q2xhbXBMb2NhdGlvbjsgICAvL0lmIFRSVUUsIHRoZSBmdW5jdGlvbiBvdmVybGF5cyB0aGUgY2xhbXAgbG9jYXRpb24gb24gdGhlIGltYWdlLgorICAgIGludCAgICAgIHNob3dSZXN1bHQ7ICAgICAgICAgIC8vSWYgVFJVRSwgdGhlIGZ1bmN0aW9uIG92ZXJsYXlzIHRoZSBoaXQgbGluZXMgdG8gdGhlIG9iamVjdCBhbmQgdGhlIGVkZ2UgdXNlZCB0byBnZW5lcmF0ZSB0aGUgaGl0IGxpbmUgb24gdGhlIHJlc3VsdCBpbWFnZS4KKyAgICBSR0JWYWx1ZSBzZWFyY2hBcmVhQ29sb3I7ICAgICAvL1NwZWNpZmllcyB0aGUgUkdCIGNvbG9yIHZhbHVlIHRvIHVzZSB0byBvdmVybGF5IHRoZSBzZWFyY2ggYXJlYS4KKyAgICBSR0JWYWx1ZSBjdXJ2ZXNDb2xvcjsgICAgICAgICAvL1NwZWNpZmllcyB0aGUgUkdCIGNvbG9yIHZhbHVlIHRvIHVzZSB0byBvdmVybGF5IHRoZSBjdXJ2ZXMuCisgICAgUkdCVmFsdWUgY2xhbXBMb2NhdGlvbnNDb2xvcjsgLy9TcGVjaWZpZXMgdGhlIFJHQiBjb2xvciB2YWx1ZSB0byB1c2UgdG8gb3ZlcmxheSB0aGUgY2xhbXAgbG9jYXRpb25zLgorICAgIFJHQlZhbHVlIHJlc3VsdENvbG9yOyAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBSR0IgY29sb3IgdmFsdWUgdG8gdXNlIHRvIG92ZXJsYXkgdGhlIHJlc3VsdHMuCisgICAgY2hhciogICAgb3ZlcmxheUdyb3VwTmFtZTsgICAgLy9TcGVjaWZpZXMgdGhlIGdyb3VwIG92ZXJsYXkgbmFtZSBmb3IgdGhlIHN0ZXAgb3ZlcmxheXMuCit9IENsYW1wT3ZlcmxheVNldHRpbmdzOworCit0eXBlZGVmIHN0cnVjdCBDbGFtcE1heDJSZXBvcnRfc3RydWN0IHsKKyAgICBDbGFtcFJlc3VsdHMgY2xhbXBSZXN1bHRzOyAgICAgLy9TcGVjaWZpZXMgdGhlIENsYW1wIHJlc3VsdHMgaW5mb3JtYXRpb24gcmV0dXJuZWQgYnkgdGhlIGZ1bmN0aW9uLgorICAgIENsYW1wUG9pbnRzICBjbGFtcFBvaW50czsgICAgICAvL1NwZWNpZmllcyB0aGUgY2xhbXAgcG9pbnRzIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IHRoZSBmdW5jdGlvbi4KKyAgICB1bnNpZ25lZCBpbnQgY2FsaWJyYXRpb25WYWxpZDsgLy9TcGVjaWZpZXMgaWYgdGhlIGNhbGlicmF0aW9uIGluZm9ybWF0aW9uIGlzIHZhbGlkIG9yIG5vdC4KK30gQ2xhbXBNYXgyUmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBDb250b3VyRml0U3BsaW5lUmVwb3J0X3N0cnVjdCB7CisgICAgUG9pbnREb3VibGUqIHBvaW50czsgICAgICAgICAvL0l0IHJldHVybnMgdGhlIHBvaW50cyBvZiB0aGUgYmVzdC1maXQgQi1zcGxpbmUgY3VydmUuCisgICAgaW50ICAgICAgICAgIG51bWJlck9mUG9pbnRzOyAvL051bWJlciBvZiBCZXN0IGZpdCBwb2ludHMgcmV0dXJuZWQuCit9IENvbnRvdXJGaXRTcGxpbmVSZXBvcnQ7CisKK3R5cGVkZWYgc3RydWN0IExpbmVGbG9hdF9zdHJ1Y3QgeworICAgIFBvaW50RmxvYXQgc3RhcnQ7IC8vVGhlIGNvb3JkaW5hdGUgbG9jYXRpb24gb2YgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLgorICAgIFBvaW50RmxvYXQgZW5kOyAgIC8vVGhlIGNvb3JkaW5hdGUgbG9jYXRpb24gb2YgdGhlIGVuZCBvZiB0aGUgbGluZS4KK30gTGluZUZsb2F0OworCit0eXBlZGVmIHN0cnVjdCBMaW5lRXF1YXRpb25fc3RydWN0IHsKKyAgICBkb3VibGUgYTsgLy9UaGUgYSBjb2VmZmljaWVudCBvZiB0aGUgbGluZSBlcXVhdGlvbi4KKyAgICBkb3VibGUgYjsgLy9UaGUgYiBjb2VmZmljaWVudCBvZiB0aGUgbGluZSBlcXVhdGlvbi4KKyAgICBkb3VibGUgYzsgLy9UaGUgYyBjb2VmZmljaWVudCBvZiB0aGUgbGluZSBlcXVhdGlvbi4KK30gTGluZUVxdWF0aW9uOworCit0eXBlZGVmIHN0cnVjdCBDb250b3VyRml0TGluZVJlcG9ydF9zdHJ1Y3QgeworICAgIExpbmVGbG9hdCAgICBsaW5lU2VnbWVudDsgIC8vTGluZSBTZWdtZW50IHJlcHJlc2VudHMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgbGluZSBlcXVhdGlvbiBhbmQgdGhlIGNvbnRvdXIuCisgICAgTGluZUVxdWF0aW9uIGxpbmVFcXVhdGlvbjsgLy9MaW5lIEVxdWF0aW9uIGlzIGEgc3RydWN0dXJlIG9mIHRocmVlIGNvZWZmaWNpZW50cyBBLCBCLCBhbmQgQyBvZiB0aGUgZXF1YXRpb24gaW4gdGhlIG5vcm1hbCBmb3JtIChBeCArIEJ5ICsgQz0wKSBvZiB0aGUgYmVzdCBmaXQgbGluZS4KK30gQ29udG91ckZpdExpbmVSZXBvcnQ7CisKK3R5cGVkZWYgc3RydWN0IENvbnRvdXJGaXRQb2x5bm9taWFsUmVwb3J0X3N0cnVjdCB7CisgICAgUG9pbnREb3VibGUqIGJlc3RGaXQ7ICAgICAgICAgICAgICAgIC8vSXQgcmV0dXJucyB0aGUgcG9pbnRzIG9mIHRoZSBiZXN0LWZpdCBwb2x5bm9taWFsLgorICAgIGludCAgICAgICAgICBudW1iZXJPZlBvaW50czsgICAgICAgICAvL051bWJlciBvZiBCZXN0IGZpdCBwb2ludHMgcmV0dXJuZWQuCisgICAgZG91YmxlKiAgICAgIHBvbHlub21pYWxDb2VmZmljaWVudHM7IC8vUG9seW5vbWlhbCBDb2VmZmljaWVudHMgcmV0dXJucyB0aGUgY29lZmZpY2llbnRzIG9mIHRoZSBwb2x5bm9taWFsIGVxdWF0aW9uLgorICAgIGludCAgICAgICAgICBudW1iZXJPZkNvZWZmaWNpZW50czsgICAvL051bWJlciBvZiBDb2VmZmljaWVudHMgcmV0dXJuZWQgaW4gdGhlIHBvbHlub21pYWwgY29lZmZpY2llbnRzIGFycmF5LgorfSBDb250b3VyRml0UG9seW5vbWlhbFJlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgUGFydGlhbENpcmNsZV9zdHJ1Y3QgeworICAgIFBvaW50RmxvYXQgY2VudGVyOyAgICAgLy9DZW50ZXIgb2YgdGhlIGNpcmNsZS4KKyAgICBkb3VibGUgICAgIHJhZGl1czsgICAgIC8vUmFkaXVzIG9mIHRoZSBjaXJjbGUuCisgICAgZG91YmxlICAgICBzdGFydEFuZ2xlOyAvL1N0YXJ0IGFuZ2xlIG9mIHRoZSBmaXR0ZWQgc3RydWN0dXJlLgorICAgIGRvdWJsZSAgICAgZW5kQW5nbGU7ICAgLy9FbmQgYW5nbGUgb2YgdGhlIGZpdHRlZCBzdHJ1Y3R1cmUuCit9IFBhcnRpYWxDaXJjbGU7CisKK3R5cGVkZWYgc3RydWN0IFBhcnRpYWxFbGxpcHNlX3N0cnVjdCB7CisgICAgUG9pbnRGbG9hdCBjZW50ZXI7ICAgICAgLy9DZW50ZXIgb2YgdGhlIEVsbGlwc2UuCisgICAgZG91YmxlICAgICBhbmdsZTsgICAgICAgLy9BbmdsZSBvZiB0aGUgZWxsaXBzZS4KKyAgICBkb3VibGUgICAgIG1ham9yUmFkaXVzOyAvL1RoZSBsZW5ndGggb2YgdGhlIHNlbWktbWFqb3IgYXhpcyBvZiB0aGUgZWxsaXBzZS4KKyAgICBkb3VibGUgICAgIG1pbm9yUmFkaXVzOyAvL1RoZSBsZW5ndGggb2YgdGhlIHNlbWktbWlub3IgYXhpcyBvZiB0aGUgZWxsaXBzZS4KKyAgICBkb3VibGUgICAgIHN0YXJ0QW5nbGU7ICAvL1N0YXJ0IGFuZ2xlIG9mIHRoZSBmaXR0ZWQgc3RydWN0dXJlLgorICAgIGRvdWJsZSAgICAgZW5kQW5nbGU7ICAgIC8vRW5kIGFuZ2xlIG9mIHRoZSBmaXR0ZWQgc3RydWN0dXJlLgorfSBQYXJ0aWFsRWxsaXBzZTsKKwordHlwZWRlZiBzdHJ1Y3QgU2V0dXBNYXRjaFBhdHRlcm5EYXRhX3N0cnVjdCB7CisgICAgdW5zaWduZWQgY2hhciogbWF0Y2hTZXR1cERhdGE7ICAgIC8vU3RyaW5nIGNvbnRhaW5pbmcgdGhlIG1hdGNoIHNldHVwIGRhdGEuCisgICAgaW50ICAgICAgICAgICAgbnVtTWF0Y2hTZXR1cERhdGE7IC8vTnVtYmVyIG9mIG1hdGNoIHNldHVwIGRhdGEuCit9IFNldHVwTWF0Y2hQYXR0ZXJuRGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QgUmFuZ2VTZXR0aW5nRG91YmxlX3N0cnVjdCB7CisgICAgU2V0dGluZ1R5cGUgc2V0dGluZ1R5cGU7IC8vTWF0Y2ggQ29uc3RyYWludHMgc3BlY2lmaWVzIHRoZSBtYXRjaCBvcHRpb24gd2hvc2UgdmFsdWVzIHlvdSB3YW50IHRvIGNvbnN0cmFpbiBieSB0aGUgZ2l2ZW4gcmFuZ2UuCisgICAgZG91YmxlICAgICAgbWluOyAgICAgICAgIC8vTWluIGlzIHRoZSBtaW5pbXVtIHZhbHVlIG9mIHRoZSByYW5nZSBmb3IgYSBnaXZlbiBNYXRjaCBDb25zdHJhaW50LgorICAgIGRvdWJsZSAgICAgIG1heDsgICAgICAgICAvL01heCBpcyB0aGUgbWF4aW11bSB2YWx1ZSBvZiB0aGUgcmFuZ2UgZm9yIGEgZ2l2ZW4gTWF0Y2ggQ29uc3RyYWludC4KK30gUmFuZ2VTZXR0aW5nRG91YmxlOworCit0eXBlZGVmIHN0cnVjdCBHZW9tZXRyaWNBZHZhbmNlZFNldHVwRGF0YU9wdGlvbl9zdHJ1Y3QgeworICAgIEdlb21ldHJpY1NldHVwRGF0YUl0ZW0gdHlwZTsgIC8vSXQgZGV0ZXJtaW5lcyB0aGUgb3B0aW9uIHlvdSB3YW50IHRvIHVzZSBkdXJpbmcgdGhlIG1hdGNoaW5nIHBoYXNlLgorICAgIGRvdWJsZSAgICAgICAgICAgICAgICAgdmFsdWU7IC8vVmFsdWUgaXMgdGhlIHZhbHVlIGZvciB0aGUgb3B0aW9uIHlvdSB3YW50IHRvIHVzZSBkdXJpbmcgdGhlIG1hdGNoaW5nIHBoYXNlLgorfSBHZW9tZXRyaWNBZHZhbmNlZFNldHVwRGF0YU9wdGlvbjsKKwordHlwZWRlZiBzdHJ1Y3QgQ29udG91ckluZm9SZXBvcnRfc3RydWN0IHsKKyAgICBQb2ludERvdWJsZSogcG9pbnRzUGl4ZWw7ICAgICAgIC8vUG9pbnRzIChwaXhlbCkgc3BlY2lmaWVzIHRoZSBsb2NhdGlvbiBvZiBldmVyeSBwb2ludCBkZXRlY3RlZCBvbiB0aGUgY3VydmUsIGluIHBpeGVscy4KKyAgICB1bnNpZ25lZCBpbnQgbnVtUG9pbnRzUGl4ZWw7ICAgIC8vTnVtYmVyIG9mIHBvaW50cyBwaXhlbCBlbGVtZW50cy4KKyAgICBQb2ludERvdWJsZSogcG9pbnRzUmVhbDsgICAgICAgIC8vUG9pbnRzIChyZWFsKSBzcGVjaWZpZXMgdGhlIGxvY2F0aW9uIG9mIGV2ZXJ5IHBvaW50IGRldGVjdGVkIG9uIHRoZSBjdXJ2ZSwgaW4gY2FsaWJyYXRlZCB1bml0cy4KKyAgICB1bnNpZ25lZCBpbnQgbnVtUG9pbnRzUmVhbDsgICAgIC8vTnVtYmVyIG9mIHBvaW50cyByZWFsIGVsZW1lbnRzLgorICAgIGRvdWJsZSogICAgICBjdXJ2YXR1cmVQaXhlbDsgICAgLy9DdXJ2YXR1cmUgUGl4ZWwgZGlzcGxheXMgdGhlIGN1cnZhdHVyZSBwcm9maWxlIGZvciB0aGUgc2VsZWN0ZWQgY29udG91ciwgaW4gcGl4ZWxzLgorICAgIHVuc2lnbmVkIGludCBudW1DdXJ2YXR1cmVQaXhlbDsgLy9OdW1iZXIgb2YgY3VydmF0dXJlIHBpeGVscy4KKyAgICBkb3VibGUqICAgICAgY3VydmF0dXJlUmVhbDsgICAgIC8vQ3VydmF0dXJlIFJlYWwgZGlzcGxheXMgdGhlIGN1cnZhdHVyZSBwcm9maWxlIGZvciB0aGUgc2VsZWN0ZWQgY29udG91ciwgaW4gY2FsaWJyYXRlZCB1bml0cy4KKyAgICB1bnNpZ25lZCBpbnQgbnVtQ3VydmF0dXJlUmVhbDsgIC8vTnVtYmVyIG9mIGN1cnZhdHVyZSBSZWFsIGVsZW1lbnRzLgorICAgIGRvdWJsZSAgICAgICBsZW5ndGg7ICAgICAgICAgICAgLy9MZW5ndGggKHBpeGVsKSBzcGVjaWZpZXMgdGhlIGxlbmd0aCwgaW4gcGl4ZWxzLCBvZiB0aGUgY3VydmVzIGluIHRoZSBpbWFnZS4KKyAgICBkb3VibGUgICAgICAgbGVuZ3RoUmVhbDsgICAgICAgIC8vTGVuZ3RoIChyZWFsKSBzcGVjaWZpZXMgdGhlIGxlbmd0aCwgaW4gY2FsaWJyYXRlZCB1bml0cywgb2YgdGhlIGN1cnZlcyB3aXRoaW4gdGhlIGN1cnZhdHVyZSByYW5nZS4KKyAgICB1bnNpZ25lZCBpbnQgaGFzRXF1YXRpb247ICAgICAgIC8vSGFzIEVxdWF0aW9uIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBjb250b3VyIGhhcyBhIGZpdHRlZCBlcXVhdGlvbi4KK30gQ29udG91ckluZm9SZXBvcnQ7CisKK3R5cGVkZWYgc3RydWN0IFJPSUxhYmVsX3N0cnVjdCB7CisgICAgY2hhciogICAgICAgIGNsYXNzTmFtZTsgLy9TcGVjaWZpZXMgdGhlIGNsYXNzbmFtZSB5b3Ugd2FudCB0byBzZWdtZW50LgorICAgIHVuc2lnbmVkIGludCBsYWJlbDsgICAgIC8vTGFiZWwgaXMgdGhlIGxhYmVsIG51bWJlciBhc3NvY2lhdGVkIHdpdGggdGhlIENsYXNzIE5hbWUuCit9IFJPSUxhYmVsOworCit0eXBlZGVmIHN0cnVjdCBTdXBlcnZpc2VkQ29sb3JTZWdtZW50YXRpb25SZXBvcnRfc3RydWN0IHsKKyAgICBST0lMYWJlbCogICAgbGFiZWxPdXQ7ICAgIC8vVGhlIFJvaSBsYWJlbHMgYXJyYXkuCisgICAgdW5zaWduZWQgaW50IG51bUxhYmVsT3V0OyAvL1RoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gbGFiZWxPdXQgYXJyYXkuCit9IFN1cGVydmlzZWRDb2xvclNlZ21lbnRhdGlvblJlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgTGFiZWxUb1JPSVJlcG9ydF9zdHJ1Y3QgeworICAgIFJPSSoqICAgICAgICAgcm9pQXJyYXk7ICAgICAgICAgICAgICAgICAgLy9BcnJheSBvZiBST0lzLgorICAgIHVuc2lnbmVkIGludCAgbnVtT2ZST0lzOyAgICAgICAgICAgICAgICAgLy9OdW1iZXIgb2YgUk9JcyBpbiB0aGUgcm9pQXJyYXkuCisgICAgdW5zaWduZWQgaW50KiBsYWJlbHNPdXRBcnJheTsgICAgICAgICAgICAvL0FycmF5IG9mIGxhYmVscy4KKyAgICB1bnNpZ25lZCBpbnQgIG51bU9mTGFiZWxzOyAgICAgICAgICAgICAgIC8vTnVtYmVyIG9mIGxhYmVscy4KKyAgICBpbnQqICAgICAgICAgIGlzVG9vTWFueVZlY3RvcnNBcnJheTsgICAgIC8vaXNUb29NYW55VmVjdG9yc0FycmF5IGFycmF5LgorICAgIHVuc2lnbmVkIGludCAgaXNUb29NYW55VmVjdG9yc0FycmF5U2l6ZTsgLy9OdW1iZXIgb2YgZWxlbWVudHMgaW4gaXNUb29NYW55VmVjdG9yc0FycmF5LgorfSBMYWJlbFRvUk9JUmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBDb2xvclNlZ21lbmF0aW9uT3B0aW9uc19zdHJ1Y3QgeworICAgIHVuc2lnbmVkIGludCB3aW5kb3dYOyAgICAgICAgIC8vWCBpcyB0aGUgd2luZG93IHNpemUgaW4geCBkaXJlY3Rpb24uCisgICAgdW5zaWduZWQgaW50IHdpbmRvd1k7ICAgICAgICAgLy9ZIGlzIHRoZSB3aW5kb3cgc2l6ZSBpbiB5IGRpcmVjdGlvbi4KKyAgICB1bnNpZ25lZCBpbnQgc3RlcFNpemU7ICAgICAgICAvL1N0ZXAgU2l6ZSBpcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0d28gd2luZG93cy4KKyAgICB1bnNpZ25lZCBpbnQgbWluUGFydGljbGVBcmVhOyAvL01pbiBQYXJ0aWNsZSBBcmVhIGlzIHRoZSBtaW5pbXVtIG51bWJlciBvZiBhbGxvd2VkIHBpeGVscy4KKyAgICB1bnNpZ25lZCBpbnQgbWF4UGFydGljbGVBcmVhOyAvL01heCBQYXJ0aWNsZSBBcmVhIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhbGxvd2VkIHBpeGVscy4KKyAgICBzaG9ydCAgICAgICAgaXNGaW5lU2VnbWVudDsgICAvL1doZW4gZW5hYmxlZCwgdGhlIHN0ZXAgcHJvY2Vzc2VzIHRoZSBib3VuZGFyeSBwaXhlbHMgb2YgZWFjaCBzZWdtZW50YXRpb24gY2x1c3RlciB1c2luZyBhIHN0ZXAgc2l6ZSBvZiAxLgorfSBDb2xvclNlZ21lbmF0aW9uT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgQ2xhc3NpZmllZEN1cnZlX3N0cnVjdCB7CisgICAgZG91YmxlICAgICAgIGxlbmd0aDsgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBsZW5ndGgsIGluIHBpeGVscywgb2YgdGhlIGN1cnZlcyB3aXRoaW4gdGhlIGN1cnZhdHVyZSByYW5nZS4KKyAgICBkb3VibGUgICAgICAgbGVuZ3RoUmVhbDsgICAgICAgLy9zcGVjaWZpZXMgdGhlIGxlbmd0aCwgaW4gY2FsaWJyYXRlZCB1bml0cywgb2YgdGhlIGN1cnZlcyB3aXRoaW4gdGhlIGN1cnZhdHVyZSByYW5nZS4KKyAgICBkb3VibGUgICAgICAgbWF4Q3VydmF0dXJlOyAgICAgLy9zcGVjaWZpZXMgdGhlIG1heGltdW0gY3VydmF0dXJlLCBpbiBwaXhlbHMsIGZvciB0aGUgc2VsZWN0ZWQgY3VydmF0dXJlIHJhbmdlLgorICAgIGRvdWJsZSAgICAgICBtYXhDdXJ2YXR1cmVSZWFsOyAvL3NwZWNpZmllcyB0aGUgbWF4aW11bSBjdXJ2YXR1cmUsIGluIGNhbGlicmF0ZWQgdW5pdHMsIGZvciB0aGUgc2VsZWN0ZWQgY3VydmF0dXJlIHJhbmdlLgorICAgIHVuc2lnbmVkIGludCBsYWJlbDsgICAgICAgICAgICAvL3NwZWNpZmllcyB0aGUgY2xhc3MgdG8gd2hpY2ggdGhlIHRoZSBzYW1wbGUgYmVsb25ncy4KKyAgICBQb2ludERvdWJsZSogY3VydmVQb2ludHM7ICAgICAgLy9DdXJ2ZSBQb2ludHMgaXMgYSBwb2ludC1jb29yZGluYXRlIGNsdXN0ZXIgdGhhdCBkZWZpbmVzIHRoZSBwb2ludHMgb2YgdGhlIGN1cnZlLgorICAgIHVuc2lnbmVkIGludCBudW1DdXJ2ZVBvaW50czsgICAvL051bWJlciBvZiBjdXJ2ZSBwb2ludHMuCit9IENsYXNzaWZpZWRDdXJ2ZTsKKwordHlwZWRlZiBzdHJ1Y3QgUmFuZ2VEb3VibGVfc3RydWN0IHsKKyAgICBkb3VibGUgbWluVmFsdWU7IC8vVGhlIG1pbmltdW0gdmFsdWUgb2YgdGhlIHJhbmdlLgorICAgIGRvdWJsZSBtYXhWYWx1ZTsgLy9UaGUgbWF4aW11bSB2YWx1ZSBvZiB0aGUgcmFuZ2UuCit9IFJhbmdlRG91YmxlOworCit0eXBlZGVmIHN0cnVjdCBSYW5nZUxhYmVsX3N0cnVjdCB7CisgICAgUmFuZ2VEb3VibGUgIHJhbmdlOyAvL1NwZWNpZmllcyB0aGUgcmFuZ2Ugb2YgY3VydmF0dXJlIHZhbHVlcy4KKyAgICB1bnNpZ25lZCBpbnQgbGFiZWw7IC8vQ2xhc3MgTGFiZWwgc3BlY2lmaWVzIHRoZSBjbGFzcyB0byB3aGljaCB0aGUgdGhlIHNhbXBsZSBiZWxvbmdzLgorfSBSYW5nZUxhYmVsOworCit0eXBlZGVmIHN0cnVjdCBDdXJ2YXR1cmVBbmFseXNpc1JlcG9ydF9zdHJ1Y3QgeworICAgIENsYXNzaWZpZWRDdXJ2ZSogY3VydmVzOyAgICAKKyAgICB1bnNpZ25lZCBpbnQgICAgIG51bUN1cnZlczsgCit9IEN1cnZhdHVyZUFuYWx5c2lzUmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBEaXNwYXJpdHlfc3RydWN0IHsKKyAgICBQb2ludERvdWJsZSBjdXJyZW50OyAgIC8vQ3VycmVudCBpcyBhIGFycmF5IG9mIHBvaW50cyB0aGF0IGRlZmluZXMgdGhlIHRhcmdldCBjb250b3VyLgorICAgIFBvaW50RG91YmxlIHJlZmVyZW5jZTsgLy9yZWZlcmVuY2UgaXMgYSBhcnJheSBvZiBwb2ludHMgdGhhdCBkZWZpbmVzIHRoZSB0ZW1wbGF0ZSBjb250b3VyLgorICAgIGRvdWJsZSAgICAgIGRpc3RhbmNlOyAgLy9TcGVjaWZpZXMgdGhlIGRpc3RhbmNlLCBpbiBwaXhlbHMsIGJldHdlZW4gdGhlIHRlbXBsYXRlIGNvbnRvdXIgcG9pbnQgYW5kIHRoZSB0YXJnZXQgY29udG91ciBwb2ludC4KK30gRGlzcGFyaXR5OworCit0eXBlZGVmIHN0cnVjdCBDb21wdXRlRGlzdGFuY2VzUmVwb3J0X3N0cnVjdCB7CisgICAgRGlzcGFyaXR5KiAgIGRpc3RhbmNlczsgICAgICAgIC8vRGlzdGFuY2VzIGlzIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGNvbXB1dGVkIGRpc3RhbmNlcy4KKyAgICB1bnNpZ25lZCBpbnQgbnVtRGlzdGFuY2VzOyAgICAgLy9OdW1iZXIgZWxlbWVudHMgaW4gdGhlIGRpc3RhbmNlcyBhcnJheS4KKyAgICBEaXNwYXJpdHkqICAgZGlzdGFuY2VzUmVhbDsgICAgLy9EaXN0YW5jZXMgUmVhbCBpcyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBjb21wdXRlZCBkaXN0YW5jZXMgaW4gY2FsaWJyYXRlZCB1bml0cy4KKyAgICB1bnNpZ25lZCBpbnQgbnVtRGlzdGFuY2VzUmVhbDsgLy9OdW1iZXIgb2YgZWxlbWVudHMgaW4gcmVhbCBkaXN0YW5jZXMgYXJyYXkuCit9IENvbXB1dGVEaXN0YW5jZXNSZXBvcnQ7CisKK3R5cGVkZWYgc3RydWN0IE1hdGNoTW9kZV9zdHJ1Y3QgeworICAgIHVuc2lnbmVkIGludCByb3RhdGlvbjsgIC8vUm90YXRpb24gV2hlbiBlbmFibGVkLCB0aGUgRnVuY3Rpb24gc2VhcmNoZXMgZm9yIG9jY3VycmVuY2VzIG9mIHRoZSB0ZW1wbGF0ZSBpbiB0aGUgaW5zcGVjdGlvbiBpbWFnZSwgYWxsb3dpbmcgZm9yIHRlbXBsYXRlIG1hdGNoZXMgdG8gYmUgcm90YXRlZC4KKyAgICB1bnNpZ25lZCBpbnQgc2NhbGU7ICAgICAvL1JvdGF0aW9uIFdoZW4gZW5hYmxlZCwgdGhlIEZ1bmN0aW9uIHNlYXJjaGVzIGZvciBvY2N1cnJlbmNlcyBvZiB0aGUgdGVtcGxhdGUgaW4gdGhlIGluc3BlY3Rpb24gaW1hZ2UsIGFsbG93aW5nIGZvciB0ZW1wbGF0ZSBtYXRjaGVzIHRvIGJlIHJvdGF0ZWQuCisgICAgdW5zaWduZWQgaW50IG9jY2x1c2lvbjsgLy9PY2NsdXNpb24gc3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIHNlYXJjaCBmb3Igb2NjbHVkZWQgdmVyc2lvbnMgb2YgdGhlIHNoYXBlLgorfSBNYXRjaE1vZGU7CisKK3R5cGVkZWYgc3RydWN0IENsYXNzaWZpZWREaXNwYXJpdHlfc3RydWN0IHsKKyAgICBkb3VibGUgICAgICAgbGVuZ3RoOyAgICAgICAgICAgICAgICAvL0xlbmd0aCAocGl4ZWwpIHNwZWNpZmllcyB0aGUgbGVuZ3RoLCBpbiBwaXhlbHMsIG9mIHRoZSBjdXJ2ZXMgd2l0aGluIHRoZSBjdXJ2YXR1cmUgcmFuZ2UuCisgICAgZG91YmxlICAgICAgIGxlbmd0aFJlYWw7ICAgICAgICAgICAgLy9MZW5ndGggKHJlYWwpIHNwZWNpZmllcyB0aGUgbGVuZ3RoLCBpbiBjYWxpYnJhdGVkIHVuaXRzLCBvZiB0aGUgY3VydmVzIHdpdGhpbiB0aGUgY3VydmF0dXJlIHJhbmdlLgorICAgIGRvdWJsZSAgICAgICBtYXhEaXN0YW5jZTsgICAgICAgICAgIC8vTWF4aW11bSBEaXN0YW5jZSAocGl4ZWwpIHNwZWNpZmllcyB0aGUgbWF4aW11bSBkaXN0YW5jZSwgaW4gcGl4ZWxzLCBiZXR3ZWVuIHBvaW50cyBhbG9uZyB0aGUgc2VsZWN0ZWQgY29udG91ciBhbmQgdGhlIHRlbXBsYXRlIGNvbnRvdXIuCisgICAgZG91YmxlICAgICAgIG1heERpc3RhbmNlUmVhbDsgICAgICAgLy9NYXhpbXVtIERpc3RhbmNlIChyZWFsKSBzcGVjaWZpZXMgdGhlIG1heGltdW0gZGlzdGFuY2UsIGluIGNhbGlicmF0ZWQgdW5pdHMsIGJldHdlZW4gcG9pbnRzIGFsb25nIHRoZSBzZWxlY3RlZCBjb250b3VyIGFuZCB0aGUgdGVtcGxhdGUgY29udG91ci4KKyAgICB1bnNpZ25lZCBpbnQgbGFiZWw7ICAgICAgICAgICAgICAgICAvL0NsYXNzIExhYmVsIHNwZWNpZmllcyB0aGUgY2xhc3MgdG8gd2hpY2ggdGhlIHRoZSBzYW1wbGUgYmVsb25ncy4KKyAgICBQb2ludERvdWJsZSogdGVtcGxhdGVTdWJzZWN0aW9uOyAgICAvL1RlbXBsYXRlIHN1YnNlY3Rpb24gcG9pbnRzIGlzIGFuIGFycmF5IG9mIHBvaW50cyB0aGF0IGRlZmluZXMgdGhlIGJvdW5kYXJ5IG9mIHRoZSB0ZW1wbGF0ZS4KKyAgICB1bnNpZ25lZCBpbnQgbnVtVGVtcGxhdGVTdWJzZWN0aW9uOyAvL051bWJlciBvZiByZWZlcmVuY2UgcG9pbnRzLgorICAgIFBvaW50RG91YmxlKiB0YXJnZXRTdWJzZWN0aW9uOyAgICAgIC8vQ3VycmVudCBQb2ludHMoVGFyZ2V0IHN1YnNlY3Rpb24gcG9pbnRzKSBpcyBhbiBhcnJheSBvZiBwb2ludHMgdGhhdCBkZWZpbmVzIHRoZSBib3VuZGFyeSBvZiB0aGUgdGFyZ2V0LgorICAgIHVuc2lnbmVkIGludCBudW1UYXJnZXRTdWJzZWN0aW9uOyAgIC8vTnVtYmVyIG9mIGN1cnJlbnQgcG9pbnRzLgorfSBDbGFzc2lmaWVkRGlzcGFyaXR5OworCit0eXBlZGVmIHN0cnVjdCBDbGFzc2lmeURpc3RhbmNlc1JlcG9ydF9zdHJ1Y3QgeworICAgIENsYXNzaWZpZWREaXNwYXJpdHkqIGNsYXNzaWZpZWREaXN0YW5jZXM7ICAgIC8vRGlzcGFyaXR5IGFycmF5IGNvbnRhaW5pbmcgdGhlIGNsYXNzaWZpZWQgZGlzdGFuY2VzLgorICAgIHVuc2lnbmVkIGludCAgICAgICAgIG51bUNsYXNzaWZpZWREaXN0YW5jZXM7IC8vTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBkaXNwYXJpdHkgYXJyYXkuCit9IENsYXNzaWZ5RGlzdGFuY2VzUmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBDb250b3VyQ29tcHV0ZUN1cnZhdHVyZVJlcG9ydF9zdHJ1Y3QgeworICAgIGRvdWJsZSogICAgICBjdXJ2YXR1cmVQaXhlbDsgICAgLy9DdXJ2YXR1cmUgUGl4ZWwgZGlzcGxheXMgdGhlIGN1cnZhdHVyZSBwcm9maWxlIGZvciB0aGUgc2VsZWN0ZWQgY29udG91ciwgaW4gcGl4ZWxzLgorICAgIHVuc2lnbmVkIGludCBudW1DdXJ2YXR1cmVQaXhlbDsgLy9OdW1iZXIgb2YgY3VydmF0dXJlIHBpeGVscy4KKyAgICBkb3VibGUqICAgICAgY3VydmF0dXJlUmVhbDsgICAgIC8vQ3VydmF0dXJlIFJlYWwgZGlzcGxheXMgdGhlIGN1cnZhdHVyZSBwcm9maWxlIGZvciB0aGUgc2VsZWN0ZWQgY29udG91ciwgaW4gY2FsaWJyYXRlZCB1bml0cy4KKyAgICB1bnNpZ25lZCBpbnQgbnVtQ3VydmF0dXJlUmVhbDsgIC8vTnVtYmVyIG9mIGN1cnZhdHVyZSBSZWFsIGVsZW1lbnRzLgorfSBDb250b3VyQ29tcHV0ZUN1cnZhdHVyZVJlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgQ29udG91ck92ZXJsYXlTZXR0aW5nc19zdHJ1Y3QgeworICAgIHVuc2lnbmVkIGludCBvdmVybGF5OyAgICAgICAvL092ZXJsYXkgc3BlY2lmaWVzIHdoZXRoZXIgdG8gZGlzcGxheSB0aGUgb3ZlcmxheSBvbiB0aGUgaW1hZ2UuCisgICAgUkdCVmFsdWUgICAgIGNvbG9yOyAgICAgICAgIC8vQ29sb3IgaXMgdGhlIGNvbG9yIG9mIHRoZSBvdmVybGF5LgorICAgIHVuc2lnbmVkIGludCB3aWR0aDsgICAgICAgICAvL1dpZHRoIHNwZWNpZmllcyB0aGUgd2lkdGggb2YgdGhlIG92ZXJsYXkgaW4gcGl4ZWxzLgorICAgIHVuc2lnbmVkIGludCBtYWludGFpbldpZHRoOyAvL01haW50YWluIFdpZHRoPyBzcGVjaWZpZXMgd2hldGhlciB5b3Ugd2FudCB0aGUgb3ZlcmxheSBtZWFzdXJlZCBpbiBzY3JlZW4gcGl4ZWxzIG9yIGltYWdlIHBpeGVscy4KK30gQ29udG91ck92ZXJsYXlTZXR0aW5nczsKKwordHlwZWRlZiBzdHJ1Y3QgQ3VydmVQYXJhbWV0ZXJzX3N0cnVjdCB7CisgICAgRXh0cmFjdGlvbk1vZGUgZXh0cmFjdGlvbk1vZGU7IC8vU3BlY2lmaWVzIHRoZSBtZXRob2QgdGhlIGZ1bmN0aW9uIHVzZXMgdG8gaWRlbnRpZnkgY3VydmVzIGluIHRoZSBpbWFnZS4KKyAgICBpbnQgICAgICAgICAgICB0aHJlc2hvbGQ7ICAgICAgLy9TcGVjaWZpZXMgdGhlIG1pbmltdW0gY29udHJhc3QgYSBzZWVkIHBvaW50IG11c3QgaGF2ZSBpbiBvcmRlciB0byBiZWdpbiBhIGN1cnZlLgorICAgIEVkZ2VGaWx0ZXJTaXplIGZpbHRlclNpemU7ICAgICAvL1NwZWNpZmllcyB0aGUgd2lkdGggb2YgdGhlIGVkZ2UgZmlsdGVyIHRoZSBmdW5jdGlvbiB1c2VzIHRvIGlkZW50aWZ5IGN1cnZlcyBpbiB0aGUgaW1hZ2UuCisgICAgaW50ICAgICAgICAgICAgbWluTGVuZ3RoOyAgICAgIC8vU3BlY2lmaWVzIHRoZSBsZW5ndGgsIGluIHBpeGVscywgb2YgdGhlIHNtYWxsZXN0IGN1cnZlIHRoZSBmdW5jdGlvbiB3aWxsIGV4dHJhY3QuCisgICAgaW50ICAgICAgICAgICAgc2VhcmNoU3RlcDsgICAgIC8vU2VhcmNoIFN0ZXAgU2l6ZSBzcGVjaWZpZXMgdGhlIGRpc3RhbmNlLCBpbiB0aGUgeSBkaXJlY3Rpb24sIGJldHdlZW4gdGhlIGltYWdlIHJvd3MgdGhhdCB0aGUgYWxnb3JpdGhtIGluc3BlY3RzIGZvciBjdXJ2ZSBzZWVkIHBvaW50cy4KKyAgICBpbnQgICAgICAgICAgICBtYXhFbmRQb2ludEdhcDsgLy9TcGVjaWZpZXMgdGhlIG1heGltdW0gZ2FwLCBpbiBwaXhlbHMsIGJldHdlZW4gdGhlIGVuZHBvaW50cyBvZiBhIGN1cnZlIHRoYXQgdGhlIGZ1bmN0aW9uIGlkZW50aWZpZXMgYXMgYSBjbG9zZWQgY3VydmUuCisgICAgaW50ICAgICAgICAgICAgc3VicGl4ZWw7ICAgICAgIC8vU3VicGl4ZWwgc3BlY2lmaWVzIHdoZXRoZXIgdG8gZGV0ZWN0IGN1cnZlIHBvaW50cyB3aXRoIHN1YnBpeGVsIGFjY3VyYWN5LgorfSBDdXJ2ZVBhcmFtZXRlcnM7CisKK3R5cGVkZWYgc3RydWN0IEV4dHJhY3RDb250b3VyUmVwb3J0X3N0cnVjdCB7CisgICAgUG9pbnREb3VibGUqIGNvbnRvdXJQb2ludHM7ICAgIC8vQ29udG91ciBQb2ludHMgc3BlY2lmaWVzIGV2ZXJ5IHBvaW50IGZvdW5kIG9uIHRoZSBjb250b3VyLgorICAgIGludCAgICAgICAgICBudW1Db250b3VyUG9pbnRzOyAvL051bWJlciBvZiBjb250b3VyIHBvaW50cy4KKyAgICBQb2ludERvdWJsZSogc291cmNlUG9pbnRzOyAgICAgLy9Tb3VyY2UgSW1hZ2UgUG9pbnRzIHNwZWNpZmllcyBldmVyeSBwb2ludCBmb3VuZCBvbiB0aGUgY29udG91ciBpbiB0aGUgc291cmNlIGltYWdlLgorICAgIGludCAgICAgICAgICBudW1Tb3VyY2VQb2ludHM7ICAvL051bWJlciBvZiBzb3VyY2UgcG9pbnRzLgorfSBFeHRyYWN0Q29udG91clJlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgQ29ubmVjdGlvbkNvbnN0cmFpbnRfc3RydWN0IHsKKyAgICBDb25uZWN0aW9uQ29uc3RyYWludFR5cGUgY29uc3RyYWludFR5cGU7IC8vQ29uc3RyYWludCBUeXBlIHNwZWNpZmllcyB3aGF0IGNyaXRlcmlhIHRvIHVzZSB0byBjb25zaWRlciB0d28gY3VydmVzIHBhcnQgb2YgYSBjb250b3VyLgorICAgIFJhbmdlRG91YmxlICAgICAgICAgICAgICByYW5nZTsgICAgICAgICAgLy9TcGVjaWZpZXMgcmFuZ2UgZm9yIGEgZ2l2ZW4gTWF0Y2ggQ29uc3RyYWludC4KK30gQ29ubmVjdGlvbkNvbnN0cmFpbnQ7CisKK3R5cGVkZWYgc3RydWN0IEV4dHJhY3RUZXh0dXJlRmVhdHVyZXNSZXBvcnRfc3RydWN0IHsKKyAgICBpbnQqICAgICB3YXZlbGV0QmFuZHM7ICAgICAgICAvL1RoZSBhcnJheSBoYXZpbmcgYWxsIHRoZSBXYXZlbGV0IEJhbmtzIHVzZWQgZm9yIGV4dHJhY3Rpb24uCisgICAgaW50ICAgICAgbnVtV2F2ZWxldEJhbmRzOyAgICAgLy9OdW1iZXIgb2Ygd2F2ZWxldCBiYW5rcyBpbiB0aGUgQXJyYXkuCisgICAgZG91YmxlKiogdGV4dHVyZUZlYXR1cmVzOyAgICAgLy8yLUQgYXJyYXkgdG8gc3RvcmUgYWxsIHRoZSBUZXh0dXJlIGZlYXR1cmVzIGV4dHJhY3RlZC4KKyAgICBpbnQgICAgICB0ZXh0dXJlRmVhdHVyZXNSb3dzOyAvL051bWJlciBvZiBSb3dzIGluIHRoZSBUZXh0dXJlIEZlYXR1cmVzIGFycmF5LgorICAgIGludCAgICAgIHRleHR1cmVGZWF0dXJlc0NvbHM7IC8vTnVtYmVyIG9mIENvbHMgaW4gVGV4dHVyZSBGZWF0dXJlcyBhcnJheS4KK30gRXh0cmFjdFRleHR1cmVGZWF0dXJlc1JlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgV2F2ZWxldEJhbmRzUmVwb3J0X3N0cnVjdCB7CisgICAgZmxvYXQqKiBMTEJhbmQ7ICAvLzItRCBhcnJheSBmb3IgTEwgQmFuZC4KKyAgICBmbG9hdCoqIExIQmFuZDsgIC8vMi1EIGFycmF5IGZvciBMSCBCYW5kLgorICAgIGZsb2F0KiogSExCYW5kOyAgLy8yLUQgYXJyYXkgZm9yIEhMIEJhbmQuCisgICAgZmxvYXQqKiBISEJhbmQ7ICAvLzItRCBhcnJheSBmb3IgSEggQmFuZC4KKyAgICBmbG9hdCoqIExMTEJhbmQ7IC8vMi1EIGFycmF5IGZvciBMTEwgQmFuZC4KKyAgICBmbG9hdCoqIExMSEJhbmQ7IC8vMi1EIGFycmF5IGZvciBMTEggQmFuZC4KKyAgICBmbG9hdCAgIExITEJhbmQ7IC8vMi1EIGFycmF5IGZvciBMSEwgQmFuZC4KKyAgICBmbG9hdCoqIExISEJhbmQ7IC8vMi1EIGFycmF5IGZvciBMSEggQmFuZC4KKyAgICBpbnQgICAgIHJvd3M7ICAgIC8vTnVtYmVyIG9mIFJvd3MgZm9yIGVhY2ggb2YgdGhlIDItRCBhcnJheXMuCisgICAgaW50ICAgICBjb2xzOyAgICAvL051bWJlciBvZiBDb2x1bW5zIGZvciBlYWNoIG9mIHRoZSAyLUQgYXJyYXlzLgorfSBXYXZlbGV0QmFuZHNSZXBvcnQ7CisKK3R5cGVkZWYgc3RydWN0IENpcmNsZUZpdE9wdGlvbnNfc3RydWN0IHsKKyAgICBpbnQgICAgICAgICAgICAgbWF4UmFkaXVzOyAgIC8vU3BlY2lmaWVzIHRoZSBhY2NlcHRhYmxlIGRpc3RhbmNlLCBpbiBwaXhlbHMsIHRoYXQgYSBwb2ludCBkZXRlcm1pbmVkIHRvIGJlbG9uZyB0byB0aGUgY2lyY2xlIGNhbiBiZSBmcm9tIHRoZSBwZXJpbWV0ZXIgb2YgdGhlIGNpcmNsZS4KKyAgICBkb3VibGUgICAgICAgICAgc3RlcFNpemU7ICAgIC8vU3RlcCBTaXplIGlzIHRoZSBhbmdsZSwgaW4gZGVncmVlcywgYmV0d2VlbiBlYWNoIHJhZGlhbCBsaW5lIGluIHRoZSBhbm51bGFyIHJlZ2lvbi4KKyAgICBSYWtlUHJvY2Vzc1R5cGUgcHJvY2Vzc1R5cGU7IC8vTWV0aG9kIHVzZWQgdG8gcHJvY2VzcyB0aGUgZGF0YSBleHRyYWN0ZWQgZm9yIGVkZ2UgZGV0ZWN0aW9uLgorfSBDaXJjbGVGaXRPcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBFZGdlT3B0aW9uczJfc3RydWN0IHsKKyAgICBFZGdlUG9sYXJpdHlTZWFyY2hNb2RlIHBvbGFyaXR5OyAgICAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgcG9sYXJpdHkgb2YgdGhlIGVkZ2VzIHRvIGJlIGZvdW5kLgorICAgIHVuc2lnbmVkIGludCAgICAgICAgICAga2VybmVsU2l6ZTsgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBzaXplIG9mIHRoZSBlZGdlIGRldGVjdGlvbiBrZXJuZWwuCisgICAgdW5zaWduZWQgaW50ICAgICAgICAgICB3aWR0aDsgICAgICAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIG51bWJlciBvZiBwaXhlbHMgYXZlcmFnZWQgcGVycGVuZGljdWxhciB0byB0aGUgc2VhcmNoIGRpcmVjdGlvbiB0byBjb21wdXRlIHRoZSBlZGdlIHByb2ZpbGUgc3RyZW5ndGggYXQgZWFjaCBwb2ludCBhbG9uZyB0aGUgc2VhcmNoIFJPSS4KKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgIG1pblRocmVzaG9sZDsgICAgICAgICAvL1NwZWNpZmllcyB0aGUgbWluaW11bSBlZGdlIHN0cmVuZ3RoIChncmFkaWVudCBtYWduaXR1ZGUpIHJlcXVpcmVkIGZvciBhIGRldGVjdGVkIGVkZ2UuCisgICAgSW50ZXJwb2xhdGlvbk1ldGhvZCAgICBpbnRlcnBvbGF0aW9uVHlwZTsgICAgLy9TcGVjaWZpZXMgdGhlIGludGVycG9sYXRpb24gbWV0aG9kIHVzZWQgdG8gbG9jYXRlIHRoZSBlZGdlIHBvc2l0aW9uLgorICAgIENvbHVtblByb2Nlc3NpbmdNb2RlICAgY29sdW1uUHJvY2Vzc2luZ01vZGU7IC8vU3BlY2lmaWVzIHRoZSBtZXRob2QgdXNlZCB0byBmaW5kIHRoZSBzdHJhaWdodCBlZGdlLgorfSBFZGdlT3B0aW9uczI7CisKK3R5cGVkZWYgc3RydWN0IEZpbmRDaXJjdWxhckVkZ2VPcHRpb25zX3N0cnVjdCB7CisgICAgU3Bva2VEaXJlY3Rpb24gZGlyZWN0aW9uOyAgICAgICAgLy9TcGVjaWZpZXMgdGhlIFNwb2tlIGRpcmVjdGlvbiB0byBzZWFyY2ggaW4gdGhlIFJPSS4KKyAgICBpbnQgICAgICAgICAgICBzaG93U2VhcmNoQXJlYTsgICAvL0lmIFRSVUUsIHRoZSBmdW5jdGlvbiBvdmVybGF5cyB0aGUgc2VhcmNoIGFyZWEgb24gdGhlIGltYWdlLgorICAgIGludCAgICAgICAgICAgIHNob3dTZWFyY2hMaW5lczsgIC8vSWYgVFJVRSwgdGhlIGZ1bmN0aW9uIG92ZXJsYXlzIHRoZSBzZWFyY2ggbGluZXMgdXNlZCB0byBsb2NhdGUgdGhlIGVkZ2VzIG9uIHRoZSBpbWFnZS4KKyAgICBpbnQgICAgICAgICAgICBzaG93RWRnZXNGb3VuZDsgICAvL0lmIFRSVUUsIHRoZSBmdW5jdGlvbiBvdmVybGF5cyB0aGUgbG9jYXRpb25zIG9mIHRoZSBlZGdlcyBmb3VuZCBvbiB0aGUgaW1hZ2UuCisgICAgaW50ICAgICAgICAgICAgc2hvd1Jlc3VsdDsgICAgICAgLy9JZiBUUlVFLCB0aGUgZnVuY3Rpb24gb3ZlcmxheXMgdGhlIGhpdCBsaW5lcyB0byB0aGUgb2JqZWN0IGFuZCB0aGUgZWRnZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBoaXQgbGluZSBvbiB0aGUgcmVzdWx0IGltYWdlLgorICAgIFJHQlZhbHVlICAgICAgIHNlYXJjaEFyZWFDb2xvcjsgIC8vU3BlY2lmaWVzIHRoZSBSR0IgY29sb3IgdmFsdWUgdG8gdXNlIHRvIG92ZXJsYXkgdGhlIHNlYXJjaCBhcmVhLgorICAgIFJHQlZhbHVlICAgICAgIHNlYXJjaExpbmVzQ29sb3I7IC8vU3BlY2lmaWVzIHRoZSBSR0IgY29sb3IgdmFsdWUgdG8gdXNlIHRvIG92ZXJsYXkgdGhlIHNlYXJjaCBsaW5lcy4KKyAgICBSR0JWYWx1ZSAgICAgICBzZWFyY2hFZGdlc0NvbG9yOyAvL1NwZWNpZmllcyB0aGUgUkdCIGNvbG9yIHZhbHVlIHRvIHVzZSB0byBvdmVybGF5IHRoZSBzZWFyY2ggZWRnZXMuCisgICAgUkdCVmFsdWUgICAgICAgcmVzdWx0Q29sb3I7ICAgICAgLy9TcGVjaWZpZXMgdGhlIFJHQiBjb2xvciB2YWx1ZSB0byB1c2UgdG8gb3ZlcmxheSB0aGUgcmVzdWx0cy4KKyAgICBjaGFyKiAgICAgICAgICBvdmVybGF5R3JvdXBOYW1lOyAvL1NwZWNpZmllcyB0aGUgb3ZlcmxheSBncm91cCBuYW1lIHRvIGFzc2lnbiB0byB0aGUgb3ZlcmxheXMuCisgICAgRWRnZU9wdGlvbnMyICAgZWRnZU9wdGlvbnM7ICAgICAgLy9TcGVjaWZpZXMgdGhlIGVkZ2UgZGV0ZWN0aW9uIG9wdGlvbnMgYWxvbmcgYSBzaW5nbGUgc2VhcmNoIGxpbmUuCit9IEZpbmRDaXJjdWxhckVkZ2VPcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBGaW5kQ29uY2VudHJpY0VkZ2VPcHRpb25zX3N0cnVjdCB7CisgICAgQ29uY2VudHJpY1Jha2VEaXJlY3Rpb24gZGlyZWN0aW9uOyAgICAgICAgLy9TcGVjaWZpZXMgdGhlIENvbmNlbnRyaWMgUmFrZSBkaXJlY3Rpb24uCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgc2hvd1NlYXJjaEFyZWE7ICAgLy9JZiBUUlVFLCB0aGUgZnVuY3Rpb24gb3ZlcmxheXMgdGhlIHNlYXJjaCBhcmVhIG9uIHRoZSBpbWFnZS4KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBzaG93U2VhcmNoTGluZXM7ICAvL0lmIFRSVUUsIHRoZSBmdW5jdGlvbiBvdmVybGF5cyB0aGUgc2VhcmNoIGxpbmVzIHVzZWQgdG8gbG9jYXRlIHRoZSBlZGdlcyBvbiB0aGUgaW1hZ2UuCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgc2hvd0VkZ2VzRm91bmQ7ICAgLy9JZiBUUlVFLCB0aGUgZnVuY3Rpb24gb3ZlcmxheXMgdGhlIGxvY2F0aW9ucyBvZiB0aGUgZWRnZXMgZm91bmQgb24gdGhlIGltYWdlLgorICAgIGludCAgICAgICAgICAgICAgICAgICAgIHNob3dSZXN1bHQ7ICAgICAgIC8vSWYgVFJVRSwgdGhlIGZ1bmN0aW9uIG92ZXJsYXlzIHRoZSBoaXQgbGluZXMgdG8gdGhlIG9iamVjdCBhbmQgdGhlIGVkZ2UgdXNlZCB0byBnZW5lcmF0ZSB0aGUgaGl0IGxpbmUgb24gdGhlIHJlc3VsdCBpbWFnZS4KKyAgICBSR0JWYWx1ZSAgICAgICAgICAgICAgICBzZWFyY2hBcmVhQ29sb3I7ICAvL1NwZWNpZmllcyB0aGUgUkdCIGNvbG9yIHZhbHVlIHRvIHVzZSB0byBvdmVybGF5IHRoZSBzZWFyY2ggYXJlYS4KKyAgICBSR0JWYWx1ZSAgICAgICAgICAgICAgICBzZWFyY2hMaW5lc0NvbG9yOyAvL1NwZWNpZmllcyB0aGUgUkdCIGNvbG9yIHZhbHVlIHRvIHVzZSB0byBvdmVybGF5IHRoZSBzZWFyY2ggbGluZXMuCisgICAgUkdCVmFsdWUgICAgICAgICAgICAgICAgc2VhcmNoRWRnZXNDb2xvcjsgLy9TcGVjaWZpZXMgdGhlIFJHQiBjb2xvciB2YWx1ZSB0byB1c2UgdG8gb3ZlcmxheSB0aGUgc2VhcmNoIGVkZ2VzLgorICAgIFJHQlZhbHVlICAgICAgICAgICAgICAgIHJlc3VsdENvbG9yOyAgICAgIC8vU3BlY2lmaWVzIHRoZSBSR0IgY29sb3IgdmFsdWUgdG8gdXNlIHRvIG92ZXJsYXkgdGhlIHJlc3VsdHMuCisgICAgY2hhciogICAgICAgICAgICAgICAgICAgb3ZlcmxheUdyb3VwTmFtZTsgLy9TcGVjaWZpZXMgdGhlIG92ZXJsYXkgZ3JvdXAgbmFtZSB0byBhc3NpZ24gdG8gdGhlIG92ZXJsYXlzLgorICAgIEVkZ2VPcHRpb25zMiAgICAgICAgICAgIGVkZ2VPcHRpb25zOyAgICAgIC8vU3BlY2lmaWVzIHRoZSBlZGdlIGRldGVjdGlvbiBvcHRpb25zIGFsb25nIGEgc2luZ2xlIHNlYXJjaCBsaW5lLgorfSBGaW5kQ29uY2VudHJpY0VkZ2VPcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBDb25jZW50cmljRWRnZUZpdE9wdGlvbnNfc3RydWN0IHsKKyAgICBpbnQgICAgICAgICAgICAgbWF4UmFkaXVzOyAgIC8vU3BlY2lmaWVzIHRoZSBhY2NlcHRhYmxlIGRpc3RhbmNlLCBpbiBwaXhlbHMsIHRoYXQgYSBwb2ludCBkZXRlcm1pbmVkIHRvIGJlbG9uZyB0byB0aGUgY2lyY2xlIGNhbiBiZSBmcm9tIHRoZSBwZXJpbWV0ZXIgb2YgdGhlIGNpcmNsZS4KKyAgICBkb3VibGUgICAgICAgICAgc3RlcFNpemU7ICAgIC8vVGhlIHNhbXBsaW5nIGZhY3RvciB0aGF0IGRldGVybWluZXMgdGhlIGdhcCBiZXR3ZWVuIHRoZSByYWtlIGxpbmVzLgorICAgIFJha2VQcm9jZXNzVHlwZSBwcm9jZXNzVHlwZTsgLy9NZXRob2QgdXNlZCB0byBwcm9jZXNzIHRoZSBkYXRhIGV4dHJhY3RlZCBmb3IgZWRnZSBkZXRlY3Rpb24uCit9IENvbmNlbnRyaWNFZGdlRml0T3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgRmluZENvbmNlbnRyaWNFZGdlUmVwb3J0X3N0cnVjdCB7CisgICAgUG9pbnRGbG9hdCBzdGFydFB0OyAgICAgICAgICAgLy9QaXhlbCBDb29yZGluYXRlcyBmb3Igc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGVkZ2UuCisgICAgUG9pbnRGbG9hdCBlbmRQdDsgICAgICAgICAgICAgLy9QaXhlbCBDb29yZGluYXRlcyBmb3IgZW5kIHBvaW50IG9mIHRoZSBlZGdlLgorICAgIFBvaW50RmxvYXQgc3RhcnRQdENhbGlicmF0ZWQ7IC8vUmVhbCB3b3JsZCBDb29yZGluYXRlcyBmb3Igc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGVkZ2UuCisgICAgUG9pbnRGbG9hdCBlbmRQdENhbGlicmF0ZWQ7ICAgLy9SZWFsIHdvcmxkIENvb3JkaW5hdGVzIGZvciBlbmQgcG9pbnQgb2YgdGhlIGVkZ2UuCisgICAgZG91YmxlICAgICBhbmdsZTsgICAgICAgICAgICAgLy9BbmdsZSBvZiB0aGUgZWRnZSBmb3VuZC4KKyAgICBkb3VibGUgICAgIGFuZ2xlQ2FsaWJyYXRlZDsgICAvL0NhbGlicmF0ZWQgYW5nbGUgb2YgdGhlIGVkZ2UgZm91bmQuCisgICAgZG91YmxlICAgICBzdHJhaWdodG5lc3M7ICAgICAgLy9UaGUgc3RyYWlnaHRuZXNzIHZhbHVlIG9mIHRoZSBkZXRlY3RlZCBzdHJhaWdodCBlZGdlLgorICAgIGRvdWJsZSAgICAgYXZnU3RyZW5ndGg7ICAgICAgIC8vQXZlcmFnZSBzdHJlbmd0aCBvZiB0aGUgZWdkZSBmb3VuZC4KKyAgICBkb3VibGUgICAgIGF2Z1NOUjsgICAgICAgICAgICAvL0F2ZXJhZ2UgU05SKFNpZ25hbCB0byBOb2lzZSBSYXRpbykgZm9yIHRoZSBlZGdlIGZvdW5kLgorICAgIGludCAgICAgICAgbGluZUZvdW5kOyAgICAgICAgIC8vSWYgdGhlIGVkZ2UgaXMgZm91bmQgb3Igbm90LgorfSBGaW5kQ29uY2VudHJpY0VkZ2VSZXBvcnQ7CisKK3R5cGVkZWYgc3RydWN0IEZpbmRDaXJjdWxhckVkZ2VSZXBvcnRfc3RydWN0IHsKKyAgICBQb2ludEZsb2F0IGNlbnRlckNhbGlicmF0ZWQ7IC8vUmVhbCB3b3JsZCBDb29yZGluYXRlcyBvZiB0aGUgQ2VudGVyLgorICAgIGRvdWJsZSAgICAgcmFkaXVzQ2FsaWJyYXRlZDsgLy9SZWFsIHdvcmxkIHJhZGl1cyBvZiB0aGUgQ2lyY3VsYXIgRWRnZSBmb3VuZC4KKyAgICBQb2ludEZsb2F0IGNlbnRlcjsgICAgICAgICAgIC8vUGl4ZWwgQ29vcmRpbmF0ZXMgb2YgdGhlIENlbnRlci4KKyAgICBkb3VibGUgICAgIHJhZGl1czsgICAgICAgICAgIC8vUmFkaXVzIGluIHBpeGVscyBvZiB0aGUgQ2lyY3VsYXIgRWRnZSBmb3VuZC4KKyAgICBkb3VibGUgICAgIHJvdW5kbmVzczsgICAgICAgIC8vVGhlIHJvdW5kbmVzcyBvZiB0aGUgY2FsY3VsYXRlZCBjaXJjdWxhciBlZGdlLgorICAgIGRvdWJsZSAgICAgYXZnU3RyZW5ndGg7ICAgICAgLy9BdmVyYWdlIHN0cmVuZ3RoIG9mIHRoZSBlZ2RlIGZvdW5kLgorICAgIGRvdWJsZSAgICAgYXZnU05SOyAgICAgICAgICAgLy9BdmVyYWdlIFNOUihTaWduYWwgdG8gTm9pc2UgUmF0aW8pIGZvciB0aGUgZWRnZSBmb3VuZC4KKyAgICBpbnQgICAgICAgIGNpcmNsZUZvdW5kOyAgICAgIC8vSWYgdGhlIGNpcmNsdWxhciBlZGdlIGlzIGZvdW5kIG9yIG5vdC4KK30gRmluZENpcmN1bGFyRWRnZVJlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgV2luZG93U2l6ZV9zdHJ1Y3QgeworICAgIGludCB4OyAgICAgICAgLy9XaW5kb3cgbGVuZ2h0IG9uIFggZGlyZWN0aW9uLgorICAgIGludCB5OyAgICAgICAgLy9XaW5kb3cgbGVuZ2h0IG9uIFkgZGlyZWN0aW9uLgorICAgIGludCBzdGVwU2l6ZTsgLy9EaXN0YW5jZSBiZXR3ZWVuIHdpbmRvd3MuCit9IFdpbmRvd1NpemU7CisKK3R5cGVkZWYgc3RydWN0IERpc3BsYWNlbWVudFZlY3Rvcl9zdHJ1Y3QgeworICAgIGludCB4OyAvL2xlbmd0aCBvbiBYIGRpcmVjdGlvbi4KKyAgICBpbnQgeTsgLy9sZW5ndGggb24gWSBkaXJlY3Rpb24uCit9IERpc3BsYWNlbWVudFZlY3RvcjsKKwordHlwZWRlZiBzdHJ1Y3QgV2F2ZWxldE9wdGlvbnNfc3RydWN0IHsKKyAgICBXYXZlbGV0VHlwZSB0eXBlT2ZXYXZlbGV0OyAvL1R5cGUgb2Ygd2F2ZWxldChkYiwgYmlvci4KKyAgICBmbG9hdCAgICAgICBtaW5FbmVyZ3k7ICAgICAvL01pbmltdW0gRW5lcmd5IGluIHRoZSBiYW5kcyB0byBjb25zaWRlciBmb3IgdGV4dHVyZSBkZWZlY3QgZGV0ZWN0aW9uLgorfSBXYXZlbGV0T3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgQ29vY2N1cnJlbmNlT3B0aW9uc19zdHJ1Y3QgeworICAgIGludCAgICAgICAgICAgICAgICBsZXZlbDsgICAgICAgIC8vTGV2ZWwvc2l6ZSBvZiBtYXRyaXguCisgICAgRGlzcGxhY2VtZW50VmVjdG9yIGRpc3BsYWNlbWVudDsgLy9EaXNwbGFjZW1uZXQgYmV0d2VlbiBwaXhlbHMgdG8gYWNjdW11bGF0ZSB0aGUgbWF0cml4LgorfSBDb29jY3VycmVuY2VPcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBQYXJ0aWNsZUNsYXNzaWZpZXJMb2NhbFRocmVzaG9sZE9wdGlvbnNfc3RydWN0IHsKKyAgICBMb2NhbFRocmVzaG9sZE1ldGhvZCBtZXRob2Q7ICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBsb2NhbCB0aHJlc2hvbGRpbmcgbWV0aG9kIHRoZSBmdW5jdGlvbiB1c2VzLgorICAgIFBhcnRpY2xlVHlwZSAgICAgICAgIHBhcnRpY2xlVHlwZTsgICAgLy9TcGVjaWZpZXMgd2hhdCBraW5kIG9mIHBhcnRpY2xlcyB0byBsb29rIGZvci4KKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICB3aW5kb3dXaWR0aDsgICAgIC8vVGhlIHdpZHRoIG9mIHRoZSByZWN0YW5ndWxhciB3aW5kb3cgYXJvdW5kIHRoZSBwaXhlbCBvbiB3aGljaCB0aGUgZnVuY3Rpb24gcGVyZm9ybXMgdGhlIGxvY2FsIHRocmVzaG9sZC4KKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICB3aW5kb3dIZWlnaHQ7ICAgIC8vVGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ3VsYXIgd2luZG93IGFyb3VuZCB0aGUgcGl4ZWwgb24gd2hpY2ggdGhlIGZ1bmN0aW9uIHBlcmZvcm1zIHRoZSBsb2NhbCB0aHJlc2hvbGQuCisgICAgZG91YmxlICAgICAgICAgICAgICAgZGV2aWF0aW9uV2VpZ2h0OyAvL1NwZWNpZmllcyB0aGUgayBjb25zdGFudCB1c2VkIGluIHRoZSBOaWJsYWNrIGxvY2FsIHRocmVzaG9sZGluZyBhbGdvcml0aG0sIHdoaWNoIGRldGVybWluZXMgdGhlIHdlaWdodCBhcHBsaWVkIHRvIHRoZSB2YXJpYW5jZSBjYWxjdWxhdGlvbi4KK30gUGFydGljbGVDbGFzc2lmaWVyTG9jYWxUaHJlc2hvbGRPcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBSYW5nZUZsb2F0X3N0cnVjdCB7CisgICAgZmxvYXQgbWluVmFsdWU7IC8vVGhlIG1pbmltdW0gdmFsdWUgb2YgdGhlIHJhbmdlLgorICAgIGZsb2F0IG1heFZhbHVlOyAvL1RoZSBtYXhpbXVtIHZhbHVlIG9mIHRoZSByYW5nZS4KK30gUmFuZ2VGbG9hdDsKKwordHlwZWRlZiBzdHJ1Y3QgUGFydGljbGVDbGFzc2lmaWVyQXV0b1RocmVzaG9sZE9wdGlvbnNfc3RydWN0IHsKKyAgICBUaHJlc2hvbGRNZXRob2QgbWV0aG9kOyAgICAgICAvL1RoZSBtZXRob2QgZm9yIGJpbmFyeSB0aHJlc2hvbGRpbmcsIHdoaWNoIHNwZWNpZmllcyBob3cgdG8gY2FsY3VsYXRlIHRoZSBjbGFzc2VzLgorICAgIFBhcnRpY2xlVHlwZSAgICBwYXJ0aWNsZVR5cGU7IC8vU3BlY2lmaWVzIHdoYXQga2luZCBvZiBwYXJ0aWNsZXMgdG8gbG9vayBmb3IuCisgICAgUmFuZ2VGbG9hdCAgICAgIGxpbWl0czsgICAgICAgLy9UaGUgbGltaXRzIG9uIHRoZSBhdXRvbWF0aWMgdGhyZXNob2xkIHJhbmdlLgorfSBQYXJ0aWNsZUNsYXNzaWZpZXJBdXRvVGhyZXNob2xkT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgUGFydGljbGVDbGFzc2lmaWVyUHJlcHJvY2Vzc2luZ09wdGlvbnMyX3N0cnVjdCB7CisgICAgUGFydGljbGVDbGFzc2lmaWVyVGhyZXNob2xkVHlwZSAgICAgICAgIHRocmVzaG9sZFR5cGU7ICAgICAgICAgLy9UaGUgdHlwZSBvZiB0aHJlc2hvbGQgdG8gcGVyZm9ybSBvbiB0aGUgaW1hZ2UuCisgICAgUmFuZ2VGbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbnVhbFRocmVzaG9sZFJhbmdlOyAgLy9UaGUgcmFuZ2Ugb2YgcGl4ZWxzIHRvIGtlZXAgaWYgbWFudWFsbHkgdGhyZXNob2xkaW5nIHRoZSBpbWFnZS4KKyAgICBQYXJ0aWNsZUNsYXNzaWZpZXJBdXRvVGhyZXNob2xkT3B0aW9ucyAgYXV0b1RocmVzaG9sZE9wdGlvbnM7ICAvL1RoZSBvcHRpb25zIHVzZWQgdG8gYXV0byB0aHJlc2hvbGQgdGhlIGltYWdlLgorICAgIFBhcnRpY2xlQ2xhc3NpZmllckxvY2FsVGhyZXNob2xkT3B0aW9ucyBsb2NhbFRocmVzaG9sZE9wdGlvbnM7IC8vVGhlIG9wdGlvbnMgdXNlZCB0byBsb2NhbCB0aHJlc2hvbGQgdGhlIGltYWdlLgorICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3RCb3JkZXI7ICAgICAgICAgIC8vU2V0IHRoaXMgZWxlbWVudCB0byBUUlVFIHRvIHJlamVjdCBib3JkZXIgcGFydGljbGVzLgorICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1Fcm9zaW9uczsgICAgICAgICAgIC8vVGhlIG51bWJlciBvZiBlcm9zaW9ucyB0byBwZXJmb3JtLgorfSBQYXJ0aWNsZUNsYXNzaWZpZXJQcmVwcm9jZXNzaW5nT3B0aW9uczI7CisKK3R5cGVkZWYgc3RydWN0IE1lYXN1cmVQYXJ0aWNsZXNSZXBvcnRfc3RydWN0IHsKKyAgICBkb3VibGUqKiBwaXhlbE1lYXN1cmVtZW50czsgICAgICAvL1RoZSBtZWFzdXJlbWVudHMgb24gdGhlIHBhcnRpY2xlcyBpbiB0aGUgaW1hZ2UsIGluIHBpeGVsIGNvb3JkaW5hdGVzLgorICAgIGRvdWJsZSoqIGNhbGlicmF0ZWRNZWFzdXJlbWVudHM7IC8vVGhlIG1lYXN1cmVtZW50cyBvbiB0aGUgcGFydGljbGVzIGluIHRoZSBpbWFnZSwgaW4gcmVhbC13b3JsZCBjb29yZGluYXRlcy4KKyAgICBzaXplX3QgICBudW1QYXJ0aWNsZXM7ICAgICAgICAgICAvL1RoZSBudW1iZXIgb2YgcGFydGljbGVzIG9uIHdoaWNoIG1lYXN1cmVtZW50cyB3ZXJlIHRha2VuLgorICAgIHNpemVfdCAgIG51bU1lYXN1cmVtZW50czsgICAgICAgIC8vVGhlIG51bWJlciBvZiBtZWFzdXJlbWVudHMgdGFrZW4uCit9IE1lYXN1cmVQYXJ0aWNsZXNSZXBvcnQ7CisKK3R5cGVkZWYgc3RydWN0IEdlb21ldHJpY1BhdHRlcm5NYXRjaDNfc3RydWN0IHsKKyAgICBQb2ludEZsb2F0IHBvc2l0aW9uOyAgICAgICAgICAgICAgICAvL1RoZSBsb2NhdGlvbiBvZiB0aGUgb3JpZ2luIG9mIHRoZSB0ZW1wbGF0ZSBpbiB0aGUgbWF0Y2guCisgICAgZmxvYXQgICAgICByb3RhdGlvbjsgICAgICAgICAgICAgICAgLy9UaGUgcm90YXRpb24gb2YgdGhlIG1hdGNoIHJlbGF0aXZlIHRvIHRoZSB0ZW1wbGF0ZSBpbWFnZSwgaW4gZGVncmVlcy4KKyAgICBmbG9hdCAgICAgIHNjYWxlOyAgICAgICAgICAgICAgICAgICAvL1RoZSBzaXplIG9mIHRoZSBtYXRjaCByZWxhdGl2ZSB0byB0aGUgc2l6ZSBvZiB0aGUgdGVtcGxhdGUgaW1hZ2UsIGV4cHJlc3NlZCBhcyBhIHBlcmNlbnRhZ2UuCisgICAgZmxvYXQgICAgICBzY29yZTsgICAgICAgICAgICAgICAgICAgLy9UaGUgYWNjdXJhY3kgb2YgdGhlIG1hdGNoLgorICAgIFBvaW50RmxvYXQgY29ybmVyWzRdOyAgICAgICAgICAgICAgIC8vQW4gYXJyYXkgb2YgZm91ciBwb2ludHMgZGVzY3JpYmluZyB0aGUgcmVjdGFuZ2xlIHN1cnJvdW5kaW5nIHRoZSB0ZW1wbGF0ZSBpbWFnZS4KKyAgICBpbnQgICAgICAgIGludmVyc2U7ICAgICAgICAgICAgICAgICAvL1RoaXMgZWxlbWVudCBpcyBUUlVFIGlmIHRoZSBtYXRjaCBpcyBhbiBpbnZlcnNlIG9mIHRoZSB0ZW1wbGF0ZSBpbWFnZS4KKyAgICBmbG9hdCAgICAgIG9jY2x1c2lvbjsgICAgICAgICAgICAgICAvL1RoZSBwZXJjZW50YWdlIG9mIHRoZSBtYXRjaCB0aGF0IGlzIG9jY2x1ZGVkLgorICAgIGZsb2F0ICAgICAgdGVtcGxhdGVNYXRjaEN1cnZlU2NvcmU7IC8vVGhlIGFjY3VyYWN5IG9mIHRoZSBtYXRjaCBvYnRhaW5lZCBieSBjb21wYXJpbmcgdGhlIHRlbXBsYXRlIGN1cnZlcyB0byB0aGUgY3VydmVzIGluIHRoZSBtYXRjaCByZWdpb24uCisgICAgZmxvYXQgICAgICBtYXRjaFRlbXBsYXRlQ3VydmVTY29yZTsgLy9UaGUgYWNjdXJhY3kgb2YgdGhlIG1hdGNoIG9idGFpbmVkIGJ5IGNvbXBhcmluZyB0aGUgY3VydmVzIGluIHRoZSBtYXRjaCByZWdpb24gdG8gdGhlIHRlbXBsYXRlIGN1cnZlcy4KKyAgICBmbG9hdCAgICAgIGNvcnJlbGF0aW9uU2NvcmU7ICAgICAgICAvL1RoZSBhY2N1cmFjeSBvZiB0aGUgbWF0Y2ggb2J0YWluZWQgYnkgY29tcGFyaW5nIHRoZSB0ZW1wbGF0ZSBpbWFnZSB0byB0aGUgbWF0Y2ggcmVnaW9uIHVzaW5nIGEgY29ycmVsYXRpb24gbWV0cmljIHRoYXQgY29tcGFyZXMgdGhlIHR3byByZWdpb25zIGFzIGEgZnVuY3Rpb24gb2YgdGhlaXIgcGl4ZWwgdmFsdWVzLgorICAgIFBvaW50RmxvYXQgY2FsaWJyYXRlZFBvc2l0aW9uOyAgICAgIC8vVGhlIGxvY2F0aW9uIG9mIHRoZSBvcmlnaW4gb2YgdGhlIHRlbXBsYXRlIGluIHRoZSBtYXRjaC4KKyAgICBmbG9hdCAgICAgIGNhbGlicmF0ZWRSb3RhdGlvbjsgICAgICAvL1RoZSByb3RhdGlvbiBvZiB0aGUgbWF0Y2ggcmVsYXRpdmUgdG8gdGhlIHRlbXBsYXRlIGltYWdlLCBpbiBkZWdyZWVzLgorICAgIFBvaW50RmxvYXQgY2FsaWJyYXRlZENvcm5lcls0XTsgICAgIC8vQW4gYXJyYXkgb2YgZm91ciBwb2ludHMgZGVzY3JpYmluZyB0aGUgcmVjdGFuZ2xlIHN1cnJvdW5kaW5nIHRoZSB0ZW1wbGF0ZSBpbWFnZS4KK30gR2VvbWV0cmljUGF0dGVybk1hdGNoMzsKKwordHlwZWRlZiBzdHJ1Y3QgTWF0Y2hHZW9tZXRyaWNQYXR0ZXJuQWR2YW5jZWRPcHRpb25zM19zdHJ1Y3QgeworICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICAgICAgc3VicGl4ZWxJdGVyYXRpb25zOyAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpbmNyZW1lbnRhbCBpbXByb3ZlbWVudHMgdXNlZCB0byByZWZpbmUgbWF0Y2hlcyB3aXRoIHN1YnBpeGVsIGluZm9ybWF0aW9uLgorICAgIGRvdWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgc3VicGl4ZWxUb2xlcmFuY2U7ICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBjaGFuZ2UsIGluIHBpeGVscywgYmV0d2VlbiBjb25zZWN1dGl2ZSBpbmNyZW1lbnRhbCBpbXByb3ZlbWVudHMgaW4gdGhlIG1hdGNoIHBvc2l0aW9uIGJlZm9yZSB0aGUgZnVuY3Rpb24gc3RvcHMgcmVmaW5pbmcgdGhlIG1hdGNoIHBvc2l0aW9uLgorICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE1hdGNoTGlzdExlbmd0aDsgICAgIC8vU3BlY2lmaWVzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIG1hdGNoIGxpc3QuCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRUZW1wbGF0ZUN1cnZlU2NvcmU7ICAgLy9TZXQgdGhpcyBlbGVtZW50IHRvIFRSVUUgdG8gc3BlY2lmeSB0aGF0IHRoZSBmdW5jdGlvbiBzaG91bGQgY2FsY3VsYXRlIHRoZSBtYXRjaCBjdXJ2ZSB0byB0ZW1wbGF0ZSBjdXJ2ZSBzY29yZSBhbmQgcmV0dXJuIGl0IGZvciBlYWNoIG1hdGNoIHJlc3VsdC4KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uU2NvcmU7ICAgICAgICAgICAvL1NldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSB0byBzcGVjaWZ5IHRoYXQgdGhlIGZ1bmN0aW9uIHNob3VsZCBjYWxjdWxhdGUgdGhlIGNvcnJlbGF0aW9uIHNjb3JlIGFuZCByZXR1cm4gaXQgZm9yIGVhY2ggbWF0Y2ggcmVzdWx0LgorICAgIGRvdWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgbWluTWF0Y2hTZXBhcmF0aW9uRGlzdGFuY2U7IC8vU3BlY2lmaWVzIHRoZSBtaW5pbXVtIHNlcGFyYXRpb24gZGlzdGFuY2UsIGluIHBpeGVscywgYmV0d2VlbiB0aGUgb3JpZ2lucyBvZiB0d28gbWF0Y2hlcyB0aGF0IGhhdmUgdW5pcXVlIHBvc2l0aW9ucy4KKyAgICBkb3VibGUgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk1hdGNoU2VwYXJhdGlvbkFuZ2xlOyAgICAvL1NwZWNpZmllcyB0aGUgbWluaW11bSBhbmd1bGFyIGRpZmZlcmVuY2UsIGluIGRlZ3JlZXMsIGJldHdlZW4gdHdvIG1hdGNoZXMgdGhhdCBoYXZlIHVuaXF1ZSBhbmdsZXMuCisgICAgZG91YmxlICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5NYXRjaFNlcGFyYXRpb25TY2FsZTsgICAgLy9TcGVjaWZpZXMgdGhlIG1pbmltdW0gZGlmZmVyZW5jZSBpbiBzY2FsZSwgZXhwcmVzc2VkIGFzIGEgcGVyY2VudGFnZSwgYmV0d2VlbiB0d28gbWF0Y2hlcyB0aGF0IGhhdmUgdW5pcXVlIHNjYWxlcy4KKyAgICBkb3VibGUgICAgICAgICAgICAgICAgICAgICAgICAgIG1heE1hdGNoT3ZlcmxhcDsgICAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgbWF4aW11bSBhbW91bnQgb2Ygb3ZlcmxhcCwgZXhwcmVzc2VkIGFzIGEgcGVyY2VudGFnZSwgYWxsb3dlZCBiZXR3ZWVuIHRoZSBib3VuZGluZyByZWN0YW5nbGVzIG9mIHR3byB1bmlxdWUgbWF0Y2hlcy4KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvYXJzZVJlc3VsdDsgICAgICAgICAgICAgICAvL1NwZWNpZmllcyB3aGV0aGVyIHlvdSB3YW50IHRoZSBmdW5jdGlvbiB0byBzcGVuZCBsZXNzIHRpbWUgYWNjdXJhdGVseSBlc3RpbWF0aW5nIHRoZSBsb2NhdGlvbiBvZiBhIG1hdGNoLgorICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlQ2FsaWJyYXRpb25TdXBwb3J0OyAgIC8vU2V0IHRoaXMgZWxlbWVudCB0byBUUlVFIHRvIHNwZWNpZnkgdGhlIGFsZ29yaXRobSB0cmVhdCB0aGUgaW5zcGVjdGlvbiBpbWFnZSBhcyBhIGNhbGlicmF0ZWQgaW1hZ2UuCisgICAgQ29udHJhc3RNb2RlICAgICAgICAgICAgICAgICAgICBlbmFibGVDb250cmFzdFJldmVyc2FsOyAgICAgLy9Vc2UgdGhpcyBlbGVtZW50IHRvIHNwZWNpZnkgdGhlIGNvbnRyYXN0IG9mIHRoZSBtYXRjaGVzIHRvIHNlYXJjaCBmb3IgaW4gdGhlIGltYWdlLgorICAgIEdlb21ldHJpY01hdGNoaW5nU2VhcmNoU3RyYXRlZ3kgbWF0Y2hTdHJhdGVneTsgICAgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBhZ2dyZXNzaXZlbmVzcyBvZiB0aGUgc2VhcmNoIHN0cmF0ZWd5LgorICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICAgICAgcmVmaW5lTWF0Y2hGYWN0b3I7ICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBmYWN0b3IgdGhhdCBpcyBhcHBsaWVkIHRvIHRoZSBudW1iZXIgb2YgbWF0Y2hlcyByZXF1ZXN0ZWQgYnkgdGhlIHVzZXIgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgbWF0Y2hlcyB0aGF0IGFyZSByZWZpbmVkIGF0IHRoZSBpbml0aWFsIG1hdGNoaW5nIHN0YWdlLgorICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICAgICAgc3VicGl4ZWxNYXRjaEZhY3RvcjsgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBmYWN0b3IgdGhhdCBpcyBhcHBsaWVkIHRvIHRoZSBudW1iZXIgb2YgbWF0Y2hlcyByZXF1ZXN0ZWQgYnkgdGhlIHVzZXIgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgbWF0Y2hlcyB0aGF0IGFyZSBldmFsdWF0ZWQgYXQgdGhlIGZpbmFsIHN1YnBpeGVsIG1hdGNoaW5nIHN0YWdlLgorfSBNYXRjaEdlb21ldHJpY1BhdHRlcm5BZHZhbmNlZE9wdGlvbnMzOworCit0eXBlZGVmIHN0cnVjdCBDb2xvck9wdGlvbnNfc3RydWN0IHsKKyAgICBDb2xvckNsYXNzaWZpY2F0aW9uUmVzb2x1dGlvbiBjb2xvckNsYXNzaWZpY2F0aW9uUmVzb2x1dGlvbjsgLy9TcGVjaWZpZXMgdGhlIGNvbG9yIHJlc29sdXRpb24gb2YgdGhlIGNsYXNzaWZpZXIuCisgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgICAgdXNlTHVtaW5hbmNlOyAgICAgICAgICAgICAgICAgIC8vU3BlY2lmaWVzIGlmIHRoZSBsdW1pbmFuY2UgYmFuZCBpcyBnb2luZyB0byBiZSB1c2VkIGluIHRoZSBmZWF0dXJlIHZlY3Rvci4KKyAgICBDb2xvck1vZGUgICAgICAgICAgICAgICAgICAgICBjb2xvck1vZGU7ICAgICAgICAgICAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGNvbG9yIG1vZGUgb2YgdGhlIGNsYXNzaWZpZXIuCit9IENvbG9yT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgU2FtcGxlU2NvcmVfc3RydWN0IHsKKyAgICBjaGFyKiAgICAgICAgY2xhc3NOYW1lOyAvL1RoZSBuYW1lIG9mIHRoZSBjbGFzcy4KKyAgICBmbG9hdCAgICAgICAgZGlzdGFuY2U7ICAvL1RoZSBkaXN0YW5jZSBmcm9tIHRoZSBpdGVtIHRvIHRoaXMgY2xhc3MuCisgICAgdW5zaWduZWQgaW50IGluZGV4OyAgICAgLy9pbmRleCBvZiB0aGlzIHNhbXBsZS4KK30gU2FtcGxlU2NvcmU7CisKK3R5cGVkZWYgc3RydWN0IENsYXNzaWZpZXJSZXBvcnRBZHZhbmNlZF9zdHJ1Y3QgeworICAgIGNoYXIqICAgICAgICBiZXN0Q2xhc3NOYW1lOyAgICAgICAvL1RoZSBuYW1lIG9mIHRoZSBiZXN0IGNsYXNzIGZvciB0aGUgc2FtcGxlLgorICAgIGZsb2F0ICAgICAgICBjbGFzc2lmaWNhdGlvblNjb3JlOyAvL1RoZSBzaW1pbGFyaXR5IG9mIHRoZSBzYW1wbGUgYW5kIHRoZSB0d28gY2xvc2VzdCBjbGFzc2VzIGluIHRoZSBjbGFzc2lmaWVyLgorICAgIGZsb2F0ICAgICAgICBpZGVudGlmaWNhdGlvblNjb3JlOyAvL1RoZSBzaW1pbGFyaXR5IG9mIHRoZSBzYW1wbGUgYW5kIHRoZSBhc3NpZ25lZCBjbGFzcy4KKyAgICBDbGFzc1Njb3JlKiAgYWxsU2NvcmVzOyAgICAgICAgICAgLy9BbGwgY2xhc3NlcyBhbmQgdGhlaXIgc2NvcmVzLgorICAgIGludCAgICAgICAgICBhbGxTY29yZXNTaXplOyAgICAgICAvL1RoZSBudW1iZXIgb2YgZW50cmllcyBpbiBhbGxTY29yZXMuCisgICAgU2FtcGxlU2NvcmUqIHNhbXBsZVNjb3JlczsgICAgICAgIC8vQWxsIHNhbXBsZXMgYW5kIHRoZWlyIHNjb3Jlcy4KKyAgICBpbnQgICAgICAgICAgc2FtcGxlU2NvcmVzU2l6ZTsgICAgLy9UaGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gc2FtcGxlU2NvcmVzLgorfSBDbGFzc2lmaWVyUmVwb3J0QWR2YW5jZWQ7CisKK3R5cGVkZWYgc3RydWN0IExlYXJuR2VvbWV0cmljUGF0dGVybkFkdmFuY2VkT3B0aW9uczJfc3RydWN0IHsKKyAgICBkb3VibGUgICAgICAgbWluU2NhbGVGYWN0b3I7ICAgICAgICAvL1NwZWNpZmllcyB0aGUgbWluaW11bSBzY2FsZSBmYWN0b3IgdGhhdCB0aGUgdGVtcGxhdGUgaXMgbGVhcm5lZCBmb3IuCisgICAgZG91YmxlICAgICAgIG1heFNjYWxlRmFjdG9yOyAgICAgICAgLy9TcGVjaWZpZXMgdGhlIG1heGltdW0gc2NhbGUgZmFjdG9yIHRoZSB0ZW1wbGF0ZSBpcyBsZWFybmVkIGZvci4KKyAgICBkb3VibGUgICAgICAgbWluUm90YXRpb25BbmdsZVZhbHVlOyAvL1NwZWNpZmllcyB0aGUgbWluaW11bSByb3RhdGlvbiBhbmdsZSB0aGUgdGVtcGxhdGUgaXMgbGVhcm5lZCBmb3IuCisgICAgZG91YmxlICAgICAgIG1heFJvdGF0aW9uQW5nbGVWYWx1ZTsgLy9TcGVjaWZpZXMgdGhlIG1heGltdW0gcm90YXRpb24gYW5nbGUgdGhlIHRlbXBsYXRlIGlzIGxlYXJuZWQgZm9yLgorICAgIHVuc2lnbmVkIGludCBpbWFnZVNhbXBsaW5nRmFjdG9yOyAgIC8vU3BlY2lmaWVzIHRoZSBmYWN0b3IgdGhhdCBpcyB1c2VkIHRvIHN1YnNhbXBsZSB0aGUgdGVtcGxhdGUgYW5kIHRoZSBpbWFnZSBmb3IgdGhlIGluaXRpYWwgbWF0Y2hpbmcgcGhhc2UuCit9IExlYXJuR2VvbWV0cmljUGF0dGVybkFkdmFuY2VkT3B0aW9uczI7CisKK3R5cGVkZWYgc3RydWN0IFBhcnRpY2xlRmlsdGVyT3B0aW9uczJfc3RydWN0IHsKKyAgICBpbnQgcmVqZWN0TWF0Y2hlczsgLy9TZXQgdGhpcyBwYXJhbWV0ZXIgdG8gVFJVRSB0byB0cmFuc2ZlciBvbmx5IHRob3NlIHBhcnRpY2xlcyB0aGF0IGRvIG5vdCBtZWV0IGFsbCB0aGUgY3JpdGVyaWEuCisgICAgaW50IHJlamVjdEJvcmRlcjsgIC8vU2V0IHRoaXMgZWxlbWVudCB0byBUUlVFIHRvIHJlamVjdCBib3JkZXIgcGFydGljbGVzLgorICAgIGludCBmaWxsSG9sZXM7ICAgICAvL1NldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSB0byBmaWxsIGhvbGVzIGluIHBhcnRpY2xlcy4KKyAgICBpbnQgY29ubmVjdGl2aXR5ODsgLy9TZXQgdGhpcyBwYXJhbWV0ZXIgdG8gVFJVRSB0byB1c2UgY29ubmVjdGl2aXR5LTggdG8gZGV0ZXJtaW5lIHdoZXRoZXIgcGFydGljbGVzIGFyZSB0b3VjaGluZy4KK30gUGFydGljbGVGaWx0ZXJPcHRpb25zMjsKKwordHlwZWRlZiBzdHJ1Y3QgRmluZEVkZ2VPcHRpb25zMl9zdHJ1Y3QgeworICAgIFJha2VEaXJlY3Rpb24gZGlyZWN0aW9uOyAgICAgICAgLy9UaGUgZGlyZWN0aW9uIHRvIHNlYXJjaCBpbiB0aGUgUk9JLgorICAgIGludCAgICAgICAgICAgc2hvd1NlYXJjaEFyZWE7ICAgLy9JZiBUUlVFLCB0aGUgZnVuY3Rpb24gb3ZlcmxheXMgdGhlIHNlYXJjaCBhcmVhIG9uIHRoZSBpbWFnZS4KKyAgICBpbnQgICAgICAgICAgIHNob3dTZWFyY2hMaW5lczsgIC8vSWYgVFJVRSwgdGhlIGZ1bmN0aW9uIG92ZXJsYXlzIHRoZSBzZWFyY2ggbGluZXMgdXNlZCB0byBsb2NhdGUgdGhlIGVkZ2VzIG9uIHRoZSBpbWFnZS4KKyAgICBpbnQgICAgICAgICAgIHNob3dFZGdlc0ZvdW5kOyAgIC8vSWYgVFJVRSwgdGhlIGZ1bmN0aW9uIG92ZXJsYXlzIHRoZSBsb2NhdGlvbnMgb2YgdGhlIGVkZ2VzIGZvdW5kIG9uIHRoZSBpbWFnZS4KKyAgICBpbnQgICAgICAgICAgIHNob3dSZXN1bHQ7ICAgICAgIC8vSWYgVFJVRSwgdGhlIGZ1bmN0aW9uIG92ZXJsYXlzIHRoZSBoaXQgbGluZXMgdG8gdGhlIG9iamVjdCBhbmQgdGhlIGVkZ2UgdXNlZCB0byBnZW5lcmF0ZSB0aGUgaGl0IGxpbmUgb24gdGhlIHJlc3VsdCBpbWFnZS4KKyAgICBSR0JWYWx1ZSAgICAgIHNlYXJjaEFyZWFDb2xvcjsgIC8vU3BlY2lmaWVzIHRoZSBSR0IgY29sb3IgdmFsdWUgdG8gdXNlIHRvIG92ZXJsYXkgdGhlIHNlYXJjaCBhcmVhLgorICAgIFJHQlZhbHVlICAgICAgc2VhcmNoTGluZXNDb2xvcjsgLy9TcGVjaWZpZXMgdGhlIFJHQiBjb2xvciB2YWx1ZSB0byB1c2UgdG8gb3ZlcmxheSB0aGUgc2VhcmNoIGxpbmVzLgorICAgIFJHQlZhbHVlICAgICAgc2VhcmNoRWRnZXNDb2xvcjsgLy9TcGVjaWZpZXMgdGhlIFJHQiBjb2xvciB2YWx1ZSB0byB1c2UgdG8gb3ZlcmxheSB0aGUgc2VhcmNoIGVkZ2VzLgorICAgIFJHQlZhbHVlICAgICAgcmVzdWx0Q29sb3I7ICAgICAgLy9TcGVjaWZpZXMgdGhlIFJHQiBjb2xvciB2YWx1ZSB0byB1c2UgdG8gb3ZlcmxheSB0aGUgcmVzdWx0cy4KKyAgICBjaGFyKiAgICAgICAgIG92ZXJsYXlHcm91cE5hbWU7IC8vU3BlY2lmaWVzIHRoZSBvdmVybGF5IGdyb3VwIG5hbWUgdG8gYXNzaWduIHRvIHRoZSBvdmVybGF5cy4KKyAgICBFZGdlT3B0aW9uczIgIGVkZ2VPcHRpb25zOyAgICAgIC8vU3BlY2lmaWVzIHRoZSBlZGdlIGRldGVjdGlvbiBvcHRpb25zIGFsb25nIGEgc2luZ2xlIHNlYXJjaCBsaW5lLgorfSBGaW5kRWRnZU9wdGlvbnMyOworCit0eXBlZGVmIHN0cnVjdCBGaW5kRWRnZVJlcG9ydF9zdHJ1Y3QgeworICAgIFN0cmFpZ2h0RWRnZSogc3RyYWlnaHRFZGdlczsgICAgLy9BbiBhcnJheSBvZiBzdHJhaWdodCBlZGdlcyBkZXRlY3RlZC4KKyAgICB1bnNpZ25lZCBpbnQgIG51bVN0cmFpZ2h0RWRnZXM7IC8vSW5kaWNhdGVzIHRoZSBudW1iZXIgb2Ygc3RyYWlnaHQgZWRnZXMgZm91bmQuCit9IEZpbmRFZGdlUmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBGaW5kVHJhbnNmb3JtUmVjdE9wdGlvbnMyX3N0cnVjdCB7CisgICAgRmluZFJlZmVyZW5jZURpcmVjdGlvbiBkaXJlY3Rpb247ICAgICAgICAvL1NwZWNpZmllcyB0aGUgZGlyZWN0aW9uIGFuZCBvcmllbnRhdGlvbiBpbiB3aGljaCB0aGUgZnVuY3Rpb24gc2VhcmNoZXMgZm9yIHRoZSBwcmltYXJ5IGF4aXMuCisgICAgaW50ICAgICAgICAgICAgICAgICAgICBzaG93U2VhcmNoQXJlYTsgICAvL0lmIFRSVUUsIHRoZSBmdW5jdGlvbiBvdmVybGF5cyB0aGUgc2VhcmNoIGFyZWEgb24gdGhlIGltYWdlLgorICAgIGludCAgICAgICAgICAgICAgICAgICAgc2hvd1NlYXJjaExpbmVzOyAgLy9JZiBUUlVFLCB0aGUgZnVuY3Rpb24gb3ZlcmxheXMgdGhlIHNlYXJjaCBsaW5lcyB1c2VkIHRvIGxvY2F0ZSB0aGUgZWRnZXMgb24gdGhlIGltYWdlLgorICAgIGludCAgICAgICAgICAgICAgICAgICAgc2hvd0VkZ2VzRm91bmQ7ICAgLy9JZiBUUlVFLCB0aGUgZnVuY3Rpb24gb3ZlcmxheXMgdGhlIGxvY2F0aW9ucyBvZiB0aGUgZWRnZXMgZm91bmQgb24gdGhlIGltYWdlLgorICAgIGludCAgICAgICAgICAgICAgICAgICAgc2hvd1Jlc3VsdDsgICAgICAgLy9JZiBUUlVFLCB0aGUgZnVuY3Rpb24gb3ZlcmxheXMgdGhlIGhpdCBsaW5lcyB0byB0aGUgb2JqZWN0IGFuZCB0aGUgZWRnZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBoaXQgbGluZSBvbiB0aGUgcmVzdWx0IGltYWdlLgorICAgIFJHQlZhbHVlICAgICAgICAgICAgICAgc2VhcmNoQXJlYUNvbG9yOyAgLy9TcGVjaWZpZXMgdGhlIFJHQiBjb2xvciB2YWx1ZSB0byB1c2UgdG8gb3ZlcmxheSB0aGUgc2VhcmNoIGFyZWEuCisgICAgUkdCVmFsdWUgICAgICAgICAgICAgICBzZWFyY2hMaW5lc0NvbG9yOyAvL1NwZWNpZmllcyB0aGUgUkdCIGNvbG9yIHZhbHVlIHRvIHVzZSB0byBvdmVybGF5IHRoZSBzZWFyY2ggbGluZXMuCisgICAgUkdCVmFsdWUgICAgICAgICAgICAgICBzZWFyY2hFZGdlc0NvbG9yOyAvL1NwZWNpZmllcyB0aGUgUkdCIGNvbG9yIHZhbHVlIHRvIHVzZSB0byBvdmVybGF5IHRoZSBzZWFyY2ggZWRnZXMuCisgICAgUkdCVmFsdWUgICAgICAgICAgICAgICByZXN1bHRDb2xvcjsgICAgICAvL1NwZWNpZmllcyB0aGUgUkdCIGNvbG9yIHZhbHVlIHRvIHVzZSB0byBvdmVybGF5IHRoZSByZXN1bHRzLgorICAgIGNoYXIqICAgICAgICAgICAgICAgICAgb3ZlcmxheUdyb3VwTmFtZTsgLy9TcGVjaWZpZXMgdGhlIG92ZXJsYXkgZ3JvdXAgbmFtZSB0byBhc3NpZ24gdG8gdGhlIG92ZXJsYXlzLgorICAgIEVkZ2VPcHRpb25zMiAgICAgICAgICAgZWRnZU9wdGlvbnM7ICAgICAgLy9TcGVjaWZpZXMgdGhlIGVkZ2UgZGV0ZWN0aW9uIG9wdGlvbnMgYWxvbmcgYSBzaW5nbGUgc2VhcmNoIGxpbmUuCit9IEZpbmRUcmFuc2Zvcm1SZWN0T3B0aW9uczI7CisKK3R5cGVkZWYgc3RydWN0IEZpbmRUcmFuc2Zvcm1SZWN0c09wdGlvbnMyX3N0cnVjdCB7CisgICAgRmluZFJlZmVyZW5jZURpcmVjdGlvbiBkaXJlY3Rpb247ICAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpcmVjdGlvbiBhbmQgb3JpZW50YXRpb24gaW4gd2hpY2ggdGhlIGZ1bmN0aW9uIHNlYXJjaGVzIGZvciB0aGUgcHJpbWFyeSBheGlzLgorICAgIGludCAgICAgICAgICAgICAgICAgICAgc2hvd1NlYXJjaEFyZWE7ICAgICAgIC8vSWYgVFJVRSwgdGhlIGZ1bmN0aW9uIG92ZXJsYXlzIHRoZSBzZWFyY2ggYXJlYSBvbiB0aGUgaW1hZ2UuCisgICAgaW50ICAgICAgICAgICAgICAgICAgICBzaG93U2VhcmNoTGluZXM7ICAgICAgLy9JZiBUUlVFLCB0aGUgZnVuY3Rpb24gb3ZlcmxheXMgdGhlIHNlYXJjaCBsaW5lcyB1c2VkIHRvIGxvY2F0ZSB0aGUgZWRnZXMgb24gdGhlIGltYWdlLgorICAgIGludCAgICAgICAgICAgICAgICAgICAgc2hvd0VkZ2VzRm91bmQ7ICAgICAgIC8vSWYgVFJVRSwgdGhlIGZ1bmN0aW9uIG92ZXJsYXlzIHRoZSBsb2NhdGlvbnMgb2YgdGhlIGVkZ2VzIGZvdW5kIG9uIHRoZSBpbWFnZS4KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgIHNob3dSZXN1bHQ7ICAgICAgICAgICAvL0lmIFRSVUUsIHRoZSBmdW5jdGlvbiBvdmVybGF5cyB0aGUgaGl0IGxpbmVzIHRvIHRoZSBvYmplY3QgYW5kIHRoZSBlZGdlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGhpdCBsaW5lIG9uIHRoZSByZXN1bHQgaW1hZ2UuCisgICAgUkdCVmFsdWUgICAgICAgICAgICAgICBzZWFyY2hBcmVhQ29sb3I7ICAgICAgLy9TcGVjaWZpZXMgdGhlIFJHQiBjb2xvciB2YWx1ZSB0byB1c2UgdG8gb3ZlcmxheSB0aGUgc2VhcmNoIGFyZWEuCisgICAgUkdCVmFsdWUgICAgICAgICAgICAgICBzZWFyY2hMaW5lc0NvbG9yOyAgICAgLy9TcGVjaWZpZXMgdGhlIFJHQiBjb2xvciB2YWx1ZSB0byB1c2UgdG8gb3ZlcmxheSB0aGUgc2VhcmNoIGxpbmVzLgorICAgIFJHQlZhbHVlICAgICAgICAgICAgICAgc2VhcmNoRWRnZXNDb2xvcjsgICAgIC8vU3BlY2lmaWVzIHRoZSBSR0IgY29sb3IgdmFsdWUgdG8gdXNlIHRvIG92ZXJsYXkgdGhlIHNlYXJjaCBlZGdlcy4KKyAgICBSR0JWYWx1ZSAgICAgICAgICAgICAgIHJlc3VsdENvbG9yOyAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgUkdCIGNvbG9yIHZhbHVlIHRvIHVzZSB0byBvdmVybGF5IHRoZSByZXN1bHRzLgorICAgIGNoYXIqICAgICAgICAgICAgICAgICAgb3ZlcmxheUdyb3VwTmFtZTsgICAgIC8vU3BlY2lmaWVzIHRoZSBvdmVybGF5IGdyb3VwIG5hbWUgdG8gYXNzaWduIHRvIHRoZSBvdmVybGF5cy4KKyAgICBFZGdlT3B0aW9uczIgICAgICAgICAgIHByaW1hcnlFZGdlT3B0aW9uczsgICAvL1NwZWNpZmllcyB0aGUgcGFyYW1ldGVycyB1c2VkIHRvIGNvbXB1dGUgdGhlIGVkZ2UgZ3JhZGllbnQgaW5mb3JtYXRpb24gYW5kIGRldGVjdCB0aGUgZWRnZXMgZm9yIHRoZSBwcmltYXJ5IFJPSS4KKyAgICBFZGdlT3B0aW9uczIgICAgICAgICAgIHNlY29uZGFyeUVkZ2VPcHRpb25zOyAvL1NwZWNpZmllcyB0aGUgcGFyYW1ldGVycyB1c2VkIHRvIGNvbXB1dGUgdGhlIGVkZ2UgZ3JhZGllbnQgaW5mb3JtYXRpb24gYW5kIGRldGVjdCB0aGUgZWRnZXMgZm9yIHRoZSBzZWNvbmRhcnkgUk9JLgorfSBGaW5kVHJhbnNmb3JtUmVjdHNPcHRpb25zMjsKKwordHlwZWRlZiBzdHJ1Y3QgUmVhZFRleHRSZXBvcnQzX3N0cnVjdCB7CisgICAgY29uc3QgY2hhciogIHJlYWRTdHJpbmc7ICAgICAgICAgICAgLy9UaGUgcmVhZCBzdHJpbmcuCisgICAgQ2hhclJlcG9ydDMqIGNoYXJhY3RlclJlcG9ydDsgICAgICAgLy9BbiBhcnJheSBvZiByZXBvcnRzIGRlc2NyaWJpbmcgdGhlIHByb3BlcnRpZXMgb2YgZWFjaCBpZGVudGlmaWVkIGNoYXJhY3Rlci4KKyAgICBpbnQgICAgICAgICAgbnVtQ2hhcmFjdGVyUmVwb3J0czsgICAvL1RoZSBudW1iZXIgb2YgaWRlbnRpZmllZCBjaGFyYWN0ZXJzLgorICAgIFJPSSogICAgICAgICByb2lCb3VuZGluZ0NoYXJhY3RlcnM7IC8vQW4gYXJyYXkgc3BlY2lmeWluZyB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIGNoYXJhY3RlciBib3VuZGluZyBST0kuCit9IFJlYWRUZXh0UmVwb3J0MzsKKwordHlwZWRlZiBzdHJ1Y3QgQ2hhcmFjdGVyU3RhdGlzdGljc19zdHJ1Y3QgeworICAgIGludCBsZWZ0OyAgICAgICAgICAvL1RoZSBsZWZ0IG9mZnNldCBvZiB0aGUgY2hhcmFjdGVyIGJvdW5kaW5nIHJlY3RhbmdsZXMgaW4gdGhlIGN1cnJlbnQgUk9JLgorICAgIGludCB0b3A7ICAgICAgICAgICAvL1RoZSB0b3Agb2Zmc2V0IG9mIHRoZSBjaGFyYWN0ZXIgYm91bmRpbmcgcmVjdGFuZ2xlcyBpbiB0aGUgY3VycmVudCBST0kuCisgICAgaW50IHdpZHRoOyAgICAgICAgIC8vVGhlIHdpZHRoIG9mIGVhY2ggb2YgdGhlIGNoYXJhY3RlcnMgeW91IHRyYWluZWQgaW4gdGhlIGN1cnJlbnQgUk9JLgorICAgIGludCBoZWlnaHQ7ICAgICAgICAvL1RoZSBoZWlnaHQgb2YgZWFjaCB0cmFpbmVkIGNoYXJhY3RlciBpbiB0aGUgY3VycmVudCBST0kuCisgICAgaW50IGNoYXJhY3RlclNpemU7IC8vVGhlIHNpemUgb2YgdGhlIGNoYXJhY3RlciBpbiBwaXhlbHMuCit9IENoYXJhY3RlclN0YXRpc3RpY3M7CisKK3R5cGVkZWYgc3RydWN0IENoYXJSZXBvcnQzX3N0cnVjdCB7CisgICAgY29uc3QgY2hhciogICAgICAgICBjaGFyYWN0ZXI7ICAgICAgICAgICAvL1RoZSBjaGFyYWN0ZXIgdmFsdWUuCisgICAgaW50ICAgICAgICAgICAgICAgICBjbGFzc2lmaWNhdGlvblNjb3JlOyAvL1RoZSBkZWdyZWUgdG8gd2hpY2ggdGhlIGFzc2lnbmVkIGNoYXJhY3RlciBjbGFzcyByZXByZXNlbnRzIHRoZSBvYmplY3QgYmV0dGVyIHRoYW4gdGhlIG90aGVyIGNoYXJhY3RlciBjbGFzc2VzIGluIHRoZSBjaGFyYWN0ZXIgc2V0LgorICAgIGludCAgICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uU2NvcmU7ICAgLy9UaGUgc2ltaWxhcml0eSBvZiB0aGUgY2hhcmFjdGVyIGFuZCB0aGUgcmVmZXJlbmNlIGNoYXJhY3RlciBmb3IgdGhlIGNoYXJhY3RlciBjbGFzcy4KKyAgICBpbnQgICAgICAgICAgICAgICAgIHZlcmlmaWVkOyAgICAgICAgICAgIC8vVGhpcyBlbGVtZW50IGlzIFRSVUUgaWYgYSByZWZlcmVuY2UgY2hhcmFjdGVyIHdhcyBmb3VuZCBmb3IgdGhlIGNoYXJhY3RlciBjbGFzcyBhbmQgRkFMU0UgaWYgYSByZWZlcmVuY2UgY2hhcmFjdGVyIHdhcyBub3QgZm91bmQuCisgICAgaW50ICAgICAgICAgICAgICAgICBsb3dUaHJlc2hvbGQ7ICAgICAgICAvL1RoZSBtaW5pbXVtIHZhbHVlIG9mIHRoZSB0aHJlc2hvbGQgcmFuZ2UgdXNlZCBmb3IgdGhpcyBjaGFyYWN0ZXIuCisgICAgaW50ICAgICAgICAgICAgICAgICBoaWdoVGhyZXNob2xkOyAgICAgICAvL1RoZSBtYXhpbXVtIHZhbHVlIG9mIHRoZSB0aHJlc2hvbGQgcmFuZ2UgdXNlZCBmb3IgdGhpcyBjaGFyYWN0ZXIuCisgICAgQ2hhcmFjdGVyU3RhdGlzdGljcyBjaGFyYWN0ZXJTdGF0czsgICAgICAvL0Rlc2NyaWJlcyB0aGUgY2hhcmFjdGVycyBzZWdtZW50ZWQgaW4gdGhlIFJPSS4KK30gQ2hhclJlcG9ydDM7CisKK3R5cGVkZWYgc3RydWN0IEFyY0luZm8yX3N0cnVjdCB7CisgICAgUG9pbnRGbG9hdCBjZW50ZXI7ICAgICAvL1RoZSBjZW50ZXIgcG9pbnQgb2YgdGhlIGFyYy4KKyAgICBkb3VibGUgICAgIHJhZGl1czsgICAgIC8vVGhlIHJhZGl1cyBvZiB0aGUgYXJjLgorICAgIGRvdWJsZSAgICAgc3RhcnRBbmdsZTsgLy9UaGUgc3RhcnRpbmcgYW5nbGUgb2YgdGhlIGFyYywgc3BlY2lmaWVkIGNvdW50ZXItY2xvY2t3aXNlIGZyb20gdGhlIHgtYXhpcy4KKyAgICBkb3VibGUgICAgIGVuZEFuZ2xlOyAgIC8vVGhlIGVuZGluZyBhbmdsZSBvZiB0aGUgYXJjLCBzcGVjaWZpZWQgY291bnRlci1jbG9ja3dpc2UgZnJvbSB0aGUgeC1heGlzLgorfSBBcmNJbmZvMjsKKwordHlwZWRlZiBzdHJ1Y3QgRWRnZVJlcG9ydDJfc3RydWN0IHsKKyAgICBFZGdlSW5mbyogICAgZWRnZXM7ICAgICAgICAgICAgLy9BbiBhcnJheSBvZiBlZGdlcyBkZXRlY3RlZC4KKyAgICB1bnNpZ25lZCBpbnQgbnVtRWRnZXM7ICAgICAgICAgLy9JbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBlZGdlcyBkZXRlY3RlZC4KKyAgICBkb3VibGUqICAgICAgZ3JhZGllbnRJbmZvOyAgICAgLy9BbiBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBjYWxjdWxhdGVkIGVkZ2Ugc3RyZW5ndGhzIGFsb25nIHRoZSB1c2VyLWRlZmluZWQgc2VhcmNoIGFyZWEuCisgICAgdW5zaWduZWQgaW50IG51bUdyYWRpZW50SW5mbzsgIC8vSW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgY29udGFpbmVkIGluIGdyYWRpZW50SW5mby4KKyAgICBpbnQgICAgICAgICAgY2FsaWJyYXRpb25WYWxpZDsgLy9JbmRpY2F0ZXMgaWYgdGhlIGNhbGlicmF0aW9uIGRhdGEgY29ycmVzcG9uZGluZyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGVkZ2VzIGlzIGNvcnJlY3QuCit9IEVkZ2VSZXBvcnQyOworCit0eXBlZGVmIHN0cnVjdCBTZWFyY2hBcmNJbmZvX3N0cnVjdCB7CisgICAgQXJjSW5mbzIgICAgYXJjQ29vcmRpbmF0ZXM7IC8vRGVzY3JpYmVzIHRoZSBhcmMgdXNlZCBmb3IgZWRnZSBkZXRlY3Rpb24uCisgICAgRWRnZVJlcG9ydDIgZWRnZVJlcG9ydDsgICAgIC8vRGVzY3JpYmVzIHRoZSBlZGdlcyBmb3VuZCBpbiB0aGlzIHNlYXJjaCBsaW5lLgorfSBTZWFyY2hBcmNJbmZvOworCit0eXBlZGVmIHN0cnVjdCBDb25jZW50cmljUmFrZVJlcG9ydDJfc3RydWN0IHsKKyAgICBFZGdlSW5mbyogICAgICBmaXJzdEVkZ2VzOyAgICAvL1RoZSBmaXJzdCBlZGdlIHBvaW50IGRldGVjdGVkIGFsb25nIGVhY2ggc2VhcmNoIGxpbmUgaW4gdGhlIFJPSS4KKyAgICB1bnNpZ25lZCBpbnQgICBudW1GaXJzdEVkZ2VzOyAvL1RoZSBudW1iZXIgb2YgcG9pbnRzIGluIHRoZSBmaXJzdEVkZ2VzIGFycmF5LgorICAgIEVkZ2VJbmZvKiAgICAgIGxhc3RFZGdlczsgICAgIC8vVGhlIGxhc3QgZWRnZSBwb2ludCBkZXRlY3RlZCBhbG9uZyBlYWNoIHNlYXJjaCBsaW5lIGluIHRoZSBST0kuCisgICAgdW5zaWduZWQgaW50ICAgbnVtTGFzdEVkZ2VzOyAgLy9UaGUgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgbGFzdEVkZ2VzIGFycmF5LgorICAgIFNlYXJjaEFyY0luZm8qIHNlYXJjaEFyY3M7ICAgIC8vQ29udGFpbnMgdGhlIGFyY3MgdXNlZCBmb3IgZWRnZSBkZXRlY3Rpb24gYW5kIHRoZSBlZGdlIGluZm9ybWF0aW9uIGZvciBlYWNoIGFyYy4KKyAgICB1bnNpZ25lZCBpbnQgICBudW1TZWFyY2hBcmNzOyAvL1RoZSBudW1iZXIgb2YgYXJjcyBpbiB0aGUgc2VhcmNoQXJjcyBhcnJheS4KK30gQ29uY2VudHJpY1Jha2VSZXBvcnQyOworCit0eXBlZGVmIHN0cnVjdCBTcG9rZVJlcG9ydDJfc3RydWN0IHsKKyAgICBFZGdlSW5mbyogICAgICAgZmlyc3RFZGdlczsgICAgIC8vVGhlIGZpcnN0IGVkZ2UgcG9pbnQgZGV0ZWN0ZWQgYWxvbmcgZWFjaCBzZWFyY2ggbGluZSBpbiB0aGUgUk9JLgorICAgIHVuc2lnbmVkIGludCAgICBudW1GaXJzdEVkZ2VzOyAgLy9UaGUgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgZmlyc3RFZGdlcyBhcnJheS4KKyAgICBFZGdlSW5mbyogICAgICAgbGFzdEVkZ2VzOyAgICAgIC8vVGhlIGxhc3QgZWRnZSBwb2ludCBkZXRlY3RlZCBhbG9uZyBlYWNoIHNlYXJjaCBsaW5lIGluIHRoZSBST0kuCisgICAgdW5zaWduZWQgaW50ICAgIG51bUxhc3RFZGdlczsgICAvL1RoZSBudW1iZXIgb2YgcG9pbnRzIGluIHRoZSBsYXN0RWRnZXMgYXJyYXkuCisgICAgU2VhcmNoTGluZUluZm8qIHNlYXJjaExpbmVzOyAgICAvL1RoZSBzZWFyY2ggbGluZXMgdXNlZCBmb3IgZWRnZSBkZXRlY3Rpb24uCisgICAgdW5zaWduZWQgaW50ICAgIG51bVNlYXJjaExpbmVzOyAvL1RoZSBudW1iZXIgb2Ygc2VhcmNoIGxpbmVzIHVzZWQgaW4gdGhlIGVkZ2UgZGV0ZWN0aW9uLgorfSBTcG9rZVJlcG9ydDI7CisKK3R5cGVkZWYgc3RydWN0IEVkZ2VJbmZvX3N0cnVjdCB7CisgICAgUG9pbnRGbG9hdCBwb3NpdGlvbjsgICAgICAgICAgIC8vVGhlIGxvY2F0aW9uIG9mIHRoZSBlZGdlIGluIHRoZSBpbWFnZS4KKyAgICBQb2ludEZsb2F0IGNhbGlicmF0ZWRQb3NpdGlvbjsgLy9UaGUgcG9zaXRpb24gb2YgdGhlIGVkZ2UgaW4gdGhlIGltYWdlIGluIHJlYWwtd29ybGQgY29vcmRpbmF0ZXMuCisgICAgZG91YmxlICAgICBkaXN0YW5jZTsgICAgICAgICAgIC8vVGhlIGxvY2F0aW9uIG9mIHRoZSBlZGdlIGZyb20gdGhlIGZpcnN0IHBvaW50IGFsb25nIHRoZSBib3VuZGFyeSBvZiB0aGUgaW5wdXQgUk9JLgorICAgIGRvdWJsZSAgICAgY2FsaWJyYXRlZERpc3RhbmNlOyAvL1RoZSBsb2NhdGlvbiBvZiB0aGUgZWRnZSBmcm9tIHRoZSBmaXJzdCBwb2ludCBhbG9uZyB0aGUgYm91bmRhcnkgb2YgdGhlIGlucHV0IFJPSSBpbiByZWFsLXdvcmxkIGNvb3JkaW5hdGVzLgorICAgIGRvdWJsZSAgICAgbWFnbml0dWRlOyAgICAgICAgICAvL1RoZSBpbnRlbnNpdHkgY29udHJhc3QgYXQgdGhlIGVkZ2UuCisgICAgZG91YmxlICAgICBub2lzZVBlYWs7ICAgICAgICAgIC8vVGhlIHN0cmVuZ3RoIG9mIHRoZSBub2lzZSBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgZWRnZS4KKyAgICBpbnQgICAgICAgIHJpc2luZzsgICAgICAgICAgICAgLy9JbmRpY2F0ZXMgdGhlIHBvbGFyaXR5IG9mIHRoZSBlZGdlLgorfSBFZGdlSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgU2VhcmNoTGluZUluZm9fc3RydWN0IHsKKyAgICBMaW5lRmxvYXQgICBsaW5lQ29vcmRpbmF0ZXM7IC8vVGhlIGVuZHBvaW50cyBvZiB0aGUgc2VhcmNoIGxpbmUuCisgICAgRWRnZVJlcG9ydDIgZWRnZVJlcG9ydDsgICAgICAvL0Rlc2NyaWJlcyB0aGUgZWRnZXMgZm91bmQgaW4gdGhpcyBzZWFyY2ggbGluZS4KK30gU2VhcmNoTGluZUluZm87CisKK3R5cGVkZWYgc3RydWN0IFJha2VSZXBvcnQyX3N0cnVjdCB7CisgICAgRWRnZUluZm8qICAgICAgIGZpcnN0RWRnZXM7ICAgICAvL1RoZSBmaXJzdCBlZGdlIHBvaW50IGRldGVjdGVkIGFsb25nIGVhY2ggc2VhcmNoIGxpbmUgaW4gdGhlIFJPSS4KKyAgICB1bnNpZ25lZCBpbnQgICAgbnVtRmlyc3RFZGdlczsgIC8vVGhlIG51bWJlciBvZiBwb2ludHMgaW4gdGhlIGZpcnN0RWRnZXMgYXJyYXkuCisgICAgRWRnZUluZm8qICAgICAgIGxhc3RFZGdlczsgICAgICAvL1RoZSBsYXN0IGVkZ2UgcG9pbnQgZGV0ZWN0ZWQgYWxvbmcgZWFjaCBzZWFyY2ggbGluZSBpbiB0aGUgUk9JLgorICAgIHVuc2lnbmVkIGludCAgICBudW1MYXN0RWRnZXM7ICAgLy9UaGUgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgbGFzdEVkZ2VzIGFycmF5LgorICAgIFNlYXJjaExpbmVJbmZvKiBzZWFyY2hMaW5lczsgICAgLy9UaGUgc2VhcmNoIGxpbmVzIHVzZWQgZm9yIGVkZ2UgZGV0ZWN0aW9uLgorICAgIHVuc2lnbmVkIGludCAgICBudW1TZWFyY2hMaW5lczsgLy9UaGUgbnVtYmVyIG9mIHNlYXJjaCBsaW5lcyB1c2VkIGluIHRoZSBlZGdlIGRldGVjdGlvbi4KK30gUmFrZVJlcG9ydDI7CisKK3R5cGVkZWYgc3RydWN0IFRyYW5zZm9ybUJlaGF2aW9yc19zdHJ1Y3QgeworICAgIEdyb3VwQmVoYXZpb3IgU2hpZnRCZWhhdmlvcjsgICAgLy9TcGVjaWZpZXMgdGhlIGJlaGF2aW9yIG9mIGFuIG92ZXJsYXkgZ3JvdXAgd2hlbiBhIHNoaWZ0IG9wZXJhdGlvbiBpcyBhcHBsaWVkIHRvIGFuIGltYWdlLgorICAgIEdyb3VwQmVoYXZpb3IgU2NhbGVCZWhhdmlvcjsgICAgLy9TcGVjaWZpZXMgdGhlIGJlaGF2aW9yIG9mIGFuIG92ZXJsYXkgZ3JvdXAgd2hlbiBhIHNjYWxlIG9wZXJhdGlvbiBpcyBhcHBsaWVkIHRvIGFuIGltYWdlLgorICAgIEdyb3VwQmVoYXZpb3IgUm90YXRlQmVoYXZpb3I7ICAgLy9TcGVjaWZpZXMgdGhlIGJlaGF2aW9yIG9mIGFuIG92ZXJsYXkgZ3JvdXAgd2hlbiBhIHJvdGF0ZSBvcGVyYXRpb24gaXMgYXBwbGllZCB0byBhbiBpbWFnZS4KKyAgICBHcm91cEJlaGF2aW9yIFN5bW1ldHJ5QmVoYXZpb3I7IC8vU3BlY2lmaWVzIHRoZSBiZWhhdmlvciBvZiBhbiBvdmVybGF5IGdyb3VwIHdoZW4gYSBzeW1tZXRyeSBvcGVyYXRpb24gaXMgYXBwbGllZCB0byBhbiBpbWFnZS4KK30gVHJhbnNmb3JtQmVoYXZpb3JzOworCit0eXBlZGVmIHN0cnVjdCBRUkNvZGVEYXRhVG9rZW5fc3RydWN0IHsKKyAgICBRUlN0cmVhbU1vZGUgICBtb2RlOyAgICAgICAvL1NwZWNpZmllcyB0aGUgc3RyZWFtIG1vZGUgb3IgdGhlIGZvcm1hdCBvZiB0aGUgZGF0YSB0aGF0IGlzIGVuY29kZWQgaW4gdGhlIFFSIGNvZGUuCisgICAgdW5zaWduZWQgaW50ICAgbW9kZURhdGE7ICAgLy9JbmRpY2F0ZXMgc3BlY2lmaWVycyB1c2VkIGJ5IHRoZSB1c2VyIHRvIHBvc3Rwcm9jZXNzIHRoZSBkYXRhIGlmIGl0IHJlcXVpcmVzIGl0LgorICAgIHVuc2lnbmVkIGNoYXIqIGRhdGE7ICAgICAgIC8vU2hvd3MgdGhlIGVuY29kZWQgZGF0YSBpbiB0aGUgUVIgY29kZS4KKyAgICB1bnNpZ25lZCBpbnQgICBkYXRhTGVuZ3RoOyAvL1NwZWNpZmllcyB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhIGZvdW5kIGluIHRoZSBRUiBjb2RlLgorfSBRUkNvZGVEYXRhVG9rZW47CisKK3R5cGVkZWYgc3RydWN0IFBhcnRpY2xlRmlsdGVyT3B0aW9uc19zdHJ1Y3QgeworICAgIGludCByZWplY3RNYXRjaGVzOyAvL1NldCB0aGlzIHBhcmFtZXRlciB0byBUUlVFIHRvIHRyYW5zZmVyIG9ubHkgdGhvc2UgcGFydGljbGVzIHRoYXQgZG8gbm90IG1lZXQgYWxsIHRoZSBjcml0ZXJpYS4KKyAgICBpbnQgcmVqZWN0Qm9yZGVyOyAgLy9TZXQgdGhpcyBlbGVtZW50IHRvIFRSVUUgdG8gcmVqZWN0IGJvcmRlciBwYXJ0aWNsZXMuCisgICAgaW50IGNvbm5lY3Rpdml0eTg7IC8vU2V0IHRoaXMgcGFyYW1ldGVyIHRvIFRSVUUgdG8gdXNlIGNvbm5lY3Rpdml0eS04IHRvIGRldGVybWluZSB3aGV0aGVyIHBhcnRpY2xlcyBhcmUgdG91Y2hpbmcuCit9IFBhcnRpY2xlRmlsdGVyT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgU3RyYWlnaHRFZGdlUmVwb3J0Ml9zdHJ1Y3QgeworICAgIFN0cmFpZ2h0RWRnZSogICBzdHJhaWdodEVkZ2VzOyAgICAvL0NvbnRhaW5zIGFuIGFycmF5IG9mIGZvdW5kIHN0cmFpZ2h0IGVkZ2VzLgorICAgIHVuc2lnbmVkIGludCAgICBudW1TdHJhaWdodEVkZ2VzOyAvL0luZGljYXRlcyB0aGUgbnVtYmVyIG9mIHN0cmFpZ2h0IGVkZ2VzIGZvdW5kLgorICAgIFNlYXJjaExpbmVJbmZvKiBzZWFyY2hMaW5lczsgICAgICAvL0NvbnRhaW5zIGFuIGFycmF5IG9mIGFsbCBzZWFyY2ggbGluZXMgdXNlZCBpbiB0aGUgZGV0ZWN0aW9uLgorICAgIHVuc2lnbmVkIGludCAgICBudW1TZWFyY2hMaW5lczsgICAvL1RoZSBudW1iZXIgb2Ygc2VhcmNoIGxpbmVzIHVzZWQgaW4gdGhlIGVkZ2UgZGV0ZWN0aW9uLgorfSBTdHJhaWdodEVkZ2VSZXBvcnQyOworCit0eXBlZGVmIHN0cnVjdCBTdHJhaWdodEVkZ2VPcHRpb25zX3N0cnVjdCB7CisgICAgdW5zaWduZWQgaW50ICAgICAgICAgICBudW1MaW5lczsgICAgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc3RyYWlnaHQgZWRnZXMgdG8gZmluZC4KKyAgICBTdHJhaWdodEVkZ2VTZWFyY2hNb2RlIHNlYXJjaE1vZGU7ICAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIG1ldGhvZCB1c2VkIHRvIGZpbmQgdGhlIHN0cmFpZ2h0IGVkZ2UuCisgICAgZG91YmxlICAgICAgICAgICAgICAgICBtaW5TY29yZTsgICAgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBtaW5pbXVtIHNjb3JlIG9mIGEgZGV0ZWN0ZWQgc3RyYWlnaHQgZWRnZS4KKyAgICBkb3VibGUgICAgICAgICAgICAgICAgIG1heFNjb3JlOyAgICAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIG1heGltdW0gc2NvcmUgb2YgYSBkZXRlY3RlZCBlZGdlLgorICAgIGRvdWJsZSAgICAgICAgICAgICAgICAgb3JpZW50YXRpb247ICAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgYW5nbGUgYXQgd2hpY2ggdGhlIHN0cmFpZ2h0IGVkZ2UgaXMgZXhwZWN0ZWQgdG8gYmUgZm91bmQuCisgICAgZG91YmxlICAgICAgICAgICAgICAgICBhbmdsZVJhbmdlOyAgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSArLy0gcmFuZ2UgYXJvdW5kIHRoZSBvcmllbnRhdGlvbiB3aXRoaW4gd2hpY2ggdGhlIHN0cmFpZ2h0IGVkZ2UgaXMgZXhwZWN0ZWQgdG8gYmUgZm91bmQuCisgICAgZG91YmxlICAgICAgICAgICAgICAgICBhbmdsZVRvbGVyYW5jZTsgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBleHBlY3RlZCBhbmd1bGFyIGFjY3VyYWN5IG9mIHRoZSBzdHJhaWdodCBlZGdlLgorICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgc3RlcFNpemU7ICAgICAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgZ2FwIGluIHBpeGVscyBiZXR3ZWVuIHRoZSBzZWFyY2ggbGluZXMgdXNlZCB3aXRoIHRoZSByYWtlLWJhc2VkIG1ldGhvZHMuCisgICAgZG91YmxlICAgICAgICAgICAgICAgICBtaW5TaWduYWxUb05vaXNlUmF0aW87IC8vU3BlY2lmaWVzIHRoZSBtaW5pbXVtIHNpZ25hbCB0byBub2lzZSByYXRpbyAoU05SKSBvZiB0aGUgZWRnZSBwb2ludHMgdXNlZCB0byBmaXQgdGhlIHN0cmFpZ2h0IGVkZ2UuCisgICAgZG91YmxlICAgICAgICAgICAgICAgICBtaW5Db3ZlcmFnZTsgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBtaW5pbXVtIG51bWJlciBvZiBwb2ludHMgYXMgYSBwZXJjZW50YWdlIG9mIHRoZSBudW1iZXIgb2Ygc2VhcmNoIGxpbmVzIHRoYXQgbmVlZCB0byBiZSBpbmNsdWRlZCBpbiB0aGUgZGV0ZWN0ZWQgc3RyYWlnaHQgZWRnZS4KKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgIGhvdWdoSXRlcmF0aW9uczsgICAgICAgLy9TcGVjaWZpZXMgdGhlIG51bWJlciBvZiBpdGVyYXRpb25zIHVzZWQgaW4gdGhlIEhvdWdoLWJhc2VkIG1ldGhvZC4KK30gU3RyYWlnaHRFZGdlT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgU3RyYWlnaHRFZGdlX3N0cnVjdCB7CisgICAgTGluZUZsb2F0ICAgIHN0cmFpZ2h0RWRnZUNvb3JkaW5hdGVzOyAgICAgICAgICAgLy9FbmQgcG9pbnRzIG9mIHRoZSBkZXRlY3RlZCBzdHJhaWdodCBlZGdlIGluIHBpeGVsIGNvb3JkaW5hdGVzLgorICAgIExpbmVGbG9hdCAgICBjYWxpYnJhdGVkU3RyYWlnaHRFZGdlQ29vcmRpbmF0ZXM7IC8vRW5kIHBvaW50cyBvZiB0aGUgZGV0ZWN0ZWQgc3RyYWlnaHQgZWRnZSBpbiByZWFsLXdvcmxkIGNvb3JkaW5hdGVzLgorICAgIGRvdWJsZSAgICAgICBhbmdsZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vQW5nbGUgb2YgdGhlIGZvdW5kIGVkZ2UgdXNpbmcgdGhlIHBpeGVsIGNvb3JkaW5hdGVzLgorICAgIGRvdWJsZSAgICAgICBjYWxpYnJhdGVkQW5nbGU7ICAgICAgICAgICAgICAgICAgIC8vQW5nbGUgb2YgdGhlIGZvdW5kIGVkZ2UgdXNpbmcgdGhlIHJlYWwtd29ybGQgY29vcmRpbmF0ZXMuCisgICAgZG91YmxlICAgICAgIHNjb3JlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9EZXNjcmliZXMgdGhlIHNjb3JlIG9mIHRoZSBkZXRlY3RlZCBlZGdlLgorICAgIGRvdWJsZSAgICAgICBzdHJhaWdodG5lc3M7ICAgICAgICAgICAgICAgICAgICAgIC8vVGhlIHN0cmFpZ2h0bmVzcyB2YWx1ZSBvZiB0aGUgZGV0ZWN0ZWQgc3RyYWlnaHQgZWRnZS4KKyAgICBkb3VibGUgICAgICAgYXZlcmFnZVNpZ25hbFRvTm9pc2VSYXRpbzsgICAgICAgICAvL0Rlc2NyaWJlcyB0aGUgYXZlcmFnZSBzaWduYWwgdG8gbm9pc2UgcmF0aW8gKFNOUikgb2YgdGhlIGRldGVjdGVkIGVkZ2UuCisgICAgaW50ICAgICAgICAgIGNhbGlicmF0aW9uVmFsaWQ7ICAgICAgICAgICAgICAgICAgLy9JbmRpY2F0ZXMgaWYgdGhlIGNhbGlicmF0aW9uIGRhdGEgZm9yIHRoZSBzdHJhaWdodCBlZGdlIGlzIHZhbGlkLgorICAgIEVkZ2VJbmZvKiAgICB1c2VkRWRnZXM7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vQW4gYXJyYXkgb2YgZWRnZXMgdGhhdCB3ZXJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoaXMgc3RyYWlnaHQgbGluZS4KKyAgICB1bnNpZ25lZCBpbnQgbnVtVXNlZEVkZ2VzOyAgICAgICAgICAgICAgICAgICAgICAvL0luZGljYXRlcyB0aGUgbnVtYmVyIG9mIGVkZ2VzIGluIHRoZSB1c2VkRWRnZXMgYXJyYXkuCit9IFN0cmFpZ2h0RWRnZTsKKwordHlwZWRlZiBzdHJ1Y3QgUVJDb2RlU2VhcmNoT3B0aW9uc19zdHJ1Y3QgeworICAgIFFSUm90YXRpb25Nb2RlICAgICByb3RhdGlvbk1vZGU7ICAgICAgIC8vU3BlY2lmaWVzIHRoZSBhbW91bnQgb2YgUVIgY29kZSByb3RhdGlvbiB0aGUgZnVuY3Rpb24gc2hvdWxkIGFsbG93IGZvci4KKyAgICB1bnNpZ25lZCBpbnQgICAgICAgc2tpcExvY2F0aW9uOyAgICAgICAvL0lmIHNldCB0byBUUlVFLCBzcGVjaWZpZXMgdGhhdCB0aGUgZnVuY3Rpb24gc2hvdWxkIGFzc3VtZSB0aGF0IHRoZSBRUiBjb2RlIG9jY3VwaWVzIHRoZSBlbnRpcmUgaW1hZ2UgKG9yIHRoZSBlbnRpcmUgc2VhcmNoIHJlZ2lvbikuCisgICAgdW5zaWduZWQgaW50ICAgICAgIGVkZ2VUaHJlc2hvbGQ7ICAgICAgLy9UaGUgc3RyZW5ndGggb2YgdGhlIHdlYWtlc3QgZWRnZSB0aGUgZnVuY3Rpb24gdXNlcyB0byBmaW5kIHRoZSBjb2Fyc2UgbG9jYXRpb24gb2YgdGhlIFFSIGNvZGUgaW4gdGhlIGltYWdlLgorICAgIFFSRGVtb2R1bGF0aW9uTW9kZSBkZW1vZHVsYXRpb25Nb2RlOyAgIC8vVGhlIGRlbW9kdWxhdGlvbiBtb2RlIHRoZSBmdW5jdGlvbiB1c2VzIHRvIGxvY2F0ZSB0aGUgUVIgY29kZS4KKyAgICBRUkNlbGxTYW1wbGVTaXplICAgY2VsbFNhbXBsZVNpemU7ICAgICAvL1RoZSBjZWxsIHNhbXBsZSBzaXplIHRoZSBmdW5jdGlvbiB1c2VzIHRvIGxvY2F0ZSB0aGUgUVIgY29kZS4KKyAgICBRUkNlbGxGaWx0ZXJNb2RlICAgY2VsbEZpbHRlck1vZGU7ICAgICAvL1RoZSBjZWxsIGZpbHRlciBtb2RlIHRoZSBmdW5jdGlvbiB1c2VzIHRvIGxvY2F0ZSB0aGUgUVIgY29kZS4KKyAgICB1bnNpZ25lZCBpbnQgICAgICAgc2tld0RlZ3JlZXNBbGxvd2VkOyAvL1NwZWNpZmllcyB0aGUgYW1vdW50IG9mIHNrZXcgaW4gdGhlIFFSIGNvZGUgdGhlIGZ1bmN0aW9uIHNob3VsZCBhbGxvdyBmb3IuCit9IFFSQ29kZVNlYXJjaE9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IFFSQ29kZVNpemVPcHRpb25zX3N0cnVjdCB7CisgICAgdW5zaWduZWQgaW50IG1pblNpemU7IC8vU3BlY2lmaWVzIHRoZSBtaW5pbXVtIHNpemUgKGluIHBpeGVscykgb2YgdGhlIFFSIGNvZGUgaW4gdGhlIGltYWdlLgorICAgIHVuc2lnbmVkIGludCBtYXhTaXplOyAvL1NwZWNpZmllcyB0aGUgbWF4aW11bSBzaXplIChpbiBwaXhlbHMpIG9mIHRoZSBRUiBjb2RlIGluIHRoZSBpbWFnZS4KK30gUVJDb2RlU2l6ZU9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IFFSQ29kZURlc2NyaXB0aW9uT3B0aW9uc19zdHJ1Y3QgeworICAgIFFSRGltZW5zaW9ucyBkaW1lbnNpb25zOyAvL1RoZSBudW1iZXIgb2Ygcm93cyBhbmQgY29sdW1ucyB0aGF0IGFyZSBwb3B1bGF0ZWQgZm9yIHRoZSBRUiBjb2RlLCBtZWFzdXJlZCBpbiBjZWxscy4KKyAgICBRUlBvbGFyaXRpZXMgcG9sYXJpdHk7ICAgLy9UaGUgcG9sYXJpdHkgb2YgdGhlIFFSIGNvZGUuCisgICAgUVJNaXJyb3JNb2RlIG1pcnJvcjsgICAgIC8vVGhpcyBlbGVtZW50IGlzIFRSVUUgaWYgdGhlIFFSIGNvZGUgYXBwZWFycyBtaXJyb3JlZCBpbiB0aGUgaW1hZ2UgYW5kIEZBTFNFIGlmIHRoZSBRUiBjb2RlIGFwcGVhcnMgbm9ybWFsbHkgaW4gdGhlIGltYWdlLgorICAgIFFSTW9kZWxUeXBlICBtb2RlbFR5cGU7ICAvL1RoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiBRUiBjb2RlLgorfSBRUkNvZGVEZXNjcmlwdGlvbk9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IFFSQ29kZVJlcG9ydF9zdHJ1Y3QgeworICAgIHVuc2lnbmVkIGludCAgICAgICBmb3VuZDsgICAgICAgICAgICAgICAgICAgIC8vVGhpcyBlbGVtZW50IGlzIFRSVUUgaWYgdGhlIGZ1bmN0aW9uIGxvY2F0ZWQgYW5kIGRlY29kZWQgYSBRUiBjb2RlIGFuZCBGQUxTRSBpZiB0aGUgZnVuY3Rpb24gZmFpbGVkIHRvIGxvY2F0ZSBhbmQgZGVjb2RlIGEgUVIgY29kZS4KKyAgICB1bnNpZ25lZCBjaGFyKiAgICAgZGF0YTsgICAgICAgICAgICAgICAgICAgICAvL1RoZSBkYXRhIGVuY29kZWQgaW4gdGhlIFFSIGNvZGUuCisgICAgdW5zaWduZWQgaW50ICAgICAgIGRhdGFMZW5ndGg7ICAgICAgICAgICAgICAgLy9UaGUgbGVuZ3RoIG9mIHRoZSBkYXRhIGFycmF5LgorICAgIFBvaW50RmxvYXQgICAgICAgICBib3VuZGluZ0JveFs0XTsgICAgICAgICAgIC8vQW4gYXJyYXkgb2YgZm91ciBwb2ludHMgZGVzY3JpYmluZyB0aGUgcmVjdGFuZ2xlIHN1cnJvdW5kaW5nIHRoZSBRUiBjb2RlLgorICAgIFFSQ29kZURhdGFUb2tlbiogICB0b2tlbml6ZWREYXRhOyAgICAgICAgICAgIC8vQ29udGFpbnMgdGhlIGRhdGEgdG9rZW5pemVkIGluIGV4YWN0bHkgdGhlIHdheSBpdCB3YXMgZW5jb2RlZCBpbiB0aGUgY29kZS4KKyAgICB1bnNpZ25lZCBpbnQgICAgICAgc2l6ZU9mVG9rZW5pemVkRGF0YTsgICAgICAvL1NpemUgb2YgdGhlIHRva2VuaXplZCBkYXRhLgorICAgIHVuc2lnbmVkIGludCAgICAgICBudW1FcnJvcnNDb3JyZWN0ZWQ7ICAgICAgIC8vVGhlIG51bWJlciBvZiBlcnJvcnMgdGhlIGZ1bmN0aW9uIGNvcnJlY3RlZCB3aGVuIGRlY29kaW5nIHRoZSBRUiBjb2RlLgorICAgIHVuc2lnbmVkIGludCAgICAgICBkaW1lbnNpb25zOyAgICAgICAgICAgICAgIC8vVGhlIG51bWJlciBvZiByb3dzIGFuZCBjb2x1bW5zIHRoYXQgYXJlIHBvcHVsYXRlZCBmb3IgdGhlIFFSIGNvZGUsIG1lYXN1cmVkIGluIGNlbGxzLgorICAgIHVuc2lnbmVkIGludCAgICAgICB2ZXJzaW9uOyAgICAgICAgICAgICAgICAgIC8vVGhlIHZlcnNpb24gb2YgdGhlIFFSIGNvZGUuCisgICAgUVJNb2RlbFR5cGUgICAgICAgIG1vZGVsVHlwZTsgICAgICAgICAgICAgICAgLy9UaGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIHNwZWNpZnkgd2hhdCB0eXBlIG9mIFFSIGNvZGUgdGhpcyBpcy4KKyAgICBRUlN0cmVhbU1vZGUgICAgICAgc3RyZWFtTW9kZTsgICAgICAgICAgICAgICAvL1RoZSBmb3JtYXQgb2YgdGhlIGRhdGEgZW5jb2RlZCBpbiB0aGUgc3RyZWFtLgorICAgIFFSUG9sYXJpdGllcyAgICAgICBtYXRyaXhQb2xhcml0eTsgICAgICAgICAgIC8vVGhlIHBvbGFyaXR5IG9mIHRoZSBRUiBjb2RlLgorICAgIHVuc2lnbmVkIGludCAgICAgICBtaXJyb3JlZDsgICAgICAgICAgICAgICAgIC8vVGhpcyBlbGVtZW50IGlzIFRSVUUgaWYgdGhlIFFSIGNvZGUgYXBwZWFycyBtaXJyb3JlZCBpbiB0aGUgaW1hZ2UgYW5kIEZBTFNFIGlmIHRoZSBRUiBjb2RlIGFwcGVhcnMgbm9ybWFsbHkgaW4gdGhlIGltYWdlLgorICAgIHVuc2lnbmVkIGludCAgICAgICBwb3NpdGlvbkluQXBwZW5kU3RyZWFtOyAgIC8vSW5kaWNhdGVzIHdoYXQgcG9zaXRpb24gdGhlIFFSIGNvZGUgaXMgaW4gd2l0aCByZXNwZWN0IHRvIHRoZSBzdHJlYW0gb2YgZGF0YSBpbiBhbGwgY29kZXMuCisgICAgdW5zaWduZWQgaW50ICAgICAgIHNpemVPZkFwcGVuZFN0cmVhbTsgICAgICAgLy9TcGVjaWZpZXMgaG93IG1hbnkgUVIgY29kZXMgYXJlIHBhcnQgb2YgYSBsYXJnZXIgYXJyYXkgb2YgY29kZXMuCisgICAgaW50ICAgICAgICAgICAgICAgIGZpcnN0RUFOMTI4QXBwbGljYXRpb25JRDsgLy9UaGUgZmlyc3QgRUFOLTEyOCBBcHBsaWNhdGlvbiBJRCBlbmNvdW50ZXJlZCBpbiB0aGUgc3RyZWFtLgorICAgIGludCAgICAgICAgICAgICAgICBmaXJzdEVDSURlc2lnbmF0b3I7ICAgICAgIC8vVGhlIGZpcnN0IFJlZ2lvbmFsIExhbmd1YWdlIERlc2lnbmF0b3IgZW5jb3VudGVyZWQgaW4gdGhlIHN0cmVhbS4KKyAgICB1bnNpZ25lZCBpbnQgICAgICAgYXBwZW5kU3RyZWFtSWRlbnRpZmllcjsgICAvL1NwZWNpZmllcyB3aGF0IHN0cmVhbSB0aGUgUVIgY29kZSBpcyBpbiByZWxhdGlvbiB0byB3aGVuIHRoZSBjb2RlIGlzIHBhcnQgb2YgYSBsYXJnZXIgYXJyYXkgb2YgY29kZXMuCisgICAgdW5zaWduZWQgaW50ICAgICAgIG1pbmltdW1FZGdlU3RyZW5ndGg7ICAgICAgLy9UaGUgc3RyZW5ndGggb2YgdGhlIHdlYWtlc3QgZWRnZSB0aGUgZnVuY3Rpb24gdXNlZCB0byBmaW5kIHRoZSBjb2Fyc2UgbG9jYXRpb24gb2YgdGhlIFFSIGNvZGUgaW4gdGhlIGltYWdlLgorICAgIFFSRGVtb2R1bGF0aW9uTW9kZSBkZW1vZHVsYXRpb25Nb2RlOyAgICAgICAgIC8vVGhlIGRlbW9kdWxhdGlvbiBtb2RlIHRoZSBmdW5jdGlvbiB1c2VkIHRvIGxvY2F0ZSB0aGUgUVIgY29kZS4KKyAgICBRUkNlbGxTYW1wbGVTaXplICAgY2VsbFNhbXBsZVNpemU7ICAgICAgICAgICAvL1RoZSBjZWxsIHNhbXBsZSBzaXplIHRoZSBmdW5jdGlvbiB1c2VkIHRvIGxvY2F0ZSB0aGUgUVIgY29kZS4KKyAgICBRUkNlbGxGaWx0ZXJNb2RlICAgY2VsbEZpbHRlck1vZGU7ICAgICAgICAgICAvL1RoZSBjZWxsIGZpbHRlciBtb2RlIHRoZSBmdW5jdGlvbiB1c2VkIHRvIGxvY2F0ZSB0aGUgUVIgY29kZS4KK30gUVJDb2RlUmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBBSU1HcmFkZVJlcG9ydF9zdHJ1Y3QgeworICAgIEFJTUdyYWRlIG92ZXJhbGxHcmFkZTsgICAgICAgICAgICAgICAvL1RoZSBvdmVyYWxsIGxldHRlciBncmFkZSwgd2hpY2ggaXMgZXF1YWwgdG8gdGhlIGxvd2VzdCBvZiB0aGUgb3RoZXIgZml2ZSBsZXR0ZXIgZ3JhZGVzLgorICAgIEFJTUdyYWRlIGRlY29kaW5nR3JhZGU7ICAgICAgICAgICAgICAvL1RoZSBsZXR0ZXIgZ3JhZGUgYXNzaWduZWQgdG8gYSBEYXRhIE1hdHJpeCBiYXJjb2RlIGJhc2VkIG9uIHRoZSBzdWNjZXNzIG9mIHRoZSBmdW5jdGlvbiBpbiBkZWNvZGluZyB0aGUgRGF0YSBNYXRyaXggYmFyY29kZS4KKyAgICBBSU1HcmFkZSBzeW1ib2xDb250cmFzdEdyYWRlOyAgICAgICAgLy9UaGUgbGV0dGVyIGdyYWRlIGFzc2lnbmVkIHRvIGEgRGF0YSBNYXRyaXggYmFyY29kZSBiYXNlZCBvbiB0aGUgc3ltYm9sIGNvbnRyYXN0IHJhdyBzY29yZS4KKyAgICBmbG9hdCAgICBzeW1ib2xDb250cmFzdDsgICAgICAgICAgICAgLy9UaGUgc3ltYm9sIGNvbnRyYXN0IHJhdyBzY29yZSByZXByZXNlbnRpbmcgdGhlIHBlcmNlbnRhZ2UgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBtZWFuIG9mIHRoZSByZWZsZWN0YW5jZSBvZiB0aGUgZGFya2VzdCAxMCBwZXJjZW50IGFuZCBsaWdodGVzdCAxMCBwZXJjZW50IG9mIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlLgorICAgIEFJTUdyYWRlIHByaW50R3Jvd3RoR3JhZGU7ICAgICAgICAgICAvL1RoZSBwcmludCBncm93dGggbGV0dGVyIGdyYWRlIGZvciB0aGUgRGF0YSBNYXRyaXggYmFyY29kZS4KKyAgICBmbG9hdCAgICBwcmludEdyb3d0aDsgICAgICAgICAgICAgICAgLy9UaGUgcHJpbnQgZ3Jvd3RoIHJhdyBzY29yZSBmb3IgdGhlIGJhcmNvZGUsIHdoaWNoIGlzIGJhc2VkIG9uIHRoZSBleHRlbnQgdG8gd2hpY2ggZGFyayBvciBsaWdodCBtYXJraW5ncyBhcHByb3ByaWF0ZWx5IGZpbGwgdGhlaXIgbW9kdWxlIGJvdW5kYXJpZXMuCisgICAgQUlNR3JhZGUgYXhpYWxOb251bmlmb3JtaXR5R3JhZGU7ICAgIC8vVGhlIGF4aWFsIG5vbnVuaWZvcm1pdHkgZ3JhZGUgZm9yIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlLgorICAgIGZsb2F0ICAgIGF4aWFsTm9udW5pZm9ybWl0eTsgICAgICAgICAvL1RoZSBheGlhbCBub251bmlmb3JtaXR5IHJhdyBzY29yZSBmb3IgdGhlIGJhcmNvZGUsIHdoaWNoIGlzIGJhc2VkIG9uIGhvdyBtdWNoIHRoZSBzYW1wbGluZyBwb2ludCBzcGFjaW5nIGRpZmZlcnMgZnJvbSBvbmUgYXhpcyB0byBhbm90aGVyLgorICAgIEFJTUdyYWRlIHVudXNlZEVycm9yQ29ycmVjdGlvbkdyYWRlOyAvL1RoZSB1bnVzZWQgZXJyb3IgY29ycmVjdGlvbiBsZXR0ZXIgZ3JhZGUgZm9yIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlLgorICAgIGZsb2F0ICAgIHVudXNlZEVycm9yQ29ycmVjdGlvbjsgICAgICAvL1RoZSB1bnVzZWQgZXJyb3IgY29ycmVjdGlvbiByYXcgc2NvcmUgZm9yIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlLCB3aGljaCBpcyBiYXNlZCBvbiB0aGUgZXh0ZW50IHRvIHdoaWNoIHJlZ2lvbmFsIG9yIHNwb3QgZGFtYWdlIGluIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlIGhhcyBlcm9kZWQgdGhlIHJlYWRpbmcgc2FmZXR5IG1hcmdpbiBwcm92aWRlZCBieSB0aGUgZXJyb3IgY29ycmVjdGlvbi4KK30gQUlNR3JhZGVSZXBvcnQ7CisKK3R5cGVkZWYgc3RydWN0IERhdGFNYXRyaXhTaXplT3B0aW9uc19zdHJ1Y3QgeworICAgIHVuc2lnbmVkIGludCBtaW5TaXplOyAgICAgICAgLy9TcGVjaWZpZXMgdGhlIG1pbmltdW0gc2l6ZSAoaW4gcGl4ZWxzKSBvZiB0aGUgRGF0YSBNYXRyaXggYmFyY29kZSBpbiB0aGUgaW1hZ2UuCisgICAgdW5zaWduZWQgaW50IG1heFNpemU7ICAgICAgICAvL1NwZWNpZmllcyB0aGUgbWF4aW11bSBzaXplIChpbiBwaXhlbHMpIG9mIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlIGluIHRoZSBpbWFnZS4KKyAgICB1bnNpZ25lZCBpbnQgcXVpZXRab25lV2lkdGg7IC8vU3BlY2lmaWVzIHRoZSBleHBlY3RlZCBtaW5pbXVtIHNpemUgb2YgdGhlIHF1aWV0IHpvbmUsIGluIHBpeGVscy4KK30gRGF0YU1hdHJpeFNpemVPcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBEYXRhTWF0cml4RGVzY3JpcHRpb25PcHRpb25zX3N0cnVjdCB7CisgICAgZmxvYXQgICAgICAgICAgICAgICAgICBhc3BlY3RSYXRpbzsgICAgICAgIC8vU3BlY2lmaWVzIHRoZSByYXRpbyBvZiB0aGUgd2lkdGggb2YgZWFjaCBEYXRhIE1hdHJpeCBiYXJjb2RlIGNlbGwgKGluIHBpeGVscykgdG8gdGhlIGhlaWdodCBvZiB0aGUgRGF0YSBNYXRyaXggYmFyY29kZSAoaW4gcGl4ZWxzKS4KKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgIHJvd3M7ICAgICAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIG51bWJlciBvZiByb3dzIGluIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlLgorICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgY29sdW1uczsgICAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIERhdGEgTWF0cml4IGJhcmNvZGUuCisgICAgaW50ICAgICAgICAgICAgICAgICAgICByZWN0YW5nbGU7ICAgICAgICAgIC8vU2V0IHRoaXMgZWxlbWVudCB0byBUUlVFIHRvIHNwZWNpZnkgdGhhdCB0aGUgRGF0YSBNYXRyaXggYmFyY29kZSBpcyByZWN0YW5ndWxhci4KKyAgICBEYXRhTWF0cml4RUNDICAgICAgICAgIGVjYzsgICAgICAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIEVDQyB1c2VkIGZvciB0aGlzIERhdGEgTWF0cml4IGJhcmNvZGUuCisgICAgRGF0YU1hdHJpeFBvbGFyaXR5ICAgICBwb2xhcml0eTsgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBkYXRhLXRvLWJhY2tncm91bmQgY29udHJhc3QgZm9yIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlLgorICAgIERhdGFNYXRyaXhDZWxsRmlsbE1vZGUgY2VsbEZpbGw7ICAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgZmlsbCBwZXJjZW50YWdlIGZvciBhIGNlbGwgb2YgdGhlIERhdGEgTWF0cml4IGJhcmNvZGUgdGhhdCBpcyBpbiB0aGUgIk9OIiBzdGF0ZS4KKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgIG1pbkJvcmRlckludGVncml0eTsgLy9TcGVjaWZpZXMgdGhlIG1pbmltdW0gcGVyY2VudGFnZSBvZiB0aGUgYm9yZGVyIChsb2NhdG9yIHBhdHRlcm4gYW5kIHRpbWluZyBwYXR0ZXJuKSB0aGUgZnVuY3Rpb24gc2hvdWxkIGV4cGVjdCBpbiB0aGUgRGF0YSBNYXRyaXggYmFyY29kZS4KKyAgICBEYXRhTWF0cml4TWlycm9yTW9kZSAgIG1pcnJvck1vZGU7ICAgICAgICAgLy9TcGVjaWZpZXMgaWYgdGhlIERhdGEgTWF0cml4IGJhcmNvZGUgYXBwZWFycyBub3JtYWxseSBpbiB0aGUgaW1hZ2Ugb3IgaWYgdGhlIGJhcmNvZGUgYXBwZWFycyBtaXJyb3JlZCBpbiB0aGUgaW1hZ2UuCit9IERhdGFNYXRyaXhEZXNjcmlwdGlvbk9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IERhdGFNYXRyaXhTZWFyY2hPcHRpb25zX3N0cnVjdCB7CisgICAgRGF0YU1hdHJpeFJvdGF0aW9uTW9kZSAgICAgcm90YXRpb25Nb2RlOyAgICAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgYW1vdW50IG9mIERhdGEgTWF0cml4IGJhcmNvZGUgcm90YXRpb24gdGhlIGZ1bmN0aW9uIHNob3VsZCBhbGxvdyBmb3IuCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgc2tpcExvY2F0aW9uOyAgICAgICAgICAgICAvL0lmIHNldCB0byBUUlVFLCBzcGVjaWZpZXMgdGhhdCB0aGUgZnVuY3Rpb24gc2hvdWxkIGFzc3VtZSB0aGF0IHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlIG9jY3VwaWVzIHRoZSBlbnRpcmUgaW1hZ2UgKG9yIHRoZSBlbnRpcmUgc2VhcmNoIHJlZ2lvbikuCisgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgZWRnZVRocmVzaG9sZDsgICAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgbWluaW11bSBjb250cmFzdCBhIHBpeGVsIG11c3QgaGF2ZSBpbiBvcmRlciB0byBiZSBjb25zaWRlcmVkIHBhcnQgb2YgYSBtYXRyaXggY2VsbCBlZGdlLgorICAgIERhdGFNYXRyaXhEZW1vZHVsYXRpb25Nb2RlIGRlbW9kdWxhdGlvbk1vZGU7ICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIG1vZGUgdGhlIGZ1bmN0aW9uIHNob3VsZCB1c2UgdG8gZGVtb2R1bGF0ZSAoZGV0ZXJtaW5lIHdoaWNoIGNlbGxzIGFyZSBvbiBhbmQgd2hpY2ggY2VsbHMgYXJlIG9mZikgdGhlIERhdGEgTWF0cml4IGJhcmNvZGUuCisgICAgRGF0YU1hdHJpeENlbGxTYW1wbGVTaXplICAgY2VsbFNhbXBsZVNpemU7ICAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgc2FtcGxlIHNpemUsIGluIHBpeGVscywgdGhlIGZ1bmN0aW9uIHNob3VsZCB0YWtlIHRvIGRldGVybWluZSBpZiBlYWNoIGNlbGwgaXMgb24gb3Igb2ZmLgorICAgIERhdGFNYXRyaXhDZWxsRmlsdGVyTW9kZSAgIGNlbGxGaWx0ZXJNb2RlOyAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIG1vZGUgdGhlIGZ1bmN0aW9uIHVzZXMgdG8gZGV0ZXJtaW5lIHRoZSBwaXhlbCB2YWx1ZSBmb3IgZWFjaCBjZWxsLgorICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgIHNrZXdEZWdyZWVzQWxsb3dlZDsgICAgICAgLy9TcGVjaWZpZXMgdGhlIGFtb3VudCBvZiBza2V3IGluIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlIHRoZSBmdW5jdGlvbiBzaG91bGQgYWxsb3cgZm9yLgorICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgIG1heEl0ZXJhdGlvbnM7ICAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZXJhdGlvbnMgYmVmb3JlIHRoZSBmdW5jdGlvbiBzdG9wcyBsb29raW5nIGZvciB0aGUgRGF0YSBNYXRyaXggYmFyY29kZS4KKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICBpbml0aWFsU2VhcmNoVmVjdG9yV2lkdGg7IC8vU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgcGl4ZWxzIHRoZSBmdW5jdGlvbiBzaG91bGQgYXZlcmFnZSB0b2dldGhlciB0byBkZXRlcm1pbmUgdGhlIGxvY2F0aW9uIG9mIGFuIGVkZ2UuCit9IERhdGFNYXRyaXhTZWFyY2hPcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBEYXRhTWF0cml4UmVwb3J0X3N0cnVjdCB7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQ7ICAgICAgICAgICAgICAgIC8vVGhpcyBlbGVtZW50IGlzIFRSVUUgaWYgdGhlIGZ1bmN0aW9uIGxvY2F0ZWQgYW5kIGRlY29kZWQgYSBEYXRhIE1hdHJpeCBiYXJjb2RlIGFuZCBGQUxTRSBpZiB0aGUgZnVuY3Rpb24gZmFpbGVkIHRvIGxvY2F0ZSBhbmQgZGVjb2RlIGEgRGF0YSBNYXRyaXggYmFyY29kZS4KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBiaW5hcnk7ICAgICAgICAgICAgICAgLy9UaGlzIGVsZW1lbnQgaXMgVFJVRSBpZiB0aGUgRGF0YSBNYXRyaXggYmFyY29kZSBjb250YWlucyBiaW5hcnkgZGF0YSBhbmQgRkFMU0UgaWYgdGhlIERhdGEgTWF0cml4IGJhcmNvZGUgY29udGFpbnMgdGV4dCBkYXRhLgorICAgIHVuc2lnbmVkIGNoYXIqICAgICAgICAgICAgIGRhdGE7ICAgICAgICAgICAgICAgICAvL1RoZSBkYXRhIGVuY29kZWQgaW4gdGhlIERhdGEgTWF0cml4IGJhcmNvZGUuCisgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgZGF0YUxlbmd0aDsgICAgICAgICAgIC8vVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBhcnJheS4KKyAgICBQb2ludEZsb2F0ICAgICAgICAgICAgICAgICBib3VuZGluZ0JveFs0XTsgICAgICAgLy9BbiBhcnJheSBvZiBmb3VyIHBvaW50cyBkZXNjcmliaW5nIHRoZSByZWN0YW5nbGUgc3Vycm91bmRpbmcgdGhlIERhdGEgTWF0cml4IGJhcmNvZGUuCisgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgbnVtRXJyb3JzQ29ycmVjdGVkOyAgIC8vVGhlIG51bWJlciBvZiBlcnJvcnMgdGhlIGZ1bmN0aW9uIGNvcnJlY3RlZCB3aGVuIGRlY29kaW5nIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlLgorICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgIG51bUVyYXN1cmVzQ29ycmVjdGVkOyAvL1RoZSBudW1iZXIgb2YgZXJhc3VyZXMgdGhlIGZ1bmN0aW9uIGNvcnJlY3RlZCB3aGVuIGRlY29kaW5nIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlLgorICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgIGFzcGVjdFJhdGlvOyAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgYXNwZWN0IHJhdGlvIG9mIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlIGluIHRoZSBpbWFnZSwgd2hpY2ggZXF1YWxzIHRoZSByYXRpbyBvZiB0aGUgd2lkdGggb2YgYSBEYXRhIE1hdHJpeCBiYXJjb2RlIGNlbGwgKGluIHBpeGVscykgdG8gdGhlIGhlaWdodCBvZiBhIERhdGEgTWF0cml4IGJhcmNvZGUgY2VsbCAoaW4gcGl4ZWxzKS4KKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICByb3dzOyAgICAgICAgICAgICAgICAgLy9UaGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIERhdGEgTWF0cml4IGJhcmNvZGUuCisgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgY29sdW1uczsgICAgICAgICAgICAgIC8vVGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlLgorICAgIERhdGFNYXRyaXhFQ0MgICAgICAgICAgICAgIGVjYzsgICAgICAgICAgICAgICAgICAvL1RoZSBFcnJvciBDb3JyZWN0aW9uIENvZGUgKEVDQykgdXNlZCBieSB0aGUgRGF0YSBNYXRyaXggYmFyY29kZS4KKyAgICBEYXRhTWF0cml4UG9sYXJpdHkgICAgICAgICBwb2xhcml0eTsgICAgICAgICAgICAgLy9UaGUgcG9sYXJpdHkgb2YgdGhlIERhdGEgTWF0cml4IGJhcmNvZGUuCisgICAgRGF0YU1hdHJpeENlbGxGaWxsTW9kZSAgICAgY2VsbEZpbGw7ICAgICAgICAgICAgIC8vVGhlIGNlbGwgZmlsbCBwZXJjZW50YWdlIG9mIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlLgorICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgIGJvcmRlckludGVncml0eTsgICAgICAvL1RoZSBwZXJjZW50YWdlIG9mIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlIGJvcmRlciB0aGF0IGFwcGVhcnMgY29ycmVjdGx5IGluIHRoZSBpbWFnZS4KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBtaXJyb3JlZDsgICAgICAgICAgICAgLy9UaGlzIGVsZW1lbnQgaXMgVFJVRSBpZiB0aGUgRGF0YSBNYXRyaXggYmFyY29kZSBhcHBlYXJzIG1pcnJvcmVkIGluIHRoZSBpbWFnZSBhbmQgRkFMU0UgaWYgdGhlIERhdGEgTWF0cml4IGJhcmNvZGUgYXBwZWFycyBub3JtYWxseSBpbiB0aGUgaW1hZ2UuCisgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgbWluaW11bUVkZ2VTdHJlbmd0aDsgIC8vVGhlIHN0cmVuZ3RoIG9mIHRoZSB3ZWFrZXN0IGVkZ2UgdGhlIGZ1bmN0aW9uIHVzZWQgdG8gZmluZCB0aGUgY29hcnNlIGxvY2F0aW9uIG9mIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlIGluIHRoZSBpbWFnZS4KKyAgICBEYXRhTWF0cml4RGVtb2R1bGF0aW9uTW9kZSBkZW1vZHVsYXRpb25Nb2RlOyAgICAgLy9UaGUgZGVtb2R1bGF0aW9uIG1vZGUgdGhlIGZ1bmN0aW9uIHVzZWQgdG8gbG9jYXRlIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlLgorICAgIERhdGFNYXRyaXhDZWxsU2FtcGxlU2l6ZSAgIGNlbGxTYW1wbGVTaXplOyAgICAgICAvL1RoZSBjZWxsIHNhbXBsZSBzaXplIHRoZSBmdW5jdGlvbiB1c2VkIHRvIGxvY2F0ZSB0aGUgRGF0YSBNYXRyaXggYmFyY29kZS4KKyAgICBEYXRhTWF0cml4Q2VsbEZpbHRlck1vZGUgICBjZWxsRmlsdGVyTW9kZTsgICAgICAgLy9UaGUgY2VsbCBmaWx0ZXIgbW9kZSB0aGUgZnVuY3Rpb24gdXNlZCB0byBsb2NhdGUgdGhlIERhdGEgTWF0cml4IGJhcmNvZGUuCisgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgaXRlcmF0aW9uczsgICAgICAgICAgIC8vVGhlIG51bWJlciBvZiBpdGVyYXRpb25zIHRoZSBmdW5jdGlvbiB0b29rIGluIGF0dGVtcHRpbmcgdG8gbG9jYXRlIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlLgorfSBEYXRhTWF0cml4UmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBKUEVHMjAwMEZpbGVBZHZhbmNlZE9wdGlvbnNfc3RydWN0IHsKKyAgICBXYXZlbGV0VHJhbnNmb3JtTW9kZSB3YXZlbGV0TW9kZTsgICAgICAgICAgICAgICAgLy9EZXRlcm1pbmVzIHdoaWNoIHdhdmVsZXQgdHJhbnNmb3JtIHRvIHVzZSB3aGVuIHdyaXRpbmcgdGhlIGZpbGUuCisgICAgaW50ICAgICAgICAgICAgICAgICAgdXNlTXVsdGlDb21wb25lbnRUcmFuc2Zvcm07IC8vU2V0IHRoaXMgcGFyYW1ldGVyIHRvIFRSVUUgdG8gdXNlIGFuIGFkZGl0aW9uYWwgdHJhbnNmb3JtIG9uIFJHQiBpbWFnZXMuCisgICAgdW5zaWduZWQgaW50ICAgICAgICAgbWF4V2F2ZWxldFRyYW5zZm9ybUxldmVsOyAgIC8vU3BlY2lmaWVzIHRoZSBtYXhpbXVtIGFsbG93ZWQgbGV2ZWwgb2Ygd2F2ZWxldCB0cmFuc2Zvcm0uCisgICAgZmxvYXQgICAgICAgICAgICAgICAgcXVhbnRpemF0aW9uU3RlcFNpemU7ICAgICAgIC8vU3BlY2lmaWVzIHRoZSBhYnNvbHV0ZSBiYXNlIHF1YW50aXphdGlvbiBzdGVwIHNpemUgZm9yIGRlcml2ZWQgcXVhbnRpemF0aW9uIG1vZGUuCit9IEpQRUcyMDAwRmlsZUFkdmFuY2VkT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgTWF0Y2hHZW9tZXRyaWNQYXR0ZXJuQWR2YW5jZWRPcHRpb25zMl9zdHJ1Y3QgeworICAgIGludCAgICBtaW5GZWF0dXJlc1VzZWQ7ICAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGZlYXR1cmVzIHRoZSBmdW5jdGlvbiB1c2VzIHdoZW4gbWF0Y2hpbmcuCisgICAgaW50ICAgIG1heEZlYXR1cmVzVXNlZDsgICAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgZmVhdHVyZXMgdGhlIGZ1bmN0aW9uIHVzZXMgd2hlbiBtYXRjaGluZy4KKyAgICBpbnQgICAgc3VicGl4ZWxJdGVyYXRpb25zOyAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpbmNyZW1lbnRhbCBpbXByb3ZlbWVudHMgdXNlZCB0byByZWZpbmUgbWF0Y2hlcyB3aXRoIHN1YnBpeGVsIGluZm9ybWF0aW9uLgorICAgIGRvdWJsZSBzdWJwaXhlbFRvbGVyYW5jZTsgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIG1heGltdW0gYW1vdW50IG9mIGNoYW5nZSwgaW4gcGl4ZWxzLCBiZXR3ZWVuIGNvbnNlY3V0aXZlIGluY3JlbWVudGFsIGltcHJvdmVtZW50cyBpbiB0aGUgbWF0Y2ggcG9zaXRpb24gYmVmb3JlIHRoZSBmdW5jdGlvbiBzdG9wcyByZWZpbmluZyB0aGUgbWF0Y2ggcG9zaXRpb24uCisgICAgaW50ICAgIGluaXRpYWxNYXRjaExpc3RMZW5ndGg7ICAgICAvL1NwZWNpZmllcyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBtYXRjaCBsaXN0LgorICAgIGZsb2F0ICBtYXRjaFRlbXBsYXRlQ3VydmVTY29yZTsgICAgLy9TZXQgdGhpcyBlbGVtZW50IHRvIFRSVUUgdG8gc3BlY2lmeSB0aGF0IHRoZSBmdW5jdGlvbiBzaG91bGQgY2FsY3VsYXRlIHRoZSBtYXRjaCBjdXJ2ZSB0byB0ZW1wbGF0ZSBjdXJ2ZSBzY29yZSBhbmQgcmV0dXJuIGl0IGZvciBlYWNoIG1hdGNoIHJlc3VsdC4KKyAgICBpbnQgICAgY29ycmVsYXRpb25TY29yZTsgICAgICAgICAgIC8vU2V0IHRoaXMgZWxlbWVudCB0byBUUlVFIHRvIHNwZWNpZnkgdGhhdCB0aGUgZnVuY3Rpb24gc2hvdWxkIGNhbGN1bGF0ZSB0aGUgY29ycmVsYXRpb24gc2NvcmUgYW5kIHJldHVybiBpdCBmb3IgZWFjaCBtYXRjaCByZXN1bHQuCisgICAgZG91YmxlIG1pbk1hdGNoU2VwYXJhdGlvbkRpc3RhbmNlOyAvL1NwZWNpZmllcyB0aGUgbWluaW11bSBzZXBhcmF0aW9uIGRpc3RhbmNlLCBpbiBwaXhlbHMsIGJldHdlZW4gdGhlIG9yaWdpbnMgb2YgdHdvIG1hdGNoZXMgdGhhdCBoYXZlIHVuaXF1ZSBwb3NpdGlvbnMuCisgICAgZG91YmxlIG1pbk1hdGNoU2VwYXJhdGlvbkFuZ2xlOyAgICAvL1NwZWNpZmllcyB0aGUgbWluaW11bSBhbmd1bGFyIGRpZmZlcmVuY2UsIGluIGRlZ3JlZXMsIGJldHdlZW4gdHdvIG1hdGNoZXMgdGhhdCBoYXZlIHVuaXF1ZSBhbmdsZXMuCisgICAgZG91YmxlIG1pbk1hdGNoU2VwYXJhdGlvblNjYWxlOyAgICAvL1NwZWNpZmllcyB0aGUgbWluaW11bSBkaWZmZXJlbmNlIGluIHNjYWxlLCBleHByZXNzZWQgYXMgYSBwZXJjZW50YWdlLCBiZXR3ZWVuIHR3byBtYXRjaGVzIHRoYXQgaGF2ZSB1bmlxdWUgc2NhbGVzLgorICAgIGRvdWJsZSBtYXhNYXRjaE92ZXJsYXA7ICAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIG1heGltdW0gYW1vdW50IG9mIG92ZXJsYXAsIGV4cHJlc3NlZCBhcyBhIHBlcmNlbnRhZ2UsIGFsbG93ZWQgYmV0d2VlbiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlcyBvZiB0d28gdW5pcXVlIG1hdGNoZXMuCisgICAgaW50ICAgIGNvYXJzZVJlc3VsdDsgICAgICAgICAgICAgICAvL1NwZWNpZmllcyB3aGV0aGVyIHlvdSB3YW50IHRoZSBmdW5jdGlvbiB0byBzcGVuZCBsZXNzIHRpbWUgYWNjdXJhdGVseSBlc3RpbWF0aW5nIHRoZSBsb2NhdGlvbiBvZiBhIG1hdGNoLgorICAgIGludCAgICBzbW9vdGhDb250b3VyczsgICAgICAgICAgICAgLy9TZXQgdGhpcyBlbGVtZW50IHRvIFRSVUUgdG8gc3BlY2lmeSBzbW9vdGhpbmcgYmUgZG9uZSBvbiB0aGUgY29udG91cnMgb2YgdGhlIGluc3BlY3Rpb24gaW1hZ2UgYmVmb3JlIGZlYXR1cmUgZXh0cmFjdGlvbi4KKyAgICBpbnQgICAgZW5hYmxlQ2FsaWJyYXRpb25TdXBwb3J0OyAgIC8vU2V0IHRoaXMgZWxlbWVudCB0byBUUlVFIHRvIHNwZWNpZnkgdGhlIGFsZ29yaXRobSB0cmVhdCB0aGUgaW5zcGVjdGlvbiBpbWFnZSBhcyBhIGNhbGlicmF0ZWQgaW1hZ2UuCit9IE1hdGNoR2VvbWV0cmljUGF0dGVybkFkdmFuY2VkT3B0aW9uczI7CisKK3R5cGVkZWYgc3RydWN0IEluc3BlY3Rpb25BbGlnbm1lbnRfc3RydWN0IHsKKyAgICBQb2ludEZsb2F0IHBvc2l0aW9uOyAvL1RoZSBsb2NhdGlvbiBvZiB0aGUgY2VudGVyIG9mIHRoZSBnb2xkZW4gdGVtcGxhdGUgaW4gdGhlIGltYWdlIHVuZGVyIGluc3BlY3Rpb24uCisgICAgZmxvYXQgICAgICByb3RhdGlvbjsgLy9UaGUgcm90YXRpb24gb2YgdGhlIGdvbGRlbiB0ZW1wbGF0ZSBpbiB0aGUgaW1hZ2UgdW5kZXIgaW5zcGVjdGlvbiwgaW4gZGVncmVlcy4KKyAgICBmbG9hdCAgICAgIHNjYWxlOyAgICAvL1RoZSBwZXJjZW50YWdlIG9mIHRoZSBzaXplIG9mIHRoZSBhcmVhIHVuZGVyIGluc3BlY3Rpb24gY29tcGFyZWQgdG8gdGhlIHNpemUgb2YgdGhlIGdvbGRlbiB0ZW1wbGF0ZS4KK30gSW5zcGVjdGlvbkFsaWdubWVudDsKKwordHlwZWRlZiBzdHJ1Y3QgSW5zcGVjdGlvbk9wdGlvbnNfc3RydWN0IHsKKyAgICBSZWdpc3RyYXRpb25NZXRob2QgIHJlZ2lzdHJhdGlvbk1ldGhvZDsgICAgLy9TcGVjaWZpZXMgaG93IHRoZSBmdW5jdGlvbiByZWdpc3RlcnMgdGhlIGdvbGRlbiB0ZW1wbGF0ZSBhbmQgdGhlIHRhcmdldCBpbWFnZS4KKyAgICBOb3JtYWxpemF0aW9uTWV0aG9kIG5vcm1hbGl6YXRpb25NZXRob2Q7ICAgLy9TcGVjaWZpZXMgaG93IHRoZSBmdW5jdGlvbiBub3JtYWxpemVzIHRoZSBnb2xkZW4gdGVtcGxhdGUgdG8gdGhlIHRhcmdldCBpbWFnZS4KKyAgICBpbnQgICAgICAgICAgICAgICAgIGVkZ2VUaGlja25lc3NUb0lnbm9yZTsgLy9TcGVjaWZpZXMgZGVzaXJlZCB0aGlja25lc3Mgb2YgZWRnZXMgdG8gYmUgaWdub3JlZC4KKyAgICBmbG9hdCAgICAgICAgICAgICAgIGJyaWdodFRocmVzaG9sZDsgICAgICAgLy9TcGVjaWZpZXMgdGhlIHRocmVzaG9sZCBmb3IgYXJlYXMgd2hlcmUgdGhlIHRhcmdldCBpbWFnZSBpcyBicmlnaHRlciB0aGFuIHRoZSBnb2xkZW4gdGVtcGxhdGUuCisgICAgZmxvYXQgICAgICAgICAgICAgICBkYXJrVGhyZXNob2xkOyAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSB0aHJlc2hvbGQgZm9yIGFyZWFzIHdoZXJlIHRoZSB0YXJnZXQgaW1hZ2UgaXMgZGFya2VyIHRoYW4gdGhlIGdvbGRlbiB0ZW1wbGF0ZS4KKyAgICBpbnQgICAgICAgICAgICAgICAgIGJpbmFyeTsgICAgICAgICAgICAgICAgLy9TcGVjaWZpZXMgd2hldGhlciB0aGUgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBhIGJpbmFyeSBpbWFnZSBnaXZpbmcgdGhlIGxvY2F0aW9uIG9mIGRlZmVjdHMsIG9yIGEgZ3JheXNjYWxlIGltYWdlIGdpdmluZyB0aGUgaW50ZW5zaXR5IG9mIGRlZmVjdHMuCit9IEluc3BlY3Rpb25PcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBDaGFyUmVwb3J0Ml9zdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqIGNoYXJhY3RlcjsgICAgICAgICAgIC8vVGhlIGNoYXJhY3RlciB2YWx1ZS4KKyAgICBQb2ludEZsb2F0ICBjb3JuZXJbNF07ICAgICAgICAgICAvL0FuIGFycmF5IG9mIGZvdXIgcG9pbnRzIHRoYXQgZGVzY3JpYmVzIHRoZSByZWN0YW5nbGUgdGhhdCBzdXJyb3VuZHMgdGhlIGNoYXJhY3Rlci4KKyAgICBpbnQgICAgICAgICBsb3dUaHJlc2hvbGQ7ICAgICAgICAvL1RoZSBtaW5pbXVtIHZhbHVlIG9mIHRoZSB0aHJlc2hvbGQgcmFuZ2UgdXNlZCBmb3IgdGhpcyBjaGFyYWN0ZXIuCisgICAgaW50ICAgICAgICAgaGlnaFRocmVzaG9sZDsgICAgICAgLy9UaGUgbWF4aW11bSB2YWx1ZSBvZiB0aGUgdGhyZXNob2xkIHJhbmdlIHVzZWQgZm9yIHRoaXMgY2hhcmFjdGVyLgorICAgIGludCAgICAgICAgIGNsYXNzaWZpY2F0aW9uU2NvcmU7IC8vVGhlIGRlZ3JlZSB0byB3aGljaCB0aGUgYXNzaWduZWQgY2hhcmFjdGVyIGNsYXNzIHJlcHJlc2VudHMgdGhlIG9iamVjdCBiZXR0ZXIgdGhhbiB0aGUgb3RoZXIgY2hhcmFjdGVyIGNsYXNzZXMgaW4gdGhlIGNoYXJhY3RlciBzZXQuCisgICAgaW50ICAgICAgICAgdmVyaWZpY2F0aW9uU2NvcmU7ICAgLy9UaGUgc2ltaWxhcml0eSBvZiB0aGUgY2hhcmFjdGVyIGFuZCB0aGUgcmVmZXJlbmNlIGNoYXJhY3RlciBmb3IgdGhlIGNoYXJhY3RlciBjbGFzcy4KKyAgICBpbnQgICAgICAgICB2ZXJpZmllZDsgICAgICAgICAgICAvL1RoaXMgZWxlbWVudCBpcyBUUlVFIGlmIGEgcmVmZXJlbmNlIGNoYXJhY3RlciB3YXMgZm91bmQgZm9yIHRoZSBjaGFyYWN0ZXIgY2xhc3MgYW5kIEZBTFNFIGlmIGEgcmVmZXJlbmNlIGNoYXJhY3RlciB3YXMgbm90IGZvdW5kLgorfSBDaGFyUmVwb3J0MjsKKwordHlwZWRlZiBzdHJ1Y3QgQ2hhckluZm8yX3N0cnVjdCB7CisgICAgY29uc3QgY2hhciogIGNoYXJWYWx1ZTsgICAgICAgLy9SZXRyaWV2ZXMgdGhlIGNoYXJhY3RlciB2YWx1ZSBvZiB0aGUgY29ycmVzcG9uZGluZyBjaGFyYWN0ZXIgaW4gdGhlIGNoYXJhY3RlciBzZXQuCisgICAgY29uc3QgSW1hZ2UqIGNoYXJJbWFnZTsgICAgICAgLy9UaGUgaW1hZ2UgeW91IHVzZWQgdG8gdHJhaW4gdGhpcyBjaGFyYWN0ZXIuCisgICAgY29uc3QgSW1hZ2UqIGludGVybmFsSW1hZ2U7ICAgLy9UaGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gdGhhdCBOSSBWaXNpb24gdXNlcyB0byBtYXRjaCBvYmplY3RzIHRvIHRoaXMgY2hhcmFjdGVyLgorICAgIGludCAgICAgICAgICBpc1JlZmVyZW5jZUNoYXI7IC8vVGhpcyBlbGVtZW50IGlzIFRSVUUgaWYgdGhlIGNoYXJhY3RlciBpcyB0aGUgcmVmZXJlbmNlIGNoYXJhY3RlciBmb3IgdGhlIGNoYXJhY3RlciBjbGFzcy4KK30gQ2hhckluZm8yOworCit0eXBlZGVmIHN0cnVjdCBSZWFkVGV4dFJlcG9ydDJfc3RydWN0IHsKKyAgICBjb25zdCBjaGFyKiAgcmVhZFN0cmluZzsgICAgICAgICAgLy9UaGUgcmVhZCBzdHJpbmcuCisgICAgQ2hhclJlcG9ydDIqIGNoYXJhY3RlclJlcG9ydDsgICAgIC8vQW4gYXJyYXkgb2YgcmVwb3J0cyBkZXNjcmliaW5nIHRoZSBwcm9wZXJ0aWVzIG9mIGVhY2ggaWRlbnRpZmllZCBjaGFyYWN0ZXIuCisgICAgaW50ICAgICAgICAgIG51bUNoYXJhY3RlclJlcG9ydHM7IC8vVGhlIG51bWJlciBvZiBpZGVudGlmaWVkIGNoYXJhY3RlcnMuCit9IFJlYWRUZXh0UmVwb3J0MjsKKwordHlwZWRlZiBzdHJ1Y3QgRWxsaXBzZUZlYXR1cmVfc3RydWN0IHsKKyAgICBQb2ludEZsb2F0IHBvc2l0aW9uOyAgICAvL1RoZSBsb2NhdGlvbiBvZiB0aGUgY2VudGVyIG9mIHRoZSBlbGxpcHNlLgorICAgIGRvdWJsZSAgICAgcm90YXRpb247ICAgIC8vVGhlIG9yaWVudGF0aW9uIG9mIHRoZSBzZW1pLW1ham9yIGF4aXMgb2YgdGhlIGVsbGlwc2Ugd2l0aCByZXNwZWN0IHRvIHRoZSBob3Jpem9udGFsLgorICAgIGRvdWJsZSAgICAgbWlub3JSYWRpdXM7IC8vVGhlIGxlbmd0aCBvZiB0aGUgc2VtaS1taW5vciBheGlzIG9mIHRoZSBlbGxpcHNlLgorICAgIGRvdWJsZSAgICAgbWFqb3JSYWRpdXM7IC8vVGhlIGxlbmd0aCBvZiB0aGUgc2VtaS1tYWpvciBheGlzIG9mIHRoZSBlbGxpcHNlLgorfSBFbGxpcHNlRmVhdHVyZTsKKwordHlwZWRlZiBzdHJ1Y3QgQ2lyY2xlRmVhdHVyZV9zdHJ1Y3QgeworICAgIFBvaW50RmxvYXQgcG9zaXRpb247IC8vVGhlIGxvY2F0aW9uIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGNpcmNsZS4KKyAgICBkb3VibGUgICAgIHJhZGl1czsgICAvL1RoZSByYWRpdXMgb2YgdGhlIGNpcmNsZS4KK30gQ2lyY2xlRmVhdHVyZTsKKwordHlwZWRlZiBzdHJ1Y3QgQ29uc3RDdXJ2ZUZlYXR1cmVfc3RydWN0IHsKKyAgICBQb2ludEZsb2F0IHBvc2l0aW9uOyAgIC8vVGhlIGNlbnRlciBvZiB0aGUgY2lyY2xlIHRoYXQgdGhpcyBjb25zdGFudCBjdXJ2ZSBsaWVzIHVwb24uCisgICAgZG91YmxlICAgICByYWRpdXM7ICAgICAvL1RoZSByYWRpdXMgb2YgdGhlIGNpcmNsZSB0aGF0IHRoaXMgY29uc3RhbnQgY3VydmUgbGllcyB1cG9uLgorICAgIGRvdWJsZSAgICAgc3RhcnRBbmdsZTsgLy9XaGVuIHRyYXZlbGluZyBhbG9uZyB0aGUgY29uc3RhbnQgY3VydmUgZnJvbSBvbmUgZW5kcG9pbnQgdG8gdGhlIG5leHQgaW4gYSBjb3VudGVyY2xvY2t3aXNlIG1hbm5lciwgdGhpcyBpcyB0aGUgYW5ndWxhciBjb21wb25lbnQgb2YgdGhlIHZlY3RvciBvcmlnaW5hdGluZyBhdCB0aGUgY2VudGVyIG9mIHRoZSBjb25zdGFudCBjdXJ2ZSBhbmQgcG9pbnRpbmcgdG93YXJkcyB0aGUgZmlyc3QgZW5kcG9pbnQgb2YgdGhlIGNvbnN0YW50IGN1cnZlLgorICAgIGRvdWJsZSAgICAgZW5kQW5nbGU7ICAgLy9XaGVuIHRyYXZlbGluZyBhbG9uZyB0aGUgY29uc3RhbnQgY3VydmUgZnJvbSBvbmUgZW5kcG9pbnQgdG8gdGhlIG5leHQgaW4gYSBjb3VudGVyY2xvY2t3aXNlIG1hbm5lciwgdGhpcyBpcyB0aGUgYW5ndWxhciBjb21wb25lbnQgb2YgdGhlIHZlY3RvciBvcmlnaW5hdGluZyBhdCB0aGUgY2VudGVyIG9mIHRoZSBjb25zdGFudCBjdXJ2ZSBhbmQgcG9pbnRpbmcgdG93YXJkcyB0aGUgc2Vjb25kIGVuZHBvaW50IG9mIHRoZSBjb25zdGFudCBjdXJ2ZS4KK30gQ29uc3RDdXJ2ZUZlYXR1cmU7CisKK3R5cGVkZWYgc3RydWN0IFJlY3RhbmdsZUZlYXR1cmVfc3RydWN0IHsKKyAgICBQb2ludEZsb2F0IHBvc2l0aW9uOyAgLy9UaGUgY2VudGVyIG9mIHRoZSByZWN0YW5nbGUuCisgICAgUG9pbnRGbG9hdCBjb3JuZXJbNF07IC8vVGhlIGZvdXIgY29ybmVycyBvZiB0aGUgcmVjdGFuZ2xlLgorICAgIGRvdWJsZSAgICAgcm90YXRpb247ICAvL1RoZSBvcmllbnRhdGlvbiBvZiB0aGUgcmVjdGFuZ2xlIHdpdGggcmVzcGVjdCB0byB0aGUgaG9yaXpvbnRhbC4KKyAgICBkb3VibGUgICAgIHdpZHRoOyAgICAgLy9UaGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4KKyAgICBkb3VibGUgICAgIGhlaWdodDsgICAgLy9UaGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuCit9IFJlY3RhbmdsZUZlYXR1cmU7CisKK3R5cGVkZWYgc3RydWN0IExlZ0ZlYXR1cmVfc3RydWN0IHsKKyAgICBQb2ludEZsb2F0IHBvc2l0aW9uOyAgLy9UaGUgbG9jYXRpb24gb2YgdGhlIGxlZyBmZWF0dXJlLgorICAgIFBvaW50RmxvYXQgY29ybmVyWzRdOyAvL1RoZSBmb3VyIGNvcm5lcnMgb2YgdGhlIGxlZyBmZWF0dXJlLgorICAgIGRvdWJsZSAgICAgcm90YXRpb247ICAvL1RoZSBvcmllbnRhdGlvbiBvZiB0aGUgbGVnIHdpdGggcmVzcGVjdCB0byB0aGUgaG9yaXpvbnRhbC4KKyAgICBkb3VibGUgICAgIHdpZHRoOyAgICAgLy9UaGUgd2lkdGggb2YgdGhlIGxlZy4KKyAgICBkb3VibGUgICAgIGhlaWdodDsgICAgLy9UaGUgaGVpZ2h0IG9mIHRoZSBsZWcuCit9IExlZ0ZlYXR1cmU7CisKK3R5cGVkZWYgc3RydWN0IENvcm5lckZlYXR1cmVfc3RydWN0IHsKKyAgICBQb2ludEZsb2F0IHBvc2l0aW9uOyAgICAgIC8vVGhlIGxvY2F0aW9uIG9mIHRoZSBjb3JuZXIgZmVhdHVyZS4KKyAgICBkb3VibGUgICAgIHJvdGF0aW9uOyAgICAgIC8vVGhlIGFuZ3VsYXIgY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IgYmlzZWN0aW5nIHRoZSBjb3JuZXIgZnJvbSBwb3NpdGlvbi4KKyAgICBkb3VibGUgICAgIGVuY2xvc2VkQW5nbGU7IC8vVGhlIG1lYXN1cmUgb2YgdGhlIGVuY2xvc2VkIGFuZ2xlIG9mIHRoZSBjb3JuZXIuCisgICAgaW50ICAgICAgICBpc1ZpcnR1YWw7ICAgICAKK30gQ29ybmVyRmVhdHVyZTsKKwordHlwZWRlZiBzdHJ1Y3QgTGluZUZlYXR1cmVfc3RydWN0IHsKKyAgICBQb2ludEZsb2F0IHN0YXJ0UG9pbnQ7IC8vVGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBsaW5lLgorICAgIFBvaW50RmxvYXQgZW5kUG9pbnQ7ICAgLy9UaGUgZW5kaW5nIHBvaW50IG9mIHRoZSBsaW5lLgorICAgIGRvdWJsZSAgICAgbGVuZ3RoOyAgICAgLy9UaGUgbGVuZ3RoIG9mIHRoZSBsaW5lIG1lYXN1cmVkIGluIHBpeGVscyBmcm9tIHRoZSBzdGFydCBwb2ludCB0byB0aGUgZW5kIHBvaW50LgorICAgIGRvdWJsZSAgICAgcm90YXRpb247ICAgLy9UaGUgb3JpZW50YXRpb24gb2YgdGhlIGxpbmUgd2l0aCByZXNwZWN0IHRvIHRoZSBob3Jpem9udGFsLgorfSBMaW5lRmVhdHVyZTsKKwordHlwZWRlZiBzdHJ1Y3QgUGFyYWxsZWxMaW5lUGFpckZlYXR1cmVfc3RydWN0IHsKKyAgICBQb2ludEZsb2F0IGZpcnN0U3RhcnRQb2ludDsgIC8vVGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBwYWlyLgorICAgIFBvaW50RmxvYXQgZmlyc3RFbmRQb2ludDsgICAgLy9UaGUgZW5kaW5nIHBvaW50IG9mIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBwYWlyLgorICAgIFBvaW50RmxvYXQgc2Vjb25kU3RhcnRQb2ludDsgLy9UaGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIHNlY29uZCBsaW5lIG9mIHRoZSBwYWlyLgorICAgIFBvaW50RmxvYXQgc2Vjb25kRW5kUG9pbnQ7ICAgLy9UaGUgZW5kaW5nIHBvaW50IG9mIHRoZSBzZWNvbmQgbGluZSBvZiB0aGUgcGFpci4KKyAgICBkb3VibGUgICAgIHJvdGF0aW9uOyAgICAgICAgIC8vVGhlIG9yaWVudGF0aW9uIG9mIHRoZSBmZWF0dXJlIHdpdGggcmVzcGVjdCB0byB0aGUgaG9yaXpvbnRhbC4KKyAgICBkb3VibGUgICAgIGRpc3RhbmNlOyAgICAgICAgIC8vVGhlIGRpc3RhbmNlIGZyb20gdGhlIGZpcnN0IGxpbmUgdG8gdGhlIHNlY29uZCBsaW5lLgorfSBQYXJhbGxlbExpbmVQYWlyRmVhdHVyZTsKKwordHlwZWRlZiBzdHJ1Y3QgUGFpck9mUGFyYWxsZWxMaW5lUGFpcnNGZWF0dXJlX3N0cnVjdCB7CisgICAgUGFyYWxsZWxMaW5lUGFpckZlYXR1cmUgZmlyc3RQYXJhbGxlbExpbmVQYWlyOyAgLy9UaGUgZmlyc3QgcGFyYWxsZWwgbGluZSBwYWlyLgorICAgIFBhcmFsbGVsTGluZVBhaXJGZWF0dXJlIHNlY29uZFBhcmFsbGVsTGluZVBhaXI7IC8vVGhlIHNlY29uZCBwYXJhbGxlbCBsaW5lIHBhaXIuCisgICAgZG91YmxlICAgICAgICAgICAgICAgICAgcm90YXRpb247ICAgICAgICAgICAgICAgLy9UaGUgb3JpZW50YXRpb24gb2YgdGhlIGZlYXR1cmUgd2l0aCByZXNwZWN0IHRvIHRoZSBob3Jpem9udGFsLgorICAgIGRvdWJsZSAgICAgICAgICAgICAgICAgIGRpc3RhbmNlOyAgICAgICAgICAgICAgIC8vVGhlIGRpc3RhbmNlIGZyb20gdGhlIG1pZGxpbmUgb2YgdGhlIGZpcnN0IHBhcmFsbGVsIGxpbmUgcGFpciB0byB0aGUgbWlkbGluZSBvZiB0aGUgc2Vjb25kIHBhcmFsbGVsIGxpbmUgcGFpci4KK30gUGFpck9mUGFyYWxsZWxMaW5lUGFpcnNGZWF0dXJlOworCit0eXBlZGVmIHVuaW9uIEdlb21ldHJpY0ZlYXR1cmVfdW5pb24geworICAgIENpcmNsZUZlYXR1cmUqICAgICAgICAgICAgICAgICAgY2lyY2xlOyAgICAgICAgICAgICAgICAgIC8vQSBwb2ludGVyIHRvIGEgQ2lyY2xlRmVhdHVyZS4KKyAgICBFbGxpcHNlRmVhdHVyZSogICAgICAgICAgICAgICAgIGVsbGlwc2U7ICAgICAgICAgICAgICAgICAvL0EgcG9pbnRlciB0byBhbiBFbGxpcHNlRmVhdHVyZS4KKyAgICBDb25zdEN1cnZlRmVhdHVyZSogICAgICAgICAgICAgIGNvbnN0Q3VydmU7ICAgICAgICAgICAgICAvL0EgcG9pbnRlciB0byBhIENvbnN0Q3VydmVGZWF0dXJlLgorICAgIFJlY3RhbmdsZUZlYXR1cmUqICAgICAgICAgICAgICAgcmVjdGFuZ2xlOyAgICAgICAgICAgICAgIC8vQSBwb2ludGVyIHRvIGEgUmVjdGFuZ2xlRmVhdHVyZS4KKyAgICBMZWdGZWF0dXJlKiAgICAgICAgICAgICAgICAgICAgIGxlZzsgICAgICAgICAgICAgICAgICAgICAvL0EgcG9pbnRlciB0byBhIExlZ0ZlYXR1cmUuCisgICAgQ29ybmVyRmVhdHVyZSogICAgICAgICAgICAgICAgICBjb3JuZXI7ICAgICAgICAgICAgICAgICAgLy9BIHBvaW50ZXIgdG8gYSBDb3JuZXJGZWF0dXJlLgorICAgIFBhcmFsbGVsTGluZVBhaXJGZWF0dXJlKiAgICAgICAgcGFyYWxsZWxMaW5lUGFpcjsgICAgICAgIC8vQSBwb2ludGVyIHRvIGEgUGFyYWxsZWxMaW5lUGFpckZlYXR1cmUuCisgICAgUGFpck9mUGFyYWxsZWxMaW5lUGFpcnNGZWF0dXJlKiBwYWlyT2ZQYXJhbGxlbExpbmVQYWlyczsgLy9BIHBvaW50ZXIgdG8gYSBQYWlyT2ZQYXJhbGxlbExpbmVQYWlyc0ZlYXR1cmUuCisgICAgTGluZUZlYXR1cmUqICAgICAgICAgICAgICAgICAgICBsaW5lOyAgICAgICAgICAgICAgICAgICAgLy9BIHBvaW50ZXIgdG8gYSBMaW5lRmVhdHVyZS4KKyAgICBDbG9zZWRDdXJ2ZUZlYXR1cmUqICAgICAgICAgICAgIGNsb3NlZEN1cnZlOyAgICAgICAgICAgICAvL0EgcG9pbnRlciB0byBhIENsb3NlZEN1cnZlRmVhdHVyZS4KK30gR2VvbWV0cmljRmVhdHVyZTsKKwordHlwZWRlZiBzdHJ1Y3QgRmVhdHVyZURhdGFfc3RydWN0IHsKKyAgICBGZWF0dXJlVHlwZSAgICAgIHR5cGU7ICAgICAgICAgICAgIC8vQW4gZW51bWVyYXRpb24gcmVwcmVzZW50aW5nIHRoZSB0eXBlIG9mIHRoZSBmZWF0dXJlLgorICAgIFBvaW50RmxvYXQqICAgICAgY29udG91clBvaW50czsgICAgLy9BIHNldCBvZiBwb2ludHMgZGVzY3JpYmluZyB0aGUgY29udG91ciBvZiB0aGUgZmVhdHVyZS4KKyAgICBpbnQgICAgICAgICAgICAgIG51bUNvbnRvdXJQb2ludHM7IC8vVGhlIG51bWJlciBvZiBwb2ludHMgaW4gdGhlIGNvbnRvdXJQb2ludHMgYXJyYXkuCisgICAgR2VvbWV0cmljRmVhdHVyZSBmZWF0dXJlOyAgICAgICAgICAvL1RoZSBmZWF0dXJlIGRhdGEgc3BlY2lmaWMgdG8gdGhpcyB0eXBlIG9mIGZlYXR1cmUuCit9IEZlYXR1cmVEYXRhOworCit0eXBlZGVmIHN0cnVjdCBHZW9tZXRyaWNQYXR0ZXJuTWF0Y2gyX3N0cnVjdCB7CisgICAgUG9pbnRGbG9hdCAgIHBvc2l0aW9uOyAgICAgICAgICAgICAgICAvL1RoZSBsb2NhdGlvbiBvZiB0aGUgb3JpZ2luIG9mIHRoZSB0ZW1wbGF0ZSBpbiB0aGUgbWF0Y2guCisgICAgZmxvYXQgICAgICAgIHJvdGF0aW9uOyAgICAgICAgICAgICAgICAvL1RoZSByb3RhdGlvbiBvZiB0aGUgbWF0Y2ggcmVsYXRpdmUgdG8gdGhlIHRlbXBsYXRlIGltYWdlLCBpbiBkZWdyZWVzLgorICAgIGZsb2F0ICAgICAgICBzY2FsZTsgICAgICAgICAgICAgICAgICAgLy9UaGUgc2l6ZSBvZiB0aGUgbWF0Y2ggcmVsYXRpdmUgdG8gdGhlIHNpemUgb2YgdGhlIHRlbXBsYXRlIGltYWdlLCBleHByZXNzZWQgYXMgYSBwZXJjZW50YWdlLgorICAgIGZsb2F0ICAgICAgICBzY29yZTsgICAgICAgICAgICAgICAgICAgLy9UaGUgYWNjdXJhY3kgb2YgdGhlIG1hdGNoLgorICAgIFBvaW50RmxvYXQgICBjb3JuZXJbNF07ICAgICAgICAgICAgICAgLy9BbiBhcnJheSBvZiBmb3VyIHBvaW50cyBkZXNjcmliaW5nIHRoZSByZWN0YW5nbGUgc3Vycm91bmRpbmcgdGhlIHRlbXBsYXRlIGltYWdlLgorICAgIGludCAgICAgICAgICBpbnZlcnNlOyAgICAgICAgICAgICAgICAgLy9UaGlzIGVsZW1lbnQgaXMgVFJVRSBpZiB0aGUgbWF0Y2ggaXMgYW4gaW52ZXJzZSBvZiB0aGUgdGVtcGxhdGUgaW1hZ2UuCisgICAgZmxvYXQgICAgICAgIG9jY2x1c2lvbjsgICAgICAgICAgICAgICAvL1RoZSBwZXJjZW50YWdlIG9mIHRoZSBtYXRjaCB0aGF0IGlzIG9jY2x1ZGVkLgorICAgIGZsb2F0ICAgICAgICB0ZW1wbGF0ZU1hdGNoQ3VydmVTY29yZTsgLy9UaGUgYWNjdXJhY3kgb2YgdGhlIG1hdGNoIG9idGFpbmVkIGJ5IGNvbXBhcmluZyB0aGUgdGVtcGxhdGUgY3VydmVzIHRvIHRoZSBjdXJ2ZXMgaW4gdGhlIG1hdGNoIHJlZ2lvbi4KKyAgICBmbG9hdCAgICAgICAgbWF0Y2hUZW1wbGF0ZUN1cnZlU2NvcmU7IC8vVGhlIGFjY3VyYWN5IG9mIHRoZSBtYXRjaCBvYnRhaW5lZCBieSBjb21wYXJpbmcgdGhlIGN1cnZlcyBpbiB0aGUgbWF0Y2ggcmVnaW9uIHRvIHRoZSB0ZW1wbGF0ZSBjdXJ2ZXMuCisgICAgZmxvYXQgICAgICAgIGNvcnJlbGF0aW9uU2NvcmU7ICAgICAgICAvL1RoZSBhY2N1cmFjeSBvZiB0aGUgbWF0Y2ggb2J0YWluZWQgYnkgY29tcGFyaW5nIHRoZSB0ZW1wbGF0ZSBpbWFnZSB0byB0aGUgbWF0Y2ggcmVnaW9uIHVzaW5nIGEgY29ycmVsYXRpb24gbWV0cmljIHRoYXQgY29tcGFyZXMgdGhlIHR3byByZWdpb25zIGFzIGEgZnVuY3Rpb24gb2YgdGhlaXIgcGl4ZWwgdmFsdWVzLgorICAgIFN0cmluZzI1NSAgICBsYWJlbDsgICAgICAgICAgICAgICAgICAgLy9UaGUgbGFiZWwgY29ycmVzcG9uZGluZyB0byB0aGlzIG1hdGNoIHdoZW4gdGhlIG1hdGNoIGlzIHJldHVybmVkIGJ5IGltYXFNYXRjaE11bHRpcGxlR2VvbWV0cmljUGF0dGVybnMoKS4KKyAgICBGZWF0dXJlRGF0YSogZmVhdHVyZURhdGE7ICAgICAgICAgICAgIC8vVGhlIGZlYXR1cmVzIHVzZWQgaW4gdGhpcyBtYXRjaC4KKyAgICBpbnQgICAgICAgICAgbnVtRmVhdHVyZURhdGE7ICAgICAgICAgIC8vVGhlIHNpemUgb2YgdGhlIGZlYXR1cmVEYXRhIGFycmF5LgorICAgIFBvaW50RmxvYXQgICBjYWxpYnJhdGVkUG9zaXRpb247ICAgICAgLy9UaGUgbG9jYXRpb24gb2YgdGhlIG9yaWdpbiBvZiB0aGUgdGVtcGxhdGUgaW4gdGhlIG1hdGNoLgorICAgIGZsb2F0ICAgICAgICBjYWxpYnJhdGVkUm90YXRpb247ICAgICAgLy9UaGUgcm90YXRpb24gb2YgdGhlIG1hdGNoIHJlbGF0aXZlIHRvIHRoZSB0ZW1wbGF0ZSBpbWFnZSwgaW4gZGVncmVlcy4KKyAgICBQb2ludEZsb2F0ICAgY2FsaWJyYXRlZENvcm5lcls0XTsgICAgIC8vQW4gYXJyYXkgb2YgZm91ciBwb2ludHMgZGVzY3JpYmluZyB0aGUgcmVjdGFuZ2xlIHN1cnJvdW5kaW5nIHRoZSB0ZW1wbGF0ZSBpbWFnZS4KK30gR2VvbWV0cmljUGF0dGVybk1hdGNoMjsKKwordHlwZWRlZiBzdHJ1Y3QgQ2xvc2VkQ3VydmVGZWF0dXJlX3N0cnVjdCB7CisgICAgUG9pbnRGbG9hdCBwb3NpdGlvbjsgIC8vVGhlIGNlbnRlciBvZiB0aGUgY2xvc2VkIGN1cnZlIGZlYXR1cmUuCisgICAgZG91YmxlICAgICBhcmNMZW5ndGg7IC8vVGhlIGFyYyBsZW5ndGggb2YgdGhlIGNsb3NlZCBjdXJ2ZSBmZWF0dXJlLgorfSBDbG9zZWRDdXJ2ZUZlYXR1cmU7CisKK3R5cGVkZWYgc3RydWN0IExpbmVNYXRjaF9zdHJ1Y3QgeworICAgIFBvaW50RmxvYXQgc3RhcnRQb2ludDsgLy9UaGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIG1hdGNoZWQgbGluZS4KKyAgICBQb2ludEZsb2F0IGVuZFBvaW50OyAgIC8vVGhlIGVuZGluZyBwb2ludCBvZiB0aGUgbWF0Y2hlZCBsaW5lLgorICAgIGRvdWJsZSAgICAgbGVuZ3RoOyAgICAgLy9UaGUgbGVuZ3RoIG9mIHRoZSBsaW5lIG1lYXN1cmVkIGluIHBpeGVscyBmcm9tIHRoZSBzdGFydCBwb2ludCB0byB0aGUgZW5kIHBvaW50LgorICAgIGRvdWJsZSAgICAgcm90YXRpb247ICAgLy9UaGUgb3JpZW50YXRpb24gb2YgdGhlIG1hdGNoZWQgbGluZS4KKyAgICBkb3VibGUgICAgIHNjb3JlOyAgICAgIC8vVGhlIHNjb3JlIG9mIHRoZSBtYXRjaGVkIGxpbmUuCit9IExpbmVNYXRjaDsKKwordHlwZWRlZiBzdHJ1Y3QgTGluZURlc2NyaXB0b3Jfc3RydWN0IHsKKyAgICBkb3VibGUgbWluTGVuZ3RoOyAvL1NwZWNpZmllcyB0aGUgbWluaW11bSBsZW5ndGggb2YgYSBsaW5lIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybi4KKyAgICBkb3VibGUgbWF4TGVuZ3RoOyAvL1NwZWNpZmllcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgYSBsaW5lIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybi4KK30gTGluZURlc2NyaXB0b3I7CisKK3R5cGVkZWYgc3RydWN0IFJlY3RhbmdsZURlc2NyaXB0b3Jfc3RydWN0IHsKKyAgICBkb3VibGUgbWluV2lkdGg7ICAvL1NwZWNpZmllcyB0aGUgbWluaW11bSB3aWR0aCBvZiBhIHJlY3RhbmdsZSB0aGUgYWxnb3JpdGhtIHdpbGwgcmV0dXJuLgorICAgIGRvdWJsZSBtYXhXaWR0aDsgIC8vU3BlY2lmaWVzIHRoZSBtYXhpbXVtIHdpZHRoIG9mIGEgcmVjdGFuZ2xlIHRoZSBhbGdvcml0aG0gd2lsbCByZXR1cm4uCisgICAgZG91YmxlIG1pbkhlaWdodDsgLy9TcGVjaWZpZXMgdGhlIG1pbmltdW0gaGVpZ2h0IG9mIGEgcmVjdGFuZ2xlIHRoZSBhbGdvcml0aG0gd2lsbCByZXR1cm4uCisgICAgZG91YmxlIG1heEhlaWdodDsgLy9TcGVjaWZpZXMgdGhlIG1heGltdW0gaGVpZ2h0IG9mIGEgcmVjdGFuZ2xlIHRoZSBhbGdvcml0aG0gd2lsbCByZXR1cm4uCit9IFJlY3RhbmdsZURlc2NyaXB0b3I7CisKK3R5cGVkZWYgc3RydWN0IFJlY3RhbmdsZU1hdGNoX3N0cnVjdCB7CisgICAgUG9pbnRGbG9hdCBjb3JuZXJbNF07IC8vVGhlIGNvcm5lcnMgb2YgdGhlIG1hdGNoZWQgcmVjdGFuZ2xlLgorICAgIGRvdWJsZSAgICAgcm90YXRpb247ICAvL1RoZSBvcmllbnRhdGlvbiBvZiB0aGUgbWF0Y2hlZCByZWN0YW5nbGUuCisgICAgZG91YmxlICAgICB3aWR0aDsgICAgIC8vVGhlIHdpZHRoIG9mIHRoZSBtYXRjaGVkIHJlY3RhbmdsZS4KKyAgICBkb3VibGUgICAgIGhlaWdodDsgICAgLy9UaGUgaGVpZ2h0IG9mIHRoZSBtYXRjaGVkIHJlY3RhbmdsZS4KKyAgICBkb3VibGUgICAgIHNjb3JlOyAgICAgLy9UaGUgc2NvcmUgb2YgdGhlIG1hdGNoZWQgcmVjdGFuZ2xlLgorfSBSZWN0YW5nbGVNYXRjaDsKKwordHlwZWRlZiBzdHJ1Y3QgRWxsaXBzZURlc2NyaXB0b3Jfc3RydWN0IHsKKyAgICBkb3VibGUgbWluTWFqb3JSYWRpdXM7IC8vU3BlY2lmaWVzIHRoZSBtaW5pbXVtIGxlbmd0aCBvZiB0aGUgc2VtaS1tYWpvciBheGlzIG9mIGFuIGVsbGlwc2UgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuLgorICAgIGRvdWJsZSBtYXhNYWpvclJhZGl1czsgLy9TcGVjaWZpZXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBzZW1pLW1ham9yIGF4aXMgb2YgYW4gZWxsaXBzZSB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4uCisgICAgZG91YmxlIG1pbk1pbm9yUmFkaXVzOyAvL1NwZWNpZmllcyB0aGUgbWluaW11bSBsZW5ndGggb2YgdGhlIHNlbWktbWlub3IgYXhpcyBvZiBhbiBlbGxpcHNlIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybi4KKyAgICBkb3VibGUgbWF4TWlub3JSYWRpdXM7IC8vU3BlY2lmaWVzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgc2VtaS1taW5vciBheGlzIG9mIGFuIGVsbGlwc2UgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuLgorfSBFbGxpcHNlRGVzY3JpcHRvcjsKKwordHlwZWRlZiBzdHJ1Y3QgRWxsaXBzZU1hdGNoX3N0cnVjdCB7CisgICAgUG9pbnRGbG9hdCBwb3NpdGlvbjsgICAgLy9UaGUgbG9jYXRpb24gb2YgdGhlIGNlbnRlciBvZiB0aGUgbWF0Y2hlZCBlbGxpcHNlLgorICAgIGRvdWJsZSAgICAgcm90YXRpb247ICAgIC8vVGhlIG9yaWVudGF0aW9uIG9mIHRoZSBtYXRjaGVkIGVsbGlwc2UuCisgICAgZG91YmxlICAgICBtYWpvclJhZGl1czsgLy9UaGUgbGVuZ3RoIG9mIHRoZSBzZW1pLW1ham9yIGF4aXMgb2YgdGhlIG1hdGNoZWQgZWxsaXBzZS4KKyAgICBkb3VibGUgICAgIG1pbm9yUmFkaXVzOyAvL1RoZSBsZW5ndGggb2YgdGhlIHNlbWktbWlub3IgYXhpcyBvZiB0aGUgbWF0Y2hlZCBlbGxpcHNlLgorICAgIGRvdWJsZSAgICAgc2NvcmU7ICAgICAgIC8vVGhlIHNjb3JlIG9mIHRoZSBtYXRjaGVkIGVsbGlwc2UuCit9IEVsbGlwc2VNYXRjaDsKKwordHlwZWRlZiBzdHJ1Y3QgQ2lyY2xlTWF0Y2hfc3RydWN0IHsKKyAgICBQb2ludEZsb2F0IHBvc2l0aW9uOyAvL1RoZSBsb2NhdGlvbiBvZiB0aGUgY2VudGVyIG9mIHRoZSBtYXRjaGVkIGNpcmNsZS4KKyAgICBkb3VibGUgICAgIHJhZGl1czsgICAvL1RoZSByYWRpdXMgb2YgdGhlIG1hdGNoZWQgY2lyY2xlLgorICAgIGRvdWJsZSAgICAgc2NvcmU7ICAgIC8vVGhlIHNjb3JlIG9mIHRoZSBtYXRjaGVkIGNpcmNsZS4KK30gQ2lyY2xlTWF0Y2g7CisKK3R5cGVkZWYgc3RydWN0IENpcmNsZURlc2NyaXB0b3Jfc3RydWN0IHsKKyAgICBkb3VibGUgbWluUmFkaXVzOyAvL1NwZWNpZmllcyB0aGUgbWluaW11bSByYWRpdXMgb2YgYSBjaXJjbGUgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuLgorICAgIGRvdWJsZSBtYXhSYWRpdXM7IC8vU3BlY2lmaWVzIHRoZSBtYXhpbXVtIHJhZGl1cyBvZiBhIGNpcmNsZSB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4uCit9IENpcmNsZURlc2NyaXB0b3I7CisKK3R5cGVkZWYgc3RydWN0IFNoYXBlRGV0ZWN0aW9uT3B0aW9uc19zdHJ1Y3QgeworICAgIHVuc2lnbmVkIGludCBtb2RlOyAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIG1ldGhvZCB1c2VkIHdoZW4gbG9va2luZyBmb3IgdGhlIHNoYXBlIGluIHRoZSBpbWFnZS4KKyAgICBSYW5nZUZsb2F0KiAgYW5nbGVSYW5nZXM7ICAgIC8vQW4gYXJyYXkgb2YgYW5nbGUgcmFuZ2VzLCBpbiBkZWdyZWVzLCB3aGVyZSBlYWNoIHJhbmdlIHNwZWNpZmllcyBob3cgbXVjaCB5b3UgZXhwZWN0IHRoZSBzaGFwZSB0byBiZSByb3RhdGVkIGluIHRoZSBpbWFnZS4KKyAgICBpbnQgICAgICAgICAgbnVtQW5nbGVSYW5nZXM7IC8vVGhlIHNpemUgb2YgdGhlIG9yaWVudGF0aW9uUmFuZ2VzIGFycmF5LgorICAgIFJhbmdlRmxvYXQgICBzY2FsZVJhbmdlOyAgICAgLy9BIHJhbmdlIHRoYXQgc3BlY2lmaWVzIHRoZSBzaXplcyBvZiB0aGUgc2hhcGVzIHlvdSBleHBlY3QgdG8gYmUgaW4gdGhlIGltYWdlLCBleHByZXNzZWQgYXMgYSByYXRpbyBwZXJjZW50YWdlIHJlcHJlc2VudGluZyB0aGUgc2l6ZSBvZiB0aGUgcGF0dGVybiBpbiB0aGUgaW1hZ2UgZGl2aWRlZCBieSBzaXplIG9mIHRoZSBvcmlnaW5hbCBwYXR0ZXJuIG11bHRpcGxpZWQgYnkgMTAwLgorICAgIGRvdWJsZSAgICAgICBtaW5NYXRjaFNjb3JlOyAgCit9IFNoYXBlRGV0ZWN0aW9uT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgQ3VydmVfc3RydWN0IHsKKyAgICBQb2ludEZsb2F0KiAgcG9pbnRzOyAgICAgICAgICAgICAgLy9UaGUgcG9pbnRzIG9uIHRoZSBjdXJ2ZS4KKyAgICB1bnNpZ25lZCBpbnQgbnVtUG9pbnRzOyAgICAgICAgICAgLy9UaGUgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgY3VydmUuCisgICAgaW50ICAgICAgICAgIGNsb3NlZDsgICAgICAgICAgICAgIC8vVGhpcyBlbGVtZW50IGlzIFRSVUUgaWYgdGhlIGN1cnZlIGlzIGNsb3NlZCBhbmQgRkFMU0UgaWYgdGhlIGN1cnZlIGlzIG9wZW4uCisgICAgZG91YmxlICAgICAgIGN1cnZlTGVuZ3RoOyAgICAgICAgIC8vVGhlIGxlbmd0aCBvZiB0aGUgY3VydmUuCisgICAgZG91YmxlICAgICAgIG1pbkVkZ2VTdHJlbmd0aDsgICAgIC8vVGhlIGxvd2VzdCBlZGdlIHN0cmVuZ3RoIGRldGVjdGVkIG9uIHRoZSBjdXJ2ZS4KKyAgICBkb3VibGUgICAgICAgbWF4RWRnZVN0cmVuZ3RoOyAgICAgLy9UaGUgaGlnaGVzdCBlZGdlIHN0cmVuZ3RoIGRldGVjdGVkIG9uIHRoZSBjdXJ2ZS4KKyAgICBkb3VibGUgICAgICAgYXZlcmFnZUVkZ2VTdHJlbmd0aDsgLy9UaGUgYXZlcmFnZSBvZiBhbGwgZWRnZSBzdHJlbmd0aHMgZGV0ZWN0ZWQgb24gdGhlIGN1cnZlLgorfSBDdXJ2ZTsKKwordHlwZWRlZiBzdHJ1Y3QgQ3VydmVPcHRpb25zX3N0cnVjdCB7CisgICAgRXh0cmFjdGlvbk1vZGUgZXh0cmFjdGlvbk1vZGU7ICAgLy9TcGVjaWZpZXMgdGhlIG1ldGhvZCB0aGUgZnVuY3Rpb24gdXNlcyB0byBpZGVudGlmeSBjdXJ2ZXMgaW4gdGhlIGltYWdlLgorICAgIGludCAgICAgICAgICAgIHRocmVzaG9sZDsgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBtaW5pbXVtIGNvbnRyYXN0IGEgc2VlZCBwb2ludCBtdXN0IGhhdmUgaW4gb3JkZXIgdG8gYmVnaW4gYSBjdXJ2ZS4KKyAgICBFZGdlRmlsdGVyU2l6ZSBmaWx0ZXJTaXplOyAgICAgICAvL1NwZWNpZmllcyB0aGUgd2lkdGggb2YgdGhlIGVkZ2UgZmlsdGVyIHRoZSBmdW5jdGlvbiB1c2VzIHRvIGlkZW50aWZ5IGN1cnZlcyBpbiB0aGUgaW1hZ2UuCisgICAgaW50ICAgICAgICAgICAgbWluTGVuZ3RoOyAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGxlbmd0aCwgaW4gcGl4ZWxzLCBvZiB0aGUgc21hbGxlc3QgY3VydmUgdGhlIGZ1bmN0aW9uIHdpbGwgZXh0cmFjdC4KKyAgICBpbnQgICAgICAgICAgICByb3dTdGVwU2l6ZTsgICAgICAvL1NwZWNpZmllcyB0aGUgZGlzdGFuY2UsIGluIHRoZSB5IGRpcmVjdGlvbiwgYmV0d2VlbiBsaW5lcyB0aGUgZnVuY3Rpb24gaW5zcGVjdHMgZm9yIGN1cnZlIHNlZWQgcG9pbnRzLgorICAgIGludCAgICAgICAgICAgIGNvbHVtblN0ZXBTaXplOyAgIC8vU3BlY2lmaWVzIHRoZSBkaXN0YW5jZSwgaW4gdGhlIHggZGlyZWN0aW9uLCBiZXR3ZWVuIGNvbHVtbnMgdGhlIGZ1bmN0aW9uIGluc3BlY3RzIGZvciBjdXJ2ZSBzZWVkIHBvaW50cy4KKyAgICBpbnQgICAgICAgICAgICBtYXhFbmRQb2ludEdhcDsgICAvL1NwZWNpZmllcyB0aGUgbWF4aW11bSBnYXAsIGluIHBpeGVscywgYmV0d2VlbiB0aGUgZW5kcG9pbnRzIG9mIGEgY3VydmUgdGhhdCB0aGUgZnVuY3Rpb24gaWRlbnRpZmllcyBhcyBhIGNsb3NlZCBjdXJ2ZS4KKyAgICBpbnQgICAgICAgICAgICBvbmx5Q2xvc2VkOyAgICAgICAvL1NldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSB0byBzcGVjaWZ5IHRoYXQgdGhlIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGlkZW50aWZ5IGNsb3NlZCBjdXJ2ZXMgaW4gdGhlIGltYWdlLgorICAgIGludCAgICAgICAgICAgIHN1YnBpeGVsQWNjdXJhY3k7IC8vU2V0IHRoaXMgZWxlbWVudCB0byBUUlVFIHRvIHNwZWNpZnkgdGhhdCB0aGUgZnVuY3Rpb24gaWRlbnRpZmllcyB0aGUgbG9jYXRpb24gb2YgY3VydmVzIHdpdGggc3VicGl4ZWwgYWNjdXJhY3kgYnkgaW50ZXJwb2xhdGluZyBiZXR3ZWVuIHBvaW50cyB0byBmaW5kIHRoZSBjcm9zc2luZyBvZiB0aHJlc2hvbGQuCit9IEN1cnZlT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgQmFyY29kZTJESW5mb19zdHJ1Y3QgeworICAgIEJhcmNvZGUyRFR5cGUgIHR5cGU7ICAgICAgICAgICAgICAgICAvL1RoZSB0eXBlIG9mIHRoZSAyRCBiYXJjb2RlLgorICAgIGludCAgICAgICAgICAgIGJpbmFyeTsgICAgICAgICAgICAgICAvL1RoaXMgZWxlbWVudCBpcyBUUlVFIGlmIHRoZSAyRCBiYXJjb2RlIGNvbnRhaW5zIGJpbmFyeSBkYXRhIGFuZCBGQUxTRSBpZiB0aGUgMkQgYmFyY29kZSBjb250YWlucyB0ZXh0IGRhdGEuCisgICAgdW5zaWduZWQgY2hhciogZGF0YTsgICAgICAgICAgICAgICAgIC8vVGhlIGRhdGEgZW5jb2RlZCBpbiB0aGUgMkQgYmFyY29kZS4KKyAgICB1bnNpZ25lZCBpbnQgICBkYXRhTGVuZ3RoOyAgICAgICAgICAgLy9UaGUgbGVuZ3RoIG9mIHRoZSBkYXRhIGFycmF5LgorICAgIFBvaW50RmxvYXQgICAgIGJvdW5kaW5nQm94WzRdOyAgICAgICAvL0FuIGFycmF5IG9mIGZvdXIgcG9pbnRzIGRlc2NyaWJpbmcgdGhlIHJlY3RhbmdsZSBzdXJyb3VuZGluZyB0aGUgMkQgYmFyY29kZS4KKyAgICB1bnNpZ25lZCBpbnQgICBudW1FcnJvcnNDb3JyZWN0ZWQ7ICAgLy9UaGUgbnVtYmVyIG9mIGVycm9ycyB0aGUgZnVuY3Rpb24gY29ycmVjdGVkIHdoZW4gZGVjb2RpbmcgdGhlIDJEIGJhcmNvZGUuCisgICAgdW5zaWduZWQgaW50ICAgbnVtRXJhc3VyZXNDb3JyZWN0ZWQ7IC8vVGhlIG51bWJlciBvZiBlcmFzdXJlcyB0aGUgZnVuY3Rpb24gY29ycmVjdGVkIHdoZW4gZGVjb2RpbmcgdGhlIDJEIGJhcmNvZGUuCisgICAgdW5zaWduZWQgaW50ICAgcm93czsgICAgICAgICAgICAgICAgIC8vVGhlIG51bWJlciBvZiByb3dzIGluIHRoZSAyRCBiYXJjb2RlLgorICAgIHVuc2lnbmVkIGludCAgIGNvbHVtbnM7ICAgICAgICAgICAgICAvL1RoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgMkQgYmFyY29kZS4KK30gQmFyY29kZTJESW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgRGF0YU1hdHJpeE9wdGlvbnNfc3RydWN0IHsKKyAgICBCYXJjb2RlMkRTZWFyY2hNb2RlIHNlYXJjaE1vZGU7ICAgLy9TcGVjaWZpZXMgdGhlIG1vZGUgdGhlIGZ1bmN0aW9uIHVzZXMgdG8gc2VhcmNoIGZvciBiYXJjb2Rlcy4KKyAgICBCYXJjb2RlMkRDb250cmFzdCAgIGNvbnRyYXN0OyAgICAgLy9TcGVjaWZpZXMgdGhlIGNvbnRyYXN0IG9mIHRoZSBiYXJjb2RlcyB0aGF0IHRoZSBmdW5jdGlvbiBzZWFyY2hlcyBmb3IuCisgICAgQmFyY29kZTJEQ2VsbFNoYXBlICBjZWxsU2hhcGU7ICAgIC8vU3BlY2lmaWVzIHRoZSBzaGFwZSBvZiB0aGUgYmFyY29kZSBkYXRhIGNlbGxzLCB3aGljaCBhZmZlY3RzIGhvdyB0aGUgZnVuY3Rpb24gZGVjb2RlcyB0aGUgYmFyY29kZS4KKyAgICBCYXJjb2RlMkRTaGFwZSAgICAgIGJhcmNvZGVTaGFwZTsgLy9TcGVjaWZpZXMgdGhlIHNoYXBlIG9mIHRoZSBiYXJjb2RlcyB0aGF0IHRoZSBmdW5jdGlvbiBzZWFyY2hlcyBmb3IuCisgICAgRGF0YU1hdHJpeFN1YnR5cGUgICBzdWJ0eXBlOyAgICAgIC8vU3BlY2lmaWVzIHRoZSBEYXRhIE1hdHJpeCBzdWJ0eXBlcyBvZiB0aGUgYmFyY29kZXMgdGhhdCB0aGUgZnVuY3Rpb24gc2VhcmNoZXMgZm9yLgorfSBEYXRhTWF0cml4T3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgQ2xhc3NpZmllckFjY3VyYWN5UmVwb3J0X3N0cnVjdCB7CisgICAgaW50ICAgICBzaXplOyAgICAgICAgICAgICAgICAgICAgICAgLy9UaGUgc2l6ZSBvZiB0aGUgYXJyYXlzIGluIHRoaXMgc3RydWN0dXJlLgorICAgIGZsb2F0ICAgYWNjdXJhY3k7ICAgICAgICAgICAgICAgICAgIC8vVGhlIG92ZXJhbGwgYWNjdXJhY3kgb2YgdGhlIGNsYXNzaWZpZXIsIGZyb20gMCB0byAxMDAwLgorICAgIGNoYXIqKiAgY2xhc3NOYW1lczsgICAgICAgICAgICAgICAgIC8vVGhlIG5hbWVzIG9mIHRoZSBjbGFzc2VzIG9mIHRoaXMgY2xhc3NpZmllci4KKyAgICBkb3VibGUqIGNsYXNzQWNjdXJhY3k7ICAgICAgICAgICAgICAvL0FuIGFycmF5IG9mIHNpemUgZWxlbWVudHMgdGhhdCBjb250YWlucyBhY2N1cmFjeSBpbmZvcm1hdGlvbiBmb3IgZWFjaCBjbGFzcy4KKyAgICBkb3VibGUqIGNsYXNzUHJlZGljdGl2ZVZhbHVlOyAgICAgICAvL0FuIGFycmF5IGNvbnRhaW5pbmcgc2l6ZSBlbGVtZW50cyB0aGF0IGNvbnRhaW5zIHRoZSBwcmVkaWN0aXZlIHZhbHVlcyBvZiBlYWNoIGNsYXNzLgorICAgIGludCoqICAgY2xhc3NpZmljYXRpb25EaXN0cmlidXRpb247IC8vQSB0d28tZGltZW5zaW9uYWwgYXJyYXkgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCBob3cgdGhlIGNsYXNzaWZpZXIgY2xhc3NpZmllcyBpdHMgc2FtcGxlcy4KK30gQ2xhc3NpZmllckFjY3VyYWN5UmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBOZWFyZXN0TmVpZ2hib3JDbGFzc1Jlc3VsdF9zdHJ1Y3QgeworICAgIGNoYXIqIGNsYXNzTmFtZTsgICAgICAgICAvL1RoZSBuYW1lIG9mIHRoZSBjbGFzcy4KKyAgICBmbG9hdCBzdGFuZGFyZERldmlhdGlvbjsgLy9UaGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBtZW1iZXJzIG9mIHRoaXMgY2xhc3MuCisgICAgaW50ICAgY291bnQ7ICAgICAgICAgICAgIC8vVGhlIG51bWJlciBvZiBzYW1wbGVzIGluIHRoaXMgY2xhc3MuCit9IE5lYXJlc3ROZWlnaGJvckNsYXNzUmVzdWx0OworCit0eXBlZGVmIHN0cnVjdCBOZWFyZXN0TmVpZ2hib3JUcmFpbmluZ1JlcG9ydF9zdHJ1Y3QgeworICAgIGZsb2F0KiogICAgICAgICAgICAgICAgICAgICBjbGFzc0Rpc3RhbmNlc1RhYmxlOyAvL1RoZSBjb25maWRlbmNlIGluIHRoZSB0cmFpbmluZy4KKyAgICBOZWFyZXN0TmVpZ2hib3JDbGFzc1Jlc3VsdCogYWxsU2NvcmVzOyAgICAgICAgICAgLy9BbGwgY2xhc3NlcyBhbmQgdGhlaXIgc2NvcmVzLgorICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBhbGxTY29yZXNTaXplOyAgICAgICAvL1RoZSBudW1iZXIgb2YgZW50cmllcyBpbiBhbGxTY29yZXMuCit9IE5lYXJlc3ROZWlnaGJvclRyYWluaW5nUmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBQYXJ0aWNsZUNsYXNzaWZpZXJQcmVwcm9jZXNzaW5nT3B0aW9uc19zdHJ1Y3QgeworICAgIGludCAgICAgICAgICAgICBtYW51YWxUaHJlc2hvbGQ7ICAgICAgLy9TZXQgdGhpcyBlbGVtZW50IHRvIFRSVUUgdG8gc3BlY2lmeSB0aGUgdGhyZXNob2xkIHJhbmdlIG1hbnVhbGx5LgorICAgIFJhbmdlRmxvYXQgICAgICBtYW51YWxUaHJlc2hvbGRSYW5nZTsgLy9JZiBhIG1hbnVhbCB0aHJlc2hvbGQgaXMgYmVpbmcgZG9uZSwgdGhlIHJhbmdlIG9mIHBpeGVscyB0byBrZWVwLgorICAgIFRocmVzaG9sZE1ldGhvZCBhdXRvVGhyZXNob2xkTWV0aG9kOyAgLy9JZiBhbiBhdXRvbWF0aWMgdGhyZXNob2xkIGlzIGJlaW5nIGRvbmUsIHRoZSBtZXRob2QgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHRocmVzaG9sZCByYW5nZS4KKyAgICBSYW5nZUZsb2F0ICAgICAgbGltaXRzOyAgICAgICAgICAgICAgIC8vVGhlIGxpbWl0cyBvbiB0aGUgYXV0b21hdGljIHRocmVzaG9sZCByYW5nZS4KKyAgICBQYXJ0aWNsZVR5cGUgICAgcGFydGljbGVUeXBlOyAgICAgICAgIC8vU3BlY2lmaWVzIHdoYXQga2luZCBvZiBwYXJ0aWNsZXMgdG8gbG9vayBmb3IuCisgICAgaW50ICAgICAgICAgICAgIHJlamVjdEJvcmRlcjsgICAgICAgICAvL1NldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSB0byByZWplY3QgYm9yZGVyIHBhcnRpY2xlcy4KKyAgICBpbnQgICAgICAgICAgICAgbnVtRXJvc2lvbnM7ICAgICAgICAgIC8vVGhlIG51bWJlciBvZiBlcm9zaW9ucyB0byBwZXJmb3JtLgorfSBQYXJ0aWNsZUNsYXNzaWZpZXJQcmVwcm9jZXNzaW5nT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgQ2xhc3NpZmllclNhbXBsZUluZm9fc3RydWN0IHsKKyAgICBjaGFyKiAgIGNsYXNzTmFtZTsgICAgICAgICAvL1RoZSBuYW1lIG9mIHRoZSBjbGFzcyB0aGlzIHNhbXBsZSBpcyBpbi4KKyAgICBkb3VibGUqIGZlYXR1cmVWZWN0b3I7ICAgICAvL1RoZSBmZWF0dXJlIHZlY3RvciBvZiB0aGlzIHNhbXBsZSwgb3IgTlVMTCBpZiB0aGlzIGlzIG5vdCBhIGN1c3RvbSBjbGFzc2lmaWVyIHNlc3Npb24uCisgICAgaW50ICAgICBmZWF0dXJlVmVjdG9yU2l6ZTsgLy9UaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBmZWF0dXJlIHZlY3Rvci4KKyAgICBJbWFnZSogIHRodW1ibmFpbDsgICAgICAgICAvL0EgdGh1bWJuYWlsIGltYWdlIG9mIHRoaXMgc2FtcGxlLCBvciBOVUxMIGlmIG5vIGltYWdlIHdhcyBzcGVjaWZpZWQuCit9IENsYXNzaWZpZXJTYW1wbGVJbmZvOworCit0eXBlZGVmIHN0cnVjdCBDbGFzc1Njb3JlX3N0cnVjdCB7CisgICAgY2hhciogY2xhc3NOYW1lOyAvL1RoZSBuYW1lIG9mIHRoZSBjbGFzcy4KKyAgICBmbG9hdCBkaXN0YW5jZTsgIC8vVGhlIGRpc3RhbmNlIGZyb20gdGhlIGl0ZW0gdG8gdGhpcyBjbGFzcy4KK30gQ2xhc3NTY29yZTsKKwordHlwZWRlZiBzdHJ1Y3QgQ2xhc3NpZmllclJlcG9ydF9zdHJ1Y3QgeworICAgIGNoYXIqICAgICAgIGJlc3RDbGFzc05hbWU7ICAgICAgIC8vVGhlIG5hbWUgb2YgdGhlIGJlc3QgY2xhc3MgZm9yIHRoZSBzYW1wbGUuCisgICAgZmxvYXQgICAgICAgY2xhc3NpZmljYXRpb25TY29yZTsgLy9UaGUgc2ltaWxhcml0eSBvZiB0aGUgc2FtcGxlIGFuZCB0aGUgdHdvIGNsb3Nlc3QgY2xhc3NlcyBpbiB0aGUgY2xhc3NpZmllci4KKyAgICBmbG9hdCAgICAgICBpZGVudGlmaWNhdGlvblNjb3JlOyAvL1RoZSBzaW1pbGFyaXR5IG9mIHRoZSBzYW1wbGUgYW5kIHRoZSBhc3NpZ25lZCBjbGFzcy4KKyAgICBDbGFzc1Njb3JlKiBhbGxTY29yZXM7ICAgICAgICAgICAvL0FsbCBjbGFzc2VzIGFuZCB0aGVpciBzY29yZXMuCisgICAgaW50ICAgICAgICAgYWxsU2NvcmVzU2l6ZTsgICAgICAgLy9UaGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gYWxsU2NvcmVzLgorfSBDbGFzc2lmaWVyUmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBOZWFyZXN0TmVpZ2hib3JPcHRpb25zX3N0cnVjdCB7CisgICAgTmVhcmVzdE5laWdoYm9yTWV0aG9kIG1ldGhvZDsgLy9UaGUgbWV0aG9kIHRvIHVzZS4KKyAgICBOZWFyZXN0TmVpZ2hib3JNZXRyaWMgbWV0cmljOyAvL1RoZSBtZXRyaWMgdG8gdXNlLgorICAgIGludCAgICAgICAgICAgICAgICAgICBrOyAgICAgIC8vVGhlIHZhbHVlIG9mIGssIGlmIHRoZSBJTUFRX0tfTkVBUkVTVF9ORUlHSEJPUiBtZXRob2QgaXMgdXNlZC4KK30gTmVhcmVzdE5laWdoYm9yT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgUGFydGljbGVDbGFzc2lmaWVyT3B0aW9uc19zdHJ1Y3QgeworICAgIGZsb2F0IHNjYWxlRGVwZW5kZW5jZTsgIC8vVGhlIHJlbGF0aXZlIGltcG9ydGFuY2Ugb2Ygc2NhbGUgd2hlbiBjbGFzc2lmeWluZyBwYXJ0aWNsZXMuCisgICAgZmxvYXQgbWlycm9yRGVwZW5kZW5jZTsgLy9UaGUgcmVsYXRpdmUgaW1wb3J0YW5jZSBvZiBtaXJyb3Igc3ltbWV0cnkgd2hlbiBjbGFzc2lmeWluZyBwYXJ0aWNsZXMuCit9IFBhcnRpY2xlQ2xhc3NpZmllck9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IFJHQlU2NFZhbHVlX3N0cnVjdCB7CisgICAgdW5zaWduZWQgc2hvcnQgQjsgICAgIC8vVGhlIGJsdWUgdmFsdWUgb2YgdGhlIGNvbG9yLgorICAgIHVuc2lnbmVkIHNob3J0IEc7ICAgICAvL1RoZSBncmVlbiB2YWx1ZSBvZiB0aGUgY29sb3IuCisgICAgdW5zaWduZWQgc2hvcnQgUjsgICAgIC8vVGhlIHJlZCB2YWx1ZSBvZiB0aGUgY29sb3IuCisgICAgdW5zaWduZWQgc2hvcnQgYWxwaGE7IC8vVGhlIGFscGhhIHZhbHVlIG9mIHRoZSBjb2xvciwgd2hpY2ggcmVwcmVzZW50cyBleHRyYSBpbmZvcm1hdGlvbiBhYm91dCBhIGNvbG9yIGltYWdlLCBzdWNoIGFzIGdhbW1hIGNvcnJlY3Rpb24uCit9IFJHQlU2NFZhbHVlOworCit0eXBlZGVmIHN0cnVjdCBHZW9tZXRyaWNQYXR0ZXJuTWF0Y2hfc3RydWN0IHsKKyAgICBQb2ludEZsb2F0IHBvc2l0aW9uOyAgICAgICAgICAgICAgICAvL1RoZSBsb2NhdGlvbiBvZiB0aGUgb3JpZ2luIG9mIHRoZSB0ZW1wbGF0ZSBpbiB0aGUgbWF0Y2guCisgICAgZmxvYXQgICAgICByb3RhdGlvbjsgICAgICAgICAgICAgICAgLy9UaGUgcm90YXRpb24gb2YgdGhlIG1hdGNoIHJlbGF0aXZlIHRvIHRoZSB0ZW1wbGF0ZSBpbWFnZSwgaW4gZGVncmVlcy4KKyAgICBmbG9hdCAgICAgIHNjYWxlOyAgICAgICAgICAgICAgICAgICAvL1RoZSBzaXplIG9mIHRoZSBtYXRjaCByZWxhdGl2ZSB0byB0aGUgc2l6ZSBvZiB0aGUgdGVtcGxhdGUgaW1hZ2UsIGV4cHJlc3NlZCBhcyBhIHBlcmNlbnRhZ2UuCisgICAgZmxvYXQgICAgICBzY29yZTsgICAgICAgICAgICAgICAgICAgLy9UaGUgYWNjdXJhY3kgb2YgdGhlIG1hdGNoLgorICAgIFBvaW50RmxvYXQgY29ybmVyWzRdOyAgICAgICAgICAgICAgIC8vQW4gYXJyYXkgb2YgZm91ciBwb2ludHMgZGVzY3JpYmluZyB0aGUgcmVjdGFuZ2xlIHN1cnJvdW5kaW5nIHRoZSB0ZW1wbGF0ZSBpbWFnZS4KKyAgICBpbnQgICAgICAgIGludmVyc2U7ICAgICAgICAgICAgICAgICAvL1RoaXMgZWxlbWVudCBpcyBUUlVFIGlmIHRoZSBtYXRjaCBpcyBhbiBpbnZlcnNlIG9mIHRoZSB0ZW1wbGF0ZSBpbWFnZS4KKyAgICBmbG9hdCAgICAgIG9jY2x1c2lvbjsgICAgICAgICAgICAgICAvL1RoZSBwZXJjZW50YWdlIG9mIHRoZSBtYXRjaCB0aGF0IGlzIG9jY2x1ZGVkLgorICAgIGZsb2F0ICAgICAgdGVtcGxhdGVNYXRjaEN1cnZlU2NvcmU7IC8vVGhlIGFjY3VyYWN5IG9mIHRoZSBtYXRjaCBvYnRhaW5lZCBieSBjb21wYXJpbmcgdGhlIHRlbXBsYXRlIGN1cnZlcyB0byB0aGUgY3VydmVzIGluIHRoZSBtYXRjaCByZWdpb24uCisgICAgZmxvYXQgICAgICBtYXRjaFRlbXBsYXRlQ3VydmVTY29yZTsgLy9UaGUgYWNjdXJhY3kgb2YgdGhlIG1hdGNoIG9idGFpbmVkIGJ5IGNvbXBhcmluZyB0aGUgY3VydmVzIGluIHRoZSBtYXRjaCByZWdpb24gdG8gdGhlIHRlbXBsYXRlIGN1cnZlcy4KKyAgICBmbG9hdCAgICAgIGNvcnJlbGF0aW9uU2NvcmU7ICAgICAgICAvL1RoZSBhY2N1cmFjeSBvZiB0aGUgbWF0Y2ggb2J0YWluZWQgYnkgY29tcGFyaW5nIHRoZSB0ZW1wbGF0ZSBpbWFnZSB0byB0aGUgbWF0Y2ggcmVnaW9uIHVzaW5nIGEgY29ycmVsYXRpb24gbWV0cmljIHRoYXQgY29tcGFyZXMgdGhlIHR3byByZWdpb25zIGFzIGEgZnVuY3Rpb24gb2YgdGhlaXIgcGl4ZWwgdmFsdWVzLgorfSBHZW9tZXRyaWNQYXR0ZXJuTWF0Y2g7CisKK3R5cGVkZWYgc3RydWN0IE1hdGNoR2VvbWV0cmljUGF0dGVybkFkdmFuY2VkT3B0aW9uc19zdHJ1Y3QgeworICAgIGludCAgICBtaW5GZWF0dXJlc1VzZWQ7ICAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGZlYXR1cmVzIHRoZSBmdW5jdGlvbiB1c2VzIHdoZW4gbWF0Y2hpbmcuCisgICAgaW50ICAgIG1heEZlYXR1cmVzVXNlZDsgICAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgZmVhdHVyZXMgdGhlIGZ1bmN0aW9uIHVzZXMgd2hlbiBtYXRjaGluZy4KKyAgICBpbnQgICAgc3VicGl4ZWxJdGVyYXRpb25zOyAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpbmNyZW1lbnRhbCBpbXByb3ZlbWVudHMgdXNlZCB0byByZWZpbmUgbWF0Y2hlcyB3aXRoIHN1YnBpeGVsIGluZm9ybWF0aW9uLgorICAgIGRvdWJsZSBzdWJwaXhlbFRvbGVyYW5jZTsgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIG1heGltdW0gYW1vdW50IG9mIGNoYW5nZSwgaW4gcGl4ZWxzLCBiZXR3ZWVuIGNvbnNlY3V0aXZlIGluY3JlbWVudGFsIGltcHJvdmVtZW50cyBpbiB0aGUgbWF0Y2ggcG9zaXRpb24gYmVmb3JlIHRoZSBmdW5jdGlvbiBzdG9wcyByZWZpbmluZyB0aGUgbWF0Y2ggcG9zaXRpb24uCisgICAgaW50ICAgIGluaXRpYWxNYXRjaExpc3RMZW5ndGg7ICAgICAvL1NwZWNpZmllcyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBtYXRjaCBsaXN0LgorICAgIGludCAgICBtYXRjaFRlbXBsYXRlQ3VydmVTY29yZTsgICAgLy9TZXQgdGhpcyBlbGVtZW50IHRvIFRSVUUgdG8gc3BlY2lmeSB0aGF0IHRoZSBmdW5jdGlvbiBzaG91bGQgY2FsY3VsYXRlIHRoZSBtYXRjaCBjdXJ2ZSB0byB0ZW1wbGF0ZSBjdXJ2ZSBzY29yZSBhbmQgcmV0dXJuIGl0IGZvciBlYWNoIG1hdGNoIHJlc3VsdC4KKyAgICBpbnQgICAgY29ycmVsYXRpb25TY29yZTsgICAgICAgICAgIC8vU2V0IHRoaXMgZWxlbWVudCB0byBUUlVFIHRvIHNwZWNpZnkgdGhhdCB0aGUgZnVuY3Rpb24gc2hvdWxkIGNhbGN1bGF0ZSB0aGUgY29ycmVsYXRpb24gc2NvcmUgYW5kIHJldHVybiBpdCBmb3IgZWFjaCBtYXRjaCByZXN1bHQuCisgICAgZG91YmxlIG1pbk1hdGNoU2VwYXJhdGlvbkRpc3RhbmNlOyAvL1NwZWNpZmllcyB0aGUgbWluaW11bSBzZXBhcmF0aW9uIGRpc3RhbmNlLCBpbiBwaXhlbHMsIGJldHdlZW4gdGhlIG9yaWdpbnMgb2YgdHdvIG1hdGNoZXMgdGhhdCBoYXZlIHVuaXF1ZSBwb3NpdGlvbnMuCisgICAgZG91YmxlIG1pbk1hdGNoU2VwYXJhdGlvbkFuZ2xlOyAgICAvL1NwZWNpZmllcyB0aGUgbWluaW11bSBhbmd1bGFyIGRpZmZlcmVuY2UsIGluIGRlZ3JlZXMsIGJldHdlZW4gdHdvIG1hdGNoZXMgdGhhdCBoYXZlIHVuaXF1ZSBhbmdsZXMuCisgICAgZG91YmxlIG1pbk1hdGNoU2VwYXJhdGlvblNjYWxlOyAgICAvL1NwZWNpZmllcyB0aGUgbWluaW11bSBkaWZmZXJlbmNlIGluIHNjYWxlLCBleHByZXNzZWQgYXMgYSBwZXJjZW50YWdlLCBiZXR3ZWVuIHR3byBtYXRjaGVzIHRoYXQgaGF2ZSB1bmlxdWUgc2NhbGVzLgorICAgIGRvdWJsZSBtYXhNYXRjaE92ZXJsYXA7ICAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIG1heGltdW0gYW1vdW50IG9mIG92ZXJsYXAsIGV4cHJlc3NlZCBhcyBhIHBlcmNlbnRhZ2UsIGFsbG93ZWQgYmV0d2VlbiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlcyBvZiB0d28gdW5pcXVlIG1hdGNoZXMuCisgICAgaW50ICAgIGNvYXJzZVJlc3VsdDsgICAgICAgICAgICAgICAvL1NwZWNpZmllcyB3aGV0aGVyIHlvdSB3YW50IHRoZSBmdW5jdGlvbiB0byBzcGVuZCBsZXNzIHRpbWUgYWNjdXJhdGVseSBlc3RpbWF0aW5nIHRoZSBsb2NhdGlvbiBvZiBhIG1hdGNoLgorfSBNYXRjaEdlb21ldHJpY1BhdHRlcm5BZHZhbmNlZE9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IE1hdGNoR2VvbWV0cmljUGF0dGVybk9wdGlvbnNfc3RydWN0IHsKKyAgICB1bnNpZ25lZCBpbnQgbW9kZTsgICAgICAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIG1ldGhvZCBpbWFxTWF0Y2hHZW9tZXRyaWNQYXR0ZXJuKCkgdXNlcyB3aGVuIGxvb2tpbmcgZm9yIHRoZSBwYXR0ZXJuIGluIHRoZSBpbWFnZS4KKyAgICBpbnQgICAgICAgICAgc3VicGl4ZWxBY2N1cmFjeTsgICAgLy9TZXQgdGhpcyBlbGVtZW50IHRvIFRSVUUgdG8gc3BlY2lmeSB0aGF0IHRoZSBmdW5jdGlvbiBzaG91bGQgY2FsY3VsYXRlIG1hdGNoIGxvY2F0aW9ucyB3aXRoIHN1YnBpeGVsIGFjY3VyYWN5LgorICAgIFJhbmdlRmxvYXQqICBhbmdsZVJhbmdlczsgICAgICAgICAvL0FuIGFycmF5IG9mIGFuZ2xlIHJhbmdlcywgaW4gZGVncmVlcywgd2hlcmUgZWFjaCByYW5nZSBzcGVjaWZpZXMgaG93IG11Y2ggeW91IGV4cGVjdCB0aGUgdGVtcGxhdGUgdG8gYmUgcm90YXRlZCBpbiB0aGUgaW1hZ2UuCisgICAgaW50ICAgICAgICAgIG51bUFuZ2xlUmFuZ2VzOyAgICAgIC8vTnVtYmVyIG9mIGFuZ2xlIHJhbmdlcyBpbiB0aGUgYW5nbGVSYW5nZXMgYXJyYXkuCisgICAgUmFuZ2VGbG9hdCAgIHNjYWxlUmFuZ2U7ICAgICAgICAgIC8vQSByYW5nZSB0aGF0IHNwZWNpZmllcyB0aGUgc2l6ZXMgb2YgdGhlIHBhdHRlcm4geW91IGV4cGVjdCB0byBiZSBpbiB0aGUgaW1hZ2UsIGV4cHJlc3NlZCBhcyBhIHJhdGlvIHBlcmNlbnRhZ2UgcmVwcmVzZW50aW5nIHRoZSBzaXplIG9mIHRoZSBwYXR0ZXJuIGluIHRoZSBpbWFnZSBkaXZpZGVkIGJ5IHNpemUgb2YgdGhlIG9yaWdpbmFsIHBhdHRlcm4gbXVsdGlwbGllZCBieSAxMDAuCisgICAgUmFuZ2VGbG9hdCAgIG9jY2x1c2lvblJhbmdlOyAgICAgIC8vQSByYW5nZSB0aGF0IHNwZWNpZmllcyB0aGUgcGVyY2VudGFnZSBvZiB0aGUgcGF0dGVybiB5b3UgZXhwZWN0IHRvIGJlIG9jY2x1ZGVkIGluIHRoZSBpbWFnZS4KKyAgICBpbnQgICAgICAgICAgbnVtTWF0Y2hlc1JlcXVlc3RlZDsgLy9OdW1iZXIgb2YgdmFsaWQgbWF0Y2hlcyBleHBlY3RlZC4KKyAgICBmbG9hdCAgICAgICAgbWluTWF0Y2hTY29yZTsgICAgICAgLy9UaGUgbWluaW11bSBzY29yZSBhIG1hdGNoIGNhbiBoYXZlIGZvciB0aGUgZnVuY3Rpb24gdG8gY29uc2lkZXIgdGhlIG1hdGNoIHZhbGlkLgorfSBNYXRjaEdlb21ldHJpY1BhdHRlcm5PcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBMZWFybkdlb21ldHJpY1BhdHRlcm5BZHZhbmNlZE9wdGlvbnNfc3RydWN0IHsKKyAgICBpbnQgICAgbWluUmVjdExlbmd0aDsgICAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgbWluaW11bSBsZW5ndGggZm9yIGVhY2ggc2lkZSBvZiBhIHJlY3Rhbmd1bGFyIGZlYXR1cmUuCisgICAgZG91YmxlIG1pblJlY3RBc3BlY3RSYXRpbzsgICAgICAgLy9TcGVjaWZpZXMgdGhlIG1pbmltdW0gYXNwZWN0IHJhdGlvIG9mIGEgcmVjdGFuZ3VsYXIgZmVhdHVyZS4KKyAgICBpbnQgICAgbWluUmFkaXVzOyAgICAgICAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgbWluaW11bSByYWRpdXMgZm9yIGEgY2lyY3VsYXIgZmVhdHVyZS4KKyAgICBpbnQgICAgbWluTGluZUxlbmd0aDsgICAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgbWluaW11bSBsZW5ndGggZm9yIGEgbGluZWFyIGZlYXR1cmUuCisgICAgZG91YmxlIG1pbkZlYXR1cmVTdHJlbmd0aDsgICAgICAgLy9TcGVjaWZpZXMgdGhlIG1pbmltdW0gc3RyZW5ndGggZm9yIGEgZmVhdHVyZS4KKyAgICBpbnQgICAgbWF4RmVhdHVyZXNVc2VkOyAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgZmVhdHVyZXMgdGhlIGZ1bmN0aW9uIHVzZXMgd2hlbiBsZWFybmluZy4KKyAgICBpbnQgICAgbWF4UGl4ZWxEaXN0YW5jZUZyb21MaW5lOyAvL1NwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgcGl4ZWxzIGJldHdlZW4gYW4gZWRnZSBwaXhlbCBhbmQgYSBsaW5lYXIgZmVhdHVyZSBmb3IgdGhlIGZ1bmN0aW9uIHRvIGNvbnNpZGVyIHRoYXQgZWRnZSBwaXhlbCBhcyBwYXJ0IG9mIHRoZSBsaW5lYXIgZmVhdHVyZS4KK30gTGVhcm5HZW9tZXRyaWNQYXR0ZXJuQWR2YW5jZWRPcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBGaXRFbGxpcHNlT3B0aW9uc19zdHJ1Y3QgeworICAgIGludCAgICByZWplY3RPdXRsaWVyczsgLy9XaGV0aGVyIHRvIHVzZSBldmVyeSBnaXZlbiBwb2ludCBvciBvbmx5IGEgc3Vic2V0IG9mIHRoZSBwb2ludHMgdG8gZml0IHRoZSBlbGxpcHNlLgorICAgIGRvdWJsZSBtaW5TY29yZTsgICAgICAgLy9TcGVjaWZpZXMgdGhlIHJlcXVpcmVkIHF1YWxpdHkgb2YgdGhlIGZpdHRlZCBlbGxpcHNlLgorICAgIGRvdWJsZSBwaXhlbFJhZGl1czsgICAgLy9UaGUgYWNjZXB0YWJsZSBkaXN0YW5jZSwgaW4gcGl4ZWxzLCB0aGF0IGEgcG9pbnQgZGV0ZXJtaW5lZCB0byBiZWxvbmcgdG8gdGhlIGVsbGlwc2UgY2FuIGJlIGZyb20gdGhlIGNpcmN1bWZlcmVuY2Ugb2YgdGhlIGVsbGlwc2UuCisgICAgaW50ICAgIG1heEl0ZXJhdGlvbnM7ICAvL1NwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHJlZmluZW1lbnQgaXRlcmF0aW9ucyB5b3UgYWxsb3cgdGhlIGZ1bmN0aW9uIHRvIHBlcmZvcm0gb24gdGhlIGluaXRpYWwgc3Vic2V0IG9mIHBvaW50cy4KK30gRml0RWxsaXBzZU9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IEZpdENpcmNsZU9wdGlvbnNfc3RydWN0IHsKKyAgICBpbnQgICAgcmVqZWN0T3V0bGllcnM7IC8vV2hldGhlciB0byB1c2UgZXZlcnkgZ2l2ZW4gcG9pbnQgb3Igb25seSBhIHN1YnNldCBvZiB0aGUgcG9pbnRzIHRvIGZpdCB0aGUgY2lyY2xlLgorICAgIGRvdWJsZSBtaW5TY29yZTsgICAgICAgLy9TcGVjaWZpZXMgdGhlIHJlcXVpcmVkIHF1YWxpdHkgb2YgdGhlIGZpdHRlZCBjaXJjbGUuCisgICAgZG91YmxlIHBpeGVsUmFkaXVzOyAgICAvL1RoZSBhY2NlcHRhYmxlIGRpc3RhbmNlLCBpbiBwaXhlbHMsIHRoYXQgYSBwb2ludCBkZXRlcm1pbmVkIHRvIGJlbG9uZyB0byB0aGUgY2lyY2xlIGNhbiBiZSBmcm9tIHRoZSBjaXJjdW1mZXJlbmNlIG9mIHRoZSBjaXJjbGUuCisgICAgaW50ICAgIG1heEl0ZXJhdGlvbnM7ICAvL1NwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHJlZmluZW1lbnQgaXRlcmF0aW9ucyB5b3UgYWxsb3cgdGhlIGZ1bmN0aW9uIHRvIHBlcmZvcm0gb24gdGhlIGluaXRpYWwgc3Vic2V0IG9mIHBvaW50cy4KK30gRml0Q2lyY2xlT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgQ29uc3RydWN0Uk9JT3B0aW9uczJfc3RydWN0IHsKKyAgICBpbnQgICAgICAgICAgd2luZG93TnVtYmVyOyAvL1RoZSB3aW5kb3cgbnVtYmVyIG9mIHRoZSBpbWFnZSB3aW5kb3cuCisgICAgY29uc3QgY2hhciogIHdpbmRvd1RpdGxlOyAgLy9TcGVjaWZpZXMgdGhlIG1lc3NhZ2Ugc3RyaW5nIHRoYXQgdGhlIGZ1bmN0aW9uIGRpc3BsYXlzIGluIHRoZSB0aXRsZSBiYXIgb2YgdGhlIHdpbmRvdy4KKyAgICBQYWxldHRlVHlwZSAgdHlwZTsgICAgICAgICAvL1RoZSBwYWxldHRlIHR5cGUgdG8gdXNlLgorICAgIFJHQlZhbHVlKiAgICBwYWxldHRlOyAgICAgIC8vSWYgdHlwZSBpcyBJTUFRX1BBTEVUVEVfVVNFUiwgdGhpcyBhcnJheSBpcyB0aGUgcGFsZXR0ZSBvZiBjb2xvcnMgdG8gdXNlIHdpdGggdGhlIHdpbmRvdy4KKyAgICBpbnQgICAgICAgICAgbnVtQ29sb3JzOyAgICAvL0lmIHR5cGUgaXMgSU1BUV9QQUxFVFRFX1VTRVIsIHRoaXMgZWxlbWVudCBpcyB0aGUgbnVtYmVyIG9mIGNvbG9ycyBpbiB0aGUgcGFsZXR0ZSBhcnJheS4KKyAgICB1bnNpZ25lZCBpbnQgbWF4Q29udG91cnM7ICAvL1RoZSBtYXhpbXVtIG51bWJlciBvZiBjb250b3VycyB0aGUgdXNlciB3aWxsIGJlIGFibGUgdG8gc2VsZWN0LgorfSBDb25zdHJ1Y3RST0lPcHRpb25zMjsKKwordHlwZWRlZiBzdHJ1Y3QgSFNMVmFsdWVfc3RydWN0IHsKKyAgICB1bnNpZ25lZCBjaGFyIEw7ICAgICAvL1RoZSBjb2xvciBsdW1pbmFuY2UuCisgICAgdW5zaWduZWQgY2hhciBTOyAgICAgLy9UaGUgY29sb3Igc2F0dXJhdGlvbi4KKyAgICB1bnNpZ25lZCBjaGFyIEg7ICAgICAvL1RoZSBjb2xvciBodWUuCisgICAgdW5zaWduZWQgY2hhciBhbHBoYTsgLy9UaGUgYWxwaGEgdmFsdWUgb2YgdGhlIGNvbG9yLCB3aGljaCByZXByZXNlbnRzIGV4dHJhIGluZm9ybWF0aW9uIGFib3V0IGEgY29sb3IgaW1hZ2UsIHN1Y2ggYXMgZ2FtbWEgY29ycmVjdGlvbi4KK30gSFNMVmFsdWU7CisKK3R5cGVkZWYgc3RydWN0IEhTVlZhbHVlX3N0cnVjdCB7CisgICAgdW5zaWduZWQgY2hhciBWOyAgICAgLy9UaGUgY29sb3IgdmFsdWUuCisgICAgdW5zaWduZWQgY2hhciBTOyAgICAgLy9UaGUgY29sb3Igc2F0dXJhdGlvbi4KKyAgICB1bnNpZ25lZCBjaGFyIEg7ICAgICAvL1RoZSBjb2xvciBodWUuCisgICAgdW5zaWduZWQgY2hhciBhbHBoYTsgLy9UaGUgYWxwaGEgdmFsdWUgb2YgdGhlIGNvbG9yLCB3aGljaCByZXByZXNlbnRzIGV4dHJhIGluZm9ybWF0aW9uIGFib3V0IGEgY29sb3IgaW1hZ2UsIHN1Y2ggYXMgZ2FtbWEgY29ycmVjdGlvbi4KK30gSFNWVmFsdWU7CisKK3R5cGVkZWYgc3RydWN0IEhTSVZhbHVlX3N0cnVjdCB7CisgICAgdW5zaWduZWQgY2hhciBJOyAgICAgLy9UaGUgY29sb3IgaW50ZW5zaXR5LgorICAgIHVuc2lnbmVkIGNoYXIgUzsgICAgIC8vVGhlIGNvbG9yIHNhdHVyYXRpb24uCisgICAgdW5zaWduZWQgY2hhciBIOyAgICAgLy9UaGUgY29sb3IgaHVlLgorICAgIHVuc2lnbmVkIGNoYXIgYWxwaGE7IC8vVGhlIGFscGhhIHZhbHVlIG9mIHRoZSBjb2xvciwgd2hpY2ggcmVwcmVzZW50cyBleHRyYSBpbmZvcm1hdGlvbiBhYm91dCBhIGNvbG9yIGltYWdlLCBzdWNoIGFzIGdhbW1hIGNvcnJlY3Rpb24uCit9IEhTSVZhbHVlOworCit0eXBlZGVmIHN0cnVjdCBDSUVMYWJWYWx1ZV9zdHJ1Y3QgeworICAgIGRvdWJsZSAgICAgICAgYjsgICAgIC8vVGhlIHllbGxvdy9ibHVlIGluZm9ybWF0aW9uIG9mIHRoZSBjb2xvci4KKyAgICBkb3VibGUgICAgICAgIGE7ICAgICAvL1RoZSByZWQvZ3JlZW4gaW5mb3JtYXRpb24gb2YgdGhlIGNvbG9yLgorICAgIGRvdWJsZSAgICAgICAgTDsgICAgIC8vVGhlIGNvbG9yIGxpZ2h0bmVzcy4KKyAgICB1bnNpZ25lZCBjaGFyIGFscGhhOyAvL1RoZSBhbHBoYSB2YWx1ZSBvZiB0aGUgY29sb3IsIHdoaWNoIHJlcHJlc2VudHMgZXh0cmEgaW5mb3JtYXRpb24gYWJvdXQgYSBjb2xvciBpbWFnZSwgc3VjaCBhcyBnYW1tYSBjb3JyZWN0aW9uLgorfSBDSUVMYWJWYWx1ZTsKKwordHlwZWRlZiBzdHJ1Y3QgQ0lFWFlaVmFsdWVfc3RydWN0IHsKKyAgICBkb3VibGUgICAgICAgIFo7ICAgICAvL1RoZSBaIGNvbG9yIGluZm9ybWF0aW9uLgorICAgIGRvdWJsZSAgICAgICAgWTsgICAgIC8vVGhlIGNvbG9yIGx1bWluYW5jZS4KKyAgICBkb3VibGUgICAgICAgIFg7ICAgICAvL1RoZSBYIGNvbG9yIGluZm9ybWF0aW9uLgorICAgIHVuc2lnbmVkIGNoYXIgYWxwaGE7IC8vVGhlIGFscGhhIHZhbHVlIG9mIHRoZSBjb2xvciwgd2hpY2ggcmVwcmVzZW50cyBleHRyYSBpbmZvcm1hdGlvbiBhYm91dCBhIGNvbG9yIGltYWdlLCBzdWNoIGFzIGdhbW1hIGNvcnJlY3Rpb24uCit9IENJRVhZWlZhbHVlOworCit0eXBlZGVmIHVuaW9uIENvbG9yMl91bmlvbiB7CisgICAgUkdCVmFsdWUgICAgcmdiOyAgICAgIC8vVGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBkZXNjcmliZSBhIGNvbG9yIGluIHRoZSBSR0IgKFJlZCwgR3JlZW4sIGFuZCBCbHVlKSBjb2xvciBzcGFjZS4KKyAgICBIU0xWYWx1ZSAgICBoc2w7ICAgICAgLy9UaGUgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGRlc2NyaWJlIGEgY29sb3IgaW4gdGhlIEhTTCAoSHVlLCBTYXR1cmF0aW9uLCBhbmQgTHVtaW5hbmNlKSBjb2xvciBzcGFjZS4KKyAgICBIU1ZWYWx1ZSAgICBoc3Y7ICAgICAgLy9UaGUgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGRlc2NyaWJlIGEgY29sb3IgaW4gdGhlIEhTSSAoSHVlLCBTYXR1cmF0aW9uLCBhbmQgVmFsdWUpIGNvbG9yIHNwYWNlLgorICAgIEhTSVZhbHVlICAgIGhzaTsgICAgICAvL1RoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gZGVzY3JpYmUgYSBjb2xvciBpbiB0aGUgSFNJIChIdWUsIFNhdHVyYXRpb24sIGFuZCBJbnRlbnNpdHkpIGNvbG9yIHNwYWNlLgorICAgIENJRUxhYlZhbHVlIGNpZUxhYjsgICAvL1RoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gZGVzY3JpYmUgYSBjb2xvciBpbiB0aGUgQ0lFIEwqYSpiKiAoTCwgYSwgYikgY29sb3Igc3BhY2UuCisgICAgQ0lFWFlaVmFsdWUgY2llWFlaOyAgIC8vVGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBkZXNjcmliZSBhIGNvbG9yIGluIHRoZSBDSUUgWFlaIChYLCBZLCBaKSBjb2xvciBzcGFjZS4KKyAgICBpbnQgICAgICAgICByYXdWYWx1ZTsgLy9UaGUgaW50ZWdlciB2YWx1ZSBmb3IgdGhlIGRhdGEgaW4gdGhlIGNvbG9yIHVuaW9uLgorfSBDb2xvcjI7CisKK3R5cGVkZWYgc3RydWN0IEJlc3RFbGxpcHNlMl9zdHJ1Y3QgeworICAgIFBvaW50RmxvYXQgY2VudGVyOyAgICAgICAgIC8vVGhlIGNvb3JkaW5hdGUgbG9jYXRpb24gb2YgdGhlIGNlbnRlciBvZiB0aGUgZWxsaXBzZS4KKyAgICBQb2ludEZsb2F0IG1ham9yQXhpc1N0YXJ0OyAvL1RoZSBjb29yZGluYXRlIGxvY2F0aW9uIG9mIHRoZSBzdGFydCBvZiB0aGUgbWFqb3IgYXhpcyBvZiB0aGUgZWxsaXBzZS4KKyAgICBQb2ludEZsb2F0IG1ham9yQXhpc0VuZDsgICAvL1RoZSBjb29yZGluYXRlIGxvY2F0aW9uIG9mIHRoZSBlbmQgb2YgdGhlIG1ham9yIGF4aXMgb2YgdGhlIGVsbGlwc2UuCisgICAgUG9pbnRGbG9hdCBtaW5vckF4aXNTdGFydDsgLy9UaGUgY29vcmRpbmF0ZSBsb2NhdGlvbiBvZiB0aGUgc3RhcnQgb2YgdGhlIG1pbm9yIGF4aXMgb2YgdGhlIGVsbGlwc2UuCisgICAgUG9pbnRGbG9hdCBtaW5vckF4aXNFbmQ7ICAgLy9UaGUgY29vcmRpbmF0ZSBsb2NhdGlvbiBvZiB0aGUgZW5kIG9mIHRoZSBtaW5vciBheGlzIG9mIHRoZSBlbGxpcHNlLgorICAgIGRvdWJsZSAgICAgYXJlYTsgICAgICAgICAgIC8vVGhlIGFyZWEgb2YgdGhlIGVsbGlwc2UuCisgICAgZG91YmxlICAgICBwZXJpbWV0ZXI7ICAgICAgLy9UaGUgbGVuZ3RoIG9mIHRoZSBwZXJpbWV0ZXIgb2YgdGhlIGVsbGlwc2UuCisgICAgZG91YmxlICAgICBlcnJvcjsgICAgICAgICAgLy9SZXByZXNlbnRzIHRoZSBsZWFzdCBzcXVhcmUgZXJyb3Igb2YgdGhlIGZpdHRlZCBlbGxpcHNlIHRvIHRoZSBlbnRpcmUgc2V0IG9mIHBvaW50cy4KKyAgICBpbnQgICAgICAgIHZhbGlkOyAgICAgICAgICAvL1RoaXMgZWxlbWVudCBpcyBUUlVFIGlmIHRoZSBmdW5jdGlvbiBhY2hpZXZlZCB0aGUgbWluaW11bSBzY29yZSB3aXRoaW4gdGhlIG51bWJlciBvZiBhbGxvd2VkIHJlZmluZW1lbnQgaXRlcmF0aW9ucyBhbmQgRkFMU0UgaWYgdGhlIGZ1bmN0aW9uIGRpZCBub3QgYWNoaWV2ZSB0aGUgbWluaW11bSBzY29yZS4KKyAgICBpbnQqICAgICAgIHBvaW50c1VzZWQ7ICAgICAvL0FuIGFycmF5IG9mIHRoZSBpbmRleGVzIGZvciB0aGUgcG9pbnRzIGFycmF5IGluZGljYXRpbmcgd2hpY2ggcG9pbnRzIHRoZSBmdW5jdGlvbiB1c2VkIHRvIGZpdCB0aGUgZWxsaXBzZS4KKyAgICBpbnQgICAgICAgIG51bVBvaW50c1VzZWQ7ICAvL1RoZSBudW1iZXIgb2YgcG9pbnRzIHRoZSBmdW5jdGlvbiB1c2VkIHRvIGZpdCB0aGUgZWxsaXBzZS4KK30gQmVzdEVsbGlwc2UyOworCit0eXBlZGVmIHN0cnVjdCBMZWFyblBhdHRlcm5BZHZhbmNlZE9wdGlvbnNfc3RydWN0IHsKKyAgICBMZWFyblBhdHRlcm5BZHZhbmNlZFNoaWZ0T3B0aW9ucyogICAgc2hpZnRPcHRpb25zOyAgICAvL1VzZSB0aGlzIGVsZW1lbnQgdG8gY29udHJvbCB0aGUgYmVoYXZpb3Igb2YgaW1hcUxlYXJuUGF0dGVybjIoKSBkdXJpbmcgdGhlIHNoaWZ0LWludmFyaWFudCBsZWFybmluZyBwaGFzZS4KKyAgICBMZWFyblBhdHRlcm5BZHZhbmNlZFJvdGF0aW9uT3B0aW9ucyogcm90YXRpb25PcHRpb25zOyAvL1VzZSB0aGlzIGVsZW1lbnQgdG8gY29udHJvbCB0aGUgYmVoYXZpb3Igb2YgaW1hcUxlYXJuUGF0dGVybjIoKWR1cmluZyB0aGUgcm90YXRpb24taW52YXJpYW50IGxlYXJuaW5nIHBoYXNlLgorfSBMZWFyblBhdHRlcm5BZHZhbmNlZE9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IEFWSUluZm9fc3RydWN0IHsKKyAgICB1bnNpZ25lZCBpbnQgd2lkdGg7ICAgICAgICAgICAvL1RoZSB3aWR0aCBvZiBlYWNoIGZyYW1lLgorICAgIHVuc2lnbmVkIGludCBoZWlnaHQ7ICAgICAgICAgIC8vVGhlIGhlaWdodCBvZiBlYWNoIGZyYW1lLgorICAgIEltYWdlVHlwZSAgICBpbWFnZVR5cGU7ICAgICAgIC8vVGhlIHR5cGUgb2YgaW1hZ2VzIHRoaXMgQVZJIGNvbnRhaW5zLgorICAgIHVuc2lnbmVkIGludCBudW1GcmFtZXM7ICAgICAgIC8vVGhlIG51bWJlciBvZiBmcmFtZXMgaW4gdGhlIEFWSS4KKyAgICB1bnNpZ25lZCBpbnQgZnJhbWVzUGVyU2Vjb25kOyAvL1RoZSBudW1iZXIgb2YgZnJhbWVzIHBlciBzZWNvbmQgdGhpcyBBVkkgc2hvdWxkIGJlIHNob3duIGF0LgorICAgIGNoYXIqICAgICAgICBmaWx0ZXJOYW1lOyAgICAgIC8vVGhlIG5hbWUgb2YgdGhlIGNvbXByZXNzaW9uIGZpbHRlciB1c2VkIHRvIGNyZWF0ZSB0aGlzIEFWSS4KKyAgICBpbnQgICAgICAgICAgaGFzRGF0YTsgICAgICAgICAvL1NwZWNpZmllcyB3aGV0aGVyIHRoaXMgQVZJIGhhcyBkYXRhIGF0dGFjaGVkIHRvIGVhY2ggZnJhbWUgb3Igbm90LgorICAgIHVuc2lnbmVkIGludCBtYXhEYXRhU2l6ZTsgICAgIC8vSWYgdGhpcyBBVkkgaGFzIGRhdGEsIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGRhdGEgaW4gZWFjaCBmcmFtZS4KK30gQVZJSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgTGVhcm5QYXR0ZXJuQWR2YW5jZWRTaGlmdE9wdGlvbnNfc3RydWN0IHsKKyAgICBpbnQgICAgaW5pdGlhbFN0ZXBTaXplOyAgICAgICAgICAvL1RoZSBsYXJnZXN0IG51bWJlciBvZiBpbWFnZSBwaXhlbHMgdG8gc2hpZnQgdGhlIHNhbXBsZSBhY3Jvc3MgdGhlIGluc3BlY3Rpb24gaW1hZ2UgZHVyaW5nIHRoZSBpbml0aWFsIHBoYXNlIG9mIHNoaWZ0LWludmFyaWFudCBtYXRjaGluZy4KKyAgICBpbnQgICAgaW5pdGlhbFNhbXBsZVNpemU7ICAgICAgICAvL1NwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRlbXBsYXRlIHBpeGVscyB0aGF0IHlvdSB3YW50IHRvIGluY2x1ZGUgaW4gYSBzYW1wbGUgZm9yIHRoZSBpbml0aWFsIHBoYXNlIG9mIHNoaWZ0LWludmFyaWFudCBtYXRjaGluZy4KKyAgICBkb3VibGUgaW5pdGlhbFNhbXBsZVNpemVGYWN0b3I7ICAvL1NwZWNpZmllcyB0aGUgc2l6ZSBvZiB0aGUgc2FtcGxlIGZvciB0aGUgaW5pdGlhbCBwaGFzZSBvZiBzaGlmdC1pbnZhcmlhbnQgbWF0Y2hpbmcgYXMgYSBwZXJjZW50IG9mIHRoZSB0ZW1wbGF0ZSBzaXplLCBpbiBwaXhlbHMuCisgICAgaW50ICAgIGZpbmFsU2FtcGxlU2l6ZTsgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0ZW1wbGF0ZSBwaXhlbHMgeW91IHdhbnQgdG8gYWRkIHRvIGluaXRpYWxTYW1wbGVTaXplIGZvciB0aGUgZmluYWwgcGhhc2Ugb2Ygc2hpZnQtaW52YXJpYW50IG1hdGNoaW5nLgorICAgIGRvdWJsZSBmaW5hbFNhbXBsZVNpemVGYWN0b3I7ICAgIC8vU3BlY2lmaWVzIHRoZSBzaXplIG9mIHRoZSBzYW1wbGUgZm9yIHRoZSBmaW5hbCBwaGFzZSBvZiBzaGlmdC1pbnZhcmlhbnQgbWF0Y2hpbmcgYXMgYSBwZXJjZW50IG9mIHRoZSBlZGdlIHBvaW50cyBpbiB0aGUgdGVtcGxhdGUsIGluIHBpeGVscy4KKyAgICBpbnQgICAgc3VicGl4ZWxTYW1wbGVTaXplOyAgICAgICAvL1NwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRlbXBsYXRlIHBpeGVscyB0aGF0IHlvdSB3YW50IHRvIGluY2x1ZGUgaW4gYSBzYW1wbGUgZm9yIHRoZSBzdWJwaXhlbCBwaGFzZSBvZiBzaGlmdC1pbnZhcmlhbnQgbWF0Y2hpbmcuCisgICAgZG91YmxlIHN1YnBpeGVsU2FtcGxlU2l6ZUZhY3RvcjsgLy9TcGVjaWZpZXMgdGhlIHNpemUgb2YgdGhlIHNhbXBsZSBmb3IgdGhlIHN1YnBpeGVsIHBoYXNlIG9mIHNoaWZ0LWludmFyaWFudCBtYXRjaGluZyBhcyBhIHBlcmNlbnQgb2YgdGhlIHRlbXBsYXRlIHNpemUsIGluIHBpeGVscy4KK30gTGVhcm5QYXR0ZXJuQWR2YW5jZWRTaGlmdE9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IExlYXJuUGF0dGVybkFkdmFuY2VkUm90YXRpb25PcHRpb25zX3N0cnVjdCB7CisgICAgU2VhcmNoU3RyYXRlZ3kgc2VhcmNoU3RyYXRlZ3lTdXBwb3J0OyAgICAvL1NwZWNpZmllcyB0aGUgYWdncmVzc2l2ZW5lc3Mgb2YgdGhlIHJvdGF0aW9uIHNlYXJjaCBzdHJhdGVneSBhdmFpbGFibGUgZHVyaW5nIHRoZSBtYXRjaGluZyBwaGFzZS4KKyAgICBpbnQgICAgICAgICAgICBpbml0aWFsU3RlcFNpemU7ICAgICAgICAgIC8vVGhlIGxhcmdlc3QgbnVtYmVyIG9mIGltYWdlIHBpeGVscyB0byBzaGlmdCB0aGUgc2FtcGxlIGFjcm9zcyB0aGUgaW5zcGVjdGlvbiBpbWFnZSBkdXJpbmcgdGhlIGluaXRpYWwgcGhhc2Ugb2YgbWF0Y2hpbmcuCisgICAgaW50ICAgICAgICAgICAgaW5pdGlhbFNhbXBsZVNpemU7ICAgICAgICAvL1NwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRlbXBsYXRlIHBpeGVscyB0aGF0IHlvdSB3YW50IHRvIGluY2x1ZGUgaW4gYSBzYW1wbGUgZm9yIHRoZSBpbml0aWFsIHBoYXNlIG9mIHJvdGF0aW9uLWludmFyaWFudCBtYXRjaGluZy4KKyAgICBkb3VibGUgICAgICAgICBpbml0aWFsU2FtcGxlU2l6ZUZhY3RvcjsgIC8vU3BlY2lmaWVzIHRoZSBzaXplIG9mIHRoZSBzYW1wbGUgZm9yIHRoZSBpbml0aWFsIHBoYXNlIG9mIHJvdGF0aW9uLWludmFyaWFudCBtYXRjaGluZyBhcyBhIHBlcmNlbnQgb2YgdGhlIHRlbXBsYXRlIHNpemUsIGluIHBpeGVscy4KKyAgICBpbnQgICAgICAgICAgICBpbml0aWFsQW5ndWxhckFjY3VyYWN5OyAgIC8vU2V0cyB0aGUgYW5nbGUgYWNjdXJhY3ksIGluIGRlZ3JlZXMsIHRvIHVzZSBkdXJpbmcgdGhlIGluaXRpYWwgcGhhc2Ugb2Ygcm90YXRpb24taW52YXJpYW50IG1hdGNoaW5nLgorICAgIGludCAgICAgICAgICAgIGZpbmFsU2FtcGxlU2l6ZTsgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0ZW1wbGF0ZSBwaXhlbHMgeW91IHdhbnQgdG8gYWRkIHRvIGluaXRpYWxTYW1wbGVTaXplIGZvciB0aGUgZmluYWwgcGhhc2Ugb2Ygcm90YXRpb24taW52YXJpYW50IG1hdGNoaW5nLgorICAgIGRvdWJsZSAgICAgICAgIGZpbmFsU2FtcGxlU2l6ZUZhY3RvcjsgICAgLy9TcGVjaWZpZXMgdGhlIHNpemUgb2YgdGhlIHNhbXBsZSBmb3IgdGhlIGZpbmFsIHBoYXNlIG9mIHJvdGF0aW9uLWludmFyaWFudCBtYXRjaGluZyBhcyBhIHBlcmNlbnQgb2YgdGhlIGVkZ2UgcG9pbnRzIGluIHRoZSB0ZW1wbGF0ZSwgaW4gcGl4ZWxzLgorICAgIGludCAgICAgICAgICAgIGZpbmFsQW5ndWxhckFjY3VyYWN5OyAgICAgLy9TZXRzIHRoZSBhbmdsZSBhY2N1cmFjeSwgaW4gZGVncmVlcywgdG8gdXNlIGR1cmluZyB0aGUgZmluYWwgcGhhc2Ugb2YgdGhlIHJvdGF0aW9uLWludmFyaWFudCBtYXRjaGluZy4KKyAgICBpbnQgICAgICAgICAgICBzdWJwaXhlbFNhbXBsZVNpemU7ICAgICAgIC8vU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdGVtcGxhdGUgcGl4ZWxzIHRoYXQgeW91IHdhbnQgdG8gaW5jbHVkZSBpbiBhIHNhbXBsZSBmb3IgdGhlIHN1YnBpeGVsIHBoYXNlIG9mIHJvdGF0aW9uLWludmFyaWFudCBtYXRjaGluZy4KKyAgICBkb3VibGUgICAgICAgICBzdWJwaXhlbFNhbXBsZVNpemVGYWN0b3I7IC8vU3BlY2lmaWVzIHRoZSBzaXplIG9mIHRoZSBzYW1wbGUgZm9yIHRoZSBzdWJwaXhlbCBwaGFzZSBvZiByb3RhdGlvbi1pbnZhcmlhbnQgbWF0Y2hpbmcgYXMgYSBwZXJjZW50IG9mIHRoZSB0ZW1wbGF0ZSBzaXplLCBpbiBwaXhlbHMuCit9IExlYXJuUGF0dGVybkFkdmFuY2VkUm90YXRpb25PcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBNYXRjaFBhdHRlcm5BZHZhbmNlZE9wdGlvbnNfc3RydWN0IHsKKyAgICBpbnQgICAgICAgICAgICBzdWJwaXhlbEl0ZXJhdGlvbnM7ICAgICAgICAgIC8vRGVmaW5lcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgaW5jcmVtZW50YWwgaW1wcm92ZW1lbnRzIHVzZWQgdG8gcmVmaW5lIG1hdGNoaW5nIHVzaW5nIHN1YnBpeGVsIGluZm9ybWF0aW9uLgorICAgIGRvdWJsZSAgICAgICAgIHN1YnBpeGVsVG9sZXJhbmNlOyAgICAgICAgICAgLy9EZWZpbmVzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBjaGFuZ2UsIGluIHBpeGVscywgYmV0d2VlbiBjb25zZWN1dGl2ZSBpbmNyZW1lbnRhbCBpbXByb3ZlbWVudHMgaW4gdGhlIG1hdGNoIHBvc2l0aW9uIHRoYXQgeW91IHdhbnQgdG8gdHJpZ2dlciB0aGUgZW5kIG9mIHRoZSByZWZpbmVtZW50IHByb2Nlc3MuCisgICAgaW50ICAgICAgICAgICAgaW5pdGlhbE1hdGNoTGlzdExlbmd0aDsgICAgICAvL1NwZWNpZmllcyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBtYXRjaCBsaXN0LgorICAgIGludCAgICAgICAgICAgIG1hdGNoTGlzdFJlZHVjdGlvbkZhY3RvcjsgICAgLy9TcGVjaWZpZXMgdGhlIHJlZHVjdGlvbiBvZiB0aGUgbWF0Y2ggbGlzdCBhcyBtYXRjaGVzIGFyZSByZWZpbmVkLgorICAgIGludCAgICAgICAgICAgIGluaXRpYWxTdGVwU2l6ZTsgICAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIG51bWJlciBvZiBwaXhlbHMgdG8gc2hpZnQgdGhlIHNhbXBsZSBhY3Jvc3MgdGhlIGluc3BlY3Rpb24gaW1hZ2UgZHVyaW5nIHRoZSBpbml0aWFsIHBoYXNlIG9mIHNoaWZ0LWludmFyaWFudCBtYXRjaGluZy4KKyAgICBTZWFyY2hTdHJhdGVneSBzZWFyY2hTdHJhdGVneTsgICAgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBhZ2dyZXNzaXZlbmVzcyBvZiB0aGUgcm90YXRpb24gc2VhcmNoIHN0cmF0ZWd5LgorICAgIGludCAgICAgICAgICAgIGludGVybWVkaWF0ZUFuZ3VsYXJBY2N1cmFjeTsgLy9TcGVjaWZpZXMgdGhlIGFjY3VyYWN5IHRvIHVzZSBkdXJpbmcgdGhlIGludGVybWVkaWF0ZSBwaGFzZSBvZiByb3RhdGlvbi1pbnZhcmlhbnQgbWF0Y2hpbmcuCit9IE1hdGNoUGF0dGVybkFkdmFuY2VkT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgUGFydGljbGVGaWx0ZXJDcml0ZXJpYTJfc3RydWN0IHsKKyAgICBNZWFzdXJlbWVudFR5cGUgcGFyYW1ldGVyOyAgLy9UaGUgbW9ycGhvbG9naWNhbCBtZWFzdXJlbWVudCB0aGF0IHRoZSBmdW5jdGlvbiB1c2VzIGZvciBmaWx0ZXJpbmcuCisgICAgZmxvYXQgICAgICAgICAgIGxvd2VyOyAgICAgIC8vVGhlIGxvd2VyIGJvdW5kIG9mIHRoZSBjcml0ZXJpYSByYW5nZS4KKyAgICBmbG9hdCAgICAgICAgICAgdXBwZXI7ICAgICAgLy9UaGUgdXBwZXIgYm91bmQgb2YgdGhlIGNyaXRlcmlhIHJhbmdlLgorICAgIGludCAgICAgICAgICAgICBjYWxpYnJhdGVkOyAvL1NldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSB0byB0YWtlIGNhbGlicmF0ZWQgbWVhc3VyZW1lbnRzLgorICAgIGludCAgICAgICAgICAgICBleGNsdWRlOyAgICAvL1NldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSB0byBpbmRpY2F0ZSB0aGF0IGEgbWF0Y2ggb2NjdXJzIHdoZW4gdGhlIG1lYXN1cmVtZW50IGlzIG91dHNpZGUgdGhlIGNyaXRlcmlhIHJhbmdlLgorfSBQYXJ0aWNsZUZpbHRlckNyaXRlcmlhMjsKKwordHlwZWRlZiBzdHJ1Y3QgQmVzdENpcmNsZTJfc3RydWN0IHsKKyAgICBQb2ludEZsb2F0IGNlbnRlcjsgICAgICAgIC8vVGhlIGNvb3JkaW5hdGUgbG9jYXRpb24gb2YgdGhlIGNlbnRlciBvZiB0aGUgY2lyY2xlLgorICAgIGRvdWJsZSAgICAgcmFkaXVzOyAgICAgICAgLy9UaGUgcmFkaXVzIG9mIHRoZSBjaXJjbGUuCisgICAgZG91YmxlICAgICBhcmVhOyAgICAgICAgICAvL1RoZSBhcmVhIG9mIHRoZSBjaXJjbGUuCisgICAgZG91YmxlICAgICBwZXJpbWV0ZXI7ICAgICAvL1RoZSBsZW5ndGggb2YgdGhlIHBlcmltZXRlciBvZiB0aGUgY2lyY2xlLgorICAgIGRvdWJsZSAgICAgZXJyb3I7ICAgICAgICAgLy9SZXByZXNlbnRzIHRoZSBsZWFzdCBzcXVhcmUgZXJyb3Igb2YgdGhlIGZpdHRlZCBjaXJjbGUgdG8gdGhlIGVudGlyZSBzZXQgb2YgcG9pbnRzLgorICAgIGludCAgICAgICAgdmFsaWQ7ICAgICAgICAgLy9UaGlzIGVsZW1lbnQgaXMgVFJVRSBpZiB0aGUgZnVuY3Rpb24gYWNoaWV2ZWQgdGhlIG1pbmltdW0gc2NvcmUgd2l0aGluIHRoZSBudW1iZXIgb2YgYWxsb3dlZCByZWZpbmVtZW50IGl0ZXJhdGlvbnMgYW5kIEZBTFNFIGlmIHRoZSBmdW5jdGlvbiBkaWQgbm90IGFjaGlldmUgdGhlIG1pbmltdW0gc2NvcmUuCisgICAgaW50KiAgICAgICBwb2ludHNVc2VkOyAgICAvL0FuIGFycmF5IG9mIHRoZSBpbmRleGVzIGZvciB0aGUgcG9pbnRzIGFycmF5IGluZGljYXRpbmcgd2hpY2ggcG9pbnRzIHRoZSBmdW5jdGlvbiB1c2VkIHRvIGZpdCB0aGUgY2lyY2xlLgorICAgIGludCAgICAgICAgbnVtUG9pbnRzVXNlZDsgLy9UaGUgbnVtYmVyIG9mIHBvaW50cyB0aGUgZnVuY3Rpb24gdXNlZCB0byBmaXQgdGhlIGNpcmNsZS4KK30gQmVzdENpcmNsZTI7CisKK3R5cGVkZWYgc3RydWN0IE9DUlNwYWNpbmdPcHRpb25zX3N0cnVjdCB7CisgICAgaW50IG1pbkNoYXJTcGFjaW5nOyAgICAgICAgICAgICAgLy9UaGUgbWluaW11bSBudW1iZXIgb2YgcGl4ZWxzIHRoYXQgbXVzdCBiZSBiZXR3ZWVuIHR3byBjaGFyYWN0ZXJzIGZvciBOSSBWaXNpb24gdG8gdHJhaW4gb3IgcmVhZCB0aGUgY2hhcmFjdGVycyBzZXBhcmF0ZWx5LgorICAgIGludCBtaW5DaGFyU2l6ZTsgICAgICAgICAgICAgICAgIC8vVGhlIG1pbmltdW0gbnVtYmVyIG9mIHBpeGVscyByZXF1aXJlZCBmb3IgYW4gb2JqZWN0IHRvIGJlIGEgcG90ZW50aWFsbHkgaWRlbnRpZmlhYmxlIGNoYXJhY3Rlci4KKyAgICBpbnQgbWF4Q2hhclNpemU7ICAgICAgICAgICAgICAgICAvL1RoZSBtYXhpbXVtIG51bWJlciBvZiBwaXhlbHMgcmVxdWlyZWQgZm9yIGFuIG9iamVjdCB0byBiZSBhIHBvdGVudGlhbGx5IGlkZW50aWZpYWJsZSBjaGFyYWN0ZXIuCisgICAgaW50IG1heEhvcml6b250YWxFbGVtZW50U3BhY2luZzsgLy9UaGUgbWF4aW11bSBob3Jpem9udGFsIHNwYWNpbmcsIGluIHBpeGVscywgYWxsb3dlZCBiZXR3ZWVuIGNoYXJhY3RlciBlbGVtZW50cyB0byB0cmFpbiBvciByZWFkIHRoZSBjaGFyYWN0ZXIgZWxlbWVudHMgYXMgYSBzaW5nbGUgY2hhcmFjdGVyLgorICAgIGludCBtYXhWZXJ0aWNhbEVsZW1lbnRTcGFjaW5nOyAgIC8vVGhlIG1heGltdW0gdmVydGljYWwgZWxlbWVudCBzcGFjaW5nIGluIHBpeGVscy4KKyAgICBpbnQgbWluQm91bmRpbmdSZWN0V2lkdGg7ICAgICAgICAvL1RoZSBtaW5pbXVtIHBvc3NpYmxlIHdpZHRoLCBpbiBwaXhlbHMsIGZvciBhIGNoYXJhY3RlciBib3VuZGluZyByZWN0YW5nbGUuCisgICAgaW50IG1heEJvdW5kaW5nUmVjdFdpZHRoOyAgICAgICAgLy9UaGUgbWF4aW11bSBwb3NzaWJsZSB3aWR0aCwgaW4gcGl4ZWxzLCBmb3IgYSBjaGFyYWN0ZXIgYm91bmRpbmcgcmVjdGFuZ2xlLgorICAgIGludCBtaW5Cb3VuZGluZ1JlY3RIZWlnaHQ7ICAgICAgIC8vVGhlIG1pbmltdW0gcG9zc2libGUgaGVpZ2h0LCBpbiBwaXhlbHMsIGZvciBhIGNoYXJhY3RlciBib3VuZGluZyByZWN0YW5nbGUuCisgICAgaW50IG1heEJvdW5kaW5nUmVjdEhlaWdodDsgICAgICAgLy9UaGUgbWF4aW11bSBwb3NzaWJsZSBoZWlnaHQsIGluIHBpeGVscywgZm9yIGEgY2hhcmFjdGVyIGJvdW5kaW5nIHJlY3RhbmdsZS4KKyAgICBpbnQgYXV0b1NwbGl0OyAgICAgICAgICAgICAgICAgICAvL1NldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSB0byBhdXRvbWF0aWNhbGx5IGFkanVzdCB0aGUgbG9jYXRpb24gb2YgdGhlIGNoYXJhY3RlciBib3VuZGluZyByZWN0YW5nbGUgd2hlbiBjaGFyYWN0ZXJzIG92ZXJsYXAgdmVydGljYWxseS4KK30gT0NSU3BhY2luZ09wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IE9DUlByb2Nlc3NpbmdPcHRpb25zX3N0cnVjdCB7CisgICAgVGhyZXNob2xkTW9kZSBtb2RlOyAgICAgICAgICAgICAgICAgICAgICAgLy9UaGUgdGhyZXNob2xkaW5nIG1vZGUuCisgICAgaW50ICAgICAgICAgICBsb3dUaHJlc2hvbGQ7ICAgICAgICAgICAgICAgLy9UaGUgbG93IHRocmVzaG9sZCB2YWx1ZSB3aGVuIHlvdSBzZXQgbW9kZSB0byBJTUFRX0ZJWEVEX1JBTkdFLgorICAgIGludCAgICAgICAgICAgaGlnaFRocmVzaG9sZDsgICAgICAgICAgICAgIC8vVGhlIGhpZ2ggdGhyZXNob2xkIHZhbHVlIHdoZW4geW91IHNldCBtb2RlIHRvIElNQVFfRklYRURfUkFOR0UuCisgICAgaW50ICAgICAgICAgICBibG9ja0NvdW50OyAgICAgICAgICAgICAgICAgLy9UaGUgbnVtYmVyIG9mIGJsb2NrcyBmb3IgdGhyZXNob2xkIGNhbGN1bGF0aW9uIGFsZ29yaXRobXMgdGhhdCByZXF1aXJlIGJsb2Nrcy4KKyAgICBpbnQgICAgICAgICAgIGZhc3RUaHJlc2hvbGQ7ICAgICAgICAgICAgICAvL1NldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSB0byB1c2UgYSBmYXN0ZXIsIGxlc3MgYWNjdXJhdGUgdGhyZXNob2xkIGNhbGN1bGF0aW9uIGFsZ29yaXRobS4KKyAgICBpbnQgICAgICAgICAgIGJpTW9kYWxDYWxjdWxhdGlvbjsgICAgICAgICAvL1NldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSB0byBjYWxjdWxhdGUgYm90aCB0aGUgbG93IGFuZCBoaWdoIHRocmVzaG9sZCB2YWx1ZXMgd2hlbiB1c2luZyB0aGUgZmFzdCB0aHJlc2hvbGRpbmcgbWV0aG9kLgorICAgIGludCAgICAgICAgICAgZGFya0NoYXJhY3RlcnM7ICAgICAgICAgICAgIC8vU2V0IHRoaXMgZWxlbWVudCB0byBUUlVFIHRvIHJlYWQgb3IgdHJhaW4gZGFyayBjaGFyYWN0ZXJzIG9uIGEgbGlnaHQgYmFja2dyb3VuZC4KKyAgICBpbnQgICAgICAgICAgIHJlbW92ZVBhcnRpY2xlc1RvdWNoaW5nUk9JOyAvL1NldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSB0byByZW1vdmUgdGhlIHBhcnRpY2xlcyB0b3VjaGluZyB0aGUgUk9JLgorICAgIGludCAgICAgICAgICAgZXJvc2lvbkNvdW50OyAgICAgICAgICAgICAgIC8vVGhlIG51bWJlciBvZiBlcm9zaW9ucyB0byBwZXJmb3JtLgorfSBPQ1JQcm9jZXNzaW5nT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgUmVhZFRleHRPcHRpb25zX3N0cnVjdCB7CisgICAgU3RyaW5nMjU1ICAgICAgdmFsaWRDaGFyc1syNTVdOyAgLy9BbiBhcnJheSBvZiBzdHJpbmdzIHRoYXQgc3BlY2lmaWVzIHRoZSB2YWxpZCBjaGFyYWN0ZXJzLgorICAgIGludCAgICAgICAgICAgIG51bVZhbGlkQ2hhcnM7ICAgIC8vVGhlIG51bWJlciBvZiBzdHJpbmdzIGluIHRoZSB2YWxpZENoYXJzIGFycmF5IHRoYXQgeW91IGhhdmUgaW5pdGlhbGl6ZWQuCisgICAgY2hhciAgICAgICAgICAgc3Vic3RpdHV0aW9uQ2hhcjsgLy9UaGUgY2hhcmFjdGVyIHRvIHN1YnN0aXR1dGUgZm9yIG9iamVjdHMgdGhhdCB0aGUgZnVuY3Rpb24gY2Fubm90IG1hdGNoIHdpdGggYW55IG9mIHRoZSB0cmFpbmVkIGNoYXJhY3RlcnMuCisgICAgUmVhZFN0cmF0ZWd5ICAgcmVhZFN0cmF0ZWd5OyAgICAgLy9UaGUgcmVhZCBzdHJhdGVneSwgd2hpY2ggZGV0ZXJtaW5lcyBob3cgY2xvc2VseSB0aGUgZnVuY3Rpb24gYW5hbHl6ZXMgaW1hZ2VzIGluIHRoZSByZWFkaW5nIHByb2Nlc3MgdG8gbWF0Y2ggb2JqZWN0cyB3aXRoIHRyYWluZWQgY2hhcmFjdGVycy4KKyAgICBpbnQgICAgICAgICAgICBhY2NlcHRhbmNlTGV2ZWw7ICAvL1RoZSBtaW5pbXVtIGFjY2VwdGFuY2UgbGV2ZWwgYXQgd2hpY2ggYW4gb2JqZWN0IGlzIGNvbnNpZGVyZWQgYSB0cmFpbmVkIGNoYXJhY3Rlci4KKyAgICBpbnQgICAgICAgICAgICBhc3BlY3RSYXRpbzsgICAgICAvL1RoZSBtYXhpbXVtIGFzcGVjdCByYXRpbyB2YXJpYW5jZSBwZXJjZW50YWdlIGZvciB2YWxpZCBjaGFyYWN0ZXJzLgorICAgIFJlYWRSZXNvbHV0aW9uIHJlYWRSZXNvbHV0aW9uOyAgIC8vVGhlIHJlYWQgcmVzb2x1dGlvbiwgd2hpY2ggZGV0ZXJtaW5lcyBob3cgbXVjaCBvZiB0aGUgdHJhaW5lZCBjaGFyYWN0ZXIgZGF0YSB0aGUgZnVuY3Rpb24gdXNlcyB0byBtYXRjaCBvYmplY3RzIHRvIHRyYWluZWQgY2hhcmFjdGVycy4KK30gUmVhZFRleHRPcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBDaGFySW5mb19zdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqICBjaGFyVmFsdWU7ICAgICAvL1JldHJpZXZlcyB0aGUgY2hhcmFjdGVyIHZhbHVlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGNoYXJhY3RlciBpbiB0aGUgY2hhcmFjdGVyIHNldC4KKyAgICBjb25zdCBJbWFnZSogY2hhckltYWdlOyAgICAgLy9UaGUgaW1hZ2UgeW91IHVzZWQgdG8gdHJhaW4gdGhpcyBjaGFyYWN0ZXIuCisgICAgY29uc3QgSW1hZ2UqIGludGVybmFsSW1hZ2U7IC8vVGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIHRoYXQgTkkgVmlzaW9uIHVzZXMgdG8gbWF0Y2ggb2JqZWN0cyB0byB0aGlzIGNoYXJhY3Rlci4KK30gQ2hhckluZm87CisKKyNpZiAhZGVmaW5lZChVU0VSSU5UX0hFQURFUikgJiYgIWRlZmluZWQoX0NWSV9SRUNUX0RFRklORUQpCit0eXBlZGVmIHN0cnVjdCBSZWN0X3N0cnVjdCB7CisgICAgaW50IHRvcDsgICAgLy9Mb2NhdGlvbiBvZiB0aGUgdG9wIGVkZ2Ugb2YgdGhlIHJlY3RhbmdsZS4KKyAgICBpbnQgbGVmdDsgICAvL0xvY2F0aW9uIG9mIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIHJlY3RhbmdsZS4KKyAgICBpbnQgaGVpZ2h0OyAvL0hlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgorICAgIGludCB3aWR0aDsgIC8vV2lkdGggb2YgdGhlIHJlY3RhbmdsZS4KK30gUmVjdDsKKyNkZWZpbmUgX0NWSV9SRUNUX0RFRklORUQKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBDaGFyUmVwb3J0X3N0cnVjdCB7CisgICAgY29uc3QgY2hhciogY2hhcmFjdGVyOyAgICAgLy9UaGUgY2hhcmFjdGVyIHZhbHVlLgorICAgIFBvaW50RmxvYXQgIGNvcm5lcls0XTsgICAgIC8vQW4gYXJyYXkgb2YgZm91ciBwb2ludHMgdGhhdCBkZXNjcmliZXMgdGhlIHJlY3RhbmdsZSB0aGF0IHN1cnJvdW5kcyB0aGUgY2hhcmFjdGVyLgorICAgIGludCAgICAgICAgIHJlc2VydmVkOyAgICAgIC8vVGhpcyBlbGVtZW50IGlzIHJlc2VydmVkLgorICAgIGludCAgICAgICAgIGxvd1RocmVzaG9sZDsgIC8vVGhlIG1pbmltdW0gdmFsdWUgb2YgdGhlIHRocmVzaG9sZCByYW5nZSB1c2VkIGZvciB0aGlzIGNoYXJhY3Rlci4KKyAgICBpbnQgICAgICAgICBoaWdoVGhyZXNob2xkOyAvL1RoZSBtYXhpbXVtIHZhbHVlIG9mIHRoZSB0aHJlc2hvbGQgcmFuZ2UgdXNlZCBmb3IgdGhpcyBjaGFyYWN0ZXIuCit9IENoYXJSZXBvcnQ7CisKK3R5cGVkZWYgc3RydWN0IFJlYWRUZXh0UmVwb3J0X3N0cnVjdCB7CisgICAgY29uc3QgY2hhciogICAgICAgcmVhZFN0cmluZzsgICAgICAgICAgLy9UaGUgcmVhZCBzdHJpbmcuCisgICAgY29uc3QgQ2hhclJlcG9ydCogY2hhcmFjdGVyUmVwb3J0OyAgICAgLy9BbiBhcnJheSBvZiByZXBvcnRzIGRlc2NyaWJpbmcgdGhlIHByb3BlcnRpZXMgb2YgZWFjaCBpZGVudGlmaWVkIGNoYXJhY3Rlci4KKyAgICBpbnQgICAgICAgICAgICAgICBudW1DaGFyYWN0ZXJSZXBvcnRzOyAvL1RoZSBudW1iZXIgb2YgaWRlbnRpZmllZCBjaGFyYWN0ZXJzLgorfSBSZWFkVGV4dFJlcG9ydDsKKworI2lmICFkZWZpbmVkKFVTRVJJTlRfSEVBREVSKSAmJiAhZGVmaW5lZChfQ1ZJX1BPSU5UX0RFRklORUQpCit0eXBlZGVmIHN0cnVjdCBQb2ludF9zdHJ1Y3QgeworICAgIGludCB4OyAvL1RoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LgorICAgIGludCB5OyAvL1RoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LgorfSBQb2ludDsKKyNkZWZpbmUgX0NWSV9QT0lOVF9ERUZJTkVECisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgQW5udWx1c19zdHJ1Y3QgeworICAgIFBvaW50ICBjZW50ZXI7ICAgICAgLy9UaGUgY29vcmRpbmF0ZSBsb2NhdGlvbiBvZiB0aGUgY2VudGVyIG9mIHRoZSBhbm51bHVzLgorICAgIGludCAgICBpbm5lclJhZGl1czsgLy9UaGUgaW50ZXJuYWwgcmFkaXVzIG9mIHRoZSBhbm51bHVzLgorICAgIGludCAgICBvdXRlclJhZGl1czsgLy9UaGUgZXh0ZXJuYWwgcmFkaXVzIG9mIHRoZSBhbm51bHVzLgorICAgIGRvdWJsZSBzdGFydEFuZ2xlOyAgLy9UaGUgc3RhcnQgYW5nbGUsIGluIGRlZ3JlZXMsIG9mIHRoZSBhbm51bHVzLgorICAgIGRvdWJsZSBlbmRBbmdsZTsgICAgLy9UaGUgZW5kIGFuZ2xlLCBpbiBkZWdyZWVzLCBvZiB0aGUgYW5udWx1cy4KK30gQW5udWx1czsKKwordHlwZWRlZiBzdHJ1Y3QgRWRnZUxvY2F0aW9uUmVwb3J0X3N0cnVjdCB7CisgICAgUG9pbnRGbG9hdCogZWRnZXM7ICAgIC8vVGhlIGNvb3JkaW5hdGUgbG9jYXRpb24gb2YgYWxsIGVkZ2VzIGRldGVjdGVkIGJ5IHRoZSBzZWFyY2ggbGluZS4KKyAgICBpbnQgICAgICAgICBudW1FZGdlczsgLy9UaGUgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgZWRnZXMgYXJyYXkuCit9IEVkZ2VMb2NhdGlvblJlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgRWRnZU9wdGlvbnNfc3RydWN0IHsKKyAgICB1bnNpZ25lZCAgICAgICAgICAgIHRocmVzaG9sZDsgICAgICAgICAvL1NwZWNpZmllcyB0aGUgdGhyZXNob2xkIHZhbHVlIGZvciB0aGUgY29udHJhc3Qgb2YgdGhlIGVkZ2UuCisgICAgdW5zaWduZWQgICAgICAgICAgICB3aWR0aDsgICAgICAgICAgICAgLy9UaGUgbnVtYmVyIG9mIHBpeGVscyB0aGF0IHRoZSBmdW5jdGlvbiBhdmVyYWdlcyB0byBmaW5kIHRoZSBjb250cmFzdCBhdCBlaXRoZXIgc2lkZSBvZiB0aGUgZWRnZS4KKyAgICB1bnNpZ25lZCAgICAgICAgICAgIHN0ZWVwbmVzczsgICAgICAgICAvL1RoZSBzcGFuLCBpbiBwaXhlbHMsIG9mIHRoZSBzbG9wZSBvZiB0aGUgZWRnZSBwcm9qZWN0ZWQgYWxvbmcgdGhlIHBhdGggc3BlY2lmaWVkIGJ5IHRoZSBpbnB1dCBwb2ludHMuCisgICAgSW50ZXJwb2xhdGlvbk1ldGhvZCBzdWJwaXhlbFR5cGU7ICAgICAgLy9UaGUgbWV0aG9kIGZvciBpbnRlcnBvbGF0aW5nLgorICAgIHVuc2lnbmVkICAgICAgICAgICAgc3VicGl4ZWxEaXZpc2lvbnM7IC8vVGhlIG51bWJlciBvZiBzYW1wbGVzIHRoZSBmdW5jdGlvbiBvYnRhaW5zIGZyb20gYSBwaXhlbC4KK30gRWRnZU9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IEVkZ2VSZXBvcnRfc3RydWN0IHsKKyAgICBmbG9hdCAgICAgICAgbG9jYXRpb247ICAgLy9UaGUgbG9jYXRpb24gb2YgdGhlIGVkZ2UgZnJvbSB0aGUgZmlyc3QgcG9pbnQgaW4gdGhlIHBvaW50cyBhcnJheS4KKyAgICBmbG9hdCAgICAgICAgY29udHJhc3Q7ICAgLy9UaGUgY29udHJhc3QgYXQgdGhlIGVkZ2UuCisgICAgUG9sYXJpdHlUeXBlIHBvbGFyaXR5OyAgIC8vVGhlIHBvbGFyaXR5IG9mIHRoZSBlZGdlLgorICAgIGZsb2F0ICAgICAgICByZXNlcnZlZDsgICAvL1RoaXMgZWxlbWVudCBpcyByZXNlcnZlZC4KKyAgICBQb2ludEZsb2F0ICAgY29vcmRpbmF0ZTsgLy9UaGUgY29vcmRpbmF0ZXMgb2YgdGhlIGVkZ2UuCit9IEVkZ2VSZXBvcnQ7CisKK3R5cGVkZWYgc3RydWN0IEV4dHJlbWVSZXBvcnRfc3RydWN0IHsKKyAgICBkb3VibGUgbG9jYXRpb247ICAgICAgICAgLy9UaGUgbG9jYXRpb25zIG9mIHRoZSBleHRyZW1lLgorICAgIGRvdWJsZSBhbXBsaXR1ZGU7ICAgICAgICAvL1RoZSBhbXBsaXR1ZGUgb2YgdGhlIGV4dHJlbWUuCisgICAgZG91YmxlIHNlY29uZERlcml2YXRpdmU7IC8vVGhlIHNlY29uZCBkZXJpdmF0aXZlIG9mIHRoZSBleHRyZW1lLgorfSBFeHRyZW1lUmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBGaXRMaW5lT3B0aW9uc19zdHJ1Y3QgeworICAgIGZsb2F0IG1pblNjb3JlOyAgICAgICAvL1NwZWNpZmllcyB0aGUgcmVxdWlyZWQgcXVhbGl0eSBvZiB0aGUgZml0dGVkIGxpbmUuCisgICAgZmxvYXQgcGl4ZWxSYWRpdXM7ICAgIC8vU3BlY2lmaWVzIHRoZSBuZWlnaGJvcmhvb2QgcGl4ZWwgcmVsYXRpb25zaGlwIGZvciB0aGUgaW5pdGlhbCBzdWJzZXQgb2YgcG9pbnRzIGJlaW5nIHVzZWQuCisgICAgaW50ICAgbnVtUmVmaW5lbWVudHM7IC8vU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgcmVmaW5lbWVudCBpdGVyYXRpb25zIHlvdSBhbGxvdyB0aGUgZnVuY3Rpb24gdG8gcGVyZm9ybSBvbiB0aGUgaW5pdGlhbCBzdWJzZXQgb2YgcG9pbnRzLgorfSBGaXRMaW5lT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgRGlzcGxheU1hcHBpbmdfc3RydWN0IHsKKyAgICBNYXBwaW5nTWV0aG9kIG1ldGhvZDsgICAgICAgLy9EZXNjcmliZXMgdGhlIG1ldGhvZCBmb3IgY29udmVydGluZyAxNi1iaXQgcGl4ZWxzIHRvIDgtYml0IHBpeGVscy4KKyAgICBpbnQgICAgICAgICAgIG1pbmltdW1WYWx1ZTsgLy9XaGVuIG1ldGhvZCBpcyBJTUFRX1JBTkdFLCBtaW5pbXVtVmFsdWUgcmVwcmVzZW50cyB0aGUgdmFsdWUgdGhhdCBpcyBtYXBwZWQgdG8gMC4KKyAgICBpbnQgICAgICAgICAgIG1heGltdW1WYWx1ZTsgLy9XaGVuIG1ldGhvZCBpcyBJTUFRX1JBTkdFLCBtYXhpbXVtVmFsdWUgcmVwcmVzZW50cyB0aGUgdmFsdWUgdGhhdCBpcyBtYXBwZWQgdG8gMjU1LgorICAgIGludCAgICAgICAgICAgc2hpZnRDb3VudDsgICAvL1doZW4gbWV0aG9kIGlzIElNQVFfRE9XTlNISUZULCBzaGlmdENvdW50IHJlcHJlc2VudHMgdGhlIG51bWJlciBvZiBiaXRzIHRoZSBmdW5jdGlvbiByaWdodC1zaGlmdHMgdGhlIDE2LWJpdCBwaXhlbCB2YWx1ZXMuCit9IERpc3BsYXlNYXBwaW5nOworCit0eXBlZGVmIHN0cnVjdCBEZXRlY3RFeHRyZW1lc09wdGlvbnNfc3RydWN0IHsKKyAgICBkb3VibGUgdGhyZXNob2xkOyAvL0RlZmluZXMgd2hpY2ggZXh0cmVtZXMgYXJlIHRvbyBzbWFsbC4KKyAgICBpbnQgICAgd2lkdGg7ICAgICAvL1NwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGRhdGEgcG9pbnRzIHRoZSBmdW5jdGlvbiB1c2VzIGluIHRoZSBxdWFkcmF0aWMgbGVhc3Qtc3F1YXJlcyBmaXQuCit9IERldGVjdEV4dHJlbWVzT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgSW1hZ2VJbmZvX3N0cnVjdCB7CisgICAgQ2FsaWJyYXRpb25Vbml0IGltYWdlVW5pdDsgICAgIC8vSWYgeW91IHNldCBjYWxpYnJhdGlvbiBpbmZvcm1hdGlvbiB3aXRoIGltYXFTZXRTaW1wbGVDYWxpYnJhdGlvbkluZm8oKSwgaW1hZ2VVbml0IGlzIHRoZSBjYWxpYnJhdGlvbiB1bml0LgorICAgIGZsb2F0ICAgICAgICAgICBzdGVwWDsgICAgICAgICAvL0lmIHlvdSBzZXQgY2FsaWJyYXRpb24gaW5mb3JtYXRpb24gd2l0aCBpbWFxU2V0Q2FsaWJyYXRpb25JbmZvKCksIHN0ZXBYIGlzIHRoZSBkaXN0YW5jZSBpbiB0aGUgY2FsaWJyYXRpb24gdW5pdCBiZXR3ZWVuIHR3byBwaXhlbHMgaW4gdGhlIHggZGlyZWN0aW9uLgorICAgIGZsb2F0ICAgICAgICAgICBzdGVwWTsgICAgICAgICAvL0lmIHlvdSBzZXQgY2FsaWJyYXRpb24gaW5mb3JtYXRpb24gd2l0aCBpbWFxU2V0Q2FsaWJyYXRpb25JbmZvKCksIHN0ZXBZIGlzIHRoZSBkaXN0YW5jZSBpbiB0aGUgY2FsaWJyYXRpb24gdW5pdCBiZXR3ZWVuIHR3byBwaXhlbHMgaW4gdGhlIHkgZGlyZWN0aW9uLgorICAgIEltYWdlVHlwZSAgICAgICBpbWFnZVR5cGU7ICAgICAvL1RoZSB0eXBlIG9mIHRoZSBpbWFnZS4KKyAgICBpbnQgICAgICAgICAgICAgeFJlczsgICAgICAgICAgLy9UaGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIGltYWdlLgorICAgIGludCAgICAgICAgICAgICB5UmVzOyAgICAgICAgICAvL1RoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgaW1hZ2UuCisgICAgaW50ICAgICAgICAgICAgIHhPZmZzZXQ7ICAgICAgIC8vSWYgeW91IHNldCBtYXNrIG9mZnNldCBpbmZvcm1hdGlvbiB3aXRoIGltYXFTZXRNYXNrT2Zmc2V0KCksIHhPZmZzZXQgaXMgdGhlIG9mZnNldCBvZiB0aGUgbWFzayBvcmlnaW4gaW4gdGhlIHggZGlyZWN0aW9uLgorICAgIGludCAgICAgICAgICAgICB5T2Zmc2V0OyAgICAgICAvL0lmIHlvdSBzZXQgbWFzayBvZmZzZXQgaW5mb3JtYXRpb24gd2l0aCBpbWFxU2V0TWFza09mZnNldCgpLCB5T2Zmc2V0IGlzIHRoZSBvZmZzZXQgb2YgdGhlIG1hc2sgb3JpZ2luIGluIHRoZSB5IGRpcmVjdGlvbi4KKyAgICBpbnQgICAgICAgICAgICAgYm9yZGVyOyAgICAgICAgLy9UaGUgbnVtYmVyIG9mIGJvcmRlciBwaXhlbHMgYXJvdW5kIHRoZSBpbWFnZS4KKyAgICBpbnQgICAgICAgICAgICAgcGl4ZWxzUGVyTGluZTsgLy9UaGUgbnVtYmVyIG9mIHBpeGVscyBzdG9yZWQgZm9yIGVhY2ggbGluZSBvZiB0aGUgaW1hZ2UuCisgICAgdm9pZCogICAgICAgICAgIHJlc2VydmVkMDsgICAgIC8vVGhpcyBlbGVtZW50IGlzIHJlc2VydmVkLgorICAgIHZvaWQqICAgICAgICAgICByZXNlcnZlZDE7ICAgICAvL1RoaXMgZWxlbWVudCBpcyByZXNlcnZlZC4KKyAgICB2b2lkKiAgICAgICAgICAgaW1hZ2VTdGFydDsgICAgLy9BIHBvaW50ZXIgdG8gcGl4ZWwgKDAsMCkuCit9IEltYWdlSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgTENET3B0aW9uc19zdHJ1Y3QgeworICAgIGludCAgIGxpdFNlZ21lbnRzOyAgLy9TZXQgdGhpcyBwYXJhbWV0ZXIgdG8gVFJVRSBpZiB0aGUgc2VnbWVudHMgYXJlIGJyaWdodGVyIHRoYW4gdGhlIGJhY2tncm91bmQuCisgICAgZmxvYXQgdGhyZXNob2xkOyAgICAvL0RldGVybWluZXMgd2hldGhlciBhIHNlZ21lbnQgaXMgT04gb3IgT0ZGLgorICAgIGludCAgIHNpZ247ICAgICAgICAgLy9JbmRpY2F0ZXMgd2hldGhlciB0aGUgZnVuY3Rpb24gbXVzdCByZWFkIHRoZSBzaWduIG9mIHRoZSBpbmRpY2F0b3IuCisgICAgaW50ICAgZGVjaW1hbFBvaW50OyAvL0RldGVybWluZXMgd2hldGhlciB0byBsb29rIGZvciBhIGRlY2ltYWwgc2VwYXJhdG9yIGFmdGVyIGVhY2ggZGlnaXQuCit9IExDRE9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IExDRFJlcG9ydF9zdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqICB0ZXh0OyAgICAgICAgICAvL0Egc3RyaW5nIG9mIHRoZSBjaGFyYWN0ZXJzIG9mIHRoZSBMQ0QuCisgICAgTENEU2VnbWVudHMqIHNlZ21lbnRJbmZvOyAgIC8vQW4gYXJyYXkgb2YgTENEU2VnbWVudCBzdHJ1Y3R1cmVzIGRlc2NyaWJpbmcgd2hpY2ggc2VnbWVudHMgb2YgZWFjaCBkaWdpdCBhcmUgb24uCisgICAgaW50ICAgICAgICAgIG51bUNoYXJhY3RlcnM7IC8vVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgdGhlIGZ1bmN0aW9uIHJlYWRzLgorICAgIGludCAgICAgICAgICByZXNlcnZlZDsgICAgICAvL1RoaXMgZWxlbWVudCBpcyByZXNlcnZlZC4KK30gTENEUmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBMQ0RTZWdtZW50c19zdHJ1Y3QgeworICAgIHVuc2lnbmVkIGE6MTsgICAgICAgICAvL1RydWUgaWYgdGhlIGEgc2VnbWVudCBpcyBvbi4KKyAgICB1bnNpZ25lZCBiOjE7ICAgICAgICAgLy9UcnVlIGlmIHRoZSBiIHNlZ21lbnQgaXMgb24uCisgICAgdW5zaWduZWQgYzoxOyAgICAgICAgIC8vVHJ1ZSBpZiB0aGUgYyBzZWdtZW50IGlzIG9uLgorICAgIHVuc2lnbmVkIGQ6MTsgICAgICAgICAvL1RydWUgaWYgdGhlIGQgc2VnbWVudCBpcyBvbi4KKyAgICB1bnNpZ25lZCBlOjE7ICAgICAgICAgLy9UcnVlIGlmIHRoZSBlIHNlZ21lbnQgaXMgb24uCisgICAgdW5zaWduZWQgZjoxOyAgICAgICAgIC8vVHJ1ZSBpZiB0aGUgZiBzZWdtZW50IGlzIG9uLgorICAgIHVuc2lnbmVkIGc6MTsgICAgICAgICAvL1RydWUgaWYgdGhlIGcgc2VnbWVudCBpcyBvbi4KKyAgICB1bnNpZ25lZCByZXNlcnZlZDoyNTsgLy9UaGlzIGVsZW1lbnQgaXMgcmVzZXJ2ZWQuCit9IExDRFNlZ21lbnRzOworCit0eXBlZGVmIHN0cnVjdCBMZWFybkNhbGlicmF0aW9uT3B0aW9uc19zdHJ1Y3QgeworICAgIENhbGlicmF0aW9uTW9kZSBtb2RlOyAgICAgICAvL1NwZWNpZmllcyB0aGUgdHlwZSBvZiBhbGdvcml0aG0geW91IHdhbnQgdG8gdXNlIHRvIHJlZHVjZSBkaXN0b3J0aW9uIGluIHlvdXIgaW1hZ2UuCisgICAgU2NhbGluZ01ldGhvZCAgIG1ldGhvZDsgICAgIC8vRGVmaW5lcyB0aGUgc2NhbGluZyBtZXRob2QgY29ycmVjdGlvbiBmdW5jdGlvbnMgdXNlIHRvIGNvcnJlY3QgdGhlIGltYWdlLgorICAgIENhbGlicmF0aW9uUk9JICByb2k7ICAgICAgICAvL1NwZWNpZmllcyB0aGUgUk9JIGNvcnJlY3Rpb24gZnVuY3Rpb25zIHVzZSB3aGVuIGNvcnJlY3RpbmcgYW4gaW1hZ2UuCisgICAgaW50ICAgICAgICAgICAgIGxlYXJuTWFwOyAgIC8vU2V0IHRoaXMgZWxlbWVudCB0byBUUlVFIGlmIHlvdSB3YW50IHRoZSBmdW5jdGlvbiB0byBjYWxjdWxhdGUgYW5kIHN0b3JlIGFuIGVycm9yIG1hcCBkdXJpbmcgdGhlIGxlYXJuaW5nIHByb2Nlc3MuCisgICAgaW50ICAgICAgICAgICAgIGxlYXJuVGFibGU7IC8vU2V0IHRoaXMgZWxlbWVudCB0byBUUlVFIGlmIHlvdSB3YW50IHRoZSBmdW5jdGlvbiB0byBjYWxjdWxhdGUgYW5kIHN0b3JlIHRoZSBjb3JyZWN0aW9uIHRhYmxlLgorfSBMZWFybkNhbGlicmF0aW9uT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgTGVhcm5Db2xvclBhdHRlcm5PcHRpb25zX3N0cnVjdCB7CisgICAgTGVhcm5pbmdNb2RlICAgICAgbGVhcm5Nb2RlOyAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBpbnZhcmlhbmNlIG1vZGUgdGhlIGZ1bmN0aW9uIHVzZXMgd2hlbiBsZWFybmluZyB0aGUgcGF0dGVybi4KKyAgICBJbWFnZUZlYXR1cmVNb2RlICBmZWF0dXJlTW9kZTsgICAgICAgLy9TcGVjaWZpZXMgdGhlIGZlYXR1cmVzIHRoZSBmdW5jdGlvbiB1c2VzIHdoZW4gbGVhcm5pbmcgdGhlIGNvbG9yIHBhdHRlcm4uCisgICAgaW50ICAgICAgICAgICAgICAgdGhyZXNob2xkOyAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBzYXR1cmF0aW9uIHRocmVzaG9sZCB0aGUgZnVuY3Rpb24gdXNlcyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHR3byBjb2xvcnMgdGhhdCBoYXZlIHRoZSBzYW1lIGh1ZSB2YWx1ZXMuCisgICAgQ29sb3JJZ25vcmVNb2RlICAgaWdub3JlTW9kZTsgICAgICAgIC8vU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIGV4Y2x1ZGVzIGNlcnRhaW4gY29sb3JzIGZyb20gdGhlIGNvbG9yIGZlYXR1cmVzIG9mIHRoZSB0ZW1wbGF0ZSBpbWFnZS4KKyAgICBDb2xvckluZm9ybWF0aW9uKiBjb2xvcnNUb0lnbm9yZTsgICAgLy9BbiBhcnJheSBvZiBDb2xvckluZm9ybWF0aW9uIHN0cnVjdHVyZXMgcHJvdmlkaW5nIGEgc2V0IG9mIGNvbG9ycyB0byBleGNsdWRlIGZyb20gdGhlIGNvbG9yIGZlYXR1cmVzIG9mIHRoZSB0ZW1wbGF0ZSBpbWFnZS4KKyAgICBpbnQgICAgICAgICAgICAgICBudW1Db2xvcnNUb0lnbm9yZTsgLy9UaGUgbnVtYmVyIG9mIENvbG9ySW5mb3JtYXRpb24gc3RydWN0dXJlcyBpbiB0aGUgY29sb3JzVG9JZ25vcmUgYXJyYXkuCit9IExlYXJuQ29sb3JQYXR0ZXJuT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgTGluZV9zdHJ1Y3QgeworICAgIFBvaW50IHN0YXJ0OyAvL1RoZSBjb29yZGluYXRlIGxvY2F0aW9uIG9mIHRoZSBzdGFydCBvZiB0aGUgbGluZS4KKyAgICBQb2ludCBlbmQ7ICAgLy9UaGUgY29vcmRpbmF0ZSBsb2NhdGlvbiBvZiB0aGUgZW5kIG9mIHRoZSBsaW5lLgorfSBMaW5lOworCit0eXBlZGVmIHN0cnVjdCBMaW5lYXJBdmVyYWdlc19zdHJ1Y3QgeworICAgIGZsb2F0KiBjb2x1bW5BdmVyYWdlczsgICAgICAvL0FuIGFycmF5IGNvbnRhaW5pbmcgdGhlIG1lYW4gcGl4ZWwgdmFsdWUgb2YgZWFjaCBjb2x1bW4uCisgICAgaW50ICAgIGNvbHVtbkNvdW50OyAgICAgICAgIC8vVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29sdW1uQXZlcmFnZXMgYXJyYXkuCisgICAgZmxvYXQqIHJvd0F2ZXJhZ2VzOyAgICAgICAgIC8vQW4gYXJyYXkgY29udGFpbmluZyB0aGUgbWVhbiBwaXhlbCB2YWx1ZSBvZiBlYWNoIHJvdy4KKyAgICBpbnQgICAgcm93Q291bnQ7ICAgICAgICAgICAgLy9UaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSByb3dBdmVyYWdlcyBhcnJheS4KKyAgICBmbG9hdCogcmlzaW5nRGlhZ0F2ZXJhZ2VzOyAgLy9BbiBhcnJheSBjb250YWluaW5nIHRoZSBtZWFuIHBpeGVsIHZhbHVlIG9mIGVhY2ggZGlhZ29uYWwgcnVubmluZyBmcm9tIHRoZSBsb3dlciBsZWZ0IHRvIHRoZSB1cHBlciByaWdodCBvZiB0aGUgaW5zcGVjdGVkIGFyZWEgb2YgdGhlIGltYWdlLgorICAgIGludCAgICByaXNpbmdEaWFnQ291bnQ7ICAgICAvL1RoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHJpc2luZ0RpYWdBdmVyYWdlcyBhcnJheS4KKyAgICBmbG9hdCogZmFsbGluZ0RpYWdBdmVyYWdlczsgLy9BbiBhcnJheSBjb250YWluaW5nIHRoZSBtZWFuIHBpeGVsIHZhbHVlIG9mIGVhY2ggZGlhZ29uYWwgcnVubmluZyBmcm9tIHRoZSB1cHBlciBsZWZ0IHRvIHRoZSBsb3dlciByaWdodCBvZiB0aGUgaW5zcGVjdGVkIGFyZWEgb2YgdGhlIGltYWdlLgorICAgIGludCAgICBmYWxsaW5nRGlhZ0NvdW50OyAgICAvL1RoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGZhbGxpbmdEaWFnQXZlcmFnZXMgYXJyYXkuCit9IExpbmVhckF2ZXJhZ2VzOworCit0eXBlZGVmIHN0cnVjdCBMaW5lUHJvZmlsZV9zdHJ1Y3QgeworICAgIGZsb2F0KiBwcm9maWxlRGF0YTsgLy9BbiBhcnJheSBjb250YWluaW5nIHRoZSB2YWx1ZSBvZiBlYWNoIHBpeGVsIGluIHRoZSBsaW5lLgorICAgIFJlY3QgICBib3VuZGluZ0JveDsgLy9UaGUgYm91bmRpbmcgcmVjdGFuZ2xlIG9mIHRoZSBsaW5lLgorICAgIGZsb2F0ICBtaW47ICAgICAgICAgLy9UaGUgc21hbGxlc3QgcGl4ZWwgdmFsdWUgaW4gdGhlIGxpbmUgcHJvZmlsZS4KKyAgICBmbG9hdCAgbWF4OyAgICAgICAgIC8vVGhlIGxhcmdlc3QgcGl4ZWwgdmFsdWUgaW4gdGhlIGxpbmUgcHJvZmlsZS4KKyAgICBmbG9hdCAgbWVhbjsgICAgICAgIC8vVGhlIG1lYW4gdmFsdWUgb2YgdGhlIHBpeGVscyBpbiB0aGUgbGluZSBwcm9maWxlLgorICAgIGZsb2F0ICBzdGREZXY7ICAgICAgLy9UaGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBsaW5lIHByb2ZpbGUuCisgICAgaW50ICAgIGRhdGFDb3VudDsgICAvL1RoZSBzaXplIG9mIHRoZSBwcm9maWxlRGF0YSBhcnJheS4KK30gTGluZVByb2ZpbGU7CisKK3R5cGVkZWYgc3RydWN0IE1hdGNoQ29sb3JQYXR0ZXJuT3B0aW9uc19zdHJ1Y3QgeworICAgIE1hdGNoaW5nTW9kZSAgICAgICAgbWF0Y2hNb2RlOyAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIG1ldGhvZCB0byB1c2Ugd2hlbiBsb29raW5nIGZvciB0aGUgY29sb3IgcGF0dGVybiBpbiB0aGUgaW1hZ2UuCisgICAgSW1hZ2VGZWF0dXJlTW9kZSAgICBmZWF0dXJlTW9kZTsgICAgICAgICAvL1NwZWNpZmllcyB0aGUgZmVhdHVyZXMgdG8gdXNlIHdoZW4gbG9va2luZyBmb3IgdGhlIGNvbG9yIHBhdHRlcm4gaW4gdGhlIGltYWdlLgorICAgIGludCAgICAgICAgICAgICAgICAgbWluQ29udHJhc3Q7ICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIG1pbmltdW0gY29udHJhc3QgZXhwZWN0ZWQgaW4gdGhlIGltYWdlLgorICAgIGludCAgICAgICAgICAgICAgICAgc3VicGl4ZWxBY2N1cmFjeTsgICAgLy9TZXQgdGhpcyBwYXJhbWV0ZXIgdG8gVFJVRSB0byByZXR1cm4gYXJlYXMgaW4gdGhlIGltYWdlIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4gYXJlYSB3aXRoIHN1YnBpeGVsIGFjY3VyYWN5LgorICAgIFJvdGF0aW9uQW5nbGVSYW5nZSogYW5nbGVSYW5nZXM7ICAgICAgICAgLy9BbiBhcnJheSBvZiBhbmdsZSByYW5nZXMsIGluIGRlZ3JlZXMsIHdoZXJlIGVhY2ggcmFuZ2Ugc3BlY2lmaWVzIGhvdyBtdWNoIHlvdSBleHBlY3QgdGhlIHBhdHRlcm4gdG8gYmUgcm90YXRlZCBpbiB0aGUgaW1hZ2UuCisgICAgaW50ICAgICAgICAgICAgICAgICBudW1SYW5nZXM7ICAgICAgICAgICAvL051bWJlciBvZiBhbmdsZSByYW5nZXMgaW4gdGhlIGFuZ2xlUmFuZ2VzIGFycmF5LgorICAgIGRvdWJsZSAgICAgICAgICAgICAgY29sb3JXZWlnaHQ7ICAgICAgICAgLy9EZXRlcm1pbmVzIHRoZSBwZXJjZW50IGNvbnRyaWJ1dGlvbiBvZiB0aGUgY29sb3Igc2NvcmUgdG8gdGhlIGZpbmFsIGNvbG9yIHBhdHRlcm4gbWF0Y2hpbmcgc2NvcmUuCisgICAgQ29sb3JTZW5zaXRpdml0eSAgICBzZW5zaXRpdml0eTsgICAgICAgICAvL1NwZWNpZmllcyB0aGUgc2Vuc2l0aXZpdHkgb2YgdGhlIGNvbG9yIGluZm9ybWF0aW9uIGluIHRoZSBpbWFnZS4KKyAgICBTZWFyY2hTdHJhdGVneSAgICAgIHN0cmF0ZWd5OyAgICAgICAgICAgIC8vU3BlY2lmaWVzIGhvdyB0aGUgY29sb3IgZmVhdHVyZXMgb2YgdGhlIGltYWdlIGFyZSB1c2VkIGR1cmluZyB0aGUgc2VhcmNoIHBoYXNlLgorICAgIGludCAgICAgICAgICAgICAgICAgbnVtTWF0Y2hlc1JlcXVlc3RlZDsgLy9OdW1iZXIgb2YgdmFsaWQgbWF0Y2hlcyBleHBlY3RlZC4KKyAgICBmbG9hdCAgICAgICAgICAgICAgIG1pbk1hdGNoU2NvcmU7ICAgICAgIC8vVGhlIG1pbmltdW0gc2NvcmUgYSBtYXRjaCBjYW4gaGF2ZSBmb3IgdGhlIGZ1bmN0aW9uIHRvIGNvbnNpZGVyIHRoZSBtYXRjaCB2YWxpZC4KK30gTWF0Y2hDb2xvclBhdHRlcm5PcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBIaXN0b2dyYW1SZXBvcnRfc3RydWN0IHsKKyAgICBpbnQqICBoaXN0b2dyYW07ICAgICAgLy9BbiBhcnJheSBkZXNjcmliaW5nIHRoZSBudW1iZXIgb2YgcGl4ZWxzIHRoYXQgZmVsbCBpbnRvIGVhY2ggY2xhc3MuCisgICAgaW50ICAgaGlzdG9ncmFtQ291bnQ7IC8vVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgaGlzdG9ncmFtIGFycmF5LgorICAgIGZsb2F0IG1pbjsgICAgICAgICAgICAvL1RoZSBzbWFsbGVzdCBwaXhlbCB2YWx1ZSB0aGF0IHRoZSBmdW5jdGlvbiBjbGFzc2lmaWVkLgorICAgIGZsb2F0IG1heDsgICAgICAgICAgICAvL1RoZSBsYXJnZXN0IHBpeGVsIHZhbHVlIHRoYXQgdGhlIGZ1bmN0aW9uIGNsYXNzaWZpZWQuCisgICAgZmxvYXQgc3RhcnQ7ICAgICAgICAgIC8vVGhlIHNtYWxsZXN0IHBpeGVsIHZhbHVlIHRoYXQgZmVsbCBpbnRvIHRoZSBmaXJzdCBjbGFzcy4KKyAgICBmbG9hdCB3aWR0aDsgICAgICAgICAgLy9UaGUgc2l6ZSBvZiBlYWNoIGNsYXNzLgorICAgIGZsb2F0IG1lYW47ICAgICAgICAgICAvL1RoZSBtZWFuIHZhbHVlIG9mIHRoZSBwaXhlbHMgdGhhdCB0aGUgZnVuY3Rpb24gY2xhc3NpZmllZC4KKyAgICBmbG9hdCBzdGREZXY7ICAgICAgICAgLy9UaGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBwaXhlbHMgdGhhdCB0aGUgZnVuY3Rpb24gY2xhc3NpZmllZC4KKyAgICBpbnQgICBudW1QaXhlbHM7ICAgICAgLy9UaGUgbnVtYmVyIG9mIHBpeGVscyB0aGF0IHRoZSBmdW5jdGlvbiBjbGFzc2lmaWVkLgorfSBIaXN0b2dyYW1SZXBvcnQ7CisKK3R5cGVkZWYgc3RydWN0IEFyY0luZm9fc3RydWN0IHsKKyAgICBSZWN0ICAgYm91bmRpbmdCb3g7IC8vVGhlIGNvb3JkaW5hdGUgbG9jYXRpb24gb2YgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgYXJjLgorICAgIGRvdWJsZSBzdGFydEFuZ2xlOyAgLy9UaGUgY291bnRlcmNsb2Nrd2lzZSBhbmdsZSBmcm9tIHRoZSB4LWF4aXMgaW4gZGVncmVlcyB0byB0aGUgc3RhcnQgb2YgdGhlIGFyYy4KKyAgICBkb3VibGUgZW5kQW5nbGU7ICAgIC8vVGhlIGNvdW50ZXJjbG9ja3dpc2UgYW5nbGUgZnJvbSB0aGUgeC1heGlzIGluIGRlZ3JlZXMgdG8gdGhlIGVuZCBvZiB0aGUgYXJjLgorfSBBcmNJbmZvOworCit0eXBlZGVmIHN0cnVjdCBBeGlzUmVwb3J0X3N0cnVjdCB7CisgICAgUG9pbnRGbG9hdCBvcmlnaW47ICAgICAgICAgICAvL1RoZSBvcmlnaW4gb2YgdGhlIGNvb3JkaW5hdGUgc3lzdGVtLCB3aGljaCBpcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSB0d28gYXhlcyBvZiB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0uCisgICAgUG9pbnRGbG9hdCBtYWluQXhpc0VuZDsgICAgICAvL1RoZSBlbmQgb2YgdGhlIG1haW4gYXhpcywgd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgY29tcHV0YXRpb24gb2YgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgbWFpbiBheGlzIHdpdGggdGhlIHJlY3Rhbmd1bGFyIHNlYXJjaCBhcmVhLgorICAgIFBvaW50RmxvYXQgc2Vjb25kYXJ5QXhpc0VuZDsgLy9UaGUgZW5kIG9mIHRoZSBzZWNvbmRhcnkgYXhpcywgd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgY29tcHV0YXRpb24gb2YgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgc2Vjb25kYXJ5IGF4aXMgd2l0aCB0aGUgcmVjdGFuZ3VsYXIgc2VhcmNoIGFyZWEuCit9IEF4aXNSZXBvcnQ7CisKK3R5cGVkZWYgc3RydWN0IEJhcmNvZGVJbmZvX3N0cnVjdCB7CisgICAgY29uc3QgY2hhciogb3V0cHV0U3RyaW5nOyAgICAvL0Egc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGRlY29kZWQgYmFyY29kZSBkYXRhLgorICAgIGludCAgICAgICAgIHNpemU7ICAgICAgICAgICAgLy9UaGUgc2l6ZSBvZiB0aGUgb3V0cHV0IHN0cmluZy4KKyAgICBjaGFyICAgICAgICBvdXRwdXRDaGFyMTsgICAgIC8vVGhlIGNvbnRlbnRzIG9mIHRoaXMgY2hhcmFjdGVyIGRlcGVuZCBvbiB0aGUgYmFyY29kZSB0eXBlLgorICAgIGNoYXIgICAgICAgIG91dHB1dENoYXIyOyAgICAgLy9UaGUgY29udGVudHMgb2YgdGhpcyBjaGFyYWN0ZXIgZGVwZW5kIG9uIHRoZSBiYXJjb2RlIHR5cGUuCisgICAgZG91YmxlICAgICAgY29uZmlkZW5jZUxldmVsOyAvL0EgcXVhbGl0eSBtZWFzdXJlIG9mIHRoZSBkZWNvZGVkIGJhcmNvZGUgcmFuZ2luZyBmcm9tIDAgdG8gMTAwLCB3aXRoIDEwMCBiZWluZyB0aGUgYmVzdC4KKyAgICBCYXJjb2RlVHlwZSB0eXBlOyAgICAgICAgICAgIC8vVGhlIHR5cGUgb2YgYmFyY29kZS4KK30gQmFyY29kZUluZm87CisKK3R5cGVkZWYgc3RydWN0IEJDR09wdGlvbnNfc3RydWN0IHsKKyAgICBmbG9hdCBicmlnaHRuZXNzOyAvL0FkanVzdHMgdGhlIGJyaWdodG5lc3Mgb2YgdGhlIGltYWdlLgorICAgIGZsb2F0IGNvbnRyYXN0OyAgIC8vQWRqdXN0cyB0aGUgY29udHJhc3Qgb2YgdGhlIGltYWdlLgorICAgIGZsb2F0IGdhbW1hOyAgICAgIC8vUGVyZm9ybXMgZ2FtbWEgY29ycmVjdGlvbi4KK30gQkNHT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgQmVzdENpcmNsZV9zdHJ1Y3QgeworICAgIFBvaW50RmxvYXQgY2VudGVyOyAgICAvL1RoZSBjb29yZGluYXRlIGxvY2F0aW9uIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGNpcmNsZS4KKyAgICBkb3VibGUgICAgIHJhZGl1czsgICAgLy9UaGUgcmFkaXVzIG9mIHRoZSBjaXJjbGUuCisgICAgZG91YmxlICAgICBhcmVhOyAgICAgIC8vVGhlIGFyZWEgb2YgdGhlIGNpcmNsZS4KKyAgICBkb3VibGUgICAgIHBlcmltZXRlcjsgLy9UaGUgbGVuZ3RoIG9mIHRoZSBwZXJpbWV0ZXIgb2YgdGhlIGNpcmNsZS4KKyAgICBkb3VibGUgICAgIGVycm9yOyAgICAgLy9SZXByZXNlbnRzIHRoZSBsZWFzdCBzcXVhcmUgZXJyb3Igb2YgdGhlIGZpdHRlZCBjaXJjbGUgdG8gdGhlIGVudGlyZSBzZXQgb2YgcG9pbnRzLgorfSBCZXN0Q2lyY2xlOworCit0eXBlZGVmIHN0cnVjdCBCZXN0RWxsaXBzZV9zdHJ1Y3QgeworICAgIFBvaW50RmxvYXQgY2VudGVyOyAgICAgICAgIC8vVGhlIGNvb3JkaW5hdGUgbG9jYXRpb24gb2YgdGhlIGNlbnRlciBvZiB0aGUgZWxsaXBzZS4KKyAgICBQb2ludEZsb2F0IG1ham9yQXhpc1N0YXJ0OyAvL1RoZSBjb29yZGluYXRlIGxvY2F0aW9uIG9mIHRoZSBzdGFydCBvZiB0aGUgbWFqb3IgYXhpcyBvZiB0aGUgZWxsaXBzZS4KKyAgICBQb2ludEZsb2F0IG1ham9yQXhpc0VuZDsgICAvL1RoZSBjb29yZGluYXRlIGxvY2F0aW9uIG9mIHRoZSBlbmQgb2YgdGhlIG1ham9yIGF4aXMgb2YgdGhlIGVsbGlwc2UuCisgICAgUG9pbnRGbG9hdCBtaW5vckF4aXNTdGFydDsgLy9UaGUgY29vcmRpbmF0ZSBsb2NhdGlvbiBvZiB0aGUgc3RhcnQgb2YgdGhlIG1pbm9yIGF4aXMgb2YgdGhlIGVsbGlwc2UuCisgICAgUG9pbnRGbG9hdCBtaW5vckF4aXNFbmQ7ICAgLy9UaGUgY29vcmRpbmF0ZSBsb2NhdGlvbiBvZiB0aGUgZW5kIG9mIHRoZSBtaW5vciBheGlzIG9mIHRoZSBlbGxpcHNlLgorICAgIGRvdWJsZSAgICAgYXJlYTsgICAgICAgICAgIC8vVGhlIGFyZWEgb2YgdGhlIGVsbGlwc2UuCisgICAgZG91YmxlICAgICBwZXJpbWV0ZXI7ICAgICAgLy9UaGUgbGVuZ3RoIG9mIHRoZSBwZXJpbWV0ZXIgb2YgdGhlIGVsbGlwc2UuCit9IEJlc3RFbGxpcHNlOworCit0eXBlZGVmIHN0cnVjdCBCZXN0TGluZV9zdHJ1Y3QgeworICAgIFBvaW50RmxvYXQgICBzdGFydDsgICAgICAgICAvL1RoZSBjb29yZGluYXRlIGxvY2F0aW9uIG9mIHRoZSBzdGFydCBvZiB0aGUgbGluZS4KKyAgICBQb2ludEZsb2F0ICAgZW5kOyAgICAgICAgICAgLy9UaGUgY29vcmRpbmF0ZSBsb2NhdGlvbiBvZiB0aGUgZW5kIG9mIHRoZSBsaW5lLgorICAgIExpbmVFcXVhdGlvbiBlcXVhdGlvbjsgICAgICAvL0RlZmluZXMgdGhlIHRocmVlIGNvZWZmaWNpZW50cyBvZiB0aGUgZXF1YXRpb24gb2YgdGhlIGJlc3QgZml0IGxpbmUuCisgICAgaW50ICAgICAgICAgIHZhbGlkOyAgICAgICAgIC8vVGhpcyBlbGVtZW50IGlzIFRSVUUgaWYgdGhlIGZ1bmN0aW9uIGFjaGlldmVkIHRoZSBtaW5pbXVtIHNjb3JlIHdpdGhpbiB0aGUgbnVtYmVyIG9mIGFsbG93ZWQgcmVmaW5lbWVudCBpdGVyYXRpb25zIGFuZCBGQUxTRSBpZiB0aGUgZnVuY3Rpb24gZGlkIG5vdCBhY2hpZXZlIHRoZSBtaW5pbXVtIHNjb3JlLgorICAgIGRvdWJsZSAgICAgICBlcnJvcjsgICAgICAgICAvL1JlcHJlc2VudHMgdGhlIGxlYXN0IHNxdWFyZSBlcnJvciBvZiB0aGUgZml0dGVkIGxpbmUgdG8gdGhlIGVudGlyZSBzZXQgb2YgcG9pbnRzLgorICAgIGludCogICAgICAgICBwb2ludHNVc2VkOyAgICAvL0FuIGFycmF5IG9mIHRoZSBpbmRleGVzIGZvciB0aGUgcG9pbnRzIGFycmF5IGluZGljYXRpbmcgd2hpY2ggcG9pbnRzIHRoZSBmdW5jdGlvbiB1c2VkIHRvIGZpdCB0aGUgbGluZS4KKyAgICBpbnQgICAgICAgICAgbnVtUG9pbnRzVXNlZDsgLy9UaGUgbnVtYmVyIG9mIHBvaW50cyB0aGUgZnVuY3Rpb24gdXNlZCB0byBmaXQgdGhlIGxpbmUuCit9IEJlc3RMaW5lOworCit0eXBlZGVmIHN0cnVjdCBCcm93c2VyT3B0aW9uc19zdHJ1Y3QgeworICAgIGludCAgICAgICAgICAgICAgIHdpZHRoOyAgICAgICAgICAgLy9UaGUgd2lkdGggdG8gbWFrZSB0aGUgYnJvd3Nlci4KKyAgICBpbnQgICAgICAgICAgICAgICBoZWlnaHQ7ICAgICAgICAgIC8vVGhlIGhlaWdodCB0byBtYWtlIHRoZSBicm93c2VyIGltYWdlLgorICAgIGludCAgICAgICAgICAgICAgIGltYWdlc1BlckxpbmU7ICAgLy9UaGUgbnVtYmVyIG9mIGltYWdlcyB0byBwbGFjZSBvbiBhIHNpbmdsZSBsaW5lLgorICAgIFJHQlZhbHVlICAgICAgICAgIGJhY2tncm91bmRDb2xvcjsgLy9UaGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgYnJvd3Nlci4KKyAgICBpbnQgICAgICAgICAgICAgICBmcmFtZVNpemU7ICAgICAgIC8vU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgcGl4ZWxzIHdpdGggd2hpY2ggdG8gYm9yZGVyIGVhY2ggdGh1bWJuYWlsLgorICAgIEJyb3dzZXJGcmFtZVN0eWxlIHN0eWxlOyAgICAgICAgICAgLy9UaGUgc3R5bGUgZm9yIHRoZSBmcmFtZSBhcm91bmQgZWFjaCB0aHVtYm5haWwuCisgICAgZmxvYXQgICAgICAgICAgICAgcmF0aW87ICAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgd2lkdGggdG8gaGVpZ2h0IHJhdGlvIG9mIGVhY2ggdGh1bWJuYWlsLgorICAgIFJHQlZhbHVlICAgICAgICAgIGZvY3VzQ29sb3I7ICAgICAgLy9UaGUgY29sb3IgdG8gdXNlIHRvIGRpc3BsYXkgZm9jdXNlZCBjZWxscy4KK30gQnJvd3Nlck9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IENvb3JkaW5hdGVTeXN0ZW1fc3RydWN0IHsKKyAgICBQb2ludEZsb2F0ICAgICAgb3JpZ2luOyAgICAgICAgICAvL1RoZSBvcmlnaW4gb2YgdGhlIGNvb3JkaW5hdGUgc3lzdGVtLgorICAgIGZsb2F0ICAgICAgICAgICBhbmdsZTsgICAgICAgICAgIC8vVGhlIGFuZ2xlLCBpbiBkZWdyZWVzLCBvZiB0aGUgeC1heGlzIG9mIHRoZSBjb29yZGluYXRlIHN5c3RlbSByZWxhdGl2ZSB0byB0aGUgaW1hZ2UgeC1heGlzLgorICAgIEF4aXNPcmllbnRhdGlvbiBheGlzT3JpZW50YXRpb247IC8vVGhlIGRpcmVjdGlvbiBvZiB0aGUgeS1heGlzIG9mIHRoZSBjb29yZGluYXRlIHJlZmVyZW5jZSBzeXN0ZW0uCit9IENvb3JkaW5hdGVTeXN0ZW07CisKK3R5cGVkZWYgc3RydWN0IENhbGlicmF0aW9uSW5mb19zdHJ1Y3QgeworICAgIGZsb2F0KiAgICAgICAgICAgICAgICAgIGVycm9yTWFwOyAgICAgICAvL1RoZSBlcnJvciBtYXAgZm9yIHRoZSBjYWxpYnJhdGlvbi4KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtYXBDb2x1bW5zOyAgICAgLy9UaGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIGVycm9yIG1hcC4KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtYXBSb3dzOyAgICAgICAgLy9UaGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIGVycm9yIG1hcC4KKyAgICBST0kqICAgICAgICAgICAgICAgICAgICB1c2VyUm9pOyAgICAgICAgLy9TcGVjaWZpZXMgdGhlIFJPSSB0aGUgdXNlciBwcm92aWRlZCB3aGVuIGxlYXJuaW5nIHRoZSBjYWxpYnJhdGlvbi4KKyAgICBST0kqICAgICAgICAgICAgICAgICAgICBjYWxpYnJhdGlvblJvaTsgLy9TcGVjaWZpZXMgdGhlIFJPSSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSByZWdpb24gb2YgdGhlIGltYWdlIHdoZXJlIHRoZSBjYWxpYnJhdGlvbiBpbmZvcm1hdGlvbiBpcyBhY2N1cmF0ZS4KKyAgICBMZWFybkNhbGlicmF0aW9uT3B0aW9ucyBvcHRpb25zOyAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGNhbGlicmF0aW9uIG9wdGlvbnMgdGhlIHVzZXIgcHJvdmlkZWQgd2hlbiBsZWFybmluZyB0aGUgY2FsaWJyYXRpb24uCisgICAgR3JpZERlc2NyaXB0b3IgICAgICAgICAgZ3JpZDsgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBzY2FsaW5nIGNvbnN0YW50cyBmb3IgdGhlIGltYWdlLgorICAgIENvb3JkaW5hdGVTeXN0ZW0gICAgICAgIHN5c3RlbTsgICAgICAgICAvL1NwZWNpZmllcyB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0gZm9yIHRoZSByZWFsIHdvcmxkIGNvb3JkaW5hdGVzLgorICAgIFJhbmdlRmxvYXQgICAgICAgICAgICAgIHJhbmdlOyAgICAgICAgICAvL1RoZSByYW5nZSBvZiB0aGUgZ3JheXNjYWxlIHRoZSBmdW5jdGlvbiB1c2VkIHRvIHJlcHJlc2VudCB0aGUgY2lyY2xlcyBpbiB0aGUgZ3JpZCBpbWFnZS4KKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBxdWFsaXR5OyAgICAgICAgLy9UaGUgcXVhbGl0eSBzY29yZSBvZiB0aGUgbGVhcm5pbmcgcHJvY2Vzcywgd2hpY2ggaXMgYSB2YWx1ZSBiZXR3ZWVuIDAtMTAwMC4KK30gQ2FsaWJyYXRpb25JbmZvOworCit0eXBlZGVmIHN0cnVjdCBDYWxpYnJhdGlvblBvaW50c19zdHJ1Y3QgeworICAgIFBvaW50RmxvYXQqIHBpeGVsQ29vcmRpbmF0ZXM7ICAgICAvL1RoZSBhcnJheSBvZiBwaXhlbCBjb29yZGluYXRlcy4KKyAgICBQb2ludEZsb2F0KiByZWFsV29ybGRDb29yZGluYXRlczsgLy9UaGUgYXJyYXkgb2YgY29ycmVzcG9uZGluZyByZWFsLXdvcmxkIGNvb3JkaW5hdGVzLgorICAgIGludCAgICAgICAgIG51bUNvb3JkaW5hdGVzOyAgICAgICAvL1RoZSBudW1iZXIgb2YgY29vcmRpbmF0ZXMgaW4gYm90aCBvZiB0aGUgYXJyYXlzLgorfSBDYWxpYnJhdGlvblBvaW50czsKKwordHlwZWRlZiBzdHJ1Y3QgQ2FsaXBlck9wdGlvbnNfc3RydWN0IHsKKyAgICBUd29FZGdlUG9sYXJpdHlUeXBlIHBvbGFyaXR5OyAgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBlZGdlIHBvbGFyaXR5IG9mIHRoZSBlZGdlIHBhaXJzLgorICAgIGZsb2F0ICAgICAgICAgICAgICAgc2VwYXJhdGlvbjsgICAgICAgICAgLy9UaGUgZGlzdGFuY2UgYmV0d2VlbiBlZGdlIHBhaXJzLgorICAgIGZsb2F0ICAgICAgICAgICAgICAgc2VwYXJhdGlvbkRldmlhdGlvbjsgLy9TZXRzIHRoZSByYW5nZSBhcm91bmQgdGhlIHNlcGFyYXRpb24gdmFsdWUuCit9IENhbGlwZXJPcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBDYWxpcGVyUmVwb3J0X3N0cnVjdCB7CisgICAgZmxvYXQgICAgICBlZGdlMUNvbnRyYXN0OyAvL1RoZSBjb250cmFzdCBvZiB0aGUgZmlyc3QgZWRnZS4KKyAgICBQb2ludEZsb2F0IGVkZ2UxQ29vcmQ7ICAgIC8vVGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBmaXJzdCBlZGdlLgorICAgIGZsb2F0ICAgICAgZWRnZTJDb250cmFzdDsgLy9UaGUgY29udHJhc3Qgb2YgdGhlIHNlY29uZCBlZGdlLgorICAgIFBvaW50RmxvYXQgZWRnZTJDb29yZDsgICAgLy9UaGUgY29vcmRpbmF0ZXMgb2YgdGhlIHNlY29uZCBlZGdlLgorICAgIGZsb2F0ICAgICAgc2VwYXJhdGlvbjsgICAgLy9UaGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdHdvIGVkZ2VzLgorICAgIGZsb2F0ICAgICAgcmVzZXJ2ZWQ7ICAgICAgLy9UaGlzIGVsZW1lbnQgaXMgcmVzZXJ2ZWQuCit9IENhbGlwZXJSZXBvcnQ7CisKK3R5cGVkZWYgc3RydWN0IERyYXdUZXh0T3B0aW9uc19zdHJ1Y3QgeworICAgIGNoYXIgICAgICAgICAgZm9udE5hbWVbMzJdOyAgLy9UaGUgZm9udCBuYW1lIHRvIHVzZS4KKyAgICBpbnQgICAgICAgICAgIGZvbnRTaXplOyAgICAgIC8vVGhlIHNpemUgb2YgdGhlIGZvbnQuCisgICAgaW50ICAgICAgICAgICBib2xkOyAgICAgICAgICAvL1NldCB0aGlzIHBhcmFtZXRlciB0byBUUlVFIHRvIGJvbGQgdGV4dC4KKyAgICBpbnQgICAgICAgICAgIGl0YWxpYzsgICAgICAgIC8vU2V0IHRoaXMgcGFyYW1ldGVyIHRvIFRSVUUgdG8gaXRhbGljaXplIHRleHQuCisgICAgaW50ICAgICAgICAgICB1bmRlcmxpbmU7ICAgICAvL1NldCB0aGlzIHBhcmFtZXRlciB0byBUUlVFIHRvIHVuZGVybGluZSB0ZXh0LgorICAgIGludCAgICAgICAgICAgc3RyaWtlb3V0OyAgICAgLy9TZXQgdGhpcyBwYXJhbWV0ZXIgdG8gVFJVRSB0byBzdHJpa2VvdXQgdGV4dC4KKyAgICBUZXh0QWxpZ25tZW50IHRleHRBbGlnbm1lbnQ7IC8vU2V0cyB0aGUgYWxpZ25tZW50IG9mIHRleHQuCisgICAgRm9udENvbG9yICAgICBmb250Q29sb3I7ICAgICAvL1NldHMgdGhlIGZvbnQgY29sb3IuCit9IERyYXdUZXh0T3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgQ2lyY2xlUmVwb3J0X3N0cnVjdCB7CisgICAgUG9pbnQgY2VudGVyOyAvL1RoZSBjb29yZGluYXRlIHBvaW50IG9mIHRoZSBjZW50ZXIgb2YgdGhlIGNpcmNsZS4KKyAgICBpbnQgICByYWRpdXM7IC8vVGhlIHJhZGl1cyBvZiB0aGUgY2lyY2xlLCBpbiBwaXhlbHMuCisgICAgaW50ICAgYXJlYTsgICAvL1RoZSBhcmVhIG9mIHRoZSBjaXJjbGUsIGluIHBpeGVscy4KK30gQ2lyY2xlUmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBDbG9zZWRDb250b3VyX3N0cnVjdCB7CisgICAgUG9pbnQqIHBvaW50czsgICAgLy9UaGUgcG9pbnRzIHRoYXQgbWFrZSB1cCB0aGUgY2xvc2VkIGNvbnRvdXIuCisgICAgaW50ICAgIG51bVBvaW50czsgLy9UaGUgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgYXJyYXkuCit9IENsb3NlZENvbnRvdXI7CisKK3R5cGVkZWYgc3RydWN0IENvbG9ySGlzdG9ncmFtUmVwb3J0X3N0cnVjdCB7CisgICAgSGlzdG9ncmFtUmVwb3J0IHBsYW5lMTsgLy9UaGUgaGlzdG9ncmFtIHJlcG9ydCBvZiB0aGUgZmlyc3QgY29sb3IgcGxhbmUuCisgICAgSGlzdG9ncmFtUmVwb3J0IHBsYW5lMjsgLy9UaGUgaGlzdG9ncmFtIHJlcG9ydCBvZiB0aGUgc2Vjb25kIHBsYW5lLgorICAgIEhpc3RvZ3JhbVJlcG9ydCBwbGFuZTM7IC8vVGhlIGhpc3RvZ3JhbSByZXBvcnQgb2YgdGhlIHRoaXJkIHBsYW5lLgorfSBDb2xvckhpc3RvZ3JhbVJlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgQ29sb3JJbmZvcm1hdGlvbl9zdHJ1Y3QgeworICAgIGludCAgICAgaW5mb0NvdW50OyAgLy9UaGUgc2l6ZSBvZiB0aGUgaW5mbyBhcnJheS4KKyAgICBpbnQgICAgIHNhdHVyYXRpb247IC8vVGhlIHNhdHVyYXRpb24gbGV2ZWwgdGhlIGZ1bmN0aW9uIHVzZXMgdG8gbGVhcm4gdGhlIGNvbG9yIGluZm9ybWF0aW9uLgorICAgIGRvdWJsZSogaW5mbzsgICAgICAgLy9BbiBhcnJheSBvZiBjb2xvciBpbmZvcm1hdGlvbiB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbG9yIHNwZWN0cnVtIGFuYWx5c2lzIG9mIGEgcmVnaW9uIG9mIGFuIGltYWdlIGluIGEgY29tcGFjdCBmb3JtLgorfSBDb2xvckluZm9ybWF0aW9uOworCit0eXBlZGVmIHN0cnVjdCBDb21wbGV4X3N0cnVjdCB7CisgICAgZmxvYXQgcjsgLy9UaGUgcmVhbCBwYXJ0IG9mIHRoZSB2YWx1ZS4KKyAgICBmbG9hdCBpOyAvL1RoZSBpbWFnaW5hcnkgcGFydCBvZiB0aGUgdmFsdWUuCit9IENvbXBsZXg7CisKK3R5cGVkZWYgc3RydWN0IENvbmNlbnRyaWNSYWtlUmVwb3J0X3N0cnVjdCB7CisgICAgQXJjSW5mbyogICAgICAgICAgICByYWtlQXJjczsgICAgICAgICAgLy9BbiBhcnJheSBjb250YWluaW5nIHRoZSBsb2NhdGlvbiBvZiBlYWNoIGNvbmNlbnRyaWMgYXJjIGxpbmUgdXNlZCBmb3IgZWRnZSBkZXRlY3Rpb24uCisgICAgaW50ICAgICAgICAgICAgICAgICBudW1BcmNzOyAgICAgICAgICAgLy9UaGUgbnVtYmVyIG9mIGFyYyBsaW5lcyBpbiB0aGUgcmFrZUFyY3MgYXJyYXkuCisgICAgUG9pbnRGbG9hdCogICAgICAgICBmaXJzdEVkZ2VzOyAgICAgICAgLy9UaGUgY29vcmRpbmF0ZSBsb2NhdGlvbiBvZiBhbGwgZWRnZXMgZGV0ZWN0ZWQgYXMgZmlyc3QgZWRnZXMuCisgICAgaW50ICAgICAgICAgICAgICAgICBudW1GaXJzdEVkZ2VzOyAgICAgLy9UaGUgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgZmlyc3QgZWRnZXMgYXJyYXkuCisgICAgUG9pbnRGbG9hdCogICAgICAgICBsYXN0RWRnZXM7ICAgICAgICAgLy9UaGUgY29vcmRpbmF0ZSBsb2NhdGlvbiBvZiBhbGwgZWRnZXMgZGV0ZWN0ZWQgYXMgbGFzdCBlZGdlcy4KKyAgICBpbnQgICAgICAgICAgICAgICAgIG51bUxhc3RFZGdlczsgICAgICAvL1RoZSBudW1iZXIgb2YgcG9pbnRzIGluIHRoZSBsYXN0IGVkZ2VzIGFycmF5LgorICAgIEVkZ2VMb2NhdGlvblJlcG9ydCogYWxsRWRnZXM7ICAgICAgICAgIC8vQW4gYXJyYXkgb2YgcmVwb3J0cyBkZXNjcmliaW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUgZWRnZXMgbG9jYXRlZCBieSBlYWNoIGNvbmNlbnRyaWMgcmFrZSBhcmMgbGluZS4KKyAgICBpbnQqICAgICAgICAgICAgICAgIGxpbmVzV2l0aEVkZ2VzOyAgICAvL0FuIGFycmF5IG9mIGluZGljZXMgaW50byB0aGUgcmFrZUFyY3MgYXJyYXkgaW5kaWNhdGluZyB0aGUgY29uY2VudHJpYyByYWtlIGFyYyBsaW5lcyBvbiB3aGljaCB0aGUgZnVuY3Rpb24gZGV0ZWN0ZWQgYXQgbGVhc3Qgb25lIGVkZ2UuCisgICAgaW50ICAgICAgICAgICAgICAgICBudW1MaW5lc1dpdGhFZGdlczsgLy9UaGUgbnVtYmVyIG9mIGNvbmNlbnRyaWMgcmFrZSBhcmMgbGluZXMgYWxvbmcgd2hpY2ggdGhlIGZ1bmN0aW9uIGRldGVjdGVkIGVkZ2VzLgorfSBDb25jZW50cmljUmFrZVJlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgQ29uc3RydWN0Uk9JT3B0aW9uc19zdHJ1Y3QgeworICAgIGludCAgICAgICAgIHdpbmRvd051bWJlcjsgLy9UaGUgd2luZG93IG51bWJlciBvZiB0aGUgaW1hZ2Ugd2luZG93LgorICAgIGNvbnN0IGNoYXIqIHdpbmRvd1RpdGxlOyAgLy9TcGVjaWZpZXMgdGhlIG1lc3NhZ2Ugc3RyaW5nIHRoYXQgdGhlIGZ1bmN0aW9uIGRpc3BsYXlzIGluIHRoZSB0aXRsZSBiYXIgb2YgdGhlIHdpbmRvdy4KKyAgICBQYWxldHRlVHlwZSB0eXBlOyAgICAgICAgIC8vVGhlIHBhbGV0dGUgdHlwZSB0byB1c2UuCisgICAgUkdCVmFsdWUqICAgcGFsZXR0ZTsgICAgICAvL0lmIHR5cGUgaXMgSU1BUV9QQUxFVFRFX1VTRVIsIHRoaXMgYXJyYXkgaXMgdGhlIHBhbGV0dGUgb2YgY29sb3JzIHRvIHVzZSB3aXRoIHRoZSB3aW5kb3cuCisgICAgaW50ICAgICAgICAgbnVtQ29sb3JzOyAgICAvL0lmIHR5cGUgaXMgSU1BUV9QQUxFVFRFX1VTRVIsIHRoaXMgZWxlbWVudCBpcyB0aGUgbnVtYmVyIG9mIGNvbG9ycyBpbiB0aGUgcGFsZXR0ZSBhcnJheS4KK30gQ29uc3RydWN0Uk9JT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgQ29udG91ckluZm9fc3RydWN0IHsKKyAgICBDb250b3VyVHlwZSB0eXBlOyAgICAgICAgIC8vVGhlIGNvbnRvdXIgdHlwZS4KKyAgICB1bnNpZ25lZCAgICBudW1Qb2ludHM7ICAgIC8vVGhlIG51bWJlciBvZiBwb2ludHMgdGhhdCBtYWtlIHVwIHRoZSBjb250b3VyLgorICAgIFBvaW50KiAgICAgIHBvaW50czsgICAgICAgLy9UaGUgcG9pbnRzIGRlc2NyaWJpbmcgdGhlIGNvbnRvdXIuCisgICAgUkdCVmFsdWUgICAgY29udG91ckNvbG9yOyAvL1RoZSBjb250b3VyIGNvbG9yLgorfSBDb250b3VySW5mbzsKKwordHlwZWRlZiB1bmlvbiBDb250b3VyVW5pb25fdW5pb24geworICAgIFBvaW50KiAgICAgICAgIHBvaW50OyAgICAgICAgICAgLy9Vc2UgdGhpcyBtZW1iZXIgd2hlbiB0aGUgY29udG91ciBpcyBvZiB0eXBlIElNQVFfUE9JTlQuCisgICAgTGluZSogICAgICAgICAgbGluZTsgICAgICAgICAgICAvL1VzZSB0aGlzIG1lbWJlciB3aGVuIHRoZSBjb250b3VyIGlzIG9mIHR5cGUgSU1BUV9MSU5FLgorICAgIFJlY3QqICAgICAgICAgIHJlY3Q7ICAgICAgICAgICAgLy9Vc2UgdGhpcyBtZW1iZXIgd2hlbiB0aGUgY29udG91ciBpcyBvZiB0eXBlIElNQVFfUkVDVC4KKyAgICBSZWN0KiAgICAgICAgICBvdmFsQm91bmRpbmdCb3g7IC8vVXNlIHRoaXMgbWVtYmVyIHdoZW4gdGhlIGNvbnRvdXIgaXMgb2YgdHlwZSBJTUFRX09WQUwuCisgICAgQ2xvc2VkQ29udG91ciogY2xvc2VkQ29udG91cjsgICAvL1VzZSB0aGlzIG1lbWJlciB3aGVuIHRoZSBjb250b3VyIGlzIG9mIHR5cGUgSU1BUV9DTE9TRURfQ09OVE9VUi4KKyAgICBPcGVuQ29udG91ciogICBvcGVuQ29udG91cjsgICAgIC8vVXNlIHRoaXMgbWVtYmVyIHdoZW4gdGhlIGNvbnRvdXIgaXMgb2YgdHlwZSBJTUFRX09QRU5fQ09OVE9VUi4KKyAgICBBbm51bHVzKiAgICAgICBhbm51bHVzOyAgICAgICAgIC8vVXNlIHRoaXMgbWVtYmVyIHdoZW4gdGhlIGNvbnRvdXIgaXMgb2YgdHlwZSBJTUFRX0FOTlVMVVMuCisgICAgUm90YXRlZFJlY3QqICAgcm90YXRlZFJlY3Q7ICAgICAvL1VzZSB0aGlzIG1lbWJlciB3aGVuIHRoZSBjb250b3VyIGlzIG9mIHR5cGUgSU1BUV9ST1RBVEVEX1JFQ1QuCit9IENvbnRvdXJVbmlvbjsKKwordHlwZWRlZiBzdHJ1Y3QgQ29udG91ckluZm8yX3N0cnVjdCB7CisgICAgQ29udG91clR5cGUgIHR5cGU7ICAgICAgLy9UaGUgY29udG91ciB0eXBlLgorICAgIFJHQlZhbHVlICAgICBjb2xvcjsgICAgIC8vVGhlIGNvbnRvdXIgY29sb3IuCisgICAgQ29udG91clVuaW9uIHN0cnVjdHVyZTsgLy9UaGUgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIGRlc2NyaWJlIHRoZSBjb250b3VyIGluIGNvb3JkaW5hdGUgc3BhY2UuCit9IENvbnRvdXJJbmZvMjsKKwordHlwZWRlZiBzdHJ1Y3QgQ29udG91clBvaW50X3N0cnVjdCB7CisgICAgZG91YmxlIHg7ICAgICAgICAgICAgIC8vVGhlIHgtY29vcmRpbmF0ZSB2YWx1ZSBpbiB0aGUgaW1hZ2UuCisgICAgZG91YmxlIHk7ICAgICAgICAgICAgIC8vVGhlIHktY29vcmRpbmF0ZSB2YWx1ZSBpbiB0aGUgaW1hZ2UuCisgICAgZG91YmxlIGN1cnZhdHVyZTsgICAgIC8vVGhlIGNoYW5nZSBpbiBzbG9wZSBhdCB0aGlzIGVkZ2UgcG9pbnQgb2YgdGhlIHNlZ21lbnQuCisgICAgZG91YmxlIHhEaXNwbGFjZW1lbnQ7IC8vVGhlIHggZGlzcGxhY2VtZW50IG9mIHRoZSBjdXJyZW50IGVkZ2UgcGl4ZWwgZnJvbSBhIGN1YmljIHNwbGluZSBmaXQgb2YgdGhlIGN1cnJlbnQgZWRnZSBzZWdtZW50LgorICAgIGRvdWJsZSB5RGlzcGxhY2VtZW50OyAvL1RoZSB5IGRpc3BsYWNlbWVudCBvZiB0aGUgY3VycmVudCBlZGdlIHBpeGVsIGZyb20gYSBjdWJpYyBzcGxpbmUgZml0IG9mIHRoZSBjdXJyZW50IGVkZ2Ugc2VnbWVudC4KK30gQ29udG91clBvaW50OworCit0eXBlZGVmIHN0cnVjdCBDb29yZGluYXRlVHJhbnNmb3JtX3N0cnVjdCB7CisgICAgUG9pbnQgaW5pdGlhbE9yaWdpbjsgLy9UaGUgb3JpZ2luIG9mIHRoZSBpbml0aWFsIGNvb3JkaW5hdGUgc3lzdGVtLgorICAgIGZsb2F0IGluaXRpYWxBbmdsZTsgIC8vVGhlIGFuZ2xlLCBpbiBkZWdyZWVzLCBvZiB0aGUgeC1heGlzIG9mIHRoZSBpbml0aWFsIGNvb3JkaW5hdGUgc3lzdGVtIHJlbGF0aXZlIHRvIHRoZSBpbWFnZSB4LWF4aXMuCisgICAgUG9pbnQgZmluYWxPcmlnaW47ICAgLy9UaGUgb3JpZ2luIG9mIHRoZSBmaW5hbCBjb29yZGluYXRlIHN5c3RlbS4KKyAgICBmbG9hdCBmaW5hbEFuZ2xlOyAgICAvL1RoZSBhbmdsZSwgaW4gZGVncmVlcywgb2YgdGhlIHgtYXhpcyBvZiB0aGUgZmluYWwgY29vcmRpbmF0ZSBzeXN0ZW0gcmVsYXRpdmUgdG8gdGhlIGltYWdlIHgtYXhpcy4KK30gQ29vcmRpbmF0ZVRyYW5zZm9ybTsKKwordHlwZWRlZiBzdHJ1Y3QgQ29vcmRpbmF0ZVRyYW5zZm9ybTJfc3RydWN0IHsKKyAgICBDb29yZGluYXRlU3lzdGVtIHJlZmVyZW5jZVN5c3RlbTsgICAvL0RlZmluZXMgdGhlIGNvb3JkaW5hdGUgc3lzdGVtIGZvciBpbnB1dCBjb29yZGluYXRlcy4KKyAgICBDb29yZGluYXRlU3lzdGVtIG1lYXN1cmVtZW50U3lzdGVtOyAvL0RlZmluZXMgdGhlIGNvb3JkaW5hdGUgc3lzdGVtIGluIHdoaWNoIHRoZSBmdW5jdGlvbiBzaG91bGQgcGVyZm9ybSBtZWFzdXJlbWVudHMuCit9IENvb3JkaW5hdGVUcmFuc2Zvcm0yOworCit0eXBlZGVmIHN0cnVjdCBDYW5ueU9wdGlvbnNfc3RydWN0IHsKKyAgICBmbG9hdCBzaWdtYTsgICAgICAgICAgLy9UaGUgc2lnbWEgb2YgdGhlIEdhdXNzaWFuIHNtb290aGluZyBmaWx0ZXIgdGhhdCB0aGUgZnVuY3Rpb24gYXBwbGllcyB0byB0aGUgaW1hZ2UgYmVmb3JlIGVkZ2UgZGV0ZWN0aW9uLgorICAgIGZsb2F0IHVwcGVyVGhyZXNob2xkOyAvL1RoZSB1cHBlciBmcmFjdGlvbiBvZiBwaXhlbCB2YWx1ZXMgaW4gdGhlIGltYWdlIGZyb20gd2hpY2ggdGhlIGZ1bmN0aW9uIGNob29zZXMgYSBzZWVkIG9yIHN0YXJ0aW5nIHBvaW50IG9mIGFuIGVkZ2Ugc2VnbWVudC4KKyAgICBmbG9hdCBsb3dlclRocmVzaG9sZDsgLy9UaGUgZnVuY3Rpb24gbXVsdGlwbGllcyB0aGlzIHZhbHVlIGJ5IHVwcGVyVGhyZXNob2xkIHRvIGRldGVybWluZSB0aGUgbG93ZXIgdGhyZXNob2xkIGZvciBhbGwgdGhlIHBpeGVscyBpbiBhbiBlZGdlIHNlZ21lbnQuCisgICAgaW50ICAgd2luZG93U2l6ZTsgICAgIC8vVGhlIHdpbmRvdyBzaXplIG9mIHRoZSBHYXVzc2lhbiBmaWx0ZXIgdGhhdCB0aGUgZnVuY3Rpb24gYXBwbGllcyB0byB0aGUgaW1hZ2UuCit9IENhbm55T3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgUmFuZ2Vfc3RydWN0IHsKKyAgICBpbnQgbWluVmFsdWU7IC8vVGhlIG1pbmltdW0gdmFsdWUgb2YgdGhlIHJhbmdlLgorICAgIGludCBtYXhWYWx1ZTsgLy9UaGUgbWF4aW11bSB2YWx1ZSBvZiB0aGUgcmFuZ2UuCit9IFJhbmdlOworCit0eXBlZGVmIHN0cnVjdCBVc2VyUG9pbnRTeW1ib2xfc3RydWN0IHsKKyAgICBpbnQgIGNvbHM7ICAgLy9OdW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgc3ltYm9sLgorICAgIGludCAgcm93czsgICAvL051bWJlciBvZiByb3dzIGluIHRoZSBzeW1ib2wuCisgICAgaW50KiBwaXhlbHM7IC8vVGhlIHBpeGVscyBvZiB0aGUgc3ltYm9sLgorfSBVc2VyUG9pbnRTeW1ib2w7CisKK3R5cGVkZWYgc3RydWN0IFZpZXczRE9wdGlvbnNfc3RydWN0IHsKKyAgICBpbnQgICAgICAgICBzaXplUmVkdWN0aW9uOyAvL0EgZGl2aXNvciB0aGUgZnVuY3Rpb24gdXNlcyB3aGVuIGRldGVybWluaW5nIHRoZSBmaW5hbCBoZWlnaHQgYW5kIHdpZHRoIG9mIHRoZSAzRCBpbWFnZS4KKyAgICBpbnQgICAgICAgICBtYXhIZWlnaHQ7ICAgICAvL0RlZmluZXMgdGhlIG1heGltdW0gaGVpZ2h0IG9mIGEgcGl4ZWwgZnJvbSB0aGUgaW1hZ2Ugc291cmNlIGRyYXduIGluIDNELgorICAgIERpcmVjdGlvbjNEIGRpcmVjdGlvbjsgICAgIC8vRGVmaW5lcyB0aGUgM0Qgb3JpZW50YXRpb24uCisgICAgZmxvYXQgICAgICAgYWxwaGE7ICAgICAgICAgLy9EZXRlcm1pbmVzIHRoZSBhbmdsZSBiZXR3ZWVuIHRoZSBob3Jpem9udGFsIGFuZCB0aGUgYmFzZWxpbmUuCisgICAgZmxvYXQgICAgICAgYmV0YTsgICAgICAgICAgLy9EZXRlcm1pbmVzIHRoZSBhbmdsZSBiZXR3ZWVuIHRoZSBob3Jpem9udGFsIGFuZCB0aGUgc2Vjb25kIGJhc2VsaW5lLgorICAgIGludCAgICAgICAgIGJvcmRlcjsgICAgICAgIC8vRGVmaW5lcyB0aGUgYm9yZGVyIHNpemUuCisgICAgaW50ICAgICAgICAgYmFja2dyb3VuZDsgICAgLy9EZWZpbmVzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yLgorICAgIFBsYW5lM0QgICAgIHBsYW5lOyAgICAgICAgIC8vSW5kaWNhdGVzIHRoZSB2aWV3IGEgZnVuY3Rpb24gdXNlcyB0byBzaG93IGNvbXBsZXggaW1hZ2VzLgorfSBWaWV3M0RPcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBNYXRjaFBhdHRlcm5PcHRpb25zX3N0cnVjdCB7CisgICAgTWF0Y2hpbmdNb2RlICAgICAgICBtb2RlOyAgICAgICAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgbWV0aG9kIHRvIHVzZSB3aGVuIGxvb2tpbmcgZm9yIHRoZSBwYXR0ZXJuIGluIHRoZSBpbWFnZS4KKyAgICBpbnQgICAgICAgICAgICAgICAgIG1pbkNvbnRyYXN0OyAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBtaW5pbXVtIGNvbnRyYXN0IGV4cGVjdGVkIGluIHRoZSBpbWFnZS4KKyAgICBpbnQgICAgICAgICAgICAgICAgIHN1YnBpeGVsQWNjdXJhY3k7ICAgIC8vU2V0IHRoaXMgZWxlbWVudCB0byBUUlVFIHRvIHJldHVybiBhcmVhcyBpbiB0aGUgaW1hZ2UgdGhhdCBtYXRjaCB0aGUgcGF0dGVybiBhcmVhIHdpdGggc3VicGl4ZWwgYWNjdXJhY3kuCisgICAgUm90YXRpb25BbmdsZVJhbmdlKiBhbmdsZVJhbmdlczsgICAgICAgICAvL0FuIGFycmF5IG9mIGFuZ2xlIHJhbmdlcywgaW4gZGVncmVlcywgd2hlcmUgZWFjaCByYW5nZSBzcGVjaWZpZXMgaG93IG11Y2ggeW91IGV4cGVjdCB0aGUgcGF0dGVybiB0byBiZSByb3RhdGVkIGluIHRoZSBpbWFnZS4KKyAgICBpbnQgICAgICAgICAgICAgICAgIG51bVJhbmdlczsgICAgICAgICAgIC8vTnVtYmVyIG9mIGFuZ2xlIHJhbmdlcyBpbiB0aGUgYW5nbGVSYW5nZXMgYXJyYXkuCisgICAgaW50ICAgICAgICAgICAgICAgICBudW1NYXRjaGVzUmVxdWVzdGVkOyAvL051bWJlciBvZiB2YWxpZCBtYXRjaGVzIGV4cGVjdGVkLgorICAgIGludCAgICAgICAgICAgICAgICAgbWF0Y2hGYWN0b3I7ICAgICAgICAgLy9Db250cm9scyB0aGUgbnVtYmVyIG9mIHBvdGVudGlhbCBtYXRjaGVzIHRoYXQgdGhlIGZ1bmN0aW9uIGV4YW1pbmVzLgorICAgIGZsb2F0ICAgICAgICAgICAgICAgbWluTWF0Y2hTY29yZTsgICAgICAgLy9UaGUgbWluaW11bSBzY29yZSBhIG1hdGNoIGNhbiBoYXZlIGZvciB0aGUgZnVuY3Rpb24gdG8gY29uc2lkZXIgdGhlIG1hdGNoIHZhbGlkLgorfSBNYXRjaFBhdHRlcm5PcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBUSUZGRmlsZU9wdGlvbnNfc3RydWN0IHsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHJvd3NQZXJTdHJpcDsgICAgLy9JbmRpY2F0ZXMgdGhlIG51bWJlciBvZiByb3dzIHRoYXQgdGhlIGZ1bmN0aW9uIHdyaXRlcyBwZXIgc3RyaXAuCisgICAgUGhvdG9tZXRyaWNNb2RlICAgICBwaG90b0ludGVycDsgICAgIC8vRGVzaWduYXRlcyB3aGljaCBwaG90b21ldHJpYyBpbnRlcnByZXRhdGlvbiB0byB1c2UuCisgICAgVElGRkNvbXByZXNzaW9uVHlwZSBjb21wcmVzc2lvblR5cGU7IC8vSW5kaWNhdGVzIHRoZSB0eXBlIG9mIGNvbXByZXNzaW9uIHRvIHVzZSBvbiB0aGUgVElGRiBmaWxlLgorfSBUSUZGRmlsZU9wdGlvbnM7CisKK3R5cGVkZWYgdW5pb24gQ29sb3JfdW5pb24geworICAgIFJHQlZhbHVlIHJnYjsgICAgICAvL1RoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gZGVzY3JpYmUgYSBjb2xvciBpbiB0aGUgUkdCIChSZWQsIEdyZWVuLCBhbmQgQmx1ZSkgY29sb3Igc3BhY2UuCisgICAgSFNMVmFsdWUgaHNsOyAgICAgIC8vVGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBkZXNjcmliZSBhIGNvbG9yIGluIHRoZSBIU0wgKEh1ZSwgU2F0dXJhdGlvbiwgYW5kIEx1bWluYW5jZSkgY29sb3Igc3BhY2UuCisgICAgSFNWVmFsdWUgaHN2OyAgICAgIC8vVGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBkZXNjcmliZSBhIGNvbG9yIGluIHRoZSBIU0kgKEh1ZSwgU2F0dXJhdGlvbiwgYW5kIFZhbHVlKSBjb2xvciBzcGFjZS4KKyAgICBIU0lWYWx1ZSBoc2k7ICAgICAgLy9UaGUgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGRlc2NyaWJlIGEgY29sb3IgaW4gdGhlIEhTSSAoSHVlLCBTYXR1cmF0aW9uLCBhbmQgSW50ZW5zaXR5KSBjb2xvciBzcGFjZS4KKyAgICBpbnQgICAgICByYXdWYWx1ZTsgLy9UaGUgaW50ZWdlciB2YWx1ZSBmb3IgdGhlIGRhdGEgaW4gdGhlIGNvbG9yIHVuaW9uLgorfSBDb2xvcjsKKwordHlwZWRlZiB1bmlvbiBQaXhlbFZhbHVlX3VuaW9uIHsKKyAgICBmbG9hdCAgICAgICBncmF5c2NhbGU7IC8vQSBncmF5c2NhbGUgcGl4ZWwgdmFsdWUuCisgICAgUkdCVmFsdWUgICAgcmdiOyAgICAgICAvL0EgUkdCIHBpeGVsIHZhbHVlLgorICAgIEhTTFZhbHVlICAgIGhzbDsgICAgICAgLy9BIEhTTCBwaXhlbCB2YWx1ZS4KKyAgICBDb21wbGV4ICAgICBjb21wbGV4OyAgIC8vQSBjb21wbGV4IHBpeGVsIHZhbHVlLgorICAgIFJHQlU2NFZhbHVlIHJnYnU2NDsgICAgLy9BbiB1bnNpZ25lZCA2NC1iaXQgUkdCIHBpeGVsIHZhbHVlLgorfSBQaXhlbFZhbHVlOworCit0eXBlZGVmIHN0cnVjdCBPcGVuQ29udG91cl9zdHJ1Y3QgeworICAgIFBvaW50KiBwb2ludHM7ICAgIC8vVGhlIHBvaW50cyB0aGF0IG1ha2UgdXAgdGhlIG9wZW4gY29udG91ci4KKyAgICBpbnQgICAgbnVtUG9pbnRzOyAvL1RoZSBudW1iZXIgb2YgcG9pbnRzIGluIHRoZSBhcnJheS4KK30gT3BlbkNvbnRvdXI7CisKK3R5cGVkZWYgc3RydWN0IE92ZXJsYXlUZXh0T3B0aW9uc19zdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqICAgICAgICAgICBmb250TmFtZTsgICAgICAgICAgICAgICAgLy9UaGUgbmFtZSBvZiB0aGUgZm9udCB0byB1c2UuCisgICAgaW50ICAgICAgICAgICAgICAgICAgIGZvbnRTaXplOyAgICAgICAgICAgICAgICAvL1RoZSBzaXplIG9mIHRoZSBmb250LgorICAgIGludCAgICAgICAgICAgICAgICAgICBib2xkOyAgICAgICAgICAgICAgICAgICAgLy9TZXQgdGhpcyBlbGVtZW50IHRvIFRSVUUgdG8gYm9sZCB0aGUgdGV4dC4KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgaXRhbGljOyAgICAgICAgICAgICAgICAgIC8vU2V0IHRoaXMgZWxlbWVudCB0byBUUlVFIHRvIGl0YWxpY2l6ZSB0aGUgdGV4dC4KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgdW5kZXJsaW5lOyAgICAgICAgICAgICAgIC8vU2V0IHRoaXMgZWxlbWVudCB0byBUUlVFIHRvIHVuZGVybGluZSB0aGUgdGV4dC4KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgc3RyaWtlb3V0OyAgICAgICAgICAgICAgIC8vU2V0IHRoaXMgZWxlbWVudCB0byBUUlVFIHRvIHN0cmlrZW91dCB0aGUgdGV4dC4KKyAgICBUZXh0QWxpZ25tZW50ICAgICAgICAgaG9yaXpvbnRhbFRleHRBbGlnbm1lbnQ7IC8vU2V0cyB0aGUgYWxpZ25tZW50IG9mIHRoZSB0ZXh0LgorICAgIFZlcnRpY2FsVGV4dEFsaWdubWVudCB2ZXJ0aWNhbFRleHRBbGlnbm1lbnQ7ICAgLy9TZXRzIHRoZSB2ZXJ0aWNhbCBhbGlnbm1lbnQgZm9yIHRoZSB0ZXh0LgorICAgIFJHQlZhbHVlICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I7ICAgICAgICAgLy9TZXRzIHRoZSBjb2xvciBmb3IgdGhlIHRleHQgYmFja2dyb3VuZCBwaXhlbHMuCisgICAgZG91YmxlICAgICAgICAgICAgICAgIGFuZ2xlOyAgICAgICAgICAgICAgICAgICAvL1RoZSBjb3VudGVyY2xvY2t3aXNlIGFuZ2xlLCBpbiBkZWdyZWVzLCBvZiB0aGUgdGV4dCByZWxhdGl2ZSB0byB0aGUgeC1heGlzLgorfSBPdmVybGF5VGV4dE9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IFBhcnRpY2xlRmlsdGVyQ3JpdGVyaWFfc3RydWN0IHsKKyAgICBNZWFzdXJlbWVudFZhbHVlIHBhcmFtZXRlcjsgLy9UaGUgbW9ycGhvbG9naWNhbCBtZWFzdXJlbWVudCB0aGF0IHRoZSBmdW5jdGlvbiB1c2VzIGZvciBmaWx0ZXJpbmcuCisgICAgZmxvYXQgICAgICAgICAgICBsb3dlcjsgICAgIC8vVGhlIGxvd2VyIGJvdW5kIG9mIHRoZSBjcml0ZXJpYSByYW5nZS4KKyAgICBmbG9hdCAgICAgICAgICAgIHVwcGVyOyAgICAgLy9UaGUgdXBwZXIgYm91bmQgb2YgdGhlIGNyaXRlcmlhIHJhbmdlLgorICAgIGludCAgICAgICAgICAgICAgZXhjbHVkZTsgICAvL1NldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSB0byBpbmRpY2F0ZSB0aGF0IGEgbWF0Y2ggb2NjdXJzIHdoZW4gdGhlIHZhbHVlIGlzIG91dHNpZGUgdGhlIGNyaXRlcmlhIHJhbmdlLgorfSBQYXJ0aWNsZUZpbHRlckNyaXRlcmlhOworCit0eXBlZGVmIHN0cnVjdCBQYXJ0aWNsZVJlcG9ydF9zdHJ1Y3QgeworICAgIGludCAgIGFyZWE7ICAgICAgICAgICAgIC8vVGhlIG51bWJlciBvZiBwaXhlbHMgaW4gdGhlIHBhcnRpY2xlLgorICAgIGZsb2F0IGNhbGlicmF0ZWRBcmVhOyAgIC8vVGhlIHNpemUgb2YgdGhlIHBhcnRpY2xlLCBjYWxpYnJhdGVkIHRvIHRoZSBjYWxpYnJhdGlvbiBpbmZvcm1hdGlvbiBvZiB0aGUgaW1hZ2UuCisgICAgZmxvYXQgcGVyaW1ldGVyOyAgICAgICAgLy9UaGUgbGVuZ3RoIG9mIHRoZSBwZXJpbWV0ZXIsIGNhbGlicmF0ZWQgdG8gdGhlIGNhbGlicmF0aW9uIGluZm9ybWF0aW9uIG9mIHRoZSBpbWFnZS4KKyAgICBpbnQgICBudW1Ib2xlczsgICAgICAgICAvL1RoZSBudW1iZXIgb2YgaG9sZXMgaW4gdGhlIHBhcnRpY2xlLgorICAgIGludCAgIGFyZWFPZkhvbGVzOyAgICAgIC8vVGhlIHRvdGFsIHN1cmZhY2UgYXJlYSwgaW4gcGl4ZWxzLCBvZiBhbGwgdGhlIGhvbGVzIGluIGEgcGFydGljbGUuCisgICAgZmxvYXQgcGVyaW1ldGVyT2ZIb2xlczsgLy9UaGUgbGVuZ3RoIG9mIHRoZSBwZXJpbWV0ZXIgb2YgYWxsIHRoZSBob2xlcyBpbiB0aGUgcGFydGljbGUgY2FsaWJyYXRlZCB0byB0aGUgY2FsaWJyYXRpb24gaW5mb3JtYXRpb24gb2YgdGhlIGltYWdlLgorICAgIFJlY3QgIGJvdW5kaW5nQm94OyAgICAgIC8vVGhlIHNtYWxsZXN0IHJlY3RhbmdsZSB0aGF0IGVuY2xvc2VzIHRoZSBwYXJ0aWNsZS4KKyAgICBmbG9hdCBzaWdtYVg7ICAgICAgICAgICAvL1RoZSBzdW0gb2YgdGhlIHBhcnRpY2xlIHBpeGVscyBvbiB0aGUgeC1heGlzLgorICAgIGZsb2F0IHNpZ21hWTsgICAgICAgICAgIC8vVGhlIHN1bSBvZiB0aGUgcGFydGljbGUgcGl4ZWxzIG9uIHRoZSB5LWF4aXMuCisgICAgZmxvYXQgc2lnbWFYWDsgICAgICAgICAgLy9UaGUgc3VtIG9mIHRoZSBwYXJ0aWNsZSBwaXhlbHMgb24gdGhlIHgtYXhpcywgc3F1YXJlZC4KKyAgICBmbG9hdCBzaWdtYVlZOyAgICAgICAgICAvL1RoZSBzdW0gb2YgdGhlIHBhcnRpY2xlIHBpeGVscyBvbiB0aGUgeS1heGlzLCBzcXVhcmVkLgorICAgIGZsb2F0IHNpZ21hWFk7ICAgICAgICAgIC8vVGhlIHN1bSBvZiB0aGUgcGFydGljbGUgcGl4ZWxzIG9uIHRoZSB4LWF4aXMgYW5kIHktYXhpcy4KKyAgICBpbnQgICBsb25nZXN0TGVuZ3RoOyAgICAvL1RoZSBsZW5ndGggb2YgdGhlIGxvbmdlc3QgaG9yaXpvbnRhbCBsaW5lIHNlZ21lbnQuCisgICAgUG9pbnQgbG9uZ2VzdFBvaW50OyAgICAgLy9UaGUgbG9jYXRpb24gb2YgdGhlIGxlZnRtb3N0IHBpeGVsIG9mIHRoZSBsb25nZXN0IHNlZ21lbnQgaW4gdGhlIHBhcnRpY2xlLgorICAgIGludCAgIHByb2plY3Rpb25YOyAgICAgIC8vVGhlIGxlbmd0aCBvZiB0aGUgcGFydGljbGUgd2hlbiBwcm9qZWN0ZWQgb250byB0aGUgeC1heGlzLgorICAgIGludCAgIHByb2plY3Rpb25ZOyAgICAgIC8vVGhlIGxlbmd0aCBvZiB0aGUgcGFydGljbGUgd2hlbiBwcm9qZWN0ZWQgb250byB0aGUgeS1heGlzLgorICAgIGludCAgIGNvbm5lY3Q4OyAgICAgICAgIC8vVGhpcyBlbGVtZW50IGlzIFRSVUUgaWYgdGhlIGZ1bmN0aW9uIHVzZWQgY29ubmVjdGl2aXR5LTggdG8gZGV0ZXJtaW5lIGlmIHBhcnRpY2xlcyBhcmUgdG91Y2hpbmcuCit9IFBhcnRpY2xlUmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBQYXR0ZXJuTWF0Y2hfc3RydWN0IHsKKyAgICBQb2ludEZsb2F0IHBvc2l0aW9uOyAgLy9UaGUgbG9jYXRpb24gb2YgdGhlIGNlbnRlciBvZiB0aGUgbWF0Y2guCisgICAgZmxvYXQgICAgICByb3RhdGlvbjsgIC8vVGhlIHJvdGF0aW9uIG9mIHRoZSBtYXRjaCByZWxhdGl2ZSB0byB0aGUgdGVtcGxhdGUgaW1hZ2UsIGluIGRlZ3JlZXMuCisgICAgZmxvYXQgICAgICBzY2FsZTsgICAgIC8vVGhlIHNpemUgb2YgdGhlIG1hdGNoIHJlbGF0aXZlIHRvIHRoZSBzaXplIG9mIHRoZSB0ZW1wbGF0ZSBpbWFnZSwgZXhwcmVzc2VkIGFzIGEgcGVyY2VudGFnZS4KKyAgICBmbG9hdCAgICAgIHNjb3JlOyAgICAgLy9UaGUgYWNjdXJhY3kgb2YgdGhlIG1hdGNoLgorICAgIFBvaW50RmxvYXQgY29ybmVyWzRdOyAvL0FuIGFycmF5IG9mIGZvdXIgcG9pbnRzIGRlc2NyaWJpbmcgdGhlIHJlY3RhbmdsZSBzdXJyb3VuZGluZyB0aGUgdGVtcGxhdGUgaW1hZ2UuCit9IFBhdHRlcm5NYXRjaDsKKwordHlwZWRlZiBzdHJ1Y3QgUXVhbnRpZnlEYXRhX3N0cnVjdCB7CisgICAgZmxvYXQgbWVhbjsgICAgICAgICAgIC8vVGhlIG1lYW4gdmFsdWUgb2YgdGhlIHBpeGVsIHZhbHVlcy4KKyAgICBmbG9hdCBzdGREZXY7ICAgICAgICAgLy9UaGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBwaXhlbCB2YWx1ZXMuCisgICAgZmxvYXQgbWluOyAgICAgICAgICAgIC8vVGhlIHNtYWxsZXN0IHBpeGVsIHZhbHVlLgorICAgIGZsb2F0IG1heDsgICAgICAgICAgICAvL1RoZSBsYXJnZXN0IHBpeGVsIHZhbHVlLgorICAgIGZsb2F0IGNhbGlicmF0ZWRBcmVhOyAvL1RoZSBhcmVhLCBjYWxpYnJhdGVkIHRvIHRoZSBjYWxpYnJhdGlvbiBpbmZvcm1hdGlvbiBvZiB0aGUgaW1hZ2UuCisgICAgaW50ICAgcGl4ZWxBcmVhOyAgICAgIC8vVGhlIGFyZWEsIGluIG51bWJlciBvZiBwaXhlbHMuCisgICAgZmxvYXQgcmVsYXRpdmVTaXplOyAgIC8vVGhlIHByb3BvcnRpb24sIGV4cHJlc3NlZCBhcyBhIHBlcmNlbnRhZ2UsIG9mIHRoZSBhc3NvY2lhdGVkIHJlZ2lvbiByZWxhdGl2ZSB0byB0aGUgd2hvbGUgaW1hZ2UuCit9IFF1YW50aWZ5RGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QgUXVhbnRpZnlSZXBvcnRfc3RydWN0IHsKKyAgICBRdWFudGlmeURhdGEgIGdsb2JhbDsgICAgICAvL1N0YXRpc3RpY2FsIGRhdGEgb2YgdGhlIHdob2xlIGltYWdlLgorICAgIFF1YW50aWZ5RGF0YSogcmVnaW9uczsgICAgIC8vQW4gYXJyYXkgb2YgUXVhbnRpZnlEYXRhIHN0cnVjdHVyZXMgY29udGFpbmluZyBzdGF0aXN0aWNhbCBkYXRhIG9mIGVhY2ggcmVnaW9uIG9mIHRoZSBpbWFnZS4KKyAgICBpbnQgICAgICAgICAgIHJlZ2lvbkNvdW50OyAvL1RoZSBudW1iZXIgb2YgcmVnaW9ucy4KK30gUXVhbnRpZnlSZXBvcnQ7CisKK3R5cGVkZWYgc3RydWN0IFJha2VPcHRpb25zX3N0cnVjdCB7CisgICAgaW50ICAgICAgICAgICAgICAgICB0aHJlc2hvbGQ7ICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIHRocmVzaG9sZCB2YWx1ZSBmb3IgdGhlIGNvbnRyYXN0IG9mIHRoZSBlZGdlLgorICAgIGludCAgICAgICAgICAgICAgICAgd2lkdGg7ICAgICAgICAgICAgIC8vVGhlIG51bWJlciBvZiBwaXhlbHMgdGhhdCB0aGUgZnVuY3Rpb24gYXZlcmFnZXMgdG8gZmluZCB0aGUgY29udHJhc3QgYXQgZWl0aGVyIHNpZGUgb2YgdGhlIGVkZ2UuCisgICAgaW50ICAgICAgICAgICAgICAgICBzdGVlcG5lc3M7ICAgICAgICAgLy9UaGUgc3BhbiwgaW4gcGl4ZWxzLCBvZiB0aGUgc2xvcGUgb2YgdGhlIGVkZ2UgcHJvamVjdGVkIGFsb25nIHRoZSBwYXRoIHNwZWNpZmllZCBieSB0aGUgaW5wdXQgcG9pbnRzLgorICAgIGludCAgICAgICAgICAgICAgICAgc3Vic2FtcGxpbmdSYXRpbzsgIC8vU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgcGl4ZWxzIHRoYXQgc2VwYXJhdGUgdHdvIGNvbnNlY3V0aXZlIHNlYXJjaCBsaW5lcy4KKyAgICBJbnRlcnBvbGF0aW9uTWV0aG9kIHN1YnBpeGVsVHlwZTsgICAgICAvL1RoZSBtZXRob2QgZm9yIGludGVycG9sYXRpbmcuCisgICAgaW50ICAgICAgICAgICAgICAgICBzdWJwaXhlbERpdmlzaW9uczsgLy9UaGUgbnVtYmVyIG9mIHNhbXBsZXMgdGhlIGZ1bmN0aW9uIG9idGFpbnMgZnJvbSBhIHBpeGVsLgorfSBSYWtlT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgUmFrZVJlcG9ydF9zdHJ1Y3QgeworICAgIExpbmVGbG9hdCogICAgICAgICAgcmFrZUxpbmVzOyAgICAgICAgIC8vVGhlIGNvb3JkaW5hdGUgbG9jYXRpb24gb2YgZWFjaCBvZiB0aGUgcmFrZSBsaW5lcyB1c2VkIGJ5IHRoZSBmdW5jdGlvbi4KKyAgICBpbnQgICAgICAgICAgICAgICAgIG51bVJha2VMaW5lczsgICAgICAvL1RoZSBudW1iZXIgb2YgbGluZXMgaW4gdGhlIHJha2VMaW5lcyBhcnJheS4KKyAgICBQb2ludEZsb2F0KiAgICAgICAgIGZpcnN0RWRnZXM7ICAgICAgICAvL1RoZSBjb29yZGluYXRlIGxvY2F0aW9uIG9mIGFsbCBlZGdlcyBkZXRlY3RlZCBhcyBmaXJzdCBlZGdlcy4KKyAgICB1bnNpZ25lZCBpbnQgICAgICAgIG51bUZpcnN0RWRnZXM7ICAgICAvL1RoZSBudW1iZXIgb2YgcG9pbnRzIGluIHRoZSBmaXJzdEVkZ2VzIGFycmF5LgorICAgIFBvaW50RmxvYXQqICAgICAgICAgbGFzdEVkZ2VzOyAgICAgICAgIC8vVGhlIGNvb3JkaW5hdGUgbG9jYXRpb24gb2YgYWxsIGVkZ2VzIGRldGVjdGVkIGFzIGxhc3QgZWRnZXMuCisgICAgdW5zaWduZWQgaW50ICAgICAgICBudW1MYXN0RWRnZXM7ICAgICAgLy9UaGUgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgbGFzdEVkZ2VzIGFycmF5LgorICAgIEVkZ2VMb2NhdGlvblJlcG9ydCogYWxsRWRnZXM7ICAgICAgICAgIC8vQW4gYXJyYXkgb2YgcmVwb3J0cyBkZXNjcmliaW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUgZWRnZXMgbG9jYXRlZCBieSBlYWNoIHJha2UgbGluZS4KKyAgICBpbnQqICAgICAgICAgICAgICAgIGxpbmVzV2l0aEVkZ2VzOyAgICAvL0FuIGFycmF5IG9mIGluZGljZXMgaW50byB0aGUgcmFrZUxpbmVzIGFycmF5IGluZGljYXRpbmcgdGhlIHJha2UgbGluZXMgb24gd2hpY2ggdGhlIGZ1bmN0aW9uIGRldGVjdGVkIGF0IGxlYXN0IG9uZSBlZGdlLgorICAgIGludCAgICAgICAgICAgICAgICAgbnVtTGluZXNXaXRoRWRnZXM7IC8vVGhlIG51bWJlciBvZiByYWtlIGxpbmVzIGFsb25nIHdoaWNoIHRoZSBmdW5jdGlvbiBkZXRlY3RlZCBlZGdlcy4KK30gUmFrZVJlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgVHJhbnNmb3JtUmVwb3J0X3N0cnVjdCB7CisgICAgUG9pbnRGbG9hdCogcG9pbnRzOyAgICAgIC8vQW4gYXJyYXkgb2YgdHJhbnNmb3JtZWQgY29vcmRpbmF0ZXMuCisgICAgaW50KiAgICAgICAgdmFsaWRQb2ludHM7IC8vQW4gYXJyYXkgb2YgdmFsdWVzIHRoYXQgZGVzY3JpYmUgdGhlIHZhbGlkaXR5IG9mIGVhY2ggb2YgdGhlIGNvb3JkaW5hdGVzIGFjY29yZGluZyB0byB0aGUgcmVnaW9uIG9mIGludGVyZXN0IHlvdSBjYWxpYnJhdGVkIHVzaW5nIGVpdGhlciBpbWFxTGVhcm5DYWxpYnJhdGlvbkdyaWQoKSBvciBpbWFxTGVhcm5DYWxpYnJhdGlvblBvaW50cygpLgorICAgIGludCAgICAgICAgIG51bVBvaW50czsgICAvL1RoZSBsZW5ndGggb2YgYm90aCB0aGUgcG9pbnRzIGFycmF5IGFuZCB0aGUgdmFsaWRQb2ludHMgYXJyYXkuCit9IFRyYW5zZm9ybVJlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgU2hhcGVSZXBvcnRfc3RydWN0IHsKKyAgICBSZWN0ICAgY29vcmRpbmF0ZXM7IC8vVGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBvZiB0aGUgb2JqZWN0LgorICAgIFBvaW50ICBjZW50cm9pZDsgICAgLy9UaGUgY29vcmRpbmF0ZSBsb2NhdGlvbiBvZiB0aGUgY2VudHJvaWQgb2YgdGhlIG9iamVjdC4KKyAgICBpbnQgICAgc2l6ZTsgICAgICAgIC8vVGhlIHNpemUsIGluIHBpeGVscywgb2YgdGhlIG9iamVjdC4KKyAgICBkb3VibGUgc2NvcmU7ICAgICAgIC8vQSB2YWx1ZSByYW5naW5nIGJldHdlZW4gMSBhbmQgMSwwMDAgdGhhdCBzcGVjaWZpZXMgaG93IHNpbWlsYXIgdGhlIG9iamVjdCBpbiB0aGUgaW1hZ2UgaXMgdG8gdGhlIHRlbXBsYXRlLgorfSBTaGFwZVJlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgTWV0ZXJBcmNfc3RydWN0IHsKKyAgICBQb2ludEZsb2F0ICBuZWVkbGVCYXNlOyAgICAgICAgICAvL1RoZSBjb29yZGluYXRlIGxvY2F0aW9uIG9mIHRoZSBiYXNlIG9mIHRoZSBtZXRlciBuZWVkbGUuCisgICAgUG9pbnRGbG9hdCogYXJjQ29vcmRQb2ludHM7ICAgICAgLy9BbiBhcnJheSBvZiBwb2ludHMgZGVzY3JpYmluZyB0aGUgY29vcmRpbmF0ZSBsb2NhdGlvbiBvZiB0aGUgbWV0ZXIgYXJjLgorICAgIGludCAgICAgICAgIG51bU9mQXJjQ29vcmRQb2ludHM7IC8vVGhlIG51bWJlciBvZiBwb2ludHMgaW4gdGhlIGFyY0Nvb3JkUG9pbnRzIGFycmF5LgorICAgIGludCAgICAgICAgIG5lZWRsZUNvbG9yOyAgICAgICAgIC8vVGhpcyBlbGVtZW50IGlzIFRSVUUgd2hlbiB0aGUgbWV0ZXIgaGFzIGEgbGlnaHQtY29sb3JlZCBuZWVkbGUgb24gYSBkYXJrIGJhY2tncm91bmQuCit9IE1ldGVyQXJjOworCit0eXBlZGVmIHN0cnVjdCBUaHJlc2hvbGREYXRhX3N0cnVjdCB7CisgICAgZmxvYXQgcmFuZ2VNaW47ICAgIC8vVGhlIGxvd2VyIGJvdW5kYXJ5IG9mIHRoZSByYW5nZSB0byBrZWVwLgorICAgIGZsb2F0IHJhbmdlTWF4OyAgICAvL1RoZSB1cHBlciBib3VuZGFyeSBvZiB0aGUgcmFuZ2UgdG8ga2VlcC4KKyAgICBmbG9hdCBuZXdWYWx1ZTsgICAgLy9JZiB1c2VOZXdWYWx1ZSBpcyBUUlVFLCBuZXdWYWx1ZSBpcyB0aGUgcmVwbGFjZW1lbnQgdmFsdWUgZm9yIHBpeGVscyB3aXRoaW4gdGhlIHJhbmdlLgorICAgIGludCAgIHVzZU5ld1ZhbHVlOyAvL0lmIFRSVUUsIHRoZSBmdW5jdGlvbiBzZXRzIHBpeGVsIHZhbHVlcyB3aXRoaW4gW3JhbmdlTWluLCByYW5nZU1heF0gdG8gdGhlIHZhbHVlIHNwZWNpZmllZCBpbiBuZXdWYWx1ZS4KK30gVGhyZXNob2xkRGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QgU3RydWN0dXJpbmdFbGVtZW50X3N0cnVjdCB7CisgICAgaW50ICBtYXRyaXhDb2xzOyAvL051bWJlciBvZiBjb2x1bW5zIGluIHRoZSBtYXRyaXguCisgICAgaW50ICBtYXRyaXhSb3dzOyAvL051bWJlciBvZiByb3dzIGluIHRoZSBtYXRyaXguCisgICAgaW50ICBoZXhhOyAgICAgICAvL1NldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSBpZiB5b3Ugc3BlY2lmeSBhIGhleGFnb25hbCBzdHJ1Y3R1cmluZyBlbGVtZW50IGluIGtlcm5lbC4KKyAgICBpbnQqIGtlcm5lbDsgICAgIC8vVGhlIHZhbHVlcyBvZiB0aGUgc3RydWN0dXJpbmcgZWxlbWVudC4KK30gU3RydWN0dXJpbmdFbGVtZW50OworCit0eXBlZGVmIHN0cnVjdCBTcG9rZVJlcG9ydF9zdHJ1Y3QgeworICAgIExpbmVGbG9hdCogICAgICAgICAgc3Bva2VMaW5lczsgICAgICAgIC8vVGhlIGNvb3JkaW5hdGUgbG9jYXRpb24gb2YgZWFjaCBvZiB0aGUgc3Bva2UgbGluZXMgdXNlZCBieSB0aGUgZnVuY3Rpb24uCisgICAgaW50ICAgICAgICAgICAgICAgICBudW1TcG9rZUxpbmVzOyAgICAgLy9UaGUgbnVtYmVyIG9mIGxpbmVzIGluIHRoZSBzcG9rZUxpbmVzIGFycmF5LgorICAgIFBvaW50RmxvYXQqICAgICAgICAgZmlyc3RFZGdlczsgICAgICAgIC8vVGhlIGNvb3JkaW5hdGUgbG9jYXRpb24gb2YgYWxsIGVkZ2VzIGRldGVjdGVkIGFzIGZpcnN0IGVkZ2VzLgorICAgIGludCAgICAgICAgICAgICAgICAgbnVtRmlyc3RFZGdlczsgICAgIC8vVGhlIG51bWJlciBvZiBwb2ludHMgaW4gdGhlIGZpcnN0RWRnZXMgYXJyYXkuCisgICAgUG9pbnRGbG9hdCogICAgICAgICBsYXN0RWRnZXM7ICAgICAgICAgLy9UaGUgY29vcmRpbmF0ZSBsb2NhdGlvbiBvZiBhbGwgZWRnZXMgZGV0ZWN0ZWQgYXMgbGFzdCBlZGdlcy4KKyAgICBpbnQgICAgICAgICAgICAgICAgIG51bUxhc3RFZGdlczsgICAgICAvL1RoZSBudW1iZXIgb2YgcG9pbnRzIGluIHRoZSBsYXN0RWRnZXMgYXJyYXkuCisgICAgRWRnZUxvY2F0aW9uUmVwb3J0KiBhbGxFZGdlczsgICAgICAgICAgLy9BbiBhcnJheSBvZiByZXBvcnRzIGRlc2NyaWJpbmcgdGhlIGxvY2F0aW9uIG9mIHRoZSBlZGdlcyBsb2NhdGVkIGJ5IGVhY2ggc3Bva2UgbGluZS4KKyAgICBpbnQqICAgICAgICAgICAgICAgIGxpbmVzV2l0aEVkZ2VzOyAgICAvL0FuIGFycmF5IG9mIGluZGljZXMgaW50byB0aGUgc3Bva2VMaW5lcyBhcnJheSBpbmRpY2F0aW5nIHRoZSByYWtlIGxpbmVzIG9uIHdoaWNoIHRoZSBmdW5jdGlvbiBkZXRlY3RlZCBhdCBsZWFzdCBvbmUgZWRnZS4KKyAgICBpbnQgICAgICAgICAgICAgICAgIG51bUxpbmVzV2l0aEVkZ2VzOyAvL1RoZSBudW1iZXIgb2Ygc3Bva2UgbGluZXMgYWxvbmcgd2hpY2ggdGhlIGZ1bmN0aW9uIGRldGVjdHMgZWRnZXMuCit9IFNwb2tlUmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBTaW1wbGVFZGdlT3B0aW9uc19zdHJ1Y3QgeworICAgIExldmVsVHlwZSAgIHR5cGU7ICAgICAgIC8vRGV0ZXJtaW5lcyBob3cgdGhlIGZ1bmN0aW9uIGV2YWx1YXRlcyB0aGUgdGhyZXNob2xkIGFuZCBoeXN0ZXJlc2lzIHZhbHVlcy4KKyAgICBpbnQgICAgICAgICB0aHJlc2hvbGQ7ICAvL1RoZSBwaXhlbCB2YWx1ZSBhdCB3aGljaCBhbiBlZGdlIG9jY3Vycy4KKyAgICBpbnQgICAgICAgICBoeXN0ZXJlc2lzOyAvL0EgdmFsdWUgdGhhdCBoZWxwcyBkZXRlcm1pbmUgZWRnZXMgaW4gbm9pc3kgaW1hZ2VzLgorICAgIEVkZ2VQcm9jZXNzIHByb2Nlc3M7ICAgIC8vRGV0ZXJtaW5lcyB3aGljaCBlZGdlcyB0aGUgZnVuY3Rpb24gbG9va3MgZm9yLgorICAgIGludCAgICAgICAgIHN1YnBpeGVsOyAgIC8vU2V0IHRoaXMgZWxlbWVudCB0byBUUlVFIHRvIGZpbmQgZWRnZXMgd2l0aCBzdWJwaXhlbCBhY2N1cmFjeSBieSBpbnRlcnBvbGF0aW5nIGJldHdlZW4gcG9pbnRzIHRvIGZpbmQgdGhlIGNyb3NzaW5nIG9mIHRoZSBnaXZlbiB0aHJlc2hvbGQuCit9IFNpbXBsZUVkZ2VPcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBTZWxlY3RQYXJ0aWNsZUNyaXRlcmlhX3N0cnVjdCB7CisgICAgTWVhc3VyZW1lbnRWYWx1ZSBwYXJhbWV0ZXI7IC8vVGhlIG1vcnBob2xvZ2ljYWwgbWVhc3VyZW1lbnQgdGhhdCB0aGUgZnVuY3Rpb24gdXNlcyBmb3IgZmlsdGVyaW5nLgorICAgIGZsb2F0ICAgICAgICAgICAgbG93ZXI7ICAgICAvL1RoZSBsb3dlciBib3VuZGFyeSBvZiB0aGUgY3JpdGVyaWEgcmFuZ2UuCisgICAgZmxvYXQgICAgICAgICAgICB1cHBlcjsgICAgIC8vVGhlIHVwcGVyIGJvdW5kYXJ5IG9mIHRoZSBjcml0ZXJpYSByYW5nZS4KK30gU2VsZWN0UGFydGljbGVDcml0ZXJpYTsKKwordHlwZWRlZiBzdHJ1Y3QgU2VnbWVudEluZm9fc3RydWN0IHsKKyAgICBpbnQgICAgICAgICAgIG51bWJlck9mUG9pbnRzOyAvL1RoZSBudW1iZXIgb2YgcG9pbnRzIGluIHRoZSBzZWdtZW50LgorICAgIGludCAgICAgICAgICAgaXNPcGVuOyAgICAgICAgIC8vSWYgVFJVRSwgdGhlIGNvbnRvdXIgaXMgb3Blbi4KKyAgICBkb3VibGUgICAgICAgIHdlaWdodDsgICAgICAgICAvL1RoZSBzaWduaWZpY2FuY2Ugb2YgdGhlIGVkZ2UgaW4gdGVybXMgb2YgdGhlIGdyYXkgdmFsdWVzIHRoYXQgY29uc3RpdHV0ZSB0aGUgZWRnZS4KKyAgICBDb250b3VyUG9pbnQqIHBvaW50czsgICAgICAgICAvL1RoZSBwb2ludHMgb2YgdGhlIHNlZ21lbnQuCit9IFNlZ21lbnRJbmZvOworCit0eXBlZGVmIHN0cnVjdCBSb3RhdGlvbkFuZ2xlUmFuZ2Vfc3RydWN0IHsKKyAgICBmbG9hdCBsb3dlcjsgLy9UaGUgbG93ZXN0IGFtb3VudCBvZiByb3RhdGlvbiwgaW4gZGVncmVlcywgYSB2YWxpZCBwYXR0ZXJuIGNhbiBoYXZlLgorICAgIGZsb2F0IHVwcGVyOyAvL1RoZSBoaWdoZXN0IGFtb3VudCBvZiByb3RhdGlvbiwgaW4gZGVncmVlcywgYSB2YWxpZCBwYXR0ZXJuIGNhbiBoYXZlLgorfSBSb3RhdGlvbkFuZ2xlUmFuZ2U7CisKK3R5cGVkZWYgc3RydWN0IFJvdGF0ZWRSZWN0X3N0cnVjdCB7CisgICAgaW50ICAgIHRvcDsgICAgLy9Mb2NhdGlvbiBvZiB0aGUgdG9wIGVkZ2Ugb2YgdGhlIHJlY3RhbmdsZSBiZWZvcmUgcm90YXRpb24uCisgICAgaW50ICAgIGxlZnQ7ICAgLy9Mb2NhdGlvbiBvZiB0aGUgbGVmdCBlZGdlIG9mIHRoZSByZWN0YW5nbGUgYmVmb3JlIHJvdGF0aW9uLgorICAgIGludCAgICBoZWlnaHQ7IC8vSGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuCisgICAgaW50ICAgIHdpZHRoOyAgLy9XaWR0aCBvZiB0aGUgcmVjdGFuZ2xlLgorICAgIGRvdWJsZSBhbmdsZTsgIC8vVGhlIHJvdGF0aW9uLCBpbiBkZWdyZWVzLCBvZiB0aGUgcmVjdGFuZ2xlLgorfSBSb3RhdGVkUmVjdDsKKwordHlwZWRlZiBzdHJ1Y3QgUk9JUHJvZmlsZV9zdHJ1Y3QgeworICAgIExpbmVQcm9maWxlIHJlcG9ydDsgLy9RdWFudGlmeWluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcG9pbnRzIGFsb25nIHRoZSBlZGdlIG9mIGVhY2ggY29udG91ciBpbiB0aGUgUk9JLgorICAgIFBvaW50KiAgICAgIHBpeGVsczsgLy9BbiBhcnJheSBvZiB0aGUgcG9pbnRzIGFsb25nIHRoZSBlZGdlIG9mIGVhY2ggY29udG91ciBpbiB0aGUgUk9JLgorfSBST0lQcm9maWxlOworCit0eXBlZGVmIHN0cnVjdCBUb29sV2luZG93T3B0aW9uc19zdHJ1Y3QgeworICAgIGludCBzaG93U2VsZWN0aW9uVG9vbDsgICAgICAgIC8vSWYgVFJVRSwgdGhlIHNlbGVjdGlvbiB0b29sIGJlY29tZXMgdmlzaWJsZS4KKyAgICBpbnQgc2hvd1pvb21Ub29sOyAgICAgICAgICAgICAvL0lmIFRSVUUsIHRoZSB6b29tIHRvb2wgYmVjb21lcyB2aXNpYmxlLgorICAgIGludCBzaG93UG9pbnRUb29sOyAgICAgICAgICAgIC8vSWYgVFJVRSwgdGhlIHBvaW50IHRvb2wgYmVjb21lcyB2aXNpYmxlLgorICAgIGludCBzaG93TGluZVRvb2w7ICAgICAgICAgICAgIC8vSWYgVFJVRSwgdGhlIGxpbmUgdG9vbCBiZWNvbWVzIHZpc2libGUuCisgICAgaW50IHNob3dSZWN0YW5nbGVUb29sOyAgICAgICAgLy9JZiBUUlVFLCB0aGUgcmVjdGFuZ2xlIHRvb2wgYmVjb21lcyB2aXNpYmxlLgorICAgIGludCBzaG93T3ZhbFRvb2w7ICAgICAgICAgICAgIC8vSWYgVFJVRSwgdGhlIG92YWwgdG9vbCBiZWNvbWVzIHZpc2libGUuCisgICAgaW50IHNob3dQb2x5Z29uVG9vbDsgICAgICAgICAgLy9JZiBUUlVFLCB0aGUgcG9seWdvbiB0b29sIGJlY29tZXMgdmlzaWJsZS4KKyAgICBpbnQgc2hvd0Nsb3NlZEZyZWVoYW5kVG9vbDsgICAvL0lmIFRSVUUsIHRoZSBjbG9zZWQgZnJlZWhhbmQgdG9vbCBiZWNvbWVzIHZpc2libGUuCisgICAgaW50IHNob3dQb2x5TGluZVRvb2w7ICAgICAgICAgLy9JZiBUUlVFLCB0aGUgcG9seWxpbmUgdG9vbCBiZWNvbWVzIHZpc2libGUuCisgICAgaW50IHNob3dGcmVlaGFuZFRvb2w7ICAgICAgICAgLy9JZiBUUlVFLCB0aGUgZnJlZWhhbmQgdG9vbCBiZWNvbWVzIHZpc2libGUuCisgICAgaW50IHNob3dBbm51bHVzVG9vbDsgICAgICAgICAgLy9JZiBUUlVFLCB0aGUgYW5udWx1cyBiZWNvbWVzIHZpc2libGUuCisgICAgaW50IHNob3dSb3RhdGVkUmVjdGFuZ2xlVG9vbDsgLy9JZiBUUlVFLCB0aGUgcm90YXRlZCByZWN0YW5nbGUgdG9vbCBiZWNvbWVzIHZpc2libGUuCisgICAgaW50IHNob3dQYW5Ub29sOyAgICAgICAgICAgICAgLy9JZiBUUlVFLCB0aGUgcGFuIHRvb2wgYmVjb21lcyB2aXNpYmxlLgorICAgIGludCBzaG93Wm9vbU91dFRvb2w7ICAgICAgICAgIC8vSWYgVFJVRSwgdGhlIHpvb20gb3V0IHRvb2wgYmVjb21lcyB2aXNpYmxlLgorICAgIGludCByZXNlcnZlZDI7ICAgICAgICAgICAgICAgIC8vVGhpcyBlbGVtZW50IGlzIHJlc2VydmVkIGFuZCBzaG91bGQgYmUgc2V0IHRvIEZBTFNFLgorICAgIGludCByZXNlcnZlZDM7ICAgICAgICAgICAgICAgIC8vVGhpcyBlbGVtZW50IGlzIHJlc2VydmVkIGFuZCBzaG91bGQgYmUgc2V0IHRvIEZBTFNFLgorICAgIGludCByZXNlcnZlZDQ7ICAgICAgICAgICAgICAgIC8vVGhpcyBlbGVtZW50IGlzIHJlc2VydmVkIGFuZCBzaG91bGQgYmUgc2V0IHRvIEZBTFNFLgorfSBUb29sV2luZG93T3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgU3Bva2VPcHRpb25zX3N0cnVjdCB7CisgICAgaW50ICAgICAgICAgICAgICAgICB0aHJlc2hvbGQ7ICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIHRocmVzaG9sZCB2YWx1ZSBmb3IgdGhlIGNvbnRyYXN0IG9mIHRoZSBlZGdlLgorICAgIGludCAgICAgICAgICAgICAgICAgd2lkdGg7ICAgICAgICAgICAgIC8vVGhlIG51bWJlciBvZiBwaXhlbHMgdGhhdCB0aGUgZnVuY3Rpb24gYXZlcmFnZXMgdG8gZmluZCB0aGUgY29udHJhc3QgYXQgZWl0aGVyIHNpZGUgb2YgdGhlIGVkZ2UuCisgICAgaW50ICAgICAgICAgICAgICAgICBzdGVlcG5lc3M7ICAgICAgICAgLy9UaGUgc3BhbiwgaW4gcGl4ZWxzLCBvZiB0aGUgc2xvcGUgb2YgdGhlIGVkZ2UgcHJvamVjdGVkIGFsb25nIHRoZSBwYXRoIHNwZWNpZmllZCBieSB0aGUgaW5wdXQgcG9pbnRzLgorICAgIGRvdWJsZSAgICAgICAgICAgICAgc3Vic2FtcGxpbmdSYXRpbzsgIC8vVGhlIGFuZ2xlLCBpbiBkZWdyZWVzLCBiZXR3ZWVuIGVhY2ggcmFkaWFsIHNlYXJjaCBsaW5lIGluIHRoZSBzcG9rZS4KKyAgICBJbnRlcnBvbGF0aW9uTWV0aG9kIHN1YnBpeGVsVHlwZTsgICAgICAvL1RoZSBtZXRob2QgZm9yIGludGVycG9sYXRpbmcuCisgICAgaW50ICAgICAgICAgICAgICAgICBzdWJwaXhlbERpdmlzaW9uczsgLy9UaGUgbnVtYmVyIG9mIHNhbXBsZXMgdGhlIGZ1bmN0aW9uIG9idGFpbnMgZnJvbSBhIHBpeGVsLgorfSBTcG9rZU9wdGlvbnM7CisKKyNpZiAhZGVmaW5lZCBfX0dOVUNfXyAmJiAhZGVmaW5lZCBfTV9YNjQKKyNwcmFnbWEgcGFjayhwb3ApCisjZW5kaWYKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBDYWxsYmFjayBGdW5jdGlvbiBUeXBlCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNpZm5kZWYgX19HTlVDX18KK3R5cGVkZWYgdm9pZCAoSU1BUV9DQUxMQkFDSyogRXZlbnRDYWxsYmFjaykoV2luZG93RXZlbnRUeXBlIGV2ZW50LCBpbnQgd2luZG93TnVtYmVyLCBUb29sIHRvb2wsIFJlY3QgcmVjdCk7CisjZW5kaWYKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgR2xvYmFscworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjaWZuZGVmIF9fR05VQ19fCisjcHJhZ21hIGNvbnN0X3NlZygiSU1BUVZpc2lvbkNvbG9yQ29uc3RhbnRzIikKKyNlbmRpZgorc3RhdGljIGNvbnN0IFJHQlZhbHVlIElNQVFfUkdCX1RSQU5TUEFSRU5UID0geyAgIDAsICAgMCwgICAwLCAxIH07CitzdGF0aWMgY29uc3QgUkdCVmFsdWUgSU1BUV9SR0JfUkVEICAgICAgICAgPSB7ICAgMCwgICAwLCAyNTUsIDAgfTsKK3N0YXRpYyBjb25zdCBSR0JWYWx1ZSBJTUFRX1JHQl9CTFVFICAgICAgICA9IHsgMjU1LCAgIDAsICAgMCwgMCB9Oworc3RhdGljIGNvbnN0IFJHQlZhbHVlIElNQVFfUkdCX0dSRUVOICAgICAgID0geyAgIDAsIDI1NSwgICAwLCAwIH07CitzdGF0aWMgY29uc3QgUkdCVmFsdWUgSU1BUV9SR0JfWUVMTE9XICAgICAgPSB7ICAgMCwgMjU1LCAyNTUsIDAgfTsKK3N0YXRpYyBjb25zdCBSR0JWYWx1ZSBJTUFRX1JHQl9XSElURSAgICAgICA9IHsgMjU1LCAyNTUsIDI1NSwgMCB9Oworc3RhdGljIGNvbnN0IFJHQlZhbHVlIElNQVFfUkdCX0JMQUNLICAgICAgID0geyAgIDAsICAgMCwgICAwLCAwIH07CisjaWZuZGVmIF9fR05VQ19fCisjcHJhZ21hIGNvbnN0X3NlZygpCisjZW5kaWYKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgQmFja3dhcmRzIENvbXBhdGliaWxpdHkKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQordHlwZWRlZiBDb2xvclNlbnNpdGl2aXR5IAkJQ29sb3JDb21wbGV4aXR5OworI2RlZmluZSBJTUFRX0NPTVBMRVhJVFlfTE9XIAkJSU1BUV9TRU5TSVRJVklUWV9MT1cKKyNkZWZpbmUgSU1BUV9DT01QTEVYSVRZX01FRCAJCUlNQVFfU0VOU0lUSVZJVFlfTUVEICAgICAKKyNkZWZpbmUgSU1BUV9DT01QTEVYSVRZX0hJR0ggCQlJTUFRX1NFTlNJVElWSVRZX0hJR0gKKyNkZWZpbmUgRVJSX0lOVkFMSURfQ09MT1JDT01QTEVYSVRZIAlFUlJfSU5WQUxJRF9DT0xPUlNFTlNJVElWSVRZCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIExvZ2ljYWwgZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFBbmQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2VBLCBjb25zdCBJbWFnZSogc291cmNlQik7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxQW5kQ29uc3RhbnQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIFBpeGVsVmFsdWUgdmFsdWUpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUNvbXBhcmUoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGNvbnN0IEltYWdlKiBjb21wYXJlSW1hZ2UsIENvbXBhcmlzb25GdW5jdGlvbiBjb21wYXJlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFDb21wYXJlQ29uc3RhbnQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIFBpeGVsVmFsdWUgdmFsdWUsIENvbXBhcmlzb25GdW5jdGlvbiBjb21wYXJlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFMb2dpY2FsRGlmZmVyZW5jZShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZUEsIGNvbnN0IEltYWdlKiBzb3VyY2VCKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFMb2dpY2FsRGlmZmVyZW5jZUNvbnN0YW50KEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBQaXhlbFZhbHVlIHZhbHVlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFOYW5kKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlQSwgY29uc3QgSW1hZ2UqIHNvdXJjZUIpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcU5hbmRDb25zdGFudChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgUGl4ZWxWYWx1ZSB2YWx1ZSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxTm9yKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlQSwgY29uc3QgSW1hZ2UqIHNvdXJjZUIpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcU5vckNvbnN0YW50KEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBQaXhlbFZhbHVlIHZhbHVlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFPcihJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZUEsIGNvbnN0IEltYWdlKiBzb3VyY2VCKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFPckNvbnN0YW50KEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBQaXhlbFZhbHVlIHZhbHVlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFYbm9yKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlQSwgY29uc3QgSW1hZ2UqIHNvdXJjZUIpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcVhub3JDb25zdGFudChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgUGl4ZWxWYWx1ZSB2YWx1ZSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxWG9yKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlQSwgY29uc3QgSW1hZ2UqIHNvdXJjZUIpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcVhvckNvbnN0YW50KEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBQaXhlbFZhbHVlIHZhbHVlKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgUGFydGljbGUgQW5hbHlzaXMgZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUNvdW50UGFydGljbGVzKEltYWdlKiBpbWFnZSwgaW50IGNvbm5lY3Rpdml0eTgsIGludCogbnVtUGFydGljbGVzKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcU1lYXN1cmVQYXJ0aWNsZShJbWFnZSogaW1hZ2UsIGludCBwYXJ0aWNsZU51bWJlciwgaW50IGNhbGlicmF0ZWQsIE1lYXN1cmVtZW50VHlwZSBtZWFzdXJlbWVudCwgZG91YmxlKiB2YWx1ZSk7CitJTUFRX0ZVTkMgTWVhc3VyZVBhcnRpY2xlc1JlcG9ydCogSU1BUV9TVERDQUxMIGltYXFNZWFzdXJlUGFydGljbGVzKEltYWdlKiBpbWFnZSwgTWVhc3VyZVBhcnRpY2xlc0NhbGlicmF0aW9uTW9kZSBjYWxpYnJhdGlvbk1vZGUsIGNvbnN0IE1lYXN1cmVtZW50VHlwZSogbWVhc3VyZW1lbnRzLCBzaXplX3QgbnVtTWVhc3VyZW1lbnRzKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcVBhcnRpY2xlRmlsdGVyNChJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSwgY29uc3QgUGFydGljbGVGaWx0ZXJDcml0ZXJpYTIqIGNyaXRlcmlhLCBpbnQgY3JpdGVyaWFDb3VudCwgY29uc3QgUGFydGljbGVGaWx0ZXJPcHRpb25zMiogb3B0aW9ucywgY29uc3QgUk9JKiByb2ksIGludCogbnVtUGFydGljbGVzKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgTW9ycGhvbG9neSBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIGludCAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFDb252ZXhIdWxsKEltYWdlKiBkZXN0LCBJbWFnZSogc291cmNlLCBpbnQgY29ubmVjdGl2aXR5OCk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcURhbmllbHNzb25EaXN0YW5jZShJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUZpbGxIb2xlcyhJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgaW50IGNvbm5lY3Rpdml0eTgpOworSU1BUV9GVU5DIENpcmNsZVJlcG9ydCogSU1BUV9TVERDQUxMIGltYXFGaW5kQ2lyY2xlcyhJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSwgZmxvYXQgbWluUmFkaXVzLCBmbG9hdCBtYXhSYWRpdXMsIGludCogbnVtQ2lyY2xlcyk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUxhYmVsMihJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSwgaW50IGNvbm5lY3Rpdml0eTgsIGludCogcGFydGljbGVDb3VudCk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcU1vcnBob2xvZ3koSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UsIE1vcnBob2xvZ3lNZXRob2QgbWV0aG9kLCBjb25zdCBTdHJ1Y3R1cmluZ0VsZW1lbnQqIHN0cnVjdHVyaW5nRWxlbWVudCk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcVJlamVjdEJvcmRlcihJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSwgaW50IGNvbm5lY3Rpdml0eTgpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFTZWdtZW50YXRpb24oSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFTZXBhcmF0aW9uKEltYWdlKiBkZXN0LCBJbWFnZSogc291cmNlLCBpbnQgZXJvc2lvbnMsIGNvbnN0IFN0cnVjdHVyaW5nRWxlbWVudCogc3RydWN0dXJpbmdFbGVtZW50KTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxU2ltcGxlRGlzdGFuY2UoSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UsIGNvbnN0IFN0cnVjdHVyaW5nRWxlbWVudCogc3RydWN0dXJpbmdFbGVtZW50KTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxU2l6ZUZpbHRlcihJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSwgaW50IGNvbm5lY3Rpdml0eTgsIGludCBlcm9zaW9ucywgU2l6ZVR5cGUga2VlcFNpemUsIGNvbnN0IFN0cnVjdHVyaW5nRWxlbWVudCogc3RydWN0dXJpbmdFbGVtZW50KTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxU2tlbGV0b24oSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UsIFNrZWxldG9uTWV0aG9kIG1ldGhvZCk7CisKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgQWNxdWlzaXRpb24gZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBJbWFnZSogSU1BUV9TVERDQUxMIGltYXFDb3B5RnJvbVJpbmcoU0VTU0lPTl9JRCBzZXNzaW9uSUQsIEltYWdlKiBpbWFnZSwgaW50IGltYWdlVG9Db3B5LCBpbnQqIGltYWdlTnVtYmVyLCBSZWN0IHJlY3QpOworSU1BUV9GVU5DIEltYWdlKiBJTUFRX1NURENBTEwgaW1hcUVhc3lBY3F1aXJlKGNvbnN0IGNoYXIqIGludGVyZmFjZU5hbWUpOworSU1BUV9GVU5DIEltYWdlKiBJTUFRX1NURENBTEwgaW1hcUV4dHJhY3RGcm9tUmluZyhTRVNTSU9OX0lEIHNlc3Npb25JRCwgaW50IGltYWdlVG9FeHRyYWN0LCBpbnQqIGltYWdlTnVtYmVyKTsKK0lNQVFfRlVOQyBJbWFnZSogSU1BUV9TVERDQUxMIGltYXFHcmFiKFNFU1NJT05fSUQgc2Vzc2lvbklELCBJbWFnZSogaW1hZ2UsIGludCBpbW1lZGlhdGUpOworSU1BUV9GVU5DIGludCAgICBJTUFRX1NURENBTEwgaW1hcVJlbGVhc2VJbWFnZShTRVNTSU9OX0lEIHNlc3Npb25JRCk7CitJTUFRX0ZVTkMgaW50ICAgIElNQVFfU1REQ0FMTCBpbWFxU2V0dXBHcmFiKFNFU1NJT05fSUQgc2Vzc2lvbklELCBSZWN0IHJlY3QpOworSU1BUV9GVU5DIGludCAgICBJTUFRX1NURENBTEwgaW1hcVNldHVwUmluZyhTRVNTSU9OX0lEIHNlc3Npb25JRCwgSW1hZ2UqKiBpbWFnZXMsIGludCBudW1JbWFnZXMsIGludCBza2lwQ291bnQsIFJlY3QgcmVjdCk7CitJTUFRX0ZVTkMgaW50ICAgIElNQVFfU1REQ0FMTCBpbWFxU2V0dXBTZXF1ZW5jZShTRVNTSU9OX0lEIHNlc3Npb25JRCwgSW1hZ2UqKiBpbWFnZXMsIGludCBudW1JbWFnZXMsIGludCBza2lwQ291bnQsIFJlY3QgcmVjdCk7CitJTUFRX0ZVTkMgSW1hZ2UqIElNQVFfU1REQ0FMTCBpbWFxU25hcChTRVNTSU9OX0lEIHNlc3Npb25JRCwgSW1hZ2UqIGltYWdlLCBSZWN0IHJlY3QpOworSU1BUV9GVU5DIGludCAgICBJTUFRX1NURENBTEwgaW1hcVN0YXJ0QWNxdWlzaXRpb24oU0VTU0lPTl9JRCBzZXNzaW9uSUQpOworSU1BUV9GVU5DIGludCAgICBJTUFRX1NURENBTEwgaW1hcVN0b3BBY3F1aXNpdGlvbihTRVNTSU9OX0lEIHNlc3Npb25JRCk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIEFyaXRobWV0aWMgZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFBYnNvbHV0ZURpZmZlcmVuY2UoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2VBLCBjb25zdCBJbWFnZSogc291cmNlQik7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxQWJzb2x1dGVEaWZmZXJlbmNlQ29uc3RhbnQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIFBpeGVsVmFsdWUgdmFsdWUpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUFkZChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZUEsIGNvbnN0IEltYWdlKiBzb3VyY2VCKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFBZGRDb25zdGFudChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgUGl4ZWxWYWx1ZSB2YWx1ZSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxQXZlcmFnZShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZUEsIGNvbnN0IEltYWdlKiBzb3VyY2VCKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFBdmVyYWdlQ29uc3RhbnQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIFBpeGVsVmFsdWUgdmFsdWUpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcURpdmlkZTIoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2VBLCBjb25zdCBJbWFnZSogc291cmNlQiwgUm91bmRpbmdNb2RlIHJvdW5kaW5nTW9kZSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxRGl2aWRlQ29uc3RhbnQyKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBQaXhlbFZhbHVlIHZhbHVlLCBSb3VuZGluZ01vZGUgcm91bmRpbmdNb2RlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFNYXgoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2VBLCBjb25zdCBJbWFnZSogc291cmNlQik7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxTWF4Q29uc3RhbnQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIFBpeGVsVmFsdWUgdmFsdWUpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcU1pbihJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZUEsIGNvbnN0IEltYWdlKiBzb3VyY2VCKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFNaW5Db25zdGFudChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgUGl4ZWxWYWx1ZSB2YWx1ZSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxTW9kdWxvKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlQSwgY29uc3QgSW1hZ2UqIHNvdXJjZUIpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcU1vZHVsb0NvbnN0YW50KEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBQaXhlbFZhbHVlIHZhbHVlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFNdWxEaXYoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2VBLCBjb25zdCBJbWFnZSogc291cmNlQiwgZmxvYXQgdmFsdWUpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcU11bHRpcGx5KEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlQSwgY29uc3QgSW1hZ2UqIHNvdXJjZUIpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcU11bHRpcGx5Q29uc3RhbnQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIFBpeGVsVmFsdWUgdmFsdWUpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcVN1YnRyYWN0KEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlQSwgY29uc3QgSW1hZ2UqIHNvdXJjZUIpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcVN1YnRyYWN0Q29uc3RhbnQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIFBpeGVsVmFsdWUgdmFsdWUpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBDYWxpcGVyIGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgQ2FsaXBlclJlcG9ydCogICAgICAgICBJTUFRX1NURENBTEwgaW1hcUNhbGlwZXJUb29sKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgUG9pbnQqIHBvaW50cywgaW50IG51bVBvaW50cywgY29uc3QgRWRnZU9wdGlvbnMqIGVkZ2VPcHRpb25zLCBjb25zdCBDYWxpcGVyT3B0aW9ucyogY2FsaXBlck9wdGlvbnMsIGludCogbnVtRWRnZVBhaXJzKTsKK0lNQVFfRlVOQyBDb25jZW50cmljUmFrZVJlcG9ydDIqIElNQVFfU1REQ0FMTCBpbWFxQ29uY2VudHJpY1Jha2UyKEltYWdlKiBpbWFnZSwgUk9JKiByb2ksIENvbmNlbnRyaWNSYWtlRGlyZWN0aW9uIGRpcmVjdGlvbiwgRWRnZVByb2Nlc3MgcHJvY2VzcywgaW50IHN0ZXBTaXplLCBFZGdlT3B0aW9uczIqIGVkZ2VPcHRpb25zKTsKK0lNQVFfRlVOQyBFeHRyZW1lUmVwb3J0KiAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxRGV0ZWN0RXh0cmVtZXMoY29uc3QgZG91YmxlKiBwaXhlbHMsIGludCBudW1QaXhlbHMsIERldGVjdGlvbk1vZGUgbW9kZSwgY29uc3QgRGV0ZWN0RXh0cmVtZXNPcHRpb25zKiBvcHRpb25zLCBpbnQqIG51bUV4dHJlbWVzKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxRGV0ZWN0Um90YXRpb24oY29uc3QgSW1hZ2UqIHJlZmVyZW5jZUltYWdlLCBjb25zdCBJbWFnZSogdGVzdEltYWdlLCBQb2ludEZsb2F0IHJlZmVyZW5jZUNlbnRlciwgUG9pbnRGbG9hdCB0ZXN0Q2VudGVyLCBpbnQgcmFkaXVzLCBmbG9hdCBwcmVjaXNpb24sIGRvdWJsZSogYW5nbGUpOworSU1BUV9GVU5DIEVkZ2VSZXBvcnQyKiAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFFZGdlVG9vbDQoSW1hZ2UqIGltYWdlLCBST0kqIHJvaSwgRWRnZVByb2Nlc3MgcHJvY2Vzc1R5cGUsIEVkZ2VPcHRpb25zMiogZWRnZU9wdGlvbnMsIGNvbnN0IHVuc2lnbmVkIGludCByZXZlcnNlRGlyZWN0aW9uKTsKK0lNQVFfRlVOQyBGaW5kRWRnZVJlcG9ydCogICAgICAgIElNQVFfU1REQ0FMTCBpbWFxRmluZEVkZ2UyKEltYWdlKiBpbWFnZSwgY29uc3QgUk9JKiByb2ksIGNvbnN0IENvb3JkaW5hdGVTeXN0ZW0qIGJhc2VTeXN0ZW0sIGNvbnN0IENvb3JkaW5hdGVTeXN0ZW0qIG5ld1N5c3RlbSwgY29uc3QgRmluZEVkZ2VPcHRpb25zMiogZmluZEVkZ2VPcHRpb25zLCBjb25zdCBTdHJhaWdodEVkZ2VPcHRpb25zKiBzdHJhaWdodEVkZ2VPcHRpb25zKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxRmluZFRyYW5zZm9ybVJlY3QyKEltYWdlKiBpbWFnZSwgY29uc3QgUk9JKiByb2ksIEZpbmRUcmFuc2Zvcm1Nb2RlIG1vZGUsIENvb3JkaW5hdGVTeXN0ZW0qIGJhc2VTeXN0ZW0sIENvb3JkaW5hdGVTeXN0ZW0qIG5ld1N5c3RlbSwgY29uc3QgRmluZFRyYW5zZm9ybVJlY3RPcHRpb25zMiogZmluZFRyYW5zZm9ybU9wdGlvbnMsIGNvbnN0IFN0cmFpZ2h0RWRnZU9wdGlvbnMqIHN0cmFpZ2h0RWRnZU9wdGlvbnMsIEF4aXNSZXBvcnQqIGF4aXNSZXBvcnQpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFGaW5kVHJhbnNmb3JtUmVjdHMyKEltYWdlKiBpbWFnZSwgY29uc3QgUk9JKiBwcmltYXJ5Uk9JLCBjb25zdCBST0kqIHNlY29uZGFyeVJPSSwgRmluZFRyYW5zZm9ybU1vZGUgbW9kZSwgQ29vcmRpbmF0ZVN5c3RlbSogYmFzZVN5c3RlbSwgQ29vcmRpbmF0ZVN5c3RlbSogbmV3U3lzdGVtLCBjb25zdCBGaW5kVHJhbnNmb3JtUmVjdHNPcHRpb25zMiogZmluZFRyYW5zZm9ybU9wdGlvbnMsIGNvbnN0IFN0cmFpZ2h0RWRnZU9wdGlvbnMqIHByaW1hcnlTdHJhaWdodEVkZ2VPcHRpb25zLCBjb25zdCBTdHJhaWdodEVkZ2VPcHRpb25zKiBzZWNvbmRhcnlTdHJhaWdodEVkZ2VPcHRpb25zLCBBeGlzUmVwb3J0KiBheGlzUmVwb3J0KTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxTGluZUdhdWdlVG9vbDIoY29uc3QgSW1hZ2UqIGltYWdlLCBQb2ludCBzdGFydCwgUG9pbnQgZW5kLCBMaW5lR2F1Z2VNZXRob2QgbWV0aG9kLCBjb25zdCBFZGdlT3B0aW9ucyogZWRnZU9wdGlvbnMsIGNvbnN0IENvb3JkaW5hdGVUcmFuc2Zvcm0yKiB0cmFuc2Zvcm0sIGZsb2F0KiBkaXN0YW5jZSk7CitJTUFRX0ZVTkMgUmFrZVJlcG9ydDIqICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcVJha2UyKEltYWdlKiBpbWFnZSwgUk9JKiByb2ksIFJha2VEaXJlY3Rpb24gZGlyZWN0aW9uLCBFZGdlUHJvY2VzcyBwcm9jZXNzLCBpbnQgc3RlcFNpemUsIEVkZ2VPcHRpb25zMiogZWRnZU9wdGlvbnMpOworSU1BUV9GVU5DIFBvaW50RmxvYXQqICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFTaW1wbGVFZGdlKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgUG9pbnQqIHBvaW50cywgaW50IG51bVBvaW50cywgY29uc3QgU2ltcGxlRWRnZU9wdGlvbnMqIG9wdGlvbnMsIGludCogbnVtRWRnZXMpOworSU1BUV9GVU5DIFNwb2tlUmVwb3J0MiogICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFTcG9rZTIoSW1hZ2UqIGltYWdlLCBST0kqIHJvaSwgU3Bva2VEaXJlY3Rpb24gZGlyZWN0aW9uLCBFZGdlUHJvY2VzcyBwcm9jZXNzLCBpbnQgc3RlcFNpemUsIEVkZ2VPcHRpb25zMiogZWRnZU9wdGlvbnMpOworSU1BUV9GVU5DIFN0cmFpZ2h0RWRnZVJlcG9ydDIqICAgSU1BUV9TVERDQUxMIGltYXFTdHJhaWdodEVkZ2UoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBST0kqIHJvaSwgU2VhcmNoRGlyZWN0aW9uIHNlYXJjaERpcmVjdGlvbiwgY29uc3QgRWRnZU9wdGlvbnMyKiBlZGdlT3B0aW9ucywgY29uc3QgU3RyYWlnaHRFZGdlT3B0aW9ucyogc3RyYWlnaHRFZGdlT3B0aW9ucyk7CitJTUFRX0ZVTkMgU3RyYWlnaHRFZGdlUmVwb3J0MiogICBJTUFRX1NURENBTEwgaW1hcVN0cmFpZ2h0RWRnZTIoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBST0kqIHJvaSwgU2VhcmNoRGlyZWN0aW9uIHNlYXJjaERpcmVjdGlvbiwgY29uc3QgRWRnZU9wdGlvbnMyKiBlZGdlT3B0aW9ucywgY29uc3QgU3RyYWlnaHRFZGdlT3B0aW9ucyogc3RyYWlnaHRFZGdlT3B0aW9ucywgdW5zaWduZWQgaW50IG9wdGltaXplZE1vZGUpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBTcGF0aWFsIEZpbHRlcnMgZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFDYW5ueUVkZ2VGaWx0ZXIoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGNvbnN0IENhbm55T3B0aW9ucyogb3B0aW9ucyk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxQ29udm9sdmUyKEltYWdlKiBkZXN0LCBJbWFnZSogc291cmNlLCBmbG9hdCoga2VybmVsLCBpbnQgbWF0cml4Um93cywgaW50IG1hdHJpeENvbHMsIGZsb2F0IG5vcm1hbGl6ZSwgSW1hZ2UqIG1hc2ssIFJvdW5kaW5nTW9kZSByb3VuZGluZ01vZGUpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUNvcnJlbGF0ZShJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSwgY29uc3QgSW1hZ2UqIHRlbXBsYXRlSW1hZ2UsIFJlY3QgcmVjdCk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxRWRnZUZpbHRlcihJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSwgT3V0bGluZU1ldGhvZCBtZXRob2QsIGNvbnN0IEltYWdlKiBtYXNrKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFMb3dQYXNzKEltYWdlKiBkZXN0LCBJbWFnZSogc291cmNlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGZsb2F0IHRvbGVyYW5jZSwgY29uc3QgSW1hZ2UqIG1hc2spOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcU1lZGlhbkZpbHRlcihJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBjb25zdCBJbWFnZSogbWFzayk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxTnRoT3JkZXJGaWx0ZXIoSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG4sIGNvbnN0IEltYWdlKiBtYXNrKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgRHJhd2luZyBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcURyYXdMaW5lT25JbWFnZShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgRHJhd01vZGUgbW9kZSwgUG9pbnQgc3RhcnQsIFBvaW50IGVuZCwgZmxvYXQgbmV3UGl4ZWxWYWx1ZSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxRHJhd1NoYXBlT25JbWFnZShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgUmVjdCByZWN0LCBEcmF3TW9kZSBtb2RlLCBTaGFwZU1vZGUgc2hhcGUsIGZsb2F0IG5ld1BpeGVsVmFsdWUpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcURyYXdUZXh0T25JbWFnZShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgUG9pbnQgY29vcmQsIGNvbnN0IGNoYXIqIHRleHQsIGNvbnN0IERyYXdUZXh0T3B0aW9ucyogb3B0aW9ucywgaW50KiBmb250TmFtZVVzZWQpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBJbnRlcmxhY2luZyBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUludGVybGFjZUNvbWJpbmUoSW1hZ2UqIGZyYW1lLCBjb25zdCBJbWFnZSogb2RkLCBjb25zdCBJbWFnZSogZXZlbik7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxSW50ZXJsYWNlU2VwYXJhdGUoY29uc3QgSW1hZ2UqIGZyYW1lLCBJbWFnZSogb2RkLCBJbWFnZSogZXZlbik7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIEltYWdlIEluZm9ybWF0aW9uIGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgY2hhcioqIElNQVFfU1REQ0FMTCBpbWFxRW51bWVyYXRlQ3VzdG9tS2V5cyhjb25zdCBJbWFnZSogaW1hZ2UsIHVuc2lnbmVkIGludCogc2l6ZSk7CitJTUFRX0ZVTkMgaW50ICAgIElNQVFfU1REQ0FMTCBpbWFxR2V0Qml0RGVwdGgoY29uc3QgSW1hZ2UqIGltYWdlLCB1bnNpZ25lZCBpbnQqIGJpdERlcHRoKTsKK0lNQVFfRlVOQyBpbnQgICAgSU1BUV9TVERDQUxMIGltYXFHZXRCeXRlc1BlclBpeGVsKGNvbnN0IEltYWdlKiBpbWFnZSwgaW50KiBieXRlQ291bnQpOworSU1BUV9GVU5DIGludCAgICBJTUFRX1NURENBTEwgaW1hcUdldEltYWdlSW5mbyhjb25zdCBJbWFnZSogaW1hZ2UsIEltYWdlSW5mbyogaW5mbyk7CitJTUFRX0ZVTkMgaW50ICAgIElNQVFfU1REQ0FMTCBpbWFxR2V0SW1hZ2VTaXplKGNvbnN0IEltYWdlKiBpbWFnZSwgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQpOworSU1BUV9GVU5DIGludCAgICBJTUFRX1NURENBTEwgaW1hcUdldEltYWdlVHlwZShjb25zdCBJbWFnZSogaW1hZ2UsIEltYWdlVHlwZSogdHlwZSk7CitJTUFRX0ZVTkMgaW50ICAgIElNQVFfU1REQ0FMTCBpbWFxR2V0TWFza09mZnNldChjb25zdCBJbWFnZSogaW1hZ2UsIFBvaW50KiBvZmZzZXQpOworSU1BUV9GVU5DIHZvaWQqICBJTUFRX1NURENBTEwgaW1hcUdldFBpeGVsQWRkcmVzcyhjb25zdCBJbWFnZSogaW1hZ2UsIFBvaW50IHBpeGVsKTsKK0lNQVFfRlVOQyBpbnQgICAgSU1BUV9TVERDQUxMIGltYXFHZXRWaXNpb25JbmZvVHlwZXMoY29uc3QgSW1hZ2UqIGltYWdlLCB1bnNpZ25lZCBpbnQqIHByZXNlbnQpOworSU1BUV9GVU5DIGludCAgICBJTUFRX1NURENBTEwgaW1hcUlzSW1hZ2VFbXB0eShjb25zdCBJbWFnZSogaW1hZ2UsIGludCogZW1wdHkpOworSU1BUV9GVU5DIHZvaWQqICBJTUFRX1NURENBTEwgaW1hcVJlYWRDdXN0b21EYXRhKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgY2hhcioga2V5LCB1bnNpZ25lZCBpbnQqIHNpemUpOworSU1BUV9GVU5DIGludCAgICBJTUFRX1NURENBTEwgaW1hcVJlbW92ZUN1c3RvbURhdGEoSW1hZ2UqIGltYWdlLCBjb25zdCBjaGFyKiBrZXkpOworSU1BUV9GVU5DIGludCAgICBJTUFRX1NURENBTEwgaW1hcVJlbW92ZVZpc2lvbkluZm8yKGNvbnN0IEltYWdlKiBpbWFnZSwgdW5zaWduZWQgaW50IGluZm8pOworSU1BUV9GVU5DIGludCAgICBJTUFRX1NURENBTEwgaW1hcVNldEJpdERlcHRoKEltYWdlKiBpbWFnZSwgdW5zaWduZWQgaW50IGJpdERlcHRoKTsKK0lNQVFfRlVOQyBpbnQgICAgSU1BUV9TVERDQUxMIGltYXFTZXRJbWFnZVNpemUoSW1hZ2UqIGltYWdlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworSU1BUV9GVU5DIGludCAgICBJTUFRX1NURENBTEwgaW1hcVNldE1hc2tPZmZzZXQoSW1hZ2UqIGltYWdlLCBQb2ludCBvZmZzZXQpOworSU1BUV9GVU5DIGludCAgICBJTUFRX1NURENBTEwgaW1hcVdyaXRlQ3VzdG9tRGF0YShJbWFnZSogaW1hZ2UsIGNvbnN0IGNoYXIqIGtleSwgY29uc3Qgdm9pZCogZGF0YSwgdW5zaWduZWQgaW50IHNpemUpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBEaXNwbGF5IGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgaW50ICAgSU1BUV9TVERDQUxMIGltYXFBcmVUb29sc0NvbnRleHRTZW5zaXRpdmUoaW50KiBzZW5zaXRpdmUpOworSU1BUV9GVU5DIGludCAgIElNQVFfU1REQ0FMTCBpbWFxQ2xvc2VXaW5kb3coaW50IHdpbmRvd051bWJlcik7CitJTUFRX0ZVTkMgaW50ICAgSU1BUV9TVERDQUxMIGltYXFEaXNwbGF5SW1hZ2UoY29uc3QgSW1hZ2UqIGltYWdlLCBpbnQgd2luZG93TnVtYmVyLCBpbnQgcmVzaXplKTsKK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcUdldExhc3RLZXkoY2hhcioga2V5UHJlc3NlZCwgaW50KiB3aW5kb3dOdW1iZXIsIGludCogbW9kaWZpZXJzKTsKK0lNQVFfRlVOQyB2b2lkKiBJTUFRX1NURENBTEwgaW1hcUdldFN5c3RlbVdpbmRvd0hhbmRsZShpbnQgd2luZG93TnVtYmVyKTsKK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcUdldFdpbmRvd0NlbnRlclBvcyhpbnQgd2luZG93TnVtYmVyLCBQb2ludCogY2VudGVyUG9zaXRpb24pOworSU1BUV9GVU5DIGludCAgIElNQVFfU1REQ0FMTCBpbWFxU2V0VG9vbENvbnRleHRTZW5zaXRpdml0eShpbnQgc2Vuc2l0aXZlKTsKK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcVNob3dXaW5kb3coaW50IHdpbmRvd051bWJlciwgaW50IHZpc2libGUpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBJbWFnZSBNYW5pcHVsYXRpb24gZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcUNhc3QoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIEltYWdlVHlwZSB0eXBlLCBjb25zdCBmbG9hdCogbG9va3VwLCBpbnQgc2hpZnQpOworSU1BUV9GVU5DIGludCAgIElNQVFfU1REQ0FMTCBpbWFxQ29weVJlY3QoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIFJlY3QgcmVjdCwgUG9pbnQgZGVzdExvYyk7CitJTUFRX0ZVTkMgaW50ICAgSU1BUV9TVERDQUxMIGltYXFEdXBsaWNhdGUoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UpOworSU1BUV9GVU5DIHZvaWQqIElNQVFfU1REQ0FMTCBpbWFxRmxhdHRlbihjb25zdCBJbWFnZSogaW1hZ2UsIEZsYXR0ZW5UeXBlIHR5cGUsIENvbXByZXNzaW9uVHlwZSBjb21wcmVzc2lvbiwgaW50IHF1YWxpdHksIHVuc2lnbmVkIGludCogc2l6ZSk7CitJTUFRX0ZVTkMgaW50ICAgSU1BUV9TVERDQUxMIGltYXFGbGlwKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBGbGlwQXhpcyBheGlzKTsKK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcU1hc2soSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGNvbnN0IEltYWdlKiBtYXNrKTsKK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcVJlc2FtcGxlKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBpbnQgbmV3V2lkdGgsIGludCBuZXdIZWlnaHQsIEludGVycG9sYXRpb25NZXRob2QgbWV0aG9kLCBSZWN0IHJlY3QpOworSU1BUV9GVU5DIGludCAgIElNQVFfU1REQ0FMTCBpbWFxUm90YXRlMihJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgZmxvYXQgYW5nbGUsIFBpeGVsVmFsdWUgZmlsbCwgSW50ZXJwb2xhdGlvbk1ldGhvZCBtZXRob2QsIGludCBtYWludGFpblNpemUpOworSU1BUV9GVU5DIGludCAgIElNQVFfU1REQ0FMTCBpbWFxU2NhbGUoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGludCB4U2NhbGUsIGludCB5U2NhbGUsIFNjYWxpbmdNb2RlIHNjYWxlTW9kZSwgUmVjdCByZWN0KTsKK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcVNoaWZ0KEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBpbnQgc2hpZnRYLCBpbnQgc2hpZnRZLCBQaXhlbFZhbHVlIGZpbGwpOworSU1BUV9GVU5DIGludCAgIElNQVFfU1REQ0FMTCBpbWFxVHJhbnNwb3NlKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlKTsKK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcVVuZmxhdHRlbihJbWFnZSogaW1hZ2UsIGNvbnN0IHZvaWQqIGRhdGEsIHVuc2lnbmVkIGludCBzaXplKTsKK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcVVud3JhcEltYWdlKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBBbm51bHVzIGFubnVsdXMsIFJlY3RPcmllbnRhdGlvbiBvcmllbnRhdGlvbiwgSW50ZXJwb2xhdGlvbk1ldGhvZCBtZXRob2QpOworSU1BUV9GVU5DIGludCAgIElNQVFfU1REQ0FMTCBpbWFxVmlldzNEKEltYWdlKiBkZXN0LCBJbWFnZSogc291cmNlLCBjb25zdCBWaWV3M0RPcHRpb25zKiBvcHRpb25zKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgRmlsZSBJL08gZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBpbnQgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUNsb3NlQVZJKEFWSVNlc3Npb24gc2Vzc2lvbik7CitJTUFRX0ZVTkMgQVZJU2Vzc2lvbiAgSU1BUV9TVERDQUxMIGltYXFDcmVhdGVBVkkoY29uc3QgY2hhciogZmlsZU5hbWUsIGNvbnN0IGNoYXIqIGNvbXByZXNzaW9uRmlsdGVyLCBpbnQgcXVhbGl0eSwgdW5zaWduZWQgaW50IGZyYW1lc1BlclNlY29uZCwgdW5zaWduZWQgaW50IG1heERhdGFTaXplKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUdldEFWSUluZm8oQVZJU2Vzc2lvbiBzZXNzaW9uLCBBVklJbmZvKiBpbmZvKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUdldEZpbGVJbmZvKGNvbnN0IGNoYXIqIGZpbGVOYW1lLCBDYWxpYnJhdGlvblVuaXQqIGNhbGlicmF0aW9uVW5pdCwgZmxvYXQqIGNhbGlicmF0aW9uWCwgZmxvYXQqIGNhbGlicmF0aW9uWSwgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQsIEltYWdlVHlwZSogaW1hZ2VUeXBlKTsKK0lNQVFfRlVOQyBGaWx0ZXJOYW1lKiBJTUFRX1NURENBTEwgaW1hcUdldEZpbHRlck5hbWVzKGludCogbnVtRmlsdGVycyk7CitJTUFRX0ZVTkMgY2hhcioqICAgICAgSU1BUV9TVERDQUxMIGltYXFMb2FkSW1hZ2VQb3B1cChjb25zdCBjaGFyKiBkZWZhdWx0RGlyZWN0b3J5LCBjb25zdCBjaGFyKiBkZWZhdWx0RmlsZVNwZWMsIGNvbnN0IGNoYXIqIGZpbGVUeXBlTGlzdCwgY29uc3QgY2hhciogdGl0bGUsIGludCBhbGxvd011bHRpcGxlUGF0aHMsIEJ1dHRvbkxhYmVsIGJ1dHRvbkxhYmVsLCBpbnQgcmVzdHJpY3REaXJlY3RvcnksIGludCByZXN0cmljdEV4dGVuc2lvbiwgaW50IGFsbG93Q2FuY2VsLCBpbnQgYWxsb3dNYWtlRGlyZWN0b3J5LCBpbnQqIGNhbmNlbGxlZCwgaW50KiBudW1QYXRocyk7CitJTUFRX0ZVTkMgQVZJU2Vzc2lvbiAgSU1BUV9TVERDQUxMIGltYXFPcGVuQVZJKGNvbnN0IGNoYXIqIGZpbGVOYW1lKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICBJTUFRX1NURENBTEwgaW1hcVJlYWRBVklGcmFtZShJbWFnZSogaW1hZ2UsIEFWSVNlc3Npb24gc2Vzc2lvbiwgdW5zaWduZWQgaW50IGZyYW1lTnVtLCB2b2lkKiBkYXRhLCB1bnNpZ25lZCBpbnQqIGRhdGFTaXplKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICBJTUFRX1NURENBTEwgaW1hcVJlYWRGaWxlKEltYWdlKiBpbWFnZSwgY29uc3QgY2hhciogZmlsZU5hbWUsIFJHQlZhbHVlKiBjb2xvclRhYmxlLCBpbnQqIG51bUNvbG9ycyk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFSZWFkVmlzaW9uRmlsZShJbWFnZSogaW1hZ2UsIGNvbnN0IGNoYXIqIGZpbGVOYW1lLCBSR0JWYWx1ZSogY29sb3JUYWJsZSwgaW50KiBudW1Db2xvcnMpOworSU1BUV9GVU5DIGludCAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxV3JpdGVBVklGcmFtZShJbWFnZSogaW1hZ2UsIEFWSVNlc3Npb24gc2Vzc2lvbiwgY29uc3Qgdm9pZCogZGF0YSwgdW5zaWduZWQgaW50IGRhdGFMZW5ndGgpOworSU1BUV9GVU5DIGludCAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxV3JpdGVCTVBGaWxlKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgY2hhciogZmlsZU5hbWUsIGludCBjb21wcmVzcywgY29uc3QgUkdCVmFsdWUqIGNvbG9yVGFibGUpOworSU1BUV9GVU5DIGludCAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxV3JpdGVGaWxlKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgY2hhciogZmlsZU5hbWUsIGNvbnN0IFJHQlZhbHVlKiBjb2xvclRhYmxlKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICBJTUFRX1NURENBTEwgaW1hcVdyaXRlSlBFR0ZpbGUoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBjaGFyKiBmaWxlTmFtZSwgdW5zaWduZWQgaW50IHF1YWxpdHksIHZvaWQqIGNvbG9yVGFibGUpOworSU1BUV9GVU5DIGludCAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxV3JpdGVKUEVHMjAwMEZpbGUoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBjaGFyKiBmaWxlTmFtZSwgaW50IGxvc3NsZXNzLCBmbG9hdCBjb21wcmVzc2lvblJhdGlvLCBjb25zdCBKUEVHMjAwMEZpbGVBZHZhbmNlZE9wdGlvbnMqIGFkdmFuY2VkT3B0aW9ucywgY29uc3QgUkdCVmFsdWUqIGNvbG9yVGFibGUpOworSU1BUV9GVU5DIGludCAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxV3JpdGVQTkdGaWxlMihjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IGNoYXIqIGZpbGVOYW1lLCB1bnNpZ25lZCBpbnQgY29tcHJlc3Npb25TcGVlZCwgY29uc3QgUkdCVmFsdWUqIGNvbG9yVGFibGUsIGludCB1c2VCaXREZXB0aCk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFXcml0ZVRJRkZGaWxlKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgY2hhciogZmlsZU5hbWUsIGNvbnN0IFRJRkZGaWxlT3B0aW9ucyogb3B0aW9ucywgY29uc3QgUkdCVmFsdWUqIGNvbG9yVGFibGUpOworSU1BUV9GVU5DIGludCAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxV3JpdGVWaXNpb25GaWxlKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgY2hhciogZmlsZU5hbWUsIGNvbnN0IFJHQlZhbHVlKiBjb2xvclRhYmxlKTsKKworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBBbmFseXRpYyBHZW9tZXRyeSBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIGludCAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFCdWlsZENvb3JkaW5hdGVTeXN0ZW0oY29uc3QgUG9pbnQqIHBvaW50cywgUmVmZXJlbmNlTW9kZSBtb2RlLCBBeGlzT3JpZW50YXRpb24gb3JpZW50YXRpb24sIENvb3JkaW5hdGVTeXN0ZW0qIHN5c3RlbSk7CitJTUFRX0ZVTkMgQmVzdENpcmNsZTIqICBJTUFRX1NURENBTEwgaW1hcUZpdENpcmNsZTIoY29uc3QgUG9pbnRGbG9hdCogcG9pbnRzLCBpbnQgbnVtUG9pbnRzLCBjb25zdCBGaXRDaXJjbGVPcHRpb25zKiBvcHRpb25zKTsKK0lNQVFfRlVOQyBCZXN0RWxsaXBzZTIqIElNQVFfU1REQ0FMTCBpbWFxRml0RWxsaXBzZTIoY29uc3QgUG9pbnRGbG9hdCogcG9pbnRzLCBpbnQgbnVtUG9pbnRzLCBjb25zdCBGaXRFbGxpcHNlT3B0aW9ucyogb3B0aW9ucyk7CitJTUFRX0ZVTkMgQmVzdExpbmUqICAgICBJTUFRX1NURENBTEwgaW1hcUZpdExpbmUoY29uc3QgUG9pbnRGbG9hdCogcG9pbnRzLCBpbnQgbnVtUG9pbnRzLCBjb25zdCBGaXRMaW5lT3B0aW9ucyogb3B0aW9ucyk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUdldEFuZ2xlKFBvaW50RmxvYXQgc3RhcnQxLCBQb2ludEZsb2F0IGVuZDEsIFBvaW50RmxvYXQgc3RhcnQyLCBQb2ludEZsb2F0IGVuZDIsIGZsb2F0KiBhbmdsZSk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUdldEJpc2VjdGluZ0xpbmUoUG9pbnRGbG9hdCBzdGFydDEsIFBvaW50RmxvYXQgZW5kMSwgUG9pbnRGbG9hdCBzdGFydDIsIFBvaW50RmxvYXQgZW5kMiwgUG9pbnRGbG9hdCogYmlzZWN0U3RhcnQsIFBvaW50RmxvYXQqIGJpc2VjdEVuZCk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUdldERpc3RhbmNlKFBvaW50RmxvYXQgcG9pbnQxLCBQb2ludEZsb2F0IHBvaW50MiwgZmxvYXQqIGRpc3RhbmNlKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxR2V0SW50ZXJzZWN0aW9uKFBvaW50RmxvYXQgc3RhcnQxLCBQb2ludEZsb2F0IGVuZDEsIFBvaW50RmxvYXQgc3RhcnQyLCBQb2ludEZsb2F0IGVuZDIsIFBvaW50RmxvYXQqIGludGVyc2VjdGlvbik7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUdldE1pZExpbmUoUG9pbnRGbG9hdCByZWZMaW5lU3RhcnQsIFBvaW50RmxvYXQgcmVmTGluZUVuZCwgUG9pbnRGbG9hdCBwb2ludCwgUG9pbnRGbG9hdCogbWlkTGluZVN0YXJ0LCBQb2ludEZsb2F0KiBtaWRMaW5lRW5kKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxR2V0UGVycGVuZGljdWxhckxpbmUoUG9pbnRGbG9hdCByZWZMaW5lU3RhcnQsIFBvaW50RmxvYXQgcmVmTGluZUVuZCwgUG9pbnRGbG9hdCBwb2ludCwgUG9pbnRGbG9hdCogcGVycExpbmVTdGFydCwgUG9pbnRGbG9hdCogcGVycExpbmVFbmQsIGRvdWJsZSogZGlzdGFuY2UpOworSU1BUV9GVU5DIFNlZ21lbnRJbmZvKiAgSU1BUV9TVERDQUxMIGltYXFHZXRQb2ludHNPbkNvbnRvdXIoY29uc3QgSW1hZ2UqIGltYWdlLCBpbnQqIG51bVNlZ21lbnRzKTsKK0lNQVFfRlVOQyBQb2ludCogICAgICAgIElNQVFfU1REQ0FMTCBpbWFxR2V0UG9pbnRzT25MaW5lKFBvaW50IHN0YXJ0LCBQb2ludCBlbmQsIGludCogbnVtUG9pbnRzKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxR2V0UG9seWdvbkFyZWEoY29uc3QgUG9pbnRGbG9hdCogcG9pbnRzLCBpbnQgbnVtUG9pbnRzLCBmbG9hdCogYXJlYSk7CitJTUFRX0ZVTkMgZmxvYXQqICAgICAgICBJTUFRX1NURENBTEwgaW1hcUludGVycG9sYXRlUG9pbnRzKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgUG9pbnQqIHBvaW50cywgaW50IG51bVBvaW50cywgSW50ZXJwb2xhdGlvbk1ldGhvZCBtZXRob2QsIGludCBzdWJwaXhlbCwgaW50KiBpbnRlcnBDb3VudCk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIENsaXBib2FyZCBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUNsaXBib2FyZFRvSW1hZ2UoSW1hZ2UqIGRlc3QsIFJHQlZhbHVlKiBwYWxldHRlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFJbWFnZVRvQ2xpcGJvYXJkKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgUkdCVmFsdWUqIHBhbGV0dGUpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBCb3JkZXIgZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFGaWxsQm9yZGVyKEltYWdlKiBpbWFnZSwgQm9yZGVyTWV0aG9kIG1ldGhvZCk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxR2V0Qm9yZGVyU2l6ZShjb25zdCBJbWFnZSogaW1hZ2UsIGludCogYm9yZGVyU2l6ZSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxU2V0Qm9yZGVyU2l6ZShJbWFnZSogaW1hZ2UsIGludCBzaXplKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgSW1hZ2UgTWFuYWdlbWVudCBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIGludCAgICBJTUFRX1NURENBTEwgaW1hcUFycmF5VG9JbWFnZShJbWFnZSogaW1hZ2UsIGNvbnN0IHZvaWQqIGFycmF5LCBpbnQgbnVtQ29scywgaW50IG51bVJvd3MpOworSU1BUV9GVU5DIEltYWdlKiBJTUFRX1NURENBTEwgaW1hcUNyZWF0ZUltYWdlKEltYWdlVHlwZSB0eXBlLCBpbnQgYm9yZGVyU2l6ZSk7CitJTUFRX0ZVTkMgdm9pZCogIElNQVFfU1REQ0FMTCBpbWFxSW1hZ2VUb0FycmF5KGNvbnN0IEltYWdlKiBpbWFnZSwgUmVjdCByZWN0LCBpbnQqIGNvbHVtbnMsIGludCogcm93cyk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIENvbG9yIFByb2Nlc3NpbmcgZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBDb2xvcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxQ2hhbmdlQ29sb3JTcGFjZTIoY29uc3QgQ29sb3IyKiBzb3VyY2VDb2xvciwgQ29sb3JNb2RlIHNvdXJjZVNwYWNlLCBDb2xvck1vZGUgZGVzdFNwYWNlLCBkb3VibGUgb2Zmc2V0LCBjb25zdCBDSUVYWVpWYWx1ZSogd2hpdGVSZWZlcmVuY2UpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFDb2xvckJDR1RyYW5zZm9ybShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgY29uc3QgQkNHT3B0aW9ucyogcmVkT3B0aW9ucywgY29uc3QgQkNHT3B0aW9ucyogZ3JlZW5PcHRpb25zLCBjb25zdCBCQ0dPcHRpb25zKiBibHVlT3B0aW9ucywgY29uc3QgSW1hZ2UqIG1hc2spOworSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFDb2xvckVxdWFsaXplKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBpbnQgY29sb3JFcXVhbGl6YXRpb24pOworSU1BUV9GVU5DIENvbG9ySGlzdG9ncmFtUmVwb3J0KiAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFDb2xvckhpc3RvZ3JhbTIoSW1hZ2UqIGltYWdlLCBpbnQgbnVtQ2xhc3NlcywgQ29sb3JNb2RlIG1vZGUsIGNvbnN0IENJRVhZWlZhbHVlKiB3aGl0ZVJlZmVyZW5jZSwgSW1hZ2UqIG1hc2spOworSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFDb2xvckxvb2t1cChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgQ29sb3JNb2RlIG1vZGUsIGNvbnN0IEltYWdlKiBtYXNrLCBjb25zdCBzaG9ydCogcGxhbmUxLCBjb25zdCBzaG9ydCogcGxhbmUyLCBjb25zdCBzaG9ydCogcGxhbmUzKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxQ29sb3JUaHJlc2hvbGQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGludCByZXBsYWNlVmFsdWUsIENvbG9yTW9kZSBtb2RlLCBjb25zdCBSYW5nZSogcGxhbmUxUmFuZ2UsIGNvbnN0IFJhbmdlKiBwbGFuZTJSYW5nZSwgY29uc3QgUmFuZ2UqIHBsYW5lM1JhbmdlKTsKK0lNQVFfRlVOQyBTdXBlcnZpc2VkQ29sb3JTZWdtZW50YXRpb25SZXBvcnQqIElNQVFfU1REQ0FMTCBpbWFxU3VwZXJ2aXNlZENvbG9yU2VnbWVudGF0aW9uKENsYXNzaWZpZXJTZXNzaW9uKiBzZXNzaW9uLCBJbWFnZSogbGFiZWxJbWFnZSwgY29uc3QgSW1hZ2UqIHNyY0ltYWdlLCBjb25zdCBST0kqIHJvaSwgY29uc3QgUk9JTGFiZWwqIGxhYmVsSW4sIHVuc2lnbmVkIGludCBudW1MYWJlbEluLCBpbnQgbWF4RGlzdGFuY2UsIGludCBtaW5JZGVudGlmaWNhdGlvblNjb3JlLCBjb25zdCBDb2xvclNlZ21lbmF0aW9uT3B0aW9ucyogc2VnbWVudE9wdGlvbnMpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFHZXRDb2xvclNlZ21lbnRhdGlvbk1heERpc3RhbmNlKENsYXNzaWZpZXJTZXNzaW9uKiBzZXNzaW9uLCBjb25zdCBDb2xvclNlZ21lbmF0aW9uT3B0aW9ucyogc2VnbWVudE9wdGlvbnMsIFNlZ21lbnRhdGlvbkRpc3RhbmNlTGV2ZWwgZGlzdExldmVsLCBpbnQqIG1heERpc3RhbmNlKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgVHJhbnNmb3JtIGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxQkNHVHJhbnNmb3JtKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBjb25zdCBCQ0dPcHRpb25zKiBvcHRpb25zLCBjb25zdCBJbWFnZSogbWFzayk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxRXF1YWxpemUoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGZsb2F0IG1pbiwgZmxvYXQgbWF4LCBjb25zdCBJbWFnZSogbWFzayk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxSW52ZXJzZShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgY29uc3QgSW1hZ2UqIG1hc2spOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcU1hdGhUcmFuc2Zvcm0oSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIE1hdGhUcmFuc2Zvcm1NZXRob2QgbWV0aG9kLCBmbG9hdCByYW5nZU1pbiwgZmxvYXQgcmFuZ2VNYXgsIGZsb2F0IHBvd2VyLCBjb25zdCBJbWFnZSogbWFzayk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxV2F0ZXJzaGVkVHJhbnNmb3JtKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBpbnQgY29ubmVjdGl2aXR5OCwgaW50KiB6b25lQ291bnQpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUxvb2t1cDIoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGNvbnN0IGludCogdGFibGUsIGNvbnN0IEltYWdlKiBtYXNrKTsKKworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBXaW5kb3cgTWFuYWdlbWVudCBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIGludCAgIElNQVFfU1REQ0FMTCBpbWFxQXJlU2Nyb2xsYmFyc1Zpc2libGUoaW50IHdpbmRvd051bWJlciwgaW50KiB2aXNpYmxlKTsKK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcUJyaW5nV2luZG93VG9Ub3AoaW50IHdpbmRvd051bWJlcik7CitJTUFRX0ZVTkMgaW50ICAgSU1BUV9TVERDQUxMIGltYXFHZXRNb3VzZVBvcyhQb2ludCogcG9zaXRpb24sIGludCogd2luZG93TnVtYmVyKTsKK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcUdldFdpbmRvd0JhY2tncm91bmQoaW50IHdpbmRvd051bWJlciwgV2luZG93QmFja2dyb3VuZEZpbGxTdHlsZSogZmlsbFN0eWxlLCBXaW5kb3dCYWNrZ3JvdW5kSGF0Y2hTdHlsZSogaGF0Y2hTdHlsZSwgUkdCVmFsdWUqIGZpbGxDb2xvciwgUkdCVmFsdWUqIGJhY2tncm91bmRDb2xvcik7CitJTUFRX0ZVTkMgaW50ICAgSU1BUV9TVERDQUxMIGltYXFHZXRXaW5kb3dEaXNwbGF5TWFwcGluZyhpbnQgd2luZG93TnVtLCBEaXNwbGF5TWFwcGluZyogbWFwcGluZyk7CitJTUFRX0ZVTkMgaW50ICAgSU1BUV9TVERDQUxMIGltYXFHZXRXaW5kb3dHcmlkKGludCB3aW5kb3dOdW1iZXIsIGludCogeFJlc29sdXRpb24sIGludCogeVJlc29sdXRpb24pOworSU1BUV9GVU5DIGludCAgIElNQVFfU1REQ0FMTCBpbWFxR2V0V2luZG93SGFuZGxlKGludCogaGFuZGxlKTsKK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcUdldFdpbmRvd1BvcyhpbnQgd2luZG93TnVtYmVyLCBQb2ludCogcG9zaXRpb24pOworSU1BUV9GVU5DIGludCAgIElNQVFfU1REQ0FMTCBpbWFxR2V0V2luZG93U2l6ZShpbnQgd2luZG93TnVtYmVyLCBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCk7CitJTUFRX0ZVTkMgY2hhciogSU1BUV9TVERDQUxMIGltYXFHZXRXaW5kb3dUaXRsZShpbnQgd2luZG93TnVtYmVyKTsKK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcUdldFdpbmRvd1pvb20yKGludCB3aW5kb3dOdW1iZXIsIGZsb2F0KiB4Wm9vbSwgZmxvYXQqIHlab29tKTsKK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcUlzV2luZG93Tm9uVGVhcmluZyhpbnQgd2luZG93TnVtYmVyLCBpbnQqIG5vblRlYXJpbmcpOworSU1BUV9GVU5DIGludCAgIElNQVFfU1REQ0FMTCBpbWFxSXNXaW5kb3dWaXNpYmxlKGludCB3aW5kb3dOdW1iZXIsIGludCogdmlzaWJsZSk7CitJTUFRX0ZVTkMgaW50ICAgSU1BUV9TVERDQUxMIGltYXFNb3ZlV2luZG93KGludCB3aW5kb3dOdW1iZXIsIFBvaW50IHBvc2l0aW9uKTsKK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcVNldHVwV2luZG93KGludCB3aW5kb3dOdW1iZXIsIGludCBjb25maWd1cmF0aW9uKTsKK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcVNldFdpbmRvd0JhY2tncm91bmQoaW50IHdpbmRvd051bWJlciwgV2luZG93QmFja2dyb3VuZEZpbGxTdHlsZSBmaWxsU3R5bGUsIFdpbmRvd0JhY2tncm91bmRIYXRjaFN0eWxlIGhhdGNoU3R5bGUsIGNvbnN0IFJHQlZhbHVlKiBmaWxsQ29sb3IsIGNvbnN0IFJHQlZhbHVlKiBiYWNrZ3JvdW5kQ29sb3IpOworSU1BUV9GVU5DIGludCAgIElNQVFfU1REQ0FMTCBpbWFxU2V0V2luZG93RGlzcGxheU1hcHBpbmcoaW50IHdpbmRvd051bWJlciwgY29uc3QgRGlzcGxheU1hcHBpbmcqIG1hcHBpbmcpOworSU1BUV9GVU5DIGludCAgIElNQVFfU1REQ0FMTCBpbWFxU2V0V2luZG93R3JpZChpbnQgd2luZG93TnVtYmVyLCBpbnQgeFJlc29sdXRpb24sIGludCB5UmVzb2x1dGlvbik7CitJTUFRX0ZVTkMgaW50ICAgSU1BUV9TVERDQUxMIGltYXFTZXRXaW5kb3dNYXhDb250b3VyQ291bnQoaW50IHdpbmRvd051bWJlciwgdW5zaWduZWQgaW50IG1heENvbnRvdXJDb3VudCk7CitJTUFRX0ZVTkMgaW50ICAgSU1BUV9TVERDQUxMIGltYXFTZXRXaW5kb3dOb25UZWFyaW5nKGludCB3aW5kb3dOdW1iZXIsIGludCBub25UZWFyaW5nKTsKK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcVNldFdpbmRvd1BhbGV0dGUoaW50IHdpbmRvd051bWJlciwgUGFsZXR0ZVR5cGUgdHlwZSwgY29uc3QgUkdCVmFsdWUqIHBhbGV0dGUsIGludCBudW1Db2xvcnMpOworSU1BUV9GVU5DIGludCAgIElNQVFfU1REQ0FMTCBpbWFxU2V0V2luZG93U2l6ZShpbnQgd2luZG93TnVtYmVyLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworSU1BUV9GVU5DIGludCAgIElNQVFfU1REQ0FMTCBpbWFxU2V0V2luZG93VGhyZWFkUG9saWN5KFdpbmRvd1RocmVhZFBvbGljeSBwb2xpY3kpOworSU1BUV9GVU5DIGludCAgIElNQVFfU1REQ0FMTCBpbWFxU2V0V2luZG93VGl0bGUoaW50IHdpbmRvd051bWJlciwgY29uc3QgY2hhciogdGl0bGUpOworSU1BUV9GVU5DIGludCAgIElNQVFfU1REQ0FMTCBpbWFxU2V0V2luZG93Wm9vbVRvRml0KGludCB3aW5kb3dOdW1iZXIsIGludCB6b29tVG9GaXQpOworSU1BUV9GVU5DIGludCAgIElNQVFfU1REQ0FMTCBpbWFxU2hvd1Njcm9sbGJhcnMoaW50IHdpbmRvd051bWJlciwgaW50IHZpc2libGUpOworSU1BUV9GVU5DIGludCAgIElNQVFfU1REQ0FMTCBpbWFxWm9vbVdpbmRvdzIoaW50IHdpbmRvd051bWJlciwgZmxvYXQgeFpvb20sIGZsb2F0IHlab29tLCBQb2ludCBjZW50ZXIpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBVdGlsaXRpZXMgZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBjb25zdCBmbG9hdCogSU1BUV9TVERDQUxMIGltYXFHZXRLZXJuZWwoS2VybmVsRmFtaWx5IGZhbWlseSwgaW50IHNpemUsIGludCBudW1iZXIpOworSU1BUV9GVU5DIEFubnVsdXMgICAgICBJTUFRX1NURENBTEwgaW1hcU1ha2VBbm51bHVzKFBvaW50IGNlbnRlciwgaW50IGlubmVyUmFkaXVzLCBpbnQgb3V0ZXJSYWRpdXMsIGRvdWJsZSBzdGFydEFuZ2xlLCBkb3VibGUgZW5kQW5nbGUpOworSU1BUV9GVU5DIFBvaW50ICAgICAgICBJTUFRX1NURENBTEwgaW1hcU1ha2VQb2ludChpbnQgeENvb3JkaW5hdGUsIGludCB5Q29vcmRpbmF0ZSk7CitJTUFRX0ZVTkMgUG9pbnRGbG9hdCAgIElNQVFfU1REQ0FMTCBpbWFxTWFrZVBvaW50RmxvYXQoZmxvYXQgeENvb3JkaW5hdGUsIGZsb2F0IHlDb29yZGluYXRlKTsKK0lNQVFfRlVOQyBSZWN0ICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFNYWtlUmVjdChpbnQgdG9wLCBpbnQgbGVmdCwgaW50IGhlaWdodCwgaW50IHdpZHRoKTsKK0lNQVFfRlVOQyBSZWN0ICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFNYWtlUmVjdEZyb21Sb3RhdGVkUmVjdChSb3RhdGVkUmVjdCByb3RhdGVkUmVjdCk7CitJTUFRX0ZVTkMgUm90YXRlZFJlY3QgIElNQVFfU1REQ0FMTCBpbWFxTWFrZVJvdGF0ZWRSZWN0KGludCB0b3AsIGludCBsZWZ0LCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsIGRvdWJsZSBhbmdsZSk7CitJTUFRX0ZVTkMgUm90YXRlZFJlY3QgIElNQVFfU1REQ0FMTCBpbWFxTWFrZVJvdGF0ZWRSZWN0RnJvbVJlY3QoUmVjdCByZWN0KTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFNdWx0aWNvcmVPcHRpb25zKE11bHRpY29yZU9wZXJhdGlvbiBvcGVyYXRpb24sIHVuc2lnbmVkIGludCogY3VzdG9tTnVtQ29yZXMpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBUb29sIFdpbmRvdyBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIGludCAgIElNQVFfU1REQ0FMTCBpbWFxQ2xvc2VUb29sV2luZG93KHZvaWQpOworSU1BUV9GVU5DIGludCAgIElNQVFfU1REQ0FMTCBpbWFxR2V0Q3VycmVudFRvb2woVG9vbCogY3VycmVudFRvb2wpOworSU1BUV9GVU5DIGludCAgIElNQVFfU1REQ0FMTCBpbWFxR2V0TGFzdEV2ZW50KFdpbmRvd0V2ZW50VHlwZSogdHlwZSwgaW50KiB3aW5kb3dOdW1iZXIsIFRvb2wqIHRvb2wsIFJlY3QqIHJlY3QpOworSU1BUV9GVU5DIHZvaWQqIElNQVFfU1REQ0FMTCBpbWFxR2V0VG9vbFdpbmRvd0hhbmRsZSh2b2lkKTsKK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcUdldFRvb2xXaW5kb3dQb3MoUG9pbnQqIHBvc2l0aW9uKTsKK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcUlzVG9vbFdpbmRvd1Zpc2libGUoaW50KiB2aXNpYmxlKTsKK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcU1vdmVUb29sV2luZG93KFBvaW50IHBvc2l0aW9uKTsKK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcVNldEN1cnJlbnRUb29sKFRvb2wgY3VycmVudFRvb2wpOworI2lmbmRlZiBfX0dOVUNfXworSU1BUV9GVU5DIGludCAgIElNQVFfU1REQ0FMTCBpbWFxU2V0RXZlbnRDYWxsYmFjayhFdmVudENhbGxiYWNrIGNhbGxiYWNrLCBpbnQgc3luY2hyb25vdXMpOworI2VuZGlmCitJTUFRX0ZVTkMgaW50ICAgSU1BUV9TVERDQUxMIGltYXFTZXRUb29sQ29sb3IoY29uc3QgUkdCVmFsdWUqIGNvbG9yKTsKK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcVNldHVwVG9vbFdpbmRvdyhpbnQgc2hvd0Nvb3JkaW5hdGVzLCBpbnQgbWF4SWNvbnNQZXJMaW5lLCBjb25zdCBUb29sV2luZG93T3B0aW9ucyogb3B0aW9ucyk7CitJTUFRX0ZVTkMgaW50ICAgSU1BUV9TVERDQUxMIGltYXFTaG93VG9vbFdpbmRvdyhpbnQgdmlzaWJsZSk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIE1ldGVyIGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgTWV0ZXJBcmMqIElNQVFfU1REQ0FMTCBpbWFxR2V0TWV0ZXJBcmMoaW50IGxpZ2h0TmVlZGxlLCBNZXRlckFyY01vZGUgbW9kZSwgY29uc3QgUk9JKiByb2ksIFBvaW50RmxvYXQgYmFzZSwgUG9pbnRGbG9hdCBzdGFydCwgUG9pbnRGbG9hdCBlbmQpOworSU1BUV9GVU5DIGludCAgICAgICBJTUFRX1NURENBTEwgaW1hcVJlYWRNZXRlcihjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IE1ldGVyQXJjKiBhcmNJbmZvLCBkb3VibGUqIHBlcmNlbnRhZ2UsIFBvaW50RmxvYXQqIGVuZE9mTmVlZGxlKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgQ2FsaWJyYXRpb24gZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUNvcHlDYWxpYnJhdGlvbkluZm8yKEltYWdlKiBkZXN0LCBJbWFnZSogc291cmNlLCBQb2ludCBvZmZzZXQpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxQ29ycmVjdENhbGlicmF0ZWRJbWFnZShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgUGl4ZWxWYWx1ZSBmaWxsLCBJbnRlcnBvbGF0aW9uTWV0aG9kIG1ldGhvZCwgY29uc3QgUk9JKiByb2kpOworSU1BUV9GVU5DIENhbGlicmF0aW9uSW5mbyogICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxR2V0Q2FsaWJyYXRpb25JbmZvMihjb25zdCBJbWFnZSogaW1hZ2UpOworSU1BUV9GVU5DIENhbGlicmF0aW9uSW5mbyogICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxR2V0Q2FsaWJyYXRpb25JbmZvMyhJbWFnZSogaW1hZ2UsIHVuc2lnbmVkIGludCBpc0dldEVycm9yTWFwKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUxlYXJuQ2FsaWJyYXRpb25HcmlkKEltYWdlKiBpbWFnZSwgY29uc3QgUk9JKiByb2ksIGNvbnN0IExlYXJuQ2FsaWJyYXRpb25PcHRpb25zKiBvcHRpb25zLCBjb25zdCBHcmlkRGVzY3JpcHRvciogZ3JpZCwgY29uc3QgQ29vcmRpbmF0ZVN5c3RlbSogc3lzdGVtLCBjb25zdCBSYW5nZUZsb2F0KiByYW5nZSwgZmxvYXQqIHF1YWxpdHkpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxTGVhcm5DYWxpYnJhdGlvblBvaW50cyhJbWFnZSogaW1hZ2UsIGNvbnN0IENhbGlicmF0aW9uUG9pbnRzKiBwb2ludHMsIGNvbnN0IFJPSSogcm9pLCBjb25zdCBMZWFybkNhbGlicmF0aW9uT3B0aW9ucyogb3B0aW9ucywgY29uc3QgR3JpZERlc2NyaXB0b3IqIGdyaWQsIGNvbnN0IENvb3JkaW5hdGVTeXN0ZW0qIHN5c3RlbSwgZmxvYXQqIHF1YWxpdHkpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxU2V0Q29vcmRpbmF0ZVN5c3RlbShJbWFnZSogaW1hZ2UsIGNvbnN0IENvb3JkaW5hdGVTeXN0ZW0qIHN5c3RlbSk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFTZXRTaW1wbGVDYWxpYnJhdGlvbihJbWFnZSogaW1hZ2UsIFNjYWxpbmdNZXRob2QgbWV0aG9kLCBpbnQgbGVhcm5UYWJsZSwgY29uc3QgR3JpZERlc2NyaXB0b3IqIGdyaWQsIGNvbnN0IENvb3JkaW5hdGVTeXN0ZW0qIHN5c3RlbSk7CitJTUFRX0ZVTkMgVHJhbnNmb3JtUmVwb3J0KiAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFUcmFuc2Zvcm1QaXhlbFRvUmVhbFdvcmxkKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgUG9pbnRGbG9hdCogcGl4ZWxDb29yZGluYXRlcywgaW50IG51bUNvb3JkaW5hdGVzKTsKK0lNQVFfRlVOQyBUcmFuc2Zvcm1SZXBvcnQqICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcVRyYW5zZm9ybVJlYWxXb3JsZFRvUGl4ZWwoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBQb2ludEZsb2F0KiByZWFsV29ybGRDb29yZGluYXRlcywgaW50IG51bUNvb3JkaW5hdGVzKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcVNldFNpbXBsZUNhbGlicmF0aW9uMihJbWFnZSogaW1hZ2UsIGNvbnN0IEdyaWREZXNjcmlwdG9yKiBncmlkRGVzY3JpcHRvcik7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFDYWxpYnJhdGlvblNldEF4aXNJbmZvKEltYWdlKiBpbWFnZSwgQ29vcmRpbmF0ZVN5c3RlbSogYXhpc0luZm8pOworSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxQ2FsaWJyYXRpb25HZXRUaHVtYm5haWxJbWFnZShJbWFnZSogdGVtcGxhdGVJbWFnZSwgSW1hZ2UqIGltYWdlLCBDYWxpYnJhdGlvblRodW1ibmFpbFR5cGUgdHlwZSwgdW5zaWduZWQgaW50IGluZGV4KTsKK0lNQVFfRlVOQyBHZXRDYWxpYnJhdGlvbkluZm9SZXBvcnQqICBJTUFRX1NURENBTEwgaW1hcUNhbGlicmF0aW9uR2V0Q2FsaWJyYXRpb25JbmZvKEltYWdlKiBpbWFnZSwgdW5zaWduZWQgaW50IGlzR2V0RXJyb3JNYXApOworSU1BUV9GVU5DIEdldENhbWVyYVBhcmFtZXRlcnNSZXBvcnQqIElNQVFfU1REQ0FMTCBpbWFxQ2FsaWJyYXRpb25HZXRDYW1lcmFQYXJhbWV0ZXJzKEltYWdlKiB0ZW1wbGF0ZUltYWdlKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUNhbGlicmF0aW9uQ29tcGFjdEluZm9ybWF0aW9uKEltYWdlKiBpbWFnZSk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIFBpeGVsIE1hbmlwdWxhdGlvbiBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIGludCAgICBJTUFRX1NURENBTEwgaW1hcUFycmF5VG9Db21wbGV4UGxhbmUoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGNvbnN0IGZsb2F0KiBuZXdQaXhlbHMsIENvbXBsZXhQbGFuZSBwbGFuZSk7CitJTUFRX0ZVTkMgZmxvYXQqIElNQVFfU1REQ0FMTCBpbWFxQ29tcGxleFBsYW5lVG9BcnJheShjb25zdCBJbWFnZSogaW1hZ2UsIENvbXBsZXhQbGFuZSBwbGFuZSwgUmVjdCByZWN0LCBpbnQqIHJvd3MsIGludCogY29sdW1ucyk7CitJTUFRX0ZVTkMgaW50ICAgIElNQVFfU1REQ0FMTCBpbWFxRXh0cmFjdENvbG9yUGxhbmVzKGNvbnN0IEltYWdlKiBpbWFnZSwgQ29sb3JNb2RlIG1vZGUsIEltYWdlKiBwbGFuZTEsIEltYWdlKiBwbGFuZTIsIEltYWdlKiBwbGFuZTMpOworSU1BUV9GVU5DIGludCAgICBJTUFRX1NURENBTEwgaW1hcUV4dHJhY3RDb21wbGV4UGxhbmUoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIENvbXBsZXhQbGFuZSBwbGFuZSk7CitJTUFRX0ZVTkMgaW50ICAgIElNQVFfU1REQ0FMTCBpbWFxRmlsbEltYWdlKEltYWdlKiBpbWFnZSwgUGl4ZWxWYWx1ZSB2YWx1ZSwgY29uc3QgSW1hZ2UqIG1hc2spOworSU1BUV9GVU5DIHZvaWQqICBJTUFRX1NURENBTEwgaW1hcUdldExpbmUoY29uc3QgSW1hZ2UqIGltYWdlLCBQb2ludCBzdGFydCwgUG9pbnQgZW5kLCBpbnQqIG51bVBvaW50cyk7CitJTUFRX0ZVTkMgaW50ICAgIElNQVFfU1REQ0FMTCBpbWFxR2V0UGl4ZWwoY29uc3QgSW1hZ2UqIGltYWdlLCBQb2ludCBwaXhlbCwgUGl4ZWxWYWx1ZSogdmFsdWUpOworSU1BUV9GVU5DIGludCAgICBJTUFRX1NURENBTEwgaW1hcVJlcGxhY2VDb2xvclBsYW5lcyhJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgQ29sb3JNb2RlIG1vZGUsIGNvbnN0IEltYWdlKiBwbGFuZTEsIGNvbnN0IEltYWdlKiBwbGFuZTIsIGNvbnN0IEltYWdlKiBwbGFuZTMpOworSU1BUV9GVU5DIGludCAgICBJTUFRX1NURENBTEwgaW1hcVJlcGxhY2VDb21wbGV4UGxhbmUoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGNvbnN0IEltYWdlKiBuZXdWYWx1ZXMsIENvbXBsZXhQbGFuZSBwbGFuZSk7CitJTUFRX0ZVTkMgaW50ICAgIElNQVFfU1REQ0FMTCBpbWFxU2V0TGluZShJbWFnZSogaW1hZ2UsIGNvbnN0IHZvaWQqIGFycmF5LCBpbnQgYXJyYXlTaXplLCBQb2ludCBzdGFydCwgUG9pbnQgZW5kKTsKK0lNQVFfRlVOQyBpbnQgICAgSU1BUV9TVERDQUxMIGltYXFTZXRQaXhlbChJbWFnZSogaW1hZ2UsIFBvaW50IGNvb3JkLCBQaXhlbFZhbHVlIHZhbHVlKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgQ29sb3IgTWF0Y2hpbmcgZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBDb2xvckluZm9ybWF0aW9uKiBJTUFRX1NURENBTEwgaW1hcUxlYXJuQ29sb3IoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBST0kqIHJvaSwgQ29sb3JTZW5zaXRpdml0eSBzZW5zaXRpdml0eSwgaW50IHNhdHVyYXRpb24pOworSU1BUV9GVU5DIGludCogICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxTWF0Y2hDb2xvcihjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IENvbG9ySW5mb3JtYXRpb24qIGluZm8sIGNvbnN0IFJPSSogcm9pLCBpbnQqIG51bVNjb3Jlcyk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIEZyZXF1ZW5jeSBEb21haW4gQW5hbHlzaXMgZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFBdHRlbnVhdGUoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIEF0dGVudWF0ZU1vZGUgaGlnaGxvdyk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxQ29uanVnYXRlKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFGRlQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUZsaXBGcmVxdWVuY2llcyhJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxSW52ZXJzZUZGVChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxVHJ1bmNhdGUoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIFRydW5jYXRlTW9kZSBoaWdobG93LCBmbG9hdCByYXRpb1RvS2VlcCk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIEJhcmNvZGUgSS9PIGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFHcmFkZURhdGFNYXRyaXhCYXJjb2RlQUlNKGNvbnN0IEltYWdlKiBpbWFnZSwgQUlNR3JhZGVSZXBvcnQqIHJlcG9ydCk7CitJTUFRX0ZVTkMgQmFyY29kZUluZm8qICAgICAgSU1BUV9TVERDQUxMIGltYXFSZWFkQmFyY29kZShjb25zdCBJbWFnZSogaW1hZ2UsIEJhcmNvZGVUeXBlIHR5cGUsIGNvbnN0IFJPSSogcm9pLCBpbnQgdmFsaWRhdGUpOworSU1BUV9GVU5DIERhdGFNYXRyaXhSZXBvcnQqIElNQVFfU1REQ0FMTCBpbWFxUmVhZERhdGFNYXRyaXhCYXJjb2RlMihJbWFnZSogaW1hZ2UsIGNvbnN0IFJPSSogcm9pLCBEYXRhTWF0cml4R3JhZGluZ01vZGUgcHJlcGFyZUZvckdyYWRpbmcsIGNvbnN0IERhdGFNYXRyaXhEZXNjcmlwdGlvbk9wdGlvbnMqIGRlc2NyaXB0aW9uT3B0aW9ucywgY29uc3QgRGF0YU1hdHJpeFNpemVPcHRpb25zKiBzaXplT3B0aW9ucywgY29uc3QgRGF0YU1hdHJpeFNlYXJjaE9wdGlvbnMqIHNlYXJjaE9wdGlvbnMpOworSU1BUV9GVU5DIEJhcmNvZGUyREluZm8qICAgIElNQVFfU1REQ0FMTCBpbWFxUmVhZFBERjQxN0JhcmNvZGUoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBST0kqIHJvaSwgQmFyY29kZTJEU2VhcmNoTW9kZSBzZWFyY2hNb2RlLCB1bnNpZ25lZCBpbnQqIG51bUJhcmNvZGVzKTsKK0lNQVFfRlVOQyBRUkNvZGVSZXBvcnQqICAgICBJTUFRX1NURENBTEwgaW1hcVJlYWRRUkNvZGUoSW1hZ2UqIGltYWdlLCBjb25zdCBST0kqIHJvaSwgUVJHcmFkaW5nTW9kZSByZXNlcnZlZCwgY29uc3QgUVJDb2RlRGVzY3JpcHRpb25PcHRpb25zKiBkZXNjcmlwdGlvbk9wdGlvbnMsIGNvbnN0IFFSQ29kZVNpemVPcHRpb25zKiBzaXplT3B0aW9ucywgY29uc3QgUVJDb2RlU2VhcmNoT3B0aW9ucyogc2VhcmNoT3B0aW9ucyk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIExDRCBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIGludCAgICAgICAgSU1BUV9TVERDQUxMIGltYXFGaW5kTENEU2VnbWVudHMoUk9JKiByb2ksIGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgTENET3B0aW9ucyogb3B0aW9ucyk7CitJTUFRX0ZVTkMgTENEUmVwb3J0KiBJTUFRX1NURENBTEwgaW1hcVJlYWRMQ0QoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBST0kqIHJvaSwgY29uc3QgTENET3B0aW9ucyogb3B0aW9ucyk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIFNoYXBlIE1hdGNoaW5nIGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgU2hhcGVSZXBvcnQqIElNQVFfU1REQ0FMTCBpbWFxTWF0Y2hTaGFwZShJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSwgY29uc3QgSW1hZ2UqIHRlbXBsYXRlSW1hZ2UsIGludCBzY2FsZUludmFyaWFudCwgaW50IGNvbm5lY3Rpdml0eTgsIGRvdWJsZSB0b2xlcmFuY2UsIGludCogbnVtTWF0Y2hlcyk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIENvbnRvdXJzIGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgQ29udG91cklEICAgICBJTUFRX1NURENBTEwgaW1hcUFkZEFubnVsdXNDb250b3VyKFJPSSogcm9pLCBBbm51bHVzIGFubnVsdXMpOworSU1BUV9GVU5DIENvbnRvdXJJRCAgICAgSU1BUV9TVERDQUxMIGltYXFBZGRDbG9zZWRDb250b3VyKFJPSSogcm9pLCBjb25zdCBQb2ludCogcG9pbnRzLCBpbnQgbnVtUG9pbnRzKTsKK0lNQVFfRlVOQyBDb250b3VySUQgICAgIElNQVFfU1REQ0FMTCBpbWFxQWRkTGluZUNvbnRvdXIoUk9JKiByb2ksIFBvaW50IHN0YXJ0LCBQb2ludCBlbmQpOworSU1BUV9GVU5DIENvbnRvdXJJRCAgICAgSU1BUV9TVERDQUxMIGltYXFBZGRPcGVuQ29udG91cihST0kqIHJvaSwgY29uc3QgUG9pbnQqIHBvaW50cywgaW50IG51bVBvaW50cyk7CitJTUFRX0ZVTkMgQ29udG91cklEICAgICBJTUFRX1NURENBTEwgaW1hcUFkZE92YWxDb250b3VyKFJPSSogcm9pLCBSZWN0IGJvdW5kaW5nQm94KTsKK0lNQVFfRlVOQyBDb250b3VySUQgICAgIElNQVFfU1REQ0FMTCBpbWFxQWRkUG9pbnRDb250b3VyKFJPSSogcm9pLCBQb2ludCBwb2ludCk7CitJTUFRX0ZVTkMgQ29udG91cklEICAgICBJTUFRX1NURENBTEwgaW1hcUFkZFJlY3RDb250b3VyKFJPSSogcm9pLCBSZWN0IHJlY3QpOworSU1BUV9GVU5DIENvbnRvdXJJRCAgICAgSU1BUV9TVERDQUxMIGltYXFBZGRSb3RhdGVkUmVjdENvbnRvdXIyKFJPSSogcm9pLCBSb3RhdGVkUmVjdCByZWN0KTsKK0lNQVFfRlVOQyBDb250b3VySUQgICAgIElNQVFfU1REQ0FMTCBpbWFxQ29weUNvbnRvdXIoUk9JKiBkZXN0Um9pLCBjb25zdCBST0kqIHNvdXJjZVJvaSwgQ29udG91cklEIGlkKTsKK0lNQVFfRlVOQyBDb250b3VySUQgICAgIElNQVFfU1REQ0FMTCBpbWFxR2V0Q29udG91cihjb25zdCBST0kqIHJvaSwgdW5zaWduZWQgaW50IGluZGV4KTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxR2V0Q29udG91ckNvbG9yKGNvbnN0IFJPSSogcm9pLCBDb250b3VySUQgaWQsIFJHQlZhbHVlKiBjb250b3VyQ29sb3IpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFHZXRDb250b3VyQ291bnQoY29uc3QgUk9JKiByb2kpOworSU1BUV9GVU5DIENvbnRvdXJJbmZvMiogSU1BUV9TVERDQUxMIGltYXFHZXRDb250b3VySW5mbzIoY29uc3QgUk9JKiByb2ksIENvbnRvdXJJRCBpZCk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcU1vdmVDb250b3VyKFJPSSogcm9pLCBDb250b3VySUQgaWQsIGludCBkZWx0YVgsIGludCBkZWx0YVkpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFSZW1vdmVDb250b3VyKFJPSSogcm9pLCBDb250b3VySUQgaWQpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFTZXRDb250b3VyQ29sb3IoUk9JKiByb2ksIENvbnRvdXJJRCBpZCwgY29uc3QgUkdCVmFsdWUqIGNvbG9yKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgUmVnaW9ucyBvZiBJbnRlcmVzdCBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIGludCAgSU1BUV9TVERDQUxMIGltYXFDb25zdHJ1Y3RST0kyKGNvbnN0IEltYWdlKiBpbWFnZSwgUk9JKiByb2ksIFRvb2wgaW5pdGlhbFRvb2wsIGNvbnN0IFRvb2xXaW5kb3dPcHRpb25zKiB0b29scywgY29uc3QgQ29uc3RydWN0Uk9JT3B0aW9uczIqIG9wdGlvbnMsIGludCogb2theSk7CitJTUFRX0ZVTkMgUk9JKiBJTUFRX1NURENBTEwgaW1hcUNyZWF0ZVJPSSh2b2lkKTsKK0lNQVFfRlVOQyBpbnQgIElNQVFfU1REQ0FMTCBpbWFxR2V0Uk9JQm91bmRpbmdCb3goY29uc3QgUk9JKiByb2ksIFJlY3QqIGJvdW5kaW5nQm94KTsKK0lNQVFfRlVOQyBpbnQgIElNQVFfU1REQ0FMTCBpbWFxR2V0Uk9JQ29sb3IoY29uc3QgUk9JKiByb2ksIFJHQlZhbHVlKiByb2lDb2xvcik7CitJTUFRX0ZVTkMgUk9JKiBJTUFRX1NURENBTEwgaW1hcUdldFdpbmRvd1JPSShpbnQgd2luZG93TnVtYmVyKTsKK0lNQVFfRlVOQyBpbnQgIElNQVFfU1REQ0FMTCBpbWFxU2V0Uk9JQ29sb3IoUk9JKiByb2ksIGNvbnN0IFJHQlZhbHVlKiBjb2xvcik7CitJTUFRX0ZVTkMgaW50ICBJTUFRX1NURENBTEwgaW1hcVNldFdpbmRvd1JPSShpbnQgd2luZG93TnVtYmVyLCBjb25zdCBST0kqIHJvaSk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIEltYWdlIEFuYWx5c2lzIGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUNlbnRyb2lkKGNvbnN0IEltYWdlKiBpbWFnZSwgUG9pbnRGbG9hdCogY2VudHJvaWQsIGNvbnN0IEltYWdlKiBtYXNrKTsKK0lNQVFfRlVOQyBDdXJ2ZSogICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxRXh0cmFjdEN1cnZlcyhjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IFJPSSogcm9pLCBjb25zdCBDdXJ2ZU9wdGlvbnMqIGN1cnZlT3B0aW9ucywgdW5zaWduZWQgaW50KiBudW1DdXJ2ZXMpOworSU1BUV9GVU5DIEhpc3RvZ3JhbVJlcG9ydCogSU1BUV9TVERDQUxMIGltYXFIaXN0b2dyYW0oY29uc3QgSW1hZ2UqIGltYWdlLCBpbnQgbnVtQ2xhc3NlcywgZmxvYXQgbWluLCBmbG9hdCBtYXgsIGNvbnN0IEltYWdlKiBtYXNrKTsKK0lNQVFfRlVOQyBMaW5lYXJBdmVyYWdlcyogIElNQVFfU1REQ0FMTCBpbWFxTGluZWFyQXZlcmFnZXMyKEltYWdlKiBpbWFnZSwgTGluZWFyQXZlcmFnZXNNb2RlIG1vZGUsIFJlY3QgcmVjdCk7CitJTUFRX0ZVTkMgTGluZVByb2ZpbGUqICAgICBJTUFRX1NURENBTEwgaW1hcUxpbmVQcm9maWxlKGNvbnN0IEltYWdlKiBpbWFnZSwgUG9pbnQgc3RhcnQsIFBvaW50IGVuZCk7CitJTUFRX0ZVTkMgUXVhbnRpZnlSZXBvcnQqICBJTUFRX1NURENBTEwgaW1hcVF1YW50aWZ5KGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgSW1hZ2UqIG1hc2spOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBFcnJvciBNYW5hZ2VtZW50IGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgaW50ICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFDbGVhckVycm9yKHZvaWQpOworSU1BUV9GVU5DIGNoYXIqICAgICAgIElNQVFfU1REQ0FMTCBpbWFxR2V0RXJyb3JUZXh0KGludCBlcnJvckNvZGUpOworSU1BUV9GVU5DIGludCAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxR2V0TGFzdEVycm9yKHZvaWQpOworSU1BUV9GVU5DIGNvbnN0IGNoYXIqIElNQVFfU1REQ0FMTCBpbWFxR2V0TGFzdEVycm9yRnVuYyh2b2lkKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICBJTUFRX1NURENBTEwgaW1hcVNldEVycm9yKGludCBlcnJvckNvZGUsIGNvbnN0IGNoYXIqIGZ1bmN0aW9uKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgVGhyZXNob2xkIGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgVGhyZXNob2xkRGF0YSogSU1BUV9TVERDQUxMIGltYXFBdXRvVGhyZXNob2xkMihJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgaW50IG51bUNsYXNzZXMsIFRocmVzaG9sZE1ldGhvZCBtZXRob2QsIGNvbnN0IEltYWdlKiBtYXNrKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUxvY2FsVGhyZXNob2xkKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCB1bnNpZ25lZCBpbnQgd2luZG93V2lkdGgsIHVuc2lnbmVkIGludCB3aW5kb3dIZWlnaHQsIExvY2FsVGhyZXNob2xkTWV0aG9kIG1ldGhvZCwgZG91YmxlIGRldmlhdGlvbldlaWdodCwgT2JqZWN0VHlwZSB0eXBlLCBmbG9hdCByZXBsYWNlVmFsdWUpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxTWFnaWNXYW5kKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBQb2ludCBjb29yZCwgZmxvYXQgdG9sZXJhbmNlLCBpbnQgY29ubmVjdGl2aXR5OCwgZmxvYXQgcmVwbGFjZVZhbHVlKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcU11bHRpdGhyZXNob2xkKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBjb25zdCBUaHJlc2hvbGREYXRhKiByYW5nZXMsIGludCBudW1SYW5nZXMpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxVGhyZXNob2xkKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBmbG9hdCByYW5nZU1pbiwgZmxvYXQgcmFuZ2VNYXgsIGludCB1c2VOZXdWYWx1ZSwgZmxvYXQgbmV3VmFsdWUpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBNZW1vcnkgTWFuYWdlbWVudCBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcURpc3Bvc2Uodm9pZCogb2JqZWN0KTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgUGF0dGVybiBNYXRjaGluZyBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIENpcmNsZU1hdGNoKiAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFEZXRlY3RDaXJjbGVzKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgQ2lyY2xlRGVzY3JpcHRvciogY2lyY2xlRGVzY3JpcHRvciwgY29uc3QgQ3VydmVPcHRpb25zKiBjdXJ2ZU9wdGlvbnMsIGNvbnN0IFNoYXBlRGV0ZWN0aW9uT3B0aW9ucyogc2hhcGVEZXRlY3Rpb25PcHRpb25zLCBjb25zdCBST0kqIHJvaSwgaW50KiBudW1NYXRjaGVzUmV0dXJuZWQpOworSU1BUV9GVU5DIEVsbGlwc2VNYXRjaCogICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFEZXRlY3RFbGxpcHNlcyhjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IEVsbGlwc2VEZXNjcmlwdG9yKiBlbGxpcHNlRGVzY3JpcHRvciwgY29uc3QgQ3VydmVPcHRpb25zKiBjdXJ2ZU9wdGlvbnMsIGNvbnN0IFNoYXBlRGV0ZWN0aW9uT3B0aW9ucyogc2hhcGVEZXRlY3Rpb25PcHRpb25zLCBjb25zdCBST0kqIHJvaSwgaW50KiBudW1NYXRjaGVzUmV0dXJuZWQpOworSU1BUV9GVU5DIExpbmVNYXRjaCogICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFEZXRlY3RMaW5lcyhjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IExpbmVEZXNjcmlwdG9yKiBsaW5lRGVzY3JpcHRvciwgY29uc3QgQ3VydmVPcHRpb25zKiBjdXJ2ZU9wdGlvbnMsIGNvbnN0IFNoYXBlRGV0ZWN0aW9uT3B0aW9ucyogc2hhcGVEZXRlY3Rpb25PcHRpb25zLCBjb25zdCBST0kqIHJvaSwgaW50KiBudW1NYXRjaGVzUmV0dXJuZWQpOworSU1BUV9GVU5DIFJlY3RhbmdsZU1hdGNoKiAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFEZXRlY3RSZWN0YW5nbGVzKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgUmVjdGFuZ2xlRGVzY3JpcHRvciogcmVjdGFuZ2xlRGVzY3JpcHRvciwgY29uc3QgQ3VydmVPcHRpb25zKiBjdXJ2ZU9wdGlvbnMsIGNvbnN0IFNoYXBlRGV0ZWN0aW9uT3B0aW9ucyogc2hhcGVEZXRlY3Rpb25PcHRpb25zLCBjb25zdCBST0kqIHJvaSwgaW50KiBudW1NYXRjaGVzUmV0dXJuZWQpOworSU1BUV9GVU5DIEZlYXR1cmVEYXRhKiAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFHZXRHZW9tZXRyaWNGZWF0dXJlc0Zyb21DdXJ2ZXMoY29uc3QgQ3VydmUqIGN1cnZlcywgdW5zaWduZWQgaW50IG51bUN1cnZlcywgY29uc3QgRmVhdHVyZVR5cGUqIGZlYXR1cmVUeXBlcywgdW5zaWduZWQgaW50IG51bUZlYXR1cmVUeXBlcywgdW5zaWduZWQgaW50KiBudW1GZWF0dXJlcyk7CitJTUFRX0ZVTkMgRmVhdHVyZURhdGEqICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUdldEdlb21ldHJpY1RlbXBsYXRlRmVhdHVyZUluZm8oY29uc3QgSW1hZ2UqIHBhdHRlcm4sIHVuc2lnbmVkIGludCogbnVtRmVhdHVyZXMpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFMZWFybkNvbG9yUGF0dGVybihJbWFnZSogaW1hZ2UsIGNvbnN0IExlYXJuQ29sb3JQYXR0ZXJuT3B0aW9ucyogb3B0aW9ucyk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUxlYXJuR2VvbWV0cmljUGF0dGVybihJbWFnZSogaW1hZ2UsIFBvaW50RmxvYXQgb3JpZ2luT2Zmc2V0LCBjb25zdCBDdXJ2ZU9wdGlvbnMqIGN1cnZlT3B0aW9ucywgY29uc3QgTGVhcm5HZW9tZXRyaWNQYXR0ZXJuQWR2YW5jZWRPcHRpb25zKiBhZHZhbmNlZExlYXJuT3B0aW9ucywgY29uc3QgSW1hZ2UqIG1hc2spOworSU1BUV9GVU5DIE11bHRpcGxlR2VvbWV0cmljUGF0dGVybiogSU1BUV9TVERDQUxMIGltYXFMZWFybk11bHRpcGxlR2VvbWV0cmljUGF0dGVybnMoY29uc3QgSW1hZ2UqKiBwYXR0ZXJucywgdW5zaWduZWQgaW50IG51bWJlck9mUGF0dGVybnMsIGNvbnN0IFN0cmluZzI1NSogbGFiZWxzKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxTGVhcm5QYXR0ZXJuMyhJbWFnZSogaW1hZ2UsIExlYXJuaW5nTW9kZSBsZWFybmluZ01vZGUsIExlYXJuUGF0dGVybkFkdmFuY2VkT3B0aW9ucyogYWR2YW5jZWRPcHRpb25zLCBjb25zdCBJbWFnZSogbWFzayk7CitJTUFRX0ZVTkMgUGF0dGVybk1hdGNoKiAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcU1hdGNoQ29sb3JQYXR0ZXJuKGNvbnN0IEltYWdlKiBpbWFnZSwgSW1hZ2UqIHBhdHRlcm4sIGNvbnN0IE1hdGNoQ29sb3JQYXR0ZXJuT3B0aW9ucyogb3B0aW9ucywgUmVjdCBzZWFyY2hSZWN0LCBpbnQqIG51bU1hdGNoZXMpOworSU1BUV9GVU5DIEdlb21ldHJpY1BhdHRlcm5NYXRjaDIqICAgSU1BUV9TVERDQUxMIGltYXFNYXRjaEdlb21ldHJpY1BhdHRlcm4yKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgSW1hZ2UqIHBhdHRlcm4sIGNvbnN0IEN1cnZlT3B0aW9ucyogY3VydmVPcHRpb25zLCBjb25zdCBNYXRjaEdlb21ldHJpY1BhdHRlcm5PcHRpb25zKiBtYXRjaE9wdGlvbnMsIGNvbnN0IE1hdGNoR2VvbWV0cmljUGF0dGVybkFkdmFuY2VkT3B0aW9uczIqIGFkdmFuY2VkTWF0Y2hPcHRpb25zLCBjb25zdCBST0kqIHJvaSwgaW50KiBudW1NYXRjaGVzKTsKK0lNQVFfRlVOQyBHZW9tZXRyaWNQYXR0ZXJuTWF0Y2gyKiAgIElNQVFfU1REQ0FMTCBpbWFxTWF0Y2hNdWx0aXBsZUdlb21ldHJpY1BhdHRlcm5zKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgTXVsdGlwbGVHZW9tZXRyaWNQYXR0ZXJuKiBtdWx0aXBsZVBhdHRlcm4sIGNvbnN0IFJPSSogcm9pLCBpbnQqIG51bU1hdGNoZXMpOworSU1BUV9GVU5DIE11bHRpcGxlR2VvbWV0cmljUGF0dGVybiogSU1BUV9TVERDQUxMIGltYXFSZWFkTXVsdGlwbGVHZW9tZXRyaWNQYXR0ZXJuRmlsZShjb25zdCBjaGFyKiBmaWxlTmFtZSwgU3RyaW5nMjU1IGRlc2NyaXB0aW9uKTsKK0lNQVFfRlVOQyBQYXR0ZXJuTWF0Y2gqICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxUmVmaW5lTWF0Y2hlcyhjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IEltYWdlKiBwYXR0ZXJuLCBjb25zdCBQYXR0ZXJuTWF0Y2gqIGNhbmRpZGF0ZXNJbiwgaW50IG51bUNhbmRpZGF0ZXNJbiwgTWF0Y2hQYXR0ZXJuT3B0aW9ucyogb3B0aW9ucywgTWF0Y2hQYXR0ZXJuQWR2YW5jZWRPcHRpb25zKiBhZHZhbmNlZE9wdGlvbnMsIGludCogbnVtQ2FuZGlkYXRlc091dCk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcVNldE11bHRpcGxlR2VvbWV0cmljUGF0dGVybnNPcHRpb25zKE11bHRpcGxlR2VvbWV0cmljUGF0dGVybiogbXVsdGlwbGVQYXR0ZXJuLCBjb25zdCBjaGFyKiBsYWJlbCwgY29uc3QgQ3VydmVPcHRpb25zKiBjdXJ2ZU9wdGlvbnMsIGNvbnN0IE1hdGNoR2VvbWV0cmljUGF0dGVybk9wdGlvbnMqIG1hdGNoT3B0aW9ucywgY29uc3QgTWF0Y2hHZW9tZXRyaWNQYXR0ZXJuQWR2YW5jZWRPcHRpb25zMiogYWR2YW5jZWRNYXRjaE9wdGlvbnMpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFXcml0ZU11bHRpcGxlR2VvbWV0cmljUGF0dGVybkZpbGUoY29uc3QgTXVsdGlwbGVHZW9tZXRyaWNQYXR0ZXJuKiBtdWx0aXBsZVBhdHRlcm4sIGNvbnN0IGNoYXIqIGZpbGVOYW1lLCBjb25zdCBjaGFyKiBkZXNjcmlwdGlvbik7CitJTUFRX0ZVTkMgR2VvbWV0cmljUGF0dGVybk1hdGNoMyogICBJTUFRX1NURENBTEwgaW1hcU1hdGNoR2VvbWV0cmljUGF0dGVybjMoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBJbWFnZSogcGF0dGVybiwgY29uc3QgQ3VydmVPcHRpb25zKiBjdXJ2ZU9wdGlvbnMsIGNvbnN0IE1hdGNoR2VvbWV0cmljUGF0dGVybk9wdGlvbnMqIG1hdGNoT3B0aW9ucywgY29uc3QgTWF0Y2hHZW9tZXRyaWNQYXR0ZXJuQWR2YW5jZWRPcHRpb25zMyogYWR2YW5jZWRNYXRjaE9wdGlvbnMsIGNvbnN0IFJPSSogcm9pLCBzaXplX3QqIG51bU1hdGNoZXMpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFMZWFybkdlb21ldHJpY1BhdHRlcm4yKEltYWdlKiBpbWFnZSwgUG9pbnRGbG9hdCBvcmlnaW5PZmZzZXQsIGRvdWJsZSBhbmdsZU9mZnNldCwgY29uc3QgQ3VydmVPcHRpb25zKiBjdXJ2ZU9wdGlvbnMsIGNvbnN0IExlYXJuR2VvbWV0cmljUGF0dGVybkFkdmFuY2VkT3B0aW9uczIqIGFkdmFuY2VkTGVhcm5PcHRpb25zLCBjb25zdCBJbWFnZSogbWFzayk7CitJTUFRX0ZVTkMgUGF0dGVybk1hdGNoKiAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcU1hdGNoUGF0dGVybjMoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBJbWFnZSogcGF0dGVybiwgY29uc3QgTWF0Y2hQYXR0ZXJuT3B0aW9ucyogb3B0aW9ucywgY29uc3QgTWF0Y2hQYXR0ZXJuQWR2YW5jZWRPcHRpb25zKiBhZHZhbmNlZE9wdGlvbnMsIGNvbnN0IFJPSSogcm9pLCBpbnQqIG51bU1hdGNoZXMpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBPdmVybGF5IGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxQ2xlYXJPdmVybGF5KEltYWdlKiBpbWFnZSwgY29uc3QgY2hhciogZ3JvdXApOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUNvcHlPdmVybGF5KEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBjb25zdCBjaGFyKiBncm91cCk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxR2V0T3ZlcmxheVByb3BlcnRpZXMoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBjaGFyKiBncm91cCwgVHJhbnNmb3JtQmVoYXZpb3JzKiB0cmFuc2Zvcm1CZWhhdmlvcnMpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcU1lcmdlT3ZlcmxheShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgY29uc3QgUkdCVmFsdWUqIHBhbGV0dGUsIHVuc2lnbmVkIGludCBudW1Db2xvcnMsIGNvbnN0IGNoYXIqIGdyb3VwKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFPdmVybGF5QXJjKEltYWdlKiBpbWFnZSwgY29uc3QgQXJjSW5mbyogYXJjLCBjb25zdCBSR0JWYWx1ZSogY29sb3IsIERyYXdNb2RlIGRyYXdNb2RlLCBjb25zdCBjaGFyKiBncm91cCk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxT3ZlcmxheUJpdG1hcChJbWFnZSogaW1hZ2UsIFBvaW50IGRlc3RMb2MsIGNvbnN0IFJHQlZhbHVlKiBiaXRtYXAsIHVuc2lnbmVkIGludCBudW1Db2xzLCB1bnNpZ25lZCBpbnQgbnVtUm93cywgY29uc3QgY2hhciogZ3JvdXApOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcU92ZXJsYXlDbG9zZWRDb250b3VyKEltYWdlKiBpbWFnZSwgY29uc3QgUG9pbnQqIHBvaW50cywgaW50IG51bVBvaW50cywgY29uc3QgUkdCVmFsdWUqIGNvbG9yLCBEcmF3TW9kZSBkcmF3TW9kZSwgY29uc3QgY2hhciogZ3JvdXApOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcU92ZXJsYXlMaW5lKEltYWdlKiBpbWFnZSwgUG9pbnQgc3RhcnQsIFBvaW50IGVuZCwgY29uc3QgUkdCVmFsdWUqIGNvbG9yLCBjb25zdCBjaGFyKiBncm91cCk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxT3ZlcmxheU1ldGFmaWxlKEltYWdlKiBpbWFnZSwgY29uc3Qgdm9pZCogbWV0YWZpbGUsIFJlY3QgcmVjdCwgY29uc3QgY2hhciogZ3JvdXApOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcU92ZXJsYXlPcGVuQ29udG91cihJbWFnZSogaW1hZ2UsIGNvbnN0IFBvaW50KiBwb2ludHMsIGludCBudW1Qb2ludHMsIGNvbnN0IFJHQlZhbHVlKiBjb2xvciwgY29uc3QgY2hhciogZ3JvdXApOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcU92ZXJsYXlPdmFsKEltYWdlKiBpbWFnZSwgUmVjdCBib3VuZGluZ0JveCwgY29uc3QgUkdCVmFsdWUqIGNvbG9yLCBEcmF3TW9kZSBkcmF3TW9kZSwgY2hhciogZ3JvdXApOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcU92ZXJsYXlQb2ludHMoSW1hZ2UqIGltYWdlLCBjb25zdCBQb2ludCogcG9pbnRzLCBpbnQgbnVtUG9pbnRzLCBjb25zdCBSR0JWYWx1ZSogY29sb3JzLCBpbnQgbnVtQ29sb3JzLCBQb2ludFN5bWJvbCBzeW1ib2wsIGNvbnN0IFVzZXJQb2ludFN5bWJvbCogdXNlclN5bWJvbCwgY29uc3QgY2hhciogZ3JvdXApOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcU92ZXJsYXlSZWN0KEltYWdlKiBpbWFnZSwgUmVjdCByZWN0LCBjb25zdCBSR0JWYWx1ZSogY29sb3IsIERyYXdNb2RlIGRyYXdNb2RlLCBjb25zdCBjaGFyKiBncm91cCk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxT3ZlcmxheVJPSShJbWFnZSogaW1hZ2UsIGNvbnN0IFJPSSogcm9pLCBQb2ludFN5bWJvbCBzeW1ib2wsIGNvbnN0IFVzZXJQb2ludFN5bWJvbCogdXNlclN5bWJvbCwgY29uc3QgY2hhciogZ3JvdXApOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcU92ZXJsYXlUZXh0KEltYWdlKiBpbWFnZSwgUG9pbnQgb3JpZ2luLCBjb25zdCBjaGFyKiB0ZXh0LCBjb25zdCBSR0JWYWx1ZSogY29sb3IsIGNvbnN0IE92ZXJsYXlUZXh0T3B0aW9ucyogb3B0aW9ucywgY29uc3QgY2hhciogZ3JvdXApOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcVNldE92ZXJsYXlQcm9wZXJ0aWVzKEltYWdlKiBpbWFnZSwgY29uc3QgY2hhciogZ3JvdXAsIFRyYW5zZm9ybUJlaGF2aW9ycyogdHJhbnNmb3JtQmVoYXZpb3JzKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgT0NSIGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgQ2hhclNldCogICAgICAgICBJTUFRX1NURENBTEwgaW1hcUNyZWF0ZUNoYXJTZXQodm9pZCk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcURlbGV0ZUNoYXIoQ2hhclNldCogc2V0LCBpbnQgaW5kZXgpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFHZXRDaGFyQ291bnQoY29uc3QgQ2hhclNldCogc2V0KTsKK0lNQVFfRlVOQyBDaGFySW5mbzIqICAgICAgIElNQVFfU1REQ0FMTCBpbWFxR2V0Q2hhckluZm8yKGNvbnN0IENoYXJTZXQqIHNldCwgaW50IGluZGV4KTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxUmVhZE9DUkZpbGUoY29uc3QgY2hhciogZmlsZU5hbWUsIENoYXJTZXQqIHNldCwgU3RyaW5nMjU1IHNldERlc2NyaXB0aW9uLCBSZWFkVGV4dE9wdGlvbnMqIHJlYWRPcHRpb25zLCBPQ1JQcm9jZXNzaW5nT3B0aW9ucyogcHJvY2Vzc2luZ09wdGlvbnMsIE9DUlNwYWNpbmdPcHRpb25zKiBzcGFjaW5nT3B0aW9ucyk7CitJTUFRX0ZVTkMgUmVhZFRleHRSZXBvcnQzKiBJTUFRX1NURENBTEwgaW1hcVJlYWRUZXh0Myhjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IENoYXJTZXQqIHNldCwgY29uc3QgUk9JKiByb2ksIGNvbnN0IFJlYWRUZXh0T3B0aW9ucyogcmVhZE9wdGlvbnMsIGNvbnN0IE9DUlByb2Nlc3NpbmdPcHRpb25zKiBwcm9jZXNzaW5nT3B0aW9ucywgY29uc3QgT0NSU3BhY2luZ09wdGlvbnMqIHNwYWNpbmdPcHRpb25zKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxUmVuYW1lQ2hhcihDaGFyU2V0KiBzZXQsIGludCBpbmRleCwgY29uc3QgY2hhciogbmV3Q2hhclZhbHVlKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxU2V0UmVmZXJlbmNlQ2hhcihjb25zdCBDaGFyU2V0KiBzZXQsIGludCBpbmRleCwgaW50IGlzUmVmZXJlbmNlQ2hhcik7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcVRyYWluQ2hhcnMoY29uc3QgSW1hZ2UqIGltYWdlLCBDaGFyU2V0KiBzZXQsIGludCBpbmRleCwgY29uc3QgY2hhciogY2hhclZhbHVlLCBjb25zdCBST0kqIHJvaSwgY29uc3QgT0NSUHJvY2Vzc2luZ09wdGlvbnMqIHByb2Nlc3NpbmdPcHRpb25zLCBjb25zdCBPQ1JTcGFjaW5nT3B0aW9ucyogc3BhY2luZ09wdGlvbnMpOworSU1BUV9GVU5DIGludCogICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFWZXJpZnlQYXR0ZXJucyhjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IENoYXJTZXQqIHNldCwgY29uc3QgU3RyaW5nMjU1KiBleHBlY3RlZFBhdHRlcm5zLCBpbnQgcGF0dGVybkNvdW50LCBjb25zdCBST0kqIHJvaSwgaW50KiBudW1TY29yZXMpOworSU1BUV9GVU5DIGludCogICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFWZXJpZnlUZXh0KGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgQ2hhclNldCogc2V0LCBjb25zdCBjaGFyKiBleHBlY3RlZFN0cmluZywgY29uc3QgUk9JKiByb2ksIGludCogbnVtU2NvcmVzKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxV3JpdGVPQ1JGaWxlKGNvbnN0IGNoYXIqIGZpbGVOYW1lLCBjb25zdCBDaGFyU2V0KiBzZXQsIGNvbnN0IGNoYXIqIHNldERlc2NyaXB0aW9uLCBjb25zdCBSZWFkVGV4dE9wdGlvbnMqIHJlYWRPcHRpb25zLCBjb25zdCBPQ1JQcm9jZXNzaW5nT3B0aW9ucyogcHJvY2Vzc2luZ09wdGlvbnMsIGNvbnN0IE9DUlNwYWNpbmdPcHRpb25zKiBzcGFjaW5nT3B0aW9ucyk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIEdlb21ldHJpYyBNYXRjaGluZyBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIEV4dHJhY3RDb250b3VyUmVwb3J0KiAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUV4dHJhY3RDb250b3VyKEltYWdlKiBpbWFnZSwgY29uc3QgUk9JKiByb2ksIEV4dHJhY3RDb250b3VyRGlyZWN0aW9uIGRpcmVjdGlvbiwgQ3VydmVQYXJhbWV0ZXJzKiBjdXJ2ZVBhcmFtcywgY29uc3QgQ29ubmVjdGlvbkNvbnN0cmFpbnQqIGNvbm5lY3Rpb25Db25zdHJhaW50UGFyYW1zLCB1bnNpZ25lZCBpbnQgbnVtT2ZDb25zdHJhaW50cywgRXh0cmFjdENvbnRvdXJTZWxlY3Rpb24gc2VsZWN0aW9uLCBJbWFnZSogY29udG91ckltYWdlKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFDb250b3VyT3ZlcmxheShJbWFnZSogaW1hZ2UsIGNvbnN0IEltYWdlKiBjb250b3VySW1hZ2UsIGNvbnN0IENvbnRvdXJPdmVybGF5U2V0dGluZ3MqIHBvaW50c1NldHRpbmdzLCBjb25zdCBDb250b3VyT3ZlcmxheVNldHRpbmdzKiBlcW5TZXR0aW5ncywgY29uc3QgY2hhciogZ3JvdXBOYW1lKTsKK0lNQVFfRlVOQyBDb250b3VyQ29tcHV0ZUN1cnZhdHVyZVJlcG9ydCogSU1BUV9TVERDQUxMIGltYXFDb250b3VyQ29tcHV0ZUN1cnZhdHVyZShjb25zdCBJbWFnZSogY29udG91ckltYWdlLCB1bnNpZ25lZCBpbnQga2VybmVsKTsKK0lNQVFfRlVOQyBDdXJ2YXR1cmVBbmFseXNpc1JlcG9ydCogICAgICAgSU1BUV9TVERDQUxMIGltYXFDb250b3VyQ2xhc3NpZnlDdXJ2YXR1cmUoY29uc3QgSW1hZ2UqIGNvbnRvdXJJbWFnZSwgdW5zaWduZWQgaW50IGtlcm5lbCwgUmFuZ2VMYWJlbCogY3VydmF0dXJlQ2xhc3NlcywgdW5zaWduZWQgaW50IG51bUN1cnZhdHVyZUNsYXNzZXMpOworSU1BUV9GVU5DIENvbXB1dGVEaXN0YW5jZXNSZXBvcnQqICAgICAgICBJTUFRX1NURENBTEwgaW1hcUNvbnRvdXJDb21wdXRlRGlzdGFuY2VzKGNvbnN0IEltYWdlKiB0YXJnZXRJbWFnZSwgY29uc3QgSW1hZ2UqIHRlbXBsYXRlSW1hZ2UsIGNvbnN0IFNldHVwTWF0Y2hQYXR0ZXJuRGF0YSogbWF0Y2hTZXR1cERhdGEsIHVuc2lnbmVkIGludCBzbW9vdGhpbmdLZXJuZWwpOworSU1BUV9GVU5DIENsYXNzaWZ5RGlzdGFuY2VzUmVwb3J0KiAgICAgICBJTUFRX1NURENBTEwgaW1hcUNvbnRvdXJDbGFzc2lmeURpc3RhbmNlcyhjb25zdCBJbWFnZSogdGFyZ2V0SW1hZ2UsIGNvbnN0IEltYWdlKiB0ZW1wbGF0ZUltYWdlLCBjb25zdCBTZXR1cE1hdGNoUGF0dGVybkRhdGEqIG1hdGNoU2V0dXBEYXRhLCB1bnNpZ25lZCBpbnQgc21vb3RoaW5nS2VybmVsLCBjb25zdCBSYW5nZUxhYmVsKiBkaXN0YW5jZVJhbmdlcywgdW5zaWduZWQgaW50IG51bURpc3RhbmNlUmFuZ2VzKTsKK0lNQVFfRlVOQyBDb250b3VySW5mb1JlcG9ydCogICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFDb250b3VySW5mbyhjb25zdCBJbWFnZSogY29udG91ckltYWdlKTsKK0lNQVFfRlVOQyBTZXR1cE1hdGNoUGF0dGVybkRhdGEqICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFDb250b3VyU2V0dXBNYXRjaFBhdHRlcm4oTWF0Y2hNb2RlKiBtYXRjaE1vZGUsIHVuc2lnbmVkIGludCBlbmFibGVTdWJQaXhlbEFjY3VyYWN5LCBDdXJ2ZVBhcmFtZXRlcnMqIGN1cnZlUGFyYW1zLCB1bnNpZ25lZCBpbnQgdXNlTGVhcm5DdXJ2ZVBhcmFtZXRlcnMsIGNvbnN0IFJhbmdlU2V0dGluZ0RvdWJsZSogcmFuZ2VTZXR0aW5ncywgdW5zaWduZWQgaW50IG51bVJhbmdlU2V0dGluZ3MpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUNvbnRvdXJBZHZhbmNlZFNldHVwTWF0Y2hQYXR0ZXJuKFNldHVwTWF0Y2hQYXR0ZXJuRGF0YSogbWF0Y2hTZXR1cERhdGEsIEdlb21ldHJpY0FkdmFuY2VkU2V0dXBEYXRhT3B0aW9uKiBnZW9tZXRyaWNPcHRpb25zLCB1bnNpZ25lZCBpbnQgbnVtR2VvbWV0cmljT3B0aW9ucyk7CitJTUFRX0ZVTkMgQ29udG91ckZpdExpbmVSZXBvcnQqICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxQ29udG91ckZpdExpbmUoSW1hZ2UqIGltYWdlLCBkb3VibGUgcGl4ZWxSYWRpdXMpOworSU1BUV9GVU5DIFBhcnRpYWxDaXJjbGUqICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUNvbnRvdXJGaXRDaXJjbGUoSW1hZ2UqIGltYWdlLCBkb3VibGUgcGl4ZWxSYWRpdXMsIGludCByZWplY3RPdXRsaWVycyk7CitJTUFRX0ZVTkMgUGFydGlhbEVsbGlwc2UqICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxQ29udG91ckZpdEVsbGlwc2UoSW1hZ2UqIGltYWdlLCBkb3VibGUgcGl4ZWxSYWRpdXMsIGludCByZWplY3RPdXRsaWVycyk7CitJTUFRX0ZVTkMgQ29udG91ckZpdFNwbGluZVJlcG9ydCogICAgICAgIElNQVFfU1REQ0FMTCBpbWFxQ29udG91ckZpdFNwbGluZShJbWFnZSogaW1hZ2UsIGludCBkZWdyZWUsIGludCBudW1iZXJPZkNvbnRyb2xQb2ludHMpOworSU1BUV9GVU5DIENvbnRvdXJGaXRQb2x5bm9taWFsUmVwb3J0KiAgICBJTUFRX1NURENBTEwgaW1hcUNvbnRvdXJGaXRQb2x5bm9taWFsKEltYWdlKiBpbWFnZSwgaW50IG9yZGVyKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgRWRnZSBEZXRlY3Rpb24gZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBGaW5kQ2lyY3VsYXJFZGdlUmVwb3J0KiAgIElNQVFfU1REQ0FMTCBpbWFxRmluZENpcmN1bGFyRWRnZTIoSW1hZ2UqIGltYWdlLCBjb25zdCBST0kqIHJvaSwgY29uc3QgQ29vcmRpbmF0ZVN5c3RlbSogYmFzZVN5c3RlbSwgY29uc3QgQ29vcmRpbmF0ZVN5c3RlbSogbmV3U3lzdGVtLCBjb25zdCBGaW5kQ2lyY3VsYXJFZGdlT3B0aW9ucyogZWRnZU9wdGlvbnMsIGNvbnN0IENpcmNsZUZpdE9wdGlvbnMqIGNpcmNsZUZpdE9wdGlvbnMpOworSU1BUV9GVU5DIEZpbmRDb25jZW50cmljRWRnZVJlcG9ydCogSU1BUV9TVERDQUxMIGltYXFGaW5kQ29uY2VudHJpY0VkZ2UyKEltYWdlKiBpbWFnZSwgY29uc3QgUk9JKiByb2ksIGNvbnN0IENvb3JkaW5hdGVTeXN0ZW0qIGJhc2VTeXN0ZW0sIGNvbnN0IENvb3JkaW5hdGVTeXN0ZW0qIG5ld1N5c3RlbSwgY29uc3QgRmluZENvbmNlbnRyaWNFZGdlT3B0aW9ucyogZWRnZU9wdGlvbnMsIGNvbnN0IENvbmNlbnRyaWNFZGdlRml0T3B0aW9ucyogY29uY2VudHJpY0VkZ2VGaXRPcHRpb25zKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgTW9ycGhvbG9neSBSZWNvbnN0cnVjdGlvbiBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUdyYXlNb3JwaG9sb2d5UmVjb25zdHJ1Y3QoSW1hZ2UqIGRzdEltYWdlLCBJbWFnZSogc3JjSW1hZ2UsIGNvbnN0IEltYWdlKiBtYXJrZXJJbWFnZSwgUG9pbnRGbG9hdCogcG9pbnRzLCBpbnQgbnVtT2ZQb2ludHMsIE1vcnBob2xvZ3lSZWNvbnN0cnVjdE9wZXJhdGlvbiBvcGVyYXRpb24sIGNvbnN0IFN0cnVjdHVyaW5nRWxlbWVudCogc3RydWN0dXJpbmdFbGVtZW50LCBjb25zdCBST0kqIHJvaSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxTW9ycGhvbG9neVJlY29uc3RydWN0KEltYWdlKiBkc3RJbWFnZSwgSW1hZ2UqIHNyY0ltYWdlLCBjb25zdCBJbWFnZSogbWFya2VySW1hZ2UsIFBvaW50RmxvYXQqIHBvaW50cywgaW50IG51bU9mUG9pbnRzLCBNb3JwaG9sb2d5UmVjb25zdHJ1Y3RPcGVyYXRpb24gb3BlcmF0aW9uLCBDb25uZWN0aXZpdHkgY29ubmVjdGl2aXR5LCBjb25zdCBST0kqIHJvaSk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIFRleHR1cmUgZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcURldGVjdFRleHR1cmVEZWZlY3QoQ2xhc3NpZmllclNlc3Npb24qIHNlc3Npb24sIEltYWdlKiBkZXN0SW1hZ2UsIGNvbnN0IEltYWdlKiBzcmNJbWFnZSwgY29uc3QgUk9JKiByb2ksIGludCBpbml0aWFsU3RlcFNpemUsIGludCBmaW5hbFN0ZXBTaXplLCB1bnNpZ25lZCBjaGFyIGRlZmVjdFBpeGVsVmFsdWUsIGRvdWJsZSBtaW5DbGFzc2lmaWNhdGlvblNjb3JlKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUNsYXNzaWZpY2F0aW9uVGV4dHVyZURlZmVjdE9wdGlvbnMoQ2xhc3NpZmllclNlc3Npb24qIHNlc3Npb24sIFdpbmRvd1NpemUqIHdpbmRvd09wdGlvbnMsIFdhdmVsZXRPcHRpb25zKiB3YXZlbGV0T3B0aW9ucywgdm9pZCoqIGJhbmRzVXNlZCwgaW50KiBudW1CYW5kc1VzZWQsIENvb2NjdXJyZW5jZU9wdGlvbnMqIGNvb2NjdXJyZW5jZU9wdGlvbnMsIHVuc2lnbmVkIGNoYXIgc2V0T3BlcmF0aW9uKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUNvb2NjdXJyZW5jZU1hdHJpeChjb25zdCBJbWFnZSogc3JjSW1hZ2UsIGNvbnN0IFJPSSogcm9pLCBpbnQgbGV2ZWxQaXhlbCwgY29uc3QgRGlzcGxhY2VtZW50VmVjdG9yKiBkaXNwbGFjZW1lbnRWZWMsIHZvaWQqIGZlYXR1cmVPcHRpb25BcnJheSwgdW5zaWduZWQgaW50IGZlYXR1cmVPcHRpb25BcnJheVNpemUsIHZvaWQqKiBjb29jY3VycmVuY2VNYXRyaXhBcnJheSwgaW50KiBjb29jdXJyZW5jZU1hdHJpeFJvd3MsIGludCogY29vY3VycmVuY2VNYXRyaXhDb2xzLCB2b2lkKiogZmVhdHVyZVZlY3RvckFycmF5LCBpbnQqIGZlYXR1cmVWZWN0b3JBcnJheVNpemUpOworSU1BUV9GVU5DIEV4dHJhY3RUZXh0dXJlRmVhdHVyZXNSZXBvcnQqIElNQVFfU1REQ0FMTCBpbWFxRXh0cmFjdFRleHR1cmVGZWF0dXJlcyhjb25zdCBJbWFnZSogc3JjSW1hZ2UsIGNvbnN0IFJPSSogcm9pLCBjb25zdCBXaW5kb3dTaXplKiB3aW5kb3dPcHRpb25zLCBjb25zdCBXYXZlbGV0T3B0aW9ucyogd2F2ZWxldE9wdGlvbnMsIHZvaWQqIHdhdmVsZXRCYW5kcywgdW5zaWduZWQgaW50IG51bVdhdmVsZXRCYW5kcywgY29uc3QgQ29vY2N1cnJlbmNlT3B0aW9ucyogY29vY2N1cnJlbmNlT3B0aW9ucywgdW5zaWduZWQgY2hhciB1c2VXaW5kb3cpOworSU1BUV9GVU5DIFdhdmVsZXRCYW5kc1JlcG9ydCogICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxRXh0cmFjdFdhdmVsZXRCYW5kcyhjb25zdCBJbWFnZSogc3JjSW1hZ2UsIGNvbnN0IFdhdmVsZXRPcHRpb25zKiB3YXZlbGV0T3B0aW9ucywgdm9pZCogd2F2ZWxldEJhbmRzLCB1bnNpZ25lZCBpbnQgbnVtV2F2ZWxldEJhbmRzKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgUmVnaW9ucyBvZiBJbnRlcmVzdCBNYW5pcHVsYXRpb24gZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBST0kqICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcU1hc2tUb1JPSShjb25zdCBJbWFnZSogbWFzaywgaW50KiB3aXRoaW5MaW1pdCk7CitJTUFRX0ZVTkMgUk9JUHJvZmlsZSogICAgICAgSU1BUV9TVERDQUxMIGltYXFST0lQcm9maWxlKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgUk9JKiByb2kpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxUk9JVG9NYXNrKEltYWdlKiBtYXNrLCBjb25zdCBST0kqIHJvaSwgaW50IGZpbGxWYWx1ZSwgY29uc3QgSW1hZ2UqIGltYWdlTW9kZWwsIGludCogaW5TcGFjZSk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFUcmFuc2Zvcm1ST0kyKFJPSSogcm9pLCBjb25zdCBDb29yZGluYXRlU3lzdGVtKiBiYXNlU3lzdGVtLCBjb25zdCBDb29yZGluYXRlU3lzdGVtKiBuZXdTeXN0ZW0pOworSU1BUV9GVU5DIExhYmVsVG9ST0lSZXBvcnQqIElNQVFfU1REQ0FMTCBpbWFxTGFiZWxUb1JPSShjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IHVuc2lnbmVkIGludCogbGFiZWxzSW4sIHVuc2lnbmVkIGludCBudW1MYWJlbHNJbiwgaW50IG1heE51bVZlY3RvcnMsIGludCBpc0V4dGVybmVsRWRnZXMpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBNb3JwaG9sb2d5IGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxR3JheU1vcnBob2xvZ3koSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UsIE1vcnBob2xvZ3lNZXRob2QgbWV0aG9kLCBjb25zdCBTdHJ1Y3R1cmluZ0VsZW1lbnQqIHN0cnVjdHVyaW5nRWxlbWVudCk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIENsYXNzaWZpY2F0aW9uIGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxQWRkQ2xhc3NpZmllclNhbXBsZShJbWFnZSogaW1hZ2UsIENsYXNzaWZpZXJTZXNzaW9uKiBzZXNzaW9uLCBjb25zdCBST0kqIHJvaSwgY29uc3QgY2hhciogc2FtcGxlQ2xhc3MsIGRvdWJsZSogZmVhdHVyZVZlY3RvciwgdW5zaWduZWQgaW50IHZlY3RvclNpemUpOworSU1BUV9GVU5DIENsYXNzaWZpZXJSZXBvcnRBZHZhbmNlZCogICAgICBJTUFRX1NURENBTEwgaW1hcUFkdmFuY2VDbGFzc2lmeShJbWFnZSogaW1hZ2UsIGNvbnN0IENsYXNzaWZpZXJTZXNzaW9uKiBzZXNzaW9uLCBjb25zdCBST0kqIHJvaSwgZG91YmxlKiBmZWF0dXJlVmVjdG9yLCB1bnNpZ25lZCBpbnQgdmVjdG9yU2l6ZSk7CitJTUFRX0ZVTkMgQ2xhc3NpZmllclJlcG9ydCogICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxQ2xhc3NpZnkoSW1hZ2UqIGltYWdlLCBjb25zdCBDbGFzc2lmaWVyU2Vzc2lvbiogc2Vzc2lvbiwgY29uc3QgUk9JKiByb2ksIGRvdWJsZSogZmVhdHVyZVZlY3RvciwgdW5zaWduZWQgaW50IHZlY3RvclNpemUpOworSU1BUV9GVU5DIENsYXNzaWZpZXJTZXNzaW9uKiAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUNyZWF0ZUNsYXNzaWZpZXIoQ2xhc3NpZmllclR5cGUgdHlwZSk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxRGVsZXRlQ2xhc3NpZmllclNhbXBsZShDbGFzc2lmaWVyU2Vzc2lvbiogc2Vzc2lvbiwgaW50IGluZGV4KTsKK0lNQVFfRlVOQyBDbGFzc2lmaWVyQWNjdXJhY3lSZXBvcnQqICAgICAgSU1BUV9TVERDQUxMIGltYXFHZXRDbGFzc2lmaWVyQWNjdXJhY3koY29uc3QgQ2xhc3NpZmllclNlc3Npb24qIHNlc3Npb24pOworSU1BUV9GVU5DIENsYXNzaWZpZXJTYW1wbGVJbmZvKiAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUdldENsYXNzaWZpZXJTYW1wbGVJbmZvKGNvbnN0IENsYXNzaWZpZXJTZXNzaW9uKiBzZXNzaW9uLCBpbnQgaW5kZXgsIGludCogbnVtU2FtcGxlcyk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxR2V0Q29sb3JDbGFzc2lmaWVyT3B0aW9ucyhjb25zdCBDbGFzc2lmaWVyU2Vzc2lvbiogc2Vzc2lvbiwgQ29sb3JPcHRpb25zKiBvcHRpb25zKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFHZXROZWFyZXN0TmVpZ2hib3JPcHRpb25zKGNvbnN0IENsYXNzaWZpZXJTZXNzaW9uKiBzZXNzaW9uLCBOZWFyZXN0TmVpZ2hib3JPcHRpb25zKiBvcHRpb25zKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFHZXRQYXJ0aWNsZUNsYXNzaWZpZXJPcHRpb25zMihjb25zdCBDbGFzc2lmaWVyU2Vzc2lvbiogc2Vzc2lvbiwgUGFydGljbGVDbGFzc2lmaWVyUHJlcHJvY2Vzc2luZ09wdGlvbnMyKiBwcmVwcm9jZXNzaW5nT3B0aW9ucywgUGFydGljbGVDbGFzc2lmaWVyT3B0aW9ucyogb3B0aW9ucyk7CitJTUFRX0ZVTkMgQ2xhc3NpZmllclNlc3Npb24qICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxUmVhZENsYXNzaWZpZXJGaWxlKENsYXNzaWZpZXJTZXNzaW9uKiBzZXNzaW9uLCBjb25zdCBjaGFyKiBmaWxlTmFtZSwgUmVhZENsYXNzaWZpZXJGaWxlTW9kZSBtb2RlLCBDbGFzc2lmaWVyVHlwZSogdHlwZSwgQ2xhc3NpZmllckVuZ2luZVR5cGUqIGVuZ2luZSwgU3RyaW5nMjU1IGRlc2NyaXB0aW9uKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFSZWxhYmVsQ2xhc3NpZmllclNhbXBsZShDbGFzc2lmaWVyU2Vzc2lvbiogc2Vzc2lvbiwgaW50IGluZGV4LCBjb25zdCBjaGFyKiBuZXdDbGFzcyk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxU2V0UGFydGljbGVDbGFzc2lmaWVyT3B0aW9uczIoQ2xhc3NpZmllclNlc3Npb24qIHNlc3Npb24sIGNvbnN0IFBhcnRpY2xlQ2xhc3NpZmllclByZXByb2Nlc3NpbmdPcHRpb25zMiogcHJlcHJvY2Vzc2luZ09wdGlvbnMsIGNvbnN0IFBhcnRpY2xlQ2xhc3NpZmllck9wdGlvbnMqIG9wdGlvbnMpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcVNldENvbG9yQ2xhc3NpZmllck9wdGlvbnMoQ2xhc3NpZmllclNlc3Npb24qIHNlc3Npb24sIGNvbnN0IENvbG9yT3B0aW9ucyogb3B0aW9ucyk7CitJTUFRX0ZVTkMgTmVhcmVzdE5laWdoYm9yVHJhaW5pbmdSZXBvcnQqIElNQVFfU1REQ0FMTCBpbWFxVHJhaW5OZWFyZXN0TmVpZ2hib3JDbGFzc2lmaWVyKENsYXNzaWZpZXJTZXNzaW9uKiBzZXNzaW9uLCBjb25zdCBOZWFyZXN0TmVpZ2hib3JPcHRpb25zKiBvcHRpb25zKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFXcml0ZUNsYXNzaWZpZXJGaWxlKGNvbnN0IENsYXNzaWZpZXJTZXNzaW9uKiBzZXNzaW9uLCBjb25zdCBjaGFyKiBmaWxlTmFtZSwgV3JpdGVDbGFzc2lmaWVyRmlsZU1vZGUgbW9kZSwgY29uc3QgU3RyaW5nMjU1IGRlc2NyaXB0aW9uKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgTWVhc3VyZSBEaXN0YW5jZXMgZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBDbGFtcE1heDJSZXBvcnQqIElNQVFfU1REQ0FMTCBpbWFxQ2xhbXBNYXgyKEltYWdlKiBpbWFnZSwgY29uc3QgUk9JKiByb2ksIGNvbnN0IENvb3JkaW5hdGVTeXN0ZW0qIGJhc2VTeXN0ZW0sIGNvbnN0IENvb3JkaW5hdGVTeXN0ZW0qIG5ld1N5c3RlbSwgY29uc3QgQ3VydmVPcHRpb25zKiBjdXJ2ZVNldHRpbmdzLCBjb25zdCBDbGFtcFNldHRpbmdzKiBjbGFtcFNldHRpbmdzLCBjb25zdCBDbGFtcE92ZXJsYXlTZXR0aW5ncyogY2xhbXBPdmVybGF5U2V0dGluZ3MpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBJbnNwZWN0aW9uIGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxQ29tcGFyZUdvbGRlblRlbXBsYXRlKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgSW1hZ2UqIGdvbGRlblRlbXBsYXRlLCBJbWFnZSogYnJpZ2h0RGVmZWN0cywgSW1hZ2UqIGRhcmtEZWZlY3RzLCBjb25zdCBJbnNwZWN0aW9uQWxpZ25tZW50KiBhbGlnbm1lbnQsIGNvbnN0IEluc3BlY3Rpb25PcHRpb25zKiBvcHRpb25zKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFMZWFybkdvbGRlblRlbXBsYXRlKEltYWdlKiBnb2xkZW5UZW1wbGF0ZSwgUG9pbnRGbG9hdCBvcmlnaW5PZmZzZXQsIGNvbnN0IEltYWdlKiBtYXNrKTsKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIE9ic29sZXRlIGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcVJvdGF0ZShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgZmxvYXQgYW5nbGUsIFBpeGVsVmFsdWUgZmlsbCwgSW50ZXJwb2xhdGlvbk1ldGhvZCBtZXRob2QpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFXcml0ZVBOR0ZpbGUoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBjaGFyKiBmaWxlTmFtZSwgdW5zaWduZWQgaW50IGNvbXByZXNzaW9uU3BlZWQsIGNvbnN0IFJHQlZhbHVlKiBjb2xvclRhYmxlKTsKK0lNQVFfRlVOQyBQYXJ0aWNsZVJlcG9ydCogICAgICAgIElNQVFfU1REQ0FMTCBpbWFxU2VsZWN0UGFydGljbGVzKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgUGFydGljbGVSZXBvcnQqIHJlcG9ydHMsIGludCByZXBvcnRDb3VudCwgaW50IHJlamVjdEJvcmRlciwgY29uc3QgU2VsZWN0UGFydGljbGVDcml0ZXJpYSogY3JpdGVyaWEsIGludCBjcml0ZXJpYUNvdW50LCBpbnQqIHNlbGVjdGVkQ291bnQpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFQYXJ0aWNsZUZpbHRlcihJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSwgY29uc3QgUGFydGljbGVGaWx0ZXJDcml0ZXJpYSogY3JpdGVyaWEsIGludCBjcml0ZXJpYUNvdW50LCBpbnQgcmVqZWN0TWF0Y2hlcywgaW50IGNvbm5lY3Rpdml0eTgpOworSU1BUV9GVU5DIFBhcnRpY2xlUmVwb3J0KiAgICAgICAgSU1BUV9TVERDQUxMIGltYXFHZXRQYXJ0aWNsZUluZm8oSW1hZ2UqIGltYWdlLCBpbnQgY29ubmVjdGl2aXR5OCwgUGFydGljbGVJbmZvTW9kZSBtb2RlLCBpbnQqIHJlcG9ydENvdW50KTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxQ2FsY0NvZWZmKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgUGFydGljbGVSZXBvcnQqIHJlcG9ydCwgTWVhc3VyZW1lbnRWYWx1ZSBwYXJhbWV0ZXIsIGZsb2F0KiBjb2VmZmljaWVudCk7CitJTUFRX0ZVTkMgRWRnZVJlcG9ydCogICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUVkZ2VUb29sKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgUG9pbnQqIHBvaW50cywgaW50IG51bVBvaW50cywgY29uc3QgRWRnZU9wdGlvbnMqIG9wdGlvbnMsIGludCogbnVtRWRnZXMpOworSU1BUV9GVU5DIENpcmNsZVJlcG9ydCogICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFDaXJjbGVzKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBmbG9hdCBtaW5SYWRpdXMsIGZsb2F0IG1heFJhZGl1cywgaW50KiBudW1DaXJjbGVzKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxTGFiZWwoSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UsIGludCBjb25uZWN0aXZpdHk4LCBpbnQqIHBhcnRpY2xlQ291bnQpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFGaXRFbGxpcHNlKGNvbnN0IFBvaW50RmxvYXQqIHBvaW50cywgaW50IG51bVBvaW50cywgQmVzdEVsbGlwc2UqIGVsbGlwc2UpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFGaXRDaXJjbGUoY29uc3QgUG9pbnRGbG9hdCogcG9pbnRzLCBpbnQgbnVtUG9pbnRzLCBCZXN0Q2lyY2xlKiBjaXJjbGUpOworSU1BUV9GVU5DIENvbG9yICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFDaGFuZ2VDb2xvclNwYWNlKGNvbnN0IENvbG9yKiBzb3VyY2VDb2xvciwgQ29sb3JNb2RlIHNvdXJjZVNwYWNlLCBDb2xvck1vZGUgZGVzdFNwYWNlKTsKK0lNQVFfRlVOQyBQYXR0ZXJuTWF0Y2gqICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxTWF0Y2hQYXR0ZXJuKGNvbnN0IEltYWdlKiBpbWFnZSwgSW1hZ2UqIHBhdHRlcm4sIGNvbnN0IE1hdGNoUGF0dGVybk9wdGlvbnMqIG9wdGlvbnMsIFJlY3Qgc2VhcmNoUmVjdCwgaW50KiBudW1NYXRjaGVzKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxQ29udmV4KEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxSXNWaXNpb25JbmZvUHJlc2VudChjb25zdCBJbWFnZSogaW1hZ2UsIFZpc2lvbkluZm9UeXBlIHR5cGUsIGludCogcHJlc2VudCk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUxpbmVHYXVnZVRvb2woY29uc3QgSW1hZ2UqIGltYWdlLCBQb2ludCBzdGFydCwgUG9pbnQgZW5kLCBMaW5lR2F1Z2VNZXRob2QgbWV0aG9kLCBjb25zdCBFZGdlT3B0aW9ucyogZWRnZU9wdGlvbnMsIGNvbnN0IENvb3JkaW5hdGVUcmFuc2Zvcm0qIHJlZmVyZW5jZSwgZmxvYXQqIGRpc3RhbmNlKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxQmVzdENpcmNsZShjb25zdCBQb2ludEZsb2F0KiBwb2ludHMsIGludCBudW1Qb2ludHMsIFBvaW50RmxvYXQqIGNlbnRlciwgZG91YmxlKiByYWRpdXMpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFTYXZlUGF0dGVybihjb25zdCBJbWFnZSogcGF0dGVybiwgY29uc3QgY2hhciogZmlsZU5hbWUpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFMb2FkUGF0dGVybihJbWFnZSogcGF0dGVybiwgY29uc3QgY2hhciogZmlsZU5hbWUpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFUcmFuc2Zvcm1ST0koUk9JKiByb2ksIFBvaW50IG9yaWdpblN0YXJ0LCBmbG9hdCBhbmdsZVN0YXJ0LCBQb2ludCBvcmlnaW5GaW5hbCwgZmxvYXQgYW5nbGVGaW5hbCk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUNvb3JkaW5hdGVSZWZlcmVuY2UoY29uc3QgUG9pbnQqIHBvaW50cywgUmVmZXJlbmNlTW9kZSBtb2RlLCBQb2ludCogb3JpZ2luLCBmbG9hdCogYW5nbGUpOworSU1BUV9GVU5DIENvbnRvdXJJbmZvKiAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFHZXRDb250b3VySW5mbyhjb25zdCBST0kqIHJvaSwgQ29udG91cklEIGlkKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxU2V0V2luZG93T3ZlcmxheShpbnQgd2luZG93TnVtYmVyLCBjb25zdCBPdmVybGF5KiBvdmVybGF5KTsKK0lNQVFfRlVOQyBPdmVybGF5KiAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxQ3JlYXRlT3ZlcmxheUZyb21ST0koY29uc3QgUk9JKiByb2kpOworSU1BUV9GVU5DIE92ZXJsYXkqICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFDcmVhdGVPdmVybGF5RnJvbU1ldGFmaWxlKGNvbnN0IHZvaWQqIG1ldGFmaWxlKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxU2V0Q2FsaWJyYXRpb25JbmZvKEltYWdlKiBpbWFnZSwgQ2FsaWJyYXRpb25Vbml0IHVuaXQsIGZsb2F0IHhEaXN0YW5jZSwgZmxvYXQgeURpc3RhbmNlKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxR2V0Q2FsaWJyYXRpb25JbmZvKGNvbnN0IEltYWdlKiBpbWFnZSwgQ2FsaWJyYXRpb25Vbml0KiB1bml0LCBmbG9hdCogeERpc3RhbmNlLCBmbG9hdCogeURpc3RhbmNlKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxQ29uc3RydWN0Uk9JKGNvbnN0IEltYWdlKiBpbWFnZSwgUk9JKiByb2ksIFRvb2wgaW5pdGlhbFRvb2wsIGNvbnN0IFRvb2xXaW5kb3dPcHRpb25zKiB0b29scywgY29uc3QgQ29uc3RydWN0Uk9JT3B0aW9ucyogb3B0aW9ucywgaW50KiBva2F5KTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxR2V0UGFydGljbGVDbGFzc2lmaWVyT3B0aW9ucyhjb25zdCBDbGFzc2lmaWVyU2Vzc2lvbiogc2Vzc2lvbiwgUGFydGljbGVDbGFzc2lmaWVyUHJlcHJvY2Vzc2luZ09wdGlvbnMqIHByZXByb2Nlc3NpbmdPcHRpb25zLCBQYXJ0aWNsZUNsYXNzaWZpZXJPcHRpb25zKiBvcHRpb25zKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxWm9vbVdpbmRvdyhpbnQgd2luZG93TnVtYmVyLCBpbnQgeFpvb20sIGludCB5Wm9vbSwgUG9pbnQgY2VudGVyKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxR2V0V2luZG93Wm9vbShpbnQgd2luZG93TnVtYmVyLCBpbnQqIHhab29tLCBpbnQqIHlab29tKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxUGFydGljbGVGaWx0ZXIzKEltYWdlKiBkZXN0LCBJbWFnZSogc291cmNlLCBjb25zdCBQYXJ0aWNsZUZpbHRlckNyaXRlcmlhMiogY3JpdGVyaWEsIGludCBjcml0ZXJpYUNvdW50LCBjb25zdCBQYXJ0aWNsZUZpbHRlck9wdGlvbnMqIG9wdGlvbnMsIGNvbnN0IFJPSSogcm9pLCBpbnQqIG51bVBhcnRpY2xlcyk7CitJTUFRX0ZVTkMgUmVhZFRleHRSZXBvcnQyKiAgICAgICBJTUFRX1NURENBTEwgaW1hcVJlYWRUZXh0Mihjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IENoYXJTZXQqIHNldCwgY29uc3QgUk9JKiByb2ksIGNvbnN0IFJlYWRUZXh0T3B0aW9ucyogcmVhZE9wdGlvbnMsIGNvbnN0IE9DUlByb2Nlc3NpbmdPcHRpb25zKiBwcm9jZXNzaW5nT3B0aW9ucywgY29uc3QgT0NSU3BhY2luZ09wdGlvbnMqIHNwYWNpbmdPcHRpb25zKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxTGVhcm5QYXR0ZXJuMihJbWFnZSogaW1hZ2UsIExlYXJuaW5nTW9kZSBsZWFybmluZ01vZGUsIExlYXJuUGF0dGVybkFkdmFuY2VkT3B0aW9ucyogYWR2YW5jZWRPcHRpb25zKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxQ29udm9sdmUoSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UsIGNvbnN0IGZsb2F0KiBrZXJuZWwsIGludCBtYXRyaXhSb3dzLCBpbnQgbWF0cml4Q29scywgZmxvYXQgbm9ybWFsaXplLCBjb25zdCBJbWFnZSogbWFzayk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcURpdmlkZUNvbnN0YW50KEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBQaXhlbFZhbHVlIHZhbHVlKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxRGl2aWRlKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlQSwgY29uc3QgSW1hZ2UqIHNvdXJjZUIpOworSU1BUV9GVU5DIEVkZ2VSZXBvcnQyKiAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFFZGdlVG9vbDMoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBST0kqIHJvaSwgRWRnZVByb2Nlc3MgcHJvY2Vzc1R5cGUsIGNvbnN0IEVkZ2VPcHRpb25zMiogZWRnZU9wdGlvbnMpOworSU1BUV9GVU5DIENvbmNlbnRyaWNSYWtlUmVwb3J0KiAgSU1BUV9TVERDQUxMIGltYXFDb25jZW50cmljUmFrZShjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IFJPSSogcm9pLCBDb25jZW50cmljUmFrZURpcmVjdGlvbiBkaXJlY3Rpb24sIEVkZ2VQcm9jZXNzIHByb2Nlc3MsIGNvbnN0IFJha2VPcHRpb25zKiBvcHRpb25zKTsKK0lNQVFfRlVOQyBTcG9rZVJlcG9ydCogICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxU3Bva2UoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBST0kqIHJvaSwgU3Bva2VEaXJlY3Rpb24gZGlyZWN0aW9uLCBFZGdlUHJvY2VzcyBwcm9jZXNzLCBjb25zdCBTcG9rZU9wdGlvbnMqIG9wdGlvbnMpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFMZWFyblBhdHRlcm4oSW1hZ2UqIGltYWdlLCBMZWFybmluZ01vZGUgbGVhcm5pbmdNb2RlKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxTG9va3VwKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBjb25zdCBzaG9ydCogdGFibGUsIGNvbnN0IEltYWdlKiBtYXNrKTsKK0lNQVFfRlVOQyBQYXR0ZXJuTWF0Y2gqICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxTWF0Y2hQYXR0ZXJuMihjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IEltYWdlKiBwYXR0ZXJuLCBjb25zdCBNYXRjaFBhdHRlcm5PcHRpb25zKiBvcHRpb25zLCBjb25zdCBNYXRjaFBhdHRlcm5BZHZhbmNlZE9wdGlvbnMqIGFkdmFuY2VkT3B0aW9ucywgUmVjdCBzZWFyY2hSZWN0LCBpbnQqIG51bU1hdGNoZXMpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFTZXRQYXJ0aWNsZUNsYXNzaWZpZXJPcHRpb25zKENsYXNzaWZpZXJTZXNzaW9uKiBzZXNzaW9uLCBjb25zdCBQYXJ0aWNsZUNsYXNzaWZpZXJQcmVwcm9jZXNzaW5nT3B0aW9ucyogcHJlcHJvY2Vzc2luZ09wdGlvbnMsIGNvbnN0IFBhcnRpY2xlQ2xhc3NpZmllck9wdGlvbnMqIG9wdGlvbnMpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFDb3B5Q2FsaWJyYXRpb25JbmZvKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxUGFydGljbGVGaWx0ZXIyKEltYWdlKiBkZXN0LCBJbWFnZSogc291cmNlLCBjb25zdCBQYXJ0aWNsZUZpbHRlckNyaXRlcmlhMiogY3JpdGVyaWEsIGludCBjcml0ZXJpYUNvdW50LCBpbnQgcmVqZWN0TWF0Y2hlcywgaW50IGNvbm5lY3Rpdml0eTgsIGludCogbnVtUGFydGljbGVzKTsKK0lNQVFfRlVOQyBFZGdlUmVwb3J0KiAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxRWRnZVRvb2wyKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgUG9pbnQqIHBvaW50cywgaW50IG51bVBvaW50cywgRWRnZVByb2Nlc3MgcHJvY2VzcywgY29uc3QgRWRnZU9wdGlvbnMqIG9wdGlvbnMsIGludCogbnVtRWRnZXMpOworSU1BUV9GVU5DIENvbnRvdXJJRCAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFBZGRSb3RhdGVkUmVjdENvbnRvdXIoUk9JKiByb2ksIFJvdGF0ZWRSZWN0IHJlY3QpOworSU1BUV9GVU5DIEJhcmNvZGUyREluZm8qICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFSZWFkRGF0YU1hdHJpeEJhcmNvZGUoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBST0kqIHJvaSwgY29uc3QgRGF0YU1hdHJpeE9wdGlvbnMqIG9wdGlvbnMsIHVuc2lnbmVkIGludCogbnVtQmFyY29kZXMpOworSU1BUV9GVU5DIExpbmVhckF2ZXJhZ2VzKiAgICAgICAgSU1BUV9TVERDQUxMIGltYXFMaW5lYXJBdmVyYWdlcyhjb25zdCBJbWFnZSogaW1hZ2UsIFJlY3QgcmVjdCk7CitJTUFRX0ZVTkMgR2VvbWV0cmljUGF0dGVybk1hdGNoKiBJTUFRX1NURENBTEwgaW1hcU1hdGNoR2VvbWV0cmljUGF0dGVybihjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IEltYWdlKiBwYXR0ZXJuLCBjb25zdCBDdXJ2ZU9wdGlvbnMqIGN1cnZlT3B0aW9ucywgY29uc3QgTWF0Y2hHZW9tZXRyaWNQYXR0ZXJuT3B0aW9ucyogbWF0Y2hPcHRpb25zLCBjb25zdCBNYXRjaEdlb21ldHJpY1BhdHRlcm5BZHZhbmNlZE9wdGlvbnMqIGFkdmFuY2VkTWF0Y2hPcHRpb25zLCBjb25zdCBST0kqIHJvaSwgaW50KiBudW1NYXRjaGVzKTsKK0lNQVFfRlVOQyBDaGFySW5mbyogICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxR2V0Q2hhckluZm8oY29uc3QgQ2hhclNldCogc2V0LCBpbnQgaW5kZXgpOworSU1BUV9GVU5DIFJlYWRUZXh0UmVwb3J0KiAgICAgICAgSU1BUV9TVERDQUxMIGltYXFSZWFkVGV4dChjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IENoYXJTZXQqIHNldCwgY29uc3QgUk9JKiByb2ksIGNvbnN0IFJlYWRUZXh0T3B0aW9ucyogcmVhZE9wdGlvbnMsIGNvbnN0IE9DUlByb2Nlc3NpbmdPcHRpb25zKiBwcm9jZXNzaW5nT3B0aW9ucywgY29uc3QgT0NSU3BhY2luZ09wdGlvbnMqIHNwYWNpbmdPcHRpb25zKTsKK0lNQVFfRlVOQyBUaHJlc2hvbGREYXRhKiAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxQXV0b1RocmVzaG9sZChJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSwgaW50IG51bUNsYXNzZXMsIFRocmVzaG9sZE1ldGhvZCBtZXRob2QpOworSU1BUV9GVU5DIENvbG9ySGlzdG9ncmFtUmVwb3J0KiAgSU1BUV9TVERDQUxMIGltYXFDb2xvckhpc3RvZ3JhbShJbWFnZSogaW1hZ2UsIGludCBudW1DbGFzc2VzLCBDb2xvck1vZGUgbW9kZSwgY29uc3QgSW1hZ2UqIG1hc2spOworSU1BUV9GVU5DIFJha2VSZXBvcnQqICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFSYWtlKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgUk9JKiByb2ksIFJha2VEaXJlY3Rpb24gZGlyZWN0aW9uLCBFZGdlUHJvY2VzcyBwcm9jZXNzLCBjb25zdCBSYWtlT3B0aW9ucyogb3B0aW9ucyk7CisKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBQcml2X1JlYWRKUEVHU3RyaW5nX0MoSW1hZ2UqIGltYWdlLCBjb25zdCB1bnNpZ25lZCBjaGFyKiBzdHJpbmcsIHVuc2lnbmVkIGludCBzdHJpbmdMZW5ndGgpOworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL3BjcmUuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL3BjcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGRkY2JmCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvcGNyZS5oCkBAIC0wLDAgKzEsMzM4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgICAgICBQZXJsLUNvbXBhdGlibGUgUmVndWxhciBFeHByZXNzaW9ucyAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoaXMgaXMgdGhlIHB1YmxpYyBoZWFkZXIgZmlsZSBmb3IgdGhlIFBDUkUgbGlicmFyeSwgdG8gYmUgI2luY2x1ZGVkIGJ5CithcHBsaWNhdGlvbnMgdGhhdCBjYWxsIHRoZSBQQ1JFIGZ1bmN0aW9ucy4KKworICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDE5OTctMjAwOCBVbml2ZXJzaXR5IG9mIENhbWJyaWRnZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FtYnJpZGdlIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICAgICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCitBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCitJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCitMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCitDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCitJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKK0FSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCitQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZuZGVmIF9QQ1JFX0gKKyNkZWZpbmUgX1BDUkVfSAorCisvKiBUaGUgY3VycmVudCBQQ1JFIHZlcnNpb24gaW5mb3JtYXRpb24uICovCisKKyNkZWZpbmUgUENSRV9NQUpPUiAgICAgICAgICA3CisjZGVmaW5lIFBDUkVfTUlOT1IgICAgICAgICAgOAorI2RlZmluZSBQQ1JFX1BSRVJFTEVBU0UgICAgIAorI2RlZmluZSBQQ1JFX0RBVEUgICAgICAgICAgIDIwMDgtMDktMDUKKworLyogV2hlbiBhbiBhcHBsaWNhdGlvbiBsaW5rcyB0byBhIFBDUkUgRExMIGluIFdpbmRvd3MsIHRoZSBzeW1ib2xzIHRoYXQgYXJlCitpbXBvcnRlZCBoYXZlIHRvIGJlIGlkZW50aWZpZWQgYXMgc3VjaC4gV2hlbiBidWlsZGluZyBQQ1JFLCB0aGUgYXBwcm9wcmlhdGUKK2V4cG9ydCBzZXR0aW5nIGlzIGRlZmluZWQgaW4gcGNyZV9pbnRlcm5hbC5oLCB3aGljaCBpbmNsdWRlcyB0aGlzIGZpbGUuIFNvIHdlCitkb24ndCBjaGFuZ2UgZXhpc3RpbmcgZGVmaW5pdGlvbnMgb2YgUENSRV9FWFBfREVDTCBhbmQgUENSRUNQUF9FWFBfREVDTC4gKi8KKworLyoqCisgKiBOSSBDSEFOR0UKKyAqCisgKiBXZSBkb24ndCBidWlsZCB0aGUgRExMIHZlcnNpb24uIFdlIG9ubHkgYnVpbGQgdGhlIHN0YXRpYyBsaWIgdmVyc2lvbi4KKyAqIFNpbmNlIHdlIGRvbid0IHdhbnQgdG8gaGF2ZSB0byAjZGVmaW5lIFBDUkVfU1RBVElDIGluIGV2ZXJ5IGNvbXBvbmVudCB0aGF0CisgKiBpbmNsdWRlcyBwY3JlLmgsIHdlJ3JlIGp1c3QgZ29pbmcgdG8gZ28gYWhlYWQgYW5kIGRlZmluZSBpdCBoZXJlLgorICoKKyAqIEFkYW0gS2VtcCwgMTIvMTUvMjAwOAorKi8KKyNkZWZpbmUgUENSRV9TVEFUSUMKKworI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChQQ1JFX1NUQVRJQykKKyMgIGlmbmRlZiBQQ1JFX0VYUF9ERUNMCisjICAgIGRlZmluZSBQQ1JFX0VYUF9ERUNMICBleHRlcm4gX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjICBlbmRpZgorIyAgaWZkZWYgX19jcGx1c3BsdXMKKyMgICAgaWZuZGVmIFBDUkVDUFBfRVhQX0RFQ0wKKyMgICAgICBkZWZpbmUgUENSRUNQUF9FWFBfREVDTCAgZXh0ZXJuIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorIyAgICBlbmRpZgorIyAgICBpZm5kZWYgUENSRUNQUF9FWFBfREVGTgorIyAgICAgIGRlZmluZSBQQ1JFQ1BQX0VYUF9ERUZOICBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworLyogQnkgZGVmYXVsdCwgd2UgdXNlIHRoZSBzdGFuZGFyZCAiZXh0ZXJuIiBkZWNsYXJhdGlvbnMuICovCisKKyNpZm5kZWYgUENSRV9FWFBfREVDTAorIyAgaWZkZWYgX19jcGx1c3BsdXMKKyMgICAgZGVmaW5lIFBDUkVfRVhQX0RFQ0wgIGV4dGVybiAiQyIKKyMgIGVsc2UKKyMgICAgZGVmaW5lIFBDUkVfRVhQX0RFQ0wgIGV4dGVybgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKKyMgIGlmbmRlZiBQQ1JFQ1BQX0VYUF9ERUNMCisjICAgIGRlZmluZSBQQ1JFQ1BQX0VYUF9ERUNMICBleHRlcm4KKyMgIGVuZGlmCisjICBpZm5kZWYgUENSRUNQUF9FWFBfREVGTgorIyAgICBkZWZpbmUgUENSRUNQUF9FWFBfREVGTgorIyAgZW5kaWYKKyNlbmRpZgorCisvKioKKyAqIE5JIENIQU5HRQorICoKKyAqIFdlIHVzZSBfX2NkZWNsIG9uIHdpbjMyIGFuZCB0aGUgZGVmYXVsdCBjYWxsaW5nIGNvbnZlbnRpb24gZWxzZXdoZXJlLgorICoKKyAqIE9yaWdpbmFsbCB0aGlzIG1hY3JvIGRpZCBub3QgYXBwZWFyIGluIHRoaXMgZmlsZSwgYnV0IGl0IHdhcyB1c2VkIGluCisgKiBpbnRlcm5hbCBoZWFkZXJzLiBJIGNvbnNpZGVyIGl0IGFuIG92ZXJzaWdodCBvbiB0aGUgcGFydCBvZiB0aGUgcGNyZQorICogZGV2ZWxvcGVycyB0aGF0ICogaXQgd2FzIG5vdCB1c2VkIGluIHRoaXMgZmlsZS4gSWYgdGhlc2UgZnVuY3Rpb25zIHVzZQorICogc3BlY2lmaWMgY2FsbGluZyBjb252ZW50aW9ucyB0aGVuIHRoZWlyIHByb3RvdHlwZXMgc2hvdWxkIGluY2x1ZGUgdGhhdAorICogY2FsbGluZyBjb252ZW50aW9uIGluIGNhc2Ugc29tZSBvdGhlciBwcm9qZWN0IHVzZXMgYSBkaWZmZXJlbnQgZGVmYXVsdC4KKyAqCisgKiBBZGFtIEtlbXAgMTIvMTUvMjAwOAorKi8KKyNpZm5kZWYgUENSRV9DQUxMX0NPTlZFTlRJT04KKyMgIGlmIGRlZmluZWQoX1dJTjMyKSAvKiAzMi1iaXQgYW5kIDY0LWJpdCAqLworIyAgICBkZWZpbmUgUENSRV9DQUxMX0NPTlZFTlRJT04gX19jZGVjbAorIyAgZWxzZQorIyAgICBkZWZpbmUgUENSRV9DQUxMX0NPTlZFTlRJT04KKyMgIGVuZGlmCisjZWxzZQorIyAgZGVmaW5lIFBDUkVfQ0FMTF9DT05WRU5USU9OCisjZW5kaWYKKworLyogSGF2ZSB0byBpbmNsdWRlIHN0ZGxpYi5oIGluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IHNpemVfdCBpcyBkZWZpbmVkOworaXQgaXMgbmVlZGVkIGhlcmUgZm9yIG1hbGxvYy4gKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvKiBBbGxvdyBmb3IgQysrIHVzZXJzICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogT3B0aW9ucyAqLworCisjZGVmaW5lIFBDUkVfQ0FTRUxFU1MgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgUENSRV9NVUxUSUxJTkUgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBQQ1JFX0RPVEFMTCAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIFBDUkVfRVhURU5ERUQgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgUENSRV9BTkNIT1JFRCAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBQQ1JFX0RPTExBUl9FTkRPTkxZICAgICAweDAwMDAwMDIwCisjZGVmaW5lIFBDUkVfRVhUUkEgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgUENSRV9OT1RCT0wgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBQQ1JFX05PVEVPTCAgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIFBDUkVfVU5HUkVFRFkgICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgUENSRV9OT1RFTVBUWSAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBQQ1JFX1VURjggICAgICAgICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIFBDUkVfTk9fQVVUT19DQVBUVVJFICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgUENSRV9OT19VVEY4X0NIRUNLICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBQQ1JFX0FVVE9fQ0FMTE9VVCAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIFBDUkVfUEFSVElBTCAgICAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgUENSRV9ERkFfU0hPUlRFU1QgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBQQ1JFX0RGQV9SRVNUQVJUICAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIFBDUkVfRklSU1RMSU5FICAgICAgICAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgUENSRV9EVVBOQU1FUyAgICAgICAgICAgMHgwMDA4MDAwMAorI2RlZmluZSBQQ1JFX05FV0xJTkVfQ1IgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIFBDUkVfTkVXTElORV9MRiAgICAgICAgIDB4MDAyMDAwMDAKKyNkZWZpbmUgUENSRV9ORVdMSU5FX0NSTEYgICAgICAgMHgwMDMwMDAwMAorI2RlZmluZSBQQ1JFX05FV0xJTkVfQU5ZICAgICAgICAweDAwNDAwMDAwCisjZGVmaW5lIFBDUkVfTkVXTElORV9BTllDUkxGICAgIDB4MDA1MDAwMDAKKyNkZWZpbmUgUENSRV9CU1JfQU5ZQ1JMRiAgICAgICAgMHgwMDgwMDAwMAorI2RlZmluZSBQQ1JFX0JTUl9VTklDT0RFICAgICAgICAweDAxMDAwMDAwCisjZGVmaW5lIFBDUkVfSkFWQVNDUklQVF9DT01QQVQgIDB4MDIwMDAwMDAKKworLyogRXhlYy10aW1lIGFuZCBnZXQvc2V0LXRpbWUgZXJyb3IgY29kZXMgKi8KKworI2RlZmluZSBQQ1JFX0VSUk9SX05PTUFUQ0ggICAgICAgICAoLTEpCisjZGVmaW5lIFBDUkVfRVJST1JfTlVMTCAgICAgICAgICAgICgtMikKKyNkZWZpbmUgUENSRV9FUlJPUl9CQURPUFRJT04gICAgICAgKC0zKQorI2RlZmluZSBQQ1JFX0VSUk9SX0JBRE1BR0lDICAgICAgICAoLTQpCisjZGVmaW5lIFBDUkVfRVJST1JfVU5LTk9XTl9PUENPREUgICgtNSkKKyNkZWZpbmUgUENSRV9FUlJPUl9VTktOT1dOX05PREUgICAgKC01KSAgLyogRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUgUENSRV9FUlJPUl9OT01FTU9SWSAgICAgICAgKC02KQorI2RlZmluZSBQQ1JFX0VSUk9SX05PU1VCU1RSSU5HICAgICAoLTcpCisjZGVmaW5lIFBDUkVfRVJST1JfTUFUQ0hMSU1JVCAgICAgICgtOCkKKyNkZWZpbmUgUENSRV9FUlJPUl9DQUxMT1VUICAgICAgICAgKC05KSAgLyogTmV2ZXIgdXNlZCBieSBQQ1JFIGl0c2VsZiAqLworI2RlZmluZSBQQ1JFX0VSUk9SX0JBRFVURjggICAgICAgICgtMTApCisjZGVmaW5lIFBDUkVfRVJST1JfQkFEVVRGOF9PRkZTRVQgKC0xMSkKKyNkZWZpbmUgUENSRV9FUlJPUl9QQVJUSUFMICAgICAgICAoLTEyKQorI2RlZmluZSBQQ1JFX0VSUk9SX0JBRFBBUlRJQUwgICAgICgtMTMpCisjZGVmaW5lIFBDUkVfRVJST1JfSU5URVJOQUwgICAgICAgKC0xNCkKKyNkZWZpbmUgUENSRV9FUlJPUl9CQURDT1VOVCAgICAgICAoLTE1KQorI2RlZmluZSBQQ1JFX0VSUk9SX0RGQV9VSVRFTSAgICAgICgtMTYpCisjZGVmaW5lIFBDUkVfRVJST1JfREZBX1VDT05EICAgICAgKC0xNykKKyNkZWZpbmUgUENSRV9FUlJPUl9ERkFfVU1MSU1JVCAgICAoLTE4KQorI2RlZmluZSBQQ1JFX0VSUk9SX0RGQV9XU1NJWkUgICAgICgtMTkpCisjZGVmaW5lIFBDUkVfRVJST1JfREZBX1JFQ1VSU0UgICAgKC0yMCkKKyNkZWZpbmUgUENSRV9FUlJPUl9SRUNVUlNJT05MSU1JVCAoLTIxKQorI2RlZmluZSBQQ1JFX0VSUk9SX05VTExXU0xJTUlUICAgICgtMjIpICAvKiBObyBsb25nZXIgYWN0dWFsbHkgdXNlZCAqLworI2RlZmluZSBQQ1JFX0VSUk9SX0JBRE5FV0xJTkUgICAgICgtMjMpCisKKy8qIFJlcXVlc3QgdHlwZXMgZm9yIHBjcmVfZnVsbGluZm8oKSAqLworCisjZGVmaW5lIFBDUkVfSU5GT19PUFRJT05TICAgICAgICAgICAgMAorI2RlZmluZSBQQ1JFX0lORk9fU0laRSAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUENSRV9JTkZPX0NBUFRVUkVDT1VOVCAgICAgICAyCisjZGVmaW5lIFBDUkVfSU5GT19CQUNLUkVGTUFYICAgICAgICAgMworI2RlZmluZSBQQ1JFX0lORk9fRklSU1RCWVRFICAgICAgICAgIDQKKyNkZWZpbmUgUENSRV9JTkZPX0ZJUlNUQ0hBUiAgICAgICAgICA0ICAvKiBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUgUENSRV9JTkZPX0ZJUlNUVEFCTEUgICAgICAgICA1CisjZGVmaW5lIFBDUkVfSU5GT19MQVNUTElURVJBTCAgICAgICAgNgorI2RlZmluZSBQQ1JFX0lORk9fTkFNRUVOVFJZU0laRSAgICAgIDcKKyNkZWZpbmUgUENSRV9JTkZPX05BTUVDT1VOVCAgICAgICAgICA4CisjZGVmaW5lIFBDUkVfSU5GT19OQU1FVEFCTEUgICAgICAgICAgOQorI2RlZmluZSBQQ1JFX0lORk9fU1RVRFlTSVpFICAgICAgICAgMTAKKyNkZWZpbmUgUENSRV9JTkZPX0RFRkFVTFRfVEFCTEVTICAgIDExCisjZGVmaW5lIFBDUkVfSU5GT19PS1BBUlRJQUwgICAgICAgICAxMgorI2RlZmluZSBQQ1JFX0lORk9fSkNIQU5HRUQgICAgICAgICAgMTMKKyNkZWZpbmUgUENSRV9JTkZPX0hBU0NST1JMRiAgICAgICAgIDE0CisKKy8qIFJlcXVlc3QgdHlwZXMgZm9yIHBjcmVfY29uZmlnKCkuIERvIG5vdCByZS1hcnJhbmdlLCBpbiBvcmRlciB0byByZW1haW4KK2NvbXBhdGlibGUuICovCisKKyNkZWZpbmUgUENSRV9DT05GSUdfVVRGOCAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBQQ1JFX0NPTkZJR19ORVdMSU5FICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFBDUkVfQ09ORklHX0xJTktfU0laRSAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgUENSRV9DT05GSUdfUE9TSVhfTUFMTE9DX1RIUkVTSE9MRCAgMworI2RlZmluZSBQQ1JFX0NPTkZJR19NQVRDSF9MSU1JVCAgICAgICAgICAgICA0CisjZGVmaW5lIFBDUkVfQ09ORklHX1NUQUNLUkVDVVJTRSAgICAgICAgICAgIDUKKyNkZWZpbmUgUENSRV9DT05GSUdfVU5JQ09ERV9QUk9QRVJUSUVTICAgICAgNgorI2RlZmluZSBQQ1JFX0NPTkZJR19NQVRDSF9MSU1JVF9SRUNVUlNJT04gICA3CisjZGVmaW5lIFBDUkVfQ09ORklHX0JTUiAgICAgICAgICAgICAgICAgICAgIDgKKworLyogQml0IGZsYWdzIGZvciB0aGUgcGNyZV9leHRyYSBzdHJ1Y3R1cmUuIERvIG5vdCByZS1hcnJhbmdlIG9yIHJlZGVmaW5lCit0aGVzZSBiaXRzLCBqdXN0IGFkZCBuZXcgb25lcyBvbiB0aGUgZW5kLCBpbiBvcmRlciB0byByZW1haW4gY29tcGF0aWJsZS4gKi8KKworI2RlZmluZSBQQ1JFX0VYVFJBX1NUVURZX0RBVEEgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFBDUkVfRVhUUkFfTUFUQ0hfTElNSVQgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgUENSRV9FWFRSQV9DQUxMT1VUX0RBVEEgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBQQ1JFX0VYVFJBX1RBQkxFUyAgICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFBDUkVfRVhUUkFfTUFUQ0hfTElNSVRfUkVDVVJTSU9OICAweDAwMTAKKworLyogVHlwZXMgKi8KKworc3RydWN0IHJlYWxfcGNyZTsgICAgICAgICAgICAgICAgIC8qIGRlY2xhcmF0aW9uOyB0aGUgZGVmaW5pdGlvbiBpcyBwcml2YXRlICAqLwordHlwZWRlZiBzdHJ1Y3QgcmVhbF9wY3JlIHBjcmU7CisKKy8qIFdoZW4gUENSRSBpcyBjb21waWxlZCBhcyBhIEMrKyBsaWJyYXJ5LCB0aGUgc3ViamVjdCBwb2ludGVyIHR5cGUgY2FuIGJlCityZXBsYWNlZCB3aXRoIGEgY3VzdG9tIHR5cGUuIEZvciBjb252ZW50aW9uYWwgdXNlLCB0aGUgcHVibGljIGludGVyZmFjZSBpcyBhCitjb25zdCBjaGFyICouICovCisKKyNpZm5kZWYgUENSRV9TUFRSCisjZGVmaW5lIFBDUkVfU1BUUiBjb25zdCBjaGFyICoKKyNlbmRpZgorCisvKiBUaGUgc3RydWN0dXJlIGZvciBwYXNzaW5nIGFkZGl0aW9uYWwgZGF0YSB0byBwY3JlX2V4ZWMoKS4gVGhpcyBpcyBkZWZpbmVkIGluCitzdWNoIGFzIHdheSBhcyB0byBiZSBleHRlbnNpYmxlLiBBbHdheXMgYWRkIG5ldyBmaWVsZHMgYXQgdGhlIGVuZCwgaW4gb3JkZXIgdG8KK3JlbWFpbiBjb21wYXRpYmxlLiAqLworCit0eXBlZGVmIHN0cnVjdCBwY3JlX2V4dHJhIHsKKyAgdW5zaWduZWQgbG9uZyBpbnQgZmxhZ3M7ICAgICAgICAvKiBCaXRzIGZvciB3aGljaCBmaWVsZHMgYXJlIHNldCAqLworICB2b2lkICpzdHVkeV9kYXRhOyAgICAgICAgICAgICAgIC8qIE9wYXF1ZSBkYXRhIGZyb20gcGNyZV9zdHVkeSgpICovCisgIHVuc2lnbmVkIGxvbmcgaW50IG1hdGNoX2xpbWl0OyAgLyogTWF4aW11bSBudW1iZXIgb2YgY2FsbHMgdG8gbWF0Y2goKSAqLworICB2b2lkICpjYWxsb3V0X2RhdGE7ICAgICAgICAgICAgIC8qIERhdGEgcGFzc2VkIGJhY2sgaW4gY2FsbG91dHMgKi8KKyAgY29uc3QgdW5zaWduZWQgY2hhciAqdGFibGVzOyAgICAvKiBQb2ludGVyIHRvIGNoYXJhY3RlciB0YWJsZXMgKi8KKyAgdW5zaWduZWQgbG9uZyBpbnQgbWF0Y2hfbGltaXRfcmVjdXJzaW9uOyAvKiBNYXggcmVjdXJzaXZlIGNhbGxzIHRvIG1hdGNoKCkgKi8KK30gcGNyZV9leHRyYTsKKworLyogVGhlIHN0cnVjdHVyZSBmb3IgcGFzc2luZyBvdXQgZGF0YSB2aWEgdGhlIHBjcmVfY2FsbG91dF9mdW5jdGlvbi4gV2UgdXNlIGEKK3N0cnVjdHVyZSBzbyB0aGF0IG5ldyBmaWVsZHMgY2FuIGJlIGFkZGVkIG9uIHRoZSBlbmQgaW4gZnV0dXJlIHZlcnNpb25zLAord2l0aG91dCBjaGFuZ2luZyB0aGUgQVBJIG9mIHRoZSBmdW5jdGlvbiwgdGhlcmVieSBhbGxvd2luZyBvbGQgY2xpZW50cyB0byB3b3JrCit3aXRob3V0IG1vZGlmaWNhdGlvbi4gKi8KKwordHlwZWRlZiBzdHJ1Y3QgcGNyZV9jYWxsb3V0X2Jsb2NrIHsKKyAgaW50ICAgICAgICAgIHZlcnNpb247ICAgICAgICAgICAvKiBJZGVudGlmaWVzIHZlcnNpb24gb2YgYmxvY2sgKi8KKyAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFZlcnNpb24gMCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgIGludCAgICAgICAgICBjYWxsb3V0X251bWJlcjsgICAgLyogTnVtYmVyIGNvbXBpbGVkIGludG8gcGF0dGVybiAqLworICBpbnQgICAgICAgICAqb2Zmc2V0X3ZlY3RvcjsgICAgIC8qIFRoZSBvZmZzZXQgdmVjdG9yICovCisgIFBDUkVfU1BUUiAgICBzdWJqZWN0OyAgICAgICAgICAgLyogVGhlIHN1YmplY3QgYmVpbmcgbWF0Y2hlZCAqLworICBpbnQgICAgICAgICAgc3ViamVjdF9sZW5ndGg7ICAgIC8qIFRoZSBsZW5ndGggb2YgdGhlIHN1YmplY3QgKi8KKyAgaW50ICAgICAgICAgIHN0YXJ0X21hdGNoOyAgICAgICAvKiBPZmZzZXQgdG8gc3RhcnQgb2YgdGhpcyBtYXRjaCBhdHRlbXB0ICovCisgIGludCAgICAgICAgICBjdXJyZW50X3Bvc2l0aW9uOyAgLyogV2hlcmUgd2UgY3VycmVudGx5IGFyZSBpbiB0aGUgc3ViamVjdCAqLworICBpbnQgICAgICAgICAgY2FwdHVyZV90b3A7ICAgICAgIC8qIE1heCBjdXJyZW50IGNhcHR1cmUgKi8KKyAgaW50ICAgICAgICAgIGNhcHR1cmVfbGFzdDsgICAgICAvKiBNb3N0IHJlY2VudGx5IGNsb3NlZCBjYXB0dXJlICovCisgIHZvaWQgICAgICAgICpjYWxsb3V0X2RhdGE7ICAgICAgLyogRGF0YSBwYXNzZWQgaW4gd2l0aCB0aGUgY2FsbCAqLworICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIEFkZGVkIGZvciBWZXJzaW9uIDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgaW50ICAgICAgICAgIHBhdHRlcm5fcG9zaXRpb247ICAvKiBPZmZzZXQgdG8gbmV4dCBpdGVtIGluIHRoZSBwYXR0ZXJuICovCisgIGludCAgICAgICAgICBuZXh0X2l0ZW1fbGVuZ3RoOyAgLyogTGVuZ3RoIG9mIG5leHQgaXRlbSBpbiB0aGUgcGF0dGVybiAqLworICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK30gcGNyZV9jYWxsb3V0X2Jsb2NrOworCisvKiBJbmRpcmVjdGlvbiBmb3Igc3RvcmUgZ2V0IGFuZCBmcmVlIGZ1bmN0aW9ucy4gVGhlc2UgY2FuIGJlIHNldCB0bworYWx0ZXJuYXRpdmUgbWFsbG9jL2ZyZWUgZnVuY3Rpb25zIGlmIHJlcXVpcmVkLiBTcGVjaWFsIG9uZXMgYXJlIHVzZWQgaW4gdGhlCitub24tcmVjdXJzaXZlIGNhc2UgZm9yICJmcmFtZXMiLiBUaGVyZSBpcyBhbHNvIGFuIG9wdGlvbmFsIGNhbGxvdXQgZnVuY3Rpb24KK3RoYXQgaXMgdHJpZ2dlcmVkIGJ5IHRoZSAoPykgcmVnZXggaXRlbS4gRm9yIFZpcnR1YWwgUGFzY2FsLCB0aGVzZSBkZWZpbml0aW9ucworaGF2ZSB0byB0YWtlIGFub3RoZXIgZm9ybS4gKi8KKworI2lmbmRlZiBWUENPTVBBVAorUENSRV9FWFBfREVDTCB2b2lkKiAoUENSRV9DQUxMX0NPTlZFTlRJT04gKnBjcmVfbWFsbG9jKShzaXplX3QpOworUENSRV9FWFBfREVDTCB2b2lkICAoUENSRV9DQUxMX0NPTlZFTlRJT04gKnBjcmVfZnJlZSkodm9pZCAqKTsKK1BDUkVfRVhQX0RFQ0wgdm9pZCogKFBDUkVfQ0FMTF9DT05WRU5USU9OICpwY3JlX3N0YWNrX21hbGxvYykoc2l6ZV90KTsKK1BDUkVfRVhQX0RFQ0wgdm9pZCAgKFBDUkVfQ0FMTF9DT05WRU5USU9OICpwY3JlX3N0YWNrX2ZyZWUpKHZvaWQgKik7CitQQ1JFX0VYUF9ERUNMIGludCAgIChQQ1JFX0NBTExfQ09OVkVOVElPTiAqcGNyZV9jYWxsb3V0KShwY3JlX2NhbGxvdXRfYmxvY2sgKik7CisjZWxzZSAgIC8qIFZQQ09NUEFUICovCitQQ1JFX0VYUF9ERUNMIHZvaWQqIFBDUkVfQ0FMTF9DT05WRU5USU9OIHBjcmVfbWFsbG9jKHNpemVfdCk7CitQQ1JFX0VYUF9ERUNMIHZvaWQgIFBDUkVfQ0FMTF9DT05WRU5USU9OIHBjcmVfZnJlZSh2b2lkICopOworUENSRV9FWFBfREVDTCB2b2lkKiBQQ1JFX0NBTExfQ09OVkVOVElPTiBwY3JlX3N0YWNrX21hbGxvYyhzaXplX3QpOworUENSRV9FWFBfREVDTCB2b2lkICBQQ1JFX0NBTExfQ09OVkVOVElPTiBwY3JlX3N0YWNrX2ZyZWUodm9pZCAqKTsKK1BDUkVfRVhQX0RFQ0wgaW50ICAgUENSRV9DQUxMX0NPTlZFTlRJT04gcGNyZV9jYWxsb3V0KHBjcmVfY2FsbG91dF9ibG9jayAqKTsKKyNlbmRpZiAgLyogVlBDT01QQVQgKi8KKworLyogRXhwb3J0ZWQgUENSRSBmdW5jdGlvbnMgKi8KKworUENSRV9FWFBfREVDTCBwY3JlKiBQQ1JFX0NBTExfQ09OVkVOVElPTiBwY3JlX2NvbXBpbGUoY29uc3QgY2hhciAqLCBpbnQsIGNvbnN0IGNoYXIgKiosIGludCAqLAorICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqKTsKK1BDUkVfRVhQX0RFQ0wgcGNyZSogUENSRV9DQUxMX0NPTlZFTlRJT04gcGNyZV9jb21waWxlMihjb25zdCBjaGFyICosIGludCwgaW50ICosIGNvbnN0IGNoYXIgKiosCisgICAgICAgICAgICAgICAgICBpbnQgKiwgY29uc3QgdW5zaWduZWQgY2hhciAqKTsKK1BDUkVfRVhQX0RFQ0wgaW50ICBQQ1JFX0NBTExfQ09OVkVOVElPTiBwY3JlX2NvbmZpZyhpbnQsIHZvaWQgKik7CitQQ1JFX0VYUF9ERUNMIGludCAgUENSRV9DQUxMX0NPTlZFTlRJT04gcGNyZV9jb3B5X25hbWVkX3N1YnN0cmluZyhjb25zdCBwY3JlICosIGNvbnN0IGNoYXIgKiwKKyAgICAgICAgICAgICAgICAgIGludCAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgY2hhciAqLCBpbnQpOworUENSRV9FWFBfREVDTCBpbnQgIFBDUkVfQ0FMTF9DT05WRU5USU9OIHBjcmVfY29weV9zdWJzdHJpbmcoY29uc3QgY2hhciAqLCBpbnQgKiwgaW50LCBpbnQsIGNoYXIgKiwKKyAgICAgICAgICAgICAgICAgIGludCk7CitQQ1JFX0VYUF9ERUNMIGludCAgUENSRV9DQUxMX0NPTlZFTlRJT04gcGNyZV9kZmFfZXhlYyhjb25zdCBwY3JlICosIGNvbnN0IHBjcmVfZXh0cmEgKiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQsIGludCwgaW50ICosIGludCAsIGludCAqLCBpbnQpOworUENSRV9FWFBfREVDTCBpbnQgIFBDUkVfQ0FMTF9DT05WRU5USU9OIHBjcmVfZXhlYyhjb25zdCBwY3JlICosIGNvbnN0IHBjcmVfZXh0cmEgKiwgUENSRV9TUFRSLAorICAgICAgICAgICAgICAgICAgIGludCwgaW50LCBpbnQsIGludCAqLCBpbnQpOworUENSRV9FWFBfREVDTCB2b2lkIFBDUkVfQ0FMTF9DT05WRU5USU9OIHBjcmVfZnJlZV9zdWJzdHJpbmcoY29uc3QgY2hhciAqKTsKK1BDUkVfRVhQX0RFQ0wgdm9pZCBQQ1JFX0NBTExfQ09OVkVOVElPTiBwY3JlX2ZyZWVfc3Vic3RyaW5nX2xpc3QoY29uc3QgY2hhciAqKik7CitQQ1JFX0VYUF9ERUNMIGludCAgUENSRV9DQUxMX0NPTlZFTlRJT04gcGNyZV9mdWxsaW5mbyhjb25zdCBwY3JlICosIGNvbnN0IHBjcmVfZXh0cmEgKiwgaW50LAorICAgICAgICAgICAgICAgICAgdm9pZCAqKTsKK1BDUkVfRVhQX0RFQ0wgaW50ICBQQ1JFX0NBTExfQ09OVkVOVElPTiBwY3JlX2dldF9uYW1lZF9zdWJzdHJpbmcoY29uc3QgcGNyZSAqLCBjb25zdCBjaGFyICosCisgICAgICAgICAgICAgICAgICBpbnQgKiwgaW50LCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiopOworUENSRV9FWFBfREVDTCBpbnQgIFBDUkVfQ0FMTF9DT05WRU5USU9OIHBjcmVfZ2V0X3N0cmluZ251bWJlcihjb25zdCBwY3JlICosIGNvbnN0IGNoYXIgKik7CitQQ1JFX0VYUF9ERUNMIGludCAgUENSRV9DQUxMX0NPTlZFTlRJT04gcGNyZV9nZXRfc3RyaW5ndGFibGVfZW50cmllcyhjb25zdCBwY3JlICosIGNvbnN0IGNoYXIgKiwKKyAgICAgICAgICAgICAgICAgIGNoYXIgKiosIGNoYXIgKiopOworUENSRV9FWFBfREVDTCBpbnQgIFBDUkVfQ0FMTF9DT05WRU5USU9OIHBjcmVfZ2V0X3N1YnN0cmluZyhjb25zdCBjaGFyICosIGludCAqLCBpbnQsIGludCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiopOworUENSRV9FWFBfREVDTCBpbnQgIFBDUkVfQ0FMTF9DT05WRU5USU9OIHBjcmVfZ2V0X3N1YnN0cmluZ19saXN0KGNvbnN0IGNoYXIgKiwgaW50ICosIGludCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKioqKTsKK1BDUkVfRVhQX0RFQ0wgaW50ICBQQ1JFX0NBTExfQ09OVkVOVElPTiBwY3JlX2luZm8oY29uc3QgcGNyZSAqLCBpbnQgKiwgaW50ICopOworUENSRV9FWFBfREVDTCBjb25zdCB1bnNpZ25lZCBjaGFyKiBQQ1JFX0NBTExfQ09OVkVOVElPTiBwY3JlX21ha2V0YWJsZXModm9pZCk7CitQQ1JFX0VYUF9ERUNMIGludCAgUENSRV9DQUxMX0NPTlZFTlRJT04gcGNyZV9yZWZjb3VudChwY3JlICosIGludCk7CitQQ1JFX0VYUF9ERUNMIHBjcmVfZXh0cmEqIFBDUkVfQ0FMTF9DT05WRU5USU9OIHBjcmVfc3R1ZHkoY29uc3QgcGNyZSAqLCBpbnQsIGNvbnN0IGNoYXIgKiopOworUENSRV9FWFBfREVDTCBjb25zdCBjaGFyKiBQQ1JFX0NBTExfQ09OVkVOVElPTiBwY3JlX3ZlcnNpb24odm9pZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgLyogZXh0ZXJuICJDIiAqLworI2VuZGlmCisKKyNlbmRpZiAvKiBFbmQgb2YgcGNyZS5oICovCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0FEWEwzNDVfSTJDLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvQURYTDM0NV9JMkMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5N2NmNTkKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0FEWEwzNDVfSTJDLmNwcApAQCAtMCwwICsxLDEwMyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiQURYTDM0NV9JMkMuaCIKKyNpbmNsdWRlICJJMkMuaCIKKyNpbmNsdWRlICJIQUwvSEFMLmhwcCIKKworY29uc3QgdWludDhfdCBBRFhMMzQ1X0kyQzo6a0FkZHJlc3M7Citjb25zdCB1aW50OF90IEFEWEwzNDVfSTJDOjprUG93ZXJDdGxSZWdpc3RlcjsKK2NvbnN0IHVpbnQ4X3QgQURYTDM0NV9JMkM6OmtEYXRhRm9ybWF0UmVnaXN0ZXI7Citjb25zdCB1aW50OF90IEFEWEwzNDVfSTJDOjprRGF0YVJlZ2lzdGVyOworY29uc3RleHByIGRvdWJsZSBBRFhMMzQ1X0kyQzo6a0dzUGVyTFNCOworCisvKioKKyAqIENvbnN0cnVjdG9yLgorICoKKyAqIEBwYXJhbSBwb3J0IFRoZSBJMkMgcG9ydCB0aGUgYWNjZWxlcm9tZXRlciBpcyBhdHRhY2hlZCB0bworICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSAoKyBvciAtKSB0aGF0IHRoZSBhY2NlbGVyb21ldGVyIHdpbGwgbWVhc3VyZS4KKyAqLworQURYTDM0NV9JMkM6OkFEWEwzNDVfSTJDKFBvcnQgcG9ydCwgUmFuZ2UgcmFuZ2UpOgorCQlJMkMocG9ydCwga0FkZHJlc3MpCit7CisJCS8vbV9pMmMgPSBuZXcgSTJDKChJMkM6OlBvcnQpcG9ydCwga0FkZHJlc3MpOworCisJCS8vIFR1cm4gb24gdGhlIG1lYXN1cmVtZW50cworCQlXcml0ZShrUG93ZXJDdGxSZWdpc3Rlciwga1Bvd2VyQ3RsX01lYXN1cmUpOworCQkvLyBTcGVjaWZ5IHRoZSBkYXRhIGZvcm1hdCB0byByZWFkCisJCVNldFJhbmdlKHJhbmdlKTsKKworCQlIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfQURYTDM0NSwgSEFMVXNhZ2VSZXBvcnRpbmc6OmtBRFhMMzQ1X0kyQywgMCk7Cit9CisKKy8qKgorICogRGVzdHJ1Y3Rvci4KKyAqLworQURYTDM0NV9JMkM6On5BRFhMMzQ1X0kyQygpCit7CisJLy9kZWxldGUgbV9pMmM7CisJLy9tX2kyYyA9IE5VTEw7Cit9CisKKy8qKiB7QGluaGVyaXRkb2N9ICovCit2b2lkIEFEWEwzNDVfSTJDOjpTZXRSYW5nZShSYW5nZSByYW5nZSkKK3sKKwlXcml0ZShrRGF0YUZvcm1hdFJlZ2lzdGVyLCBrRGF0YUZvcm1hdF9GdWxsUmVzIHwgKHVpbnQ4X3QpcmFuZ2UpOworfQorCisvKioge0Bpbmhlcml0ZG9jfSAqLworZG91YmxlIEFEWEwzNDVfSTJDOjpHZXRYKCkKK3sKKwlyZXR1cm4gR2V0QWNjZWxlcmF0aW9uKGtBeGlzX1gpOworfQorCisvKioge0Bpbmhlcml0ZG9jfSAqLworZG91YmxlIEFEWEwzNDVfSTJDOjpHZXRZKCkKK3sKKwlyZXR1cm4gR2V0QWNjZWxlcmF0aW9uKGtBeGlzX1kpOworfQorCisvKioge0Bpbmhlcml0ZG9jfSAqLworZG91YmxlIEFEWEwzNDVfSTJDOjpHZXRaKCkKK3sKKwlyZXR1cm4gR2V0QWNjZWxlcmF0aW9uKGtBeGlzX1opOworfQorCisvKioKKyAqIEdldCB0aGUgYWNjZWxlcmF0aW9uIG9mIG9uZSBheGlzIGluIEdzLgorICoKKyAqIEBwYXJhbSBheGlzIFRoZSBheGlzIHRvIHJlYWQgZnJvbS4KKyAqIEByZXR1cm4gQWNjZWxlcmF0aW9uIG9mIHRoZSBBRFhMMzQ1IGluIEdzLgorICovCitkb3VibGUgQURYTDM0NV9JMkM6OkdldEFjY2VsZXJhdGlvbihBRFhMMzQ1X0kyQzo6QXhlcyBheGlzKQoreworCWludDE2X3QgcmF3QWNjZWwgPSAwOworCS8vaWYobV9pMmMpCisJLy97CisJCVJlYWQoa0RhdGFSZWdpc3RlciArICh1aW50OF90KWF4aXMsIHNpemVvZihyYXdBY2NlbCksICh1aW50OF90ICopJnJhd0FjY2VsKTsKKwkvL30KKwlyZXR1cm4gcmF3QWNjZWwgKiBrR3NQZXJMU0I7Cit9CisKKy8qKgorICogR2V0IHRoZSBhY2NlbGVyYXRpb24gb2YgYWxsIGF4ZXMgaW4gR3MuCisgKgorICogQHJldHVybiBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgYWNjZWxlcmF0aW9uIG1lYXN1cmVkIG9uIGVhY2ggYXhpcyBvZiB0aGUgQURYTDM0NSBpbiBHcy4KKyAqLworQURYTDM0NV9JMkM6OkFsbEF4ZXMgQURYTDM0NV9JMkM6OkdldEFjY2VsZXJhdGlvbnMoKQoreworCUFsbEF4ZXMgZGF0YSA9IEFsbEF4ZXMoKTsKKwlpbnQxNl90IHJhd0RhdGFbM107CisJLy9pZiAobV9pMmMpCisJLy97CisJCVJlYWQoa0RhdGFSZWdpc3Rlciwgc2l6ZW9mKHJhd0RhdGEpLCAodWludDhfdCopcmF3RGF0YSk7CisKKwkJZGF0YS5YQXhpcyA9IHJhd0RhdGFbMF0gKiBrR3NQZXJMU0I7CisJCWRhdGEuWUF4aXMgPSByYXdEYXRhWzFdICoga0dzUGVyTFNCOworCQlkYXRhLlpBeGlzID0gcmF3RGF0YVsyXSAqIGtHc1BlckxTQjsKKwkvL30KKwlyZXR1cm4gZGF0YTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvQURYTDM0NV9TUEkuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9BRFhMMzQ1X1NQSS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdjNzkzZAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvQURYTDM0NV9TUEkuY3BwCkBAIC0wLDAgKzEsMTQwIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJBRFhMMzQ1X1NQSS5oIgorI2luY2x1ZGUgIkRpZ2l0YWxJbnB1dC5oIgorI2luY2x1ZGUgIkRpZ2l0YWxPdXRwdXQuaCIKKyNpbmNsdWRlICJTUEkuaCIKKworY29uc3QgdWludDhfdCBBRFhMMzQ1X1NQSTo6a1Bvd2VyQ3RsUmVnaXN0ZXI7Citjb25zdCB1aW50OF90IEFEWEwzNDVfU1BJOjprRGF0YUZvcm1hdFJlZ2lzdGVyOworY29uc3QgdWludDhfdCBBRFhMMzQ1X1NQSTo6a0RhdGFSZWdpc3RlcjsKK2NvbnN0ZXhwciBkb3VibGUgQURYTDM0NV9TUEk6OmtHc1BlckxTQjsKKworCisvKioKKyAqIENvbnN0cnVjdG9yLgorICoKKyAqIEBwYXJhbSBwb3J0IFRoZSBTUEkgcG9ydCB0aGUgYWNjZWxlcm9tZXRlciBpcyBhdHRhY2hlZCB0bworICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSAoKyBvciAtKSB0aGF0IHRoZSBhY2NlbGVyb21ldGVyIHdpbGwgbWVhc3VyZS4KKyAqLworQURYTDM0NV9TUEk6OkFEWEwzNDVfU1BJKFNQSTo6UG9ydCBwb3J0LCBBRFhMMzQ1X1NQSTo6UmFuZ2UgcmFuZ2UpCit7CisJbV9wb3J0ID0gcG9ydDsKKwlJbml0KHJhbmdlKTsKK30KKworLyoqCisgKiBJbnRlcm5hbCBjb21tb24gaW5pdCBmdW5jdGlvbi4KKyAqLwordm9pZCBBRFhMMzQ1X1NQSTo6SW5pdChSYW5nZSByYW5nZSkKK3sKKwkJbV9zcGkgPSBuZXcgU1BJKG1fcG9ydCk7CisJCW1fc3BpLT5TZXRDbG9ja1JhdGUoNTAwMDAwKTsKKwkJbV9zcGktPlNldE1TQkZpcnN0KCk7CisJCW1fc3BpLT5TZXRTYW1wbGVEYXRhT25GYWxsaW5nKCk7CisJCW1fc3BpLT5TZXRDbG9ja0FjdGl2ZUxvdygpOworCQltX3NwaS0+U2V0Q2hpcFNlbGVjdEFjdGl2ZUhpZ2goKTsKKworCQl1aW50OF90IGNvbW1hbmRzWzJdOworCQkvLyBUdXJuIG9uIHRoZSBtZWFzdXJlbWVudHMKKwkJY29tbWFuZHNbMF0gPSBrUG93ZXJDdGxSZWdpc3RlcjsKKwkJY29tbWFuZHNbMV0gPSBrUG93ZXJDdGxfTWVhc3VyZTsKKwkJbV9zcGktPlRyYW5zYWN0aW9uKGNvbW1hbmRzLCBjb21tYW5kcywgMik7CisKKwkJU2V0UmFuZ2UocmFuZ2UpOworCisJCUhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9BRFhMMzQ1LCBIQUxVc2FnZVJlcG9ydGluZzo6a0FEWEwzNDVfU1BJKTsKK30KKworLyoqCisgKiBEZXN0cnVjdG9yLgorICovCitBRFhMMzQ1X1NQSTo6fkFEWEwzNDVfU1BJKCkKK3sKKwlkZWxldGUgbV9zcGk7CisJbV9zcGkgPSBOVUxMOworfQorCisvKioge0Bpbmhlcml0ZG9jfSAqLwordm9pZCBBRFhMMzQ1X1NQSTo6U2V0UmFuZ2UoUmFuZ2UgcmFuZ2UpCit7CisJdWludDhfdCBjb21tYW5kc1syXTsKKwkKKwkvLyBTcGVjaWZ5IHRoZSBkYXRhIGZvcm1hdCB0byByZWFkCisJY29tbWFuZHNbMF0gPSBrRGF0YUZvcm1hdFJlZ2lzdGVyOworCWNvbW1hbmRzWzFdID0ga0RhdGFGb3JtYXRfRnVsbFJlc3wgKHVpbnQ4X3QpKHJhbmdlICYgMHgwMyk7CisJbV9zcGktPlRyYW5zYWN0aW9uKGNvbW1hbmRzLCBjb21tYW5kcywgMik7Cit9CisKKy8qKiB7QGluaGVyaXRkb2N9ICovCitkb3VibGUgQURYTDM0NV9TUEk6OkdldFgoKQoreworCXJldHVybiBHZXRBY2NlbGVyYXRpb24oa0F4aXNfWCk7Cit9CisKKy8qKiB7QGluaGVyaXRkb2N9ICovCitkb3VibGUgQURYTDM0NV9TUEk6OkdldFkoKQoreworCXJldHVybiBHZXRBY2NlbGVyYXRpb24oa0F4aXNfWSk7Cit9CisKKy8qKiB7QGluaGVyaXRkb2N9ICovCitkb3VibGUgQURYTDM0NV9TUEk6OkdldFooKQoreworCXJldHVybiBHZXRBY2NlbGVyYXRpb24oa0F4aXNfWik7Cit9CisKKy8qKgorICogR2V0IHRoZSBhY2NlbGVyYXRpb24gb2Ygb25lIGF4aXMgaW4gR3MuCisgKgorICogQHBhcmFtIGF4aXMgVGhlIGF4aXMgdG8gcmVhZCBmcm9tLgorICogQHJldHVybiBBY2NlbGVyYXRpb24gb2YgdGhlIEFEWEwzNDUgaW4gR3MuCisgKi8KK2RvdWJsZSBBRFhMMzQ1X1NQSTo6R2V0QWNjZWxlcmF0aW9uKEFEWEwzNDVfU1BJOjpBeGVzIGF4aXMpCit7CisJaW50MTZfdCByYXdBY2NlbCA9IDA7CisJaWYobV9zcGkpCisJeworCQl1aW50OF90IGJ1ZmZlclszXTsKKwkJdWludDhfdCBjb21tYW5kWzNdID0gezAsMCwwfTsKKwkJY29tbWFuZFswXSA9IChrQWRkcmVzc19SZWFkIHwga0FkZHJlc3NfTXVsdGlCeXRlIHwga0RhdGFSZWdpc3RlcikgKyAodWludDhfdClheGlzOworCQltX3NwaS0+VHJhbnNhY3Rpb24oY29tbWFuZCwgYnVmZmVyLCAzKTsKKworCQkvLyBTZW5zb3IgaXMgbGl0dGxlIGVuZGlhbi4uLiBzd2FwIGJ5dGVzCisJCXJhd0FjY2VsID0gYnVmZmVyWzJdPDw4IHwgYnVmZmVyWzFdOworCX0KKwlyZXR1cm4gcmF3QWNjZWwgKiBrR3NQZXJMU0I7Cit9CisKKy8qKgorICogR2V0IHRoZSBhY2NlbGVyYXRpb24gb2YgYWxsIGF4ZXMgaW4gR3MuCisgKgorICogQHJldHVybiBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgYWNjZWxlcmF0aW9uIG1lYXN1cmVkIG9uIGVhY2ggYXhpcyBvZiB0aGUgQURYTDM0NSBpbiBHcy4KKyAqLworQURYTDM0NV9TUEk6OkFsbEF4ZXMgQURYTDM0NV9TUEk6OkdldEFjY2VsZXJhdGlvbnMoKQoreworCUFsbEF4ZXMgZGF0YSA9IEFsbEF4ZXMoKTsKKwl1aW50OF90IGRhdGFCdWZmZXJbN10gPSB7MCwwLDAsMCwwLDAsMH07CisJaW50MTZfdCByYXdEYXRhWzNdOworCWlmIChtX3NwaSkKKwl7CisJCS8vIFNlbGVjdCB0aGUgZGF0YSBhZGRyZXNzLgorCQlkYXRhQnVmZmVyWzBdID0gKGtBZGRyZXNzX1JlYWQgfCBrQWRkcmVzc19NdWx0aUJ5dGUgfCBrRGF0YVJlZ2lzdGVyKTsKKwkJbV9zcGktPlRyYW5zYWN0aW9uKGRhdGFCdWZmZXIsIGRhdGFCdWZmZXIsIDcpOworCisJCWZvciAoaW50MzJfdCBpPTA7IGk8MzsgaSsrKQorCQl7CisJCQkvLyBTZW5zb3IgaXMgbGl0dGxlIGVuZGlhbi4uLiBzd2FwIGJ5dGVzCisJCQlyYXdEYXRhW2ldID0gZGF0YUJ1ZmZlcltpKjIrMl0gPDwgOCB8IGRhdGFCdWZmZXJbaSoyKzFdOworCQl9CisKKwkJZGF0YS5YQXhpcyA9IHJhd0RhdGFbMF0gKiBrR3NQZXJMU0I7CisJCWRhdGEuWUF4aXMgPSByYXdEYXRhWzFdICoga0dzUGVyTFNCOworCQlkYXRhLlpBeGlzID0gcmF3RGF0YVsyXSAqIGtHc1BlckxTQjsKKwl9CisJcmV0dXJuIGRhdGE7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0FuYWxvZ0FjY2VsZXJvbWV0ZXIuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9BbmFsb2dBY2NlbGVyb21ldGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWVkZjRiCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9BbmFsb2dBY2NlbGVyb21ldGVyLmNwcApAQCAtMCwwICsxLDExMCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiQW5hbG9nQWNjZWxlcm9tZXRlci5oIgorLy8jaW5jbHVkZSAiTmV0d29ya0NvbW11bmljYXRpb24vVXNhZ2VSZXBvcnRpbmcuaCIKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKworLyoqCisgKiBDb21tb24gZnVuY3Rpb24gZm9yIGluaXRpYWxpemluZyB0aGUgYWNjZWxlcm9tZXRlci4KKyAqLwordm9pZCBBbmFsb2dBY2NlbGVyb21ldGVyOjpJbml0QWNjZWxlcm9tZXRlcigpCit7CisJbV92b2x0c1BlckcgPSAxLjA7CisJbV96ZXJvR1ZvbHRhZ2UgPSAyLjU7CisJSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0FjY2VsZXJvbWV0ZXIsIG1fQW5hbG9nSW5wdXQtPkdldENoYW5uZWwoKSk7Cit9CisKKy8qKgorICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGFuIGFjY2VsZXJvbWV0ZXIuCisgKiBUaGUgY29uc3RydWN0b3IgYWxsb2NhdGVzIGRlc2lyZWQgYW5hbG9nIGlucHV0LgorICogQHBhcmFtIGNoYW5uZWwgVGhlIGNoYW5uZWwgbnVtYmVyIGZvciB0aGUgYW5hbG9nIGlucHV0IHRoZSBhY2NlbGVyb21ldGVyIGlzIGNvbm5lY3RlZCB0bworICovCitBbmFsb2dBY2NlbGVyb21ldGVyOjpBbmFsb2dBY2NlbGVyb21ldGVyKGludDMyX3QgY2hhbm5lbCkKK3sKKwltX0FuYWxvZ0lucHV0ID0gbmV3IEFuYWxvZ0lucHV0KGNoYW5uZWwpOworCW1fYWxsb2NhdGVkQ2hhbm5lbCA9IHRydWU7CisJSW5pdEFjY2VsZXJvbWV0ZXIoKTsKK30KKworLyoqCisgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgQWNjZWxlcm9tZXRlciBmcm9tIGFuIGV4aXN0aW5nIEFuYWxvZ0lucHV0LgorICogTWFrZSBhIG5ldyBpbnN0YW5jZSBvZiBhY2NlbGVyb21ldGVyIGdpdmVuIGFuIEFuYWxvZ0lucHV0LiBUaGlzIGlzIHBhcnRpY3VsYXJseQorICogdXNlZnVsIGlmIHRoZSBwb3J0IGlzIGdvaW5nIHRvIGJlIHJlYWQgYXMgYW4gYW5hbG9nIGNoYW5uZWwgYXMgd2VsbCBhcyB0aHJvdWdoCisgKiB0aGUgQWNjZWxlcm9tZXRlciBjbGFzcy4KKyAqIEBwYXJhbSBjaGFubmVsIFRoZSBleGlzdGluZyBBbmFsb2dJbnB1dCBvYmplY3QgZm9yIHRoZSBhbmFsb2cgaW5wdXQgdGhlIGFjY2VsZXJvbWV0ZXIgaXMgY29ubmVjdGVkIHRvCisgKi8KK0FuYWxvZ0FjY2VsZXJvbWV0ZXI6OkFuYWxvZ0FjY2VsZXJvbWV0ZXIoQW5hbG9nSW5wdXQgKmNoYW5uZWwpCit7CisJaWYgKGNoYW5uZWwgPT0gTlVMTCkKKwl7CisJCXdwaV9zZXRXUElFcnJvcihOdWxsUGFyYW1ldGVyKTsKKwl9CisJZWxzZQorCXsKKwkJbV9BbmFsb2dJbnB1dCA9IGNoYW5uZWw7CisJCUluaXRBY2NlbGVyb21ldGVyKCk7CisJfQorCW1fYWxsb2NhdGVkQ2hhbm5lbCA9IGZhbHNlOworfQorCisvKioKKyAqIERlbGV0ZSB0aGUgYW5hbG9nIGNvbXBvbmVudHMgdXNlZCBmb3IgdGhlIGFjY2VsZXJvbWV0ZXIuCisgKi8KK0FuYWxvZ0FjY2VsZXJvbWV0ZXI6On5BbmFsb2dBY2NlbGVyb21ldGVyKCkKK3sKKwlpZiAobV9hbGxvY2F0ZWRDaGFubmVsKQorCXsKKwkJZGVsZXRlIG1fQW5hbG9nSW5wdXQ7CisJfQorfQorCisvKioKKyAqIFJldHVybiB0aGUgYWNjZWxlcmF0aW9uIGluIEdzLgorICoKKyAqIFRoZSBhY2NlbGVyYXRpb24gaXMgcmV0dXJuZWQgdW5pdHMgb2YgR3MuCisgKgorICogQHJldHVybiBUaGUgY3VycmVudCBhY2NlbGVyYXRpb24gb2YgdGhlIHNlbnNvciBpbiBHcy4KKyAqLworZmxvYXQgQW5hbG9nQWNjZWxlcm9tZXRlcjo6R2V0QWNjZWxlcmF0aW9uKCkKK3sKKwlyZXR1cm4gKG1fQW5hbG9nSW5wdXQtPkdldEF2ZXJhZ2VWb2x0YWdlKCkgLSBtX3plcm9HVm9sdGFnZSkgLyBtX3ZvbHRzUGVyRzsKK30KKworLyoqCisgKiBTZXQgdGhlIGFjY2VsZXJvbWV0ZXIgc2Vuc2l0aXZpdHkuCisgKgorICogVGhpcyBzZXRzIHRoZSBzZW5zaXRpdml0eSBvZiB0aGUgYWNjZWxlcm9tZXRlciB1c2VkIGZvciBjYWxjdWxhdGluZyB0aGUgYWNjZWxlcmF0aW9uLgorICogVGhlIHNlbnNpdGl2aXR5IHZhcmllcyBieSBhY2NlbGVyb21ldGVyIG1vZGVsLiBUaGVyZSBhcmUgY29uc3RhbnRzIGRlZmluZWQgZm9yIHZhcmlvdXMgbW9kZWxzLgorICoKKyAqIEBwYXJhbSBzZW5zaXRpdml0eSBUaGUgc2Vuc2l0aXZpdHkgb2YgYWNjZWxlcm9tZXRlciBpbiBWb2x0cyBwZXIgRy4KKyAqLwordm9pZCBBbmFsb2dBY2NlbGVyb21ldGVyOjpTZXRTZW5zaXRpdml0eShmbG9hdCBzZW5zaXRpdml0eSkKK3sKKwltX3ZvbHRzUGVyRyA9IHNlbnNpdGl2aXR5OworfQorCisvKioKKyAqIFNldCB0aGUgdm9sdGFnZSB0aGF0IGNvcnJlc3BvbmRzIHRvIDAgRy4KKyAqCisgKiBUaGUgemVybyBHIHZvbHRhZ2UgdmFyaWVzIGJ5IGFjY2VsZXJvbWV0ZXIgbW9kZWwuIFRoZXJlIGFyZSBjb25zdGFudHMgZGVmaW5lZCBmb3IgdmFyaW91cyBtb2RlbHMuCisgKgorICogQHBhcmFtIHplcm8gVGhlIHplcm8gRyB2b2x0YWdlLgorICovCit2b2lkIEFuYWxvZ0FjY2VsZXJvbWV0ZXI6OlNldFplcm8oZmxvYXQgemVybykKK3sKKwltX3plcm9HVm9sdGFnZSA9IHplcm87Cit9CisKKy8qKgorICogR2V0IHRoZSBBY2NlbGVyYXRpb24gZm9yIHRoZSBQSUQgU291cmNlIHBhcmVudC4KKyAqCisgKiBAcmV0dXJuIFRoZSBjdXJyZW50IGFjY2VsZXJhdGlvbiBpbiBHcy4KKyAqLworZG91YmxlIEFuYWxvZ0FjY2VsZXJvbWV0ZXI6OlBJREdldCgpCit7CisJcmV0dXJuIEdldEFjY2VsZXJhdGlvbigpOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9BbmFsb2dJbnB1dC5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0FuYWxvZ0lucHV0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjE5YTljCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9BbmFsb2dJbnB1dC5jcHAKQEAgLTAsMCArMSw0MTQgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiQW5hbG9nSW5wdXQuaCIKKy8vI2luY2x1ZGUgIk5ldHdvcmtDb21tdW5pY2F0aW9uL1VzYWdlUmVwb3J0aW5nLmgiCisjaW5jbHVkZSAiUmVzb3VyY2UuaCIKKyNpbmNsdWRlICJUaW1lci5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorCitzdGF0aWMgUmVzb3VyY2UgKmlucHV0cyA9IE5VTEw7CisKK2NvbnN0IHVpbnQ4X3QgQW5hbG9nSW5wdXQ6OmtBY2N1bXVsYXRvck1vZHVsZU51bWJlcjsKK2NvbnN0IHVpbnQzMl90IEFuYWxvZ0lucHV0OjprQWNjdW11bGF0b3JOdW1DaGFubmVsczsKK2NvbnN0IHVpbnQzMl90IEFuYWxvZ0lucHV0OjprQWNjdW11bGF0b3JDaGFubmVsc1tdID0gezAsIDF9OworCisvKioKKyAqIENvbW1vbiBpbml0aWFsaXphdGlvbi4KKyAqLwordm9pZCBBbmFsb2dJbnB1dDo6SW5pdEFuYWxvZ0lucHV0KHVpbnQzMl90IGNoYW5uZWwpCit7CisJY2hhciBidWZbNjRdOworCVJlc291cmNlOjpDcmVhdGVSZXNvdXJjZU9iamVjdCgmaW5wdXRzLCBrQW5hbG9nSW5wdXRzKTsKKworCWlmICghY2hlY2tBbmFsb2dJbnB1dENoYW5uZWwoY2hhbm5lbCkpCisJeworCQlzbnByaW50ZihidWYsIDY0LCAiYW5hbG9nIGlucHV0ICVkIiwgY2hhbm5lbCk7CisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KENoYW5uZWxJbmRleE91dE9mUmFuZ2UsIGJ1Zik7CisJCXJldHVybjsKKwl9CisKKwlzbnByaW50ZihidWYsIDY0LCAiQW5hbG9nIElucHV0ICVkIiwgY2hhbm5lbCk7CisJaWYgKGlucHV0cy0+QWxsb2NhdGUoY2hhbm5lbCwgYnVmKSA9PSB+MHVsKQorCXsKKwkJQ2xvbmVFcnJvcihpbnB1dHMpOworCQlyZXR1cm47CisJfQorCisJbV9jaGFubmVsID0gY2hhbm5lbDsKKworCXZvaWQqIHBvcnQgPSBnZXRQb3J0KGNoYW5uZWwpOworCWludDMyX3Qgc3RhdHVzID0gMDsKKwltX3BvcnQgPSBpbml0aWFsaXplQW5hbG9nSW5wdXRQb3J0KHBvcnQsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCisJSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0FuYWxvZ0NoYW5uZWwsIGNoYW5uZWwpOworfQorCisvKioKKyAqIENvbnN0cnVjdCBhbiBhbmFsb2cgaW5wdXQuCisgKgorICogQHBhcmFtIGNoYW5uZWwgVGhlIGNoYW5uZWwgbnVtYmVyIG9uIHRoZSByb2JvUklPIHRvIHJlcHJlc2VudC4gMC0zIGFyZSBvbi1ib2FyZCA0LTcgYXJlIG9uIHRoZSBNWFAgcG9ydC4KKyAqLworQW5hbG9nSW5wdXQ6OkFuYWxvZ0lucHV0KHVpbnQzMl90IGNoYW5uZWwpCit7CisJSW5pdEFuYWxvZ0lucHV0KGNoYW5uZWwpOworfQorCisvKioKKyAqIENoYW5uZWwgZGVzdHJ1Y3Rvci4KKyAqLworQW5hbG9nSW5wdXQ6On5BbmFsb2dJbnB1dCgpCit7CisJaW5wdXRzLT5GcmVlKG1fY2hhbm5lbCk7Cit9CisKKy8qKgorICogR2V0IGEgc2FtcGxlIHN0cmFpZ2h0IGZyb20gdGhpcyBjaGFubmVsLgorICogVGhlIHNhbXBsZSBpcyBhIDEyLWJpdCB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIDBWIHRvIDVWIHJhbmdlIG9mIHRoZSBBL0QgY29udmVydGVyIGluIHRoZSBtb2R1bGUuCisgKiBUaGUgdW5pdHMgYXJlIGluIEEvRCBjb252ZXJ0ZXIgY29kZXMuICBVc2UgR2V0Vm9sdGFnZSgpIHRvIGdldCB0aGUgYW5hbG9nIHZhbHVlIGluIGNhbGlicmF0ZWQgdW5pdHMuCisgKiBAcmV0dXJuIEEgc2FtcGxlIHN0cmFpZ2h0IGZyb20gdGhpcyBjaGFubmVsLgorICovCitpbnQxNl90IEFuYWxvZ0lucHV0OjpHZXRWYWx1ZSgpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIDA7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCWludDE2X3QgdmFsdWUgPSBnZXRBbmFsb2dWYWx1ZShtX3BvcnQsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCXJldHVybiB2YWx1ZTsKK30KKworLyoqCisgKiBHZXQgYSBzYW1wbGUgZnJvbSB0aGUgb3V0cHV0IG9mIHRoZSBvdmVyc2FtcGxlIGFuZCBhdmVyYWdlIGVuZ2luZSBmb3IgdGhpcyBjaGFubmVsLgorICogVGhlIHNhbXBsZSBpcyAxMi1iaXQgKyB0aGUgYml0cyBjb25maWd1cmVkIGluIFNldE92ZXJzYW1wbGVCaXRzKCkuCisgKiBUaGUgdmFsdWUgY29uZmlndXJlZCBpbiBTZXRBdmVyYWdlQml0cygpIHdpbGwgY2F1c2UgdGhpcyB2YWx1ZSB0byBiZSBhdmVyYWdlZCAyKipiaXRzIG51bWJlciBvZiBzYW1wbGVzLgorICogVGhpcyBpcyBub3QgYSBzbGlkaW5nIHdpbmRvdy4gIFRoZSBzYW1wbGUgd2lsbCBub3QgY2hhbmdlIHVudGlsIDIqKihPdmVyc2FtcGxlQml0cyArIEF2ZXJhZ2VCaXRzKSBzYW1wbGVzCisgKiBoYXZlIGJlZW4gYWNxdWlyZWQgZnJvbSB0aGUgbW9kdWxlIG9uIHRoaXMgY2hhbm5lbC4KKyAqIFVzZSBHZXRBdmVyYWdlVm9sdGFnZSgpIHRvIGdldCB0aGUgYW5hbG9nIHZhbHVlIGluIGNhbGlicmF0ZWQgdW5pdHMuCisgKiBAcmV0dXJuIEEgc2FtcGxlIGZyb20gdGhlIG92ZXJzYW1wbGUgYW5kIGF2ZXJhZ2UgZW5naW5lIGZvciB0aGlzIGNoYW5uZWwuCisgKi8KK2ludDMyX3QgQW5hbG9nSW5wdXQ6OkdldEF2ZXJhZ2VWYWx1ZSgpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIDA7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCWludDMyX3QgdmFsdWUgPSBnZXRBbmFsb2dBdmVyYWdlVmFsdWUobV9wb3J0LCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwlyZXR1cm4gdmFsdWU7Cit9CisKKy8qKgorICogR2V0IGEgc2NhbGVkIHNhbXBsZSBzdHJhaWdodCBmcm9tIHRoaXMgY2hhbm5lbC4KKyAqIFRoZSB2YWx1ZSBpcyBzY2FsZWQgdG8gdW5pdHMgb2YgVm9sdHMgdXNpbmcgdGhlIGNhbGlicmF0ZWQgc2NhbGluZyBkYXRhIGZyb20gR2V0TFNCV2VpZ2h0KCkgYW5kIEdldE9mZnNldCgpLgorICogQHJldHVybiBBIHNjYWxlZCBzYW1wbGUgc3RyYWlnaHQgZnJvbSB0aGlzIGNoYW5uZWwuCisgKi8KK2Zsb2F0IEFuYWxvZ0lucHV0OjpHZXRWb2x0YWdlKCkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gMC4wZjsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJZmxvYXQgdm9sdGFnZSA9IGdldEFuYWxvZ1ZvbHRhZ2UobV9wb3J0LCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwlyZXR1cm4gdm9sdGFnZTsKK30KKworLyoqCisgKiBHZXQgYSBzY2FsZWQgc2FtcGxlIGZyb20gdGhlIG91dHB1dCBvZiB0aGUgb3ZlcnNhbXBsZSBhbmQgYXZlcmFnZSBlbmdpbmUgZm9yIHRoaXMgY2hhbm5lbC4KKyAqIFRoZSB2YWx1ZSBpcyBzY2FsZWQgdG8gdW5pdHMgb2YgVm9sdHMgdXNpbmcgdGhlIGNhbGlicmF0ZWQgc2NhbGluZyBkYXRhIGZyb20gR2V0TFNCV2VpZ2h0KCkgYW5kIEdldE9mZnNldCgpLgorICogVXNpbmcgb3ZlcnNhbXBsaW5nIHdpbGwgY2F1c2UgdGhpcyB2YWx1ZSB0byBiZSBoaWdoZXIgcmVzb2x1dGlvbiwgYnV0IGl0IHdpbGwgdXBkYXRlIG1vcmUgc2xvd2x5LgorICogVXNpbmcgYXZlcmFnaW5nIHdpbGwgY2F1c2UgdGhpcyB2YWx1ZSB0byBiZSBtb3JlIHN0YWJsZSwgYnV0IGl0IHdpbGwgdXBkYXRlIG1vcmUgc2xvd2x5LgorICogQHJldHVybiBBIHNjYWxlZCBzYW1wbGUgZnJvbSB0aGUgb3V0cHV0IG9mIHRoZSBvdmVyc2FtcGxlIGFuZCBhdmVyYWdlIGVuZ2luZSBmb3IgdGhpcyBjaGFubmVsLgorICovCitmbG9hdCBBbmFsb2dJbnB1dDo6R2V0QXZlcmFnZVZvbHRhZ2UoKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiAwLjBmOworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlmbG9hdCB2b2x0YWdlID0gZ2V0QW5hbG9nQXZlcmFnZVZvbHRhZ2UobV9wb3J0LCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwlyZXR1cm4gdm9sdGFnZTsKK30KKworLyoqCisgKiBHZXQgdGhlIGZhY3Rvcnkgc2NhbGluZyBsZWFzdCBzaWduaWZpY2FudCBiaXQgd2VpZ2h0IGNvbnN0YW50LgorICoKKyAqIFZvbHRzID0gKChMU0JfV2VpZ2h0ICogMWUtOSkgKiByYXcpIC0gKE9mZnNldCAqIDFlLTkpCisgKgorICogQHJldHVybiBMZWFzdCBzaWduaWZpY2FudCBiaXQgd2VpZ2h0LgorICovCit1aW50MzJfdCBBbmFsb2dJbnB1dDo6R2V0TFNCV2VpZ2h0KCkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gMDsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJaW50MzJfdCBsc2JXZWlnaHQgPSBnZXRBbmFsb2dMU0JXZWlnaHQobV9wb3J0LCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwlyZXR1cm4gbHNiV2VpZ2h0OworfQorCisvKioKKyAqIEdldCB0aGUgZmFjdG9yeSBzY2FsaW5nIG9mZnNldCBjb25zdGFudC4KKyAqCisgKiBWb2x0cyA9ICgoTFNCX1dlaWdodCAqIDFlLTkpICogcmF3KSAtIChPZmZzZXQgKiAxZS05KQorICoKKyAqIEByZXR1cm4gT2Zmc2V0IGNvbnN0YW50LgorICovCitpbnQzMl90IEFuYWxvZ0lucHV0OjpHZXRPZmZzZXQoKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiAwOworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlpbnQzMl90IG9mZnNldCA9IGdldEFuYWxvZ09mZnNldChtX3BvcnQsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCXJldHVybiBvZmZzZXQ7Cit9CisKKy8qKgorICogR2V0IHRoZSBjaGFubmVsIG51bWJlci4KKyAqIEByZXR1cm4gVGhlIGNoYW5uZWwgbnVtYmVyLgorICovCit1aW50MzJfdCBBbmFsb2dJbnB1dDo6R2V0Q2hhbm5lbCgpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIDA7CisJcmV0dXJuIG1fY2hhbm5lbDsKK30KKworLyoqCisgKiBTZXQgdGhlIG51bWJlciBvZiBhdmVyYWdpbmcgYml0cy4KKyAqIFRoaXMgc2V0cyB0aGUgbnVtYmVyIG9mIGF2ZXJhZ2luZyBiaXRzLiBUaGUgYWN0dWFsIG51bWJlciBvZiBhdmVyYWdlZCBzYW1wbGVzIGlzIDJeYml0cy4KKyAqIFVzZSBhdmVyYWdpbmcgdG8gaW1wcm92ZSB0aGUgc3RhYmlsaXR5IG9mIHlvdXIgbWVhc3VyZW1lbnQgYXQgdGhlIGV4cGVuc2Ugb2Ygc2FtcGxpbmcgcmF0ZS4KKyAqIFRoZSBhdmVyYWdpbmcgaXMgZG9uZSBhdXRvbWF0aWNhbGx5IGluIHRoZSBGUEdBLgorICoKKyAqIEBwYXJhbSBiaXRzIE51bWJlciBvZiBiaXRzIG9mIGF2ZXJhZ2luZy4KKyAqLwordm9pZCBBbmFsb2dJbnB1dDo6U2V0QXZlcmFnZUJpdHModWludDMyX3QgYml0cykKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisJaW50MzJfdCBzdGF0dXMgPSAwOworCXNldEFuYWxvZ0F2ZXJhZ2VCaXRzKG1fcG9ydCwgYml0cywgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogR2V0IHRoZSBudW1iZXIgb2YgYXZlcmFnaW5nIGJpdHMgcHJldmlvdXNseSBjb25maWd1cmVkLgorICogVGhpcyBnZXRzIHRoZSBudW1iZXIgb2YgYXZlcmFnaW5nIGJpdHMgZnJvbSB0aGUgRlBHQS4gVGhlIGFjdHVhbCBudW1iZXIgb2YgYXZlcmFnZWQgc2FtcGxlcyBpcyAyXmJpdHMuCisgKiBUaGUgYXZlcmFnaW5nIGlzIGRvbmUgYXV0b21hdGljYWxseSBpbiB0aGUgRlBHQS4KKyAqCisgKiBAcmV0dXJuIE51bWJlciBvZiBiaXRzIG9mIGF2ZXJhZ2luZyBwcmV2aW91c2x5IGNvbmZpZ3VyZWQuCisgKi8KK3VpbnQzMl90IEFuYWxvZ0lucHV0OjpHZXRBdmVyYWdlQml0cygpCit7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCWludDMyX3QgYXZlcmFnZUJpdHMgPSBnZXRBbmFsb2dBdmVyYWdlQml0cyhtX3BvcnQsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCXJldHVybiBhdmVyYWdlQml0czsKK30KKworLyoqCisgKiBTZXQgdGhlIG51bWJlciBvZiBvdmVyc2FtcGxlIGJpdHMuCisgKiBUaGlzIHNldHMgdGhlIG51bWJlciBvZiBvdmVyc2FtcGxlIGJpdHMuIFRoZSBhY3R1YWwgbnVtYmVyIG9mIG92ZXJzYW1wbGVkIHZhbHVlcyBpcyAyXmJpdHMuCisgKiBVc2Ugb3ZlcnNhbXBsaW5nIHRvIGltcHJvdmUgdGhlIHJlc29sdXRpb24gb2YgeW91ciBtZWFzdXJlbWVudHMgYXQgdGhlIGV4cGVuc2Ugb2Ygc2FtcGxpbmcgcmF0ZS4KKyAqIFRoZSBvdmVyc2FtcGxpbmcgaXMgZG9uZSBhdXRvbWF0aWNhbGx5IGluIHRoZSBGUEdBLgorICoKKyAqIEBwYXJhbSBiaXRzIE51bWJlciBvZiBiaXRzIG9mIG92ZXJzYW1wbGluZy4KKyAqLwordm9pZCBBbmFsb2dJbnB1dDo6U2V0T3ZlcnNhbXBsZUJpdHModWludDMyX3QgYml0cykKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisJaW50MzJfdCBzdGF0dXMgPSAwOworCXNldEFuYWxvZ092ZXJzYW1wbGVCaXRzKG1fcG9ydCwgYml0cywgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogR2V0IHRoZSBudW1iZXIgb2Ygb3ZlcnNhbXBsZSBiaXRzIHByZXZpb3VzbHkgY29uZmlndXJlZC4KKyAqIFRoaXMgZ2V0cyB0aGUgbnVtYmVyIG9mIG92ZXJzYW1wbGUgYml0cyBmcm9tIHRoZSBGUEdBLiBUaGUgYWN0dWFsIG51bWJlciBvZiBvdmVyc2FtcGxlZCB2YWx1ZXMgaXMKKyAqIDJeYml0cy4gVGhlIG92ZXJzYW1wbGluZyBpcyBkb25lIGF1dG9tYXRpY2FsbHkgaW4gdGhlIEZQR0EuCisgKgorICogQHJldHVybiBOdW1iZXIgb2YgYml0cyBvZiBvdmVyc2FtcGxpbmcgcHJldmlvdXNseSBjb25maWd1cmVkLgorICovCit1aW50MzJfdCBBbmFsb2dJbnB1dDo6R2V0T3ZlcnNhbXBsZUJpdHMoKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiAwOworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlpbnQzMl90IG92ZXJzYW1wbGVCaXRzID0gZ2V0QW5hbG9nT3ZlcnNhbXBsZUJpdHMobV9wb3J0LCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwlyZXR1cm4gb3ZlcnNhbXBsZUJpdHM7Cit9CisKKy8qKgorICogSXMgdGhlIGNoYW5uZWwgYXR0YWNoZWQgdG8gYW4gYWNjdW11bGF0b3IuCisgKgorICogQHJldHVybiBUaGUgYW5hbG9nIGlucHV0IGlzIGF0dGFjaGVkIHRvIGFuIGFjY3VtdWxhdG9yLgorICovCitib29sIEFuYWxvZ0lucHV0OjpJc0FjY3VtdWxhdG9yQ2hhbm5lbCgpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIGZhbHNlOworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlib29sIGlzQWNjdW0gPSBpc0FjY3VtdWxhdG9yQ2hhbm5lbChtX3BvcnQsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCXJldHVybiBpc0FjY3VtOworfQorCisvKioKKyAqIEluaXRpYWxpemUgdGhlIGFjY3VtdWxhdG9yLgorICovCit2b2lkIEFuYWxvZ0lucHV0OjpJbml0QWNjdW11bGF0b3IoKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKwltX2FjY3VtdWxhdG9yT2Zmc2V0ID0gMDsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJaW5pdEFjY3VtdWxhdG9yKG1fcG9ydCwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKworLyoqCisgKiBTZXQgYW4gaW5pdGlhbCB2YWx1ZSBmb3IgdGhlIGFjY3VtdWxhdG9yLgorICoKKyAqIFRoaXMgd2lsbCBiZSBhZGRlZCB0byBhbGwgdmFsdWVzIHJldHVybmVkIHRvIHRoZSB1c2VyLgorICogQHBhcmFtIGluaXRpYWxWYWx1ZSBUaGUgdmFsdWUgdGhhdCB0aGUgYWNjdW11bGF0b3Igc2hvdWxkIHN0YXJ0IGZyb20gd2hlbiByZXNldC4KKyAqLwordm9pZCBBbmFsb2dJbnB1dDo6U2V0QWNjdW11bGF0b3JJbml0aWFsVmFsdWUoaW50NjRfdCBpbml0aWFsVmFsdWUpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCW1fYWNjdW11bGF0b3JPZmZzZXQgPSBpbml0aWFsVmFsdWU7Cit9CisKKy8qKgorICogUmVzZXRzIHRoZSBhY2N1bXVsYXRvciB0byB0aGUgaW5pdGlhbCB2YWx1ZS4KKyAqLwordm9pZCBBbmFsb2dJbnB1dDo6UmVzZXRBY2N1bXVsYXRvcigpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlyZXNldEFjY3VtdWxhdG9yKG1fcG9ydCwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisKKwlpZighU3RhdHVzSXNGYXRhbCgpKQorCXsKKwkJLy8gV2FpdCB1bnRpbCB0aGUgbmV4dCBzYW1wbGUsIHNvIHRoZSBuZXh0IGNhbGwgdG8gR2V0QWNjdW11bGF0b3IqKCkKKwkJLy8gd29uJ3QgaGF2ZSBvbGQgdmFsdWVzLgorCQljb25zdCBmbG9hdCBzYW1wbGVUaW1lID0gMS4wZiAvIEdldFNhbXBsZVJhdGUoKTsKKwkJY29uc3QgZmxvYXQgb3ZlclNhbXBsZXMgPSAxIDw8IEdldE92ZXJzYW1wbGVCaXRzKCk7CisJCWNvbnN0IGZsb2F0IGF2ZXJhZ2VTYW1wbGVzID0gMSA8PCBHZXRBdmVyYWdlQml0cygpOworCQlXYWl0KHNhbXBsZVRpbWUgKiBvdmVyU2FtcGxlcyAqIGF2ZXJhZ2VTYW1wbGVzKTsKKwl9Cit9CisKKy8qKgorICogU2V0IHRoZSBjZW50ZXIgdmFsdWUgb2YgdGhlIGFjY3VtdWxhdG9yLgorICoKKyAqIFRoZSBjZW50ZXIgdmFsdWUgaXMgc3VidHJhY3RlZCBmcm9tIGVhY2ggQS9EIHZhbHVlIGJlZm9yZSBpdCBpcyBhZGRlZCB0byB0aGUgYWNjdW11bGF0b3IuIFRoaXMKKyAqIGlzIHVzZWQgZm9yIHRoZSBjZW50ZXIgdmFsdWUgb2YgZGV2aWNlcyBsaWtlIGd5cm9zIGFuZCBhY2NlbGVyb21ldGVycyB0byAKKyAqIHRha2UgdGhlIGRldmljZSBvZmZzZXQgaW50byBhY2NvdW50IHdoZW4gaW50ZWdyYXRpbmcuCisgKgorICogVGhpcyBjZW50ZXIgdmFsdWUgaXMgYmFzZWQgb24gdGhlIG91dHB1dCBvZiB0aGUgb3ZlcnNhbXBsZWQgYW5kIGF2ZXJhZ2VkIHNvdXJjZSBmcm9tIHRoZSBhY2N1bXVsYXRvcgorICogY2hhbm5lbC4gQmVjYXVzZSBvZiB0aGlzLCBhbnkgbm9uLXplcm8gb3ZlcnNhbXBsZSBiaXRzIHdpbGwgYWZmZWN0IHRoZSBzaXplIG9mIHRoZSB2YWx1ZSBmb3IgdGhpcyBmaWVsZC4KKyAqLwordm9pZCBBbmFsb2dJbnB1dDo6U2V0QWNjdW11bGF0b3JDZW50ZXIoaW50MzJfdCBjZW50ZXIpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlzZXRBY2N1bXVsYXRvckNlbnRlcihtX3BvcnQsIGNlbnRlciwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogU2V0IHRoZSBhY2N1bXVsYXRvcidzIGRlYWRiYW5kLgorICogQHBhcmFtIAorICovCit2b2lkIEFuYWxvZ0lucHV0OjpTZXRBY2N1bXVsYXRvckRlYWRiYW5kKGludDMyX3QgZGVhZGJhbmQpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlzZXRBY2N1bXVsYXRvckRlYWRiYW5kKG1fcG9ydCwgZGVhZGJhbmQsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIFJlYWQgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLgorICoKKyAqIFJlYWQgdGhlIHZhbHVlIHRoYXQgaGFzIGJlZW4gYWNjdW11bGF0aW5nLgorICogVGhlIGFjY3VtdWxhdG9yIGlzIGF0dGFjaGVkIGFmdGVyIHRoZSBvdmVyc2FtcGxlIGFuZCBhdmVyYWdlIGVuZ2luZS4KKyAqCisgKiBAcmV0dXJuIFRoZSA2NC1iaXQgdmFsdWUgYWNjdW11bGF0ZWQgc2luY2UgdGhlIGxhc3QgUmVzZXQoKS4KKyAqLworaW50NjRfdCBBbmFsb2dJbnB1dDo6R2V0QWNjdW11bGF0b3JWYWx1ZSgpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIDA7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCWludDY0X3QgdmFsdWUgPSBnZXRBY2N1bXVsYXRvclZhbHVlKG1fcG9ydCwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJcmV0dXJuIHZhbHVlICsgbV9hY2N1bXVsYXRvck9mZnNldDsKK30KKworLyoqCisgKiBSZWFkIHRoZSBudW1iZXIgb2YgYWNjdW11bGF0ZWQgdmFsdWVzLgorICoKKyAqIFJlYWQgdGhlIGNvdW50IG9mIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZXMgc2luY2UgdGhlIGFjY3VtdWxhdG9yIHdhcyBsYXN0IFJlc2V0KCkuCisgKgorICogQHJldHVybiBUaGUgbnVtYmVyIG9mIHRpbWVzIHNhbXBsZXMgZnJvbSB0aGUgY2hhbm5lbCB3ZXJlIGFjY3VtdWxhdGVkLgorICovCit1aW50MzJfdCBBbmFsb2dJbnB1dDo6R2V0QWNjdW11bGF0b3JDb3VudCgpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIDA7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCXVpbnQzMl90IGNvdW50ID0gZ2V0QWNjdW11bGF0b3JDb3VudChtX3BvcnQsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCXJldHVybiBjb3VudDsKK30KKworCisvKioKKyAqIFJlYWQgdGhlIGFjY3VtdWxhdGVkIHZhbHVlIGFuZCB0aGUgbnVtYmVyIG9mIGFjY3VtdWxhdGVkIHZhbHVlcyBhdG9taWNhbGx5LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIHZhbHVlIGFuZCBjb3VudCBmcm9tIHRoZSBGUEdBIGF0b21pY2FsbHkuCisgKiBUaGlzIGNhbiBiZSB1c2VkIGZvciBhdmVyYWdpbmcuCisgKgorICogQHBhcmFtIHZhbHVlIFBvaW50ZXIgdG8gdGhlIDY0LWJpdCBhY2N1bXVsYXRlZCBvdXRwdXQuCisgKiBAcGFyYW0gY291bnQgUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGFjY3VtdWxhdGlvbiBjeWNsZXMuCisgKi8KK3ZvaWQgQW5hbG9nSW5wdXQ6OkdldEFjY3VtdWxhdG9yT3V0cHV0KGludDY0X3QgKnZhbHVlLCB1aW50MzJfdCAqY291bnQpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlnZXRBY2N1bXVsYXRvck91dHB1dChtX3BvcnQsIHZhbHVlLCBjb3VudCwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJKnZhbHVlICs9IG1fYWNjdW11bGF0b3JPZmZzZXQ7Cit9CisKKy8qKgorICogU2V0IHRoZSBzYW1wbGUgcmF0ZSBwZXIgY2hhbm5lbCBmb3IgYWxsIGFuYWxvZyBjaGFubmVscy4KKyAqIFRoZSBtYXhpbXVtIHJhdGUgaXMgNTAwa1MvcyBkaXZpZGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgaW4gdXNlLgorICogVGhpcyBpcyA2MjUwMCBzYW1wbGVzL3MgcGVyIGNoYW5uZWwuCisgKiBAcGFyYW0gc2FtcGxlc1BlclNlY29uZCBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgcGVyIHNlY29uZC4KKyAqLwordm9pZCBBbmFsb2dJbnB1dDo6U2V0U2FtcGxlUmF0ZShmbG9hdCBzYW1wbGVzUGVyU2Vjb25kKQoreworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlzZXRBbmFsb2dTYW1wbGVSYXRlKHNhbXBsZXNQZXJTZWNvbmQsICZzdGF0dXMpOworCXdwaV9zZXRHbG9iYWxFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIEdldCB0aGUgY3VycmVudCBzYW1wbGUgcmF0ZSBmb3IgYWxsIGNoYW5uZWxzCisgKgorICogQHJldHVybiBTYW1wbGUgcmF0ZS4KKyAqLworZmxvYXQgQW5hbG9nSW5wdXQ6OkdldFNhbXBsZVJhdGUoKQoreworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlmbG9hdCBzYW1wbGVSYXRlID0gZ2V0QW5hbG9nU2FtcGxlUmF0ZSgmc3RhdHVzKTsKKwl3cGlfc2V0R2xvYmFsRXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwlyZXR1cm4gc2FtcGxlUmF0ZTsKK30KKworLyoqCisgKiBHZXQgdGhlIEF2ZXJhZ2UgdmFsdWUgZm9yIHRoZSBQSUQgU291cmNlIGJhc2Ugb2JqZWN0LgorICoKKyAqIEByZXR1cm4gVGhlIGF2ZXJhZ2Ugdm9sdGFnZS4KKyAqLworZG91YmxlIEFuYWxvZ0lucHV0OjpQSURHZXQoKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiAwLjA7CisJcmV0dXJuIEdldEF2ZXJhZ2VWb2x0YWdlKCk7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0FuYWxvZ091dHB1dC5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0FuYWxvZ091dHB1dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNkZmFhNgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvQW5hbG9nT3V0cHV0LmNwcApAQCAtMCwwICsxLDgyIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE0LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLworLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJBbmFsb2dPdXRwdXQuaCIKKyNpbmNsdWRlICJSZXNvdXJjZS5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorCitzdGF0aWMgUmVzb3VyY2UgKm91dHB1dHMgPSBOVUxMOworCit2b2lkIEFuYWxvZ091dHB1dDo6SW5pdEFuYWxvZ091dHB1dCh1aW50MzJfdCBjaGFubmVsKSB7CisgICAgUmVzb3VyY2U6OkNyZWF0ZVJlc291cmNlT2JqZWN0KCZvdXRwdXRzLCBrQW5hbG9nT3V0cHV0cyk7CisKKyAgICBjaGFyIGJ1Zls2NF07CisKKyAgICBpZighY2hlY2tBbmFsb2dPdXRwdXRDaGFubmVsKGNoYW5uZWwpKQorICAgIHsKKyAgICAgICAgc25wcmludGYoYnVmLCA2NCwgImFuYWxvZyBpbnB1dCAlZCIsIGNoYW5uZWwpOworICAgICAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChDaGFubmVsSW5kZXhPdXRPZlJhbmdlLCBidWYpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYob3V0cHV0cy0+QWxsb2NhdGUoY2hhbm5lbCwgYnVmKSA9PSB+MHVsKQorICAgIHsKKyAgICAgICAgQ2xvbmVFcnJvcihvdXRwdXRzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1fY2hhbm5lbCA9IGNoYW5uZWw7CisKKyAgICB2b2lkKiBwb3J0ID0gZ2V0UG9ydChtX2NoYW5uZWwpOworICAgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgICBtX3BvcnQgPSBpbml0aWFsaXplQW5hbG9nT3V0cHV0UG9ydChwb3J0LCAmc3RhdHVzKTsKKyAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKworICAgIEhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9BbmFsb2dDaGFubmVsLCBtX2NoYW5uZWwsIDApOworfQorCisvKioKKyAqIENvbnN0cnVjdCBhbiBhbmFsb2cgb3V0cHV0IG9uIHRoZSBnaXZlbiBjaGFubmVsLgorICogQWxsIGFuYWxvZyBvdXRwdXRzIGFyZSBsb2NhdGVkIG9uIHRoZSBNWFAgcG9ydC4KKyAqIEBwYXJhbSBUaGUgY2hhbm5lbCBudW1iZXIgb24gdGhlIHJvYm9SSU8gdG8gcmVwcmVzZW50LgorICovCitBbmFsb2dPdXRwdXQ6OkFuYWxvZ091dHB1dCh1aW50MzJfdCBjaGFubmVsKSB7CisgICAgSW5pdEFuYWxvZ091dHB1dChjaGFubmVsKTsKK30KKworLyoqCisgKiBEZXN0cnVjdG9yLiBGcmVlcyBhbmFsb2cgb3V0cHV0IHJlc291cmNlCisgKi8KK0FuYWxvZ091dHB1dDo6fkFuYWxvZ091dHB1dCgpIHsKKyAgICBvdXRwdXRzLT5GcmVlKG1fY2hhbm5lbCk7Cit9CisKKy8qKgorICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgYW5hbG9nIG91dHB1dAorICoKKyAqIEBwYXJhbSB2b2x0YWdlIFRoZSBvdXRwdXQgdmFsdWUgaW4gVm9sdHMsIGZyb20gMC4wIHRvICs1LjAKKyAqLwordm9pZCBBbmFsb2dPdXRwdXQ6OlNldFZvbHRhZ2UoZmxvYXQgdm9sdGFnZSkgeworICAgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgICBzZXRBbmFsb2dPdXRwdXQobV9wb3J0LCB2b2x0YWdlLCAmc3RhdHVzKTsKKworICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIEdldCB0aGUgdm9sdGFnZSBvZiB0aGUgYW5hbG9nIG91dHB1dAorICoKKyAqIEByZXR1cm4gVGhlIHZhbHVlIGluIFZvbHRzLCBmcm9tIDAuMCB0byArNS4wCisgKi8KK2Zsb2F0IEFuYWxvZ091dHB1dDo6R2V0Vm9sdGFnZSgpIHsKKyAgICBpbnQzMl90IHN0YXR1cyA9IDA7CisgICAgZmxvYXQgdm9sdGFnZSA9IGdldEFuYWxvZ091dHB1dChtX3BvcnQsICZzdGF0dXMpOworCisgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisKKyAgICByZXR1cm4gdm9sdGFnZTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvQW5hbG9nUG90ZW50aW9tZXRlci5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0FuYWxvZ1BvdGVudGlvbWV0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYTdkYmQKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0FuYWxvZ1BvdGVudGlvbWV0ZXIuY3BwCkBAIC0wLDAgKzEsNzMgQEAKKworI2luY2x1ZGUgIkFuYWxvZ1BvdGVudGlvbWV0ZXIuaCIKKyNpbmNsdWRlICJDb250cm9sbGVyUG93ZXIuaCIKKworLyoqCisgKiBDb21tb24gaW5pdGlhbGl6YXRpb24gY29kZSBjYWxsZWQgYnkgYWxsIGNvbnN0cnVjdG9ycy4KKyAqLwordm9pZCBBbmFsb2dQb3RlbnRpb21ldGVyOjppbml0UG90KEFuYWxvZ0lucHV0ICppbnB1dCwgZG91YmxlIGZ1bGxSYW5nZSwgZG91YmxlIG9mZnNldCkgeworICAgIG1fZnVsbFJhbmdlID0gZnVsbFJhbmdlOworICAgIG1fb2Zmc2V0ID0gb2Zmc2V0OworICAgIG1fYW5hbG9nX2lucHV0ID0gaW5wdXQ7Cit9CisKKy8qKgorICogQ29uc3RydWN0IGFuIEFuYWxvZyBQb3RlbnRpb21ldGVyIG9iamVjdCBmcm9tIGEgY2hhbm5lbCBudW1iZXIuCisgKiBAcGFyYW0gY2hhbm5lbCBUaGUgY2hhbm5lbCBudW1iZXIgb24gdGhlIHJvYm9SSU8gdG8gcmVwcmVzZW50LiAwLTMgYXJlIG9uLWJvYXJkIDQtNyBhcmUgb24gdGhlIE1YUCBwb3J0LgorICogQHBhcmFtIGZ1bGxSYW5nZSBUaGUgYW5ndWxhciB2YWx1ZSAoaW4gZGVzaXJlZCB1bml0cykgcmVwcmVzZW50aW5nIHRoZSBmdWxsIDAtNVYgcmFuZ2Ugb2YgdGhlIGlucHV0LgorICogQHBhcmFtIG9mZnNldCBUaGUgYW5ndWxhciB2YWx1ZSAoaW4gZGVzaXJlZCB1bml0cykgcmVwcmVzZW50aW5nIHRoZSBhbmd1bGFyIG91dHB1dCBhdCAwVi4KKyAqLworQW5hbG9nUG90ZW50aW9tZXRlcjo6QW5hbG9nUG90ZW50aW9tZXRlcihpbnQgY2hhbm5lbCwgZG91YmxlIGZ1bGxSYW5nZSwgZG91YmxlIG9mZnNldCkgeworICAgIG1faW5pdF9hbmFsb2dfaW5wdXQgPSB0cnVlOworICAgIGluaXRQb3QobmV3IEFuYWxvZ0lucHV0KGNoYW5uZWwpLCBmdWxsUmFuZ2UsIG9mZnNldCk7Cit9CisKKy8qKgorICogQ29uc3RydWN0IGFuIEFuYWxvZyBQb3RlbnRpb21ldGVyIG9iamVjdCBmcm9tIGFuIGV4aXN0aW5nIEFuYWxvZyBJbnB1dCBwb2ludGVyLgorICogQHBhcmFtIGNoYW5uZWwgVGhlIGV4aXN0aW5nIEFuYWxvZyBJbnB1dCBwb2ludGVyIAorICogQHBhcmFtIGZ1bGxSYW5nZSBUaGUgYW5ndWxhciB2YWx1ZSAoaW4gZGVzaXJlZCB1bml0cykgcmVwcmVzZW50aW5nIHRoZSBmdWxsIDAtNVYgcmFuZ2Ugb2YgdGhlIGlucHV0LgorICogQHBhcmFtIG9mZnNldCBUaGUgYW5ndWxhciB2YWx1ZSAoaW4gZGVzaXJlZCB1bml0cykgcmVwcmVzZW50aW5nIHRoZSBhbmd1bGFyIG91dHB1dCBhdCAwVi4KKyAqLworQW5hbG9nUG90ZW50aW9tZXRlcjo6QW5hbG9nUG90ZW50aW9tZXRlcihBbmFsb2dJbnB1dCAqaW5wdXQsIGRvdWJsZSBmdWxsUmFuZ2UsIGRvdWJsZSBvZmZzZXQpIHsKKyAgICBtX2luaXRfYW5hbG9nX2lucHV0ID0gZmFsc2U7CisgICAgaW5pdFBvdChpbnB1dCwgZnVsbFJhbmdlLCBvZmZzZXQpOworfQorCisvKioKKyAqIENvbnN0cnVjdCBhbiBBbmFsb2cgUG90ZW50aW9tZXRlciBvYmplY3QgZnJvbSBhbiBleGlzdGluZyBBbmFsb2cgSW5wdXQgcmVmZXJlbmNlLgorICogQHBhcmFtIGNoYW5uZWwgVGhlIGV4aXN0aW5nIEFuYWxvZyBJbnB1dCByZWZlcmVuY2UgCisgKiBAcGFyYW0gZnVsbFJhbmdlIFRoZSBhbmd1bGFyIHZhbHVlIChpbiBkZXNpcmVkIHVuaXRzKSByZXByZXNlbnRpbmcgdGhlIGZ1bGwgMC01ViByYW5nZSBvZiB0aGUgaW5wdXQuCisgKiBAcGFyYW0gb2Zmc2V0IFRoZSBhbmd1bGFyIHZhbHVlIChpbiBkZXNpcmVkIHVuaXRzKSByZXByZXNlbnRpbmcgdGhlIGFuZ3VsYXIgb3V0cHV0IGF0IDBWLgorICovCitBbmFsb2dQb3RlbnRpb21ldGVyOjpBbmFsb2dQb3RlbnRpb21ldGVyKEFuYWxvZ0lucHV0ICZpbnB1dCwgZG91YmxlIGZ1bGxSYW5nZSwgZG91YmxlIG9mZnNldCkgeworICAgIG1faW5pdF9hbmFsb2dfaW5wdXQgPSBmYWxzZTsKKyAgICBpbml0UG90KCZpbnB1dCwgZnVsbFJhbmdlLCBvZmZzZXQpOworfQorCisvKioKKyAqIERlc3RydWN0b3IuIFJlbGVhc2VzIHRoZSBBbmFsb2cgSW5wdXQgcmVzb3VyY2UgaWYgaXQgd2FzIGFsbG9jYXRlZCBieSB0aGlzIG9iamVjdAorICovCitBbmFsb2dQb3RlbnRpb21ldGVyOjp+QW5hbG9nUG90ZW50aW9tZXRlcigpIHsKKyAgaWYobV9pbml0X2FuYWxvZ19pbnB1dCl7CisgICAgZGVsZXRlIG1fYW5hbG9nX2lucHV0OworICAgIG1faW5pdF9hbmFsb2dfaW5wdXQgPSBmYWxzZTsKKyAgfQorfQorCisvKioKKyAqIEdldCB0aGUgY3VycmVudCByZWFkaW5nIG9mIHRoZSBwb3RlbnRpb21ldGVyLgorICoKKyAqIEByZXR1cm4gVGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIHBvdGVudGlvbWV0ZXIgKGluIHRoZSB1bml0cyB1c2VkIGZvciBmdWxsUmFuZWcgYW5kIG9mZnNldCkuCisgKi8KK2RvdWJsZSBBbmFsb2dQb3RlbnRpb21ldGVyOjpHZXQoKSB7CisgICAgcmV0dXJuIChtX2FuYWxvZ19pbnB1dC0+R2V0Vm9sdGFnZSgpIC8gQ29udHJvbGxlclBvd2VyOjpHZXRWb2x0YWdlNVYoKSkgKiBtX2Z1bGxSYW5nZSArIG1fb2Zmc2V0OworfQorCisvKioKKyAqIEltcGxlbWVudCB0aGUgUElEU291cmNlIGludGVyZmFjZS4KKyAqCisgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHJlYWRpbmcuCisgKi8KK2RvdWJsZSBBbmFsb2dQb3RlbnRpb21ldGVyOjpQSURHZXQoKSB7CisgICAgcmV0dXJuIEdldCgpOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9BbmFsb2dUcmlnZ2VyLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvQW5hbG9nVHJpZ2dlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFjZDAxNAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvQW5hbG9nVHJpZ2dlci5jcHAKQEAgLTAsMCArMSwxNjYgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkFuYWxvZ1RyaWdnZXIuaCIKKworI2luY2x1ZGUgIkFuYWxvZ0lucHV0LmgiCisvLyNpbmNsdWRlICJOZXR3b3JrQ29tbXVuaWNhdGlvbi9Vc2FnZVJlcG9ydGluZy5oIgorI2luY2x1ZGUgIlJlc291cmNlLmgiCisjaW5jbHVkZSAiV1BJRXJyb3JzLmgiCisKKy8qKgorICogSW5pdGlhbGl6ZSBhbiBhbmFsb2cgdHJpZ2dlciBmcm9tIGEgY2hhbm5lbC4KKyAqLwordm9pZCBBbmFsb2dUcmlnZ2VyOjpJbml0VHJpZ2dlcih1aW50MzJfdCBjaGFubmVsKQoreworCXZvaWQqIHBvcnQgPSBnZXRQb3J0KGNoYW5uZWwpOworCWludDMyX3Qgc3RhdHVzID0gMDsKKwl1aW50MzJfdCBpbmRleCA9IDA7CisJbV90cmlnZ2VyID0gaW5pdGlhbGl6ZUFuYWxvZ1RyaWdnZXIocG9ydCwgJmluZGV4LCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwltX2luZGV4ID0gaW5kZXg7CisKKwlIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfQW5hbG9nVHJpZ2dlciwgY2hhbm5lbCk7Cit9CisKKy8qKgorICogQ29uc3RydWN0b3IgZm9yIGFuIGFuYWxvZyB0cmlnZ2VyIGdpdmVuIGEgY2hhbm5lbCBudW1iZXIuCisgKgorICogQHBhcmFtIGNoYW5uZWwgVGhlIGNoYW5uZWwgbnVtYmVyIG9uIHRoZSByb2JvUklPIHRvIHJlcHJlc2VudC4gMC0zIGFyZSBvbi1ib2FyZCA0LTcgYXJlIG9uIHRoZSBNWFAgcG9ydC4KKyAqLworQW5hbG9nVHJpZ2dlcjo6QW5hbG9nVHJpZ2dlcihpbnQzMl90IGNoYW5uZWwpCit7CisJSW5pdFRyaWdnZXIoY2hhbm5lbCk7Cit9CisKKy8qKgorICogQ29uc3RydWN0IGFuIGFuYWxvZyB0cmlnZ2VyIGdpdmVuIGFuIGFuYWxvZyBpbnB1dC4KKyAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgaW4gdGhlIGNhc2Ugb2Ygc2hhcmluZyBhbiBhbmFsb2cgY2hhbm5lbCBiZXR3ZWVuIHRoZQorICogdHJpZ2dlciBhbmQgYW4gYW5hbG9nIGlucHV0IG9iamVjdC4KKyAqIEBwYXJhbSBjaGFubmVsIFRoZSBwb2ludGVyIHRvIHRoZSBleGlzdGluZyBBbmFsb2dJbnB1dCBvYmplY3QKKyAqLworQW5hbG9nVHJpZ2dlcjo6QW5hbG9nVHJpZ2dlcihBbmFsb2dJbnB1dCAqaW5wdXQpCit7CisJSW5pdFRyaWdnZXIoaW5wdXQtPkdldENoYW5uZWwoKSk7Cit9CisKK0FuYWxvZ1RyaWdnZXI6On5BbmFsb2dUcmlnZ2VyKCkKK3sKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJY2xlYW5BbmFsb2dUcmlnZ2VyKG1fdHJpZ2dlciwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogU2V0IHRoZSB1cHBlciBhbmQgbG93ZXIgbGltaXRzIG9mIHRoZSBhbmFsb2cgdHJpZ2dlci4KKyAqIFRoZSBsaW1pdHMgYXJlIGdpdmVuIGluIEFEQyBjb2Rlcy4gIElmIG92ZXJzYW1wbGluZyBpcyB1c2VkLCB0aGUgdW5pdHMgbXVzdCBiZSBzY2FsZWQKKyAqIGFwcHJvcHJpYXRlbHkuCisgKiBAcGFyYW0gbG93ZXIgVGhlIGxvd2VyIGxpbWl0IG9mIHRoZSB0cmlnZ2VyIGluIEFEQyBjb2RlcyAoMTItYml0IHZhbHVlcykuCisgKiBAcGFyYW0gdXBwZXIgVGhlIHVwcGVyIGxpbWl0IG9mIHRoZSB0cmlnZ2VyIGluIEFEQyBjb2RlcyAoMTItYml0IHZhbHVlcykuCisgKi8KK3ZvaWQgQW5hbG9nVHJpZ2dlcjo6U2V0TGltaXRzUmF3KGludDMyX3QgbG93ZXIsIGludDMyX3QgdXBwZXIpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlzZXRBbmFsb2dUcmlnZ2VyTGltaXRzUmF3KG1fdHJpZ2dlciwgbG93ZXIsIHVwcGVyLCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKworLyoqCisgKiBTZXQgdGhlIHVwcGVyIGFuZCBsb3dlciBsaW1pdHMgb2YgdGhlIGFuYWxvZyB0cmlnZ2VyLgorICogVGhlIGxpbWl0cyBhcmUgZ2l2ZW4gYXMgZmxvYXRpbmcgcG9pbnQgdm9sdGFnZSB2YWx1ZXMuCisgKiBAcGFyYW0gbG93ZXIgVGhlIGxvd2VyIGxpbWl0IG9mIHRoZSB0cmlnZ2VyIGluIFZvbHRzLgorICogQHBhcmFtIHVwcGVyIFRoZSB1cHBlciBsaW1pdCBvZiB0aGUgdHJpZ2dlciBpbiBWb2x0cy4KKyAqLwordm9pZCBBbmFsb2dUcmlnZ2VyOjpTZXRMaW1pdHNWb2x0YWdlKGZsb2F0IGxvd2VyLCBmbG9hdCB1cHBlcikKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisJaW50MzJfdCBzdGF0dXMgPSAwOworCXNldEFuYWxvZ1RyaWdnZXJMaW1pdHNWb2x0YWdlKG1fdHJpZ2dlciwgbG93ZXIsIHVwcGVyLCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKworLyoqCisgKiBDb25maWd1cmUgdGhlIGFuYWxvZyB0cmlnZ2VyIHRvIHVzZSB0aGUgYXZlcmFnZWQgdnMuIHJhdyB2YWx1ZXMuCisgKiBJZiB0aGUgdmFsdWUgaXMgdHJ1ZSwgdGhlbiB0aGUgYXZlcmFnZWQgdmFsdWUgaXMgc2VsZWN0ZWQgZm9yIHRoZSBhbmFsb2cgdHJpZ2dlciwgb3RoZXJ3aXNlCisgKiB0aGUgaW1tZWRpYXRlIHZhbHVlIGlzIHVzZWQuCisgKiBAcGFyYW0gdXNlQXZlcmFnZWRWYWx1ZSBJZiB0cnVlLCB1c2UgdGhlIEF2ZXJhZ2VkIHZhbHVlLCBvdGhlcndpc2UgdXNlIHRoZSBpbnN0YW50YW5lb3VzIHJlYWRpbmcKKyAqLwordm9pZCBBbmFsb2dUcmlnZ2VyOjpTZXRBdmVyYWdlZChib29sIHVzZUF2ZXJhZ2VkVmFsdWUpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlzZXRBbmFsb2dUcmlnZ2VyQXZlcmFnZWQobV90cmlnZ2VyLCB1c2VBdmVyYWdlZFZhbHVlLCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKworLyoqCisgKiBDb25maWd1cmUgdGhlIGFuYWxvZyB0cmlnZ2VyIHRvIHVzZSBhIGZpbHRlcmVkIHZhbHVlLgorICogVGhlIGFuYWxvZyB0cmlnZ2VyIHdpbGwgb3BlcmF0ZSB3aXRoIGEgMyBwb2ludCBhdmVyYWdlIHJlamVjdGlvbiBmaWx0ZXIuIFRoaXMgaXMgZGVzaWduZWQgdG8KKyAqIGhlbHAgd2l0aCAzNjAgZGVncmVlIHBvdCBhcHBsaWNhdGlvbnMgZm9yIHRoZSBwZXJpb2Qgd2hlcmUgdGhlIHBvdCBjcm9zc2VzIHRocm91Z2ggemVyby4KKyAqIEBwYXJhbSB1c2VGaWx0ZXJlZFZhbHVlIElmIHRydWUsIHVzZSB0aGUgMyBwb2ludCByZWplY3Rpb24gZmlsdGVyLCBvdGhlcndpc2UgdXNlIHRoZSB1bmZpbHRlcmVkIHZhbHVlCisgKi8KK3ZvaWQgQW5hbG9nVHJpZ2dlcjo6U2V0RmlsdGVyZWQoYm9vbCB1c2VGaWx0ZXJlZFZhbHVlKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJc2V0QW5hbG9nVHJpZ2dlckZpbHRlcmVkKG1fdHJpZ2dlciwgdXNlRmlsdGVyZWRWYWx1ZSwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgYW5hbG9nIHRyaWdnZXIuCisgKiBUaGlzIGlzIHRoZSBGUEdBIGluZGV4IG9mIHRoaXMgYW5hbG9nIHRyaWdnZXIgaW5zdGFuY2UuCisgKiBAcmV0dXJuIFRoZSBpbmRleCBvZiB0aGUgYW5hbG9nIHRyaWdnZXIuCisgKi8KK3VpbnQzMl90IEFuYWxvZ1RyaWdnZXI6OkdldEluZGV4KCkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gfjB1bDsKKwlyZXR1cm4gbV9pbmRleDsKK30KKworLyoqCisgKiBSZXR1cm4gdGhlIEluV2luZG93IG91dHB1dCBvZiB0aGUgYW5hbG9nIHRyaWdnZXIuCisgKiBUcnVlIGlmIHRoZSBhbmFsb2cgaW5wdXQgaXMgYmV0d2VlbiB0aGUgdXBwZXIgYW5kIGxvd2VyIGxpbWl0cy4KKyAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgYW5hbG9nIGlucHV0IGlzIGJldHdlZW4gdGhlIHVwcGVyIGFuZCBsb3dlciBsaW1pdHMuCisgKi8KK2Jvb2wgQW5hbG9nVHJpZ2dlcjo6R2V0SW5XaW5kb3coKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiBmYWxzZTsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJYm9vbCByZXN1bHQgPSBnZXRBbmFsb2dUcmlnZ2VySW5XaW5kb3cobV90cmlnZ2VyLCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJldHVybiB0aGUgVHJpZ2dlclN0YXRlIG91dHB1dCBvZiB0aGUgYW5hbG9nIHRyaWdnZXIuCisgKiBUcnVlIGlmIGFib3ZlIHVwcGVyIGxpbWl0LgorICogRmFsc2UgaWYgYmVsb3cgbG93ZXIgbGltaXQuCisgKiBJZiBpbiBIeXN0ZXJlc2lzLCBtYWludGFpbiBwcmV2aW91cyBzdGF0ZS4KKyAqIEByZXR1cm4gVHJ1ZSBpZiBhYm92ZSB1cHBlciBsaW1pdC4gRmFsc2UgaWYgYmVsb3cgbG93ZXIgbGltaXQuIElmIGluIEh5c3RlcmVzaXMsIG1haW50YWluIHByZXZpb3VzIHN0YXRlLgorICovCitib29sIEFuYWxvZ1RyaWdnZXI6OkdldFRyaWdnZXJTdGF0ZSgpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIGZhbHNlOworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlib29sIHJlc3VsdCA9IGdldEFuYWxvZ1RyaWdnZXJUcmlnZ2VyU3RhdGUobV90cmlnZ2VyLCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIENyZWF0ZXMgYW4gQW5hbG9nVHJpZ2dlck91dHB1dCBvYmplY3QuCisgKiBHZXRzIGFuIG91dHB1dCBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCBmb3Igcm91dGluZy4KKyAqIENhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgdGhlIEFuYWxvZ1RyaWdnZXJPdXRwdXQgb2JqZWN0LgorICogQHBhcmFtIHR5cGUgQW4gZW51bSBvZiB0aGUgdHlwZSBvZiBvdXRwdXQgb2JqZWN0IHRvIGNyZWF0ZS4KKyAqIEByZXR1cm4gQSBwb2ludGVyIHRvIGEgbmV3IEFuYWxvZ1RyaWdnZXJPdXRwdXQgb2JqZWN0LgorICovCitBbmFsb2dUcmlnZ2VyT3V0cHV0ICpBbmFsb2dUcmlnZ2VyOjpDcmVhdGVPdXRwdXQoQW5hbG9nVHJpZ2dlclR5cGUgdHlwZSkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gTlVMTDsKKwlyZXR1cm4gbmV3IEFuYWxvZ1RyaWdnZXJPdXRwdXQodGhpcywgdHlwZSk7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0FuYWxvZ1RyaWdnZXJPdXRwdXQuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9BbmFsb2dUcmlnZ2VyT3V0cHV0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWZlYmZhCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9BbmFsb2dUcmlnZ2VyT3V0cHV0LmNwcApAQCAtMCwwICsxLDc0IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJBbmFsb2dUcmlnZ2VyT3V0cHV0LmgiCisjaW5jbHVkZSAiQW5hbG9nVHJpZ2dlci5oIgorLy8jaW5jbHVkZSAiTmV0d29ya0NvbW11bmljYXRpb24vVXNhZ2VSZXBvcnRpbmcuaCIKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKworLyoqCisgKiBDcmVhdGUgYW4gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyBvbmUgb2YgdGhlIGZvdXIgb3V0cHV0cyBmcm9tIGFuIGFuYWxvZyB0cmlnZ2VyLgorICoKKyAqIEJlY2F1c2UgdGhpcyBjbGFzcyBkZXJpdmVzIGZyb20gRGlnaXRhbFNvdXJjZSwgaXQgY2FuIGJlIHBhc3NlZCBpbnRvIHJvdXRpbmcgZnVuY3Rpb25zCisgKiBmb3IgQ291bnRlciwgRW5jb2RlciwgZXRjLgorICoKKyAqIEBwYXJhbSB0cmlnZ2VyIEEgcG9pbnRlciB0byB0aGUgdHJpZ2dlciBmb3Igd2hpY2ggdGhpcyBpcyBhbiBvdXRwdXQuCisgKiBAcGFyYW0gb3V0cHV0VHlwZSBBbiBlbnVtIHRoYXQgc3BlY2lmaWVzIHRoZSBvdXRwdXQgb24gdGhlIHRyaWdnZXIgdG8gcmVwcmVzZW50LgorICovCitBbmFsb2dUcmlnZ2VyT3V0cHV0OjpBbmFsb2dUcmlnZ2VyT3V0cHV0KEFuYWxvZ1RyaWdnZXIgKnRyaWdnZXIsIEFuYWxvZ1RyaWdnZXJUeXBlIG91dHB1dFR5cGUpCisJOiBtX3RyaWdnZXIgKHRyaWdnZXIpCisJLCBtX291dHB1dFR5cGUgKG91dHB1dFR5cGUpCit7CisJSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0FuYWxvZ1RyaWdnZXJPdXRwdXQsIHRyaWdnZXItPkdldEluZGV4KCksIG91dHB1dFR5cGUpOworfQorCitBbmFsb2dUcmlnZ2VyT3V0cHV0Ojp+QW5hbG9nVHJpZ2dlck91dHB1dCgpCit7CisJaWYgKG1faW50ZXJydXB0ICE9IE5VTEwpCisJeworCQlpbnQzMl90IHN0YXR1cyA9IDA7CisJCWNsZWFuSW50ZXJydXB0cyhtX2ludGVycnVwdCwgJnN0YXR1cyk7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCQltX2ludGVycnVwdCA9IE5VTEw7CisJCW1faW50ZXJydXB0cy0+RnJlZShtX2ludGVycnVwdEluZGV4KTsKKwl9Cit9CisKKy8qKgorICogR2V0IHRoZSBzdGF0ZSBvZiB0aGUgYW5hbG9nIHRyaWdnZXIgb3V0cHV0LgorICogQHJldHVybiBUaGUgc3RhdGUgb2YgdGhlIGFuYWxvZyB0cmlnZ2VyIG91dHB1dC4KKyAqLworYm9vbCBBbmFsb2dUcmlnZ2VyT3V0cHV0OjpHZXQoKQoreworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIGJvb2wgcmVzdWx0ID0gZ2V0QW5hbG9nVHJpZ2dlck91dHB1dChtX3RyaWdnZXItPm1fdHJpZ2dlciwgbV9vdXRwdXRUeXBlLCAmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogQHJldHVybiBUaGUgdmFsdWUgdG8gYmUgd3JpdHRlbiB0byB0aGUgY2hhbm5lbCBmaWVsZCBvZiBhIHJvdXRpbmcgbXV4LgorICovCit1aW50MzJfdCBBbmFsb2dUcmlnZ2VyT3V0cHV0OjpHZXRDaGFubmVsRm9yUm91dGluZygpCit7CisJcmV0dXJuIChtX3RyaWdnZXItPm1faW5kZXggPDwgMikgKyBtX291dHB1dFR5cGU7Cit9CisKKy8qKgorICogQHJldHVybiBUaGUgdmFsdWUgdG8gYmUgd3JpdHRlbiB0byB0aGUgbW9kdWxlIGZpZWxkIG9mIGEgcm91dGluZyBtdXguCisgKi8KK3VpbnQzMl90IEFuYWxvZ1RyaWdnZXJPdXRwdXQ6OkdldE1vZHVsZUZvclJvdXRpbmcoKQoreworCXJldHVybiAwOworfQorCisvKioKKyAqIEByZXR1cm4gVGhlIHZhbHVlIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIG1vZHVsZSBmaWVsZCBvZiBhIHJvdXRpbmcgbXV4LgorICovCitib29sIEFuYWxvZ1RyaWdnZXJPdXRwdXQ6OkdldEFuYWxvZ1RyaWdnZXJGb3JSb3V0aW5nKCkKK3sKKwlyZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvQnVpbHRJbkFjY2VsZXJvbWV0ZXIuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9CdWlsdEluQWNjZWxlcm9tZXRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdmN2I1NwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvQnVpbHRJbkFjY2VsZXJvbWV0ZXIuY3BwCkBAIC0wLDAgKzEsNjEgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiQnVpbHRJbkFjY2VsZXJvbWV0ZXIuaCIKKyNpbmNsdWRlICJIQUwvSEFMLmhwcCIKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKworLyoqCisgKiBDb25zdHJ1Y3Rvci4KKyAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2UgdGhlIGFjY2VsZXJvbWV0ZXIgd2lsbCBtZWFzdXJlCisgKi8KK0J1aWx0SW5BY2NlbGVyb21ldGVyOjpCdWlsdEluQWNjZWxlcm9tZXRlcihSYW5nZSByYW5nZSkKK3sKKwlTZXRSYW5nZShyYW5nZSk7CisKKwlIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfQWNjZWxlcm9tZXRlciwgMCwgMCwgIkJ1aWx0LWluIGFjY2VsZXJvbWV0ZXIiKTsKK30KKworQnVpbHRJbkFjY2VsZXJvbWV0ZXI6On5CdWlsdEluQWNjZWxlcm9tZXRlcigpCit7Cit9CisKKy8qKiB7QGluaGVyaXRkb2N9ICovCit2b2lkIEJ1aWx0SW5BY2NlbGVyb21ldGVyOjpTZXRSYW5nZShSYW5nZSByYW5nZSkKK3sKKwlpZihyYW5nZSA9PSBrUmFuZ2VfMTZHKQorCXsKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoUGFyYW1ldGVyT3V0T2ZSYW5nZSwgIjE2RyByYW5nZSBub3Qgc3VwcG9ydGVkICh1c2UgazJHLCBrNEcsIG9yIGs4RykiKTsKKwl9CisKKwlzZXRBY2NlbGVyb21ldGVyQWN0aXZlKGZhbHNlKTsKKwlzZXRBY2NlbGVyb21ldGVyUmFuZ2UoKEFjY2VsZXJvbWV0ZXJSYW5nZSlyYW5nZSk7CisJc2V0QWNjZWxlcm9tZXRlckFjdGl2ZSh0cnVlKTsKK30KKworLyoqCisgKiBAcmV0dXJuIFRoZSBhY2NlbGVyYXRpb24gb2YgdGhlIFJvYm9SSU8gYWxvbmcgdGhlIFggYXhpcyBpbiBnLWZvcmNlcworICovCitkb3VibGUgQnVpbHRJbkFjY2VsZXJvbWV0ZXI6OkdldFgoKQoreworCXJldHVybiBnZXRBY2NlbGVyb21ldGVyWCgpOworfQorCisvKioKKyAqIEByZXR1cm4gVGhlIGFjY2VsZXJhdGlvbiBvZiB0aGUgUm9ib1JJTyBhbG9uZyB0aGUgWSBheGlzIGluIGctZm9yY2VzCisgKi8KK2RvdWJsZSBCdWlsdEluQWNjZWxlcm9tZXRlcjo6R2V0WSgpCit7CisJcmV0dXJuIGdldEFjY2VsZXJvbWV0ZXJZKCk7Cit9CisKKy8qKgorICogQHJldHVybiBUaGUgYWNjZWxlcmF0aW9uIG9mIHRoZSBSb2JvUklPIGFsb25nIHRoZSBaIGF4aXMgaW4gZy1mb3JjZXMKKyAqLworZG91YmxlIEJ1aWx0SW5BY2NlbGVyb21ldGVyOjpHZXRaKCkKK3sKKwlyZXR1cm4gZ2V0QWNjZWxlcm9tZXRlclooKTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvQ0FOSmFndWFyLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvQ0FOSmFndWFyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWIyMmE1Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9DQU5KYWd1YXIuY3BwCkBAIC0wLDAgKzEsMjA4NCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJDQU5KYWd1YXIuaCIKKyNpbmNsdWRlICJUaW1lci5oIgorI2RlZmluZSB0TklSSU9faTMyIGludAorI2luY2x1ZGUgIk5ldHdvcmtDb21tdW5pY2F0aW9uL0NBTlNlc3Npb25NdXguaCIKKyNpbmNsdWRlICJDQU4vY2FuX3Byb3RvLmgiCisvLyNpbmNsdWRlICJOZXR3b3JrQ29tbXVuaWNhdGlvbi9Vc2FnZVJlcG9ydGluZy5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdHJpbmc+CisKKy8qIHdlIGFyZSBvbiBBUk0tTEUgbm93LCBub3QgRnJlZXNjYWxlIHNvIG5vIG5lZWQgdG8gc3dhcCAqLworI2RlZmluZSBzd2FwMTYoeCkJKHgpCisjZGVmaW5lIHN3YXAzMih4KQkoeCkKKworLyogQ29tcGFyZSBmbG9hdHMgZm9yIGVxdWFsaXR5IGFzIGZpeGVkIHBvaW50IG51bWJlcnMgKi8KKyNkZWZpbmUgRlhQOF9FUShhLGIpICgoaW50MTZfdCkoKGEpKjI1Ni4wKT09KGludDE2X3QpKChiKSoyNTYuMCkpCisjZGVmaW5lIEZYUDE2X0VRKGEsYikgKChpbnQzMl90KSgoYSkqNjU1MzYuMCk9PShpbnQzMl90KSgoYikqNjU1MzYuMCkpCisKK2NvbnN0IGludDMyX3QgQ0FOSmFndWFyOjprQ29udHJvbGxlclJhdGU7Citjb25zdGV4cHIgZG91YmxlIENBTkphZ3Vhcjo6a0FwcHJveEJ1c1ZvbHRhZ2U7CisKK3N0YXRpYyBjb25zdCBpbnQzMl90IGtTZW5kTWVzc2FnZVBlcmlvZCA9IDIwOworc3RhdGljIGNvbnN0IHVpbnQzMl90IGtGdWxsTWVzc2FnZUlETWFzayA9IChDQU5fTVNHSURfQVBJX00gfCBDQU5fTVNHSURfTUZSX00gfCBDQU5fTVNHSURfRFRZUEVfTSk7CisKK3N0YXRpYyBjb25zdCBpbnQzMl90IGtSZWNlaXZlU3RhdHVzQXR0ZW1wdHMgPSA1MDsKKworc3RhdGljIFJlc291cmNlICphbGxvY2F0ZWQgPSBOVUxMOworCitzdGF0aWMgaW50MzJfdCBzZW5kTWVzc2FnZUhlbHBlcih1aW50MzJfdCBtZXNzYWdlSUQsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHVpbnQ4X3QgZGF0YVNpemUsIGludDMyX3QgcGVyaW9kKQoreworCXN0YXRpYyBjb25zdCB1aW50MzJfdCBrVHJ1c3RlZE1lc3NhZ2VzW10gPSB7CisJCQlMTV9BUElfVk9MVF9UX0VOLCBMTV9BUElfVk9MVF9UX1NFVCwgTE1fQVBJX1NQRF9UX0VOLCBMTV9BUElfU1BEX1RfU0VULAorCQkJTE1fQVBJX1ZDT01QX1RfRU4sIExNX0FQSV9WQ09NUF9UX1NFVCwgTE1fQVBJX1BPU19UX0VOLCBMTV9BUElfUE9TX1RfU0VULAorCQkJTE1fQVBJX0lDVFJMX1RfRU4sIExNX0FQSV9JQ1RSTF9UX1NFVH07CisKKwlpbnQzMl90IHN0YXR1cz0wOworCisJZm9yICh1aW50OF90IGk9MDsgaTwoc2l6ZW9mKGtUcnVzdGVkTWVzc2FnZXMpL3NpemVvZihrVHJ1c3RlZE1lc3NhZ2VzWzBdKSk7IGkrKykKKwl7CisJCWlmICgoa0Z1bGxNZXNzYWdlSURNYXNrICYgbWVzc2FnZUlEKSA9PSBrVHJ1c3RlZE1lc3NhZ2VzW2ldKQorCQl7CisJCQl1aW50OF90IGRhdGFCdWZmZXJbOF07CisJCQlkYXRhQnVmZmVyWzBdID0gMDsKKwkJCWRhdGFCdWZmZXJbMV0gPSAwOworCisJCQkvLyBNYWtlIHN1cmUgdGhlIGRhdGEgd2lsbCBzdGlsbCBmaXQgYWZ0ZXIgYWRqdXN0aW5nIGZvciB0aGUgdG9rZW4uCisJCQlhc3NlcnQoZGF0YVNpemUgPD0gNik7CisKKwkJCWZvciAodWludDhfdCBqPTA7IGogPCBkYXRhU2l6ZTsgaisrKQorCQkJeworCQkJCWRhdGFCdWZmZXJbaiArIDJdID0gZGF0YVtqXTsKKwkJCX0KKworCQkJRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0NBTlNlc3Npb25NdXhfc2VuZE1lc3NhZ2UobWVzc2FnZUlELCBkYXRhQnVmZmVyLCBkYXRhU2l6ZSArIDIsIHBlcmlvZCwgJnN0YXR1cyk7CisKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKwl9CisKKwlGUkNfTmV0d29ya0NvbW11bmljYXRpb25fQ0FOU2Vzc2lvbk11eF9zZW5kTWVzc2FnZShtZXNzYWdlSUQsIGRhdGEsIGRhdGFTaXplLCBwZXJpb2QsICZzdGF0dXMpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBDb21tb24gaW5pdGlhbGl6YXRpb24gY29kZSBjYWxsZWQgYnkgYWxsIGNvbnN0cnVjdG9ycy4KKyAqLwordm9pZCBDQU5KYWd1YXI6OkluaXRDQU5KYWd1YXIoKQoreworCW1fc2FmZXR5SGVscGVyID0gbmV3IE1vdG9yU2FmZXR5SGVscGVyKHRoaXMpOworCisJbV92YWx1ZSA9IDAuMGY7CisJbV9zcGVlZFJlZmVyZW5jZSA9IExNX1JFRl9OT05FOworCW1fcG9zaXRpb25SZWZlcmVuY2UgPSBMTV9SRUZfTk9ORTsKKwltX3AgPSAwLjA7CisJbV9pID0gMC4wOworCW1fZCA9IDAuMDsKKwltX2J1c1ZvbHRhZ2UgPSAwLjBmOworCW1fb3V0cHV0Vm9sdGFnZSA9IDAuMGY7CisJbV9vdXRwdXRDdXJyZW50ID0gMC4wZjsKKwltX3RlbXBlcmF0dXJlID0gMC4wZjsKKwltX3Bvc2l0aW9uID0gMC4wOworCW1fc3BlZWQgPSAwLjA7CisJbV9saW1pdHMgPSAweDAwOworCW1fZmF1bHRzID0gMHgwMDAwOworCW1fZmlybXdhcmVWZXJzaW9uID0gMDsKKwltX2hhcmR3YXJlVmVyc2lvbiA9IDA7CisJbV9uZXV0cmFsTW9kZSA9IGtOZXV0cmFsTW9kZV9KdW1wZXI7CisJbV9lbmNvZGVyQ29kZXNQZXJSZXYgPSAwOworCW1fcG90ZW50aW9tZXRlclR1cm5zID0gMDsKKwltX2xpbWl0TW9kZSA9IGtMaW1pdE1vZGVfU3dpdGNoSW5wdXRzT25seTsKKwltX2ZvcndhcmRMaW1pdCA9IDAuMDsKKwltX3JldmVyc2VMaW1pdCA9IDAuMDsKKwltX21heE91dHB1dFZvbHRhZ2UgPSAzMC4wOworCW1fdm9sdGFnZVJhbXBSYXRlID0gMC4wOworCW1fZmF1bHRUaW1lID0gMC4wZjsKKworCS8vIFBhcmFtZXRlcnMgb25seSBuZWVkIHRvIGJlIHZlcmlmaWVkIGlmIHRoZXkgYXJlIHNldAorCW1fY29udHJvbE1vZGVWZXJpZmllZCA9IGZhbHNlOyAvLyBOZWVkcyB0byBiZSB2ZXJpZmllZCBiZWNhdXNlIGl0J3Mgc2V0IGluIHRoZSBjb25zdHJ1Y3RvcgorCW1fc3BlZWRSZWZWZXJpZmllZCA9IHRydWU7CisJbV9wb3NSZWZWZXJpZmllZCA9IHRydWU7CisJbV9wVmVyaWZpZWQgPSB0cnVlOworCW1faVZlcmlmaWVkID0gdHJ1ZTsKKwltX2RWZXJpZmllZCA9IHRydWU7CisJbV9uZXV0cmFsTW9kZVZlcmlmaWVkID0gdHJ1ZTsKKwltX2VuY29kZXJDb2Rlc1BlclJldlZlcmlmaWVkID0gdHJ1ZTsKKwltX3BvdGVudGlvbWV0ZXJUdXJuc1ZlcmlmaWVkID0gdHJ1ZTsKKwltX2xpbWl0TW9kZVZlcmlmaWVkID0gdHJ1ZTsKKwltX2ZvcndhcmRMaW1pdFZlcmlmaWVkID0gdHJ1ZTsKKwltX3JldmVyc2VMaW1pdFZlcmlmaWVkID0gdHJ1ZTsKKwltX21heE91dHB1dFZvbHRhZ2VWZXJpZmllZCA9IHRydWU7CisJbV92b2x0YWdlUmFtcFJhdGVWZXJpZmllZCA9IHRydWU7CisJbV9mYXVsdFRpbWVWZXJpZmllZCA9IHRydWU7CisKKwltX3JlY2VpdmVkU3RhdHVzTWVzc2FnZTAgPSBmYWxzZTsKKwltX3JlY2VpdmVkU3RhdHVzTWVzc2FnZTEgPSBmYWxzZTsKKwltX3JlY2VpdmVkU3RhdHVzTWVzc2FnZTIgPSBmYWxzZTsKKworCWJvb2wgcmVjZWl2ZWRGaXJtd2FyZVZlcnNpb24gPSBmYWxzZTsKKwl1aW50OF90IGRhdGFCdWZmZXJbOF07CisJdWludDhfdCBkYXRhU2l6ZTsKKworCS8vIFJlcXVlc3QgZmlybXdhcmUgYW5kIGhhcmR3YXJlIHZlcnNpb24gb25seSBvbmNlCisJcmVxdWVzdE1lc3NhZ2UoQ0FOX0lTX0ZSQU1FX1JFTU9URSB8IENBTl9NU0dJRF9BUElfRklSTVZFUik7CisJcmVxdWVzdE1lc3NhZ2UoTE1fQVBJX0hXVkVSKTsKKworCS8vIFdhaXQgdW50aWwgd2UndmUgZ290dGVuIGFsbCBvZiB0aGUgc3RhdHVzIGRhdGEgYXQgbGVhc3Qgb25jZS4KKwlmb3IoaW50IGkgPSAwOyBpIDwga1JlY2VpdmVTdGF0dXNBdHRlbXB0czsgaSsrKQorCXsKKwkJV2FpdCgwLjAwMSk7CisKKwkJc2V0dXBQZXJpb2RpY1N0YXR1cygpOworCQl1cGRhdGVQZXJpb2RpY1N0YXR1cygpOworCisJCWlmKCFyZWNlaXZlZEZpcm13YXJlVmVyc2lvbiAmJgorCQkgICBnZXRNZXNzYWdlKENBTl9NU0dJRF9BUElfRklSTVZFUiwgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwgJmRhdGFTaXplKSkKKwkJeworCQkJbV9maXJtd2FyZVZlcnNpb24gPSB1bnBhY2tpbnQzMl90KGRhdGFCdWZmZXIpOworCQkJcmVjZWl2ZWRGaXJtd2FyZVZlcnNpb24gPSB0cnVlOworCQl9CisKKwkJaWYobV9yZWNlaXZlZFN0YXR1c01lc3NhZ2UwICYmCisJCSAgIG1fcmVjZWl2ZWRTdGF0dXNNZXNzYWdlMSAmJgorCQkgICBtX3JlY2VpdmVkU3RhdHVzTWVzc2FnZTIgJiYKKwkJICAgcmVjZWl2ZWRGaXJtd2FyZVZlcnNpb24pCisJCXsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYoIW1fcmVjZWl2ZWRTdGF0dXNNZXNzYWdlMCB8fAorCSAgICFtX3JlY2VpdmVkU3RhdHVzTWVzc2FnZTEgfHwKKwkgICAhbV9yZWNlaXZlZFN0YXR1c01lc3NhZ2UyIHx8CisJICAgIXJlY2VpdmVkRmlybXdhcmVWZXJzaW9uKQorCXsKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoSmFndWFyTWVzc2FnZU5vdEZvdW5kLCAiU3RhdHVzIGRhdGEgbm90IGZvdW5kIik7CisJfQorCisJaWYoZ2V0TWVzc2FnZShMTV9BUElfSFdWRVIsIENBTl9NU0dJRF9GVUxMX00sIGRhdGFCdWZmZXIsICZkYXRhU2l6ZSkpCisJCW1faGFyZHdhcmVWZXJzaW9uID0gZGF0YUJ1ZmZlclswXTsKKworCWlmIChtX2RldmljZU51bWJlciA8IDEgfHwgbV9kZXZpY2VOdW1iZXIgPiA2MykKKwl7CisJCWNoYXIgYnVmWzI1Nl07CisJCXNucHJpbnRmKGJ1ZiwgMjU2LCAiZGV2aWNlIG51bWJlciBcIiVkXCIgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDYzIiwgbV9kZXZpY2VOdW1iZXIpOworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChQYXJhbWV0ZXJPdXRPZlJhbmdlLCBidWYpOworCQlyZXR1cm47CisJfQorCisJaWYgKFN0YXR1c0lzRmF0YWwoKSkKKwkJcmV0dXJuOworCisJLy8gMzMzMCB3YXMgdGhlIGZpcnN0IHNoaXBwaW5nIFJESyBmaXJtd2FyZSB2ZXJzaW9uIGZvciB0aGUgSmFndWFyCisJaWYgKG1fZmlybXdhcmVWZXJzaW9uID49IDMzMzAgfHwgbV9maXJtd2FyZVZlcnNpb24gPCAxMDgpCisJeworCQljaGFyIGJ1ZlsyNTZdOworCQlpZiAobV9maXJtd2FyZVZlcnNpb24gPCAzMzMwKQorCQl7CisJCQlzbnByaW50ZihidWYsIDI1NiwgIkphZyAjJWQgZmlybXdhcmUgKCVkKSBpcyB0b28gb2xkIChtdXN0IGJlIGF0IGxlYXN0IHZlcnNpb24gMTA4IG9mIHRoZSBGSVJTVCBhcHByb3ZlZCBmaXJtd2FyZSkiLCBtX2RldmljZU51bWJlciwgbV9maXJtd2FyZVZlcnNpb24pOworCQl9CisJCWVsc2UKKwkJeworCQkJc25wcmludGYoYnVmLCAyNTYsICJKYWcgIyVkIGZpcm13YXJlICglZCkgaXMgbm90IEZJUlNUIGFwcHJvdmVkIChtdXN0IGJlIGF0IGxlYXN0IHZlcnNpb24gMTA4IG9mIHRoZSBGSVJTVCBhcHByb3ZlZCBmaXJtd2FyZSkiLCBtX2RldmljZU51bWJlciwgbV9maXJtd2FyZVZlcnNpb24pOworCQl9CisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KEphZ3VhclZlcnNpb25FcnJvciwgYnVmKTsKKwkJcmV0dXJuOworCX0KKworCXN3aXRjaCAobV9jb250cm9sTW9kZSkKKwl7CisJY2FzZSBrUGVyY2VudFZidXM6CisJY2FzZSBrVm9sdGFnZToKKwkJLy8gTm8gYWRkaXRpb25hbCBjb25maWd1cmF0aW9uIHJlcXVpcmVkLi4uIHN0YXJ0IGVuYWJsZWQuCisJCUVuYWJsZUNvbnRyb2woKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0NBTkphZ3VhciwgbV9kZXZpY2VOdW1iZXIsIG1fY29udHJvbE1vZGUpOworfQorCisvKioKKyAqIENvbnN0cnVjdG9yIGZvciB0aGUgQ0FOSmFndWFyIGRldmljZS48YnI+CisgKiBCeSBkZWZhdWx0IHRoZSBkZXZpY2UgaXMgY29uZmlndXJlZCBpbiBQZXJjZW50IG1vZGUuCisgKiBUaGUgY29udHJvbCBtb2RlIGNhbiBiZSBjaGFuZ2VkIGJ5IGNhbGxpbmcgb25lIG9mIHRoZSBjb250cm9sIG1vZGVzIGxpc3RlZCBiZWxvdy4KKyAqCisgKiBAcGFyYW0gZGV2aWNlTnVtYmVyIFRoZSBhZGRyZXNzIG9mIHRoZSBKYWd1YXIgb24gdGhlIENBTiBidXMuCisgKiBAc2VlIENBTkphZ3VhciNTZXRDdXJyZW50TW9kZShkb3VibGUsIGRvdWJsZSwgZG91YmxlKQorICogQHNlZSBDQU5KYWd1YXIjU2V0Q3VycmVudE1vZGUoUG90ZW50aW9tZXRlclRhZywgZG91YmxlLCBkb3VibGUsIGRvdWJsZSkKKyAqIEBzZWUgQ0FOSmFndWFyI1NldEN1cnJlbnRNb2RlKEVuY29kZXJUYWcsIGludCwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSkKKyAqIEBzZWUgQ0FOSmFndWFyI1NldEN1cnJlbnRNb2RlKFF1YWRFbmNvZGVyVGFnLCBpbnQsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUpCisgKiBAc2VlIENBTkphZ3VhciNTZXRQZXJjZW50TW9kZSgpCisgKiBAc2VlIENBTkphZ3VhciNTZXRQZXJjZW50TW9kZShQb3RlbnRpb21ldGVyVGFnKQorICogQHNlZSBDQU5KYWd1YXIjU2V0UGVyY2VudE1vZGUoRW5jb2RlclRhZywgaW50KQorICogQHNlZSBDQU5KYWd1YXIjU2V0UGVyY2VudE1vZGUoUXVhZEVuY29kZXJUYWcsIGludCkKKyAqIEBzZWUgQ0FOSmFndWFyI1NldFBvc2l0aW9uTW9kZShQb3RlbnRpb21ldGVyVGFnLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlKQorICogQHNlZSBDQU5KYWd1YXIjU2V0UG9zaXRpb25Nb2RlKFF1YWRFbmNvZGVyVGFnLCBpbnQsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUpCisgKiBAc2VlIENBTkphZ3VhciNTZXRTcGVlZE1vZGUoRW5jb2RlclRhZywgaW50LCBkb3VibGUsIGRvdWJsZSwgZG91YmxlKQorICogQHNlZSBDQU5KYWd1YXIjU2V0U3BlZWRNb2RlKFF1YWRFbmNvZGVyVGFnLCBpbnQsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUpCisgKiBAc2VlIENBTkphZ3VhciNTZXRWb2x0YWdlTW9kZSgpCisgKiBAc2VlIENBTkphZ3VhciNTZXRWb2x0YWdlTW9kZShQb3RlbnRpb21ldGVyVGFnKQorICogQHNlZSBDQU5KYWd1YXIjU2V0Vm9sdGFnZU1vZGUoRW5jb2RlclRhZywgaW50KQorICogQHNlZSBDQU5KYWd1YXIjU2V0Vm9sdGFnZU1vZGUoUXVhZEVuY29kZXJUYWcsIGludCkKKyAqLworQ0FOSmFndWFyOjpDQU5KYWd1YXIodWludDhfdCBkZXZpY2VOdW1iZXIpCisJOiBtX2RldmljZU51bWJlciAoZGV2aWNlTnVtYmVyKQorCSwgbV9tYXhPdXRwdXRWb2x0YWdlIChrQXBwcm94QnVzVm9sdGFnZSkKKwksIG1fc2FmZXR5SGVscGVyIChOVUxMKQoreworCWNoYXIgYnVmWzY0XTsKKwlzbnByaW50ZihidWYsIDY0LCAiQ0FOSmFndWFyIGRldmljZSBudW1iZXIgJWQiLCBtX2RldmljZU51bWJlcik7CisJUmVzb3VyY2U6OkNyZWF0ZVJlc291cmNlT2JqZWN0KCZhbGxvY2F0ZWQsIDYzKTsKKworCWlmIChhbGxvY2F0ZWQtPkFsbG9jYXRlKG1fZGV2aWNlTnVtYmVyLTEsIGJ1ZikgPT0gfjB1bCkKKwl7CisJCUNsb25lRXJyb3IoYWxsb2NhdGVkKTsKKwkJcmV0dXJuOworCX0KKworCVNldFBlcmNlbnRNb2RlKCk7CisJSW5pdENBTkphZ3VhcigpOworCUNvbmZpZ01heE91dHB1dFZvbHRhZ2Uoa0FwcHJveEJ1c1ZvbHRhZ2UpOworfQorCitDQU5KYWd1YXI6On5DQU5KYWd1YXIoKQoreworCWFsbG9jYXRlZC0+RnJlZShtX2RldmljZU51bWJlci0xKTsKKworCWludDMyX3Qgc3RhdHVzOworCisJLy8gRGlzYWJsZSBwZXJpb2RpYyBzZXRwb2ludHMKKwlpZihtX2NvbnRyb2xNb2RlID09IGtQZXJjZW50VmJ1cykKKwkJRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0NBTlNlc3Npb25NdXhfc2VuZE1lc3NhZ2UobV9kZXZpY2VOdW1iZXIgfCBMTV9BUElfVk9MVF9UX1NFVCwgTlVMTCwgMCwgQ0FOX1NFTkRfUEVSSU9EX1NUT1BfUkVQRUFUSU5HLCAmc3RhdHVzKTsKKwllbHNlIGlmKG1fY29udHJvbE1vZGUgPT0ga1NwZWVkKQorCQlGUkNfTmV0d29ya0NvbW11bmljYXRpb25fQ0FOU2Vzc2lvbk11eF9zZW5kTWVzc2FnZShtX2RldmljZU51bWJlciB8IExNX0FQSV9TUERfVF9TRVQsIE5VTEwsIDAsIENBTl9TRU5EX1BFUklPRF9TVE9QX1JFUEVBVElORywgJnN0YXR1cyk7CisJZWxzZSBpZihtX2NvbnRyb2xNb2RlID09IGtQb3NpdGlvbikKKwkJRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0NBTlNlc3Npb25NdXhfc2VuZE1lc3NhZ2UobV9kZXZpY2VOdW1iZXIgfCBMTV9BUElfUE9TX1RfU0VULCBOVUxMLCAwLCBDQU5fU0VORF9QRVJJT0RfU1RPUF9SRVBFQVRJTkcsICZzdGF0dXMpOworCWVsc2UgaWYobV9jb250cm9sTW9kZSA9PSBrQ3VycmVudCkKKwkJRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0NBTlNlc3Npb25NdXhfc2VuZE1lc3NhZ2UobV9kZXZpY2VOdW1iZXIgfCBMTV9BUElfSUNUUkxfVF9TRVQsIE5VTEwsIDAsIENBTl9TRU5EX1BFUklPRF9TVE9QX1JFUEVBVElORywgJnN0YXR1cyk7CisJZWxzZSBpZihtX2NvbnRyb2xNb2RlID09IGtWb2x0YWdlKQorCQlGUkNfTmV0d29ya0NvbW11bmljYXRpb25fQ0FOU2Vzc2lvbk11eF9zZW5kTWVzc2FnZShtX2RldmljZU51bWJlciB8IExNX0FQSV9WQ09NUF9UX1NFVCwgTlVMTCwgMCwgQ0FOX1NFTkRfUEVSSU9EX1NUT1BfUkVQRUFUSU5HLCAmc3RhdHVzKTsKKworCWRlbGV0ZSBtX3NhZmV0eUhlbHBlcjsKKwltX3NhZmV0eUhlbHBlciA9IE5VTEw7Cit9CisKKy8qKgorICogQHJldHVybiBUaGUgQ0FOIElEIHBhc3NlZCBpbiB0aGUgY29uc3RydWN0b3IKKyAqLwordWludDhfdCBDQU5KYWd1YXI6OmdldERldmljZU51bWJlcigpIGNvbnN0Cit7CisJcmV0dXJuIG1fZGV2aWNlTnVtYmVyOworfQorCisvKioKKyAqIFNldHMgdGhlIG91dHB1dCBzZXQtcG9pbnQgdmFsdWUuCisgKgorICogVGhlIHNjYWxlIGFuZCB0aGUgdW5pdHMgZGVwZW5kIG9uIHRoZSBtb2RlIHRoZSBKYWd1YXIgaXMgaW4uPGJyPgorICogSW4gcGVyY2VudFZidXMgTW9kZSwgdGhlIG91dHB1dFZhbHVlIGlzIGZyb20gLTEuMCB0byAxLjAgKHNhbWUgYXMgUFdNIEphZ3VhcikuPGJyPgorICogSW4gdm9sdGFnZSBNb2RlLCB0aGUgb3V0cHV0VmFsdWUgaXMgaW4gdm9sdHMuIDxicj4KKyAqIEluIGN1cnJlbnQgTW9kZSwgdGhlIG91dHB1dFZhbHVlIGlzIGluIGFtcHMuIDxicj4KKyAqIEluIHNwZWVkIE1vZGUsIHRoZSBvdXRwdXRWYWx1ZSBpcyBpbiByb3RhdGlvbnMvbWludXRlLjxicj4KKyAqIEluIHBvc2l0aW9uIE1vZGUsIHRoZSBvdXRwdXRWYWx1ZSBpcyBpbiByb3RhdGlvbnMuCisgKgorICogQHBhcmFtIG91dHB1dFZhbHVlIFRoZSBzZXQtcG9pbnQgdG8gc2VudCB0byB0aGUgbW90b3IgY29udHJvbGxlci4KKyAqIEBwYXJhbSBzeW5jR3JvdXAgVGhlIHVwZGF0ZSBncm91cCB0byBhZGQgdGhpcyBTZXQoKSB0bywgcGVuZGluZyBVcGRhdGVTeW5jR3JvdXAoKS4gIElmIDAsIHVwZGF0ZSBpbW1lZGlhdGVseS4KKyAqLwordm9pZCBDQU5KYWd1YXI6OlNldChmbG9hdCBvdXRwdXRWYWx1ZSwgdWludDhfdCBzeW5jR3JvdXApCit7CisJdWludDMyX3QgbWVzc2FnZUlEOworCXVpbnQ4X3QgZGF0YUJ1ZmZlcls4XTsKKwl1aW50OF90IGRhdGFTaXplOworCisJaWYobV9zYWZldHlIZWxwZXIgJiYgIW1fc2FmZXR5SGVscGVyLT5Jc0FsaXZlKCkgJiYgbV9jb250cm9sRW5hYmxlZCkKKwl7CisJCUVuYWJsZUNvbnRyb2woKTsKKwl9CisKKwlpZihtX2NvbnRyb2xFbmFibGVkKQorCXsKKwkJc3dpdGNoKG1fY29udHJvbE1vZGUpCisJCXsKKwkJY2FzZSBrUGVyY2VudFZidXM6CisJCQl7CisJCQkJbWVzc2FnZUlEID0gTE1fQVBJX1ZPTFRfVF9TRVQ7CisJCQkJaWYgKG91dHB1dFZhbHVlID4gMS4wKSBvdXRwdXRWYWx1ZSA9IDEuMDsKKwkJCQlpZiAob3V0cHV0VmFsdWUgPCAtMS4wKSBvdXRwdXRWYWx1ZSA9IC0xLjA7CisJCQkJZGF0YVNpemUgPSBwYWNrUGVyY2VudGFnZShkYXRhQnVmZmVyLCBvdXRwdXRWYWx1ZSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBrU3BlZWQ6CisJCQl7CisJCQkJbWVzc2FnZUlEID0gTE1fQVBJX1NQRF9UX1NFVDsKKwkJCQlkYXRhU2l6ZSA9IHBhY2tGWFAxNl8xNihkYXRhQnVmZmVyLCBvdXRwdXRWYWx1ZSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBrUG9zaXRpb246CisJCQl7CisJCQkJbWVzc2FnZUlEID0gTE1fQVBJX1BPU19UX1NFVDsKKwkJCQlkYXRhU2l6ZSA9IHBhY2tGWFAxNl8xNihkYXRhQnVmZmVyLCBvdXRwdXRWYWx1ZSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBrQ3VycmVudDoKKwkJCXsKKwkJCQltZXNzYWdlSUQgPSBMTV9BUElfSUNUUkxfVF9TRVQ7CisJCQkJZGF0YVNpemUgPSBwYWNrRlhQOF84KGRhdGFCdWZmZXIsIG91dHB1dFZhbHVlKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIGtWb2x0YWdlOgorCQkJeworCQkJCW1lc3NhZ2VJRCA9IExNX0FQSV9WQ09NUF9UX1NFVDsKKwkJCQlkYXRhU2l6ZSA9IHBhY2tGWFA4XzgoZGF0YUJ1ZmZlciwgb3V0cHV0VmFsdWUpOworCQkJfQorCQkJYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KEluY29tcGF0aWJsZU1vZGUsICJUaGUgSmFndWFyIG9ubHkgc3VwcG9ydHMgQ3VycmVudCwgVm9sdGFnZSwgUG9zaXRpb24sIFNwZWVkLCBhbmQgUGVyY2VudCAoVGhyb3R0bGUpIG1vZGVzLiIpOworICAgICAgcmV0dXJuOworCQl9CisJCWlmIChzeW5jR3JvdXAgIT0gMCkKKwkJeworCQkJZGF0YUJ1ZmZlcltkYXRhU2l6ZV0gPSBzeW5jR3JvdXA7CisJCQlkYXRhU2l6ZSsrOworCQl9CisKKwkJc2VuZE1lc3NhZ2UobWVzc2FnZUlELCBkYXRhQnVmZmVyLCBkYXRhU2l6ZSwga1NlbmRNZXNzYWdlUGVyaW9kKTsKKworCQlpZiAobV9zYWZldHlIZWxwZXIpIG1fc2FmZXR5SGVscGVyLT5GZWVkKCk7CisJfQorCisJbV92YWx1ZSA9IG91dHB1dFZhbHVlOworCisJdmVyaWZ5KCk7Cit9CisKKy8qKgorICogR2V0IHRoZSByZWNlbnRseSBzZXQgb3V0cHV0VmFsdWUgc2V0cG9pbnQuCisgKgorICogVGhlIHNjYWxlIGFuZCB0aGUgdW5pdHMgZGVwZW5kIG9uIHRoZSBtb2RlIHRoZSBKYWd1YXIgaXMgaW4uPGJyPgorICogSW4gcGVyY2VudFZidXMgTW9kZSwgdGhlIG91dHB1dFZhbHVlIGlzIGZyb20gLTEuMCB0byAxLjAgKHNhbWUgYXMgUFdNIEphZ3VhcikuPGJyPgorICogSW4gdm9sdGFnZSBNb2RlLCB0aGUgb3V0cHV0VmFsdWUgaXMgaW4gdm9sdHMuPGJyPgorICogSW4gY3VycmVudCBNb2RlLCB0aGUgb3V0cHV0VmFsdWUgaXMgaW4gYW1wcy48YnI+CisgKiBJbiBzcGVlZCBNb2RlLCB0aGUgb3V0cHV0VmFsdWUgaXMgaW4gcm90YXRpb25zL21pbnV0ZS48YnI+CisgKiBJbiBwb3NpdGlvbiBNb2RlLCB0aGUgb3V0cHV0VmFsdWUgaXMgaW4gcm90YXRpb25zLjxicj4KKyAqCisgKiBAcmV0dXJuIFRoZSBtb3N0IHJlY2VudGx5IHNldCBvdXRwdXRWYWx1ZSBzZXRwb2ludC4KKyAqLworZmxvYXQgQ0FOSmFndWFyOjpHZXQoKQoreworCXJldHVybiBtX3ZhbHVlOworfQorCisvKioKKyogQ29tbW9uIGludGVyZmFjZSBmb3IgZGlzYWJsaW5nIGEgbW90b3IuCisqCisqIEBkZXByZWNhdGVkIENhbGwge0BsaW5rICNEaXNhYmxlQ29udHJvbCgpfSBpbnN0ZWFkLgorKi8KK3ZvaWQgQ0FOSmFndWFyOjpEaXNhYmxlKCkKK3sKKwlEaXNhYmxlQ29udHJvbCgpOworfQorCisvKioKKyAqIFdyaXRlIG91dCB0aGUgUElEIHZhbHVlIGFzIHNlZW4gaW4gdGhlIFBJRE91dHB1dCBiYXNlIG9iamVjdC4KKyAqCisgKiBAZGVwcmVjYXRlZCBDYWxsIFNldCBpbnN0ZWFkLgorICoKKyAqIEBwYXJhbSBvdXRwdXQgV3JpdGUgb3V0IHRoZSBQZXJjZW50VmJ1cyB2YWx1ZSBhcyB3YXMgY29tcHV0ZWQgYnkgdGhlIFBJRENvbnRyb2xsZXIKKyAqLwordm9pZCBDQU5KYWd1YXI6OlBJRFdyaXRlKGZsb2F0IG91dHB1dCkKK3sKKwlpZiAobV9jb250cm9sTW9kZSA9PSBrUGVyY2VudFZidXMpCisJeworCQlTZXQob3V0cHV0KTsKKwl9CisJZWxzZQorCXsKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoSW5jb21wYXRpYmxlTW9kZSwgIlBJRCBvbmx5IHN1cHBvcnRlZCBpbiBQZXJjZW50VmJ1cyBtb2RlIik7CisJfQorfQorCit1aW50OF90IENBTkphZ3Vhcjo6cGFja1BlcmNlbnRhZ2UodWludDhfdCAqYnVmZmVyLCBkb3VibGUgdmFsdWUpCit7CisJaW50MTZfdCBpbnRWYWx1ZSA9IChpbnQxNl90KSh2YWx1ZSAqIDMyNzY3LjApOworICBpbnQxNl90IHN3YXBwZWQgPSBzd2FwMTYoaW50VmFsdWUpOworICBtZW1jcHkoYnVmZmVyLCAmc3dhcHBlZCwgc2l6ZW9mKGludDE2X3QpKTsKKwlyZXR1cm4gc2l6ZW9mKGludDE2X3QpOworfQorCit1aW50OF90IENBTkphZ3Vhcjo6cGFja0ZYUDhfOCh1aW50OF90ICpidWZmZXIsIGRvdWJsZSB2YWx1ZSkKK3sKKwlpbnQxNl90IGludFZhbHVlID0gKGludDE2X3QpKHZhbHVlICogMjU2LjApOworICBpbnQxNl90IHN3YXBwZWQgPSBzd2FwMTYoaW50VmFsdWUpOworICBtZW1jcHkoYnVmZmVyLCAmc3dhcHBlZCwgc2l6ZW9mKGludDE2X3QpKTsKKwlyZXR1cm4gc2l6ZW9mKGludDE2X3QpOworfQorCit1aW50OF90IENBTkphZ3Vhcjo6cGFja0ZYUDE2XzE2KHVpbnQ4X3QgKmJ1ZmZlciwgZG91YmxlIHZhbHVlKQoreworCWludDMyX3QgaW50VmFsdWUgPSAoaW50MzJfdCkodmFsdWUgKiA2NTUzNi4wKTsKKyAgaW50MzJfdCBzd2FwcGVkID0gc3dhcDMyKGludFZhbHVlKTsKKyAgbWVtY3B5KGJ1ZmZlciwgJnN3YXBwZWQsIHNpemVvZihpbnQzMl90KSk7CisJcmV0dXJuIHNpemVvZihpbnQzMl90KTsKK30KKwordWludDhfdCBDQU5KYWd1YXI6OnBhY2tpbnQxNl90KHVpbnQ4X3QgKmJ1ZmZlciwgaW50MTZfdCB2YWx1ZSkKK3sKKyAgaW50MTZfdCBzd2FwcGVkID0gc3dhcDE2KHZhbHVlKTsKKyAgbWVtY3B5KGJ1ZmZlciwgJnN3YXBwZWQsIHNpemVvZihpbnQxNl90KSk7CisJcmV0dXJuIHNpemVvZihpbnQxNl90KTsKK30KKwordWludDhfdCBDQU5KYWd1YXI6OnBhY2tpbnQzMl90KHVpbnQ4X3QgKmJ1ZmZlciwgaW50MzJfdCB2YWx1ZSkKK3sKKyAgaW50MzJfdCBzd2FwcGVkID0gc3dhcDMyKHZhbHVlKTsKKyAgbWVtY3B5KGJ1ZmZlciwgJnN3YXBwZWQsIHNpemVvZihpbnQzMl90KSk7CisJcmV0dXJuIHNpemVvZihpbnQzMl90KTsKK30KKworZG91YmxlIENBTkphZ3Vhcjo6dW5wYWNrUGVyY2VudGFnZSh1aW50OF90ICpidWZmZXIpCit7CisJaW50MTZfdCB2YWx1ZTsKKyAgbWVtY3B5KCZ2YWx1ZSwgYnVmZmVyLCBzaXplb2YodmFsdWUpKTsKKwl2YWx1ZSA9IHN3YXAxNih2YWx1ZSk7CisJcmV0dXJuIHZhbHVlIC8gMzI3NjcuMDsKK30KKworZG91YmxlIENBTkphZ3Vhcjo6dW5wYWNrRlhQOF84KHVpbnQ4X3QgKmJ1ZmZlcikKK3sKKwlpbnQxNl90IHZhbHVlOworICBtZW1jcHkoJnZhbHVlLCBidWZmZXIsIHNpemVvZih2YWx1ZSkpOworCXZhbHVlID0gc3dhcDE2KHZhbHVlKTsKKwlyZXR1cm4gdmFsdWUgLyAyNTYuMDsKK30KKworZG91YmxlIENBTkphZ3Vhcjo6dW5wYWNrRlhQMTZfMTYodWludDhfdCAqYnVmZmVyKQoreworCWludDMyX3QgdmFsdWU7CisgIG1lbWNweSgmdmFsdWUsIGJ1ZmZlciwgc2l6ZW9mKHZhbHVlKSk7CisJdmFsdWUgPSBzd2FwMzIodmFsdWUpOworCXJldHVybiB2YWx1ZSAvIDY1NTM2LjA7Cit9CisKK2ludDE2X3QgQ0FOSmFndWFyOjp1bnBhY2tpbnQxNl90KHVpbnQ4X3QgKmJ1ZmZlcikKK3sKKwlpbnQxNl90IHZhbHVlOworICBtZW1jcHkoJnZhbHVlLCBidWZmZXIsIHNpemVvZih2YWx1ZSkpOworCXJldHVybiBzd2FwMTYodmFsdWUpOworfQorCitpbnQzMl90IENBTkphZ3Vhcjo6dW5wYWNraW50MzJfdCh1aW50OF90ICpidWZmZXIpCit7CisJaW50MzJfdCB2YWx1ZTsKKyAgbWVtY3B5KCZ2YWx1ZSwgYnVmZmVyLCBzaXplb2YodmFsdWUpKTsKKwlyZXR1cm4gc3dhcDMyKHZhbHVlKTsKK30KKworLyoqCisgKiBTZW5kIGEgbWVzc2FnZSB0byB0aGUgSmFndWFyLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlSUQgVGhlIG1lc3NhZ2VJRCB0byBiZSB1c2VkIG9uIHRoZSBDQU4gYnVzIChkZXZpY2UgbnVtYmVyIGlzIGFkZGVkIGludGVybmFsbHkpCisgKiBAcGFyYW0gZGF0YSBUaGUgdXAgdG8gOCBieXRlcyBvZiBkYXRhIHRvIGJlIHNlbnQgd2l0aCB0aGUgbWVzc2FnZQorICogQHBhcmFtIGRhdGFTaXplIFNwZWNpZnkgaG93IG11Y2ggb2YgdGhlIGRhdGEgaW4gImRhdGEiIHRvIHNlbmQKKyAqIEBwYXJhbSBwZXJpb2RpYyBJZiBwb3NpdGl2ZSwgdGVsbCBOZXR3b3JrIENvbW11bmljYXRpb25zIHRvIHNlbmQgdGhlIG1lc3NhZ2UKKyAqIAlldmVyeSAicGVyaW9kIiBtaWxsaXNlY29uZHMuCisgKi8KK3ZvaWQgQ0FOSmFndWFyOjpzZW5kTWVzc2FnZSh1aW50MzJfdCBtZXNzYWdlSUQsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHVpbnQ4X3QgZGF0YVNpemUsIGludDMyX3QgcGVyaW9kKQoreworCWludDMyX3QgbG9jYWxTdGF0dXMgPSBzZW5kTWVzc2FnZUhlbHBlcihtZXNzYWdlSUQgfCBtX2RldmljZU51bWJlciwgZGF0YSwgZGF0YVNpemUsIHBlcmlvZCk7CisKKwlpZihsb2NhbFN0YXR1cyA8IDApCisJeworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChsb2NhbFN0YXR1cywgInNlbmRNZXNzYWdlIik7CisJfQorfQorCisvKioKKyAqIFJlcXVlc3QgYSBtZXNzYWdlIGZyb20gdGhlIEphZ3VhciwgYnV0IGRvbid0IHdhaXQgZm9yIGl0IHRvIGFycml2ZS4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZUlEIFRoZSBtZXNzYWdlIHRvIHJlcXVlc3QKKyAqIEBwYXJhbSBwZXJpb2RpYyBJZiBwb3NpdGl2ZSwgdGVsbCBOZXR3b3JrIENvbW11bmljYXRpb25zIHRvIHNlbmQgdGhlIG1lc3NhZ2UKKyAqIAlldmVyeSAicGVyaW9kIiBtaWxsaXNlY29uZHMuCisgKi8KK3ZvaWQgQ0FOSmFndWFyOjpyZXF1ZXN0TWVzc2FnZSh1aW50MzJfdCBtZXNzYWdlSUQsIGludDMyX3QgcGVyaW9kKQoreworCXNlbmRNZXNzYWdlSGVscGVyKG1lc3NhZ2VJRCB8IG1fZGV2aWNlTnVtYmVyLCBOVUxMLCAwLCBwZXJpb2QpOworfQorCisvKioKKyAqIEdldCBhIHByZXZpb3VzbHkgcmVxdWVzdGVkIG1lc3NhZ2UuCisgKgorICogSmFndWFyIGFsd2F5cyBnZW5lcmF0ZXMgYSBtZXNzYWdlIHdpdGggdGhlIHNhbWUgbWVzc2FnZSBJRCB3aGVuIHJlcGx5aW5nLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlSUQgVGhlIG1lc3NhZ2VJRCB0byByZWFkIGZyb20gdGhlIENBTiBidXMgKGRldmljZSBudW1iZXIgaXMgYWRkZWQgaW50ZXJuYWxseSkKKyAqIEBwYXJhbSBkYXRhIFRoZSB1cCB0byA4IGJ5dGVzIG9mIGRhdGEgdGhhdCB3YXMgcmVjZWl2ZWQgd2l0aCB0aGUgbWVzc2FnZQorICogQHBhcmFtIGRhdGFTaXplIEluZGljYXRlcyBob3cgbXVjaCBkYXRhIHdhcyByZWNlaXZlZAorICoKKyAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWVzc2FnZSB3YXMgZm91bmQuICBPdGhlcndpc2UsIG5vIG5ldyBtZXNzYWdlIGlzIGF2YWlsYWJsZS4KKyAqLworYm9vbCBDQU5KYWd1YXI6OmdldE1lc3NhZ2UodWludDMyX3QgbWVzc2FnZUlELCB1aW50MzJfdCBtZXNzYWdlTWFzaywgdWludDhfdCAqZGF0YSwgdWludDhfdCAqZGF0YVNpemUpCit7CisJdWludDMyX3QgdGFyZ2V0ZWRNZXNzYWdlSUQgPSBtZXNzYWdlSUQgfCBtX2RldmljZU51bWJlcjsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJdWludDMyX3QgdGltZVN0YW1wOworCisJLy8gQ2FsbGVyIG1heSBoYXZlIHNldCBiaXQzMSBmb3IgcmVtb3RlIGZyYW1lIHRyYW5zbWlzc2lvbiBzbyBjbGVhciBpbnZhbGlkIGJpdHNbMzEtMjldCisJdGFyZ2V0ZWRNZXNzYWdlSUQgJj0gQ0FOX01TR0lEX0ZVTExfTTsKKworCS8vIEdldCB0aGUgZGF0YS4KKwlGUkNfTmV0d29ya0NvbW11bmljYXRpb25fQ0FOU2Vzc2lvbk11eF9yZWNlaXZlTWVzc2FnZSgmdGFyZ2V0ZWRNZXNzYWdlSUQsIG1lc3NhZ2VNYXNrLCBkYXRhLCBkYXRhU2l6ZSwgJnRpbWVTdGFtcCwgJnN0YXR1cyk7CisKKwkvLyBEbyB3ZSBhbHJlYWR5IGhhdmUgdGhlIG1vc3QgcmVjZW50IHZhbHVlPworCWlmKHN0YXR1cyA9PSBFUlJfQ0FOU2Vzc2lvbk11eF9NZXNzYWdlTm90Rm91bmQpCisJCXJldHVybiBmYWxzZTsKKwllbHNlCisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgInJlY2VpdmVNZXNzYWdlIik7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBFbmFibGVzIHBlcmlvZGljIHN0YXR1cyB1cGRhdGVzIGZyb20gdGhlIEphZ3Vhci4KKyAqLwordm9pZCBDQU5KYWd1YXI6OnNldHVwUGVyaW9kaWNTdGF0dXMoKSB7CisJdWludDhfdCBkYXRhWzhdOworCXVpbnQ4X3QgZGF0YVNpemU7CisKKwkvLyBNZXNzYWdlIDAgcmV0dXJucyBidXMgdm9sdGFnZSwgb3V0cHV0IHZvbHRhZ2UsIG91dHB1dCBjdXJyZW50LCBhbmQKKwkvLyB0ZW1wZXJhdHVyZS4KKwlzdGF0aWMgY29uc3QgdWludDhfdCBrTWVzc2FnZTBEYXRhW10gPSB7CisJCUxNX1BTVEFUX1ZPTFRCVVNfQjAsIExNX1BTVEFUX1ZPTFRCVVNfQjEsCisJCUxNX1BTVEFUX1ZPTFRPVVRfQjAsIExNX1BTVEFUX1ZPTFRPVVRfQjEsCisJCUxNX1BTVEFUX0NVUlJFTlRfQjAsIExNX1BTVEFUX0NVUlJFTlRfQjEsCisJCUxNX1BTVEFUX1RFTVBfQjAsIExNX1BTVEFUX1RFTVBfQjEKKwl9OworCisJLy8gTWVzc2FnZSAxIHJldHVybnMgcG9zaXRpb24gYW5kIHNwZWVkCisJc3RhdGljIGNvbnN0IHVpbnQ4X3Qga01lc3NhZ2UxRGF0YVtdID0geworCQlMTV9QU1RBVF9QT1NfQjAsIExNX1BTVEFUX1BPU19CMSwgTE1fUFNUQVRfUE9TX0IyLCBMTV9QU1RBVF9QT1NfQjMsCisJCUxNX1BTVEFUX1NQRF9CMCwgTE1fUFNUQVRfU1BEX0IxLCBMTV9QU1RBVF9TUERfQjIsIExNX1BTVEFUX1NQRF9CMworCX07CisKKwkvLyBNZXNzYWdlIDIgcmV0dXJucyBsaW1pdHMgYW5kIGZhdWx0cworCXN0YXRpYyBjb25zdCB1aW50OF90IGtNZXNzYWdlMkRhdGFbXSA9IHsKKwkJTE1fUFNUQVRfTElNSVRfQ0xSLAorCQlMTV9QU1RBVF9GQVVMVCwKKwkJTE1fUFNUQVRfRU5ECisJfTsKKworCWRhdGFTaXplID0gcGFja2ludDE2X3QoZGF0YSwga1NlbmRNZXNzYWdlUGVyaW9kKTsKKwlzZW5kTWVzc2FnZShMTV9BUElfUFNUQVRfUEVSX0VOX1MwLCBkYXRhLCBkYXRhU2l6ZSk7CisJc2VuZE1lc3NhZ2UoTE1fQVBJX1BTVEFUX1BFUl9FTl9TMSwgZGF0YSwgZGF0YVNpemUpOworCXNlbmRNZXNzYWdlKExNX0FQSV9QU1RBVF9QRVJfRU5fUzIsIGRhdGEsIGRhdGFTaXplKTsKKworCWRhdGFTaXplID0gODsKKwlzZW5kTWVzc2FnZShMTV9BUElfUFNUQVRfQ0ZHX1MwLCBrTWVzc2FnZTBEYXRhLCBkYXRhU2l6ZSk7CisJc2VuZE1lc3NhZ2UoTE1fQVBJX1BTVEFUX0NGR19TMSwga01lc3NhZ2UxRGF0YSwgZGF0YVNpemUpOworCXNlbmRNZXNzYWdlKExNX0FQSV9QU1RBVF9DRkdfUzIsIGtNZXNzYWdlMkRhdGEsIGRhdGFTaXplKTsKK30KKworLyoqCisgKiBDaGVjayBmb3IgbmV3IHBlcmlvZGljIHN0YXR1cyB1cGRhdGVzIGFuZCB1bnBhY2sgdGhlbSBpbnRvIGxvY2FsIHZhcmlhYmxlcworICovCit2b2lkIENBTkphZ3Vhcjo6dXBkYXRlUGVyaW9kaWNTdGF0dXMoKSB7CisJdWludDhfdCBkYXRhWzhdOworCXVpbnQ4X3QgZGF0YVNpemU7CisKKwkvLyBDaGVjayBpZiBhIG5ldyBidXMgdm9sdGFnZS9vdXRwdXQgdm9sdGFnZS9jdXJyZW50L3RlbXBlcmF0dXJlIG1lc3NhZ2UKKwkvLyBoYXMgYXJyaXZlZCBhbmQgdW5wYWNrIHRoZSB2YWx1ZXMgaW50byB0aGUgY2FjaGVkIG1lbWJlciB2YXJpYWJsZXMKKwlpZihnZXRNZXNzYWdlKExNX0FQSV9QU1RBVF9EQVRBX1MwLCBDQU5fTVNHSURfRlVMTF9NLCBkYXRhLCAmZGF0YVNpemUpKSB7CisJCW1fYnVzVm9sdGFnZSAgICA9IHVucGFja0ZYUDhfOChkYXRhKTsKKwkJbV9vdXRwdXRWb2x0YWdlID0gdW5wYWNrUGVyY2VudGFnZShkYXRhICsgMikgKiBtX2J1c1ZvbHRhZ2U7CisJCW1fb3V0cHV0Q3VycmVudCA9IHVucGFja0ZYUDhfOChkYXRhICsgNCk7CisJCW1fdGVtcGVyYXR1cmUgICA9IHVucGFja0ZYUDhfOChkYXRhICsgNik7CisKKwkJbV9yZWNlaXZlZFN0YXR1c01lc3NhZ2UwID0gdHJ1ZTsKKwl9CisKKwkvLyBDaGVjayBpZiBhIG5ldyBwb3NpdGlvbi9zcGVlZCBtZXNzYWdlIGhhcyBhcnJpdmVkIGFuZCBkbyB0aGUgc2FtZQorCWlmKGdldE1lc3NhZ2UoTE1fQVBJX1BTVEFUX0RBVEFfUzEsIENBTl9NU0dJRF9GVUxMX00sIGRhdGEsICZkYXRhU2l6ZSkpIHsKKwkJbV9wb3NpdGlvbiA9IHVucGFja0ZYUDE2XzE2KGRhdGEpOworCQltX3NwZWVkICAgID0gdW5wYWNrRlhQMTZfMTYoZGF0YSArIDQpOworCisJCW1fcmVjZWl2ZWRTdGF0dXNNZXNzYWdlMSA9IHRydWU7CisJfQorCisJLy8gQ2hlY2sgaWYgYSBuZXcgbGltaXRzL2ZhdWx0cyBtZXNzYWdlIGhhcyBhcnJpdmVkIGFuZCBkbyB0aGUgc2FtZQorCWlmKGdldE1lc3NhZ2UoTE1fQVBJX1BTVEFUX0RBVEFfUzIsIENBTl9NU0dJRF9GVUxMX00sIGRhdGEsICZkYXRhU2l6ZSkpIHsKKwkJbV9saW1pdHMgPSBkYXRhWzBdOworCQltX2ZhdWx0cyA9IGRhdGFbMV07CisKKwkJbV9yZWNlaXZlZFN0YXR1c01lc3NhZ2UyID0gdHJ1ZTsKKwl9Cit9CisKKy8qKgorICogQ2hlY2sgYWxsIHVudmVyaWZpZWQgcGFyYW1zIGFuZCBtYWtlIHN1cmUgdGhleSdyZSBlcXVhbCB0byB0aGVpciBsb2NhbAorICogY2FjaGVkIHZlcnNpb25zLiBJZiBhIHZhbHVlIGlzbid0IGF2YWlsYWJsZSwgaXQgZ2V0cyByZXF1ZXN0ZWQuICBJZiBhIHZhbHVlCisgKiBkb2Vzbid0IG1hdGNoIHVwLCBpdCBnZXRzIHNldCBhZ2Fpbi4KKyAqLwordm9pZCBDQU5KYWd1YXI6OnZlcmlmeSgpCit7CisJdWludDhfdCBkYXRhQnVmZmVyWzhdOworCXVpbnQ4X3QgZGF0YVNpemU7CisKKwkvLyBJZiB0aGUgSmFndWFyIGxvc3QgcG93ZXIsIGV2ZXJ5dGhpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQgdW52ZXJpZmllZC4KKwlpZihnZXRNZXNzYWdlKExNX0FQSV9TVEFUVVNfUE9XRVIsIENBTl9NU0dJRF9GVUxMX00sIGRhdGFCdWZmZXIsICZkYXRhU2l6ZSkpCisJeworCQlib29sIHBvd2VyQ3ljbGVkID0gKGJvb2wpZGF0YUJ1ZmZlclswXTsKKworCQlpZihwb3dlckN5Y2xlZCkKKwkJeworCQkJLy8gQ2xlYXIgdGhlIHBvd2VyIGN5Y2xlZCBiaXQKKwkJCWRhdGFCdWZmZXJbMF0gPSAxOworCQkJc2VuZE1lc3NhZ2UoTE1fQVBJX1NUQVRVU19QT1dFUiwgZGF0YUJ1ZmZlciwgc2l6ZW9mKHVpbnQ4X3QpKTsKKworCQkJLy8gTWFyayBldmVyeXRoaW5nIGFzIHVudmVyaWZpZWQKKwkJCW1fY29udHJvbE1vZGVWZXJpZmllZCA9IGZhbHNlOworCQkJbV9zcGVlZFJlZlZlcmlmaWVkID0gZmFsc2U7CisJCQltX3Bvc1JlZlZlcmlmaWVkID0gZmFsc2U7CisJCQltX25ldXRyYWxNb2RlVmVyaWZpZWQgPSBmYWxzZTsKKwkJCW1fZW5jb2RlckNvZGVzUGVyUmV2VmVyaWZpZWQgPSBmYWxzZTsKKwkJCW1fcG90ZW50aW9tZXRlclR1cm5zVmVyaWZpZWQgPSBmYWxzZTsKKwkJCW1fZm9yd2FyZExpbWl0VmVyaWZpZWQgPSBmYWxzZTsKKwkJCW1fcmV2ZXJzZUxpbWl0VmVyaWZpZWQgPSBmYWxzZTsKKwkJCW1fbGltaXRNb2RlVmVyaWZpZWQgPSBmYWxzZTsKKwkJCW1fbWF4T3V0cHV0Vm9sdGFnZVZlcmlmaWVkID0gZmFsc2U7CisJCQltX2ZhdWx0VGltZVZlcmlmaWVkID0gZmFsc2U7CisKKwkJCWlmKG1fY29udHJvbE1vZGUgPT0ga1BlcmNlbnRWYnVzIHx8IG1fY29udHJvbE1vZGUgPT0ga1ZvbHRhZ2UpCisJCQl7CisJCQkJbV92b2x0YWdlUmFtcFJhdGVWZXJpZmllZCA9IGZhbHNlOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW1fcFZlcmlmaWVkID0gZmFsc2U7CisJCQkJbV9pVmVyaWZpZWQgPSBmYWxzZTsKKwkJCQltX2RWZXJpZmllZCA9IGZhbHNlOworCQkJfQorCisJCQkvLyBWZXJpZnkgcGVyaW9kaWMgc3RhdHVzIG1lc3NhZ2VzIGFnYWluCisJCQltX3JlY2VpdmVkU3RhdHVzTWVzc2FnZTAgPSBmYWxzZTsKKwkJCW1fcmVjZWl2ZWRTdGF0dXNNZXNzYWdlMSA9IGZhbHNlOworCQkJbV9yZWNlaXZlZFN0YXR1c01lc3NhZ2UyID0gZmFsc2U7CisKKwkJCS8vIFJlbW92ZSBhbnkgb2xkIHZhbHVlcyBmcm9tIG5ldGNvbW1zLiBPdGhlcndpc2UsIHBhcmFtZXRlcnMgYXJlCisJCQkvLyBpbmNvcnJlY3RseSBtYXJrZWQgYXMgdmVyaWZpZWQgYmFzZWQgb24gc3RhbGUgbWVzc2FnZXMuCisJCQlnZXRNZXNzYWdlKExNX0FQSV9TUERfUkVGLCBDQU5fTVNHSURfRlVMTF9NLCBkYXRhQnVmZmVyLCAmZGF0YVNpemUpOworCQkJZ2V0TWVzc2FnZShMTV9BUElfUE9TX1JFRiwgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwgJmRhdGFTaXplKTsKKwkJCWdldE1lc3NhZ2UoTE1fQVBJX1NQRF9QQywgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwgJmRhdGFTaXplKTsKKwkJCWdldE1lc3NhZ2UoTE1fQVBJX1BPU19QQywgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwgJmRhdGFTaXplKTsKKwkJCWdldE1lc3NhZ2UoTE1fQVBJX0lDVFJMX1BDLCBDQU5fTVNHSURfRlVMTF9NLCBkYXRhQnVmZmVyLCAmZGF0YVNpemUpOworCQkJZ2V0TWVzc2FnZShMTV9BUElfU1BEX0lDLCBDQU5fTVNHSURfRlVMTF9NLCBkYXRhQnVmZmVyLCAmZGF0YVNpemUpOworCQkJZ2V0TWVzc2FnZShMTV9BUElfUE9TX0lDLCBDQU5fTVNHSURfRlVMTF9NLCBkYXRhQnVmZmVyLCAmZGF0YVNpemUpOworCQkJZ2V0TWVzc2FnZShMTV9BUElfSUNUUkxfSUMsIENBTl9NU0dJRF9GVUxMX00sIGRhdGFCdWZmZXIsICZkYXRhU2l6ZSk7CisJCQlnZXRNZXNzYWdlKExNX0FQSV9TUERfREMsIENBTl9NU0dJRF9GVUxMX00sIGRhdGFCdWZmZXIsICZkYXRhU2l6ZSk7CisJCQlnZXRNZXNzYWdlKExNX0FQSV9QT1NfREMsIENBTl9NU0dJRF9GVUxMX00sIGRhdGFCdWZmZXIsICZkYXRhU2l6ZSk7CisJCQlnZXRNZXNzYWdlKExNX0FQSV9JQ1RSTF9EQywgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwgJmRhdGFTaXplKTsKKwkJCWdldE1lc3NhZ2UoTE1fQVBJX0NGR19CUkFLRV9DT0FTVCwgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwgJmRhdGFTaXplKTsKKwkJCWdldE1lc3NhZ2UoTE1fQVBJX0NGR19FTkNfTElORVMsIENBTl9NU0dJRF9GVUxMX00sIGRhdGFCdWZmZXIsICZkYXRhU2l6ZSk7CisJCQlnZXRNZXNzYWdlKExNX0FQSV9DRkdfUE9UX1RVUk5TLCBDQU5fTVNHSURfRlVMTF9NLCBkYXRhQnVmZmVyLCAmZGF0YVNpemUpOworCQkJZ2V0TWVzc2FnZShMTV9BUElfQ0ZHX0xJTUlUX01PREUsIENBTl9NU0dJRF9GVUxMX00sIGRhdGFCdWZmZXIsICZkYXRhU2l6ZSk7CisJCQlnZXRNZXNzYWdlKExNX0FQSV9DRkdfTElNSVRfRldELCBDQU5fTVNHSURfRlVMTF9NLCBkYXRhQnVmZmVyLCAmZGF0YVNpemUpOworCQkJZ2V0TWVzc2FnZShMTV9BUElfQ0ZHX0xJTUlUX1JFViwgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwgJmRhdGFTaXplKTsKKwkJCWdldE1lc3NhZ2UoTE1fQVBJX0NGR19NQVhfVk9VVCwgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwgJmRhdGFTaXplKTsKKwkJCWdldE1lc3NhZ2UoTE1fQVBJX1ZPTFRfU0VUX1JBTVAsIENBTl9NU0dJRF9GVUxMX00sIGRhdGFCdWZmZXIsICZkYXRhU2l6ZSk7CisJCQlnZXRNZXNzYWdlKExNX0FQSV9WQ09NUF9DT01QX1JBTVAsIENBTl9NU0dJRF9GVUxMX00sIGRhdGFCdWZmZXIsICZkYXRhU2l6ZSk7CisJCQlnZXRNZXNzYWdlKExNX0FQSV9DRkdfRkFVTFRfVElNRSwgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwgJmRhdGFTaXplKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlyZXF1ZXN0TWVzc2FnZShMTV9BUElfU1RBVFVTX1BPV0VSKTsKKwl9CisKKwkvLyBWZXJpZnkgdGhhdCBhbnkgcmVjZW50bHkgc2V0IHBhcmFtZXRlcnMgYXJlIGNvcnJlY3QKKwlpZighbV9jb250cm9sTW9kZVZlcmlmaWVkICYmIG1fY29udHJvbEVuYWJsZWQpCisJeworCQlpZihnZXRNZXNzYWdlKExNX0FQSV9TVEFUVVNfQ01PREUsIENBTl9NU0dJRF9GVUxMX00sIGRhdGFCdWZmZXIsICZkYXRhU2l6ZSkpCisJCXsKKwkJCUNvbnRyb2xNb2RlIG1vZGUgPSAoQ29udHJvbE1vZGUpZGF0YUJ1ZmZlclswXTsKKworCQkJaWYobV9jb250cm9sTW9kZSA9PSBtb2RlKQorCQkJCW1fY29udHJvbE1vZGVWZXJpZmllZCA9IHRydWU7CisJCQllbHNlCisJCQkJLy8gRW5hYmxlIGNvbnRyb2wgYWdhaW4gdG8gcmVzZW5kIHRoZSBjb250cm9sIG1vZGUKKwkJCQlFbmFibGVDb250cm9sKCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBWZXJpZmljYXRpb24gaXMgbmVlZGVkIGJ1dCBub3QgYXZhaWxhYmxlIC0gcmVxdWVzdCBpdCBhZ2Fpbi4KKwkJCXJlcXVlc3RNZXNzYWdlKExNX0FQSV9TVEFUVVNfQ01PREUpOworCQl9CisJfQorCisJaWYoIW1fc3BlZWRSZWZWZXJpZmllZCkKKwl7CisJCWlmKGdldE1lc3NhZ2UoTE1fQVBJX1NQRF9SRUYsIENBTl9NU0dJRF9GVUxMX00sIGRhdGFCdWZmZXIsICZkYXRhU2l6ZSkpCisJCXsKKwkJCXVpbnQ4X3Qgc3BlZWRSZWYgPSBkYXRhQnVmZmVyWzBdOworCisJCQlpZihtX3NwZWVkUmVmZXJlbmNlID09IHNwZWVkUmVmKQorCQkJCW1fc3BlZWRSZWZWZXJpZmllZCA9IHRydWU7CisJCQllbHNlCisJCQkJLy8gSXQncyB3cm9uZyAtIHNldCBpdCBhZ2FpbgorCQkJCVNldFNwZWVkUmVmZXJlbmNlKG1fc3BlZWRSZWZlcmVuY2UpOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gVmVyaWZpY2F0aW9uIGlzIG5lZWRlZCBidXQgbm90IGF2YWlsYWJsZSAtIHJlcXVlc3QgaXQgYWdhaW4uCisJCQlyZXF1ZXN0TWVzc2FnZShMTV9BUElfU1BEX1JFRik7CisJCX0KKwl9CisKKwlpZighbV9wb3NSZWZWZXJpZmllZCkKKwl7CisJCWlmKGdldE1lc3NhZ2UoTE1fQVBJX1BPU19SRUYsIENBTl9NU0dJRF9GVUxMX00sIGRhdGFCdWZmZXIsICZkYXRhU2l6ZSkpCisJCXsKKwkJCXVpbnQ4X3QgcG9zUmVmID0gZGF0YUJ1ZmZlclswXTsKKworCQkJaWYobV9wb3NpdGlvblJlZmVyZW5jZSA9PSBwb3NSZWYpCisJCQkJbV9wb3NSZWZWZXJpZmllZCA9IHRydWU7CisJCQllbHNlCisJCQkJLy8gSXQncyB3cm9uZyAtIHNldCBpdCBhZ2FpbgorCQkJCVNldFBvc2l0aW9uUmVmZXJlbmNlKG1fcG9zaXRpb25SZWZlcmVuY2UpOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gVmVyaWZpY2F0aW9uIGlzIG5lZWRlZCBidXQgbm90IGF2YWlsYWJsZSAtIHJlcXVlc3QgaXQgYWdhaW4uCisJCQlyZXF1ZXN0TWVzc2FnZShMTV9BUElfUE9TX1JFRik7CisJCX0KKwl9CisKKwlpZighbV9wVmVyaWZpZWQpCisJeworCQl1aW50MzJfdCBtZXNzYWdlOworCisJCWlmKG1fY29udHJvbE1vZGUgPT0ga1NwZWVkKQorCQkJbWVzc2FnZSA9IExNX0FQSV9TUERfUEM7CisJCWVsc2UgaWYobV9jb250cm9sTW9kZSA9PSBrUG9zaXRpb24pCisJCQltZXNzYWdlID0gTE1fQVBJX1BPU19QQzsKKwkJZWxzZSBpZihtX2NvbnRyb2xNb2RlID09IGtDdXJyZW50KQorCQkJbWVzc2FnZSA9IExNX0FQSV9JQ1RSTF9QQzsKKyAgICBlbHNlIHsKKwkJICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChJbmNvbXBhdGlibGVNb2RlLCAiUElEIGNvbnN0YW50cyBvbmx5IGFwcGx5IGluIFNwZWVkLCBQb3NpdGlvbiwgYW5kIEN1cnJlbnQgbW9kZSIpOworICAgICAgcmV0dXJuOworICAgIH0KKworCQlpZihnZXRNZXNzYWdlKG1lc3NhZ2UsIENBTl9NU0dJRF9GVUxMX00sIGRhdGFCdWZmZXIsICZkYXRhU2l6ZSkpCisJCXsKKwkJCWRvdWJsZSBwID0gdW5wYWNrRlhQMTZfMTYoZGF0YUJ1ZmZlcik7CisKKwkJCWlmKEZYUDE2X0VRKG1fcCwgcCkpCisJCQkJbV9wVmVyaWZpZWQgPSB0cnVlOworCQkJZWxzZQorCQkJCS8vIEl0J3Mgd3JvbmcgLSBzZXQgaXQgYWdhaW4KKwkJCQlTZXRQKG1fcCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBWZXJpZmljYXRpb24gaXMgbmVlZGVkIGJ1dCBub3QgYXZhaWxhYmxlIC0gcmVxdWVzdCBpdCBhZ2Fpbi4KKwkJCXJlcXVlc3RNZXNzYWdlKG1lc3NhZ2UpOworCQl9CisJfQorCisJaWYoIW1faVZlcmlmaWVkKQorCXsKKwkJdWludDMyX3QgbWVzc2FnZTsKKworCQlpZihtX2NvbnRyb2xNb2RlID09IGtTcGVlZCkKKwkJCW1lc3NhZ2UgPSBMTV9BUElfU1BEX0lDOworCQllbHNlIGlmKG1fY29udHJvbE1vZGUgPT0ga1Bvc2l0aW9uKQorCQkJbWVzc2FnZSA9IExNX0FQSV9QT1NfSUM7CisJCWVsc2UgaWYobV9jb250cm9sTW9kZSA9PSBrQ3VycmVudCkKKwkJCW1lc3NhZ2UgPSBMTV9BUElfSUNUUkxfSUM7CisgICAgZWxzZSB7CisJCSAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoSW5jb21wYXRpYmxlTW9kZSwgIlBJRCBjb25zdGFudHMgb25seSBhcHBseSBpbiBTcGVlZCwgUG9zaXRpb24sIGFuZCBDdXJyZW50IG1vZGUiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKwkJaWYoZ2V0TWVzc2FnZShtZXNzYWdlLCBDQU5fTVNHSURfRlVMTF9NLCBkYXRhQnVmZmVyLCAmZGF0YVNpemUpKQorCQl7CisJCQlkb3VibGUgaSA9IHVucGFja0ZYUDE2XzE2KGRhdGFCdWZmZXIpOworCisJCQlpZihGWFAxNl9FUShtX2ksIGkpKQorCQkJCW1faVZlcmlmaWVkID0gdHJ1ZTsKKwkJCWVsc2UKKwkJCQkvLyBJdCdzIHdyb25nIC0gc2V0IGl0IGFnYWluCisJCQkJU2V0SShtX2kpOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gVmVyaWZpY2F0aW9uIGlzIG5lZWRlZCBidXQgbm90IGF2YWlsYWJsZSAtIHJlcXVlc3QgaXQgYWdhaW4uCisJCQlyZXF1ZXN0TWVzc2FnZShtZXNzYWdlKTsKKwkJfQorCX0KKworCWlmKCFtX2RWZXJpZmllZCkKKwl7CisJCXVpbnQzMl90IG1lc3NhZ2U7CisKKwkJaWYobV9jb250cm9sTW9kZSA9PSBrU3BlZWQpCisJCQltZXNzYWdlID0gTE1fQVBJX1NQRF9EQzsKKwkJZWxzZSBpZihtX2NvbnRyb2xNb2RlID09IGtQb3NpdGlvbikKKwkJCW1lc3NhZ2UgPSBMTV9BUElfUE9TX0RDOworCQllbHNlIGlmKG1fY29udHJvbE1vZGUgPT0ga0N1cnJlbnQpCisJCQltZXNzYWdlID0gTE1fQVBJX0lDVFJMX0RDOworICAgIGVsc2UgeworCQkgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KEluY29tcGF0aWJsZU1vZGUsICJQSUQgY29uc3RhbnRzIG9ubHkgYXBwbHkgaW4gU3BlZWQsIFBvc2l0aW9uLCBhbmQgQ3VycmVudCBtb2RlIik7CisgICAgICByZXR1cm47CisgICAgfQorCisJCWlmKGdldE1lc3NhZ2UobWVzc2FnZSwgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwgJmRhdGFTaXplKSkKKwkJeworCQkJZG91YmxlIGQgPSB1bnBhY2tGWFAxNl8xNihkYXRhQnVmZmVyKTsKKworCQkJaWYoRlhQMTZfRVEobV9kLCBkKSkKKwkJCQltX2RWZXJpZmllZCA9IHRydWU7CisJCQllbHNlCisJCQkJLy8gSXQncyB3cm9uZyAtIHNldCBpdCBhZ2FpbgorCQkJCVNldEQobV9kKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIFZlcmlmaWNhdGlvbiBpcyBuZWVkZWQgYnV0IG5vdCBhdmFpbGFibGUgLSByZXF1ZXN0IGl0IGFnYWluLgorCQkJcmVxdWVzdE1lc3NhZ2UobWVzc2FnZSk7CisJCX0KKwl9CisKKwlpZighbV9uZXV0cmFsTW9kZVZlcmlmaWVkKQorCXsKKwkJaWYoZ2V0TWVzc2FnZShMTV9BUElfQ0ZHX0JSQUtFX0NPQVNULCBDQU5fTVNHSURfRlVMTF9NLCBkYXRhQnVmZmVyLCAmZGF0YVNpemUpKQorCQl7CisJCQlOZXV0cmFsTW9kZSBtb2RlID0gKE5ldXRyYWxNb2RlKWRhdGFCdWZmZXJbMF07CisKKwkJCWlmKG1vZGUgPT0gbV9uZXV0cmFsTW9kZSkKKwkJCQltX25ldXRyYWxNb2RlVmVyaWZpZWQgPSB0cnVlOworCQkJZWxzZQorCQkJCS8vIEl0J3Mgd3JvbmcgLSBzZXQgaXQgYWdhaW4KKwkJCQlDb25maWdOZXV0cmFsTW9kZShtX25ldXRyYWxNb2RlKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIFZlcmlmaWNhdGlvbiBpcyBuZWVkZWQgYnV0IG5vdCBhdmFpbGFibGUgLSByZXF1ZXN0IGl0IGFnYWluLgorCQkJcmVxdWVzdE1lc3NhZ2UoTE1fQVBJX0NGR19CUkFLRV9DT0FTVCk7CisJCX0KKwl9CisKKwlpZighbV9lbmNvZGVyQ29kZXNQZXJSZXZWZXJpZmllZCkKKwl7CisJCWlmKGdldE1lc3NhZ2UoTE1fQVBJX0NGR19FTkNfTElORVMsIENBTl9NU0dJRF9GVUxMX00sIGRhdGFCdWZmZXIsICZkYXRhU2l6ZSkpCisJCXsKKwkJCXVpbnQxNl90IGNvZGVzID0gdW5wYWNraW50MTZfdChkYXRhQnVmZmVyKTsKKworCQkJaWYoY29kZXMgPT0gbV9lbmNvZGVyQ29kZXNQZXJSZXYpCisJCQkJbV9lbmNvZGVyQ29kZXNQZXJSZXZWZXJpZmllZCA9IHRydWU7CisJCQllbHNlCisJCQkJLy8gSXQncyB3cm9uZyAtIHNldCBpdCBhZ2FpbgorCQkJCUNvbmZpZ0VuY29kZXJDb2Rlc1BlclJldihtX2VuY29kZXJDb2Rlc1BlclJldik7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBWZXJpZmljYXRpb24gaXMgbmVlZGVkIGJ1dCBub3QgYXZhaWxhYmxlIC0gcmVxdWVzdCBpdCBhZ2Fpbi4KKwkJCXJlcXVlc3RNZXNzYWdlKExNX0FQSV9DRkdfRU5DX0xJTkVTKTsKKwkJfQorCX0KKworCWlmKCFtX3BvdGVudGlvbWV0ZXJUdXJuc1ZlcmlmaWVkKQorCXsKKwkJaWYoZ2V0TWVzc2FnZShMTV9BUElfQ0ZHX1BPVF9UVVJOUywgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwgJmRhdGFTaXplKSkKKwkJeworCQkJdWludDE2X3QgdHVybnMgPSB1bnBhY2tpbnQxNl90KGRhdGFCdWZmZXIpOworCisJCQlpZih0dXJucyA9PSBtX3BvdGVudGlvbWV0ZXJUdXJucykKKwkJCQltX3BvdGVudGlvbWV0ZXJUdXJuc1ZlcmlmaWVkID0gdHJ1ZTsKKwkJCWVsc2UKKwkJCQkvLyBJdCdzIHdyb25nIC0gc2V0IGl0IGFnYWluCisJCQkJQ29uZmlnUG90ZW50aW9tZXRlclR1cm5zKG1fcG90ZW50aW9tZXRlclR1cm5zKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIFZlcmlmaWNhdGlvbiBpcyBuZWVkZWQgYnV0IG5vdCBhdmFpbGFibGUgLSByZXF1ZXN0IGl0IGFnYWluLgorCQkJcmVxdWVzdE1lc3NhZ2UoTE1fQVBJX0NGR19QT1RfVFVSTlMpOworCQl9CisJfQorCisJaWYoIW1fbGltaXRNb2RlVmVyaWZpZWQpCisJeworCQlpZihnZXRNZXNzYWdlKExNX0FQSV9DRkdfTElNSVRfTU9ERSwgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwgJmRhdGFTaXplKSkKKwkJeworCQkJTGltaXRNb2RlIG1vZGUgPSAoTGltaXRNb2RlKWRhdGFCdWZmZXJbMF07CisKKwkJCWlmKG1vZGUgPT0gbV9saW1pdE1vZGUpCisJCQkJbV9saW1pdE1vZGVWZXJpZmllZCA9IHRydWU7CisJCQllbHNlCisJCQl7CisJCQkJLy8gSXQncyB3cm9uZyAtIHNldCBpdCBhZ2FpbgorCQkJCUNvbmZpZ0xpbWl0TW9kZShtX2xpbWl0TW9kZSk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBWZXJpZmljYXRpb24gaXMgbmVlZGVkIGJ1dCBub3QgYXZhaWxhYmxlIC0gcmVxdWVzdCBpdCBhZ2Fpbi4KKwkJCXJlcXVlc3RNZXNzYWdlKExNX0FQSV9DRkdfTElNSVRfTU9ERSk7CisJCX0KKwl9CisKKwlpZighbV9mb3J3YXJkTGltaXRWZXJpZmllZCkKKwl7CisJCWlmKGdldE1lc3NhZ2UoTE1fQVBJX0NGR19MSU1JVF9GV0QsIENBTl9NU0dJRF9GVUxMX00sIGRhdGFCdWZmZXIsICZkYXRhU2l6ZSkpCisJCXsKKwkJCWRvdWJsZSBsaW1pdCA9IHVucGFja0ZYUDE2XzE2KGRhdGFCdWZmZXIpOworCisJCQlpZihGWFAxNl9FUShsaW1pdCwgbV9mb3J3YXJkTGltaXQpKQorCQkJCW1fZm9yd2FyZExpbWl0VmVyaWZpZWQgPSB0cnVlOworCQkJZWxzZQorCQkJeworCQkJCS8vIEl0J3Mgd3JvbmcgLSBzZXQgaXQgYWdhaW4KKwkJCQlDb25maWdGb3J3YXJkTGltaXQobV9mb3J3YXJkTGltaXQpOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJLy8gVmVyaWZpY2F0aW9uIGlzIG5lZWRlZCBidXQgbm90IGF2YWlsYWJsZSAtIHJlcXVlc3QgaXQgYWdhaW4uCisJCQlyZXF1ZXN0TWVzc2FnZShMTV9BUElfQ0ZHX0xJTUlUX0ZXRCk7CisJCX0KKwl9CisKKwlpZighbV9yZXZlcnNlTGltaXRWZXJpZmllZCkKKwl7CisJCWlmKGdldE1lc3NhZ2UoTE1fQVBJX0NGR19MSU1JVF9SRVYsIENBTl9NU0dJRF9GVUxMX00sIGRhdGFCdWZmZXIsICZkYXRhU2l6ZSkpCisJCXsKKwkJCWRvdWJsZSBsaW1pdCA9IHVucGFja0ZYUDE2XzE2KGRhdGFCdWZmZXIpOworCisJCQlpZihGWFAxNl9FUShsaW1pdCwgbV9yZXZlcnNlTGltaXQpKQorCQkJCW1fcmV2ZXJzZUxpbWl0VmVyaWZpZWQgPSB0cnVlOworCQkJZWxzZQorCQkJeworCQkJCS8vIEl0J3Mgd3JvbmcgLSBzZXQgaXQgYWdhaW4KKwkJCQlDb25maWdSZXZlcnNlTGltaXQobV9yZXZlcnNlTGltaXQpOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJLy8gVmVyaWZpY2F0aW9uIGlzIG5lZWRlZCBidXQgbm90IGF2YWlsYWJsZSAtIHJlcXVlc3QgaXQgYWdhaW4uCisJCQlyZXF1ZXN0TWVzc2FnZShMTV9BUElfQ0ZHX0xJTUlUX1JFVik7CisJCX0KKwl9CisKKwlpZighbV9tYXhPdXRwdXRWb2x0YWdlVmVyaWZpZWQpCisJeworCQlpZihnZXRNZXNzYWdlKExNX0FQSV9DRkdfTUFYX1ZPVVQsIENBTl9NU0dJRF9GVUxMX00sIGRhdGFCdWZmZXIsICZkYXRhU2l6ZSkpCisJCXsKKwkJCWRvdWJsZSB2b2x0YWdlID0gdW5wYWNrRlhQOF84KGRhdGFCdWZmZXIpOworCisJCQkvLyBUaGUgcmV0dXJuZWQgbWF4IG91dHB1dCB2b2x0YWdlIGlzIHNvbWV0aW1lcyBzbGlnaHRseSBoaWdoZXIgb3IKKwkJCS8vIGxvd2VyIHRoYW4gd2hhdCB3YXMgc2VudC4gIFRoaXMgc2hvdWxkIG5vdCB0cmlnZ2VyIHJlc2VuZGluZworCQkJLy8gdGhlIG1lc3NhZ2UuCisJCQlpZihzdGQ6OmFicyh2b2x0YWdlIC0gbV9tYXhPdXRwdXRWb2x0YWdlKSA8IDAuMSkKKwkJCQltX21heE91dHB1dFZvbHRhZ2VWZXJpZmllZCA9IHRydWU7CisJCQllbHNlCisJCQl7CisJCQkJLy8gSXQncyB3cm9uZyAtIHNldCBpdCBhZ2FpbgorCQkJCUNvbmZpZ01heE91dHB1dFZvbHRhZ2UobV9tYXhPdXRwdXRWb2x0YWdlKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIFZlcmlmaWNhdGlvbiBpcyBuZWVkZWQgYnV0IG5vdCBhdmFpbGFibGUgLSByZXF1ZXN0IGl0IGFnYWluLgorCQkJcmVxdWVzdE1lc3NhZ2UoTE1fQVBJX0NGR19NQVhfVk9VVCk7CisJCX0KKwl9CisKKwlpZighbV92b2x0YWdlUmFtcFJhdGVWZXJpZmllZCkKKwl7CisJCWlmKG1fY29udHJvbE1vZGUgPT0ga1BlcmNlbnRWYnVzKQorCQl7CisJCQlpZihnZXRNZXNzYWdlKExNX0FQSV9WT0xUX1NFVF9SQU1QLCBDQU5fTVNHSURfRlVMTF9NLCBkYXRhQnVmZmVyLCAmZGF0YVNpemUpKQorCQkJeworCQkJCWRvdWJsZSByYXRlID0gdW5wYWNrUGVyY2VudGFnZShkYXRhQnVmZmVyKTsKKworCQkJCWlmKEZYUDE2X0VRKHJhdGUsIG1fdm9sdGFnZVJhbXBSYXRlKSkKKwkJCQkJbV92b2x0YWdlUmFtcFJhdGVWZXJpZmllZCA9IHRydWU7CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJLy8gSXQncyB3cm9uZyAtIHNldCBpdCBhZ2FpbgorCQkJCQlTZXRWb2x0YWdlUmFtcFJhdGUobV92b2x0YWdlUmFtcFJhdGUpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBWZXJpZmljYXRpb24gaXMgbmVlZGVkIGJ1dCBub3QgYXZhaWxhYmxlIC0gcmVxdWVzdCBpdCBhZ2Fpbi4KKwkJCQlyZXF1ZXN0TWVzc2FnZShMTV9BUElfVk9MVF9TRVRfUkFNUCk7CisJCQl9CisJCX0KKwkJZWxzZSBpZihtX2NvbnRyb2xNb2RlID09IGtWb2x0YWdlKQorCQl7CisJCQlpZihnZXRNZXNzYWdlKExNX0FQSV9WQ09NUF9DT01QX1JBTVAsIENBTl9NU0dJRF9GVUxMX00sIGRhdGFCdWZmZXIsICZkYXRhU2l6ZSkpCisJCQl7CisJCQkJZG91YmxlIHJhdGUgPSB1bnBhY2tGWFA4XzgoZGF0YUJ1ZmZlcik7CisKKwkJCQlpZihGWFA4X0VRKHJhdGUsIG1fdm9sdGFnZVJhbXBSYXRlKSkKKwkJCQkJbV92b2x0YWdlUmFtcFJhdGVWZXJpZmllZCA9IHRydWU7CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJLy8gSXQncyB3cm9uZyAtIHNldCBpdCBhZ2FpbgorCQkJCQlTZXRWb2x0YWdlUmFtcFJhdGUobV92b2x0YWdlUmFtcFJhdGUpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBWZXJpZmljYXRpb24gaXMgbmVlZGVkIGJ1dCBub3QgYXZhaWxhYmxlIC0gcmVxdWVzdCBpdCBhZ2Fpbi4KKwkJCQlyZXF1ZXN0TWVzc2FnZShMTV9BUElfVkNPTVBfQ09NUF9SQU1QKTsKKwkJCX0KKwkJfQorCX0KKworCWlmKCFtX2ZhdWx0VGltZVZlcmlmaWVkKQorCXsKKwkJaWYoZ2V0TWVzc2FnZShMTV9BUElfQ0ZHX0ZBVUxUX1RJTUUsIENBTl9NU0dJRF9GVUxMX00sIGRhdGFCdWZmZXIsICZkYXRhU2l6ZSkpCisJCXsKKwkJCXVpbnQxNl90IGZhdWx0VGltZSA9IHVucGFja2ludDE2X3QoZGF0YUJ1ZmZlcik7CisKKwkJCWlmKCh1aW50MTZfdCkobV9mYXVsdFRpbWUgKiAxMDAwLjApID09IGZhdWx0VGltZSkKKwkJCQltX2ZhdWx0VGltZVZlcmlmaWVkID0gdHJ1ZTsKKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBJdCdzIHdyb25nIC0gc2V0IGl0IGFnYWluCisJCQkJQ29uZmlnRmF1bHRUaW1lKG1fZmF1bHRUaW1lKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIFZlcmlmaWNhdGlvbiBpcyBuZWVkZWQgYnV0IG5vdCBhdmFpbGFibGUgLSByZXF1ZXN0IGl0IGFnYWluLgorCQkJcmVxdWVzdE1lc3NhZ2UoTE1fQVBJX0NGR19GQVVMVF9USU1FKTsKKwkJfQorCX0KKworCWlmKCFtX3JlY2VpdmVkU3RhdHVzTWVzc2FnZTAgfHwKKwkJCSFtX3JlY2VpdmVkU3RhdHVzTWVzc2FnZTEgfHwKKwkJCSFtX3JlY2VpdmVkU3RhdHVzTWVzc2FnZTIpCisJeworCQkvLyBJZiB0aGUgcGVyaW9kaWMgc3RhdHVzIG1lc3NhZ2VzIGhhdmVuJ3QgYmVlbiB2ZXJpZmllZCBhcyByZWNlaXZlZCwKKwkJLy8gcmVxdWVzdCBwZXJpb2RpYyBzdGF0dXMgbWVzc2FnZXMgYWdhaW4gYW5kIGF0dGVtcHQgdG8gdW5wYWNrIGFueQorCQkvLyBhdmFpbGFibGUgb25lcy4KKwkJc2V0dXBQZXJpb2RpY1N0YXR1cygpOworCQlHZXRUZW1wZXJhdHVyZSgpOworCQlHZXRQb3NpdGlvbigpOworCQlHZXRGYXVsdHMoKTsKKwl9Cit9CisKKy8qKgorICogU2V0IHRoZSByZWZlcmVuY2Ugc291cmNlIGRldmljZSBmb3Igc3BlZWQgY29udHJvbGxlciBtb2RlLgorICoKKyAqIENob29zZSBlbmNvZGVyIGFzIHRoZSBzb3VyY2Ugb2Ygc3BlZWQgZmVlZGJhY2sgd2hlbiBpbiBzcGVlZCBjb250cm9sIG1vZGUuCisgKgorICogQHBhcmFtIHJlZmVyZW5jZSBTcGVjaWZ5IGEgc3BlZWQgcmVmZXJlbmNlLgorICovCit2b2lkIENBTkphZ3Vhcjo6U2V0U3BlZWRSZWZlcmVuY2UodWludDhfdCByZWZlcmVuY2UpCit7CisJdWludDhfdCBkYXRhQnVmZmVyWzhdOworCisJLy8gU2VuZCB0aGUgc3BlZWQgcmVmZXJlbmNlIHBhcmFtZXRlcgorCWRhdGFCdWZmZXJbMF0gPSByZWZlcmVuY2U7CisJc2VuZE1lc3NhZ2UoTE1fQVBJX1NQRF9SRUYsIGRhdGFCdWZmZXIsIHNpemVvZih1aW50OF90KSk7CisKKwltX3NwZWVkUmVmZXJlbmNlID0gcmVmZXJlbmNlOworCW1fc3BlZWRSZWZWZXJpZmllZCA9IGZhbHNlOworfQorCisvKioKKyAqIEdldCB0aGUgcmVmZXJlbmNlIHNvdXJjZSBkZXZpY2UgZm9yIHNwZWVkIGNvbnRyb2xsZXIgbW9kZS4KKyAqCisgKiBAcmV0dXJuIEEgc3BlZWQgcmVmZXJlbmNlIGluZGljYXRpbmcgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByZWZlcmVuY2UgZGV2aWNlCisgKiBmb3Igc3BlZWQgY29udHJvbGxlciBtb2RlLgorICovCit1aW50OF90IENBTkphZ3Vhcjo6R2V0U3BlZWRSZWZlcmVuY2UoKQoreworCXJldHVybiBtX3NwZWVkUmVmZXJlbmNlOworfQorCisvKioKKyAqIFNldCB0aGUgcmVmZXJlbmNlIHNvdXJjZSBkZXZpY2UgZm9yIHBvc2l0aW9uIGNvbnRyb2xsZXIgbW9kZS4KKyAqCisgKiBDaG9vc2UgYmV0d2VlbiB1c2luZyBhbmQgZW5jb2RlciBhbmQgdXNpbmcgYSBwb3RlbnRpb21ldGVyCisgKiBhcyB0aGUgc291cmNlIG9mIHBvc2l0aW9uIGZlZWRiYWNrIHdoZW4gaW4gcG9zaXRpb24gY29udHJvbCBtb2RlLgorICoKKyAqIEBwYXJhbSByZWZlcmVuY2UgU3BlY2lmeSBhIFBvc2l0aW9uUmVmZXJlbmNlLgorICovCit2b2lkIENBTkphZ3Vhcjo6U2V0UG9zaXRpb25SZWZlcmVuY2UodWludDhfdCByZWZlcmVuY2UpCit7CisJdWludDhfdCBkYXRhQnVmZmVyWzhdOworCisJLy8gU2VuZCB0aGUgcG9zaXRpb24gcmVmZXJlbmNlIHBhcmFtZXRlcgorCWRhdGFCdWZmZXJbMF0gPSByZWZlcmVuY2U7CisJc2VuZE1lc3NhZ2UoTE1fQVBJX1BPU19SRUYsIGRhdGFCdWZmZXIsIHNpemVvZih1aW50OF90KSk7CisKKwltX3Bvc2l0aW9uUmVmZXJlbmNlID0gcmVmZXJlbmNlOworCW1fcG9zUmVmVmVyaWZpZWQgPSBmYWxzZTsKK30KKworLyoqCisgKiBHZXQgdGhlIHJlZmVyZW5jZSBzb3VyY2UgZGV2aWNlIGZvciBwb3NpdGlvbiBjb250cm9sbGVyIG1vZGUuCisgKgorICogQHJldHVybiBBIFBvc2l0aW9uUmVmZXJlbmNlIGluZGljYXRpbmcgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByZWZlcmVuY2UgZGV2aWNlIGZvciBwb3NpdGlvbiBjb250cm9sbGVyIG1vZGUuCisgKi8KK3VpbnQ4X3QgQ0FOSmFndWFyOjpHZXRQb3NpdGlvblJlZmVyZW5jZSgpCit7CisJcmV0dXJuIG1fcG9zaXRpb25SZWZlcmVuY2U7Cit9CisKKy8qKgorICogU2V0IHRoZSBQLCBJLCBhbmQgRCBjb25zdGFudHMgZm9yIHRoZSBjbG9zZWQgbG9vcCBtb2Rlcy4KKyAqCisgKiBAcGFyYW0gcCBUaGUgcHJvcG9ydGlvbmFsIGdhaW4gb2YgdGhlIEphZ3VhcidzIFBJRCBjb250cm9sbGVyLgorICogQHBhcmFtIGkgVGhlIGludGVncmFsIGdhaW4gb2YgdGhlIEphZ3VhcidzIFBJRCBjb250cm9sbGVyLgorICogQHBhcmFtIGQgVGhlIGRpZmZlcmVudGlhbCBnYWluIG9mIHRoZSBKYWd1YXIncyBQSUQgY29udHJvbGxlci4KKyAqLwordm9pZCBDQU5KYWd1YXI6OlNldFBJRChkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkKQoreworCVNldFAocCk7CisJU2V0SShpKTsKKwlTZXREKGQpOworfQorCisvKioKKyAqIFNldCB0aGUgUCBjb25zdGFudCBmb3IgdGhlIGNsb3NlZCBsb29wIG1vZGVzLgorICoKKyAqIEBwYXJhbSBwIFRoZSBwcm9wb3J0aW9uYWwgZ2FpbiBvZiB0aGUgSmFndWFyJ3MgUElEIGNvbnRyb2xsZXIuCisgKi8KK3ZvaWQgQ0FOSmFndWFyOjpTZXRQKGRvdWJsZSBwKQoreworCXVpbnQ4X3QgZGF0YUJ1ZmZlcls4XTsKKwl1aW50OF90IGRhdGFTaXplOworCisJc3dpdGNoKG1fY29udHJvbE1vZGUpCisJeworCWNhc2Uga1BlcmNlbnRWYnVzOgorCWNhc2Uga1ZvbHRhZ2U6CisgIGNhc2Uga0ZvbGxvd2VyOgorCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChJbmNvbXBhdGlibGVNb2RlLCAiUElEIGNvbnN0YW50cyBvbmx5IGFwcGx5IGluIFNwZWVkLCBQb3NpdGlvbiwgYW5kIEN1cnJlbnQgbW9kZSIpOworCQlicmVhazsKKwljYXNlIGtTcGVlZDoKKwkJZGF0YVNpemUgPSBwYWNrRlhQMTZfMTYoZGF0YUJ1ZmZlciwgcCk7CisJCXNlbmRNZXNzYWdlKExNX0FQSV9TUERfUEMsIGRhdGFCdWZmZXIsIGRhdGFTaXplKTsKKwkJYnJlYWs7CisJY2FzZSBrUG9zaXRpb246CisJCWRhdGFTaXplID0gcGFja0ZYUDE2XzE2KGRhdGFCdWZmZXIsIHApOworCQlzZW5kTWVzc2FnZShMTV9BUElfUE9TX1BDLCBkYXRhQnVmZmVyLCBkYXRhU2l6ZSk7CisJCWJyZWFrOworCWNhc2Uga0N1cnJlbnQ6CisJCWRhdGFTaXplID0gcGFja0ZYUDE2XzE2KGRhdGFCdWZmZXIsIHApOworCQlzZW5kTWVzc2FnZShMTV9BUElfSUNUUkxfUEMsIGRhdGFCdWZmZXIsIGRhdGFTaXplKTsKKwkJYnJlYWs7CisJfQorCisJbV9wID0gcDsKKwltX3BWZXJpZmllZCA9IGZhbHNlOworfQorCisvKioKKyAqIFNldCB0aGUgSSBjb25zdGFudCBmb3IgdGhlIGNsb3NlZCBsb29wIG1vZGVzLgorICoKKyAqIEBwYXJhbSBpIFRoZSBpbnRlZ3JhbCBnYWluIG9mIHRoZSBKYWd1YXIncyBQSUQgY29udHJvbGxlci4KKyAqLwordm9pZCBDQU5KYWd1YXI6OlNldEkoZG91YmxlIGkpCit7CisJdWludDhfdCBkYXRhQnVmZmVyWzhdOworCXVpbnQ4X3QgZGF0YVNpemU7CisKKwlzd2l0Y2gobV9jb250cm9sTW9kZSkKKwl7CisJY2FzZSBrUGVyY2VudFZidXM6CisJY2FzZSBrVm9sdGFnZToKKyAgY2FzZSBrRm9sbG93ZXI6CisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KEluY29tcGF0aWJsZU1vZGUsICJQSUQgY29uc3RhbnRzIG9ubHkgYXBwbHkgaW4gU3BlZWQsIFBvc2l0aW9uLCBhbmQgQ3VycmVudCBtb2RlIik7CisJCWJyZWFrOworCWNhc2Uga1NwZWVkOgorCQlkYXRhU2l6ZSA9IHBhY2tGWFAxNl8xNihkYXRhQnVmZmVyLCBpKTsKKwkJc2VuZE1lc3NhZ2UoTE1fQVBJX1NQRF9JQywgZGF0YUJ1ZmZlciwgZGF0YVNpemUpOworCQlicmVhazsKKwljYXNlIGtQb3NpdGlvbjoKKwkJZGF0YVNpemUgPSBwYWNrRlhQMTZfMTYoZGF0YUJ1ZmZlciwgaSk7CisJCXNlbmRNZXNzYWdlKExNX0FQSV9QT1NfSUMsIGRhdGFCdWZmZXIsIGRhdGFTaXplKTsKKwkJYnJlYWs7CisJY2FzZSBrQ3VycmVudDoKKwkJZGF0YVNpemUgPSBwYWNrRlhQMTZfMTYoZGF0YUJ1ZmZlciwgaSk7CisJCXNlbmRNZXNzYWdlKExNX0FQSV9JQ1RSTF9JQywgZGF0YUJ1ZmZlciwgZGF0YVNpemUpOworCQlicmVhazsKKwl9CisKKwltX2kgPSBpOworCW1faVZlcmlmaWVkID0gZmFsc2U7Cit9CisKKy8qKgorICogU2V0IHRoZSBEIGNvbnN0YW50IGZvciB0aGUgY2xvc2VkIGxvb3AgbW9kZXMuCisgKgorICogQHBhcmFtIGQgVGhlIGRlcml2YXRpdmUgZ2FpbiBvZiB0aGUgSmFndWFyJ3MgUElEIGNvbnRyb2xsZXIuCisgKi8KK3ZvaWQgQ0FOSmFndWFyOjpTZXREKGRvdWJsZSBkKQoreworCXVpbnQ4X3QgZGF0YUJ1ZmZlcls4XTsKKwl1aW50OF90IGRhdGFTaXplOworCisJc3dpdGNoKG1fY29udHJvbE1vZGUpCisJeworCWNhc2Uga1BlcmNlbnRWYnVzOgorCWNhc2Uga1ZvbHRhZ2U6CisgIGNhc2Uga0ZvbGxvd2VyOgorCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChJbmNvbXBhdGlibGVNb2RlLCAiUElEIGNvbnN0YW50cyBvbmx5IGFwcGx5IGluIFNwZWVkLCBQb3NpdGlvbiwgYW5kIEN1cnJlbnQgbW9kZSIpOworCQlicmVhazsKKwljYXNlIGtTcGVlZDoKKwkJZGF0YVNpemUgPSBwYWNrRlhQMTZfMTYoZGF0YUJ1ZmZlciwgZCk7CisJCXNlbmRNZXNzYWdlKExNX0FQSV9TUERfREMsIGRhdGFCdWZmZXIsIGRhdGFTaXplKTsKKwkJYnJlYWs7CisJY2FzZSBrUG9zaXRpb246CisJCWRhdGFTaXplID0gcGFja0ZYUDE2XzE2KGRhdGFCdWZmZXIsIGQpOworCQlzZW5kTWVzc2FnZShMTV9BUElfUE9TX0RDLCBkYXRhQnVmZmVyLCBkYXRhU2l6ZSk7CisJCWJyZWFrOworCWNhc2Uga0N1cnJlbnQ6CisJCWRhdGFTaXplID0gcGFja0ZYUDE2XzE2KGRhdGFCdWZmZXIsIGQpOworCQlzZW5kTWVzc2FnZShMTV9BUElfSUNUUkxfREMsIGRhdGFCdWZmZXIsIGRhdGFTaXplKTsKKwkJYnJlYWs7CisJfQorCisJbV9kID0gZDsKKwltX2RWZXJpZmllZCA9IGZhbHNlOworfQorCisvKioKKyAqIEdldCB0aGUgUHJvcG9ydGlvbmFsIGdhaW4gb2YgdGhlIGNvbnRyb2xsZXIuCisgKgorICogQHJldHVybiBUaGUgcHJvcG9ydGlvbmFsIGdhaW4uCisgKi8KK2RvdWJsZSBDQU5KYWd1YXI6OkdldFAoKQoreworCWlmKG1fY29udHJvbE1vZGUgPT0ga1BlcmNlbnRWYnVzIHx8IG1fY29udHJvbE1vZGUgPT0ga1ZvbHRhZ2UpCisJeworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChJbmNvbXBhdGlibGVNb2RlLCAiUElEIGNvbnN0YW50cyBvbmx5IGFwcGx5IGluIFNwZWVkLCBQb3NpdGlvbiwgYW5kIEN1cnJlbnQgbW9kZSIpOworCQlyZXR1cm4gMC4wOworCX0KKworCXJldHVybiBtX3A7Cit9CisKKy8qKgorICogR2V0IHRoZSBJbnRyZWdyYWwgZ2FpbiBvZiB0aGUgY29udHJvbGxlci4KKyAqCisgKiBAcmV0dXJuIFRoZSBpbnRlZ3JhbCBnYWluLgorICovCitkb3VibGUgQ0FOSmFndWFyOjpHZXRJKCkKK3sKKwlpZihtX2NvbnRyb2xNb2RlID09IGtQZXJjZW50VmJ1cyB8fCBtX2NvbnRyb2xNb2RlID09IGtWb2x0YWdlKQorCXsKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoSW5jb21wYXRpYmxlTW9kZSwgIlBJRCBjb25zdGFudHMgb25seSBhcHBseSBpbiBTcGVlZCwgUG9zaXRpb24sIGFuZCBDdXJyZW50IG1vZGUiKTsKKwkJcmV0dXJuIDAuMDsKKwl9CisKKwlyZXR1cm4gbV9pOworfQorCisvKioKKyAqIEdldCB0aGUgRGlmZmVyZW50aWFsIGdhaW4gb2YgdGhlIGNvbnRyb2xsZXIuCisgKgorICogQHJldHVybiBUaGUgZGlmZmVyZW50aWFsIGdhaW4uCisgKi8KK2RvdWJsZSBDQU5KYWd1YXI6OkdldEQoKQoreworCWlmKG1fY29udHJvbE1vZGUgPT0ga1BlcmNlbnRWYnVzIHx8IG1fY29udHJvbE1vZGUgPT0ga1ZvbHRhZ2UpCisJeworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChJbmNvbXBhdGlibGVNb2RlLCAiUElEIGNvbnN0YW50cyBvbmx5IGFwcGx5IGluIFNwZWVkLCBQb3NpdGlvbiwgYW5kIEN1cnJlbnQgbW9kZSIpOworCQlyZXR1cm4gMC4wOworCX0KKworCXJldHVybiBtX2Q7Cit9CisKKy8qKgorICogRW5hYmxlIHRoZSBjbG9zZWQgbG9vcCBjb250cm9sbGVyLgorICoKKyAqIFN0YXJ0IGFjdHVhbGx5IGNvbnRyb2xsaW5nIHRoZSBvdXRwdXQgYmFzZWQgb24gdGhlIGZlZWRiYWNrLgorICogSWYgc3RhcnRpbmcgYSBwb3NpdGlvbiBjb250cm9sbGVyIHdpdGggYW4gZW5jb2RlciByZWZlcmVuY2UsCisgKiB1c2UgdGhlIGVuY29kZXJJbml0aWFsUG9zaXRpb24gcGFyYW1ldGVyIHRvIGluaXRpYWxpemUgdGhlCisgKiBlbmNvZGVyIHN0YXRlLgorICoKKyAqIEBwYXJhbSBlbmNvZGVySW5pdGlhbFBvc2l0aW9uIEVuY29kZXIgcG9zaXRpb24gdG8gc2V0IGlmIHBvc2l0aW9uIHdpdGggZW5jb2RlciByZWZlcmVuY2UuICBJZ25vcmVkIG90aGVyd2lzZS4KKyAqLwordm9pZCBDQU5KYWd1YXI6OkVuYWJsZUNvbnRyb2woZG91YmxlIGVuY29kZXJJbml0aWFsUG9zaXRpb24pCit7CisJdWludDhfdCBkYXRhQnVmZmVyWzhdOworCXVpbnQ4X3QgZGF0YVNpemUgPSAwOworCisJc3dpdGNoKG1fY29udHJvbE1vZGUpCisJeworCWNhc2Uga1BlcmNlbnRWYnVzOgorCQlzZW5kTWVzc2FnZShMTV9BUElfVk9MVF9UX0VOLCBkYXRhQnVmZmVyLCBkYXRhU2l6ZSk7CisJCWJyZWFrOworCWNhc2Uga1NwZWVkOgorCQlzZW5kTWVzc2FnZShMTV9BUElfU1BEX1RfRU4sIGRhdGFCdWZmZXIsIGRhdGFTaXplKTsKKwkJYnJlYWs7CisJY2FzZSBrUG9zaXRpb246CisJCWRhdGFTaXplID0gcGFja0ZYUDE2XzE2KGRhdGFCdWZmZXIsIGVuY29kZXJJbml0aWFsUG9zaXRpb24pOworCQlzZW5kTWVzc2FnZShMTV9BUElfUE9TX1RfRU4sIGRhdGFCdWZmZXIsIGRhdGFTaXplKTsKKwkJYnJlYWs7CisJY2FzZSBrQ3VycmVudDoKKwkJc2VuZE1lc3NhZ2UoTE1fQVBJX0lDVFJMX1RfRU4sIGRhdGFCdWZmZXIsIGRhdGFTaXplKTsKKwkJYnJlYWs7CisJY2FzZSBrVm9sdGFnZToKKwkJc2VuZE1lc3NhZ2UoTE1fQVBJX1ZDT01QX1RfRU4sIGRhdGFCdWZmZXIsIGRhdGFTaXplKTsKKwkJYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoSW5jb21wYXRpYmxlTW9kZSwgIlRoZSBKYWd1YXIgb25seSBzdXBwb3J0cyBDdXJyZW50LCBWb2x0YWdlLCBQb3NpdGlvbiwgU3BlZWQsIGFuZCBQZXJjZW50IChUaHJvdHRsZSkgbW9kZXMuIik7CisgICAgcmV0dXJuOworCX0KKworCW1fY29udHJvbEVuYWJsZWQgPSB0cnVlOworCW1fY29udHJvbE1vZGVWZXJpZmllZCA9IGZhbHNlOworfQorCisvKioKKyAqIERpc2FibGUgdGhlIGNsb3NlZCBsb29wIGNvbnRyb2xsZXIuCisgKgorICogU3RvcCBkcml2aW5nIHRoZSBvdXRwdXQgYmFzZWQgb24gdGhlIGZlZWRiYWNrLgorICovCit2b2lkIENBTkphZ3Vhcjo6RGlzYWJsZUNvbnRyb2woKQoreworCXVpbnQ4X3QgZGF0YUJ1ZmZlcls4XTsKKwl1aW50OF90IGRhdGFTaXplID0gMDsKKworCS8vIERpc2FibGUgYWxsIGNvbnRyb2wKKwlzZW5kTWVzc2FnZShMTV9BUElfVk9MVF9ESVMsIGRhdGFCdWZmZXIsIGRhdGFTaXplKTsKKwlzZW5kTWVzc2FnZShMTV9BUElfU1BEX0RJUywgZGF0YUJ1ZmZlciwgZGF0YVNpemUpOworCXNlbmRNZXNzYWdlKExNX0FQSV9QT1NfRElTLCBkYXRhQnVmZmVyLCBkYXRhU2l6ZSk7CisJc2VuZE1lc3NhZ2UoTE1fQVBJX0lDVFJMX0RJUywgZGF0YUJ1ZmZlciwgZGF0YVNpemUpOworCXNlbmRNZXNzYWdlKExNX0FQSV9WQ09NUF9ESVMsIGRhdGFCdWZmZXIsIGRhdGFTaXplKTsKKworCS8vIFN0b3AgYWxsIHBlcmlvZGljIHNldHBvaW50cworCXNlbmRNZXNzYWdlKExNX0FQSV9WT0xUX1RfU0VULCBkYXRhQnVmZmVyLCBkYXRhU2l6ZSwgQ0FOX1NFTkRfUEVSSU9EX1NUT1BfUkVQRUFUSU5HKTsKKwlzZW5kTWVzc2FnZShMTV9BUElfU1BEX1RfU0VULCBkYXRhQnVmZmVyLCBkYXRhU2l6ZSwgQ0FOX1NFTkRfUEVSSU9EX1NUT1BfUkVQRUFUSU5HKTsKKwlzZW5kTWVzc2FnZShMTV9BUElfUE9TX1RfU0VULCBkYXRhQnVmZmVyLCBkYXRhU2l6ZSwgQ0FOX1NFTkRfUEVSSU9EX1NUT1BfUkVQRUFUSU5HKTsKKwlzZW5kTWVzc2FnZShMTV9BUElfSUNUUkxfVF9TRVQsIGRhdGFCdWZmZXIsIGRhdGFTaXplLCBDQU5fU0VORF9QRVJJT0RfU1RPUF9SRVBFQVRJTkcpOworCXNlbmRNZXNzYWdlKExNX0FQSV9WQ09NUF9UX1NFVCwgZGF0YUJ1ZmZlciwgZGF0YVNpemUsIENBTl9TRU5EX1BFUklPRF9TVE9QX1JFUEVBVElORyk7CisKKwltX2NvbnRyb2xFbmFibGVkID0gZmFsc2U7Cit9CisKKy8qKgorICogRW5hYmxlIGNvbnRyb2xsaW5nIHRoZSBtb3RvciB2b2x0YWdlIGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgYnVzIHZvbHRhZ2UKKyAqIHdpdGhvdXQgYW55IHBvc2l0aW9uIG9yIHNwZWVkIGZlZWRiYWNrLjxicj4KKyAqIEFmdGVyIGNhbGxpbmcgdGhpcyB5b3UgbXVzdCBjYWxsIHtAbGluayBDQU5KYWd1YXIjRW5hYmxlQ29udHJvbCgpfSBvciB7QGxpbmsgQ0FOSmFndWFyI0VuYWJsZUNvbnRyb2woZG91YmxlKX0gdG8gZW5hYmxlIHRoZSBkZXZpY2UuCisgKi8KK3ZvaWQgQ0FOSmFndWFyOjpTZXRQZXJjZW50TW9kZSgpCit7CisJU2V0Q29udHJvbE1vZGUoa1BlcmNlbnRWYnVzKTsKKwlTZXRQb3NpdGlvblJlZmVyZW5jZShMTV9SRUZfTk9ORSk7CisJU2V0U3BlZWRSZWZlcmVuY2UoTE1fUkVGX05PTkUpOworfQorCisvKioKKyAqIEVuYWJsZSBjb250cm9sbGluZyB0aGUgbW90b3Igdm9sdGFnZSBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIGJ1cyB2b2x0YWdlLAorICogYW5kIGVuYWJsZSBzcGVlZCBzZW5zaW5nIGZyb20gYSBub24tcXVhZHJhdHVyZSBlbmNvZGVyLjxicj4KKyAqIEFmdGVyIGNhbGxpbmcgdGhpcyB5b3UgbXVzdCBjYWxsIHtAbGluayBDQU5KYWd1YXIjRW5hYmxlQ29udHJvbCgpfSBvciB7QGxpbmsgQ0FOSmFndWFyI0VuYWJsZUNvbnRyb2woZG91YmxlKX0gdG8gZW5hYmxlIHRoZSBkZXZpY2UuCisgKgorICogQHBhcmFtIHRhZyBUaGUgY29uc3RhbnQgQ0FOSmFndWFyOjpFbmNvZGVyCisgKiBAcGFyYW0gY29kZXNQZXJSZXYgVGhlIGNvdW50cyBwZXIgcmV2b2x1dGlvbiBvbiB0aGUgZW5jb2RlcgorICovCit2b2lkIENBTkphZ3Vhcjo6U2V0UGVyY2VudE1vZGUoQ0FOSmFndWFyOjpFbmNvZGVyU3RydWN0LCB1aW50MTZfdCBjb2Rlc1BlclJldikKK3sKKwlTZXRDb250cm9sTW9kZShrUGVyY2VudFZidXMpOworCVNldFBvc2l0aW9uUmVmZXJlbmNlKExNX1JFRl9OT05FKTsKKwlTZXRTcGVlZFJlZmVyZW5jZShMTV9SRUZfRU5DT0RFUik7CisJQ29uZmlnRW5jb2RlckNvZGVzUGVyUmV2KGNvZGVzUGVyUmV2KTsKK30KKworLyoqCisgKiBFbmFibGUgY29udHJvbGxpbmcgdGhlIG1vdG9yIHZvbHRhZ2UgYXMgYSBwZXJjZW50YWdlIG9mIHRoZSBidXMgdm9sdGFnZSwKKyAqIGFuZCBlbmFibGUgc3BlZWQgc2Vuc2luZyBmcm9tIGEgbm9uLXF1YWRyYXR1cmUgZW5jb2Rlci48YnI+CisgKiBBZnRlciBjYWxsaW5nIHRoaXMgeW91IG11c3QgY2FsbCB7QGxpbmsgQ0FOSmFndWFyI0VuYWJsZUNvbnRyb2woKX0gb3Ige0BsaW5rIENBTkphZ3VhciNFbmFibGVDb250cm9sKGRvdWJsZSl9IHRvIGVuYWJsZSB0aGUgZGV2aWNlLgorICoKKyAqIEBwYXJhbSB0YWcgVGhlIGNvbnN0YW50IENBTkphZ3Vhcjo6UXVhZEVuY29kZXIKKyAqIEBwYXJhbSBjb2Rlc1BlclJldiBUaGUgY291bnRzIHBlciByZXZvbHV0aW9uIG9uIHRoZSBlbmNvZGVyCisgKi8KK3ZvaWQgQ0FOSmFndWFyOjpTZXRQZXJjZW50TW9kZShDQU5KYWd1YXI6OlF1YWRFbmNvZGVyU3RydWN0LCB1aW50MTZfdCBjb2Rlc1BlclJldikKK3sKKwlTZXRDb250cm9sTW9kZShrUGVyY2VudFZidXMpOworCVNldFBvc2l0aW9uUmVmZXJlbmNlKExNX1JFRl9FTkNPREVSKTsKKwlTZXRTcGVlZFJlZmVyZW5jZShMTV9SRUZfUVVBRF9FTkNPREVSKTsKKwlDb25maWdFbmNvZGVyQ29kZXNQZXJSZXYoY29kZXNQZXJSZXYpOworfQorCisvKioKKyogRW5hYmxlIGNvbnRyb2xsaW5nIHRoZSBtb3RvciB2b2x0YWdlIGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgYnVzIHZvbHRhZ2UsCisqIGFuZCBlbmFibGUgcG9zaXRpb24gc2Vuc2luZyBmcm9tIGEgcG90ZW50aW9tZXRlciBhbmQgbm8gc3BlZWQgZmVlZGJhY2suPGJyPgorKiBBZnRlciBjYWxsaW5nIHRoaXMgeW91IG11c3QgY2FsbCB7QGxpbmsgQ0FOSmFndWFyI0VuYWJsZUNvbnRyb2woKX0gb3Ige0BsaW5rIENBTkphZ3VhciNFbmFibGVDb250cm9sKGRvdWJsZSl9IHRvIGVuYWJsZSB0aGUgZGV2aWNlLgorKgorKiBAcGFyYW0gcG90ZW50aW9tZXRlciBUaGUgY29uc3RhbnQgQ0FOSmFndWFyOjpQb3RlbnRpb21ldGVyCisqLwordm9pZCBDQU5KYWd1YXI6OlNldFBlcmNlbnRNb2RlKENBTkphZ3Vhcjo6UG90ZW50aW9tZXRlclN0cnVjdCkKK3sKKwlTZXRDb250cm9sTW9kZShrUGVyY2VudFZidXMpOworCVNldFBvc2l0aW9uUmVmZXJlbmNlKExNX1JFRl9QT1QpOworCVNldFNwZWVkUmVmZXJlbmNlKExNX1JFRl9OT05FKTsKKwlDb25maWdQb3RlbnRpb21ldGVyVHVybnMoMSk7Cit9CisKKy8qKgorICogRW5hYmxlIGNvbnRyb2xsaW5nIHRoZSBtb3RvciBjdXJyZW50IHdpdGggYSBQSUQgbG9vcC48YnI+CisgKiBBZnRlciBjYWxsaW5nIHRoaXMgeW91IG11c3QgY2FsbCB7QGxpbmsgQ0FOSmFndWFyI0VuYWJsZUNvbnRyb2woKX0gb3Ige0BsaW5rIENBTkphZ3VhciNFbmFibGVDb250cm9sKGRvdWJsZSl9IHRvIGVuYWJsZSB0aGUgZGV2aWNlLgorICoKKyAqIEBwYXJhbSBwIFRoZSBwcm9wb3J0aW9uYWwgZ2FpbiBvZiB0aGUgSmFndWFyJ3MgUElEIGNvbnRyb2xsZXIuCisgKiBAcGFyYW0gaSBUaGUgaW50ZWdyYWwgZ2FpbiBvZiB0aGUgSmFndWFyJ3MgUElEIGNvbnRyb2xsZXIuCisgKiBAcGFyYW0gZCBUaGUgZGlmZmVyZW50aWFsIGdhaW4gb2YgdGhlIEphZ3VhcidzIFBJRCBjb250cm9sbGVyLgorICovCit2b2lkIENBTkphZ3Vhcjo6U2V0Q3VycmVudE1vZGUoZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCkKK3sKKwlTZXRDb250cm9sTW9kZShrQ3VycmVudCk7CisJU2V0UG9zaXRpb25SZWZlcmVuY2UoTE1fUkVGX05PTkUpOworCVNldFNwZWVkUmVmZXJlbmNlKExNX1JFRl9OT05FKTsKKwlTZXRQSUQocCwgaSwgZCk7Cit9CisKKy8qKgorKiBFbmFibGUgY29udHJvbGxpbmcgdGhlIG1vdG9yIGN1cnJlbnQgd2l0aCBhIFBJRCBsb29wLCBhbmQgZW5hYmxlIHNwZWVkCisqIHNlbnNpbmcgZnJvbSBhIG5vbi1xdWFkcmF0dXJlIGVuY29kZXIuPGJyPgorKiBBZnRlciBjYWxsaW5nIHRoaXMgeW91IG11c3QgY2FsbCB7QGxpbmsgQ0FOSmFndWFyI0VuYWJsZUNvbnRyb2woKX0gb3Ige0BsaW5rIENBTkphZ3VhciNFbmFibGVDb250cm9sKGRvdWJsZSl9IHRvIGVuYWJsZSB0aGUgZGV2aWNlLgorKgorKiBAcGFyYW0gZW5jb2RlciBUaGUgY29uc3RhbnQgQ0FOSmFndWFyOjpFbmNvZGVyCisqIEBwYXJhbSBwIFRoZSBwcm9wb3J0aW9uYWwgZ2FpbiBvZiB0aGUgSmFndWFyJ3MgUElEIGNvbnRyb2xsZXIuCisqIEBwYXJhbSBpIFRoZSBpbnRlZ3JhbCBnYWluIG9mIHRoZSBKYWd1YXIncyBQSUQgY29udHJvbGxlci4KKyogQHBhcmFtIGQgVGhlIGRpZmZlcmVudGlhbCBnYWluIG9mIHRoZSBKYWd1YXIncyBQSUQgY29udHJvbGxlci4KKyovCit2b2lkIENBTkphZ3Vhcjo6U2V0Q3VycmVudE1vZGUoQ0FOSmFndWFyOjpFbmNvZGVyU3RydWN0LCB1aW50MTZfdCBjb2Rlc1BlclJldiwgZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCkKK3sKKwlTZXRDb250cm9sTW9kZShrQ3VycmVudCk7CisJU2V0UG9zaXRpb25SZWZlcmVuY2UoTE1fUkVGX05PTkUpOworCVNldFNwZWVkUmVmZXJlbmNlKExNX1JFRl9OT05FKTsKKwlDb25maWdFbmNvZGVyQ29kZXNQZXJSZXYoY29kZXNQZXJSZXYpOworCVNldFBJRChwLCBpLCBkKTsKK30KKworLyoqCisqIEVuYWJsZSBjb250cm9sbGluZyB0aGUgbW90b3IgY3VycmVudCB3aXRoIGEgUElEIGxvb3AsIGFuZCBlbmFibGUgc3BlZWQgYW5kCisqIHBvc2l0aW9uIHNlbnNpbmcgZnJvbSBhIHF1YWRyYXR1cmUgZW5jb2Rlci48YnI+CisqIEFmdGVyIGNhbGxpbmcgdGhpcyB5b3UgbXVzdCBjYWxsIHtAbGluayBDQU5KYWd1YXIjRW5hYmxlQ29udHJvbCgpfSBvciB7QGxpbmsgQ0FOSmFndWFyI0VuYWJsZUNvbnRyb2woZG91YmxlKX0gdG8gZW5hYmxlIHRoZSBkZXZpY2UuCisqCisqIEBwYXJhbSBlbmRvZXIgVGhlIGNvbnN0YW50IENBTkphZ3Vhcjo6UXVhZEVuY29kZXIKKyogQHBhcmFtIHAgVGhlIHByb3BvcnRpb25hbCBnYWluIG9mIHRoZSBKYWd1YXIncyBQSUQgY29udHJvbGxlci4KKyogQHBhcmFtIGkgVGhlIGludGVncmFsIGdhaW4gb2YgdGhlIEphZ3VhcidzIFBJRCBjb250cm9sbGVyLgorKiBAcGFyYW0gZCBUaGUgZGlmZmVyZW50aWFsIGdhaW4gb2YgdGhlIEphZ3VhcidzIFBJRCBjb250cm9sbGVyLgorKi8KK3ZvaWQgQ0FOSmFndWFyOjpTZXRDdXJyZW50TW9kZShDQU5KYWd1YXI6OlF1YWRFbmNvZGVyU3RydWN0LCB1aW50MTZfdCBjb2Rlc1BlclJldiwgZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCkKK3sKKwlTZXRDb250cm9sTW9kZShrQ3VycmVudCk7CisJU2V0UG9zaXRpb25SZWZlcmVuY2UoTE1fUkVGX0VOQ09ERVIpOworCVNldFNwZWVkUmVmZXJlbmNlKExNX1JFRl9RVUFEX0VOQ09ERVIpOworCUNvbmZpZ0VuY29kZXJDb2Rlc1BlclJldihjb2Rlc1BlclJldik7CisJU2V0UElEKHAsIGksIGQpOworfQorCisvKioKKyogRW5hYmxlIGNvbnRyb2xsaW5nIHRoZSBtb3RvciBjdXJyZW50IHdpdGggYSBQSUQgbG9vcCwgYW5kIGVuYWJsZSBwb3NpdGlvbgorKiBzZW5zaW5nIGZyb20gYSBwb3RlbnRpb21ldGVyLjxicj4KKyogQWZ0ZXIgY2FsbGluZyB0aGlzIHlvdSBtdXN0IGNhbGwge0BsaW5rIENBTkphZ3VhciNFbmFibGVDb250cm9sKCl9IG9yIHtAbGluayBDQU5KYWd1YXIjRW5hYmxlQ29udHJvbChkb3VibGUpfSB0byBlbmFibGUgdGhlIGRldmljZS4KKyoKKyogQHBhcmFtIHBvdGVudGlvbWV0ZXIgVGhlIGNvbnN0YW50IENBTkphZ3Vhcjo6UG90ZW50aW9tZXRlcgorKiBAcGFyYW0gcCBUaGUgcHJvcG9ydGlvbmFsIGdhaW4gb2YgdGhlIEphZ3VhcidzIFBJRCBjb250cm9sbGVyLgorKiBAcGFyYW0gaSBUaGUgaW50ZWdyYWwgZ2FpbiBvZiB0aGUgSmFndWFyJ3MgUElEIGNvbnRyb2xsZXIuCisqIEBwYXJhbSBkIFRoZSBkaWZmZXJlbnRpYWwgZ2FpbiBvZiB0aGUgSmFndWFyJ3MgUElEIGNvbnRyb2xsZXIuCisqLwordm9pZCBDQU5KYWd1YXI6OlNldEN1cnJlbnRNb2RlKENBTkphZ3Vhcjo6UG90ZW50aW9tZXRlclN0cnVjdCwgZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCkKK3sKKwlTZXRDb250cm9sTW9kZShrQ3VycmVudCk7CisJU2V0UG9zaXRpb25SZWZlcmVuY2UoTE1fUkVGX1BPVCk7CisJU2V0U3BlZWRSZWZlcmVuY2UoTE1fUkVGX05PTkUpOworCUNvbmZpZ1BvdGVudGlvbWV0ZXJUdXJucygxKTsKKwlTZXRQSUQocCwgaSwgZCk7Cit9CisKKy8qKgorICogRW5hYmxlIGNvbnRyb2xsaW5nIHRoZSBzcGVlZCB3aXRoIGEgZmVlZGJhY2sgbG9vcCBmcm9tIGEgbm9uLXF1YWRyYXR1cmUKKyAqIGVuY29kZXIuPGJyPgorICogQWZ0ZXIgY2FsbGluZyB0aGlzIHlvdSBtdXN0IGNhbGwge0BsaW5rIENBTkphZ3VhciNFbmFibGVDb250cm9sKCl9IG9yIHtAbGluayBDQU5KYWd1YXIjRW5hYmxlQ29udHJvbChkb3VibGUpfSB0byBlbmFibGUgdGhlIGRldmljZS4KKyAqCisgKiBAcGFyYW0gZW5jb2RlciBUaGUgY29uc3RhbnQgQ0FOSmFndWFyOjpFbmNvZGVyCisgKiBAcGFyYW0gY29kZXNQZXJSZXYgVGhlIGNvdW50cyBwZXIgcmV2b2x1dGlvbiBvbiB0aGUgZW5jb2Rlci4KKyAqIEBwYXJhbSBwIFRoZSBwcm9wb3J0aW9uYWwgZ2FpbiBvZiB0aGUgSmFndWFyJ3MgUElEIGNvbnRyb2xsZXIuCisgKiBAcGFyYW0gaSBUaGUgaW50ZWdyYWwgZ2FpbiBvZiB0aGUgSmFndWFyJ3MgUElEIGNvbnRyb2xsZXIuCisgKiBAcGFyYW0gZCBUaGUgZGlmZmVyZW50aWFsIGdhaW4gb2YgdGhlIEphZ3VhcidzIFBJRCBjb250cm9sbGVyLgorICovCit2b2lkIENBTkphZ3Vhcjo6U2V0U3BlZWRNb2RlKENBTkphZ3Vhcjo6RW5jb2RlclN0cnVjdCwgdWludDE2X3QgY29kZXNQZXJSZXYsIGRvdWJsZSBwLCBkb3VibGUgaSwgZG91YmxlIGQpCit7CisJU2V0Q29udHJvbE1vZGUoa1NwZWVkKTsKKwlTZXRQb3NpdGlvblJlZmVyZW5jZShMTV9SRUZfTk9ORSk7CisJU2V0U3BlZWRSZWZlcmVuY2UoTE1fUkVGX0VOQ09ERVIpOworCUNvbmZpZ0VuY29kZXJDb2Rlc1BlclJldihjb2Rlc1BlclJldik7CisJU2V0UElEKHAsIGksIGQpOworfQorCisvKioKKyogRW5hYmxlIGNvbnRyb2xsaW5nIHRoZSBzcGVlZCB3aXRoIGEgZmVlZGJhY2sgbG9vcCBmcm9tIGEgcXVhZHJhdHVyZSBlbmNvZGVyLjxicj4KKyogQWZ0ZXIgY2FsbGluZyB0aGlzIHlvdSBtdXN0IGNhbGwge0BsaW5rIENBTkphZ3VhciNFbmFibGVDb250cm9sKCl9IG9yIHtAbGluayBDQU5KYWd1YXIjRW5hYmxlQ29udHJvbChkb3VibGUpfSB0byBlbmFibGUgdGhlIGRldmljZS4KKyoKKyogQHBhcmFtIGVuY29kZXIgVGhlIGNvbnN0YW50IENBTkphZ3Vhcjo6UXVhZEVuY29kZXIKKyogQHBhcmFtIGNvZGVzUGVyUmV2IFRoZSBjb3VudHMgcGVyIHJldm9sdXRpb24gb24gdGhlIGVuY29kZXIuCisqIEBwYXJhbSBwIFRoZSBwcm9wb3J0aW9uYWwgZ2FpbiBvZiB0aGUgSmFndWFyJ3MgUElEIGNvbnRyb2xsZXIuCisqIEBwYXJhbSBpIFRoZSBpbnRlZ3JhbCBnYWluIG9mIHRoZSBKYWd1YXIncyBQSUQgY29udHJvbGxlci4KKyogQHBhcmFtIGQgVGhlIGRpZmZlcmVudGlhbCBnYWluIG9mIHRoZSBKYWd1YXIncyBQSUQgY29udHJvbGxlci4KKyovCit2b2lkIENBTkphZ3Vhcjo6U2V0U3BlZWRNb2RlKENBTkphZ3Vhcjo6UXVhZEVuY29kZXJTdHJ1Y3QsIHVpbnQxNl90IGNvZGVzUGVyUmV2LCBkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkKQoreworCVNldENvbnRyb2xNb2RlKGtTcGVlZCk7CisJU2V0UG9zaXRpb25SZWZlcmVuY2UoTE1fUkVGX0VOQ09ERVIpOworCVNldFNwZWVkUmVmZXJlbmNlKExNX1JFRl9RVUFEX0VOQ09ERVIpOworCUNvbmZpZ0VuY29kZXJDb2Rlc1BlclJldihjb2Rlc1BlclJldik7CisJU2V0UElEKHAsIGksIGQpOworfQorCisvKioKKyAqIEVuYWJsZSBjb250cm9sbGluZyB0aGUgcG9zaXRpb24gd2l0aCBhIGZlZWRiYWNrIGxvb3AgdXNpbmcgYW4gZW5jb2Rlci48YnI+CisgKiBBZnRlciBjYWxsaW5nIHRoaXMgeW91IG11c3QgY2FsbCB7QGxpbmsgQ0FOSmFndWFyI0VuYWJsZUNvbnRyb2woKX0gb3Ige0BsaW5rIENBTkphZ3VhciNFbmFibGVDb250cm9sKGRvdWJsZSl9IHRvIGVuYWJsZSB0aGUgZGV2aWNlLgorICoKKyAqIEBwYXJhbSBlbmNvZGVyIFRoZSBjb25zdGFudCBDQU5KYWd1YXI6OlF1YWRFbmNvZGVyCisgKiBAcGFyYW0gY29kZXNQZXJSZXYgVGhlIGNvdW50cyBwZXIgcmV2b2x1dGlvbiBvbiB0aGUgZW5jb2Rlci4KKyAqIEBwYXJhbSBwIFRoZSBwcm9wb3J0aW9uYWwgZ2FpbiBvZiB0aGUgSmFndWFyJ3MgUElEIGNvbnRyb2xsZXIuCisgKiBAcGFyYW0gaSBUaGUgaW50ZWdyYWwgZ2FpbiBvZiB0aGUgSmFndWFyJ3MgUElEIGNvbnRyb2xsZXIuCisgKiBAcGFyYW0gZCBUaGUgZGlmZmVyZW50aWFsIGdhaW4gb2YgdGhlIEphZ3VhcidzIFBJRCBjb250cm9sbGVyLgorICoKKyAqLwordm9pZCBDQU5KYWd1YXI6OlNldFBvc2l0aW9uTW9kZShDQU5KYWd1YXI6OlF1YWRFbmNvZGVyU3RydWN0LCB1aW50MTZfdCBjb2Rlc1BlclJldiwgZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCkKK3sKKwlTZXRDb250cm9sTW9kZShrUG9zaXRpb24pOworCVNldFBvc2l0aW9uUmVmZXJlbmNlKExNX1JFRl9FTkNPREVSKTsKKwlDb25maWdFbmNvZGVyQ29kZXNQZXJSZXYoY29kZXNQZXJSZXYpOworCVNldFBJRChwLCBpLCBkKTsKK30KKworLyoqCisqIEVuYWJsZSBjb250cm9sbGluZyB0aGUgcG9zaXRpb24gd2l0aCBhIGZlZWRiYWNrIGxvb3AgdXNpbmcgYSBwb3RlbnRpb21ldGVyLjxicj4KKyogQWZ0ZXIgY2FsbGluZyB0aGlzIHlvdSBtdXN0IGNhbGwge0BsaW5rIENBTkphZ3VhciNFbmFibGVDb250cm9sKCl9IG9yIHtAbGluayBDQU5KYWd1YXIjRW5hYmxlQ29udHJvbChkb3VibGUpfSB0byBlbmFibGUgdGhlIGRldmljZS4KKyogQHBhcmFtIHAgVGhlIHByb3BvcnRpb25hbCBnYWluIG9mIHRoZSBKYWd1YXIncyBQSUQgY29udHJvbGxlci4KKyogQHBhcmFtIGkgVGhlIGludGVncmFsIGdhaW4gb2YgdGhlIEphZ3VhcidzIFBJRCBjb250cm9sbGVyLgorKiBAcGFyYW0gZCBUaGUgZGlmZmVyZW50aWFsIGdhaW4gb2YgdGhlIEphZ3VhcidzIFBJRCBjb250cm9sbGVyLgorKi8KK3ZvaWQgQ0FOSmFndWFyOjpTZXRQb3NpdGlvbk1vZGUoQ0FOSmFndWFyOjpQb3RlbnRpb21ldGVyU3RydWN0LCBkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkKQoreworCVNldENvbnRyb2xNb2RlKGtQb3NpdGlvbik7CisJU2V0UG9zaXRpb25SZWZlcmVuY2UoTE1fUkVGX1BPVCk7CisJQ29uZmlnUG90ZW50aW9tZXRlclR1cm5zKDEpOworCVNldFBJRChwLCBpLCBkKTsKK30KKworLyoqCisqIEVuYWJsZSBjb250cm9sbGluZyB0aGUgbW90b3Igdm9sdGFnZSB3aXRob3V0IGFueSBwb3NpdGlvbiBvciBzcGVlZCBmZWVkYmFjay48YnI+CisqIEFmdGVyIGNhbGxpbmcgdGhpcyB5b3UgbXVzdCBjYWxsIHtAbGluayBDQU5KYWd1YXIjRW5hYmxlQ29udHJvbCgpfSBvciB7QGxpbmsgQ0FOSmFndWFyI0VuYWJsZUNvbnRyb2woZG91YmxlKX0gdG8gZW5hYmxlIHRoZSBkZXZpY2UuCisqLwordm9pZCBDQU5KYWd1YXI6OlNldFZvbHRhZ2VNb2RlKCkKK3sKKwlTZXRDb250cm9sTW9kZShrVm9sdGFnZSk7CisJU2V0UG9zaXRpb25SZWZlcmVuY2UoTE1fUkVGX05PTkUpOworCVNldFNwZWVkUmVmZXJlbmNlKExNX1JFRl9OT05FKTsKK30KKworLyoqCisqIEVuYWJsZSBjb250cm9sbGluZyB0aGUgbW90b3Igdm9sdGFnZSB3aXRoIHNwZWVkIGZlZWRiYWNrIGZyb20gYQorKiBub24tcXVhZHJhdHVyZSBlbmNvZGVyIGFuZCBubyBwb3NpdGlvbiBmZWVkYmFjay48YnI+CisqIEFmdGVyIGNhbGxpbmcgdGhpcyB5b3UgbXVzdCBjYWxsIHtAbGluayBDQU5KYWd1YXIjRW5hYmxlQ29udHJvbCgpfSBvciB7QGxpbmsgQ0FOSmFndWFyI0VuYWJsZUNvbnRyb2woZG91YmxlKX0gdG8gZW5hYmxlIHRoZSBkZXZpY2UuCisqCisqIEBwYXJhbSBlbmNvZGVyIFRoZSBjb25zdGFudCBDQU5KYWd1YXI6OkVuY29kZXIKKyogQHBhcmFtIGNvZGVzUGVyUmV2IFRoZSBjb3VudHMgcGVyIHJldm9sdXRpb24gb24gdGhlIGVuY29kZXIKKyovCit2b2lkIENBTkphZ3Vhcjo6U2V0Vm9sdGFnZU1vZGUoQ0FOSmFndWFyOjpFbmNvZGVyU3RydWN0LCB1aW50MTZfdCBjb2Rlc1BlclJldikKK3sKKwlTZXRDb250cm9sTW9kZShrVm9sdGFnZSk7CisJU2V0UG9zaXRpb25SZWZlcmVuY2UoTE1fUkVGX05PTkUpOworCVNldFNwZWVkUmVmZXJlbmNlKExNX1JFRl9FTkNPREVSKTsKKwlDb25maWdFbmNvZGVyQ29kZXNQZXJSZXYoY29kZXNQZXJSZXYpOworfQorCisvKioKKyogRW5hYmxlIGNvbnRyb2xsaW5nIHRoZSBtb3RvciB2b2x0YWdlIHdpdGggcG9zaXRpb24gYW5kIHNwZWVkIGZlZWRiYWNrIGZyb20gYQorKiBxdWFkcmF0dXJlIGVuY29kZXIuPGJyPgorKiBBZnRlciBjYWxsaW5nIHRoaXMgeW91IG11c3QgY2FsbCB7QGxpbmsgQ0FOSmFndWFyI0VuYWJsZUNvbnRyb2woKX0gb3Ige0BsaW5rIENBTkphZ3VhciNFbmFibGVDb250cm9sKGRvdWJsZSl9IHRvIGVuYWJsZSB0aGUgZGV2aWNlLgorKgorKiBAcGFyYW0gZW5jb2RlciBUaGUgY29uc3RhbnQgQ0FOSmFndWFyOjpRdWFkRW5jb2RlcgorKiBAcGFyYW0gY29kZXNQZXJSZXYgVGhlIGNvdW50cyBwZXIgcmV2b2x1dGlvbiBvbiB0aGUgZW5jb2RlcgorKi8KK3ZvaWQgQ0FOSmFndWFyOjpTZXRWb2x0YWdlTW9kZShDQU5KYWd1YXI6OlF1YWRFbmNvZGVyU3RydWN0LCB1aW50MTZfdCBjb2Rlc1BlclJldikKK3sKKwlTZXRDb250cm9sTW9kZShrVm9sdGFnZSk7CisJU2V0UG9zaXRpb25SZWZlcmVuY2UoTE1fUkVGX0VOQ09ERVIpOworCVNldFNwZWVkUmVmZXJlbmNlKExNX1JFRl9RVUFEX0VOQ09ERVIpOworCUNvbmZpZ0VuY29kZXJDb2Rlc1BlclJldihjb2Rlc1BlclJldik7Cit9CisKKy8qKgorKiBFbmFibGUgY29udHJvbGxpbmcgdGhlIG1vdG9yIHZvbHRhZ2Ugd2l0aCBwb3NpdGlvbiBmZWVkYmFjayBmcm9tIGEKKyogcG90ZW50aW9tZXRlciBhbmQgbm8gc3BlZWQgZmVlZGJhY2suPGJyPgorKiBBZnRlciBjYWxsaW5nIHRoaXMgeW91IG11c3QgY2FsbCB7QGxpbmsgQ0FOSmFndWFyI0VuYWJsZUNvbnRyb2woKX0gb3Ige0BsaW5rIENBTkphZ3VhciNFbmFibGVDb250cm9sKGRvdWJsZSl9IHRvIGVuYWJsZSB0aGUgZGV2aWNlLgorKgorKiBAcGFyYW0gcG90ZW50aW9tZXRlciBUaGUgY29uc3RhbnQgQ0FOSmFndWFyOjpQb3RlbnRpb21ldGVyCisqLwordm9pZCBDQU5KYWd1YXI6OlNldFZvbHRhZ2VNb2RlKENBTkphZ3Vhcjo6UG90ZW50aW9tZXRlclN0cnVjdCkKK3sKKwlTZXRDb250cm9sTW9kZShrVm9sdGFnZSk7CisJU2V0UG9zaXRpb25SZWZlcmVuY2UoTE1fUkVGX1BPVCk7CisJU2V0U3BlZWRSZWZlcmVuY2UoTE1fUkVGX05PTkUpOworCUNvbmZpZ1BvdGVudGlvbWV0ZXJUdXJucygxKTsKK30KKworLyoqCisgKiBVc2VkIGludGVybmFsbHkuIEluIG9yZGVyIHRvIHNldCB0aGUgY29udHJvbCBtb2RlIHNlZSB0aGUgbWV0aG9kcyBsaXN0ZWQgYmVsb3cuCisgKiBDaGFuZ2UgdGhlIGNvbnRyb2wgbW9kZSBvZiB0aGlzIEphZ3VhciBvYmplY3QuCisgKgorICogQWZ0ZXIgY2hhbmdpbmcgbW9kZXMsIGNvbmZpZ3VyZSBhbnkgUElEIGNvbnN0YW50cyBvciBvdGhlciBzZXR0aW5ncyBuZWVkZWQKKyAqIGFuZCB0aGVuIEVuYWJsZUNvbnRyb2woKSB0byBhY3R1YWxseSBjaGFuZ2UgdGhlIG1vZGUgb24gdGhlIEphZ3Vhci4KKyAqCisgKiBAcGFyYW0gY29udHJvbE1vZGUgVGhlIG5ldyBtb2RlLgorICovCit2b2lkIENBTkphZ3Vhcjo6U2V0Q29udHJvbE1vZGUoQ29udHJvbE1vZGUgY29udHJvbE1vZGUpCit7CisJLy8gRGlzYWJsZSB0aGUgcHJldmlvdXMgbW9kZQorCURpc2FibGVDb250cm9sKCk7CisKKyAgaWYgKGNvbnRyb2xNb2RlID09IGtGb2xsb3dlcikKKyAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChJbmNvbXBhdGlibGVNb2RlLCAiVGhlIEphZ3VhciBvbmx5IHN1cHBvcnRzIEN1cnJlbnQsIFZvbHRhZ2UsIFBvc2l0aW9uLCBTcGVlZCwgYW5kIFBlcmNlbnQgKFRocm90dGxlKSBtb2Rlcy4iKTsKKworCS8vIFVwZGF0ZSB0aGUgbG9jYWwgbW9kZQorCW1fY29udHJvbE1vZGUgPSBjb250cm9sTW9kZTsKKwltX2NvbnRyb2xNb2RlVmVyaWZpZWQgPSBmYWxzZTsKKworCUhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9DQU5KYWd1YXIsIG1fZGV2aWNlTnVtYmVyLCBtX2NvbnRyb2xNb2RlKTsKK30KKworLyoqCisgKiBHZXQgdGhlIGFjdGl2ZSBjb250cm9sIG1vZGUgZnJvbSB0aGUgSmFndWFyLgorICoKKyAqIEFzayB0aGUgSmFnIHdoYXQgbW9kZSBpdCBpcyBpbi4KKyAqCisgKiBAcmV0dXJuIENvbnRyb2xNb2RlIHRoYXQgdGhlIEphZyBpcyBpbi4KKyAqLworQ0FOSmFndWFyOjpDb250cm9sTW9kZSBDQU5KYWd1YXI6OkdldENvbnRyb2xNb2RlKCkKK3sKKwlyZXR1cm4gbV9jb250cm9sTW9kZTsKK30KKworLyoqCisgKiBHZXQgdGhlIHZvbHRhZ2UgYXQgdGhlIGJhdHRlcnkgaW5wdXQgdGVybWluYWxzIG9mIHRoZSBKYWd1YXIuCisgKgorICogQHJldHVybiBUaGUgYnVzIHZvbHRhZ2UgaW4gdm9sdHMuCisgKi8KK2Zsb2F0IENBTkphZ3Vhcjo6R2V0QnVzVm9sdGFnZSgpCit7CisJdXBkYXRlUGVyaW9kaWNTdGF0dXMoKTsKKworCXJldHVybiBtX2J1c1ZvbHRhZ2U7Cit9CisKKy8qKgorICogR2V0IHRoZSB2b2x0YWdlIGJlaW5nIG91dHB1dCBmcm9tIHRoZSBtb3RvciB0ZXJtaW5hbHMgb2YgdGhlIEphZ3Vhci4KKyAqCisgKiBAcmV0dXJuIFRoZSBvdXRwdXQgdm9sdGFnZSBpbiB2b2x0cy4KKyAqLworZmxvYXQgQ0FOSmFndWFyOjpHZXRPdXRwdXRWb2x0YWdlKCkKK3sKKwl1cGRhdGVQZXJpb2RpY1N0YXR1cygpOworCisJcmV0dXJuIG1fb3V0cHV0Vm9sdGFnZTsKK30KKworLyoqCisgKiBHZXQgdGhlIGN1cnJlbnQgdGhyb3VnaCB0aGUgbW90b3IgdGVybWluYWxzIG9mIHRoZSBKYWd1YXIuCisgKgorICogQHJldHVybiBUaGUgb3V0cHV0IGN1cnJlbnQgaW4gYW1wcy4KKyAqLworZmxvYXQgQ0FOSmFndWFyOjpHZXRPdXRwdXRDdXJyZW50KCkKK3sKKwl1cGRhdGVQZXJpb2RpY1N0YXR1cygpOworCisJcmV0dXJuIG1fb3V0cHV0Q3VycmVudDsKK30KKworLyoqCisgKiBHZXQgdGhlIGludGVybmFsIHRlbXBlcmF0dXJlIG9mIHRoZSBKYWd1YXIuCisgKgorICogQHJldHVybiBUaGUgdGVtcGVyYXR1cmUgb2YgdGhlIEphZ3VhciBpbiBkZWdyZWVzIENlbHNpdXMuCisgKi8KK2Zsb2F0IENBTkphZ3Vhcjo6R2V0VGVtcGVyYXR1cmUoKQoreworCXVwZGF0ZVBlcmlvZGljU3RhdHVzKCk7CisKKwlyZXR1cm4gbV90ZW1wZXJhdHVyZTsKK30KKworLyoqCisgKiBHZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBlbmNvZGVyIG9yIHBvdGVudGlvbWV0ZXIuCisgKgorICogQHJldHVybiBUaGUgcG9zaXRpb24gb2YgdGhlIG1vdG9yIGluIHJvdGF0aW9ucyBiYXNlZCBvbiB0aGUgY29uZmlndXJlZCBmZWVkYmFjay4KKyAqIEBzZWUgQ0FOSmFndWFyI0NvbmZpZ1BvdGVudGlvbWV0ZXJUdXJucyhpbnQpCisgKiBAc2VlIENBTkphZ3VhciNDb25maWdFbmNvZGVyQ29kZXNQZXJSZXYoaW50KQorICovCitkb3VibGUgQ0FOSmFndWFyOjpHZXRQb3NpdGlvbigpCit7CisJdXBkYXRlUGVyaW9kaWNTdGF0dXMoKTsKKworCXJldHVybiBtX3Bvc2l0aW9uOworfQorCisvKioKKyAqIEdldCB0aGUgc3BlZWQgb2YgdGhlIGVuY29kZXIuCisgKgorICogQHJldHVybiBUaGUgc3BlZWQgb2YgdGhlIG1vdG9yIGluIFJQTSBiYXNlZCBvbiB0aGUgY29uZmlndXJlZCBmZWVkYmFjay4KKyAqLworZG91YmxlIENBTkphZ3Vhcjo6R2V0U3BlZWQoKQoreworCXVwZGF0ZVBlcmlvZGljU3RhdHVzKCk7CisKKwlyZXR1cm4gbV9zcGVlZDsKK30KKworLyoqCisgKiBHZXQgdGhlIHN0YXR1cyBvZiB0aGUgZm9yd2FyZCBsaW1pdCBzd2l0Y2guCisgKgorICogQHJldHVybiBUaGUgbW90b3IgaXMgYWxsb3dlZCB0byB0dXJuIGluIHRoZSBmb3J3YXJkIGRpcmVjdGlvbiB3aGVuIHRydWUuCisgKi8KK2Jvb2wgQ0FOSmFndWFyOjpHZXRGb3J3YXJkTGltaXRPSygpCit7CisJdXBkYXRlUGVyaW9kaWNTdGF0dXMoKTsKKworCXJldHVybiBtX2xpbWl0cyAmIGtGb3J3YXJkTGltaXQ7Cit9CisKKy8qKgorICogR2V0IHRoZSBzdGF0dXMgb2YgdGhlIHJldmVyc2UgbGltaXQgc3dpdGNoLgorICoKKyAqIEByZXR1cm4gVGhlIG1vdG9yIGlzIGFsbG93ZWQgdG8gdHVybiBpbiB0aGUgcmV2ZXJzZSBkaXJlY3Rpb24gd2hlbiB0cnVlLgorICovCitib29sIENBTkphZ3Vhcjo6R2V0UmV2ZXJzZUxpbWl0T0soKQoreworCXVwZGF0ZVBlcmlvZGljU3RhdHVzKCk7CisKKwlyZXR1cm4gbV9saW1pdHMgJiBrUmV2ZXJzZUxpbWl0OworfQorCisvKioKKyAqIEdldCB0aGUgc3RhdHVzIG9mIGFueSBmYXVsdHMgdGhlIEphZ3VhciBoYXMgZGV0ZWN0ZWQuCisgKgorICogQHJldHVybiBBIGJpdC1tYXNrIG9mIGZhdWx0cyBkZWZpbmVkIGJ5IHRoZSAiRmF1bHRzIiBlbnVtLgorICogQHNlZSAja0N1cnJlbnRGYXVsdAorICogQHNlZSAja0J1c1ZvbHRhZ2VGYXVsdAorICogQHNlZSAja1RlbXBlcmF0dXJlRmF1bHQKKyAqIEBzZWUgI2tHYXRlRHJpdmVyRmF1bHQKKyAqLwordWludDE2X3QgQ0FOSmFndWFyOjpHZXRGYXVsdHMoKQoreworCXVwZGF0ZVBlcmlvZGljU3RhdHVzKCk7CisKKwlyZXR1cm4gbV9mYXVsdHM7Cit9CisKKy8qKgorICogU2V0IHRoZSBtYXhpbXVtIHZvbHRhZ2UgY2hhbmdlIHJhdGUuCisgKgorICogV2hlbiBpbiBQZXJjZW50VmJ1cyBvciBWb2x0YWdlIG91dHB1dCBtb2RlLCB0aGUgcmF0ZSBhdCB3aGljaCB0aGUgdm9sdGFnZSBjaGFuZ2VzIGNhbgorICogYmUgbGltaXRlZCB0byByZWR1Y2UgY3VycmVudCBzcGlrZXMuICBTZXQgdGhpcyB0byAwLjAgdG8gZGlzYWJsZSByYXRlIGxpbWl0aW5nLgorICoKKyAqIEBwYXJhbSByYW1wUmF0ZSBUaGUgbWF4aW11bSByYXRlIG9mIHZvbHRhZ2UgY2hhbmdlIGluIFBlcmNlbnQgVm9sdGFnZSBtb2RlIGluIFYvcy4KKyAqLwordm9pZCBDQU5KYWd1YXI6OlNldFZvbHRhZ2VSYW1wUmF0ZShkb3VibGUgcmFtcFJhdGUpCit7CisJdWludDhfdCBkYXRhQnVmZmVyWzhdOworCXVpbnQ4X3QgZGF0YVNpemU7CisJdWludDMyX3QgbWVzc2FnZTsKKworCXN3aXRjaChtX2NvbnRyb2xNb2RlKQorCXsKKwljYXNlIGtQZXJjZW50VmJ1czoKKwkJZGF0YVNpemUgPSBwYWNrUGVyY2VudGFnZShkYXRhQnVmZmVyLCByYW1wUmF0ZSAvIChtX21heE91dHB1dFZvbHRhZ2UgKiBrQ29udHJvbGxlclJhdGUpKTsKKwkJbWVzc2FnZSA9IExNX0FQSV9WT0xUX1NFVF9SQU1QOworCQlicmVhazsKKwljYXNlIGtWb2x0YWdlOgorCQlkYXRhU2l6ZSA9IHBhY2tGWFA4XzgoZGF0YUJ1ZmZlciwgcmFtcFJhdGUgLyBrQ29udHJvbGxlclJhdGUpOworCQltZXNzYWdlID0gTE1fQVBJX1ZDT01QX0NPTVBfUkFNUDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoSW5jb21wYXRpYmxlTW9kZSwgIlNldFZvbHRhZ2VSYW1wUmF0ZSBvbmx5IGFwcGxpZXMgaW4gVm9sdGFnZSBhbmQgUGVyY2VudCBtb2RlIik7CisJCXJldHVybjsKKwl9CisKKwlzZW5kTWVzc2FnZShtZXNzYWdlLCBkYXRhQnVmZmVyLCBkYXRhU2l6ZSk7CisKKwltX3ZvbHRhZ2VSYW1wUmF0ZSA9IHJhbXBSYXRlOworCW1fdm9sdGFnZVJhbXBSYXRlVmVyaWZpZWQgPSBmYWxzZTsKK30KKworLyoqCisgKiBHZXQgdGhlIHZlcnNpb24gb2YgdGhlIGZpcm13YXJlIHJ1bm5pbmcgb24gdGhlIEphZ3Vhci4KKyAqCisgKiBAcmV0dXJuIFRoZSBmaXJtd2FyZSB2ZXJzaW9uLiAgMCBpZiB0aGUgZGV2aWNlIGRpZCBub3QgcmVzcG9uZC4KKyAqLwordWludDMyX3QgQ0FOSmFndWFyOjpHZXRGaXJtd2FyZVZlcnNpb24oKQoreworCXJldHVybiBtX2Zpcm13YXJlVmVyc2lvbjsKK30KKworLyoqCisgKiBHZXQgdGhlIHZlcnNpb24gb2YgdGhlIEphZ3VhciBoYXJkd2FyZS4KKyAqCisgKiBAcmV0dXJuIFRoZSBoYXJkd2FyZSB2ZXJzaW9uLiAxOiBKYWd1YXIsICAyOiBCbGFjayBKYWd1YXIKKyAqLwordWludDhfdCBDQU5KYWd1YXI6OkdldEhhcmR3YXJlVmVyc2lvbigpCit7CisJcmV0dXJuIG1faGFyZHdhcmVWZXJzaW9uOworfQorCisvKioKKyAqIENvbmZpZ3VyZSB3aGF0IHRoZSBjb250cm9sbGVyIGRvZXMgdG8gdGhlIEgtQnJpZGdlIHdoZW4gbmV1dHJhbCAobm90IGRyaXZpbmcgdGhlIG91dHB1dCkuCisgKgorICogVGhpcyBhbGxvd3MgeW91IHRvIG92ZXJyaWRlIHRoZSBqdW1wZXIgY29uZmlndXJhdGlvbiBmb3IgYnJha2Ugb3IgY29hc3QuCisgKgorICogQHBhcmFtIG1vZGUgU2VsZWN0IHRvIHVzZSB0aGUganVtcGVyIHNldHRpbmcgb3IgdG8gb3ZlcnJpZGUgaXQgdG8gY29hc3Qgb3IgYnJha2UuCisgKi8KK3ZvaWQgQ0FOSmFndWFyOjpDb25maWdOZXV0cmFsTW9kZShOZXV0cmFsTW9kZSBtb2RlKQoreworCXVpbnQ4X3QgZGF0YUJ1ZmZlcls4XTsKKworCS8vIFNldCB0aGUgbmV1dHJhbCBtb2RlCisJc2VuZE1lc3NhZ2UoTE1fQVBJX0NGR19CUkFLRV9DT0FTVCwgZGF0YUJ1ZmZlciwgc2l6ZW9mKHVpbnQ4X3QpKTsKKworCW1fbmV1dHJhbE1vZGUgPSBtb2RlOworCW1fbmV1dHJhbE1vZGVWZXJpZmllZCA9IGZhbHNlOworfQorCisvKioKKyAqIENvbmZpZ3VyZSBob3cgbWFueSBjb2RlcyBwZXIgcmV2b2x1dGlvbiBhcmUgZ2VuZXJhdGVkIGJ5IHlvdXIgZW5jb2Rlci4KKyAqCisgKiBAcGFyYW0gY29kZXNQZXJSZXYgVGhlIG51bWJlciBvZiBjb3VudHMgcGVyIHJldm9sdXRpb24gaW4gMVggbW9kZS4KKyAqLwordm9pZCBDQU5KYWd1YXI6OkNvbmZpZ0VuY29kZXJDb2Rlc1BlclJldih1aW50MTZfdCBjb2Rlc1BlclJldikKK3sKKwl1aW50OF90IGRhdGFCdWZmZXJbOF07CisJdWludDhfdCBkYXRhU2l6ZTsKKworCS8vIFNldCB0aGUgY29kZXMgcGVyIHJldm9sdXRpb24gbW9kZQorCWRhdGFTaXplID0gcGFja2ludDE2X3QoZGF0YUJ1ZmZlciwgY29kZXNQZXJSZXYpOworCXNlbmRNZXNzYWdlKExNX0FQSV9DRkdfRU5DX0xJTkVTLCBkYXRhQnVmZmVyLCBkYXRhU2l6ZSk7CisKKwltX2VuY29kZXJDb2Rlc1BlclJldiA9IGNvZGVzUGVyUmV2OworCW1fZW5jb2RlckNvZGVzUGVyUmV2VmVyaWZpZWQgPSBmYWxzZTsKK30KKworLyoqCisgKiBDb25maWd1cmUgdGhlIG51bWJlciBvZiB0dXJucyBvbiB0aGUgcG90ZW50aW9tZXRlci4KKyAqCisgKiBUaGVyZSBpcyBubyBzcGVjaWFsIHN1cHBvcnQgZm9yIGNvbnRpbnVvdXMgdHVybiBwb3RlbnRpb21ldGVycy4KKyAqIE9ubHkgaW50ZWdlciBudW1iZXJzIG9mIHR1cm5zIGFyZSBzdXBwb3J0ZWQuCisgKgorICogQHBhcmFtIHR1cm5zIFRoZSBudW1iZXIgb2YgdHVybnMgb2YgdGhlIHBvdGVudGlvbWV0ZXIuCisgKi8KK3ZvaWQgQ0FOSmFndWFyOjpDb25maWdQb3RlbnRpb21ldGVyVHVybnModWludDE2X3QgdHVybnMpCit7CisJdWludDhfdCBkYXRhQnVmZmVyWzhdOworCXVpbnQ4X3QgZGF0YVNpemU7CisKKwkvLyBTZXQgdGhlIHBvdCB0dXJucworCWRhdGFTaXplID0gcGFja2ludDE2X3QoZGF0YUJ1ZmZlciwgdHVybnMpOworCXNlbmRNZXNzYWdlKExNX0FQSV9DRkdfUE9UX1RVUk5TLCBkYXRhQnVmZmVyLCBkYXRhU2l6ZSk7CisKKwltX3BvdGVudGlvbWV0ZXJUdXJucyA9IHR1cm5zOworCW1fcG90ZW50aW9tZXRlclR1cm5zVmVyaWZpZWQgPSBmYWxzZTsKK30KKworLyoqCisgKiBDb25maWd1cmUgU29mdCBQb3NpdGlvbiBMaW1pdHMgd2hlbiBpbiBQb3NpdGlvbiBDb250cm9sbGVyIG1vZGUuCisgKgorICogV2hlbiBjb250cm9sbGluZyBwb3NpdGlvbiwgeW91IGNhbiBhZGQgYWRkaXRpb25hbCBsaW1pdHMgb24gdG9wIG9mIHRoZSBsaW1pdCBzd2l0Y2ggaW5wdXRzCisgKiB0aGF0IGFyZSBiYXNlZCBvbiB0aGUgcG9zaXRpb24gZmVlZGJhY2suICBJZiB0aGUgcG9zaXRpb24gbGltaXQgaXMgcmVhY2hlZCBvciB0aGUKKyAqIHN3aXRjaCBpcyBvcGVuZWQsIHRoYXQgZGlyZWN0aW9uIHdpbGwgYmUgZGlzYWJsZWQuCisgKgorCisgKiBAcGFyYW0gZm9yd2FyZExpbWl0UG9zaXRpb24gVGhlIHBvc2l0aW9uIHRoYXQgaWYgZXhjZWVkZWQgd2lsbCBkaXNhYmxlIHRoZSBmb3J3YXJkIGRpcmVjdGlvbi4KKyAqIEBwYXJhbSByZXZlcnNlTGltaXRQb3NpdGlvbiBUaGUgcG9zaXRpb24gdGhhdCBpZiBleGNlZWRlZCB3aWxsIGRpc2FibGUgdGhlIHJldmVyc2UgZGlyZWN0aW9uLgorICovCit2b2lkIENBTkphZ3Vhcjo6Q29uZmlnU29mdFBvc2l0aW9uTGltaXRzKGRvdWJsZSBmb3J3YXJkTGltaXRQb3NpdGlvbiwgZG91YmxlIHJldmVyc2VMaW1pdFBvc2l0aW9uKQoreworCUNvbmZpZ0xpbWl0TW9kZShrTGltaXRNb2RlX1NvZnRQb3NpdGlvbkxpbWl0cyk7CisJQ29uZmlnRm9yd2FyZExpbWl0KGZvcndhcmRMaW1pdFBvc2l0aW9uKTsKKwlDb25maWdSZXZlcnNlTGltaXQocmV2ZXJzZUxpbWl0UG9zaXRpb24pOworfQorCisvKioKKyAqIERpc2FibGUgU29mdCBQb3NpdGlvbiBMaW1pdHMgaWYgcHJldmlvdXNseSBlbmFibGVkLgorICoKKyAqIFNvZnQgUG9zaXRpb24gTGltaXRzIGFyZSBkaXNhYmxlZCBieSBkZWZhdWx0LgorICovCit2b2lkIENBTkphZ3Vhcjo6RGlzYWJsZVNvZnRQb3NpdGlvbkxpbWl0cygpCit7CisJQ29uZmlnTGltaXRNb2RlKGtMaW1pdE1vZGVfU3dpdGNoSW5wdXRzT25seSk7Cit9CisKKy8qKgorICogU2V0IHRoZSBsaW1pdCBtb2RlIGZvciBwb3NpdGlvbiBjb250cm9sIG1vZGUuCisgKgorICogVXNlIENvbmZpZ1NvZnRQb3NpdGlvbkxpbWl0cyBvciBEaXNhYmxlU29mdFBvc2l0aW9uTGltaXRzIHRvIHNldCB0aGlzCisgKiBhdXRvbWF0aWNhbGx5LgorICovCit2b2lkIENBTkphZ3Vhcjo6Q29uZmlnTGltaXRNb2RlKExpbWl0TW9kZSBtb2RlKQoreworCXVpbnQ4X3QgZGF0YUJ1ZmZlcls4XTsKKworCWRhdGFCdWZmZXJbMF0gPSBtb2RlOworCXNlbmRNZXNzYWdlKExNX0FQSV9DRkdfTElNSVRfTU9ERSwgZGF0YUJ1ZmZlciwgc2l6ZW9mKHVpbnQ4X3QpKTsKKworCW1fbGltaXRNb2RlID0gbW9kZTsKKwltX2xpbWl0TW9kZVZlcmlmaWVkID0gZmFsc2U7Cit9CisKKy8qKgorKiBTZXQgdGhlIHBvc2l0aW9uIHRoYXQgaWYgZXhjZWVkZWQgd2lsbCBkaXNhYmxlIHRoZSBmb3J3YXJkIGRpcmVjdGlvbi4KKyoKKyogVXNlIENvbmZpZ1NvZnRQb3NpdGlvbkxpbWl0cyB0byBzZXQgdGhpcyBhbmQgdGhlIGxpbWl0IG1vZGUgYXV0b21hdGljYWxseS4KKyovCit2b2lkIENBTkphZ3Vhcjo6Q29uZmlnRm9yd2FyZExpbWl0KGRvdWJsZSBmb3J3YXJkTGltaXRQb3NpdGlvbikKK3sKKwl1aW50OF90IGRhdGFCdWZmZXJbOF07CisJdWludDhfdCBkYXRhU2l6ZTsKKworCWRhdGFTaXplID0gcGFja0ZYUDE2XzE2KGRhdGFCdWZmZXIsIGZvcndhcmRMaW1pdFBvc2l0aW9uKTsKKwlkYXRhQnVmZmVyW2RhdGFTaXplKytdID0gMTsKKwlzZW5kTWVzc2FnZShMTV9BUElfQ0ZHX0xJTUlUX0ZXRCwgZGF0YUJ1ZmZlciwgZGF0YVNpemUpOworCisJbV9mb3J3YXJkTGltaXQgPSBmb3J3YXJkTGltaXRQb3NpdGlvbjsKKwltX2ZvcndhcmRMaW1pdFZlcmlmaWVkID0gZmFsc2U7Cit9CisKKy8qKgorKiBTZXQgdGhlIHBvc2l0aW9uIHRoYXQgaWYgZXhjZWVkZWQgd2lsbCBkaXNhYmxlIHRoZSByZXZlcnNlIGRpcmVjdGlvbi4KKyoKKyogVXNlIENvbmZpZ1NvZnRQb3NpdGlvbkxpbWl0cyB0byBzZXQgdGhpcyBhbmQgdGhlIGxpbWl0IG1vZGUgYXV0b21hdGljYWxseS4KKyovCit2b2lkIENBTkphZ3Vhcjo6Q29uZmlnUmV2ZXJzZUxpbWl0KGRvdWJsZSByZXZlcnNlTGltaXRQb3NpdGlvbikKK3sKKwl1aW50OF90IGRhdGFCdWZmZXJbOF07CisJdWludDhfdCBkYXRhU2l6ZTsKKworCWRhdGFTaXplID0gcGFja0ZYUDE2XzE2KGRhdGFCdWZmZXIsIHJldmVyc2VMaW1pdFBvc2l0aW9uKTsKKwlkYXRhQnVmZmVyW2RhdGFTaXplKytdID0gMDsKKwlzZW5kTWVzc2FnZShMTV9BUElfQ0ZHX0xJTUlUX1JFViwgZGF0YUJ1ZmZlciwgZGF0YVNpemUpOworCisJbV9yZXZlcnNlTGltaXQgPSByZXZlcnNlTGltaXRQb3NpdGlvbjsKKwltX3JldmVyc2VMaW1pdFZlcmlmaWVkID0gZmFsc2U7Cit9CisKKy8qKgorICogQ29uZmlndXJlIHRoZSBtYXhpbXVtIHZvbHRhZ2UgdGhhdCB0aGUgSmFndWFyIHdpbGwgZXZlciBvdXRwdXQuCisgKgorICogVGhpcyBjYW4gYmUgdXNlZCB0byBsaW1pdCB0aGUgbWF4aW11bSBvdXRwdXQgdm9sdGFnZSBpbiBhbGwgbW9kZXMgc28gdGhhdAorICogbW90b3JzIHdoaWNoIGNhbm5vdCB3aXRoc3RhbmQgZnVsbCBidXMgdm9sdGFnZSBjYW4gYmUgdXNlZCBzYWZlbHkuCisgKgorICogQHBhcmFtIHZvbHRhZ2UgVGhlIG1heGltdW0gdm9sdGFnZSBvdXRwdXQgYnkgdGhlIEphZ3Vhci4KKyAqLwordm9pZCBDQU5KYWd1YXI6OkNvbmZpZ01heE91dHB1dFZvbHRhZ2UoZG91YmxlIHZvbHRhZ2UpCit7CisJdWludDhfdCBkYXRhQnVmZmVyWzhdOworCXVpbnQ4X3QgZGF0YVNpemU7CisKKwlkYXRhU2l6ZSA9IHBhY2tGWFA4XzgoZGF0YUJ1ZmZlciwgdm9sdGFnZSk7CisJc2VuZE1lc3NhZ2UoTE1fQVBJX0NGR19NQVhfVk9VVCwgZGF0YUJ1ZmZlciwgZGF0YVNpemUpOworCisJbV9tYXhPdXRwdXRWb2x0YWdlID0gdm9sdGFnZTsKKwltX21heE91dHB1dFZvbHRhZ2VWZXJpZmllZCA9IGZhbHNlOworfQorCisvKioKKyAqIENvbmZpZ3VyZSBob3cgbG9uZyB0aGUgSmFndWFyIHdhaXRzIGluIHRoZSBjYXNlIG9mIGEgZmF1bHQgYmVmb3JlIHJlc3VtaW5nIG9wZXJhdGlvbi4KKyAqCisgKiBGYXVsdHMgaW5jbHVkZSBvdmVyIHRlbWVyYXR1cmUsIG92ZXIgY3VycmVudCwgYW5kIGJ1cyB1bmRlciB2b2x0YWdlLgorICogVGhlIGRlZmF1bHQgaXMgMy4wIHNlY29uZHMsIGJ1dCBjYW4gYmUgcmVkdWNlZCB0byBhcyBsb3cgYXMgMC41IHNlY29uZHMuCisgKgorICogQHBhcmFtIGZhdWx0VGltZSBUaGUgdGltZSB0byB3YWl0IGJlZm9yZSByZXN1bWluZyBvcGVyYXRpb24sIGluIHNlY29uZHMuCisgKi8KK3ZvaWQgQ0FOSmFndWFyOjpDb25maWdGYXVsdFRpbWUoZmxvYXQgZmF1bHRUaW1lKQoreworCXVpbnQ4X3QgZGF0YUJ1ZmZlcls4XTsKKwl1aW50OF90IGRhdGFTaXplOworCisJaWYoZmF1bHRUaW1lIDwgMC41KSBmYXVsdFRpbWUgPSAwLjU7CisJZWxzZSBpZihmYXVsdFRpbWUgPiAzLjApIGZhdWx0VGltZSA9IDMuMDsKKworCS8vIE1lc3NhZ2UgdGFrZXMgbXMKKwlkYXRhU2l6ZSA9IHBhY2tpbnQxNl90KGRhdGFCdWZmZXIsIChpbnQxNl90KShmYXVsdFRpbWUgKiAxMDAwLjApKTsKKwlzZW5kTWVzc2FnZShMTV9BUElfQ0ZHX0ZBVUxUX1RJTUUsIGRhdGFCdWZmZXIsIGRhdGFTaXplKTsKKworCW1fZmF1bHRUaW1lID0gZmF1bHRUaW1lOworCW1fZmF1bHRUaW1lVmVyaWZpZWQgPSBmYWxzZTsKK30KKworLyoqCisgKiBVcGRhdGUgYWxsIHRoZSBtb3RvcnMgdGhhdCBoYXZlIHBlbmRpbmcgc2V0cyBpbiB0aGUgc3luY0dyb3VwLgorICoKKyAqIEBwYXJhbSBzeW5jR3JvdXAgQSBiaXRtYXNrIG9mIGdyb3VwcyB0byBnZW5lcmF0ZSBzeW5jaHJvbm91cyBvdXRwdXQuCisgKi8KK3ZvaWQgQ0FOSmFndWFyOjpVcGRhdGVTeW5jR3JvdXAodWludDhfdCBzeW5jR3JvdXApCit7CisJc2VuZE1lc3NhZ2VIZWxwZXIoQ0FOX01TR0lEX0FQSV9TWU5DLCAmc3luY0dyb3VwLCBzaXplb2Yoc3luY0dyb3VwKSwgQ0FOX1NFTkRfUEVSSU9EX05PX1JFUEVBVCk7Cit9CisKKwordm9pZCBDQU5KYWd1YXI6OlNldEV4cGlyYXRpb24oZmxvYXQgdGltZW91dCkKK3sKKwlpZiAobV9zYWZldHlIZWxwZXIpIG1fc2FmZXR5SGVscGVyLT5TZXRFeHBpcmF0aW9uKHRpbWVvdXQpOworfQorCitmbG9hdCBDQU5KYWd1YXI6OkdldEV4cGlyYXRpb24oKQoreworCWlmICghbV9zYWZldHlIZWxwZXIpIHJldHVybiAwLjA7CisJcmV0dXJuIG1fc2FmZXR5SGVscGVyLT5HZXRFeHBpcmF0aW9uKCk7Cit9CisKK2Jvb2wgQ0FOSmFndWFyOjpJc0FsaXZlKCkKK3sKKwlpZiAoIW1fc2FmZXR5SGVscGVyKSByZXR1cm4gZmFsc2U7CisJcmV0dXJuIG1fc2FmZXR5SGVscGVyLT5Jc0FsaXZlKCk7Cit9CisKK2Jvb2wgQ0FOSmFndWFyOjpJc1NhZmV0eUVuYWJsZWQoKQoreworCWlmICghbV9zYWZldHlIZWxwZXIpIHJldHVybiBmYWxzZTsKKwlyZXR1cm4gbV9zYWZldHlIZWxwZXItPklzU2FmZXR5RW5hYmxlZCgpOworfQorCit2b2lkIENBTkphZ3Vhcjo6U2V0U2FmZXR5RW5hYmxlZChib29sIGVuYWJsZWQpCit7CisJaWYgKG1fc2FmZXR5SGVscGVyKSBtX3NhZmV0eUhlbHBlci0+U2V0U2FmZXR5RW5hYmxlZChlbmFibGVkKTsKK30KKwordm9pZCBDQU5KYWd1YXI6OkdldERlc2NyaXB0aW9uKGNoYXIgKmRlc2MpCit7CisJc3ByaW50ZihkZXNjLCAiQ0FOSmFndWFyIElEICVkIiwgbV9kZXZpY2VOdW1iZXIpOworfQorCit1aW50OF90IENBTkphZ3Vhcjo6R2V0RGV2aWNlSUQoKQoreworCXJldHVybiBtX2RldmljZU51bWJlcjsKK30KKworLyoqCisgKiBDb21tb24gaW50ZXJmYWNlIGZvciBzdG9wcGluZyB0aGUgbW90b3IKKyAqIFBhcnQgb2YgdGhlIE1vdG9yU2FmZXR5IGludGVyZmFjZQorICoKKyAqIEBkZXByZWNhdGVkIENhbGwgRGlzYWJsZUNvbnRyb2wgaW5zdGVhZC4KKyAqLwordm9pZCBDQU5KYWd1YXI6OlN0b3BNb3RvcigpCit7CisJRGlzYWJsZUNvbnRyb2woKTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvQ0FOVGFsb24uY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9DQU5UYWxvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNjZjVkMgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvQ0FOVGFsb24uY3BwCkBAIC0wLDAgKzEsMTIzMSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJDQU5UYWxvbi5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorI2luY2x1ZGUgImN0cmUvQ2FuVGFsb25TUlguaCIKKyNpbmNsdWRlIDx1bmlzdGQuaD4gLy8gdXNsZWVwCisvKioKKyAqIENvbnN0cnVjdG9yIGZvciB0aGUgQ0FOVGFsb24gZGV2aWNlLgorICogQHBhcmFtIGRldmljZU51bWJlciBUaGUgQ0FOIElEIG9mIHRoZSBUYWxvbiBTUlgKKyAqLworQ0FOVGFsb246OkNBTlRhbG9uKGludCBkZXZpY2VOdW1iZXIpCisJOiBtX2RldmljZU51bWJlcihkZXZpY2VOdW1iZXIpCisJLCBtX2ltcGwobmV3IENhblRhbG9uU1JYKGRldmljZU51bWJlcikpCisJLCBtX3NhZmV0eUhlbHBlcihuZXcgTW90b3JTYWZldHlIZWxwZXIodGhpcykpCisgICwgbV9wcm9maWxlKDApCisgICwgbV9jb250cm9sRW5hYmxlZCh0cnVlKQorICAsIG1fY29udHJvbE1vZGUoa1BlcmNlbnRWYnVzKQorICAsIG1fc2V0UG9pbnQoMCkKK3sKKyAgQXBwbHlDb250cm9sTW9kZShtX2NvbnRyb2xNb2RlKTsKKyAgbV9pbXBsLT5TZXRQcm9maWxlU2xvdFNlbGVjdChtX3Byb2ZpbGUpOworfQorLyoqCisgKiBDb25zdHJ1Y3RvciBmb3IgdGhlIENBTlRhbG9uIGRldmljZS4KKyAqIEBwYXJhbSBkZXZpY2VOdW1iZXIgVGhlIENBTiBJRCBvZiB0aGUgVGFsb24gU1JYCisgKiBAcGFyYW0gY29udHJvbFBlcmlvZE1zIFRoZSBwZXJpb2QgaW4gbXMgdG8gc2VuZCB0aGUgQ0FOIGNvbnRyb2wgZnJhbWUuCisgKgkJCQkJCQlQZXJpb2QgaXMgYm91bmRlZCB0byBbMW1zLCA5NW1zXS4KKyAqLworQ0FOVGFsb246OkNBTlRhbG9uKGludCBkZXZpY2VOdW1iZXIsaW50IGNvbnRyb2xQZXJpb2RNcykKKwk6IG1fZGV2aWNlTnVtYmVyKGRldmljZU51bWJlcikKKwksIG1faW1wbChuZXcgQ2FuVGFsb25TUlgoZGV2aWNlTnVtYmVyLGNvbnRyb2xQZXJpb2RNcykpIC8qIGJvdW5kZWQgdW5kZXJuZWF0aCB0byBiZSB3aXRoaW4gWzEgbXMsOTUgbXNdICovCisJLCBtX3NhZmV0eUhlbHBlcihuZXcgTW90b3JTYWZldHlIZWxwZXIodGhpcykpCisgICwgbV9wcm9maWxlKDApCisgICwgbV9jb250cm9sRW5hYmxlZCh0cnVlKQorICAsIG1fY29udHJvbE1vZGUoa1BlcmNlbnRWYnVzKQorICAsIG1fc2V0UG9pbnQoMCkKK3sKKyAgQXBwbHlDb250cm9sTW9kZShtX2NvbnRyb2xNb2RlKTsKKyAgbV9pbXBsLT5TZXRQcm9maWxlU2xvdFNlbGVjdChtX3Byb2ZpbGUpOworfQorQ0FOVGFsb246On5DQU5UYWxvbigpIHsKKwlkZWxldGUgbV9pbXBsOworCWRlbGV0ZSBtX3NhZmV0eUhlbHBlcjsKK30KKworLyoqCisqIFdyaXRlIG91dCB0aGUgUElEIHZhbHVlIGFzIHNlZW4gaW4gdGhlIFBJRE91dHB1dCBiYXNlIG9iamVjdC4KKyoKKyogQGRlcHJlY2F0ZWQgQ2FsbCBTZXQgaW5zdGVhZC4KKyoKKyogQHBhcmFtIG91dHB1dCBXcml0ZSBvdXQgdGhlIFBlcmNlbnRWYnVzIHZhbHVlIGFzIHdhcyBjb21wdXRlZCBieSB0aGUgUElEQ29udHJvbGxlcgorKi8KK3ZvaWQgQ0FOVGFsb246OlBJRFdyaXRlKGZsb2F0IG91dHB1dCkKK3sKKwlpZiAoR2V0Q29udHJvbE1vZGUoKSA9PSBrUGVyY2VudFZidXMpCisJeworCQlTZXQob3V0cHV0KTsKKwl9CisJZWxzZQorCXsKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoSW5jb21wYXRpYmxlTW9kZSwgIlBJRCBvbmx5IHN1cHBvcnRlZCBpbiBQZXJjZW50VmJ1cyBtb2RlIik7CisJfQorfQorCisvKioKKyAqIFRPRE8gZG9jdW1lbnRhdGlvbiAoc2VlIENBTkphZ3Vhci5jcHApCisgKi8KK2Zsb2F0IENBTlRhbG9uOjpHZXQoKQoreworICBpbnQgdmFsdWU7CisgIHN3aXRjaChtX2NvbnRyb2xNb2RlKSB7CisgICAgY2FzZSBrVm9sdGFnZToKKyAgICAgIHJldHVybiBHZXRPdXRwdXRWb2x0YWdlKCk7CisgICAgY2FzZSBrQ3VycmVudDoKKyAgICAgIHJldHVybiBHZXRPdXRwdXRDdXJyZW50KCk7CisgICAgY2FzZSBrU3BlZWQ6CisgICAgICBtX2ltcGwtPkdldFNlbnNvclZlbG9jaXR5KHZhbHVlKTsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICBjYXNlIGtQb3NpdGlvbjoKKyAgICAgIG1faW1wbC0+R2V0U2Vuc29yUG9zaXRpb24odmFsdWUpOworICAgICAgcmV0dXJuIHZhbHVlOworICAgIGNhc2Uga1BlcmNlbnRWYnVzOgorICAgIGRlZmF1bHQ6CisgICAgICBtX2ltcGwtPkdldEFwcGxpZWRUaHJvdHRsZSh2YWx1ZSk7CisgICAgICByZXR1cm4gKGZsb2F0KXZhbHVlIC8gMTAyMy4wOworICB9Cit9CisKKy8qKgorICogU2V0cyB0aGUgYXBwcm9wcmlhdGUgb3V0cHV0IG9uIHRoZSB0YWxvbiwgZGVwZW5kaW5nIG9uIHRoZSBtb2RlLgorICoKKyAqIEluIFBlcmNlbnRWYnVzLCB0aGUgb3V0cHV0IGlzIGJldHdlZW4gLTEuMCBhbmQgMS4wLCB3aXRoIDAuMCBhcyBzdG9wcGVkLgorICogSW4gVm9sdGFnZSBtb2RlLCBvdXRwdXRWYWx1ZSBpcyBpbiB2b2x0cy4KKyAqIEluIEN1cnJlbnQgbW9kZSwgb3V0cHV0VmFsdWUgaXMgaW4gYW1wZXJlcy4KKyAqIEluIFNwZWVkIG1vZGUsIG91dHB1dFZhbHVlIGlzIGluIHBvc2l0aW9uIGNoYW5nZSAvIDEwbXMuCisgKiBJbiBQb3NpdGlvbiBtb2RlLCBvdXRwdXRWYWx1ZSBpcyBpbiBlbmNvZGVyIHRpY2tzIG9yIGFuIGFuYWxvZyB2YWx1ZSwKKyAqICAgZGVwZW5kaW5nIG9uIHRoZSBzZW5zb3IuCisgKgorICogQHBhcmFtIG91dHB1dFZhbHVlIFRoZSBzZXRwb2ludCB2YWx1ZSwgYXMgZGVzY3JpYmVkIGFib3ZlLgorICogQHNlZSBTZWxlY3RQcm9maWxlU2xvdCB0byBjaG9vc2UgYmV0d2VlbiB0aGUgdHdvIHNldHMgb2YgZ2FpbnMuCisgKi8KK3ZvaWQgQ0FOVGFsb246OlNldChmbG9hdCB2YWx1ZSwgdWludDhfdCBzeW5jR3JvdXApCit7CisgIC8qIGZlZWQgc2FmZXR5IGhlbHBlciBzaW5jZSBjYWxsZXIganVzdCB1cGRhdGVkIG91ciBvdXRwdXQgKi8KKyAgbV9zYWZldHlIZWxwZXItPkZlZWQoKTsKKyAgaWYobV9jb250cm9sRW5hYmxlZCkgeworICAgIG1fc2V0UG9pbnQgPSB2YWx1ZTsKKyAgICBDVFJfQ29kZSBzdGF0dXMgPSBDVFJfT0tBWTsKKyAgICBzd2l0Y2gobV9jb250cm9sTW9kZSkgeworICAgICAgY2FzZSBDQU5TcGVlZENvbnRyb2xsZXI6OmtQZXJjZW50VmJ1czoKKyAgICAgICAgeworICAgICAgICAgIG1faW1wbC0+U2V0KHZhbHVlKTsKKyAgICAgICAgICBzdGF0dXMgPSBDVFJfT0tBWTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ0FOU3BlZWRDb250cm9sbGVyOjprRm9sbG93ZXI6CisgICAgICAgIHsKKyAgICAgICAgICBzdGF0dXMgPSBtX2ltcGwtPlNldERlbWFuZCgoaW50KXZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ0FOU3BlZWRDb250cm9sbGVyOjprVm9sdGFnZToKKyAgICAgICAgeworICAgICAgICAgIC8vIFZvbHRhZ2UgaXMgYW4gOC44IGZpeGVkIHBvaW50IG51bWJlci4KKyAgICAgICAgICBpbnQgdm9sdHMgPSBpbnQodmFsdWUgKiAyNTYpOworICAgICAgICAgIHN0YXR1cyA9IG1faW1wbC0+U2V0RGVtYW5kKHZvbHRzKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ0FOU3BlZWRDb250cm9sbGVyOjprU3BlZWQ6CisgICAgICAgIHN0YXR1cyA9IG1faW1wbC0+U2V0RGVtYW5kKHZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENBTlNwZWVkQ29udHJvbGxlcjo6a1Bvc2l0aW9uOgorICAgICAgICBzdGF0dXMgPSBtX2ltcGwtPlNldERlbWFuZCh2YWx1ZSk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKyAgICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICAgIH0KKworICAgIHN0YXR1cyA9IG1faW1wbC0+U2V0TW9kZVNlbGVjdChtX3NlbmRNb2RlKTsKKworICAgIGlmIChzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKyAgICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICAgIH0KKworICB9Cit9CisKKy8qKgorICogVE9ETyBkb2N1bWVudGF0aW9uIChzZWUgQ0FOSmFndWFyLmNwcCkKKyAqLwordm9pZCBDQU5UYWxvbjo6RGlzYWJsZSgpCit7CisgIC8vIFVudGlsIE1vZGVzIG90aGVyIHRoYW4gdGhyb3R0bGUgd29yaywganVzdCBkaXNhYmxlIGJ5IHNldHRpbmcgdGhyb3R0bGUgdG8gMC4wLgorICBtX2ltcGwtPlNldE1vZGVTZWxlY3QoKGludClDQU5UYWxvbjo6a0Rpc2FibGVkKTsKKyAgbV9jb250cm9sRW5hYmxlZCA9IGZhbHNlOworfQorCisvKioKKyAqIFRPRE8gZG9jdW1lbnRhdGlvbiAoc2VlIENBTkphZ3Vhci5jcHApCisgKi8KK3ZvaWQgQ0FOVGFsb246OkVuYWJsZUNvbnRyb2woKSB7CisgIFNldENvbnRyb2xNb2RlKG1fY29udHJvbE1vZGUpOworICBtX2NvbnRyb2xFbmFibGVkID0gdHJ1ZTsKK30KKworLyoqCisgKiBAcmV0dXJuIFdoZXRoZXIgdGhlIFRhbG9uIGlzIGN1cnJlbnRseSBlbmFibGVkLgorICovCitib29sIENBTlRhbG9uOjpJc0NvbnRyb2xFbmFibGVkKCkgeworICByZXR1cm4gbV9jb250cm9sRW5hYmxlZDsKK30KKworLyoqCisgKiBAcGFyYW0gcCBQcm9wb3J0aW9uYWwgY29uc3RhbnQgdG8gdXNlIGluIFBJRCBsb29wLgorICogQHNlZSBTZWxlY3RQcm9maWxlU2xvdCB0byBjaG9vc2UgYmV0d2VlbiB0aGUgdHdvIHNldHMgb2YgZ2FpbnMuCisgKi8KK3ZvaWQgQ0FOVGFsb246OlNldFAoZG91YmxlIHApCit7CisgIENUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+U2V0UGdhaW4obV9wcm9maWxlLCBwKTsKKwlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorfQorCisvKioKKyAqIFRPRE8gZG9jdW1lbnRhdGlvbiAoc2VlIENBTkphZ3Vhci5jcHApCisgKiBAc2VlIFNlbGVjdFByb2ZpbGVTbG90IHRvIGNob29zZSBiZXR3ZWVuIHRoZSB0d28gc2V0cyBvZiBnYWlucy4KKyAqLwordm9pZCBDQU5UYWxvbjo6U2V0SShkb3VibGUgaSkKK3sKKyAgQ1RSX0NvZGUgc3RhdHVzID0gbV9pbXBsLT5TZXRJZ2FpbihtX3Byb2ZpbGUsIGkpOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwl9Cit9CisKKy8qKgorICogVE9ETyBkb2N1bWVudGF0aW9uIChzZWUgQ0FOSmFndWFyLmNwcCkKKyAqIEBzZWUgU2VsZWN0UHJvZmlsZVNsb3QgdG8gY2hvb3NlIGJldHdlZW4gdGhlIHR3byBzZXRzIG9mIGdhaW5zLgorICovCit2b2lkIENBTlRhbG9uOjpTZXREKGRvdWJsZSBkKQoreworICBDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPlNldERnYWluKG1fcHJvZmlsZSwgZCk7CisJaWYoc3RhdHVzICE9IENUUl9PS0FZKSB7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KK30KKy8qKgorICoKKyAqIEBzZWUgU2VsZWN0UHJvZmlsZVNsb3QgdG8gY2hvb3NlIGJldHdlZW4gdGhlIHR3byBzZXRzIG9mIGdhaW5zLgorICovCit2b2lkIENBTlRhbG9uOjpTZXRGKGRvdWJsZSBmKQoreworICBDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPlNldEZnYWluKG1fcHJvZmlsZSwgZik7CisJaWYoc3RhdHVzICE9IENUUl9PS0FZKSB7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KK30KKy8qKgorICogU2V0IHRoZSBJem9uZSB0byBhIG5vbnplcm8gdmFsdWUgdG8gYXV0byBjbGVhciB0aGUgaW50ZWdyYWwgYWNjdW11bGF0b3IKKyAqCQl3aGVuIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBDbG9zZUxvb3BFcnJvciBleGNlZWRzIEl6b25lLgorICoKKyAqIEBzZWUgU2VsZWN0UHJvZmlsZVNsb3QgdG8gY2hvb3NlIGJldHdlZW4gdGhlIHR3byBzZXRzIG9mIGdhaW5zLgorICovCit2b2lkIENBTlRhbG9uOjpTZXRJem9uZSh1bnNpZ25lZCBpeikKK3sKKyAgQ1RSX0NvZGUgc3RhdHVzID0gbV9pbXBsLT5TZXRJem9uZShtX3Byb2ZpbGUsIGl6KTsKKwlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorfQorLyoqCisgKiBTUlggaGFzIHR3byBhdmFpbGFibGUgc2xvdHMgZm9yIFBJRC4KKyAqIEBwYXJhbSBzbG90SWR4IG9uZSBvciB6ZXJvIGRlcGVuZGluZyBvbiB3aGljaCBzbG90IGNhbGxlciB3YW50cy4KKyAqLwordm9pZCBDQU5UYWxvbjo6U2VsZWN0UHJvZmlsZVNsb3QoaW50IHNsb3RJZHgpCit7CisJbV9wcm9maWxlID0gKHNsb3RJZHggPT0gMCkgPyAwIDogMTsgLyogb25seSBnZXQgdHdvIHNsb3RzIGZvciBub3cgKi8KKwlDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPlNldFByb2ZpbGVTbG90U2VsZWN0KG1fcHJvZmlsZSk7CisJaWYoc3RhdHVzICE9IENUUl9PS0FZKSB7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KK30KKy8qKgorICogVE9ETyBkb2N1bWVudGF0aW9uIChzZWUgQ0FOSmFndWFyLmNwcCkKKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgbW9kaWZ5IEYtZ2Fpbi4gIENvbnNpZGVyYWJsZSBwYXNzaW5nIGEgemVybyBmb3IgZiB1c2luZworICogdGhlIGZvdXItcGFyYW1ldGVyIGZ1bmN0aW9uLgorICovCit2b2lkIENBTlRhbG9uOjpTZXRQSUQoZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCkKK3sKKwlTZXRQKHApOworCVNldEkoaSk7CisJU2V0RChkKTsKK30KK3ZvaWQgQ0FOVGFsb246OlNldFBJRChkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkLCBkb3VibGUgZikKK3sKKwlTZXRQKHApOworCVNldEkoaSk7CisJU2V0RChkKTsKKwlTZXRGKGYpOworfQorLyoqCisgKiBTZWxlY3QgdGhlIGZlZWRiYWNrIGRldmljZSB0byB1c2UgaW4gY2xvc2VkLWxvb3AKKyAqLwordm9pZCBDQU5UYWxvbjo6U2V0RmVlZGJhY2tEZXZpY2UoRmVlZGJhY2tEZXZpY2UgZGV2aWNlKQoreworCUNUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+U2V0RmVlZGJhY2tEZXZpY2VTZWxlY3QoKGludClkZXZpY2UpOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwl9Cit9CisvKioKKyAqIFNlbGVjdCB0aGUgZmVlZGJhY2sgZGV2aWNlIHRvIHVzZSBpbiBjbG9zZWQtbG9vcAorICovCit2b2lkIENBTlRhbG9uOjpTZXRTdGF0dXNGcmFtZVJhdGVNcyhTdGF0dXNGcmFtZVJhdGUgc3RhdGVGcmFtZSwgaW50IHBlcmlvZE1zKQoreworCUNUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+U2V0U3RhdHVzRnJhbWVSYXRlKChpbnQpc3RhdGVGcmFtZSxwZXJpb2RNcyk7CisJaWYoc3RhdHVzICE9IENUUl9PS0FZKSB7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KK30KKworLyoqCisgKiBUT0RPIGRvY3VtZW50YXRpb24gKHNlZSBDQU5KYWd1YXIuY3BwKQorICogQHNlZSBTZWxlY3RQcm9maWxlU2xvdCB0byBjaG9vc2UgYmV0d2VlbiB0aGUgdHdvIHNldHMgb2YgZ2FpbnMuCisgKi8KK2RvdWJsZSBDQU5UYWxvbjo6R2V0UCgpCit7CisgIENhblRhbG9uU1JYOjpwYXJhbV90IHBhcmFtID0gbV9wcm9maWxlID8gQ2FuVGFsb25TUlg6OmVQcm9maWxlUGFyYW1TbG90MV9QIDogQ2FuVGFsb25TUlg6OmVQcm9maWxlUGFyYW1TbG90MF9QOworICAvLyBVcGRhdGUgdGhlIGluZm8gaW4gbV9pbXBsLgorICBDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPlJlcXVlc3RQYXJhbShwYXJhbSk7CisJaWYoc3RhdHVzICE9IENUUl9PS0FZKSB7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICB9CisgIHVzbGVlcChrRGVsYXlGb3JTb2xpY2l0ZWRTaWduYWxzVXMpOyAvKiBzbWFsbCB5aWVsZCBmb3IgZ2V0dGluZyByZXNwb25zZSAqLworICBkb3VibGUgcDsKKyAgc3RhdHVzID0gbV9pbXBsLT5HZXRQZ2FpbihtX3Byb2ZpbGUsIHApOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwl9CisJcmV0dXJuIHA7Cit9CisKKy8qKgorICogVE9ETyBkb2N1bWVudGF0aW9uIChzZWUgQ0FOSmFndWFyLmNwcCkKKyAqIEBzZWUgU2VsZWN0UHJvZmlsZVNsb3QgdG8gY2hvb3NlIGJldHdlZW4gdGhlIHR3byBzZXRzIG9mIGdhaW5zLgorICovCitkb3VibGUgQ0FOVGFsb246OkdldEkoKQoreworICBDYW5UYWxvblNSWDo6cGFyYW1fdCBwYXJhbSA9IG1fcHJvZmlsZSA/IENhblRhbG9uU1JYOjplUHJvZmlsZVBhcmFtU2xvdDFfSSA6IENhblRhbG9uU1JYOjplUHJvZmlsZVBhcmFtU2xvdDBfSTsKKyAgLy8gVXBkYXRlIHRoZSBpbmZvIGluIG1faW1wbC4KKyAgQ1RSX0NvZGUgc3RhdHVzID0gbV9pbXBsLT5SZXF1ZXN0UGFyYW0ocGFyYW0pOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgfQorCXVzbGVlcChrRGVsYXlGb3JTb2xpY2l0ZWRTaWduYWxzVXMpOyAvKiBzbWFsbCB5aWVsZCBmb3IgZ2V0dGluZyByZXNwb25zZSAqLworCisgIGRvdWJsZSBpOworICBzdGF0dXMgPSBtX2ltcGwtPkdldElnYWluKG1fcHJvZmlsZSwgaSk7CisJaWYoc3RhdHVzICE9IENUUl9PS0FZKSB7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KKwlyZXR1cm4gaTsKK30KKworLyoqCisgKiBUT0RPIGRvY3VtZW50YXRpb24gKHNlZSBDQU5KYWd1YXIuY3BwKQorICogQHNlZSBTZWxlY3RQcm9maWxlU2xvdCB0byBjaG9vc2UgYmV0d2VlbiB0aGUgdHdvIHNldHMgb2YgZ2FpbnMuCisgKi8KK2RvdWJsZSBDQU5UYWxvbjo6R2V0RCgpCit7CisgIENhblRhbG9uU1JYOjpwYXJhbV90IHBhcmFtID0gbV9wcm9maWxlID8gQ2FuVGFsb25TUlg6OmVQcm9maWxlUGFyYW1TbG90MV9EIDogQ2FuVGFsb25TUlg6OmVQcm9maWxlUGFyYW1TbG90MF9EOworICAvLyBVcGRhdGUgdGhlIGluZm8gaW4gbV9pbXBsLgorICBDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPlJlcXVlc3RQYXJhbShwYXJhbSk7CisJaWYoc3RhdHVzICE9IENUUl9PS0FZKSB7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICB9CisJdXNsZWVwKGtEZWxheUZvclNvbGljaXRlZFNpZ25hbHNVcyk7IC8qIHNtYWxsIHlpZWxkIGZvciBnZXR0aW5nIHJlc3BvbnNlICovCisKKyAgZG91YmxlIGQ7CisgIHN0YXR1cyA9IG1faW1wbC0+R2V0RGdhaW4obV9wcm9maWxlLCBkKTsKKwlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorCXJldHVybiBkOworfQorLyoqCisgKgorICogQHNlZSBTZWxlY3RQcm9maWxlU2xvdCB0byBjaG9vc2UgYmV0d2VlbiB0aGUgdHdvIHNldHMgb2YgZ2FpbnMuCisgKi8KK2RvdWJsZSBDQU5UYWxvbjo6R2V0RigpCit7CisgIENhblRhbG9uU1JYOjpwYXJhbV90IHBhcmFtID0gbV9wcm9maWxlID8gQ2FuVGFsb25TUlg6OmVQcm9maWxlUGFyYW1TbG90MV9GIDogQ2FuVGFsb25TUlg6OmVQcm9maWxlUGFyYW1TbG90MF9GOworICAvLyBVcGRhdGUgdGhlIGluZm8gaW4gbV9pbXBsLgorICBDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPlJlcXVlc3RQYXJhbShwYXJhbSk7CisJaWYoc3RhdHVzICE9IENUUl9PS0FZKSB7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICB9CisKKwl1c2xlZXAoa0RlbGF5Rm9yU29saWNpdGVkU2lnbmFsc1VzKTsgIC8qIHNtYWxsIHlpZWxkIGZvciBnZXR0aW5nIHJlc3BvbnNlICovCisgIGRvdWJsZSBmOworICBzdGF0dXMgPSBtX2ltcGwtPkdldEZnYWluKG1fcHJvZmlsZSwgZik7CisJaWYoc3RhdHVzICE9IENUUl9PS0FZKSB7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KKwlyZXR1cm4gZjsKK30KKy8qKgorICogQHNlZSBTZWxlY3RQcm9maWxlU2xvdCB0byBjaG9vc2UgYmV0d2VlbiB0aGUgdHdvIHNldHMgb2YgZ2FpbnMuCisgKi8KK2ludCBDQU5UYWxvbjo6R2V0SXpvbmUoKQoreworICBDYW5UYWxvblNSWDo6cGFyYW1fdCBwYXJhbSA9IG1fcHJvZmlsZSA/IENhblRhbG9uU1JYOjplUHJvZmlsZVBhcmFtU2xvdDFfSVpvbmU6IENhblRhbG9uU1JYOjplUHJvZmlsZVBhcmFtU2xvdDBfSVpvbmU7CisgLy8gVXBkYXRlIHRoZSBpbmZvIGluIG1faW1wbC4KKyBDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPlJlcXVlc3RQYXJhbShwYXJhbSk7CisJaWYoc3RhdHVzICE9IENUUl9PS0FZKSB7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworIH0KKwl1c2xlZXAoa0RlbGF5Rm9yU29saWNpdGVkU2lnbmFsc1VzKTsKKworIGludCBpejsKKyBzdGF0dXMgPSBtX2ltcGwtPkdldEl6b25lKG1fcHJvZmlsZSwgaXopOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwl9CisJcmV0dXJuIGl6OworfQorCisvKioKKyAqIEByZXR1cm4gdGhlIGN1cnJlbnQgc2V0cG9pbnQ7IGllLCB3aGF0ZXZlciB3YXMgbGFzdCBwYXNzZWQgdG8gU2V0KCkuCisgKi8KK2RvdWJsZSBDQU5UYWxvbjo6R2V0U2V0cG9pbnQoKSB7CisgIHJldHVybiBtX3NldFBvaW50OworfQorCisvKioKKyAqIFJldHVybnMgdGhlIHZvbHRhZ2UgY29taW5nIGluIGZyb20gdGhlIGJhdHRlcnkuCisgKgorICogQHJldHVybiBUaGUgaW5wdXQgdm9sdGFnZSBpbiB2b2xzLgorICovCitmbG9hdCBDQU5UYWxvbjo6R2V0QnVzVm9sdGFnZSgpCit7CisgIGRvdWJsZSB2b2x0YWdlOworICBDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPkdldEJhdHRlcnlWKHZvbHRhZ2UpOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwl9CisgIHJldHVybiB2b2x0YWdlOworfQorCisvKioKKyAqIFRPRE8gZG9jdW1lbnRhdGlvbiAoc2VlIENBTkphZ3Vhci5jcHApCisgKi8KK2Zsb2F0IENBTlRhbG9uOjpHZXRPdXRwdXRWb2x0YWdlKCkKK3sKKyAgaW50IHRocm90dGxlMTE7CisgIENUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+R2V0QXBwbGllZFRocm90dGxlKHRocm90dGxlMTEpOworICBmbG9hdCB2b2x0YWdlID0gR2V0QnVzVm9sdGFnZSgpICogKGZsb2F0KHRocm90dGxlMTEpIC8gMTAyMy4wKTsKKwlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorCXJldHVybiB2b2x0YWdlOworfQorCisKKy8qKgorICogVE9ETyBkb2N1bWVudGF0aW9uIChzZWUgQ0FOSmFndWFyLmNwcCkKKyAqLworZmxvYXQgQ0FOVGFsb246OkdldE91dHB1dEN1cnJlbnQoKQoreworICBkb3VibGUgY3VycmVudDsKKworICBDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPkdldEN1cnJlbnQoY3VycmVudCk7CisJaWYoc3RhdHVzICE9IENUUl9PS0FZKSB7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KKworCXJldHVybiBjdXJyZW50OworfQorCisvKioKKyAqIFRPRE8gZG9jdW1lbnRhdGlvbiAoc2VlIENBTkphZ3Vhci5jcHApCisgKi8KK2Zsb2F0IENBTlRhbG9uOjpHZXRUZW1wZXJhdHVyZSgpCit7CisgIGRvdWJsZSB0ZW1wOworCisgIENUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+R2V0VGVtcCh0ZW1wKTsKKwlpZih0ZW1wICE9IENUUl9PS0FZKSB7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KKwlyZXR1cm4gdGVtcDsKK30KKy8qKgorICogU2V0IHRoZSBwb3NpdGlvbiB2YWx1ZSBvZiB0aGUgc2VsZWN0ZWQgc2Vuc29yLiAgVGhpcyBpcyB1c2VmdWwgZm9yIHplcm8taW5nIHF1YWRyYXR1cmUgZW5jb2RlcnMuCisgKiBDb250aW51b3VzIHNlbnNvcnMgKGxpa2UgYW5hbG9nIGVuY29kZXJlcykgY2FuIGFsc28gcGFydGlhbGx5IGJlIHNldCAodGhlIHBvcnRpb24gb2YgdGhlIHBvc3Rpb24gYmFzZWQgb24gb3ZlcmZsb3dzKS4KKyAqLwordm9pZCBDQU5UYWxvbjo6U2V0UG9zaXRpb24oZG91YmxlIHBvcykKK3sKKwltX2ltcGwtPlNldFNlbnNvclBvc2l0aW9uKHBvcyk7Cit9CisvKioKKyAqIFRPRE8gZG9jdW1lbnRhdGlvbiAoc2VlIENBTkphZ3Vhci5jcHApCisgKgorICogQHJldHVybiBUaGUgcG9zaXRpb24gb2YgdGhlIHNlbnNvciBjdXJyZW50bHkgcHJvdmlkaW5nIGZlZWRiYWNrLgorICogCQkJV2hlbiB1c2luZyBhbmFsb2cgc2Vuc29ycywgMCB1bml0cyBjb3JyZXNwb25kcyB0byAwViwgMTAyMyB1bml0cyBjb3JyZXNwb25kcyB0byAzLjNWCisgKiAJCQlXaGVuIHVzaW5nIGFuIGFuYWxvZyBlbmNvZGVyICh3cmFwcGluZyBhcm91bmQgMTAyMyA9PiAwIGlzIHBvc3NpYmxlKSB0aGUgdW5pdHMgYXJlIHN0aWxsIDMuM1YgcGVyIDEwMjMgdW5pdHMuCisgKiAJCQlXaGVuIHVzaW5nIHF1YWRyYXR1cmUsIGVhY2ggdW5pdCBpcyBhIHF1YWRyYXR1cmUgZWRnZSAoNFgpIG1vZGUuCisgKi8KK2RvdWJsZSBDQU5UYWxvbjo6R2V0UG9zaXRpb24oKQoreworICBpbnQgcG9zdGl0aW9uOworCisgIENUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+R2V0U2Vuc29yUG9zaXRpb24ocG9zdGl0aW9uKTsKKwlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorCXJldHVybiAoZG91YmxlKXBvc3RpdGlvbjsKK30KKy8qKgorICogSWYgc2Vuc29yIGFuZCBtb3RvciBhcmUgb3V0IG9mIHBoYXNlLCBzZW5zb3IgY2FuIGJlIGludmVydGVkIAorICogKHBvc2l0aW9uIGFuZCB2ZWxvY2l0eSBtdWx0aXBsaWVkIGJ5IC0xKS4KKyAqIEBzZWUgR2V0UG9zaXRpb24gYW5kIEBzZWUgR2V0U3BlZWQuCisgKi8KK3ZvaWQgQ0FOVGFsb246OlNldFNlbnNvckRpcmVjdGlvbihib29sIHJldmVyc2VTZW5zb3IpCit7CisgIENUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+U2V0UmV2RmVlZGJhY2tTZW5zb3IocmV2ZXJzZVNlbnNvciA/IDEgOiAwKTsKKwlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorfQorCisvKioKKyAqIFJldHVybnMgdGhlIGN1cnJlbnQgZXJyb3IgaW4gdGhlIGNvbnRyb2xsZXIuCisgKgorICogQHJldHVybiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzZXRwb2ludCBhbmQgdGhlIHNlbnNvciB2YWx1ZS4KKyAqLworaW50IENBTlRhbG9uOjpHZXRDbG9zZWRMb29wRXJyb3IoKSB7CisgIGludCBlcnJvcjsKKyAgQ1RSX0NvZGUgc3RhdHVzID0gbV9pbXBsLT5HZXRDbG9zZUxvb3BFcnIoZXJyb3IpOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwl9CisgIHJldHVybiBlcnJvcjsKK30KKworLyoqCisgKiBUT0RPIGRvY3VtZW50YXRpb24gKHNlZSBDQU5KYWd1YXIuY3BwKQorICoKKyAqIEByZXR1cm5zIFRoZSBzcGVlZCBvZiB0aGUgc2Vuc29yIGN1cnJlbnRseSBwcm92aWRpbmcgZmVlZGJhY2suCisgKgorICogVGhlIHNwZWVkIHVuaXRzIHdpbGwgYmUgaW4gdGhlIHNlbnNvcidzIG5hdGl2ZSB0aWNrcyBwZXIgMTAwbXMuCisgKgorICogRm9yIGFuYWxvZyBzZW5zb3JzLCAzLjNWIGNvcnJlc3BvbmRzIHRvIDEwMjMgdW5pdHMuCisgKiAJCVNvIGEgc3BlZWQgb2YgMjAwIGVxdWF0ZXMgdG8gfjAuNjQ1IGRWIHBlciAxMDBtcyBvciA2LjQ1MSBkViBwZXIgc2Vjb25kLgorICogCQlJZiB0aGlzIGlzIGFuIGFuYWxvZyBlbmNvZGVyLCB0aGF0IGxpa2VseSBtZWFucyAxLjk1NDggcm90YXRpb25zIHBlciBzZWMuCisgKiBGb3IgcXVhZHJhdHVyZSBlbmNvZGVycywgZWFjaCB1bml0IGNvcnJlc3BvbmRzIGEgcXVhZHJhdHVyZSBlZGdlICg0WCkuCisgKiAJCVNvIGEgMjUwIGNvdW50IGVuY29kZXIgd2lsbCBwcm9kdWNlIDEwMDAgZWRnZSBldmVudHMgcGVyIHJvdGF0aW9uLgorICogCQlBbiBleGFtcGxlIHNwZWVkIG9mIDIwMCB3b3VsZCB0aGVuIGVxdWF0ZSB0byAyMCUgb2YgYSByb3RhdGlvbiBwZXIgMTAwbXMsCisgKiAJCW9yIDEwIHJvdGF0aW9ucyBwZXIgc2Vjb25kLgorICovCitkb3VibGUgQ0FOVGFsb246OkdldFNwZWVkKCkKK3sKKyAgaW50IHNwZWVkOworICAvLyBUT0RPIGNvbnZlcnQgZnJvbSBpbnQgdG8gYXBwcm9wcmlhdGUgdW5pdHMgKG9yIGF0IGxlYXN0IGRvY3VtZW50IGl0KS4KKworICBDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPkdldFNlbnNvclZlbG9jaXR5KHNwZWVkKTsKKwlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorCXJldHVybiAoZG91YmxlKXNwZWVkOworfQorCisvKioKKyAqIEdldCB0aGUgcG9zaXRpb24gb2Ygd2hhdGV2ZXIgaXMgaW4gdGhlIGFuYWxvZyBwaW4gb2YgdGhlIFRhbG9uLCByZWdhcmRsZXNzIG9mCisgKiB3aGV0aGVyIGl0IGlzIGFjdHVhbGx5IGJlaW5nIHVzZWQgZm9yIGZlZWRiYWNrLgorICoKKyAqIEByZXR1cm5zIFRoZSAyNGJpdCBhbmFsb2cgdmFsdWUuICBUaGUgYm90dG9tIHRlbiBiaXRzIGlzIHRoZSBBREMgKDAgLSAxMDIzKSBvbiAKKyAqCQkJCQkJCQl0aGUgYW5hbG9nIHBpbiBvZiB0aGUgVGFsb24uIFRoZSB1cHBlciAxNCBiaXRzCisgKgkJCQkJCQkJdHJhY2tzIHRoZSBvdmVyZmxvd3MgYW5kIHVuZGVyZmxvd3MgKGNvbnRpbnVvdXMgc2Vuc29yKS4KKyAqLworaW50IENBTlRhbG9uOjpHZXRBbmFsb2dJbigpCit7CisgIGludCBwb3NpdGlvbjsKKyAgQ1RSX0NvZGUgc3RhdHVzID0gbV9pbXBsLT5HZXRBbmFsb2dJbldpdGhPdihwb3NpdGlvbik7CisJaWYoc3RhdHVzICE9IENUUl9PS0FZKSB7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KKyAgcmV0dXJuIHBvc2l0aW9uOworfQorLyoqCisgKiBHZXQgdGhlIHBvc2l0aW9uIG9mIHdoYXRldmVyIGlzIGluIHRoZSBhbmFsb2cgcGluIG9mIHRoZSBUYWxvbiwgcmVnYXJkbGVzcyBvZgorICogd2hldGhlciBpdCBpcyBhY3R1YWxseSBiZWluZyB1c2VkIGZvciBmZWVkYmFjay4KKyAqCisgKiBAcmV0dXJucyBUaGUgQURDICgwIC0gMTAyMykgb24gYW5hbG9nIHBpbiBvZiB0aGUgVGFsb24uCisgKi8KK2ludCBDQU5UYWxvbjo6R2V0QW5hbG9nSW5SYXcoKQoreworICAgIHJldHVybiBHZXRBbmFsb2dJbigpICYgMHgzRkY7Cit9CisvKioKKyAqIEdldCB0aGUgcG9zaXRpb24gb2Ygd2hhdGV2ZXIgaXMgaW4gdGhlIGFuYWxvZyBwaW4gb2YgdGhlIFRhbG9uLCByZWdhcmRsZXNzIG9mCisgKiB3aGV0aGVyIGl0IGlzIGFjdHVhbGx5IGJlaW5nIHVzZWQgZm9yIGZlZWRiYWNrLgorICoKKyAqIEByZXR1cm5zIFRoZSB2YWx1ZSAoMCAtIDEwMjMpIG9uIHRoZSBhbmFsb2cgcGluIG9mIHRoZSBUYWxvbi4KKyAqLworaW50IENBTlRhbG9uOjpHZXRBbmFsb2dJblZlbCgpCit7CisgIGludCB2ZWw7CisgIENUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+R2V0QW5hbG9nSW5WZWwodmVsKTsKKwlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorICByZXR1cm4gdmVsOworfQorCisvKioKKyAqIEdldCB0aGUgcG9zaXRpb24gb2Ygd2hhdGV2ZXIgaXMgaW4gdGhlIGFuYWxvZyBwaW4gb2YgdGhlIFRhbG9uLCByZWdhcmRsZXNzIG9mCisgKiB3aGV0aGVyIGl0IGlzIGFjdHVhbGx5IGJlaW5nIHVzZWQgZm9yIGZlZWRiYWNrLgorICoKKyAqIEByZXR1cm5zIFRoZSB2YWx1ZSAoMCAtIDEwMjMpIG9uIHRoZSBhbmFsb2cgcGluIG9mIHRoZSBUYWxvbi4KKyAqLworaW50IENBTlRhbG9uOjpHZXRFbmNQb3NpdGlvbigpCit7CisgIGludCBwb3NpdGlvbjsKKyAgQ1RSX0NvZGUgc3RhdHVzID0gbV9pbXBsLT5HZXRFbmNQb3NpdGlvbihwb3NpdGlvbik7CisJaWYoc3RhdHVzICE9IENUUl9PS0FZKSB7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KKyAgcmV0dXJuIHBvc2l0aW9uOworfQorCisvKioKKyAqIEdldCB0aGUgcG9zaXRpb24gb2Ygd2hhdGV2ZXIgaXMgaW4gdGhlIGFuYWxvZyBwaW4gb2YgdGhlIFRhbG9uLCByZWdhcmRsZXNzIG9mCisgKiB3aGV0aGVyIGl0IGlzIGFjdHVhbGx5IGJlaW5nIHVzZWQgZm9yIGZlZWRiYWNrLgorICoKKyAqIEByZXR1cm5zIFRoZSB2YWx1ZSAoMCAtIDEwMjMpIG9uIHRoZSBhbmFsb2cgcGluIG9mIHRoZSBUYWxvbi4KKyAqLworaW50IENBTlRhbG9uOjpHZXRFbmNWZWwoKQoreworICBpbnQgdmVsOworICBDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPkdldEVuY1ZlbCh2ZWwpOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwl9CisgIHJldHVybiB2ZWw7Cit9CisvKioKKyAqIEByZXR1cm4gSU8gbGV2ZWwgb2YgUVVBREEgcGluLgorICovCitpbnQgQ0FOVGFsb246OkdldFBpblN0YXRlUXVhZEEoKQoreworCWludCByZXR2YWw7CisJQ1RSX0NvZGUgc3RhdHVzID0gbV9pbXBsLT5HZXRRdWFkQXBpbihyZXR2YWwpOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKy8qKgorICogQHJldHVybiBJTyBsZXZlbCBvZiBRVUFEQiBwaW4uCisgKi8KK2ludCBDQU5UYWxvbjo6R2V0UGluU3RhdGVRdWFkQigpCit7CisJaW50IHJldHZhbDsKKwlDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPkdldFF1YWRCcGluKHJldHZhbCk7CisJaWYoc3RhdHVzICE9IENUUl9PS0FZKSB7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorLyoqCisgKiBAcmV0dXJuIElPIGxldmVsIG9mIFFVQUQgSW5kZXggcGluLgorICovCitpbnQgQ0FOVGFsb246OkdldFBpblN0YXRlUXVhZElkeCgpCit7CisJaW50IHJldHZhbDsKKwlDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPkdldFF1YWRJZHhwaW4ocmV0dmFsKTsKKwlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisvKioKKyAqIEByZXR1cm4gJzEnIGlmZiBmb3J3YXJkIGxpbWl0IHN3aXRjaCBpcyBjbG9zZWQsIDAgaWZmIHN3aXRjaCBpcyBvcGVuLgorICogVGhpcyBmdW5jdGlvbiB3b3JrcyByZWdhcmRsZXNzIGlmIGxpbWl0IHN3aXRjaCBmZWF0dXJlIGlzIGVuYWJsZWQuCisgKi8KK2ludCBDQU5UYWxvbjo6SXNGd2RMaW1pdFN3aXRjaENsb3NlZCgpCit7CisJaW50IHJldHZhbDsKKwlDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPkdldExpbWl0U3dpdGNoQ2xvc2VkRm9yKHJldHZhbCk7IC8qIHJlbmFtZSB0aGlzIGZ1bmMsICcxJyA9PiBvcGVuLCAnMCcgPT4gY2xvc2VkICovCisJaWYoc3RhdHVzICE9IENUUl9PS0FZKSB7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KKwlyZXR1cm4gcmV0dmFsID8gMCA6IDE7Cit9CisvKioKKyAqIEByZXR1cm4gJzEnIGlmZiByZXZlcnNlIGxpbWl0IHN3aXRjaCBpcyBjbG9zZWQsIDAgaWZmIHN3aXRjaCBpcyBvcGVuLgorICogVGhpcyBmdW5jdGlvbiB3b3JrcyByZWdhcmRsZXNzIGlmIGxpbWl0IHN3aXRjaCBmZWF0dXJlIGlzIGVuYWJsZWQuCisgKi8KK2ludCBDQU5UYWxvbjo6SXNSZXZMaW1pdFN3aXRjaENsb3NlZCgpCit7CisJaW50IHJldHZhbDsKKwlDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPkdldExpbWl0U3dpdGNoQ2xvc2VkUmV2KHJldHZhbCk7IC8qIHJlbmFtZSB0aGlzIGZ1bmMsICcxJyA9PiBvcGVuLCAnMCcgPT4gY2xvc2VkICovCisJaWYoc3RhdHVzICE9IENUUl9PS0FZKSB7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KKwlyZXR1cm4gcmV0dmFsID8gMCA6IDE7Cit9CisvKgorICogU2ltcGxlIGFjY2Vzc29yIGZvciB0cmFja2VkIHJpc2UgZXZlbnRzbyBpbmRleCBwaW4uCisgKiBAcmV0dXJuIG51bWJlciBvZiByaXNpbmcgZWRnZXMgb24gaWR4IHBpbi4KKyAqLworaW50IENBTlRhbG9uOjpHZXROdW1iZXJPZlF1YWRJZHhSaXNlcygpCit7CisJaW50IHJpc2VzOworCUNUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+R2V0RW5jSW5kZXhSaXNlRXZlbnRzKHJpc2VzKTsgLyogcmVuYW1lIHRoaXMgZnVuYywgJzEnID0+IG9wZW4sICcwJyA9PiBjbG9zZWQgKi8KKwlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorCXJldHVybiByaXNlczsKK30KKy8qCisgKiBAcGFyYW0gcmlzZXMgaW50ZWdyYWwgdmFsdWUgdG8gc2V0IGludG8gaW5kZXgtcmlzZXMgcmVnaXN0ZXIuICBHcmVhdCB3YXkgdG8gemVybyB0aGUgaW5kZXggY291bnQuCisgKi8KK3ZvaWQgQ0FOVGFsb246OlNldE51bWJlck9mUXVhZElkeFJpc2VzKGludCByaXNlcykKK3sKKwlDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPlNldFBhcmFtKENhblRhbG9uU1JYOjplRW5jSW5kZXhSaXNlRXZlbnRzLCByaXNlcyk7IC8qIHJlbmFtZSB0aGlzIGZ1bmMsICcxJyA9PiBvcGVuLCAnMCcgPT4gY2xvc2VkICovCisJaWYoc3RhdHVzICE9IENUUl9PS0FZKSB7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KK30KKy8qKgorICogVE9ETyBkb2N1bWVudGF0aW9uIChzZWUgQ0FOSmFndWFyLmNwcCkKKyAqLworYm9vbCBDQU5UYWxvbjo6R2V0Rm9yd2FyZExpbWl0T0soKQoreworCWludCBsaW1Td2l0PTA7CisJaW50IHNvZnRMaW09MDsKKwlDVFJfQ29kZSBzdGF0dXMgPSBDVFJfT0tBWTsKKwlzdGF0dXMgPSBtX2ltcGwtPkdldEZhdWx0X0ZvclNvZnRMaW0oc29mdExpbSk7CisJaWYoc3RhdHVzICE9IENUUl9PS0FZKSB7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KKwlzdGF0dXMgPSBtX2ltcGwtPkdldEZhdWx0X0ZvckxpbShsaW1Td2l0KTsKKwlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorCS8qIElmIGVpdGhlciBmYXVsdCBpcyBhc3NlcnRlZCwgc2lnbmFsIGNhbGxlciB3ZSBhcmUgZGlzYWJsZWQgKHdpdGggZmFsc2U/KSAqLworCXJldHVybiAoc29mdExpbSB8IGxpbVN3aXQpID8gZmFsc2UgOiB0cnVlOworfQorCisvKioKKyAqIFRPRE8gZG9jdW1lbnRhdGlvbiAoc2VlIENBTkphZ3Vhci5jcHApCisgKi8KK2Jvb2wgQ0FOVGFsb246OkdldFJldmVyc2VMaW1pdE9LKCkKK3sKKwlpbnQgbGltU3dpdD0wOworCWludCBzb2Z0TGltPTA7CisJQ1RSX0NvZGUgc3RhdHVzID0gQ1RSX09LQVk7CisJc3RhdHVzID0gbV9pbXBsLT5HZXRGYXVsdF9SZXZTb2Z0TGltKHNvZnRMaW0pOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwl9CisJc3RhdHVzID0gbV9pbXBsLT5HZXRGYXVsdF9SZXZMaW0obGltU3dpdCk7CisJaWYoc3RhdHVzICE9IENUUl9PS0FZKSB7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KKwkvKiBJZiBlaXRoZXIgZmF1bHQgaXMgYXNzZXJ0ZWQsIHNpZ25hbCBjYWxsZXIgd2UgYXJlIGRpc2FibGVkICh3aXRoIGZhbHNlPykgKi8KKwlyZXR1cm4gKHNvZnRMaW0gfCBsaW1Td2l0KSA/IGZhbHNlIDogdHJ1ZTsKK30KKworLyoqCisgKiBUT0RPIGRvY3VtZW50YXRpb24gKHNlZSBDQU5KYWd1YXIuY3BwKQorICovCit1aW50MTZfdCBDQU5UYWxvbjo6R2V0RmF1bHRzKCkKK3sKKwl1aW50MTZfdCByZXR2YWwgPSAwOworCWludCB2YWw7CisJQ1RSX0NvZGUgc3RhdHVzID0gQ1RSX09LQVk7CisKKwkvKiB0ZW1wZXJhdHVyZSAqLworCXZhbCA9IDA7CisJc3RhdHVzID0gbV9pbXBsLT5HZXRGYXVsdF9PdmVyVGVtcCh2YWwpOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJcmV0dmFsIHw9ICh2YWwpID8gQ0FOU3BlZWRDb250cm9sbGVyOjprVGVtcGVyYXR1cmVGYXVsdCA6IDA7CisKKwkvKiB2b2x0YWdlICovCisJdmFsID0gMDsKKwlzdGF0dXMgPSBtX2ltcGwtPkdldEZhdWx0X1VuZGVyVm9sdGFnZSh2YWwpOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJcmV0dmFsIHw9ICh2YWwpID8gQ0FOU3BlZWRDb250cm9sbGVyOjprQnVzVm9sdGFnZUZhdWx0IDogMDsKKworCS8qIGZ3ZC1saW1pdC1zd2l0Y2ggKi8KKwl2YWwgPSAwOworCXN0YXR1cyA9IG1faW1wbC0+R2V0RmF1bHRfRm9yTGltKHZhbCk7CisJaWYoc3RhdHVzICE9IENUUl9PS0FZKQorCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwlyZXR2YWwgfD0gKHZhbCkgPyBDQU5TcGVlZENvbnRyb2xsZXI6OmtGd2RMaW1pdFN3aXRjaCA6IDA7CisKKwkvKiByZXYtbGltaXQtc3dpdGNoICovCisJdmFsID0gMDsKKwlzdGF0dXMgPSBtX2ltcGwtPkdldEZhdWx0X1JldkxpbSh2YWwpOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJcmV0dmFsIHw9ICh2YWwpID8gQ0FOU3BlZWRDb250cm9sbGVyOjprUmV2TGltaXRTd2l0Y2ggOiAwOworCisJLyogZndkLXNvZnQtbGltaXQgKi8KKwl2YWwgPSAwOworCXN0YXR1cyA9IG1faW1wbC0+R2V0RmF1bHRfRm9yU29mdExpbSh2YWwpOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJcmV0dmFsIHw9ICh2YWwpID8gQ0FOU3BlZWRDb250cm9sbGVyOjprRndkU29mdExpbWl0IDogMDsKKworCS8qIHJldi1zb2Z0LWxpbWl0ICovCisJdmFsID0gMDsKKwlzdGF0dXMgPSBtX2ltcGwtPkdldEZhdWx0X1JldlNvZnRMaW0odmFsKTsKKwlpZihzdGF0dXMgIT0gQ1RSX09LQVkpCisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCXJldHZhbCB8PSAodmFsKSA/IENBTlNwZWVkQ29udHJvbGxlcjo6a1JldlNvZnRMaW1pdCA6IDA7CisKKwlyZXR1cm4gcmV0dmFsOworfQordWludDE2X3QgQ0FOVGFsb246OkdldFN0aWNreUZhdWx0cygpCit7CisJdWludDE2X3QgcmV0dmFsID0gMDsKKwlpbnQgdmFsOworCUNUUl9Db2RlIHN0YXR1cyA9IENUUl9PS0FZOworCisJLyogdGVtcGVyYXR1cmUgKi8KKwl2YWwgPSAwOworCXN0YXR1cyA9IG1faW1wbC0+R2V0U3Rja3lGYXVsdF9PdmVyVGVtcCh2YWwpOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJcmV0dmFsIHw9ICh2YWwpID8gQ0FOU3BlZWRDb250cm9sbGVyOjprVGVtcGVyYXR1cmVGYXVsdCA6IDA7CisKKwkvKiB2b2x0YWdlICovCisJdmFsID0gMDsKKwlzdGF0dXMgPSBtX2ltcGwtPkdldFN0Y2t5RmF1bHRfVW5kZXJWb2x0YWdlKHZhbCk7CisJaWYoc3RhdHVzICE9IENUUl9PS0FZKQorCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwlyZXR2YWwgfD0gKHZhbCkgPyBDQU5TcGVlZENvbnRyb2xsZXI6OmtCdXNWb2x0YWdlRmF1bHQgOiAwOworCisJLyogZndkLWxpbWl0LXN3aXRjaCAqLworCXZhbCA9IDA7CisJc3RhdHVzID0gbV9pbXBsLT5HZXRTdGNreUZhdWx0X0ZvckxpbSh2YWwpOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJcmV0dmFsIHw9ICh2YWwpID8gQ0FOU3BlZWRDb250cm9sbGVyOjprRndkTGltaXRTd2l0Y2ggOiAwOworCisJLyogcmV2LWxpbWl0LXN3aXRjaCAqLworCXZhbCA9IDA7CisJc3RhdHVzID0gbV9pbXBsLT5HZXRTdGNreUZhdWx0X1JldkxpbSh2YWwpOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJcmV0dmFsIHw9ICh2YWwpID8gQ0FOU3BlZWRDb250cm9sbGVyOjprUmV2TGltaXRTd2l0Y2ggOiAwOworCisJLyogZndkLXNvZnQtbGltaXQgKi8KKwl2YWwgPSAwOworCXN0YXR1cyA9IG1faW1wbC0+R2V0U3Rja3lGYXVsdF9Gb3JTb2Z0TGltKHZhbCk7CisJaWYoc3RhdHVzICE9IENUUl9PS0FZKQorCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwlyZXR2YWwgfD0gKHZhbCkgPyBDQU5TcGVlZENvbnRyb2xsZXI6OmtGd2RTb2Z0TGltaXQgOiAwOworCisJLyogcmV2LXNvZnQtbGltaXQgKi8KKwl2YWwgPSAwOworCXN0YXR1cyA9IG1faW1wbC0+R2V0U3Rja3lGYXVsdF9SZXZTb2Z0TGltKHZhbCk7CisJaWYoc3RhdHVzICE9IENUUl9PS0FZKQorCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwlyZXR2YWwgfD0gKHZhbCkgPyBDQU5TcGVlZENvbnRyb2xsZXI6OmtSZXZTb2Z0TGltaXQgOiAwOworCisJcmV0dXJuIHJldHZhbDsKK30KK3ZvaWQgQ0FOVGFsb246OkNsZWFyU3RpY2t5RmF1bHRzKCkKK3sKKwlDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPkNsZWFyU3RpY2t5RmF1bHRzKCk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogU2V0IHRoZSBtYXhpbXVtIHZvbHRhZ2UgY2hhbmdlIHJhdGUuICBUaGlzIHJhbXAgcmF0ZSBpcyBpbiBhZmZlY3QgcmVnYXJkbGVzcyBvZiB3aGljaCBjb250cm9sIG1vZGUKKyAqIHRoZSBUQUxPTiBpcyBpbi4KKyAqCisgKiBXaGVuIGluIFBlcmNlbnRWYnVzIG9yIFZvbHRhZ2Ugb3V0cHV0IG1vZGUsIHRoZSByYXRlIGF0IHdoaWNoIHRoZSB2b2x0YWdlIGNoYW5nZXMgY2FuCisgKiBiZSBsaW1pdGVkIHRvIHJlZHVjZSBjdXJyZW50IHNwaWtlcy4gIFNldCB0aGlzIHRvIDAuMCB0byBkaXNhYmxlIHJhdGUgbGltaXRpbmcuCisgKgorICogQHBhcmFtIHJhbXBSYXRlIFRoZSBtYXhpbXVtIHJhdGUgb2Ygdm9sdGFnZSBjaGFuZ2UgaW4gUGVyY2VudCBWb2x0YWdlIG1vZGUgaW4gVi9zLgorICovCit2b2lkIENBTlRhbG9uOjpTZXRWb2x0YWdlUmFtcFJhdGUoZG91YmxlIHJhbXBSYXRlKQoreworCS8qIENhbGxlciBpcyBleHByZXNzaW5nIHJhbXAgYXMgVm9sdGFnZSBwZXIgc2VjLCBhc3N1bWluZyAxMlYgaXMgZnVsbC4KKwkJVGFsb24ncyB0aHJvdHRsZSByYW1wIGlzIGluIGRUaHJvdC9kMTBtcy4gIDEwMjMgaXMgZnVsbCBmd2QsIC0xMDIzIGlzIGZ1bGwgcmV2LiAqLworCWRvdWJsZSByYW1wUmF0ZWRUaHJvdFBlcjEwbXMgPSAocmFtcFJhdGUqMTAyMy4wLzEyLjApIC8gMTAwOworCUNUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+U2V0UmFtcFRocm90dGxlKChpbnQpcmFtcFJhdGVkVGhyb3RQZXIxMG1zKTsKKwlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorfQorLyoqCisgKiBTZXRzIGEgdm9sdGFnZSBjaGFuZ2UgcmF0ZSB0aGF0IGFwcGxpZXMgb25seSB3aGVuIGEgY2xvc2UgbG9vcCBjb250b3JsIG1vZGUgaXMgZW5hYmxlZC4KKyAqIFRoaXMgYWxsb3dzIGNsb3NlIGxvb3Agc3BlY2lmaWMgcmFtcCBiZWhhdmlvci4KKyAqCisgKiBAcGFyYW0gcmFtcFJhdGUgVGhlIG1heGltdW0gcmF0ZSBvZiB2b2x0YWdlIGNoYW5nZSBpbiBQZXJjZW50IFZvbHRhZ2UgbW9kZSBpbiBWL3MuCisgKi8KK3ZvaWQgQ0FOVGFsb246OlNldENsb3NlTG9vcFJhbXBSYXRlKGRvdWJsZSByYW1wUmF0ZSkKK3sKKwkgIENUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+U2V0Q2xvc2VMb29wUmFtcFJhdGUobV9wcm9maWxlLHJhbXBSYXRlICogMTAyMy4wIC8gMTIuMCAvIDEwMDAuMCk7CisJCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJCX0KK30KKworLyoqCisgKiBAcmV0dXJuIFRoZSB2ZXJzaW9uIG9mIHRoZSBmaXJtd2FyZSBydW5uaW5nIG9uIHRoZSBUYWxvbgorICovCit1aW50MzJfdCBDQU5UYWxvbjo6R2V0RmlybXdhcmVWZXJzaW9uKCkKK3sKKwlpbnQgZmlybXdhcmVWZXJzaW9uOworCUNUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+UmVxdWVzdFBhcmFtKENhblRhbG9uU1JYOjplRmlybVZlcnMpOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwl9CisJdXNsZWVwKGtEZWxheUZvclNvbGljaXRlZFNpZ25hbHNVcyk7CisJc3RhdHVzID0gbV9pbXBsLT5HZXRQYXJhbVJlc3BvbnNlSW50MzIoQ2FuVGFsb25TUlg6OmVGaXJtVmVycyxmaXJtd2FyZVZlcnNpb24pOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwl9CisKKwkvKiBvbmx5IHNlbnQgb25jZSBvbiBib290ICovCisJLy9DVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPkdldEZpcm1WZXJzKGZpcm13YXJlVmVyc2lvbik7CisJLy9pZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkvLwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwkvL30KKworCXJldHVybiBmaXJtd2FyZVZlcnNpb247Cit9CisvKioKKyAqIEByZXR1cm4gVGhlIGFjY3VtdWxhdG9yIGZvciBJIGdhaW4uCisgKi8KK2ludCBDQU5UYWxvbjo6R2V0SWFjY3VtKCkKK3sKKwlDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPlJlcXVlc3RQYXJhbShDYW5UYWxvblNSWDo6ZVBpZElhY2N1bSk7CisJaWYoc3RhdHVzICE9IENUUl9PS0FZKSB7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KKwl1c2xlZXAoa0RlbGF5Rm9yU29saWNpdGVkU2lnbmFsc1VzKTsgLyogc21hbGwgeWllbGQgZm9yIGdldHRpbmcgcmVzcG9uc2UgKi8KKwlpbnQgaWFjY3VtOworCXN0YXR1cyA9IG1faW1wbC0+R2V0UGFyYW1SZXNwb25zZUludDMyKENhblRhbG9uU1JYOjplUGlkSWFjY3VtLGlhY2N1bSk7CisJaWYoc3RhdHVzICE9IENUUl9PS0FZKSB7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KKwlyZXR1cm4gaWFjY3VtOworfQorLyoqCisgKiBDbGVhciB0aGUgYWNjdW11bGF0b3IgZm9yIEkgZ2Fpbi4KKyAqLwordm9pZCBDQU5UYWxvbjo6Q2xlYXJJYWNjdW0oKQoreworCUNUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+U2V0UGFyYW0oQ2FuVGFsb25TUlg6OmVQaWRJYWNjdW0sIDApOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwl9Cit9CisKKy8qKgorICogVE9ETyBkb2N1bWVudGF0aW9uIChzZWUgQ0FOSmFndWFyLmNwcCkKKyAqLwordm9pZCBDQU5UYWxvbjo6Q29uZmlnTmV1dHJhbE1vZGUoTmV1dHJhbE1vZGUgbW9kZSkKK3sKKwlDVFJfQ29kZSBzdGF0dXMgPSBDVFJfT0tBWTsKKwlzd2l0Y2gobW9kZSl7CisJCWRlZmF1bHQ6CisJCWNhc2Uga05ldXRyYWxNb2RlX0p1bXBlcjogLyogdXNlIGRlZmF1bHQgc2V0dGluZyBpbiBmbGFzaCBiYXNlZCBvbiB3ZWJkYXNoL0JyYWtlQ2FsIGJ1dHRvbiBzZWxlY3Rpb24gKi8KKwkJCXN0YXR1cyA9IG1faW1wbC0+U2V0T3ZlcnJpZGVCcmFrZVR5cGUoQ2FuVGFsb25TUlg6OmtCcmFrZU92ZXJyaWRlX1VzZURlZmF1bHRzRnJvbUZsYXNoKTsKKwkJCWJyZWFrOworCQljYXNlIGtOZXV0cmFsTW9kZV9CcmFrZToKKwkJCXN0YXR1cyA9IG1faW1wbC0+U2V0T3ZlcnJpZGVCcmFrZVR5cGUoQ2FuVGFsb25TUlg6OmtCcmFrZU92ZXJyaWRlX092ZXJyaWRlQnJha2UpOworCQkJYnJlYWs7CisJCWNhc2Uga05ldXRyYWxNb2RlX0NvYXN0OgorCQkJc3RhdHVzID0gbV9pbXBsLT5TZXRPdmVycmlkZUJyYWtlVHlwZShDYW5UYWxvblNSWDo6a0JyYWtlT3ZlcnJpZGVfT3ZlcnJpZGVDb2FzdCk7CisJCQlicmVhazsKKwl9CisJaWYoc3RhdHVzICE9IENUUl9PS0FZKSB7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KK30KKy8qKgorICogQHJldHVybiBub256ZXJvIGlmIGJyYWtlIGlzIGVuYWJsZWQgZHVyaW5nIG5ldXRyYWwuICBaZXJvIGlmIGNvYXN0IGlzIGVuYWJsZWQgZHVyaW5nIG5ldXRyYWwuCisgKi8KK2ludCBDQU5UYWxvbjo6R2V0QnJha2VFbmFibGVEdXJpbmdOZXV0cmFsKCkKK3sKKyAgaW50IGJyYWtlRW4gPSAwOworICBDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPkdldEJyYWtlSXNFbmFibGVkKGJyYWtlRW4pOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwl9CisJcmV0dXJuIGJyYWtlRW47Cit9CisvKioKKyAqIFRPRE8gZG9jdW1lbnRhdGlvbiAoc2VlIENBTkphZ3Vhci5jcHApCisgKi8KK3ZvaWQgQ0FOVGFsb246OkNvbmZpZ0VuY29kZXJDb2Rlc1BlclJldih1aW50MTZfdCBjb2Rlc1BlclJldikKK3sKKwkvKiBUQUxPTiBTUlggZG9lcyBub3Qgc2NhbGUgdW5pdHMsIHRoZXkgYXJlIHJhdyBmcm9tIHRoZSBzZW5zb3IuICBVbml0IHNjYWxpbmcgY2FuIGJlIGRvbmUgaW4gQVBJIG9yIGJ5IGNhbGxlciAqLworfQorCisvKioKKyAqIFRPRE8gZG9jdW1lbnRhdGlvbiAoc2VlIENBTkphZ3Vhci5jcHApCisgKi8KK3ZvaWQgQ0FOVGFsb246OkNvbmZpZ1BvdGVudGlvbWV0ZXJUdXJucyh1aW50MTZfdCB0dXJucykKK3sKKwkvKiBUQUxPTiBTUlggZG9lcyBub3Qgc2NhbGUgdW5pdHMsIHRoZXkgYXJlIHJhdyBmcm9tIHRoZSBzZW5zb3IuICBVbml0IHNjYWxpbmcgY2FuIGJlIGRvbmUgaW4gQVBJIG9yIGJ5IGNhbGxlciAqLworfQorCisvKioKKyAqIFRPRE8gZG9jdW1lbnRhdGlvbiAoc2VlIENBTkphZ3Vhci5jcHApCisgKi8KK3ZvaWQgQ0FOVGFsb246OkNvbmZpZ1NvZnRQb3NpdGlvbkxpbWl0cyhkb3VibGUgZm9yd2FyZExpbWl0UG9zaXRpb24sIGRvdWJsZSByZXZlcnNlTGltaXRQb3NpdGlvbikKK3sKKwlDb25maWdMaW1pdE1vZGUoa0xpbWl0TW9kZV9Tb2Z0UG9zaXRpb25MaW1pdHMpOworCUNvbmZpZ0ZvcndhcmRMaW1pdChmb3J3YXJkTGltaXRQb3NpdGlvbik7CisJQ29uZmlnUmV2ZXJzZUxpbWl0KHJldmVyc2VMaW1pdFBvc2l0aW9uKTsKK30KKworLyoqCisgKiBUT0RPIGRvY3VtZW50YXRpb24gKHNlZSBDQU5KYWd1YXIuY3BwKQorICovCit2b2lkIENBTlRhbG9uOjpEaXNhYmxlU29mdFBvc2l0aW9uTGltaXRzKCkKK3sKKwlDb25maWdMaW1pdE1vZGUoa0xpbWl0TW9kZV9Td2l0Y2hJbnB1dHNPbmx5KTsKK30KKworLyoqCisgKiBUT0RPIGRvY3VtZW50YXRpb24gKHNlZSBDQU5KYWd1YXIuY3BwKQorICogQ29uZmlndXJlcyB0aGUgc29mdCBsaW1pdCBlbmFibGUgKHdlYXIgbGV2ZWxlZCBwZXJzaXN0ZW50IG1lbW9yeSkuCisgKiBBbHNvIHNldHMgdGhlIGxpbWl0IHN3aXRjaCBvdmVycmlkZXMuCisgKi8KK3ZvaWQgQ0FOVGFsb246OkNvbmZpZ0xpbWl0TW9kZShMaW1pdE1vZGUgbW9kZSkKK3sKKwlDVFJfQ29kZSBzdGF0dXMgPSBDVFJfT0tBWTsKKwlzd2l0Y2gobW9kZSl7CisJCWNhc2Uga0xpbWl0TW9kZV9Td2l0Y2hJbnB1dHNPbmx5OiAJLyoqIE9ubHkgdXNlIHN3aXRjaGVzIGZvciBsaW1pdHMgKi8KKwkJCS8qIHR1cm4gT0ZGIGJvdGggbGltaXRzLiBTUlggaGFzIGluZGl2aWR1YWwgZW5hYmxlcyBhbmQgcG9sYXJpdHkgZm9yIGVhY2ggbGltaXQgc3dpdGNoLiovCisJCQlzdGF0dXMgPSBtX2ltcGwtPlNldEZvcndhcmRTb2Z0RW5hYmxlKGZhbHNlKTsKKwkJCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQkJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCQkJfQorCQkJc3RhdHVzID0gbV9pbXBsLT5TZXRSZXZlcnNlU29mdEVuYWJsZShmYWxzZSk7CisJCQlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwkJCX0KKwkJCS8qIG92ZXJyaWRlIGVuYWJsZSB0aGUgbGltaXQgc3dpdGNoZXMsIHRoaXMgY2lyY3VtdmVudHMgdGhlIHdlYmRhc2ggKi8KKwkJCXN0YXR1cyA9IG1faW1wbC0+U2V0T3ZlcnJpZGVMaW1pdFN3aXRjaEVuKENhblRhbG9uU1JYOjprTGltaXRTd2l0Y2hPdmVycmlkZV9FbmFibGVGd2RfRW5hYmxlUmV2KTsKKwkJCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQkJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2Uga0xpbWl0TW9kZV9Tb2Z0UG9zaXRpb25MaW1pdHM6IC8qKiBVc2UgYm90aCBzd2l0Y2hlcyBhbmQgc29mdCBsaW1pdHMgKi8KKwkJCS8qIHR1cm4gb24gYm90aCBsaW1pdHMuIFNSWCBoYXMgaW5kaXZpZHVhbCBlbmFibGVzIGFuZCBwb2xhcml0eSBmb3IgZWFjaCBsaW1pdCBzd2l0Y2guKi8KKwkJCXN0YXR1cyA9IG1faW1wbC0+U2V0Rm9yd2FyZFNvZnRFbmFibGUodHJ1ZSk7CisJCQlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwkJCX0KKwkJCXN0YXR1cyA9IG1faW1wbC0+U2V0UmV2ZXJzZVNvZnRFbmFibGUodHJ1ZSk7CisJCQlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwkJCX0KKwkJCS8qIG92ZXJyaWRlIGVuYWJsZSB0aGUgbGltaXQgc3dpdGNoZXMsIHRoaXMgY2lyY3VtdmVudHMgdGhlIHdlYmRhc2ggKi8KKwkJCXN0YXR1cyA9IG1faW1wbC0+U2V0T3ZlcnJpZGVMaW1pdFN3aXRjaEVuKENhblRhbG9uU1JYOjprTGltaXRTd2l0Y2hPdmVycmlkZV9FbmFibGVGd2RfRW5hYmxlUmV2KTsKKwkJCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQkJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCQkJfQorCQkJYnJlYWs7CisJCQkKKwkJY2FzZSBrTGltaXRNb2RlX1NyeERpc2FibGVTd2l0Y2hJbnB1dHM6IC8qKiBkaXNhYmxlIGJvdGggbGltaXQgc3dpdGNoZXMgYW5kIHNvZnQgbGltaXRzICovCisJCQkvKiB0dXJuIG9uIGJvdGggbGltaXRzLiBTUlggaGFzIGluZGl2aWR1YWwgZW5hYmxlcyBhbmQgcG9sYXJpdHkgZm9yIGVhY2ggbGltaXQgc3dpdGNoLiovCisJCQlzdGF0dXMgPSBtX2ltcGwtPlNldEZvcndhcmRTb2Z0RW5hYmxlKGZhbHNlKTsKKwkJCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQkJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCQkJfQorCQkJc3RhdHVzID0gbV9pbXBsLT5TZXRSZXZlcnNlU29mdEVuYWJsZShmYWxzZSk7CisJCQlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwkJCX0KKwkJCS8qIG92ZXJyaWRlIGVuYWJsZSB0aGUgbGltaXQgc3dpdGNoZXMsIHRoaXMgY2lyY3VtdmVudHMgdGhlIHdlYmRhc2ggKi8KKwkJCXN0YXR1cyA9IG1faW1wbC0+U2V0T3ZlcnJpZGVMaW1pdFN3aXRjaEVuKENhblRhbG9uU1JYOjprTGltaXRTd2l0Y2hPdmVycmlkZV9EaXNhYmxlRndkX0Rpc2FibGVSZXYpOworCQkJaWYoc3RhdHVzICE9IENUUl9PS0FZKSB7CisJCQkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJCQl9CisJCQlicmVhazsKKwl9Cit9CisKKy8qKgorICogVE9ETyBkb2N1bWVudGF0aW9uIChzZWUgQ0FOSmFndWFyLmNwcCkKKyAqLwordm9pZCBDQU5UYWxvbjo6Q29uZmlnRm9yd2FyZExpbWl0KGRvdWJsZSBmb3J3YXJkTGltaXRQb3NpdGlvbikKK3sKKwlDVFJfQ29kZSBzdGF0dXMgPSBDVFJfT0tBWTsKKwlzdGF0dXMgPSBtX2ltcGwtPlNldEZvcndhcmRTb2Z0TGltaXQoZm9yd2FyZExpbWl0UG9zaXRpb24pOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwl9Cit9CisvKioKKyAqIENoYW5nZSB0aGUgZndkIGxpbWl0IHN3aXRjaCBzZXR0aW5nIHRvIG5vcm1hbGx5IG9wZW4gb3IgY2xvc2VkLgorICogVGFsb24gd2lsbCBkaXNhYmxlIG1vbWVudGFyaWxseSBpZiB0aGUgVGFsb24ncyBjdXJyZW50IHNldHRpbmcKKyAqIGlzIGRpc3NpbWlsYXIgdG8gdGhlIGNhbGxlcidzIHJlcXVlc3RlZCBzZXR0aW5nLgorICoKKyAqIFNpbmNlIFRhbG9uIHNhdmVzIHNldHRpbmcgdG8gZmxhc2ggdGhpcyBzaG91bGQgb25seSBhZmZlY3QKKyAqIGEgZ2l2ZW4gVGFsb24gaW5pdGlhbGx5IGR1cmluZyByb2JvdCBpbnN0YWxsLgorICoKKyAqIEBwYXJhbSBub3JtYWxseU9wZW4gdHJ1ZSBmb3Igbm9ybWFsbHkgb3Blbi4gIGZhbHNlIGZvciBub3JtYWxseSBjbG9zZWQuCisgKi8KK3ZvaWQgQ0FOVGFsb246OkNvbmZpZ0Z3ZExpbWl0U3dpdGNoTm9ybWFsbHlPcGVuKGJvb2wgbm9ybWFsbHlPcGVuKQoreworCUNUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+U2V0UGFyYW0oQ2FuVGFsb25TUlg6OmVPbkJvb3RfTGltaXRTd2l0Y2hfRm9yd2FyZF9Ob3JtYWxseUNsb3NlZCwgbm9ybWFsbHlPcGVuID8gMCA6IDEpOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwl9Cit9CisvKioKKyAqIENoYW5nZSB0aGUgcmV2IGxpbWl0IHN3aXRjaCBzZXR0aW5nIHRvIG5vcm1hbGx5IG9wZW4gb3IgY2xvc2VkLgorICogVGFsb24gd2lsbCBkaXNhYmxlIG1vbWVudGFyaWxseSBpZiB0aGUgVGFsb24ncyBjdXJyZW50IHNldHRpbmcKKyAqIGlzIGRpc3NpbWlsYXIgdG8gdGhlIGNhbGxlcidzIHJlcXVlc3RlZCBzZXR0aW5nLgorICoKKyAqIFNpbmNlIFRhbG9uIHNhdmVzIHNldHRpbmcgdG8gZmxhc2ggdGhpcyBzaG91bGQgb25seSBhZmZlY3QKKyAqIGEgZ2l2ZW4gVGFsb24gaW5pdGlhbGx5IGR1cmluZyByb2JvdCBpbnN0YWxsLgorICoKKyAqIEBwYXJhbSBub3JtYWxseU9wZW4gdHJ1ZSBmb3Igbm9ybWFsbHkgb3Blbi4gIGZhbHNlIGZvciBub3JtYWxseSBjbG9zZWQuCisgKi8KK3ZvaWQgQ0FOVGFsb246OkNvbmZpZ1JldkxpbWl0U3dpdGNoTm9ybWFsbHlPcGVuKGJvb2wgbm9ybWFsbHlPcGVuKQoreworCUNUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+U2V0UGFyYW0oQ2FuVGFsb25TUlg6OmVPbkJvb3RfTGltaXRTd2l0Y2hfUmV2ZXJzZV9Ob3JtYWxseUNsb3NlZCwgbm9ybWFsbHlPcGVuID8gMCA6IDEpOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwl9Cit9CisvKioKKyAqIFRPRE8gZG9jdW1lbnRhdGlvbiAoc2VlIENBTkphZ3Vhci5jcHApCisgKi8KK3ZvaWQgQ0FOVGFsb246OkNvbmZpZ1JldmVyc2VMaW1pdChkb3VibGUgcmV2ZXJzZUxpbWl0UG9zaXRpb24pCit7CisJQ1RSX0NvZGUgc3RhdHVzID0gQ1RSX09LQVk7CisJc3RhdHVzID0gbV9pbXBsLT5TZXRSZXZlcnNlU29mdExpbWl0KHJldmVyc2VMaW1pdFBvc2l0aW9uKTsKKwlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorfQorCisvKioKKyAqIFRPRE8gZG9jdW1lbnRhdGlvbiAoc2VlIENBTkphZ3Vhci5jcHApCisgKi8KK3ZvaWQgQ0FOVGFsb246OkNvbmZpZ01heE91dHB1dFZvbHRhZ2UoZG91YmxlIHZvbHRhZ2UpCit7CisJLyogU1JYIGRvZXMgbm90IHN1cHBvcnQgbWF4IG91dHB1dCAgKi8KKwl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChJbmNvbXBhdGlibGVNb2RlLCAiTWF4T3V0cHV0Vm9sdGFnZSBub3Qgc3VwcG9ydGVkLiIpOworfQorCisvKioKKyAqIFRPRE8gZG9jdW1lbnRhdGlvbiAoc2VlIENBTkphZ3Vhci5jcHApCisgKi8KK3ZvaWQgQ0FOVGFsb246OkNvbmZpZ0ZhdWx0VGltZShmbG9hdCBmYXVsdFRpbWUpCit7CisJLyogU1JYIGRvZXMgbm90IGhhdmUgZmF1bHQgdGltZS4gIFNSWCBtb3RvciBkcml2ZSBpcyBvbmx5IGRpc2FibGVkIGZvciBzb2Z0IGxpbWl0cyBhbmQgbGltaXQtc3dpdGNoIGZhdWx0cy4gKi8KKwl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChJbmNvbXBhdGlibGVNb2RlLCAiRmF1bHQgVGltZSBub3Qgc3VwcG9ydGVkLiIpOworfQorCisvKioKKyAqIEZpeHVwIHRoZSBzZW5kTW9kZSBzbyBTZXQoKSBzZXJpYWxpemVzIHRoZSBjb3JyZWN0IGRlbWFuZCB2YWx1ZS4KKyAqIEFsc28gZmlsbHMgdGhlIG1vZGVTZWxlY2V0IGluIHRoZSBjb250cm9sIGZyYW1lIHRvIGRpc2FibGVkLgorICogQHBhcmFtIG1vZGUgQ29udHJvbCBtb2RlIHRvIHVsdGltYXRlbHkgZW50ZXIgb25jZSB1c2VyIGNhbGxzIFNldCgpLgorICogQHNlZSBTZXQoKQorICovCit2b2lkIENBTlRhbG9uOjpBcHBseUNvbnRyb2xNb2RlKENBTlNwZWVkQ29udHJvbGxlcjo6Q29udHJvbE1vZGUgbW9kZSkKK3sKKyAgbV9jb250cm9sTW9kZSA9IG1vZGU7CisgIHN3aXRjaCAobW9kZSkgeworICAgIGNhc2Uga1BlcmNlbnRWYnVzOgorICAgICAgbV9zZW5kTW9kZSA9IGtUaHJvdHRsZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2Uga0N1cnJlbnQ6CisgICAgICBtX3NlbmRNb2RlID0ga0N1cnJlbnRNb2RlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBrU3BlZWQ6CisgICAgICBtX3NlbmRNb2RlID0ga1NwZWVkTW9kZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2Uga1Bvc2l0aW9uOgorICAgICAgbV9zZW5kTW9kZSA9IGtQb3NpdGlvbk1vZGU7CisgICAgICBicmVhazsKKyAgICBjYXNlIGtWb2x0YWdlOgorICAgICAgbV9zZW5kTW9kZSA9IGtWb2x0YWdlTW9kZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2Uga0ZvbGxvd2VyOgorICAgICAgbV9zZW5kTW9kZSA9IGtGb2xsb3dlck1vZGU7CisgICAgICBicmVhazsKKyAgfQorICAvLyBLZWVwIHRoZSB0YWxvbiBkaXNhYmxlZCB1bnRpbCBTZXQoKSBpcyBjYWxsZWQuCisgIENUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+U2V0TW9kZVNlbGVjdCgoaW50KWtEaXNhYmxlZCk7CisJaWYoc3RhdHVzICE9IENUUl9PS0FZKSB7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KK30KKy8qKgorICogVE9ETyBkb2N1bWVudGF0aW9uIChzZWUgQ0FOSmFndWFyLmNwcCkKKyAqLwordm9pZCBDQU5UYWxvbjo6U2V0Q29udHJvbE1vZGUoQ0FOU3BlZWRDb250cm9sbGVyOjpDb250cm9sTW9kZSBtb2RlKQoreworICBpZihtX2NvbnRyb2xNb2RlID09IG1vZGUpeworICAgIC8qIHdlIGFscmVhZHkgYXJlIGluIHRoaXMgbW9kZSwgZG9uJ3QgcGVyZm9ybSBkaXNhYmxlIHdvcmthcm91bmQgKi8KKyAgfWVsc2V7CisgICAgQXBwbHlDb250cm9sTW9kZShtb2RlKTsKKyAgfQorfQorCisvKioKKyAqIFRPRE8gZG9jdW1lbnRhdGlvbiAoc2VlIENBTkphZ3Vhci5jcHApCisgKi8KK0NBTlNwZWVkQ29udHJvbGxlcjo6Q29udHJvbE1vZGUgQ0FOVGFsb246OkdldENvbnRyb2xNb2RlKCkKK3sKKyAgcmV0dXJuIG1fY29udHJvbE1vZGU7Cit9CisKK3ZvaWQgQ0FOVGFsb246OlNldEV4cGlyYXRpb24oZmxvYXQgdGltZW91dCkKK3sKKwltX3NhZmV0eUhlbHBlci0+U2V0RXhwaXJhdGlvbih0aW1lb3V0KTsKK30KKworZmxvYXQgQ0FOVGFsb246OkdldEV4cGlyYXRpb24oKQoreworCXJldHVybiBtX3NhZmV0eUhlbHBlci0+R2V0RXhwaXJhdGlvbigpOworfQorCitib29sIENBTlRhbG9uOjpJc0FsaXZlKCkKK3sKKwlyZXR1cm4gbV9zYWZldHlIZWxwZXItPklzQWxpdmUoKTsKK30KKworYm9vbCBDQU5UYWxvbjo6SXNTYWZldHlFbmFibGVkKCkKK3sKKwlyZXR1cm4gbV9zYWZldHlIZWxwZXItPklzU2FmZXR5RW5hYmxlZCgpOworfQorCit2b2lkIENBTlRhbG9uOjpTZXRTYWZldHlFbmFibGVkKGJvb2wgZW5hYmxlZCkKK3sKKwltX3NhZmV0eUhlbHBlci0+U2V0U2FmZXR5RW5hYmxlZChlbmFibGVkKTsKK30KKwordm9pZCBDQU5UYWxvbjo6R2V0RGVzY3JpcHRpb24oY2hhciAqZGVzYykKK3sKKwlzcHJpbnRmKGRlc2MsICJDQU5UYWxvbiBJRCAlZCIsIG1fZGV2aWNlTnVtYmVyKTsKK30KKworLyoqCisgKiBDb21tb24gaW50ZXJmYWNlIGZvciBzdG9wcGluZyB0aGUgbW90b3IKKyAqIFBhcnQgb2YgdGhlIE1vdG9yU2FmZXR5IGludGVyZmFjZQorICoKKyAqIEBkZXByZWNhdGVkIENhbGwgRGlzYWJsZSBpbnN0ZWFkLgorKi8KK3ZvaWQgQ0FOVGFsb246OlN0b3BNb3RvcigpCit7CisgIERpc2FibGUoKTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvQ29tcHJlc3Nvci5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0NvbXByZXNzb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMGVhYjEKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0NvbXByZXNzb3IuY3BwCkBAIC0wLDAgKzEsMjYxIEBACisvKgorICogQ29tcHJlc3Nvci5jcHAKKyAqLworCisjaW5jbHVkZSAiQ29tcHJlc3Nvci5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorCit2b2lkIENvbXByZXNzb3I6OkluaXRDb21wcmVzc29yKHVpbnQ4X3QgcGNtSUQpIHsKKwltX3BjbV9wb2ludGVyID0gaW5pdGlhbGl6ZUNvbXByZXNzb3IocGNtSUQpOworCisJU2V0Q2xvc2VkTG9vcENvbnRyb2wodHJ1ZSk7Cit9CisKKy8qKgorICogQ29uc3RydWN0b3IKKyAqCisgKiBVc2VzIHRoZSBkZWZhdWx0IFBDTSBJRCAoMCkKKyAqLworQ29tcHJlc3Nvcjo6Q29tcHJlc3NvcigpIHsKKwlJbml0Q29tcHJlc3NvcihHZXREZWZhdWx0U29sZW5vaWRNb2R1bGUoKSk7Cit9CisKKy8qKgorICogQ29uc3RydWN0b3IKKyAqCisgKiBAcGFyYW0gbW9kdWxlIFRoZSBQQ00gSUQgdG8gdXNlICgwLTYyKQorICovCitDb21wcmVzc29yOjpDb21wcmVzc29yKHVpbnQ4X3QgcGNtSUQpIHsKKwlJbml0Q29tcHJlc3NvcihwY21JRCk7Cit9CisKK0NvbXByZXNzb3I6On5Db21wcmVzc29yKCkgeworCit9CisKKy8qKgorICogIFN0YXJ0cyBjbG9zZWQtbG9vcCBjb250cm9sLiBOb3RlIHRoYXQgY2xvc2VkIGxvb3AgY29udHJvbCBpcyBlbmFibGVkIGJ5IGRlZmF1bHQuCisgKi8KK3ZvaWQgQ29tcHJlc3Nvcjo6U3RhcnQoKSB7CisJU2V0Q2xvc2VkTG9vcENvbnRyb2wodHJ1ZSk7Cit9CisKKy8qKgorICogIFN0b3BzIGNsb3NlZC1sb29wIGNvbnRyb2wuIE5vdGUgdGhhdCBjbG9zZWQgbG9vcCBjb250cm9sIGlzIGVuYWJsZWQgYnkgZGVmYXVsdC4KKyAqLwordm9pZCBDb21wcmVzc29yOjpTdG9wKCkgeworCVNldENsb3NlZExvb3BDb250cm9sKGZhbHNlKTsKK30KKworLyoqCisgKiBDaGVjayBpZiBjb21wcmVzc29yIG91dHB1dCBpcyBhY3RpdmUKKyAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29tcHJlc3NvciBpcyBvbgorICovCitib29sIENvbXByZXNzb3I6OkVuYWJsZWQoKSB7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCWJvb2wgdmFsdWU7CisKKwl2YWx1ZSA9IGdldENvbXByZXNzb3IobV9wY21fcG9pbnRlciwgJnN0YXR1cyk7CisKKwlpZihzdGF0dXMpIHsKKwkJd3BpX3NldFdQSUVycm9yKFRpbWVvdXQpOworCX0KKworCXJldHVybiB2YWx1ZTsKK30KKworLyoqCisgKiBDaGVjayBpZiB0aGUgcHJlc3N1cmUgc3dpdGNoIGlzIHRyaWdnZXJlZAorICogQHJldHVybiB0cnVlIGlmIHByZXNzdXJlIGlzIGxvdworICovCitib29sIENvbXByZXNzb3I6OkdldFByZXNzdXJlU3dpdGNoVmFsdWUoKSB7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCWJvb2wgdmFsdWU7CisKKwl2YWx1ZSA9IGdldFByZXNzdXJlU3dpdGNoKG1fcGNtX3BvaW50ZXIsICZzdGF0dXMpOworCisJaWYoc3RhdHVzKSB7CisJCXdwaV9zZXRXUElFcnJvcihUaW1lb3V0KTsKKwl9CisKKwlyZXR1cm4gdmFsdWU7Cit9CisKKworLyoqCisgKiBRdWVyeSBob3cgbXVjaCBjdXJyZW50IHRoZSBjb21wcmVzc29yIGlzIGRyYXdpbmcKKyAqIEByZXR1cm4gVGhlIGN1cnJlbnQgdGhyb3VnaCB0aGUgY29tcHJlc3NvciwgaW4gYW1wcworICovCitmbG9hdCBDb21wcmVzc29yOjpHZXRDb21wcmVzc29yQ3VycmVudCgpIHsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJZmxvYXQgdmFsdWU7CisKKwl2YWx1ZSA9IGdldENvbXByZXNzb3JDdXJyZW50KG1fcGNtX3BvaW50ZXIsICZzdGF0dXMpOworCisJaWYoc3RhdHVzKSB7CisJCXdwaV9zZXRXUElFcnJvcihUaW1lb3V0KTsKKwl9CisKKwlyZXR1cm4gdmFsdWU7Cit9CisKKworLyoqCisgKiBFbmFibGVzIG9yIGRpc2FibGVzIGF1dG9tYXRpY2FsbHkgdHVybmluZyB0aGUgY29tcHJlc3NvciBvbiB3aGVuIHRoZQorICogcHJlc3N1cmUgaXMgbG93LgorICogQHBhcmFtIG9uIFNldCB0byB0cnVlIHRvIGVuYWJsZSBjbG9zZWQgbG9vcCBjb250cm9sIG9mIHRoZSBjb21wcmVzc29yLiBGYWxzZSB0byBkaXNhYmxlLgorICovCit2b2lkIENvbXByZXNzb3I6OlNldENsb3NlZExvb3BDb250cm9sKGJvb2wgb24pIHsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisKKwlzZXRDbG9zZWRMb29wQ29udHJvbChtX3BjbV9wb2ludGVyLCBvbiwgJnN0YXR1cyk7CisKKwlpZihzdGF0dXMpIHsKKwkJd3BpX3NldFdQSUVycm9yKFRpbWVvdXQpOworCX0KK30KKworLyoqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbXByZXNzb3Igd2lsbCBhdXRvbWF0aWNhbGx5IHR1cm4gb24gd2hlbiB0aGUKKyAqIHByZXNzdXJlIGlzIGxvdy4KKyAqIEByZXR1cm4gVHJ1ZSBpZiBjbG9zZWQgbG9vcCBjb250cm9sIG9mIHRoZSBjb21wcmVzc29yIGlzIGVuYWJsZWQuIEZhbHNlIGlmIGRpc2FibGVkLgorICovCitib29sIENvbXByZXNzb3I6OkdldENsb3NlZExvb3BDb250cm9sKCkgeworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlib29sIHZhbHVlOworCisJdmFsdWUgPSBnZXRDbG9zZWRMb29wQ29udHJvbChtX3BjbV9wb2ludGVyLCAmc3RhdHVzKTsKKworCWlmKHN0YXR1cykgeworCQl3cGlfc2V0V1BJRXJyb3IoVGltZW91dCk7CisJfQorCisJcmV0dXJuIHZhbHVlOworfQorCisvKioKKyAqIFF1ZXJ5IGlmIHRoZSBjb21wcmVzc29yIG91dHB1dCBoYXMgYmVlbiBkaXNhYmxlZCBkdWUgdG8gaGlnaCBjdXJyZW50IGRyYXcuCisgKiBAcmV0dXJuIHRydWUgaWYgUENNIGlzIGluIGZhdWx0IHN0YXRlIDogQ29tcHJlc3NvciBEcml2ZSBpcyAKKyAqCQkJZGlzYWJsZWQgZHVlIHRvIGNvbXByZXNzb3IgY3VycmVudCBiZWluZyB0b28gaGlnaC4KKyAqLworYm9vbCBDb21wcmVzc29yOjpHZXRDb21wcmVzc29yQ3VycmVudFRvb0hpZ2hGYXVsdCgpIHsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJYm9vbCB2YWx1ZTsKKworCXZhbHVlID0gZ2V0Q29tcHJlc3NvckN1cnJlbnRUb29IaWdoRmF1bHQobV9wY21fcG9pbnRlciwgJnN0YXR1cyk7CisKKwlpZihzdGF0dXMpIHsKKwkJd3BpX3NldFdQSUVycm9yKFRpbWVvdXQpOworCX0KKworCXJldHVybiB2YWx1ZTsKK30KKy8qKgorICogUXVlcnkgaWYgdGhlIGNvbXByZXNzb3Igb3V0cHV0IGhhcyBiZWVuIGRpc2FibGVkIGR1ZSB0byBoaWdoIGN1cnJlbnQgZHJhdyAoc3RpY2t5KS4KKyAqIEEgc3RpY2t5IGZhdWx0IHdpbGwgbm90IGNsZWFyIG9uIGRldmljZSByZWJvb3QsIGl0IG11c3QgYmUgY2xlYXJlZCB0aHJvdWdoIGNvZGUgb3IgdGhlIHdlYmRhc2guCisgKiBAcmV0dXJuIHRydWUgaWYgUENNIHN0aWNreSBmYXVsdCBpcyBzZXQgOiBDb21wcmVzc29yIERyaXZlIGlzIAorICoJCQlkaXNhYmxlZCBkdWUgdG8gY29tcHJlc3NvciBjdXJyZW50IGJlaW5nIHRvbyBoaWdoLgorICovCitib29sIENvbXByZXNzb3I6OkdldENvbXByZXNzb3JDdXJyZW50VG9vSGlnaFN0aWNreUZhdWx0KCkgeworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlib29sIHZhbHVlOworCisJdmFsdWUgPSBnZXRDb21wcmVzc29yQ3VycmVudFRvb0hpZ2hTdGlja3lGYXVsdChtX3BjbV9wb2ludGVyLCAmc3RhdHVzKTsKKworCWlmKHN0YXR1cykgeworCQl3cGlfc2V0V1BJRXJyb3IoVGltZW91dCk7CisJfQorCisJcmV0dXJuIHZhbHVlOworfQorLyoqCisgKiBRdWVyeSBpZiB0aGUgY29tcHJlc3NvciBvdXRwdXQgaGFzIGJlZW4gZGlzYWJsZWQgZHVlIHRvIGEgc2hvcnQgY2lyY3VpdCAoc3RpY2t5KS4KKyAqIEEgc3RpY2t5IGZhdWx0IHdpbGwgbm90IGNsZWFyIG9uIGRldmljZSByZWJvb3QsIGl0IG11c3QgYmUgY2xlYXJlZCB0aHJvdWdoIGNvZGUgb3IgdGhlIHdlYmRhc2guCisgKiBAcmV0dXJuIHRydWUgaWYgUENNIHN0aWNreSBmYXVsdCBpcyBzZXQgOiBDb21wcmVzc29yIG91dHB1dCAKKyAqCQkJYXBwZWFycyB0byBiZSBzaG9ydGVkLgorICovCitib29sIENvbXByZXNzb3I6OkdldENvbXByZXNzb3JTaG9ydGVkU3RpY2t5RmF1bHQoKSB7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCWJvb2wgdmFsdWU7CisKKwl2YWx1ZSA9IGdldENvbXByZXNzb3JTaG9ydGVkU3RpY2t5RmF1bHQobV9wY21fcG9pbnRlciwgJnN0YXR1cyk7CisKKwlpZihzdGF0dXMpIHsKKwkJd3BpX3NldFdQSUVycm9yKFRpbWVvdXQpOworCX0KKworCXJldHVybiB2YWx1ZTsKK30KKy8qKgorICogUXVlcnkgaWYgdGhlIGNvbXByZXNzb3Igb3V0cHV0IGhhcyBiZWVuIGRpc2FibGVkIGR1ZSB0byBhIHNob3J0IGNpcmN1aXQuCisgKiBAcmV0dXJuIHRydWUgaWYgUENNIGlzIGluIGZhdWx0IHN0YXRlIDogQ29tcHJlc3NvciBvdXRwdXQgCisgKgkJCWFwcGVhcnMgdG8gYmUgc2hvcnRlZC4KKyAqLworYm9vbCBDb21wcmVzc29yOjpHZXRDb21wcmVzc29yU2hvcnRlZEZhdWx0KCkgeworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlib29sIHZhbHVlOworCisJdmFsdWUgPSBnZXRDb21wcmVzc29yU2hvcnRlZEZhdWx0KG1fcGNtX3BvaW50ZXIsICZzdGF0dXMpOworCisJaWYoc3RhdHVzKSB7CisJCXdwaV9zZXRXUElFcnJvcihUaW1lb3V0KTsKKwl9CisKKwlyZXR1cm4gdmFsdWU7Cit9CisvKioKKyAqIFF1ZXJ5IGlmIHRoZSBjb21wcmVzc29yIG91dHB1dCBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgd2lyZWQgKHN0aWNreSkuCisgKiBBIHN0aWNreSBmYXVsdCB3aWxsIG5vdCBjbGVhciBvbiBkZXZpY2UgcmVib290LCBpdCBtdXN0IGJlIGNsZWFyZWQgdGhyb3VnaCBjb2RlIG9yIHRoZSB3ZWJkYXNoLgorICogQHJldHVybiB0cnVlIGlmIFBDTSBzdGlja3kgZmF1bHQgaXMgc2V0IDogQ29tcHJlc3NvciBkb2VzIG5vdCAKKyAqCQkJYXBwZWFyIHRvIGJlIHdpcmVkLCBpLmUuIGNvbXByZXNzb3IgaXMKKyAqIAkJCW5vdCBkcmF3aW5nIGVub3VnaCBjdXJyZW50LgorICovCitib29sIENvbXByZXNzb3I6OkdldENvbXByZXNzb3JOb3RDb25uZWN0ZWRTdGlja3lGYXVsdCgpIHsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJYm9vbCB2YWx1ZTsKKworCXZhbHVlID0gZ2V0Q29tcHJlc3Nvck5vdENvbm5lY3RlZFN0aWNreUZhdWx0KG1fcGNtX3BvaW50ZXIsICZzdGF0dXMpOworCisJaWYoc3RhdHVzKSB7CisJCXdwaV9zZXRXUElFcnJvcihUaW1lb3V0KTsKKwl9CisKKwlyZXR1cm4gdmFsdWU7Cit9CisvKioKKyAqIFF1ZXJ5IGlmIHRoZSBjb21wcmVzc29yIG91dHB1dCBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgd2lyZWQuCisgKiBAcmV0dXJuIHRydWUgaWYgUENNIGlzIGluIGZhdWx0IHN0YXRlIDogQ29tcHJlc3NvciBkb2VzIG5vdCAKKyAqCQkJYXBwZWFyIHRvIGJlIHdpcmVkLCBpLmUuIGNvbXByZXNzb3IgaXMKKyAqIAkJCW5vdCBkcmF3aW5nIGVub3VnaCBjdXJyZW50LgorICovCitib29sIENvbXByZXNzb3I6OkdldENvbXByZXNzb3JOb3RDb25uZWN0ZWRGYXVsdCgpIHsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJYm9vbCB2YWx1ZTsKKworCXZhbHVlID0gZ2V0Q29tcHJlc3Nvck5vdENvbm5lY3RlZEZhdWx0KG1fcGNtX3BvaW50ZXIsICZzdGF0dXMpOworCisJaWYoc3RhdHVzKSB7CisJCXdwaV9zZXRXUElFcnJvcihUaW1lb3V0KTsKKwl9CisKKwlyZXR1cm4gdmFsdWU7Cit9CisvKioKKyAqIENsZWFyIEFMTCBzdGlja3kgZmF1bHRzIGluc2lkZSBQQ00gdGhhdCBDb21wcmVzc29yIGlzIHdpcmVkIHRvLgorICoKKyAqIElmIGEgc3RpY2t5IGZhdWx0IGlzIHNldCwgdGhlbiBpdCB3aWxsIGJlIHBlcnNpc3RlbnRseSBjbGVhcmVkLiAgQ29tcHJlc3NvciBkcml2ZQorICoJCW1heWJlIG1vbWVudGFyaWx5IGRpc2FibGUgd2hpbGUgZmxhZ3MgYXJlIGJlaW5nIGNsZWFyZWQuIENhcmUgc2hvdWxkIGJlIAorICoJCXRha2VuIHRvIG5vdCBjYWxsIHRoaXMgdG9vIGZyZXF1ZW50bHksIG90aGVyd2lzZSBub3JtYWwgY29tcHJlc3NvciAKKyAqCQlmdW5jdGlvbmFsaXR5IG1heSBiZSBwcmV2ZW50ZWQuCisgKgorICogSWYgbm8gc3RpY2t5IGZhdWx0cyBhcmUgc2V0IHRoZW4gdGhpcyBjYWxsIHdpbGwgaGF2ZSBubyBlZmZlY3QuCisgKi8KK3ZvaWQgQ29tcHJlc3Nvcjo6Q2xlYXJBbGxQQ01TdGlja3lGYXVsdHMoKSB7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCisJY2xlYXJBbGxQQ01TdGlja3lGYXVsdHMobV9wY21fcG9pbnRlciwgJnN0YXR1cyk7CisKKwlpZihzdGF0dXMpIHsKKwkJd3BpX3NldFdQSUVycm9yKFRpbWVvdXQpOworCX0KK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvQ29udHJvbGxlclBvd2VyLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvQ29udHJvbGxlclBvd2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTc5MjliCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9Db250cm9sbGVyUG93ZXIuY3BwCkBAIC0wLDAgKzEsMTcwIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDExLiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJDb250cm9sbGVyUG93ZXIuaCIKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPEhBTC9Qb3dlci5ocHA+CisjaW5jbHVkZSA8SEFML0hBTC5ocHA+CisjaW5jbHVkZSAiRXJyb3JCYXNlLmgiCisKKy8qKgorICogR2V0IHRoZSBpbnB1dCB2b2x0YWdlIHRvIHRoZSByb2JvdCBjb250cm9sbGVyCisgKiBAcmV0dXJuIFRoZSBjb250cm9sbGVyIGlucHV0IHZvbHRhZ2UgdmFsdWUgaW4gVm9sdHMKKyAqLworZG91YmxlIENvbnRyb2xsZXJQb3dlcjo6R2V0SW5wdXRWb2x0YWdlKCkgeworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlkb3VibGUgcmV0VmFsID0gZ2V0VmluVm9sdGFnZSgmc3RhdHVzKTsKKwl3cGlfc2V0R2xvYmFsRXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwlyZXR1cm4gcmV0VmFsOworfQorCisvKioKKyAqIEdldCB0aGUgaW5wdXQgY3VycmVudCB0byB0aGUgcm9ib3QgY29udHJvbGxlcgorICogQHJldHVybiBUaGUgY29udHJvbGxlciBpbnB1dCBjdXJyZW50IHZhbHVlIGluIEFtcHMKKyAqLworZG91YmxlIENvbnRyb2xsZXJQb3dlcjo6R2V0SW5wdXRDdXJyZW50KCkgeworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlkb3VibGUgcmV0VmFsID0gZ2V0VmluQ3VycmVudCgmc3RhdHVzKTsKKwl3cGlfc2V0R2xvYmFsRXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwlyZXR1cm4gcmV0VmFsOworfQorCisvKioKKyAqIEdldCB0aGUgdm9sdGFnZSBvZiB0aGUgNlYgcmFpbAorICogQHJldHVybiBUaGUgY29udHJvbGxlciA2ViByYWlsIHZvbHRhZ2UgdmFsdWUgaW4gVm9sdHMKKyAqLworZG91YmxlIENvbnRyb2xsZXJQb3dlcjo6R2V0Vm9sdGFnZTZWKCkgeworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlkb3VibGUgcmV0VmFsID0gZ2V0VXNlclZvbHRhZ2U2Vigmc3RhdHVzKTsKKwl3cGlfc2V0R2xvYmFsRXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwlyZXR1cm4gcmV0VmFsOworfQorCisvKioKKyAqIEdldCB0aGUgY3VycmVudCBvdXRwdXQgb2YgdGhlIDZWIHJhaWwKKyAqIEByZXR1cm4gVGhlIGNvbnRyb2xsZXIgNlYgcmFpbCBvdXRwdXQgY3VycmVudCB2YWx1ZSBpbiBBbXBzCisgKi8KK2RvdWJsZSBDb250cm9sbGVyUG93ZXI6OkdldEN1cnJlbnQ2VigpIHsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJZG91YmxlIHJldFZhbCA9IGdldFVzZXJDdXJyZW50NlYoJnN0YXR1cyk7CisJd3BpX3NldEdsb2JhbEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJcmV0dXJuIHJldFZhbDsKK30KKworLyoqCisgKiBHZXQgdGhlIGVuYWJsZWQgc3RhdGUgb2YgdGhlIDZWIHJhaWwuIFRoZSByYWlsIG1heSBiZSBkaXNhYmxlZCBkdWUgdG8gYSBjb250cm9sbGVyCisgKiBicm93bm91dCwgYSBzaG9ydCBjaXJjdWl0IG9uIHRoZSByYWlsLCBvciBjb250cm9sbGVyIG92ZXItdm9sdGFnZQorICogQHJldHVybiBUaGUgY29udHJvbGxlciA2ViByYWlsIGVuYWJsZWQgdmFsdWUuIFRydWUgZm9yIGVuYWJsZWQuCisgKi8KK2Jvb2wgQ29udHJvbGxlclBvd2VyOjpHZXRFbmFibGVkNlYoKSB7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCWJvb2wgcmV0VmFsID0gZ2V0VXNlckFjdGl2ZTZWKCZzdGF0dXMpOworCXdwaV9zZXRHbG9iYWxFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCXJldHVybiByZXRWYWw7Cit9CisKKy8qKgorICogR2V0IHRoZSBjb3VudCBvZiB0aGUgdG90YWwgY3VycmVudCBmYXVsdHMgb24gdGhlIDZWIHJhaWwgc2luY2UgdGhlIGNvbnRyb2xsZXIgaGFzIGJvb3RlZAorICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGZhdWx0cy4KKyAqLworaW50IENvbnRyb2xsZXJQb3dlcjo6R2V0RmF1bHRDb3VudDZWKCkgeworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlpbnQgcmV0VmFsID0gZ2V0VXNlckN1cnJlbnRGYXVsdHM2Vigmc3RhdHVzKTsKKwl3cGlfc2V0R2xvYmFsRXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwlyZXR1cm4gcmV0VmFsOworfQorCisvKioKKyAqIEdldCB0aGUgdm9sdGFnZSBvZiB0aGUgNVYgcmFpbAorICogQHJldHVybiBUaGUgY29udHJvbGxlciA1ViByYWlsIHZvbHRhZ2UgdmFsdWUgaW4gVm9sdHMKKyAqLworZG91YmxlIENvbnRyb2xsZXJQb3dlcjo6R2V0Vm9sdGFnZTVWKCkgeworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlkb3VibGUgcmV0VmFsID0gZ2V0VXNlclZvbHRhZ2U1Vigmc3RhdHVzKTsKKwl3cGlfc2V0R2xvYmFsRXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwlyZXR1cm4gcmV0VmFsOworfQorCisvKioKKyAqIEdldCB0aGUgY3VycmVudCBvdXRwdXQgb2YgdGhlIDVWIHJhaWwKKyAqIEByZXR1cm4gVGhlIGNvbnRyb2xsZXIgNVYgcmFpbCBvdXRwdXQgY3VycmVudCB2YWx1ZSBpbiBBbXBzCisgKi8KK2RvdWJsZSBDb250cm9sbGVyUG93ZXI6OkdldEN1cnJlbnQ1VigpIHsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJZG91YmxlIHJldFZhbCA9IGdldFVzZXJDdXJyZW50NVYoJnN0YXR1cyk7CisJd3BpX3NldEdsb2JhbEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJcmV0dXJuIHJldFZhbDsKK30KKworLyoqCisgKiBHZXQgdGhlIGVuYWJsZWQgc3RhdGUgb2YgdGhlIDVWIHJhaWwuIFRoZSByYWlsIG1heSBiZSBkaXNhYmxlZCBkdWUgdG8gYSBjb250cm9sbGVyCisgKiBicm93bm91dCwgYSBzaG9ydCBjaXJjdWl0IG9uIHRoZSByYWlsLCBvciBjb250cm9sbGVyIG92ZXItdm9sdGFnZQorICogQHJldHVybiBUaGUgY29udHJvbGxlciA1ViByYWlsIGVuYWJsZWQgdmFsdWUuIFRydWUgZm9yIGVuYWJsZWQuCisgKi8KK2Jvb2wgQ29udHJvbGxlclBvd2VyOjpHZXRFbmFibGVkNVYoKSB7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCWJvb2wgcmV0VmFsID0gZ2V0VXNlckFjdGl2ZTVWKCZzdGF0dXMpOworCXdwaV9zZXRHbG9iYWxFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCXJldHVybiByZXRWYWw7Cit9CisKKy8qKgorICogR2V0IHRoZSBjb3VudCBvZiB0aGUgdG90YWwgY3VycmVudCBmYXVsdHMgb24gdGhlIDVWIHJhaWwgc2luY2UgdGhlIGNvbnRyb2xsZXIgaGFzIGJvb3RlZAorICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGZhdWx0cworICovCitpbnQgQ29udHJvbGxlclBvd2VyOjpHZXRGYXVsdENvdW50NVYoKSB7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCWludCByZXRWYWwgPSBnZXRVc2VyQ3VycmVudEZhdWx0czVWKCZzdGF0dXMpOworCXdwaV9zZXRHbG9iYWxFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCXJldHVybiByZXRWYWw7Cit9CisKKy8qKgorICogR2V0IHRoZSB2b2x0YWdlIG9mIHRoZSAzLjNWIHJhaWwKKyAqIEByZXR1cm4gVGhlIGNvbnRyb2xsZXIgMy4zViByYWlsIHZvbHRhZ2UgdmFsdWUgaW4gVm9sdHMKKyAqLworZG91YmxlIENvbnRyb2xsZXJQb3dlcjo6R2V0Vm9sdGFnZTNWMygpIHsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJZG91YmxlIHJldFZhbCA9IGdldFVzZXJWb2x0YWdlM1YzKCZzdGF0dXMpOworCXdwaV9zZXRHbG9iYWxFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCXJldHVybiByZXRWYWw7Cit9CisKKy8qKgorICogR2V0IHRoZSBjdXJyZW50IG91dHB1dCBvZiB0aGUgMy4zViByYWlsCisgKiBAcmV0dXJuIFRoZSBjb250cm9sbGVyIDMuM1YgcmFpbCBvdXRwdXQgY3VycmVudCB2YWx1ZSBpbiBBbXBzCisgKi8KK2RvdWJsZSBDb250cm9sbGVyUG93ZXI6OkdldEN1cnJlbnQzVjMoKSB7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCWRvdWJsZSByZXRWYWwgPSBnZXRVc2VyQ3VycmVudDNWMygmc3RhdHVzKTsKKwl3cGlfc2V0R2xvYmFsRXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwlyZXR1cm4gcmV0VmFsOworfQorCisKKy8qKgorICogR2V0IHRoZSBlbmFibGVkIHN0YXRlIG9mIHRoZSAzLjNWIHJhaWwuIFRoZSByYWlsIG1heSBiZSBkaXNhYmxlZCBkdWUgdG8gYSBjb250cm9sbGVyCisgKiBicm93bm91dCwgYSBzaG9ydCBjaXJjdWl0IG9uIHRoZSByYWlsLCBvciBjb250cm9sbGVyIG92ZXItdm9sdGFnZQorICogQHJldHVybiBUaGUgY29udHJvbGxlciAzLjNWIHJhaWwgZW5hYmxlZCB2YWx1ZS4gVHJ1ZSBmb3IgZW5hYmxlZC4KKyAqLworYm9vbCBDb250cm9sbGVyUG93ZXI6OkdldEVuYWJsZWQzVjMoKSB7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCWJvb2wgcmV0VmFsID0gZ2V0VXNlckFjdGl2ZTNWMygmc3RhdHVzKTsKKwl3cGlfc2V0R2xvYmFsRXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwlyZXR1cm4gcmV0VmFsOworfQorCisvKioKKyAqIEdldCB0aGUgY291bnQgb2YgdGhlIHRvdGFsIGN1cnJlbnQgZmF1bHRzIG9uIHRoZSAzLjNWIHJhaWwgc2luY2UgdGhlIGNvbnRyb2xsZXIgaGFzIGJvb3RlZAorICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGZhdWx0cworICovCitpbnQgQ29udHJvbGxlclBvd2VyOjpHZXRGYXVsdENvdW50M1YzKCkgeworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlpbnQgcmV0VmFsID0gZ2V0VXNlckN1cnJlbnRGYXVsdHMzVjMoJnN0YXR1cyk7CisJd3BpX3NldEdsb2JhbEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJcmV0dXJuIHJldFZhbDsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0NvdW50ZXIuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9Db3VudGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjRiNzc0Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9Db3VudGVyLmNwcApAQCAtMCwwICsxLDYxOSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiQ291bnRlci5oIgorI2luY2x1ZGUgIkFuYWxvZ1RyaWdnZXIuaCIKKyNpbmNsdWRlICJEaWdpdGFsSW5wdXQuaCIKKy8vI2luY2x1ZGUgIk5ldHdvcmtDb21tdW5pY2F0aW9uL1VzYWdlUmVwb3J0aW5nLmgiCisjaW5jbHVkZSAiUmVzb3VyY2UuaCIKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKworLyoqCisgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYSBjb3VudGVyIG9iamVjdC4KKyAqIFRoaXMgY3JlYXRlcyBhIENoaXBPYmplY3QgY291bnRlciBhbmQgaW5pdGlhbGl6ZXMgc3RhdHVzIHZhcmlhYmxlcyBhcHByb3ByaWF0ZWx5CisgKgorICogVGhlIGNvdW50ZXIgd2lsbCBzdGFydCBjb3VudGluZyBpbW1lZGlhdGVseS4KKyAqIEBwYXJhbSBtb2RlIFRoZSBjb3VudGVyIG1vZGUKKyAqLwordm9pZCBDb3VudGVyOjpJbml0Q291bnRlcihNb2RlIG1vZGUpCit7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCW1faW5kZXggPSAwOworCW1fY291bnRlciA9IGluaXRpYWxpemVDb3VudGVyKG1vZGUsICZtX2luZGV4LCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKworCW1fdXBTb3VyY2UgPSBOVUxMOworCW1fZG93blNvdXJjZSA9IE5VTEw7CisJbV9hbGxvY2F0ZWRVcFNvdXJjZSA9IGZhbHNlOworCW1fYWxsb2NhdGVkRG93blNvdXJjZSA9IGZhbHNlOworCisJU2V0TWF4UGVyaW9kKC41KTsKKworCUhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9Db3VudGVyLCBtX2luZGV4LCBtb2RlKTsKK30KKworLyoqCisgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYSBjb3VudGVyIHdoZXJlIG5vIHNvdXJjZXMgYXJlIHNlbGVjdGVkLgorICogVGhleSBhbGwgbXVzdCBiZSBzZWxlY3RlZCBieSBjYWxsaW5nIGZ1bmN0aW9ucyB0byBzcGVjaWZ5IHRoZSB1cHNvdXJjZSBhbmQgdGhlIGRvd25zb3VyY2UKKyAqIGluZGVwZW5kZW50bHkuCisgKgorICogVGhlIGNvdW50ZXIgd2lsbCBzdGFydCBjb3VudGluZyBpbW1lZGlhdGVseS4KKyAqLworQ291bnRlcjo6Q291bnRlcigpIDoKKwltX3VwU291cmNlKE5VTEwpLAorCW1fZG93blNvdXJjZShOVUxMKSwKKwltX2NvdW50ZXIoTlVMTCkKK3sKKwlJbml0Q291bnRlcigpOworfQorCisvKioKKyAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhIGNvdW50ZXIgZnJvbSBhIERpZ2l0YWwgU291cmNlIChzdWNoIGFzIGEgRGlnaXRhbCBJbnB1dCkuCisgKiBUaGlzIGlzIHVzZWQgaWYgYW4gZXhpc3RpbmcgZGlnaXRhbCBpbnB1dCBpcyB0byBiZSBzaGFyZWQgYnkgbXVsdGlwbGUgb3RoZXIgb2JqZWN0cyBzdWNoCisgKiBhcyBlbmNvZGVycyBvciBpZiB0aGUgRGlnaXRhbCBTb3VyY2UgaXMgbm90IGEgRGlnaXRhbCBJbnB1dCBjaGFubmVsIChzdWNoIGFzIGFuIEFuYWxvZyBUcmlnZ2VyKS4KKyAqCisgKiBUaGUgY291bnRlciB3aWxsIHN0YXJ0IGNvdW50aW5nIGltbWVkaWF0ZWx5LgorICogQHBhcmFtIHNvdXJjZSBBIHBvaW50ZXIgdG8gdGhlIGV4aXN0aW5nIERpZ2l0YWxTb3VyY2Ugb2JqZWN0LiBJdCB3aWxsIGJlIHNldCBhcyB0aGUgVXAgU291cmNlLgorICovCitDb3VudGVyOjpDb3VudGVyKERpZ2l0YWxTb3VyY2UgKnNvdXJjZSkgOgorCW1fdXBTb3VyY2UoTlVMTCksCisJbV9kb3duU291cmNlKE5VTEwpLAorCW1fY291bnRlcihOVUxMKQoreworCUluaXRDb3VudGVyKCk7CisJU2V0VXBTb3VyY2Uoc291cmNlKTsKKwlDbGVhckRvd25Tb3VyY2UoKTsKK30KKworLyoqCisgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYSBjb3VudGVyIGZyb20gYSBEaWdpdGFsIFNvdXJjZSAoc3VjaCBhcyBhIERpZ2l0YWwgSW5wdXQpLgorICogVGhpcyBpcyB1c2VkIGlmIGFuIGV4aXN0aW5nIGRpZ2l0YWwgaW5wdXQgaXMgdG8gYmUgc2hhcmVkIGJ5IG11bHRpcGxlIG90aGVyIG9iamVjdHMgc3VjaAorICogYXMgZW5jb2RlcnMgb3IgaWYgdGhlIERpZ2l0YWwgU291cmNlIGlzIG5vdCBhIERpZ2l0YWwgSW5wdXQgY2hhbm5lbCAoc3VjaCBhcyBhbiBBbmFsb2cgVHJpZ2dlcikuCisgKgorICogVGhlIGNvdW50ZXIgd2lsbCBzdGFydCBjb3VudGluZyBpbW1lZGlhdGVseS4KKyAqIEBwYXJhbSBzb3VyY2UgQSByZWZlcmVuY2UgdG8gdGhlIGV4aXN0aW5nIERpZ2l0YWxTb3VyY2Ugb2JqZWN0LiBJdCB3aWxsIGJlIHNldCBhcyB0aGUgVXAgU291cmNlLgorICovCitDb3VudGVyOjpDb3VudGVyKERpZ2l0YWxTb3VyY2UgJnNvdXJjZSkgOgorCW1fdXBTb3VyY2UoTlVMTCksCisJbV9kb3duU291cmNlKE5VTEwpLAorCW1fY291bnRlcihOVUxMKQoreworCUluaXRDb3VudGVyKCk7CisJU2V0VXBTb3VyY2UoJnNvdXJjZSk7CisJQ2xlYXJEb3duU291cmNlKCk7Cit9CisKKy8qKgorICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIGEgQ291bnRlciBvYmplY3QuCisgKiBDcmVhdGUgYW4gdXAtQ291bnRlciBpbnN0YW5jZSBnaXZlbiBhIGNoYW5uZWwuCisgKgorICogVGhlIGNvdW50ZXIgd2lsbCBzdGFydCBjb3VudGluZyBpbW1lZGlhdGVseS4KKyAqIEBwYXJhbSBjaGFubmVsIFRoZSBESU8gY2hhbm5lbCB0byB1c2UgYXMgdGhlIHVwIHNvdXJjZS4gMC05IGFyZSBvbi1ib2FyZCwgMTAtMjUgYXJlIG9uIHRoZSBNWFAgCisgKi8KK0NvdW50ZXI6OkNvdW50ZXIoaW50MzJfdCBjaGFubmVsKSA6CisJbV91cFNvdXJjZShOVUxMKSwKKwltX2Rvd25Tb3VyY2UoTlVMTCksCisJbV9jb3VudGVyKE5VTEwpCit7CisJSW5pdENvdW50ZXIoKTsKKwlTZXRVcFNvdXJjZShjaGFubmVsKTsKKwlDbGVhckRvd25Tb3VyY2UoKTsKK30KKworLyoqCisgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYSBDb3VudGVyIG9iamVjdC4KKyAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhIHNpbXBsZSB1cC1Db3VudGVyIGdpdmVuIGFuIGFuYWxvZyB0cmlnZ2VyLgorICogVXNlIHRoZSB0cmlnZ2VyIHN0YXRlIG91dHB1dCBmcm9tIHRoZSBhbmFsb2cgdHJpZ2dlci4KKyAqCisgKiBUaGUgY291bnRlciB3aWxsIHN0YXJ0IGNvdW50aW5nIGltbWVkaWF0ZWx5LgorICogQHBhcmFtIHRyaWdnZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGV4aXN0aW5nIEFuYWxvZ1RyaWdnZXIgb2JqZWN0LgorICovCitDb3VudGVyOjpDb3VudGVyKEFuYWxvZ1RyaWdnZXIgKnRyaWdnZXIpIDoKKwltX3VwU291cmNlKE5VTEwpLAorCW1fZG93blNvdXJjZShOVUxMKSwKKwltX2NvdW50ZXIoTlVMTCkKK3sKKwlJbml0Q291bnRlcigpOworCVNldFVwU291cmNlKHRyaWdnZXItPkNyZWF0ZU91dHB1dChrU3RhdGUpKTsKKwlDbGVhckRvd25Tb3VyY2UoKTsKKwltX2FsbG9jYXRlZFVwU291cmNlID0gdHJ1ZTsKK30KKworLyoqCisgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYSBDb3VudGVyIG9iamVjdC4KKyAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhIHNpbXBsZSB1cC1Db3VudGVyIGdpdmVuIGFuIGFuYWxvZyB0cmlnZ2VyLgorICogVXNlIHRoZSB0cmlnZ2VyIHN0YXRlIG91dHB1dCBmcm9tIHRoZSBhbmFsb2cgdHJpZ2dlci4KKyAqCisgKiBUaGUgY291bnRlciB3aWxsIHN0YXJ0IGNvdW50aW5nIGltbWVkaWF0ZWx5LgorICogQHBhcmFtIHRyaWdnZXIgVGhlIHJlZmVyZW5jZSB0byB0aGUgZXhpc3RpbmcgQW5hbG9nVHJpZ2dlciBvYmplY3QuCisgKi8KK0NvdW50ZXI6OkNvdW50ZXIoQW5hbG9nVHJpZ2dlciAmdHJpZ2dlcikgOgorCW1fdXBTb3VyY2UoTlVMTCksCisJbV9kb3duU291cmNlKE5VTEwpLAorCW1fY291bnRlcihOVUxMKQoreworCUluaXRDb3VudGVyKCk7CisJU2V0VXBTb3VyY2UodHJpZ2dlci5DcmVhdGVPdXRwdXQoa1N0YXRlKSk7CisJQ2xlYXJEb3duU291cmNlKCk7CisJbV9hbGxvY2F0ZWRVcFNvdXJjZSA9IHRydWU7Cit9CisKKy8qKgorICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIGEgQ291bnRlciBvYmplY3QuCisgKiBDcmVhdGVzIGEgZnVsbCB1cC1kb3duIGNvdW50ZXIgZ2l2ZW4gdHdvIERpZ2l0YWwgU291cmNlcworICogQHBhcmFtIGVuY29kaW5nVHlwZSBUaGUgcXVhZHJhdHVyZSBkZWNvZGluZyBtb2RlICgxeCBvciAyeCkKKyAqIEBwYXJhbSB1cFNvdXJjZSBUaGUgcG9pbnRlciB0byB0aGUgRGlnaXRhbFNvdXJjZSB0byBzZXQgYXMgdGhlIHVwIHNvdXJjZQorICogQHBhcmFtIGRvd25Tb3VyY2UgVGhlIHBvaW50ZXIgdG8gdGhlIERpZ2l0YWxTb3VyY2UgdG8gc2V0IGFzIHRoZSBkb3duIHNvdXJjZQorICogQHBhcmFtIGludmVydGVkIFRydWUgdG8gaW52ZXJ0IHRoZSBvdXRwdXQgKHJldmVyc2UgdGhlIGRpcmVjdGlvbikKKyAqLworCQorQ291bnRlcjo6Q291bnRlcihFbmNvZGluZ1R5cGUgZW5jb2RpbmdUeXBlLCBEaWdpdGFsU291cmNlICp1cFNvdXJjZSwgRGlnaXRhbFNvdXJjZSAqZG93blNvdXJjZSwgYm9vbCBpbnZlcnRlZCkgOgorCW1fdXBTb3VyY2UoTlVMTCksCisJbV9kb3duU291cmNlKE5VTEwpLAorCW1fY291bnRlcihOVUxMKQoreworCWlmIChlbmNvZGluZ1R5cGUgIT0gazFYICYmIGVuY29kaW5nVHlwZSAhPSBrMlgpCisJeworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChQYXJhbWV0ZXJPdXRPZlJhbmdlLCAiQ291bnRlciBvbmx5IHN1cHBvcnRzIDFYIGFuZCAyWCBxdWFkcmF0dXJlIGRlY29kaW5nLiIpOworCQlyZXR1cm47CisJfQorCUluaXRDb3VudGVyKGtFeHRlcm5hbERpcmVjdGlvbik7CisJU2V0VXBTb3VyY2UodXBTb3VyY2UpOworCVNldERvd25Tb3VyY2UoZG93blNvdXJjZSk7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCisJaWYgKGVuY29kaW5nVHlwZSA9PSBrMVgpCisJeworCQlTZXRVcFNvdXJjZUVkZ2UodHJ1ZSwgZmFsc2UpOworCQlzZXRDb3VudGVyQXZlcmFnZVNpemUobV9jb3VudGVyLCAxLCAmc3RhdHVzKTsKKwl9CisJZWxzZQorCXsKKwkJU2V0VXBTb3VyY2VFZGdlKHRydWUsIHRydWUpOworCQlzZXRDb3VudGVyQXZlcmFnZVNpemUobV9jb3VudGVyLCAyLCAmc3RhdHVzKTsKKwl9CisKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwlTZXREb3duU291cmNlRWRnZShpbnZlcnRlZCwgdHJ1ZSk7Cit9CisKKy8qKgorICogRGVsZXRlIHRoZSBDb3VudGVyIG9iamVjdC4KKyAqLworQ291bnRlcjo6fkNvdW50ZXIoKQoreworCVNldFVwZGF0ZVdoZW5FbXB0eSh0cnVlKTsKKwlpZiAobV9hbGxvY2F0ZWRVcFNvdXJjZSkKKwl7CisJCWRlbGV0ZSBtX3VwU291cmNlOworCQltX3VwU291cmNlID0gTlVMTDsKKwl9CisJaWYgKG1fYWxsb2NhdGVkRG93blNvdXJjZSkKKwl7CisJCWRlbGV0ZSBtX2Rvd25Tb3VyY2U7CisJCW1fZG93blNvdXJjZSA9IE5VTEw7CisJfQorCisJaW50MzJfdCBzdGF0dXMgPSAwOworCWZyZWVDb3VudGVyKG1fY291bnRlciwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJbV9jb3VudGVyID0gTlVMTDsKK30KKworLyoqCisgKiBTZXQgdGhlIHVwc291cmNlIGZvciB0aGUgY291bnRlciBhcyBhIGRpZ2l0YWwgaW5wdXQgY2hhbm5lbC4KKyAqIEBwYXJhbSBjaGFubmVsIFRoZSBESU8gY2hhbm5lbCB0byB1c2UgYXMgdGhlIHVwIHNvdXJjZS4gMC05IGFyZSBvbi1ib2FyZCwgMTAtMjUgYXJlIG9uIHRoZSBNWFAgCisgKi8KK3ZvaWQgQ291bnRlcjo6U2V0VXBTb3VyY2UoaW50MzJfdCBjaGFubmVsKQoreworICAgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKyAgICBTZXRVcFNvdXJjZShuZXcgRGlnaXRhbElucHV0KGNoYW5uZWwpKTsKKyAgICBtX2FsbG9jYXRlZFVwU291cmNlID0gdHJ1ZTsKK30KKworLyoqCisgKiBTZXQgdGhlIHVwIGNvdW50aW5nIHNvdXJjZSB0byBiZSBhbiBhbmFsb2cgdHJpZ2dlci4KKyAqIEBwYXJhbSBhbmFsb2dUcmlnZ2VyIFRoZSBhbmFsb2cgdHJpZ2dlciBvYmplY3QgdGhhdCBpcyB1c2VkIGZvciB0aGUgVXAgU291cmNlCisgKiBAcGFyYW0gdHJpZ2dlclR5cGUgVGhlIGFuYWxvZyB0cmlnZ2VyIG91dHB1dCB0aGF0IHdpbGwgdHJpZ2dlciB0aGUgY291bnRlci4KKyAqLwordm9pZCBDb3VudGVyOjpTZXRVcFNvdXJjZShBbmFsb2dUcmlnZ2VyICphbmFsb2dUcmlnZ2VyLCBBbmFsb2dUcmlnZ2VyVHlwZSB0cmlnZ2VyVHlwZSkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisJU2V0VXBTb3VyY2UoYW5hbG9nVHJpZ2dlci0+Q3JlYXRlT3V0cHV0KHRyaWdnZXJUeXBlKSk7CisJbV9hbGxvY2F0ZWRVcFNvdXJjZSA9IHRydWU7Cit9CisKKy8qKgorICogU2V0IHRoZSB1cCBjb3VudGluZyBzb3VyY2UgdG8gYmUgYW4gYW5hbG9nIHRyaWdnZXIuCisgKiBAcGFyYW0gYW5hbG9nVHJpZ2dlciBUaGUgYW5hbG9nIHRyaWdnZXIgb2JqZWN0IHRoYXQgaXMgdXNlZCBmb3IgdGhlIFVwIFNvdXJjZQorICogQHBhcmFtIHRyaWdnZXJUeXBlIFRoZSBhbmFsb2cgdHJpZ2dlciBvdXRwdXQgdGhhdCB3aWxsIHRyaWdnZXIgdGhlIGNvdW50ZXIuCisgKi8KK3ZvaWQgQ291bnRlcjo6U2V0VXBTb3VyY2UoQW5hbG9nVHJpZ2dlciAmYW5hbG9nVHJpZ2dlciwgQW5hbG9nVHJpZ2dlclR5cGUgdHJpZ2dlclR5cGUpCit7CisJU2V0VXBTb3VyY2UoJmFuYWxvZ1RyaWdnZXIsIHRyaWdnZXJUeXBlKTsKK30KKworLyoqCisgKiBTZXQgdGhlIHNvdXJjZSBvYmplY3QgdGhhdCBjYXVzZXMgdGhlIGNvdW50ZXIgdG8gY291bnQgdXAuCisgKiBTZXQgdGhlIHVwIGNvdW50aW5nIERpZ2l0YWxTb3VyY2UuCisgKiBAcGFyYW0gc291cmNlIFBvaW50ZXIgdG8gdGhlIERpZ2l0YWxTb3VyY2Ugb2JqZWN0IHRvIHNldCBhcyB0aGUgdXAgc291cmNlCisgKi8KK3ZvaWQgQ291bnRlcjo6U2V0VXBTb3VyY2UoRGlnaXRhbFNvdXJjZSAqc291cmNlKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKwlpZiAobV9hbGxvY2F0ZWRVcFNvdXJjZSkKKwl7CisJCWRlbGV0ZSBtX3VwU291cmNlOworCQltX3VwU291cmNlID0gTlVMTDsKKwkJbV9hbGxvY2F0ZWRVcFNvdXJjZSA9IGZhbHNlOworCX0KKwltX3VwU291cmNlID0gc291cmNlOworCWlmIChtX3VwU291cmNlLT5TdGF0dXNJc0ZhdGFsKCkpCisJeworCQlDbG9uZUVycm9yKG1fdXBTb3VyY2UpOworCX0KKwllbHNlCisJeworCQlpbnQzMl90IHN0YXR1cyA9IDA7CisJCXNldENvdW50ZXJVcFNvdXJjZShtX2NvdW50ZXIsIHNvdXJjZS0+R2V0Q2hhbm5lbEZvclJvdXRpbmcoKSwKKwkJICAgICAgICAgICAgICAgICAgIHNvdXJjZS0+R2V0QW5hbG9nVHJpZ2dlckZvclJvdXRpbmcoKSwgJnN0YXR1cyk7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KK30KKworLyoqCisgKiBTZXQgdGhlIHNvdXJjZSBvYmplY3QgdGhhdCBjYXVzZXMgdGhlIGNvdW50ZXIgdG8gY291bnQgdXAuCisgKiBTZXQgdGhlIHVwIGNvdW50aW5nIERpZ2l0YWxTb3VyY2UuCisgKiBAcGFyYW0gc291cmNlIFJlZmVyZW5jZSB0byB0aGUgRGlnaXRhbFNvdXJjZSBvYmplY3QgdG8gc2V0IGFzIHRoZSB1cCBzb3VyY2UKKyAqLwordm9pZCBDb3VudGVyOjpTZXRVcFNvdXJjZShEaWdpdGFsU291cmNlICZzb3VyY2UpCit7CisJU2V0VXBTb3VyY2UoJnNvdXJjZSk7Cit9CisKKy8qKgorICogU2V0IHRoZSBlZGdlIHNlbnNpdGl2aXR5IG9uIGFuIHVwIGNvdW50aW5nIHNvdXJjZS4KKyAqIFNldCB0aGUgdXAgc291cmNlIHRvIGVpdGhlciBkZXRlY3QgcmlzaW5nIGVkZ2VzIG9yIGZhbGxpbmcgZWRnZXMgb3IgYm90aC4KKyAqIEBwYXJhbSByaXNpbmdFZGdlIFRydWUgdG8gdHJpZ2dlciBvbiByaXNpbmcgZWRnZXMKKyAqIEBwYXJhbSBmYWxsaW5nRWRnZSBUcnVlIHRvIHRyaWdnZXIgb24gZmFsbGluZyBlZGdlcworICovCit2b2lkIENvdW50ZXI6OlNldFVwU291cmNlRWRnZShib29sIHJpc2luZ0VkZ2UsIGJvb2wgZmFsbGluZ0VkZ2UpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCWlmIChtX3VwU291cmNlID09IE5VTEwpCisJeworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChOdWxsUGFyYW1ldGVyLCAiTXVzdCBzZXQgbm9uLU5VTEwgVXBTb3VyY2UgYmVmb3JlIHNldHRpbmcgVXBTb3VyY2VFZGdlIik7CisJfQorCWludDMyX3Qgc3RhdHVzID0gMDsKKwlzZXRDb3VudGVyVXBTb3VyY2VFZGdlKG1fY291bnRlciwgcmlzaW5nRWRnZSwgZmFsbGluZ0VkZ2UsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIERpc2FibGUgdGhlIHVwIGNvdW50aW5nIHNvdXJjZSB0byB0aGUgY291bnRlci4KKyAqLwordm9pZCBDb3VudGVyOjpDbGVhclVwU291cmNlKCkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisJaWYgKG1fYWxsb2NhdGVkVXBTb3VyY2UpCisJeworCQlkZWxldGUgbV91cFNvdXJjZTsKKwkJbV91cFNvdXJjZSA9IE5VTEw7CisJCW1fYWxsb2NhdGVkVXBTb3VyY2UgPSBmYWxzZTsKKwl9CisJaW50MzJfdCBzdGF0dXMgPSAwOworCWNsZWFyQ291bnRlclVwU291cmNlKG1fY291bnRlciwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogU2V0IHRoZSBkb3duIGNvdW50aW5nIHNvdXJjZSB0byBiZSBhIGRpZ2l0YWwgaW5wdXQgY2hhbm5lbC4KKyAqIEBwYXJhbSBjaGFubmVsIFRoZSBESU8gY2hhbm5lbCB0byB1c2UgYXMgdGhlIHVwIHNvdXJjZS4gMC05IGFyZSBvbi1ib2FyZCwgMTAtMjUgYXJlIG9uIHRoZSBNWFAgCisgKi8KK3ZvaWQgQ291bnRlcjo6U2V0RG93blNvdXJjZShpbnQzMl90IGNoYW5uZWwpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCVNldERvd25Tb3VyY2UobmV3IERpZ2l0YWxJbnB1dChjaGFubmVsKSk7CisJbV9hbGxvY2F0ZWREb3duU291cmNlID0gdHJ1ZTsKK30KKworLyoqCisgKiBTZXQgdGhlIGRvd24gY291bnRpbmcgc291cmNlIHRvIGJlIGFuIGFuYWxvZyB0cmlnZ2VyLgorICogQHBhcmFtIGFuYWxvZ1RyaWdnZXIgVGhlIGFuYWxvZyB0cmlnZ2VyIG9iamVjdCB0aGF0IGlzIHVzZWQgZm9yIHRoZSBEb3duIFNvdXJjZQorICogQHBhcmFtIHRyaWdnZXJUeXBlIFRoZSBhbmFsb2cgdHJpZ2dlciBvdXRwdXQgdGhhdCB3aWxsIHRyaWdnZXIgdGhlIGNvdW50ZXIuCisgKi8KK3ZvaWQgQ291bnRlcjo6U2V0RG93blNvdXJjZShBbmFsb2dUcmlnZ2VyICphbmFsb2dUcmlnZ2VyLCBBbmFsb2dUcmlnZ2VyVHlwZSB0cmlnZ2VyVHlwZSkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisJU2V0RG93blNvdXJjZShhbmFsb2dUcmlnZ2VyLT5DcmVhdGVPdXRwdXQodHJpZ2dlclR5cGUpKTsKKwltX2FsbG9jYXRlZERvd25Tb3VyY2UgPSB0cnVlOworfQorCisvKioKKyAqIFNldCB0aGUgZG93biBjb3VudGluZyBzb3VyY2UgdG8gYmUgYW4gYW5hbG9nIHRyaWdnZXIuCisgKiBAcGFyYW0gYW5hbG9nVHJpZ2dlciBUaGUgYW5hbG9nIHRyaWdnZXIgb2JqZWN0IHRoYXQgaXMgdXNlZCBmb3IgdGhlIERvd24gU291cmNlCisgKiBAcGFyYW0gdHJpZ2dlclR5cGUgVGhlIGFuYWxvZyB0cmlnZ2VyIG91dHB1dCB0aGF0IHdpbGwgdHJpZ2dlciB0aGUgY291bnRlci4KKyAqLwordm9pZCBDb3VudGVyOjpTZXREb3duU291cmNlKEFuYWxvZ1RyaWdnZXIgJmFuYWxvZ1RyaWdnZXIsIEFuYWxvZ1RyaWdnZXJUeXBlIHRyaWdnZXJUeXBlKQoreworCVNldERvd25Tb3VyY2UoJmFuYWxvZ1RyaWdnZXIsIHRyaWdnZXJUeXBlKTsKK30KKworLyoqCisgKiBTZXQgdGhlIHNvdXJjZSBvYmplY3QgdGhhdCBjYXVzZXMgdGhlIGNvdW50ZXIgdG8gY291bnQgZG93bi4KKyAqIFNldCB0aGUgZG93biBjb3VudGluZyBEaWdpdGFsU291cmNlLgorICogQHBhcmFtIHNvdXJjZSBQb2ludGVyIHRvIHRoZSBEaWdpdGFsU291cmNlIG9iamVjdCB0byBzZXQgYXMgdGhlIGRvd24gc291cmNlCisgKi8KK3ZvaWQgQ291bnRlcjo6U2V0RG93blNvdXJjZShEaWdpdGFsU291cmNlICpzb3VyY2UpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCWlmIChtX2FsbG9jYXRlZERvd25Tb3VyY2UpCisJeworCQlkZWxldGUgbV9kb3duU291cmNlOworCQltX2Rvd25Tb3VyY2UgPSBOVUxMOworCQltX2FsbG9jYXRlZERvd25Tb3VyY2UgPSBmYWxzZTsKKwl9CisJbV9kb3duU291cmNlID0gc291cmNlOworCWlmIChtX2Rvd25Tb3VyY2UtPlN0YXR1c0lzRmF0YWwoKSkKKwl7CisJCUNsb25lRXJyb3IobV9kb3duU291cmNlKTsKKwl9CisJZWxzZQorCXsKKwkJaW50MzJfdCBzdGF0dXMgPSAwOworCQlzZXRDb3VudGVyRG93blNvdXJjZShtX2NvdW50ZXIsIHNvdXJjZS0+R2V0Q2hhbm5lbEZvclJvdXRpbmcoKSwKKwkJICAgICAgICAgICAgICAgICAgICAgc291cmNlLT5HZXRBbmFsb2dUcmlnZ2VyRm9yUm91dGluZygpLCAmc3RhdHVzKTsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorfQorCisvKioKKyAqIFNldCB0aGUgc291cmNlIG9iamVjdCB0aGF0IGNhdXNlcyB0aGUgY291bnRlciB0byBjb3VudCBkb3duLgorICogU2V0IHRoZSBkb3duIGNvdW50aW5nIERpZ2l0YWxTb3VyY2UuCisgKiBAcGFyYW0gc291cmNlIFJlZmVyZW5jZSB0byB0aGUgRGlnaXRhbFNvdXJjZSBvYmplY3QgdG8gc2V0IGFzIHRoZSBkb3duIHNvdXJjZQorICovCit2b2lkIENvdW50ZXI6OlNldERvd25Tb3VyY2UoRGlnaXRhbFNvdXJjZSAmc291cmNlKQoreworCVNldERvd25Tb3VyY2UoJnNvdXJjZSk7Cit9CisKKy8qKgorICogU2V0IHRoZSBlZGdlIHNlbnNpdGl2aXR5IG9uIGEgZG93biBjb3VudGluZyBzb3VyY2UuCisgKiBTZXQgdGhlIGRvd24gc291cmNlIHRvIGVpdGhlciBkZXRlY3QgcmlzaW5nIGVkZ2VzIG9yIGZhbGxpbmcgZWRnZXMuCisgKiBAcGFyYW0gcmlzaW5nRWRnZSBUcnVlIHRvIHRyaWdnZXIgb24gcmlzaW5nIGVkZ2VzCisgKiBAcGFyYW0gZmFsbGluZ0VkZ2UgVHJ1ZSB0byB0cmlnZ2VyIG9uIGZhbGxpbmcgZWRnZXMKKyAqLwordm9pZCBDb3VudGVyOjpTZXREb3duU291cmNlRWRnZShib29sIHJpc2luZ0VkZ2UsIGJvb2wgZmFsbGluZ0VkZ2UpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCWlmIChtX2Rvd25Tb3VyY2UgPT0gTlVMTCkKKwl7CisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KE51bGxQYXJhbWV0ZXIsICJNdXN0IHNldCBub24tTlVMTCBEb3duU291cmNlIGJlZm9yZSBzZXR0aW5nIERvd25Tb3VyY2VFZGdlIik7CisJfQorCWludDMyX3Qgc3RhdHVzID0gMDsKKwlzZXRDb3VudGVyRG93blNvdXJjZUVkZ2UobV9jb3VudGVyLCByaXNpbmdFZGdlLCBmYWxsaW5nRWRnZSwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogRGlzYWJsZSB0aGUgZG93biBjb3VudGluZyBzb3VyY2UgdG8gdGhlIGNvdW50ZXIuCisgKi8KK3ZvaWQgQ291bnRlcjo6Q2xlYXJEb3duU291cmNlKCkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisJaWYgKG1fYWxsb2NhdGVkRG93blNvdXJjZSkKKwl7CisJCWRlbGV0ZSBtX2Rvd25Tb3VyY2U7CisJCW1fZG93blNvdXJjZSA9IE5VTEw7CisJCW1fYWxsb2NhdGVkRG93blNvdXJjZSA9IGZhbHNlOworCX0KKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJY2xlYXJDb3VudGVyRG93blNvdXJjZShtX2NvdW50ZXIsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIFNldCBzdGFuZGFyZCB1cCAvIGRvd24gY291bnRpbmcgbW9kZSBvbiB0aGlzIGNvdW50ZXIuCisgKiBVcCBhbmQgZG93biBjb3VudHMgYXJlIHNvdXJjZWQgaW5kZXBlbmRlbnRseSBmcm9tIHR3byBpbnB1dHMuCisgKi8KK3ZvaWQgQ291bnRlcjo6U2V0VXBEb3duQ291bnRlck1vZGUoKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJc2V0Q291bnRlclVwRG93bk1vZGUobV9jb3VudGVyLCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKworLyoqCisgKiBTZXQgZXh0ZXJuYWwgZGlyZWN0aW9uIG1vZGUgb24gdGhpcyBjb3VudGVyLgorICogQ291bnRzIGFyZSBzb3VyY2VkIG9uIHRoZSBVcCBjb3VudGVyIGlucHV0LgorICogVGhlIERvd24gY291bnRlciBpbnB1dCByZXByZXNlbnRzIHRoZSBkaXJlY3Rpb24gdG8gY291bnQuCisgKi8KK3ZvaWQgQ291bnRlcjo6U2V0RXh0ZXJuYWxEaXJlY3Rpb25Nb2RlKCkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisJaW50MzJfdCBzdGF0dXMgPSAwOworCXNldENvdW50ZXJFeHRlcm5hbERpcmVjdGlvbk1vZGUobV9jb3VudGVyLCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKworLyoqCisgKiBTZXQgU2VtaS1wZXJpb2QgbW9kZSBvbiB0aGlzIGNvdW50ZXIuCisgKiBDb3VudHMgdXAgb24gYm90aCByaXNpbmcgYW5kIGZhbGxpbmcgZWRnZXMuCisgKi8KK3ZvaWQgQ291bnRlcjo6U2V0U2VtaVBlcmlvZE1vZGUoYm9vbCBoaWdoU2VtaVBlcmlvZCkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisJaW50MzJfdCBzdGF0dXMgPSAwOworCXNldENvdW50ZXJTZW1pUGVyaW9kTW9kZShtX2NvdW50ZXIsIGhpZ2hTZW1pUGVyaW9kLCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKworLyoqCisgKiBDb25maWd1cmUgdGhlIGNvdW50ZXIgdG8gY291bnQgaW4gdXAgb3IgZG93biBiYXNlZCBvbiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBwdWxzZS4KKyAqIFRoaXMgbW9kZSBpcyBtb3N0IHVzZWZ1bCBmb3IgZGlyZWN0aW9uIHNlbnNpdGl2ZSBnZWFyIHRvb3RoIHNlbnNvcnMuCisgKiBAcGFyYW0gdGhyZXNob2xkIFRoZSBwdWxzZSBsZW5ndGggYmV5b25kIHdoaWNoIHRoZSBjb3VudGVyIGNvdW50cyB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uLiAgVW5pdHMgYXJlIHNlY29uZHMuCisgKi8KK3ZvaWQgQ291bnRlcjo6U2V0UHVsc2VMZW5ndGhNb2RlKGZsb2F0IHRocmVzaG9sZCkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisJaW50MzJfdCBzdGF0dXMgPSAwOworCXNldENvdW50ZXJQdWxzZUxlbmd0aE1vZGUobV9jb3VudGVyLCB0aHJlc2hvbGQsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisKKy8qKgorICogR2V0IHRoZSBTYW1wbGVzIHRvIEF2ZXJhZ2Ugd2hpY2ggc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBvZiB0aGUgdGltZXIgdG8KKyAqIGF2ZXJhZ2Ugd2hlbiBjYWxjdWxhdGluZyB0aGUgcGVyaW9kLiBQZXJmb3JtIGF2ZXJhZ2luZyB0byBhY2NvdW50IGZvcgorICogbWVjaGFuaWNhbCBpbXBlcmZlY3Rpb25zIG9yIGFzIG92ZXJzYW1wbGluZyB0byBpbmNyZWFzZSByZXNvbHV0aW9uLgorICogQHJldHVybiBTYW1wbGVzVG9BdmVyYWdlIFRoZSBudW1iZXIgb2Ygc2FtcGxlcyBiZWluZyBhdmVyYWdlZCAoZnJvbSAxIHRvIDEyNykKKyAqLworaW50IENvdW50ZXI6OkdldFNhbXBsZXNUb0F2ZXJhZ2UoKQoreworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlpbnQzMl90IHNhbXBsZXMgPSBnZXRDb3VudGVyU2FtcGxlc1RvQXZlcmFnZShtX2NvdW50ZXIsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCXJldHVybiBzYW1wbGVzOworfQorCisvKioKKyAqIFNldCB0aGUgU2FtcGxlcyB0byBBdmVyYWdlIHdoaWNoIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgb2YgdGhlIHRpbWVyIHRvCisgKiBhdmVyYWdlIHdoZW4gY2FsY3VsYXRpbmcgdGhlIHBlcmlvZC4gUGVyZm9ybSBhdmVyYWdpbmcgdG8gYWNjb3VudCBmb3IKKyAqIG1lY2hhbmljYWwgaW1wZXJmZWN0aW9ucyBvciBhcyBvdmVyc2FtcGxpbmcgdG8gaW5jcmVhc2UgcmVzb2x1dGlvbi4KKyAqIEBwYXJhbSBzYW1wbGVzVG9BdmVyYWdlIFRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBhdmVyYWdlIGZyb20gMSB0byAxMjcuCisgKi8KK3ZvaWQgQ291bnRlcjo6U2V0U2FtcGxlc1RvQXZlcmFnZSAoaW50IHNhbXBsZXNUb0F2ZXJhZ2UpIHsKKwlpZiAoc2FtcGxlc1RvQXZlcmFnZSA8IDEgfHwgc2FtcGxlc1RvQXZlcmFnZSA+IDEyNykKKwl7CisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFBhcmFtZXRlck91dE9mUmFuZ2UsICJBdmVyYWdlIGNvdW50ZXIgdmFsdWVzIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAxMjciKTsKKwl9CisJaW50MzJfdCBzdGF0dXMgPSAwOworCXNldENvdW50ZXJTYW1wbGVzVG9BdmVyYWdlKG1fY291bnRlciwgc2FtcGxlc1RvQXZlcmFnZSwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogUmVhZCB0aGUgY3VycmVudCBjb3VudGVyIHZhbHVlLgorICogUmVhZCB0aGUgdmFsdWUgYXQgdGhpcyBpbnN0YW50LiBJdCBtYXkgc3RpbGwgYmUgcnVubmluZywgc28gaXQgcmVmbGVjdHMgdGhlIGN1cnJlbnQgdmFsdWUuIE5leHQKKyAqIHRpbWUgaXQgaXMgcmVhZCwgaXQgbWlnaHQgaGF2ZSBhIGRpZmZlcmVudCB2YWx1ZS4KKyAqLworaW50MzJfdCBDb3VudGVyOjpHZXQoKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiAwOworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlpbnQzMl90IHZhbHVlID0gZ2V0Q291bnRlcihtX2NvdW50ZXIsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCXJldHVybiB2YWx1ZTsKK30KKworLyoqCisgKiBSZXNldCB0aGUgQ291bnRlciB0byB6ZXJvLgorICogU2V0IHRoZSBjb3VudGVyIHZhbHVlIHRvIHplcm8uIFRoaXMgZG9lc24ndCBlZmZlY3QgdGhlIHJ1bm5pbmcgc3RhdGUgb2YgdGhlIGNvdW50ZXIsIGp1c3Qgc2V0cworICogdGhlIGN1cnJlbnQgdmFsdWUgdG8gemVyby4KKyAqLwordm9pZCBDb3VudGVyOjpSZXNldCgpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlyZXNldENvdW50ZXIobV9jb3VudGVyLCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKworLyoqCisgKiBHZXQgdGhlIFBlcmlvZCBvZiB0aGUgbW9zdCByZWNlbnQgY291bnQuCisgKiBSZXR1cm5zIHRoZSB0aW1lIGludGVydmFsIG9mIHRoZSBtb3N0IHJlY2VudCBjb3VudC4gVGhpcyBjYW4gYmUgdXNlZCBmb3IgdmVsb2NpdHkgY2FsY3VsYXRpb25zCisgKiB0byBkZXRlcm1pbmUgc2hhZnQgc3BlZWQuCisgKiBAcmV0dXJucyBUaGUgcGVyaW9kIGJldHdlZW4gdGhlIGxhc3QgdHdvIHB1bHNlcyBpbiB1bml0cyBvZiBzZWNvbmRzLgorICovCitkb3VibGUgQ291bnRlcjo6R2V0UGVyaW9kKCkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gMC4wOworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlkb3VibGUgdmFsdWUgPSBnZXRDb3VudGVyUGVyaW9kKG1fY291bnRlciwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJcmV0dXJuIHZhbHVlOworfQorCisvKioKKyAqIFNldCB0aGUgbWF4aW11bSBwZXJpb2Qgd2hlcmUgdGhlIGRldmljZSBpcyBzdGlsbCBjb25zaWRlcmVkICJtb3ZpbmciLgorICogU2V0cyB0aGUgbWF4aW11bSBwZXJpb2Qgd2hlcmUgdGhlIGRldmljZSBpcyBjb25zaWRlcmVkIG1vdmluZy4gVGhpcyB2YWx1ZSBpcyB1c2VkIHRvIGRldGVybWluZQorICogdGhlICJzdG9wcGVkIiBzdGF0ZSBvZiB0aGUgY291bnRlciB1c2luZyB0aGUgR2V0U3RvcHBlZCBtZXRob2QuCisgKiBAcGFyYW0gbWF4UGVyaW9kIFRoZSBtYXhpbXVtIHBlcmlvZCB3aGVyZSB0aGUgY291bnRlZCBkZXZpY2UgaXMgY29uc2lkZXJlZCBtb3ZpbmcgaW4KKyAqIHNlY29uZHMuCisgKi8KK3ZvaWQgQ291bnRlcjo6U2V0TWF4UGVyaW9kKGRvdWJsZSBtYXhQZXJpb2QpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlzZXRDb3VudGVyTWF4UGVyaW9kKG1fY291bnRlciwgbWF4UGVyaW9kLCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKworLyoqCisgKiBTZWxlY3Qgd2hldGhlciB5b3Ugd2FudCB0byBjb250aW51ZSB1cGRhdGluZyB0aGUgZXZlbnQgdGltZXIgb3V0cHV0IHdoZW4gdGhlcmUgYXJlIG5vIHNhbXBsZXMgY2FwdHVyZWQuCisgKiBUaGUgb3V0cHV0IG9mIHRoZSBldmVudCB0aW1lciBoYXMgYSBidWZmZXIgb2YgcGVyaW9kcyB0aGF0IGFyZSBhdmVyYWdlZCBhbmQgcG9zdGVkIHRvCisgKiBhIHJlZ2lzdGVyIG9uIHRoZSBGUEdBLiAgV2hlbiB0aGUgdGltZXIgZGV0ZWN0cyB0aGF0IHRoZSBldmVudCBzb3VyY2UgaGFzIHN0b3BwZWQKKyAqIChiYXNlZCBvbiB0aGUgTWF4UGVyaW9kKSB0aGUgYnVmZmVyIG9mIHNhbXBsZXMgdG8gYmUgYXZlcmFnZWQgaXMgZW1wdGllZC4gIElmIHlvdQorICogZW5hYmxlIHRoZSB1cGRhdGUgd2hlbiBlbXB0eSwgeW91IHdpbGwgYmUgbm90aWZpZWQgb2YgdGhlIHN0b3BwZWQgc291cmNlIGFuZCB0aGUgZXZlbnQKKyAqIHRpbWUgd2lsbCByZXBvcnQgMCBzYW1wbGVzLiAgSWYgeW91IGRpc2FibGUgdXBkYXRlIHdoZW4gZW1wdHksIHRoZSBtb3N0IHJlY2VudCBhdmVyYWdlCisgKiB3aWxsIHJlbWFpbiBvbiB0aGUgb3V0cHV0IHVudGlsIGEgbmV3IHNhbXBsZSBpcyBhY3F1aXJlZC4gIFlvdSB3aWxsIG5ldmVyIHNlZSAwIHNhbXBsZXMKKyAqIG91dHB1dCAoZXhjZXB0IHdoZW4gdGhlcmUgaGF2ZSBiZWVuIG5vIGV2ZW50cyBzaW5jZSBhbiBGUEdBIHJlc2V0KSBhbmQgeW91IHdpbGwgbGlrZWx5IG5vdAorICogc2VlIHRoZSBzdG9wcGVkIGJpdCBiZWNvbWUgdHJ1ZSAoc2luY2UgaXQgaXMgdXBkYXRlZCBhdCB0aGUgZW5kIG9mIGFuIGF2ZXJhZ2UgYW5kIHRoZXJlIGFyZQorICogbm8gc2FtcGxlcyB0byBhdmVyYWdlKS4KKyAqIEBwYXJhbSBlbmFibGVkIFRydWUgdG8gZW5hYmxlIHVwZGF0ZSB3aGVuIGVtcHR5CisgKi8KK3ZvaWQgQ291bnRlcjo6U2V0VXBkYXRlV2hlbkVtcHR5KGJvb2wgZW5hYmxlZCkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisJaW50MzJfdCBzdGF0dXMgPSAwOworCXNldENvdW50ZXJVcGRhdGVXaGVuRW1wdHkobV9jb3VudGVyLCBlbmFibGVkLCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKworLyoqCisgKiBEZXRlcm1pbmUgaWYgdGhlIGNsb2NrIGlzIHN0b3BwZWQuCisgKiBEZXRlcm1pbmUgaWYgdGhlIGNsb2NrZWQgaW5wdXQgaXMgc3RvcHBlZCBiYXNlZCBvbiB0aGUgTWF4UGVyaW9kIHZhbHVlIHNldCB1c2luZyB0aGUKKyAqIFNldE1heFBlcmlvZCBtZXRob2QuIElmIHRoZSBjbG9jayBleGNlZWRzIHRoZSBNYXhQZXJpb2QsIHRoZW4gdGhlIGRldmljZSAoYW5kIGNvdW50ZXIpIGFyZQorICogYXNzdW1lZCB0byBiZSBzdG9wcGVkIGFuZCBpdCByZXR1cm5zIHRydWUuCisgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiB0aGUgbW9zdCByZWNlbnQgY291bnRlciBwZXJpb2QgZXhjZWVkcyB0aGUgTWF4UGVyaW9kIHZhbHVlIHNldCBieQorICogU2V0TWF4UGVyaW9kLgorICovCitib29sIENvdW50ZXI6OkdldFN0b3BwZWQoKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiBmYWxzZTsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJYm9vbCB2YWx1ZSA9IGdldENvdW50ZXJTdG9wcGVkKG1fY291bnRlciwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJcmV0dXJuIHZhbHVlOworfQorCisvKioKKyAqIFRoZSBsYXN0IGRpcmVjdGlvbiB0aGUgY291bnRlciB2YWx1ZSBjaGFuZ2VkLgorICogQHJldHVybiBUaGUgbGFzdCBkaXJlY3Rpb24gdGhlIGNvdW50ZXIgdmFsdWUgY2hhbmdlZC4KKyAqLworYm9vbCBDb3VudGVyOjpHZXREaXJlY3Rpb24oKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiBmYWxzZTsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJYm9vbCB2YWx1ZSA9IGdldENvdW50ZXJEaXJlY3Rpb24obV9jb3VudGVyLCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwlyZXR1cm4gdmFsdWU7Cit9CisKKy8qKgorICogU2V0IHRoZSBDb3VudGVyIHRvIHJldHVybiByZXZlcnNlZCBzZW5zaW5nIG9uIHRoZSBkaXJlY3Rpb24uCisgKiBUaGlzIGFsbG93cyBjb3VudGVycyB0byBjaGFuZ2UgdGhlIGRpcmVjdGlvbiB0aGV5IGFyZSBjb3VudGluZyBpbiB0aGUgY2FzZSBvZiAxWCBhbmQgMlgKKyAqIHF1YWRyYXR1cmUgZW5jb2Rpbmcgb25seS4gQW55IG90aGVyIGNvdW50ZXIgbW9kZSBpc24ndCBzdXBwb3J0ZWQuCisgKiBAcGFyYW0gcmV2ZXJzZURpcmVjdGlvbiB0cnVlIGlmIHRoZSB2YWx1ZSBjb3VudGVkIHNob3VsZCBiZSBuZWdhdGVkLgorICovCit2b2lkIENvdW50ZXI6OlNldFJldmVyc2VEaXJlY3Rpb24oYm9vbCByZXZlcnNlRGlyZWN0aW9uKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJc2V0Q291bnRlclJldmVyc2VEaXJlY3Rpb24obV9jb3VudGVyLCByZXZlcnNlRGlyZWN0aW9uLCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvRGlnaXRhbElucHV0LmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvRGlnaXRhbElucHV0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzZmMzlhCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9EaWdpdGFsSW5wdXQuY3BwCkBAIC0wLDAgKzEsMjMxIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8YXJyYXk+CisKKyNpbmNsdWRlICJEaWdpdGFsSW5wdXQuaCIKKy8vI2luY2x1ZGUgIk5ldHdvcmtDb21tdW5pY2F0aW9uL1VzYWdlUmVwb3J0aW5nLmgiCisjaW5jbHVkZSAiUmVzb3VyY2UuaCIKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKyNpbmNsdWRlICJFbmNvZGVyLmgiCisjaW5jbHVkZSAiQ291bnRlci5oIgorCis6OnN0ZDo6YXJyYXk8aW50LCAzPiBEaWdpdGFsR2xpdGNoRmlsdGVyOjpmaWx0ZXJfYWxsb2NhdGVkXyA9IHsKKyAgICB7ZmFsc2UsIGZhbHNlLCBmYWxzZX19OworTXV0ZXggRGlnaXRhbEdsaXRjaEZpbHRlcjo6bXV0ZXhfOworCisvKioKKyAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhIERpZ2l0YWxJbnB1dC4KKyAqIENyZWF0ZXMgYSBkaWdpdGFsIGlucHV0IGdpdmVuIGEgY2hhbm5lbC4gQ29tbW9uIGNyZWF0aW9uIHJvdXRpbmUgZm9yIGFsbAorICogY29uc3RydWN0b3JzLgorICovCit2b2lkIERpZ2l0YWxJbnB1dDo6SW5pdERpZ2l0YWxJbnB1dCh1aW50MzJfdCBjaGFubmVsKQoreworCWNoYXIgYnVmWzY0XTsKKworCWlmICghQ2hlY2tEaWdpdGFsQ2hhbm5lbChjaGFubmVsKSkKKwl7CisJCXNucHJpbnRmKGJ1ZiwgNjQsICJEaWdpdGFsIENoYW5uZWwgJWQiLCBjaGFubmVsKTsKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoQ2hhbm5lbEluZGV4T3V0T2ZSYW5nZSwgYnVmKTsKKwkJcmV0dXJuOworCX0KKwltX2NoYW5uZWwgPSBjaGFubmVsOworCisJaW50MzJfdCBzdGF0dXMgPSAwOworCWFsbG9jYXRlRElPKG1fZGlnaXRhbF9wb3J0c1tjaGFubmVsXSwgdHJ1ZSwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisKKwlIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfRGlnaXRhbElucHV0LCBjaGFubmVsKTsKK30KKworLyoqCisgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYSBEaWdpdGFsIElucHV0IGNsYXNzLgorICogQ3JlYXRlcyBhIGRpZ2l0YWwgaW5wdXQgZ2l2ZW4gYSBjaGFubmVsLgorICoKKyAqIEBwYXJhbSBjaGFubmVsIFRoZSBESU8gY2hhbm5lbCAwLTkgYXJlIG9uLWJvYXJkLCAxMC0yNSBhcmUgb24gdGhlIE1YUCBwb3J0CisgKi8KK0RpZ2l0YWxJbnB1dDo6RGlnaXRhbElucHV0KHVpbnQzMl90IGNoYW5uZWwpCit7CisJSW5pdERpZ2l0YWxJbnB1dChjaGFubmVsKTsKK30KKworLyoqCisgKiBGcmVlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIERpZ2l0YWwgSW5wdXQgY2xhc3MuCisgKi8KK0RpZ2l0YWxJbnB1dDo6fkRpZ2l0YWxJbnB1dCgpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCWlmIChtX2ludGVycnVwdCAhPSBOVUxMKQorCXsKKwkJaW50MzJfdCBzdGF0dXMgPSAwOworCQljbGVhbkludGVycnVwdHMobV9pbnRlcnJ1cHQsICZzdGF0dXMpOworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwkJbV9pbnRlcnJ1cHQgPSBOVUxMOworCQltX2ludGVycnVwdHMtPkZyZWUobV9pbnRlcnJ1cHRJbmRleCk7CisJfQorCisJaW50MzJfdCBzdGF0dXMgPSAwOworCWZyZWVESU8obV9kaWdpdGFsX3BvcnRzW21fY2hhbm5lbF0sICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIEdldCB0aGUgdmFsdWUgZnJvbSBhIGRpZ2l0YWwgaW5wdXQgY2hhbm5lbC4KKyAqIFJldHJpZXZlIHRoZSB2YWx1ZSBvZiBhIHNpbmdsZSBkaWdpdGFsIGlucHV0IGNoYW5uZWwgZnJvbSB0aGUgRlBHQS4KKyAqLworYm9vbCBEaWdpdGFsSW5wdXQ6OkdldCgpCit7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCWJvb2wgdmFsdWUgPSBnZXRESU8obV9kaWdpdGFsX3BvcnRzW21fY2hhbm5lbF0sICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCXJldHVybiB2YWx1ZTsKK30KKworLyoqCisgKiBAcmV0dXJuIFRoZSBHUElPIGNoYW5uZWwgbnVtYmVyIHRoYXQgdGhpcyBvYmplY3QgcmVwcmVzZW50cy4KKyAqLwordWludDMyX3QgRGlnaXRhbElucHV0OjpHZXRDaGFubmVsKCkKK3sKKwlyZXR1cm4gbV9jaGFubmVsOworfQorCisvKioKKyAqIEByZXR1cm4gVGhlIHZhbHVlIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGNoYW5uZWwgZmllbGQgb2YgYSByb3V0aW5nIG11eC4KKyAqLwordWludDMyX3QgRGlnaXRhbElucHV0OjpHZXRDaGFubmVsRm9yUm91dGluZygpCit7CisJcmV0dXJuIEdldENoYW5uZWwoKTsKK30KKworLyoqCisgKiBAcmV0dXJuIFRoZSB2YWx1ZSB0byBiZSB3cml0dGVuIHRvIHRoZSBtb2R1bGUgZmllbGQgb2YgYSByb3V0aW5nIG11eC4KKyAqLwordWludDMyX3QgRGlnaXRhbElucHV0OjpHZXRNb2R1bGVGb3JSb3V0aW5nKCkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBAcmV0dXJuIFRoZSB2YWx1ZSB0byBiZSB3cml0dGVuIHRvIHRoZSBhbmFsb2cgdHJpZ2dlciBmaWVsZCBvZiBhIHJvdXRpbmcgbXV4LgorICovCitib29sIERpZ2l0YWxJbnB1dDo6R2V0QW5hbG9nVHJpZ2dlckZvclJvdXRpbmcoKQoreworCXJldHVybiBmYWxzZTsKK30KKworRGlnaXRhbEdsaXRjaEZpbHRlcjo6RGlnaXRhbEdsaXRjaEZpbHRlcigpIDogY2hhbm5lbF9pbmRleF8oLTEpIHsKKyAgOjpzdGQ6OnVuaXF1ZV9sb2NrPE11dGV4PiBzeW5jKERpZ2l0YWxHbGl0Y2hGaWx0ZXI6Om11dGV4Xyk7CisgIGF1dG8gaW5kZXggPQorICAgICAgOjpzdGQ6OmZpbmQoZmlsdGVyX2FsbG9jYXRlZF8uYmVnaW4oKSwgZmlsdGVyX2FsbG9jYXRlZF8uZW5kKCksIGZhbHNlKTsKKyAgaWYgKGluZGV4ICE9IGZpbHRlcl9hbGxvY2F0ZWRfLmVuZCgpKSB7CisgICAgY2hhbm5lbF9pbmRleF8gPSBpbmRleCAtIGZpbHRlcl9hbGxvY2F0ZWRfLmJlZ2luKCk7CisgICAgKmluZGV4ID0gdHJ1ZTsKKyAgfQorfQorCitEaWdpdGFsR2xpdGNoRmlsdGVyOjp+RGlnaXRhbEdsaXRjaEZpbHRlcigpIHsKKyAgOjpzdGQ6OnVuaXF1ZV9sb2NrPE11dGV4PiBzeW5jKERpZ2l0YWxHbGl0Y2hGaWx0ZXI6Om11dGV4Xyk7CisgIGZpbHRlcl9hbGxvY2F0ZWRfW2NoYW5uZWxfaW5kZXhfXSA9IGZhbHNlOworfQorCit2b2lkIERpZ2l0YWxHbGl0Y2hGaWx0ZXI6OkFkZChEaWdpdGFsU291cmNlICppbnB1dCkgeworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIHNldEZpbHRlclNlbGVjdChpbnB1dC0+bV9kaWdpdGFsX3BvcnRzW2lucHV0LT5HZXRDaGFubmVsRm9yUm91dGluZygpXSwKKyAgICAgICAgICAgICAgICAgIGNoYW5uZWxfaW5kZXhfICsgMSwgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCisgIEhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9EaWdpdGFsSW5wdXQsCisgICAgICAgICAgICBpbnB1dC0+R2V0Q2hhbm5lbEZvclJvdXRpbmcoKSk7CisKKyAgcHJpbnRmKCJTb3VyY2UgZmlsdGVyICVkIGlzICVkXG4iLCBpbnB1dC0+R2V0Q2hhbm5lbEZvclJvdXRpbmcoKSwKKyAgICAgICAgIGdldEZpbHRlclNlbGVjdChpbnB1dC0+bV9kaWdpdGFsX3BvcnRzW2lucHV0LT5HZXRDaGFubmVsRm9yUm91dGluZygpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzKSk7Cit9CisKK3ZvaWQgRGlnaXRhbEdsaXRjaEZpbHRlcjo6UmVtb3ZlKERpZ2l0YWxTb3VyY2UgKmlucHV0KSB7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCXNldEZpbHRlclNlbGVjdChpbnB1dC0+bV9kaWdpdGFsX3BvcnRzW2lucHV0LT5HZXRDaGFubmVsRm9yUm91dGluZygpXSwgMCwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisKKwlIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfRGlnaXRhbElucHV0LCBpbnB1dC0+R2V0Q2hhbm5lbEZvclJvdXRpbmcoKSk7Cit9CisKK3ZvaWQgRGlnaXRhbEdsaXRjaEZpbHRlcjo6U2V0UGVyaW9kQ3ljbGVzKHVpbnQzMl90IGZwZ2FfY3ljbGVzKSB7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgc2V0RmlsdGVyUGVyaW9kKGNoYW5uZWxfaW5kZXhfLCBmcGdhX2N5Y2xlcywgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCisgIEhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9EaWdpdGFsR2xpdGNoRmlsdGVyLAorICAgICAgICAgICAgY2hhbm5lbF9pbmRleF8pOworfQorCit2b2lkIERpZ2l0YWxHbGl0Y2hGaWx0ZXI6OlNldFBlcmlvZE5hbm9TZWNvbmRzKHVpbnQ2NF90IG5hbm9zZWNvbmRzKSB7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgdWludDMyX3QgZnBnYV9jeWNsZXMgPQorICAgICAgbmFub3NlY29uZHMgKiBrU3lzdGVtQ2xvY2tUaWNrc1Blck1pY3Jvc2Vjb25kIC8gNCAvIDEwMDA7CisgIHNldEZpbHRlclBlcmlvZChjaGFubmVsX2luZGV4XywgZnBnYV9jeWNsZXMsICZzdGF0dXMpOworCisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCisgIEhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9EaWdpdGFsR2xpdGNoRmlsdGVyLAorICAgICAgICAgICAgY2hhbm5lbF9pbmRleF8pOworfQorCit1aW50MzJfdCBEaWdpdGFsR2xpdGNoRmlsdGVyOjpHZXRQZXJpb2RDeWNsZXMoKSB7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgdWludDMyX3QgZnBnYV9jeWNsZXMgPSBnZXRGaWx0ZXJQZXJpb2QoY2hhbm5lbF9pbmRleF8sICZzdGF0dXMpOworCisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCisgIEhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9EaWdpdGFsR2xpdGNoRmlsdGVyLAorICAgICAgICAgICAgY2hhbm5lbF9pbmRleF8pOworICByZXR1cm4gZnBnYV9jeWNsZXM7Cit9CisKK3VpbnQ2NF90IERpZ2l0YWxHbGl0Y2hGaWx0ZXI6OkdldFBlcmlvZE5hbm9TZWNvbmRzKCkgeworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIHVpbnQzMl90IGZwZ2FfY3ljbGVzID0gZ2V0RmlsdGVyUGVyaW9kKGNoYW5uZWxfaW5kZXhfLCAmc3RhdHVzKTsKKworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKworICBIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfRGlnaXRhbEdsaXRjaEZpbHRlciwKKyAgICAgICAgICAgIGNoYW5uZWxfaW5kZXhfKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQ2NF90PihmcGdhX2N5Y2xlcykgKiAxMDAwbCAvCisgICAgICAgICBzdGF0aWNfY2FzdDx1aW50NjRfdD4oa1N5c3RlbUNsb2NrVGlja3NQZXJNaWNyb3NlY29uZCAvIDQpOworfQorCit2b2lkIERpZ2l0YWxHbGl0Y2hGaWx0ZXI6OkFkZChFbmNvZGVyICppbnB1dCkgeworICBBZGQoaW5wdXQtPm1fYVNvdXJjZSk7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQWRkKGlucHV0LT5tX2JTb3VyY2UpOworfQorCit2b2lkIERpZ2l0YWxHbGl0Y2hGaWx0ZXI6OkFkZChDb3VudGVyICppbnB1dCkgeworICBBZGQoaW5wdXQtPm1fdXBTb3VyY2UpOworICBpZiAoU3RhdHVzSXNGYXRhbCgpKSB7CisgICAgcmV0dXJuOworICB9CisgIEFkZChpbnB1dC0+bV9kb3duU291cmNlKTsKK30KKwordm9pZCBEaWdpdGFsR2xpdGNoRmlsdGVyOjpSZW1vdmUoRW5jb2RlciAqaW5wdXQpIHsKKyAgUmVtb3ZlKGlucHV0LT5tX2FTb3VyY2UpOworICBpZiAoU3RhdHVzSXNGYXRhbCgpKSB7CisgICAgcmV0dXJuOworICB9CisgIFJlbW92ZShpbnB1dC0+bV9iU291cmNlKTsKK30KKwordm9pZCBEaWdpdGFsR2xpdGNoRmlsdGVyOjpSZW1vdmUoQ291bnRlciAqaW5wdXQpIHsKKyAgUmVtb3ZlKGlucHV0LT5tX3VwU291cmNlKTsKKyAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgeworICAgIHJldHVybjsKKyAgfQorICBSZW1vdmUoaW5wdXQtPm1fZG93blNvdXJjZSk7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0RpZ2l0YWxPdXRwdXQuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9EaWdpdGFsT3V0cHV0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2ZjMmQxCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9EaWdpdGFsT3V0cHV0LmNwcApAQCAtMCwwICsxLDIyMyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJEaWdpdGFsT3V0cHV0LmgiCisvLyNpbmNsdWRlICJOZXR3b3JrQ29tbXVuaWNhdGlvbi9Vc2FnZVJlcG9ydGluZy5oIgorI2luY2x1ZGUgIlJlc291cmNlLmgiCisjaW5jbHVkZSAiV1BJRXJyb3JzLmgiCisKKy8qKgorICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIGEgRGlnaXRhbE91dHB1dC4KKyAqIENyZWF0ZXMgYSBkaWdpdGFsIG91dHB1dCBnaXZlbiBhIGNoYW5uZWwuIENvbW1vbiBjcmVhdGlvbiByb3V0aW5lIGZvciBhbGwKKyAqIGNvbnN0cnVjdG9ycy4KKyAqLwordm9pZCBEaWdpdGFsT3V0cHV0OjpJbml0RGlnaXRhbE91dHB1dCh1aW50MzJfdCBjaGFubmVsKQoreworCWNoYXIgYnVmWzY0XTsKKworCWlmICghQ2hlY2tEaWdpdGFsQ2hhbm5lbChjaGFubmVsKSkKKwl7CisJCXNucHJpbnRmKGJ1ZiwgNjQsICJEaWdpdGFsIENoYW5uZWwgJWQiLCBjaGFubmVsKTsKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoQ2hhbm5lbEluZGV4T3V0T2ZSYW5nZSwgYnVmKTsKKwkJcmV0dXJuOworCX0KKwltX2NoYW5uZWwgPSBjaGFubmVsOworCW1fcHdtR2VuZXJhdG9yID0gKHZvaWQgKil+MHVsOworCisJaW50MzJfdCBzdGF0dXMgPSAwOworCWFsbG9jYXRlRElPKG1fZGlnaXRhbF9wb3J0c1tjaGFubmVsXSwgZmFsc2UsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCisJSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0RpZ2l0YWxPdXRwdXQsIGNoYW5uZWwpOworfQorCisvKioKKyAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhIGRpZ2l0YWwgb3V0cHV0LgorICogQ3JlYXRlIGEgZGlnaXRhbCBvdXRwdXQgZ2l2ZW4gYSBjaGFubmVsLgorICoKKyAqIEBwYXJhbSBjaGFubmVsIFRoZSBkaWdpdGFsIGNoYW5uZWwgMC05IGFyZSBvbi1ib2FyZCwgMTAtMjUgYXJlIG9uIHRoZSBNWFAgcG9ydAorICovCitEaWdpdGFsT3V0cHV0OjpEaWdpdGFsT3V0cHV0KHVpbnQzMl90IGNoYW5uZWwpCit7CisJSW5pdERpZ2l0YWxPdXRwdXQoY2hhbm5lbCk7Cit9CisKKy8qKgorICogRnJlZSB0aGUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBhIGRpZ2l0YWwgb3V0cHV0LgorICovCitEaWdpdGFsT3V0cHV0Ojp+RGlnaXRhbE91dHB1dCgpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCS8vIERpc2FibGUgdGhlIFBXTSBpbiBjYXNlIGl0IHdhcyBydW5uaW5nLgorCURpc2FibGVQV00oKTsKKworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlmcmVlRElPKG1fZGlnaXRhbF9wb3J0c1ttX2NoYW5uZWxdLCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKworLyoqCisgKiBTZXQgdGhlIHZhbHVlIG9mIGEgZGlnaXRhbCBvdXRwdXQuCisgKiBTZXQgdGhlIHZhbHVlIG9mIGEgZGlnaXRhbCBvdXRwdXQgdG8gZWl0aGVyIG9uZSAodHJ1ZSkgb3IgemVybyAoZmFsc2UpLgorICogQHBhcmFtIHZhbHVlIDEgKHRydWUpIGZvciBoaWdoLCAwIChmYWxzZSkgZm9yIGRpc2FibGVkCisgKi8KK3ZvaWQgRGlnaXRhbE91dHB1dDo6U2V0KHVpbnQzMl90IHZhbHVlKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlzZXRESU8obV9kaWdpdGFsX3BvcnRzW21fY2hhbm5lbF0sIHZhbHVlLCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKworLyoqCisgKiBAcmV0dXJuIFRoZSBHUElPIGNoYW5uZWwgbnVtYmVyIHRoYXQgdGhpcyBvYmplY3QgcmVwcmVzZW50cy4KKyAqLwordWludDMyX3QgRGlnaXRhbE91dHB1dDo6R2V0Q2hhbm5lbCgpCit7CisJcmV0dXJuIG1fY2hhbm5lbDsKK30KKworLyoqCisgKiBPdXRwdXQgYSBzaW5nbGUgcHVsc2Ugb24gdGhlIGRpZ2l0YWwgb3V0cHV0IGxpbmUuCisgKiBTZW5kIGEgc2luZ2xlIHB1bHNlIG9uIHRoZSBkaWdpdGFsIG91dHB1dCBsaW5lIHdoZXJlIHRoZSBwdWxzZSBkdXJhdGlvbiBpcyBzcGVjaWZpZWQgaW4gc2Vjb25kcy4KKyAqIE1heGltdW0gcHVsc2UgbGVuZ3RoIGlzIDAuMDAxNiBzZWNvbmRzLgorICogQHBhcmFtIGxlbmd0aCBUaGUgcHVsc2VsZW5ndGggaW4gc2Vjb25kcworICovCit2b2lkIERpZ2l0YWxPdXRwdXQ6OlB1bHNlKGZsb2F0IGxlbmd0aCkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJcHVsc2UobV9kaWdpdGFsX3BvcnRzW21fY2hhbm5lbF0sIGxlbmd0aCwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogRGV0ZXJtaW5lIGlmIHRoZSBwdWxzZSBpcyBzdGlsbCBnb2luZy4KKyAqIERldGVybWluZSBpZiBhIHByZXZpb3VzbHkgc3RhcnRlZCBwdWxzZSBpcyBzdGlsbCBnb2luZy4KKyAqLworYm9vbCBEaWdpdGFsT3V0cHV0OjpJc1B1bHNpbmcoKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiBmYWxzZTsKKworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlib29sIHZhbHVlID0gaXNQdWxzaW5nKG1fZGlnaXRhbF9wb3J0c1ttX2NoYW5uZWxdLCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwlyZXR1cm4gdmFsdWU7Cit9CisKKy8qKgorICogQ2hhbmdlIHRoZSBQV00gZnJlcXVlbmN5IG9mIHRoZSBQV00gb3V0cHV0IG9uIGEgRGlnaXRhbCBPdXRwdXQgbGluZS4KKyAqCisgKiBUaGUgdmFsaWQgcmFuZ2UgaXMgZnJvbSAwLjYgSHogdG8gMTkga0h6LiAgVGhlIGZyZXF1ZW5jeSByZXNvbHV0aW9uIGlzIGxvZ2FyaXRobWljLgorICoKKyAqIFRoZXJlIGlzIG9ubHkgb25lIFBXTSBmcmVxdWVuY3kgZm9yIGFsbCBkaWdpdGFsIGNoYW5uZWxzLgorICoKKyAqIEBwYXJhbSByYXRlIFRoZSBmcmVxdWVuY3kgdG8gb3V0cHV0IGFsbCBkaWdpdGFsIG91dHB1dCBQV00gc2lnbmFscy4KKyAqLwordm9pZCBEaWdpdGFsT3V0cHV0OjpTZXRQV01SYXRlKGZsb2F0IHJhdGUpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCisJaW50MzJfdCBzdGF0dXMgPSAwOworCXNldFBXTVJhdGUocmF0ZSwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogRW5hYmxlIGEgUFdNIE91dHB1dCBvbiB0aGlzIGxpbmUuCisgKgorICogQWxsb2NhdGUgb25lIG9mIHRoZSA2IERPIFBXTSBnZW5lcmF0b3IgcmVzb3VyY2VzIGZyb20gdGhpcyBtb2R1bGUuCisgKgorICogU3VwcGx5IHRoZSBpbml0aWFsIGR1dHktY3ljbGUgdG8gb3V0cHV0IHNvIGFzIHRvIGF2b2lkIGEgZ2xpdGNoIHdoZW4gZmlyc3Qgc3RhcnRpbmcuCisgKgorICogVGhlIHJlc29sdXRpb24gb2YgdGhlIGR1dHkgY3ljbGUgaXMgOC1iaXQgZm9yIGxvdyBmcmVxdWVuY2llcyAoMWtIeiBvciBsZXNzKQorICogYnV0IGlzIHJlZHVjZWQgdGhlIGhpZ2hlciB0aGUgZnJlcXVlbmN5IG9mIHRoZSBQV00gc2lnbmFsIGlzLgorICoKKyAqIEBwYXJhbSBpbml0aWFsRHV0eUN5Y2xlIFRoZSBkdXR5LWN5Y2xlIHRvIHN0YXJ0IGdlbmVyYXRpbmcuIFswLi4xXQorICovCit2b2lkIERpZ2l0YWxPdXRwdXQ6OkVuYWJsZVBXTShmbG9hdCBpbml0aWFsRHV0eUN5Y2xlKQoreworCWlmKG1fcHdtR2VuZXJhdG9yICE9ICh2b2lkICopfjB1bCkgcmV0dXJuOworCisJaW50MzJfdCBzdGF0dXMgPSAwOworCisJaWYoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisJbV9wd21HZW5lcmF0b3IgPSBhbGxvY2F0ZVBXTSgmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKworCWlmKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCXNldFBXTUR1dHlDeWNsZShtX3B3bUdlbmVyYXRvciwgaW5pdGlhbER1dHlDeWNsZSwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisKKwlpZihTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKwlzZXRQV01PdXRwdXRDaGFubmVsKG1fcHdtR2VuZXJhdG9yLCBtX2NoYW5uZWwsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIENoYW5nZSB0aGlzIGxpbmUgZnJvbSBhIFBXTSBvdXRwdXQgYmFjayB0byBhIHN0YXRpYyBEaWdpdGFsIE91dHB1dCBsaW5lLgorICoKKyAqIEZyZWUgdXAgb25lIG9mIHRoZSA2IERPIFBXTSBnZW5lcmF0b3IgcmVzb3VyY2VzIHRoYXQgd2VyZSBpbiB1c2UuCisgKi8KK3ZvaWQgRGlnaXRhbE91dHB1dDo6RGlzYWJsZVBXTSgpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCWlmKG1fcHdtR2VuZXJhdG9yID09ICh2b2lkICopfjB1bCkgcmV0dXJuOworCisJaW50MzJfdCBzdGF0dXMgPSAwOworCisJLy8gRGlzYWJsZSB0aGUgb3V0cHV0IGJ5IHJvdXRpbmcgdG8gYSBkZWFkIGJpdC4KKwlzZXRQV01PdXRwdXRDaGFubmVsKG1fcHdtR2VuZXJhdG9yLCBrRGlnaXRhbENoYW5uZWxzLCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKworCWZyZWVQV00obV9wd21HZW5lcmF0b3IsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCisJbV9wd21HZW5lcmF0b3IgPSAodm9pZCAqKX4wdWw7Cit9CisKKy8qKgorICogQ2hhbmdlIHRoZSBkdXR5LWN5Y2xlIHRoYXQgaXMgYmVpbmcgZ2VuZXJhdGVkIG9uIHRoZSBsaW5lLgorICoKKyAqIFRoZSByZXNvbHV0aW9uIG9mIHRoZSBkdXR5IGN5Y2xlIGlzIDgtYml0IGZvciBsb3cgZnJlcXVlbmNpZXMgKDFrSHogb3IgbGVzcykKKyAqIGJ1dCBpcyByZWR1Y2VkIHRoZSBoaWdoZXIgdGhlIGZyZXF1ZW5jeSBvZiB0aGUgUFdNIHNpZ25hbCBpcy4KKyAqCisgKiBAcGFyYW0gZHV0eUN5Y2xlIFRoZSBkdXR5LWN5Y2xlIHRvIGNoYW5nZSB0by4gWzAuLjFdCisgKi8KK3ZvaWQgRGlnaXRhbE91dHB1dDo6VXBkYXRlRHV0eUN5Y2xlKGZsb2F0IGR1dHlDeWNsZSkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJc2V0UFdNRHV0eUN5Y2xlKG1fcHdtR2VuZXJhdG9yLCBkdXR5Q3ljbGUsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIEByZXR1cm4gVGhlIHZhbHVlIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGNoYW5uZWwgZmllbGQgb2YgYSByb3V0aW5nIG11eC4KKyAqLwordWludDMyX3QgRGlnaXRhbE91dHB1dDo6R2V0Q2hhbm5lbEZvclJvdXRpbmcoKQoreworCXJldHVybiBHZXRDaGFubmVsKCk7Cit9CisKKy8qKgorICogQHJldHVybiBUaGUgdmFsdWUgdG8gYmUgd3JpdHRlbiB0byB0aGUgbW9kdWxlIGZpZWxkIG9mIGEgcm91dGluZyBtdXguCisgKi8KK3VpbnQzMl90IERpZ2l0YWxPdXRwdXQ6OkdldE1vZHVsZUZvclJvdXRpbmcoKQoreworCXJldHVybiAwOworfQorCisvKioKKyAqIEByZXR1cm4gVGhlIHZhbHVlIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGFuYWxvZyB0cmlnZ2VyIGZpZWxkIG9mIGEgcm91dGluZyBtdXguCisgKi8KK2Jvb2wgRGlnaXRhbE91dHB1dDo6R2V0QW5hbG9nVHJpZ2dlckZvclJvdXRpbmcoKQoreworCXJldHVybiBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvRGlnaXRhbFNvdXJjZS5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0RpZ2l0YWxTb3VyY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwY2M3NWMKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0RpZ2l0YWxTb3VyY2UuY3BwCkBAIC0wLDAgKzEsMTQgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkRpZ2l0YWxTb3VyY2UuaCIKKworLyoqCisgKiBEaWdpdGFsU291cmNlIGRlc3RydWN0b3IuCisgKi8KK0RpZ2l0YWxTb3VyY2U6On5EaWdpdGFsU291cmNlKCkKK3sKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvRG91YmxlU29sZW5vaWQuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9Eb3VibGVTb2xlbm9pZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkxYmFlNAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvRG91YmxlU29sZW5vaWQuY3BwCkBAIC0wLDAgKzEsMTYzIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkRvdWJsZVNvbGVub2lkLmgiCisvLyNpbmNsdWRlICJOZXR3b3JrQ29tbXVuaWNhdGlvbi9Vc2FnZVJlcG9ydGluZy5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorCisvKioKKyAqIENvbW1vbiBmdW5jdGlvbiB0byBpbXBsZW1lbnQgY29uc3RydWN0b3IgYmVoYXZpb3VyLgorICovCit2b2lkIERvdWJsZVNvbGVub2lkOjpJbml0U29sZW5vaWQoKQoreworCWNoYXIgYnVmWzY0XTsKKwlpZiAoIUNoZWNrU29sZW5vaWRNb2R1bGUobV9tb2R1bGVOdW1iZXIpKQorCXsKKwkJc25wcmludGYoYnVmLCA2NCwgIlNvbGVub2lkIE1vZHVsZSAlZCIsIG1fbW9kdWxlTnVtYmVyKTsKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoTW9kdWxlSW5kZXhPdXRPZlJhbmdlLCBidWYpOworCQlyZXR1cm47CisJfQorCWlmICghQ2hlY2tTb2xlbm9pZENoYW5uZWwobV9mb3J3YXJkQ2hhbm5lbCkpCisJeworCQlzbnByaW50ZihidWYsIDY0LCAiU29sZW5vaWQgQ2hhbm5lbCAlZCIsIG1fZm9yd2FyZENoYW5uZWwpOworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChDaGFubmVsSW5kZXhPdXRPZlJhbmdlLCBidWYpOworCQlyZXR1cm47CisJfQorCWlmICghQ2hlY2tTb2xlbm9pZENoYW5uZWwobV9yZXZlcnNlQ2hhbm5lbCkpCisJeworCQlzbnByaW50ZihidWYsIDY0LCAiU29sZW5vaWQgQ2hhbm5lbCAlZCIsIG1fcmV2ZXJzZUNoYW5uZWwpOworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChDaGFubmVsSW5kZXhPdXRPZlJhbmdlLCBidWYpOworCQlyZXR1cm47CisJfQorCVJlc291cmNlOjpDcmVhdGVSZXNvdXJjZU9iamVjdCgmbV9hbGxvY2F0ZWQsIHNvbGVub2lkX2tOdW1ETzdfMEVsZW1lbnRzICoga1NvbGVub2lkQ2hhbm5lbHMpOworCisJc25wcmludGYoYnVmLCA2NCwgIlNvbGVub2lkICVkIChNb2R1bGU6ICVkKSIsIG1fZm9yd2FyZENoYW5uZWwsIG1fbW9kdWxlTnVtYmVyKTsKKwlpZiAobV9hbGxvY2F0ZWQtPkFsbG9jYXRlKG1fbW9kdWxlTnVtYmVyICoga1NvbGVub2lkQ2hhbm5lbHMgKyBtX2ZvcndhcmRDaGFubmVsLCBidWYpID09IH4wdWwpCisJeworCQlDbG9uZUVycm9yKG1fYWxsb2NhdGVkKTsKKwkJcmV0dXJuOworCX0KKworCXNucHJpbnRmKGJ1ZiwgNjQsICJTb2xlbm9pZCAlZCAoTW9kdWxlOiAlZCkiLCBtX3JldmVyc2VDaGFubmVsLCBtX21vZHVsZU51bWJlcik7CisJaWYgKG1fYWxsb2NhdGVkLT5BbGxvY2F0ZShtX21vZHVsZU51bWJlciAqIGtTb2xlbm9pZENoYW5uZWxzICsgbV9yZXZlcnNlQ2hhbm5lbCwgYnVmKSA9PSB+MHVsKQorCXsKKwkJQ2xvbmVFcnJvcihtX2FsbG9jYXRlZCk7CisJCXJldHVybjsKKwl9CisgICAgCisJbV9mb3J3YXJkTWFzayA9IDEgPDwgbV9mb3J3YXJkQ2hhbm5lbDsKKwltX3JldmVyc2VNYXNrID0gMSA8PCBtX3JldmVyc2VDaGFubmVsOworCUhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9Tb2xlbm9pZCwgbV9mb3J3YXJkQ2hhbm5lbCwgbV9tb2R1bGVOdW1iZXIpOworCUhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9Tb2xlbm9pZCwgbV9yZXZlcnNlQ2hhbm5lbCwgbV9tb2R1bGVOdW1iZXIpOworfQorCisvKioKKyAqIENvbnN0cnVjdG9yLgorICogVXNlcyB0aGUgZGVmYXVsdCBQQ00gSUQgb2YgMAorICogQHBhcmFtIGZvcndhcmRDaGFubmVsIFRoZSBmb3J3YXJkIGNoYW5uZWwgbnVtYmVyIG9uIHRoZSBQQ00gKDAuLjcpLgorICogQHBhcmFtIHJldmVyc2VDaGFubmVsIFRoZSByZXZlcnNlIGNoYW5uZWwgbnVtYmVyIG9uIHRoZSBQQ00gKDAuLjcpLgorICovCitEb3VibGVTb2xlbm9pZDo6RG91YmxlU29sZW5vaWQodWludDMyX3QgZm9yd2FyZENoYW5uZWwsIHVpbnQzMl90IHJldmVyc2VDaGFubmVsKQorCTogU29sZW5vaWRCYXNlIChHZXREZWZhdWx0U29sZW5vaWRNb2R1bGUoKSkKKwksIG1fZm9yd2FyZENoYW5uZWwgKGZvcndhcmRDaGFubmVsKQorCSwgbV9yZXZlcnNlQ2hhbm5lbCAocmV2ZXJzZUNoYW5uZWwpCit7CisJSW5pdFNvbGVub2lkKCk7Cit9CisKKy8qKgorICogQ29uc3RydWN0b3IuCisgKgorICogQHBhcmFtIG1vZHVsZU51bWJlciBUaGUgQ0FOIElEIG9mIHRoZSBQQ00uCisgKiBAcGFyYW0gZm9yd2FyZENoYW5uZWwgVGhlIGZvcndhcmQgY2hhbm5lbCBvbiB0aGUgUENNIHRvIGNvbnRyb2wgKDAuLjcpLgorICogQHBhcmFtIHJldmVyc2VDaGFubmVsIFRoZSByZXZlcnNlIGNoYW5uZWwgb24gdGhlIFBDTSB0byBjb250cm9sICgwLi43KS4KKyAqLworRG91YmxlU29sZW5vaWQ6OkRvdWJsZVNvbGVub2lkKHVpbnQ4X3QgbW9kdWxlTnVtYmVyLCB1aW50MzJfdCBmb3J3YXJkQ2hhbm5lbCwgdWludDMyX3QgcmV2ZXJzZUNoYW5uZWwpCisJOiBTb2xlbm9pZEJhc2UgKG1vZHVsZU51bWJlcikKKwksIG1fZm9yd2FyZENoYW5uZWwgKGZvcndhcmRDaGFubmVsKQorCSwgbV9yZXZlcnNlQ2hhbm5lbCAocmV2ZXJzZUNoYW5uZWwpCit7CisJSW5pdFNvbGVub2lkKCk7Cit9CisKKy8qKgorICogRGVzdHJ1Y3Rvci4KKyAqLworRG91YmxlU29sZW5vaWQ6On5Eb3VibGVTb2xlbm9pZCgpCit7CisJaWYgKENoZWNrU29sZW5vaWRNb2R1bGUobV9tb2R1bGVOdW1iZXIpKQorCXsKKwkJbV9hbGxvY2F0ZWQtPkZyZWUobV9tb2R1bGVOdW1iZXIgKiBrU29sZW5vaWRDaGFubmVscyArIG1fZm9yd2FyZENoYW5uZWwpOworCQltX2FsbG9jYXRlZC0+RnJlZShtX21vZHVsZU51bWJlciAqIGtTb2xlbm9pZENoYW5uZWxzICsgbV9yZXZlcnNlQ2hhbm5lbCk7CisJfQorfQorCisvKioKKyAqIFNldCB0aGUgdmFsdWUgb2YgYSBzb2xlbm9pZC4KKyAqCisgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldCAoT2ZmLCBGb3J3YXJkIG9yIFJldmVyc2UpCisgKi8KK3ZvaWQgRG91YmxlU29sZW5vaWQ6OlNldChWYWx1ZSB2YWx1ZSkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisJdWludDhfdCByYXdWYWx1ZSA9IDB4MDA7CisKKwlzd2l0Y2godmFsdWUpCisJeworCWNhc2Uga09mZjoKKwkJcmF3VmFsdWUgPSAweDAwOworCQlicmVhazsKKwljYXNlIGtGb3J3YXJkOgorCQlyYXdWYWx1ZSA9IG1fZm9yd2FyZE1hc2s7CisJCWJyZWFrOworCWNhc2Uga1JldmVyc2U6CisJCXJhd1ZhbHVlID0gbV9yZXZlcnNlTWFzazsKKwkJYnJlYWs7CisJfQorCisJU29sZW5vaWRCYXNlOjpTZXQocmF3VmFsdWUsIG1fZm9yd2FyZE1hc2sgfCBtX3JldmVyc2VNYXNrKTsKK30KKworLyoqCisgKiBSZWFkIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBzb2xlbm9pZC4KKyAqCisgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBzb2xlbm9pZC4KKyAqLworRG91YmxlU29sZW5vaWQ6OlZhbHVlIERvdWJsZVNvbGVub2lkOjpHZXQoKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiBrT2ZmOworCXVpbnQ4X3QgdmFsdWUgPSBHZXRBbGwoKTsKKworCWlmICh2YWx1ZSAmIG1fZm9yd2FyZE1hc2spIHJldHVybiBrRm9yd2FyZDsKKwlpZiAodmFsdWUgJiBtX3JldmVyc2VNYXNrKSByZXR1cm4ga1JldmVyc2U7CisJcmV0dXJuIGtPZmY7Cit9CisvKioKKyAqIENoZWNrIGlmIHRoZSBmb3J3YXJkIHNvbGVub2lkIGlzIGJsYWNrbGlzdGVkLgorICoJCUlmIGEgc29sZW5vaWQgaXMgc2hvcnRlZCwgaXQgaXMgYWRkZWQgdG8gdGhlIGJsYWNrbGlzdCBhbmQKKyAqCQlkaXNhYmxlZCB1bnRpbCBwb3dlciBjeWNsZSwgb3IgdW50aWwgZmF1bHRzIGFyZSBjbGVhcmVkLgorICoJCUBzZWUgQ2xlYXJBbGxQQ01TdGlja3lGYXVsdHMoKQorICoKKyAqIEByZXR1cm4gSWYgc29sZW5vaWQgaXMgZGlzYWJsZWQgZHVlIHRvIHNob3J0LgorICovCitib29sIERvdWJsZVNvbGVub2lkOjpJc0Z3ZFNvbGVub2lkQmxhY2tMaXN0ZWQoKQoreworCWludCBibGFja0xpc3QgPSBHZXRQQ01Tb2xlbm9pZEJsYWNrTGlzdCgpOworCXJldHVybiAoYmxhY2tMaXN0ICYgbV9mb3J3YXJkTWFzaykgPyAxIDogMDsKK30KKy8qKgorICogQ2hlY2sgaWYgdGhlIHJldmVyc2Ugc29sZW5vaWQgaXMgYmxhY2tsaXN0ZWQuCisgKgkJSWYgYSBzb2xlbm9pZCBpcyBzaG9ydGVkLCBpdCBpcyBhZGRlZCB0byB0aGUgYmxhY2tsaXN0IGFuZAorICoJCWRpc2FibGVkIHVudGlsIHBvd2VyIGN5Y2xlLCBvciB1bnRpbCBmYXVsdHMgYXJlIGNsZWFyZWQuCisgKgkJQHNlZSBDbGVhckFsbFBDTVN0aWNreUZhdWx0cygpCisgKgorICogQHJldHVybiBJZiBzb2xlbm9pZCBpcyBkaXNhYmxlZCBkdWUgdG8gc2hvcnQuCisgKi8KK2Jvb2wgRG91YmxlU29sZW5vaWQ6OklzUmV2U29sZW5vaWRCbGFja0xpc3RlZCgpCit7CisJaW50IGJsYWNrTGlzdCA9IEdldFBDTVNvbGVub2lkQmxhY2tMaXN0KCk7CisJcmV0dXJuIChibGFja0xpc3QgJiBtX3JldmVyc2VNYXNrKSA/IDEgOiAwOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9Ecml2ZXJTdGF0aW9uLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvRHJpdmVyU3RhdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgyMTI4OQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvRHJpdmVyU3RhdGlvbi5jcHAKQEAgLTAsMCArMSw1MzMgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkRyaXZlclN0YXRpb24uaCIKKyNpbmNsdWRlICJBbmFsb2dJbnB1dC5oIgorI2luY2x1ZGUgIkhBTC9jcHAvU3luY2hyb25pemVkLmhwcCIKKyNpbmNsdWRlICJUaW1lci5oIgorI2luY2x1ZGUgIk5ldHdvcmtDb21tdW5pY2F0aW9uL0ZSQ0NvbW0uaCIKKyNpbmNsdWRlICJOZXR3b3JrQ29tbXVuaWNhdGlvbi9Vc2FnZVJlcG9ydGluZy5oIgorI2luY2x1ZGUgIk1vdG9yU2FmZXR5SGVscGVyLmgiCisjaW5jbHVkZSAiVXRpbGl0eS5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgIkxvZy5ocHAiCisKKy8vIHNldCB0aGUgbG9nZ2luZyBsZXZlbAorVExvZ0xldmVsIGRzTG9nTGV2ZWwgPSBsb2dERUJVRzsKK2NvbnN0IGRvdWJsZSBKT1lTVElDS19VTlBMVUdHRURfTUVTU0FHRV9JTlRFUlZBTCA9IDEuMDsKKworI2RlZmluZSBEU19MT0cobGV2ZWwpIFwKKwlpZiAobGV2ZWwgPiBkc0xvZ0xldmVsKSA7IFwKKwllbHNlIExvZygpLkdldChsZXZlbCkKKworY29uc3QgdWludDMyX3QgRHJpdmVyU3RhdGlvbjo6a0pveXN0aWNrUG9ydHM7CitEcml2ZXJTdGF0aW9uKiBEcml2ZXJTdGF0aW9uOjptX2luc3RhbmNlID0gTlVMTDsKKworLyoqCisgKiBEcml2ZXJTdGF0aW9uIGNvbnN0cnVjdG9yLgorICoKKyAqIFRoaXMgaXMgb25seSBjYWxsZWQgb25jZSB0aGUgZmlyc3QgdGltZSBHZXRJbnN0YW5jZSgpIGlzIGNhbGxlZAorICovCitEcml2ZXJTdGF0aW9uOjpEcml2ZXJTdGF0aW9uKCkKKwk6IG1fdGFzayAoIkRyaXZlclN0YXRpb24iLCAoRlVOQ1BUUilEcml2ZXJTdGF0aW9uOjpJbml0VGFzaykKKwksIG1fbmV3Q29udHJvbERhdGEoMCkKKwksIG1fcGFja2V0RGF0YUF2YWlsYWJsZU11bHRpV2FpdCgwKQorCSwgbV93YWl0Rm9yRGF0YVNlbSgwKQorCSwgbV91c2VySW5EaXNhYmxlZChmYWxzZSkKKwksIG1fdXNlckluQXV0b25vbW91cyhmYWxzZSkKKwksIG1fdXNlckluVGVsZW9wKGZhbHNlKQorCSwgbV91c2VySW5UZXN0KGZhbHNlKQorCSwgbV9uZXh0TWVzc2FnZVRpbWUoMCkKK3sKKwkvLyBBbGwgam95c3RpY2tzIHNob3VsZCBkZWZhdWx0IHRvIGhhdmluZyB6ZXJvIGF4ZXMsIHBvdnMgYW5kIGJ1dHRvbnMsIHNvCisJLy8gdW5pbml0aWFsaXplZCBtZW1vcnkgZG9lc24ndCBnZXQgc2VudCB0byBzcGVlZCBjb250cm9sbGVycy4KKwlmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwga0pveXN0aWNrUG9ydHM7IGkrKykgeworCQltX2pveXN0aWNrQXhlc1tpXS5jb3VudCA9IDA7CisJCW1fam95c3RpY2tQT1ZzW2ldLmNvdW50ID0gMDsKKwkJbV9qb3lzdGlja0J1dHRvbnNbaV0uY291bnQgPSAwOworCX0KKwkvLyBDcmVhdGUgYSBuZXcgc2VtYXBob3JlCisJbV9wYWNrZXREYXRhQXZhaWxhYmxlTXVsdGlXYWl0ID0gaW5pdGlhbGl6ZU11bHRpV2FpdCgpOworCW1fbmV3Q29udHJvbERhdGEgPSBpbml0aWFsaXplU2VtYXBob3JlKFNFTUFQSE9SRV9FTVBUWSk7CisKKwltX3dhaXRGb3JEYXRhU2VtID0gaW5pdGlhbGl6ZU11bHRpV2FpdCgpOworCW1fd2FpdEZvckRhdGFNdXRleCA9IGluaXRpYWxpemVNdXRleE5vcm1hbCgpOworCisJbV9wYWNrZXREYXRhQXZhaWxhYmxlTXVsdGlXYWl0ID0gaW5pdGlhbGl6ZU11bHRpV2FpdCgpOworCW1fcGFja2V0RGF0YUF2YWlsYWJsZU11dGV4ID0gaW5pdGlhbGl6ZU11dGV4Tm9ybWFsKCk7CisKKwkvLyBSZWdpc3RlciB0aGF0IHNlbWFwaG9yZSB3aXRoIHRoZSBuZXR3b3JrIGNvbW11bmljYXRpb25zIHRhc2suCisJLy8gSXQgd2lsbCBzaWduYWwgd2hlbiBuZXcgcGFja2V0IGRhdGEgaXMgYXZhaWxhYmxlLgorCUhBTFNldE5ld0RhdGFTZW0obV9wYWNrZXREYXRhQXZhaWxhYmxlTXVsdGlXYWl0KTsKKworCUFkZFRvU2luZ2xldG9uTGlzdCgpOworCisJaWYgKCFtX3Rhc2suU3RhcnQoKGludDMyX3QpdGhpcykpCisJeworCQl3cGlfc2V0V1BJRXJyb3IoRHJpdmVyU3RhdGlvblRhc2tFcnJvcik7CisJfQorfQorCitEcml2ZXJTdGF0aW9uOjp+RHJpdmVyU3RhdGlvbigpCit7CisJbV90YXNrLlN0b3AoKTsKKwltX2luc3RhbmNlID0gTlVMTDsKKwlkZWxldGVNdWx0aVdhaXQobV93YWl0Rm9yRGF0YVNlbSk7CisJLy8gVW5yZWdpc3RlciBvdXIgc2VtYXBob3JlLgorCUhBTFNldE5ld0RhdGFTZW0oTlVMTCk7CisJZGVsZXRlTXVsdGlXYWl0KG1fcGFja2V0RGF0YUF2YWlsYWJsZU11bHRpV2FpdCk7CisJZGVsZXRlTXV0ZXgobV9wYWNrZXREYXRhQXZhaWxhYmxlTXV0ZXgpOworCWRlbGV0ZU11dGV4KG1fd2FpdEZvckRhdGFNdXRleCk7Cit9CisKK3ZvaWQgRHJpdmVyU3RhdGlvbjo6SW5pdFRhc2soRHJpdmVyU3RhdGlvbiAqZHMpCit7CisJZHMtPlJ1bigpOworfQorCit2b2lkIERyaXZlclN0YXRpb246OlJ1bigpCit7CisJaW50IHBlcmlvZCA9IDA7CisJd2hpbGUgKHRydWUpCisJeworCQl0YWtlTXVsdGlXYWl0KG1fcGFja2V0RGF0YUF2YWlsYWJsZU11bHRpV2FpdCwgbV9wYWNrZXREYXRhQXZhaWxhYmxlTXV0ZXgsIDApOworCQlHZXREYXRhKCk7CisJCWdpdmVNdWx0aVdhaXQobV93YWl0Rm9yRGF0YVNlbSk7CisKKwkJaWYgKCsrcGVyaW9kID49IDQpCisJCXsKKwkJCU1vdG9yU2FmZXR5SGVscGVyOjpDaGVja01vdG9ycygpOworCQkJcGVyaW9kID0gMDsKKwkJfQorCQlpZiAobV91c2VySW5EaXNhYmxlZCkKKwkJCUhBTE5ldHdvcmtDb21tdW5pY2F0aW9uT2JzZXJ2ZVVzZXJQcm9ncmFtRGlzYWJsZWQoKTsKKwkJaWYgKG1fdXNlckluQXV0b25vbW91cykKKwkJCUhBTE5ldHdvcmtDb21tdW5pY2F0aW9uT2JzZXJ2ZVVzZXJQcm9ncmFtQXV0b25vbW91cygpOworCQlpZiAobV91c2VySW5UZWxlb3ApCisJCQlIQUxOZXR3b3JrQ29tbXVuaWNhdGlvbk9ic2VydmVVc2VyUHJvZ3JhbVRlbGVvcCgpOworCQlpZiAobV91c2VySW5UZXN0KQorCQkJSEFMTmV0d29ya0NvbW11bmljYXRpb25PYnNlcnZlVXNlclByb2dyYW1UZXN0KCk7CisJfQorfQorCisvKioKKyAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHNpbmdsZXRvbiBEcml2ZXJTdGF0aW9uLgorICogQHJldHVybiBQb2ludGVyIHRvIHRoZSBEUyBpbnN0YW5jZQorICovCitEcml2ZXJTdGF0aW9uKiBEcml2ZXJTdGF0aW9uOjpHZXRJbnN0YW5jZSgpCit7CisJaWYgKG1faW5zdGFuY2UgPT0gTlVMTCkKKwl7CisJCW1faW5zdGFuY2UgPSBuZXcgRHJpdmVyU3RhdGlvbigpOworCX0KKwlyZXR1cm4gbV9pbnN0YW5jZTsKK30KKworLyoqCisgKiBDb3B5IGRhdGEgZnJvbSB0aGUgRFMgdGFzayBmb3IgdGhlIHVzZXIuCisgKiBJZiBubyBuZXcgZGF0YSBleGlzdHMsIGl0IHdpbGwganVzdCBiZSByZXR1cm5lZCwgb3RoZXJ3aXNlCisgKiB0aGUgZGF0YSB3aWxsIGJlIGNvcGllZCBmcm9tIHRoZSBEUyBwb2xsaW5nIGxvb3AuCisgKi8KK3ZvaWQgRHJpdmVyU3RhdGlvbjo6R2V0RGF0YSgpCit7CisKKwkvLyBHZXQgdGhlIHN0YXR1cyBvZiBhbGwgb2YgdGhlIGpveXN0aWNrcworCWZvcih1aW50OF90IHN0aWNrID0gMDsgc3RpY2sgPCA0OyBzdGljaysrKSB7CisJCUhBTEdldEpveXN0aWNrQXhlcyhzdGljaywgJm1fam95c3RpY2tBeGVzW3N0aWNrXSk7CisJCUhBTEdldEpveXN0aWNrQnV0dG9ucyhzdGljaywgJm1fam95c3RpY2tCdXR0b25zW3N0aWNrXSk7CisJfQorCWdpdmVTZW1hcGhvcmUobV9uZXdDb250cm9sRGF0YSk7Cit9CisKKy8qKgorICogUmVhZCB0aGUgYmF0dGVyeSB2b2x0YWdlLgorICoKKyAqIEByZXR1cm4gVGhlIGJhdHRlcnkgdm9sdGFnZSBpbiBWb2x0cy4KKyAqLworZmxvYXQgRHJpdmVyU3RhdGlvbjo6R2V0QmF0dGVyeVZvbHRhZ2UoKQoreworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlmbG9hdCB2b2x0YWdlID0gZ2V0VmluVm9sdGFnZSgmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsICJnZXRWaW5Wb2x0YWdlIik7CisKKwlyZXR1cm4gdm9sdGFnZTsKK30KKworLyoqCisgKiBSZXBvcnRzIGVycm9ycyByZWxhdGVkIHRvIHVucGx1Z2dlZCBqb3lzdGlja3MKKyAqIFRocm90dGxlcyB0aGUgZXJyb3JzIHNvIHRoYXQgdGhleSBkb24ndCBvdmVyd2hlbG0gdGhlIERTCisgKi8KK3ZvaWQgRHJpdmVyU3RhdGlvbjo6UmVwb3J0Sm95c3RpY2tVbnBsdWdnZWRFcnJvcihzdGQ6OnN0cmluZyBtZXNzYWdlKSB7CisJZG91YmxlIGN1cnJlbnRUaW1lID0gVGltZXI6OkdldEZQR0FUaW1lc3RhbXAoKTsKKwlpZiAoY3VycmVudFRpbWUgPiBtX25leHRNZXNzYWdlVGltZSkgeworCQlSZXBvcnRFcnJvcihtZXNzYWdlKTsKKwkJbV9uZXh0TWVzc2FnZVRpbWUgPSBjdXJyZW50VGltZSArIEpPWVNUSUNLX1VOUExVR0dFRF9NRVNTQUdFX0lOVEVSVkFMOworCX0KK30KKworLyoqCQorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGF4ZXMgb24gYSBnaXZlbiBqb3lzdGljayBwb3J0CisgKgorICogQHBhcmFtIHN0aWNrIFRoZSBqb3lzdGljayBwb3J0IG51bWJlcgorICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGF4ZXMgb24gdGhlIGluZGljYXRlZCBqb3lzdGljaworICovCitpbnQgRHJpdmVyU3RhdGlvbjo6R2V0U3RpY2tBeGlzQ291bnQodWludDMyX3Qgc3RpY2spCit7CisgICAgaWYgKHN0aWNrID49IGtKb3lzdGlja1BvcnRzKQorICAgIHsKKyAgICAgICAgd3BpX3NldFdQSUVycm9yKEJhZEpveXN0aWNrSW5kZXgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAJSEFMSm95c3RpY2tBeGVzIGpveXN0aWNrQXhlczsKKyAgIAlIQUxHZXRKb3lzdGlja0F4ZXMoc3RpY2ssICZqb3lzdGlja0F4ZXMpOworICAgCXJldHVybiBqb3lzdGlja0F4ZXMuY291bnQ7Cit9CisKKy8qKgkKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBQT1ZzIG9uIGEgZ2l2ZW4gam95c3RpY2sgcG9ydAorICoKKyAqIEBwYXJhbSBzdGljayBUaGUgam95c3RpY2sgcG9ydCBudW1iZXIKKyAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBQT1ZzIG9uIHRoZSBpbmRpY2F0ZWQgam95c3RpY2sKKyAqLworaW50IERyaXZlclN0YXRpb246OkdldFN0aWNrUE9WQ291bnQodWludDMyX3Qgc3RpY2spCit7CisgICAgaWYgKHN0aWNrID49IGtKb3lzdGlja1BvcnRzKQorICAgIHsKKyAgICAgICAgd3BpX3NldFdQSUVycm9yKEJhZEpveXN0aWNrSW5kZXgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisJSEFMSm95c3RpY2tQT1ZzIGpveXN0aWNrUE9WczsKKwlIQUxHZXRKb3lzdGlja1BPVnMoc3RpY2ssICZqb3lzdGlja1BPVnMpOworICAgCXJldHVybiBqb3lzdGlja1BPVnMuY291bnQ7Cit9CisKKy8qKgkKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBidXR0b25zIG9uIGEgZ2l2ZW4gam95c3RpY2sgcG9ydAorICoKKyAqIEBwYXJhbSBzdGljayBUaGUgam95c3RpY2sgcG9ydCBudW1iZXIKKyAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBidXR0b25zIG9uIHRoZSBpbmRpY2F0ZWQgam95c3RpY2sKKyAqLworaW50IERyaXZlclN0YXRpb246OkdldFN0aWNrQnV0dG9uQ291bnQodWludDMyX3Qgc3RpY2spCit7CisgICAgaWYgKHN0aWNrID49IGtKb3lzdGlja1BvcnRzKQorICAgIHsKKyAgICAgICAgd3BpX3NldFdQSUVycm9yKEJhZEpveXN0aWNrSW5kZXgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisJSEFMSm95c3RpY2tCdXR0b25zIGpveXN0aWNrQnV0dG9uczsKKwlIQUxHZXRKb3lzdGlja0J1dHRvbnMoc3RpY2ssICZqb3lzdGlja0J1dHRvbnMpOworICAgCXJldHVybiBqb3lzdGlja0J1dHRvbnMuY291bnQ7Cit9CisKKy8qKgorICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgYXhpcyBvbiBhIGpveXN0aWNrLgorICogVGhpcyBkZXBlbmRzIG9uIHRoZSBtYXBwaW5nIG9mIHRoZSBqb3lzdGljayBjb25uZWN0ZWQgdG8gdGhlIHNwZWNpZmllZCBwb3J0LgorICoKKyAqIEBwYXJhbSBzdGljayBUaGUgam95c3RpY2sgdG8gcmVhZC4KKyAqIEBwYXJhbSBheGlzIFRoZSBhbmFsb2cgYXhpcyB2YWx1ZSB0byByZWFkIGZyb20gdGhlIGpveXN0aWNrLgorICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIGF4aXMgb24gdGhlIGpveXN0aWNrLgorICovCitmbG9hdCBEcml2ZXJTdGF0aW9uOjpHZXRTdGlja0F4aXModWludDMyX3Qgc3RpY2ssIHVpbnQzMl90IGF4aXMpCit7CisJaWYgKHN0aWNrID49IGtKb3lzdGlja1BvcnRzKQorCXsKKwkJd3BpX3NldFdQSUVycm9yKEJhZEpveXN0aWNrSW5kZXgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoYXhpcyA+PSBtX2pveXN0aWNrQXhlc1tzdGlja10uY291bnQpCisJeworCQlpZiAoYXhpcyA+PSBrTWF4Sm95c3RpY2tBeGVzKQorCQkJd3BpX3NldFdQSUVycm9yKEJhZEpveXN0aWNrQXhpcyk7CisJCWVsc2UKKwkJCVJlcG9ydEpveXN0aWNrVW5wbHVnZ2VkRXJyb3IoIldBUk5JTkc6IEpveXN0aWNrIEF4aXMgbWlzc2luZywgY2hlY2sgaWYgYWxsIGNvbnRyb2xsZXJzIGFyZSBwbHVnZ2VkIGluXG4iKTsKKwkJcmV0dXJuIDAuMGY7CisJfQorCisJaW50OF90IHZhbHVlID0gbV9qb3lzdGlja0F4ZXNbc3RpY2tdLmF4ZXNbYXhpc107CisKKwlpZih2YWx1ZSA8IDApCisJeworCQlyZXR1cm4gdmFsdWUgLyAxMjguMGY7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiB2YWx1ZSAvIDEyNy4wZjsKKwl9Cit9CisKKy8qKgorICogR2V0IHRoZSBzdGF0ZSBvZiBhIFBPViBvbiB0aGUgam95c3RpY2suCisgKgorICogQHJldHVybiB0aGUgYW5nbGUgb2YgdGhlIFBPViBpbiBkZWdyZWVzLCBvciAtMSBpZiB0aGUgUE9WIGlzIG5vdCBwcmVzc2VkLgorICovCitpbnQgRHJpdmVyU3RhdGlvbjo6R2V0U3RpY2tQT1YodWludDMyX3Qgc3RpY2ssIHVpbnQzMl90IHBvdikgeworCWlmIChzdGljayA+PSBrSm95c3RpY2tQb3J0cykKKwl7CisJCXdwaV9zZXRXUElFcnJvcihCYWRKb3lzdGlja0luZGV4KTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHBvdiA+PSBtX2pveXN0aWNrUE9Wc1tzdGlja10uY291bnQpCisJeworCQlpZiAocG92ID49IGtNYXhKb3lzdGlja1BPVnMpCisJCQl3cGlfc2V0V1BJRXJyb3IoQmFkSm95c3RpY2tBeGlzKTsKKwkJZWxzZQorCQkJUmVwb3J0Sm95c3RpY2tVbnBsdWdnZWRFcnJvcigiV0FSTklORzogSm95c3RpY2sgUE9WIG1pc3NpbmcsIGNoZWNrIGlmIGFsbCBjb250cm9sbGVycyBhcmUgcGx1Z2dlZCBpblxuIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBtX2pveXN0aWNrUE9Wc1tzdGlja10ucG92c1twb3ZdOworfQorCisvKioKKyAqIFRoZSBzdGF0ZSBvZiB0aGUgYnV0dG9ucyBvbiB0aGUgam95c3RpY2suCisgKgorICogQHBhcmFtIHN0aWNrIFRoZSBqb3lzdGljayB0byByZWFkLgorICogQHJldHVybiBUaGUgc3RhdGUgb2YgdGhlIGJ1dHRvbnMgb24gdGhlIGpveXN0aWNrLgorICovCit1aW50MzJfdCBEcml2ZXJTdGF0aW9uOjpHZXRTdGlja0J1dHRvbnModWludDMyX3Qgc3RpY2spCit7CisJaWYgKHN0aWNrID49IGtKb3lzdGlja1BvcnRzKQorCXsKKwkJd3BpX3NldFdQSUVycm9yKEJhZEpveXN0aWNrSW5kZXgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gbV9qb3lzdGlja0J1dHRvbnNbc3RpY2tdLmJ1dHRvbnM7Cit9CisKKy8qKgorICogVGhlIHN0YXRlIG9mIG9uZSBqb3lzdGljayBidXR0b24uIEJ1dHRvbiBpbmRleGVzIGJlZ2luIGF0IDEuCisgKgorICogQHBhcmFtIHN0aWNrIFRoZSBqb3lzdGljayB0byByZWFkLgorICogQHBhcmFtIGJ1dHRvbiBUaGUgYnV0dG9uIGluZGV4LCBiZWdpbm5pbmcgYXQgMS4KKyAqIEByZXR1cm4gVGhlIHN0YXRlIG9mIHRoZSBqb3lzdGljayBidXR0b24uCisgKi8KK2Jvb2wgRHJpdmVyU3RhdGlvbjo6R2V0U3RpY2tCdXR0b24odWludDMyX3Qgc3RpY2ssIHVpbnQ4X3QgYnV0dG9uKQoreworCWlmIChzdGljayA+PSBrSm95c3RpY2tQb3J0cykKKwl7CisJCXdwaV9zZXRXUElFcnJvcihCYWRKb3lzdGlja0luZGV4KTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwlpZihidXR0b24gPiBtX2pveXN0aWNrQnV0dG9uc1tzdGlja10uY291bnQpCisJeworCQlSZXBvcnRKb3lzdGlja1VucGx1Z2dlZEVycm9yKCJXQVJOSU5HOiBKb3lzdGljayBCdXR0b24gbWlzc2luZywgY2hlY2sgaWYgYWxsIGNvbnRyb2xsZXJzIGFyZSBwbHVnZ2VkIGluXG4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlpZihidXR0b24gPT0gMCkKKwl7CisJCVJlcG9ydEpveXN0aWNrVW5wbHVnZ2VkRXJyb3IoIkVSUk9SOiBCdXR0b24gaW5kZXhlcyBiZWdpbiBhdCAxIGluIFdQSUxpYiBmb3IgQysrIGFuZCBKYXZhIik7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuICgoMHgxIDw8IChidXR0b24tMSkpICYgbV9qb3lzdGlja0J1dHRvbnNbc3RpY2tdLmJ1dHRvbnMpICE9MDsKK30KKworLyoqCisgKiBDaGVjayBpZiB0aGUgRFMgaGFzIGVuYWJsZWQgdGhlIHJvYm90CisgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvYm90IGlzIGVuYWJsZWQgYW5kIHRoZSBEUyBpcyBjb25uZWN0ZWQKKyAqLworYm9vbCBEcml2ZXJTdGF0aW9uOjpJc0VuYWJsZWQoKQoreworCUhBTENvbnRyb2xXb3JkIGNvbnRyb2xXb3JkOworICAgIG1lbXNldCgmY29udHJvbFdvcmQsIDAsIHNpemVvZihjb250cm9sV29yZCkpOworCUhBTEdldENvbnRyb2xXb3JkKCZjb250cm9sV29yZCk7CisJcmV0dXJuIGNvbnRyb2xXb3JkLmVuYWJsZWQgJiYgY29udHJvbFdvcmQuZHNBdHRhY2hlZDsKK30KKworLyoqCisgKiBDaGVjayBpZiB0aGUgcm9ib3QgaXMgZGlzYWJsZWQKKyAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcm9ib3QgaXMgZXhwbGljaXRseSBkaXNhYmxlZCBvciB0aGUgRFMgaXMgbm90IGNvbm5lY3RlZAorICovCitib29sIERyaXZlclN0YXRpb246OklzRGlzYWJsZWQoKQoreworCUhBTENvbnRyb2xXb3JkIGNvbnRyb2xXb3JkOworICAgIG1lbXNldCgmY29udHJvbFdvcmQsIDAsIHNpemVvZihjb250cm9sV29yZCkpOworCUhBTEdldENvbnRyb2xXb3JkKCZjb250cm9sV29yZCk7CisJcmV0dXJuICEoY29udHJvbFdvcmQuZW5hYmxlZCAmJiBjb250cm9sV29yZC5kc0F0dGFjaGVkKTsKK30KKworLyoqCisgKiBDaGVjayBpZiB0aGUgRFMgaXMgY29tbWFuZGluZyBhdXRvbm9tb3VzIG1vZGUKKyAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcm9ib3QgaXMgYmVpbmcgY29tbWFuZGVkIHRvIGJlIGluIGF1dG9ub21vdXMgbW9kZQorICovCitib29sIERyaXZlclN0YXRpb246OklzQXV0b25vbW91cygpCit7CisJSEFMQ29udHJvbFdvcmQgY29udHJvbFdvcmQ7CisgICAgbWVtc2V0KCZjb250cm9sV29yZCwgMCwgc2l6ZW9mKGNvbnRyb2xXb3JkKSk7CisJSEFMR2V0Q29udHJvbFdvcmQoJmNvbnRyb2xXb3JkKTsKKwlyZXR1cm4gY29udHJvbFdvcmQuYXV0b25vbW91czsKK30KKworLyoqCisgKiBDaGVjayBpZiB0aGUgRFMgaXMgY29tbWFuZGluZyB0ZWxlb3AgbW9kZQorICogQHJldHVybiBUcnVlIGlmIHRoZSByb2JvdCBpcyBiZWluZyBjb21tYW5kZWQgdG8gYmUgaW4gdGVsZW9wIG1vZGUKKyAqLworYm9vbCBEcml2ZXJTdGF0aW9uOjpJc09wZXJhdG9yQ29udHJvbCgpCit7CisJSEFMQ29udHJvbFdvcmQgY29udHJvbFdvcmQ7CisgICAgbWVtc2V0KCZjb250cm9sV29yZCwgMCwgc2l6ZW9mKGNvbnRyb2xXb3JkKSk7CisJSEFMR2V0Q29udHJvbFdvcmQoJmNvbnRyb2xXb3JkKTsKKwlyZXR1cm4gIShjb250cm9sV29yZC5hdXRvbm9tb3VzIHx8IGNvbnRyb2xXb3JkLnRlc3QpOworfQorCisvKioKKyAqIENoZWNrIGlmIHRoZSBEUyBpcyBjb21tYW5kaW5nIHRlc3QgbW9kZQorICogQHJldHVybiBUcnVlIGlmIHRoZSByb2JvdCBpcyBiZWluZyBjb21tYW5kZWQgdG8gYmUgaW4gdGVzdCBtb2RlCisgKi8KK2Jvb2wgRHJpdmVyU3RhdGlvbjo6SXNUZXN0KCkKK3sKKwlIQUxDb250cm9sV29yZCBjb250cm9sV29yZDsKKwlIQUxHZXRDb250cm9sV29yZCgmY29udHJvbFdvcmQpOworCXJldHVybiBjb250cm9sV29yZC50ZXN0OworfQorCisvKioKKyAqIENoZWNrIGlmIHRoZSBEUyBpcyBhdHRhY2hlZAorICogQHJldHVybiBUcnVlIGlmIHRoZSBEUyBpcyBjb25uZWN0ZWQgdG8gdGhlIHJvYm90CisgKi8KK2Jvb2wgRHJpdmVyU3RhdGlvbjo6SXNEU0F0dGFjaGVkKCkKK3sKKwlIQUxDb250cm9sV29yZCBjb250cm9sV29yZDsKKyAgICBtZW1zZXQoJmNvbnRyb2xXb3JkLCAwLCBzaXplb2YoY29udHJvbFdvcmQpKTsKKwlIQUxHZXRDb250cm9sV29yZCgmY29udHJvbFdvcmQpOworCXJldHVybiBjb250cm9sV29yZC5kc0F0dGFjaGVkOworfQorCisvKioKKyAqIENoZWNrIGlmIHRoZSBGUEdBIG91dHB1dHMgYXJlIGVuYWJsZWQuIFRoZSBvdXRwdXRzIG1heSBiZSBkaXNhYmxlZCBpZiB0aGUgcm9ib3QgaXMgZGlzYWJsZWQKKyAqIG9yIGUtc3RvcHBlZCwgdGhlIHdhdGNoZG9nIGhhcyBleHBpcmVkLCBvciBpZiB0aGUgcm9ib1JJTyBicm93bnMgb3V0LgorICogQHJldHVybiBUcnVlIGlmIHRoZSBGUEdBIG91dHB1dHMgYXJlIGVuYWJsZWQuCisgKi8KK2Jvb2wgRHJpdmVyU3RhdGlvbjo6SXNTeXNBY3RpdmUoKQoreworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlib29sIHJldFZhbCA9IEhBTEdldFN5c3RlbUFjdGl2ZSgmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwlyZXR1cm4gcmV0VmFsOworfQorCisvKioKKyAqIENoZWNrIGlmIHRoZSBzeXN0ZW0gaXMgYnJvd25lZCBvdXQuCisgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHN5c3RlbSBpcyBicm93bmVkIG91dAorICovCitib29sIERyaXZlclN0YXRpb246OklzU3lzQnJvd25lZE91dCgpCit7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCWJvb2wgcmV0VmFsID0gSEFMR2V0QnJvd25lZE91dCgmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwlyZXR1cm4gcmV0VmFsOworfQorCisvKioKKyAqIEhhcyBhIG5ldyBjb250cm9sIHBhY2tldCBmcm9tIHRoZSBkcml2ZXIgc3RhdGlvbiBhcnJpdmVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhpcyBmdW5jdGlvbiB3YXMgY2FsbGVkPworICogV2FybmluZzogSWYgeW91IGNhbGwgdGhpcyBmdW5jdGlvbiBmcm9tIG1vcmUgdGhhbiBvbmUgcGxhY2UgYXQgdGhlIHNhbWUgdGltZSwKKyAqIHlvdSB3aWxsIG5vdCBnZXQgdGhlIGdldCB0aGUgaW50ZW5kZWQgYmVoYXZpb3VyLgorICogQHJldHVybiBUcnVlIGlmIHRoZSBjb250cm9sIGRhdGEgaGFzIGJlZW4gdXBkYXRlZCBzaW5jZSB0aGUgbGFzdCBjYWxsLgorICovCitib29sIERyaXZlclN0YXRpb246OklzTmV3Q29udHJvbERhdGEoKQoreworCXJldHVybiB0cnlUYWtlU2VtYXBob3JlKG1fbmV3Q29udHJvbERhdGEpID09IDA7Cit9CisKKy8qKgorICogSXMgdGhlIGRyaXZlciBzdGF0aW9uIGF0dGFjaGVkIHRvIGEgRmllbGQgTWFuYWdlbWVudCBTeXN0ZW0/CisgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvYm90IGlzIGNvbXBldGluZyBvbiBhIGZpZWxkIGJlaW5nIGNvbnRyb2xsZWQgYnkgYSBGaWVsZCBNYW5hZ2VtZW50IFN5c3RlbQorICovCitib29sIERyaXZlclN0YXRpb246OklzRk1TQXR0YWNoZWQoKQoreworCUhBTENvbnRyb2xXb3JkIGNvbnRyb2xXb3JkOworCUhBTEdldENvbnRyb2xXb3JkKCZjb250cm9sV29yZCk7CisJcmV0dXJuIGNvbnRyb2xXb3JkLmZtc0F0dGFjaGVkOworfQorCisvKioKKyAqIFJldHVybiB0aGUgYWxsaWFuY2UgdGhhdCB0aGUgZHJpdmVyIHN0YXRpb24gc2F5cyBpdCBpcyBvbi4KKyAqIFRoaXMgY291bGQgcmV0dXJuIGtSZWQgb3Iga0JsdWUKKyAqIEByZXR1cm4gVGhlIEFsbGlhbmNlIGVudW0gKGtSZWQsIGtCbHVlIG9yIGtJbnZhbGlkKQorICovCitEcml2ZXJTdGF0aW9uOjpBbGxpYW5jZSBEcml2ZXJTdGF0aW9uOjpHZXRBbGxpYW5jZSgpCit7CisJSEFMQWxsaWFuY2VTdGF0aW9uSUQgYWxsaWFuY2VTdGF0aW9uSUQ7CisJSEFMR2V0QWxsaWFuY2VTdGF0aW9uKCZhbGxpYW5jZVN0YXRpb25JRCk7CisJc3dpdGNoKGFsbGlhbmNlU3RhdGlvbklEKQorCXsKKwljYXNlIGtIQUxBbGxpYW5jZVN0YXRpb25JRF9yZWQxOgorCWNhc2Uga0hBTEFsbGlhbmNlU3RhdGlvbklEX3JlZDI6CisJY2FzZSBrSEFMQWxsaWFuY2VTdGF0aW9uSURfcmVkMzoKKwkJcmV0dXJuIGtSZWQ7CisJY2FzZSBrSEFMQWxsaWFuY2VTdGF0aW9uSURfYmx1ZTE6CisJY2FzZSBrSEFMQWxsaWFuY2VTdGF0aW9uSURfYmx1ZTI6CisJY2FzZSBrSEFMQWxsaWFuY2VTdGF0aW9uSURfYmx1ZTM6CisJCXJldHVybiBrQmx1ZTsKKwlkZWZhdWx0OgorCQlyZXR1cm4ga0ludmFsaWQ7CisJfQorfQorCisvKioKKyAqIFJldHVybiB0aGUgZHJpdmVyIHN0YXRpb24gbG9jYXRpb24gb24gdGhlIGZpZWxkCisgKiBUaGlzIGNvdWxkIHJldHVybiAxLCAyLCBvciAzCisgKiBAcmV0dXJuIFRoZSBsb2NhdGlvbiBvZiB0aGUgZHJpdmVyIHN0YXRpb24gKDEtMywgMCBmb3IgaW52YWxpZCkKKyAqLwordWludDMyX3QgRHJpdmVyU3RhdGlvbjo6R2V0TG9jYXRpb24oKQoreworCUhBTEFsbGlhbmNlU3RhdGlvbklEIGFsbGlhbmNlU3RhdGlvbklEOworCUhBTEdldEFsbGlhbmNlU3RhdGlvbigmYWxsaWFuY2VTdGF0aW9uSUQpOworCXN3aXRjaChhbGxpYW5jZVN0YXRpb25JRCkKKwl7CisJY2FzZSBrSEFMQWxsaWFuY2VTdGF0aW9uSURfcmVkMToKKwljYXNlIGtIQUxBbGxpYW5jZVN0YXRpb25JRF9ibHVlMToKKwkJcmV0dXJuIDE7CisJY2FzZSBrSEFMQWxsaWFuY2VTdGF0aW9uSURfcmVkMjoKKwljYXNlIGtIQUxBbGxpYW5jZVN0YXRpb25JRF9ibHVlMjoKKwkJcmV0dXJuIDI7CisJY2FzZSBrSEFMQWxsaWFuY2VTdGF0aW9uSURfcmVkMzoKKwljYXNlIGtIQUxBbGxpYW5jZVN0YXRpb25JRF9ibHVlMzoKKwkJcmV0dXJuIDM7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCisvKioKKyAqIFdhaXQgdW50aWwgYSBuZXcgcGFja2V0IGNvbWVzIGZyb20gdGhlIGRyaXZlciBzdGF0aW9uCisgKiBUaGlzIGJsb2NrcyBvbiBhIHNlbWFwaG9yZSwgc28gdGhlIHdhaXRpbmcgaXMgZWZmaWNpZW50LgorICogVGhpcyBpcyBhIGdvb2Qgd2F5IHRvIGRlbGF5IHByb2Nlc3NpbmcgdW50aWwgdGhlcmUgaXMgbmV3IGRyaXZlciBzdGF0aW9uIGRhdGEgdG8gYWN0IG9uCisgKi8KK3ZvaWQgRHJpdmVyU3RhdGlvbjo6V2FpdEZvckRhdGEoKQoreworCXRha2VNdWx0aVdhaXQobV93YWl0Rm9yRGF0YVNlbSwgbV93YWl0Rm9yRGF0YU11dGV4LCBTRU1BUEhPUkVfV0FJVF9GT1JFVkVSKTsKK30KKworLyoqCisgKiBSZXR1cm4gdGhlIGFwcHJveGltYXRlIG1hdGNoIHRpbWUKKyAqIFRoZSBGTVMgZG9lcyBub3Qgc2VuZCBhbiBvZmZpY2lhbCBtYXRjaCB0aW1lIHRvIHRoZSByb2JvdHMsIGJ1dCBkb2VzIHNlbmQgYW4gYXBwcm94aW1hdGUgbWF0Y2ggdGltZS4KKyAqIFRoZSB2YWx1ZSB3aWxsIGNvdW50IGRvd24gdGhlIHRpbWUgcmVtYWluaW5nIGluIHRoZSBjdXJyZW50IHBlcmlvZCAoYXV0byBvciB0ZWxlb3ApLgorICogV2FybmluZzogVGhpcyBpcyBub3QgYW4gb2ZmaWNpYWwgdGltZSAoc28gaXQgY2Fubm90IGJlIHVzZWQgdG8gZGlzcHV0ZSByZWYgY2FsbHMgb3IgZ3VhcmFudGVlIHRoYXQgYSBmdW5jdGlvbgorICogd2lsbCB0cmlnZ2VyIGJlZm9yZSB0aGUgbWF0Y2ggZW5kcykKKyAqIFRoZSBQcmFjdGljZSBNYXRjaCBmdW5jdGlvbiBvZiB0aGUgRFMgYXBwcm94aW1hdGVzIHRoZSBiZWhhdmlvdXIgc2VlbiBvbiB0aGUgZmllbGQuCisgKiBAcmV0dXJuIFRpbWUgcmVtYWluaW5nIGluIGN1cnJlbnQgbWF0Y2ggcGVyaW9kIChhdXRvIG9yIHRlbGVvcCkKKyAqLworZG91YmxlIERyaXZlclN0YXRpb246OkdldE1hdGNoVGltZSgpCit7CisJZmxvYXQgbWF0Y2hUaW1lOworCUhBTEdldE1hdGNoVGltZSgmbWF0Y2hUaW1lKTsKKwlyZXR1cm4gKGRvdWJsZSltYXRjaFRpbWU7Cit9CisKKy8qKgorICogUmVwb3J0IGFuIGVycm9yIHRvIHRoZSBEcml2ZXJTdGF0aW9uIG1lc3NhZ2VzIHdpbmRvdy4KKyAqIFRoZSBlcnJvciBpcyBhbHNvIHByaW50ZWQgdG8gdGhlIHByb2dyYW0gY29uc29sZS4KKyAqLwordm9pZCBEcml2ZXJTdGF0aW9uOjpSZXBvcnRFcnJvcihzdGQ6OnN0cmluZyBlcnJvcikKK3sKKwlzdGQ6OmNvdXQgPDwgZXJyb3IgPDwgc3RkOjplbmRsOworICAgIEhBTFNldEVycm9yRGF0YShlcnJvci5jX3N0cigpLCBlcnJvci5zaXplKCksIDApOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9FbmNvZGVyLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvRW5jb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEwMDUxZAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvRW5jb2Rlci5jcHAKQEAgLTAsMCArMSw1MDUgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkVuY29kZXIuaCIKKyNpbmNsdWRlICJEaWdpdGFsSW5wdXQuaCIKKy8vI2luY2x1ZGUgIk5ldHdvcmtDb21tdW5pY2F0aW9uL1VzYWdlUmVwb3J0aW5nLmgiCisjaW5jbHVkZSAiUmVzb3VyY2UuaCIKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKworLyoqCisgKiBDb21tb24gaW5pdGlhbGl6YXRpb24gY29kZSBmb3IgRW5jb2RlcnMuCisgKiBUaGlzIGNvZGUgYWxsb2NhdGVzIHJlc291cmNlcyBmb3IgRW5jb2RlcnMgYW5kIGlzIGNvbW1vbiB0byBhbGwgY29uc3RydWN0b3JzLgorICoKKyAqIFRoZSBjb3VudGVyIHdpbGwgc3RhcnQgY291bnRpbmcgaW1tZWRpYXRlbHkuCisgKgorICogQHBhcmFtIHJldmVyc2VEaXJlY3Rpb24gSWYgdHJ1ZSwgY291bnRzIGRvd24gaW5zdGVhZCBvZiB1cCAodGhpcyBpcyBhbGwgcmVsYXRpdmUpCisgKiBAcGFyYW0gZW5jb2RpbmdUeXBlIGVpdGhlciBrMVgsIGsyWCwgb3IgazRYIHRvIGluZGljYXRlIDFYLCAyWCBvciA0WCBkZWNvZGluZy4gSWYgNFggaXMKKyAqIHNlbGVjdGVkLCB0aGVuIGFuIGVuY29kZXIgRlBHQSBvYmplY3QgaXMgdXNlZCBhbmQgdGhlIHJldHVybmVkIGNvdW50cyB3aWxsIGJlIDR4IHRoZSBlbmNvZGVyCisgKiBzcGVjJ2QgdmFsdWUgc2luY2UgYWxsIHJpc2luZyBhbmQgZmFsbGluZyBlZGdlcyBhcmUgY291bnRlZC4gSWYgMVggb3IgMlggYXJlIHNlbGVjdGVkIHRoZW4KKyAqIGEgY291bnRlciBvYmplY3Qgd2lsbCBiZSB1c2VkIGFuZCB0aGUgcmV0dXJuZWQgdmFsdWUgd2lsbCBlaXRoZXIgZXhhY3RseSBtYXRjaCB0aGUgc3BlYydkIGNvdW50CisgKiBvciBiZSBkb3VibGUgKDJ4KSB0aGUgc3BlYydkIGNvdW50LgorICovCit2b2lkIEVuY29kZXI6OkluaXRFbmNvZGVyKGJvb2wgcmV2ZXJzZURpcmVjdGlvbiwgRW5jb2RpbmdUeXBlIGVuY29kaW5nVHlwZSkKK3sKKwltX2VuY29kaW5nVHlwZSA9IGVuY29kaW5nVHlwZTsKKwltX2luZGV4ID0gMDsKKwlzd2l0Y2ggKGVuY29kaW5nVHlwZSkKKwl7CisJCWNhc2UgazRYOgorCQl7CisJCQltX2VuY29kaW5nU2NhbGUgPSA0OworCQkJaWYgKG1fYVNvdXJjZS0+U3RhdHVzSXNGYXRhbCgpKQorCQkJeworCQkJCUNsb25lRXJyb3IobV9hU291cmNlKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlpZiAobV9iU291cmNlLT5TdGF0dXNJc0ZhdGFsKCkpCisJCQl7CisJCQkJQ2xvbmVFcnJvcihtX2JTb3VyY2UpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWludDMyX3Qgc3RhdHVzID0gMDsKKwkJCW1fZW5jb2RlciA9ICBpbml0aWFsaXplRW5jb2RlcihtX2FTb3VyY2UtPkdldE1vZHVsZUZvclJvdXRpbmcoKSwgbV9hU291cmNlLT5HZXRDaGFubmVsRm9yUm91dGluZygpLAorCQkJCQkJCQkJCSAgIG1fYVNvdXJjZS0+R2V0QW5hbG9nVHJpZ2dlckZvclJvdXRpbmcoKSwKKwkJCQkJCQkJCQkgICBtX2JTb3VyY2UtPkdldE1vZHVsZUZvclJvdXRpbmcoKSwgbV9iU291cmNlLT5HZXRDaGFubmVsRm9yUm91dGluZygpLAorCQkJCQkJCQkJCSAgIG1fYlNvdXJjZS0+R2V0QW5hbG9nVHJpZ2dlckZvclJvdXRpbmcoKSwKKwkJCQkJCQkJCQkgICByZXZlcnNlRGlyZWN0aW9uLCAmbV9pbmRleCwgJnN0YXR1cyk7CisJCQkgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCQkJbV9jb3VudGVyID0gTlVMTDsKKwkJCVNldE1heFBlcmlvZCguNSk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIGsxWDoKKwkJY2FzZSBrMlg6CisJCXsKKwkJCW1fZW5jb2RpbmdTY2FsZSA9IGVuY29kaW5nVHlwZSA9PSBrMVggPyAxIDogMjsKKwkJCW1fY291bnRlciA9IG5ldyBDb3VudGVyKG1fZW5jb2RpbmdUeXBlLCBtX2FTb3VyY2UsIG1fYlNvdXJjZSwgcmV2ZXJzZURpcmVjdGlvbik7CisJCQltX2luZGV4ID0gbV9jb3VudGVyLT5HZXRGUEdBSW5kZXgoKTsKKwkJCWJyZWFrOworCQl9CisJCWRlZmF1bHQ6CisJCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dCgtMSwgIkludmFsaWQgZW5jb2RpbmdUeXBlIGFyZ3VtZW50Iik7CisJCQlicmVhazsKKwl9CisJbV9kaXN0YW5jZVBlclB1bHNlID0gMS4wOworCW1fcGlkU291cmNlID0ga0Rpc3RhbmNlOworCisJSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0VuY29kZXIsIG1faW5kZXgsIGVuY29kaW5nVHlwZSk7Cit9CisKKy8qKgorICogRW5jb2RlciBjb25zdHJ1Y3Rvci4KKyAqIENvbnN0cnVjdCBhIEVuY29kZXIgZ2l2ZW4gYSBhbmQgYiBjaGFubmVscy4KKyAqCisgKiBUaGUgY291bnRlciB3aWxsIHN0YXJ0IGNvdW50aW5nIGltbWVkaWF0ZWx5LgorICoKKyAqIEBwYXJhbSBhQ2hhbm5lbCBUaGUgYSBjaGFubmVsIERJTyBjaGFubmVsLiAwLTkgYXJlIG9uLWJvYXJkLCAxMC0yNSBhcmUgb24gdGhlIE1YUCBwb3J0CisgKiBAcGFyYW0gYkNoYW5uZWwgVGhlIGIgY2hhbm5lbCBESU8gY2hhbm5lbC4gMC05IGFyZSBvbi1ib2FyZCwgMTAtMjUgYXJlIG9uIHRoZSBNWFAgcG9ydAorICogQHBhcmFtIHJldmVyc2VEaXJlY3Rpb24gcmVwcmVzZW50cyB0aGUgb3JpZW50YXRpb24gb2YgdGhlIGVuY29kZXIgYW5kIGludmVydHMgdGhlIG91dHB1dCB2YWx1ZXMKKyAqIGlmIG5lY2Vzc2FyeSBzbyBmb3J3YXJkIHJlcHJlc2VudHMgcG9zaXRpdmUgdmFsdWVzLgorICogQHBhcmFtIGVuY29kaW5nVHlwZSBlaXRoZXIgazFYLCBrMlgsIG9yIGs0WCB0byBpbmRpY2F0ZSAxWCwgMlggb3IgNFggZGVjb2RpbmcuIElmIDRYIGlzCisgKiBzZWxlY3RlZCwgdGhlbiBhbiBlbmNvZGVyIEZQR0Egb2JqZWN0IGlzIHVzZWQgYW5kIHRoZSByZXR1cm5lZCBjb3VudHMgd2lsbCBiZSA0eCB0aGUgZW5jb2RlcgorICogc3BlYydkIHZhbHVlIHNpbmNlIGFsbCByaXNpbmcgYW5kIGZhbGxpbmcgZWRnZXMgYXJlIGNvdW50ZWQuIElmIDFYIG9yIDJYIGFyZSBzZWxlY3RlZCB0aGVuCisgKiBhIGNvdW50ZXIgb2JqZWN0IHdpbGwgYmUgdXNlZCBhbmQgdGhlIHJldHVybmVkIHZhbHVlIHdpbGwgZWl0aGVyIGV4YWN0bHkgbWF0Y2ggdGhlIHNwZWMnZCBjb3VudAorICogb3IgYmUgZG91YmxlICgyeCkgdGhlIHNwZWMnZCBjb3VudC4KKyAqLworRW5jb2Rlcjo6RW5jb2Rlcih1aW50MzJfdCBhQ2hhbm5lbCwgdWludDMyX3QgYkNoYW5uZWwsIGJvb2wgcmV2ZXJzZURpcmVjdGlvbiwgRW5jb2RpbmdUeXBlIGVuY29kaW5nVHlwZSkgOgorCW1fZW5jb2RlcihOVUxMKSwKKwltX2NvdW50ZXIoTlVMTCkKK3sKKwltX2FTb3VyY2UgPSBuZXcgRGlnaXRhbElucHV0KGFDaGFubmVsKTsKKwltX2JTb3VyY2UgPSBuZXcgRGlnaXRhbElucHV0KGJDaGFubmVsKTsKKwlJbml0RW5jb2RlcihyZXZlcnNlRGlyZWN0aW9uLCBlbmNvZGluZ1R5cGUpOworCW1fYWxsb2NhdGVkQVNvdXJjZSA9IHRydWU7CisJbV9hbGxvY2F0ZWRCU291cmNlID0gdHJ1ZTsKK30KKworLyoqCisgKiBFbmNvZGVyIGNvbnN0cnVjdG9yLgorICogQ29uc3RydWN0IGEgRW5jb2RlciBnaXZlbiBhIGFuZCBiIGNoYW5uZWxzIGFzIGRpZ2l0YWwgaW5wdXRzLiBUaGlzIGlzIHVzZWQgaW4gdGhlIGNhc2UKKyAqIHdoZXJlIHRoZSBkaWdpdGFsIGlucHV0cyBhcmUgc2hhcmVkLiBUaGUgRW5jb2RlciBjbGFzcyB3aWxsIG5vdCBhbGxvY2F0ZSB0aGUgZGlnaXRhbCBpbnB1dHMKKyAqIGFuZCBhc3N1bWUgdGhhdCB0aGV5IGFscmVhZHkgYXJlIGNvdW50ZWQuCisgKgorICogVGhlIGNvdW50ZXIgd2lsbCBzdGFydCBjb3VudGluZyBpbW1lZGlhdGVseS4KKyAqCisgKiBAcGFyYW0gYVNvdXJjZSBUaGUgc291cmNlIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBhIGNoYW5uZWwuCisgKiBAcGFyYW0gYlNvdXJjZSB0aGUgc291cmNlIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBiIGNoYW5uZWwuCisgKiBAcGFyYW0gcmV2ZXJzZURpcmVjdGlvbiByZXByZXNlbnRzIHRoZSBvcmllbnRhdGlvbiBvZiB0aGUgZW5jb2RlciBhbmQgaW52ZXJ0cyB0aGUgb3V0cHV0IHZhbHVlcworICogaWYgbmVjZXNzYXJ5IHNvIGZvcndhcmQgcmVwcmVzZW50cyBwb3NpdGl2ZSB2YWx1ZXMuCisgKiBAcGFyYW0gZW5jb2RpbmdUeXBlIGVpdGhlciBrMVgsIGsyWCwgb3IgazRYIHRvIGluZGljYXRlIDFYLCAyWCBvciA0WCBkZWNvZGluZy4gSWYgNFggaXMKKyAqIHNlbGVjdGVkLCB0aGVuIGFuIGVuY29kZXIgRlBHQSBvYmplY3QgaXMgdXNlZCBhbmQgdGhlIHJldHVybmVkIGNvdW50cyB3aWxsIGJlIDR4IHRoZSBlbmNvZGVyCisgKiBzcGVjJ2QgdmFsdWUgc2luY2UgYWxsIHJpc2luZyBhbmQgZmFsbGluZyBlZGdlcyBhcmUgY291bnRlZC4gSWYgMVggb3IgMlggYXJlIHNlbGVjdGVkIHRoZW4KKyAqIGEgY291bnRlciBvYmplY3Qgd2lsbCBiZSB1c2VkIGFuZCB0aGUgcmV0dXJuZWQgdmFsdWUgd2lsbCBlaXRoZXIgZXhhY3RseSBtYXRjaCB0aGUgc3BlYydkIGNvdW50CisgKiBvciBiZSBkb3VibGUgKDJ4KSB0aGUgc3BlYydkIGNvdW50LgorICovCitFbmNvZGVyOjpFbmNvZGVyKERpZ2l0YWxTb3VyY2UgKmFTb3VyY2UsIERpZ2l0YWxTb3VyY2UgKmJTb3VyY2UsIGJvb2wgcmV2ZXJzZURpcmVjdGlvbiwgRW5jb2RpbmdUeXBlIGVuY29kaW5nVHlwZSkgOgorCW1fZW5jb2RlcihOVUxMKSwKKwltX2NvdW50ZXIoTlVMTCkKK3sKKwltX2FTb3VyY2UgPSBhU291cmNlOworCW1fYlNvdXJjZSA9IGJTb3VyY2U7CisJbV9hbGxvY2F0ZWRBU291cmNlID0gZmFsc2U7CisJbV9hbGxvY2F0ZWRCU291cmNlID0gZmFsc2U7CisJaWYgKG1fYVNvdXJjZSA9PSBOVUxMIHx8IG1fYlNvdXJjZSA9PSBOVUxMKQorCQl3cGlfc2V0V1BJRXJyb3IoTnVsbFBhcmFtZXRlcik7CisJZWxzZQorCQlJbml0RW5jb2RlcihyZXZlcnNlRGlyZWN0aW9uLCBlbmNvZGluZ1R5cGUpOworfQorCisvKioKKyAqIEVuY29kZXIgY29uc3RydWN0b3IuCisgKiBDb25zdHJ1Y3QgYSBFbmNvZGVyIGdpdmVuIGEgYW5kIGIgY2hhbm5lbHMgYXMgZGlnaXRhbCBpbnB1dHMuIFRoaXMgaXMgdXNlZCBpbiB0aGUgY2FzZQorICogd2hlcmUgdGhlIGRpZ2l0YWwgaW5wdXRzIGFyZSBzaGFyZWQuIFRoZSBFbmNvZGVyIGNsYXNzIHdpbGwgbm90IGFsbG9jYXRlIHRoZSBkaWdpdGFsIGlucHV0cworICogYW5kIGFzc3VtZSB0aGF0IHRoZXkgYWxyZWFkeSBhcmUgY291bnRlZC4KKyAqCisgKiBUaGUgY291bnRlciB3aWxsIHN0YXJ0IGNvdW50aW5nIGltbWVkaWF0ZWx5LgorICoKKyAqIEBwYXJhbSBhU291cmNlIFRoZSBzb3VyY2UgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIGEgY2hhbm5lbC4KKyAqIEBwYXJhbSBiU291cmNlIHRoZSBzb3VyY2UgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIGIgY2hhbm5lbC4KKyAqIEBwYXJhbSByZXZlcnNlRGlyZWN0aW9uIHJlcHJlc2VudHMgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBlbmNvZGVyIGFuZCBpbnZlcnRzIHRoZSBvdXRwdXQgdmFsdWVzCisgKiBpZiBuZWNlc3Nhcnkgc28gZm9yd2FyZCByZXByZXNlbnRzIHBvc2l0aXZlIHZhbHVlcy4KKyAqIEBwYXJhbSBlbmNvZGluZ1R5cGUgZWl0aGVyIGsxWCwgazJYLCBvciBrNFggdG8gaW5kaWNhdGUgMVgsIDJYIG9yIDRYIGRlY29kaW5nLiBJZiA0WCBpcworICogc2VsZWN0ZWQsIHRoZW4gYW4gZW5jb2RlciBGUEdBIG9iamVjdCBpcyB1c2VkIGFuZCB0aGUgcmV0dXJuZWQgY291bnRzIHdpbGwgYmUgNHggdGhlIGVuY29kZXIKKyAqIHNwZWMnZCB2YWx1ZSBzaW5jZSBhbGwgcmlzaW5nIGFuZCBmYWxsaW5nIGVkZ2VzIGFyZSBjb3VudGVkLiBJZiAxWCBvciAyWCBhcmUgc2VsZWN0ZWQgdGhlbgorICogYSBjb3VudGVyIG9iamVjdCB3aWxsIGJlIHVzZWQgYW5kIHRoZSByZXR1cm5lZCB2YWx1ZSB3aWxsIGVpdGhlciBleGFjdGx5IG1hdGNoIHRoZSBzcGVjJ2QgY291bnQKKyAqIG9yIGJlIGRvdWJsZSAoMngpIHRoZSBzcGVjJ2QgY291bnQuCisgKi8KK0VuY29kZXI6OkVuY29kZXIoRGlnaXRhbFNvdXJjZSAmYVNvdXJjZSwgRGlnaXRhbFNvdXJjZSAmYlNvdXJjZSwgYm9vbCByZXZlcnNlRGlyZWN0aW9uLCBFbmNvZGluZ1R5cGUgZW5jb2RpbmdUeXBlKSA6CisJbV9lbmNvZGVyKE5VTEwpLAorCW1fY291bnRlcihOVUxMKQoreworCW1fYVNvdXJjZSA9ICZhU291cmNlOworCW1fYlNvdXJjZSA9ICZiU291cmNlOworCW1fYWxsb2NhdGVkQVNvdXJjZSA9IGZhbHNlOworCW1fYWxsb2NhdGVkQlNvdXJjZSA9IGZhbHNlOworCUluaXRFbmNvZGVyKHJldmVyc2VEaXJlY3Rpb24sIGVuY29kaW5nVHlwZSk7Cit9CisKKy8qKgorICogRnJlZSB0aGUgcmVzb3VyY2VzIGZvciBhbiBFbmNvZGVyLgorICogRnJlZXMgdGhlIEZQR0EgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBhbiBFbmNvZGVyLgorICovCitFbmNvZGVyOjp+RW5jb2RlcigpCit7CisJaWYgKG1fYWxsb2NhdGVkQVNvdXJjZSkgZGVsZXRlIG1fYVNvdXJjZTsKKwlpZiAobV9hbGxvY2F0ZWRCU291cmNlKSBkZWxldGUgbV9iU291cmNlOworCWlmIChtX2NvdW50ZXIpCisJeworCQlkZWxldGUgbV9jb3VudGVyOworCX0KKwllbHNlCisJeworCSAgCWludDMyX3Qgc3RhdHVzID0gMDsKKwkJZnJlZUVuY29kZXIobV9lbmNvZGVyLCAmc3RhdHVzKTsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorfQorCisvKioKKyAqIFRoZSBlbmNvZGluZyBzY2FsZSBmYWN0b3IgMXgsIDJ4LCBvciA0eCwgcGVyIHRoZSByZXF1ZXN0ZWQgZW5jb2RpbmdUeXBlLgorICogVXNlZCB0byBkaXZpZGUgcmF3IGVkZ2UgY291bnRzIGRvd24gdG8gc3BlYydkIGNvdW50cy4KKyAqLworaW50MzJfdCBFbmNvZGVyOjpHZXRFbmNvZGluZ1NjYWxlKCkgeyByZXR1cm4gbV9lbmNvZGluZ1NjYWxlOyB9CisKKy8qKgorICogR2V0cyB0aGUgcmF3IHZhbHVlIGZyb20gdGhlIGVuY29kZXIuCisgKiBUaGUgcmF3IHZhbHVlIGlzIHRoZSBhY3R1YWwgY291bnQgdW5zY2FsZWQgYnkgdGhlIDF4LCAyeCwgb3IgNHggc2NhbGUKKyAqIGZhY3Rvci4KKyAqIEByZXR1cm4gQ3VycmVudCByYXcgY291bnQgZnJvbSB0aGUgZW5jb2RlcgorICovCitpbnQzMl90IEVuY29kZXI6OkdldFJhdygpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIDA7CisJaW50MzJfdCB2YWx1ZTsKKwlpZiAobV9jb3VudGVyKQorCQl2YWx1ZSA9IG1fY291bnRlci0+R2V0KCk7CisJZWxzZQorCXsKKwkJaW50MzJfdCBzdGF0dXMgPSAwOworCQl2YWx1ZSA9IGdldEVuY29kZXIobV9lbmNvZGVyLCAmc3RhdHVzKTsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorCXJldHVybiB2YWx1ZTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBjdXJyZW50IGNvdW50LgorICogUmV0dXJucyB0aGUgY3VycmVudCBjb3VudCBvbiB0aGUgRW5jb2Rlci4KKyAqIFRoaXMgbWV0aG9kIGNvbXBlbnNhdGVzIGZvciB0aGUgZGVjb2RpbmcgdHlwZS4KKyAqCisgKiBAcmV0dXJuIEN1cnJlbnQgY291bnQgZnJvbSB0aGUgRW5jb2RlciBhZGp1c3RlZCBmb3IgdGhlIDF4LCAyeCwgb3IgNHggc2NhbGUgZmFjdG9yLgorICovCitpbnQzMl90IEVuY29kZXI6OkdldCgpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIDA7CisJcmV0dXJuIChpbnQzMl90KSAoR2V0UmF3KCkgKiBEZWNvZGluZ1NjYWxlRmFjdG9yKCkpOworfQorCisvKioKKyAqIFJlc2V0IHRoZSBFbmNvZGVyIGRpc3RhbmNlIHRvIHplcm8uCisgKiBSZXNldHMgdGhlIGN1cnJlbnQgY291bnQgdG8gemVybyBvbiB0aGUgZW5jb2Rlci4KKyAqLwordm9pZCBFbmNvZGVyOjpSZXNldCgpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCWlmIChtX2NvdW50ZXIpCisJCW1fY291bnRlci0+UmVzZXQoKTsKKwllbHNlCisJeworCQlpbnQzMl90IHN0YXR1cyA9IDA7CisJCXJlc2V0RW5jb2RlcihtX2VuY29kZXIsICZzdGF0dXMpOworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwl9Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgcGVyaW9kIG9mIHRoZSBtb3N0IHJlY2VudCBwdWxzZS4KKyAqIFJldHVybnMgdGhlIHBlcmlvZCBvZiB0aGUgbW9zdCByZWNlbnQgRW5jb2RlciBwdWxzZSBpbiBzZWNvbmRzLgorICogVGhpcyBtZXRob2QgY29tcGVuc2F0ZXMgZm9yIHRoZSBkZWNvZGluZyB0eXBlLgorICoKKyAqIEBkZXByZWNhdGVkIFVzZSBHZXRSYXRlKCkgaW4gZmF2b3Igb2YgdGhpcyBtZXRob2QuICBUaGlzIHJldHVybnMgdW5zY2FsZWQgcGVyaW9kcyBhbmQgR2V0UmF0ZSgpIHNjYWxlcyB1c2luZyB2YWx1ZSBmcm9tIFNldERpc3RhbmNlUGVyUHVsc2UoKS4KKyAqCisgKiBAcmV0dXJuIFBlcmlvZCBpbiBzZWNvbmRzIG9mIHRoZSBtb3N0IHJlY2VudCBwdWxzZS4KKyAqLworZG91YmxlIEVuY29kZXI6OkdldFBlcmlvZCgpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIDAuMDsKKwlpZiAobV9jb3VudGVyKQorCXsKKwkJcmV0dXJuIG1fY291bnRlci0+R2V0UGVyaW9kKCkgLyBEZWNvZGluZ1NjYWxlRmFjdG9yKCk7CisJfQorCWVsc2UKKwl7CisJCWludDMyX3Qgc3RhdHVzID0gMDsKKwkJZG91YmxlIHBlcmlvZCA9IGdldEVuY29kZXJQZXJpb2QobV9lbmNvZGVyLCAmc3RhdHVzKTsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJCXJldHVybiBwZXJpb2Q7CisJfQorCit9CisKKy8qKgorICogU2V0cyB0aGUgbWF4aW11bSBwZXJpb2QgZm9yIHN0b3BwZWQgZGV0ZWN0aW9uLgorICogU2V0cyB0aGUgdmFsdWUgdGhhdCByZXByZXNlbnRzIHRoZSBtYXhpbXVtIHBlcmlvZCBvZiB0aGUgRW5jb2RlciBiZWZvcmUgaXQgd2lsbCBhc3N1bWUKKyAqIHRoYXQgdGhlIGF0dGFjaGVkIGRldmljZSBpcyBzdG9wcGVkLiBUaGlzIHRpbWVvdXQgYWxsb3dzIHVzZXJzIHRvIGRldGVybWluZSBpZiB0aGUgd2hlZWxzIG9yCisgKiBvdGhlciBzaGFmdCBoYXMgc3RvcHBlZCByb3RhdGluZy4KKyAqIFRoaXMgbWV0aG9kIGNvbXBlbnNhdGVzIGZvciB0aGUgZGVjb2RpbmcgdHlwZS4KKyAqCisgKiBAZGVwcmVjYXRlZCBVc2UgU2V0TWluUmF0ZSgpIGluIGZhdm9yIG9mIHRoaXMgbWV0aG9kLiAgVGhpcyB0YWtlcyB1bnNjYWxlZCBwZXJpb2RzIGFuZCBTZXRNaW5SYXRlKCkgc2NhbGVzIHVzaW5nIHZhbHVlIGZyb20gU2V0RGlzdGFuY2VQZXJQdWxzZSgpLgorICoKKyAqIEBwYXJhbSBtYXhQZXJpb2QgVGhlIG1heGltdW0gdGltZSBiZXR3ZWVuIHJpc2luZyBhbmQgZmFsbGluZyBlZGdlcyBiZWZvcmUgdGhlIEZQR0Egd2lsbAorICogcmVwb3J0IHRoZSBkZXZpY2Ugc3RvcHBlZC4gVGhpcyBpcyBleHByZXNzZWQgaW4gc2Vjb25kcy4KKyAqLwordm9pZCBFbmNvZGVyOjpTZXRNYXhQZXJpb2QoZG91YmxlIG1heFBlcmlvZCkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisJaWYgKG1fY291bnRlcikKKwl7CisJCW1fY291bnRlci0+U2V0TWF4UGVyaW9kKG1heFBlcmlvZCAqIERlY29kaW5nU2NhbGVGYWN0b3IoKSk7CisJfQorCWVsc2UKKwl7CisJCWludDMyX3Qgc3RhdHVzID0gMDsKKwkJc2V0RW5jb2Rlck1heFBlcmlvZChtX2VuY29kZXIsIG1heFBlcmlvZCwgJnN0YXR1cyk7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KK30KKworLyoqCisgKiBEZXRlcm1pbmUgaWYgdGhlIGVuY29kZXIgaXMgc3RvcHBlZC4KKyAqIFVzaW5nIHRoZSBNYXhQZXJpb2QgdmFsdWUsIGEgYm9vbGVhbiBpcyByZXR1cm5lZCB0aGF0IGlzIHRydWUgaWYgdGhlIGVuY29kZXIgaXMgY29uc2lkZXJlZAorICogc3RvcHBlZCBhbmQgZmFsc2UgaWYgaXQgaXMgc3RpbGwgbW92aW5nLiBBIHN0b3BwZWQgZW5jb2RlciBpcyBvbmUgd2hlcmUgdGhlIG1vc3QgcmVjZW50IHB1bHNlCisgKiB3aWR0aCBleGNlZWRzIHRoZSBNYXhQZXJpb2QuCisgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGVuY29kZXIgaXMgY29uc2lkZXJlZCBzdG9wcGVkLgorICovCitib29sIEVuY29kZXI6OkdldFN0b3BwZWQoKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiB0cnVlOworCWlmIChtX2NvdW50ZXIpCisJeworCQlyZXR1cm4gbV9jb3VudGVyLT5HZXRTdG9wcGVkKCk7CisJfQorCWVsc2UKKwl7CisJCWludDMyX3Qgc3RhdHVzID0gMDsKKwkJYm9vbCB2YWx1ZSA9IGdldEVuY29kZXJTdG9wcGVkKG1fZW5jb2RlciwgJnN0YXR1cyk7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCQlyZXR1cm4gdmFsdWU7CisJfQorfQorCisvKioKKyAqIFRoZSBsYXN0IGRpcmVjdGlvbiB0aGUgZW5jb2RlciB2YWx1ZSBjaGFuZ2VkLgorICogQHJldHVybiBUaGUgbGFzdCBkaXJlY3Rpb24gdGhlIGVuY29kZXIgdmFsdWUgY2hhbmdlZC4KKyAqLworYm9vbCBFbmNvZGVyOjpHZXREaXJlY3Rpb24oKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiBmYWxzZTsKKwlpZiAobV9jb3VudGVyKQorCXsKKwkJcmV0dXJuIG1fY291bnRlci0+R2V0RGlyZWN0aW9uKCk7CisJfQorCWVsc2UKKwl7CisJCWludDMyX3Qgc3RhdHVzID0gMDsKKwkJYm9vbCB2YWx1ZSA9IGdldEVuY29kZXJEaXJlY3Rpb24obV9lbmNvZGVyLCAmc3RhdHVzKTsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJCXJldHVybiB2YWx1ZTsKKwl9Cit9CisKKy8qKgorICogVGhlIHNjYWxlIG5lZWRlZCB0byBjb252ZXJ0IGEgcmF3IGNvdW50ZXIgdmFsdWUgaW50byBhIG51bWJlciBvZiBlbmNvZGVyIHB1bHNlcy4KKyAqLworZG91YmxlIEVuY29kZXI6OkRlY29kaW5nU2NhbGVGYWN0b3IoKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiAwLjA7CisJc3dpdGNoIChtX2VuY29kaW5nVHlwZSkKKwl7CisJY2FzZSBrMVg6CisJCXJldHVybiAxLjA7CisJY2FzZSBrMlg6CisJCXJldHVybiAwLjU7CisJY2FzZSBrNFg6CisJCXJldHVybiAwLjI1OworCWRlZmF1bHQ6CisJCXJldHVybiAwLjA7CisJfQorfQorCisvKioKKyAqIEdldCB0aGUgZGlzdGFuY2UgdGhlIHJvYm90IGhhcyBkcml2ZW4gc2luY2UgdGhlIGxhc3QgcmVzZXQuCisgKgorICogQHJldHVybiBUaGUgZGlzdGFuY2UgZHJpdmVuIHNpbmNlIHRoZSBsYXN0IHJlc2V0IGFzIHNjYWxlZCBieSB0aGUgdmFsdWUgZnJvbSBTZXREaXN0YW5jZVBlclB1bHNlKCkuCisgKi8KK2RvdWJsZSBFbmNvZGVyOjpHZXREaXN0YW5jZSgpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIDAuMDsKKwlyZXR1cm4gR2V0UmF3KCkgKiBEZWNvZGluZ1NjYWxlRmFjdG9yKCkgKiBtX2Rpc3RhbmNlUGVyUHVsc2U7Cit9CisKKy8qKgorICogR2V0IHRoZSBjdXJyZW50IHJhdGUgb2YgdGhlIGVuY29kZXIuCisgKiBVbml0cyBhcmUgZGlzdGFuY2UgcGVyIHNlY29uZCBhcyBzY2FsZWQgYnkgdGhlIHZhbHVlIGZyb20gU2V0RGlzdGFuY2VQZXJQdWxzZSgpLgorICoKKyAqIEByZXR1cm4gVGhlIGN1cnJlbnQgcmF0ZSBvZiB0aGUgZW5jb2Rlci4KKyAqLworZG91YmxlIEVuY29kZXI6OkdldFJhdGUoKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiAwLjA7CisJcmV0dXJuIChtX2Rpc3RhbmNlUGVyUHVsc2UgLyBHZXRQZXJpb2QoKSk7Cit9CisKKy8qKgorICogU2V0IHRoZSBtaW5pbXVtIHJhdGUgb2YgdGhlIGRldmljZSBiZWZvcmUgdGhlIGhhcmR3YXJlIHJlcG9ydHMgaXQgc3RvcHBlZC4KKyAqCisgKiBAcGFyYW0gbWluUmF0ZSBUaGUgbWluaW11bSByYXRlLiAgVGhlIHVuaXRzIGFyZSBpbiBkaXN0YW5jZSBwZXIgc2Vjb25kIGFzIHNjYWxlZCBieSB0aGUgdmFsdWUgZnJvbSBTZXREaXN0YW5jZVBlclB1bHNlKCkuCisgKi8KK3ZvaWQgRW5jb2Rlcjo6U2V0TWluUmF0ZShkb3VibGUgbWluUmF0ZSkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisJU2V0TWF4UGVyaW9kKG1fZGlzdGFuY2VQZXJQdWxzZSAvIG1pblJhdGUpOworfQorCisvKioKKyAqIFNldCB0aGUgZGlzdGFuY2UgcGVyIHB1bHNlIGZvciB0aGlzIGVuY29kZXIuCisgKiBUaGlzIHNldHMgdGhlIG11bHRpcGxpZXIgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGRpc3RhbmNlIGRyaXZlbiBiYXNlZCBvbiB0aGUgY291bnQgdmFsdWUKKyAqIGZyb20gdGhlIGVuY29kZXIuCisgKiBEbyBub3QgaW5jbHVkZSB0aGUgZGVjb2RpbmcgdHlwZSBpbiB0aGlzIHNjYWxlLiAgVGhlIGxpYnJhcnkgYWxyZWFkeSBjb21wZW5zYXRlcyBmb3IgdGhlIGRlY29kaW5nIHR5cGUuCisgKiBTZXQgdGhpcyB2YWx1ZSBiYXNlZCBvbiB0aGUgZW5jb2RlcidzIHJhdGVkIFB1bHNlcyBwZXIgUmV2b2x1dGlvbiBhbmQKKyAqIGZhY3RvciBpbiBnZWFyaW5nIHJlZHVjdGlvbnMgZm9sbG93aW5nIHRoZSBlbmNvZGVyIHNoYWZ0LgorICogVGhpcyBkaXN0YW5jZSBjYW4gYmUgaW4gYW55IHVuaXRzIHlvdSBsaWtlLCBsaW5lYXIgb3IgYW5ndWxhci4KKyAqCisgKiBAcGFyYW0gZGlzdGFuY2VQZXJQdWxzZSBUaGUgc2NhbGUgZmFjdG9yIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNvbnZlcnQgcHVsc2VzIHRvIHVzZWZ1bCB1bml0cy4KKyAqLwordm9pZCBFbmNvZGVyOjpTZXREaXN0YW5jZVBlclB1bHNlKGRvdWJsZSBkaXN0YW5jZVBlclB1bHNlKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKwltX2Rpc3RhbmNlUGVyUHVsc2UgPSBkaXN0YW5jZVBlclB1bHNlOworfQorCisvKioKKyAqIFNldCB0aGUgZGlyZWN0aW9uIHNlbnNpbmcgZm9yIHRoaXMgZW5jb2Rlci4KKyAqIFRoaXMgc2V0cyB0aGUgZGlyZWN0aW9uIHNlbnNpbmcgb24gdGhlIGVuY29kZXIgc28gdGhhdCBpdCBjb3VsZCBjb3VudCBpbiB0aGUgY29ycmVjdAorICogc29mdHdhcmUgZGlyZWN0aW9uIHJlZ2FyZGxlc3Mgb2YgdGhlIG1vdW50aW5nLgorICogQHBhcmFtIHJldmVyc2VEaXJlY3Rpb24gdHJ1ZSBpZiB0aGUgZW5jb2RlciBkaXJlY3Rpb24gc2hvdWxkIGJlIHJldmVyc2VkCisgKi8KK3ZvaWQgRW5jb2Rlcjo6U2V0UmV2ZXJzZURpcmVjdGlvbihib29sIHJldmVyc2VEaXJlY3Rpb24pCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCWlmIChtX2NvdW50ZXIpCisJeworCQltX2NvdW50ZXItPlNldFJldmVyc2VEaXJlY3Rpb24ocmV2ZXJzZURpcmVjdGlvbik7CisJfQorCWVsc2UKKwl7CisJCWludDMyX3Qgc3RhdHVzID0gMDsKKwkJc2V0RW5jb2RlclJldmVyc2VEaXJlY3Rpb24obV9lbmNvZGVyLCByZXZlcnNlRGlyZWN0aW9uLCAmc3RhdHVzKTsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorfQorCisKKy8qKgorICogU2V0IHRoZSBTYW1wbGVzIHRvIEF2ZXJhZ2Ugd2hpY2ggc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBvZiB0aGUgdGltZXIgdG8KKyAqIGF2ZXJhZ2Ugd2hlbiBjYWxjdWxhdGluZyB0aGUgcGVyaW9kLiBQZXJmb3JtIGF2ZXJhZ2luZyB0byBhY2NvdW50IGZvcgorICogbWVjaGFuaWNhbCBpbXBlcmZlY3Rpb25zIG9yIGFzIG92ZXJzYW1wbGluZyB0byBpbmNyZWFzZSByZXNvbHV0aW9uLgorICogQHBhcmFtIHNhbXBsZXNUb0F2ZXJhZ2UgVGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIGF2ZXJhZ2UgZnJvbSAxIHRvIDEyNy4KKyAqLwordm9pZCBFbmNvZGVyOjpTZXRTYW1wbGVzVG9BdmVyYWdlKGludCBzYW1wbGVzVG9BdmVyYWdlKQoreworCWlmIChzYW1wbGVzVG9BdmVyYWdlIDwgMSB8fCBzYW1wbGVzVG9BdmVyYWdlID4gMTI3KQorCXsKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoUGFyYW1ldGVyT3V0T2ZSYW5nZSwgIkF2ZXJhZ2UgY291bnRlciB2YWx1ZXMgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDEyNyIpOworCX0KKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJc3dpdGNoIChtX2VuY29kaW5nVHlwZSkgeworCQljYXNlIGs0WDoKKwkJCXNldEVuY29kZXJTYW1wbGVzVG9BdmVyYWdlKG1fZW5jb2Rlciwgc2FtcGxlc1RvQXZlcmFnZSwgJnN0YXR1cyk7CisJCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwkJCWJyZWFrOworCQljYXNlIGsxWDoKKwkJY2FzZSBrMlg6CisJCQltX2NvdW50ZXItPlNldFNhbXBsZXNUb0F2ZXJhZ2Uoc2FtcGxlc1RvQXZlcmFnZSk7CisJCQlicmVhazsKKwl9Cit9CisKKy8qKgorICogR2V0IHRoZSBTYW1wbGVzIHRvIEF2ZXJhZ2Ugd2hpY2ggc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBvZiB0aGUgdGltZXIgdG8KKyAqIGF2ZXJhZ2Ugd2hlbiBjYWxjdWxhdGluZyB0aGUgcGVyaW9kLiBQZXJmb3JtIGF2ZXJhZ2luZyB0byBhY2NvdW50IGZvcgorICogbWVjaGFuaWNhbCBpbXBlcmZlY3Rpb25zIG9yIGFzIG92ZXJzYW1wbGluZyB0byBpbmNyZWFzZSByZXNvbHV0aW9uLgorICogQHJldHVybiBTYW1wbGVzVG9BdmVyYWdlIFRoZSBudW1iZXIgb2Ygc2FtcGxlcyBiZWluZyBhdmVyYWdlZCAoZnJvbSAxIHRvIDEyNykKKyAqLworaW50IEVuY29kZXI6OkdldFNhbXBsZXNUb0F2ZXJhZ2UoKQoreworCWludCByZXN1bHQgPSAxOworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlzd2l0Y2ggKG1fZW5jb2RpbmdUeXBlKSB7CisJCWNhc2UgazRYOgorCQkJcmVzdWx0ID0gZ2V0RW5jb2RlclNhbXBsZXNUb0F2ZXJhZ2UobV9lbmNvZGVyLCAmc3RhdHVzKTsKKwkJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCQkJYnJlYWs7CisJCWNhc2UgazFYOgorCQljYXNlIGsyWDoKKwkJCXJlc3VsdCA9IG1fY291bnRlci0+R2V0U2FtcGxlc1RvQXZlcmFnZSgpOworCQkJYnJlYWs7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKKworCisvKioKKyAqIFNldCB3aGljaCBwYXJhbWV0ZXIgb2YgdGhlIGVuY29kZXIgeW91IGFyZSB1c2luZyBhcyBhIHByb2Nlc3MgY29udHJvbCB2YXJpYWJsZS4KKyAqCisgKiBAcGFyYW0gcGlkU291cmNlIEFuIGVudW0gdG8gc2VsZWN0IHRoZSBwYXJhbWV0ZXIuCisgKi8KK3ZvaWQgRW5jb2Rlcjo6U2V0UElEU291cmNlUGFyYW1ldGVyKFBJRFNvdXJjZVBhcmFtZXRlciBwaWRTb3VyY2UpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCW1fcGlkU291cmNlID0gcGlkU291cmNlOworfQorCisvKioKKyAqIEltcGxlbWVudCB0aGUgUElEU291cmNlIGludGVyZmFjZS4KKyAqCisgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBzZWxlY3RlZCBzb3VyY2UgcGFyYW1ldGVyLgorICovCitkb3VibGUgRW5jb2Rlcjo6UElER2V0KCkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gMC4wOworCXN3aXRjaCAobV9waWRTb3VyY2UpCisJeworCWNhc2Uga0Rpc3RhbmNlOgorCQlyZXR1cm4gR2V0RGlzdGFuY2UoKTsKKwljYXNlIGtSYXRlOgorCQlyZXR1cm4gR2V0UmF0ZSgpOworCWRlZmF1bHQ6CisJCXJldHVybiAwLjA7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9HZWFyVG9vdGguY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9HZWFyVG9vdGguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlOGYyNWQKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0dlYXJUb290aC5jcHAKQEAgLTAsMCArMSw2NCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiR2VhclRvb3RoLmgiCisKK2NvbnN0ZXhwciBkb3VibGUgR2VhclRvb3RoOjprR2VhclRvb3RoVGhyZXNob2xkOworCisvKioKKyAqIENvbW1vbiBjb2RlIGNhbGxlZCBieSB0aGUgY29uc3RydWN0b3JzLgorICovCit2b2lkIEdlYXJUb290aDo6RW5hYmxlRGlyZWN0aW9uU2Vuc2luZyhib29sIGRpcmVjdGlvblNlbnNpdGl2ZSkKK3sKKwlpZiAoZGlyZWN0aW9uU2Vuc2l0aXZlKQorCXsKKwkJU2V0UHVsc2VMZW5ndGhNb2RlKGtHZWFyVG9vdGhUaHJlc2hvbGQpOworCX0KK30KKworLyoqCisgKiBDb25zdHJ1Y3QgYSBHZWFyVG9vdGggc2Vuc29yIGdpdmVuIGEgY2hhbm5lbC4KKyAqCisgKiBAcGFyYW0gY2hhbm5lbCBUaGUgRElPIGNoYW5uZWwgdGhhdCB0aGUgc2Vuc29yIGlzIGNvbm5lY3RlZCB0by4gMC05IGFyZSBvbi1ib2FyZCwgMTAtMjUgYXJlIG9uIHRoZSBNWFAuCisgKiBAcGFyYW0gZGlyZWN0aW9uU2Vuc2l0aXZlIFRydWUgdG8gZW5hYmxlIHRoZSBwdWxzZSBsZW5ndGggZGVjb2RpbmcgaW4gaGFyZHdhcmUgdG8gc3BlY2lmeSBjb3VudCBkaXJlY3Rpb24uCisgKi8KK0dlYXJUb290aDo6R2VhclRvb3RoKHVpbnQzMl90IGNoYW5uZWwsIGJvb2wgZGlyZWN0aW9uU2Vuc2l0aXZlKQorCTogQ291bnRlcihjaGFubmVsKQoreworCUVuYWJsZURpcmVjdGlvblNlbnNpbmcoZGlyZWN0aW9uU2Vuc2l0aXZlKTsKK30KKworLyoqCisgKiBDb25zdHJ1Y3QgYSBHZWFyVG9vdGggc2Vuc29yIGdpdmVuIGEgZGlnaXRhbCBpbnB1dC4KKyAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgd2hlbiBzaGFyaW5nIGRpZ2l0YWwgaW5wdXRzLgorICoKKyAqIEBwYXJhbSBzb3VyY2UgQSBwb2ludGVyIHRvIHRoZSBleGlzdGluZyBEaWdpdGFsU291cmNlIG9iamVjdCAoc3VjaCBhcyBhIERpZ2l0YWxJbnB1dCkKKyAqIEBwYXJhbSBkaXJlY3Rpb25TZW5zaXRpdmUgVHJ1ZSB0byBlbmFibGUgdGhlIHB1bHNlIGxlbmd0aCBkZWNvZGluZyBpbiBoYXJkd2FyZSB0byBzcGVjaWZ5IGNvdW50IGRpcmVjdGlvbi4KKyAqLworR2VhclRvb3RoOjpHZWFyVG9vdGgoRGlnaXRhbFNvdXJjZSAqc291cmNlLCBib29sIGRpcmVjdGlvblNlbnNpdGl2ZSkKKwk6IENvdW50ZXIoc291cmNlKQoreworCUVuYWJsZURpcmVjdGlvblNlbnNpbmcoZGlyZWN0aW9uU2Vuc2l0aXZlKTsKK30KKworLyoqCisgKiBDb25zdHJ1Y3QgYSBHZWFyVG9vdGggc2Vuc29yIGdpdmVuIGEgZGlnaXRhbCBpbnB1dC4KKyAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgd2hlbiBzaGFyaW5nIGRpZ2l0YWwgaW5wdXRzLgorICoKKyAqIEBwYXJhbSBzb3VyY2UgQSByZWZlcmVuY2UgdG8gdGhlIGV4aXN0aW5nIERpZ2l0YWxTb3VyY2Ugb2JqZWN0IChzdWNoIGFzIGEgRGlnaXRhbElucHV0KQorICogQHBhcmFtIGRpcmVjdGlvblNlbnNpdGl2ZSBUcnVlIHRvIGVuYWJsZSB0aGUgcHVsc2UgbGVuZ3RoIGRlY29kaW5nIGluIGhhcmR3YXJlIHRvIHNwZWNpZnkgY291bnQgZGlyZWN0aW9uLgorICovCitHZWFyVG9vdGg6OkdlYXJUb290aChEaWdpdGFsU291cmNlICZzb3VyY2UsIGJvb2wgZGlyZWN0aW9uU2Vuc2l0aXZlKTogQ291bnRlcihzb3VyY2UpCit7CisJRW5hYmxlRGlyZWN0aW9uU2Vuc2luZyhkaXJlY3Rpb25TZW5zaXRpdmUpOworfQorCisvKioKKyAqIEZyZWUgdGhlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggYSBnZWFyIHRvb3RoIHNlbnNvci4KKyAqLworR2VhclRvb3RoOjp+R2VhclRvb3RoKCkKK3sKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvR3lyby5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0d5cm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNjUwZGUKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0d5cm8uY3BwCkBAIC0wLDAgKzEsMjMwIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJHeXJvLmgiCisjaW5jbHVkZSAiQW5hbG9nSW5wdXQuaCIKKy8vI2luY2x1ZGUgIk5ldHdvcmtDb21tdW5pY2F0aW9uL1VzYWdlUmVwb3J0aW5nLmgiCisjaW5jbHVkZSAiVGltZXIuaCIKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKyNpbmNsdWRlIDxjbGltaXRzPgorY29uc3QgdWludDMyX3QgR3lybzo6a092ZXJzYW1wbGVCaXRzOworY29uc3QgdWludDMyX3QgR3lybzo6a0F2ZXJhZ2VCaXRzOworY29uc3RleHByIGZsb2F0IEd5cm86OmtTYW1wbGVzUGVyU2Vjb25kOworY29uc3RleHByIGZsb2F0IEd5cm86OmtDYWxpYnJhdGlvblNhbXBsZVRpbWU7Citjb25zdGV4cHIgZmxvYXQgR3lybzo6a0RlZmF1bHRWb2x0c1BlckRlZ3JlZVBlclNlY29uZDsKKworLyoqCisgKiBJbml0aWFsaXplIHRoZSBneXJvLgorICogQ2FsaWJyYXRlIHRoZSBneXJvIGJ5IHJ1bm5pbmcgZm9yIGEgbnVtYmVyIG9mIHNhbXBsZXMgYW5kIGNvbXB1dGluZyB0aGUgY2VudGVyIHZhbHVlLiAKKyAqIFRoZW4gdXNlIHRoZSBjZW50ZXIgdmFsdWUgYXMgdGhlIEFjY3VtdWxhdG9yIGNlbnRlciB2YWx1ZSBmb3Igc3Vic2VxdWVudCBtZWFzdXJlbWVudHMuCisgKiBJdCdzIGltcG9ydGFudCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgcm9ib3QgaXMgbm90IG1vdmluZyB3aGlsZSB0aGUgY2VudGVyaW5nIGNhbGN1bGF0aW9ucyBhcmUKKyAqIGluIHByb2dyZXNzLCB0aGlzIGlzIHR5cGljYWxseSBkb25lIHdoZW4gdGhlIHJvYm90IGlzIGZpcnN0IHR1cm5lZCBvbiB3aGlsZSBpdCdzIHNpdHRpbmcgYXQKKyAqIHJlc3QgYmVmb3JlIHRoZSBjb21wZXRpdGlvbiBzdGFydHMuCisgKi8KK3ZvaWQgR3lybzo6SW5pdEd5cm8oKQoreworCWlmICghbV9hbmFsb2ctPklzQWNjdW11bGF0b3JDaGFubmVsKCkpCisJeworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChQYXJhbWV0ZXJPdXRPZlJhbmdlLAorICAgICAgICAgICAgIiBjaGFubmVsIChtdXN0IGJlIGFjY3VtdWxhdG9yIGNoYW5uZWwpIik7CisJCWlmIChtX2NoYW5uZWxBbGxvY2F0ZWQpCisJCXsKKwkJCWRlbGV0ZSBtX2FuYWxvZzsKKwkJCW1fYW5hbG9nID0gTlVMTDsKKwkJfQorCQlyZXR1cm47CisJfQorCisJbV92b2x0c1BlckRlZ3JlZVBlclNlY29uZCA9IGtEZWZhdWx0Vm9sdHNQZXJEZWdyZWVQZXJTZWNvbmQ7CisJbV9hbmFsb2ctPlNldEF2ZXJhZ2VCaXRzKGtBdmVyYWdlQml0cyk7CisJbV9hbmFsb2ctPlNldE92ZXJzYW1wbGVCaXRzKGtPdmVyc2FtcGxlQml0cyk7CisJZmxvYXQgc2FtcGxlUmF0ZSA9IGtTYW1wbGVzUGVyU2Vjb25kICoKKwkJKDEgPDwgKGtBdmVyYWdlQml0cyArIGtPdmVyc2FtcGxlQml0cykpOworCW1fYW5hbG9nLT5TZXRTYW1wbGVSYXRlKHNhbXBsZVJhdGUpOworCVdhaXQoMS4wKTsKKworCW1fYW5hbG9nLT5Jbml0QWNjdW11bGF0b3IoKTsKKworCVdhaXQoa0NhbGlicmF0aW9uU2FtcGxlVGltZSk7CisKKwlpbnQ2NF90IHZhbHVlOworCXVpbnQzMl90IGNvdW50OworCW1fYW5hbG9nLT5HZXRBY2N1bXVsYXRvck91dHB1dCgmdmFsdWUsICZjb3VudCk7CisKKwltX2NlbnRlciA9ICh1aW50MzJfdCkoKGZsb2F0KXZhbHVlIC8gKGZsb2F0KWNvdW50ICsgLjUpOworCisJbV9vZmZzZXQgPSAoKGZsb2F0KXZhbHVlIC8gKGZsb2F0KWNvdW50KSAtIChmbG9hdCltX2NlbnRlcjsKKwltX2FuYWxvZy0+U2V0QWNjdW11bGF0b3JDZW50ZXIobV9jZW50ZXIpOworCW1fYW5hbG9nLT5SZXNldEFjY3VtdWxhdG9yKCk7CisKKwlTZXREZWFkYmFuZCgwLjBmKTsKKworCVNldFBJRFNvdXJjZVBhcmFtZXRlcihrQW5nbGUpOworCisJSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0d5cm8sIG1fYW5hbG9nLT5HZXRDaGFubmVsKCkpOworfQorCisvKioKKyAqIEd5cm8gY29uc3RydWN0b3IgdXNpbmcgdGhlIEFuYWxvZyBJbnB1dCBjaGFubmVsIG51bWJlci4KKyAqCisgKiBAcGFyYW0gY2hhbm5lbCBUaGUgYW5hbG9nIGNoYW5uZWwgdGhlIGd5cm8gaXMgY29ubmVjdGVkIHRvLiBHeXJvcyAKKwkgICAgICAgICAgICAgIGNhbiBvbmx5IGJlIHVzZWQgb24gb24tYm9hcmQgQW5hbG9nIElucHV0cyAwLTEuCisgKi8KK0d5cm86Okd5cm8oaW50MzJfdCBjaGFubmVsKQoreworCW1fYW5hbG9nID0gbmV3IEFuYWxvZ0lucHV0KGNoYW5uZWwpOworCW1fY2hhbm5lbEFsbG9jYXRlZCA9IHRydWU7CisJSW5pdEd5cm8oKTsKK30KKworLyoqCisgKiBHeXJvIGNvbnN0cnVjdG9yIHdpdGggYSBwcmVjcmVhdGVkIEFuYWxvZ0lucHV0IG9iamVjdC4KKyAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIHdoZW4gdGhlIGFuYWxvZyBjaGFubmVsIG5lZWRzIHRvIGJlIHNoYXJlZC4KKyAqIFRoaXMgb2JqZWN0IHdpbGwgbm90IGNsZWFuIHVwIHRoZSBBbmFsb2dJbnB1dCBvYmplY3Qgd2hlbiB1c2luZyB0aGlzIGNvbnN0cnVjdG9yLiAKKyAqIEd5cm9zIGNhbiBvbmx5IGJlIHVzZWQgb24gb24tYm9hcmQgY2hhbm5lbHMgMC0xLgorICogQHBhcmFtIGNoYW5uZWwgQSBwb2ludGVyIHRvIHRoZSBBbmFsb2dJbnB1dCBvYmplY3QgdGhhdCB0aGUgZ3lybyBpcyBjb25uZWN0ZWQgdG8uCisgKi8KK0d5cm86Okd5cm8oQW5hbG9nSW5wdXQgKmNoYW5uZWwpCit7CisJbV9hbmFsb2cgPSBjaGFubmVsOworCW1fY2hhbm5lbEFsbG9jYXRlZCA9IGZhbHNlOworCWlmIChjaGFubmVsID09IE5VTEwpCisJeworCQl3cGlfc2V0V1BJRXJyb3IoTnVsbFBhcmFtZXRlcik7CisJfQorCWVsc2UKKwl7CisJCUluaXRHeXJvKCk7CisJfQorfQorCisvKioKKyAqIEd5cm8gY29uc3RydWN0b3Igd2l0aCBhIHByZWNyZWF0ZWQgQW5hbG9nSW5wdXQgb2JqZWN0LgorICogVXNlIHRoaXMgY29uc3RydWN0b3Igd2hlbiB0aGUgYW5hbG9nIGNoYW5uZWwgbmVlZHMgdG8gYmUgc2hhcmVkLgorICogVGhpcyBvYmplY3Qgd2lsbCBub3QgY2xlYW4gdXAgdGhlIEFuYWxvZ0lucHV0IG9iamVjdCB3aGVuIHVzaW5nIHRoaXMgY29uc3RydWN0b3IKKyAqIEBwYXJhbSBjaGFubmVsIEEgcmVmZXJlbmNlIHRvIHRoZSBBbmFsb2dJbnB1dCBvYmplY3QgdGhhdCB0aGUgZ3lybyBpcyBjb25uZWN0ZWQgdG8uCisgKi8KK0d5cm86Okd5cm8oQW5hbG9nSW5wdXQgJmNoYW5uZWwpCit7CisJbV9hbmFsb2cgPSAmY2hhbm5lbDsKKwltX2NoYW5uZWxBbGxvY2F0ZWQgPSBmYWxzZTsKKwlJbml0R3lybygpOworfQorCisvKioKKyAqIFJlc2V0IHRoZSBneXJvLgorICogUmVzZXRzIHRoZSBneXJvIHRvIGEgaGVhZGluZyBvZiB6ZXJvLiBUaGlzIGNhbiBiZSB1c2VkIGlmIHRoZXJlIGlzIHNpZ25pZmljYW50CisgKiBkcmlmdCBpbiB0aGUgZ3lybyBhbmQgaXQgbmVlZHMgdG8gYmUgcmVjYWxpYnJhdGVkIGFmdGVyIGl0IGhhcyBiZWVuIHJ1bm5pbmcuCisgKi8KK3ZvaWQgR3lybzo6UmVzZXQoKQoreworCW1fYW5hbG9nLT5SZXNldEFjY3VtdWxhdG9yKCk7Cit9CisKKy8qKgorICogRGVsZXRlIChmcmVlKSB0aGUgYWNjdW11bGF0b3IgYW5kIHRoZSBhbmFsb2cgY29tcG9uZW50cyB1c2VkIGZvciB0aGUgZ3lyby4KKyAqLworR3lybzo6fkd5cm8oKQoreworCWlmIChtX2NoYW5uZWxBbGxvY2F0ZWQpCisJCWRlbGV0ZSBtX2FuYWxvZzsKK30KKworLyoqCisgKiBSZXR1cm4gdGhlIGFjdHVhbCBhbmdsZSBpbiBkZWdyZWVzIHRoYXQgdGhlIHJvYm90IGlzIGN1cnJlbnRseSBmYWNpbmcuCisgKgorICogVGhlIGFuZ2xlIGlzIGJhc2VkIG9uIHRoZSBjdXJyZW50IGFjY3VtdWxhdG9yIHZhbHVlIGNvcnJlY3RlZCBieSB0aGUgb3ZlcnNhbXBsaW5nIHJhdGUsIHRoZQorICogZ3lybyB0eXBlIGFuZCB0aGUgQS9EIGNhbGlicmF0aW9uIHZhbHVlcy4KKyAqIFRoZSBhbmdsZSBpcyBjb250aW51b3VzLCB0aGF0IGlzIGl0IHdpbGwgY29udGludWUgZnJvbSAzNjAtPjM2MSBkZWdyZWVzLiBUaGlzIGFsbG93cyBhbGdvcml0aG1zIHRoYXQgd291bGRuJ3QKKyAqIHdhbnQgdG8gc2VlIGEgZGlzY29udGludWl0eSBpbiB0aGUgZ3lybyBvdXRwdXQgYXMgaXQgc3dlZXBzIGZyb20gMzYwIHRvIDAgb24gdGhlIHNlY29uZCB0aW1lIGFyb3VuZC4KKyAqCisgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGhlYWRpbmcgb2YgdGhlIHJvYm90IGluIGRlZ3JlZXMuIFRoaXMgaGVhZGluZyBpcyBiYXNlZCBvbiBpbnRlZ3JhdGlvbgorICogb2YgdGhlIHJldHVybmVkIHJhdGUgZnJvbSB0aGUgZ3lyby4KKyAqLworZmxvYXQgR3lybzo6R2V0QW5nbGUoIHZvaWQgKQoreworCWludDY0X3QgcmF3VmFsdWU7CisJdWludDMyX3QgY291bnQ7CisJbV9hbmFsb2ctPkdldEFjY3VtdWxhdG9yT3V0cHV0KCZyYXdWYWx1ZSwgJmNvdW50KTsKKworCWludDY0X3QgdmFsdWUgPSByYXdWYWx1ZSAtIChpbnQ2NF90KSgoZmxvYXQpY291bnQgKiBtX29mZnNldCk7CisKKwlkb3VibGUgc2NhbGVkVmFsdWUgPSB2YWx1ZSAqIDFlLTkgKiAoZG91YmxlKW1fYW5hbG9nLT5HZXRMU0JXZWlnaHQoKSAqIChkb3VibGUpKDEgPDwgbV9hbmFsb2ctPkdldEF2ZXJhZ2VCaXRzKCkpIC8KKwkJKG1fYW5hbG9nLT5HZXRTYW1wbGVSYXRlKCkgKiBtX3ZvbHRzUGVyRGVncmVlUGVyU2Vjb25kKTsKKworCXJldHVybiAoZmxvYXQpc2NhbGVkVmFsdWU7Cit9CisKKworLyoqCisgKiBSZXR1cm4gdGhlIHJhdGUgb2Ygcm90YXRpb24gb2YgdGhlIGd5cm8KKyAqCisgKiBUaGUgcmF0ZSBpcyBiYXNlZCBvbiB0aGUgbW9zdCByZWNlbnQgcmVhZGluZyBvZiB0aGUgZ3lybyBhbmFsb2cgdmFsdWUKKyAqCisgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHJhdGUgaW4gZGVncmVlcyBwZXIgc2Vjb25kCisgKi8KK2RvdWJsZSBHeXJvOjpHZXRSYXRlKCB2b2lkICkKK3sKKwlyZXR1cm4gKG1fYW5hbG9nLT5HZXRBdmVyYWdlVmFsdWUoKSAtICgoZG91YmxlKW1fY2VudGVyICsgbV9vZmZzZXQpKSAqIDFlLTkgKiBtX2FuYWxvZy0+R2V0TFNCV2VpZ2h0KCkKKwkJCS8gKCgxIDw8IG1fYW5hbG9nLT5HZXRPdmVyc2FtcGxlQml0cygpKSAqIG1fdm9sdHNQZXJEZWdyZWVQZXJTZWNvbmQpOworfQorCisKKy8qKgorICogU2V0IHRoZSBneXJvIHNlbnNpdGl2aXR5LgorICogVGhpcyB0YWtlcyB0aGUgbnVtYmVyIG9mIHZvbHRzL2RlZ3JlZS9zZWNvbmQgc2Vuc2l0aXZpdHkgb2YgdGhlIGd5cm8gYW5kIHVzZXMgaXQgaW4gc3Vic2VxdWVudAorICogY2FsY3VsYXRpb25zIHRvIGFsbG93IHRoZSBjb2RlIHRvIHdvcmsgd2l0aCBtdWx0aXBsZSBneXJvcy4gVGhpcyB2YWx1ZSBpcyB0eXBpY2FsbHkgZm91bmQgaW4gCisgKiB0aGUgZ3lybyBkYXRhc2hlZXQuCisgKgorICogQHBhcmFtIHZvbHRzUGVyRGVncmVlUGVyU2Vjb25kIFRoZSBzZW5zaXRpdml0eSBpbiBWb2x0cy9kZWdyZWUvc2Vjb25kCisgKi8KK3ZvaWQgR3lybzo6U2V0U2Vuc2l0aXZpdHkoIGZsb2F0IHZvbHRzUGVyRGVncmVlUGVyU2Vjb25kICkKK3sKKwltX3ZvbHRzUGVyRGVncmVlUGVyU2Vjb25kID0gdm9sdHNQZXJEZWdyZWVQZXJTZWNvbmQ7Cit9CisKKy8qKgorICogU2V0IHRoZSBzaXplIG9mIHRoZSBuZXV0cmFsIHpvbmUuICBBbnkgdm9sdGFnZSBmcm9tIHRoZSBneXJvIGxlc3MgdGhhbiB0aGlzCisgKiBhbW91bnQgZnJvbSB0aGUgY2VudGVyIGlzIGNvbnNpZGVyZWQgc3RhdGlvbmFyeS4gIFNldHRpbmcgYSBkZWFkYmFuZCB3aWxsCisgKiBkZWNyZWFzZSB0aGUgYW1vdW50IG9mIGRyaWZ0IHdoZW4gdGhlIGd5cm8gaXNuJ3Qgcm90YXRpbmcsIGJ1dCB3aWxsIG1ha2UgaXQKKyAqIGxlc3MgYWNjdXJhdGUuCisgKgorICogQHBhcmFtIHZvbHRzIFRoZSBzaXplIG9mIHRoZSBkZWFkYmFuZCBpbiB2b2x0cworICovCit2b2lkIEd5cm86OlNldERlYWRiYW5kKCBmbG9hdCB2b2x0cyApIHsKKwlpbnQzMl90IGRlYWRiYW5kID0gdm9sdHMgKiAxZTkgLyBtX2FuYWxvZy0+R2V0TFNCV2VpZ2h0KCkgKiAoMSA8PCBtX2FuYWxvZy0+R2V0T3ZlcnNhbXBsZUJpdHMoKSk7CisJbV9hbmFsb2ctPlNldEFjY3VtdWxhdG9yRGVhZGJhbmQoZGVhZGJhbmQpOworfQorCisKKy8qKgorICogU2V0cyB0aGUgdHlwZSBvZiBvdXRwdXQgdG8gdXNlIHdpdGggdGhlIFdQSUxpYiBQSUQgY2xhc3MKKyAqIFRoZSBneXJvIHN1cHBvcnRzIHVzaW5nIGVpdGhlciByYXRlIG9yIGFuZ2xlIGZvciBQSUQgY2FsY3VsYXRpb25zCisgKi8KK3ZvaWQgR3lybzo6U2V0UElEU291cmNlUGFyYW1ldGVyKFBJRFNvdXJjZVBhcmFtZXRlciBwaWRTb3VyY2UpCit7CisJaWYocGlkU291cmNlID09IDAgfHwgcGlkU291cmNlID4gMikKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoUGFyYW1ldGVyT3V0T2ZSYW5nZSwgIkd5cm8gcGlkU291cmNlIik7CisgICAgbV9waWRTb3VyY2UgPSBwaWRTb3VyY2U7Cit9CisKKy8qKgorICogR2V0IHRoZSBQSURPdXRwdXQgZm9yIHRoZSBQSURTb3VyY2UgYmFzZSBvYmplY3QuIENhbiBiZSBzZXQgdG8gcmV0dXJuCisgKiBhbmdsZSBvciByYXRlIHVzaW5nIFNldFBJRFNvdXJjZVBhcmFtZXRlcigpLiBEZWZhdWx0cyB0byBhbmdsZS4KKyAqCisgKiBAcmV0dXJuIFRoZSBQSURPdXRwdXQgKGFuZ2xlIG9yIHJhdGUsIGRlZmF1bHRzIHRvIGFuZ2xlKQorICovCitkb3VibGUgR3lybzo6UElER2V0KCkKK3sKKwlzd2l0Y2gobV9waWRTb3VyY2UpeworCWNhc2Uga1JhdGU6CisJCXJldHVybiBHZXRSYXRlKCk7CisJY2FzZSBrQW5nbGU6CisJCXJldHVybiBHZXRBbmdsZSgpOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvSTJDLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvSTJDLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWUzZjRmCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9JMkMuY3BwCkBAIC0wLDAgKzEsMjIxIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJJMkMuaCIKKyNpbmNsdWRlICJIQUwvSEFMLmhwcCIKKyNpbmNsdWRlICJIQUwvRGlnaXRhbC5ocHAiCisjaW5jbHVkZSAiV1BJRXJyb3JzLmgiCisKKy8qKgorICogQ29uc3RydWN0b3IuCisgKgorICogQHBhcmFtIHBvcnQgVGhlIEkyQyBwb3J0IHRvIHdoaWNoIHRoZSBkZXZpY2UgaXMgY29ubmVjdGVkLgorICogQHBhcmFtIGRldmljZUFkZHJlc3MgVGhlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBvbiB0aGUgSTJDIGJ1cy4KKyAqLworSTJDOjpJMkMoUG9ydCBwb3J0LCB1aW50OF90IGRldmljZUFkZHJlc3MpIDoKKwltX3BvcnQgKHBvcnQpCisJLCBtX2RldmljZUFkZHJlc3MgKGRldmljZUFkZHJlc3MpCit7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCWkyQ0luaXRpYWxpemUobV9wb3J0LCAmc3RhdHVzKTsKKwkvL3dwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCisJSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0kyQywgZGV2aWNlQWRkcmVzcyk7Cit9CisKKy8qKgorICogRGVzdHJ1Y3Rvci4KKyAqLworSTJDOjp+STJDKCkKK3sKKwlpMkNDbG9zZShtX3BvcnQpOworfQorCisvKioKKyAqIEdlbmVyaWMgdHJhbnNhY3Rpb24uCisgKgorICogVGhpcyBpcyBhIGxvd2VyLWxldmVsIGludGVyZmFjZSB0byB0aGUgSTJDIGhhcmR3YXJlIGdpdmluZyB5b3UgbW9yZSBjb250cm9sIG92ZXIgZWFjaCB0cmFuc2FjdGlvbi4KKyAqCisgKiBAcGFyYW0gZGF0YVRvU2VuZCBCdWZmZXIgb2YgZGF0YSB0byBzZW5kIGFzIHBhcnQgb2YgdGhlIHRyYW5zYWN0aW9uLgorICogQHBhcmFtIHNlbmRTaXplIE51bWJlciBvZiBieXRlcyB0byBzZW5kIGFzIHBhcnQgb2YgdGhlIHRyYW5zYWN0aW9uLiBbMC4uNl0KKyAqIEBwYXJhbSBkYXRhUmVjZWl2ZWQgQnVmZmVyIHRvIHJlYWQgZGF0YSBpbnRvLgorICogQHBhcmFtIHJlY2VpdmVTaXplIE51bWJlciBvZiBieXRlcyB0byByZWFkIGZyb20gdGhlIGRldmljZS4gWzAuLjddCisgKiBAcmV0dXJuIFRyYW5zZmVyIEFib3J0ZWQuLi4gZmFsc2UgZm9yIHN1Y2Nlc3MsIHRydWUgZm9yIGFib3J0ZWQuCisgKi8KK2Jvb2wgSTJDOjpUcmFuc2FjdGlvbih1aW50OF90ICpkYXRhVG9TZW5kLCB1aW50OF90IHNlbmRTaXplLCB1aW50OF90ICpkYXRhUmVjZWl2ZWQsIHVpbnQ4X3QgcmVjZWl2ZVNpemUpCit7CisJaWYgKHNlbmRTaXplID4gNikgLy8gT3B0aW9uYWwsIHByb3ZpZGVzIGJldHRlciBlcnJvciBtZXNzYWdlLgorCXsKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoUGFyYW1ldGVyT3V0T2ZSYW5nZSwgInNlbmRTaXplIik7CisJCXJldHVybiB0cnVlOworCX0KKwlpZiAocmVjZWl2ZVNpemUgPiA3KSAvLyBPcHRpb25hbCwgcHJvdmlkZXMgYmV0dGVyIGVycm9yIG1lc3NhZ2UuCisJeworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChQYXJhbWV0ZXJPdXRPZlJhbmdlLCAicmVjZWl2ZVNpemUiKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJaW50MzJfdCBzdGF0dXMgPSAwOworCXN0YXR1cyA9IGkyQ1RyYW5zYWN0aW9uKG1fcG9ydCwgbV9kZXZpY2VBZGRyZXNzLAorCQkJCQkJCQkJCQlkYXRhVG9TZW5kLCBzZW5kU2l6ZSwgZGF0YVJlY2VpdmVkLCByZWNlaXZlU2l6ZSk7CisJLy93cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwlyZXR1cm4gc3RhdHVzIDwgMDsKK30KKworLyoqCisgKiBBdHRlbXB0IHRvIGFkZHJlc3MgYSBkZXZpY2Ugb24gdGhlIEkyQyBidXMuCisgKgorICogVGhpcyBhbGxvd3MgeW91IHRvIGZpZ3VyZSBvdXQgaWYgdGhlcmUgaXMgYSBkZXZpY2Ugb24gdGhlIEkyQyBidXMgdGhhdAorICogcmVzcG9uZHMgdG8gdGhlIGFkZHJlc3Mgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3Rvci4KKyAqCisgKiBAcmV0dXJuIFRyYW5zZmVyIEFib3J0ZWQuLi4gZmFsc2UgZm9yIHN1Y2Nlc3MsIHRydWUgZm9yIGFib3J0ZWQuCisgKi8KK2Jvb2wgSTJDOjpBZGRyZXNzT25seSgpCit7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCXN0YXR1cyA9IFRyYW5zYWN0aW9uKE5VTEwsIDAsIE5VTEwsIDApOworCXJldHVybiBzdGF0dXMgPCAwOworfQorCisvKioKKyAqIEV4ZWN1dGUgYSB3cml0ZSB0cmFuc2FjdGlvbiB3aXRoIHRoZSBkZXZpY2UuCisgKgorICogV3JpdGUgYSBzaW5nbGUgYnl0ZSB0byBhIHJlZ2lzdGVyIG9uIGEgZGV2aWNlIGFuZCB3YWl0IHVudGlsIHRoZQorICogICB0cmFuc2FjdGlvbiBpcyBjb21wbGV0ZS4KKyAqCisgKiBAcGFyYW0gcmVnaXN0ZXJBZGRyZXNzIFRoZSBhZGRyZXNzIG9mIHRoZSByZWdpc3RlciBvbiB0aGUgZGV2aWNlIHRvIGJlIHdyaXR0ZW4uCisgKiBAcGFyYW0gZGF0YSBUaGUgYnl0ZSB0byB3cml0ZSB0byB0aGUgcmVnaXN0ZXIgb24gdGhlIGRldmljZS4KKyAqIEByZXR1cm4gVHJhbnNmZXIgQWJvcnRlZC4uLiBmYWxzZSBmb3Igc3VjY2VzcywgdHJ1ZSBmb3IgYWJvcnRlZC4KKyAqLworYm9vbCBJMkM6OldyaXRlKHVpbnQ4X3QgcmVnaXN0ZXJBZGRyZXNzLCB1aW50OF90IGRhdGEpCit7CisJdWludDhfdCBidWZmZXJbMl07CisJYnVmZmVyWzBdID0gcmVnaXN0ZXJBZGRyZXNzOworCWJ1ZmZlclsxXSA9IGRhdGE7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCXN0YXR1cyA9IGkyQ1dyaXRlKG1fcG9ydCwgbV9kZXZpY2VBZGRyZXNzLCBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKwlyZXR1cm4gc3RhdHVzIDwgMDsKK30KKworLyoqCisgKiBFeGVjdXRlIGEgYnVsayB3cml0ZSB0cmFuc2FjdGlvbiB3aXRoIHRoZSBkZXZpY2UuCisgKgorICogV3JpdGUgbXVsdGlwbGUgYnl0ZXMgdG8gYSBkZXZpY2UgYW5kIHdhaXQgdW50aWwgdGhlCisgKiAgIHRyYW5zYWN0aW9uIGlzIGNvbXBsZXRlLgorICoKKyAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIHdyaXRlIHRvIHRoZSByZWdpc3RlciBvbiB0aGUgZGV2aWNlLgorICogQHBhcmFtIGNvdW50IFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgd3JpdHRlbi4KKyAqIEByZXR1cm4gVHJhbnNmZXIgQWJvcnRlZC4uLiBmYWxzZSBmb3Igc3VjY2VzcywgdHJ1ZSBmb3IgYWJvcnRlZC4KKyAqLworYm9vbCBJMkM6OldyaXRlQnVsayh1aW50OF90KiBkYXRhLCB1aW50OF90IGNvdW50KQoreworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlzdGF0dXMgPSBpMkNXcml0ZShtX3BvcnQsIG1fZGV2aWNlQWRkcmVzcywgZGF0YSwgY291bnQpOworCXJldHVybiBzdGF0dXMgPCAwOworfQorCisvKioKKyAqIEV4ZWN1dGUgYSByZWFkIHRyYW5zYWN0aW9uIHdpdGggdGhlIGRldmljZS4KKyAqCisgKiBSZWFkIDEgdG8gNyBieXRlcyBmcm9tIGEgZGV2aWNlLgorICogTW9zdCBJMkMgZGV2aWNlcyB3aWxsIGF1dG8taW5jcmVtZW50IHRoZSByZWdpc3RlciBwb2ludGVyIGludGVybmFsbHkKKyAqICAgYWxsb3dpbmcgeW91IHRvIHJlYWQgdXAgdG8gNyBjb25zZWN1dGl2ZSByZWdpc3RlcnMgb24gYSBkZXZpY2UgaW4gYQorICogICBzaW5nbGUgdHJhbnNhY3Rpb24uCisgKgorICogQHBhcmFtIHJlZ2lzdGVyQWRkcmVzcyBUaGUgcmVnaXN0ZXIgdG8gcmVhZCBmaXJzdCBpbiB0aGUgdHJhbnNhY3Rpb24uCisgKiBAcGFyYW0gY291bnQgVGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkIGluIHRoZSB0cmFuc2FjdGlvbi4gWzEuLjddCisgKiBAcGFyYW0gYnVmZmVyIEEgcG9pbnRlciB0byB0aGUgYXJyYXkgb2YgYnl0ZXMgdG8gc3RvcmUgdGhlIGRhdGEgcmVhZCBmcm9tIHRoZSBkZXZpY2UuCisgKiBAcmV0dXJuIFRyYW5zZmVyIEFib3J0ZWQuLi4gZmFsc2UgZm9yIHN1Y2Nlc3MsIHRydWUgZm9yIGFib3J0ZWQuCisgKi8KK2Jvb2wgSTJDOjpSZWFkKHVpbnQ4X3QgcmVnaXN0ZXJBZGRyZXNzLCB1aW50OF90IGNvdW50LCB1aW50OF90ICpidWZmZXIpCit7CisJaWYgKGNvdW50IDwgMSB8fCBjb3VudCA+IDcpCisJeworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChQYXJhbWV0ZXJPdXRPZlJhbmdlLCAiY291bnQiKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCWlmIChidWZmZXIgPT0gTlVMTCkKKwl7CisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KE51bGxQYXJhbWV0ZXIsICJidWZmZXIiKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCWludDMyX3Qgc3RhdHVzID0gMDsKKwlzdGF0dXMgPSBUcmFuc2FjdGlvbigmcmVnaXN0ZXJBZGRyZXNzLCBzaXplb2YocmVnaXN0ZXJBZGRyZXNzKSwgYnVmZmVyLCBjb3VudCk7CisJcmV0dXJuIHN0YXR1cyA8IDA7Cit9CisKKy8qKgorICogRXhlY3V0ZSBhIHJlYWQgb25seSB0cmFuc2FjdGlvbiB3aXRoIHRoZSBkZXZpY2UuCisgKgorICogUmVhZCAxIHRvIDcgYnl0ZXMgZnJvbSBhIGRldmljZS4gVGhpcyBtZXRob2QgZG9lcyBub3Qgd3JpdGUgYW55IGRhdGEgdG8gcHJvbXB0CisgKiB0aGUgZGV2aWNlLgorICoKKyAqIEBwYXJhbSBidWZmZXIKKyAqICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBhcnJheSBvZiBieXRlcyB0byBzdG9yZSB0aGUgZGF0YSByZWFkIGZyb20KKyAqICAgICAgICAgICAgdGhlIGRldmljZS4KKyAqIEBwYXJhbSBjb3VudAorICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgaW4gdGhlIHRyYW5zYWN0aW9uLiBbMS4uN10KKyAqIEByZXR1cm4gVHJhbnNmZXIgQWJvcnRlZC4uLiBmYWxzZSBmb3Igc3VjY2VzcywgdHJ1ZSBmb3IgYWJvcnRlZC4KKyAqLworYm9vbCBJMkM6OlJlYWRPbmx5KHVpbnQ4X3QgY291bnQsIHVpbnQ4X3QgKmJ1ZmZlcikKK3sKKwlpZiAoY291bnQgPCAxIHx8IGNvdW50ID4gNykKKwl7CisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFBhcmFtZXRlck91dE9mUmFuZ2UsICJjb3VudCIpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJaWYgKGJ1ZmZlciA9PSBOVUxMKQorCXsKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoTnVsbFBhcmFtZXRlciwgImJ1ZmZlciIpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJaW50MzJfdCBzdGF0dXMgPSAwOworCXN0YXR1cyA9IGkyQ1JlYWQobV9wb3J0LCBtX2RldmljZUFkZHJlc3MsIGJ1ZmZlciwgY291bnQpOworCXJldHVybiBzdGF0dXMgPCAwOworfQorCisvKioKKyAqIFNlbmQgYSBicm9hZGNhc3Qgd3JpdGUgdG8gYWxsIGRldmljZXMgb24gdGhlIEkyQyBidXMuCisgKgorICogVGhpcyBpcyBub3QgY3VycmVudGx5IGltcGxlbWVudGVkIQorICoKKyAqIEBwYXJhbSByZWdpc3RlckFkZHJlc3MgVGhlIHJlZ2lzdGVyIHRvIHdyaXRlIG9uIGFsbCBkZXZpY2VzIG9uIHRoZSBidXMuCisgKiBAcGFyYW0gZGF0YSBUaGUgdmFsdWUgdG8gd3JpdGUgdG8gdGhlIGRldmljZXMuCisgKi8KK3ZvaWQgSTJDOjpCcm9hZGNhc3QodWludDhfdCByZWdpc3RlckFkZHJlc3MsIHVpbnQ4X3QgZGF0YSkKK3sKK30KKworLyoqCisgKiBWZXJpZnkgdGhhdCBhIGRldmljZSdzIHJlZ2lzdGVycyBjb250YWluIGV4cGVjdGVkIHZhbHVlcy4KKyAqCisgKiBNb3N0IGRldmljZXMgd2lsbCBoYXZlIGEgc2V0IG9mIHJlZ2lzdGVycyB0aGF0IGNvbnRhaW4gYSBrbm93biB2YWx1ZSB0aGF0CisgKiAgIGNhbiBiZSB1c2VkIHRvIGlkZW50aWZ5IHRoZW0uICBUaGlzIGFsbG93cyBhbiBJMkMgZGV2aWNlIGRyaXZlciB0byBlYXNpbHkKKyAqICAgdmVyaWZ5IHRoYXQgdGhlIGRldmljZSBjb250YWlucyB0aGUgZXhwZWN0ZWQgdmFsdWUuCisgKgorICogQHByZSBUaGUgZGV2aWNlIG11c3Qgc3VwcG9ydCBhbmQgYmUgY29uZmlndXJlZCB0byB1c2UgcmVnaXN0ZXIgYXV0by1pbmNyZW1lbnQuCisgKgorICogQHBhcmFtIHJlZ2lzdGVyQWRkcmVzcyBUaGUgYmFzZSByZWdpc3RlciB0byBzdGFydCByZWFkaW5nIGZyb20gdGhlIGRldmljZS4KKyAqIEBwYXJhbSBjb3VudCBUaGUgc2l6ZSBvZiB0aGUgZmllbGQgdG8gYmUgdmVyaWZpZWQuCisgKiBAcGFyYW0gZXhwZWN0ZWQgQSBidWZmZXIgY29udGFpbmluZyB0aGUgdmFsdWVzIGV4cGVjdGVkIGZyb20gdGhlIGRldmljZS4KKyAqLworYm9vbCBJMkM6OlZlcmlmeVNlbnNvcih1aW50OF90IHJlZ2lzdGVyQWRkcmVzcywgdWludDhfdCBjb3VudCwgY29uc3QgdWludDhfdCAqZXhwZWN0ZWQpCit7CisJLy8gVE9ETzogTWFrZSB1c2Ugb2YgYWxsIDcgcmVhZCBieXRlcworCXVpbnQ4X3QgZGV2aWNlRGF0YVs0XTsKKwlmb3IgKHVpbnQ4X3QgaT0wLCBjdXJSZWdpc3RlckFkZHJlc3MgPSByZWdpc3RlckFkZHJlc3M7IGkgPCBjb3VudDsgaSs9NCwgY3VyUmVnaXN0ZXJBZGRyZXNzKz00KQorCXsKKwkJdWludDhfdCB0b1JlYWQgPSBjb3VudCAtIGkgPCA0ID8gY291bnQgLSBpIDogNDsKKwkJLy8gUmVhZCB0aGUgY2h1bmsgb2YgZGF0YS4gIFJldHVybiBmYWxzZSBpZiB0aGUgc2Vuc29yIGRvZXMgbm90IHJlc3BvbmQuCisJCWlmIChSZWFkKGN1clJlZ2lzdGVyQWRkcmVzcywgdG9SZWFkLCBkZXZpY2VEYXRhKSkgcmV0dXJuIGZhbHNlOworCisJCWZvciAodWludDhfdCBqPTA7IGo8dG9SZWFkOyBqKyspCisJCXsKKwkJCWlmKGRldmljZURhdGFbal0gIT0gZXhwZWN0ZWRbaSArIGpdKSByZXR1cm4gZmFsc2U7CisJCX0KKwl9CisJcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0ludGVybmFsL0hhcmR3YXJlSExSZXBvcnRpbmcuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9JbnRlcm5hbC9IYXJkd2FyZUhMUmVwb3J0aW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzIxYjdhCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9JbnRlcm5hbC9IYXJkd2FyZUhMUmVwb3J0aW5nLmNwcApAQCAtMCwwICsxLDEyIEBACisKKyNpbmNsdWRlICJJbnRlcm5hbC9IYXJkd2FyZUhMUmVwb3J0aW5nLmgiCisjaW5jbHVkZSAiSEFML0hBTC5ocHAiCisKK3ZvaWQgSGFyZHdhcmVITFJlcG9ydGluZzo6UmVwb3J0U2NoZWR1bGVyKCkgeworICAgIEhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9Db21tYW5kLAorICAgICAgICAgICAgICBIQUxVc2FnZVJlcG9ydGluZzo6a0NvbW1hbmRfU2NoZWR1bGVyKTsKK30KKwordm9pZCBIYXJkd2FyZUhMUmVwb3J0aW5nOjpSZXBvcnRTbWFydERhc2hib2FyZCgpIHsKKyAgICBIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfU21hcnREYXNoYm9hcmQsIDApOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9JbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZS5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0ludGVycnVwdGFibGVTZW5zb3JCYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTJjNTY3Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9JbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZS5jcHAKQEAgLTAsMCArMSwyMDcgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkludGVycnVwdGFibGVTZW5zb3JCYXNlLmgiCisjaW5jbHVkZSAiVXRpbGl0eS5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorCitSZXNvdXJjZSAqSW50ZXJydXB0YWJsZVNlbnNvckJhc2U6Om1faW50ZXJydXB0cyA9IE5VTEw7CisKK0ludGVycnVwdGFibGVTZW5zb3JCYXNlOjpJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZSgpCit7CisJbV9pbnRlcnJ1cHQgPSBOVUxMOworCVJlc291cmNlOjpDcmVhdGVSZXNvdXJjZU9iamVjdCgmbV9pbnRlcnJ1cHRzLCBpbnRlcnJ1cHRfa051bVN5c3RlbXMpOworfQorCitJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZTo6fkludGVycnVwdGFibGVTZW5zb3JCYXNlKCkKK3sKKworfQorCisvKioKKyogUmVxdWVzdCBvbmUgb2YgdGhlIDggaW50ZXJydXB0cyBhc3luY2hyb25vdXNseSBvbiB0aGlzIGRpZ2l0YWwgaW5wdXQuCisqIFJlcXVlc3QgaW50ZXJydXB0cyBpbiBhc3luY2hyb25vdXMgbW9kZSB3aGVyZSB0aGUgdXNlcidzIGludGVycnVwdCBoYW5kbGVyIHdpbGwgYmUKKyogY2FsbGVkIHdoZW4gdGhlIGludGVycnVwdCBmaXJlcy4gVXNlcnMgdGhhdCB3YW50IGNvbnRyb2wgb3ZlciB0aGUgdGhyZWFkIHByaW9yaXR5CisqIHNob3VsZCB1c2UgdGhlIHN5bmNocm9ub3VzIG1ldGhvZCB3aXRoIHRoZWlyIG93biBzcGF3bmVkIHRocmVhZC4KKyogVGhlIGRlZmF1bHQgaXMgaW50ZXJydXB0IG9uIHJpc2luZyBlZGdlcyBvbmx5LgorKi8KK3ZvaWQgSW50ZXJydXB0YWJsZVNlbnNvckJhc2U6OlJlcXVlc3RJbnRlcnJ1cHRzKEludGVycnVwdEhhbmRsZXJGdW5jdGlvbiBoYW5kbGVyLCB2b2lkICpwYXJhbSkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisJdWludDMyX3QgaW5kZXggPSBtX2ludGVycnVwdHMtPkFsbG9jYXRlKCJBc3luYyBJbnRlcnJ1cHQiKTsKKwlpZiAoaW5kZXggPT0gfjB1bCkKKwl7CisJCUNsb25lRXJyb3IobV9pbnRlcnJ1cHRzKTsKKwkJcmV0dXJuOworCX0KKwltX2ludGVycnVwdEluZGV4ID0gaW5kZXg7CisKKwkvLyBDcmVhdGVzIGEgbWFuYWdlciB0b28KKwlBbGxvY2F0ZUludGVycnVwdHMoZmFsc2UpOworCisJaW50MzJfdCBzdGF0dXMgPSAwOworCXJlcXVlc3RJbnRlcnJ1cHRzKG1faW50ZXJydXB0LCBHZXRNb2R1bGVGb3JSb3V0aW5nKCksIEdldENoYW5uZWxGb3JSb3V0aW5nKCksCisJCQkJCUdldEFuYWxvZ1RyaWdnZXJGb3JSb3V0aW5nKCksICZzdGF0dXMpOworCVNldFVwU291cmNlRWRnZSh0cnVlLCBmYWxzZSk7CisJYXR0YWNoSW50ZXJydXB0SGFuZGxlcihtX2ludGVycnVwdCwgaGFuZGxlciwgcGFyYW0sICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyogUmVxdWVzdCBvbmUgb2YgdGhlIDggaW50ZXJydXB0cyBzeW5jaHJvbm91c2x5IG9uIHRoaXMgZGlnaXRhbCBpbnB1dC4KKyogUmVxdWVzdCBpbnRlcnJ1cHRzIGluIHN5bmNocm9ub3VzIG1vZGUgd2hlcmUgdGhlIHVzZXIgcHJvZ3JhbSB3aWxsIGhhdmUgdG8gZXhwbGljaXRseQorKiB3YWl0IGZvciB0aGUgaW50ZXJydXB0IHRvIG9jY3VyIHVzaW5nIFdhaXRGb3JJbnRlcnJ1cHQuCisqIFRoZSBkZWZhdWx0IGlzIGludGVycnVwdCBvbiByaXNpbmcgZWRnZXMgb25seS4KKyovCit2b2lkIEludGVycnVwdGFibGVTZW5zb3JCYXNlOjpSZXF1ZXN0SW50ZXJydXB0cygpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCXVpbnQzMl90IGluZGV4ID0gbV9pbnRlcnJ1cHRzLT5BbGxvY2F0ZSgiU3luYyBJbnRlcnJ1cHQiKTsKKwlpZiAoaW5kZXggPT0gfjB1bCkKKwl7CisJCUNsb25lRXJyb3IobV9pbnRlcnJ1cHRzKTsKKwkJcmV0dXJuOworCX0KKwltX2ludGVycnVwdEluZGV4ID0gaW5kZXg7CisKKwlBbGxvY2F0ZUludGVycnVwdHModHJ1ZSk7CisKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJcmVxdWVzdEludGVycnVwdHMobV9pbnRlcnJ1cHQsIEdldE1vZHVsZUZvclJvdXRpbmcoKSwgR2V0Q2hhbm5lbEZvclJvdXRpbmcoKSwKKwkJCQkJR2V0QW5hbG9nVHJpZ2dlckZvclJvdXRpbmcoKSwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJU2V0VXBTb3VyY2VFZGdlKHRydWUsIGZhbHNlKTsKK30KKwordm9pZCBJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZTo6QWxsb2NhdGVJbnRlcnJ1cHRzKGJvb2wgd2F0Y2hlcikKK3sKKwl3cGlfYXNzZXJ0KG1faW50ZXJydXB0ID09IE5VTEwpOworCS8vIEV4cGVjdHMgdGhlIGNhbGxpbmcgbGVhZiBjbGFzcyB0byBhbGxvY2F0ZSBhbiBpbnRlcnJ1cHQgaW5kZXguCisJaW50MzJfdCBzdGF0dXMgPSAwOworCW1faW50ZXJydXB0ID0gaW5pdGlhbGl6ZUludGVycnVwdHMobV9pbnRlcnJ1cHRJbmRleCwgd2F0Y2hlciwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogQ2FuY2VsIGludGVycnVwdHMgb24gdGhpcyBkZXZpY2UuCisgKiBUaGlzIGRlYWxsb2NhdGVzIGFsbCB0aGUgY2hpcG9iamVjdCBzdHJ1Y3R1cmVzIGFuZCBkaXNhYmxlcyBhbnkgaW50ZXJydXB0cy4KKyAqLwordm9pZCBJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZTo6Q2FuY2VsSW50ZXJydXB0cygpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCXdwaV9hc3NlcnQobV9pbnRlcnJ1cHQgIT0gTlVMTCk7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCWNsZWFuSW50ZXJydXB0cyhtX2ludGVycnVwdCwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJbV9pbnRlcnJ1cHQgPSBOVUxMOworCW1faW50ZXJydXB0cy0+RnJlZShtX2ludGVycnVwdEluZGV4KTsKK30KKworLyoqCisgKiBJbiBzeW5jaHJvbm91cyBtb2RlLCB3YWl0IGZvciB0aGUgZGVmaW5lZCBpbnRlcnJ1cHQgdG8gb2NjdXIuIFlvdSBzaG91bGQgPGI+Tk9UPC9iPiBhdHRlbXB0IHRvIHJlYWQgdGhlCisgKiBzZW5zb3IgZnJvbSBhbm90aGVyIHRocmVhZCB3aGlsZSB3YWl0aW5nIGZvciBhbiBpbnRlcnJ1cHQuIFRoaXMgaXMgbm90IHRocmVhZHNhZmUsIGFuZCBjYW4gY2F1c2UgCisgKiBtZW1vcnkgY29ycnVwdGlvbgorICogQHBhcmFtIHRpbWVvdXQgVGltZW91dCBpbiBzZWNvbmRzCisgKiBAcGFyYW0gaWdub3JlUHJldmlvdXMgSWYgdHJ1ZSwgaWdub3JlIGludGVycnVwdHMgdGhhdCBoYXBwZW5lZCBiZWZvcmUKKyAqIFdhaXRGb3JJbnRlcnJ1cHQgd2FzIGNhbGxlZC4KKyAqIEByZXR1cm4gV2hhdCBpbnRlcnJ1cHRzIGZpcmVkCisgKi8KK0ludGVycnVwdGFibGVTZW5zb3JCYXNlOjpXYWl0UmVzdWx0IEludGVycnVwdGFibGVTZW5zb3JCYXNlOjpXYWl0Rm9ySW50ZXJydXB0KGZsb2F0IHRpbWVvdXQsIGJvb2wgaWdub3JlUHJldmlvdXMpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIEludGVycnVwdGFibGVTZW5zb3JCYXNlOjprVGltZW91dDsKKwl3cGlfYXNzZXJ0KG1faW50ZXJydXB0ICE9IE5VTEwpOworCWludDMyX3Qgc3RhdHVzID0gMDsKKwl1aW50MzJfdCByZXN1bHQ7CisKKwlyZXN1bHQgPSB3YWl0Rm9ySW50ZXJydXB0KG1faW50ZXJydXB0LCB0aW1lb3V0LCBpZ25vcmVQcmV2aW91cywgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisKKwlyZXR1cm4gc3RhdGljX2Nhc3Q8V2FpdFJlc3VsdD4ocmVzdWx0KTsKK30KKworLyoqCisgKiBFbmFibGUgaW50ZXJydXB0cyB0byBvY2N1ciBvbiB0aGlzIGlucHV0LgorICogSW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgd2hlbiB0aGUgUmVxdWVzdEludGVycnVwdCBjYWxsIGlzIG1hZGUuIFRoaXMgZ2l2ZXMgdGltZSB0byBkbyB0aGUKKyAqIHNldHVwIG9mIHRoZSBvdGhlciBvcHRpb25zIGJlZm9yZSBzdGFydGluZyB0byBmaWVsZCBpbnRlcnJ1cHRzLgorICovCit2b2lkIEludGVycnVwdGFibGVTZW5zb3JCYXNlOjpFbmFibGVJbnRlcnJ1cHRzKCkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisJd3BpX2Fzc2VydChtX2ludGVycnVwdCAhPSBOVUxMKTsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJZW5hYmxlSW50ZXJydXB0cyhtX2ludGVycnVwdCwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogRGlzYWJsZSBJbnRlcnJ1cHRzIHdpdGhvdXQgd2l0aG91dCBkZWFsbG9jYXRpbmcgc3RydWN0dXJlcy4KKyAqLwordm9pZCBJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZTo6RGlzYWJsZUludGVycnVwdHMoKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKwl3cGlfYXNzZXJ0KG1faW50ZXJydXB0ICE9IE5VTEwpOworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlkaXNhYmxlSW50ZXJydXB0cyhtX2ludGVycnVwdCwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogUmV0dXJuIHRoZSB0aW1lc3RhbXAgZm9yIHRoZSByaXNpbmcgaW50ZXJydXB0IHRoYXQgb2NjdXJyZWQgbW9zdCByZWNlbnRseS4KKyAqIFRoaXMgaXMgaW4gdGhlIHNhbWUgdGltZSBkb21haW4gYXMgR2V0Q2xvY2soKS4KKyAqIFRoZSByaXNpbmctZWRnZSBpbnRlcnJ1cHQgc2hvdWxkIGJlIGVuYWJsZWQgd2l0aAorICoge0BsaW5rICNEaWdpdGFsSW5wdXQuU2V0VXBTb3VyY2VFZGdlfQorICogQHJldHVybiBUaW1lc3RhbXAgaW4gc2Vjb25kcyBzaW5jZSBib290LgorICovCitkb3VibGUgSW50ZXJydXB0YWJsZVNlbnNvckJhc2U6OlJlYWRSaXNpbmdUaW1lc3RhbXAoKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiAwLjA7CisJd3BpX2Fzc2VydChtX2ludGVycnVwdCAhPSBOVUxMKTsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJZG91YmxlIHRpbWVzdGFtcCA9IHJlYWRSaXNpbmdUaW1lc3RhbXAobV9pbnRlcnJ1cHQsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCXJldHVybiB0aW1lc3RhbXA7Cit9CisKKy8qKgorICogUmV0dXJuIHRoZSB0aW1lc3RhbXAgZm9yIHRoZSBmYWxsaW5nIGludGVycnVwdCB0aGF0IG9jY3VycmVkIG1vc3QgcmVjZW50bHkuCisgKiBUaGlzIGlzIGluIHRoZSBzYW1lIHRpbWUgZG9tYWluIGFzIEdldENsb2NrKCkuCisgKiBUaGUgZmFsbGluZy1lZGdlIGludGVycnVwdCBzaG91bGQgYmUgZW5hYmxlZCB3aXRoCisgKiB7QGxpbmsgI0RpZ2l0YWxJbnB1dC5TZXRVcFNvdXJjZUVkZ2V9CisgKiBAcmV0dXJuIFRpbWVzdGFtcCBpbiBzZWNvbmRzIHNpbmNlIGJvb3QuCisqLworZG91YmxlIEludGVycnVwdGFibGVTZW5zb3JCYXNlOjpSZWFkRmFsbGluZ1RpbWVzdGFtcCgpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIDAuMDsKKwl3cGlfYXNzZXJ0KG1faW50ZXJydXB0ICE9IE5VTEwpOworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlkb3VibGUgdGltZXN0YW1wID0gcmVhZEZhbGxpbmdUaW1lc3RhbXAobV9pbnRlcnJ1cHQsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCXJldHVybiB0aW1lc3RhbXA7Cit9CisKKy8qKgorICogU2V0IHdoaWNoIGVkZ2UgdG8gdHJpZ2dlciBpbnRlcnJ1cHRzIG9uCisgKgorICogQHBhcmFtIHJpc2luZ0VkZ2UKKyAqICAgICAgICAgICAgdHJ1ZSB0byBpbnRlcnJ1cHQgb24gcmlzaW5nIGVkZ2UKKyAqIEBwYXJhbSBmYWxsaW5nRWRnZQorICogICAgICAgICAgICB0cnVlIHRvIGludGVycnVwdCBvbiBmYWxsaW5nIGVkZ2UKKyAqLwordm9pZCBJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZTo6U2V0VXBTb3VyY2VFZGdlKGJvb2wgcmlzaW5nRWRnZSwgYm9vbCBmYWxsaW5nRWRnZSkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisJaWYgKG1faW50ZXJydXB0ID09IE5VTEwpCisJeworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChOdWxsUGFyYW1ldGVyLCAiWW91IG11c3QgY2FsbCBSZXF1ZXN0SW50ZXJydXB0cyBiZWZvcmUgU2V0VXBTb3VyY2VFZGdlIik7CisJCXJldHVybjsKKwl9CisJaWYgKG1faW50ZXJydXB0ICE9IE5VTEwpCisJeworCQlpbnQzMl90IHN0YXR1cyA9IDA7CisJCXNldEludGVycnVwdFVwU291cmNlRWRnZShtX2ludGVycnVwdCwgcmlzaW5nRWRnZSwgZmFsbGluZ0VkZ2UsICZzdGF0dXMpOworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0phZ3Vhci5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0phZ3Vhci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJjOWFlMgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvSmFndWFyLmNwcApAQCAtMCwwICsxLDg2IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworI2luY2x1ZGUgIkphZ3Vhci5oIgorLy8jaW5jbHVkZSAiTmV0d29ya0NvbW11bmljYXRpb24vVXNhZ2VSZXBvcnRpbmcuaCIKKworLyoqCisgKiBDb21tb24gaW5pdGlhbGl6YXRpb24gY29kZSBjYWxsZWQgYnkgYWxsIGNvbnN0cnVjdG9ycy4KKyAqLwordm9pZCBKYWd1YXI6OkluaXRKYWd1YXIoKQoreworCS8qKgorCSAqIElucHV0IHByb2ZpbGUgZGVmaW5lZCBieSBMdW1pbmFyeSBNaWNyby4KKwkgKgorCSAqIEZ1bGwgcmV2ZXJzZSByYW5nZXMgZnJvbSAwLjY3MTMyNW1zIHRvIDAuNjk3MjIxMW1zCisJICogUHJvcG9ydGlvbmFsIHJldmVyc2UgcmFuZ2VzIGZyb20gMC42OTcyMjExbXMgdG8gMS40NDgyMDc4bXMKKwkgKiBOZXV0cmFsIHJhbmdlcyBmcm9tIDEuNDQ4MjA3OG1zIHRvIDEuNTUxNzkyMm1zCisJICogUHJvcG9ydGlvbmFsIGZvcndhcmQgcmFuZ2VzIGZyb20gMS41NTE3OTIybXMgdG8gMi4zMDI3Nzg5bXMKKwkgKiBGdWxsIGZvcndhcmQgcmFuZ2VzIGZyb20gMi4zMDI3Nzg5bXMgdG8gMi4zMjg2NzVtcworCSAqLworCVNldEJvdW5kcygyLjMxLCAxLjU1LCAxLjUwNywgMS40NTQsIC42OTcpOworCVNldFBlcmlvZE11bHRpcGxpZXIoa1BlcmlvZE11bHRpcGxpZXJfMVgpOworCVNldFJhdyhtX2NlbnRlclB3bSk7CisJU2V0WmVyb0xhdGNoKCk7CisKKwlIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfSmFndWFyLCBHZXRDaGFubmVsKCkpOworfQorCisvKioKKyAqIENvbnN0cnVjdG9yIGZvciBhIEphZ3VhciBjb25uZWN0ZWQgdmlhIFBXTQorICogQHBhcmFtIGNoYW5uZWwgVGhlIFBXTSBjaGFubmVsIHRoYXQgdGhlIEphZ3VhciBpcyBhdHRhY2hlZCB0by4gMC05IGFyZSBvbi1ib2FyZCwgMTAtMTkgYXJlIG9uIHRoZSBNWFAgcG9ydAorICovCitKYWd1YXI6OkphZ3Vhcih1aW50MzJfdCBjaGFubmVsKSA6IFNhZmVQV00oY2hhbm5lbCkKK3sKKwlJbml0SmFndWFyKCk7Cit9CisKK0phZ3Vhcjo6fkphZ3VhcigpCit7Cit9CisKKy8qKgorICogU2V0IHRoZSBQV00gdmFsdWUuCisgKgorICogVGhlIFBXTSB2YWx1ZSBpcyBzZXQgdXNpbmcgYSByYW5nZSBvZiAtMS4wIHRvIDEuMCwgYXBwcm9wcmlhdGVseQorICogc2NhbGluZyB0aGUgdmFsdWUgZm9yIHRoZSBGUEdBLgorICoKKyAqIEBwYXJhbSBzcGVlZCBUaGUgc3BlZWQgdmFsdWUgYmV0d2VlbiAtMS4wIGFuZCAxLjAgdG8gc2V0LgorICogQHBhcmFtIHN5bmNHcm91cCBVbnVzZWQgaW50ZXJmYWNlLgorICovCit2b2lkIEphZ3Vhcjo6U2V0KGZsb2F0IHNwZWVkLCB1aW50OF90IHN5bmNHcm91cCkKK3sKKwlTZXRTcGVlZChzcGVlZCk7Cit9CisKKy8qKgorICogR2V0IHRoZSByZWNlbnRseSBzZXQgdmFsdWUgb2YgdGhlIFBXTS4KKyAqCisgKiBAcmV0dXJuIFRoZSBtb3N0IHJlY2VudGx5IHNldCB2YWx1ZSBmb3IgdGhlIFBXTSBiZXR3ZWVuIC0xLjAgYW5kIDEuMC4KKyAqLworZmxvYXQgSmFndWFyOjpHZXQoKQoreworCXJldHVybiBHZXRTcGVlZCgpOworfQorCisvKioKKyAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIGRpc2FibGluZyBhIG1vdG9yLgorICovCit2b2lkIEphZ3Vhcjo6RGlzYWJsZSgpCit7CisJU2V0UmF3KGtQd21EaXNhYmxlZCk7Cit9CisKKy8qKgorICogV3JpdGUgb3V0IHRoZSBQSUQgdmFsdWUgYXMgc2VlbiBpbiB0aGUgUElET3V0cHV0IGJhc2Ugb2JqZWN0LgorICoKKyAqIEBwYXJhbSBvdXRwdXQgV3JpdGUgb3V0IHRoZSBQV00gdmFsdWUgYXMgd2FzIGZvdW5kIGluIHRoZSBQSURDb250cm9sbGVyCisgKi8KK3ZvaWQgSmFndWFyOjpQSURXcml0ZShmbG9hdCBvdXRwdXQpCit7CisJU2V0KG91dHB1dCk7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0pveXN0aWNrLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvSm95c3RpY2suY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MGYwZDcKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0pveXN0aWNrLmNwcApAQCAtMCwwICsxLDM4OSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiSm95c3RpY2suaCIKKyNpbmNsdWRlICJEcml2ZXJTdGF0aW9uLmgiCisvLyNpbmNsdWRlICJOZXR3b3JrQ29tbXVuaWNhdGlvbi9Vc2FnZVJlcG9ydGluZy5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorI2luY2x1ZGUgPG1hdGguaD4KKworY29uc3QgdWludDMyX3QgSm95c3RpY2s6OmtEZWZhdWx0WEF4aXM7Citjb25zdCB1aW50MzJfdCBKb3lzdGljazo6a0RlZmF1bHRZQXhpczsKK2NvbnN0IHVpbnQzMl90IEpveXN0aWNrOjprRGVmYXVsdFpBeGlzOworY29uc3QgdWludDMyX3QgSm95c3RpY2s6OmtEZWZhdWx0VHdpc3RBeGlzOworY29uc3QgdWludDMyX3QgSm95c3RpY2s6OmtEZWZhdWx0VGhyb3R0bGVBeGlzOworY29uc3QgdWludDMyX3QgSm95c3RpY2s6OmtEZWZhdWx0VHJpZ2dlckJ1dHRvbjsKK2NvbnN0IHVpbnQzMl90IEpveXN0aWNrOjprRGVmYXVsdFRvcEJ1dHRvbjsKK3N0YXRpYyBKb3lzdGljayAqam95c3RpY2tzW0RyaXZlclN0YXRpb246OmtKb3lzdGlja1BvcnRzXTsKK3N0YXRpYyBib29sIGpveVN0aWNrc0luaXRpYWxpemVkID0gZmFsc2U7CisKKy8qKgorICogQ29uc3RydWN0IGFuIGluc3RhbmNlIG9mIGEgam95c3RpY2suCisgKiBUaGUgam95c3RpY2sgaW5kZXggaXMgdGhlIHVzYiBwb3J0IG9uIHRoZSBkcml2ZXJzIHN0YXRpb24uCisgKgorICogQHBhcmFtIHBvcnQgVGhlIHBvcnQgb24gdGhlIGRyaXZlciBzdGF0aW9uIHRoYXQgdGhlIGpveXN0aWNrIGlzIHBsdWdnZWQgaW50byAoMC01KS4KKyAqLworSm95c3RpY2s6OkpveXN0aWNrKHVpbnQzMl90IHBvcnQpCisJOiBtX2RzIChOVUxMKQorCSwgbV9wb3J0IChwb3J0KQorCSwgbV9heGVzIChOVUxMKQorCSwgbV9idXR0b25zIChOVUxMKQorCSwgbV9vdXRwdXRzICgwKQorCSwgbV9sZWZ0UnVtYmxlICgwKQorCSwgbV9yaWdodFJ1bWJsZSAoMCkKK3sKKwlJbml0Sm95c3RpY2soa051bUF4aXNUeXBlcywga051bUJ1dHRvblR5cGVzKTsKKworCW1fYXhlc1trWEF4aXNdID0ga0RlZmF1bHRYQXhpczsKKwltX2F4ZXNba1lBeGlzXSA9IGtEZWZhdWx0WUF4aXM7CisJbV9heGVzW2taQXhpc10gPSBrRGVmYXVsdFpBeGlzOworCW1fYXhlc1trVHdpc3RBeGlzXSA9IGtEZWZhdWx0VHdpc3RBeGlzOworCW1fYXhlc1trVGhyb3R0bGVBeGlzXSA9IGtEZWZhdWx0VGhyb3R0bGVBeGlzOworCisJbV9idXR0b25zW2tUcmlnZ2VyQnV0dG9uXSA9IGtEZWZhdWx0VHJpZ2dlckJ1dHRvbjsKKwltX2J1dHRvbnNba1RvcEJ1dHRvbl0gPSBrRGVmYXVsdFRvcEJ1dHRvbjsKKworCUhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9Kb3lzdGljaywgcG9ydCk7Cit9CisKKy8qKgorICogVmVyc2lvbiBvZiB0aGUgY29uc3RydWN0b3IgdG8gYmUgY2FsbGVkIGJ5IHN1Yi1jbGFzc2VzLgorICoKKyAqIFRoaXMgY29uc3RydWN0b3IgYWxsb3dzIHRoZSBzdWJjbGFzcyB0byBjb25maWd1cmUgdGhlIG51bWJlciBvZiBjb25zdGFudHMKKyAqIGZvciBheGVzIGFuZCBidXR0b25zLgorICoKKyAqIEBwYXJhbSBwb3J0IFRoZSBwb3J0IG9uIHRoZSBkcml2ZXIgc3RhdGlvbiB0aGF0IHRoZSBqb3lzdGljayBpcyBwbHVnZ2VkIGludG8uCisgKiBAcGFyYW0gbnVtQXhpc1R5cGVzIFRoZSBudW1iZXIgb2YgYXhpcyB0eXBlcyBpbiB0aGUgZW51bS4KKyAqIEBwYXJhbSBudW1CdXR0b25UeXBlcyBUaGUgbnVtYmVyIG9mIGJ1dHRvbiB0eXBlcyBpbiB0aGUgZW51bS4KKyAqLworSm95c3RpY2s6OkpveXN0aWNrKHVpbnQzMl90IHBvcnQsIHVpbnQzMl90IG51bUF4aXNUeXBlcywgdWludDMyX3QgbnVtQnV0dG9uVHlwZXMpCisJOiBtX2RzIChOVUxMKQorCSwgbV9wb3J0IChwb3J0KQorCSwgbV9heGVzIChOVUxMKQorCSwgbV9idXR0b25zIChOVUxMKQoreworCUluaXRKb3lzdGljayhudW1BeGlzVHlwZXMsIG51bUJ1dHRvblR5cGVzKTsKK30KKwordm9pZCBKb3lzdGljazo6SW5pdEpveXN0aWNrKHVpbnQzMl90IG51bUF4aXNUeXBlcywgdWludDMyX3QgbnVtQnV0dG9uVHlwZXMpCit7CisJaWYgKCAham95U3RpY2tzSW5pdGlhbGl6ZWQgKQorCXsKKwkJZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IERyaXZlclN0YXRpb246OmtKb3lzdGlja1BvcnRzOyBpKyspCisJCQlqb3lzdGlja3NbaV0gPSBOVUxMOworCQlqb3lTdGlja3NJbml0aWFsaXplZCA9IHRydWU7CisJfQorCWlmIChtX3BvcnQgPj0gRHJpdmVyU3RhdGlvbjo6a0pveXN0aWNrUG9ydHMpIHsKKwkJd3BpX3NldFdQSUVycm9yKEJhZEpveXN0aWNrSW5kZXgpOworCX0gZWxzZSB7CisJCWpveXN0aWNrc1ttX3BvcnRdID0gdGhpczsKKwl9CisKKwltX2RzID0gRHJpdmVyU3RhdGlvbjo6R2V0SW5zdGFuY2UoKTsKKwltX2F4ZXMgPSBuZXcgdWludDMyX3RbbnVtQXhpc1R5cGVzXTsKKwltX2J1dHRvbnMgPSBuZXcgdWludDMyX3RbbnVtQnV0dG9uVHlwZXNdOworfQorCitKb3lzdGljayAqIEpveXN0aWNrOjpHZXRTdGlja0ZvclBvcnQodWludDMyX3QgcG9ydCkKK3sKKwlKb3lzdGljayAqc3RpY2sgPSBqb3lzdGlja3NbcG9ydF07CisJaWYgKHN0aWNrID09IE5VTEwpCisJeworCQlzdGljayA9IG5ldyBKb3lzdGljayhwb3J0KTsKKwkJam95c3RpY2tzW3BvcnRdID0gc3RpY2s7CisJfQorCXJldHVybiBzdGljazsKK30KKworSm95c3RpY2s6On5Kb3lzdGljaygpCit7CisJZGVsZXRlIFtdIG1fYnV0dG9uczsKKwlkZWxldGUgW10gbV9heGVzOworfQorCisvKioKKyAqIEdldCB0aGUgWCB2YWx1ZSBvZiB0aGUgam95c3RpY2suCisgKiBUaGlzIGRlcGVuZHMgb24gdGhlIG1hcHBpbmcgb2YgdGhlIGpveXN0aWNrIGNvbm5lY3RlZCB0byB0aGUgY3VycmVudCBwb3J0LgorICovCitmbG9hdCBKb3lzdGljazo6R2V0WChKb3lzdGlja0hhbmQgaGFuZCkKK3sKKwlyZXR1cm4gR2V0UmF3QXhpcyhtX2F4ZXNba1hBeGlzXSk7Cit9CisKKy8qKgorICogR2V0IHRoZSBZIHZhbHVlIG9mIHRoZSBqb3lzdGljay4KKyAqIFRoaXMgZGVwZW5kcyBvbiB0aGUgbWFwcGluZyBvZiB0aGUgam95c3RpY2sgY29ubmVjdGVkIHRvIHRoZSBjdXJyZW50IHBvcnQuCisgKi8KK2Zsb2F0IEpveXN0aWNrOjpHZXRZKEpveXN0aWNrSGFuZCBoYW5kKQoreworCXJldHVybiBHZXRSYXdBeGlzKG1fYXhlc1trWUF4aXNdKTsKK30KKworLyoqCisgKiBHZXQgdGhlIFogdmFsdWUgb2YgdGhlIGN1cnJlbnQgam95c3RpY2suCisgKiBUaGlzIGRlcGVuZHMgb24gdGhlIG1hcHBpbmcgb2YgdGhlIGpveXN0aWNrIGNvbm5lY3RlZCB0byB0aGUgY3VycmVudCBwb3J0LgorICovCitmbG9hdCBKb3lzdGljazo6R2V0WigpCit7CisJcmV0dXJuIEdldFJhd0F4aXMobV9heGVzW2taQXhpc10pOworfQorCisvKioKKyAqIEdldCB0aGUgdHdpc3QgdmFsdWUgb2YgdGhlIGN1cnJlbnQgam95c3RpY2suCisgKiBUaGlzIGRlcGVuZHMgb24gdGhlIG1hcHBpbmcgb2YgdGhlIGpveXN0aWNrIGNvbm5lY3RlZCB0byB0aGUgY3VycmVudCBwb3J0LgorICovCitmbG9hdCBKb3lzdGljazo6R2V0VHdpc3QoKQoreworCXJldHVybiBHZXRSYXdBeGlzKG1fYXhlc1trVHdpc3RBeGlzXSk7Cit9CisKKy8qKgorICogR2V0IHRoZSB0aHJvdHRsZSB2YWx1ZSBvZiB0aGUgY3VycmVudCBqb3lzdGljay4KKyAqIFRoaXMgZGVwZW5kcyBvbiB0aGUgbWFwcGluZyBvZiB0aGUgam95c3RpY2sgY29ubmVjdGVkIHRvIHRoZSBjdXJyZW50IHBvcnQuCisgKi8KK2Zsb2F0IEpveXN0aWNrOjpHZXRUaHJvdHRsZSgpCit7CisJcmV0dXJuIEdldFJhd0F4aXMobV9heGVzW2tUaHJvdHRsZUF4aXNdKTsKK30KKworLyoqCisgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBheGlzLgorICoKKyAqIEBwYXJhbSBheGlzIFRoZSBheGlzIHRvIHJlYWQsIHN0YXJ0aW5nIGF0IDAuCisgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgYXhpcy4KKyAqLworZmxvYXQgSm95c3RpY2s6OkdldFJhd0F4aXModWludDMyX3QgYXhpcykKK3sKKwlyZXR1cm4gbV9kcy0+R2V0U3RpY2tBeGlzKG1fcG9ydCwgYXhpcyk7Cit9CisKKy8qKgorICogRm9yIHRoZSBjdXJyZW50IGpveXN0aWNrLCByZXR1cm4gdGhlIGF4aXMgZGV0ZXJtaW5lZCBieSB0aGUgYXJndW1lbnQuCisgKgorICogVGhpcyBpcyBmb3IgY2FzZXMgd2hlcmUgdGhlIGpveXN0aWNrIGF4aXMgaXMgcmV0dXJuZWQgcHJvZ3JhbWF0aWNhbGx5LCBvdGhlcndpc2Ugb25lIG9mIHRoZQorICogcHJldmlvdXMgZnVuY3Rpb25zIHdvdWxkIGJlIHByZWZlcmFibGUgKGZvciBleGFtcGxlIEdldFgoKSkuCisgKgorICogQHBhcmFtIGF4aXMgVGhlIGF4aXMgdG8gcmVhZC4KKyAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBheGlzLgorICovCitmbG9hdCBKb3lzdGljazo6R2V0QXhpcyhBeGlzVHlwZSBheGlzKQoreworCXN3aXRjaChheGlzKQorCXsKKwkJY2FzZSBrWEF4aXM6IHJldHVybiB0aGlzLT5HZXRYKCk7CisJCWNhc2Uga1lBeGlzOiByZXR1cm4gdGhpcy0+R2V0WSgpOworCQljYXNlIGtaQXhpczogcmV0dXJuIHRoaXMtPkdldFooKTsKKwkJY2FzZSBrVHdpc3RBeGlzOiByZXR1cm4gdGhpcy0+R2V0VHdpc3QoKTsKKwkJY2FzZSBrVGhyb3R0bGVBeGlzOiByZXR1cm4gdGhpcy0+R2V0VGhyb3R0bGUoKTsKKwkJZGVmYXVsdDoKKwkJCXdwaV9zZXRXUElFcnJvcihCYWRKb3lzdGlja0F4aXMpOworCQkJcmV0dXJuIDAuMDsKKwl9Cit9CisKKy8qKgorICogUmVhZCB0aGUgc3RhdGUgb2YgdGhlIHRyaWdnZXIgb24gdGhlIGpveXN0aWNrLgorICoKKyAqIExvb2sgdXAgd2hpY2ggYnV0dG9uIGhhcyBiZWVuIGFzc2lnbmVkIHRvIHRoZSB0cmlnZ2VyIGFuZCByZWFkIGl0cyBzdGF0ZS4KKyAqCisgKiBAcGFyYW0gaGFuZCBUaGlzIHBhcmFtZXRlciBpcyBpZ25vcmVkIGZvciB0aGUgSm95c3RpY2sgY2xhc3MgYW5kIGlzIG9ubHkgaGVyZSB0byBjb21wbGV0ZSB0aGUgR2VuZXJpY0hJRCBpbnRlcmZhY2UuCisgKiBAcmV0dXJuIFRoZSBzdGF0ZSBvZiB0aGUgdHJpZ2dlci4KKyAqLworYm9vbCBKb3lzdGljazo6R2V0VHJpZ2dlcihKb3lzdGlja0hhbmQgaGFuZCkKK3sKKwlyZXR1cm4gR2V0UmF3QnV0dG9uKG1fYnV0dG9uc1trVHJpZ2dlckJ1dHRvbl0pOworfQorCisvKioKKyAqIFJlYWQgdGhlIHN0YXRlIG9mIHRoZSB0b3AgYnV0dG9uIG9uIHRoZSBqb3lzdGljay4KKyAqCisgKiBMb29rIHVwIHdoaWNoIGJ1dHRvbiBoYXMgYmVlbiBhc3NpZ25lZCB0byB0aGUgdG9wIGFuZCByZWFkIGl0cyBzdGF0ZS4KKyAqCisgKiBAcGFyYW0gaGFuZCBUaGlzIHBhcmFtZXRlciBpcyBpZ25vcmVkIGZvciB0aGUgSm95c3RpY2sgY2xhc3MgYW5kIGlzIG9ubHkgaGVyZSB0byBjb21wbGV0ZSB0aGUgR2VuZXJpY0hJRCBpbnRlcmZhY2UuCisgKiBAcmV0dXJuIFRoZSBzdGF0ZSBvZiB0aGUgdG9wIGJ1dHRvbi4KKyAqLworYm9vbCBKb3lzdGljazo6R2V0VG9wKEpveXN0aWNrSGFuZCBoYW5kKQoreworCXJldHVybiBHZXRSYXdCdXR0b24obV9idXR0b25zW2tUb3BCdXR0b25dKTsKK30KKworLyoqCisgKiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoZSBKb3lzdGljay4KKyAqIFRoaXMgbWV0aG9kIGlzIG9ubHkgaGVyZSB0byBjb21wbGV0ZSB0aGUgR2VuZXJpY0hJRCBpbnRlcmZhY2UuCisgKi8KK2Jvb2wgSm95c3RpY2s6OkdldEJ1bXBlcihKb3lzdGlja0hhbmQgaGFuZCkKK3sKKwkvLyBKb3lzdGlja3MgZG9uJ3QgaGF2ZSBidW1wZXJzLgorCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBHZXQgdGhlIGJ1dHRvbiB2YWx1ZSAoc3RhcnRpbmcgYXQgYnV0dG9uIDEpCisgKgorICogVGhlIGJ1dHRvbnMgYXJlIHJldHVybmVkIGluIGEgc2luZ2xlIDE2IGJpdCB2YWx1ZSB3aXRoIG9uZSBiaXQgcmVwcmVzZW50aW5nIHRoZSBzdGF0ZQorICogb2YgZWFjaCBidXR0b24uIFRoZSBhcHByb3ByaWF0ZSBidXR0b24gaXMgcmV0dXJuZWQgYXMgYSBib29sZWFuIHZhbHVlLgorICoKKyAqIEBwYXJhbSBidXR0b24gVGhlIGJ1dHRvbiBudW1iZXIgdG8gYmUgcmVhZCAoc3RhcnRpbmcgYXQgMSkKKyAqIEByZXR1cm4gVGhlIHN0YXRlIG9mIHRoZSBidXR0b24uCisgKiovCitib29sIEpveXN0aWNrOjpHZXRSYXdCdXR0b24odWludDMyX3QgYnV0dG9uKQoreworCXJldHVybiBtX2RzLT5HZXRTdGlja0J1dHRvbihtX3BvcnQsIGJ1dHRvbik7Cit9CisKKy8qKgorICogR2V0IHRoZSBzdGF0ZSBvZiBhIFBPViBvbiB0aGUgam95c3RpY2suCisgKgorICogQHBhcmFtIHBvdiBUaGUgaW5kZXggb2YgdGhlIFBPViB0byByZWFkIChzdGFydGluZyBhdCAwKQorICogQHJldHVybiB0aGUgYW5nbGUgb2YgdGhlIFBPViBpbiBkZWdyZWVzLCBvciAtMSBpZiB0aGUgUE9WIGlzIG5vdCBwcmVzc2VkLgorICovCitpbnQgSm95c3RpY2s6OkdldFBPVih1aW50MzJfdCBwb3YpIHsKKwlyZXR1cm4gbV9kcy0+R2V0U3RpY2tQT1YobV9wb3J0LCBwb3YpOworfQorCisvKioKKyAqIEdldCBidXR0b25zIGJhc2VkIG9uIGFuIGVudW1lcmF0ZWQgdHlwZS4KKyAqCisgKiBUaGUgYnV0dG9uIHR5cGUgd2lsbCBiZSBsb29rZWQgdXAgaW4gdGhlIGxpc3Qgb2YgYnV0dG9ucyBhbmQgdGhlbiByZWFkLgorICoKKyAqIEBwYXJhbSBidXR0b24gVGhlIHR5cGUgb2YgYnV0dG9uIHRvIHJlYWQuCisgKiBAcmV0dXJuIFRoZSBzdGF0ZSBvZiB0aGUgYnV0dG9uLgorICovCitib29sIEpveXN0aWNrOjpHZXRCdXR0b24oQnV0dG9uVHlwZSBidXR0b24pCit7CisJc3dpdGNoIChidXR0b24pCisJeworCWNhc2Uga1RyaWdnZXJCdXR0b246IHJldHVybiBHZXRUcmlnZ2VyKCk7CisJY2FzZSBrVG9wQnV0dG9uOiByZXR1cm4gR2V0VG9wKCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKworLyoqCisgKiBHZXQgdGhlIG51bWJlciBvZiBheGlzIGZvciBhIGpveXN0aWNrCisgKgorICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGF4aXMgZm9yIHRoZSBjdXJyZW50IGpveXN0aWNrCisgKi8KK2ludCBKb3lzdGljazo6R2V0QXhpc0NvdW50KCkKK3sKKyAgICByZXR1cm4gbV9kcy0+R2V0U3RpY2tBeGlzQ291bnQobV9wb3J0KTsKK30KKworLyoqCisgICogR2V0IHRoZSBudW1iZXIgb2YgYXhpcyBmb3IgYSBqb3lzdGljaworICAqCisqIEByZXR1cm4gdGhlIG51bWJlciBvZiBidXR0b25zIG9uIHRoZSBjdXJyZW50IGpveXN0aWNrCisgKi8KK2ludCBKb3lzdGljazo6R2V0QnV0dG9uQ291bnQoKQoreworICAgIHJldHVybiBtX2RzLT5HZXRTdGlja0J1dHRvbkNvdW50KG1fcG9ydCk7Cit9CisKKy8qKgorICogR2V0IHRoZSBudW1iZXIgb2YgYXhpcyBmb3IgYSBqb3lzdGljaworICoKKyAqIEByZXR1cm4gdGhlbiB1bWJlciBvZiBQT1ZzIGZvciB0aGUgY3VycmVudCBqb3lzdGljaworICovCitpbnQgSm95c3RpY2s6OkdldFBPVkNvdW50KCkKK3sKKyAgICByZXR1cm4gbV9kcy0+R2V0U3RpY2tQT1ZDb3VudChtX3BvcnQpOworfQorCisKKy8qKgorICogR2V0IHRoZSBjaGFubmVsIGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBheGlzLgorICoKKyAqIEBwYXJhbSBheGlzIFRoZSBheGlzIHRvIGxvb2sgdXAgdGhlIGNoYW5uZWwgZm9yLgorICogQHJldHVybiBUaGUgY2hhbm5lbCBmciB0aGUgYXhpcy4KKyAqLwordWludDMyX3QgSm95c3RpY2s6OkdldEF4aXNDaGFubmVsKEF4aXNUeXBlIGF4aXMpCit7CisJcmV0dXJuIG1fYXhlc1theGlzXTsKK30KKworLyoqCisgKiBTZXQgdGhlIGNoYW5uZWwgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWVkIGF4aXMuCisgKgorICogQHBhcmFtIGF4aXMgVGhlIGF4aXMgdG8gc2V0IHRoZSBjaGFubmVsIGZvci4KKyAqIEBwYXJhbSBjaGFubmVsIFRoZSBjaGFubmVsIHRvIHNldCB0aGUgYXhpcyB0by4KKyAqLwordm9pZCBKb3lzdGljazo6U2V0QXhpc0NoYW5uZWwoQXhpc1R5cGUgYXhpcywgdWludDMyX3QgY2hhbm5lbCkKK3sKKwltX2F4ZXNbYXhpc10gPSBjaGFubmVsOworfQorCisvKioKKyAqIEdldCB0aGUgbWFnbml0dWRlIG9mIHRoZSBkaXJlY3Rpb24gdmVjdG9yIGZvcm1lZCBieSB0aGUgam95c3RpY2sncworICogY3VycmVudCBwb3NpdGlvbiByZWxhdGl2ZSB0byBpdHMgb3JpZ2luCisgKgorICogQHJldHVybiBUaGUgbWFnbml0dWRlIG9mIHRoZSBkaXJlY3Rpb24gdmVjdG9yCisgKi8KK2Zsb2F0IEpveXN0aWNrOjpHZXRNYWduaXR1ZGUoKXsKKwlyZXR1cm4gc3FydChwb3coR2V0WCgpLDIpICsgcG93KEdldFkoKSwyKSApOworfQorCisvKioKKyAqIEdldCB0aGUgZGlyZWN0aW9uIG9mIHRoZSB2ZWN0b3IgZm9ybWVkIGJ5IHRoZSBqb3lzdGljayBhbmQgaXRzIG9yaWdpbgorICogaW4gcmFkaWFucworICoKKyAqIEByZXR1cm4gVGhlIGRpcmVjdGlvbiBvZiB0aGUgdmVjdG9yIGluIHJhZGlhbnMKKyAqLworZmxvYXQgSm95c3RpY2s6OkdldERpcmVjdGlvblJhZGlhbnMoKXsKKwlyZXR1cm4gYXRhbjIoR2V0WCgpLCAtR2V0WSgpKTsKK30KKworLyoqCisgKiBHZXQgdGhlIGRpcmVjdGlvbiBvZiB0aGUgdmVjdG9yIGZvcm1lZCBieSB0aGUgam95c3RpY2sgYW5kIGl0cyBvcmlnaW4KKyAqIGluIGRlZ3JlZXMKKyAqCisgKiB1c2VzIGFjb3MoLTEpIHRvIHJlcHJlc2VudCBQaSBkdWUgdG8gYWJzZW5jZSBvZiByZWFkaWx5IGFjY2Vzc2libGUgUGkKKyAqIGNvbnN0YW50IGluIEMrKworICoKKyAqIEByZXR1cm4gVGhlIGRpcmVjdGlvbiBvZiB0aGUgdmVjdG9yIGluIGRlZ3JlZXMKKyAqLworZmxvYXQgSm95c3RpY2s6OkdldERpcmVjdGlvbkRlZ3JlZXMoKXsKKwlyZXR1cm4gKDE4MC9hY29zKC0xKSkqR2V0RGlyZWN0aW9uUmFkaWFucygpOworfQorCisvKioKKyAqIFNldCB0aGUgcnVtYmxlIG91dHB1dCBmb3IgdGhlIGpveXN0aWNrLiBUaGUgRFMgY3VycmVudGx5IHN1cHBvcnRzIDIgcnVtYmxlIHZhbHVlcywKKyAqIGxlZnQgcnVtYmxlIGFuZCByaWdodCBydW1ibGUKKyAqIEBwYXJhbSB0eXBlIFdoaWNoIHJ1bWJsZSB2YWx1ZSB0byBzZXQKKyAqIEBwYXJhbSB2YWx1ZSBUaGUgbm9ybWFsaXplZCB2YWx1ZSAoMCB0byAxKSB0byBzZXQgdGhlIHJ1bWJsZSB0bworICovCit2b2lkIEpveXN0aWNrOjpTZXRSdW1ibGUoUnVtYmxlVHlwZSB0eXBlLCBmbG9hdCB2YWx1ZSkgeworCWlmICh2YWx1ZSA8IDApCisJCXZhbHVlID0gMDsKKwllbHNlIGlmICh2YWx1ZSA+IDEpCisJCXZhbHVlID0gMTsKKwlpZiAodHlwZSA9PSBrTGVmdFJ1bWJsZSkKKwkJbV9sZWZ0UnVtYmxlID0gdmFsdWUqNjU1MzU7CisJZWxzZQorCQltX3JpZ2h0UnVtYmxlID0gdmFsdWUqNjU1MzU7CisJSEFMU2V0Sm95c3RpY2tPdXRwdXRzKG1fcG9ydCwgbV9vdXRwdXRzLCBtX2xlZnRSdW1ibGUsIG1fcmlnaHRSdW1ibGUpOworfQorCisvKioKKyAqIFNldCBhIHNpbmdsZSBISUQgb3V0cHV0IHZhbHVlIGZvciB0aGUgam95c3RpY2suCisgKiBAcGFyYW0gb3V0cHV0TnVtYmVyIFRoZSBpbmRleCBvZiB0aGUgb3V0cHV0IHRvIHNldCAoMS0zMikKKyAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0IHRoZSBvdXRwdXQgdG8KKyAqLworCQordm9pZCBKb3lzdGljazo6U2V0T3V0cHV0KHVpbnQ4X3Qgb3V0cHV0TnVtYmVyLCBib29sIHZhbHVlKSB7CisJbV9vdXRwdXRzID0gKG1fb3V0cHV0cyAmIH4oMSA8PCAob3V0cHV0TnVtYmVyLTEpKSkgfCAodmFsdWUgPDwgKG91dHB1dE51bWJlci0xKSk7CisKKwlIQUxTZXRKb3lzdGlja091dHB1dHMobV9wb3J0LCBtX291dHB1dHMsIG1fbGVmdFJ1bWJsZSwgbV9yaWdodFJ1bWJsZSk7Cit9CisKKy8qKgorICogU2V0IGFsbCBISUQgb3V0cHV0IHZhbHVlcyBmb3IgdGhlIGpveXN0aWNrLgorICogQHBhcmFtIHZhbHVlIFRoZSAzMiBiaXQgb3V0cHV0IHZhbHVlICgxIGJpdCBmb3IgZWFjaCBvdXRwdXQpCisgKi8KK3ZvaWQgSm95c3RpY2s6OlNldE91dHB1dHModWludDMyX3QgdmFsdWUpIHsKKwltX291dHB1dHMgPSB2YWx1ZTsKKwlIQUxTZXRKb3lzdGlja091dHB1dHMobV9wb3J0LCBtX291dHB1dHMsIG1fbGVmdFJ1bWJsZSwgbV9yaWdodFJ1bWJsZSk7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL01vdG9yU2FmZXR5SGVscGVyLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvTW90b3JTYWZldHlIZWxwZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYjdmNDgKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL01vdG9yU2FmZXR5SGVscGVyLmNwcApAQCAtMCwwICsxLDE1NiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiTW90b3JTYWZldHlIZWxwZXIuaCIKKworI2luY2x1ZGUgIkRyaXZlclN0YXRpb24uaCIKKyNpbmNsdWRlICJNb3RvclNhZmV0eS5oIgorI2luY2x1ZGUgIlRpbWVyLmgiCisjaW5jbHVkZSAiV1BJRXJyb3JzLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCitNb3RvclNhZmV0eUhlbHBlciAqTW90b3JTYWZldHlIZWxwZXI6Om1faGVhZEhlbHBlciA9IE5VTEw7CitSZWVudHJhbnRNdXRleCBNb3RvclNhZmV0eUhlbHBlcjo6bV9saXN0TXV0ZXg7CisKKy8qKgorICogVGhlIGNvbnN0cnVjdG9yIGZvciBhIE1vdG9yU2FmZXR5SGVscGVyIG9iamVjdC4KKyAqIFRoZSBoZWxwZXIgb2JqZWN0IGlzIGNvbnN0cnVjdGVkIGZvciBldmVyeSBvYmplY3QgdGhhdCB3YW50cyB0byBpbXBsZW1lbnQgdGhlIE1vdG9yCisgKiBTYWZldHkgcHJvdG9jb2wuIFRoZSBoZWxwZXIgb2JqZWN0IGhhcyB0aGUgY29kZSB0byBhY3R1YWxseSBkbyB0aGUgdGltaW5nIGFuZCBjYWxsIHRoZQorICogbW90b3JzIFN0b3AoKSBtZXRob2Qgd2hlbiB0aGUgdGltZW91dCBleHBpcmVzLiBUaGUgbW90b3Igb2JqZWN0IGlzIGV4cGVjdGVkIHRvIGNhbGwgdGhlCisgKiBGZWVkKCkgbWV0aG9kIHdoZW5ldmVyIHRoZSBtb3RvcnMgdmFsdWUgaXMgdXBkYXRlZC4KKyAqIEBwYXJhbSBzYWZlT2JqZWN0IGEgcG9pbnRlciB0byB0aGUgbW90b3Igb2JqZWN0IGltcGxlbWVudGluZyBNb3RvclNhZmV0eS4gVGhpcyBpcyB1c2VkCisgKiB0byBjYWxsIHRoZSBTdG9wKCkgbWV0aG9kIG9uIHRoZSBtb3Rvci4KKyAqLworTW90b3JTYWZldHlIZWxwZXI6Ok1vdG9yU2FmZXR5SGVscGVyKE1vdG9yU2FmZXR5ICpzYWZlT2JqZWN0KQoreworCW1fc2FmZU9iamVjdCA9IHNhZmVPYmplY3Q7CisJbV9lbmFibGVkID0gZmFsc2U7CisJbV9leHBpcmF0aW9uID0gREVGQVVMVF9TQUZFVFlfRVhQSVJBVElPTjsKKwltX3N0b3BUaW1lID0gVGltZXI6OkdldEZQR0FUaW1lc3RhbXAoKTsKKworCTo6c3RkOjp1bmlxdWVfbG9jazxSZWVudHJhbnRNdXRleD4gc3luYyhtX2xpc3RNdXRleCk7CisJbV9uZXh0SGVscGVyID0gbV9oZWFkSGVscGVyOworCW1faGVhZEhlbHBlciA9IHRoaXM7Cit9CisKKworTW90b3JTYWZldHlIZWxwZXI6On5Nb3RvclNhZmV0eUhlbHBlcigpCit7CisJOjpzdGQ6OnVuaXF1ZV9sb2NrPFJlZW50cmFudE11dGV4PiBzeW5jKG1fbGlzdE11dGV4KTsKKwlpZiAobV9oZWFkSGVscGVyID09IHRoaXMpCisJeworCQltX2hlYWRIZWxwZXIgPSBtX25leHRIZWxwZXI7CisJfQorCWVsc2UKKwl7CisJCU1vdG9yU2FmZXR5SGVscGVyICpwcmV2ID0gTlVMTDsKKwkJTW90b3JTYWZldHlIZWxwZXIgKmN1ciA9IG1faGVhZEhlbHBlcjsKKwkJd2hpbGUgKGN1ciAhPSB0aGlzICYmIGN1ciAhPSBOVUxMKQorCQkJcHJldiA9IGN1ciwgY3VyID0gY3VyLT5tX25leHRIZWxwZXI7CisJCWlmIChjdXIgPT0gdGhpcykKKwkJCXByZXYtPm1fbmV4dEhlbHBlciA9IGN1ci0+bV9uZXh0SGVscGVyOworCX0KK30KKworLyoqCisgKiBGZWVkIHRoZSBtb3RvciBzYWZldHkgb2JqZWN0LgorICogUmVzZXRzIHRoZSB0aW1lciBvbiB0aGlzIG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gZG8gdGhlIHRpbWVvdXRzLgorICovCit2b2lkIE1vdG9yU2FmZXR5SGVscGVyOjpGZWVkKCkKK3sKKwk6OnN0ZDo6dW5pcXVlX2xvY2s8UmVlbnRyYW50TXV0ZXg+IHN5bmMobV9zeW5jTXV0ZXgpOworCW1fc3RvcFRpbWUgPSBUaW1lcjo6R2V0RlBHQVRpbWVzdGFtcCgpICsgbV9leHBpcmF0aW9uOworfQorCisvKioKKyAqIFNldCB0aGUgZXhwaXJhdGlvbiB0aW1lIGZvciB0aGUgY29ycmVzcG9uZGluZyBtb3RvciBzYWZldHkgb2JqZWN0LgorICogQHBhcmFtIGV4cGlyYXRpb25UaW1lIFRoZSB0aW1lb3V0IHZhbHVlIGluIHNlY29uZHMuCisgKi8KK3ZvaWQgTW90b3JTYWZldHlIZWxwZXI6OlNldEV4cGlyYXRpb24oZmxvYXQgZXhwaXJhdGlvblRpbWUpCit7CisJOjpzdGQ6OnVuaXF1ZV9sb2NrPFJlZW50cmFudE11dGV4PiBzeW5jKG1fc3luY011dGV4KTsKKwltX2V4cGlyYXRpb24gPSBleHBpcmF0aW9uVGltZTsKK30KKworLyoqCisgKiBSZXRyaWV2ZSB0aGUgdGltZW91dCB2YWx1ZSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgbW90b3Igc2FmZXR5IG9iamVjdC4KKyAqIEByZXR1cm4gdGhlIHRpbWVvdXQgdmFsdWUgaW4gc2Vjb25kcy4KKyAqLworZmxvYXQgTW90b3JTYWZldHlIZWxwZXI6OkdldEV4cGlyYXRpb24oKQoreworCTo6c3RkOjp1bmlxdWVfbG9jazxSZWVudHJhbnRNdXRleD4gc3luYyhtX3N5bmNNdXRleCk7CisJcmV0dXJuIG1fZXhwaXJhdGlvbjsKK30KKworLyoqCisgKiBEZXRlcm1pbmUgaWYgdGhlIG1vdG9yIGlzIHN0aWxsIG9wZXJhdGluZyBvciBoYXMgdGltZWQgb3V0LgorICogQHJldHVybiBhIHRydWUgdmFsdWUgaWYgdGhlIG1vdG9yIGlzIHN0aWxsIG9wZXJhdGluZyBub3JtYWxseSBhbmQgaGFzbid0IHRpbWVkIG91dC4KKyAqLworYm9vbCBNb3RvclNhZmV0eUhlbHBlcjo6SXNBbGl2ZSgpCit7CisJOjpzdGQ6OnVuaXF1ZV9sb2NrPFJlZW50cmFudE11dGV4PiBzeW5jKG1fc3luY011dGV4KTsKKwlyZXR1cm4gIW1fZW5hYmxlZCB8fCBtX3N0b3BUaW1lID4gVGltZXI6OkdldEZQR0FUaW1lc3RhbXAoKTsKK30KKworLyoqCisgKiBDaGVjayBpZiB0aGlzIG1vdG9yIGhhcyBleGNlZWRlZCBpdHMgdGltZW91dC4KKyAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBwZXJpb2RpY2FsbHkgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgbW90b3IgaGFzIGV4Y2VlZGVkIGl0cyB0aW1lb3V0CisgKiB2YWx1ZS4gSWYgaXQgaGFzLCB0aGUgc3RvcCBtZXRob2QgaXMgY2FsbGVkLCBhbmQgdGhlIG1vdG9yIGlzIHNodXQgZG93biB1bnRpbCBpdHMgdmFsdWUgaXMKKyAqIHVwZGF0ZWQgYWdhaW4uCisgKi8KK3ZvaWQgTW90b3JTYWZldHlIZWxwZXI6OkNoZWNrKCkKK3sKKwlEcml2ZXJTdGF0aW9uICpkcyA9IERyaXZlclN0YXRpb246OkdldEluc3RhbmNlKCk7CisJaWYgKCFtX2VuYWJsZWQgfHwgZHMtPklzRGlzYWJsZWQoKSB8fCBkcy0+SXNUZXN0KCkpIHJldHVybjsKKworCTo6c3RkOjp1bmlxdWVfbG9jazxSZWVudHJhbnRNdXRleD4gc3luYyhtX3N5bmNNdXRleCk7CisJaWYgKG1fc3RvcFRpbWUgPCBUaW1lcjo6R2V0RlBHQVRpbWVzdGFtcCgpKQorCXsKKwkJY2hhciBidWZbMTI4XTsKKwkJY2hhciBkZXNjWzY0XTsKKwkJbV9zYWZlT2JqZWN0LT5HZXREZXNjcmlwdGlvbihkZXNjKTsKKwkJc25wcmludGYoYnVmLCAxMjgsICIlcy4uLiBPdXRwdXQgbm90IHVwZGF0ZWQgb2Z0ZW4gZW5vdWdoLiIsIGRlc2MpOworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChUaW1lb3V0LCBidWYpOworCQltX3NhZmVPYmplY3QtPlN0b3BNb3RvcigpOworCX0KK30KKworLyoqCisgKiBFbmFibGUvZGlzYWJsZSBtb3RvciBzYWZldHkgZm9yIHRoaXMgZGV2aWNlCisgKiBUdXJuIG9uIGFuZCBvZmYgdGhlIG1vdG9yIHNhZmV0eSBvcHRpb24gZm9yIHRoaXMgUFdNIG9iamVjdC4KKyAqIEBwYXJhbSBlbmFibGVkIFRydWUgaWYgbW90b3Igc2FmZXR5IGlzIGVuZm9yY2VkIGZvciB0aGlzIG9iamVjdAorICovCit2b2lkIE1vdG9yU2FmZXR5SGVscGVyOjpTZXRTYWZldHlFbmFibGVkKGJvb2wgZW5hYmxlZCkKK3sKKwk6OnN0ZDo6dW5pcXVlX2xvY2s8UmVlbnRyYW50TXV0ZXg+IHN5bmMobV9zeW5jTXV0ZXgpOworCW1fZW5hYmxlZCA9IGVuYWJsZWQ7Cit9CisKKy8qKgorICogUmV0dXJuIHRoZSBzdGF0ZSBvZiB0aGUgbW90b3Igc2FmZXR5IGVuYWJsZWQgZmxhZworICogUmV0dXJuIGlmIHRoZSBtb3RvciBzYWZldHkgaXMgY3VycmVudGx5IGVuYWJsZWQgZm9yIHRoaXMgZGV2aWNjZS4KKyAqIEByZXR1cm4gVHJ1ZSBpZiBtb3RvciBzYWZldHkgaXMgZW5mb3JjZWQgZm9yIHRoaXMgZGV2aWNlCisgKi8KK2Jvb2wgTW90b3JTYWZldHlIZWxwZXI6OklzU2FmZXR5RW5hYmxlZCgpCit7CisJOjpzdGQ6OnVuaXF1ZV9sb2NrPFJlZW50cmFudE11dGV4PiBzeW5jKG1fc3luY011dGV4KTsKKwlyZXR1cm4gbV9lbmFibGVkOworfQorCisvKioKKyAqIENoZWNrIHRoZSBtb3RvcnMgdG8gc2VlIGlmIGFueSBoYXZlIHRpbWVkIG91dC4KKyAqIFRoaXMgc3RhdGljICBtZXRob2QgaXMgY2FsbGVkIHBlcmlvZGljYWxseSB0byBwb2xsIGFsbCB0aGUgbW90b3JzIGFuZCBzdG9wIGFueSB0aGF0IGhhdmUKKyAqIHRpbWVkIG91dC4KKyAqLwordm9pZCBNb3RvclNhZmV0eUhlbHBlcjo6Q2hlY2tNb3RvcnMoKQoreworCTo6c3RkOjp1bmlxdWVfbG9jazxSZWVudHJhbnRNdXRleD4gc3luYyhtX2xpc3RNdXRleCk7CisJZm9yIChNb3RvclNhZmV0eUhlbHBlciAqbXNoID0gbV9oZWFkSGVscGVyOyBtc2ggIT0gTlVMTDsgbXNoID0gbXNoLT5tX25leHRIZWxwZXIpCisJeworCQltc2gtPkNoZWNrKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9Ob3RpZmllci5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL05vdGlmaWVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGQ2YmY1Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9Ob3RpZmllci5jcHAKQEAgLTAsMCArMSwyNjUgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIk5vdGlmaWVyLmgiCisjaW5jbHVkZSAiVGltZXIuaCIKKyNpbmNsdWRlICJVdGlsaXR5LmgiCisjaW5jbHVkZSAiV1BJRXJyb3JzLmgiCisjaW5jbHVkZSAiSEFML0hBTC5ocHAiCisKK05vdGlmaWVyICpOb3RpZmllcjo6dGltZXJRdWV1ZUhlYWQgPSBOVUxMOworUmVlbnRyYW50TXV0ZXggTm90aWZpZXI6OnF1ZXVlU2VtYXBob3JlOwordm9pZCogTm90aWZpZXI6Om1fbm90aWZpZXIgPSBOVUxMOworaW50IE5vdGlmaWVyOjpyZWZjb3VudCA9IDA7CisKKy8qKgorICogQ3JlYXRlIGEgTm90aWZpZXIgZm9yIHRpbWVyIGV2ZW50IG5vdGlmaWNhdGlvbi4KKyAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIGlzIGNhbGxlZCBhdCB0aGUgbm90aWZpY2F0aW9uIHRpbWUgd2hpY2ggaXMgc2V0CisgKiB1c2luZyBTdGFydFNpbmdsZSBvciBTdGFydFBlcmlvZGljLgorICovCitOb3RpZmllcjo6Tm90aWZpZXIoVGltZXJFdmVudEhhbmRsZXIgaGFuZGxlciwgdm9pZCAqcGFyYW0pCit7CisJaWYgKGhhbmRsZXIgPT0gTlVMTCkKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoTnVsbFBhcmFtZXRlciwgImhhbmRsZXIgbXVzdCBub3QgYmUgTlVMTCIpOworCW1faGFuZGxlciA9IGhhbmRsZXI7CisJbV9wYXJhbSA9IHBhcmFtOworCW1fcGVyaW9kaWMgPSBmYWxzZTsKKwltX2V4cGlyYXRpb25UaW1lID0gMDsKKwltX3BlcmlvZCA9IDA7CisJbV9uZXh0RXZlbnQgPSBOVUxMOworCW1fcXVldWVkID0gZmFsc2U7CisJbV9oYW5kbGVyU2VtYXBob3JlID0gaW5pdGlhbGl6ZVNlbWFwaG9yZShTRU1BUEhPUkVfRlVMTCk7CisJeworCQk6OnN0ZDo6dW5pcXVlX2xvY2s8UmVlbnRyYW50TXV0ZXg+IHN5bmMocXVldWVTZW1hcGhvcmUpOworCQkvLyBkbyB0aGUgZmlyc3QgdGltZSBpbnRpYWxpemF0aW9uIG9mIHN0YXRpYyB2YXJpYWJsZXMKKwkJaWYgKHJlZmNvdW50ID09IDApCisJCXsKKwkJCWludDMyX3Qgc3RhdHVzID0gMDsKKwkJCW1fbm90aWZpZXIgPSBpbml0aWFsaXplTm90aWZpZXIoUHJvY2Vzc1F1ZXVlLCAmc3RhdHVzKTsKKwkJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCQl9CisJCXJlZmNvdW50Kys7CisJfQorfQorCisvKioKKyAqIEZyZWUgdGhlIHJlc291cmNlcyBmb3IgYSB0aW1lciBldmVudC4KKyAqIEFsbCByZXNvdXJjZXMgd2lsbCBiZSBmcmVlZCBhbmQgdGhlIHRpbWVyIGV2ZW50IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZQorICogcXVldWUgaWYgbmVjZXNzYXJ5LgorICovCitOb3RpZmllcjo6fk5vdGlmaWVyKCkKK3sKKwl7CisJCTo6c3RkOjp1bmlxdWVfbG9jazxSZWVudHJhbnRNdXRleD4gc3luYyhxdWV1ZVNlbWFwaG9yZSk7CisJCURlbGV0ZUZyb21RdWV1ZSgpOworCisJCS8vIERlbGV0ZSB0aGUgc3RhdGljIHZhcmlhYmxlcyB3aGVuIHRoZSBsYXN0IG9uZSBpcyBnb2luZyBhd2F5CisJCWlmICghKC0tcmVmY291bnQpKQorCQl7CisJCQlpbnQzMl90IHN0YXR1cyA9IDA7CisJCQljbGVhbk5vdGlmaWVyKG1fbm90aWZpZXIsICZzdGF0dXMpOworCQkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJCX0KKwl9CisKKwkvLyBBY3F1aXJlIHRoZSBzZW1hcGhvcmU7IHRoaXMgbWFrZXMgY2VydGFpbiB0aGF0IHRoZSBoYW5kbGVyIGlzIAorCS8vIG5vdCBiZWluZyBleGVjdXRlZCBieSB0aGUgaW50ZXJydXB0IG1hbmFnZXIuCisJdGFrZVNlbWFwaG9yZShtX2hhbmRsZXJTZW1hcGhvcmUpOworCS8vIERlbGV0ZSB3aGlsZSBob2xkaW5nIHRoZSBzZW1hcGhvcmUgc28gdGhlcmUgY2FuIGJlIG5vIHJhY2UuCisJZGVsZXRlU2VtYXBob3JlKG1faGFuZGxlclNlbWFwaG9yZSk7Cit9CisKKy8qKgorICogVXBkYXRlIHRoZSBhbGFybSBoYXJkd2FyZSB0byByZWZsZWN0IHRoZSBjdXJyZW50IGZpcnN0IGVsZW1lbnQgaW4gdGhlIHF1ZXVlLgorICogQ29tcHV0ZSB0aGUgdGltZSB0aGUgbmV4dCBhbGFybSBzaG91bGQgb2NjdXIgYmFzZWQgb24gdGhlIGN1cnJlbnQgdGltZSBhbmQgdGhlCisgKiBwZXJpb2QgZm9yIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSB0aW1lciBxdWV1ZS4KKyAqIFdBUk5JTkc6IHRoaXMgbWV0aG9kIGRvZXMgbm90IGRvIHN5bmNocm9uaXphdGlvbiEgSXQgbXVzdCBiZSBjYWxsZWQgZnJvbSBzb21ld2hlcmUKKyAqIHRoYXQgaXMgdGFraW5nIGNhcmUgb2Ygc3luY2hyb25pemluZyBhY2Nlc3MgdG8gdGhlIHF1ZXVlLgorICovCit2b2lkIE5vdGlmaWVyOjpVcGRhdGVBbGFybSgpCit7CisJaWYgKHRpbWVyUXVldWVIZWFkICE9IE5VTEwpCisJeworCQlpbnQzMl90IHN0YXR1cyA9IDA7CisJCXVwZGF0ZU5vdGlmaWVyQWxhcm0obV9ub3RpZmllciwgKHVpbnQzMl90KSh0aW1lclF1ZXVlSGVhZC0+bV9leHBpcmF0aW9uVGltZSAqIDFlNiksICZzdGF0dXMpOworCQl3cGlfc2V0U3RhdGljRXJyb3JXaXRoQ29udGV4dCh0aW1lclF1ZXVlSGVhZCwgc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorfQorCisvKioKKyAqIFByb2Nlc3NRdWV1ZSBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlcmUgaXMgYSB0aW1lciBpbnRlcnJ1cHQuCisgKiBXZSBuZWVkIHRvIHdha2UgdXAgYW5kIHByb2Nlc3MgdGhlIGN1cnJlbnQgdG9wIGl0ZW0gaW4gdGhlIHRpbWVyIHF1ZXVlIGFzIGxvbmcKKyAqIGFzIGl0cyBzY2hlZHVsZWQgdGltZSBpcyBhZnRlciB0aGUgY3VycmVudCB0aW1lLiBUaGVuIHRoZSBpdGVtIGlzIHJlbW92ZWQgb3IgCisgKiByZXNjaGVkdWxlZCAocmVwZXRpdGl2ZSBldmVudHMpIGluIHRoZSBxdWV1ZS4KKyAqLwordm9pZCBOb3RpZmllcjo6UHJvY2Vzc1F1ZXVlKHVpbnQzMl90IG1hc2ssIHZvaWQgKnBhcmFtcykKK3sKKwlOb3RpZmllciAqY3VycmVudDsKKwl3aGlsZSAodHJ1ZSkJCQkJLy8ga2VlcCBwcm9jZXNzaW5nIHBhc3QgZXZlbnRzIHVudGlsIG5vIG1vcmUKKwl7CisJCXsKKwkJCTo6c3RkOjp1bmlxdWVfbG9jazxSZWVudHJhbnRNdXRleD4gc3luYyhxdWV1ZVNlbWFwaG9yZSk7CisJCQlkb3VibGUgY3VycmVudFRpbWUgPSBHZXRDbG9jaygpOworCQkJY3VycmVudCA9IHRpbWVyUXVldWVIZWFkOworCQkJaWYgKGN1cnJlbnQgPT0gTlVMTCB8fCBjdXJyZW50LT5tX2V4cGlyYXRpb25UaW1lID4gY3VycmVudFRpbWUpCisJCQl7CisJCQkJYnJlYWs7CQkvLyBubyBtb3JlIHRpbWVyIGV2ZW50cyB0byBwcm9jZXNzCisJCQl9CisJCQkvLyBuZWVkIHRvIHByb2Nlc3MgdGhpcyBlbnRyeQorCQkJdGltZXJRdWV1ZUhlYWQgPSBjdXJyZW50LT5tX25leHRFdmVudDsKKwkJCWlmIChjdXJyZW50LT5tX3BlcmlvZGljKQorCQkJeworCQkJCS8vIGlmIHBlcmlvZGljLCByZXF1ZXVlIHRoZSBldmVudAorCQkJCS8vIGNvbXB1dGUgd2hlbiB0byBwdXQgaW50byBxdWV1ZQorCQkJCWN1cnJlbnQtPkluc2VydEluUXVldWUodHJ1ZSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gbm90IHBlcmlvZGljOyByZW1vdmVkIGZyb20gcXVldWUKKwkJCQljdXJyZW50LT5tX3F1ZXVlZCA9IGZhbHNlOworCQkJfQorCQkJLy8gVGFrZSBoYW5kbGVyIHNlbWFwaG9yZSB3aGlsZSBob2xkaW5nIHF1ZXVlIHNlbWFwaG9yZSB0byBtYWtlIHN1cmUKKwkJCS8vICB0aGUgaGFuZGxlciB3aWxsIGV4ZWN1dGUgdG8gY29tcGxldGlvbiBpbiBjYXNlIHdlIGFyZSBiZWluZyBkZWxldGVkLgorCQkJdGFrZVNlbWFwaG9yZShjdXJyZW50LT5tX2hhbmRsZXJTZW1hcGhvcmUpOworCQl9CisKKwkJY3VycmVudC0+bV9oYW5kbGVyKGN1cnJlbnQtPm1fcGFyYW0pOwkvLyBjYWxsIHRoZSBldmVudCBoYW5kbGVyCisJCWdpdmVTZW1hcGhvcmUoY3VycmVudC0+bV9oYW5kbGVyU2VtYXBob3JlKTsKKwl9CisJLy8gcmVzY2hlZHVsZSB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgcXVldWUKKwk6OnN0ZDo6dW5pcXVlX2xvY2s8UmVlbnRyYW50TXV0ZXg+IHN5bmMocXVldWVTZW1hcGhvcmUpOworCVVwZGF0ZUFsYXJtKCk7Cit9CisKKy8qKgorICogSW5zZXJ0IHRoaXMgTm90aWZpZXIgaW50byB0aGUgdGltZXIgcXVldWUgaW4gcmlnaHQgcGxhY2UuCisgKiBXQVJOSU5HOiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkbyBzeW5jaHJvbml6YXRpb24hIEl0IG11c3QgYmUgY2FsbGVkIGZyb20gc29tZXdoZXJlCisgKiB0aGF0IGlzIHRha2luZyBjYXJlIG9mIHN5bmNocm9uaXppbmcgYWNjZXNzIHRvIHRoZSBxdWV1ZS4KKyAqIEBwYXJhbSByZXNjaGVkdWxlIElmIGZhbHNlLCB0aGUgc2NoZWR1bGVkIGFsYXJtIGlzIGJhc2VkIG9uIHRoZSBjdXJyZW50IHRpbWUgYW5kIFVwZGF0ZUFsYXJtCisgKiBtZXRob2QgaXMgY2FsbGVkIHdoaWNoIHdpbGwgZW5hYmxlIHRoZSBhbGFybSBpZiBuZWNlc3NhcnkuCisgKiBJZiB0cnVlLCB1cGRhdGUgdGhlIHRpbWUgYnkgYWRkaW5nIHRoZSBwZXJpb2QgKG5vIGRyaWZ0KSB3aGVuIHJlc2NoZWR1bGVkIHBlcmlvZGljIGZyb20gUHJvY2Vzc1F1ZXVlLgorICogVGhpcyBlbnN1cmVzIHRoYXQgdGhlIHB1YmxpYyBtZXRob2RzIG9ubHkgdXBkYXRlIHRoZSBxdWV1ZSBhZnRlciBmaW5pc2hpbmcgaW5zZXJ0aW5nLgorICovCit2b2lkIE5vdGlmaWVyOjpJbnNlcnRJblF1ZXVlKGJvb2wgcmVzY2hlZHVsZSkKK3sKKwlpZiAocmVzY2hlZHVsZSkKKwl7CisJCW1fZXhwaXJhdGlvblRpbWUgKz0gbV9wZXJpb2Q7CisJfQorCWVsc2UKKwl7CisJCW1fZXhwaXJhdGlvblRpbWUgPSBHZXRDbG9jaygpICsgbV9wZXJpb2Q7CisJfQorCWlmIChtX2V4cGlyYXRpb25UaW1lID4gVGltZXI6OmtSb2xsb3ZlclRpbWUpCisJeworCQltX2V4cGlyYXRpb25UaW1lIC09IFRpbWVyOjprUm9sbG92ZXJUaW1lOworCX0KKwlpZiAodGltZXJRdWV1ZUhlYWQgPT0gTlVMTCB8fCB0aW1lclF1ZXVlSGVhZC0+bV9leHBpcmF0aW9uVGltZSA+PSB0aGlzLT5tX2V4cGlyYXRpb25UaW1lKQorCXsKKwkJLy8gdGhlIHF1ZXVlIGlzIGVtcHR5IG9yIGdyZWF0ZXIgdGhhbiB0aGUgbmV3IGVudHJ5CisJCS8vIHRoZSBuZXcgZW50cnkgYmVjb21lcyB0aGUgZmlyc3QgZWxlbWVudAorCQl0aGlzLT5tX25leHRFdmVudCA9IHRpbWVyUXVldWVIZWFkOworCQl0aW1lclF1ZXVlSGVhZCA9IHRoaXM7CisJCWlmICghcmVzY2hlZHVsZSkKKwkJeworCQkJLy8gc2luY2UgdGhlIGZpcnN0IGVsZW1lbnQgY2hhbmdlZCwgdXBkYXRlIGFsYXJtLCB1bmxlc3Mgd2UgYWxyZWFkeSBwbGFuIHRvCisJCQlVcGRhdGVBbGFybSgpOworCQl9CisJfQorCWVsc2UKKwl7CisJCWZvciAoTm90aWZpZXIgKipucHAgPSAmKHRpbWVyUXVldWVIZWFkLT5tX25leHRFdmVudCk7IDsgbnBwID0gJigqbnBwKS0+bV9uZXh0RXZlbnQpCisJCXsKKwkJCU5vdGlmaWVyICpuID0gKm5wcDsKKwkJCWlmIChuID09IE5VTEwgfHwgbi0+bV9leHBpcmF0aW9uVGltZSA+IHRoaXMtPm1fZXhwaXJhdGlvblRpbWUpCisJCQl7CisJCQkJKm5wcCA9IHRoaXM7CisJCQkJdGhpcy0+bV9uZXh0RXZlbnQgPSBuOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCW1fcXVldWVkID0gdHJ1ZTsKK30KKworLyoqCisgKiBEZWxldGUgdGhpcyBOb3RpZmllciBmcm9tIHRoZSB0aW1lciBxdWV1ZS4KKyAqIFdBUk5JTkc6IHRoaXMgbWV0aG9kIGRvZXMgbm90IGRvIHN5bmNocm9uaXphdGlvbiEgSXQgbXVzdCBiZSBjYWxsZWQgZnJvbSBzb21ld2hlcmUKKyAqIHRoYXQgaXMgdGFraW5nIGNhcmUgb2Ygc3luY2hyb25pemluZyBhY2Nlc3MgdG8gdGhlIHF1ZXVlLgorICogUmVtb3ZlIHRoaXMgTm90aWZpZXIgZnJvbSB0aGUgdGltZXIgcXVldWUgYW5kIGFkanVzdCB0aGUgbmV4dCBpbnRlcnJ1cHQgdGltZSB0byByZWZsZWN0CisgKiB0aGUgY3VycmVudCB0b3Agb2YgdGhlIHF1ZXVlLgorICovCit2b2lkIE5vdGlmaWVyOjpEZWxldGVGcm9tUXVldWUoKQoreworCWlmIChtX3F1ZXVlZCkKKwl7CisJCW1fcXVldWVkID0gZmFsc2U7CisJCXdwaV9hc3NlcnQodGltZXJRdWV1ZUhlYWQgIT0gTlVMTCk7CisJCWlmICh0aW1lclF1ZXVlSGVhZCA9PSB0aGlzKQorCQl7CisJCQkvLyByZW1vdmUgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QgLSB1cGRhdGUgdGhlIGFsYXJtCisJCQl0aW1lclF1ZXVlSGVhZCA9IHRoaXMtPm1fbmV4dEV2ZW50OworCQkJVXBkYXRlQWxhcm0oKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWZvciAoTm90aWZpZXIgKm4gPSB0aW1lclF1ZXVlSGVhZDsgbiAhPSBOVUxMOyBuID0gbi0+bV9uZXh0RXZlbnQpCisJCQl7CisJCQkJaWYgKG4tPm1fbmV4dEV2ZW50ID09IHRoaXMpCisJCQkJeworCQkJCQkvLyB0aGlzIGVsZW1lbnQgaXMgdGhlIG5leHQgZWxlbWVudCBmcm9tICpuIGZyb20gdGhlIHF1ZXVlCisJCQkJCW4tPm1fbmV4dEV2ZW50ID0gdGhpcy0+bV9uZXh0RXZlbnQ7CS8vIHBvaW50IGFyb3VuZCB0aGlzIG9uZQorCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworLyoqCisgKiBSZWdpc3RlciBmb3Igc2luZ2xlIGV2ZW50IG5vdGlmaWNhdGlvbi4KKyAqIEEgdGltZXIgZXZlbnQgaXMgcXVldWVkIGZvciBhIHNpbmdsZSBldmVudCBhZnRlciB0aGUgc3BlY2lmaWVkIGRlbGF5LgorICogQHBhcmFtIGRlbGF5IFNlY29uZHMgdG8gd2FpdCBiZWZvcmUgdGhlIGhhbmRsZXIgaXMgY2FsbGVkLgorICovCit2b2lkIE5vdGlmaWVyOjpTdGFydFNpbmdsZShkb3VibGUgZGVsYXkpCit7CisJOjpzdGQ6OnVuaXF1ZV9sb2NrPFJlZW50cmFudE11dGV4PiBzeW5jKHF1ZXVlU2VtYXBob3JlKTsKKwltX3BlcmlvZGljID0gZmFsc2U7CisJbV9wZXJpb2QgPSBkZWxheTsKKwlEZWxldGVGcm9tUXVldWUoKTsKKwlJbnNlcnRJblF1ZXVlKGZhbHNlKTsKK30KKworLyoqCisgKiBSZWdpc3RlciBmb3IgcGVyaW9kaWMgZXZlbnQgbm90aWZpY2F0aW9uLgorICogQSB0aW1lciBldmVudCBpcyBxdWV1ZWQgZm9yIHBlcmlvZGljIGV2ZW50IG5vdGlmaWNhdGlvbi4gRWFjaCB0aW1lIHRoZSBpbnRlcnJ1cHQKKyAqIG9jY3VycywgdGhlIGV2ZW50IHdpbGwgYmUgaW1tZWRpYXRlbHkgcmVxdWV1ZWQgZm9yIHRoZSBzYW1lIHRpbWUgaW50ZXJ2YWwuCisgKiBAcGFyYW0gcGVyaW9kIFBlcmlvZCBpbiBzZWNvbmRzIHRvIGNhbGwgdGhlIGhhbmRsZXIgc3RhcnRpbmcgb25lIHBlcmlvZCBhZnRlciB0aGUgY2FsbCB0byB0aGlzIG1ldGhvZC4KKyAqLwordm9pZCBOb3RpZmllcjo6U3RhcnRQZXJpb2RpYyhkb3VibGUgcGVyaW9kKQoreworCTo6c3RkOjp1bmlxdWVfbG9jazxSZWVudHJhbnRNdXRleD4gc3luYyhxdWV1ZVNlbWFwaG9yZSk7CisJbV9wZXJpb2RpYyA9IHRydWU7CisJbV9wZXJpb2QgPSBwZXJpb2Q7CisJRGVsZXRlRnJvbVF1ZXVlKCk7CisJSW5zZXJ0SW5RdWV1ZShmYWxzZSk7Cit9CisKKy8qKgorICogU3RvcCB0aW1lciBldmVudHMgZnJvbSBvY2N1cmluZy4KKyAqIFN0b3AgYW55IHJlcGVhdGluZyB0aW1lciBldmVudHMgZnJvbSBvY2N1cmluZy4gVGhpcyB3aWxsIGFsc28gcmVtb3ZlIGFueSBzaW5nbGUKKyAqIG5vdGlmaWNhdGlvbiBldmVudHMgZnJvbSB0aGUgcXVldWUuCisgKiBJZiBhIHRpbWVyLWJhc2VkIGNhbGwgdG8gdGhlIHJlZ2lzdGVyZWQgaGFuZGxlciBpcyBpbiBwcm9ncmVzcywgdGhpcyBmdW5jdGlvbiB3aWxsCisgKiBibG9jayB1bnRpbCB0aGUgaGFuZGxlciBjYWxsIGlzIGNvbXBsZXRlLgorICovCit2b2lkIE5vdGlmaWVyOjpTdG9wKCkKK3sKKwl7CisJCTo6c3RkOjp1bmlxdWVfbG9jazxSZWVudHJhbnRNdXRleD4gc3luYyhxdWV1ZVNlbWFwaG9yZSk7CisJCURlbGV0ZUZyb21RdWV1ZSgpOworCX0KKwkvLyBXYWl0IGZvciBhIGN1cnJlbnRseSBleGVjdXRpbmcgaGFuZGxlciB0byBjb21wbGV0ZSBiZWZvcmUgcmV0dXJuaW5nIGZyb20gU3RvcCgpCisJU3luY2hyb25pemVkIHN5bmMobV9oYW5kbGVyU2VtYXBob3JlKTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvUFdNLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvUFdNLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmIwZjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9QV00uY3BwCkBAIC0wLDAgKzEsMzYzIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJQV00uaCIKKworLy8jaW5jbHVkZSAiTmV0d29ya0NvbW11bmljYXRpb24vVXNhZ2VSZXBvcnRpbmcuaCIKKyNpbmNsdWRlICJSZXNvdXJjZS5oIgorI2luY2x1ZGUgIlV0aWxpdHkuaCIKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKyNpbmNsdWRlICJIQUwvSEFMLmhwcCIKKworY29uc3RleHByIGZsb2F0IFBXTTo6a0RlZmF1bHRQd21QZXJpb2Q7Citjb25zdGV4cHIgZmxvYXQgUFdNOjprRGVmYXVsdFB3bUNlbnRlcjsKK2NvbnN0IGludDMyX3QgUFdNOjprRGVmYXVsdFB3bVN0ZXBzRG93bjsKK2NvbnN0IGludDMyX3QgUFdNOjprUHdtRGlzYWJsZWQ7CisKKy8qKgorICogSW5pdGlhbGl6ZSBQV01zIGdpdmVuIGEgY2hhbm5lbC4KKyAqCisgKiBUaGlzIG1ldGhvZCBpcyBwcml2YXRlIGFuZCBpcyB0aGUgY29tbW9uIHBhdGggZm9yIGFsbCB0aGUgY29uc3RydWN0b3JzIGZvciBjcmVhdGluZyBQV00KKyAqIGluc3RhbmNlcy4gQ2hlY2tzIGNoYW5uZWwgdmFsdWUgcmFuZ2UgYW5kIGFsbG9jYXRlcyB0aGUgYXBwcm9wcmlhdGUgY2hhbm5lbC4KKyAqIFRoZSBhbGxvY2F0aW9uIGlzIG9ubHkgZG9uZSB0byBoZWxwIHVzZXJzIGVuc3VyZSB0aGF0IHRoZXkgZG9uJ3QgZG91YmxlIGFzc2lnbiBjaGFubmVscy4KKyAqIEBwYXJhbSBjaGFubmVsIFRoZSBQV00gY2hhbm5lbCBudW1iZXIuIDAtOSBhcmUgb24tYm9hcmQsIDEwLTE5IGFyZSBvbiB0aGUgTVhQIHBvcnQKKyAqLwordm9pZCBQV006OkluaXRQV00odWludDMyX3QgY2hhbm5lbCkKK3sKKwljaGFyIGJ1Zls2NF07CisKKwlpZiAoIUNoZWNrUFdNQ2hhbm5lbChjaGFubmVsKSkKKwl7CisJCXNucHJpbnRmKGJ1ZiwgNjQsICJQV00gQ2hhbm5lbCAlZCIsIGNoYW5uZWwpOworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChDaGFubmVsSW5kZXhPdXRPZlJhbmdlLCBidWYpOworCQlyZXR1cm47CisJfQorCisJaW50MzJfdCBzdGF0dXMgPSAwOworCWFsbG9jYXRlUFdNQ2hhbm5lbChtX3B3bV9wb3J0c1tjaGFubmVsXSwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisKKwltX2NoYW5uZWwgPSBjaGFubmVsOworCisJc2V0UFdNKG1fcHdtX3BvcnRzW21fY2hhbm5lbF0sIGtQd21EaXNhYmxlZCwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisKKwltX2VsaW1pbmF0ZURlYWRiYW5kID0gZmFsc2U7CisKKwlIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfUFdNLCBjaGFubmVsKTsKK30KKworLyoqCisgKiBBbGxvY2F0ZSBhIFBXTSBnaXZlbiBhIGNoYW5uZWwgbnVtYmVyLgorICoKKyAqIEBwYXJhbSBjaGFubmVsIFRoZSBQV00gY2hhbm5lbC4KKyAqLworUFdNOjpQV00odWludDMyX3QgY2hhbm5lbCkKK3sKKwlJbml0UFdNKGNoYW5uZWwpOworfQorCisvKioKKyAqIEZyZWUgdGhlIFBXTSBjaGFubmVsLgorICoKKyAqIEZyZWUgdGhlIHJlc291cmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgUFdNIGNoYW5uZWwgYW5kIHNldCB0aGUgdmFsdWUgdG8gMC4KKyAqLworUFdNOjp+UFdNKCkKK3sKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisKKwlzZXRQV00obV9wd21fcG9ydHNbbV9jaGFubmVsXSwga1B3bURpc2FibGVkLCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKworCWZyZWVQV01DaGFubmVsKG1fcHdtX3BvcnRzW21fY2hhbm5lbF0sICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIE9wdGlvbmFsbHkgZWxpbWluYXRlIHRoZSBkZWFkYmFuZCBmcm9tIGEgc3BlZWQgY29udHJvbGxlci4KKyAqIEBwYXJhbSBlbGltaW5hdGVEZWFkYmFuZCBJZiB0cnVlLCBzZXQgdGhlIG1vdG9yIGN1cnZlIG9uIHRoZSBKYWd1YXIgdG8gZWxpbWluYXRlCisgKiB0aGUgZGVhZGJhbmQgaW4gdGhlIG1pZGRsZSBvZiB0aGUgcmFuZ2UuIE90aGVyd2lzZSwga2VlcCB0aGUgZnVsbCByYW5nZSB3aXRob3V0CisgKiBtb2RpZnlpbmcgYW55IHZhbHVlcy4KKyAqLwordm9pZCBQV006OkVuYWJsZURlYWRiYW5kRWxpbWluYXRpb24oYm9vbCBlbGltaW5hdGVEZWFkYmFuZCkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisJbV9lbGltaW5hdGVEZWFkYmFuZCA9IGVsaW1pbmF0ZURlYWRiYW5kOworfQorCisvKioKKyAqIFNldCB0aGUgYm91bmRzIG9uIHRoZSBQV00gdmFsdWVzLgorICogVGhpcyBzZXRzIHRoZSBib3VuZHMgb24gdGhlIFBXTSB2YWx1ZXMgZm9yIGEgcGFydGljdWxhciBlYWNoIHR5cGUgb2YgY29udHJvbGxlci4gVGhlIHZhbHVlcworICogZGV0ZXJtaW5lIHRoZSB1cHBlciBhbmQgbG93ZXIgc3BlZWRzIGFzIHdlbGwgYXMgdGhlIGRlYWRiYW5kIGJyYWNrZXQuCisgKiBAcGFyYW0gbWF4IFRoZSBNaW5pbXVtIHB3bSB2YWx1ZQorICogQHBhcmFtIGRlYWRiYW5kTWF4IFRoZSBoaWdoIGVuZCBvZiB0aGUgZGVhZGJhbmQgcmFuZ2UKKyAqIEBwYXJhbSBjZW50ZXIgVGhlIGNlbnRlciBzcGVlZCAob2ZmKQorICogQHBhcmFtIGRlYWRiYW5kTWluIFRoZSBsb3cgZW5kIG9mIHRoZSBkZWFkYmFuZCByYW5nZQorICogQHBhcmFtIG1pbiBUaGUgbWluaW11bSBwd20gdmFsdWUKKyAqLwordm9pZCBQV006OlNldEJvdW5kcyhpbnQzMl90IG1heCwgaW50MzJfdCBkZWFkYmFuZE1heCwgaW50MzJfdCBjZW50ZXIsIGludDMyX3QgZGVhZGJhbmRNaW4sIGludDMyX3QgbWluKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKwltX21heFB3bSA9IG1heDsKKwltX2RlYWRiYW5kTWF4UHdtID0gZGVhZGJhbmRNYXg7CisJbV9jZW50ZXJQd20gPSBjZW50ZXI7CisJbV9kZWFkYmFuZE1pblB3bSA9IGRlYWRiYW5kTWluOworCW1fbWluUHdtID0gbWluOworfQorCisKKy8qKgorICogU2V0IHRoZSBib3VuZHMgb24gdGhlIFBXTSBwdWxzZSB3aWR0aHMuCisgKiBUaGlzIHNldHMgdGhlIGJvdW5kcyBvbiB0aGUgUFdNIHZhbHVlcyBmb3IgYSBwYXJ0aWN1bGFyIHR5cGUgb2YgY29udHJvbGxlci4gVGhlIHZhbHVlcworICogZGV0ZXJtaW5lIHRoZSB1cHBlciBhbmQgbG93ZXIgc3BlZWRzIGFzIHdlbGwgYXMgdGhlIGRlYWRiYW5kIGJyYWNrZXQuCisgKiBAcGFyYW0gbWF4IFRoZSBtYXggUFdNIHB1bHNlIHdpZHRoIGluIG1zCisgKiBAcGFyYW0gZGVhZGJhbmRNYXggVGhlIGhpZ2ggZW5kIG9mIHRoZSBkZWFkYmFuZCByYW5nZSBwdWxzZSB3aWR0aCBpbiBtcworICogQHBhcmFtIGNlbnRlciBUaGUgY2VudGVyIChvZmYpIHB1bHNlIHdpZHRoIGluIG1zCisgKiBAcGFyYW0gZGVhZGJhbmRNaW4gVGhlIGxvdyBlbmQgb2YgdGhlIGRlYWRiYW5kIHB1bHNlIHdpZHRoIGluIG1zCisgKiBAcGFyYW0gbWluIFRoZSBtaW5pbXVtIHB1bHNlIHdpZHRoIGluIG1zCisgKi8KK3ZvaWQgUFdNOjpTZXRCb3VuZHMoZG91YmxlIG1heCwgZG91YmxlIGRlYWRiYW5kTWF4LCBkb3VibGUgY2VudGVyLCBkb3VibGUgZGVhZGJhbmRNaW4sIGRvdWJsZSBtaW4pCit7CisJLy8gY2FsY3VsYXRlIHRoZSBsb29wIHRpbWUgaW4gbWlsbGlzZWNvbmRzCisJaW50MzJfdCBzdGF0dXMgPSAwOworCWRvdWJsZSBsb29wVGltZSA9IGdldExvb3BUaW1pbmcoJnN0YXR1cykvKGtTeXN0ZW1DbG9ja1RpY2tzUGVyTWljcm9zZWNvbmQqMWUzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKworCW1fbWF4UHdtID0gKGludDMyX3QpKChtYXgta0RlZmF1bHRQd21DZW50ZXIpL2xvb3BUaW1lK2tEZWZhdWx0UHdtU3RlcHNEb3duLTEpOworCW1fZGVhZGJhbmRNYXhQd20gPSAoaW50MzJfdCkoKGRlYWRiYW5kTWF4LWtEZWZhdWx0UHdtQ2VudGVyKS9sb29wVGltZStrRGVmYXVsdFB3bVN0ZXBzRG93bi0xKTsKKwltX2NlbnRlclB3bSA9IChpbnQzMl90KSgoY2VudGVyLWtEZWZhdWx0UHdtQ2VudGVyKS9sb29wVGltZStrRGVmYXVsdFB3bVN0ZXBzRG93bi0xKTsKKwltX2RlYWRiYW5kTWluUHdtID0gKGludDMyX3QpKChkZWFkYmFuZE1pbi1rRGVmYXVsdFB3bUNlbnRlcikvbG9vcFRpbWUra0RlZmF1bHRQd21TdGVwc0Rvd24tMSk7CisJbV9taW5Qd20gPSAoaW50MzJfdCkoKG1pbi1rRGVmYXVsdFB3bUNlbnRlcikvbG9vcFRpbWUra0RlZmF1bHRQd21TdGVwc0Rvd24tMSk7Cit9CisKKy8qKgorICogU2V0IHRoZSBQV00gdmFsdWUgYmFzZWQgb24gYSBwb3NpdGlvbi4KKyAqCisgKiBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgc2Vydm9zLgorICoKKyAqIEBwcmUgU2V0TWF4UG9zaXRpdmVQd20oKSBjYWxsZWQuCisgKiBAcHJlIFNldE1pbk5lZ2F0aXZlUHdtKCkgY2FsbGVkLgorICoKKyAqIEBwYXJhbSBwb3MgVGhlIHBvc2l0aW9uIHRvIHNldCB0aGUgc2Vydm8gYmV0d2VlbiAwLjAgYW5kIDEuMC4KKyAqLwordm9pZCBQV006OlNldFBvc2l0aW9uKGZsb2F0IHBvcykKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisJaWYgKHBvcyA8IDAuMCkKKwl7CisJCXBvcyA9IDAuMDsKKwl9CisJZWxzZSBpZiAocG9zID4gMS4wKQorCXsKKwkJcG9zID0gMS4wOworCX0KKworCS8vIG5vdGUsIG5lZWQgdG8gcGVyZm9ybSB0aGUgbXVsdGlwbGljYXRpb24gYmVsb3cgYXMgZmxvYXRpbmcgcG9pbnQgYmVmb3JlIGNvbnZlcnRpbmcgdG8gaW50CisJdW5zaWduZWQgc2hvcnQgcmF3VmFsdWUgPSAoaW50MzJfdCkoIChwb3MgKiAoZmxvYXQpIEdldEZ1bGxSYW5nZVNjYWxlRmFjdG9yKCkpICsgR2V0TWluTmVnYXRpdmVQd20oKSk7CisvLwlwcmludGYoIk1pbk5lZ1BXTTogJWQgRnVsbFJhbmdlU2NhbGVGYWN0b3I6ICVkIFJhdyB2YWx1ZTogJTVkICAgSW5wdXQgdmFsdWU6ICU0LjRmXG4iLCBHZXRNaW5OZWdhdGl2ZVB3bSgpLCBHZXRGdWxsUmFuZ2VTY2FsZUZhY3RvcigpLCByYXdWYWx1ZSwgcG9zKTsKKworLy8Jd3BpX2Fzc2VydCgocmF3VmFsdWUgPj0gR2V0TWluTmVnYXRpdmVQd20oKSkgJiYgKHJhd1ZhbHVlIDw9IEdldE1heFBvc2l0aXZlUHdtKCkpKTsKKwl3cGlfYXNzZXJ0KHJhd1ZhbHVlICE9IGtQd21EaXNhYmxlZCk7CisKKwkvLyBzZW5kIHRoZSBjb21wdXRlZCBwd20gdmFsdWUgdG8gdGhlIEZQR0EKKwlTZXRSYXcoKHVuc2lnbmVkIHNob3J0KXJhd1ZhbHVlKTsKK30KKworLyoqCisgKiBHZXQgdGhlIFBXTSB2YWx1ZSBpbiB0ZXJtcyBvZiBhIHBvc2l0aW9uLgorICoKKyAqIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBzZXJ2b3MuCisgKgorICogQHByZSBTZXRNYXhQb3NpdGl2ZVB3bSgpIGNhbGxlZC4KKyAqIEBwcmUgU2V0TWluTmVnYXRpdmVQd20oKSBjYWxsZWQuCisgKgorICogQHJldHVybiBUaGUgcG9zaXRpb24gdGhlIHNlcnZvIGlzIHNldCB0byBiZXR3ZWVuIDAuMCBhbmQgMS4wLgorICovCitmbG9hdCBQV006OkdldFBvc2l0aW9uKCkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gMC4wOworCWludDMyX3QgdmFsdWUgPSBHZXRSYXcoKTsKKwlpZiAodmFsdWUgPCBHZXRNaW5OZWdhdGl2ZVB3bSgpKQorCXsKKwkJcmV0dXJuIDAuMDsKKwl9CisJZWxzZSBpZiAodmFsdWUgPiBHZXRNYXhQb3NpdGl2ZVB3bSgpKQorCXsKKwkJcmV0dXJuIDEuMDsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuIChmbG9hdCkodmFsdWUgLSBHZXRNaW5OZWdhdGl2ZVB3bSgpKSAvIChmbG9hdClHZXRGdWxsUmFuZ2VTY2FsZUZhY3RvcigpOworCX0KK30KKworLyoqCisgKiBTZXQgdGhlIFBXTSB2YWx1ZSBiYXNlZCBvbiBhIHNwZWVkLgorICoKKyAqIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBzcGVlZCBjb250cm9sbGVycy4KKyAqCisgKiBAcHJlIFNldE1heFBvc2l0aXZlUHdtKCkgY2FsbGVkLgorICogQHByZSBTZXRNaW5Qb3NpdGl2ZVB3bSgpIGNhbGxlZC4KKyAqIEBwcmUgU2V0Q2VudGVyUHdtKCkgY2FsbGVkLgorICogQHByZSBTZXRNYXhOZWdhdGl2ZVB3bSgpIGNhbGxlZC4KKyAqIEBwcmUgU2V0TWluTmVnYXRpdmVQd20oKSBjYWxsZWQuCisgKgorICogQHBhcmFtIHNwZWVkIFRoZSBzcGVlZCB0byBzZXQgdGhlIHNwZWVkIGNvbnRyb2xsZXIgYmV0d2VlbiAtMS4wIGFuZCAxLjAuCisgKi8KK3ZvaWQgUFdNOjpTZXRTcGVlZChmbG9hdCBzcGVlZCkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisJLy8gY2xhbXAgc3BlZWQgdG8gYmUgaW4gdGhlIHJhbmdlIDEuMCA+PSBzcGVlZCA+PSAtMS4wCisJaWYgKHNwZWVkIDwgLTEuMCkKKwl7CisJCXNwZWVkID0gLTEuMDsKKwl9CisJZWxzZSBpZiAoc3BlZWQgPiAxLjApCisJeworCQlzcGVlZCA9IDEuMDsKKwl9CisKKwkvLyBjYWxjdWxhdGUgdGhlIGRlc2lyZWQgb3V0cHV0IHB3bSB2YWx1ZSBieSBzY2FsaW5nIHRoZSBzcGVlZCBhcHByb3ByaWF0ZWx5CisJaW50MzJfdCByYXdWYWx1ZTsKKwlpZiAoc3BlZWQgPT0gMC4wKQorCXsKKwkJcmF3VmFsdWUgPSBHZXRDZW50ZXJQd20oKTsKKwl9CisJZWxzZSBpZiAoc3BlZWQgPiAwLjApCisJeworCQlyYXdWYWx1ZSA9IChpbnQzMl90KShzcGVlZCAqICgoZmxvYXQpR2V0UG9zaXRpdmVTY2FsZUZhY3RvcigpKSArCisJCQkJCQkJCQkoKGZsb2F0KSBHZXRNaW5Qb3NpdGl2ZVB3bSgpKSArIDAuNSk7CisJfQorCWVsc2UKKwl7CisJCXJhd1ZhbHVlID0gKGludDMyX3QpKHNwZWVkICogKChmbG9hdClHZXROZWdhdGl2ZVNjYWxlRmFjdG9yKCkpICsKKwkJCQkJCQkJCSgoZmxvYXQpIEdldE1heE5lZ2F0aXZlUHdtKCkpICsgMC41KTsKKwl9CisKKwkvLyB0aGUgYWJvdmUgc2hvdWxkIHJlc3VsdCBpbiBhIHB3bV92YWx1ZSBpbiB0aGUgdmFsaWQgcmFuZ2UKKwl3cGlfYXNzZXJ0KChyYXdWYWx1ZSA+PSBHZXRNaW5OZWdhdGl2ZVB3bSgpKSAmJiAocmF3VmFsdWUgPD0gR2V0TWF4UG9zaXRpdmVQd20oKSkpOworCXdwaV9hc3NlcnQocmF3VmFsdWUgIT0ga1B3bURpc2FibGVkKTsKKworCS8vIHNlbmQgdGhlIGNvbXB1dGVkIHB3bSB2YWx1ZSB0byB0aGUgRlBHQQorCVNldFJhdyhyYXdWYWx1ZSk7Cit9CisKKy8qKgorICogR2V0IHRoZSBQV00gdmFsdWUgaW4gdGVybXMgb2Ygc3BlZWQuCisgKgorICogVGhpcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IHNwZWVkIGNvbnRyb2xsZXJzLgorICoKKyAqIEBwcmUgU2V0TWF4UG9zaXRpdmVQd20oKSBjYWxsZWQuCisgKiBAcHJlIFNldE1pblBvc2l0aXZlUHdtKCkgY2FsbGVkLgorICogQHByZSBTZXRNYXhOZWdhdGl2ZVB3bSgpIGNhbGxlZC4KKyAqIEBwcmUgU2V0TWluTmVnYXRpdmVQd20oKSBjYWxsZWQuCisgKgorICogQHJldHVybiBUaGUgbW9zdCByZWNlbnRseSBzZXQgc3BlZWQgYmV0d2VlbiAtMS4wIGFuZCAxLjAuCisgKi8KK2Zsb2F0IFBXTTo6R2V0U3BlZWQoKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiAwLjA7CisJaW50MzJfdCB2YWx1ZSA9IEdldFJhdygpOworCWlmICh2YWx1ZSA9PSBQV006OmtQd21EaXNhYmxlZCkKKwl7CisJCXJldHVybiAwLjA7CisJfQorCWVsc2UgaWYgKHZhbHVlID4gR2V0TWF4UG9zaXRpdmVQd20oKSkKKwl7CisJCXJldHVybiAxLjA7CisJfQorCWVsc2UgaWYgKHZhbHVlIDwgR2V0TWluTmVnYXRpdmVQd20oKSkKKwl7CisJCXJldHVybiAtMS4wOworCX0KKwllbHNlIGlmICh2YWx1ZSA+IEdldE1pblBvc2l0aXZlUHdtKCkpCisJeworCQlyZXR1cm4gKGZsb2F0KSh2YWx1ZSAtIEdldE1pblBvc2l0aXZlUHdtKCkpIC8gKGZsb2F0KUdldFBvc2l0aXZlU2NhbGVGYWN0b3IoKTsKKwl9CisJZWxzZSBpZiAodmFsdWUgPCBHZXRNYXhOZWdhdGl2ZVB3bSgpKQorCXsKKwkJcmV0dXJuIChmbG9hdCkodmFsdWUgLSBHZXRNYXhOZWdhdGl2ZVB3bSgpKSAvIChmbG9hdClHZXROZWdhdGl2ZVNjYWxlRmFjdG9yKCk7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiAwLjA7CisJfQorfQorCisvKioKKyAqIFNldCB0aGUgUFdNIHZhbHVlIGRpcmVjdGx5IHRvIHRoZSBoYXJkd2FyZS4KKyAqCisgKiBXcml0ZSBhIHJhdyB2YWx1ZSB0byBhIFBXTSBjaGFubmVsLgorICoKKyAqIEBwYXJhbSB2YWx1ZSBSYXcgUFdNIHZhbHVlLgorICovCit2b2lkIFBXTTo6U2V0UmF3KHVuc2lnbmVkIHNob3J0IHZhbHVlKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlzZXRQV00obV9wd21fcG9ydHNbbV9jaGFubmVsXSwgdmFsdWUsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIEdldCB0aGUgUFdNIHZhbHVlIGRpcmVjdGx5IGZyb20gdGhlIGhhcmR3YXJlLgorICoKKyAqIFJlYWQgYSByYXcgdmFsdWUgZnJvbSBhIFBXTSBjaGFubmVsLgorICoKKyAqIEByZXR1cm4gUmF3IFBXTSBjb250cm9sIHZhbHVlLgorICovCit1bnNpZ25lZCBzaG9ydCBQV006OkdldFJhdygpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIDA7CisKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJdW5zaWduZWQgc2hvcnQgdmFsdWUgPSBnZXRQV00obV9wd21fcG9ydHNbbV9jaGFubmVsXSwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisKKwlyZXR1cm4gdmFsdWU7Cit9CisKKy8qKgorICogU2xvdyBkb3duIHRoZSBQV00gc2lnbmFsIGZvciBvbGQgZGV2aWNlcy4KKyAqCisgKiBAcGFyYW0gbXVsdCBUaGUgcGVyaW9kIG11bHRpcGxpZXIgdG8gYXBwbHkgdG8gdGhpcyBjaGFubmVsCisgKi8KK3ZvaWQgUFdNOjpTZXRQZXJpb2RNdWx0aXBsaWVyKFBlcmlvZE11bHRpcGxpZXIgbXVsdCkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisKKwlzd2l0Y2gobXVsdCkKKwl7CisJY2FzZSBrUGVyaW9kTXVsdGlwbGllcl80WDoKKwkJc2V0UFdNUGVyaW9kU2NhbGUobV9wd21fcG9ydHNbbV9jaGFubmVsXSwgMywgJnN0YXR1cyk7IC8vIFNxdWVsY2ggMyBvdXQgb2YgNCBvdXRwdXRzCisJCWJyZWFrOworCWNhc2Uga1BlcmlvZE11bHRpcGxpZXJfMlg6CisJCXNldFBXTVBlcmlvZFNjYWxlKG1fcHdtX3BvcnRzW21fY2hhbm5lbF0sIDEsICZzdGF0dXMpOyAvLyBTcXVlbGNoIDEgb3V0IG9mIDIgb3V0cHV0cworCQlicmVhazsKKwljYXNlIGtQZXJpb2RNdWx0aXBsaWVyXzFYOgorCQlzZXRQV01QZXJpb2RTY2FsZShtX3B3bV9wb3J0c1ttX2NoYW5uZWxdLCAwLCAmc3RhdHVzKTsgLy8gRG9uJ3Qgc3F1ZWxjaCBhbnkgb3V0cHV0cworCQlicmVhazsKKwlkZWZhdWx0OgorCQl3cGlfYXNzZXJ0KGZhbHNlKTsKKwl9CisKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKwordm9pZCBQV006OlNldFplcm9MYXRjaCgpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCQorCWludDMyX3Qgc3RhdHVzID0gMDsKKwkKKwlsYXRjaFBXTVplcm8obV9wd21fcG9ydHNbbV9jaGFubmVsXSwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1Bvd2VyRGlzdHJpYnV0aW9uUGFuZWwuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9Qb3dlckRpc3RyaWJ1dGlvblBhbmVsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2M0MGIzCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9Qb3dlckRpc3RyaWJ1dGlvblBhbmVsLmNwcApAQCAtMCwwICsxLDE1MyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiUG93ZXJEaXN0cmlidXRpb25QYW5lbC5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorI2luY2x1ZGUgIkhBTC9QRFAuaHBwIgorCisvKioKKyAqIEluaXRpYWxpemUgdGhlIFBEUC4KKyAqLworUG93ZXJEaXN0cmlidXRpb25QYW5lbDo6UG93ZXJEaXN0cmlidXRpb25QYW5lbCgpIHsKK30KKworLyoqCisgKiBRdWVyeSB0aGUgaW5wdXQgdm9sdGFnZSBvZiB0aGUgUERQCisgKiBAcmV0dXJuIFRoZSB2b2x0YWdlIG9mIHRoZSBQRFAgaW4gdm9sdHMKKyAqLworZG91YmxlCitQb3dlckRpc3RyaWJ1dGlvblBhbmVsOjpHZXRWb2x0YWdlKCkgeworCWludDMyX3Qgc3RhdHVzID0gMDsKKwkKKwlkb3VibGUgdm9sdGFnZSA9IGdldFBEUFZvbHRhZ2UoJnN0YXR1cyk7CisJCisJaWYoc3RhdHVzKSB7CisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFRpbWVvdXQsICIiKTsKKwl9CisJCisJcmV0dXJuIHZvbHRhZ2U7Cit9CisKKy8qKgorICogUXVlcnkgdGhlIHRlbXBlcmF0dXJlIG9mIHRoZSBQRFAKKyAqIEByZXR1cm4gVGhlIHRlbXBlcmF0dXJlIG9mIHRoZSBQRFAgaW4gZGVncmVlcyBDZWxzaXVzCisgKi8KK2RvdWJsZQorUG93ZXJEaXN0cmlidXRpb25QYW5lbDo6R2V0VGVtcGVyYXR1cmUoKSB7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCQorCWRvdWJsZSB0ZW1wZXJhdHVyZSA9IGdldFBEUFRlbXBlcmF0dXJlKCZzdGF0dXMpOworCQorCWlmKHN0YXR1cykgeworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChUaW1lb3V0LCAiIik7CisJfQorCQorCXJldHVybiB0ZW1wZXJhdHVyZTsKK30KKworLyoqCisgKiBRdWVyeSB0aGUgY3VycmVudCBvZiBhIHNpbmdsZSBjaGFubmVsIG9mIHRoZSBQRFAKKyAqIEByZXR1cm4gVGhlIGN1cnJlbnQgb2Ygb25lIG9mIHRoZSBQRFAgY2hhbm5lbHMgKGNoYW5uZWxzIDAtMTUpIGluIEFtcGVyZXMKKyAqLworZG91YmxlCitQb3dlckRpc3RyaWJ1dGlvblBhbmVsOjpHZXRDdXJyZW50KHVpbnQ4X3QgY2hhbm5lbCkgeworCWludDMyX3Qgc3RhdHVzID0gMDsKKwkKKwlpZighQ2hlY2tQRFBDaGFubmVsKGNoYW5uZWwpKQorCXsKKwkJY2hhciBidWZbNjRdOworCQlzbnByaW50ZihidWYsIDY0LCAiUERQIENoYW5uZWwgJWQiLCBjaGFubmVsKTsKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoQ2hhbm5lbEluZGV4T3V0T2ZSYW5nZSwgYnVmKTsKKwl9CisJCisJZG91YmxlIGN1cnJlbnQgPSBnZXRQRFBDaGFubmVsQ3VycmVudChjaGFubmVsLCAmc3RhdHVzKTsKKwkKKwlpZihzdGF0dXMpIHsKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoVGltZW91dCwgIiIpOworCX0KKwkKKwlyZXR1cm4gY3VycmVudDsKK30KKworLyoqCisgKiBRdWVyeSB0aGUgdG90YWwgY3VycmVudCBvZiBhbGwgbW9uaXRvcmVkIFBEUCBjaGFubmVscyAoMC0xNSkKKyAqIEByZXR1cm4gVGhlIHRoZSB0b3RhbCBjdXJyZW50IGRyYXduIGZyb20gdGhlIFBEUCBjaGFubmVscyBpbiBBbXBlcmVzCisgKi8KK2RvdWJsZQorUG93ZXJEaXN0cmlidXRpb25QYW5lbDo6R2V0VG90YWxDdXJyZW50KCkgeworCWludDMyX3Qgc3RhdHVzID0gMDsKKwkKKwlkb3VibGUgY3VycmVudCA9IGdldFBEUFRvdGFsQ3VycmVudCgmc3RhdHVzKTsKKwkKKwlpZihzdGF0dXMpIHsKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoVGltZW91dCwgIiIpOworCX0KKwkKKwlyZXR1cm4gY3VycmVudDsKK30KKworLyoqCisgKiBRdWVyeSB0aGUgdG90YWwgcG93ZXIgZHJhd24gZnJvbSB0aGUgbW9uaXRvcmVkIFBEUCBjaGFubmVscworICogQHJldHVybiBUaGUgdGhlIHRvdGFsIHBvd2VyIGRyYXduIGZyb20gdGhlIFBEUCBjaGFubmVscyBpbiBXYXR0cworICovCitkb3VibGUKK1Bvd2VyRGlzdHJpYnV0aW9uUGFuZWw6OkdldFRvdGFsUG93ZXIoKSB7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCQorCWRvdWJsZSBwb3dlciA9IGdldFBEUFRvdGFsUG93ZXIoJnN0YXR1cyk7CisJCisJaWYoc3RhdHVzKSB7CisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFRpbWVvdXQsICIiKTsKKwl9CisJCisJcmV0dXJuIHBvd2VyOworfQorCisvKioKKyAqIFF1ZXJ5IHRoZSB0b3RhbCBlbmVyZ3kgZHJhd24gZnJvbSB0aGUgbW9uaXRvcmVkIFBEUCBjaGFubmVscworICogQHJldHVybiBUaGUgdGhlIHRvdGFsIGVuZXJneSBkcmF3biBmcm9tIHRoZSBQRFAgY2hhbm5lbHMgaW4gSm91bGVzCisgKi8KK2RvdWJsZQorUG93ZXJEaXN0cmlidXRpb25QYW5lbDo6R2V0VG90YWxFbmVyZ3koKSB7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCQorCWRvdWJsZSBlbmVyZ3kgPSBnZXRQRFBUb3RhbEVuZXJneSgmc3RhdHVzKTsKKwkKKwlpZihzdGF0dXMpIHsKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoVGltZW91dCwgIiIpOworCX0KKwkKKwlyZXR1cm4gZW5lcmd5OworfQorCisvKioKKyAqIFJlc2V0IHRoZSB0b3RhbCBlbmVyZ3kgZHJhd24gZnJvbSB0aGUgUERQCisgKiBAc2VlIFBvd2VyRGlzdHJpYnV0aW9uUGFuZWwjR2V0VG90YWxFbmVyZ3kKKyAqLwordm9pZAorUG93ZXJEaXN0cmlidXRpb25QYW5lbDo6UmVzZXRUb3RhbEVuZXJneSgpIHsgCisJaW50MzJfdCBzdGF0dXMgPSAwOworCQorCXJlc2V0UERQVG90YWxFbmVyZ3koJnN0YXR1cyk7CisJCisJaWYoc3RhdHVzKSB7CisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFRpbWVvdXQsICIiKTsKKwl9Cit9CisKKy8qKgorICogUmVtb3ZlIGFsbCBvZiB0aGUgZmF1bHQgZmxhZ3Mgb24gdGhlIFBEUAorICovCit2b2lkCitQb3dlckRpc3RyaWJ1dGlvblBhbmVsOjpDbGVhclN0aWNreUZhdWx0cygpIHsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJCisJY2xlYXJQRFBTdGlja3lGYXVsdHMoJnN0YXR1cyk7CisJCisJaWYoc3RhdHVzKSB7CisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFRpbWVvdXQsICIiKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1JlbGF5LmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvUmVsYXkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiM2I1MGMKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1JlbGF5LmNwcApAQCAtMCwwICsxLDIxMCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlCSovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIlJlbGF5LmgiCisKKy8vI2luY2x1ZGUgIk5ldHdvcmtDb21tdW5pY2F0aW9uL1VzYWdlUmVwb3J0aW5nLmgiCisjaW5jbHVkZSAiUmVzb3VyY2UuaCIKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKyNpbmNsdWRlICJIQUwvSEFMLmhwcCIKKworLy8gQWxsb2NhdGUgZWFjaCBkaXJlY3Rpb24gc2VwYXJhdGVseS4KK3N0YXRpYyBSZXNvdXJjZSAqcmVsYXlDaGFubmVscyA9IE5VTEw7CisKKy8qKgorICogQ29tbW9uIHJlbGF5IGluaXRpYWxpemF0aW9uIG1ldGhvZC4KKyAqIFRoaXMgY29kZSBpcyBjb21tb24gdG8gYWxsIFJlbGF5IGNvbnN0cnVjdG9ycyBhbmQgaW5pdGlhbGl6ZXMgdGhlIHJlbGF5IGFuZCByZXNlcnZlcworICogYWxsIHJlc291cmNlcyB0aGF0IG5lZWQgdG8gYmUgbG9ja2VkLiBJbml0aWFsbHkgdGhlIHJlbGF5IGlzIHNldCB0byBib3RoIGxpbmVzIGF0IDB2LgorICovCit2b2lkIFJlbGF5OjpJbml0UmVsYXkoKQoreworCWNoYXIgYnVmWzY0XTsKKwlSZXNvdXJjZTo6Q3JlYXRlUmVzb3VyY2VPYmplY3QoJnJlbGF5Q2hhbm5lbHMsIGRpb19rTnVtU3lzdGVtcyAqIGtSZWxheUNoYW5uZWxzICogMik7CisJaWYgKCFTZW5zb3JCYXNlOjpDaGVja1JlbGF5Q2hhbm5lbChtX2NoYW5uZWwpKQorCXsKKwkJc25wcmludGYoYnVmLCA2NCwgIlJlbGF5IENoYW5uZWwgJWQiLCBtX2NoYW5uZWwpOworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChDaGFubmVsSW5kZXhPdXRPZlJhbmdlLCBidWYpOworCQlyZXR1cm47CisJfQorCisJaWYgKG1fZGlyZWN0aW9uID09IGtCb3RoRGlyZWN0aW9ucyB8fCBtX2RpcmVjdGlvbiA9PSBrRm9yd2FyZE9ubHkpCisJeworCQlzbnByaW50ZihidWYsIDY0LCAiRm9yd2FyZCBSZWxheSAlZCIsIG1fY2hhbm5lbCk7CisJCWlmIChyZWxheUNoYW5uZWxzLT5BbGxvY2F0ZShtX2NoYW5uZWwgKiAyLCBidWYpID09IH4wdWwpCisJCXsKKwkJCUNsb25lRXJyb3IocmVsYXlDaGFubmVscyk7CisJCQlyZXR1cm47CisJCX0KKworCQlIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfUmVsYXksIG1fY2hhbm5lbCk7CisJfQorCWlmIChtX2RpcmVjdGlvbiA9PSBrQm90aERpcmVjdGlvbnMgfHwgbV9kaXJlY3Rpb24gPT0ga1JldmVyc2VPbmx5KQorCXsKKwkJc25wcmludGYoYnVmLCA2NCwgIlJldmVyc2UgUmVsYXkgJWQiLCBtX2NoYW5uZWwpOworCQlpZiAocmVsYXlDaGFubmVscy0+QWxsb2NhdGUobV9jaGFubmVsICogMiArIDEsIGJ1ZikgPT0gfjB1bCkKKwkJeworCQkJQ2xvbmVFcnJvcihyZWxheUNoYW5uZWxzKTsKKwkJCXJldHVybjsKKwkJfQorCisJCUhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9SZWxheSwgbV9jaGFubmVsICsgMTI4KTsKKwl9CisKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJc2V0UmVsYXlGb3J3YXJkKG1fcmVsYXlfcG9ydHNbbV9jaGFubmVsXSwgZmFsc2UsICZzdGF0dXMpOworCXNldFJlbGF5UmV2ZXJzZShtX3JlbGF5X3BvcnRzW21fY2hhbm5lbF0sIGZhbHNlLCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKworfQorCisvKioKKyAqIFJlbGF5IGNvbnN0cnVjdG9yIGdpdmVuIGEgY2hhbm5lbC4KKyAqIEBwYXJhbSBjaGFubmVsIFRoZSBjaGFubmVsIG51bWJlciAoMC0zKS4KKyAqIEBwYXJhbSBkaXJlY3Rpb24gVGhlIGRpcmVjdGlvbiB0aGF0IHRoZSBSZWxheSBvYmplY3Qgd2lsbCBjb250cm9sLgorICovCitSZWxheTo6UmVsYXkodWludDMyX3QgY2hhbm5lbCwgUmVsYXk6OkRpcmVjdGlvbiBkaXJlY3Rpb24pCisJOiBtX2NoYW5uZWwgKGNoYW5uZWwpCisJLCBtX2RpcmVjdGlvbiAoZGlyZWN0aW9uKQoreworCUluaXRSZWxheSgpOworfQorCisvKioKKyAqIEZyZWUgdGhlIHJlc291cmNlIGFzc29jaWF0ZWQgd2l0aCBhIHJlbGF5LgorICogVGhlIHJlbGF5IGNoYW5uZWxzIGFyZSBzZXQgdG8gZnJlZSBhbmQgdGhlIHJlbGF5IG91dHB1dCBpcyB0dXJuZWQgb2ZmLgorICovCitSZWxheTo6flJlbGF5KCkKK3sKKworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlzZXRSZWxheUZvcndhcmQobV9yZWxheV9wb3J0c1ttX2NoYW5uZWxdLCBmYWxzZSwgJnN0YXR1cyk7CisJc2V0UmVsYXlSZXZlcnNlKG1fcmVsYXlfcG9ydHNbbV9jaGFubmVsXSwgZmFsc2UsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCisJaWYgKG1fZGlyZWN0aW9uID09IGtCb3RoRGlyZWN0aW9ucyB8fCBtX2RpcmVjdGlvbiA9PSBrRm9yd2FyZE9ubHkpCisJeworCQlyZWxheUNoYW5uZWxzLT5GcmVlKG1fY2hhbm5lbCAqIDIpOworCX0KKwlpZiAobV9kaXJlY3Rpb24gPT0ga0JvdGhEaXJlY3Rpb25zIHx8IG1fZGlyZWN0aW9uID09IGtSZXZlcnNlT25seSkKKwl7CisJCXJlbGF5Q2hhbm5lbHMtPkZyZWUobV9jaGFubmVsICogMiArIDEpOworCX0KK30KKworLyoqCisgKiBTZXQgdGhlIHJlbGF5IHN0YXRlLgorICoKKyAqIFZhbGlkIHZhbHVlcyBkZXBlbmQgb24gd2hpY2ggZGlyZWN0aW9ucyBvZiB0aGUgcmVsYXkgYXJlIGNvbnRyb2xsZWQgYnkgdGhlIG9iamVjdC4KKyAqCisgKiBXaGVuIHNldCB0byBrQm90aERpcmVjdGlvbnMsIHRoZSByZWxheSBjYW4gYmUgYW55IG9mIHRoZSBmb3VyIHN0YXRlczoKKyAqCSAwdi0wdiwgMHYtMTJ2LCAxMnYtMHYsIDEydi0xMnYKKyAqCisgKiBXaGVuIHNldCB0byBrRm9yd2FyZE9ubHkgb3Iga1JldmVyc2VPbmx5LCB5b3UgY2FuIHNwZWNpZnkgdGhlIGNvbnN0YW50IGZvciB0aGUKKyAqCSBkaXJlY3Rpb24gb3IgeW91IGNhbiBzaW1wbHkgc3BlY2lmeSBrT2ZmIGFuZCBrT24uICBVc2luZyBvbmx5IGtPZmYgYW5kIGtPbiBpcworICoJIHJlY29tbWVuZGVkLgorICoKKyAqIEBwYXJhbSB2YWx1ZSBUaGUgc3RhdGUgdG8gc2V0IHRoZSByZWxheS4KKyAqLwordm9pZCBSZWxheTo6U2V0KFJlbGF5OjpWYWx1ZSB2YWx1ZSkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisKKwlzd2l0Y2ggKHZhbHVlKQorCXsKKwljYXNlIGtPZmY6CisJCWlmIChtX2RpcmVjdGlvbiA9PSBrQm90aERpcmVjdGlvbnMgfHwgbV9kaXJlY3Rpb24gPT0ga0ZvcndhcmRPbmx5KQorCQl7CisJCQlzZXRSZWxheUZvcndhcmQobV9yZWxheV9wb3J0c1ttX2NoYW5uZWxdLCBmYWxzZSwgJnN0YXR1cyk7CisJCX0KKwkJaWYgKG1fZGlyZWN0aW9uID09IGtCb3RoRGlyZWN0aW9ucyB8fCBtX2RpcmVjdGlvbiA9PSBrUmV2ZXJzZU9ubHkpCisJCXsKKwkJCXNldFJlbGF5UmV2ZXJzZShtX3JlbGF5X3BvcnRzW21fY2hhbm5lbF0sIGZhbHNlLCAmc3RhdHVzKTsKKwkJfQorCQlicmVhazsKKwljYXNlIGtPbjoKKwkJaWYgKG1fZGlyZWN0aW9uID09IGtCb3RoRGlyZWN0aW9ucyB8fCBtX2RpcmVjdGlvbiA9PSBrRm9yd2FyZE9ubHkpCisJCXsKKwkJCXNldFJlbGF5Rm9yd2FyZChtX3JlbGF5X3BvcnRzW21fY2hhbm5lbF0sIHRydWUsICZzdGF0dXMpOworCQl9CisJCWlmIChtX2RpcmVjdGlvbiA9PSBrQm90aERpcmVjdGlvbnMgfHwgbV9kaXJlY3Rpb24gPT0ga1JldmVyc2VPbmx5KQorCQl7CisJCQlzZXRSZWxheVJldmVyc2UobV9yZWxheV9wb3J0c1ttX2NoYW5uZWxdLCB0cnVlLCAmc3RhdHVzKTsKKwkJfQorCQlicmVhazsKKwljYXNlIGtGb3J3YXJkOgorCQlpZiAobV9kaXJlY3Rpb24gPT0ga1JldmVyc2VPbmx5KQorCQl7CisJCQl3cGlfc2V0V1BJRXJyb3IoSW5jb21wYXRpYmxlTW9kZSk7CisJCQlicmVhazsKKwkJfQorCQlpZiAobV9kaXJlY3Rpb24gPT0ga0JvdGhEaXJlY3Rpb25zIHx8IG1fZGlyZWN0aW9uID09IGtGb3J3YXJkT25seSkKKwkJeworCQkJc2V0UmVsYXlGb3J3YXJkKG1fcmVsYXlfcG9ydHNbbV9jaGFubmVsXSwgdHJ1ZSwgJnN0YXR1cyk7CisJCX0KKwkJaWYgKG1fZGlyZWN0aW9uID09IGtCb3RoRGlyZWN0aW9ucykKKwkJeworCQkJc2V0UmVsYXlSZXZlcnNlKG1fcmVsYXlfcG9ydHNbbV9jaGFubmVsXSwgZmFsc2UsICZzdGF0dXMpOworCQl9CisJCWJyZWFrOworCWNhc2Uga1JldmVyc2U6CisJCWlmIChtX2RpcmVjdGlvbiA9PSBrRm9yd2FyZE9ubHkpCisJCXsKKwkJCXdwaV9zZXRXUElFcnJvcihJbmNvbXBhdGlibGVNb2RlKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChtX2RpcmVjdGlvbiA9PSBrQm90aERpcmVjdGlvbnMpCisJCXsKKwkJCXNldFJlbGF5Rm9yd2FyZChtX3JlbGF5X3BvcnRzW21fY2hhbm5lbF0sIGZhbHNlLCAmc3RhdHVzKTsKKwkJfQorCQlpZiAobV9kaXJlY3Rpb24gPT0ga0JvdGhEaXJlY3Rpb25zIHx8IG1fZGlyZWN0aW9uID09IGtSZXZlcnNlT25seSkKKwkJeworCQkJc2V0UmVsYXlSZXZlcnNlKG1fcmVsYXlfcG9ydHNbbV9jaGFubmVsXSwgdHJ1ZSwgJnN0YXR1cyk7CisJCX0KKwkJYnJlYWs7CisJfQorCisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogR2V0IHRoZSBSZWxheSBTdGF0ZQorICoKKyAqIEdldHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHJlbGF5LgorICoKKyAqIFdoZW4gc2V0IHRvIGtGb3J3YXJkT25seSBvciBrUmV2ZXJzZU9ubHksIHZhbHVlIGlzIHJldHVybmVkIGFzIGtPbi9rT2ZmIG5vdAorICoga0ZvcndhcmQva1JldmVyc2UgKHBlciB0aGUgcmVjb21tZW5kYXRpb24gaW4gU2V0KQorICoKKyAqIEByZXR1cm4gVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHJlbGF5IGFzIGEgUmVsYXk6OlZhbHVlCisgKi8KK1JlbGF5OjpWYWx1ZSBSZWxheTo6R2V0KCkgeworCWludDMyX3Qgc3RhdHVzOworCisJaWYoZ2V0UmVsYXlGb3J3YXJkKG1fcmVsYXlfcG9ydHNbbV9jaGFubmVsXSwgJnN0YXR1cykpIHsKKwkJaWYoZ2V0UmVsYXlSZXZlcnNlKG1fcmVsYXlfcG9ydHNbbV9jaGFubmVsXSwgJnN0YXR1cykpIHsKKwkJCXJldHVybiBrT247CisJCX0gZWxzZSB7CisJCQlpZihtX2RpcmVjdGlvbiA9PSBrRm9yd2FyZE9ubHkpIHsKKwkJCQlyZXR1cm4ga09uOworCQkJfSBlbHNlIHsKKwkJCXJldHVybiBrRm9yd2FyZDsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWlmKGdldFJlbGF5UmV2ZXJzZShtX3JlbGF5X3BvcnRzW21fY2hhbm5lbF0sICZzdGF0dXMpKSB7CisJCQlpZihtX2RpcmVjdGlvbiA9PSBrUmV2ZXJzZU9ubHkpIHsKKwkJCQlyZXR1cm4ga09uOworCQkJfSBlbHNlIHsKKwkJCXJldHVybiBrUmV2ZXJzZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJldHVybiBrT2ZmOworCQl9CisJfQorCisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1JvYm90QmFzZS5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1JvYm90QmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIyYzQzNQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvUm9ib3RCYXNlLmNwcApAQCAtMCwwICsxLDE2NiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiUm9ib3RCYXNlLmgiCisKKyNpbmNsdWRlICJEcml2ZXJTdGF0aW9uLmgiCisvLyNpbmNsdWRlICJOZXR3b3JrQ29tbXVuaWNhdGlvbi9GUkNDb21tLmgiCisvLyNpbmNsdWRlICJOZXR3b3JrQ29tbXVuaWNhdGlvbi9zeW1Nb2R1bGVMaW5rLmgiCisvLyNpbmNsdWRlICJOZXR3b3JrQ29tbXVuaWNhdGlvbi9Vc2FnZVJlcG9ydGluZy5oIgorI2luY2x1ZGUgIlJvYm90U3RhdGUuaCIKKyNpbmNsdWRlICJITFVzYWdlUmVwb3J0aW5nLmgiCisjaW5jbHVkZSAiSW50ZXJuYWwvSGFyZHdhcmVITFJlcG9ydGluZy5oIgorI2luY2x1ZGUgIlV0aWxpdHkuaCIKKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgIkhBTC9IQUwuaHBwIgorI2luY2x1ZGUgPGNzdGRpbz4KKworI2lmZGVmIF9fdnh3b3JrcworLy8gVlhXb3JrcyBuZWVkcyBzb20gc3BlY2lhbCB1bmxvYWRpbmcgY29kZQorI2luY2x1ZGUgPG1vZHVsZUxpYi5oPgorI2luY2x1ZGUgPHVubGRMaWIuaD4KKyNpbmNsdWRlIDx0YXNrTGliLmg+CisjZW5kaWYKKworUm9ib3RCYXNlKiBSb2JvdEJhc2U6Om1faW5zdGFuY2UgPSBOVUxMOworCit2b2lkIFJvYm90QmFzZTo6c2V0SW5zdGFuY2UoUm9ib3RCYXNlKiByb2JvdCkKK3sKKwl3cGlfYXNzZXJ0KG1faW5zdGFuY2UgPT0gTlVMTCk7CisJbV9pbnN0YW5jZSA9IHJvYm90OworfQorCitSb2JvdEJhc2UgJlJvYm90QmFzZTo6Z2V0SW5zdGFuY2UoKQoreworCXJldHVybiAqbV9pbnN0YW5jZTsKK30KKwordm9pZCBSb2JvdEJhc2U6OnJvYm90U2V0dXAoUm9ib3RCYXNlICpyb2JvdCkKK3sKKwlyb2JvdC0+UHJlc3RhcnQoKTsKKwlyb2JvdC0+U3RhcnRDb21wZXRpdGlvbigpOworfQorCisvKioKKyAqIENvbnN0cnVjdG9yIGZvciBhIGdlbmVyaWMgcm9ib3QgcHJvZ3JhbS4KKyAqIFVzZXIgY29kZSBzaG91bGQgYmUgcGxhY2VkIGluIHRoZSBjb25zdHJ1Y3RvciB0aGF0IHJ1bnMgYmVmb3JlIHRoZSBBdXRvbm9tb3VzIG9yIE9wZXJhdG9yCisgKiBDb250cm9sIHBlcmlvZCBzdGFydHMuIFRoZSBjb25zdHJ1Y3RvciB3aWxsIHJ1biB0byBjb21wbGV0aW9uIGJlZm9yZSBBdXRvbm9tb3VzIGlzIGVudGVyZWQuCisgKgorICogVGhpcyBtdXN0IGJlIHVzZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGNvbW11bmljYXRpb25zIGNvZGUgc3RhcnRzLiBJbiB0aGUgZnV0dXJlIGl0IHdvdWxkIGJlCisgKiBuaWNlIHRvIHB1dCB0aGlzIGNvZGUgaW50byBpdCdzIG93biB0YXNrIHRoYXQgbG9hZHMgb24gYm9vdCBzbyBlbnN1cmUgdGhhdCBpdCBydW5zLgorICovCitSb2JvdEJhc2U6OlJvYm90QmFzZSgpCisJOiBtX3Rhc2sgKE5VTEwpCisJLCBtX2RzIChOVUxMKQoreworCW1fZHMgPSBEcml2ZXJTdGF0aW9uOjpHZXRJbnN0YW5jZSgpOworCVJvYm90U3RhdGU6OlNldEltcGxlbWVudGF0aW9uKERyaXZlclN0YXRpb246OkdldEluc3RhbmNlKCkpOyBcCisJSExVc2FnZVJlcG9ydGluZzo6U2V0SW1wbGVtZW50YXRpb24obmV3IEhhcmR3YXJlSExSZXBvcnRpbmcoKSk7IFwKKworCVJvYm90QmFzZTo6c2V0SW5zdGFuY2UodGhpcyk7CisJCisJRklMRSAqZmlsZSA9IE5VTEw7CisJZmlsZSA9IGZvcGVuKCIvdG1wL2ZyY192ZXJzaW9ucy9GUkNfTGliX1ZlcnNpb24uaW5pIiwgInciKTsKKworCWZwdXRzKCIyMDE1IEMrKyAxLjAuMCAtIG1vZGlmaWVkIGJ5IEZSQyBUZWFtIDk3MSBTcGFydGFuIFJvYm90aWNzIiwgZmlsZSk7CisJaWYgKGZpbGUgIT0gTlVMTCkKKwlmY2xvc2UoZmlsZSk7Cit9CisKKy8qKgorICogRnJlZSB0aGUgcmVzb3VyY2VzIGZvciBhIFJvYm90QmFzZSBjbGFzcy4KKyAqIFRoaXMgaW5jbHVkZXMgZGVsZXRpbmcgYWxsIGNsYXNzZXMgdGhhdCBtaWdodCBoYXZlIGJlZW4gYWxsb2NhdGVkIGFzIFNpbmdsZXRvbnMgdG8gdGhleQorICogd291bGQgbmV2ZXIgYmUgZGVsZXRlZCBleGNlcHQgaGVyZS4KKyAqLworUm9ib3RCYXNlOjp+Um9ib3RCYXNlKCkKK3sKKwlTZW5zb3JCYXNlOjpEZWxldGVTaW5nbGV0b25zKCk7CisJZGVsZXRlIG1fdGFzazsKKwltX3Rhc2sgPSBOVUxMOworCW1faW5zdGFuY2UgPSBOVUxMOworfQorCisvKioKKyAqIERldGVybWluZSBpZiB0aGUgUm9ib3QgaXMgY3VycmVudGx5IGVuYWJsZWQuCisgKiBAcmV0dXJuIFRydWUgaWYgdGhlIFJvYm90IGlzIGN1cnJlbnRseSBlbmFibGVkIGJ5IHRoZSBmaWVsZCBjb250cm9scy4KKyAqLworYm9vbCBSb2JvdEJhc2U6OklzRW5hYmxlZCgpCit7CisJcmV0dXJuIG1fZHMtPklzRW5hYmxlZCgpOworfQorCisvKioKKyAqIERldGVybWluZSBpZiB0aGUgUm9ib3QgaXMgY3VycmVudGx5IGRpc2FibGVkLgorICogQHJldHVybiBUcnVlIGlmIHRoZSBSb2JvdCBpcyBjdXJyZW50bHkgZGlzYWJsZWQgYnkgdGhlIGZpZWxkIGNvbnRyb2xzLgorICovCitib29sIFJvYm90QmFzZTo6SXNEaXNhYmxlZCgpCit7CisJcmV0dXJuIG1fZHMtPklzRGlzYWJsZWQoKTsKK30KKworLyoqCisgKiBEZXRlcm1pbmUgaWYgdGhlIHJvYm90IGlzIGN1cnJlbnRseSBpbiBBdXRvbm9tb3VzIG1vZGUuCisgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvYm90IGlzIGN1cnJlbnRseSBvcGVyYXRpbmcgQXV0b25vbW91c2x5IGFzIGRldGVybWluZWQgYnkgdGhlIGZpZWxkIGNvbnRyb2xzLgorICovCitib29sIFJvYm90QmFzZTo6SXNBdXRvbm9tb3VzKCkKK3sKKwlyZXR1cm4gbV9kcy0+SXNBdXRvbm9tb3VzKCk7Cit9CisKKy8qKgorICogRGV0ZXJtaW5lIGlmIHRoZSByb2JvdCBpcyBjdXJyZW50bHkgaW4gT3BlcmF0b3IgQ29udHJvbCBtb2RlLgorICogQHJldHVybiBUcnVlIGlmIHRoZSByb2JvdCBpcyBjdXJyZW50bHkgb3BlcmF0aW5nIGluIFRlbGUtT3AgbW9kZSBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBmaWVsZCBjb250cm9scy4KKyAqLworYm9vbCBSb2JvdEJhc2U6OklzT3BlcmF0b3JDb250cm9sKCkKK3sKKwlyZXR1cm4gbV9kcy0+SXNPcGVyYXRvckNvbnRyb2woKTsKK30KKworLyoqCisgKiBEZXRlcm1pbmUgaWYgdGhlIHJvYm90IGlzIGN1cnJlbnRseSBpbiBUZXN0IG1vZGUuCisgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvYm90IGlzIGN1cnJlbnRseSBydW5uaW5nIHRlc3RzIGFzIGRldGVybWluZWQgYnkgdGhlIGZpZWxkIGNvbnRyb2xzLgorICovCitib29sIFJvYm90QmFzZTo6SXNUZXN0KCkKK3sKKyAgICByZXR1cm4gbV9kcy0+SXNUZXN0KCk7Cit9CisKKy8qKgorICogVGhpcyBob29rIGlzIGNhbGxlZCByaWdodCBiZWZvcmUgc3RhcnRDb21wZXRpdGlvbigpLiBCeSBkZWZhdWx0LCB0ZWxsIHRoZSBEUyB0aGF0IHRoZSByb2JvdCBpcyBub3cgcmVhZHkgdG8KKyAqIGJlIGVuYWJsZWQuIElmIHlvdSBkb24ndCB3YW50IGZvciB0aGUgcm9ib3QgdG8gYmUgZW5hYmxlZCB5ZXQsIHlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gZG8gbm90aGluZy4KKyAqIElmIHlvdSBkbyBzbywgeW91IHdpbGwgbmVlZCB0byBjYWxsIEhBTE5ldHdvcmtDb21tdW5pY2F0aW9uT2JzZXJ2ZVVzZXJQcm9ncmFtU3RhcnRpbmcoKSBmcm9tIHlvdXIgY29kZSB3aGVuCisgKiB5b3UgYXJlIHJlYWR5IGZvciB0aGUgcm9ib3QgdG8gYmUgZW5hYmxlZC4KKyAqLwordm9pZCBSb2JvdEJhc2U6OlByZXN0YXJ0KCkKK3sKKwlIQUxOZXR3b3JrQ29tbXVuaWNhdGlvbk9ic2VydmVVc2VyUHJvZ3JhbVN0YXJ0aW5nKCk7Cit9CisKKy8qKgorICogSW5kaWNhdGVzIGlmIG5ldyBkYXRhIGlzIGF2YWlsYWJsZSBmcm9tIHRoZSBkcml2ZXIgc3RhdGlvbi4KKyAqIEByZXR1cm4gSGFzIG5ldyBkYXRhIGFycml2ZWQgb3ZlciB0aGUgbmV0d29yayBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoaXMgZnVuY3Rpb24gd2FzIGNhbGxlZD8KKyAqLworYm9vbCBSb2JvdEJhc2U6OklzTmV3RGF0YUF2YWlsYWJsZSgpCit7CisJcmV0dXJuIG1fZHMtPklzTmV3Q29udHJvbERhdGEoKTsKK30KKworLyoqCisgKiBUaGlzIGNsYXNzIGV4aXN0cyBmb3IgdGhlIHNvbGUgcHVycG9zZSBvZiBnZXR0aW5nIGl0cyBkZXN0cnVjdG9yIGNhbGxlZCB3aGVuIHRoZSBtb2R1bGUgdW5sb2Fkcy4KKyAqIEJlZm9yZSB0aGUgbW9kdWxlIGlzIGRvbmUgdW5sb2FkaW5nLCB3ZSBuZWVkIHRvIGRlbGV0ZSB0aGUgUm9ib3RCYXNlIGRlcml2ZWQgc2luZ2xldG9uLiAgVGhpcyBzaG91bGQgZGVsZXRlCisgKiB0aGUgb3RoZXIgcmVtYWluaW5nIHNpbmdsZXRvbnMgdGhhdCB3ZXJlIHJlZ2lzdGVyZWQuICBUaGlzIHNob3VsZCBhbHNvIHN0b3AgYWxsIHRhc2tzIHRoYXQgYXJlIHVzaW5nCisgKiB0aGUgVGFzayBjbGFzcy4KKyAqLworY2xhc3MgUm9ib3REZWxldGVyCit7CitwdWJsaWM6CisJUm9ib3REZWxldGVyKCkge30KKwl+Um9ib3REZWxldGVyKCkKKwl7CisJCWRlbGV0ZSAmUm9ib3RCYXNlOjpnZXRJbnN0YW5jZSgpOworCX0KK307CitzdGF0aWMgUm9ib3REZWxldGVyIGdfcm9ib3REZWxldGVyOwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9Sb2JvdERyaXZlLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvUm9ib3REcml2ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ0NGNhMAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvUm9ib3REcml2ZS5jcHAKQEAgLTAsMCArMSw3NDAgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIlJvYm90RHJpdmUuaCIKKworI2luY2x1ZGUgIkNBTkphZ3Vhci5oIgorI2luY2x1ZGUgIkdlbmVyaWNISUQuaCIKKyNpbmNsdWRlICJKb3lzdGljay5oIgorI2luY2x1ZGUgIlRhbG9uLmgiCisvLyNpbmNsdWRlICJOZXR3b3JrQ29tbXVuaWNhdGlvbi9Vc2FnZVJlcG9ydGluZy5oIgorI2luY2x1ZGUgIlV0aWxpdHkuaCIKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyN1bmRlZiBtYXgKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKK2NvbnN0IGludDMyX3QgUm9ib3REcml2ZTo6a01heE51bWJlck9mTW90b3JzOworCisvKgorICogRHJpdmluZyBmdW5jdGlvbnMKKyAqIFRoZXNlIGZ1bmN0aW9ucyBwcm92aWRlIGFuIGludGVyZmFjZSB0byBtdWx0aXBsZSBtb3RvcnMgdGhhdCBpcyB1c2VkIGZvciBDIHByb2dyYW1taW5nCisgKiBUaGUgRHJpdmUoc3BlZWQsIGRpcmVjdGlvbikgZnVuY3Rpb24gaXMgdGhlIG1haW4gcGFydCBvZiB0aGUgc2V0IHRoYXQgbWFrZXMgaXQgZWFzeQorICogdG8gc2V0IHNwZWVkcyBhbmQgZGlyZWN0aW9uIGluZGVwZW5kZW50bHkgaW4gb25lIGNhbGwuCisgKi8KKworLyoqCisgKiBDb21tb24gZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSBhbGwgdGhlIHJvYm90IGRyaXZlIGNvbnN0cnVjdG9ycy4KKyAqIENyZWF0ZSBhIG1vdG9yIHNhZmV0eSBvYmplY3QgKHRoZSByZWFsIHJlYXNvbiBmb3IgdGhlIGNvbW1vbiBjb2RlKSBhbmQKKyAqIGluaXRpYWxpemUgYWxsIHRoZSBtb3RvciBhc3NpZ25tZW50cy4gVGhlIGRlZmF1bHQgdGltZW91dCBpcyBzZXQgZm9yIHRoZSByb2JvdCBkcml2ZS4KKyAqLwordm9pZCBSb2JvdERyaXZlOjpJbml0Um9ib3REcml2ZSgpIHsKKwltX2Zyb250TGVmdE1vdG9yID0gTlVMTDsKKwltX2Zyb250UmlnaHRNb3RvciA9IE5VTEw7CisJbV9yZWFyUmlnaHRNb3RvciA9IE5VTEw7CisJbV9yZWFyTGVmdE1vdG9yID0gTlVMTDsKKwltX3NlbnNpdGl2aXR5ID0gMC41OworCW1fbWF4T3V0cHV0ID0gMS4wOworCW1fc2FmZXR5SGVscGVyID0gbmV3IE1vdG9yU2FmZXR5SGVscGVyKHRoaXMpOworCW1fc2FmZXR5SGVscGVyLT5TZXRTYWZldHlFbmFibGVkKHRydWUpOworfQorCisvKiogCisgKiBDb25zdHJ1Y3RvciBmb3IgUm9ib3REcml2ZSB3aXRoIDIgbW90b3JzIHNwZWNpZmllZCB3aXRoIGNoYW5uZWwgbnVtYmVycy4KKyAqIFNldCB1cCBwYXJhbWV0ZXJzIGZvciBhIHR3byB3aGVlbCBkcml2ZSBzeXN0ZW0gd2hlcmUgdGhlCisgKiBsZWZ0IGFuZCByaWdodCBtb3RvciBwd20gY2hhbm5lbHMgYXJlIHNwZWNpZmllZCBpbiB0aGUgY2FsbC4KKyAqIFRoaXMgY2FsbCBhc3N1bWVzIFRhbG9ucyBmb3IgY29udHJvbGxpbmcgdGhlIG1vdG9ycy4KKyAqIEBwYXJhbSBsZWZ0TW90b3JDaGFubmVsIFRoZSBQV00gY2hhbm5lbCBudW1iZXIgdGhhdCBkcml2ZXMgdGhlIGxlZnQgbW90b3IuIDAtOSBhcmUgb24tYm9hcmQsIDEwLTE5IGFyZSBvbiB0aGUgTVhQIHBvcnQKKyAqIEBwYXJhbSByaWdodE1vdG9yQ2hhbm5lbCBUaGUgUFdNIGNoYW5uZWwgbnVtYmVyIHRoYXQgZHJpdmVzIHRoZSByaWdodCBtb3Rvci4gMC05IGFyZSBvbi1ib2FyZCwgMTAtMTkgYXJlIG9uIHRoZSBNWFAgcG9ydAorICovCitSb2JvdERyaXZlOjpSb2JvdERyaXZlKHVpbnQzMl90IGxlZnRNb3RvckNoYW5uZWwsIHVpbnQzMl90IHJpZ2h0TW90b3JDaGFubmVsKQoreworCUluaXRSb2JvdERyaXZlKCk7CisJbV9yZWFyTGVmdE1vdG9yID0gbmV3IFRhbG9uKGxlZnRNb3RvckNoYW5uZWwpOworCW1fcmVhclJpZ2h0TW90b3IgPSBuZXcgVGFsb24ocmlnaHRNb3RvckNoYW5uZWwpOworCWZvciAoaW50MzJfdCBpPTA7IGkgPCBrTWF4TnVtYmVyT2ZNb3RvcnM7IGkrKykKKwl7CisJCW1faW52ZXJ0ZWRNb3RvcnNbaV0gPSAxOworCX0KKwlTZXRMZWZ0UmlnaHRNb3Rvck91dHB1dHMoMC4wLCAwLjApOworCW1fZGVsZXRlU3BlZWRDb250cm9sbGVycyA9IHRydWU7Cit9CisKKy8qKgorICogQ29uc3RydWN0b3IgZm9yIFJvYm90RHJpdmUgd2l0aCA0IG1vdG9ycyBzcGVjaWZpZWQgd2l0aCBjaGFubmVsIG51bWJlcnMuCisgKiBTZXQgdXAgcGFyYW1ldGVycyBmb3IgYSBmb3VyIHdoZWVsIGRyaXZlIHN5c3RlbSB3aGVyZSBhbGwgZm91ciBtb3RvcgorICogcHdtIGNoYW5uZWxzIGFyZSBzcGVjaWZpZWQgaW4gdGhlIGNhbGwuCisgKiBUaGlzIGNhbGwgYXNzdW1lcyBUYWxvbnMgZm9yIGNvbnRyb2xsaW5nIHRoZSBtb3RvcnMuCisgKiBAcGFyYW0gZnJvbnRMZWZ0TW90b3IgRnJvbnQgbGVmdCBtb3RvciBjaGFubmVsIG51bWJlci4gMC05IGFyZSBvbi1ib2FyZCwgMTAtMTkgYXJlIG9uIHRoZSBNWFAgcG9ydAorICogQHBhcmFtIHJlYXJMZWZ0TW90b3IgUmVhciBMZWZ0IG1vdG9yIGNoYW5uZWwgbnVtYmVyLiAwLTkgYXJlIG9uLWJvYXJkLCAxMC0xOSBhcmUgb24gdGhlIE1YUCBwb3J0CisgKiBAcGFyYW0gZnJvbnRSaWdodE1vdG9yIEZyb250IHJpZ2h0IG1vdG9yIGNoYW5uZWwgbnVtYmVyLiAwLTkgYXJlIG9uLWJvYXJkLCAxMC0xOSBhcmUgb24gdGhlIE1YUCBwb3J0CisgKiBAcGFyYW0gcmVhclJpZ2h0TW90b3IgUmVhciBSaWdodCBtb3RvciBjaGFubmVsIG51bWJlci4gMC05IGFyZSBvbi1ib2FyZCwgMTAtMTkgYXJlIG9uIHRoZSBNWFAgcG9ydAorICovCitSb2JvdERyaXZlOjpSb2JvdERyaXZlKHVpbnQzMl90IGZyb250TGVmdE1vdG9yLCB1aW50MzJfdCByZWFyTGVmdE1vdG9yLAorCQl1aW50MzJfdCBmcm9udFJpZ2h0TW90b3IsIHVpbnQzMl90IHJlYXJSaWdodE1vdG9yKQoreworCUluaXRSb2JvdERyaXZlKCk7CisJbV9yZWFyTGVmdE1vdG9yID0gbmV3IFRhbG9uKHJlYXJMZWZ0TW90b3IpOworCW1fcmVhclJpZ2h0TW90b3IgPSBuZXcgVGFsb24ocmVhclJpZ2h0TW90b3IpOworCW1fZnJvbnRMZWZ0TW90b3IgPSBuZXcgVGFsb24oZnJvbnRMZWZ0TW90b3IpOworCW1fZnJvbnRSaWdodE1vdG9yID0gbmV3IFRhbG9uKGZyb250UmlnaHRNb3Rvcik7CisJZm9yIChpbnQzMl90IGk9MDsgaSA8IGtNYXhOdW1iZXJPZk1vdG9yczsgaSsrKQorCXsKKwkJbV9pbnZlcnRlZE1vdG9yc1tpXSA9IDE7CisJfQorCVNldExlZnRSaWdodE1vdG9yT3V0cHV0cygwLjAsIDAuMCk7CisJbV9kZWxldGVTcGVlZENvbnRyb2xsZXJzID0gdHJ1ZTsKK30KKworLyoqCisgKiBDb25zdHJ1Y3RvciBmb3IgUm9ib3REcml2ZSB3aXRoIDIgbW90b3JzIHNwZWNpZmllZCBhcyBTcGVlZENvbnRyb2xsZXIgb2JqZWN0cy4KKyAqIFRoZSBTcGVlZENvbnRyb2xsZXIgdmVyc2lvbiBvZiB0aGUgY29uc3RydWN0b3IgZW5hYmxlcyBwcm9ncmFtcyB0byB1c2UgdGhlIFJvYm90RHJpdmUgY2xhc3NlcyB3aXRoCisgKiBzdWJjbGFzc2VzIG9mIHRoZSBTcGVlZENvbnRyb2xsZXIgb2JqZWN0cywgZm9yIGV4YW1wbGUsIHZlcnNpb25zIHdpdGggcmFtcGluZyBvciByZXNoYXBpbmcgb2YKKyAqIHRoZSBjdXJ2ZSB0byBzdWl0IG1vdG9yIGJpYXMgb3IgZGVhZGJhbmQgZWxpbWluYXRpb24uCisgKiBAcGFyYW0gbGVmdE1vdG9yIFRoZSBsZWZ0IFNwZWVkQ29udHJvbGxlciBvYmplY3QgdXNlZCB0byBkcml2ZSB0aGUgcm9ib3QuIAorICogQHBhcmFtIHJpZ2h0TW90b3IgdGhlIHJpZ2h0IFNwZWVkQ29udHJvbGxlciBvYmplY3QgdXNlZCB0byBkcml2ZSB0aGUgcm9ib3QuCisgKi8KK1JvYm90RHJpdmU6OlJvYm90RHJpdmUoU3BlZWRDb250cm9sbGVyICpsZWZ0TW90b3IsIFNwZWVkQ29udHJvbGxlciAqcmlnaHRNb3RvcikKK3sKKwlJbml0Um9ib3REcml2ZSgpOworCWlmIChsZWZ0TW90b3IgPT0gTlVMTCB8fCByaWdodE1vdG9yID09IE5VTEwpCisJeworCQl3cGlfc2V0V1BJRXJyb3IoTnVsbFBhcmFtZXRlcik7CisJCW1fcmVhckxlZnRNb3RvciA9IG1fcmVhclJpZ2h0TW90b3IgPSBOVUxMOworCQlyZXR1cm47CisJfQorCW1fcmVhckxlZnRNb3RvciA9IGxlZnRNb3RvcjsKKwltX3JlYXJSaWdodE1vdG9yID0gcmlnaHRNb3RvcjsKKwlmb3IgKGludDMyX3QgaT0wOyBpIDwga01heE51bWJlck9mTW90b3JzOyBpKyspCisJeworCQltX2ludmVydGVkTW90b3JzW2ldID0gMTsKKwl9CisJbV9kZWxldGVTcGVlZENvbnRyb2xsZXJzID0gZmFsc2U7Cit9CisKK1JvYm90RHJpdmU6OlJvYm90RHJpdmUoU3BlZWRDb250cm9sbGVyICZsZWZ0TW90b3IsIFNwZWVkQ29udHJvbGxlciAmcmlnaHRNb3RvcikKK3sKKwlJbml0Um9ib3REcml2ZSgpOworCW1fcmVhckxlZnRNb3RvciA9ICZsZWZ0TW90b3I7CisJbV9yZWFyUmlnaHRNb3RvciA9ICZyaWdodE1vdG9yOworCWZvciAoaW50MzJfdCBpPTA7IGkgPCBrTWF4TnVtYmVyT2ZNb3RvcnM7IGkrKykKKwl7CisJCW1faW52ZXJ0ZWRNb3RvcnNbaV0gPSAxOworCX0KKwltX2RlbGV0ZVNwZWVkQ29udHJvbGxlcnMgPSBmYWxzZTsKK30KKworLyoqCisgKiBDb25zdHJ1Y3RvciBmb3IgUm9ib3REcml2ZSB3aXRoIDQgbW90b3JzIHNwZWNpZmllZCBhcyBTcGVlZENvbnRyb2xsZXIgb2JqZWN0cy4KKyAqIFNwZWVkIGNvbnRyb2xsZXIgaW5wdXQgdmVyc2lvbiBvZiBSb2JvdERyaXZlIChzZWUgcHJldmlvdXMgY29tbWVudHMpLgorICogQHBhcmFtIHJlYXJMZWZ0TW90b3IgVGhlIGJhY2sgbGVmdCBTcGVlZENvbnRyb2xsZXIgb2JqZWN0IHVzZWQgdG8gZHJpdmUgdGhlIHJvYm90LgorICogQHBhcmFtIGZyb250TGVmdE1vdG9yIFRoZSBmcm9udCBsZWZ0IFNwZWVkQ29udHJvbGxlciBvYmplY3QgdXNlZCB0byBkcml2ZSB0aGUgcm9ib3QKKyAqIEBwYXJhbSByZWFyUmlnaHRNb3RvciBUaGUgYmFjayByaWdodCBTcGVlZENvbnRyb2xsZXIgb2JqZWN0IHVzZWQgdG8gZHJpdmUgdGhlIHJvYm90LgorICogQHBhcmFtIGZyb250UmlnaHRNb3RvciBUaGUgZnJvbnQgcmlnaHQgU3BlZWRDb250cm9sbGVyIG9iamVjdCB1c2VkIHRvIGRyaXZlIHRoZSByb2JvdC4KKyAqLworUm9ib3REcml2ZTo6Um9ib3REcml2ZShTcGVlZENvbnRyb2xsZXIgKmZyb250TGVmdE1vdG9yLCBTcGVlZENvbnRyb2xsZXIgKnJlYXJMZWZ0TW90b3IsCisJCQkJCQlTcGVlZENvbnRyb2xsZXIgKmZyb250UmlnaHRNb3RvciwgU3BlZWRDb250cm9sbGVyICpyZWFyUmlnaHRNb3RvcikKK3sKKwlJbml0Um9ib3REcml2ZSgpOworCWlmIChmcm9udExlZnRNb3RvciA9PSBOVUxMIHx8IHJlYXJMZWZ0TW90b3IgPT0gTlVMTCB8fCBmcm9udFJpZ2h0TW90b3IgPT0gTlVMTCB8fCByZWFyUmlnaHRNb3RvciA9PSBOVUxMKQorCXsKKwkJd3BpX3NldFdQSUVycm9yKE51bGxQYXJhbWV0ZXIpOworCQlyZXR1cm47CisJfQorCW1fZnJvbnRMZWZ0TW90b3IgPSBmcm9udExlZnRNb3RvcjsKKwltX3JlYXJMZWZ0TW90b3IgPSByZWFyTGVmdE1vdG9yOworCW1fZnJvbnRSaWdodE1vdG9yID0gZnJvbnRSaWdodE1vdG9yOworCW1fcmVhclJpZ2h0TW90b3IgPSByZWFyUmlnaHRNb3RvcjsKKwlmb3IgKGludDMyX3QgaT0wOyBpIDwga01heE51bWJlck9mTW90b3JzOyBpKyspCisJeworCQltX2ludmVydGVkTW90b3JzW2ldID0gMTsKKwl9CisJbV9kZWxldGVTcGVlZENvbnRyb2xsZXJzID0gZmFsc2U7Cit9CisKK1JvYm90RHJpdmU6OlJvYm90RHJpdmUoU3BlZWRDb250cm9sbGVyICZmcm9udExlZnRNb3RvciwgU3BlZWRDb250cm9sbGVyICZyZWFyTGVmdE1vdG9yLAorCQkJCQkJU3BlZWRDb250cm9sbGVyICZmcm9udFJpZ2h0TW90b3IsIFNwZWVkQ29udHJvbGxlciAmcmVhclJpZ2h0TW90b3IpCit7CisJSW5pdFJvYm90RHJpdmUoKTsKKwltX2Zyb250TGVmdE1vdG9yID0gJmZyb250TGVmdE1vdG9yOworCW1fcmVhckxlZnRNb3RvciA9ICZyZWFyTGVmdE1vdG9yOworCW1fZnJvbnRSaWdodE1vdG9yID0gJmZyb250UmlnaHRNb3RvcjsKKwltX3JlYXJSaWdodE1vdG9yID0gJnJlYXJSaWdodE1vdG9yOworCWZvciAoaW50MzJfdCBpPTA7IGkgPCBrTWF4TnVtYmVyT2ZNb3RvcnM7IGkrKykKKwl7CisJCW1faW52ZXJ0ZWRNb3RvcnNbaV0gPSAxOworCX0KKwltX2RlbGV0ZVNwZWVkQ29udHJvbGxlcnMgPSBmYWxzZTsKK30KKworLyoqCisgKiBSb2JvdERyaXZlIGRlc3RydWN0b3IuCisgKiBEZWxldGVzIG1vdG9yIG9iamVjdHMgdGhhdCB3ZXJlIG5vdCBwYXNzZWQgaW4gYW5kIGNyZWF0ZWQgaW50ZXJuYWxseSBvbmx5LgorICoqLworUm9ib3REcml2ZTo6flJvYm90RHJpdmUoKQoreworCWlmIChtX2RlbGV0ZVNwZWVkQ29udHJvbGxlcnMpCisJeworCQlkZWxldGUgbV9mcm9udExlZnRNb3RvcjsKKwkJZGVsZXRlIG1fcmVhckxlZnRNb3RvcjsKKwkJZGVsZXRlIG1fZnJvbnRSaWdodE1vdG9yOworCQlkZWxldGUgbV9yZWFyUmlnaHRNb3RvcjsKKwl9CisJZGVsZXRlIG1fc2FmZXR5SGVscGVyOworfQorCisvKioKKyAqIERyaXZlIHRoZSBtb3RvcnMgYXQgInNwZWVkIiBhbmQgImN1cnZlIi4KKyAqCisgKiBUaGUgc3BlZWQgYW5kIGN1cnZlIGFyZSAtMS4wIHRvICsxLjAgdmFsdWVzIHdoZXJlIDAuMCByZXByZXNlbnRzIHN0b3BwZWQgYW5kCisgKiBub3QgdHVybmluZy4gVGhlIGFsZ29yaXRobSBmb3IgYWRkaW5nIGluIHRoZSBkaXJlY3Rpb24gYXR0ZW1wdHMgdG8gcHJvdmlkZSBhIGNvbnN0YW50CisgKiB0dXJuIHJhZGl1cyBmb3IgZGlmZmVyaW5nIHNwZWVkcy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgbW9zdCBsaWtlbHkgYmUgdXNlZCBpbiBhbiBhdXRvbm9tb3VzIHJvdXRpbmUuCisgKgorICogQHBhcmFtIG91dHB1dE1hZ25pdHVkZSBUaGUgZm9yd2FyZCBjb21wb25lbnQgb2YgdGhlIG91dHB1dCBtYWduaXR1ZGUgdG8gc2VuZCB0byB0aGUgbW90b3JzLgorICogQHBhcmFtIGN1cnZlIFRoZSByYXRlIG9mIHR1cm4sIGNvbnN0YW50IGZvciBkaWZmZXJlbnQgZm9yd2FyZCBzcGVlZHMuCisgKi8KK3ZvaWQgUm9ib3REcml2ZTo6RHJpdmUoZmxvYXQgb3V0cHV0TWFnbml0dWRlLCBmbG9hdCBjdXJ2ZSkKK3sKKwlmbG9hdCBsZWZ0T3V0cHV0LCByaWdodE91dHB1dDsKKwlzdGF0aWMgYm9vbCByZXBvcnRlZCA9IGZhbHNlOworCWlmICghcmVwb3J0ZWQpCisJeworCQlIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfUm9ib3REcml2ZSwgR2V0TnVtTW90b3JzKCksIEhBTFVzYWdlUmVwb3J0aW5nOjprUm9ib3REcml2ZV9BcmNhZGVSYXRpb0N1cnZlKTsKKwkJcmVwb3J0ZWQgPSB0cnVlOworCX0KKworCWlmIChjdXJ2ZSA8IDApCisJeworCQlmbG9hdCB2YWx1ZSA9IGxvZygtY3VydmUpOworCQlmbG9hdCByYXRpbyA9ICh2YWx1ZSAtIG1fc2Vuc2l0aXZpdHkpLyh2YWx1ZSArIG1fc2Vuc2l0aXZpdHkpOworCQlpZiAocmF0aW8gPT0gMCkgcmF0aW8gPS4wMDAwMDAwMDAxOworCQlsZWZ0T3V0cHV0ID0gb3V0cHV0TWFnbml0dWRlIC8gcmF0aW87CisJCXJpZ2h0T3V0cHV0ID0gb3V0cHV0TWFnbml0dWRlOworCX0KKwllbHNlIGlmIChjdXJ2ZSA+IDApCisJeworCQlmbG9hdCB2YWx1ZSA9IGxvZyhjdXJ2ZSk7CisJCWZsb2F0IHJhdGlvID0gKHZhbHVlIC0gbV9zZW5zaXRpdml0eSkvKHZhbHVlICsgbV9zZW5zaXRpdml0eSk7CisJCWlmIChyYXRpbyA9PSAwKSByYXRpbyA9LjAwMDAwMDAwMDE7CisJCWxlZnRPdXRwdXQgPSBvdXRwdXRNYWduaXR1ZGU7CisJCXJpZ2h0T3V0cHV0ID0gb3V0cHV0TWFnbml0dWRlIC8gcmF0aW87CisJfQorCWVsc2UKKwl7CisJCWxlZnRPdXRwdXQgPSBvdXRwdXRNYWduaXR1ZGU7CisJCXJpZ2h0T3V0cHV0ID0gb3V0cHV0TWFnbml0dWRlOworCX0KKwlTZXRMZWZ0UmlnaHRNb3Rvck91dHB1dHMobGVmdE91dHB1dCwgcmlnaHRPdXRwdXQpOworfQorCisvKioKKyAqIFByb3ZpZGUgdGFuayBzdGVlcmluZyB1c2luZyB0aGUgc3RvcmVkIHJvYm90IGNvbmZpZ3VyYXRpb24uCisgKiBEcml2ZSB0aGUgcm9ib3QgdXNpbmcgdHdvIGpveXN0aWNrIGlucHV0cy4gVGhlIFktYXhpcyB3aWxsIGJlIHNlbGVjdGVkIGZyb20KKyAqIGVhY2ggSm95c3RpY2sgb2JqZWN0LgorICogQHBhcmFtIGxlZnRTdGljayBUaGUgam95c3RpY2sgdG8gY29udHJvbCB0aGUgbGVmdCBzaWRlIG9mIHRoZSByb2JvdC4KKyAqIEBwYXJhbSByaWdodFN0aWNrIFRoZSBqb3lzdGljayB0byBjb250cm9sIHRoZSByaWdodCBzaWRlIG9mIHRoZSByb2JvdC4KKyAqLwordm9pZCBSb2JvdERyaXZlOjpUYW5rRHJpdmUoR2VuZXJpY0hJRCAqbGVmdFN0aWNrLCBHZW5lcmljSElEICpyaWdodFN0aWNrLCBib29sIHNxdWFyZWRJbnB1dHMpCit7CisJaWYgKGxlZnRTdGljayA9PSBOVUxMIHx8IHJpZ2h0U3RpY2sgPT0gTlVMTCkKKwl7CisJCXdwaV9zZXRXUElFcnJvcihOdWxsUGFyYW1ldGVyKTsKKwkJcmV0dXJuOworCX0KKwlUYW5rRHJpdmUobGVmdFN0aWNrLT5HZXRZKCksIHJpZ2h0U3RpY2stPkdldFkoKSwgc3F1YXJlZElucHV0cyk7Cit9CisKK3ZvaWQgUm9ib3REcml2ZTo6VGFua0RyaXZlKEdlbmVyaWNISUQgJmxlZnRTdGljaywgR2VuZXJpY0hJRCAmcmlnaHRTdGljaywgYm9vbCBzcXVhcmVkSW5wdXRzKQoreworCVRhbmtEcml2ZShsZWZ0U3RpY2suR2V0WSgpLCByaWdodFN0aWNrLkdldFkoKSwgc3F1YXJlZElucHV0cyk7Cit9CisKKy8qKgorICogUHJvdmlkZSB0YW5rIHN0ZWVyaW5nIHVzaW5nIHRoZSBzdG9yZWQgcm9ib3QgY29uZmlndXJhdGlvbi4KKyAqIFRoaXMgZnVuY3Rpb24gbGV0cyB5b3UgcGljayB0aGUgYXhpcyB0byBiZSB1c2VkIG9uIGVhY2ggSm95c3RpY2sgb2JqZWN0IGZvciB0aGUgbGVmdAorICogYW5kIHJpZ2h0IHNpZGVzIG9mIHRoZSByb2JvdC4KKyAqIEBwYXJhbSBsZWZ0U3RpY2sgVGhlIEpveXN0aWNrIG9iamVjdCB0byB1c2UgZm9yIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIHJvYm90LgorICogQHBhcmFtIGxlZnRBeGlzIFRoZSBheGlzIHRvIHNlbGVjdCBvbiB0aGUgbGVmdCBzaWRlIEpveXN0aWNrIG9iamVjdC4KKyAqIEBwYXJhbSByaWdodFN0aWNrIFRoZSBKb3lzdGljayBvYmplY3QgdG8gdXNlIGZvciB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgcm9ib3QuCisgKiBAcGFyYW0gcmlnaHRBeGlzIFRoZSBheGlzIHRvIHNlbGVjdCBvbiB0aGUgcmlnaHQgc2lkZSBKb3lzdGljayBvYmplY3QuCisgKi8KK3ZvaWQgUm9ib3REcml2ZTo6VGFua0RyaXZlKEdlbmVyaWNISUQgKmxlZnRTdGljaywgdWludDMyX3QgbGVmdEF4aXMsCisJCUdlbmVyaWNISUQgKnJpZ2h0U3RpY2ssIHVpbnQzMl90IHJpZ2h0QXhpcywgYm9vbCBzcXVhcmVkSW5wdXRzKQoreworCWlmIChsZWZ0U3RpY2sgPT0gTlVMTCB8fCByaWdodFN0aWNrID09IE5VTEwpCisJeworCQl3cGlfc2V0V1BJRXJyb3IoTnVsbFBhcmFtZXRlcik7CisJCXJldHVybjsKKwl9CisJVGFua0RyaXZlKGxlZnRTdGljay0+R2V0UmF3QXhpcyhsZWZ0QXhpcyksIHJpZ2h0U3RpY2stPkdldFJhd0F4aXMocmlnaHRBeGlzKSwgc3F1YXJlZElucHV0cyk7Cit9CisKK3ZvaWQgUm9ib3REcml2ZTo6VGFua0RyaXZlKEdlbmVyaWNISUQgJmxlZnRTdGljaywgdWludDMyX3QgbGVmdEF4aXMsCisJCUdlbmVyaWNISUQgJnJpZ2h0U3RpY2ssIHVpbnQzMl90IHJpZ2h0QXhpcywgYm9vbCBzcXVhcmVkSW5wdXRzKQoreworCVRhbmtEcml2ZShsZWZ0U3RpY2suR2V0UmF3QXhpcyhsZWZ0QXhpcyksIHJpZ2h0U3RpY2suR2V0UmF3QXhpcyhyaWdodEF4aXMpLCBzcXVhcmVkSW5wdXRzKTsKK30KKworCisvKioKKyAqIFByb3ZpZGUgdGFuayBzdGVlcmluZyB1c2luZyB0aGUgc3RvcmVkIHJvYm90IGNvbmZpZ3VyYXRpb24uCisgKiBUaGlzIGZ1bmN0aW9uIGxldHMgeW91IGRpcmVjdGx5IHByb3ZpZGUgam95c3RpY2sgdmFsdWVzIGZyb20gYW55IHNvdXJjZS4KKyAqIEBwYXJhbSBsZWZ0VmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBsZWZ0IHN0aWNrLgorICogQHBhcmFtIHJpZ2h0VmFsdWUgVGhlIHZhbHVlIG9mIHRoZSByaWdodCBzdGljay4KKyAqLwordm9pZCBSb2JvdERyaXZlOjpUYW5rRHJpdmUoZmxvYXQgbGVmdFZhbHVlLCBmbG9hdCByaWdodFZhbHVlLCBib29sIHNxdWFyZWRJbnB1dHMpCit7CisJc3RhdGljIGJvb2wgcmVwb3J0ZWQgPSBmYWxzZTsKKwlpZiAoIXJlcG9ydGVkKQorCXsKKwkJSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX1JvYm90RHJpdmUsIEdldE51bU1vdG9ycygpLCBIQUxVc2FnZVJlcG9ydGluZzo6a1JvYm90RHJpdmVfVGFuayk7CisJCXJlcG9ydGVkID0gdHJ1ZTsKKwl9CisKKwkvLyBzcXVhcmUgdGhlIGlucHV0cyAod2hpbGUgcHJlc2VydmluZyB0aGUgc2lnbikgdG8gaW5jcmVhc2UgZmluZSBjb250cm9sIHdoaWxlIHBlcm1pdHRpbmcgZnVsbCBwb3dlcgorCWxlZnRWYWx1ZSA9IExpbWl0KGxlZnRWYWx1ZSk7CisJcmlnaHRWYWx1ZSA9IExpbWl0KHJpZ2h0VmFsdWUpOworCWlmKHNxdWFyZWRJbnB1dHMpCisJeworCQlpZiAobGVmdFZhbHVlID49IDAuMCkKKwkJeworCQkJbGVmdFZhbHVlID0gKGxlZnRWYWx1ZSAqIGxlZnRWYWx1ZSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlsZWZ0VmFsdWUgPSAtKGxlZnRWYWx1ZSAqIGxlZnRWYWx1ZSk7CisJCX0KKwkJaWYgKHJpZ2h0VmFsdWUgPj0gMC4wKQorCQl7CisJCQlyaWdodFZhbHVlID0gKHJpZ2h0VmFsdWUgKiByaWdodFZhbHVlKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJpZ2h0VmFsdWUgPSAtKHJpZ2h0VmFsdWUgKiByaWdodFZhbHVlKTsKKwkJfQorCX0KKworCVNldExlZnRSaWdodE1vdG9yT3V0cHV0cyhsZWZ0VmFsdWUsIHJpZ2h0VmFsdWUpOworfQorCisvKioKKyAqIEFyY2FkZSBkcml2ZSBpbXBsZW1lbnRzIHNpbmdsZSBzdGljayBkcml2aW5nLgorICogR2l2ZW4gYSBzaW5nbGUgSm95c3RpY2ssIHRoZSBjbGFzcyBhc3N1bWVzIHRoZSBZIGF4aXMgZm9yIHRoZSBtb3ZlIHZhbHVlIGFuZCB0aGUgWCBheGlzCisgKiBmb3IgdGhlIHJvdGF0ZSB2YWx1ZS4KKyAqIChTaG91bGQgYWRkIG1vcmUgaW5mb3JtYXRpb24gaGVyZSByZWdhcmRpbmcgdGhlIHdheSB0aGF0IGFyY2FkZSBkcml2ZSB3b3Jrcy4pCisgKiBAcGFyYW0gc3RpY2sgVGhlIGpveXN0aWNrIHRvIHVzZSBmb3IgQXJjYWRlIHNpbmdsZS1zdGljayBkcml2aW5nLiBUaGUgWS1heGlzIHdpbGwgYmUgc2VsZWN0ZWQKKyAqIGZvciBmb3J3YXJkcy9iYWNrd2FyZHMgYW5kIHRoZSBYLWF4aXMgd2lsbCBiZSBzZWxlY3RlZCBmb3Igcm90YXRpb24gcmF0ZS4KKyAqIEBwYXJhbSBzcXVhcmVkSW5wdXRzIElmIHRydWUsIHRoZSBzZW5zaXRpdml0eSB3aWxsIGJlIGluY3JlYXNlZCBmb3Igc21hbGwgdmFsdWVzCisgKi8KK3ZvaWQgUm9ib3REcml2ZTo6QXJjYWRlRHJpdmUoR2VuZXJpY0hJRCAqc3RpY2ssIGJvb2wgc3F1YXJlZElucHV0cykKK3sKKwkvLyBzaW1wbHkgY2FsbCB0aGUgZnVsbC1mZWF0dXJlZCBBcmNhZGVEcml2ZSB3aXRoIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZXMKKwlBcmNhZGVEcml2ZShzdGljay0+R2V0WSgpLCBzdGljay0+R2V0WCgpLCBzcXVhcmVkSW5wdXRzKTsKK30KKworLyoqCisgKiBBcmNhZGUgZHJpdmUgaW1wbGVtZW50cyBzaW5nbGUgc3RpY2sgZHJpdmluZy4KKyAqIEdpdmVuIGEgc2luZ2xlIEpveXN0aWNrLCB0aGUgY2xhc3MgYXNzdW1lcyB0aGUgWSBheGlzIGZvciB0aGUgbW92ZSB2YWx1ZSBhbmQgdGhlIFggYXhpcworICogZm9yIHRoZSByb3RhdGUgdmFsdWUuCisgKiAoU2hvdWxkIGFkZCBtb3JlIGluZm9ybWF0aW9uIGhlcmUgcmVnYXJkaW5nIHRoZSB3YXkgdGhhdCBhcmNhZGUgZHJpdmUgd29ya3MuKQorICogQHBhcmFtIHN0aWNrIFRoZSBqb3lzdGljayB0byB1c2UgZm9yIEFyY2FkZSBzaW5nbGUtc3RpY2sgZHJpdmluZy4gVGhlIFktYXhpcyB3aWxsIGJlIHNlbGVjdGVkCisgKiBmb3IgZm9yd2FyZHMvYmFja3dhcmRzIGFuZCB0aGUgWC1heGlzIHdpbGwgYmUgc2VsZWN0ZWQgZm9yIHJvdGF0aW9uIHJhdGUuCisgKiBAcGFyYW0gc3F1YXJlZElucHV0cyBJZiB0cnVlLCB0aGUgc2Vuc2l0aXZpdHkgd2lsbCBiZSBpbmNyZWFzZWQgZm9yIHNtYWxsIHZhbHVlcworICovCit2b2lkIFJvYm90RHJpdmU6OkFyY2FkZURyaXZlKEdlbmVyaWNISUQgJnN0aWNrLCBib29sIHNxdWFyZWRJbnB1dHMpCit7CisJLy8gc2ltcGx5IGNhbGwgdGhlIGZ1bGwtZmVhdHVyZWQgQXJjYWRlRHJpdmUgd2l0aCB0aGUgYXBwcm9wcmlhdGUgdmFsdWVzCisJQXJjYWRlRHJpdmUoc3RpY2suR2V0WSgpLCBzdGljay5HZXRYKCksIHNxdWFyZWRJbnB1dHMpOworfQorCisvKioKKyAqIEFyY2FkZSBkcml2ZSBpbXBsZW1lbnRzIHNpbmdsZSBzdGljayBkcml2aW5nLgorICogR2l2ZW4gdHdvIGpveXN0aWNrIGluc3RhbmNlcyBhbmQgdHdvIGF4aXMsIGNvbXB1dGUgdGhlIHZhbHVlcyB0byBzZW5kIHRvIGVpdGhlciB0d28KKyAqIG9yIGZvdXIgbW90b3JzLgorICogQHBhcmFtIG1vdmVTdGljayBUaGUgSm95c3RpY2sgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgZm9yd2FyZC9iYWNrd2FyZCBkaXJlY3Rpb24KKyAqIEBwYXJhbSBtb3ZlQXhpcyBUaGUgYXhpcyBvbiB0aGUgbW92ZVN0aWNrIG9iamVjdCB0byB1c2UgZm9yIGZvd2FyZHMvYmFja3dhcmRzICh0eXBpY2FsbHkgWV9BWElTKQorICogQHBhcmFtIHJvdGF0ZVN0aWNrIFRoZSBKb3lzdGljayBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSByb3RhdGlvbiB2YWx1ZQorICogQHBhcmFtIHJvdGF0ZUF4aXMgVGhlIGF4aXMgb24gdGhlIHJvdGF0aW9uIG9iamVjdCB0byB1c2UgZm9yIHRoZSByb3RhdGUgcmlnaHQvbGVmdCAodHlwaWNhbGx5IFhfQVhJUykKKyAqIEBwYXJhbSBzcXVhcmVkSW5wdXRzIFNldHRpbmcgdGhpcyBwYXJhbWV0ZXIgdG8gdHJ1ZSBpbmNyZWFzZXMgdGhlIHNlbnNpdGl2aXR5IGF0IGxvd2VyIHNwZWVkcworICovCit2b2lkIFJvYm90RHJpdmU6OkFyY2FkZURyaXZlKEdlbmVyaWNISUQqIG1vdmVTdGljaywgdWludDMyX3QgbW92ZUF4aXMsCisJCQkJCQkJCUdlbmVyaWNISUQqIHJvdGF0ZVN0aWNrLCB1aW50MzJfdCByb3RhdGVBeGlzLAorCQkJCQkJCQlib29sIHNxdWFyZWRJbnB1dHMpCit7CisJZmxvYXQgbW92ZVZhbHVlID0gbW92ZVN0aWNrLT5HZXRSYXdBeGlzKG1vdmVBeGlzKTsKKwlmbG9hdCByb3RhdGVWYWx1ZSA9IHJvdGF0ZVN0aWNrLT5HZXRSYXdBeGlzKHJvdGF0ZUF4aXMpOworCisJQXJjYWRlRHJpdmUobW92ZVZhbHVlLCByb3RhdGVWYWx1ZSwgc3F1YXJlZElucHV0cyk7Cit9CisKKy8qKgorICogQXJjYWRlIGRyaXZlIGltcGxlbWVudHMgc2luZ2xlIHN0aWNrIGRyaXZpbmcuCisgKiBHaXZlbiB0d28gam95c3RpY2sgaW5zdGFuY2VzIGFuZCB0d28gYXhpcywgY29tcHV0ZSB0aGUgdmFsdWVzIHRvIHNlbmQgdG8gZWl0aGVyIHR3bworICogb3IgZm91ciBtb3RvcnMuCisgKiBAcGFyYW0gbW92ZVN0aWNrIFRoZSBKb3lzdGljayBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBmb3J3YXJkL2JhY2t3YXJkIGRpcmVjdGlvbgorICogQHBhcmFtIG1vdmVBeGlzIFRoZSBheGlzIG9uIHRoZSBtb3ZlU3RpY2sgb2JqZWN0IHRvIHVzZSBmb3IgZm93YXJkcy9iYWNrd2FyZHMgKHR5cGljYWxseSBZX0FYSVMpCisgKiBAcGFyYW0gcm90YXRlU3RpY2sgVGhlIEpveXN0aWNrIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHJvdGF0aW9uIHZhbHVlCisgKiBAcGFyYW0gcm90YXRlQXhpcyBUaGUgYXhpcyBvbiB0aGUgcm90YXRpb24gb2JqZWN0IHRvIHVzZSBmb3IgdGhlIHJvdGF0ZSByaWdodC9sZWZ0ICh0eXBpY2FsbHkgWF9BWElTKQorICogQHBhcmFtIHNxdWFyZWRJbnB1dHMgU2V0dGluZyB0aGlzIHBhcmFtZXRlciB0byB0cnVlIGluY3JlYXNlcyB0aGUgc2Vuc2l0aXZpdHkgYXQgbG93ZXIgc3BlZWRzCisgKi8KKwordm9pZCBSb2JvdERyaXZlOjpBcmNhZGVEcml2ZShHZW5lcmljSElEICZtb3ZlU3RpY2ssIHVpbnQzMl90IG1vdmVBeGlzLAorCQkJCQkJCQlHZW5lcmljSElEICZyb3RhdGVTdGljaywgdWludDMyX3Qgcm90YXRlQXhpcywKKwkJCQkJCQkJYm9vbCBzcXVhcmVkSW5wdXRzKQoreworCWZsb2F0IG1vdmVWYWx1ZSA9IG1vdmVTdGljay5HZXRSYXdBeGlzKG1vdmVBeGlzKTsKKwlmbG9hdCByb3RhdGVWYWx1ZSA9IHJvdGF0ZVN0aWNrLkdldFJhd0F4aXMocm90YXRlQXhpcyk7CisKKwlBcmNhZGVEcml2ZShtb3ZlVmFsdWUsIHJvdGF0ZVZhbHVlLCBzcXVhcmVkSW5wdXRzKTsKK30KKworLyoqCisgKiBBcmNhZGUgZHJpdmUgaW1wbGVtZW50cyBzaW5nbGUgc3RpY2sgZHJpdmluZy4KKyAqIFRoaXMgZnVuY3Rpb24gbGV0cyB5b3UgZGlyZWN0bHkgcHJvdmlkZSBqb3lzdGljayB2YWx1ZXMgZnJvbSBhbnkgc291cmNlLgorICogQHBhcmFtIG1vdmVWYWx1ZSBUaGUgdmFsdWUgdG8gdXNlIGZvciBmb3dhcmRzL2JhY2t3YXJkcworICogQHBhcmFtIHJvdGF0ZVZhbHVlIFRoZSB2YWx1ZSB0byB1c2UgZm9yIHRoZSByb3RhdGUgcmlnaHQvbGVmdAorICogQHBhcmFtIHNxdWFyZWRJbnB1dHMgSWYgc2V0LCBpbmNyZWFzZXMgdGhlIHNlbnNpdGl2aXR5IGF0IGxvdyBzcGVlZHMKKyAqLwordm9pZCBSb2JvdERyaXZlOjpBcmNhZGVEcml2ZShmbG9hdCBtb3ZlVmFsdWUsIGZsb2F0IHJvdGF0ZVZhbHVlLCBib29sIHNxdWFyZWRJbnB1dHMpCit7CisJc3RhdGljIGJvb2wgcmVwb3J0ZWQgPSBmYWxzZTsKKwlpZiAoIXJlcG9ydGVkKQorCXsKKwkJSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX1JvYm90RHJpdmUsIEdldE51bU1vdG9ycygpLCBIQUxVc2FnZVJlcG9ydGluZzo6a1JvYm90RHJpdmVfQXJjYWRlU3RhbmRhcmQpOworCQlyZXBvcnRlZCA9IHRydWU7CisJfQorCisJLy8gbG9jYWwgdmFyaWFibGVzIHRvIGhvbGQgdGhlIGNvbXB1dGVkIFBXTSB2YWx1ZXMgZm9yIHRoZSBtb3RvcnMKKwlmbG9hdCBsZWZ0TW90b3JPdXRwdXQ7CisJZmxvYXQgcmlnaHRNb3Rvck91dHB1dDsKKworCW1vdmVWYWx1ZSA9IExpbWl0KG1vdmVWYWx1ZSk7CisJcm90YXRlVmFsdWUgPSBMaW1pdChyb3RhdGVWYWx1ZSk7CisKKwlpZiAoc3F1YXJlZElucHV0cykKKwl7CisJCS8vIHNxdWFyZSB0aGUgaW5wdXRzICh3aGlsZSBwcmVzZXJ2aW5nIHRoZSBzaWduKSB0byBpbmNyZWFzZSBmaW5lIGNvbnRyb2wgd2hpbGUgcGVybWl0dGluZyBmdWxsIHBvd2VyCisJCWlmIChtb3ZlVmFsdWUgPj0gMC4wKQorCQl7CisJCQltb3ZlVmFsdWUgPSAobW92ZVZhbHVlICogbW92ZVZhbHVlKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW1vdmVWYWx1ZSA9IC0obW92ZVZhbHVlICogbW92ZVZhbHVlKTsKKwkJfQorCQlpZiAocm90YXRlVmFsdWUgPj0gMC4wKQorCQl7CisJCQlyb3RhdGVWYWx1ZSA9IChyb3RhdGVWYWx1ZSAqIHJvdGF0ZVZhbHVlKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJvdGF0ZVZhbHVlID0gLShyb3RhdGVWYWx1ZSAqIHJvdGF0ZVZhbHVlKTsKKwkJfQorCX0KKworCWlmIChtb3ZlVmFsdWUgPiAwLjApCisJeworCQlpZiAocm90YXRlVmFsdWUgPiAwLjApCisJCXsKKwkJCWxlZnRNb3Rvck91dHB1dCA9IG1vdmVWYWx1ZSAtIHJvdGF0ZVZhbHVlOworCQkJcmlnaHRNb3Rvck91dHB1dCA9IHN0ZDo6bWF4KG1vdmVWYWx1ZSwgcm90YXRlVmFsdWUpOworCQl9CisJCWVsc2UKKwkJeworCQkJbGVmdE1vdG9yT3V0cHV0ID0gc3RkOjptYXgobW92ZVZhbHVlLCAtcm90YXRlVmFsdWUpOworCQkJcmlnaHRNb3Rvck91dHB1dCA9IG1vdmVWYWx1ZSArIHJvdGF0ZVZhbHVlOworCQl9CisJfQorCWVsc2UKKwl7CisJCWlmIChyb3RhdGVWYWx1ZSA+IDAuMCkKKwkJeworCQkJbGVmdE1vdG9yT3V0cHV0ID0gLSBzdGQ6Om1heCgtbW92ZVZhbHVlLCByb3RhdGVWYWx1ZSk7CisJCQlyaWdodE1vdG9yT3V0cHV0ID0gbW92ZVZhbHVlICsgcm90YXRlVmFsdWU7CisJCX0KKwkJZWxzZQorCQl7CisJCQlsZWZ0TW90b3JPdXRwdXQgPSBtb3ZlVmFsdWUgLSByb3RhdGVWYWx1ZTsKKwkJCXJpZ2h0TW90b3JPdXRwdXQgPSAtIHN0ZDo6bWF4KC1tb3ZlVmFsdWUsIC1yb3RhdGVWYWx1ZSk7CisJCX0KKwl9CisJU2V0TGVmdFJpZ2h0TW90b3JPdXRwdXRzKGxlZnRNb3Rvck91dHB1dCwgcmlnaHRNb3Rvck91dHB1dCk7Cit9CisKKy8qKgorICogRHJpdmUgbWV0aG9kIGZvciBNZWNhbnVtIHdoZWVsZWQgcm9ib3RzLgorICoKKyAqIEEgbWV0aG9kIGZvciBkcml2aW5nIHdpdGggTWVjYW51bSB3aGVlbGVkIHJvYm90cy4gVGhlcmUgYXJlIDQgd2hlZWxzCisgKiBvbiB0aGUgcm9ib3QsIGFycmFuZ2VkIHNvIHRoYXQgdGhlIGZyb250IGFuZCBiYWNrIHdoZWVscyBhcmUgdG9lZCBpbiA0NSBkZWdyZWVzLgorICogV2hlbiBsb29raW5nIGF0IHRoZSB3aGVlbHMgZnJvbSB0aGUgdG9wLCB0aGUgcm9sbGVyIGF4bGVzIHNob3VsZCBmb3JtIGFuIFggYWNyb3NzIHRoZSByb2JvdC4KKyAqCisgKiBUaGlzIGlzIGRlc2lnbmVkIHRvIGJlIGRpcmVjdGx5IGRyaXZlbiBieSBqb3lzdGljayBheGVzLgorICoKKyAqIEBwYXJhbSB4IFRoZSBzcGVlZCB0aGF0IHRoZSByb2JvdCBzaG91bGQgZHJpdmUgaW4gdGhlIFggZGlyZWN0aW9uLiBbLTEuMC4uMS4wXQorICogQHBhcmFtIHkgVGhlIHNwZWVkIHRoYXQgdGhlIHJvYm90IHNob3VsZCBkcml2ZSBpbiB0aGUgWSBkaXJlY3Rpb24uCisgKiBUaGlzIGlucHV0IGlzIGludmVydGVkIHRvIG1hdGNoIHRoZSBmb3J3YXJkID09IC0xLjAgdGhhdCBqb3lzdGlja3MgcHJvZHVjZS4gWy0xLjAuLjEuMF0KKyAqIEBwYXJhbSByb3RhdGlvbiBUaGUgcmF0ZSBvZiByb3RhdGlvbiBmb3IgdGhlIHJvYm90IHRoYXQgaXMgY29tcGxldGVseSBpbmRlcGVuZGVudCBvZgorICogdGhlIHRyYW5zbGF0aW9uLiBbLTEuMC4uMS4wXQorICogQHBhcmFtIGd5cm9BbmdsZSBUaGUgY3VycmVudCBhbmdsZSByZWFkaW5nIGZyb20gdGhlIGd5cm8uICBVc2UgdGhpcyB0byBpbXBsZW1lbnQgZmllbGQtb3JpZW50ZWQgY29udHJvbHMuCisgKi8KK3ZvaWQgUm9ib3REcml2ZTo6TWVjYW51bURyaXZlX0NhcnRlc2lhbihmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCByb3RhdGlvbiwgZmxvYXQgZ3lyb0FuZ2xlKQoreworCXN0YXRpYyBib29sIHJlcG9ydGVkID0gZmFsc2U7CisJaWYgKCFyZXBvcnRlZCkKKwl7CisJCUhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9Sb2JvdERyaXZlLCBHZXROdW1Nb3RvcnMoKSwgSEFMVXNhZ2VSZXBvcnRpbmc6OmtSb2JvdERyaXZlX01lY2FudW1DYXJ0ZXNpYW4pOworCQlyZXBvcnRlZCA9IHRydWU7CisJfQorCisJZG91YmxlIHhJbiA9IHg7CisJZG91YmxlIHlJbiA9IHk7CisJLy8gTmVnYXRlIHkgZm9yIHRoZSBqb3lzdGljay4KKwl5SW4gPSAteUluOworCS8vIENvbXBlbnN0YXRlIGZvciBneXJvIGFuZ2xlLgorCVJvdGF0ZVZlY3Rvcih4SW4sIHlJbiwgZ3lyb0FuZ2xlKTsKKworCWRvdWJsZSB3aGVlbFNwZWVkc1trTWF4TnVtYmVyT2ZNb3RvcnNdOworCXdoZWVsU3BlZWRzW2tGcm9udExlZnRNb3Rvcl0gPSB4SW4gKyB5SW4gKyByb3RhdGlvbjsKKwl3aGVlbFNwZWVkc1trRnJvbnRSaWdodE1vdG9yXSA9IC14SW4gKyB5SW4gLSByb3RhdGlvbjsKKwl3aGVlbFNwZWVkc1trUmVhckxlZnRNb3Rvcl0gPSAteEluICsgeUluICsgcm90YXRpb247CisJd2hlZWxTcGVlZHNba1JlYXJSaWdodE1vdG9yXSA9IHhJbiArIHlJbiAtIHJvdGF0aW9uOworCisJTm9ybWFsaXplKHdoZWVsU3BlZWRzKTsKKworCXVpbnQ4X3Qgc3luY0dyb3VwID0gMHg4MDsKKworCW1fZnJvbnRMZWZ0TW90b3ItPlNldCh3aGVlbFNwZWVkc1trRnJvbnRMZWZ0TW90b3JdICogbV9pbnZlcnRlZE1vdG9yc1trRnJvbnRMZWZ0TW90b3JdICogbV9tYXhPdXRwdXQsIHN5bmNHcm91cCk7CisJbV9mcm9udFJpZ2h0TW90b3ItPlNldCh3aGVlbFNwZWVkc1trRnJvbnRSaWdodE1vdG9yXSAqIG1faW52ZXJ0ZWRNb3RvcnNba0Zyb250UmlnaHRNb3Rvcl0gKiBtX21heE91dHB1dCwgc3luY0dyb3VwKTsKKwltX3JlYXJMZWZ0TW90b3ItPlNldCh3aGVlbFNwZWVkc1trUmVhckxlZnRNb3Rvcl0gKiBtX2ludmVydGVkTW90b3JzW2tSZWFyTGVmdE1vdG9yXSAqIG1fbWF4T3V0cHV0LCBzeW5jR3JvdXApOworCW1fcmVhclJpZ2h0TW90b3ItPlNldCh3aGVlbFNwZWVkc1trUmVhclJpZ2h0TW90b3JdICogbV9pbnZlcnRlZE1vdG9yc1trUmVhclJpZ2h0TW90b3JdICogbV9tYXhPdXRwdXQsIHN5bmNHcm91cCk7CisKKwlDQU5KYWd1YXI6OlVwZGF0ZVN5bmNHcm91cChzeW5jR3JvdXApOworCisJbV9zYWZldHlIZWxwZXItPkZlZWQoKTsKK30KKworLyoqCisgKiBEcml2ZSBtZXRob2QgZm9yIE1lY2FudW0gd2hlZWxlZCByb2JvdHMuCisgKgorICogQSBtZXRob2QgZm9yIGRyaXZpbmcgd2l0aCBNZWNhbnVtIHdoZWVsZWQgcm9ib3RzLiBUaGVyZSBhcmUgNCB3aGVlbHMKKyAqIG9uIHRoZSByb2JvdCwgYXJyYW5nZWQgc28gdGhhdCB0aGUgZnJvbnQgYW5kIGJhY2sgd2hlZWxzIGFyZSB0b2VkIGluIDQ1IGRlZ3JlZXMuCisgKiBXaGVuIGxvb2tpbmcgYXQgdGhlIHdoZWVscyBmcm9tIHRoZSB0b3AsIHRoZSByb2xsZXIgYXhsZXMgc2hvdWxkIGZvcm0gYW4gWCBhY3Jvc3MgdGhlIHJvYm90LgorICoKKyAqIEBwYXJhbSBtYWduaXR1ZGUgVGhlIHNwZWVkIHRoYXQgdGhlIHJvYm90IHNob3VsZCBkcml2ZSBpbiBhIGdpdmVuIGRpcmVjdGlvbi4gWy0xLjAuLjEuMF0KKyAqIEBwYXJhbSBkaXJlY3Rpb24gVGhlIGRpcmVjdGlvbiB0aGUgcm9ib3Qgc2hvdWxkIGRyaXZlIGluIGRlZ3JlZXMuIFRoZSBkaXJlY3Rpb24gYW5kIG1hZ2luaXR1dGUgYXJlCisgKiBpbmRlcGVuZGVudCBvZiB0aGUgcm90YXRpb24gcmF0ZS4KKyAqIEBwYXJhbSByb3RhdGlvbiBUaGUgcmF0ZSBvZiByb3RhdGlvbiBmb3IgdGhlIHJvYm90IHRoYXQgaXMgY29tcGxldGVseSBpbmRlcGVuZGVudCBvZgorICogdGhlIG1hZ25pdHV0ZSBvciBkaXJlY3Rpb24uIFstMS4wLi4xLjBdCisgKi8KK3ZvaWQgUm9ib3REcml2ZTo6TWVjYW51bURyaXZlX1BvbGFyKGZsb2F0IG1hZ25pdHVkZSwgZmxvYXQgZGlyZWN0aW9uLCBmbG9hdCByb3RhdGlvbikKK3sKKwlzdGF0aWMgYm9vbCByZXBvcnRlZCA9IGZhbHNlOworCWlmICghcmVwb3J0ZWQpCisJeworCQlIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfUm9ib3REcml2ZSwgR2V0TnVtTW90b3JzKCksIEhBTFVzYWdlUmVwb3J0aW5nOjprUm9ib3REcml2ZV9NZWNhbnVtUG9sYXIpOworCQlyZXBvcnRlZCA9IHRydWU7CisJfQorCisJLy8gTm9ybWFsaXplZCBmb3IgZnVsbCBwb3dlciBhbG9uZyB0aGUgQ2FydGVzaWFuIGF4ZXMuCisJbWFnbml0dWRlID0gTGltaXQobWFnbml0dWRlKSAqIHNxcnQoMi4wKTsKKwkvLyBUaGUgcm9sbGVycyBhcmUgYXQgNDUgZGVncmVlIGFuZ2xlcy4KKwlkb3VibGUgZGlySW5SYWQgPSAoZGlyZWN0aW9uICsgNDUuMCkgKiAzLjE0MTU5IC8gMTgwLjA7CisJZG91YmxlIGNvc0QgPSBjb3MoZGlySW5SYWQpOworCWRvdWJsZSBzaW5EID0gc2luKGRpckluUmFkKTsKKworCWRvdWJsZSB3aGVlbFNwZWVkc1trTWF4TnVtYmVyT2ZNb3RvcnNdOworCXdoZWVsU3BlZWRzW2tGcm9udExlZnRNb3Rvcl0gPSBzaW5EICogbWFnbml0dWRlICsgcm90YXRpb247CisJd2hlZWxTcGVlZHNba0Zyb250UmlnaHRNb3Rvcl0gPSBjb3NEICogbWFnbml0dWRlIC0gcm90YXRpb247CisJd2hlZWxTcGVlZHNba1JlYXJMZWZ0TW90b3JdID0gY29zRCAqIG1hZ25pdHVkZSArIHJvdGF0aW9uOworCXdoZWVsU3BlZWRzW2tSZWFyUmlnaHRNb3Rvcl0gPSBzaW5EICogbWFnbml0dWRlIC0gcm90YXRpb247CisKKwlOb3JtYWxpemUod2hlZWxTcGVlZHMpOworCisJdWludDhfdCBzeW5jR3JvdXAgPSAweDgwOworCisJbV9mcm9udExlZnRNb3Rvci0+U2V0KHdoZWVsU3BlZWRzW2tGcm9udExlZnRNb3Rvcl0gKiBtX2ludmVydGVkTW90b3JzW2tGcm9udExlZnRNb3Rvcl0gKiBtX21heE91dHB1dCwgc3luY0dyb3VwKTsKKwltX2Zyb250UmlnaHRNb3Rvci0+U2V0KHdoZWVsU3BlZWRzW2tGcm9udFJpZ2h0TW90b3JdICogbV9pbnZlcnRlZE1vdG9yc1trRnJvbnRSaWdodE1vdG9yXSAqIG1fbWF4T3V0cHV0LCBzeW5jR3JvdXApOworCW1fcmVhckxlZnRNb3Rvci0+U2V0KHdoZWVsU3BlZWRzW2tSZWFyTGVmdE1vdG9yXSAqIG1faW52ZXJ0ZWRNb3RvcnNba1JlYXJMZWZ0TW90b3JdICogbV9tYXhPdXRwdXQsIHN5bmNHcm91cCk7CisJbV9yZWFyUmlnaHRNb3Rvci0+U2V0KHdoZWVsU3BlZWRzW2tSZWFyUmlnaHRNb3Rvcl0gKiBtX2ludmVydGVkTW90b3JzW2tSZWFyUmlnaHRNb3Rvcl0gKiBtX21heE91dHB1dCwgc3luY0dyb3VwKTsKKworCUNBTkphZ3Vhcjo6VXBkYXRlU3luY0dyb3VwKHN5bmNHcm91cCk7CisKKwltX3NhZmV0eUhlbHBlci0+RmVlZCgpOworfQorCisvKioKKyAqIEhvbG9ub21pYyBEcml2ZSBtZXRob2QgZm9yIE1lY2FudW0gd2hlZWxlZCByb2JvdHMuCisgKgorICogVGhpcyBpcyBhbiBhbGlhcyB0byBNZWNhbnVtRHJpdmVfUG9sYXIoKSBmb3IgYmFja3dhcmQgY29tcGF0YWJpbGl0eQorICoKKyAqIEBwYXJhbSBtYWduaXR1ZGUgVGhlIHNwZWVkIHRoYXQgdGhlIHJvYm90IHNob3VsZCBkcml2ZSBpbiBhIGdpdmVuIGRpcmVjdGlvbi4gIFstMS4wLi4xLjBdCisgKiBAcGFyYW0gZGlyZWN0aW9uIFRoZSBkaXJlY3Rpb24gdGhlIHJvYm90IHNob3VsZCBkcml2ZS4gVGhlIGRpcmVjdGlvbiBhbmQgbWFnaW5pdHV0ZSBhcmUKKyAqIGluZGVwZW5kZW50IG9mIHRoZSByb3RhdGlvbiByYXRlLgorICogQHBhcmFtIHJvdGF0aW9uIFRoZSByYXRlIG9mIHJvdGF0aW9uIGZvciB0aGUgcm9ib3QgdGhhdCBpcyBjb21wbGV0ZWx5IGluZGVwZW5kZW50IG9mCisgKiB0aGUgbWFnbml0dXRlIG9yIGRpcmVjdGlvbi4gIFstMS4wLi4xLjBdCisgKi8KK3ZvaWQgUm9ib3REcml2ZTo6SG9sb25vbWljRHJpdmUoZmxvYXQgbWFnbml0dWRlLCBmbG9hdCBkaXJlY3Rpb24sIGZsb2F0IHJvdGF0aW9uKQoreworCU1lY2FudW1Ecml2ZV9Qb2xhcihtYWduaXR1ZGUsIGRpcmVjdGlvbiwgcm90YXRpb24pOworfQorCisvKiogU2V0IHRoZSBzcGVlZCBvZiB0aGUgcmlnaHQgYW5kIGxlZnQgbW90b3JzLgorICogVGhpcyBpcyB1c2VkIG9uY2UgYW4gYXBwcm9wcmlhdGUgZHJpdmUgc2V0dXAgZnVuY3Rpb24gaXMgY2FsbGVkIHN1Y2ggYXMKKyAqIFR3b1doZWVsRHJpdmUoKS4gVGhlIG1vdG9ycyBhcmUgc2V0IHRvICJsZWZ0T3V0cHV0IiBhbmQgInJpZ2h0T3V0cHV0IgorICogYW5kIGluY2x1ZGVzIGZsaXBwaW5nIHRoZSBkaXJlY3Rpb24gb2Ygb25lIHNpZGUgZm9yIG9wcG9zaW5nIG1vdG9ycy4KKyAqIEBwYXJhbSBsZWZ0T3V0cHV0IFRoZSBzcGVlZCB0byBzZW5kIHRvIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIHJvYm90LgorICogQHBhcmFtIHJpZ2h0T3V0cHV0IFRoZSBzcGVlZCB0byBzZW5kIHRvIHRoZSByaWdodCBzaWRlIG9mIHRoZSByb2JvdC4KKyAqLwordm9pZCBSb2JvdERyaXZlOjpTZXRMZWZ0UmlnaHRNb3Rvck91dHB1dHMoZmxvYXQgbGVmdE91dHB1dCwgZmxvYXQgcmlnaHRPdXRwdXQpCit7CisJd3BpX2Fzc2VydChtX3JlYXJMZWZ0TW90b3IgIT0gTlVMTCAmJiBtX3JlYXJSaWdodE1vdG9yICE9IE5VTEwpOworCisJdWludDhfdCBzeW5jR3JvdXAgPSAweDgwOworCisJaWYgKG1fZnJvbnRMZWZ0TW90b3IgIT0gTlVMTCkKKwkJbV9mcm9udExlZnRNb3Rvci0+U2V0KExpbWl0KGxlZnRPdXRwdXQpICogbV9pbnZlcnRlZE1vdG9yc1trRnJvbnRMZWZ0TW90b3JdICogbV9tYXhPdXRwdXQsIHN5bmNHcm91cCk7CisJbV9yZWFyTGVmdE1vdG9yLT5TZXQoTGltaXQobGVmdE91dHB1dCkgKiBtX2ludmVydGVkTW90b3JzW2tSZWFyTGVmdE1vdG9yXSAqIG1fbWF4T3V0cHV0LCBzeW5jR3JvdXApOworCisJaWYgKG1fZnJvbnRSaWdodE1vdG9yICE9IE5VTEwpCisJCW1fZnJvbnRSaWdodE1vdG9yLT5TZXQoLUxpbWl0KHJpZ2h0T3V0cHV0KSAqIG1faW52ZXJ0ZWRNb3RvcnNba0Zyb250UmlnaHRNb3Rvcl0gKiBtX21heE91dHB1dCwgc3luY0dyb3VwKTsKKwltX3JlYXJSaWdodE1vdG9yLT5TZXQoLUxpbWl0KHJpZ2h0T3V0cHV0KSAqIG1faW52ZXJ0ZWRNb3RvcnNba1JlYXJSaWdodE1vdG9yXSAqIG1fbWF4T3V0cHV0LCBzeW5jR3JvdXApOworCisJQ0FOSmFndWFyOjpVcGRhdGVTeW5jR3JvdXAoc3luY0dyb3VwKTsKKworCW1fc2FmZXR5SGVscGVyLT5GZWVkKCk7Cit9CisKKy8qKgorICogTGltaXQgbW90b3IgdmFsdWVzIHRvIHRoZSAtMS4wIHRvICsxLjAgcmFuZ2UuCisgKi8KK2Zsb2F0IFJvYm90RHJpdmU6OkxpbWl0KGZsb2F0IG51bSkKK3sKKwlpZiAobnVtID4gMS4wKQorCXsKKwkJcmV0dXJuIDEuMDsKKwl9CisJaWYgKG51bSA8IC0xLjApCisJeworCQlyZXR1cm4gLTEuMDsKKwl9CisJcmV0dXJuIG51bTsKK30KKworLyoqCisgKiBOb3JtYWxpemUgYWxsIHdoZWVsIHNwZWVkcyBpZiB0aGUgbWFnbml0dWRlIG9mIGFueSB3aGVlbCBpcyBncmVhdGVyIHRoYW4gMS4wLgorICovCit2b2lkIFJvYm90RHJpdmU6Ok5vcm1hbGl6ZShkb3VibGUgKndoZWVsU3BlZWRzKQoreworCWRvdWJsZSBtYXhNYWduaXR1ZGUgPSBmYWJzKHdoZWVsU3BlZWRzWzBdKTsKKwlpbnQzMl90IGk7CisJZm9yIChpPTE7IGk8a01heE51bWJlck9mTW90b3JzOyBpKyspCisJeworCQlkb3VibGUgdGVtcCA9IGZhYnMod2hlZWxTcGVlZHNbaV0pOworCQlpZiAobWF4TWFnbml0dWRlIDwgdGVtcCkgbWF4TWFnbml0dWRlID0gdGVtcDsKKwl9CisJaWYgKG1heE1hZ25pdHVkZSA+IDEuMCkKKwl7CisJCWZvciAoaT0wOyBpPGtNYXhOdW1iZXJPZk1vdG9yczsgaSsrKQorCQl7CisJCQl3aGVlbFNwZWVkc1tpXSA9IHdoZWVsU3BlZWRzW2ldIC8gbWF4TWFnbml0dWRlOworCQl9CisJfQorfQorCisvKioKKyAqIFJvdGF0ZSBhIHZlY3RvciBpbiBDYXJ0ZXNpYW4gc3BhY2UuCisgKi8KK3ZvaWQgUm9ib3REcml2ZTo6Um90YXRlVmVjdG9yKGRvdWJsZSAmeCwgZG91YmxlICZ5LCBkb3VibGUgYW5nbGUpCit7CisJZG91YmxlIGNvc0EgPSBjb3MoYW5nbGUgKiAoMy4xNDE1OSAvIDE4MC4wKSk7CisJZG91YmxlIHNpbkEgPSBzaW4oYW5nbGUgKiAoMy4xNDE1OSAvIDE4MC4wKSk7CisJZG91YmxlIHhPdXQgPSB4ICogY29zQSAtIHkgKiBzaW5BOworCWRvdWJsZSB5T3V0ID0geCAqIHNpbkEgKyB5ICogY29zQTsKKwl4ID0geE91dDsKKwl5ID0geU91dDsKK30KKworLyoKKyAqIEludmVydCBhIG1vdG9yIGRpcmVjdGlvbi4KKyAqIFRoaXMgaXMgdXNlZCB3aGVuIGEgbW90b3Igc2hvdWxkIHJ1biBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uIGFzIHRoZSBkcml2ZQorICogY29kZSB3b3VsZCBub3JtYWxseSBydW4gaXQuIE1vdG9ycyB0aGF0IGFyZSBkaXJlY3QgZHJpdmUgd291bGQgYmUgaW52ZXJ0ZWQsIHRoZQorICogRHJpdmUgY29kZSBhc3N1bWVzIHRoYXQgdGhlIG1vdG9ycyBhcmUgZ2VhcmVkIHdpdGggb25lIHJldmVyc2FsLgorICogQHBhcmFtIG1vdG9yIFRoZSBtb3RvciBpbmRleCB0byBpbnZlcnQuCisgKiBAcGFyYW0gaXNJbnZlcnRlZCBUcnVlIGlmIHRoZSBtb3RvciBzaG91bGQgYmUgaW52ZXJ0ZWQgd2hlbiBvcGVyYXRlZC4KKyAqLwordm9pZCBSb2JvdERyaXZlOjpTZXRJbnZlcnRlZE1vdG9yKE1vdG9yVHlwZSBtb3RvciwgYm9vbCBpc0ludmVydGVkKQoreworCWlmIChtb3RvciA8IDAgfHwgbW90b3IgPiAzKQorCXsKKwkJd3BpX3NldFdQSUVycm9yKEludmFsaWRNb3RvckluZGV4KTsKKwkJcmV0dXJuOworCX0KKwltX2ludmVydGVkTW90b3JzW21vdG9yXSA9IGlzSW52ZXJ0ZWQgPyAtMSA6IDE7Cit9CisKKy8qKgorICogU2V0IHRoZSB0dXJuaW5nIHNlbnNpdGl2aXR5LgorICoKKyAqIFRoaXMgb25seSBpbXBhY3RzIHRoZSBEcml2ZSgpIGVudHJ5LXBvaW50LgorICogQHBhcmFtIHNlbnNpdGl2aXR5IEVmZmVjdGl2ZWx5IHNldHMgdGhlIHR1cm5pbmcgc2Vuc2l0aXZpdHkgKG9yIHR1cm4gcmFkaXVzIGZvciBhIGdpdmVuIHZhbHVlKQorICovCit2b2lkIFJvYm90RHJpdmU6OlNldFNlbnNpdGl2aXR5KGZsb2F0IHNlbnNpdGl2aXR5KQoreworCW1fc2Vuc2l0aXZpdHkgPSBzZW5zaXRpdml0eTsKK30KKworLyoqCisgKiBDb25maWd1cmUgdGhlIHNjYWxpbmcgZmFjdG9yIGZvciB1c2luZyBSb2JvdERyaXZlIHdpdGggbW90b3IgY29udHJvbGxlcnMgaW4gYSBtb2RlIG90aGVyIHRoYW4gUGVyY2VudFZidXMuCisgKiBAcGFyYW0gbWF4T3V0cHV0IE11bHRpcGxpZWQgd2l0aCB0aGUgb3V0cHV0IHBlcmNlbnRhZ2UgY29tcHV0ZWQgYnkgdGhlIGRyaXZlIGZ1bmN0aW9ucy4KKyAqLwordm9pZCBSb2JvdERyaXZlOjpTZXRNYXhPdXRwdXQoZG91YmxlIG1heE91dHB1dCkKK3sKKwltX21heE91dHB1dCA9IG1heE91dHB1dDsKK30KKworCisKK3ZvaWQgUm9ib3REcml2ZTo6U2V0RXhwaXJhdGlvbihmbG9hdCB0aW1lb3V0KQoreworCW1fc2FmZXR5SGVscGVyLT5TZXRFeHBpcmF0aW9uKHRpbWVvdXQpOworfQorCitmbG9hdCBSb2JvdERyaXZlOjpHZXRFeHBpcmF0aW9uKCkKK3sKKwlyZXR1cm4gbV9zYWZldHlIZWxwZXItPkdldEV4cGlyYXRpb24oKTsKK30KKworYm9vbCBSb2JvdERyaXZlOjpJc0FsaXZlKCkKK3sKKwlyZXR1cm4gbV9zYWZldHlIZWxwZXItPklzQWxpdmUoKTsKK30KKworYm9vbCBSb2JvdERyaXZlOjpJc1NhZmV0eUVuYWJsZWQoKQoreworCXJldHVybiBtX3NhZmV0eUhlbHBlci0+SXNTYWZldHlFbmFibGVkKCk7Cit9CisKK3ZvaWQgUm9ib3REcml2ZTo6U2V0U2FmZXR5RW5hYmxlZChib29sIGVuYWJsZWQpCit7CisJbV9zYWZldHlIZWxwZXItPlNldFNhZmV0eUVuYWJsZWQoZW5hYmxlZCk7Cit9CisKK3ZvaWQgUm9ib3REcml2ZTo6R2V0RGVzY3JpcHRpb24oY2hhciAqZGVzYykKK3sKKwlzcHJpbnRmKGRlc2MsICJSb2JvdERyaXZlIik7Cit9CisKK3ZvaWQgUm9ib3REcml2ZTo6U3RvcE1vdG9yKCkKK3sKKwlpZiAobV9mcm9udExlZnRNb3RvciAhPSBOVUxMKSBtX2Zyb250TGVmdE1vdG9yLT5EaXNhYmxlKCk7CisJaWYgKG1fZnJvbnRSaWdodE1vdG9yICE9IE5VTEwpIG1fZnJvbnRSaWdodE1vdG9yLT5EaXNhYmxlKCk7CisJaWYgKG1fcmVhckxlZnRNb3RvciAhPSBOVUxMKSBtX3JlYXJMZWZ0TW90b3ItPkRpc2FibGUoKTsKKwlpZiAobV9yZWFyUmlnaHRNb3RvciAhPSBOVUxMKSBtX3JlYXJSaWdodE1vdG9yLT5EaXNhYmxlKCk7CisJbV9zYWZldHlIZWxwZXItPkZlZWQoKTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvU1BJLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvU1BJLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODc4ZGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9TUEkuY3BwCkBAIC0wLDAgKzEsMTg1IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJTUEkuaCIKKworI2luY2x1ZGUgIldQSUVycm9ycy5oIgorI2luY2x1ZGUgIkhBTC9EaWdpdGFsLmhwcCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisKKy8qKgorICogQ29uc3RydWN0b3IKKyAqCisgKiBAcGFyYW0gU1BJcG9ydCB0aGUgcGh5c2ljYWwgU1BJIHBvcnQKKyAqLworU1BJOjpTUEkoUG9ydCBTUElwb3J0KQoreworCW1fcG9ydCA9IFNQSXBvcnQ7CisgIAlpbnQzMl90IHN0YXR1cyA9IDA7CisgIAlzcGlJbml0aWFsaXplKG1fcG9ydCwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisKKwlzdGF0aWMgaW50MzJfdCBpbnN0YW5jZXMgPSAwOworCWluc3RhbmNlcysrOworCUhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9TUEksIGluc3RhbmNlcyk7Cit9CisKKy8qKgorICogRGVzdHJ1Y3Rvci4KKyAqLworU1BJOjp+U1BJKCkKK3sKKwlzcGlDbG9zZShtX3BvcnQpOworfQorCisvKioKKyAqIENvbmZpZ3VyZSB0aGUgcmF0ZSBvZiB0aGUgZ2VuZXJhdGVkIGNsb2NrIHNpZ25hbC4KKyAqIAorICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgNTAwLDAwMEh6LgorICogVGhlIG1heGltdW0gdmFsdWUgaXMgNCwwMDAsMDAwSHouCisgKgorICogQHBhcmFtIGh6CVRoZSBjbG9jayByYXRlIGluIEhlcnR6LgorICovCit2b2lkIFNQSTo6U2V0Q2xvY2tSYXRlKGRvdWJsZSBoeikKK3sKKwlzcGlTZXRTcGVlZChtX3BvcnQsIGh6KTsKK30KKworLyoqCisgKiBDb25maWd1cmUgdGhlIG9yZGVyIHRoYXQgYml0cyBhcmUgc2VudCBhbmQgcmVjZWl2ZWQgb24gdGhlIHdpcmUKKyAqIHRvIGJlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGZpcnN0LgorICovCit2b2lkIFNQSTo6U2V0TVNCRmlyc3QoKQoreworCW1fbXNiRmlyc3QgPSB0cnVlOworCXNwaVNldE9wdHMobV9wb3J0LCAoaW50KSBtX21zYkZpcnN0LCAoaW50KSBtX3NhbXBsZU9uVHJhaWxpbmcsIChpbnQpIG1fY2xrX2lkbGVfaGlnaCk7Cit9CisKKy8qKgorICogQ29uZmlndXJlIHRoZSBvcmRlciB0aGF0IGJpdHMgYXJlIHNlbnQgYW5kIHJlY2VpdmVkIG9uIHRoZSB3aXJlCisgKiB0byBiZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgZmlyc3QuCisgKi8KK3ZvaWQgU1BJOjpTZXRMU0JGaXJzdCgpCit7CisJbV9tc2JGaXJzdCA9IGZhbHNlOworCXNwaVNldE9wdHMobV9wb3J0LCAoaW50KSBtX21zYkZpcnN0LCAoaW50KSBtX3NhbXBsZU9uVHJhaWxpbmcsIChpbnQpIG1fY2xrX2lkbGVfaGlnaCk7Cit9CisKKy8qKgorICogQ29uZmlndXJlIHRoYXQgdGhlIGRhdGEgaXMgc3RhYmxlIG9uIHRoZSBmYWxsaW5nIGVkZ2UgYW5kIHRoZSBkYXRhCisgKiBjaGFuZ2VzIG9uIHRoZSByaXNpbmcgZWRnZS4KKyAqLwordm9pZCBTUEk6OlNldFNhbXBsZURhdGFPbkZhbGxpbmcoKQoreworCW1fc2FtcGxlT25UcmFpbGluZyA9IHRydWU7CisJc3BpU2V0T3B0cyhtX3BvcnQsIChpbnQpIG1fbXNiRmlyc3QsIChpbnQpIG1fc2FtcGxlT25UcmFpbGluZywgKGludCkgbV9jbGtfaWRsZV9oaWdoKTsKK30KKworLyoqCisgKiBDb25maWd1cmUgdGhhdCB0aGUgZGF0YSBpcyBzdGFibGUgb24gdGhlIHJpc2luZyBlZGdlIGFuZCB0aGUgZGF0YQorICogY2hhbmdlcyBvbiB0aGUgZmFsbGluZyBlZGdlLgorICovCit2b2lkIFNQSTo6U2V0U2FtcGxlRGF0YU9uUmlzaW5nKCkKK3sKKwltX3NhbXBsZU9uVHJhaWxpbmcgPSBmYWxzZTsKKwlzcGlTZXRPcHRzKG1fcG9ydCwgKGludCkgbV9tc2JGaXJzdCwgKGludCkgbV9zYW1wbGVPblRyYWlsaW5nLCAoaW50KSBtX2Nsa19pZGxlX2hpZ2gpOworfQorCisvKioKKyAqIENvbmZpZ3VyZSB0aGUgY2xvY2sgb3V0cHV0IGxpbmUgdG8gYmUgYWN0aXZlIGxvdy4KKyAqIFRoaXMgaXMgc29tZXRpbWVzIGNhbGxlZCBjbG9jayBwb2xhcml0eSBoaWdoIG9yIGNsb2NrIGlkbGUgaGlnaC4KKyAqLwordm9pZCBTUEk6OlNldENsb2NrQWN0aXZlTG93KCkKK3sKKwltX2Nsa19pZGxlX2hpZ2ggPSB0cnVlOworCXNwaVNldE9wdHMobV9wb3J0LCAoaW50KSBtX21zYkZpcnN0LCAoaW50KSBtX3NhbXBsZU9uVHJhaWxpbmcsIChpbnQpIG1fY2xrX2lkbGVfaGlnaCk7Cit9CisKKy8qKgorICogQ29uZmlndXJlIHRoZSBjbG9jayBvdXRwdXQgbGluZSB0byBiZSBhY3RpdmUgaGlnaC4KKyAqIFRoaXMgaXMgc29tZXRpbWVzIGNhbGxlZCBjbG9jayBwb2xhcml0eSBsb3cgb3IgY2xvY2sgaWRsZSBsb3cuCisgKi8KK3ZvaWQgU1BJOjpTZXRDbG9ja0FjdGl2ZUhpZ2goKQoreworCW1fY2xrX2lkbGVfaGlnaCA9IGZhbHNlOworCXNwaVNldE9wdHMobV9wb3J0LCAoaW50KSBtX21zYkZpcnN0LCAoaW50KSBtX3NhbXBsZU9uVHJhaWxpbmcsIChpbnQpIG1fY2xrX2lkbGVfaGlnaCk7Cit9CisKKy8qKgorICogQ29uZmlndXJlIHRoZSBjaGlwIHNlbGVjdCBsaW5lIHRvIGJlIGFjdGl2ZSBoaWdoLgorICovCit2b2lkIFNQSTo6U2V0Q2hpcFNlbGVjdEFjdGl2ZUhpZ2goKQoreworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlzcGlTZXRDaGlwU2VsZWN0QWN0aXZlSGlnaChtX3BvcnQsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIENvbmZpZ3VyZSB0aGUgY2hpcCBzZWxlY3QgbGluZSB0byBiZSBhY3RpdmUgbG93LgorICovCit2b2lkIFNQSTo6U2V0Q2hpcFNlbGVjdEFjdGl2ZUxvdygpCit7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCXNwaVNldENoaXBTZWxlY3RBY3RpdmVMb3cobV9wb3J0LCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKworCisvKioKKyAqIFdyaXRlIGRhdGEgdG8gdGhlIHNsYXZlIGRldmljZS4gIEJsb2NrcyB1bnRpbCB0aGVyZSBpcyBzcGFjZSBpbiB0aGUKKyAqIG91dHB1dCBGSUZPLgorICoKKyAqIElmIG5vdCBydW5uaW5nIGluIG91dHB1dCBvbmx5IG1vZGUsIGFsc28gc2F2ZXMgdGhlIGRhdGEgcmVjZWl2ZWQKKyAqIG9uIHRoZSBNSVNPIGlucHV0IGR1cmluZyB0aGUgdHJhbnNmZXIgaW50byB0aGUgcmVjZWl2ZSBGSUZPLgorICovCitpbnQzMl90IFNQSTo6V3JpdGUodWludDhfdCogZGF0YSwgdWludDhfdCBzaXplKQoreworCWludDMyX3QgcmV0VmFsID0gMDsKKwlyZXRWYWwgPSBzcGlXcml0ZShtX3BvcnQsIGRhdGEsIHNpemUpOworCXJldHVybiByZXRWYWw7Cit9CisKKy8qKgorICogUmVhZCBhIHdvcmQgZnJvbSB0aGUgcmVjZWl2ZSBGSUZPLgorICoKKyAqIFdhaXRzIGZvciB0aGUgY3VycmVudCB0cmFuc2ZlciB0byBjb21wbGV0ZSBpZiB0aGUgcmVjZWl2ZSBGSUZPIGlzIGVtcHR5LgorICoKKyAqIElmIHRoZSByZWNlaXZlIEZJRk8gaXMgZW1wdHksIHRoZXJlIGlzIG5vIGFjdGl2ZSB0cmFuc2ZlciwgYW5kIGluaXRpYXRlCisgKiBpcyBmYWxzZSwgZXJyb3JzLgorICoKKyAqIEBwYXJhbSBpbml0aWF0ZQlJZiB0cnVlLCB0aGlzIGZ1bmN0aW9uIHB1c2hlcyAiMCIgaW50byB0aGUKKyAqCQkJCSAgICB0cmFuc21pdCBidWZmZXIgYW5kIGluaXRpYXRlcyBhIHRyYW5zZmVyLgorICoJCQkJICAgIElmIGZhbHNlLCB0aGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBkYXRhIGlzCisgKgkJCQkgICAgYWxyZWFkeSBpbiB0aGUgcmVjZWl2ZSBGSUZPIGZyb20gYSBwcmV2aW91cyB3cml0ZS4KKyAqLworaW50MzJfdCBTUEk6OlJlYWQoYm9vbCBpbml0aWF0ZSwgdWludDhfdCogZGF0YVJlY2VpdmVkLCB1aW50OF90IHNpemUpCit7CisJaW50MzJfdCByZXRWYWwgPSAwOworCWlmKGluaXRpYXRlKXsKKwkJdWludDhfdCogZGF0YVRvU2VuZCA9IG5ldyB1aW50OF90W3NpemVdOworCQltZW1zZXQoZGF0YVRvU2VuZCwgMCwgc2l6ZSk7CisJCXJldFZhbCA9IHNwaVRyYW5zYWN0aW9uKG1fcG9ydCwgZGF0YVRvU2VuZCwgZGF0YVJlY2VpdmVkLCBzaXplKTsKKwl9CisJZWxzZQorCQlyZXRWYWwgPSBzcGlSZWFkKG1fcG9ydCwgZGF0YVJlY2VpdmVkLCBzaXplKTsKKwlyZXR1cm4gcmV0VmFsOworfQorCisvKioKKyAqIFBlcmZvcm0gYSBzaW11bHRhbmVvdXMgcmVhZC93cml0ZSB0cmFuc2FjdGlvbiB3aXRoIHRoZSBkZXZpY2UKKyAqCisgKiBAcGFyYW0gZGF0YVRvU2VuZCBUaGUgZGF0YSB0byBiZSB3cml0dGVuIG91dCB0byB0aGUgZGV2aWNlCisgKiBAcGFyYW0gZGF0YVJlY2VpdmVkIEJ1ZmZlciB0byByZWNlaXZlIGRhdGEgZnJvbSB0aGUgZGV2aWNlCisgKiBAcGFyYW0gc2l6ZSBUaGUgbGVuZ3RoIG9mIHRoZSB0cmFuc2FjdGlvbiwgaW4gYnl0ZXMKKyAqLworaW50MzJfdCBTUEk6OlRyYW5zYWN0aW9uKHVpbnQ4X3QqIGRhdGFUb1NlbmQsIHVpbnQ4X3QqIGRhdGFSZWNlaXZlZCwgdWludDhfdCBzaXplKXsKKwlpbnQzMl90IHJldFZhbCA9IDA7CisJcmV0VmFsID0gc3BpVHJhbnNhY3Rpb24obV9wb3J0LCBkYXRhVG9TZW5kLCBkYXRhUmVjZWl2ZWQsIHNpemUpOworCXJldHVybiByZXRWYWw7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1NhZmVQV00uY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9TYWZlUFdNLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODlkNWZlCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9TYWZlUFdNLmNwcApAQCAtMCwwICsxLDEwNiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiU2FmZVBXTS5oIgorCisjaW5jbHVkZSAiTW90b3JTYWZldHlIZWxwZXIuaCIKKworLyoqCisgKiBJbml0aWFsaXplIGEgU2FmZVBXTSBvYmplY3QgYnkgc2V0dGluZyBkZWZhdWx0cworICovCit2b2lkIFNhZmVQV006OkluaXRTYWZlUFdNKCkKK3sKKwltX3NhZmV0eUhlbHBlciA9IG5ldyBNb3RvclNhZmV0eUhlbHBlcih0aGlzKTsKKwltX3NhZmV0eUhlbHBlci0+U2V0U2FmZXR5RW5hYmxlZChmYWxzZSk7Cit9CisKKy8qKgorICogQ29uc3RydWN0b3IgZm9yIGEgU2FmZVBXTSBvYmplY3QgdGFraW5nIGEgY2hhbm5lbCBudW1iZXIuCisgKiBAcGFyYW0gY2hhbm5lbCBUaGUgUFdNIGNoYW5uZWwgbnVtYmVyIDAtOSBhcmUgb24tYm9hcmQsIDEwLTE5IGFyZSBvbiB0aGUgTVhQIHBvcnQKKyAqLworU2FmZVBXTTo6U2FmZVBXTSh1aW50MzJfdCBjaGFubmVsKTogUFdNKGNoYW5uZWwpCit7CisJSW5pdFNhZmVQV00oKTsKK30KKworU2FmZVBXTTo6flNhZmVQV00oKQoreworCWRlbGV0ZSBtX3NhZmV0eUhlbHBlcjsKK30KKworLyoqCisgKiBTZXQgdGhlIGV4cGlyYXRpb24gdGltZSBmb3IgdGhlIFBXTSBvYmplY3QKKyAqIEBwYXJhbSB0aW1lb3V0IFRoZSB0aW1lb3V0IChpbiBzZWNvbmRzKSBmb3IgdGhpcyBtb3RvciBvYmplY3QKKyAqLwordm9pZCBTYWZlUFdNOjpTZXRFeHBpcmF0aW9uKGZsb2F0IHRpbWVvdXQpCit7CisJbV9zYWZldHlIZWxwZXItPlNldEV4cGlyYXRpb24odGltZW91dCk7Cit9CisKKy8qKgorICogUmV0dXJuIHRoZSBleHBpcmF0aW9uIHRpbWUgZm9yIHRoZSBQV00gb2JqZWN0LgorICogQHJldHVybnMgVGhlIGV4cGlyYXRpb24gdGltZSB2YWx1ZS4KKyAqLworZmxvYXQgU2FmZVBXTTo6R2V0RXhwaXJhdGlvbigpCit7CisJcmV0dXJuIG1fc2FmZXR5SGVscGVyLT5HZXRFeHBpcmF0aW9uKCk7Cit9CisKKy8qKgorICogQ2hlY2sgaWYgdGhlIFBXTSBvYmplY3QgaXMgY3VycmVudGx5IGFsaXZlIG9yIHN0b3BwZWQgZHVlIHRvIGEgdGltZW91dC4KKyAqIEByZXR1cm5zIGEgYm9vbCB2YWx1ZSB0aGF0IGlzIHRydWUgaWYgdGhlIG1vdG9yIGhhcyBOT1QgdGltZWQgb3V0IGFuZCBzaG91bGQgc3RpbGwKKyAqIGJlIHJ1bm5pbmcuCisgKi8KK2Jvb2wgU2FmZVBXTTo6SXNBbGl2ZSgpCit7CisJcmV0dXJuIG1fc2FmZXR5SGVscGVyLT5Jc0FsaXZlKCk7Cit9CisKKy8qKgorICogU3RvcCB0aGUgbW90b3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgUFdNIG9iamVjdC4KKyAqIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBNb3RvclNhZmV0eUhlbHBlciBvYmplY3Qgd2hlbiBpdCBoYXMgYSB0aW1lb3V0IGZvciB0aGlzIFBXTSBhbmQgbmVlZHMgdG8KKyAqIHN0b3AgaXQgZnJvbSBydW5uaW5nLgorICovCit2b2lkIFNhZmVQV006OlN0b3BNb3RvcigpCit7CisJU2V0UmF3KGtQd21EaXNhYmxlZCk7Cit9CisKKy8qKgorICogRW5hYmxlL2Rpc2FibGUgbW90b3Igc2FmZXR5IGZvciB0aGlzIGRldmljZQorICogVHVybiBvbiBhbmQgb2ZmIHRoZSBtb3RvciBzYWZldHkgb3B0aW9uIGZvciB0aGlzIFBXTSBvYmplY3QuCisgKiBAcGFyYW0gZW5hYmxlZCBUcnVlIGlmIG1vdG9yIHNhZmV0eSBpcyBlbmZvcmNlZCBmb3IgdGhpcyBvYmplY3QKKyAqLwordm9pZCBTYWZlUFdNOjpTZXRTYWZldHlFbmFibGVkKGJvb2wgZW5hYmxlZCkKK3sKKwltX3NhZmV0eUhlbHBlci0+U2V0U2FmZXR5RW5hYmxlZChlbmFibGVkKTsKK30KKworLyoqCisgKiBDaGVjayBpZiBtb3RvciBzYWZldHkgaXMgZW5hYmxlZCBmb3IgdGhpcyBvYmplY3QKKyAqIEByZXR1cm5zIFRydWUgaWYgbW90b3Igc2FmZXR5IGlzIGVuZm9yY2VkIGZvciB0aGlzIG9iamVjdAorICovCitib29sIFNhZmVQV006OklzU2FmZXR5RW5hYmxlZCgpCit7CisJcmV0dXJuIG1fc2FmZXR5SGVscGVyLT5Jc1NhZmV0eUVuYWJsZWQoKTsKK30KKwordm9pZCBTYWZlUFdNOjpHZXREZXNjcmlwdGlvbihjaGFyICpkZXNjKQoreworCXNwcmludGYoZGVzYywgIlBXTSAlZCIsIEdldENoYW5uZWwoKSk7Cit9CisKKy8qKgorICogRmVlZCB0aGUgTW90b3JTYWZldHkgdGltZXIgd2hlbiBzZXR0aW5nIHRoZSBzcGVlZC4KKyAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgc3ViY2xhc3MgbW90b3Igd2hlbmV2ZXIgaXQgdXBkYXRlcyBpdHMgc3BlZWQsIHRoZXJlYnkgcmVzZXRpbmcKKyAqIHRoZSB0aW1lb3V0IHZhbHVlLgorICogQHBhcmFtIHNwZWVkIFZhbHVlIHRvIHBhc3MgdG8gdGhlIFBXTSBjbGFzcworICovCit2b2lkIFNhZmVQV006OlNldFNwZWVkKGZsb2F0IHNwZWVkKQoreworCVBXTTo6U2V0U3BlZWQoc3BlZWQpOworCW1fc2FmZXR5SGVscGVyLT5GZWVkKCk7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1NlbnNvckJhc2UuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9TZW5zb3JCYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDAzYjE0Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9TZW5zb3JCYXNlLmNwcApAQCAtMCwwICsxLDIwMiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgorCisjaW5jbHVkZSAiTmV0d29ya0NvbW11bmljYXRpb24vTG9hZE91dC5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorI2luY2x1ZGUgIkhBTC9IQUwuaHBwIgorCitjb25zdCB1aW50MzJfdCBTZW5zb3JCYXNlOjprRGlnaXRhbENoYW5uZWxzOworY29uc3QgdWludDMyX3QgU2Vuc29yQmFzZTo6a0FuYWxvZ0lucHV0czsKK2NvbnN0IHVpbnQzMl90IFNlbnNvckJhc2U6OmtTb2xlbm9pZENoYW5uZWxzOworY29uc3QgdWludDMyX3QgU2Vuc29yQmFzZTo6a1NvbGVub2lkTW9kdWxlczsKK2NvbnN0IHVpbnQzMl90IFNlbnNvckJhc2U6OmtQd21DaGFubmVsczsKK2NvbnN0IHVpbnQzMl90IFNlbnNvckJhc2U6OmtSZWxheUNoYW5uZWxzOworY29uc3QgdWludDMyX3QgU2Vuc29yQmFzZTo6a1BEUENoYW5uZWxzOworY29uc3QgdWludDMyX3QgU2Vuc29yQmFzZTo6a0NoYXNzaXNTbG90czsKK1NlbnNvckJhc2UgKlNlbnNvckJhc2U6Om1fc2luZ2xldG9uTGlzdCA9IE5VTEw7CisKK3N0YXRpYyBib29sIHBvcnRzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKK3ZvaWQqIFNlbnNvckJhc2U6Om1fZGlnaXRhbF9wb3J0c1trRGlnaXRhbENoYW5uZWxzXTsKK3ZvaWQqIFNlbnNvckJhc2U6Om1fcmVsYXlfcG9ydHNba1JlbGF5Q2hhbm5lbHNdOwordm9pZCogU2Vuc29yQmFzZTo6bV9wd21fcG9ydHNba1B3bUNoYW5uZWxzXTsKKworLyoqCisgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzZW5zb3IgYmFzZSBhbmQgZ2V0cyBhbiBGUEdBIGhhbmRsZQorICovCitTZW5zb3JCYXNlOjpTZW5zb3JCYXNlKCkKK3sKKwlpZighcG9ydHNJbml0aWFsaXplZCkgeworCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwga0RpZ2l0YWxDaGFubmVsczsgaSsrKQorCQl7CisJCQl2b2lkKiBwb3J0ID0gZ2V0UG9ydChpKTsKKwkJCWludDMyX3Qgc3RhdHVzID0gMDsKKwkJCW1fZGlnaXRhbF9wb3J0c1tpXSA9IGluaXRpYWxpemVEaWdpdGFsUG9ydChwb3J0LCAmc3RhdHVzKTsKKwkJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCQl9CisKKwkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGtSZWxheUNoYW5uZWxzOyBpKyspCisJCXsKKwkJCXZvaWQqIHBvcnQgPSBnZXRQb3J0KGkpOworCQkJaW50MzJfdCBzdGF0dXMgPSAwOworCQkJbV9yZWxheV9wb3J0c1tpXSA9IGluaXRpYWxpemVEaWdpdGFsUG9ydChwb3J0LCAmc3RhdHVzKTsKKwkJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCQl9CisKKwkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGtQd21DaGFubmVsczsgaSsrKQorCQl7CisJCQl2b2lkKiBwb3J0ID0gZ2V0UG9ydChpKTsKKwkJCWludDMyX3Qgc3RhdHVzID0gMDsKKwkJCW1fcHdtX3BvcnRzW2ldID0gaW5pdGlhbGl6ZURpZ2l0YWxQb3J0KHBvcnQsICZzdGF0dXMpOworCQkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJCX0KKwl9Cit9CisKKy8qKgorICogRnJlZXMgdGhlIHJlc291cmNlcyBmb3IgYSBTZW5zb3JCYXNlLgorICovCitTZW5zb3JCYXNlOjp+U2Vuc29yQmFzZSgpCit7Cit9CisKKy8qKgorICogQWRkIHNlbnNvciB0byB0aGUgc2luZ2xldG9uIGxpc3QuCisgKiBBZGQgdGhpcyBzZW5zb3IgdG8gdGhlIGxpc3Qgb2Ygc2luZ2xldG9ucyB0aGF0IG5lZWQgdG8gYmUgZGVsZXRlZCB3aGVuCisgKiB0aGUgcm9ib3QgcHJvZ3JhbSBleGl0cy4gRWFjaCBvZiB0aGUgc2Vuc29ycyBvbiB0aGlzIGxpc3QgYXJlIHNpbmdsZXRvbnMsCisgKiB0aGF0IGlzIHRoZXkgYXJlbid0IGFsbG9jYXRlZCBkaXJlY3RseSB3aXRoIG5ldywgYnV0IGluc3RlYWQgYXJlIGFsbG9jYXRlZAorICogYnkgdGhlIHN0YXRpYyBHZXRJbnN0YW5jZSBtZXRob2QuIEFzIGEgcmVzdWx0LCB0aGV5IGFyZSBuZXZlciBkZWxldGVkIHdoZW4KKyAqIHRoZSBwcm9ncmFtIGV4aXRzLiBDb25zZXF1ZW50bHkgdGhlc2Ugc2Vuc29ycyBtYXkgc3RpbGwgYmUgaG9sZGluZyBvbnRvCisgKiByZXNvdXJjZXMgYW5kIG5lZWQgdG8gaGF2ZSB0aGVpciBkZXN0cnVjdG9ycyBjYWxsZWQgYXQgdGhlIGVuZCBvZiB0aGUgcHJvZ3JhbS4KKyAqLwordm9pZCBTZW5zb3JCYXNlOjpBZGRUb1NpbmdsZXRvbkxpc3QoKQoreworCW1fbmV4dFNpbmdsZXRvbiA9IG1fc2luZ2xldG9uTGlzdDsKKwltX3NpbmdsZXRvbkxpc3QgPSB0aGlzOworfQorCisvKioKKyAqIERlbGV0ZSBhbGwgdGhlIHNpbmdsZXRvbiBjbGFzc2VzIG9uIHRoZSBsaXN0LgorICogQWxsIHRoZSBjbGFzc2VzIHRoYXQgd2VyZSBhbGxvY2F0ZWQgYXMgc2luZ2xldG9ucyBuZWVkIHRvIGJlIGRlbGV0ZWQgc28KKyAqIHRoZWlyIHJlc291cmNlcyBjYW4gYmUgZnJlZWQuCisgKi8KK3ZvaWQgU2Vuc29yQmFzZTo6RGVsZXRlU2luZ2xldG9ucygpCit7CisJZm9yIChTZW5zb3JCYXNlICpuZXh0ID0gbV9zaW5nbGV0b25MaXN0OyBuZXh0ICE9IE5VTEw7KQorCXsKKwkJU2Vuc29yQmFzZSAqdG1wID0gbmV4dDsKKwkJbmV4dCA9IG5leHQtPm1fbmV4dFNpbmdsZXRvbjsKKwkJZGVsZXRlIHRtcDsKKwl9CisJbV9zaW5nbGV0b25MaXN0ID0gTlVMTDsKK30KKworLyoqCisgKiBDaGVjayB0aGF0IHRoZSBzb2xlbm9pZCBtb2R1bGUgbnVtYmVyIGlzIHZhbGlkLgorICoKKyAqIEByZXR1cm4gU29sZW5vaWQgbW9kdWxlIGlzIHZhbGlkIGFuZCBwcmVzZW50CisgKi8KK2Jvb2wgU2Vuc29yQmFzZTo6Q2hlY2tTb2xlbm9pZE1vZHVsZSh1aW50OF90IG1vZHVsZU51bWJlcikKK3sKKwlpZiAobW9kdWxlTnVtYmVyIDwgNjQpCisJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBDaGVjayB0aGF0IHRoZSBkaWdpdGFsIGNoYW5uZWwgbnVtYmVyIGlzIHZhbGlkLgorICogVmVyaWZ5IHRoYXQgdGhlIGNoYW5uZWwgbnVtYmVyIGlzIG9uZSBvZiB0aGUgbGVnYWwgY2hhbm5lbCBudW1iZXJzLiBDaGFubmVsIG51bWJlcnMgYXJlCisgKiAxLWJhc2VkLgorICoKKyAqIEByZXR1cm4gRGlnaXRhbCBjaGFubmVsIGlzIHZhbGlkCisgKi8KK2Jvb2wgU2Vuc29yQmFzZTo6Q2hlY2tEaWdpdGFsQ2hhbm5lbCh1aW50MzJfdCBjaGFubmVsKQoreworCWlmIChjaGFubmVsIDwga0RpZ2l0YWxDaGFubmVscykKKwkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIENoZWNrIHRoYXQgdGhlIGRpZ2l0YWwgY2hhbm5lbCBudW1iZXIgaXMgdmFsaWQuCisgKiBWZXJpZnkgdGhhdCB0aGUgY2hhbm5lbCBudW1iZXIgaXMgb25lIG9mIHRoZSBsZWdhbCBjaGFubmVsIG51bWJlcnMuIENoYW5uZWwgbnVtYmVycyBhcmUKKyAqIDEtYmFzZWQuCisgKgorICogQHJldHVybiBSZWxheSBjaGFubmVsIGlzIHZhbGlkCisgKi8KK2Jvb2wgU2Vuc29yQmFzZTo6Q2hlY2tSZWxheUNoYW5uZWwodWludDMyX3QgY2hhbm5lbCkKK3sKKwlpZiAoY2hhbm5lbCA8IGtSZWxheUNoYW5uZWxzKQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogQ2hlY2sgdGhhdCB0aGUgZGlnaXRhbCBjaGFubmVsIG51bWJlciBpcyB2YWxpZC4KKyAqIFZlcmlmeSB0aGF0IHRoZSBjaGFubmVsIG51bWJlciBpcyBvbmUgb2YgdGhlIGxlZ2FsIGNoYW5uZWwgbnVtYmVycy4gQ2hhbm5lbCBudW1iZXJzIGFyZQorICogMS1iYXNlZC4KKyAqCisgKiBAcmV0dXJuIFBXTSBjaGFubmVsIGlzIHZhbGlkCisgKi8KK2Jvb2wgU2Vuc29yQmFzZTo6Q2hlY2tQV01DaGFubmVsKHVpbnQzMl90IGNoYW5uZWwpCit7CisJaWYgKGNoYW5uZWwgPCBrUHdtQ2hhbm5lbHMpCisJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBDaGVjayB0aGF0IHRoZSBhbmFsb2cgaW5wdXQgbnVtYmVyIGlzIHZhbHVlLgorICogVmVyaWZ5IHRoYXQgdGhlIGFuYWxvZyBpbnB1dCBudW1iZXIgaXMgb25lIG9mIHRoZSBsZWdhbCBjaGFubmVsIG51bWJlcnMuIENoYW5uZWwgbnVtYmVycworICogYXJlIDAtYmFzZWQuCisgKgorICogQHJldHVybiBBbmFsb2cgY2hhbm5lbCBpcyB2YWxpZAorICovCitib29sIFNlbnNvckJhc2U6OkNoZWNrQW5hbG9nSW5wdXQodWludDMyX3QgY2hhbm5lbCkKK3sKKwlpZiAoY2hhbm5lbCA8IGtBbmFsb2dJbnB1dHMpCisJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBDaGVjayB0aGF0IHRoZSBhbmFsb2cgb3V0cHV0IG51bWJlciBpcyB2YWxpZC4KKyAqIFZlcmlmeSB0aGF0IHRoZSBhbmFsb2cgb3V0cHV0IG51bWJlciBpcyBvbmUgb2YgdGhlIGxlZ2FsIGNoYW5uZWwgbnVtYmVycy4gQ2hhbm5lbCBudW1iZXJzCisgKiBhcmUgMC1iYXNlZC4KKyAqCisgKiBAcmV0dXJuIEFuYWxvZyBjaGFubmVsIGlzIHZhbGlkCisgKi8KK2Jvb2wgU2Vuc29yQmFzZTo6Q2hlY2tBbmFsb2dPdXRwdXQodWludDMyX3QgY2hhbm5lbCkKK3sKKwlpZiAoY2hhbm5lbCA8IGtBbmFsb2dPdXRwdXRzKQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogVmVyaWZ5IHRoYXQgdGhlIHNvbGVub2lkIGNoYW5uZWwgbnVtYmVyIGlzIHdpdGhpbiBsaW1pdHMuCisgKgorICogQHJldHVybiBTb2xlbm9pZCBjaGFubmVsIGlzIHZhbGlkCisgKi8KK2Jvb2wgU2Vuc29yQmFzZTo6Q2hlY2tTb2xlbm9pZENoYW5uZWwodWludDMyX3QgY2hhbm5lbCkKK3sKKwlpZiAoY2hhbm5lbCA8IGtTb2xlbm9pZENoYW5uZWxzKQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogVmVyaWZ5IHRoYXQgdGhlIHBvd2VyIGRpc3RyaWJ1dGlvbiBjaGFubmVsIG51bWJlciBpcyB3aXRoaW4gbGltaXRzLgorICoKKyAqIEByZXR1cm4gUERQIGNoYW5uZWwgaXMgdmFsaWQKKyAqLworYm9vbCBTZW5zb3JCYXNlOjpDaGVja1BEUENoYW5uZWwodWludDMyX3QgY2hhbm5lbCkKK3sKKwlpZiAoY2hhbm5lbCA8IGtQRFBDaGFubmVscykKKwkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9TZXJ2by5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1NlcnZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWEzZGNkCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9TZXJ2by5jcHAKQEAgLTAsMCArMSwxMTEgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIlNlcnZvLmgiCisKKy8vI2luY2x1ZGUgIk5ldHdvcmtDb21tdW5pY2F0aW9uL1VzYWdlUmVwb3J0aW5nLmgiCisKK2NvbnN0ZXhwciBmbG9hdCBTZXJ2bzo6a01heFNlcnZvQW5nbGU7Citjb25zdGV4cHIgZmxvYXQgU2Vydm86OmtNaW5TZXJ2b0FuZ2xlOworCitjb25zdGV4cHIgZmxvYXQgU2Vydm86OmtEZWZhdWx0TWF4U2Vydm9QV007Citjb25zdGV4cHIgZmxvYXQgU2Vydm86OmtEZWZhdWx0TWluU2Vydm9QV007CisKKy8qKgorICogQ29tbW9uIGluaXRpYWxpemF0aW9uIGNvZGUgY2FsbGVkIGJ5IGFsbCBjb25zdHJ1Y3RvcnMuCisgKgorICogSW5pdFNlcnZvKCkgYXNzaWducyBkZWZhdWx0cyBmb3IgdGhlIHBlcmlvZCBtdWx0aXBsaWVyIGZvciB0aGUgc2Vydm8gUFdNIGNvbnRyb2wgc2lnbmFsLCBhcworICogd2VsbCBhcyB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBQV00gdmFsdWVzIHN1cHBvcnRlZCBieSB0aGUgc2Vydm8uCisgKi8KK3ZvaWQgU2Vydm86OkluaXRTZXJ2bygpCit7CisJU2V0Qm91bmRzKGtEZWZhdWx0TWF4U2Vydm9QV00sIDAuMCwgMC4wLCAwLjAsIGtEZWZhdWx0TWluU2Vydm9QV00pOworCVNldFBlcmlvZE11bHRpcGxpZXIoa1BlcmlvZE11bHRpcGxpZXJfNFgpOworCisJSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX1NlcnZvLCBHZXRDaGFubmVsKCkpOworfQorCisvKioKKyAqIEBwYXJhbSBjaGFubmVsIFRoZSBQV00gY2hhbm5lbCB0byB3aGljaCB0aGUgc2Vydm8gaXMgYXR0YWNoZWQuIDAtOSBhcmUgb24tYm9hcmQsIDEwLTE5IGFyZSBvbiB0aGUgTVhQIHBvcnQKKyAqLworU2Vydm86OlNlcnZvKHVpbnQzMl90IGNoYW5uZWwpIDogU2FmZVBXTShjaGFubmVsKQoreworCUluaXRTZXJ2bygpOworLy8JcHJpbnRmKCJEb25lIGluaXRpYWxpemluZyBzZXJ2byAlZFxuIiwgY2hhbm5lbCk7Cit9CisKK1NlcnZvOjp+U2Vydm8oKQoreworfQorCisvKioKKyAqIFNldCB0aGUgc2Vydm8gcG9zaXRpb24uCisgKgorICogU2Vydm8gdmFsdWVzIHJhbmdlIGZyb20gMC4wIHRvIDEuMCBjb3JyZXNwb25kaW5nIHRvIHRoZSByYW5nZSBvZiBmdWxsIGxlZnQgdG8gZnVsbCByaWdodC4KKyAqCisgKiBAcGFyYW0gdmFsdWUgUG9zaXRpb24gZnJvbSAwLjAgdG8gMS4wLgorICovCit2b2lkIFNlcnZvOjpTZXQoZmxvYXQgdmFsdWUpCit7CisJU2V0UG9zaXRpb24odmFsdWUpOworfQorCisvKioKKyAqIFNldCB0aGUgc2Vydm8gdG8gb2ZmbGluZS4KKyAqCisgKiBTZXQgdGhlIHNlcnZvIHJhdyB2YWx1ZSB0byAwICh1bmRyaXZlbikKKyAqLwordm9pZCBTZXJ2bzo6U2V0T2ZmbGluZSgpIHsKKwlTZXRSYXcoMCk7Cit9CisKKy8qKgorICogR2V0IHRoZSBzZXJ2byBwb3NpdGlvbi4KKyAqCisgKiBTZXJ2byB2YWx1ZXMgcmFuZ2UgZnJvbSAwLjAgdG8gMS4wIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJhbmdlIG9mIGZ1bGwgbGVmdCB0byBmdWxsIHJpZ2h0LgorICoKKyAqIEByZXR1cm4gUG9zaXRpb24gZnJvbSAwLjAgdG8gMS4wLgorICovCitmbG9hdCBTZXJ2bzo6R2V0KCkKK3sKKwlyZXR1cm4gR2V0UG9zaXRpb24oKTsKK30KKworLyoqCisgKiBTZXQgdGhlIHNlcnZvIGFuZ2xlLgorICoKKyAqIEFzc3VtZSB0aGF0IHRoZSBzZXJ2byBhbmdsZSBpcyBsaW5lYXIgd2l0aCByZXNwZWN0IHRvIHRoZSBQV00gdmFsdWUgKGJpZyBhc3N1bXB0aW9uLCBuZWVkIHRvIHRlc3QpLgorICoKKyAqIFNlcnZvIGFuZ2xlcyB0aGF0IGFyZSBvdXQgb2YgdGhlIHN1cHBvcnRlZCByYW5nZSBvZiB0aGUgc2Vydm8gc2ltcGx5ICJzYXR1cmF0ZSIgaW4gdGhhdCBkaXJlY3Rpb24KKyAqIEluIG90aGVyIHdvcmRzLCBpZiB0aGUgc2Vydm8gaGFzIGEgcmFuZ2Ugb2YgKFggZGVncmVlcyB0byBZIGRlZ3JlZXMpIHRoYW4gYW5nbGVzIG9mIGxlc3MgdGhhbiBYCisgKiByZXN1bHQgaW4gYW4gYW5nbGUgb2YgWCBiZWluZyBzZXQgYW5kIGFuZ2xlcyBvZiBtb3JlIHRoYW4gWSBkZWdyZWVzIHJlc3VsdCBpbiBhbiBhbmdsZSBvZiBZIGJlaW5nIHNldC4KKyAqCisgKiBAcGFyYW0gZGVncmVlcyBUaGUgYW5nbGUgaW4gZGVncmVlcyB0byBzZXQgdGhlIHNlcnZvLgorICovCit2b2lkIFNlcnZvOjpTZXRBbmdsZShmbG9hdCBkZWdyZWVzKQoreworCWlmIChkZWdyZWVzIDwga01pblNlcnZvQW5nbGUpCisJeworCQlkZWdyZWVzID0ga01pblNlcnZvQW5nbGU7CisJfQorCWVsc2UgaWYgKGRlZ3JlZXMgPiBrTWF4U2Vydm9BbmdsZSkKKwl7CisJCWRlZ3JlZXMgPSBrTWF4U2Vydm9BbmdsZTsKKwl9CisKKwlTZXRQb3NpdGlvbigoKGZsb2F0KSAoZGVncmVlcyAtIGtNaW5TZXJ2b0FuZ2xlKSkgLyBHZXRTZXJ2b0FuZ2xlUmFuZ2UoKSk7Cit9CisKKy8qKgorICogR2V0IHRoZSBzZXJ2byBhbmdsZS4KKyAqCisgKiBBc3N1bWUgdGhhdCB0aGUgc2Vydm8gYW5nbGUgaXMgbGluZWFyIHdpdGggcmVzcGVjdCB0byB0aGUgUFdNIHZhbHVlIChiaWcgYXNzdW1wdGlvbiwgbmVlZCB0byB0ZXN0KS4KKyAqIEByZXR1cm4gVGhlIGFuZ2xlIGluIGRlZ3JlZXMgdG8gd2hpY2ggdGhlIHNlcnZvIGlzIHNldC4KKyAqLworZmxvYXQgU2Vydm86OkdldEFuZ2xlKCkKK3sKKwlyZXR1cm4gKGZsb2F0KUdldFBvc2l0aW9uKCkgKiBHZXRTZXJ2b0FuZ2xlUmFuZ2UoKSArIGtNaW5TZXJ2b0FuZ2xlOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9Tb2xlbm9pZC5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1NvbGVub2lkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWYzZDdhCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9Tb2xlbm9pZC5jcHAKQEAgLTAsMCArMSwxMTUgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIlNvbGVub2lkLmgiCisvLyNpbmNsdWRlICJOZXR3b3JrQ29tbXVuaWNhdGlvbi9Vc2FnZVJlcG9ydGluZy5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorCisvKioKKyAqIENvbW1vbiBmdW5jdGlvbiB0byBpbXBsZW1lbnQgY29uc3RydWN0b3IgYmVoYXZpb3IuCisgKi8KK3ZvaWQgU29sZW5vaWQ6OkluaXRTb2xlbm9pZCgpCit7CisJY2hhciBidWZbNjRdOworCWlmICghQ2hlY2tTb2xlbm9pZE1vZHVsZShtX21vZHVsZU51bWJlcikpCisJeworCQlzbnByaW50ZihidWYsIDY0LCAiU29sZW5vaWQgTW9kdWxlICVkIiwgbV9tb2R1bGVOdW1iZXIpOworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChNb2R1bGVJbmRleE91dE9mUmFuZ2UsIGJ1Zik7CisJCXJldHVybjsKKwl9CisJaWYgKCFDaGVja1NvbGVub2lkQ2hhbm5lbChtX2NoYW5uZWwpKQorCXsKKwkJc25wcmludGYoYnVmLCA2NCwgIlNvbGVub2lkIENoYW5uZWwgJWQiLCBtX2NoYW5uZWwpOworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChDaGFubmVsSW5kZXhPdXRPZlJhbmdlLCBidWYpOworCQlyZXR1cm47CisJfQorCVJlc291cmNlOjpDcmVhdGVSZXNvdXJjZU9iamVjdCgmbV9hbGxvY2F0ZWQsIGtTb2xlbm9pZENoYW5uZWxzICogNjMpOworCisJc25wcmludGYoYnVmLCA2NCwgIlNvbGVub2lkICVkIChNb2R1bGU6ICVkKSIsIG1fY2hhbm5lbCwgbV9tb2R1bGVOdW1iZXIpOworCWlmIChtX2FsbG9jYXRlZC0+QWxsb2NhdGUobV9tb2R1bGVOdW1iZXIgKiBrU29sZW5vaWRDaGFubmVscyArIG1fY2hhbm5lbCwgYnVmKSA9PSB+MHVsKQorCXsKKwkJQ2xvbmVFcnJvcihtX2FsbG9jYXRlZCk7CisJCXJldHVybjsKKwl9CisKKwlIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfU29sZW5vaWQsIG1fY2hhbm5lbCwgbV9tb2R1bGVOdW1iZXIpOworfQorCisvKioKKyAqIENvbnN0cnVjdG9yIHVzaW5nIHRoZSBkZWZhdWx0IFBDTSBJRCAoMCkuCisgKgorICogQHBhcmFtIGNoYW5uZWwgVGhlIGNoYW5uZWwgb24gdGhlIFBDTSB0byBjb250cm9sICgwLi43KS4KKyAqLworU29sZW5vaWQ6OlNvbGVub2lkKHVpbnQzMl90IGNoYW5uZWwpCisJOiBTb2xlbm9pZEJhc2UgKEdldERlZmF1bHRTb2xlbm9pZE1vZHVsZSgpKQorCSwgbV9jaGFubmVsIChjaGFubmVsKQoreworCUluaXRTb2xlbm9pZCgpOworfQorCisvKioKKyAqIENvbnN0cnVjdG9yLgorICoKKyAqIEBwYXJhbSBtb2R1bGVOdW1iZXIgVGhlIENBTiBJRCBvZiB0aGUgUENNIHRoZSBzb2xlbm9pZCBpcyBhdHRhY2hlZCB0bworICogQHBhcmFtIGNoYW5uZWwgVGhlIGNoYW5uZWwgb24gdGhlIFBDTSB0byBjb250cm9sICgwLi43KS4KKyAqLworU29sZW5vaWQ6OlNvbGVub2lkKHVpbnQ4X3QgbW9kdWxlTnVtYmVyLCB1aW50MzJfdCBjaGFubmVsKQorCTogU29sZW5vaWRCYXNlIChtb2R1bGVOdW1iZXIpCisJLCBtX2NoYW5uZWwgKGNoYW5uZWwpCit7CisJSW5pdFNvbGVub2lkKCk7Cit9CisKKy8qKgorICogRGVzdHJ1Y3Rvci4KKyAqLworU29sZW5vaWQ6On5Tb2xlbm9pZCgpCit7CisJaWYgKENoZWNrU29sZW5vaWRNb2R1bGUobV9tb2R1bGVOdW1iZXIpKQorCXsKKwkJbV9hbGxvY2F0ZWQtPkZyZWUobV9tb2R1bGVOdW1iZXIgKiBrU29sZW5vaWRDaGFubmVscyArIG1fY2hhbm5lbCk7CisJfQorfQorCisvKioKKyAqIFNldCB0aGUgdmFsdWUgb2YgYSBzb2xlbm9pZC4KKyAqCisgKiBAcGFyYW0gb24gVHVybiB0aGUgc29sZW5vaWQgb3V0cHV0IG9mZiBvciBvbi4KKyAqLwordm9pZCBTb2xlbm9pZDo6U2V0KGJvb2wgb24pCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCXVpbnQ4X3QgdmFsdWUgPSBvbiA/IDB4RkYgOiAweDAwOworCXVpbnQ4X3QgbWFzayA9IDEgPDwgbV9jaGFubmVsOworCisJU29sZW5vaWRCYXNlOjpTZXQodmFsdWUsIG1hc2spOworfQorCisvKioKKyAqIFJlYWQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHNvbGVub2lkLgorICoKKyAqIEByZXR1cm4gVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHNvbGVub2lkLgorICovCitib29sIFNvbGVub2lkOjpHZXQoKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiBmYWxzZTsKKwl1aW50OF90IHZhbHVlID0gR2V0QWxsKCkgJiAoIDEgPDwgbV9jaGFubmVsKTsKKwlyZXR1cm4gKHZhbHVlICE9IDApOworfQorCisvKioKKyAqIENoZWNrIGlmIHNvbGVub2lkIGlzIGJsYWNrbGlzdGVkLgorICoJCUlmIGEgc29sZW5vaWQgaXMgc2hvcnRlZCwgaXQgaXMgYWRkZWQgdG8gdGhlIGJsYWNrbGlzdCBhbmQKKyAqCQlkaXNhYmxlZCB1bnRpbCBwb3dlciBjeWNsZSwgb3IgdW50aWwgZmF1bHRzIGFyZSBjbGVhcmVkLgorICoJCUBzZWUgQ2xlYXJBbGxQQ01TdGlja3lGYXVsdHMoKQorICoKKyAqIEByZXR1cm4gSWYgc29sZW5vaWQgaXMgZGlzYWJsZWQgZHVlIHRvIHNob3J0LgorICovCitib29sIFNvbGVub2lkOjpJc0JsYWNrTGlzdGVkKCkKK3sKKwlpbnQgdmFsdWUgPSBHZXRQQ01Tb2xlbm9pZEJsYWNrTGlzdCgpICYgKCAxIDw8IG1fY2hhbm5lbCk7CisJcmV0dXJuICh2YWx1ZSAhPSAwKTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvU29sZW5vaWRCYXNlLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvU29sZW5vaWRCYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWI0NmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9Tb2xlbm9pZEJhc2UuY3BwCkBAIC0wLDAgKzEsMTExIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJTb2xlbm9pZEJhc2UuaCIKKworLy8gTmVlZHMgdG8gYmUgZ2xvYmFsIHNpbmNlIHRoZSBwcm90ZWN0ZWQgcmVzb3VyY2Ugc3BhbnMgYWxsIFNvbGVub2lkIG9iamVjdHMuCitSZXNvdXJjZSAqU29sZW5vaWRCYXNlOjptX2FsbG9jYXRlZCA9IE5VTEw7CisKKy8qKgorICogQ29uc3RydWN0b3IKKyAqIAorICogQHBhcmFtIG1vZHVsZU51bWJlciBUaGUgQ0FOIFBDTSBJRC4KKyAqLworU29sZW5vaWRCYXNlOjpTb2xlbm9pZEJhc2UodWludDhfdCBtb2R1bGVOdW1iZXIpCisJOiBtX21vZHVsZU51bWJlciAobW9kdWxlTnVtYmVyKQoreworICAJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGtTb2xlbm9pZENoYW5uZWxzOyBpKyspCisJeworCSAgdm9pZCogcG9ydCA9IGdldFBvcnRXaXRoTW9kdWxlKG1vZHVsZU51bWJlciwgaSk7CisJICBpbnQzMl90IHN0YXR1cyA9IDA7CisJICBtX3BvcnRzW2ldID0gaW5pdGlhbGl6ZVNvbGVub2lkUG9ydChwb3J0LCAmc3RhdHVzKTsKKwkgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KK30KKworLyoqCisgKiBEZXN0cnVjdG9yLgorICovCitTb2xlbm9pZEJhc2U6On5Tb2xlbm9pZEJhc2UoKQoreworfQorCisvKioKKyAqIFNldCB0aGUgdmFsdWUgb2YgYSBzb2xlbm9pZC4KKyAqIAorICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB5b3Ugd2FudCB0byBzZXQgb24gdGhlIG1vZHVsZS4KKyAqIEBwYXJhbSBtYXNrIFRoZSBjaGFubmVscyB5b3Ugd2FudCB0byBiZSBhZmZlY3RlZC4KKyAqLwordm9pZCBTb2xlbm9pZEJhc2U6OlNldCh1aW50OF90IHZhbHVlLCB1aW50OF90IG1hc2spCit7CisgIAlpbnQzMl90IHN0YXR1cyA9IDA7CisJCXNldFNvbGVub2lkcyhtX3BvcnRzWzBdLCB2YWx1ZSwgbWFzaywgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogUmVhZCBhbGwgOCBzb2xlbm9pZHMgYXMgYSBzaW5nbGUgYnl0ZQorICogCisgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHZhbHVlIG9mIGFsbCA4IHNvbGVub2lkcyBvbiB0aGUgbW9kdWxlLgorICovCit1aW50OF90IFNvbGVub2lkQmFzZTo6R2V0QWxsKCkKK3sKKyAgCXVpbnQ4X3QgdmFsdWUgPSAwOworICAJaW50MzJfdCBzdGF0dXMgPSAwOworCWZvciAoaW50IGkgPSAwOyBpIDwgODsgaSsrKSB7IC8vIFhYWDogVW5oYXJkY29kZQorCSAgdmFsdWUgfD0gZ2V0U29sZW5vaWQobV9wb3J0c1tpXSwgJnN0YXR1cykgPDwgaTsKKwl9CisJcmV0dXJuIHZhbHVlOworfQorLyoqCisgKiBSZWFkcyBjb21wbGV0ZSBzb2xlbm9pZCBibGFja2xpc3QgZm9yIGFsbCA4IHNvbGVub2lkcyBhcyBhIHNpbmdsZSBieXRlLgorICogCisgKgkJSWYgYSBzb2xlbm9pZCBpcyBzaG9ydGVkLCBpdCBpcyBhZGRlZCB0byB0aGUgYmxhY2tsaXN0IGFuZAorICoJCWRpc2FibGVkIHVudGlsIHBvd2VyIGN5Y2xlLCBvciB1bnRpbCBmYXVsdHMgYXJlIGNsZWFyZWQuCisgKgkJQHNlZSBDbGVhckFsbFBDTVN0aWNreUZhdWx0cygpCisgKiAKKyAqIEByZXR1cm4gVGhlIHNvbGVub2lkIGJsYWNrbGlzdCBvZiBhbGwgOCBzb2xlbm9pZHMgb24gdGhlIG1vZHVsZS4KKyAqLwordWludDhfdCBTb2xlbm9pZEJhc2U6OkdldFBDTVNvbGVub2lkQmxhY2tMaXN0KCkKK3sKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJcmV0dXJuIGdldFBDTVNvbGVub2lkQmxhY2tMaXN0KG1fcG9ydHNbMF0sICZzdGF0dXMpOworfQorLyoqCisgKiBAcmV0dXJuIHRydWUgaWYgUENNIHN0aWNreSBmYXVsdCBpcyBzZXQgOiBUaGUgY29tbW9uIAorICoJCQloaWdoc2lkZSBzb2xlbm9pZCB2b2x0YWdlIHJhaWwgaXMgdG9vIGxvdywKKyAqCSAJCW1vc3QgbGlrZWx5IGEgc29sZW5vaWQgY2hhbm5lbCBpcyBzaG9ydGVkLgorICovCitib29sIFNvbGVub2lkQmFzZTo6R2V0UENNU29sZW5vaWRWb2x0YWdlU3RpY2t5RmF1bHQoKQoreworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlyZXR1cm4gZ2V0UENNU29sZW5vaWRWb2x0YWdlU3RpY2t5RmF1bHQobV9wb3J0c1swXSwgJnN0YXR1cyk7Cit9CisvKioKKyAqIEByZXR1cm4gdHJ1ZSBpZiBQQ00gaXMgaW4gZmF1bHQgc3RhdGUgOiBUaGUgY29tbW9uIAorICoJCQloaWdoc2lkZSBzb2xlbm9pZCB2b2x0YWdlIHJhaWwgaXMgdG9vIGxvdywKKyAqCSAJCW1vc3QgbGlrZWx5IGEgc29sZW5vaWQgY2hhbm5lbCBpcyBzaG9ydGVkLgorICovCitib29sIFNvbGVub2lkQmFzZTo6R2V0UENNU29sZW5vaWRWb2x0YWdlRmF1bHQoKQoreworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlyZXR1cm4gZ2V0UENNU29sZW5vaWRWb2x0YWdlRmF1bHQobV9wb3J0c1swXSwgJnN0YXR1cyk7Cit9CisvKioKKyAqIENsZWFyIEFMTCBzdGlja3kgZmF1bHRzIGluc2lkZSBQQ00gdGhhdCBDb21wcmVzc29yIGlzIHdpcmVkIHRvLgorICoKKyAqIElmIGEgc3RpY2t5IGZhdWx0IGlzIHNldCwgdGhlbiBpdCB3aWxsIGJlIHBlcnNpc3RlbnRseSBjbGVhcmVkLiAgQ29tcHJlc3NvciBkcml2ZQorICoJCW1heWJlIG1vbWVudGFyaWx5IGRpc2FibGUgd2hpbGUgZmxhZ3MgYXJlIGJlaW5nIGNsZWFyZWQuIENhcmUgc2hvdWxkIGJlIAorICoJCXRha2VuIHRvIG5vdCBjYWxsIHRoaXMgdG9vIGZyZXF1ZW50bHksIG90aGVyd2lzZSBub3JtYWwgY29tcHJlc3NvciAKKyAqCQlmdW5jdGlvbmFsaXR5IG1heSBiZSBwcmV2ZW50ZWQuCisgKgorICogSWYgbm8gc3RpY2t5IGZhdWx0cyBhcmUgc2V0IHRoZW4gdGhpcyBjYWxsIHdpbGwgaGF2ZSBubyBlZmZlY3QuCisgKi8KK3ZvaWQgU29sZW5vaWRCYXNlOjpDbGVhckFsbFBDTVN0aWNreUZhdWx0cygpCit7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCXJldHVybiBjbGVhckFsbFBDTVN0aWNreUZhdWx0c19zb2wobV9wb3J0c1swXSwgJnN0YXR1cyk7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1RhbG9uLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvVGFsb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZWIzOTYKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1RhbG9uLmNwcApAQCAtMCwwICsxLDg3IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJUYWxvbi5oIgorCisvLyNpbmNsdWRlICJOZXR3b3JrQ29tbXVuaWNhdGlvbi9Vc2FnZVJlcG9ydGluZy5oIgorCisvKioKKyAqIENvbW1vbiBpbml0aWFsaXphdGlvbiBjb2RlIGNhbGxlZCBieSBhbGwgY29uc3RydWN0b3JzLgorICoKKyAqIE5vdGUgdGhhdCB0aGUgVGFsb24gdXNlcyB0aGUgZm9sbG93aW5nIGJvdW5kcyBmb3IgUFdNIHZhbHVlcy4gVGhlc2UgdmFsdWVzIHNob3VsZCB3b3JrIHJlYXNvbmFibHkgd2VsbCBmb3IKKyAqIG1vc3QgY29udHJvbGxlcnMsIGJ1dCBpZiB1c2VycyBleHBlcmllbmNlIGlzc3VlcyBzdWNoIGFzIGFzeW1tZXRyaWMgYmVoYXZpb3IgYXJvdW5kCisgKiB0aGUgZGVhZGJhbmQgb3IgaW5hYmlsaXR5IHRvIHNhdHVyYXRlIHRoZSBjb250cm9sbGVyIGluIGVpdGhlciBkaXJlY3Rpb24sIGNhbGlicmF0aW9uIGlzIHJlY29tbWVuZGVkLgorICogVGhlIGNhbGlicmF0aW9uIHByb2NlZHVyZSBjYW4gYmUgZm91bmQgaW4gdGhlIFRhbG9uIFVzZXIgTWFudWFsIGF2YWlsYWJsZSBmcm9tIENUUkUuCisgKgorICogICAyLjAzN21zID0gZnVsbCAiZm9yd2FyZCIKKyAqICAgMS41MzltcyA9IHRoZSAiaGlnaCBlbmQiIG9mIHRoZSBkZWFkYmFuZCByYW5nZQorICogICAxLjUxM21zID0gY2VudGVyIG9mIHRoZSBkZWFkYmFuZCByYW5nZSAob2ZmKQorICogICAxLjQ4N21zID0gdGhlICJsb3cgZW5kIiBvZiB0aGUgZGVhZGJhbmQgcmFuZ2UKKyAqICAgMC45ODltcyA9IGZ1bGwgInJldmVyc2UiCisgKi8KK3ZvaWQgVGFsb246OkluaXRUYWxvbigpIHsKKwlTZXRCb3VuZHMoMi4wMzcsIDEuNTM5LCAxLjUxMywgMS40ODcsIC45ODkpOworCVNldFBlcmlvZE11bHRpcGxpZXIoa1BlcmlvZE11bHRpcGxpZXJfMVgpOworCVNldFJhdyhtX2NlbnRlclB3bSk7CisJU2V0WmVyb0xhdGNoKCk7CisKKwlIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfVGFsb24sIEdldENoYW5uZWwoKSk7Cit9CisKKy8qKgorICogQ29uc3RydWN0b3IgZm9yIGEgVGFsb24gKG9yaWdpbmFsIG9yIFRhbG9uIFNSKQorICogQHBhcmFtIGNoYW5uZWwgVGhlIFBXTSBjaGFubmVsIG51bWJlciB0aGF0IHRoZSBUYWxvbiBpcyBhdHRhY2hlZCB0by4gMC05IGFyZSBvbi1ib2FyZCwgMTAtMTkgYXJlIG9uIHRoZSBNWFAgcG9ydAorICovCitUYWxvbjo6VGFsb24odWludDMyX3QgY2hhbm5lbCkgOiBTYWZlUFdNKGNoYW5uZWwpCit7CisJSW5pdFRhbG9uKCk7Cit9CisKK1RhbG9uOjp+VGFsb24oKQoreworfQorCisvKioKKyAqIFNldCB0aGUgUFdNIHZhbHVlLgorICoKKyAqIFRoZSBQV00gdmFsdWUgaXMgc2V0IHVzaW5nIGEgcmFuZ2Ugb2YgLTEuMCB0byAxLjAsIGFwcHJvcHJpYXRlbHkKKyAqIHNjYWxpbmcgdGhlIHZhbHVlIGZvciB0aGUgRlBHQS4KKyAqCisgKiBAcGFyYW0gc3BlZWQgVGhlIHNwZWVkIHZhbHVlIGJldHdlZW4gLTEuMCBhbmQgMS4wIHRvIHNldC4KKyAqIEBwYXJhbSBzeW5jR3JvdXAgVW51c2VkIGludGVyZmFjZS4KKyAqLwordm9pZCBUYWxvbjo6U2V0KGZsb2F0IHNwZWVkLCB1aW50OF90IHN5bmNHcm91cCkKK3sKKwlTZXRTcGVlZChzcGVlZCk7Cit9CisKKy8qKgorICogR2V0IHRoZSByZWNlbnRseSBzZXQgdmFsdWUgb2YgdGhlIFBXTS4KKyAqCisgKiBAcmV0dXJuIFRoZSBtb3N0IHJlY2VudGx5IHNldCB2YWx1ZSBmb3IgdGhlIFBXTSBiZXR3ZWVuIC0xLjAgYW5kIDEuMC4KKyAqLworZmxvYXQgVGFsb246OkdldCgpCit7CisJcmV0dXJuIEdldFNwZWVkKCk7Cit9CisKKy8qKgorICogQ29tbW9uIGludGVyZmFjZSBmb3IgZGlzYWJsaW5nIGEgbW90b3IuCisgKi8KK3ZvaWQgVGFsb246OkRpc2FibGUoKQoreworCVNldFJhdyhrUHdtRGlzYWJsZWQpOworfQorCisvKioKKyAqIFdyaXRlIG91dCB0aGUgUElEIHZhbHVlIGFzIHNlZW4gaW4gdGhlIFBJRE91dHB1dCBiYXNlIG9iamVjdC4KKyAqCisgKiBAcGFyYW0gb3V0cHV0IFdyaXRlIG91dCB0aGUgUFdNIHZhbHVlIGFzIHdhcyBmb3VuZCBpbiB0aGUgUElEQ29udHJvbGxlcgorICovCit2b2lkIFRhbG9uOjpQSURXcml0ZShmbG9hdCBvdXRwdXQpCit7CisJU2V0KG91dHB1dCk7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1RhbG9uU1JYLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvVGFsb25TUlguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZjljZTYKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1RhbG9uU1JYLmNwcApAQCAtMCwwICsxLDg2IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJUYWxvblNSWC5oIgorCisvLyNpbmNsdWRlICJOZXR3b3JrQ29tbXVuaWNhdGlvbi9Vc2FnZVJlcG9ydGluZy5oIgorCisvKioKKyAqIENvbW1vbiBpbml0aWFsaXphdGlvbiBjb2RlIGNhbGxlZCBieSBhbGwgY29uc3RydWN0b3JzLgorICoKKyAqIE5vdGUgdGhhdCB0aGUgVGFsb25TUlggdXNlcyB0aGUgZm9sbG93aW5nIGJvdW5kcyBmb3IgUFdNIHZhbHVlcy4gVGhlc2UgdmFsdWVzIHNob3VsZCB3b3JrIHJlYXNvbmFibHkgd2VsbCBmb3IKKyAqIG1vc3QgY29udHJvbGxlcnMsIGJ1dCBpZiB1c2VycyBleHBlcmllbmNlIGlzc3VlcyBzdWNoIGFzIGFzeW1tZXRyaWMgYmVoYXZpb3VyIGFyb3VuZAorICogdGhlIGRlYWRiYW5kIG9yIGluYWJpbGl0eSB0byBzYXR1cmF0ZSB0aGUgY29udHJvbGxlciBpbiBlaXRoZXIgZGlyZWN0aW9uLCBjYWxpYnJhdGlvbiBpcyByZWNvbW1lbmRlZC4KKyAqIFRoZSBjYWxpYnJhdGlvbiBwcm9jZWR1cmUgY2FuIGJlIGZvdW5kIGluIHRoZSBUYWxvblNSWCBVc2VyIE1hbnVhbCBhdmFpbGFibGUgZnJvbSBDcm9zcyBUaGUgUm9hZCBFbGVjdHJvbmljcy4KKyAqICAgMi4wMDRtcyA9IGZ1bGwgImZvcndhcmQiCisgKiAgIDEuNTJtcyA9IHRoZSAiaGlnaCBlbmQiIG9mIHRoZSBkZWFkYmFuZCByYW5nZQorICogICAxLjUwbXMgPSBjZW50ZXIgb2YgdGhlIGRlYWRiYW5kIHJhbmdlIChvZmYpCisgKiAgIDEuNDhtcyA9IHRoZSAibG93IGVuZCIgb2YgdGhlIGRlYWRiYW5kIHJhbmdlCisgKiAgIDAuOTk3bXMgPSBmdWxsICJyZXZlcnNlIgorICovCit2b2lkIFRhbG9uU1JYOjpJbml0VGFsb25TUlgoKSB7CisJU2V0Qm91bmRzKDIuMDA0LCAxLjUyLCAxLjUwLCAxLjQ4LCAuOTk3KTsKKwlTZXRQZXJpb2RNdWx0aXBsaWVyKGtQZXJpb2RNdWx0aXBsaWVyXzFYKTsKKwlTZXRSYXcobV9jZW50ZXJQd20pOworCVNldFplcm9MYXRjaCgpOworCisJSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX1RhbG9uLCBHZXRDaGFubmVsKCkpOworfQorCisvKioKKyAqIENvbnN0cnVjdCBhIFRhbG9uU1JYIGNvbm5lY3RlZCB2aWEgUFdNCisgKiBAcGFyYW0gY2hhbm5lbCBUaGUgUFdNIGNoYW5uZWwgdGhhdCB0aGUgVGFsb25TUlggaXMgYXR0YWNoZWQgdG8uIDAtOSBhcmUgb24tYm9hcmQsIDEwLTE5IGFyZSBvbiB0aGUgTVhQIHBvcnQKKyAqLworVGFsb25TUlg6OlRhbG9uU1JYKHVpbnQzMl90IGNoYW5uZWwpIDogU2FmZVBXTShjaGFubmVsKQoreworCUluaXRUYWxvblNSWCgpOworfQorCitUYWxvblNSWDo6flRhbG9uU1JYKCkKK3sKK30KKworLyoqCisgKiBTZXQgdGhlIFBXTSB2YWx1ZS4KKyAqCisgKiBUaGUgUFdNIHZhbHVlIGlzIHNldCB1c2luZyBhIHJhbmdlIG9mIC0xLjAgdG8gMS4wLCBhcHByb3ByaWF0ZWx5CisgKiBzY2FsaW5nIHRoZSB2YWx1ZSBmb3IgdGhlIEZQR0EuCisgKgorICogQHBhcmFtIHNwZWVkIFRoZSBzcGVlZCB2YWx1ZSBiZXR3ZWVuIC0xLjAgYW5kIDEuMCB0byBzZXQuCisgKiBAcGFyYW0gc3luY0dyb3VwIFVudXNlZCBpbnRlcmZhY2UuCisgKi8KK3ZvaWQgVGFsb25TUlg6OlNldChmbG9hdCBzcGVlZCwgdWludDhfdCBzeW5jR3JvdXApCit7CisJU2V0U3BlZWQoc3BlZWQpOworfQorCisvKioKKyAqIEdldCB0aGUgcmVjZW50bHkgc2V0IHZhbHVlIG9mIHRoZSBQV00uCisgKgorICogQHJldHVybiBUaGUgbW9zdCByZWNlbnRseSBzZXQgdmFsdWUgZm9yIHRoZSBQV00gYmV0d2VlbiAtMS4wIGFuZCAxLjAuCisgKi8KK2Zsb2F0IFRhbG9uU1JYOjpHZXQoKQoreworCXJldHVybiBHZXRTcGVlZCgpOworfQorCisvKioKKyAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIGRpc2FibGluZyBhIG1vdG9yLgorICovCit2b2lkIFRhbG9uU1JYOjpEaXNhYmxlKCkKK3sKKwlTZXRSYXcoa1B3bURpc2FibGVkKTsKK30KKworLyoqCisgKiBXcml0ZSBvdXQgdGhlIFBJRCB2YWx1ZSBhcyBzZWVuIGluIHRoZSBQSURPdXRwdXQgYmFzZSBvYmplY3QuCisgKgorICogQHBhcmFtIG91dHB1dCBXcml0ZSBvdXQgdGhlIFBXTSB2YWx1ZSBhcyB3YXMgZm91bmQgaW4gdGhlIFBJRENvbnRyb2xsZXIKKyAqLwordm9pZCBUYWxvblNSWDo6UElEV3JpdGUoZmxvYXQgb3V0cHV0KQoreworCVNldChvdXRwdXQpOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9UYXNrLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvVGFzay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI4MDE0MgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvVGFzay5jcHAKQEAgLTAsMCArMSwyMTMgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIlRhc2suaCIKKworLy8jaW5jbHVkZSAiTmV0d29ya0NvbW11bmljYXRpb24vVXNhZ2VSZXBvcnRpbmcuaCIKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiSEFML0hBTC5ocHAiCisKKyNpZm5kZWYgT0sKKyNkZWZpbmUgT0sJCTAKKyNlbmRpZiAvKiBPSyAqLworI2lmbmRlZiBFUlJPUgorI2RlZmluZSBFUlJPUgkJKC0xKQorI2VuZGlmIC8qIEVSUk9SICovCisKK2NvbnN0IHVpbnQzMl90IFRhc2s6OmtEZWZhdWx0UHJpb3JpdHk7CisKKy8qKgorICogQ3JlYXRlIGJ1dCBkb24ndCBsYXVuY2ggYSB0YXNrLgorICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHRhc2suICAiRlJDXyIgd2lsbCBiZSBwcmVwZW5kZWQgdG8gdGhlIHRhc2sgbmFtZS4KKyAqIEBwYXJhbSBmdW5jdGlvbiBUaGUgYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24gdG8gcnVuIGFzIHRoZSBuZXcgdGFzay4KKyAqIEBwYXJhbSBwcmlvcml0eSBUaGUgVnhXb3JrcyBwcmlvcml0eSBmb3IgdGhlIHRhc2suCisgKiBAcGFyYW0gc3RhY2tTaXplIFRoZSBzaXplIG9mIHRoZSBzdGFjayBmb3IgdGhlIHRhc2sKKyAqLworVGFzazo6VGFzayhjb25zdCBjaGFyKiBuYW1lLCBGVU5DUFRSIGZ1bmN0aW9uLCBpbnQzMl90IHByaW9yaXR5LCB1aW50MzJfdCBzdGFja1NpemUpCit7CisJbV90YXNrSUQgPSBOVUxMX1RBU0s7CisJbV9mdW5jdGlvbiA9IGZ1bmN0aW9uOworCW1fcHJpb3JpdHkgPSBwcmlvcml0eTsKKwltX3N0YWNrU2l6ZSA9IHN0YWNrU2l6ZTsKKwltX3Rhc2tOYW1lID0gbmV3IGNoYXJbc3RybGVuKG5hbWUpICsgNV07CisJc3RyY3B5KG1fdGFza05hbWUsICJGUkNfIik7CisJc3RyY3B5KG1fdGFza05hbWUrNCwgbmFtZSk7CisKKwlzdGF0aWMgaW50MzJfdCBpbnN0YW5jZXMgPSAwOworCWluc3RhbmNlcysrOworCUhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9UYXNrLCBpbnN0YW5jZXMsIDAsIG1fdGFza05hbWUpOworfQorCitUYXNrOjp+VGFzaygpCit7CisJaWYgKG1fdGFza0lEICE9IE5VTExfVEFTSykgU3RvcCgpOworCWRlbGV0ZSBbXSBtX3Rhc2tOYW1lOworCW1fdGFza05hbWUgPSBOVUxMOworfQorCisvKioKKyAqIFN0YXJ0cyB0aGlzIHRhc2suCisgKiBJZiBpdCBpcyBhbHJlYWR5IHJ1bm5pbmcgb3IgdW5hYmxlIHRvIHN0YXJ0LCBpdCBmYWlscyBhbmQgcmV0dXJucyBmYWxzZS4KKyAqLworYm9vbCBUYXNrOjpTdGFydCh1aW50MzJfdCBhcmcwLCB1aW50MzJfdCBhcmcxLCB1aW50MzJfdCBhcmcyLCB1aW50MzJfdCBhcmczLCB1aW50MzJfdCBhcmc0LCAKKwkJdWludDMyX3QgYXJnNSwgdWludDMyX3QgYXJnNiwgdWludDMyX3QgYXJnNywgdWludDMyX3QgYXJnOCwgdWludDMyX3QgYXJnOSkKK3sKKwltX3Rhc2tJRCA9IHNwYXduVGFzayhtX3Rhc2tOYW1lLAorCQkJCQkJbV9wcmlvcml0eSwKKwkJCQkJCVZYV09SS1NfRlBfVEFTSywJCQkJCQkJLy8gb3B0aW9ucworCQkJCQkJbV9zdGFja1NpemUsCQkJCQkJLy8gc3RhY2sgc2l6ZQorCQkJCQkJbV9mdW5jdGlvbiwJCQkJCQkJLy8gZnVuY3Rpb24gdG8gc3RhcnQKKwkJCQkJCWFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsCS8vIHBhcmFtZXRlciAxIC0gcG9pbnRlciB0byB0aGlzIGNsYXNzCisJCQkJCQlhcmc1LCBhcmc2LCBhcmc3LCBhcmc4LCBhcmc5KTsvLyBhZGRpdGlvbmFsIHVudXNlZCBwYXJhbWV0ZXJzCisJaWYgKG1fdGFza0lEID09IE5VTExfVEFTSykgeworCQlIYW5kbGVFcnJvcihFUlJPUik7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogUmVzdGFydHMgYSBydW5uaW5nIHRhc2suCisgKiBJZiB0aGUgdGFzayBpc24ndCBzdGFydGVkLCBpdCBzdGFydHMgaXQuCisgKiBAcmV0dXJuIGZhbHNlIGlmIHRoZSB0YXNrIGlzIHJ1bm5pbmcgYW5kIHdlIGFyZSB1bmFibGUgdG8ga2lsbCB0aGUgcHJldmlvdXMgaW5zdGFuY2UKKyAqLworYm9vbCBUYXNrOjpSZXN0YXJ0KCkKK3sKKwlyZXR1cm4gSGFuZGxlRXJyb3IocmVzdGFydFRhc2sobV90YXNrSUQpKTsKK30KKworLyoqCisgKiBLaWxscyB0aGUgcnVubmluZyB0YXNrLgorICogQHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzIGZhbHNlIGlmIHRoZSB0YXNrIGRvZXNuJ3QgZXhpc3Qgb3Igd2UgYXJlIHVuYWJsZSB0byBraWxsIGl0LgorICovCitib29sIFRhc2s6OlN0b3AoKQoreworCWJvb2wgb2sgPSB0cnVlOworCWlmIChWZXJpZnkoKSkKKwl7CisJCW9rID0gSGFuZGxlRXJyb3IoZGVsZXRlVGFzayhtX3Rhc2tJRCkpOworCX0KKwltX3Rhc2tJRCA9IE5VTExfVEFTSzsKKwlyZXR1cm4gb2s7Cit9CisKKy8qKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSB0YXNrIGlzIHJlYWR5IHRvIGV4ZWN1dGUgKGkuZS4gbm90IHN1c3BlbmRlZCwgZGVsYXllZCwgb3IgYmxvY2tlZCkuCisgKiBAcmV0dXJuIHRydWUgaWYgcmVhZHksIGZhbHNlIGlmIG5vdCByZWFkeS4KKyAqLworYm9vbCBUYXNrOjpJc1JlYWR5KCkKK3sKKwlyZXR1cm4gaXNUYXNrUmVhZHkobV90YXNrSUQpOworfQorCisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdGFzayB3YXMgZXhwbGljaXRseSBzdXNwZW5kZWQgYnkgY2FsbGluZyBTdXNwZW5kKCkKKyAqIEByZXR1cm4gdHJ1ZSBpZiBzdXNwZW5kZWQsIGZhbHNlIGlmIG5vdCBzdXNwZW5kZWQuCisgKi8KK2Jvb2wgVGFzazo6SXNTdXNwZW5kZWQoKQoreworCXJldHVybiBpc1Rhc2tTdXNwZW5kZWQobV90YXNrSUQpOworfQorCisvKioKKyAqIFBhdXNlcyBhIHJ1bm5pbmcgdGFzay4KKyAqIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiB1bmFibGUgdG8gcGF1c2Ugb3IgdGhlIHRhc2sgaXNuJ3QgcnVubmluZy4KKyAqLworYm9vbCBUYXNrOjpTdXNwZW5kKCkKK3sKKwlyZXR1cm4gSGFuZGxlRXJyb3Ioc3VzcGVuZFRhc2sobV90YXNrSUQpKTsKK30KKworLyoqCisgKiBSZXN1bWVzIGEgcGF1c2VkIHRhc2suCisgKiBSZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgdW5hYmxlIHRvIHJlc3VtZSBvciBpZiB0aGUgdGFzayBpc24ndCBydW5uaW5nL3BhdXNlZC4KKyAqLworYm9vbCBUYXNrOjpSZXN1bWUoKQoreworCXJldHVybiBIYW5kbGVFcnJvcihyZXN1bWVUYXNrKG1fdGFza0lEKSk7Cit9CisKKy8qKgorICogVmVyaWZpZXMgYSB0YXNrIHN0aWxsIGV4aXN0cy4KKyAqIEByZXR1cm5zIHRydWUgb24gc3VjY2Vzcy4KKyAqLworYm9vbCBUYXNrOjpWZXJpZnkoKQoreworCXJldHVybiB2ZXJpZnlUYXNrSUQobV90YXNrSUQpID09IE9LOworfQorCisvKioKKyAqIEdldHMgdGhlIHByaW9yaXR5IG9mIGEgdGFzay4KKyAqIEByZXR1cm5zIHRhc2sgcHJpb3JpdHkgb3IgMCBpZiBhbiBlcnJvciBvY2N1cmVkCisgKi8KK2ludDMyX3QgVGFzazo6R2V0UHJpb3JpdHkoKQoreworCWlmIChIYW5kbGVFcnJvcihnZXRUYXNrUHJpb3JpdHkobV90YXNrSUQsICZtX3ByaW9yaXR5KSkpCisJCXJldHVybiBtX3ByaW9yaXR5OworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKy8qKgorICogVGhpcyByb3V0aW5lIGNoYW5nZXMgYSB0YXNrJ3MgcHJpb3JpdHkgdG8gYSBzcGVjaWZpZWQgcHJpb3JpdHkuCisgKiBQcmlvcml0aWVzIHJhbmdlIGZyb20gMCwgdGhlIGhpZ2hlc3QgcHJpb3JpdHksIHRvIDI1NSwgdGhlIGxvd2VzdCBwcmlvcml0eS4KKyAqIERlZmF1bHQgdGFzayBwcmlvcml0eSBpcyAxMDAuCisgKiBAcGFyYW0gcHJpb3JpdHkgVGhlIHByaW9yaXR5IHRoZSB0YXNrIHNob3VsZCBydW4gYXQuCisgKiBAcmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuCisgKi8KK2Jvb2wgVGFzazo6U2V0UHJpb3JpdHkoaW50MzJfdCBwcmlvcml0eSkKK3sKKwltX3ByaW9yaXR5ID0gcHJpb3JpdHk7CisJcmV0dXJuIEhhbmRsZUVycm9yKHNldFRhc2tQcmlvcml0eShtX3Rhc2tJRCwgbV9wcmlvcml0eSkpOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHRhc2suCisgKiBAcmV0dXJucyBQb2ludGVyIHRvIHRoZSBuYW1lIG9mIHRoZSB0YXNrIG9yIE5VTEwgaWYgbm90IGFsbG9jYXRlZAorICovCitjb25zdCBjaGFyKiBUYXNrOjpHZXROYW1lKCkKK3sKKwlyZXR1cm4gbV90YXNrTmFtZTsKK30KKworLyoqCisgKiBHZXQgdGhlIElEIG9mIGEgdGFzaworICogQHJldHVybnMgVGFzayBJRCBvZiB0aGlzIHRhc2suICBUYXNrOjprSW52YWxpZFRhc2tJRCAoLTEpIGlmIHRoZSB0YXNrIGhhcyBub3QgYmVlbiBzdGFydGVkIG9yIGhhcyBhbHJlYWR5IGV4aXRlZC4KKyAqLworVEFTSyBUYXNrOjpHZXRJRCgpCit7CisJaWYgKFZlcmlmeSgpKQorCQlyZXR1cm4gbV90YXNrSUQ7CisJcmV0dXJuIE5VTExfVEFTSzsKK30KKworLyoqCisgKiBIYW5kbGVzIGVycm9ycyBnZW5lcmF0ZWQgYnkgdGFzayByZWxhdGVkIGNvZGUuCisgKi8KK2Jvb2wgVGFzazo6SGFuZGxlRXJyb3IoU1RBVFVTIHJlc3VsdHMpCit7CisJaWYgKHJlc3VsdHMgIT0gRVJST1IpIHJldHVybiB0cnVlOworCWludCBlcnJzdiA9IGVycm5vOworCWlmIChlcnJzdiA9PSBIQUxfb2JqTGliX09CSl9JRF9FUlJPUikgeworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChUYXNrSURFcnJvciwgbV90YXNrTmFtZSk7CisJfSBlbHNlIGlmIChlcnJzdiA9PSBIQUxfb2JqTGliX09CSl9ERUxFVEVEKSB7CisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFRhc2tEZWxldGVkRXJyb3IsIG1fdGFza05hbWUpOworCX0gZWxzZSBpZiAoZXJyc3YgPT0gSEFMX3Rhc2tMaWJfSUxMRUdBTF9PUFRJT05TKSB7CisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFRhc2tPcHRpb25zRXJyb3IsIG1fdGFza05hbWUpOworCX0gZWxzZSBpZiAoZXJyc3YgPT0gSEFMX21lbUxpYl9OT1RfRU5PVUdIX01FTU9SWSkgeworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChUYXNrTWVtb3J5RXJyb3IsIG1fdGFza05hbWUpOworCX0gZWxzZSBpZiAoZXJyc3YgPT0gSEFMX3Rhc2tMaWJfSUxMRUdBTF9QUklPUklUWSkgeworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChUYXNrUHJpb3JpdHlFcnJvciwgbV90YXNrTmFtZSk7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCJFUlJPUjogZXJybm89JWkiLCBlcnJzdik7CisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFRhc2tFcnJvciwgbV90YXNrTmFtZSk7CisJfQorCXJldHVybiBmYWxzZTsKK30KKwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9UaW1lci5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1RpbWVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTM3MzdjCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9UaW1lci5jcHAKQEAgLTAsMCArMSwxOTEgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIlRpbWVyLmgiCisKKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlICJIQUwvSEFMLmhwcCIKKyNpbmNsdWRlICJIQUwvY3BwL1N5bmNocm9uaXplZC5ocHAiCisjaW5jbHVkZSAiVXRpbGl0eS5oIgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCisvKioKKyAqIFBhdXNlIHRoZSB0YXNrIGZvciBhIHNwZWNpZmllZCB0aW1lLgorICoKKyAqIFBhdXNlIHRoZSBleGVjdXRpb24gb2YgdGhlIHByb2dyYW0gZm9yIGEgc3BlY2lmaWVkIHBlcmlvZCBvZiB0aW1lIGdpdmVuIGluIHNlY29uZHMuCisgKiBNb3RvcnMgd2lsbCBjb250aW51ZSB0byBydW4gYXQgdGhlaXIgbGFzdCBhc3NpZ25lZCB2YWx1ZXMsIGFuZCBzZW5zb3JzIHdpbGwgY29udGludWUgdG8KKyAqIHVwZGF0ZS4gT25seSB0aGUgdGFzayBjb250YWluaW5nIHRoZSB3YWl0IHdpbGwgcGF1c2UgdW50aWwgdGhlIHdhaXQgdGltZSBpcyBleHBpcmVkLgorICoKKyAqIEBwYXJhbSBzZWNvbmRzIExlbmd0aCBvZiB0aW1lIHRvIHBhdXNlLCBpbiBzZWNvbmRzLgorICovCit2b2lkIFdhaXQoZG91YmxlIHNlY29uZHMpCit7CisJaWYgKHNlY29uZHMgPCAwLjApIHJldHVybjsKKwlkZWxheVNlY29uZHMoc2Vjb25kcyk7Cit9CisKKy8qKgorICogUmV0dXJuIHRoZSBGUEdBIHN5c3RlbSBjbG9jayB0aW1lIGluIHNlY29uZHMuCisgKiBUaGlzIGlzIGRlcHJlY2F0ZWQgYW5kIGp1c3QgZm9yd2FyZHMgdG8gVGltZXI6OkdldEZQR0FUaW1lc3RhbXAoKS4KKyAqIEByZXR1cm4gUm9ib3QgcnVubmluZyB0aW1lIGluIHNlY29uZHMuCisgKi8KK2RvdWJsZSBHZXRDbG9jaygpCit7CisJcmV0dXJuIFRpbWVyOjpHZXRGUEdBVGltZXN0YW1wKCk7Cit9CisKKy8qKgorICogQGJyaWVmIEdpdmVzIHJlYWwtdGltZSBjbG9jayBzeXN0ZW0gdGltZSB3aXRoIG5hbm9zZWNvbmQgcmVzb2x1dGlvbgorICogQHJldHVybiBUaGUgdGltZSwganVzdCBpbiBjYXNlIHlvdSB3YW50IHRoZSByb2JvdCB0byBzdGFydCBhdXRvbm9tb3VzIGF0IDhwbSBvbiBTYXR1cmRheS4KKyovCitkb3VibGUgR2V0VGltZSgpCit7CisJc3RydWN0IHRpbWVzcGVjIHRwOworCisJY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwmdHApOworCWRvdWJsZSByZWFsVGltZSA9IChkb3VibGUpdHAudHZfc2VjICsgKGRvdWJsZSkoKGRvdWJsZSl0cC50dl9uc2VjKjFlLTkpOworCisJcmV0dXJuIChyZWFsVGltZSk7Cit9CisKKy8qKgorICogQ3JlYXRlIGEgbmV3IHRpbWVyIG9iamVjdC4KKyAqCisgKiBDcmVhdGUgYSBuZXcgdGltZXIgb2JqZWN0IGFuZCByZXNldCB0aGUgdGltZSB0byB6ZXJvLiBUaGUgdGltZXIgaXMgaW5pdGlhbGx5IG5vdCBydW5uaW5nIGFuZAorICogbXVzdCBiZSBzdGFydGVkLgorICovCitUaW1lcjo6VGltZXIoKQorCTogbV9zdGFydFRpbWUgKDAuMCkKKwksIG1fYWNjdW11bGF0ZWRUaW1lICgwLjApCisJLCBtX3J1bm5pbmcgKGZhbHNlKQoreworCS8vQ3JlYXRlcyBhIHNlbWFwaG9yZSB0byBjb250cm9sIGFjY2VzcyB0byBjcml0aWNhbCByZWdpb25zLgorCS8vSW5pdGlhbGx5ICdvcGVuJworCVJlc2V0KCk7Cit9CisKK1RpbWVyOjp+VGltZXIoKSB7fQorCisvKioKKyAqIEdldCB0aGUgY3VycmVudCB0aW1lIGZyb20gdGhlIHRpbWVyLiBJZiB0aGUgY2xvY2sgaXMgcnVubmluZyBpdCBpcyBkZXJpdmVkIGZyb20KKyAqIHRoZSBjdXJyZW50IHN5c3RlbSBjbG9jayB0aGUgc3RhcnQgdGltZSBzdG9yZWQgaW4gdGhlIHRpbWVyIGNsYXNzLiBJZiB0aGUgY2xvY2sKKyAqIGlzIG5vdCBydW5uaW5nLCB0aGVuIHJldHVybiB0aGUgdGltZSB3aGVuIGl0IHdhcyBsYXN0IHN0b3BwZWQuCisgKgorICogQHJldHVybiBDdXJyZW50IHRpbWUgdmFsdWUgZm9yIHRoaXMgdGltZXIgaW4gc2Vjb25kcworICovCitkb3VibGUgVGltZXI6OkdldCgpCit7CisJZG91YmxlIHJlc3VsdDsKKwlkb3VibGUgY3VycmVudFRpbWUgPSBHZXRGUEdBVGltZXN0YW1wKCk7CisKKwk6OnN0ZDo6dW5pcXVlX2xvY2s8TXV0ZXg+IHN5bmMobV9sb2NrKTsKKwlpZihtX3J1bm5pbmcpCisJeworCQkvLyBJZiB0aGUgY3VycmVudCB0aW1lIGlzIGJlZm9yZSB0aGUgc3RhcnQgdGltZSwgdGhlbiB0aGUgRlBHQSBjbG9jaworCQkvLyByb2xsZWQgb3Zlci4gIENvbXBlbnNhdGUgYnkgYWRkaW5nIHRoZSB+NzEgbWludXRlcyB0aGF0IGl0IHRha2VzCisJCS8vIHRvIHJvbGwgb3ZlciB0byB0aGUgY3VycmVudCB0aW1lLgorCQlpZihjdXJyZW50VGltZSA8IG1fc3RhcnRUaW1lKSB7CisJCQljdXJyZW50VGltZSArPSBrUm9sbG92ZXJUaW1lOworCQl9CisKKwkJcmVzdWx0ID0gKGN1cnJlbnRUaW1lIC0gbV9zdGFydFRpbWUpICsgbV9hY2N1bXVsYXRlZFRpbWU7CisJfQorCWVsc2UKKwl7CisJCXJlc3VsdCA9IG1fYWNjdW11bGF0ZWRUaW1lOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmVzZXQgdGhlIHRpbWVyIGJ5IHNldHRpbmcgdGhlIHRpbWUgdG8gMC4KKyAqCisgKiBNYWtlIHRoZSB0aW1lciBzdGFydFRpbWUgdGhlIGN1cnJlbnQgdGltZSBzbyBuZXcgcmVxdWVzdHMgd2lsbCBiZSByZWxhdGl2ZSB0byBub3cKKyAqLwordm9pZCBUaW1lcjo6UmVzZXQoKQoreworCTo6c3RkOjp1bmlxdWVfbG9jazxNdXRleD4gc3luYyhtX2xvY2spOworCW1fYWNjdW11bGF0ZWRUaW1lID0gMDsKKwltX3N0YXJ0VGltZSA9IEdldEZQR0FUaW1lc3RhbXAoKTsKK30KKworLyoqCisgKiBTdGFydCB0aGUgdGltZXIgcnVubmluZy4KKyAqIEp1c3Qgc2V0IHRoZSBydW5uaW5nIGZsYWcgdG8gdHJ1ZSBpbmRpY2F0aW5nIHRoYXQgYWxsIHRpbWUgcmVxdWVzdHMgc2hvdWxkIGJlCisgKiByZWxhdGl2ZSB0byB0aGUgc3lzdGVtIGNsb2NrLgorICovCit2b2lkIFRpbWVyOjpTdGFydCgpCit7CisJOjpzdGQ6OnVuaXF1ZV9sb2NrPE11dGV4PiBzeW5jKG1fbG9jayk7CisJaWYgKCFtX3J1bm5pbmcpCisJeworCQltX3N0YXJ0VGltZSA9IEdldEZQR0FUaW1lc3RhbXAoKTsKKwkJbV9ydW5uaW5nID0gdHJ1ZTsKKwl9Cit9CisKKy8qKgorICogU3RvcCB0aGUgdGltZXIuCisgKiBUaGlzIGNvbXB1dGVzIHRoZSB0aW1lIGFzIG9mIG5vdyBhbmQgY2xlYXJzIHRoZSBydW5uaW5nIGZsYWcsIGNhdXNpbmcgYWxsCisgKiBzdWJzZXF1ZW50IHRpbWUgcmVxdWVzdHMgdG8gYmUgcmVhZCBmcm9tIHRoZSBhY2N1bXVsYXRlZCB0aW1lIHJhdGhlciB0aGFuCisgKiBsb29raW5nIGF0IHRoZSBzeXN0ZW0gY2xvY2suCisgKi8KK3ZvaWQgVGltZXI6OlN0b3AoKQoreworCWRvdWJsZSB0ZW1wID0gR2V0KCk7CisKKwk6OnN0ZDo6dW5pcXVlX2xvY2s8TXV0ZXg+IHN5bmMobV9sb2NrKTsKKwlpZiAobV9ydW5uaW5nKQorCXsKKwkJbV9hY2N1bXVsYXRlZFRpbWUgPSB0ZW1wOworCQltX3J1bm5pbmcgPSBmYWxzZTsKKwl9Cit9CisKKy8qKgorICogQ2hlY2sgaWYgdGhlIHBlcmlvZCBzcGVjaWZpZWQgaGFzIHBhc3NlZCBhbmQgaWYgaXQgaGFzLCBhZHZhbmNlIHRoZSBzdGFydAorICogdGltZSBieSB0aGF0IHBlcmlvZC4gVGhpcyBpcyB1c2VmdWwgdG8gZGVjaWRlIGlmIGl0J3MgdGltZSB0byBkbyBwZXJpb2RpYworICogd29yayB3aXRob3V0IGRyaWZ0aW5nIGxhdGVyIGJ5IHRoZSB0aW1lIGl0IHRvb2sgdG8gZ2V0IGFyb3VuZCB0byBjaGVja2luZy4KKyAqCisgKiBAcGFyYW0gcGVyaW9kIFRoZSBwZXJpb2QgdG8gY2hlY2sgZm9yIChpbiBzZWNvbmRzKS4KKyAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcGVyaW9kIGhhcyBwYXNzZWQuCisgKi8KK2Jvb2wgVGltZXI6Okhhc1BlcmlvZFBhc3NlZChkb3VibGUgcGVyaW9kKQoreworCWlmIChHZXQoKSA+IHBlcmlvZCkKKwl7CisJCTo6c3RkOjp1bmlxdWVfbG9jazxNdXRleD4gc3luYyhtX2xvY2spOworCQkvLyBBZHZhbmNlIHRoZSBzdGFydCB0aW1lIGJ5IHRoZSBwZXJpb2QuCisJCW1fc3RhcnRUaW1lICs9IHBlcmlvZDsKKwkJLy8gRG9uJ3Qgc2V0IGl0IHRvIHRoZSBjdXJyZW50IHRpbWUuLi4gd2Ugd2FudCB0byBhdm9pZCBkcmlmdC4KKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBSZXR1cm4gdGhlIEZQR0Egc3lzdGVtIGNsb2NrIHRpbWUgaW4gc2Vjb25kcy4KKyAqCisgKiBSZXR1cm4gdGhlIHRpbWUgZnJvbSB0aGUgRlBHQSBoYXJkd2FyZSBjbG9jayBpbiBzZWNvbmRzIHNpbmNlIHRoZSBGUEdBCisgKiBzdGFydGVkLgorICogUm9sbHMgb3ZlciBhZnRlciA3MSBtaW51dGVzLgorICogQHJldHVybnMgUm9ib3QgcnVubmluZyB0aW1lIGluIHNlY29uZHMuCisgKi8KK2RvdWJsZSBUaW1lcjo6R2V0RlBHQVRpbWVzdGFtcCgpCit7CisJLy8gRlBHQSByZXR1cm5zIHRoZSB0aW1lc3RhbXAgaW4gbWljcm9zZWNvbmRzCisJLy8gQ2FsbCB0aGUgaGVscGVyIEdldEZQR0FUaW1lKCkgaW4gVXRpbGl0eS5jcHAKKwlyZXR1cm4gR2V0RlBHQVRpbWUoKSAqIDEuMGUtNjsKK30KKworLy8gSW50ZXJuYWwgZnVuY3Rpb24gdGhhdCByZWFkcyB0aGUgUFBDIHRpbWVzdGFtcCBjb3VudGVyLgorZXh0ZXJuICJDIgoreworCXVpbnQzMl90IG5pVGltZXN0YW1wMzIodm9pZCk7CisJdWludDY0X3QgbmlUaW1lc3RhbXA2NCh2b2lkKTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvVWx0cmFzb25pYy5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1VsdHJhc29uaWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzOWZmN2MKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1VsdHJhc29uaWMuY3BwCkBAIC0wLDAgKzEsMzA0IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJVbHRyYXNvbmljLmgiCisKKyNpbmNsdWRlICJDb3VudGVyLmgiCisjaW5jbHVkZSAiRGlnaXRhbElucHV0LmgiCisjaW5jbHVkZSAiRGlnaXRhbE91dHB1dC5oIgorLy8jaW5jbHVkZSAiTmV0d29ya0NvbW11bmljYXRpb24vVXNhZ2VSZXBvcnRpbmcuaCIKKyNpbmNsdWRlICJUaW1lci5oIgorI2luY2x1ZGUgIlV0aWxpdHkuaCIKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKworY29uc3RleHByIGRvdWJsZSBVbHRyYXNvbmljOjprUGluZ1RpbWU7CS8vLzwgVGltZSAoc2VjKSBmb3IgdGhlIHBpbmcgdHJpZ2dlciBwdWxzZS4KK2NvbnN0IHVpbnQzMl90IFVsdHJhc29uaWM6OmtQcmlvcml0eTsJLy8vPCBQcmlvcml0eSB0aGF0IHRoZSB1bHRyYXNvbmljIHJvdW5kIHJvYmluIHRhc2sgcnVucy4KK2NvbnN0ZXhwciBkb3VibGUgVWx0cmFzb25pYzo6a01heFVsdHJhc29uaWNUaW1lOwkvLy88IE1heCB0aW1lIChtcykgYmV0d2VlbiByZWFkaW5ncy4KK2NvbnN0ZXhwciBkb3VibGUgVWx0cmFzb25pYzo6a1NwZWVkT2ZTb3VuZEluY2hlc1BlclNlYzsKK1Rhc2sgVWx0cmFzb25pYzo6bV90YXNrKCJVbHRyYXNvbmljQ2hlY2tlciIsIChGVU5DUFRSKVVsdHJhc29uaWNDaGVja2VyKTsgLy8gdGFzayBkb2luZyB0aGUgcm91bmQtcm9iaW4gYXV0b21hdGljIHNlbnNpbmcKK1VsdHJhc29uaWMgKlVsdHJhc29uaWM6Om1fZmlyc3RTZW5zb3IgPSBOVUxMOyAvLyBoZWFkIG9mIHRoZSB1bHRyYXNvbmljIHNlbnNvciBsaXN0Citib29sIFVsdHJhc29uaWM6Om1fYXV0b21hdGljRW5hYmxlZCA9IGZhbHNlOyAvLyBhdXRvbWF0aWMgcm91bmQgcm9iaW4gbW9kZQorU0VNQVBIT1JFX0lEIFVsdHJhc29uaWM6Om1fc2VtYXBob3JlID0gMDsKKworLyoqCisgKiBCYWNrZ3JvdW5kIHRhc2sgdGhhdCBnb2VzIHRocm91Z2ggdGhlIGxpc3Qgb2YgdWx0cmFzb25pYyBzZW5zb3JzIGFuZCBwaW5ncyBlYWNoIG9uZSBpbiB0dXJuLiBUaGUgY291bnRlcgorICogaXMgY29uZmlndXJlZCB0byByZWFkIHRoZSB0aW1pbmcgb2YgdGhlIHJldHVybmVkIGVjaG8gcHVsc2UuCisgKgorICogREFOR0VSIFdJTEwgUk9CSU5TT04sIERBTkdFUiBXSUxMIFJPQklOU09OOgorICogVGhpcyBjb2RlIHJ1bnMgYXMgYSB0YXNrIGFuZCBhc3N1bWVzIHRoYXQgbm9uZSBvZiB0aGUgdWx0cmFzb25pYyBzZW5zb3JzIHdpbGwgY2hhbmdlIHdoaWxlIGl0J3MKKyAqIHJ1bm5pbmcuIElmIG9uZSBkb2VzLCB0aGVuIHRoaXMgd2lsbCBjZXJ0YWlubHkgYnJlYWsuIE1ha2Ugc3VyZSB0byBkaXNhYmxlIGF1dG9tYXRpYyBtb2RlIGJlZm9yZSBjaGFuZ2luZworICogYW55dGhpbmcgd2l0aCB0aGUgc2Vuc29ycyEhCisgKi8KK3ZvaWQgVWx0cmFzb25pYzo6VWx0cmFzb25pY0NoZWNrZXIoKQoreworCVVsdHJhc29uaWMgKnUgPSBOVUxMOworCXdoaWxlIChtX2F1dG9tYXRpY0VuYWJsZWQpCisJeworCQlpZiAodSA9PSBOVUxMKSB1ID0gbV9maXJzdFNlbnNvcjsKKwkJaWYgKHUgPT0gTlVMTCkgcmV0dXJuOworCQlpZiAodS0+SXNFbmFibGVkKCkpCisJCQl1LT5tX3BpbmdDaGFubmVsLT5QdWxzZShrUGluZ1RpbWUpOwkvLyBkbyB0aGUgcGluZworCQl1ID0gdS0+bV9uZXh0U2Vuc29yOworCQlXYWl0KDAuMSk7CQkJCQkJCS8vIHdhaXQgZm9yIHBpbmcgdG8gcmV0dXJuCisJfQorfQorCisvKioKKyAqIEluaXRpYWxpemUgdGhlIFVsdHJhc29uaWMgU2Vuc29yLgorICogVGhpcyBpcyB0aGUgY29tbW9uIGNvZGUgdGhhdCBpbml0aWFsaXplcyB0aGUgdWx0cmFzb25pYyBzZW5zb3IgZ2l2ZW4gdGhhdCB0aGVyZQorICogYXJlIHR3byBkaWdpdGFsIEkvTyBjaGFubmVscyBhbGxvY2F0ZWQuIElmIHRoZSBzeXN0ZW0gd2FzIHJ1bm5pbmcgaW4gYXV0b21hdGljIG1vZGUgKHJvdW5kIHJvYmluKQorICogd2hlbiB0aGUgbmV3IHNlbnNvciBpcyBhZGRlZCwgaXQgaXMgc3RvcHBlZCwgdGhlIHNlbnNvciBpcyBhZGRlZCwgdGhlbiBhdXRvbWF0aWMgbW9kZSBpcworICogcmVzdG9yZWQuCisgKi8KK3ZvaWQgVWx0cmFzb25pYzo6SW5pdGlhbGl6ZSgpCit7CisJYm9vbCBvcmlnaW5hbE1vZGUgPSBtX2F1dG9tYXRpY0VuYWJsZWQ7CisJaWYgKG1fc2VtYXBob3JlID09IDApIG1fc2VtYXBob3JlID0gaW5pdGlhbGl6ZVNlbWFwaG9yZShTRU1BUEhPUkVfRlVMTCk7CisJU2V0QXV0b21hdGljTW9kZShmYWxzZSk7IC8vIGtpbGwgdGFzayB3aGVuIGFkZGluZyBhIG5ldyBzZW5zb3IKKwl0YWtlU2VtYXBob3JlKG1fc2VtYXBob3JlKTsgLy8gbGluayB0aGlzIGluc3RhbmNlIG9uIHRoZSBsaXN0CisJeworCQltX25leHRTZW5zb3IgPSBtX2ZpcnN0U2Vuc29yOworCQltX2ZpcnN0U2Vuc29yID0gdGhpczsKKwl9CisJZ2l2ZVNlbWFwaG9yZShtX3NlbWFwaG9yZSk7CisKKwltX2NvdW50ZXIgPSBuZXcgQ291bnRlcihtX2VjaG9DaGFubmVsKTsgLy8gc2V0IHVwIGNvdW50ZXIgZm9yIHRoaXMgc2Vuc29yCisJbV9jb3VudGVyLT5TZXRNYXhQZXJpb2QoMS4wKTsKKwltX2NvdW50ZXItPlNldFNlbWlQZXJpb2RNb2RlKHRydWUpOworCW1fY291bnRlci0+UmVzZXQoKTsKKwltX2VuYWJsZWQgPSB0cnVlOyAvLyBtYWtlIGl0IGF2YWlsYWJsZSBmb3Igcm91bmQgcm9iaW4gc2NoZWR1bGluZworCVNldEF1dG9tYXRpY01vZGUob3JpZ2luYWxNb2RlKTsKKworCXN0YXRpYyBpbnQgaW5zdGFuY2VzID0gMDsKKwlpbnN0YW5jZXMrKzsKKwlIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfVWx0cmFzb25pYywgaW5zdGFuY2VzKTsKK30KKworLyoqCisgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIFVsdHJhc29uaWMgU2Vuc29yCisgKiBUaGlzIGlzIGRlc2lnbmVkIHRvIHN1cGNoYW5uZWwgdGhlIERhdmVudGVjaCBTUkYwNCBhbmQgVmV4IHVsdHJhc29uaWMgc2Vuc29ycy4KKyAqIEBwYXJhbSBwaW5nQ2hhbm5lbCBUaGUgZGlnaXRhbCBvdXRwdXQgY2hhbm5lbCB0aGF0IHNlbmRzIHRoZSBwdWxzZSB0byBpbml0aWF0ZSB0aGUgc2Vuc29yIHNlbmRpbmcKKyAqIHRoZSBwaW5nLgorICogQHBhcmFtIGVjaG9DaGFubmVsIFRoZSBkaWdpdGFsIGlucHV0IGNoYW5uZWwgdGhhdCByZWNlaXZlcyB0aGUgZWNoby4gVGhlIGxlbmd0aCBvZiB0aW1lIHRoYXQgdGhlCisgKiBlY2hvIGlzIGhpZ2ggcmVwcmVzZW50cyB0aGUgcm91bmQgdHJpcCB0aW1lIG9mIHRoZSBwaW5nLCBhbmQgdGhlIGRpc3RhbmNlLgorICogQHBhcmFtIHVuaXRzIFRoZSB1bml0cyByZXR1cm5lZCBpbiBlaXRoZXIga0luY2hlcyBvciBrTWlsbGlNZXRlcnMKKyAqLworVWx0cmFzb25pYzo6VWx0cmFzb25pYyh1aW50MzJfdCBwaW5nQ2hhbm5lbCwgdWludDMyX3QgZWNob0NoYW5uZWwsIERpc3RhbmNlVW5pdCB1bml0cykKK3sKKwltX3BpbmdDaGFubmVsID0gbmV3IERpZ2l0YWxPdXRwdXQocGluZ0NoYW5uZWwpOworCW1fZWNob0NoYW5uZWwgPSBuZXcgRGlnaXRhbElucHV0KGVjaG9DaGFubmVsKTsKKwltX2FsbG9jYXRlZENoYW5uZWxzID0gdHJ1ZTsKKwltX3VuaXRzID0gdW5pdHM7CisJSW5pdGlhbGl6ZSgpOworfQorCisvKioKKyAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhbiBVbHRyYXNvbmljIFNlbnNvciBmcm9tIGEgRGlnaXRhbElucHV0IGZvciB0aGUgZWNobyBjaGFubmVsIGFuZCBhIERpZ2l0YWxPdXRwdXQKKyAqIGZvciB0aGUgcGluZyBjaGFubmVsLgorICogQHBhcmFtIHBpbmdDaGFubmVsIFRoZSBkaWdpdGFsIG91dHB1dCBvYmplY3QgdGhhdCBzdGFydHMgdGhlIHNlbnNvciBkb2luZyBhIHBpbmcuIFJlcXVpcmVzIGEgMTB1UyBwdWxzZSB0byBzdGFydC4KKyAqIEBwYXJhbSBlY2hvQ2hhbm5lbCBUaGUgZGlnaXRhbCBpbnB1dCBvYmplY3QgdGhhdCB0aW1lcyB0aGUgcmV0dXJuIHB1bHNlIHRvIGRldGVybWluZSB0aGUgcmFuZ2UuCisgKiBAcGFyYW0gdW5pdHMgVGhlIHVuaXRzIHJldHVybmVkIGluIGVpdGhlciBrSW5jaGVzIG9yIGtNaWxsaU1ldGVycworICovCitVbHRyYXNvbmljOjpVbHRyYXNvbmljKERpZ2l0YWxPdXRwdXQgKnBpbmdDaGFubmVsLCBEaWdpdGFsSW5wdXQgKmVjaG9DaGFubmVsLCBEaXN0YW5jZVVuaXQgdW5pdHMpCit7CisJaWYgKHBpbmdDaGFubmVsID09IE5VTEwgfHwgZWNob0NoYW5uZWwgPT0gTlVMTCkKKwl7CisJCXdwaV9zZXRXUElFcnJvcihOdWxsUGFyYW1ldGVyKTsKKwkJcmV0dXJuOworCX0KKwltX2FsbG9jYXRlZENoYW5uZWxzID0gZmFsc2U7CisJbV9waW5nQ2hhbm5lbCA9IHBpbmdDaGFubmVsOworCW1fZWNob0NoYW5uZWwgPSBlY2hvQ2hhbm5lbDsKKwltX3VuaXRzID0gdW5pdHM7CisJSW5pdGlhbGl6ZSgpOworfQorCisvKioKKyAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhbiBVbHRyYXNvbmljIFNlbnNvciBmcm9tIGEgRGlnaXRhbElucHV0IGZvciB0aGUgZWNobyBjaGFubmVsIGFuZCBhIERpZ2l0YWxPdXRwdXQKKyAqIGZvciB0aGUgcGluZyBjaGFubmVsLgorICogQHBhcmFtIHBpbmdDaGFubmVsIFRoZSBkaWdpdGFsIG91dHB1dCBvYmplY3QgdGhhdCBzdGFydHMgdGhlIHNlbnNvciBkb2luZyBhIHBpbmcuIFJlcXVpcmVzIGEgMTB1UyBwdWxzZSB0byBzdGFydC4KKyAqIEBwYXJhbSBlY2hvQ2hhbm5lbCBUaGUgZGlnaXRhbCBpbnB1dCBvYmplY3QgdGhhdCB0aW1lcyB0aGUgcmV0dXJuIHB1bHNlIHRvIGRldGVybWluZSB0aGUgcmFuZ2UuCisgKiBAcGFyYW0gdW5pdHMgVGhlIHVuaXRzIHJldHVybmVkIGluIGVpdGhlciBrSW5jaGVzIG9yIGtNaWxsaU1ldGVycworICovCitVbHRyYXNvbmljOjpVbHRyYXNvbmljKERpZ2l0YWxPdXRwdXQgJnBpbmdDaGFubmVsLCBEaWdpdGFsSW5wdXQgJmVjaG9DaGFubmVsLCBEaXN0YW5jZVVuaXQgdW5pdHMpCit7CisJbV9hbGxvY2F0ZWRDaGFubmVscyA9IGZhbHNlOworCW1fcGluZ0NoYW5uZWwgPSAmcGluZ0NoYW5uZWw7CisJbV9lY2hvQ2hhbm5lbCA9ICZlY2hvQ2hhbm5lbDsKKwltX3VuaXRzID0gdW5pdHM7CisJSW5pdGlhbGl6ZSgpOworfQorCisvKioKKyAqIERlc3RydWN0b3IgZm9yIHRoZSB1bHRyYXNvbmljIHNlbnNvci4KKyAqIERlbGV0ZSB0aGUgaW5zdGFuY2Ugb2YgdGhlIHVsdHJhc29uaWMgc2Vuc29yIGJ5IGZyZWVpbmcgdGhlIGFsbG9jYXRlZCBkaWdpdGFsIGNoYW5uZWxzLgorICogSWYgdGhlIHN5c3RlbSB3YXMgaW4gYXV0b21hdGljIG1vZGUgKHJvdW5kIHJvYmluKSwgdGhlbiBpdCBpcyBzdG9wcGVkLCB0aGVuIHN0YXJ0ZWQgYWdhaW4KKyAqIGFmdGVyIHRoaXMgc2Vuc29yIGlzIHJlbW92ZWQgKHByb3ZpZGVkIHRoaXMgd2Fzbid0IHRoZSBsYXN0IHNlbnNvcikuCisgKi8KK1VsdHJhc29uaWM6On5VbHRyYXNvbmljKCkKK3sKKwlib29sIHdhc0F1dG9tYXRpY01vZGUgPSBtX2F1dG9tYXRpY0VuYWJsZWQ7CisJU2V0QXV0b21hdGljTW9kZShmYWxzZSk7CisJaWYgKG1fYWxsb2NhdGVkQ2hhbm5lbHMpCisJeworCQlkZWxldGUgbV9waW5nQ2hhbm5lbDsKKwkJZGVsZXRlIG1fZWNob0NoYW5uZWw7CisJfQorCXdwaV9hc3NlcnQobV9maXJzdFNlbnNvciAhPSBOVUxMKTsKKworCXRha2VTZW1hcGhvcmUobV9zZW1hcGhvcmUpOworCXsKKwkJaWYgKHRoaXMgPT0gbV9maXJzdFNlbnNvcikKKwkJeworCQkJbV9maXJzdFNlbnNvciA9IG1fbmV4dFNlbnNvcjsKKwkJCWlmIChtX2ZpcnN0U2Vuc29yID09IE5VTEwpCisJCQl7CisJCQkJU2V0QXV0b21hdGljTW9kZShmYWxzZSk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQl3cGlfYXNzZXJ0KG1fZmlyc3RTZW5zb3ItPm1fbmV4dFNlbnNvciAhPSBOVUxMKTsKKwkJCWZvciAoVWx0cmFzb25pYyAqcyA9IG1fZmlyc3RTZW5zb3I7IHMgIT0gTlVMTDsgcyA9IHMtPm1fbmV4dFNlbnNvcikKKwkJCXsKKwkJCQlpZiAodGhpcyA9PSBzLT5tX25leHRTZW5zb3IpCisJCQkJeworCQkJCQlzLT5tX25leHRTZW5zb3IgPSBzLT5tX25leHRTZW5zb3ItPm1fbmV4dFNlbnNvcjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWdpdmVTZW1hcGhvcmUobV9zZW1hcGhvcmUpOworCWlmIChtX2ZpcnN0U2Vuc29yICE9IE5VTEwgJiYgd2FzQXV0b21hdGljTW9kZSkKKwkJU2V0QXV0b21hdGljTW9kZSh0cnVlKTsKK30KKworLyoqCisgKiBUdXJuIEF1dG9tYXRpYyBtb2RlIG9uL29mZi4KKyAqIFdoZW4gaW4gQXV0b21hdGljIG1vZGUsIGFsbCBzZW5zb3JzIHdpbGwgZmlyZSBpbiByb3VuZCByb2Jpbiwgd2FpdGluZyBhIHNldAorICogdGltZSBiZXR3ZWVuIGVhY2ggc2Vuc29yLgorICogQHBhcmFtIGVuYWJsaW5nIFNldCB0byB0cnVlIGlmIHJvdW5kIHJvYmluIHNjaGVkdWxpbmcgc2hvdWxkIHN0YXJ0IGZvciBhbGwgdGhlIHVsdHJhc29uaWMgc2Vuc29ycy4gVGhpcworICogc2NoZWR1bGluZyBtZXRob2QgYXNzdXJlcyB0aGF0IHRoZSBzZW5zb3JzIGFyZSBub24taW50ZXJmZXJpbmcgYmVjYXVzZSBubyB0d28gc2Vuc29ycyBmaXJlIGF0IHRoZSBzYW1lIHRpbWUuCisgKiBJZiBhbm90aGVyIHNjaGVkdWxpbmcgYWxnb3JpdGhtIGlzIHByZWZmZXJlZCwgaXQgY2FuIGJlIGltcGxlbWVudGVkIGJ5IHBpbmdpbmcgdGhlIHNlbnNvcnMgbWFudWFsbHkgYW5kIHdhaXRpbmcKKyAqIGZvciB0aGUgcmVzdWx0cyB0byBjb21lIGJhY2suCisgKi8KK3ZvaWQgVWx0cmFzb25pYzo6U2V0QXV0b21hdGljTW9kZShib29sIGVuYWJsaW5nKQoreworCWlmIChlbmFibGluZyA9PSBtX2F1dG9tYXRpY0VuYWJsZWQpCisJCXJldHVybjsgLy8gaWdub3JlIHRoZSBjYXNlIG9mIG5vIGNoYW5nZQorCisJbV9hdXRvbWF0aWNFbmFibGVkID0gZW5hYmxpbmc7CisJaWYgKGVuYWJsaW5nKQorCXsKKwkJLy8gZW5hYmxpbmcgYXV0b21hdGljIG1vZGUuCisJCS8vIENsZWFyIGFsbCB0aGUgY291bnRlcnMgc28gbm8gZGF0YSBpcyB2YWxpZAorCQlmb3IgKFVsdHJhc29uaWMgKnUgPSBtX2ZpcnN0U2Vuc29yOyB1ICE9IE5VTEw7IHUgPSB1LT5tX25leHRTZW5zb3IpCisJCXsKKwkJCXUtPm1fY291bnRlci0+UmVzZXQoKTsKKwkJfQorCQkvLyBTdGFydCByb3VuZCByb2JpbiB0YXNrCisJCXdwaV9hc3NlcnQobV90YXNrLlZlcmlmeSgpID09IGZhbHNlKTsJLy8gc2hvdWxkIGJlIGZhbHNlIHNpbmNlIHdhcyBwcmV2aW91c2x5IGRpc2FibGVkCisJCW1fdGFzay5TdGFydCgpOworCX0KKwllbHNlCisJeworCQkvLyBkaXNhYmxpbmcgYXV0b21hdGljIG1vZGUuIFdhaXQgZm9yIGJhY2tncm91bmQgdGFzayB0byBzdG9wIHJ1bm5pbmcuCisJCXdoaWxlIChtX3Rhc2suVmVyaWZ5KCkpCisJCQlXYWl0KDAuMTUpOwkvLyBqdXN0IGEgbGl0dGxlIGxvbmdlciB0aGFuIHRoZSBwaW5nIHRpbWUgZm9yIHJvdW5kLXJvYmluIHRvIHN0b3AKKworCQkvLyBjbGVhciBhbGwgdGhlIGNvdW50ZXJzIChkYXRhIG5vdyBpbnZhbGlkKSBzaW5jZSBhdXRvbWF0aWMgbW9kZSBpcyBzdG9wcGVkCisJCWZvciAoVWx0cmFzb25pYyAqdSA9IG1fZmlyc3RTZW5zb3I7IHUgIT0gTlVMTDsgdSA9IHUtPm1fbmV4dFNlbnNvcikKKwkJeworCQkJdS0+bV9jb3VudGVyLT5SZXNldCgpOworCQl9CisJCW1fdGFzay5TdG9wKCk7CisJfQorfQorCisvKioKKyAqIFNpbmdsZSBwaW5nIHRvIHVsdHJhc29uaWMgc2Vuc29yLgorICogU2VuZCBvdXQgYSBzaW5nbGUgcGluZyB0byB0aGUgdWx0cmFzb25pYyBzZW5zb3IuIFRoaXMgb25seSB3b3JrcyBpZiBhdXRvbWF0aWMgKHJvdW5kIHJvYmluKQorICogbW9kZSBpcyBkaXNhYmxlZC4gQSBzaW5nbGUgcGluZyBpcyBzZW50IG91dCwgYW5kIHRoZSBjb3VudGVyIHNob3VsZCBjb3VudCB0aGUgc2VtaS1wZXJpb2QKKyAqIHdoZW4gaXQgY29tZXMgaW4uIFRoZSBjb3VudGVyIGlzIHJlc2V0IHRvIG1ha2UgdGhlIGN1cnJlbnQgdmFsdWUgaW52YWxpZC4KKyAqLwordm9pZCBVbHRyYXNvbmljOjpQaW5nKCkKK3sKKwl3cGlfYXNzZXJ0KCFtX2F1dG9tYXRpY0VuYWJsZWQpOworCW1fY291bnRlci0+UmVzZXQoKTsgLy8gcmVzZXQgdGhlIGNvdW50ZXIgdG8gemVybyAoaW52YWxpZCBkYXRhIG5vdykKKwltX3BpbmdDaGFubmVsLT5QdWxzZShrUGluZ1RpbWUpOyAvLyBkbyB0aGUgcGluZyB0byBzdGFydCBnZXR0aW5nIGEgc2luZ2xlIHJhbmdlCit9CisKKy8qKgorICogQ2hlY2sgaWYgdGhlcmUgaXMgYSB2YWxpZCByYW5nZSBtZWFzdXJlbWVudC4KKyAqIFRoZSByYW5nZXMgYXJlIGFjY3VtdWxhdGVkIGluIGEgY291bnRlciB0aGF0IHdpbGwgaW5jcmVtZW50IG9uIGVhY2ggZWRnZSBvZiB0aGUgZWNobyAocmV0dXJuKQorICogc2lnbmFsLiBJZiB0aGUgY291bnQgaXMgbm90IGF0IGxlYXN0IDIsIHRoZW4gdGhlIHJhbmdlIGhhcyBub3QgeWV0IGJlZW4gbWVhc3VyZWQsIGFuZCBpcyBpbnZhbGlkLgorICovCitib29sIFVsdHJhc29uaWM6OklzUmFuZ2VWYWxpZCgpCit7CisJcmV0dXJuIG1fY291bnRlci0+R2V0KCkgPiAxOworfQorCisvKioKKyAqIEdldCB0aGUgcmFuZ2UgaW4gaW5jaGVzIGZyb20gdGhlIHVsdHJhc29uaWMgc2Vuc29yLgorICogQHJldHVybiBkb3VibGUgUmFuZ2UgaW4gaW5jaGVzIG9mIHRoZSB0YXJnZXQgcmV0dXJuZWQgZnJvbSB0aGUgdWx0cmFzb25pYyBzZW5zb3IuIElmIHRoZXJlIGlzCisgKiBubyB2YWxpZCB2YWx1ZSB5ZXQsIGkuZS4gYXQgbGVhc3Qgb25lIG1lYXN1cmVtZW50IGhhc24ndCBjb21wbGV0ZWQsIHRoZW4gcmV0dXJuIDAuCisgKi8KK2RvdWJsZSBVbHRyYXNvbmljOjpHZXRSYW5nZUluY2hlcygpCit7CisJaWYgKElzUmFuZ2VWYWxpZCgpKQorCQlyZXR1cm4gbV9jb3VudGVyLT5HZXRQZXJpb2QoKSAqIGtTcGVlZE9mU291bmRJbmNoZXNQZXJTZWMgLyAyLjA7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworLyoqCisgKiBHZXQgdGhlIHJhbmdlIGluIG1pbGxpbWV0ZXJzIGZyb20gdGhlIHVsdHJhc29uaWMgc2Vuc29yLgorICogQHJldHVybiBkb3VibGUgUmFuZ2UgaW4gbWlsbGltZXRlcnMgb2YgdGhlIHRhcmdldCByZXR1cm5lZCBieSB0aGUgdWx0cmFzb25pYyBzZW5zb3IuCisgKiBJZiB0aGVyZSBpcyBubyB2YWxpZCB2YWx1ZSB5ZXQsIGkuZS4gYXQgbGVhc3Qgb25lIG1lYXN1cmVtZW50IGhhc24ndCBjb21wbHRlZCwgdGhlbiByZXR1cm4gMC4KKyAqLworZG91YmxlIFVsdHJhc29uaWM6OkdldFJhbmdlTU0oKQoreworCXJldHVybiBHZXRSYW5nZUluY2hlcygpICogMjUuNDsKK30KKworLyoqCisgKiBHZXQgdGhlIHJhbmdlIGluIHRoZSBjdXJyZW50IERpc3RhbmNlVW5pdCBmb3IgdGhlIFBJRFNvdXJjZSBiYXNlIG9iamVjdC4KKyAqCisgKiBAcmV0dXJuIFRoZSByYW5nZSBpbiBEaXN0YW5jZVVuaXQKKyAqLworZG91YmxlIFVsdHJhc29uaWM6OlBJREdldCgpCit7CisJc3dpdGNoKG1fdW5pdHMpCisJeworCWNhc2UgVWx0cmFzb25pYzo6a0luY2hlczoKKwkJcmV0dXJuIEdldFJhbmdlSW5jaGVzKCk7CisJY2FzZSBVbHRyYXNvbmljOjprTWlsbGlNZXRlcnM6CisJCXJldHVybiBHZXRSYW5nZU1NKCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDAuMDsKKwl9Cit9CisKKy8qKgorICogU2V0IHRoZSBjdXJyZW50IERpc3RhbmNlVW5pdCB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciB0aGUgUElEU291cmNlIGJhc2Ugb2JqZWN0LgorICoKKyAqIEBwYXJhbSB1bml0cyBUaGUgRGlzdGFuY2VVbml0IHRoYXQgc2hvdWxkIGJlIHVzZWQuCisgKi8KK3ZvaWQgVWx0cmFzb25pYzo6U2V0RGlzdGFuY2VVbml0cyhEaXN0YW5jZVVuaXQgdW5pdHMpCit7CisJbV91bml0cyA9IHVuaXRzOworfQorCisvKioKKyAqIEdldCB0aGUgY3VycmVudCBEaXN0YW5jZVVuaXQgdGhhdCBpcyB1c2VkIGZvciB0aGUgUElEU291cmNlIGJhc2Ugb2JqZWN0LgorICoKKyAqIEByZXR1cm4gVGhlIHR5cGUgb2YgRGlzdGFuY2VVbml0IHRoYXQgaXMgYmVpbmcgdXNlZC4KKyAqLworVWx0cmFzb25pYzo6RGlzdGFuY2VVbml0IFVsdHJhc29uaWM6OkdldERpc3RhbmNlVW5pdHMoKQoreworCXJldHVybiBtX3VuaXRzOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9VdGlsaXR5LmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvVXRpbGl0eS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk0NDcyYgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvVXRpbGl0eS5jcHAKQEAgLTAsMCArMSwyNzEgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIlV0aWxpdHkuaCIKKworLy8jaW5jbHVkZSAiTmV0d29ya0NvbW11bmljYXRpb24vRlJDQ29tbS5oIgorI2luY2x1ZGUgIkhBTC9IQUwuaHBwIgorI2luY2x1ZGUgIlRhc2suaCIKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8ZXhlY2luZm8uaD4KKyNpbmNsdWRlIDxjeHhhYmkuaD4KKyNpbmNsdWRlICJuaXZpc2lvbi5oIgorCitzdGF0aWMgYm9vbCBzdXNwZW5kT25Bc3NlcnRFbmFibGVkID0gZmFsc2U7CisKKy8qKgorICogRW5hYmxlIHN1c3BlbmQgb24gYXNzZXJ0LgorICogSWYgZW5hYmxlZCwgdGhlIHVzZXIgdGFzayB3aWxsIGJlIHN1c3BlbmRlZCB3aGVuZXZlciBhbiBhc3NlcnQgZmFpbHMuIFRoaXMKKyAqIHdpbGwgYWxsb3cgdGhlIHVzZXIgdG8gYXR0YWNoIHRvIHRoZSB0YXNrIHdpdGggdGhlIGRlYnVnZ2VyIGFuZCBleGFtaW5lIHZhcmlhYmxlcworICogYXJvdW5kIHRoZSBmYWlsdXJlLgorICovCit2b2lkIHdwaV9zdXNwZW5kT25Bc3NlcnRFbmFibGVkKGJvb2wgZW5hYmxlZCkKK3sKKwlzdXNwZW5kT25Bc3NlcnRFbmFibGVkID0gZW5hYmxlZDsKK30KKworLyoqCisgKiBBc3NlcnQgaW1wbGVtZW50YXRpb24uCisgKiBUaGlzIGFsbG93cyBicmVha3BvaW50cyB0byBiZSBzZXQgb24gYW4gYXNzZXJ0LgorICogVGhlIHVzZXJzIGRvbid0IGNhbGwgdGhpcywgYnV0IGluc3RlYWQgdXNlIHRoZSB3cGlfYXNzZXJ0IG1hY3JvcyBpbiBVdGlsaXR5LmguCisgKi8KK2Jvb2wgd3BpX2Fzc2VydF9pbXBsKGJvb2wgY29uZGl0aW9uVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjb25kaXRpb25UZXh0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGluZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZ1bmNOYW1lKQoreworCWlmKCFjb25kaXRpb25WYWx1ZSkKKwl7CisJCXN0ZDo6c3RyaW5nc3RyZWFtIGVycm9yU3RyZWFtOworCisJCWVycm9yU3RyZWFtIDw8ICJBc3NlcnRpb24gXCIiIDw8IGNvbmRpdGlvblRleHQgPDwgIlwiICI7CisJCWVycm9yU3RyZWFtIDw8ICJvbiBsaW5lICIgPDwgbGluZU51bWJlciA8PCAiICI7CisJCWVycm9yU3RyZWFtIDw8ICJvZiAiPDwgYmFzZW5hbWUoZmlsZU5hbWUpIDw8ICIgIjsKKworCQlpZihtZXNzYWdlKQorCQl7CisJCQllcnJvclN0cmVhbSA8PCAiZmFpbGVkOiAiIDw8IG1lc3NhZ2UgPDwgc3RkOjplbmRsOworCQl9CisJCWVsc2UKKwkJeworCQkJZXJyb3JTdHJlYW0gPDwgImZhaWxlZC4iIDw8IHN0ZDo6ZW5kbDsKKwkJfQorCisJCWVycm9yU3RyZWFtIDw8IEdldFN0YWNrVHJhY2UoMik7CisKKwkJc3RkOjpzdHJpbmcgZXJyb3IgPSBlcnJvclN0cmVhbS5zdHIoKTsKKworCQkvLyBQcmludCB0aGUgZXJyb3IgYW5kIHNlbmQgaXQgdG8gdGhlIERyaXZlclN0YXRpb24KKwkJc3RkOjpjb3V0IDw8IGVycm9yIDw8IHN0ZDo6ZW5kbDsKKwkJSEFMU2V0RXJyb3JEYXRhKGVycm9yLmNfc3RyKCksIGVycm9yLnNpemUoKSwgMTAwKTsKKworCQlpZiAoc3VzcGVuZE9uQXNzZXJ0RW5hYmxlZCkgc3VzcGVuZFRhc2soMCk7CisJfQorCisJcmV0dXJuIGNvbmRpdGlvblZhbHVlOworfQorCisvKioKKyAqIENvbW1vbiBlcnJvciByb3V0aW5lcyBmb3Igd3BpX2Fzc2VydEVxdWFsX2ltcGwgYW5kIHdwaV9hc3NlcnROb3RFcXVhbF9pbXBsCisgKiBUaGlzIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5OyBpdCBzaG91bGQgb25seSBiZSB1c2VkIGJ5IHdwaV9hc3NlcnRFcXVhbF9pbXBsCisgKiBhbmQgd3BpX2Fzc2VydE5vdEVxdWFsX2ltcGwuCisgKi8KK3ZvaWQgd3BpX2Fzc2VydEVxdWFsX2NvbW1vbl9pbXBsKGNvbnN0IGNoYXIgKnZhbHVlQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVxdWFsaXR5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxpbmVOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmdW5jTmFtZSkKK3sKKwlzdGQ6OnN0cmluZ3N0cmVhbSBlcnJvclN0cmVhbTsKKworCWVycm9yU3RyZWFtIDw8ICJBc3NlcnRpb24gXCIiIDw8IHZhbHVlQSA8PCAiICIgPDwgZXF1YWxpdHlUeXBlIDw8ICIgIiA8PCB2YWx1ZUIgPDwgIlwiICI7CisJZXJyb3JTdHJlYW0gPDwgIm9uIGxpbmUgIiA8PCBsaW5lTnVtYmVyIDw8ICIgIjsKKwllcnJvclN0cmVhbSA8PCAib2YgIjw8IGJhc2VuYW1lKGZpbGVOYW1lKSA8PCAiICI7CisKKwlpZihtZXNzYWdlKQorCXsKKwkJZXJyb3JTdHJlYW0gPDwgImZhaWxlZDogIiA8PCBtZXNzYWdlIDw8IHN0ZDo6ZW5kbDsKKwl9CisJZWxzZQorCXsKKwkJZXJyb3JTdHJlYW0gPDwgImZhaWxlZC4iIDw8IHN0ZDo6ZW5kbDsKKwl9CisKKwllcnJvclN0cmVhbSA8PCBHZXRTdGFja1RyYWNlKDMpOworCisJc3RkOjpzdHJpbmcgZXJyb3IgPSBlcnJvclN0cmVhbS5zdHIoKTsKKworCS8vIFByaW50IHRoZSBlcnJvciBhbmQgc2VuZCBpdCB0byB0aGUgRHJpdmVyU3RhdGlvbgorCXN0ZDo6Y291dCA8PCBlcnJvciA8PCBzdGQ6OmVuZGw7CisJSEFMU2V0RXJyb3JEYXRhKGVycm9yLmNfc3RyKCksIGVycm9yLnNpemUoKSwgMTAwKTsKKworCWlmIChzdXNwZW5kT25Bc3NlcnRFbmFibGVkKSBzdXNwZW5kVGFzaygwKTsKK30KKworLyoqCisgKiBBc3NlcnQgZXF1YWwgaW1wbGVtZW50YXRpb24uCisgKiBUaGlzIGRldGVybWluZXMgd2hldGhlciB0aGUgdHdvIGdpdmVuIGludGVnZXJzIGFyZSBlcXVhbC4gSWYgbm90LAorICogdGhlIHZhbHVlIG9mIGVhY2ggaXMgcHJpbnRlZCBhbG9uZyB3aXRoIGFuIG9wdGlvbmFsIG1lc3NhZ2Ugc3RyaW5nLgorICogVGhlIHVzZXJzIGRvbid0IGNhbGwgdGhpcywgYnV0IGluc3RlYWQgdXNlIHRoZSB3cGlfYXNzZXJ0RXF1YWwgbWFjcm9zIGluIFV0aWxpdHkuaC4KKyAqLworYm9vbCB3cGlfYXNzZXJ0RXF1YWxfaW1wbChpbnQgdmFsdWVBLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWVCLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2YWx1ZUFTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlQlN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxpbmVOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZ1bmNOYW1lKQoreworCWlmKCEodmFsdWVBID09IHZhbHVlQikpCisJeworCQl3cGlfYXNzZXJ0RXF1YWxfY29tbW9uX2ltcGwodmFsdWVBU3RyaW5nLCB2YWx1ZUJTdHJpbmcsCisJCQkiPT0iLCBtZXNzYWdlLCBmaWxlTmFtZSwgbGluZU51bWJlciwgZnVuY05hbWUpOworCX0KKwlyZXR1cm4gdmFsdWVBID09IHZhbHVlQjsKK30KKworLyoqCisgKiBBc3NlcnQgbm90IGVxdWFsIGltcGxlbWVudGF0aW9uLgorICogVGhpcyBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHR3byBnaXZlbiBpbnRlZ2VycyBhcmUgZXF1YWwuIElmIHNvLAorICogdGhlIHZhbHVlIG9mIGVhY2ggaXMgcHJpbnRlZCBhbG9uZyB3aXRoIGFuIG9wdGlvbmFsIG1lc3NhZ2Ugc3RyaW5nLgorICogVGhlIHVzZXJzIGRvbid0IGNhbGwgdGhpcywgYnV0IGluc3RlYWQgdXNlIHRoZSB3cGlfYXNzZXJ0Tm90RXF1YWwgbWFjcm9zIGluIFV0aWxpdHkuaC4KKyAqLworYm9vbCB3cGlfYXNzZXJ0Tm90RXF1YWxfaW1wbChpbnQgdmFsdWVBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWVCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2YWx1ZUFTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlQlN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxpbmVOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZ1bmNOYW1lKQoreworCWlmKCEodmFsdWVBICE9IHZhbHVlQikpCisJeworCQl3cGlfYXNzZXJ0RXF1YWxfY29tbW9uX2ltcGwodmFsdWVBU3RyaW5nLCB2YWx1ZUJTdHJpbmcsCisJCQkiIT0iLCBtZXNzYWdlLCBmaWxlTmFtZSwgbGluZU51bWJlciwgZnVuY05hbWUpOworCX0KKwlyZXR1cm4gdmFsdWVBICE9IHZhbHVlQjsKK30KKworCisvKioKKyAqIFJldHVybiB0aGUgRlBHQSBWZXJzaW9uIG51bWJlci4KKyAqIEZvciBub3csIGV4cGVjdCB0aGlzIHRvIGJlIGNvbXBldGl0aW9uIHllYXIuCisgKiBAcmV0dXJuIEZQR0EgVmVyc2lvbiBudW1iZXIuCisgKi8KK3VpbnQxNl90IEdldEZQR0FWZXJzaW9uKCkKK3sKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJdWludDE2X3QgdmVyc2lvbiA9IGdldEZQR0FWZXJzaW9uKCZzdGF0dXMpOworCXdwaV9zZXRHbG9iYWxFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCXJldHVybiB2ZXJzaW9uOworfQorCisvKioKKyAqIFJldHVybiB0aGUgRlBHQSBSZXZpc2lvbiBudW1iZXIuCisgKiBUaGUgZm9ybWF0IG9mIHRoZSByZXZpc2lvbiBpcyAzIG51bWJlcnMuCisgKiBUaGUgMTIgbW9zdCBzaWduaWZpY2FudCBiaXRzIGFyZSB0aGUgTWFqb3IgUmV2aXNpb24uCisgKiB0aGUgbmV4dCA4IGJpdHMgYXJlIHRoZSBNaW5vciBSZXZpc2lvbi4KKyAqIFRoZSAxMiBsZWFzdCBzaWduaWZpY2FudCBiaXRzIGFyZSB0aGUgQnVpbGQgTnVtYmVyLgorICogQHJldHVybiBGUEdBIFJldmlzaW9uIG51bWJlci4KKyAqLwordWludDMyX3QgR2V0RlBHQVJldmlzaW9uKCkKK3sKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJdWludDMyX3QgcmV2aXNpb24gPSBnZXRGUEdBUmV2aXNpb24oJnN0YXR1cyk7CisJd3BpX3NldEdsb2JhbEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJcmV0dXJuIHJldmlzaW9uOworfQorCisvKioKKyAqIFJlYWQgdGhlIG1pY3Jvc2Vjb25kLXJlc29sdXRpb24gdGltZXIgb24gdGhlIEZQR0EuCisgKgorICogQHJldHVybiBUaGUgY3VycmVudCB0aW1lIGluIG1pY3Jvc2Vjb25kcyBhY2NvcmRpbmcgdG8gdGhlIEZQR0EgKHNpbmNlIEZQR0EgcmVzZXQpLgorICovCit1aW50MzJfdCBHZXRGUEdBVGltZSgpCit7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCXVpbnQzMl90IHRpbWUgPSBnZXRGUEdBVGltZSgmc3RhdHVzKTsKKwl3cGlfc2V0R2xvYmFsRXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwlyZXR1cm4gdGltZTsKK30KKworLyoqCisgKiBHZXQgdGhlIHN0YXRlIG9mIHRoZSAiVVNFUiIgYnV0dG9uIG9uIHRoZSBSb2JvUklPCisgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGJ1dHRvbiBpcyBjdXJyZW50bHkgcHJlc3NlZCBkb3duCisgKi8KK2Jvb2wgR2V0VXNlckJ1dHRvbigpCit7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCisJYm9vbCB2YWx1ZSA9IGdldEZQR0FCdXR0b24oJnN0YXR1cyk7CisJd3BpX3NldEdsb2JhbEVycm9yKHN0YXR1cyk7CisKKwlyZXR1cm4gdmFsdWU7Cit9CisKKy8qKgorICogRGVtYW5nbGUgYSBDKysgc3ltYm9sLCB1c2VkIGZvciBwcmludGluZyBzdGFjayB0cmFjZXMuCisgKi8KK3N0YXRpYyBzdGQ6OnN0cmluZyBkZW1hbmdsZShjaGFyIGNvbnN0ICptYW5nbGVkU3ltYm9sKQoreworCWNoYXIgYnVmZmVyWzI1Nl07CisJc2l6ZV90IGxlbmd0aDsKKwlpbnQgc3RhdHVzOworCisKKwlpZihzc2NhbmYobWFuZ2xlZFN5bWJvbCwgIiUqW14oXSUqWyhdJTI1NVteKStdIiwgYnVmZmVyKSkKKwl7CisJCWNoYXIgKnN5bWJvbCA9IGFiaTo6X19jeGFfZGVtYW5nbGUoYnVmZmVyLCBOVUxMLCAmbGVuZ3RoLCAmc3RhdHVzKTsKKwkJaWYoc3RhdHVzID09IDApCisJCXsKKwkJCXJldHVybiBzeW1ib2w7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBJZiB0aGUgc3ltYm9sIGNvdWxkbid0IGJlIGRlbWFuZ2xlZCwgaXQncyBwcm9iYWJseSBhIEMgZnVuY3Rpb24sCisJCQkvLyBzbyBqdXN0IHJldHVybiBpdCBhcy1pcy4KKwkJCXJldHVybiBidWZmZXI7CisJCX0KKwl9CisKKwkvLyBJZiBldmVyeXRoaW5nIGVsc2UgZmFpbGVkLCBqdXN0IHJldHVybiB0aGUgbWFuZ2xlZCBzeW1ib2wKKwlyZXR1cm4gbWFuZ2xlZFN5bWJvbDsKK30KKworLyoqCisgKiBHZXQgYSBzdGFjayB0cmFjZSwgaWdub3JpbmcgdGhlIGZpcnN0ICJvZmZzZXQiIHN5bWJvbHMuCisgKiBAcGFyYW0gb2Zmc2V0IFRoZSBudW1iZXIgb2Ygc3ltYm9scyBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjayB0byBpZ25vcmUKKyAqLworc3RkOjpzdHJpbmcgR2V0U3RhY2tUcmFjZSh1aW50MzJfdCBvZmZzZXQpCit7CisJdm9pZCAqc3RhY2tUcmFjZVsxMjhdOworCWludCBzdGFja1NpemUgPSBiYWNrdHJhY2Uoc3RhY2tUcmFjZSwgMTI4KTsKKwljaGFyICoqbWFuZ2xlZFN5bWJvbHMgPSBiYWNrdHJhY2Vfc3ltYm9scyhzdGFja1RyYWNlLCBzdGFja1NpemUpOworCXN0ZDo6c3RyaW5nc3RyZWFtIHRyYWNlOworCisJZm9yKGludCBpID0gb2Zmc2V0OyBpIDwgc3RhY2tTaXplOyBpKyspCisJeworCQkvLyBPbmx5IHByaW50IHJlY3Vyc2l2ZSBmdW5jdGlvbnMgb25jZSBpbiBhIHJvdy4KKwkJaWYoaSA9PSAwIHx8c3RhY2tUcmFjZVtpXSAhPSBzdGFja1RyYWNlW2kgLSAxXSkKKwkJeworCQkJdHJhY2UgPDwgIlx0YXQgIiA8PCBkZW1hbmdsZShtYW5nbGVkU3ltYm9sc1tpXSkgPDwgc3RkOjplbmRsOworCQl9CisJfQorCisJZnJlZShtYW5nbGVkU3ltYm9scyk7CisKKwlyZXR1cm4gdHJhY2Uuc3RyKCk7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1ZpY3Rvci5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1ZpY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFjZmI3MQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvVmljdG9yLmNwcApAQCAtMCwwICsxLDg5IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJWaWN0b3IuaCIKKworLy8jaW5jbHVkZSAiTmV0d29ya0NvbW11bmljYXRpb24vVXNhZ2VSZXBvcnRpbmcuaCIKKworLyoqCisgKiBDb21tb24gaW5pdGlhbGl6YXRpb24gY29kZSBjYWxsZWQgYnkgYWxsIGNvbnN0cnVjdG9ycy4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIFZpY3RvciB1c2VzIHRoZSBmb2xsb3dpbmcgYm91bmRzIGZvciBQV00gdmFsdWVzLiAgVGhlc2UgdmFsdWVzIHdlcmUgZGV0ZXJtaW5lZAorICogZW1waXJpY2FsbHkgYW5kIG9wdGltaXplZCBmb3IgdGhlIFZpY3RvciA4ODguIFRoZXNlIHZhbHVlcyBzaG91bGQgd29yayByZWFzb25hYmx5IHdlbGwgZm9yCisgKiBWaWN0b3IgODg0IGNvbnRyb2xsZXJzIGFzIHdlbGwgYnV0IGlmIHVzZXJzIGV4cGVyaWVuY2UgaXNzdWVzIHN1Y2ggYXMgYXN5bW1ldHJpYyBiZWhhdmlvdXIgYXJvdW5kCisgKiB0aGUgZGVhZGJhbmQgb3IgaW5hYmlsaXR5IHRvIHNhdHVyYXRlIHRoZSBjb250cm9sbGVyIGluIGVpdGhlciBkaXJlY3Rpb24sIGNhbGlicmF0aW9uIGlzIHJlY29tbWVuZGVkLgorICogVGhlIGNhbGlicmF0aW9uIHByb2NlZHVyZSBjYW4gYmUgZm91bmQgaW4gdGhlIFZpY3RvciA4ODQgVXNlciBNYW51YWwgYXZhaWxhYmxlIGZyb20gSUZJLgorICoKKyAqICAgMi4wMjdtcyA9IGZ1bGwgImZvcndhcmQiCisgKiAgIDEuNTI1bXMgPSB0aGUgImhpZ2ggZW5kIiBvZiB0aGUgZGVhZGJhbmQgcmFuZ2UKKyAqICAgMS41MDdtcyA9IGNlbnRlciBvZiB0aGUgZGVhZGJhbmQgcmFuZ2UgKG9mZikKKyAqICAgMS40OW1zID0gdGhlICJsb3cgZW5kIiBvZiB0aGUgZGVhZGJhbmQgcmFuZ2UKKyAqICAgMS4wMjZtcyA9IGZ1bGwgInJldmVyc2UiCisgKi8KK3ZvaWQgVmljdG9yOjpJbml0VmljdG9yKCkgeworCVNldEJvdW5kcygyLjAyNywgMS41MjUsIDEuNTA3LCAxLjQ5LCAxLjAyNik7CisKKwlTZXRQZXJpb2RNdWx0aXBsaWVyKGtQZXJpb2RNdWx0aXBsaWVyXzJYKTsKKwlTZXRSYXcobV9jZW50ZXJQd20pOworCVNldFplcm9MYXRjaCgpOworCisJSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX1ZpY3RvciwgR2V0Q2hhbm5lbCgpKTsKK30KKworLyoqCisgKiBDb25zdHJ1Y3RvciBmb3IgYSBWaWN0b3IKKyAqIEBwYXJhbSBjaGFubmVsIFRoZSBQV00gY2hhbm5lbCBudW1iZXIgdGhhdCB0aGUgVmljdG9yIGlzIGF0dGFjaGVkIHRvLiAwLTkgYXJlIG9uLWJvYXJkLCAxMC0xOSBhcmUgb24gdGhlIE1YUCBwb3J0CisgKi8KK1ZpY3Rvcjo6VmljdG9yKHVpbnQzMl90IGNoYW5uZWwpIDogU2FmZVBXTShjaGFubmVsKQoreworCUluaXRWaWN0b3IoKTsKK30KKworVmljdG9yOjp+VmljdG9yKCkKK3sKK30KKworLyoqCisgKiBTZXQgdGhlIFBXTSB2YWx1ZS4KKyAqCisgKiBUaGUgUFdNIHZhbHVlIGlzIHNldCB1c2luZyBhIHJhbmdlIG9mIC0xLjAgdG8gMS4wLCBhcHByb3ByaWF0ZWx5CisgKiBzY2FsaW5nIHRoZSB2YWx1ZSBmb3IgdGhlIEZQR0EuCisgKgorICogQHBhcmFtIHNwZWVkIFRoZSBzcGVlZCB2YWx1ZSBiZXR3ZWVuIC0xLjAgYW5kIDEuMCB0byBzZXQuCisgKiBAcGFyYW0gc3luY0dyb3VwIFVudXNlZCBpbnRlcmZhY2UuCisgKi8KK3ZvaWQgVmljdG9yOjpTZXQoZmxvYXQgc3BlZWQsIHVpbnQ4X3Qgc3luY0dyb3VwKQoreworCVNldFNwZWVkKHNwZWVkKTsKK30KKworLyoqCisgKiBHZXQgdGhlIHJlY2VudGx5IHNldCB2YWx1ZSBvZiB0aGUgUFdNLgorICoKKyAqIEByZXR1cm4gVGhlIG1vc3QgcmVjZW50bHkgc2V0IHZhbHVlIGZvciB0aGUgUFdNIGJldHdlZW4gLTEuMCBhbmQgMS4wLgorICovCitmbG9hdCBWaWN0b3I6OkdldCgpCit7CisJcmV0dXJuIEdldFNwZWVkKCk7Cit9CisKKy8qKgorICogQ29tbW9uIGludGVyZmFjZSBmb3IgZGlzYWJsaW5nIGEgbW90b3IuCisgKi8KK3ZvaWQgVmljdG9yOjpEaXNhYmxlKCkKK3sKKwlTZXRSYXcoa1B3bURpc2FibGVkKTsKK30KKworLyoqCisgKiBXcml0ZSBvdXQgdGhlIFBJRCB2YWx1ZSBhcyBzZWVuIGluIHRoZSBQSURPdXRwdXQgYmFzZSBvYmplY3QuCisgKgorICogQHBhcmFtIG91dHB1dCBXcml0ZSBvdXQgdGhlIFBXTSB2YWx1ZSBhcyB3YXMgZm91bmQgaW4gdGhlIFBJRENvbnRyb2xsZXIKKyAqLwordm9pZCBWaWN0b3I6OlBJRFdyaXRlKGZsb2F0IG91dHB1dCkKK3sKKwlTZXQob3V0cHV0KTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvVmljdG9yU1AuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9WaWN0b3JTUC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzljZGRhNgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvVmljdG9yU1AuY3BwCkBAIC0wLDAgKzEsODcgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIlZpY3RvclNQLmgiCisKKy8vI2luY2x1ZGUgIk5ldHdvcmtDb21tdW5pY2F0aW9uL1VzYWdlUmVwb3J0aW5nLmgiCisKKy8qKgorICogQ29tbW9uIGluaXRpYWxpemF0aW9uIGNvZGUgY2FsbGVkIGJ5IGFsbCBjb25zdHJ1Y3RvcnMuCisgKgorICogTm90ZSB0aGF0IHRoZSBWaWN0b3JTUCB1c2VzIHRoZSBmb2xsb3dpbmcgYm91bmRzIGZvciBQV00gdmFsdWVzLiBUaGVzZSB2YWx1ZXMgc2hvdWxkIHdvcmsgcmVhc29uYWJseSB3ZWxsIGZvcgorICogbW9zdCBjb250cm9sbGVycywgYnV0IGlmIHVzZXJzIGV4cGVyaWVuY2UgaXNzdWVzIHN1Y2ggYXMgYXN5bW1ldHJpYyBiZWhhdmlvciBhcm91bmQKKyAqIHRoZSBkZWFkYmFuZCBvciBpbmFiaWxpdHkgdG8gc2F0dXJhdGUgdGhlIGNvbnRyb2xsZXIgaW4gZWl0aGVyIGRpcmVjdGlvbiwgY2FsaWJyYXRpb24gaXMgcmVjb21tZW5kZWQuCisgKiBUaGUgY2FsaWJyYXRpb24gcHJvY2VkdXJlIGNhbiBiZSBmb3VuZCBpbiB0aGUgVmljdG9yU1AgVXNlciBNYW51YWwgYXZhaWxhYmxlIGZyb20gVmV4LgorICoKKyAqICAgMi4wMDRtcyA9IGZ1bGwgImZvcndhcmQiCisgKiAgIDEuNTJtcyA9IHRoZSAiaGlnaCBlbmQiIG9mIHRoZSBkZWFkYmFuZCByYW5nZQorICogICAxLjUwbXMgPSBjZW50ZXIgb2YgdGhlIGRlYWRiYW5kIHJhbmdlIChvZmYpCisgKiAgIDEuNDhtcyA9IHRoZSAibG93IGVuZCIgb2YgdGhlIGRlYWRiYW5kIHJhbmdlCisgKiAgIDAuOTk3bXMgPSBmdWxsICJyZXZlcnNlIgorICovCit2b2lkIFZpY3RvclNQOjpJbml0VmljdG9yU1AoKSB7CisJU2V0Qm91bmRzKDIuMDA0LCAxLjUyLCAxLjUwLCAxLjQ4LCAuOTk3KTsKKwlTZXRQZXJpb2RNdWx0aXBsaWVyKGtQZXJpb2RNdWx0aXBsaWVyXzFYKTsKKwlTZXRSYXcobV9jZW50ZXJQd20pOworCVNldFplcm9MYXRjaCgpOworCisJSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX1RhbG9uLCBHZXRDaGFubmVsKCkpOworfQorCisvKioKKyAqIENvbnN0cnVjdG9yIGZvciBhIFZpY3RvclNQIAorICogQHBhcmFtIGNoYW5uZWwgVGhlIFBXTSBjaGFubmVsIHRoYXQgdGhlIFZpY3RvclNQIGlzIGF0dGFjaGVkIHRvLiAwLTkgYXJlIG9uLWJvYXJkLCAxMC0xOSBhcmUgb24gdGhlIE1YUCBwb3J0CisgKi8KK1ZpY3RvclNQOjpWaWN0b3JTUCh1aW50MzJfdCBjaGFubmVsKSA6IFNhZmVQV00oY2hhbm5lbCkKK3sKKwlJbml0VmljdG9yU1AoKTsKK30KKworVmljdG9yU1A6On5WaWN0b3JTUCgpCit7Cit9CisKKy8qKgorICogU2V0IHRoZSBQV00gdmFsdWUuCisgKgorICogVGhlIFBXTSB2YWx1ZSBpcyBzZXQgdXNpbmcgYSByYW5nZSBvZiAtMS4wIHRvIDEuMCwgYXBwcm9wcmlhdGVseQorICogc2NhbGluZyB0aGUgdmFsdWUgZm9yIHRoZSBGUEdBLgorICoKKyAqIEBwYXJhbSBzcGVlZCBUaGUgc3BlZWQgdmFsdWUgYmV0d2VlbiAtMS4wIGFuZCAxLjAgdG8gc2V0LgorICogQHBhcmFtIHN5bmNHcm91cCBVbnVzZWQgaW50ZXJmYWNlLgorICovCit2b2lkIFZpY3RvclNQOjpTZXQoZmxvYXQgc3BlZWQsIHVpbnQ4X3Qgc3luY0dyb3VwKQoreworCVNldFNwZWVkKHNwZWVkKTsKK30KKworLyoqCisgKiBHZXQgdGhlIHJlY2VudGx5IHNldCB2YWx1ZSBvZiB0aGUgUFdNLgorICoKKyAqIEByZXR1cm4gVGhlIG1vc3QgcmVjZW50bHkgc2V0IHZhbHVlIGZvciB0aGUgUFdNIGJldHdlZW4gLTEuMCBhbmQgMS4wLgorICovCitmbG9hdCBWaWN0b3JTUDo6R2V0KCkKK3sKKwlyZXR1cm4gR2V0U3BlZWQoKTsKK30KKworLyoqCisgKiBDb21tb24gaW50ZXJmYWNlIGZvciBkaXNhYmxpbmcgYSBtb3Rvci4KKyAqLwordm9pZCBWaWN0b3JTUDo6RGlzYWJsZSgpCit7CisJU2V0UmF3KGtQd21EaXNhYmxlZCk7Cit9CisKKy8qKgorICogV3JpdGUgb3V0IHRoZSBQSUQgdmFsdWUgYXMgc2VlbiBpbiB0aGUgUElET3V0cHV0IGJhc2Ugb2JqZWN0LgorICoKKyAqIEBwYXJhbSBvdXRwdXQgV3JpdGUgb3V0IHRoZSBQV00gdmFsdWUgYXMgd2FzIGZvdW5kIGluIHRoZSBQSURDb250cm9sbGVyCisgKi8KK3ZvaWQgVmljdG9yU1A6OlBJRFdyaXRlKGZsb2F0IG91dHB1dCkKK3sKKwlTZXQob3V0cHV0KTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvVmlzaW9uL0F4aXNDYW1lcmEuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9WaXNpb24vQXhpc0NhbWVyYS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc2NThkMAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvVmlzaW9uL0F4aXNDYW1lcmEuY3BwCkBAIC0wLDAgKzEsNjQ1IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE0LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIlZpc2lvbi9BeGlzQ2FtZXJhLmgiCisKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKworI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPFRpbWVyLmg+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBrTWF4UGFja2V0U2l6ZSA9IDE1MzY7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGtJbWFnZUJ1ZmZlckFsbG9jYXRpb25JbmNyZW1lbnQgPSAxMDAwOworCitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1doaXRlQmFsYW5jZVN0cmluZ3NbXSA9Cit7ICJhdXRvIiwgImhvbGQiLCAiZml4ZWRfb3V0ZG9vcjEiLCAiZml4ZWRfb3V0ZG9vcjIiLCAiZml4ZWRfaW5kb29yIiwKKwkJImZpeGVkX2ZsdW9yMSIsICJmaXhlZF9mbHVvcjIiLCB9OworCitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0V4cG9zdXJlQ29udHJvbFN0cmluZ3NbXSA9Cit7ICJhdXRvIiwgImhvbGQiLCAiZmxpY2tlcmZyZWU1MCIsICJmbGlja2VyZnJlZTYwIiwgfTsKKworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtSZXNvbHV0aW9uU3RyaW5nc1tdID0KK3sgIjY0MHg0ODAiLCAiNDgweDM2MCIsICIzMjB4MjQwIiwgIjI0MHgxODAiLCAiMTc2eDE0NCIsICIxNjB4MTIwIiwgfTsKKworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtSb3RhdGlvblN0cmluZ3NbXSA9Cit7ICIwIiwgIjE4MCIsIH07CisKKy8qKgorICogQXhpc0NhbWVyYSBjb25zdHJ1Y3RvcgorICogQHBhcmFtIGNhbWVyYUhvc3QgVGhlIGhvc3QgdG8gZmluZCB0aGUgY2FtZXJhIGF0LCB0eXBpY2FsbHkgYW4gSVAgYWRkcmVzcworICovCitBeGlzQ2FtZXJhOjpBeGlzQ2FtZXJhKHN0ZDo6c3RyaW5nIGNvbnN0JiBjYW1lcmFIb3N0KQorCQk6IG1fY2FtZXJhSG9zdChjYW1lcmFIb3N0KQorCQksIG1fY2FtZXJhU29ja2V0KC0xKQorCQksIG1fZnJlc2hJbWFnZShmYWxzZSkKKwkJLCBtX2JyaWdodG5lc3MoNTApCisJCSwgbV93aGl0ZUJhbGFuY2Uoa1doaXRlQmFsYW5jZV9BdXRvbWF0aWMpCisJCSwgbV9jb2xvckxldmVsKDUwKQorCQksIG1fZXhwb3N1cmVDb250cm9sKGtFeHBvc3VyZUNvbnRyb2xfQXV0b21hdGljKQorCQksIG1fZXhwb3N1cmVQcmlvcml0eSg1MCkKKwkJLCBtX21heEZQUygwKQorCQksIG1fcmVzb2x1dGlvbihrUmVzb2x1dGlvbl82NDB4NDgwKQorCQksIG1fY29tcHJlc3Npb24oNTApCisJCSwgbV9yb3RhdGlvbihrUm90YXRpb25fMCkKKwkJLCBtX3BhcmFtZXRlcnNEaXJ0eSh0cnVlKQorCQksIG1fc3RyZWFtRGlydHkodHJ1ZSkKKwkJLCBtX2RvbmUoZmFsc2UpCit7CisJbV9jYXB0dXJlVGhyZWFkID0gc3RkOjp0aHJlYWQoJkF4aXNDYW1lcmE6OkNhcHR1cmUsIHRoaXMpOworfQorCitBeGlzQ2FtZXJhOjp+QXhpc0NhbWVyYSgpCit7CisJbV9kb25lID0gdHJ1ZTsKKwltX2NhcHR1cmVUaHJlYWQuam9pbigpOworfQorCisvKgorICogUmV0dXJuIHRydWUgaWYgdGhlIGxhdGVzdCBpbWFnZSBmcm9tIHRoZSBjYW1lcmEgaGFzIG5vdCBiZWVuIHJldHJpZXZlZCBieSBjYWxsaW5nIEdldEltYWdlKCkgeWV0LgorICogQHJldHVybiB0cnVlIGlmIHRoZSBpbWFnZSBoYXMgbm90IGJlZW4gcmV0cmlldmVkIHlldC4KKyAqLworYm9vbCBBeGlzQ2FtZXJhOjpJc0ZyZXNoSW1hZ2UoKSBjb25zdAoreworCXJldHVybiBtX2ZyZXNoSW1hZ2U7Cit9CisKKy8qKgorICogR2V0IGFuIGltYWdlIGZyb20gdGhlIGNhbWVyYSBhbmQgc3RvcmUgaXQgaW4gdGhlIHByb3ZpZGVkIGltYWdlLgorICogQHBhcmFtIGltYWdlIFRoZSBpbWFxIGltYWdlIHRvIHN0b3JlIHRoZSByZXN1bHQgaW4uIFRoaXMgbXVzdCBiZSBhbiBIU0wgb3IgUkdCIGltYWdlLgorICogQHJldHVybiAxIHVwb24gc3VjY2VzcywgemVybyBvbiBhIGZhaWx1cmUKKyAqLworaW50IEF4aXNDYW1lcmE6OkdldEltYWdlKEltYWdlICppbWFnZSkKK3sKKwlpZiAobV9pbWFnZURhdGEuc2l6ZSgpID09IDApCisJeworCQlyZXR1cm4gMDsKKwl9CisKKwlzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtX2ltYWdlRGF0YU11dGV4KTsKKworCVByaXZfUmVhZEpQRUdTdHJpbmdfQyhpbWFnZSwgbV9pbWFnZURhdGEuZGF0YSgpLCBtX2ltYWdlRGF0YS5zaXplKCkpOworCisJbV9mcmVzaEltYWdlID0gZmFsc2U7CisKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBHZXQgYW4gaW1hZ2UgZnJvbSB0aGUgY2FtZXJhIGFuZCBzdG9yZSBpdCBpbiB0aGUgcHJvdmlkZWQgaW1hZ2UuCisgKiBAcGFyYW0gaW1hZ2UgVGhlIGltYWdlIHRvIHN0b3JlIHRoZSByZXN1bHQgaW4uIFRoaXMgbXVzdCBiZSBhbiBIU0wgb3IgUkdCIGltYWdlCisgKiBAcmV0dXJuIDEgdXBvbiBzdWNjZXNzLCB6ZXJvIG9uIGEgZmFpbHVyZQorICovCitpbnQgQXhpc0NhbWVyYTo6R2V0SW1hZ2UoQ29sb3JJbWFnZSAqaW1hZ2UpCit7CisJcmV0dXJuIEdldEltYWdlKGltYWdlLT5HZXRJbWFxSW1hZ2UoKSk7Cit9CisKKy8qKgorICogSW5zdGFudGlhdGUgYSBuZXcgaW1hZ2Ugb2JqZWN0IGFuZCBmaWxsIGl0IHdpdGggdGhlIGxhdGVzdCBpbWFnZSBmcm9tIHRoZSBjYW1lcmEuCisgKgorICogVGhlIHJldHVybmVkIHBvaW50ZXIgaXMgb3duZWQgYnkgdGhlIGNhbGxlciBhbmQgaXMgdGhlaXIgcmVzcG9uc2liaWxpdHkgdG8gZGVsZXRlLgorICogQHJldHVybiBhIHBvaW50ZXIgdG8gYW4gSFNMSW1hZ2Ugb2JqZWN0CisgKi8KK0hTTEltYWdlICpBeGlzQ2FtZXJhOjpHZXRJbWFnZSgpCit7CisJSFNMSW1hZ2UgKmltYWdlID0gbmV3IEhTTEltYWdlKCk7CisJR2V0SW1hZ2UoaW1hZ2UpOworCXJldHVybiBpbWFnZTsKK30KKworLyoqCisgKiBDb3B5IGFuIGltYWdlIGludG8gYW4gZXhpc3RpbmcgYnVmZmVyLgorICogVGhpcyBjb3BpZXMgYW4gaW1hZ2UgaW50byBhbiBleGlzdGluZyBidWZmZXIgcmF0aGVyIHRoYW4gY3JlYXRpbmcgYSBuZXcgaW1hZ2UKKyAqIGluIG1lbW9yeS4gVGhhdCB3YXkgYSBuZXcgaW1hZ2UgaXMgb25seSBhbGxvY2F0ZWQgd2hlbiB0aGUgaW1hZ2UgYmVpbmcgY29waWVkIGlzCisgKiBsYXJnZXIgdGhhbiB0aGUgZGVzdGluYXRpb24uCisgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIFBDVmlkZW9TZXJ2ZXIgY2xhc3MuCisgKiBAcGFyYW0gaW1hZ2VEYXRhIFRoZSBkZXN0aW5hdGlvbiBpbWFnZS4KKyAqIEBwYXJhbSBudW1CeXRlcyBUaGUgc2l6ZSBvZiB0aGUgZGVzdGluYXRpb24gaW1hZ2UuCisgKiBAcmV0dXJuIDAgaWYgZmFpbGVkIChubyBzb3VyY2UgaW1hZ2Ugb3Igbm8gbWVtb3J5KSwgMSBpZiBzdWNjZXNzLgorICovCitpbnQgQXhpc0NhbWVyYTo6Q29weUpQRUcoY2hhciAqKmRlc3RJbWFnZSwgdW5zaWduZWQgaW50ICZkZXN0SW1hZ2VTaXplLCB1bnNpZ25lZCBpbnQgJmRlc3RJbWFnZUJ1ZmZlclNpemUpCit7CisJc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobV9pbWFnZURhdGFNdXRleCk7CisJaWYgKGRlc3RJbWFnZSA9PSBOVUxMKQorCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChOdWxsUGFyYW1ldGVyLCAiZGVzdEltYWdlIG11c3Qgbm90IGJlIE5VTEwiKTsKKworCWlmIChtX2ltYWdlRGF0YS5zaXplKCkgPT0gMCkKKwkJcmV0dXJuIDA7IC8vIGlmIG5vIHNvdXJjZSBpbWFnZQorCisJaWYgKGRlc3RJbWFnZUJ1ZmZlclNpemUgPCBtX2ltYWdlRGF0YS5zaXplKCkpIC8vIGlmIGN1cnJlbnQgZGVzdGluYXRpb24gYnVmZmVyIHRvbyBzbWFsbAorCXsKKwkJaWYgKCpkZXN0SW1hZ2UgIT0gTlVMTCkgZGVsZXRlIFtdICpkZXN0SW1hZ2U7CisJCWRlc3RJbWFnZUJ1ZmZlclNpemUgPSBtX2ltYWdlRGF0YS5zaXplKCkgKyBrSW1hZ2VCdWZmZXJBbGxvY2F0aW9uSW5jcmVtZW50OworCQkqZGVzdEltYWdlID0gbmV3IGNoYXJbZGVzdEltYWdlQnVmZmVyU2l6ZV07CisJCWlmICgqZGVzdEltYWdlID09IE5VTEwpIHJldHVybiAwOworCX0KKwkvLyBjb3B5IHRoaXMgaW1hZ2UgaW50byBkZXN0aW5hdGlvbiBidWZmZXIKKwlpZiAoKmRlc3RJbWFnZSA9PSBOVUxMKQorCXsKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoTnVsbFBhcmFtZXRlciwgIipkZXN0SW1hZ2UgbXVzdCBub3QgYmUgTlVMTCIpOworCX0KKwkKKwlzdGQ6OmNvcHkobV9pbWFnZURhdGEuYmVnaW4oKSwgbV9pbWFnZURhdGEuZW5kKCksICpkZXN0SW1hZ2UpOworCWRlc3RJbWFnZVNpemUgPSBtX2ltYWdlRGF0YS5zaXplKCk7OworCXJldHVybiAxOworfQorCisvKioKKyAqIFJlcXVlc3QgYSBjaGFuZ2UgaW4gdGhlIGJyaWdodG5lc3Mgb2YgdGhlIGNhbWVyYSBpbWFnZXMuCisgKiBAcGFyYW0gYnJpZ2h0bmVzcyB2YWxpZCB2YWx1ZXMgMCAuLiAxMDAKKyAqLwordm9pZCBBeGlzQ2FtZXJhOjpXcml0ZUJyaWdodG5lc3MoaW50IGJyaWdodG5lc3MpCit7CisJaWYgKGJyaWdodG5lc3MgPCAwIHx8IGJyaWdodG5lc3MgPiAxMDApCisJeworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChQYXJhbWV0ZXJPdXRPZlJhbmdlLAorCQkJCSJCcmlnaHRuZXNzIG11c3QgYmUgZnJvbSAwIHRvIDEwMCIpOworCQlyZXR1cm47CisJfQorCisJc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobV9wYXJhbWV0ZXJzTXV0ZXgpOworCisJaWYgKG1fYnJpZ2h0bmVzcyAhPSBicmlnaHRuZXNzKQorCXsKKwkJbV9icmlnaHRuZXNzID0gYnJpZ2h0bmVzczsKKwkJbV9wYXJhbWV0ZXJzRGlydHkgPSB0cnVlOworCX0KK30KKworLyoqCisgKiBAcmV0dXJuIFRoZSBjb25maWd1cmVkIGJyaWdodG5lc3Mgb2YgdGhlIGNhbWVyYSBpbWFnZXMKKyAqLworaW50IEF4aXNDYW1lcmE6OkdldEJyaWdodG5lc3MoKQoreworCXN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1fcGFyYW1ldGVyc011dGV4KTsKKwlyZXR1cm4gbV9icmlnaHRuZXNzOworfQorCisvKioKKyAqIFJlcXVlc3QgYSBjaGFuZ2UgaW4gdGhlIHdoaXRlIGJhbGFuY2Ugb24gdGhlIGNhbWVyYS4KKyAqIEBwYXJhbSB3aGl0ZUJhbGFuY2UgVmFsaWQgdmFsdWVzIGZyb20gdGhlIDxjb2RlPldoaXRlQmFsYW5jZTwvY29kZT4gZW51bS4KKyAqLwordm9pZCBBeGlzQ2FtZXJhOjpXcml0ZVdoaXRlQmFsYW5jZShBeGlzQ2FtZXJhOjpXaGl0ZUJhbGFuY2Ugd2hpdGVCYWxhbmNlKQoreworCXN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1fcGFyYW1ldGVyc011dGV4KTsKKworCWlmIChtX3doaXRlQmFsYW5jZSAhPSB3aGl0ZUJhbGFuY2UpCisJeworCQltX3doaXRlQmFsYW5jZSA9IHdoaXRlQmFsYW5jZTsKKwkJbV9wYXJhbWV0ZXJzRGlydHkgPSB0cnVlOworCX0KK30KKworLyoqCisgKiBAcmV0dXJuIFRoZSBjb25maWd1cmVkIHdoaXRlIGJhbGFuY2VzIG9mIHRoZSBjYW1lcmEgaW1hZ2VzCisgKi8KK0F4aXNDYW1lcmE6OldoaXRlQmFsYW5jZSBBeGlzQ2FtZXJhOjpHZXRXaGl0ZUJhbGFuY2UoKQoreworCXN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1fcGFyYW1ldGVyc011dGV4KTsKKwlyZXR1cm4gbV93aGl0ZUJhbGFuY2U7Cit9CisKKy8qKgorICogUmVxdWVzdCBhIGNoYW5nZSBpbiB0aGUgY29sb3IgbGV2ZWwgb2YgdGhlIGNhbWVyYSBpbWFnZXMuCisgKiBAcGFyYW0gY29sb3JMZXZlbCB2YWxpZCB2YWx1ZXMgYXJlIDAgLi4gMTAwCisgKi8KK3ZvaWQgQXhpc0NhbWVyYTo6V3JpdGVDb2xvckxldmVsKGludCBjb2xvckxldmVsKQoreworCWlmIChjb2xvckxldmVsIDwgMCB8fCBjb2xvckxldmVsID4gMTAwKQorCXsKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoUGFyYW1ldGVyT3V0T2ZSYW5nZSwKKwkJCQkiQ29sb3IgbGV2ZWwgbXVzdCBiZSBmcm9tIDAgdG8gMTAwIik7CisJCXJldHVybjsKKwl9CisKKwlzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtX3BhcmFtZXRlcnNNdXRleCk7CisKKwlpZiAobV9jb2xvckxldmVsICE9IGNvbG9yTGV2ZWwpCisJeworCQltX2NvbG9yTGV2ZWwgPSBjb2xvckxldmVsOworCQltX3BhcmFtZXRlcnNEaXJ0eSA9IHRydWU7CisJfQorfQorCisvKioKKyAqIEByZXR1cm4gVGhlIGNvbmZpZ3VyZWQgY29sb3IgbGV2ZWwgb2YgdGhlIGNhbWVyYSBpbWFnZXMKKyAqLworaW50IEF4aXNDYW1lcmE6OkdldENvbG9yTGV2ZWwoKQoreworCXN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1fcGFyYW1ldGVyc011dGV4KTsKKwlyZXR1cm4gbV9jb2xvckxldmVsOworfQorCisvKioKKyAqIFJlcXVlc3QgYSBjaGFuZ2UgaW4gdGhlIGNhbWVyYSdzIGV4cG9zdXJlIG1vZGUuCisgKiBAcGFyYW0gZXhwb3N1cmVDb250cm9sIEEgbW9kZSB0byB3cml0ZSBpbiB0aGUgPGNvZGU+RXhwb3N1cmU8L2NvZGU+IGVudW0uCisgKi8KK3ZvaWQgQXhpc0NhbWVyYTo6V3JpdGVFeHBvc3VyZUNvbnRyb2woCisJCUF4aXNDYW1lcmE6OkV4cG9zdXJlQ29udHJvbCBleHBvc3VyZUNvbnRyb2wpCit7CisJc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobV9wYXJhbWV0ZXJzTXV0ZXgpOworCisJaWYgKG1fZXhwb3N1cmVDb250cm9sICE9IGV4cG9zdXJlQ29udHJvbCkKKwl7CisJCW1fZXhwb3N1cmVDb250cm9sID0gZXhwb3N1cmVDb250cm9sOworCQltX3BhcmFtZXRlcnNEaXJ0eSA9IHRydWU7CisJfQorfQorCisvKioKKyAqIEByZXR1cm4gVGhlIGNvbmZpZ3VyZWQgZXhwb3N1cmUgY29udHJvbCBtb2RlIG9mIHRoZSBjYW1lcmEKKyAqLworQXhpc0NhbWVyYTo6RXhwb3N1cmVDb250cm9sIEF4aXNDYW1lcmE6OkdldEV4cG9zdXJlQ29udHJvbCgpCit7CisJc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobV9wYXJhbWV0ZXJzTXV0ZXgpOworCXJldHVybiBtX2V4cG9zdXJlQ29udHJvbDsKK30KKworLyoqCisgKiBSZXF1ZXN0IGEgY2hhbmdlIGluIHRoZSBleHBvc3VyZSBwcmlvcml0eSBvZiB0aGUgY2FtZXJhLgorICogQHBhcmFtIGV4cG9zdXJlUHJpb3JpdHkgVmFsaWQgdmFsdWVzIGFyZSAwLCA1MCwgMTAwLgorICogMCA9IFByaW9yaXRpemUgaW1hZ2UgcXVhbGl0eQorICogNTAgPSBOb25lCisgKiAxMDAgPSBQcmlvcml0aXplIGZyYW1lIHJhdGUKKyAqLwordm9pZCBBeGlzQ2FtZXJhOjpXcml0ZUV4cG9zdXJlUHJpb3JpdHkoaW50IGV4cG9zdXJlUHJpb3JpdHkpCit7CisJaWYgKGV4cG9zdXJlUHJpb3JpdHkgIT0gMCAmJiBleHBvc3VyZVByaW9yaXR5ICE9IDUwCisJCQkmJiBleHBvc3VyZVByaW9yaXR5ICE9IDEwMCkKKwl7CisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFBhcmFtZXRlck91dE9mUmFuZ2UsCisJCQkJIkV4cG9zdXJlIHByaW9yaXR5IG11c3QgYmUgZnJvbSAwLCA1MCwgb3IgMTAwIik7CisJCXJldHVybjsKKwl9CisKKwlzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtX3BhcmFtZXRlcnNNdXRleCk7CisKKwlpZiAobV9leHBvc3VyZVByaW9yaXR5ICE9IGV4cG9zdXJlUHJpb3JpdHkpCisJeworCQltX2V4cG9zdXJlUHJpb3JpdHkgPSBleHBvc3VyZVByaW9yaXR5OworCQltX3BhcmFtZXRlcnNEaXJ0eSA9IHRydWU7CisJfQorfQorCisvKioKKyAqIEByZXR1cm4gVGhlIGNvbmZpZ3VyZWQgZXhwb3N1cmUgcHJpb3JpdHkgb2YgdGhlIGNhbWVyYQorICovCitpbnQgQXhpc0NhbWVyYTo6R2V0RXhwb3N1cmVQcmlvcml0eSgpCit7CisJc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobV9wYXJhbWV0ZXJzTXV0ZXgpOworCXJldHVybiBtX2V4cG9zdXJlUHJpb3JpdHk7Cit9CisKKy8qKgorICogV3JpdGUgdGhlIG1heGltdW0gZnJhbWVzIHBlciBzZWNvbmQgdGhhdCB0aGUgY2FtZXJhIHNob3VsZCBzZW5kCisgKiBXcml0ZSAwIHRvIHNlbmQgYXMgbWFueSBhcyBwb3NzaWJsZS4KKyAqIEBwYXJhbSBtYXhGUFMgVGhlIG51bWJlciBvZiBmcmFtZXMgdGhlIGNhbWVyYSBzaG91bGQgc2VuZCBpbiBhIHNlY29uZCwgZXhwb3N1cmUgcGVybWl0dGluZy4KKyAqLwordm9pZCBBeGlzQ2FtZXJhOjpXcml0ZU1heEZQUyhpbnQgbWF4RlBTKQoreworCXN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1fcGFyYW1ldGVyc011dGV4KTsKKworCWlmIChtX21heEZQUyAhPSBtYXhGUFMpCisJeworCQltX21heEZQUyA9IG1heEZQUzsKKwkJbV9wYXJhbWV0ZXJzRGlydHkgPSB0cnVlOworCQltX3N0cmVhbURpcnR5ID0gdHJ1ZTsKKwl9Cit9CisKKy8qKgorICogQHJldHVybiBUaGUgY29uZmlndXJlZCBtYXhpbXVtIEZQUyBvZiB0aGUgY2FtZXJhCisgKi8KK2ludCBBeGlzQ2FtZXJhOjpHZXRNYXhGUFMoKQoreworCXN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1fcGFyYW1ldGVyc011dGV4KTsKKwlyZXR1cm4gbV9tYXhGUFM7Cit9CisKKy8qKgorICogV3JpdGUgcmVzb2x1dGlvbiB2YWx1ZSB0byBjYW1lcmEuCisgKiBAcGFyYW0gcmVzb2x1dGlvbiBUaGUgY2FtZXJhIHJlc29sdXRpb24gdmFsdWUgdG8gd3JpdGUgdG8gdGhlIGNhbWVyYS4KKyAqLwordm9pZCBBeGlzQ2FtZXJhOjpXcml0ZVJlc29sdXRpb24oQXhpc0NhbWVyYTo6UmVzb2x1dGlvbiByZXNvbHV0aW9uKQoreworCXN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1fcGFyYW1ldGVyc011dGV4KTsKKworCWlmIChtX3Jlc29sdXRpb24gIT0gcmVzb2x1dGlvbikKKwl7CisJCW1fcmVzb2x1dGlvbiA9IHJlc29sdXRpb247CisJCW1fcGFyYW1ldGVyc0RpcnR5ID0gdHJ1ZTsKKwkJbV9zdHJlYW1EaXJ0eSA9IHRydWU7CisJfQorfQorCisvKioKKyAqIEByZXR1cm4gVGhlIGNvbmZpZ3VyZWQgcmVzb2x1dGlvbiBvZiB0aGUgY2FtZXJhIChub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUKKyAqIHJlc29sdXRpb24gYXMgdGhlIG1vc3QgcmVjZW50IGltYWdlLCBpZiBpdCB3YXMgY2hhbmdlZCByZWNlbnRseS4pCisgKi8KK0F4aXNDYW1lcmE6OlJlc29sdXRpb24gQXhpc0NhbWVyYTo6R2V0UmVzb2x1dGlvbigpCit7CisJc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobV9wYXJhbWV0ZXJzTXV0ZXgpOworCXJldHVybiBtX3Jlc29sdXRpb247Cit9CisKKy8qKgorICogV3JpdGUgdGhlIHJvdGF0aW9uIHZhbHVlIHRvIHRoZSBjYW1lcmEuCisgKiBJZiB5b3UgbW91bnQgeW91ciBjYW1lcmEgdXBzaWRlIGRvd24sIHVzZSB0aGlzIHRvIGFkanVzdCB0aGUgaW1hZ2UgZm9yIHlvdS4KKyAqIEBwYXJhbSByb3RhdGlvbiBUaGUgYW5nbGUgdG8gcm90YXRlIHRoZSBjYW1lcmEgKDxjb2RlPkF4aXNDYW1lcmE6OlJvdGF0aW9uOjprMDwvY29kZT4KKyAqIG9yIDxjb2RlPkF4aXNDYW1lcmE6OlJvdGF0aW9uOjprMTgwPC9jb2RlPikKKyAqLwordm9pZCBBeGlzQ2FtZXJhOjpXcml0ZVJvdGF0aW9uKEF4aXNDYW1lcmE6OlJvdGF0aW9uIHJvdGF0aW9uKQoreworCXN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1fcGFyYW1ldGVyc011dGV4KTsKKworCWlmIChtX3JvdGF0aW9uICE9IHJvdGF0aW9uKQorCXsKKwkJbV9yb3RhdGlvbiA9IHJvdGF0aW9uOworCQltX3BhcmFtZXRlcnNEaXJ0eSA9IHRydWU7CisJCW1fc3RyZWFtRGlydHkgPSB0cnVlOworCX0KK30KKworLyoqCisgKiBAcmV0dXJuIFRoZSBjb25maWd1cmVkIHJvdGF0aW9uIG1vZGUgb2YgdGhlIGNhbWVyYQorICovCitBeGlzQ2FtZXJhOjpSb3RhdGlvbiBBeGlzQ2FtZXJhOjpHZXRSb3RhdGlvbigpCit7CisJc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobV9wYXJhbWV0ZXJzTXV0ZXgpOworCXJldHVybiBtX3JvdGF0aW9uOworfQorCisvKioKKyAqIFdyaXRlIHRoZSBjb21wcmVzc2lvbiB2YWx1ZSB0byB0aGUgY2FtZXJhLgorICogQHBhcmFtIGNvbXByZXNzaW9uIFZhbHVlcyBiZXR3ZWVuIDAgYW5kIDEwMC4KKyAqLwordm9pZCBBeGlzQ2FtZXJhOjpXcml0ZUNvbXByZXNzaW9uKGludCBjb21wcmVzc2lvbikKK3sKKwlpZiAoY29tcHJlc3Npb24gPCAwIHx8IGNvbXByZXNzaW9uID4gMTAwKQorCXsKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoUGFyYW1ldGVyT3V0T2ZSYW5nZSwKKwkJCQkiQ29tcHJlc3Npb24gbXVzdCBiZSBmcm9tIDAgdG8gMTAwIik7CisJCXJldHVybjsKKwl9CisKKwlzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtX3BhcmFtZXRlcnNNdXRleCk7CisKKwlpZiAobV9jb21wcmVzc2lvbiAhPSBjb21wcmVzc2lvbikKKwl7CisJCW1fY29tcHJlc3Npb24gPSBjb21wcmVzc2lvbjsKKwkJbV9wYXJhbWV0ZXJzRGlydHkgPSB0cnVlOworCQltX3N0cmVhbURpcnR5ID0gdHJ1ZTsKKwl9Cit9CisKKy8qKgorICogQHJldHVybiBUaGUgY29uZmlndXJlZCBjb21wcmVzc2lvbiBsZXZlbCBvZiB0aGUgY2FtZXJhCisgKi8KK2ludCBBeGlzQ2FtZXJhOjpHZXRDb21wcmVzc2lvbigpCit7CisJc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobV9wYXJhbWV0ZXJzTXV0ZXgpOworCXJldHVybiBtX2NvbXByZXNzaW9uOworfQorCisvKioKKyAqIE1ldGhvZCBjYWxsZWQgaW4gdGhlIGNhcHR1cmUgdGhyZWFkIHRvIHJlY2VpdmUgaW1hZ2VzIGZyb20gdGhlIGNhbWVyYQorICovCit2b2lkIEF4aXNDYW1lcmE6OkNhcHR1cmUoKQoreworCWludCBjb25zZWN1dGl2ZUVycm9ycyA9IDA7CisKKwkvLyBMb29wIG9uIHRyeWluZyB0byBzZXR1cCB0aGUgY2FtZXJhIGNvbm5lY3Rpb24uIFRoaXMgaGFwcGVucyBpbiBhIGJhY2tncm91bmQKKwkvLyB0aHJlYWQgc28gaXQgc2hvdWxkbid0IGVmZmVjdCB0aGUgb3BlcmF0aW9uIG9mIHVzZXIgcHJvZ3JhbXMuCisJd2hpbGUgKCFtX2RvbmUpCisJeworCQlzdGQ6OnN0cmluZyByZXF1ZXN0U3RyaW5nID0gIkdFVCAvbWpwZy92aWRlby5tanBnIEhUVFAvMS4xXG4iCisJCQkJIlVzZXItQWdlbnQ6IEhUVFBTdHJlYW1DbGllbnRcbiIKKwkJCQkiQ29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuIgorCQkJCSJDYWNoZS1Db250cm9sOiBuby1jYWNoZVxuIgorCQkJCSJBdXRob3JpemF0aW9uOiBCYXNpYyBSbEpET2taU1F3PT1cblxuIjsKKwkJbV9jYXB0dXJlTXV0ZXgubG9jaygpOworCQltX2NhbWVyYVNvY2tldCA9IENyZWF0ZUNhbWVyYVNvY2tldChyZXF1ZXN0U3RyaW5nLCBjb25zZWN1dGl2ZUVycm9ycyA+IDUpOworCQlpZiAobV9jYW1lcmFTb2NrZXQgIT0gLTEpCisJCXsKKwkJCVJlYWRJbWFnZXNGcm9tQ2FtZXJhKCk7CisJCQljb25zZWN1dGl2ZUVycm9ycyA9IDA7CisJCX0KKwkJZWxzZQorCQl7CisJCQljb25zZWN1dGl2ZUVycm9ycysrOworCQl9CisJCW1fY2FwdHVyZU11dGV4LnVubG9jaygpOworCQlXYWl0KDAuNSk7CisJfQorfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gYWN0dWFsbHkgcmVhZHMgdGhlIGltYWdlcyBmcm9tIHRoZSBjYW1lcmEuCisgKi8KK3ZvaWQgQXhpc0NhbWVyYTo6UmVhZEltYWdlc0Zyb21DYW1lcmEoKQoreworCWNoYXIgKmltZ0J1ZmZlciA9IE5VTEw7CisJaW50IGltZ0J1ZmZlckxlbmd0aCA9IDA7CisKKwkvLyBUT0RPOiB0aGVzZSByZWN2IGNhbGxzIG11c3QgYmUgbm9uLWJsb2NraW5nLiBPdGhlcndpc2UgaWYgdGhlIGNhbWVyYQorCS8vIGZhaWxzIGR1cmluZyBhIHJlYWQsIHRoZSBjb2RlIGhhbmdzIGFuZCBuZXZlciByZXRyaWVzIHdoZW4gdGhlIGNhbWVyYSBjb21lcworCS8vIGJhY2sgdXAuCisKKwlpbnQgY291bnRlciA9IDI7CisJd2hpbGUgKCFtX2RvbmUpCisJeworCQljaGFyIGluaXRpYWxSZWFkQnVmZmVyW2tNYXhQYWNrZXRTaXplXSA9ICIiOworCQljaGFyIGludGVybWVkaWF0ZUJ1ZmZlclsxXTsKKwkJY2hhciAqdHJhaWxpbmdQdHIgPSBpbml0aWFsUmVhZEJ1ZmZlcjsKKwkJaW50IHRyYWlsaW5nQ291bnRlciA9IDA7CisJCXdoaWxlIChjb3VudGVyKQorCQl7CisJCQkvLyBUT0RPOiBmaXggbWUuLi4gdGhpcyBjYW5ub3QgYmUgdGhlIG1vc3QgZWZmaWNpZW50IHdheSB0byBhcHByb2FjaCB0aGlzLCByZWFkaW5nIG9uZSBieXRlIGF0IGEgdGltZS4KKwkJCWlmIChyZWN2KG1fY2FtZXJhU29ja2V0LCBpbnRlcm1lZGlhdGVCdWZmZXIsIDEsIDApID09IC0xKQorCQkJeworCQkJCXdwaV9zZXRFcnJub0Vycm9yV2l0aENvbnRleHQoIkZhaWxlZCB0byByZWFkIGltYWdlIGhlYWRlciIpOworCQkJCWNsb3NlKG1fY2FtZXJhU29ja2V0KTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlzdHJuY2F0KGluaXRpYWxSZWFkQnVmZmVyLCBpbnRlcm1lZGlhdGVCdWZmZXIsIDEpOworCQkJLy8gdHJhaWxpbmdDb3VudGVyIGVuc3VyZXMgdGhhdCB3ZSBzdGFydCBsb29raW5nIGZvciB0aGUgNCBieXRlIHN0cmluZyBhZnRlcgorCQkJLy8gdGhlcmUgaXMgYXQgbGVhc3QgNCBieXRlcyB0b3RhbC4gS2luZCBvZiBvYnNjdXJlLgorCQkJLy8gbG9vayBmb3IgMiBibGFuayBsaW5lcyAoXHJcbikKKwkJCWlmIChOVUxMICE9IHN0cnN0cih0cmFpbGluZ1B0ciwgIlxyXG5cclxuIikpCisJCQl7CisJCQkJLS1jb3VudGVyOworCQkJfQorCQkJaWYgKCsrdHJhaWxpbmdDb3VudGVyID49IDQpCisJCQl7CisJCQkJdHJhaWxpbmdQdHIrKzsKKwkJCX0KKwkJfQorCQljb3VudGVyID0gMTsKKwkJY2hhciAqY29udGVudExlbmd0aCA9IHN0cnN0cihpbml0aWFsUmVhZEJ1ZmZlciwgIkNvbnRlbnQtTGVuZ3RoOiAiKTsKKwkJaWYgKGNvbnRlbnRMZW5ndGggPT0gTlVMTCkKKwkJeworCQkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoSW5jb21wYXRpYmxlTW9kZSwKKwkJCQkJIk5vIGNvbnRlbnQtbGVuZ3RoIHRva2VuIGZvdW5kIGluIHBhY2tldCIpOworCQkJY2xvc2UobV9jYW1lcmFTb2NrZXQpOworCQkJcmV0dXJuOworCQl9CisJCWNvbnRlbnRMZW5ndGggPSBjb250ZW50TGVuZ3RoICsgMTY7IC8vIHNraXAgcGFzdCAiY29udGVudCBsZW5ndGgiCisJCWludCByZWFkTGVuZ3RoID0gYXRvbChjb250ZW50TGVuZ3RoKTsgLy8gZ2V0IHRoZSBpbWFnZSBieXRlIGNvdW50CisKKwkJLy8gTWFrZSBzdXJlIGJ1ZmZlciBpcyBsYXJnZSBlbm91Z2gKKwkJaWYgKGltZ0J1ZmZlckxlbmd0aCA8IHJlYWRMZW5ndGgpCisJCXsKKwkJCWlmIChpbWdCdWZmZXIpCisJCQkJZGVsZXRlW10gaW1nQnVmZmVyOworCQkJaW1nQnVmZmVyTGVuZ3RoID0gcmVhZExlbmd0aCArIGtJbWFnZUJ1ZmZlckFsbG9jYXRpb25JbmNyZW1lbnQ7CisJCQlpbWdCdWZmZXIgPSBuZXcgY2hhcltpbWdCdWZmZXJMZW5ndGhdOworCQkJaWYgKGltZ0J1ZmZlciA9PSBOVUxMKQorCQkJeworCQkJCWltZ0J1ZmZlckxlbmd0aCA9IDA7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQkvLyBSZWFkIHRoZSBpbWFnZSBkYXRhIGZvciAiQ29udGVudC1MZW5ndGgiIGJ5dGVzCisJCWludCBieXRlc1JlYWQgPSAwOworCQlpbnQgcmVtYWluaW5nID0gcmVhZExlbmd0aDsKKwkJd2hpbGUgKGJ5dGVzUmVhZCA8IHJlYWRMZW5ndGgpCisJCXsKKwkJCWludCBieXRlc1RoaXNSZWN2ID0gcmVjdihtX2NhbWVyYVNvY2tldCwgJmltZ0J1ZmZlcltieXRlc1JlYWRdLAorCQkJCQlyZW1haW5pbmcsIDApOworCQkJYnl0ZXNSZWFkICs9IGJ5dGVzVGhpc1JlY3Y7CisJCQlyZW1haW5pbmcgLT0gYnl0ZXNUaGlzUmVjdjsKKwkJfQorCisJCS8vIFVwZGF0ZSBpbWFnZQorCQl7CisJCQlzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtX2ltYWdlRGF0YU11dGV4KTsKKworCQkJbV9pbWFnZURhdGEuYXNzaWduKGltZ0J1ZmZlciwgaW1nQnVmZmVyICsgaW1nQnVmZmVyTGVuZ3RoKTsKKwkJCW1fZnJlc2hJbWFnZSA9IHRydWU7CisJCX0KKworCQlpZiAoV3JpdGVQYXJhbWV0ZXJzKCkpCisJCXsKKwkJCWJyZWFrOworCQl9CisJfQorCisJY2xvc2UobV9jYW1lcmFTb2NrZXQpOworfQorCisvKioKKyAqIFNlbmQgYSByZXF1ZXN0IHRvIHRoZSBjYW1lcmEgdG8gc2V0IGFsbCBvZiB0aGUgcGFyYW1ldGVycy4gIFRoaXMgaXMgY2FsbGVkCisgKiBpbiB0aGUgY2FwdHVyZSB0aHJlYWQgYmV0d2VlbiBlYWNoIGZyYW1lLiBUaGlzIHN0cmF0ZWd5IGF2b2lkcyBtYWtpbmcgbG90cworICogb2YgcmVkdW5kYW50IEhUVFAgcmVxdWVzdHMsIGFjY291bnRzIGZvciBmYWlsZWQgaW5pdGlhbCByZXF1ZXN0cywgYW5kCisgKiBhdm9pZHMgYmxvY2tpbmcgY2FsbHMgaW4gdGhlIG1haW4gdGhyZWFkIHVubGVzcyBuZWNlc3NhcnkuCisgKgorICogVGhpcyBtZXRob2QgZG9lcyBub3RoaW5nIGlmIG5vIHBhcmFtZXRlcnMgaGF2ZSBiZWVuIG1vZGlmaWVkIHNpbmNlIGl0IGxhc3QKKyAqIGNvbXBsZXRlbHkgc3VjY2Vzc2Z1bGx5LgorICoKKyAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN0cmVhbSBzaG91bGQgYmUgcmVzdGFydGVkIGR1ZSB0byBhCisgKiBwYXJhbWV0ZXIgY2hhbmdpbmcuCisgKi8KK2Jvb2wgQXhpc0NhbWVyYTo6V3JpdGVQYXJhbWV0ZXJzKCkKK3sKKwlpZiAobV9wYXJhbWV0ZXJzRGlydHkpCisJeworCQlzdGQ6OnN0cmluZ3N0cmVhbSByZXF1ZXN0OworCQlyZXF1ZXN0IDw8ICJHRVQgL2F4aXMtY2dpL2FkbWluL3BhcmFtLmNnaT9hY3Rpb249dXBkYXRlIjsKKworCQltX3BhcmFtZXRlcnNNdXRleC5sb2NrKCk7CisJCXJlcXVlc3QgPDwgIiZJbWFnZVNvdXJjZS5JMC5TZW5zb3IuQnJpZ2h0bmVzcz0iIDw8IG1fYnJpZ2h0bmVzczsKKwkJcmVxdWVzdCA8PCAiJkltYWdlU291cmNlLkkwLlNlbnNvci5XaGl0ZUJhbGFuY2U9IiA8PCBrV2hpdGVCYWxhbmNlU3RyaW5nc1ttX3doaXRlQmFsYW5jZV07CisJCXJlcXVlc3QgPDwgIiZJbWFnZVNvdXJjZS5JMC5TZW5zb3IuQ29sb3JMZXZlbD0iIDw8IG1fY29sb3JMZXZlbDsKKwkJcmVxdWVzdCA8PCAiJkltYWdlU291cmNlLkkwLlNlbnNvci5FeHBvc3VyZT0iIDw8IGtFeHBvc3VyZUNvbnRyb2xTdHJpbmdzW21fZXhwb3N1cmVDb250cm9sXTsKKwkJcmVxdWVzdCA8PCAiJkltYWdlU291cmNlLkkwLlNlbnNvci5FeHBvc3VyZVByaW9yaXR5PSIgPDwgbV9leHBvc3VyZVByaW9yaXR5OworCQlyZXF1ZXN0IDw8ICImSW1hZ2UuSTAuU3RyZWFtLkZQUz0iIDw8IG1fbWF4RlBTOworCQlyZXF1ZXN0IDw8ICImSW1hZ2UuSTAuQXBwZWFyYW5jZS5SZXNvbHV0aW9uPSIgPDwga1Jlc29sdXRpb25TdHJpbmdzW21fcmVzb2x1dGlvbl07CisJCXJlcXVlc3QgPDwgIiZJbWFnZS5JMC5BcHBlYXJhbmNlLkNvbXByZXNzaW9uPSIgPDwgbV9jb21wcmVzc2lvbjsKKwkJcmVxdWVzdCA8PCAiJkltYWdlLkkwLkFwcGVhcmFuY2UuUm90YXRpb249IiA8PCBrUm90YXRpb25TdHJpbmdzW21fcm90YXRpb25dOworCQltX3BhcmFtZXRlcnNNdXRleC51bmxvY2soKTsKKworCQlyZXF1ZXN0IDw8ICIgSFRUUC8xLjEiIDw8IHN0ZDo6ZW5kbDsKKwkJcmVxdWVzdCA8PCAiVXNlci1BZ2VudDogSFRUUFN0cmVhbUNsaWVudCIgPDwgc3RkOjplbmRsOworCQlyZXF1ZXN0IDw8ICJDb25uZWN0aW9uOiBLZWVwLUFsaXZlIiA8PCBzdGQ6OmVuZGw7CisJCXJlcXVlc3QgPDwgIkNhY2hlLUNvbnRyb2w6IG5vLWNhY2hlIiA8PCBzdGQ6OmVuZGw7CisJCXJlcXVlc3QgPDwgIkF1dGhvcml6YXRpb246IEJhc2ljIFJsSkRPa1pTUXc9PSIgPDwgc3RkOjplbmRsOworCQlyZXF1ZXN0IDw8IHN0ZDo6ZW5kbDsKKworCQlpbnQgc29ja2V0ID0gQ3JlYXRlQ2FtZXJhU29ja2V0KHJlcXVlc3Quc3RyKCksIGZhbHNlKTsKKwkJaWYgKHNvY2tldCA9PSAtMSkKKwkJeworCQkJd3BpX3NldEVycm5vRXJyb3JXaXRoQ29udGV4dCgiRXJyb3Igc2V0dGluZyBjYW1lcmEgcGFyYW1ldGVycyIpOworCQl9CisJCWVsc2UKKwkJeworCQkJY2xvc2Uoc29ja2V0KTsKKwkJCW1fcGFyYW1ldGVyc0RpcnR5ID0gZmFsc2U7CisKKwkJCWlmIChtX3N0cmVhbURpcnR5KQorCQkJeworCQkJCW1fc3RyZWFtRGlydHkgPSBmYWxzZTsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBDcmVhdGUgYSBzb2NrZXQgY29ubmVjdGVkIHRvIGNhbWVyYQorICogVXNlZCB0byBjcmVhdGUgYSBjb25uZWN0aW9uIHRvIHRoZSBjYW1lcmEgZm9yIGJvdGggY2FwdHVyaW5nIGltYWdlcyBhbmQgc2V0dGluZyBwYXJhbWV0ZXJzLgorICogQHBhcmFtIHJlcXVlc3RTdHJpbmcgVGhlIGluaXRpYWwgcmVxdWVzdCBzdHJpbmcgdG8gc2VuZCB1cG9uIHN1Y2Nlc3NmdWwgY29ubmVjdGlvbi4KKyAqIEBwYXJhbSBzZXRFcnJvciBJZiB0cnVlLCByYWlzIGFuIGVycm9yIGlmIHRoZXJlJ3MgYSBwcm9ibGVtIGNyZWF0aW5nIHRoZSBjb25uZWN0aW9uLgorICogVGhpcyBpcyBvbmx5IGVuYWJsZWQgYWZ0ZXIgc2V2ZXJhbCB1bnN1Y2Vzc2Z1bCBjb25uZWN0aW9ucywgc28gYSBzaW5nbGUgb25lIGRvZXNuJ3QKKyAqIGNhdXNlIGFuIGVycm9yIG1lc3NhZ2UgdG8gYmUgcHJpbnRlZCBpZiBpdCBpbW1lZGlhdGVseSByZWNvdmVycy4KKyAqIEByZXR1cm4gLTEgaWYgZmFpbGVkLCBzb2NrZXQgaGFuZGxlIGlmIHN1Y2Nlc3NmdWwuCisgKi8KK2ludCBBeGlzQ2FtZXJhOjpDcmVhdGVDYW1lcmFTb2NrZXQoc3RkOjpzdHJpbmcgY29uc3QmIHJlcXVlc3RTdHJpbmcsIGJvb2wgc2V0RXJyb3IpCit7CisJc3RydWN0IGFkZHJpbmZvICphZGRyZXNzID0gMDsKKwlpbnQgY2FtU29ja2V0OworCisJLyogY3JlYXRlIHNvY2tldCAqLworCWlmICgoY2FtU29ja2V0ID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKSkgPT0gLTEpCisJeworCQlpZiAoc2V0RXJyb3IpIHdwaV9zZXRFcnJub0Vycm9yV2l0aENvbnRleHQoIkZhaWxlZCB0byBjcmVhdGUgdGhlIGNhbWVyYSBzb2NrZXQiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChnZXRhZGRyaW5mbyhtX2NhbWVyYUhvc3QuY19zdHIoKSwgIjgwIiwgMCwgJmFkZHJlc3MpID09IC0xKQorCXsKKwkJaWYgKHNldEVycm9yKSB3cGlfc2V0RXJybm9FcnJvcldpdGhDb250ZXh0KCJGYWlsZWQgdG8gY3JlYXRlIHRoZSBjYW1lcmEgc29ja2V0Iik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBjb25uZWN0IHRvIHNlcnZlciAqLworCWlmIChjb25uZWN0KGNhbVNvY2tldCwgYWRkcmVzcy0+YWlfYWRkciwgYWRkcmVzcy0+YWlfYWRkcmxlbikgPT0gLTEpCisJeworCQlpZiAoc2V0RXJyb3IpIHdwaV9zZXRFcnJub0Vycm9yV2l0aENvbnRleHQoIkZhaWxlZCB0byBjb25uZWN0IHRvIHRoZSBjYW1lcmEiKTsKKwkJY2xvc2UoY2FtU29ja2V0KTsKKwkJcmV0dXJuIC0xOworCX0KKworCWludCBzZW50ID0gc2VuZChjYW1Tb2NrZXQsIHJlcXVlc3RTdHJpbmcuY19zdHIoKSwgcmVxdWVzdFN0cmluZy5zaXplKCksIDApOworCWlmIChzZW50ID09IC0xKQorCXsKKwkJaWYgKHNldEVycm9yKSB3cGlfc2V0RXJybm9FcnJvcldpdGhDb250ZXh0KCJGYWlsZWQgdG8gc2VuZCBhIHJlcXVlc3QgdG8gdGhlIGNhbWVyYSIpOworCQljbG9zZShjYW1Tb2NrZXQpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIGNhbVNvY2tldDsKK30KKwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9WaXNpb24vQmFlVXRpbGl0aWVzLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvVmlzaW9uL0JhZVV0aWxpdGllcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgwNDQxMQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvVmlzaW9uL0JhZVV0aWxpdGllcy5jcHAKQEAgLTAsMCArMSwzODUgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPiAKKyNpbmNsdWRlIDxzdGRhcmcuaD4gCisgCisjaW5jbHVkZSAiVmlzaW9uL0JhZVV0aWxpdGllcy5oIgorI2luY2x1ZGUgIlNlcnZvLmgiCisjaW5jbHVkZSAiVGltZXIuaCIKKworLyoqCisgKiAgIFV0aWxpdHkgZnVuY3Rpb25zIAorICovCisKKy8qKgorICogZGVidWcgb3V0cHV0IGZsYWcgb3B0aW9uczoKKyAqIERFQlVHX09GRiwgREVCVUdfTU9TVExZX09GRiwgREVCVUdfU0NSRUVOX09OTFksIERFQlVHX0ZJTEVfT05MWSwgREVCVUdfU0NSRUVOX0FORF9GSUxFCisgKi8KK3N0YXRpYyBEZWJ1Z091dHB1dFR5cGUJZHByaW50ZkZsYWcgPSBERUJVR19PRkY7ICAKKworLyoqCisgKiBTZXQgdGhlIGRlYnVnIGZsYWcgdG8gcHJpbnQgdG8gc2NyZWVuLCBmaWxlIG9uIGNSSU8sIGJvdGggb3IgbmVpdGhlcgorICogQHBhcmFtIHRlbXBTdHJpbmcgVGhlIGZvcm1hdCBzdHJpbmcuCisgKi8KK3ZvaWQgU2V0RGVidWdGbGFnICggRGVidWdPdXRwdXRUeXBlIGZsYWcgICkgIAoreyBkcHJpbnRmRmxhZyA9IGZsYWc7IH0KKworLyoqCisgKiBEZWJ1ZyBwcmludCB0byBhIGZpbGUgYW5kL29yIGEgdGVybWluYWwgd2luZG93LgorICogQ2FsbCBsaWtlIHlvdSB3b3VsZCBjYWxsIHByaW50Zi4KKyAqIFNldCBmdW5jdGlvbk5hbWUgaW4gdGhlIGZ1bmN0aW9uIGlmIHlvdSB3YW50IHRoZSBjb3JyZWN0IGZ1bmN0aW9uIG5hbWUgdG8gcHJpbnQgb3V0LgorICogVGhlIGZpbGUgbGluZSBudW1iZXIgd2lsbCBhbHNvIGJlIHByaW50ZWQuCisgKiBAcGFyYW0gdGVtcFN0cmluZyBUaGUgZm9ybWF0IHN0cmluZy4KKyAqLwordm9pZCBkcHJpbnRmICggY29uc3QgY2hhciAqIHRlbXBTdHJpbmcsIC4uLiAgKSAgLyogVmFyaWFibGUgYXJndW1lbnQgbGlzdCAqLworeworICB2YV9saXN0CQlhcmdzOwkJCSAgLyogSW5wdXQgYXJndW1lbnQgbGlzdCAqLworICBpbnQJCQlsaW5lX251bWJlcjsgICAgICAvKiBMaW5lIG51bWJlciBwYXNzZWQgaW4gYXJndW1lbnQgKi8KKyAgaW50CQkJdHlwZTsKKyAgY29uc3QgY2hhcgkqZnVuY3Rpb25OYW1lOyAgICAvKiBGb3JtYXQgcGFzc2VkIGluIGFyZ3VtZW50ICovCisgIGNvbnN0IGNoYXIJKmZtdDsgICAgICAgICAgICAgLyogRm9ybWF0IHBhc3NlZCBpbiBhcmd1bWVudCAqLworICBjaGFyCQkJdGV4dFs1MTJdOyAgIAkgIC8qIFRleHQgc3RyaW5nICovCisgIGNoYXIJCQlvdXR0ZXh0WzUxMl07ICAgICAvKiBUZXh0IHN0cmluZyAqLworICBGSUxFCQkJKm91dGZpbGVfZmQ7ICAgICAgLyogT3V0cHV0IGZpbGUgcG9pbnRlciAqLworICBjaGFyCQkJZmlsZXBhdGhbMTI4XTsgICAgLyogVGV4dCBzdHJpbmcgKi8KKyAgaW50CQkJZmF0YWxGbGFnPTA7CisgIGNvbnN0IGNoYXIJKmZpbGVuYW1lOworICBpbnQJCQlpbmRleDsKKyAgaW50CQkJdGVtcFN0cmluZ0xlbjsKKworICBpZiAoZHByaW50ZkZsYWcgPT0gREVCVUdfT0ZGKSB7IHJldHVybjsgfQorICAKKyAgdmFfc3RhcnQgKGFyZ3MsIHRlbXBTdHJpbmcpOworICAKKyAgdGVtcFN0cmluZ0xlbiA9IHN0cmxlbih0ZW1wU3RyaW5nKTsKKyAgZmlsZW5hbWUgPSB0ZW1wU3RyaW5nOworICBmb3IgKGluZGV4PTA7aW5kZXg8dGVtcFN0cmluZ0xlbjtpbmRleCsrKXsKKwkgIGlmICh0ZW1wU3RyaW5nW2luZGV4XSA9PSAnICcpIHsKKwkJICBwcmludGYoICJFUlJPUiBpbiBkcHJpbnRmOiBtYWxmb3JtZWQgY2FsbGluZyBzZXF1ZW5jZSAoJXMpXG4iLHRlbXBTdHJpbmcpO3JldHVybjsKKwkgIAl9CisJICBpZiAodGVtcFN0cmluZ1tpbmRleF0gPT0gJ1xcJyB8fCB0ZW1wU3RyaW5nW2luZGV4XSA9PSAnLycpCisJCSAgZmlsZW5hbWUgPSB0ZW1wU3RyaW5nICsgaW5kZXggKyAxOworICB9CisgIAorICAvKiBFeHRyYWN0IGZ1bmN0aW9uIG5hbWUgKi8KKyAgZnVuY3Rpb25OYW1lID0gdmFfYXJnIChhcmdzLCBjb25zdCBjaGFyICopOworIAorIC8qIEV4dHJhY3QgbGluZSBudW1iZXIgZnJvbSBhcmd1bWVudCBsaXN0ICovCisgIGxpbmVfbnVtYmVyID0gdmFfYXJnIChhcmdzLCBpbnQpOworCisgLyogRXh0cmFjdCBpbmZvcm1hdGlvbiB0eXBlIGZyb20gYXJndW1lbnQgbGlzdCAqLworICB0eXBlID0gdmFfYXJnIChhcmdzLCBpbnQpOworCisgLyogRXh0cmFjdCBmb3JtYXQgZnJvbSBhcmd1bWVudCBsaXN0ICovCisgIGZtdCA9IHZhX2FyZyAoYXJncywgY29uc3QgY2hhciAqKTsKKworICB2c3ByaW50ZiAodGV4dCwgZm10LCBhcmdzKTsKKworICB2YV9lbmQgKGFyZ3MpOworCisgIC8qIEZvcm1hdCBvdXRwdXQgc3RhdGVtZW50ICovCisgIHN3aXRjaCAodHlwZSkKKyAgIHsKKyAgIGNhc2UgREVCVUdfVFlQRToKKyAgICAgc3ByaW50ZiAob3V0dGV4dCwgIlslczolc0AlMDRkXSBERUJVRyAlc1xuIiwKKyAgICAgICAgICAgICAgZmlsZW5hbWUsIGZ1bmN0aW9uTmFtZSwgbGluZV9udW1iZXIsIHRleHQpOworICAgICBicmVhazsKKyAgIGNhc2UgSU5GT19UWVBFOgorICAgICBzcHJpbnRmIChvdXR0ZXh0LCAiWyVzOiVzQCUwNGRdIElORk8gJXNcbiIsCisgICAgICAgICAgICAgIGZpbGVuYW1lLCBmdW5jdGlvbk5hbWUsIGxpbmVfbnVtYmVyLCB0ZXh0KTsKKyAgICAgYnJlYWs7CisgICBjYXNlIEVSUk9SX1RZUEU6CisgICAgIHNwcmludGYgKG91dHRleHQsICJbJXM6JXNAJTA0ZF0gRVJST1IgJXNcbiIsCisgICAgICAgICAgICAgIGZpbGVuYW1lLCBmdW5jdGlvbk5hbWUsIGxpbmVfbnVtYmVyLCB0ZXh0KTsKKyAgICAgYnJlYWs7CisgICBjYXNlIENSSVRJQ0FMX1RZUEU6CisgICAgIHNwcmludGYgKG91dHRleHQsICJbJXM6JXNAJTA0ZF0gQ1JJVElDQUwgJXNcbiIsCisgICAgICAgICAgICAgIGZpbGVuYW1lLCBmdW5jdGlvbk5hbWUsIGxpbmVfbnVtYmVyLCB0ZXh0KTsKKyAgICAgYnJlYWs7CisgICBjYXNlIEZBVEFMX1RZUEU6CisgICAgIGZhdGFsRmxhZyA9IDE7CisgICAgIHNwcmludGYgKG91dHRleHQsICJbJXM6JXNAJTA0ZF0gRkFUQUwgJXNcbiIsCisgICAgICAgICAgICAgIGZpbGVuYW1lLCBmdW5jdGlvbk5hbWUsIGxpbmVfbnVtYmVyLCB0ZXh0KTsKKyAgICAgYnJlYWs7CisgICBkZWZhdWx0OgorICAgICBwcmludGYoICJFUlJPUiBpbiBkcHJpbnRmOiBtYWxmb3JtZWQgY2FsbGluZyBzZXF1ZW5jZVxuIik7CisgICAgIHJldHVybjsKKyAgICAgYnJlYWs7CisgICB9CisKKyAgc3ByaW50ZiAoZmlsZXBhdGgsICIlcy5kZWJ1ZyIsIGZpbGVuYW1lKTsKKworICAvKiBXcml0ZSBvdXRwdXQgc3RhdGVtZW50ICovCisgIHN3aXRjaCAoZHByaW50ZkZsYWcpCisgIHsKKyAgZGVmYXVsdDoKKyAgY2FzZSBERUJVR19PRkY6IAorICAJYnJlYWs7CisgIGNhc2UgREVCVUdfTU9TVExZX09GRjogCisgIAlpZiAoZmF0YWxGbGFnKQl7CisJICBpZiAoKG91dGZpbGVfZmQgPSBmb3BlbiAoZmlsZXBhdGgsICJhKyIpKSAhPSBOVUxMKQkgIHsKKwkgICAgZndyaXRlIChvdXR0ZXh0LCBzaXplb2YgKGNoYXIpLCBzdHJsZW4gKG91dHRleHQpLCBvdXRmaWxlX2ZkKTsKKwkgICAgZmNsb3NlIChvdXRmaWxlX2ZkKTsKKwkgIH0KKwl9CisgIAlicmVhazsKKyAgY2FzZSBERUJVR19TQ1JFRU5fT05MWTogCisgIAlwcmludGYgKCIlcyIsIG91dHRleHQpOworICAJYnJlYWs7CisgIGNhc2UgREVCVUdfRklMRV9PTkxZOiAKKwlpZiAoKG91dGZpbGVfZmQgPSBmb3BlbiAoZmlsZXBhdGgsICJhKyIpKSAhPSBOVUxMKQl7CisJICBmd3JpdGUgKG91dHRleHQsIHNpemVvZiAoY2hhciksIHN0cmxlbiAob3V0dGV4dCksIG91dGZpbGVfZmQpOworCSAgZmNsb3NlIChvdXRmaWxlX2ZkKTsKKwl9CisgIAlicmVhazsKKyAgY2FzZSBERUJVR19TQ1JFRU5fQU5EX0ZJTEU6IC8vIEJPVEgKKyAgCXByaW50ZiAoIiVzIiwgb3V0dGV4dCk7CisJaWYgKChvdXRmaWxlX2ZkID0gZm9wZW4gKGZpbGVwYXRoLCAiYSsiKSkgIT0gTlVMTCkJeworCSAgZndyaXRlIChvdXR0ZXh0LCBzaXplb2YgKGNoYXIpLCBzdHJsZW4gKG91dHRleHQpLCBvdXRmaWxlX2ZkKTsKKwkgIGZjbG9zZSAob3V0ZmlsZV9mZCk7CisJfQorICAJYnJlYWs7CisgIH0KK30KKworLyoqCisgKiBAYnJpZWYgTm9ybWFsaXplcyBhIHZhbHVlIGluIGEgcmFuZ2UsIHVzZWQgZm9yIGRyaXZlIGlucHV0CisgKiBAcGFyYW0gcG9zaXRpb24gVGhlIHBvc2l0aW9uIGluIHRoZSByYW5nZSwgc3RhcnRpbmcgYXQgMAorICogQHBhcmFtIHJhbmdlIFRoZSBzaXplIG9mIHRoZSByYW5nZSB0aGF0IHBvc2l0aW9uIGlzIGluCisgKiBAcmV0dXJuIFRoZSBub3JtYWxpemVkIHBvc2l0aW9uIGZyb20gLTEgdG8gKzEKKyAqLworZG91YmxlIFJhbmdlVG9Ob3JtYWxpemVkKGRvdWJsZSBwb3NpdGlvbiwgaW50IHJhbmdlKXsKKwlyZXR1cm4oKChwb3NpdGlvbioyLjApLyhkb3VibGUpcmFuZ2UpLTEuMCk7Cit9CisKKy8qKgorICogQGJyaWVmIENvbnZlcnQgYSBub3JtYWxpemVkIHZhbHVlIHRvIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGluIGEgcmFuZ2UuCisgKiBUaGlzIGlzIHVzZWQgdG8gY29udmVydCBub3JtYWxpemVkIHZhbHVlcyB0byB0aGUgc2Vydm8gY29tbWFuZCByYW5nZS4KKyAqIEBwYXJhbSBub3JtYWxpemVkVmFsdWUgVGhlIG5vcm1hbGl6ZWQgdmFsdWUgKGluIHRoZSAtMSB0byArMSByYW5nZSkKKyAqIEBwYXJhbSBtaW5SYW5nZSBUaGUgbWluaW11bSBvZiB0aGUgcmFuZ2UgKDAgaXMgZGVmYXVsdCkKKyAqIEBwYXJhbSBtYXhSYW5nZSBUaGUgbWF4aW11bSBvZiB0aGUgcmFuZ2UgKDEgaXMgZGVmYXVsdCkKKyAqIEByZXR1cm4gVGhlIHZhbHVlIGluIHRoZSByYW5nZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnB1dCBub3JtYWxpemVkIHZhbHVlCisgKi8KK2Zsb2F0IE5vcm1hbGl6ZVRvUmFuZ2UoZmxvYXQgbm9ybWFsaXplZFZhbHVlLCBmbG9hdCBtaW5SYW5nZSwgZmxvYXQgbWF4UmFuZ2UpIHsKKwlmbG9hdCByYW5nZSA9IG1heFJhbmdlLW1pblJhbmdlOworCWZsb2F0IHRlbXAgPSAoZmxvYXQpKChub3JtYWxpemVkVmFsdWUgLyAyLjApKyAwLjUpKnJhbmdlOworCXJldHVybiAodGVtcCArIG1pblJhbmdlKTsKK30JCitmbG9hdCBOb3JtYWxpemVUb1JhbmdlKGZsb2F0IG5vcm1hbGl6ZWRWYWx1ZSkgeworCXJldHVybiAoZmxvYXQpKChub3JtYWxpemVkVmFsdWUgLyAyLjApICsgMC41KTsKK30JCisKKy8qKgorICogQGJyaWVmIERpc3BsYXlzIGFuIGFjdGl2aXR5IGluZGljYXRvciB0byBjb25zb2xlLiAKKyAqIENhbGwgdGhpcyBmdW5jdGlvbiBsaWtlIHlvdSB3b3VsZCBjYWxsIHByaW50Zi4KKyAqIEBwYXJhbSBmbXQgVGhlIGZvcm1hdCBzdHJpbmcKKyovCit2b2lkIFNob3dBY3Rpdml0eSAoY2hhciAqZm10LCAuLi4pCit7CisgIHN0YXRpYyBjaGFyICAgYWN0aXZpdHlfaW5kaWNhdGlvbl9zdHJpbmdbXSA9ICJ8Ly1cXCI7CisgIHN0YXRpYyBpbnQgICAgYWkgPSAzOworICB2YV9saXN0ICAgICAgIGFyZ3M7CisgIGNoYXIgICAgICAgICAgdGV4dFsxMDI0XTsKKworICB2YV9zdGFydCAoYXJncywgZm10KTsKKworICB2c3ByaW50ZiAodGV4dCwgZm10LCBhcmdzKTsKKworICBhaSA9IGFpID09IDMgPyAwIDogYWkgKyAxOworCisgIHByaW50ZiAoIiVjICVzIFxyIiwgYWN0aXZpdHlfaW5kaWNhdGlvbl9zdHJpbmdbYWldLCB0ZXh0KTsKKyAgZmZsdXNoIChzdGRvdXQpOworCisgIHZhX2VuZCAoYXJncyk7Cit9CisKKyNkZWZpbmUgUEkgMy4xNDE1OTI2NTM1ODk3OQorLyoqCisgKiBAYnJpZWYgQ2FsY3VsYXRlIHNpbmUgd2F2ZSBpbmNyZW1lbnRzICgtMS4wIHRvIDEuMCkuIAorICogVGhlIGZpcnN0IHRpbWUgdGhpcyBpcyBjYWxsZWQsIGl0IHNldHMgdXAgdGhlIHRpbWUgaW5jcmVtZW50LiBTdWJzZXF1ZW50IGNhbGxzCisgKiB3aWxsIGdpdmUgdmFsdWVzIGFsb25nIHRoZSBzaW5lIHdhdmUgZGVwZW5kaW5nIG9uIGN1cnJlbnQgdGltZS4gSWYgdGhlIHdhdmUgaXMKKyAqIHN0b3BwZWQgYW5kIHJlc3RhcnRlZCwgaXQgbXVzdCBiZSByZWluaXRpYWxpemVkIHdpdGggYSBuZXcgImZpcnN0IGNhbGwiLgorICogCisgKiBAcGFyYW0gcGVyaW9kIGxlbmd0aCBvZiB0aW1lIHRvIGNvbXBsZXRlIGEgY29tcGxldGUgd2F2ZQorICogQHBhcmFtIHNpblN0YXJ0IFdoZXJlIHRvIHN0YXJ0IHRoZSBzaW5lIHdhdmUgKDAuMCA9IDIgcGksIHBpLzIgPSAxLjAsIGV0Yy4pCisgKi8KK2RvdWJsZSBTaW5Qb3NpdGlvbiAoZG91YmxlICpwZXJpb2QsIGRvdWJsZSBzaW5TdGFydCkKK3sKKyAgZG91YmxlIHJ0blZhbDsKKyAgc3RhdGljIGRvdWJsZSBzaW5lUGVyaW9kPTAuMDsKKyAgc3RhdGljIGRvdWJsZSB0aW1lc3RhbXA7CisgIGRvdWJsZSBzaW5Bcmc7CisKKyAgLy8xc3QgY2FsbAorICBpZiAocGVyaW9kICE9IE5VTEwpIHsKKyAgICBzaW5lUGVyaW9kID0gKnBlcmlvZDsKKwl0aW1lc3RhbXAgPSBHZXRUaW1lKCk7CisJcmV0dXJuIDAuMDsKKyAgfQorCisgIC8vTXVsdGlwbHlpbmcgYnkgMipwaSB0byB0aGUgdGltZSBkaWZmZXJlbmNlIG1ha2VzIHNpbmVQZXJpb2Qgd29yayBpZiBpdCdzIG1lYXN1cmVkIGluIHNlY29uZHMuCisgIC8vQWRkaW5nIHNpblN0YXJ0IHRvIHRoZSBwYXJ0IG11bHRpcGxpZWQgYnkgUEksIGJ1dCBub3QgYnkgMiwgYWxsb3dzIGl0IHRvIHdvcmsgYXMgZGVzY3JpYmVkIGluIHRoZSBjb21tZW50cy4KKyAgc2luQXJnID0gUEkgKigoMi4wICogKEdldFRpbWUoKSAtIHRpbWVzdGFtcCkpICsgc2luU3RhcnQpIC8gc2luZVBlcmlvZDsKKyAgcnRuVmFsID0gc2luIChzaW5BcmcpOyAgCisgIHJldHVybiAocnRuVmFsKTsKK30KKworCisvKioKKyAqIEBicmllZiBGaW5kIHRoZSBlbGFwc2VkIHRpbWUgc2luY2UgYSBzcGVjaWZpZWQgdGltZS4KKyAqIEBwYXJhbSBzdGFydFRpbWUgVGhlIHN0YXJ0aW5nIHRpbWUKKyAqIEByZXR1cm4gSG93IGxvbmcgaXQgaGFzIGJlZW4gc2luY2UgdGhlIHN0YXJ0aW5nIHRpbWUKKyAqLworZG91YmxlIEVsYXBzZWRUaW1lICggZG91YmxlIHN0YXJ0VGltZSApICAKK3sKKwlkb3VibGUgcmVhbFRpbWUgPSBHZXRUaW1lKCk7CQorCXJldHVybiAocmVhbFRpbWUtc3RhcnRUaW1lKTsKK30KKworLyoqCisgKiBAYnJpZWYgSW5pdGlhbGl6ZSBwYW4gcGFyYW1ldGVycworICogQHBhcmFtIHBlcmlvZCBUaGUgbnVtYmVyIG9mIHNlY29uZHMgdG8gY29tcGxldGUgb25lIHBhbgorICovCit2b2lkIHBhbkluaXQoKQl7CisJZG91YmxlIHBlcmlvZCA9IDMuMDsgIAkvLyBudW1iZXIgb2Ygc2Vjb25kcyBmb3Igb25lIGNvbXBsZXRlIHBhbgorCVNpblBvc2l0aW9uKCZwZXJpb2QsIDAuMCk7CS8vIGluaXRpYWwgY2FsbCB0byBzZXQgdXAgdGltZQorfQorCit2b2lkIHBhbkluaXQoZG91YmxlIHBlcmlvZCkJeworCWlmIChwZXJpb2QgPCAwLjApIHBlcmlvZD0zLjA7CisJU2luUG9zaXRpb24oJnBlcmlvZCwgMC4wKTsJLy8gaW5pdGlhbCBjYWxsIHRvIHNldCB1cCB0aW1lCit9CisKKy8qKgorICogQGJyaWVmIE1vdmUgdGhlIGhvcml6b250YWwgc2Vydm8gYmFjayBhbmQgZm9ydGguCisgKiBAcGFyYW0gcGFuU2Vydm8gVGhlIHNlcnZvIG9iamVjdCB0byBtb3ZlCisgKiBAcGFyYW0gc2luU3RhcnQgVGhlIHBvc2l0aW9uIG9uIHRoZSBzaW5lIHdhdmUgdG8gYmVnaW4gdGhlIHBhbgorICovCit2b2lkIHBhbkZvclRhcmdldChTZXJ2byAqcGFuU2Vydm8pCXsgcGFuRm9yVGFyZ2V0KHBhblNlcnZvLCAwLjApOyB9CisKK3ZvaWQgcGFuRm9yVGFyZ2V0KFNlcnZvICpwYW5TZXJ2bywgZG91YmxlIHNpblN0YXJ0KQl7CisJZmxvYXQgbm9ybWFsaXplZFNpblBvc2l0aW9uID0gKGZsb2F0KVNpblBvc2l0aW9uKE5VTEwsIHNpblN0YXJ0KTsKKwlmbG9hdCBuZXdTZXJ2b1Bvc2l0aW9uID0gTm9ybWFsaXplVG9SYW5nZShub3JtYWxpemVkU2luUG9zaXRpb24pOworCXBhblNlcnZvLT5TZXQoIG5ld1NlcnZvUG9zaXRpb24gKTsKKwkvL1Nob3dBY3Rpdml0eSAoInBhbiB4OiBub3JtYWxpemVkICVmIG5ld1NlcnZvUG9zaXRpb24gPSAlZiIgLCAKKwkvLwkJbm9ybWFsaXplZFNpblBvc2l0aW9uLCBuZXdTZXJ2b1Bvc2l0aW9uICk7Cit9CisKKworLyoqIEBicmllZiBSZWFkIGEgZmlsZSBhbmQgcmV0dXJuIG5vbi1jb21tZW50IG91dHB1dCBzdHJpbmcgCisKK0NhbGwgdGhlIGZpcnN0IHRpbWUgd2l0aCAwIGxpbmVOdW1iZXIgdG8gZ2V0IHRoZSBudW1iZXIgb2YgbGluZXMgdG8gcmVhZAorVGhlbiBjYWxsIHdpdGggZWFjaCBsaW5lTnVtYmVyIHRvIGdldCBvbmUgY2FtZXJhIHBhcmFtZXRlci4gVGhlcmUgc2hvdWxkCitiZSBvbmUgcHJvcGVydHk9dmFsdWUgZW50cnkgb24gZWFjaCBsaW5lLCBpLmUuICJleHBvc3VyZT1hdXRvIgorCisgKiBAcGFyYW0gaW5wdXRGaWxlIGZpbGVuYW1lIHRvIHJlYWQKKyAqIEBwYXJhbSBvdXRwdXRTdHJpbmcgb25lIHN0cmluZworICogQHBhcmFtIGxpbmVOdW1iZXIgaWYgMCwgcmV0dXJuIG51bWJlciBvZiBsaW5lczsgZWxzZSByZXR1cm4gdGhhdCBsaW5lIG51bWJlcgorICogQHJldHVybiBpbnQgbnVtYmVyIG9mIGxpbmVzIG9yIC0xIGlmIGVycm9yCisgKiovCitpbnQgcHJvY2Vzc0ZpbGUoY2hhciAqaW5wdXRGaWxlLCBjaGFyICpvdXRwdXRTdHJpbmcsIGludCBsaW5lTnVtYmVyKQoreworCUZJTEUgKmluZmlsZTsKKwlpbnQgc3RyaW5nU2l6ZSA9IDgwOwkJLy8gbWF4IHNpemUgb2Ygb25lIGxpbmUgaW4gZmlsZSAKKwljaGFyIGlucHV0U3RyW3N0cmluZ1NpemVdOworCWludCBsaW5lQ291bnQ9MDsKKwkgIAorCWlmIChsaW5lTnVtYmVyIDwgMCkKKwkJICByZXR1cm4gKC0xKTsKKworCWlmICgoaW5maWxlID0gZm9wZW4gKGlucHV0RmlsZSwgInIiKSkgPT0gTlVMTCkgeworCSAgICBwcmludGYgKCJGYXRhbCBlcnJvciBvcGVuaW5nIGZpbGUgJXNcbiIsaW5wdXRGaWxlKTsKKwkgICAgcmV0dXJuICgwKTsKKwl9CisKKyAgd2hpbGUgKCFmZW9mKGluZmlsZSkpIHsKKyAgICBpZiAoZmdldHMgKGlucHV0U3RyLCBzdHJpbmdTaXplLCBpbmZpbGUpICE9IE5VTEwpIHsKKyAgICAgIC8vIFNraXAgZW1wdHkgbGluZXMKKyAgICAgIGlmIChlbXB0eVN0cmluZyhpbnB1dFN0cikpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gU2tpcCBjb21tZW50IGxpbmVzCisgICAgICBpZiAoaW5wdXRTdHJbMF0gPT0gJyMnIHx8IGlucHV0U3RyWzBdID09ICchJykKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIGxpbmVDb3VudCsrOworICAgICAgaWYgKGxpbmVOdW1iZXIgPT0gMCkKKyAgICAgICAgY29udGludWU7CisgICAgICBlbHNlCisgICAgICB7CisgICAgCSAgaWYgKGxpbmVDb3VudCA9PSBsaW5lTnVtYmVyKQorICAgIAkJICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBjbG9zZSBmaWxlIAorICBmY2xvc2UgKGluZmlsZSk7CisgIC8vIGlmIG51bWJlciBsaW5lcyByZXF1ZXN0ZWQgcmV0dXJuIHRoZSBjb3VudAorICBpZiAobGluZU51bWJlciA9PSAwKQorCSAgcmV0dXJuIChsaW5lQ291bnQpOworICAvLyBjaGVjayBmb3IgaW5wdXQgb3V0IG9mIHJhbmdlCisgIGlmIChsaW5lTnVtYmVyID4gbGluZUNvdW50KQorCSAgcmV0dXJuICgtMSk7CisgIC8vIHJldHVybiB0aGUgbGluZSBzZWxlY3RlZAorICBpZiAobGluZUNvdW50KSB7CisgICAgc3RyaXBTdHJpbmcoaW5wdXRTdHIpOworICAgIHN0cmNweShvdXRwdXRTdHJpbmcsIGlucHV0U3RyKTsKKyAgICByZXR1cm4obGluZUNvdW50KTsKKyAgfSAKKyAgZWxzZSB7CisgICAgcmV0dXJuKC0xKTsKKyAgfQorfQorCisvKiogSWdub3JlIGVtcHR5IHN0cmluZyAKKyAqIEBwYXJhbSBzdHJpbmcgdG8gY2hlY2sgaWYgZW1wdHkKKyAqKi8KK2ludCBlbXB0eVN0cmluZyhjaGFyICpzdHJpbmcpCit7CisgIGludCBpLGxlbjsKKworICBpZihzdHJpbmcgPT0gTlVMTCkKKyAgICByZXR1cm4oMSk7CisKKyAgbGVuID0gc3RybGVuKHN0cmluZyk7CisgIGZvcihpPTA7IGk8bGVuOyBpKyspIHsKKyAgICAvLyBJZ25vcmUgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzCisgICAgaWYgKHN0cmluZ1tpXSA9PSAnXG4nIHx8IHN0cmluZ1tpXSA9PSAnXHInIHx8CisgICAgICAgIHN0cmluZ1tpXSA9PSAnXHQnIHx8IHN0cmluZ1tpXSA9PSAnICcpCisgICAgICBjb250aW51ZTsKKyAgICByZXR1cm4oMCk7CisgIH0KKyAgcmV0dXJuKDEpOworfQorCisvKiogUmVtb3ZlIHNwZWNpYWwgY2hhcmFjdGVycyBmcm9tIHN0cmluZyAKKyAqIEBwYXJhbSBzdHJpbmcgdG8gcHJvY2VzcworICoqLwordm9pZCBzdHJpcFN0cmluZyhjaGFyICpzdHJpbmcpCit7CisgIGludCBpLGosbGVuOworCisgIGlmKHN0cmluZyA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBsZW4gPSBzdHJsZW4oc3RyaW5nKTsKKyAgZm9yKGk9MCxqPTA7IGk8bGVuOyBpKyspIHsKKyAgICAvLyBSZW1vdmUgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzIGZyb20gdGhlIHN0cmluZworICAgIGlmIChzdHJpbmdbaV0gPT0gJ1xuJyB8fCBzdHJpbmdbaV0gPT0gJ1xyJyB8fCBzdHJpbmdbaV0gPT0gJ1wiJykKKyAgICAgIGNvbnRpbnVlOworICAgIC8vIENvcHkgYW55dGhpbmcgZWxzZQorICAgIHN0cmluZ1tqKytdID0gc3RyaW5nW2ldOworICB9CisgIHN0cmluZ1tqXSA9ICdcMCc7IAorfQorCisKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvVmlzaW9uL0JpbmFyeUltYWdlLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvVmlzaW9uL0JpbmFyeUltYWdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmIwY2VkCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9WaXNpb24vQmluYXJ5SW1hZ2UuY3BwCkBAIC0wLDAgKzEsMjIyIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE0LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJWaXNpb24vQmluYXJ5SW1hZ2UuaCIKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKyNpbmNsdWRlIDxjc3RyaW5nPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCisKK0JpbmFyeUltYWdlOjpCaW5hcnlJbWFnZSgpIDogTW9ub0ltYWdlKCkKK3sKK30KKworQmluYXJ5SW1hZ2U6On5CaW5hcnlJbWFnZSgpCit7Cit9CisKKy8qKgorICogR2V0IHRoZW4gbnVtYmVyIG9mIHBhcnRpY2xlcyBmb3IgdGhlIGltYWdlLgorICogQHJldHVybnMgdGhlIG51bWJlciBvZiBwYXJ0aWNsZXMgZm91bmQgZm9yIHRoZSBpbWFnZS4KKyAqLworaW50IEJpbmFyeUltYWdlOjpHZXROdW1iZXJQYXJ0aWNsZXMoKQoreworCWludCBudW1QYXJ0aWNsZXMgPSAwOworCWludCBzdWNjZXNzID0gaW1hcUNvdW50UGFydGljbGVzKG1faW1hcUltYWdlLCAxLCAmbnVtUGFydGljbGVzKTsKKwl3cGlfc2V0SW1hcUVycm9yV2l0aENvbnRleHQoc3VjY2VzcywgIkVycm9yIGNvdW50aW5nIHBhcnRpY2xlcyIpOworCXJldHVybiBudW1QYXJ0aWNsZXM7Cit9CisKKy8qKgorICogR2V0IGEgc2luZ2xlIHBhcnRpY2xlIGFuYWx5c2lzIHJlcG9ydC4KKyAqIEdldCBvbmUgKG9mIHBvc3NpYmx5IG1hbnkpIHBhcnRpY2xlIGFuYWx5c2lzIHJlcG9ydHMgZm9yIGFuIGltYWdlLgorICogQHBhcmFtIHBhcnRpY2xlTnVtYmVyIFdoaWNoIHBhcnRpY2xlIGFuYWx5c2lzIHJlcG9ydCB0byByZXR1cm4uCisgKiBAcmV0dXJucyB0aGUgc2VsZWN0ZWQgcGFydGljbGUgYW5hbHlzaXMgcmVwb3J0CisgKi8KK1BhcnRpY2xlQW5hbHlzaXNSZXBvcnQgQmluYXJ5SW1hZ2U6OkdldFBhcnRpY2xlQW5hbHlzaXNSZXBvcnQoaW50IHBhcnRpY2xlTnVtYmVyKQoreworCVBhcnRpY2xlQW5hbHlzaXNSZXBvcnQgcGFyOworCUdldFBhcnRpY2xlQW5hbHlzaXNSZXBvcnQocGFydGljbGVOdW1iZXIsICZwYXIpOworCXJldHVybiBwYXI7Cit9CisKKy8qKgorICogR2V0IGEgc2luZ2xlIHBhcnRpY2xlIGFuYWx5c2lzIHJlcG9ydC4KKyAqIEdldCBvbmUgKG9mIHBvc3NpYmx5IG1hbnkpIHBhcnRpY2xlIGFuYWx5c2lzIHJlcG9ydHMgZm9yIGFuIGltYWdlLgorICogVGhpcyB2ZXJzaW9uIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50IHdoZW4gY29weWluZyBtYW55IHJlcG9ydHMuCisgKiBAcGFyYW0gcGFydGljbGVOdW1iZXIgV2hpY2ggcGFydGljbGUgYW5hbHlzaXMgcmVwb3J0IHRvIHJldHVybi4KKyAqIEBwYXJhbSBwYXIgdGhlIHNlbGVjdGVkIHBhcnRpY2xlIGFuYWx5c2lzIHJlcG9ydAorICovCit2b2lkIEJpbmFyeUltYWdlOjpHZXRQYXJ0aWNsZUFuYWx5c2lzUmVwb3J0KGludCBwYXJ0aWNsZU51bWJlciwgUGFydGljbGVBbmFseXNpc1JlcG9ydCAqcGFyKQoreworCWludCBzdWNjZXNzOworCWludCBudW1QYXJ0aWNsZXMgPSAwOworCisJc3VjY2VzcyA9IGltYXFHZXRJbWFnZVNpemUobV9pbWFxSW1hZ2UsICZwYXItPmltYWdlV2lkdGgsICZwYXItPmltYWdlSGVpZ2h0KTsKKwl3cGlfc2V0SW1hcUVycm9yV2l0aENvbnRleHQoc3VjY2VzcywgIkVycm9yIGdldHRpbmcgaW1hZ2Ugc2l6ZSIpOworCWlmIChTdGF0dXNJc0ZhdGFsKCkpCisJCXJldHVybjsKKworCXN1Y2Nlc3MgPSBpbWFxQ291bnRQYXJ0aWNsZXMobV9pbWFxSW1hZ2UsIDEsICZudW1QYXJ0aWNsZXMpOworCXdwaV9zZXRJbWFxRXJyb3JXaXRoQ29udGV4dChzdWNjZXNzLCAiRXJyb3IgY291bnRpbmcgcGFydGljbGVzIik7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkKKwkJcmV0dXJuOworCisJaWYgKHBhcnRpY2xlTnVtYmVyID49IG51bVBhcnRpY2xlcykKKwl7CisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFBhcmFtZXRlck91dE9mUmFuZ2UsICJwYXJ0aWNsZU51bWJlciIpOworCQlyZXR1cm47CisJfQorCisJcGFyLT5wYXJ0aWNsZUluZGV4ID0gcGFydGljbGVOdW1iZXI7CisJLy8gRG9uJ3QgYm90aGVyIG1lYXN1cmluZyB0aGUgcmVzdCBvZiB0aGUgcGFydGljbGUgaWYgb25lIGZhaWxzCisJYm9vbCBnb29kID0gUGFydGljbGVNZWFzdXJlbWVudChwYXJ0aWNsZU51bWJlciwgSU1BUV9NVF9DRU5URVJfT0ZfTUFTU19YLCAmcGFyLT5jZW50ZXJfbWFzc194KTsKKwlnb29kID0gZ29vZCAmJiBQYXJ0aWNsZU1lYXN1cmVtZW50KHBhcnRpY2xlTnVtYmVyLCBJTUFRX01UX0NFTlRFUl9PRl9NQVNTX1ksICZwYXItPmNlbnRlcl9tYXNzX3kpOworCWdvb2QgPSBnb29kICYmIFBhcnRpY2xlTWVhc3VyZW1lbnQocGFydGljbGVOdW1iZXIsIElNQVFfTVRfQVJFQSwgJnBhci0+cGFydGljbGVBcmVhKTsKKwlnb29kID0gZ29vZCAmJiBQYXJ0aWNsZU1lYXN1cmVtZW50KHBhcnRpY2xlTnVtYmVyLCBJTUFRX01UX0JPVU5ESU5HX1JFQ1RfVE9QLCAmcGFyLT5ib3VuZGluZ1JlY3QudG9wKTsKKwlnb29kID0gZ29vZCAmJiBQYXJ0aWNsZU1lYXN1cmVtZW50KHBhcnRpY2xlTnVtYmVyLCBJTUFRX01UX0JPVU5ESU5HX1JFQ1RfTEVGVCwgJnBhci0+Ym91bmRpbmdSZWN0LmxlZnQpOworCWdvb2QgPSBnb29kICYmIFBhcnRpY2xlTWVhc3VyZW1lbnQocGFydGljbGVOdW1iZXIsIElNQVFfTVRfQk9VTkRJTkdfUkVDVF9IRUlHSFQsICZwYXItPmJvdW5kaW5nUmVjdC5oZWlnaHQpOworCWdvb2QgPSBnb29kICYmIFBhcnRpY2xlTWVhc3VyZW1lbnQocGFydGljbGVOdW1iZXIsIElNQVFfTVRfQk9VTkRJTkdfUkVDVF9XSURUSCwgJnBhci0+Ym91bmRpbmdSZWN0LndpZHRoKTsKKwlnb29kID0gZ29vZCAmJiBQYXJ0aWNsZU1lYXN1cmVtZW50KHBhcnRpY2xlTnVtYmVyLCBJTUFRX01UX0FSRUFfQllfSU1BR0VfQVJFQSwgJnBhci0+cGFydGljbGVUb0ltYWdlUGVyY2VudCk7CisJZ29vZCA9IGdvb2QgJiYgUGFydGljbGVNZWFzdXJlbWVudChwYXJ0aWNsZU51bWJlciwgSU1BUV9NVF9BUkVBX0JZX1BBUlRJQ0xFX0FORF9IT0xFU19BUkVBLCAmcGFyLT5wYXJ0aWNsZVF1YWxpdHkpOworCisJaWYgKGdvb2QpCisJeworCQkvKiBub3JtYWxpemVkIHBvc2l0aW9uICgtMSB0byAxKSAqLworCQlwYXItPmNlbnRlcl9tYXNzX3hfbm9ybWFsaXplZCA9IE5vcm1hbGl6ZUZyb21SYW5nZShwYXItPmNlbnRlcl9tYXNzX3gsIHBhci0+aW1hZ2VXaWR0aCk7CisJCXBhci0+Y2VudGVyX21hc3NfeV9ub3JtYWxpemVkID0gTm9ybWFsaXplRnJvbVJhbmdlKHBhci0+Y2VudGVyX21hc3NfeSwgcGFyLT5pbWFnZUhlaWdodCk7CisJfQorfQorCisKKy8qKgorICogR2V0IGFuIG9yZGVyZWQgdmVjdG9yIG9mIHBhcnRpY2xlcyBmb3IgdGhlIGltYWdlLgorICogQ3JlYXRlIGEgdmVjdG9yIG9mIHBhcnRpY2xlIGFuYWx5c2lzIHJlcG9ydHMgc29ydGVkIGJ5IHNpemUgZm9yIGFuIGltYWdlLgorICogVGhlIHZlY3RvciBjb250YWlucyB0aGUgYWN0dWFsIHJlcG9ydCBzdHJ1Y3R1cmVzLgorICogQHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSB2ZWN0b3Igb2YgcGFydGljbGUgYW5hbHlzaXMgcmVwb3J0cy4gVGhlIGNhbGxlciBtdXN0IGRlbGV0ZSB0aGUKKyAqIHZlY3RvciB3aGVuIGZpbmlzaGVkIHVzaW5nIGl0LgorICovCit2ZWN0b3I8UGFydGljbGVBbmFseXNpc1JlcG9ydD4qIEJpbmFyeUltYWdlOjpHZXRPcmRlcmVkUGFydGljbGVBbmFseXNpc1JlcG9ydHMoKQoreworCXZlY3RvcjxQYXJ0aWNsZUFuYWx5c2lzUmVwb3J0PiogcGFydGljbGVzID0gbmV3IHZlY3RvcjxQYXJ0aWNsZUFuYWx5c2lzUmVwb3J0PjsKKwlpbnQgcGFydGljbGVDb3VudCA9IEdldE51bWJlclBhcnRpY2xlcygpOworCWZvcihpbnQgcGFydGljbGVJbmRleCA9IDA7IHBhcnRpY2xlSW5kZXggPCBwYXJ0aWNsZUNvdW50OyBwYXJ0aWNsZUluZGV4KyspCisJeworCQlwYXJ0aWNsZXMtPnB1c2hfYmFjayhHZXRQYXJ0aWNsZUFuYWx5c2lzUmVwb3J0KHBhcnRpY2xlSW5kZXgpKTsKKwl9CisJLy8gVE9ETzogVGhpcyBpcyBwcmV0dHkgaW5lZmZpY2llbnQgc2luY2UgZWFjaCBjb21wYXJlIGluIHRoZSBzb3J0IGNvcGllcworCS8vICAgYm90aCByZXBvcnRzIGJlaW5nIGNvbXBhcmVkLi4uIGRvIGl0IG1hbnVhbGx5IGluc3RlYWQuLi4gd2hpbGUgd2UncmUKKwkvLyAgIGF0IGl0LCB3ZSBzaG91bGQgcHJvdmlkZSBhIHZlcnNpb24gdGhhdCBhbGxvd3MgYSBwcmVhbGxvY2F0ZWQgYnVmZmVyIG9mCisJLy8gICBQYXJ0aWNsZUFuYWx5c2lzUmVwb3J0IHN0cnVjdHVyZXMKKwlzb3J0KHBhcnRpY2xlcy0+YmVnaW4oKSwgcGFydGljbGVzLT5lbmQoKSwgQ29tcGFyZVBhcnRpY2xlU2l6ZXMpOworCXJldHVybiBwYXJ0aWNsZXM7Cit9CisKKy8qKgorICogV3JpdGUgYSBiaW5hcnkgaW1hZ2UgdG8gZmxhc2guCisgKiBXcml0ZXMgdGhlIGJpbmFyeSBpbWFnZSB0byBmbGFzaCBvbiB0aGUgY1JJTyBmb3IgbGF0ZXIgaW5zcGVjdGlvbi4KKyAqIEBwYXJhbSBmaWxlTmFtZSB0aGUgbmFtZSBvZiB0aGUgaW1hZ2UgZmlsZSB3cml0dGVuIHRvIHRoZSBmbGFzaC4KKyAqLwordm9pZCBCaW5hcnlJbWFnZTo6V3JpdGUoY29uc3QgY2hhciAqZmlsZU5hbWUpCit7CisJUkdCVmFsdWUgY29sb3JUYWJsZVsyNTZdOworCW1lbXNldChjb2xvclRhYmxlLCAwLCBzaXplb2YoY29sb3JUYWJsZSkpOworCWNvbG9yVGFibGVbMF0uUiA9IDA7CisJY29sb3JUYWJsZVsxXS5SID0gMjU1OworCWNvbG9yVGFibGVbMF0uRyA9IGNvbG9yVGFibGVbMV0uRyA9IDA7CisJY29sb3JUYWJsZVswXS5CID0gY29sb3JUYWJsZVsxXS5CID0gMDsKKwljb2xvclRhYmxlWzBdLmFscGhhID0gY29sb3JUYWJsZVsxXS5hbHBoYSA9IDA7CisJaW1hcVdyaXRlRmlsZShtX2ltYXFJbWFnZSwgZmlsZU5hbWUsIGNvbG9yVGFibGUpOworfQorCisvKioKKyAqIE1lYXN1cmUgYSBzaW5nbGUgcGFyYW1ldGVyIGZvciBhbiBpbWFnZS4KKyAqIEdldCB0aGUgbWVhc3VyZW1lbnQgZm9yIGEgc2luZ2xlIHBhcmFtZXRlciBhYm91dCBhbiBpbWFnZSBieSBjYWxsaW5nIHRoZSBpbWFxTWVhc3VyZVBhcnRpY2xlCisgKiBmdW5jdGlvbiBmb3IgdGhlIHNlbGVjdGVkIHBhcmFtZXRlci4KKyAqIEBwYXJhbSBwYXJ0aWNsZU51bWJlciB3aGljaCBwYXJ0aWNsZSBpbiB0aGUgc2V0IG9mIHBhcnRpY2xlcworICogQHBhcmFtIHdoYXRUb01lYXN1cmUgdGhlIGltYXEgTWVhc3VyZW1lbnRUeXBlICh3aGF0IHRvIG1lYXN1cmUpCisgKiBAcGFyYW0gcmVzdWx0IHRoZSB2YWx1ZSBvZiB0aGUgbWVhc3VyZW1lbnQKKyAqIEByZXR1cm5zIGZhbHNlIG9uIGZhaWx1cmUsIHRydWUgb24gc3VjY2VzcworICovCitib29sIEJpbmFyeUltYWdlOjpQYXJ0aWNsZU1lYXN1cmVtZW50KGludCBwYXJ0aWNsZU51bWJlciwgTWVhc3VyZW1lbnRUeXBlIHdoYXRUb01lYXN1cmUsIGludCAqcmVzdWx0KQoreworCWRvdWJsZSByZXN1bHREb3VibGU7CisJYm9vbCBzdWNjZXNzID0gUGFydGljbGVNZWFzdXJlbWVudChwYXJ0aWNsZU51bWJlciwgd2hhdFRvTWVhc3VyZSwgJnJlc3VsdERvdWJsZSk7CisJKnJlc3VsdCA9IChpbnQpcmVzdWx0RG91YmxlOworCXJldHVybiBzdWNjZXNzOworfQorCisvKioKKyAqIE1lYXN1cmUgYSBzaW5nbGUgcGFyYW1ldGVyIGZvciBhbiBpbWFnZS4KKyAqIEdldCB0aGUgbWVhc3VyZW1lbnQgZm9yIGEgc2luZ2xlIHBhcmFtZXRlciBhYm91dCBhbiBpbWFnZSBieSBjYWxsaW5nIHRoZSBpbWFxTWVhc3VyZVBhcnRpY2xlCisgKiBmdW5jdGlvbiBmb3IgdGhlIHNlbGVjdGVkIHBhcmFtZXRlci4KKyAqIEBwYXJhbSBwYXJ0aWNsZU51bWJlciB3aGljaCBwYXJ0aWNsZSBpbiB0aGUgc2V0IG9mIHBhcnRpY2xlcworICogQHBhcmFtIHdoYXRUb01lYXN1cmUgdGhlIGltYXEgTWVhc3VyZW1lbnRUeXBlICh3aGF0IHRvIG1lYXN1cmUpCisgKiBAcGFyYW0gcmVzdWx0IHRoZSB2YWx1ZSBvZiB0aGUgbWVhc3VyZW1lbnQKKyAqIEByZXR1cm5zIHRydWUgb24gZmFpbHVyZSwgZmFsc2Ugb24gc3VjY2VzcworICovCitib29sIEJpbmFyeUltYWdlOjpQYXJ0aWNsZU1lYXN1cmVtZW50KGludCBwYXJ0aWNsZU51bWJlciwgTWVhc3VyZW1lbnRUeXBlIHdoYXRUb01lYXN1cmUsIGRvdWJsZSAqcmVzdWx0KQoreworCWludCBzdWNjZXNzOworCXN1Y2Nlc3MgPSBpbWFxTWVhc3VyZVBhcnRpY2xlKG1faW1hcUltYWdlLCBwYXJ0aWNsZU51bWJlciwgMCwgd2hhdFRvTWVhc3VyZSwgcmVzdWx0KTsKKwl3cGlfc2V0SW1hcUVycm9yV2l0aENvbnRleHQoc3VjY2VzcywgIkVycm9yIG1lYXN1cmluZyBwYXJ0aWNsZSIpOworCXJldHVybiAhU3RhdHVzSXNGYXRhbCgpOworfQorCisvL05vcm1hbGl6ZXMgdG8gWy0xLDFdCitkb3VibGUgQmluYXJ5SW1hZ2U6Ok5vcm1hbGl6ZUZyb21SYW5nZShkb3VibGUgcG9zaXRpb24sIGludCByYW5nZSkKK3sKKwlyZXR1cm4gKHBvc2l0aW9uICogMi4wIC8gKGRvdWJsZSlyYW5nZSkgLSAxLjA7Cit9CisKKy8qKgorICogVGhlIGNvbXBhcmUgaGVscGVyIGZ1bmN0aW9uIGZvciBzb3J0LgorICogVGhpcyBmdW5jdGlvbiBjb21wYXJlcyB0d28gcGFydGljbGUgYW5hbHlzaXMgcmVwb3J0cyBhcyBhIGhlbHBlciBmb3IgdGhlIHNvcnQgZnVuY3Rpb24uCisgKiBAcGFyYW0gcGFydGljbGUxIFRoZSBmaXJzdCBwYXJ0aWNsZSB0byBjb21wYXJlCisgKiBAcGFyYW0gcGFydGljbGUyIHRoZSBzZWNvbmQgcGFydGljbGUgdG8gY29tcGFyZQorICogQHJldHVybnMgdHJ1ZSBpZiBwYXJ0aWNsZTEgaXMgZ3JlYXRlciB0aGFuIHBhcnRpY2xlMgorICovCitib29sIEJpbmFyeUltYWdlOjpDb21wYXJlUGFydGljbGVTaXplcyhQYXJ0aWNsZUFuYWx5c2lzUmVwb3J0IHBhcnRpY2xlMSwgUGFydGljbGVBbmFseXNpc1JlcG9ydCBwYXJ0aWNsZTIpCit7CisJLy93ZSB3YW50IGRlc2NlbmRpbmcgc29ydCBvcmRlcgorCXJldHVybiBwYXJ0aWNsZTEucGFydGljbGVUb0ltYWdlUGVyY2VudCA+IHBhcnRpY2xlMi5wYXJ0aWNsZVRvSW1hZ2VQZXJjZW50OworfQorCitCaW5hcnlJbWFnZSAqQmluYXJ5SW1hZ2U6OlJlbW92ZVNtYWxsT2JqZWN0cyhib29sIGNvbm5lY3Rpdml0eTgsIGludCBlcm9zaW9ucykKK3sKKwlCaW5hcnlJbWFnZSAqcmVzdWx0ID0gbmV3IEJpbmFyeUltYWdlKCk7CisJaW50IHN1Y2Nlc3MgPSBpbWFxU2l6ZUZpbHRlcihyZXN1bHQtPkdldEltYXFJbWFnZSgpLCBtX2ltYXFJbWFnZSwgY29ubmVjdGl2aXR5OCwgZXJvc2lvbnMsIElNQVFfS0VFUF9MQVJHRSwgTlVMTCk7CisJd3BpX3NldEltYXFFcnJvcldpdGhDb250ZXh0KHN1Y2Nlc3MsICJFcnJvciBpbiBSZW1vdmVTbWFsbE9iamVjdHMiKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitCaW5hcnlJbWFnZSAqQmluYXJ5SW1hZ2U6OlJlbW92ZUxhcmdlT2JqZWN0cyhib29sIGNvbm5lY3Rpdml0eTgsIGludCBlcm9zaW9ucykKK3sKKwlCaW5hcnlJbWFnZSAqcmVzdWx0ID0gbmV3IEJpbmFyeUltYWdlKCk7CisJaW50IHN1Y2Nlc3MgPSBpbWFxU2l6ZUZpbHRlcihyZXN1bHQtPkdldEltYXFJbWFnZSgpLCBtX2ltYXFJbWFnZSwgY29ubmVjdGl2aXR5OCwgZXJvc2lvbnMsIElNQVFfS0VFUF9TTUFMTCwgTlVMTCk7CisJd3BpX3NldEltYXFFcnJvcldpdGhDb250ZXh0KHN1Y2Nlc3MsICJFcnJvciBpbiBSZW1vdmVMYXJnZU9iamVjdHMiKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitCaW5hcnlJbWFnZSAqQmluYXJ5SW1hZ2U6OkNvbnZleEh1bGwoYm9vbCBjb25uZWN0aXZpdHk4KQoreworCUJpbmFyeUltYWdlICpyZXN1bHQgPSBuZXcgQmluYXJ5SW1hZ2UoKTsKKwlpbnQgc3VjY2VzcyA9IGltYXFDb252ZXhIdWxsKHJlc3VsdC0+R2V0SW1hcUltYWdlKCksIG1faW1hcUltYWdlLCBjb25uZWN0aXZpdHk4KTsKKwl3cGlfc2V0SW1hcUVycm9yV2l0aENvbnRleHQoc3VjY2VzcywgIkVycm9yIGluIGNvbnZleCBodWxsIG9wZXJhdGlvbiIpOworCXJldHVybiByZXN1bHQ7Cit9CisKK0JpbmFyeUltYWdlICpCaW5hcnlJbWFnZTo6UGFydGljbGVGaWx0ZXIoUGFydGljbGVGaWx0ZXJDcml0ZXJpYTIgKmNyaXRlcmlhLCBpbnQgY3JpdGVyaWFDb3VudCkKK3sKKwlCaW5hcnlJbWFnZSAqcmVzdWx0ID0gbmV3IEJpbmFyeUltYWdlKCk7CisJaW50IG51bVBhcnRpY2xlczsKKwlQYXJ0aWNsZUZpbHRlck9wdGlvbnMyIGZpbHRlck9wdGlvbnMgPSB7MCwgMCwgMCwgMX07CisJaW50IHN1Y2Nlc3MgPSBpbWFxUGFydGljbGVGaWx0ZXI0KHJlc3VsdC0+R2V0SW1hcUltYWdlKCksIG1faW1hcUltYWdlLCBjcml0ZXJpYSwgY3JpdGVyaWFDb3VudCwgJmZpbHRlck9wdGlvbnMsIE5VTEwsICZudW1QYXJ0aWNsZXMpOworCXdwaV9zZXRJbWFxRXJyb3JXaXRoQ29udGV4dChzdWNjZXNzLCAiRXJyb3IgaW4gcGFydGljbGUgZmlsdGVyIG9wZXJhdGlvbiIpOworCXJldHVybiByZXN1bHQ7Cit9CisKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvVmlzaW9uL0NvbG9ySW1hZ2UuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9WaXNpb24vQ29sb3JJbWFnZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE3MmRhMwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvVmlzaW9uL0NvbG9ySW1hZ2UuY3BwCkBAIC0wLDAgKzEsNDY1IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE0LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIlZpc2lvbi9Db2xvckltYWdlLmgiCisKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKworQ29sb3JJbWFnZTo6Q29sb3JJbWFnZShJbWFnZVR5cGUgdHlwZSkgOiBJbWFnZUJhc2UodHlwZSkKK3sKK30KKworQ29sb3JJbWFnZTo6fkNvbG9ySW1hZ2UoKQoreworfQorCisvKioKKyAqIFBlcmZvcm0gYSB0aHJlc2hvbGQgb3BlcmF0aW9uIG9uIGEgQ29sb3JJbWFnZS4KKyAqIFBlcmZvcm0gYSB0aHJlc2hvbGQgb3BlcmF0aW9uIG9uIGEgQ29sb3JJbWFnZSB1c2luZyB0aGUgQ29sb3JNb2RlIHN1cHBsaWVkCisgKiBhcyBhIHBhcmFtZXRlci4KKyAqIEBwYXJhbSBjb2xvck1vZGUgVGhlIHR5cGUgb2YgY29sb3JzcGFjZSB0aGlzIG9wZXJhdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkIGluCisgKiBAcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBiaW5hcnkgaW1hZ2UKKyAqLworQmluYXJ5SW1hZ2UgKkNvbG9ySW1hZ2U6OkNvbXB1dGVUaHJlc2hvbGQoQ29sb3JNb2RlIGNvbG9yTW9kZSwKKwkJaW50IGxvdzEsIGludCBoaWdoMSwKKwkJaW50IGxvdzIsIGludCBoaWdoMiwKKwkJaW50IGxvdzMsIGludCBoaWdoMykKK3sKKwlCaW5hcnlJbWFnZSAqcmVzdWx0ID0gbmV3IEJpbmFyeUltYWdlKCk7CisJUmFuZ2UgcmFuZ2UxID0ge2xvdzEsIGhpZ2gxfSwKKwkJcmFuZ2UyID0ge2xvdzIsIGhpZ2gyfSwKKwkJcmFuZ2UzID0ge2xvdzMsIGhpZ2gzfTsKKwkKKwlpbnQgc3VjY2VzcyA9IGltYXFDb2xvclRocmVzaG9sZChyZXN1bHQtPkdldEltYXFJbWFnZSgpLCBtX2ltYXFJbWFnZSwgMSwgY29sb3JNb2RlLCAmcmFuZ2UxLCAmcmFuZ2UyLCAmcmFuZ2UzKTsKKwl3cGlfc2V0SW1hcUVycm9yV2l0aENvbnRleHQoc3VjY2VzcywgIkltYXFUaHJlc2hvbGQgZXJyb3IiKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFBlcmZvcm0gYSB0aHJlc2hvbGQgaW4gUkdCIHNwYWNlLgorICogQHBhcmFtIHJlZExvdyBSZWQgbG93IHZhbHVlCisgKiBAcGFyYW0gcmVkSGlnaCBSZWQgaGlnaCB2YWx1ZQorICogQHBhcmFtIGdyZWVuTG93IEdyZWVuIGxvdyB2YWx1ZQorICogQHBhcmFtIGdyZWVuSGlnaCBHcmVlbiBoaWdoIHZhbHVlCisgKiBAcGFyYW0gYmx1ZUxvdyBCbHVlIGxvdyB2YWx1ZQorICogQHBhcmFtIGJsdWVIaWdoIEJsdWUgaGlnaCB2YWx1ZQorICogQHJldHVybnMgQSBwb2ludGVyIHRvIGEgQmluYXJ5SW1hZ2UgdGhhdCByZXByZXNlbnRzIHRoZSByZXN1bHQgb2YgdGhlIHRocmVzaG9sZCBvcGVyYXRpb24uCisgKi8KK0JpbmFyeUltYWdlICpDb2xvckltYWdlOjpUaHJlc2hvbGRSR0IoaW50IHJlZExvdywgaW50IHJlZEhpZ2gsIGludCBncmVlbkxvdywgaW50IGdyZWVuSGlnaCwgaW50IGJsdWVMb3csIGludCBibHVlSGlnaCkKK3sKKwlyZXR1cm4gQ29tcHV0ZVRocmVzaG9sZChJTUFRX1JHQiwgcmVkTG93LCByZWRIaWdoLCBncmVlbkxvdywgZ3JlZW5IaWdoLCBibHVlTG93LCBibHVlSGlnaCk7Cit9CisKKy8qKgorICogUGVyZm9ybSBhIHRocmVzaG9sZCBpbiBSR0Igc3BhY2UuCisgKiBAcGFyYW0gdGhyZXNob2xkIGEgcmVmZXJlbmNlIHRvIHRoZSBUaHJlc2hvbGQgb2JqZWN0IHRvIHVzZS4KKyAqIEByZXR1cm5zIEEgcG9pbnRlciB0byBhIEJpbmFyeUltYWdlIHRoYXQgcmVwcmVzZW50cyB0aGUgcmVzdWx0IG9mIHRoZSB0aHJlc2hvbGQgb3BlcmF0aW9uLgorICovCitCaW5hcnlJbWFnZSAqQ29sb3JJbWFnZTo6VGhyZXNob2xkUkdCKFRocmVzaG9sZCAmdCkKK3sKKwlyZXR1cm4gQ29tcHV0ZVRocmVzaG9sZChJTUFRX1JHQiwgdC5wbGFuZTFMb3csIHQucGxhbmUxSGlnaCwKKwkJCQkJCQkJdC5wbGFuZTJMb3csIHQucGxhbmUySGlnaCwKKwkJCQkJCQkJdC5wbGFuZTNMb3csIHQucGxhbmUzSGlnaCk7Cit9CisKKy8qKgorICogUGVyZm9ybSBhIHRocmVzaG9sZCBpbiBIU0wgc3BhY2UuCisgKiBAcGFyYW0gaHVlTG93IExvdyB2YWx1ZSBmb3IgaHVlCisgKiBAcGFyYW0gaHVlSGlnaCBIaWdoIHZhbHVlIGZvciBodWUKKyAqIEBwYXJhbSBzYXR1cmF0aW9uTG93IExvdyB2YWx1ZSBmb3Igc2F0dXJhdGlvbgorICogQHBhcmFtIHNhdHVyYXRpb25IaWdoIEhpZ2ggdmFsdWUgZm9yIHNhdHVyYXRpb24KKyAqIEBwYXJhbSBsdW1pbmVuY2VMb3cgTG93IHZhbHVlIGZvciBsdW1pbmVuY2UKKyAqIEBwYXJhbSBsdW1pbmVuY2VIaWdoIEhpZ2ggdmFsdWUgZm9yIGx1bWluZW5jZQorICogQHJldHVybnMgYSBwb2ludGVyIHRvIGEgQmluYXJ5SW1hZ2UgdGhhdCByZXByZXNlbnRzIHRoZSByZXN1bHQgb2YgdGhlIHRocmVzaG9sZCBvcGVyYXRpb24uCisgKi8KK0JpbmFyeUltYWdlICpDb2xvckltYWdlOjpUaHJlc2hvbGRIU0woaW50IGh1ZUxvdywgaW50IGh1ZUhpZ2gsIGludCBzYXR1cmF0aW9uTG93LCBpbnQgc2F0dXJhdGlvbkhpZ2gsIGludCBsdW1pbmVuY2VMb3csIGludCBsdW1pbmVuY2VIaWdoKQoreworCXJldHVybiBDb21wdXRlVGhyZXNob2xkKElNQVFfSFNMLCBodWVMb3csIGh1ZUhpZ2gsIHNhdHVyYXRpb25Mb3csIHNhdHVyYXRpb25IaWdoLCBsdW1pbmVuY2VMb3csIGx1bWluZW5jZUhpZ2gpOworfQorCisvKioKKyAqIFBlcmZvcm0gYSB0aHJlc2hvbGQgaW4gSFNMIHNwYWNlLgorICogQHBhcmFtIHRocmVzaG9sZCBhIHJlZmVyZW5jZSB0byB0aGUgVGhyZXNob2xkIG9iamVjdCB0byB1c2UuCisgKiBAcmV0dXJucyBBIHBvaW50ZXIgdG8gYSBCaW5hcnlJbWFnZSB0aGF0IHJlcHJlc2VudHMgdGhlIHJlc3VsdCBvZiB0aGUgdGhyZXNob2xkIG9wZXJhdGlvbi4KKyAqLworQmluYXJ5SW1hZ2UgKkNvbG9ySW1hZ2U6OlRocmVzaG9sZEhTTChUaHJlc2hvbGQgJnQpCit7CisJcmV0dXJuIENvbXB1dGVUaHJlc2hvbGQoSU1BUV9IU0wsIHQucGxhbmUxTG93LCB0LnBsYW5lMUhpZ2gsCisJCQkJCQkJCXQucGxhbmUyTG93LCB0LnBsYW5lMkhpZ2gsCisJCQkJCQkJCXQucGxhbmUzTG93LCB0LnBsYW5lM0hpZ2gpOworfQorCisvKioKKyAqIFBlcmZvcm0gYSB0aHJlc2hvbGQgaW4gSFNWIHNwYWNlLgorICogQHBhcmFtIGh1ZUxvdyBMb3cgdmFsdWUgZm9yIGh1ZQorICogQHBhcmFtIGh1ZUhpZ2ggSGlnaCB2YWx1ZSBmb3IgaHVlCisgKiBAcGFyYW0gc2F0dXJhdGlvbkxvdyBMb3cgdmFsdWUgZm9yIHNhdHVyYXRpb24KKyAqIEBwYXJhbSBzYXR1cmF0aW9uSGlnaCBIaWdoIHZhbHVlIGZvciBzYXR1cmF0aW9uCisgKiBAcGFyYW0gdmFsdWVMb3cgTG93IHZhbHVlCisgKiBAcGFyYW0gdmFsdWVIaWdoIEhpZ2ggdmFsdWUKKyAqIEByZXR1cm5zIGEgcG9pbnRlciB0byBhIEJpbmFyeUltYWdlIHRoYXQgcmVwcmVzZW50cyB0aGUgcmVzdWx0IG9mIHRoZSB0aHJlc2hvbGQgb3BlcmF0aW9uLgorICovCitCaW5hcnlJbWFnZSAqQ29sb3JJbWFnZTo6VGhyZXNob2xkSFNWKGludCBodWVMb3csIGludCBodWVIaWdoLCBpbnQgc2F0dXJhdGlvbkxvdywgaW50IHNhdHVyYXRpb25IaWdoLCBpbnQgdmFsdWVMb3csIGludCB2YWx1ZUhpZ2gpCit7CisJcmV0dXJuIENvbXB1dGVUaHJlc2hvbGQoSU1BUV9IU1YsIGh1ZUxvdywgaHVlSGlnaCwgc2F0dXJhdGlvbkxvdywgc2F0dXJhdGlvbkhpZ2gsIHZhbHVlTG93LCB2YWx1ZUhpZ2gpOworfQorCisvKioKKyAqIFBlcmZvcm0gYSB0aHJlc2hvbGQgaW4gSFNWIHNwYWNlLgorICogQHBhcmFtIHRocmVzaG9sZCBhIHJlZmVyZW5jZSB0byB0aGUgVGhyZXNob2xkIG9iamVjdCB0byB1c2UuCisgKiBAcmV0dXJucyBBIHBvaW50ZXIgdG8gYSBCaW5hcnlJbWFnZSB0aGF0IHJlcHJlc2VudHMgdGhlIHJlc3VsdCBvZiB0aGUgdGhyZXNob2xkIG9wZXJhdGlvbi4KKyAqLworQmluYXJ5SW1hZ2UgKkNvbG9ySW1hZ2U6OlRocmVzaG9sZEhTVihUaHJlc2hvbGQgJnQpCit7CisJcmV0dXJuIENvbXB1dGVUaHJlc2hvbGQoSU1BUV9IU1YsIHQucGxhbmUxTG93LCB0LnBsYW5lMUhpZ2gsCisJCQkJCQkJCXQucGxhbmUyTG93LCB0LnBsYW5lMkhpZ2gsCisJCQkJCQkJCXQucGxhbmUzTG93LCB0LnBsYW5lM0hpZ2gpOworfQorCisvKioKKyAqIFBlcmZvcm0gYSB0aHJlc2hvbGQgaW4gSFNJIHNwYWNlLgorICogQHBhcmFtIGh1ZUxvdyBMb3cgdmFsdWUgZm9yIGh1ZQorICogQHBhcmFtIGh1ZUhpZ2ggSGlnaCB2YWx1ZSBmb3IgaHVlCisgKiBAcGFyYW0gc2F0dXJhdGlvbkxvdyBMb3cgdmFsdWUgZm9yIHNhdHVyYXRpb24KKyAqIEBwYXJhbSBzYXR1cmF0aW9uSGlnaCBIaWdoIHZhbHVlIGZvciBzYXR1cmF0aW9uCisgKiBAcGFyYW0gdmFsdWVMb3cgTG93IGludGVuc2l0eQorICogQHBhcmFtIHZhbHVlSGlnaCBIaWdoIGludGVuc2l0eQorICogQHJldHVybnMgYSBwb2ludGVyIHRvIGEgQmluYXJ5SW1hZ2UgdGhhdCByZXByZXNlbnRzIHRoZSByZXN1bHQgb2YgdGhlIHRocmVzaG9sZCBvcGVyYXRpb24uCisgKi8KK0JpbmFyeUltYWdlICpDb2xvckltYWdlOjpUaHJlc2hvbGRIU0koaW50IGh1ZUxvdywgaW50IGh1ZUhpZ2gsIGludCBzYXR1cmF0aW9uTG93LCBpbnQgc2F0dXJhdGlvbkhpZ2gsIGludCBpbnRlbnNpdHlMb3csIGludCBpbnRlbnNpdHlIaWdoKQoreworCXJldHVybiBDb21wdXRlVGhyZXNob2xkKElNQVFfSFNJLCBodWVMb3csIGh1ZUhpZ2gsIHNhdHVyYXRpb25Mb3csIHNhdHVyYXRpb25IaWdoLCBpbnRlbnNpdHlMb3csIGludGVuc2l0eUhpZ2gpOworfQorCisvKioKKyAqIFBlcmZvcm0gYSB0aHJlc2hvbGQgaW4gSFNJIHNwYWNlLgorICogQHBhcmFtIHRocmVzaG9sZCBhIHJlZmVyZW5jZSB0byB0aGUgVGhyZXNob2xkIG9iamVjdCB0byB1c2UuCisgKiBAcmV0dXJucyBBIHBvaW50ZXIgdG8gYSBCaW5hcnlJbWFnZSB0aGF0IHJlcHJlc2VudHMgdGhlIHJlc3VsdCBvZiB0aGUgdGhyZXNob2xkIG9wZXJhdGlvbi4KKyAqLworQmluYXJ5SW1hZ2UgKkNvbG9ySW1hZ2U6OlRocmVzaG9sZEhTSShUaHJlc2hvbGQgJnQpCit7CisJcmV0dXJuIENvbXB1dGVUaHJlc2hvbGQoSU1BUV9IU0ksIHQucGxhbmUxTG93LCB0LnBsYW5lMUhpZ2gsCisJCQkJCQkJCXQucGxhbmUyTG93LCB0LnBsYW5lMkhpZ2gsCisJCQkJCQkJCXQucGxhbmUzTG93LCB0LnBsYW5lM0hpZ2gpOworfQorCisvKioKKyAqIEV4dHJhY3QgYSBjb2xvciBwbGFuZSBmcm9tIHRoZSBpbWFnZQorICogQHBhcmFtIG1vZGUgVGhlIENvbG9yTW9kZSB0byB1c2UgZm9yIHRoZSBwbGFuZSBleHRyYWN0aW9uCisgKiBAcGFyYW0gcGxhbmVOdW1iZXIgV2hpY2ggcGxhbmUgaXMgdG8gYmUgZXh0cmFjdGVkCisgKiBAcmV0dXJucyBBIHBvaW50ZXIgdG8gYSBNb25vSW1hZ2UgdGhhdCByZXByZXNlbnRzIHRoZSBleHRyYWN0ZWQgcGxhbmUuCisgKi8KK01vbm9JbWFnZSAqQ29sb3JJbWFnZTo6RXh0cmFjdENvbG9yUGxhbmUoQ29sb3JNb2RlIG1vZGUsIGludCBwbGFuZU51bWJlcikKK3sKKwlNb25vSW1hZ2UgKnJlc3VsdCA9IG5ldyBNb25vSW1hZ2UoKTsKKwlpZiAobV9pbWFxSW1hZ2UgPT0gTlVMTCkKKwkJd3BpX3NldFdQSUVycm9yKE51bGxQYXJhbWV0ZXIpOworCWludCBzdWNjZXNzID0gaW1hcUV4dHJhY3RDb2xvclBsYW5lcyhtX2ltYXFJbWFnZSwgCisJCQkJCQkJCQkJIG1vZGUsIAorCQkJCQkJCQkJCSAocGxhbmVOdW1iZXIgPT0gMSkgPyByZXN1bHQtPkdldEltYXFJbWFnZSgpIDogTlVMTCwgCisJCQkJCQkJCQkJIChwbGFuZU51bWJlciA9PSAyKSA/IHJlc3VsdC0+R2V0SW1hcUltYWdlKCkgOiBOVUxMLCAKKwkJCQkJCQkJCQkgKHBsYW5lTnVtYmVyID09IDMpID8gcmVzdWx0LT5HZXRJbWFxSW1hZ2UoKSA6IE5VTEwpOworCXdwaV9zZXRJbWFxRXJyb3JXaXRoQ29udGV4dChzdWNjZXNzLCAiSW1hcSBFeHRyYWN0Q29sb3JQbGFuZXMgZmFpbGVkIik7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIEV4dHJhY3QgdGhlIGZpcnN0IGNvbG9yIHBsYW5lIGZvciBhbiBpbWFnZS4KKyAqIEBwYXJhbSBtb2RlIFRoZSBjb2xvciBtb2RlIGluIHdoaWNoIHRvIG9wZXJhdGUKKyAqIEByZXR1cm5zIGEgcG9pbnRlciB0byBhIE1vbm9JbWFnZSB0aGF0IGlzIHRoZSBleHRyYWN0ZWQgcGxhbmUuCisgKi8KK01vbm9JbWFnZSAqQ29sb3JJbWFnZTo6RXh0cmFjdEZpcnN0Q29sb3JQbGFuZShDb2xvck1vZGUgbW9kZSkKK3sKKwlyZXR1cm4gRXh0cmFjdENvbG9yUGxhbmUobW9kZSwgMSk7Cit9CisKKy8qCisgKiBFeHRyYWN0IHRoZSBzZWNvbmQgY29sb3IgcGxhbmUgZm9yIGFuIGltYWdlLgorICogQHBhcmFtIG1vZGUgVGhlIGNvbG9yIG1vZGUgaW4gd2hpY2ggdG8gb3BlcmF0ZQorICogQHJldHVybnMgYSBwb2ludGVyIHRvIGEgTW9ub0ltYWdlIHRoYXQgaXMgdGhlIGV4dHJhY3RlZCBwbGFuZS4KKyAqLworTW9ub0ltYWdlICpDb2xvckltYWdlOjpFeHRyYWN0U2Vjb25kQ29sb3JQbGFuZShDb2xvck1vZGUgbW9kZSkKK3sKKwlyZXR1cm4gRXh0cmFjdENvbG9yUGxhbmUobW9kZSwgMik7Cit9CisKKy8qCisgKiBFeHRyYWN0IHRoZSB0aGlyZCBjb2xvciBwbGFuZSBmb3IgYW4gaW1hZ2UuCisgKiBAcGFyYW0gbW9kZSBUaGUgY29sb3IgbW9kZSBpbiB3aGljaCB0byBvcGVyYXRlCisgKiBAcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBNb25vSW1hZ2UgdGhhdCBpcyB0aGUgZXh0cmFjdGVkIHBsYW5lLgorICovCitNb25vSW1hZ2UgKkNvbG9ySW1hZ2U6OkV4dHJhY3RUaGlyZENvbG9yUGxhbmUoQ29sb3JNb2RlIG1vZGUpCit7CisJcmV0dXJuIEV4dHJhY3RDb2xvclBsYW5lKG1vZGUsIDMpOworfQorCisvKgorICogRXh0cmFjdCB0aGUgcmVkIHBsYW5lIGZyb20gYW4gUkdCIGltYWdlLgorICogQHJldHVybnMgYSBwb2ludGVyIHRvIGEgTW9ub0ltYWdlIHRoYXQgaXMgdGhlIGV4dHJhY2VkIHBsYW5lLgorICovCitNb25vSW1hZ2UgKkNvbG9ySW1hZ2U6OkdldFJlZFBsYW5lKCkKK3sKKwlyZXR1cm4gRXh0cmFjdEZpcnN0Q29sb3JQbGFuZShJTUFRX1JHQik7Cit9CisKKy8qCisgKiBFeHRyYWN0IHRoZSBncmVlbiBwbGFuZSBmcm9tIGFuIFJHQiBpbWFnZS4KKyAqIEByZXR1cm5zIGEgcG9pbnRlciB0byBhIE1vbm9JbWFnZSB0aGF0IGlzIHRoZSBleHRyYWNlZCBwbGFuZS4KKyAqLworTW9ub0ltYWdlICpDb2xvckltYWdlOjpHZXRHcmVlblBsYW5lKCkKK3sKKyAgICByZXR1cm4gRXh0cmFjdFNlY29uZENvbG9yUGxhbmUoSU1BUV9SR0IpOworfQorCisvKgorICogRXh0cmFjdCB0aGUgYmx1ZSBwbGFuZSBmcm9tIGFuIFJHQiBpbWFnZS4KKyAqIEByZXR1cm5zIGEgcG9pbnRlciB0byBhIE1vbm9JbWFnZSB0aGF0IGlzIHRoZSBleHRyYWNlZCBwbGFuZS4KKyAqLworTW9ub0ltYWdlICpDb2xvckltYWdlOjpHZXRCbHVlUGxhbmUoKQoreworICAgIHJldHVybiBFeHRyYWN0VGhpcmRDb2xvclBsYW5lKElNQVFfUkdCKTsKK30KKworLyoKKyAqIEV4dHJhY3QgdGhlIEh1ZSBwbGFuZSBmcm9tIGFuIEhTTCBpbWFnZS4KKyAqIEByZXR1cm5zIGEgcG9pbnRlciB0byBhIE1vbm9JbWFnZSB0aGF0IGlzIHRoZSBleHRyYWNlZCBwbGFuZS4KKyAqLworTW9ub0ltYWdlICpDb2xvckltYWdlOjpHZXRIU0xIdWVQbGFuZSgpCit7CisJcmV0dXJuIEV4dHJhY3RGaXJzdENvbG9yUGxhbmUoSU1BUV9IU0wpOworfQorCisvKgorICogRXh0cmFjdCB0aGUgSHVlIHBsYW5lIGZyb20gYW4gSFNWIGltYWdlLgorICogQHJldHVybnMgYSBwb2ludGVyIHRvIGEgTW9ub0ltYWdlIHRoYXQgaXMgdGhlIGV4dHJhY2VkIHBsYW5lLgorICovCitNb25vSW1hZ2UgKkNvbG9ySW1hZ2U6OkdldEhTVkh1ZVBsYW5lKCkKK3sKKwlyZXR1cm4gRXh0cmFjdEZpcnN0Q29sb3JQbGFuZShJTUFRX0hTVik7Cit9CisKKy8qCisgKiBFeHRyYWN0IHRoZSBIdWUgcGxhbmUgZnJvbSBhbiBIU0kgaW1hZ2UuCisgKiBAcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBNb25vSW1hZ2UgdGhhdCBpcyB0aGUgZXh0cmFjZWQgcGxhbmUuCisgKi8KK01vbm9JbWFnZSAqQ29sb3JJbWFnZTo6R2V0SFNJSHVlUGxhbmUoKQoreworCXJldHVybiBFeHRyYWN0Rmlyc3RDb2xvclBsYW5lKElNQVFfSFNJKTsKK30KKworLyoKKyAqIEV4dHJhY3QgdGhlIEx1bWluYW5jZSBwbGFuZSBmcm9tIGFuIEhTTCBpbWFnZS4KKyAqIEByZXR1cm5zIGEgcG9pbnRlciB0byBhIE1vbm9JbWFnZSB0aGF0IGlzIHRoZSBleHRyYWNlZCBwbGFuZS4KKyAqLworTW9ub0ltYWdlICpDb2xvckltYWdlOjpHZXRMdW1pbmFuY2VQbGFuZSgpCit7CisJcmV0dXJuIEV4dHJhY3RUaGlyZENvbG9yUGxhbmUoSU1BUV9IU0wpOworfQorCisvKgorICogRXh0cmFjdCB0aGUgVmFsdWUgcGxhbmUgZnJvbSBhbiBIU1YgaW1hZ2UuCisgKiBAcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBNb25vSW1hZ2UgdGhhdCBpcyB0aGUgZXh0cmFjZWQgcGxhbmUuCisgKi8KK01vbm9JbWFnZSAqQ29sb3JJbWFnZTo6R2V0VmFsdWVQbGFuZSgpCit7CisJcmV0dXJuIEV4dHJhY3RUaGlyZENvbG9yUGxhbmUoSU1BUV9IU1YpOworfQorCisvKgorICogRXh0cmFjdCB0aGUgSW50ZW5zaXR5IHBsYW5lIGZyb20gYW4gSFNJIGltYWdlLgorICogQHJldHVybnMgYSBwb2ludGVyIHRvIGEgTW9ub0ltYWdlIHRoYXQgaXMgdGhlIGV4dHJhY2VkIHBsYW5lLgorICovCitNb25vSW1hZ2UgKkNvbG9ySW1hZ2U6OkdldEludGVuc2l0eVBsYW5lKCkKK3sKKwlyZXR1cm4gRXh0cmFjdFRoaXJkQ29sb3JQbGFuZShJTUFRX0hTSSk7Cit9CisKKy8qKgorICogUmVwbGFjZSBhIHBsYW5lIGluIHRoZSBDb2xvckltYWdlIHdpdGggYSBNb25vSW1hZ2UKKyAqIFJlcGxhY2VzIGEgc2luZ2xlIHBsYW5lIGluIHRoZSBpbWFnZSB3aXRoIGEgTW9ub0ltYWdlCisgKiBAcGFyYW0gbW9kZSBUaGUgQ29sb3JNb2RlIGluIHdoaWNoIHRvIG9wZXJhdGUKKyAqIEBwYXJhbSBwbGFuZSBUaGUgcG9pbnRlciB0byB0aGUgcmVwbGFjZW1lbnQgcGxhbmUgYXMgYSBNb25vSW1hZ2UKKyAqIEBwYXJhbSBwbGFuZU51bWJlciBUaGUgcGxhbmUgbnVtYmVyICgxLCAyLCAzKSB0byByZXBsYWNlCisgKi8KK3ZvaWQgQ29sb3JJbWFnZTo6UmVwbGFjZVBsYW5lKENvbG9yTW9kZSBtb2RlLCBNb25vSW1hZ2UgKnBsYW5lLCBpbnQgcGxhbmVOdW1iZXIpIHsKKwlpbnQgc3VjY2VzcyA9IGltYXFSZXBsYWNlQ29sb3JQbGFuZXMobV9pbWFxSW1hZ2UsIAorCQkJCQkJCQkJCSAoY29uc3QgSW1hZ2UqKSBtX2ltYXFJbWFnZSwgCisJCQkJCQkJCQkgICAgIG1vZGUsIAorCQkJCQkJCQkJICAgICAocGxhbmVOdW1iZXIgPT0gMSkgPyBwbGFuZS0+R2V0SW1hcUltYWdlKCkgOiBOVUxMLCAKKwkJCQkJCQkJCSAgICAgKHBsYW5lTnVtYmVyID09IDIpID8gcGxhbmUtPkdldEltYXFJbWFnZSgpIDogTlVMTCwgCisJCQkJCQkJCQkgICAgIChwbGFuZU51bWJlciA9PSAzKSA/IHBsYW5lLT5HZXRJbWFxSW1hZ2UoKSA6IE5VTEwpOworCXdwaV9zZXRJbWFxRXJyb3JXaXRoQ29udGV4dChzdWNjZXNzLCAiSW1hcSBSZXBsYWNlQ29sb3JQbGFuZXMgZmFpbGVkIik7Cit9CisKKy8qKgorICogUmVwbGFjZSB0aGUgZmlyc3QgY29sb3IgcGxhbmUgd2l0aCBhIE1vbm9JbWFnZS4KKyAqIEBwYXJhbSBtb2RlIFRoZSBjb2xvciBtb2RlIGluIHdoaWNoIHRvIG9wZXJhdGUuCisgKiBAcGFyYW0gcGxhbmUgQSBwb2ludGVyIHRvIGEgTW9ub0ltYWdlIHRoYXQgd2lsbCByZXBsYWNlIHRoZSBzcGVjaWZpZWQgY29sb3IgcGxhbmUuCisgKi8KK3ZvaWQgQ29sb3JJbWFnZTo6UmVwbGFjZUZpcnN0Q29sb3JQbGFuZShDb2xvck1vZGUgbW9kZSwgTW9ub0ltYWdlICpwbGFuZSkKK3sKKwlSZXBsYWNlUGxhbmUobW9kZSwgcGxhbmUsIDEpOworfQorCisvKioKKyAqIFJlcGxhY2UgdGhlIHNlY29uZCBjb2xvciBwbGFuZSB3aXRoIGEgTW9ub0ltYWdlLgorICogQHBhcmFtIG1vZGUgVGhlIGNvbG9yIG1vZGUgaW4gd2hpY2ggdG8gb3BlcmF0ZS4KKyAqIEBwYXJhbSBwbGFuZSBBIHBvaW50ZXIgdG8gYSBNb25vSW1hZ2UgdGhhdCB3aWxsIHJlcGxhY2UgdGhlIHNwZWNpZmllZCBjb2xvciBwbGFuZS4KKyAqLwordm9pZCBDb2xvckltYWdlOjpSZXBsYWNlU2Vjb25kQ29sb3JQbGFuZShDb2xvck1vZGUgbW9kZSwgTW9ub0ltYWdlICpwbGFuZSkKK3sKKwlSZXBsYWNlUGxhbmUobW9kZSwgcGxhbmUsIDIpOworfQorCisvKioKKyAqIFJlcGxhY2UgdGhlIHRoaXJkIGNvbG9yIHBsYW5lIHdpdGggYSBNb25vSW1hZ2UuCisgKiBAcGFyYW0gbW9kZSBUaGUgY29sb3IgbW9kZSBpbiB3aGljaCB0byBvcGVyYXRlLgorICogQHBhcmFtIHBsYW5lIEEgcG9pbnRlciB0byBhIE1vbm9JbWFnZSB0aGF0IHdpbGwgcmVwbGFjZSB0aGUgc3BlY2lmaWVkIGNvbG9yIHBsYW5lLgorICovCit2b2lkIENvbG9ySW1hZ2U6OlJlcGxhY2VUaGlyZENvbG9yUGxhbmUoQ29sb3JNb2RlIG1vZGUsIE1vbm9JbWFnZSAqcGxhbmUpCit7IAorCVJlcGxhY2VQbGFuZShtb2RlLCBwbGFuZSwgMyk7Cit9CisKKy8qKgorICogUmVwbGFjZSB0aGUgcmVkIGNvbG9yIHBsYW5lIHdpdGggYSBNb25vSW1hZ2UuCisgKiBAcGFyYW0gbW9kZSBUaGUgY29sb3IgbW9kZSBpbiB3aGljaCB0byBvcGVyYXRlLgorICogQHBhcmFtIHBsYW5lIEEgcG9pbnRlciB0byBhIE1vbm9JbWFnZSB0aGF0IHdpbGwgcmVwbGFjZSB0aGUgc3BlY2lmaWVkIGNvbG9yIHBsYW5lLgorICovCit2b2lkIENvbG9ySW1hZ2U6OlJlcGxhY2VSZWRQbGFuZShNb25vSW1hZ2UgKnBsYW5lKQoreworCVJlcGxhY2VGaXJzdENvbG9yUGxhbmUoSU1BUV9SR0IsIHBsYW5lKTsKK30KKworLyoqCisgKiBSZXBsYWNlIHRoZSBncmVlbiBjb2xvciBwbGFuZSB3aXRoIGEgTW9ub0ltYWdlLgorICogQHBhcmFtIG1vZGUgVGhlIGNvbG9yIG1vZGUgaW4gd2hpY2ggdG8gb3BlcmF0ZS4KKyAqIEBwYXJhbSBwbGFuZSBBIHBvaW50ZXIgdG8gYSBNb25vSW1hZ2UgdGhhdCB3aWxsIHJlcGxhY2UgdGhlIHNwZWNpZmllZCBjb2xvciBwbGFuZS4KKyAqLwordm9pZCBDb2xvckltYWdlOjpSZXBsYWNlR3JlZW5QbGFuZShNb25vSW1hZ2UgKnBsYW5lKQoreworCVJlcGxhY2VTZWNvbmRDb2xvclBsYW5lKElNQVFfUkdCLCBwbGFuZSk7Cit9CisKKy8qKgorICogUmVwbGFjZSB0aGUgYmx1ZSBjb2xvciBwbGFuZSB3aXRoIGEgTW9ub0ltYWdlLgorICogQHBhcmFtIG1vZGUgVGhlIGNvbG9yIG1vZGUgaW4gd2hpY2ggdG8gb3BlcmF0ZS4KKyAqIEBwYXJhbSBwbGFuZSBBIHBvaW50ZXIgdG8gYSBNb25vSW1hZ2UgdGhhdCB3aWxsIHJlcGxhY2UgdGhlIHNwZWNpZmllZCBjb2xvciBwbGFuZS4KKyAqLwordm9pZCBDb2xvckltYWdlOjpSZXBsYWNlQmx1ZVBsYW5lKE1vbm9JbWFnZSAqcGxhbmUpCit7CisJUmVwbGFjZVRoaXJkQ29sb3JQbGFuZShJTUFRX1JHQiwgcGxhbmUpOworfQorCisKKy8qKgorICogUmVwbGFjZSB0aGUgSHVlIGNvbG9yIHBsYW5lIGluIGEgSFNMIGltYWdlIHdpdGggYSBNb25vSW1hZ2UuCisgKiBAcGFyYW0gbW9kZSBUaGUgY29sb3IgbW9kZSBpbiB3aGljaCB0byBvcGVyYXRlLgorICogQHBhcmFtIHBsYW5lIEEgcG9pbnRlciB0byBhIE1vbm9JbWFnZSB0aGF0IHdpbGwgcmVwbGFjZSB0aGUgc3BlY2lmaWVkIGNvbG9yIHBsYW5lLgorICovCit2b2lkIENvbG9ySW1hZ2U6OlJlcGxhY2VIU0xIdWVQbGFuZShNb25vSW1hZ2UgKnBsYW5lKQoreworCXJldHVybiBSZXBsYWNlRmlyc3RDb2xvclBsYW5lKElNQVFfSFNMLCBwbGFuZSk7Cit9CisKKy8qKgorICogUmVwbGFjZSB0aGUgSHVlIGNvbG9yIHBsYW5lIGluIGEgSFNWIGltYWdlIHdpdGggYSBNb25vSW1hZ2UuCisgKiBAcGFyYW0gbW9kZSBUaGUgY29sb3IgbW9kZSBpbiB3aGljaCB0byBvcGVyYXRlLgorICogQHBhcmFtIHBsYW5lIEEgcG9pbnRlciB0byBhIE1vbm9JbWFnZSB0aGF0IHdpbGwgcmVwbGFjZSB0aGUgc3BlY2lmaWVkIGNvbG9yIHBsYW5lLgorICovCit2b2lkIENvbG9ySW1hZ2U6OlJlcGxhY2VIU1ZIdWVQbGFuZShNb25vSW1hZ2UgKnBsYW5lKQoreworCXJldHVybiBSZXBsYWNlRmlyc3RDb2xvclBsYW5lKElNQVFfSFNWLCBwbGFuZSk7Cit9CisKKy8qKgorICogUmVwbGFjZSB0aGUgZmlyc3QgSHVlIHBsYW5lIGluIGEgSFNJIGltYWdlIHdpdGggYSBNb25vSW1hZ2UuCisgKiBAcGFyYW0gbW9kZSBUaGUgY29sb3IgbW9kZSBpbiB3aGljaCB0byBvcGVyYXRlLgorICogQHBhcmFtIHBsYW5lIEEgcG9pbnRlciB0byBhIE1vbm9JbWFnZSB0aGF0IHdpbGwgcmVwbGFjZSB0aGUgc3BlY2lmaWVkIGNvbG9yIHBsYW5lLgorICovCit2b2lkIENvbG9ySW1hZ2U6OlJlcGxhY2VIU0lIdWVQbGFuZShNb25vSW1hZ2UgKnBsYW5lKQoreworCXJldHVybiBSZXBsYWNlRmlyc3RDb2xvclBsYW5lKElNQVFfSFNJLCBwbGFuZSk7Cit9CisKKy8qKgorICogUmVwbGFjZSB0aGUgU2F0dXJhdGlvbiBjb2xvciBwbGFuZSBpbiBhbiBIU0wgaW1hZ2Ugd2l0aCBhIE1vbm9JbWFnZS4KKyAqIEBwYXJhbSBtb2RlIFRoZSBjb2xvciBtb2RlIGluIHdoaWNoIHRvIG9wZXJhdGUuCisgKiBAcGFyYW0gcGxhbmUgQSBwb2ludGVyIHRvIGEgTW9ub0ltYWdlIHRoYXQgd2lsbCByZXBsYWNlIHRoZSBzcGVjaWZpZWQgY29sb3IgcGxhbmUuCisgKi8KK3ZvaWQgQ29sb3JJbWFnZTo6UmVwbGFjZUhTTFNhdHVyYXRpb25QbGFuZShNb25vSW1hZ2UgKnBsYW5lKQoreworCXJldHVybiBSZXBsYWNlU2Vjb25kQ29sb3JQbGFuZShJTUFRX0hTTCwgcGxhbmUpOworfQorCisvKioKKyAqIFJlcGxhY2UgdGhlIFNhdHVyYXRpb24gY29sb3IgcGxhbmUgaW4gYSBIU1YgaW1hZ2Ugd2l0aCBhIE1vbm9JbWFnZS4KKyAqIEBwYXJhbSBtb2RlIFRoZSBjb2xvciBtb2RlIGluIHdoaWNoIHRvIG9wZXJhdGUuCisgKiBAcGFyYW0gcGxhbmUgQSBwb2ludGVyIHRvIGEgTW9ub0ltYWdlIHRoYXQgd2lsbCByZXBsYWNlIHRoZSBzcGVjaWZpZWQgY29sb3IgcGxhbmUuCisgKi8KK3ZvaWQgQ29sb3JJbWFnZTo6UmVwbGFjZUhTVlNhdHVyYXRpb25QbGFuZShNb25vSW1hZ2UgKnBsYW5lKQoreworCXJldHVybiBSZXBsYWNlU2Vjb25kQ29sb3JQbGFuZShJTUFRX0hTViwgcGxhbmUpOworfQorCisvKioKKyAqIFJlcGxhY2UgdGhlIFNhdHVyYXRpb24gY29sb3IgcGxhbmUgaW4gYSBIU0kgaW1hZ2Ugd2l0aCBhIE1vbm9JbWFnZS4KKyAqIEBwYXJhbSBtb2RlIFRoZSBjb2xvciBtb2RlIGluIHdoaWNoIHRvIG9wZXJhdGUuCisgKiBAcGFyYW0gcGxhbmUgQSBwb2ludGVyIHRvIGEgTW9ub0ltYWdlIHRoYXQgd2lsbCByZXBsYWNlIHRoZSBzcGVjaWZpZWQgY29sb3IgcGxhbmUuCisgKi8KK3ZvaWQgQ29sb3JJbWFnZTo6UmVwbGFjZUhTSVNhdHVyYXRpb25QbGFuZShNb25vSW1hZ2UgKnBsYW5lKQoreworCXJldHVybiBSZXBsYWNlU2Vjb25kQ29sb3JQbGFuZShJTUFRX0hTSSwgcGxhbmUpOworfQorCisvKioKKyAqIFJlcGxhY2UgdGhlIEx1bWluYW5jZSBjb2xvciBwbGFuZSBpbiBhbiBIU0wgaW1hZ2Ugd2l0aCBhIE1vbm9JbWFnZS4KKyAqIEBwYXJhbSBtb2RlIFRoZSBjb2xvciBtb2RlIGluIHdoaWNoIHRvIG9wZXJhdGUuCisgKiBAcGFyYW0gcGxhbmUgQSBwb2ludGVyIHRvIGEgTW9ub0ltYWdlIHRoYXQgd2lsbCByZXBsYWNlIHRoZSBzcGVjaWZpZWQgY29sb3IgcGxhbmUuCisgKi8KK3ZvaWQgQ29sb3JJbWFnZTo6UmVwbGFjZUx1bWluYW5jZVBsYW5lKE1vbm9JbWFnZSAqcGxhbmUpCit7CisJcmV0dXJuIFJlcGxhY2VUaGlyZENvbG9yUGxhbmUoSU1BUV9IU0wsIHBsYW5lKTsKK30KKworLyoqCisgKiBSZXBsYWNlIHRoZSBWYWx1ZSBjb2xvciBwbGFuZSBpbiBhbiBIU1Ygd2l0aCBhIE1vbm9JbWFnZS4KKyAqIEBwYXJhbSBtb2RlIFRoZSBjb2xvciBtb2RlIGluIHdoaWNoIHRvIG9wZXJhdGUuCisgKiBAcGFyYW0gcGxhbmUgQSBwb2ludGVyIHRvIGEgTW9ub0ltYWdlIHRoYXQgd2lsbCByZXBsYWNlIHRoZSBzcGVjaWZpZWQgY29sb3IgcGxhbmUuCisgKi8KK3ZvaWQgQ29sb3JJbWFnZTo6UmVwbGFjZVZhbHVlUGxhbmUoTW9ub0ltYWdlICpwbGFuZSkKK3sKKwlyZXR1cm4gUmVwbGFjZVRoaXJkQ29sb3JQbGFuZShJTUFRX0hTViwgcGxhbmUpOworfQorCisvKioKKyAqIFJlcGxhY2UgdGhlIEludGVuc2l0eSBjb2xvciBwbGFuZSBpbiBhIEhTSSBpbWFnZSB3aXRoIGEgTW9ub0ltYWdlLgorICogQHBhcmFtIG1vZGUgVGhlIGNvbG9yIG1vZGUgaW4gd2hpY2ggdG8gb3BlcmF0ZS4KKyAqIEBwYXJhbSBwbGFuZSBBIHBvaW50ZXIgdG8gYSBNb25vSW1hZ2UgdGhhdCB3aWxsIHJlcGxhY2UgdGhlIHNwZWNpZmllZCBjb2xvciBwbGFuZS4KKyAqLwordm9pZCBDb2xvckltYWdlOjpSZXBsYWNlSW50ZW5zaXR5UGxhbmUoTW9ub0ltYWdlICpwbGFuZSkKK3sKKwlyZXR1cm4gUmVwbGFjZVRoaXJkQ29sb3JQbGFuZShJTUFRX0hTSSwgcGxhbmUpOworfQorCisvL1RPRE86IGZyY0NvbG9yRXF1YWxpemUoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGludCBjb2xvckVxdWFsaXphdGlvbikgbmVlZHMgdG8gYmUgbW9kaWZpZWQKKy8vVGhlIGNvbG9yRXF1YWxpemF0aW9uIHBhcmFtZXRlciBpcyBkaXNjYXJkZWQgYW5kIGlzIHNldCB0byBUUlVFIGluIHRoZSBjYWxsIHRvIGltYXFDb2xvckVxdWFsaXplLgordm9pZCBDb2xvckltYWdlOjpFcXVhbGl6ZShib29sIGFsbFBsYW5lcykKK3sKKwkvLyBOb3RlIHRoYXQgdGhpcyBjYWxsIHVzZXMgTkktZGVmaW5lZCBUUlVFIGFuZCBGQUxTRQorCWludCBzdWNjZXNzID0gaW1hcUNvbG9yRXF1YWxpemUobV9pbWFxSW1hZ2UsIChjb25zdCBJbWFnZSopIG1faW1hcUltYWdlLCAoYWxsUGxhbmVzKSA/IFRSVUUgOiBGQUxTRSk7CisJd3BpX3NldEltYXFFcnJvcldpdGhDb250ZXh0KHN1Y2Nlc3MsICJJbWFxIENvbG9yRXF1YWxpemUgZXJyb3IiKTsKK30KKwordm9pZCBDb2xvckltYWdlOjpDb2xvckVxdWFsaXplKCkKK3sKKwlFcXVhbGl6ZSh0cnVlKTsKK30KKwordm9pZCBDb2xvckltYWdlOjpMdW1pbmFuY2VFcXVhbGl6ZSgpCit7CisJRXF1YWxpemUoZmFsc2UpOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9WaXNpb24vRnJjRXJyb3IuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9WaXNpb24vRnJjRXJyb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwOWRlYTYKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1Zpc2lvbi9GcmNFcnJvci5jcHAKQEAgLTAsMCArMSwxMjI3IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE0LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAKKyNpbmNsdWRlICJuaXZpc2lvbi5oIiAKKyNpbmNsdWRlICJWaXNpb24vRnJjRXJyb3IuaCIgCisKKy8qKgorICogR2V0IHRoZSBlcnJvciBjb2RlIHJldHVybmVkIGZyb20gdGhlIE5JIFZpc2lvbiBsaWJyYXJ5CisgKiBAcmV0dXJuIFRoZSBsYXN0IGVycm9yIGNvZGUuCisgKi8KK2ludCBHZXRMYXN0VmlzaW9uRXJyb3IoKQoreworCS8vaW50IGVycm9yQ29kZSA9IGltYXFHZXRMYXN0VmlzaW9uRXJyb3IoKTsgICAgIC8vIGVycm9yIGNvZGU6IDAgPSBubyBlcnJvcgkKKwkvL2NoYXIqIGVycm9yVGV4dCA9IEdldFZpc2lvbkVycm9yVGV4dChlcnJvckNvZGUpOworCS8vZHByaW50ZiAoTE9HX0RFQlVHLCAiRXJyb3IgPSAlaSAgJXMgIiwgZXJyb3JDb2RlLCBlcnJvclRleHQpOworCXJldHVybiBpbWFxR2V0TGFzdEVycm9yKCk7Cit9CisJCisvKioKKyogR2V0IHRoZSBlcnJvciB0ZXh0IGZvciBhbiBOSSBWaXNpb24gZXJyb3IgY29kZS4KKyogTm90ZTogaW1hcUdldEVycm9yVGV4dCgpIGlzIG5vdCBzdXBwb3J0ZWQgb24gcmVhbCB0aW1lIHN5c3RlbSwgc28KKyogc28gcmVsZXZhbnQgc3RyaW5ncyBhcmUgaGFyZGNvZGVkIGhlcmUgLSB0aGUgbWFpbnRhaW5lZCB2ZXJzaW9uIGlzCisqIGluIHRoZSBMYWJXaW5kb3dzL0NWSSBoZWxwIGZpbGUuCisqIEBwYXJhbSBlcnJvckNvZGUgVGhlIGVycm9yIGNvZGUgdG8gZmluZCB0aGUgdGV4dCBmb3IuCisqIEByZXR1cm4gVGhlIGVycm9yIHRleHQKKyovCitjb25zdCBjaGFyKiBHZXRWaXNpb25FcnJvclRleHQoaW50IGVycm9yQ29kZSkKK3sKKwljb25zdCBjaGFyKiBlcnJvclRleHQ7CisKKwlzd2l0Y2ggKGVycm9yQ29kZSkKKwl7CisJCWRlZmF1bHQ6CisJCQl7IGVycm9yVGV4dCA9ICJVTktOT1dOX0VSUk9SIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUxMzg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT0NSX1JFR0lPTl9UT09fU01BTEwiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTEzOToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTUFRX1FSX0RJTUVOU0lPTl9JTlZBTElEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUxNDA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT0NSX0NIQVJfUkVQT1JUX0NPUlJVUFRFRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MTQxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX09DUl9OT19URVhUX0ZPVU5EIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUxNDI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUVJfREVURUNUSU9OX01PREVMVFlQRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MTQzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1FSX0RFVEVDVElPTl9NT0RFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUxNDQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUVJfSU5WQUxJRF9CQVJDT0RFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUxNDU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUVJfSU5WQUxJRF9SRUFEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUxNDY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUVJfREVURUNUSU9OX1ZFUlNJT04iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTE0NzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9CQVJDT0RFX1JTU0xJTUlURUQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTE0ODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9PVkVSTEFZX0dST1VQX05PVF9GT1VORCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MTQ5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0RVUExJQ0FURV9UUkFOU0ZPUk1fVFlQRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MTUxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX09DUl9DT1JSRUNUSU9OX0ZBSUxFRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MTU1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX09DUl9PUklFTlRfREVURUNUX0ZBSUxFRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MTU2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX09DUl9TS0VXX0RFVEVDVF9GQUlMRUQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTE1ODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9PQ1JfSU5WQUxJRF9DT05UUkFTVE1PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTE1OToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9PQ1JfSU5WQUxJRF9UT0xFUkFOQ0UiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTE2MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9PQ1JfSU5WQUxJRF9NQVhQT0lOVFNJWkUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTE2MToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9PQ1JfSU5WQUxJRF9DT1JSRUNUSU9OTEVWRUwiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTE2MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9PQ1JfSU5WQUxJRF9DT1JSRUNUSU9OTU9ERSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MTYzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX09DUl9JTlZBTElEX0NIQVJBQ1RFUlBSRUZFUkVOQ0UiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTE2NDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9PQ1JfQUREX1dPUkRfRkFJTEVEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUxNjU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT0NSX1dUU19ESVJfTk9UX0ZPVU5EIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUxNjY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT0NSX0JJTl9ESVJfTk9UX0ZPVU5EIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUxNjc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT0NSX0lOVkFMSURfT1VUUFVUREVMSU1JVEVSIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUxNjg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT0NSX0lOVkFMSURfQVVUT0NPUlJFQ1RJT05NT0RFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUxNjk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT0NSX0lOVkFMSURfUkVDT0dOSVRJT05NT0RFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUxNzA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT0NSX0lOVkFMSURfQ0hBUkFDVEVSVFlQRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MTcxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX09DUl9JTklfRklMRV9OT1RfRk9VTkQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTE3MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9PQ1JfSU5WQUxJRF9DSEFSQUNURVJTRVQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTE3MzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9PQ1JfSU5WQUxJRF9MQU5HVUFHRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MTc0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX09DUl9JTlZBTElEX0FVVE9PUklFTlRNT0RFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUxNzU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT0NSX0JBRF9VU0VSX0RJQ1RJT05BUlkiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTE3ODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9PQ1JfUkVDT0dOSVRJT05fRkFJTEVEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUxNzk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT0NSX1BSRVBST0NFU1NJTkdfRkFJTEVEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyMDA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT0NSX0lOVkFMSURfUEFSQU1FVEVSIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyMDE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT0NSX0xPQURfTElCUkFSWSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjAzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX09DUl9MSUJfSU5JVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjEwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX09DUl9DQU5OT1RfTUFUQ0hfVEVYVF9URU1QTEFURSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjExOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX09DUl9CQURfVEVYVF9URU1QTEFURSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjEyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX09DUl9URU1QTEFURV9XUk9OR19TSVpFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyMzM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVEVNUExBVEVfSU1BR0VfVE9PX0xBUkdFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyMzQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVEVNUExBVEVfSU1BR0VfVE9PX1NNQUxMIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyMzU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVEVNUExBVEVfSU1BR0VfQ09OVFJBU1RfVE9PX0xPVyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjM3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1RFTVBMQVRFX0RFU0NSSVBUT1JfU0hJRlRfMSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjM4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1RFTVBMQVRFX0RFU0NSSVBUT1JfTk9TSElGVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjM5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1RFTVBMQVRFX0RFU0NSSVBUT1JfU0hJRlQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI0MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9URU1QTEFURV9ERVNDUklQVE9SX1JPVEFUSU9OXzEiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI0MToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9URU1QTEFURV9ERVNDUklQVE9SX05PUk9UQVRJT04iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI0MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9URU1QTEFURV9ERVNDUklQVE9SX1JPVEFUSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyNDM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVEVNUExBVEVfREVTQ1JJUFRPUl80IjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyNDQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVEVNUExBVEVfREVTQ1JJUFRPUl8zIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyNDU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVEVNUExBVEVfREVTQ1JJUFRPUl8yIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyNDY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVEVNUExBVEVfREVTQ1JJUFRPUl8xIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyNDc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVEVNUExBVEVfREVTQ1JJUFRPUiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjQ4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1RPT19NQU5ZX1JPVEFUSU9OX0FOR0xFX1JBTkdFUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjQ5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1JPVEFUSU9OX0FOR0xFX1JBTkdFX1RPT19MQVJHRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjUwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX01BVENIX1NFVFVQX0RBVEEiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI1MToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX01BVENIX01PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI1MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9MRUFSTl9TRVRVUF9EQVRBIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyNTM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9MRUFSTl9NT0RFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyNTY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRVZFTl9XSU5ET1dfU0laRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjU3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfRURHRV9ESVIiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI1ODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9CQURfRklMVEVSX1dJRFRIIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyNjA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSEVBUF9UUkFTSEVEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyNjE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfR0lQX1JBTkdFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyNjI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTENEX0JBRF9NQVRDSCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjYzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0xDRF9OT19TRUdNRU5UUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjY1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0JBUkNPREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI2NzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT01QTEVYX1JPT1QiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI2ODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9MSU5FQVJfQ09FRkYiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI2OToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OVUxMX1BPSU5URVIiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI3MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9ESVZfQllfWkVSTyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Mjc1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQlJPV1NFUl9JTUFHRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Mjc2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0xJTkVTX1BBUkFMTEVMIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyNzc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQkFSQ09ERV9DSEVDS1NVTSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Mjc4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0xDRF9OT1RfTlVNRVJJQyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Mjc5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1JPSV9OT1RfUE9MWUdPTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjgwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1JPSV9OT1RfUkVDVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjgxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lNQUdFX1NNQUxMRVJfVEhBTl9CT1JERVIiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI4MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQU5UX0RSQVdfSU5UT19WSUVXRVIiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI4MzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1JBS0VfRElSRUNUSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyODQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9FREdFX1BST0NFU1MiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI4NToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1NQT0tFX0RJUkVDVElPTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Mjg2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQ09OQ0VOVFJJQ19SQUtFX0RJUkVDVElPTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Mjg3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTElORSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjkwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1NIQVBFTUFUQ0hfQkFEVEVNUExBVEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI5MToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9TSEFQRU1BVENIX0JBRElNQUdFREFUQSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjkyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1BPSU5UU19BUkVfQ09MTElORUFSIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyOTM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ09OVE9VUklEX05PVF9GT1VORCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Mjk0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NPTlRPVVJfSU5ERVhfT1VUX09GX1JBTkdFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyOTU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9JTlRFUlBPTEFUSU9OTUVUSE9EX0lOVEVSUE9MQVRFUE9JTlRTIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyOTY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9CQVJDT0RFVFlQRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Mjk3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfUEFSVElDTEVJTkZPTU9ERSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Mjk4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NPTVBMRVhQTEFORV9OT1RfUkVBTF9PUl9JTUFHSU5BUlkiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI5OToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0NPTVBMRVhQTEFORSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzAwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTUVURVJBUkNNT0RFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzMDE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUk9JX05PVF8yX0xJTkVTIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzMDI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9USFJFU0hPTERNRVRIT0QiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTMwMzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX05VTV9PRl9DTEFTU0VTIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzMDQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NQVRIVFJBTlNGT1JNTUVUSE9EIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzMDU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9SRUZFUkVOQ0VNT0RFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzMDY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9UT09MIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzMDc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUFJFQ0lTSU9OX05PVF9HVFJfVEhBTl8wIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzMDg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9DT0xPUlNFTlNJVElWSVRZIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzMDk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9XSU5ET1dfVEhSRUFEX1BPTElDWSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzEwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfUEFMRVRURV9UWVBFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzMTE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9DT0xPUl9TUEVDVFJVTSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzEyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0xDRF9DQUxJQlJBVEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTMxMzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9XUklURV9GSUxFX05PVF9TVVBQT1JURUQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTMxNjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0tFUk5FTF9DT0RFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzMTc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVU5ERUZfUE9JTlQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTMxODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlNGX1BPSU5UUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzE5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfU1VCUElYX1RZUEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTMyMDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9URU1QTEFURV9FTVBUWSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzIxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTU9SUEhPTE9HWU1FVEhPRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzIyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfVEVYVEFMSUdOTUVOVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzIzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfRk9OVENPTE9SIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzMjQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9TSEFQRU1PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTMyNToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0RSQVdNT0RFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzMjY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9EUkFXTU9ERV9GT1JfTElORSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzI3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfU0NBTElOR01PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTMyODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0lOVEVSUE9MQVRJT05NRVRIT0QiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTMyOToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX09VVExJTkVNRVRIT0QiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTMzMDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0JPUkRFUl9TSVpFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzMzE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9CT1JERVJNRVRIT0QiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTMzMjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0NPTVBBUkVGVU5DVElPTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzMzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfVkVSVElDQUxfVEVYVF9BTElHTk1FTlQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTMzNDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0NPTlZFUlNJT05TVFlMRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzM1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0RJU1BBVENIX1NUQVRVU19DT05GTElDVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzM2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1VOS05PV05fQUxHT1JJVEhNIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzNDA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9TSVpFVFlQRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzQzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0ZJTEVfRklMRU5BTUVfTlVMTCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzQ1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfRkxJUEFYSVMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM0NjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0lOVEVSUE9MQVRJT05NRVRIT0RfRk9SX1JPVEFURSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzQ3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfM0RESVJFQ1RJT04iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM0ODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEXzNEUExBTkUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM0OToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1NLRUxFVE9OTUVUSE9EIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzNTA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9WSVNJT05fSU5GTyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzUxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfUkVDVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzUyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfRkVBVFVSRV9NT0RFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzNTM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9TRUFSQ0hfU1RSQVRFR1kiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM1NDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0NPTE9SX1dFSUdIVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzU1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTlVNX01BVENIRVNfUkVRVUVTVEVEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzNTY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NSU5fTUFUQ0hfU0NPUkUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM1NzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0NPTE9SX0lHTk9SRV9NT0RFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzNjA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ09NUExFWF9QTEFORSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzYxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfU1RFRVBORVNTIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzNjI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9XSURUSCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzYzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfU1VCU0FNUExJTkdfUkFUSU8iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM2NDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JR05PUkVfQ09MT1JfU1BFQ1RSVU1fU0VUIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzNjU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl9OT1NQRUNUUlVNIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzNjY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl9OT1NIQVBFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzNjc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl9ST1RBVElPTl81IjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzNjg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl9ST1RBVElPTl80IjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzNjk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl9ST1RBVElPTl8zIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzNzA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl9ST1RBVElPTl8yIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzNzE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl9ST1RBVElPTl8xIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzNzI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl9OT1JPVEFUSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzNzM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl9ST1RBVElPTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Mzc0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1JfU0hJRlRfMiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Mzc1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1JfU0hJRlRfMSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Mzc2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1JfTk9TSElGVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Mzc3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1JfU0hJRlQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM3ODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SXzYiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM3OToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SXzUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM4MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SXzQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM4MToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SXzMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM4MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SXzIiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM4MzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SXzEiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM4NDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzODU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ09MT1JfUk9UQVRJT05fUkVRVUlSRVNfU0hBUEVfRkVBVFVSRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Mzg2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NPTE9SX01BVENIX1NFVFVQX0RBVEFfU0hBUEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM4NzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9NQVRDSF9TRVRVUF9EQVRBIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzODg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ09MT1JfTEVBUk5fU0VUVVBfREFUQV9TSEFQRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Mzg5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NPTE9SX0xFQVJOX1NFVFVQX0RBVEEiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM5MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9URU1QTEFURV9JTUFHRV9MVU1JTkFOQ0VfQ09OVFJBU1RfVE9PX0xPVyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzkxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NPTE9SX1RFTVBMQVRFX0lNQUdFX0hVRV9DT05UUkFTVF9UT09fTE9XIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzOTI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ09MT1JfVEVNUExBVEVfSU1BR0VfVE9PX0xBUkdFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzOTM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ09MT1JfVEVNUExBVEVfSU1BR0VfVE9PX1NNQUxMIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzOTQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ09MT1JfU1BFQ1RSVU1fTUFTSyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Mzk1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NPTE9SX0lNQUdFX1JFUVVJUkVEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzOTc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ09NUExFWF9JTUFHRV9SRVFVSVJFRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Mzk5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX01VTFRJQ09SRV9JTlZBTElEX0FSR1VNRU5UIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU0MDA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTVVMVElDT1JFX09QRVJBVElPTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NDAxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTUFUQ0hGQUNUT1IiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTQwMjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX01BWFBPSU5UUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NDAzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0VYVFJBSU5GT19WRVJTSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU0MDQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9JTlRFUlBPTEFUSU9OTUVUSE9EX0ZPUl9VTldSQVAiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTQwNToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1RFWFRPUklFTlRBVElPTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NDA2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NPT1JEU1lTX05PVF9GT1VORCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NDA3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQ09OVFJBU1QiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTQwODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0RFVEVDVElPTl9NT0RFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU0MDk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9TVUJQSVhFTF9ESVZJU0lPTlMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTQxMDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0lDT05TX1BFUl9MSU5FIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1NDk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9OVU1CRVJfT0ZfT0JKRUNUU19UT19WRVJJRlkiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU1MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX0NIQVJBQ1RFUl9WQUxVRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTUxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX1JFTkFNRV9SRUZDSEFSIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1NTI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfTk9UX0FfVkFMSURfQ0hBUkFDVEVSX1NFVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTUzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfTUlOX0JPVU5ESU5HX1JFQ1RfSEVJR0hUIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1NTQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9SRUFEX1JFU09MVVRJT04iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU1NToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX1NQQUNJTkdfUkFOR0UiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU1NjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX0JPVU5ESU5HX1JFQ1RfSEVJR0hUX1JBTkdFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1NTc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9CT1VORElOR19SRUNUX1dJRFRIX1JBTkdFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1NTg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9DSEFSQUNURVJfU0laRV9SQU5HRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTU5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfUkVBRF9PUFRJT04iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU2MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX09CSkVDVF9JTkRFWCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTYxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfTlVNQkVSX09GX0NIQVJBQ1RFUlMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU2MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9CT09MRUFOX1ZBTFVFX0ZPUl9TVFJJTkdfQVRUUklCVVRFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1NjM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfVU5MSUNFTlNFRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTY0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfUFJFREVGSU5FRF9DSEFSQUNURVIiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU2NToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9NVVNUX0JFX1NJTkdMRV9DSEFSQUNURVIiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU2NjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9CT09MRUFOX1ZBTFVFX0ZPUl9JTlRFR0VSX0FUVFJJQlVURSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTY3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX1NUUklOR19WQUxVRV9GT1JfQk9PTEVBTl9BVFRSSUJVVEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU2ODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9TVFJJTkdfVkFMVUVfRk9SX0lOVEVHRVJfQVRUUklCVVRFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1Njk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9BVFRSSUJVVEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU3MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlRFR0VSX1ZBTFVFX0ZPUl9CT09MRUFOX0FUVFJJQlVURSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTcxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX0dFVF9PTkxZX0FUVFJJQlVURSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTcyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVEVHRVJfVkFMVUVfRk9SX1NUUklOR19BVFRSSUJVVEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU3MzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX0NIQVJBQ1RFUl9TRVRfRklMRV9WRVJTSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1NzQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfQ0hBUkFDVEVSX1NFVF9ERVNDUklQVElPTl9UT09fTE9ORyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTc1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfTlVNQkVSX09GX0VST1NJT05TIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1NzY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfQ0hBUkFDVEVSX1ZBTFVFX1RPT19MT05HIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1Nzc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfQ0hBUkFDVEVSX1ZBTFVFX0NBTk5PVF9CRV9FTVBUWVNUUklORyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTc4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfQ0hBUkFDVEVSX1NFVF9GSUxFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1Nzk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9BU1BFQ1RfUkFUSU8iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU4MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX01JTl9CT1VORElOR19SRUNUX1dJRFRIIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1ODE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9NQVhfVkVSVF9FTEVNRU5UX1NQQUNJTkciO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU4MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX01BWF9IT1JJWl9FTEVNRU5UX1NQQUNJTkciO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU4MzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX01JTl9DSEFSX1NQQUNJTkciO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU4NDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX1RIUkVTSE9MRF9MSU1JVFMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU4NToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX1VQUEVSX1RIUkVTSE9MRF9MSU1JVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTg2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfTE9XRVJfVEhSRVNIT0xEX0xJTUlUIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1ODc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9USFJFU0hPTERfUkFOR0UiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU4ODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX0hJR0hfVEhSRVNIT0xEX1ZBTFVFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1ODk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9MT1dfVEhSRVNIT0xEX1ZBTFVFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1OTA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9OVU1CRVJfT0ZfVkFMSURfQ0hBUkFDVEVSX1BPU0lUSU9OUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTkxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfQ0hBUkFDVEVSX0lOREVYIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1OTI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9SRUFEX1NUUkFURUdZIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1OTM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9OVU1CRVJfT0ZfQkxPQ0tTIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1OTQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9TVUJTVElUVVRJT05fQ0hBUkFDVEVSIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1OTU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9USFJFU0hPTERfTU9ERSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTk2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfQ0hBUkFDVEVSX1NJWkUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU5NzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9OT1RfQV9WQUxJRF9TRVNTSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1OTg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9BQ0NFUFRBTkNFX0xFVkVMIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU2MDA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5GT19OT1RfRk9VTkQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTYwMToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0VER0VfVEhSRVNIT0xEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU2MDI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NSU5JTVVNX0NVUlZFX0xFTkdUSCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjAzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfUk9XX1NURVAiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTYwNDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0NPTFVNTl9TVEVQIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU2MDU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NQVhJTVVNX0VORF9QT0lOVF9HQVAiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTYwNjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX01JTklNVU1fRkVBVFVSRVNfVE9fTUFUQ0giO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTYwNzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX01BWElNVU1fRkVBVFVSRVNfUEVSX01BVENIIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU2MDg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9TVUJQSVhFTF9JVEVSQVRJT05TIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU2MDk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9TVUJQSVhFTF9UT0xFUkFOQ0UiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTYxMDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0lOSVRJQUxfTUFUQ0hfTElTVF9MRU5HVEgiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTYxMToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX01JTklNVU1fUkVDVEFOR0xFX0RJTUVOU0lPTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjEyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTUlOSU1VTV9GRUFUVVJFX1JBRElVUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjEzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTUlOSU1VTV9GRUFUVVJFX0xFTkdUSCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjE0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTUlOSU1VTV9GRUFUVVJFX0FTUEVDVF9SQVRJTyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjE1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTUlOSU1VTV9GRUFUVVJFX1NUUkVOR1RIIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU2MTY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9FREdFX0ZJTFRFUl9TSVpFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU2MTc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9OVU1CRVJfT0ZfRkVBVFVSRVNfUkFOR0UiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTYxODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9UT09fTUFOWV9TQ0FMRV9SQU5HRVMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTYxOToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9UT09fTUFOWV9PQ0NMVVNJT05fUkFOR0VTIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU2MjA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9DVVJWRV9FWFRSQUNUSU9OX01PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTYyMToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0xFQVJOX0dFT01FVFJJQ19QQVRURVJOX1NFVFVQX0RBVEEiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTYyMjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX01BVENIX0dFT01FVFJJQ19QQVRURVJOX1NFVFVQX0RBVEEiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTYyMzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1NDQUxFX1JBTkdFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU2MjQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9PQ0NMVVNJT05fUkFOR0UiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTYyNToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX01BVENIX0NPTlNUUkFJTlRfVFlQRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjI2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05PVF9FTk9VR0hfVEVNUExBVEVfRkVBVFVSRVMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTYyNzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OT1RfRU5PVUdIX1RFTVBMQVRFX0ZFQVRVUkVTXzEiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTYyODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0dFT01FVFJJQ19NQVRDSElOR19URU1QTEFURSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjI5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTUFYSU1VTV9QSVhFTF9ESVNUQU5DRV9GUk9NX0xJTkUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTYzMDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX01BWElNVU1fRkVBVFVSRVNfTEVBUk5FRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjMxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTUlOX01BVENIX1NFUEFSQVRJT05fRElTVEFOQ0UiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTYzMjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX01JTl9NQVRDSF9TRVBBUkFUSU9OX0FOR0xFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU2MzM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NSU5fTUFUQ0hfU0VQQVJBVElPTl9TQ0FMRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjM0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTUFYX01BVENIX09WRVJMQVAiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTYzNToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1NIQVBFX0RFU0NSSVBUT1IiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTYzNjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9ESVJFQ1RYX05PVF9GT1VORCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjM3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0hBUkRXQVJFX0RPRVNOVF9TVVBQT1JUX05PTlRFQVJJTkciO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTYzODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0ZJTExfU1RZTEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTYzOToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0hBVENIX1NUWUxFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU2NDA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVE9PX01BTllfWk9ORVMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTY0MToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9EVVBMSUNBVEVfTEFCRUwiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTY0MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9MQUJFTF9OT1RfRk9VTkQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTY0MzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX05VTUJFUl9PRl9NQVRDSF9PUFRJT05TIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU2NDQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTEFCRUxfVE9PX0xPTkciO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTY0NToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX05VTUJFUl9PRl9MQUJFTFMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTY0NjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OT19URU1QTEFURV9UT19MRUFSTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjQ3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTVVMVElQTEVfR0VPTUVUUklDX1RFTVBMQVRFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU2NDg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVEVNUExBVEVfTk9UX0xFQVJORUQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTY0OToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0dFT01FVFJJQ19GRUFUVVJFX1RZUEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTY1MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DVVJWRV9FWFRSQUNUSU9OX01PREVfTVVTVF9CRV9TQU1FIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU2NTE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRURHRV9GSUxURVJfU0laRV9NVVNUX0JFX1NBTUUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTY1MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9PUEVOSU5HX05FV0VSX0dFT01FVFJJQ19NQVRDSElOR19URU1QTEFURSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjUzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX09QRU5JTkdfTkVXRVJfTVVMVElQTEVfR0VPTUVUUklDX1RFTVBMQVRFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU2NTQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfR1JBRElOR19JTkZPUk1BVElPTl9OT1RfRk9VTkQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTY1NToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9FTkFCTEVfQ0FMSUJSQVRJT05fU1VQUE9SVF9NVVNUX0JFX1NBTUUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTY1NjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9TTU9PVEhfQ09OVE9VUlNfTVVTVF9CRV9TQU1FIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3MDA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUkVRVUlSRVNfV0lOMjAwMF9PUl9ORVdFUiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzAxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTUFUUklYX1NJWkVfUkFOR0UiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTcwMjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0xFTkdUSCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzAzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfVFlQRV9PRl9GTEFUVEVOIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3MDQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9DT01QUkVTU0lPTl9UWVBFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3MDU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfREFUQV9DT1JSVVBURUQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTcwNjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9BVklfU0VTU0lPTl9BTFJFQURZX09QRU4iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTcwNzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9BVklfV1JJVEVfU0VTU0lPTl9SRVFVSVJFRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzA4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0FWSV9SRUFEX1NFU1NJT05fUkVRVUlSRUQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTcwOToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9BVklfVU5PUEVORURfU0VTU0lPTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzEwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1RPT19NQU5ZX1BBUlRJQ0xFUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzExOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05PVF9FTk9VR0hfUkVHSU9OUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzEyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1dST05HX1JFR0lPTl9UWVBFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3MTM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVkFMVUVfTk9UX0lOX0VOVU0iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTcxNDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0FYSVNfT1JJRU5UQVRJT04iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTcxNToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0NBTElCUkFUSU9OX1VOSVQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTcxNjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1NDQUxJTkdfTUVUSE9EIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3MTc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9SQU5HRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzE4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0xBQl9WRVJTSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3MTk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQkFEX1JPSV9CT1giO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTcyMDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9CQURfUk9JIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3MjE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9CSVRfREVQVEgiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTcyMjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DTEFTU0lGSUVSX0NMQVNTSUZZX0lNQUdFX1dJVEhfQ1VTVE9NX1NFU1NJT04iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTcyMzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DVVNUT01EQVRBX0tFWV9OT1RfRk9VTkQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTcyNDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DVVNUT01EQVRBX0lOVkFMSURfU0laRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzI1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0RBVEFfVkVSU0lPTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzI2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX01BVENIRkFDVE9SX09CU09MRVRFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3Mjc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVU5TVVBQT1JURURfMkRfQkFSQ09ERV9TRUFSQ0hfTU9ERSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzI4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfMkRfQkFSQ09ERV9TRUFSQ0hfTU9ERSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzU0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1RSSUdfVElNRU9VVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzU2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0RMTF9GVU5DVElPTl9OT1RfRk9VTkQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTc1NzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9ETExfTk9UX0ZPVU5EIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3NTg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQk9BUkRfTk9UX09QRU4iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTc2MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9CT0FSRF9OT1RfRk9VTkQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTc2MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX05JQkxBQ0tfREVWSUFUSU9OX0ZBQ1RPUiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzYzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTk9STUFMSVpBVElPTl9NRVRIT0QiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTc2NjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9ERVBSRUNBVEVEX0ZVTkNUSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3Njc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9BTElHTk1FTlQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTc2ODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1NDQUxFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3Njk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9FREdFX1RISUNLTkVTUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzcwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfSU5TUEVDVElPTl9URU1QTEFURSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzcxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX09QRU5JTkdfTkVXRVJfSU5TUEVDVElPTl9URU1QTEFURSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzcyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfUkVHSVNUUkFUSU9OX01FVEhPRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzczOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05PX0RFU1RfSU1BR0UiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTc3NDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OT19MQUJFTCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Nzc1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1JPSV9IQVNfT1BFTl9DT05UT1VSUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Nzc2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfVVNFX09GX0NPTVBBQ1RfU0VTU0lPTl9GSUxFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3Nzc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5DT01QQVRJQkxFX0NMQVNTSUZJRVJfVFlQRVMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTc3ODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0tFUk5FTF9TSVpFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3Nzk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ0FOTk9UX0NPTVBBQ1RfVU5UUkFJTkVEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3ODA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9QQVJUSUNMRV9UWVBFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3ODE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ0xBU1NJRklFUl9JTlZBTElEX0VOR0lORV9UWVBFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3ODI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfREVTQ1JJUFRJT05fVE9PX0xPTkciO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTc4MzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9CQURfU0FNUExFX0lOREVYIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3ODQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9MSU1JVFMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTc4NToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OT19QQVJUSUNMRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Nzg2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfUEFSVElDTEVfT1BUSU9OUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Nzg3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQ0xBU1NJRklFUl9UWVBFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3ODg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTk9fU0FNUExFUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Nzg5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX09QRU5JTkdfTkVXRVJfQ0xBU1NJRklFUl9TRVNTSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3OTA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9ESVNUQU5DRV9NRVRSSUMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTc5MToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DTEFTU0lGSUVSX0lOVkFMSURfU0VTU0lPTl9UWVBFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3OTI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ0xBU1NJRklFUl9TRVNTSU9OX05PVF9UUkFJTkVEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3OTM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9PUEVSQVRJT05fT05fQ09NUEFDVF9TRVNTSU9OX0FUVEVNUFRFRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Nzk0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0tfVE9PX0hJR0giO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTc5NToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9LX1RPT19MT1ciO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTc5NjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0tOTl9NRVRIT0QiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTc5NzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0NMQVNTSUZJRVJfU0VTU0lPTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Nzk4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQ1VTVE9NX1NBTVBMRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Nzk5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVEVSTkFMIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU4MDA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUFJPVEVDVElPTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1ODAxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1RPT19NQU5ZX0NPTlRPVVJTIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU4Mzc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9DT01QUkVTU0lPTl9SQVRJTyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1ODQwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0JBRF9JTkRFWCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1ODc1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0JBUkNPREVfUEhBUk1BQ09ERSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1ODc2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1VOU1VQUE9SVEVEX0NPTE9SX01PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTg3NzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUk1PREVfUkVRVUlSRVNfQ0hBTkdFQ09MT1JTUEFDRTIiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTg3ODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9QUk9QX05PREVfV1JJVEVfTk9UX1NVUFBPUlRFRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1ODc5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0JBRF9NRUFTVVJFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU4ODA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUEFSVElDTEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTkyMDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OVU1CRVJfQ0xBU1MiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTk1MzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1dBVkVMRVRfVFJBTlNGT1JNX01PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTk1NDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1FVQU5USVpBVElPTl9TVEVQX1NJWkUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTk1NToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX01BWF9XQVZFTEVUX1RSQU5TRk9STV9MRVZFTCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1OTU2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfUVVBTElUWSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1OTU3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0FSUkFZX1NJWkVfTUlTTUFUQ0giO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTk1ODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9XSU5ET1dfSUQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTk1OToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DUkVBVEVfV0lORE9XIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU5NjA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5JVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1OTcxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfT0ZGU0VUIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU5NzI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRElSRUNUWF9FTlVNRVJBVEVfRklMVEVSUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1OTczOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0pQRUcyMDAwX1VOU1VQUE9SVEVEX01VTFRJUExFX0xBWUVSUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1OTc0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1VOU1VQUE9SVEVEX0pQRUcyMDAwX0NPTE9SU1BBQ0VfTUVUSE9EIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU5NzU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQVZJX1RJTUVPVVQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTk3NjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OVU1CRVJfT0ZfUEFMRVRURV9DT0xPUlMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTk3NzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9BVklfVkVSU0lPTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1OTc4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfUEFSVElDTEVfTlVNQkVSIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU5Nzk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9QQVJUSUNMRV9JTkZPIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU5ODA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ09NX0lOSVRJQUxJWkUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTk4MToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlNVRkZJQ0lFTlRfQlVGRkVSX1NJWkUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTk4MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0ZSQU1FU19QRVJfU0VDT05EIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU5ODM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRklMRV9OT19TUEFDRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1OTg0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0ZJTEVfSU5WQUxJRF9EQVRBX1RZUEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTk4NToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9GSUxFX09QRVJBVElPTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1OTg2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0ZJTEVfRk9STUFUIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU5ODc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRklMRV9FT0YiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTk4ODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9GSUxFX1dSSVRFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU5ODk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRklMRV9SRUFEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU5OTA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRklMRV9HRVRfSU5GTyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1OTkxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0ZJTEVfSU5WQUxJRF9UWVBFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU5OTI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRklMRV9QRVJNSVNTSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU5OTM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRklMRV9JT19FUlIiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTk5NDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9GSUxFX1RPT19NQU5ZX09QRU4iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTk5NToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9GSUxFX05PVF9GT1VORCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1OTk2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0ZJTEVfT1BFTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1OTk3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0ZJTEVfQVJHRVJSIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU5OTg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRklMRV9DT0xPUl9UQUJMRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1OTk5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0ZJTEVfRklMRV9UWVBFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwMDA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRklMRV9GSUxFX0hFQURFUiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDAxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1RPT19NQU5ZX0FWSV9TRVNTSU9OUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDAyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTElORUdBVUdFTUVUSE9EIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwMDM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQVZJX0RBVEFfRVhDRUVEU19CVUZGRVJfU0laRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDA0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0RJUkVDVFhfQ0VSVElGSUNBVElPTl9GQUlMVVJFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwMDU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9BVklfU0VTU0lPTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDA2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0RJUkVDVFhfVU5LTk9XTl9DT01QUkVTU0lPTl9GSUxURVIiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjAwNzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9ESVJFQ1RYX0lOQ09NUEFUSUJMRV9DT01QUkVTU0lPTl9GSUxURVIiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjAwODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9ESVJFQ1RYX05PX0ZJTFRFUiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDA5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0RJUkVDVFgiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjAxMDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0ZSQU1FX05VTUJFUiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDExOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1JQQ19CSU5EIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwMTI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUlBDX0VYRUNVVEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjAxMzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1ZJREVPX01PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjAxNDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1ZJREVPX0JMSVQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjAxNToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9SUENfRVhFQ1VURV9JVkIiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjAxNjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OT19WSURFT19EUklWRVIiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjAxNzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9PUEVOSU5HX05FV0VSX0FJTV9HUkFESU5HX0RBVEEiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjAxODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0VER0VfUE9MQVJJVFlfU0VBUkNIX01PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjAxOToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1RIUkVTSE9MRF9QRVJDRU5UQUdFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwMjA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9HUkFESU5HX01PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjAyMToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0tFUk5FTF9TSVpFX0ZPUl9FREdFX0RFVEVDVElPTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDIyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfU0VBUkNIX01PREVfRk9SX1NUUkFJR0hUX0VER0UiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjAyMzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0FOR0xFX1RPTF9GT1JfU1RSQUlHSFRfRURHRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDI0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTUlOX0NPVkVSQUdFX0ZPUl9TVFJBSUdIVF9FREdFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwMjU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9BTkdMRV9SQU5HRV9GT1JfU1RSQUlHSFRfRURHRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDI2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfUFJPQ0VTU19UWVBFX0ZPUl9FREdFX0RFVEVDVElPTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDMyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1RFTVBMQVRFREVTQ1JJUFRPUl9ST1RBVElPTl9TRUFSQ0hTVFJBVEVHWSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDMzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1RFTVBMQVRFREVTQ1JJUFRPUl9MRUFSTlNFVFVQREFUQSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDM0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1RFTVBMQVRFSU1BR0VfRURHRUlORk8iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjAzNToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9URU1QTEFURUlNQUdFX05PQ0lSQ0xFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwMzY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9TS0VMRVRPTk1PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjAzNzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9USU1FT1VUIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwMzg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRklORF9DT09SRFNZU19NT1JFX1RIQU5fT05FX0VER0UiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjAzOToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JT19FUlJPUiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDQwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0RSSVZFUiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDQxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfMkRfQkFSQ09ERV9UWVBFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwNDI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF8yRF9CQVJDT0RFX0NPTlRSQVNUIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwNDM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF8yRF9CQVJDT0RFX0NFTExfU0hBUEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA0NDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEXzJEX0JBUkNPREVfU0hBUEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA0NToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEXzJEX0JBUkNPREVfU1VCVFlQRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDQ2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfMkRfQkFSQ09ERV9DT05UUkFTVF9GT1JfUk9JIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwNDc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9MSU5FQVJfQVZFUkFHRV9NT0RFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwNDg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9DRUxMX1NBTVBMRV9TSVpFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwNDk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NQVRSSVhfUE9MQVJJVFkiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA1MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0VDQ19UWVBFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwNTE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9DRUxMX0ZJTFRFUl9NT0RFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwNTI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9ERU1PRFVMQVRJT05fTU9ERSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDUzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQk9SREVSX0lOVEVHUklUWSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDU0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQ0VMTF9GSUxMX1RZUEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA1NToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0FTUEVDVF9SQVRJTyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDU2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTUFUUklYX01JUlJPUl9NT0RFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwNTc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9TRUFSQ0hfVkVDVE9SX1dJRFRIIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwNTg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9ST1RBVElPTl9NT0RFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwNTk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NQVhfSVRFUkFUSU9OUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDYwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0pQRUcyMDAwX0xPU1NMRVNTX1dJVEhfRkxPQVRJTkdfUE9JTlQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA2MToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1dJTkRPV19TSVpFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwNjI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9UT0xFUkFOQ0UiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA2MzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9FWFRFUk5BTF9BTElHTk1FTlQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA2NDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9FWFRFUk5BTF9OT1RfU1VQUE9SVEVEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwNjU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ0FOVF9SRVNJWkVfRVhURVJOQUwiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA2NjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1BPSU5UU1lNQk9MIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwNjc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU1BR0VTX05PVF9ESUZGIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwNjg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9BQ1RJT04iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA2OToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0NPTE9SX01PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA3MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0ZVTkNUSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwNzE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9TQ0FOX0RJUkVDVElPTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDcyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQk9SREVSIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwNzM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTUFTS19PVVRTSURFX0lNQUdFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwNzQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5DT01QX1NJWkUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA3NToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT09SRF9TWVNfU0VDT05EX0FYSVMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA3NjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT09SRF9TWVNfRklSU1RfQVhJUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDc3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOQ09NUF9UWVBFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwNzk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NRVRBRklMRV9IQU5ETEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA4MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0lNQUdFX1RZUEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA4MToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9CQURfUEFTU1dPUkQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA4MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9QQUxFVFRFX05PVF9TVVBQT1JURUQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA4MzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9ST0xMQkFDS19USU1FT1VUIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwODQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUk9MTEJBQ0tfREVMRVRFX1RJTUVSIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwODU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUk9MTEJBQ0tfSU5JVF9USU1FUiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDg2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1JPTExCQUNLX1NUQVJUX1RJTUVSIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwODc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUk9MTEJBQ0tfU1RPUF9USU1FUiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDg4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1JPTExCQUNLX1JFU0laRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDg5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1JPTExCQUNLX1JFU09VUkNFX1JFSU5JVElBTElaRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDkwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1JPTExCQUNLX1JFU09VUkNFX0VOQUJMRUQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA5MToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9ST0xMQkFDS19SRVNPVVJDRV9VTklOSVRJQUxJWkVEX0VOQUJMRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDkyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1JPTExCQUNLX1JFU09VUkNFX05PTl9FTVBUWV9JTklUSUFMSVpFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwOTM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUk9MTEJBQ0tfUkVTT1VSQ0VfTE9DS0VEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwOTQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUk9MTEJBQ0tfUkVTT1VSQ0VfQ0FOTk9UX1VOTE9DSyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDk1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NBTElCUkFUSU9OX0RVUExJQ0FURV9SRUZFUkVOQ0VfUE9JTlQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA5NjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OT1RfQU5fT0JKRUNUIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwOTc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9QQVJUSUNMRV9QQVJBTUVURVJfVkFMVUUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA5ODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9SRVNFUlZFRF9NVVNUX0JFX05VTEwiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA5OToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQUxJQlJBVElPTl9JTkZPX1NJTVBMRV9UUkFOU0ZPUk0iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjEwMDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQUxJQlJBVElPTl9JTkZPX1BFUlNQRUNUSVZFX1BST0pFQ1RJT04iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjEwMToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQUxJQlJBVElPTl9JTkZPX01JQ1JPX1BMQU5FIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxMDI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ0FMSUJSQVRJT05fSU5GT182IjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxMDM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ0FMSUJSQVRJT05fSU5GT181IjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxMDQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ0FMSUJSQVRJT05fSU5GT180IjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxMDU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ0FMSUJSQVRJT05fSU5GT18zIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxMDY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ0FMSUJSQVRJT05fSU5GT18yIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxMDc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ0FMSUJSQVRJT05fSU5GT18xIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxMDg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ0FMSUJSQVRJT05fRVJST1JNQVAiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjEwOToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQUxJQlJBVElPTl9JTlZBTElEX1NDQUxJTkdfRkFDVE9SIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxMTA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ0FMSUJSQVRJT05fSU5GT19WRVJTSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxMTE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ0FMSUJSQVRJT05fRkFJTEVEX1RPX0ZJTkRfR1JJRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTEyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOQ09NUF9NQVRSSVhfU0laRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTEzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NBTElCUkFUSU9OX0lNQUdFX1VOQ0FMSUJSQVRFRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTE0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NBTElCUkFUSU9OX0lOVkFMSURfUk9JIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxMTU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ0FMSUJSQVRJT05fSU1BR0VfQ09SUkVDVEVEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxMTY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ0FMSUJSQVRJT05fSU5TRl9QT0lOVFMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjExNzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9NQVRSSVhfU0laRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTE4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfU1RFUF9TSVpFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxMTk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ1VTVE9NREFUQV9JTlZBTElEX0tFWSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTIwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05PVF9JTUFHRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTIxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1NBVFVSQVRJT05fVEhSRVNIT0xEX09VVF9PRl9SQU5HRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTIyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0RSQVdURVhUX0NPTE9SX01VU1RfQkVfR1JBWVNDQUxFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxMjM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9DQUxJQlJBVElPTl9NT0RFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxMjQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9DQUxJQlJBVElPTl9ST0lfTU9ERSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTI1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQ09OVFJBU1RfVEhSRVNIT0xEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxMjY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUk9MTEJBQ0tfUkVTT1VSQ0VfQ09ORkxJQ1RfMSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTI3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1JPTExCQUNLX1JFU09VUkNFX0NPTkZMSUNUXzIiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjEyODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9ST0xMQkFDS19SRVNPVVJDRV9DT05GTElDVF8zIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxMjk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUk9MTEJBQ0tfVU5CT1VOREVEX0lOVEVSRkFDRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTMwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05PVF9SRUNUX09SX1JPVEFURURfUkVDVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTMyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX01BU0tfTk9UX1RFTVBMQVRFX1NJWkUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjEzMzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9USFJFQURfQ09VTERfTk9UX0lOSVRJQUxJWkUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjEzNDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9USFJFQURfSU5JVElBTElaSU5HIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxMzU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9CVVRUT05fTEFCRUwiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjEzNjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9ESVJFQ1RYX0lOVkFMSURfRklMVEVSX1FVQUxJVFkiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjEzNzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9ESVJFQ1RYX0RMTF9OT1RfRk9VTkQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjEzODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9ST0xMQkFDS19OT1RfU1VQUE9SVEVEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxMzk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUk9MTEJBQ0tfUkVTT1VSQ0VfT1VUX09GX01FTU9SWSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTQwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0JBUkNPREVfQ09ERTEyOF9TRVQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjE0MToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9CQVJDT0RFX0NPREUxMjhfRk5DIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxNDI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQkFSQ09ERV9JTlZBTElEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxNDM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQkFSQ09ERV9UWVBFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxNDQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQkFSQ09ERV9DT0RFOTNfU0hJRlQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjE0NToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9CQVJDT0RFX1VQQ0EiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjE0NjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9CQVJDT0RFX01TSSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTQ3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0JBUkNPREVfSTI1IjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxNDg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQkFSQ09ERV9FQU4xMyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTQ5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0JBUkNPREVfRUFOOCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTUwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0JBUkNPREVfQ09ERTEyOCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTUxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0JBUkNPREVfQ09ERTkzIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxNTI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQkFSQ09ERV9DT0RFMzkiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjE1MzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9CQVJDT0RFX0NPREFCQVIiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjE1NDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTUFHRV9UT09fU01BTEwiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjE1NToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9VTklOSVQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjE1NjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9ORUVEX0ZVTExfVkVSU0lPTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTU3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1VOUkVHSVNURVJFRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTU4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX01FTU9SWV9FUlJPUiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTU5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX09VVF9PRl9NRU1PUlkiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjE2MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9TWVNURU1fRVJST1IiO2JyZWFrO30KKwkJY2FzZSAwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1NVQ0NFU1MiO2JyZWFrO30KKwkJLy8gZW5kIE5hdGlvbmFsIEluc3RydW1lbnRzIGRlZmluZWQgZXJyb3JzCisJCQkKKwkJLy8gYmVnaW4gQkFFIGRlZmluZWQgZXJyb3JzCisJCWNhc2UgRVJSX1ZJU0lPTl9HRU5FUkFMX0VSUk9SOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1ZJU0lPTl9HRU5FUkFMX0VSUk9SIjticmVhazt9CisJCWNhc2UgRVJSX0NPTE9SX05PVF9GT1VORDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9OT1RfRk9VTkQiO2JyZWFrO30KKwkJY2FzZSBFUlJfUEFSVElDTEVfVE9PX1NNQUxMOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1BBUlRJQ0xFX1RPT19TTUFMTCI7YnJlYWs7fQorCQljYXNlIEVSUl9DQU1FUkFfRkFJTFVSRToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQU1FUkFfRkFJTFVSRSI7YnJlYWs7fQorCQljYXNlIEVSUl9DQU1FUkFfU09DS0VUX0NSRUFURV9GQUlMRUQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ0FNRVJBX1NPQ0tFVF9DUkVBVEVfRkFJTEVEIjticmVhazt9CisJCWNhc2UgRVJSX0NBTUVSQV9DT05ORUNUX0ZBSUxFRDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQU1FUkFfQ09OTkVDVF9GQUlMRUQiO2JyZWFrO30KKwkJY2FzZSBFUlJfQ0FNRVJBX1NUQUxFX0lNQUdFOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NBTUVSQV9TVEFMRV9JTUFHRSI7YnJlYWs7fQorCQljYXNlIEVSUl9DQU1FUkFfTk9UX0lOSVRJQUxJWkVEOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NBTUVSQV9OT1RfSU5JVElBTElaRUQiO2JyZWFrO30KKwkJY2FzZSBFUlJfQ0FNRVJBX05PX0JVRkZFUl9BVkFJTEFCTEU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ0FNRVJBX05PX0JVRkZFUl9BVkFJTEFCTEUiO2JyZWFrO30KKwkJY2FzZSBFUlJfQ0FNRVJBX0hFQURFUl9FUlJPUjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQU1FUkFfSEVBREVSX0VSUk9SIjticmVhazt9CisJCWNhc2UgRVJSX0NBTUVSQV9CTE9DS0lOR19USU1FT1VUOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NBTUVSQV9CTE9DS0lOR19USU1FT1VUIjticmVhazt9CisJCWNhc2UgRVJSX0NBTUVSQV9BVVRIT1JJWkFUSU9OX0ZBSUxFRDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQU1FUkFfQVVUSE9SSVpBVElPTl9GQUlMRUQiO2JyZWFrO30KKwkJY2FzZSBFUlJfQ0FNRVJBX1RBU0tfU1BBV05fRkFJTEVEOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NBTUVSQV9UQVNLX1NQQVdOX0ZBSUxFRCI7YnJlYWs7fQorCQljYXNlIEVSUl9DQU1FUkFfVEFTS19JTlBVVF9PVVRfT0ZfUkFOR0U6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ0FNRVJBX1RBU0tfSU5QVVRfT1VUX09GX1JBTkdFIjticmVhazt9CisJCWNhc2UgRVJSX0NBTUVSQV9DT01NQU5EX0ZBSUxVUkU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ0FNRVJBX0NPTU1BTkRfRkFJTFVSRSI7YnJlYWs7fQorCX0KKwkKKwlyZXR1cm4gZXJyb3JUZXh0OworfQorCisKKwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9WaXNpb24vSFNMSW1hZ2UuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9WaXNpb24vSFNMSW1hZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNjY5NDkKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1Zpc2lvbi9IU0xJbWFnZS5jcHAKQEAgLTAsMCArMSwyOCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJWaXNpb24vSFNMSW1hZ2UuaCIKKworLyoqCisgKiBDcmVhdGUgYSBuZXcgaW1hZ2UgdGhhdCB1c2VzIHRoZSBIdWUsIFNhdHVyYXRpb24sIGFuZCBMdW1pbmFuY2UgcGxhbmVzLgorICovCitIU0xJbWFnZTo6SFNMSW1hZ2UoKSA6IENvbG9ySW1hZ2UoSU1BUV9JTUFHRV9IU0wpCit7Cit9CisKKy8qKgorICogQ3JlYXRlIGEgbmV3IGltYWdlIGJ5IGxvYWRpbmcgYSBmaWxlLgorICogQHBhcmFtIGZpbGVOYW1lIFRoZSBwYXRoIG9mIHRoZSBmaWxlIHRvIGxvYWQuCisgKi8KK0hTTEltYWdlOjpIU0xJbWFnZShjb25zdCBjaGFyICpmaWxlTmFtZSkgOiBDb2xvckltYWdlKElNQVFfSU1BR0VfSFNMKQoreworCWludCBzdWNjZXNzID0gaW1hcVJlYWRGaWxlKG1faW1hcUltYWdlLCBmaWxlTmFtZSwgTlVMTCwgTlVMTCk7CisJd3BpX3NldEltYXFFcnJvcldpdGhDb250ZXh0KHN1Y2Nlc3MsICJJbWFxIFJlYWRGaWxlIGVycm9yIik7Cit9CisKK0hTTEltYWdlOjp+SFNMSW1hZ2UoKQoreworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9WaXNpb24vSW1hZ2VCYXNlLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvVmlzaW9uL0ltYWdlQmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE1NDliNgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvVmlzaW9uL0ltYWdlQmFzZS5jcHAKQEAgLTAsMCArMSw3MyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJWaXNpb24vSW1hZ2VCYXNlLmgiCisjaW5jbHVkZSAibml2aXNpb24uaCIKKworLyoqCisgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgYW4gSW1hZ2VCYXNlLgorICogSW1hZ2ViYXNlIGlzIHRoZSBiYXNlIG9mIGFsbCB0aGUgb3RoZXIgaW1hZ2UgY2xhc3Nlcy4gVGhlIGNvbnN0cnVjdG9yCisgKiBjcmVhdGVzIGFueSB0eXBlIG9mIGltYWdlIGFuZCBzdG9yZXMgdGhlIHBvaW50ZXIgdG8gaXQgaW4gdGhlIGNsYXNzLgorICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgaW1hZ2UgdG8gY3JlYXRlCisgKi8KK0ltYWdlQmFzZTo6SW1hZ2VCYXNlKEltYWdlVHlwZSB0eXBlKQoreworCW1faW1hcUltYWdlID0gaW1hcUNyZWF0ZUltYWdlKHR5cGUsIERFRkFVTFRfQk9SREVSX1NJWkUpOworfQorCisvKioKKyAqIEZyZWVzIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggYW4gSW1hZ2VCYXNlLgorICogRGVzdHJ1Y3RvciBmcmVlcyB0aGUgaW1hcSBpbWFnZSBhbGxvY2F0ZWQgd2l0aCB0aGUgY2xhc3MuCisgKi8KK0ltYWdlQmFzZTo6fkltYWdlQmFzZSgpCit7CisJaWYobV9pbWFxSW1hZ2UpCisJCWltYXFEaXNwb3NlKG1faW1hcUltYWdlKTsKK30KKworLyoqCisgKiBXcml0ZXMgYW4gaW1hZ2UgdG8gYSBmaWxlIHdpdGggdGhlIGdpdmVuIGZpbGVuYW1lLgorICogV3JpdGUgdGhlIGltYWdlIHRvIGEgZmlsZSBpbiB0aGUgZmxhc2ggb24gdGhlIGNSSU8uCisgKiBAcGFyYW0gZmlsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gd3JpdGUKKyAqLwordm9pZCBJbWFnZUJhc2U6OldyaXRlKGNvbnN0IGNoYXIgKmZpbGVOYW1lKQoreworCWludCBzdWNjZXNzID0gaW1hcVdyaXRlRmlsZShtX2ltYXFJbWFnZSwgZmlsZU5hbWUsIE5VTEwpOworCXdwaV9zZXRJbWFxRXJyb3JXaXRoQ29udGV4dChzdWNjZXNzLCAiSW1hcSBJbWFnZSB3cml0ZUZpbGUgZXJyb3IiKTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBoZWlnaHQgb2YgYW4gaW1hZ2UuCisgKiBAcmV0dXJuIFRoZSBoZWlnaHQgb2YgdGhlIGltYWdlIGluIHBpeGVscy4KKyAqLworaW50IEltYWdlQmFzZTo6R2V0SGVpZ2h0KCkKK3sKKwlpbnQgaGVpZ2h0OworCWltYXFHZXRJbWFnZVNpemUobV9pbWFxSW1hZ2UsIE5VTEwsICZoZWlnaHQpOworCXJldHVybiBoZWlnaHQ7Cit9CisKKy8qKgorICogR2V0cyB0aGUgd2lkdGggb2YgYW4gaW1hZ2UuCisgKiBAcmV0dXJuIFRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UgaW4gcGl4ZWxzLgorICovCitpbnQgSW1hZ2VCYXNlOjpHZXRXaWR0aCgpCit7CisJaW50IHdpZHRoOworCWltYXFHZXRJbWFnZVNpemUobV9pbWFxSW1hZ2UsICZ3aWR0aCwgTlVMTCk7CisJcmV0dXJuIHdpZHRoOworfQorCisvKioKKyAqIEFjY2VzcyB0aGUgaW50ZXJuYWwgSU1BUSBJbWFnZSBkYXRhIHN0cnVjdHVyZS4KKyAqIAorICogQHJldHVybiBBIHBvaW50ZXIgdG8gdGhlIGludGVybmFsIElNQVEgSW1hZ2UgZGF0YSBzdHJ1Y3R1cmUuCisgKi8KK0ltYWdlICpJbWFnZUJhc2U6OkdldEltYXFJbWFnZSgpCit7CisJcmV0dXJuIG1faW1hcUltYWdlOworfQorCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1Zpc2lvbi9Nb25vSW1hZ2UuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9WaXNpb24vTW9ub0ltYWdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2VmZTIwCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9WaXNpb24vTW9ub0ltYWdlLmNwcApAQCAtMCwwICsxLDU1IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE0LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIlZpc2lvbi9Nb25vSW1hZ2UuaCIKKyNpbmNsdWRlICJuaXZpc2lvbi5oIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitNb25vSW1hZ2U6Ok1vbm9JbWFnZSgpIDogSW1hZ2VCYXNlKElNQVFfSU1BR0VfVTgpCit7Cit9CisKK01vbm9JbWFnZTo6fk1vbm9JbWFnZSgpCit7Cit9CisKKy8qKgorICogTG9vayBmb3IgZWxsaXBzZXMgaW4gYW4gaW1hZ2UuCisgKiBHaXZlbiBzb21lIGlucHV0IHBhcmFtZXRlcnMsIGxvb2sgZm9yIGFueSBudW1iZXIgb2YgZWxsaXBzZXMgaW4gYW4gaW1hZ2UuCisgKiBAcGFyYW0gZWxsaXBzZURlc2NyaXB0b3IgRWxsaXBzZSBkZXNjcmlwdG9yCisgKiBAcGFyYW0gY3VydmVPcHRpb25zIEN1cnZlIG9wdGlvbnMKKyAqIEBwYXJhbSBzaGFwZURldGVjdGlvbk9wdGlvbnMgU2hhcGUgZGV0ZWN0aW9uIG9wdGlvbnMKKyAqIEBwYXJhbSByb2kgUmVnaW9uIG9mIEludGVyZXN0CisgKiBAcmV0dXJucyBhIHZlY3RvciBvZiBFbGxpcHNlTWF0Y2ggc3RydWN0dXJlcyAoMCBsZW5ndGggdmVjdG9yIG9uIG5vIG1hdGNoKQorICovCit2ZWN0b3I8RWxsaXBzZU1hdGNoPiAqIE1vbm9JbWFnZTo6RGV0ZWN0RWxsaXBzZXMoCisJCUVsbGlwc2VEZXNjcmlwdG9yICplbGxpcHNlRGVzY3JpcHRvciwgQ3VydmVPcHRpb25zICpjdXJ2ZU9wdGlvbnMsCisJCVNoYXBlRGV0ZWN0aW9uT3B0aW9ucyAqc2hhcGVEZXRlY3Rpb25PcHRpb25zLCBST0kgKnJvaSkKK3sKKwlpbnQgbnVtYmVyT2ZNYXRjaGVzOworCUVsbGlwc2VNYXRjaCAqZSA9IGltYXFEZXRlY3RFbGxpcHNlcyhtX2ltYXFJbWFnZSwgZWxsaXBzZURlc2NyaXB0b3IsCisJCQkJCQkJCQkJY3VydmVPcHRpb25zLCBzaGFwZURldGVjdGlvbk9wdGlvbnMsIHJvaSwgJm51bWJlck9mTWF0Y2hlcyk7CisJdmVjdG9yPEVsbGlwc2VNYXRjaD4gKmVsbGlwc2VzID0gbmV3IHZlY3RvcjxFbGxpcHNlTWF0Y2g+OworCWlmIChlID09IE5VTEwpCisJeworCQlyZXR1cm4gZWxsaXBzZXM7CisJfQorCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZNYXRjaGVzOyBpKyspCisJeworCQllbGxpcHNlcy0+cHVzaF9iYWNrKGVbaV0pOworCX0KKwlpbWFxRGlzcG9zZShlKTsKKwlyZXR1cm4gZWxsaXBzZXM7Cit9CisKK3ZlY3RvcjxFbGxpcHNlTWF0Y2g+ICogTW9ub0ltYWdlOjpEZXRlY3RFbGxpcHNlcygKKwkJRWxsaXBzZURlc2NyaXB0b3IgKmVsbGlwc2VEZXNjcmlwdG9yKQoreworCXZlY3RvcjxFbGxpcHNlTWF0Y2g+ICplbGxpcHNlcyA9IERldGVjdEVsbGlwc2VzKGVsbGlwc2VEZXNjcmlwdG9yLCBOVUxMLAorCQkJTlVMTCwgTlVMTCk7CisJcmV0dXJuIGVsbGlwc2VzOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9WaXNpb24vUkdCSW1hZ2UuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9WaXNpb24vUkdCSW1hZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNDIxMmUKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1Zpc2lvbi9SR0JJbWFnZS5jcHAKQEAgLTAsMCArMSwyOCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJWaXNpb24vUkdCSW1hZ2UuaCIKKworLyoqCisgKiBDcmVhdGUgYSBuZXcgaW1hZ2UgdGhhdCB1c2VzIFJlZCwgR3JlZW4sIGFuZCBCbHVlIHBsYW5lcy4KKyAqLworUkdCSW1hZ2U6OlJHQkltYWdlKCkgOiBDb2xvckltYWdlKElNQVFfSU1BR0VfUkdCKQoreworfQorCisvKioKKyAqIENyZWF0ZSBhIG5ldyBpbWFnZSBieSBsb2FkaW5nIGEgZmlsZS4KKyAqIEBwYXJhbSBmaWxlTmFtZSBUaGUgcGF0aCBvZiB0aGUgZmlsZSB0byBsb2FkLgorICovCitSR0JJbWFnZTo6UkdCSW1hZ2UoY29uc3QgY2hhciAqZmlsZU5hbWUpIDogQ29sb3JJbWFnZShJTUFRX0lNQUdFX1JHQikKK3sKKwlpbnQgc3VjY2VzcyA9IGltYXFSZWFkRmlsZShtX2ltYXFJbWFnZSwgZmlsZU5hbWUsIE5VTEwsIE5VTEwpOworCXdwaV9zZXRJbWFxRXJyb3JXaXRoQ29udGV4dChzdWNjZXNzLCAiSW1hcSBSZWFkRmlsZSBlcnJvciIpOworfQorCitSR0JJbWFnZTo6flJHQkltYWdlKCkKK3sKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvVmlzaW9uL1RocmVzaG9sZC5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1Zpc2lvbi9UaHJlc2hvbGQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkODFiMzgKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1Zpc2lvbi9UaHJlc2hvbGQuY3BwCkBAIC0wLDAgKzEsMTggQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiVmlzaW9uL1RocmVzaG9sZC5oIgorCitUaHJlc2hvbGQ6OlRocmVzaG9sZChpbnQgbmV3X3BsYW5lMUxvdywgaW50IG5ld19wbGFuZTFIaWdoLCBpbnQgbmV3X3BsYW5lMkxvdywKKwkJaW50IG5ld19wbGFuZTJIaWdoLCBpbnQgbmV3X3BsYW5lM0xvdywgaW50IG5ld19wbGFuZTNIaWdoKQoreworCXBsYW5lMUxvdyA9IG5ld19wbGFuZTFMb3c7CisJcGxhbmUxSGlnaCA9IG5ld19wbGFuZTFIaWdoOworCXBsYW5lMkxvdyA9IG5ld19wbGFuZTJMb3c7CisJcGxhbmUySGlnaCA9IG5ld19wbGFuZTJIaWdoOworCXBsYW5lM0xvdyA9IG5ld19wbGFuZTNMb3c7CisJcGxhbmUzSGlnaCA9IG5ld19wbGFuZTNIaWdoOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9WaXNpb24vVmlzaW9uQVBJLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvVmlzaW9uL1Zpc2lvbkFQSS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FjM2FjOQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvVmlzaW9uL1Zpc2lvbkFQSS5jcHAKQEAgLTAsMCArMSw2NjUgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSA8c3RkbGliLmg+IAorI2luY2x1ZGUgPHN0ZGFyZy5oPiAKKworI2luY2x1ZGUgIlZpc2lvbi9CYWVVdGlsaXRpZXMuaCIKKyNpbmNsdWRlICJWaXNpb24vRnJjRXJyb3IuaCIKKyNpbmNsdWRlICJWaXNpb24vVmlzaW9uQVBJLmgiIAorCitpbnQgVmlzaW9uQVBJX2RlYnVnRmxhZyA9IDE7CisjZGVmaW5lIERQUklOVEYgaWYoVmlzaW9uQVBJX2RlYnVnRmxhZylkcHJpbnRmCisKKy8qICAgSW1hZ2UgTWFuYWdlbWVudCBmdW5jdGlvbnMgICAgKi8KKworLyoqCisqIEBicmllZiBDcmVhdGUgYW4gaW1hZ2Ugb2JqZWN0CisqIFN1cHBvcnRzIElNQVFfSU1BR0VfVTgsIElNQVFfSU1BR0VfSTE2LCBJTUFRX0lNQUdFX1NHTCwgSU1BUV9JTUFHRV9DT01QTEVYLCBJTUFRX0lNQUdFX1JHQiwgSU1BUV9JTUFHRV9IU0wsIElNQVFfSU1BR0VfUkdCX1U2NCAgICAgICAgICAKKyogVGhlIGJvcmRlciBzaXplIGlzIGRlZmF1bHRlZCB0byAzIHNvIHRoYXQgY29udm9sdXRpb25hbCBhbGdvcml0aG1zIHdvcmsgYXQgdGhlIGVkZ2VzLiAKKyogV2hlbiB5b3UgYXJlIGZpbmlzaGVkIHdpdGggdGhlIGNyZWF0ZWQgaW1hZ2UsIGRpc3Bvc2Ugb2YgaXQgYnkgY2FsbGluZyBmcmNEaXNwb3NlKCkuIAorKiBUbyBnZXQgZXh0ZW5kZWQgZXJyb3IgaW5mb3JtYXRpb24sIGNhbGwgR2V0TGFzdEVycm9yKCkuICAgCisqICAgICAgICAgICAKKyogQHBhcmFtIHR5cGUgVHlwZSBvZiBpbWFnZSB0byBjcmVhdGUKKyogQHJldHVybiBJbWFnZSogT24gc3VjY2VzcywgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBjcmVhdGVkIGltYWdlLiBPbiBmYWlsdXJlLCBpdCByZXR1cm5zIE5VTEwuCisqLworSW1hZ2UqIGZyY0NyZWF0ZUltYWdlKEltYWdlVHlwZSB0eXBlKSB7IHJldHVybiBpbWFxQ3JlYXRlSW1hZ2UodHlwZSwgREVGQVVMVF9CT1JERVJfU0laRSk7IH0KKworLyoqCisqIEBicmllZiBEaXNwb3NlIG9mIG9uZSBvYmplY3QuIFN1cHBvcnRzIGFueSBvYmplY3QgY3JlYXRlZCBvbiB0aGUgaGVhcC4KKyogCisqIEBwYXJhbSBvYmplY3Qgb2JqZWN0IHRvIGRpc3Bvc2Ugb2YKKyogQHJldHVybiBPbiBzdWNjZXNzOiAxLiBPbiBmYWlsdXJlOiAwLiBUbyBnZXQgZXh0ZW5kZWQgZXJyb3IgaW5mb3JtYXRpb24sIGNhbGwgR2V0TGFzdEVycm9yKCkuCisqLworaW50IGZyY0Rpc3Bvc2Uodm9pZCogb2JqZWN0KSAgeyByZXR1cm4gaW1hcURpc3Bvc2Uob2JqZWN0KTsJfQorLyoqCisqIEBicmllZiBEaXNwb3NlIG9mIGEgbGlzdCBvZiBvYmplY3RzLiBTdXBwb3J0cyBhbnkgb2JqZWN0IGNyZWF0ZWQgb24gdGhlIGhlYXAuCisqIAorKiBAcGFyYW0gZnVuY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbgorKiBAcGFyYW0gLi4uIEEgbGlzdCBvZiBwb2ludGVycyB0byBzdHJ1Y3R1cmVzIHRoYXQgbmVlZCB0byBiZSBkaXNwb3NlZCBvZi4gCisqIFRoZSBsYXN0IHBvaW50ZXIgaW4gdGhlIGxpc3Qgc2hvdWxkIGFsd2F5cyBiZSBzZXQgdG8gTlVMTC4KKyogCisqIEByZXR1cm4gT24gc3VjY2VzczogMS4gT24gZmFpbHVyZTogMC4gVG8gZ2V0IGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uLCBjYWxsIEdldExhc3RFcnJvcigpLgorKi8KK2ludCBmcmNEaXNwb3NlKCBjb25zdCBjaGFyKiBmdW5jdGlvbk5hbWUsIC4uLiApIC8qIFZhcmlhYmxlIGFyZ3VtZW50IGxpc3QgKi8KK3sKKyAgICB2YV9saXN0IGRpc3Bvc2FsUHRyTGlzdDsgICAvKiBJbnB1dCBhcmd1bWVudCBsaXN0ICovCisgICAgdm9pZCogZGlzcG9zYWxQdHI7ICAgICAgICAgLyogRm9yIGl0ZXJhdGlvbiAqLworICAgIGludCBzdWNjZXNzLCByZXR1cm5WYWx1ZSA9IDE7CisgICAgCisgICAgdmFfc3RhcnQoIGRpc3Bvc2FsUHRyTGlzdCwgZnVuY3Rpb25OYW1lICk7ICAvKiBzdGFydCBvZiB2YXJpYWJsZSBsaXN0ICovCisgICAgZGlzcG9zYWxQdHIgPSB2YV9hcmcoIGRpc3Bvc2FsUHRyTGlzdCwgdm9pZCogKTsKKyAgICB3aGlsZSggZGlzcG9zYWxQdHIgIT0gTlVMTCApICAgICB7CisgICAgCXN1Y2Nlc3MgPSBpbWFxRGlzcG9zZShkaXNwb3NhbFB0cik7CisgICAgICAgIGlmICghc3VjY2Vzcykge3JldHVyblZhbHVlID0gMDt9CisgICAgICAgIGRpc3Bvc2FsUHRyID0gdmFfYXJnKCBkaXNwb3NhbFB0ckxpc3QsIHZvaWQqICk7CisgICAgfQorICAgIHJldHVybiByZXR1cm5WYWx1ZTsKK30KKworLyoqCisqIEBicmllZiBDb3B5IGFuIGltYWdlIG9iamVjdC4gCisqIFN1cHBvcnRzIElNQVFfSU1BR0VfVTgsIElNQVFfSU1BR0VfSTE2LCBJTUFRX0lNQUdFX1NHTCwgSU1BUV9JTUFHRV9SR0IsIElNQVFfSU1BR0VfSFNMLiAgICAgICAgICAKKyogCisqIEBwYXJhbSBkZXN0IENvcHkgb2YgaW1hZ2UuIE9uIGZhaWx1cmUsIGRlc3QgaXMgTlVMTC4gTXVzdCBoYXZlIGFscmVhZHkgYmVlbiBjcmVhdGVkIHVzaW5nIGZyY0NyZWF0ZUltYWdlKCkuCisqIFdoZW4geW91IGFyZSBmaW5pc2hlZCB3aXRoIHRoZSBjcmVhdGVkIGltYWdlLCBkaXNwb3NlIG9mIGl0IGJ5IGNhbGxpbmcgZnJjRGlzcG9zZSgpLgorKiBAcGFyYW0gc291cmNlIEltYWdlIHRvIGNvcHkgICAgICAKKyogCisqIEByZXR1cm4gT24gc3VjY2VzczogMS4gT24gZmFpbHVyZTogMC4gVG8gZ2V0IGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uLCBjYWxsIEdldExhc3RFcnJvcigpLgorKi8KK2ludCBmcmNDb3B5SW1hZ2UoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UpIHsgcmV0dXJuIGltYXFEdXBsaWNhdGUoZGVzdCwgc291cmNlKTsgIH0KKworLyoqCisqIEBicmllZiBDcm9wIGltYWdlIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHNjYWxlLiAKKyogU3VwcG9ydHMgSU1BUV9JTUFHRV9VOCwgSU1BUV9JTUFHRV9JMTYsIElNQVFfSU1BR0VfU0dMLCBJTUFRX0lNQUdFX1JHQiwgSU1BUV9JTUFHRV9IU0wuCisqIAorKiBAcGFyYW0gZGVzdCBNb2RpZmllZCBpbWFnZQorKiBAcGFyYW0gc291cmNlIEltYWdlIHRvIGNyb3AKKyogQHBhcmFtIHJlY3QgcmVnaW9uIHRvIHByb2Nlc3MsIG9yIElNQVFfTk9fUkVDVAorKiAKKyogQHJldHVybiBPbiBzdWNjZXNzOiAxLiBPbiBmYWlsdXJlOiAwLiBUbyBnZXQgZXh0ZW5kZWQgZXJyb3IgaW5mb3JtYXRpb24sIGNhbGwgR2V0TGFzdEVycm9yKCkuCisqLworaW50IGZyY0Nyb3AoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIFJlY3QgcmVjdCkKK3sJCisJcmV0dXJuIGltYXFTY2FsZShkZXN0LCBzb3VyY2UsIDEsIDEsIElNQVFfU0NBTEVfTEFSR0VSLCByZWN0KTsKK30KKworCisvKioKKyogQGJyaWVmIFNjYWxlcyB0aGUgZW50aXJlIGltYWdlIGxhcmdlciBvciBzbWFsbGVyLiAKKyogU3VwcG9ydHMgSU1BUV9JTUFHRV9VOCwgSU1BUV9JTUFHRV9JMTYsIElNQVFfSU1BR0VfU0dMLCBJTUFRX0lNQUdFX1JHQiwgSU1BUV9JTUFHRV9IU0wuCisqICAgICAKKyogQHBhcmFtIGRlc3QgTW9kaWZpZWQgaW1hZ2UKKyogQHBhcmFtIHNvdXJjZSBJbWFnZSB0byBzY2FsZQorKiBAcGFyYW0geFNjYWxlIHRoZSBob3Jpem9udGFsIHJlZHVjdGlvbiByYXRpbworKiBAcGFyYW0geVNjYWxlIHRoZSB2ZXJ0aWNhbCByZWR1Y3Rpb24gcmF0aW8gCisqIEBwYXJhbSBzY2FsZU1vZGUgSU1BUV9TQ0FMRV9MQVJHRVIgb3IgSU1BUV9TQ0FMRV9TTUFMTEVSICAKKyogCisqIEByZXR1cm4gT24gc3VjY2VzczogMS4gT24gZmFpbHVyZTogMC4gVG8gZ2V0IGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uLCBjYWxsIEdldExhc3RFcnJvcigpLgorKi8KK2ludCBmcmNTY2FsZShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgaW50IHhTY2FsZSwgaW50IHlTY2FsZSwgU2NhbGluZ01vZGUgc2NhbGVNb2RlKQorewkKKwlSZWN0IHJlY3QgPSBJTUFRX05PX1JFQ1Q7CisJcmV0dXJuIGltYXFTY2FsZShkZXN0LCBzb3VyY2UsIHhTY2FsZSwgeVNjYWxlLCBzY2FsZU1vZGUsIHJlY3QpOwkKK30KKyAgCisvKioKKyAqIEBicmllZiBDcmVhdGVzIGltYWdlIG9iamVjdCBmcm9tIHRoZSBpbmZvcm1hdGlvbiBpbiBhIGZpbGUuIFRoZSBmaWxlIGNhbiBiZSBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBmb3JtYXRzOiAKKyAqIFBORywgSlBFRywgSlBFRzIwMDAsIFRJRkYsIEFJUEQsIG9yIEJNUC4gCisgKiBTdXBwb3J0cyBJTUFRX0lNQUdFX1U4LCBJTUFRX0lNQUdFX0kxNiwgSU1BUV9JTUFHRV9TR0wsIElNQVFfSU1BR0VfQ09NUExFWCwgSU1BUV9JTUFHRV9SR0IsIElNQVFfSU1BR0VfSFNMLCBJTUFRX0lNQUdFX1JHQl9VNjQuCisgKiAKKyAqIEBwYXJhbSBpbWFnZSBJbWFnZSByZWFkIGluCisgKiBAcGFyYW0gZmlsZU5hbWUgRmlsZSB0byByZWFkLiBDYW5ub3QgYmUgTlVMTAorICogCisgKiBAcmV0dXJuIE9uIHN1Y2Nlc3M6IDEuIE9uIGZhaWx1cmU6IDAuIFRvIGdldCBleHRlbmRlZCBlcnJvciBpbmZvcm1hdGlvbiwgY2FsbCBHZXRMYXN0RXJyb3IoKS4KKyAqLworIGludCBmcmNSZWFkSW1hZ2UoSW1hZ2UqIGltYWdlLCBjb25zdCBjaGFyKiBmaWxlTmFtZSkKKyB7CisJIHJldHVybiBpbWFxUmVhZEZpbGUoaW1hZ2UsIGZpbGVOYW1lLCBOVUxMLCBOVUxMKTsKKyB9CisKKworIC8qKgorICogQGJyaWVmIFdyaXRlIGltYWdlIHRvIGEgZmlsZS4gCisgKiBTdXBwb3J0cyBJTUFRX0lNQUdFX1U4LCBJTUFRX0lNQUdFX0kxNiwgSU1BUV9JTUFHRV9TR0wsIElNQVFfSU1BR0VfQ09NUExFWCwgSU1BUV9JTUFHRV9SR0IsIElNQVFfSU1BR0VfSFNMLCBJTUFRX0lNQUdFX1JHQl9VNjQuCisgKiAKKyAqIFRoZSBmaWxlIHR5cGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgZXh0ZW5zaW9uLCBhcyBmb2xsb3dzOgorICoKKyAqCQlFeHRlbnNpb24gCQkJCQlGaWxlIFR5cGUgCisgKgkJYWlwZCBvciAuYXBkIAkJCQlBSVBEIAorICoJCS5ibXAgCQkJCQkJQk1QIAorICoJCS5qcGcgb3IgLmpwZWcgCQkJCUpQRUcgCisgKgkJLmpwMiAJCQkJCQlKUEVHMjAwMCAKKyAqCQkucG5nIAkJCQkJCVBORyAKKyAqCQkudGlmIG9yIC50aWZmIAkJCQlUSUZGIAorICogCisgKiAKKyAqVGhlIGZvbGxvd2luZyBhcmUgdGhlIHN1cHBvcnRlZCBpbWFnZSB0eXBlcyBmb3IgZWFjaCBmaWxlIHR5cGU6CisgKgorICoJCUZpbGUgVHlwZXMgCQkJCQlJbWFnZSBUeXBlcyAKKyAqCQlBSVBEIAkJCQkJCWFsbCBpbWFnZSB0eXBlcyAKKyAqCQlCTVAsIEpQRUcgCQkJCQk4LWJpdCwgUkdCIAorICoJCVBORywgVElGRiwgSlBFRzIwMDAgCQk4LWJpdCwgMTYtYml0LCBSR0IsIFJHQlU2NCAJCQorICogCQkJICAgIAorICogQHBhcmFtIGltYWdlIEltYWdlIHRvIHdyaXRlCisgKiBAcGFyYW0gZmlsZU5hbWUgRmlsZSB0byByZWFkLiBDYW5ub3QgYmUgTlVMTC4gVGhlIGV4dGVuc2lvbiBkZXRlcm1pbmVzIHRoZSBmaWxlIGZvcm1hdCB0aGF0IGlzIHdyaXR0ZW4uCisgKiAKKyAqIEByZXR1cm4gT24gc3VjY2VzczogMS4gT24gZmFpbHVyZTogMC4gVG8gZ2V0IGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uLCBjYWxsIEdldExhc3RFcnJvcigpLgorICovCitpbnQgZnJjV3JpdGVJbWFnZShjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IGNoYXIqIGZpbGVOYW1lKQorewkKKwlSR0JWYWx1ZSogY29sb3JUYWJsZSA9IE5VTEw7CisJcmV0dXJuIGltYXFXcml0ZUZpbGUoaW1hZ2UsIGZpbGVOYW1lLCBjb2xvclRhYmxlKTsKK30KKworCisvKiAgTWVhc3VyZSBJbnRlbnNpdHkgZnVuY3Rpb25zICovCisKKy8qKgorKiBAYnJpZWYgTWVhc3VyZXMgdGhlIHBpeGVsIGludGVuc2l0aWVzIGluIGEgcmVjdGFuZ2xlIG9mIGFuIGltYWdlLiAKKyogT3V0cHV0cyBpbnRlbnNpdHkgYmFzZWQgc3RhdGlzdGljcyBhYm91dCBhbiBpbWFnZSBzdWNoIGFzIE1heCwgTWluLCBNZWFuIGFuZCBTdGQgRGV2IG9mIHBpeGVsIHZhbHVlLiAKKyogU3VwcG9ydHMgSU1BUV9JTUFHRV9VOCwgSU1BUV9JTUFHRV9JMTYsIElNQVFfSU1BR0VfU0dMLgorKgorKiAgUGFyYW1ldGVyIERpc2N1c3Npb24JOiAKKyoJCVJlbGV2YW50IHBhcmFtZXRlcnMgb2YgdGhlIEhpc3RvZ3JhbVJlcG9ydCBpbmNsdWRlOgorKiAJCQltaW4sIG1heCwgbWVhbiBhbmQgc3RkRGV2ICAgICAgCisqCQltaW4vbWF4IJdTZXR0aW5nIGJvdGggbWluIGFuZCBtYXggdG8gMCBjYXVzZXMgdGhlIGZ1bmN0aW9uIHRvIHNldCBtaW4gdG8gMCAKKyogCQkJYW5kIHRoZSBtYXggdG8gMjU1IGZvciA4LWJpdCBpbWFnZXMgYW5kIHRvIHRoZSBhY3R1YWwgbWluaW11bSB2YWx1ZSBhbmQKKyogCQkJbWF4aW11bSB2YWx1ZSBvZiB0aGUgaW1hZ2UgZm9yIGFsbCBvdGhlciBpbWFnZSB0eXBlcy4KKyoJCW1heJdTZXR0aW5nIGJvdGggbWluIGFuZCBtYXggdG8gMCBjYXVzZXMgdGhlIGZ1bmN0aW9uIHRvIHNldCBtYXggdG8gMjU1IAorKiAJCQlmb3IgOC1iaXQgaW1hZ2VzIGFuZCB0byB0aGUgYWN0dWFsIG1heGltdW0gdmFsdWUgb2YgdGhlIGltYWdlIGZvciAKKyogCQkJYWxsIG90aGVyIGltYWdlIHR5cGVzLgorKgorKiBAcGFyYW0gaW1hZ2UgSW1hZ2Ugd2hvc2UgaGlzdG9ncmFtIHRoZSBmdW5jdGlvbiBjYWxjdWxhdGVzLgorKiBAcGFyYW0gbnVtQ2xhc3NlcyBUaGUgbnVtYmVyIG9mIGNsYXNzZXMgaW50byB3aGljaCB0aGUgZnVuY3Rpb24gc2VwYXJhdGVzIHRoZSBwaXhlbHMuIAorKiBEZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGhpc3RvZ3JhbSBhcnJheSByZXR1cm5lZAorKiBAcGFyYW0gbWluIFRoZSBtaW5pbXVtIHBpeGVsIHZhbHVlIHRvIGNvbnNpZGVyIGZvciB0aGUgaGlzdG9ncmFtLiAKKyogVGhlIGZ1bmN0aW9uIGRvZXMgbm90IGNvdW50IHBpeGVscyB3aXRoIHZhbHVlcyBsZXNzIHRoYW4gbWluLgorKiBAcGFyYW0gbWF4IFRoZSBtYXhpbXVtIHBpeGVsIHZhbHVlIHRvIGNvbnNpZGVyIGZvciB0aGUgaGlzdG9ncmFtLiAKKyogVGhlIGZ1bmN0aW9uIGRvZXMgbm90IGNvdW50IHBpeGVscyB3aXRoIHZhbHVlcyBncmVhdGVyIHRoYW4gbWF4LgorKiBAcGFyYW0gcmVjdCBSZWdpb24gb2YgaW50ZXJlc3QgaW4gdGhlIGltYWdlLiBJZiBub3QgaW5jbHVkZWQsIHRoZSBlbnRpcmUgaW1hZ2UgaXMgdXNlZC4gCisqIEByZXR1cm4gT24gc3VjY2VzcywgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcmVwb3J0IGRlc2NyaWJpbmcgdGhlIHBpeGVsIHZhbHVlIGNsYXNzaWZpY2F0aW9uLiAgICAKKyogV2hlbiB5b3UgYXJlIGZpbmlzaGVkIHdpdGggdGhlIHJlcG9ydCwgZGlzcG9zZSBvZiBpdCBieSBjYWxsaW5nIGZyY0Rpc3Bvc2UoKS4gCisqIE9uIGZhaWx1cmUsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBOVUxMLiBUbyBnZXQgZXh0ZW5kZWQgZXJyb3IgaW5mb3JtYXRpb24sIGNhbGwgR2V0TGFzdEVycm9yKCkuICAgICAgICAgICAgCisqIAorKi8KK0hpc3RvZ3JhbVJlcG9ydCogZnJjSGlzdG9ncmFtKGNvbnN0IEltYWdlKiBpbWFnZSwgaW50IG51bUNsYXNzZXMsIGZsb2F0IG1pbiwgZmxvYXQgbWF4KQoreworCVJlY3QgcmVjdCA9IElNQVFfTk9fUkVDVDsKKwlyZXR1cm4gZnJjSGlzdG9ncmFtKGltYWdlLCBudW1DbGFzc2VzLCBtaW4sIG1heCwgcmVjdCk7CQkKK30KK0hpc3RvZ3JhbVJlcG9ydCogZnJjSGlzdG9ncmFtKGNvbnN0IEltYWdlKiBpbWFnZSwgaW50IG51bUNsYXNzZXMsIGZsb2F0IG1pbiwgZmxvYXQgbWF4LCBSZWN0IHJlY3QpCit7CisJaW50IHN1Y2Nlc3M7IAorCWludCBmaWxsVmFsdWUgPSAxOworCQorCS8qIGNyZWF0ZSB0aGUgcmVnaW9uIG9mIGludGVyZXN0ICovCisJUk9JKiBwUm9pID0gaW1hcUNyZWF0ZVJPSSgpOworCXN1Y2Nlc3MgPSBpbWFxQWRkUmVjdENvbnRvdXIocFJvaSwgcmVjdCk7IAorCWlmICggIXN1Y2Nlc3MgKQl7IEdldExhc3RWaXNpb25FcnJvcigpOyByZXR1cm4gTlVMTDsgfQkKKworCS8qIG1ha2UgYSBtYXNrIGZyb20gdGhlIFJPSSAqLworCUltYWdlKiBwTWFzayA9IGZyY0NyZWF0ZUltYWdlKElNQVFfSU1BR0VfVTgpOworCXN1Y2Nlc3MgPSBpbWFxUk9JVG9NYXNrKHBNYXNrLCBwUm9pLCBmaWxsVmFsdWUsIE5VTEwsIE5VTEwpOworCWlmICggIXN1Y2Nlc3MgKQl7IAorCQlHZXRMYXN0VmlzaW9uRXJyb3IoKTsgCisJCWZyY0Rpc3Bvc2UoX19GVU5DVElPTl9fLCBwUm9pLCBOVUxMKTsgCisJCXJldHVybiBOVUxMOyAKKwl9CQorCQorCS8qIGdldCBhIGhpc3RvZ3JhbSByZXBvcnQgKi8KKwlIaXN0b2dyYW1SZXBvcnQqIHBIciA9IE5VTEw7CisJcEhyID0gaW1hcUhpc3RvZ3JhbShpbWFnZSwgbnVtQ2xhc3NlcywgbWluLCBtYXgsIHBNYXNrKTsgCisJCisJLyogY2xlYW4gdXAgKi8KKwlmcmNEaXNwb3NlKF9fRlVOQ1RJT05fXywgcFJvaSwgcE1hc2ssIE5VTEwpOyAKKwkKKwlyZXR1cm4gcEhyOworfQorCisvKioKKyogQGJyaWVmIENhbGN1bGF0ZXMgdGhlIGhpc3RvZ3JhbSwgb3IgcGl4ZWwgZGlzdHJpYnV0aW9uLCBvZiBhIGNvbG9yIGltYWdlLiAKKyogU3VwcG9ydHMgSU1BUV9JTUFHRV9SR0IsIElNQVFfSU1BR0VfSFNMLgorKiAgICAgICAgICAgIAorKiBAcGFyYW0gaW1hZ2UgSW1hZ2Ugd2hvc2UgaGlzdG9ncmFtIHRoZSBmdW5jdGlvbiBjYWxjdWxhdGVzLgorKiBAcGFyYW0gbnVtQ2xhc3NlcyBUaGUgbnVtYmVyIG9mIGNsYXNzZXMgaW50byB3aGljaCB0aGUgZnVuY3Rpb24gc2VwYXJhdGVzIHRoZSBwaXhlbHMuIAorKiBEZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGhpc3RvZ3JhbSBhcnJheSByZXR1cm5lZAorKiBAcGFyYW0gbW9kZSBUaGUgY29sb3Igc3BhY2UgaW4gd2hpY2ggdG8gcGVyZm9ybSB0aGUgaGlzdG9ncmFtLiBQb3NzaWJsZSB2YWx1ZXMgaW5jbHVkZSBJTUFRX1JHQiBhbmQgSU1BUV9IU0wuIAorKiBAcGFyYW0gbWFzayBBbiBvcHRpb25hbCBtYXNrIGltYWdlLiBUaGlzIGltYWdlIG11c3QgYmUgYW4gSU1BUV9JTUFHRV9VOCBpbWFnZS4gCisqIFRoZSBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBoaXN0b2dyYW0gdXNpbmcgb25seSB0aG9zZSBwaXhlbHMgaW4gdGhlIGltYWdlIHdob3NlIAorKiBjb3JyZXNwb25kaW5nIHBpeGVscyBpbiB0aGUgbWFzayBhcmUgbm9uLXplcm8uIFNldCB0aGlzIHBhcmFtZXRlciB0byBOVUxMIHRvIGNhbGN1bGF0ZSAKKyogdGhlIGhpc3RvZ3JhbSBvZiB0aGUgZW50aXJlIGltYWdlLCBvciB1c2UgdGhlIHNpbXBsaWZpZWQgY2FsbC4KKyogCisqIEByZXR1cm4gT24gc3VjY2VzcywgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcmVwb3J0IGRlc2NyaWJpbmcgdGhlIGNsYXNzaWZpY2F0aW9uICAKKyogb2YgZWFjaCBwbGFuZSBpbiBhIEhpc3RvZ3JhbVJlcG9ydC4gCisqIFdoZW4geW91IGFyZSBmaW5pc2hlZCB3aXRoIHRoZSByZXBvcnQsIGRpc3Bvc2Ugb2YgaXQgYnkgY2FsbGluZyBmcmNEaXNwb3NlKCkuIAorKiBPbiBmYWlsdXJlLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgTlVMTC4gIAorKiBUbyBnZXQgZXh0ZW5kZWQgZXJyb3IgaW5mb3JtYXRpb24sIGNhbGwgaW1hcUdldExhc3RFcnJvcigpLiAKKyovCitDb2xvckhpc3RvZ3JhbVJlcG9ydCogZnJjQ29sb3JIaXN0b2dyYW0oY29uc3QgSW1hZ2UqIGltYWdlLCBpbnQgbnVtQ2xhc3NlcywgQ29sb3JNb2RlIG1vZGUpCit7CQorCXJldHVybiBmcmNDb2xvckhpc3RvZ3JhbShpbWFnZSwgbnVtQ2xhc3NlcywgbW9kZSwgTlVMTCk7Cit9CisKK0NvbG9ySGlzdG9ncmFtUmVwb3J0KiBmcmNDb2xvckhpc3RvZ3JhbShjb25zdCBJbWFnZSogaW1hZ2UsIGludCBudW1DbGFzc2VzLCBDb2xvck1vZGUgbW9kZSwgSW1hZ2UqIG1hc2spCit7CisJcmV0dXJuIGltYXFDb2xvckhpc3RvZ3JhbTIoKEltYWdlKilpbWFnZSwgbnVtQ2xhc3NlcywgbW9kZSwgTlVMTCwgbWFzayk7Cit9CisKKworLyoqCisqIEBicmllZiBNZWFzdXJlcyB0aGUgcGl4ZWwgaW50ZW5zaXRpZXMgaW4gYSByZWN0YW5nbGUgb2YgYW4gaW1hZ2UuIAorKiBPdXRwdXRzIGludGVuc2l0eSBiYXNlZCBzdGF0aXN0aWNzIGFib3V0IGFuIGltYWdlIHN1Y2ggYXMgTWF4LCBNaW4sIE1lYW4gYW5kIFN0ZCBEZXYgb2YgcGl4ZWwgdmFsdWUuIAorKiBTdXBwb3J0cyBJTUFRX0lNQUdFX1U4IChncmF5c2NhbGUpIElNQVFfSU1BR0VfUkdCIChjb2xvcikgSU1BUV9JTUFHRV9IU0wgKGNvbG9yLUhTTCkuCisqIAorKiBAcGFyYW0gaW1hZ2UgVGhlIGltYWdlIHdob3NlIHBpeGVsIHZhbHVlIHRoZSBmdW5jdGlvbiBxdWVyaWVzCisqIEBwYXJhbSBwaXhlbCBUaGUgY29vcmRpbmF0ZXMgb2YgdGhlIHBpeGVsIHRoYXQgdGhlIGZ1bmN0aW9uIHF1ZXJpZXMKKyogQHBhcmFtIHZhbHVlIE9uIHJldHVybiwgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgaW1hZ2UgcGl4ZWwuIFRoaXMgcGFyYW1ldGVyIGNhbm5vdCBiZSBOVUxMLgorKiBUaGlzIGRhdGEgc3RydWN0dXJlIGNvbnRhaW5zIGVpdGhlciBncmF5c2NhbGUsIFJHQiwgSFNMLCBDb21wbGV4IG9yIFJHQlU2NFZhbHVlIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBpbWFnZS4KKyogQHJldHVybiBPbiBzdWNjZXNzOiAxLiBPbiBmYWlsdXJlOiAwLiBUbyBnZXQgZXh0ZW5kZWQgZXJyb3IgaW5mb3JtYXRpb24sIGNhbGwgR2V0TGFzdEVycm9yKCkuCisqLworaW50IGZyY0dldFBpeGVsVmFsdWUoY29uc3QgSW1hZ2UqIGltYWdlLCBQb2ludCBwaXhlbCwgUGl4ZWxWYWx1ZSogdmFsdWUpCit7CQorCXJldHVybiBpbWFxR2V0UGl4ZWwoaW1hZ2UsIHBpeGVsLCB2YWx1ZSk7Cit9CisKKworLyogICBQYXJ0aWNsZSBBbmFseXNpcyBmdW5jdGlvbnMgKi8KKworLyoqCisqIEBicmllZiBGaWx0ZXJzIHBhcnRpY2xlcyBvdXQgb2YgYW4gaW1hZ2UgYmFzZWQgb24gdGhlaXIgbWVhc3VyZW1lbnRzLiAKKyogU3VwcG9ydHMgSU1BUV9JTUFHRV9VOCwgSU1BUV9JTUFHRV9JMTYsIElNQVFfSU1BR0VfU0dMLgorKiAKKyogQHBhcmFtIGRlc3QgVGhlIGRlc3RpbmF0aW9uIGltYWdlLiBJZiBkZXN0IGlzIHVzZWQsIGl0IG11c3QgYmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgU291cmNlIGltYWdlLiBJdCB3aWxsIGNvbnRhaW4gb25seSB0aGUgZmlsdGVyZWQgcGFydGljbGVzLgorKiBAcGFyYW0gc291cmNlIFRoZSBpbWFnZSBjb250YWluaW5nIHRoZSBwYXJ0aWNsZXMgdG8gZmlsdGVyLiAKKyogQHBhcmFtIGNyaXRlcmlhIEFuIGFycmF5IG9mIGNyaXRlcmlhIHRvIGFwcGx5IHRvIHRoZSBwYXJ0aWNsZXMgaW4gdGhlIHNvdXJjZSBpbWFnZS4gVGhpcyBhcnJheSBjYW5ub3QgYmUgTlVMTC4KKyogU2VlIHRoZSBOSVZpc2lvbkNWSS5jaG0gaGVscCBmaWxlIGZvciBkZWZpbml0aW9ucyBvZiBjcml0ZXJpYS4gCisqIEBwYXJhbSBjcml0ZXJpYUNvdW50IFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNyaXRlcmlhIGFycmF5LgorKiBAcGFyYW0gb3B0aW9ucyBCaW5hcnkgZmlsdGVyIG9wdGlvbnMsIGluY2x1ZGluZyByZWplY3RNYXRjaGVzLCByZWplY3RCb3JkZXIsIGFuZCBjb25uZWN0aXZpdHk4LgorKiBAcGFyYW0gcmVjdCBBcmVhIG9mIGltYWdlIHRvIGZpbHRlci4gSWYgb21pdHRlZCwgdGhlIGRlZmF1bHQgaXMgZW50aXJlIGltYWdlLgorKiBAcGFyYW0gbnVtUGFydGljbGVzIE9uIHJldHVybiwgdGhlIG51bWJlciBvZiBwYXJ0aWNsZXMgbGVmdCBpbiB0aGUgaW1hZ2UKKyogQHJldHVybiBPbiBzdWNjZXNzOiAxLiBPbiBmYWlsdXJlOiAwLiBUbyBnZXQgZXh0ZW5kZWQgZXJyb3IgaW5mb3JtYXRpb24sIGNhbGwgR2V0TGFzdEVycm9yKCkuCisqLworaW50IGZyY1BhcnRpY2xlRmlsdGVyKEltYWdlKiBkZXN0LCBJbWFnZSogc291cmNlLCBjb25zdCBQYXJ0aWNsZUZpbHRlckNyaXRlcmlhMiogY3JpdGVyaWEsIAorCQlpbnQgY3JpdGVyaWFDb3VudCwgY29uc3QgUGFydGljbGVGaWx0ZXJPcHRpb25zKiBvcHRpb25zLCBpbnQqIG51bVBhcnRpY2xlcykKK3sKKwlSZWN0IHJlY3QgPSBJTUFRX05PX1JFQ1Q7CisJcmV0dXJuIGZyY1BhcnRpY2xlRmlsdGVyKGRlc3QsIHNvdXJjZSwgY3JpdGVyaWEsIGNyaXRlcmlhQ291bnQsIG9wdGlvbnMsIHJlY3QsIG51bVBhcnRpY2xlcyk7Cit9CisKK2ludCBmcmNQYXJ0aWNsZUZpbHRlcihJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSwgY29uc3QgUGFydGljbGVGaWx0ZXJDcml0ZXJpYTIqIGNyaXRlcmlhLCAKKwkJaW50IGNyaXRlcmlhQ291bnQsIGNvbnN0IFBhcnRpY2xlRmlsdGVyT3B0aW9ucyogb3B0aW9ucywgUmVjdCByZWN0LCBpbnQqIG51bVBhcnRpY2xlcykKK3sKKwlST0kqIHJvaSA9IGltYXFDcmVhdGVST0koKTsKKwlpbWFxQWRkUmVjdENvbnRvdXIocm9pLCByZWN0KTsKKwlyZXR1cm4gaW1hcVBhcnRpY2xlRmlsdGVyMyhkZXN0LCBzb3VyY2UsIGNyaXRlcmlhLCBjcml0ZXJpYUNvdW50LCBvcHRpb25zLCByb2ksIG51bVBhcnRpY2xlcyk7Cit9CisKKworLyoqCisqIEBicmllZiBQZXJmb3JtcyBtb3JwaG9sb2dpY2FsIHRyYW5zZm9ybWF0aW9ucyBvbiBiaW5hcnkgaW1hZ2VzLiAKKyogU3VwcG9ydHMgSU1BUV9JTUFHRV9VOC4gCisqCisqIEBwYXJhbSBkZXN0IFRoZSBkZXN0aW5hdGlvbiBpbWFnZS4gVGhlIGJvcmRlciBzaXplIG9mIHRoZSBkZXN0aW5hdGlvbiBpbWFnZSBpcyBub3QgaW1wb3J0YW50LgorKiBAcGFyYW0gc291cmNlIFRoZSBpbWFnZSBvbiB3aGljaCB0aGUgZnVuY3Rpb24gcGVyZm9ybXMgdGhlIG1vcnBob2xvZ2ljYWwgb3BlcmF0aW9ucy4gVGhlIGNhbGN1bGF0aW9uIAorKiBtb2RpZmllcyB0aGUgYm9yZGVyIG9mIHRoZSBzb3VyY2UgaW1hZ2UuIFRoZSBib3JkZXIgbXVzdCBiZSBhdCBsZWFzdCBoYWxmIGFzIGxhcmdlIGFzIHRoZSBsYXJnZXIgCisqIGRpbWVuc2lvbiAgb2YgdGhlIHN0cnVjdHVyaW5nIGVsZW1lbnQuICBUaGUgY29ubmVjdGVkIHNvdXJjZSBpbWFnZSBmb3IgYSBtb3JwaG9sb2dpY2FsIHRyYW5zZm9ybWF0aW9uIAorKiBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYSBib3JkZXIgY2FwYWJsZSBvZiBzdXBwb3J0aW5nIHRoZSBzaXplIG9mIHRoZSBzdHJ1Y3R1cmluZyBlbGVtZW50LiAKKyogQSAzIGJ5IDMgc3RydWN0dXJpbmcgZWxlbWVudCByZXF1aXJlcyBhIG1pbmltYWwgYm9yZGVyIG9mIDEsIGEgNSBieSA1IHN0cnVjdHVyaW5nIGVsZW1lbnQgcmVxdWlyZXMgYSBtaW5pbWFsIGJvcmRlciBvZiAyLCBhbmQgc28gb24uCisqIEBwYXJhbSBtZXRob2QgVGhlIG1vcnBob2xvZ2ljYWwgdHJhbnNmb3JtIHRvIGFwcGx5LiAKKyogQHBhcmFtIHN0cnVjdHVyaW5nRWxlbWVudCBUaGUgc3RydWN0dXJpbmcgZWxlbWVudCB1c2VkIGluIHRoZSBvcGVyYXRpb24uIE9taXQgdGhpcyBwYXJhbWV0ZXIgaWYgeW91IGRvIG5vdCB3YW50IGEgY3VzdG9tIHN0cnVjdHVyaW5nIGVsZW1lbnQuIAorKiBAcmV0dXJuIE9uIHN1Y2Nlc3M6IDEuIE9uIGZhaWx1cmU6IDAuIFRvIGdldCBleHRlbmRlZCBlcnJvciBpbmZvcm1hdGlvbiwgY2FsbCBHZXRMYXN0RXJyb3IoKS4gCisqLworaW50IGZyY01vcnBob2xvZ3koSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UsIE1vcnBob2xvZ3lNZXRob2QgbWV0aG9kKQorewkKKwlyZXR1cm4gaW1hcU1vcnBob2xvZ3koZGVzdCwgc291cmNlLCBtZXRob2QsIE5VTEwpOworfQorCitpbnQgZnJjTW9ycGhvbG9neShJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSwgTW9ycGhvbG9neU1ldGhvZCBtZXRob2QsIGNvbnN0IFN0cnVjdHVyaW5nRWxlbWVudCogc3RydWN0dXJpbmdFbGVtZW50KQorewkKKwlyZXR1cm4gaW1hcU1vcnBob2xvZ3koZGVzdCwgc291cmNlLCBtZXRob2QsIHN0cnVjdHVyaW5nRWxlbWVudCk7IAorfQorCisvKioKKyogQGJyaWVmIEVsaW1pbmF0ZXMgcGFydGljbGVzIHRoYXQgdG91Y2ggdGhlIGJvcmRlciBvZiB0aGUgaW1hZ2UuIAorKiBTdXBwb3J0cyBJTUFRX0lNQUdFX1U4LgorKgorKiBAcGFyYW0gZGVzdCBUaGUgZGVzdGluYXRpb24gaW1hZ2UuCisqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBpbWFnZS4gSWYgdGhlIGltYWdlIGhhcyBhIGJvcmRlciwgdGhlIGZ1bmN0aW9uIHNldHMgYWxsIGJvcmRlciBwaXhlbCB2YWx1ZXMgdG8gMC4KKyogQHBhcmFtIGNvbm5lY3Rpdml0eTggc3BlY2lmaWVzIHRoZSB0eXBlIG9mIGNvbm5lY3Rpdml0eSB1c2VkIGJ5IHRoZSBhbGdvcml0aG0gZm9yIHBhcnRpY2xlIGRldGVjdGlvbi4gCisqIFRoZSBjb25uZWN0aXZpdHkgbW9kZSBkaXJlY3RseSBkZXRlcm1pbmVzIHdoZXRoZXIgYW4gYWRqYWNlbnQgcGl4ZWwgYmVsb25ncyB0byB0aGUgc2FtZSBwYXJ0aWNsZSBvciBhIAorKiBkaWZmZXJlbnQgcGFydGljbGUuIFNldCB0byBUUlVFIHRvIHVzZSBjb25uZWN0aXZpdHktOCB0byBkZXRlcm1pbmUgd2hldGhlciBwYXJ0aWNsZXMgYXJlIHRvdWNoaW5nIAorKiBTZXQgdG8gRkFMU0UgdG8gdXNlIGNvbm5lY3Rpdml0eS00IHRvIGRldGVybWluZSB3aGV0aGVyIHBhcnRpY2xlcyBhcmUgdG91Y2hpbmcuIAorKiBUaGUgZGVmYXVsdCBzZXR0aW5nIGZvciB0aGUgc2ltcGxpZmllZCBjYWxsIGlzIFRSVUUKKyogQHJldHVybiBPbiBzdWNjZXNzOiAxLiBPbiBmYWlsdXJlOiAwLiBUbyBnZXQgZXh0ZW5kZWQgZXJyb3IgaW5mb3JtYXRpb24sIGNhbGwgR2V0TGFzdEVycm9yKCkuCisqLworaW50IGZyY1JlamVjdEJvcmRlcihJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSkKK3sJcmV0dXJuIGltYXFSZWplY3RCb3JkZXIoZGVzdCwgc291cmNlLCBUUlVFKTsgfQorCitpbnQgZnJjUmVqZWN0Qm9yZGVyKEltYWdlKiBkZXN0LCBJbWFnZSogc291cmNlLCBpbnQgY29ubmVjdGl2aXR5OCkKK3sJCisJcmV0dXJuIGltYXFSZWplY3RCb3JkZXIoZGVzdCwgc291cmNlLCBjb25uZWN0aXZpdHk4KTsKK30KKworCisvKioKKyogQGJyaWVmIENvdW50cyB0aGUgbnVtYmVyIG9mIHBhcnRpY2xlcyBpbiBhIGJpbmFyeSBpbWFnZS4gCisqIFN1cHBvcnRzIElNQVFfSU1BR0VfVTgsIElNQVFfSU1BR0VfSTE2LCBJTUFRX0lNQUdFX1NHTC4KKyogQHBhcmFtIGltYWdlIGJpbmFyeSAodGhyZXNob2xkZWQpIGltYWdlIAkKKyogQHBhcmFtIG51bVBhcnRpY2xlcyBPbiByZXR1cm4sIHRoZSBudW1iZXIgb2YgcGFydGljbGVzLgorKiBAcmV0dXJuIE9uIHN1Y2Nlc3M6IDEuIE9uIGZhaWx1cmU6IDAuIFRvIGdldCBleHRlbmRlZCBlcnJvciBpbmZvcm1hdGlvbiwgY2FsbCBHZXRMYXN0RXJyb3IoKS4gICAgCisqLworaW50IGZyY0NvdW50UGFydGljbGVzKEltYWdlKiBpbWFnZSwgaW50KiBudW1QYXJ0aWNsZXMpCQkJCQorewkKKwlyZXR1cm4gaW1hcUNvdW50UGFydGljbGVzKGltYWdlLCAxLCBudW1QYXJ0aWNsZXMpOworfQorCisKKy8qKgorKiBAYnJpZWYgQ29uZHVjdCBtZWFzdXJlbWVudHMgZm9yIGEgc2luZ2xlIHBhcnRpY2xlIGluIGFuIGltYWdlcy4gCisqIFN1cHBvcnRzIElNQVFfSU1BR0VfVTgsIElNQVFfSU1BR0VfSTE2LCBJTUFRX0lNQUdFX1NHTC4KKyogCisqIEBwYXJhbSBpbWFnZSBpbWFnZSB3aXRoIHRoZSBwYXJ0aWNsZSB0byBhbmFseXplLiBUaGlzIGZ1bmN0aW9uIG1vZGlmaWVzIHRoZSBzb3VyY2UgaW1hZ2UuIAorKiBJZiB5b3UgbmVlZCB0aGUgb3JpZ2luYWwgaW1hZ2UsIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIGltYWdlIHVzaW5nIGZyY0NvcHkoKSBiZWZvcmUgdXNpbmcgdGhpcyBmdW5jdGlvbi4KKyogQHBhcmFtIHBhcnRpY2xlTnVtYmVyIFRoZSBudW1iZXIgb2YgdGhlIHBhcnRpY2xlIHRvIGdldCBpbmZvcm1hdGlvbiBvbgorKiBAcGFyYW0gcGFyIG9uIHJldHVybiwgYSBwYXJ0aWNsZSBhbmFseXNpcyByZXBvcnQgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGFydGljbGUuIFRoaXMgc3RydWN0dXJlIG11c3QgYmUgY3JlYXRlZCBieSB0aGUgY2FsbGVyLgorKiBAcmV0dXJuIE9uIHN1Y2Nlc3M6IDEuIE9uIGZhaWx1cmU6IDAuIFRvIGdldCBleHRlbmRlZCBlcnJvciBpbmZvcm1hdGlvbiwgY2FsbCBHZXRMYXN0RXJyb3IoKS4KKyovCitpbnQgZnJjUGFydGljbGVBbmFseXNpcyhJbWFnZSogaW1hZ2UsIGludCBwYXJ0aWNsZU51bWJlciwgUGFydGljbGVBbmFseXNpc1JlcG9ydCogcGFyKQkJCQkKK3sKKwlpbnQgc3VjY2VzcyA9IDA7CisKKwkvKiBpbWFnZSBpbmZvcm1hdGlvbiAqLworCWludCBoZWlnaHQsIHdpZHRoOworCWlmICggISBpbWFxR2V0SW1hZ2VTaXplKGltYWdlLCAmd2lkdGgsICZoZWlnaHQpICkgCXsgcmV0dXJuIHN1Y2Nlc3M7IH0JCisJcGFyLT5pbWFnZVdpZHRoID0gd2lkdGg7CQorCXBhci0+aW1hZ2VIZWlnaHQgPSBoZWlnaHQ7CQorCXBhci0+cGFydGljbGVJbmRleCA9IHBhcnRpY2xlTnVtYmVyOwkJCisKKwkvKiBjZW50ZXIgb2YgbWFzcyBwb2ludCBvZiB0aGUgbGFyZ2VzdCBwYXJ0aWNsZQkqLworCWRvdWJsZSByZXR1cm5Eb3VibGU7CisJc3VjY2VzcyA9IGltYXFNZWFzdXJlUGFydGljbGUoaW1hZ2UsIHBhcnRpY2xlTnVtYmVyLCAwLCBJTUFRX01UX0NFTlRFUl9PRl9NQVNTX1gsICZyZXR1cm5Eb3VibGUpOworCWlmICggIXN1Y2Nlc3MgKQl7IHJldHVybiBzdWNjZXNzOyB9CisJcGFyLT5jZW50ZXJfbWFzc194ID0gKGludClyZXR1cm5Eb3VibGU7CQkJCQkJLy8gcGl4ZWwJCisKKwlzdWNjZXNzID0gaW1hcU1lYXN1cmVQYXJ0aWNsZShpbWFnZSwgcGFydGljbGVOdW1iZXIsIDAsIElNQVFfTVRfQ0VOVEVSX09GX01BU1NfWSwgJnJldHVybkRvdWJsZSk7CQorCWlmICggIXN1Y2Nlc3MgKQl7IHJldHVybiBzdWNjZXNzOyB9CisJcGFyLT5jZW50ZXJfbWFzc195ID0gKGludClyZXR1cm5Eb3VibGU7CQkJCQkJLy8gcGl4ZWwJCQorCQorCS8qIHBhcnRpY2xlIHNpemUgc3RhdGlzdGljcyAqLyAKKwlzdWNjZXNzID0gaW1hcU1lYXN1cmVQYXJ0aWNsZShpbWFnZSwgcGFydGljbGVOdW1iZXIsIDAsIElNQVFfTVRfQVJFQSwgJnJldHVybkRvdWJsZSk7CQorCWlmICggIXN1Y2Nlc3MgKQl7IHJldHVybiBzdWNjZXNzOyB9CisJcGFyLT5wYXJ0aWNsZUFyZWEgPSByZXR1cm5Eb3VibGU7CQorCQorCXN1Y2Nlc3MgPSBpbWFxTWVhc3VyZVBhcnRpY2xlKGltYWdlLCBwYXJ0aWNsZU51bWJlciwgMCwgSU1BUV9NVF9CT1VORElOR19SRUNUX1RPUCwgJnJldHVybkRvdWJsZSk7CQorCWlmICggIXN1Y2Nlc3MgKQl7IHJldHVybiBzdWNjZXNzOyB9CisJcGFyLT5ib3VuZGluZ1JlY3QudG9wID0gKGludClyZXR1cm5Eb3VibGU7CisJCisJc3VjY2VzcyA9IGltYXFNZWFzdXJlUGFydGljbGUoaW1hZ2UsIHBhcnRpY2xlTnVtYmVyLCAwLCBJTUFRX01UX0JPVU5ESU5HX1JFQ1RfTEVGVCwgJnJldHVybkRvdWJsZSk7CQorCWlmICggIXN1Y2Nlc3MgKQl7IHJldHVybiBzdWNjZXNzOyB9CisJcGFyLT5ib3VuZGluZ1JlY3QubGVmdCA9IChpbnQpcmV0dXJuRG91YmxlOworCQorCXN1Y2Nlc3MgPSBpbWFxTWVhc3VyZVBhcnRpY2xlKGltYWdlLCBwYXJ0aWNsZU51bWJlciwgMCwgSU1BUV9NVF9CT1VORElOR19SRUNUX0hFSUdIVCwgJnJldHVybkRvdWJsZSk7CQorCWlmICggIXN1Y2Nlc3MgKQl7IHJldHVybiBzdWNjZXNzOyB9CisJcGFyLT5ib3VuZGluZ1JlY3QuaGVpZ2h0ID0gKGludClyZXR1cm5Eb3VibGU7CQorCisJc3VjY2VzcyA9IGltYXFNZWFzdXJlUGFydGljbGUoaW1hZ2UsIHBhcnRpY2xlTnVtYmVyLCAwLCBJTUFRX01UX0JPVU5ESU5HX1JFQ1RfV0lEVEgsICZyZXR1cm5Eb3VibGUpOwkKKwlpZiAoICFzdWNjZXNzICkJeyByZXR1cm4gc3VjY2VzczsgfQorCXBhci0+Ym91bmRpbmdSZWN0LndpZHRoID0gKGludClyZXR1cm5Eb3VibGU7CQorCQorCS8qIHBhcnRpY2xlIHF1YWxpdHkgc3RhdGlzdGljcyAqLyAKKwlzdWNjZXNzID0gaW1hcU1lYXN1cmVQYXJ0aWNsZShpbWFnZSwgcGFydGljbGVOdW1iZXIsIDAsIElNQVFfTVRfQVJFQV9CWV9JTUFHRV9BUkVBLCAmcmV0dXJuRG91YmxlKTsJCisJaWYgKCAhc3VjY2VzcyApCXsgcmV0dXJuIHN1Y2Nlc3M7IH0KKwlwYXItPnBhcnRpY2xlVG9JbWFnZVBlcmNlbnQgPSByZXR1cm5Eb3VibGU7CisKKwlzdWNjZXNzID0gaW1hcU1lYXN1cmVQYXJ0aWNsZShpbWFnZSwgcGFydGljbGVOdW1iZXIsIDAsIElNQVFfTVRfQVJFQV9CWV9QQVJUSUNMRV9BTkRfSE9MRVNfQVJFQSwgJnJldHVybkRvdWJsZSk7CQorCWlmICggIXN1Y2Nlc3MgKQl7IHJldHVybiBzdWNjZXNzOyB9CisJcGFyLT5wYXJ0aWNsZVF1YWxpdHkgPSByZXR1cm5Eb3VibGU7CisJCQorCS8qIG5vcm1hbGl6ZWQgcG9zaXRpb24gKC0xIHRvIDEpICovCisJcGFyLT5jZW50ZXJfbWFzc194X25vcm1hbGl6ZWQgPSBSYW5nZVRvTm9ybWFsaXplZChwYXItPmNlbnRlcl9tYXNzX3gsIHdpZHRoKTsKKwlwYXItPmNlbnRlcl9tYXNzX3lfbm9ybWFsaXplZCA9IFJhbmdlVG9Ob3JtYWxpemVkKHBhci0+Y2VudGVyX21hc3NfeSwgaGVpZ2h0KTsJCisJCisJcmV0dXJuIHN1Y2Nlc3M7Cit9CisKKworLyogICBJbWFnZSBFbmhhbmNlbWVudCBmdW5jdGlvbnMgKi8KKworLyoqCisqIEBicmllZiBJbXByb3ZlcyBjb250cmFzdCBvbiBhIGdyYXlzY2FsZSBpbWFnZS4gCisqIFN1cHBvcnRzIElNQVFfSU1BR0VfVTgsIElNQVFfSU1BR0VfSTE2LgorKiBAcGFyYW0gZGVzdCBUaGUgZGVzdGluYXRpb24gaW1hZ2UuCisqIEBwYXJhbSBzb3VyY2UgVGhlIGltYWdlIHRvIGVxdWFsaXplIAorKiBAcGFyYW0gbWluIHRoZSBzbWFsbGVzdCB2YWx1ZSB1c2VkIGZvciBwcm9jZXNzaW5nLiBBZnRlciBwcm9jZXNzaW5nLCBhbGwgcGl4ZWwgdmFsdWVzIHRoYXQgYXJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgTWluaW11bSBpbiB0aGUgb3JpZ2luYWwgaW1hZ2UgYXJlIHNldCB0byAwIGZvciBhbiA4LWJpdCBpbWFnZS4gSW4gMTYtYml0IGFuZCBmbG9hdGluZy1wb2ludCBpbWFnZXMsIHRoZXNlIHBpeGVsIHZhbHVlcyBhcmUgc2V0IHRvIHRoZSBzbWFsbGVzdCBwaXhlbCB2YWx1ZSBmb3VuZCBpbiB0aGUgb3JpZ2luYWwgaW1hZ2UuIAorKiBAcGFyYW0gbWF4IHRoZSBsYXJnZXN0IHZhbHVlIHVzZWQgZm9yIHByb2Nlc3NpbmcuIEFmdGVyIHByb2Nlc3NpbmcsIGFsbCBwaXhlbCB2YWx1ZXMgdGhhdCBhcmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBNYXhpbXVtIGluIHRoZSBvcmlnaW5hbCBpbWFnZSBhcmUgc2V0IHRvIDI1NSBmb3IgYW4gOC1iaXQgaW1hZ2UuIEluIDE2LWJpdCBhbmQgZmxvYXRpbmctcG9pbnQgaW1hZ2VzLCB0aGVzZSBwaXhlbCB2YWx1ZXMgYXJlIHNldCB0byB0aGUgbGFyZ2VzdCBwaXhlbCB2YWx1ZSBmb3VuZCBpbiB0aGUgb3JpZ2luYWwgaW1hZ2UuIAorKiBAcGFyYW0gbWFzayBhbiA4LWJpdCBpbWFnZSB0aGF0IHNwZWNpZmllcyB0aGUgcmVnaW9uIG9mIHRoZSBzbWFsbCBpbWFnZSB0aGF0IHdpbGwgYmUgY29waWVkLiBPbmx5IHRob3NlIHBpeGVscyBpbiB0aGUgSW1hZ2UgU3JjIChTbWFsbCkgaW1hZ2UgdGhhdCBjb3JyZXNwb25kIHRvIGFuIGVxdWl2YWxlbnQgbm9uLXplcm8gcGl4ZWwgaW4gdGhlIG1hc2sgaW1hZ2UgYXJlIGNvcGllZC4gQWxsIG90aGVyIHBpeGVscyBrZWVwIHRoZWlyIG9yaWdpbmFsIHZhbHVlcy4gVGhlIGVudGlyZSBpbWFnZSBpcyBwcm9jZXNzZWQgaWYgSW1hZ2UgTWFzayBpcyBOVUxMIG9yIHRoaXMgcGFyYW1ldGVyIGlzIG9taXR0ZWQuCisqIEByZXR1cm4gT24gc3VjY2VzczogMS4gT24gZmFpbHVyZTogMC4gVG8gZ2V0IGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uLCBjYWxsIEdldExhc3RFcnJvcigpLgorKgorKiAgb3B0aW9uIGRlZmF1bHRzOgorKiAgICAgICBzZWFyY2hSZWN0ID0gSU1BUV9OT19SRUNUCisqIAkJbWluTWF0Y2hTY29yZSA9IERFRkFVTFRfTUlOTUFYX1NDT1JFICg4MDApICAKKyovCitpbnQgZnJjRXF1YWxpemUoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGZsb2F0IG1pbiwgZmxvYXQgbWF4KQorewlyZXR1cm4gZnJjRXF1YWxpemUoZGVzdCwgc291cmNlLCBtaW4sIG1heCwgTlVMTCk7ICB9CisKK2ludCBmcmNFcXVhbGl6ZShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgZmxvYXQgbWluLCBmbG9hdCBtYXgsIGNvbnN0IEltYWdlKiBtYXNrKQoreworCXJldHVybiBpbWFxRXF1YWxpemUoZGVzdCwgc291cmNlLCBtaW4sIG1heCwgbWFzayk7Cit9CisKKy8qKgorKiBAYnJpZWYgSW1wcm92ZXMgY29udHJhc3Qgb24gYSBjb2xvciBpbWFnZS4gCisqIFN1cHBvcnRzIElNQVFfSU1BR0VfUkdCLCBJTUFRX0lNQUdFX0hTTAorKiAKKyogb3B0aW9uIGRlZmF1bHRzOiBjb2xvckVxdWFsaXphdGlvbiA9IFRSVUUgdG8gZXF1YWxpemUgYWxsIHRocmVlIHBsYW5lcyBvZiB0aGUgaW1hZ2UgICAgICAgICAKKyogQHJldHVybiBPbiBzdWNjZXNzOiAxLiBPbiBmYWlsdXJlOiAwLiBUbyBnZXQgZXh0ZW5kZWQgZXJyb3IgaW5mb3JtYXRpb24sIGNhbGwgR2V0TGFzdEVycm9yKCkuICAgIAorKiBAcGFyYW0gZGVzdCBUaGUgZGVzdGluYXRpb24gaW1hZ2UuCisqIEBwYXJhbSBzb3VyY2UgVGhlIGltYWdlIHRvIGVxdWFsaXplIAorKiBAcGFyYW0gY29sb3JFcXVhbGl6YXRpb24gU2V0IHRoaXMgcGFyYW1ldGVyIHRvIFRSVUUgdG8gZXF1YWxpemUgYWxsIHRocmVlIHBsYW5lcyBvZiB0aGUgaW1hZ2UgKHRoZSBkZWZhdWx0KS4gU2V0IHRoaXMgcGFyYW1ldGVyIHRvIEZBTFNFIHRvIGVxdWFsaXplIG9ubHkgdGhlIGx1bWluYW5jZSBwbGFuZS4KKyovCitpbnQgZnJjQ29sb3JFcXVhbGl6ZShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSkKK3sKKwlyZXR1cm4gaW1hcUNvbG9yRXF1YWxpemUoZGVzdCwgc291cmNlLCBUUlVFKTsKK30KKworaW50IGZyY0NvbG9yRXF1YWxpemUoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGludCBjb2xvckVxdWFsaXphdGlvbikKK3sKKwlyZXR1cm4gaW1hcUNvbG9yRXF1YWxpemUoZGVzdCwgc291cmNlLCBUUlVFKTsKK30KKworLyogICBJbWFnZSBDb252ZXJzaW9uIGZ1bmN0aW9ucyAqLworCisvKioKKyogQGJyaWVmIEF1dG9tYXRpY2FsbHkgdGhyZXNob2xkcyBhIGdyYXlzY2FsZSBpbWFnZSBpbnRvIGEgYmluYXJ5IGltYWdlIGZvciBQYXJ0aWNsZSBBbmFseXNpcyBiYXNlZCBvbiBhIHNtYXJ0IHRocmVzaG9sZC4gCisqIFN1cHBvcnRzIElNQVFfSU1BR0VfUkdCLCBJTUFRX0lNQUdFX0kxNgorKiBAcGFyYW0gZGVzdCBUaGUgZGVzdGluYXRpb24gaW1hZ2UuCisqIEBwYXJhbSBzb3VyY2UgVGhlIGltYWdlIHRvIHRocmVzaG9sZCAKKyogQHBhcmFtIHdpbmRvd1dpZHRoIFRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ3VsYXIgd2luZG93IGFyb3VuZCB0aGUgcGl4ZWwgb24gd2hpY2ggdGhlIGZ1bmN0aW9uCisqICBwZXJmb3JtcyB0aGUgbG9jYWwgdGhyZXNob2xkLiBUaGlzIG51bWJlciBtdXN0IGJlIGF0IGxlYXN0IDMgYW5kIGNhbm5vdCBiZSBsYXJnZXIgdGhhbiB0aGUgd2lkdGggb2Ygc291cmNlCisqIEBwYXJhbSB3aW5kb3dIZWlnaHQgVGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ3VsYXIgd2luZG93IGFyb3VuZCB0aGUgcGl4ZWwgb24gd2hpY2ggdGhlIGZ1bmN0aW9uIAorKiBwZXJmb3JtcyB0aGUgbG9jYWwgdGhyZXNob2xkLiBUaGlzIG51bWJlciBtdXN0IGJlIGF0IGxlYXN0IDMgYW5kIGNhbm5vdCBiZSBsYXJnZXIgdGhhbiB0aGUgaGVpZ2h0IG9mIHNvdXJjZQorKiBAcGFyYW0gbWV0aG9kIFNwZWNpZmllcyB0aGUgbG9jYWwgdGhyZXNob2xkaW5nIG1ldGhvZCB0aGUgZnVuY3Rpb24gdXNlcy4gVmFsdWUgY2FuIGJlIElNQVFfTklCTEFDSyAKKyogKHdoaWNoIGNvbXB1dGVzIHRocmVzaG9sZHMgZm9yIGVhY2ggcGl4ZWwgYmFzZWQgb24gaXRzIGxvY2FsIHN0YXRpc3RpY3MgdXNpbmcgdGhlIE5pYmxhY2sgbG9jYWwgdGhyZXNob2xkaW5nCisqIGFsZ29yaXRobS4pLCBvciBJTUFRX0JBQ0tHUk9VTkRfQ09SUkVDVElPTiAod2hpY2ggZG9lcyBiYWNrZ3JvdW5kIGNvcnJlY3Rpb24gZmlyc3QgdG8gZWxpbWluYXRlIG5vbi11bmlmb3JtIAorKiBsaWdodGluZyBlZmZlY3RzLCB0aGVuIHBlcmZvcm1zIHRocmVzaG9sZGluZyB1c2luZyB0aGUgT3RzdSB0aHJlc2hvbGRpbmcgYWxnb3JpdGhtKQorKiBAcGFyYW0gZGV2aWF0aW9uV2VpZ2h0IFNwZWNpZmllcyB0aGUgayBjb25zdGFudCB1c2VkIGluIHRoZSBOaWJsYWNrIGxvY2FsIHRocmVzaG9sZGluZyBhbGdvcml0aG0sIHdoaWNoIAorKiBkZXRlcm1pbmVzIHRoZSB3ZWlnaHQgYXBwbGllZCB0byB0aGUgdmFyaWFuY2UgY2FsY3VsYXRpb24uIFZhbGlkIGsgY29uc3RhbnRzIHJhbmdlIGZyb20gMCB0byAxLiBTZXR0aW5nIAorKiB0aGlzIHZhbHVlIHRvIDAgd2lsbCBpbmNyZWFzZSB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIGZ1bmN0aW9uIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIHdpbGwgbm90IGNhbGN1bGF0ZSB0aGUgCisqIHZhcmlhbmNlIGZvciBhbnkgb2YgdGhlIHBpeGVscy4gVGhlIGZ1bmN0aW9uIGlnbm9yZXMgdGhpcyB2YWx1ZSBpZiBtZXRob2QgaXMgbm90IHNldCB0byBJTUFRX05JQkxBQ0sKKyogQHBhcmFtIHR5cGUgU3BlY2lmaWVzIHRoZSB0eXBlIG9mIG9iamVjdHMgZm9yIHdoaWNoIHlvdSB3YW50IHRvIGxvb2suIFZhbHVlcyBjYW4gYmUgSU1BUV9CUklHSFRfT0JKRUNUUyAKKyogb3IgSU1BUV9EQVJLX09CSkVDVFMuCisqIEBwYXJhbSByZXBsYWNlVmFsdWUgU3BlY2lmaWVzIHRoZSByZXBsYWNlbWVudCB2YWx1ZSB0aGUgZnVuY3Rpb24gdXNlcyBmb3IgdGhlIHBpeGVscyBvZiB0aGUga2VwdCBvYmplY3RzIAorKiBpbiB0aGUgZGVzdGluYXRpb24gaW1hZ2UuCisqIEByZXR1cm4gT24gc3VjY2VzczogMS4gT24gZmFpbHVyZTogMC4gVG8gZ2V0IGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uLCBjYWxsIEdldExhc3RFcnJvcigpLgorKi8KK2ludCBmcmNTbWFydFRocmVzaG9sZChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgCisJCXVuc2lnbmVkIGludCB3aW5kb3dXaWR0aCwgdW5zaWduZWQgaW50IHdpbmRvd0hlaWdodCwgTG9jYWxUaHJlc2hvbGRNZXRob2QgbWV0aG9kLCAKKwkJZG91YmxlIGRldmlhdGlvbldlaWdodCwgT2JqZWN0VHlwZSB0eXBlKQoreworCWZsb2F0IHJlcGxhY2VWYWx1ZSA9IDEuMDsKKwlyZXR1cm4gaW1hcUxvY2FsVGhyZXNob2xkKGRlc3QsIHNvdXJjZSwgd2luZG93V2lkdGgsIHdpbmRvd0hlaWdodCwgbWV0aG9kLCAKKwkJCWRldmlhdGlvbldlaWdodCwgdHlwZSwgcmVwbGFjZVZhbHVlKTsKK30KKworaW50IGZyY1NtYXJ0VGhyZXNob2xkKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCAKKwkJdW5zaWduZWQgaW50IHdpbmRvd1dpZHRoLCB1bnNpZ25lZCBpbnQgd2luZG93SGVpZ2h0LCBMb2NhbFRocmVzaG9sZE1ldGhvZCBtZXRob2QsIAorCQlkb3VibGUgZGV2aWF0aW9uV2VpZ2h0LCBPYmplY3RUeXBlIHR5cGUsIGZsb2F0IHJlcGxhY2VWYWx1ZSkKK3sKKwlyZXR1cm4gaW1hcUxvY2FsVGhyZXNob2xkKGRlc3QsIHNvdXJjZSwgd2luZG93V2lkdGgsIHdpbmRvd0hlaWdodCwgbWV0aG9kLCAKKwkJCWRldmlhdGlvbldlaWdodCwgdHlwZSwgcmVwbGFjZVZhbHVlKTsKK30KKworLyoqCisqIEBicmllZiBDb252ZXJ0cyBhIGdyYXlzY2FsZSBpbWFnZSB0byBhIGJpbmFyeSBpbWFnZSBmb3IgUGFydGljbGUgQW5hbHlzaXMgYmFzZWQgb24gYSBmaXhlZCB0aHJlc2hvbGQuIAorKiBUaGUgZnVuY3Rpb24gc2V0cyBwaXhlbHMgdmFsdWVzIG91dHNpZGUgb2YgdGhlIGdpdmVuIHJhbmdlIHRvIDAuIFRoZSBmdW5jdGlvbiBzZXRzIHBpeGVsIHZhbHVlcyAKKyogd2l0aGluIHRoZSByYW5nZSB0byBhIGdpdmVuIHZhbHVlIG9yIGxlYXZlcyB0aGUgdmFsdWVzIHVuY2hhbmdlZC4gCisqIFVzZSB0aGUgc2ltcGxpZmllZCBjYWxsIHRvIGxlYXZlIHBpeGVsIHZhbHVlcyB1bmNoYW5nZWQuCisqIFN1cHBvcnRzIElNQVFfSU1BR0VfUkdCLCBJTUFRX0lNQUdFX0kxNi4KKyogCisqIEBwYXJhbSBkZXN0IFRoZSBkZXN0aW5hdGlvbiBpbWFnZS4KKyogQHBhcmFtIHNvdXJjZSBUaGUgaW1hZ2UgdG8gdGhyZXNob2xkIAorKiBAcGFyYW0gcmFuZ2VNaW4gVGhlIGxvd2VyIGJvdW5kYXJ5IG9mIHRoZSByYW5nZSBvZiBwaXhlbCB2YWx1ZXMgdG8ga2VlcAorKiBAcGFyYW0gcmFuZ2VNYXggVGhlIHVwcGVyIGJvdW5kYXJ5IG9mIHRoZSByYW5nZSBvZiBwaXhlbCB2YWx1ZXMgdG8ga2VlcC4KKyogCisqIEByZXR1cm4gaW50IC0gZXJyb3IgY29kZTogMCA9IGVycm9yLiBUbyBnZXQgZXh0ZW5kZWQgZXJyb3IgaW5mb3JtYXRpb24sIGNhbGwgR2V0TGFzdEVycm9yKCkuCisqLworaW50IGZyY1NpbXBsZVRocmVzaG9sZChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgZmxvYXQgcmFuZ2VNaW4sIGZsb2F0IHJhbmdlTWF4KQoreworCWludCBuZXdWYWx1ZSA9IDI1NTsKKwlyZXR1cm4gZnJjU2ltcGxlVGhyZXNob2xkKGRlc3QsIHNvdXJjZSwgcmFuZ2VNaW4sIHJhbmdlTWF4LCBuZXdWYWx1ZSk7Cit9CisKKy8qKgorKiBAYnJpZWYgQ29udmVydHMgYSBncmF5c2NhbGUgaW1hZ2UgdG8gYSBiaW5hcnkgaW1hZ2UgZm9yIFBhcnRpY2xlIEFuYWx5c2lzIGJhc2VkIG9uIGEgZml4ZWQgdGhyZXNob2xkLiAKKyogVGhlIGZ1bmN0aW9uIHNldHMgcGl4ZWxzIHZhbHVlcyBvdXRzaWRlIG9mIHRoZSBnaXZlbiByYW5nZSB0byAwLiBUaGUgZnVuY3Rpb24gc2V0cyAKKyogcGl4ZWwgdmFsdWVzIHdpdGhpbiB0aGUgcmFuZ2UgdG8gdGhlIGdpdmVuIHZhbHVlLiAKKyogU3VwcG9ydHMgSU1BUV9JTUFHRV9SR0IsIElNQVFfSU1BR0VfSTE2LgorKiAKKyogQHBhcmFtIGRlc3QgVGhlIGRlc3RpbmF0aW9uIGltYWdlLgorKiBAcGFyYW0gc291cmNlIFRoZSBpbWFnZSB0byB0aHJlc2hvbGQgCisqIEBwYXJhbSByYW5nZU1pbiBUaGUgbG93ZXIgYm91bmRhcnkgb2YgdGhlIHJhbmdlIG9mIHBpeGVsIHZhbHVlcyB0byBrZWVwCisqIEBwYXJhbSByYW5nZU1heCBUaGUgdXBwZXIgYm91bmRhcnkgb2YgdGhlIHJhbmdlIG9mIHBpeGVsIHZhbHVlcyB0byBrZWVwLgorKiBAcGFyYW0gbmV3VmFsdWUgVGhlIHJlcGxhY2VtZW50IHZhbHVlIGZvciBwaXhlbHMgd2l0aGluIHRoZSByYW5nZS4gVXNlIHRoZSBzaW1wbGlmaWVkIGNhbGwgdG8gbGVhdmUgdGhlIHBpeGVsIHZhbHVlcyB1bmNoYW5nZWQgCisqIAorKiBAcmV0dXJuIGludCAtIGVycm9yIGNvZGU6IDAgPSBlcnJvci4gVG8gZ2V0IGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uLCBjYWxsIEdldExhc3RFcnJvcigpLgorKi8KK2ludCBmcmNTaW1wbGVUaHJlc2hvbGQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGZsb2F0IHJhbmdlTWluLCBmbG9hdCByYW5nZU1heCwgZmxvYXQgbmV3VmFsdWUpCit7CisJaW50IHVzZU5ld1ZhbHVlID0gVFJVRTsKKwlyZXR1cm4gaW1hcVRocmVzaG9sZChkZXN0LCBzb3VyY2UsIHJhbmdlTWluLCByYW5nZU1heCwgdXNlTmV3VmFsdWUsIG5ld1ZhbHVlKTsKK30KKworLyoqCisqIEBicmllZiBBcHBsaWVzIGEgdGhyZXNob2xkIHRvIHRoZSBSZWQsIEdyZWVuLCBhbmQgQmx1ZSB2YWx1ZXMgb2YgYSBSR0IgaW1hZ2Ugb3IgdGhlIEh1ZSwgCisqIFNhdHVyYXRpb24sIEx1bWluYW5jZSB2YWx1ZXMgZm9yIGEgSFNMIGltYWdlLiAKKyogU3VwcG9ydHMgSU1BUV9JTUFHRV9SR0IsIElNQVFfSU1BR0VfSFNMLgorKiBUaGlzIHNpbXBsZXIgdmVyc2lvbiBmaWx0ZXJzIGJhc2VkIG9uIGEgaHVlIHJhbmdlIGluIHRoZSBIU0wgbW9kZS4KKyogCisqIEBwYXJhbSBkZXN0IFRoZSBkZXN0aW5hdGlvbiBpbWFnZS4gVGhpcyBtdXN0IGJlIGEgSU1BUV9JTUFHRV9VOCBpbWFnZS4KKyogQHBhcmFtIHNvdXJjZSBUaGUgaW1hZ2UgdG8gdGhyZXNob2xkIAorKiBAcGFyYW0gbW9kZSBUaGUgY29sb3Igc3BhY2UgdG8gcGVyZm9ybSB0aGUgdGhyZXNob2xkIGluLiB2YWxpZCB2YWx1ZXMgYXJlOiBJTUFRX1JHQiwgSU1BUV9IU0wuCisqIEBwYXJhbSBwbGFuZTFSYW5nZSBUaGUgc2VsZWN0aW9uIHJhbmdlIGZvciB0aGUgZmlyc3QgcGxhbmUgb2YgdGhlIGltYWdlLiBTZXQgdGhpcyBwYXJhbWV0ZXIgdG8gTlVMTCB0byB1c2UgYSBzZWxlY3Rpb24gcmFuZ2UgZnJvbSAwIHRvIDI1NS4KKyogQHBhcmFtIHBsYW5lMlJhbmdlIFRoZSBzZWxlY3Rpb24gcmFuZ2UgZm9yIHRoZSBzZWNvbmQgcGxhbmUgb2YgdGhlIGltYWdlLiBTZXQgdGhpcyBwYXJhbWV0ZXIgdG8gTlVMTCB0byB1c2UgYSBzZWxlY3Rpb24gcmFuZ2UgZnJvbSAwIHRvIDI1NS4KKyogQHBhcmFtIHBsYW5lM1JhbmdlIFRoZSBzZWxlY3Rpb24gcmFuZ2UgZm9yIHRoZSB0aGlyZCBwbGFuZSBvZiB0aGUgaW1hZ2UuIFNldCB0aGlzIHBhcmFtZXRlciB0byBOVUxMIHRvIHVzZSBhIHNlbGVjdGlvbiByYW5nZSBmcm9tIDAgdG8gMjU1LgorKiAKKyogQHJldHVybiBPbiBzdWNjZXNzOiAxLiBPbiBmYWlsdXJlOiAwLiBUbyBnZXQgZXh0ZW5kZWQgZXJyb3IgaW5mb3JtYXRpb24sIGNhbGwgR2V0TGFzdEVycm9yKCkuCisqICovCitpbnQgZnJjQ29sb3JUaHJlc2hvbGQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIENvbG9yTW9kZSBtb2RlLCAKKwkJY29uc3QgUmFuZ2UqIHBsYW5lMVJhbmdlLCBjb25zdCBSYW5nZSogcGxhbmUyUmFuZ2UsIGNvbnN0IFJhbmdlKiBwbGFuZTNSYW5nZSkKK3sKKwlpbnQgcmVwbGFjZVZhbHVlID0gMTsKKwlyZXR1cm4gaW1hcUNvbG9yVGhyZXNob2xkKGRlc3QsIHNvdXJjZSwgcmVwbGFjZVZhbHVlLCBtb2RlLCBwbGFuZTFSYW5nZSwgcGxhbmUyUmFuZ2UsIHBsYW5lM1JhbmdlKTsKK30KKworLyoqCisqIEBicmllZiBBcHBsaWVzIGEgdGhyZXNob2xkIHRvIHRoZSBSZWQsIEdyZWVuLCBhbmQgQmx1ZSB2YWx1ZXMgb2YgYSBSR0IgaW1hZ2Ugb3IgdGhlIEh1ZSwgCisqIFNhdHVyYXRpb24sIEx1bWluYW5jZSB2YWx1ZXMgZm9yIGEgSFNMIGltYWdlLiAKKyogU3VwcG9ydHMgSU1BUV9JTUFHRV9SR0IsIElNQVFfSU1BR0VfSFNMLgorKiBUaGUgc2ltcGxlciB2ZXJzaW9uIGZpbHRlcnMgYmFzZWQgb24gYSBodWUgcmFuZ2UgaW4gdGhlIEhTTCBtb2RlLgorKiAKKyogQHBhcmFtIGRlc3QgVGhlIGRlc3RpbmF0aW9uIGltYWdlLiBUaGlzIG11c3QgYmUgYSBJTUFRX0lNQUdFX1U4IGltYWdlLgorKiBAcGFyYW0gc291cmNlIFRoZSBpbWFnZSB0byB0aHJlc2hvbGQgCisqIEBwYXJhbSByZXBsYWNlVmFsdWUgVmFsdWUgdG8gYXNzaWduIHRvIHNlbGVjdGVkIHBpeGVscy4gRGVmYXVsdHMgdG8gMSBpZiBzaW1wbGlmaWVkIGNhbGwgaXMgdXNlZC4KKyogQHBhcmFtIG1vZGUgVGhlIGNvbG9yIHNwYWNlIHRvIHBlcmZvcm0gdGhlIHRocmVzaG9sZCBpbi4gdmFsaWQgdmFsdWVzIGFyZTogSU1BUV9SR0IsIElNQVFfSFNMLgorKiBAcGFyYW0gcGxhbmUxUmFuZ2UgVGhlIHNlbGVjdGlvbiByYW5nZSBmb3IgdGhlIGZpcnN0IHBsYW5lIG9mIHRoZSBpbWFnZS4gU2V0IHRoaXMgcGFyYW1ldGVyIHRvIE5VTEwgdG8gdXNlIGEgc2VsZWN0aW9uIHJhbmdlIGZyb20gMCB0byAyNTUuCisqIEBwYXJhbSBwbGFuZTJSYW5nZSBUaGUgc2VsZWN0aW9uIHJhbmdlIGZvciB0aGUgc2Vjb25kIHBsYW5lIG9mIHRoZSBpbWFnZS4gU2V0IHRoaXMgcGFyYW1ldGVyIHRvIE5VTEwgdG8gdXNlIGEgc2VsZWN0aW9uIHJhbmdlIGZyb20gMCB0byAyNTUuCisqIEBwYXJhbSBwbGFuZTNSYW5nZSBUaGUgc2VsZWN0aW9uIHJhbmdlIGZvciB0aGUgdGhpcmQgcGxhbmUgb2YgdGhlIGltYWdlLiBTZXQgdGhpcyBwYXJhbWV0ZXIgdG8gTlVMTCB0byB1c2UgYSBzZWxlY3Rpb24gcmFuZ2UgZnJvbSAwIHRvIDI1NS4KKyogCisqIEByZXR1cm4gT24gc3VjY2VzczogMS4gT24gZmFpbHVyZTogMC4gVG8gZ2V0IGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uLCBjYWxsIEdldExhc3RFcnJvcigpLgorKi8KK2ludCBmcmNDb2xvclRocmVzaG9sZChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgaW50IHJlcGxhY2VWYWx1ZSwgQ29sb3JNb2RlIG1vZGUsIAorCQljb25zdCBSYW5nZSogcGxhbmUxUmFuZ2UsIGNvbnN0IFJhbmdlKiBwbGFuZTJSYW5nZSwgY29uc3QgUmFuZ2UqIHBsYW5lM1JhbmdlKQorewlyZXR1cm4gaW1hcUNvbG9yVGhyZXNob2xkKGRlc3QsIHNvdXJjZSwgcmVwbGFjZVZhbHVlLCBtb2RlLCBwbGFuZTFSYW5nZSwgcGxhbmUyUmFuZ2UsIHBsYW5lM1JhbmdlKTt9CisKKworLyoqCisqIEBicmllZiBBIHNpbXBsZXIgdmVyc2lvbiBvZiBDb2xvclRocmVzaG9sZCB0aGF0IHRocmVzaG9sZHMgaHVlIHJhbmdlIGluIHRoZSBIU0wgbW9kZS4gU3VwcG9ydHMgSU1BUV9JTUFHRV9SR0IsIElNQVFfSU1BR0VfSFNMLgorKiBAcGFyYW0gZGVzdCBUaGUgZGVzdGluYXRpb24gaW1hZ2UuCisqIEBwYXJhbSBzb3VyY2UgVGhlIGltYWdlIHRvIHRocmVzaG9sZCAKKyogQHBhcmFtIGh1ZVJhbmdlIFRoZSBzZWxlY3Rpb24gcmFuZ2UgZm9yIHRoZSBodWUgKGNvbG9yKS4gCisqIEBwYXJhbSBtaW5TYXR1cmF0aW9uIFRoZSBtaW5pbXVtIHNhdHVyYXRpb24gdmFsdWUgKDEtMjU1KS4gIElmIG5vdCB1c2VkLCBERUZBVUxUX1NBVFVSQVRJT05fVEhSRVNIT0xEIGlzIHRoZSBkZWZhdWx0LgorKiAKKyogQHJldHVybiBPbiBzdWNjZXNzOiAxLiBPbiBmYWlsdXJlOiAwLiBUbyBnZXQgZXh0ZW5kZWQgZXJyb3IgaW5mb3JtYXRpb24sIGNhbGwgR2V0TGFzdEVycm9yKCkuCisqLworaW50IGZyY0h1ZVRocmVzaG9sZChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgY29uc3QgUmFuZ2UqIGh1ZVJhbmdlKQoreyByZXR1cm4gZnJjSHVlVGhyZXNob2xkKGRlc3QsIHNvdXJjZSwgaHVlUmFuZ2UsIERFRkFVTFRfU0FUVVJBVElPTl9USFJFU0hPTEQpOyB9CisKK2ludCBmcmNIdWVUaHJlc2hvbGQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGNvbnN0IFJhbmdlKiBodWVSYW5nZSwgaW50IG1pblNhdHVyYXRpb24pCit7CisJLy8gYXNzdW1lIEhTTCBtb2RlCisJQ29sb3JNb2RlIG1vZGUgPSBJTUFRX0hTTDsgIAorCS8vIFNldCBzYXR1cmF0aW9uIDEwMCAtIDI1NQorCVJhbmdlIHNhdFJhbmdlOyAgc2F0UmFuZ2UubWluVmFsdWUgPSBtaW5TYXR1cmF0aW9uOyBzYXRSYW5nZS5tYXhWYWx1ZSA9IDI1NTsKKwkvLyBTZXQgbHVtaW5hbmNlIDEwMCAtIDI1NQorCVJhbmdlIGx1bVJhbmdlOyAgbHVtUmFuZ2UubWluVmFsdWUgPSAxMDA7IGx1bVJhbmdlLm1heFZhbHVlID0gMjU1OworCS8vIFJlcGxhY2UgcGl4ZWxzIHdpdGggMSBpZiBwYXNzIHRocmVzaG9sZCBmaWx0ZXIKKwlpbnQgcmVwbGFjZVZhbHVlID0gMTsKKwlyZXR1cm4gaW1hcUNvbG9yVGhyZXNob2xkKGRlc3QsIHNvdXJjZSwgcmVwbGFjZVZhbHVlLCBtb2RlLCBodWVSYW5nZSwgJnNhdFJhbmdlLCAmbHVtUmFuZ2UpOworfQorCisvKioKKyogQGJyaWVmIEV4dHJhY3RzIHRoZSBSZWQsIEdyZWVuLCBCbHVlLCBvciBIdWUsIFNhdHVyYXRpb24gb3IgTHVtaW5hbmNlIGluZm9ybWF0aW9uIGZyb20gYSBjb2xvciBpbWFnZS4gCisqIFN1cHBvcnRzIElNQVFfSU1BR0VfUkdCLCBJTUFRX0lNQUdFX0hTTCwgSU1BUV9JTUFHRV9SR0JfVTY0LgorKiAKKyogQHBhcmFtIGltYWdlIFRoZSBzb3VyY2UgaW1hZ2UgdGhhdCB0aGUgZnVuY3Rpb24gZXh0cmFjdHMgdGhlIHBsYW5lcyBmcm9tLgorKiBAcGFyYW0gbW9kZSBUaGUgY29sb3Igc3BhY2UgdGhhdCB0aGUgZnVuY3Rpb24gZXh0cmFjdHMgdGhlIHBsYW5lcyBmcm9tLiBWYWxpZCB2YWx1ZXMgYXJlIElNQVFfUkdCLCBJTUFRX0hTTCwgSU1BUV9IU1YsIElNQVFfSFNJLgorKiBAcGFyYW0gcGxhbmUxIE9uIHJldHVybiwgdGhlIGZpcnN0IGV4dHJhY3RlZCBwbGFuZS4gU2V0IHRoaXMgcGFyYW1ldGVyIHRvIE5VTEwgaWYgeW91IGRvIG5vdCBuZWVkIHRoaXMgaW5mb3JtYXRpb24uIFJHQi1SZWQsIEhTTC9IU1YvSFNJLUh1ZS4KKyogQHBhcmFtIHBsYW5lMiBPbiByZXR1cm4sIHRoZSBzZWNvbmQgZXh0cmFjdGVkIHBsYW5lLiBTZXQgdGhpcyBwYXJhbWV0ZXIgdG8gTlVMTCBpZiB5b3UgZG8gbm90IG5lZWQgdGhpcyBpbmZvcm1hdGlvbi4gUkdCLUdyZWVuLCBIU0wvSFNWL0hTSS1TYXR1cmF0aW9uLgorKiBAcGFyYW0gcGxhbmUzIE9uIHJldHVybiwgdGhlIHRoaXJkIGV4dHJhY3RlZCBwbGFuZS4gU2V0IHRoaXMgcGFyYW1ldGVyIHRvIE5VTEwgaWYgeW91IGRvIG5vdCBuZWVkIHRoaXMgaW5mb3JtYXRpb24uIFJHQi1CbHVlLCBIU0wtTHVtaW5hbmNlLCBIU1YtVmFsdWUsIEhTSS1JbnRlbnNpdHkuCisqCisqIEByZXR1cm4gZXJyb3IgY29kZTogMCA9IGVycm9yLiBUbyBnZXQgZXh0ZW5kZWQgZXJyb3IgaW5mb3JtYXRpb24sIGNhbGwgR2V0TGFzdEVycm9yKCkuCisqLworaW50IGZyY0V4dHJhY3RDb2xvclBsYW5lcyhjb25zdCBJbWFnZSogaW1hZ2UsIENvbG9yTW9kZSBtb2RlLCAKKwkJSW1hZ2UqIHBsYW5lMSwgSW1hZ2UqIHBsYW5lMiwgSW1hZ2UqIHBsYW5lMykKK3sJcmV0dXJuIGltYXFFeHRyYWN0Q29sb3JQbGFuZXMoaW1hZ2UsIG1vZGUsIHBsYW5lMSwgcGxhbmUyLCBwbGFuZTMpOyB9CisKKy8qKgorKiBAYnJpZWYgRXh0cmFjdHMgdGhlIEh1ZSBpbmZvcm1hdGlvbiBmcm9tIGEgY29sb3IgaW1hZ2UuIFN1cHBvcnRzIElNQVFfSU1BR0VfUkdCLCBJTUFRX0lNQUdFX0hTTCwgSU1BUV9JTUFHRV9SR0JfVTY0IAorKiAKKyogQHBhcmFtIGltYWdlIFRoZSBzb3VyY2UgaW1hZ2UgdGhhdCB0aGUgZnVuY3Rpb24gZXh0cmFjdHMgdGhlIHBsYW5lIGZyb20uCisqIEBwYXJhbSBodWVQbGFuZSBPbiByZXR1cm4sIHRoZSBleHRyYWN0ZWQgaHVlIHBsYW5lLiAKKyogQHBhcmFtIG1pblNhdHVyYXRpb24gdGhlIG1pbmltdW0gc2F0dXJhdGlvbiBsZXZlbCByZXF1aXJlZCAwLTI1NSAodHJ5IDUwKSAgCisqICAgICAgICAgIAorKiBAcmV0dXJuIE9uIHN1Y2Nlc3M6IDEuIE9uIGZhaWx1cmU6IDAuIFRvIGdldCBleHRlbmRlZCBlcnJvciBpbmZvcm1hdGlvbiwgY2FsbCBHZXRMYXN0RXJyb3IoKS4gICAgIAorKi8KK2ludCBmcmNFeHRyYWN0SHVlUGxhbmUoY29uc3QgSW1hZ2UqIGltYWdlLCBJbWFnZSogaHVlUGxhbmUpCit7CisJcmV0dXJuIGZyY0V4dHJhY3RIdWVQbGFuZShpbWFnZSwgaHVlUGxhbmUsIERFRkFVTFRfU0FUVVJBVElPTl9USFJFU0hPTEQpOworfQorCitpbnQgZnJjRXh0cmFjdEh1ZVBsYW5lKGNvbnN0IEltYWdlKiBpbWFnZSwgSW1hZ2UqIGh1ZVBsYW5lLCBpbnQgbWluU2F0dXJhdGlvbikKK3sKKwlyZXR1cm4gZnJjRXh0cmFjdENvbG9yUGxhbmVzKGltYWdlLCBJTUFRX0hTTCwgaHVlUGxhbmUsIE5VTEwsIE5VTEwpOworfQorCisKKworCisKKworCisK