ICAgIC8qIG1vZHVsZS5jIC0gdGhlIG1vZHVsZSBpdHNlbGYKICAgICAqCiAgICAgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CiAgICAgKgogICAgICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCiAgICAgKgogICAgICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKICAgICAqIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKICAgICAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCiAgICAgKgogICAgICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCiAgICAgKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CiAgICAgKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CiAgICAgKgogICAgICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKICAgICAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCiAgICAgKiAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKICAgICAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCiAgICAgKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQogICAgICogICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgogICAgICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KICAgICAqLwoKI2luY2x1ZGUgImNvbm5lY3Rpb24uaCIKI2luY2x1ZGUgInN0YXRlbWVudC5oIgojaW5jbHVkZSAiY3Vyc29yLmgiCiNpbmNsdWRlICJjYWNoZS5oIgojaW5jbHVkZSAicHJlcGFyZV9wcm90b2NvbC5oIgojaW5jbHVkZSAibWljcm9wcm90b2NvbHMuaCIKI2luY2x1ZGUgInJvdy5oIgoKI2lmIFNRTElURV9WRVJTSU9OX05VTUJFUiA+PSAzMDAzMDAzCiNkZWZpbmUgSEFWRV9TSEFSRURfQ0FDSEUKI2VuZGlmCgovKiBzdGF0aWMgb2JqZWN0cyBhdCBtb2R1bGUtbGV2ZWwgKi8KClB5T2JqZWN0KiBFcnJvciwgKldhcm5pbmcsICpJbnRlcmZhY2VFcnJvciwgKkRhdGFiYXNlRXJyb3IsICpJbnRlcm5hbEVycm9yLAogICAgKk9wZXJhdGlvbmFsRXJyb3IsICpQcm9ncmFtbWluZ0Vycm9yLCAqSW50ZWdyaXR5RXJyb3IsICpEYXRhRXJyb3IsCiAgICAqTm90U3VwcG9ydGVkRXJyb3IsICpPcHRpbWl6ZWRVbmljb2RlOwoKUHlPYmplY3QqIGNvbnZlcnRlcnM7CmludCBfZW5hYmxlX2NhbGxiYWNrX3RyYWNlYmFja3M7CgpzdGF0aWMgUHlPYmplY3QqIG1vZHVsZV9jb25uZWN0KFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqCiAgICAgICAga3dhcmdzKQp7CiAgICAvKiBQeXRob24gc2VlbXMgdG8gaGF2ZSBubyB3YXkgb2YgZXh0cmFjdGluZyBhIHNpbmdsZSBrZXl3b3JkLWFyZyBhdAogICAgICogQy1sZXZlbCwgc28gdGhpcyBjb2RlIGlzIHJlZHVuZGFudCB3aXRoIHRoZSBvbmUgaW4gY29ubmVjdGlvbl9pbml0IGluCiAgICAgKiBjb25uZWN0aW9uLmMgYW5kIG11c3QgYWx3YXlzIGJlIGNvcGllZCBmcm9tIHRoZXJlIC4uLiAqLwoKICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiZGF0YWJhc2UiLCAidGltZW91dCIsICJkZXRlY3RfdHlwZXMiLCAiaXNvbGF0aW9uX2xldmVsIiwgImNoZWNrX3NhbWVfdGhyZWFkIiwgImZhY3RvcnkiLCAiY2FjaGVkX3N0YXRlbWVudHMiLCBOVUxMLCBOVUxMfTsKICAgIGNoYXIqIGRhdGFiYXNlOwogICAgaW50IGRldGVjdF90eXBlcyA9IDA7CiAgICBQeU9iamVjdCogaXNvbGF0aW9uX2xldmVsOwogICAgUHlPYmplY3QqIGZhY3RvcnkgPSBOVUxMOwogICAgaW50IGNoZWNrX3NhbWVfdGhyZWFkID0gMTsKICAgIGludCBjYWNoZWRfc3RhdGVtZW50czsKICAgIGRvdWJsZSB0aW1lb3V0ID0gNS4wOwoKICAgIFB5T2JqZWN0KiByZXN1bHQ7CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAic3xkaU9pT2kiLCBrd2xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YWJhc2UsICZ0aW1lb3V0LCAmZGV0ZWN0X3R5cGVzLCAmaXNvbGF0aW9uX2xldmVsLCAmY2hlY2tfc2FtZV90aHJlYWQsICZmYWN0b3J5LCAmY2FjaGVkX3N0YXRlbWVudHMpKQogICAgewogICAgICAgIHJldHVybiBOVUxMOyAKICAgIH0KCiAgICBpZiAoZmFjdG9yeSA9PSBOVUxMKSB7CiAgICAgICAgZmFjdG9yeSA9IChQeU9iamVjdCopJkNvbm5lY3Rpb25UeXBlOwogICAgfQoKICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGwoZmFjdG9yeSwgYXJncywga3dhcmdzKTsKCiAgICByZXR1cm4gcmVzdWx0Owp9CgpzdGF0aWMgUHlPYmplY3QqIG1vZHVsZV9jb21wbGV0ZShQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KgogICAgICAgIGt3YXJncykKewogICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJzdGF0ZW1lbnQiLCBOVUxMLCBOVUxMfTsKICAgIGNoYXIqIHN0YXRlbWVudDsKCiAgICBQeU9iamVjdCogcmVzdWx0OwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInMiLCBrd2xpc3QsICZzdGF0ZW1lbnQpKQogICAgewogICAgICAgIHJldHVybiBOVUxMOyAKICAgIH0KCiAgICBpZiAoc3FsaXRlM19jb21wbGV0ZShzdGF0ZW1lbnQpKSB7CiAgICAgICAgcmVzdWx0ID0gUHlfVHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgICAgcmVzdWx0ID0gUHlfRmFsc2U7CiAgICB9CgogICAgUHlfSU5DUkVGKHJlc3VsdCk7CgogICAgcmV0dXJuIHJlc3VsdDsKfQoKI2lmZGVmIEhBVkVfU0hBUkVEX0NBQ0hFCnN0YXRpYyBQeU9iamVjdCogbW9kdWxlX2VuYWJsZV9zaGFyZWRfY2FjaGUoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoKICAgICAgICBrd2FyZ3MpCnsKICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiZG9fZW5hYmxlIiwgTlVMTCwgTlVMTH07CiAgICBpbnQgZG9fZW5hYmxlOwogICAgaW50IHJjOwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgImkiLCBrd2xpc3QsICZkb19lbmFibGUpKQogICAgewogICAgICAgIHJldHVybiBOVUxMOyAKICAgIH0KCiAgICByYyA9IHNxbGl0ZTNfZW5hYmxlX3NoYXJlZF9jYWNoZShkb19lbmFibGUpOwoKICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKICAgICAgICBQeUVycl9TZXRTdHJpbmcoT3BlcmF0aW9uYWxFcnJvciwgIkNoYW5naW5nIHRoZSBzaGFyZWRfY2FjaGUgZmxhZyBmYWlsZWQiKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0gZWxzZSB7CiAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgICAgIHJldHVybiBQeV9Ob25lOwogICAgfQp9CiNlbmRpZiAvKiBIQVZFX1NIQVJFRF9DQUNIRSAqLwoKc3RhdGljIFB5T2JqZWN0KiBtb2R1bGVfcmVnaXN0ZXJfYWRhcHRlcihQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCnsKICAgIFB5VHlwZU9iamVjdCogdHlwZTsKICAgIFB5T2JqZWN0KiBjYXN0ZXI7CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPTyIsICZ0eXBlLCAmY2FzdGVyKSkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIG1pY3JvcHJvdG9jb2xzX2FkZCh0eXBlLCAoUHlPYmplY3QqKSZTUUxpdGVQcmVwYXJlUHJvdG9jb2xUeXBlLCBjYXN0ZXIpOwoKICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgIHJldHVybiBQeV9Ob25lOwp9CgpzdGF0aWMgUHlPYmplY3QqIG1vZHVsZV9yZWdpc3Rlcl9jb252ZXJ0ZXIoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQp7CiAgICBjaGFyKiBvcmlnX25hbWU7CiAgICBjaGFyKiBuYW1lID0gTlVMTDsKICAgIGNoYXIqIGM7CiAgICBQeU9iamVjdCogY2FsbGFibGU7CiAgICBQeU9iamVjdCogcmV0dmFsID0gTlVMTDsKCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNPIiwgJm9yaWdfbmFtZSwgJmNhbGxhYmxlKSkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIC8qIGNvbnZlcnQgdGhlIG5hbWUgdG8gbG93ZXJjYXNlICovCiAgICBuYW1lID0gUHlNZW1fTWFsbG9jKHN0cmxlbihvcmlnX25hbWUpICsgMik7CiAgICBpZiAoIW5hbWUpIHsKICAgICAgICBnb3RvIGVycm9yOwogICAgfQogICAgc3RyY3B5KG5hbWUsIG9yaWdfbmFtZSk7CiAgICBmb3IgKGMgPSBuYW1lOyAqYyAhPSAoY2hhcikwOyBjKyspIHsKICAgICAgICAqYyA9ICgqYykgJiAweERGOwogICAgfQoKICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhjb252ZXJ0ZXJzLCBuYW1lLCBjYWxsYWJsZSkgIT0gMCkgewogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CgogICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgcmV0dmFsID0gUHlfTm9uZTsKZXJyb3I6CiAgICBpZiAobmFtZSkgewogICAgICAgIFB5TWVtX0ZyZWUobmFtZSk7CiAgICB9CiAgICByZXR1cm4gcmV0dmFsOwp9CgpzdGF0aWMgUHlPYmplY3QqIGVuYWJsZV9jYWxsYmFja190cmFjZWJhY2tzKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKewogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpIiwgJl9lbmFibGVfY2FsbGJhY2tfdHJhY2ViYWNrcykpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICByZXR1cm4gUHlfTm9uZTsKfQoKdm9pZCBjb252ZXJ0ZXJzX2luaXQoUHlPYmplY3QqIGRpY3QpCnsKICAgIGNvbnZlcnRlcnMgPSBQeURpY3RfTmV3KCk7CiAgICBpZiAoIWNvbnZlcnRlcnMpIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgImNvbnZlcnRlcnMiLCBjb252ZXJ0ZXJzKTsKfQoKc3RhdGljIFB5TWV0aG9kRGVmIG1vZHVsZV9tZXRob2RzW10gPSB7CiAgICB7ImNvbm5lY3QiLCAgKFB5Q0Z1bmN0aW9uKW1vZHVsZV9jb25uZWN0LCAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIFB5RG9jX1NUUigiQ3JlYXRlcyBhIGNvbm5lY3Rpb24uIil9LAogICAgeyJjb21wbGV0ZV9zdGF0ZW1lbnQiLCAgKFB5Q0Z1bmN0aW9uKW1vZHVsZV9jb21wbGV0ZSwgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBQeURvY19TVFIoIkNoZWNrcyBpZiBhIHN0cmluZyBjb250YWlucyBhIGNvbXBsZXRlIFNRTCBzdGF0ZW1lbnQuIE5vbi1zdGFuZGFyZC4iKX0sCiNpZmRlZiBIQVZFX1NIQVJFRF9DQUNIRQogICAgeyJlbmFibGVfc2hhcmVkX2NhY2hlIiwgIChQeUNGdW5jdGlvbiltb2R1bGVfZW5hYmxlX3NoYXJlZF9jYWNoZSwgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBQeURvY19TVFIoIkVuYWJsZSBvciBkaXNhYmxlIHNoYXJlZCBjYWNoZSBtb2RlIGZvciB0aGUgY2FsbGluZyB0aHJlYWQuIEV4cGVyaW1lbnRhbC9Ob24tc3RhbmRhcmQuIil9LAojZW5kaWYKICAgIHsicmVnaXN0ZXJfYWRhcHRlciIsIChQeUNGdW5jdGlvbiltb2R1bGVfcmVnaXN0ZXJfYWRhcHRlciwgTUVUSF9WQVJBUkdTLCBQeURvY19TVFIoIlJlZ2lzdGVycyBhbiBhZGFwdGVyIHdpdGggcHlzcWxpdGUncyBhZGFwdGVyIHJlZ2lzdHJ5LiBOb24tc3RhbmRhcmQuIil9LAogICAgeyJyZWdpc3Rlcl9jb252ZXJ0ZXIiLCAoUHlDRnVuY3Rpb24pbW9kdWxlX3JlZ2lzdGVyX2NvbnZlcnRlciwgTUVUSF9WQVJBUkdTLCBQeURvY19TVFIoIlJlZ2lzdGVycyBhIGNvbnZlcnRlciB3aXRoIHB5c3FsaXRlLiBOb24tc3RhbmRhcmQuIil9LAogICAgeyJhZGFwdCIsICAoUHlDRnVuY3Rpb24pcHN5Y29fbWljcm9wcm90b2NvbHNfYWRhcHQsIE1FVEhfVkFSQVJHUywgcHN5Y29fbWljcm9wcm90b2NvbHNfYWRhcHRfZG9jfSwKICAgIHsiZW5hYmxlX2NhbGxiYWNrX3RyYWNlYmFja3MiLCAgKFB5Q0Z1bmN0aW9uKWVuYWJsZV9jYWxsYmFja190cmFjZWJhY2tzLCBNRVRIX1ZBUkFSR1MsIFB5RG9jX1NUUigiRW5hYmxlIG9yIGRpc2FibGUgY2FsbGJhY2sgZnVuY3Rpb25zIHRocm93aW5nIGVycm9ycyB0byBzdGRlcnIuIil9LAogICAge05VTEwsIE5VTEx9Cn07CgpzdHJ1Y3QgX0ludENvbnN0YW50UGFpciB7CiAgICBjaGFyKiBjb25zdGFudF9uYW1lOwogICAgaW50IGNvbnN0YW50X3ZhbHVlOwp9OwoKdHlwZWRlZiBzdHJ1Y3QgX0ludENvbnN0YW50UGFpciBJbnRDb25zdGFudFBhaXI7CgpzdGF0aWMgSW50Q29uc3RhbnRQYWlyIF9pbnRfY29uc3RhbnRzW10gPSB7CiAgICB7IlBBUlNFX0RFQ0xUWVBFUyIsIFBBUlNFX0RFQ0xUWVBFU30sCiAgICB7IlBBUlNFX0NPTE5BTUVTIiwgUEFSU0VfQ09MTkFNRVN9LAoKICAgIHsiU1FMSVRFX09LIiwgU1FMSVRFX09LfSwKICAgIHsiU1FMSVRFX0RFTlkiLCBTUUxJVEVfREVOWX0sCiAgICB7IlNRTElURV9JR05PUkUiLCBTUUxJVEVfSUdOT1JFfSwKICAgIHsiU1FMSVRFX0NSRUFURV9JTkRFWCIsIFNRTElURV9DUkVBVEVfSU5ERVh9LAogICAgeyJTUUxJVEVfQ1JFQVRFX1RBQkxFIiwgU1FMSVRFX0NSRUFURV9UQUJMRX0sCiAgICB7IlNRTElURV9DUkVBVEVfVEVNUF9JTkRFWCIsIFNRTElURV9DUkVBVEVfVEVNUF9JTkRFWH0sCiAgICB7IlNRTElURV9DUkVBVEVfVEVNUF9UQUJMRSIsIFNRTElURV9DUkVBVEVfVEVNUF9UQUJMRX0sCiAgICB7IlNRTElURV9DUkVBVEVfVEVNUF9UUklHR0VSIiwgU1FMSVRFX0NSRUFURV9URU1QX1RSSUdHRVJ9LAogICAgeyJTUUxJVEVfQ1JFQVRFX1RFTVBfVklFVyIsIFNRTElURV9DUkVBVEVfVEVNUF9WSUVXfSwKICAgIHsiU1FMSVRFX0NSRUFURV9UUklHR0VSIiwgU1FMSVRFX0NSRUFURV9UUklHR0VSfSwKICAgIHsiU1FMSVRFX0NSRUFURV9WSUVXIiwgU1FMSVRFX0NSRUFURV9WSUVXfSwKICAgIHsiU1FMSVRFX0RFTEVURSIsIFNRTElURV9ERUxFVEV9LAogICAgeyJTUUxJVEVfRFJPUF9JTkRFWCIsIFNRTElURV9EUk9QX0lOREVYfSwKICAgIHsiU1FMSVRFX0RST1BfVEFCTEUiLCBTUUxJVEVfRFJPUF9UQUJMRX0sCiAgICB7IlNRTElURV9EUk9QX1RFTVBfSU5ERVgiLCBTUUxJVEVfRFJPUF9URU1QX0lOREVYfSwKICAgIHsiU1FMSVRFX0RST1BfVEVNUF9UQUJMRSIsIFNRTElURV9EUk9QX1RFTVBfVEFCTEV9LAogICAgeyJTUUxJVEVfRFJPUF9URU1QX1RSSUdHRVIiLCBTUUxJVEVfRFJPUF9URU1QX1RSSUdHRVJ9LAogICAgeyJTUUxJVEVfRFJPUF9URU1QX1ZJRVciLCBTUUxJVEVfRFJPUF9URU1QX1ZJRVd9LAogICAgeyJTUUxJVEVfRFJPUF9UUklHR0VSIiwgU1FMSVRFX0RST1BfVFJJR0dFUn0sCiAgICB7IlNRTElURV9EUk9QX1ZJRVciLCBTUUxJVEVfRFJPUF9WSUVXfSwKICAgIHsiU1FMSVRFX0lOU0VSVCIsIFNRTElURV9JTlNFUlR9LAogICAgeyJTUUxJVEVfUFJBR01BIiwgU1FMSVRFX1BSQUdNQX0sCiAgICB7IlNRTElURV9SRUFEIiwgU1FMSVRFX1JFQUR9LAogICAgeyJTUUxJVEVfU0VMRUNUIiwgU1FMSVRFX1NFTEVDVH0sCiAgICB7IlNRTElURV9UUkFOU0FDVElPTiIsIFNRTElURV9UUkFOU0FDVElPTn0sCiAgICB7IlNRTElURV9VUERBVEUiLCBTUUxJVEVfVVBEQVRFfSwKICAgIHsiU1FMSVRFX0FUVEFDSCIsIFNRTElURV9BVFRBQ0h9LAogICAgeyJTUUxJVEVfREVUQUNIIiwgU1FMSVRFX0RFVEFDSH0sCiNpZiBTUUxJVEVfVkVSU0lPTl9OVU1CRVIgPj0gMzAwMjAwMQogICAgeyJTUUxJVEVfQUxURVJfVEFCTEUiLCBTUUxJVEVfQUxURVJfVEFCTEV9LAogICAgeyJTUUxJVEVfUkVJTkRFWCIsIFNRTElURV9SRUlOREVYfSwKI2VuZGlmCiNpZiBTUUxJVEVfVkVSU0lPTl9OVU1CRVIgPj0gMzAwMzAwMAogICAgeyJTUUxJVEVfQU5BTFlaRSIsIFNRTElURV9BTkFMWVpFfSwKI2VuZGlmCiAgICB7KGNoYXIqKU5VTEwsIDB9Cn07CgpQeU1PRElOSVRfRlVOQyBpbml0X3NxbGl0ZTModm9pZCkKewogICAgUHlPYmplY3QgKm1vZHVsZSwgKmRpY3Q7CiAgICBQeU9iamVjdCAqdG1wX29iajsKICAgIGludCBpOwoKICAgIG1vZHVsZSA9IFB5X0luaXRNb2R1bGUoIl9zcWxpdGUzIiwgbW9kdWxlX21ldGhvZHMpOwoKICAgIGlmICghbW9kdWxlIHx8CiAgICAgICAgKHJvd19zZXR1cF90eXBlcygpIDwgMCkgfHwKICAgICAgICAoY3Vyc29yX3NldHVwX3R5cGVzKCkgPCAwKSB8fAogICAgICAgIChjb25uZWN0aW9uX3NldHVwX3R5cGVzKCkgPCAwKSB8fAogICAgICAgIChjYWNoZV9zZXR1cF90eXBlcygpIDwgMCkgfHwKICAgICAgICAoc3RhdGVtZW50X3NldHVwX3R5cGVzKCkgPCAwKSB8fAogICAgICAgIChwcmVwYXJlX3Byb3RvY29sX3NldHVwX3R5cGVzKCkgPCAwKQogICAgICAgKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIFB5X0lOQ1JFRigmQ29ubmVjdGlvblR5cGUpOwogICAgUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgIkNvbm5lY3Rpb24iLCAoUHlPYmplY3QqKSAmQ29ubmVjdGlvblR5cGUpOwogICAgUHlfSU5DUkVGKCZDdXJzb3JUeXBlKTsKICAgIFB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsICJDdXJzb3IiLCAoUHlPYmplY3QqKSAmQ3Vyc29yVHlwZSk7CiAgICBQeV9JTkNSRUYoJkNhY2hlVHlwZSk7CiAgICBQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiU3RhdGVtZW50IiwgKFB5T2JqZWN0KikmU3RhdGVtZW50VHlwZSk7CiAgICBQeV9JTkNSRUYoJlN0YXRlbWVudFR5cGUpOwogICAgUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgIkNhY2hlIiwgKFB5T2JqZWN0KikgJkNhY2hlVHlwZSk7CiAgICBQeV9JTkNSRUYoJlNRTGl0ZVByZXBhcmVQcm90b2NvbFR5cGUpOwogICAgUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgIlByZXBhcmVQcm90b2NvbCIsIChQeU9iamVjdCopICZTUUxpdGVQcmVwYXJlUHJvdG9jb2xUeXBlKTsKICAgIFB5X0lOQ1JFRigmUm93VHlwZSk7CiAgICBQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiUm93IiwgKFB5T2JqZWN0KikgJlJvd1R5cGUpOwoKICAgIGlmICghKGRpY3QgPSBQeU1vZHVsZV9HZXREaWN0KG1vZHVsZSkpKSB7CiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KCiAgICAvKioqIENyZWF0ZSBEQi1BUEkgRXhjZXB0aW9uIGhpZXJhcmNoeSAqLwoKICAgIGlmICghKEVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKE1PRFVMRV9OQU1FICIuRXJyb3IiLCBQeUV4Y19TdGFuZGFyZEVycm9yLCBOVUxMKSkpIHsKICAgICAgICBnb3RvIGVycm9yOwogICAgfQogICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIkVycm9yIiwgRXJyb3IpOwoKICAgIGlmICghKFdhcm5pbmcgPSBQeUVycl9OZXdFeGNlcHRpb24oTU9EVUxFX05BTUUgIi5XYXJuaW5nIiwgUHlFeGNfU3RhbmRhcmRFcnJvciwgTlVMTCkpKSB7CiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJXYXJuaW5nIiwgV2FybmluZyk7CgogICAgLyogRXJyb3Igc3ViY2xhc3NlcyAqLwoKICAgIGlmICghKEludGVyZmFjZUVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKE1PRFVMRV9OQU1FICIuSW50ZXJmYWNlRXJyb3IiLCBFcnJvciwgTlVMTCkpKSB7CiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJJbnRlcmZhY2VFcnJvciIsIEludGVyZmFjZUVycm9yKTsKCiAgICBpZiAoIShEYXRhYmFzZUVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKE1PRFVMRV9OQU1FICIuRGF0YWJhc2VFcnJvciIsIEVycm9yLCBOVUxMKSkpIHsKICAgICAgICBnb3RvIGVycm9yOwogICAgfQogICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIkRhdGFiYXNlRXJyb3IiLCBEYXRhYmFzZUVycm9yKTsKCiAgICAvKiBEYXRhYmFzZUVycm9yIHN1YmNsYXNzZXMgKi8KCiAgICBpZiAoIShJbnRlcm5hbEVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKE1PRFVMRV9OQU1FICIuSW50ZXJuYWxFcnJvciIsIERhdGFiYXNlRXJyb3IsIE5VTEwpKSkgewogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CiAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiSW50ZXJuYWxFcnJvciIsIEludGVybmFsRXJyb3IpOwoKICAgIGlmICghKE9wZXJhdGlvbmFsRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oTU9EVUxFX05BTUUgIi5PcGVyYXRpb25hbEVycm9yIiwgRGF0YWJhc2VFcnJvciwgTlVMTCkpKSB7CiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJPcGVyYXRpb25hbEVycm9yIiwgT3BlcmF0aW9uYWxFcnJvcik7CgogICAgaWYgKCEoUHJvZ3JhbW1pbmdFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbihNT0RVTEVfTkFNRSAiLlByb2dyYW1taW5nRXJyb3IiLCBEYXRhYmFzZUVycm9yLCBOVUxMKSkpIHsKICAgICAgICBnb3RvIGVycm9yOwogICAgfQogICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIlByb2dyYW1taW5nRXJyb3IiLCBQcm9ncmFtbWluZ0Vycm9yKTsKCiAgICBpZiAoIShJbnRlZ3JpdHlFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbihNT0RVTEVfTkFNRSAiLkludGVncml0eUVycm9yIiwgRGF0YWJhc2VFcnJvcixOVUxMKSkpIHsKICAgICAgICBnb3RvIGVycm9yOwogICAgfQogICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIkludGVncml0eUVycm9yIiwgSW50ZWdyaXR5RXJyb3IpOwoKICAgIGlmICghKERhdGFFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbihNT0RVTEVfTkFNRSAiLkRhdGFFcnJvciIsIERhdGFiYXNlRXJyb3IsIE5VTEwpKSkgewogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CiAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiRGF0YUVycm9yIiwgRGF0YUVycm9yKTsKCiAgICBpZiAoIShOb3RTdXBwb3J0ZWRFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbihNT0RVTEVfTkFNRSAiLk5vdFN1cHBvcnRlZEVycm9yIiwgRGF0YWJhc2VFcnJvciwgTlVMTCkpKSB7CiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJOb3RTdXBwb3J0ZWRFcnJvciIsIE5vdFN1cHBvcnRlZEVycm9yKTsKCiAgICAvKiBXZSBqdXN0IG5lZWQgInNvbWV0aGluZyIgdW5pcXVlIGZvciBPcHRpbWl6ZWRVbmljb2RlLiBJdCBkb2VzIG5vdCByZWFsbHkKICAgICAqIG5lZWQgdG8gYmUgYSBzdHJpbmcgc3ViY2xhc3MuIEp1c3QgYW55dGhpbmcgdGhhdCBjYW4gYWN0IGFzIGEgc3BlY2lhbAogICAgICogbWFya2VyIGZvciB1cy4gU28gSSBwdWxsZWQgUHlDZWxsX1R5cGUgb3V0IG9mIG15IG1hZ2ljIGhhdC4KICAgICAqLwogICAgUHlfSU5DUkVGKChQeU9iamVjdCopJlB5Q2VsbF9UeXBlKTsKICAgIE9wdGltaXplZFVuaWNvZGUgPSAoUHlPYmplY3QqKSZQeUNlbGxfVHlwZTsKICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJPcHRpbWl6ZWRVbmljb2RlIiwgT3B0aW1pemVkVW5pY29kZSk7CgogICAgLyogU2V0IGludGVnZXIgY29uc3RhbnRzICovCiAgICBmb3IgKGkgPSAwOyBfaW50X2NvbnN0YW50c1tpXS5jb25zdGFudF9uYW1lICE9IDA7IGkrKykgewogICAgICAgIHRtcF9vYmogPSBQeUludF9Gcm9tTG9uZyhfaW50X2NvbnN0YW50c1tpXS5jb25zdGFudF92YWx1ZSk7CiAgICAgICAgaWYgKCF0bXBfb2JqKSB7CiAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgfQogICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsIF9pbnRfY29uc3RhbnRzW2ldLmNvbnN0YW50X25hbWUsIHRtcF9vYmopOwogICAgICAgIFB5X0RFQ1JFRih0bXBfb2JqKTsKICAgIH0KCiAgICBpZiAoISh0bXBfb2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZyhQWVNRTElURV9WRVJTSU9OKSkpIHsKICAgICAgICBnb3RvIGVycm9yOwogICAgfQogICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgInZlcnNpb24iLCB0bXBfb2JqKTsKICAgIFB5X0RFQ1JFRih0bXBfb2JqKTsKCiAgICBpZiAoISh0bXBfb2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZyhzcWxpdGUzX2xpYnZlcnNpb24oKSkpKSB7CiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJzcWxpdGVfdmVyc2lvbiIsIHRtcF9vYmopOwogICAgUHlfREVDUkVGKHRtcF9vYmopOwoKICAgIC8qIGluaXRpYWxpemUgbWljcm9wcm90b2NvbHMgbGF5ZXIgKi8KICAgIG1pY3JvcHJvdG9jb2xzX2luaXQoZGljdCk7CgogICAgLyogaW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBjb252ZXJ0ZXJzICovCiAgICBjb252ZXJ0ZXJzX2luaXQoZGljdCk7CgogICAgX2VuYWJsZV9jYWxsYmFja190cmFjZWJhY2tzID0gMDsKCiAgICAvKiBPcmlnaW5hbCBjb21tZW50IGZvcm0gX2JzZGRiLmMgaW4gdGhlIFB5dGhvbiBjb3JlLiBUaGlzIGlzIGFsc28gc3RpbGwKICAgICAqIG5lZWRlZCBub3dhZGF5cyBmb3IgUHl0aG9uIDIuMy8yLjQuCiAgICAgKiAKICAgICAqIFB5RXZhbF9Jbml0VGhyZWFkcyBpcyBjYWxsZWQgaGVyZSBkdWUgdG8gYSBxdWlyayBpbiBweXRob24gMS41CiAgICAgKiAtIDIuMi4xIChhdCBsZWFzdCkgYWNjb3JkaW5nIHRvIFJ1c3NlbGwgV2lsbGlhbXNvbiA8bWVyZWxAd3QubmV0PjoKICAgICAqIFRoZSBnbG9iYWwgaW50ZXJlcHJldGVyIGxvY2sgaXMgbm90IGluaXRpYWxpemVkIHVudGlsIHRoZSBmaXJzdAogICAgICogdGhyZWFkIGlzIGNyZWF0ZWQgdXNpbmcgdGhyZWFkLnN0YXJ0X25ld190aHJlYWQoKSBvciBmb3JrKCkgaXMKICAgICAqIGNhbGxlZC4gIHRoYXQgd291bGQgY2F1c2UgdGhlIEFMTE9XX1RIUkVBRFMgaGVyZSB0byBzZWdmYXVsdCBkdWUKICAgICAqIHRvIGEgbnVsbCBwb2ludGVyIHJlZmVyZW5jZSBpZiBubyB0aHJlYWRzIG9yIGNoaWxkIHByb2Nlc3NlcwogICAgICogaGF2ZSBiZWVuIGNyZWF0ZWQuICBUaGlzIHdvcmtzIGFyb3VuZCB0aGF0IGFuZCBpcyBhIG5vLW9wIGlmCiAgICAgKiB0aHJlYWRzIGhhdmUgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgogICAgICogIChzZWUgcHlic2RkYi11c2VycyBtYWlsaW5nIGxpc3QgcG9zdCBvbiAyMDAyLTA4LTA3KQogICAgICovCiAgICBQeUV2YWxfSW5pdFRocmVhZHMoKTsKCmVycm9yOgogICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCiAgICB7CiAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCBNT0RVTEVfTkFNRSAiOiBpbml0IGZhaWxlZCIpOwogICAgfQp9Cg==