Ly8gTW9yZ2VuR3JhdWVuIE1VRGxpYgovLwovLyB0aGluZy9jb21tYW5kcy5jIC0tIHRoaW5nIGRlc2NyaXB0aW9uCi8vCi8vICRJZDogY29tbWFuZHMuYyA5NTE0IDIwMTYtMDItMjMgMjA6MzM6MDlaIEdsb2luc29uICQKLy8KLy8gQXVzIFJlZ2VuYm9nZW4gTVVETGliCi8vIGF1cyBHdWVsZGVubGFuZC9XdW5kZXJsYW5kIE1VRGxpYiAoTW9yZ2VuZ3JhdWVuIE1VRGxpYikKLy8KLy8gUF9DT01NQU5EUyBkYXRhLXN0cnVjdHVyZToKLy8KLy8gQWRkQ21kKHZlcmIsZnVuMSwxKTsKLy8gQWRkQ21kKHZlcmIrc3luMWF8c3luMWImc3luMmF8c3luMmJ8c3luMmMsZnVuMiwKLy8JICAgZXJyb3IxX25vdGlmeXxlcnJvcjJfbm90aWZ5XmVycm9yMl93cml0ZSk7Ci8vIC0tPgovLyAoW3ZlcmI6KHtmdW4xLGZ1bjJ9KTsJCQkJCS8vIGZ1bnMKLy8JICAoezEsKHtlcnJvcjFfbm90aWZ5LCBlcnJvcjJfd3JpdGVeZXJyb3IyX3NheSwgMX0pfSk7ICAvLyBmbGFncwovLyAgICAgICAgKHswLCh7KHtzeW4xYSxzeW4xYn0pLCh7c3luMmEsc3luMmIsc3luMmN9KX0pfSk7CS8vIHJ1bGVzCi8vICAgICAgICAwXSkJCQkJCQkJLy8gSURzCi8vCi8vIFJ1bGVzOiAoezxSZWdlbHNhdHogZnVlciBmdW4xPiwgKHs8MS4gU3lub255bWdydXBwZT4sCi8vCQkJCSAgICAgPDIuIFN5bm9ueW1ncnVwcGUsIC4uLn0pLCAuLi59KQovLyBGbGFnczogKHs8RmxhZyBmdWVyIGZ1bjE+LCAoezxGZWhsZXJtZWxkdW5nIDEuIFN5bm9ueW1ncnVwcGU+LCAuLi4gLAovLwkJCQlbLCBJbmRleCBmdWVyIHdyaXRlIGFuc3RhdHQgbm90aWZ5X2ZhaWxdfSksCi8vCSAgICAuLi4gfSkKLy8gSURzOiAgIDAgb2RlciAoezxJRCBmdWVyIGZ1bjE+fSkgb2RlciAoezAsIDxJRCBmdWVyIGZ1bjI+fSkgLi4uCi8vCi8vIElERUE6IHNhdmUgbm8gMHMgaW4gcnVsZXMvZmxhZ3MgaWYgcG9zc2libGUgKGFzIGluIElEcykKLy8gICAgICAgKGFkcmVzc2luZyBlc3BlY2lhbGx5IG9sZC1zdHlsZS1BZGRDbWQtTVVEcykKI3ByYWdtYSBzdHJpY3RfdHlwZXMKI3ByYWdtYSBzYXZlX3R5cGVzCiNwcmFnbWEgcmFuZ2VfY2hlY2sKI3ByYWdtYSBub19jbG9uZQojcHJhZ21hIHBlZGFudGljCgojaW5jbHVkZSA8bW92aW5nLmg+CiNpbmNsdWRlIDx0aGluZy9sYW5ndWFnZS5oPgojaW5jbHVkZSA8ZXhwbG9yYXRpb24uaD4KCiNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCiNpbmNsdWRlIDx0aGluZy9kZXNjcmlwdGlvbi5oPgojaW5jbHVkZSA8dGhpbmcvY29tbWFuZHMuaD4KI3VuZGVmIE5FRURfUFJPVE9UWVBFUwoKI2lmZGVmIERCRwojdW5kZWYgREJHCiNlbmRpZgojZGVmaW5lIERCRyh4KSBwcmludGYoIk9iamVjdCAlTyB0bXBzdHI9JXNcbiIsIGV4cGxvZGUob2JqZWN0X25hbWUodGhpc19vYmplY3QoKSksIiMiKVsxXSwgeCk7Cgpwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIGFkZGVkX2NtZHM7Cgpwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQp7Cn0KCnByb3RlY3RlZCB2b2lkIGNyZWF0ZV9zdXBlcigpIHsKICBzZXRfbmV4dF9yZXNldCgtMSk7Cn0gICAgIAoKdmFyYXJncyB2b2lkIEFkZENtZChtaXhlZCBjbWQsIG1peGVkIGZ1bmMsIG1peGVkIGZsYWcsIG1peGVkIGNtZGlkKSB7CiBpbnQgaSxqOwogY2xvc3VyZSBjbDsKIG1peGVkICpydWxlOwoKIC8vIHBvdGVudGllbGxlIEFkZENtZCBtaXQgUmVnZWw/CiBpZihzdHJpbmdwKGNtZCkpIHsKICAvLyBlaW5lIFJlZ2VsPyAtIGF1ZnNwbGl0dGVuCiAgaWYoKGk9bWVtYmVyKGNtZCwnJicpKT4wKSB7CiAgIC8vIC4uLiBpbiBBcnJheSBtaXQgVmVya251ZXBmdW5nc2VsZW1lbnRlbgogICBydWxlPWV4cGxvZGUoY21kWyhpKzEpLi5dLCImIik7CiAgIGo9c2l6ZW9mKHJ1bGUpOwogICAvLyAuLi4gaW4gQXJyYXkgbWl0IEFycmF5cyBtaXQgQWx0ZXJuYXRpdmVsZW1lbnRlbjoKICAgLy8gInB8cSZyfHMiIC0+ICh7ICh7InAiLCJxIn0pLCAoeyJyIiwicyJ9fSB9KQogICB3aGlsZShqLS0pCiAgICBydWxlW2pdPWV4cGxvZGUocnVsZVtqXSwifCIpOwoKICAgLy8gUmVnZWxuIHZvbiBLb21tYW5kb3ZlcmJlbiBhYnNjaG5laWRlbgogICBjbWQ9Y21kWzAuLihpLTEpXTsKICB9CiAgLy8gS29tbWFuZG92ZXJiZW4gZXh0cmFoaWVyZW4KICBjbWQ9ZXhwbG9kZShjbWQsInwiKTsKCiAgLy8gU2F0eiB2b24gUmVnZWxuIGV4aXN0aWVydDogQXVmc3BsaXR0ZW4gdm9uIEZlaGxlcm1lbGR1bmdlbgogIGlmKHJ1bGUpCiAgIGlmKHN0cmluZ3AoZmxhZykpIHsKICAgIG1peGVkICpmYWlsOwogICAgLy8gaW4gZWluZmFjaGVzIEFycmF5IG1pdCBqZXdlaWxpZ2VuIEZlaGxlcm1lbGR1bmdlbgogICAgZmFpbD1leHBsb2RlKGZsYWcsInwiKTsKICAgIGo9MDsKICAgIGk9c2l6ZW9mKGZhaWwpOwogICAgd2hpbGUoajxpKSB7CiAgICAgLy8gd3JpdGUgLSBGZWhsZXJtZWxkdW5nIGVudGRlY2t0IC0gUG9zaXRpb24gZ2dmLiBlaW50cmFnZW4KICAgICBpZihtZW1iZXIoZmFpbFtqXSwnXicpPj0wICYmICFpbnRwKGZhaWxbPDFdKSkKICAgICAgZmFpbCs9KHtqfSk7CiAgICAgaWYobWVtYmVyKGZhaWxbal0sJ0AnKT49MCkgewogICAgICBpbnQgczsKICAgICAgZmxhZz1yZWdleHBsb2RlKGZhaWxbal0sICJAV0VbQS1TVV0qWzAtOV0iKTsKICAgICAgcz1zaXplb2YoZmxhZyk7CiAgICAgIHdoaWxlKChzLT0yKT4wKSB7CiAgICAgICBpbnQgdG1waW50OwogICAgICAgdG1waW50PWZsYWdbc11bPDFdLScxJzsKICAgICAgIGlmKHRtcGludDwwIHx8IHRtcGludD5qKQogICAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoCiAgICAgICAgICJBZGRDbWQ6IGVycm9yLW1lc3NhZ2UgJWQgY29udGFpbnMgb3V0LW9mLWJvdW5kcyBAV0V4eC1ydWxlLlxuIixqKzEpKTsKICAgICAgfQogICAgIH0KICAgICBqKys7CiAgICB9CiAgICAvLyAiV2FzP3xXaWUgZGFzPyIgLT4gKHsiV2FzPyIsIldpZSBkYXM/In0pCiAgICAvLyAiV2FzP3xXaWUgZGFzP158V29taXQgZGFzP3xXb3JhdWYgZGFzP15AV0VSMSBtYWNodCB3YXMuIiAtPgogICAgLy8gICh7Ildhcz8iLAogICAgLy8gICAgIldpZSBkYXM/XldvbWl0IGRhcz8iLAogICAgLy8JICAiV29yYXVmIGRhcz9eQFdFUjEgbWFjaHQgd2FzLiIsMX0pCiAgICBmbGFnPXNpemVvZihmYWlsKTsKICAgIGlmKGZsYWcgJiYgZmxhZzxzaXplb2YocnVsZSkpCiAgICAgcmFpc2VfZXJyb3IoCiAgICAgICJBZGRDbWQ6IG51bWJlciBvZiBlcnJvci1tZXNzYWdlcyBkb2VzIG5vdCBtYXRjaCBudW1iZXIgb2YgcnVsZXMuXG4iKTsKICAgIGZsYWc9ZmFpbDsgLy8gdWViZXJzY2hyZWliZW4gbWl0IGRlbiBwYXJzZWZyZXVuZGxpY2hlbiBGb3JtYXQKICB9IGVsc2UgaWYoZmxhZykKICAgcmFpc2VfZXJyb3IoIkFkZENtZDogcnVsZXMgZXhpc3QgYnV0IGZsYWdzIGFyZSBub3QgYW4gZXJyb3Itc3RyaW5nLlxuIik7CiB9IC8vIGVuZCBpZihzdHJpbmdwKGNtZCkpIC4uLiBrZWluIFJlZ2Vsc3RyaW5nIHZvcmhhbmRlbgoKIC8vIGtlaW4gS29tbWFuZG9hcnJheSBnZXdlc2VuIG5vY2ggZXJ6ZXVndD8KIGlmKCFwb2ludGVycChjbWQpKQogICByYWlzZV9lcnJvcigiQWRkQ21kOiBtaXNzaW5nIHN0cmluZy9wb2ludGVyLXBhcmFtZXRlciBmb3IgY29tbWFuZC5cbiIpOwoKIC8vIENsb3N1cmUgYXVzIGVpbmVtIFN0cmluZyBlcnpldWdlbiwgd2VubiBtb2VnbGljaCB1bmQgc2ljaGVyCiAvLyAoZnVuY3Rpb25fZXhpc3RzKCkgZmlsdGVydCB1bm5vZXRpZ2Vyd2Vpc2UgYXVjaCByZWluZSAic3RhdGljIiBmdW5zLAogLy8gIGRpZSBnZW5hdWUgUHJ1ZWZ1bmcgdWViZXIgZnVuY3Rpb25saXN0KCkga29zdGV0IGplZG9jaCB6dXZpZWwpCiBpZihzdHJpbmdwKGZ1bmMpICYmCiAgICAoIWV4dGVybl9jYWxsKCkgfHwgZnVuY3Rpb25fZXhpc3RzKGZ1bmMsdGhpc19vYmplY3QoKSkpICYmCiAgICBjbG9zdXJlcChjbD1zeW1ib2xfZnVuY3Rpb24oZnVuYyx0aGlzX29iamVjdCgpKSkpCiAgZnVuYz1jbDsKCiAvLyBqZWRlcyBlaW56ZWxuZSBWZXJiIG1pdCBzZWluZW4gUmVnZWxuIHVuZCBGdW5rdGlvbmVuIGVpbnRyYWdlbgogaT1zaXplb2YoY21kKTsKIGlmKCFhZGRlZF9jbWRzKSBhZGRlZF9jbWRzPW1fYWxsb2NhdGUoaSw0KTsKIHdoaWxlKGktLSkgewogIHN0cmluZyBzdHI7CiAgc3RyPWNtZFtpXTsKICBpZighZnVuYykKICAgaWYoZXh0ZXJuX2NhbGwoKSkgZnVuYz1wcmV2aW91c19vYmplY3QoKTsKICAgZWxzZSBmdW5jPXRoaXNfb2JqZWN0KCk7CiAgaWYoIW1lbWJlcihhZGRlZF9jbWRzLHN0cikpCiAgIGFkZGVkX2NtZHMrPShbc3RyOmFsbG9jYXRlKDApO2FsbG9jYXRlKDApO2FsbG9jYXRlKDApOzBdKTsKICAvLyBleGlzdGllcmVuZGVzIFZlcmIgZXJnYWVuemVuCiAgYWRkZWRfY21kc1tzdHIsMF0rPSh7ZnVuY30pOwogIGFkZGVkX2NtZHNbc3RyLDFdKz0oe2ZsYWd9KTsKICBhZGRlZF9jbWRzW3N0ciwyXSs9KHtydWxlfSk7CiAgLy8gZ2dmLiBpZCBpbiBkYXMgSUQtTWFwcGluZyBlaW50cmFnZW4KICBpZihjbWRpZCkgewogICBtaXhlZCAqdG1wOwogICBqPXNpemVvZigoc3RyaW5nKilhZGRlZF9jbWRzW3N0ciwwXSk7CiAgIHRtcD1hZGRlZF9jbWRzW3N0ciwzXXx8YWxsb2NhdGUoaik7CiAgIGlmKHNpemVvZih0bXApPGopIHRtcCs9YWxsb2NhdGUoai1zaXplb2YodG1wKSk7CiAgIHRtcFs8MV09Y21kaWQ7CiAgIGFkZGVkX2NtZHNbc3RyLDNdPXRtcDsKICB9CiB9Cn0KCi8vIEF1c3dlcnR1bmcgZnVlciBlaW4gVmVyYiBsb2VzY2hlbgp2YXJhcmdzIGludCBSZW1vdmVDbWQobWl4ZWQgY21kLCBpbnQgZGVsX25vcnVsZSwgbWl4ZWQgb25seWlkKSB7CiBpbnQgcmV0OwoKIC8vIEZhbGxzIE1hZ2llciBkYXMgUmVtb3ZlQ21kIGZhbHNjaCBudXR6ZW4gKHouQi4gYW5hbG9nIHp1IEFkZENtZCkKIC8vIHdpcmQgZGFzIFJlZ2Vsc3lzdGVtIHZlcndpcnJ0LiBEYSBkYXMgZGVsX25vcnVsZSBudXIgaW50IHNlaW4gZGFyZiwKIC8vIGdpYnQgZXMgaGllciBlaW5lIGd1dGUgQ2hhbmNlIGRlbiBGZWhsZXIgYWJ3YWVydHNrb21wYXRpYmVsIHp1IGVudC0KIC8vIGRlY2tlbi4gRGFtaXQgU3BpZWxlciBkZW4gRmVobGVyIG5pY2h0IG1pdGJla29tbWVuLCB3aXJkIGhpZXIgYXVmCiAvLyBlaW4gcmFpc2VfZXJyb3IgdmVyemljaHRldCwgdW5kIHN0YXR0IGRlc3NlbiBpbiBlaW4gTG9nZmlsZSBnZS0KIC8vIHNjaHJpZWJlbi4KIGlmICghaW50cChkZWxfbm9ydWxlKSkKIHsKICAgbG9nX2ZpbGUoIlJFTU9WRV9DTUQiLAogICAgIHNwcmludGYoIlxuLS0gJXMgLS1cbklsbGVnYWwgUmVtb3ZlQ29tbWFuZCgpIGluIE9iamVjdCBbJU9dOlxuICVPXG4iLAogICAgICAgZHRpbWUodGltZSgpKSwgdGhpc19vYmplY3QoKSwgY21kKSk7CiAgIGRlbF9ub3J1bGU9MDsKICAgb25seWlkPTA7CiB9CiAKIGlmKCFhZGRlZF9jbWRzIHx8ICghY21kICYmICFkZWxfbm9ydWxlICYmICFvbmx5aWQpKQogIGFkZGVkX2NtZHM9KG1hcHBpbmcpMDsgCiBlbHNlIHsKICBpbnQgaSwgajsKICBtaXhlZCAqcnVsZSwgKmZsYWcsICpmdW4sICpkZWxydWxlLCAqaWRzOwoKICBpZihzdHJpbmdwKGNtZCkpIHsKICAgLy8gUmVnZWxuIGVudGRlY2t0IC0gWmVybGVnZW4gKHdpZSBBZGRDbWQpCiAgIGlmKChpPW1lbWJlcihjbWQsJyYnKSk+MCkgewogICAgZGVscnVsZT1leHBsb2RlKGNtZFsoaSsxKS4uXSwiJiIpOwogICAgaj1zaXplb2YoZGVscnVsZSk7CiAgICB3aGlsZShqLS0pCiAgICAgZGVscnVsZVtqXT1leHBsb2RlKGRlbHJ1bGVbal0sInwiKTsKICAgIGNtZD1jbWRbMC4uKGktMSldOwogICB9CiAgIGNtZD1leHBsb2RlKGNtZCwifCIpOwogIH0gZWxzZSBpZihkZWxfbm9ydWxlIHx8IG9ubHlpZCkgY21kPW1faW5kaWNlcyhhZGRlZF9jbWRzKTsKCiAgaWYoIXBvaW50ZXJwKGNtZCkpCiAgIHJhaXNlX2Vycm9yKCJSZW1vdmVDbWQ6IG1pc3Npbmcgc3RyaW5nL3BvaW50ZXItcGFyYW1ldGVyLlxuIik7CiAgaT1zaXplb2YoY21kKTsKCiAgd2hpbGUoaS0tKSB7CiAgIC8vIGtlaW5lIFJlZ2VsbiBkYSB1bmQgUmVnZWxuIGxvZXNjaGVuIGVybGF1YnQ6IGFsbGVzIGxvZXNjaGVuCiAgIGlmKCFkZWxydWxlICYmICFkZWxfbm9ydWxlICYmICFvbmx5aWQpIG1fZGVsZXRlKGFkZGVkX2NtZHMsY21kW2ldKTsKICAgZWxzZSBpZihtX2NvbnRhaW5zKCZmdW4sICZmbGFnLCAmcnVsZSwgJmlkcywgYWRkZWRfY21kcywgY21kW2ldKSkgewogICAgaj1zaXplb2YoZnVuKTsKICAgIHdoaWxlKGotLSkgewogICAgIGludCBrOwogICAgIC8vIERCRyhydWxlW2pdKTsKICAgIAkvLyBSZWdlbG4gbmljaHQgbPZzY2hlbiB1bmQgUmVnZWw/CiAgICAgaWYoIShkZWxfbm9ydWxlICYmIHBvaW50ZXJwKHJ1bGVbal0pKSAmJgogICAgICAgIC8vIG51ciBiZXN0aW1tdGUgSUQgbPZzY2hlbiB1bmQgSUQgcGFzc3QgbmljaHQ/CiAgICAgICAgIShvbmx5aWQgJiYgKCFwb2ludGVycChpZHMpIHx8IHNpemVvZihpZHMpPD1qIHx8IGlkc1tqXSE9b25seWlkKSkgJiYKICAgICAgICAvLyBM9nNjaHJlZ2VsIGV4aXN0aWVydCB1bmQgcGFzc3QgbmljaHQgYXVmIFJlZ2VsPwogICAgICAgICEoZGVscnVsZSAmJiAoaz1zaXplb2YocnVsZVtqXSkpIT1zaXplb2YoZGVscnVsZSkpKSB7CiAgICAgIC8vIHBhcnRpZWxsZXMgVGVzdGVuIGVpbmVyIEz2c2NocmVnZWwgLi4uCiAgICAgIGlmKGRlbHJ1bGUpIHsKICAgICAgIHdoaWxlKGstLSkKICAgICAgICBpZighc2l6ZW9mKHJ1bGVbal1ba10mZGVscnVsZVtrXSkpIGJyZWFrOwogICAgICAgaWYoaz49MCkgY29udGludWU7CiAgICAgIH0KICAgICAgLy8gYWxsZXMga29ycmVrdDogTPZzY2hlbiEKICAgICAgLy8gKEFycmF5YmVyZWljaCBkdXJjaCBsZWVyZXMgQXJyYXkgbG9lc2NoZW4pCiAgICAgIGZsYWdbai4ual0gID0gYWxsb2NhdGUoMCk7CiAgICAgIGZ1bltqLi5qXSAgID0gYWxsb2NhdGUoMCk7CiAgICAgIHJ1bGVbai4ual0gID0gYWxsb2NhdGUoMCk7CiAgICAgIGlmKGlkcykgewogICAgICAgaWRzW2ouLmpdID0gYWxsb2NhdGUoMCk7CiAgICAgICBpZighc2l6ZW9mKGlkcy1hbGxvY2F0ZSgxKSkpIGlkcz0obWl4ZWQqKTA7CiAgICAgIH0KICAgICAgcmV0Kys7CiAgICAgfQogICAgfSAvLyBlbmQgd2hpbGUoai0tKSB7CiAgIH0KICAgLy8gRnVua3Rpb25zL1JlZ2VsbGlzdGUgdXBkYXRlIG9kZXIgZ2dmLiBLb21tYW5kbyB2b2VsbGlnIGxvZXNjaGVuCiAgIGlmKHNpemVvZihydWxlKSkgewogICAgYWRkZWRfY21kc1tjbWRbaV0sMF09ZnVuOwogICAgYWRkZWRfY21kc1tjbWRbaV0sMV09ZmxhZzsKICAgIGFkZGVkX2NtZHNbY21kW2ldLDJdPXJ1bGU7CiAgICBhZGRlZF9jbWRzW2NtZFtpXSwzXT1pZHM7CiAgIH0gZWxzZSBtX2RlbGV0ZShhZGRlZF9jbWRzLGNtZFtpXSk7CiAgfQogIGlmKCFzaXplb2YoYWRkZWRfY21kcykpIGFkZGVkX2NtZHM9KG1hcHBpbmcpMDsKIH0KIHJldHVybiByZXQ7Cn0KCi8vIEF1c2Z1ZWhyZW4gc2FtdCBnZXBhcnN0ZW0gSW5wdXRzdHJpbmcgdW5kIGdldHJpZ2dlcnRlbiBQYXJzZXJlcmdlYm5pc3NlbgpzdGF0aWMgaW50IF9leGVjdXRlKG1peGVkIGZ1biwgc3RyaW5nIHN0ciwgbWl4ZWQgKnBhcnNlZCkgewogaWYoY2xvc3VyZXAoZnVuKSkKICByZXR1cm4gKChpbnQpZnVuY2FsbChmdW4sc3RyLCZwYXJzZWQpKTsKIGlmKHN0cmluZ3AoZnVuKSkKICByZXR1cm4gKChpbnQpY2FsbF9vdGhlcih0aGlzX29iamVjdCgpLGZ1bixzdHIsJnBhcnNlZCkpOwogcmV0dXJuIDA7Cn0KCiNkZWZpbmUgQ0hFQ0tfUFJFU0VOVCAgICAgMQojZGVmaW5lIENIRUNLX0lEICAgICAgICAgIDIKI2RlZmluZSBDSEVDS19QVVRHRVROT05FICA0CiNkZWZpbmUgQ0hFQ0tfUFVUR0VURFJPUCAgOAojZGVmaW5lIENIRUNLX1BVVEdFVFRBS0UgIDE2CiNkZWZpbmUgQ0hFQ0tfUFVUR0VUICAgICAgKENIRUNLX1BVVEdFVE5PTkV8Q0hFQ0tfUFVUR0VURFJPUHxDSEVDS19QVVRHRVRUQUtFKQoKLy8gV2VydCBmdWVyIEZlaGxzY2hsYWcsIEZhbGxiYWNrLVdlcnQgZGVyIGJlbnV0enRlbiB3aGlsZS0tIC0gU2NobGVpZmVuCiNkZWZpbmUgTk9NQVRDSEZPVU5EICAgICAgLTEKCi8vIFJlZ2VsbiBmdWVyIGVpbiAobnVuIHVud2ljaHRpZ2VzKSBWZXJiIHRyaWdnZXJuCnN0YXRpYyBpbnQgX3Byb2Nlc3NfY29tbWFuZChzdHJpbmcgc3RyLCBzdHJpbmcgKm5vcGFyc2VzdHIsCgkJCSAgICAgbWl4ZWQgZnVuLCBtaXhlZCBmbGFnLCBtaXhlZCBydWxlKSB7CiBtaXhlZCAqcGFyc2VkLCAqb2JqbWF0Y2hlczsKCiAvLyBlaW5lIFJlZ2VsIC4uLiBhdXN3ZXJ0ZW4gLi4uCiBpZihwb2ludGVycChydWxlKSkgewogIGludCBucnVsOwogIHBhcnNlZD1vYmptYXRjaGVzPWFsbG9jYXRlKDApOwogIGludCBsYXN0bWF0Y2hwb3M9Tk9NQVRDSEZPVU5EOwoKICAvLyBBYmdsZWljaGVuIGRlciBnZXNwbGl0dGV0ZW4gRWluZ2FiZSBtaXQgUmVnZWxuOgogIC8vIHZvcndhZXJ0cyBkdXJjaCBkaWUgU3lub255bWdydXBwZW4KICBpbnQgcnM9c2l6ZW9mKHJ1bGUpOwogIHdoaWxlKG5ydWw8cnMpIHsKICAgaW50IG1hdGNocG9zOwogICBzdHJpbmcgKnN5bm9ueW07CiAgIG1peGVkIG1hdGNoc3RyOwoKICAgbWF0Y2hwb3M9Tk9NQVRDSEZPVU5EOwogICBtYXRjaHN0cj0wOwoKICAgLy8gU3lub255bWUgZXh0cmFoaWVyZW4KICAgaW50IG5yc3lub255bXM9c2l6ZW9mKHN5bm9ueW09cnVsZVtucnVsXSk7CgogICAvLyBlZ2FsIHdpZSBkdXJjaCBTeW5vbnltZSBiaXMgTWF0Y2ggLSBBYmdsZWljaCBtaXQgRWluZ2FiZQogICB3aGlsZShucnN5bm9ueW1zLS0pIHsKICAgIGludCB0bXBwb3MgPSBtZW1iZXIobm9wYXJzZXN0cixzeW5vbnltW25yc3lub255bXNdKTsKICAgIC8vIGlzdCBTeW5vbnltIGltIEVpbmdhYmVzdHJpbmcgdW5kIGtvbW10IHNwYWV0ZXIgYWxzIHZvcmhlcmlnZXMgU3lub255bT8KICAgIGlmKHRtcHBvcz49MCAmJiB0bXBwb3M+bGFzdG1hdGNocG9zKSB7CiAgICAgLy8gRXJmb2xnOiBtZXJrZW4gZGVyIFBvc2l0aW9uIGltIEVpbmdhYmVzdHJpbmcgdW5kIGRlbiBtYXRjaGVuZGVuIFN0cmluZwogICAgIG1hdGNocG9zPXRtcHBvczsKICAgICBtYXRjaHN0cj1ub3BhcnNlc3RyW3RtcHBvc107CiAgICAgYnJlYWs7CiAgICB9CiAgIH0KCiAgIC8vIGtlaW4gTWF0Y2ggZHVyY2ggU3lub255bWU/IFBydWVmZSBkaWUgQC1TcGV6aWFsdmFyaWFibGVuLgogICBpZihtYXRjaHBvcyA9PSBOT01BVENIRk9VTkQpIHsKICAgIGludCBjaGVja19wcmVzZW50OwogICAgLy8gaXN0IEFicHJ1ZWZlbiB2b24gSUQvUFJFU0VOVCBpbiBkZXIgU3lub255bWdydXBwZSB2ZXJsYW5ndAogICAgLy8gYmVpIHByZXNlbnQoKS9maW5kX29icyBnbGVpY2ggVm9yYXVzc2V0enVuZyBndWVsdGlnZXIgVFAgbWl0cHJ1ZmVuCiAgICBpZihtZW1iZXIoc3lub255bSwiQElEIik+PTApIGNoZWNrX3ByZXNlbnQ9Q0hFQ0tfSUQ7CiAgICBpZih0aGlzX3BsYXllcigpKSB7CiAgICAgaWYobWVtYmVyKHN5bm9ueW0sIkBQUkVTRU5UIik+PTApIGNoZWNrX3ByZXNlbnR8PUNIRUNLX1BSRVNFTlQ7CiAgICAgZWxzZSBpZihtZW1iZXIoc3lub255bSwiQFBVVF9HRVRfTk9ORSIpPj0wKQoJCWNoZWNrX3ByZXNlbnR8PUNIRUNLX1BVVEdFVE5PTkU7CiAgICAgZWxzZSBpZihtZW1iZXIoc3lub255bSwiQFBVVF9HRVRfVEFLRSIpPj0wKQoJCWNoZWNrX3ByZXNlbnR8PUNIRUNLX1BVVEdFVERST1A7CiAgICAgZWxzZSBpZihtZW1iZXIoc3lub255bSwiQFBVVF9HRVRfRFJPUCIpPj0wKQoJCWNoZWNrX3ByZXNlbnR8PUNIRUNLX1BVVEdFVFRBS0U7CiAgICB9CgogICAgaWYoY2hlY2tfcHJlc2VudCkgewogICAgIC8vIHdpciBmYW5nZW4gaGludGVyIGRlbSBsZXR6dGVuIE1hdGNoIGFuCiAgICAgaW50IHFfc3RhcnQ9bGFzdG1hdGNocG9zKzE7CiAgICAgaW50IHJfZW5kPXNpemVvZihub3BhcnNlc3RyKS0xOwoKICAgICBpbnQgcmFuZ2U7CiAgICAgd2hpbGUoKHJhbmdlPXJfZW5kLXFfc3RhcnQpPj0wKSB7CiAgICAgIG1peGVkIHRtcG9iajsKCiAgICAgIC8vIHdpZSB3ZWl0IHdvbGxlbiB3aXIgenVy/GNrZ2VoZW4/CiAgICAgIGlmKHJhbmdlKQogICAgICAgIGlmKCEoY2hlY2tfcHJlc2VudCZDSEVDS19QVVRHRVQpKQogICAgICAgICAgcmFuZ2U9cmFuZ2U+Mj8yOnJhbmdlOyAvLyAzIEZyYWdtZW50ZSBmdWVyIEBJRC9AUFJFU0VOVCAoQWR2ZXJiL05yKQogICAgICAgIGVsc2UgaWYocmFuZ2U+NCkKICAgICAgICAgIHJhbmdlPTQ7ICAgICAgICAgICAgICAgLy8gNSBGcmFnbWVudGUgZnVlciBAUFVUX1hYWCAKCiAgICAgIC8vIHVuZCBqZXR6dCBkaWUgU3Vic3RyaW5ncyBwcnVlZmVuCiAgICAgIHdoaWxlKHJhbmdlPj0wICYmICFtYXRjaHN0cikgewogICAgICAgc3RyaW5nIHRtcHN0cjsKCiAgICAgICAvLyB6dSBwcnVlZmVuZGVuIFN0cmluZyBhdXMgZGVuIFRlaWxlbiB6dXNhbW1lbnNldHplbgogICAgICAgaWYocmFuZ2UpIHRtcHN0cj1pbXBsb2RlKG5vcGFyc2VzdHJbcV9zdGFydC4uKHFfc3RhcnQrcmFuZ2UpXSwiICIpOwogICAgICAgZWxzZSB0bXBzdHI9bm9wYXJzZXN0cltxX3N0YXJ0XTsKCiAgICAgICAvL0RCRyh0bXBzdHIpOwogICAgICAgaWYoY2hlY2tfcHJlc2VudCZDSEVDS19QUkVTRU5UICYmCQkJLy8gUFJFU0VOVCA/CiAgICAgICAgICAoKHRtcG9iaj1wcmVzZW50KHRtcHN0cix0aGlzX3BsYXllcigpKSkgfHwKICAgICAgICAgICAodG1wb2JqPXByZXNlbnQodG1wc3RyLGVudmlyb25tZW50KHRoaXNfcGxheWVyKCkpKSkpKQogICAgICAgIG1hdGNoc3RyPXRtcG9iajsKICAgICAgIGVsc2UgaWYoY2hlY2tfcHJlc2VudCZDSEVDS19JRCAmJiBpZCh0bXBzdHIpKQkvLyBJRCA/CiAgICAgICAgbWF0Y2hzdHI9dGhpc19vYmplY3QoKTsKICAgICAgIGVsc2UgaWYoKGNoZWNrX3ByZXNlbnQmQ0hFQ0tfUFVUR0VUKSAmJgkvLyBQVVRfR0VUXz8/PyA/CiAgICAgICAgICAgICAgICh0bXBvYmo9KG9iamVjdCopCiAgICAgICAgICAgICAgICAgIHRoaXNfcGxheWVyKCktPmZpbmRfb2JzKHRtcHN0ciwKICAgICAgICAgICAgICAgICAgICAgIChbQ0hFQ0tfUFVUR0VUTk9ORTpQVVRfR0VUX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX1BVVEdFVERST1A6UFVUX0dFVF9UQUtFLAogICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19QVVRHRVRUQUtFOlBVVF9HRVRfRFJPUF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbQ0hFQ0tfUFVUR0VUJmNoZWNrX3ByZXNlbnRdKSkgJiYKICAgICAgICAgICAgICAgc2l6ZW9mKHRtcG9iaikpIHsKICAgICAgICBpZihzaXplb2YodG1wb2JqKT09MSkgbWF0Y2hzdHI9dG1wb2JqWzBdOwogICAgICAgIGVsc2UgewkvLyBBcnJheXMgd2VyZGVuIHp3aXNjaGVuZ2VzcGVpY2hlcnQgLi4uCiAgICAgICAgIG9iam1hdGNoZXMrPSh7c2l6ZW9mKHBhcnNlZCksdG1wb2JqfSk7CiAgICAgICAgIG1hdGNoc3RyPXRtcHN0cjsKICAgICAgICB9CiAgICAgICB9IGVsc2UgeyAvLyBkaWVzZXIgU3Vic3RyaW5nIGhhdCBuaWNodCBnZW1hdGNodAogICAgICAgIC8vIGFiIHdlbmlnZXIgYWxzIDMgVGVpbGVuIGlzdCBkYXMgTmljaHRtYXRjaGluZyBlaW5lcyBTdWJzdHJpbmdzIG1pdAogICAgICAgIC8vIGJlZW5kZW5kZW0gTnVtZXJhbCBLcml0ZXJpdW0gZnVlciBBYmJydWNoICgib2JqZWt0IDIiIHNvbGwgbWF0Y2hlbikKICAgICAgICBzdHJpbmcgbnVtZXJhbGNoZWNrOwogICAgICAgIGlmKHJhbmdlICYmIHJhbmdlPD0yICYmCiAgICAgICAgICAgc2l6ZW9mKG51bWVyYWxjaGVjaz1ub3BhcnNlc3RyW3Ffc3RhcnQrcmFuZ2VdKSAmJgogICAgICAgICAgIHRvX3N0cmluZyh0b19pbnQobnVtZXJhbGNoZWNrKSk9PW51bWVyYWxjaGVjaykKICAgICAgICAgIGJyZWFrOwoKICAgICAgICAvLyBTdWJzdHJpbmdsYWVuZ2UgdmVya3VlcnplbiB1bmQgd2VpdGVyCiAgICAgICAgcmFuZ2UtLTsKICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gTWF0Y2ggZ2VmdW5kZW4hCiAgICAgIGlmKG1hdGNoc3RyKSB7CiAgICAgICBtYXRjaHBvcz1yYW5nZStxX3N0YXJ0OwogICAgICAgLy8gREJHKG1hdGNocG9zKTsKICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIHFfc3RhcnQrKzsKICAgICB9IC8vIGVuZCB3aGlsZQogICAgfQogICB9CgogICAvLyBGZWhsZXJtZWxkdW5nIGZ1ZXIgZGllc2UgZmVobGdlc2NobGFnZW5lIFN5bm9ueW1ncnVwcGUgc2V0emVuCiAgIGlmKG1hdGNocG9zID09IE5PTUFUQ0hGT1VORCkgewogICAgLy8gRmVobGVybWVsZHVuZ2VuIHVuZCBlaW4gRWludHJhZyBhbiBkZXIgRmVobGVyc3RlbGxlPwogICAgaWYocG9pbnRlcnAoZmxhZykgJiYgc2l6ZW9mKGZsYWcpPm5ydWwpIHsKCiAgICAgbWF0Y2hzdHI9ZmxhZ1tucnVsXTsKCiAgICAgaWYoc3RyaW5ncChtYXRjaHN0cikgJiYgc2l6ZW9mKG1hdGNoc3RyKSkgewogICAgICBpZihtZW1iZXIobWF0Y2hzdHIsJ0AnKT49MCkgewogICAgICAgbWF0Y2hzdHI9cmVwbGFjZV9wZXJzb25hbCgmbWF0Y2hzdHIsKHt0aGlzX3BsYXllcigpfSkrcGFyc2VkLDEpOwogICAgICAgc3RyaW5nIHN0YW1tPSgocXVlcnlfdmVyYigpWzwxXV4nZScpP3F1ZXJ5X3ZlcmIoKTpxdWVyeV92ZXJiKClbMC4uPDJdKTsKICAgICAgIG1hdGNoc3RyPXJlZ3JlcGxhY2UobWF0Y2hzdHIsIkBWRVJCIixjYXBpdGFsaXplKHN0YW1tKSwxKTsKICAgICAgIG1hdGNoc3RyPXJlZ3JlcGxhY2UobWF0Y2hzdHIsIkB2ZXJiIixzdGFtbSwxKTsKICAgICAgfQoKICAgICAgLy8gaXN0IEZlaGxlcm1lbGR1bmcgZWluIFdSSVRFPwogICAgICAvLyBkYW5uIHJldHVybiAxICEKICAgICAgaWYoaW50cChmbGFnWzwxXSkgJiYgZmxhZ1s8MV08PW5ydWwpIHsKICAgICAgIGlmKG1lbWJlcihtYXRjaHN0ciwnXicpPj0wKSB7CiAgICAgICAgbWF0Y2hzdHI9ZXhwbG9kZShtYXRjaHN0ciwiXiIpOwogICAgICAgIHdyaXRlKGNhcGl0YWxpemUoYnJlYWtfc3RyaW5nKG1hdGNoc3RyWzBdLDc4LDAsMSkpKTsKICAgICAgICBpZihzaXplb2YobWF0Y2hzdHJbMV0pKQogICAgICAgICBzYXkoY2FwaXRhbGl6ZShicmVha19zdHJpbmcobWF0Y2hzdHJbMV0sNzgsMCwxKSksKHt0aGlzX3BsYXllcigpfSkgKTsKICAgICAgIH0gZWxzZSB3cml0ZShjYXBpdGFsaXplKGJyZWFrX3N0cmluZyhtYXRjaHN0ciw3OCwwLDEpKSk7CiAgICAgICByZXR1cm4gMTsKICAgICAgfSBlbHNlIG5vdGlmeV9mYWlsKGNhcGl0YWxpemUoYnJlYWtfc3RyaW5nKG1hdGNoc3RyLDc4LDAsMSkpKTsKICAgICB9CiAgICB9CiAgICByZXR1cm4gMDsKICAgfQoKICAgLy8gVXBkYXRlbiBkZXIgSGlsZnN2YXJpYWJsZW4KICAgcGFyc2VkKz0oe21hdGNoc3RyfSk7CiAgIGxhc3RtYXRjaHBvcz1tYXRjaHBvczsKICAgbnJ1bCsrOwogIH0gLy8gZW5kIHdoaWxlKG5ydWw8cnMpIC4uLiBFcmZvbGcgLi4uIGFiIHp1bSBuYWVjaHN0ZW4gUmVnZWx0ZWlsCiB9CgogLy8gQXJyYXlzIGRlciBALU9iamVjdG1hdGNoZXMgaW4gUGFyYW1ldGVyIGZ1ZXIgTWV0aG9kZSByZXN1YnN0aXR1aWVyZW4KIGludCBvYmpzaXplOwogaWYoKG9ianNpemU9c2l6ZW9mKG9iam1hdGNoZXMpKSkKICB3aGlsZSgob2Jqc2l6ZS09Mik+PTApCiAgIHBhcnNlZFtvYmptYXRjaGVzW29ianNpemVdXT1vYmptYXRjaGVzW29ianNpemUrMV07CgogLy8gZXJmb2xncmVpY2ggTWV0aG9kZSBnZWZ1bmRlbi9laW5lIFJlZ2VsIGJpcyB6dW0gRW5kZSBkdXJjaGdlcGFyc3Q6CiByZXR1cm4oX2V4ZWN1dGUoJmZ1biwmc3RyLCZwYXJzZWQpKTsKfQoKLy8gQXVzd2VydHVuZyAtIGFkZF9hY3Rpb24tRnVuIApwdWJsaWMgaW50IF9jbChzdHJpbmcgc3RyKSB7CiBpbnQgbmluZGV4Owogc3RyaW5nICprZXlzOwogbWl4ZWQgKmZsYWc7CiAvLyBWZXJiIGV4aXN0aWVydCwgS29tbWFuZG9zIGF1Y2gsIEVpbnRyYWcgZnVlciBWZXJiIGdlZnVuZGVuCiBpZihtYXBwaW5ncChhZGRlZF9jbWRzKSAmJiBxdWVyeV92ZXJiKCkpIHsKICBtaXhlZCAqZnVuLCAqcnVsZSwgKmlkczsKCiAgLy8gaXN0IGRhcyBWZXJiIGVpbiBLZXkgaW0gS29tbWFuZG9tYXBwaW5nPwogIGlmKG1fY29udGFpbnMoJmZ1biwgJmZsYWcsICZydWxlLCAmaWRzLCBhZGRlZF9jbWRzLCBxdWVyeV92ZXJiKCkpKSB7CiAgIHN0cmluZyAqbm9wYXJzZXN0cjsKICAgbmluZGV4PXNpemVvZihmdW4pOwogICBub3BhcnNlc3RyPWV4cGxvZGUoKHN0cnx8IiIpLCIgIiktKHsiIn0pOwogICAvLyBkYW5uIG1hdGNoZSB1bmdlcGFyc3RlbiBJbnB1dCBnZWdlbiBldHdhaWdlIFJlZ2VsbgogICAvLyAtLSBuaWNodCBhZW5kZXJuOiBuZXVlIEtvbW1hbmRvcyBzb2xsZW4gYWx0ZSAidWViZXJzY2hyZWliZW4iIGtvZW5uZW4KICAgd2hpbGUobmluZGV4LS0pCiAgICBpZihfcHJvY2Vzc19jb21tYW5kKCZzdHIsIG5vcGFyc2VzdHIsCgkJICAgICAgIGZ1bltuaW5kZXhdLCBmbGFnW25pbmRleF0sIHJ1bGVbbmluZGV4XSkpCiAgICB7CiAgICAgIEdpdmVFUChFUF9DTUQsIHF1ZXJ5X3ZlcmIoKSk7CiAgICAgIHJldHVybiAxOwogICAgfQogIH0KCiAgLy8ga2VpbmUgUmVnZWwgcGFzc3RlLCB1bnNjaGFyZmUgQXVzd2VydHVuZyBhdWYgYWxsZQogIC8vIEFkZENtZHZlcmJlbiBhdXNkZWhuZW4KICBrZXlzPW1faW5kaWNlcyhhZGRlZF9jbWRzKTsKICBuaW5kZXg9c2l6ZW9mKGtleXMpOwogIHdoaWxlKG5pbmRleC0tKQogICBpZighc3Ryc3RyKHF1ZXJ5X3ZlcmIoKSxrZXlzW25pbmRleF0pICYmCiAgICAgIG1lbWJlcigoZmxhZz1hZGRlZF9jbWRzW2tleXNbbmluZGV4XSwxXSksMSk+PTApIHsKICAgIGludCBpLHJldDsKICAgIGk9c2l6ZW9mKGZsYWcpOwogICAgLy8gUmVpaGVuZm9sZ2UgbmljaHQgYWVuZGVybiAhCiAgICB3aGlsZShpLS0pCiAgICAgIGlmKGZsYWdbaV09PTEpIHsKICAgICAgICBtaXhlZCAqZXhlYyA9IGFkZGVkX2NtZHNba2V5c1tuaW5kZXhdLDBdOwogICAgICAgIGlmKCFwb2ludGVycChleGVjKSB8fCBzaXplb2YoZXhlYyk8PWkpCiAgICAgICAgICBjYXRjaChyYWlzZV9lcnJvcigKICAgICAgICAgICAgIkFkZENtZC1BdXN3ZXJ0dW5nOiBDYXRjaEFsbC1Lb21tYW5kbyBcIiIra2V5c1tuaW5kZXhdKyJcIiIKICAgICAgICAgICAgIiB3dXJkZSB3YWVocmVuZCBkZXIgQXVzZnVlaHJ1bmcgdmVyYWVuZGVydCBvZGVyIGdlbG9lc2NodC4gIgogICAgICAgICAgICAiS2xhcnRleHQ6IERhcyBpc3Qgc2NobGVjaHQuIFN1Y2h0IGVpbiBSZW1vdmVDbWQ/ICIpOwogICAgICAgICAgICBwdWJsaXNoKTsKICAgICAgICBlbHNlIGlmKF9leGVjdXRlKGV4ZWNbaV0sc3RyLDApKSB7CiAgICAgICAgICBHaXZlRVAoRVBfQ01ELCBxdWVyeV92ZXJiKCkpOwogICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgICB9CiAgIH0KIH0KIHJldHVybiAwOwp9Cgp2b2lkIGluaXQoKSB7CiBhZGRfYWN0aW9uKCJfY2wiLCIiLDEpOwp9CgoKc3RhdGljIHZvaWQgX2NoZWNrX2NvcHlfY29tbWFuZHMoc3RyaW5nIGluZCwgbWl4ZWQgKmZ1biwKCQkJCSAgbWl4ZWQgKmZsYWcsIG1peGVkICpydWxlKSB7CiBpZihwb2ludGVycChmdW4pKSBhZGRlZF9jbWRzW2luZCwwXT1mdW4rYWxsb2NhdGUoMCk7CiBlbHNlIGFkZGVkX2NtZHNbaW5kLDBdPSh7ZnVufSk7CiBpZihwb2ludGVycChmbGFnKSkgYWRkZWRfY21kc1tpbmQsMV09ZmxhZythbGxvY2F0ZSgwKTsKIGVsc2UgaWYoZmxhZykgYWRkZWRfY21kc1tpbmQsMV09KHtmbGFnfSk7CiBlbHNlIGFkZGVkX2NtZHNbaW5kLDFdPWFsbG9jYXRlKHNpemVvZihhZGRlZF9jbWRzW2luZF0pKTsKIGlmKHBvaW50ZXJwKHJ1bGUpKSBhZGRlZF9jbWRzW2luZCwyXT1ydWxlK2FsbG9jYXRlKDApOwogZWxzZSBhZGRlZF9jbWRzW2luZCwyXT1hbGxvY2F0ZShzaXplb2YoYWRkZWRfY21kc1tpbmRdKSk7CgogaWYoc2l6ZW9mKGFkZGVkX2NtZHNbaW5kXSkhPXNpemVvZihhZGRlZF9jbWRzW2luZCwxXSkgfHwKICAgIHNpemVvZihhZGRlZF9jbWRzW2luZF0pIT1zaXplb2YoYWRkZWRfY21kc1tpbmQsMl0pKSB7CiAgYWRkZWRfY21kcz0obWFwcGluZykwOwogIHJhaXNlX2Vycm9yKCJTZXRQcm9wKFBfQ09NTUFORFMpOiBjb3JydXB0IGNvbW1hbmRzLW1hcHBpbmcuXG4iKTsKIH0KfQoKc3RhdGljIG1hcHBpbmcgX3NldF9jb21tYW5kcyhtYXBwaW5nIGNvbW1hbmRzKSB7CiBpZighY29tbWFuZHMpIGFkZGVkX2NtZHM9KG1hcHBpbmcpMDsKIGVsc2UgaWYobWFwcGluZ3AoY29tbWFuZHMpKSB7CiAgYWRkZWRfY21kcz1tX2FsbG9jYXRlKHNpemVvZihjb21tYW5kcyksNCk7CiAgd2Fsa19tYXBwaW5nKGNvbW1hbmRzLCMnX2NoZWNrX2NvcHlfY29tbWFuZHMpOwogfQogaWYgKG1hcHBpbmdwKGFkZGVkX2NtZHMpKQogICByZXR1cm4oZGVlcF9jb3B5KGFkZGVkX2NtZHMpKTsKIGVsc2UKICAgcmV0dXJuIChtYXBwaW5nKTA7Cn0KCnN0YXRpYyBtYXBwaW5nIF9xdWVyeV9jb21tYW5kcygpIHsKIGlmIChtYXBwaW5ncChhZGRlZF9jbWRzKSkKICAgcmV0dXJuKGRlZXBfY29weShhZGRlZF9jbWRzKSk7CiBlbHNlCiAgIHJldHVybiAobWFwcGluZykwOwp9Cgo=