LyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCiNpZm5kZWYgU05NUF9BUElfSAojZGVmaW5lIFNOTVBfQVBJX0gKCi8qCiAqIEBmaWxlIHNubXBfYXBpLmggLSBBUEkgZm9yIGFjY2VzcyB0byBzbm1wLgogKiAKICogQGFkZHRvZ3JvdXAgbGlicmFyeQogKgogKiBDYXV0aW9uOiB3aGVuIHVzaW5nIHRoaXMgbGlicmFyeSBpbiBhIG11bHRpLXRocmVhZGVkIGFwcGxpY2F0aW9uLAogKiB0aGUgdmFsdWVzIG9mIGdsb2JhbCB2YXJpYWJsZXMgInNubXBfZXJybm8iIGFuZCAic25tcF9kZXRhaWwiCiAqIGNhbm5vdCBiZSByZWxpYWJseSBkZXRlcm1pbmVkLiAgU3VnZ2VzdCB1c2luZyBzbm1wX2Vycm9yKCkKICogdG8gb2J0YWluIHRoZSBsaWJyYXJ5IGVycm9yIGNvZGVzLgogKgogKiBAewogKi8KCiNpZm5kZWYgRE9OVF9TSEFSRV9FUlJPUl9XSVRIX09USEVSX1RIUkVBRFMKI2RlZmluZSBTRVRfU05NUF9FUlJPUih4KSBzbm1wX2Vycm5vPSh4KQojZWxzZQojZGVmaW5lIFNFVF9TTk1QX0VSUk9SKHgpCiNlbmRpZgoKCiNpZmRlZiBfX2NwbHVzcGx1cwpleHRlcm4gICAgICAgICAgIkMiIHsKI2VuZGlmCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCUNvcHlyaWdodCAxOTg5IGJ5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CgogICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAoKUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCmRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdApib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4Kc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBDTVUgbm90IGJlCnVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQpzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCgpDTVUgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORwpBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKQ01VIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUgpBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCldIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwKQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUwpTT0ZUV0FSRS4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqIEB0eXBlZGVmIHN0cnVjdCB2YXJpYWJsZV9saXN0IG5ldHNubXBfdmFyaWFibGVfbGlzdAogICAgKiBUeXBlZGVmcyB0aGUgdmFyaWFibGVfbGlzdCBzdHJ1Y3QgaW50byBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKi8Kc3RydWN0IHZhcmlhYmxlX2xpc3Q7CnR5cGVkZWYgc3RydWN0IHZhcmlhYmxlX2xpc3QgbmV0c25tcF92YXJpYWJsZV9saXN0OwpzdHJ1Y3QgdGltZXZhbDsKc3RydWN0IG5ldHNubXBfdHJhbnNwb3J0X3M7CgojZGVmaW5lIFVTTV9BVVRIX0tVX0xFTiAgICAgMzIKI2RlZmluZSBVU01fUFJJVl9LVV9MRU4gICAgIDMyCgovKiogQHR5cGVkZWYgc3RydWN0IHNubXBfcGR1IHRvIG5ldHNubXBfcGR1CiAgICAqIFR5cGVkZWZzIHRoZSBzbm1wX3BkdSBzdHJ1Y3QgaW50byBuZXRzbm1wX3BkdSAqLwovKiogQHN0cnVjdCBzbm1wX3BkdQogKiBUaGUgc25tcCBwcm90b2NvbCBkYXRhIHVuaXQuCiAqLwkKdHlwZWRlZiBzdHJ1Y3Qgc25tcF9wZHUgewoKICAgIC8qCiAgICAgKiBQcm90b2NvbC12ZXJzaW9uIGluZGVwZW5kZW50IGZpZWxkcwogICAgICovCiAgICAvKiogc25tcCB2ZXJzaW9uICovCiAgICBsb25nICAgICAgICAgICAgdmVyc2lvbjsKICAgIC8qKiBUeXBlIG9mIHRoaXMgUERVICovCQogICAgaW50ICAgICAgICAgICAgIGNvbW1hbmQ7CiAgICAvKiogUmVxdWVzdCBpZCAtIG5vdGU6IG5vdCBpbmNyZW1lbnRlZCBvbiByZXRyaWVzICovCiAgICBsb25nICAgICAgICAgICAgcmVxaWQ7ICAKICAgIC8qKiBNZXNzYWdlIGlkIGZvciBWMyBtZXNzYWdlcyBub3RlOiBpbmNyZW1lbnRlZCBmb3IgZWFjaCByZXRyeSAqLwogICAgbG9uZyAgICAgICAgICAgIG1zZ2lkOwogICAgLyoqIFVuaXF1ZSBJRCBmb3IgaW5jb21pbmcgdHJhbnNhY3Rpb25zICovCiAgICBsb25nICAgICAgICAgICAgdHJhbnNpZDsKICAgIC8qKiBTZXNzaW9uIGlkIGZvciBBZ2VudFggbWVzc2FnZXMgKi8KICAgIGxvbmcgICAgICAgICAgICBzZXNzaWQ7CiAgICAvKiogRXJyb3Igc3RhdHVzIChub25fcmVwZWF0ZXJzIGluIEdldEJ1bGspICovCiAgICBsb25nICAgICAgICAgICAgZXJyc3RhdDsKICAgIC8qKiBFcnJvciBpbmRleCAobWF4X3JlcGV0aXRpb25zIGluIEdldEJ1bGspICovCiAgICBsb25nICAgICAgICAgICAgZXJyaW5kZXg7ICAgICAgIAogICAgLyoqIFVwdGltZSAqLwogICAgdV9sb25nICAgICAgICAgIHRpbWU7ICAgCiAgICB1X2xvbmcgICAgICAgICAgZmxhZ3M7CgogICAgaW50ICAgICAgICAgICAgIHNlY3VyaXR5TW9kZWw7CiAgICAvKiogbm9BdXRoTm9Qcml2LCBhdXRoTm9Qcml2LCBhdXRoUHJpdiAqLwogICAgaW50ICAgICAgICAgICAgIHNlY3VyaXR5TGV2ZWw7ICAKICAgIGludCAgICAgICAgICAgICBtc2dQYXJzZU1vZGVsOwoKICAgIC8qKgogICAgICogVHJhbnNwb3J0LXNwZWNpZmljIG9wYXF1ZSBkYXRhLiAgVGhpcyByZXBsYWNlcyB0aGUgSVAtY2VudHJpYyBhZGRyZXNzCiAgICAgKiBmaWVsZC4gIAogICAgICovCiAgICAKICAgIHZvaWQgICAgICAgICAgICp0cmFuc3BvcnRfZGF0YTsKICAgIGludCAgICAgICAgICAgICB0cmFuc3BvcnRfZGF0YV9sZW5ndGg7CgogICAgLyoqCiAgICAgKiBUaGUgYWN0dWFsIHRyYW5zcG9ydCBkb21haW4uICBUaGlzIFNIT1VMRCBOT1QgQkUgRlJFRSgpRC4gIAogICAgICovCgogICAgY29uc3Qgb2lkICAgICAgKnREb21haW47CiAgICBzaXplX3QgICAgICAgICAgdERvbWFpbkxlbjsKCiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcmlhYmxlczsKCgogICAgLyoKICAgICAqIFNOTVB2MSAmIFNOTVB2MmMgZmllbGRzCiAgICAgKi8KICAgIC8qKiBjb21tdW5pdHkgZm9yIG91dGdvaW5nIHJlcXVlc3RzLiAqLwogICAgdV9jaGFyICAgICAgICAgKmNvbW11bml0eTsKICAgIC8qKiBsZW5ndGggb2YgY29tbXVuaXR5IG5hbWUuICovCiAgICBzaXplX3QgICAgICAgICAgY29tbXVuaXR5X2xlbjsgIAoKICAgIC8qCiAgICAgKiBUcmFwIGluZm9ybWF0aW9uCiAgICAgKi8KICAgIC8qKiBTeXN0ZW0gT0lEICovCiAgICBvaWQgICAgICAgICAgICAqZW50ZXJwcmlzZTsgICAgIAogICAgc2l6ZV90ICAgICAgICAgIGVudGVycHJpc2VfbGVuZ3RoOwogICAgLyoqIHRyYXAgdHlwZSAqLwogICAgbG9uZyAgICAgICAgICAgIHRyYXBfdHlwZTsKICAgIC8qKiBzcGVjaWZpYyB0eXBlICovCiAgICBsb25nICAgICAgICAgICAgc3BlY2lmaWNfdHlwZTsKICAgIC8qKiBUaGlzIGlzIE9OTFkgdXNlZCBmb3IgdjEgVFJBUHMgICovCiAgICB1bnNpZ25lZCBjaGFyICAgYWdlbnRfYWRkcls0XTsgIAoKICAgIC8qCiAgICAgKiAgU05NUHYzIGZpZWxkcwogICAgICovCiAgICAvKiogY29udGV4dCBzbm1wRW5naW5lSUQgKi8KICAgIHVfY2hhciAgICAgICAgICpjb250ZXh0RW5naW5lSUQ7CiAgICAvKiogTGVuZ3RoIG9mIGNvbnRleHRFbmdpbmVJRCAqLwogICAgc2l6ZV90ICAgICAgICAgIGNvbnRleHRFbmdpbmVJRExlbjsgICAgIAogICAgLyoqIGF1dGhvcml0YXRpdmUgY29udGV4dE5hbWUgKi8KICAgIGNoYXIgICAgICAgICAgICpjb250ZXh0TmFtZTsKICAgIC8qKiBMZW5ndGggb2YgY29udGV4dE5hbWUgKi8KICAgIHNpemVfdCAgICAgICAgICBjb250ZXh0TmFtZUxlbjsKICAgIC8qKiBhdXRob3JpdGF0aXZlIHNubXBFbmdpbmVJRCBmb3Igc2VjdXJpdHkgKi8KICAgIHVfY2hhciAgICAgICAgICpzZWN1cml0eUVuZ2luZUlEOwogICAgLyoqIExlbmd0aCBvZiBzZWN1cml0eUVuZ2luZUlEICovCiAgICBzaXplX3QgICAgICAgICAgc2VjdXJpdHlFbmdpbmVJRExlbjsgICAgCiAgICAvKiogb24gYmVoYWxmIG9mIHRoaXMgcHJpbmNpcGFsICovCiAgICBjaGFyICAgICAgICAgICAqc2VjdXJpdHlOYW1lOwogICAgLyoqIExlbmd0aCBvZiBzZWN1cml0eU5hbWUuICovCiAgICBzaXplX3QgICAgICAgICAgc2VjdXJpdHlOYW1lTGVuOyAgICAgICAgCiAgICAKICAgIC8qCiAgICAgKiBBZ2VudFggZmllbGRzCiAgICAgKiAgICAgIChhbHNvIHVzZXMgU05NUHYxIGNvbW11bml0eSBmaWVsZCkKICAgICAqLwogICAgaW50ICAgICAgICAgICAgIHByaW9yaXR5OwogICAgaW50ICAgICAgICAgICAgIHJhbmdlX3N1YmlkOwogICAgCiAgICB2b2lkICAgICAgICAgICAqc2VjdXJpdHlTdGF0ZVJlZjsKfSBuZXRzbm1wX3BkdTsKCnN0cnVjdCBzbm1wX3Nlc3Npb247CgovKiogQHR5cGVkZWYgc3RydWN0IHNubXBfc2Vzc2lvbiBuZXRzbm1wX3Nlc3Npb24KICogVHlwZWRlZnMgdGhlIHNubXBfc2Vzc2lvbiBzdHJ1Y3QgaW50b25ldHNubXBfc2Vzc2lvbiAqLwp0eXBlZGVmIHN0cnVjdCBzbm1wX3Nlc3Npb24gbmV0c25tcF9zZXNzaW9uOwoKdHlwZWRlZiBpbnQgICAgICgqc25tcF9jYWxsYmFjaykgKGludCwgbmV0c25tcF9zZXNzaW9uICosIGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3BkdSAqLCB2b2lkICopOwp0eXBlZGVmIGludCAgICAgKCpuZXRzbm1wX2NhbGxiYWNrKSAoaW50LCBuZXRzbm1wX3Nlc3Npb24gKiwgaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfcGR1ICosIHZvaWQgKik7Ci8qKiBAc3RydWN0IHNubXBfc2Vzc2lvbgogKiBUaGUgc25tcCBzZXNzaW9uIHN0cnVjdHVyZS4KICovCnN0cnVjdCBzbm1wX3Nlc3Npb24gewogICAgLyoKICAgICAqIFByb3RvY29sLXZlcnNpb24gaW5kZXBlbmRlbnQgZmllbGRzCiAgICAgKi8KICAgIC8qKiBzbm1wIHZlcnNpb24gKi8KICAgIGxvbmcgICAgICAgICAgICB2ZXJzaW9uOwogICAgLyoqIE51bWJlciBvZiByZXRyaWVzIGJlZm9yZSB0aW1lb3V0LiAqLwogICAgaW50ICAgICAgICAgICAgIHJldHJpZXM7CiAgICAvKiogTnVtYmVyIG9mIHVTIHVudGlsIGZpcnN0IHRpbWVvdXQsIHRoZW4gZXhwb25lbnRpYWwgYmFja29mZiAqLwogICAgbG9uZyAgICAgICAgICAgIHRpbWVvdXQ7ICAgICAgICAKICAgIHVfbG9uZyAgICAgICAgICBmbGFnczsKICAgIHN0cnVjdCBzbm1wX3Nlc3Npb24gKnN1YnNlc3Npb247CiAgICBzdHJ1Y3Qgc25tcF9zZXNzaW9uICpuZXh0OwoKICAgIC8qKiBuYW1lIG9yIGFkZHJlc3Mgb2YgZGVmYXVsdCBwZWVyIChtYXkgaW5jbHVkZSB0cmFuc3BvcnQgc3BlY2lmaWVyIGFuZC9vciBwb3J0IG51bWJlcikgKi8KICAgIGNoYXIgICAgICAgICAgICpwZWVybmFtZTsKICAgIC8qKiBVRFAgcG9ydCBudW1iZXIgb2YgcGVlci4gKE5PIExPTkdFUiBVU0VEIC0gVVNFIHBlZXJuYW1lIElOU1RFQUQpICovCiAgICB1X3Nob3J0ICAgICAgICAgcmVtb3RlX3BvcnQ7CiAgICAvKiogTXkgRG9tYWluIG5hbWUgb3IgZG90dGVkIElQIGFkZHJlc3MsIDAgZm9yIGRlZmF1bHQgKi8KICAgIGNoYXIgICAgICAgICAgICpsb2NhbG5hbWU7CiAgICAvKiogTXkgVURQIHBvcnQgbnVtYmVyLCAwIGZvciBkZWZhdWx0LCBwaWNrZWQgcmFuZG9tbHkgKi8KICAgIHVfc2hvcnQgICAgICAgICBsb2NhbF9wb3J0OyAgICAgCiAgICAvKioKICAgICAqIEF1dGhlbnRpY2F0aW9uIGZ1bmN0aW9uIG9yIE5VTEwgaWYgbnVsbCBhdXRoZW50aWNhdGlvbiBpcyB1c2VkIAogICAgICovCiAgICB1X2NoYXIgICAgICAgICAqKCphdXRoZW50aWNhdG9yKSAodV9jaGFyICosIHNpemVfdCAqLCB1X2NoYXIgKiwgc2l6ZV90KTsKICAgIC8qKiBGdW5jdGlvbiB0byBpbnRlcnByZXQgaW5jb21pbmcgZGF0YSAqLwogICAgbmV0c25tcF9jYWxsYmFjayBjYWxsYmFjazsgICAgICAKICAgIC8qKgogICAgICogUG9pbnRlciB0byBkYXRhIHRoYXQgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIG1heSBjb25zaWRlciBpbXBvcnRhbnQgCiAgICAgKi8KICAgIHZvaWQgICAgICAgICAgICpjYWxsYmFja19tYWdpYzsKICAgIC8qKiBjb3B5IG9mIHN5c3RlbSBlcnJubyAqLwogICAgaW50ICAgICAgICAgICAgIHNfZXJybm87CiAgICAvKiogY29weSBvZiBsaWJyYXJ5IGVycm5vICovCiAgICBpbnQgICAgICAgICAgICAgc19zbm1wX2Vycm5vOyAgIAogICAgLyoqIFNlc3Npb24gaWQgLSBBZ2VudFggb25seSAqLwogICAgbG9uZyAgICAgICAgICAgIHNlc3NpZDsgCgogICAgLyoKICAgICAqIFNOTVB2MSAmIFNOTVB2MmMgZmllbGRzCiAgICAgKi8KICAgIC8qKiBjb21tdW5pdHkgZm9yIG91dGdvaW5nIHJlcXVlc3RzLiAqLwogICAgdV9jaGFyICAgICAgICAgKmNvbW11bml0eTsKICAgIC8qKiBMZW5ndGggb2YgY29tbXVuaXR5IG5hbWUuICovCiAgICBzaXplX3QgICAgICAgICAgY29tbXVuaXR5X2xlbjsgIAogICAgLyoqICBMYXJnZXN0IG1lc3NhZ2UgdG8gdHJ5IHRvIHJlY2VpdmUuICAqLwogICAgc2l6ZV90ICAgICAgICAgIHJjdk1zZ01heFNpemU7CiAgICAvKiogIExhcmdlc3QgbWVzc2FnZSB0byB0cnkgdG8gc2VuZC4gICovCiAgICBzaXplX3QgICAgICAgICAgc25kTXNnTWF4U2l6ZTsgIAoKICAgIC8qCiAgICAgKiBTTk1QdjMgZmllbGRzCiAgICAgKi8KICAgIC8qKiBhcmUgd2UgdGhlIGF1dGhvcml0YXRpdmUgZW5naW5lPyAqLwogICAgdV9jaGFyICAgICAgICAgIGlzQXV0aG9yaXRhdGl2ZTsKICAgIC8qKiBhdXRob3JpdGF0aXZlIHNubXBFbmdpbmVJRCAqLwogICAgdV9jaGFyICAgICAgICAgKmNvbnRleHRFbmdpbmVJRDsKICAgIC8qKiBMZW5ndGggb2YgY29udGV4dEVuZ2luZUlEICovCiAgICBzaXplX3QgICAgICAgICAgY29udGV4dEVuZ2luZUlETGVuOyAgICAgCiAgICAvKiogaW5pdGlhbCBlbmdpbmVCb290cyBmb3IgcmVtb3RlIGVuZ2luZSAqLwogICAgdV9pbnQgICAgICAgICAgIGVuZ2luZUJvb3RzOwogICAgLyoqIGluaXRpYWwgZW5naW5lVGltZSBmb3IgcmVtb3RlIGVuZ2luZSAqLwogICAgdV9pbnQgICAgICAgICAgIGVuZ2luZVRpbWU7CiAgICAvKiogYXV0aG9yaXRhdGl2ZSBjb250ZXh0TmFtZSAqLwogICAgY2hhciAgICAgICAgICAgKmNvbnRleHROYW1lOwogICAgLyoqIExlbmd0aCBvZiBjb250ZXh0TmFtZSAqLwogICAgc2l6ZV90ICAgICAgICAgIGNvbnRleHROYW1lTGVuOwogICAgLyoqIGF1dGhvcml0YXRpdmUgc25tcEVuZ2luZUlEICovCiAgICB1X2NoYXIgICAgICAgICAqc2VjdXJpdHlFbmdpbmVJRDsKICAgIC8qKiBMZW5ndGggb2YgY29udGV4dEVuZ2luZUlEICovCiAgICBzaXplX3QgICAgICAgICAgc2VjdXJpdHlFbmdpbmVJRExlbjsgICAgCiAgICAvKiogb24gYmVoYWxmIG9mIHRoaXMgcHJpbmNpcGFsICovCiAgICBjaGFyICAgICAgICAgICAqc2VjdXJpdHlOYW1lOwogICAgLyoqIExlbmd0aCBvZiBzZWN1cml0eU5hbWUuICovCiAgICBzaXplX3QgICAgICAgICAgc2VjdXJpdHlOYW1lTGVuOwoKICAgIC8qKiBhdXRoIHByb3RvY29sIG9pZCAqLwogICAgb2lkICAgICAgICAgICAgKnNlY3VyaXR5QXV0aFByb3RvOwogICAgLyoqIExlbmd0aCBvZiBhdXRoIHByb3RvY29sIG9pZCAqLwogICAgc2l6ZV90ICAgICAgICAgIHNlY3VyaXR5QXV0aFByb3RvTGVuOwogICAgLyoqIEt1IGZvciBhdXRoIHByb3RvY29sIFhYWCAqLwogICAgdV9jaGFyICAgICAgICAgIHNlY3VyaXR5QXV0aEtleVtVU01fQVVUSF9LVV9MRU5dOyAgICAgICAKICAgIC8qKiBMZW5ndGggb2YgS3UgZm9yIGF1dGggcHJvdG9jb2wgKi8KICAgIHNpemVfdCAgICAgICAgICBzZWN1cml0eUF1dGhLZXlMZW47CiAgICAvKiogS3VsIGZvciBhdXRoIHByb3RvY29sICovCiAgICB1X2NoYXIgICAgICAgICAgKnNlY3VyaXR5QXV0aExvY2FsS2V5OyAgICAgICAKICAgIC8qKiBMZW5ndGggb2YgS3VsIGZvciBhdXRoIHByb3RvY29sIFhYWCAqLwogICAgc2l6ZV90ICAgICAgICAgIHNlY3VyaXR5QXV0aExvY2FsS2V5TGVuOyAgICAgICAKCiAgICAvKiogcHJpdiBwcm90b2NvbCBvaWQgKi8KICAgIG9pZCAgICAgICAgICAgICpzZWN1cml0eVByaXZQcm90bzsKICAgIC8qKiBMZW5ndGggb2YgcHJpdiBwcm90b2NvbCBvaWQgKi8KICAgIHNpemVfdCAgICAgICAgICBzZWN1cml0eVByaXZQcm90b0xlbjsKICAgIC8qKiBLdSBmb3IgcHJpdmFjeSBwcm90b2NvbCBYWFggKi8KICAgIHVfY2hhciAgICAgICAgICBzZWN1cml0eVByaXZLZXlbVVNNX1BSSVZfS1VfTEVOXTsgICAgICAgCiAgICAvKiogTGVuZ3RoIG9mIEt1IGZvciBwcml2IHByb3RvY29sICovCiAgICBzaXplX3QgICAgICAgICAgc2VjdXJpdHlQcml2S2V5TGVuOwogICAgLyoqIEt1bCBmb3IgcHJpdiBwcm90b2NvbCAqLwogICAgdV9jaGFyICAgICAgICAgICpzZWN1cml0eVByaXZMb2NhbEtleTsgICAgICAgCiAgICAvKiogTGVuZ3RoIG9mIEt1bCBmb3IgcHJpdiBwcm90b2NvbCBYWFggKi8KICAgIHNpemVfdCAgICAgICAgICBzZWN1cml0eVByaXZMb2NhbEtleUxlbjsgICAgICAgCgogICAgLyoqIHNubXAgc2VjdXJpdHkgbW9kZWwsIHYxLCB2MmMsIHVzbSAqLwogICAgaW50ICAgICAgICAgICAgIHNlY3VyaXR5TW9kZWw7CiAgICAvKiogbm9BdXRoTm9Qcml2LCBhdXRoTm9Qcml2LCBhdXRoUHJpdiAqLwogICAgaW50ICAgICAgICAgICAgIHNlY3VyaXR5TGV2ZWw7ICAKICAgIC8qKiB0YXJnZXQgcGFyYW0gbmFtZSAqLwogICAgY2hhciAgICAgICAgICAgKnBhcmFtTmFtZTsKCiAgICAvKioKICAgICAqIHNlY3VyaXR5IG1vZHVsZSBzcGVjaWZpYyAKICAgICAqLwogICAgdm9pZCAgICAgICAgICAgKnNlY3VyaXR5SW5mbzsKCiAgICAvKioKICAgICAqIHVzZSBhcyB5b3Ugd2FudCBkYXRhIAogICAgICoKICAgICAqICAgICB1c2VkIGJ5ICdTTk1QX0ZMQUdTX1JFU1BfQ0FMTEJBQ0snIGhhbmRsaW5nIGluIHRoZSBhZ2VudAogICAgICogWFhYOiBvciBzaG91bGQgd2UgYWRkIGEgbmV3IGZpZWxkIGludG8gdGhpcyBzdHJ1Y3R1cmU/CiAgICAgKi8KICAgIHZvaWQgICAgICAgICAgICpteXZvaWQ7Cn07CgovKgogKiBBIGxpc3Qgb2YgYWxsIHRoZSBvdXRzdGFuZGluZyByZXF1ZXN0cyBmb3IgYSBwYXJ0aWN1bGFyIHNlc3Npb24uCiAqLwojaWZkZWYgU05NUF9ORUVEX1JFUVVFU1RfTElTVAp0eXBlZGVmIHN0cnVjdCByZXF1ZXN0X2xpc3QgewogICAgc3RydWN0IHJlcXVlc3RfbGlzdCAqbmV4dF9yZXF1ZXN0OwogICAgbG9uZyAgICAgICAgICAgIHJlcXVlc3RfaWQ7ICAgICAvKiByZXF1ZXN0IGlkICovCiAgICBsb25nICAgICAgICAgICAgbWVzc2FnZV9pZDsgICAgIC8qIG1lc3NhZ2UgaWQgKi8KICAgIG5ldHNubXBfY2FsbGJhY2sgY2FsbGJhY2s7ICAgICAgLyogdXNlciBjYWxsYmFjayBwZXIgcmVxdWVzdCAoTlVMTCBpZiB1bnVzZWQpICovCiAgICB2b2lkICAgICAgICAgICAqY2JfZGF0YTsgICAgICAgIC8qIHVzZXIgY2FsbGJhY2sgZGF0YSBwZXIgcmVxdWVzdCAoTlVMTCBpZiB1bnVzZWQpICovCiAgICBpbnQgICAgICAgICAgICAgcmV0cmllczsgICAgICAgIC8qIE51bWJlciBvZiByZXRyaWVzICovCiAgICB1X2xvbmcgICAgICAgICAgdGltZW91dDsgICAgICAgIC8qIGxlbmd0aCB0byB3YWl0IGZvciB0aW1lb3V0ICovCiAgICBzdHJ1Y3QgdGltZXZhbCAgdGltZTsgICAvKiBUaW1lIHRoaXMgcmVxdWVzdCB3YXMgbWFkZSAqLwogICAgc3RydWN0IHRpbWV2YWwgIGV4cGlyZTsgLyogdGltZSB0aGlzIHJlcXVlc3QgaXMgZHVlIHRvIGV4cGlyZSAqLwogICAgc3RydWN0IHNubXBfc2Vzc2lvbiAqc2Vzc2lvbjsKICAgIG5ldHNubXBfcGR1ICAgICpwZHU7ICAgIC8qIFRoZSBwZHUgZm9yIHRoaXMgcmVxdWVzdAoJCQkgICAgICogKHNhdmVkIHNvIGl0IGNhbiBiZSByZXRyYW5zbWl0dGVkICovCn0gbmV0c25tcF9yZXF1ZXN0X2xpc3Q7CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU05NUF9ORUVEX1JFUVVFU1RfTElTVCAqLwoKICAgIC8qCiAgICAgKiBTZXQgZmllbGRzIGluIHNlc3Npb24gYW5kIHBkdSB0byB0aGUgZm9sbG93aW5nIHRvIGdldCBhIGRlZmF1bHQgb3IgdW5jb25maWd1cmVkIHZhbHVlLgogICAgICovCiNkZWZpbmUgU05NUF9ERUZBVUxUX0NPTU1VTklUWV9MRU4gIDAgICAvKiB0byBnZXQgYSBkZWZhdWx0IGNvbW11bml0eSBuYW1lICovCiNkZWZpbmUgU05NUF9ERUZBVUxUX1JFVFJJRVMJICAgIC0xCiNkZWZpbmUgU05NUF9ERUZBVUxUX1RJTUVPVVQJICAgIC0xCiNkZWZpbmUgU05NUF9ERUZBVUxUX1JFTVBPUlQJICAgIDAKI2RlZmluZSBTTk1QX0RFRkFVTFRfUkVRSUQJICAgIC0xCiNkZWZpbmUgU05NUF9ERUZBVUxUX01TR0lECSAgICAtMQojZGVmaW5lIFNOTVBfREVGQVVMVF9FUlJTVEFUCSAgICAtMQojZGVmaW5lIFNOTVBfREVGQVVMVF9FUlJJTkRFWAkgICAgLTEKI2RlZmluZSBTTk1QX0RFRkFVTFRfQUREUkVTUwkgICAgMAojZGVmaW5lIFNOTVBfREVGQVVMVF9QRUVSTkFNRQkgICAgTlVMTAojZGVmaW5lIFNOTVBfREVGQVVMVF9FTlRFUlBSSVNFX0xFTkdUSAkwCiNkZWZpbmUgU05NUF9ERUZBVUxUX1RJTUUJICAgIDAKI2RlZmluZSBTTk1QX0RFRkFVTFRfVkVSU0lPTgkgICAgLTEKI2RlZmluZSBTTk1QX0RFRkFVTFRfU0VDTU9ERUwJICAgIC0xCiNkZWZpbmUgU05NUF9ERUZBVUxUX0NPTlRFWFQgICAgICAgICIiCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01ENQojZGVmaW5lIFNOTVBfREVGQVVMVF9BVVRIX1BST1RPICAgICB1c21ITUFDTUQ1QXV0aFByb3RvY29sCiNlbHNlCiNkZWZpbmUgU05NUF9ERUZBVUxUX0FVVEhfUFJPVE8gICAgIHVzbUhNQUNTSEExQXV0aFByb3RvY29sCiNlbmRpZgojZGVmaW5lIFNOTVBfREVGQVVMVF9BVVRIX1BST1RPTEVOICBVU01fTEVOR1RIX09JRF9UUkFOU0ZPUk0KI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfREVTCiNkZWZpbmUgU05NUF9ERUZBVUxUX1BSSVZfUFJPVE8gICAgIHVzbURFU1ByaXZQcm90b2NvbAojZWxzZQojZGVmaW5lIFNOTVBfREVGQVVMVF9QUklWX1BST1RPICAgICB1c21BRVNQcml2UHJvdG9jb2wKI2VuZGlmCiNkZWZpbmUgU05NUF9ERUZBVUxUX1BSSVZfUFJPVE9MRU4gIFVTTV9MRU5HVEhfT0lEX1RSQU5TRk9STQoKICAgIE5FVFNOTVBfSU1QT1JUIGNvbnN0IGNoYXIgKnNubXBfYXBpX2VycnN0cmluZyhpbnQpOwogICAgTkVUU05NUF9JTVBPUlQgdm9pZCAgICAgc25tcF9wZXJyb3IoY29uc3QgY2hhciAqKTsKICAgIE5FVFNOTVBfSU1QT1JUIHZvaWQgICAgIHNubXBfc2V0X2RldGFpbChjb25zdCBjaGFyICopOwoKI2RlZmluZSBTTk1QX01BWF9NU0dfU0laRSAgICAgICAgICAxNDcyIC8qIGV0aGVybmV0IE1UVSBtaW51cyBJUC9VRFAgaGVhZGVyICovCiNkZWZpbmUgU05NUF9NQVhfTVNHX1YzX0hEUlMgICAgICAgKDQrMys0KzcrNyszKzcrMTYpICAgLyogZnVkZ2UgZmFjdG9yPTE2ICovCiNkZWZpbmUgU05NUF9NQVhfRU5HX1NJWkUgICAgICAgICAgMzIKI2RlZmluZSBTTk1QX01BWF9TRUNfTkFNRV9TSVpFICAgICAyNTYKI2RlZmluZSBTTk1QX01BWF9DT05URVhUX1NJWkUgICAgICAyNTYKI2RlZmluZSBTTk1QX1NFQ19QQVJBTV9CVUZfU0laRSAgICAyNTYKCiAgICAvKgogICAgICogc2V0IHRvIG9uZSB0byBpZ25vcmUgdW5hdXRoZW50aWNhdGVkIFJlcG9ydHMgCiAgICAgKi8KI2RlZmluZSBTTk1QVjNfSUdOT1JFX1VOQVVUSF9SRVBPUlRTIDAKCiAgICAvKgogICAgICogYXV0aG9yaXRhdGl2ZSBlbmdpbmUgZGVmaW5pdGlvbnMgCiAgICAgKi8KI2RlZmluZSBTTk1QX1NFU1NfTk9OQVVUSE9SSVRBVElWRSAwICAgIC8qIHNob3VsZCBiZSAwIHRvIGRlZmF1bHQgdG8gdGhpcyAqLwojZGVmaW5lIFNOTVBfU0VTU19BVVRIT1JJVEFUSVZFICAgIDEgICAgLyogZG9uJ3QgbGVhcm4gZW5naW5lSURzICovCiNkZWZpbmUgU05NUF9TRVNTX1VOS05PV05BVVRIICAgICAgMiAgICAvKiBzb21ldGltZXMgKGxpa2UgTlJzKSAqLwoKICAgIC8qCiAgICAgKiB0byBkZXRlcm1pbmUgdHlwZSBvZiBSZXBvcnQgZnJvbSB2YXJiaW5kX2xpc3QgCiAgICAgKi8KI2RlZmluZSBSRVBPUlRfU1RBVFNfTEVOICA5CS8qIExlbmd0aCBvZiBwcmVmaXggZm9yIE1QRC9VU00gcmVwb3J0IHN0YXRpc3RpYyBvYmplY3RzICovCiNkZWZpbmUgUkVQT1JUX1NUQVRTX0xFTjIgOAkvKiBMZW5ndGggb2YgcHJlZml4IGZvciBUYXJnZXQgcmVwb3J0IHN0YXRpc3RpYyBvYmplY3RzICovCi8qIEZyb20gU05NUC1NUEQtTUlCICovCiNkZWZpbmUgUkVQT1JUX3NubXBVbmtub3duU2VjdXJpdHlNb2RlbHNfTlVNIDEKI2RlZmluZSBSRVBPUlRfc25tcEludmFsaWRNc2dzX05VTSAgICAgICAgICAgMgojZGVmaW5lIFJFUE9SVF9zbm1wVW5rbm93blBEVUhhbmRsZXJzX05VTSAgICAzCi8qIEZyb20gU05NUC1VU0VSLUJBU0VELVNNLU1JQiAqLwojZGVmaW5lIFJFUE9SVF91c21TdGF0c1Vuc3VwcG9ydGVkU2VjTGV2ZWxzX05VTSAxCiNkZWZpbmUgUkVQT1JUX3VzbVN0YXRzTm90SW5UaW1lV2luZG93c19OVU0gMgojZGVmaW5lIFJFUE9SVF91c21TdGF0c1Vua25vd25Vc2VyTmFtZXNfTlVNIDMKI2RlZmluZSBSRVBPUlRfdXNtU3RhdHNVbmtub3duRW5naW5lSURzX05VTSA0CiNkZWZpbmUgUkVQT1JUX3VzbVN0YXRzV3JvbmdEaWdlc3RzX05VTSAgICAgNQojZGVmaW5lIFJFUE9SVF91c21TdGF0c0RlY3J5cHRpb25FcnJvcnNfTlVNIDYKLyogRnJvbSBTTk1QLVRBUkdFVC1NSUIgKi8KI2RlZmluZSBSRVBPUlRfc25tcFVuYXZhaWxhYmxlQ29udGV4dHNfTlVNICA0CiNkZWZpbmUgUkVQT1JUX3NubXBVbmtub3duQ29udGV4dHNfTlVNICAgICAgNQoKI2RlZmluZSBTTk1QX0RFVEFJTF9TSVpFICAgICAgICA1MTIKCiNkZWZpbmUgU05NUF9GTEFHU19SRVNQX0NBTExCQUNLICAgMHg0MDAgICAgICAvKiBBZGRpdGlvbmFsIGNhbGxiYWNrIG9uIHJlc3BvbnNlICovCiNkZWZpbmUgU05NUF9GTEFHU19VU0VSX0NSRUFURUQgICAgMHgyMDAgICAgICAvKiBVU00gdXNlciBoYXMgYmVlbiBjcmVhdGVkICovCiNkZWZpbmUgU05NUF9GTEFHU19ET05UX1BST0JFICAgICAgMHgxMDAgICAgICAvKiBkb24ndCBwcm9iZSBmb3IgYW4gZW5naW5lSUQgKi8KI2RlZmluZSBTTk1QX0ZMQUdTX1NUUkVBTV9TT0NLRVQgICAweDgwCiNkZWZpbmUgU05NUF9GTEFHU19MSVNURU5JTkcgICAgICAgMHg0MCAvKiBTZXJ2ZXIgc3RyZWFtIHNvY2tldHMgb25seSAqLwojZGVmaW5lIFNOTVBfRkxBR1NfU1VCU0VTU0lPTiAgICAgIDB4MjAKI2RlZmluZSBTTk1QX0ZMQUdTX1NUUklLRTIgICAgICAgICAweDAyCiNkZWZpbmUgU05NUF9GTEFHU19TVFJJS0UxICAgICAgICAgMHgwMQoKI2RlZmluZSBDTEVBUl9TTk1QX1NUUklLRV9GTEFHUyh4KSBcCgl4ICY9IH4oU05NUF9GTEFHU19TVFJJS0UyfFNOTVBfRkxBR1NfU1RSSUtFMSkKCiAgICAvKgogICAgICogcmV0dXJucyAnMScgaWYgdGhlIHNlc3Npb24gaXMgdG8gYmUgcmVnYXJkZWQgYXMgZGVhZCwKICAgICAqIG90aGVyd2lzZSBzZXQgdGhlIHN0cmlrZSBmbGFncyBhcHByb3ByaWF0ZWx5LCBhbmQgcmV0dXJuIDAKICAgICAqLwojZGVmaW5lIFNFVF9TTk1QX1NUUklLRV9GTEFHUyh4KSBcCgkoKCAgIHggJiBTTk1QX0ZMQUdTX1NUUklLRTIgKSA/IDEgOgkJCQlcCgkgKCgoIHggJiBTTk1QX0ZMQUdTX1NUUklLRTEgKSA/ICggeCB8PSBTTk1QX0ZMQUdTX1NUUklLRTIgKSA6CVwKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCB4IHw9IFNOTVBfRkxBR1NfU1RSSUtFMSApKSwJXAoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKSkKCiAgICAvKgogICAgICogRXJyb3IgcmV0dXJuIHZhbHVlcy4KICAgICAqCiAgICAgKiBTTk1QRVJSX1NVQ0NFU1MgaXMgdGhlIG5vbi1QRFUgInN1Y2Nlc3MiIGNvZGUuCiAgICAgKgogICAgICogWFhYICBUaGVzZSBzaG91bGQgYmUgbWVyZ2VkIHdpdGggU05NUF9FUlJfKiBkZWZpbmVzIGFuZCBjb25maW5lZAogICAgICogICAgICB0byB2YWx1ZXMgPCAwLiAgPz8/CiAgICAgKi8KI2RlZmluZSBTTk1QRVJSX1NVQ0NFU1MJCQkoMCkgICAgIC8qIFhYWCAgTm9uLVBEVSAic3VjY2VzcyIgY29kZS4gKi8KI2RlZmluZSBTTk1QRVJSX0dFTkVSUgkJCSgtMSkKI2RlZmluZSBTTk1QRVJSX0JBRF9MT0NQT1JUCQkoLTIpCiNkZWZpbmUgU05NUEVSUl9CQURfQUREUkVTUwkJKC0zKQojZGVmaW5lIFNOTVBFUlJfQkFEX1NFU1NJT04JCSgtNCkKI2RlZmluZSBTTk1QRVJSX1RPT19MT05HCQkoLTUpCiNkZWZpbmUgU05NUEVSUl9OT19TT0NLRVQJCSgtNikKI2RlZmluZSBTTk1QRVJSX1YyX0lOX1YxCQkoLTcpCiNkZWZpbmUgU05NUEVSUl9WMV9JTl9WMgkJKC04KQojZGVmaW5lIFNOTVBFUlJfQkFEX1JFUEVBVEVSUwkJKC05KQojZGVmaW5lIFNOTVBFUlJfQkFEX1JFUEVUSVRJT05TCQkoLTEwKQojZGVmaW5lIFNOTVBFUlJfQkFEX0FTTjFfQlVJTEQJCSgtMTEpCiNkZWZpbmUgU05NUEVSUl9CQURfU0VORFRPCQkoLTEyKQojZGVmaW5lIFNOTVBFUlJfQkFEX1BBUlNFCQkoLTEzKQojZGVmaW5lIFNOTVBFUlJfQkFEX1ZFUlNJT04JCSgtMTQpCiNkZWZpbmUgU05NUEVSUl9CQURfU1JDX1BBUlRZCQkoLTE1KQojZGVmaW5lIFNOTVBFUlJfQkFEX0RTVF9QQVJUWQkJKC0xNikKI2RlZmluZSBTTk1QRVJSX0JBRF9DT05URVhUCQkoLTE3KQojZGVmaW5lIFNOTVBFUlJfQkFEX0NPTU1VTklUWQkJKC0xOCkKI2RlZmluZSBTTk1QRVJSX05PQVVUSF9ERVNQUklWCQkoLTE5KQojZGVmaW5lIFNOTVBFUlJfQkFEX0FDTAkJCSgtMjApCiNkZWZpbmUgU05NUEVSUl9CQURfUEFSVFkJCSgtMjEpCiNkZWZpbmUgU05NUEVSUl9BQk9SVAkJCSgtMjIpCiNkZWZpbmUgU05NUEVSUl9VTktOT1dOX1BEVQkJKC0yMykKI2RlZmluZSBTTk1QRVJSX1RJTUVPVVQgCQkoLTI0KQojZGVmaW5lIFNOTVBFUlJfQkFEX1JFQ1ZGUk9NIAkJKC0yNSkKI2RlZmluZSBTTk1QRVJSX0JBRF9FTkdfSUQgCQkoLTI2KQojZGVmaW5lIFNOTVBFUlJfQkFEX1NFQ19OQU1FIAkJKC0yNykKI2RlZmluZSBTTk1QRVJSX0JBRF9TRUNfTEVWRUwgCQkoLTI4KQojZGVmaW5lIFNOTVBFUlJfQVNOX1BBUlNFX0VSUiAgICAgICAgICAgKC0yOSkKI2RlZmluZSBTTk1QRVJSX1VOS05PV05fU0VDX01PREVMIAkoLTMwKQojZGVmaW5lIFNOTVBFUlJfSU5WQUxJRF9NU0cgICAgICAgICAgICAgKC0zMSkKI2RlZmluZSBTTk1QRVJSX1VOS05PV05fRU5HX0lEICAgICAgICAgICgtMzIpCiNkZWZpbmUgU05NUEVSUl9VTktOT1dOX1VTRVJfTkFNRSAJKC0zMykKI2RlZmluZSBTTk1QRVJSX1VOU1VQUE9SVEVEX1NFQ19MRVZFTCAJKC0zNCkKI2RlZmluZSBTTk1QRVJSX0FVVEhFTlRJQ0FUSU9OX0ZBSUxVUkUgCSgtMzUpCiNkZWZpbmUgU05NUEVSUl9OT1RfSU5fVElNRV9XSU5ET1cgCSgtMzYpCiNkZWZpbmUgU05NUEVSUl9ERUNSWVBUSU9OX0VSUiAgICAgICAgICAoLTM3KQojZGVmaW5lIFNOTVBFUlJfU0NfR0VORVJBTF9GQUlMVVJFCSgtMzgpCiNkZWZpbmUgU05NUEVSUl9TQ19OT1RfQ09ORklHVVJFRAkoLTM5KQojZGVmaW5lIFNOTVBFUlJfS1RfTk9UX0FWQUlMQUJMRQkoLTQwKQojZGVmaW5lIFNOTVBFUlJfVU5LTk9XTl9SRVBPUlQgICAgICAgICAgKC00MSkKI2RlZmluZSBTTk1QRVJSX1VTTV9HRU5FUklDRVJST1IJCSgtNDIpCiNkZWZpbmUgU05NUEVSUl9VU01fVU5LTk9XTlNFQ1VSSVRZTkFNRQkJKC00MykKI2RlZmluZSBTTk1QRVJSX1VTTV9VTlNVUFBPUlRFRFNFQ1VSSVRZTEVWRUwJKC00NCkKI2RlZmluZSBTTk1QRVJSX1VTTV9FTkNSWVBUSU9ORVJST1IJCSgtNDUpCiNkZWZpbmUgU05NUEVSUl9VU01fQVVUSEVOVElDQVRJT05GQUlMVVJFCSgtNDYpCiNkZWZpbmUgU05NUEVSUl9VU01fUEFSU0VFUlJPUgkJCSgtNDcpCiNkZWZpbmUgU05NUEVSUl9VU01fVU5LTk9XTkVOR0lORUlECQkoLTQ4KQojZGVmaW5lIFNOTVBFUlJfVVNNX05PVElOVElNRVdJTkRPVwkJKC00OSkKI2RlZmluZSBTTk1QRVJSX1VTTV9ERUNSWVBUSU9ORVJST1IJCSgtNTApCiNkZWZpbmUgU05NUEVSUl9OT01JQgkJCSgtNTEpCiNkZWZpbmUgU05NUEVSUl9SQU5HRQkJCSgtNTIpCiNkZWZpbmUgU05NUEVSUl9NQVhfU1VCSUQJCSgtNTMpCiNkZWZpbmUgU05NUEVSUl9CQURfU1VCSUQJCSgtNTQpCiNkZWZpbmUgU05NUEVSUl9MT05HX09JRAkJKC01NSkKI2RlZmluZSBTTk1QRVJSX0JBRF9OQU1FCQkoLTU2KQojZGVmaW5lIFNOTVBFUlJfVkFMVUUJCQkoLTU3KQojZGVmaW5lIFNOTVBFUlJfVU5LTk9XTl9PQkpJRAkJKC01OCkKI2RlZmluZSBTTk1QRVJSX05VTExfUERVCQkoLTU5KQojZGVmaW5lIFNOTVBFUlJfTk9fVkFSUwkJCSgtNjApCiNkZWZpbmUgU05NUEVSUl9WQVJfVFlQRQkJKC02MSkKI2RlZmluZSBTTk1QRVJSX01BTExPQwkJCSgtNjIpCiNkZWZpbmUgU05NUEVSUl9LUkI1CQkJKC02MykKI2RlZmluZSBTTk1QRVJSX1BST1RPQ09MCQkoLTY0KQojZGVmaW5lIFNOTVBFUlJfT0lEX05PTklOQ1JFQVNJTkcgICAgICAgKC02NSkKCiNkZWZpbmUgU05NUEVSUl9NQVgJCQkoLTY1KQoKI2RlZmluZSBub25fcmVwZWF0ZXJzCWVycnN0YXQKI2RlZmluZSBtYXhfcmVwZXRpdGlvbnMgZXJyaW5kZXgKCnR5cGVkZWYgdW5pb24gewogICBsb25nICAgICAgICAgICAqaW50ZWdlcjsKICAgdV9jaGFyICAgICAgICAgKnN0cmluZzsKICAgb2lkICAgICAgICAgICAgKm9iamlkOwogICB1X2NoYXIgICAgICAgICAqYml0c3RyaW5nOwogICBzdHJ1Y3QgY291bnRlcjY0ICpjb3VudGVyNjQ7CiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKICAgZmxvYXQgICAgICAgICAgKmZsb2F0VmFsOwogICBkb3VibGUgICAgICAgICAqZG91YmxlVmFsOwogICAvKgogICAgKiB0X3VuaW9uICp1bmlvblZhbDsgCiAgICAqLwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUyAqLwp9IG5ldHNubXBfdmFyZGF0YTsKCgovKiogQHN0cnVjdCB2YXJpYWJsZV9saXN0CiAqIFRoZSBuZXRzbm1wIHZhcmlhYmxlIGxpc3QgYmluZGluZyBzdHJ1Y3R1cmUsIGl0J3MgdHlwZWRlZidkIHRvCiAqIG5ldHNubXBfdmFyaWFibGVfbGlzdC4KICovCnN0cnVjdCB2YXJpYWJsZV9saXN0IHsKICAgLyoqIE5VTEwgZm9yIGxhc3QgdmFyaWFibGUgKi8KICAgc3RydWN0IHZhcmlhYmxlX2xpc3QgKm5leHRfdmFyaWFibGU7ICAgIAogICAvKiogT2JqZWN0IGlkZW50aWZpZXIgb2YgdmFyaWFibGUgKi8KICAgb2lkICAgICAgICAgICAgKm5hbWU7ICAgCiAgIC8qKiBudW1iZXIgb2Ygc3ViaWQncyBpbiBuYW1lICovCiAgIHNpemVfdCAgICAgICAgICBuYW1lX2xlbmd0aDsgICAgCiAgIC8qKiBBU04gdHlwZSBvZiB2YXJpYWJsZSAqLwogICB1X2NoYXIgICAgICAgICAgdHlwZTsgICAKICAgLyoqIHZhbHVlIG9mIHZhcmlhYmxlICovCiAgICBuZXRzbm1wX3ZhcmRhdGEgdmFsOwogICAvKiogdGhlIGxlbmd0aCBvZiB0aGUgdmFsdWUgdG8gYmUgY29waWVkIGludG8gYnVmICovCiAgIHNpemVfdCAgICAgICAgICB2YWxfbGVuOwogICAvKiogYnVmZmVyIHRvIGhvbGQgdGhlIE9JRCAqLwogICBvaWQgICAgICAgICAgICAgbmFtZV9sb2NbTUFYX09JRF9MRU5dOyAgCiAgIC8qKiA5MCBwZXJjZW50aWxlIDwgNDAuICovCiAgIHVfY2hhciAgICAgICAgICBidWZbNDBdOwogICAvKiogKE9wYXF1ZSkgaG9vayBmb3IgYWRkaXRpb25hbCBkYXRhICovCiAgIHZvaWQgICAgICAgICAgICpkYXRhOwogICAvKiogY2FsbGJhY2sgdG8gZnJlZSBhYm92ZSAqLwogICB2b2lkICAgICAgICAgICAgKCpkYXRhRnJlZUhvb2spKHZvaWQgKik7ICAgIAogICBpbnQgICAgICAgICAgICAgaW5kZXg7Cn07CgoKCiAgICAvKgogICAgICogbmV0c25tcF9zZXNzaW9uICpzbm1wX29wZW4oc2Vzc2lvbikKICAgICAqICAgICAgbmV0c25tcF9zZXNzaW9uICpzZXNzaW9uOwogICAgICoKICAgICAqIFNldHMgdXAgdGhlIHNlc3Npb24gd2l0aCB0aGUgc25tcF9zZXNzaW9uIGluZm9ybWF0aW9uIHByb3ZpZGVkCiAgICAgKiBieSB0aGUgdXNlci4gIFRoZW4gb3BlbnMgYW5kIGJpbmRzIHRoZSBuZWNlc3NhcnkgVURQIHBvcnQuCiAgICAgKiBBIGhhbmRsZSB0byB0aGUgY3JlYXRlZCBzZXNzaW9uIGlzIHJldHVybmVkICh0aGlzIGlzIGRpZmZlcmVudCB0aGFuCiAgICAgKiB0aGUgcG9pbnRlciBwYXNzZWQgdG8gc25tcF9vcGVuKCkpLiAgT24gYW55IGVycm9yLCBOVUxMIGlzIHJldHVybmVkCiAgICAgKiBhbmQgc25tcF9lcnJubyBpcyBzZXQgdG8gdGhlIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUuCiAgICAgKi8KICAgIG5ldHNubXBfc2Vzc2lvbiAqc25tcF9vcGVuKG5ldHNubXBfc2Vzc2lvbiAqKTsKCiAgICAvKgogICAgICogaW50IHNubXBfY2xvc2Uoc2Vzc2lvbikKICAgICAqICAgICBuZXRzbm1wX3Nlc3Npb24gKnNlc3Npb247CiAgICAgKgogICAgICogQ2xvc2UgdGhlIGlucHV0IHNlc3Npb24uICBGcmVlcyBhbGwgZGF0YSBhbGxvY2F0ZWQgZm9yIHRoZSBzZXNzaW9uLAogICAgICogZGVxdWV1ZXMgYW55IHBlbmRpbmcgcmVxdWVzdHMsIGFuZCBjbG9zZXMgYW55IHNvY2tldHMgYWxsb2NhdGVkIGZvcgogICAgICogdGhlIHNlc3Npb24uICBSZXR1cm5zIDAgb24gZXJyb3IsIDEgb3RoZXJ3aXNlLgogICAgICoKICAgICAqIHNubXBfY2xvc2Vfc2Vzc2lvbnMoKSBkb2VzIHRoZSBzYW1lIHRoaW5nIGZvciBhbGwgb3BlbiBzZXNzaW9ucwogICAgICovCiAgICBpbnQgICAgICAgICAgICAgc25tcF9jbG9zZShuZXRzbm1wX3Nlc3Npb24gKik7CiAgICBpbnQgICAgICAgICAgICAgc25tcF9jbG9zZV9zZXNzaW9ucyh2b2lkKTsKCgogICAgLyoKICAgICAqIGludCBzbm1wX3NlbmQoc2Vzc2lvbiwgcGR1KQogICAgICogICAgIG5ldHNubXBfc2Vzc2lvbiAqc2Vzc2lvbjsKICAgICAqICAgICBuZXRzbm1wX3BkdSAgICAgICpwZHU7CiAgICAgKgogICAgICogU2VuZHMgdGhlIGlucHV0IHBkdSBvbiB0aGUgc2Vzc2lvbiBhZnRlciBjYWxsaW5nIHNubXBfYnVpbGQgdG8gY3JlYXRlCiAgICAgKiBhIHNlcmlhbGl6ZWQgcGFja2V0LiAgSWYgbmVjZXNzYXJ5LCBzZXQgc29tZSBvZiB0aGUgcGR1IGRhdGEgZnJvbSB0aGUKICAgICAqIHNlc3Npb24gZGVmYXVsdHMuICBBZGQgYSByZXF1ZXN0IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBwZHUgdG8gdGhlIGxpc3QKICAgICAqIG9mIG91dHN0YW5kaW5nIHJlcXVlc3RzIG9uIHRoaXMgc2Vzc2lvbiwgdGhlbiBzZW5kIHRoZSBwZHUuCiAgICAgKiBSZXR1cm5zIHRoZSByZXF1ZXN0IGlkIG9mIHRoZSBnZW5lcmF0ZWQgcGFja2V0IGlmIGFwcGxpY2FibGUsIG90aGVyd2lzZSAxLgogICAgICogT24gYW55IGVycm9yLCAwIGlzIHJldHVybmVkLgogICAgICogVGhlIHBkdSBpcyBmcmVlZCBieSBzbm1wX3NlbmQoKSB1bmxlc3MgYSBmYWlsdXJlIG9jY3VyZWQuCiAgICAgKi8KICAgIGludCAgICAgICAgICAgICBzbm1wX3NlbmQobmV0c25tcF9zZXNzaW9uICosIG5ldHNubXBfcGR1ICopOwoKICAgIC8qCiAgICAgKiBpbnQgc25tcF9hc3luY19zZW5kKHNlc3Npb24sIHBkdSwgY2FsbGJhY2ssIGNiX2RhdGEpCiAgICAgKiAgICAgbmV0c25tcF9zZXNzaW9uICpzZXNzaW9uOwogICAgICogICAgIG5ldHNubXBfcGR1ICAgICAgKnBkdTsKICAgICAqICAgICBuZXRzbm1wX2NhbGxiYWNrIGNhbGxiYWNrOwogICAgICogICAgIHZvaWQgICAqY2JfZGF0YTsKICAgICAqCiAgICAgKiBTZW5kcyB0aGUgaW5wdXQgcGR1IG9uIHRoZSBzZXNzaW9uIGFmdGVyIGNhbGxpbmcgc25tcF9idWlsZCB0byBjcmVhdGUKICAgICAqIGEgc2VyaWFsaXplZCBwYWNrZXQuICBJZiBuZWNlc3NhcnksIHNldCBzb21lIG9mIHRoZSBwZHUgZGF0YSBmcm9tIHRoZQogICAgICogc2Vzc2lvbiBkZWZhdWx0cy4gIEFkZCBhIHJlcXVlc3QgY29ycmVzcG9uZGluZyB0byB0aGlzIHBkdSB0byB0aGUgbGlzdAogICAgICogb2Ygb3V0c3RhbmRpbmcgcmVxdWVzdHMgb24gdGhpcyBzZXNzaW9uIGFuZCBzdG9yZSBjYWxsYmFjayBhbmQgZGF0YSwKICAgICAqIHRoZW4gc2VuZCB0aGUgcGR1LgogICAgICogUmV0dXJucyB0aGUgcmVxdWVzdCBpZCBvZiB0aGUgZ2VuZXJhdGVkIHBhY2tldCBpZiBhcHBsaWNhYmxlLCBvdGhlcndpc2UgMS4KICAgICAqIE9uIGFueSBlcnJvciwgMCBpcyByZXR1cm5lZC4KICAgICAqIFRoZSBwZHUgaXMgZnJlZWQgYnkgc25tcF9zZW5kKCkgdW5sZXNzIGEgZmFpbHVyZSBvY2N1cmVkLgogICAgICovCiAgICBpbnQgICAgICAgICAgICAgc25tcF9hc3luY19zZW5kKG5ldHNubXBfc2Vzc2lvbiAqLCBuZXRzbm1wX3BkdSAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2NhbGxiYWNrLCB2b2lkICopOwoKCiAgICAvKgogICAgICogdm9pZCBzbm1wX3JlYWQoZmRzZXQpCiAgICAgKiAgICAgZmRfc2V0ICAqZmRzZXQ7CiAgICAgKgogICAgICogQ2hlY2tzIHRvIHNlZSBpZiBhbnkgb2YgdGhlIGZkJ3Mgc2V0IGluIHRoZSBmZHNldCBiZWxvbmcgdG8KICAgICAqIHNubXAuICBFYWNoIHNvY2tldCB3aXRoIGl0J3MgZmQgc2V0IGhhcyBhIHBhY2tldCByZWFkIGZyb20gaXQKICAgICAqIGFuZCBzbm1wX3BhcnNlIGlzIGNhbGxlZCBvbiB0aGUgcGFja2V0IHJlY2VpdmVkLiAgVGhlIHJlc3VsdGluZyBwZHUKICAgICAqIGlzIHBhc3NlZCB0byB0aGUgY2FsbGJhY2sgcm91dGluZSBmb3IgdGhhdCBzZXNzaW9uLiAgSWYgdGhlIGNhbGxiYWNrCiAgICAgKiByb3V0aW5lIHJldHVybnMgc3VjY2Vzc2Z1bGx5LCB0aGUgcGR1IGFuZCBpdCdzIHJlcXVlc3QgYXJlIGRlbGV0ZWQuCiAgICAgKi8KICAgIHZvaWQgICAgICAgICAgICBzbm1wX3JlYWQoZmRfc2V0ICopOwoKCgogICAgLyoKICAgICAqIHZvaWQKICAgICAqIHNubXBfZnJlZV9wZHUocGR1KQogICAgICogICAgIG5ldHNubXBfcGR1ICpwZHU7CiAgICAgKgogICAgICogRnJlZXMgdGhlIHBkdSBhbmQgYW55IG1hbGxvYydkIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGl0LgogICAgICovCiAgICB2b2lkICAgICAgICAgICAgc25tcF9mcmVlX3BkdShuZXRzbm1wX3BkdSAqKTsKCiAgICB2b2lkICAgICAgICAgICAgc25tcF9mcmVlX3ZhcihuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKik7ICAgICAvKiBmcmVlcyBqdXN0IHRoaXMgb25lICovCgogICAgdm9pZCAgICAgICAgICAgIHNubXBfZnJlZV92YXJiaW5kKG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhcik7ICAgICAvKiBmcmVlcyBhbGwgaW4gbGlzdCAqLwoKICAgIC8qCiAgICAgKiBpbnQgc25tcF9zZWxlY3RfaW5mbyhudW1mZHMsIGZkc2V0LCB0aW1lb3V0LCBibG9jaykKICAgICAqIGludCAqbnVtZmRzOwogICAgICogZmRfc2V0ICAgKmZkc2V0OwogICAgICogc3RydWN0IHRpbWV2YWwgKnRpbWVvdXQ7CiAgICAgKiBpbnQgKmJsb2NrOwogICAgICoKICAgICAqIFJldHVybnMgaW5mbyBhYm91dCB3aGF0IHNubXAgcmVxdWlyZXMgZnJvbSBhIHNlbGVjdCBzdGF0ZW1lbnQuCiAgICAgKiBudW1mZHMgaXMgdGhlIG51bWJlciBvZiBmZHMgaW4gdGhlIGxpc3QgdGhhdCBhcmUgc2lnbmlmaWNhbnQuCiAgICAgKiBBbGwgZmlsZSBkZXNjcmlwdG9ycyBvcGVuZWQgZm9yIFNOTVAgYXJlIE9SJ2QgaW50byB0aGUgZmRzZXQuCiAgICAgKiBJZiBhY3Rpdml0eSBvY2N1cnMgb24gYW55IG9mIHRoZXNlIGZpbGUgZGVzY3JpcHRvcnMsIHNubXBfcmVhZAogICAgICogc2hvdWxkIGJlIGNhbGxlZCB3aXRoIHRoYXQgZmlsZSBkZXNjcmlwdG9yIHNldC4KICAgICAqCiAgICAgKiBUaGUgdGltZW91dCBpcyB0aGUgbGF0ZXN0IHRpbWUgdGhhdCBTTk1QIGNhbiB3YWl0IGZvciBhIHRpbWVvdXQuICBUaGUKICAgICAqIHNlbGVjdCBzaG91bGQgYmUgZG9uZSB3aXRoIHRoZSBtaW5pbXVtIHRpbWUgYmV0d2VlbiB0aW1lb3V0IGFuZCBhbnkgb3RoZXIKICAgICAqIHRpbWVvdXRzIG5lY2Vzc2FyeS4gIFRoaXMgc2hvdWxkIGJlIGNoZWNrZWQgdXBvbiBlYWNoIGludm9jYXRpb24gb2Ygc2VsZWN0LgogICAgICogSWYgYSB0aW1lb3V0IGlzIHJlY2VpdmVkLCBzbm1wX3RpbWVvdXQgc2hvdWxkIGJlIGNhbGxlZCB0byBjaGVjayBpZiB0aGUKICAgICAqIHRpbWVvdXQgd2FzIGZvciBTTk1QLiAgKHNubXBfdGltZW91dCBpcyBpZGVtcG90ZW50KQogICAgICoKICAgICAqIEJsb2NrIGlzIDEgaWYgdGhlIHNlbGVjdCBpcyByZXF1ZXN0ZWQgdG8gYmxvY2sgaW5kZWZpbml0ZWx5LCByYXRoZXIgdGhhbgogICAgICogdGltZSBvdXQuICBJZiBibG9jayBpcyBpbnB1dCBhcyAxLCB0aGUgdGltZW91dCB2YWx1ZSB3aWxsIGJlIHRyZWF0ZWQgYXMKICAgICAqIHVuZGVmaW5lZCwgYnV0IGl0IG11c3QgYmUgYXZhaWxhYmxlIGZvciBzZXR0aW5nIGluIHNubXBfc2VsZWN0X2luZm8uICBPbgogICAgICogcmV0dXJuLCBpZiBibG9jayBpcyB0cnVlLCB0aGUgdmFsdWUgb2YgdGltZW91dCB3aWxsIGJlIHVuZGVmaW5lZC4KICAgICAqCiAgICAgKiBzbm1wX3NlbGVjdF9pbmZvIHJldHVybnMgdGhlIG51bWJlciBvZiBvcGVuIHNvY2tldHMuICAoaS5lLiBUaGUgbnVtYmVyCiAgICAgKiBvZiBzZXNzaW9ucyBvcGVuKQogICAgICovCiAgICBpbnQgICAgICAgICAgICAgc25tcF9zZWxlY3RfaW5mbyhpbnQgKiwgZmRfc2V0ICosIHN0cnVjdCB0aW1ldmFsICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKik7CgoKCiAgICAvKgogICAgICogdm9pZCBzbm1wX3RpbWVvdXQoKTsKICAgICAqCiAgICAgKiBzbm1wX3RpbWVvdXQgc2hvdWxkIGJlIGNhbGxlZCB3aGVuZXZlciB0aGUgdGltZW91dCBmcm9tIHNubXBfc2VsZWN0X2luZm8KICAgICAqIGV4cGlyZXMsIGJ1dCBpdCBpcyBpZGVtcG90ZW50LCBzbyBzbm1wX3RpbWVvdXQgY2FuIGJlIHBvbGxlZCAocHJvYmFibHkgYQogICAgICogY3B1IGV4cGVuc2l2ZSBwcm9wb3NpdGlvbikuICBzbm1wX3RpbWVvdXQgY2hlY2tzIHRvIHNlZSBpZiBhbnkgb2YgdGhlCiAgICAgKiBzZXNzaW9ucyBoYXZlIGFuIG91dHN0YW5kaW5nIHJlcXVlc3QgdGhhdCBoYXMgdGltZWQgb3V0LiAgSWYgaXQgZmluZHMgb25lCiAgICAgKiAob3IgbW9yZSksIGFuZCB0aGF0IHBkdSBoYXMgbW9yZSByZXRyaWVzIGF2YWlsYWJsZSwgYSBuZXcgcGFja2V0IGlzIGZvcm1lZAogICAgICogZnJvbSB0aGUgcGR1IGFuZCBpcyByZXNlbnQuICBJZiB0aGVyZSBhcmUgbm8gbW9yZSByZXRyaWVzIGF2YWlsYWJsZSwgdGhlCiAgICAgKiBjYWxsYmFjayBmb3IgdGhlIHNlc3Npb24gaXMgdXNlZCB0byBhbGVydCB0aGUgdXNlciBvZiB0aGUgdGltZW91dC4KICAgICAqLwoKICAgIHZvaWQgICAgICAgICAgICBzbm1wX3RpbWVvdXQodm9pZCk7CgoKICAgIC8qCiAgICAgKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBzdXBwbGllZCBieSB0aGUgYXBwbGljYXRpb246CiAgICAgKgogICAgICogdV9jaGFyICphdXRoZW50aWNhdG9yKHBkdSwgbGVuZ3RoLCBjb21tdW5pdHksIGNvbW11bml0eV9sZW4pCiAgICAgKiB1X2NoYXIgKnBkdTsgICAgICAgICBUaGUgcmVzdCBvZiB0aGUgUERVIHRvIGJlIGF1dGhlbnRpY2F0ZWQKICAgICAqIGludCAqbGVuZ3RoOyAgICAgICAgIFRoZSBsZW5ndGggb2YgdGhlIFBEVSAodXBkYXRlZCBieSB0aGUgYXV0aGVudGljYXRvcikKICAgICAqIHVfY2hhciAqY29tbXVuaXR5OyAgIFRoZSBjb21tdW5pdHkgbmFtZSB0byBhdXRoZW50aWNhdGUgdW5kZXIuCiAgICAgKiBpbnQgIGNvbW11bml0eV9sZW4gICBUaGUgbGVuZ3RoIG9mIHRoZSBjb21tdW5pdHkgbmFtZS4KICAgICAqCiAgICAgKiBSZXR1cm5zIHRoZSBhdXRoZW50aWNhdGVkIHBkdSwgb3IgTlVMTCBpZiBhdXRoZW50aWNhdGlvbiBmYWlsZWQuCiAgICAgKiBJZiBudWxsIGF1dGhlbnRpY2F0aW9uIGlzIHVzZWQsIHRoZSBhdXRoZW50aWNhdG9yIGluIHNubXBfc2Vzc2lvbiBjYW4gYmUKICAgICAqIHNldCB0byBOVUxMKDApLgogICAgICovCgoKCiAgICAvKgogICAgICogVGhpcyByb3V0aW5lIG11c3QgYmUgc3VwcGxpZWQgYnkgdGhlIGFwcGxpY2F0aW9uOgogICAgICoKICAgICAqIGludCBjYWxsYmFjayhvcGVyYXRpb24sIHNlc3Npb24sIHJlcWlkLCBwZHUsIG1hZ2ljKQogICAgICogaW50IG9wZXJhdGlvbjsKICAgICAqIG5ldHNubXBfc2Vzc2lvbiAqc2Vzc2lvbjsgICAgVGhlIHNlc3Npb24gYXV0aGVudGljYXRlZCB1bmRlci4KICAgICAqIGludCByZXFpZDsgICAgICAgICAgICAgICAgICAgICAgIFRoZSByZXF1ZXN0IGlkIG9mIHRoaXMgcGR1ICgwIGZvciBUUkFQKQogICAgICogbmV0c25tcF9wZHUgKnBkdTsgICAgICAgIFRoZSBwZHUgaW5mb3JtYXRpb24uCiAgICAgKiB2b2lkICptYWdpYyAgICAgICAgICAgICAgICAgICAgICBBIGxpbmsgdG8gdGhlIGRhdGEgZm9yIHRoaXMgcm91dGluZS4KICAgICAqCiAgICAgKiBSZXR1cm5zIDEgaWYgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bCwgMCBpZiBpdCBzaG91bGQgYmUga2VwdCBwZW5kaW5nLgogICAgICogQW55IGRhdGEgaW4gdGhlIHBkdSBtdXN0IGJlIGNvcGllZCBiZWNhdXNlIGl0IHdpbGwgYmUgZnJlZWQgZWxzZXdoZXJlLgogICAgICogT3BlcmF0aW9ucyBhcmUgZGVmaW5lZCBiZWxvdzoKICAgICAqLwoKI2RlZmluZSBORVRTTk1QX0NBTExCQUNLX09QX1JFQ0VJVkVEX01FU1NBR0UJMQojZGVmaW5lIE5FVFNOTVBfQ0FMTEJBQ0tfT1BfVElNRURfT1VUCQkyCiNkZWZpbmUgTkVUU05NUF9DQUxMQkFDS19PUF9TRU5EX0ZBSUxFRAkJMwojZGVmaW5lIE5FVFNOTVBfQ0FMTEJBQ0tfT1BfQ09OTkVDVAkJNAojZGVmaW5lIE5FVFNOTVBfQ0FMTEJBQ0tfT1BfRElTQ09OTkVDVAkJNQoKICAgIGxvbmcgICAgICAgICAgICBzbm1wX2dldF9uZXh0X21zZ2lkKHZvaWQpOwogICAgbG9uZyAgICAgICAgICAgIHNubXBfZ2V0X25leHRfcmVxaWQodm9pZCk7CiAgICBsb25nICAgICAgICAgICAgc25tcF9nZXRfbmV4dF9zZXNzaWQodm9pZCk7CiAgICBsb25nICAgICAgICAgICAgc25tcF9nZXRfbmV4dF90cmFuc2lkKHZvaWQpOwoKICAgIGludCAgICAgICAgICAgICBzbm1wX29pZF9jb21wYXJlKGNvbnN0IG9pZCAqLCBzaXplX3QsIGNvbnN0IG9pZCAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KTsKICAgIGludCAgICAgICAgICAgICBzbm1wX29pZF9uY29tcGFyZShjb25zdCBvaWQgKiwgc2l6ZV90LCBjb25zdCBvaWQgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QsIHNpemVfdCk7CiAgICBpbnQgICAgICAgICAgICAgc25tcF9vaWR0cmVlX2NvbXBhcmUoY29uc3Qgb2lkICosIHNpemVfdCwgY29uc3Qgb2lkICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KTsKICAgIGludCAgICAgICAgICAgICBzbm1wX29pZHN1YnRyZWVfY29tcGFyZShjb25zdCBvaWQgKiwgc2l6ZV90LCBjb25zdCBvaWQgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QpOwogICAgaW50ICAgICAgICAgICAgIG5ldHNubXBfb2lkX2NvbXBhcmVfbGwoY29uc3Qgb2lkICogaW5fbmFtZTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuMSwgY29uc3Qgb2lkICogaW5fbmFtZTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuMiwgc2l6ZV90ICpvZmZwdCk7CiAgICBpbnQgICAgICAgICAgICAgbmV0c25tcF9vaWRfZXF1YWxzKGNvbnN0IG9pZCAqLCBzaXplX3QsIGNvbnN0IG9pZCAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QpOwogICAgaW50ICAgICAgICAgICAgIG5ldHNubXBfb2lkX3RyZWVfZXF1YWxzKGNvbnN0IG9pZCAqLCBzaXplX3QsIGNvbnN0IG9pZCAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCk7CiAgICBORVRTTk1QX0lNUE9SVAogICAgaW50ICAgICAgICAgICAgIG5ldHNubXBfb2lkX2lzX3N1YnRyZWUoY29uc3Qgb2lkICosIHNpemVfdCwgY29uc3Qgb2lkICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QpOwogICAgaW50ICAgICAgICAgICAgIG5ldHNubXBfb2lkX2ZpbmRfcHJlZml4KGNvbnN0IG9pZCAqIGluX25hbWUxLCBzaXplX3QgbGVuMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvaWQgKiBpbl9uYW1lMiwgc2l6ZV90IGxlbjIpOwogICAgdm9pZCAgICAgICAgICAgIGluaXRfc25tcChjb25zdCBjaGFyICopOwogICAgdV9jaGFyICAgICAgICAgKnNubXBfcGR1X2J1aWxkKG5ldHNubXBfcGR1ICosIHVfY2hhciAqLCBzaXplX3QgKik7CiNpZmRlZiBORVRTTk1QX1VTRV9SRVZFUlNFX0FTTkVOQ09ESU5HCiAgICB1X2NoYXIgICAgICAgICAqc25tcF9wZHVfcmJ1aWxkKG5ldHNubXBfcGR1ICosIHVfY2hhciAqLCBzaXplX3QgKik7CiNlbmRpZgogICAgaW50ICAgICAgICAgICAgIHNubXB2M19wYXJzZShuZXRzbm1wX3BkdSAqLCB1X2NoYXIgKiwgc2l6ZV90ICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqKiwgbmV0c25tcF9zZXNzaW9uICopOwogICAgaW50ICAgICAgICAgICAgIHNubXB2M19wYWNrZXRfYnVpbGQobmV0c25tcF9zZXNzaW9uICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3BkdSAqcGR1LCB1X2NoYXIgKiBwYWNrZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogcGR1X2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcGR1X2RhdGFfbGVuKTsKICAgIGludCAgICAgICAgICAgICBzbm1wdjNfcGFja2V0X3JidWlsZChuZXRzbm1wX3Nlc3Npb24gKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3BkdSAqcGR1LCB1X2NoYXIgKiBwYWNrZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBwZHVfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcGR1X2RhdGFfbGVuKTsKICAgIGludCAgICAgICAgICAgICBzbm1wdjNfbWFrZV9yZXBvcnQobmV0c25tcF9wZHUgKnBkdSwgaW50IGVycm9yKTsKICAgIGludCAgICAgICAgICAgICBzbm1wdjNfZ2V0X3JlcG9ydF90eXBlKG5ldHNubXBfcGR1ICpwZHUpOwogICAgaW50ICAgICAgICAgICAgIHNubXBfcGR1X3BhcnNlKG5ldHNubXBfcGR1ICpwZHUsIHVfY2hhciAqIGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogbGVuZ3RoKTsKICAgIHVfY2hhciAgICAgICAgICpzbm1wdjNfc2NvcGVkUERVX3BhcnNlKG5ldHNubXBfcGR1ICpwZHUsIHVfY2hhciAqIGNwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogbGVuZ3RoKTsKICAgIHZvaWQgICAgICAgICAgICBzbm1wX3N0b3JlKGNvbnN0IGNoYXIgKnR5cGUpOwogICAgdm9pZCAgICAgICAgICAgIHNubXBfc2h1dGRvd24oY29uc3QgY2hhciAqdHlwZSk7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnNubXBfcGR1X2FkZF92YXJpYWJsZShuZXRzbm1wX3BkdSAqLCBjb25zdCBvaWQgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCwgdV9jaGFyLCBjb25zdCB1X2NoYXIgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCk7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUobmV0c25tcF92YXJpYWJsZV9saXN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiogdmFybGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuYW1lX2xlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1X2NoYXIgKiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuKTsKICAgIGludCAgICAgICAgICAgICBzbm1wX2FkZF92YXIobmV0c25tcF9wZHUgKiwgY29uc3Qgb2lkICosIHNpemVfdCwgY2hhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKTsKICAgIG9pZCAgICAgICAgICAgICpzbm1wX2R1cGxpY2F0ZV9vYmppZChjb25zdCBvaWQgKiBvYmpUb0NvcHksIHNpemVfdCk7CiAgICB1X2ludCAgICAgICAgICAgc25tcF9pbmNyZW1lbnRfc3RhdGlzdGljKGludCB3aGljaCk7CiAgICB1X2ludCAgICAgICAgICAgc25tcF9pbmNyZW1lbnRfc3RhdGlzdGljX2J5KGludCB3aGljaCwgaW50IGNvdW50KTsKICAgIHVfaW50ICAgICAgICAgICBzbm1wX2dldF9zdGF0aXN0aWMoaW50IHdoaWNoKTsKICAgIHZvaWQgICAgICAgICAgICBzbm1wX2luaXRfc3RhdGlzdGljcyh2b2lkKTsKICAgIGludCAgICAgICAgICAgICBjcmVhdGVfdXNlcl9mcm9tX3Nlc3Npb24obmV0c25tcF9zZXNzaW9uICogc2Vzc2lvbik7CiAgICBpbnQgc25tcF9nZXRfZmRfZm9yX3Nlc3Npb24oc3RydWN0IHNubXBfc2Vzc2lvbiAqc2Vzc3ApOwoKICAgIC8qCiAgICAgKiBOZXcgcmUtYWxsb2NhdGluZyByZXZlcnNlIGVuY29kaW5nIGZ1bmN0aW9ucy4gIAogICAgICovCiNpZmRlZiBORVRTTk1QX1VTRV9SRVZFUlNFX0FTTkVOQ09ESU5HCgogICAgaW50ICAgICAgICBzbm1wdjNfcGFja2V0X3JlYWxsb2NfcmJ1aWxkKHVfY2hhciAqKiBwa3QsIHNpemVfdCAqIHBrdF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3Nlc3Npb24gKiBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9wZHUgKnBkdSwgdV9jaGFyICogcGR1X2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcGR1X2RhdGFfbGVuKTsKCiAgICBpbnQgICAgICAgIHNubXBfcGR1X3JlYWxsb2NfcmJ1aWxkKHVfY2hhciAqKiBwa3QsIHNpemVfdCAqIHBrdF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb2Zmc2V0LCBuZXRzbm1wX3BkdSAqcGR1KTsKI2VuZGlmCgoKCiAgICAvKgogICAgICogRXh0ZW5kZWQgb3BlbjsgZnByZV9wYXJzZSBoYXMgY2hhbmdlZC4gIAogICAgICovCgogICAgbmV0c25tcF9zZXNzaW9uICpzbm1wX29wZW5fZXgobmV0c25tcF9zZXNzaW9uICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKCpmcHJlX3BhcnNlKSAobmV0c25tcF9zZXNzaW9uICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF90cmFuc3BvcnRfcyAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiwgaW50KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAoKmZwYXJzZSkgKG5ldHNubXBfc2Vzc2lvbiAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9wZHUgKiwgdV9jaGFyICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqZnBvc3RfcGFyc2UpIChuZXRzbm1wX3Nlc3Npb24gKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9wZHUgKiwgaW50KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAoKmZidWlsZCkgKG5ldHNubXBfc2Vzc2lvbiAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9wZHUgKiwgdV9jaGFyICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKCpmcmJ1aWxkKSAobmV0c25tcF9zZXNzaW9uICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9wZHUgKiwgdV9jaGFyICoqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqLCBzaXplX3QgKiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKCpmY2hlY2spICh1X2NoYXIgKiwgc2l6ZV90KSk7CgogICAgLyoKICAgICAqIHByb3ZpZGVkIGZvciBiYWNrd2FyZHMgY29tcGF0YWJpbGl0eS4gIERvbid0IHVzZSB0aGVzZSBmdW5jdGlvbnMuCiAgICAgKiBTZWUgc25tcF9kZWJ1Zy5oIGFuZCBzbm1wX2RlYnVnLmMgaW5zdGVhZC4KICAgICAqLwoKICAgIHZvaWQgICAgICAgICAgICBzbm1wX3NldF9kb19kZWJ1Z2dpbmcoaW50KTsKICAgIGludCAgICAgICAgICAgICBzbm1wX2dldF9kb19kZWJ1Z2dpbmcodm9pZCk7CgoKICAgIC8qCiAgICAgKiBzbm1wX2Vycm9yIC0gcmV0dXJuIGVycm9yIGRhdGEKICAgICAqIElucHV0cyA6ICBhZGRyZXNzIG9mIGVycm5vLCBhZGRyZXNzIG9mIHNubXBfZXJybm8sIGFkZHJlc3Mgb2Ygc3RyaW5nCiAgICAgKiBDYWxsZXIgbXVzdCBmcmVlIHRoZSBzdHJpbmcgcmV0dXJuZWQgYWZ0ZXIgdXNlLgogICAgICovCiAgICB2b2lkICAgICAgICAgICAgc25tcF9lcnJvcihuZXRzbm1wX3Nlc3Npb24gKiwgaW50ICosIGludCAqLCBjaGFyICoqKTsKICAgIC8qCiAgICAgKiBzaW5nbGUgc2Vzc2lvbiBBUEkuCiAgICAgKgogICAgICogVGhlc2UgZnVuY3Rpb25zIHBlcmZvcm0gc2ltaWxhciBhY3Rpb25zIGFzIHNubXBfWFggZnVuY3Rpb25zLAogICAgICogYnV0IG9wZXJhdGUgb24gYSBzaW5nbGUgc2Vzc2lvbiBvbmx5LgogICAgICoKICAgICAqIFN5bm9wc2lzOgogICAgIAogICAgIHZvaWQgKiBzZXNzcDsKICAgICBuZXRzbm1wX3Nlc3Npb24gc2Vzc2lvbiwgKnNzOwogICAgIG5ldHNubXBfcGR1ICpwZHUsICpyZXNwb25zZTsKICAgICAKICAgICBzbm1wX3Nlc3NfaW5pdCgmc2Vzc2lvbik7CiAgICAgc2Vzc2lvbi5yZXRyaWVzID0gLi4uCiAgICAgc2Vzc2lvbi5yZW1vdGVfcG9ydCA9IC4uLgogICAgIHNlc3NwID0gc25tcF9zZXNzX29wZW4oJnNlc3Npb24pOwogICAgIHNzID0gc25tcF9zZXNzX3Nlc3Npb24oc2Vzc3ApOwogICAgIGlmIChzcyA9PSBOVUxMKQogICAgIGV4aXQoMSk7CiAgICAgLi4uCiAgICAgaWYgKHNzLT5jb21tdW5pdHkpIGZyZWUoc3MtPmNvbW11bml0eSk7CiAgICAgc3MtPmNvbW11bml0eSA9IHN0cmR1cChnYXRld2F5KTsKICAgICBzcy0+Y29tbXVuaXR5X2xlbiA9IHN0cmxlbihnYXRld2F5KTsKICAgICAuLi4KICAgICBzbm1wX3Nlc3Nfc3luY2hfcmVzcG9uc2Uoc2Vzc3AsIHBkdSwgJnJlc3BvbnNlKTsKICAgICAuLi4KICAgICBzbm1wX3Nlc3NfY2xvc2Uoc2Vzc3ApOwogICAgIAogICAgICogU2VlIGFsc286CiAgICAgKiBzbm1wX3Nlc3Nfc3luY2hfcmVzcG9uc2UsIGluIHNubXBfY2xpZW50LmguCiAgICAgCiAgICAgKiBOb3RlczoKICAgICAqICAxLiBJbnZva2Ugc25tcF9zZXNzX3Nlc3Npb24gYWZ0ZXIgc25tcF9zZXNzX29wZW4uCiAgICAgKiAgMi4gc25tcF9zZXNzX3Nlc3Npb24gcmV0dXJuIHZhbHVlIGlzIGFuIG9wYXF1ZSBwb2ludGVyLgogICAgICogIDMuIERvIE5PVCBmcmVlIG1lbW9yeSByZXR1cm5lZCBieSBzbm1wX3Nlc3Nfc2Vzc2lvbi4KICAgICAqICA0LiBSZXBsYWNlIHNubXBfc2VuZChzcyxwZHUpIHdpdGggc25tcF9zZXNzX3NlbmQoc2Vzc3AscGR1KQogICAgICovCgogICAgdm9pZCAgICAgICAgICAgIHNubXBfc2Vzc19pbml0KG5ldHNubXBfc2Vzc2lvbiAqKTsKICAgIHZvaWQgICAgICAgICAgICpzbm1wX3Nlc3Nfb3BlbihuZXRzbm1wX3Nlc3Npb24gKik7CiAgICB2b2lkICAgICAgICAgICAqc25tcF9zZXNzX3BvaW50ZXIobmV0c25tcF9zZXNzaW9uICopOwogICAgbmV0c25tcF9zZXNzaW9uICpzbm1wX3Nlc3Nfc2Vzc2lvbih2b2lkICopOwogICAgTkVUU05NUF9JTVBPUlQKICAgIG5ldHNubXBfc2Vzc2lvbiAqc25tcF9zZXNzX3Nlc3Npb25fbG9va3VwKHZvaWQgKik7CgogICAgLyoKICAgICAqIFJldHVybiB0aGUgbmV0c25tcF90cmFuc3BvcnQgc3RydWN0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gb3BhcXVlCiAgICAgKiBwb2ludGVyLiAgCiAgICAgKi8KCiAgICBzdHJ1Y3QgbmV0c25tcF90cmFuc3BvcnRfcyAqc25tcF9zZXNzX3RyYW5zcG9ydCh2b2lkICopOwogICAgdm9pZCAgICAgICAgICAgIHNubXBfc2Vzc190cmFuc3BvcnRfc2V0KHZvaWQgKiwKCQkJCQkgICAgc3RydWN0IG5ldHNubXBfdHJhbnNwb3J0X3MgKik7CgogICAgLyoKICAgICAqIEVYVEVOREVEIFNFU1NJT04gQVBJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKICAgICAqIAogICAgICogc25tcF9zZXNzX2FkZF9leCwgc25tcF9zZXNzX2FkZCwgc25tcF9hZGQgCiAgICAgKiAKICAgICAqIEFuYWxvZ291cyB0byBzbm1wX29wZW4gZmFtaWx5IG9mIGZ1bmN0aW9ucywgYnV0IHRha2luZyBhbgogICAgICogbmV0c25tcF90cmFuc3BvcnQgcG9pbnRlciBhcyBhbiBleHRyYSBhcmd1bWVudC4gIFVubGlrZSBzbm1wX29wZW4gZXQKICAgICAqIGFsLiBpdCBkb2Vzbid0IGF0dGVtcHQgdG8gaW50ZXJwcmV0IHRoZSBpbl9zZXNzaW9uLT5wZWVybmFtZSBhcyBhCiAgICAgKiB0cmFuc3BvcnQgZW5kcG9pbnQgc3BlY2lmaWVyLCBidXQgaW5zdGVhZCB1c2VzIHRoZSBzdXBwbGllZCB0cmFuc3BvcnQuCiAgICAgKiBKQlBOCiAgICAgKiAKICAgICAqLwoKICAgIHZvaWQgICAgICAgICAgICpzbm1wX3Nlc3NfYWRkX2V4KG5ldHNubXBfc2Vzc2lvbiAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG5ldHNubXBfdHJhbnNwb3J0X3MgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAoKmZwcmVfcGFyc2UpIChuZXRzbm1wX3Nlc3Npb24gKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3RyYW5zcG9ydF9zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiwgdm9pZCAqLCBpbnQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqZnBhcnNlKSAobmV0c25tcF9zZXNzaW9uICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc25tcF9wZHUgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqLCBzaXplX3QpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqZnBvc3RfcGFyc2UpIChuZXRzbm1wX3Nlc3Npb24gKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNubXBfcGR1ICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKCpmYnVpbGQpIChuZXRzbm1wX3Nlc3Npb24gKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzbm1wX3BkdSAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICosIHNpemVfdCAqKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAoKmZyYnVpbGQpIChuZXRzbm1wX3Nlc3Npb24gKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc25tcF9wZHUgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiosIHNpemVfdCAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAoKmZjaGVjaykgKHVfY2hhciAqLCBzaXplX3QpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9wZHUgKigqZmNyZWF0ZV9wZHUpIChzdHJ1Y3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF90cmFuc3BvcnRfcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCkpOwoKICAgIHZvaWQgICAgICAgICAgICpzbm1wX3Nlc3NfYWRkKG5ldHNubXBfc2Vzc2lvbiAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG5ldHNubXBfdHJhbnNwb3J0X3MgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAoKmZwcmVfcGFyc2UpIChuZXRzbm1wX3Nlc3Npb24gKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3RyYW5zcG9ydF9zICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqLCBpbnQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqZnBvc3RfcGFyc2UpIChuZXRzbm1wX3Nlc3Npb24gKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9wZHUgKiwgaW50KSk7CgogICAgbmV0c25tcF9zZXNzaW9uICpzbm1wX2FkZChuZXRzbm1wX3Nlc3Npb24gKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG5ldHNubXBfdHJhbnNwb3J0X3MgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqZnByZV9wYXJzZSkgKG5ldHNubXBfc2Vzc2lvbiAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG5ldHNubXBfdHJhbnNwb3J0X3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICosIHZvaWQgKiwgaW50KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqZnBvc3RfcGFyc2UpIChuZXRzbm1wX3Nlc3Npb24gKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3BkdSAqLCBpbnQpKTsKICAgIG5ldHNubXBfc2Vzc2lvbiAqc25tcF9hZGRfZnVsbChuZXRzbm1wX3Nlc3Npb24gKiBpbl9zZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBuZXRzbm1wX3RyYW5zcG9ydF9zICp0cmFuc3BvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqZnByZV9wYXJzZSkgKG5ldHNubXBfc2Vzc2lvbiAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF90cmFuc3BvcnRfcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLCB2b2lkICosIGludCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqZnBhcnNlKSAobmV0c25tcF9zZXNzaW9uICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9wZHUgKiwgdV9jaGFyICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKCpmcG9zdF9wYXJzZSkgKG5ldHNubXBfc2Vzc2lvbiAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9wZHUgKiwgaW50KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKCpmYnVpbGQpIChuZXRzbm1wX3Nlc3Npb24gKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3BkdSAqLCB1X2NoYXIgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqZnJidWlsZCkgKG5ldHNubXBfc2Vzc2lvbiAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3BkdSAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiosIHNpemVfdCAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqZmNoZWNrKSAodV9jaGFyICosIHNpemVfdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9wZHUgKigqZmNyZWF0ZV9wZHUpIChzdHJ1Y3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfdHJhbnNwb3J0X3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICosIHZvaWQgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCkKICAgICAgICApOwoKICAgIC8qCiAgICAgKiB1c2UgcmV0dXJuIHZhbHVlIGZyb20gc25tcF9zZXNzX29wZW4gYXMgdm9pZCAqIHBhcmFtZXRlciAKICAgICAqLwoKICAgIGludCAgICAgICAgICAgICBzbm1wX3Nlc3Nfc2VuZCh2b2lkICosIG5ldHNubXBfcGR1ICopOwogICAgaW50ICAgICAgICAgICAgIHNubXBfc2Vzc19hc3luY19zZW5kKHZvaWQgKiwgbmV0c25tcF9wZHUgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2NhbGxiYWNrLCB2b2lkICopOwogICAgaW50ICAgICAgICAgICAgIHNubXBfc2Vzc19zZWxlY3RfaW5mbyh2b2lkICosIGludCAqLCBmZF9zZXQgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRpbWV2YWwgKiwgaW50ICopOwogICAgaW50ICAgICAgICAgICAgIHNubXBfc2Vzc19yZWFkKHZvaWQgKiwgZmRfc2V0ICopOwogICAgdm9pZCAgICAgICAgICAgIHNubXBfc2Vzc190aW1lb3V0KHZvaWQgKik7CiAgICBpbnQgICAgICAgICAgICAgc25tcF9zZXNzX2Nsb3NlKHZvaWQgKik7CgogICAgdm9pZCAgICAgICAgICAgIHNubXBfc2Vzc19lcnJvcih2b2lkICosIGludCAqLCBpbnQgKiwgY2hhciAqKik7CiAgICB2b2lkICAgICAgICAgICAgbmV0c25tcF9zZXNzX2xvZ19lcnJvcihpbnQgcHJpb3JpdHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwcm9nX3N0cmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfc2Vzc2lvbiAqIHNzKTsKICAgIHZvaWQgICAgICAgICAgICBzbm1wX3Nlc3NfcGVycm9yKGNvbnN0IGNoYXIgKnByb2dfc3RyaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9zZXNzaW9uICogc3MpOwogICAgY29uc3QgY2hhciAqICAgIHNubXBfcGR1X3R5cGUoaW50IHR5cGUpOwoKICAgIC8qCiAgICAgKiBlbmQgc2luZ2xlIHNlc3Npb24gQVBJIAogICAgICovCgogICAgLyoKICAgICAqIGdlbmVyaWMgc3RhdGlzdGljIGNvdW50ZXJzIAogICAgICovCgogICAgLyoKICAgICAqIHNubXB2MyBzdGF0aXN0aWNzIAogICAgICovCgogICAgLyoKICAgICAqIG1wZCBzdGF0cyAKICAgICAqLwojZGVmaW5lICAgU1RBVF9TTk1QVU5LTk9XTlNFQ1VSSVRZTU9ERUxTICAgICAwCiNkZWZpbmUgICBTVEFUX1NOTVBJTlZBTElETVNHUyAgICAgICAgICAgICAgIDEKI2RlZmluZSAgIFNUQVRfU05NUFVOS05PV05QRFVIQU5ETEVSUyAgICAgICAgMgojZGVmaW5lICAgU1RBVF9NUERfU1RBVFNfU1RBUlQgICAgICAgICAgICAgICBTVEFUX1NOTVBVTktOT1dOU0VDVVJJVFlNT0RFTFMKI2RlZmluZSAgIFNUQVRfTVBEX1NUQVRTX0VORCAgICAgICAgICAgICAgICAgU1RBVF9TTk1QVU5LTk9XTlBEVUhBTkRMRVJTCgogICAgLyoKICAgICAqIHVzbSBzdGF0cyAKICAgICAqLwojZGVmaW5lICAgU1RBVF9VU01TVEFUU1VOU1VQUE9SVEVEU0VDTEVWRUxTICAzCiNkZWZpbmUgICBTVEFUX1VTTVNUQVRTTk9USU5USU1FV0lORE9XUyAgICAgIDQKI2RlZmluZSAgIFNUQVRfVVNNU1RBVFNVTktOT1dOVVNFUk5BTUVTICAgICAgNQojZGVmaW5lICAgU1RBVF9VU01TVEFUU1VOS05PV05FTkdJTkVJRFMgICAgICA2CiNkZWZpbmUgICBTVEFUX1VTTVNUQVRTV1JPTkdESUdFU1RTICAgICAgICAgIDcKI2RlZmluZSAgIFNUQVRfVVNNU1RBVFNERUNSWVBUSU9ORVJST1JTICAgICAgOAojZGVmaW5lICAgU1RBVF9VU01fU1RBVFNfU1RBUlQgICAgICAgICAgICAgICBTVEFUX1VTTVNUQVRTVU5TVVBQT1JURURTRUNMRVZFTFMKI2RlZmluZSAgIFNUQVRfVVNNX1NUQVRTX0VORCAgICAgICAgICAgICAgICAgU1RBVF9VU01TVEFUU0RFQ1JZUFRJT05FUlJPUlMKCiAgICAvKgogICAgICogc25tcCBjb3VudGVycyAKICAgICAqLwojZGVmaW5lICBTVEFUX1NOTVBJTlBLVFMgICAgICAgICAgICAgICAgICAgICA5CiNkZWZpbmUgIFNUQVRfU05NUE9VVFBLVFMgICAgICAgICAgICAgICAgICAgIDEwCiNkZWZpbmUgIFNUQVRfU05NUElOQkFEVkVSU0lPTlMgICAgICAgICAgICAgIDExCiNkZWZpbmUgIFNUQVRfU05NUElOQkFEQ09NTVVOSVRZTkFNRVMgICAgICAgIDEyCiNkZWZpbmUgIFNUQVRfU05NUElOQkFEQ09NTVVOSVRZVVNFUyAgICAgICAgIDEzCiNkZWZpbmUgIFNUQVRfU05NUElOQVNOUEFSU0VFUlJTICAgICAgICAgICAgIDE0CiAgICAvKgogICAgICogI2RlZmluZSAgU1RBVF9TTk1QSU5CQURUWVBFUyAgICAgICAgICAgICAgMTUgCiAgICAgKi8KI2RlZmluZSAgU1RBVF9TTk1QSU5UT09CSUdTICAgICAgICAgICAgICAgICAgMTYKI2RlZmluZSAgU1RBVF9TTk1QSU5OT1NVQ0hOQU1FUyAgICAgICAgICAgICAgMTcKI2RlZmluZSAgU1RBVF9TTk1QSU5CQURWQUxVRVMgICAgICAgICAgICAgICAgMTgKI2RlZmluZSAgU1RBVF9TTk1QSU5SRUFET05MWVMgICAgICAgICAgICAgICAgMTkKI2RlZmluZSAgU1RBVF9TTk1QSU5HRU5FUlJTICAgICAgICAgICAgICAgICAgMjAKI2RlZmluZSAgU1RBVF9TTk1QSU5UT1RBTFJFUVZBUlMgICAgICAgICAgICAgMjEKI2RlZmluZSAgU1RBVF9TTk1QSU5UT1RBTFNFVFZBUlMgICAgICAgICAgICAgMjIKI2RlZmluZSAgU1RBVF9TTk1QSU5HRVRSRVFVRVNUUyAgICAgICAgICAgICAgMjMKI2RlZmluZSAgU1RBVF9TTk1QSU5HRVRORVhUUyAgICAgICAgICAgICAgICAgMjQKI2RlZmluZSAgU1RBVF9TTk1QSU5TRVRSRVFVRVNUUyAgICAgICAgICAgICAgMjUKI2RlZmluZSAgU1RBVF9TTk1QSU5HRVRSRVNQT05TRVMgICAgICAgICAgICAgMjYKI2RlZmluZSAgU1RBVF9TTk1QSU5UUkFQUyAgICAgICAgICAgICAgICAgICAgMjcKI2RlZmluZSAgU1RBVF9TTk1QT1VUVE9PQklHUyAgICAgICAgICAgICAgICAgMjgKI2RlZmluZSAgU1RBVF9TTk1QT1VUTk9TVUNITkFNRVMgICAgICAgICAgICAgMjkKI2RlZmluZSAgU1RBVF9TTk1QT1VUQkFEVkFMVUVTICAgICAgICAgICAgICAgMzAKICAgIC8qCiAgICAgKiAjZGVmaW5lICBTVEFUX1NOTVBPVVRSRUFET05MWVMgICAgICAgICAgICAzMSAKICAgICAqLwojZGVmaW5lICBTVEFUX1NOTVBPVVRHRU5FUlJTICAgICAgICAgICAgICAgICAzMgojZGVmaW5lICBTVEFUX1NOTVBPVVRHRVRSRVFVRVNUUyAgICAgICAgICAgICAzMwojZGVmaW5lICBTVEFUX1NOTVBPVVRHRVRORVhUUyAgICAgICAgICAgICAgICAzNAojZGVmaW5lICBTVEFUX1NOTVBPVVRTRVRSRVFVRVNUUyAgICAgICAgICAgICAzNQojZGVmaW5lICBTVEFUX1NOTVBPVVRHRVRSRVNQT05TRVMgICAgICAgICAgICAzNgojZGVmaW5lICBTVEFUX1NOTVBPVVRUUkFQUyAgICAgICAgICAgICAgICAgICAzNwogICAgLyoKICAgICAqIEFVVEhUUkFQRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4IAogICAgICovCiNkZWZpbmUgIFNUQVRfU05NUFNJTEVOVERST1BTCQkgICAgIDM5CiNkZWZpbmUgIFNUQVRfU05NUFBST1hZRFJPUFMJCSAgICAgNDAKI2RlZmluZSAgU1RBVF9TTk1QX1NUQVRTX1NUQVJUICAgICAgICAgICAgICAgU1RBVF9TTk1QSU5QS1RTCiNkZWZpbmUgIFNUQVRfU05NUF9TVEFUU19FTkQgICAgICAgICAgICAgICAgIFNUQVRfU05NUFBST1hZRFJPUFMKCiAgICAvKgogICAgICogdGFyZ2V0IG1pYiBjb3VudGVycyAKICAgICAqLwojZGVmaW5lICBTVEFUX1NOTVBVTkFWQUlMQUJMRUNPTlRFWFRTCSAgICAgNDEKI2RlZmluZSAgU1RBVF9TTk1QVU5LTk9XTkNPTlRFWFRTCSAgICAgNDIKI2RlZmluZSAgU1RBVF9UQVJHRVRfU1RBVFNfU1RBUlQgICAgICAgICAgICAgU1RBVF9TTk1QVU5BVkFJTEFCTEVDT05URVhUUwojZGVmaW5lICBTVEFUX1RBUkdFVF9TVEFUU19FTkQgICAgICAgICAgICAgICBTVEFUX1NOTVBVTktOT1dOQ09OVEVYVFMKCiNkZWZpbmUgIE1BWF9TVEFUUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzCgojaWZkZWYgX19jcGx1c3BsdXMKfQojZW5kaWYKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTTk1QX0FQSV9IICovCg==