LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBGSUxFICAgOiAgSENGLkMKICoKICogREFURSAgICA6ICREYXRlOiAyMDA0LzA4LzA1IDExOjQ3OjEwICQgICAkUmV2aXNpb246IDEuMTAgJAogKiBPcmlnaW5hbDogMjAwNC8wNi8wMiAxMDoyMjoyMiAgICBSZXZpc2lvbjogMS44NSAgICAgIFRhZzogaGNmN190MjAwNDA2MDJfMDEKICogT3JpZ2luYWw6IDIwMDQvMDQvMTUgMDk6MjQ6NDEgICAgUmV2aXNpb246IDEuNjMgICAgICBUYWc6IGhjZjdfdDdfMjAwNDA0MTVfMDEKICogT3JpZ2luYWw6IDIwMDQvMDQvMTMgMTQ6MjI6NDQgICAgUmV2aXNpb246IDEuNjIgICAgICBUYWc6IHQ3XzIwMDQwNDEzXzAxCiAqIE9yaWdpbmFsOiAyMDA0LzA0LzAxIDE1OjMyOjU1ICAgIFJldmlzaW9uOiAxLjU5ICAgICAgVGFnOiB0N18yMDA0MDQwMV8wMQogKiBPcmlnaW5hbDogMjAwNC8wMy8xMCAxNTozOToyNyAgICBSZXZpc2lvbjogMS41NSAgICAgIFRhZzogdDIwMDQwMzEwXzAxCiAqIE9yaWdpbmFsOiAyMDA0LzAzLzA0IDExOjAzOjM3ICAgIFJldmlzaW9uOiAxLjUzICAgICAgVGFnOiB0MjAwNDAzMDRfMDEKICogT3JpZ2luYWw6IDIwMDQvMDMvMDIgMTQ6NTE6MjEgICAgUmV2aXNpb246IDEuNTAgICAgICBUYWc6IHQyMDA0MDMwMl8wMwogKiBPcmlnaW5hbDogMjAwNC8wMi8yNCAxMzowMDoyNyAgICBSZXZpc2lvbjogMS40MyAgICAgIFRhZzogdDIwMDQwMjI0XzAxCiAqIE9yaWdpbmFsOiAyMDA0LzAyLzE5IDEwOjU3OjI1ICAgIFJldmlzaW9uOiAxLjM5ICAgICAgVGFnOiB0MjAwNDAyMTlfMDEKICoKICogQVVUSE9SIDogIE5pY28gVmFsc3RlcgogKgogKiBTUEVDSUZJQ0FUSU9OOiAuLi4uLi4uLgogKgogKiBERVNDUklQVElPTiA6IEhDRiBSb3V0aW5lcyBmb3IgSGVybWVzLUlJIChjYWxsYWJsZSB2aWEgdGhlIFdpcmVsZXNzIENvbm5lY3Rpb24gSS9GIG9yIFdDSSkKICogICAgICAgICAgICAgICBMb2NhbCBTdXBwb3J0IFJvdXRpbmVzIGZvciBhYm92ZSBwcm9jZWR1cmVzCiAqCiAqICAgICAgICAgICBDdXN0b21pemFibGUgdmlhIEhDRkNGRy5ILCB3aGljaCBpcyBpbmNsdWRlZCBieSBIQ0YuSAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKgogKiBTT0ZUV0FSRSBMSUNFTlNFCiAqCiAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAogKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCiAqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KICogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgogKgogKiBDT1BZUklHSFQgqSAxOTk0IC0gMTk5NSAgIGJ5IEFUJlQuICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKICogQ09QWVJJR0hUIKkgMTk5NiAtIDIwMDAgYnkgTHVjZW50IFRlY2hub2xvZ2llcy4gICBBbGwgUmlnaHRzIFJlc2VydmVkCiAqIENPUFlSSUdIVCCpIDIwMDEgLSAyMDA0ICAgYnkgQWdlcmUgU3lzdGVtcyBJbmMuICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CiAqCiAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCiAqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCiAqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQogKiAgICBkaXN0cmlidXRpb24uCiAqCiAqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAogKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCiAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKgogKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycwogKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAqCiAqIERpc2NsYWltZXIKICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCiAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQogKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgogKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCiAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAogKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAogKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAogKiBEQU1BR0UuCiAqCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKICoqIEltcGxlbWVudGF0aW9uIE5vdGVzCiAqKgogKiAtIGEgbGVhZGluZyBtYXJrZXIgb2YgLy8hIGlzIHVzZWQuIFRoZSBwdXJwb3NlIG9mIHN1Y2ggYSBzZXF1ZW5jZSBpcyB0byBoZWxwIHRvIHVuZGVyc3RhbmQgdGhlIGZsb3cKICogICBBbiBleGFtcGxlIGlzOiAgLy8hcmMgPSBIQ0ZfU1VDQ0VTUzsKICogICBpZiB0aGlzIGlzIHN1cGVyZmx1b3VzIGJlY2F1c2UgcmMgaXMgYWxyZWFkeSBndWFyYW50ZWVkIHRvIGJlIDAgYnV0IGl0IHNob3dzIHRvIHRoZSAobWFpbnRlbmFuY2UpCiAqICAgcHJvZ3JhbW1lciBpdCBpcyBhbiBpbnRlbnRpb25hbCBvbWlzc2lvbiBhdCB0aGUgcGxhY2Ugd2hlcmUgc29tZW9uZSBjb3VsZCBjb25zaWRlciBpdCBtb3N0IGFwcHJvcHJpYXRlIGF0CiAqICAgZmlyc3QgZ2xhbmNlCiAqIC0gdXNpbmcgbmVhciBwb2ludGVycyBpbiBhIG1vZGVsIHdoZXJlIHNzIT1kcyBpcyBhbiBpbnZpdGF0aW9uIGZvciBkaXNhc3Rlciwgc28gYmUgYXdhcmUgb2YgaG93IHlvdSBzcGVjaWZ5CiAqICAgeW91ciBtb2RlbCBhbmQgaG93IHlvdSBkZWZpbmUgdmFyaWFibGVzIHdoaWNoIGFyZSB1c2VkIGF0IGludGVycnVwdCB0aW1lCiAqIC0gcmVtZW1iZXIgdGhhdCBzaWduIGV4dGVuc2lvbiBvbiAzMiBiaXQgcGxhdGZvcm1zIG1heSBjYXVzZSBwcm9ibGVtcyB1bmxlc3MgY29kZSBpcyBjYXJlZnVsbHkgY29uc3RydWN0ZWQsCiAqICAgZS5nLiB1c2UgIihoY2ZfMTYpfmZvbyIgcmF0aGVyIHRoYW4gIn5mb28iCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaW5jbHVkZSAiaGNmLmgiICAgICAgICAgICAgICAgIC8vIEhDRiBhbmQgTVNGIGNvbW1vbiBpbmNsdWRlIGZpbGUKI2luY2x1ZGUgImhjZmRlZi5oIiAgICAgICAgICAgICAvLyBIQ0Ygc3BlY2lmaWMgaW5jbHVkZSBmaWxlCiNpbmNsdWRlICJtbWQuaCIgICAgICAgICAgICAgICAgLy8gTW9yZU1vZHVsYXJEcml2ZXIgY29tbW9uIGluY2x1ZGUgZmlsZQojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CgojaWYgISBkZWZpbmVkIG9mZnNldG9mCiNkZWZpbmUgb2Zmc2V0b2YocyxtKSAgICgodW5zaWduZWQgaW50KSYoKChzICopMCktPm0pKQojZW5kaWYgLy8gb2Zmc2V0b2YKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIFBST1RPVFlQRVMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpIQ0ZfU1RBVElDIGludCAgICAgICAgICBjbWRfZXhlKCBJRkJQIGlmYnAsIGhjZl8xNiBjbWRfY29kZSwgaGNmXzE2IHBhcl8wICk7CkhDRl9TVEFUSUMgaW50ICAgICAgICAgIGluaXQoIElGQlAgaWZicCApOwpIQ0ZfU1RBVElDIGludCAgICAgICAgICBwdXRfaW5mbyggSUZCUCBpZmJwLCBMVFZQIGx0dnAgKTsKSENGX1NUQVRJQyBpbnQgICAgICAgICAgcHV0X2luZm9fbWIoIElGQlAgaWZicCwgQ0ZHX01CX0lORk9fU1RSQ1QgRkFSICogbHR2cCApOwojaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dQQQpIQ0ZfU1RBVElDIHZvaWQgICAgICAgICBjYWxjX21pYyggaGNmXzMyKiBwLCBoY2ZfMzIgTSApOwp2b2lkICAgICAgICAgICAgICAgICAgICBjYWxjX21pY19yeF9mcmFnKCBJRkJQIGlmYnAsIHdjaV9idWZwIHAsIGludCBsZW4gKTsKdm9pZCAgICAgICAgICAgICAgICAgICAgY2FsY19taWNfdHhfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBwLCBpbnQgbGVuICk7CkhDRl9TVEFUSUMgaW50ICAgICAgICAgIGNoZWNrX21pYyggSUZCUCBpZmJwICk7CiNlbmRpZiAvLyBIQ0ZfVFlQRV9XUEEKCkhDRl9TVEFUSUMgdm9pZCAgICAgICAgIGNhbGlicmF0ZSggSUZCUCBpZmJwICk7CkhDRl9TVEFUSUMgaW50ICAgICAgICAgIGNtZF9jbXBsKCBJRkJQIGlmYnAgKTsKSENGX1NUQVRJQyBoY2ZfMTYgICAgICAgZ2V0X2ZpZCggSUZCUCBpZmJwICk7CkhDRl9TVEFUSUMgdm9pZCAgICAgICAgIGlzcl9pbmZvKCBJRkJQIGlmYnAgKTsKI2lmIEhDRl9ETUEKSENGX1NUQVRJQyBERVNDX1NUUkNUKiAgZ2V0X2ZyYW1lX2xzdChJRkJQIGlmYnAsIGludCB0eF9yeF9mbGFnKTsKI2VuZGlmIC8vIEhDRl9ETUEKSENGX1NUQVRJQyB2b2lkICAgICAgICAgZ2V0X2ZyYWcoIElGQlAgaWZicCwgd2NpX2J1ZnAgYnVmcCwgaW50IGxlbiBCRV9QQVIoIGludCB3b3JkX2xlbiApICk7ICAgLy9jaGFyKiwgYnl0ZSBjb3VudCAodXN1YWxseSBldmVuKQojaWYgSENGX0RNQQpIQ0ZfU1RBVElDIHZvaWQgICAgICAgICBwdXRfZnJhbWVfbHN0KCBJRkJQIGlmYnAsIERFU0NfU1RSQ1QgKmRlc2NwLCBpbnQgdHhfcnhfZmxhZyApOwojZW5kaWYgLy8gSENGX0RNQQpIQ0ZfU1RBVElDIHZvaWQgICAgICAgICBwdXRfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBidWZwLCBpbnQgbGVuIEJFX1BBUiggaW50IHdvcmRfbGVuICkgKTsKSENGX1NUQVRJQyB2b2lkICAgICAgICAgcHV0X2ZyYWdfZmluYWxpemUoIElGQlAgaWZicCApOwpIQ0ZfU1RBVElDIGludCAgICAgICAgICBzZXR1cF9iYXAoIElGQlAgaWZicCwgaGNmXzE2IGZpZCwgaW50IG9mZnNldCwgaW50IHR5cGUgKTsKI2lmIChIQ0ZfQVNTRVJUKSAmIEhDRl9BU1NFUlRfUFJJTlRGCnN0YXRpYyBpbnQgZndfcHJpbnRmKElGQlAgaWZicCwgQ0ZHX0ZXX1BSSU5URl9TVFJDVCBGQVIgKmx0dnApOwojZW5kaWYgLy8gSENGX0FTU0VSVF9QUklOVEYKCkhDRl9TVEFUSUMgaW50ICAgICAgICAgIGRvd25sb2FkKCBJRkJQIGlmYnAsIENGR19QUk9HX1NUUkNUIEZBUiAqbHR2cCApOwpIQ0ZfU1RBVElDIGhjZl84ICAgICAgICBoY2ZfZW5jYXAoIHdjaV9idWZwIHR5cGUgKTsKSENGX1NUQVRJQyBoY2ZfOCAgICAgICAgbnVsbF9hZGRyWzRdID0geyAwLCAwLCAwLCAwIH07CiNpZiAhIGRlZmluZWQgSU5fUE9SVF9XT1JEICAgICAgICAgIC8vcmVwbGFjZSBJL08gTWFjcm9zIHdpdGggbG9nZ2luZyBmYWNpbGl0eQpleHRlcm4gRklMRSAqbG9nX2ZpbGU7CgojZGVmaW5lIElOX1BPUlRfV09SRChwb3J0KSAgICAgICAgICBpbl9wb3J0X3dvcmQoIChoY2ZfaW8pKHBvcnQpICkKCnN0YXRpYyBoY2ZfMTYgaW5fcG9ydF93b3JkKCBoY2ZfaW8gcG9ydCApIHsKCWhjZl8xNiBpID0gKGhjZl8xNilfaW5wdyggcG9ydCApOwoJaWYgKCBsb2dfZmlsZSApIHsKCQlmcHJpbnRmKCBsb2dfZmlsZSwgIlxuUiAlMi4yeCAlNC40eCIsIChwb3J0KSYweEZGLCBpKTsKCX0KCXJldHVybiBpOwp9IC8vIGluX3BvcnRfd29yZAoKI2RlZmluZSBPVVRfUE9SVF9XT1JEKHBvcnQsIHZhbHVlKSAgb3V0X3BvcnRfd29yZCggKGhjZl9pbykocG9ydCksIChoY2ZfMTYpKHZhbHVlKSApCgpzdGF0aWMgdm9pZCBvdXRfcG9ydF93b3JkKCBoY2ZfaW8gcG9ydCwgaGNmXzE2IHZhbHVlICkgewoJX291dHB3KCBwb3J0LCB2YWx1ZSApOwoJaWYgKCBsb2dfZmlsZSApIHsKCQlmcHJpbnRmKCBsb2dfZmlsZSwgIlxuVyAlMi4wMnggJTQuMDR4IiwgKHBvcnQpJjB4RkYsIHZhbHVlICk7Cgl9Cn0KCnZvaWQgSU5fUE9SVF9TVFJJTkdfMzIoIGhjZl9pbyBwcnQsIGhjZl8zMiBGQVIgKiBkc3QsIGludCBuKSAgICB7CglpbnQgaSA9IDA7CgloY2ZfMTYgRkFSICogcDsKCWlmICggbG9nX2ZpbGUgKSB7CgkJZnByaW50ZiggbG9nX2ZpbGUsICJcbnJlYWQgc3RyaW5nXzMyIGxlbmd0aCAlMDR4ICglMDRkKSBhdCBwb3J0ICUwMi4yeCB0byBhZGRyICVscCIsCgkJCSAoaGNmXzE2KW4sIChoY2ZfMTYpbiwgKGhjZl8xNikocHJ0KSYweEZGLCBkc3QpOwoJfQoJd2hpbGUgKCBuLS0gKSB7CgkJcCA9IChoY2ZfMTYgRkFSICopZHN0OwoJCSpwKysgPSAoaGNmXzE2KV9pbnB3KCBwcnQgKTsKCQkqcCAgID0gKGhjZl8xNilfaW5wdyggcHJ0ICk7CgkJaWYgKCBsb2dfZmlsZSApIHsKCQkJZnByaW50ZiggbG9nX2ZpbGUsICIlcyUwOGx4ICIsIGkrKyAlIDB4MDggPyAiICIgOiAiXG4iLCAqZHN0KTsKCQl9CgkJZHN0Kys7Cgl9Cn0gLy8gSU5fUE9SVF9TVFJJTkdfMzIKCnZvaWQgSU5fUE9SVF9TVFJJTkdfOF8xNiggaGNmX2lvIHBydCwgaGNmXzggRkFSICogZHN0LCBpbnQgbikgeyAvL2Fsc28gaGFuZGxlcyBieXRlIGFsaWdubWVudCBwcm9ibGVtcwoJaGNmXzE2IEZBUiAqIHAgPSAoaGNmXzE2IEZBUiAqKWRzdDsgICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzIG5lZWRzIG1vcmUgZWxhYm9yYXRlIGNvZGUgaW4gbm9uLXg4NiBwbGF0Zm9ybXMKCWludCBpID0gMDsKCWlmICggbG9nX2ZpbGUgKSB7CgkJZnByaW50ZiggbG9nX2ZpbGUsICJcbnJlYWQgc3RyaW5nXzE2IGxlbmd0aCAlMDR4ICglMDRkKSBhdCBwb3J0ICUwMi4yeCB0byBhZGRyICVscCIsCgkJCSAoaGNmXzE2KW4sIChoY2ZfMTYpbiwgKGhjZl8xNikocHJ0KSYweEZGLCBkc3QgKTsKCX0KCXdoaWxlICggbi0tICkgewoJCSpwID0oaGNmXzE2KV9pbnB3KCBwcnQpOwoJCWlmICggbG9nX2ZpbGUgKSB7CgkJCWlmICggaSsrICUgMHgxMCApIHsKCQkJCWZwcmludGYoIGxvZ19maWxlLCAiJTA0eCAiLCAqcCk7CgkJCX0gZWxzZSB7CgkJCQlmcHJpbnRmKCBsb2dfZmlsZSwgIlxuJTA0eCAiLCAqcCk7CgkJCX0KCQl9CgkJcCsrOwoJfQp9IC8vIElOX1BPUlRfU1RSSU5HXzhfMTYKCnZvaWQgT1VUX1BPUlRfU1RSSU5HXzMyKCBoY2ZfaW8gcHJ0LCBoY2ZfMzIgRkFSICogc3JjLCBpbnQgbikgICB7CglpbnQgaSA9IDA7CgloY2ZfMTYgRkFSICogcDsKCWlmICggbG9nX2ZpbGUgKSB7CgkJZnByaW50ZiggbG9nX2ZpbGUsICJcbndyaXRlIHN0cmluZ18zMiBsZW5ndGggJTA0eCAoJTA0ZCkgYXQgcG9ydCAlMDIuMngiLAoJCQkgKGhjZl8xNiluLCAoaGNmXzE2KW4sIChoY2ZfMTYpKHBydCkmMHhGRik7Cgl9Cgl3aGlsZSAoIG4tLSApIHsKCQlwID0gKGhjZl8xNiBGQVIgKilzcmM7CgkJX291dHB3KCBwcnQsICpwKysgKTsKCQlfb3V0cHcoIHBydCwgKnAgICApOwoJCWlmICggbG9nX2ZpbGUgKSB7CgkJCWZwcmludGYoIGxvZ19maWxlLCAiJXMlMDhseCAiLCBpKysgJSAweDA4ID8gIiAiIDogIlxuIiwgKnNyYyk7CgkJfQoJCXNyYysrOwoJfQp9IC8vIE9VVF9QT1JUX1NUUklOR18zMgoKdm9pZCBPVVRfUE9SVF9TVFJJTkdfOF8xNiggaGNmX2lvIHBydCwgaGNmXzggRkFSICogc3JjLCBpbnQgbikgIHsgICAvL2Fsc28gaGFuZGxlcyBieXRlIGFsaWdubWVudCBwcm9ibGVtcwoJaGNmXzE2IEZBUiAqIHAgPSAoaGNmXzE2IEZBUiAqKXNyYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhpcyBuZWVkcyBtb3JlIGVsYWJvcmF0ZSBjb2RlIGluIG5vbi14ODYgcGxhdGZvcm1zCglpbnQgaSA9IDA7CglpZiAoIGxvZ19maWxlICkgewoJCWZwcmludGYoIGxvZ19maWxlLCAiXG53cml0ZSBzdHJpbmdfMTYgbGVuZ3RoICUwNHggKCUwNGQpIGF0IHBvcnQgJTA0eCIsIG4sIG4sIChoY2ZfMTYpcHJ0KTsKCX0KCXdoaWxlICggbi0tICkgewoJCSh2b2lkKV9vdXRwdyggcHJ0LCAqcCk7CgkJaWYgKCBsb2dfZmlsZSApIHsKCQkJaWYgKCBpKysgJSAweDEwICkgewoJCQkJZnByaW50ZiggbG9nX2ZpbGUsICIlMDR4ICIsICpwKTsKCQkJfSBlbHNlIHsKCQkJCWZwcmludGYoIGxvZ19maWxlLCAiXG4lMDR4ICIsICpwKTsKCQkJfQoJCX0KCQlwKys7Cgl9Cn0gLy8gT1VUX1BPUlRfU1RSSU5HXzhfMTYKCiNlbmRpZiAvLyBJTl9QT1JUX1dPUkQKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRCBBIFQgQSAgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpZiBIQ0ZfQVNTRVJUCklGQlAgQkFTRUQgYXNzZXJ0X2lmYnAgPSBOVUxMOyAgICAgICAgICAvL3RvIG1ha2UgYXNzZXJ0cyBlYXNpbHkgd29yayB1bmRlciBNTUQgYW5kIERIRgojZW5kaWYgLy8gSENGX0FTU0VSVAoKLyogU05BUCBoZWFkZXIgdG8gYmUgaW5zZXJ0ZWQgaW4gRXRoZXJuZXQtSUkgZnJhbWVzICovCkhDRl9TVEFUSUMgIGhjZl84IEJBU0VEIHNuYXBfaGVhZGVyW10gPSB7IDB4QUEsIDB4QUEsIDB4MDMsIDB4MDAsIDB4MDAsIC8vNSBieXRlcyBzaWduYXR1cmUgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAvLzEgYnl0ZSBwcm90b2NvbCBpZGVudGlmaWVyCgojaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dQQQpIQ0ZfU1RBVElDIGhjZl84IEJBU0VEIG1pY19wYWRbOF0gPSB7IDB4NUEsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsgICAgICAvL01JQyBwYWRkaW5nIG9mIG1lc3NhZ2UKI2VuZGlmIC8vIEhDRl9UWVBFX1dQQQoKI2lmIGRlZmluZWQgTVNGX0NPTVBPTkVOVF9JRApDRkdfSURFTlRJVFlfU1RSQ1QgQkFTRUQgY2ZnX2Rydl9pZGVudGl0eSA9IHsKCXNpemVvZihjZmdfZHJ2X2lkZW50aXR5KS9zaXplb2YoaGNmXzE2KSAtIDEsICAgIC8vbGVuZ3RoIG9mIFJJRAoJQ0ZHX0RSVl9JREVOVElUWSwgICAgICAgICAgIC8vICgweDA4MjYpCglNU0ZfQ09NUE9ORU5UX0lELAoJTVNGX0NPTVBPTkVOVF9WQVIsCglNU0ZfQ09NUE9ORU5UX01BSk9SX1ZFUiwKCU1TRl9DT01QT05FTlRfTUlOT1JfVkVSCn0gOwoKQ0ZHX1JBTkdFU19TVFJDVCBCQVNFRCBjZmdfZHJ2X3N1cF9yYW5nZSA9IHsKCXNpemVvZihjZmdfZHJ2X3N1cF9yYW5nZSkvc2l6ZW9mKGhjZl8xNikgLSAxLCAgIC8vbGVuZ3RoIG9mIFJJRAoJQ0ZHX0RSVl9TVVBfUkFOR0UsICAgICAgICAgIC8vICgweDA4MjcpCgoJQ09NUF9ST0xFX1NVUEwsCglDT01QX0lEX0RVSSwKCXt7ICBEVUlfQ09NUEFUX1ZBUiwKCSAgICBEVUlfQ09NUEFUX0JPVCwKCSAgICBEVUlfQ09NUEFUX1RPUAoJfX0KfSA7CgpzdHJ1Y3QgQ0ZHX1JBTkdFM19TVFJDVCBCQVNFRCBjZmdfZHJ2X2FjdF9yYW5nZXNfcHJpID0gewoJc2l6ZW9mKGNmZ19kcnZfYWN0X3Jhbmdlc19wcmkpL3NpemVvZihoY2ZfMTYpIC0gMSwgIC8vbGVuZ3RoIG9mIFJJRAoJQ0ZHX0RSVl9BQ1RfUkFOR0VTX1BSSSwgICAgIC8vICgweDA4MjgpCgoJQ09NUF9ST0xFX0FDVCwKCUNPTVBfSURfUFJJLAoJewoJCXsgMCwgMCwgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhDRl9QUklfVkFSXzEgbm90IHN1cHBvcnRlZCBieSBIQ0YgNwoJCXsgMCwgMCwgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhDRl9QUklfVkFSXzIgbm90IHN1cHBvcnRlZCBieSBIQ0YgNwoJCXsgIDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX3JlY1syXSAtIFZhcmlhbnQgbnVtYmVyCgkJICAgQ0ZHX0RSVl9BQ1RfUkFOR0VTX1BSSV8zX0JPVFRPTSwgICAgICAgIC8vICAgICAgIC0gQm90dG9tIENvbXBhdGliaWxpdHkKCQkgICBDRkdfRFJWX0FDVF9SQU5HRVNfUFJJXzNfVE9QICAgICAgICAgICAgLy8gICAgICAgLSBUb3AgQ29tcGF0aWJpbGl0eQoJCX0KCX0KfSA7CgoKc3RydWN0IENGR19SQU5HRTRfU1RSQ1QgQkFTRUQgY2ZnX2Rydl9hY3RfcmFuZ2VzX3N0YSA9IHsKCXNpemVvZihjZmdfZHJ2X2FjdF9yYW5nZXNfc3RhKS9zaXplb2YoaGNmXzE2KSAtIDEsICAvL2xlbmd0aCBvZiBSSUQKCUNGR19EUlZfQUNUX1JBTkdFU19TVEEsICAgICAvLyAoMHgwODI5KQoKCUNPTVBfUk9MRV9BQ1QsCglDT01QX0lEX1NUQSwKCXsKI2lmIGRlZmluZWQgSENGX1NUQV9WQVJfMQoJCXsgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX3JlY1sxXSAtIFZhcmlhbnQgbnVtYmVyCgkJICAgQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV8xX0JPVFRPTSwgICAgICAgIC8vICAgICAgIC0gQm90dG9tIENvbXBhdGliaWxpdHkKCQkgICBDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzFfVE9QICAgICAgICAgICAgLy8gICAgICAgLSBUb3AgQ29tcGF0aWJpbGl0eQoJCX0sCiNlbHNlCgkJeyAwLCAwLCAwIH0sCiNlbmRpZiAvLyBIQ0ZfU1RBX1ZBUl8xCiNpZiBkZWZpbmVkIEhDRl9TVEFfVkFSXzIKCQl7ICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9yZWNbMV0gLSBWYXJpYW50IG51bWJlcgoJCSAgIENGR19EUlZfQUNUX1JBTkdFU19TVEFfMl9CT1RUT00sICAgICAgICAvLyAgICAgICAtIEJvdHRvbSBDb21wYXRpYmlsaXR5CgkJICAgQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV8yX1RPUCAgICAgICAgICAgIC8vICAgICAgIC0gVG9wIENvbXBhdGliaWxpdHkKCQl9LAojZWxzZQoJCXsgMCwgMCwgMCB9LAojZW5kaWYgLy8gSENGX1NUQV9WQVJfMgovLyBGb3IgTmF0aXZlX1VTQiAoTm90IHVzZWQhKQojaWYgZGVmaW5lZCBIQ0ZfU1RBX1ZBUl8zCgkJeyAgMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy92YXJfcmVjWzFdIC0gVmFyaWFudCBudW1iZXIKCQkgICBDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzNfQk9UVE9NLCAgICAgICAgLy8gICAgICAgLSBCb3R0b20gQ29tcGF0aWJpbGl0eQoJCSAgIENGR19EUlZfQUNUX1JBTkdFU19TVEFfM19UT1AgICAgICAgICAgICAvLyAgICAgICAtIFRvcCBDb21wYXRpYmlsaXR5CgkJfSwKI2Vsc2UKCQl7IDAsIDAsIDAgfSwKI2VuZGlmIC8vIEhDRl9TVEFfVkFSXzMKLy8gV2FycAojaWYgZGVmaW5lZCBIQ0ZfU1RBX1ZBUl80CgkJeyAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy92YXJfcmVjWzFdIC0gVmFyaWFudCBudW1iZXIKCQkgICBDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzRfQk9UVE9NLCAgICAgICAgLy8gICAgICAgICAgIC0gQm90dG9tIENvbXBhdGliaWxpdHkKCQkgICBDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzRfVE9QICAgICAgICAgICAgLy8gICAgICAgICAgIC0gVG9wIENvbXBhdGliaWxpdHkKCQl9CiNlbHNlCgkJeyAwLCAwLCAwIH0KI2VuZGlmIC8vIEhDRl9TVEFfVkFSXzQKCX0KfSA7CgoKc3RydWN0IENGR19SQU5HRTZfU1RSQ1QgQkFTRUQgY2ZnX2Rydl9hY3RfcmFuZ2VzX2hzaSA9IHsKCXNpemVvZihjZmdfZHJ2X2FjdF9yYW5nZXNfaHNpKS9zaXplb2YoaGNmXzE2KSAtIDEsICAvL2xlbmd0aCBvZiBSSUQKCUNGR19EUlZfQUNUX1JBTkdFU19IU0ksICAgICAvLyAoMHgwODJBKQoJQ09NUF9ST0xFX0FDVCwKCUNPTVBfSURfSFNJLAoJewojaWYgZGVmaW5lZCBIQ0ZfSFNJX1ZBUl8wICAgICAgICAgICAgICAgICAgIC8vIENvbnRyb2xsZWQgZGVwbG95bWVudAoJCXsgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhcl9yZWNbMV0gLSBWYXJpYW50IG51bWJlcgoJCSAgIENGR19EUlZfQUNUX1JBTkdFU19IU0lfMF9CT1RUT00sICAgICAgICAvLyAgICAgICAgICAgLSBCb3R0b20gQ29tcGF0aWJpbGl0eQoJCSAgIENGR19EUlZfQUNUX1JBTkdFU19IU0lfMF9UT1AgICAgICAgICAgICAvLyAgICAgICAgICAgLSBUb3AgQ29tcGF0aWJpbGl0eQoJCX0sCiNlbHNlCgkJeyAwLCAwLCAwIH0sCiNlbmRpZiAvLyBIQ0ZfSFNJX1ZBUl8wCgkJeyAwLCAwLCAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSENGX0hTSV9WQVJfMSBub3Qgc3VwcG9ydGVkIGJ5IEhDRiA3CgkJeyAwLCAwLCAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSENGX0hTSV9WQVJfMiBub3Qgc3VwcG9ydGVkIGJ5IEhDRiA3CgkJeyAwLCAwLCAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSENGX0hTSV9WQVJfMyBub3Qgc3VwcG9ydGVkIGJ5IEhDRiA3CiNpZiBkZWZpbmVkIEhDRl9IU0lfVkFSXzQgICAgICAgICAgICAgICAgICAgLy8gSGVybWVzLUlJIGFsbCB0eXBlcwoJCXsgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhcl9yZWNbMV0gLSBWYXJpYW50IG51bWJlcgoJCSAgIENGR19EUlZfQUNUX1JBTkdFU19IU0lfNF9CT1RUT00sICAgICAgICAvLyAgICAgICAgICAgLSBCb3R0b20gQ29tcGF0aWJpbGl0eQoJCSAgIENGR19EUlZfQUNUX1JBTkdFU19IU0lfNF9UT1AgICAgICAgICAgICAvLyAgICAgICAgICAgLSBUb3AgQ29tcGF0aWJpbGl0eQoJCX0sCiNlbHNlCgkJeyAwLCAwLCAwIH0sCiNlbmRpZiAvLyBIQ0ZfSFNJX1ZBUl80CiNpZiBkZWZpbmVkIEhDRl9IU0lfVkFSXzUgICAgICAgICAgICAgICAgICAgLy8gV0FSUCBIZXJtZXMtMi41CgkJeyAgNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFyX3JlY1sxXSAtIFZhcmlhbnQgbnVtYmVyCgkJICAgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV81X0JPVFRPTSwgICAgICAgIC8vICAgICAgICAgICAtIEJvdHRvbSBDb21wYXRpYmlsaXR5CgkJICAgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV81X1RPUCAgICAgICAgICAgIC8vICAgICAgICAgICAtIFRvcCBDb21wYXRpYmlsaXR5CgkJfQojZWxzZQoJCXsgMCwgMCwgMCB9CiNlbmRpZiAvLyBIQ0ZfSFNJX1ZBUl81Cgl9Cn0gOwoKCkNGR19SQU5HRTRfU1RSQ1QgQkFTRUQgY2ZnX2Rydl9hY3RfcmFuZ2VzX2FwZiA9IHsKCXNpemVvZihjZmdfZHJ2X2FjdF9yYW5nZXNfYXBmKS9zaXplb2YoaGNmXzE2KSAtIDEsICAvL2xlbmd0aCBvZiBSSUQKCUNGR19EUlZfQUNUX1JBTkdFU19BUEYsICAgICAvLyAoMHgwODJCKQoKCUNPTVBfUk9MRV9BQ1QsCglDT01QX0lEX0FQRiwKCXsKI2lmIGRlZmluZWQgSENGX0FQRl9WQVJfMSAgICAgICAgICAgICAgIC8vKEZha2UpIEhlcm1lcy1JCgkJeyAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy92YXJfcmVjWzFdIC0gVmFyaWFudCBudW1iZXIKCQkgICBDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzFfQk9UVE9NLCAgICAgICAgLy8gICAgICAgICAgIC0gQm90dG9tIENvbXBhdGliaWxpdHkKCQkgICBDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzFfVE9QICAgICAgICAgICAgLy8gICAgICAgICAgIC0gVG9wIENvbXBhdGliaWxpdHkKCQl9LAojZWxzZQoJCXsgMCwgMCwgMCB9LAojZW5kaWYgLy8gSENGX0FQRl9WQVJfMQojaWYgZGVmaW5lZCBIQ0ZfQVBGX1ZBUl8yICAgICAgICAgICAgICAgLy9IZXJtZXMtSUkKCQl7ICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2YXJfcmVjWzFdIC0gVmFyaWFudCBudW1iZXIKCQkgICBDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzJfQk9UVE9NLCAgICAgICAgLy8gICAgICAgICAgIC0gQm90dG9tIENvbXBhdGliaWxpdHkKCQkgICBDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzJfVE9QICAgICAgICAgICAgLy8gICAgICAgICAgIC0gVG9wIENvbXBhdGliaWxpdHkKCQl9LAojZWxzZQoJCXsgMCwgMCwgMCB9LAojZW5kaWYgLy8gSENGX0FQRl9WQVJfMgojaWYgZGVmaW5lZCBIQ0ZfQVBGX1ZBUl8zICAgICAgICAgICAgICAgICAgICAgICAvLyBOYXRpdmVfVVNCCgkJeyAgMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhcl9yZWNbMV0gLSBWYXJpYW50IG51bWJlcgoJCSAgIENGR19EUlZfQUNUX1JBTkdFU19BUEZfM19CT1RUT00sICAgICAgICAvLyAgICAgICAgICAgLSBCb3R0b20gQ29tcGF0aWJpbGl0eSAhISEhIXNlZSBub3RlIGJlbG93ISEhISEhIQoJCSAgIENGR19EUlZfQUNUX1JBTkdFU19BUEZfM19UT1AgICAgICAgICAgICAvLyAgICAgICAgICAgLSBUb3AgQ29tcGF0aWJpbGl0eQoJCX0sCiNlbHNlCgkJeyAwLCAwLCAwIH0sCiNlbmRpZiAvLyBIQ0ZfQVBGX1ZBUl8zCiNpZiBkZWZpbmVkIEhDRl9BUEZfVkFSXzQgICAgICAgICAgICAgICAgICAgICAgIC8vIFdBUlAgSGVybWVzIDIuNQoJCXsgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2YXJfcmVjWzFdIC0gVmFyaWFudCBudW1iZXIKCQkgICBDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzRfQk9UVE9NLCAgICAgICAgLy8gICAgICAgICAgIC0gQm90dG9tIENvbXBhdGliaWxpdHkgISEhISFzZWUgbm90ZSBiZWxvdyEhISEhISEKCQkgICBDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzRfVE9QICAgICAgICAgICAgLy8gICAgICAgICAgIC0gVG9wIENvbXBhdGliaWxpdHkKCQl9CiNlbHNlCgkJeyAwLCAwLCAwIH0KI2VuZGlmIC8vIEhDRl9BUEZfVkFSXzQKCX0KfSA7CiNkZWZpbmUgSENGX1ZFUlNJT04gIFRFWFQoICJIQ0YkUmV2aXNpb246IDEuMTAgJCIgKQoKc3RhdGljIHN0cnVjdCAvKkNGR19IQ0ZfT1BUX1NUUkNUKi8gewoJaGNmXzE2ICBsZW47ICAgICAgICAgICAgICAgICAgICAvL2xlbmd0aCBvZiBjZmdfaGNmX29wdCBzdHJ1Y3QKCWhjZl8xNiAgdHlwOyAgICAgICAgICAgICAgICAgICAgLy90eXBlIDB4MDgyQwoJaGNmXzE2ICAgdjA7ICAgICAgICAgICAgICAgICAgICAgICAgLy9vZmZzZXQgSENGX1ZFUlNJT04KCWhjZl8xNiAgIHYxOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1TRl9DT01QT05FTlRfSUQKCWhjZl8xNiAgIHYyOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhDRl9BTElHTgoJaGNmXzE2ICAgdjM7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gSENGX0FTU0VSVAoJaGNmXzE2ICAgdjQ7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gSENGX0JJR19FTkRJQU4KCWhjZl8xNiAgIHY1OyAgICAgICAgICAgICAgICAgICAgICAgIC8vIC8qIEhDRl9ETFYgfCBIQ0ZfRExOViAqLwoJaGNmXzE2ICAgdjY7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gSENGX0RNQQoJaGNmXzE2ICAgdjc7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gSENGX0VOQ0FQCgloY2ZfMTYgICB2ODsgICAgICAgICAgICAgICAgICAgICAgICAvLyBIQ0ZfRVhUCgloY2ZfMTYgICB2OTsgICAgICAgICAgICAgICAgICAgICAgICAvLyBIQ0ZfSU5UX09OCgloY2ZfMTYgIHYxMDsgICAgICAgICAgICAgICAgICAgICAgICAvLyBIQ0ZfSU8KCWhjZl8xNiAgdjExOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhDRl9MRUdBQ1kKCWhjZl8xNiAgdjEyOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhDRl9NQVhfTFRWCgloY2ZfMTYgIHYxMzsgICAgICAgICAgICAgICAgICAgICAgICAvLyBIQ0ZfUFJPVF9USU1FCgloY2ZfMTYgIHYxNDsgICAgICAgICAgICAgICAgICAgICAgICAvLyBIQ0ZfU0xFRVAKCWhjZl8xNiAgdjE1OyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhDRl9UQUxMSUVTCgloY2ZfMTYgIHYxNjsgICAgICAgICAgICAgICAgICAgICAgICAvLyBIQ0ZfVFlQRQoJaGNmXzE2ICB2MTc7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gSENGX05JQ19UQUxfQ05UCgloY2ZfMTYgIHYxODsgICAgICAgICAgICAgICAgICAgICAgICAvLyBIQ0ZfSENGX1RBTF9DTlQKCWhjZl8xNiAgdjE5OyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCB0YWxsaWVzCgljaGFyICAgIHZhbFtzaXplb2YoSENGX1ZFUlNJT04pXTsKfSBCQVNFRCBjZmdfaGNmX29wdCA9IHsKCXNpemVvZihjZmdfaGNmX29wdCkvc2l6ZW9mKGhjZl8xNikgLTEsCglDRkdfSENGX09QVCwgICAgICAgICAgICAgICAgLy8gKDB4MDgyQykKCSggc2l6ZW9mKGNmZ19oY2Zfb3B0KSAtIHNpemVvZihIQ0ZfVkVSU0lPTikgLSA0ICkvc2l6ZW9mKGhjZl8xNiksCiNpZiBkZWZpbmVkIE1TRl9DT01QT05FTlRfSUQKCU1TRl9DT01QT05FTlRfSUQsCiNlbHNlCgkwLAojZW5kaWYgLy8gTVNGX0NPTVBPTkVOVF9JRAoJSENGX0FMSUdOLAoJSENGX0FTU0VSVCwKCUhDRl9CSUdfRU5ESUFOLAoJMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLyogSENGX0RMViB8IEhDRl9ETE5WKi8sCglIQ0ZfRE1BLAoJSENGX0VOQ0FQLAoJSENGX0VYVCwKCUhDRl9JTlRfT04sCglIQ0ZfSU8sCglIQ0ZfTEVHQUNZLAoJSENGX01BWF9MVFYsCglIQ0ZfUFJPVF9USU1FLAoJSENGX1NMRUVQLAoJSENGX1RBTExJRVMsCglIQ0ZfVFlQRSwKI2lmIChIQ0ZfVEFMTElFUykgJiAoIEhDRl9UQUxMSUVTX05JQyB8IEhDRl9UQUxMSUVTX0hDRiApCglIQ0ZfTklDX1RBTF9DTlQsCglIQ0ZfSENGX1RBTF9DTlQsCglvZmZzZXRvZihJRkJfU1RSQ1QsIElGQl9UYWxseUxlbiApLAojZWxzZQoJMCwgMCwgMCwKI2VuZGlmIC8vIEhDRl9UQUxMSUVTX05JQyAvIEhDRl9UQUxMSUVTX0hDRgoJSENGX1ZFUlNJT04KfTsgLy8gY2ZnX2hjZl9vcHQKI2VuZGlmIC8vIE1TRl9DT01QT05FTlRfSUQKCkhDRl9TVEFUSUMgTFRWX1NUUkNUIEJBU0VEIGNmZ19udWxsID0geyAxLCBDRkdfTlVMTCwgezB9IH07CgpIQ0ZfU1RBVElDIGhjZl8xNiogQkFTRUQgeHh4eFsgXSA9IHsKCSZjZmdfbnVsbC5sZW4sICAgICAgICAgICAgICAgICAgICAgICAgICAvL0NGR19OVUxMICAgICAgICAgICAgICAgICAgICAgIDB4MDgyMAojaWYgZGVmaW5lZCBNU0ZfQ09NUE9ORU5UX0lECgkmY2ZnX2Rydl9pZGVudGl0eS5sZW4sICAgICAgICAgICAgICAgICAgLy9DRkdfRFJWX0lERU5USVRZICAgICAgICAgICAgICAweDA4MjYKCSZjZmdfZHJ2X3N1cF9yYW5nZS5sZW4sICAgICAgICAgICAgICAgICAvL0NGR19EUlZfU1VQX1JBTkdFICAgICAgICAgICAgIDB4MDgyNwoJJmNmZ19kcnZfYWN0X3Jhbmdlc19wcmkubGVuLCAgICAgICAgICAgIC8vQ0ZHX0RSVl9BQ1RfUkFOR0VTX1BSSSAgICAgICAgMHgwODI4CgkmY2ZnX2Rydl9hY3RfcmFuZ2VzX3N0YS5sZW4sICAgICAgICAgICAgLy9DRkdfRFJWX0FDVF9SQU5HRVNfU1RBICAgICAgICAweDA4MjkKCSZjZmdfZHJ2X2FjdF9yYW5nZXNfaHNpLmxlbiwgICAgICAgICAgICAvL0NGR19EUlZfQUNUX1JBTkdFU19IU0kgICAgICAgIDB4MDgyQQoJJmNmZ19kcnZfYWN0X3Jhbmdlc19hcGYubGVuLCAgICAgICAgICAgIC8vQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRiAgICAgICAgMHgwODJCCgkmY2ZnX2hjZl9vcHQubGVuLCAgICAgICAgICAgICAgICAgICAgICAgLy9DRkdfSENGX09QVCAgICAgICAgICAgICAgICAgICAweDA4MkMKCU5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0lGQl9QUklJZGVudGl0eSBwbGFjZWhvbGRlciAgIDB4RkQwMgoJTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSUZCX1BSSVN1cCBwbGFjZWhvbGRlciAgICAgICAgMHhGRDAzCiNlbmRpZiAvLyBNU0ZfQ09NUE9ORU5UX0lECglOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9lbmRzZW50aW5lbAp9OwojZGVmaW5lIHh4eHhfUFJJX0lERU5USVRZX09GRlNFVCAgICAoQVJSQVlfU0laRSh4eHh4KSAtIDMpCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioqKioqKioqKioqKioqKioqKioqKioqKiogVCBPIFAgICBMIEUgViBFIEwgICBIIEMgRiAgIFIgTyBVIFQgSSBOIEUgUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKi5NT0RVTEUgICAgICAgIGludCBoY2ZfYWN0aW9uKCBJRkJQIGlmYnAsIGhjZl8xNiBhY3Rpb24gKQogKi5QVVJQT1NFICAgICAgIENoYW5nZXMgdGhlIHJ1bi10aW1lIENhcmQgYmVoYXZpb3IuCiAqICAgICAgICAgICAgICAgUGVyZm9ybXMgTWlzY2VsbGFudW91cyBhY3Rpb25zLgogKgogKi5BUkdVTUVOVFMKICogICBpZmJwICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKICogICBhY3Rpb24gICAgICAgICAgICAgICAgICBudW1iZXIgaWRlbnRpZnlpbmcgdGhlIHR5cGUgb2YgY2hhbmdlCiAqICAgIC0gSENGX0FDVF9JTlRfRk9SQ0VfT04gZW5hYmxlIGludGVycnVwdCBnZW5lcmF0aW9uIGJ5IFdhdmVMQU4gTklDCiAqICAgIC0gSENGX0FDVF9JTlRfT0ZGICAgICAgZGlzYWJsZSBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBieSBXYXZlTEFOIE5JQwogKiAgICAtIEhDRl9BQ1RfSU5UX09OICAgICAgIGNvbXBlbnNhdGUgMSBIQ0ZfQUNUX0lOVF9PRkYsIGVuYWJsZSBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBpZiBiYWxhbmNlIHJlYWNoZWQKICogICAgLSBIQ0ZfQUNUX1BSU19TQ0FOICAgICBIZXJtZXMgUHJvYmUgUmVzcG9ucyBTY2FuIChGMTAyKSBjb21tYW5kCiAqICAgIC0gSENGX0FDVF9SWF9BQ0sgICAgICAgYWNrbm93bGVkZ2Ugbm9uLURNQSByZWNlaXZlciB0byBIZXJtZXMKICogICAgLSBIQ0ZfQUNUX1NDQU4gICAgICAgICBIZXJtZXMgSW5xdWlyZSBTY2FuIChGMTAxKSBjb21tYW5kIChub24tV0FSUCBvbmx5KQogKiAgICAtIEhDRl9BQ1RfU0xFRVAgICAgICAgIEREUyBTbGVlcCByZXF1ZXN0CiAqICAgIC0gSENGX0FDVF9UQUxMSUVTICAgICAgSGVybWVzIElucXVpcmUgVGFsbGllcyAoRjEwMCkgY29tbWFuZAogKgogKi5SRVRVUk5TCiAqICAgSENGX1NVQ0NFU1MgICAgICAgICAgICAgYWxsIChpbmNsdWRpbmcgaW52YWxpZCkKICogICBIQ0ZfSU5UX1BFTkRJTkcgICAgICAgICBIQ0ZfQUNUX0lOVF9PRkYsIGludGVycnVwdCBwZW5kaW5nCiAqICAgSENGX0VSUl9OT19OSUMgICAgICAgICAgSENGX0FDVF9JTlRfT0ZGLCBOSUMgcHJlc2VuY2UgY2hlY2sgZmFpbHMKICoKICouQ09ORElUSU9OUwogKiBFeGNlcHQgZm9yIGhjZl9hY3Rpb24gd2l0aCBIQ0ZfQUNUX0lOVF9GT1JDRV9PTiBvciBIQ0ZfQUNUX0lOVF9PRkYgYXMgcGFyYW1ldGVyIG9yIGhjZl9jb25uZWN0IHdpdGggYW4gSS9PCiAqIGFkZHJlc3MgKGkuZS4gbm90IEhDRl9ESVNDT05ORUNUKSwgYWxsIGhjZi1mdW5jdGlvbiBjYWxscyBNVVNUIGJlIHByZWNlZGVkIGJ5IGEgY2FsbCBvZiBoY2ZfYWN0aW9uIHdpdGgKICogSENGX0FDVF9JTlRfT0ZGIGFzIHBhcmFtZXRlci4KICogTm90ZSB0aGF0IGhjZl9jb25uZWN0IGRlZmF1bHRzIHRvIE5JQyBpbnRlcnJ1cHQgZGlzYWJsZWQgbW9kZSwgaS5lLiBhcyBpZiBoY2ZfYWN0aW9uKCBIQ0ZfQUNUX0lOVF9PRkYgKQogKiB3YXMgY2FsbGVkLgogKgogKi5ERVNDUklQVElPTgogKiBoY2ZfYWN0aW9uIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgbW9kZSBjaGFuZ2luZyBhY3Rpb24tY29kZSBwYWlycyB0aGF0IGFyZSBhbnRvbnltcwogKiAgICAtIEhDRl9BQ1RfSU5UX1tGT1JDRV9dT04gLyBIQ0ZfQUNUX0lOVF9PRkYKICoKICogQWRkaXRpb25hbGx5IGhjZl9hY3Rpb24gY2FuIHN0YXJ0IHRoZSBmb2xsb3dpbmcgYWN0aW9ucyBpbiB0aGUgTklDOgogKiAgICAtIEhDRl9BQ1RfUFJTX1NDQU4KICogICAgLSBIQ0ZfQUNUX1JYX0FDSwogKiAgICAtIEhDRl9BQ1RfU0NBTgogKiAgICAtIEhDRl9BQ1RfU0xFRVAKICogICAgLSBIQ0ZfQUNUX1RBTExJRVMKICoKICogbyBIQ0ZfQUNUX0lOVF9PRkY6IFNldHMgTklDIEludGVycnVwdHMgbW9kZSBEaXNhYmxlZC4KICogVGhpcyBjb21tYW5kLCBhbmQgdGhlIGFzc29jaWF0ZWQgW0ZvcmNlXSBFbmFibGUgTklDIGludGVycnVwdHMgY29tbWFuZCwgYXJlIG9ubHkgYXZhaWxhYmxlIGlmIHRoZSBIQ0ZfSU5UX09OCiAqIGNvbXBpbGUgdGltZSBvcHRpb24gaXMgbm90IHNldCBhdCAweDAwMDAuCiAqCiAqIG8gSENGX0FDVF9JTlRfT046IFNldHMgTklDIEludGVycnVwdHMgbW9kZSBFbmFibGVkLgogKiBFbmFibGUgTklDIEludGVycnVwdHMsIGRlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mIHByZWNlZGluZyBEaXNhYmxlIE5JQyBJbnRlcnJ1cHQgY2FsbHMuCiAqCiAqIG8gSENGX0FDVF9JTlRfRk9SQ0VfT046IEZvcmNlIE5JQyBJbnRlcnJ1cHRzIG1vZGUgRW5hYmxlZC4KICogU2V0cyBOSUMgSW50ZXJydXB0cyBtb2RlIEVuYWJsZWQsIHJlZ2FyZGxlc3Mgb2ZmIHRoZSBudW1iZXIgb2YgcHJlY2VkaW5nIERpc2FibGUgTklDIEludGVycnVwdCBjYWxscy4KICoKICogVGhlIGRpc2FibGluZyBhbmQgZW5hYmxpbmcgb2YgaW50ZXJydXB0cyBhcmUgYW50b255bXMuCiAqIFRoZXNlIGFjdGlvbnMgbXVzdCBiZSBiYWxhbmNlZC4KICogRm9yIGVhY2ggImRpc2FibGUgaW50ZXJydXB0cyIgdGhlcmUgbXVzdCBiZSBhIG1hdGNoaW5nICJlbmFibGUgaW50ZXJydXB0cyIuCiAqIFRoZSBkaXNhYmxlIGludGVycnVwdHMgbWF5IGJlIGV4ZWN1dGVkIG11bHRpcGxlIHRpbWVzIGluIGEgcm93IHdpdGhvdXQgaW50ZXJ2ZW5pbmcgZW5hYmxlIGludGVycnVwdHMsIGluCiAqIG90aGVyIHdvcmRzLCB0aGUgZGlzYWJsZSBpbnRlcnJ1cHRzIG1heSBiZSBuZXN0ZWQuCiAqIFRoZSBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBtZWNoYW5pc20gaXMgZGlzYWJsZWQgYXQgdGhlIGZpcnN0IGNhbGwgd2l0aCBIQ0ZfQUNUX0lOVF9PRkYuCiAqIFRoZSBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBtZWNoYW5pc20gaXMgcmUtZW5hYmxlZCB3aGVuIHRoZSBudW1iZXIgb2YgY2FsbHMgd2l0aCBIQ0ZfQUNUX0lOVF9PTiBtYXRjaGVzIHRoZQogKiBudW1iZXIgb2YgY2FsbHMgd2l0aCBJTlRfT0ZGLgogKgogKiBJdCBpcyBub3QgYWxsb3dlZCB0byBoYXZlIG1vcmUgRW5hYmxlIE5JQyBJbnRlcnJ1cHRzIGNhbGxzIHRoYW4gRGlzYWJsZSBOSUMgSW50ZXJydXB0cyBjYWxscy4KICogVGhlIGludGVycnVwdCBnZW5lcmF0aW9uIG1lY2hhbmlzbSBpcyBpbml0aWFsbHkgKGkuZS4gYWZ0ZXIgaGNmX2Nvbm5lY3QpIGRpc2FibGVkLgogKiBBbiBNU0YgYmFzZWQgb24gYSBpbnRlcnJ1cHQgc3RyYXRlZ3kgbXVzdCBjYWxsIGhjZl9hY3Rpb24gd2l0aCBJTlRfT04gaW4gaXRzIGluaXRpYWxpemF0aW9uIGxvZ2ljLgogKgogKiEgIFRoZSBJTlRfT0ZGL0lOVF9PTiBob3VzZWtlZXBpbmcgaXMgaW5pdGlhbGl6ZWQgYXQgMHgwMDAwIGJ5IGhjZl9jb25uZWN0LCBjYXVzaW5nIHRoZSBpbnRlcnJ1cHQgZ2VuZXJhdGlvbgogKiAgIG1lY2hhbmlzbSB0byBiZSBkaXNhYmxlZCBhdCBmaXJzdC4gVGhpcyBzdWl0cyBNU0YgaW1wbGVtZW50YXRpb24gYmFzZWQgb24gYSBwb2xsaW5nIHN0cmF0ZWd5LgogKgogKiBvIEhDRl9BQ1RfU0xFRVA6IEluaXRpYXRlcyB0aGUgRGlzY29ubmVjdGVkIERlZXBTbGVlcCBwcm9jZXNzCiAqIFRoaXMgY29tbWFuZCBpcyBvbmx5IGF2YWlsYWJsZSBpZiB0aGUgSENGX0REUyBjb21waWxlIHRpbWUgb3B0aW9uIGlzIHNldC4gSXQgdHJpZ2dlcnMgdGhlIEYvVyB0byBzdGFydCB0aGUKICogc2xlZXAgaGFuZHNoYWtpbmcuIFJlZ2FyZGxlc3Mgd2hldGhlciB0aGUgSG9zdCBpbml0aWF0ZXMgYSBEaXNjb25uZWN0ZWQgRGVlcFNsZWVwIChERFMpIG9yIHRoZSBGL1cgaW5pdGlhdGVzCiAqIGEgQ29ubmVjdGVkIERlZXBTbGVlcCAoQ0RTKSwgdGhlIEhvc3QtRi9XIHNsZWVwIGhhbmRzaGFraW5nIGlzIGNvbXBsZXRlZCB3aGVuIHRoZSBOSUMgSW50ZXJydXB0cyBtb2RlIGlzCiAqIGVuYWJsZWQgKGJ5IG1lYW5zIG9mIHRoZSBiYWxhbmNpbmcgSENGX0FDVF9JTlRfT04pLCBpLmUuIGF0IHRoYXQgbW9tZW50IHRoZSBGL1cgcmVhbGx5IGdvZXMgaW50byBzbGVlcCBtb2RlLgogKiBUaGUgRi9XIGlzIHdva2VudXAgYnkgdGhlIEhDRiB3aGVuIHRoZSBOSUMgSW50ZXJydXB0cyBtb2RlIGFyZSBkaXNhYmxlZCwgaS5lLiBhdCB0aGUgZmlyc3QgSENGX0FDVF9JTlRfT0ZGCiAqIGFmdGVyIGdvaW5nIGludG8gc2xlZXAuCiAqCiAqIFRoZSBmb2xsb3dpbmcgTWlzY2VsbGFudW91cyBhY3Rpb25zIGFyZSBkZWZpbmVkOgogKgogKiBvIEhDRl9BQ1RfUlhfQUNLOiBSZWNlaXZlciBBY2tub3dsZWRnZW1lbnQgKG5vbi1ETUEsIG5vbi1VU0IgbW9kZSBvbmx5KQogKiBBY2tpbmcgdGhlIHJlY2VpdmVyLCBmcmVlcyB0aGUgTklDIG1lbW9yeSB1c2VkIHRvIGhvbGQgdGhlIFJ4IGZyYW1lIGFuZCBhbGxvd3MgdGhlIEYvVyB0bwogKiByZXBvcnQgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgbmV4dCBSeCBmcmFtZS4KICogSWYgdGhlIE1TRiBkb2VzIG5vdCBuZWVkIGFjY2VzcyAoYW55IGxvbmdlcikgdG8gdGhlIGN1cnJlbnQgZnJhbWUsIGUuZy4gYmVjYXVzZSBpdCBpcyByZWplY3RlZCBiYXNlZCBvbiB0aGUKICogbG9vayBhaGVhZCBvciBjb3BpZWQgdG8gYW5vdGhlciBidWZmZXIsIHRoZSByZWNlaXZlciBtYXkgYmUgYWNrZWQuIEFja2luZyBlYXJsaWVyIGlzIGFzc3VtZWQgdG8gaGF2ZSB0aGUKICogcG90ZW50aWFsIG9mIGltcHJvdmluZyB0aGUgcGVyZm9ybWFuY2UuCiAqIElmIHRoZSBNU0YgZG9lcyBub3QgZXhwbGl0bHkgYWNrIHRlIHJlY2VpdmVyLCB0aGUgYWNraW5nIGlzIGRvbmUgaW1wbGljaXRseSBpZjoKICogLSB0aGUgcmVjZWl2ZWQgZnJhbWUgZml0cyBpbiB0aGUgbG9vayBhaGVhZCBidWZmZXIsIGJ5IHRoZSBoY2Zfc2VydmljZV9uaWMgY2FsbCB0aGF0IHJlcG9ydGVkIHRoZSBSeCBmcmFtZQogKiAtIGlmIG5vdCBpbiB0aGUgYWJvdmUgc3RlcCwgYnkgaGNmX3Jjdl9tc2cgKGFzc3VtaW5nIGhjZl9yY3ZfbXNnIGlzIGNhbGxlZCkKICogLSBpZiBuZWl0aGVyIG9mIHRoZSBhYm92ZSBpbXBsaWNpdCBhY2tzIG5vciBhbiBleHBsaWNpdCBhY2sgYnkgdGhlIE1TRiwgYnkgdGhlIGZpcnN0IGhjZl9zZXJ2aWNlX25pYyBhZnRlcgogKiAgIHRoZSBoY2Zfc2VydmljZV9uaWMgdGhhdCByZXBvcnRlZCB0aGUgUnggZnJhbWUuCiAqIE5vdGU6IElmIGFuIFJ4IGZyYW1lIGlzIGFscmVhZHkgYWNrZWQsIGFuIGV4cGxpY2l0IEFDSyBieSB0aGUgTVNGIGFjdHMgYXMgYSBOb09wZXJhdGlvbi4KICoKICogbyBIQ0ZfQUNUX1RBTExJRVM6IElucXVpcmUgVGFsbGllcyBjb21tYW5kCiAqIFRoaXMgY29tbWFuZCBpcyBvbmx5IG9wZXJhdGlvbmFsIGlmIHRoZSBGL1cgaXMgZW5hYmxlZC4KICogVGhlIElucXVpcmUgVGFsbGllcyBjb21tYW5kIHJlcXVlc3RzIHRoZSBGL1cgdG8gcHJvdmlkZSBpdHMgY3VycmVudCBzZXQgb2YgdGFsbGllcy4KICogU2VlIGFsc28gaGNmX2dldF9pbmZvIHdpdGggQ0ZHX1RBTExJRVMgYXMgcGFyYW1ldGVyLgogKgogKiBvIEhDRl9BQ1RfUFJTX1NDQU46IElucXVpcmUgUHJvYmUgUmVzcG9ucyBTY2FuIGNvbW1hbmQKICogVGhpcyBjb21tYW5kIGlzIG9ubHkgb3BlcmF0aW9uYWwgaWYgdGhlIEYvVyBpcyBlbmFibGVkLgogKiBUaGUgUHJvYmUgUmVzcG9ucyBTY2FuIGNvbW1hbmQgc3RhcnRzIGEgc2NhbiBzZXF1ZW5jZS4KICogVGhlIEhDRiBwdXRzIHRoZSByZXN1bHQgb2YgdGhpcyBhY3Rpb24gaW4gYW4gTVNGIGRlZmluZWQgYnVmZmVyIChzZWUgQ0ZHX1JJRF9MT0dfU1RSQ1QpLgogKgogKiBvIEhDRl9BQ1RfU0NBTjogSW5xdWlyZSBTY2FuIGNvbW1hbmQKICogVGhpcyBjb21tYW5kIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBISUkgRi9XIChpLmUuIHByZS1XQVJQKSBhbmQgaXQgaXMgb3BlcmF0aW9uYWwgaWYgdGhlIEYvVyBpcyBlbmFibGVkLgogKiBUaGUgSW5xdWlyZSBTY2FuIGNvbW1hbmQgc3RhcnRzIGEgc2NhbiBzZXF1ZW5jZS4KICogVGhlIEhDRiBwdXRzIHRoZSByZXN1bHQgb2YgdGhpcyBhY3Rpb24gaW4gYW4gTVNGIGRlZmluZWQgYnVmZmVyIChzZWUgQ0ZHX1JJRF9MT0dfU1RSQ1QpLgogKgogKiBBc3NlcnQgZmFpbHMgaWYKICogLSBpZmJwIGhhcyBhIHJlY29nbml6YWJsZSBvdXQtb2YtcmFuZ2UgdmFsdWUuCiAqIC0gTklDIGludGVycnVwdHMgYXJlIG5vdCBkaXNhYmxlZCB3aGlsZSByZXF1aXJlZCBieSBwYXJhbWV0ZXIgYWN0aW9uLgogKiAtIGFuIGludmFsaWQgY29kZSBpcyBzcGVjaWZpZWQgaW4gcGFyYW1ldGVyIGFjdGlvbi4KICogLSBIQ0ZfQUNUX0lOVF9PTiBjb21tYW5kcyBvdXRudW1iZXIgdGhlIEhDRl9BQ1RfSU5UX09GRiBjb21tYW5kcy4KICogLSByZWVudHJhbmN5LCBtYXkgYmUgIGNhdXNlZCBieSBjYWxsaW5nIGhjZl9mdW5jdGlvbnMgd2l0aG91dCBhZGVxdWF0ZSBwcm90ZWN0aW9uIGFnYWluc3QgTklDIGludGVycnVwdHMgb3IKICogICBtdWx0aS10aHJlYWRpbmcKICoKICogLSBTaW5jZSB0aGUgSENGIGRvZXMgbm90IG1haW50YWluIHN0YXR1cyBpbmZvcm1hdGlvbiByZWxhdGl2ZSB0byB0aGUgRi9XIGVuYWJsZWQgc3RhdGUsIGl0IGlzIG5vdCBhc3NlcnRlZAogKiAgIHdoZXRoZXIgSENGX0FDVF9TQ0FOLCBIQ0ZfQUNUX1BSU19TQ0FOIG9yIEhDRl9BQ1RfVEFMTElFUyBhcmUgb25seSB1c2VkIHdoaWxlIEYvVyBpcyBlbmFibGVkLgogKgogKi5ESUFHUkFNCiAqIDA6IFRoZSBhc3NlcnQgZW1iZWRkZWQgaW4gSENGTE9HRU5UUlkgY2hlY2tzIGFnYWluc3QgcmUtZW50cmFuY3kuIFJlLWVudHJhbmN5IGNvdWxkIGJlIGNhdXNlZCBieSBhIE1TRiBsb2dpYwogKiAgIGF0IHRhc2stbGV2ZWwgY2FsbGluZyBoY2ZfZnVuY3Rpb25zIHdpdGhvdXQgc2hpZWxkaW5nIHdpdGggSENGX0FDVF9PTi9fT0ZGLiBIb3dldmVyIHRoZSBIQ0ZfQUNUX0lOVF9PRkYKICogICBhY3Rpb24gaXRzZWxmIGNhbiBwZXIgZGVmaW5pdGlvbiBub3QgYmUgcHJvdGVjdGVkIHRoaXMgd2F5LiBCYXNlZCBvbiBjb2RlIGluc3BlY3Rpb24sIGl0IGNhbiBiZSBjb25jbHVkZWQsCiAqICAgdGhhdCB0aGVyZSBpcyBubyByZS1lbnRyYW5jeSBQUk9CTEVNIGluIHRoaXMgcGFydGljdWxhciBmbG93LiBJdCBkb2VzIG5vdCBzZWVtIHdvcnRoIHRoZSB0cm91YmxlIHRvCiAqICAgZXhwbGljaXRseSBjaGVjayBmb3IgdGhpcyBjb25kaXRpb24gKGFsdGhvdWdoIHRoZXJlIHdhcyBhIHJlcG9ydCBvZiBhbiBNU0Ygd2hpY2ggcmFuIGludG8gdGhpcyBhc3NlcnQuCiAqIDI6SUZCX0ludE9mZkNudCBpcyB1c2VkIHRvIGJhbGFuY2UgdGhlIElOVF9PRkYgYW5kIElOVF9PTiBjYWxscy4gIERpc2FibGluZyBvZiB0aGUgaW50ZXJydXB0cyBpcyBhY2hpZXZlZCBieQogKiAgIHdyaXRpbmcgYSB6ZXJvIHRvIHRoZSBIZXJtZXMgSW50RW4gcmVnaXN0ZXIuICBJbiBhIHNoYXJlZCBpbnRlcnJ1cHQgZW52aXJvbm1lbnQgKGUuZy4gdGhlIG1pbmktUENJIE5ESVMKICogICBkcml2ZXIpIGl0IGlzIGNvbnNpZGVyZWQgbW9yZSBjb3JyZWN0IHRvIHJldHVybiB0aGUgc3RhdHVzIEhDRl9JTlRfUEVORElORyBpZiBhbmQgb25seSBpZiwgdGhlIGN1cnJlbnQKICogICBpbnZvY2F0aW9uIG9mIGhjZl9zZXJ2aWNlX25pYyBpcyAoYXBwYXJlbnRseSkgY2FsbGVkIGluIHRoZSBJU1Igd2hlbiB0aGUgSVNSIHdhcyBhY3RpdmF0ZWQgYXMgcmVzdWx0IG9mIGEKICogICBjaGFuZ2UgaW4gSFJFR19FVl9TVEFUIG1hdGNoaW5nIGEgYml0IGluIEhSRUdfSU5UX0VOLCBpLmUuIG5vdCBpZiBpbnZva2VkIGFzIHJlc3VsdCBvZiBhbm90aGVyIGRldmljZQogKiAgIGdlbmVyYXRpbmcgYW4gaW50ZXJydXB0IG9uIHRoZSBzaGFyZWQgaW50ZXJydXB0IGxpbmUuCiAqICAgTm90ZSAxOiBpdCBoYXMgYmVlbiBvYnNlcnZlZCB0aGF0IHVuZGVyIGNlcnRhaW4gYWR2ZXJzZSBjb25kaXRpb25zIG9uIGNlcnRhaW4gcGxhdGZvcm1zIHRoZSB3cml0aW5nIG9mCiAqICAgSFJFR19JTlRfRU4gY2FuIGFwcGFyZW50bHkgZmFpbCwgdGhlcmVmb3IgaXQgaXMgcGFyYW1vdW50IHRoYXQgSFJFR19JTlRfRU4gaXMgd3JpdHRlbiBhZ2FpbiB3aXRoIDAgZm9yCiAqICAgZWFjaCBhbmQgZXZlcnkgY2FsbCB0byBIQ0ZfQUNUX0lOVF9PRkYuCiAqICAgTm90ZSAyOiBpdCBoYXMgYmVlbiBvYnNlcnZlZCB0aGF0IHVuZGVyIGNlcnRhaW4gSC9XICYgUy9XIGFyY2hpdGVjdHVyZXMgdGhpcyBsb2dpYyBpcyBjYWxsZWQgd2hlbiB0aGVyZSBpcwogKiAgIG5vIE5JQyBhdCBhbGwuIFRvIGNhdGVyIGZvciB0aGlzLCB0aGUgdmFsdWUgb2YgSFJFR19JTlRfRU4gaXMgdmFsaWRhdGVkLiBJZiB0aGUgdW51c2VkIGJpdCAweDAxMDAgaXMgc2V0LAogKiAgIGl0IGlzIGFzc3VtZWQgdGhlcmUgaXMgbm8gTklDLgogKiAgIE5vdGUgMzogRHVyaW5nIHRoZSBkb3dubG9hZCBwcm9jZXNzLCBzb21lIHZlcnNpb25zIG9mIHRoZSBGL1cgcmVzZXQgSFJFR19TV18wLCBoZW5jZSBjaGVja2luZyB0aGlzCiAqICAgcmVnaXN0ZXIgZm9yIEhDRl9NQUdJQyAodGhlIGNsYXNzaWNhbCBOSUMgcHJlc2VuY2UgdGVzdCkgd2hlbiBIQ0ZfQUNUX0lOVF9PRkYgaXMgY2FsbGVkIGR1ZSB0byBhbm90aGVyCiAqICAgY2FyZCBpbnRlcnJ1cHRpbmcgdmlhIGEgc2hhcmVkIElSUSBkdXJpbmcgYSBkb3dubG9hZCwgZmFpbHMuCiAqNDogVGhlIGNvbnN0cnVjdGlvbiAiaWYgKCBpZmJwLT5JRkJfSW50T2ZmQ250LS0gPT0gMCApIiBpcyBvcHRpbWFsIChpbiB0aGUgc2Vuc2Ugb2Ygc2hvcnRlc3QvcXVpY2tlc3QKICogICBwYXRoIGluIGVycm9yIGZyZWUgZmxvd3MpIGJ1dCBOT1QgZmFpbCBzYWZlIGluIGNhc2Ugb2YgdG9vIG1hbnkgSU5UX09OIGludm9jYXRpb25zIGNvbXBhcmVkIHRvIElOVF9PRkYpLgogKiAgIEVuYWJsaW5nIG9mIHRoZSBpbnRlcnJ1cHRzIGlzIGFjaGlldmVkIGJ5IHdyaXRpbmcgdGhlIEhlcm1lcyBJbnRFbiByZWdpc3Rlci4KICogICAgLSBJZiB0aGUgSENGIGlzIGluIERlZnVuY3QgbW9kZSwgdGhlIGludGVycnVwdHMgc3RheSBkaXNhYmxlZC4KICogICAgLSBVbmRlciAibm9ybWFsIiBjb25kaXRpb25zLCB0aGUgSENGIGlzIG9ubHkgaW50ZXJlc3RlZCBpbiBJbmZvIEV2ZW50cywgUnggRXZlbnRzIGFuZCBOb3RpZnkgRXZlbnRzLgogKiAgICAtIFdoZW4gdGhlIEhDRiBpcyBvdXQgb2YgVHgvTm90aWZ5IHJlc291cmNlcywgdGhlIEhDRiBpcyBhbHNvIGludGVyZXN0ZWQgaW4gQWxsb2MgRXZlbnRzLgogKiAgICAtIHZpYSBIQ0ZfRVhULCB0aGUgTVNGIHByb2dyYW1tZXIgY2FuIGFsc28gcmVxdWVzdCBIUkVHX0VWX1RJQ0sgYW5kL29yIEhSRUdfRVZfVFhfRVhDIGludGVycnVwdHMuCiAqICAgRm9yIERNQSBvcGVyYXRpb24sIHRoZSBETUEgaGFyZHdhcmUgaGFuZGxlcyB0aGUgYWxsb2MgZXZlbnRzLiBUaGUgRE1BIGVuZ2luZSB3aWxsIGdlbmVyYXRlIGEgJ1R4RG1hRG9uZScKICogICBldmVudCBhcyBzb29uIGFzIGl0IGhhcyBwdW1wZWQgYSBmcmFtZSBmcm9tIGhvc3QgcmFtIGludG8gTklDLVJBTSAobm90ZSB0aGF0IHRoZSBmcmFtZSBkb2VzIG5vdCBoYXZlIHRvIGJlCiAqICAgdHJhbnNtaXR0ZWQgdGhlbiksIGFuZCBhICdSeERtYURvbmUnIGV2ZW50IGFzIHNvb24gYXMgYSByZWNlaXZlZCBmcmFtZSBoYXMgYmVlbiBwdW1wZWQgZnJvbSBOSUMtUkFNIGludG8KICogICBob3N0IHJhbS4gIE5vdGUgdGhhdCB0aGUgJ2FsbG9jJyBldmVudCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIGV2ZW50LW1hc2ssIGJlY2F1c2UgdGhlIERNQSBlbmdpbmUgd2lsbAogKiAgIHJlYWN0IHRvIGFuZCBhY2tub3dsZWRnZSB0aGlzIGV2ZW50LgogKjY6IGFjayB0aGUgIm9sZCIgUngtZXZlbnQuIFNlZSAiUnggQnVmZmVyIGZyZWUgc3RyYXRlZ3kiIGluIGhjZl9zZXJ2aWNlX25pYyBhYm92ZSBmb3IgbW9yZSBleHBsYW5hdGlvbi4KICogICBJRkJfUnhGSUQgYW5kIElGQl9SeExlbiBtdXN0IGJlIGNsZWFyZWQgdG8gYnJpbmcgYm90aCB0aGUgaW50ZXJuYWwgSENGIGhvdXNlIGtlZXBpbmcgYW5kIHRoZSBpbmZvcm1hdGlvbgogKiAgIHN1cHBsaWVkIHRvIHRoZSBNU0YgaW4gdGhlIHN0YXRlICJubyBmcmFtZSByZWNlaXZlZCIuCiAqODogVGhlIEhDRl9BQ1RfU0NBTiwgSENGX0FDVF9QUlNfU0NBTiBhbmQgSENGX0FDVF9UQUxMSUVTIGFjdGl2aXR5IGFyZSBtZXJnZWQgYnkgImNsZXZlciIgYWxnZWJyYWljCiAqICAgbWFuaXB1bGF0aW9ucyBvZiB0aGUgUklELXZhbHVlcyBhbmQgYWN0aW9uIGNvZGVzLCBzbyBmb3JlZ29pbmcgcm9idXN0bmVzcyBhZ2FpbnN0IG1pZ3JhdGlvbiBwcm9ibGVtcyBmb3IKICogICBlYXNlIG9mIGltcGxlbWVudGF0aW9uLiBUaGUgYXNzdW1wdGlvbnMgYWJvdXQgbnVtZXJpY2FsIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBDRkdfVEFMTElFUyBldGMgYW5kCiAqICAgSENGX0FDVF9UQUxMSUVTIGV0YyBhcmUgY2hlY2tlZCBieSB0aGUgIiNpZiIgc3RhdGVtZW50cyBqdXN0IHByaW9yIHRvIHRoZSBib2R5IG9mIHRoaXMgcm91dGluZSwgcmVzdWx0aW5nCiAqICAgaW46IGVyciAibWFpbnRlbmFuY2UiIGR1cmluZyBjb21waWxhdGlvbiBpZiB0aGUgYXNzdW1wdGlvbnMgYXJlIG5vIGxvbmdlciBtZXQuIFRoZSB3cml0aW5nIG9mIEhSRUdfUEFSQU1fMQogKiAgIHdpdGggMHgzRkZGIGluIGNhc2Ugb2YgYW4gUFJTIHNjYW4sIGlzIGEga2x1ZGdlIHRvIGdldCBhcm91bmQgbGFjayBvZiBzcGVjaWZpY2F0aW9uLCBoZW5jZSBkaWZmZXJlbnQKICogICBpbXBsZW1lbnRhdGlvbiBpbiBGL1cgYW5kIEhvc3QuCiAqICAgV2hlbiB0aGVyZSBpcyBubyBOSUMgUkFNIGF2YWlsYWJsZSwgc29tZSB2ZXJzaW9ucyBvZiB0aGUgSGVybWVzIEYvVyBkbyByZXBvcnQgMHg3RjAwIGFzIGVycm9yIGluIHRoZQogKiAgIFJlc3VsdCBmaWVsZCBvZiB0aGUgU3RhdHVzIHJlZ2lzdGVyIGFuZCBzb21lIEYvVyB2ZXJzaW9ucyBkb24ndC4gVG8gbWFzayB0aGlzIGRpZmZlcmVuY2UgdG8gdGhlIE1TRiBhbGwKICogICByZXR1cm4gY29kZXMgb2YgdGhlIEhlcm1lcyBhcmUgaWdub3JlZCAoImJlc3QiIGFuZCAibW9zdCBzaW1wbGUiIHNvbHV0aW9uIHRvIHRoZXNlIHR5cGVzIG9mIGFuYWxvbWllcyB3aXRoCiAqICAgYW4gYWNjZXB0YWJsZSBsb3NzIGR1ZSB0byBpZ25vcmluZyBhbGwgZXJyb3Igc2l0dWF0aW9ucyBhcyB3ZWxsKS4KICogICBUaGUgIk5vIGlucXVpcmUgc3BhY2UiIGlzIHJlcG9ydGVkIHZpYSB0aGUgSGVybWVzIHRhbGxpZXMuCiAqMzA6IGRvIG5vdCBIQ0ZBU1NFUlQoIHJjLCByYyApIHNpbmNlIHJjID09IEhDRl9JTlRfUEVORElORyBpcyBubyBlcnJvcgogKgogKi5FTkRET0MgICAgICAgICAgICAgICAgRU5EIERPQ1VNRU5UQVRJT04KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2lmICggKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0hJSTUgKSA9PSAwCiNpZiBDRkdfU0NBTiAhPSBDRkdfVEFMTElFUyAtIEhDRl9BQ1RfVEFMTElFUyArIEhDRl9BQ1RfU0NBTgplcnI6ICJtYWludGVuYW5jZSIgYXBwYXJlbnRseSBpbnZpb2xhdGVkIHRoZSB1bmRlcmx5aW5nIGFzc3VtcHRpb24gYWJvdXQgdGhlIG51bWVyaWNhbCB2YWx1ZXMgb2YgdGhlc2UgbWFjcm9zCiNlbmRpZgojZW5kaWYgLy8gSENGX1RZUEVfSElJNQojaWYgQ0ZHX1BSU19TQ0FOICE9IENGR19UQUxMSUVTIC0gSENGX0FDVF9UQUxMSUVTICsgSENGX0FDVF9QUlNfU0NBTgplcnI6ICJtYWludGVuYW5jZSIgYXBwYXJlbnRseSBpbnZpb2xhdGVkIHRoZSB1bmRlcmx5aW5nIGFzc3VtcHRpb24gYWJvdXQgdGhlIG51bWVyaWNhbCB2YWx1ZXMgb2YgdGhlc2UgbWFjcm9zCiNlbmRpZgppbnQKaGNmX2FjdGlvbiggSUZCUCBpZmJwLCBoY2ZfMTYgYWN0aW9uICkKewoJaW50IHJjID0gSENGX1NVQ0NFU1M7CgoJSENGQVNTRVJUKCBpZmJwLT5JRkJfTWFnaWMgPT0gSENGX01BR0lDLCBpZmJwLT5JRkJfTWFnaWMgKTsKI2lmIEhDRl9JTlRfT04KCUhDRkxPR0VOVFJZKCBhY3Rpb24gPT0gSENGX0FDVF9JTlRfRk9SQ0VfT04gPyBIQ0ZfVFJBQ0VfQUNUSU9OX0tMVURHRSA6IEhDRl9UUkFDRV9BQ1RJT04sIGFjdGlvbiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAgKi8KI2lmIChIQ0ZfU0xFRVApCglIQ0ZBU1NFUlQoIGlmYnAtPklGQl9JbnRPZmZDbnQgIT0gMHhGRkZFIHx8IGFjdGlvbiA9PSBIQ0ZfQUNUX0lOVF9PRkYsCgkJICAgTUVSR0VfMiggYWN0aW9uLCBpZmJwLT5JRkJfSW50T2ZmQ250ICkgKTsKI2Vsc2UKCUhDRkFTU0VSVCggaWZicC0+SUZCX0ludE9mZkNudCAhPSAweEZGRkUsIGFjdGlvbiApOwojZW5kaWYgLy8gSENGX1NMRUVQCglIQ0ZBU1NFUlQoIGlmYnAtPklGQl9JbnRPZmZDbnQgIT0gMHhGRkZGIHx8CgkJICAgYWN0aW9uID09IEhDRl9BQ1RfSU5UX09GRiB8fCBhY3Rpb24gPT0gSENGX0FDVF9JTlRfRk9SQ0VfT04sICBhY3Rpb24gKTsKCUhDRkFTU0VSVCggaWZicC0+SUZCX0ludE9mZkNudCA8PSAxNiB8fCBpZmJwLT5JRkJfSW50T2ZmQ250ID49IDB4RkZGRSwKCQkgICBNRVJHRV8yKCBhY3Rpb24sIGlmYnAtPklGQl9JbnRPZmZDbnQgKSApOyAvL25lc3RpbmcgbW9yZSB0aGFuIDE2IGRlZXAgc2VlbXMgdW5yZWFzb25hYmxlCiNlbmRpZiAvLyBIQ0ZfSU5UX09OCgoJc3dpdGNoIChhY3Rpb24pIHsKI2lmIEhDRl9JTlRfT04KCQloY2ZfMTYgIGk7CgljYXNlIEhDRl9BQ1RfSU5UX09GRjogICAgICAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIEludGVycnVwdCBnZW5lcmF0aW9uCiNpZiBIQ0ZfU0xFRVAKCQlpZiAoIGlmYnAtPklGQl9JbnRPZmZDbnQgPT0gMHhGRkZFICkgeyAgLy8gV2FrZVVwIHRlc3QgIDs/dGllIHRoaXMgdG8gdGhlICJuZXciIHN1cGVyLUxpbmtTdGF0CgkJCWlmYnAtPklGQl9JbnRPZmZDbnQrKzsgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdG9yZSBjb252ZW50aW9uYWwgSS9GCgkJCU9QVyhIUkVHX0lPLCBIUkVHX0lPX1dBS0VVUF9BU1lOQyApOyAgICAgICAgLy8gc2V0IHdha2V1cCBiaXQKCQkJT1BXKEhSRUdfSU8sIEhSRUdfSU9fV0FLRVVQX0FTWU5DICk7ICAgICAgICAvLyBzZXQgd2FrZXVwIGJpdCB0byBjb3VudGVyYWN0IHRoZSBjbGVhcmluZyBieSBGL1cKCQkJLy8gODAwIHVzIGxhdGVuY3kgYmVmb3JlIEZXIHN3aXRjaGVzIHRvIGhpZ2ggcG93ZXIKCQkJTVNGX1dBSVQoODAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNU0YtZGVmaW5lZCBmdW5jdGlvbiB0byB3YWl0IG4gbWljcm9zZWNvbmRzLgovL09PUgkJCWlmICggaWZicC0+SUZCX0RTTGlua1N0YXQgJiBDRkdfTElOS19TVEFUX0RTX09PUiApIHsgLy8gT3V0T2ZSYW5nZQovLwkJCQlwcmludGsoICI8NT5BQ1RfSU5UX09GRjogRGVlcHNsZWVwIHBoYXNlIHRlcm1pbmF0ZWQsIGVuYWJsZSBhbmQgZ28gdG8gQXdhaXRDb25uZWN0aW9uXG4iICk7ICAgICAvLzs/cmVtb3ZlIG1lIDEgZGF5Ci8vCQkJCWhjZl9jbnRsKCBpZmJwLCBIQ0ZfQ05UTF9FTkFCTEUgKTsKLy8JCQl9Ci8vCQkJaWZicC0+SUZCX0RTTGlua1N0YXQgJj0gfiggQ0ZHX0xJTktfU1RBVF9EU19JUiB8IENGR19MSU5LX1NUQVRfRFNfT09SKTsgLy9jbGVhciBJUi9PT1Igc3RhdGUKCQl9CiNlbmRpZiAvLyBIQ0ZfU0xFRVAKCS8qMiovICAgaWZicC0+SUZCX0ludE9mZkNudCsrOwovLyEJCXJjID0gMDsKCQlpID0gSVBXKCBIUkVHX0lOVF9FTiApOwoJCU9QVyggSFJFR19JTlRfRU4sIDAgKTsKCQlpZiAoIGkgJiAweDEwMDAgKSB7CgkJCXJjID0gSENGX0VSUl9OT19OSUM7CgkJfSBlbHNlIHsKCQkJaWYgKCBpICYgSVBXKCBIUkVHX0VWX1NUQVQgKSApIHsKCQkJCXJjID0gSENGX0lOVF9QRU5ESU5HOwoJCQl9CgkJfQoJCWJyZWFrOwoKCWNhc2UgSENGX0FDVF9JTlRfRk9SQ0VfT046ICAgICAgICAgICAgICAgIC8vIEVuZm9yY2UgRW5hYmxlIEludGVycnVwdCBnZW5lcmF0aW9uCgkJaWZicC0+SUZCX0ludE9mZkNudCA9IDA7CgkJLy9GYWxsIHRocm91Z2ggaW4gSENGX0FDVF9JTlRfT04KCgljYXNlIEhDRl9BQ1RfSU5UX09OOiAgICAgICAgICAgICAgICAgICAgICAvLyBFbmFibGUgSW50ZXJydXB0IGdlbmVyYXRpb24KCS8qNCovICAgaWYgKCBpZmJwLT5JRkJfSW50T2ZmQ250LS0gPT0gMCAmJiBpZmJwLT5JRkJfQ2FyZFN0YXQgPT0gMCApIHsKCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAvL2RldGVybWluZSBJbnRlcnJ1cHQgRXZlbnQgbWFzawojaWYgSENGX0RNQQoJCQlpZiAoIGlmYnAtPklGQl9DbnRsT3B0ICYgVVNFX0RNQSApIHsKCQkJCWkgPSBIUkVHX0VWX0lORk8gfCBIUkVHX0VWX1JETUFEIHwgSFJFR19FVl9URE1BRCB8IEhSRUdfRVZfVFhfRVhUOyAgLy9tYXNrIHdoZW4gRE1BIGFjdGl2ZQoJCQl9IGVsc2UKI2VuZGlmIC8vIEhDRl9ETUEKCQkJewoJCQkJaSA9IEhSRUdfRVZfSU5GTyB8IEhSRUdfRVZfUlggfCBIUkVHX0VWX1RYX0VYVDsgICAgICAgICAgICAgICAgICAgICAvL21hc2sgd2hlbiBETUEgbm90IGFjdGl2ZQoJCQkJaWYgKCBpZmJwLT5JRkJfUnNjSW5kID09IDAgKSB7CgkJCQkJaSB8PSBIUkVHX0VWX0FMTE9DOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9tYXNrIHdoZW4gbm8gVHhGSUQgYXZhaWxhYmxlCgkJCQl9CgkJCX0KI2lmIEhDRl9TTEVFUAoJCQlpZiAoICggSVBXKEhSRUdfRVZfU1RBVCkgJiAoIGkgfCBIUkVHX0VWX1NMRUVQX1JFUSApICkgPT0gSFJFR19FVl9TTEVFUF9SRVEgKSB7CgkJCQkvLyBmaXJtd2FyZSBpbmRpY2F0ZXMgaXQgd291bGQgbGlrZSB0byBnbyBpbnRvIHNsZWVwIG1vZHVzCgkJCQkvLyBvbmx5IGFja25vd2xlZGdlIHRoaXMgcmVxdWVzdCBpZiBubyBvdGhlciBldmVudHMgdGhhdCBjYW4gY2F1c2UgYW4gaW50ZXJydXB0IGFyZSBwZW5kaW5nCgkJCQlpZmJwLT5JRkJfSW50T2ZmQ250LS07ICAgICAgICAgIC8vYmVjb21lcyAweEZGRkUKCQkJCU9QVyggSFJFR19JTlRfRU4sIGkgfCBIUkVHX0VWX1RJQ0sgKTsKCQkJCU9QVyggSFJFR19FVl9BQ0ssIEhSRUdfRVZfU0xFRVBfUkVRIHwgSFJFR19FVl9USUNLIHwgSFJFR19FVl9BQ0tfUkVHX1JFQURZICk7CgkJCX0gZWxzZQojZW5kaWYgLy8gSENGX1NMRUVQCgkJCXsKCQkJCU9QVyggSFJFR19JTlRfRU4sIGkgfCBIUkVHX0VWX1NMRUVQX1JFUSApOwoJCQl9CgkJfQoJCWJyZWFrOwojZW5kaWYgLy8gSENGX0lOVF9PTgoKI2lmIChIQ0ZfU0xFRVApICYgSENGX0REUwoJY2FzZSBIQ0ZfQUNUX1NMRUVQOiAgICAgICAgICAgICAgICAgICAgICAgLy8gRERTIFNsZWVwIHJlcXVlc3QKCQloY2ZfY250bCggaWZicCwgSENGX0NOVExfRElTQUJMRSApOwoJCWNtZF9leGUoIGlmYnAsIEhDTURfU0xFRVAsIDAgKTsKCQlicmVhazsKLy8JY2FzZSBIQ0ZfQUNUX1dBS0VVUDogICAgICAgICAgICAgICAgICAgICAgLy8gRERTIFdha2V1cCByZXF1ZXN0Ci8vCQlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9JbnRPZmZDbnQgPT0gMHhGRkZFLCBpZmJwLT5JRkJfSW50T2ZmQ250ICk7Ci8vCQlpZmJwLT5JRkJfSW50T2ZmQ250Kys7ICAgICAgICAgICAgICAgICAgLy8gcmVzdG9yZSBjb252ZW50aW9uYWwgSS9GCi8vCQlPUFcoIEhSRUdfSU8sIEhSRUdfSU9fV0FLRVVQX0FTWU5DICk7Ci8vCQlNU0ZfV0FJVCg4MDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTVNGLWRlZmluZWQgZnVuY3Rpb24gdG8gd2FpdCBuIG1pY3Jvc2Vjb25kcy4KLy8JCXJjID0gaGNmX2FjdGlvbiggaWZicCwgSENGX0FDVF9JTlRfT0ZGICk7ICAgLypib2d1cywgSUZCX0ludE9mZkNudCA9PSAweEZGRkYsIHNvIGlmIHlvdSBjYXJlZnVsbHkgbG9vawovLwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmF0IHRoZSAjaWYgSENGX0REUyBzdGF0ZW1lbnRzLCBIQ0ZfQUNUX0lOVF9PRkYgaXMgZW1wdHkKLy8JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpmb3IgRERTLiAiTXVjaCIgYmV0dGVyIHdvdWxkIGJlIHRvIG1lcmdlIHRoZSBmbG93cyBmb3IKLy8JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpERFMgYW5kIERFRVBfU0xFRVAKLy8JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8vCQlicmVhazsKI2VuZGlmIC8vIEhDRl9ERFMKCgljYXNlIEhDRl9BQ1RfUlhfQUNLOiAgICAgICAgICAgICAgICAgICAgICAvL1JlY2VpdmVyIEFDSwoJLyo2Ki8gICBpZiAoIGlmYnAtPklGQl9SeEZJRCApIHsKCQkJREFXQV9BQ0soIEhSRUdfRVZfUlggKTsKCQl9CgkJaWZicC0+SUZCX1J4RklEID0gaWZicC0+SUZCX1J4TGVuID0gMDsKCQlicmVhazsKCiAgLyo4Ki8gY2FzZSAgSENGX0FDVF9QUlNfU0NBTjogICAgICAgICAgICAgICAgICAgLy8gSGVybWVzIFBSUyBTY2FuIChGMTAyKQoJCU9QVyggSFJFR19QQVJBTV8xLCAweDNGRkYgKTsKCQkvL0ZhbGwgdGhyb3VnaCBpbiBIQ0ZfQUNUX1RBTExJRVMKCWNhc2UgSENGX0FDVF9UQUxMSUVTOiAgICAgICAgICAgICAgICAgICAgIC8vIEhlcm1lcyBJbnF1aXJlIFRhbGxpZXMgKEYxMDApCiNpZiAoIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9ISUk1ICkgPT0gMAoJY2FzZSBIQ0ZfQUNUX1NDQU46ICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGVybWVzIElucXVpcmUgU2NhbiAoRjEwMSkKI2VuZGlmIC8vIEhDRl9UWVBFX0hJSTUKCQkvKiEhIHRoZSBhc3N1bXB0aW9ucyBhYm91dCBudW1lcmljYWwgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIENGR19UQUxMSUVTIGV0YyBhbmQgSENGX0FDVF9UQUxMSUVTIGV0YwoJCSAqICAgYXJlIGNoZWNrZWQgYnkgI2lmIHN0YXRlbWVudHMganVzdCBwcmlvciB0byB0aGlzIHJvdXRpbmUgcmVzdWx0aW5nIGluOiBlcnIgIm1haW50ZW5hbmNlIiAgICovCgkJY21kX2V4ZSggaWZicCwgSENNRF9JTlFVSVJFLCBhY3Rpb24gLSBIQ0ZfQUNUX1RBTExJRVMgKyBDRkdfVEFMTElFUyApOwoJCWJyZWFrOwoKCWRlZmF1bHQ6CgkJSENGQVNTRVJUKCBET19BU1NFUlQsIGFjdGlvbiApOwoJCWJyZWFrOwoJfQoJLy8hIGRvIG5vdCBIQ0ZBU1NFUlQoIHJjID09IEhDRl9TVUNDRVNTLCByYyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMwKi8KCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9BQ1RJT04gKTsKCXJldHVybiByYzsKfSAvLyBoY2ZfYWN0aW9uCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKi5NT0RVTEUgICAgICAgIGludCBoY2ZfY250bCggSUZCUCBpZmJwLCBoY2ZfMTYgY21kICkKICouUFVSUE9TRSAgICAgICBDb25uZWN0IG9yIGRpc2Nvbm5lY3QgYSBzcGVjaWZpYyBwb3J0IHRvIGEgc3BlY2lmaWMgbmV0d29yay4KICohISAgOz8/Pz8/Pz8/Pz8/Pz8/Pz8gY29udGludWUgbmVlZHMgbW9yZSBleHBsYW5hdGlvbgogKiAgICAgICAgICAgICAgIHJlY292ZXJzIGJ5IG1lYW5zIG9mICJjb250aW51ZSIgd2hlbiB0aGUgY29ubmVjdCBwcm9jZXNzIGluIENDWCBtb2RlIGZhaWxzCiAqICAgICAgICAgICAgICAgRW5hYmxlcyBvciBkaXNhYmxlcyBkYXRhIHRyYW5zbWlzc2lvbiBhbmQgcmVjZXB0aW9uIGZvciB0aGUgTklDLgogKiAgICAgICAgICAgICAgIEFjdGl2YXRlcyBzdGF0aWMgTklDIGNvbmZpZ3VyYXRpb24gZm9yIGEgc3BlY2lmaWMgcG9ydCBhdCBjb25uZWN0LgogKiAgICAgICAgICAgICAgIEFjdGl2YXRlcyBzdGF0aWMgY29uZmlndXJhdGlvbiBmb3IgYWxsIHBvcnRzIGF0IGVuYWJsZS4KICoKICouQVJHVU1FTlRTCiAqICAgaWZicCAgICAgICAgYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCiAqICAgY21kICAgICAgICAgMHgwMDFGOiBIZXJtZXMgY29tbWFuZCAoZGlzYWJsZSwgZW5hYmxlLCBjb25uZWN0LCBkaXNjb25uZWN0LCBjb250aW51ZSkKICogICAgICAgICAgICAgICAgICAgSENGX0NOVExfRU5BQkxFICAgICBFbmFibGUKICogICAgICAgICAgICAgICAgICAgSENGX0NOVExfRElTQUJMRSAgICBEaXNhYmxlCiAqICAgICAgICAgICAgICAgICAgIEhDRl9DTlRMX0NPTlRJTlVFICAgQ29udGludWUKICogICAgICAgICAgICAgICAgICAgSENGX0NOVExfQ09OTkVDVCAgICBDb25uZWN0CiAqICAgICAgICAgICAgICAgICAgIEhDRl9DTlRMX0RJU0NPTk5FQ1QgRGlzY29ubmVjdAogKiAgICAgICAgICAgICAgIDB4MDEwMDogY29tbWFuZCBxdWFsaWZpZXIgKGNvbnRpbnVlKQogKiAgICAgICAgICAgICAgICAgICBIQ01EX1JFVFJZICAgICAgICAgIHJldHJ5IGZsYWcKICogICAgICAgICAgICAgICAweDA3MDA6ICBwb3J0IG51bWJlciAoY29ubmVjdC9kaXNjb25uZWN0KQogKiAgICAgICAgICAgICAgICAgICBIQ0ZfUE9SVF8wICAgICAgICAgIE1BQyBQb3J0IDAKICogICAgICAgICAgICAgICAgICAgSENGX1BPUlRfMSAgICAgICAgICBNQUMgUG9ydCAxCiAqICAgICAgICAgICAgICAgICAgIEhDRl9QT1JUXzIgICAgICAgICAgTUFDIFBvcnQgMgogKiAgICAgICAgICAgICAgICAgICBIQ0ZfUE9SVF8zICAgICAgICAgIE1BQyBQb3J0IDMKICogICAgICAgICAgICAgICAgICAgSENGX1BPUlRfNCAgICAgICAgICBNQUMgUG9ydCA0CiAqICAgICAgICAgICAgICAgICAgIEhDRl9QT1JUXzUgICAgICAgICAgTUFDIFBvcnQgNQogKiAgICAgICAgICAgICAgICAgICBIQ0ZfUE9SVF82ICAgICAgICAgIE1BQyBQb3J0IDYKICoKICouUkVUVVJOUwogKiAgIEhDRl9TVUNDRVNTCiAqISEgdmlhIGNtZF9leGUKICogICBIQ0ZfRVJSX05PX05JQwogKiAgIEhDRl9FUlJfREVGVU5DVF8uLi4KICogICBIQ0ZfRVJSX1RJTUVfT1VUCiAqCiAqLkRFU0NSSVBUSU9OCiAqIFRoZSBwYXJhbWV0ZXIgY21kIGNvbnRhaW5zIGEgbnVtYmVyIG9mIHN1YmZpZWxkcy4KICogVGhlIGFjdHVhbCB2YWx1ZSBmb3IgY21kIGlzIGNyZWF0ZWQgYnkgbG9naWNhbCBvci1pbmcgdGhlIGFwcHJvcHJpYXRlIG1uZW1vbmljcyBmb3IgdGhlIHN1YmZpZWxkcy4KICogVGhlIGZpZWxkIDB4MDAxRiBjb250YWlucyB0aGUgY29tbWFuZCBjb2RlCiAqICAtIEhDRl9DTlRMX0VOQUJMRQogKiAgLSBIQ0ZfQ05UTF9ESVNBQkxFCiAqICAtIEhDRl9DTlRMX0NPTk5FQ1QKICogIC0gSENGX0NOVExfRElTQ09OTkVDVAogKiAgLSBIQ0ZfQ05UTF9DT05USU5VRQogKgogKiBGb3IgSENGX0NOVExfQ09OVElOVUUsIHRoZSBmaWVsZCAweDAxMDAgY29udGFpbnMgdGhlIHJldHJ5IGZsYWcgSENNRF9SRVRSWS4KICogRm9yIEhDRl9DTlRMX0NPTk5FQ1QgYW5kIEhDRl9DTlRMX0RJU0NPTk5FQ1QsIHRoZSBmaWVsZCAweDA3MDAgY29udGFpbnMgdGhlIHBvcnQgbnVtYmVyIGFzIEhDRl9QT1JUXyMuCiAqIEZvciBTdGF0aW9uIGFzIHdlbGwgYXMgQWNjZXNzUG9pbnQgRi9XLCBNQUMgUG9ydCAwIGlzIHRoZSAibm9ybWFsIiBjb21tdW5pY2F0aW9uIGNoYW5uZWwuCiAqIEZvciBBY2Nlc3NQb2ludCBGL1csIE1BQyBQb3J0IDEgdGhyb3VnaCA2IGNvbnRyb2wgdGhlIFdEUyBsaW5rcy4KICoKICogTm90ZSB0aGF0IGRlc3BpdGUgdGhlIG5hbWVzIEhDRl9DTlRMX0RJU0FCTEUgYW5kIEhDRl9DTlRMX0VOQUJMRSwgaGNmX2NudGwgZG9lcyBub3QgaW5mbHVlbmNlIHRoZSBOSUMKICogSW50ZXJydXB0cyBtb2RlLgogKgogKiBUaGUgQ29ubmVjdCBpcyB1c2VkIGJ5IHRoZSBNU0YgdG8gYnJpbmcgYSBwYXJ0aWN1bGFyIHBvcnQgaW4gYW4gaW5hY3RpdmUgc3RhdGUgYXMgZmFyIGFzIGRhdGEgdHJhbnNtaXNzaW9uCiAqIGFuZCByZWNlcHRpb24gYXJlIGNvbmNlcm5lZC4KICogV2hlbiBhIHBhcnRpY3VsYXIgcG9ydCBpcyBkaXNjb25uZWN0ZWQ6CiAqIC0gdGhlIEYvVyBkaXNhYmxlcyB0aGUgcmVjZWl2ZXIgZm9yIHRoYXQgcG9ydC4KICogLSB0aGUgRi9XIGlnbm9yZXMgc2VuZCBjb21tYW5kcyBmb3IgdGhhdCBwb3J0LgogKiAtIGFsbCBmcmFtZXMgKFJlY2VpdmUgYXMgd2VsbCBhcyBwZW5kaW5nIFRyYW5zbWl0KSBmb3IgdGhhdCBwb3J0IG9uIHRoZSBOSUMgYXJlIGRpc2NhcmRlZC4KICoKICogV2hlbiB0aGUgTklDIGlzIGRpc2FibGVkLCBhYm92ZSBsaXN0IGFwcGxpZXMgdG8gYWxsIHBvcnRzLCBpLmUuIHRoZSByZXN1bHQgaXMgbGlrZSBhbGwgcG9ydHMgYXJlCiAqIGRpc2Nvbm5lY3RlZC4KICoKICogV2hlbiBhIHBhcnRpY3VsYXIgcG9ydCBpcyBjb25uZWN0ZWQ6CiAqIC0gdGhlIEYvVyBlZmZlY3R1YXRlcyB0aGUgc3RhdGljIGNvbmZpZ3VyYXRpb24gZm9yIHRoYXQgcG9ydC4KICogLSBlbmFibGVzIHRoZSByZWNlaXZlciBmb3IgdGhhdCBwb3J0LgogKiAtIGFjY2VwdHMgc2VuZCBjb21tYW5kcyBmb3IgdGhhdCBwb3J0LgogKgogKiBFbmFibGluZyBoYXMgdGhlIGZvbGxvd2luZyBlZmZlY3RzOgogKiAtIHRoZSBGL1cgZWZmZWN0dWF0ZXMgdGhlIHN0YXRpYyBjb25maWd1cmF0aW9uIGZvciBhbGwgcG9ydHMuCiAqICAgVGhlIEYvVyBvbmx5IHVwZGF0ZXMgaXRzIHN0YXRpYyBjb25maWd1cmF0aW9uIGF0IGEgdHJhbnNpdGlvbiBmcm9tIGRpc2FibGVkIHRvIGVuYWJsZWQgb3IgZnJvbQogKiAgIGRpc2Nvbm5lY3RlZCB0byBjb25uZWN0ZWQuCiAqICAgSW4gb3JkZXIgdG8gZW5mb3JjZSB0aGUgc3RhdGljIGNvbmZpZ3VyYXRpb24sIHRoZSBNU0YgbXVzdCBhc3N1cmUgdGhhdCBzdWNoIGEgdHJhbnNpdGlvbiB0YWtlcyBwbGFjZS4KICogICBEdWUgdG8gc3VjaCBhIGRpc2FibGUvZW5hYmxlIG9yIGRpc2Nvbm5lY3QvY29ubmVjdCBzZXF1ZW5jZSwgUngvVHggZnJhbWVzIG1heSBiZSBsb3N0LCBpbiBvdGhlciB3b3JkcywKICogICBjb25maWd1cmF0aW9uIG1heSBpbXBhY3QgY29tbXVuaWNhdGlvbi4KICogLSBUaGUgRE1BIEVuZ2luZSAoaWYgYXBwbGljYWJsZSkgaXMgZW5hYmxlZC4KICogTm90ZSB0aGF0IHRoZSBFbmFibGUgRnVuY3Rpb24gYnkgaXRzZWxmIG9ubHkgZW5hYmxlcyBkYXRhIHRyYW5zbWlzc2lvbiBhbmQgcmVjZXB0aW9uLCBpdAogKiBkb2VzIG5vdCBlbmFibGUgdGhlIEludGVycnVwdCBHZW5lcmF0aW9uIG1lY2hhbmlzbS4gVGhpcyBpcyBkb25lIGJ5IGhjZl9hY3Rpb24uCiAqCiAqIERpc2FibGluZyBoYXMgdGhlIGZvbGxvd2luZyBlZmZlY3RzOgogKiEhICA7Pz8/Pz9pcyB0aGUgZm9sbG93aW5nIHN0YXRlbWVudCByZWFsbHkgdHJ1ZQogKiAtIGl0IGFjdHMgYXMgYSBkaXNjb25uZWN0IG9uIGFsbCBwb3J0cy4KICogLSBUaGUgRE1BIEVuZ2luZSAoaWYgYXBwbGljYWJsZSkgaXMgZGlzYWJsZWQuCiAqCiAqIEZvciBpbXBhY3Qgb2YgdGhlIGRpc2FibGUgY29tbWFuZCBvbiB0aGUgYmVoYXZpb3Igb2YgaGNmX2RtYV90eC9yeF9nZXQgc2VlIHRoZSBhcHByb3ByaWF0ZSBzZWN0aW9ucy4KICoKICogQWx0aG91Z2ggdGhlIEVuYWJsZS9EaXNhYmxlIGFuZCBDb25uZWN0L0Rpc2Nvbm5lY3QgYXJlIGFudG9ueW1zLCB0aGVyZSBpcyBubyByZXN0cmljdGlvbiBvbiB0aGVpciBzZXF1ZW5jaW5nLAogKiBpbiBvdGhlciB3b3JkcywgdGhleSBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGluIGFyYml0cmFyeSBzZXF1ZW5jZSB3aXRob3V0IGJlaW5nIHBhaXJlZCBvciBiYWxhbmNlZC4KICogRWFjaCB0aW1lIG9uZSBvZiB0aGVzZSBmdW5jdGlvbnMgaXMgY2FsbGVkLCB0aGUgZWZmZWN0cyBvZiB0aGUgcHJlY2VkaW5nIGNhbGxzIGNlYXNlLgogKgogKiBBc3NlcnQgZmFpbHMgaWYKICogLSBpZmJwIGhhcyBhIHJlY29nbml6YWJsZSBvdXQtb2YtcmFuZ2UgdmFsdWUuCiAqIC0gTklDIGludGVycnVwdHMgYXJlIG5vdCBkaXNhYmxlZC4KICogLSBBIGNvbW1hbmQgb3RoZXIgdGhhbiBDb250aW51ZSwgRW5hYmxlLCBEaXNhYmxlLCBDb25uZWN0IG9yIERpc2Nvbm5lY3QgaXMgZ2l2ZW4uCiAqIC0gQW4gaW52YWxpZCBjb21iaW5hdGlvbiBvZiB0aGUgc3ViZmllbGRzIGlzIGdpdmVuIG9yIGEgYml0IG91dHNpZGUgdGhlIHN1YmZpZWxkcyBpcyBnaXZlbi4KICogLSBhbnkgcmV0dXJuIGNvZGUgYmVzaWRlcyBIQ0ZfU1VDQ0VTUy4KICogLSByZWVudHJhbmN5LCBtYXkgYmUgIGNhdXNlZCBieSBjYWxsaW5nIGEgaGNmX2Z1bmN0aW9uIHdpdGhvdXQgYWRlcXVhdGUgcHJvdGVjdGlvbiBhZ2FpbnN0IE5JQyBpbnRlcnJ1cHRzIG9yCiAqICAgbXVsdGktdGhyZWFkaW5nCiAqCiAqLkRJQUdSQU0KICogICBoY2ZfY250bCB0YWtlcyBzdWNjZXNzaXZlbHkgdGhlIGZvbGxvd2luZyBhY3Rpb25zOgogKjI6IElmIHRoZSBIQ0YgaXMgaW4gRGVmdW5jdCBtb2RlIG9yIGluY29tcGF0aWJsZSB3aXRoIHRoZSBQcmltYXJ5IG9yIFN0YXRpb24gU3VwcGxpZXIgaW4gdGhlIEhlcm1lcywKICogICBoY2ZfY250bCgpIHJldHVybnMgaW1tZWRpYXRlbHkgd2l0aCBIQ0ZfRVJSX05PX05JQzs/IGFzIHN0YXR1cy4KICo4OiB3aGVuIHRoZSBwb3J0IGlzIGRpc2FibGVkLCB0aGUgRE1BIGVuZ2luZSBuZWVkcyB0byBiZSBkZS1hY3RpdmF0ZWQsIHNvIHRoZSBob3N0IGNhbiBzYWZlbHkgcmVjbGFpbSB0eAogKiAgIHBhY2tldHMgZnJvbSB0aGUgdHggZGVzY3JpcHRvciBjaGFpbi4KICoKICouRU5ERE9DICAgICAgICAgICAgICAgIEVORCBET0NVTUVOVEFUSU9OCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludApoY2ZfY250bCggSUZCUCBpZmJwLCBoY2ZfMTYgY21kICkKewoJaW50IHJjID0gSENGX0VSUl9JTkNPTVBfRlc7CiNpZiBIQ0ZfQVNTRVJUCgl7ICAgaW50IHggPSBjbWQgJiBIQ01EX0NNRF9DT0RFOwoJCWlmICggeCA9PSBIQ0ZfQ05UTF9DT05USU5VRSApIHggJj0gfkhDTURfUkVUUlk7CgkJZWxzZSBpZiAoICh4ID09IEhDTURfRElTQUJMRSB8fCB4ID09IEhDTURfRU5BQkxFKSAmJiBpZmJwLT5JRkJfRldJZGVudGl0eS5jb21wX2lkID09IENPTVBfSURfRldfQVAgKSB7CgkJCXggJj0gfkhGU19UWF9DTlRMX1BPUlQ7CgkJfQoJCUhDRkFTU0VSVCggeD09SENGX0NOVExfRU5BQkxFICB8fCB4PT1IQ0ZfQ05UTF9ESVNBQkxFICAgIHx8IEhDRl9DTlRMX0NPTlRJTlVFIHx8CgkJCSAgIHg9PUhDRl9DTlRMX0NPTk5FQ1QgfHwgeD09SENGX0NOVExfRElTQ09OTkVDVCwgY21kICk7Cgl9CiNlbmRpZiAvLyBIQ0ZfQVNTRVJUCi8vICNpZiAoSENGX1NMRUVQKSAmIEhDRl9ERFMKLy8JSENGQVNTRVJUKCBpZmJwLT5JRkJfSW50T2ZmQ250ICE9IDB4RkZGRSwgY21kICk7Ci8vICNlbmRpZiAvLyBIQ0ZfRERTCglIQ0ZMT0dFTlRSWSggSENGX1RSQUNFX0NOVEwsIGNtZCApOwoJaWYgKCBpZmJwLT5JRkJfQ2FyZFN0YXQgPT0gMCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qMiovCgkvKjYqLyAgIHJjID0gY21kX2V4ZSggaWZicCwgY21kLCAwICk7CiNpZiAoSENGX1NMRUVQKSAmIEhDRl9ERFMKCQlpZmJwLT5JRkJfVGlja0NudCA9IDA7ICAgICAgICAgICAgICAvL3N0YXJ0IDIgc2Vjb25kIHBlcmlvZCAod2l0aCAxIHRpY2sgdW5jZXJ0YW50eSkKI2VuZGlmIC8vIEhDRl9ERFMKCX0KI2lmIEhDRl9ETUEKCS8vIXJsYXYgOiBub3RlIHRoYXQgdGhpcyBwaWVjZSBvZiBjb2RlIGlzIGFsd2F5cyBleGVjdXRlZCwgcmVnYXJkbGVzcyBvZiB0aGUgREVGVU5DVCBiaXQgaW4gSUZCX0NhcmRTdGF0LgoJLy8gVGhlIHJlYXNvbiBiZWhpbmQgdGhpcyBpcyB0aGF0IHRoZSBNU0Ygc2hvdWxkIGJlIGFibGUgdG8gZ2V0IGFsbCBpdHMgRE1BIHJlc291cmNlcyBiYWNrIGZyb20gdGhlIEhDRiwKCS8vIGV2ZW4gaWYgdGhlIGhhcmR3YXJlIGlzIGRpc2Z1bmN0aW9uYWwuIFByYWN0aWNhbCBleGFtcGxlIHVuZGVyIFdpbmRvd3MgOiBzdXJwcmlzZSByZW1vdmFsLgoJaWYgKCBpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV9ETUEgKSB7CgkJaGNmX2lvIGlvX3BvcnQgPSBpZmJwLT5JRkJfSU9CYXNlOwoJCURFU0NfU1RSQ1QgKnA7CgkJaWYgKCBjbWQgPT0gSENGX0NOVExfRElTQUJMRSB8fCBjbWQgPT0gSENGX0NOVExfRU5BQkxFICkgewoJCQlPVVRfUE9SVF9EV09SRCggKGlvX3BvcnQgKyBIUkVHX0RNQV9DVFJMKSwgRE1BX0NUUkxTVEFUX1JFU0VUKTsgICAgICAgICAgICAgICAgICAgICAvKjgqLwoJCQlpZmJwLT5JRkJfQ250bE9wdCAmPSB+RE1BX0VOQUJMRUQ7CgkJfQoJCWlmICggY21kID09IEhDRl9DTlRMX0VOQUJMRSApIHsKCQkJT1VUX1BPUlRfRFdPUkQoIChpb19wb3J0ICsgSFJFR19ETUFfQ1RSTCksIERNQV9DVFJMU1RBVF9HTyk7CgkJCS8qIDs/IGJ5IHJld3JpdGluZyBoY2ZfZG1hX3J4X3B1dCB5b3UgY2FuIHByb2JhYmx5IGp1c3QgY2FsbCBoY2ZfZG1hX3J4X3B1dCggaWZicC0+SUZCX0ZpcnN0RGVzY1tETUFfUlhdICkKCQkJICogYXMgYWRkaXRpb25hbCBiZW5lZmljaWFyeSBzaWRlIGVmZmVjdCwgdGhlIFNPUCBhbmQgRU9QIGJpdHMgd2lsbCBhbHNvIGJlIGNsZWFyZWQKCQkJICovCgkJCWlmYnAtPklGQl9DbnRsT3B0IHw9IERNQV9FTkFCTEVEOwoJCQlIQ0ZBU1NFUlQoIE5UX0FTU0VSVCwgTkVWRVJfVEVTVEVEICk7CgkJCS8vIG1ha2UgdGhlIGVudGlyZSByeCBkZXNjcmlwdG9yIGNoYWluIERNQS1vd25lZCwgc28gdGhlIERNQSBlbmdpbmUgY2FuIChyZS0pdXNlIGl0LgoJCQlwID0gaWZicC0+SUZCX0ZpcnN0RGVzY1tETUFfUlhdOwoJCQlpZiAocCAhPSBOVUxMKSB7ICAgLy87PyBUaGluayB0aGlzIG92ZXIgYWdhaW4gaW4gdGhlIGxpZ2h0IG9mIHRoZSBuZXcgY2hhaW5pbmcgc3RyYXRlZ3kKCQkJCWlmICggMSApICAgIHsgLy9iZWdpbiBhbHRlcm5hdGl2ZQoJCQkJCUhDRkFTU0VSVCggTlRfQVNTRVJULCBORVZFUl9URVNURUQgKTsKCQkJCQlwdXRfZnJhbWVfbHN0KCBpZmJwLCBpZmJwLT5JRkJfRmlyc3REZXNjW0RNQV9SWF0sIERNQV9SWCApOwoJCQkJCWlmICggaWZicC0+SUZCX0ZpcnN0RGVzY1tETUFfUlhdICkgewoJCQkJCQlwdXRfZnJhbWVfbHN0KCBpZmJwLCBpZmJwLT5JRkJfRmlyc3REZXNjW0RNQV9SWF0tPm5leHRfZGVzY19hZGRyLCBETUFfUlggKTsKCQkJCQl9CgkJCQl9IGVsc2UgewoJCQkJCXdoaWxlICggcCApIHsKCQkJCQkJLy9wLT5idWZfY250bC5jbnRsX3N0YXQgfD0gREVTQ19ETUFfT1dORUQ7CgkJCQkJCXAtPkJVRl9DTlQgfD0gREVTQ19ETUFfT1dORUQ7CgkJCQkJCXAgPSBwLT5uZXh0X2Rlc2NfYWRkcjsKCQkJCQl9CgkJCQkJLy8gYSByeCBjaGFpbiBpcyBhdmFpbGFibGUgc28gaGFuZCBpdCBvdmVyIHRvIHRoZSBETUEgZW5naW5lCgkJCQkJcCA9IGlmYnAtPklGQl9GaXJzdERlc2NbRE1BX1JYXTsKCQkJCQlPVVRfUE9SVF9EV09SRCggKGlvX3BvcnQgKyBIUkVHX1JYRE1BX1BUUjMyKSwgcC0+ZGVzY19waHlzX2FkZHIpOwoJCQkJfSAgLy9lbmQgYWx0ZXJuYXRpdmUKCQkJfQoJCX0KCX0KI2VuZGlmIC8vIEhDRl9ETUEKCUhDRkFTU0VSVCggcmMgPT0gSENGX1NVQ0NFU1MsIHJjICk7CglIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfQ05UTCApOwoJcmV0dXJuIHJjOwp9IC8vIGhjZl9jbnRsCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKi5NT0RVTEUgICAgICAgIGludCBoY2ZfY29ubmVjdCggSUZCUCBpZmJwLCBoY2ZfaW8gaW9fYmFzZSApCiAqLlBVUlBPU0UgICAgICAgR3JhbnRzIGFjY2VzcyByaWdodCBmb3IgdGhlIEhDRiB0byB0aGUgSUZCLgogKiAgICAgICAgICAgICAgIEluaXRpYWxpemVzIENhcmQgYW5kIEhDRiBob3VzZWtlZXBpbmcuCiAqCiAqLkFSR1VNRU5UUwogKiAgIGlmYnAgICAgICAgIChuZWFyKSBhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKICogICBpb19iYXNlICAgICBub24tVVNCOiBJL08gQmFzZSBhZGRyZXNzIG9mIHRoZSBOSUMgKGNvbm5lY3QpCiAqICAgICAgICAgICAgICAgbm9uLVVTQjogSENGX0RJU0NPTk5FQ1QKICogICAgICAgICAgICAgICBVU0I6ICAgICBIQ0ZfQ09OTkVDVCwgSENGX0RJU0NPTk5FQ1QKICoKICouUkVUVVJOUwogKiAgIEhDRl9TVUNDRVNTCiAqICAgSENGX0VSUl9JTkNPTVBfUFJJCiAqICAgSENGX0VSUl9JTkNPTVBfRlcKICogICBIQ0ZfRVJSX0RFRlVOQ1RfQ01EX1NFUQogKiEhIEhDRl9FUlJfTk9fTklDIHJlYWxseSByZXR1cm5lZCA7PwogKiAgIEhDRl9FUlJfTk9fTklDCiAqICAgSENGX0VSUl9USU1FX09VVAogKgogKiAgIE1TRi1hY2Nlc3NpYmxlIGZpZWxkcyBvZiBSZXN1bHQgQmxvY2s6CiAqICAgSUZCX0lPQmFzZSAgICAgICAgICAgICAgZW50cnkgcGFyYW1ldGVyIGlvX2Jhc2UKICogICBJRkJfSU9SYW5nZSAgICAgICAgICAgICBIUkVHX0lPX1JBTkdFICgweDQwLzB4ODApCiAqICAgSUZCX1ZlcnNpb24gICAgICAgICAgICAgdmVyc2lvbiBvZiB0aGUgSUZCIGxheW91dAogKiAgIElGQl9GV0lkZW50aXR5ICAgICAgICAgIENGR19GV19JREVOVElUWV9TVFJDVCwgc3BlY2lmaWVzIHRoZSBpZGVudGl0eSBvZiB0aGUKICogICAgICAgICAgICAgICAgICAgICAgICAgICAicnVubmluZyIgRi9XLCBpLmUuIHRlcnRpYXJ5IEYvVyB1bmRlciBub3JtYWwgY29uZGl0aW9ucwogKiAgIElGQl9GV1N1cCAgICAgICAgICAgICAgIENGR19TVVBfUkFOR0VfU1RSQ1QsIHNwZWNpZmllcyB0aGUgc3VwcGxpZXIgcmFuZ2Ugb2YKICogICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgInJ1bm5pbmciIEYvVywgaS5lLiB0ZXJ0aWFyeSBGL1cgdW5kZXIgbm9ybWFsIGNvbmRpdGlvbnMKICogICBJRkJfSFNJU3VwICAgICAgICAgICAgICBDRkdfU1VQX1JBTkdFX1NUUkNULCBzcGVjaWZpZXMgdGhlIEhXL1NXIEkvRiByYW5nZSBvZiB0aGUgTklDCiAqICAgSUZCX1BSSUlkZW50aXR5ICAgICAgICAgQ0ZHX1BSSV9JREVOVElUWV9TVFJDVCwgc3BlY2lmaWVzIHRoZSBJZGVudGl0eSBvZiB0aGUgUHJpbWFyeSBGL1cKICogICBJRkJfUFJJU3VwICAgICAgICAgICAgICBDRkdfU1VQX1JBTkdFX1NUUkNULCBzcGVjaWZpZXMgdGhlIHN1cHBsaWVyIHJhbmdlIG9mIHRoZSBQcmltYXJ5IEYvVwogKiAgIGFsbCBvdGhlciAgICAgICAgICAgICAgIGFsbCBNU0YgYWNjZXNzaWJsZSBmaWVsZHMsIHdoaWNoIGFyZSBub3Qgc3BlY2lmaWVkIGFib3ZlLCBhcmUgemVyby1maWxsZWQKICoKICouQ09ORElUSU9OUwogKiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIE1TRiB0byBhc3N1cmUgdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSBJL08gQmFzZSBhZGRyZXNzLgogKgogKiBOb3RlOiBoY2ZfY29ubmVjdCBkZWZhdWx0cyB0byBOSUMgaW50ZXJydXB0IGRpc2FibGVkIG1vZGUsIGkuZS4gYXMgaWYgaGNmX2FjdGlvbiggSENGX0FDVF9JTlRfT0ZGICkKICogd2FzIGNhbGxlZC4KICoKICouREVTQ1JJUFRJT04KICogaGNmX2Nvbm5lY3QgcGFzc2VzIHRoZSBNU0YtZGVmaW5lZCBsb2NhdGlvbiBvZiB0aGUgSUZCIHRvIHRoZSBIQ0YgYW5kIGdyYW50cyBvciByZXZva2VzIGFjY2VzcyByaWdodCBmb3IgdGhlCiAqIEhDRiB0byB0aGUgSUZCLiBSZXZva2luZyBpcyBkb25lIGJ5IHNwZWNpZnlpbmcgSENGX0RJU0NPTk5FQ1QgcmF0aGVyIHRoYW4gYW4gSS9PIGFkZHJlc3MgZm9yIHRoZSBwYXJhbWV0ZXIKICogaW9fYmFzZS4gIEV2ZXJ5IGNhbGwgb2YgaGNmX2Nvbm5lY3QgaW4gImNvbm5lY3QiIG1vZGUsIG11c3QgZXZlbnR1YWxseSBiZSBmb2xsb3dlZCBieSBhIGNhbGwgb2YgaGNmX2Nvbm5lY3QKICogaW4gImRpc2Nvbm5lY3QiIG1vZGUuIENsYWxsaW5nIGhjZl9jb25uZWN0IGluICJjb25uZWN0Ii8iZGlzY29ubmVjdCIgbW9kZSBjYW4gbm90IGJlIG5lc3RlZC4KICogVGhlIElGQiBhZGRyZXNzIG11c3QgYmUgdXNlZCBhcyBhIGhhbmRsZSB3aXRoIGFsbCBzdWJzZXF1ZW50IEhDRi1mdW5jdGlvbiBjYWxscyBhbmQgdGhlIEhDRiB1c2VzIHRoZSBJRkIKICogYWRkcmVzcyBhcyBhIGhhbmRsZSB3aGVuIGl0IHBlcmZvcm1zIGEgY2FsbChiYWNrKSBvZiBhbiBNU0YtZnVuY3Rpb24gKGkuZS4gbXNmX2Fzc2VydCkuCiAqCiAqIE5vdGUgdGhhdCBub3Qgb25seSB0aGUgTVNGIGFjY2Vzc2libGUgZmllbGRzIGFyZSBjbGVhcmVkLCBidXQgYWxzbyBhbGwgaW50ZXJuYWwgaG91c2VrZWVwaW5nCiAqIGluZm9ybWF0aW9uIGlzIHJlLWluaXRpYWxpemVkLgogKiBUaGlzIGltcGxpZXMgdGhhdCBhbGwgc2V0dGluZ3Mgd2hpY2ggYXJlIGRvbmUgdmlhIGhjZl9hY3Rpb24gYW5kIGhjZl9wdXRfaW5mbyAoZS5nLiBDRkdfTUJfQVNTRVJULCBDRkdfUkVHX01CLAogKiBDRkdfUkVHX0lORk9fTE9HKSBtdXN0IGJlIGRvbmUgYWdhaW4uIFRoZSBvbmx5IGZpZWxkIHdoaWNoIGlzIG5vdCBjbGVhcmVkLCBpcyBJRkJfTVNGU3VwLgogKgogKiBJZiBIQ0ZfSU5UX09OIGlzIHNlbGVjdGVkIGFzIGNvbXBpbGUgb3B0aW9uLCBOSUMgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQuCiAqCiAqIEFzc2VydCBmYWlscyBpZgogKiAtIGlmYnAgaXMgbm90IHByb3Blcmx5IGFsaWduZWQgKCByZWYgY2hhcHRlciBIQ0ZfQUxJR04gaW4gNC4xLjEpCiAqIC0gSS9PIEJhc2UgQWRkcmVzcyBpcyBub3QgYSBtdWx0aXBsZSBvZiAweDQwIChub3RlOiAweDAwMDAgaXMgZXhwbGljaXRseSBhbGxvd2VkKS4KICoKICouRElBR1JBTQogKgogKjA6IFRocm91Z2hvdXQgaGNmX2Nvbm5lY3QgeW91IG5lZWQgdG8gZGlzdGluZ3Vpc2ggdGhlIGNvbm5lY3QgZnJvbSB0aGUgZGlzY29ubmVjdCBjYXNlLCB3aGljaCByZXF1aXJlcwogKiAgIHNvbWUgYXR0ZW50aW9uIGFib3V0IHdoYXQgdG8gdXNlIGFzICJJL08iIGFkZHJlc3Mgd2hlbiBmb3Igd2hpY2ggcHVycG9zZS4KICoyOgogKjJhOiBSZXNldCBILUlJIGJ5IHRvZ2dsaW5nIHJlc2V0IGJpdCBpbiBJTy1yZWdpc3RlciBvbiBhbmQgb2ZmLgogKiAgIFRoZSBIQ0ZfVFlQRV9QUkVMT0FERUQgY2F0ZXJzIGZvciB0aGUgRE9TIGVudmlyb25tZW50IHdoZXJlIEgtSUkgaXMgbG9hZGVkIGJ5IGEgc2VwYXJhdGUgcHJvZ3JhbSB0bwogKiAgIG92ZXJjb21lIHRoZSA2NGsgc2l6ZSBsaW1pdCBwb3NlZCBvbiBET1MgZHJpdmVycy4KICogICBUaGUgbWFjcm8gT1BXIGlzIG5vdCB5ZXQgdXNlYWJsZSBiZWNhdXNlIHRoZSBJRkJfSU9CYXNlIGZpZWxkIGlzIG5vdCBzZXQuCiAqICAgTm90ZSAxOiBob3BlZnVsbHkgdGhlIGNsZWFyaW5nIGFuZCBpbml0aWFsaXppbmcgb2YgdGhlIElGQiAoc2VlIGJlbG93KSBhY3RzIGFzIGEgZGVsYXkgd2hpY2ggbWVldHMgdGhlCiAqICAgc3BlY2lmaWNhdGlvbiBmb3IgUy9XIHJlc2V0CiAqICAgTm90ZSAyOiBpdCB0dXJucyBvdXQgdGhhdCBvbiBzb21lIEgvVyBjb25zdGVsbGF0aW9ucywgdGhlIGNsb2NrIHRvIGFjY2VzcyB0aGUgRUVQcm9tIGlzIG5vdCBsb3dlcmVkCiAqICAgdG8gYW4gYXBwcm9wcmlhdGUgZnJlcXVlbmN5IGJ5IEhSRUdfSU9fU1JFU0VULiBCeSBnaXZpbmcgYW4gSENNRF9JTkkgZmlyc3QsIHRoaXMgcHJvYmxlbSBpcyB3b3JrZWQgYXJvdW5kLgogKjJiOiBFeHBlcmltZW50YWxseSBpdCBpcyBkZXRlcm1pbmVkIG92ZXIgYSB3aWRlIHJhbmdlIG9mIEYvVyB2ZXJzaW9ucyB0aGF0IHdhaXRpbmcgZm9yIHRoZSBmb3IgQ21kIGJpdCBpbgogKiAgIEV2IHJlZ2lzdGVyIGdpdmVzIGEgd29ya2FibGUgc3RyYXRlZ3kuIFRoZSBhdmFpbGFibGUgZG9jdW1lbnRhdGlvbiBkb2VzIG5vdCBnaXZlIG11Y2ggY2x1ZXMuCiAqNDogY2xlYXIgYW5kIGluaXRpYWxpemUgdGhlIElGQgogKiAgIFRoZSBIQ0YgaG91c2Uga2VlcGluZyBpbmZvIGlzIGRlc2lnbmVkIHN1Y2ggdGhhdCB6ZXJvIGlzIHRoZSBhcHByb3ByaWF0ZSBpbml0aWFsIHZhbHVlIGZvciBhcyBtdWNoIGFzCiAqICAgZmVhc2libGUgSUZCLWl0ZW1zLgogKiAgIFRoZSByZWFkYWJsZSBmaWVsZHMgbWVudGlvbmVkIGluIHRoZSBkZXNjcmlwdGlvbiBzZWN0aW9uIGFuZCBzb21lIEhDRiBzcGVjaWZpYyBmaWVsZHMgYXJlIGdpdmVuIHRoZWlyCiAqICAgYWN0dWFsIHZhbHVlLgogKiAgIElGQl9UaWNrSW5pIGlzIGluaXRpYWxpemVkIGF0IGJlc3QgZ3Vlc3MgYmVmb3JlIGNhbGlicmF0aW9uCiAqICAgSGNmX2Nvbm5lY3QgZGVmYXVsdHMgdG8gIm5vIGludGVycnVwdCBnZW5lcmF0aW9uIiAoaW1wbGljaXRseSBhY2hpZXZlZCBieSB0aGUgemVyby1maWxsaW5nKS4KICo2OiBSZWdpc3RlciBjb21waWxlLXRpbWUgbGlua2VkIE1TRiBSb3V0aW5lIGFuZCBzZXQgZGVmYXVsdCBmaWx0ZXIgbGV2ZWwKICogICBjYXN0IG5lZWRlZCB0byBnZXQgYXJvdW5kIHRoZSAibmVhciIgcHJvYmxlbSBpbiBET1MgQ09NIG1vZGVsCiAqICAgZXIgQzI0NDY6IG5vIGNvbnZlcnNpb24gZnJvbSB2b2lkIChfX25lYXIgX19jZGVjbCAqKSh1bnNpZ25lZCBjaGFyIF9fZmFyICosdW5zaWduZWQgaW50LHVuc2lnbmVkIHNob3J0LGludCkKICogICAgICAgICAgICAgICAgICAgICAgICAgICB0byAgIHZvaWQgKF9fZmFyICBfX2NkZWNsICopKHVuc2lnbmVkIGNoYXIgX19mYXIgKix1bnNpZ25lZCBpbnQsdW5zaWduZWQgc2hvcnQsaW50KQogKjg6IElmIGEgY29tbWFuZCBpcyBhcHBhcmVudGx5IHN0aWxsIGFjdGl2ZSAoYXMgaW5kaWNhdGVkIGJ5IHRoZSBCdXN5IGJpdCBpbiBDbWQgcmVnaXN0ZXIpIHRoaXMgbWF5IGluZGljYXRlIGEKICogICBibG9ja2VkIGNtZCBwaXBlIGxpbmUuICBUbyB1bmJsb2NrIHRoZSBmb2xsb3dpbmcgYWN0aW9ucyBhcmUgZG9uZToKICogICAgLSBBY2sgZXZlcnl0aGluZwogKiAgICAtIFdhaXQgZm9yIEJ1c3kgYml0IGRyb3AgIGluIENtZCByZWdpc3RlcgogKiAgICAtIFdhaXQgZm9yIENtZCAgYml0IHJhaXNlIGluIEV2ICByZWdpc3RlcgogKiAgIFRoZSB0d28gd2FpdHMgYXJlIGNvbWJpbmVkIGluIGEgc2luZ2xlIEhDRl9XQUlUX1dISUxFIHRvIG9wdGltaXplIG1lbW9yeSBzaXplLiBJZiBlaXRoZXIgb2YgdGhlc2Ugd2FpdHMKICogICBmYWlsIChwcm90X2NudCBiZWNvbWVzIDApLCB0aGVuIHNvbWV0aGluZyBpcyBzZXJpb3VzIHdyb25nLiBSYXRoZXIgdGhhbiBQQU5JQ0ssIHRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgdGhlCiAqICAgbmV4dCBjbWRfZXhlIHdpbGwgZmFpbCwgY2F1c2luZyB0aGUgSENGIHRvIGdvIGludG8gREVGVU5DVCBtb2RlCiAqMTA6ICAgIEFjayBldmVyeXRoaW5nIHRvIHVuYmxvY2sgYSAocG9zc2libHkgYmxvY2tlZCkgY21kIHBpcGUgbGluZQogKiAgIE5vdGUgMTogaXQgaXMgdmVyeSBsaWtlbHkgdGhhdCBhbiBBbGxvYyBldmVudCBpcyBwZW5kaW5nIGFuZCB2ZXJ5IHdlbGwgcG9zc2libGUgdGhhdCBhIChTZW5kKSBDbWQgZXZlbnQgaXMKICogICBwZW5kaW5nIG9uIG5vbi1pbml0aWFsIGNhbGxzCiAqICAgTm90ZSAyOiBpdCBpcyBhc3N1bWVkIHRoYXQgdGhpcyBzdHJhdGVneSB0YWtlcyBhd2F5IHRoZSBuZWVkIHRvIGFjayBldmVyeSBjb25jZWl2YWJsZSBldmVudCBhZnRlciBhbgogKiAgIEhlcm1lcyBJbml0aWFsaXplCiAqMTI6ICAgIE9ubHkgSC1JSSBORUVEUyB0aGUgSGVybWVzIEluaXRpYWxpemUgY29tbWFuZC4gRHVlIHRvIHRoZSBkaWZmZXJlbnQgc2VtYW50aWNzIGZvciBILUkgYW5kIEgtSUkKICogICBJbml0aWFsaXplIGNvbW1hbmQsIGluaXQoKSBkb2VzIG5vdCAoYW5kIGNhbiBub3QsIHNpbmNlIGl0IGlzIGNhbGxlZCBlLmcuIGFmdGVyIGEgZG93bmxvYWQpIGV4ZWN1dGUgdGhlCiAqICAgSGVybWVzIEluaXRpYWxpemUgY29tbWFuZC4gRXhlY3V0aW5nIHRoZSBIZXJtZXMgSW5pdGlhbGl6ZSBjb21tYW5kIGZvciBILUkgd291bGQgbm90IGhhcm0gYnV0IG5vdCBkbwogKiAgIGFueXRoaW5nIHVzZWZ1bCBlaXRoZXIsIHNvIGl0IGlzIHNraXBwZWQuCiAqICAgVGhlIHJldHVybiBzdGF0dXMgb2YgY21kX2V4ZSBpcyBpZ25vcmVkLiBJdCBpcyBhc3N1bWVkIHRoYXQgaWYgY21kX2V4ZSBmYWlscywgaW5pdCBmYWlscyB0b28KICoxNDogICAgdXNlIGlvX2Jhc2UgYXMgYSBmbGFnIHRvIG1lcmdlIGhjZl9jb25uZWN0IGFuZCBoY2ZfZGlzY29ubmVjdCBpbnRvIDEgcm91dGluZQogKiAgIHRoZSBjYWxsIHRvIGluaXQgYW5kIGl0cyBzdWJzZXF1ZW50IGNhbGwgb2YgY21kX2V4ZSB3aWxsIHJldHVybiBIQ0ZfRVJSX05PX05JQyBpZiBhcHByb3ByaWF0ZS4gVGhpcyBzdGF0dXMKICogICBpcyAoYmFkbHkpIG5lZWRlZCBieSBzb21lIGxlZ2FjeSBjb21iaW5hdGlvbiBvZiBOVDQgYW5kIGNhcmQgc2VydmljZXMgd2hpY2ggZG8gbm90IHlpZWxkIGFuIEkvTyBhZGRyZXNzIGluCiAqICAgdGltZS4KICoKICouTk9USUNFCiAqICAgT24gcGxhdGZvcm1zIHdoZXJlIHRoZSBOVUxMLXBvaW50ZXIgaXMgbm90IGEgYml0LXBhdHRlcm4gb2YgYWxsIHplcm9zLCB0aGUgemVyby1maWxsaW5nIG9mIHRoZSBJRkIgcmVzdWx0cwogKiAgIGluIGFuIGluY29ycmVjdCBpbml0aWFsaXphdGlvbiBvZiBwb2ludGVycy4KICogICBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIE1haWxCb3ggbWFuaXB1bGF0aW9uIGluIHB1dF9tYl9pbmZvIHByb3RlY3RzIGFnYWluc3QgdGhlIGFic2VuY2Ugb2YgYSBNYWlsQm94CiAqICAgYmFzZWQgb24gSUZCX01CU2l6ZSwgSUZCX01CV3AgYW5kIGlmYnAtPklGQl9NQlJwLiBUaGlzIGhhcyByYW1pZmljYXRpb25zIG9uIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUKICogICBNYWlsQm94IHZpYSBoY2ZfcHV0X2luZm8gd2l0aCB0aGUgQ0ZHX1JFR19NQiB0eXBlLCBidXQgaXQgcHJldmVudHMgZGVwZW5kZW5jeSBvbiB0aGUgIk5VTEwtIm5lc3Mgb2YKICogICBJRkJfTUJwLgogKgogKi5OT1RJQ0UKICogICBUaGVyZSBhcmUgYSBudW1iZXIgb2YgcHJvYmxlbXMgd2hlbiBhc3NlcnRpbmcgYW5kIGxvZ2dpbmcgaGNmX2Nvbm5lY3QsIGUuZy4KICogICAgLSBBc3NlcnRpbmcgb24gcmUtZW50cmFuY3kgb2YgaGNmX2Nvbm5lY3QgYnkgbWVhbnMgb2YKICogICAgIkhDRkFTU0VSVCggKGlmYnAtPklGQl9Bc3NlcnRUcmFjZSAmIEhDRl9BU1NFUlRfQ09OTkVDVCkgPT0gMCwgMCApIiBpcyBub3QgdXNlZnVsIGJlY2F1c2UgSUZCIGNvbnRlbnRzCiAqICAgIGFyZSB1bmRlZmluZWQKICogICAgLSBBc3NlcnRpbmcgYmVmb3JlIHRoZSBJRkIgaXMgY2xlYXJlZCB3aWxsIGNhdXNlIG1kZF9hc3NlcnQoKSB0byBpbnRlcnByZXQgdGhlIGdhcmJhZ2UgaW4gSUZCX0Fzc2VydFJ0bgogKiAgICBhcyBhIHJvdXRpbmUgYWRkcmVzcwogKiAgIFRoZXJlZm9yZSBIQ0ZUUkFDRSBub3IgSENGTE9HRU5UUlkgaXMgY2FsbGVkIGJ5IGhjZl9jb25uZWN0LgogKi5FTkRET0MgICAgICAgICAgICAgICAgRU5EIERPQ1VNRU5UQVRJT04KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50CmhjZl9jb25uZWN0KCBJRkJQIGlmYnAsIGhjZl9pbyBpb19iYXNlICkKewoJaW50ICAgICAgICAgcmMgPSBIQ0ZfU1VDQ0VTUzsKCWhjZl9pbyAgICAgIGlvX2FkZHI7CgloY2ZfMzIgICAgICBwcm90X2NudDsKCWhjZl84ICAgICAgICpxOwoJTFRWX1NUUkNUICAgeDsKI2lmIEhDRl9BU1NFUlQKCWhjZl8xNiB4YSA9IGlmYnAtPklGQl9GV0lkZW50aXR5LnR5cDsKCS8qIGlzIGFzc3VtZWQgdG8gY2F1c2UgYW4gYXNzZXJ0IGxhdGVyIG9uIGlmIGhjZl9jb25uZWN0IGlzIGNhbGxlZCB3aXRob3V0IGludGVydmVuaW5nIGhjZl9kaXNjb25uZWN0LgoJICogeGEgPT0gQ0ZHX0ZXX0lERU5USVRZIGluIHN1YnNlcXVlbnQgY2FsbHMgd2l0aG91dCBwcmVjZWRpbmcgaGNmX2Rpc2Nvbm5lY3QsCgkgKiB4YSA9PSAwIGluIHN1YnNlcXVlbnQgY2FsbHMgd2l0aCBwcmVjZWRpbmcgaGNmX2Rpc2Nvbm5lY3QsCgkgKiB4YSA9PSAiZ2FyYmFnZSIgKGFueSB2YWx1ZSBleGNlcHQgQ0ZHX0ZXX0lERU5USVRZIGlzIGFjY2VwdGFibGUpIGluIHRoZSBpbml0aWFsIGNhbGwKCSAqLwojZW5kaWYgLy8gSENGX0FTU0VSVAoKCWlmICggaW9fYmFzZSA9PSBIQ0ZfRElTQ09OTkVDVCApIHsgICAgICAgICAgICAgICAgICAvL2Rpc2Nvbm5lY3QKCQlpb19hZGRyID0gaWZicC0+SUZCX0lPQmFzZTsKCQlPUFcoIEhSRUdfSU5UX0VOLCAwICk7ICAgICAgLy87P3dvcmthcm91bmQgYWdhaW5zdCBkeWluZyBGL1cgb24gc3Vic2VxdWVudCBoY2ZfY29ubmVjdCBjYWxscwoJfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29ubmVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwICovCgkJaW9fYWRkciA9IGlvX2Jhc2U7Cgl9CgojaWYgMCAvLzs/IGlmIGEgc3Vic2VxdWVudCBoY2ZfY29ubmVjdCBpcyBwcmVjZWRlZCBieSBhbiBoY2ZfZGlzY29ubmVjdCB0aGUgd2FrZXVwIGlzIG5vdCBuZWVkZWQgISEKI2lmIEhDRl9TTEVFUAoJT1VUX1BPUlRfV09SRCggLi4uLi4rSFJFR19JTywgSFJFR19JT19XQUtFVVBfQVNZTkMgKTsgICAgICAgLy9PUFcgbm90IHlldCB1c2VhYmxlCglNU0ZfV0FJVCg4MDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1TRi1kZWZpbmVkIGZ1bmN0aW9uIHRvIHdhaXQgbiBtaWNyb3NlY29uZHMuCglub3RlIHRoYXQgTVNGX1dBSVQgdXNlcyBub3QgeWV0IGRlZmluZWQhISEhIElGQl9JT0Jhc2UgYW5kIElGQl9UaWNrSW5pICh2aWEgUFJPVF9DTlRfSU5JKQoJc28gYmUgY2FyZWZ1bCBpZiB0aGlzIGNvZGUgaXMgcmVzdG9yZWQKI2VuZGlmIC8vIEhDRl9TTEVFUAojZW5kaWYgLy8gMAoKI2lmICggKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1BSRUxPQURFRCApID09IDAgICAgLy9zd2l0Y2ggY2xvY2sgYmFjayBmb3IgU0VFUFJPTSBhY2Nlc3MgICEhIQoJT1VUX1BPUlRfV09SRCggaW9fYWRkciArIEhSRUdfQ01ELCBIQ01EX0lOSSApOyAgICAgICAgICAvL09QVyBub3QgeWV0IHVzZWFibGUKCXByb3RfY250ID0gSU5JX1RJQ0tfSU5JOwoJSENGX1dBSVRfV0hJTEUoIChJTl9QT1JUX1dPUkQoIGlvX2FkZHIgKyAgSFJFR19FVl9TVEFUKSAmIEhSRUdfRVZfQ01EKSA9PSAwICk7CglPVVRfUE9SVF9XT1JEKCAoaW9fYWRkciArIEhSRUdfSU8pLCBIUkVHX0lPX1NSRVNFVCApOyAgIC8vT1BXIG5vdCB5ZXQgdXNlYWJsZSAgICAgICAgICAgICAgICAgICAvKiAyYSovCiNlbmRpZiAvLyBIQ0ZfVFlQRV9QUkVMT0FERUQKCWZvciAoIHEgPSAoaGNmXzgqKSgmaWZicC0+SUZCX01hZ2ljKTsgcSA+IChoY2ZfOCopaWZicDsgKi0tcSA9IDAgKSAvKk5PUCovOyAgICAgICAgICAgICAgICAgICAgIC8qIDQgKi8KCWlmYnAtPklGQl9NYWdpYyAgICAgPSBIQ0ZfTUFHSUM7CglpZmJwLT5JRkJfVmVyc2lvbiAgID0gSUZCX1ZFUlNJT047CiNpZiBkZWZpbmVkIE1TRl9DT01QT05FTlRfSUQgLy9hIG5ldyBJRkIgZGVtb25zdHJhdGVzIGhvdyBkaXJ0eSB0aGUgc29sdXRpb24gaXMKCXh4eHhbeHh4eF9QUklfSURFTlRJVFlfT0ZGU0VUXSA9IE5VTEw7ICAgICAgLy9JRkJfUFJJSWRlbnRpdHkgcGxhY2Vob2xkZXIgICAweEZEMDIKCXh4eHhbeHh4eF9QUklfSURFTlRJVFlfT0ZGU0VUKzFdID0gTlVMTDsgICAgLy9JRkJfUFJJU3VwIHBsYWNlaG9sZGVyICAgICAgICAweEZEMDMKI2VuZGlmIC8vIE1TRl9DT01QT05FTlRfSUQKI2lmIChIQ0ZfVEFMTElFUykgJiAoIEhDRl9UQUxMSUVTX05JQyB8IEhDRl9UQUxMSUVTX0hDRiApCglpZmJwLT5JRkJfVGFsbHlMZW4gPSAxICsgMiAqIChIQ0ZfTklDX1RBTF9DTlQgKyBIQ0ZfSENGX1RBTF9DTlQpOyAgIC8vY29udmVydCAjIG9mIFRhbGxpZXMgdG8gTCB2YWx1ZSBmb3IgTFRWCglpZmJwLT5JRkJfVGFsbHlUeXAgPSBDRkdfVEFMTElFUzsgICAgICAgICAgIC8vSUZCX1RhbGx5VHlwOiBzZXQgVCB2YWx1ZQojZW5kaWYgLy8gSENGX1RBTExJRVNfTklDIC8gSENGX1RBTExJRVNfSENGCglpZmJwLT5JRkJfSU9CYXNlICAgID0gaW9fYWRkcjsgICAgICAgICAgICAgIC8vc2V0IElPX0Jhc2UgYXNhcCwgc28gYXNzZXJ0cyB2aWEgSFJFR19TV18yIGRvbid0IGhhcm0KCWlmYnAtPklGQl9JT1JhbmdlICAgPSBIUkVHX0lPX1JBTkdFOwoJaWZicC0+SUZCX0NudGxPcHQgICA9IFVTRV8xNkJJVDsKI2lmIEhDRl9BU1NFUlQKCWFzc2VydF9pZmJwID0gaWZicDsKCWlmYnAtPklGQl9Bc3NlcnRMdmwgPSAxOwojaWYgKEhDRl9BU1NFUlQpICYgSENGX0FTU0VSVF9MTktfTVNGX1JUTgoJaWYgKCBpb19iYXNlICE9IEhDRl9ESVNDT05ORUNUICkgewoJCWlmYnAtPklGQl9Bc3NlcnRSdG4gPSAoTVNGX0FTU0VSVF9SVE5QKW1zZl9hc3NlcnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNiAqLwoJfQojZW5kaWYgLy8gSENGX0FTU0VSVF9MTktfTVNGX1JUTgojaWYgKEhDRl9BU1NFUlQpICYgSENGX0FTU0VSVF9NQiAgICAgICAgICAgICAgICAvL2J1aWxkIHRoZSBzdHJ1Y3R1cmUgdG8gcGFzcyB0aGUgYXNzZXJ0IGluZm8gdG8gaGNmX3B1dF9pbmZvCglpZmJwLT5JRkJfQXNzZXJ0U3RyY3QubGVuID0gc2l6ZW9mKGlmYnAtPklGQl9Bc3NlcnRTdHJjdCkvc2l6ZW9mKGhjZl8xNikgLSAxOwoJaWZicC0+SUZCX0Fzc2VydFN0cmN0LnR5cCA9IENGR19NQl9JTkZPOwoJaWZicC0+SUZCX0Fzc2VydFN0cmN0LmJhc2VfdHlwID0gQ0ZHX01CX0FTU0VSVDsKCWlmYnAtPklGQl9Bc3NlcnRTdHJjdC5mcmFnX2NudCA9IDE7CglpZmJwLT5JRkJfQXNzZXJ0U3RyY3QuZnJhZ19idWZbMF0uZnJhZ19sZW4gPQoJCSggb2Zmc2V0b2YoSUZCX1NUUkNULCBJRkJfQXNzZXJ0THZsKSAtIG9mZnNldG9mKElGQl9TVFJDVCwgSUZCX0Fzc2VydExpbmUpICkgLyBzaXplb2YoaGNmXzE2KTsKCWlmYnAtPklGQl9Bc3NlcnRTdHJjdC5mcmFnX2J1ZlswXS5mcmFnX2FkZHIgPSAmaWZicC0+SUZCX0Fzc2VydExpbmU7CiNlbmRpZiAvLyBIQ0ZfQVNTRVJUX01CCiNlbmRpZiAvLyBIQ0ZfQVNTRVJUCglJRl9QUk9UX1RJTUUoIHByb3RfY250ID0gaWZicC0+SUZCX1RpY2tJbmkgPSBJTklfVElDS19JTkkgKTsKI2lmICggKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1BSRUxPQURFRCApID09IDAKCS8vISEgTm8gYXNzZXJ0cyBiZWZvcmUgUmVzZXQtYml0IGluIEhSRUdfSU8gaXMgY2xlYXJlZAoJT1BXKCBIUkVHX0lPLCAweDAwMDAgKTsgICAgICAgICAgICAgICAgICAgICAvL09QVyB1c2VhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMmIqLwoJSENGX1dBSVRfV0hJTEUoIChJUFcoIEhSRUdfRVZfU1RBVCkgJiBIUkVHX0VWX0NNRCkgPT0gMCApOwoJSUZfUFJPVF9USU1FKCBIQ0ZBU1NFUlQoIHByb3RfY250LCBJUFcoIEhSRUdfRVZfU1RBVCkgKSApOwoJSUZfUFJPVF9USU1FKCBpZiAoIHByb3RfY250ICkgcHJvdF9jbnQgPSBpZmJwLT5JRkJfVGlja0luaSApOwojZW5kaWYgLy8gSENGX1RZUEVfUFJFTE9BREVECgkvLyEhIE5vIGFzc2VydHMgYmVmb3JlIFJlc2V0LWJpdCBpbiBIUkVHX0lPIGlzIGNsZWFyZWQKCUhDRkFTU0VSVCggRE9fQVNTRVJULCBNRVJHRV8yKCBIQ0ZfQVNTRVJULCAweENBRjAgKSApOyAvL2p1c3QgdG8gcHJvb2YgdGhhdCB0aGUgY29tcGxldGUgYXNzZXJ0IG1hY2hpbmVyeSBpcyB3b3JraW5nCglIQ0ZBU1NFUlQoIHhhICE9IENGR19GV19JREVOVElUWSwgMCApOyAgICAgICAvLyBhc3NlcnQgaWYgaGNmX2Nvbm5lY3QgaXMgY2FsbGVkIHdpdGhvdXQgaW50ZXJ2ZW5pbmcgaGNmX2Rpc2Nvbm5lY3QuCglIQ0ZBU1NFUlQoICgoaGNmXzMyKSh2b2lkKilpZmJwICYgKEhDRl9BTElHTi0xKSApID09IDAsIChoY2ZfMzIpKHZvaWQqKWlmYnAgKTsKCUhDRkFTU0VSVCggKGlvX2FkZHIgJiAweDAwM0YpID09IDAsIGlvX2FkZHIgKTsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lmIEJ1c3kgYml0IGluIENtZCByZWdpc3RlcgoJaWYgKElQVyggSFJFR19DTUQgKSAmIEhDTURfQlVTWSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOCAqLwoJCS8vLiAgQWNrIGFsbCB0byB1bmJsb2NrIGEgKHBvc3NpYmx5KSBibG9ja2VkIGNtZCBwaXBlIGxpbmUKCQlPUFcoIEhSRUdfRVZfQUNLLCB+SFJFR19FVl9TTEVFUF9SRVEgKTsKCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgV2FpdCBmb3IgQnVzeSBiaXQgZHJvcCAgaW4gQ21kIHJlZ2lzdGVyCgkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIFdhaXQgZm9yIENtZCAgYml0IHJhaXNlIGluIEV2ICByZWdpc3RlcgoJCUhDRl9XQUlUX1dISUxFKCAoIElQVyggSFJFR19DTUQgKSAmIEhDTURfQlVTWSApICYmIChJUFcoIEhSRUdfRVZfU1RBVCkgJiBIUkVHX0VWX0NNRCkgPT0gMCApOwoJCUlGX1BST1RfVElNRSggSENGQVNTRVJUKCBwcm90X2NudCwgSVBXKCBIUkVHX0VWX1NUQVQpICkgKTsgLyogaWYgcHJvdF9jbnQgPT0gMCwgY21kX2V4ZSB3aWxsIGZhaWwsIGNhdXNpbmcgREVGVU5DVCAqLwoJfQoJT1BXKCBIUkVHX0VWX0FDSywgfkhSRUdfRVZfU0xFRVBfUkVRICk7CiNpZiAoIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9QUkVMT0FERUQgKSA9PSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjEyKi8KCSh2b2lkKWNtZF9leGUoIGlmYnAsIEhDTURfSU5JLCAwICk7CiNlbmRpZiAvLyBIQ0ZfVFlQRV9QUkVMT0FERUQKCWlmICggaW9fYmFzZSAhPSBIQ0ZfRElTQ09OTkVDVCApIHsKCQlyYyA9IGluaXQoIGlmYnAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qMTQqLwoJCWlmICggcmMgPT0gSENGX1NVQ0NFU1MgKSB7CgkJCXgubGVuID0gMjsKCQkJeC50eXAgPSBDRkdfTklDX0JVU19UWVBFOwoJCQkodm9pZCloY2ZfZ2V0X2luZm8oIGlmYnAsICZ4ICk7CgkJCWlmYnAtPklGQl9CdXNUeXBlID0geC52YWxbMF07CgkJCS8vQ0ZHX05JQ19CVVNfVFlQRSBub3Qgc3VwcG9ydGVkIC0+IGRlZmF1bHQgMzIgYml0cy9ETUEsIE1TRiBoYXMgdG8gb3ZlcnJ1bGUgdmlhIENGR19DTlRMX09QVAoJCQlpZiAoIHgubGVuID09IDAgfHwgeC52YWxbMF0gPT0gMHgwMDAyIHx8IHgudmFsWzBdID09IDB4MDAwMyApIHsKI2lmIChIQ0ZfSU8pICYgSENGX0lPXzMyQklUUwoJCQkJaWZicC0+SUZCX0NudGxPcHQgJj0gflVTRV8xNkJJVDsgICAgICAgICAgICAvL3Jlc2V0IFVTRV8xNkJJVAojZW5kaWYgLy8gSENGX0lPXzMyQklUUwojaWYgSENGX0RNQQoJCQkJaWZicC0+SUZCX0NudGxPcHQgfD0gVVNFX0RNQTsgICAgICAgICAgICAgICAvL1NFVCBETUEKI2Vsc2UKCQkJCWlmYnAtPklGQl9JT1JhbmdlID0gMHg0MCAvKmkucy5vLiBIUkVHX0lPX1JBTkdFKi87CiNlbmRpZiAvLyBIQ0ZfRE1BCgkJCX0KCQl9Cgl9IGVsc2UgSENGQVNTRVJUKCAgKCBpZmJwLT5JRkJfTWFnaWMgXj0gSENGX01BR0lDICkgPT0gMCwgaWZicC0+SUZCX01hZ2ljICkgLypOT1AqLzsKCS8qIG9mIGFib3ZlIEhDRkFTU0VSVCBvbmx5IHRoZSBzaWRlIGVmZmVjdCBpcyBuZWVkZWQsIE5PUCBpbiBjYXNlIEhDRkFTU0VSVCBpcyBkdW1teSAqLwoJaWZicC0+SUZCX0lPQmFzZSA9IGlvX2Jhc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMCovCglyZXR1cm4gcmM7Cn0gLy8gaGNmX2Nvbm5lY3QKCiNpZiBIQ0ZfRE1BCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRnVuY3Rpb24gZ2V0X2ZyYW1lX2xzdAogKiAgLSByZXNvbHZlIHRoZSAibGFzdCBob3N0LW93bmVkIGRlc2NyaXB0b3IiIHByb2JsZW1zIHdoZW4gYSBkZXNjcmlwdG9yIGxpc3QgaXMgcmVjbGFpbWVkIGJ5IHRoZSBNU0YuCiAqCiAqIFRoZSBGcmFtZUxpc3QgdG8gYmUgcmVjbGFpbWVkIGFzIHdlbGwgYXMgdGhlIERlc2NyaXB0b3JMaXN0IGFsd2F5cyBzdGFydCBpbiBJRkJfRmlyc3REZXNjW3R4X3J4X2ZsYWddCiAqIGFuZCB0aGlzIGlzIGFsd2F5cyB0aGUgImN1cnJlbnQiIERFTFdBIERlc2NyaXB0b3IuCiAqCiAqIElmIGEgRnJhbWVMaXN0IGlzIGF2YWlsYWJsZSwgdGhlIGxhc3QgZGVzY3JpcHRvciBvZiB0aGUgRnJhbWVMaXN0IHRvIHR1cm5lZCBpbnRvIGEgbmV3IERFTFdBIERlc2NyaXB0b3I6CiAqICAtIGEgY29weSBpcyBtYWRlIGZyb20gdGhlIGluZm9ybWF0aW9uIGluIHRoZSBsYXN0IGRlc2NyaXB0b3Igb2YgdGhlIEZyYW1lTGlzdCBpbnRvIHRoZSBjdXJyZW50CiAqICAgIERFTFdBIERlc2NyaXB0b3IKICogIC0gdGhlIHJlbWFpbmRlciBvZiB0aGUgRGVzY3JpcHRvckxpc3QgaXMgZGV0YWNoZWQgZnJvbSB0aGUgY29weSBieSBzZXR0aW5nIHRoZSBuZXh0X2Rlc2NfYWRkciBhdCBOVUxMCiAqICAtIHRoZSBETUEgY29udHJvbCBiaXRzIG9mIHRoZSBjb3B5IGFyZSBjbGVhcmVkIHRvIGRvIG5vdCBjb25mdXNlIHRoZSBNU0YKICogIC0gdGhlIGNvcHkgb2YgdGhlIGxhc3QgZGVzY3JpcHRvciAoaS5lLiB0aGUgIm9sZCIgREVMV0EgRGVzY3JpcHRvcikgaXMgY2hhaW5lZCB0byB0aGUgcHJldiBEZXNjcmlwdG9yCiAqICAgIG9mIHRoZSBGcmFtZUxpc3QsIHRodXMgcmVwbGFjaW5nIHRoZSBvcmlnaW5hbCBsYXN0IERlc2NyaXB0b3Igb2YgdGhlIEZyYW1lTGlzdC4KICogIC0gSUZCX0ZpcnN0RGVzYyBpcyBjaGFuZ2VkIHRvIHRoZSBhZGRyZXNzIG9mIHRoYXQgcmVwbGFjZWQgKG9yaWdpbmFsKSBsYXN0IGRlc2NyaXB0b3Igb2YgdGhlIEZyYW1lTGlzdCwKICogICAgaS5lLiB0aGUgIm5ldyIgREVMV0EgRGVzY3JpcHRvci4KICoKICogVGhpcyBmdW5jdGlvbiBtYWtlcyBhIGNvcHkgb2YgdGhhdCBsYXN0IGhvc3Qtb3duZWQgZGVzY3JpcHRvciwgc28gdGhlIE1TRiB3aWxsIGdldCBhIGNvcHkgb2YgdGhlIGRlc2NyaXB0b3IuCiAqIE9uIHRvcCBvZiB0aGF0LCBpdCBhZGp1c3RzIERNQSByZWxhdGVkIGZpZWxkcyBpbiB0aGUgSUZCIHN0cnVjdHVyZS4KIC8vIHBlcmZvcm0gYSBjb3B5aW5nLXNjaGVtZSB0byBjaXJjdW12ZW50IHRoZSAnbGFzdCBob3N0IG93bmVkIGRlc2NyaXB0b3IgY2Fubm90IGJlIHJlY2xhaW1lZCcgbGltaXRhdGlvbiBpbXBvc2VkIGJ5IEgyLjUncyBETUEgaGFyZHdhcmUgZGVzaWduCiAvLyBhICdyZWNsYWltIGRlc2NyaXB0b3InIHNob3VsZCBiZSBhdmFpbGFibGUgaW4gdGhlIEhDRjoKICoKICogUmV0dXJuczogYWRkcmVzcyBvZiB0aGUgZmlyc3QgZGVzY3JpcHRvciBvZiB0aGUgRnJhbWVMaXN0CiAqCiA4OiBCZSBjYXJlZnVsIG9uY2UgeW91IHN0YXJ0IHJlLW9yZGVyaW5nIHRoZSBzdGVwcyBpbiB0aGUgY29weSBwcm9jZXNzLCB0aGF0IGl0IHN0aWxsIHdvcmtzIGZvciBjYXNlcwogKiAgIG9mIEZyYW1lTGlzdHMgb2YgMSwgMiBhbmQgbW9yZSB0aGFuIDIgZGVzY3JpcHRvcnMKICoKICogSW5wdXQgcGFyYW1ldGVyczoKICogdHhfcnhfZmxhZyAgICAgIDogc3BlY2lmaWVzICd0cmFuc21pdCcgb3IgJ3JlY2VpdmUnIGRlc2NyaXB0b3IuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkhDRl9TVEFUSUMgREVTQ19TVFJDVCoKZ2V0X2ZyYW1lX2xzdCggSUZCUCBpZmJwLCBpbnQgdHhfcnhfZmxhZyApCnsKCglERVNDX1NUUkNUICpoZWFkID0gaWZicC0+SUZCX0ZpcnN0RGVzY1t0eF9yeF9mbGFnXTsKCURFU0NfU1RSQ1QgKmNvcHksICpwLCAqcHJldjsKCglIQ0ZBU1NFUlQoIHR4X3J4X2ZsYWcgPT0gRE1BX1JYIHx8IHR4X3J4X2ZsYWcgPT0gRE1BX1RYLCB0eF9yeF9mbGFnICk7CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiBGcmFtZUxpc3QKCWlmICggaGVhZCApIHsKCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgc2VhcmNoIGZvciBsYXN0IGRlc2NyaXB0b3Igb2YgZmlyc3QgRnJhbWVMaXN0CgkJcCA9IHByZXYgPSBoZWFkOwoJCXdoaWxlICggKCBwLT5CVUZfU0laRSAmIERFU0NfRU9QICkgPT0gMCAmJiBwLT5uZXh0X2Rlc2NfYWRkciApIHsKCQkJaWYgKCAoIGlmYnAtPklGQl9DbnRsT3B0ICYgRE1BX0VOQUJMRUQgKSA9PSAwICkgeyAgIC8vY2xlYXIgY29udHJvbCBiaXRzIHdoZW4gZGlzYWJsZWQKCQkJCXAtPkJVRl9DTlQgJj0gREVTQ19DTlRfTUFTSzsKCQkJfQoJCQlwcmV2ID0gcDsKCQkJcCA9IHAtPm5leHRfZGVzY19hZGRyOwoJCX0KCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgaWYgRE1BIGVuYWJsZWQKCQlpZiAoIGlmYnAtPklGQl9DbnRsT3B0ICYgRE1BX0VOQUJMRUQgKSB7CgkJCSAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgLiAgaWYgbGFzdCBkZXNjcmlwdG9yIG9mIEZyYW1lTGlzdCBpcyBETUEgb3duZWQKCQkJICAgICAgICAgICAgICAgICAgICAgICAgLy8uICAuICBvciBpZiBGcmFtZUxpc3QgaXMgc2luZ2xlIChERUxXQSkgRGVzY3JpcHRvcgoJCQlpZiAoIHAtPkJVRl9DTlQgJiBERVNDX0RNQV9PV05FRCB8fCBoZWFkLT5uZXh0X2Rlc2NfYWRkciA9PSBOVUxMICkgewoJCQkJICAgICAgICAgICAgICAgIC8vLiAgLiAgLiAgcmVmdXNlIHRvIHJldHVybiBGcmFtZUxpc3QgdG8gY2FsbGVyCgkJCQloZWFkID0gTlVMTDsKCQkJfQoJCX0KCX0KCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lmIHJldHVybmFibGUgRnJhbWVMaXN0IGZvdW5kCglpZiAoIGhlYWQgKSB7CgkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIGlmIEZyYW1lTGlzdCBpcyBzaW5nbGUgKERFTFdBKSBEZXNjcmlwdG9yIChpbXBsaWVzIERNQSBkaXNhYmxlZCkKCQlpZiAoIGhlYWQtPm5leHRfZGVzY19hZGRyID09IE5VTEwgKSB7CgkJCSAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgLiAgY2xlYXIgRGVzY3JpcHRvckxpc3QKCQkJLyo7P2lmYnAtPklGQl9MYXN0RGVzY1t0eF9yeF9mbGFnXSA9Ki8gaWZicC0+SUZCX0ZpcnN0RGVzY1t0eF9yeF9mbGFnXSA9IE5VTEw7CgkJCSAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgZWxzZQoJCX0gZWxzZSB7CgkJCSAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgLiAgc3RyaXAgaGFyZHdhcmUtcmVsYXRlZCBiaXRzIGZyb20gbGFzdCBkZXNjcmlwdG9yCgkJCSAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgLiAgcmVtb3ZlIERFTFdBIERlc2NyaXB0b3IgZnJvbSBoZWFkIG9mIERlc2NyaXB0b3JMaXN0CgkJCWNvcHkgPSBoZWFkOwoJCQloZWFkID0gaGVhZC0+bmV4dF9kZXNjX2FkZHI7CgkJCSAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgIC4gIGV4Y2hhbmdlIGZpcnN0IChDb25maW5lZCkgYW5kIGxhc3QgKHBvc3NpYmx5IGltcHJpc29uZWQpIERlc2NyaXB0b3IKCQkJY29weS0+YnVmX3BoeXNfYWRkciA9IHAtPmJ1Zl9waHlzX2FkZHI7CgkJCWNvcHktPmJ1Zl9hZGRyID0gcC0+YnVmX2FkZHI7CgkJCWNvcHktPkJVRl9TSVpFID0gcC0+QlVGX1NJWkUgJj0gREVTQ19DTlRfTUFTSzsgIC8vZ2V0IHJpZCBvZiBERVNDX0VPUCBhbmQgcG9zc2libHkgREVTQ19TT1AKCQkJY29weS0+QlVGX0NOVCA9IHAtPkJVRl9DTlQgJj0gREVTQ19DTlRfTUFTSzsgICAgLy9nZXQgcmlkIG9mIERFU0NfRE1BX09XTkVECiNpZiAoSENGX0VYVCkgJiBIQ0ZfREVTQ19TVFJDVF9FWFQKCQkJY29weS0+REVTQ19NU0ZTdXAgPSBwLT5ERVNDX01TRlN1cDsKI2VuZGlmIC8vIEhDRl9ERVNDX1NUUkNUX0VYVAoJCQkgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIC4gIHR1cm4gaW50byBhIERFTFdBIERlc2NyaXB0b3IKCQkJcC0+YnVmX2FkZHIgPSBOVUxMOwoJCQkgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIC4gIGNoYWluIGNvcHkgdG8gcHJldiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDgqLwoJCQlwcmV2LT5uZXh0X2Rlc2NfYWRkciA9IGNvcHk7CgkJCSAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgLiAgZGV0YWNoIHJlbWFpbmRlciBvZiB0aGUgRGVzY3JpcHRvckxpc3QgZnJvbSBGcmFtZUxpc3QKCQkJY29weS0+bmV4dF9kZXNjX2FkZHIgPSBOVUxMOwoJCQljb3B5LT5uZXh0X2Rlc2NfcGh5c19hZGRyID0gMHhERUFEMDAwMDsgLy8hIGp1c3QgdG8gYmUgbmljZSwgbm90IHJlYWxseSBuZWVkZWQKCQkJICAgICAgICAgICAgICAgICAgICAgICAgLy8uICAuICBzYXZlIHRoZSBuZXcgc3RhcnQgKGkuZS4gREVMV0EgRGVzY3JpcHRvcikgaW4gSUZCX0ZpcnN0RGVzYwoJCQlpZmJwLT5JRkJfRmlyc3REZXNjW3R4X3J4X2ZsYWddID0gcDsKCQl9CgkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIHN0cmlwIERFU0NfU09QIGZyb20gZmlyc3QgZGVzY3JpcHRvcgoJCWhlYWQtPkJVRl9TSVpFICY9IERFU0NfQ05UX01BU0s7CgkJLy9oZWFkLT5CVUZfQ05UICY9IERFU0NfQ05UX01BU0s7ICBnZXQgcmlkIG9mIERFU0NfRE1BX09XTkVECgkJaGVhZC0+bmV4dF9kZXNjX3BoeXNfYWRkciA9IDB4REVBRDAwMDA7IC8vISBqdXN0IHRvIGJlIG5pY2UsIG5vdCByZWFsbHkgbmVlZGVkCgl9CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gdGhlIGp1c3QgZGV0YWNoZWQgRnJhbWVMaXN0IChpZiBhbnkpCglyZXR1cm4gaGVhZDsKfSAvLyBnZXRfZnJhbWVfbHN0CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBGdW5jdGlvbiBwdXRfZnJhbWVfbHN0CiAqCiAqIFRoaXMgZnVuY3Rpb24KICoKICogUmV0dXJuczogYWRkcmVzcyBvZiB0aGUgZmlyc3QgZGVzY3JpcHRvciBvZiB0aGUgRnJhbWVMaXN0CiAqCiAqIElucHV0IHBhcmFtZXRlcnM6CiAqIHR4X3J4X2ZsYWcgICAgICA6IHNwZWNpZmllcyAndHJhbnNtaXQnIG9yICdyZWNlaXZlJyBkZXNjcmlwdG9yLgogKgogKiBUaGUgZm9sbG93aW5nIGxpc3Qgc2hvdWxkIGJlIGtlcHQgaW4gc3luYyB3aXRoIGhjZl9kbWFfdHgvcnhfcHV0LCBpbiBvcmRlciB0byBnZXQgdGhlbSBpbiB0aGUgV0NJLXNwZWMgISEhIQogKiBBc3NlcnQgZmFpbHMgaWYKICogLSBETUEgaXMgbm90IGVuYWJsZWQKICogLSBkZXNjcmlwdG9yIGxpc3QgaXMgTlVMTAogKiAtIGEgZGVzY3JpcHRvciBpbiB0aGUgZGVzY3JpcHRvciBsaXN0IGlzIG5vdCBkb3VibGUgd29yZCBhbGlnbmVkCiAqIC0gYSBjb3VudCBvZiBzaXplIGZpZWxkIG9mIGEgZGVzY3JpcHRvciBjb250YWlucyBjb250cm9sIGJpdHMsIGkuZS4gYml0cyBpbiB0aGUgaGlnaCBvcmRlciBuaWJibGUuCiAqIC0gdGhlIERFTFdBIGRlc2NyaXB0b3IgaXMgbm90IGEgInNpbmdsZXRvbiIgRGVzY3JpcHRvckxpc3QuCiAqIC0gdGhlIERFTFdBIGRlc2NyaXB0b3IgaXMgbm90IHRoZSBmaXJzdCBEZXNjcmlwdG9yIHN1cHBsaWVkCiAqIC0gYSBub25fRE1BIGRlc2NyaXB0b3IgaXMgc3VwcGxpZWQgYmVmb3JlIHRoZSBERUxXQSBEZXNjcmlwdG9yIGlzIHN1cHBsaWVkCiAqIC0gUG9zc2libHkgbW9yZSBjaGVja3MgY291bGQgYmUgYWRkZWQgISEhISEhISEhISEhIQoKICouTk9USUNFCiAqIFRoZSBhc3NlcnRzIG1hcmtlZCB3aXRoICpzYyogYXJlIHJlYWxseSBzYW5pdHkgY2hlY2tzIGZvciB0aGUgSENGLCB0aGV5IGNhbiAoc3VwcG9zZWRseSkgbm90IGJlIGluZmx1ZW5jZWQKICogYnkgaW5jb3JyZWN0IE1TRiBiZWhhdmlvcgoKIC8vIFRoZSBNU0YgaXMgcmVxdWlyZWQgdG8gc3VwcGx5IHRoZSBIQ0Ygd2l0aCBhIHNpbmdsZSBkZXNjcmlwdG9yIGZvciBNU0YgdHggcmVjbGFpbSBwdXJwb3Nlcy4KIC8vIFRoaXMgJ3JlY2xhaW0gZGVzY3JpcHRvcicgY2FuIGJlIHJlY29nbml6ZWQgYnkgdGhlIGZhY3QgdGhhdCBpdHMgYnVmX2FkZHIgZmllbGQgaXMgemVyby4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQgZnJvbSBhIGhhcmR3YXJlIHBlcnNwZWN0aXZlOgogKiAtIG1ha2UgZWFjaCBkZXNjcmlwdG9yIGluIHRoaXMgcngtY2hhaW4gRE1BLW93bmVkLgogKiAtIEFsc28gc2V0IHRoZSBjb3VudCB0byB6ZXJvLiBFT1AgYW5kIFNPUCBiaXRzIGFyZSBhbHNvIGNsZWFyZWQuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkhDRl9TVEFUSUMgdm9pZApwdXRfZnJhbWVfbHN0KCBJRkJQIGlmYnAsIERFU0NfU1RSQ1QgKmRlc2NwLCBpbnQgdHhfcnhfZmxhZyApCnsKCURFU0NfU1RSQ1QgICpwID0gZGVzY3A7CgloY2ZfMTYgcG9ydDsKCglIQ0ZBU1NFUlQoIGlmYnAtPklGQl9DbnRsT3B0ICYgVVNFX0RNQSwgaWZicC0+SUZCX0NudGxPcHQpOyAvL29ubHkgaGNmX2RtYV90eF9wdXQgbXVzdCBhbHNvIGJlIERNQV9FTkFCTEVECglIQ0ZBU1NFUlQoIHR4X3J4X2ZsYWcgPT0gRE1BX1JYIHx8IHR4X3J4X2ZsYWcgPT0gRE1BX1RYLCB0eF9yeF9mbGFnICk7CglIQ0ZBU1NFUlQoIHAgLCAwICk7CgoJd2hpbGUgKCBwICkgewoJCUhDRkFTU0VSVCggKChoY2ZfMzIpcCAmIDMgKSA9PSAwLCAoaGNmXzMyKXAgKTsKCQlIQ0ZBU1NFUlQoIChwLT5CVUZfQ05UICYgfkRFU0NfQ05UX01BU0spID09IDAsIHAtPkJVRl9DTlQgKTsKCQlIQ0ZBU1NFUlQoIChwLT5CVUZfU0laRSAmIH5ERVNDX0NOVF9NQVNLKSA9PSAwLCBwLT5CVUZfU0laRSApOwoJCXAtPkJVRl9TSVpFICY9IERFU0NfQ05UX01BU0s7ICAgICAgICAgICAgICAgICAgIC8vISF0aGlzIFNIT1VMRCBiZSBzdXBlcmZsdW91cyBpbiBjYXNlIG9mIGNvcnJlY3QgTVNGCgkJcC0+QlVGX0NOVCAmPSB0eF9yeF9mbGFnID09IERNQV9SWCA/IDAgOiBERVNDX0NOVF9NQVNLOyAvLyEhdGhpcyBTSE9VTEQgYmUgc3VwZXJmbHVvdXMgaW4gY2FzZSBvZiBjb3JyZWN0IE1TRgoJCXAtPkJVRl9DTlQgfD0gREVTQ19ETUFfT1dORUQ7CgkJaWYgKCBwLT5uZXh0X2Rlc2NfYWRkciApIHsKLy8JCQlIQ0ZBU1NFUlQoIHAtPmJ1Zl9hZGRyICYmIHAtPmJ1Zl9waHlzX2FkZHIgICYmIHAtPkJVRl9TSVpFICYmICsvLSBwLT5CVUZfU0laRSwgLi4uICk7CgkJCUhDRkFTU0VSVCggcC0+bmV4dF9kZXNjX2FkZHItPmRlc2NfcGh5c19hZGRyLCAoaGNmXzMyKXAtPm5leHRfZGVzY19hZGRyICk7CgkJCXAtPm5leHRfZGVzY19waHlzX2FkZHIgPSBwLT5uZXh0X2Rlc2NfYWRkci0+ZGVzY19waHlzX2FkZHI7CgkJfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLwoJCQlwLT5uZXh0X2Rlc2NfcGh5c19hZGRyID0gMDsKCQkJaWYgKCBwLT5idWZfYWRkciA9PSBOVUxMICkgeyAgICAgICAgICAgIC8vIERFTFdBIERlc2NyaXB0b3IKCQkJCUhDRkFTU0VSVCggZGVzY3AgPT0gcCwgKGhjZl8zMilkZXNjcCApOyAgLy9zaW5nbGV0b24gRGVzY3JpcHRvckxpc3QKCQkJCUhDRkFTU0VSVCggaWZicC0+SUZCX0ZpcnN0RGVzY1t0eF9yeF9mbGFnXSA9PSBOVUxMLCAoaGNmXzMyKWlmYnAtPklGQl9GaXJzdERlc2NbdHhfcnhfZmxhZ10pOwoJCQkJSENGQVNTRVJUKCBpZmJwLT5JRkJfTGFzdERlc2NbdHhfcnhfZmxhZ10gPT0gTlVMTCwgKGhjZl8zMilpZmJwLT5JRkJfTGFzdERlc2NbdHhfcnhfZmxhZ10pOwoJCQkJZGVzY3AtPkJVRl9DTlQgPSAwOyAvLyY9IH5ERVNDX0RNQV9PV05FRDsKCQkJCWlmYnAtPklGQl9GaXJzdERlc2NbdHhfcnhfZmxhZ10gPSBkZXNjcDsKLy8gcGFydCBvZiBhbHRlcm5hdGl2ZSBpZmJwLT5JRkJfTGFzdERlc2NbdHhfcnhfZmxhZ10gPSBpZmJwLT5JRkJfRmlyc3REZXNjW3R4X3J4X2ZsYWddID0gZGVzY3A7CgkJCQkgICAgICAgICAgICAgICAgLy8gaWYgInJlY3ljbGluZyIgYSBGcmFtZUxpc3QKCQkJCSAgICAgICAgICAgICAgICAvLyAoZS5nLiBjYWxsZWQgZnJvbSBoY2ZfY250bCggSENGX0NOVExfRU5BQkxFICkKCQkJCSAgICAgICAgICAgICAgICAvLyAuICBwcmVwYXJlIGZvciBhY3RpdmF0aW9uIERNQSBjb250cm9sbGVyCi8vIHBhcnQgb2YgYWx0ZXJuYXRpdmUgZGVzY3AgPSBkZXNjcC0+bmV4dF9kZXNjX2FkZHI7CgkJCX0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2EgInJlYWwiIEZyYW1lTGlzdCwgaGFuZCBpdCBvdmVyIHRvIHRoZSBETUEgZW5naW5lCgkJCQlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9GaXJzdERlc2NbdHhfcnhfZmxhZ10sIChoY2ZfMzIpZGVzY3AgKTsKCQkJCUhDRkFTU0VSVCggaWZicC0+SUZCX0xhc3REZXNjW3R4X3J4X2ZsYWddLCAoaGNmXzMyKWRlc2NwICk7CgkJCQlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9MYXN0RGVzY1t0eF9yeF9mbGFnXS0+bmV4dF9kZXNjX2FkZHIgPT0gTlVMTCwKCQkJCQkgICAoaGNmXzMyKWlmYnAtPklGQl9MYXN0RGVzY1t0eF9yeF9mbGFnXS0+bmV4dF9kZXNjX2FkZHIpOwovLwkJCQlwLT5idWZfY250bC5jbnRsX3N0YXQgfD0gREVTQ19ETUFfT1dORUQ7CgkJCQlpZmJwLT5JRkJfTGFzdERlc2NbdHhfcnhfZmxhZ10tPm5leHRfZGVzY19hZGRyID0gZGVzY3A7CgkJCQlpZmJwLT5JRkJfTGFzdERlc2NbdHhfcnhfZmxhZ10tPm5leHRfZGVzY19waHlzX2FkZHIgPSBkZXNjcC0+ZGVzY19waHlzX2FkZHI7CgkJCQlwb3J0ID0gSFJFR19SWERNQV9QVFIzMjsKCQkJCWlmICggdHhfcnhfZmxhZyApIHsKCQkJCQlwLT5CVUZfU0laRSB8PSBERVNDX0VPUDsgICAgLy8gcCBwb2ludHMgYXQgdGhlIGxhc3QgZGVzY3JpcHRvciBpbiB0aGUgY2FsbGVyLXN1cHBsaWVkIGRlc2NyaXB0b3IgY2hhaW4KCQkJCQlkZXNjcC0+QlVGX1NJWkUgfD0gREVTQ19TT1A7CgkJCQkJcG9ydCA9IEhSRUdfVFhETUFfUFRSMzI7CgkJCQl9CgkJCQlPVVRfUE9SVF9EV09SRCggKGlmYnAtPklGQl9JT0Jhc2UgKyBwb3J0KSwgZGVzY3AtPmRlc2NfcGh5c19hZGRyICk7CgkJCX0KCQkJaWZicC0+SUZCX0xhc3REZXNjW3R4X3J4X2ZsYWddID0gcDsKCQl9CgkJcCA9IHAtPm5leHRfZGVzY19hZGRyOwoJfQp9IC8vIHB1dF9mcmFtZV9sc3QKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqLk1PRFVMRSAgICAgICAgREVTQ19TVFJDVCogaGNmX2RtYV9yeF9nZXQoIElGQlAgaWZicCApCiAqLlBVUlBPU0UgICAgICAgZGVjYXBzdWxhdGUgYSBtZXNzYWdlIGFuZCBwcm92aWRlcyB0aGF0IG1lc3NhZ2UgdG8gdGhlIE1TRi4KICogICAgICAgICAgICAgICByZWNsYWltIGFsbCBkZXNjcmlwdG9ycyBpbiB0aGUgcnggZGVzY3JpcHRvciBjaGFpbi4KICoKICouQVJHVU1FTlRTCiAqICAgaWZicCAgICAgICAgYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCiAqCiAqLlJFVFVSTlMKICogICBwb2ludGVyIHRvIGEgRnJhbWVMaXN0CiAqCiAqLkRFU0NSSVBUSU9OCiAqIGhjZl9kbWFfcnhfZ2V0IGlzIGludGVuZGVkIHRvICByZXR1cm4gYSByZWNlaXZlZCBmcmFtZSB3aGVuIHN1Y2ggYSBmcmFtZSBpcyBkZXBvc2l0ZWQgaW4gSG9zdCBtZW1vcnkgYnkgdGhlCiAqIERNQSBlbmdpbmUuIEluIGFkZGl0aW9uIGhjZl9kbWFfcnhfZ2V0IGNhbiBiZSB1c2VkIHRvIHJlY2xhaW0gYWxsIGRlc2NyaXB0b3JzIGluIHRoZSByeCBkZXNjcmlwdG9yIGNoYWluCiAqIHdoZW4gdGhlIERNQSBFbmdpbmUgaXMgZGlzYWJsZWQsIGUuZy4gYXMgcGFydCBvZiBhIGRyaXZlciB1bmxvYWRpbmcgc3RyYXRlZ3kuCiAqIGhjZl9kbWFfcnhfZ2V0IG11c3QgYmUgY2FsbGVkIHJlcGVhdGVkbHkgYnkgdGhlIE1TRiB3aGVuIGhjZl9zZXJ2aWNlX25pYyBzaWduYWxzIGF2YWlsYWJpbGl0eSBvZiBhIHJ4IGZyYW1lCiAqIHRocm91Z2ggdGhlIEhSRUdfRVZfUkRNQUQgZmxhZyBvZiBJRkJfRG1hUGFja2V0cy4gVGhlIGNhbGxpbmcgbXVzdCBzdG9wIHdoZW4gYSBOVUxMIHBvaW50ZXIgaXMgcmV0dXJuZWQsIGF0CiAqIHdoaWNoIHRpbWUgdGhlIEhSRUdfRVZfUkRNQUQgZmxhZyBpcyBhbHNvIGNsZWFyZWQgYnkgdGhlIEhDRiB0byBhcm0gdGhlIG1lY2hhbmlzbSBmb3IgdGhlIG5leHQgZnJhbWUKICogcmVjZXB0aW9uLgogKiBSZWdhcmRsZXNzIHdoZXRoZXIgdGhlIERNQSBFbmdpbmUgaXMgY3VycmVudGx5IGVuYWJsZWQgKGFzIGNvbnRyb2xsZWQgdmlhIGhjZl9jbnRsKSwgaWYgdGhlIERNQSBjb250cm9sbGVyCiAqIGRlcG9zaXRlZCBhbiBSeC1mcmFtZSBpbiB0aGUgUngtRGVzY3JpcHRvckxpc3QsIHRoaXMgZnJhbWUgaXMgZGV0YWNoZWQgZnJvbSB0aGUgUngtRGVzY3JpcHRvckxpc3QsCiAqIHRyYW5zZm9ybWVkIGludG8gYSBGcmFtZUxpc3QgKGkuZS4gIHVwZGF0aW5nIHRoZSBob3VzZWtlZXBpbmcgZmllbGRzIGluIHRoZSBkZXNjcmlwdG9ycykgYW5kIHJldHVybmVkIHRvIHRoZQogKiBjYWxsZXIuCiAqIElmIG5vIHN1Y2ggUngtZnJhbWUgaXMgYXZhaWxhYmxlIGluIHRoZSBSeC1EZXNjcmlwdG9yTGlzdCwgdGhlIGJlaGF2aW9yIG9mIGhjZl9kbWFfcnhfZ2V0IGRlcGVuZHMgb24gdGhlCiAqIHN0YXR1cyBvZiB0aGUgRE1BIEVuZ2luZS4KICogSWYgdGhlIERNQSBFbmdpbmUgaXMgZW5hYmxlZCwgYSBOVUxMIHBvaW50ZXIgaXMgcmV0dXJuZWQuCiAqIElmIHRoZSBETUEgRW5naW5lIGlzIGRpc2FibGVkLCB0aGUgZm9sbG93aW5nIHN0cmF0ZWd5IGlzIHVzZWQ6CiAqIC0gdGhlIGNvbXBsZXRlIFJ4LURlc2NyaXB0b3JMaXN0IGlzIHJldHVybmVkLiBUaGUgREVMV0EgRGVzY3JpcHRvciBpcyBub3QgcGFydCBvZiB0aGUgUngtRGVzY3JpcHRvckxpc3QuCiAqIC0gSWYgdGhlcmUgaXMgbm8gUngtRGVzY3JpcHRvckxpc3QsIHRoZSBERUxXQSBEZXNjcmlwdG9yIGlzIHJldHVybmVkLgogKiAtIElmIHRoZXJlIGlzIG5vIERFTFdBIERlc2NyaXB0b3IsIGEgTlVMTCBwb2ludGVyIGlzIHJldHVybmVkLgogKgogKiBJZiB0aGUgTVNGIHBlcmZvcm1zIGFuIGRpc2FibGUvZW5hYmxlIHNlcXVlbmNlIHdpdGhvdXQgZXhoYXVzdGluZyB0aGUgUngtRGVzY3JpcHRvckxpc3QgYXMgZGVzY3JpYmVkIGFib3ZlLAogKiB0aGUgZW5hYmxlIGNvbW1hbmQgd2lsbCByZXNldCBhbGwgaG91c2Uga2VlcGluZyBpbmZvcm1hdGlvbiwgaS5lLiBhbHJlYWR5IHJlY2VpdmVkIGJ1dCBub3QgeWV0IGJ5IHRoZSBNU0YKICogcmV0cmlldmVkIGZyYW1lcyBhcmUgbG9zdCBhbmQgdGhlIG5leHQgZnJhbWUgd2lsbCBiZSByZWNlaXZlZCBzdGFydGluZyB3aXRoIHRoZSBvbGRlc3QgZGVzY3JpcHRvci4KICoKICogVGhlIEhDRiBjYW4gYmUgdXNlZCBpbiAyIGZhc2hpb25zOiB3aXRoIGFuZCB3aXRob3V0IGRlY2Fwc3VsYXRpb24gZm9yIGRhdGEgdHJhbnNmZXIuCiAqIFRoaXMgaXMgY29udHJvbGxlZCBhdCBjb21waWxlIHRpbWUgYnkgdGhlIEhDRl9FTkMgYml0IG9mIHRoZSBIQ0ZfRU5DQVAgc3lzdGVtIGNvbnN0YW50LgogKiBJZiBhcHByb3ByaWF0ZSwgZGVjYXBzdWxhdGlvbiBpcyBkb25lIGJ5IG1vdmluZyBzb21lIGRhdGEgaW5zaWRlIHRoZSBidWZmZXJzIGFuZCB1cGRhdGluZyB0aGUgZGVzY3JpcHRvcnMKICogYWNjb3JkaW5nbHkuCiAqISEgOz8/Pz8/d2hlcmUgZGlkIEkgZGVzY3JpYmUgd2h5IGEgc2ltcGxlIG1hbmlwdWxhdGlvbiB3aXRoIHRoZSBjb3VudCB2YWx1ZXMgZG9lcyBub3Qgc3VmZmljZT8KICoKICouRElBR1JBTQogKgogKi5FTkRET0MgICAgICAgICAgICAgICAgRU5EIERPQ1VNRU5UQVRJT04KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCkRFU0NfU1RSQ1QqCmhjZl9kbWFfcnhfZ2V0IChJRkJQIGlmYnApCnsKCURFU0NfU1RSQ1QgKmRlc2NwOyAgLy8gcG9pbnRlciB0byBzdGFydCBvZiBGcmFtZUxpc3QKCglkZXNjcCA9IGdldF9mcmFtZV9sc3QoIGlmYnAsIERNQV9SWCApOwoJaWYgKCBkZXNjcCAmJiBkZXNjcC0+YnVmX2FkZHIgKSB7CgoJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9za2lwIGRlY2Fwc3VsYXRpb24gYXQgY29uZmluZWQgZGVzY3JpcHRvcgojaWYgKEhDRl9FTkNBUCkgPT0gSENGX0VOQwoJCWludCBpOwoJCURFU0NfU1RSQ1QgKnAgPSBkZXNjcC0+bmV4dF9kZXNjX2FkZHI7ICAvL3BvaW50ZXIgdG8gMm5kIGRlc2NyaXB0b3Igb2YgZnJhbWUKCQlIQ0ZBU1NFUlQocCwgMCk7CgkJLy8gVGhlIDJuZCBkZXNjcmlwdG9yIGNvbnRhaW5zIChtYXliZSkgYSBTTkFQIGhlYWRlciBwbHVzIHBhcnQgb3Igd2hvbGUgb2YgdGhlIHBheWxvYWQuCgkJLy9kZXRlcm1pbmUgZGVjYXBzdWxhdGlvbiBzdWItZmxhZyBpbiBSeEZTCgkJaSA9ICood2NpX3JlY29yZHApJmRlc2NwLT5idWZfYWRkcltIRlNfU1RBVF0gJiAoIEhGU19TVEFUX01TR19UWVBFIHwgSEZTX1NUQVRfRVJSICk7CgkJaWYgKCBpID09IEhGU19TVEFUX1RVTk5FTCB8fAoJCSAgICAgKCBpID09IEhGU19TVEFUXzEwNDIgJiYgaGNmX2VuY2FwKCAod2NpX2J1ZnApJnAtPmJ1Zl9hZGRyW0hDRl9EQVNBX1NJWkVdICkgIT0gRU5DX1RVTk5FTCApKSB7CgkJCS8vIFRoZSAybmQgZGVzY3JpcHRvciBjb250YWlucyBhIFNOQVAgaGVhZGVyIHBsdXMgcGFydCBvciB3aG9sZSBvZiB0aGUgcGF5bG9hZC4KCQkJSENGQVNTRVJUKCBwLT5CVUZfQ05UID09IChwLT5idWZfYWRkcls1XSArIChwLT5idWZfYWRkcls0XTw8OCkgKyAyKjYgKyAyIC0gOCksIHAtPkJVRl9DTlQgKTsKCQkJLy8gcGVyZm9ybSBkZWNhcHN1bGF0aW9uCgkJCUhDRkFTU0VSVChwLT5CVUZfU0laRSA+PTgsIHAtPkJVRl9TSVpFKTsKCQkJLy8gbW92ZSBTQVsyOjVdIGluIHRoZSBzZWNvbmQgYnVmZmVyIHRvIHJlcGxhY2UgcGFydCBvZiB0aGUgU05BUCBoZWFkZXIKCQkJZm9yICggaT0zOyBpID49IDA7IGktLSkgcC0+YnVmX2FkZHJbaSs4XSA9IHAtPmJ1Zl9hZGRyW2ldOwoJCQkvLyBjb3B5IERBWzA6NV0sIFNBWzA6MV0gZnJvbSBmaXJzdCBidWZmZXIgdG8gc2Vjb25kIGJ1ZmZlcgoJCQlmb3IgKCBpPTA7IGk8ODsgaSsrKSBwLT5idWZfYWRkcltpXSA9IGRlc2NwLT5idWZfYWRkcltIRlNfQUREUl9ERVNUICsgaV07CgkJCS8vIG1ha2UgZmlyc3QgYnVmZmVyIHNob3J0ZXIgaW4gY291bnQKCQkJZGVzY3AtPkJVRl9DTlQgPSBIRlNfQUREUl9ERVNUOwoJCX0KCX0KI2VuZGlmIC8vIEhDRl9FTkMKCWlmICggZGVzY3AgPT0gTlVMTCApIGlmYnAtPklGQl9EbWFQYWNrZXRzICY9IChoY2ZfMTYpfkhSRUdfRVZfUkRNQUQ7ICAvLzs/Y291bGQgYmUgaW50ZWdyYXRlZCBpbnRvIGdldF9mcmFtZV9sc3QKCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9ETUFfUlhfR0VUICk7CglyZXR1cm4gZGVzY3A7Cn0gLy8gaGNmX2RtYV9yeF9nZXQKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqLk1PRFVMRSAgICAgICAgdm9pZCBoY2ZfZG1hX3J4X3B1dCggSUZCUCBpZmJwLCBERVNDX1NUUkNUICpkZXNjcCApCiAqLlBVUlBPU0UgICAgICAgc3VwcGx5IGJ1ZmZlcnMgZm9yIHJlY2VpdmUgcHVycG9zZXMuCiAqICAgICAgICAgICAgICAgc3VwcGx5IHRoZSBSeC1ERUxXQSBkZXNjcmlwdG9yLgogKgogKi5BUkdVTUVOVFMKICogICBpZmJwICAgICAgICBhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKICogICBkZXNjcCAgICAgICBhZGRyZXNzIG9mIGEgRGVzY3JpcHRvckxpc3QKICoKICouUkVUVVJOUyAgICAgICBOLkEuCiAqCiAqLkRFU0NSSVBUSU9OCiAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBNU0YgdG8gc3VwcGx5IHRoZSBIQ0Ygd2l0aCBuZXcvbW9yZSBidWZmZXJzIGZvciByZWNlaXZlIHB1cnBvc2VzLgogKiBUaGUgSENGIGNhbiBiZSB1c2VkIGluIDIgZmFzaGlvbnM6IHdpdGggYW5kIHdpdGhvdXQgZW5jYXBzdWxhdGlvbiBmb3IgZGF0YSB0cmFuc2Zlci4KICogVGhpcyBpcyBjb250cm9sbGVkIGF0IGNvbXBpbGUgdGltZSBieSB0aGUgSENGX0VOQyBiaXQgb2YgdGhlIEhDRl9FTkNBUCBzeXN0ZW0gY29uc3RhbnQuCiAqIEFzIGEgY29uc2VxdWVuY2UsIHNvbWUgYWRkaXRpb25hbCBjb25zdHJhaW50cyBhcHBseSB0byB0aGUgbnVtYmVyIG9mIGRlc2NyaXB0b3IgYW5kIHRoZSBidWZmZXJzIGFzc29jaWF0ZWQKICogd2l0aCB0aGUgZmlyc3QgMiBkZXNjcmlwdG9ycy4gSW5kZXBlbmRlbnQgb2YgdGhlIGVuY2Fwc3VsYXRpb24gZmVhdHVyZSwgdGhlIENPVU5UIGZpZWxkcyBhcmUgaWdub3JlZC4KICogQSBzcGVjaWFsIGNhc2UgaXMgdGhlIHN1cHBseWluZyBvZiB0aGUgREVMV0EgZGVzY3JpcHRvciwgd2hpY2ggbXVzdCBiZSBzdXBwbGllZCBhcyB0aGUgZmlyc3QgZGVzY3JpcHRvci4KICoKICogQXNzZXJ0IGZhaWxzIGlmCiAqIC0gaWZicCBoYXMgYSByZWNvZ25pemFibGUgb3V0LW9mLXJhbmdlIHZhbHVlLgogKiAtIE5JQyBpbnRlcnJ1cHRzIGFyZSBub3QgZGlzYWJsZWQgd2hpbGUgcmVxdWlyZWQgYnkgcGFyYW1ldGVyIGFjdGlvbi4KICogLSBpbiBjYXNlIGRlY2Fwc3VsYXRpb24gYnkgdGhlIEhDRiBpcyBzZWxlY3RlZDoKICogICAgIC0gVGhlIGZpcnN0IGRhdGFidWZmZXIgZG9lcyBub3QgaGF2ZSB0aGUgZXhhY3Qgc2l6ZSBjb3JyZXNwb25kaW5nIHdpdGggdGhlIFJ4RlMgdXAgdG8gdGhlIDgwMi4zIERlc3RBZGRyCiAqICAgICAgIGZpZWxkICg9PSAyOSB3b3JkcykuCiAqICAgICAtIFRoZSBGcmFtZUxpc3QgZG9lcyBub3QgY29uc2lzdHMgb2YgYXQgbGVhc3QgMiBEZXNjcmlwdG9ycy4KICogICAgIC0gVGhlIHNlY29uZCBkYXRhYnVmZmVyIGRvZXMgbm90IGhhdmUgdGhlIG1pbmltdW0gc2l6ZSBvZiA4IGJ5dGVzLgogKiEhIFRoZSAybmQgcGFydCBvZiB0aGUgbGlzdCBvZiBhc3NlcnRzIHNob3VsZCBiZSBrZXB0IGluIHN5bmMgd2l0aCBwdXRfZnJhbWVfbHN0LCBpbiBvcmRlciB0byBnZXQKICohISB0aGVtIGluIHRoZSBXQ0ktc3BlYyAhISEhCiAqIC0gRE1BIGlzIG5vdCBlbmFibGVkCiAqIC0gZGVzY3JpcHRvciBsaXN0IGlzIE5VTEwKICogLSBhIGRlc2NyaXB0b3IgaW4gdGhlIGRlc2NyaXB0b3IgbGlzdCBpcyBub3QgZG91YmxlIHdvcmQgYWxpZ25lZAogKiAtIGEgY291bnQgb2Ygc2l6ZSBmaWVsZCBvZiBhIGRlc2NyaXB0b3IgY29udGFpbnMgY29udHJvbCBiaXRzLCBpLmUuIGJpdHMgaW4gdGhlIGhpZ2ggb3JkZXIgbmliYmxlLgogKiAtIHRoZSBERUxXQSBkZXNjcmlwdG9yIGlzIG5vdCBhICJzaW5nbGV0b24iIERlc2NyaXB0b3JMaXN0LgogKiAtIHRoZSBERUxXQSBkZXNjcmlwdG9yIGlzIG5vdCB0aGUgZmlyc3QgRGVzY3JpcHRvciBzdXBwbGllZAogKiAtIGEgbm9uX0RNQSBkZXNjcmlwdG9yIGlzIHN1cHBsaWVkIGJlZm9yZSB0aGUgREVMV0EgRGVzY3JpcHRvciBpcyBzdXBwbGllZAogKiEhIC0gUG9zc2libHkgbW9yZSBjaGVja3MgY291bGQgYmUgYWRkZWQgISEhISEhISEhISEhIQogKgogKi5ESUFHUkFNCiAqCiAqCiAqLkVORERPQyAgICAgICAgICAgICAgICBFTkQgRE9DVU1FTlRBVElPTgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkCmhjZl9kbWFfcnhfcHV0KCBJRkJQIGlmYnAsIERFU0NfU1RSQ1QgKmRlc2NwICkKewoKCUhDRkxPR0VOVFJZKCBIQ0ZfVFJBQ0VfRE1BX1JYX1BVVCwgMHhEQTAxICk7CglIQ0ZBU1NFUlQoIGlmYnAtPklGQl9NYWdpYyA9PSBIQ0ZfTUFHSUMsIGlmYnAtPklGQl9NYWdpYyApOwoJSENGQVNTRVJUX0lOVDsKCglwdXRfZnJhbWVfbHN0KCBpZmJwLCBkZXNjcCwgRE1BX1JYICk7CiNpZiBIQ0ZfQVNTRVJUICYmIChIQ0ZfRU5DQVApID09IEhDRl9FTkMKCWlmICggZGVzY3AtPmJ1Zl9hZGRyICkgewoJCUhDRkFTU0VSVCggZGVzY3AtPkJVRl9TSVpFID09IEhDRl9ETUFfUlhfQlVGMV9TSVpFLCBkZXNjcC0+QlVGX1NJWkUgKTsKCQlIQ0ZBU1NFUlQoIGRlc2NwLT5uZXh0X2Rlc2NfYWRkciwgMCApOyAvLyBmaXJzdCBkZXNjcmlwdG9yIHNob3VsZCBiZSBmb2xsb3dlZCBieSBhbm90aGVyIGRlc2NyaXB0b3IKCQkvLyBUaGUgc2Vjb25kIERCIGlzIGZvciBTTkFQIGFuZCBwYXlsb2FkIHB1cnBvc2VzLiBJdCBzaG91bGQgYmUgYSBtaW5pbXVtIG9mIDEyIGJ5dGVzIGluIHNpemUuCgkJSENGQVNTRVJUKCBkZXNjcC0+bmV4dF9kZXNjX2FkZHItPkJVRl9TSVpFID49IDEyLCBkZXNjcC0+bmV4dF9kZXNjX2FkZHItPkJVRl9TSVpFICk7Cgl9CiNlbmRpZiAvLyBIQ0ZBU1NFUlQgLyBIQ0ZfRU5DCglIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfRE1BX1JYX1BVVCApOwp9IC8vIGhjZl9kbWFfcnhfcHV0CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKi5NT0RVTEUgICAgICAgIERFU0NfU1RSQ1QqIGhjZl9kbWFfdHhfZ2V0KCBJRkJQIGlmYnAgKQogKi5QVVJQT1NFICAgICAgIERNQSBtb2RlOiByZWNsYWltcyBhbmQgZGVjYXBzdWxhdGVzIHBhY2tldHMgaW4gdGhlIHR4IGRlc2NyaXB0b3IgY2hhaW4gaWY6CiAqICAgICAgICAgICAgICAgIC0gQSBUeCBwYWNrZXQgaGFzIGJlZW4gY29waWVkIGZyb20gaG9zdC1SQU0gaW50byBOSUMtUkFNIGJ5IHRoZSBETUEgZW5naW5lCiAqICAgICAgICAgICAgICAgIC0gVGhlIEhlcm1lcy9ETUFlbmdpbmUgaGF2ZSBiZWVuIGRpc2FibGVkCiAqCiAqLkFSR1VNRU5UUwogKiAgIGlmYnAgICAgICAgIGFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawogKgogKi5SRVRVUk5TCiAqICAgcG9pbnRlciB0byBhIHJlY2xhaW1lZCBUeCBwYWNrZXQuCiAqCiAqLkRFU0NSSVBUSU9OCiAqIGltcGFjdCBvZiB0aGUgZGlzYWJsZSBjb21tYW5kOgogKiBXaGVuIGEgbm9uLWVtcHR5IHBvb2wgb2YgVHggZGVzY3JpcHRvcnMgZXhpc3RzIChjcmVhdGVkIGJ5IG1lYW5zIG9mIGhjZl9kbWFfcHV0X3R4KSwgdGhlIE1TRgogKiBpcyBzdXBwb3NlZCB0byBlbXB0eSB0aGF0IHBvb2wgYnkgbWVhbnMgb2YgaGNmX2RtYV90eF9nZXQgY2FsbHMgYWZ0ZXIgdGhlIGRpc2FibGUgaW4gYW4KICogZGlzYWJsZS9lbmFibGUgc2VxdWVuY2UuCiAqCiAqLkRJQUdSQU0KICoKICouTk9USUNFCiAqCiAqLkVORERPQyAgICAgICAgICAgICAgICBFTkQgRE9DVU1FTlRBVElPTgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpERVNDX1NUUkNUKgpoY2ZfZG1hX3R4X2dldCggSUZCUCBpZmJwICkKewoJREVTQ19TVFJDVCAqZGVzY3A7ICAvLyBwb2ludGVyIHRvIHN0YXJ0IG9mIEZyYW1lTGlzdAoKCWRlc2NwID0gZ2V0X2ZyYW1lX2xzdCggaWZicCwgRE1BX1RYICk7CglpZiAoIGRlc2NwICYmIGRlc2NwLT5idWZfYWRkciApIHsKCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vc2tpcCBkZWNhcHN1bGF0aW9uIGF0IGNvbmZpbmVkIGRlc2NyaXB0b3IKI2lmIChIQ0ZfRU5DQVApID09IEhDRl9FTkMKCQlpZiAoICggZGVzY3AtPkJVRl9DTlQgPT0gSEZTX1RZUEUgKSkgewoJCQkvLyBwZXJmb3JtIGRlY2Fwc3VsYXRpb24gaWYgbmVlZGVkCgkJCWRlc2NwLT5uZXh0X2Rlc2NfYWRkci0+YnVmX3BoeXNfYWRkciAtPSBIQ0ZfREFTQV9TSVpFOwoJCQlkZXNjcC0+bmV4dF9kZXNjX2FkZHItPkJVRl9DTlQgICAgICAgKz0gSENGX0RBU0FfU0laRTsKCQl9CiNlbmRpZiAvLyBIQ0ZfRU5DCgl9CglpZiAoIGRlc2NwID09IE5VTEwgKSB7ICAvLzs/Y291bGQgYmUgaW50ZWdyYXRlZCBpbnRvIGdldF9mcmFtZV9sc3QKCQlpZmJwLT5JRkJfRG1hUGFja2V0cyAmPSAoaGNmXzE2KX5IUkVHX0VWX1RETUFEOwoJfQoJSENGTE9HRVhJVCggSENGX1RSQUNFX0RNQV9UWF9HRVQgKTsKCXJldHVybiBkZXNjcDsKfSAvLyBoY2ZfZG1hX3R4X2dldAoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICouTU9EVUxFICAgICAgICB2b2lkIGhjZl9kbWFfdHhfcHV0KCBJRkJQIGlmYnAsIERFU0NfU1RSQ1QgKmRlc2NwLCBoY2ZfMTYgdHhfY250bCApCiAqLlBVUlBPU0UgICAgICAgcHV0cyBhIHBhY2tldCBpbiB0aGUgVHggRE1BIHF1ZXVlIGluIGhvc3QgcmFtIGFuZCBraWNrcyBvZmYgdGhlIFR4RG1hIGVuZ2luZS4KICogICAgICAgICAgICAgICBzdXBwbHkgdGhlIFR4LURFTFdBIGRlc2NyaXB0b3IuCiAqCiAqLkFSR1VNRU5UUwogKiAgIGlmYnAgICAgICAgIGFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawogKiAgIGRlc2NwICAgICAgIGFkZHJlc3Mgb2YgVHggRGVzY3JpcHRvciBDaGFpbiAoaS5lLiBhIHNpbmdsZSBUeCBmcmFtZSkKICogICB0eF9jbnRsICAgICBpbmRpY2F0ZXMgTUFDLXBvcnQgYW5kIChIZXJtZXMpIG9wdGlvbnMKICoKICouUkVUVVJOUyAgICAgICBOLkEuCiAqCiAqLkRFU0NSSVBUSU9OCiAqIFRoZSBIQ0YgY2FuIGJlIHVzZWQgaW4gMiBmYXNoaW9uczogd2l0aCBhbmQgd2l0aG91dCBlbmNhcHN1bGF0aW9uIGZvciBkYXRhIHRyYW5zZmVyLgogKiBUaGlzIGlzIGNvbnRyb2xsZWQgYXQgY29tcGlsZSB0aW1lIGJ5IHRoZSBIQ0ZfRU5DIGJpdCBvZiB0aGUgSENGX0VOQ0FQIHN5c3RlbSBjb25zdGFudC4KICoKICogUmVnYXJkbGVzcyBvZiB0aGUgSENGX0VOQ0FQIHN5c3RlbSBjb25zdGFudCwgdGhlIGRlc2NyaXB0b3IgbGlzdCBjcmVhdGVkIHRvIGRlc2NyaWJlIHRoZSBmcmFtZSB0byBiZQogKiB0cmFuc21pdHRlZCwgbXVzdCBzdXBwbHkgc3BhY2UgdG8gY29udGFpbiB0aGUgODAyLjExIGhlYWRlciwgcHJlY2VkaW5nIHRoZSBhY3R1YWwgZnJhbWUgdG8gYmUgdHJhbnNtaXR0ZWQuCiAqIEJhc2ljYWxseSwgdGhpcyBvbmx5IHN1cHBsaWVzIHdvcmtpbmcgc3RvcmFnZSB0byB0aGUgSENGIHdoaWNoIHBhc3NlcyB0aGlzIG9uIHRvIHRoZSBETUEgZW5naW5lLgogKiBBcyBhIGNvbnNlcXVlbmNlIHRoZSBjb250ZW50cyBvZiB0aGlzIHNwYWNlIGRvIG5vdCBtYXR0ZXIuCiAqIE5ldmVydGhlbGVzcyBCVUZfQ05UIG11c3QgdGFrZSBpbiBhY2NvdW50IHRoaXMgc3RvcmFnZS4KICogVGhpcyB3b3JraW5nIHNwYWNlIHRvIGNvbnRhaW4gdGhlIDgwMi4xMSBoZWFkZXIgbWF5IG5vdCBiZSBmcmFnbWVudGVkLCB0aGUgZmlyc3QgYnVmZmVyIG11c3QgYmUKICogc3VmZmljaWVudGx5IGxhcmdlIHRvIGNvbnRhaW4gYXQgbGVhc3QgdGhlIDgwMi4xMSBoZWFkZXIsIGkuZS4gSEZTX0FERFJfREVTVCAoMjkgd29yZHMgb3IgMHgzQSBieXRlcykuCiAqIFRoaXMgd2F5LCB0aGUgSENGIGNhbiBzaW1wbHksIHJlZ2FyZGxlc3Mgd2hldGhlciBvciBub3QgdGhlIEhDRiBlbmNhcHN1bGF0ZXMgdGhlIGZyYW1lLCB3cml0ZSB0aGUgcGFyYW1ldGVyCiAqIHR4X2NudGwgYXQgb2Zmc2V0IDB4MzYgKEhGU19UWF9DTlRMKSBpbiB0aGUgZmlyc3QgYnVmZmVyLgogKiBOb3RlIHRoYXQgaXQgaXMgYWxsb3dlZCB0byBoYXZlIHBhcnQgb3IgYWxsIG9mIHRoZSBhY3R1YWwgZnJhbWUgcmVwcmVzZW50ZWQgYnkgdGhlIGZpcnN0IGRlc2NyaXB0b3IgYXMgbG9uZwogKiBhcyB0aGUgcmVxdWlyZW1lbnQgZm9yIHN0b3JhZ2UgZm9yIHRoZSA4MDIuMTEgaGVhZGVyIGlzIG1ldCwgaS5lLiB0aGUgODAyLjMgZnJhbWUgc3RhcnRzIGF0IG9mZnNldAogKiBIRlNfQUREUl9ERVNULgogKiBFeGNlcHQgZm9yIHRoZSBBc3NlcnQgb24gdGhlIDFzdCBidWZmZXIgaW4gY2FzZSBvZiBFbmNhcHN1YWx0aW9uLCB0aGUgU0laRSBmaWVsZHMgYXJlIGlnbm9yZWQuCiAqCiAqIEluIGNhc2UgdGhlIGVuY2Fwc3VsYXRpb24gZmVhdHVyZSBpcyBjb21waWxlZCBpbiwgdGhlcmUgYXJlIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCByZXF1aXJlbWVudHMuCiAqIG8gVGhlIEJVRl9DTlQgb2YgdGhlIGZpcnN0IGJ1ZmZlciBjaGFuZ2VzIGZyb20gYSBtaW5pbXVtIG9mIDB4M0EgYnl0ZXMgdG8gZXhhY3RseSAweDNBLCBpLmUuIHRoZSB3b3Jrc3BhY2UKICogICB0byBzdG9yZSB0aGUgODAyLjExIGhlYWRlcgogKiBvIFRoZSBCVUZfU0laRSBvZiB0aGUgZmlyc3QgYnVmZmVyIGlzIGF0IGxlYXN0IHRoZSBzcGFjZSBuZWVkZWQgdG8gc3RvcmUgdGhlCiAqICAgLSA4MDIuMTEgaGVhZGVyICgyOSB3b3JkcykKICogICAtIDgwMi4zIGhlYWRlciwgaS5lLiAxMiBieXRlcyBhZGRyZXNzaW5nIGluZm9ybWF0aW9uIGFuZCAyIGJ5dGVzIGxlbmd0aCBmaWVsZAogKiAgIC0gNiBieXRlcyBTTkFQLWhlYWRlcgogKiAgIFRoaXMgcmVzdWx0cyBpbiAzOSB3b3JkcyBvciAweDRFIGJ5dGVzIG9yIEhGU19UWVBFLgogKiAgIE5vdGUgdGhhdCBpZiB0aGUgQlVGX1NJWkUgaXMgbGFyZ2VyIHRoYW4gMHg0RSwgdGhpcyBzdXJwbHVzIGlzIG5vdCB1c2VkLgogKiBvIFRoZSBhY3R1YWwgZnJhbWUgYmVnaW5zIGluIHRoZSAybmQgZGVzY3JpcHRvciAod2hpY2ggaXMgYWxyZWFkeSBpbXBsaWVkIGJ5IHRoZSBCVUZfQ05UID09IDB4M0EgcmVxdWlyZW1lbnQpIGFuZCB0aGUgYXNzb2NpYXRlZCBidWZmZXIgY29udGFpbnMgYXQgbGVhc3QgdGhlIDgwMi4zIGhlYWRlciwgaS5lLiB0aGUgMTQgYnl0ZXMgcmVwcmVzZW50aW5nIGFkZHJlc3NpbmcgaW5mb3JtYXRpb24gYW5kIGxlbmd0aC90eXBlIGZpZWxkCiAqCiAqICAgV2hlbiB0aGUgSENGIGRvZXMgbm90IGVuY2Fwc3VsYXRlcyAoaS5lLiBsZW5ndGgvdHlwZSBmaWVsZCA8PSAxNTAwKSwgIG5vIGNoYW5nZXMgYXJlIG1hZGUgdG8gZGVzY3JpcHRvcnMKICogICBvciBidWZmZXJzLgogKgogKiAgIFdoZW4gdGhlIEhDRiBhY3R1YWxseSBlbmNhcHN1bGF0ZXMgKGkuZS4gbGVuZ3RoL3R5cGUgZmllbGQgPiAxNTAwKSwgaXQgc3VjY2Vzc2l2ZWx5IHdyaXRlcywgc3RhcnRpbmcgYXQKICogICBvZmZzZXQgSEZTX0FERFJfREVTVCAoMHgzQSkgaW4gdGhlIGZpcnN0IGJ1ZmZlcjoKICogICAgIC0gdGhlIDgwMi4zIGFkZHJlc3NpbmcgaW5mb3JtYXRpb24sIGNvcGllZCBmcm9tIHRoZSBiZWdpbiBvZiB0aGUgc2Vjb25kIGJ1ZmZlcgogKiAgICAgLSB0aGUgZnJhbWUgbGVuZ3RoLCBkZXJpdmVkIGZyb20gdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgaW5kaXZpZHVhbCBmcmFnbWVudHMsIGNvcnJlY3RlZCBmb3IgdGhlIFNOQVAKICogICAgICAgaGVhZGVyIGxlbmd0aCBhbmQgVHlwZSBmaWVsZCBhbmQgaWdub3JpbmcgdGhlIERlc3RpbmF0aW9uIEFkZHJlc3MsIFNvdXJjZSBBZGRyZXNzIGFuZCBMZW5ndGggZmllbGQKICogICAgIC0gdGhlIGFwcHJvcHJpYXRlIHNuYXAgaGVhZGVyIChUdW5uZWwgb3IgMTA0MiwgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiB0aGUgdHlwZSBmaWVsZCkuCiAqCiAqICAgIFRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgZmlyc3QgdHdvIGRlc2NyaXB0b3JzIGlzIGFkanVzdGVkIGFjY29yZGluZ2x5OgogKiAgICAgLSB0aGUgZmlyc3QgZGVzY3JpcHRvciBjb3VudCBpcyBjaGFuZ2VkIGZyb20gMHgzQSB0byAweDRFIChIRlNfVFlQRSksIHdoaWNoIG1hdGNoZXMgMHgzQSArIDEyICsgMiArIDYKICogICAgIC0gdGhlIHNlY29uZCBkZXNjcmlwdG9yIGNvdW50IGlzIGRlY3JlYXNlZCBieSAxMiwgYmVpbmcgdGhlIG1vdmVkIGFkZHJlc3NpbmcgaW5mb3JtYXRpb24KICogICAgIC0gdGhlIHNlY29uZCBkZXNjcmlwdG9yIChwaHlzaWNhbCkgYnVmZmVyIGFkZHJlc3MgaXMgaW5jcmVhc2VkIGJ5IDEyLgogKgogKiBXaGVuIHRoZSBkZXNjcmlwdG9ycyBhcmUgcmV0dXJuZWQgYnkgaGNmX2RtYV90eF9nZXQsIHRoZSB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgZmlyc3QgdHdvIGRlc2NyaXB0b3JzIGlzCiAqIHVuZG9uZS4KICoKICogVW5kZXIgYW55IG9mIHRoZSBhYm92ZSBzY2VuYXJpb3MsIHRoZSBhc3NlcnQgQlVGX0NOVCA8PSBCVUZfU0laRSBtdXN0IGJlIHRydWUgZm9yIGFsbCBkZXNjcmlwdG9ycwogKiBJbiBjYXNlIG9mIGVuY2Fwc3VsYXRpb24sIEJVRl9TSVpFIG9mIHRoZSAxc3QgZGVzY3JpcHRvciBpcyBhc3NlcnRlZCB0byBiZSBhdCBsZWFzdCBIRlNfVFlQRSAoMHg0RSksIHNvIGl0IGlzIE5PVCB0ZXN0ZWQuCiAqCiAqIEFzc2VydCBmYWlscyBpZgogKiAtIGlmYnAgaGFzIGEgcmVjb2duaXphYmxlIG91dC1vZi1yYW5nZSB2YWx1ZS4KICogLSB0eF9jbnRsIGhhcyBhIHJlY29nbml6YWJsZSBvdXQtb2YtcmFuZ2UgdmFsdWUuCiAqIC0gTklDIGludGVycnVwdHMgYXJlIG5vdCBkaXNhYmxlZCB3aGlsZSByZXF1aXJlZCBieSBwYXJhbWV0ZXIgYWN0aW9uLgogKiAtIGluIGNhc2UgZW5jYXBzdWxhdGlvbiBieSB0aGUgSENGIGlzIHNlbGVjdGVkOgogKiAgICAgLSBUaGUgRnJhbWVMaXN0IGRvZXMgbm90IGNvbnNpc3RzIG9mIGF0IGxlYXN0IDIgRGVzY3JpcHRvcnMuCiAqICAgICAtIFRoZSBmaXJzdCBkYXRhYnVmZmVyIGRvZXMgbm90IGNvbnRhaW4gZXhhY3RseSB0aGUgKHNwYWNlIGZvcikgdGhlIDgwMi4xMSBoZWFkZXIgKD09IDI4IHdvcmRzKQogKiAgICAgLSBUaGUgZmlyc3QgZGF0YWJ1ZmZlciBkb2VzIG5vdCBoYXZlIGEgc2l6ZSB0byBhZGRpdGlvbmFsbHkgYWNjb21tb2RhdGUgdGhlIDgwMi4zIGhlYWRlciBhbmQgdGhlCiAqICAgICAgIFNOQVAgaGVhZGVyIG9mIHRoZSBmcmFtZSBhZnRlciBlbmNhcHN1bGF0aW9uICg9PSAzOSB3b3JkcykuCiAqICAgICAtIFRoZSBzZWNvbmQgZGF0YWJ1ZmZlciBkb2VzIG5vdCBjb250YWluIGF0IGxlYXN0IERBLCBTQSBhbmQgJ3R5cGUvbGVuZ3RoJyAoPT0xNCBieXRlcyBvciA3IHdvcmRzKQogKiEhIFRoZSAybmQgcGFydCBvZiB0aGUgbGlzdCBvZiBhc3NlcnRzIHNob3VsZCBiZSBrZXB0IGluIHN5bmMgd2l0aCBwdXRfZnJhbWVfbHN0LCBpbiBvcmRlciB0byBnZXQKICohISB0aGVtIGluIHRoZSBXQ0ktc3BlYyAhISEhCiAqIC0gRE1BIGlzIG5vdCBlbmFibGVkCiAqIC0gZGVzY3JpcHRvciBsaXN0IGlzIE5VTEwKICogLSBhIGRlc2NyaXB0b3IgaW4gdGhlIGRlc2NyaXB0b3IgbGlzdCBpcyBub3QgZG91YmxlIHdvcmQgYWxpZ25lZAogKiAtIGEgY291bnQgb2Ygc2l6ZSBmaWVsZCBvZiBhIGRlc2NyaXB0b3IgY29udGFpbnMgY29udHJvbCBiaXRzLCBpLmUuIGJpdHMgaW4gdGhlIGhpZ2ggb3JkZXIgbmliYmxlLgogKiAtIHRoZSBERUxXQSBkZXNjcmlwdG9yIGlzIG5vdCBhICJzaW5nbGV0b24iIERlc2NyaXB0b3JMaXN0LgogKiAtIHRoZSBERUxXQSBkZXNjcmlwdG9yIGlzIG5vdCB0aGUgZmlyc3QgRGVzY3JpcHRvciBzdXBwbGllZAogKiAtIGEgbm9uX0RNQSBkZXNjcmlwdG9yIGlzIHN1cHBsaWVkIGJlZm9yZSB0aGUgREVMV0EgRGVzY3JpcHRvciBpcyBzdXBwbGllZAogKiEhIC0gUG9zc2libHkgbW9yZSBjaGVja3MgY291bGQgYmUgYWRkZWQgISEhISEhISEhISEhIQogKi5ESUFHUkFNCiAqCiAqLk5PVElDRQogKgogKi5FTkRET0MgICAgICAgICAgICAgICAgRU5EIERPQ1VNRU5UQVRJT04KICoKICoKICoxOiBXcml0ZSB0eF9jbnRsIHBhcmFtZXRlciB0byBIRlNfVFhfQ05UTCBmaWVsZCBpbnRvIHRoZSBIZXJtZXMtc3BlY2lmaWMgaGVhZGVyIGluIGJ1ZmZlciAxCiAqNDogZGV0ZXJtaW5lIHdoZXRoZXIgZW5jYXBzdWxhdGlvbiBpcyBuZWVkZWQgYW5kIHdyaXRlIHRoZSB0eXBlICh0dW5uZWwgb3IgMTA0MikgYWxyZWFkeSBhdCB0aGUgYXBwcm9wcmlhdGUKICogICBvZmZzZXQgaW4gdGhlIDFzdCBidWZmZXIKICo2OiBCdWlsZCB0aGUgZW5jYXBzdWFsdGlvbiBlbnZlbG9wcGUgaW4gdGhlIGZyZWUgc3BhY2UgYXQgdGhlIGVuZCBvZiB0aGUgMXN0IGJ1ZmZlcgogKiAgIC0gQ29weSBEQS9TQSBmaWVsZHMgZnJvbSB0aGUgMm5kIGJ1ZmZlcgogKiAgIC0gQ2FsY3VsYXRlIHRvdGFsIGxlbmd0aCBvZiB0aGUgbWVzc2FnZSAoc25hcC1oZWFkZXIgKyB0eXBlLWZpZWxkICsgdGhlIGxlbmd0aCBvZiBhbGwgYnVmZmVyIGZyYWdtZW50cwogKiAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSA4MDIuMyBmcmFtZSAoaS5lIGFsbCBkZXNjcmlwdG9ycyBleGNlcHQgdGhlIGZpcnN0KSwgYnV0IG5vdCB0aGUgRGVzdGluYXRpb25BZGRyZXNzLAogKiAgICAgU291cmNlQWRkcmVzcyBhbmQgbGVuZ3RoLWZpZWxkKQogKiAgICAgQXNzZXJ0IHRoZSBtZXNzYWdlIGxlbmd0aAogKiAgICAgV3JpdGUgbGVuZ3RoLiBOb3RlIHRoYXQgdGhlIG1lc3NhZ2UgaXMgaW4gQkUgZm9ybWF0LCBoZW5jZSBvbiBMRSBwbGF0Zm9ybXMgdGhlIGxlbmd0aCBtdXN0IGJlIGNvbnZlcnRlZAogKiAgICAgOz8gVEhJUyBJUyBOT1QgV0hBVCBDVVJSRU5UTFkgSVMgSU1QTEVNRU5URUQKICogICAtIFdyaXRlIHNuYXAgaGVhZGVyLiBOb3RlIHRoYXQgdGhlIGxhc3QgYnl0ZSBvZiB0aGUgc25hcCBoZWFkZXIgaXMgTk9UIGNvcGllZCwgdGhhdCBieXRlIGlzIGFscmVhZHkgaW4KICogICAgIHBsYWNlIGFzIHJlc3VsdCBvZiB0aGUgY2FsbCB0byBoY2ZfZW5jYXAuCiAqICAgTm90ZSB0aGF0IHRoZXJlIGFyZSBtYW55IHdheXMgdG8gc2tpbiBhIGNhdC4gVG8gZXhwcmVzcyB0aGUgb2Zmc2V0cyBpbiB0aGUgMXN0IGJ1ZmZlciB3aGlsZSB3cml0aW5nCiAqICAgdGhlIHNuYXAgaGVhZGVyLCBIRlNfVFlQRSBpcyBjaG9zZW4gYXMgYSByZWZlcmVuY2UgcG9pbnQgdG8gbWFrZSBpdCBlYXNpZXIgdG8gZ3Jhc3AgdGhhdCB0aGUgc25hcCBoZWFkZXIKICogICBhbmQgZW5jYXBzdWFsdGlvbiB0eXBlIGFyZSBhdCBsZWFzdCByZWxhdGl2ZSBpbiB0aGUgcmlnaHQuCiAqODogbW9kaWZ5IDFzdCBkZXNjcmlwdG9yIHRvIHJlZmxlY3QgbW92ZWQgcGFydCBvZiB0aGUgODAyLjMgaGVhZGVyICsgU25hcC1oZWFkZXIKICogICBtb2RpZnkgMm5kIGRlc2NyaXB0b3IgdG8gc2tpcCB0aGUgbW92ZWQgcGFydCBvZiB0aGUgODAyLjMgaGVhZGVyIChEQS9TQQogKjEwOiBzZXQgZWFjaCBkZXNjcmlwdG9yIHRvICdETUEgb3duZWQnLCAgY2xlYXIgYWxsIG90aGVyIGNvbnRyb2wgYml0cy4KICogICBTZXQgU09QIGJpdCBvbiBmaXJzdCBkZXNjcmlwdG9yLiBTZXQgRU9QIGJpdCBvbiBsYXN0IGRlc2NyaXB0b3IuCiAqMTI6IEVpdGhlciBhcHBlbmQgdGhlIGN1cnJlbnQgZnJhbWUgdG8gYW4gZXhpc3RpbmcgZGVzY3JpcHRvciBsaXN0IG9yCiAqMTQ6IGNyZWF0ZSBhIGxpc3QgYmVnaW5uaW5nIHdpdGggdGhlIGN1cnJlbnQgZnJhbWUKICoxNjogcmVtZW1iZXIgdGhlIG5ldyBlbmQgb2YgdGhlIGxpc3QKICoyMDogaGFuZCB0aGUgZnJhbWUgb3ZlciB0byB0aGUgRE1BIGVuZ2luZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkCmhjZl9kbWFfdHhfcHV0KCBJRkJQIGlmYnAsIERFU0NfU1RSQ1QgKmRlc2NwLCBoY2ZfMTYgdHhfY250bCApCnsKCURFU0NfU1RSQ1QgICpwID0gZGVzY3AtPm5leHRfZGVzY19hZGRyOwoJaW50ICAgICAgICAgaTsKCiNpZiBIQ0ZfQVNTRVJUCglpbnQgeCA9IGlmYnAtPklGQl9GV0lkZW50aXR5LmNvbXBfaWQgPT0gQ09NUF9JRF9GV19BUCA/IHR4X2NudGwgJiB+SEZTX1RYX0NOVExfUE9SVCA6IHR4X2NudGw7CglIQ0ZBU1NFUlQoICh4ICYgfkhDRl9UWF9DTlRMX01BU0sgKSA9PSAwLCB0eF9jbnRsICk7CiNlbmRpZiAvLyBIQ0ZfQVNTRVJUCglIQ0ZMT0dFTlRSWSggSENGX1RSQUNFX0RNQV9UWF9QVVQsIDB4REEwMyApOwoJSENGQVNTRVJUKCBpZmJwLT5JRkJfTWFnaWMgPT0gSENGX01BR0lDLCBpZmJwLT5JRkJfTWFnaWMgKTsKCUhDRkFTU0VSVF9JTlQ7CglIQ0ZBU1NFUlQoICggaWZicC0+SUZCX0NudGxPcHQgJiAoVVNFX0RNQXxETUFfRU5BQkxFRCkgKSA9PSAoVVNFX0RNQXxETUFfRU5BQkxFRCksIGlmYnAtPklGQl9DbnRsT3B0KTsKCglpZiAoIGRlc2NwLT5idWZfYWRkciApIHsKCQkqKGhjZl8xNiopKGRlc2NwLT5idWZfYWRkciArIEhGU19UWF9DTlRMKSA9IHR4X2NudGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjEqLwojaWYgKEhDRl9FTkNBUCkgPT0gSENGX0VOQwoJCUhDRkFTU0VSVCggZGVzY3AtPm5leHRfZGVzY19hZGRyLCAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2F0IGxlYXN0IDIgZGVzY3JpcG9ycwoJCUhDRkFTU0VSVCggZGVzY3AtPkJVRl9DTlQgPT0gSEZTX0FERFJfREVTVCwgZGVzY3AtPkJVRl9DTlQgKTsgICAgLy9leGFjdCBsZW5ndGggcmVxdWlyZWQgZm9yIDFzdCBidWZmZXIKCQlIQ0ZBU1NFUlQoIGRlc2NwLT5CVUZfU0laRSA+PSBIQ0ZfRE1BX1RYX0JVRjFfU0laRSwgZGVzY3AtPkJVRl9TSVpFICk7ICAgLy9taW5pbWFsIHN0b3JhZ2UgZm9yIGVuY2Fwc3VsYXRpb24KCQlIQ0ZBU1NFUlQoIHAtPkJVRl9DTlQgPj0gMTQsIHAtPkJVRl9DTlQgKTsgICAgICAgICAgICAgICAgICAvL2F0IGxlYXN0IERBLCBTQSBhbmQgJ3R5cGUnIGluIDJuZCBidWZmZXIKCgkJZGVzY3AtPmJ1Zl9hZGRyW0hGU19UWVBFLTFdID0gaGNmX2VuY2FwKCZkZXNjcC0+bmV4dF9kZXNjX2FkZHItPmJ1Zl9hZGRyW0hDRl9EQVNBX1NJWkVdKTsgICAgICAgLyo0Ki8KCQlpZiAoIGRlc2NwLT5idWZfYWRkcltIRlNfVFlQRS0xXSAhPSBFTkNfTk9ORSApIHsKCQkJZm9yICggaT0wOyBpIDwgSENGX0RBU0FfU0laRTsgaSsrICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjYqLwoJCQkJZGVzY3AtPmJ1Zl9hZGRyW2kgKyBIRlNfQUREUl9ERVNUXSA9IGRlc2NwLT5uZXh0X2Rlc2NfYWRkci0+YnVmX2FkZHJbaV07CgkJCX0KCQkJaSA9IHNpemVvZihzbmFwX2hlYWRlcikgKyAyIC0gKCAyKjYgKyAyICk7CgkJCWRvIHsgaSArPSBwLT5CVUZfQ05UOyB9IHdoaWxlICggKCBwID0gcC0+bmV4dF9kZXNjX2FkZHIgKSAhPSBOVUxMICk7CgkJCSooaGNmXzE2KikoJmRlc2NwLT5idWZfYWRkcltIRlNfTEVOXSkgPSBDTlZfRU5EX1NIT1JUKGkpOyAgIC8vISEgdGhpcyBjb252ZXJ0cyBvbiBBTEwgcGxhdGZvcm1zLCBob3cgZG9lcyB0aGF0IHJlbGF0ZSB0byB0aGUgQ0NYIGNvZGUKCQkJZm9yICggaT0wOyBpIDwgc2l6ZW9mKHNuYXBfaGVhZGVyKSAtIDE7IGkrKykgewoJCQkJZGVzY3AtPmJ1Zl9hZGRyW0hGU19UWVBFIC0gc2l6ZW9mKHNuYXBfaGVhZGVyKSArIGldID0gc25hcF9oZWFkZXJbaV07CgkJCX0KCQkJZGVzY3AtPkJVRl9DTlQgPSBIRlNfVFlQRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjgqLwoJCQlkZXNjcC0+bmV4dF9kZXNjX2FkZHItPmJ1Zl9waHlzX2FkZHIgICAgKz0gSENGX0RBU0FfU0laRTsKCQkJZGVzY3AtPm5leHRfZGVzY19hZGRyLT5CVUZfQ05UICAgICAgICAgIC09IEhDRl9EQVNBX1NJWkU7CgkJfQojZW5kaWYgLy8gSENGX0VOQwoJfQoJcHV0X2ZyYW1lX2xzdCggaWZicCwgZGVzY3AsIERNQV9UWCApOwoJSENGTE9HRVhJVCggSENGX1RSQUNFX0RNQV9UWF9QVVQgKTsKfSAvLyBoY2ZfZG1hX3R4X3B1dAoKI2VuZGlmIC8vIEhDRl9ETUEKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICouTU9EVUxFICAgICAgICBoY2ZfOCBoY2ZfZW5jYXAoIHdjaV9idWZwIHR5cGUgKQogKi5QVVJQT1NFICAgICAgIHRlc3Qgd2hldGhlciBSRkMxMDQyIG9yIEJyaWRnZS1UdW5uZWwgZW5jYXBzdWxhdGlvbiBpcyBuZWVkZWQuCiAqCiAqLkFSR1VNRU5UUwogKiAgIHR5cGUgICAgICAgIChGYXIpIHBvaW50ZXIgdG8gdGhlIChCaWcgRW5kaWFuKSBUeXBlL0xlbmd0aCBmaWVsZCBpbiB0aGUgbWVzc2FnZQogKgogKi5SRVRVUk5TCiAqICAgRU5DX05PTkUgICAgICAgIGxlbi90eXBlIGlzICJsZW4iICggKEJJR19FTkRJQU4pdHlwZSA8PSAxNTAwICkKICogICBFTkNfVFVOTkVMICAgICAgbGVuL3R5cGUgaXMgInR5cGUiIGFuZCAweDgwRjMgb3IgMHg4MTM3CiAqICAgRU5DXzEwNDIgICAgICAgIGxlbi90eXBlIGlzICJ0eXBlIiBidXQgbm90IDB4ODBGMyBvciAweDgxMzcKICoKICouQ09ORElUSU9OUwogKiAgIE5JQyBJbnRlcnJ1cHRzICBkLmMKICoKICouREVTQ1JJUFRJT04KICogVHlwZSBtdXN0IHBvaW50IHRvIHRoZSBMZW4vVHlwZSBmaWVsZCBvZiB0aGUgbWVzc2FnZSwgdGhpcyBpcyB0aGUgMi1ieXRlIGZpZWxkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSA2IGJ5dGUKICogRGVzdGluYXRpb24gQWRkcmVzcyBhbmQgNiBieXRlIFNvdXJjZSBBZGRyZXNzLiAgVGhlIDIgc3VjY2Vzc2l2ZSBieXRlcyBhZGRyZXNzZWQgYnkgdHlwZSBhcmUgaW50ZXJwcmV0ZWQgYXMKICogYSBCaWcgRW5kaWFuIHZhbHVlLiAgSWYgdGhhdCB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTUwMCwgdGhlIG1lc3NhZ2UgaXMgYXNzdW1lZCB0byBiZSBpbiA4MDIuMwogKiBmb3JtYXQuICBPdGhlcndpc2UgdGhlIG1lc3NhZ2UgaXMgYXNzdW1lZCB0byBiZSBpbiBFdGhlcm5ldC1JSSBmb3JtYXQuICBEZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIExlbi9UeXAsCiAqIEJyaWRnZSBUdW5uZWwgb3IgUkZDMTA0MiBlbmNhcHN1bGF0aW9uIGlzIG5lZWRlZC4KICoKICouRElBR1JBTQogKgogKiAgMTogICBwcmVzdW1lIDgwMi4zLCBoZW5jZSBwcmVzZXQgcmV0dXJuIHZhbHVlIGF0IEVOQ19OT05FCiAqICAyOiAgIGNvbnZlcnQgdHlwZSBmcm9tICJuZXR3b3JrIiBFbmRpYW4gZm9ybWF0IHRvIG5hdGl2ZSBFbmRpYW4KICogIDQ6ICAgdGhlIGxpdG11cyB0ZXN0IHRvIGRpc3Rpbmd1aXNoIHR5cGUgYW5kIGxlbi4KICogICBUaGUgaGFyZCBjb2RlICJtYWdpYyIgdmFsdWUgb2YgMTUwMCBpcyBpbnRlbnRpb25hbCBhbmQgc2hvdWxkIE5PVCBiZSByZXBsYWNlZCBieSBhIG1uZW1vbmljIGJlY2F1c2UgaXQgaXMKICogICBub3QgcmVsYXRlZCBhdCBhbGwgdG8gdGhlIG1heGltdW0gZnJhbWUgc2l6ZSBzdXBwb3J0ZWQgIGJ5IHRoZSBIZXJtZXMuCiAqICA2OiAgIGNoZWNrIHR5cGUgYWdhaW5zdDoKICogICAgICAgMHg4MEYzICAvL0FwcGxlVGFsayBBZGRyZXNzIFJlc29sdXRpb24gUHJvdG9jb2wgKEFBUlApCiAqICAgICAgIDB4ODEzNyAgLy9JUFgKICogICB0byBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgZW5jYXBzdWxhdGlvbgogKgogKi5FTkRET0MgICAgICAgICAgICAgICAgRU5EIERPQ1VNRU5UQVRJT04KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KSENGX1NUQVRJQyBoY2ZfOApoY2ZfZW5jYXAoIHdjaV9idWZwIHR5cGUgKQp7CgoJaGNmXzggICByYyA9IEVOQ19OT05FOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxICovCgloY2ZfMTYgIHQgPSAoaGNmXzE2KSgqdHlwZTw8OCkgKyAqKHR5cGUrMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIgKi8KCglpZiAoIHQgPiAxNTAwICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNCAqLwoJCWlmICggdCA9PSAweDgxMzcgfHwgdCA9PSAweDgwRjMgKSB7CgkJCXJjID0gRU5DX1RVTk5FTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNiAqLwoJCX0gZWxzZSB7CgkJCXJjID0gRU5DXzEwNDI7CgkJfQoJfQoJcmV0dXJuIHJjOwp9IC8vIGhjZl9lbmNhcAoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICouTU9EVUxFICAgICAgICBpbnQgaGNmX2dldF9pbmZvKCBJRkJQIGlmYnAsIExUVlAgbHR2cCApCiAqLlBVUlBPU0UgICAgICAgT2J0YWlucyB0cmFuc2llbnQgYW5kIHBlcnNpc3RlbnQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBDYXJkIGFuZCBmcm9tIHRoZSBIQ0YuCiAqCiAqLkFSR1VNRU5UUwogKiAgIGlmYnAgICAgICAgIGFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawogKiAgIGx0dnAgICAgICAgIGFkZHJlc3Mgb2YgTGVuZ3RoVHlwZVZhbHVlIHN0cnVjdHVyZSBzcGVjaWZ5aW5nIHRoZSAid2hhdCIgYW5kIHRoZSAiaG93IG11Y2giIG9mIHRoZQogKiAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIHRvIGJlIGNvbGxlY3RlZCBmcm9tIHRoZSBIQ0Ygb3IgZnJvbSB0aGUgSGVybWVzCiAqCiAqLlJFVFVSTlMKICogICBIQ0ZfRVJSX0xFTiAgICAgICAgIFRoZSBwcm92aWRlZCBidWZmZXIgd2FzIHRvbyBzbWFsbAogKiAgIEhDRl9TVUNDRVNTICAgICAgICAgU3VjY2VzcwogKiEhIHZpYSBjbWRfZXhlICggdHlwZSA+PSBDRkdfUklEX0ZXX01JTiApCiAqICAgSENGX0VSUl9OT19OSUMgICAgICBOSUMgcmVtb3ZlZCBkdXJpbmcgcmV0cmlldmFsCiAqICAgSENGX0VSUl9USU1FX09VVCAgICBFeHBlY3RlZCBIZXJtZXMgZXZlbnQgZGlkIG5vdCBvY2N1ciBpbiBleHBlY3RlZCB0aW1lCiAqISEgdmlhIGNtZF9leGUgYW5kIHNldHVwX2JhcCAodHlwZSA+PSBDRkdfUklEX0ZXX01JTiApCiAqICAgSENGX0VSUl9ERUZVTkNUXy4uLiBIQ0YgaXMgaW4gZGVmdW5jdCBtb2RlIChiaXRzIDB4N0YgcmVmbGVjdCBjYXVzZSkKICoKICouREVTQ1JJUFRJT04KICogVGhlIFQtZmllbGQgb2YgdGhlIExUVi1yZWNvcmQgKHByb3ZpZGVkIGJ5IHRoZSBNU0YgaW4gcGFyYW1ldGVyIGx0dnApIHNwZWNpZmllcyB0aGUgUklEIHdhbnRlZC4gVGhlIFJJRAogKiBpbmZvcm1hdGlvbiBpZGVudGlmaWVkIGJ5IHRoZSBULWZpZWxkIGlzIGNvcGllZCBpbnRvIHRoZSBWLWZpZWxkLgogKiBPbiBlbnRyeSwgdGhlIEwtZmllbGQgc3BlY2lmaWVzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIsIGFsc28gY2FsbGVkIHRoZSAiSW5pdGlhbCBEYXRhTGVuZ3RoIi4gVGhlIEwtdmFsdWUKICogaW5jbHVkZXMgdGhlIHNpemUgb2YgdGhlIFQtZmllbGQsIGJ1dCBub3QgdGhlIHNpemUgb2YgdGhlIEwtZmllbGQgaXRzZWxmLgogKiBPbiByZXR1cm4sIHRoZSBMLWZpZWxkIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIHdvcmRzIGFjdHVhbGx5IGNvbnRhaW5lZCBieSB0aGUgVHlwZSBhbmQgVmFsdWUgZmllbGRzLgogKiBBcyB0aGUgc2l6ZSBvZiB0aGUgVHlwZSBmaWVsZCBpbiB0aGUgTFRWLXJlY29yZCBpcyBpbmNsdWRlZCBpbiB0aGUgIkluaXRpYWwgRGF0YUxlbmd0aCIgb2YgdGhlIHJlY29yZCwgdGhlCiAqIFYtZmllbGQgY2FuIGNvbnRhaW4gYXQgbW9zdCAiSW5pdGlhbCBEYXRhTGVuZ3RoIiAtIDEgd29yZHMgb2YgZGF0YS4KICogQ29weWluZyBzdG9wcyBpZiBlaXRoZXIgdGhlIGNvbXBsZXRlIEluZm9ybWF0aW9uIGlzIGNvcGllZCBvciBpZiB0aGUgbnVtYmVyIG9mIHdvcmRzIGluZGljYXRlZCBieSB0aGUKICogIkluaXRpYWwgRGF0YUxlbmd0aCIgd2VyZSBjb3BpZWQuICBUaGUgIkluaXRpYWwgRGF0YUxlbmd0aCIgYWN0cyBhcyBhIHNhZmUgZ3VhcmQgYWdhaW5zdCBDb25maWd1cmF0aW9uCiAqIEluZm9ybWF0aW9uIGJsb2NrcyB0aGF0IGhhdmUgZGlmZmVyZW50IHNpemVzIGZvciBkaWZmZXJlbnQgRi9XIHZlcnNpb25zLCBlLmcuIHdoZW4gbGF0ZXIgdmVyc2lvbnMgc3VwcG9ydAogKiBtb3JlIHRhbGxpZXMgdGhhbiBlYXJsaWVyIHZlcnNpb25zLgogKiBJZiB0aGUgc2l6ZSBvZiBWYWx1ZSBmaWVsZCBvZiB0aGUgUklEIGV4Y2VlZHMgdGhlIHNpemUgb2YgdGhlICJJbml0aWFsIERhdGFMZW5ndGgiIC0xLCBhcyBtdWNoIGRhdGEKICogYXMgZml0cyBpcyBjb3BpZWQsIGFuZCBhbiBlcnJvciBzdGF0dXMgb2YgSENGX0VSUl9MRU4gaXMgcmV0dXJuZWQuCiAqCiAqIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgTVNGIHRvIGRldGVjdCBjYXJkIHJlbW92YWwgYW5kIHJlLWluc2VydGlvbiBhbmQgbm90IGNhbGwgdGhlIEhDRiB3aGVuIHRoZQogKiBOSUMgaXMgYWJzZW50LiBUaGUgTVNGIGNhbm5vdCwgaG93ZXZlciwgdGltZWx5IGRldGVjdCBhIENhcmQgcmVtb3ZhbCBpZiB0aGUgQ2FyZCBpcyByZW1vdmVkIHdoaWxlCiAqIGhjZl9nZXRfaW5mbyBpcyBpbiBwcm9ncmVzcy4gIFRoZXJlZm9yZSwgdGhlIEhDRiBwZXJmb3JtcyBpdHMgb3duIGNoZWNrIG9uIENhcmQgcHJlc2VuY2UgYWZ0ZXIgdGhlIHJlYWQKICogb3BlcmF0aW9uIG9mIHRoZSBOSUMgZGF0YS4gIElmIHRoZSBDYXJkIGlzIG5vdCBwcmVzZW50IG9yIHJlbW92ZWQgZHVyaW5nIHRoZSBleGVjdXRpb24gb2YgaGNmX2dldF9pbmZvLAogKiBIQ0ZfRVJSX05PX05JQyBpcyByZXR1cm5lZCBhbmQgdGhlIGNvbnRlbnQgb2YgdGhlIERhdGEgQnVmZmVyIGlzIHVucHJlZGljdGFibGUuIFRoaXMgY2hlY2sgaXMgbm90IHBlcmZvcm1lZAogKiBpbiBjYXNlIG9mIHRoZSAiSENGIGVtYmVkZGVkIiBwc2V1ZG8gUklEcyBsaWtlIENGR19UQUxMSUVTLgogKgogKiBBc3NlcnQgZmFpbHMgaWYKICogLSBpZmJwIGhhcyBhIHJlY29nbml6YWJsZSBvdXQtb2YtcmFuZ2UgdmFsdWUuCiAqIC0gcmVlbnRyYW5jeSwgbWF5IGJlICBjYXVzZWQgYnkgY2FsbGluZyBoY2ZfZnVuY3Rpb25zIHdpdGhvdXQgYWRlcXVhdGUgcHJvdGVjdGlvbgogKiAgIGFnYWluc3QgTklDIGludGVycnVwdHMgb3IgbXVsdGktdGhyZWFkaW5nLgogKiAtIGx0dnAgaXMgYSBOVUxMIHBvaW50ZXIuCiAqIC0gbGVuZ3RoIGZpZWxkIG9mIHRoZSBMVFYtcmVjb3JkIGF0IGVudHJ5IGlzIDAgb3IgMSBvciBoYXMgYW4gZXhjZXNzaXZlIHZhbHVlIChpLmUuIGV4Y2VlZHMgSENGX01BWF9MVFYpLgogKiAtIHR5cGUgZmllbGQgb2YgdGhlIExUVi1yZWNvcmQgaXMgaW52YWxpZC4KICoKICouRElBR1JBTQogKiAgIEhjZl9nZXRfbWJfaW5mbyBjb3BpZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBvbGRlc3QgTWFpbEJveCBJbmZvIGJsb2NrIGluIHRoZSBNYWlsQm94IHRvIFBDIFJBTS4gSWYgbGVuIGlzCiAqICAgbGVzcyB0aGFuIHRoZSBzaXplIG9mIHRoZSBNYWlsQm94IEluZm8gYmxvY2ssIG9ubHkgYXMgbXVjaCBhcyBmaXRzIGluIHRoZSBQQyBSQU0gYnVmZmVyIGlzIGNvcGllZC4gQWZ0ZXIKICogICB0aGUgY29weWluZyB0aGUgTWFpbEJveCBSZWFkIHBvaW50ZXIgaXMgdXBkYXRlZCB0byBwb2ludCB0byB0aGUgbmV4dCBNYWlsQm94IEluZm8gYmxvY2ssIGhlbmNlIHRoZQogKiAgIHJlbWFpbmRlciBvZiBhbiAib3ZlcnNpemVkIiBNYWlsQm94IEluZm8gYmxvY2sgaXMgbG9zdC4gVGhlIHRydW5jYXRpb24gb2YgdGhlIE1haWxCb3ggSW5mbyBibG9jayBpcyBOT1QKICogICByZWZsZWN0ZWQgaW4gdGhlIHJldHVybiBzdGF0dXMuIE5vdGUgdGhhdCBoY2ZfZ2V0X2luZm8gZ3VhcmFudGVlcyB0aGUgbGVuZ3RoIG9mIHRoZSBQQyBSQU0gYnVmZmVyIG1lZXRzCiAqICAgdGhlIG1pbmltdW0gcmVxdWlyZW1lbnRzIG9mIGF0IGxlYXN0IDIsIHNvIG5vIFBDIFJBTSBidWZmZXIgb3ZlcnJ1bi4KICoKICogICBDYWxsaW5nIGhjZl9nZXRfbWJfaW5mbyB3aGVuIHRoZWlyIGlzIG5vIE1haWxCb3ggSW5mbyBibG9jayBhdmFpbGFibGUgb3Igd2hlbiB0aGVyZSBpcyBubyBNYWlsQm94IGF0IGFsbCwKICogICByZXN1bHRzIGluIGEgIk5VTEwiIE1haWxCb3ggSW5mbyBibG9jay4KICoKICoxMjogICAgc2VlIE5PVElDRQogKjE3OiBUaGUgcmV0dXJuIHN0YXR1cyBvZiBjbWRfd2FpdCBhbmQgdGhlIGZpcnN0IGhjZmlvX2luX3N0cmluZyBjYW4gYmUgaWdub3JlZCwgYmVjYXVzZSB3aGVuIG9uZSBmYWlscywgdGhlCiAqICAgb3RoZXIgZmFpbHMgdmlhIHRoZSBJRkJfRGVmdW5jdFN0YXQgbWVjaGFuaXNtCiAqMjA6ICJIQ0ZBU1NFUlQoIHJjID09IEhDRl9TVUNDRVNTLCByYyApIiBpcyBub3Qgc3VpdGFibGUgYmVjYXVzZSB0aGlzIHdpbGwgYWx3YXlzIHRyaWdnZXIgYXMgc2lkZSBlZmZlY3Qgb2YKICogICB0aGUgSENGQVNTRVJUIGluIGhjZl9wdXRfaW5mbyB3aGljaCBjYWxscyBoY2ZfZ2V0X2luZm8gdG8gZmlndXJlIG91dCB3aGV0aGVyIHRoZSBSSUQgZXhpc3RzIGF0IGFsbC4KCiAqLk5PVElDRQogKgogKiAgICJIQ0YgZW1iZWRkZWQiIHBzZXVkbyBSSURzOgogKiAgIENGR19NQl9JTkZPLCBDRkdfVEFMTElFUywgQ0ZHX0RSVl9JREVOVElUWSwgQ0ZHX0RSVl9TVVBfUkFOR0UsIENGR19EUlZfQUNUX1JBTkdFU19QUkksCiAqICAgQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQSwgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSQogKiAgIE5vdGUgdGhlIEhDRl9FUlJfTEVOIGlzIE5PVCBhZGVxdWF0ZWx5IHNldCwgd2hlbiBMID49IDIgYnV0IGxlc3MgdGhhbiBuZWVkZWQKICoKICogICBSZW1hcmtzOiBUcmFuc2ZlcnMgb3BlcmF0aW9uIGluZm9ybWF0aW9uIGFuZCB0cmFuc2llbnQgYW5kIHBlcnNpc3RlbnQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZQogKiAgIENhcmQgYW5kIGZyb20gdGhlIEhDRiB0byB0aGUgTVNGLgogKiAgIFRoZSBleGFjdCBsYXlvdXQgb2YgdGhlIHByb3ZpZGVkIGRhdGEgc3RydWN0dXJlIGRlcGVuZHMgb24gdGhlIGFjdGlvbiBjb2RlLiBDb3B5aW5nIHN0b3BzIGlmIGVpdGhlciB0aGUKICogICBjb21wbGV0ZSBDb25maWd1cmF0aW9uIEluZm9ybWF0aW9uIGlzIGNvcGllZCBvciBpZiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluZGljYXRlZCBieSBsZW4gaXMgY29waWVkLiAgTGVuCiAqICAgYWN0cyBhcyBhIHNhZmUgZ3VhcmQgYWdhaW5zdCBDb25maWd1cmF0aW9uIEluZm9ybWF0aW9uIGJsb2NrcyB3aGljaCBoYXZlIGRpZmZlcmVudCBzaXplcyBmb3IgZGlmZmVyZW50CiAqICAgSGVybWVzIHZlcnNpb25zLCBlLmcuIHdoZW4gbGF0ZXIgdmVyc2lvbnMgc3VwcG9ydCBtb3JlIHRhbGxpZXMgdGhhbiBlYXJsaWVyIHZlcnNpb25zLiBJdCBpcyBhIGNvbnNjaW91cwogKiAgIGRlY2lzaW9uIHRoYXQgdW51c2VkIHBhcnRzIG9mIHRoZSBQQyBSQU0gYnVmZmVyIGFyZSBub3QgY2xlYXJlZC4KICoKICogICBSZW1hcmtzOiBUaGUgb25seSBlcnJvciBhZ2FpbnN0IHdoaWNoIGlzIHByb3RlY3RlZCBpcyB0aGUgIlJlYWQgZXJyb3IiIGFzIHJlc3VsdCBvZiBDYXJkIHJlbW92YWwuIE9ubHkgdGhlCiAqICAgbGFzdCBoY2ZfaW9fc3RyaW5nIG5lZWQgdG8gYmUgcHJvdGVjdGVkIGJlY2F1c2UgaWYgdGhlIGZpcnN0IGZhaWxzIHRoZSBzZWNvbmQgd2lsbCBmYWlsIGFzIHdlbGwuIENoZWNraW5nCiAqICAgZm9yIGNtZF9leGUgZXJyb3JzIGlzIHN1cHBvc2VkIHN1cGVyZmx1b3VzIGJlY2F1c2UgcHJvYmxlbXMgaW4gY21kX2V4ZSBhcmUgYWxyZWFkeSBjYXVnaHQgb3Igd2lsbCBiZQogKiAgIGNhdWdodCBieSBoY2ZfZW5hYmxlLgogKgogKiAgIENGR19NQl9JTkZPOiBjb3B5IHRoZSBvbGRlc3QgTWFpbEJveCBJbmZvIEJsb2NrIG9yIHRoZSAibnVsbCIgYmxvY2sgaWYgbm9uZSBhdmFpbGFibGUuCiAqCiAqICAgVGhlIG1lY2hhbmlzbSB0byBIQ0ZfQVNTRVJUIG9uIGludmFsaWQgdHlwLWNvZGVzIGluIHRoZSBMVFYgcmVjb3JkIGlzIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgc3RyYXRlZ3k6CiAqICAgICAtIGR1cmluZyB0aGUgcHNldWRvLWFzeW5jaHJvbm91cyBIZXJtZXMgY29tbWFuZHMgKGRpYWdub3NlLCBkb3dubG9hZCkgb25seSBDRkdfTUJfSU5GTyBpcyBhY2NlcHRhYmxlCiAqICAgICAtIHNvbWUgY29kZXMgKGUuZy4gQ0ZHX1RBTExJRVMpIGFyZSBleHBsaWNpdGx5IGhhbmRsZWQgYnkgdGhlIEhDRiB3aGljaCBpbXBsaWVzIHRoYXQgdGhlc2UgY29kZXMKICogICAgICAgYXJlIHZhbGlkCiAqICAgICAtIGFsbCBvdGhlciBjb2RlcyBpbiB0aGUgcmFuZ2UgMHhGQzAwIHRocm91Z2ggMHhGRkZGIGFyZSBwYXNzZWQgdG8gdGhlIEhlcm1lcy4gIFRoZSBIZXJtZXMgcmV0dXJucyBhbgogKiAgICAgICBMVFYgcmVjb3JkIHdpdGggYSB6ZXJvIHZhbHVlIGluIHRoZSBMLWZpZWxkIGZvciBhbGwgVHlwLWNvZGVzIGl0IGRvZXMgbm90IHJlY29nbml6ZS4gVGhpcyBpcwogKiAgICAgICBkZWZpbmVkIGFuZCBpbnRlbmRlZCBiZWhhdmlvciwgc28gSENGX0FTU0VSVCBkb2VzIG5vdCBjYXRjaCBvbiB0aGlzIHBoZW5vbWVuYS4KICogICAgIC0gYWxsIHJlbWFpbmluZyBjb2RlcyBhcmUgaW52YWxpZCBhbmQgY2F1c2UgYW4gQVNTRVJULgogKgogKi5DT05ESVRJT05TCiAqIEluIGNhc2Ugb2YgVVNCLCBIQ0ZfTUFYX01TRyA7P1VTRUQ7PyB0byBsaW1pdCB0aGUgYW1vdW50IG9mIGRhdGEgdGhhdCBjYW4gYmUgcmV0cmlldmVkIHZpYSBoY2ZfZ2V0X2luZm8uCiAqCiAqCiAqLkVORERPQyAgICAgICAgICAgICAgICBFTkQgRE9DVU1FTlRBVElPTgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQKaGNmX2dldF9pbmZvKCBJRkJQIGlmYnAsIExUVlAgbHR2cCApCnsKCglpbnQgICAgICAgICByYyA9IEhDRl9TVUNDRVNTOwoJaGNmXzE2ICAgICAgbGVuID0gbHR2cC0+bGVuOwoJaGNmXzE2ICAgICAgdHlwZSA9IGx0dnAtPnR5cDsKCXdjaV9yZWNvcmRwIHAgPSAmbHR2cC0+bGVuOyAgICAgLy9kZXN0aW5hdGlvbiB3b3JkIHBvaW50ZXIgKGluIExUViByZWNvcmQpCgloY2ZfMTYgICAgICAqcSA9IE5VTEw7ICAgICAgICAgICAgICAvKiBzb3VyY2Ugd29yZCBwb2ludGVyICBOb3RlISEgRE9TIENPTSBjYW4ndCBjb3BlIHdpdGggRkFSCgkJCQkJICAgICAqIGFzIGEgY29uc2VxdWVuY2UgTWFpbEJveCBtdXN0IGJlIG5lYXIgd2hpY2ggaXMgdXN1YWxseSB0cnVlIGFueXdheQoJCQkJCSAgICAgKi8KCWludCAgICAgICAgIGk7CgoJSENGTE9HRU5UUlkoIEhDRl9UUkFDRV9HRVRfSU5GTywgbHR2cC0+dHlwICk7CglIQ0ZBU1NFUlQoIGlmYnAtPklGQl9NYWdpYyA9PSBIQ0ZfTUFHSUMsIGlmYnAtPklGQl9NYWdpYyApOwoJSENGQVNTRVJUX0lOVDsKCUhDRkFTU0VSVCggbHR2cCwgMCApOwoJSENGQVNTRVJUKCAxIDwgbHR2cC0+bGVuICYmIGx0dnAtPmxlbiA8PSBIQ0ZfTUFYX0xUViArIDEsIE1FUkdFXzIoIGx0dnAtPnR5cCwgbHR2cC0+bGVuICkgKTsKCglsdHZwLT5sZW4gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZGVmYXVsdCB0bzogTm8gSW5mbyBBdmFpbGFibGUKCS8vZmlsdGVyIG91dCBhbGwgc3BlY2lhbHMKCWZvciAoIGkgPSAwOyAoIHEgPSB4eHh4W2ldICkgIT0gTlVMTCAmJiBxWzFdICE9IHR5cGU7IGkrKyApIC8qTk9QKi87CgojaWYgSENGX1RBTExJRVMKCWlmICggdHlwZSA9PSBDRkdfVEFMTElFUyApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyozKi8KCQkodm9pZCloY2ZfYWN0aW9uKCBpZmJwLCBIQ0ZfQUNUX1RBTExJRVMgKTsKCQlxID0gKGhjZl8xNiopJmlmYnAtPklGQl9UYWxseUxlbjsKCX0KI2VuZGlmIC8vIEhDRl9UQUxMSUVTCgoJaWYgKCB0eXBlID09IENGR19NQl9JTkZPICkgewoJCWlmICggaWZicC0+SUZCX01CSW5mb0xlbiApIHsKCQkJaWYgKCBpZmJwLT5JRkJfTUJwW2lmYnAtPklGQl9NQlJwXSA9PSAweEZGRkYgKSB7CgkJCQlpZmJwLT5JRkJfTUJScCA9IDA7IC8vOz9Qcm9iYWJseSBzdXBlcmZsdW91cwoJCQl9CgkJCXEgPSAmaWZicC0+SUZCX01CcFtpZmJwLT5JRkJfTUJScF07CgkJCWlmYnAtPklGQl9NQlJwICs9ICpxICsgMTsgICAvL3VwZGF0ZSByZWFkIHBvaW50ZXIKCQkJaWYgKCBpZmJwLT5JRkJfTUJwW2lmYnAtPklGQl9NQlJwXSA9PSAweEZGRkYgKSB7CgkJCQlpZmJwLT5JRkJfTUJScCA9IDA7CgkJCX0KCQkJaWZicC0+SUZCX01CSW5mb0xlbiA9IGlmYnAtPklGQl9NQnBbaWZicC0+SUZCX01CUnBdOwoJCX0KCX0KCglpZiAoIHEgIT0gTlVMTCApIHsgICAgICAgICAgICAgICAgICAgICAgLy9hIHNwZWNpYWwgb3IgQ0ZHX1RBTExJRVMgb3IgQ0ZHX01CX0lORk8KCQlpID0gbWluKCBsZW4sICpxICkgKyAxOyAgICAgICAgICAgICAvL3RvdGFsIHNpemUgb2YgZGVzdGluYXRpb24gKGluY2x1ZGluZyBULWZpZWxkKQoJCXdoaWxlICggaS0tICkgewoJCQkqcCsrID0gKnE7CiNpZiAoSENGX1RBTExJRVMpICYgSENGX1RBTExJRVNfUkVTRVQKCQkJaWYgKCBxID4gJmlmYnAtPklGQl9UYWxseVR5cCAmJiB0eXBlID09IENGR19UQUxMSUVTICkgewoJCQkJKnEgPSAwOwoJCQl9CiNlbmRpZiAvLyBIQ0ZfVEFMTElFU19SRVNFVAoJCQlxKys7CgkJfQoJfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBhIHNwZWNpYWwgbm9yIENGR19UQUxMSUVTIG5vciBDRkdfTUJfSU5GTwoJCWlmICggdHlwZSA9PSBDRkdfQ05UTF9PUFQgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9yZWFkIGJhY2sgZWZmZWN0aXZlIG9wdGlvbnMKCQkJbHR2cC0+bGVuID0gMjsKCQkJbHR2cC0+dmFsWzBdID0gaWZicC0+SUZCX0NudGxPcHQ7CiNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX05JQ19BQ0NFU1MKCQl9IGVsc2UgaWYgKCB0eXBlID09IENGR19QUk9EX0RBVEEgKSB7ICAvL29ubHkgbmVlZGVkIGZvciBzb21lIHRlc3QgdG9vbCBvbiB0b3Agb2YgSC1JSSBORElTIGRyaXZlcgoJCQloY2ZfaW8gICAgICBpb19wb3J0OwoJCQl3Y2lfYnVmcCAgICBwdDsgICAgICAgICAgICAgICAgIC8vcG9pbnRlciB3aXRoIHRoZSAicmlnaHQiIHR5cGUsIGp1c3QgdG8gaGVscCBlYXNlIHdyaXRpbmcgbWFjcm9zIHdpdGggZW1iZWRkZWQgYXNzZW1ibHkKCQkJT1BXKCBIUkVHX0FVWF9QQUdFLCAoaGNmXzE2KShQTFVHX0RBVEFfT0ZGU0VUID4+IDcpICk7CgkJCU9QVyggSFJFR19BVVhfT0ZGU0VULCAoaGNmXzE2KShQTFVHX0RBVEFfT0ZGU0VUICYgMHg3RSkgKTsKCQkJaW9fcG9ydCA9IGlmYnAtPklGQl9JT0Jhc2UgKyBIUkVHX0FVWF9EQVRBOyAgICAgLy90byBwcmV2ZW50IHNpZGUgZWZmZWN0cyBvZiB0aGUgTVNGLWRlZmluZWQgbWFjcm8KCQkJcCA9IGx0dnAtPnZhbDsgICAgICAgICAgICAgICAgICAvL2Rlc3RpbmF0aW9uIGNoYXIgcG9pbnRlciAoaW4gTFRWIHJlY29yZCkKCQkJaSA9IGxlbiAtIDE7CgkJCWlmIChpID4gMCApIHsKCQkJCXB0ID0gKHdjaV9idWZwKXA7ICAgLy9qdXN0IHRvIGhlbHAgZWFzZSB3cml0aW5nIG1hY3JvcyB3aXRoIGVtYmVkZGVkIGFzc2VtYmx5CgkJCQlJTl9QT1JUX1NUUklOR184XzE2KCBpb19wb3J0LCBwdCwgaSApOyAvL3NwYWNlIHVzZWQgYnkgVDogLTEKCQkJfQoJCX0gZWxzZSBpZiAoIHR5cGUgPT0gQ0ZHX0NNRF9IQ0YgKSB7CiNkZWZpbmUgUCAoKENGR19DTURfSENGX1NUUkNUIEZBUiAqKWx0dnApCgkJCUhDRkFTU0VSVCggUC0+Y21kID09IENGR19DTURfSENGX1JFR19BQ0NFU1MsIFAtPmNtZCApOyAgICAgICAvL29ubHkgSGVybWVzIHJlZ2lzdGVyIGFjY2VzcyBzdXBwb3J0ZWQKCQkJaWYgKCBQLT5jbWQgPT0gQ0ZHX0NNRF9IQ0ZfUkVHX0FDQ0VTUyApIHsKCQkJCUhDRkFTU0VSVCggUC0+bW9kZSA8IGlmYnAtPklGQl9JT0Jhc2UsIFAtPm1vZGUgKTsgICAgICAgIC8vQ2hlY2sgUmVnaXN0ZXIgc3BhY2UKCQkJCWx0dnAtPmxlbiA9IG1pbiggbGVuLCA0ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9SRVNUT1JFIGx0diBsZW5ndGgKCQkJCVAtPmFkZF9pbmZvID0gSVBXKCBQLT5tb2RlICk7CgkJCX0KI3VuZGVmIFAKI2VuZGlmIC8vIEhDRl9FWFRfTklDX0FDQ0VTUwojaWYgKEhDRl9BU1NFUlQpICYgSENGX0FTU0VSVF9QUklOVEYKCQl9IGVsc2UgaWYgKHR5cGUgPT0gQ0ZHX0ZXX1BSSU5URikgewoJCQlyYyA9IGZ3X3ByaW50ZihpZmJwLCAoQ0ZHX0ZXX1BSSU5URl9TVFJDVCopbHR2cCk7CiNlbmRpZiAvLyBIQ0ZfQVNTRVJUX1BSSU5URgoJCX0gZWxzZSBpZiAoIHR5cGUgPj0gQ0ZHX1JJRF9GV19NSU4gKSB7Ci8vOz8gYnkgdXNpbmcgSENNRF9CVVNZIG9wdGlvbiB3aGVuIGNhbGxpbmcgY21kX2V4ZSwgdXNpbmcgYSBnZXRfZnJhZyB3aXRoIGxlbmd0aCAwIGp1c3QgdG8gc2V0IHVwIHRoZQovLzs/IEJBUCBhbmQgY2FsbGluZyBjbWRfY21wbCwgeW91IGNvdWxkIG1lcmdlIHRoZSAyIEJ1c3kgd2FpdHMuIFdoZXRoZXIgdGhpcyByZWFsbHkgaGVscHMgKGFuZCB3aGF0Ci8vOz8gd291bGQgYmUgdGhlIG9wdGltYWwgc2VxdWVuY2UgaW4gY21kX2V4ZSBhbmQgZ2V0X2ZyYWcpIHdvdWxkIGhhdmUgdG8gYmUgTUVBU1VSRUQKCQkvKjE3Ki8gIGlmICggKCByYyA9IGNtZF9leGUoIGlmYnAsIEhDTURfQUNDRVNTLCB0eXBlICkgKSA9PSBIQ0ZfU1VDQ0VTUyAmJgoJCQkJICggcmMgPSBzZXR1cF9iYXAoIGlmYnAsIHR5cGUsIDAsIElPX0lOICkgKSA9PSBIQ0ZfU1VDQ0VTUyApIHsKCQkJCWdldF9mcmFnKCBpZmJwLCAod2NpX2J1ZnApJmx0dnAtPmxlbiwgMipsZW4rMiBCRV9QQVIoMikgKTsKCQkJCWlmICggSVBXKCBIUkVHX1NUQVQgKSA9PSAweEZGRkYgKSB7ICAgICAgICAgICAgICAgICAvL05JQyByZW1vdmFsIHRlc3QKCQkJCQlsdHZwLT5sZW4gPSAwOwoJCQkJCUhDRkFTU0VSVCggRE9fQVNTRVJULCB0eXBlICk7CgkJCQl9CgkJCX0KCS8qMTIqLyAgfSBlbHNlIEhDRkFTU0VSVCggRE9fQVNTRVJULCB0eXBlICkgLypOT1AqLzsgLy9OT1AgaW4gY2FzZSBIQ0ZBU1NFUlQgaXMgZHVtbXkKCX0KCWlmICggbGVuIDwgbHR2cC0+bGVuICkgewoJCWx0dnAtPmxlbiA9IGxlbjsKCQlpZiAoIHJjID09IEhDRl9TVUNDRVNTICkgewoJCQlyYyA9IEhDRl9FUlJfTEVOOwoJCX0KCX0KCUhDRkFTU0VSVCggcmMgPT0gSENGX1NVQ0NFU1MgfHwgKCByYyA9PSBIQ0ZfRVJSX0xFTiAmJiBpZmJwLT5JRkJfQXNzZXJ0VHJhY2UgJiAxPDxIQ0ZfVFJBQ0VfUFVUX0lORk8gKSwKCQkgICBNRVJHRV8yKCB0eXBlLCByYyApICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qMjAqLwoJSENGTE9HRVhJVCggSENGX1RSQUNFX0dFVF9JTkZPICk7CglyZXR1cm4gcmM7Cn0gLy8gaGNmX2dldF9pbmZvCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKi5NT0RVTEUgICAgICAgIGludCBoY2ZfcHV0X2luZm8oIElGQlAgaWZicCwgTFRWUCBsdHZwICkKICouUFVSUE9TRSAgICAgICBUcmFuc2ZlcnMgb3BlcmF0aW9uIGFuZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIHRvIHRoZSBDYXJkIGFuZCB0byB0aGUgSENGLgogKgogKi5BUkdVTUVOVFMKICogICBpZmJwICAgICAgICBhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKICogICBsdHZwICAgICAgICBzcGVjaWZpZXMgdGhlIFJJRCAoYXMgZGVmaW5lZCBieSBIZXJtZXMgSS9GKSBvciBwc2V1ZG8tUklEIChhcyBkZWZpbmVkIGJ5IFdDSSkKICoKICouUkVUVVJOUwogKiAgIEhDRl9TVUNDRVNTCiAqISEgdmlhIGNtZF9leGUKICogICBIQ0ZfRVJSX05PX05JQyAgICAgIE5JQyByZW1vdmVkIGR1cmluZyBkYXRhIHJldHJpZXZhbAogKiAgIEhDRl9FUlJfVElNRV9PVVQgICAgRXhwZWN0ZWQgRi9XIGV2ZW50IGRpZCBub3Qgb2NjdXIgaW4gdGltZQogKiAgIEhDRl9FUlJfREVGVU5DVF8uLi4KICohISB2aWEgZG93bmxvYWQgICAgICAgICAgICAgICAgQ0ZHX0RMTlZfU1RBUlQgPD0gdHlwZSA8PSBDRkdfRExfU1RPUAogKiEhIHZpYSBwdXRfaW5mbyAgICAgICAgICAgICAgICBDRkdfUklEX0NGR19NSU4gPD0gdHlwZSA8PSBDRkdfUklEX0NGR19NQVgKICohISB2aWEgcHV0X2ZyYWcKICoKICouREVTQ1JJUFRJT04KICogVGhlIEwtZmllbGQgb2YgdGhlIExUVi1yZWNvcmQgKHByb3ZpZGVkIGJ5IHRoZSBNU0YgaW4gcGFyYW1ldGVyIGx0dnApIHNwZWNpZmllcyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyLgogKiBUaGUgTC12YWx1ZSBpbmNsdWRlcyB0aGUgc2l6ZSBvZiB0aGUgVC1maWVsZCwgYnV0IG5vdCB0aGUgc2l6ZSBvZiB0aGUgTC1maWVsZC4KICogVGhlIFQtIGZpZWxkIHNwZWNpZmllcyB0aGUgUklEIHBsYWNlZCBpbiB0aGUgVi1maWVsZCBieSB0aGUgTVNGLgogKgogKiBOb3QgYWxsIENGRy1jb2RlcyBjYW4gYmUgdXNlZCBmb3IgaGNmX3B1dF9pbmZvLiAgVGhlIGZvbGxvd2luZyBDRkctY29kZXMgYXJlIHZhbGlkIGZvciBoY2ZfcHV0X2luZm86CiAqIG8gT25lIG9mIHRoZSBDRkctY29kZXMgaW4gdGhlIGdyb3VwICJOZXR3b3JrIFBhcmFtZXRlcnMsIFN0YXRpYyBDb25maWd1cmF0aW9uIEVudGl0aWVzIgogKiBDaGFuZ2VzIG1hZGUgYnkgaGNmX3B1dF9pbmZvIHRvIENGR19jb2RlcyBpbiB0aGlzIGdyb3VwIHdpbGwgbm90IGFmZmVjdCB0aGUgRi9XCiAqIGFuZCBIQ0YgYmVoYXZpb3IgdW50aWwgaGNmX2NudGxfcG9ydCggSENGX1BPUlRfRU5BQkxFKSBpcyBjYWxsZWQuCiAqIG8gT25lIG9mIHRoZSBDRkctY29kZXMgaW4gdGhlIGdyb3VwICJOZXR3b3JrIFBhcmFtZXRlcnMsIER5bmFtaWMgQ29uZmlndXJhdGlvbiBFbnRpdGllcyIKICogQ2hhbmdlcyBtYWRlIGJ5IGhjZl9wdXRfaW5mbyB0byBDRkdfY29kZXMgd2lsbCBhZmZlY3QgdGhlIEYvVyBhbmQgSENGIGJlaGF2aW9yIGltbWVkaWF0ZWx5LgogKiBvIENGR19QUk9HLgogKiBUaGlzIGNvZGUgaXMgdXNlZCB0byBpbml0aWF0ZSBhbmQgdGVybWluYXRlIHRoZSBwcm9jZXNzIHRvIGRvd25sb2FkIGRhdGEgZWl0aGVyIHRvCiAqIHZvbGF0aWxlIG9yIHRvIG5vbi12b2xhdGlsZSBSQU0gb24gdGhlIE5JQyBhcyB3ZWxsIGFzIGZvciB0aGUgYWN0dWFsIGRvd25sb2FkLgogKiBvIENGRy1jb2RlcyByZWxhdGVkIHRvIHRoZSBIQ0YgYmVoYXZpb3IuCiAqIFRoZSByZWxhdGVkIENGRy1jb2RlcyBhcmU6CiAqICAtIENGR19SRUdfTUIKICogIC0gQ0ZHX1JFR19BU1NFUlRfUlROUAogKiAgLSBDRkdfUkVHX0lORk9fTE9HCiAqICAtIENGR19DTURfTklDCiAqICAtIENGR19DTURfRE9OR0xFCiAqICAtIENGR19DTURfSENGCiAqICAtIENGR19OT1RJRlkKICoKICogQWxsIExUVi1yZWNvcmRzICJ1bmtub3duIiB0byB0aGUgSENGIGFyZSBmb3J3YXJkZWQgdG8gdGhlIEYvVy4KICoKICogQXNzZXJ0IGZhaWxzIGlmCiAqIC0gaWZicCBoYXMgYSByZWNvZ25pemFibGUgb3V0LW9mLXJhbmdlIHZhbHVlLgogKiAtIGx0dnAgaXMgYSBOVUxMIHBvaW50ZXIuCiAqIC0gaGNmX3B1dF9pbmZvIHdhcyBjYWxsZWQgd2l0aG91dCBwcmlvciBjYWxsIHRvIGhjZl9jb25uZWN0CiAqIC0gdHlwZSBmaWVsZCBvZiB0aGUgTFRWLXJlY29yZCBpcyBpbnZhbGlkLCBpLmUuIG5laXRoZXIgSENGIG5vciBGL1cgY2FuIGhhbmRsZSB0aGUgdmFsdWUuCiAqIC0gbGVuZ3RoIGZpZWxkIG9mIHRoZSBMVFYtcmVjb3JkIGF0IGVudHJ5IGlzIGxlc3MgdGhhbiAxIG9yIGV4Y2VlZHMgTUFYX0xUVl9TSVpFLgogKiAtIHJlZ2lzdGVyaW5nIGEgTWFpbEJveCB3aXRoIHNpemUgbGVzcyB0aGFuIDYwIG9yIGEgbm9uLWFsaWduZWQgYnVmZmVyIGFkZHJlc3MgaXMgdXNlZC4KICogLSByZWVudHJhbmN5LCBtYXkgYmUgIGNhdXNlZCBieSBjYWxsaW5nIGhjZl9mdW5jdGlvbnMgd2l0aG91dCBhZGVxdWF0ZSBwcm90ZWN0aW9uIGFnYWluc3QKICogICBOSUMgaW50ZXJydXB0cyBvciBtdWx0aS10aHJlYWRpbmcuCiAqCiAqLkRJQUdSQU0KICoKICouTk9USUNFCiAqICAgUmVtYXJrczogIEluIGNhc2Ugb2YgSGVybWVzIENvbmZpZ3VyYXRpb24gTFRWcywgdGhlIGNvZGVzIGZvciB0aGUgdHlwZSBhcmUgImNsZXZlcmx5IiBjaG9zZW4gdG8gYmUKICogICBpZGVudGljYWwgdG8gdGhlIFJJRC4gSGVybWVzIENvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgY29waWVkIGZyb20gdGhlIHByb3ZpZGVkIGRhdGEgc3RydWN0dXJlIGludG8gdGhlCiAqICAgQ2FyZC4KICogICBJbiBjYXNlIG9mIEhDRiBDb25maWd1cmF0aW9uIExUVnMsIHRoZSB0eXBlIHZhbHVlcyBhcmUgY2hvc2VuIGluIGEgcmFuZ2Ugd2hpY2ggZG9lcyBub3Qgb3ZlcmxhcCB0aGUKICogICBSSUQtcmFuZ2UuCiAqCiAqMjA6CiAqCiAqLkVORERPQyAgICAgICAgICAgICAgICBFTkQgRE9DVU1FTlRBVElPTgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKaW50CmhjZl9wdXRfaW5mbyggSUZCUCBpZmJwLCBMVFZQIGx0dnAgKQp7CglpbnQgcmMgPSBIQ0ZfU1VDQ0VTUzsKCglIQ0ZMT0dFTlRSWSggSENGX1RSQUNFX1BVVF9JTkZPLCBsdHZwLT50eXAgKTsKCUhDRkFTU0VSVCggaWZicC0+SUZCX01hZ2ljID09IEhDRl9NQUdJQywgaWZicC0+SUZCX01hZ2ljICk7CglIQ0ZBU1NFUlRfSU5UOwoJSENGQVNTRVJUKCBsdHZwLCAwICk7CglIQ0ZBU1NFUlQoIDEgPCBsdHZwLT5sZW4gJiYgbHR2cC0+bGVuIDw9IEhDRl9NQVhfTFRWICsgMSwgbHR2cC0+bGVuICk7CgoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYWxsIGNvZGVzIGJldHdlZW4gMHhGQTAwIGFuZCAweEZDRkYgYXJlIHBhc3NlZCB0byBIZXJtZXMKI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XUEEKCXsKCQloY2ZfMTYgaTsKCQloY2ZfMzIgRkFSICoga2V5X3A7CgoJCWlmICggbHR2cC0+dHlwID09IENGR19BRERfVEtJUF9ERUZBVUxUX0tFWSB8fCBsdHZwLT50eXAgPT0gQ0ZHX0FERF9US0lQX01BUFBFRF9LRVkgKSB7CgkJCWtleV9wID0gKGhjZl8zMiopKChDRkdfQUREX1RLSVBfTUFQUEVEX0tFWV9TVFJDVCBGQVIgKilsdHZwKS0+dHhfbWljX2tleTsKCQkJaSA9IFRYX0tFWTsgICAgIC8vaS5lLiBUeEtleUluZGljYXRvciA9PSAxLCBLZXlJRCA9PSAwCgkJCWlmICggbHR2cC0+dHlwID09IENGR19BRERfVEtJUF9ERUZBVUxUX0tFWSApIHsKCQkJCWtleV9wID0gKGhjZl8zMiopKChDRkdfQUREX1RLSVBfREVGQVVMVF9LRVlfU1RSQ1QgRkFSICopbHR2cCktPnR4X21pY19rZXk7CgkJCQlpID0gQ05WX0xJVFRMRV9UT19TSE9SVCgoKENGR19BRERfVEtJUF9ERUZBVUxUX0tFWV9TVFJDVCBGQVIgKilsdHZwKS0+dGtpcF9rZXlfaWRfaW5mbyk7CgkJCX0KCQkJaWYgKCBpICYgVFhfS0VZICkgeyAvKiBUeEtleUluZGljYXRvciA9PSAxCgkJCQkJICAgICAgIChlaXRoZXIgcmVhbGx5IHNldCBieSBNU0YgaW4gY2FzZSBvZiBERUZBVUxUIG9yIGZha2VkIGJ5IEhDRiBpbiBjYXNlIG9mIE1BUFBFRCApICovCgkJCQlpZmJwLT5JRkJfTUlDVHhDbnRsID0gKGhjZl8xNikoIEhGU19UWF9DTlRMX01JQyB8IChpICYgS0VZX0lEICk8PDggKTsKCQkJCWlmYnAtPklGQl9NSUNUeEtleVswXSA9IENOVl9MT05HUF9UT19MSVRUTEUoIGtleV9wICk7CgkJCQlpZmJwLT5JRkJfTUlDVHhLZXlbMV0gPSBDTlZfTE9OR1BfVE9fTElUVExFKCAoa2V5X3ArMSkgKTsKCQkJfQoJCQlpID0gKCBpICYgS0VZX0lEICkgKiAyOwoJCQlpZmJwLT5JRkJfTUlDUnhLZXlbaV0gICA9IENOVl9MT05HUF9UT19MSVRUTEUoIChrZXlfcCsyKSApOwoJCQlpZmJwLT5JRkJfTUlDUnhLZXlbaSsxXSA9IENOVl9MT05HUF9UT19MSVRUTEUoIChrZXlfcCszKSApOwoJCX0KI2RlZmluZSBQICgoQ0ZHX1JFTU9WRV9US0lQX0RFRkFVTFRfS0VZX1NUUkNUIEZBUiAqKWx0dnApCgkJaWYgKCAoIGx0dnAtPnR5cCA9PSBDRkdfUkVNT1ZFX1RLSVBfTUFQUEVEX0tFWSApICAgIHx8CgkJICAgICAoIGx0dnAtPnR5cCA9PSBDRkdfUkVNT1ZFX1RLSVBfREVGQVVMVF9LRVkgJiYKCQkgICAgICAgKCAoaWZicC0+SUZCX01JQ1R4Q250bCA+PiA4KSAmIEtFWV9JRCApID09IENOVl9TSE9SVF9UT19MSVRUTEUoUC0+dGtpcF9rZXlfaWQgKQoJCQkgICAgICkKCQkJKSB7IGlmYnAtPklGQl9NSUNUeENudGwgPSAwOyB9ICAgICAgLy9kaXNhYmxlIE1JQy1lbmdpbmUKI3VuZGVmIFAKCX0KI2VuZGlmIC8vIEhDRl9UWVBFX1dQQQoKCWlmICggbHR2cC0+dHlwID09IENGR19QUk9HICkgewoJCXJjID0gZG93bmxvYWQoIGlmYnAsIChDRkdfUFJPR19TVFJDVCBGQVIgKilsdHZwICk7Cgl9IGVsc2Ugc3dpdGNoIChsdHZwLT50eXApIHsKI2lmIChIQ0ZfQVNTRVJUKSAmIEhDRl9BU1NFUlRfUlRfTVNGX1JUTgoJCWNhc2UgQ0ZHX1JFR19BU1NFUlRfUlROUDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vUmVnaXN0ZXIgTVNGIFJvdXRpbmVzCiNkZWZpbmUgUCAoKENGR19SRUdfQVNTRVJUX1JUTlBfU1RSQ1QgRkFSICopbHR2cCkKCQkJaWZicC0+SUZCX0Fzc2VydFJ0biA9IFAtPnJ0bnA7Ci8vCQkJaWZicC0+SUZCX0Fzc2VydEx2bCA9IFAtPmx2bDsgICAgICAgLy9UT0RPIG5vdCB5ZXQgc3VwcG9ydGVkIHNvIGRlZmF1bHQgaXMgc2V0IGluIGhjZl9jb25uZWN0CgkJCUhDRkFTU0VSVCggRE9fQVNTRVJULCBNRVJHRV8yKCBIQ0ZfQVNTRVJULCAweENBRjEgKSApOyAgIC8vanVzdCB0byBwcm9vZiB0aGF0IHRoZSBjb21wbGV0ZSBhc3NlcnQgbWFjaGluZXJ5IGlzIHdvcmtpbmcKI3VuZGVmIFAKCQkJYnJlYWs7CiNlbmRpZiAvLyBIQ0ZfQVNTRVJUX1JUX01TRl9SVE4KI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfSU5GT19MT0cKCQljYXNlIENGR19SRUdfSU5GT19MT0c6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1JlZ2lzdGVyIExvZyBmaWx0ZXIKCQkJaWZicC0+SUZCX1JJRExvZ3AgPSAoKENGR19SSURfTE9HX1NUUkNUIEZBUiopbHR2cCktPnJlY29yZHA7CgkJCWJyZWFrOwojZW5kaWYgLy8gSENGX0VYVF9JTkZPX0xPRwoJCWNhc2UgQ0ZHX0NOVExfT1BUOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vb3ZlcnJ1bGUgb3B0aW9uCgkJCUhDRkFTU0VSVCggKCBsdHZwLT52YWxbMF0gJiB+KFVTRV9ETUEgfCBVU0VfMTZCSVQpICkgPT0gMCwgbHR2cC0+dmFsWzBdICk7CgkJCWlmICggKCBsdHZwLT52YWxbMF0gJiBVU0VfRE1BICkgPT0gMCApIGlmYnAtPklGQl9DbnRsT3B0ICY9IH5VU0VfRE1BOwoJCQlpZmJwLT5JRkJfQ250bE9wdCB8PSAgbHR2cC0+dmFsWzBdICYgVVNFXzE2QklUOwoJCQlicmVhazsKCgkJY2FzZSBDRkdfUkVHX01COiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9SZWdpc3RlciBNYWlsQm94CiNkZWZpbmUgUCAoKENGR19SRUdfTUJfU1RSQ1QgRkFSICopbHR2cCkKCQkJSENGQVNTRVJUKCAoIChoY2ZfMzIpUC0+bWJfYWRkciAmIDB4MDAwMSApID09IDAsIChoY2ZfMzIpUC0+bWJfYWRkciApOwoJCQlIQ0ZBU1NFUlQoIChQKS0+bWJfc2l6ZSA+PSA2MCwgKFApLT5tYl9zaXplICk7CgkJCWlmYnAtPklGQl9NQnAgPSBQLT5tYl9hZGRyOwoJCQkvKiBpZiBubyBNQiBwcmVzZW50LCBzaXplIG11c3QgYmUgMCBmb3IgOz90aGUgb2xkOz8gcHV0X2luZm9fbWIgdG8gd29yayBjb3JyZWN0bHkgKi8KCQkJaWZicC0+SUZCX01CU2l6ZSA9IGlmYnAtPklGQl9NQnAgPT0gTlVMTCA/IDAgOiBQLT5tYl9zaXplOwoJCQlpZmJwLT5JRkJfTUJXcCA9IGlmYnAtPklGQl9NQlJwID0gMDsKCQkJaWZicC0+SUZCX01CcFswXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmxhZyB0aGUgTWFpbEJveCBhcyBlbXB0eQoJCQlpZmJwLT5JRkJfTUJJbmZvTGVuID0gMDsKCQkJSENGQVNTRVJUKCBpZmJwLT5JRkJfTUJTaXplID49IDYwIHx8IGlmYnAtPklGQl9NQnAgPT0gTlVMTCwgaWZicC0+SUZCX01CU2l6ZSApOwojdW5kZWYgUAoJCQlicmVhazsKCQljYXNlIENGR19NQl9JTkZPOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3N0b3JlIE1haWxCb3hJbmZvQmxvY2sKCQkJcmMgPSBwdXRfaW5mb19tYiggaWZicCwgKENGR19NQl9JTkZPX1NUUkNUIEZBUiAqKWx0dnAgKTsKCQkJYnJlYWs7CgojaWYgKEhDRl9FWFQpICYgSENGX0VYVF9OSUNfQUNDRVNTCgkJY2FzZSBDRkdfQ01EX05JQzoKI2RlZmluZSBQICgoQ0ZHX0NNRF9OSUNfU1RSQ1QgRkFSICopbHR2cCkKCQkJT1BXKCBIUkVHX1BBUkFNXzIsIFAtPnBhcm0yICk7CgkJCU9QVyggSFJFR19QQVJBTV8xLCBQLT5wYXJtMSApOwoJCQlyYyA9IGNtZF9leGUoIGlmYnAsIFAtPmNtZCwgUC0+cGFybTAgKTsKCQkJUC0+aGNmX3N0YXQgPSAoaGNmXzE2KXJjOwoJCQlQLT5zdGF0ID0gSVBXKCBIUkVHX1NUQVQgKTsKCQkJUC0+cmVzcDAgPSBJUFcoIEhSRUdfUkVTUF8wICk7CgkJCVAtPnJlc3AxID0gSVBXKCBIUkVHX1JFU1BfMSApOwoJCQlQLT5yZXNwMiA9IElQVyggSFJFR19SRVNQXzIgKTsKCQkJUC0+aWZiX2Vycl9jbWQgPSBpZmJwLT5JRkJfRXJyQ21kOwoJCQlQLT5pZmJfZXJyX3F1YWxpZmllciA9IGlmYnAtPklGQl9FcnJRdWFsaWZpZXI7CiN1bmRlZiBQCgkJCWJyZWFrOwoJCWNhc2UgQ0ZHX0NNRF9IQ0Y6CiNkZWZpbmUgUCAoKENGR19DTURfSENGX1NUUkNUIEZBUiAqKWx0dnApCgkJCUhDRkFTU0VSVCggUC0+Y21kID09IENGR19DTURfSENGX1JFR19BQ0NFU1MsIFAtPmNtZCApOyAgICAgICAvL29ubHkgSGVybWVzIHJlZ2lzdGVyIGFjY2VzcyBzdXBwb3J0ZWQKCQkJaWYgKCBQLT5jbWQgPT0gQ0ZHX0NNRF9IQ0ZfUkVHX0FDQ0VTUyApIHsKCQkJCUhDRkFTU0VSVCggUC0+bW9kZSA8IGlmYnAtPklGQl9JT0Jhc2UsIFAtPm1vZGUgKTsgICAgICAgIC8vQ2hlY2sgUmVnaXN0ZXIgc3BhY2UKCQkJCU9QVyggUC0+bW9kZSwgUC0+YWRkX2luZm8pOwoJCQl9CiN1bmRlZiBQCgkJCWJyZWFrOwojZW5kaWYgLy8gSENGX0VYVF9OSUNfQUNDRVNTCgojaWYgKEhDRl9BU1NFUlQpICYgSENGX0FTU0VSVF9QUklOVEYKCQljYXNlIENGR19GV19QUklOVEZfQlVGRkVSX0xPQ0FUSU9OOgoJCQlpZmJwLT5JRkJfRndQZkJ1ZmYgPSAqKENGR19GV19QUklOVEZfQlVGRkVSX0xPQ0FUSU9OX1NUUkNUKilsdHZwOwoJCQlicmVhazsKI2VuZGlmIC8vIEhDRl9BU1NFUlRfUFJJTlRGCgoJCWRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgIC8vcGFzcyBldmVyeXRoaW5nIHVua25vd24gYWJvdmUgdGhlICJGSUQiIHJhbmdlIHRvIHRoZSBIZXJtZXMgb3IgRG9uZ2xlCgkJCXJjID0gcHV0X2luZm8oIGlmYnAsIGx0dnAgKTsKCQl9CgkvL0RPIE5PVCAhISEgSENGQVNTRVJUKCByYyA9PSBIQ0ZfU1VDQ0VTUywgcmMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIwICovCglIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfUFVUX0lORk8gKTsKCXJldHVybiByYzsKfSAvLyBoY2ZfcHV0X2luZm8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqLk1PRFVMRSAgICAgICAgaW50IGhjZl9yY3ZfbXNnKCBJRkJQIGlmYnAsIERFU0NfU1RSQ1QgKmRlc2NwLCB1bnNpZ25lZCBpbnQgb2Zmc2V0ICkKICouUFVSUE9TRSAgICAgICBBbGw6IGRlY2Fwc3VsYXRlIGEgbWVzc2FnZS4KICogICAgICAgICAgICAgICBwcmUtSGVybWVzSUkuNTogdmVyaWZ5IE1JQy4KICogICAgICAgICAgICAgICBub24tVVNCLCBub24tRE1BIG1vZGU6IFRyYW5zZmVyIGEgbWVzc2FnZSBmcm9tIHRoZSBOSUMgdG8gdGhlIEhvc3QgYW5kIGFja25vd2xlZGdlIHJlY2VwdGlvbi4KICogICAgICAgICAgICAgICBVU0I6IFRyYW5zZm9ybSBhIG1lc3NhZ2UgZnJvbSBwcm9wcmlldGFyeSBVU0IgZm9ybWF0IHRvIDgwMi4zIGZvcm1hdAogKgogKi5BUkdVTUVOVFMKICogICBpZmJwICAgICAgICBhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKICogICBkZXNjcCAgICAgICBQb2ludGVyIHRvIHRoZSBEZXNjcmlwdG9yIExpc3QgbG9jYXRpb24uCiAqICAgb2Zmc2V0ICAgICAgVVNCOiBub3QgdXNlZAogKiAgICAgICAgICAgICAgIG5vbi1VU0I6IHNwZWNpZmllcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkYXRhIHRvIGJlIG9idGFpbmVkICgwIGNvcnJlc3BvbmRzIHdpdGggRGVzdEFkZHIgZmllbGQKICogICAgICAgICAgICAgICBvZiBmcmFtZSkuCiAqCiAqLlJFVFVSTlMKICogICBIQ0ZfU1VDQ0VTUyAgICAgICAgIE5vIFdQQSBlcnJvciAoIG9yIEhDRl9FUlJfTUlDIGFscmVhZHkgcmVwb3J0ZWQgYnkgaGNmX3NlcnZpY2VfbmljKQogKiAgIEhDRl9FUlJfTUlDICAgICAgICAgbWVzc2FnZSBjb250YWlucyBhbiBlcnJvbmVvdXMgTUlDICggSENGX1NVQ0NFU1MgaXMgcmVwb3J0ZWQgaWYgSENGX0VSUl9NSUMgaXMgYWxyZWFkeQogKiAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZWQgYnkgaGNmX3NlcnZpY2VfbmljKQogKiAgIEhDRl9FUlJfTk9fTklDICAgICAgTklDIHJlbW92ZWQgZHVyaW5nIGRhdGEgcmV0cmlldmFsCiAqICAgSENGX0VSUl9ERUZVTkNULi4uCiAqCiAqLkRFU0NSSVBUSU9OCiAqIFRoZSBSZWNlaXZlIE1lc3NhZ2UgRnVuY3Rpb24gY2FuIGJlIGV4ZWN1dGVkIGJ5IHRoZSBNU0YgdG8gb2J0YWluIHRoZSBEYXRhIEluZm8gZmllbGRzIG9mIHRoZSBtZXNzYWdlIHRoYXQKICogaXMgcmVwb3J0ZWQgdG8gYmUgYXZhaWxhYmxlIGJ5IHRoZSBTZXJ2aWNlIE5JQyBGdW5jdGlvbi4KICoKICogVGhlIFJlY2VpdmUgTWVzc2FnZSBGdW5jdGlvbiBjb3BpZXMgdGhlIG1lc3NhZ2UgZGF0YSBhdmFpbGFibGUgaW4gdGhlIENhcmQgbWVtb3J5IGludG8gYSBidWZmZXIgc3RydWN0dXJlCiAqIHByb3ZpZGVkIGJ5IHRoZSBNU0YuCiAqIE9ubHkgZGF0YSBvZiB0aGUgbWVzc2FnZSBpbmRpY2F0ZWQgYnkgdGhlIFNlcnZpY2UgTklDIEZ1bmN0aW9uIGNhbiBiZSBvYnRhaW5lZC4KICogRXhlY3V0aW9uIG9mIHRoZSBTZXJ2aWNlIE5JQyBmdW5jdGlvbiBtYXkgcmVzdWx0IGluIHRoZSBhdmFpbGFiaWxpdHkgb2YgYSBuZXcgbWVzc2FnZSwgYnV0IGl0IGRlZmluaXRlbHkKICogbWFrZXMgdGhlIG1lc3NhZ2UgcmVwb3J0ZWQgYnkgdGhlIHByZWNlZGluZyBTZXJ2aWNlIE5JQyBmdW5jdGlvbiwgdW5hdmFpbGFibGUuCiAqCiAqIGluIG5vbi1VU0Ivbm9uLURNQSBtb2RlLCBoY2ZfcmN2X21zZyBzdGFydHMgdGhlIGNvcHkgcHJvY2VzcyBhdCB0aGUgKG5vbi1uZWdhdGl2ZSkgb2Zmc2V0IHJlcXVlc3RlZCBieSB0aGUKICogcGFyYW1ldGVyIG9mZnNldCwgcmVsYXRpdmUgdG8gSEZTX0FERFJfREVTVCwgZS5nIG9mZnNldCAwIHN0YXJ0cyBjb3B5aW5nIGZyb20gdGhlIERlc3RpbmF0aW9uIEFkZHJlc3MsIHRoZQogKiB2ZXJ5IGJlZ2luIG9mIHRoZSA4MDIuMyBmcmFtZSBtZXNzYWdlLiBPZmZzZXQgbXVzdCBlaXRoZXIgbGF5IHdpdGhpbiB0aGUgcGFydCBvZiB0aGUgODAyLjMgZnJhbWUgYXMgc3RvcmVkCiAqIGJ5IGhjZl9zZXJ2aWNlX25pYyBpbiB0aGUgbG9va2FoZWFkIGJ1ZmZlciBvciBiZSBqdXN0IGJlaGluZCBpdCwgaS5lLiB0aGUgZmlyc3QgYnl0ZSBub3QgeWV0IHJlYWQuCiAqIFdoZW4gb2Zmc2V0IGlzIHdpdGhpbiBsb29rYWhlYWQsIGRhdGEgaXMgY29waWVkIGZyb20gbG9va2FoZWFkLgogKiBXaGVuIG9mZnNldCBpcyBiZXlvbmQgbG9va2FoZWFkLCBkYXRhIGlzIHJlYWQgZGlyZWN0bHkgZnJvbSBSeEZTIGluIE5JQyB3aXRoIGRpc3JlZ2FyZCBvZiB0aGUgYWN0dWFsIHZhbHVlCiAqIG9mIG9mZnNldAogKgogKi5OT1RJQ0U6CiAqIG8gYXQgZW50cnk6IGxvb2sgYWhlYWQgYnVmZmVyIGFzIHBhc3NlZCB3aXRoIGhjZl9zZXJ2aWNlX25pYyBpcyBzdGlsbCBhY2Nlc3NpYmxlIGFuZCB1bmNoYW5nZWQKICogbyBhdCBleGl0OiBSZWNlaXZlIEZyYW1lIGluIE5JQyBtZW1vcnkgaXMgcmVsZWFzZWQKICoKICogRGVzY3JpcHRpb246CiAqIFN0YXJ0aW5nIGF0IHRoZSBieXRlIGluZGljYXRlZCBieSB0aGUgT2Zmc2V0IHZhbHVlLCB0aGUgYnl0ZXMgYXJlIGNvcGllZCBmcm9tIHRoZSBEYXRhIEluZm8KICogUGFydCBvZiB0aGUgY3VycmVudCBSZWNlaXZlIEZyYW1lIFN0cnVjdHVyZSB0byB0aGUgSG9zdCBtZW1vcnkgZGF0YSBidWZmZXIgc3RydWN0dXJlCiAqIGlkZW50aWZpZWQgYnkgZGVzY3AuCiAqIFRoZSBtYXhpbXVtIHZhbHVlIGZvciBPZmZzZXQgaXMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIG9mIHRoZSA4MDIuMyBmcmFtZSByZWFkIGludG8gdGhlCiAqIGxvb2sgYWhlYWQgYnVmZmVyIGJ5IGhjZl9zZXJ2aWNlX25pYyAoaS5lLiB0aGUgbG9vayBhaGVhZCBidWZmZXIgc2l6ZSBtaW51cwogKiBDb250cm9sIGFuZCA4MDIuMTEgZmllbGRzKQogKiBJZiBPZmZzZXQgaXMgbGVzcyB0aGFuIHRoZSBtYXhpbXVtIHZhbHVlLCBjb3B5aW5nIHN0YXJ0cyBmcm9tIHRoZSBsb29rIGFoZWFkIGJ1ZmZlciB0aWxsIHRoZQogKiBlbmQgb2YgdGhhdCBidWZmZXIgaXMgcmVhY2hlZAogKiBUaGVuIChvciBpZiB0aGUgbWF4aW11bSB2YWx1ZSBpcyBzcGVjaWZpZWQgZm9yIE9mZnNldCksIHRoZQogKiBtZXNzYWdlIGlzIGRpcmVjdGx5IGNvcGllZCBmcm9tIE5JQyBtZW1vcnkgdG8gSG9zdCBtZW1vcnkuCiAqIElmIGFuIGludmFsaWQgKGkuZS4gdG9vIGxhcmdlKSBvZmZzZXQgaXMgc3BlY2lmaWVkLCBhbiBhc3NlcnQgY2F0Y2hlcyBidXQgdGhlIGJ1ZmZlciBjb250ZW50cyBhcmUKICogdW5kZWZpbmVkLgogKiBDb3B5aW5nIHN0b3BzIGlmIGVpdGhlcjoKICogbyB0aGUgZW5kIG9mIHRoZSA4MDIuMyBmcmFtZSBpcyByZWFjaGVkCiAqIG8gdGhlIERlc2NyaXB0b3Igd2l0aCBhIE5VTEwgcG9pbnRlciBpbiB0aGUgbmV4dF9kZXNjX2FkZHIgZmllbGQgaXMgcmVhY2hlZAogKgogKiBXaGVuIHRoZSBjb3B5aW5nIHN0b3BzLCB0aGUgcmVjZWl2ZXIgaXMgYWNrJ2VkLCB0aHVzIGZyZWVpbmcgdGhlIE5JQyBtZW1vcnkgd2hlcmUgdGhlIGZyYW1lIGlzIHN0b3JlZAogKiBBcyBhIGNvbnNlcXVlbmNlLCBoY2ZfcmN2X21zZyBjYW4gb25seSBiZSBjYWxsZWQgb25jZSBmb3IgYW55IHBhcnRpY3VsYXIgUnggZnJhbWUuCiAqCiAqIEZvciB0aGUgdGltZSBiZWluZyAoUENJIEJ1cyBtYXN0ZXJpbmcgbm90IHlldCBzdXBwb3J0ZWQpLCBvbmx5IHRoZSBmb2xsb3dpbmcgZmllbGRzIG9mIGVhY2gKICogb2YgdGhlIGRlc2NyaXB0b3JzIGluIHRoZSBkZXNjcmlwdG9yIGxpc3QgbXVzdCBiZSBzZXQgYnkgdGhlIE1TRjoKICogbyBidWZfY250bC5idWZfZGltWzFdCiAqIG8gKm5leHRfZGVzY19hZGRyCiAqIG8gKmJ1Zl9hZGRyCiAqIEF0IHJldHVybiBmcm9tIGhjZl9yY3ZfbXNnLCB0aGUgZmllbGQgYnVmX2NudGwuYnVmX2RpbVswXSBvZiB0aGUgdXNlZCBEZXNjcmlwdG9ycyByZWZsZWN0cwogKiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBidWZmZXIgY29ycmVzcG9uZGluZyB3aXRoIHRoZSBEZXNjcmlwdG9yLgogKiBPbiB0aGUgbGFzdCB1c2VkIERlc2NyaXB0b3IsIGJ1Zl9jbnRsLmJ1Zl9kaW1bMF0gaXMgbGVzcyBvciBlcXVhbCB0byBidWZfY250bC5idWZfZGltWzFdLgogKiBPbiBhbGwgcHJlY2VkaW5nIERlc2NyaXB0b3JzIGJ1Zl9jbnRsLmJ1Zl9kaW1bMF0gaXMgZXF1YWwgdG8gYnVmX2NudGwuYnVmX2RpbVsxXS4KICogT24gYWxsIHN1Y2NlZWRpbmcgKHVudXNlZCkgRGVzY3JpcHRvcnMsIGJ1Zl9jbnRsLmJ1Zl9kaW1bMF0gaXMgemVyby4KICogTm90ZTogdGhpcyBJL0YgaXMgYmFzZWQgb24gdGhlIGFzc3VtcHRpb25zIGhvdyB0aGUgSS9GIG5lZWRlZCBmb3IgUENJIEJ1cyBtYXN0ZXJpbmcgd2lsbAogKiBiZSwgc28gaXQgbWF5IGNoYW5nZS4KICoKICogVGhlIG1vc3QgbGlrZWx5IGhhbmRsaW5nIG9mIEhDRl9FUlJfTk9fTklDIGJ5IHRoZSBNU0YgaXMgdG8gZHJvcCB0aGUgYWxyZWFkeSBjb3BpZWQKICogZGF0YSBhcyBlbGVnYW50bHkgYXMgcG9zc2libGUgdW5kZXIgdGhlIGNvbnN0cmFpbnRzIGFuZCByZXF1aXJlbWVudHMgcG9zZWQgYnkgdGhlIChOKU9TLgogKiBJZiBubyByZWNlaXZlZCBGcmFtZSBTdHJ1Y3R1cmUgaXMgcGVuZGluZywgIlN1Y2Nlc3MiIHJhdGhlciB0aGFuICJSZWFkIGVycm9yIiBpcyByZXR1cm5lZC4KICogVGhpcyBlcnJvciBjb25zdGl0dXRlcyBhIGxvZ2ljIGZsYXcgaW4gdGhlIE1TRgogKiBUaGUgSENGIGNhbiBvbmx5IGNhdGNoIGEgbWlub3JpdHkgb2YgdGhpcwogKiB0eXBlIG9mIGVycm9ycwogKiBCYXNlZCBvbiBjb25zaXN0ZW5jeSBpZGVhcywgdGhlIEhDRiBjYXRjaGVzIG5vbmUgb2YgdGhlc2UgZXJyb3JzLgogKgogKiBBc3NlcnQgZmFpbHMgaWYKICogLSBpZmJwIGhhcyBhIHJlY29nbml6YWJsZSBvdXQtb2YtcmFuZ2UgdmFsdWUKICogLSB0aGVyZSBpcyBubyB1bmFja25vd2xlZGdlZCBSeC1tZXNzYWdlIGF2YWlsYWJsZQogKiAtIG9mZnNldCBpcyBvdXQgb2YgcmFuZ2UgKG91dHNpZGUgbG9vayBhaGVhZCBidWZmZXIpCiAqIC0gZGVzY3AgaXMgYSBOVUxMIHBvaW50ZXIKICogLSBhbnkgb2YgdGhlIGRlc2NyaXB0b3JzIGlzIG5vdCBkb3VibGUgd29yZCBhbGlnbmVkCiAqIC0gcmVlbnRyYW5jeSwgbWF5IGJlICBjYXVzZWQgYnkgY2FsbGluZyBoY2ZfZnVuY3Rpb25zIHdpdGhvdXQgYWRlcXVhdGUgcHJvdGVjdGlvbgogKiAgIGFnYWluc3QgTklDIGludGVycnVwdHMgb3IgbXVsdGktdGhyZWFkaW5nLgogKiAtIEludGVycnVwdHMgYXJlIGVuYWJsZWQuCiAqCiAqLkRJQUdSQU0KICoKICouTk9USUNFCiAqIC0gYnkgdXNpbmcgdW5zaWduZWQgaW50IGFzIHR5cGUgZm9yIG9mZnNldCwgbm8gbmVlZCB0byB3b3JyeSBhYm91dCBuZWdhdGl2ZSBvZmZzZXRzCiAqIC0gQXNzZXJ0aW5nIG9uIGJlaW5nIGVuYWJsZWQvcHJlc2VudCBpcyBzdXBlcmZsdW91cywgc2luY2UgYSBub24temVybyBJRkJfbGFsIGltcGxpZXMgdGhhdCBoY2Zfc2VydmljZV9uaWMKICogICB3YXMgY2FsbGVkIGFuZCBkZXRlY3RlZCBhIFJ4LW1lc3NhZ2UuIEEgemVybyBJRkJfbGFsIHdpbGwgc2V0IHRoZSBCVUZfQ05UIGZpZWxkIG9mIGF0IGxlYXN0IHRoZSBmaXJzdAogKiAgIGRlc2NyaXB0b3IgdG8gemVyby4KICoKICouRU5ERE9DICAgICAgICAgICAgICAgIEVORCBET0NVTUVOVEFUSU9OCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludApoY2ZfcmN2X21zZyggSUZCUCBpZmJwLCBERVNDX1NUUkNUICpkZXNjcCwgdW5zaWduZWQgaW50IG9mZnNldCApCnsKCWludCAgICAgICAgIHJjID0gSENGX1NVQ0NFU1M7Cgl3Y2lfYnVmcCAgICBjcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jaGFyIG9yaWVudGVkIHdvcmtpbmcgcG9pbnRlcgoJaGNmXzE2ICAgICAgaTsKCWludCAgICAgICAgIHRvdF9sZW4gPSBpZmJwLT5JRkJfUnhMZW4gLSBvZmZzZXQ7ICAgICAvL3RvdGFsIGxlbmd0aAoJd2NpX2J1ZnAgICAgbGFwID0gaWZicC0+SUZCX2xhcCArIG9mZnNldDsgICAgICAgICAgIC8vc3RhcnQgYWRkcmVzcyBpbiBMb29rQWhlYWQgQnVmZmVyCgloY2ZfMTYgICAgICBsYWwgPSBpZmJwLT5JRkJfbGFsIC0gb2Zmc2V0OyAgICAgICAgICAgLy9hdmFpbGFibGUgZGF0YSB3aXRoaW4gTG9va0FoZWFkIEJ1ZmZlcgoJaGNmXzE2ICAgICAgajsKCglIQ0ZMT0dFTlRSWSggSENGX1RSQUNFX1JDVl9NU0csIG9mZnNldCApOwoJSENGQVNTRVJUKCBpZmJwLT5JRkJfTWFnaWMgPT0gSENGX01BR0lDLCBpZmJwLT5JRkJfTWFnaWMgKTsKCUhDRkFTU0VSVF9JTlQ7CglIQ0ZBU1NFUlQoIGRlc2NwLCBIQ0ZfVFJBQ0VfUkNWX01TRyApOwoJSENGQVNTRVJUKCBpZmJwLT5JRkJfUnhMZW4sIEhDRl9UUkFDRV9SQ1ZfTVNHICk7CglIQ0ZBU1NFUlQoIGlmYnAtPklGQl9SeExlbiA+PSBvZmZzZXQsIE1FUkdFXzIoIG9mZnNldCwgaWZicC0+SUZCX1J4TGVuICkgKTsKCUhDRkFTU0VSVCggaWZicC0+SUZCX2xhbCA+PSBvZmZzZXQsIG9mZnNldCApOwoJSENGQVNTRVJUKCAoaWZicC0+SUZCX0NudGxPcHQgJiBVU0VfRE1BKSA9PSAwLCAweERBREEgKTsKCglpZiAoIHRvdF9sZW4gPCAwICkgewoJCWxhbCA9IDA7IHRvdF9sZW4gPSAwOyAgICAgICAgICAgICAgIC8vc3VwcHJlc3MgYWxsIGNvcHlpbmcgYWN0aXZpdHkgaW4gdGhlIGRvLS13aGlsZSBsb29wCgl9CglkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9sb29wIG92ZXIgYWxsIGF2YWlsYWJsZSBmcmFnbWVudHMKCQkvLyBvYm5veGlvdXMgaGNmLmMoMTQ4MCkgOiB3YXJuaW5nIEM0NzY5OiBjb252ZXJzaW9uIG9mIG5lYXIgcG9pbnRlciB0byBsb25nIGludGVnZXIKCQlIQ0ZBU1NFUlQoICgoaGNmXzMyKWRlc2NwICYgMyApID09IDAsIChoY2ZfMzIpZGVzY3AgKTsKCQljcCA9IGRlc2NwLT5idWZfYWRkcjsKCQlqID0gbWluKCAoaGNmXzE2KXRvdF9sZW4sIGRlc2NwLT5CVUZfU0laRSApOyAgICAvL21pbmltdW0gb2YgIndoYXQnc2AgYXZhaWxhYmxlIiBhbmQgZnJhZ21lbnQgc2l6ZQoJCWRlc2NwLT5CVUZfQ05UID0gajsKCQl0b3RfbGVuIC09IGo7ICAgICAgICAgICAgICAgICAgICAgICAvL2FkanVzdCBsZW5ndGggc3RpbGwgdG8gZ28KCQlpZiAoIGxhbCApIHsgICAgICAgICAgICAgICAgICAgICAgICAvL2lmIGxvb2thaGVhZCBCdWZmZXIgbm90IHlldCBjb21wbGV0ZWx5IGNvcGllZAoJCQlpID0gbWluKCBsYWwsIGogKTsgICAgICAgICAgICAgIC8vbWluaW11bSBvZiAid2hhdCdzIGF2YWlsYWJsZSIgaW4gTG9va0FoZWFkIGFuZCBmcmFnbWVudCBzaXplCgkJCWxhbCAtPSBpOyAgICAgICAgICAgICAgICAgICAgICAgLy9hZGp1c3QgbGVuZ3RoIHN0aWxsIGF2YWlsYWJsZSBpbiBMb29rQWhlYWQKCQkJaiAtPSBpOyAgICAgICAgICAgICAgICAgICAgICAgICAvL2FkanVzdCBsZW5ndGggc3RpbGwgYXZhaWxhYmxlIGluIGN1cnJlbnQgZnJhZ21lbnQKCQkJLyo7PyB3aGlsZSBsb29wIGNvdWxkIGJlIGltcHJvdmVkIGJ5IG1vdmluZyB3b3JkcyBidXQgdGhhdCBpcyBjb21wbGljYXRlZCBvbiBwbGF0Zm9ybXMgd2l0aAoJCQkgKiBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzKi8KCQkJd2hpbGUgKCBpLS0gKSAqY3ArKyA9ICpsYXArKzsKCQl9CgkJaWYgKCBqICkgeyAgLy9pZiBMb29rQWhlYWQgQnVmZmVyIGV4aGF1c3RlZCBidXQgc3RpbGwgc3BhY2UgaW4gZnJhZ21lbnQsIGNvcHkgZGlyZWN0bHkgZnJvbSBOSUMgUkFNCgkJCWdldF9mcmFnKCBpZmJwLCBjcCwgaiBCRV9QQVIoMCkgKTsKCQkJQ0FMQ19SWF9NSUMoIGNwLCBqICk7CgkJfQoJfSB3aGlsZSAoICggZGVzY3AgPSBkZXNjcC0+bmV4dF9kZXNjX2FkZHIgKSAhPSBOVUxMICk7CiNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV1BBCglpZiAoIGlmYnAtPklGQl9SeEZJRCApIHsKCQlyYyA9IGNoZWNrX21pYyggaWZicCApOyAgICAgICAgICAgICAvL3ByZXZlbnRzIE1JQyBlcnJvciByZXBvcnQgaWYgaGNmX3NlcnZpY2VfbmljIGFscmVhZHkgY29uc3VtZWQgYWxsCgl9CiNlbmRpZiAvLyBIQ0ZfVFlQRV9XUEEKCSh2b2lkKWhjZl9hY3Rpb24oIGlmYnAsIEhDRl9BQ1RfUlhfQUNLICk7ICAgICAgIC8vb25seSAxIHNob3QgdG8gZ2V0IHRoZSBkYXRhLCBzbyBmcmVlIHRoZSByZXNvdXJjZXMgaW4gdGhlIE5JQwoJSENGQVNTRVJUKCByYyA9PSBIQ0ZfU1VDQ0VTUywgcmMgKTsKCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9SQ1ZfTVNHICk7CglyZXR1cm4gcmM7Cn0gLy8gaGNmX3Jjdl9tc2cKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqLk1PRFVMRSAgICAgICAgaW50IGhjZl9zZW5kX21zZyggSUZCUCBpZmJwLCBERVNDX1NUUkNUICpkZXNjcCwgaGNmXzE2IHR4X2NudGwgKQogKi5QVVJQT1NFICAgICAgIEVuY2Fwc3VsYXRlIGEgbWVzc2FnZSBhbmQgYXBwZW5kIHBhZGRpbmcgYW5kIE1JQy4KICogICAgICAgICAgICAgICBub24tVVNCOiBUcmFuc2ZlcnMgdGhlIHJlc3VsdGluZyBtZXNzYWdlIGZyb20gSG9zdCB0byBOSUMgYW5kIGluaXRpYXRlcyB0cmFuc21pc3Npb24uCiAqICAgICAgICAgICAgICAgVVNCOiBUcmFuc2ZlciByZXN1bHRpbmcgbWVzc2FnZSBpbnRvIGEgZmxhdCBidWZmZXIuCiAqCiAqLkFSR1VNRU5UUwogKiAgIGlmYnAgICAgICAgIGFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawogKiAgIGRlc2NwICAgICAgIHBvaW50ZXIgdG8gdGhlIERlc2NyaXB0b3JMaXN0IG9yIE5VTEwKICogICB0eF9jbnRsICAgICBpbmRpY2F0ZXMgTUFDLXBvcnQgYW5kIChIZXJtZXMpIG9wdGlvbnMKICogICAgICAgICAgICAgICAgICAgSEZTX1RYX0NOVExfU1BFQ1RSQUxJTksKICogICAgICAgICAgICAgICAgICAgSEZTX1RYX0NOVExfUFJJTwogKiAgICAgICAgICAgICAgICAgICBIRlNfVFhfQ05UTF9UWF9PSwogKiAgICAgICAgICAgICAgICAgICBIRlNfVFhfQ05UTF9UWF9FWAogKiAgICAgICAgICAgICAgICAgICBIRlNfVFhfQ05UTF9UWF9ERUxBWQogKiAgICAgICAgICAgICAgICAgICBIRlNfVFhfQ05UTF9UWF9DT05UCiAqICAgICAgICAgICAgICAgICAgIEhDRl9QT1JUXzAgICAgICAgICAgICAgICBNQUMgUG9ydCAwIChkZWZhdWx0KQogKiAgICAgICAgICAgICAgICAgICBIQ0ZfUE9SVF8xIChBUCBvbmx5KSAgICAgTUFDIFBvcnQgMQogKiAgICAgICAgICAgICAgICAgICBIQ0ZfUE9SVF8yIChBUCBvbmx5KSAgICAgTUFDIFBvcnQgMgogKiAgICAgICAgICAgICAgICAgICBIQ0ZfUE9SVF8zIChBUCBvbmx5KSAgICAgTUFDIFBvcnQgMwogKiAgICAgICAgICAgICAgICAgICBIQ0ZfUE9SVF80IChBUCBvbmx5KSAgICAgTUFDIFBvcnQgNAogKiAgICAgICAgICAgICAgICAgICBIQ0ZfUE9SVF81IChBUCBvbmx5KSAgICAgTUFDIFBvcnQgNQogKiAgICAgICAgICAgICAgICAgICBIQ0ZfUE9SVF82IChBUCBvbmx5KSAgICAgTUFDIFBvcnQgNgogKgogKi5SRVRVUk5TCiAqICAgSENGX1NVQ0NFU1MKICogICBIQ0ZfRVJSX0RFRlVOQ1RfLi4KICogICBIQ0ZfRVJSX1RJTUVfT1VUCiAqCiAqLkRFU0NSSVBUSU9OOgogKiBUaGUgU2VuZCBNZXNzYWdlIEZ1bmN0aW9uIGVtYm9kaWVzIDIgZnVuY3Rpb25zOgogKiBvIHRyYW5zZmVycyBhIG1lc3NhZ2UgKGluY2x1ZGluZyBNQUMgaGVhZGVyKSBmcm9tIHRoZSBwcm92aWRlZCBidWZmZXIgc3RydWN0dXJlIGluIEhvc3QgbWVtb3J5IHRvIHRoZSBUcmFuc21pdAogKiBGcmFtZSBTdHJ1Y3R1cmUgKFR4RlMpIGluIE5JQyBtZW1vcnkuCiAqIG8gSXNzdWUgYSBzZW5kIGNvbW1hbmQgdG8gdGhlIEYvVyB0byBhY3R1YWxseSB0cmFuc21pdCB0aGUgY29udGVudHMgb2YgdGhlIFR4RlMuCiAqCiAqIENvbnRyb2wgaXMgYmFzZWQgb24gdGhlIFJlc291cmNlIEluZGljYXRvciBJRkJfUnNjSW5kLgogKiBUaGUgUmVzb3VyY2UgSW5kaWNhdG9yIGlzIG1haW50YWluZWQgYnkgdGhlIEhDRiBhbmQgc2hvdWxkIG9ubHkgYmUgaW50ZXJwcmV0ZWQgYnV0IG5vdCBjaGFuZ2VkIGJ5IHRoZSBNU0YuCiAqIFRoZSBNU0YgbXVzdCBjaGVjayBJRkJfUnNjSW5kIHRvIGJlIG5vbi16ZXJvIGJlZm9yZSBleGVjdXRpbmcgdGhlIGNhbGwgdG8gdGhlIFNlbmQgTWVzc2FnZSBGdW5jdGlvbi4KICogV2hlbiBubyByZXNvdXJjZXMgYXJlIGF2YWlsYWJsZSwgdGhlIE1TRiBtdXN0IGhhbmRsZSB0aGUgcXVldWluZyBvZiB0aGUgVHJhbnNtaXQgZnJhbWUgYW5kIGNoZWNrIHRoZQogKiBSZXNvdXJjZSBJbmRpY2F0b3IgcGVyaW9kaWNhbGx5IGFmdGVyIGNhbGxpbmcgaGNmX3NlcnZpY2VfbmljLgogKgogKiBUaGUgU2VuZCBNZXNzYWdlIEZ1bmN0aW9ucyB0cmFuc2ZlcnMgYSBtZXNzYWdlIHRvIE5JQyBtZW1vcnkgd2hlbiBpdCBpcyBjYWxsZWQgd2l0aCBhIG5vbi1OVUxMIGRlc2NwLgogKiBCZWZvcmUgdGhlIFNlbmQgTWVzc2FnZSBGdW5jdGlvbiBpcyBpbnZva2VkIHRoaXMgd2F5LCB0aGUgUmVzb3VyY2UgSW5kaWNhdG9yIChJRkJfUnNjSW5kKSBtdXN0IGJlIGNoZWNrZWQuCiAqIElmIHRoZSBSZXNvdXJjZSBpcyBub3QgYXZhaWxhYmxlLCBTZW5kIE1lc3NhZ2UgRnVuY3Rpb24gZXhlY3V0aW9uIG11c3QgYmUgcG9zdHBvbmVkIHVudGlsIGFmdGVyIHByb2Nlc3Npbmcgb2YKICogYSBuZXh0IGhjZl9zZXJ2aWNlX25pYyBpdCBhcHBlYXJzIHRoYXQgdGhlIFJlc291cmNlIGhhcyBiZWNvbWUgYXZhaWxhYmxlLgogKiBUaGUgbWVzc2FnZSBpcyBjb3BpZWQgZnJvbSB0aGUgYnVmZmVyIHN0cnVjdHVyZSBpZGVudGlmaWVkIGJ5IGRlc2NwIHRvIHRoZSBOSUMuCiAqIENvcHlpbmcgc3RvcHMgaWYgYSBOVUxMIHBvaW50ZXIgaW4gdGhlIG5leHRfZGVzY19hZGRyIGZpZWxkIGlzIHJlYWNoZWQuCiAqIEhjZl9zZW5kX21zZyBkb2VzIG5vdCBjaGVjayBmb3IgdHJhbnNtaXQgYnVmZmVyIG92ZXJmbG93LCBiZWNhdXNlIHRoZSBGL1cgZG9lcyB0aGlzIHByb3RlY3Rpb24uCiAqIEluIGNhc2Ugb2YgYSB0cmFuc21pdCBidWZmZXIgb3ZlcmZsb3csIHRoZSBzdXJwbHVzIHdoaWNoIGRvZXMgbm90IGZpdCBpbiB0aGUgYnVmZmVyIGlzIHNpbXBseSBkcm9wcGVkLgogKgogKiBUaGUgU2VuZCBNZXNzYWdlIEZ1bmN0aW9uIGFjdGl2YXRlcyB0aGUgRi9XIHRvIGFjdHVhbGx5IHNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIG1lZGl1bSB3aGVuIHRoZQogKiBIRlNfVFhfQ05UTF9UWF9ERUxBWSBiaXQgb2YgdGhlIHR4X2NudGwgcGFyYW1ldGVyIGlzIG5vdCBzZXQuCiAqIElmIHRoZSBkZXNjcCBwYXJhbWV0ZXIgb2YgdGhlIGN1cnJlbnQgY2FsbCBpcyBub24tTlVMTCwgdGhlIG1lc3NhZ2UgYXMgcmVwcmVzZW50ZWQgYnkgZGVzY3AgaXMgc2VuZC4KICogSWYgdGhlIGRlc2NwIHBhcmFtZXRlciBvZiB0aGUgY3VycmVudCBjYWxsIGlzIE5VTEwsIGFuZCBpZiB0aGUgcHJlY2VkaW5nIGNhbGwgb2YgdGhlIFNlbmQgTWVzc2FnZSBGdW5jdGlvbiBoYWQKICogYSBub24tTlVMTCBkZXNjcCBhbmQgdGhlIHByZWNlZGluZyBjYWxsIGhhZCB0aGUgSEZTX1RYX0NOVExfVFhfREVMQVkgYml0IG9mIHR4X2NudGwgc2V0LCB0aGVuIHRoZSBtZXNzYWdlIGFzCiAqIHJlcHJlc2VudGVkIGJ5IHRoZSBkZXNjcCBvZiB0aGUgcHJlY2VkaW5nIGNhbGwgaXMgc2VuZC4KICoKICogSGNmX3NlbmRfbXNnIHN1cHBvcnRzIGVuY2Fwc3VsYXRpb24gKHNlZSBIQ0ZfRU5DQVApIG9mIEV0aGVybmV0LUlJIGZyYW1lcy4KICogQW4gRXRoZXJuZXQtSUkgZnJhbWUgaXMgdHJhbnNmZXJyZWQgdG8gdGhlIFRyYW5zbWl0IEZyYW1lIHN0cnVjdHVyZSBhcyBhbiA4MDIuMyBmcmFtZS4KICogSGNmX3NlbmRfbXNnIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiBhbiA4MDIuMyBhbmQgYW4gRXRoZXJuZXQtSUkgZnJhbWUgYnkgbG9va2luZyBhdCB0aGUgZGF0YSBsZW5ndGgvdHlwZSBmaWVsZAogKiBvZiB0aGUgZnJhbWUuIElmIHRoaXMgZmllbGQgY29udGFpbnMgYSB2YWx1ZSBsYXJnZXIgdGhhbiAxNTE0LCB0aGUgZnJhbWUgaXMgY29uc2lkZXJlZCB0byBiZSBhbiBFdGhlcm5ldC1JSQogKiBmcmFtZSwgb3RoZXJ3aXNlIGl0IGlzIHRyZWF0ZWQgYXMgYW4gODAyLjMgZnJhbWUuCiAqIFRvIGVhc2UgaW1wbGVtZW50YXRpb24gb2YgdGhlIEhDRiwgdGhpcyB0eXBlL3R5cGUgZmllbGQgbXVzdCBiZSBsb2NhdGVkIGluIHRoZSBmaXJzdCBkZXNjcmlwdG9yIHN0cnVjdHVyZSwKICogaS5lLiB0aGUgMXN0IGZyYWdtZW50IG11c3QgaGF2ZSBhIHNpemUgb2YgYXQgbGVhc3QgMTQgKHRvIGNvbnRhaW4gRGVzdEFkZHIsIFNyY0FkZHIgYW5kIExlbi9UeXBlIGZpZWxkKS4KICogQW4gRXRoZXJuZXQtSUkgZnJhbWUgaXMgZW5jYXBzdWxhdGVkIGJ5IGluc2VydGluZyBhIFNOQVAgaGVhZGVyIGJldHdlZW4gdGhlIGFkZHJlc3NpbmcgaW5mb3JtYXRpb24gYW5kIHRoZQogKiB0eXBlIGZpZWxkLiAgVGhpcyBpbnNlcnRpb24gaXMgdHJhbnNwYXJlbnQgZm9yIHRoZSBNU0YuCiAqIFRoZSBIQ0YgY29udGFpbnMgYSBmaXhlZCB0YWJsZSB0aGF0IHN0b3JlcyBhIG51bWJlciBvZiB0eXBlcy4gSWYgdGhlIHZhbHVlIHNwZWNpZmllZCBieSB0aGUgdHlwZS90eXBlIGZpZWxkCiAqIG9jY3VycyBpbiB0aGlzIHRhYmxlLCBCcmlkZ2UgVHVubmVsIEVuY2Fwc3VsYXRpb24gaXMgdXNlZCwgb3RoZXJ3aXNlIFJGQzEwNDIgZW5jYXBzdWxhdGlvbiBpcyB1c2VkLgogKiBCcmlkZ2UgVHVubmVsIHVzZXMgICAgQUEgQUEgMDMgMDAgMDAgRjggYXMgU05BUCBoZWFkZXIsCiAqIFJGQzEwNDIgdXNlcyAgQUEgQUEgMDMgMDAgMDAgMDAgYXMgU05BUCBoZWFkZXIuCiAqIFRoZSB0YWJsZSBjdXJyZW50bHkgY29udGFpbnM6CiAqIDAgMHg4MEYzICBBcHBsZVRhbGsgQWRkcmVzcyBSZXNvbHV0aW9uIFByb3RvY29sIChBQVJQKQogKiAwIDB4ODEzNyAgSVBYCiAqCiAqIFRoZSBhbGdvcml0aG0gdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiA4MDIuMyBhbmQgRXRoZXJuZXQtSUkgZnJhbWVzIGxpbWl0cyB0aGUgbWF4aW11bSBsZW5ndGggZm9yIGZyYW1lcyBvZgogKiA4MDIuMyBmcmFtZXMgdG8gMTUxNCBieXRlcy4KICogRW5jYXBzdWxhdGlvbiBjYW4gYmUgc3VwcHJlc3NlZCBieSBtZWFucyBvZiB0aGUgc3lzdGVtIGNvbnN0YW50IEhDRl9FTkNBUCwgZS5nLiB0byBzdXBwb3J0IHByb3ByaWV0YXJ5CiAqIHByb3RvY29scyB3aXRoIDgwMi4zIGxpa2UgZnJhbWVzIHdpdGggYSBzaXplIGxhcmdlciB0aGFuIDE1MTQgYnl0ZXMuCiAqCiAqIEluIGNhc2UgdGhlIEhDRiBlbmNhcHN1bGF0ZXMgdGhlIGZyYW1lLCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgaXMgYWN0dWFsbHkgdHJhbnNtaXR0ZWQgaXMgZGV0ZXJtaW5lZCBieSB0aGUKICogY3VtdWxhdGl2ZSB2YWx1ZSBvZiB0aGUgYnVmX2NudGwuYnVmX2RpbVswXSBmaWVsZHMuCiAqIEluIGNhc2UgdGhlIEhDRiBkb2VzIG5vdCBlbmNhcHN1bGF0ZSB0aGUgZnJhbWUsIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBpcyBhY3R1YWxseSB0cmFuc21pdHRlZCBpcyBub3QKICogZGV0ZXJtaW5lZCBieSB0aGUgY3VtdWxhdGl2ZSB2YWx1ZSBvZiB0aGUgYnVmX2NudGwuYnVmX2RpbVtERVNDX0NOVExfQ05UXSBmaWVsZHMgb2YgdGhlIGRlc2Nfc3RyY3QncyBidXQgYnkKICogdGhlIExlbmd0aCBmaWVsZCBvZiB0aGUgODAyLjMgZnJhbWUuCiAqIElmIHRoZXJlIGlzIGEgY29uZmxpY3QgYmV0d2VlbiB0aGUgY3VtdWxhdGl2ZSB2YWx1ZSBvZiB0aGUgYnVmX2NudGwuYnVmX2RpbVswXSBmaWVsZHMgYW5kIHRoZQogKiA4MDIuMyBMZW5ndGggZmllbGQgdGhlIDgwMi4zIExlbmd0aCBmaWVsZCBkZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgdHJhbnNtaXR0ZWQgYnkgdGhlIE5JQyB3aGlsZQogKiB0aGUgY3VtdWxhdGl2ZSB2YWx1ZSBvZiB0aGUgYnVmX2NudGwuYnVmX2RpbVswXSBmaWVsZHMgZGV0ZXJtaW5lcyB0aGUgcG9zaXRpb24gb2YgdGhlIE1JQywgaGVuY2UgYSBtaXNtYXRjaAogKiB3aWxsIHJlc3VsdCBpbiBNSUMgZXJyb3JzIG9uIHRoZSBSZWNlaXZpbmcgc2lkZS4KICogQ3VycmVudGx5IHRoaXMgcHJvYmxlbSBpcyBmbGFnZ2VkIG9uIHRoZSBUcmFuc21pdCBzaWRlIGJ5IGFuIEFzc2VydC4KICogVGhlIGZvbGxvd2luZyBmaWVsZHMgb2YgZWFjaCBvZiB0aGUgZGVzY3JpcHRvcnMgaW4gdGhlIGRlc2NyaXB0b3IgbGlzdCBtdXN0IGJlIHNldCBieSB0aGUgTVNGOgogKiBvIGJ1Zl9jbnRsLmJ1Zl9kaW1bMF0KICogbyAqbmV4dF9kZXNjX2FkZHIKICogbyAqYnVmX2FkZHIKICoKICogQWxsIGJpdHMgb2YgdGhlIHR4X2NudGwgcGFyYW1ldGVyIGV4Y2VwdCBIRlNfVFhfQ05UTF9UWF9ERUxBWSBhbmQgdGhlIEhDRl9QT1JUIyBiaXRzIGFyZSBwYXNzZWQgdG8gdGhlIEYvVyB2aWEKICogdGhlIEhGU19UWF9DTlRMIGZpZWxkIG9mIHRoZSBUeEZTLgogKgogKiBOb3RlIHRoYXQgaGNmX3NlbmRfbXNnIGRvZXMgbm90IGRldGVjdCBOSUMgYWJzZW5jZS4gIFRoZSBNU0YgaXMgc3VwcG9zZWQgdG8gaGF2ZSBpdHMgb3duIC1wbGF0Zm9ybSBkZXBlbmRlbnQtCiAqIHdheSB0byByZWNvZ25pemUgY2FyZCByZW1vdmFsL2luc2VydGlvbi4KICogVGhlIHRvdGFsIHN5c3RlbSBtdXN0IGJlIHJvYnVzdCBhZ2FpbnN0IGNhcmQgcmVtb3ZhbCBhbmQgdGhlcmUgaXMgbm8gcHJpbmNpcGFsIGRpZmZlcmVuY2UgYmV0d2VlbiBjYXJkIHJlbW92YWwKICoganVzdCBhZnRlciBoY2Zfc2VuZF9tc2cgcmV0dXJucyBidXQgYmVmb3JlIHRoZSBhY3R1YWwgdHJhbnNtaXNzaW9uIHRvb2sgcGxhY2Ugb3Igc29tZXRpbWUgZWFybGllci4KICoKICogQXNzZXJ0IGZhaWxzIGlmCiAqIC0gaWZicCBoYXMgYSByZWNvZ25pemFibGUgb3V0LW9mLXJhbmdlIHZhbHVlCiAqIC0gZGVzY3AgaXMgYSBOVUxMIHBvaW50ZXIKICogLSBubyByZXNvdXJjZXMgZm9yIFBJRiBhdmFpbGFibGUuCiAqIC0gSW50ZXJydXB0cyBhcmUgZW5hYmxlZC4KICogLSByZWVudHJhbmN5LCBtYXkgYmUgIGNhdXNlZCBieSBjYWxsaW5nIGhjZl9mdW5jdGlvbnMgd2l0aG91dCBhZGVxdWF0ZSBwcm90ZWN0aW9uCiAqICAgYWdhaW5zdCBOSUMgaW50ZXJydXB0cyBvciBtdWx0aS10aHJlYWRpbmcuCiAqCiAqLkRJQUdSQU0KICo0OiBmb3IgdGhlIG5vcm1hbCBjYXNlIChpLmUuIG5vIEhGU19UWF9DTlRMX1RYX0RFTEFZIG9wdGlvbiBhY3RpdmUpLCBhIGZpZCBpcyBhY3F1aXJlZCB2aWEgdGhlCiAqICAgcm91dGluZSBnZXRfZmlkLiAgSWYgbm8gRklEIGlzIGFjcXVpcmVkLCB0aGUgcmVtYWluZGVyIGlzIHNraXBwZWQgd2l0aG91dCBhbiBlcnJvciBub3RpZmljYXRpb24uICBBZnRlcgogKiAgIGFsbCwgdGhlIE1TRiBpcyBub3Qgc3VwcG9zZWQgdG8gY2FsbCBoY2Zfc2VuZF9tc2cgd2hlbiBubyBSZXNvdXJjZSBpcyBhdmFpbGFibGUuCiAqNzogVGhlIENvbnRyb2xGaWVsZCBvZiB0aGUgVHhGUyBpcyB3cml0dGVuLiAgU2luY2UgcHV0X2ZyYWcgY2FuIG9ubHkgcmV0dXJuIHRoZSBmYXRhbCBEZWZ1bmN0IG9yICJObyBOSUMiLCB0aGUKICogICByZXR1cm4gc3RhdHVzIGNhbiBiZSBpZ25vcmVkIGJlY2F1c2Ugd2hlbiBpdCBmYWlscywgY21kX3dhaXQgd2lsbCBmYWlsIGFzIHdlbGwuICAoc2VlIGFsc28gdGhlIG5vdGUgb24gdGhlCiAqICAgbmVlZCBmb3IgYSByZXR1cm4gY29kZSBiZWxvdykuCiAqICAgTm90ZSB0aGF0IEhGU19UWF9DTlRMIGhhcyBkaWZmZXJlbnQgdmFsdWVzIGZvciBILUksIEgtSS9XUEEgYW5kIEgtSUkgYW5kIEhGU19BRERSX0RFU1QgaGFzIGRpZmZlcmVudAogKiAgIHZhbHVlcyBmb3IgSC1JIChyZWdhcmRsZXNzIG9mIFdQQSkgYW5kIEgtSUkuCiAqICAgQnkgd3JpdGluZyAxNywgMSBvciAyICggaW1wbHlpbmcgMTYsIDAgb3IgMSBnYXJiYWdlIHdvcmQgYWZ0ZXIgSEZTX1RYX0NOVEwpIHRoZSBCQVAganVzdCBnZXRzIHRvCiAqICAgSEZTX0FERFJfREVTVCBmb3IgSC1JLCBILUkvV1BBIGFuZCBILUlJIHJlc3BlY3RpdmVseS4KICoxMDogaWYgbmVpdGhlciBlbmNhcHN1bGF0aW9uIG5vciBNSUMgY2FsY3VsYXRpb24gaXMgbmVlZGVkLCBzcGxpdHRpbmcgdGhlIGZpcnN0IGZyYWdtZW50IGluIHR3byBkb2VzIG5vdAogKiAgIHJlYWxseSBoZWxwIGJ1dCBpdCBtYWtlcyB0aGUgZmxvdyBlYXNpZXIgdG8gZm9sbG93IHRvIGRvIG5vdCBvcHRpbWl6ZSBvbiB0aGlzIGRpZmZlcmVuY2UKICoKICogICBoY2Zfc2VuZF9tc2cgY2hlY2tzIHdoZXRoZXIgdGhlIGZyYW1lIGlzIGFuIEV0aGVybmV0LUlJIHJhdGhlciB0aGFuIGFuICJvZmZpY2lhbCIgODAyLjMgZnJhbWUuCiAqICAgVGhlIEUtSUkgY2hlY2sgaXMgYmFzZWQgb24gdGhlIGxlbmd0aC90eXBlIGZpZWxkIGluIHRoZSBNQUMgaGVhZGVyLiBJZiB0aGlzIGZpZWxkIGhhcyBhIHZhbHVlIGxhcmdlciB0aGFuCiAqICAgMTUwMCwgRS1JSSBpcyBhc3N1bWVkLiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyB0ZXN0IGZhaWxzIGlmIHRoZSBsZW5ndGgvdHlwZSBmaWVsZCBpcyBub3QgaW4gdGhlIGZpcnN0CiAqICAgZGVzY3JpcHRvci4gIElmIEUtSUkgaXMgcmVjb2duaXplZCwgYSBTTkFQIGhlYWRlciBpcyBpbnNlcnRlZC4gVGhpcyBTTkFQIGhlYWRlciByZXByZXNlbnRzIGVpdGhlciBSRkMxMDQyCiAqICAgb3IgQnJpZGdlLVR1bm5lbCBlbmNhcHN1bGF0aW9uLCBkZXBlbmRpbmcgb24gdGhlIHJldHVybiBzdGF0dXMgb2YgdGhlIHN1cHBvcnQgcm91dGluZSBoY2ZfZW5jYXAuCiAqCiAqLk5PVElDRQogKiAgIGhjZl9zZW5kX21zZyBsZWF2ZXMgdGhlIHJlc3BvbnNpYmlsaXR5IHRvIG9ubHkgc2VuZCBtZXNzYWdlcyBvbiBlbmFibGVkIHBvcnRzIGF0IHRoZSBNU0YgbGV2ZWwuCiAqICAgVGhpcyBpcyBjb25zaWRlcmVkIHRoZSBzdHJhdGVneSB3aGljaCBpcyBzdWZmaWNpZW50bHkgYWRlcXVhdGUgZm9yIGFsbCAicm9idXN0IiBNU0ZzLCBoYXZlIHRoZSBsZWFzdAogKiAgIHByb2Nlc3NvciB1dGlsaXphdGlvbiBhbmQgYmVpbmcgc3RpbGwgYWNjZXB0YWJsZSByb2J1c3QgYXQgdGhlIFdDSSAhISEhIQogKgogKiAgIGhjZl9zZW5kX21zZyBkb2VzIG5vdCBORUVEIGEgcmV0dXJuIHZhbHVlIHRvIHJlcG9ydCBOSUMgYWJzZW5jZSBvciByZW1vdmFsIGR1cmluZyB0aGUgZXhlY3V0aW9uIG9mCiAqICAgaGNmX3NlbmRfbXNnKCksIGJlY2F1c2UgdGhlIE1TRiBhbmQgaGlnaGVyIGxheWVycyBtdXN0IGJlIGFibGUgdG8gY29wZSBhbnl3YXkgd2l0aCB0aGUgTklDIGJlaW5nIHJlbW92ZWQKICogICBhZnRlciBhIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvZiBoY2Zfc2VuZF9tc2coKSBidXQgYmVmb3JlIHRoZSBhY3R1YWwgdHJhbnNtaXNzaW9uIHRvb2sgcGxhY2UuCiAqICAgVG8gYWNjb21tb2RhdGUgdXNlciBleHBlY3RhdGlvbnMgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gZG9lcyByZXBvcnQgTklDIGFic2VuY2UuCiAqICAgRGVmdW5jdCBibG9ja3MgYWxsIE5JQyBhY2Nlc3MgYW5kIHdpbGwgKGFsc28pIGJlIHJlcG9ydGVkIG9uIGEgbnVtYmVyIG9mIG90aGVyIGNhbGxzLgogKgogKiAgIGhjZl9zZW5kX21zZyBkb2VzIG5vdCBjaGVjayBmb3IgdHJhbnNtaXQgYnVmZmVyIG92ZXJmbG93IGJlY2F1c2UgdGhlIEhlcm1lcyBkb2VzIHRoaXMgcHJvdGVjdGlvbi4KICogICBJbiBjYXNlIG9mIGEgdHJhbnNtaXQgYnVmZmVyIG92ZXJmbG93LCB0aGUgc3VycGx1cyB3aGljaCBkb2VzIG5vdCBmaXQgaW4gdGhlIGJ1ZmZlciBpcyBzaW1wbHkgZHJvcHBlZC4KICogICBOb3RlIHRoYXQgdGhpcyBwb3NzaWJseSByZXN1bHRzIGluIHRoZSB0cmFuc21pc3Npb24gb2YgaW5jb21wbGV0ZSBmcmFtZXMuCiAqCiAqICAgQWZ0ZXIgc29tZSBkZWxpYmVyYXRpb24gd2l0aCBGL1cgdGVhbSwgaXQgaXMgZGVjaWRlZCB0aGF0IC0gYmVpbmcgaW4gdGhlIHR3aWxpZ2h0IHpvbmUgb2Ygbm90IGtub3dpbmcKICogICB3aGV0aGVyIHRoZSBwcm9ibGVtIGF0IGhhbmQgaXMgYW4gTVNGIGJ1ZywgSENGIGJ1ZiwgRi9XIGJ1ZywgSC9XIG1hbGZ1bmN0aW9uIG9yIGV2ZW4gc29tZXRoaW5nIGVsc2UgLSB0aGVyZQogKiAgIGlzIG5vICJiZXN0IHRoaW5nIHRvIGRvIiBpbiBjYXNlIG9mIGEgZmFpbGluZyBzZW5kLCBoZW5jZSB0aGUgSENGIGNvbnNpZGVycyB0aGUgVHhGSUQgb3duZXJzaGlwIHRvIGJlIHRha2VuCiAqICAgb3ZlciBieSB0aGUgRi9XIGFuZCBob3BlcyBmb3IgYW4gQWxsb2NhdGUgZXZlbnQgaW4gZHVlIHRpbWUKICoKICouRU5ERE9DICAgICAgICAgICAgICAgIEVORCBET0NVTUVOVEFUSU9OCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludApoY2Zfc2VuZF9tc2coIElGQlAgaWZicCwgREVTQ19TVFJDVCAqZGVzY3AsIGhjZl8xNiB0eF9jbnRsICkKewoJaW50ICAgICAgICAgcmMgPSBIQ0ZfU1VDQ0VTUzsKCURFU0NfU1RSQ1QgICpwIC8qID0gZGVzY3AqLzsgICAgICAgIC8vd29ya2luZyBwb2ludGVyCgloY2ZfMTYgICAgICBsZW47ICAgICAgICAgICAgICAgICAgICAvLyB0b3RhbCBieXRlIGNvdW50CgloY2ZfMTYgICAgICBpOwoKCWhjZl8xNiAgICAgIGZpZCA9IDA7CgoJSENGQVNTRVJUKCBpZmJwLT5JRkJfUnNjSW5kIHx8IGRlc2NwID09IE5VTEwsIGlmYnAtPklGQl9Sc2NJbmQgKTsKCUhDRkFTU0VSVCggKGlmYnAtPklGQl9DbnRsT3B0ICYgVVNFX0RNQSkgPT0gMCwgMHhEQURCICk7CgoJSENGTE9HRU5UUlkoIEhDRl9UUkFDRV9TRU5EX01TRywgdHhfY250bCApOwoJSENGQVNTRVJUKCBpZmJwLT5JRkJfTWFnaWMgPT0gSENGX01BR0lDLCBpZmJwLT5JRkJfTWFnaWMgKTsKCUhDRkFTU0VSVF9JTlQ7CgkvKiBvYm5veGlvdXMgYzovaGNmL2hjZi5jKDE0ODApIDogd2FybmluZyBDNDc2OTogY29udmVyc2lvbiBvZiBuZWFyIHBvaW50ZXIgdG8gbG9uZyBpbnRlZ2VyLAoJICogc28gc2tpcCAqLwoJSENGQVNTRVJUKCAoKGhjZl8zMilkZXNjcCAmIDMgKSA9PSAwLCAoaGNmXzMyKWRlc2NwICk7CiNpZiBIQ0ZfQVNTRVJUCgl7ICAgaW50IHggPSBpZmJwLT5JRkJfRldJZGVudGl0eS5jb21wX2lkID09IENPTVBfSURfRldfQVAgPyB0eF9jbnRsICYgfkhGU19UWF9DTlRMX1BPUlQgOiB0eF9jbnRsOwoJCUhDRkFTU0VSVCggKHggJiB+SENGX1RYX0NOVExfTUFTSyApID09IDAsIHR4X2NudGwgKTsKCX0KI2VuZGlmIC8vIEhDRl9BU1NFUlQKCglpZiAoIGRlc2NwICkgaWZicC0+SUZCX1R4RklEID0gMDsgICAgICAgICAgICAgICAvL2NhbmNlbCBhIHByZS1wdXQgbWVzc2FnZQoKCS8qIHRoZSBmb2xsb3dpbmcgaW5pdGlhbGl6YXRpb24gY29kZSBpcyByZWR1bmRhbnQgZm9yIGEgcHJlLXB1dCBtZXNzYWdlCgkgKiBidXQgbW92aW5nIGl0IGluc2lkZSB0aGUgImlmIGZpZCIgbG9naWMgbWFrZXMgdGhlIG1lcmdpbmcgd2l0aCB0aGUKCSAqIFVTQiBmbG93IGF3a3dhcmQKCSAqLwojaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dQQQoJdHhfY250bCB8PSBpZmJwLT5JRkJfTUlDVHhDbnRsOwojZW5kaWYgLy8gSENGX1RZUEVfV1BBCglmaWQgPSBpZmJwLT5JRkJfVHhGSUQ7CglpZiAoZmlkID09IDAgJiYgKCBmaWQgPSBnZXRfZmlkKCBpZmJwICkgKSAhPSAwICkgICAgICAgIC8qIDQgKi8KCQkvKiBza2lwIHRoZSBuZXh0IGNvbXBvdW5kIHN0YXRlbWVudCBpZjoKCQkgICAtIHByZS1wdXQgbWVzc2FnZSBvcgoJCSAgIC0gbm8gZmlkIGF2YWlsYWJsZSAod2hpY2ggc2hvdWxkIG5ldmVyIG9jY3VyIGlmIHRoZSBNU0YgYWRoZXJlcyB0byB0aGUgV0NJKQoJCSovCgl7ICAgICAgIC8vIHRvIG1hdGNoIHRoZSBjbG9zaW5nIGN1cmx5IGJyYWNrZXQgb2YgYWJvdmUgImlmIiBpbiBjYXNlIG9mIEhDRl9UWVBFX1VTQgoJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jYWxjdWxhdGUgdG90YWwgbGVuZ3RoIDs/IHN1cGVyZmx1b3VzIHVubGVzcyBDQ1ggb3IgRW5jYXBzdWxhdGlvbgoJCWxlbiA9IDA7CgkJcCA9IGRlc2NwOwoJCWRvIGxlbiArPSBwLT5CVUZfQ05UOyB3aGlsZSAoICggcCA9IHAtPm5leHRfZGVzY19hZGRyICkgIT0gTlVMTCApOwoJCXAgPSBkZXNjcDsKLy87PwkJSENGQVNTRVJUKCBsZW4gPD0gSENGX01BWF9NU0csIGxlbiApOwoJLyo3Ki8gICAodm9pZClzZXR1cF9iYXAoIGlmYnAsIGZpZCwgSEZTX1RYX0NOVEwsIElPX09VVCApOwojaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1RYX0RFTEFZCgkJSENGQVNTRVJUKCAoIGRlc2NwICE9IE5VTEwgKSBeICggdHhfY250bCAmIEhGU19UWF9DTlRMX1RYX0RFTEFZICksIHR4X2NudGwgKTsKCQlpZiAoIHR4X2NudGwgJiBIRlNfVFhfQ05UTF9UWF9ERUxBWSApIHsKCQkJdHhfY250bCAmPSB+SEZTX1RYX0NOVExfVFhfREVMQVk7ICAgICAgIC8vISFIRlNfVFhfQ05UTF9UWF9ERUxBWSBubyBsb25nZXIgYXZhaWxhYmxlCgkJCWlmYnAtPklGQl9UeEZJRCA9IGZpZDsKCQkJZmlkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vISFmaWQgbm8gbG9uZ2VyIGF2YWlsYWJsZSwgYmUgY2FyZWZ1bCB3aGVuIG1vZGlmeWluZyBjb2RlCgkJfQojZW5kaWYgLy8gSENGX1RZUEVfVFhfREVMQVkKCQlPUFcoIEhSRUdfREFUQV8xLCB0eF9jbnRsICkgOwoJCU9QVyggSFJFR19EQVRBXzEsIDAgKTsKCgkJSENGQVNTRVJUKCBwLT5CVUZfQ05UID49IDE0LCBwLT5CVUZfQ05UICk7CgkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhc3N1bWUgRGVzdEFkZHIvU3JjQWRkci9MZW4vVHlwZSBBTFdBWVMgY29udGFpbmVkIGluIDFzdCBmcmFnbWVudAoJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb3RoZXJ3aXNlIGxpZmUgZ2V0cyB0b28gY3VtYmVyc29tZSBmb3IgTUlDIGFuZCBFbmNhcHN1bGF0aW9uICEhISEhISEhCgkJIGlmICggcC0+QlVGX0NOVCA+PSAxNCApIHsgICBhbHRlcm5hdGl2ZWx5OiBhZGQgYSBzYWZldHkgZXNjYXBlICEhISEhISEhISEhISB9ICAgKi8KCgkJQ0FMQ19UWF9NSUMoIE5VTEwsIC0xICk7ICAgICAgICAvL2luaXRpYWxpemUgTUlDCgkvKjEwKi8gIHB1dF9mcmFnKCBpZmJwLCBwLT5idWZfYWRkciwgSENGX0RBU0FfU0laRSBCRV9QQVIoMCkgKTsgLy93cml0ZSBEQSwgU0Egd2l0aCBNSUMgY2FsY3VsYXRpb24KCQlDQUxDX1RYX01JQyggcC0+YnVmX2FkZHIsIEhDRl9EQVNBX1NJWkUgKTsgICAgICAvL01JQyBvdmVyIERBLCBTQQoJCUNBTENfVFhfTUlDKCBudWxsX2FkZHIsIDQgKTsgICAgICAgIC8vTUlDIG92ZXIgKHZpcnR1YWwpIHByaW9yaXR5IGZpZWxkCgoJCQkgICAgICAgICAgICAgICAgICAgICAgICAvL2lmIGVuY2Fwc3VsYXRpb24gbmVlZGVkCiNpZiAoSENGX0VOQ0FQKSA9PSBIQ0ZfRU5DCgkJCSAgICAgICAgICAgICAgICAgICAgICAgIC8vd3JpdGUgbGVuZ3RoICh3aXRoIFNOQVAtaGVhZGVyLFR5cGUsIHdpdGhvdXQgLy9EQSxTQSxMZW5ndGggKSBubyBNSUMgY2FsYy4KCQlpZiAoICggc25hcF9oZWFkZXJbc2l6ZW9mKHNuYXBfaGVhZGVyKS0xXSA9IGhjZl9lbmNhcCggJnAtPmJ1Zl9hZGRyW0hDRl9EQVNBX1NJWkVdICkgKSAhPSBFTkNfTk9ORSApIHsKCQkJT1BXKCBIUkVHX0RBVEFfMSwgQ05WX0VORF9TSE9SVCggbGVuICsgKHNpemVvZihzbmFwX2hlYWRlcikgKyAyKSAtICggMio2ICsgMiApICkgKTsKCQkJCSAgICAgICAgICAgICAgICAvL3dyaXRlIHNwbGljZSB3aXRoIE1JQyBjYWxjdWxhdGlvbgoJCQlwdXRfZnJhZyggaWZicCwgc25hcF9oZWFkZXIsIHNpemVvZihzbmFwX2hlYWRlcikgQkVfUEFSKDApICk7CgkJCUNBTENfVFhfTUlDKCBzbmFwX2hlYWRlciwgc2l6ZW9mKHNuYXBfaGVhZGVyKSApOyAgICAvL01JQyBvdmVyIDYgYnl0ZSBTTkFQCgkJCWkgPSBIQ0ZfREFTQV9TSVpFOwoJCX0gZWxzZQojZW5kaWYgLy8gSENGX0VOQwoJCXsKCQkJT1BXKCBIUkVHX0RBVEFfMSwgKih3Y2lfcmVjb3JkcCkmcC0+YnVmX2FkZHJbSENGX0RBU0FfU0laRV0gKTsKCQkJaSA9IDE0OwoJCX0KCQkJICAgICAgICAgICAgICAgICAgICAgICAgLy9jb21wbGV0ZSAxc3QgZnJhZ21lbnQgc3RhcnRpbmcgd2l0aCBUeXBlIHdpdGggTUlDIGNhbGN1bGF0aW9uCgkJcHV0X2ZyYWcoIGlmYnAsICZwLT5idWZfYWRkcltpXSwgcC0+QlVGX0NOVCAtIGkgQkVfUEFSKDApICk7CgkJQ0FMQ19UWF9NSUMoICZwLT5idWZfYWRkcltpXSwgcC0+QlVGX0NOVCAtIGkgKTsKCgkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2RvIHRoZSByZW1haW5pbmcgZnJhZ21lbnRzIHdpdGggTUlDIGNhbGN1bGF0aW9uCgkJd2hpbGUgKCAoIHAgPSBwLT5uZXh0X2Rlc2NfYWRkciApICE9IE5VTEwgKSB7CgkJCS8qIG9ibm94aW91cyBjOi9oY2YvaGNmLmMoMTQ4MCkgOiB3YXJuaW5nIEM0NzY5OiBjb252ZXJzaW9uIG9mIG5lYXIgcG9pbnRlciB0byBsb25nIGludGVnZXIsCgkJCSAqIHNvIHNraXAgKi8KCQkJSENGQVNTRVJUKCAoKGhjZl8zMilwICYgMyApID09IDAsIChoY2ZfMzIpcCApOwoJCQlwdXRfZnJhZyggaWZicCwgcC0+YnVmX2FkZHIsIHAtPkJVRl9DTlQgQkVfUEFSKDApICk7CgkJCUNBTENfVFhfTUlDKCBwLT5idWZfYWRkciwgcC0+QlVGX0NOVCApOwoJCX0KCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcGFkIG1lc3NhZ2UsIGZpbmFsaXplIE1JQyBjYWxjdWxhdGlvbiBhbmQgd3JpdGUgTUlDIHRvIE5JQwoJCXB1dF9mcmFnX2ZpbmFsaXplKCBpZmJwICk7Cgl9CglpZiAoIGZpZCApIHsKCS8qMTYqLyAgcmMgPSBjbWRfZXhlKCBpZmJwLCBIQ01EX0JVU1kgfCBIQ01EX1RYIHwgSENNRF9SRUNMLCBmaWQgKTsKCQlpZmJwLT5JRkJfVHhGSUQgPSAwOwoJCS8qIHByb2JhYmx5IHRoaXMgKGkuZS4gbm8gUnNjSW5kIEFORCAiSFJFR19FVl9BTExPQyIpIGF0IHRoaXMgcG9pbnQgaW4gdGltZSBvY2N1cnMgc28gaW5mcmVxdWVudCwKCQkgKiB0aGF0IGl0IG1pZ2h0IGp1c3QgYXMgd2VsbCBiZSBhY2NlcHRhYmxlIHRvIHNraXAgdGhpcwoJCSAqICJvcHRpbWl6YXRpb24iIGNvZGUgYW5kIGhhbmRsZSB0aGF0IGFkZGl0aW9uYWwgaW50ZXJydXB0IG9uY2UgaW4gYSB3aGlsZQoJCSAqLwovLyAxODAgZGVncmVlIGVycm9yIGluIGxvZ2ljIDs/ICNpZiBBTExPQ18xNQoJLyoyMCovICBpZiAoIGlmYnAtPklGQl9Sc2NJbmQgPT0gMCApIHsKCQkJaWZicC0+SUZCX1JzY0luZCA9IGdldF9maWQoIGlmYnAgKTsKCQl9Ci8vICNlbmRpZiAvLyBBTExPQ18xNQoJfQovLwlIQ0ZBU1NFUlQoIGxldmVsOjppZmJwLT5JRkJfUnNjSW5kLCBpZmJwLT5JRkJfUnNjSW5kICk7CglIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfU0VORF9NU0cgKTsKCXJldHVybiByYzsKfSAvLyBoY2Zfc2VuZF9tc2cKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqLk1PRFVMRSAgICAgICAgaW50IGhjZl9zZXJ2aWNlX25pYyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBidWZwLCB1bnNpZ25lZCBpbnQgbGVuICkKICouUFVSUE9TRSAgICAgICBTZXJ2aWNlcyAobW9zdCkgTklDIGV2ZW50cy4KICogICAgICAgICAgICAgICBQcm92aWRlcyByZWNlaXZlZCBtZXNzYWdlCiAqICAgICAgICAgICAgICAgUHJvdmlkZXMgc3RhdHVzIGluZm9ybWF0aW9uLgogKgogKi5BUkdVTUVOVFMKICogICBpZmJwICAgICAgICBhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKICogIEluIG5vbi1ETUEgbW9kZToKICogICBidWZwICAgICAgICBhZGRyZXNzIG9mIGNoYXIgYnVmZmVyLCBzdWZmaWNpZW50bHkgbGFyZ2UgdG8gaG9sZCB0aGUgZmlyc3QgcGFydCBvZiB0aGUgUnhGUyB1cCB0aHJvdWdoIEhGU19UWVBFCiAqICAgbGVuICAgICAgICAgbGVuZ3RoIGluIGJ5dGVzIG9mIGJ1ZmZlciBzcGVjaWZpZWQgYnkgYnVmcAogKiAgICAgICAgICAgICAgIHZhbHVlIGJldHdlZW4gSEZTX1RZUEUgKyAyIGFuZCBIRlNfQUREUl9ERVNUICsgSENGX01BWF9NU0cKICoKICouUkVUVVJOUwogKiAgIEhDRl9TVUNDRVNTCiAqICAgSENGX0VSUl9NSUMgbWVzc2FnZSBjb250YWlucyBhbiBlcnJvbmVvdXMgTUlDIChvbmx5IGlmIGZyYW1lIGZpdHMgY29tcGxldGVseSBpbiBidWZwKQogKgogKi5ERVNDUklQVElPTgogKgogKiBNU0YtYWNjZXNzaWJsZSBmaWVsZHMgb2YgUmVzdWx0IEJsb2NrCiAqIC0gSUZCX1J4TGVuICAgICAgICAgICAwIG9yIEZyYW1lIHNpemUuCiAqIC0gSUZCX01CSW5mb0xlbiAgICAgICAwIG9yIHRoZSBMLWZpZWxkIG9mIHRoZSBvbGRlc3QgTUJJQi4KICogLSBJRkJfUnNjSW5kCiAqIC0gSUZCX0hDRl9UYWxsaWVzICAgICB1cGRhdGVkIGlmIGEgY29ycmVzcG9uZGluZyBldmVudCBvY2N1cnJlZC4KICogLSBJRkJfTklDX1RhbGxpZXMgICAgIHVwZGF0ZWQgaWYgYSBUYWxseSBJbmZvIGZyYW1lIHJlY2VpdmVkIGZyb20gdGhlIE5JQy4KICogLSBJRkJfRG1hUGFja2V0cwogKiAtIElGQl9UeEZzU3RhdAogKiAtIElGQl9UeEZzU3dTdXAKICogLSBJRkJfTGlua1N0YXQgICAgICAgIHJlZmxlY3RzIG5ldyBsaW5rIHN0YXR1cyBvciAweDAwMDAgaWYgbm8gY2hhbmdlIHJlbGF0aXZlIHRvIHByZXZpb3VzIGhjZl9zZXJ2aWNlX25pYyBjYWxsLgpvcgoqIC0gSUZCX0xpbmtTdGF0ICAgICAgICBsaW5rIHN0YXR1cywgMHg4MDAwIHJlZmxlY3RzIGNoYW5nZSByZWxhdGl2ZSB0byBwcmV2aW91cyBoY2Zfc2VydmljZV9uaWMgY2FsbC4KKgoqIFdoZW4gSUZCX01CSW5mb0xlbiBpcyBub24temVybywgYXQgbGVhc3Qgb25lIE1CSUIgaXMgYXZhaWxhYmxlLgoqCiogSUZCX1J4TGVuIHJlZmxlY3RzIHRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgYnl0ZXMgaW4gODAyLjMgdmlldyAoSW5jbHVkaW5nIERlc3RBZGRyLCBTcmNBZGRyIGFuZCBMZW5ndGgsCiogZXhjbHVkaW5nIE1JQy1wYWRkaW5nLCBNSUMgYW5kIHN1bSBjaGVjaykgb2YgYWN0aXZlIFJ4IEZyYW1lIFN0cnVjdHVyZS4gSWYgbm8gUnggRGF0YSBzIGF2YWlsYWJsZSwgSUZCX1J4TGVuCiogZXF1YWxzIDB4MDAwMC4KKiBSZXBlYXRlZCBleGVjdXRpb24gY2F1c2VzIHRoZSBTZXJ2aWNlIE5JQyBGdW5jdGlvbiB0byBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHN1YnNlcXVlbnRseSByZWNlaXZlZAoqIG1lc3NhZ2VzLCBpcnJlc3BlY3RpdmUgd2hldGhlciBhIGhjZl9yY3ZfbXNnIG9yIGhjZl9hY3Rpb24oSENGX0FDVF9SWCkgaXMgcGVyZm9ybWVkIGluIGJldHdlZW4uCioKKiBXaGVuIElGQl9SeExlbiBpcyBub24temVybywgYSBSZWNlaXZlZCBGcmFtZSBTdHJ1Y3R1cmUgaXMgYXZhaWxhYmxlIHRvIGJlIHJvdXRlZCB0byB0aGUgcHJvdG9jb2wgc3RhY2suCiogV2hlbiBNb25pdG9yIE1vZGUgaXMgbm90IGFjdGl2ZSwgdGhpcyBpcyBndWFyYW50ZWVkIHRvIGJlIGFuIGVycm9yLWZyZWUgbm9uLVdNUCBmcmFtZS4KKiBJbiBjYXNlIG9mIE1vbml0b3IgTW9kZSwgaXQgbWF5IGFsc28gYmUgYSBmcmFtZSB3aXRoIGFuIGVycm9yIG9yIGEgV01QIGZyYW1lLgoqIEVycm9uZW91cyBmcmFtZXMgaGF2ZSBhIG5vbi16ZXJvIGVycm9yLXN1YiBmaWVsZCBpbiB0aGUgSEZTX1NUQVQgZmllbGQgaW4gdGhlIGxvb2sgYWhlYWQgYnVmZmVyLgoqCiogSWYgYSBSZWNlaXZlIG1lc3NhZ2UgaXMgYXZhaWxhYmxlIGluIE5JQyBSQU0sIHRoZSBSZWNlaXZlIEZyYW1lIFN0cnVjdHVyZSBpcyAocGFydGx5KSBjb3BpZWQgZnJvbSB0aGUgTklDIHRvCiogdGhlIGJ1ZmZlciBpZGVudGlmaWVkIGJ5IGJ1ZnAuCiogQ29weWluZyBzdG9wcyBlaXRoZXIgYWZ0ZXIgbGVuIGJ5dGVzIG9yIHdoZW4gdGhlIGNvbXBsZXRlIDgwMi4zIGZyYW1lIGlzIGNvcGllZC4KKiBEdXJpbmcgdGhlIGNvcHlpbmcgdGhlIG1lc3NhZ2UgaXMgZGVjYXBzdWxhdGVkIChpZiBhcHByb3ByaWF0ZSkuCiogSWYgdGhlIGZyYW1lIGlzIHJlYWQgY29tcGxldGVseSBieSBoY2Zfc2VydmljZV9uaWMgKGkuZS4gdGhlIGZyYW1lIGZpdHMgY29tcGxldGVseSBpbiB0aGUgbG9va2FoZWFkIGJ1ZmZlciksCiogdGhlIGZyYW1lIGlzIGF1dG9tYXRpY2FsbHkgQUNLJ2VkIHRvIHRoZSBGL1cgYW5kIHN0aWxsIGF2YWlsYWJsZSB2aWEgdGhlIGxvb2sgYWhlYWQgYnVmZmVyIGFuZCBoY2ZfcmN2X21zZy4KKiBPbmx5IGlmIHRoZSBmcmFtZSBpcyByZWFkIGNvbXBsZXRlbHkgYnkgaGNmX3NlcnZpY2VfbmljLCBoY2Zfc2VydmljZV9uaWMgY2hlY2tzIHRoZSBNSUMgYW5kIHNldHMgdGhlIHJldHVybgoqIHN0YXR1cyBhY2NvcmRpbmdseS4gIEluIHRoaXMgY2FzZSwgaGNmX3Jjdl9tc2cgZG9lcyBub3QgY2hlY2sgdGhlIE1JQy4KKgoqIFRoZSBNSUMgY2FsY3VsYXRpb24gYWxnb3JpdGhtIHdvcmtzIG1vcmUgZWZmaWNpZW50IGlmIHRoZSBsZW5ndGggb2YgdGhlIGxvb2sgYWhlYWQgYnVmZmVyIGlzCiogc3VjaCB0aGF0IGl0IGZpdHMgZXhhY3RseSA0IG4gYnl0ZXMgb2YgdGhlIDgwMi4zIGZyYW1lLCBpLmUuIGxlbiA9PSBIRlNfQUREUl9ERVNUICsgNCpuLgoqCiogVGhlIFNlcnZpY2UgTklDIEZ1bmN0aW9uIHN1cHBvcnRzIHRoZSBOSUMgZXZlbnQgc2VydmljZSBoYW5kbGluZyBwcm9jZXNzLgoqIEl0IHBlcmZvcm1zIHRoZSBhcHByb3ByaWF0ZSBhY3Rpb25zIHRvIHNlcnZpY2UgdGhlIE5JQywgc3VjaCB0aGF0IHRoZSBldmVudCBjYXVzZSBpcyBlbGltaW5hdGVkIGFuZCByZWxhdGVkCiogaW5mb3JtYXRpb24gaXMgc2F2ZWQuCiogVGhlIFNlcnZpY2UgTklDIEZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGJ5IHRoZSBNU0YgSVNSIG9yIHBvbGxpbmcgcm91dGluZSBhcyBmaXJzdCBzdGVwIHRvIGRldGVybWluZSB0aGUgZXZlbnQKKiBjYXVzZShzKS4gIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgTVNGIHRvIHBlcmZvcm0gYWxsIG5vdCBkaXJlY3RseSBOSUMgcmVsYXRlZCBpbnRlcnJ1cHQgc2VydmljZQoqIGFjdGlvbnMsIGUuZy4gaW4gYSBQQyBlbnZpcm9ubWVudCB0aGlzIGluY2x1ZGVzIHNlcnZpY2luZyB0aGUgUElDLCBhbmQgbWFuYWdpbmcgdGhlIFByb2Nlc3NvciBJbnRlcnJ1cHQKKiBFbmFibGluZy9EaXNhYmxpbmcuCiogSW4gY2FzZSBvZiBhIHBvbGxlZCBiYXNlZCBzeXN0ZW0sIHRoZSBTZXJ2aWNlIE5JQyBGdW5jdGlvbiBtdXN0IGJlIGV4ZWN1dGVkICJmcmVxdWVudGx5Ii4KKiBUaGUgU2VydmljZSBOSUMgRnVuY3Rpb24gbWF5IGhhdmUgc2lkZSBlZmZlY3RzIHJlbGF0ZWQgdG8gdGhlIE1haWxib3ggYW5kIFJlc291cmNlIEluZGljYXRvciAoSUZCX1JzY0luZCkuCioKKiBoY2Zfc2VydmljZV9uaWMgcmV0dXJuczoKKiAtIFRoZSBsZW5ndGggb2YgdGhlIGRhdGEgaW4gdGhlIGF2YWlsYWJsZSBNQklCIChJRkJfTUJJbmZvTGVuKQoqIC0gQ2hhbmdlcyBpbiB0aGUgbGluayBzdGF0dXMgKElGQl9MaW5rU3RhdCkKKiAtIFRoZSBsZW5ndGggb2YgdGhlIGRhdGEgaW4gdGhlIGF2YWlsYWJsZSBSZWNlaXZlIEZyYW1lIFN0cnVjdHVyZSAoSUZCX1J4TGVuKQoqIC0gdXBkYXRlZCBJRkJfUnNjSW5kCiogLSBVcGRhdGVkIFRhbGxpZXMKKgoqIGhjZl9zZXJ2aWNlX25pYyBpcyBwcmVzdW1lZCB0byBuZWl0aGVyIGludGVycnVwdCBvdGhlciBIQ0YtdGFza3Mgbm9yIHRvIGJlIGludGVycnVwdGVkIGJ5IG90aGVyIEhDRi10YXNrcy4KKiBBIHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gcHJlY2VkZSBoY2Zfc2VydmljZV9uaWMgYXMgd2VsbCBhcyBhbGwgb3RoZXIgSENGLXRhc2tzIHdpdGggYSBjYWxsIHRvCiogaGNmX2FjdGlvbiB0byBkaXNhYmxlIHRoZSBjYXJkIGludGVycnVwdHMgYW5kLCBhZnRlciBhbGwgd29yayBpcyBjb21wbGV0ZWQsIHdpdGggYSBjYWxsIHRvIGhjZl9hY3Rpb24gdG8KKiByZXN0b3JlICh3aGljaCBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgZW5hYmxpbmcpIHRoZSBjYXJkIGludGVycnVwdHMuCiogSW4gY2FzZSBvZiBhIHBvbGxlZCBlbnZpcm9ubWVudCwgaXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBNU0YgcHJvZ3JhbW1lciBpcyBzdWZmaWNpZW50bHkgZmFtaWxpYXIgd2l0aCB0aGUKKiBzcGVjaWZpYyByZXF1aXJlbWVudHMgb2YgdGhhdCBlbnZpcm9ubWVudCB0byB0cmFuc2xhdGUgdGhlIGludGVycnVwdCBzdHJhdGVneSB0byBhIHBvbGxlZCBzdHJhdGVneS4KKgoqIGhjZl9zZXJ2aWNlX25pYyBzZXJ2aWNlcyB0aGUgZm9sbG93aW5nIEhlcm1lcyBldmVudHM6CiogLSBIUkVHX0VWX0lORk8gICAgICAgIEFzeW5jaHJvbm91cyBJbmZvcm1hdGlvbiBGcmFtZQoqIC0gSFJFR19FVl9JTkZPX0RST1AgICBXTUFDIGRpZCBub3QgaGF2ZSBzdWZmaWNpZW50IFJBTSB0byBidWlsZCBVbnNvbGljaXRlZCBJbmZvcm1hdGlvbiBGcmFtZQoqIC0gSFJFR19FVl9UWF9FWEMgICAgICAoaWYgYXBwbGljYWJsZSwgaS5lLiBzZWxlY3RlZCB2aWEgSENGX0VYVF9JTlRfVFhfRVggYml0IG9mIEhDRl9FWFQpCiogLSBIUkVHX0VWX1NMRUVQX1JFUSAgIChpZiBhcHBsaWNhYmxlLCBpLmUuIHNlbGVjdGVkIHZpYSBIQ0ZfRERTL0hDRl9DRFMgYml0IG9mIEhDRl9TTEVFUCkKKiAqKiBpbiBub25fRE1BIG1vZGUKKiAtIEhSRUdfRVZfQUxMT0MgICAgICAgQXN5bmNocm9ub3VzIHBhcnQgb2YgQWxsb2NhdGlvbi9SZWNsYWltIGNvbXBsZXRlZCB3aGlsZSBvdXQgb2YgcmVzb3VyY2VzIGF0CiogICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb24gb2YgaGNmX3NlbmRfbXNnL25vdGlmeQoqIC0gSFJFR19FVl9SWCAgICAgICAgICB0aGUgZGV0ZWN0aW9uIG9mIHRoZSBhdmFpbGFiaWxpdHkgb2YgcmVjZWl2ZWQgbWVzc2FnZXMKKiAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkaW5nIFdhdmVMQU4gTWFuYWdlbWVudCBQcm90b2NvbCAoV01QKSBtZXNzYWdlIHByb2Nlc3NpbmcKKiAqKiBpbiBETUEgbW9kZQoqIC0gSFJFR19FVl9SRE1BRAoqIC0gSFJFR19FVl9URE1BRAoqISEgaGNmX3NlcnZpY2VfbmljIGRvZXMgbm90IHNlcnZpY2UgdGhlIGZvbGxvd2luZyBIZXJtZXMgZXZlbnRzOgoqISEgICAgIEhSRUdfRVZfVFggICAgICAgICAgKHRoZSAiT0siIFR4IEV2ZW50KSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGJ5IHRoZSBXQ0ksIGlmIGl0IG9jY3VycyBpdCBpcyB1bmNsZWFyCiohISAgICAgICAgICAgICAgICAgICAgICAgICB3aGF0IHRoZSBjYXVzZSBpcywgc28gbm8gbWVhbmluZ2Z1bCBzdHJhdGVneSBpcyBhdmFpbGFibGUuIE5vdCBhY2tpbmcgdGhlIGJpdCBpcwoqISEgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmFibHkgdGhlIGJlc3QgaGVscCB0aGF0IGNhbiBiZSBnaXZlbiB0byB0aGUgZGVidWdnZXIuCiohISAgICAgSFJFR19FVl9DTUQgICAgICAgICBoYW5kbGVkIGluIGNtZF93YWl0LgoqISEgICAgIEhSRUdfRVZfRldfRE1BICAgICAgKGkuZS4gSFJFR19FVl9SWERNQSwgSFJFR19FVl9UWERNQSBhbmRfRVZfTFBFU0MpIGFyZSBlaXRoZXIgbm90IHVzZWQgb3IgdXNlZAoqISEgICAgICAgICAgICAgICAgICAgICAgICAgYmV0d2VlbiB0aGUgRi9XIGFuZCB0aGUgRE1BIGVuZ2luZS4KKiEhICAgICBIUkVHX0VWX0FDS19SRUdfUkVBRFkgaXMgb25seSBhcHBsaWNhYmxlIGZvciBILUlJIChpLmUuIG5vdCBISUkuNSBhbmQgdXAsIHNlZSBEQVdBKQoqCiogICBJZiwgaW4gbm9uLURNQSBtb2RlLCBhIFJ4IG1lc3NhZ2UgaXMgYXZhaWxhYmxlLCBpdHMgbGVuZ3RoIGlzIHJlZmxlY3RlZCBieSB0aGUgSUZCX1J4TGVuIGZpZWxkIG9mIHRoZSBJRkIuCiogICBUaGlzIGxlbmd0aCByZWZsZWN0cyB0aGUgZGF0YSBpdHNlbGYgYW5kIHRoZSBEZXN0aW5hdGlvbiBBZGRyZXNzLCBTb3VyY2UgQWRkcmVzcyBhbmQgRGF0YUxlbmd0aC9UeXBlIGZpZWxkCiogICBidXQgbm90IHRoZSBTTkFQLWhlYWRlciBpbiBjYXNlIG9mIGRlY2Fwc3VsYXRpb24gYnkgdGhlIEhDRi4gIElmIG5vIG1lc3NhZ2UgaXMgYXZhaWxhYmxlLCBJRkJfUnhMZW4gaXMKKiAgIHplcm8uICBGb3JtZXIgdmVyc2lvbnMgb2YgdGhlIEhDRiBoYW5kbGVkIFdNUCBtZXNzYWdlcyBhbmQgc3VwcG9ydGVkIGEgIm1vbml0b3IiIG1vZGUgaW4gaGNmX3NlcnZpY2VfbmljLAoqICAgd2hpY2ggZGVwb3NpdGVkIGNlcnRhaW4gb3IgYWxsIFJ4IG1lc3NhZ2VzIGluIHRoZSBNYWlsQm94LiBUaGUgcmVzcG9uc2liaWxpdHkgdG8gaGFuZGxlIHRoZXNlIGZyYW1lcyBpcwoqICAgbW92ZWQgdG8gdGhlIE1TRi4gVGhlIEhDRiBvZmZlcnMgYXMgc3VwcG9ydHMgaGNmX3B1dF9pbmZvIHdpdGggQ0ZHX01CX0lORk8gYXMgcGFyYW1ldGVyIHRvIGVtdWxhdGUgdGhlIG9sZAoqICAgaW1wbGVtZW50YXRpb24gdW5kZXIgY29udHJvbCBvZiB0aGUgTVNGLgoqCiogKipSeCBCdWZmZXIgZnJlZSBzdHJhdGVneQoqICAgV2hlbiBoY2Zfc2VydmljZV9uaWMgcmVwb3J0cyB0aGUgYXZhaWxhYmlsaXR5IG9mIGEgbm9uLURNQSBtZXNzYWdlLCB0aGUgTVNGIGNhbiBhY2Nlc3MgdGhhdCBtZXNzYWdlIGJ5CiogICBtZWFucyBvZiBoY2ZfcmN2X21zZy4gSXQgbXVzdCBiZSBwcmV2ZW50ZWQgdGhhdCB0aGUgTEFOIENvbnRyb2xsZXIgd3JpdGVzIG5ldyBkYXRhIGluIHRoZSBOSUMgYnVmZmVyCiogICBiZWZvcmUgdGhlIE1TRiBpcyBmaW5pc2hlZCB3aXRoIHRoZSBjdXJyZW50IG1lc3NhZ2UuIFRoZSBOSUMgYnVmZmVyIGlzIHJldHVybmVkIHRvIHRoZSBMQU4gQ29udHJvbGxlcgoqICAgd2hlbjoKKiAgICAtIHRoZSBjb21wbGV0ZSBmcmFtZSBmaXRzIGluIHRoZSBsb29rYWhlYWQgYnVmZmVyIG9yCiogICAgLSBoY2ZfcmN2X21zZyBpcyBjYWxsZWQgb3IKKiAgICAtIGhjZl9hY3Rpb24gd2l0aCBIQ0ZfQUNUX1JYIGlzIGNhbGxlZCBvcgoqICAgIC0gaGNmX3NlcnZpY2VfbmljIGlzIGNhbGxlZCBhZ2FpbgoqICAgSXQgY2FuIGJlIHJlYXNvbmVkIHRoYXQgaGNmX2FjdGlvbiggSU5UX09OICkgc2hvdWxkIG5vdCBiZSBnaXZlbiBiZWZvcmUgdGhlIE1TRiBoYXMgY29tcGxldGVseSBwcm9jZXNzZWQKKiAgIGEgcmVwb3J0ZWQgUngtZnJhbWUuIFRoZSByZWFzb24gaXMgdGhhdCB0aGUgSU5UX09OIGFjdGlvbiBpcyBndWFyYW50ZWVkIHRvIGNhdXNlIGEgKFJ4LSlpbnRlcnJ1cHQgKHRoZQoqICAgTVNGIGlzIHByb2Nlc3NpbmcgYSBSeC1mcmFtZSwgaGVuY2UgdGhlIFJ4LWV2ZW50IGJpdCBpbiB0aGUgSGVybWVzIHJlZ2lzdGVyIG11c3QgYmUgYWN0aXZlKS4gVGhpcwoqICAgaW50ZXJydXB0IHdpbGwgY2F1c2UgaGNmX3NlcnZpY2VfbmljIHRvIGJlIGNhbGxlZCwgd2hpY2ggd2lsbCBjYXVzZSB0aGUgYWNrLWluZyBvZiB0aGUgImxhc3QiIFJ4LWV2ZW50CiogICB0byB0aGUgSGVybWVzLCBjYXVzaW5nIHRoZSBIZXJtZXMgdG8gZGlzY2FyZCB0aGUgYXNzb2NpYXRlZCBOSUMgUkFNIGJ1ZmZlci4KKiBBc3NlcnQgZmFpbHMgaWYKKiAtIGlmYnAgaXMgemVybyBvciBvdGhlciByZWNvZ25pemFibGUgb3V0LW9mLXJhbmdlIHZhbHVlLgoqIC0gaGNmX3NlcnZpY2VfbmljIGlzIGNhbGxlZCB3aXRob3V0IGEgcHJpb3IgY2FsbCB0byBoY2ZfY29ubmVjdC4KKiAtIGludGVycnVwdHMgYXJlIGVuYWJsZWQuCiogLSByZWVudHJhbmN5LCBtYXkgYmUgIGNhdXNlZCBieSBjYWxsaW5nIGhjZl9mdW5jdGlvbnMgd2l0aG91dCBhZGVxdWF0ZSBwcm90ZWN0aW9uCiogICBhZ2FpbnN0IE5JQyBpbnRlcnJ1cHRzIG9yIG11bHRpLXRocmVhZGluZy4KKgoqCiouRElBR1JBTQoqMTogSUZCX0xpbmtTdGF0IGlzIGNsZWFyZWQsIGlmIGEgTGlua1N0YXR1cyBmcmFtZSBpcyByZWNlaXZlZCwgSUZCX0xpbmtTdGF0IHdpbGwgYmUgdXBkYXRlZCBhY2NvcmRpbmdseQoqICAgYnkgaXNyX2luZm8uCm9yCioxOiBJRkJfTGlua1N0YXQgY2hhbmdlIGluZGljYXRpb24gaXMgY2xlYXJlZC4gSWYgYSBMaW5rU3RhdHVzIGZyYW1lIGlzIHJlY2VpdmVkLCBJRkJfTGlua1N0YXQgd2lsbCBiZSB1cGRhdGVkCiogICBhY2NvcmRpbmdseSBieSBpc3JfaW5mby4KKjI6IElGQl9SeExlbiBtdXN0IGJlIGNsZWFyZWQgYmVmb3JlIHRoZSBOSUMgcHJlc2VuY2UgY2hlY2sgb3RoZXJ3aXNlOgoqICAgIC0gIHRoaXMgdmFsdWUgbWF5IHN0YXkgbm9uLXplcm8gaWYgdGhlIE5JQyBpcyBwdWxsZWQgb3V0IGF0IGFuIGluY29udmVuaWVudCBtb21lbnQuCiogICAgLSAgdGhlIFJ4QWNrIG9uIGEgemVyby1GSUQgbmVlZHMgYSB6ZXJvLXZhbHVlIGZvciBJRkJfUnhMZW4gdG8gd29yawoqICAgIE5vdGUgdGhhdCBhcyBzaWRlLWVmZmVjdCBvZiB0aGUgaGNmX2FjdGlvbiBjYWxsLCB0aGUgcmVtYWluZGVyIG9mIFJ4IHJlbGF0ZWQgaW5mbyBpcyByZS1pbml0aWFsaXplZCBhcwoqICAgIHdlbGwuCio0OiBJbiBjYXNlIG9mIERlZnVuY3QgbW9kZSwgdGhlIGluZm9ybWF0aW9uIHN1cHBsaWVkIGJ5IEhlcm1lcyBpcyB1bnJlbGlhYmxlLCBzbyB0aGUgYm9keSBvZgoqICAgaGNmX3NlcnZpY2VfbmljIGlzIHNraXBwZWQuIFNpbmNlIGhjZl9jbnRsIHR1cm5zIGludG8gYSBOT1AgaWYgUHJpbWFyeSBvciBTdGF0aW9uIEYvVyBpcyBpbmNvbXBhdGlibGUsCiogICBoY2Zfc2VydmljZV9uaWMgaXMgYWxzbyBza2lwcGVkIGluIHRob3NlIGNhc2VzLgoqICAgVG8gcHJldmVudCB0aGF0IGhjZl9zZXJ2aWNlX25pYyByZXBvcnRzIGJvZ3VzIGluZm9ybWF0aW9uIHRvIHRoZSBNU0Ygd2l0aCBhbGwgLSBwb3NzaWJseSBkaWZmaWN1bHQgdG8KKiAgIGRlYnVnIC0gdW5kZXNpcmFibGUgc2lkZSBlZmZlY3RzLCBpdCBpcyBwYXJhbW91bnQgdG8gY2hlY2sgdGhlIE5JQyBwcmVzZW5jZS4gSW4gZm9ybWVyIGRheXMgdGhlIHByZXNlbmNlCiogICB0ZXN0IHdhcyBiYXNlZCBvbiB0aGUgSGVybWVzIHJlZ2lzdGVyIEhSRUdfU1dfMC4gU2luY2UgaW4gSENGX0FDVF9JTlRfT0ZGIGlzIGNob3NlbiBmb3Igc3RyYXRlZ3kgYmFzZWQgb24KKiAgIEhSRUdfRVZfU1RBVCwgdGhpcyBpcyBub3cgYWxzbyB1c2VkIGluIGhjZl9zZXJ2aWNlX25pYy4gVGhlIG1vdGl2YXRpb24gdG8gY2hhbmdlIHN0cmF0ZWd5IGlzIHBhcnRseQoqICAgZHVlIHRvIGluY29uc2lzdGVudCBGL1cgaW1wbGVtZW50YXRpb25zIHdpdGggcmVzcGVjdCB0byBIUkVHX1NXXzAgbWFuaXB1bGF0aW9uIGFyb3VuZCByZXNldCBhbmQgZG93bmxvYWQuCiogICBOb3RlIHRoYXQgaW4gcG9sbGVkIGVudmlyb25tZW50cyBDYXJkIFJlbW92YWwgaXMgbm90IGRldGVjdGVkIGJ5IElOVF9PRkYgd2hpY2ggbWFrZXMgdGhlIGNoZWNrIGluCiogICBoY2Zfc2VydmljZV9uaWMgZXZlbiBtb3JlIGltcG9ydGFudC4KKjg6IFRoZSBldmVudCBzdGF0dXMgcmVnaXN0ZXIgb2YgdGhlIEhlcm1lcyBpcyBzYW1wbGVkCiogICBUaGUgYXNzZXJ0IGNoZWNrcyBmb3IgdW5leHBlY3RlZCBldmVudHMgOz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8uCiogICAgLSBIUkVHX0VWX0lORk9fRFJPUCBpcyBleHBsaWNpdGx5IGV4Y2x1ZGVkIGZyb20gdGhlIGFjY2VwdGFibGUgSFJFR19FVl9TVEFUIGJpdHMgYmVjYXVzZSBpdCBpbmRpY2F0ZXMKKiAgICAgIGEgdG9vIGhlYXZpbHkgbG9hZGVkIHN5c3RlbS4KKiAgICAtIEhSRUdfRVZfQUNLX1JFR19SRUFEWSBpcyAweDAwMDAgZm9yIEgtSSAoYW5kIGhvcGVmdWxseSBILUlJLjUpCioKKgoqICAgSFJFR19FVl9UWF9FWEMgaXMgYWNjZXB0ZWQgKHZpYSBIUkVHX0VWX1RYX0VYVCkgaWYgYW5kIG9ubHkgaWYgSENGX0VYVF9JTlRfVFhfRVggc2V0IGluIHRoZSBIQ0ZfRVhUCiogICBkZWZpbml0aW9uIGF0IGNvbXBpbGUgdGltZS4KKiAgIFRoZSBmb2xsb3dpbmcgYWN0aXZpdGllcyBhcmUgaGFuZGxlZDoKKiAgICAtICBBbGxvYyBldmVudHMgYXJlIGhhbmRsZWQgYnkgaGNmX3NlbmRfbXNnIChhbmQgbm90aWZ5KS4gT25seSBpZiB0aGVyZSBpcyBubyAic3BhcmUiIHJlc291cmNlLCB0aGUKKiAgICAgICBhbGxvYyBldmVudCBpcyBzdXBlcmZpY2lhbGx5IHNlcnZpY2VkIGJ5IGhjZl9zZXJ2aWNlX25pYyB0byBjcmVhdGUgYSBwc2V1ZG8tcmVzb3VyY2Ugd2l0aCB2YWx1ZQoqICAgICAgIDB4MDAxLiBUaGlzIHZhbHVlIGlzIHJlY29nbml6ZWQgYnkgZ2V0X2ZpZCAoY2FsbGVkIGJ5IGhjZl9zZW5kX21zZyBhbmQgbm90aWZ5KSB3aGVyZSB0aGUgcmVhbAoqICAgICAgIFR4RmlkIGlzIHJldHJpZXZlZCBhbmQgdGhlIEhlcm1lcyBpcyBhY2tlZCBhbmQgLSBob3BlZnVsbHkgLSB0aGUgIm5vcm1hbCIgY2FzZSB3aXRoIGEgc3BhcmUgVHhGaWQKKiAgICAgICBpbiBJRkJfUnNjSW5kIGlzIHJlc3RvcmVkLgoqICAgIC0gIEluZm8gZHJvcCBldmVudHMgYXJlIGhhbmRsZWQgYnkgaW5jcmVtZW50aW5nIGEgdGFsbHkKKiAgICAtICBMaW5rRXZlbnQgKGluY2x1ZGluZyBzb2xpY2l0ZWQgYW5kIHVuc29saWNpdGVkIHRhbGxpZXMpIGFyZSBoYW5kbGVkIGJ5IHByb2NlZHVyZSBpc3JfaW5mby4KKiAgIC0gICBUeEV4IChpZiBzZWxlY3RlZCBhdCBjb21waWxlIHRpbWUpIGlzIGhhbmRsZWQgYnkgY29weWluZyB0aGUgc2lnbmlmaWNhbnQgcGFydCBvZiB0aGUgVHhGUwoqICAgICAgIGludG8gdGhlIElGQiBmb3IgZnVydGhlciBwcm9jZXNzaW5nIGJ5IHRoZSBNU0YuCiogICAgICAgTm90ZSB0aGUgY29tcGxpY2F0aW9uIG9mIHRoZSB6ZXJvLUZJRCBwcm90ZWN0aW9uIHN1Yi1zY2hlbWUgaW4gREFXQS4KKiAgIE5vdGUsIHRoZSBBY2sgb2YgYWxsIG9mIGFib3ZlIGV2ZW50cyBpcyBoYW5kbGVkIGF0IHRoZSBlbmQgb2YgaGNmX3NlcnZpY2VfbmljCioxNjogSW4gY2FzZSBvZiAgbm9uLURNQSAoIGVpdGhlciBub3QgY29tcGlsZWQgaW4gb3IgZHVlIHRvIGEgcnVuLXRpbWUgY2hvaWNlKToKKiAgIElmIGFuIFJ4LWZyYW1lIGlzIGF2YWlsYWJsZSwgZmlyc3QgdGhlIEZJRCBvZiB0aGF0IGZyYW1lIGlzIHJlYWQsIGluY2x1ZGluZyB0aGUgY29tcGxpY2F0aW9uIG9mIHRoZQoqICAgemVyby1GSUQgcHJvdGVjdGlvbiBzdWItc2NoZW1lIGluIERBV0EuIE5vdGUgdGhhdCBzdWNoIGEgemVyby1GSUQgaXMgYWNrbm93bGVkZ2VkIGF0IHRoZSBlbmQgb2YKKiAgIGhjZl9zZXJ2aWNlX25pYyBhbmQgdGhhdCB0aGlzIGRlcGVuZHMgb24gdGhlIElGQl9SeExlbiBpbml0aWFsaXphdGlvbiBpbiB0aGUgYmVnaW4gb2YgaGNmX3NlcnZpY2VfbmljLgoqICAgVGhlIEFzc2VydCB2YWxpZGF0ZXMgdGhlIEhDRiBhc3N1bXB0aW9uIGFib3V0IEhlcm1lcyBpbXBsZW1lbnRhdGlvbiB1cG9uIHdoaWNoIHRoZSByYW5nZSBvZgoqICAgUHNldWRvLVJJRHMgaXMgYmFzZWQuCiogICBUaGVuIHRoZSBjb250cm9sIGZpZWxkcyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIDgwMi4zIGZyYW1lIGFyZSByZWFkIGZyb20gdGhlIE5JQyBpbnRvIHRoZSBsb29rYWhlYWQgYnVmZmVyLgoqICAgVGhlIHN0YXR1cyBmaWVsZCBpcyBjb252ZXJ0ZWQgdG8gbmF0aXZlIEVuZGlhbmVzcy4KKiAgIFRoZSBsZW5ndGggaXMsIGFmdGVyIGltcGxpY2l0IEVuZGlhbmVzcyBjb252ZXJzaW9uIGlmIG5lZWRlZCwgYW5kIGFkanVzdG1lbnQgZm9yIHRoZSAxNCBieXRlcyBvZiB0aGUKKiAgIDgwMi4zIE1BQyBoZWFkZXIsIHN0b3JlZCBpbiBJRkJfUnhMZW4uCiogICBJbiBNQUMgTW9uaXRvciBtb2RlLCA4MDIuMTEgY29udHJvbCBmcmFtZXMgd2l0aCBhIFRPVEFMIGxlbmd0aCBvZiAxNCBhcmUgcmVjZWl2ZWQsIHNvIHdpdGhvdXQgdGhpcwoqICAgbGVuZ3RoIGFkanVzdG1lbnQsIElGQl9SeExlbiBjb3VsZCBub3QgYmUgdXNlZCB0byBkaXN0aW5ndWlzaCB0aGVzZSBmcmFtZXMgZnJvbSAibm8gZnJhbWUiLgoqICAgTm8gTUlDIGNhbGN1bGF0aW9uIHByb2Nlc3NlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWFkaW5nIG9mIHRoZXNlIENvbnRyb2wgZmllbGRzLgoqMjY6IFRoaXMgbGVuZ3RoIHRlc3QgZmVlbHMgbGlrZSBzdXBlcmZsdW91cyByb2J1c3RuZXNzIGFnYWluc3QgbWFsZm9ybWVkIGZyYW1lcywgYnV0IGl0IHR1cm5lZCBvdXQgdG8gYmUKKiAgIG5lZWRlZCBpbiB0aGUgcmVhbCAoaG9zdGlsZSkgd29ybGQuCiogICBUaGUgZGVjYXBzdWxhdGlvbiBjaGVjayBuZWVkcyBzdWZmaWNpZW50IGRhdGEgdG8gcmVwcmVzZW50IERBLCBTQSwgTCwgU05BUCBhbmQgVHlwZSB3aGljaCBhbW91bnRzIHRvCiogICAyMiBieXRlcy4gSW4gTUFDIE1vbml0b3IgbW9kZSwgODAyLjExIGNvbnRyb2wgZnJhbWVzIHdpdGggYSBzbWFsbGVyIGxlbmd0aCBhcmUgcmVjZWl2ZWQuIFRvIHByZXZlbnQKKiAgIHRoYXQgdGhlIGltcGxlbWVudGF0aW9uIGdvZXMgaGF5d2lyZSwgYSBjaGVjayBvbiB0aGUgbGVuZ3RoIGlzIG5lZWRlZC4KKiAgIFRoZSBhY3R1YWwgZGVjYXBzdWxhdGlvbiB0YWtlcyBwbGFjZSBvbiB0aGUgZmx5IGluIHRoZSBjb3B5aW5nIHByb2Nlc3MgYnkgb3ZlcndyaXRpbmcgdGhlIFNOQVAgaGVhZGVyLgoqICAgTm90ZSB0aGF0IGluIGNhc2Ugb2YgZGVjYXBzdWxhdGlvbiB0aGUgU05BUCBoZWFkZXIgaXMgbm90IHBhc3NlZCB0byB0aGUgTVNGLCBoZW5jZSBJRkJfUnhMZW4gbXVzdCBiZQoqICAgY29tcGVuc2F0ZWQgZm9yIHRoZSBTTkFQIGhlYWRlciBsZW5ndGguCiogICBUaGUgMjIgYnl0ZXMgbmVlZGVkIGZvciBkZWNhcHN1bGF0aW9uIGFyZSAobW9yZSB0aGFuKSBzdWZmaWNpZW50IGZvciB0aGUgZXhjZXB0aW9uYWwgaGFuZGxpbmcgb2YgdGhlCiogICBNSUMgYWxnb3JpdGhtIG9mIHRoZSBMLWZpZWxkIChyZXBsYWNpbmcgdGhlIDIgYnl0ZSBMLWZpZWxkIHdpdGggNCAweDAwIGJ5dGVzKS4KKjMwOiBUaGUgMTIgaW4gdGhlIG5vLVdQQSBicmFuY2ggY29ycmVzcG9uZHMgd2l0aCB0aGUgZ2V0X2ZyYWcsIHRoZSAyIHdpdGggdGhlIElQVyBvZiB0aGUgV1BBIGJyYW5jaAoqMzI6IElmIEhlcm1lcyByZXBvcnRlZCBNSUMtcHJlc2VuY2UsIHRoYW4gdGhlIE1JQyBlbmdpbmUgaXMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgbm9uLWR1bW15IE1JQyBjYWxjdWxhdGlvbgoqICAgcm91dGluZSBhZGRyZXNzIGFuZCBhcHByb3ByaWF0ZSBrZXkuCiozNDogVGhlIDggYnl0ZXMgYWZ0ZXIgdGhlIERBLCBTQSwgTCBhcmUgcmVhZCBhbmQgaXQgaXMgY2hlY2tlZCB3aGV0aGVyIGRlY2Fwc3VsYXRpb24gaXMgbmVlZGVkIGkuZS46CiogICAgIC0gdGhlIEhlcm1lcyByZXBvcnRlZCBUdW5uZWwgZW5jYXBzdWxhdGlvbiBvcgoqICAgICAtIHRoZSBIZXJtZXMgcmVwb3J0ZWQgMTA0MiBFbmNhcHN1bGF0aW9uIGFuZCBoY2ZfZW5jYXAgcmVwb3J0cyB0aGF0IHRoZSBIQ0Ygd291bGQgbm90IGhhdmUgdXNlZAoqICAgICAgIDEwNDIgYXMgdGhlIGVuY2Fwc3VsYXRpb24gbWVjaGFuaXNtCiogICBOb3RlIHRoYXQgdGhlIGZpcnN0IGZpZWxkIG9mIHRoZSBSeEZTIGluIGJ1ZnAgaGFzIE5hdGl2ZSBFbmRpYW5lc3MgZHVlIHRvIHRoZSBjb252ZXJzaW9uIGRvbmUgYnkgdGhlCiogICBCRV9QQVIgaW4gZ2V0X2ZyYWcuCiozNjogVGhlIFR5cGUgZmllbGQgaXMgdGhlIG9ubHkgd29yZCBrZXB0IChhZnRlciBtb3ZpbmcpIG9mIHRoZSBqdXN0IHJlYWQgOCBieXRlcywgaXQgaXMgbW92ZWQgdG8gdGhlCiogICBMLWZpZWxkLiAgVGhlIG9yaWdpbmFsIEwtZmllbGQgYW5kIDYgYnl0ZSBTTkFQIGhlYWRlciBhcmUgZGlzY2FyZGVkLCBzbyBJRkJfUnhMZW4gYW5kIGJ1Zl9hZGRyIG11c3QKKiAgIGJlIGFkanVzdGVkIGJ5IDguCio0MDogRGV0ZXJtaW5lIGhvdyBtdWNoIG9mIHRoZSBmcmFtZSAoc3RhcnRpbmcgd2l0aCBEQSkgZml0cyBpbiB0aGUgTG9va2FoZWFkIGJ1ZmZlciwgdGhlbiByZWFkIHRoZSBub3QteWV0CiogICByZWFkIGRhdGEgaW50byB0aGUgbG9va2FoZWFkIGJ1ZmZlci4KKiAgIElmIHRoZSBsb29rYWhlYWQgYnVmZmVyIGNvbnRhaW5zIHRoZSBjb21wbGV0ZSBtZXNzYWdlLCBjaGVjayB0aGUgTUlDLiBUaGUgbWFqb3JpdHkgY29uc2lkZXJlZCB0aGlzCiogICBJL0YgbW9yZSBhcHByb3ByaWF0ZSB0aGVuIGhhdmUgdGhlIE1TRiBjYWxsIGhjZl9nZXRfZGF0YSBvbmx5IHRvIGNoZWNrIHRoZSBNSUMuCio0NDogU2luY2UgdGhlIGNvbXBsZXRlIG1lc3NhZ2UgaXMgY29waWVkIGZyb20gTklDIFJBTSB0byBQQyBSQU0sIHRoZSBSeCBjYW4gYmUgYWNrbm93bGVkZ2VkIHRvIHRoZSBIZXJtZXMKKiAgIHRvIG9wdGltaXplIHRoZSBmbG93ICggYSBiZXR0ZXIgY2hhbmNlIHRvIGdldCBuZXcgUnggZGF0YSBpbiB0aGUgbmV4dCBwYXNzIHRocm91Z2ggaGNmX3NlcnZpY2VfbmljICkuCiogICBUaGlzIGFja25vd2xlZGdlbWVudCBjYW4gbm90IGJlIGRvbmUgdmlhIGhjZl9hY3Rpb24oIEhDRl9BQ1RfUlhfQUNLICkgYmVjYXVzZSB0aGlzIGFsc28gY2xlYXJzCiogICBJRkJfUnhMRU4gdGh1cyBjb3JydXB0aW5nIHRoZSBJL0YgdG8gdGhlIE1TRi4KKjs/OiBJbiBjYXNlIG9mIERNQSAoY29tcGlsZWQgaW4gYW5kIGFjdGl2YXRlZCk6CgoKKjU0OiBMaW1pdGluZyB0aGUgbnVtYmVyIG9mIHBsYWNlcyB3aGVyZSB0aGUgRi9XIGlzIGFja2VkIChlLmcuIHRoZSBtZXJnaW5nIG9mIHRoZSBSeC1BQ0sgd2l0aCB0aGUgb3RoZXIKKiAgIEFDS3MpLCBpcyBzdXBwb3NlZCB0byBkaW1pbmlzaCB0aGUgcG90ZW50aWFsIG9mIHJhY2UgY29uZGl0aW9ucyBpbiB0aGUgRi9XLgoqICAgTm90ZSAxOiBUaGUgQ01EIGV2ZW50IGlzIGFja25vd2xlZGdlZCBpbiBjbWRfY21wbAoqICAgTm90ZSAyOiBIUkVHX0VWX0FDS19SRUdfUkVBRFkgaXMgMHgwMDAwIGZvciBILUkgKGFuZCBob3BlZnVsbHkgSC1JSS41KQoqICAgTm90ZSAzOiBUaGUgQUxMT0MgZXZlbnQgaXMgYWNrbm93bGVkZ2VkIGluIGdldF9maWQgKGV4Y2VwdCBmb3IgdGhlIGluaXRpYWxpemF0aW9uIGZsb3cpCioKKi5OT1RJQ0UKKiBUaGUgTm9uLURNQSBIUkVHX0VWX1JYIGlzIGhhbmRsZWQgZGlmZmVyZW50IGNvbXBhcmVkIHdpdGggdGhlIG90aGVyIEYvVyBldmVudHMuCiogVGhlIEhSRUdfRVZfUlggZXZlbnQgaXMgYWNrbm93bGVkZ2VkIGJ5IHRoZSBmaXJzdCBoY2Zfc2VydmljZV9uaWMgY2FsbCBhZnRlciB0aGUKKiBoY2Zfc2VydmljZV9uaWMgY2FsbCB0aGF0IHJlcG9ydGVkIHRoZSBvY2N1cnJlbmNlIG9mIHRoaXMgZXZlbnQuCiogVGhpcyBhY2tub3dsZWRnbWVudAoqIG1ha2VzIHRoZSBuZXh0IFJlY2VpdmUgRnJhbWUgU3RydWN0dXJlIChpZiBhbnkpIGF2YWlsYWJsZS4KKiBBbiB1cGRhdGVkIElGQl9SeExlbgoqIGZpZWxkIHJlZmxlY3RzIHRoaXMgYXZhaWxhYmlsaXR5LgoqCiouTk9USUNFCiogVGhlIG1pbmltdW0gc2l6ZSBmb3IgTGVuIG11c3Qgc3VwcGx5IHNwYWNlIGZvcjoKKiAtIGFuIEYvVyBkZXBlbmRlbnQgbnVtYmVyIG9mIGJ5dGVzIG9mIENvbnRyb2wgSW5mbyBmaWVsZCBpbmNsdWRpbmcgdGhlIDgwMi4xMSBIZWFkZXIgZmllbGQKKiAtIERlc3RpbmF0aW9uIEFkZHJlc3MKKiAtIFNvdXJjZSBBZGRyZXNzCiogLSBMZW5ndGggZmllbGQKKiAtIFsgU05BUCBIZWFkZXJdCiogLSBbIEV0aGVybmV0LUlJIFR5cGVdCiogVGhpcyByZXN1bHRzIGluIDY4IGZvciBIZXJtZXMtSSBhbmQgODAgZm9yIEhlcm1lcy1JSQoqIFRoaXMgd2F5IHRoZSBtaW5pbXVtIGFtb3VudCBvZiBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgbmVlZGVkIGJ5IHRoZSBIQ0YgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGZyYW1lCiogbXVzdCBiZSBkZWNhcHN1bGF0ZWQuCiouRU5ERE9DICAgICAgICAgICAgICAgIEVORCBET0NVTUVOVEFUSU9OCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQKaGNmX3NlcnZpY2VfbmljKCBJRkJQIGlmYnAsIHdjaV9idWZwIGJ1ZnAsIHVuc2lnbmVkIGludCBsZW4gKQp7CgoJaW50ICAgICAgICAgcmMgPSBIQ0ZfU1VDQ0VTUzsKCWhjZl8xNiAgICAgIHN0YXQ7Cgl3Y2lfYnVmcCAgICBidWZfYWRkcjsKCWhjZl8xNiAgICAgIGk7CgoJSENGTE9HRU5UUlkoIEhDRl9UUkFDRV9TRVJWSUNFX05JQywgaWZicC0+SUZCX0ludE9mZkNudCApOwoJSENGQVNTRVJUKCBpZmJwLT5JRkJfTWFnaWMgPT0gSENGX01BR0lDLCBpZmJwLT5JRkJfTWFnaWMgKTsKCUhDRkFTU0VSVF9JTlQ7CgoJaWZicC0+SUZCX0xpbmtTdGF0ID0gMDsgLy8gOz8gdG8gYmUgb2Jzb2xldGVkIEFTQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMSovCglpZmJwLT5JRkJfRFNMaW5rU3RhdCAmPSB+Q0ZHX0xJTktfU1RBVF9DSEFOR0U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxKi8KCSh2b2lkKWhjZl9hY3Rpb24oIGlmYnAsIEhDRl9BQ1RfUlhfQUNLICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIqLwoJaWYgKCBpZmJwLT5JRkJfQ2FyZFN0YXQgPT0gMCAmJiAoIHN0YXQgPSBJUFcoIEhSRUdfRVZfU1RBVCApICkgIT0gMHhGRkZGICkgeyAgICAgICAgICAgICAgICAgICAgLyogNCovCi8qCQlJRl9OT1RfRE1BKCBIQ0ZBU1NFUlQoICEoIHN0YXQgJiB+SFJFR19FVl9CQVNJQ19NQVNLLCBzdGF0ICkgKQogKgkJSUZfTk9UX1VTRV9ETUEoIEhDRkFTU0VSVCggISggc3RhdCAmIH5IUkVHX0VWX0JBU0lDX01BU0ssIHN0YXQgKSApCiAqCQlJRl9VU0VfRE1BKCBIQ0ZBU1NFUlQoICEoIHN0YXQgJiB+KCBIUkVHX0VWX0JBU0lDX01BU0sgXiAoIEhSRUdfRVZfLi4uRE1BLi4uLiApLCBzdGF0ICkgKQogKi8KCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOCovCgkJaWYgKCBpZmJwLT5JRkJfUnNjSW5kID09IDAgJiYgc3RhdCAmIEhSRUdfRVZfQUxMT0MgKSB7IC8vTm90ZTogSUZCX1JzY0luZCBpcyBBTFdBWVMgMSBmb3IgRE1BCgkJCWlmYnAtPklGQl9Sc2NJbmQgPSAxOwoJCX0KCQlJRl9UQUxMWSggaWYgKCBzdGF0ICYgSFJFR19FVl9JTkZPX0RST1AgKSB7IGlmYnAtPklGQl9IQ0ZfVGFsbGllcy5Ob0J1ZkluZm8rKzsgfSApOwojaWYgKEhDRl9FWFQpICYgSENGX0VYVF9JTlRfVElDSwoJCWlmICggc3RhdCAmIEhSRUdfRVZfVElDSyApIHsKCQkJaWZicC0+SUZCX1RpY2tDbnQrKzsKCQl9CiNpZiAwIC8vIChIQ0ZfU0xFRVApICYgSENGX0REUwoJCWlmICggaWZicC0+SUZCX1RpY2tDbnQgPT0gMyAmJiAoIGlmYnAtPklGQl9EU0xpbmtTdGF0ICYgQ0ZHX0xJTktfU1RBVF9DT05ORUNURUQgKSA9PSAwICkgewoJCQlDRkdfRERTX1RJQ0tfVElNRV9TVFJDVCBsdHY7CgkJCS8vIDIgc2Vjb25kIHBlcmlvZCAod2l0aCAxIHRpY2sgdW5jZXJ0YW50eSkgaW4gbm90LWNvbm5lY3RlZCBtb2RlIC0tPmdvIGludG8gRFNfT09SCgkJCWhjZl9hY3Rpb24oIGlmYnAsIEhDRl9BQ1RfU0xFRVAgKTsKCQkJaWZicC0+SUZCX0RTTGlua1N0YXQgfD0gQ0ZHX0xJTktfU1RBVF9EU19PT1I7IC8vc2V0IE91dE9mUmFuZ2UKCQkJbHR2LmxlbiA9IDI7CgkJCWx0di50eXAgPSBDRkdfRERTX1RJQ0tfVElNRTsKCQkJbHR2LnRpY2tfdGltZSA9ICggKCBpZmJwLT5JRkJfRFNMaW5rU3RhdCAmIENGR19MSU5LX1NUQVRfVElNRVIgKSArIDB4MTAgKSAqNjQ7IC8vNzggaXMgbW9yZSByaWdodAoJCQloY2ZfcHV0X2luZm8oIGlmYnAsIChMVFZQKSZsdHYgKTsKCQkJcHJpbnRrKCAiPDU+UHJlcGFyaW5nIGZvciBzbGVlcCwgbGlua19zdGF0dXM6ICUwNFgsIHRpbWVyIDogJWRcbiIsCgkJCQlpZmJwLT5JRkJfRFNMaW5rU3RhdCwgbHR2LnRpY2tfdGltZSApOy8vOz9yZW1vdmUgbWUgMSBkYXkKCQkJaWZicC0+SUZCX1RpY2tDbnQrKzsgLy87P2p1c3QgdG8gbWFrZSBzdXJlIHdlIGRvIG5vdCBrZWVwIG9uIHByaW50aW5nIGFib3ZlIG1lc3NhZ2UKCQkJaWYgKCBsdHYudGlja190aW1lIDwgMzAwICogMTI1ICkgaWZicC0+SUZCX0RTTGlua1N0YXQgKz0gMHgwMDEwOwoKCQl9CiNlbmRpZiAvLyBIQ0ZfRERTCiNlbmRpZiAvLyBIQ0ZfRVhUX0lOVF9USUNLCgkJaWYgKCBzdGF0ICYgSFJFR19FVl9JTkZPICkgewoJCQlpc3JfaW5mbyggaWZicCApOwoJCX0KI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfSU5UX1RYX0VYCgkJaWYgKCBzdGF0ICYgSFJFR19FVl9UWF9FWFQgJiYgKCBpID0gSVBXKCBIUkVHX1RYX0NPTVBMX0ZJRCApICkgIT0gMCAvKkRBV0EqLyApIHsKCQkJREFXQV9aRVJPX0ZJRCggSFJFR19UWF9DT01QTF9GSUQgKTsKCQkJKHZvaWQpc2V0dXBfYmFwKCBpZmJwLCBpLCAwLCBJT19JTiApOwoJCQlnZXRfZnJhZyggaWZicCwgJmlmYnAtPklGQl9UeEZzU3RhdCwgSEZTX1NXU1VQIEJFX1BBUigxKSApOwoJCX0KI2VuZGlmIC8vIEhDRl9FWFRfSU5UX1RYX0VYCi8vIXJsYXYgRE1BIGVuZ2luZSB3aWxsIGhhbmRsZSB0aGUgcnggZXZlbnQsIG5vdCB0aGUgZHJpdmVyCiNpZiBIQ0ZfRE1BCgkJaWYgKCAhKCBpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV9ETUEgKSApIC8vISEgYmUgYXdhcmUgb2YgdGhlIGxvZ2ljYWwgaW5kZW50YXRpb25zCiNlbmRpZiAvLyBIQ0ZfRE1BCgkJLyoxNiovICBpZiAoIHN0YXQgJiBIUkVHX0VWX1JYICYmICggaWZicC0+SUZCX1J4RklEID0gSVBXKCBIUkVHX1JYX0ZJRCApICkgIT0gMCApIHsgLy9pZiAwIHRoZW4gREFXQV9BQ0sKCQkJCUhDRkFTU0VSVCggYnVmcCwgbGVuICk7CgkJCQlIQ0ZBU1NFUlQoIGxlbiA+PSBIRlNfREFUICsgMiwgbGVuICk7CgkJCQlEQVdBX1pFUk9fRklEKCBIUkVHX1JYX0ZJRCApOwoJCQkJSENGQVNTRVJUKCBpZmJwLT5JRkJfUnhGSUQgPCBDRkdfUFJPRF9EQVRBLCBpZmJwLT5JRkJfUnhGSUQpOwoJCQkJKHZvaWQpc2V0dXBfYmFwKCBpZmJwLCBpZmJwLT5JRkJfUnhGSUQsIDAsIElPX0lOICk7CgkJCQlnZXRfZnJhZyggaWZicCwgYnVmcCwgSEZTX0FERFJfREVTVCBCRV9QQVIoMSkgKTsKCQkJCWlmYnAtPklGQl9sYXAgPSBidWZfYWRkciA9IGJ1ZnAgKyBIRlNfQUREUl9ERVNUOwoJCQkJaWZicC0+SUZCX1J4TGVuID0gKGhjZl8xNikoYnVmcFtIRlNfREFUX0xFTl0gKyAoYnVmcFtIRlNfREFUX0xFTisxXTw8OCkgKyAyKjYgKyAyKTsKCQkJLyoyNiovICBpZiAoIGlmYnAtPklGQl9SeExlbiA+PSAyMiApIHsgIC8vIGNvbnZlbmllbnQgZm9yIE1JQyBjYWxjdWxhdGlvbiAoNSBEV3MgKyAxICJza2lwcGVkIiBXKQoJCQkJCQkJCS8vLiAgZ2V0IERBLFNBLExlbi9UeXBlIGFuZCAoU05BUCxUeXBlIG9yIDggZGF0YSBieXRlcykKCQkJCS8qMzAqLyAgZ2V0X2ZyYWcoIGlmYnAsIGJ1Zl9hZGRyLCAyMiBCRV9QQVIoMCkgKTsKCQkJCS8qMzIqLyAgQ0FMQ19SWF9NSUMoIGJ1ZnAsIC0xICk7ICAgICAgICAvLy4gIGluaXRpYWxpemUgTUlDCgkJCQkJQ0FMQ19SWF9NSUMoIGJ1Zl9hZGRyLCBIQ0ZfREFTQV9TSVpFICk7IC8vLiAgTUlDIG92ZXIgREEsIFNBCgkJCQkJQ0FMQ19SWF9NSUMoIG51bGxfYWRkciwgNCApOyAgICAvLy4gIE1JQyBvdmVyICh2aXJ0dWFsKSBwcmlvcml0eSBmaWVsZAoJCQkJCUNBTENfUlhfTUlDKCBidWZfYWRkcisxNCwgOCApOyAgLy8uICBza2lwIExlbiwgTUlDIG92ZXIgU05BUCxUeXBlIG9yIDggZGF0YSBieXRlcykKCQkJCQlidWZfYWRkciArPSAyMjsKI2lmIChIQ0ZfRU5DQVApID09IEhDRl9FTkMKCQkJCQlIQ0ZBU1NFUlQoIGxlbiA+PSBIRlNfREFUICsgMiArIHNpemVvZihzbmFwX2hlYWRlciksIGxlbiApOwoJCQkJLyozNCovICBpID0gKih3Y2lfcmVjb3JkcCkmYnVmcFtIRlNfU1RBVF0gJiAoIEhGU19TVEFUX01TR19UWVBFIHwgSEZTX1NUQVRfRVJSICk7CgkJCQkJaWYgKCBpID09IEhGU19TVEFUX1RVTk5FTCB8fAoJCQkJCSAgICAgKCBpID09IEhGU19TVEFUXzEwNDIgJiYgaGNmX2VuY2FwKCAod2NpX2J1ZnApJmJ1ZnBbSEZTX1RZUEVdICkgIT0gRU5DX1RVTk5FTCApICkgewoJCQkJCQkJICAgICAgICAgICAgICAgIC8vLiAgY29weSBFLUlJIFR5cGUgdG8gODAyLjMgTEVOIGZpZWxkCgkJCQkvKjM2Ki8gIGJ1ZnBbSEZTX0xFTiAgXSA9IGJ1ZnBbSEZTX1RZUEUgIF07CgkJCQkJCWJ1ZnBbSEZTX0xFTisxXSA9IGJ1ZnBbSEZTX1RZUEUrMV07CgkJCQkJCQkgICAgICAgICAgICAgICAgLy8uICBkaXNjYXJkIFNuYXAgYnkgb3ZlcndyaXRpbmcgd2l0aCBkYXRhCgkJCQkJCWlmYnAtPklGQl9SeExlbiAtPSAoSEZTX1RZUEUgLSBIRlNfTEVOKTsKCQkJCQkJYnVmX2FkZHIgLT0gKCBIRlNfVFlQRSAtIEhGU19MRU4gKTsgLy8gdGhpcyBoYXBwZW5zIHRvIGJyaW5nIHVzIGF0IGEgRFcgYm91bmRhcnkgb2YgMzYKCQkJCQl9CiNlbmRpZiAvLyBIQ0ZfRU5DCgkJCQl9CgkJCS8qNDAqLyAgaWZicC0+SUZCX2xhbCA9IG1pbiggKGhjZl8xNikobGVuIC0gSEZTX0FERFJfREVTVCksIGlmYnAtPklGQl9SeExlbiApOwoJCQkJaSA9IGlmYnAtPklGQl9sYWwgLSAoIGJ1Zl9hZGRyIC0gKCBidWZwICsgSEZTX0FERFJfREVTVCApICk7CgkJCQlnZXRfZnJhZyggaWZicCwgYnVmX2FkZHIsIGkgQkVfUEFSKDApICk7CgkJCQlDQUxDX1JYX01JQyggYnVmX2FkZHIsIGkgKTsKI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XUEEKCQkJCWlmICggaWZicC0+SUZCX2xhbCA9PSBpZmJwLT5JRkJfUnhMZW4gKSB7CgkJCQkJcmMgPSBjaGVja19taWMoIGlmYnAgKTsKCQkJCX0KI2VuZGlmIC8vIEhDRl9UWVBFX1dQQQoJCQkvKjQ0Ki8gIGlmICggbGVuIC0gSEZTX0FERFJfREVTVCA+PSBpZmJwLT5JRkJfUnhMZW4gKSB7CgkJCQkJaWZicC0+SUZCX1J4RklEID0gMDsKCQkJCX0gZWxzZSB7IC8qIElGQl9SeEZJRCBpcyBjbGVhcmVkLCBzbyAgeW91IGRvIG5vdCBnZXQgYW5vdGhlciBSeF9BY2sgYXQgbmV4dCBlbnRyeSBvZiBoY2Zfc2VydmljZV9uaWMgKi8KCQkJCQlzdGF0ICY9IChoY2ZfMTYpfkhSRUdfRVZfUlg7ICAgIC8vZG9uJ3QgYWNrIFJ4IGlmIHByb2Nlc3Npbmcgbm90IHlldCBjb21wbGV0ZWQKCQkJCX0KCQkJfQoJCS8vIGluIGNhc2Ugb2YgRE1BOiBzaWduYWwgYXZhaWxhYmlsaXR5IG9mIHJ4IGFuZC9vciB0eCBwYWNrZXRzIHRvIE1TRgoJCUlGX1VTRV9ETUEoIGlmYnAtPklGQl9EbWFQYWNrZXRzIHw9IHN0YXQgJiAoIEhSRUdfRVZfUkRNQUQgfCBIUkVHX0VWX1RETUFEICkgKTsKCQkvLyBybGF2IDogcGVuZGluZyBIUkVHX0VWX1JETUFEIG9yIEhSRUdfRVZfVERNQUQgZXZlbnRzIGdldCBhY2tub3dsZWRnZWQgaGVyZS4KCS8qNTQqLyAgc3RhdCAmPSAoaGNmXzE2KX4oIEhSRUdfRVZfU0xFRVBfUkVRIHwgSFJFR19FVl9DTUQgfCBIUkVHX0VWX0FDS19SRUdfUkVBRFkgfCBIUkVHX0VWX0FMTE9DIHwgSFJFR19FVl9GV19ETUEgKTsKLy9hIHBvc2l0aXZlIG1hc2sgd291bGQgYmUgZWFzaWVyIHRvIHVuZGVyc3RhbmQgLyo1NCovICBzdGF0ICY9IChoY2ZfMTYpfiggSFJFR19FVl9TTEVFUF9SRVEgfCBIUkVHX0VWX0NNRCB8IEhSRUdfRVZfQUNLX1JFR19SRUFEWSB8IEhSRUdfRVZfQUxMT0MgfCBIUkVHX0VWX0ZXX0RNQSApOwoJCUlGX1VTRV9ETUEoIHN0YXQgJj0gKGhjZl8xNil+SFJFR19FVl9SWCApOwoJCWlmICggc3RhdCApIHsKCQkJREFXQV9BQ0soIHN0YXQgKTsgICAvKkRBV0EqLwoJCX0KCX0KCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9TRVJWSUNFX05JQyApOwoJcmV0dXJuIHJjOwp9IC8vIGhjZl9zZXJ2aWNlX25pYwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqIEggQyBGICAgUyBVIFAgUCBPIFIgVCAgIFIgTyBVIFQgSSBOIEUgUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqLlNVQk1PRFVMRSAgICAgdm9pZCBjYWxjX21pYyggaGNmXzMyKiBwLCBoY2ZfMzIgbSApCiAqLlBVUlBPU0UgICAgICAgY2FsY3VsYXRlIE1JQyBvbiBhIHF1YWQgYnl0ZS4KICoKICouQVJHVU1FTlRTCiAqICAgcCAgICAgICAgICAgYWRkcmVzcyBvZiB0aGUgTUlDCiAqICAgbSAgICAgICAgICAgMzIgYml0IHZhbHVlIHRvIGJlIHByb2Nlc3NlZCBieSB0aGUgTUlDIGNhbGN1bGF0aW9uIGVuZ2luZQogKgogKi5SRVRVUk5TICAgICAgIE4uQS4KICoKICouREVTQ1JJUFRJT04KICogY2FsY19taWMgaXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBNSUMgYWxnb3JpdGhtLiBJdCBpcyBhIG1vbmtleS1zZWUgbW9ua2V5LWRvIGNvcHkgb2YKICogTWljaGFlbDo6YXBwZW5kQnl0ZSgpCiAqIG9mIEFwcGVuZGl4IEMgb2YgLi4uLi4uLi4uLgogKgogKgogKi5ESUFHUkFNCiAqCiAqLk5PVElDRQogKi5FTkRET0MgICAgICAgICAgICAgICAgRU5EIERPQ1VNRU5UQVRJT04KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV1BBCgojZGVmaW5lIFJPTDMyKCBBLCBuICkgKCAoKEEpIDw8IChuKSkgfCAoICgoQSk+PigzMi0obikpKSAgJiAoICgxVUwgPDwgKG4pKSAtIDEgKSApICkKI2RlZmluZSBST1IzMiggQSwgbiApIFJPTDMyKCAoQSksIDMyLShuKSApCgojZGVmaW5lIEwgICAqcAojZGVmaW5lIFIgICAqKHArMSkKCnZvaWQKY2FsY19taWMoIGhjZl8zMiogcCwgaGNmXzMyIG0gKQp7CiNpZiBIQ0ZfQklHX0VORElBTgoJbSA9IChtID4+IDE2KSB8IChtIDw8IDE2KTsKI2VuZGlmIC8vIEhDRl9CSUdfRU5ESUFOCglMIF49IG07CglSIF49IFJPTDMyKCBMLCAxNyApOwoJTCArPSBSOwoJUiBePSAoKEwgJiAweGZmMDBmZjAwKSA+PiA4KSB8ICgoTCAmIDB4MDBmZjAwZmYpIDw8IDgpOwoJTCArPSBSOwoJUiBePSBST0wzMiggTCwgMyApOwoJTCArPSBSOwoJUiBePSBST1IzMiggTCwgMiApOwoJTCArPSBSOwp9IC8vIGNhbGNfbWljCiN1bmRlZiBSCiN1bmRlZiBMCiNlbmRpZiAvLyBIQ0ZfVFlQRV9XUEEKCgoKI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XUEEKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKi5TVUJNT0RVTEUgICAgIHZvaWQgY2FsY19taWNfcnhfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBwLCBpbnQgbGVuICkKICouUFVSUE9TRSAgICAgICBjYWxjdWxhdGUgTUlDIG9uIGEgc2luZ2xlIGZyYWdtZW50LgogKgogKi5BUkdVTUVOVFMKICogICBpZmJwICAgICAgICBhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKICogICBidWZwICAgICAgICAoYnl0ZSkgYWRkcmVzcyBvZiBidWZmZXIKICogICBsZW4gICAgICAgICBsZW5ndGggaW4gYnl0ZXMgb2YgYnVmZmVyIHNwZWNpZmllZCBieSBidWZwCiAqCiAqLlJFVFVSTlMgICAgICAgTi5BLgogKgogKi5ERVNDUklQVElPTgogKiBjYWxjX21pY19yeF9mcmFnIC4uLi4uLi4uCiAqCiAqIFRoZSBNSUMgaXMgbG9jYXRlZCBpbiB0aGUgSUZCLgogKiBUaGUgTUlDIGlzIHNlcGFyYXRlIGZvciBUeCBhbmQgUngsIHRodXMgYWxsb3dpbmcgaGNmX3NlbmRfbXNnIHRvIG9jY3VyIGJldHdlZW4gaGNmX3NlcnZpY2VfbmljIGFuZAogKiBoY2ZfcmN2X21zZy4KICoKICoKICouRElBR1JBTQogKgogKi5OT1RJQ0UKICouRU5ERE9DICAgICAgICAgICAgICAgIEVORCBET0NVTUVOVEFUSU9OCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQKY2FsY19taWNfcnhfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBwLCBpbnQgbGVuICkKewoJc3RhdGljIHVuaW9uIHsgaGNmXzMyIHgzMjsgaGNmXzE2IHgxNlsyXTsgaGNmXzggeDhbNF07IH0geDsgLy8qIGFyZWEgdG8gYWNjdW11bGF0ZSA0IGJ5dGVzIGlucHV0IGZvciBNSUMgZW5naW5lCglpbnQgaTsKCglpZiAoIGxlbiA9PSAtMSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2luaXRpYWxpemUgTUlDIGhvdXNla2VlcGluZwoJCWkgPSAqKHdjaV9yZWNvcmRwKSZwW0hGU19TVEFUXTsKCQkvKiBpID0gQ05WX1NIT1JUUF9UT19MSVRUTEUoJnBbSEZTX1NUQVRdKTsgc2hvdWxkIG5vdCBiZSBuZWVkZSB0byBwcmV2ZW50IGFsaWdubWVudCBwb3JvYmxlbXMKCQkgKiBzaW5jZSBsZW4gPT0gLTEgaWYgYW5kIG9ubHkgaWYgcCBpcyBsb29rYWhhZWFkIGJ1ZmZlciB3aGljaCBNVVNUIGJlIHdvcmQgYWxpZ25lZAoJCSAqIHRvIGJlIHJlLWludmVzdGlnYXRlZCBieSBOdlIKCQkgKi8KCgkJaWYgKCAoIGkgJiBIRlNfU1RBVF9NSUMgKSA9PSAwICkgewoJCQlpZmJwLT5JRkJfTUlDUnhDYXJyeSA9IDB4RkZGRjsgICAgICAgICAgLy9zdXBwcmVzcyBNSUMgY2FsY3VsYXRpb24KCQl9IGVsc2UgewoJCQlpZmJwLT5JRkJfTUlDUnhDYXJyeSA9IDA7Ci8vKiBOb3RlIHRoYXQgImNvaW5jaWRlbnRhbGx5IiB0aGUgYml0IHBvc2l0aW9ucyB1c2VkIGluIEhGU19TVEFUCi8vKiBjb3JyZXNwb25kIHdpdGggdGhlIG9mZnNldCBvZiB0aGUga2V5IGluIElGQl9NSUNLZXkKCQkJaSA9ICggaSAmIEhGU19TVEFUX01JQ19LRVlfSUQgKSA+PiAxMDsgIC8qIGNvaW5jaWRlbnRhbGx5IG5vIHNoaWZ0IG5lZWRlZCBmb3IgaSBpdHNlbGYgKi8KCQkJaWZicC0+SUZCX01JQ1J4WzBdID0gQ05WX0xPTkdfVE9fTElUVExFKGlmYnAtPklGQl9NSUNSeEtleVtpICBdKTsKCQkJaWZicC0+SUZCX01JQ1J4WzFdID0gQ05WX0xPTkdfVE9fTElUVExFKGlmYnAtPklGQl9NSUNSeEtleVtpKzFdKTsKCQl9Cgl9IGVsc2UgewoJCWlmICggaWZicC0+SUZCX01JQ1J4Q2FycnkgPT0gMCApIHsKCQkJeC54MzIgPSBDTlZfTE9OR1BfVE9fTElUVExFKHApOwoJCQlwICs9IDQ7CgkJCWlmICggbGVuIDwgNCApIHsKCQkJCWlmYnAtPklGQl9NSUNSeENhcnJ5ID0gKGhjZl8xNilsZW47CgkJCX0gZWxzZSB7CgkJCQlpZmJwLT5JRkJfTUlDUnhDYXJyeSA9IDQ7CgkJCQlsZW4gLT0gNDsKCQkJfQoJCX0gZWxzZSB3aGlsZSAoIGlmYnAtPklGQl9NSUNSeENhcnJ5IDwgNCAmJiBsZW4gKSB7ICAgICAgLy9ub3RlIGZvciBoY2ZfMTYgYXBwbGllczogMHhGRkZGID4gNAoJCQkJeC54OFtpZmJwLT5JRkJfTUlDUnhDYXJyeSsrXSA9ICpwKys7CgkJCQlsZW4tLTsKCQkJfQoJCXdoaWxlICggaWZicC0+SUZCX01JQ1J4Q2FycnkgPT0gNCApIHsgICAvL2NvbnRyaXZlZCBzbyB3ZSBoYXZlIG9ubHkgMSBjYWxsIHRvIGNhbGNfbWljIHNvIHdlIGNvdWxkIGJyaW5nIGl0IGluLWxpbmUKCQkJY2FsY19taWMoIGlmYnAtPklGQl9NSUNSeCwgeC54MzIgKTsKCQkJeC54MzIgPSBDTlZfTE9OR1BfVE9fTElUVExFKHApOwoJCQlwICs9IDQ7CgkJCWlmICggbGVuIDwgNCApIHsKCQkJCWlmYnAtPklGQl9NSUNSeENhcnJ5ID0gKGhjZl8xNilsZW47CgkJCX0KCQkJbGVuIC09IDQ7CgkJfQoJfQp9IC8vIGNhbGNfbWljX3J4X2ZyYWcKI2VuZGlmIC8vIEhDRl9UWVBFX1dQQQoKCiNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV1BBCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICouU1VCTU9EVUxFICAgICB2b2lkIGNhbGNfbWljX3R4X2ZyYWcoIElGQlAgaWZicCwgd2NpX2J1ZnAgcCwgaW50IGxlbiApCiAqLlBVUlBPU0UgICAgICAgY2FsY3VsYXRlIE1JQyBvbiBhIHNpbmdsZSBmcmFnbWVudC4KICoKICouQVJHVU1FTlRTCiAqICAgaWZicCAgICAgICAgYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCiAqICAgYnVmcCAgICAgICAgKGJ5dGUpIGFkZHJlc3Mgb2YgYnVmZmVyCiAqICAgbGVuICAgICAgICAgbGVuZ3RoIGluIGJ5dGVzIG9mIGJ1ZmZlciBzcGVjaWZpZWQgYnkgYnVmcAogKgogKi5SRVRVUk5TICAgICAgIE4uQS4KICoKICouREVTQ1JJUFRJT04KICogY2FsY19taWNfdHhfZnJhZyAuLi4uLi4uLgogKgogKiBUaGUgTUlDIGlzIGxvY2F0ZWQgaW4gdGhlIElGQi4KICogVGhlIE1JQyBpcyBzZXBhcmF0ZSBmb3IgVHggYW5kIFJ4LCB0aHVzIGFsbG93aW5nIGhjZl9zZW5kX21zZyB0byBvY2N1ciBiZXR3ZWVuIGhjZl9zZXJ2aWNlX25pYyBhbmQKICogaGNmX3Jjdl9tc2cuCiAqCiAqCiAqLkRJQUdSQU0KICoKICouTk9USUNFCiAqLkVORERPQyAgICAgICAgICAgICAgICBFTkQgRE9DVU1FTlRBVElPTgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkCmNhbGNfbWljX3R4X2ZyYWcoIElGQlAgaWZicCwgd2NpX2J1ZnAgcCwgaW50IGxlbiApCnsKCXN0YXRpYyB1bmlvbiB7IGhjZl8zMiB4MzI7IGhjZl8xNiB4MTZbMl07IGhjZl84IHg4WzRdOyB9IHg7IC8vKiBhcmVhIHRvIGFjY3VtdWxhdGUgNCBieXRlcyBpbnB1dCBmb3IgTUlDIGVuZ2luZQoKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lmIGluaXRpYWxpemF0aW9uIHJlcXVlc3QKCWlmICggbGVuID09IC0xICkgewoJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8uICBwcmVzdW1lIE1JQyBjYWxjdWxhdGlvbiBkaXNhYmxlZAoJCWlmYnAtPklGQl9NSUNUeENhcnJ5ID0gMHhGRkZGOwoJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8uICBpZiBNSUMgY2FsY3VsYXRpb24gZW5hYmxlZAoJCWlmICggaWZicC0+SUZCX01JQ1R4Q250bCApIHsKCQkJICAgICAgICAgICAgICAgICAgICAgICAgLy8uICAuICBjbGVhciBNSUMgY2FycnkKCQkJaWZicC0+SUZCX01JQ1R4Q2FycnkgPSAwOwoJCQkgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIC4gIGluaXRpYWxpemUgTUlDLWVuZ2luZQoJCQlpZmJwLT5JRkJfTUlDVHhbMF0gPSBDTlZfTE9OR19UT19MSVRUTEUoaWZicC0+SUZCX01JQ1R4S2V5WzBdKTsgLypUeCBhbHdheXMgdXNlcyBLZXkgMCAqLwoJCQlpZmJwLT5JRkJfTUlDVHhbMV0gPSBDTlZfTE9OR19UT19MSVRUTEUoaWZicC0+SUZCX01JQ1R4S2V5WzFdKTsKCQl9CgkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2Vsc2UKCX0gZWxzZSB7CgkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIGlmIE1JQyBlbmFibGVkIChUeCkgLyBpZiBNSUMgcHJlc2VudCAoUngpCgkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIGFuZCBubyBjYXJyeSBmcm9tIHByZXZpb3VzIGNhbGNfbWljX2ZyYWcKCQlpZiAoIGlmYnAtPklGQl9NSUNUeENhcnJ5ID09IDAgKSB7CgkJCSAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgLiAgcHJlc2V0IGFjY3Ugd2l0aCA0IGJ5dGVzIGZyb20gYnVmZmVyCgkJCXgueDMyID0gQ05WX0xPTkdQX1RPX0xJVFRMRShwKTsKCQkJICAgICAgICAgICAgICAgICAgICAgICAgLy8uICAuICBhZGp1c3QgcG9pbnRlciBhY2NvcmRpbmdseQoJCQlwICs9IDQ7CgkJCSAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgLiAgaWYgYnVmZmVyIGNvbnRhaW5lZCBsZXNzIHRoZW4gNCBieXRlcwoJCQlpZiAoIGxlbiA8IDQgKSB7CgkJCQkgICAgICAgICAgICAgICAgLy8uICAuICAuICBwcm9tb3RlIHZhbGlkIGJ5dGVzIGluIGFjY3UgdG8gY2FycnkKCQkJCSAgICAgICAgICAgICAgICAvLy4gIC4gIC4gIGZsYWcgYWNjdSB0byBjb250YWluIGluY29tcGxldGUgZG91YmxlIHdvcmQKCQkJCWlmYnAtPklGQl9NSUNUeENhcnJ5ID0gKGhjZl8xNilsZW47CgkJCQkgICAgICAgICAgICAgICAgLy8uICAuICBlbHNlCgkJCX0gZWxzZSB7CgkJCQkgICAgICAgICAgICAgICAgLy8uICAuICAuICBmbGFnIGFjY3UgdG8gY29udGFpbiBjb21wbGV0ZSBkb3VibGUgd29yZAoJCQkJaWZicC0+SUZCX01JQ1R4Q2FycnkgPSA0OwoJCQkJICAgICAgICAgICAgICAgIC8vLiAgLiAgYWRqdXN0IHJlbWFpbmluZyBidWZmZXIgbGVuZ3RoCgkJCQlsZW4gLT0gNDsKCQkJfQoJCQkgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIGVsc2UgaWYgTUlDIGVuYWJsZWQKCQkJICAgICAgICAgICAgICAgICAgICAgICAgLy8uICBhbmQgaWYgY2FycnkgYnl0ZXMgZnJvbSBwcmV2aW91cyBjYWxjX21pY190eF9mcmFnCgkJCSAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgLiAgbW92ZSAoMS0zKSBieXRlcyBmcm9tIGNhcnJ5IGludG8gYWNjdQoJCX0gZWxzZSB3aGlsZSAoIGlmYnAtPklGQl9NSUNUeENhcnJ5IDwgNCAmJiBsZW4gKSB7ICAgICAgLyogbm90ZSBmb3IgaGNmXzE2IGFwcGxpZXM6IDB4RkZGRiA+IDQgKi8KCQkJCXgueDhbaWZicC0+SUZCX01JQ1R4Q2FycnkrK10gPSAqcCsrOwoJCQkJbGVuLS07CgkJCX0KCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgd2hpbGUgYWNjdSBjb250YWlucyBjb21wbGV0ZSBkb3VibGUgd29yZAoJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8uICBhbmQgTUlDIGVuYWJsZWQKCQl3aGlsZSAoIGlmYnAtPklGQl9NSUNUeENhcnJ5ID09IDQgKSB7CgkJCSAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgLiAgcGFzcyBhY2N1IHRvIE1JQyBlbmdpbmUKCQkJY2FsY19taWMoIGlmYnAtPklGQl9NSUNUeCwgeC54MzIgKTsKCQkJICAgICAgICAgICAgICAgICAgICAgICAgLy8uICAuICBjb3B5IG5leHQgNCBieXRlcyBmcm9tIGJ1ZmZlciB0byBhY2N1CgkJCXgueDMyID0gQ05WX0xPTkdQX1RPX0xJVFRMRShwKTsKCQkJICAgICAgICAgICAgICAgICAgICAgICAgLy8uICAuICBhZGp1c3QgYnVmZmVyIHBvaW50ZXIKCQkJcCArPSA0OwoJCQkgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIC4gIGlmIGJ1ZmZlciBjb250YWluZWQgbGVzcyB0aGVuIDQgYnl0ZXMKCQkJICAgICAgICAgICAgICAgICAgICAgICAgLy8uICAuICAuICBwcm9tb3RlIHZhbGlkIGJ5dGVzIGluIGFjY3UgdG8gY2FycnkKCQkJICAgICAgICAgICAgICAgICAgICAgICAgLy8uICAuICAuICBmbGFnIGFjY3UgdG8gY29udGFpbiBpbmNvbXBsZXRlIGRvdWJsZSB3b3JkCgkJCWlmICggbGVuIDwgNCApIHsKCQkJCWlmYnAtPklGQl9NSUNUeENhcnJ5ID0gKGhjZl8xNilsZW47CgkJCX0KCQkJICAgICAgICAgICAgICAgICAgICAgICAgLy8uICAuICBhZGp1c3QgcmVtYWluaW5nIGJ1ZmZlciBsZW5ndGgKCQkJbGVuIC09IDQ7CgkJfQoJfQp9IC8vIGNhbGNfbWljX3R4X2ZyYWcKI2VuZGlmIC8vIEhDRl9UWVBFX1dQQQoKCiNpZiBIQ0ZfUFJPVF9USU1FCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICouU1VCTU9EVUxFICAgICB2b2lkIGNhbGlicmF0ZSggSUZCUCBpZmJwICkKICouUFVSUE9TRSAgICAgICBjYWxpYnJhdGVzIHRoZSBTL1cgcHJvdGVjdGlvbiBjb3VudGVyIGFnYWluc3QgdGhlIEhlcm1lcyBUaW1lciB0aWNrLgogKgogKi5BUkdVTUVOVFMKICogICBpZmJwICAgICAgICBhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKICoKICouUkVUVVJOUyAgICAgICBOLkEuCiAqCiAqLkRFU0NSSVBUSU9OCiAqIGNhbGlicmF0ZXMgdGhlIFMvVyBwcm90ZWN0aW9uIGNvdW50ZXIgYWdhaW5zdCB0aGUgSGVybWVzIFRpbWVyIHRpY2sKICogSUZCX1RpY2tJbmkgaXMgdGhlIHZhbHVlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgUy9XIHByb3RlY3Rpb24gY291bnRlciBzdWNoIHRoYXQgdGhlIGV4cGlyYXRpb24gcGVyaW9kCiAqIG1vcmUgb3IgbGVzcyBpbmRlcGVuZGVudCBvZiB0aGUgcHJvY2Vzc29yIHNwZWVkLiBJZiBJRkJfVGlja0luaSBpcyBub3QgeWV0IGNhbGlicmF0ZWQsIGl0IGlzIGRvbmUgbm93LgogKiBUaGlzIGNhbGlicmF0aW9uIGlzICJyZWFzb25hYmx5IiBhY2N1cmF0ZSBiZWNhdXNlIHRoZSBIZXJtZXMgaXMgaW4gYSBxdWlldCBzdGF0ZSBhcyBhIHJlc3VsdCBvZiB0aGUKICogSW5pdGlhbGl6ZSBjb21tYW5kLgogKgogKgogKi5ESUFHUkFNCiAqCiAqMTogSUZCX1RpY2tJbmkgaXMgaW5pdGlhbGl6ZWQgYXQgSU5JX1RJQ0tfSU5JIGJ5IGhjZl9jb25uZWN0LiBJZiBjYWxpYnJhdGUgc3VjY2VlZHMsIElGQl9UaWNrSW5pIGlzCiAqICAgZ3VhcmFudGVlZCB0byBiZSBjaGFuZ2VkLiBBcyBhIGNvbnNlcXVlbmNlIHRoZXJlIHdpbGwgYmUgb25seSAxIHNob3QgYXQgY2FsaWJyYXRpb24gKHJlZ2FyZGxlc3Mgb2YgdGhlCiAqICAgbnVtYmVyIG9mIGluaXQgY2FsbHMpIHVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzLgogKjI6IENhbGlicmF0aW9uIGlzIGRvbmUgSENGX1BST1RfVElNRV9DTlQgdGltZXMuIFRoaXMgZGltaW5pc2ggdGhlIGVmZmVjdHMgb2Ygaml0dGVyIGFuZCBpbnRlcmZlcmVuY2UsCiAqICAgZXNwZWNpYWxseSBpbiBhIHByZS1lbXB0aXZlIGVudmlyb25tZW50LiBIQ0ZfUFJPVF9USU1FX0NOVCBpcyBpbiB0aGUgcmFuZ2Ugb2YgMTYgdGhyb3VnaCAzMiBhbmQgZGVyaXZlZAogKiAgIGZyb20gdGhlIEhDRl9QUk9UX1RJTUUgc3BlY2lmaWVkIGJ5IHRoZSBNU0YgcHJvZ3JhbW1lci4gVGhlIGRpdmlzb3IgbmVlZGVkIHRvIHNjYWxlIEhDRl9QUk9UX1RJTUUgaW50byB0aGUKICogICAxNi0zMiByYW5nZSwgaXMgdXNlZCBhcyBhIG11bHRpcGxpY2F0b3IgYWZ0ZXIgdGhlIGNhbGlicmF0aW9uLCB0byBzY2FsZSB0aGUgZm91bmQgdmFsdWUgYmFjayB0byB0aGUKICogICByZXF1ZXN0ZWQgcmFuZ2UuIFRoaXMgd2F5IGEgY29tcHJvbWlzZSBpcyBhY2hpZXZlZCBiZXR3ZWVuIGFjY3VyYWN5IGFuZCBkdXJhdGlvbiBvZiB0aGUgY2FsaWJyYXRpb24KICogICBwcm9jZXNzLgogKjM6IEFja25vd2xlZGdlIHRoZSBUaW1lciBUaWNrIEV2ZW50LgogKiAgIEVhY2ggY3ljbGUgaXMgbGltaXRlZCB0byBhdCBtb3N0IElOSV9USUNLX0lOSSBzYW1wbGVzIG9mIHRoZSBUaW1lclRpY2sgc3RhdHVzIG9mIHRoZSBIZXJtZXMuCiAqICAgU2luY2UgdGhlIHN0YXJ0IG9mIGNhbGlicmF0ZSBpcyB1bnJlbGF0ZWQgdG8gdGhlIEhlcm1lcyBJbnRlcm5hbCBUaW1lciwgdGhlIGZpcnN0IGludGVydmFsIG1heSBsYXN0IGZyb20gMAogKiAgIHRvIHRoZSBub3JtYWwgaW50ZXJ2YWwsIGFsbCBzdWJzZXF1ZW50IGludGVydmFscyBzaG91bGQgYmUgdGhlIGZ1bGwgbGVuZ3RoIG9mIHRoZSBIZXJtZXMgVGljayBpbnRlcnZhbC4KICogICBUaGUgSGVybWVzIFRpbWVyIFRpY2sgaXMgbm90IHJlcHJvZ3JhbW1lZCBieSB0aGUgSENGLCBoZW5jZSBpdCBpcyBydW5uaW5nIGF0IHRoZSBkZWZhdWx0IG9mIDEwIGsKICogICBtaWNyb3NlY29uZHMuCiAqNDogSWYgdGhlIFRpbWVyIFRpY2sgRXZlbnQgaXMgY29udGludW91c2x5IHVwIChwcm90X2NudCBzdGlsbCBoYXMgdGhlIHZhbHVlIElOSV9USUNLX0lOSSkgb3Igbm8gVGltZXIgVGljawogKiAgIEV2ZW50IG9jY3VycmVkIGJlZm9yZSB0aGUgcHJvdGVjdGlvbiBjb3VudGVyIGV4cGlyZWQsIHJlc2V0IElGQl9UaWNrSW5pIHRvIElOSV9USUNLX0lOSSwKICogICBzZXQgdGhlIGRlZnVuY3QgYml0IG9mIElGQl9DYXJkU3RhdCAodGh1cyByZW5kZXJpbmcgdGhlIEhlcm1lcyBpbm9wZXJhYmxlKSBhbmQgZXhpdCB0aGUgY2FsaWJyYXRlIHJvdXRpbmUuCiAqODogaWZicC0+SUZCX1RpY2tJbmkgaXMgbXVsdGlwbGllZCB0byBzY2FsZSB0aGUgZm91bmQgdmFsdWUgYmFjayB0byB0aGUgcmVxdWVzdGVkIHJhbmdlIGFzIGV4cGxhaW5lZCB1bmRlciAyLgogKgogKi5OT1RJQ0UKICogbyBBbHRob3VnaCB0aGVyZSBhcmUgYSBudW1iZXIgb2Ygdmlld3BvaW50cyBwb3NzaWJsZSwgY2FsaWJyYXRlKCkgdXNlcyBhcyBlcnJvciBzdHJhdGVneSB0aGF0IGEgc2luZ2xlCiAqICAgZmFpbHVyZSBvZiB0aGUgSGVybWVzIFRpbWVyVGljayBpcyBjb25zaWRlcmVkIGZhdGFsLgogKiBvIFRoZXJlIGlzIG5vIGhhcmQgYW5kIGNvbmNyZXRlIHRpbWUtb3V0IHZhbHVlIGRlZmluZWQgZm9yIEhlcm1lcyBhY3Rpdml0aWVzLiBUaGUgZGVmYXVsdCAxIHNlY29uZHMgaXMKICogICBiZWxpZXZlZCB0byBiZSBzdWZmaWNpZW50bHkgInJlbGF4ZWQiIGZvciByZWFsIGxpZmUgYW5kIHRvIGJlIHN1ZmZpY2llbnRseSBzaG9ydCB0byBiZSBzdGlsbCB1c2VmdWwgaW4gYW4KICogICBlbnZpcm9ubWVudCB3aXRoIGh1bWFucy4KICogbyBOb3RlIHRoYXQgdmlhIElGQl9EZWZ1bmN0U3RhdCB0aW1lIG91dHMgaW4gY21kX3dhaXQgYW5kIGluIGhjZmlvX3N0cmluZyBibG9jayBhbGwgSGVybWVzIGFjY2VzcyB0aWxsIHRoZQogKiAgIG5leHQgaW5pdCBzbyBmdW5jdGlvbnMgd2hpY2ggY2FsbCBhIG1peCBvZiBjbWRfd2FpdCBhbmQgaGNmaW9fc3RyaW5nIG9ubHkgbmVlZCB0byBjaGVjayB0aGUgcmV0dXJuIHN0YXR1cwogKiAgIG9mIHRoZSBsYXN0IGNhbGwKICogbyBUaGUgcmV0dXJuIGNvZGUgaXMgcHJlc2V0IGF0IFRpbWUgb3V0LgogKiAgIFRoZSBhZGRpdGlvbmFsIGNvbXBsaWNhdGlvbiB0aGF0IG5vIGNhbGlicmF0ZWQgdmFsdWUgZm9yIHRoZSBwcm90ZWN0aW9uIGNvdW50IGNhbiBiZSBhc3N1bWVkIHNpbmNlCiAqICAgY2FsaWJyYXRlKCkgZG9lcyBub3QgeWV0IGhhdmUgZGV0ZXJtaW5lZCBhIGNhbGlicmF0ZWQgdmFsdWUgKGEgY2F0Y2ggMjIpLCBpcyBoYW5kbGVkIGJ5IHNldHRpbmcgdGhlCiAqICAgaW5pdGlhbCB2YWx1ZSBhdCBJTklfVElDS19JTkkgKGJ5IGhjZl9jb25uZWN0KS4gVGhpcyBhcHByb2FjaCBpcyBjb25zaWRlcmVkIHNhZmUsIGJlY2F1c2U6CiAqICAgICAtIHRoZSBIQ0YgZG9lcyBub3QgdXNlIHRoZSBwaXBlbGluZSBtZWNoYW5pc20gb2YgSGVybWVzIGNvbW1hbmRzLgogKiAgICAgLSB0aGUgbGlrZWxpaG9vZCBvZiBmYWlsdXJlICh0aGUgb25seSB0aW1lIHdoZW4gcHJvdGVjdGlvbiBjb3VudCBpcyByZWxldmFudCkgaXMgc21hbGwuCiAqICAgICAtIHRoZSB0aW1lIHdpbGwgYmUgc3VmZmljaWVudGx5IGxhcmdlIG9uIGEgZmFzdCBtYWNoaW5lIChidXN5IGJpdCBkcm9wcyBvbiBnb29kIE5JQyBiZWZvcmUgY291bnRlcgogKiAgICAgICBleHBpcmVzKQogKiAgICAgLSB0aGUgdGltZSB3aWxsIGJlIHN1ZmZpY2llbnRseSBzbWFsbCBvbiBhIHNsb3cgbWFjaGluZSAoY291bnRlciBleHBpcmVzIG9uIGJhZCBOSUMgYmVmb3JlIHRoZSBlbmQgdXNlcgogKiAgICAgICBzd2l0Y2hlcyB0aGUgcG93ZXIgb2ZmIGluIGRlc3BhaXIKICogICBUaGUgdGltZSBuZWVkZWQgdG8gd3JhcCBhIDMyIGJpdCBjb3VudGVyIGFyb3VuZCBpcyBsb25nZXIgdGhhbiBtYW55IGh1bWFucyB3YW50IHRvIHdhaXQsIGhlbmNlIHRoZSBtb3JlIG9yCiAqICAgbGVzcyBhcmJpdHJhcnkgdmFsdWUgb2YgMHg0MDAwMEwgaXMgY2hvc2VuLCBhc3N1bWluZyBpdCBkb2VzIG5vdCB0YWtlIHRvbyBsb25nIG9uIGFuIFhUIGFuZCBpcyBub3QgdG9vCiAqICAgc2hvcnQgb24gYSBzY3JlYW0tbWFjaGluZS4KICoKICouRU5ERE9DICAgICAgICAgICAgICAgIEVORCBET0NVTUVOVEFUSU9OCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkhDRl9TVEFUSUMgdm9pZApjYWxpYnJhdGUoIElGQlAgaWZicCApCnsKCWludCAgICAgY250ID0gSENGX1BST1RfVElNRV9DTlQ7CgloY2ZfMzIgIHByb3RfY250OwoKCUhDRlRSQUNFKCBpZmJwLCBIQ0ZfVFJBQ0VfQ0FMSUJSQVRFICk7CglpZiAoIGlmYnAtPklGQl9UaWNrSW5pID09IElOSV9USUNLX0lOSSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qMSovCgkJaWZicC0+SUZCX1RpY2tJbmkgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qMiovCgkJd2hpbGUgKCBjbnQtLSApIHsKCQkJcHJvdF9jbnQgPSBJTklfVElDS19JTkk7CgkJCU9QVyggSFJFR19FVl9BQ0ssIEhSRUdfRVZfVElDSyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyozKi8KCQkJd2hpbGUgKCAoSVBXKCBIUkVHX0VWX1NUQVQgKSAmIEhSRUdfRVZfVElDSykgPT0gMCAmJiAtLXByb3RfY250ICkgewoJCQkJaWZicC0+SUZCX1RpY2tJbmkrKzsKCQkJfQoJCQlpZiAoIHByb3RfY250ID09IDAgfHwgcHJvdF9jbnQgPT0gSU5JX1RJQ0tfSU5JICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qNCovCgkJCQlpZmJwLT5JRkJfVGlja0luaSA9IElOSV9USUNLX0lOSTsKCQkJCWlmYnAtPklGQl9EZWZ1bmN0U3RhdCA9IEhDRl9FUlJfREVGVU5DVF9USU1FUjsKCQkJCWlmYnAtPklGQl9DYXJkU3RhdCB8PSBDQVJEX1NUQVRfREVGVU5DVDsKCQkJCUhDRkFTU0VSVCggRE9fQVNTRVJULCBwcm90X2NudCApOwoJCQl9CgkJfQoJCWlmYnAtPklGQl9UaWNrSW5pIDw8PSBIQ0ZfUFJPVF9USU1FX1NIRlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjgqLwoJfQoJSENGVFJBQ0UoIGlmYnAsIEhDRl9UUkFDRV9DQUxJQlJBVEUgfCBIQ0ZfVFJBQ0VfRVhJVCApOwp9IC8vIGNhbGlicmF0ZQojZW5kaWYgLy8gSENGX1BST1RfVElNRQoKCiNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV1BBCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICouU1VCTU9EVUxFICAgICBpbnQgY2hlY2tfbWljKCBJRkJQIGlmYnAgKQogKi5QVVJQT1NFICAgICAgIHZlcmlmaWVzIHRoZSBNSUMgb2YgYSByZWNlaXZlZCBub24tVVNCIGZyYW1lLgogKgogKi5BUkdVTUVOVFMKICogICBpZmJwICAgICAgICBhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKICoKICouUkVUVVJOUwogKiAgIEhDRl9TVUNDRVNTCiAqICAgSENGX0VSUl9NSUMKICoKICouREVTQ1JJUFRJT04KICoKICoKICouRElBR1JBTQogKgogKjQ6IHRlc3Qgd2hldGhlciBvciBub3QgYSBNSUMgaXMgcmVwb3J0ZWQgYnkgdGhlIEhlcm1lcwogKjE0OiB0aGUgY2FsY3VsYXRlZCBNSUMgYW5kIHRoZSByZWNlaXZlZCBNSUMgYXJlIGNvbXBhcmVkLCB0aGUgcmV0dXJuIHN0YXR1cyBpcyBzZXQgd2hlbiB0aGVyZSBpcyBhIG1pc21hdGNoCiAqCiAqLk5PVElDRQogKi5FTkRET0MgICAgICAgICAgICAgICAgRU5EIERPQ1VNRU5UQVRJT04KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50CmNoZWNrX21pYyggSUZCUCBpZmJwICkKewoJaW50ICAgICByYyA9IEhDRl9TVUNDRVNTOwoJaGNmXzMyIHgzMlsyXTsgICAgICAgICAgICAgIC8vKiBhcmVhIHRvIHNhdmUgcmN2ZCA4IGJ5dGVzIE1JQwoKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lmIE1JQyBwcmVzZW50IGluIFJ4RlMKCWlmICggKih3Y2lfcmVjb3JkcCkmaWZicC0+SUZCX2xhcFstSEZTX0FERFJfREVTVF0gJiBIRlNfU1RBVF9NSUMgKSB7CgkJLy9vciBpZiAoIGlmYnAtPklGQl9NSUNSeENhcnJ5ICE9IDB4RkZGRiApCgkJQ0FMQ19SWF9NSUMoIG1pY19wYWQsIDggKTsgICAgICAgICAgICAgICAgICAvLy4gIHByb2Nlc3MgdXAgdG8gMyByZW1haW5pbmcgYnl0ZXMgb2YgZGF0YSBhbmQgYXBwZW5kIDUgdG8gOCBieXRlcyBvZiBwYWRkaW5nIHRvIE1JQyBjYWxjdWxhdGlvbgoJCWdldF9mcmFnKCBpZmJwLCAod2NpX2J1ZnApeDMyLCA4IEJFX1BBUigwKSk7Ly8uICBnZXQgOCBieXRlIE1JQyBmcm9tIE5JQwoJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8uICBpZiBjYWxjdWxhdGVkIGFuZCByZWNlaXZlZCBNSUMgZG8gbm90IG1hdGNoCgkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIC4gIHNldCBzdGF0dXMgYXQgSENGX0VSUl9NSUMKCS8qMTQqLyAgaWYgKCB4MzJbMF0gIT0gQ05WX0xJVFRMRV9UT19MT05HKGlmYnAtPklGQl9NSUNSeFswXSkgfHwKCQkgICAgIHgzMlsxXSAhPSBDTlZfTElUVExFX1RPX0xPTkcoaWZicC0+SUZCX01JQ1J4WzFdKSAgICAgKSB7CgkJCXJjID0gSENGX0VSUl9NSUM7CgkJfQoJfQoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuIHN0YXR1cwoJcmV0dXJuIHJjOwp9IC8vIGNoZWNrX21pYwojZW5kaWYgLy8gSENGX1RZUEVfV1BBCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKi5TVUJNT0RVTEUgICAgIGludCBjbWRfY21wbCggSUZCUCBpZmJwICkKICouUFVSUE9TRSAgICAgICB3YWl0cyBmb3IgSGVybWVzIENvbW1hbmQgQ29tcGxldGlvbi4KICoKICouQVJHVU1FTlRTCiAqICAgaWZicCAgICAgICAgYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCiAqCiAqLlJFVFVSTlMKICogICBJRkJfRGVmdW5jdFN0YXQKICogICBIQ0ZfRVJSX1RJTUVfT1VUCiAqICAgSENGX0VSUl9ERUZVTkNUX0NNRF9TRVEKICogICBIQ0ZfU1VDQ0VTUwogKgogKi5ERVNDUklQVElPTgogKgogKgogKi5ESUFHUkFNCiAqCiAqMjogT25jZSBjbWRfY21wbCBpcyBjYWxsZWQsIHRoZSBCdXN5IG9wdGlvbiBiaXQgaW4gSUZCX0NtZCBtdXN0IGJlIGNsZWFyZWQKICo0OiBJZiBTdGF0dXMgcmVnaXN0ZXIgYW5kIGNvbW1hbmQgY29kZSBkb24ndCBtYXRjaCBlaXRoZXI6CiAqICAgIC0gdGhlIEhlcm1lcyBhbmQgSG9zdCBhcmUgb3V0IG9mIHN5bmMgKCBhIGZhdGFsIGVycm9yKQogKiAgICAtIGVycm9yIGJpdHMgYXJlIHJlcG9ydGVkIHZpYSB0aGUgU3RhdHVzIFJlZ2lzdGVyLgogKiAgIE91dCBvZiBzeW5jIGlzIGNvbnNpZGVyZWQgZmF0YWwgYW5kIGJyaW5ncyB0aGUgSENGIGluIERlZnVuY3QgbW9kZQogKiAgIEVycm9ycyByZXBvcnRlZCB2aWEgdGhlIFN0YXR1cyBSZWdpc3RlciBzaG91bGQgYmUgY2F1c2VkIGJ5IHNlcXVlbmNlIHZpb2xhdGlvbnMgaW4gSGVybWVzIGNvbW1hbmQKICogICBzZXF1ZW5jZXMgYW5kIGhlbmNlIHRoZXNlIGJ1Z3Mgc2hvdWxkIGhhdmUgYmVlbiBmb3VuZCBkdXJpbmcgZW5naW5lZXJpbmcgdGVzdGluZy4gU2luY2UgdGhlcmUgaXMgbm8KICogICBzdHJhdGVneSB0byBjb3BlIHdpdGggdGhpcyBwcm9ibGVtLCBpdCBtaWdodCBhcyB3ZWxsIGJlIGlnbm9yZWQgYXQgcnVuIHRpbWUuIE5vdGUgdGhhdCBmb3IgYW55IHBhcnRpY3VsYXIKICogICBzaXR1YXRpb24gd2hlcmUgYSBzdHJhdGVneSBpcyBmb3JtdWxhdGVkIHRvIGhhbmRsZSB0aGUgY29uc2VxdWVuY2VzIG9mIGEgcGFydGljdWxhciBidWcgY2F1c2luZyBhCiAqICAgcGFydGljdWxhciBFcnJvciBzaXR1YXRpb24gcmVwb3J0ZWQgdmlhIHRoZSBTdGF0dXMgUmVnaXN0ZXIsIHRoZSBidWcgc2hvdWxkIGJlIHJlbW92ZWQgcmF0aGVyIHRoYW4gYWRkaW5nCiAqICAgbG9naWMgdG8gY29wZSB3aXRoIHRoZSBjb25zZXF1ZW5jZXMgb2YgdGhlIGJ1Zy4KICogICBUaGVyZSBoYXZlIGJlZW4gSENGIHZlcnNpb25zIHdoZXJlIGFuIGVycm9yIHJlcG9ydCB2aWEgdGhlIFN0YXR1cyBSZWdpc3RlciBldmVuIGJyb3VnaHQgdGhlIEhDRiBpbiBkZWZ1bmN0CiAqICAgbW9kZSAoYWx0aG91Z2ggaXQgd2FzIG5vdCB5ZXQgbmFtZWQgbGlrZSB0aGF0IGF0IHRoYXQgdGltZSkuIFRoaXMgaXMgcGFydGljdWxhciB1bmRlc2lyYWJsZSBiZWhhdmlvciBmb3IgYQogKiAgIGdlbmVyYWwgbGlicmFyeS4KICogICBTaW1wbHkgcmVwb3J0aW5nIHRoZSBlcnJvciAoYXMgImludGVyZXN0aW5nIikgaXMgZGViYXRhYmxlLiBUaGVyZSBhbHNvIGhhdmUgYmVlbiBIQ0YgdmVyc2lvbnMgd2l0aCB0aGlzCiAqICAgc3RyYXRlZ3kgdXNpbmcgdGhlICJ2YWd1ZSIgSENGX0ZBSUxVUkUgY29kZS4KICogICBUaGUgZXJyb3IgaXMgcmVwb3J0ZWQgdmlhOgogKiAgICAtIE1pc2NFcnIgdGFsbHkgb2YgdGhlIEhDRiBUYWxseSBzZXQKICogICAgLSB0aGUgKGluZm9ybWF0aXZlKSBmaWVsZHMgSUZCX0VyckNtZCBhbmQgSUZCX0VyclF1YWxpZmllcgogKiAgICAtIHRoZSBhc3NlcnQgbWVjaGFuaXNtCiAqODogSGVyZSB0aGUgRGVmdW5jdCBjYXNlIGFuZCB0aGUgU3RhdHVzIGVycm9yIGFyZSBzZXBhcmF0ZWx5IHRyZWF0ZWQKICoKICoKICouRU5ERE9DICAgICAgICAgICAgICAgIEVORCBET0NVTUVOVEFUSU9OCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkhDRl9TVEFUSUMgaW50CmNtZF9jbXBsKCBJRkJQIGlmYnAgKQp7CgoJUFJPVF9DTlRfSU5JOwoJaW50ICAgICByYyA9IEhDRl9TVUNDRVNTOwoJaGNmXzE2ICBzdGF0OwoKCUhDRkxPR0VOVFJZKCBIQ0ZfVFJBQ0VfQ01EX0NQTCwgaWZicC0+SUZCX0NtZCApOwoJaWZicC0+SUZCX0NtZCAmPSB+SENNRF9CVVNZOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIgKi8KCUhDRl9XQUlUX1dISUxFKCAoSVBXKCBIUkVHX0VWX1NUQVQpICYgSFJFR19FVl9DTUQpID09IDAgKTsgICAgICAgICAgICAgICAgICAvKiA0ICovCglzdGF0ID0gSVBXKCBIUkVHX1NUQVQgKTsKI2lmIEhDRl9QUk9UX1RJTUUKCWlmICggcHJvdF9jbnQgPT0gMCApIHsKCQlJRl9UQUxMWSggaWZicC0+SUZCX0hDRl9UYWxsaWVzLk1pc2NFcnIrKyApOwoJCXJjID0gSENGX0VSUl9USU1FX09VVDsKCQlIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgaWZicC0+SUZCX0NtZCApOwoJfSBlbHNlCiNlbmRpZiAvLyBIQ0ZfUFJPVF9USU1FCgl7CgkJREFXQV9BQ0soIEhSRUdfRVZfQ01EICk7CgkvKjQqLyAgIGlmICggc3RhdCAhPSAoaWZicC0+SUZCX0NtZCAmIEhDTURfQ01EX0NPREUpICkgewoJCS8qOCovICAgaWYgKCAoIChzdGF0IF4gaWZicC0+SUZCX0NtZCApICYgSENNRF9DTURfQ09ERSkgIT0gMCApIHsKCQkJCXJjID0gaWZicC0+SUZCX0RlZnVuY3RTdGF0ID0gSENGX0VSUl9ERUZVTkNUX0NNRF9TRVE7CgkJCQlpZmJwLT5JRkJfQ2FyZFN0YXQgfD0gQ0FSRF9TVEFUX0RFRlVOQ1Q7CgkJCX0KCQkJSUZfVEFMTFkoIGlmYnAtPklGQl9IQ0ZfVGFsbGllcy5NaXNjRXJyKysgKTsKCQkJaWZicC0+SUZCX0VyckNtZCA9IHN0YXQ7CgkJCWlmYnAtPklGQl9FcnJRdWFsaWZpZXIgPSBJUFcoIEhSRUdfUkVTUF8wICk7CgkJCUhDRkFTU0VSVCggRE9fQVNTRVJULCBNRVJHRV8yKCBJUFcoIEhSRUdfUEFSQU1fMCApLCBpZmJwLT5JRkJfQ21kICkgKTsKCQkJSENGQVNTRVJUKCBET19BU1NFUlQsIE1FUkdFXzIoIGlmYnAtPklGQl9FcnJRdWFsaWZpZXIsIGlmYnAtPklGQl9FcnJDbWQgKSApOwoJCX0KCX0KCUhDRkFTU0VSVCggcmMgPT0gSENGX1NVQ0NFU1MsIHJjKTsKCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9DTURfQ1BMICk7CglyZXR1cm4gcmM7Cn0gLy8gY21kX2NtcGwKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqLlNVQk1PRFVMRSAgICAgaW50IGNtZF9leGUoIElGQlAgaWZicCwgaW50IGNtZF9jb2RlLCBpbnQgcGFyXzAgKQogKi5QVVJQT1NFICAgICAgIEV4ZWN1dGVzIHN5bmNocm9ub3VzIHBhcnQgb2YgSGVybWVzIENvbW1hbmQgYW5kIC0gb3B0aW9uYWxseSAtIHdhaXRzIGZvciBDb21tYW5kIENvbXBsZXRpb24uCiAqCiAqLkFSR1VNRU5UUwogKiAgIGlmYnAgICAgICAgIGFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawogKiAgIGNtZF9jb2RlCiAqICAgcGFyXzAKICoKICouUkVUVVJOUwogKiAgIElGQl9EZWZ1bmN0U3RhdAogKiAgIEhDRl9FUlJfREVGVU5DVF9DTURfU0VRCiAqICAgSENGX1NVQ0NFU1MKICogICBIQ0ZfRVJSX1RPX0JFX0FEREVEIDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8CiAqCiAqLkRFU0NSSVBUSU9OCiAqIEV4ZWN1dGVzIHN5bmNocm9ub3VzIEhlcm1lcyBDb21tYW5kIGFuZCB3YWl0cyBmb3IgQ29tbWFuZCBDb21wbGV0aW9uCiAqCiAqIFRoZSBnZW5lcmFsIEhDRiBzdHJhdGVneSBpcyB0byB3YWl0IGZvciBjb21tYW5kIGNvbXBsZXRpb24uIEFzIGEgY29uc2VxdWVuY2U6CiAqIC0gdGhlIHJlYWQgb2YgdGhlIGJ1c3kgYml0IGJlZm9yZSB3cml0aW5nIHRoZSBjb21tYW5kIHJlZ2lzdGVyIGlzIHN1cGVyZmx1b3VzCiAqIC0gdGhlIEhlcm1lcyByZXF1aXJlbWVudCB0aGF0IG5vIElucXVpcnkgY29tbWFuZCBtYXkgYmUgZXhlY3V0ZWQgaWYgdGhlcmUgaXMgc3RpbGwgYW4gdW5hY2tub3dsZWRnZWQKICogICBJbnF1aXJ5IGNvbW1hbmQgb3V0c3RhbmRpbmcsIGlzIGF1dG9tYXRpY2FsbHkgbWV0LgogKiBUaGUgVHggY29tbWFuZCB1c2VzIHRoZSAiQnVzeSIgYml0IGluIHRoZSBjbWRfY29kZSBwYXJhbWV0ZXIgdG8gZGV2aWF0ZSBmcm9tIHRoaXMgZ2VuZXJhbCBIQ0Ygc3RyYXRlZ3kuCiAqIFRoZSBpZGVhIGlzIHRoYXQgYnkgbm90IGJ1c3ktd2FpdGluZyBvbiBjb21wbGV0aW9uIG9mIHRoaXMgZnJlcXVlbnRseSB1c2VkIGNvbW1hbmQgdGhlIHByb2Nlc3NvcgogKiB1dGlsaXphdGlvbiBpcyBkaW1pbmlzaGVkIHdoaWxlIHVzaW5nIHRoZSBidXN5LXdhaXQgb24gYWxsIG90aGVyIHNlbGRvbSB1c2VkIGNvbW1hbmRzIHRoZSBmbG93IGlzIGtlcHQKICogc2ltcGxlLgogKgogKgogKgogKi5ESUFHUkFNCiAqCiAqMTogc2tpcCB0aGUgYm9keSBvZiBjbWRfZXhlIHdoZW4gaW4gZGVmdW5jdCBtb2RlIG9yIHdoZW4gLSBiYXNlZCBvbiB0aGUgUy9XIFN1cHBvcnQgcmVnaXN0ZXIgd3JpdGUgYW5kCiAqICAgcmVhZCBiYWNrIHRlc3QgLSB0aGVyZSBpcyBhcHBhcmVudGx5IG5vIE5JQy4KICogICBOb3RlOiB3ZSBnYXZlIHVwIG9uIHRoZSAib2xkIiBzdHJhdGVneSB0byB3cml0ZSB0aGUgUy9XIFN1cHBvcnQgcmVnaXN0ZXIgYXQgbWFnaWMgb25seSB3aGVuIG5lZWRlZC4gRHVlIHRvCiAqICAgdGhlIGludHJpY2F0ZW5lc3Mgb2YgSGVybWVzIEYvVyB2YXJpZXRpZXMgKCB3aGljaCBiZWhhdmUgZGlmZmVyZW50bHkgYXMgZmFyIGFzIGNvcnJ1cHRpb24gb2YgdGhlIFMvVwogKiAgIFN1cHBvcnQgcmVnaXN0ZXIgaXMgaW52b2x2ZWQpLCB0aGUgaW5jcmVhc2luZyBudW1iZXIgb2YgSGVybWVzIGNvbW1hbmRzIHdoaWNoIGRvIGFuIGltcGxpY2l0IGluaXRpYWxpemUKICogICAodGh1cyBtb2RpZnlpbmcgdGhlIFMvVyBTdXBwb3J0IHJlZ2lzdGVyKSBhbmQgdGhlIHdvcmthcm91bmRzIG9mIHNvbWUgT1MvU3VwcG9ydCBTL1cgaW5kdWNlZCBhc3BlY3RzIChlLmcuCiAqICAgdGhlIFN5c3RlbSBTb2Z0IGxpYnJhcnkgYXQgV2luTlQgd2hpY2ggcG9zdHBvbmVzIHRoZSBhY3R1YWwgbWFwcGluZyBvZiBJL08gc3BhY2UgdXAgdG8gMzAgc2Vjb25kcyBhZnRlcgogKiAgIGdpdmluZyB0aGUgZ28tYWhlYWQpLCB0aGUgIm1hZ2ljIiBzdHJhdGVneSBpcyBub3cgcmVkdWNlZCB0byBhIHNpbXBsZSB3cml0ZSBhbmQgcmVhZCBiYWNrLiBUaGlzIG1lYW5zIHRoYXQKICogICBwcm9ibGVtcyBsaWtlIGEgYnVnIHRyYW1waW5nIG92ZXIgdGhlIG1lbW9yeSBtYXBwZWQgSGVybWVzIHJlZ2lzdGVycyB3aWxsIG5vIGxvbmdlciBiZSBub3RpY2VkIGFzIHNpZGUKICogICBlZmZlY3Qgb2YgdGhlIFMvVyBTdXBwb3J0IHJlZ2lzdGVyIGNoZWNrLgogKjI6IGNoZWNrIHdoZXRoZXIgdGhlIHByZWNlZGluZyBjb21tYW5kIHNraXBwZWQgdGhlIGJ1c3kgd2FpdCBhbmQgaWYgc28sIGNoZWNrIGZvciBjb21tYW5kIGNvbXBsZXRpb24KICoKICouTk9USUNFCiAqLkVORERPQyAgICAgICAgICAgICAgICBFTkQgRE9DVU1FTlRBVElPTgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKSENGX1NUQVRJQyBpbnQKY21kX2V4ZSggSUZCUCBpZmJwLCBoY2ZfMTYgY21kX2NvZGUsIGhjZl8xNiBwYXJfMCApIC8vaWYgSENNRF9CVVNZIG9mIGNtZF9jb2RlIHNldCwgdGhlbiBkbyBOT1Qgd2FpdCBmb3IgY29tcGxldGlvbgp7CglpbnQgcmM7CgoJSENGTE9HRU5UUlkoIEhDRl9UUkFDRV9DTURfRVhFLCBjbWRfY29kZSApOwoJSENGQVNTRVJUKCAoY21kX2NvZGUgJiBIQ01EX0NNRF9DT0RFKSAhPSBIQ01EX1RYIHx8IGNtZF9jb2RlICYgSENNRF9CVVNZLCBjbWRfY29kZSApOyAvL1R4IG11c3QgaGF2ZSBCdXN5IGJpdCBzZXQKCU9QVyggSFJFR19TV18wLCBIQ0ZfTUFHSUMgKTsKCWlmICggSVBXKCBIUkVHX1NXXzAgKSA9PSBIQ0ZfTUFHSUMgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMSAqLwoJCXJjID0gaWZicC0+SUZCX0RlZnVuY3RTdGF0OwoJfQoJZWxzZSByYyA9IEhDRl9FUlJfTk9fTklDOwoJaWYgKCByYyA9PSBIQ0ZfU1VDQ0VTUyApIHsKCQkvLzs/aXMgdGhpcyBhIGhvdCBpZGVhLCBiZXR0ZXIgTUVBU1VSRSBwZXJmb3JtYW5jZSBpbXBhY3QKCS8qMiovICAgaWYgKCBpZmJwLT5JRkJfQ21kICYgSENNRF9CVVNZICkgewoJCQlyYyA9IGNtZF9jbXBsKCBpZmJwICk7CgkJfQoJCU9QVyggSFJFR19QQVJBTV8wLCBwYXJfMCApOwoJCU9QVyggSFJFR19DTUQsIGNtZF9jb2RlICZ+SENNRF9CVVNZICk7CgkJaWZicC0+SUZCX0NtZCA9IGNtZF9jb2RlOwoJCWlmICggKGNtZF9jb2RlICYgSENNRF9CVVNZKSA9PSAwICkgeyAgICAvLzs/aXMgdGhpcyBhIGhvdCBpZGVhLCBiZXR0ZXIgTUVBU1VSRSBwZXJmb3JtYW5jZSBpbXBhY3QKCQkJcmMgPSBjbWRfY21wbCggaWZicCApOwoJCX0KCX0KCUhDRkFTU0VSVCggcmMgPT0gSENGX1NVQ0NFU1MsIE1FUkdFXzIoIHJjLCBjbWRfY29kZSApICk7CglIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfQ01EX0VYRSApOwoJcmV0dXJuIHJjOwp9IC8vIGNtZF9leGUKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqLlNVQk1PRFVMRSAgICAgaW50IGRvd25sb2FkKCBJRkJQIGlmYnAsIENGR19QUk9HX1NUUkNUIEZBUiAqbHR2cCApCiAqLlBVUlBPU0UgICAgICAgZG93bmxvYWRzIEYvVyBpbWFnZSBpbnRvIE5JQyBhbmQgaW5pdGlhdGVzIGV4ZWN1dGlvbiBvZiB0aGUgZG93bmxvYWRlZCBGL1cuCiAqCiAqLkFSR1VNRU5UUwogKiAgIGlmYnAgICAgICAgIGFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawogKiAgIGx0dnAgICAgICAgIHNwZWNpZmllcyB0aGUgcHNldWRvLVJJRCAoYXMgZGVmaW5lZCBieSBXQ0kpCiAqCiAqLlJFVFVSTlMKICoKICouREVTQ1JJUFRJT04KICoKICoKICouRElBR1JBTQogKjE6IEZpcnN0LCBBY2sgZXZlcnl0aGluZyB0byB1bmJsb2NrIGEgKHBvc3NpYmx5KSBibG9ja2VkIGNtZCBwaXBlIGxpbmUKICogICBOb3RlIDE6IGl0IGlzIHZlcnkgbGlrZWx5IHRoYXQgYW4gQWxsb2MgZXZlbnQgaXMgcGVuZGluZyBhbmQgdmVyeSB3ZWxsIHBvc3NpYmxlIHRoYXQgYSAoU2VuZCkgQ21kIGV2ZW50IGlzCiAqICAgcGVuZGluZwogKiAgIE5vdGUgMjogaXQgaXMgYXNzdW1lZCB0aGF0IHRoaXMgc3RyYXRlZ3kgdGFrZXMgYXdheSB0aGUgbmVlZCB0byBhY2sgZXZlcnkgY29uY2VpdmFibGUgZXZlbnQgYWZ0ZXIgYW4KICogICBIZXJtZXMgSW5pdGlhbGl6ZQogKgogKgogKi5FTkRET0MgICAgICAgICAgICAgICAgRU5EIERPQ1VNRU5UQVRJT04KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KSENGX1NUQVRJQyBpbnQKZG93bmxvYWQoIElGQlAgaWZicCwgQ0ZHX1BST0dfU1RSQ1QgRkFSICpsdHZwICkgICAgICAgICAgICAgICAgICAgICAvL0hlcm1lcy1JSSBkb3dubG9hZCAodm9sYXRpbGUgb25seSkKewoJaGNmXzE2ICAgICAgICAgICAgICBpOwoJaW50ICAgICAgICAgICAgICAgICByYyA9IEhDRl9TVUNDRVNTOwoJd2NpX2J1ZnAgICAgICAgICAgICBjcDsKCWhjZl9pbyAgICAgICAgICAgICAgaW9fcG9ydCA9IGlmYnAtPklGQl9JT0Jhc2UgKyBIUkVHX0FVWF9EQVRBOwoKCUhDRkxPR0VOVFJZKCBIQ0ZfVFJBQ0VfREwsIGx0dnAtPnR5cCApOwojaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1BSRUxPQURFRAoJSENGQVNTRVJUKCBET19BU1NFUlQsIGx0dnAtPm1vZGUgKTsKI2Vsc2UKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lmIGluaXRpYWwgInByb2dyYW0iIExUVgoJaWYgKCBpZmJwLT5JRkJfRExNb2RlID09IENGR19QUk9HX1NUT1AgJiYgbHR2cC0+bW9kZSA9PSBDRkdfUFJPR19WT0xBVElMRSkgewoJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8uICBzd2l0Y2ggSGVybWVzIHRvIGluaXRpYWwgbW9kZQoJLyoxKi8gICBPUFcoIEhSRUdfRVZfQUNLLCB+SFJFR19FVl9TTEVFUF9SRVEgKTsKCQlyYyA9IGNtZF9leGUoIGlmYnAsIEhDTURfSU5JLCAwICk7ICAvKiBIQ01EX0lOSSBjYW4gbm90IGJlIHBhcnQgb2YgaW5pdCgpIGJlY2F1c2UgdGhhdCBpcyBjYWxsZWQgb24KCQkJCQkJICAgICAqIG90aGVyIG9jY2FzaW9ucyBhcyB3ZWxsICovCgkJcmMgPSBpbml0KCBpZmJwICk7Cgl9CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiBmaW5hbCAicHJvZ3JhbSIgTFRWCglpZiAoIGx0dnAtPm1vZGUgPT0gQ0ZHX1BST0dfU1RPUCAmJiBpZmJwLT5JRkJfRExNb2RlID09IENGR19QUk9HX1ZPTEFUSUxFKSB7CgkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIHN0YXJ0IHRlcnRpYXJ5IChvciBzZWNvbmRhcnkpCgkJT1BXKCBIUkVHX1BBUkFNXzEsIChoY2ZfMTYpKGx0dnAtPm5pY19hZGRyID4+IDE2KSApOwoJCXJjID0gY21kX2V4ZSggaWZicCwgSENNRF9FWEVDVVRFLCAoaGNmXzE2KSBsdHZwLT5uaWNfYWRkciApOwoJCWlmIChyYyA9PSBIQ0ZfU1VDQ0VTUykgewoJCQlyYyA9IGluaXQoIGlmYnAgKTsgIC8qOz8gZG8gd2UgcmVhbGx5IHdhbnQgdG8gc2tpcCBpbml0IGlmIGNtZF9leGUgZmFpbGVkLCBpLmUuCgkJCQkJICAgICAqICAgSUZCX0ZXX0NvbXBfSWQgaXMgdGhhbiBwb3NzaWJseSBpbmNvcnJlY3QgKi8KCQl9CgkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2Vsc2UgKG5vbi1maW5hbCkKCX0gZWxzZSB7CgkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIGlmIG1vZGUgPT0gUmVhZGJhY2sgU0VFUFJPTQojaWYgMCAgIC8vOz8gYXMgbG9uZyBhcyB0aGUgbmV4dCBpZiBjb250YWlucyBhIGhhcmQgY29kZWQgMCwgbWlnaHQgYXMgd2VsbCBsZWF2ZSBpdCBvdXQgZXZlbiBtb3JlIG9idmlvdXMKCQlpZiAoIDAgLypsZW4gaXMgZGVmaW5pdGVseSBub3Qgd2FudCB3ZSB3YW50Oz8qLyAmJiBsdHZwLT5tb2RlID09IENGR19QUk9HX1NFRVBST01fUkVBREJBQ0sgKSB7CgkJCU9QVyggSFJFR19QQVJBTV8xLCAoaGNmXzE2KShsdHZwLT5uaWNfYWRkciA+PiAxNikgKTsKCQkJT1BXKCBIUkVHX1BBUkFNXzIsIChoY2ZfMTYpKChsdHZwLT5sZW4gLSA0KSA8PCAxKSApOwoJCQkgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIC4gIHBlcmZvcm0gSGVybWVzIHByb2cgY21kIHdpdGggYXBwcm9wcmlhdGUgbW9kZSBiaXRzCgkJCXJjID0gY21kX2V4ZSggaWZicCwgSENNRF9QUk9HUkFNIHwgbHR2cC0+bW9kZSwgKGhjZl8xNilsdHZwLT5uaWNfYWRkciApOwoJCQkgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIC4gIHNldCB1cCBOSUMgUkFNIGFkZHJlc3NhYmlsaXR5IGFjY29yZGluZyBSZXNwMC0xCgkJCU9QVyggSFJFR19BVVhfUEFHRSwgICBJUFcoIEhSRUdfUkVTUF8xKSApOwoJCQlPUFcoIEhSRUdfQVVYX09GRlNFVCwgSVBXKCBIUkVHX1JFU1BfMCkgKTsKCQkJICAgICAgICAgICAgICAgICAgICAgICAgLy8uICAuICBzZXQgdXAgTC1maWVsZCBvZiBMVFYgYWNjb3JkaW5nIFJlc3AyCgkJCWkgPSAoIElQVyggSFJFR19SRVNQXzIgKSArIDEgKSAvIDI7ICAvLyBpIGNvbnRhaW5zIG1heCBidWZmZXIgc2l6ZSBpbiB3b3JkcywgYSBwcm9iYWJseSBub3QgdmVyeSB1c2VmdWwgcGllY2Ugb2YgaW5mb3JtYXRpb24gOz8KLypOaWNvJ3MgY29kZSBiYXNlZCBvbiBpIGlzIHRoZSAicmVhbCBhbW91bnQgb2YgZGF0YSBhdmFpbGFibGUiCgkJCWlmICggbHR2cC0+bGVuIC0gNCA8IGkgKSByYyA9IEhDRl9FUlJfTEVOOwoJCQllbHNlIGx0dnAtPmxlbiA9IGkgKyA0OwoqLwovKiBSb2xhbmRzIGNvZGUgYmFzZWQgb24gdGhlIGlkZWEgdGhhdCBhIE1TRiBzaG91bGQgbm90IGFzayBmb3IgbW9yZSB0aGFuIGlzIGF2YWlsYWJsZQoJCQkvLyBjaGVjayBpZiBudW1iZXIgb2YgYnl0ZXMgcmVxdWVzdGVkIGV4Y2VlZHMgbWF4IGJ1ZmZlciBzaXplCgkJCWlmICggbHR2cC0+bGVuIC0gNCA+IGkgKSB7CgkJCQlyYyA9IEhDRl9FUlJfTEVOOwoJCQkJbHR2cC0+bGVuID0gaSArIDQ7CgkJCX0KKi8KCQkJICAgICAgICAgICAgICAgICAgICAgICAgLy8uICAuICBjb3B5IGRhdGEgZnJvbSBOSUMgdmlhIEFVWCBwb3J0IHRvIExUVgoJCQljcCA9ICh3Y2lfYnVmcClsdHZwLT5ob3N0X2FkZHI7ICAgICAgICAgICAgICAgICAgICAgLypJTl9QT1JUX1NUUklOR184XzE2IG1hY3JvIG1heSBtb2RpZnkgaXRzIHBhcmFtZXRlcnMqLwoJCQlpID0gbHR2cC0+bGVuIC0gNDsKCQkJSU5fUE9SVF9TVFJJTkdfOF8xNiggaW9fcG9ydCwgY3AsIGkgKTsgICAgICAvLyEhIVdPUkQgbGVuZ3RoLCBjcCBNVVNUIGJlIGEgY2hhciBwb2ludGVyIC8vICQkIGNoYXIKCQkJICAgICAgICAgICAgICAgICAgICAgICAgLy8uICBlbHNlIChub24tZmluYWwgcHJvZ3JhbW1pbmcpCgkJfSBlbHNlCiNlbmRpZiAvLzs/IGFzIGxvbmcgYXMgdGhlIGFib3ZlIGlmIGNvbnRhaW5zIGEgaGFyZCBjb2RlZCAwLCBtaWdodCBhcyB3ZWxsIGxlYXZlIGl0IG91dCBldmVuIG1vcmUgb2J2aW91cwoJCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8uICAuICBnZXQgbnVtYmVyIG9mIHdvcmRzIHRvIHByb2dyYW0KCQkJSENGQVNTRVJUKCBsdHZwLT5zZWdtZW50X3NpemUsICpsdHZwLT5ob3N0X2FkZHIgKTsKCQkJaSA9IGx0dnAtPnNlZ21lbnRfc2l6ZS8yOwoJCQkgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIC4gIGNvcHkgZGF0YSAod29yZHMpIGZyb20gTFRWIHZpYSBBVVggcG9ydCB0byBOSUMKCQkJY3AgPSAod2NpX2J1ZnApbHR2cC0+aG9zdF9hZGRyOyAgICAgICAgICAgICAgICAgICAgIC8vT1VUX1BPUlRfU1RSSU5HXzhfMTYgbWFjcm8gbWF5IG1vZGlmeSBpdHMgcGFyYW1ldGVycwoJCQkgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIC4gIGlmIG1vZGUgPT0gdm9sYXRpbGUgcHJvZ3JhbW1pbmcKCQkJaWYgKCBsdHZwLT5tb2RlID09IENGR19QUk9HX1ZPTEFUSUxFICkgewoJCQkJICAgICAgICAgICAgICAgIC8vLiAgLiAgLiAgc2V0IHVwIE5JQyBSQU0gYWRkcmVzc2FiaWxpdHkgdmlhIEFVWCBwb3J0CgkJCQlPUFcoIEhSRUdfQVVYX1BBR0UsIChoY2ZfMTYpKGx0dnAtPm5pY19hZGRyID4+IDE2IDw8IDkgfCAobHR2cC0+bmljX2FkZHIgJiAweEZGRkYpID4+IDcgKSApOwoJCQkJT1BXKCBIUkVHX0FVWF9PRkZTRVQsIChoY2ZfMTYpKGx0dnAtPm5pY19hZGRyICYgMHgwMDdFKSApOwoJCQkJT1VUX1BPUlRfU1RSSU5HXzhfMTYoIGlvX3BvcnQsIGNwLCBpICk7ICAgICAvLyEhIVdPUkQgbGVuZ3RoLCBjcCBNVVNUIGJlIGEgY2hhciBwb2ludGVyCgkJCX0KCQl9Cgl9CglpZmJwLT5JRkJfRExNb2RlID0gbHR2cC0+bW9kZTsgICAgICAgICAgICAgICAgICAvL3NhdmUgc3RhdGUgaW4gSUZCX0RMTW9kZQojZW5kaWYgLy8gSENGX1RZUEVfUFJFTE9BREVECglIQ0ZBU1NFUlQoIHJjID09IEhDRl9TVUNDRVNTLCByYyApOwoJSENGTE9HRVhJVCggSENGX1RSQUNFX0RMICk7CglyZXR1cm4gcmM7Cn0gLy8gZG93bmxvYWQKCgojaWYgKEhDRl9BU1NFUlQpICYgSENGX0FTU0VSVF9QUklOVEYKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIENlcnRhaW4gSGVybWVzLUlJIGZpcm13YXJlIHZlcnNpb25zIGNhbiBnZW5lcmF0ZQogKiBkZWJ1ZyBpbmZvcm1hdGlvbi4gVGhpcyBkZWJ1ZyBpbmZvcm1hdGlvbiBpcwogKiBjb250YWluZWQgaW4gYSBidWZmZXIgaW4gbmljLVJBTSwgYW5kIGNhbiBiZSByZWFkCiAqIHZpYSB0aGUgYXV4IHBvcnQuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KSENGX1NUQVRJQyBpbnQKZndfcHJpbnRmKElGQlAgaWZicCwgQ0ZHX0ZXX1BSSU5URl9TVFJDVCBGQVIgKmx0dnApCnsKCWludCByYyA9IEhDRl9TVUNDRVNTOwoJaGNmXzE2IGZ3X2NudDsKLy8JaGNmXzMyIERiTXNnQnVmZmVyID0gMHgyOUQyLCBEYk1zZ0NvdW50PSAweDAwMDAyOUQwOwovLwloY2ZfMTYgRGJNc2dTaXplPTB4MDAwMDAwODA7CgloY2ZfMzIgRGJNc2dCdWZmZXI7CglDRkdfRldfUFJJTlRGX0JVRkZFUl9MT0NBVElPTl9TVFJDVCAqcCA9ICZpZmJwLT5JRkJfRndQZkJ1ZmY7CglsdHZwLT5sZW4gPSAxOwoJaWYgKCBwLT5EYk1zZ1NpemUgIT0gMCApIHsKCQkvLyBmaXJzdCwgY2hlY2sgdGhlIGNvdW50ZXIgaW4gbmljLVJBTSBhbmQgY29tcGFyZSBpdCB0byB0aGUgbGF0ZXN0IGNvdW50ZXIgdmFsdWUgb2YgdGhlIEhDRgoJCU9QVyggSFJFR19BVVhfUEFHRSwgKGhjZl8xNikocC0+RGJNc2dDb3VudCA+PiA3KSApOwoJCU9QVyggSFJFR19BVVhfT0ZGU0VULCAoaGNmXzE2KShwLT5EYk1zZ0NvdW50ICYgMHg3RSkgKTsKCQlmd19jbnQgPSAoKElQVyggSFJFR19BVVhfREFUQSkgPj4xICkgJiAoKGhjZl8xNilwLT5EYk1zZ1NpemUgLSAxKSk7CgkJaWYgKCBmd19jbnQgIT0gaWZicC0+SUZCX0RiZ1ByaW50Rl9DbnQgKSB7Ci8vCQkJRGJnUHJpbnQoImZ3X2NudD0lZCBJRkJfRGJnUHJpbnRGX0NudD0lZFxuIiwgZndfY250LCBpZmJwLT5JRkJfRGJnUHJpbnRGX0NudCk7CgkJCURiTXNnQnVmZmVyID0gcC0+RGJNc2dCdWZmZXIgKyBpZmJwLT5JRkJfRGJnUHJpbnRGX0NudCAqIDY7IC8vIGVhY2ggZW50cnkgaXMgMyB3b3JkcwoJCQlPUFcoIEhSRUdfQVVYX1BBR0UsIChoY2ZfMTYpKERiTXNnQnVmZmVyID4+IDcpICk7CgkJCU9QVyggSFJFR19BVVhfT0ZGU0VULCAoaGNmXzE2KShEYk1zZ0J1ZmZlciAmIDB4N0UpICk7CgkJCWx0dnAtPm1zZ19pZCAgICAgPSBJUFcoSFJFR19BVVhfREFUQSk7CgkJCWx0dnAtPm1zZ19wYXIgICAgPSBJUFcoSFJFR19BVVhfREFUQSk7CgkJCWx0dnAtPm1zZ190c3RhbXAgPSBJUFcoSFJFR19BVVhfREFUQSk7CgkJCWx0dnAtPmxlbiA9IDQ7CgkJCWlmYnAtPklGQl9EYmdQcmludEZfQ250Kys7CgkJCWlmYnAtPklGQl9EYmdQcmludEZfQ250ICY9IChwLT5EYk1zZ1NpemUgLSAxKTsKCQl9Cgl9CglyZXR1cm4gcmM7Cn07CiNlbmRpZiAvLyBIQ0ZfQVNTRVJUX1BSSU5URgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICouU1VCTU9EVUxFICAgICBoY2ZfMTYgZ2V0X2ZpZCggSUZCUCBpZmJwICkKICouUFVSUE9TRSAgICAgICBnZXQgYWxsb2NhdGVkIEZJRCBmb3IgZWl0aGVyIHRyYW5zbWl0IG9yIG5vdGlmeS4KICoKICouQVJHVU1FTlRTCiAqICAgaWZicCAgICAgICAgYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCiAqCiAqLlJFVFVSTlMKICogICAwICAgbm8gRklEIGF2YWlsYWJsZQogKiAgIDw+MCBGSUQgbnVtYmVyCiAqCiAqLkRFU0NSSVBUSU9OCiAqCiAqCiAqLkRJQUdSQU0KICogICBUaGUgcHJlZmVyZW5jZSBpcyB0byB1c2UgYSAicGVuZGluZyIgYWxsb2MuIElmIG5vIGFsbG9jIGlzIHBlbmRpbmcsIHRoZW4gLSBpZiBhdmFpbGFibGUgLSB0aGUgInNwYXJlIiBGSUQKICogICBpcyB1c2VkLgogKiAgIElmIHRoZSBzcGFyZSBGSUQgaXMgdXNlZCwgSUZCX1JzY0luZCAocmVwcmVzZW50aW5nIHRoZSBzcGFyZSBGSUQpIG11c3QgYmUgY2xlYXJlZAogKiAgIElmIHRoZSBwZW5kaW5nIGFsbG9jIGlzIHVzZWQsIHRoZSBhbGxvYyBldmVudCBtdXN0IGJlIGFja25vd2xlZGdlZCB0byB0aGUgSGVybWVzLgogKiAgIEluIGNhc2UgdGhlIHNwYXJlIEZJRCB3YXMgZGVwbGV0ZWQgYW5kIHRoZSBJRkJfUnNjSW5kIGhhcyBiZWVuICJmYWtlZCIgYXMgcHNldWRvIHJlc291cmNlIHdpdGggYSAweDAwMDEKICogICB2YWx1ZSBieSBoY2Zfc2VydmljZV9uaWMsIElGQl9Sc2NJbmQgaGFzIHRvIGJlICJjb3JyZWN0ZWQiIGFnYWluIHRvIGl0cyAweDAwMDAgdmFsdWUuCiAqCiAqICAgTm90ZSB0aGF0IGR1ZSB0byB0aGUgSGVybWVzLUlJIEgvVyBwcm9ibGVtcyB3aGljaCBhcmUgaW50ZW5kZWQgdG8gYmUgd29ya2VkIGFyb3VuZCBieSBEQVdBLCB0aGUgQWxsb2MgYml0CiAqICAgaW4gdGhlIEV2ZW50IHJlZ2lzdGVyIGlzIG5vIGxvbmdlciBhIHJlbGlhYmxlIGluZGljYXRpb24gb2YgdGhlIHByZXNlbmNlL2Fic2VuY2Ugb2YgYSBGSUQuIFRoZSAiQ2xlYXIgRklEIgogKiAgIHBhcnQgb2YgdGhlIERBV0EgbG9naWMsIHRvZ2V0aGVyIHdpdGggdGhlIGNob2ljZSBvZiB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgcmV0dXJuIGluZm9ybWF0aW9uIGZyb20gZ2V0X2ZpZCwKICogICBoYW5kbGUgdGhpcyBhdXRvbWF0aWNhbGx5LCBpLmUuIHdpdGhvdXQgYWRkaXRpb25hbCBjb2RlIGluIGdldF9maWQuCiAqLkVORERPQyAgICAgICAgICAgICAgICBFTkQgRE9DVU1FTlRBVElPTgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpIQ0ZfU1RBVElDIGhjZl8xNgpnZXRfZmlkKCBJRkJQIGlmYnAgKQp7CgoJaGNmXzE2IGZpZCA9IDA7CiNpZiAoIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9ISUk1ICkgPT0gMAoJUFJPVF9DTlRfSU5JOwojZW5kaWYgLy8gSENGX1RZUEVfSElJNQoKCUlGX0RNQSggSENGQVNTRVJUKCEoaWZicC0+SUZCX0NudGxPcHQgJiBVU0VfRE1BKSwgaWZicC0+SUZCX0NudGxPcHQpICk7CgoJaWYgKCBJUFcoIEhSRUdfRVZfU1RBVCkgJiBIUkVHX0VWX0FMTE9DKSB7CgkJZmlkID0gSVBXKCBIUkVHX0FMTE9DX0ZJRCApOwoJCUhDRkFTU0VSVCggZmlkLCBpZmJwLT5JRkJfUnNjSW5kICk7CgkJREFXQV9aRVJPX0ZJRCggSFJFR19BTExPQ19GSUQgKTsKI2lmICggKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0hJSTUgKSA9PSAwCgkJSENGX1dBSVRfV0hJTEUoICggSVBXKCBIUkVHX0VWX1NUQVQgKSAmIEhSRUdfRVZfQUNLX1JFR19SRUFEWSApID09IDAgKTsKCQlIQ0ZBU1NFUlQoIHByb3RfY250LCBJUFcoIEhSRUdfRVZfU1RBVCApICk7CiNlbmRpZiAvLyBIQ0ZfVFlQRV9ISUk1CgkJREFXQV9BQ0soIEhSRUdfRVZfQUxMT0MgKTsgICAgICAgICAgLy8hIW5vdGUgdGhhdCBIUkVHX0VWX0FMTE9DIGlzIHdyaXR0ZW4gb25seSBvbmNlCi8vIDE4MCBkZWdyZWUgZXJyb3IgaW4gbG9naWMgOz8gI2lmIEFMTE9DXzE1CgkJaWYgKCBpZmJwLT5JRkJfUnNjSW5kID09IDEgKSB7CgkJCWlmYnAtPklGQl9Sc2NJbmQgPSAwOwoJCX0KLy8jZW5kaWYgLy8gQUxMT0NfMTUKCX0gZWxzZSB7Ci8vIDE4MCBkZWdyZWUgZXJyb3IgaW4gbG9naWMgOz8gI2lmIEFMTE9DXzE1CgkJZmlkID0gaWZicC0+SUZCX1JzY0luZDsKLy8jZW5kaWYgLy8gQUxMT0NfMTUKCQlpZmJwLT5JRkJfUnNjSW5kID0gMDsKCX0KCXJldHVybiBmaWQ7Cn0gLy8gZ2V0X2ZpZAoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICouU1VCTU9EVUxFICAgICB2b2lkIGdldF9mcmFnKCBJRkJQIGlmYnAsIHdjaV9idWZwIGJ1ZnAsIGludCBsZW4gQkVfUEFSKCBpbnQgd29yZF9sZW4gKSApCiAqLlBVUlBPU0UgICAgICAgcmVhZHMgd2l0aCAxNi8zMiBiaXQgSS9PIHZpYSBCQVAxIHBvcnQgZnJvbSBOSUMgUkFNIHRvIEhvc3QgbWVtb3J5LgogKgogKi5BUkdVTUVOVFMKICogICBpZmJwICAgICAgICBhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKICogICBidWZwICAgICAgICAoYnl0ZSkgYWRkcmVzcyBvZiBidWZmZXIKICogICBsZW4gICAgICAgICBsZW5ndGggaW4gYnl0ZXMgb2YgYnVmZmVyIHNwZWNpZmllZCBieSBidWZwCiAqICAgd29yZF9sZW4gICAgQmlnIEVuZGlhbiBvbmx5OiBudW1iZXIgb2YgbGVhZGluZyBieXRlcyB0byBzd2FwIGluIHBhaXJzCiAqCiAqLlJFVFVSTlMgICAgICAgTi5BLgogKgogKi5ERVNDUklQVElPTgogKiBwcm9jZXNzIHRoZSBzaW5nbGUgYnl0ZSAoaWYgYXBwbGljYWJsZSkgcmVhZCBieSB0aGUgcHJldmlvdXMgZ2V0X2ZyYWcgYW5kIGNvcHkgbGVuIChvciBsZW4tMSkgYnl0ZXMgZnJvbQogKiBOSUMgdG8gYnVmcC4KICogT24gYSBCaWcgRW5kaWFuIHBsYXRmb3JtLCB0aGUgcGFyYW1ldGVyIHdvcmRfbGVuIGNvbnRyb2xzIHRoZSBudW1iZXIgb2YgbGVhZGluZyBieXRlcyB3aG9zZSBlbmRpYW5lc3MgaXMKICogY29udmVydGVkIChpLmUuIGJ5dGUgc3dhcHBlZCkKICoKICoKICouRElBR1JBTQogKjEwOiBUaGUgUENNQ0lBIGNhcmQgY2FuIGJlIHJlbW92ZWQgaW4gdGhlIG1pZGRsZSBvZiB0aGUgdHJhbnNmZXIuIEJ5IGRlcG9zaXRpbmcgYSAibWFnaWMgbnVtYmVyIiBpbiB0aGUKICogICBIUkVHX1NXXzAgcmVnaXN0ZXIgb2YgdGhlIEhlcm1lcyBhdCBpbml0aWFsaXphdGlvbiB0aW1lIGFuZCBieSB2ZXJpZnlpbmcgdGhpcyByZWdpc3RlciwgaXQgY2FuIGJlCiAqICAgZGV0ZXJtaW5lZCB3aGV0aGVyIHRoZSBjYXJkIGlzIHN0aWxsIHByZXNlbnQuIFRoZSByZXR1cm4gc3RhdHVzIGlzIHNldCBhY2NvcmRpbmdseS4KICogICBDbGVhcmluZyB0aGUgYnVmZmVyIGlzIGEgKHJlbGF0aXZlKSBjaGVhcCB3YXkgdG8gcHJldmVudCB0aGF0IGZhaWxpbmcgSS9PIHJlc3VsdHMgaW4gcnVuLWF3YXkgYmVoYXZpb3IKICogICBiZWNhdXNlIHRoZSBnYXJiYWdlIGluIHRoZSBidWZmZXIgaXMgaW50ZXJwcmV0ZWQgYnkgdGhlIGNhbGxlciBpcnJlc3BlY3RpdmUgb2YgdGhlIHJldHVybiBzdGF0dXMgKGUuZy4KICogICBoY2Zfc2VydmljZV9uaWMgaGFzIHRoaXMgYmVoYXZpb3IpLgogKgogKi5OT1RJQ0UKICogICBJdCB0dXJucyBvdXQgRE9TIE9ESSB1c2VzIHplcm8gbGVuZ3RoIGZyYWdtZW50cy4gVGhlIEhDRiBjb2RlIGNhbiBjb3BlIHdpdGggaXQsIGJ1dCBhcyBhIGNvbnNlcXVlbmNlLCBubwogKiAgIEFzc2VydCBvbiBsZW4gaXMgcG9zc2libGUKICoKICouRU5ERE9DICAgICAgICAgICAgICAgIEVORCBET0NVTUVOVEFUSU9OCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkhDRl9TVEFUSUMgdm9pZApnZXRfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBidWZwLCBpbnQgbGVuIEJFX1BBUiggaW50IHdvcmRfbGVuICkgKQp7CgloY2ZfaW8gICAgICBpb19wb3J0ID0gaWZicC0+SUZCX0lPQmFzZSArIEhSRUdfREFUQV8xOyAgIC8vQkFQIGRhdGEgcmVnaXN0ZXIKCXdjaV9idWZwICAgIHAgPSBidWZwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy93b3JraW5nIHBvaW50ZXIKCWludCAgICAgICAgIGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmV2ZW50IHNpZGUgZWZmZWN0cyBmcm9tIG1hY3JvCglpbnQgICAgICAgICBqOwoKCUhDRkFTU0VSVCggKChoY2ZfMzIpYnVmcCAmIChIQ0ZfQUxJR04tMSkgKSA9PSAwLCAoaGNmXzMyKWJ1ZnAgKTsKCi8qMTogICAgaGVyZSByZWNvdmVyeSBsb2dpYyBmb3IgaW50ZXJ2ZW5pbmcgQkFQIGFjY2VzcyBiZXR3ZWVuIGhjZl9zZXJ2aWNlX25pYyBhbmQgaGNmX3Jjdl9tc2cgQ09VTEQgYmUgYWRkZWQKICogIGlmIGN1cnJlbnQgYWNjZXNzIGlzIFJ4SW5pdGlhbAogKiAgLiAgcGVyc2lzdGVudF9vZmZzZXQgKz0gbGVuCiAqLwoKCWkgPSBsZW47CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiBidWZmZXIgbGVuZ3RoID4gMCBhbmQgY2FycnkgZnJvbSBwcmV2aW91cyBnZXRfZnJhZwoJaWYgKCBpICYmIGlmYnAtPklGQl9DYXJyeUluICkgewoJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8uICBtb3ZlIGNhcnJ5IHRvIGJ1ZmZlcgoJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8uICBhZGp1c3QgYnVmZmVyIGxlbmd0aCBhbmQgcG9pbnRlciBhY2NvcmRpbmdseQoJCSpwKysgPSAoaGNmXzgpKGlmYnAtPklGQl9DYXJyeUluPj44KTsKCQlpLS07CgkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIGNsZWFyIGNhcnJ5IGZsYWcKCQlpZmJwLT5JRkJfQ2FycnlJbiA9IDA7Cgl9CiNpZiAoSENGX0lPKSAmIEhDRl9JT18zMkJJVFMKCS8vc2tpcCB6ZXJvLWxlbmd0aCBJL08sIHNpbmdsZSBieXRlIEkvTyBhbmQgSS9PIG5vdCB3b3J0aHdoaWxlIChpLmUuIGxlc3MgdGhhbiA2IGJ5dGVzKWZvciBEVyBsb2dpYwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgYnVmZmVyIGxlbmd0aCA+PSA2IGFuZCAzMiBiaXRzIEkvTyBzdXBwb3J0CglpZiAoICEoaWZicC0+SUZCX0NudGxPcHQgJiBVU0VfMTZCSVQpICYmIGkgPj0gNiApIHsKCQloY2ZfMzIgRkFSICAqcDQ7IC8vcHJldmVudCBzaWRlIGVmZmVjdHMgZnJvbSBtYWNybwoJCWlmICggKCAoaGNmXzMyKXAgJiAweDEgKSA9PSAwICkgeyAgICAgICAgICAgLy8uICBpZiBidWZmZXIgYXQgbGVhc3Qgd29yZCBhbGlnbmVkCgkJCWlmICggKGhjZl8zMilwICYgMHgyICkgeyAgICAgICAgICAgIC8vLiAgLiAgaWYgYnVmZmVyIG5vdCBkb3VibGUgd29yZCBhbGlnbmVkCgkJCQkJCQkgICAgLy8uICAuICAuICByZWFkIHNpbmdsZSB3b3JkIHRvIGdldCBkb3VibGUgd29yZCBhbGlnbmVkCgkJCQkqKHdjaV9yZWNvcmRwKXAgPSBJTl9QT1JUX1dPUkQoIGlvX3BvcnQgKTsKCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIC4gIC4gIGFkanVzdCBidWZmZXIgbGVuZ3RoIGFuZCBwb2ludGVyIGFjY29yZGluZ2x5CgkJCQlwICs9IDI7CgkJCQlpIC09IDI7CgkJCX0KCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8uICAuICByZWFkIGFzIG1hbnkgZG91YmxlIHdvcmQgYXMgcG9zc2libGUKCQkJcDQgPSAoaGNmXzMyIEZBUiAqKXA7CgkJCWogPSBpLzQ7CgkJCUlOX1BPUlRfU1RSSU5HXzMyKCBpb19wb3J0LCBwNCwgaiApOwoJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIC4gIGFkanVzdCBidWZmZXIgbGVuZ3RoIGFuZCBwb2ludGVyIGFjY29yZGluZ2x5CgkJCXAgKz0gaSAmIH4weDAwMDM7CgkJCWkgJj0gMHgwMDAzOwoJCX0KCX0KI2VuZGlmIC8vIEhDRl9JT18zMkJJVFMKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lmIG5vIDMyLWJpdCBzdXBwb3J0IE9SIGJ5dGUgYWxpZ25lZCBPUiAxLTMgYnl0ZXMgbGVmdAoJaWYgKCBpICkgewoJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8uICByZWFkIGFzIG1hbnkgd29yZCBhcyBwb3NzaWJsZSBpbiAiYWxpZ25tZW50IHNhZmUiIHdheQoJCWogPSBpLzI7CgkJSU5fUE9SVF9TVFJJTkdfOF8xNiggaW9fcG9ydCwgcCwgaiApOwoJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8uICBpZiAxIGJ5dGUgbGVmdAoJCWlmICggaSAmIDB4MDAwMSApIHsKCQkJICAgICAgICAgICAgICAgICAgICAgICAgLy8uICAuICByZWFkIDEgd29yZAoJCQlpZmJwLT5JRkJfQ2FycnlJbiA9IElOX1BPUlRfV09SRCggaW9fcG9ydCApOwoJCQkgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIC4gIHN0b3JlIExTQiBpbiBsYXN0IGNoYXIgb2YgYnVmZmVyCgkJCWJ1ZnBbbGVuLTFdID0gKGhjZl84KWlmYnAtPklGQl9DYXJyeUluOwoJCQkgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIC4gIHNhdmUgTVNCIGluIGNhcnJ5LCBzZXQgY2FycnkgZmxhZwoJCQlpZmJwLT5JRkJfQ2FycnlJbiB8PSAweDE7CgkJfQoJfQojaWYgSENGX0JJR19FTkRJQU4KCUhDRkFTU0VSVCggd29yZF9sZW4gPT0gMCB8fCB3b3JkX2xlbiA9PSAyIHx8IHdvcmRfbGVuID09IDQsIHdvcmRfbGVuICk7CglIQ0ZBU1NFUlQoIHdvcmRfbGVuID09IDAgfHwgKChoY2ZfMzIpYnVmcCAmIDEgKSA9PSAwLCAoaGNmXzMyKWJ1ZnAgKTsKCUhDRkFTU0VSVCggd29yZF9sZW4gPD0gbGVuLCBNRVJHRTIoIHdvcmRfbGVuLCBsZW4gKSApOwoJLy9zZWUgcHV0X2ZyYWcgZm9yIGFuIGFsdGVybmF0aXZlIGltcGxlbWVudGF0aW9uLCBidXQgYmUgY2FyZWZ1bCBhYm91dCB3aGF0IGFyZSBpbnQncyBhbmQgd2hhdCBhcmUKCS8vaGNmXzE2J3MKCWlmICggd29yZF9sZW4gKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgaWYgdGhlcmUgaXMgYW55dGhpbmcgdG8gY29udmVydAoJCWhjZl84IGM7CgkJYyA9IGJ1ZnBbMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIC4gIGNvbnZlcnQgdGhlIDFzdCBoY2ZfMTYKCQlidWZwWzFdID0gYnVmcFswXTsKCQlidWZwWzBdID0gYzsKCQlpZiAoIHdvcmRfbGVuID4gMSApIHsgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgLiAgaWYgdGhlcmUgaXMgdG8gY29udmVydCBtb3JlIHRoYW4gMSB3b3JkICggaS5lIDIgKQoJCQljID0gYnVmcFszXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8uICAuICAuICBjb252ZXJ0IHRoZSAybmQgaGNmXzE2CgkJCWJ1ZnBbM10gPSBidWZwWzJdOwoJCQlidWZwWzJdID0gYzsKCQl9Cgl9CiNlbmRpZiAvLyBIQ0ZfQklHX0VORElBTgp9IC8vIGdldF9mcmFnCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqLlNVQk1PRFVMRSAgICAgaW50IGluaXQoIElGQlAgaWZicCApCiAqLlBVUlBPU0UgICAgICAgSGFuZGxlcyBjb21tb24gaW5pdGlhbGl6YXRpb24gYXNwZWN0cyAoSC1JIGluaXQsIGNhbGlicmF0aW9uLCBjb25maWcubW5nbXQsIGFsbG9jYXRpb24pLgogKgogKi5BUkdVTUVOVFMKICogICBpZmJwICAgICAgICBhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKICoKICouUkVUVVJOUwogKiAgIEhDRl9FUlJfSU5DT01QX1BSSQogKiAgIEhDRl9FUlJfSU5DT01QX0ZXCiAqICAgSENGX0VSUl9USU1FX09VVAogKiAgID4+aGNmX2dldF9pbmZvCiAqICAgICAgIEhDRl9FUlJfTk9fTklDCiAqICAgICAgIEhDRl9FUlJfTEVOCiAqCiAqLkRFU0NSSVBUSU9OCiAqIGluaXQgd2lsbCBzdWNjZXNzaXZlbHk6CiAqIC0gaW4gY2FzZSBvZiBhIChub24tcHJlbG9hZGVkKSBILUksIGluaXRpYWxpemUgdGhlIE5JQwogKiAtIGNhbGlicmF0ZSB0aGUgUy9XIHByb3RlY3Rpb24gdGltZXIgYWdhaW5zdCB0aGUgSGVybWVzIFRpbWVyCiAqIC0gY29sbGVjdCBIU0ksICJhY3RpdmUiIEYvVyBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQgSW5mb3JtYXRpb24KICogLSBpbiBjYXNlIGFjdGl2ZSBGL1cgaXMgUHJpbWFyeSBGL1c6IGNvbGxlY3QgUHJpbWFyeSBGL1cgQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50IEluZm9ybWF0aW9uCiAqIC0gY2hlY2sgSFNJIGFuZCBQcmltYXJ5IEYvVyBjb21wYXRpYmlsaXR5IHdpdGggdGhlIEhDRgogKiAtIGluIGNhc2UgYWN0aXZlIEYvVyBpcyBTdGF0aW9uIG9yIEFQIEYvVzogY2hlY2sgU3RhdGlvbiBvciBBUCBGL1cgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBIQ0YKICogLSBpbiBjYXNlIGFjdGl2ZSBGL1cgaXMgbm90IFByaW1hcnkgRi9XOiBhbGxvY2F0ZSBGSURzIHRvIGJlIHVzZWQgaW4gdHJhbnNtaXQvbm90aWZ5IHByb2Nlc3MKICoKICoKICouRElBR1JBTQogKjI6IGRyb3AgYWxsIGVycm9yIHN0YXR1cyBiaXRzIGluIElGQl9DYXJkU3RhdCBzaW5jZSB0aGV5IGFyZSBleHBlY3RlZCB0byBiZSByZS1ldmFsdWF0ZWQuCiAqNDogQWNrIGV2ZXJ5dGhpbmcgZXhjZXB0IEhSRUdfRVZfU0xFRVBfUkVRLiBJdCBpcyB2ZXJ5IGxpa2VseSB0aGF0IGFuIEFsbG9jIGV2ZW50IGlzIHBlbmRpbmcgYW5kCiAqICAgdmVyeSB3ZWxsIHBvc3NpYmxlIHRoYXQgYSBTZW5kIENtZCBldmVudCBpcyBwZW5kaW5nLiBBY2tpbmcgSFJFR19FVl9TTEVFUF9SRVEgaXMgaGFuZGxlZCBieSBoY2ZfYWN0aW9uKAogKiAgIEhDRl9BQ1RfSU5UX09OICkgISEhCiAqMTA6IENhbGlicmF0ZSB0aGUgUy9XIHRpbWUtb3V0IHByb3RlY3Rpb24gbWVjaGFuaXNtIGJ5IGNhbGxpbmcgY2FsaWJyYXRlKCkuIE5vdGUgdGhhdCBwb3NzaWJsZSBlcnJvcnMKICogICBpbiB0aGUgY2FsaWJyYXRpb24gcHJvY2VzcyBhcmUgbm9yIHJlcG9ydGVkIGJ5IGluaXQgYnV0IHdpbGwgc2hvdyB1cCB2aWEgdGhlIGRlZnVuY3QgbWVjaGFuaXNtIGluCiAqICAgc3Vic2VxdWVudCBoY2YtY2FsbHMuCiAqMTQ6IHVzYl9jaGVja19jb21wKCkgaXMgY2FsbGVkIHRvIGhhdmUgdGhlIG1pbmltYWwgdmlzdWFsIGNsdXR0ZXIgZm9yIHRoZSBsZWdhY3kgSC1JIFVTQiBkb25nbGUKICogICBjb21wYXRpYmlsaXR5IGNoZWNrLgogKjE2OiBUaGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb24gbWFuYWdlbWVudCByZWxhdGVkIGluZm9ybWF0aW9uIGlzIHJldHJpZXZlZCBmcm9tIHRoZSBOSUM6CiAqICAgIC0gSFNJIHN1cHBsaWVyCiAqICAgIC0gRi9XIElkZW50aXR5CiAqICAgIC0gRi9XIHN1cHBsaWVyCiAqICAgIGlmIGFwcHJvcHJpYXRlOgogKiAgICAtIFBSSSBJZGVudGl0eQogKiAgICAtIFBSSSBzdXBwbGllcgogKiAgICBhcHByb3ByaWF0ZSBtZWFucyBvbiBILUk6IGFsd2F5cwogKiAgICBhbmQgb24gSC1JSSBpZiBGL1cgc3VwcGxpZXIgcmVmbGVjdHMgYSBwcmltYXJ5IChpLmUuIG9ubHkgYWZ0ZXIgYW4gSGVybWVzIFJlc2V0IG9yIEluaXQKICogICAgY29tbWFuZCkuCiAqICAgIFFVRVNUSU9OIDs/ICEhISEhISBzaG91bGQsIEZvciBlYWNoIG9mIHRoZSBhYm92ZSBSSURzIHRoZSBFbmRpYW5lc3MgaXMgY29udmVydGVkIHRvIG5hdGl2ZSBFbmRpYW5lc3MuCiAqICAgIE9ubHkgdGhlIHJldHVybiBjb2RlIG9mIHRoZSBmaXJzdCBoY2ZfZ2V0X2luZm8gaXMgdXNlZC4gQWxsIGhjZl9nZXRfaW5mbyBjYWxscyBhcmUgbWFkZSwgcmVnYXJkbGVzcyBvZgogKiAgICB0aGUgc3VjY2VzcyBvciBmYWlsdXJlIG9mIHRoZSAxc3QgaGNmX2dldF9pbmZvLiBUaGUgYXNzdW1wdGlvbnMgYXJlOgogKiAgICAgLSBpZiBhbnkgY2FsbCBmYWlscywgdGhleSBhbGwgZmFpbCwgc28gcmVtZW1iZXJpbmcgdGhlIHJlc3VsdCBvZiB0aGUgMXN0IGNhbGwgaXMgYWRlcXVhdGUKICogICAgIC0gYSBmYWlsaW5nIGNhbGwgd2lsbCBvdmVyd3JpdGUgdGhlIEwtZmllbGQgd2l0aCBhIDB4MDAwMCB2YWx1ZSwgd2hpY2ggc2VydmljZXMgYm90aCBhcyBhbgogKiAgICAgICBlcnJvciBpbmRpY2F0aW9uIGZvciB0aGUgdmFsdWVzIGNhY2hlZCBpbiB0aGUgSUZCIGFzIG1ha2luZyBtbWRfY2hlY2tfY29tcCBmYWlsLgogKiAgICBJbiBjYXNlIG9mIEgtSSwgd2hlbiBnZXR0aW5nIHRoZSBGL1cgaWRlbnRpdHkgZmFpbHMsIHRoZSBGL1cgaXMgYXNzdW1lZCB0byBiZSBILUkgQVAgRi9XIHByZS1kYXRpbmcKICogICAgdmVyc2lvbiA5LjAgYW5kIHRoZSBGL1cgSWRlbnRpdHkgYW5kIFN1cHBsaWVyIGFyZSBmYWtlZCBhY2NvcmRpbmdseS4KICogICAgSW4gY2FzZSBvZiBILUlJLCB0aGUgUHJpbWFyeSwgU3RhdGlvbiBhbmQgQVAgSWRlbnRpdHkgYXJlIG1lcmdlZCBpbnRvIGEgc2luZ2xlIEYvVyBJZGVudGl0eS4KICogICAgVGhlIHNhbWUgYXBwbGllcyB0byB0aGUgU3VwcGxpZXIgaW5mb3JtYXRpb24uIEFzIGEgY29uc2VxdWVuY2UgdGhlIFBSSSBpbmZvcm1hdGlvbiBjYW4gbm8gbG9uZ2VyIGJlCiAqICAgIHJldHJpZXZlZCB3aGVuIGEgVGVydGlhcnkgcnVucy4gVG8gYWNjb21tb2RhdGUgTVNGcyBhbmQgVXRpbGl0aWVzIHdobyBkZXBlbmQgb24gUFJJIGluZm9ybWF0aW9uIGJlaW5nCiAqICAgIGF2YWlsYWJsZSBhdCBhbnkgdGltZSwgdGhpcyBpbmZvcm1hdGlvbiBpcyBjYWNoZWQgaW4gdGhlIElGQi4gSW4gdGhpcyBjYWNoZSB0aGUgZ2VuZXJpYyAiRi9XIiB2YWx1ZSBvZgogKiAgICB0aGUgdHlwLWZpZWxkcyBpcyBvdmVyd3JpdHRlbiB3aXRoIHRoZSBzcGVjaWZpYyAobGVnYWN5KSAiUFJJIiB2YWx1ZXMuIFRvIGFjdHVhbGx5IHJlLXJvdXRlIHRoZSAobGVnYWN5KQogKiAgICBQUkkgcmVxdWVzdCB2aWEgaGNmX2dldF9pbmZvLCB0aGUgeHh4eC10YWJsZSBtdXN0IGJlIHNldC4gIEluIGNhc2Ugb2YgSC1JLCB0aGlzIGNhY2hpbmcsIG1vZGlmeWluZyBhbmQKICogICAgcmUtcm91dGluZyBpcyBub3QgbmVlZGVkIGJlY2F1c2UgUFJJIGluZm9ybWF0aW9uIGlzIGFsd2F5cyBhdmFpbGFibGUgZGlyZWN0bHkgZnJvbSB0aGUgTklDLiBGb3IKICogICAgY29uc2lzdGVuY3kgdGhlIGNhY2hpbmcgZmllbGRzIGluIHRoZSBJRkIgYXJlIGZpbGxlZCB3aXRoIHRoZSBQUkkgaW5mb3JtYXRpb24gYW55d2F5LgogKjE4OiBtZGRfY2hlY2tfY29tcCgpIGlzIGNhbGxlZCB0byBjaGVjayB0aGUgU3VwcGxpZXIgVmFyaWFudCBhbmQgUmFuZ2Ugb2YgdGhlIEhvc3QtUy9XIEkvRiAoSFNJKSBhbmQgdGhlCiAqICAgUHJpbWFyeSBGaXJtd2FyZSBWYXJpYW50IGFuZCBSYW5nZSBhZ2FpbnN0IHRoZSBUb3AgYW5kIEJvdHRvbSBsZXZlbCBzdXBwb3J0ZWQgYnkgdGhpcyBIQ0YuICBJZiBlaXRoZXIgb2YKICogICB0aGVzZSB0ZXN0cyBmYWlscywgdGhlIENBUkRfU1RBVF9JTkNPTVBfUFJJIGJpdCBvZiBJRkJfQ2FyZFN0YXQgaXMgc2V0CiAqICAgTm90ZTogVGhlcmUgc2hvdWxkIGFsd2F5cyBiZSBhIHByaW1hcnkgZXhjZXB0IGR1cmluZyBwcm9kdWN0aW9uLCBzbyB0aGlzIG1ha2VzIHRoZSBIQ0YgaW4gaXRzIGN1cnJlbnQgZm9ybQogKiAgIHVuc3VpdGFibGUgZm9yIG1hbnVmYWN0dXJpbmcgdGVzdCBzeXN0ZW1zIGxpa2UgdGhlIEZUUy4gVGhpcyBjYW4gYmUgcmVtZWRpZWQgYnkgYW4gYWRkaW5nIGEgdGVzdCBsaWtlCiAqICAgaWZicC0+SUZCX1BSSVN1cC5pZCA9PSBDT01QX0lEX1BSSQogKjIwOiBJbiBjYXNlIHRoZXJlIGlzIFRlcnRpYXJ5IEYvVyBhbmQgdGhpcyBGL1cgaXMgU3RhdGlvbiBGL1csIHRoZSBTdXBwbGllciBWYXJpYW50IGFuZCBSYW5nZSBvZiB0aGUgU3RhdGlvbgogKiAgIEZpcm13YXJlIGZ1bmN0aW9uIGFzIHJldHJpZXZlZCBmcm9tIHRoZSBIZXJtZXMgaXMgY2hlY2tlZCBhZ2FpbnN0IHRoZSBUb3AgYW5kIEJvdHRvbSBsZXZlbCBzdXBwb3J0ZWQgYnkKICogICB0aGlzIEhDRi4KICogICBOb3RlOiA7PyB0aGUgdGVydGlhcnkgRi9XIGNvbXBhdGliaWxpdHkgY2hlY2tzIGNvdWxkIGJlIG1vdmVkIHRvIHRoZSBESEYsIHdoaWNoIGFscmVhZHkgaGFzIGNoZWNrZWQgdGhlCiAqICAgQ0ZJIGFuZCBNRkkgY29tcGF0aWJpbGl0eSBvZiB0aGUgaW1hZ2Ugd2l0aCB0aGUgTklDIGJlZm9yZSB0aGUgaW1hZ2Ugd2FzIGRvd25sb2FkZWQuCiAqMjg6IEluIGNhc2Ugb2Ygbm9uLVByaW1hcnkgRi9XOiBhbGxvY2F0ZXMgYW5kIGFja25vd2xlZGdlIGEgKFRYIG9yIE5vdGlmeSkgRklEIGFuZCBhbGxvY2F0ZXMgd2l0aG91dAogKiAgIGFja25vd2xlZGdlIGFub3RoZXIgKFRYIG9yIE5vdGlmeSkgRklEICh0aGUgc28tY2FsbGVkIDEuNSBhbGxvYyBzY2hlbWUpIHdpdGggdGhlIGZvbGxvd2luZyBzdGVwczoKICogICAtIGV4ZWN1dGUgdGhlIGFsbG9jYXRlIGNvbW1hbmQgYnkgY2FsbGluZyBjbWRfZXhlCiAqICAgLSB3YWl0IHRpbGwgZWl0aGVyIHRoZSBhbGxvYyBldmVudCBvciBhIHRpbWUtb3V0IG9jY3VycwogKiAgIC0gcmVnYXJkbGVzcyB3aGV0aGVyIHRoZSBhbGxvYyBldmVudCBvY2N1cnMsIGNhbGwgZ2V0X2ZpZCB0bwogKiAgICAgLSByZWFkIHRoZSBGSUQgYW5kIHNhdmUgaXQgaW4gSUZCX1JzY0luZCB0byBiZSB1c2VkIGFzICJzcGFyZSBGSUQiCiAqICAgICAtIGFja25vd2xlZGdlIHRoZSBhbGxvYyBldmVudAogKiAgICAgLSBkbyBhbm90aGVyICJoYWxmIiBhbGxvY2F0ZSB0byBjb21wbGV0ZSB0aGUgIjEuNSBBbGxvYyBzY2hlbWUiCiAqICAgICBOb3RlIHRoYXQgYWJvdmUgMyBzdGVwcyBkbyBub3QgaGFybSBhbmQgdGh1cyBnaXZlIHRoZSAiY2hlYXBlc3QiIGFjY2VwdGFibGUgc3RyYXRlZ3kuCiAqICAgICBJZiBhIHRpbWUtb3V0IG9jY3VycmVkLCB0aGVuIHJlcG9ydCB0aW1lIG91dCBzdGF0dXMgKGFmdGVyIGFsbCkKICoKICouRU5ERE9DICAgICAgICAgICAgICAgIEVORCBET0NVTUVOVEFUSU9OCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkhDRl9TVEFUSUMgaW50CmluaXQoIElGQlAgaWZicCApCnsKCglpbnQgcmMgPSBIQ0ZfU1VDQ0VTUzsKCglIQ0ZMT0dFTlRSWSggSENGX1RSQUNFX0lOSVQsIDAgKTsKCglpZmJwLT5JRkJfQ2FyZFN0YXQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyKi8KCU9QVyggSFJFR19FVl9BQ0ssIH5IUkVHX0VWX1NMRUVQX1JFUSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQqLwoJSUZfUFJPVF9USU1FKCBjYWxpYnJhdGUoIGlmYnAgKSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoxMCovCiNpZiAwIC8vIE9PUgoJaWZicC0+SUZCX0ZXSWRlbnRpdHkubGVuID0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvL21pc3VzZSB0aGUgSUZCIHNwYWNlIGZvciBhIHB1dAoJaWZicC0+SUZCX0ZXSWRlbnRpdHkudHlwID0gQ0ZHX1RJQ0tfVElNRTsKCWlmYnAtPklGQl9GV0lkZW50aXR5LmNvbXBfaWQgPSAoMTAwMCoxMDAwKS8xMDI0ICsgMTsgICAgLy9yb3VnaGx5IDEgc2Vjb25kCgloY2ZfcHV0X2luZm8oIGlmYnAsIChMVFZQKSZpZmJwLT5JRkJfRldJZGVudGl0eS5sZW4gKTsKI2VuZGlmIC8vIE9PUgoJaWZicC0+SUZCX0ZXSWRlbnRpdHkubGVuID0gc2l6ZW9mKENGR19GV19JREVOVElUWV9TVFJDVCkvc2l6ZW9mKGhjZl8xNikgLSAxOwoJaWZicC0+SUZCX0ZXSWRlbnRpdHkudHlwID0gQ0ZHX0ZXX0lERU5USVRZOwoJcmMgPSBoY2ZfZ2V0X2luZm8oIGlmYnAsIChMVFZQKSZpZmJwLT5JRkJfRldJZGVudGl0eS5sZW4gKTsKLyogOz8gY29udmVyc2lvbiBzaG91bGQgbm90IGJlIG5lZWRlZCBmb3IgbW1kX2NoZWNrX2NvbXAgKi8KI2lmIEhDRl9CSUdfRU5ESUFOCglpZmJwLT5JRkJfRldJZGVudGl0eS5jb21wX2lkICAgICAgID0gQ05WX0xJVFRMRV9UT19TSE9SVCggaWZicC0+SUZCX0ZXSWRlbnRpdHkuY29tcF9pZCApOwoJaWZicC0+SUZCX0ZXSWRlbnRpdHkudmFyaWFudCAgICAgICA9IENOVl9MSVRUTEVfVE9fU0hPUlQoIGlmYnAtPklGQl9GV0lkZW50aXR5LnZhcmlhbnQgKTsKCWlmYnAtPklGQl9GV0lkZW50aXR5LnZlcnNpb25fbWFqb3IgPSBDTlZfTElUVExFX1RPX1NIT1JUKCBpZmJwLT5JRkJfRldJZGVudGl0eS52ZXJzaW9uX21ham9yICk7CglpZmJwLT5JRkJfRldJZGVudGl0eS52ZXJzaW9uX21pbm9yID0gQ05WX0xJVFRMRV9UT19TSE9SVCggaWZicC0+SUZCX0ZXSWRlbnRpdHkudmVyc2lvbl9taW5vciApOwojZW5kaWYgLy8gSENGX0JJR19FTkRJQU4KI2lmIGRlZmluZWQgTVNGX0NPTVBPTkVOVF9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qMTQqLwoJaWYgKCByYyA9PSBIQ0ZfU1VDQ0VTUyApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoxNiovCgkJaWZicC0+SUZCX0hTSVN1cC5sZW4gPSBzaXplb2YoQ0ZHX1NVUF9SQU5HRV9TVFJDVCkvc2l6ZW9mKGhjZl8xNikgLSAxOwoJCWlmYnAtPklGQl9IU0lTdXAudHlwID0gQ0ZHX05JQ19IU0lfU1VQX1JBTkdFOwoJCXJjID0gaGNmX2dldF9pbmZvKCBpZmJwLCAoTFRWUCkmaWZicC0+SUZCX0hTSVN1cC5sZW4gKTsKLyogOz8gY29udmVyc2lvbiBzaG91bGQgbm90IGJlIG5lZWRlZCBmb3IgbW1kX2NoZWNrX2NvbXAgLCBCVVQgYWNjb3JkaW5nIHRvIGEgcmVwb3J0IG9mIGEgQkUtdXNlciBpdCBpcwogKiBzaG91bGQgYmUgcmVzb2x2ZWQgaW4gdGhlIFdBUlAgcmVsZWFzZQogKiBzaW5jZSBzb21lIGNvbXBpbGVycyBtYWtlIHVnbHkgYnV0IHVubmVjZXNzYXJ5IGNvZGUgb2YgdGhlc2UgaW5zdHJ1Y3Rpb25zIGV2ZW4gZm9yIExFLAogKiBpdCBpcyBjb25kaXRpb25hbGx5IGNvbXBpbGVkICovCiNpZiBIQ0ZfQklHX0VORElBTgoJCWlmYnAtPklGQl9IU0lTdXAucm9sZSAgICA9IENOVl9MSVRUTEVfVE9fU0hPUlQoIGlmYnAtPklGQl9IU0lTdXAucm9sZSApOwoJCWlmYnAtPklGQl9IU0lTdXAuaWQgICAgICA9IENOVl9MSVRUTEVfVE9fU0hPUlQoIGlmYnAtPklGQl9IU0lTdXAuaWQgKTsKCQlpZmJwLT5JRkJfSFNJU3VwLnZhcmlhbnQgPSBDTlZfTElUVExFX1RPX1NIT1JUKCBpZmJwLT5JRkJfSFNJU3VwLnZhcmlhbnQgKTsKCQlpZmJwLT5JRkJfSFNJU3VwLmJvdHRvbSAgPSBDTlZfTElUVExFX1RPX1NIT1JUKCBpZmJwLT5JRkJfSFNJU3VwLmJvdHRvbSApOwoJCWlmYnAtPklGQl9IU0lTdXAudG9wICAgICA9IENOVl9MSVRUTEVfVE9fU0hPUlQoIGlmYnAtPklGQl9IU0lTdXAudG9wICk7CiNlbmRpZiAvLyBIQ0ZfQklHX0VORElBTgoJCWlmYnAtPklGQl9GV1N1cC5sZW4gPSBzaXplb2YoQ0ZHX1NVUF9SQU5HRV9TVFJDVCkvc2l6ZW9mKGhjZl8xNikgLSAxOwoJCWlmYnAtPklGQl9GV1N1cC50eXAgPSBDRkdfRldfU1VQX1JBTkdFOwoJCSh2b2lkKWhjZl9nZXRfaW5mbyggaWZicCwgKExUVlApJmlmYnAtPklGQl9GV1N1cC5sZW4gKTsKLyogOz8gY29udmVyc2lvbiBzaG91bGQgbm90IGJlIG5lZWRlZCBmb3IgbW1kX2NoZWNrX2NvbXAgKi8KI2lmIEhDRl9CSUdfRU5ESUFOCgkJaWZicC0+SUZCX0ZXU3VwLnJvbGUgICAgPSBDTlZfTElUVExFX1RPX1NIT1JUKCBpZmJwLT5JRkJfRldTdXAucm9sZSApOwoJCWlmYnAtPklGQl9GV1N1cC5pZCAgICAgID0gQ05WX0xJVFRMRV9UT19TSE9SVCggaWZicC0+SUZCX0ZXU3VwLmlkICk7CgkJaWZicC0+SUZCX0ZXU3VwLnZhcmlhbnQgPSBDTlZfTElUVExFX1RPX1NIT1JUKCBpZmJwLT5JRkJfRldTdXAudmFyaWFudCApOwoJCWlmYnAtPklGQl9GV1N1cC5ib3R0b20gID0gQ05WX0xJVFRMRV9UT19TSE9SVCggaWZicC0+SUZCX0ZXU3VwLmJvdHRvbSApOwoJCWlmYnAtPklGQl9GV1N1cC50b3AgICAgID0gQ05WX0xJVFRMRV9UT19TSE9SVCggaWZicC0+SUZCX0ZXU3VwLnRvcCApOwojZW5kaWYgLy8gSENGX0JJR19FTkRJQU4KCgkJaWYgKCBpZmJwLT5JRkJfRldTdXAuaWQgPT0gQ09NUF9JRF9QUkkgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIwKi8KCQkJaW50IGkgPSBzaXplb2YoIENGR19GV19JREVOVElUWV9TVFJDVCkgKyBzaXplb2YoQ0ZHX1NVUF9SQU5HRV9TVFJDVCApOwoJCQl3aGlsZSAoIGktLSApICgoaGNmXzgqKSgmaWZicC0+SUZCX1BSSUlkZW50aXR5KSlbaV0gPSAoKGhjZl84KikoJmlmYnAtPklGQl9GV0lkZW50aXR5KSlbaV07CgkJCWlmYnAtPklGQl9QUklJZGVudGl0eS50eXAgPSBDRkdfUFJJX0lERU5USVRZOwoJCQlpZmJwLT5JRkJfUFJJU3VwLnR5cCA9IENGR19QUklfU1VQX1JBTkdFOwoJCQl4eHh4W3h4eHhfUFJJX0lERU5USVRZX09GRlNFVF0gPSAmaWZicC0+SUZCX1BSSUlkZW50aXR5LmxlbjsKCQkJeHh4eFt4eHh4X1BSSV9JREVOVElUWV9PRkZTRVQrMV0gPSAmaWZicC0+SUZCX1BSSVN1cC5sZW47CgkJfQoJCWlmICggIW1tZF9jaGVja19jb21wKCAodm9pZCopJmNmZ19kcnZfYWN0X3Jhbmdlc19oc2ksICZpZmJwLT5JRkJfSFNJU3VwKSAgICAgICAgICAgICAgICAgLyogMjIqLwojaWYgKCAoSENGX1RZUEUpICYgSENGX1RZUEVfUFJFTE9BREVEICkgPT0gMAovLzs/IHRoZSBQUkkgY29tcGF0aWJpbGl0eSBjaGVjayBpcyBvbmx5IHJlbGV2YW50IGZvciBESEYKCQkgICAgIHx8ICFtbWRfY2hlY2tfY29tcCggKHZvaWQqKSZjZmdfZHJ2X2FjdF9yYW5nZXNfcHJpLCAmaWZicC0+SUZCX1BSSVN1cCkKI2VuZGlmIC8vIEhDRl9UWVBFX1BSRUxPQURFRAoJCQkpIHsKCQkJaWZicC0+SUZCX0NhcmRTdGF0ID0gQ0FSRF9TVEFUX0lOQ09NUF9QUkk7CgkJCXJjID0gSENGX0VSUl9JTkNPTVBfUFJJOwoJCX0KCQlpZiAoICggaWZicC0+SUZCX0ZXU3VwLmlkID09IENPTVBfSURfU1RBICYmICFtbWRfY2hlY2tfY29tcCggKHZvaWQqKSZjZmdfZHJ2X2FjdF9yYW5nZXNfc3RhLCAmaWZicC0+SUZCX0ZXU3VwKSApIHx8CgkJICAgICAoIGlmYnAtPklGQl9GV1N1cC5pZCA9PSBDT01QX0lEX0FQRiAmJiAhbW1kX2NoZWNrX2NvbXAoICh2b2lkKikmY2ZnX2Rydl9hY3RfcmFuZ2VzX2FwZiwgJmlmYnAtPklGQl9GV1N1cCkgKQoJCQkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjQgKi8KCQkJaWZicC0+SUZCX0NhcmRTdGF0IHw9IENBUkRfU1RBVF9JTkNPTVBfRlc7CgkJCXJjID0gSENGX0VSUl9JTkNPTVBfRlc7CgkJfQoJfQojZW5kaWYgLy8gTVNGX0NPTVBPTkVOVF9JRAoKCWlmICggcmMgPT0gSENGX1NVQ0NFU1MgJiYgaWZicC0+SUZCX0ZXSWRlbnRpdHkuY29tcF9pZCA+PSBDT01QX0lEX0ZXX1NUQSApIHsKCQlQUk9UX0NOVF9JTkk7CgkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgkJICogcmxhdjogdGhlIERNQSBlbmdpbmUgbmVlZHMgdGhlIGhvc3QgdG8gY2F1c2UgYSAnaGFuZ2luZyBhbGxvYyBldmVudCcgZm9yIGl0IHRvIGNvbnN1bWUuCgkJICogbm90IHN1cmUgaWYgdGhpcyBpcyB0aGUgcmlnaHQgc3BvdCBpbiB0aGUgSENGLCB0aGlua2luZyBhYm91dCBoY2ZfZW5hYmxlLi4uCgkJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJCXJjID0gY21kX2V4ZSggaWZicCwgSENNRF9BTExPQywgMCApOwovLyAxODAgZGVncmVlIGVycm9yIGluIGxvZ2ljIDs/ICNpZiBBTExPQ18xNQovLwkJaWZicC0+SUZCX1JzY0luZCA9IDE7ICAgLy9sZXQncyBob3BlIHRoYXQgYnkgdGhlIHRpbWUgaGNmX3NlbmRfbXNnIGlzYSBjYWxsZWQsIHRoZXJlIHdpbGwgYmUgYSBGSUQKLy8jZWxzZQoJCWlmICggcmMgPT0gSENGX1NVQ0NFU1MgKSB7CgkJCUhDRl9XQUlUX1dISUxFKCAoSVBXKCBIUkVHX0VWX1NUQVQgKSAmIEhSRUdfRVZfQUxMT0MpID09IDAgKTsKCQkJSUZfUFJPVF9USU1FKCBIQ0ZBU1NFUlQocHJvdF9jbnQsIElQVyggSFJFR19FVl9TVEFUICkpICk7CiNpZiBIQ0ZfRE1BCgkJCWlmICggISAoIGlmYnAtPklGQl9DbnRsT3B0ICYgVVNFX0RNQSApICkKI2VuZGlmIC8vIEhDRl9ETUEKCQkJewoJCQkJaWZicC0+SUZCX1JzY0luZCA9IGdldF9maWQoIGlmYnAgKTsKCQkJCUhDRkFTU0VSVCggaWZicC0+SUZCX1JzY0luZCwgMCApOwoJCQkJY21kX2V4ZSggaWZicCwgSENNRF9BTExPQywgMCApOwoJCQkJSUZfUFJPVF9USU1FKCBpZiAoIHByb3RfY250ID09IDAgKSByYyA9IEhDRl9FUlJfVElNRV9PVVQgKTsKCQkJfQoJCX0KLy8jZW5kaWYgLy8gQUxMT0NfMTUKCX0KCglIQ0ZBU1NFUlQoIHJjID09IEhDRl9TVUNDRVNTLCByYyApOwoJSENGTE9HRVhJVCggSENGX1RSQUNFX0lOSVQgKTsKCXJldHVybiByYzsKfSAvLyBpbml0CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqLlNVQk1PRFVMRSAgICAgdm9pZCBpc3JfaW5mbyggSUZCUCBpZmJwICkKICouUFVSUE9TRSAgICAgICBoYW5kbGVzIGxpbmsgZXZlbnRzLgogKgogKi5BUkdVTUVOVFMKICogICBpZmJwICAgICAgICBhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKICoKICouUkVUVVJOUyAgICAgICBOLkEuCiAqCiAqLkRFU0NSSVBUSU9OCiAqCiAqCiAqLkRJQUdSQU0KICoxOiBGaXJzdCB0aGUgRklEIG51bWJlciBjb3JyZXNwb25kaW5nIHdpdGggdGhlIEluZm9FdmVudCBpcyBkZXRlcm1pbmVkLgogKiAgIE5vdGUgdGhlIGNvbXBsaWNhdGlvbiBvZiB0aGUgemVyby1GSUQgcHJvdGVjdGlvbiBzdWItc2NoZW1lIGluIERBV0EuCiAqICAgTmV4dCB0aGUgTC1maWVsZCBhbmQgdGhlIFQtZmllbGQgYXJlIGZldGNoZWQgaW50byBzY3JhdGNoIGJ1ZmZlciBpbmZvLgogKjI6IEluIGNhc2Ugb2YgdGFsbGllcywgdGhlIDE2IGJpdHMgSGVybWVzIHZhbHVlcyBhcmUgYWNjdW11bGF0ZWQgaW4gdGhlIElGQiBpbnRvIDMyIGJpdHMgdmFsdWVzLiBJbmZvWzBdCiAqICAgaXMgKGV4cGVjdGVkIHRvIGJlKSBIQ0ZfTklDX1RBTF9DTlQgKyAxLiBUaGUgY29udHJhcHRpb24gIndoaWxlICggaW5mb1swXS0tID4xICkiIHJhdGhlciB0aGFuCiAqICAgIndoaWxlICggLS1pbmZvWzBdICkiIGlzIHVzZWQgYmVjYXVzZSBpdCBpcyBkYW5nZXJvdXMgdG8gZGV0ZXJtaW5lIHRoZSBsZW5ndGggb2YgdGhlIFZhbHVlIGZpZWxkIGJ5CiAqICAgZGVjcmVtZW50aW5nIGluZm9bMF0uIEFzIGEgcmVzdWx0IG9mIGEgYnVnIGluIHNvbWUgdmVyc2lvbiBvZiB0aGUgRi9XLCBpbmZvWzBdIG1heSBiZSAwLCByZXN1bHRpbmcKICogICBpbiBhIHZlcnkgbG9uZyBsb29wIGluIHRoZSBwcmUtZGVjcmVtZW50IGxvZ2ljLgogKjQ6IEluIGNhc2Ugb2YgYSBsaW5rIHN0YXR1cyBmcmFtZSwgdGhlIGluZm9ybWF0aW9uIGlzIGNvcGllZCB0byB0aGUgSUZCIGZpZWxkIElGQl9saW5rU3RhdAogKjY6IEFsbCBvdGhlciB0aGFuIFRhbGxpZXMgKGluY2x1ZGluZyAidW5rbm93biIgb25lcykgYXJlIGNoZWNrZWQgYWdhaW5zdCB0aGUgc2VsZWN0aW9uIHNldCBieSB0aGUgTVNGCiAqICAgdmlhIENGR19SSURfTE9HLiBJZiBhIG1hdGNoIGlzIGZvdW5kIG9yIHRoZSBzZWxlY3Rpb24gc2V0IGhhcyB0aGUgd2lsZC1jYXJkIHR5cGUgKGkuZSBub24tTlVMTCBidWZmZXIKICogICBwb2ludGVyIGF0IHRoZSB0ZXJtaW5hdGluZyB6ZXJvLXR5cGUpLCB0aGUgZnJhbWUgaXMgY29waWVkIHRvIHRoZSAodHlwZS1zcGVjaWZpYykgbG9nIGJ1ZmZlci4KICogICBOb3RlIHRoYXQgdG8gYWNjdW11bGF0ZSB0YWxsaWVzIGludG8gSUZCIEFORCB0byBsb2cgdGhlbSBvciB0byBsb2cgYSBmcmFtZSB3aGVuIGEgc3BlY2lmaWMgbWF0Y2ggb2NjdXJlcwogKiAgIEFORCBiYXNlZCBvbiB0aGUgd2lsZC1jYXJkIHNlbGVjdGlvbiwgeW91IGhhdmUgdG8gY2FsbCBzZXR1cF9iYXAgYWdhaW4gYWZ0ZXIgdGhlIDFzdCBjb3B5LgogKgogKi5FTkRET0MgICAgICAgICAgICAgICAgRU5EIERPQ1VNRU5UQVRJT04KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KSENGX1NUQVRJQyB2b2lkCmlzcl9pbmZvKCBJRkJQIGlmYnAgKQp7CgloY2ZfMTYgIGluZm9bMl0sIGZpZDsKI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfSU5GT19MT0cKCVJJRF9MT0dQICAgIHJpZHAgPSBpZmJwLT5JRkJfUklETG9ncDsgICAvL05VTEwgb3IgcG9pbnRlciB0byBhcnJheSBvZiBSSURfTE9HIHN0cnVjdHVyZXMgKHRlcm1pbmF0ZWQgYnkgemVybyB0eXApCiNlbmRpZiAvLyBIQ0ZfRVhUX0lORk9fTE9HCgoJSENGVFJBQ0UoIGlmYnAsIEhDRl9UUkFDRV9JU1JfSU5GTyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEgKi8KCWZpZCA9IElQVyggSFJFR19JTkZPX0ZJRCApOwoJREFXQV9aRVJPX0ZJRCggSFJFR19JTkZPX0ZJRCApOwoJaWYgKCBmaWQgKSB7CgkJKHZvaWQpc2V0dXBfYmFwKCBpZmJwLCBmaWQsIDAsIElPX0lOICk7CgkJZ2V0X2ZyYWcoIGlmYnAsICh3Y2lfYnVmcClpbmZvLCA0IEJFX1BBUigyKSApOwoJCUhDRkFTU0VSVCggaW5mb1swXSA8PSBIQ0ZfTUFYX0xUViArIDEsIE1FUkdFXzIoIGluZm9bMV0sIGluZm9bMF0gKSApOyAgLy87PyBhIHNtYWxsZXIgdmFsdWUgbWFrZXMgbW9yZSBzZW5zZQojaWYgKEhDRl9UQUxMSUVTKSAmIEhDRl9UQUxMSUVTX05JQyAgICAgLy9IZXJtZXMgdGFsbHkgc3VwcG9ydAoJCWlmICggaW5mb1sxXSA9PSBDRkdfVEFMTElFUyApIHsKCQkJaGNmXzMyICAqcDsKCQkvKjIqLyAgIGlmICggaW5mb1swXSA+IEhDRl9OSUNfVEFMX0NOVCApIHsKCQkJCWluZm9bMF0gPSBIQ0ZfTklDX1RBTF9DTlQgKyAxOwoJCQl9CgkJCXAgPSAoaGNmXzMyKikmaWZicC0+SUZCX05JQ19UYWxsaWVzOwoJCQl3aGlsZSAoIGluZm9bMF0tLSA+MSApICpwKysgKz0gSVBXKCBIUkVHX0RBVEFfMSApOyAgLy9yZXF1ZXN0IG1heSByZXR1cm4gemVybyBsZW5ndGgKCQl9CgkJZWxzZQojZW5kaWYgLy8gSENGX1RBTExJRVNfTklDCgkJewoJCS8qNCovICAgaWYgKCBpbmZvWzFdID09IENGR19MSU5LX1NUQVQgKSB7CgkJCQlpZmJwLT5JRkJfTGlua1N0YXQgPSBJUFcoIEhSRUdfREFUQV8xICk7CgkJCX0KI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfSU5GT19MT0cKCQkvKjYqLyAgIHdoaWxlICggMSApIHsKCQkJCWlmICggcmlkcC0+dHlwID09IDAgfHwgcmlkcC0+dHlwID09IGluZm9bMV0gKSB7CgkJCQkJaWYgKCByaWRwLT5idWZwICkgewoJCQkJCQlIQ0ZBU1NFUlQoIHJpZHAtPmxlbiA+PSAyLCByaWRwLT50eXAgKTsKCQkJCQkJcmlkcC0+YnVmcFswXSA9IG1pbigoaGNmXzE2KShyaWRwLT5sZW4gLSAxKSwgaW5mb1swXSApOyAgICAgLy9zYXZlIEwKCQkJCQkJcmlkcC0+YnVmcFsxXSA9IGluZm9bMV07ICAgICAgICAgICAgICAgICAgICAgICAgLy9zYXZlIFQKCQkJCQkJZ2V0X2ZyYWcoIGlmYnAsICh3Y2lfYnVmcCkmcmlkcC0+YnVmcFsyXSwgKHJpZHAtPmJ1ZnBbMF0gLSAxKSoyIEJFX1BBUigwKSApOwoJCQkJCX0KCQkJCQlicmVhazsKCQkJCX0KCQkJCXJpZHArKzsKCQkJfQojZW5kaWYgLy8gSENGX0VYVF9JTkZPX0xPRwoJCX0KCQlIQ0ZUUkFDRSggaWZicCwgSENGX1RSQUNFX0lTUl9JTkZPIHwgSENGX1RSQUNFX0VYSVQgKTsKCX0KCXJldHVybjsKfSAvLyBpc3JfaW5mbwoKLy8KLy8KLy8gI2VuZGlmIC8vIEhDRl9UQUxMSUVTX05JQwovLyAvKjQqLyAgICBpZiAoIGluZm9bMV0gPT0gQ0ZHX0xJTktfU1RBVCApIHsKLy8gICAgICAgICAgaWZicC0+SUZCX0RTTGlua1N0YXQgPSBJUFcoIEhSRUdfREFUQV8xICkgfCBDRkdfTElOS19TVEFUX0NIQU5HRTsgICAvL2NvcnJ1cHRzIEJBUCAhISA7PwovLyAgICAgICAgICBpZmJwLT5JRkJfTGlua1N0YXQgPSBpZmJwLT5JRkJfRFNMaW5rU3RhdCAmIENGR19MSU5LX1NUQVRfRlc7IC8vOz8gdG8gYmUgb2Jzb2xldGVkCi8vICAgICAgICAgIHByaW50ayggIjw0PmxpbmtzdGF0dXM6ICUwNHhcbiIsIGlmYnAtPklGQl9EU0xpbmtTdGF0ICk7ICAgICAgICAvLzs/cmVtb3ZlIG1lIDEgZGF5Ci8vICNpZiAoSENGX1NMRUVQKSAmIEhDRl9ERFMKLy8gICAgICAgICAgaWYgKCAoIGlmYnAtPklGQl9EU0xpbmtTdGF0ICYgQ0ZHX0xJTktfU1RBVF9DT05ORUNURUQgKSA9PSAwICkgeyAgICAvL2V2ZW4gdmFsdWVzIGFyZSBkaXNjb25uZWN0ZWQgZXRjLgovLyAgICAgICAgICAgICAgaWZicC0+SUZCX1RpY2tDbnQgPSAwOyAgICAgICAgICAgICAgLy9zdGFydCAyIHNlY29uZCBwZXJpb2QgKHdpdGggMSB0aWNrIHVuY2VydGFudHkpCi8vICAgICAgICAgICAgICBwcmludGsoICI8NT5pc3JfaW5mbzogQXdhaXRDb25uZWN0aW9uIHBoYXNlIHN0YXJ0ZWQsIElGQl9UaWNrQ250ID0gMFxuIiApOyAgICAgIC8vOz9yZW1vdmUgbWUgMSBkYXkKLy8gICAgICAgICAgfQovLyAjZW5kaWYgLy8gSENGX0REUwovLyAgICAgIH0KLy8gI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfSU5GT19MT0cKLy8gLyo2Ki8gICAgd2hpbGUgKCAxICkgewovLyAgICAgICAgICBpZiAoIHJpZHAtPnR5cCA9PSAwIHx8IHJpZHAtPnR5cCA9PSBpbmZvWzFdICkgewovLyAgICAgICAgICAgICAgaWYgKCByaWRwLT5idWZwICkgewovLyAgICAgICAgICAgICAgICAgIEhDRkFTU0VSVCggcmlkcC0+bGVuID49IDIsIHJpZHAtPnR5cCApOwovLyAgICAgICAgICAgICAgICAgICh2b2lkKXNldHVwX2JhcCggaWZicCwgZmlkLCAyLCBJT19JTiApOyAgICAgICAgIC8vcmVzdG9yZSBCQVAgZm9yIHRhbGxpZXMsIGxpbmtzdGF0IGFuZCBzcGVjaWZpYyB0eXBlIGZvbGxvd2VkIGJ5IHdpbGQgY2FyZAovLyAgICAgICAgICAgICAgICAgIHJpZHAtPmJ1ZnBbMF0gPSBtaW4oIHJpZHAtPmxlbiAtIDEsIGluZm9bMF0gKTsgIC8vc2F2ZSBMCi8vICAgICAgICAgICAgICAgICAgZ2V0X2ZyYWcoIGlmYnAsICh3Y2lfYnVmcCkmcmlkcC0+YnVmcFsxXSwgcmlkcC0+YnVmcFswXSoyIEJFX1BBUigwKSApOwovLyAgICAgICAgICAgICAgfQovLyAgICAgICAgICAgICAgYnJlYWs7IC8vOz90aGlzIGJyZWFrIGlzIG5vIGxvbmdlciBuZWVkZWQgZHVlIHRvIHNldHVwX2JhcCBidXQgbGV0cyBjb25jZW50cmF0ZSBvbiBERFMgZmlyc3QKLy8gICAgICAgICAgfQovLyAgICAgICAgICByaWRwKys7Ci8vICAgICAgfQovLyAjZW5kaWYgLy8gSENGX0VYVF9JTkZPX0xPRwovLyAgfQovLyAgSENGVFJBQ0UoIGlmYnAsIEhDRl9UUkFDRV9JU1JfSU5GTyB8IEhDRl9UUkFDRV9FWElUICk7Ci8vCi8vCi8vCi8vCi8vICByZXR1cm47Ci8vfSAvLyBpc3JfaW5mbwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICouU1VCTU9EVUxFICAgICB2b2lkIG1kZF9hc3NlcnQoIElGQlAgaWZicCwgdW5zaWduZWQgaW50IGxpbmVfbnVtYmVyLCBoY2ZfMzIgcSApCiAqLlBVUlBPU0UgICAgICAgZmlsdGVycyBhc3NlcnQgb24gbGV2ZWwgYW5kIGludGVyZmFjZXMgdG8gdGhlIE1TRiBzdXBwbGllZCBtc2ZfYXNzZXJ0IHJvdXRpbmUuCiAqCiAqLkFSR1VNRU5UUwogKiAgIGlmYnAgICAgICAgIGFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawogKiAgIGxpbmVfbnVtYmVyIGxpbmUgbnVtYmVyIG9mIHRoZSBsaW5lIHdoaWNoIGNhdXNlZCB0aGUgYXNzZXJ0CiAqICAgcSAgICAgICAgICAgcXVhbGlmaWVyLCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHdoaWNoIG1heSBnaXZlIGEgY2x1ZSBhYm91dCB0aGUgcHJvYmxlbQogKgogKi5SRVRVUk5TICAgICAgIE4uQS4KICoKICouREVTQ1JJUFRJT04KICoKICoKICouRElBR1JBTQogKgogKi5OT1RJQ0UKICogbWRkX2Fzc2VydCBoYXMgYmVlbiB0aHJvdWdoIGEgdHVybW9pbCwgcmVuYW1pbmcgaGNmX2Fzc2VydCB0byBhc3NlcnQgYW5kIGhjZl9hc3NlcnQgYWdhaW4gYW5kIHN1cHBvcnRpbmcgb2ZmCiAqIGFuZCBvbiBiZWluZyBjYWxsZWQgZnJvbSB0aGUgTVNGIGxldmVsIGFuZCBvdGhlciAoIGltbWF0dXJlICkgTW9kdWxhckRyaXZlckRldmVsb3BtZW50IG1vZHVsZXMgbGlrZSBESEYgYW5kCiAqIE1NRC4KICogISEhISBUaGUgYXNzZXJ0IHJvdXRpbmUgaXMgbm90IGFuIGhjZl8uLi4uLiByb3V0aW5lIGluIHRoZSBzZW5zZSB0aGF0IGl0IG1heSBiZSBjYWxsZWQgYnkgdGhlIE1TRiwKICogICAgICBob3dldmVyIGl0IGlzIGNhbGxlZCBmcm9tIG1tZC5jIGFuZCBkaGYuYywgc28gaXQgbXVzdCBiZSBleHRlcm5hbC4KICogICAgICBUbyBwcmV2ZW50IG5hbWVzcGFjZSBwb2xsdXRpb24gaXQgbmVlZHMgYSBwcmVmaXgsIHRvIHByZXZlbnQgdGhhdCBNU0YgcHJvZ3JhbW1lcnMgdGhpbmsgdGhhdAogKiAgICAgIHRoZXkgYXJlIGFsbG93ZWQgdG8gY2FsbCB0aGUgYXNzZXJ0IGxvZ2ljLCB0aGUgcHJlZml4IEhDRiBjYW4ndCBiZSB1c2VkLCBzbyBNREQgaXMgc2VsZWN0ZWQhISEhCiAqCiAqIFdoZW4gY2FsbGVkIGZyb20gdGhlIERIRiBtb2R1bGUgdGhlIGxpbmUgbnVtYmVyIGlzIGluY3JlbWVudGVkIGJ5IERIRl9GSUxFX05BTUVfT0ZGU0VUIGFuZCB3aGVuIGNhbGxlZCBmcm9tCiAqIHRoZSBNTUQgbW9kdWxlIGJ5IE1NRF9GSUxFX05BTUVfT0ZGU0VULgogKgogKi5FTkRET0MgICAgICAgICAgICAgICAgRU5EIERPQ1VNRU5UQVRJT04KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2lmIEhDRl9BU1NFUlQKdm9pZAptZGRfYXNzZXJ0KCBJRkJQIGlmYnAsIHVuc2lnbmVkIGludCBsaW5lX251bWJlciwgaGNmXzMyIHEgKQp7CgloY2ZfMTYgIHJ1bl90aW1lX2ZsYWcgPSBpZmJwLT5JRkJfQXNzZXJ0THZsOwoKCWlmICggcnVuX3RpbWVfZmxhZyAvKiA+IDs/Pz8/Pz8gKi8gKSB7IC8vcHJldmVudCByZWN1cnNpdmUgYmVoYXZpb3IsIGxhdGVyIHRvIGJlIGV4dGVuZGVkIHRvIGxldmVsIGZpbHRlcmluZwoJCWlmYnAtPklGQl9Bc3NlcnRRdWFsaWZpZXIgPSBxOwoJCWlmYnAtPklGQl9Bc3NlcnRMaW5lID0gKGhjZl8xNilsaW5lX251bWJlcjsKI2lmIChIQ0ZfQVNTRVJUKSAmICggSENGX0FTU0VSVF9MTktfTVNGX1JUTiB8IEhDRl9BU1NFUlRfUlRfTVNGX1JUTiApCgkJaWYgKCBpZmJwLT5JRkJfQXNzZXJ0UnRuICkgewoJCQlpZmJwLT5JRkJfQXNzZXJ0UnRuKCBsaW5lX251bWJlciwgaWZicC0+SUZCX0Fzc2VydFRyYWNlLCBxICk7CgkJfQojZW5kaWYgLy8gSENGX0FTU0VSVF9MTktfTVNGX1JUTiAvIEhDRl9BU1NFUlRfUlRfTVNGX1JUTgojaWYgKEhDRl9BU1NFUlQpICYgSENGX0FTU0VSVF9TV19TVVAKCQlPUFcoIEhSRUdfU1dfMiwgbGluZV9udW1iZXIgKTsKCQlPUFcoIEhSRUdfU1dfMiwgaWZicC0+SUZCX0Fzc2VydFRyYWNlICk7CgkJT1BXKCBIUkVHX1NXXzIsIChoY2ZfMTYpcSApOwoJCU9QVyggSFJFR19TV18yLCAoaGNmXzE2KShxID4+IDE2ICkgKTsKI2VuZGlmIC8vIEhDRl9BU1NFUlRfU1dfU1VQCgojaWYgKEhDRl9BU1NFUlQpICYgSENGX0FTU0VSVF9NQgoJCWlmYnAtPklGQl9Bc3NlcnRMdmwgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZXZlbnQgcmVjdXJzaXZlIGJlaGF2aW9yCgkJaGNmX3B1dF9pbmZvKCBpZmJwLCAoTFRWUCkmaWZicC0+SUZCX0Fzc2VydFN0cmN0ICk7CgkJaWZicC0+SUZCX0Fzc2VydEx2bCA9IHJ1bl90aW1lX2ZsYWc7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdG9yZSBhcHByb3ByaWF0ZSBmaWx0ZXIgbGV2ZWwKI2VuZGlmIC8vIEhDRl9BU1NFUlRfTUIKCX0KfSAvLyBtZGRfYXNzZXJ0CiNlbmRpZiAvLyBIQ0ZfQVNTRVJUCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKi5TVUJNT0RVTEUgICAgIHZvaWQgcHV0X2ZyYWcoIElGQlAgaWZicCwgd2NpX2J1ZnAgYnVmcCwgaW50IGxlbiBCRV9QQVIoIGludCB3b3JkX2xlbiApICkKICouUFVSUE9TRSAgICAgICB3cml0ZXMgd2l0aCAxNi8zMiBiaXQgSS9PIHZpYSBCQVAxIHBvcnQgZnJvbSBIb3N0IG1lbW9yeSB0byBOSUMgUkFNLgogKgogKi5BUkdVTUVOVFMKICogICBpZmJwICAgICAgICBhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKICogICBidWZwICAgICAgICAoYnl0ZSkgYWRkcmVzcyBvZiBidWZmZXIKICogICBsZW4gICAgICAgICBsZW5ndGggaW4gYnl0ZXMgb2YgYnVmZmVyIHNwZWNpZmllZCBieSBidWZwCiAqICAgd29yZF9sZW4gICAgQmlnIEVuZGlhbiBvbmx5OiBudW1iZXIgb2YgbGVhZGluZyBieXRlcyB0byBzd2FwIGluIHBhaXJzCiAqCiAqLlJFVFVSTlMgICAgICAgTi5BLgogKgogKi5ERVNDUklQVElPTgogKiBwcm9jZXNzIHRoZSBzaW5nbGUgYnl0ZSAoaWYgYXBwbGljYWJsZSkgbm90IHlldCB3cml0dGVuIGJ5IHRoZSBwcmV2aW91cyBwdXRfZnJhZyBhbmQgY29weSBsZW4KICogKG9yIGxlbi0xKSBieXRlcyBmcm9tIGJ1ZnAgdG8gTklDLgogKgogKgogKi5ESUFHUkFNCiAqCiAqLk5PVElDRQogKiAgIEl0IHR1cm5zIG91dCBET1MgT0RJIHVzZXMgemVybyBsZW5ndGggZnJhZ21lbnRzLiBUaGUgSENGIGNvZGUgY2FuIGNvcGUgd2l0aCBpdCwgYnV0IGFzIGEgY29uc2VxdWVuY2UsIG5vCiAqICAgQXNzZXJ0IG9uIGxlbiBpcyBwb3NzaWJsZQogKgogKi5FTkRET0MgICAgICAgICAgICAgICAgRU5EIERPQ1VNRU5UQVRJT04KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KSENGX1NUQVRJQyB2b2lkCnB1dF9mcmFnKCBJRkJQIGlmYnAsIHdjaV9idWZwIGJ1ZnAsIGludCBsZW4gQkVfUEFSKCBpbnQgd29yZF9sZW4gKSApCnsKCWhjZl9pbyAgICAgIGlvX3BvcnQgPSBpZmJwLT5JRkJfSU9CYXNlICsgSFJFR19EQVRBXzE7ICAgLy9CQVAgZGF0YSByZWdpc3RlcgoJaW50ICAgICAgICAgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3ByZXZlbnQgc2lkZSBlZmZlY3RzIGZyb20gbWFjcm8KCWhjZl8xNiAgICAgIGo7CglIQ0ZBU1NFUlQoICgoaGNmXzMyKWJ1ZnAgJiAoSENGX0FMSUdOLTEpICkgPT0gMCwgKGhjZl8zMilidWZwICk7CiNpZiBIQ0ZfQklHX0VORElBTgoJSENGQVNTRVJUKCB3b3JkX2xlbiA9PSAwIHx8IHdvcmRfbGVuID09IDIgfHwgd29yZF9sZW4gPT0gNCwgd29yZF9sZW4gKTsKCUhDRkFTU0VSVCggd29yZF9sZW4gPT0gMCB8fCAoKGhjZl8zMilidWZwICYgMSApID09IDAsIChoY2ZfMzIpYnVmcCApOwoJSENGQVNTRVJUKCB3b3JkX2xlbiA8PSBsZW4sIE1FUkdFXzIoIHdvcmRfbGVuLCBsZW4gKSApOwoKCWlmICggd29yZF9sZW4gKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lmIHRoZXJlIGlzIGFueXRoaW5nIHRvIGNvbnZlcnQKCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgY29udmVydCBhbmQgd3JpdGUgdGhlIDFzdCBoY2ZfMTYKCQlqID0gYnVmcFsxXSB8IGJ1ZnBbMF08PDg7CgkJT1VUX1BPUlRfV09SRCggaW9fcG9ydCwgaiApOwoJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8uICB1cGRhdGUgcG9pbnRlciBhbmQgY291bnRlciBhY2NvcmRpbmdseQoJCWxlbiAtPSAyOwoJCWJ1ZnAgKz0gMjsKCQlpZiAoIHdvcmRfbGVuID4gMSApIHsgICAgICAgICAgIC8vLiAgaWYgdGhlcmUgaXMgdG8gY29udmVydCBtb3JlIHRoYW4gMSB3b3JkICggaS5lIDIgKQoJCQkgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIC4gIGNvbnZlcnQgYW5kIHdyaXRlIHRoZSAybmQgaGNmXzE2CgkJCWogPSBidWZwWzFdIHwgYnVmcFswXTw8ODsgICAvKmJ1ZnAgaXMgYWxyZWFkeSBpbmNyZW1lbnRlZCBieSAyKi8KCQkJT1VUX1BPUlRfV09SRCggaW9fcG9ydCwgaiApOwoJCQkgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIC4gIHVwZGF0ZSBwb2ludGVyIGFuZCBjb3VudGVyIGFjY29yZGluZ2x5CgkJCWxlbiAtPSAyOwoJCQlidWZwICs9IDI7CgkJfQoJfQojZW5kaWYgLy8gSENGX0JJR19FTkRJQU4KCWkgPSBsZW47CglpZiAoIGkgJiYgaWZicC0+SUZCX0NhcnJ5T3V0ICkgeyAgICAgICAgICAgICAgICAgICAgLy9za2lwIHplcm8tbGVuZ3RoCgkJaiA9ICgoKmJ1ZnApPDw4KSArICggaWZicC0+SUZCX0NhcnJ5T3V0ICYgMHhGRiApOwoJCU9VVF9QT1JUX1dPUkQoIGlvX3BvcnQsIGogKTsKCQlidWZwKys7IGktLTsKCQlpZmJwLT5JRkJfQ2FycnlPdXQgPSAwOwoJfQojaWYgKEhDRl9JTykgJiBIQ0ZfSU9fMzJCSVRTCgkvL3NraXAgemVyby1sZW5ndGggSS9PLCBzaW5nbGUgYnl0ZSBJL08gYW5kIEkvTyBub3Qgd29ydGh3aGlsZSAoaS5lLiBsZXNzIHRoYW4gNiBieXRlcylmb3IgRFcgbG9naWMKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiBidWZmZXIgbGVuZ3RoID49IDYgYW5kIDMyIGJpdHMgSS9PIHN1cHBvcnQKCWlmICggIShpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV8xNkJJVCkgJiYgaSA+PSA2ICkgewoJCWhjZl8zMiBGQVIgICpwNDsgLy9wcmV2ZW50IHNpZGUgZWZmZWN0cyBmcm9tIG1hY3JvCgkJaWYgKCAoIChoY2ZfMzIpYnVmcCAmIDB4MSApID09IDAgKSB7ICAgICAgICAgICAgLy8uICBpZiBidWZmZXIgYXQgbGVhc3Qgd29yZCBhbGlnbmVkCgkJCWlmICggKGhjZl8zMilidWZwICYgMHgyICkgeyAgICAgICAgICAgICAvLy4gIC4gIGlmIGJ1ZmZlciBub3QgZG91YmxlIHdvcmQgYWxpZ25lZAoJCQkJCQkJCS8vLiAgLiAgLiAgd3JpdGUgYSBzaW5nbGUgd29yZCB0byBnZXQgZG91YmxlIHdvcmQgYWxpZ25lZAoJCQkJaiA9ICood2NpX3JlY29yZHApYnVmcDsgICAgIC8vanVzdCB0byBoZWxwIGVhc2Ugd3JpdGluZyBtYWNyb3Mgd2l0aCBlbWJlZGRlZCBhc3NlbWJseQoJCQkJT1VUX1BPUlRfV09SRCggaW9fcG9ydCwgaiApOwoJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIC4gIC4gIGFkanVzdCBidWZmZXIgbGVuZ3RoIGFuZCBwb2ludGVyIGFjY29yZGluZ2x5CgkJCQlidWZwICs9IDI7IGkgLT0gMjsKCQkJfQoJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8uICAuICB3cml0ZSBhcyBtYW55IGRvdWJsZSB3b3JkIGFzIHBvc3NpYmxlCgkJCXA0ID0gKGhjZl8zMiBGQVIgKilidWZwOwoJCQlqID0gKGhjZl8xNilpLzQ7CgkJCU9VVF9QT1JUX1NUUklOR18zMiggaW9fcG9ydCwgcDQsIGogKTsKCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgLiAgYWRqdXN0IGJ1ZmZlciBsZW5ndGggYW5kIHBvaW50ZXIgYWNjb3JkaW5nbHkKCQkJYnVmcCArPSBpICYgfjB4MDAwMzsKCQkJaSAmPSAweDAwMDM7CgkJfQoJfQojZW5kaWYgLy8gSENGX0lPXzMyQklUUwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgbm8gMzItYml0IHN1cHBvcnQgT1IgYnl0ZSBhbGlnbmVkIE9SIDEgd29yZCBsZWZ0CglpZiAoIGkgKSB7CgkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIGlmIG9kZCBudW1iZXIgb2YgYnl0ZXMgbGVmdAoJCWlmICggaSAmIDB4MDAwMSApIHsKCQkJICAgICAgICAgICAgICAgICAgICAgICAgLy8uICAuICBzYXZlIGxlZnQgb3ZlciBieXRlIChiZWZvcmUgYnVmcCBpcyBjb3JydXB0ZWQpIGluIGNhcnJ5LCBzZXQgY2FycnkgZmxhZwoJCQlpZmJwLT5JRkJfQ2FycnlPdXQgPSAoaGNmXzE2KWJ1ZnBbaS0xXSB8IDB4MDEwMDsgICAgLy9ub3RlIHRoYXQgaSBhbmQgYnVmcCBhcmUgYWx3YXlzIHNpbXVsdGFuZW91c2x5IG1vZGlmaWVkLCAmYnVmcFtpLTFdIGlzIGludmFyaWFudAoJCX0KCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgd3JpdGUgYXMgbWFueSB3b3JkIGFzIHBvc3NpYmxlIGluICJhbGlnbm1lbnQgc2FmZSIgd2F5CgkJaiA9IChoY2ZfMTYpaS8yOwoJCU9VVF9QT1JUX1NUUklOR184XzE2KCBpb19wb3J0LCBidWZwLCBqICk7Cgl9Cn0gLy8gcHV0X2ZyYWcKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqLlNVQk1PRFVMRSAgICAgdm9pZCBwdXRfZnJhZ19maW5hbGl6ZSggSUZCUCBpZmJwICkKICouUFVSUE9TRSAgICAgICBjbGVhbnVwIGFmdGVyIHB1dF9mcmFnIGZvciB0cmFpbGluZyBvZGQgYnl0ZSBhbmQgTUlDIHRyYW5zZmVyIHRvIE5JQy4KICoKICouQVJHVU1FTlRTCiAqICAgaWZicCAgICAgICAgYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCiAqCiAqLlJFVFVSTlMgICAgICAgTi5BLgogKgogKi5ERVNDUklQVElPTgogKiBmaW5hbGl6ZSB0aGUgTUlDIGNhbGN1bGF0aW9uIHdpdGggdGhlIHBhZGRpbmcgcGF0dGVybiwgb3V0cHV0IHRoZSBsYXN0IGJ5dGUgKGlmIGFwcGxpY2FibGUpCiAqIG9mIHRoZSBtZXNzYWdlIGFuZCB0aGUgTUlDIHRvIHRoZSBUeEZTCiAqCiAqCiAqLkRJQUdSQU0KICoyOiAxIGJ5dGUgb2YgdGhlIGxhc3QgcHV0X2ZyYWcgbWF5IGJlIHN0aWxsIGluIElGQl9DYXJyeU91dCAoIHRoZSBwdXRfZnJhZyBjYXJyeSBob2xkZXIgKSwgc28gLi4uLi4uLi4KICogICAxIC0gMyBieXRlcyBvZiB0aGUgbGFzdCBwdXRfZnJhZyBtYXkgYmUgc3RpbGwgaW4gSUZCX3R4XzMyICggdGhlIE1JQyBlbmdpbmUgY2FycnkgaG9sZGVyICksIHNvIC4uLi4uLi4uCiAqICAgVGhlIGNhbGwgdG8gdGhlIE1JQyBjYWxjdWxhdGlvbiByb3V0aW5lIGZlZWRzIHRoZXNlIHJlbWFpbmluZyBieXRlcyAoaWYgYW55KSBvZiBwdXRfZnJhZyBhbmQgdGhlCiAqICAganVzdCBhcyBtYW55IGJ5dGVzIG9mIHRoZSBwYWRkaW5nIGFzIG5lZWRlZCB0byB0aGUgTUlDIGNhbGN1bGF0aW9uIGVuZ2luZS4gTm90ZSB0aGF0IHRoZSAidW5uZWVkZWQiIHBhZAogKiAgIGJ5dGVzIHNpbXBseSBlbmQgdXAgaW4gdGhlIE1JQyBlbmdpbmUgY2FycnkgaG9sZGVyIGFuZCBhcmUgbmV2ZXIgdXNlZC4KICo4OiB3cml0ZSB0aGUgcmVtYWluZGVyIG9mIHRoZSBNSUMgYW5kIHBvc3NpYmxlIHNvbWUgZ2FyYmFnZSB0byBOSUMgUkFNCiAqICAgTm90ZTogaSBpcyBhbHdheXMgNCAoYSBsb29wLWludmFyaWFudCBvZiB0aGUgd2hpbGUgaW4gcG9pbnQgMikKICoKICouTk9USUNFCiAqCiAqLkVORERPQyAgICAgICAgICAgICAgICBFTkQgRE9DVU1FTlRBVElPTgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpIQ0ZfU1RBVElDIHZvaWQKcHV0X2ZyYWdfZmluYWxpemUoIElGQlAgaWZicCApCnsKI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XUEEKCWlmICggaWZicC0+SUZCX01JQ1R4Q2FycnkgIT0gMHhGRkZGKSB7ICAgICAgLy9pZiBNSUMgY2FsY3VsYXRpb24gYWN0aXZlCgkJQ0FMQ19UWF9NSUMoIG1pY19wYWQsIDgpOyAgICAgICAgICAgICAgIC8vLiAgZmVlZCAodXAgdG8gOCBieXRlcyBvZikgdmlydHVhbCBwYWRkaW5nIHRvIE1JQyBlbmdpbmUKCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8uICB3cml0ZSAocG9zc2libHkpIHRyYWlsaW5nIGJ5dGUgKyAobW9zdCBvZikgTUlDCgkJcHV0X2ZyYWcoIGlmYnAsICh3Y2lfYnVmcClpZmJwLT5JRkJfTUlDVHgsIDggQkVfUEFSKDApICk7Cgl9CiNlbmRpZiAvLyBIQ0ZfVFlQRV9XUEEKCXB1dF9mcmFnKCBpZmJwLCBudWxsX2FkZHIsIDEgQkVfUEFSKDApICk7ICAgLy93cml0ZSAocG9zc2libHkpIHRyYWlsaW5nIGRhdGEgb3IgTUlDIGJ5dGUKfSAvLyBwdXRfZnJhZ19maW5hbGl6ZQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICouU1VCTU9EVUxFICAgICBpbnQgcHV0X2luZm8oIElGQlAgaWZicCwgTFRWUCBsdHZwICkKICouUFVSUE9TRSAgICAgICBzdXBwb3J0IHJvdXRpbmUgdG8gaGFuZGxlIHRoZSAiYmFzaWMiIHRhc2sgb2YgaGNmX3B1dF9pbmZvIHRvIHBhc3MgUklEcyB0byB0aGUgTklDLgogKgogKi5BUkdVTUVOVFMKICogICBpZmJwICAgICAgICBhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKICogICBsdHZwICAgICAgICBhZGRyZXNzIGluIE5JQyBSQU0gd2hlcmUgTFZULXJlY29yZHMgYXJlIGxvY2F0ZWQKICoKICouUkVUVVJOUwogKiAgIEhDRl9TVUNDRVNTCiAqICAgPj5wdXRfZnJhZwogKiAgID4+Y21kX3dhaXQKICoKICouREVTQ1JJUFRJT04KICoKICoKICouRElBR1JBTQogKjIwOiBkbyBub3Qgd3JpdGUgUklEcyB0byBOSUNzIHdoaWNoIGhhdmUgaW5jb21wYXRpYmxlIEZpcm13YXJlCiAqMjQ6IElmIHRoZSBSSUQgZG9lcyBub3QgZXhpc3QsIHRoZSBMLWZpZWxkIGlzIHNldCB0byB6ZXJvLgogKiAgIE5vdGUgdGhhdCBzb21lIFJJRHMgY2FuIG5vdCBiZSByZWFkLCBlLmcuIHRoZSBwc2V1ZG8gUklEcyBmb3IgZGlyZWN0IEhlcm1lcyBjb21tYW5kcyBhbmQgQ0ZHX0RFRkFVTFRfS0VZUwogKjI4OiBJZiB0aGUgUklEIGlzIHdyaXR0ZW4gc3VjY2Vzc2Z1bCwgcGFzcyBpdCB0byB0aGUgTklDIGJ5IG1lYW5zIG9mIGFuIEFjY2VzcyBXcml0ZSBjb21tYW5kCiAqCiAqLk5PVElDRQogKiAgIFRoZSBtZWNoYW5pc20gdG8gSENGX0FTU0VSVCBvbiBpbnZhbGlkIHR5cC1jb2RlcyBpbiB0aGUgTFRWIHJlY29yZCBpcyBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIHN0cmF0ZWd5OgogKiAgICAgLSBzb21lIGNvZGVzIChlLmcuIENGR19SRUdfTUIpIGFyZSBleHBsaWNpdGx5IGhhbmRsZWQgYnkgdGhlIEhDRiB3aGljaCBpbXBsaWVzIHRoYXQgdGhlc2UgY29kZXMKICogICAgICAgYXJlIHZhbGlkLiBUaGVzZSBjb2RlcyBhcmUgYWxyZWFkeSBjb25zdW1lZCBieSBoY2ZfcHV0X2luZm8uCiAqICAgICAtIGFsbCBvdGhlciBjb2RlcyBhcmUgcGFzc2VkIHRvIHRoZSBIZXJtZXMuIEJlZm9yZSB0aGUgcHV0IGFjdGlvbiBpcyBleGVjdXRlZCwgaGNmX2dldF9pbmZvIGlzIGNhbGxlZAogKiAgICAgICB3aXRoIGFuIExUViByZWNvcmQgd2l0aCBhIHZhbHVlIG9mIDEgaW4gdGhlIEwtZmllbGQgYW5kIHRoZSBpbnRlbmRlZCBwdXQgYWN0aW9uIHR5cGUgaW4gdGhlIFR5cC1jb2RlCiAqICAgICAgIGZpZWxkLiBJZiB0aGUgcHV0IGFjdGlvbiB0eXBlIGlzIHZhbGlkLCBpdCBpcyBhbHNvIHZhbGlkIGFzIGEgZ2V0IGFjdGlvbiB0eXBlIGNvZGUgLSBleGNlcHQKICogICAgICAgZm9yIENGR19ERUZBVUxUX0tFWVMgYW5kIENGR19BRERfVEtJUF9ERUZBVUxUX0tFWSAtIHNvIHRoZSBIQ0ZfQVNTRVJUIGxvZ2ljIG9mIGhjZl9nZXRfaW5mbyBzaG91bGQKICogICAgICAgbm90IGNhdGNoLgogKgogKi5FTkRET0MgICAgICAgICAgICAgICAgRU5EIERPQ1VNRU5UQVRJT04KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KSENGX1NUQVRJQyBpbnQKcHV0X2luZm8oIElGQlAgaWZicCwgTFRWUCBsdHZwICApCnsKCglpbnQgcmMgPSBIQ0ZfU1VDQ0VTUzsKCglIQ0ZBU1NFUlQoIGlmYnAtPklGQl9DYXJkU3RhdCA9PSAwLCBNRVJHRV8yKCBsdHZwLT50eXAsIGlmYnAtPklGQl9DYXJkU3RhdCApICk7CglIQ0ZBU1NFUlQoIENGR19SSURfQ0ZHX01JTiA8PSBsdHZwLT50eXAgJiYgbHR2cC0+dHlwIDw9IENGR19SSURfQ0ZHX01BWCwgbHR2cC0+dHlwICk7CgoJaWYgKCBpZmJwLT5JRkJfQ2FyZFN0YXQgPT0gMCAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyMCovCgkgICAgICggKCBDRkdfUklEX0NGR19NSU4gPD0gbHR2cC0+dHlwICAgICYmIGx0dnAtPnR5cCA8PSBDRkdfUklEX0NGR19NQVggKSB8fAoJICAgICAgICggQ0ZHX1JJRF9FTkdfTUlOIDw9IGx0dnAtPnR5cCAvKiAmJiBsdHZwLT50eXAgPD0gMHhGRkZGICovICAgICAgICkgICAgICkgKSB7CiNpZiBIQ0ZfQVNTRVJUIC8vRkNDOCwgRkNCMCwgRkNCNCwgRkNCNiwgRkNCNywgRkNCOCwgRkNDMCwgRkNDNCwgRkNCQywgRkNCRCwgRkNCRSwgRkNCRgoJCXsKCQkJaGNmXzE2ICAgICB0ID0gbHR2cC0+dHlwOwoJCQlMVFZfU1RSQ1QgIHggPSB7IDIsIHQsIHswfSB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjI0Ki8KCQkJaGNmX2dldF9pbmZvKCBpZmJwLCAoTFRWUCkmeCApOwoJCQlpZiAoIHgubGVuID09IDAgJiYKCQkJICAgICAoIHQgIT0gQ0ZHX0RFRkFVTFRfS0VZUyAmJiB0ICE9IENGR19BRERfVEtJUF9ERUZBVUxUX0tFWSAmJiB0ICE9IENGR19SRU1PVkVfVEtJUF9ERUZBVUxUX0tFWSAmJgoJCQkgICAgICAgdCAhPSBDRkdfQUREX1RLSVBfTUFQUEVEX0tFWSAmJiB0ICE9IENGR19SRU1PVkVfVEtJUF9NQVBQRURfS0VZICYmCgkJCSAgICAgICB0ICE9IENGR19IQU5ET1ZFUl9BRERSICYmIHQgIT0gQ0ZHX0RJU0FTU09DSUFURV9BRERSICYmCgkJCSAgICAgICB0ICE9IENGR19GQ0JDICYmIHQgIT0gQ0ZHX0ZDQkQgJiYgdCAhPSBDRkdfRkNCRSAmJiB0ICE9IENGR19GQ0JGICYmCgkJCSAgICAgICB0ICE9IENGR19ERUFVVEhFTlRJQ0FURV9BRERSCgkJCQkgICAgICkKCQkJCSkgewoJCQkJSENGQVNTRVJUKCBET19BU1NFUlQsIGx0dnAtPnR5cCApOwoJCQl9CgkJfQojZW5kaWYgLy8gSENGX0FTU0VSVAoKCQlyYyA9IHNldHVwX2JhcCggaWZicCwgbHR2cC0+dHlwLCAwLCBJT19PVVQgKTsKCQlwdXRfZnJhZyggaWZicCwgKHdjaV9idWZwKWx0dnAsIDIqbHR2cC0+bGVuICsgMiBCRV9QQVIoMikgKTsKCS8qMjgqLyAgaWYgKCByYyA9PSBIQ0ZfU1VDQ0VTUyApIHsKCQkJcmMgPSBjbWRfZXhlKCBpZmJwLCBIQ01EX0FDQ0VTUyArIEhDTURfQUNDRVNTX1dSSVRFLCBsdHZwLT50eXAgKTsKCQl9Cgl9CglyZXR1cm4gcmM7Cn0gLy8gcHV0X2luZm8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqLlNVQk1PRFVMRSAgICAgaW50IHB1dF9pbmZvX21iKCBJRkJQIGlmYnAsIENGR19NQl9JTkZPX1NUUkNUIEZBUiAqIGx0dnAgKQogKi5QVVJQT1NFICAgICAgIGFjY3VtdWxhdGVzIGEgKCBzZXJpZXMgb2YpIGJ1ZmZlcnMgaW50byBhIHNpbmdsZSBJbmZvIGJsb2NrIGludG8gdGhlIE1haWxCb3guCiAqCiAqLkFSR1VNRU5UUwogKiAgIGlmYnAgICAgICAgIGFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawogKiAgIGx0dnAgICAgICAgIGFkZHJlc3Mgb2Ygc3RydWN0dXJlIHNwZWNpZnlpbmcgdGhlICJ0eXBlIiBhbmQgdGhlIGZyYWdtZW50cyBvZiB0aGUgaW5mb3JtYXRpb24gdG8gYmUgc3ludGhlc2l6ZWQKICogICAgICAgICAgICAgICBhcyBhbiBMVFYgaW50byB0aGUgTWFpbEJveAogKgogKi5SRVRVUk5TCiAqCiAqLkRFU0NSSVBUSU9OCiAqIElmIHRoZSBkYXRhIGRvZXMgbm90IGZpdCAoaW5jbHVkaW5nIG5vIE1haWxCb3ggaXMgYXZhaWxhYmxlKSwgdGhlIElGQl9NQlRhbGx5IGlzIGluY3JlbWVudGVkIGFuZCBhbgogKiBlcnJvciBzdGF0dXMgaXMgcmV0dXJuZWQuCiAqIEhDRl9BU1NFUlQgZG9lcyBub3QgY2F0Y2guCiAqIENhbGxpbmcgcHV0X2luZm9fbWIgd2hlbiB0aGVpciBpcyBubyBNYWlsQm94IGF2YWlsYWJsZSwgaXMgY29uc2lkZXJlZCBhIGRlc2lnbiBlcnJvciBpbiB0aGUgTVNGLgogKgogKiBOb3RlIHRoYXQgdGhlcmUgaXMgYWx3YXlzIGF0IGxlYXN0IDEgd29yZCBvZiB1bnVzZWQgc3BhY2UgaW4gdGhlIG1haWwgYm94LgogKiBBcyBhIGNvbnNlcXVlbmNlOgogKiAtIG5vIHByb2JsZW0gaW4gcG9pbnRlciBhcml0aG1ldGljIChNQl9SUCA9PSBNQl9XUCBtZWFucyB1bmFtYmlndW91c2x5IG1haWwgYm94IGlzIGNvbXBsZXRlbHkgZW1wdHkKICogLSBUaGVyZSBpcyBhbHdheXMgZnJlZSBzcGFjZSB0byB3cml0ZSBhbiBMIGZpZWxkIHdpdGggYSB2YWx1ZSBvZiB6ZXJvIGFmdGVyIGVhY2ggTUJfSW5mbyBibG9jay4gIFRoaXMKICogICBhbGxvd3MgZm9yIGFuIGVhc3kgc2NhbiBtZWNoYW5pc20gaW4gdGhlICJnZXQgTUJfSW5mbyBibG9jayIgbG9naWMuCiAqCiAqCiAqLkRJQUdSQU0KICoxOiBDYWxjdWxhdGUgTCBmaWVsZCBvZiB0aGUgTUJJQiwgaS5lLiAxIGZvciB0aGUgVC1maWVsZCArIHRoZSBjdW11bGF0aXZlIGxlbmd0aCBvZiB0aGUgZnJhZ21lbnRzLgogKjI6IFRoZSBmcmVlIHNwYWNlIGluIHRoZSBNYWlsQm94IGlzIGNhbGN1bGF0ZWQgKDJhOiBmcmVlIHBhcnQgZnJvbSBXcml0ZSBQdHIgdG8gUmVhZCBQdHIsIDJiOiBmcmVlIHBhcnQKICogICB0dXJucyBvdXQgdG8gd3JhcCBhcm91bmQpIC4gSWYgdGhpcyBzcGFjZSBzdWZmaWNlcyB0byBzdG9yZSB0aGUgbnVtYmVyIG9mIHdvcmRzIHJlZmxlY3RlZCBieSBsZW4gKFQtZmllbGQKICogICArIFZhbHVlLWZpZWxkKSBwbHVzIHRoZSBhZGRpdGlvbmFsIE1haWxCb3ggSW5mbyBMLWZpZWxkICsgYSB0cmFpbGluZyAwIHRvIGFjdCBhcyB0aGUgTC1maWVsZCBvZiBhIHRyYWlsaW5nCiAqICAgZHVtbXkgb3IgZW1wdHkgTFRWIHJlY29yZCwgdGhlbiBhIE1haWxCb3ggSW5mbyBibG9jayBpcyBidWlsZCBpbiB0aGUgTWFpbEJveCBjb25zaXN0aW5nIG9mCiAqICAgICAtIHRoZSB2YWx1ZSBsZW4gaW4gdGhlIGZpcnN0IHdvcmQKICogICAgIC0gdHlwZSBpbiB0aGUgc2Vjb25kIHdvcmQKICogICAgIC0gYSBjb3B5IG9mIHRoZSBjb250ZW50cyBvZiB0aGUgZnJhZ21lbnRzIGluIHRoZSBzZWNvbmQgYW5kIGhpZ2hlciB3b3JkCiAqCiAqNDogU2luY2UgcHV0X2luZm9fbWIoKSBjYW4gbW9yZSBvciBsZXNzIGRpcmVjdGx5IGJlIGNhbGxlZCBmcm9tIHRoZSBNU0YgbGV2ZWwsIHRoZSBJL0YgbXVzdCBiZSByb2J1c3QKICogICBhZ2FpbnN0IG91dC1vZi1yYW5nZSB2YXJpYWJsZXMuIEFzIGZhaWxzYWZlIGNvZGluZywgdGhlIE1CIHVwZGF0ZSBpcyBza2lwcGVkIGJ5IGNoYW5naW5nIHRsZW4gdG8gMCBpZgogKiAgIGxlbiA9PSAwOyBUaGlzIHdpbGwgaW5kaXJlY3RseSBjYXVzZSBhbiBhc3NlcnQgYXMgcmVzdWx0IG9mIHRoZSB2aW9sYXRpb24gb2YgdGhlIG5leHQgaWYgY2xhdXNlLgogKjY6IENoZWNrIHdoZXRoZXIgdGhlIGZyZWUgc3BhY2UgaW4gTWFpbEJveCBzdWZmaWNlcyAodGhpcyBjb3ZlcnMgdGhlIGNvbXBsZXRlIGFic2VuY2Ugb2YgdGhlIE1haWxCb3gpLgogKiAgIE5vdGUgdGhhdCBsZW4gaXMgdW5zaWduZWQsIHNvIGV2ZW4gTVNGIEkvRiB2aW9sYXRpb24gd29ya3Mgb3V0IE8uSy4KICogICBUaGUgJzInIGluIHRoZSBleHByZXNzaW9uICJsZW4rMiIgaXMgdXNlZCBiZWNhdXNlIDEgd29yZCBpcyBuZWVkZWQgZm9yIEwgaXRzZWxmIGFuZCAxIHdvcmQgaXMgbmVlZGVkCiAqICAgZm9yIHRoZSB6ZXJvLXNlbnRpbmVsCiAqODogdXBkYXRlIE1haWxCb3ggSW5mbyBsZW5ndGggcmVwb3J0IHRvIE1TRiB3aXRoICJvbGRlc3QiIE1CIEluZm8gQmxvY2sgc2l6ZS4gQmUgY2FyZWZ1bCBoZXJlLCBpZiB5b3UgZ2V0CiAqICAgaGVyZSBiZWZvcmUgdGhlIE1haWxCb3ggaXMgcmVnaXN0ZXJlZCwgeW91IGNhbid0IHJlYWQgZnJvbSB0aGUgYnVmZmVyIGFkZHJlc3NlZCBieSBJRkJfTUJwIChpdCBpcyB0aGUKICogICBOdWxsIGJ1ZmZlcikgc28gZG9uJ3QgbW92ZSB0aGlzIGNvZGUgdGlsbCB0aGUgZW5kIG9mIHRoaXMgcm91dGluZSBidXQga2VlcCBpdCB3aGVyZSB0aGVyZSBpcyBnYXJ1YW50ZWVkCiAqICAgYSBidWZmZXIuCiAqCiAqLk5PVElDRQogKiAgIGJvdW5kYXJ5IHRlc3RpbmcgZGVwZW5kcyBvbiB0aGUgZmFjdCB0aGF0IElGQl9NQlNpemUgaXMgZ3VhcmFudGVlZCB0byBiZSB6ZXJvIGlmIG5vIE1haWxCb3ggaXMgcHJlc2VudCwKICogICBhbmQgdG8gYSBsZXNzZXIgZGVncmVlLCB0aGF0IElGQl9NQldwID0gSUZCX01CUnAgPSAwCiAqCiAqLkVORERPQyAgICAgICAgICAgICAgICBFTkQgRE9DVU1FTlRBVElPTgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKSENGX1NUQVRJQyBpbnQKcHV0X2luZm9fbWIoIElGQlAgaWZicCwgQ0ZHX01CX0lORk9fU1RSQ1QgRkFSICogbHR2cCApCnsKCglpbnQgICAgICAgICByYyA9IEhDRl9TVUNDRVNTOwoJaGNmXzE2ICAgICAgaTsgICAgICAgICAgICAgICAgICAgICAgLy93b3JrIGNvdW50ZXIKCWhjZl8xNiAgICAgICpkcDsgICAgICAgICAgICAgICAgICAgIC8vZGVzdGluYXRpb24gcG9pbnRlciAoaW4gTWFpbEJveCkKCXdjaV9yZWNvcmRwIHNwOyAgICAgICAgICAgICAgICAgICAgIC8vc291cmNlIHBvaW50ZXIKCWhjZl8xNiAgICAgIGxlbjsgICAgICAgICAgICAgICAgICAgIC8vdG90YWwgbGVuZ3RoIHRvIGNvcHkgdG8gTWFpbEJveAoJaGNmXzE2ICAgICAgdGxlbjsgICAgICAgICAgICAgICAgICAgLy9mcmVlIGxlbmd0aC93b3JraW5nIGxlbmd0aC9vZmZzZXQgaW4gV01QIGZyYW1lCgoJaWYgKCBpZmJwLT5JRkJfTUJwID09IE5VTEwgKSByZXR1cm4gcmM7ICAvLzs/bm90IHN1ZmZpY2llbnQKCUhDRkFTU0VSVCggaWZicC0+SUZCX01CcCAhPSBOVUxMLCAwICk7ICAgICAgICAgICAgICAgICAgIC8vISEhYmUgY2FyZWZ1bCwgZG9uJ3QgZ2V0IGludG8gYW4gZW5kbGVzcyByZWN1cnNpb24KCUhDRkFTU0VSVCggaWZicC0+SUZCX01CU2l6ZSwgMCApOwoKCWxlbiA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxICovCglmb3IgKCBpID0gMDsgaSA8IGx0dnAtPmZyYWdfY250OyBpKysgKSB7CgkJbGVuICs9IGx0dnAtPmZyYWdfYnVmW2ldLmZyYWdfbGVuOwoJfQoJaWYgKCBpZmJwLT5JRkJfTUJScCA+IGlmYnAtPklGQl9NQldwICkgewoJCXRsZW4gPSBpZmJwLT5JRkJfTUJScCAtIGlmYnAtPklGQl9NQldwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDJhKi8KCX0gZWxzZSB7CgkJaWYgKCBpZmJwLT5JRkJfTUJScCA9PSBpZmJwLT5JRkJfTUJXcCApIHsKCQkJaWZicC0+SUZCX01CUnAgPSBpZmJwLT5JRkJfTUJXcCA9IDA7ICAgIC8vIG9wdGltaXplIFdyYXBwaW5nCgkJfQoJCXRsZW4gPSBpZmJwLT5JRkJfTUJTaXplIC0gaWZicC0+SUZCX01CV3A7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDJiKi8KCQlpZiAoICggdGxlbiA8PSBsZW4gKyAyICkgJiYgKCBsZW4gKyAyIDwgaWZicC0+SUZCX01CUnAgKSApIHsgICAgLy9pZiB0cmFpbGluZyBzcGFjZSBpcyB0b28gc21hbGwgYnV0CgkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBsZWFkaW5nIHNwYWNlIGlzIHN1ZmZpY2llbnRseSBsYXJnZQoJCQlpZmJwLT5JRkJfTUJwW2lmYnAtPklGQl9NQldwXSA9IDB4RkZGRjsgICAgICAgICAgICAgICAgIC8vZmxhZyBkdW1teSBMVFYgdG8gZmlsbCB0aGUgdHJhaWxpbmcgc3BhY2UKCQkJaWZicC0+SUZCX01CV3AgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3Jlc2V0IFdyaXRlUG9pbnRlciB0byBiZWdpbiBvZiBNYWlsQm94CgkJCXRsZW4gPSBpZmJwLT5JRkJfTUJScDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9nZXQgbmV3IGF2YWlsYWJsZSBzcGFjZSBzaXplCgkJfQoJfQoJZHAgPSAmaWZicC0+SUZCX01CcFtpZmJwLT5JRkJfTUJXcF07CglpZiAoIGxlbiA9PSAwICkgewoJCXRsZW4gPSAwOyAvLzs/IHdoYXQgaXMgdGhpcyBnb29kIGZvcgoJfQoJaWYgKCBsZW4gKyAyID49IHRsZW4gKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDYgKi8KCQkvL0RvIE5vdCBBU1NFUlQsIHRoaXMgaXMgYSBub3JtYWwgY29uZGl0aW9uCgkJSUZfVEFMTFkoIGlmYnAtPklGQl9IQ0ZfVGFsbGllcy5Ob0J1Zk1CKysgKTsKCQlyYyA9IEhDRl9FUlJfTEVOOwoJfSBlbHNlIHsKCQkqZHArKyA9IGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3dyaXRlIExlbiAoPSBzaXplIG9mIFQrViBpbiB3b3JkcyB0byBNQl9JbmZvIGJsb2NrCgkJKmRwKysgPSBsdHZwLT5iYXNlX3R5cDsgICAgICAgICAgICAgICAgICAgICAgICAgLy93cml0ZSBUeXBlIHRvIE1CX0luZm8gYmxvY2sKCQlpZmJwLT5JRkJfTUJXcCArPSBsZW4gKyAxOyAgICAgICAgICAgICAgICAgICAgICAvL3VwZGF0ZSBXcml0ZVBvaW50ZXIgb2YgTWFpbEJveAoJCWZvciAoIGkgPSAwOyBpIDwgbHR2cC0+ZnJhZ19jbnQ7IGkrKyApIHsgICAgICAgICAgICAgICAgLy8gcHJvY2VzcyBlYWNoIG9mIHRoZSBmcmFnbWVudHMKCQkJc3AgPSBsdHZwLT5mcmFnX2J1ZltpXS5mcmFnX2FkZHI7CgkJCWxlbiA9IGx0dnAtPmZyYWdfYnVmW2ldLmZyYWdfbGVuOwoJCQl3aGlsZSAoIGxlbi0tICkgKmRwKysgPSAqc3ArKzsKCQl9CgkJaWZicC0+SUZCX01CcFtpZmJwLT5JRkJfTUJXcF0gPSAwOyAgICAgICAgICAgICAgLy90byBhc3N1cmUgZ2V0X2luZm8gZm9yIENGR19NQl9JTkZPIHN0b3BzCgkJaWZicC0+SUZCX01CSW5mb0xlbiA9IGlmYnAtPklGQl9NQnBbaWZicC0+SUZCX01CUnBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOCAqLwoJfQoJcmV0dXJuIHJjOwp9IC8vIHB1dF9pbmZvX21iCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKi5TVUJNT0RVTEUgICAgIGludCBzZXR1cF9iYXAoIElGQlAgaWZicCwgaGNmXzE2IGZpZCwgaW50IG9mZnNldCwgaW50IHR5cGUgKQogKi5QVVJQT1NFICAgICAgIHNldCB1cCBkYXRhIGFjY2VzcyB0byBOSUMgUkFNIHZpYSBCQVBfMS4KICoKICouQVJHVU1FTlRTCiAqICAgaWZicCAgICAgICAgICAgIGFkZHJlc3Mgb2YgSS9GIEJsb2NrCiAqICAgZmlkICAgICAgICAgICAgIEZJRC9SSUQKICogICBvZmZzZXQgICAgICAgICAgISFldmVuISEgb2Zmc2V0IGluIEZJRC9SSUQKICogICB0eXBlICAgICAgICAgICAgSU9fSU4sIElPX09VVAogKgogKi5SRVRVUk5TCiAqICAgSENGX1NVQ0NFU1MgICAgICAgICAgICAgICAgIE8uSwogKiAgIEhDRl9FUlJfTk9fTklDICAgICAgICAgICAgICBjYXJkIGlzIHJlbW92ZWQKICogICBIQ0ZfRVJSX0RFRlVOQ1RfVElNRV9PVVQgICAgRmF0YWwgbWFsZnVuY3Rpb24gZGV0ZWN0ZWQKICogICBIQ0ZfRVJSX0RFRlVOQ1RfLi4uLi4gICAgICAgaWYgYW5kIG9ubHkgaWYgSUZCX0RlZnVuY3RTdGF0IDw+IDAKICoKICouREVTQ1JJUFRJT04KICoKICogQSBub24temVybyByZXR1cm4gc3RhdHVzIGluZGljYXRlczoKICogLSB0aGUgTklDIGlzIGNvbnNpZGVyZWQgbm9ub3BlcmF0aW9uYWwsIGUuZy4gZHVlIHRvIGEgdGltZS1vdXQgb2Ygc29tZSBIZXJtZXMgYWN0aXZpdHkgaW4gdGhlIHBhc3QKICogLSBCQVBfMSBjb3VsZCBub3QgcHJvcGVybHkgYmUgaW5pdGlhbGl6ZWQKICogLSB0aGUgY2FyZCBpcyByZW1vdmVkIGJlZm9yZSBjb21wbGV0aW9uIG9mIHRoZSBkYXRhIHRyYW5zZmVyCiAqIEluIGFsbCBvdGhlciBjYXNlcywgYSB6ZXJvIGlzIHJldHVybmVkLgogKiBCQVAgSW5pdGlhbGl6YXRpb24gZmFpbHVyZSBpbmRpY2F0ZXMgYW4gSC9XIGVycm9yIHdoaWNoIGlzIHZlcnkgbGlrZWx5IHRvIHNpZ25hbCBjb21wbGV0ZSBIL1cgZmFpbHVyZS4KICogT25jZSBhIEJBUCBJbml0aWFsaXphdGlvbiBmYWlsdXJlIGhhcyBvY2N1cnJlZCBhbGwgc3Vic2VxdWVudCBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgSGVybWVzIHdpbGwgcmV0dXJuIGEKICogImRlZnVuY3QiIHN0YXR1cyB0aWxsIHRoZSBIZXJtZXMgaXMgcmUtaW5pdGlhbGl6ZWQgYnkgbWVhbnMgb2YgYW4gaGNmX2Nvbm5lY3QuCiAqCiAqIEEgQkFQIGlzIGEgc2V0IG9mIHJlZ2lzdGVycyAoT2Zmc2V0LCBTZWxlY3QgYW5kIERhdGEpIG9mZmVyaW5nIHJlYWQvd3JpdGUgYWNjZXNzIHRvIGEgcGFydGljdWxhciBGSUQgb3IKICogUklELiBUaGlzIGFjY2VzcyBpcyBiYXNlZCBvbiBhIGF1dG8taW5jcmVtZW50IGZlYXR1cmUuCiAqIFRoZXJlIGFyZSB0d28gQkFQcyBidXQgdGhlc2UgZGF5cyB0aGUgSENGIHVzZXMgb25seSBCQVBfMSBhbmQgbGVhdmVzIEJBUF8wIHRvIHRoZSBQQ0kgQnVzbWFzdGVyaW5nIEgvVy4KICoKICogVGhlIEJBUC1tZWNoYW5pc20gaXMgYmFzZWQgb24gdGhlIEJ1c3kgYml0IGluIHRoZSBPZmZzZXQgcmVnaXN0ZXIgKHNlZSB0aGUgSGVybWVzIGRlZmluaXRpb24pLiBUaGUgd2FpdGluZwogKiBmb3IgQnVzeSBtdXN0IG9jY3VyIGJldHdlZW4gd3JpdGluZyB0aGUgT2Zmc2V0IHJlZ2lzdGVyIGFuZCBhY2Nlc3NpbmcgdGhlIERhdGEgcmVnaXN0ZXIuIFRoZQogKiBpbXBsZW1lbnRhdGlvbiB0byB3YWl0IGZvciB0aGUgQnVzeSBiaXQgZHJvcCBhZnRlciBlYWNoIHdyaXRlIHRvIHRoZSBPZmZzZXQgcmVnaXN0ZXIsIGltcGxpZXMgdGhhdCB0aGUKICogcmVxdWlyZW1lbnQgdGhhdCB0aGUgQnVzeSBiaXQgaXMgbG93ICBiZWZvcmUgdGhlIFNlbGVjdCByZWdpc3RlciBpcyB3cml0dGVuLCBpcyBhdXRvbWF0aWNhbGx5IG1ldC4KICogQkFQLXNldHVwIG1heSBiZSB0aW1lIGNvbnN1bWluZyAoZS5nLiAzODAgdXNlYyBmb3IgbGFyZ2Ugb2Zmc2V0cyBvY2N1cnMgZnJlcXVlbnRseSkuIFRoZSB3YWl0IGZvciBCdXN5IGJpdAogKiBkcm9wIGlzIHByb3RlY3RlZCBieSBhIGxvb3AgY291bnRlciwgd2hpY2ggaXMgaW5pdGlhbGl6ZWQgd2l0aCBJRkJfVGlja0luaSwgd2hpY2ggaXMgY2FsaWJyYXRlZCBpbiBpbml0LgogKgogKiBUaGUgTklDIEkvRiBpcyBvcHRpbWl6ZWQgZm9yIHdvcmQgdHJhbnNmZXIgYW5kIGNhbiBvbmx5IGhhbmRsZSB3b3JkIHRyYW5zZmVyIGF0IGEgd29yZCBib3VuZGFyeSBpbiBOSUMKICogUkFNLiBUaGUgaW50ZW5kZWQgc29sdXRpb24gZm9yIHRyYW5zZmVyIG9mIGEgc2luZ2xlIGJ5dGUgaGFzIG11bHRpcGxlIEgvVyBmbGF3cy4gVGhlcmUgaGF2ZSBiZWVuIGRpZmZlcmVudAogKiBTL1cgV29ya2Fyb3VuZCBzdHJhdGVnaWVzLiBSSUQgYWNjZXNzIGlzIGhjZl8xNiBiYXNlZCBieSAibmF0dXJlIiwgc28gbm8gYnl0ZSBhY2Nlc3MgcHJvYmxlbXMuICBGb3IgVHgvUngKICogRklEIGFjY2VzcywgIHRoZSBieXRlIGxvZ2ljIGJlY2FtZSBvYnNvbGV0ZSBieSBhYnNvcmJpbmcgaXQgaW4gdGhlIGRvdWJsZSB3b3JkIG9yaWVudGVkIG5hdHVyZSBvZiB0aGUgTUlDCiAqIGZlYXR1cmUuCiAqCiAqCiAqLkRJQUdSQU0KICoKICoyOiB0aGUgdGVzdCBvbiByYyBjaGVja3Mgd2hldGhlciB0aGUgSENGIHdlbnQgaW50byAiZGVmdW5jdCIgbW9kZSAoIGUuZy4gQkFQIGluaXRpYWxpemF0aW9uIG9yIGEgY2FsbCB0bwogKiAgIGNtZF93YWl0IGRpZCBldmVyIGZhaWwpLgogKjQ6IHRoZSBzZWxlY3QgcmVnaXN0ZXIgYW5kIG9mZnNldCByZWdpc3RlciBhcmUgc2V0CiAqICAgdGhlIG9mZnNldCByZWdpc3RlciBpcyBtb25pdG9yZWQgdGlsbCBhIHN1Y2Nlc3NmdWwgY29uZGl0aW9uIChubyBidXN5IGJpdCkgaXMgZGV0ZWN0ZWQgb3IgdGlsbCB0aGUKICogICAoY2FsaWJyYXRlZCkgcHJvdGVjdGlvbiBjb3VudGVyIGV4cGlyZXMKICogICBJZiB0aGUgY291bnRlciBleHBpcmVzLCB0aGlzIGlzIHJlZmxlY3RlZCBpbiBJRkJfRGVmdW5jdFN0YXQsIHNvIGFsbCBzdWJzZXF1ZW50IGNhbGxzIHRvIHNldHVwX2JhcCBmYWlsCiAqICAgaW1tZWRpYXRlbHkgKCBzZWUgMikKICo2OiBpbml0aWFsaXphdGlvbiBvZiB0aGUgY2FycnkgYXMgdXNlZCBieSBwZXQvZ2V0X2ZyYWcKICo4OiBIUkVHX09GRlNFVF9FUlIgaXMgaWdub3JlZCBhcyBlcnJvciBiZWNhdXNlOgogKiAgICBhOiB0aGUgSGVybWVzIGlzIHJvYnVzdCBhZ2FpbnN0IGl0CiAqICAgIGI6IGl0IGlzIG5vdCBrbm93biB3aGF0IGNhdXNlcyBpdCAocHJvYmFibHkgYSBidWcpLCBoZW5jZSBubyBzdHJhdGVneSBjYW4gYmUgc3BlY2lmaWVkIHdoaWNoIGxldmVsIGlzCiAqICAgICAgIHRvIGhhbmRsZSB0aGlzIGVycm9yIGluIHdoaWNoIHdheS4gSW4gdGhlIHBhc3QsIGl0IGNvdWxkIGJlIGluZHVjZWQgYnkgdGhlIE1TRiBsZXZlbCwgZS5nLiBieSBjYWxsaW5nCiAqICAgICAgIGhjZl9yY3ZfbXNnIHdoaWxlIHRoZXJlIHdhcyBubyBSeC1GSUQgYXZhaWxhYmxlLiBTaW5jZSB0aGlzIGlzIGFuIE1TRi1lcnJvciB3aGljaCBpcyBjYXVnaHQgYnkgQVNTRVJULAogKiAgICAgICB0aGVyZSBpcyBubyBydW4tdGltZSBhY3Rpb24gcmVxdWlyZWQgYnkgdGhlIEhDRi4KICogICBMdW1waW5nIHRoZSBPZmZzZXQgZXJyb3IgaW4gd2l0aCB0aGUgQnVzeSBiaXQgZXJyb3IsIGFzIGhhcyBiZWVuIGRvbmUgaW4gdGhlIHBhc3QgdHVybnMgb3V0IHRvIGJlIGEKICogICBkaXNhc3RlciBvciBhIGxpZmUgc2F2ZXIsIGp1c3QgZGVwZW5kaW5nIG9uIHdoYXQgdGhlIGNhdXNlIG9mIHRoZSBlcnJvciBpcy4gU2luY2Ugbm8gcHJlZGljdGlvbiBjYW4gYmUKICogICBkb25lIGFib3V0IHRoZSBmdXR1cmUsIGl0IGlzICJmZWx0IiB0byBiZSB0aGUgYmVzdCBzdHJhdGVneSB0byBpZ25vcmUgdGhpcyBlcnJvci4gT25lIGRheSB0aGUgY29kZSB3YXMKICogICBhY2NvbXBhbmllZCBieSB0aGUgZm9sbG93aW5nIGNvbW1lbnQ6CiAqICAgLy8gIGlnbm9yZSBIUkVHX09GRlNFVF9FUlIsIHNvbWVvbmUsIHN1cHBvc2VkbHkgdGhlIE1TRiBwcm9ncmFtbWVyIDspIG1hZGUgYSBidWcuIFNpbmNlIHdlIGRvbid0IGtub3cKICogICAvLyAgd2hhdCBpcyBnb2luZyBvbiwgd2UgbWlnaHQgYXMgd2VsbCBnbyBvbiAtIHVuZGVyIG1hbmFnZW1lbnQgcHJlc3N1cmUgLSBieSBpZ25vcmluZyBpdAogKgogKi5FTkRET0MgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBET0NVTUVOVEFUSU9OCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkhDRl9TVEFUSUMgaW50CnNldHVwX2JhcCggSUZCUCBpZmJwLCBoY2ZfMTYgZmlkLCBpbnQgb2Zmc2V0LCBpbnQgdHlwZSApCnsKCVBST1RfQ05UX0lOSTsKCWludCByYzsKCglIQ0ZUUkFDRSggaWZicCwgSENGX1RSQUNFX1NUUklPICk7CglyYyA9IGlmYnAtPklGQl9EZWZ1bmN0U3RhdDsKCWlmIChyYyA9PSBIQ0ZfU1VDQ0VTUykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjIqLwoJCU9QVyggSFJFR19TRUxFQ1RfMSwgZmlkICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjQqLwoJCU9QVyggSFJFR19PRkZTRVRfMSwgb2Zmc2V0ICk7CgkJaWYgKCB0eXBlID09IElPX0lOICkgewoJCQlpZmJwLT5JRkJfQ2FycnlJbiA9IDA7CgkJfQoJCWVsc2UgaWZicC0+SUZCX0NhcnJ5T3V0ID0gMDsKCQlIQ0ZfV0FJVF9XSElMRSggSVBXKCBIUkVHX09GRlNFVF8xKSAmIEhDTURfQlVTWSApOwoJCUhDRkFTU0VSVCggISggSVBXKCBIUkVHX09GRlNFVF8xKSAmIEhSRUdfT0ZGU0VUX0VSUiApLCBNRVJHRV8yKCBmaWQsIG9mZnNldCApICk7ICAgICAgICAgLyo4Ki8KCQlpZiAoIHByb3RfY250ID09IDAgKSB7CgkJCUhDRkFTU0VSVCggRE9fQVNTRVJULCBNRVJHRV8yKCBmaWQsIG9mZnNldCApICk7CgkJCXJjID0gaWZicC0+SUZCX0RlZnVuY3RTdGF0ID0gSENGX0VSUl9ERUZVTkNUX1RJTUVfT1VUOwoJCQlpZmJwLT5JRkJfQ2FyZFN0YXQgfD0gQ0FSRF9TVEFUX0RFRlVOQ1Q7CgkJfQoJfQoJSENGVFJBQ0UoIGlmYnAsIEhDRl9UUkFDRV9TVFJJTyB8IEhDRl9UUkFDRV9FWElUICk7CglyZXR1cm4gcmM7Cn0gLy8gc2V0dXBfYmFwCgo=