LyogY29ubmVjdGlvbi5jIC0gdGhlIGNvbm5lY3Rpb24gdHlwZQogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CiAqCiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgogKiAKICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcwogKiBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgogKgogKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKICogaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAogKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CiAqCiAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CiAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCiAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQogKiAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgogKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQogKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCiAqIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCiAqLwoKI2luY2x1ZGUgImNhY2hlLmgiCiNpbmNsdWRlICJtb2R1bGUuaCIKI2luY2x1ZGUgImNvbm5lY3Rpb24uaCIKI2luY2x1ZGUgInN0YXRlbWVudC5oIgojaW5jbHVkZSAiY3Vyc29yLmgiCiNpbmNsdWRlICJwcmVwYXJlX3Byb3RvY29sLmgiCiNpbmNsdWRlICJ1dGlsLmgiCiNpbmNsdWRlICJzcWxpdGVjb21wYXQuaCIKCiNpbmNsdWRlICJweXRocmVhZC5oIgoKI2RlZmluZSBBQ1RJT05fRklOQUxJWkUgMQojZGVmaW5lIEFDVElPTl9SRVNFVCAyCgojaWYgU1FMSVRFX1ZFUlNJT05fTlVNQkVSID49IDMwMDMwMDgKI2lmbmRlZiBTUUxJVEVfT01JVF9MT0FEX0VYVEVOU0lPTgojZGVmaW5lIEhBVkVfTE9BRF9FWFRFTlNJT04KI2VuZGlmCiNlbmRpZgoKc3RhdGljIGludCBweXNxbGl0ZV9jb25uZWN0aW9uX3NldF9pc29sYXRpb25fbGV2ZWwocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGlzb2xhdGlvbl9sZXZlbCk7CnN0YXRpYyB2b2lkIF9weXNxbGl0ZV9kcm9wX3VudXNlZF9jdXJzb3JfcmVmZXJlbmNlcyhweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmKTsKCgpzdGF0aWMgdm9pZCBfc3FsaXRlM19yZXN1bHRfZXJyb3Ioc3FsaXRlM19jb250ZXh0KiBjdHgsIGNvbnN0IGNoYXIqIGVycm1zZywgaW50IGxlbikKewogICAgLyogaW4gb2xkZXIgU1FMaXRlIHZlcnNpb25zLCBjYWxsaW5nIHNxbGl0ZTNfcmVzdWx0X2Vycm9yIGluIGNhbGxiYWNrcwogICAgICogdHJpZ2dlcnMgYSBidWcgaW4gU1FMaXRlIHRoYXQgbGVhZHMgZWl0aGVyIHRvIGlycml0YXRpbmcgcmVzdWx0cyBvcgogICAgICogc2VnZmF1bHRzLCBkZXBlbmRpbmcgb24gdGhlIFNRTGl0ZSB2ZXJzaW9uICovCiNpZiBTUUxJVEVfVkVSU0lPTl9OVU1CRVIgPj0gMzAwMzAwMwogICAgc3FsaXRlM19yZXN1bHRfZXJyb3IoY3R4LCBlcnJtc2csIGxlbik7CiNlbHNlCiAgICBQeUVycl9TZXRTdHJpbmcocHlzcWxpdGVfT3BlcmF0aW9uYWxFcnJvciwgZXJybXNnKTsKI2VuZGlmCn0KCmludCBweXNxbGl0ZV9jb25uZWN0aW9uX2luaXQocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCnsKICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiZGF0YWJhc2UiLCAidGltZW91dCIsICJkZXRlY3RfdHlwZXMiLCAiaXNvbGF0aW9uX2xldmVsIiwgImNoZWNrX3NhbWVfdGhyZWFkIiwgImZhY3RvcnkiLCAiY2FjaGVkX3N0YXRlbWVudHMiLCBOVUxMLCBOVUxMfTsKCiAgICBQeU9iamVjdCogZGF0YWJhc2U7CiAgICBpbnQgZGV0ZWN0X3R5cGVzID0gMDsKICAgIFB5T2JqZWN0KiBpc29sYXRpb25fbGV2ZWwgPSBOVUxMOwogICAgUHlPYmplY3QqIGZhY3RvcnkgPSBOVUxMOwogICAgaW50IGNoZWNrX3NhbWVfdGhyZWFkID0gMTsKICAgIGludCBjYWNoZWRfc3RhdGVtZW50cyA9IDEwMDsKICAgIGRvdWJsZSB0aW1lb3V0ID0gNS4wOwogICAgaW50IHJjOwogICAgUHlPYmplY3QqIGNsYXNzX2F0dHIgPSBOVUxMOwogICAgUHlPYmplY3QqIGNsYXNzX2F0dHJfc3RyID0gTlVMTDsKICAgIGludCBpc19hcHN3X2Nvbm5lY3Rpb24gPSAwOwogICAgUHlPYmplY3QqIGRhdGFiYXNlX3V0Zjg7CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT3xkaU9pT2kiLCBrd2xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YWJhc2UsICZ0aW1lb3V0LCAmZGV0ZWN0X3R5cGVzLCAmaXNvbGF0aW9uX2xldmVsLCAmY2hlY2tfc2FtZV90aHJlYWQsICZmYWN0b3J5LCAmY2FjaGVkX3N0YXRlbWVudHMpKQogICAgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBzZWxmLT5pbml0aWFsaXplZCA9IDE7CgogICAgc2VsZi0+YmVnaW5fc3RhdGVtZW50ID0gTlVMTDsKCiAgICBzZWxmLT5zdGF0ZW1lbnRfY2FjaGUgPSBOVUxMOwogICAgc2VsZi0+c3RhdGVtZW50cyA9IE5VTEw7CiAgICBzZWxmLT5jdXJzb3JzID0gTlVMTDsKCiAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICBzZWxmLT5yb3dfZmFjdG9yeSA9IFB5X05vbmU7CgogICAgUHlfSU5DUkVGKCZQeVVuaWNvZGVfVHlwZSk7CiAgICBzZWxmLT50ZXh0X2ZhY3RvcnkgPSAoUHlPYmplY3QqKSZQeVVuaWNvZGVfVHlwZTsKCiAgICBpZiAoUHlTdHJpbmdfQ2hlY2soZGF0YWJhc2UpIHx8IFB5VW5pY29kZV9DaGVjayhkYXRhYmFzZSkpIHsKICAgICAgICBpZiAoUHlTdHJpbmdfQ2hlY2soZGF0YWJhc2UpKSB7CiAgICAgICAgICAgIGRhdGFiYXNlX3V0ZjggPSBkYXRhYmFzZTsKICAgICAgICAgICAgUHlfSU5DUkVGKGRhdGFiYXNlX3V0ZjgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGRhdGFiYXNlX3V0ZjggPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKGRhdGFiYXNlKTsKICAgICAgICAgICAgaWYgKCFkYXRhYmFzZV91dGY4KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICAgICAgICByYyA9IHNxbGl0ZTNfb3BlbihQeVN0cmluZ19Bc1N0cmluZyhkYXRhYmFzZV91dGY4KSwgJnNlbGYtPmRiKTsKICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwoKICAgICAgICBQeV9ERUNSRUYoZGF0YWJhc2VfdXRmOCk7CgogICAgICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKICAgICAgICAgICAgX3B5c3FsaXRlX3NldGVycm9yKHNlbGYtPmRiLCBOVUxMKTsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgLyogQ3JlYXRlIGEgcHlzcWxpdGUgY29ubmVjdGlvbiBmcm9tIGFuIEFQU1cgY29ubmVjdGlvbiAqLwogICAgICAgIGNsYXNzX2F0dHIgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGRhdGFiYXNlLCAiX19jbGFzc19fIik7CiAgICAgICAgaWYgKGNsYXNzX2F0dHIpIHsKICAgICAgICAgICAgY2xhc3NfYXR0cl9zdHIgPSBQeU9iamVjdF9TdHIoY2xhc3NfYXR0cik7CiAgICAgICAgICAgIGlmIChjbGFzc19hdHRyX3N0cikgewogICAgICAgICAgICAgICAgaWYgKHN0cmNtcChQeVN0cmluZ19Bc1N0cmluZyhjbGFzc19hdHRyX3N0ciksICI8dHlwZSAnYXBzdy5Db25uZWN0aW9uJz4iKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgLyogSW4gdGhlIEFQU1cgQ29ubmVjdGlvbiBvYmplY3QsIHRoZSBmaXJzdCBlbnRyeSBhZnRlcgogICAgICAgICAgICAgICAgICAgICAqIFB5T2JqZWN0X0hFQUQgaXMgdGhlIHNxbGl0ZTMqIHdlIHdhbnQgdG8gZ2V0IGhvbGQgb2YuCiAgICAgICAgICAgICAgICAgICAgICogTHVja2lseSwgdGhpcyBpcyB0aGUgc2FtZSBsYXlvdXQgYXMgd2UgaGF2ZSBpbiBvdXIKICAgICAgICAgICAgICAgICAgICAgKiBweXNxbGl0ZV9Db25uZWN0aW9uICovCiAgICAgICAgICAgICAgICAgICAgc2VsZi0+ZGIgPSAoKHB5c3FsaXRlX0Nvbm5lY3Rpb24qKWRhdGFiYXNlKS0+ZGI7CgogICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihkYXRhYmFzZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi0+YXBzd19jb25uZWN0aW9uID0gZGF0YWJhc2U7CiAgICAgICAgICAgICAgICAgICAgaXNfYXBzd19jb25uZWN0aW9uID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBQeV9YREVDUkVGKGNsYXNzX2F0dHJfc3RyKTsKICAgICAgICBQeV9YREVDUkVGKGNsYXNzX2F0dHIpOwoKICAgICAgICBpZiAoIWlzX2Fwc3dfY29ubmVjdGlvbikgewogICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImRhdGFiYXNlIHBhcmFtZXRlciBtdXN0IGJlIHN0cmluZyBvciBBUFNXIENvbm5lY3Rpb24gb2JqZWN0Iik7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCFpc29sYXRpb25fbGV2ZWwpIHsKICAgICAgICBpc29sYXRpb25fbGV2ZWwgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKICAgICAgICBpZiAoIWlzb2xhdGlvbl9sZXZlbCkgewogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBQeV9JTkNSRUYoaXNvbGF0aW9uX2xldmVsKTsKICAgIH0KICAgIHNlbGYtPmlzb2xhdGlvbl9sZXZlbCA9IE5VTEw7CiAgICBpZiAocHlzcWxpdGVfY29ubmVjdGlvbl9zZXRfaXNvbGF0aW9uX2xldmVsKHNlbGYsIGlzb2xhdGlvbl9sZXZlbCkgPCAwKSB7CiAgICAgICAgUHlfREVDUkVGKGlzb2xhdGlvbl9sZXZlbCk7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgUHlfREVDUkVGKGlzb2xhdGlvbl9sZXZlbCk7CgogICAgc2VsZi0+c3RhdGVtZW50X2NhY2hlID0gKHB5c3FsaXRlX0NhY2hlKilQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0KikmcHlzcWxpdGVfQ2FjaGVUeXBlLCAiT2kiLCBzZWxmLCBjYWNoZWRfc3RhdGVtZW50cyk7CiAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBzZWxmLT5jcmVhdGVkX3N0YXRlbWVudHMgPSAwOwogICAgc2VsZi0+Y3JlYXRlZF9jdXJzb3JzID0gMDsKCiAgICAvKiBDcmVhdGUgbGlzdHMgb2Ygd2VhayByZWZlcmVuY2VzIHRvIHN0YXRlbWVudHMvY3Vyc29ycyAqLwogICAgc2VsZi0+c3RhdGVtZW50cyA9IFB5TGlzdF9OZXcoMCk7CiAgICBzZWxmLT5jdXJzb3JzID0gUHlMaXN0X05ldygwKTsKICAgIGlmICghc2VsZi0+c3RhdGVtZW50cyB8fCAhc2VsZi0+Y3Vyc29ycykgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICAvKiBCeSBkZWZhdWx0LCB0aGUgQ2FjaGUgY2xhc3MgSU5DUkVGcyB0aGUgZmFjdG9yeSBpbiBpdHMgaW5pdGlhbGl6ZXIsIGFuZAogICAgICogZGVjcmVmcyBpdCBpbiBpdHMgZGVhbGxvY2F0b3IgbWV0aG9kLiBTaW5jZSB0aGlzIHdvdWxkIGNyZWF0ZSBhIGNpcmN1bGFyCiAgICAgKiByZWZlcmVuY2UgaGVyZSwgd2UncmUgYnJlYWtpbmcgaXQgYnkgZGVjcmVtZW50aW5nIHNlbGYsIGFuZCB0ZWxsaW5nIHRoZQogICAgICogY2FjaGUgY2xhc3MgdG8gbm90IGRlY3JlZiB0aGUgZmFjdG9yeSAoc2VsZikgaW4gaXRzIGRlYWxsb2NhdG9yLgogICAgICovCiAgICBzZWxmLT5zdGF0ZW1lbnRfY2FjaGUtPmRlY3JlZl9mYWN0b3J5ID0gMDsKICAgIFB5X0RFQ1JFRihzZWxmKTsKCiAgICBzZWxmLT5pblRyYW5zYWN0aW9uID0gMDsKICAgIHNlbGYtPmRldGVjdF90eXBlcyA9IGRldGVjdF90eXBlczsKICAgIHNlbGYtPnRpbWVvdXQgPSB0aW1lb3V0OwogICAgKHZvaWQpc3FsaXRlM19idXN5X3RpbWVvdXQoc2VsZi0+ZGIsIChpbnQpKHRpbWVvdXQqMTAwMCkpOwojaWZkZWYgV0lUSF9USFJFQUQKICAgIHNlbGYtPnRocmVhZF9pZGVudCA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKI2VuZGlmCiAgICBzZWxmLT5jaGVja19zYW1lX3RocmVhZCA9IGNoZWNrX3NhbWVfdGhyZWFkOwoKICAgIHNlbGYtPmZ1bmN0aW9uX3BpbmJvYXJkID0gUHlEaWN0X05ldygpOwogICAgaWYgKCFzZWxmLT5mdW5jdGlvbl9waW5ib2FyZCkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBzZWxmLT5jb2xsYXRpb25zID0gUHlEaWN0X05ldygpOwogICAgaWYgKCFzZWxmLT5jb2xsYXRpb25zKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIHNlbGYtPldhcm5pbmcgICAgICAgICAgICAgICA9IHB5c3FsaXRlX1dhcm5pbmc7CiAgICBzZWxmLT5FcnJvciAgICAgICAgICAgICAgICAgPSBweXNxbGl0ZV9FcnJvcjsKICAgIHNlbGYtPkludGVyZmFjZUVycm9yICAgICAgICA9IHB5c3FsaXRlX0ludGVyZmFjZUVycm9yOwogICAgc2VsZi0+RGF0YWJhc2VFcnJvciAgICAgICAgID0gcHlzcWxpdGVfRGF0YWJhc2VFcnJvcjsKICAgIHNlbGYtPkRhdGFFcnJvciAgICAgICAgICAgICA9IHB5c3FsaXRlX0RhdGFFcnJvcjsKICAgIHNlbGYtPk9wZXJhdGlvbmFsRXJyb3IgICAgICA9IHB5c3FsaXRlX09wZXJhdGlvbmFsRXJyb3I7CiAgICBzZWxmLT5JbnRlZ3JpdHlFcnJvciAgICAgICAgPSBweXNxbGl0ZV9JbnRlZ3JpdHlFcnJvcjsKICAgIHNlbGYtPkludGVybmFsRXJyb3IgICAgICAgICA9IHB5c3FsaXRlX0ludGVybmFsRXJyb3I7CiAgICBzZWxmLT5Qcm9ncmFtbWluZ0Vycm9yICAgICAgPSBweXNxbGl0ZV9Qcm9ncmFtbWluZ0Vycm9yOwogICAgc2VsZi0+Tm90U3VwcG9ydGVkRXJyb3IgICAgID0gcHlzcWxpdGVfTm90U3VwcG9ydGVkRXJyb3I7CgogICAgcmV0dXJuIDA7Cn0KCi8qIEVtcHR5IHRoZSBlbnRpcmUgc3RhdGVtZW50IGNhY2hlIG9mIHRoaXMgY29ubmVjdGlvbiAqLwp2b2lkIHB5c3FsaXRlX2ZsdXNoX3N0YXRlbWVudF9jYWNoZShweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmKQp7CiAgICBweXNxbGl0ZV9Ob2RlKiBub2RlOwogICAgcHlzcWxpdGVfU3RhdGVtZW50KiBzdGF0ZW1lbnQ7CgogICAgbm9kZSA9IHNlbGYtPnN0YXRlbWVudF9jYWNoZS0+Zmlyc3Q7CgogICAgd2hpbGUgKG5vZGUpIHsKICAgICAgICBzdGF0ZW1lbnQgPSAocHlzcWxpdGVfU3RhdGVtZW50Kikobm9kZS0+ZGF0YSk7CiAgICAgICAgKHZvaWQpcHlzcWxpdGVfc3RhdGVtZW50X2ZpbmFsaXplKHN0YXRlbWVudCk7CiAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CiAgICB9CgogICAgUHlfU0VUUkVGKHNlbGYtPnN0YXRlbWVudF9jYWNoZSwKICAgICAgICAgICAgICAocHlzcWxpdGVfQ2FjaGUgKilQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0ICopJnB5c3FsaXRlX0NhY2hlVHlwZSwgIk8iLCBzZWxmKSk7CiAgICBQeV9ERUNSRUYoc2VsZik7CiAgICBzZWxmLT5zdGF0ZW1lbnRfY2FjaGUtPmRlY3JlZl9mYWN0b3J5ID0gMDsKfQoKLyogYWN0aW9uIGluIChBQ1RJT05fUkVTRVQsIEFDVElPTl9GSU5BTElaRSkgKi8Kdm9pZCBweXNxbGl0ZV9kb19hbGxfc3RhdGVtZW50cyhweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBpbnQgYWN0aW9uLCBpbnQgcmVzZXRfY3Vyc29ycykKewogICAgaW50IGk7CiAgICBQeU9iamVjdCogd2Vha3JlZjsKICAgIFB5T2JqZWN0KiBzdGF0ZW1lbnQ7CiAgICBweXNxbGl0ZV9DdXJzb3IqIGN1cnNvcjsKCiAgICBmb3IgKGkgPSAwOyBpIDwgUHlMaXN0X1NpemUoc2VsZi0+c3RhdGVtZW50cyk7IGkrKykgewogICAgICAgIHdlYWtyZWYgPSBQeUxpc3RfR2V0SXRlbShzZWxmLT5zdGF0ZW1lbnRzLCBpKTsKICAgICAgICBzdGF0ZW1lbnQgPSBQeVdlYWtyZWZfR2V0T2JqZWN0KHdlYWtyZWYpOwogICAgICAgIGlmIChzdGF0ZW1lbnQgIT0gUHlfTm9uZSkgewogICAgICAgICAgICBpZiAoYWN0aW9uID09IEFDVElPTl9SRVNFVCkgewogICAgICAgICAgICAgICAgKHZvaWQpcHlzcWxpdGVfc3RhdGVtZW50X3Jlc2V0KChweXNxbGl0ZV9TdGF0ZW1lbnQqKXN0YXRlbWVudCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAodm9pZClweXNxbGl0ZV9zdGF0ZW1lbnRfZmluYWxpemUoKHB5c3FsaXRlX1N0YXRlbWVudCopc3RhdGVtZW50KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBpZiAocmVzZXRfY3Vyc29ycykgewogICAgICAgIGZvciAoaSA9IDA7IGkgPCBQeUxpc3RfU2l6ZShzZWxmLT5jdXJzb3JzKTsgaSsrKSB7CiAgICAgICAgICAgIHdlYWtyZWYgPSBQeUxpc3RfR2V0SXRlbShzZWxmLT5jdXJzb3JzLCBpKTsKICAgICAgICAgICAgY3Vyc29yID0gKHB5c3FsaXRlX0N1cnNvciopUHlXZWFrcmVmX0dldE9iamVjdCh3ZWFrcmVmKTsKICAgICAgICAgICAgaWYgKChQeU9iamVjdCopY3Vyc29yICE9IFB5X05vbmUpIHsKICAgICAgICAgICAgICAgIGN1cnNvci0+cmVzZXQgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9Cgp2b2lkIHB5c3FsaXRlX2Nvbm5lY3Rpb25fZGVhbGxvYyhweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmKQp7CiAgICBQeU9iamVjdCogcmV0ID0gTlVMTDsKCiAgICBQeV9YREVDUkVGKHNlbGYtPnN0YXRlbWVudF9jYWNoZSk7CgogICAgLyogQ2xlYW4gdXAgaWYgdXNlciBoYXMgbm90IGNhbGxlZCAuY2xvc2UoKSBleHBsaWNpdGx5LiAqLwogICAgaWYgKHNlbGYtPmRiKSB7CiAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogICAgICAgIHNxbGl0ZTNfY2xvc2Uoc2VsZi0+ZGIpOwogICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCiAgICB9IGVsc2UgaWYgKHNlbGYtPmFwc3dfY29ubmVjdGlvbikgewogICAgICAgIHJldCA9IFB5T2JqZWN0X0NhbGxNZXRob2Qoc2VsZi0+YXBzd19jb25uZWN0aW9uLCAiY2xvc2UiLCAiIik7CiAgICAgICAgUHlfWERFQ1JFRihyZXQpOwogICAgICAgIFB5X1hERUNSRUYoc2VsZi0+YXBzd19jb25uZWN0aW9uKTsKICAgIH0KCiAgICBpZiAoc2VsZi0+YmVnaW5fc3RhdGVtZW50KSB7CiAgICAgICAgUHlNZW1fRnJlZShzZWxmLT5iZWdpbl9zdGF0ZW1lbnQpOwogICAgfQogICAgUHlfWERFQ1JFRihzZWxmLT5pc29sYXRpb25fbGV2ZWwpOwogICAgUHlfWERFQ1JFRihzZWxmLT5mdW5jdGlvbl9waW5ib2FyZCk7CiAgICBQeV9YREVDUkVGKHNlbGYtPnJvd19mYWN0b3J5KTsKICAgIFB5X1hERUNSRUYoc2VsZi0+dGV4dF9mYWN0b3J5KTsKICAgIFB5X1hERUNSRUYoc2VsZi0+Y29sbGF0aW9ucyk7CiAgICBQeV9YREVDUkVGKHNlbGYtPnN0YXRlbWVudHMpOwogICAgUHlfWERFQ1JFRihzZWxmLT5jdXJzb3JzKTsKCiAgICBQeV9UWVBFKHNlbGYpLT50cF9mcmVlKChQeU9iamVjdCopc2VsZik7Cn0KCi8qCiAqIFJlZ2lzdGVycyBhIGN1cnNvciB3aXRoIHRoZSBjb25uZWN0aW9uLgogKgogKiAwID0+IGVycm9yOyAxID0+IG9rCiAqLwppbnQgcHlzcWxpdGVfY29ubmVjdGlvbl9yZWdpc3Rlcl9jdXJzb3IocHlzcWxpdGVfQ29ubmVjdGlvbiogY29ubmVjdGlvbiwgUHlPYmplY3QqIGN1cnNvcikKewogICAgUHlPYmplY3QqIHdlYWtyZWY7CgogICAgd2Vha3JlZiA9IFB5V2Vha3JlZl9OZXdSZWYoKFB5T2JqZWN0KiljdXJzb3IsIE5VTEwpOwogICAgaWYgKCF3ZWFrcmVmKSB7CiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KCiAgICBpZiAoUHlMaXN0X0FwcGVuZChjb25uZWN0aW9uLT5jdXJzb3JzLCB3ZWFrcmVmKSAhPSAwKSB7CiAgICAgICAgUHlfQ0xFQVIod2Vha3JlZik7CiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KCiAgICBQeV9ERUNSRUYod2Vha3JlZik7CgogICAgcmV0dXJuIDE7CmVycm9yOgogICAgcmV0dXJuIDA7Cn0KClB5T2JqZWN0KiBweXNxbGl0ZV9jb25uZWN0aW9uX2N1cnNvcihweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKewogICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJmYWN0b3J5IiwgTlVMTH07CiAgICBQeU9iamVjdCogZmFjdG9yeSA9IE5VTEw7CiAgICBQeU9iamVjdCogY3Vyc29yOwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxPIiwga3dsaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZhY3RvcnkpKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgaWYgKCFweXNxbGl0ZV9jaGVja190aHJlYWQoc2VsZikgfHwgIXB5c3FsaXRlX2NoZWNrX2Nvbm5lY3Rpb24oc2VsZikpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBpZiAoZmFjdG9yeSA9PSBOVUxMKSB7CiAgICAgICAgZmFjdG9yeSA9IChQeU9iamVjdCopJnB5c3FsaXRlX0N1cnNvclR5cGU7CiAgICB9CgogICAgY3Vyc29yID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhmYWN0b3J5LCAoUHlPYmplY3QgKilzZWxmLCBOVUxMKTsKICAgIGlmIChjdXJzb3IgPT0gTlVMTCkKICAgICAgICByZXR1cm4gTlVMTDsKICAgIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKGN1cnNvciwgJnB5c3FsaXRlX0N1cnNvclR5cGUpKSB7CiAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgImZhY3RvcnkgbXVzdCByZXR1cm4gYSBjdXJzb3IsIG5vdCAlLjEwMHMiLAogICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKGN1cnNvciktPnRwX25hbWUpOwogICAgICAgIFB5X0RFQ1JFRihjdXJzb3IpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIF9weXNxbGl0ZV9kcm9wX3VudXNlZF9jdXJzb3JfcmVmZXJlbmNlcyhzZWxmKTsKCiAgICBpZiAoY3Vyc29yICYmIHNlbGYtPnJvd19mYWN0b3J5ICE9IFB5X05vbmUpIHsKICAgICAgICBQeV9JTkNSRUYoc2VsZi0+cm93X2ZhY3RvcnkpOwogICAgICAgIFB5X1hTRVRSRUYoKChweXNxbGl0ZV9DdXJzb3IgKiljdXJzb3IpLT5yb3dfZmFjdG9yeSwgc2VsZi0+cm93X2ZhY3RvcnkpOwogICAgfQoKICAgIHJldHVybiBjdXJzb3I7Cn0KClB5T2JqZWN0KiBweXNxbGl0ZV9jb25uZWN0aW9uX2Nsb3NlKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQp7CiAgICBQeU9iamVjdCogcmV0OwogICAgaW50IHJjOwoKICAgIGlmICghcHlzcWxpdGVfY2hlY2tfdGhyZWFkKHNlbGYpKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgcHlzcWxpdGVfZG9fYWxsX3N0YXRlbWVudHMoc2VsZiwgQUNUSU9OX0ZJTkFMSVpFLCAxKTsKCiAgICBpZiAoc2VsZi0+ZGIpIHsKICAgICAgICBpZiAoc2VsZi0+YXBzd19jb25uZWN0aW9uKSB7CiAgICAgICAgICAgIHJldCA9IFB5T2JqZWN0X0NhbGxNZXRob2Qoc2VsZi0+YXBzd19jb25uZWN0aW9uLCAiY2xvc2UiLCAiIik7CiAgICAgICAgICAgIFB5X1hERUNSRUYocmV0KTsKICAgICAgICAgICAgUHlfQ0xFQVIoc2VsZi0+YXBzd19jb25uZWN0aW9uKTsKICAgICAgICAgICAgc2VsZi0+ZGIgPSBOVUxMOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICAgICAgICAgICAgcmMgPSBzcWxpdGUzX2Nsb3NlKHNlbGYtPmRiKTsKICAgICAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKCiAgICAgICAgICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKICAgICAgICAgICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5kYiwgTlVMTCk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHNlbGYtPmRiID0gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICByZXR1cm4gUHlfTm9uZTsKfQoKLyoKICogQ2hlY2tzIGlmIGEgY29ubmVjdGlvbiBvYmplY3QgaXMgdXNhYmxlIChpLiBlLiBub3QgY2xvc2VkKS4KICoKICogMCA9PiBlcnJvcjsgMSA9PiBvawogKi8KaW50IHB5c3FsaXRlX2NoZWNrX2Nvbm5lY3Rpb24ocHlzcWxpdGVfQ29ubmVjdGlvbiogY29uKQp7CiAgICBpZiAoIWNvbi0+aW5pdGlhbGl6ZWQpIHsKICAgICAgICBQeUVycl9TZXRTdHJpbmcocHlzcWxpdGVfUHJvZ3JhbW1pbmdFcnJvciwgIkJhc2UgQ29ubmVjdGlvbi5fX2luaXRfXyBub3QgY2FsbGVkLiIpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIGlmICghY29uLT5kYikgewogICAgICAgIFB5RXJyX1NldFN0cmluZyhweXNxbGl0ZV9Qcm9ncmFtbWluZ0Vycm9yLCAiQ2Fubm90IG9wZXJhdGUgb24gYSBjbG9zZWQgZGF0YWJhc2UuIik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAxOwogICAgfQp9CgpQeU9iamVjdCogX3B5c3FsaXRlX2Nvbm5lY3Rpb25fYmVnaW4ocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZikKewogICAgaW50IHJjOwogICAgY29uc3QgY2hhciogdGFpbDsKICAgIHNxbGl0ZTNfc3RtdCogc3RhdGVtZW50OwoKICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICAgIHJjID0gc3FsaXRlM19wcmVwYXJlKHNlbGYtPmRiLCBzZWxmLT5iZWdpbl9zdGF0ZW1lbnQsIC0xLCAmc3RhdGVtZW50LCAmdGFpbCk7CiAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwoKICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+ZGIsIHN0YXRlbWVudCk7CiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KCiAgICByYyA9IHB5c3FsaXRlX3N0ZXAoc3RhdGVtZW50LCBzZWxmKTsKICAgIGlmIChyYyA9PSBTUUxJVEVfRE9ORSkgewogICAgICAgIHNlbGYtPmluVHJhbnNhY3Rpb24gPSAxOwogICAgfSBlbHNlIHsKICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+ZGIsIHN0YXRlbWVudCk7CiAgICB9CgogICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogICAgcmMgPSBzcWxpdGUzX2ZpbmFsaXplKHN0YXRlbWVudCk7CiAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwoKICAgIGlmIChyYyAhPSBTUUxJVEVfT0sgJiYgIVB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+ZGIsIE5VTEwpOwogICAgfQoKZXJyb3I6CiAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfSBlbHNlIHsKICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgICAgcmV0dXJuIFB5X05vbmU7CiAgICB9Cn0KClB5T2JqZWN0KiBweXNxbGl0ZV9jb25uZWN0aW9uX2NvbW1pdChweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncykKewogICAgaW50IHJjOwogICAgY29uc3QgY2hhciogdGFpbDsKICAgIHNxbGl0ZTNfc3RtdCogc3RhdGVtZW50OwoKICAgIGlmICghcHlzcWxpdGVfY2hlY2tfdGhyZWFkKHNlbGYpIHx8ICFweXNxbGl0ZV9jaGVja19jb25uZWN0aW9uKHNlbGYpKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgaWYgKHNlbGYtPmluVHJhbnNhY3Rpb24pIHsKCiAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogICAgICAgIHJjID0gc3FsaXRlM19wcmVwYXJlKHNlbGYtPmRiLCAiQ09NTUlUIiwgLTEsICZzdGF0ZW1lbnQsICZ0YWlsKTsKICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogICAgICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKICAgICAgICAgICAgX3B5c3FsaXRlX3NldGVycm9yKHNlbGYtPmRiLCBOVUxMKTsKICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICB9CgogICAgICAgIHJjID0gcHlzcWxpdGVfc3RlcChzdGF0ZW1lbnQsIHNlbGYpOwogICAgICAgIGlmIChyYyA9PSBTUUxJVEVfRE9ORSkgewogICAgICAgICAgICBzZWxmLT5pblRyYW5zYWN0aW9uID0gMDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+ZGIsIHN0YXRlbWVudCk7CiAgICAgICAgfQoKICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAgICAgICAgcmMgPSBzcWxpdGUzX2ZpbmFsaXplKHN0YXRlbWVudCk7CiAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKICAgICAgICBpZiAocmMgIT0gU1FMSVRFX09LICYmICFQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5kYiwgTlVMTCk7CiAgICAgICAgfQoKICAgIH0KCmVycm9yOgogICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0gZWxzZSB7CiAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgICAgIHJldHVybiBQeV9Ob25lOwogICAgfQp9CgpQeU9iamVjdCogcHlzcWxpdGVfY29ubmVjdGlvbl9yb2xsYmFjayhweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncykKewogICAgaW50IHJjOwogICAgY29uc3QgY2hhciogdGFpbDsKICAgIHNxbGl0ZTNfc3RtdCogc3RhdGVtZW50OwoKICAgIGlmICghcHlzcWxpdGVfY2hlY2tfdGhyZWFkKHNlbGYpIHx8ICFweXNxbGl0ZV9jaGVja19jb25uZWN0aW9uKHNlbGYpKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgaWYgKHNlbGYtPmluVHJhbnNhY3Rpb24pIHsKICAgICAgICBweXNxbGl0ZV9kb19hbGxfc3RhdGVtZW50cyhzZWxmLCBBQ1RJT05fUkVTRVQsIDEpOwoKICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAgICAgICAgcmMgPSBzcWxpdGUzX3ByZXBhcmUoc2VsZi0+ZGIsICJST0xMQkFDSyIsIC0xLCAmc3RhdGVtZW50LCAmdGFpbCk7CiAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKICAgICAgICBpZiAocmMgIT0gU1FMSVRFX09LKSB7CiAgICAgICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5kYiwgTlVMTCk7CiAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgfQoKICAgICAgICByYyA9IHB5c3FsaXRlX3N0ZXAoc3RhdGVtZW50LCBzZWxmKTsKICAgICAgICBpZiAocmMgPT0gU1FMSVRFX0RPTkUpIHsKICAgICAgICAgICAgc2VsZi0+aW5UcmFuc2FjdGlvbiA9IDA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgX3B5c3FsaXRlX3NldGVycm9yKHNlbGYtPmRiLCBzdGF0ZW1lbnQpOwogICAgICAgIH0KCiAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogICAgICAgIHJjID0gc3FsaXRlM19maW5hbGl6ZShzdGF0ZW1lbnQpOwogICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCiAgICAgICAgaWYgKHJjICE9IFNRTElURV9PSyAmJiAhUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+ZGIsIE5VTEwpOwogICAgICAgIH0KCiAgICB9CgplcnJvcjoKICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9IGVsc2UgewogICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICAgICByZXR1cm4gUHlfTm9uZTsKICAgIH0KfQoKc3RhdGljIGludApfcHlzcWxpdGVfc2V0X3Jlc3VsdChzcWxpdGUzX2NvbnRleHQqIGNvbnRleHQsIFB5T2JqZWN0KiBweV92YWwpCnsKICAgIGlmIChweV92YWwgPT0gUHlfTm9uZSkgewogICAgICAgIHNxbGl0ZTNfcmVzdWx0X251bGwoY29udGV4dCk7CiAgICB9IGVsc2UgaWYgKFB5SW50X0NoZWNrKHB5X3ZhbCkpIHsKICAgICAgICBzcWxpdGUzX3Jlc3VsdF9pbnQ2NChjb250ZXh0LCAoc3FsaXRlX2ludDY0KVB5SW50X0FzTG9uZyhweV92YWwpKTsKICAgIH0gZWxzZSBpZiAoUHlMb25nX0NoZWNrKHB5X3ZhbCkpIHsKICAgICAgICBzcWxpdGVfaW50NjQgdmFsdWUgPSBfcHlzcWxpdGVfbG9uZ19hc19pbnQ2NChweV92YWwpOwogICAgICAgIGlmICh2YWx1ZSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgc3FsaXRlM19yZXN1bHRfaW50NjQoY29udGV4dCwgdmFsdWUpOwogICAgfSBlbHNlIGlmIChQeUZsb2F0X0NoZWNrKHB5X3ZhbCkpIHsKICAgICAgICBzcWxpdGUzX3Jlc3VsdF9kb3VibGUoY29udGV4dCwgUHlGbG9hdF9Bc0RvdWJsZShweV92YWwpKTsKICAgIH0gZWxzZSBpZiAoUHlCdWZmZXJfQ2hlY2socHlfdmFsKSkgewogICAgICAgIGNvbnN0IGNoYXIqIGJ1ZmZlcjsKICAgICAgICBQeV9zc2l6ZV90IGJ1ZmxlbjsKICAgICAgICBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKHB5X3ZhbCwgJmJ1ZmZlciwgJmJ1ZmxlbikgIT0gMCkgewogICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImNvdWxkIG5vdCBjb252ZXJ0IEJMT0IgdG8gYnVmZmVyIik7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgc3FsaXRlM19yZXN1bHRfYmxvYihjb250ZXh0LCBidWZmZXIsIGJ1ZmxlbiwgU1FMSVRFX1RSQU5TSUVOVCk7CiAgICB9IGVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrKHB5X3ZhbCkpIHsKICAgICAgICBzcWxpdGUzX3Jlc3VsdF90ZXh0KGNvbnRleHQsIFB5U3RyaW5nX0FzU3RyaW5nKHB5X3ZhbCksIC0xLCBTUUxJVEVfVFJBTlNJRU5UKTsKICAgIH0gZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHB5X3ZhbCkpIHsKICAgICAgICBQeU9iamVjdCAqIHN0cmluZ3ZhbCA9IFB5VW5pY29kZV9Bc1VURjhTdHJpbmcocHlfdmFsKTsKICAgICAgICBpZiAoIXN0cmluZ3ZhbCkKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIHNxbGl0ZTNfcmVzdWx0X3RleHQoY29udGV4dCwgUHlTdHJpbmdfQXNTdHJpbmcoc3RyaW5ndmFsKSwgLTEsIFNRTElURV9UUkFOU0lFTlQpOwogICAgICAgIFB5X0RFQ1JFRihzdHJpbmd2YWwpOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKUHlPYmplY3QqIF9weXNxbGl0ZV9idWlsZF9weV9wYXJhbXMoc3FsaXRlM19jb250ZXh0ICpjb250ZXh0LCBpbnQgYXJnYywgc3FsaXRlM192YWx1ZSoqIGFyZ3YpCnsKICAgIFB5T2JqZWN0KiBhcmdzOwogICAgaW50IGk7CiAgICBzcWxpdGUzX3ZhbHVlKiBjdXJfdmFsdWU7CiAgICBQeU9iamVjdCogY3VyX3B5X3ZhbHVlOwogICAgY29uc3QgY2hhciogdmFsX3N0cjsKICAgIFB5X3NzaXplX3QgYnVmbGVuOwogICAgdm9pZCogcmF3X2J1ZmZlcjsKCiAgICBhcmdzID0gUHlUdXBsZV9OZXcoYXJnYyk7CiAgICBpZiAoIWFyZ3MpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7CiAgICAgICAgY3VyX3ZhbHVlID0gYXJndltpXTsKICAgICAgICBzd2l0Y2ggKHNxbGl0ZTNfdmFsdWVfdHlwZShhcmd2W2ldKSkgewogICAgICAgICAgICBjYXNlIFNRTElURV9JTlRFR0VSOgogICAgICAgICAgICAgICAgY3VyX3B5X3ZhbHVlID0gX3B5c3FsaXRlX2xvbmdfZnJvbV9pbnQ2NChzcWxpdGUzX3ZhbHVlX2ludDY0KGN1cl92YWx1ZSkpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgU1FMSVRFX0ZMT0FUOgogICAgICAgICAgICAgICAgY3VyX3B5X3ZhbHVlID0gUHlGbG9hdF9Gcm9tRG91YmxlKHNxbGl0ZTNfdmFsdWVfZG91YmxlKGN1cl92YWx1ZSkpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgU1FMSVRFX1RFWFQ6CiAgICAgICAgICAgICAgICB2YWxfc3RyID0gKGNvbnN0IGNoYXIqKXNxbGl0ZTNfdmFsdWVfdGV4dChjdXJfdmFsdWUpOwogICAgICAgICAgICAgICAgY3VyX3B5X3ZhbHVlID0gUHlVbmljb2RlX0RlY29kZVVURjgodmFsX3N0ciwgc3RybGVuKHZhbF9zdHIpLCBOVUxMKTsKICAgICAgICAgICAgICAgIC8qIFRPRE86IGhhdmUgYSB3YXkgdG8gc2hvdyBlcnJvcnMgaGVyZSAqLwogICAgICAgICAgICAgICAgaWYgKCFjdXJfcHlfdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwogICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICAgICAgICAgICAgICAgICBjdXJfcHlfdmFsdWUgPSBQeV9Ob25lOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgU1FMSVRFX0JMT0I6CiAgICAgICAgICAgICAgICBidWZsZW4gPSBzcWxpdGUzX3ZhbHVlX2J5dGVzKGN1cl92YWx1ZSk7CiAgICAgICAgICAgICAgICBjdXJfcHlfdmFsdWUgPSBQeUJ1ZmZlcl9OZXcoYnVmbGVuKTsKICAgICAgICAgICAgICAgIGlmICghY3VyX3B5X3ZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoUHlPYmplY3RfQXNXcml0ZUJ1ZmZlcihjdXJfcHlfdmFsdWUsICZyYXdfYnVmZmVyLCAmYnVmbGVuKSkgewogICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihjdXJfcHlfdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIGN1cl9weV92YWx1ZSA9IE5VTEw7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtZW1jcHkocmF3X2J1ZmZlciwgc3FsaXRlM192YWx1ZV9ibG9iKGN1cl92YWx1ZSksIGJ1Zmxlbik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBTUUxJVEVfTlVMTDoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICAgICAgICAgICAgIGN1cl9weV92YWx1ZSA9IFB5X05vbmU7CiAgICAgICAgfQoKICAgICAgICBpZiAoIWN1cl9weV92YWx1ZSkgewogICAgICAgICAgICBQeV9ERUNSRUYoYXJncyk7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KCiAgICAgICAgUHlUdXBsZV9TZXRJdGVtKGFyZ3MsIGksIGN1cl9weV92YWx1ZSk7CgogICAgfQoKICAgIHJldHVybiBhcmdzOwp9Cgp2b2lkIF9weXNxbGl0ZV9mdW5jX2NhbGxiYWNrKHNxbGl0ZTNfY29udGV4dCogY29udGV4dCwgaW50IGFyZ2MsIHNxbGl0ZTNfdmFsdWUqKiBhcmd2KQp7CiAgICBQeU9iamVjdCogYXJnczsKICAgIFB5T2JqZWN0KiBweV9mdW5jOwogICAgUHlPYmplY3QqIHB5X3JldHZhbCA9IE5VTEw7CiAgICBpbnQgb2s7CgojaWZkZWYgV0lUSF9USFJFQUQKICAgIFB5R0lMU3RhdGVfU1RBVEUgdGhyZWFkc3RhdGU7CgogICAgdGhyZWFkc3RhdGUgPSBQeUdJTFN0YXRlX0Vuc3VyZSgpOwojZW5kaWYKCiAgICBweV9mdW5jID0gKFB5T2JqZWN0KilzcWxpdGUzX3VzZXJfZGF0YShjb250ZXh0KTsKCiAgICBhcmdzID0gX3B5c3FsaXRlX2J1aWxkX3B5X3BhcmFtcyhjb250ZXh0LCBhcmdjLCBhcmd2KTsKICAgIGlmIChhcmdzKSB7CiAgICAgICAgcHlfcmV0dmFsID0gUHlPYmplY3RfQ2FsbE9iamVjdChweV9mdW5jLCBhcmdzKTsKICAgICAgICBQeV9ERUNSRUYoYXJncyk7CiAgICB9CgogICAgb2sgPSAwOwogICAgaWYgKHB5X3JldHZhbCkgewogICAgICAgIG9rID0gX3B5c3FsaXRlX3NldF9yZXN1bHQoY29udGV4dCwgcHlfcmV0dmFsKSA9PSAwOwogICAgICAgIFB5X0RFQ1JFRihweV9yZXR2YWwpOwogICAgfQogICAgaWYgKCFvaykgewogICAgICAgIGlmIChfcHlzcWxpdGVfZW5hYmxlX2NhbGxiYWNrX3RyYWNlYmFja3MpIHsKICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBQeUVycl9DbGVhcigpOwogICAgICAgIH0KICAgICAgICBfc3FsaXRlM19yZXN1bHRfZXJyb3IoY29udGV4dCwgInVzZXItZGVmaW5lZCBmdW5jdGlvbiByYWlzZWQgZXhjZXB0aW9uIiwgLTEpOwogICAgfQoKI2lmZGVmIFdJVEhfVEhSRUFECiAgICBQeUdJTFN0YXRlX1JlbGVhc2UodGhyZWFkc3RhdGUpOwojZW5kaWYKfQoKc3RhdGljIHZvaWQgX3B5c3FsaXRlX3N0ZXBfY2FsbGJhY2soc3FsaXRlM19jb250ZXh0ICpjb250ZXh0LCBpbnQgYXJnYywgc3FsaXRlM192YWx1ZSoqIHBhcmFtcykKewogICAgUHlPYmplY3QqIGFyZ3M7CiAgICBQeU9iamVjdCogZnVuY3Rpb25fcmVzdWx0ID0gTlVMTDsKICAgIFB5T2JqZWN0KiBhZ2dyZWdhdGVfY2xhc3M7CiAgICBQeU9iamVjdCoqIGFnZ3JlZ2F0ZV9pbnN0YW5jZTsKICAgIFB5T2JqZWN0KiBzdGVwbWV0aG9kID0gTlVMTDsKCiNpZmRlZiBXSVRIX1RIUkVBRAogICAgUHlHSUxTdGF0ZV9TVEFURSB0aHJlYWRzdGF0ZTsKCiAgICB0aHJlYWRzdGF0ZSA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7CiNlbmRpZgoKICAgIGFnZ3JlZ2F0ZV9jbGFzcyA9IChQeU9iamVjdCopc3FsaXRlM191c2VyX2RhdGEoY29udGV4dCk7CgogICAgYWdncmVnYXRlX2luc3RhbmNlID0gKFB5T2JqZWN0Kiopc3FsaXRlM19hZ2dyZWdhdGVfY29udGV4dChjb250ZXh0LCBzaXplb2YoUHlPYmplY3QqKSk7CgogICAgaWYgKCphZ2dyZWdhdGVfaW5zdGFuY2UgPT0gMCkgewogICAgICAgICphZ2dyZWdhdGVfaW5zdGFuY2UgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oYWdncmVnYXRlX2NsYXNzLCAiIik7CgogICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgICAgICphZ2dyZWdhdGVfaW5zdGFuY2UgPSAwOwogICAgICAgICAgICBpZiAoX3B5c3FsaXRlX2VuYWJsZV9jYWxsYmFja190cmFjZWJhY2tzKSB7CiAgICAgICAgICAgICAgICBQeUVycl9QcmludCgpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBfc3FsaXRlM19yZXN1bHRfZXJyb3IoY29udGV4dCwgInVzZXItZGVmaW5lZCBhZ2dyZWdhdGUncyAnX19pbml0X18nIG1ldGhvZCByYWlzZWQgZXJyb3IiLCAtMSk7CiAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgfQogICAgfQoKICAgIHN0ZXBtZXRob2QgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKCphZ2dyZWdhdGVfaW5zdGFuY2UsICJzdGVwIik7CiAgICBpZiAoIXN0ZXBtZXRob2QpIHsKICAgICAgICBnb3RvIGVycm9yOwogICAgfQoKICAgIGFyZ3MgPSBfcHlzcWxpdGVfYnVpbGRfcHlfcGFyYW1zKGNvbnRleHQsIGFyZ2MsIHBhcmFtcyk7CiAgICBpZiAoIWFyZ3MpIHsKICAgICAgICBnb3RvIGVycm9yOwogICAgfQoKICAgIGZ1bmN0aW9uX3Jlc3VsdCA9IFB5T2JqZWN0X0NhbGxPYmplY3Qoc3RlcG1ldGhvZCwgYXJncyk7CiAgICBQeV9ERUNSRUYoYXJncyk7CgogICAgaWYgKCFmdW5jdGlvbl9yZXN1bHQpIHsKICAgICAgICBpZiAoX3B5c3FsaXRlX2VuYWJsZV9jYWxsYmFja190cmFjZWJhY2tzKSB7CiAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKICAgICAgICB9CiAgICAgICAgX3NxbGl0ZTNfcmVzdWx0X2Vycm9yKGNvbnRleHQsICJ1c2VyLWRlZmluZWQgYWdncmVnYXRlJ3MgJ3N0ZXAnIG1ldGhvZCByYWlzZWQgZXJyb3IiLCAtMSk7CiAgICB9CgplcnJvcjoKICAgIFB5X1hERUNSRUYoc3RlcG1ldGhvZCk7CiAgICBQeV9YREVDUkVGKGZ1bmN0aW9uX3Jlc3VsdCk7CgojaWZkZWYgV0lUSF9USFJFQUQKICAgIFB5R0lMU3RhdGVfUmVsZWFzZSh0aHJlYWRzdGF0ZSk7CiNlbmRpZgp9Cgp2b2lkIF9weXNxbGl0ZV9maW5hbF9jYWxsYmFjayhzcWxpdGUzX2NvbnRleHQqIGNvbnRleHQpCnsKICAgIFB5T2JqZWN0KiBmdW5jdGlvbl9yZXN1bHQ7CiAgICBQeU9iamVjdCoqIGFnZ3JlZ2F0ZV9pbnN0YW5jZTsKICAgIGludCBvazsKCiNpZmRlZiBXSVRIX1RIUkVBRAogICAgUHlHSUxTdGF0ZV9TVEFURSB0aHJlYWRzdGF0ZTsKCiAgICB0aHJlYWRzdGF0ZSA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7CiNlbmRpZgoKICAgIGFnZ3JlZ2F0ZV9pbnN0YW5jZSA9IChQeU9iamVjdCoqKXNxbGl0ZTNfYWdncmVnYXRlX2NvbnRleHQoY29udGV4dCwgc2l6ZW9mKFB5T2JqZWN0KikpOwogICAgaWYgKCEqYWdncmVnYXRlX2luc3RhbmNlKSB7CiAgICAgICAgLyogdGhpcyBicmFuY2ggaXMgZXhlY3V0ZWQgaWYgdGhlcmUgd2FzIGFuIGV4Y2VwdGlvbiBpbiB0aGUgYWdncmVnYXRlJ3MKICAgICAgICAgKiBfX2luaXRfXyAqLwoKICAgICAgICBnb3RvIGVycm9yOwogICAgfQoKICAgIGZ1bmN0aW9uX3Jlc3VsdCA9IFB5T2JqZWN0X0NhbGxNZXRob2QoKmFnZ3JlZ2F0ZV9pbnN0YW5jZSwgImZpbmFsaXplIiwgIiIpOwogICAgUHlfREVDUkVGKCphZ2dyZWdhdGVfaW5zdGFuY2UpOwoKICAgIG9rID0gMDsKICAgIGlmIChmdW5jdGlvbl9yZXN1bHQpIHsKICAgICAgICBvayA9IF9weXNxbGl0ZV9zZXRfcmVzdWx0KGNvbnRleHQsIGZ1bmN0aW9uX3Jlc3VsdCkgPT0gMDsKICAgICAgICBQeV9ERUNSRUYoZnVuY3Rpb25fcmVzdWx0KTsKICAgIH0KICAgIGlmICghb2spIHsKICAgICAgICBpZiAoX3B5c3FsaXRlX2VuYWJsZV9jYWxsYmFja190cmFjZWJhY2tzKSB7CiAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKICAgICAgICB9CiAgICAgICAgX3NxbGl0ZTNfcmVzdWx0X2Vycm9yKGNvbnRleHQsICJ1c2VyLWRlZmluZWQgYWdncmVnYXRlJ3MgJ2ZpbmFsaXplJyBtZXRob2QgcmFpc2VkIGVycm9yIiwgLTEpOwogICAgfQoKZXJyb3I6CiAgICA7ICAvKiBuZWNlc3NhcnkgZm9yIC0td2l0aG91dC10aHJlYWRzIGZsYWcgKi8KI2lmZGVmIFdJVEhfVEhSRUFECiAgICBQeUdJTFN0YXRlX1JlbGVhc2UodGhyZWFkc3RhdGUpOwojZW5kaWYKfQoKc3RhdGljIHZvaWQgX3B5c3FsaXRlX2Ryb3BfdW51c2VkX3N0YXRlbWVudF9yZWZlcmVuY2VzKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYpCnsKICAgIFB5T2JqZWN0KiBuZXdfbGlzdDsKICAgIFB5T2JqZWN0KiB3ZWFrcmVmOwogICAgaW50IGk7CgogICAgLyogd2Ugb25seSBuZWVkIHRvIGRvIHRoaXMgb25jZSBpbiBhIHdoaWxlICovCiAgICBpZiAoc2VsZi0+Y3JlYXRlZF9zdGF0ZW1lbnRzKysgPCAyMDApIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgc2VsZi0+Y3JlYXRlZF9zdGF0ZW1lbnRzID0gMDsKCiAgICBuZXdfbGlzdCA9IFB5TGlzdF9OZXcoMCk7CiAgICBpZiAoIW5ld19saXN0KSB7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGZvciAoaSA9IDA7IGkgPCBQeUxpc3RfU2l6ZShzZWxmLT5zdGF0ZW1lbnRzKTsgaSsrKSB7CiAgICAgICAgd2Vha3JlZiA9IFB5TGlzdF9HZXRJdGVtKHNlbGYtPnN0YXRlbWVudHMsIGkpOwogICAgICAgIGlmIChQeVdlYWtyZWZfR2V0T2JqZWN0KHdlYWtyZWYpICE9IFB5X05vbmUpIHsKICAgICAgICAgICAgaWYgKFB5TGlzdF9BcHBlbmQobmV3X2xpc3QsIHdlYWtyZWYpICE9IDApIHsKICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuZXdfbGlzdCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgUHlfU0VUUkVGKHNlbGYtPnN0YXRlbWVudHMsIG5ld19saXN0KTsKfQoKc3RhdGljIHZvaWQgX3B5c3FsaXRlX2Ryb3BfdW51c2VkX2N1cnNvcl9yZWZlcmVuY2VzKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYpCnsKICAgIFB5T2JqZWN0KiBuZXdfbGlzdDsKICAgIFB5T2JqZWN0KiB3ZWFrcmVmOwogICAgaW50IGk7CgogICAgLyogd2Ugb25seSBuZWVkIHRvIGRvIHRoaXMgb25jZSBpbiBhIHdoaWxlICovCiAgICBpZiAoc2VsZi0+Y3JlYXRlZF9jdXJzb3JzKysgPCAyMDApIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgc2VsZi0+Y3JlYXRlZF9jdXJzb3JzID0gMDsKCiAgICBuZXdfbGlzdCA9IFB5TGlzdF9OZXcoMCk7CiAgICBpZiAoIW5ld19saXN0KSB7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGZvciAoaSA9IDA7IGkgPCBQeUxpc3RfU2l6ZShzZWxmLT5jdXJzb3JzKTsgaSsrKSB7CiAgICAgICAgd2Vha3JlZiA9IFB5TGlzdF9HZXRJdGVtKHNlbGYtPmN1cnNvcnMsIGkpOwogICAgICAgIGlmIChQeVdlYWtyZWZfR2V0T2JqZWN0KHdlYWtyZWYpICE9IFB5X05vbmUpIHsKICAgICAgICAgICAgaWYgKFB5TGlzdF9BcHBlbmQobmV3X2xpc3QsIHdlYWtyZWYpICE9IDApIHsKICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuZXdfbGlzdCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgUHlfU0VUUkVGKHNlbGYtPmN1cnNvcnMsIG5ld19saXN0KTsKfQoKUHlPYmplY3QqIHB5c3FsaXRlX2Nvbm5lY3Rpb25fY3JlYXRlX2Z1bmN0aW9uKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQp7CiAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7Im5hbWUiLCAibmFyZyIsICJmdW5jIiwgTlVMTCwgTlVMTH07CgogICAgUHlPYmplY3QqIGZ1bmM7CiAgICBjaGFyKiBuYW1lOwogICAgaW50IG5hcmc7CiAgICBpbnQgcmM7CgogICAgaWYgKCFweXNxbGl0ZV9jaGVja190aHJlYWQoc2VsZikgfHwgIXB5c3FsaXRlX2NoZWNrX2Nvbm5lY3Rpb24oc2VsZikpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJzaU8iLCBrd2xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZSwgJm5hcmcsICZmdW5jKSkKICAgIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICByYyA9IHNxbGl0ZTNfY3JlYXRlX2Z1bmN0aW9uKHNlbGYtPmRiLCBuYW1lLCBuYXJnLCBTUUxJVEVfVVRGOCwgKHZvaWQqKWZ1bmMsIF9weXNxbGl0ZV9mdW5jX2NhbGxiYWNrLCBOVUxMLCBOVUxMKTsKCiAgICBpZiAocmMgIT0gU1FMSVRFX09LKSB7CiAgICAgICAgLyogV29ya2Fyb3VuZCBmb3IgU1FMaXRlIGJ1Zzogbm8gZXJyb3IgY29kZSBvciBzdHJpbmcgaXMgYXZhaWxhYmxlIGhlcmUgKi8KICAgICAgICBQeUVycl9TZXRTdHJpbmcocHlzcWxpdGVfT3BlcmF0aW9uYWxFcnJvciwgIkVycm9yIGNyZWF0aW5nIGZ1bmN0aW9uIik7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9IGVsc2UgewogICAgICAgIGlmIChQeURpY3RfU2V0SXRlbShzZWxmLT5mdW5jdGlvbl9waW5ib2FyZCwgZnVuYywgUHlfTm9uZSkgPT0gLTEpCiAgICAgICAgICAgIHJldHVybiBOVUxMOwoKICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgICAgcmV0dXJuIFB5X05vbmU7CiAgICB9Cn0KClB5T2JqZWN0KiBweXNxbGl0ZV9jb25uZWN0aW9uX2NyZWF0ZV9hZ2dyZWdhdGUocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCnsKICAgIFB5T2JqZWN0KiBhZ2dyZWdhdGVfY2xhc3M7CgogICAgaW50IG5fYXJnOwogICAgY2hhciogbmFtZTsKICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsgIm5hbWUiLCAibl9hcmciLCAiYWdncmVnYXRlX2NsYXNzIiwgTlVMTCB9OwogICAgaW50IHJjOwoKICAgIGlmICghcHlzcWxpdGVfY2hlY2tfdGhyZWFkKHNlbGYpIHx8ICFweXNxbGl0ZV9jaGVja19jb25uZWN0aW9uKHNlbGYpKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAic2lPOmNyZWF0ZV9hZ2dyZWdhdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3bGlzdCwgJm5hbWUsICZuX2FyZywgJmFnZ3JlZ2F0ZV9jbGFzcykpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICByYyA9IHNxbGl0ZTNfY3JlYXRlX2Z1bmN0aW9uKHNlbGYtPmRiLCBuYW1lLCBuX2FyZywgU1FMSVRFX1VURjgsICh2b2lkKilhZ2dyZWdhdGVfY2xhc3MsIDAsICZfcHlzcWxpdGVfc3RlcF9jYWxsYmFjaywgJl9weXNxbGl0ZV9maW5hbF9jYWxsYmFjayk7CiAgICBpZiAocmMgIT0gU1FMSVRFX09LKSB7CiAgICAgICAgLyogV29ya2Fyb3VuZCBmb3IgU1FMaXRlIGJ1Zzogbm8gZXJyb3IgY29kZSBvciBzdHJpbmcgaXMgYXZhaWxhYmxlIGhlcmUgKi8KICAgICAgICBQeUVycl9TZXRTdHJpbmcocHlzcWxpdGVfT3BlcmF0aW9uYWxFcnJvciwgIkVycm9yIGNyZWF0aW5nIGFnZ3JlZ2F0ZSIpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfSBlbHNlIHsKICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW0oc2VsZi0+ZnVuY3Rpb25fcGluYm9hcmQsIGFnZ3JlZ2F0ZV9jbGFzcywgUHlfTm9uZSkgPT0gLTEpCiAgICAgICAgICAgIHJldHVybiBOVUxMOwoKICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgICAgcmV0dXJuIFB5X05vbmU7CiAgICB9Cn0KCnN0YXRpYyBpbnQgX2F1dGhvcml6ZXJfY2FsbGJhY2sodm9pZCogdXNlcl9hcmcsIGludCBhY3Rpb24sIGNvbnN0IGNoYXIqIGFyZzEsIGNvbnN0IGNoYXIqIGFyZzIgLCBjb25zdCBjaGFyKiBkYm5hbWUsIGNvbnN0IGNoYXIqIGFjY2Vzc19hdHRlbXB0X3NvdXJjZSkKewogICAgUHlPYmplY3QgKnJldDsKICAgIGludCByYzsKI2lmZGVmIFdJVEhfVEhSRUFECiAgICBQeUdJTFN0YXRlX1NUQVRFIGdpbHN0YXRlOwoKICAgIGdpbHN0YXRlID0gUHlHSUxTdGF0ZV9FbnN1cmUoKTsKI2VuZGlmCiAgICByZXQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0Kil1c2VyX2FyZywgImlzc3NzIiwgYWN0aW9uLCBhcmcxLCBhcmcyLCBkYm5hbWUsIGFjY2Vzc19hdHRlbXB0X3NvdXJjZSk7CgogICAgaWYgKCFyZXQpIHsKICAgICAgICBpZiAoX3B5c3FsaXRlX2VuYWJsZV9jYWxsYmFja190cmFjZWJhY2tzKSB7CiAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKICAgICAgICB9CgogICAgICAgIHJjID0gU1FMSVRFX0RFTlk7CiAgICB9IGVsc2UgewogICAgICAgIGlmIChQeUludF9DaGVjayhyZXQpKSB7CiAgICAgICAgICAgIHJjID0gX1B5SW50X0FzSW50KHJldCk7CiAgICAgICAgICAgIGlmIChyYyA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICAgICAgICAgcmMgPSBTUUxJVEVfREVOWTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByYyA9IFNRTElURV9ERU5ZOwogICAgICAgIH0KICAgICAgICBQeV9ERUNSRUYocmV0KTsKICAgIH0KCiNpZmRlZiBXSVRIX1RIUkVBRAogICAgUHlHSUxTdGF0ZV9SZWxlYXNlKGdpbHN0YXRlKTsKI2VuZGlmCiAgICByZXR1cm4gcmM7Cn0KCnN0YXRpYyBpbnQgX3Byb2dyZXNzX2hhbmRsZXIodm9pZCogdXNlcl9hcmcpCnsKICAgIGludCByYzsKICAgIFB5T2JqZWN0ICpyZXQ7CiNpZmRlZiBXSVRIX1RIUkVBRAogICAgUHlHSUxTdGF0ZV9TVEFURSBnaWxzdGF0ZTsKCiAgICBnaWxzdGF0ZSA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7CiNlbmRpZgogICAgcmV0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCopdXNlcl9hcmcsICIiKTsKCiAgICBpZiAoIXJldCkgewogICAgICAgIGlmIChfcHlzcWxpdGVfZW5hYmxlX2NhbGxiYWNrX3RyYWNlYmFja3MpIHsKICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBQeUVycl9DbGVhcigpOwogICAgICAgIH0KCiAgICAgICAgLyogYWJvcnQgcXVlcnkgaWYgZXJyb3Igb2NjdXJyZWQgKi8KICAgICAgICByYyA9IDE7CiAgICB9IGVsc2UgewogICAgICAgIHJjID0gKGludClQeU9iamVjdF9Jc1RydWUocmV0KTsKICAgICAgICBQeV9ERUNSRUYocmV0KTsKICAgIH0KCiNpZmRlZiBXSVRIX1RIUkVBRAogICAgUHlHSUxTdGF0ZV9SZWxlYXNlKGdpbHN0YXRlKTsKI2VuZGlmCiAgICByZXR1cm4gcmM7Cn0KCnN0YXRpYyBQeU9iamVjdCogcHlzcWxpdGVfY29ubmVjdGlvbl9zZXRfYXV0aG9yaXplcihweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKewogICAgUHlPYmplY3QqIGF1dGhvcml6ZXJfY2I7CgogICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyAiYXV0aG9yaXplcl9jYWxsYmFjayIsIE5VTEwgfTsKICAgIGludCByYzsKCiAgICBpZiAoIXB5c3FsaXRlX2NoZWNrX3RocmVhZChzZWxmKSB8fCAhcHlzcWxpdGVfY2hlY2tfY29ubmVjdGlvbihzZWxmKSkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk86c2V0X2F1dGhvcml6ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3bGlzdCwgJmF1dGhvcml6ZXJfY2IpKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgcmMgPSBzcWxpdGUzX3NldF9hdXRob3JpemVyKHNlbGYtPmRiLCBfYXV0aG9yaXplcl9jYWxsYmFjaywgKHZvaWQqKWF1dGhvcml6ZXJfY2IpOwoKICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKICAgICAgICBQeUVycl9TZXRTdHJpbmcocHlzcWxpdGVfT3BlcmF0aW9uYWxFcnJvciwgIkVycm9yIHNldHRpbmcgYXV0aG9yaXplciBjYWxsYmFjayIpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfSBlbHNlIHsKICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW0oc2VsZi0+ZnVuY3Rpb25fcGluYm9hcmQsIGF1dGhvcml6ZXJfY2IsIFB5X05vbmUpID09IC0xKQogICAgICAgICAgICByZXR1cm4gTlVMTDsKCiAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgICAgIHJldHVybiBQeV9Ob25lOwogICAgfQp9CgpzdGF0aWMgUHlPYmplY3QqIHB5c3FsaXRlX2Nvbm5lY3Rpb25fc2V0X3Byb2dyZXNzX2hhbmRsZXIocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCnsKICAgIFB5T2JqZWN0KiBwcm9ncmVzc19oYW5kbGVyOwogICAgaW50IG47CgogICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyAicHJvZ3Jlc3NfaGFuZGxlciIsICJuIiwgTlVMTCB9OwoKICAgIGlmICghcHlzcWxpdGVfY2hlY2tfdGhyZWFkKHNlbGYpIHx8ICFweXNxbGl0ZV9jaGVja19jb25uZWN0aW9uKHNlbGYpKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT2k6c2V0X3Byb2dyZXNzX2hhbmRsZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3bGlzdCwgJnByb2dyZXNzX2hhbmRsZXIsICZuKSkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIGlmIChwcm9ncmVzc19oYW5kbGVyID09IFB5X05vbmUpIHsKICAgICAgICAvKiBOb25lIGNsZWFycyB0aGUgcHJvZ3Jlc3MgaGFuZGxlciBwcmV2aW91c2x5IHNldCAqLwogICAgICAgIHNxbGl0ZTNfcHJvZ3Jlc3NfaGFuZGxlcihzZWxmLT5kYiwgMCwgMCwgKHZvaWQqKTApOwogICAgfSBlbHNlIHsKICAgICAgICBzcWxpdGUzX3Byb2dyZXNzX2hhbmRsZXIoc2VsZi0+ZGIsIG4sIF9wcm9ncmVzc19oYW5kbGVyLCBwcm9ncmVzc19oYW5kbGVyKTsKICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW0oc2VsZi0+ZnVuY3Rpb25fcGluYm9hcmQsIHByb2dyZXNzX2hhbmRsZXIsIFB5X05vbmUpID09IC0xKQogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICByZXR1cm4gUHlfTm9uZTsKfQoKI2lmZGVmIEhBVkVfTE9BRF9FWFRFTlNJT04Kc3RhdGljIFB5T2JqZWN0KiBweXNxbGl0ZV9lbmFibGVfbG9hZF9leHRlbnNpb24ocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCnsKICAgIGludCByYzsKICAgIGludCBvbm9mZjsKCiAgICBpZiAoIXB5c3FsaXRlX2NoZWNrX3RocmVhZChzZWxmKSB8fCAhcHlzcWxpdGVfY2hlY2tfY29ubmVjdGlvbihzZWxmKSkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaSIsICZvbm9mZikpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICByYyA9IHNxbGl0ZTNfZW5hYmxlX2xvYWRfZXh0ZW5zaW9uKHNlbGYtPmRiLCBvbm9mZik7CgogICAgaWYgKHJjICE9IFNRTElURV9PSykgewogICAgICAgIFB5RXJyX1NldFN0cmluZyhweXNxbGl0ZV9PcGVyYXRpb25hbEVycm9yLCAiRXJyb3IgZW5hYmxpbmcgbG9hZCBleHRlbnNpb24iKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0gZWxzZSB7CiAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgICAgIHJldHVybiBQeV9Ob25lOwogICAgfQp9CgpzdGF0aWMgUHlPYmplY3QqIHB5c3FsaXRlX2xvYWRfZXh0ZW5zaW9uKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQp7CiAgICBpbnQgcmM7CiAgICBjaGFyKiBleHRlbnNpb25fbmFtZTsKICAgIGNoYXIqIGVycm1zZzsKCiAgICBpZiAoIXB5c3FsaXRlX2NoZWNrX3RocmVhZChzZWxmKSB8fCAhcHlzcWxpdGVfY2hlY2tfY29ubmVjdGlvbihzZWxmKSkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIsICZleHRlbnNpb25fbmFtZSkpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICByYyA9IHNxbGl0ZTNfbG9hZF9leHRlbnNpb24oc2VsZi0+ZGIsIGV4dGVuc2lvbl9uYW1lLCAwLCAmZXJybXNnKTsKICAgIGlmIChyYyAhPSAwKSB7CiAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHB5c3FsaXRlX09wZXJhdGlvbmFsRXJyb3IsIGVycm1zZyk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9IGVsc2UgewogICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICAgICByZXR1cm4gUHlfTm9uZTsKICAgIH0KfQojZW5kaWYKCmludCBweXNxbGl0ZV9jaGVja190aHJlYWQocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZikKewojaWZkZWYgV0lUSF9USFJFQUQKICAgIGlmIChzZWxmLT5jaGVja19zYW1lX3RocmVhZCkgewogICAgICAgIGlmIChQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCkgIT0gc2VsZi0+dGhyZWFkX2lkZW50KSB7CiAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChweXNxbGl0ZV9Qcm9ncmFtbWluZ0Vycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAiU1FMaXRlIG9iamVjdHMgY3JlYXRlZCBpbiBhIHRocmVhZCBjYW4gb25seSBiZSB1c2VkIGluIHRoYXQgc2FtZSB0aHJlYWQuICIKICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBvYmplY3Qgd2FzIGNyZWF0ZWQgaW4gdGhyZWFkIGlkICVsZCBhbmQgdGhpcyBpcyB0aHJlYWQgaWQgJWxkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnRocmVhZF9pZGVudCwgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQoKICAgIH0KI2VuZGlmCiAgICByZXR1cm4gMTsKfQoKc3RhdGljIFB5T2JqZWN0KiBweXNxbGl0ZV9jb25uZWN0aW9uX2dldF9pc29sYXRpb25fbGV2ZWwocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgdm9pZCogdW51c2VkKQp7CiAgICBQeV9JTkNSRUYoc2VsZi0+aXNvbGF0aW9uX2xldmVsKTsKICAgIHJldHVybiBzZWxmLT5pc29sYXRpb25fbGV2ZWw7Cn0KCnN0YXRpYyBQeU9iamVjdCogcHlzcWxpdGVfY29ubmVjdGlvbl9nZXRfdG90YWxfY2hhbmdlcyhweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCB2b2lkKiB1bnVzZWQpCnsKICAgIGlmICghcHlzcWxpdGVfY2hlY2tfY29ubmVjdGlvbihzZWxmKSkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHNxbGl0ZTNfdG90YWxfY2hhbmdlcyhzZWxmLT5kYikpOwogICAgfQp9CgpzdGF0aWMgaW50IHB5c3FsaXRlX2Nvbm5lY3Rpb25fc2V0X2lzb2xhdGlvbl9sZXZlbChweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogaXNvbGF0aW9uX2xldmVsKQp7CiAgICBQeU9iamVjdCogcmVzOwogICAgUHlPYmplY3QqIGJlZ2luX3N0YXRlbWVudDsKICAgIGNoYXIqIGJlZ2luX3N0YXRlbWVudF9zdHI7CgogICAgUHlfWERFQ1JFRihzZWxmLT5pc29sYXRpb25fbGV2ZWwpOwoKICAgIGlmIChzZWxmLT5iZWdpbl9zdGF0ZW1lbnQpIHsKICAgICAgICBQeU1lbV9GcmVlKHNlbGYtPmJlZ2luX3N0YXRlbWVudCk7CiAgICAgICAgc2VsZi0+YmVnaW5fc3RhdGVtZW50ID0gTlVMTDsKICAgIH0KCiAgICBpZiAoaXNvbGF0aW9uX2xldmVsID09IFB5X05vbmUpIHsKICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgICAgc2VsZi0+aXNvbGF0aW9uX2xldmVsID0gUHlfTm9uZTsKCiAgICAgICAgcmVzID0gcHlzcWxpdGVfY29ubmVjdGlvbl9jb21taXQoc2VsZiwgTlVMTCk7CiAgICAgICAgaWYgKCFyZXMpIHsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICBQeV9ERUNSRUYocmVzKTsKCiAgICAgICAgc2VsZi0+aW5UcmFuc2FjdGlvbiA9IDA7CiAgICB9IGVsc2UgewogICAgICAgIFB5X0lOQ1JFRihpc29sYXRpb25fbGV2ZWwpOwogICAgICAgIHNlbGYtPmlzb2xhdGlvbl9sZXZlbCA9IGlzb2xhdGlvbl9sZXZlbDsKCiAgICAgICAgYmVnaW5fc3RhdGVtZW50ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiQkVHSU4gIik7CiAgICAgICAgaWYgKCFiZWdpbl9zdGF0ZW1lbnQpIHsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICBQeVN0cmluZ19Db25jYXQoJmJlZ2luX3N0YXRlbWVudCwgaXNvbGF0aW9uX2xldmVsKTsKICAgICAgICBpZiAoIWJlZ2luX3N0YXRlbWVudCkgewogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQoKICAgICAgICBiZWdpbl9zdGF0ZW1lbnRfc3RyID0gUHlTdHJpbmdfQXNTdHJpbmcoYmVnaW5fc3RhdGVtZW50KTsKICAgICAgICBpZiAoIWJlZ2luX3N0YXRlbWVudF9zdHIpIHsKICAgICAgICAgICAgUHlfREVDUkVGKGJlZ2luX3N0YXRlbWVudCk7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgc2VsZi0+YmVnaW5fc3RhdGVtZW50ID0gUHlNZW1fTWFsbG9jKHN0cmxlbihiZWdpbl9zdGF0ZW1lbnRfc3RyKSArIDIpOwogICAgICAgIGlmICghc2VsZi0+YmVnaW5fc3RhdGVtZW50KSB7CiAgICAgICAgICAgIFB5X0RFQ1JFRihiZWdpbl9zdGF0ZW1lbnQpOwogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQoKICAgICAgICBzdHJjcHkoc2VsZi0+YmVnaW5fc3RhdGVtZW50LCBiZWdpbl9zdGF0ZW1lbnRfc3RyKTsKICAgICAgICBQeV9ERUNSRUYoYmVnaW5fc3RhdGVtZW50KTsKICAgIH0KCiAgICByZXR1cm4gMDsKfQoKUHlPYmplY3QqIHB5c3FsaXRlX2Nvbm5lY3Rpb25fY2FsbChweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKewogICAgUHlPYmplY3QqIHNxbDsKICAgIHB5c3FsaXRlX1N0YXRlbWVudCogc3RhdGVtZW50OwogICAgUHlPYmplY3QqIHdlYWtyZWY7CiAgICBpbnQgcmM7CgogICAgaWYgKCFweXNxbGl0ZV9jaGVja190aHJlYWQoc2VsZikgfHwgIXB5c3FsaXRlX2NoZWNrX2Nvbm5lY3Rpb24oc2VsZikpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBpZiAoIV9QeUFyZ19Ob0tleXdvcmRzKE1PRFVMRV9OQU1FICIuQ29ubmVjdGlvbigpIiwga3dhcmdzKSkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8iLCAmc3FsKSkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIF9weXNxbGl0ZV9kcm9wX3VudXNlZF9zdGF0ZW1lbnRfcmVmZXJlbmNlcyhzZWxmKTsKCiAgICBzdGF0ZW1lbnQgPSBQeU9iamVjdF9OZXcocHlzcWxpdGVfU3RhdGVtZW50LCAmcHlzcWxpdGVfU3RhdGVtZW50VHlwZSk7CiAgICBpZiAoIXN0YXRlbWVudCkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIHN0YXRlbWVudC0+ZGIgPSBOVUxMOwogICAgc3RhdGVtZW50LT5zdCA9IE5VTEw7CiAgICBzdGF0ZW1lbnQtPnNxbCA9IE5VTEw7CiAgICBzdGF0ZW1lbnQtPmluX3VzZSA9IDA7CiAgICBzdGF0ZW1lbnQtPmluX3dlYWtyZWZsaXN0ID0gTlVMTDsKCiAgICByYyA9IHB5c3FsaXRlX3N0YXRlbWVudF9jcmVhdGUoc3RhdGVtZW50LCBzZWxmLCBzcWwpOwoKICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKICAgICAgICBpZiAocmMgPT0gUFlTUUxJVEVfVE9PX01VQ0hfU1FMKSB7CiAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhweXNxbGl0ZV9XYXJuaW5nLCAiWW91IGNhbiBvbmx5IGV4ZWN1dGUgb25lIHN0YXRlbWVudCBhdCBhIHRpbWUuIik7CiAgICAgICAgfSBlbHNlIGlmIChyYyA9PSBQWVNRTElURV9TUUxfV1JPTkdfVFlQRSkgewogICAgICAgICAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkgfHwgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQogICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHB5c3FsaXRlX1dhcm5pbmcsICJTUUwgaXMgb2Ygd3JvbmcgdHlwZS4gTXVzdCBiZSBzdHJpbmcgb3IgdW5pY29kZS4iKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAodm9pZClweXNxbGl0ZV9zdGF0ZW1lbnRfcmVzZXQoc3RhdGVtZW50KTsKICAgICAgICAgICAgX3B5c3FsaXRlX3NldGVycm9yKHNlbGYtPmRiLCBOVUxMKTsKICAgICAgICB9CgogICAgICAgIFB5X0NMRUFSKHN0YXRlbWVudCk7CiAgICB9IGVsc2UgewogICAgICAgIHdlYWtyZWYgPSBQeVdlYWtyZWZfTmV3UmVmKChQeU9iamVjdCopc3RhdGVtZW50LCBOVUxMKTsKICAgICAgICBpZiAoIXdlYWtyZWYpIHsKICAgICAgICAgICAgUHlfQ0xFQVIoc3RhdGVtZW50KTsKICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICB9CgogICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKHNlbGYtPnN0YXRlbWVudHMsIHdlYWtyZWYpICE9IDApIHsKICAgICAgICAgICAgUHlfQ0xFQVIod2Vha3JlZik7CiAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgfQoKICAgICAgICBQeV9ERUNSRUYod2Vha3JlZik7CiAgICB9CgplcnJvcjoKICAgIHJldHVybiAoUHlPYmplY3QqKXN0YXRlbWVudDsKfQoKUHlPYmplY3QqIHB5c3FsaXRlX2Nvbm5lY3Rpb25fZXhlY3V0ZShweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncykKewogICAgUHlPYmplY3QqIGN1cnNvciA9IDA7CiAgICBQeU9iamVjdCogcmVzdWx0ID0gMDsKICAgIFB5T2JqZWN0KiBtZXRob2QgPSAwOwoKICAgIGN1cnNvciA9IFB5T2JqZWN0X0NhbGxNZXRob2QoKFB5T2JqZWN0KilzZWxmLCAiY3Vyc29yIiwgIiIpOwogICAgaWYgKCFjdXJzb3IpIHsKICAgICAgICBnb3RvIGVycm9yOwogICAgfQoKICAgIG1ldGhvZCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoY3Vyc29yLCAiZXhlY3V0ZSIpOwogICAgaWYgKCFtZXRob2QpIHsKICAgICAgICBQeV9DTEVBUihjdXJzb3IpOwogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CgogICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE9iamVjdChtZXRob2QsIGFyZ3MpOwogICAgaWYgKCFyZXN1bHQpIHsKICAgICAgICBQeV9DTEVBUihjdXJzb3IpOwogICAgfQoKZXJyb3I6CiAgICBQeV9YREVDUkVGKHJlc3VsdCk7CiAgICBQeV9YREVDUkVGKG1ldGhvZCk7CgogICAgcmV0dXJuIGN1cnNvcjsKfQoKUHlPYmplY3QqIHB5c3FsaXRlX2Nvbm5lY3Rpb25fZXhlY3V0ZW1hbnkocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCnsKICAgIFB5T2JqZWN0KiBjdXJzb3IgPSAwOwogICAgUHlPYmplY3QqIHJlc3VsdCA9IDA7CiAgICBQeU9iamVjdCogbWV0aG9kID0gMDsKCiAgICBjdXJzb3IgPSBQeU9iamVjdF9DYWxsTWV0aG9kKChQeU9iamVjdCopc2VsZiwgImN1cnNvciIsICIiKTsKICAgIGlmICghY3Vyc29yKSB7CiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KCiAgICBtZXRob2QgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGN1cnNvciwgImV4ZWN1dGVtYW55Iik7CiAgICBpZiAoIW1ldGhvZCkgewogICAgICAgIFB5X0NMRUFSKGN1cnNvcik7CiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KCiAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsT2JqZWN0KG1ldGhvZCwgYXJncyk7CiAgICBpZiAoIXJlc3VsdCkgewogICAgICAgIFB5X0NMRUFSKGN1cnNvcik7CiAgICB9CgplcnJvcjoKICAgIFB5X1hERUNSRUYocmVzdWx0KTsKICAgIFB5X1hERUNSRUYobWV0aG9kKTsKCiAgICByZXR1cm4gY3Vyc29yOwp9CgpQeU9iamVjdCogcHlzcWxpdGVfY29ubmVjdGlvbl9leGVjdXRlc2NyaXB0KHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQp7CiAgICBQeU9iamVjdCogY3Vyc29yID0gMDsKICAgIFB5T2JqZWN0KiByZXN1bHQgPSAwOwogICAgUHlPYmplY3QqIG1ldGhvZCA9IDA7CgogICAgY3Vyc29yID0gUHlPYmplY3RfQ2FsbE1ldGhvZCgoUHlPYmplY3QqKXNlbGYsICJjdXJzb3IiLCAiIik7CiAgICBpZiAoIWN1cnNvcikgewogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CgogICAgbWV0aG9kID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhjdXJzb3IsICJleGVjdXRlc2NyaXB0Iik7CiAgICBpZiAoIW1ldGhvZCkgewogICAgICAgIFB5X0NMRUFSKGN1cnNvcik7CiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KCiAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsT2JqZWN0KG1ldGhvZCwgYXJncyk7CiAgICBpZiAoIXJlc3VsdCkgewogICAgICAgIFB5X0NMRUFSKGN1cnNvcik7CiAgICB9CgplcnJvcjoKICAgIFB5X1hERUNSRUYocmVzdWx0KTsKICAgIFB5X1hERUNSRUYobWV0aG9kKTsKCiAgICByZXR1cm4gY3Vyc29yOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENPTExBVElPTiBDT0RFIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKc3RhdGljIGludApweXNxbGl0ZV9jb2xsYXRpb25fY2FsbGJhY2soCiAgICAgICAgdm9pZCogY29udGV4dCwKICAgICAgICBpbnQgdGV4dDFfbGVuZ3RoLCBjb25zdCB2b2lkKiB0ZXh0MV9kYXRhLAogICAgICAgIGludCB0ZXh0Ml9sZW5ndGgsIGNvbnN0IHZvaWQqIHRleHQyX2RhdGEpCnsKICAgIFB5T2JqZWN0KiBjYWxsYmFjayA9IChQeU9iamVjdCopY29udGV4dDsKICAgIFB5T2JqZWN0KiBzdHJpbmcxID0gMDsKICAgIFB5T2JqZWN0KiBzdHJpbmcyID0gMDsKI2lmZGVmIFdJVEhfVEhSRUFECiAgICBQeUdJTFN0YXRlX1NUQVRFIGdpbHN0YXRlOwojZW5kaWYKICAgIFB5T2JqZWN0KiByZXR2YWwgPSBOVUxMOwogICAgbG9uZyBsb25ndmFsOwogICAgaW50IHJlc3VsdCA9IDA7CiNpZmRlZiBXSVRIX1RIUkVBRAogICAgZ2lsc3RhdGUgPSBQeUdJTFN0YXRlX0Vuc3VyZSgpOwojZW5kaWYKCiAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgIGdvdG8gZmluYWxseTsKICAgIH0KCiAgICBzdHJpbmcxID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNvbnN0IGNoYXIqKXRleHQxX2RhdGEsIHRleHQxX2xlbmd0aCk7CiAgICBzdHJpbmcyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNvbnN0IGNoYXIqKXRleHQyX2RhdGEsIHRleHQyX2xlbmd0aCk7CgogICAgaWYgKCFzdHJpbmcxIHx8ICFzdHJpbmcyKSB7CiAgICAgICAgZ290byBmaW5hbGx5OyAvKiBmYWlsZWQgdG8gYWxsb2NhdGUgc3RyaW5ncyAqLwogICAgfQoKICAgIHJldHZhbCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoY2FsbGJhY2ssIHN0cmluZzEsIHN0cmluZzIsIE5VTEwpOwoKICAgIGlmICghcmV0dmFsKSB7CiAgICAgICAgLyogZXhlY3V0aW9uIGZhaWxlZCAqLwogICAgICAgIGdvdG8gZmluYWxseTsKICAgIH0KCiAgICBsb25ndmFsID0gUHlMb25nX0FzTG9uZ0FuZE92ZXJmbG93KHJldHZhbCwgJnJlc3VsdCk7CiAgICBpZiAobG9uZ3ZhbCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgUHlFcnJfQ2xlYXIoKTsKICAgICAgICByZXN1bHQgPSAwOwogICAgfQogICAgZWxzZSBpZiAoIXJlc3VsdCkgewogICAgICAgIGlmIChsb25ndmFsID4gMCkKICAgICAgICAgICAgcmVzdWx0ID0gMTsKICAgICAgICBlbHNlIGlmIChsb25ndmFsIDwgMCkKICAgICAgICAgICAgcmVzdWx0ID0gLTE7CiAgICB9CgpmaW5hbGx5OgogICAgUHlfWERFQ1JFRihzdHJpbmcxKTsKICAgIFB5X1hERUNSRUYoc3RyaW5nMik7CiAgICBQeV9YREVDUkVGKHJldHZhbCk7CiNpZmRlZiBXSVRIX1RIUkVBRAogICAgUHlHSUxTdGF0ZV9SZWxlYXNlKGdpbHN0YXRlKTsKI2VuZGlmCiAgICByZXR1cm4gcmVzdWx0Owp9CgpzdGF0aWMgUHlPYmplY3QgKgpweXNxbGl0ZV9jb25uZWN0aW9uX2ludGVycnVwdChweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncykKewogICAgUHlPYmplY3QqIHJldHZhbCA9IE5VTEw7CgogICAgaWYgKCFweXNxbGl0ZV9jaGVja19jb25uZWN0aW9uKHNlbGYpKSB7CiAgICAgICAgZ290byBmaW5hbGx5OwogICAgfQoKICAgIHNxbGl0ZTNfaW50ZXJydXB0KHNlbGYtPmRiKTsKCiAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICByZXR2YWwgPSBQeV9Ob25lOwoKZmluYWxseToKICAgIHJldHVybiByZXR2YWw7Cn0KCi8qIEZ1bmN0aW9uIGF1dGhvcjogUGF1bCBLaXBwZXMgPGtpcHBlc3BAZ21haWwuY29tPgogKiBDbGFzcyBtZXRob2Qgb2YgQ29ubmVjdGlvbiB0byBjYWxsIHRoZSBQeXRob24gZnVuY3Rpb24gX2l0ZXJkdW1wCiAqIG9mIHRoZSBzcWxpdGUzIG1vZHVsZS4KICovCnN0YXRpYyBQeU9iamVjdCAqCnB5c3FsaXRlX2Nvbm5lY3Rpb25faXRlcmR1bXAocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCnsKICAgIFB5T2JqZWN0KiByZXR2YWwgPSBOVUxMOwogICAgUHlPYmplY3QqIG1vZHVsZSA9IE5VTEw7CiAgICBQeU9iamVjdCogbW9kdWxlX2RpY3Q7CiAgICBQeU9iamVjdCogcHlmbl9pdGVyZHVtcDsKCiAgICBpZiAoIXB5c3FsaXRlX2NoZWNrX2Nvbm5lY3Rpb24oc2VsZikpIHsKICAgICAgICBnb3RvIGZpbmFsbHk7CiAgICB9CgogICAgbW9kdWxlID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKE1PRFVMRV9OQU1FICIuZHVtcCIpOwogICAgaWYgKCFtb2R1bGUpIHsKICAgICAgICBnb3RvIGZpbmFsbHk7CiAgICB9CgogICAgbW9kdWxlX2RpY3QgPSBQeU1vZHVsZV9HZXREaWN0KG1vZHVsZSk7CiAgICBpZiAoIW1vZHVsZV9kaWN0KSB7CiAgICAgICAgZ290byBmaW5hbGx5OwogICAgfQoKICAgIHB5Zm5faXRlcmR1bXAgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhtb2R1bGVfZGljdCwgIl9pdGVyZHVtcCIpOwogICAgaWYgKCFweWZuX2l0ZXJkdW1wKSB7CiAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHB5c3FsaXRlX09wZXJhdGlvbmFsRXJyb3IsICJGYWlsZWQgdG8gb2J0YWluIF9pdGVyZHVtcCgpIHJlZmVyZW5jZSIpOwogICAgICAgIGdvdG8gZmluYWxseTsKICAgIH0KCiAgICBhcmdzID0gUHlUdXBsZV9OZXcoMSk7CiAgICBpZiAoIWFyZ3MpIHsKICAgICAgICBnb3RvIGZpbmFsbHk7CiAgICB9CiAgICBQeV9JTkNSRUYoc2VsZik7CiAgICBQeVR1cGxlX1NldEl0ZW0oYXJncywgMCwgKFB5T2JqZWN0KilzZWxmKTsKICAgIHJldHZhbCA9IFB5T2JqZWN0X0NhbGxPYmplY3QocHlmbl9pdGVyZHVtcCwgYXJncyk7CgpmaW5hbGx5OgogICAgUHlfWERFQ1JFRihhcmdzKTsKICAgIFB5X1hERUNSRUYobW9kdWxlKTsKICAgIHJldHVybiByZXR2YWw7Cn0KCnN0YXRpYyBQeU9iamVjdCAqCnB5c3FsaXRlX2Nvbm5lY3Rpb25fY3JlYXRlX2NvbGxhdGlvbihweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncykKewogICAgUHlPYmplY3QqIGNhbGxhYmxlOwogICAgUHlPYmplY3QqIHVwcGVyY2FzZV9uYW1lID0gMDsKICAgIFB5T2JqZWN0KiBuYW1lOwogICAgUHlPYmplY3QqIHJldHZhbDsKICAgIGNoYXIqIGNoazsKICAgIGludCByYzsKCiAgICBpZiAoIXB5c3FsaXRlX2NoZWNrX3RocmVhZChzZWxmKSB8fCAhcHlzcWxpdGVfY2hlY2tfY29ubmVjdGlvbihzZWxmKSkgewogICAgICAgIGdvdG8gZmluYWxseTsKICAgIH0KCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlNPOmNyZWF0ZV9jb2xsYXRpb24obmFtZSwgY2FsbGJhY2spIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZSwgJmNhbGxhYmxlKSkgewogICAgICAgIGdvdG8gZmluYWxseTsKICAgIH0KCiAgICB1cHBlcmNhc2VfbmFtZSA9IFB5T2JqZWN0X0NhbGxNZXRob2QoKFB5T2JqZWN0ICopJlB5U3RyaW5nX1R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVwcGVyIiwgIk8iLCBuYW1lKTsKICAgIGlmICghdXBwZXJjYXNlX25hbWUpIHsKICAgICAgICBnb3RvIGZpbmFsbHk7CiAgICB9CgogICAgY2hrID0gUHlTdHJpbmdfQVNfU1RSSU5HKHVwcGVyY2FzZV9uYW1lKTsKICAgIHdoaWxlICgqY2hrKSB7CiAgICAgICAgaWYgKCgqY2hrID49ICcwJyAmJiAqY2hrIDw9ICc5JykKICAgICAgICAgfHwgKCpjaGsgPj0gJ0EnICYmICpjaGsgPD0gJ1onKQogICAgICAgICB8fCAoKmNoayA9PSAnXycpKQogICAgICAgIHsKICAgICAgICAgICAgY2hrKys7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHB5c3FsaXRlX1Byb2dyYW1taW5nRXJyb3IsICJpbnZhbGlkIGNoYXJhY3RlciBpbiBjb2xsYXRpb24gbmFtZSIpOwogICAgICAgICAgICBnb3RvIGZpbmFsbHk7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChjYWxsYWJsZSAhPSBQeV9Ob25lICYmICFQeUNhbGxhYmxlX0NoZWNrKGNhbGxhYmxlKSkgewogICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJwYXJhbWV0ZXIgbXVzdCBiZSBjYWxsYWJsZSIpOwogICAgICAgIGdvdG8gZmluYWxseTsKICAgIH0KCiAgICBpZiAoY2FsbGFibGUgIT0gUHlfTm9uZSkgewogICAgICAgIGlmIChQeURpY3RfU2V0SXRlbShzZWxmLT5jb2xsYXRpb25zLCB1cHBlcmNhc2VfbmFtZSwgY2FsbGFibGUpID09IC0xKQogICAgICAgICAgICBnb3RvIGZpbmFsbHk7CiAgICB9IGVsc2UgewogICAgICAgIGlmIChQeURpY3RfRGVsSXRlbShzZWxmLT5jb2xsYXRpb25zLCB1cHBlcmNhc2VfbmFtZSkgPT0gLTEpCiAgICAgICAgICAgIGdvdG8gZmluYWxseTsKICAgIH0KCiAgICByYyA9IHNxbGl0ZTNfY3JlYXRlX2NvbGxhdGlvbihzZWxmLT5kYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nKHVwcGVyY2FzZV9uYW1lKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNRTElURV9VVEY4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhbGxhYmxlICE9IFB5X05vbmUpID8gY2FsbGFibGUgOiBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhbGxhYmxlICE9IFB5X05vbmUpID8gcHlzcWxpdGVfY29sbGF0aW9uX2NhbGxiYWNrIDogTlVMTCk7CiAgICBpZiAocmMgIT0gU1FMSVRFX09LKSB7CiAgICAgICAgUHlEaWN0X0RlbEl0ZW0oc2VsZi0+Y29sbGF0aW9ucywgdXBwZXJjYXNlX25hbWUpOwogICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5kYiwgTlVMTCk7CiAgICAgICAgZ290byBmaW5hbGx5OwogICAgfQoKZmluYWxseToKICAgIFB5X1hERUNSRUYodXBwZXJjYXNlX25hbWUpOwoKICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgcmV0dmFsID0gTlVMTDsKICAgIH0gZWxzZSB7CiAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgICAgIHJldHZhbCA9IFB5X05vbmU7CiAgICB9CgogICAgcmV0dXJuIHJldHZhbDsKfQoKLyogQ2FsbGVkIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgdXNlZCBhcyBhIGNvbnRleHQgbWFuYWdlci4gUmV0dXJucyBpdHNlbGYgYXMgYQogKiBjb252ZW5pZW5jZSB0byB0aGUgY2FsbGVyLiAqLwpzdGF0aWMgUHlPYmplY3QgKgpweXNxbGl0ZV9jb25uZWN0aW9uX2VudGVyKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQp7CiAgICBQeV9JTkNSRUYoc2VsZik7CiAgICByZXR1cm4gKFB5T2JqZWN0KilzZWxmOwp9CgovKiogQ2FsbGVkIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgdXNlZCBhcyBhIGNvbnRleHQgbWFuYWdlci4gSWYgdGhlcmUgd2FzIGFueQogKiBleGNlcHRpb24sIGEgcm9sbGJhY2sgdGFrZXMgcGxhY2U7IG90aGVyd2lzZSB3ZSBjb21taXQuICovCnN0YXRpYyBQeU9iamVjdCAqCnB5c3FsaXRlX2Nvbm5lY3Rpb25fZXhpdChweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncykKewogICAgUHlPYmplY3QqIGV4Y190eXBlLCAqZXhjX3ZhbHVlLCAqZXhjX3RiOwogICAgY2hhciogbWV0aG9kX25hbWU7CiAgICBQeU9iamVjdCogcmVzdWx0OwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT09PIiwgJmV4Y190eXBlLCAmZXhjX3ZhbHVlLCAmZXhjX3RiKSkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIGlmIChleGNfdHlwZSA9PSBQeV9Ob25lICYmIGV4Y192YWx1ZSA9PSBQeV9Ob25lICYmIGV4Y190YiA9PSBQeV9Ob25lKSB7CiAgICAgICAgbWV0aG9kX25hbWUgPSAiY29tbWl0IjsKICAgIH0gZWxzZSB7CiAgICAgICAgbWV0aG9kX25hbWUgPSAicm9sbGJhY2siOwogICAgfQoKICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxNZXRob2QoKFB5T2JqZWN0KilzZWxmLCBtZXRob2RfbmFtZSwgIiIpOwogICAgaWYgKCFyZXN1bHQpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIFB5X0RFQ1JFRihyZXN1bHQpOwoKICAgIFB5X0lOQ1JFRihQeV9GYWxzZSk7CiAgICByZXR1cm4gUHlfRmFsc2U7Cn0KCnN0YXRpYyBjaGFyIGNvbm5lY3Rpb25fZG9jW10gPQpQeURvY19TVFIoIlNRTGl0ZSBkYXRhYmFzZSBjb25uZWN0aW9uIG9iamVjdC4iKTsKCnN0YXRpYyBQeUdldFNldERlZiBjb25uZWN0aW9uX2dldHNldFtdID0gewogICAgeyJpc29sYXRpb25fbGV2ZWwiLCAgKGdldHRlcilweXNxbGl0ZV9jb25uZWN0aW9uX2dldF9pc29sYXRpb25fbGV2ZWwsIChzZXR0ZXIpcHlzcWxpdGVfY29ubmVjdGlvbl9zZXRfaXNvbGF0aW9uX2xldmVsfSwKICAgIHsidG90YWxfY2hhbmdlcyIsICAoZ2V0dGVyKXB5c3FsaXRlX2Nvbm5lY3Rpb25fZ2V0X3RvdGFsX2NoYW5nZXMsIChzZXR0ZXIpMH0sCiAgICB7TlVMTH0KfTsKCnN0YXRpYyBQeU1ldGhvZERlZiBjb25uZWN0aW9uX21ldGhvZHNbXSA9IHsKICAgIHsiY3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX2Nvbm5lY3Rpb25fY3Vyc29yLCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywKICAgICAgICBQeURvY19TVFIoIlJldHVybiBhIGN1cnNvciBmb3IgdGhlIGNvbm5lY3Rpb24uIil9LAogICAgeyJjbG9zZSIsIChQeUNGdW5jdGlvbilweXNxbGl0ZV9jb25uZWN0aW9uX2Nsb3NlLCBNRVRIX05PQVJHUywKICAgICAgICBQeURvY19TVFIoIkNsb3NlcyB0aGUgY29ubmVjdGlvbi4iKX0sCiAgICB7ImNvbW1pdCIsIChQeUNGdW5jdGlvbilweXNxbGl0ZV9jb25uZWN0aW9uX2NvbW1pdCwgTUVUSF9OT0FSR1MsCiAgICAgICAgUHlEb2NfU1RSKCJDb21taXQgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24uIil9LAogICAgeyJyb2xsYmFjayIsIChQeUNGdW5jdGlvbilweXNxbGl0ZV9jb25uZWN0aW9uX3JvbGxiYWNrLCBNRVRIX05PQVJHUywKICAgICAgICBQeURvY19TVFIoIlJvbGwgYmFjayB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4iKX0sCiAgICB7ImNyZWF0ZV9mdW5jdGlvbiIsIChQeUNGdW5jdGlvbilweXNxbGl0ZV9jb25uZWN0aW9uX2NyZWF0ZV9mdW5jdGlvbiwgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsCiAgICAgICAgUHlEb2NfU1RSKCJDcmVhdGVzIGEgbmV3IGZ1bmN0aW9uLiBOb24tc3RhbmRhcmQuIil9LAogICAgeyJjcmVhdGVfYWdncmVnYXRlIiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX2Nvbm5lY3Rpb25fY3JlYXRlX2FnZ3JlZ2F0ZSwgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsCiAgICAgICAgUHlEb2NfU1RSKCJDcmVhdGVzIGEgbmV3IGFnZ3JlZ2F0ZS4gTm9uLXN0YW5kYXJkLiIpfSwKICAgIHsic2V0X2F1dGhvcml6ZXIiLCAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfY29ubmVjdGlvbl9zZXRfYXV0aG9yaXplciwgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsCiAgICAgICAgUHlEb2NfU1RSKCJTZXRzIGF1dGhvcml6ZXIgY2FsbGJhY2suIE5vbi1zdGFuZGFyZC4iKX0sCiAgICAjaWZkZWYgSEFWRV9MT0FEX0VYVEVOU0lPTgogICAgeyJlbmFibGVfbG9hZF9leHRlbnNpb24iLCAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfZW5hYmxlX2xvYWRfZXh0ZW5zaW9uLCBNRVRIX1ZBUkFSR1MsCiAgICAgICAgUHlEb2NfU1RSKCJFbmFibGUgZHluYW1pYyBsb2FkaW5nIG9mIFNRTGl0ZSBleHRlbnNpb24gbW9kdWxlcy4gTm9uLXN0YW5kYXJkLiIpfSwKICAgIHsibG9hZF9leHRlbnNpb24iLCAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfbG9hZF9leHRlbnNpb24sIE1FVEhfVkFSQVJHUywKICAgICAgICBQeURvY19TVFIoIkxvYWQgU1FMaXRlIGV4dGVuc2lvbiBtb2R1bGUuIE5vbi1zdGFuZGFyZC4iKX0sCiAgICAjZW5kaWYKICAgIHsic2V0X3Byb2dyZXNzX2hhbmRsZXIiLCAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfY29ubmVjdGlvbl9zZXRfcHJvZ3Jlc3NfaGFuZGxlciwgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsCiAgICAgICAgUHlEb2NfU1RSKCJTZXRzIHByb2dyZXNzIGhhbmRsZXIgY2FsbGJhY2suIE5vbi1zdGFuZGFyZC4iKX0sCiAgICB7ImV4ZWN1dGUiLCAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfY29ubmVjdGlvbl9leGVjdXRlLCBNRVRIX1ZBUkFSR1MsCiAgICAgICAgUHlEb2NfU1RSKCJFeGVjdXRlcyBhIFNRTCBzdGF0ZW1lbnQuIE5vbi1zdGFuZGFyZC4iKX0sCiAgICB7ImV4ZWN1dGVtYW55IiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX2Nvbm5lY3Rpb25fZXhlY3V0ZW1hbnksIE1FVEhfVkFSQVJHUywKICAgICAgICBQeURvY19TVFIoIlJlcGVhdGVkbHkgZXhlY3V0ZXMgYSBTUUwgc3RhdGVtZW50LiBOb24tc3RhbmRhcmQuIil9LAogICAgeyJleGVjdXRlc2NyaXB0IiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX2Nvbm5lY3Rpb25fZXhlY3V0ZXNjcmlwdCwgTUVUSF9WQVJBUkdTLAogICAgICAgIFB5RG9jX1NUUigiRXhlY3V0ZXMgYSBtdWx0aXBsZSBTUUwgc3RhdGVtZW50cyBhdCBvbmNlLiBOb24tc3RhbmRhcmQuIil9LAogICAgeyJjcmVhdGVfY29sbGF0aW9uIiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX2Nvbm5lY3Rpb25fY3JlYXRlX2NvbGxhdGlvbiwgTUVUSF9WQVJBUkdTLAogICAgICAgIFB5RG9jX1NUUigiQ3JlYXRlcyBhIGNvbGxhdGlvbiBmdW5jdGlvbi4gTm9uLXN0YW5kYXJkLiIpfSwKICAgIHsiaW50ZXJydXB0IiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX2Nvbm5lY3Rpb25faW50ZXJydXB0LCBNRVRIX05PQVJHUywKICAgICAgICBQeURvY19TVFIoIkFib3J0IGFueSBwZW5kaW5nIGRhdGFiYXNlIG9wZXJhdGlvbi4gTm9uLXN0YW5kYXJkLiIpfSwKICAgIHsiaXRlcmR1bXAiLCAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfY29ubmVjdGlvbl9pdGVyZHVtcCwgTUVUSF9OT0FSR1MsCiAgICAgICAgUHlEb2NfU1RSKCJSZXR1cm5zIGl0ZXJhdG9yIHRvIHRoZSBkdW1wIG9mIHRoZSBkYXRhYmFzZSBpbiBhbiBTUUwgdGV4dCBmb3JtYXQuIE5vbi1zdGFuZGFyZC4iKX0sCiAgICB7Il9fZW50ZXJfXyIsIChQeUNGdW5jdGlvbilweXNxbGl0ZV9jb25uZWN0aW9uX2VudGVyLCBNRVRIX05PQVJHUywKICAgICAgICBQeURvY19TVFIoIkZvciBjb250ZXh0IG1hbmFnZXIuIE5vbi1zdGFuZGFyZC4iKX0sCiAgICB7Il9fZXhpdF9fIiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX2Nvbm5lY3Rpb25fZXhpdCwgTUVUSF9WQVJBUkdTLAogICAgICAgIFB5RG9jX1NUUigiRm9yIGNvbnRleHQgbWFuYWdlci4gTm9uLXN0YW5kYXJkLiIpfSwKICAgIHtOVUxMLCBOVUxMfQp9OwoKc3RhdGljIHN0cnVjdCBQeU1lbWJlckRlZiBjb25uZWN0aW9uX21lbWJlcnNbXSA9CnsKICAgIHsiV2FybmluZyIsIFRfT0JKRUNULCBvZmZzZXRvZihweXNxbGl0ZV9Db25uZWN0aW9uLCBXYXJuaW5nKSwgUk99LAogICAgeyJFcnJvciIsIFRfT0JKRUNULCBvZmZzZXRvZihweXNxbGl0ZV9Db25uZWN0aW9uLCBFcnJvciksIFJPfSwKICAgIHsiSW50ZXJmYWNlRXJyb3IiLCBUX09CSkVDVCwgb2Zmc2V0b2YocHlzcWxpdGVfQ29ubmVjdGlvbiwgSW50ZXJmYWNlRXJyb3IpLCBST30sCiAgICB7IkRhdGFiYXNlRXJyb3IiLCBUX09CSkVDVCwgb2Zmc2V0b2YocHlzcWxpdGVfQ29ubmVjdGlvbiwgRGF0YWJhc2VFcnJvciksIFJPfSwKICAgIHsiRGF0YUVycm9yIiwgVF9PQkpFQ1QsIG9mZnNldG9mKHB5c3FsaXRlX0Nvbm5lY3Rpb24sIERhdGFFcnJvciksIFJPfSwKICAgIHsiT3BlcmF0aW9uYWxFcnJvciIsIFRfT0JKRUNULCBvZmZzZXRvZihweXNxbGl0ZV9Db25uZWN0aW9uLCBPcGVyYXRpb25hbEVycm9yKSwgUk99LAogICAgeyJJbnRlZ3JpdHlFcnJvciIsIFRfT0JKRUNULCBvZmZzZXRvZihweXNxbGl0ZV9Db25uZWN0aW9uLCBJbnRlZ3JpdHlFcnJvciksIFJPfSwKICAgIHsiSW50ZXJuYWxFcnJvciIsIFRfT0JKRUNULCBvZmZzZXRvZihweXNxbGl0ZV9Db25uZWN0aW9uLCBJbnRlcm5hbEVycm9yKSwgUk99LAogICAgeyJQcm9ncmFtbWluZ0Vycm9yIiwgVF9PQkpFQ1QsIG9mZnNldG9mKHB5c3FsaXRlX0Nvbm5lY3Rpb24sIFByb2dyYW1taW5nRXJyb3IpLCBST30sCiAgICB7Ik5vdFN1cHBvcnRlZEVycm9yIiwgVF9PQkpFQ1QsIG9mZnNldG9mKHB5c3FsaXRlX0Nvbm5lY3Rpb24sIE5vdFN1cHBvcnRlZEVycm9yKSwgUk99LAogICAgeyJyb3dfZmFjdG9yeSIsIFRfT0JKRUNULCBvZmZzZXRvZihweXNxbGl0ZV9Db25uZWN0aW9uLCByb3dfZmFjdG9yeSl9LAogICAgeyJ0ZXh0X2ZhY3RvcnkiLCBUX09CSkVDVCwgb2Zmc2V0b2YocHlzcWxpdGVfQ29ubmVjdGlvbiwgdGV4dF9mYWN0b3J5KX0sCiAgICB7TlVMTH0KfTsKClB5VHlwZU9iamVjdCBweXNxbGl0ZV9Db25uZWN0aW9uVHlwZSA9IHsKICAgICAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKICAgICAgICBNT0RVTEVfTkFNRSAiLkNvbm5lY3Rpb24iLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCiAgICAgICAgc2l6ZW9mKHB5c3FsaXRlX0Nvbm5lY3Rpb24pLCAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KICAgICAgICAoZGVzdHJ1Y3RvcilweXNxbGl0ZV9jb25uZWN0aW9uX2RlYWxsb2MsICAgICAgICAvKiB0cF9kZWFsbG9jICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLwogICAgICAgICh0ZXJuYXJ5ZnVuYylweXNxbGl0ZV9jb25uZWN0aW9uX2NhbGwsICAgICAgICAgIC8qIHRwX2NhbGwgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCiAgICAgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgLyogdHBfZmxhZ3MgKi8KICAgICAgICBjb25uZWN0aW9uX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLwogICAgICAgIGNvbm5lY3Rpb25fbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KICAgICAgICBjb25uZWN0aW9uX21lbWJlcnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCiAgICAgICAgY29ubmVjdGlvbl9nZXRzZXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCiAgICAgICAgKGluaXRwcm9jKXB5c3FsaXRlX2Nvbm5lY3Rpb25faW5pdCwgICAgICAgICAgICAgLyogdHBfaW5pdCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCiAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwp9OwoKZXh0ZXJuIGludCBweXNxbGl0ZV9jb25uZWN0aW9uX3NldHVwX3R5cGVzKHZvaWQpCnsKICAgIHB5c3FsaXRlX0Nvbm5lY3Rpb25UeXBlLnRwX25ldyA9IFB5VHlwZV9HZW5lcmljTmV3OwogICAgcmV0dXJuIFB5VHlwZV9SZWFkeSgmcHlzcWxpdGVfQ29ubmVjdGlvblR5cGUpOwp9Cg==