uni-jsframework-vue3-dev.js 718 KB

12
  1. //{"version":"3.6.4","encode":"base64"}
  2. dmFyIF9fVW5pU2VydmljZVN0YXJ0VGltZV9fID0gRGF0ZS5ub3coKTt2YXIgZ2xvYmFsPXRoaXM7IHZhciBwcm9jZXNzPXtlbnY6e319OyB2YXIgc2V0VGltZW91dD1nbG9iYWwuc2V0VGltZW91dDsKKCgpPT57dmFyIHdJPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgU0k9KHYsYyk9Pntmb3IodmFyIGIgaW4gYyl3SSh2LGIse2dldDpjW2JdLGVudW1lcmFibGU6ITB9KX07dmFyIGZzPU9iamVjdC5mcmVlemU7ZnVuY3Rpb24gZ3Uoe2dldEN1cnJlbnRQYWdlczp2LHVuaTpjLFVuaVNoYXJlZDpiLFZ1ZTpULFZ1ZVNoYXJlZDpCfSl7dmFyIEM9ZnVuY3Rpb24oayx1LEksR2UpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBBdCgpe2xldCBCZT12KCksYXQ9QmUubGVuZ3RoO2lmKGF0KXJldHVybiBCZVthdC0xXX1mdW5jdGlvbiB0bigpe2xldCBCZT1BdCgpO2lmKEJlKXJldHVybiBCZS4kdm19ZnVuY3Rpb24gQShCZSxhdCx5dCl7aWYodS5pc1N0cmluZyhCZSkpeXQ9YXQsYXQ9QmUsQmU9dG4oKTtlbHNlIGlmKHR5cGVvZiBCZT09Im51bWJlciIpe2xldCBzbj12KCkuZmluZChjbj0+Y24uJHBhZ2UuaWQ9PT1CZSk7c24/QmU9c24uJHZtOkJlPXRuKCl9aWYoIUJlKXJldHVybjtpZihCZS5fX2NhbGxfaG9vaylyZXR1cm4gQmUuX19jYWxsX2hvb2soYXQseXQpO2xldCBadD1CZS4kW2F0XTtyZXR1cm4gWnQmJkkuaW52b2tlQXJyYXlGbnMoWnQseXQpfWZ1bmN0aW9uIHNlKEJlLGF0LHl0LFp0KXt1LmlzRnVuY3Rpb24oYXQpJiZHZS5pbmplY3RIb29rKEJlLGF0LmJpbmQoeXQpLFp0KX1mdW5jdGlvbiBFbihCZSxhdCx5dCl7bGV0IFp0PUJlLm1wVHlwZXx8eXQuJG1wVHlwZTtpZighIVp0JiYoT2JqZWN0LmtleXMoQmUpLmZvckVhY2goc249PntpZihzbi5pbmRleE9mKCJvbiIpPT09MCl7bGV0IGNuPUJlW3NuXTt1LmlzQXJyYXkoY24pP2NuLmZvckVhY2goZ3I9PnNlKHNuLGdyLHl0LGF0KSk6c2Uoc24sY24seXQsYXQpfX0pLFp0PT09InBhZ2UiKSl7YXQuX19pc1Zpc2libGU9ITA7dHJ5e0EoeXQsSS5PTl9MT0FELGF0LmF0dHJzLl9fcGFnZVF1ZXJ5KSxkZWxldGUgYXQuYXR0cnMuX19wYWdlUXVlcnksQSh5dCxJLk9OX1NIT1cpfWNhdGNoKHNuKXtjb25zb2xlLmVycm9yKHNuLm1lc3NhZ2UrSS5MSU5FRkVFRCtzbi5zdGFjayl9fX1mdW5jdGlvbiBHbihCZSxhdCl7YnQoYXQsQmUuJHJlbmRlcmpzLEJlWyIkIitJLlJFTkRFUkpTX01PRFVMRVNdKX1mdW5jdGlvbiBidChCZSxhdCx5dD17fSl7aWYoIXUuaXNBcnJheShhdCkpcmV0dXJuO2xldCBadD1CZS51aWQsc249QmUuJHd4c01vZHVsZXN8fChCZS4kd3hzTW9kdWxlcz1bXSksY249QmUuY3R4O2F0LmZvckVhY2goZ3I9Pnt5dFtncl0mJihjbltncl09UShadCx5dFtncl0sZ3IpLHNuLnB1c2goZ3IpKX0pfWZ1bmN0aW9uIFEoQmUsYXQseXQpe2xldCBadD17fTtyZXR1cm4gbmV3IFByb3h5KFp0LHtnZXQoc24sY24pe3JldHVybiBadFtjbl18fChadFtjbl09YWUoQmUsYXQseXQsY24pKX19KX1mdW5jdGlvbiBhZShCZSxhdCx5dCxadCl7bGV0IHNuPSgpPT57fSxjbj0oKT0+SS5XWFNfUFJPVE9DT0wrSlNPTi5zdHJpbmdpZnkoW0JlLGF0LHl0KyIuIitadF0pO3JldHVybiBuZXcgUHJveHkoc24se2dldChncix5cil7cmV0dXJuIHlyPT09InRvSlNPTiI/Y246c25beXJdfHwoc25beXJdPWFlKEJlLGF0LHl0KyIuIitadCx5cikpfSxhcHBseShncix5cixJaSl7cmV0dXJuIEkuV1hTX1BST1RPQ09MK0pTT04uc3RyaW5naWZ5KFtCZSxhdCx5dCsiLiIrWnQsWy4uLklpXV0pfX0pfWZ1bmN0aW9uIGhuKEJlLGF0KXtidChhdCxCZS4kd3hzLEJlWyIkIitJLldYU19NT0RVTEVTXSl9ZnVuY3Rpb24gRnQoQmUsYXQseXQpe2huKEJlLGF0KSxHbihCZSxhdCksRW4oQmUsYXQseXQpfWZ1bmN0aW9uIFZ0KEJlLGF0LHl0KXtyZXR1cm4gQmVbYXRdPXl0fWZ1bmN0aW9uIHpyKEJlKXtyZXR1cm4gZnVuY3Rpb24oeXQsWnQsc24pe2lmKCFadCl0aHJvdyB5dDtsZXQgY249QmUuX2luc3RhbmNlO2lmKCFjbnx8IWNuLnByb3h5KXRocm93IHl0O0EoY24ucHJveHksSS5PTl9FUlJPUix5dCl9fWZ1bmN0aW9uIGVpKEJlLGF0KXtyZXR1cm4gQmU/Wy4uLm5ldyBTZXQoW10uY29uY2F0KEJlLGF0KSldOmF0fWZ1bmN0aW9uIFRyKEJlKXtJLlVuaUxpZmVjeWNsZUhvb2tzLmZvckVhY2goYXQ9PntCZVthdF09ZWl9KX1sZXQgbW4sR3Q9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Iixhbj0vXig/OltBLVphLXpcZCsvXXs0fSkqPyg/OltBLVphLXpcZCsvXXsyfSg/Oj09KT98W0EtWmEtelxkKy9dezN9PT8pPyQvO3R5cGVvZiBhdG9iIT0iZnVuY3Rpb24iP21uPWZ1bmN0aW9uKEJlKXtpZihCZT1TdHJpbmcoQmUpLnJlcGxhY2UoL1tcdFxuXGZcciBdKy9nLCIiKSwhYW4udGVzdChCZSkpdGhyb3cgbmV3IEVycm9yKCJGYWlsZWQgdG8gZXhlY3V0ZSAnYXRvYicgb24gJ1dpbmRvdyc6IFRoZSBzdHJpbmcgdG8gYmUgZGVjb2RlZCBpcyBub3QgY29ycmVjdGx5IGVuY29kZWQuIik7QmUrPSI9PSIuc2xpY2UoMi0oQmUubGVuZ3RoJjMpKTtmb3IodmFyIGF0LHl0PSIiLFp0LHNuLGNuPTA7Y248QmUubGVuZ3RoOylhdD1HdC5pbmRleE9mKEJlLmNoYXJBdChjbisrKSk8PDE4fEd0LmluZGV4T2YoQmUuY2hhckF0KGNuKyspKTw8MTJ8KFp0PUd0LmluZGV4T2YoQmUuY2hhckF0KGNuKyspKSk8PDZ8KHNuPUd0LmluZGV4T2YoQmUuY2hhckF0KGNuKyspKSkseXQrPVp0PT09NjQ/U3RyaW5nLmZyb21DaGFyQ29kZShhdD4+MTYmMjU1KTpzbj09PTY0P1N0cmluZy5mcm9tQ2hhckNvZGUoYXQ+PjE2JjI1NSxhdD4+OCYyNTUpOlN0cmluZy5mcm9tQ2hhckNvZGUoYXQ+PjE2JjI1NSxhdD4+OCYyNTUsYXQmMjU1KTtyZXR1cm4geXR9Om1uPWF0b2I7ZnVuY3Rpb24gUG4oQmUpe3JldHVybiBkZWNvZGVVUklDb21wb25lbnQobW4oQmUpLnNwbGl0KCIiKS5tYXAoZnVuY3Rpb24oYXQpe3JldHVybiIlIisoIjAwIithdC5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTIpfSkuam9pbigiIikpfWZ1bmN0aW9uIFVuKCl7bGV0IEJlPWMuZ2V0U3RvcmFnZVN5bmMoInVuaV9pZF90b2tlbiIpfHwiIixhdD1CZS5zcGxpdCgiLiIpO2lmKCFCZXx8YXQubGVuZ3RoIT09MylyZXR1cm57dWlkOm51bGwscm9sZTpbXSxwZXJtaXNzaW9uOltdLHRva2VuRXhwaXJlZDowfTtsZXQgeXQ7dHJ5e3l0PUpTT04ucGFyc2UoUG4oYXRbMV0pKX1jYXRjaChadCl7dGhyb3cgbmV3IEVycm9yKCJcdTgzQjdcdTUzRDZcdTVGNTNcdTUyNERcdTc1MjhcdTYyMzdcdTRGRTFcdTYwNkZcdTUxRkFcdTk1MTlcdUZGMENcdThCRTZcdTdFQzZcdTk1MTlcdThCRUZcdTRGRTFcdTYwNkZcdTRFM0FcdUZGMUEiK1p0Lm1lc3NhZ2UpfXJldHVybiB5dC50b2tlbkV4cGlyZWQ9eXQuZXhwKjFlMyxkZWxldGUgeXQuZXhwLGRlbGV0ZSB5dC5pYXQseXR9ZnVuY3Rpb24gaXIoQmUpe0JlLnVuaUlESGFzUm9sZT1mdW5jdGlvbihhdCl7bGV0e3JvbGU6eXR9PVVuKCk7cmV0dXJuIHl0LmluZGV4T2YoYXQpPi0xfSxCZS51bmlJREhhc1Blcm1pc3Npb249ZnVuY3Rpb24oYXQpe2xldHtwZXJtaXNzaW9uOnl0fT1VbigpO3JldHVybiB0aGlzLnVuaUlESGFzUm9sZSgiYWRtaW4iKXx8eXQuaW5kZXhPZihhdCk+LTF9LEJlLnVuaUlEVG9rZW5WYWxpZD1mdW5jdGlvbigpe2xldHt0b2tlbkV4cGlyZWQ6YXR9PVVuKCk7cmV0dXJuIGF0PkRhdGUubm93KCl9fWZ1bmN0aW9uIEZuKEJlKXtsZXQgYXQ9QmUuX2NvbnRleHQuY29uZmlnO3UuaXNGdW5jdGlvbihCZS5fY29tcG9uZW50Lm9uRXJyb3IpJiYoYXQuZXJyb3JIYW5kbGVyPXpyKEJlKSksVHIoYXQub3B0aW9uTWVyZ2VTdHJhdGVnaWVzKTtsZXQgeXQ9YXQuZ2xvYmFsUHJvcGVydGllcztpcih5dCkseXQuJHNldD1WdCx5dC4kYXBwbHlPcHRpb25zPUZ0LEkuaW52b2tlQ3JlYXRlVnVlQXBwSG9vayhCZSl9cmV0dXJuIGsuaW5pdEFwcD1GbixPYmplY3QuZGVmaW5lUHJvcGVydHkoaywiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksa30oe30sQixiLFQpO3JldHVybiBDfWZ1bmN0aW9uIFh1KHYse252dWU6YyxVbmlTaGFyZWQ6YixWdWVTaGFyZWQ6VCxWdWVSZWFjdGl2aXR5OkJ9KXtsZXQgQz17cGxhdGZvcm06Yy5jb25maWcuZW52LnBsYXRmb3JtLFVuaVNoYXJlZDpiLFZ1ZVNoYXJlZDpULFZ1ZVJlYWN0aXZpdHk6Qn07cmV0dXJuIHYoQyxjLmRvY3VtZW50KX1mdW5jdGlvbiBDSSh7c2V0VGltZW91dDp2LGNsZWFyVGltZW91dDpjLHVuaTpiLGdldEN1cnJlbnRQYWdlczpULFZ1ZTpCLHdlZXg6QyxwbHVzOmssQnJvYWRjYXN0Q2hhbm5lbDp1LFVuaVZpZXdKU0JyaWRnZTpJLFZ1ZVNoYXJlZDpHZSxVbmlTaGFyZWQ6QXR9KXt2YXIgdG49ZnVuY3Rpb24oQSxzZSxFbil7InVzZSBzdHJpY3QiO2xldCBHbj1bIm5hdmlnYXRlIiwicmVkaXJlY3QiLCJzd2l0Y2hUYWIiLCJyZUxhdW5jaCIsIm5hdmlnYXRlQmFjayJdLGJ0PVsic2xpZGUtaW4tcmlnaHQiLCJzbGlkZS1pbi1sZWZ0Iiwic2xpZGUtaW4tdG9wIiwic2xpZGUtaW4tYm90dG9tIiwiZmFkZS1pbiIsInpvb20tb3V0Iiwiem9vbS1mYWRlLW91dCIsInBvcC1pbiIsIm5vbmUiXSxRPVsic2xpZGUtb3V0LXJpZ2h0Iiwic2xpZGUtb3V0LWxlZnQiLCJzbGlkZS1vdXQtdG9wIiwic2xpZGUtb3V0LWJvdHRvbSIsImZhZGUtb3V0Iiwiem9vbS1pbiIsInpvb20tZmFkZS1pbiIsInBvcC1vdXQiLCJub25lIl0sYWU9e2hvdmVyQ2xhc3M6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6Im5hdmlnYXRvci1ob3ZlciJ9LHVybDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sb3BlblR5cGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6Im5hdmlnYXRlIix2YWxpZGF0b3IoXyl7cmV0dXJuIEJvb2xlYW4ofkduLmluZGV4T2YoXykpfX0sZGVsdGE6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MX0saG92ZXJTdGFydFRpbWU6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6NTB9LGhvdmVyU3RheVRpbWU6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6NjAwfSxleGlzdHM6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LGhvdmVyU3RvcFByb3BhZ2F0aW9uOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sYW5pbWF0aW9uVHlwZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIix2YWxpZGF0b3IoXyl7cmV0dXJuIV98fGJ0LmNvbmNhdChRKS5pbmNsdWRlcyhfKX19LGFuaW1hdGlvbkR1cmF0aW9uOnt0eXBlOltTdHJpbmcsTnVtYmVyXSxkZWZhdWx0OjMwMH19O2Z1bmN0aW9uIGhuKF8pe3JldHVybigpPT57aWYoXy5vcGVuVHlwZSE9PSJuYXZpZ2F0ZUJhY2siJiYhXy51cmwpe2NvbnNvbGUuZXJyb3IoIjxuYXZpZ2F0b3IvPiBzaG91bGQgaGF2ZSB1cmwgYXR0cmlidXRlIHdoZW4gdXNpbmcgbmF2aWdhdGVUbywgcmVkaXJlY3RUbywgcmVMYXVuY2ggb3Igc3dpdGNoVGFiIik7cmV0dXJufWxldCBGPXBhcnNlSW50KF8uYW5pbWF0aW9uRHVyYXRpb24pO3N3aXRjaChfLm9wZW5UeXBlKXtjYXNlIm5hdmlnYXRlIjpiLm5hdmlnYXRlVG8oe3VybDpfLnVybCxhbmltYXRpb25UeXBlOl8uYW5pbWF0aW9uVHlwZXx8InBvcC1pbiIsYW5pbWF0aW9uRHVyYXRpb246Rn0pO2JyZWFrO2Nhc2UicmVkaXJlY3QiOmIucmVkaXJlY3RUbyh7dXJsOl8udXJsLGV4aXN0czpfLmV4aXN0c30pO2JyZWFrO2Nhc2Uic3dpdGNoVGFiIjpiLnN3aXRjaFRhYih7dXJsOl8udXJsfSk7YnJlYWs7Y2FzZSJyZUxhdW5jaCI6Yi5yZUxhdW5jaCh7dXJsOl8udXJsfSk7YnJlYWs7Y2FzZSJuYXZpZ2F0ZUJhY2siOmIubmF2aWdhdGVCYWNrKHtkZWx0YTpfLmRlbHRhLGFuaW1hdGlvblR5cGU6Xy5hbmltYXRpb25UeXBlfHwicG9wLW91dCIsYW5pbWF0aW9uRHVyYXRpb246Rn0pO2JyZWFrfX19ZnVuY3Rpb24gRnQoXyl7aWYoXy5ob3ZlckNsYXNzJiZfLmhvdmVyQ2xhc3MhPT0ibm9uZSIpe2xldCBGPXtob3ZlckNsYXNzOl8uaG92ZXJDbGFzc307cmV0dXJuIHNlLmhhc093bihfLCJob3ZlclN0YXJ0VGltZSIpJiYoRi5ob3ZlclN0YXJ0VGltZT1fLmhvdmVyU3RhcnRUaW1lKSxzZS5oYXNPd24oXywiaG92ZXJTdGF5VGltZSIpJiYoRi5ob3ZlclN0YXlUaW1lPV8uaG92ZXJTdGF5VGltZSksc2UuaGFzT3duKF8sImhvdmVyU3RvcFByb3BhZ2F0aW9uIikmJihGLmhvdmVyU3RvcFByb3BhZ2F0aW9uPV8uaG92ZXJTdG9wUHJvcGFnYXRpb24pLEZ9cmV0dXJue319ZnVuY3Rpb24gVnQoXyxGKXtyZXR1cm4gQS5jcmVhdGVFbGVtZW50Vk5vZGUoInUtdGV4dCIsc2UuZXh0ZW5kKHthcHBlbmRBc1RyZWU6ITB9LEYpLF8pfWxldCB6cj1beyJuYXZpZ2F0b3ItaG92ZXIiOnsiIjp7YmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDAuMSkiLG9wYWNpdHk6Ljd9fX1dO3ZhciBlaT1BLmRlZmluZUNvbXBvbmVudCh7bmFtZToiTmF2aWdhdG9yIixwcm9wczphZSxzdHlsZXM6enIsc2V0dXAoXyx7c2xvdHM6Rn0pe2xldCBxPWhuKF8pO3JldHVybigpPT5BLmNyZWF0ZVZOb2RlKCJ2aWV3IixBLm1lcmdlUHJvcHMoRnQoXykse29uQ2xpY2s6cX0pLFtGLmRlZmF1bHQmJkYuZGVmYXVsdCgpXSl9fSk7ZnVuY3Rpb24gVHIoXyl7cmV0dXJuIFN5bWJvbChfKX1mdW5jdGlvbiBtbigpe3JldHVybiBBLmdldEN1cnJlbnRJbnN0YW5jZSgpLnJvb3QucHJveHkuJHBhZ2UuaWR9bGV0IEd0LGFuLFBuO2Z1bmN0aW9uIFVuKCl7cmV0dXJuIHR5cGVvZiB3aW5kb3c9PSJvYmplY3QiJiZ0eXBlb2YgbmF2aWdhdG9yPT0ib2JqZWN0IiYmdHlwZW9mIGRvY3VtZW50PT0ib2JqZWN0Ij8id2VidmlldyI6InY4In1mdW5jdGlvbiBpcigpe3JldHVybiBHdC53ZWJ2aWV3LmN1cnJlbnRXZWJ2aWV3KCkuaWR9bGV0IEZuLEJlLGF0PXt9O2Z1bmN0aW9uIHl0KF8pe2xldCBGPV8uZGF0YSYmXy5kYXRhLl9fbWVzc2FnZTtpZighRnx8IUYuX19wYWdlKXJldHVybjtsZXQgcT1GLl9fcGFnZSxXPWF0W3FdO1cmJlcoRiksRi5rZWVwfHxkZWxldGUgYXRbcV19ZnVuY3Rpb24gWnQoXyxGKXtVbigpPT09InY4Ij9Qbj8oRm4mJkZuLmNsb3NlKCksRm49bmV3IFBuKGlyKCkpLEZuLm9ubWVzc2FnZT15dCk6QmV8fChCZT1hbi5yZXF1aXJlTW9kdWxlKCJnbG9iYWxFdmVudCIpLEJlLmFkZEV2ZW50TGlzdGVuZXIoInBsdXNNZXNzYWdlIix5dCkpOndpbmRvdy5fX3BsdXNNZXNzYWdlPXl0LGF0W19dPUZ9Y2xhc3Mgc257Y29uc3RydWN0b3IoRil7dGhpcy53ZWJ2aWV3PUZ9c2VuZE1lc3NhZ2UoRil7bGV0IHE9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh7X19tZXNzYWdlOntkYXRhOkZ9fSkpLFc9dGhpcy53ZWJ2aWV3LmlkO1BuP25ldyBQbihXKS5wb3N0TWVzc2FnZShxKTpHdC53ZWJ2aWV3LnBvc3RNZXNzYWdlVG9VbmlOVmlldyYmR3Qud2Vidmlldy5wb3N0TWVzc2FnZVRvVW5pTlZpZXcocSxXKX1jbG9zZSgpe3RoaXMud2Vidmlldy5jbG9zZSgpfX1mdW5jdGlvbiBjbih7Y29udGV4dDpfPXt9LHVybDpGLGRhdGE6cT17fSxzdHlsZTpXPXt9LG9uTWVzc2FnZTplZSxvbkNsb3NlOnJlfSl7R3Q9Xy5wbHVzfHxrLGFuPV8ud2VleHx8KHR5cGVvZiBDPT0ib2JqZWN0Ij9DOm51bGwpLFBuPV8uQnJvYWRjYXN0Q2hhbm5lbHx8KHR5cGVvZiB1PT0ib2JqZWN0Ij91Om51bGwpO2xldCBwZT17YXV0b0JhY2tCdXR0b246ITAsdGl0bGVTaXplOiIxN3B4In0sQ2U9YHBhZ2Uke0RhdGUubm93KCl9YDtXPXNlLmV4dGVuZCh7fSxXKSxXLnRpdGxlTlZpZXchPT0hMSYmVy50aXRsZU5WaWV3IT09Im5vbmUiJiYoVy50aXRsZU5WaWV3PXNlLmV4dGVuZChwZSxXLnRpdGxlTlZpZXcpKTtsZXQgTWU9e3RvcDowLGJvdHRvbTowLHVzaW5nQ29tcG9uZW50czp7fSxwb3BHZXN0dXJlOiJjbG9zZSIsc2Nyb2xsSW5kaWNhdG9yOiJub25lIixhbmltYXRpb25UeXBlOiJwb3AtaW4iLGFuaW1hdGlvbkR1cmF0aW9uOjIwMCx1bmlOVmlldzp7cGF0aDpgLyR7Rn0uanNgLGRlZmF1bHRGb250U2l6ZToxNix2aWV3cG9ydDpHdC5zY3JlZW4ucmVzb2x1dGlvbldpZHRofX07Vz1zZS5leHRlbmQoTWUsVyk7bGV0ICRlPUd0LndlYnZpZXcuY3JlYXRlKCIiLENlLFcse2V4dHJhczp7ZnJvbTppcigpLHJ1bnRpbWU6VW4oKSxkYXRhOnEsdXNlR2xvYmFsRXZlbnQ6IVBufX0pO3JldHVybiAkZS5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIscmUpLFp0KENlLEFlPT57c2UuaXNGdW5jdGlvbihlZSkmJmVlKEFlLmRhdGEpLEFlLmtlZXB8fCRlLmNsb3NlKCJhdXRvIil9KSwkZS5zaG93KFcuYW5pbWF0aW9uVHlwZSxXLmFuaW1hdGlvbkR1cmF0aW9uKSxuZXcgc24oJGUpfWxldCBncj17Zm9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0seXI9VHIoInVsIik7ZnVuY3Rpb24gSWkoKXtsZXQgXz1bXTtyZXR1cm4gQS5wcm92aWRlKHlyLHthZGRIYW5kbGVyKEYpe18ucHVzaChGKX0scmVtb3ZlSGFuZGxlcihGKXtfLnNwbGljZShfLmluZGV4T2YoRiksMSl9fSksX312YXIgUGk9QS5kZWZpbmVDb21wb25lbnQoe25hbWU6IkxhYmVsIixwcm9wczpncixzdHlsZXM6W10sc2V0dXAoXyx7c2xvdHM6Rn0pe2xldCBxPW1uKCksVz1JaSgpLGVlPXJlPT57Xy5mb3I/SS5lbWl0KGB1bmktbGFiZWwtY2xpY2stJHtxfS0ke18uZm9yfWAscmUsITApOlcubGVuZ3RoJiZXWzBdKHJlLCEwKX07cmV0dXJuKCk9PkEuY3JlYXRlVk5vZGUoInZpZXciLHtvbkNsaWNrOmVlfSxbRi5kZWZhdWx0JiZGLmRlZmF1bHQoKV0pfX0pO2Z1bmN0aW9uIG9yKF8sRil7emkoXy5pZCxGKSxBLndhdGNoKCgpPT5fLmlkLChxLFcpPT57JG8oVyxGLCEwKSx6aShxLEYsITApfSksQS5vblVubW91bnRlZCgoKT0+eyRvKF8uaWQsRil9KX1mdW5jdGlvbiB6aShfLEYscSl7bGV0IFc9bW4oKTtxJiYhX3x8IXNlLmlzUGxhaW5PYmplY3QoRil8fE9iamVjdC5rZXlzKEYpLmZvckVhY2goZWU9PntxP2VlLmluZGV4T2YoIkAiKSE9PTAmJmVlLmluZGV4T2YoInVuaS0iKSE9PTAmJkkub24oYHVuaS0ke2VlfS0ke1d9LSR7X31gLEZbZWVdKTplZS5pbmRleE9mKCJ1bmktIik9PT0wP0kub24oZWUsRltlZV0pOl8mJkkub24oYHVuaS0ke2VlfS0ke1d9LSR7X31gLEZbZWVdKX0pfWZ1bmN0aW9uICRvKF8sRixxKXtsZXQgVz1tbigpO3EmJiFffHwhc2UuaXNQbGFpbk9iamVjdChGKXx8T2JqZWN0LmtleXMoRikuZm9yRWFjaChlZT0+e3E/ZWUuaW5kZXhPZigiQCIpIT09MCYmZWUuaW5kZXhPZigidW5pLSIpIT09MCYmSS5vZmYoYHVuaS0ke2VlfS0ke1d9LSR7X31gLEZbZWVdKTplZS5pbmRleE9mKCJ1bmktIik9PT0wP0kub2ZmKGVlLEZbZWVdKTpfJiZJLm9mZihgdW5pLSR7ZWV9LSR7V30tJHtffWAsRltlZV0pfSl9ZnVuY3Rpb24gTmkoXyl7cmV0dXJuIE9iamVjdC5rZXlzKF8pLm1hcChGPT5bRixfW0ZdXSl9bGV0IFdpPVsiY2xhc3MiLCJzdHlsZSJdLEdpPS9eb25bQS1aXSsvLGhpPShfPXt9KT0+e2xldHtleGNsdWRlTGlzdGVuZXJzOkY9ITEsZXhjbHVkZUtleXM6cT1bXX09XyxXPUEuZ2V0Q3VycmVudEluc3RhbmNlKCksZWU9QS5zaGFsbG93UmVmKHt9KSxyZT1BLnNoYWxsb3dSZWYoe30pLHBlPUEuc2hhbGxvd1JlZih7fSksQ2U9cS5jb25jYXQoV2kpO3JldHVybiBXLmF0dHJzPUEucmVhY3RpdmUoVy5hdHRycyksQS53YXRjaEVmZmVjdCgoKT0+e2xldCBNZT1OaShXLmF0dHJzKS5yZWR1Y2UoKCRlLFtBZSxrZV0pPT4oQ2UuaW5jbHVkZXMoQWUpPyRlLmV4Y2x1ZGVbQWVdPWtlOkdpLnRlc3QoQWUpPyhGfHwoJGUuYXR0cnNbQWVdPWtlKSwkZS5saXN0ZW5lcnNbQWVdPWtlKTokZS5hdHRyc1tBZV09a2UsJGUpLHtleGNsdWRlOnt9LGF0dHJzOnt9LGxpc3RlbmVyczp7fX0pO2VlLnZhbHVlPU1lLmF0dHJzLHJlLnZhbHVlPU1lLmxpc3RlbmVycyxwZS52YWx1ZT1NZS5leGNsdWRlfSkseyRhdHRyczplZSwkbGlzdGVuZXJzOnJlLCRleGNsdWRlQXR0cnM6cGV9fSxZaT17aWQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LGhvdmVyQ2xhc3M6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6ImJ1dHRvbi1ob3ZlciJ9LGhvdmVyU3RhcnRUaW1lOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjIwfSxob3ZlclN0YXlUaW1lOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjcwfSxob3ZlclN0b3BQcm9wYWdhdGlvbjp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LGRpc2FibGVkOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sZm9ybVR5cGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LG9wZW5UeXBlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxsb2FkaW5nOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0scGxhaW46e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfX0sTHI9VHIoInVmIiksVnI9W3t1Yjp7IiI6e2ZsZXhEaXJlY3Rpb246InJvdyIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoiY2VudGVyIixwb3NpdGlvbjoicmVsYXRpdmUiLHBhZGRpbmdMZWZ0OiI1IixwYWRkaW5nUmlnaHQ6IjUiLG92ZXJmbG93OiJoaWRkZW4iLGNvbG9yOiIjMDAwMDAwIixiYWNrZ3JvdW5kQ29sb3I6IiNmOGY4ZjgiLGJvcmRlclJhZGl1czoiNSIsYm9yZGVyU3R5bGU6InNvbGlkIixib3JkZXJXaWR0aDoiMSIsYm9yZGVyQ29sb3I6IiNkYmRiZGIifX0sInViLXQiOnsiIjp7Y29sb3I6IiMwMDAwMDAiLGZvbnRTaXplOiIxOCIsdGV4dERlY29yYXRpb246Im5vbmUiLGxpbmVIZWlnaHQ6IjQ2In19LCJ1Yi1kIjp7IiI6e2JhY2tncm91bmRDb2xvcjoiI2Y4ZjhmOCJ9fSwidWItcCI6eyIiOntiYWNrZ3JvdW5kQ29sb3I6IiMwMDdhZmYiLGJvcmRlckNvbG9yOiIjMDA2MmNjIn19LCJ1Yi13Ijp7IiI6e2JhY2tncm91bmRDb2xvcjoiI2U2NDM0MCIsYm9yZGVyQ29sb3I6IiNiODM2MzMifX0sInViLWQtdCI6eyIiOntjb2xvcjoiIzAwMDAwMCJ9fSwidWItcC10Ijp7IiI6e2NvbG9yOiIjZmZmZmZmIn19LCJ1Yi13LXQiOnsiIjp7Y29sb3I6IiNmZmZmZmYifX0sInViLWQtZCI6eyIiOntiYWNrZ3JvdW5kQ29sb3I6IiNmN2Y3ZjcifX0sInViLXAtZCI6eyIiOntiYWNrZ3JvdW5kQ29sb3I6IiM2M2FjZmMiLGJvcmRlckNvbG9yOiIjNGY4YWNhIn19LCJ1Yi13LWQiOnsiIjp7YmFja2dyb3VuZENvbG9yOiIjZWM4Yjg5Iixib3JkZXJDb2xvcjoiI2JkNmY2ZSJ9fSwidWItZC10LWQiOnsiIjp7Y29sb3I6IiNjY2NjY2MifX0sInViLXAtdC1kIjp7IiI6e2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNikifX0sInViLXctdC1kIjp7IiI6e2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNikifX0sInViLWQtcGxhaW4iOnsiIjp7Ym9yZGVyQ29sb3I6IiMzNTM1MzUiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9fSwidWItcC1wbGFpbiI6eyIiOntib3JkZXJDb2xvcjoiIzAwN2FmZiIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn19LCJ1Yi13LXBsYWluIjp7IiI6e2JvcmRlckNvbG9yOiIjZTY0MzQwIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifX0sInViLWQtdC1wbGFpbiI6eyIiOntjb2xvcjoiIzM1MzUzNSJ9fSwidWItcC10LXBsYWluIjp7IiI6e2NvbG9yOiIjMDA3YWZmIn19LCJ1Yi13LXQtcGxhaW4iOnsiIjp7Y29sb3I6IiNlNjQzNDAifX0sInViLWQtZC1wbGFpbiI6eyIiOntib3JkZXJDb2xvcjoiI2M2YzZjNiIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn19LCJ1Yi1wLWQtcGxhaW4iOnsiIjp7Ym9yZGVyQ29sb3I6IiNjNmM2YzYiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9fSwidWItdy1kLXBsYWluIjp7IiI6e2JvcmRlckNvbG9yOiIjYzZjNmM2IixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifX0sInViLWQtdC1kLXBsYWluIjp7IiI6e2NvbG9yOiJyZ2JhKDAsMCwwLDAuMikifX0sInViLXAtdC1kLXBsYWluIjp7IiI6e2NvbG9yOiJyZ2JhKDAsMCwwLDAuMikifX0sInViLXctdC1kLXBsYWluIjp7IiI6e2NvbG9yOiJyZ2JhKDAsMCwwLDAuMikifX0sInViLW1pbmkiOnsiIjp7bGluZUhlaWdodDoiMzAiLGZvbnRTaXplOiIxMyIscGFkZGluZ1RvcDowLHBhZGRpbmdSaWdodDoiMTcuNSIscGFkZGluZ0JvdHRvbTowLHBhZGRpbmdMZWZ0OiIxNy41In19LCJ1Yi1sb2FkaW5nIjp7IiI6e3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsbWFyZ2luUmlnaHQ6IjEwIn19LCJ1Yi1kLWxvYWRpbmciOnsiIjp7Y29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC42KSIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn19LCJ1Yi1wLWxvYWRpbmciOnsiIjp7Y29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC42KSIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn19LCJ1Yi13LWxvYWRpbmciOnsiIjp7Y29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC42KSIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn19LCJ1Yi1kLWxvYWRpbmctcGxhaW4iOnsiIjp7Y29sb3I6IiMzNTM1MzUifX0sInViLXAtbG9hZGluZy1wbGFpbiI6eyIiOntjb2xvcjoiIzAwN2FmZiIsYmFja2dyb3VuZENvbG9yOiIjMDA2MmNjIn19LCJ1Yi13LWxvYWRpbmctcGxhaW4iOnsiIjp7Y29sb3I6IiNlNjQzNDAiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9fSwidWItZC1ob3ZlciI6eyIiOntvcGFjaXR5Oi44LGJhY2tncm91bmRDb2xvcjoiI2RlZGVkZSJ9fSwidWItcC1ob3ZlciI6eyIiOntvcGFjaXR5Oi44LGJhY2tncm91bmRDb2xvcjoiIzAwNjJjYyJ9fSwidWItdy1ob3ZlciI6eyIiOntvcGFjaXR5Oi44LGJhY2tncm91bmRDb2xvcjoiI2NlM2MzOSJ9fSwidWItZC10LWhvdmVyIjp7IiI6e2NvbG9yOiJyZ2JhKDAsMCwwLDAuNikifX0sInViLXAtdC1ob3ZlciI6eyIiOntjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjYpIn19LCJ1Yi13LXQtaG92ZXIiOnsiIjp7Y29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC42KSJ9fSwidWItZC1ob3Zlci1wbGFpbiI6eyIiOntjb2xvcjoicmdiYSg1Myw1Myw1MywwLjYpIixib3JkZXJDb2xvcjoicmdiYSg1Myw1Myw1MywwLjYpIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifX0sInViLXAtaG92ZXItcGxhaW4iOnsiIjp7Y29sb3I6InJnYmEoMjYsMTczLDI1LDAuNikiLGJvcmRlckNvbG9yOiJyZ2JhKDAsMTIyLDI1NSwwLjYpIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifX0sInViLXctaG92ZXItcGxhaW4iOnsiIjp7Y29sb3I6InJnYmEoMjMwLDY3LDY0LDAuNikiLGJvcmRlckNvbG9yOiJyZ2JhKDIzMCw2Nyw2NCwwLjYpIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifX19XSxhcj17ZGVmYXVsdDoiZCIscHJpbWFyeToicCIsd2FybjoidyJ9O3ZhciBJcj1BLmRlZmluZUNvbXBvbmVudCh7aW5oZXJpdEF0dHJzOiExLG5hbWU6IkJ1dHRvbiIscHJvcHM6c2UuZXh0ZW5kKFlpLHt0eXBlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJkZWZhdWx0In0sc2l6ZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiZGVmYXVsdCJ9fSksc3R5bGVzOlZyLHNldHVwKF8se3Nsb3RzOkYsYXR0cnM6cX0pe2xldHskYXR0cnM6VywkZXhjbHVkZUF0dHJzOmVlLCRsaXN0ZW5lcnM6cmV9PWhpKHtleGNsdWRlTGlzdGVuZXJzOiEwfSkscGU9Xy50eXBlLENlPUEucmVmKG51bGwpLE1lPUEuaW5qZWN0KExyLCExKSwkZT0oZ3QsdXQpPT57bGV0IE50PXJlLnZhbHVlLm9uQ2xpY2t8fCgoKT0+e30pO2lmKF8uZGlzYWJsZWQpcmV0dXJuO050KGd0KTtsZXQgcG49Xy5mb3JtVHlwZTtpZihwbil7aWYoIU1lKXJldHVybjtwbj09PSJzdWJtaXQiP01lLnN1Ym1pdChndCk6cG49PT0icmVzZXQiJiZNZS5yZXNldChndCl9fSxBZT1ndD0+e2xldCB1dD0idWItIithcltwZV0rZ3Q7cmV0dXJuIF8uZGlzYWJsZWQmJih1dCs9Ii1kIiksXy5wbGFpbiYmKHV0Kz0iLXBsYWluIiksXy5zaXplPT09Im1pbmkiJiZndD09PSItdCImJih1dCs9IiB1Yi1taW5pIiksdXR9LGtlPWd0PT57aWYoXy5kaXNhYmxlZClyZXR1cm4iIjtsZXQgdXQ9InViLSIrYXJbcGVdK2d0KyItaG92ZXIiO3JldHVybiBfLnBsYWluJiYodXQrPSItcGxhaW4iKSx1dH0scWU9QS5pbmplY3QoeXIsITEpO3FlJiYocWUuYWRkSGFuZGxlcigkZSksQS5vbkJlZm9yZVVubW91bnQoKCk9PntxZS5yZW1vdmVIYW5kbGVyKCRlKX0pKSxvcihfLHsibGFiZWwtY2xpY2siOiRlfSk7bGV0IHZ0PUEuY29tcHV0ZWQoKCk9PntsZXQgZ3Q9e307Zm9yKGxldCB1dCBpbiByZS52YWx1ZSl7bGV0IE50PXJlLnZhbHVlW3V0XTt1dCE9PSJvbkNsaWNrIiYmKGd0W3V0XT1OdCl9cmV0dXJuIGd0fSksSnQ9KCk9PntpZighRi5kZWZhdWx0KXJldHVybltdO2xldCBndD1GLmRlZmF1bHQoKTtyZXR1cm4gZ3QubGVuZ3RoPT09MSYmZ3RbMF0udHlwZT09PUEuVGV4dD9bVnQoZ3RbMF0uY2hpbGRyZW4se2NsYXNzOiJ1Yi10ICIrQWUoIi10Iil9KV06Z3R9O3JldHVybigpPT57bGV0IGd0PXNlLmV4dGVuZCh7fSxGdChfKSx7aG92ZXJDbGFzczprZSgiIil9LFcudmFsdWUsZWUudmFsdWUsdnQudmFsdWUpO3JldHVybiBBLmNyZWF0ZVZOb2RlKCJ2aWV3IixBLm1lcmdlUHJvcHMoe3JlZjpDZSxjbGFzczpbInViIixBZSgiIildLG9uQ2xpY2s6JGV9LGd0KSxbXy5sb2FkaW5nP0EuY3JlYXRlVk5vZGUoImxvYWRpbmctaW5kaWNhdG9yIixBLm1lcmdlUHJvcHMoe2NsYXNzOlsidWItbG9hZGluZyIsYHViLSR7YXJbcGVdfS1sb2FkaW5nYF19LHthcnJvdzoiZmFsc2UiLGFuaW1hdGluZzoidHJ1ZSJ9KSxudWxsKTpudWxsLC4uLkp0KCldKX19fSk7bGV0IHFpPXtzY2FsZUFyZWE6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfX07ZnVuY3Rpb24gU28oXyl7bGV0IEY9W107cmV0dXJuIHNlLmlzQXJyYXkoXykmJl8uZm9yRWFjaChxPT57QS5pc1ZOb2RlKHEpP3EudHlwZT09PUEuRnJhZ21lbnQ/Ri5wdXNoKC4uLlNvKHEuY2hpbGRyZW4pKTpGLnB1c2gocSk6c2UuaXNBcnJheShxKSYmRi5wdXNoKC4uLlNvKHEpKX0pLEZ9ZnVuY3Rpb24gQ28oXyl7bGV0IEY9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gZnVuY3Rpb24oVyl7cmV0dXJuIEZbV118fChGW1ddPV8oVykpfX1sZXQgdGk9Q28oZnVuY3Rpb24oXyl7bGV0IEY9e30scT0vOyg/IVteKF0qXCkpL2csVz0vOiguKykvO3JldHVybiBfLnNwbGl0KHEpLmZvckVhY2goZnVuY3Rpb24oZWUpe2lmKGVlKXtsZXQgcmU9ZWUuc3BsaXQoVyk7cmUubGVuZ3RoPjEmJihGW3JlWzBdLnRyaW0oKV09cmVbMV0udHJpbSgpKX19KSxGfSksUW49Xz0+bmV3IFByb21pc2UoKEYscSk9PntpZighXylyZXR1cm4gRih7d2lkdGg6MCxoZWlnaHQ6MCx0b3A6MCxsZWZ0OjB9KTtDLnJlcXVpcmVNb2R1bGUoImRvbSIpLmdldENvbXBvbmVudFJlY3QoXywoe3NpemU6ZWV9KT0+e0YoZWUpfSl9KTt2YXIgcGk9QS5kZWZpbmVDb21wb25lbnQoe25hbWU6Ik1vdmFibGVBcmVhIixwcm9wczpxaSxzdHlsZXM6W3sidW5pLW1vdmFibGUtYXJlYSI6eyIiOntvdmVyZmxvdzoiaGlkZGVuIix3aWR0aDoiMTBweCIsaGVpZ2h0OiIxMHB4In19fV0sc2V0dXAoXyx7c2xvdHM6Rn0pe2xldCBxPUEucmVmKDApLFc9QS5yZWYoMCksZWU9QS5yZWYoMCkscmU9QS5yZWYoMCkscGU9QS5yZWYoITEpLENlPUEucmVmKG51bGwpLE1lPVtdLCRlPW51bGwsQWU9dXQ9PnskZT11dH0sa2U9KCk9PlFuKENlLnZhbHVlKS50aGVuKCh7d2lkdGg6dXQsaGVpZ2h0Ok50LHRvcDpwbixsZWZ0OlN0fSk9PntxLnZhbHVlPXV0LFcudmFsdWU9TnQsZWUudmFsdWU9cG4scmUudmFsdWU9U3R9KSxxZT0oKT0+e2tlKCkudGhlbigoKT0+e01lLmZvckVhY2goZnVuY3Rpb24odXQpe3V0LnNldFBhcmVudCgpfSl9KX07QS5vbk1vdW50ZWQoKCk9Pnt2KCgpPT57cGUudmFsdWU9ITAscWUoKX0sMjAwKX0pO2xldCB2dD17b25QYW5zdGFydCh1dCl7JGUmJiRlLnRvdWNoc3RhcnQodXQpfSxvblBhbm1vdmUodXQpe3V0LnN0b3BQcm9wYWdhdGlvbigpLCRlJiYkZS50b3VjaG1vdmUodXQpfSxvblBhbmVuZCh1dCl7JGUmJiRlLnRvdWNoZW5kKHV0KSwkZT1udWxsfX0sSnQ9dXQ9PntNZS5wdXNoKHV0KX0sZ3Q9dXQ9PntsZXQgTnQ9TWUuaW5kZXhPZih1dCk7TnQ+PTAmJk1lLnNwbGljZShOdCwxKX07cmV0dXJuIEEucHJvdmlkZSgiX2lzTW91bnRlZCIscGUpLEEucHJvdmlkZSgicGFyZW50U2l6ZSIse3dpZHRoOnEsaGVpZ2h0OlcsdG9wOmVlLGxlZnQ6cmV9KSxBLnByb3ZpZGUoImFkZE1vdmFibGVWaWV3Q29udGV4dCIsSnQpLEEucHJvdmlkZSgicmVtb3ZlTW92YWJsZVZpZXdDb250ZXh0IixndCksQS5wcm92aWRlKCJzZXRUb3VjaE1vdmFibGVWaWV3Q29udGV4dCIsQWUpLCgpPT57bGV0IHV0PUYuZGVmYXVsdCYmRi5kZWZhdWx0KCksTnQ9U28odXQpO3JldHVybiBBLmNyZWF0ZVZOb2RlKCJ2aWV3IixBLm1lcmdlUHJvcHMoe3JlZjpDZSxjbGFzczoidW5pLW1vdmFibGUtYXJlYSJ9LHZ0KSxbTnRdKX19fSk7ZnVuY3Rpb24gbmkoXyl7bGV0IEY9e307ZnVuY3Rpb24gcShBZSxrZSl7RltBZV0mJkZbQWVdKGtlKX1mdW5jdGlvbiBXKEFlLGtlKXtGW0FlXT1mdW5jdGlvbihxZSl7c2UuaXNGdW5jdGlvbihrZSkmJihxZS50b3VjaGVzPXFlLmNoYW5nZWRUb3VjaGVzLGtlKHFlKT09PSExJiZxZS5zdG9wUHJvcGFnYXRpb24oKSl9fWxldCBlZT0wLHJlPTAscGU9MCxDZT0wLE1lPWZ1bmN0aW9uKEFlLGtlLHFlLHZ0KXtpZihfKHt0YXJnZXQ6QWUudGFyZ2V0LGN1cnJlbnRUYXJnZXQ6QWUuY3VycmVudFRhcmdldCxzdG9wUHJvcGFnYXRpb246QWUuc3RvcFByb3BhZ2F0aW9uLmJpbmQoQWUpLHRvdWNoZXM6QWUudG91Y2hlcyxjaGFuZ2VkVG91Y2hlczpBZS5jaGFuZ2VkVG91Y2hlcyxkZXRhaWw6e3N0YXRlOmtlLHg6cWUseTp2dCxkeDpxZS1lZSxkeTp2dC1yZSxkZHg6cWUtcGUsZGR5OnZ0LUNlLHRpbWVTdGFtcDpBZS50aW1lU3RhbXB8fERhdGUubm93KCl9fSk9PT0hMSlyZXR1cm4hMX0sJGU9bnVsbDtyZXR1cm4gVygidG91Y2hzdGFydCIsZnVuY3Rpb24oQWUpe2lmKCEkZSlyZXR1cm4gJGU9QWUsZWU9cGU9QWUudG91Y2hlc1swXS5wYWdlWCxyZT1DZT1BZS50b3VjaGVzWzBdLnBhZ2VZLE1lKEFlLCJzdGFydCIsZWUscmUpfSksVygidG91Y2htb3ZlIixmdW5jdGlvbihBZSl7aWYoJGUpe2xldCBrZT1NZShBZSwibW92ZSIsQWUudG91Y2hlc1swXS5wYWdlWCxBZS50b3VjaGVzWzBdLnBhZ2VZKTtyZXR1cm4gcGU9QWUudG91Y2hlc1swXS5wYWdlWCxDZT1BZS50b3VjaGVzWzBdLnBhZ2VZLGtlfX0pLFcoInRvdWNoZW5kIixmdW5jdGlvbihBZSl7aWYoJGUpcmV0dXJuICRlPW51bGwsTWUoQWUsImVuZCIsQWUuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVgsQWUuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVkpfSkse3RvdWNoc3RhcnQ6ZnVuY3Rpb24oQWUpe3EoInRvdWNoc3RhcnQiLEFlKX0sdG91Y2htb3ZlOmZ1bmN0aW9uKEFlKXtxKCJ0b3VjaG1vdmUiLEFlKX0sdG91Y2hlbmQ6ZnVuY3Rpb24oQWUpe3EoInRvdWNoZW5kIixBZSl9fX1mdW5jdGlvbiBzcihfLEYpe3JldHVybihxLFcpPT57Xy52YWx1ZSYmRihxLGdpKHEsXy52YWx1ZSxXfHx7fSkpfX1mdW5jdGlvbiBnaShfLEYscT17fSl7cmV0dXJuIEY9bWkoRikse3R5cGU6Xyx0aW1lU3RhbXA6RGF0ZS5ub3coKSx0YXJnZXQ6RixjdXJyZW50VGFyZ2V0OkYsZGV0YWlsOnF9fWxldCB2aT1Fbi5jYWNoZVN0cmluZ0Z1bmN0aW9uKF89Pl8uY2hhckF0KDApLnRvTG93ZXJDYXNlKCkrXy5zbGljZSgxKSk7ZnVuY3Rpb24gbWkoXyl7bGV0e29mZnNldExlZnQ6RixvZmZzZXRUb3A6cX09XyxXPV8uYXR0cixlZT17fTtyZXR1cm4gT2JqZWN0LmtleXMoV3x8e30pLmZvckVhY2gocmU9PntyZS5pbmRleE9mKCJkYXRhIik9PT0wJiYoZWVbdmkocmUucmVwbGFjZSgiZGF0YSIsIiIpKV09V1tyZV0pfSkse2lkOlcmJlcuaWR8fCIiLGRhdGFzZXQ6ZWUsb2Zmc2V0TGVmdDpGfHwwLG9mZnNldFRvcDpxfHwwfX1mdW5jdGlvbiBFcihfLEYscSl7cmV0dXJuIF8+Ri1xJiZfPEYrcX1mdW5jdGlvbiBQcihfLEYpe3JldHVybiBFcihfLDAsRil9ZnVuY3Rpb24gV3IoKXt9V3IucHJvdG90eXBlLng9ZnVuY3Rpb24oXyl7cmV0dXJuIE1hdGguc3FydChfKX07ZnVuY3Rpb24gR3IoXyxGKXt0aGlzLl9tPV8sdGhpcy5fZj0xZTMqRix0aGlzLl9zdGFydFRpbWU9MCx0aGlzLl92PTB9R3IucHJvdG90eXBlLnNldFY9ZnVuY3Rpb24oXyxGKXtsZXQgcT1NYXRoLnBvdyhNYXRoLnBvdyhfLDIpK01hdGgucG93KEYsMiksLjUpO3RoaXMuX3hfdj1fLHRoaXMuX3lfdj1GLHRoaXMuX3hfYT0tdGhpcy5fZip0aGlzLl94X3YvcSx0aGlzLl95X2E9LXRoaXMuX2YqdGhpcy5feV92L3EsdGhpcy5fdD1NYXRoLmFicyhfL3RoaXMuX3hfYSl8fE1hdGguYWJzKEYvdGhpcy5feV9hKSx0aGlzLl9sYXN0RHQ9bnVsbCx0aGlzLl9zdGFydFRpbWU9bmV3IERhdGUoKS5nZXRUaW1lKCl9LEdyLnByb3RvdHlwZS5zZXRTPWZ1bmN0aW9uKF8sRil7dGhpcy5feF9zPV8sdGhpcy5feV9zPUZ9LEdyLnByb3RvdHlwZS5zPWZ1bmN0aW9uKF8pe189PT12b2lkIDAmJihfPShuZXcgRGF0ZSgpLmdldFRpbWUoKS10aGlzLl9zdGFydFRpbWUpLzFlMyksXz50aGlzLl90JiYoXz10aGlzLl90LHRoaXMuX2xhc3REdD1fKTtsZXQgRj10aGlzLl94X3YqXysuNSp0aGlzLl94X2EqTWF0aC5wb3coXywyKSt0aGlzLl94X3MscT10aGlzLl95X3YqXysuNSp0aGlzLl95X2EqTWF0aC5wb3coXywyKSt0aGlzLl95X3M7cmV0dXJuKHRoaXMuX3hfYT4wJiZGPHRoaXMuX2VuZFBvc2l0aW9uWHx8dGhpcy5feF9hPDAmJkY+dGhpcy5fZW5kUG9zaXRpb25YKSYmKEY9dGhpcy5fZW5kUG9zaXRpb25YKSwodGhpcy5feV9hPjAmJnE8dGhpcy5fZW5kUG9zaXRpb25ZfHx0aGlzLl95X2E8MCYmcT50aGlzLl9lbmRQb3NpdGlvblkpJiYocT10aGlzLl9lbmRQb3NpdGlvblkpLHt4OkYseTpxfX0sR3IucHJvdG90eXBlLmRzPWZ1bmN0aW9uKF8pe3JldHVybiBfPT09dm9pZCAwJiYoXz0obmV3IERhdGUoKS5nZXRUaW1lKCktdGhpcy5fc3RhcnRUaW1lKS8xZTMpLF8+dGhpcy5fdCYmKF89dGhpcy5fdCkse2R4OnRoaXMuX3hfdit0aGlzLl94X2EqXyxkeTp0aGlzLl95X3YrdGhpcy5feV9hKl99fSxHci5wcm90b3R5cGUuZGVsdGE9ZnVuY3Rpb24oKXtyZXR1cm57eDotMS41Kk1hdGgucG93KHRoaXMuX3hfdiwyKS90aGlzLl94X2F8fDAseTotMS41Kk1hdGgucG93KHRoaXMuX3lfdiwyKS90aGlzLl95X2F8fDB9fSxHci5wcm90b3R5cGUuZHQ9ZnVuY3Rpb24oKXtyZXR1cm4tdGhpcy5feF92L3RoaXMuX3hfYX0sR3IucHJvdG90eXBlLmRvbmU9ZnVuY3Rpb24oKXtsZXQgXz1Fcih0aGlzLnMoKS54LHRoaXMuX2VuZFBvc2l0aW9uWCl8fEVyKHRoaXMucygpLnksdGhpcy5fZW5kUG9zaXRpb25ZKXx8dGhpcy5fbGFzdER0PT09dGhpcy5fdDtyZXR1cm4gdGhpcy5fbGFzdER0PW51bGwsX30sR3IucHJvdG90eXBlLnNldEVuZD1mdW5jdGlvbihfLEYpe3RoaXMuX2VuZFBvc2l0aW9uWD1fLHRoaXMuX2VuZFBvc2l0aW9uWT1GfSxHci5wcm90b3R5cGUucmVjb25maWd1cmU9ZnVuY3Rpb24oXyxGKXt0aGlzLl9tPV8sdGhpcy5fZj0xZTMqRn07ZnVuY3Rpb24gZXIoXyxGLHEpe3RoaXMuX209Xyx0aGlzLl9rPUYsdGhpcy5fYz1xLHRoaXMuX3NvbHV0aW9uPW51bGwsdGhpcy5fZW5kUG9zaXRpb249MCx0aGlzLl9zdGFydFRpbWU9MH1lci5wcm90b3R5cGUuX3NvbHZlPWZ1bmN0aW9uKF8sRil7bGV0IHE9dGhpcy5fYyxXPXRoaXMuX20sZWU9dGhpcy5fayxyZT1xKnEtNCpXKmVlO2lmKHJlPT09MCl7bGV0IEFlPS1xLygyKlcpLGtlPV8scWU9Ri8oQWUqXyk7cmV0dXJue3g6ZnVuY3Rpb24odnQpe3JldHVybihrZStxZSp2dCkqTWF0aC5wb3coTWF0aC5FLEFlKnZ0KX0sZHg6ZnVuY3Rpb24odnQpe2xldCBKdD1NYXRoLnBvdyhNYXRoLkUsQWUqdnQpO3JldHVybiBBZSooa2UrcWUqdnQpKkp0K3FlKkp0fX19aWYocmU+MCl7bGV0IEFlPSgtcS1NYXRoLnNxcnQocmUpKS8oMipXKSxrZT0oLXErTWF0aC5zcXJ0KHJlKSkvKDIqVykscWU9KEYtQWUqXykvKGtlLUFlKSx2dD1fLXFlO3JldHVybnt4OmZ1bmN0aW9uKEp0KXtsZXQgZ3QsdXQ7cmV0dXJuIEp0PT09dGhpcy5fdCYmKGd0PXRoaXMuX3Bvd0VSMVQsdXQ9dGhpcy5fcG93RVIyVCksdGhpcy5fdD1KdCxndHx8KGd0PXRoaXMuX3Bvd0VSMVQ9TWF0aC5wb3coTWF0aC5FLEFlKkp0KSksdXR8fCh1dD10aGlzLl9wb3dFUjJUPU1hdGgucG93KE1hdGguRSxrZSpKdCkpLHZ0Kmd0K3FlKnV0fSxkeDpmdW5jdGlvbihKdCl7bGV0IGd0LHV0O3JldHVybiBKdD09PXRoaXMuX3QmJihndD10aGlzLl9wb3dFUjFULHV0PXRoaXMuX3Bvd0VSMlQpLHRoaXMuX3Q9SnQsZ3R8fChndD10aGlzLl9wb3dFUjFUPU1hdGgucG93KE1hdGguRSxBZSpKdCkpLHV0fHwodXQ9dGhpcy5fcG93RVIyVD1NYXRoLnBvdyhNYXRoLkUsa2UqSnQpKSx2dCpBZSpndCtxZSprZSp1dH19fWxldCBwZT1NYXRoLnNxcnQoNCpXKmVlLXEqcSkvKDIqVyksQ2U9LXEvMipXLE1lPV8sJGU9KEYtQ2UqXykvcGU7cmV0dXJue3g6ZnVuY3Rpb24oQWUpe3JldHVybiBNYXRoLnBvdyhNYXRoLkUsQ2UqQWUpKihNZSpNYXRoLmNvcyhwZSpBZSkrJGUqTWF0aC5zaW4ocGUqQWUpKX0sZHg6ZnVuY3Rpb24oQWUpe2xldCBrZT1NYXRoLnBvdyhNYXRoLkUsQ2UqQWUpLHFlPU1hdGguY29zKHBlKkFlKSx2dD1NYXRoLnNpbihwZSpBZSk7cmV0dXJuIGtlKigkZSpwZSpxZS1NZSpwZSp2dCkrQ2Uqa2UqKCRlKnZ0K01lKnFlKX19fSxlci5wcm90b3R5cGUueD1mdW5jdGlvbihfKXtyZXR1cm4gXz09PXZvaWQgMCYmKF89KG5ldyBEYXRlKCkuZ2V0VGltZSgpLXRoaXMuX3N0YXJ0VGltZSkvMWUzKSx0aGlzLl9zb2x1dGlvbj90aGlzLl9lbmRQb3NpdGlvbit0aGlzLl9zb2x1dGlvbi54KF8pOjB9LGVyLnByb3RvdHlwZS5keD1mdW5jdGlvbihfKXtyZXR1cm4gXz09PXZvaWQgMCYmKF89KG5ldyBEYXRlKCkuZ2V0VGltZSgpLXRoaXMuX3N0YXJ0VGltZSkvMWUzKSx0aGlzLl9zb2x1dGlvbj90aGlzLl9zb2x1dGlvbi5keChfKTowfSxlci5wcm90b3R5cGUuc2V0RW5kPWZ1bmN0aW9uKF8sRixxKXtpZihxfHwocT1uZXcgRGF0ZSgpLmdldFRpbWUoKSksXyE9PXRoaXMuX2VuZFBvc2l0aW9ufHwhUHIoRiwuMSkpe0Y9Rnx8MDtsZXQgVz10aGlzLl9lbmRQb3NpdGlvbjt0aGlzLl9zb2x1dGlvbiYmKFByKEYsLjEpJiYoRj10aGlzLl9zb2x1dGlvbi5keCgocS10aGlzLl9zdGFydFRpbWUpLzFlMykpLFc9dGhpcy5fc29sdXRpb24ueCgocS10aGlzLl9zdGFydFRpbWUpLzFlMyksUHIoRiwuMSkmJihGPTApLFByKFcsLjEpJiYoVz0wKSxXKz10aGlzLl9lbmRQb3NpdGlvbiksdGhpcy5fc29sdXRpb24mJlByKFctXywuMSkmJlByKEYsLjEpfHwodGhpcy5fZW5kUG9zaXRpb249Xyx0aGlzLl9zb2x1dGlvbj10aGlzLl9zb2x2ZShXLXRoaXMuX2VuZFBvc2l0aW9uLEYpLHRoaXMuX3N0YXJ0VGltZT1xKX19LGVyLnByb3RvdHlwZS5zbmFwPWZ1bmN0aW9uKF8pe3RoaXMuX3N0YXJ0VGltZT1uZXcgRGF0ZSgpLmdldFRpbWUoKSx0aGlzLl9lbmRQb3NpdGlvbj1fLHRoaXMuX3NvbHV0aW9uPXt4OmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGR4OmZ1bmN0aW9uKCl7cmV0dXJuIDB9fX0sZXIucHJvdG90eXBlLmRvbmU9ZnVuY3Rpb24oXyl7cmV0dXJuIF98fChfPW5ldyBEYXRlKCkuZ2V0VGltZSgpKSxFcih0aGlzLngoKSx0aGlzLl9lbmRQb3NpdGlvbiwuMSkmJlByKHRoaXMuZHgoKSwuMSl9LGVyLnByb3RvdHlwZS5yZWNvbmZpZ3VyZT1mdW5jdGlvbihfLEYscSl7dGhpcy5fbT1fLHRoaXMuX2s9Rix0aGlzLl9jPXEsdGhpcy5kb25lKCl8fCh0aGlzLl9zb2x1dGlvbj10aGlzLl9zb2x2ZSh0aGlzLngoKS10aGlzLl9lbmRQb3NpdGlvbix0aGlzLmR4KCkpLHRoaXMuX3N0YXJ0VGltZT1uZXcgRGF0ZSgpLmdldFRpbWUoKSl9LGVyLnByb3RvdHlwZS5zcHJpbmdDb25zdGFudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9rfSxlci5wcm90b3R5cGUuZGFtcGluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jfSxlci5wcm90b3R5cGUuY29uZmlndXJhdGlvbj1mdW5jdGlvbigpe2Z1bmN0aW9uIF8ocSxXKXtxLnJlY29uZmlndXJlKDEsVyxxLmRhbXBpbmcoKSl9ZnVuY3Rpb24gRihxLFcpe3EucmVjb25maWd1cmUoMSxxLnNwcmluZ0NvbnN0YW50KCksVyl9cmV0dXJuW3tsYWJlbDoiU3ByaW5nIENvbnN0YW50IixyZWFkOnRoaXMuc3ByaW5nQ29uc3RhbnQuYmluZCh0aGlzKSx3cml0ZTpfLmJpbmQodGhpcyx0aGlzKSxtaW46MTAwLG1heDoxZTN9LHtsYWJlbDoiRGFtcGluZyIscmVhZDp0aGlzLmRhbXBpbmcuYmluZCh0aGlzKSx3cml0ZTpGLmJpbmQodGhpcyx0aGlzKSxtaW46MSxtYXg6NTAwfV19O2Z1bmN0aW9uIEtpKF8sRixxKXt0aGlzLl9zcHJpbmdYPW5ldyBlcihfLEYscSksdGhpcy5fc3ByaW5nWT1uZXcgZXIoXyxGLHEpLHRoaXMuX3NwcmluZ1NjYWxlPW5ldyBlcihfLEYscSksdGhpcy5fc3RhcnRUaW1lPTB9S2kucHJvdG90eXBlLnNldEVuZD1mdW5jdGlvbihfLEYscSxXKXtsZXQgZWU9bmV3IERhdGUoKS5nZXRUaW1lKCk7dGhpcy5fc3ByaW5nWC5zZXRFbmQoXyxXLGVlKSx0aGlzLl9zcHJpbmdZLnNldEVuZChGLFcsZWUpLHRoaXMuX3NwcmluZ1NjYWxlLnNldEVuZChxLFcsZWUpLHRoaXMuX3N0YXJ0VGltZT1lZX0sS2kucHJvdG90eXBlLng9ZnVuY3Rpb24oKXtsZXQgXz0obmV3IERhdGUoKS5nZXRUaW1lKCktdGhpcy5fc3RhcnRUaW1lKS8xZTM7cmV0dXJue3g6dGhpcy5fc3ByaW5nWC54KF8pLHk6dGhpcy5fc3ByaW5nWS54KF8pLHNjYWxlOnRoaXMuX3NwcmluZ1NjYWxlLngoXyl9fSxLaS5wcm90b3R5cGUuZG9uZT1mdW5jdGlvbigpe2xldCBfPW5ldyBEYXRlKCkuZ2V0VGltZSgpO3JldHVybiB0aGlzLl9zcHJpbmdYLmRvbmUoXykmJnRoaXMuX3NwcmluZ1kuZG9uZShfKSYmdGhpcy5fc3ByaW5nU2NhbGUuZG9uZShfKX0sS2kucHJvdG90eXBlLnJlY29uZmlndXJlPWZ1bmN0aW9uKF8sRixxKXt0aGlzLl9zcHJpbmdYLnJlY29uZmlndXJlKF8sRixxKSx0aGlzLl9zcHJpbmdZLnJlY29uZmlndXJlKF8sRixxKSx0aGlzLl9zcHJpbmdTY2FsZS5yZWNvbmZpZ3VyZShfLEYscSl9O2xldCBKaT17ZGlyZWN0aW9uOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJub25lIn0saW5lcnRpYTp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LG91dE9mQm91bmRzOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0seDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDowfSx5Ont0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjB9LGRhbXBpbmc6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MjB9LGZyaWN0aW9uOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjJ9LGRpc2FibGVkOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sc2NhbGU6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxzY2FsZU1pbjp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDouNX0sc2NhbGVNYXg6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MTB9LHNjYWxlVmFsdWU6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MX0sYW5pbWF0aW9uOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMH19O2Z1bmN0aW9uIHVvKF8sRil7cmV0dXJuKygoMWUzKl8tMWUzKkYpLzFlMykudG9GaXhlZCgxKX1mdW5jdGlvbiBfaShfLEYscSl7bGV0IFc9e2lkOjAsY2FuY2VsbGVkOiExfSxlZT1mdW5jdGlvbihwZSl7cGUmJnBlLmlkJiZIbyhwZS5pZCkscGUmJihwZS5jYW5jZWxsZWQ9ITApfTtmdW5jdGlvbiByZShwZSxDZSxNZSwkZSl7aWYoIXBlfHwhcGUuY2FuY2VsbGVkKXtNZShDZSk7bGV0IEFlPUNlLmRvbmUoKTtBZXx8cGUuY2FuY2VsbGVkfHwocGUuaWQ9X2EocmUuYmluZChudWxsLHBlLENlLE1lLCRlKSkpLEFlJiYkZSYmJGUoQ2UpfX1yZXR1cm4gcmUoVyxfLEYscSkse2NhbmNlbDplZS5iaW5kKG51bGwsVyksbW9kZWw6X319bGV0IEFvPSExO2Z1bmN0aW9uIFVvKF8pe0FvfHwoQW89ITAsX2EoZnVuY3Rpb24oKXtfKCksQW89ITF9KSl9ZnVuY3Rpb24gX2EoXyl7cmV0dXJuIHYoXywxNil9ZnVuY3Rpb24gSG8oXyl7YyhfKX1sZXQgWmk9Qy5yZXF1aXJlTW9kdWxlKCJhbmltYXRpb24iKTt2YXIgd249QS5kZWZpbmVDb21wb25lbnQoe25hbWU6Ik1vdmFibGVWaWV3Iixwcm9wczpKaSxlbWl0czpbImNoYW5nZSIsInNjYWxlIl0sc3R5bGVzOlt7InVuaS1tb3ZhYmxlLXZpZXciOnsiIjp7cG9zaXRpb246ImFic29sdXRlIix0b3A6IjBweCIsbGVmdDoiMHB4Iix3aWR0aDoiMTBweCIsaGVpZ2h0OiIxMHB4In19fV0sc2V0dXAoXyx7ZW1pdDpGLHNsb3RzOnF9KXtsZXQgVz1BLnJlZihudWxsKSxlZT1zcihXLEYpLHJlPUEuaW5qZWN0KCJzZXRUb3VjaE1vdmFibGVWaWV3Q29udGV4dCIsKCk9Pnt9KSxwZT1TbihfLGVlLFcscmUpO3JldHVybigpPT57bGV0IENlPXtwcmV2ZW50R2VzdHVyZTohMH07cmV0dXJuIEEuY3JlYXRlVk5vZGUoInZpZXciLEEubWVyZ2VQcm9wcyh7cmVmOlcsb25Ub3VjaHN0YXJ0OnBlLGNsYXNzOiJ1bmktbW92YWJsZS12aWV3IixzdHlsZToidHJhbnNmb3JtLW9yaWdpbjogY2VudGVyOyJ9LENlKSxbcS5kZWZhdWx0JiZxLmRlZmF1bHQoKV0pfX19KTtmdW5jdGlvbiBTbihfLEYscSxXKXtsZXQgZWU9QS5pbmplY3QoIl9pc01vdW50ZWQiLEEucmVmKCExKSkscmU9QS5pbmplY3QoInBhcmVudFNpemUiLHt3aWR0aDpBLnJlZigwKSxoZWlnaHQ6QS5yZWYoMCksdG9wOkEucmVmKDApLGxlZnQ6QS5yZWYoMCl9KSxwZT1BLmluamVjdCgiYWRkTW92YWJsZVZpZXdDb250ZXh0IiwoKT0+e30pLENlPUEuaW5qZWN0KCJyZW1vdmVNb3ZhYmxlVmlld0NvbnRleHQiLCgpPT57fSksTWU9e3RvdWNoc3RhcnQ6KCk9Pnt9LHRvdWNobW92ZTooKT0+e30sdG91Y2hlbmQ6KCk9Pnt9fTtmdW5jdGlvbiAkZShVZSl7cmV0dXJuIE51bWJlcihVZSl8fDB9ZnVuY3Rpb24gQWUoVWUpe3JldHVybiBVZT1OdW1iZXIoVWUpLGlzTmFOKFVlKT8xOlVlfWxldCBrZT1BLnJlZigkZShfLngpKSxxZT1BLnJlZigkZShfLnkpKSx2dD1BLnJlZihBZShOdW1iZXIoXy5zY2FsZVZhbHVlKSkpLEp0PUEucmVmKDApLGd0PUEucmVmKDApLHV0PUEucmVmKDApLE50PUEucmVmKDApLHBuPUEucmVmKDApLFN0PUEucmVmKDApLGh0PW51bGwsTHQ9bnVsbCxSbj17eDowLHk6MH0seG49e3g6MCx5OjB9LEJuPTEsTG49MCxZdD0wLEtuPSExLHphLFdhLHhvPW51bGwsR2E9bnVsbCxCbz17dG9wOjAsbGVmdDowLHdpZHRoOjAsaGVpZ2h0OjB9LFlhPW5ldyBXcixCcz1uZXcgV3IsQW49e2hpc3RvcnlYOlswLDBdLGhpc3RvcnlZOlswLDBdLGhpc3RvcnlUOlswLDBdfSxZbz1BLmNvbXB1dGVkKCgpPT57bGV0IFVlPU51bWJlcihfLmRhbXBpbmcpO3JldHVybiBpc05hTihVZSk/MjA6VWV9KSxxbz1BLmNvbXB1dGVkKCgpPT57bGV0IFVlPU51bWJlcihfLmZyaWN0aW9uKTtyZXR1cm4gaXNOYU4oVWUpfHxVZTw9MD8yOlVlfSkscWE9QS5jb21wdXRlZCgoKT0+e2xldCBVZT1OdW1iZXIoXy5zY2FsZU1pbik7cmV0dXJuIGlzTmFOKFVlKT8uNTpVZX0pLE1zPUEuY29tcHV0ZWQoKCk9PntsZXQgVWU9TnVtYmVyKF8uc2NhbGVNYXgpO3JldHVybiBpc05hTihVZSk/MTA6VWV9KSxLYT1BLmNvbXB1dGVkKCgpPT5fLmRpcmVjdGlvbj09PSJhbGwifHxfLmRpcmVjdGlvbj09PSJob3Jpem9udGFsIiksRGk9QS5jb21wdXRlZCgoKT0+Xy5kaXJlY3Rpb249PT0iYWxsInx8Xy5kaXJlY3Rpb249PT0idmVydGljYWwiKSx1cj1uZXcgS2koMSw5Kk1hdGgucG93KFlvLnZhbHVlLDIpLzQwLFlvLnZhbHVlKSxPbj1uZXcgR3IoMSxxby52YWx1ZSk7QS53YXRjaCgoKT0+Xy54LFVlPT57a2UudmFsdWU9JGUoVWUpfSksQS53YXRjaCgoKT0+Xy55LFVlPT57cWUudmFsdWU9JGUoVWUpfSksQS53YXRjaCgoKT0+Xy5zY2FsZVZhbHVlLFVlPT57dnQudmFsdWU9QWUoTnVtYmVyKFVlKSl9KSxBLndhdGNoKGtlLEphKSxBLndhdGNoKHFlLEFhKSxBLndhdGNoKHZ0LCRyKSxBLndhdGNoKHFhLHdpKSxBLndhdGNoKE1zLHdpKTtmdW5jdGlvbiBybygpe0x0JiZMdC5jYW5jZWwoKSxodCYmaHQuY2FuY2VsKCl9ZnVuY3Rpb24gSmEoVWUpe2lmKEthLnZhbHVlKXtpZihVZSt4bi54PT09TG4pcmV0dXJuIExuO2h0JiZodC5jYW5jZWwoKSxNbyhVZSt4bi54LHFlLnZhbHVlK3huLnksQm4pfXJldHVybiBVZX1mdW5jdGlvbiBBYShVZSl7aWYoRGkudmFsdWUpe2lmKFVlK3huLnk9PT1ZdClyZXR1cm4gWXQ7aHQmJmh0LmNhbmNlbCgpLE1vKGtlLnZhbHVlK3huLngsVWUreG4ueSxCbil9cmV0dXJuIFVlfWZ1bmN0aW9uIHdpKCl7aWYoIV8uc2NhbGUpcmV0dXJuITE7dm8oQm4sITApfWZ1bmN0aW9uICRyKFVlKXtyZXR1cm4gXy5zY2FsZT8oVWU9YWkoVWUpLHZvKFVlLCEwKSxVZSk6ITF9ZnVuY3Rpb24gU3IoKXtfLmRpc2FibGVkfHwocm8oKSxBbi5oaXN0b3J5WD1bMCwwXSxBbi5oaXN0b3J5WT1bMCwwXSxBbi5oaXN0b3J5VD1bMCwwXSxLYS52YWx1ZSYmKHphPUxuKSxEaS52YWx1ZSYmKFdhPVl0KSx4bz1udWxsLEdhPW51bGwsS249ITApfWZ1bmN0aW9uIEZpKFVlKXtpZighXy5kaXNhYmxlZCYmS24pe2xldCBJdD1MbixCdD1ZdDtpZihHYT09PW51bGwmJihHYT1NYXRoLmFicyhVZS5kZXRhaWwuZHgvVWUuZGV0YWlsLmR5KT4xPyJodG91Y2htb3ZlIjoidnRvdWNobW92ZSIpLEthLnZhbHVlJiYoSXQ9VWUuZGV0YWlsLmR4K3phLEFuLmhpc3RvcnlYLnNoaWZ0KCksQW4uaGlzdG9yeVgucHVzaChJdCksIURpLnZhbHVlJiZ4bz09PW51bGwmJih4bz1NYXRoLmFicyhVZS5kZXRhaWwuZHgvVWUuZGV0YWlsLmR5KTwxKSksRGkudmFsdWUmJihCdD1VZS5kZXRhaWwuZHkrV2EsQW4uaGlzdG9yeVkuc2hpZnQoKSxBbi5oaXN0b3J5WS5wdXNoKEJ0KSwhS2EudmFsdWUmJnhvPT09bnVsbCYmKHhvPU1hdGguYWJzKFVlLmRldGFpbC5keS9VZS5kZXRhaWwuZHgpPDEpKSxBbi5oaXN0b3J5VC5zaGlmdCgpLEFuLmhpc3RvcnlULnB1c2goVWUuZGV0YWlsLnRpbWVTdGFtcCksIXhvKXtsZXQgSHQ9InRvdWNoIjtJdDx1dC52YWx1ZT9fLm91dE9mQm91bmRzPyhIdD0idG91Y2gtb3V0LW9mLWJvdW5kcyIsSXQ9dXQudmFsdWUtWWEueCh1dC52YWx1ZS1JdCkpOkl0PXV0LnZhbHVlOkl0PnBuLnZhbHVlJiYoXy5vdXRPZkJvdW5kcz8oSHQ9InRvdWNoLW91dC1vZi1ib3VuZHMiLEl0PXBuLnZhbHVlK1lhLngoSXQtcG4udmFsdWUpKTpJdD1wbi52YWx1ZSksQnQ8TnQudmFsdWU/Xy5vdXRPZkJvdW5kcz8oSHQ9InRvdWNoLW91dC1vZi1ib3VuZHMiLEJ0PU50LnZhbHVlLUJzLngoTnQudmFsdWUtQnQpKTpCdD1OdC52YWx1ZTpCdD5TdC52YWx1ZSYmKF8ub3V0T2ZCb3VuZHM/KEh0PSJ0b3VjaC1vdXQtb2YtYm91bmRzIixCdD1TdC52YWx1ZStCcy54KEJ0LVN0LnZhbHVlKSk6QnQ9U3QudmFsdWUpLFVvKGZ1bmN0aW9uKCl7Q2koSXQsQnQsQm4sSHQpfSl9fX1mdW5jdGlvbiBkcygpe2lmKCFfLmRpc2FibGVkJiZLbiYmKEtuPSExLCF4byYmIVphKCJvdXQtb2YtYm91bmRzIikmJl8uaW5lcnRpYSkpe2xldCBVZT0xZTMqKEFuLmhpc3RvcnlYWzFdLUFuLmhpc3RvcnlYWzBdKS8oQW4uaGlzdG9yeVRbMV0tQW4uaGlzdG9yeVRbMF0pLEl0PTFlMyooQW4uaGlzdG9yeVlbMV0tQW4uaGlzdG9yeVlbMF0pLyhBbi5oaXN0b3J5VFsxXS1Bbi5oaXN0b3J5VFswXSk7T24uc2V0VihVZSxJdCksT24uc2V0UyhMbixZdCk7bGV0IEJ0PU9uLmRlbHRhKCkueCxIdD1Pbi5kZWx0YSgpLnksanQ9QnQrTG4saXQ9SHQrWXQ7anQ8dXQudmFsdWU/KGp0PXV0LnZhbHVlLGl0PVl0Kyh1dC52YWx1ZS1MbikqSHQvQnQpOmp0PnBuLnZhbHVlJiYoanQ9cG4udmFsdWUsaXQ9WXQrKHBuLnZhbHVlLUxuKSpIdC9CdCksaXQ8TnQudmFsdWU/KGl0PU50LnZhbHVlLGp0PUxuKyhOdC52YWx1ZS1ZdCkqQnQvSHQpOml0PlN0LnZhbHVlJiYoaXQ9U3QudmFsdWUsanQ9TG4rKFN0LnZhbHVlLVl0KSpCdC9IdCksT24uc2V0RW5kKGp0LGl0KSxMdD1faShPbixmdW5jdGlvbigpe2xldCBmbj1Pbi5zKCksQnI9Zm4ueCxycj1mbi55O0NpKEJyLHJyLEJuLCJmcmljdGlvbiIpfSxmdW5jdGlvbigpe0x0LmNhbmNlbCgpfSl9fWZ1bmN0aW9uIGpuKFVlLEl0KXtsZXQgQnQ9ITE7cmV0dXJuIFVlPnBuLnZhbHVlPyhVZT1wbi52YWx1ZSxCdD0hMCk6VWU8dXQudmFsdWUmJihVZT11dC52YWx1ZSxCdD0hMCksSXQ+U3QudmFsdWU/KEl0PVN0LnZhbHVlLEJ0PSEwKTpJdDxOdC52YWx1ZSYmKEl0PU50LnZhbHVlLEJ0PSEwKSx7eDpVZSx5Okl0LG91dE9mQm91bmRzOkJ0fX1mdW5jdGlvbiBDcigpe1JuLng9Qm8ubGVmdC1yZS5sZWZ0LnZhbHVlLFJuLnk9Qm8udG9wLXJlLnRvcC52YWx1ZX1mdW5jdGlvbiBocyhVZSl7VWU9VWV8fEJuLFVlPWFpKFVlKSxndC52YWx1ZT1Cby5oZWlnaHQvQm4sSnQudmFsdWU9Qm8ud2lkdGgvQm47bGV0IEl0PWd0LnZhbHVlKlVlLEJ0PUp0LnZhbHVlKlVlO3huLng9KEJ0LUp0LnZhbHVlKS8yLHhuLnk9KEl0LWd0LnZhbHVlKS8yfWZ1bmN0aW9uIFNpKCl7bGV0IFVlPTAtUm4ueCt4bi54LEl0PXJlLndpZHRoLnZhbHVlLUp0LnZhbHVlLVJuLngteG4ueDt1dC52YWx1ZT1NYXRoLm1pbihVZSxJdCkscG4udmFsdWU9TWF0aC5tYXgoVWUsSXQpO2xldCBCdD0wLVJuLnkreG4ueSxIdD1yZS5oZWlnaHQudmFsdWUtZ3QudmFsdWUtUm4ueS14bi55O050LnZhbHVlPU1hdGgubWluKEJ0LEh0KSxTdC52YWx1ZT1NYXRoLm1heChCdCxIdCl9ZnVuY3Rpb24gdm8oVWUsSXQpe2lmKF8uc2NhbGUpe1VlPWFpKFVlKSxocyhVZSksU2koKTtsZXQgQnQ9am4oTG4sWXQpLEh0PUJ0LngsanQ9QnQueTtJdD9NbyhIdCxqdCxVZSwiIiwhMCwhMCk6VW8oZnVuY3Rpb24oKXtDaShIdCxqdCxVZSwiIiwhMCwhMCl9KX19ZnVuY3Rpb24gYWkoVWUpe3JldHVybiBVZT1NYXRoLm1heCguNSxxYS52YWx1ZSxVZSksVWU9TWF0aC5taW4oMTAsTXMudmFsdWUsVWUpLFVlfWZ1bmN0aW9uIE1vKFVlLEl0LEJ0LEh0LGp0LGl0KXtybygpLEthLnZhbHVlfHwoVWU9TG4pLERpLnZhbHVlfHwoSXQ9WXQpLF8uc2NhbGV8fChCdD1Cbik7bGV0IGZuPWpuKFVlLEl0KTtpZihVZT1mbi54LEl0PWZuLnksIV8uYW5pbWF0aW9uKXtDaShVZSxJdCxCdCxIdCxqdCxpdCk7cmV0dXJufXVyLl9zcHJpbmdYLl9zb2x1dGlvbj1udWxsLHVyLl9zcHJpbmdZLl9zb2x1dGlvbj1udWxsLHVyLl9zcHJpbmdTY2FsZS5fc29sdXRpb249bnVsbCx1ci5fc3ByaW5nWC5fZW5kUG9zaXRpb249TG4sdXIuX3NwcmluZ1kuX2VuZFBvc2l0aW9uPVl0LHVyLl9zcHJpbmdTY2FsZS5fZW5kUG9zaXRpb249Qm4sdXIuc2V0RW5kKFVlLEl0LEJ0LDEpLGh0PV9pKHVyLGZ1bmN0aW9uKCl7bGV0IEJyPXVyLngoKSxycj1Cci54LE1yPUJyLnksX289QnIuc2NhbGU7Q2kocnIsTXIsX28sSHQsanQsaXQpfSxmdW5jdGlvbigpe2h0LmNhbmNlbCgpfSl9ZnVuY3Rpb24gWmEoVWUpe2xldCBJdD1qbihMbixZdCksQnQ9SXQueCxIdD1JdC55LGp0PUl0Lm91dE9mQm91bmRzO3JldHVybiBqdCYmTW8oQnQsSHQsQm4sVWUpLGp0fWZ1bmN0aW9uIENpKFVlLEl0LEJ0LEh0PSIiLGp0LGl0KXtVZSE9PW51bGwmJlVlLnRvU3RyaW5nKCkhPT0iTmFOIiYmdHlwZW9mIFVlPT0ibnVtYmVyInx8KFVlPUxufHwwKSxJdCE9PW51bGwmJkl0LnRvU3RyaW5nKCkhPT0iTmFOIiYmdHlwZW9mIEl0PT0ibnVtYmVyInx8KEl0PVl0fHwwKSxVZT1OdW1iZXIoVWUudG9GaXhlZCgxKSksSXQ9TnVtYmVyKEl0LnRvRml4ZWQoMSkpLEJ0PU51bWJlcihCdC50b0ZpeGVkKDEpKSxMbj09PVVlJiZZdD09PUl0fHxqdHx8RigiY2hhbmdlIix7eDp1byhVZSx4bi54KSx5OnVvKEl0LHhuLnkpLHNvdXJjZTpIdH0pLF8uc2NhbGV8fChCdD1CbiksQnQ9YWkoQnQpLEJ0PStCdC50b0ZpeGVkKDMpLGl0JiZCdCE9PUJuJiZGKCJzY2FsZSIse3g6VWUseTpJdCxzY2FsZTpCdH0pO2xldCBmbj1gdHJhbnNsYXRlKCR7VWV9cHgsICR7SXR9cHgpIHNjYWxlKCR7QnR9KWA7WmkudHJhbnNpdGlvbihxLnZhbHVlLHtzdHlsZXM6e3RyYW5zZm9ybTpmbn0sZHVyYXRpb246MCxkZWxheTowfSksTG49VWUsWXQ9SXQsQm49QnR9ZnVuY3Rpb24gbW8oKXtyZXR1cm4gUW4ocS52YWx1ZSkudGhlbihVZT0+e0JvPVVlfSl9ZnVuY3Rpb24gWGEoKXtpZighZWUudmFsdWUpcmV0dXJuO3JvKCk7bGV0IFVlPV8uc2NhbGU/dnQudmFsdWU6MTtDcigpLGhzKFVlKSxTaSgpLExuPWtlLnZhbHVlK3huLngsWXQ9cWUudmFsdWUreG4ueTtsZXQgSXQ9am4oTG4sWXQpLEJ0PUl0LngsSHQ9SXQueTtDaShCdCxIdCxVZSwiIiwhMCl9cmV0dXJuIEEub25Nb3VudGVkKCgpPT57TWU9bmkoSXQ9Pntzd2l0Y2goSXQuZGV0YWlsLnN0YXRlKXtjYXNlInN0YXJ0IjpTcigpO2JyZWFrO2Nhc2UibW92ZSI6RmkoSXQpO2JyZWFrO2Nhc2UiZW5kIjpkcygpfX0pLHYoKCk9PnttbygpLnRoZW4oKCk9PntYYSgpfSl9LDEwMCksT24ucmVjb25maWd1cmUoMSxxby52YWx1ZSksdXIucmVjb25maWd1cmUoMSw5Kk1hdGgucG93KFlvLnZhbHVlLDIpLzQwLFlvLnZhbHVlKTtsZXQgVWU9e3NldFBhcmVudDpYYX07cGUoVWUpLEEub25Vbm1vdW50ZWQoKCk9PntDZShVZSl9KX0pLEEub25Vbm1vdW50ZWQoKCk9PntybygpfSksKCk9PntXKE1lKX19bGV0IE5uPTE2LGxyPXthY3RpdmVDb2xvcjpFbi5QUklNQVJZX0NPTE9SLGJhY2tncm91bmRDb2xvcjoiI0VCRUJFQiIsYWN0aXZlTW9kZToiYmFja3dhcmRzIn0sT289e3BlcmNlbnQ6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MCx2YWxpZGF0b3IoXyl7cmV0dXJuIWlzTmFOKHBhcnNlRmxvYXQoXykpfX0sZm9udFNpemU6e3R5cGU6W1N0cmluZyxOdW1iZXJdLGRlZmF1bHQ6Tm59LHNob3dJbmZvOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sc3Ryb2tlV2lkdGg6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6Nix2YWxpZGF0b3IoXyl7cmV0dXJuIWlzTmFOKHBhcnNlRmxvYXQoXykpfX0sY29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6bHIuYWN0aXZlQ29sb3J9LGFjdGl2ZUNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OmxyLmFjdGl2ZUNvbG9yfSxiYWNrZ3JvdW5kQ29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6bHIuYmFja2dyb3VuZENvbG9yfSxhY3RpdmU6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxhY3RpdmVNb2RlOnt0eXBlOlN0cmluZyxkZWZhdWx0OmxyLmFjdGl2ZU1vZGV9LGR1cmF0aW9uOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjMwLHZhbGlkYXRvcihfKXtyZXR1cm4haXNOYU4ocGFyc2VGbG9hdChfKSl9fSxib3JkZXJSYWRpdXM6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MH19LER0PVt7InVuaS1wcm9ncmVzcyI6eyIiOntmbGV4OjEsZmxleERpcmVjdGlvbjoicm93IixhbGlnbkl0ZW1zOiJjZW50ZXIifX0sInVuaS1wcm9ncmVzcy1iYXIiOnsiIjp7ZmxleDoxfX0sInVuaS1wcm9ncmVzcy1pbm5lci1iYXIiOnsiIjp7cG9zaXRpb246ImFic29sdXRlIn19LCJ1bmktcHJvZ3Jlc3MtaW5mbyI6eyIiOnttYXJnaW5MZWZ0OiIxNXB4In19fV07dmFyIFJlPUEuZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJQcm9ncmVzcyIscHJvcHM6T28sc3R5bGVzOkR0LGVtaXRzOlsiYWN0aXZlZW5kIl0sc2V0dXAoXyx7ZW1pdDpGfSl7bGV0IHE9QS5yZWYobnVsbCksVz1BLnJlZihudWxsKSxlZT1zcihxLEYpLHJlPVhpKF8pO3JldHVybiBBLndhdGNoKCgpPT5yZS5yZWFsUGVyY2VudCwocGUsQ2UpPT57cmUubGFzdFBlcmNlbnQ9Q2V8fDAscmkocmUsXyxlZSl9KSxBLm9uTW91bnRlZCgoKT0+e3YoKCk9PntRbihXLnZhbHVlKS50aGVuKCh7d2lkdGg6cGV9KT0+e3JlLnByb2dyZXNzV2lkdGg9cGV8fDAscmkocmUsXyxlZSl9KX0sNTApfSksKCk9PntsZXR7c2hvd0luZm86cGUsZm9udFNpemU6Q2V9PV8se291dGVyQmFyU3R5bGU6TWUsaW5uZXJCYXJTdHlsZTokZSxjdXJyZW50UGVyY2VudDpBZX09cmU7cmV0dXJuIEEuY3JlYXRlVk5vZGUoImRpdiIse3JlZjpxLGNsYXNzOiJ1bmktcHJvZ3Jlc3MifSxbQS5jcmVhdGVWTm9kZSgiZGl2Iix7cmVmOlcsc3R5bGU6TWUsY2xhc3M6InVuaS1wcm9ncmVzcy1iYXIifSxbQS5jcmVhdGVWTm9kZSgiZGl2Iix7c3R5bGU6JGUsY2xhc3M6InVuaS1wcm9ncmVzcy1pbm5lci1iYXIifSxudWxsKV0pLHBlP1Z0KEFlKyIlIix7Y2xhc3M6InVuaS1wcm9ncmVzcy1pbmZvIixzdHlsZTp7Zm9udFNpemU6Q2V9fSk6bnVsbF0pfX19KTtmdW5jdGlvbiBYaShfKXtsZXQgRj1BLnJlZigwKSxxPUEucmVmKDApLFc9QS5jb21wdXRlZCgoKT0+KHtiYWNrZ3JvdW5kQ29sb3I6Xy5iYWNrZ3JvdW5kQ29sb3IsYm9yZGVyUmFkaXVzOl8uYm9yZGVyUmFkaXVzLGhlaWdodDpfLnN0cm9rZVdpZHRofSkpLGVlPUEuY29tcHV0ZWQoKCk9PntsZXQgQ2U9Xy5jb2xvciE9PWxyLmFjdGl2ZUNvbG9yJiZfLmFjdGl2ZUNvbG9yPT09bHIuYWN0aXZlQ29sb3I/Xy5jb2xvcjpfLmFjdGl2ZUNvbG9yO3JldHVybnt3aWR0aDpGLnZhbHVlKnEudmFsdWUvMTAwLGhlaWdodDpfLnN0cm9rZVdpZHRoLGJhY2tncm91bmRDb2xvcjpDZSxib3JkZXJSYWRpdXM6Xy5ib3JkZXJSYWRpdXN9fSkscmU9QS5jb21wdXRlZCgoKT0+e2xldCBDZT1wYXJzZUZsb2F0KF8ucGVyY2VudCk7cmV0dXJuIENlPDAmJihDZT0wKSxDZT4xMDAmJihDZT0xMDApLENlfSk7cmV0dXJuIEEucmVhY3RpdmUoe291dGVyQmFyU3R5bGU6Vyxpbm5lckJhclN0eWxlOmVlLHJlYWxQZXJjZW50OnJlLGN1cnJlbnRQZXJjZW50OkYsc3Ryb2tlVGltZXI6MCxsYXN0UGVyY2VudDowLHByb2dyZXNzV2lkdGg6cX0pfWZ1bmN0aW9uIHJpKF8sRixxKXtfLnN0cm9rZVRpbWVyJiZjbGVhckludGVydmFsKF8uc3Ryb2tlVGltZXIpLEYuYWN0aXZlPyhfLmN1cnJlbnRQZXJjZW50PUYuYWN0aXZlTW9kZT09PWxyLmFjdGl2ZU1vZGU/MDpfLmxhc3RQZXJjZW50LF8uc3Ryb2tlVGltZXI9c2V0SW50ZXJ2YWwoKCk9PntfLmN1cnJlbnRQZXJjZW50KzE+Xy5yZWFsUGVyY2VudD8oXy5jdXJyZW50UGVyY2VudD1fLnJlYWxQZXJjZW50LF8uc3Ryb2tlVGltZXImJmNsZWFySW50ZXJ2YWwoXy5zdHJva2VUaW1lcikscSgiYWN0aXZlZW5kIix7fSkpOl8uY3VycmVudFBlcmNlbnQrPTF9LHBhcnNlRmxvYXQoRi5kdXJhdGlvbikpKTpfLmN1cnJlbnRQZXJjZW50PV8ucmVhbFBlcmNlbnR9bGV0IGtpPXt2YWx1ZTp7dHlwZTpBcnJheSxkZWZhdWx0KCl7cmV0dXJuW119LHZhbGlkYXRvcjpmdW5jdGlvbihfKXtyZXR1cm4gc2UuaXNBcnJheShfKSYmXy5maWx0ZXIoRj0+dHlwZW9mIEY9PSJudW1iZXIiKS5sZW5ndGg9PT1fLmxlbmd0aH19LGluZGljYXRvclN0eWxlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxpbmRpY2F0b3JDbGFzczp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sbWFza1N0eWxlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxtYXNrQ2xhc3M6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9fSxRaT1zZS5leHRlbmQoe30sa2kse2hlaWdodDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDowfX0pO3ZhciBSaT1BLmRlZmluZUNvbXBvbmVudCh7bmFtZToiUGlja2VyVmlldyIscHJvcHM6UWksZW1pdHM6WyJjaGFuZ2UiLCJ1cGRhdGU6dmFsdWUiXSxzZXR1cChfLHtzbG90czpGLGVtaXQ6cX0pe2xldCBXPUEucmVmKG51bGwpLGVlPVlyKF8pLHJlPXNyKFcscSkscGU9W10sQ2U9JGU9PkFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwocGUsJGUpLE1lPSRlPT5BLmNvbXB1dGVkKHtnZXQoKXtsZXQgQWU9Q2UoJGUudm5vZGUpO3JldHVybiBlZS52YWx1ZVtBZV18fDB9LHNldChBZSl7aWYoISRlLmRhdGEuX2lzTW91bnRlZClyZXR1cm47bGV0IGtlPUNlKCRlLnZub2RlKTtpZihrZTwwKXJldHVybjtpZihlZS52YWx1ZVtrZV0hPT1BZSl7ZWUudmFsdWVba2VdPUFlO2xldCB2dD1lZS52YWx1ZS5tYXAoSnQ9Pkp0KTtxKCJ1cGRhdGU6dmFsdWUiLHZ0KSxyZSgiY2hhbmdlIix7dmFsdWU6dnR9KX19fSk7cmV0dXJuIEEucHJvdmlkZSgiZ2V0UGlja2VyVmlld0NvbHVtbiIsTWUpLEEucHJvdmlkZSgicGlja2VyVmlld1Byb3BzIixfKSwoKT0+e2xldCAkZT1GLmRlZmF1bHQmJkYuZGVmYXVsdCgpO3BlPVNvKCRlKTtsZXQgQWU9Xy5oZWlnaHQ/e2hlaWdodDpgJHtwYXJzZUZsb2F0KF8uaGVpZ2h0KX1weGB9Ont9O3JldHVybiBBLmNyZWF0ZVZOb2RlKCJ2aWV3IixBLm1lcmdlUHJvcHMoe3JlZjpXLGNsYXNzOiJ1bmktcGlja2VyLXZpZXciLHN0eWxlOkFlfSx7cHJldmVudEdlc3R1cmU6ITB9KSxbQS5jcmVhdGVWTm9kZSgidmlldyIse2NsYXNzOiJ1bmktcGlja2VyLXZpZXctd3JhcHBlciJ9LFskZV0pXSl9fSxzdHlsZXM6W3sidW5pLXBpY2tlci12aWV3Ijp7IiI6e3Bvc2l0aW9uOiJyZWxhdGl2ZSJ9fSwidW5pLXBpY2tlci12aWV3LXdyYXBwZXIiOnsiIjp7ZGlzcGxheToiZmxleCIsZmxleERpcmVjdGlvbjoicm93Iixwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDowLGxlZnQ6MCxyaWdodDowLGJvdHRvbTowLG92ZXJmbG93OiJoaWRkZW4ifX19XX0pO2Z1bmN0aW9uIFlyKF8pe2xldCBGPUEucmVhY3RpdmUoWy4uLl8udmFsdWVdKSxxPUEucmVhY3RpdmUoe3ZhbHVlOkZ9KTtyZXR1cm4gQS53YXRjaCgoKT0+Xy52YWx1ZSxXPT57cS52YWx1ZS5sZW5ndGg9Vy5sZW5ndGgsVy5mb3JFYWNoKChlZSxyZSk9PntlZSE9PXEudmFsdWVbcmVdJiZxLnZhbHVlLnNwbGljZShyZSwxLGVlKX0pfSkscX1sZXQgaWE9Qy5yZXF1aXJlTW9kdWxlKCJkb20iKSxUbz1DLmNvbmZpZy5lbnYucGxhdGZvcm0udG9Mb3dlckNhc2UoKT09PSJhbmRyb2lkIjtmdW5jdGlvbiBYdChfKXtyZXR1cm4gc2UuZXh0ZW5kKHt9LHNlLmlzU3RyaW5nKF8pP3RpKF8pOl8pfXZhciBiYT1BLmRlZmluZUNvbXBvbmVudCh7bmFtZToiUGlja2VyVmlld0NvbHVtbiIscHJvcHM6e2xlbmd0aDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDowfX0sZGF0YTooKT0+KHtfaXNNb3VudGVkOiExfSksc2V0dXAoXyx7c2xvdHM6Rn0pe2xldCBxPUEuZ2V0Q3VycmVudEluc3RhbmNlKCksVz1BLnJlZihudWxsKSxlZT1BLnJlZihudWxsKSxyZT1BLnJlZihudWxsKSxwZT1BLnJlZihudWxsKSxDZT1BLmluamVjdCgicGlja2VyVmlld1Byb3BzIiksJGU9QS5pbmplY3QoImdldFBpY2tlclZpZXdDb2x1bW4iKShxKSxBZT1BLmNvbXB1dGVkKCgpPT5YdChDZS5pbmRpY2F0b3JTdHlsZSkpLGtlPUEuY29tcHV0ZWQoKCk9Plh0KENlLm1hc2tTdHlsZSkpLHFlPUEucmVmKDApO3FlLnZhbHVlPXhpKEFlLnZhbHVlKTtsZXQgdnQ9QS5yZWYoMCk7dnQudmFsdWU9cGFyc2VGbG9hdChDZS5oZWlnaHQpLEEud2F0Y2goKCk9Pl8ubGVuZ3RoLCgpPT57digoKT0+e2d0KCRlLnZhbHVlLCEwLCEwKX0sMTUwKX0pO2xldCBKdCxndD0oU3QsaHQ9ITAsTHQpPT57JGUudmFsdWU9PT1TdCYmIUx0fHwoaWEuc2Nyb2xsVG9FbGVtZW50KGVlLnZhbHVlLHtvZmZzZXQ6U3QqcWUudmFsdWUsYW5pbWF0ZWQ6aHR9KSwkZS52YWx1ZT1TdCxodCYmKEp0PURhdGUubm93KCkpKX0sdXQ9U3Q9PntpZihEYXRlLm5vdygpLUp0PDM0MClyZXR1cm47bGV0IGh0PVN0LmRldGFpbC5jb250ZW50T2Zmc2V0LnksTHQ9TWF0aC5yb3VuZChodC9xZS52YWx1ZSk7aHQlcWUudmFsdWU/Z3QoTHQsITAsITApOiRlLnZhbHVlPUx0fSxOdD0oKT0+e2xldCBTdCxodDt2KCgpPT57UHJvbWlzZS5hbGwoW1FuKFcudmFsdWUpLnRoZW4oKHtoZWlnaHQ6THR9KT0+e1N0PXZ0LnZhbHVlPUx0fSksVG8mJl8ubGVuZ3RoP1FuKHJlLnZhbHVlKS50aGVuKCh7aGVpZ2h0Okx0fSk9PntodD1xZS52YWx1ZT1MdC9wYXJzZUZsb2F0KF8ubGVuZ3RoKX0pOlFuKHBlLnZhbHVlKS50aGVuKCh7aGVpZ2h0Okx0fSk9PntodD1xZS52YWx1ZT1MdH0pXSkudGhlbigoKT0+e1N0JiZodD92KCgpPT57cS5kYXRhLl9pc01vdW50ZWQ9ITAsZ3QoJGUudmFsdWUsITEsITApfSw1MCk6TnQoKX0pfSw1MCl9O0Eub25Nb3VudGVkKE50KTtsZXQgcG49U3Q9PlN0P1RvP0EuY3JlYXRlVk5vZGUoImRpdiIse3JlZjpyZSxzdHlsZToiZmxleC1kaXJlY3Rpb246Y29sdW1uOyJ9LFtTdF0pOlN0Om51bGw7cmV0dXJuKCk9PntsZXQgU3Q9Ri5kZWZhdWx0JiZGLmRlZmF1bHQoKSxodD0odnQudmFsdWUtcWUudmFsdWUpLzIsTHQ9YCR7dnQudmFsdWUtaHR9cHhgLFJuPXtzaG93U2Nyb2xsYmFyOiExLHNjcm9sbFRvQmVnaW46ITEsZGVjZWxlcmF0aW9uUmF0ZTouMyxzY3JvbGxZOiEwfTtyZXR1cm4gVG98fChSbi5zY3JvbGxUb3A9JGUudmFsdWUqcWUudmFsdWUpLEEuY3JlYXRlVk5vZGUoInZpZXciLHtyZWY6VyxjbGFzczoidW5pLXBpY2tlci12aWV3LWNvbHVtbiJ9LFtBLmNyZWF0ZVZOb2RlKCJzY3JvbGwtdmlldyIsQS5tZXJnZVByb3BzKHtjbGFzczoidW5pLXBpY2tlci12aWV3LWdyb3VwIixzdHlsZToiZmxleC1kaXJlY3Rpb246Y29sdW1uOyIsb25TY3JvbGxlbmQ6dXR9LFJuKSxbQS5jcmVhdGVWTm9kZSgidmlldyIse3JlZjplZSxjbGFzczoidW5pLXBpY2tlci12aWV3LWNvbnRlbnQiLHN0eWxlOntwYWRkaW5nVG9wOmAke2h0fXB4YCxwYWRkaW5nQm90dG9tOmAke2h0fXB4YH19LFtwbihTdCldKV0pLEEuY3JlYXRlVk5vZGUoInUtc2NhbGFibGUiLHtjbGFzczoidW5pLXBpY2tlci12aWV3LW1hc2siLHN0eWxlOmtlLnZhbHVlfSxbQS5jcmVhdGVWTm9kZSgidS1zY2FsYWJsZSIse2NsYXNzOiJ1bmktcGlja2VyLXZpZXctbWFzayB1bmktcGlja2VyLXZpZXctbWFzay10b3AiLHN0eWxlOntib3R0b206THR9fSxudWxsKSxBLmNyZWF0ZVZOb2RlKCJ1LXNjYWxhYmxlIix7Y2xhc3M6InVuaS1waWNrZXItdmlldy1tYXNrIHVuaS1waWNrZXItdmlldy1tYXNrLWJvdHRvbSIsc3R5bGU6e3RvcDpMdH19LG51bGwpXSksQS5jcmVhdGVWTm9kZSgidS1zY2FsYWJsZSIse3JlZjpwZSxjbGFzczoidW5pLXBpY2tlci12aWV3LWluZGljYXRvciIsc3R5bGU6c2UuZXh0ZW5kKHt9LEFlLnZhbHVlLHt0b3A6YCR7aHR9cHhgfSl9LG51bGwpXSl9fSxzdHlsZXM6W3sidW5pLXBpY2tlci12aWV3LWNvbHVtbiI6eyIiOntmbGV4OjEscG9zaXRpb246InJlbGF0aXZlIixhbGlnbkl0ZW1zOiJzdHJldGNoIixvdmVyZmxvdzoiaGlkZGVuIn19LCJ1bmktcGlja2VyLXZpZXctbWFzayI6eyIiOntwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDowLGxlZnQ6MCxyaWdodDowLGJvdHRvbTowLHBvaW50ZXJFdmVudHM6Im5vbmUifX0sInVuaS1waWNrZXItdmlldy1tYXNrLXRvcCI6eyIiOntib3R0b206MCxiYWNrZ3JvdW5kSW1hZ2U6ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20scmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk1KSxyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNikpIn19LCJ1bmktcGlja2VyLXZpZXctbWFzay1ib3R0b20iOnsiIjp7dG9wOjAsYmFja2dyb3VuZEltYWdlOiJsaW5lYXItZ3JhZGllbnQodG8gdG9wLHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NSkscmdiYSgyNTUsIDI1NSwgMjU1LCAwLjYpKSJ9fSwidW5pLXBpY2tlci12aWV3LWdyb3VwIjp7IiI6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOjAsbGVmdDowLHJpZ2h0OjAsYm90dG9tOjB9fSwidW5pLXBpY2tlci12aWV3LWNvbnRlbnQiOnsiIjp7ZmxleERpcmVjdGlvbjoiY29sdW1uIixwYWRkaW5nVG9wOjAscGFkZGluZ1JpZ2h0OjAscGFkZGluZ0JvdHRvbTowLHBhZGRpbmdMZWZ0OjB9fSwidW5pLXBpY2tlci12aWV3LWluZGljYXRvciI6eyIiOntwb3NpdGlvbjoiYWJzb2x1dGUiLGxlZnQ6MCxyaWdodDowLHRvcDowLGhlaWdodDoiMzRweCIscG9pbnRlckV2ZW50czoibm9uZSIsYm9yZGVyQ29sb3I6IiNlNWU1ZTUiLGJvcmRlclRvcFdpZHRoOiIxcHgiLGJvcmRlckJvdHRvbVdpZHRoOiIxcHgifX19XX0pO2Z1bmN0aW9uIHhpKF8pe2xldCBxPShfLmhlaWdodHx8Xy5saW5lSGVpZ2h0fHwiIikubWF0Y2goLygtP1tcZFwuXSspcHgvKSxXPTA7cmV0dXJuIHEmJihXPXBhcnNlRmxvYXQocVsxXSkpLFd9bGV0IHVuPXtTRUxFQ1RPUjoic2VsZWN0b3IiLE1VTFRJU0VMRUNUT1I6Im11bHRpU2VsZWN0b3IiLFRJTUU6InRpbWUiLERBVEU6ImRhdGUifSxxcj17WUVBUjoieWVhciIsTU9OVEg6Im1vbnRoIixEQVk6ImRheSJ9O2Z1bmN0aW9uIEJpKF8pe3JldHVybiBfPjk/XzpgMCR7X31gfWZ1bmN0aW9uIFluKF8sRil7Xz1TdHJpbmcoX3x8IiIpO2xldCBxPW5ldyBEYXRlO2lmKEY9PT11bi5USU1FKXtsZXQgVz1fLnNwbGl0KCI6Iik7Vy5sZW5ndGg9PT0yJiZxLnNldEhvdXJzKHBhcnNlSW50KFdbMF0pLHBhcnNlSW50KFdbMV0pKX1lbHNle2xldCBXPV8uc3BsaXQoIi0iKTtXLmxlbmd0aD09PTMmJnEuc2V0RnVsbFllYXIocGFyc2VJbnQoV1swXSkscGFyc2VJbnQoU3RyaW5nKHBhcnNlRmxvYXQoV1sxXSktMSkpLHBhcnNlSW50KFdbMl0pKX1yZXR1cm4gcX1mdW5jdGlvbiBJbyhfKXtpZihfLm1vZGU9PT11bi5USU1FKXJldHVybiIwMDowMCI7aWYoXy5tb2RlPT09dW4uREFURSl7bGV0IEY9bmV3IERhdGUoKS5nZXRGdWxsWWVhcigpLTEwMDtzd2l0Y2goXy5maWVsZHMpe2Nhc2UgcXIuWUVBUjpyZXR1cm4gRjtjYXNlIHFyLk1PTlRIOnJldHVybiBGKyItMDEiO2RlZmF1bHQ6cmV0dXJuIEYrIi0wMS0wMSJ9fXJldHVybiIifWZ1bmN0aW9uIEZhKF8pe2lmKF8ubW9kZT09PXVuLlRJTUUpcmV0dXJuIjIzOjU5IjtpZihfLm1vZGU9PT11bi5EQVRFKXtsZXQgRj1uZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkrMTAwO3N3aXRjaChfLmZpZWxkcyl7Y2FzZSBxci5ZRUFSOnJldHVybiBGO2Nhc2UgcXIuTU9OVEg6cmV0dXJuIEYrIi0xMiI7ZGVmYXVsdDpyZXR1cm4gRisiLTEyLTMxIn19cmV0dXJuIiJ9bGV0IG9hPXtuYW1lOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxyYW5nZTp7dHlwZTpBcnJheSxkZWZhdWx0KCl7cmV0dXJuW119fSxyYW5nZUtleTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sdmFsdWU6e3R5cGU6W051bWJlcixTdHJpbmcsQXJyYXldLGRlZmF1bHQ6MH0sbW9kZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDp1bi5TRUxFQ1RPUix2YWxpZGF0b3IoXyl7cmV0dXJuIE9iamVjdC52YWx1ZXModW4pLmluZGV4T2YoXyk+PTB9fSxmaWVsZHM6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LHN0YXJ0Ont0eXBlOlN0cmluZyxkZWZhdWx0OklvfSxlbmQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6RmF9LGRpc2FibGVkOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX19O3ZhciBqbz1BLmRlZmluZUNvbXBvbmVudCh7bmFtZToiUGlja2VyIixwcm9wczpvYSxlbWl0czpbImNoYW5nZSIsImNhbmNlbCIsImNvbHVtbmNoYW5nZSJdLHNldHVwKF8se3Nsb3RzOkYsZW1pdDpxfSl7bGV0IFc9QS5yZWYobnVsbCksZWU9c3IoVyxxKSxyZT1BLnJlZihudWxsKSxwZT1BLnJlZihudWxsKSxDZT0oKT0+e2xldCBndD1fLnZhbHVlO3N3aXRjaChfLm1vZGUpe2Nhc2UgdW4uTVVMVElTRUxFQ1RPUjp7c2UuaXNBcnJheShndCl8fChndD1bXSksc2UuaXNBcnJheShyZS52YWx1ZSl8fChyZS52YWx1ZT1bXSk7bGV0IHV0PXJlLnZhbHVlLmxlbmd0aD1NYXRoLm1heChndC5sZW5ndGgsXy5yYW5nZS5sZW5ndGgpO2ZvcihsZXQgTnQ9MDtOdDx1dDtOdCsrKXtsZXQgcG49TnVtYmVyKGd0W050XSksU3Q9TnVtYmVyKHJlLnZhbHVlW050XSksaHQ9aXNOYU4ocG4pP2lzTmFOKFN0KT8wOlN0OnBuO3JlLnZhbHVlLnNwbGljZShOdCwxLGh0PDA/MDpodCl9fWJyZWFrO2Nhc2UgdW4uVElNRTpjYXNlIHVuLkRBVEU6cmUudmFsdWU9U3RyaW5nKGd0KTticmVhaztkZWZhdWx0OntsZXQgdXQ9TnVtYmVyKGd0KTtyZS52YWx1ZT11dDwwPzA6dXQ7YnJlYWt9fX0sTWU9Z3Q9PntwZS52YWx1ZSYmcGUudmFsdWUuc2VuZE1lc3NhZ2UoZ3QpfSwkZT1ndD0+e2xldCB1dD17ZXZlbnQ6ImNhbmNlbCJ9O3BlLnZhbHVlPWNuKHt1cmw6Il9fdW5pYXBwcGlja2VyIixkYXRhOmd0LHN0eWxlOnt0aXRsZU5WaWV3OiExLGFuaW1hdGlvblR5cGU6Im5vbmUiLGFuaW1hdGlvbkR1cmF0aW9uOjAsYmFja2dyb3VuZDoicmdiYSgwLDAsMCwwKSIscG9wR2VzdHVyZToibm9uZSJ9LG9uTWVzc2FnZTpOdD0+e2xldCBwbj1OdC5ldmVudDtpZihwbj09PSJjcmVhdGVkIil7TWUoZ3QpO3JldHVybn1pZihwbj09PSJjb2x1bW5jaGFuZ2UiKXtkZWxldGUgTnQuZXZlbnQsZWUocG4sTnQpO3JldHVybn11dD1OdH0sb25DbG9zZTooKT0+e3BlLnZhbHVlPW51bGw7bGV0IE50PXV0LmV2ZW50O2RlbGV0ZSB1dC5ldmVudCxOdCYmZWUoTnQsdXQpfX0pfSxBZT1ndD0+e2submF0aXZlVUlbXy5tb2RlPT09dW4uVElNRT8icGlja1RpbWUiOiJwaWNrRGF0ZSJdKHV0PT57bGV0IE50PXV0LmRhdGU7ZWUoImNoYW5nZSIse3ZhbHVlOl8ubW9kZT09PXVuLlRJTUU/YCR7QmkoTnQuZ2V0SG91cnMoKSl9OiR7QmkoTnQuZ2V0TWludXRlcygpKX1gOmAke050LmdldEZ1bGxZZWFyKCl9LSR7QmkoTnQuZ2V0TW9udGgoKSsxKX0tJHtCaShOdC5nZXREYXRlKCkpfWB9KX0sKCk9PntlZSgiY2FuY2VsIix7fSl9LF8ubW9kZT09PXVuLlRJTUU/e3RpbWU6WW4oXy52YWx1ZSx1bi5USU1FKX06e2RhdGU6WW4oXy52YWx1ZSx1bi5EQVRFKSxtaW5EYXRlOlluKF8uc3RhcnQsdW4uREFURSksbWF4RGF0ZTpZbihfLmVuZCx1bi5EQVRFKX0pfSxrZT1ndD0+eyhndC5tb2RlPT09dW4uVElNRXx8Z3QubW9kZT09PXVuLkRBVEUpJiYhZ3QuZmllbGRzP0FlKCk6KGd0LmZpZWxkcz1PYmplY3QudmFsdWVzKHFyKS5pbmNsdWRlcyhndC5maWVsZHMpP2d0LmZpZWxkczpxci5EQVksJGUoZ3QpKX0scWU9Z3Q9PntfLmRpc2FibGVkfHxrZShzZS5leHRlbmQoe30sXyx7dmFsdWU6cmUudmFsdWUsbG9jYWxlOmIuZ2V0TG9jYWxlKCl9KSl9LHZ0PUEuaW5qZWN0KExyLCExKSxKdD17c3VibWl0OigpPT5bXy5uYW1lLHJlLnZhbHVlXSxyZXNldDooKT0+e3N3aXRjaChfLm1vZGUpe2Nhc2UgdW4uU0VMRUNUT1I6cmUudmFsdWU9MDticmVhaztjYXNlIHVuLk1VTFRJU0VMRUNUT1I6c2UuaXNBcnJheShfLnZhbHVlKSYmKHJlLnZhbHVlPV8udmFsdWUubWFwKGd0PT4wKSk7YnJlYWs7Y2FzZSB1bi5EQVRFOmNhc2UgdW4uVElNRTpyZS52YWx1ZT0iIjticmVha319fTtyZXR1cm4gdnQmJih2dC5hZGRGaWVsZChKdCksQS5vbkJlZm9yZVVubW91bnQoKCk9PnZ0LnJlbW92ZUZpZWxkKEp0KSkpLE9iamVjdC5rZXlzKF8pLmZvckVhY2goZ3Q9PntBLndhdGNoKCgpPT5fW2d0XSx1dD0+e2xldCBOdD17fTtOdFtndF09dXQsTWUoTnQpfSx7ZGVlcDohMH0pfSksQS53YXRjaCgoKT0+Xy52YWx1ZSxDZSx7ZGVlcDohMH0pLENlKCksKCk9PkEuY3JlYXRlVk5vZGUoInZpZXciLHtyZWY6VyxvbkNsaWNrOnFlfSxbRi5kZWZhdWx0JiZGLmRlZmF1bHQoKV0pfX0pO2xldCBhYT17bmFtZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sbWluOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjB9LG1heDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDoxMDB9LHZhbHVlOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjB9LHN0ZXA6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MX0sZGlzYWJsZWQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxjb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiI2U5ZTllOSJ9LGJhY2tncm91bmRDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiI2U5ZTllOSJ9LGFjdGl2ZUNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIjMDA3YWZmIn0sc2VsZWN0ZWRDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIzAwN2FmZiJ9LGJsb2NrQ29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiNmZmZmZmYifSxibG9ja1NpemU6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6Mjh9LHNob3dWYWx1ZTp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9fSx5YT1beyJ1bmktc2xpZGVyIjp7IiI6e2ZsZXg6MSxmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLG1hcmdpblRvcDoiMTIiLG1hcmdpblJpZ2h0OjAsbWFyZ2luQm90dG9tOiIxMiIsbWFyZ2luTGVmdDowLHBhZGRpbmdUb3A6MCxwYWRkaW5nUmlnaHQ6MCxwYWRkaW5nQm90dG9tOjAscGFkZGluZ0xlZnQ6MH19LCJ1bmktc2xpZGVyLXdyYXBwZXIiOnsiIjp7ZmxleERpcmVjdGlvbjoicm93IixhbGlnbkl0ZW1zOiJjZW50ZXIiLG1pbkhlaWdodDoiMzAifX0sInVuaS1zbGlkZXItdGFwLWFyZWEiOnsiIjp7cG9zaXRpb246InJlbGF0aXZlIixmbGV4OjEsZmxleERpcmVjdGlvbjoiY29sdW1uIixwYWRkaW5nVG9wOiIxNSIscGFkZGluZ1JpZ2h0OjAscGFkZGluZ0JvdHRvbToiMTUiLHBhZGRpbmdMZWZ0OjB9fSwidW5pLXNsaWRlci1oYW5kbGUtd3JhcHBlciI6eyIiOntwb3NpdGlvbjoicmVsYXRpdmUiLG1hcmdpblRvcDowLG1hcmdpblJpZ2h0OiIxOCIsbWFyZ2luQm90dG9tOjAsbWFyZ2luTGVmdDoiMTgiLGhlaWdodDoiMiIsYm9yZGVyUmFkaXVzOiI1IixiYWNrZ3JvdW5kQ29sb3I6IiNlOWU5ZTkiLHRyYW5zaXRpb25Qcm9wZXJ0eToiYmFja2dyb3VuZENvbG9yIix0cmFuc2l0aW9uRHVyYXRpb246MzAwLHRyYW5zaXRpb25UaW1pbmdGdW5jdGlvbjoiZWFzZSJ9fSwidW5pLXNsaWRlci10cmFjayI6eyIiOntoZWlnaHQ6IjIiLGJvcmRlclJhZGl1czoiNiIsYmFja2dyb3VuZENvbG9yOiIjMDA3YWZmIix0cmFuc2l0aW9uUHJvcGVydHk6ImJhY2tncm91bmRDb2xvciIsdHJhbnNpdGlvbkR1cmF0aW9uOjMwMCx0cmFuc2l0aW9uVGltaW5nRnVuY3Rpb246ImVhc2UifX0sInVuaS1zbGlkZXItdGh1bWIiOnsiIjp7cG9zaXRpb246ImFic29sdXRlIix3aWR0aDoiMjgiLGhlaWdodDoiMjgiLGJvcmRlclJhZGl1czo1MCxib3hTaGFkb3c6IjAgMCA0cHggI2ViZWJlYiIsdHJhbnNpdGlvblByb3BlcnR5OiJib3JkZXJDb2xvciIsdHJhbnNpdGlvbkR1cmF0aW9uOjMwMCx0cmFuc2l0aW9uVGltaW5nRnVuY3Rpb246ImVhc2UifX0sInVuaS1zbGlkZXItc3RlcCI6eyIiOntwb3NpdGlvbjoiYWJzb2x1dGUiLHdpZHRoOjEwMCxoZWlnaHQ6IjIiLGJhY2tncm91bmQ6InRyYW5zcGFyZW50In19LCJ1bmktc2xpZGVyLXZhbHVlIjp7IiI6e2NvbG9yOiIjODg4ODg4Iixmb250U2l6ZToiMTQiLG1hcmdpbkxlZnQ6IjE0In19fV07dmFyIE5yPUEuZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJVU2xpZGVyIixwcm9wczphYSxzdHlsZXM6eWEsc2V0dXAoXyx7ZW1pdDpGfSl7bGV0IHE9QS5yZWYobnVsbCksVz1BLnJlZihudWxsKSxlZT1zcihxLEYpLHJlPWtyKF8pLHBlPWtuKF8scmUsZWUpO3JldHVybiBjcihfLHJlKSxBLndhdGNoKCgpPT5fLnZhbHVlLENlPT57cmUuc2xpZGVyVmFsdWU9TnVtYmVyKENlKX0pLEEub25Nb3VudGVkKCgpPT57digoKT0+e1FuKHEudmFsdWUpLnRoZW4oKHt3aWR0aDpDZX0pPT57cmUuc2xpZGVyV2lkdGg9Q2V8fDAscmUuc2xpZGVyVmFsdWU9TnVtYmVyKF8udmFsdWUpfSl9LDEwMCl9KSwoKT0+e2xldHtzaG93VmFsdWU6Q2V9PV8se3RyYWNrU3R5bGU6TWUsdHJhY2tBY3RpdmVTdHlsZTokZSx0aHVtYlN0eWxlOkFlLHNsaWRlclZhbHVlOmtlfT1yZTtyZXR1cm4gQS5jcmVhdGVWTm9kZSgiZGl2Iix7Y2xhc3M6InVuaS1zbGlkZXIiLHJlZjpxfSxbQS5jcmVhdGVWTm9kZSgiZGl2Iix7Y2xhc3M6InVuaS1zbGlkZXItd3JhcHBlciJ9LFtBLmNyZWF0ZVZOb2RlKCJkaXYiLEEubWVyZ2VQcm9wcyh7Y2xhc3M6InVuaS1zbGlkZXItdGFwLWFyZWEifSxwZSksW0EuY3JlYXRlVk5vZGUoImRpdiIse2NsYXNzOiJ1bmktc2xpZGVyLWhhbmRsZS13cmFwcGVyIixyZWY6VyxzdHlsZTpNZX0sW0EuY3JlYXRlVk5vZGUoImRpdiIse2NsYXNzOiJ1bmktc2xpZGVyLXRyYWNrIixzdHlsZTokZX0sbnVsbCldKSxBLmNyZWF0ZVZOb2RlKCJkaXYiLHtjbGFzczoidW5pLXNsaWRlci10aHVtYiIsc3R5bGU6QWV9LG51bGwpXSksQ2U/VnQoa2UrIiIse2NsYXNzOiJ1bmktc2xpZGVyLXZhbHVlIn0pOm51bGxdKV0pfX19KTtmdW5jdGlvbiBrcihfKXtsZXQgRj1BLnJlZigwKSxxPUEucmVmKDApLFc9KCk9Pl8uYmFja2dyb3VuZENvbG9yIT09IiNlOWU5ZTkiP18uYmFja2dyb3VuZENvbG9yOl8uY29sb3IhPT0iIzAwN2FmZiI/Xy5jb2xvcjoiIzAwN2FmZiIsZWU9KCk9Pl8uYWN0aXZlQ29sb3IhPT0iIzAwN2FmZiI/Xy5hY3RpdmVDb2xvcjpfLnNlbGVjdGVkQ29sb3IhPT0iI2U5ZTllOSI/Xy5zZWxlY3RlZENvbG9yOiIjZTllOWU5IixyZT0oKT0+e2xldCBDZT1OdW1iZXIoXy5tYXgpLE1lPU51bWJlcihfLm1pbik7cmV0dXJuKHEudmFsdWUtTWUpLyhDZS1NZSkqRi52YWx1ZX07cmV0dXJuIEEucmVhY3RpdmUoe3NsaWRlcldpZHRoOkYsc2xpZGVyVmFsdWU6cSx0cmFja1N0eWxlOkEuY29tcHV0ZWQoKCk9Pih7YmFja2dyb3VuZENvbG9yOlcoKX0pKSx0cmFja0FjdGl2ZVN0eWxlOkEuY29tcHV0ZWQoKCk9Pih7YmFja2dyb3VuZENvbG9yOmVlKCksd2lkdGg6cmUoKX0pKSx0aHVtYlN0eWxlOkEuY29tcHV0ZWQoKCk9Pih7d2lkdGg6Xy5ibG9ja1NpemUsaGVpZ2h0Ol8uYmxvY2tTaXplLG1hcmdpblRvcDotXy5ibG9ja1NpemUvMixsZWZ0OnJlKCksYmFja2dyb3VuZENvbG9yOl8uYmxvY2tDb2xvcn0pKX0pfWZ1bmN0aW9uIGtuKF8sRixxKXtsZXQgVz1udWxsO2Z1bmN0aW9uIGVlKENlLE1lKXtfLmRpc2FibGVkfHwoQ2U9PT0ibW92ZSI/KHJlKE1lKSxxKCJjaGFuZ2luZyIse3ZhbHVlOkYuc2xpZGVyVmFsdWV9KSk6Q2U9PT0iZW5kIiYmKHJlKE1lKSxxKCJjaGFuZ2UiLHt2YWx1ZTpGLnNsaWRlclZhbHVlfSkpKX1mdW5jdGlvbiByZShDZSl7Q2U8MCYmKENlPTApLENlPkYuc2xpZGVyV2lkdGgmJihDZT1GLnNsaWRlcldpZHRoKTtsZXQgTWU9TnVtYmVyKF8ubWF4KSwkZT1OdW1iZXIoXy5taW4pLEFlPU51bWJlcihfLnN0ZXApLGtlPUNlL0Yuc2xpZGVyV2lkdGgqTWUtJGU7QWU+MCYma2U+QWUmJmtlJUFlL0FlIT09MCYmKGtlLT1rZSVBZSksRi5zbGlkZXJWYWx1ZT1rZSskZX1yZXR1cm57b25Ub3VjaHN0YXJ0KENlKXtDZS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGg9PT0xJiYhVyYmKFc9Q2UsZWUoInN0YXJ0IixDZS5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWCkpfSxvblRvdWNobW92ZShDZSl7Q2UuY2hhbmdlZFRvdWNoZXMubGVuZ3RoPT09MSYmVyYmZWUoIm1vdmUiLENlLmNoYW5nZWRUb3VjaGVzWzBdLnBhZ2VYKX0sb25Ub3VjaGVuZChDZSl7Q2UuY2hhbmdlZFRvdWNoZXMubGVuZ3RoPT09MSYmVyYmKFc9bnVsbCxlZSgiZW5kIixDZS5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWCkpfX19ZnVuY3Rpb24gY3IoXyxGKXtsZXQgcT1BLmluamVjdChMciwhMSksVz17c3VibWl0OigpPT57bGV0IGVlPVsiIixudWxsXTtyZXR1cm4gXy5uYW1lJiYoZWVbMF09Xy5uYW1lLGVlWzFdPUYuc2xpZGVyVmFsdWUpLGVlfSxyZXNldDooKT0+e0Yuc2xpZGVyVmFsdWU9TnVtYmVyKF8udmFsdWUpfX07cSYmKHEuYWRkRmllbGQoVyksQS5vblVubW91bnRlZCgoKT0+e3EucmVtb3ZlRmllbGQoVyl9KSl9bGV0IHZyPXtuYW1lOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxjaGVja2VkOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sdHlwZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoic3dpdGNoIn0saWQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LGRpc2FibGVkOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sY29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiMwMDdhZmYifX0sZW89e3N3aXRjaDoic3dpdGNoIixjaGVja2JveDoiY2hlY2tib3gifSx6bz17d2lkdGg6NTIsaGVpZ2h0OjMyfTt2YXIgTGE9QS5kZWZpbmVDb21wb25lbnQoe25hbWU6IlN3aXRjaCIscHJvcHM6dnIsZW1pdHM6WyJjaGFuZ2UiXSxzZXR1cChfLHtlbWl0OkZ9KXtsZXQgcT1BLnJlZihudWxsKSxXPUEucmVmKF8uY2hlY2tlZCksZWU9RWEoXyxXKSxyZT1zcihxLEYpO0Eud2F0Y2goKCk9Pl8uY2hlY2tlZCxNZT0+e1cudmFsdWU9TWV9KTtsZXQgcGU9e29uQ2hhbmdlKE1lKXtXLnZhbHVlPU1lLmRldGFpbC52YWx1ZSxyZSgiY2hhbmdlIix7dmFsdWU6Vy52YWx1ZX0pfX0sQ2U9KE1lLCRlKT0+e18uZGlzYWJsZWR8fChXLnZhbHVlPSFXLnZhbHVlLHJlKCJjaGFuZ2UiLHt2YWx1ZTpXLnZhbHVlfSkpfTtyZXR1cm4gZWUmJihlZS5hZGRIYW5kbGVyKENlKSxBLm9uQmVmb3JlVW5tb3VudCgoKT0+e2VlLnJlbW92ZUhhbmRsZXIoQ2UpfSkpLG9yKF8seyJsYWJlbC1jbGljayI6Q2V9KSwoKT0+e2xldHtjb2xvcjpNZSx0eXBlOiRlfT1fO3JldHVybiBBLmNyZWF0ZVZOb2RlKCJkaXYiLHtyZWY6cX0sWyRlPT09ZW8uc3dpdGNoP0EuY3JlYXRlVk5vZGUoImRjLXN3aXRjaCIsQS5tZXJnZVByb3BzKHtkYXRhVW5jVHlwZToidW5pLXN3aXRjaCJ9LHBlLHtjaGVja2VkOlcudmFsdWUsY29sb3I6TWV9LHtzdHlsZTp6b30pLG51bGwpOm51bGwsJGU9PT1lby5jaGVja2JveD9BLmNyZWF0ZVZOb2RlKEEucmVzb2x2ZUNvbXBvbmVudCgiY2hlY2tib3giKSxBLm1lcmdlUHJvcHMoe3N0eWxlOntjb2xvcjpNZX19LHtjaGVja2VkOlcudmFsdWV9LHBlKSxudWxsKTpudWxsXSl9fX0pO2Z1bmN0aW9uIEVhKF8sRil7bGV0IHE9QS5pbmplY3QoTHIsITEpLFc9QS5pbmplY3QoeXIsITEpLGVlPXtzdWJtaXQ6KCk9PntsZXQgcmU9WyIiLG51bGxdO3JldHVybiBfLm5hbWUmJihyZVswXT1fLm5hbWUscmVbMV09Ri52YWx1ZSkscmV9LHJlc2V0OigpPT57Ri52YWx1ZT0hMX19O3JldHVybiBxJiYocS5hZGRGaWVsZChlZSksQS5vblVubW91bnRlZCgoKT0+e3EucmVtb3ZlRmllbGQoZWUpfSkpLFd9bGV0IHRvPXtjaGVja2VkOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0saWQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LGRpc2FibGVkOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sY29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiMwMDdhZmYifSx2YWx1ZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn19LEtyPVRyKCJ1Y2ciKSxNaT17bmFtZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn19LFdvPVt7InVuaS1jaGVja2JveCI6eyIiOntmbGV4RGlyZWN0aW9uOiJyb3ciLGFsaWduSXRlbXM6ImNlbnRlciJ9fSwidW5pLWNoZWNrYm94LWlucHV0Ijp7IiI6e2p1c3RpZnlDb250ZW50OiJjZW50ZXIiLGFsaWduSXRlbXM6ImNlbnRlciIscG9zaXRpb246InJlbGF0aXZlIixib3JkZXJXaWR0aDoiMSIsYm9yZGVyQ29sb3I6IiNkMWQxZDEiLGJvcmRlclN0eWxlOiJzb2xpZCIsYmFja2dyb3VuZENvbG9yOiIjZmZmZmZmIixib3JkZXJSYWRpdXM6IjMiLHdpZHRoOiIyMiIsaGVpZ2h0OiIyMiJ9fSwidW5pLWljb24iOnsiIjp7Zm9udEZhbWlseToidW5pbmNvbXBvbmVudHMiLGZvbnRTaXplOiIxNiIsbWFyZ2luTGVmdDoiMiIsbWFyZ2luVG9wOiIyIixjb2xvcjoiIzAwN2FmZiJ9fSwidW5pLWNoZWNrYm94LWlucHV0LWRpc2FibGVkIjp7IiI6e2JhY2tncm91bmRDb2xvcjoiI2UxZTFlMSJ9fSwidW5pLWNoZWNrYm94LWlucHV0LWRpc2FibGVkLWJlZm9yZSI6eyIiOntjb2xvcjoiI2FkYWRhZCJ9fSwidW5pLWNoZWNrYm94LXNsb3QiOnsiIjp7Zm9udFNpemU6IjE2IixtYXJnaW5MZWZ0OiI1In19fV07dmFyIGlpPUEuZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJDaGVja2JveCIscHJvcHM6dG8sc3R5bGVzOldvLHNldHVwKF8se3Nsb3RzOkZ9KXtsZXQgcT1BLnJlZihudWxsKSxXPUEucmVmKF8uY2hlY2tlZCksZWU9QS5yZWYoXy52YWx1ZSkscmU9QS5jb21wdXRlZCgoKT0+Xy5kaXNhYmxlZD8iI2FkYWRhZCI6Xy5jb2xvcikscGU9KCk9PntXLnZhbHVlPSExfSxDZT0oa2UscWUpPT57Xy5kaXNhYmxlZHx8KFcudmFsdWU9IVcudmFsdWUsTWUmJk1lLmNoZWNrYm94Q2hhbmdlKGtlKSl9LHt1bmlDaGVja0dyb3VwOk1lLHVuaUxhYmVsOiRlfT1iaShXLGVlLHBlKTskZSYmKCRlLmFkZEhhbmRsZXIoQ2UpLEEub25CZWZvcmVVbm1vdW50KCgpPT57JGUucmVtb3ZlSGFuZGxlcihDZSl9KSksb3IoXyx7ImxhYmVsLWNsaWNrIjpDZX0pLEEud2F0Y2goWygpPT5fLmNoZWNrZWQsKCk9Pl8udmFsdWVdLChba2UscWVdKT0+e1cudmFsdWU9a2UsZWUudmFsdWU9cWV9KTtsZXQgQWU9KCk9PntpZighRi5kZWZhdWx0KXJldHVybltdO2xldCBrZT1GLmRlZmF1bHQoKTtyZXR1cm4ga2UubGVuZ3RoPT09MSYma2VbMF0udHlwZT09PVRleHQ/W1Z0KGtlWzBdLmNoaWxkcmVuLHtjbGFzczoidW5pLWNoZWNrYm94LXNsb3QifSldOmtlfTtyZXR1cm4oKT0+QS5jcmVhdGVWTm9kZSgiZGl2IixBLm1lcmdlUHJvcHMoe3JlZjpxfSx7ZGF0YVVuY1R5cGU6InVuaS1jaGVja2JveCJ9LHtvbkNsaWNrOkNlLGNsYXNzOiJ1bmktY2hlY2tib3gifSksW0EuY3JlYXRlVk5vZGUoImRpdiIse2NsYXNzOlsidW5pLWNoZWNrYm94LWlucHV0Iix7InVuaS1jaGVja2JveC1pbnB1dC1kaXNhYmxlZCI6Xy5kaXNhYmxlZH1dfSxbVy52YWx1ZT9WdCgiXHVFQTA4Iix7Y2xhc3M6InVuaS1pY29uIixzdHlsZTp7Y29sb3I6cmUudmFsdWV9fSk6bnVsbF0pLC4uLkFlKCldKX19KTtmdW5jdGlvbiBiaShfLEYscSl7bGV0IFc9QS5jb21wdXRlZCgoKT0+KHtjaGVja2JveENoZWNrZWQ6Qm9vbGVhbihfLnZhbHVlKSx2YWx1ZTpGLnZhbHVlfSkpLGVlPXtyZXNldDpxfSxyZT1BLmluamVjdChLciwhMSk7cmUmJnJlLmFkZEZpZWxkKFcpO2xldCBwZT1BLmluamVjdChMciwhMSk7cGUmJnBlLmFkZEZpZWxkKGVlKTtsZXQgQ2U9QS5pbmplY3QoeXIsITEpO3JldHVybiBBLm9uQmVmb3JlVW5tb3VudCgoKT0+e3JlJiZyZS5yZW1vdmVGaWVsZChXKSxwZSYmcGUucmVtb3ZlRmllbGQoZWUpfSkse3VuaUNoZWNrR3JvdXA6cmUsdW5pRm9ybTpwZSx1bmlMYWJlbDpDZX19dmFyIHRyPUEuZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJDaGVja2JveEdyb3VwIixwcm9wczpNaSxlbWl0czpbImNoYW5nZSJdLHNldHVwKF8se3Nsb3RzOkYsZW1pdDpxfSl7bGV0IFc9QS5yZWYobnVsbCksZWU9c3IoVyxxKTtyZXR1cm4gd3IoXyxlZSksKCk9PkEuY3JlYXRlVk5vZGUoImRpdiIse3JlZjpXLGNsYXNzOiJ1bmktY2hlY2tib3gtZ3JvdXAifSxbRi5kZWZhdWx0JiZGLmRlZmF1bHQoKV0pfX0pO2Z1bmN0aW9uIHdyKF8sRil7bGV0IHE9W10sVz0oKT0+cS5yZWR1Y2UoKHJlLHBlKT0+KHBlLnZhbHVlLmNoZWNrYm94Q2hlY2tlZCYmcmUucHVzaChwZS52YWx1ZS52YWx1ZSkscmUpLG5ldyBBcnJheSk7QS5wcm92aWRlKEtyLHthZGRGaWVsZChyZSl7cS5wdXNoKHJlKX0scmVtb3ZlRmllbGQocmUpe3Euc3BsaWNlKHEuaW5kZXhPZihyZSksMSl9LGNoZWNrYm94Q2hhbmdlKHJlKXtGKCJjaGFuZ2UiLHt2YWx1ZTpXKCl9KX19KTtsZXQgZWU9QS5pbmplY3QoTHIsITEpO3JldHVybiBlZSYmZWUuYWRkRmllbGQoe3N1Ym1pdDooKT0+e2xldCByZT1bIiIsbnVsbF07cmV0dXJuIF8ubmFtZSE9PSIiJiYocmVbMF09Xy5uYW1lLHJlWzFdPVcoKSkscmV9fSksV31sZXQgRD17Y2hlY2tlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGlkOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxkaXNhYmxlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIjMDA3YWZmIn0sdmFsdWU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9fSxpZT1UcigidWNnIiksYmU9e25hbWU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9fSxHPVt7InVuaS1yYWRpbyI6eyIiOnthbGlnbkl0ZW1zOiJjZW50ZXIiLGZsZXhEaXJlY3Rpb246InJvdyJ9fSwidW5pLXJhZGlvLWlucHV0Ijp7IiI6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoiY2VudGVyIixtYXJnaW5SaWdodDoiNSIsYm9yZGVyU3R5bGU6InNvbGlkIixib3JkZXJXaWR0aDoiMSIsYm9yZGVyQ29sb3I6IiNkMWQxZDEiLGJvcmRlclJhZGl1czo1MCx3aWR0aDoiMjIiLGhlaWdodDoiMjIiLG91dGxpbmU6MH19LCJ1bmktcmFkaW8taW5wdXQtaWNvbiI6eyIiOntmb250RmFtaWx5OiJ1bmluY29tcG9uZW50cyIsZm9udFNpemU6IjE0Iixjb2xvcjoiI2ZmZmZmZiJ9fSwidW5pLXJhZGlvLWlucHV0LWRpc2FibGVkIjp7IiI6e2JhY2tncm91bmRDb2xvcjoiI2UxZTFlMSIsYm9yZGVyQ29sb3I6IiNkMWQxZDEiLGNvbG9yOiIjYWRhZGFkIn19LCJ1bmktcmFkaW8tc2xvdCI6eyIiOntmb250U2l6ZToiMTYiLG1hcmdpbkxlZnQ6IjUifX19XTt2YXIgVj1BLmRlZmluZUNvbXBvbmVudCh7bmFtZToiUmFkaW8iLHByb3BzOkQsc3R5bGVzOkcsZW1pdHM6WyJjaGFuZ2UiXSxzZXR1cChfLHtzbG90czpGfSl7bGV0IHE9QS5yZWYobnVsbCksVz1BLnJlZihfLmNoZWNrZWQpLGVlPUEucmVmKF8udmFsdWUpLHJlPUEuY29tcHV0ZWQoKCk9PntsZXQgcWU9Xy5kaXNhYmxlZD8iI2FkYWRhZCI6Xy5jb2xvcjtyZXR1cm4gVy52YWx1ZT97YmFja2dyb3VuZENvbG9yOnFlLGJvcmRlckNvbG9yOnFlfTp7Ym9yZGVyQ29sb3I6IiNkMWQxZDEifX0pLHBlPSgpPT57Vy52YWx1ZT0hMX0se3VuaUNoZWNrR3JvdXA6Q2UsdW5pTGFiZWw6TWUsZmllbGQ6JGV9PUooVyxlZSxwZSksQWU9KHFlLHZ0KT0+e18uZGlzYWJsZWR8fChXLnZhbHVlPSFXLnZhbHVlLENlJiZDZS5yYWRpb0NoYW5nZShxZSwkZSkpfTtNZSYmKE1lLmFkZEhhbmRsZXIoQWUpLEEub25CZWZvcmVVbm1vdW50KCgpPT57TWUucmVtb3ZlSGFuZGxlcihBZSl9KSksb3IoXyx7ImxhYmVsLWNsaWNrIjpBZX0pLEEud2F0Y2goWygpPT5fLmNoZWNrZWQsKCk9Pl8udmFsdWVdLChbcWUsdnRdKT0+e1cudmFsdWU9cWUsZWUudmFsdWU9dnR9KTtsZXQga2U9KCk9PntpZighRi5kZWZhdWx0KXJldHVybltdO2xldCBxZT1GLmRlZmF1bHQoKTtyZXR1cm4gcWUubGVuZ3RoPT09MSYmcWVbMF0udHlwZT09PVRleHQ/W1Z0KHFlWzBdLmNoaWxkcmVuLHtjbGFzczoidW5pLXJhZGlvLXNsb3QifSldOnFlfTtyZXR1cm4oKT0+e2xldHtkaXNhYmxlZDpxZX09XztyZXR1cm4gQS5jcmVhdGVWTm9kZSgiZGl2IixBLm1lcmdlUHJvcHMoe3JlZjpxfSx7ZGF0YVVuY1R5cGU6InVuaS1yYWRpbyJ9LHtvbkNsaWNrOkFlLGNsYXNzOiJ1bmktcmFkaW8ifSksW0EuY3JlYXRlVk5vZGUoImRpdiIse3N0eWxlOnJlLnZhbHVlLGNsYXNzOlsidW5pLXJhZGlvLWlucHV0Iix7InVuaS1yYWRpby1pbnB1dC1kaXNhYmxlZCI6cWV9XX0sW1cudmFsdWU/VnQoIlx1RUEwOCIse2NsYXNzOiJ1bmktcmFkaW8taW5wdXQtaWNvbiJ9KTpudWxsXSksLi4ua2UoKV0pfX19KTtmdW5jdGlvbiBKKF8sRixxKXtsZXQgVz1BLmNvbXB1dGVkKHtnZXQ6KCk9Pih7cmFkaW9DaGVja2VkOkJvb2xlYW4oXy52YWx1ZSksdmFsdWU6Ri52YWx1ZX0pLHNldDooe3JhZGlvQ2hlY2tlZDpNZX0pPT57Xy52YWx1ZT1NZX19KSxlZT17cmVzZXQ6cX0scmU9QS5pbmplY3QoaWUsITEpO3JlJiZyZS5hZGRGaWVsZChXKTtsZXQgcGU9QS5pbmplY3QoTHIsITEpO3BlJiZwZS5hZGRGaWVsZChlZSk7bGV0IENlPUEuaW5qZWN0KHlyLCExKTtyZXR1cm4gQS5vbkJlZm9yZVVubW91bnQoKCk9PntyZSYmcmUucmVtb3ZlRmllbGQoVykscGUmJnBlLnJlbW92ZUZpZWxkKGVlKX0pLHt1bmlDaGVja0dyb3VwOnJlLHVuaUZvcm06cGUsdW5pTGFiZWw6Q2UsZmllbGQ6V319dmFyIFo9QS5kZWZpbmVDb21wb25lbnQoe25hbWU6IlJhZGlvR3JvdXAiLHByb3BzOmJlLGVtaXRzOlsiY2hhbmdlIl0sc2V0dXAoXyx7c2xvdHM6RixlbWl0OnF9KXtsZXQgVz1BLnJlZihudWxsKSxlZT1zcihXLHEpO3JldHVybiBnZShfLGVlKSwoKT0+QS5jcmVhdGVWTm9kZSgiZGl2Iix7cmVmOld9LFtGLmRlZmF1bHQmJkYuZGVmYXVsdCgpXSl9fSk7ZnVuY3Rpb24gZ2UoXyxGKXtsZXQgcT1bXTtBLm9uTW91bnRlZCgoKT0+e0NlKHEubGVuZ3RoLTEpfSk7bGV0IFc9KCk9Pnt2YXIgTWU7cmV0dXJuKE1lPXEuZmluZCgkZT0+JGUudmFsdWUucmFkaW9DaGVja2VkKSk9PW51bGw/dm9pZCAwOk1lLnZhbHVlLnZhbHVlfTtBLnByb3ZpZGUoaWUse2FkZEZpZWxkKE1lKXtxLnB1c2goTWUpfSxyZW1vdmVGaWVsZChNZSl7cS5zcGxpY2UocS5pbmRleE9mKE1lKSwxKX0scmFkaW9DaGFuZ2UoTWUsJGUpe2xldCBBZT1xLmluZGV4T2YoJGUpO0NlKEFlLCEwKSxGKCJjaGFuZ2UiLHt2YWx1ZTpXKCl9KX19KTtsZXQgZWU9QS5pbmplY3QoTHIsITEpLHJlPXtzdWJtaXQ6KCk9PntsZXQgTWU9WyIiLG51bGxdO3JldHVybiBfLm5hbWUhPT0iIiYmKE1lWzBdPV8ubmFtZSxNZVsxXT1XKCkpLE1lfX07ZWUmJihlZS5hZGRGaWVsZChyZSksQS5vbkJlZm9yZVVubW91bnQoKCk9PntlZS5yZW1vdmVGaWVsZChyZSl9KSk7ZnVuY3Rpb24gcGUoTWUsJGUpe01lLnZhbHVlPXtyYWRpb0NoZWNrZWQ6JGUsdmFsdWU6TWUudmFsdWUudmFsdWV9fWZ1bmN0aW9uIENlKE1lLCRlKXtxLmZvckVhY2goKEFlLGtlKT0+e2tlIT09TWUmJiRlJiZwZShxW2tlXSwhMSl9KX1yZXR1cm4gcX1sZXQgenQ9WyJ1LWlucHV0IiwidS10ZXh0YXJlYSJdO3ZhciBDbj1BLmRlZmluZUNvbXBvbmVudCh7bmFtZToiRm9ybSIsZW1pdHM6WyJzdWJtaXQiLCJyZXNldCJdLHNldHVwKHt9LHtzbG90czpfLGVtaXQ6Rn0pe2xldCBxPUEucmVmKG51bGwpLFc9c3IocSxGKSxlZT1bXSxyZTtyZXR1cm4gQS5wcm92aWRlKExyLHthZGRGaWVsZChwZSl7ZWUucHVzaChwZSl9LHJlbW92ZUZpZWxkKHBlKXtlZS5zcGxpY2UoZWUuaW5kZXhPZihwZSksMSl9LHN1Ym1pdChwZSl7bGV0IENlPXt9O3JlJiZyZShDZSk7bGV0IE1lPWVlLnJlZHVjZSgoJGUsQWUpPT57aWYoQWUuc3VibWl0KXtsZXRba2UscWVdPUFlLnN1Ym1pdCgpO2tlJiYoJGVba2VdPXFlKX1yZXR1cm4gJGV9LE9iamVjdC5jcmVhdGUobnVsbCkpO09iamVjdC5hc3NpZ24oQ2UsTWUpLFcoInN1Ym1pdCIse3ZhbHVlOkNlfSl9LHJlc2V0KHBlKXtyZSYmcmUoKSxlZS5mb3JFYWNoKENlPT5DZS5yZXNldCYmQ2UucmVzZXQoKSksVygicmVzZXQiLHBlKX19KSwoKT0+e2xldCBwZT1fLmRlZmF1bHQmJl8uZGVmYXVsdCgpO3JldHVybiByZT1fbihwZSksQS5jcmVhdGVWTm9kZSgidmlldyIse3JlZjpxfSxbcGVdKX19fSk7ZnVuY3Rpb24gX24oXyl7bGV0IEY9Qy5yZXF1aXJlTW9kdWxlKCJwbHVzIikscT0oVyxlZSk9PnsoZWV8fF98fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKHJlKXt6dC5pbmRleE9mKFN0cmluZyhyZS50eXBlKSk+PTAmJnJlLmVsJiZyZS5lbC5hdHRyJiZyZS5lbC5hdHRyLm5hbWUmJihXP1dbcmUuZWwuYXR0ci5uYW1lXT1GLmdldFZhbHVlKHJlLmVsLm5vZGVJZCk6cmUuZWwuc2V0VmFsdWUoIiIpKSxzZS5pc0FycmF5KHJlLmNoaWxkcmVuKSYmcmUuY2hpbGRyZW4mJnJlLmNoaWxkcmVuLmxlbmd0aCYmcShXLHJlLmNoaWxkcmVuKX0pfTtyZXR1cm4gcX1sZXQgbXI9e3R5cGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LHNpemU6e3R5cGU6W1N0cmluZyxOdW1iZXJdLGRlZmF1bHQ6MjN9LGNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0scW49e3N1Y2Nlc3M6IiMwOWJiMDciLGluZm86IiMxMGFlZmYiLHdhcm46IiNmNzYyNjAiLHdhaXRpbmc6IiMxMGFlZmYiLHNhZmVfc3VjY2VzczoiIzA5YmIwNyIsc2FmZV93YXJuOiIjZmZiZTAwIixzdWNjZXNzX2NpcmNsZToiIzA5YmIwNyIsc3VjY2Vzc19ub19jaXJjbGU6IiMwOWJiMDciLHdhaXRpbmdfY2lyY2xlOiIjMTBhZWZmIixjaXJjbGU6IiNjOWM5YzkiLGRvd25sb2FkOiIjMDliYjA3IixpbmZvX2NpcmNsZToiIzA5YmIwNyIsY2FuY2VsOiIjZjQzNTMwIixzZWFyY2g6IiNiMmIyYjIiLGNsZWFyOiIjYjJiMmIyIn0sVmE9e3N1Y2Nlc3M6Ilx1RUEwNiIsaW5mbzoiXHVFQTAzIix3YXJuOiJcdUVBMEIiLHdhaXRpbmc6Ilx1RUEwOSIsc2FmZV9zdWNjZXNzOiJcdUVBMDQiLHNhZmVfd2FybjoiXHVFQTA1IixzdWNjZXNzX2NpcmNsZToiXHVFQTA3IixzdWNjZXNzX25vX2NpcmNsZToiXHVFQTA4Iix3YWl0aW5nX2NpcmNsZToiXHVFQTBBIixjaXJjbGU6Ilx1RUEwMSIsZG93bmxvYWQ6Ilx1RUEwMiIsaW5mb19jaXJjbGU6Ilx1RUEwQyIsY2FuY2VsOiJcdUVBMEQiLHNlYXJjaDoiXHVFQTBFIixjbGVhcjoiXHVFQTBGIn0sUG89W3sidW5pLWljb24iOnsiIjp7Zm9udEZhbWlseToidW5pbmNvbXBvbmVudHMifX19XTt2YXIgTm89QS5kZWZpbmVDb21wb25lbnQoe25hbWU6Ikljb24iLHByb3BzOm1yLHN0eWxlczpQbyxzZXR1cChfLHt9KXtyZXR1cm4oKT0+VnQoVmFbXy50eXBlXSx7Y2xhc3M6InVuaS1pY29uIixzdHlsZTp7Y29sb3I6Xy5jb2xvcnx8cW5bXy50eXBlXSxmb250U2l6ZTpfLnNpemV9fSl9fSk7bGV0IHNhPXtpbmRpY2F0b3JEb3RzOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sdmVydGljYWw6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxhdXRvcGxheTp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGNpcmN1bGFyOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0saW50ZXJ2YWw6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6NWUzfSxkdXJhdGlvbjp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDo1MDB9LGN1cnJlbnQ6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MH0saW5kaWNhdG9yQ29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6InJnYmEoMCwwLDAsLjMpIn0saW5kaWNhdG9yQWN0aXZlQ29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiMwMDAwMDAifSxwcmV2aW91c01hcmdpbjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sbmV4dE1hcmdpbjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sY3VycmVudEl0ZW1JZDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sc2tpcEhpZGRlbkl0ZW1MYXlvdXQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxkaXNwbGF5TXVsdGlwbGVJdGVtczp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDoxfSxkaXNhYmxlVG91Y2g6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfX0sJGE9Qy5jb25maWcuZW52LnBsYXRmb3JtLnRvTG93ZXJDYXNlKCk9PT0iYW5kcm9pZCIsVWE9W3sidW5pLXN3aXBlciI6eyIiOntwb3NpdGlvbjoicmVsYXRpdmUiLGhlaWdodDoiMTUwcHgifX0sInVuaS1zd2lwZXItc2xpZGVyIjp7IiI6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDowLHRvcDowLHJpZ2h0OjAsYm90dG9tOjB9fSwidW5pLXN3aXBlci1kb3RzIjp7IiI6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDowLHJpZ2h0OjAsYm90dG9tOiIxMCIsaGVpZ2h0OiIxMCJ9fX1dO3ZhciBDcz1BLmRlZmluZUNvbXBvbmVudCh7bmFtZToiU3dpcGVyIixwcm9wczpzYSxzdHlsZXM6VWEsZW1pdHM6WyJjaGFuZ2UiLCJ0cmFuc2l0aW9uIiwiYW5pbWF0aW9uZmluaXNoIl0sc2V0dXAoXyx7c2xvdHM6RixlbWl0OnF9KXtsZXQgVz1BLnJlZihudWxsKSxlZT1bXSxyZT1zcihXLHEpLHBlPWxhKF8pLENlPUdvKHBlLF8sZWUscmUpO3JldHVybiBBLndhdGNoKFsoKT0+Xy5jdXJyZW50LCgpPT5fLmN1cnJlbnRJdGVtSWRdLChbTWUsJGVdKT0+e29pKHBlLF8sZWUpfSksQS5vbk1vdW50ZWQoKCk9Pnt2KCgpPT57UW4oVy52YWx1ZSkudGhlbigoe3dpZHRoOk1lLGhlaWdodDokZX0pPT57cGUuc3dpcGVyV2lkdGg9TWUscGUuc3dpcGVySGVpZ2h0PSRlfSl9LDUwKX0pLCgpPT57bGV0IE1lPUYuZGVmYXVsdCYmRi5kZWZhdWx0KCkse2luZGljYXRvclN0eWxlOiRlLGN1cnJlbnRTeW5jOkFlfT1wZTtyZXR1cm4gZWU9U28oTWUpLEEuY3JlYXRlVk5vZGUoImRpdiIse3JlZjpXLGNsYXNzOiJ1bmktc3dpcGVyIn0sW0EuY3JlYXRlVk5vZGUoInNsaWRlciIsQS5tZXJnZVByb3BzKHtjbGFzczoidW5pLXN3aXBlci1zbGlkZXIifSx7YXV0b1BsYXk6Xy5hdXRvcGxheSxpbnRlcnZhbDpfLmludGVydmFsLGluZGV4OkFlLGtlZXBJbmRleDohMCxzaG93SW5kaWNhdG9yczpfLmluZGljYXRvckRvdHMsaW5maW5pdGU6Xy5jaXJjdWxhcix2ZXJ0aWNhbDpfLnZlcnRpY2FsLHNjcm9sbGFibGU6IV8uZGlzYWJsZVRvdWNofSxDZSksW2VlLEEuY3JlYXRlVk5vZGUoImluZGljYXRvciIse2NsYXNzOiJ1bmktc3dpcGVyLWRvdHMiLHN0eWxlOiRlfSxudWxsKV0pXSl9fX0pO2Z1bmN0aW9uIGxhKF8pe2xldCBGPUEucmVmKDApLHE9QS5yZWYoMCksVz1BLnJlZihfLmN1cnJlbnQpLGVlPUEucmVmKCJhdXRvcGxheSIpLHJlPUEuY29tcHV0ZWQoKCk9Pih7aXRlbUNvbG9yOl8uaW5kaWNhdG9yQ29sb3IsaXRlbVNlbGVjdGVkQ29sb3I6Xy5pbmRpY2F0b3JBY3RpdmVDb2xvcixpdGVtU2l6ZTo4LG9wYWNpdHk6Xy5pbmRpY2F0b3JEb3RzPzE6MH0pKTtyZXR1cm4gQS5yZWFjdGl2ZSh7c3dpcGVyV2lkdGg6Rixzd2lwZXJIZWlnaHQ6cSxpbmRpY2F0b3JTdHlsZTpyZSxjdXJyZW50U3luYzpXLGN1cnJlbnRDaGFuZ2VTb3VyY2U6ZWV9KX1mdW5jdGlvbiBHbyhfLEYscSxXKXtsZXQgZWU9MCxyZT1BZT0+e2xldCBrZT1BZS5kZXRhaWwscWU9Ri52ZXJ0aWNhbCx2dD0ocWU/a2Uub2Zmc2V0WVJhdGlvOmtlLm9mZnNldFhSYXRpbyl8fDA7aWYoKEFlLmRyYWd8fEFlLmRyYWcpJiYoXy5jdXJyZW50Q2hhbmdlU291cmNlPSJ0b3VjaCIpLHZ0PT09MCl7bGV0IEp0PU1hdGguYWJzKGVlKTtpZihKdD09PTEpcmV0dXJuO0p0Pi41JiYodnQ9MSl9ZWU9dnQsVygidHJhbnNpdGlvbiIse2R4OnFlPzA6LV8uc3dpcGVyV2lkdGgqdnQsZHk6cWU/LV8uc3dpcGVySGVpZ2h0KnZ0OjB9KX0scGU9QWU9PntsZXQga2U9KCk9PntXKCJhbmltYXRpb25maW5pc2giLE1lKCkpLF8uY3VycmVudENoYW5nZVNvdXJjZT0iYXV0b3BsYXkifTskYT9rZSgpOnYoa2UsNTApfSxDZT1BZT0+e3NlLmlzU3RyaW5nKEFlLmRldGFpbC5zb3VyY2UpJiYoXy5jdXJyZW50Q2hhbmdlU291cmNlPUFlLmRldGFpbC5zb3VyY2UpLF8uY3VycmVudFN5bmM9QWUuZGV0YWlsLmluZGV4LGVlPTB9O2Z1bmN0aW9uIE1lKCl7bGV0IEFlPU51bWJlcihfLmN1cnJlbnRTeW5jKSxrZT1xW0FlXXx8e30scWU9a2UuY29tcG9uZW50SW5zdGFuY2UmJmtlLmNvbXBvbmVudEluc3RhbmNlLml0ZW1JZHx8IiI7cmV0dXJue2N1cnJlbnQ6QWUsY3VycmVudEl0ZW1JZDpxZSxzb3VyY2U6Xy5jdXJyZW50Q2hhbmdlU291cmNlfX1yZXR1cm4gQS53YXRjaCgoKT0+Xy5jdXJyZW50U3luYyxBZT0+e1coImNoYW5nZSIsTWUoKSl9KSx7b25TY3JvbGw6cmUsb25TY3JvbGxlbmQ6cGUsb25DaGFuZ2U6Q2V9fWZ1bmN0aW9uIG9pKF8sRixxKXtsZXQgVz0tMTtpZihGLmN1cnJlbnRJdGVtSWQpZm9yKGxldCBlZT0wLHJlPXE7ZWU8cmUubGVuZ3RoO2VlKyspe2xldCBwZT1yZVtlZV0uY29tcG9uZW50SW5zdGFuY2U7aWYocGUmJnBlLml0ZW1JZD09PUYuY3VycmVudEl0ZW1JZCl7Vz1lZTticmVha319VzwwJiYoVz1NYXRoLnJvdW5kKE51bWJlcihGLmN1cnJlbnQpKXx8MCksVz1XPDA/MDpXLF8uY3VycmVudFN5bmMhPT1XJiYoXy5jdXJyZW50Q2hhbmdlU291cmNlPSIiLF8uY3VycmVudFN5bmM9Vyl9bGV0IHlpPXtpdGVtSWQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9fTt2YXIgd2E9QS5kZWZpbmVDb21wb25lbnQoe25hbWU6IlN3aXBlckl0ZW0iLHByb3BzOnlpLHNldHVwKF8se3Nsb3RzOkZ9KXtyZXR1cm4oKT0+QS5jcmVhdGVWTm9kZSgiZGl2Iix7Y2xhc3M6InVuaS1zd2lwZXItaXRlbSIsc3R5bGU6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDowLHRvcDowLHJpZ2h0OjAsYm90dG9tOjAsb3ZlcmZsb3c6ImhpZGRlbiJ9fSxbRi5kZWZhdWx0JiZGLmRlZmF1bHQoKV0pfX0pLG5yPS9ePChbLUEtWmEtejAtOV9dKykoKD86XHMrW2EtekEtWl86XVstYS16QS1aMC05XzouXSooPzpccyo9XHMqKD86KD86IlteIl0qIil8KD86J1teJ10qJyl8W14+XHNdKykpPykqKVxzKihcLz8pPi8sUnI9L148XC8oWy1BLVphLXowLTlfXSspW14+XSo+Lyxrbz0vKFthLXpBLVpfOl1bLWEtekEtWjAtOV86Ll0qKSg/OlxzKj1ccyooPzooPzoiKCg/OlxcLnxbXiJdKSopIil8KD86JygoPzpcXC58W14nXSkqKScpfChbXj5cc10rKSkpPy9nLGNhPUpyKCJhcmVhLGJhc2UsYmFzZWZvbnQsYnIsY29sLGZyYW1lLGhyLGltZyxpbnB1dCxsaW5rLG1ldGEscGFyYW0sZW1iZWQsY29tbWFuZCxrZXlnZW4sc291cmNlLHRyYWNrLHdiciIpLHhyPUpyKCJhLGFkZHJlc3MsYXJ0aWNsZSxhcHBsZXQsYXNpZGUsYXVkaW8sYmxvY2txdW90ZSxidXR0b24sY2FudmFzLGNlbnRlcixkZCxkZWwsZGlyLGRpdixkbCxkdCxmaWVsZHNldCxmaWdjYXB0aW9uLGZpZ3VyZSxmb290ZXIsZm9ybSxmcmFtZXNldCxoMSxoMixoMyxoNCxoNSxoNixoZWFkZXIsaGdyb3VwLGhyLGlmcmFtZSxpc2luZGV4LGxpLG1hcCxtZW51LG5vZnJhbWVzLG5vc2NyaXB0LG9iamVjdCxvbCxvdXRwdXQscCxwcmUsc2VjdGlvbixzY3JpcHQsdGFibGUsdGJvZHksdGQsdGZvb3QsdGgsdGhlYWQsdHIsdWwsdmlkZW8iKSxBcz1KcigiYWJicixhY3JvbnltLGFwcGxldCxiLGJhc2Vmb250LGJkbyxiaWcsYnIsYnV0dG9uLGNpdGUsY29kZSxkZWwsZGZuLGVtLGZvbnQsaSxpZnJhbWUsaW1nLGlucHV0LGlucyxrYmQsbGFiZWwsbWFwLG9iamVjdCxxLHMsc2FtcCxzY3JpcHQsc2VsZWN0LHNtYWxsLHNwYW4sc3RyaWtlLHN0cm9uZyxzdWIsc3VwLHRleHRhcmVhLHR0LHUsdmFyIiksT3M9SnIoImNvbGdyb3VwLGRkLGR0LGxpLG9wdGlvbnMscCx0ZCx0Zm9vdCx0aCx0aGVhZCx0ciIpLFRzPUpyKCJjaGVja2VkLGNvbXBhY3QsZGVjbGFyZSxkZWZlcixkaXNhYmxlZCxpc21hcCxtdWx0aXBsZSxub2hyZWYsbm9yZXNpemUsbm9zaGFkZSxub3dyYXAscmVhZG9ubHksc2VsZWN0ZWQiKSxJcz1Kcigic2NyaXB0LHN0eWxlIik7ZnVuY3Rpb24gWnMoXyxGKXt2YXIgcSxXLGVlLHJlPVtdLHBlPV87Zm9yKHJlLmxhc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1t0aGlzLmxlbmd0aC0xXX07Xzspe2lmKFc9ITAsIXJlLmxhc3QoKXx8IUlzW3JlLmxhc3QoKV0pe2lmKF8uaW5kZXhPZigiPCEtLSIpPT0wPyhxPV8uaW5kZXhPZigiLS0+IikscT49MCYmKEYuY29tbWVudCYmRi5jb21tZW50KF8uc3Vic3RyaW5nKDQscSkpLF89Xy5zdWJzdHJpbmcocSszKSxXPSExKSk6Xy5pbmRleE9mKCI8LyIpPT0wPyhlZT1fLm1hdGNoKFJyKSxlZSYmKF89Xy5zdWJzdHJpbmcoZWVbMF0ubGVuZ3RoKSxlZVswXS5yZXBsYWNlKFJyLCRlKSxXPSExKSk6Xy5pbmRleE9mKCI8Iik9PTAmJihlZT1fLm1hdGNoKG5yKSxlZSYmKF89Xy5zdWJzdHJpbmcoZWVbMF0ubGVuZ3RoKSxlZVswXS5yZXBsYWNlKG5yLE1lKSxXPSExKSksVyl7cT1fLmluZGV4T2YoIjwiKTt2YXIgQ2U9cTwwP186Xy5zdWJzdHJpbmcoMCxxKTtfPXE8MD8iIjpfLnN1YnN0cmluZyhxKSxGLmNoYXJzJiZGLmNoYXJzKENlKX19ZWxzZSBfPV8ucmVwbGFjZShuZXcgUmVnRXhwKCIoW1xcc1xcU10qPyk8LyIrcmUubGFzdCgpKyJbXj5dKj4iKSxmdW5jdGlvbihBZSxrZSl7cmV0dXJuIGtlPWtlLnJlcGxhY2UoLzwhLS0oW1xzXFNdKj8pLS0+fDwhXFtDREFUQVxbKFtcc1xTXSo/KV1dPi9nLCIkMSQyIiksRi5jaGFycyYmRi5jaGFycyhrZSksIiJ9KSwkZSgiIixyZS5sYXN0KCkpO2lmKF89PXBlKXRocm93IlBhcnNlIEVycm9yOiAiK187cGU9X30kZSgpO2Z1bmN0aW9uIE1lKEFlLGtlLHFlLHZ0KXtpZihrZT1rZS50b0xvd2VyQ2FzZSgpLHhyW2tlXSlmb3IoO3JlLmxhc3QoKSYmQXNbcmUubGFzdCgpXTspJGUoIiIscmUubGFzdCgpKTtpZihPc1trZV0mJnJlLmxhc3QoKT09a2UmJiRlKCIiLGtlKSx2dD1jYVtrZV18fCEhdnQsdnR8fHJlLnB1c2goa2UpLEYuc3RhcnQpe3ZhciBKdD1bXTtxZS5yZXBsYWNlKGtvLGZ1bmN0aW9uKGd0LHV0KXt2YXIgTnQ9YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTphcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOmFyZ3VtZW50c1s0XT9hcmd1bWVudHNbNF06VHNbdXRdP3V0OiIiO0p0LnB1c2goe25hbWU6dXQsdmFsdWU6TnQsZXNjYXBlZDpOdC5yZXBsYWNlKC8oXnxbXlxcXSkiL2csJyQxXFwiJyl9KX0pLEYuc3RhcnQmJkYuc3RhcnQoa2UsSnQsdnQpfX1mdW5jdGlvbiAkZShBZSxrZSl7aWYoa2UpZm9yKHZhciBxZT1yZS5sZW5ndGgtMTtxZT49MCYmcmVbcWVdIT1rZTtxZS0tKTtlbHNlIHZhciBxZT0wO2lmKHFlPj0wKXtmb3IodmFyIHZ0PXJlLmxlbmd0aC0xO3Z0Pj1xZTt2dC0tKUYuZW5kJiZGLmVuZChyZVt2dF0pO3JlLmxlbmd0aD1xZX19fWZ1bmN0aW9uIEpyKF8pe2Zvcih2YXIgRj17fSxxPV8uc3BsaXQoIiwiKSxXPTA7VzxxLmxlbmd0aDtXKyspRltxW1ddXT0hMDtyZXR1cm4gRn1mdW5jdGlvbiBFaShfKXtyZXR1cm4gXy5yZXBsYWNlKC88XD94bWwuKlw/PlxuLywiIikucmVwbGFjZSgvPCFkb2N0eXBlLio+XG4vLCIiKS5yZXBsYWNlKC88IURPQ1RZUEUuKj5cbi8sIiIpfWZ1bmN0aW9uIEhuKF8pe3JldHVybiBfLnJlZHVjZShmdW5jdGlvbihGLHEpe2xldCBXPXEudmFsdWUsZWU9cS5uYW1lO3JldHVybiBXLm1hdGNoKC8gLykmJlsic3R5bGUiLCJzcmMiXS5pbmRleE9mKGVlKT09PS0xJiYoVz1XLnNwbGl0KCIgIikpLEZbZWVdP0FycmF5LmlzQXJyYXkoRltlZV0pP0ZbZWVdLnB1c2goVyk6RltlZV09W0ZbZWVdLFddOkZbZWVdPVcsRn0se30pfWZ1bmN0aW9uIHlsKF8pe189RWkoXyk7bGV0IEY9W10scT17bm9kZToicm9vdCIsY2hpbGRyZW46W119O3JldHVybiBacyhfLHtzdGFydDpmdW5jdGlvbihXLGVlLHJlKXtsZXQgcGU9e25hbWU6V307aWYoZWUubGVuZ3RoIT09MCYmKHBlLmF0dHJzPUhuKGVlKSkscmUpe2xldCBDZT1GWzBdfHxxO0NlLmNoaWxkcmVufHwoQ2UuY2hpbGRyZW49W10pLENlLmNoaWxkcmVuLnB1c2gocGUpfWVsc2UgRi51bnNoaWZ0KHBlKX0sZW5kOmZ1bmN0aW9uKFcpe2xldCBlZT1GLnNoaWZ0KCk7aWYoZWUubmFtZSE9PVcmJmNvbnNvbGUuZXJyb3IoImludmFsaWQgc3RhdGU6IG1pc21hdGNoIGVuZCB0YWciKSxGLmxlbmd0aD09PTApcS5jaGlsZHJlbi5wdXNoKGVlKTtlbHNle2xldCByZT1GWzBdO3JlLmNoaWxkcmVufHwocmUuY2hpbGRyZW49W10pLHJlLmNoaWxkcmVuLnB1c2goZWUpfX0sY2hhcnM6ZnVuY3Rpb24oVyl7bGV0IGVlPXt0eXBlOiJ0ZXh0Iix0ZXh0Old9O2lmKEYubGVuZ3RoPT09MClxLmNoaWxkcmVuLnB1c2goZWUpO2Vsc2V7bGV0IHJlPUZbMF07cmUuY2hpbGRyZW58fChyZS5jaGlsZHJlbj1bXSkscmUuY2hpbGRyZW4ucHVzaChlZSl9fSxjb21tZW50OmZ1bmN0aW9uKFcpe2xldCBlZT17bm9kZToiY29tbWVudCIsdGV4dDpXfSxyZT1GWzBdO3JlLmNoaWxkcmVufHwocmUuY2hpbGRyZW49W10pLHJlLmNoaWxkcmVuLnB1c2goZWUpfX0pLHEuY2hpbGRyZW59bGV0IEhhPXtub2Rlczp7dHlwZTpbQXJyYXksU3RyaW5nXSxkZWZhdWx0OmZ1bmN0aW9uKCl7cmV0dXJuW119fX0sZm89MTY7dmFyIFhzPUEuZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJSaWNoVGV4dCIscHJvcHM6SGEsc2V0dXAoXyl7bGV0IEY9QS5nZXRDdXJyZW50SW5zdGFuY2UoKTtyZXR1cm4oKT0+e2xldCBxPV8ubm9kZXM7cmV0dXJuIHNlLmlzU3RyaW5nKHEpJiYocT15bChxKSksQS5jcmVhdGVWTm9kZSgidS1yaWNoLXRleHQiLHt2YWx1ZTpQcyhxfHxbXSxGLnJvb3Qse2RlZmF1bHRGb250U2l6ZTpmb30pfSxudWxsKX19fSk7ZnVuY3Rpb24gUHMoXyxGLHEpe2xldCBXPVsic3BhbiIsImEiLCJpbWFnZSIsImltZyJdLGVlPXtibG9ja3F1b3RlOmtlLGJyOmd0LGRpdjprZSxkbDprZSxoMTp2dCgyKSxoMjp2dCgxLjUpLGgzOnZ0KDEuMTcpLGg0OnZ0KDEpLGg1OnZ0KC44MyksaDY6dnQoLjY3KSxocjprZSxvbDprZSxwOmtlLHN0cm9uZzpKdCx0YWJsZTprZSx0Ym9keTprZSx0Zm9vdDprZSx0aGVhZDprZSx1bDprZX0scmU9LyYoYW1wfGd0fGx0fG5ic3B8cXVvdHxhcG9zKTsvZyxwZT17YW1wOiImIixndDoiPiIsbHQ6IjwiLG5ic3A6IiAiLHF1b3Q6JyInLGFwb3M6IicifSxDZT17dHlwZToic3BhbiIsX190eXBlOiJicmVhayIsYXR0cjp7dmFsdWU6YApgfX0sTWU9e19fYmxvY2s6ITAsX19icmVhazohMCxjaGlsZHJlbjpbXX0sJGU9bnVsbDtmdW5jdGlvbiBBZShodCl7bGV0IEx0PU9iamVjdC5jcmVhdGUobnVsbCk7aWYoaHQuYXR0cnMpe2xldCBSbj0oaHQuYXR0cnMuY2xhc3N8fCIiKS5zcGxpdCgiICIpO09iamVjdC5hc3NpZ24oTHQsQS5wYXJzZUNsYXNzTGlzdChSbixGKSx0aShodC5hdHRycy5zdHlsZXx8IiIpKX1pZihodC5uYW1lPT09ImltZyJ8fGh0Lm5hbWU9PT0iaW1hZ2UiKXtsZXQgUm49aHQuYXR0cnM7THQud2lkdGg9THQud2lkdGh8fFJuLndpZHRoLEx0LmhlaWdodD1MdC5oZWlnaHR8fFJuLmhlaWdodH1yZXR1cm4gTHR9ZnVuY3Rpb24ga2UoaHQpe3JldHVybiBodC5fX2Jsb2NrPSEwLGh0fWZ1bmN0aW9uIHFlKGh0LEx0KXtyZXR1cm4gaHQuc3R5bGUmJiFodC5zdHlsZS5mb250U2l6ZSYmKGh0LnN0eWxlLmZvbnRTaXplPXEuZGVmYXVsdEZvbnRTaXplKkx0KSxrZShKdChodCkpfWZ1bmN0aW9uIHZ0KGh0KXtyZXR1cm4gZnVuY3Rpb24oTHQpe3JldHVybiBxZShMdCxodCl9fWZ1bmN0aW9uIEp0KGh0KXtyZXR1cm4gaHQuc3R5bGUmJiFodC5zdHlsZS5mb250V2VpZ2h0JiYoaHQuc3R5bGUuZm9udFdlaWdodD0iYm9sZCIpLGh0fWZ1bmN0aW9uIGd0KGh0KXtyZXR1cm4gaHQuX192YWx1ZT0iICIsa2UoaHQpfWZ1bmN0aW9uIHV0KGh0KXtyZXR1cm4gaHQucmVwbGFjZShyZSxmdW5jdGlvbihMdCxSbil7cmV0dXJuIHBlW1JuXX0pfWZ1bmN0aW9uIE50KGh0KXtsZXQgTHQ9KGh0Lm5hbWV8fCIiKS50b0xvd2VyQ2FzZSgpLFJuPUx0LHhuPWVlW0x0XTtXLmluZGV4T2YoTHQpPT09LTEmJihMdD0ic3BhbiIpLEx0PT09ImltZyImJihMdD0iaW1hZ2UiKTtsZXQgQm49e3R5cGU6THQsX190eXBlOlJuLGF0dHI6T2JqZWN0LmNyZWF0ZShudWxsKX07cmV0dXJuKGh0LnR5cGU9PT0idGV4dCJ8fGh0LnRleHQpJiYoQm4uX192YWx1ZT1Cbi5hdHRyLnZhbHVlPXV0KChodC50ZXh0fHwiIikudHJpbSgpKSksaHQuYXR0cnMmJk9iamVjdC5rZXlzKGh0LmF0dHJzKS5mb3JFYWNoKExuPT57TG4hPT0iY2xhc3MiJiZMbiE9PSJzdHlsZSImJihCbi5hdHRyW0xuXT1odC5hdHRyc1tMbl0pfSksQm4uc3R5bGU9QWUoaHQpLHhuJiZ4bihCbiksKE1lLl9fYmxvY2t8fEJuLl9fYmxvY2spJiYoJGV8fChNZS5jaGlsZHJlbi5wdXNoKENlKSwkZT1bTWUsQ2VdKSksTWU9Qm4sKE1lLl9fdmFsdWV8fE1lLnR5cGU9PT0iaW1hZ2UiJiZNZS5hdHRyLnNyYykmJigkZT1udWxsKSxCbi5jaGlsZHJlbj1wbihodC5jaGlsZHJlbiksTWU9Qm4sTWUuX19ibG9jayYmTWUuc3R5bGUuaGVpZ2h0JiYhL14wKHB4KT8kLy50ZXN0KE1lLnN0eWxlLmhlaWdodCkmJigkZT1udWxsKSxCbn1mdW5jdGlvbiBwbihodCl7cmV0dXJuIHNlLmlzQXJyYXkoaHQpP2h0Lm1hcChMdD0+TnQoTHQpKTpbXX1sZXQgU3Q9cG4oXyk7aWYoJGUpe2xldFtodCxMdF09JGUsUm49aHQuY2hpbGRyZW4seG49Um4uaW5kZXhPZihMdCk7Um4uc3BsaWNlKHhuLDEpfXJldHVybiBTdH1sZXQgaG89e307ZnVuY3Rpb24gTnMoXyxGLHEpe2xldHthZHBpZDpXLHdpZHRoOmVlfT1fLHJlPVcrIi0iK2VlLHBlPWhvW3JlXTtpZihwZSYmcGUubGVuZ3RoPjApe0YocGUuc3BsaWNlKDAsMSlbMF0pO3JldHVybn1rLmFkLmdldEFkcyhfLENlPT57bGV0IE1lPUNlLmFkcztGKE1lLnNwbGljZSgwLDEpWzBdKSxob1tyZV09cGU/cGUuY29uY2F0KE1lKTpNZX0sQ2U9PntxKHtlcnJDb2RlOkNlLmNvZGUsZXJyTXNnOkNlLm1lc3NhZ2V9KX0pfWxldCBTYT17YWRwaWQ6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6IiJ9LGRhdGE6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LHdpZHRoOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxjaGFubmVsOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sUm89e2xvYWQ6ImxvYWQiLGNsb3NlOiJjbG9zZSIsZXJyb3I6ImVycm9yIixkb3dubG9hZGNoYW5nZToiZG93bmxvYWRjaGFuZ2UifTt2YXIga3M9QS5kZWZpbmVDb21wb25lbnQoe25hbWU6IkFkIixwcm9wczpTYSxlbWl0czpbUm8ubG9hZCxSby5jbG9zZSxSby5lcnJvcixSby5kb3dubG9hZGNoYW5nZV0sc2V0dXAoXyx7ZW1pdDpGfSl7bGV0IHE9QS5yZWYobnVsbCksVz1zcihxLEYpLGVlPWphKCk7QS53YXRjaCgoKT0+Xy5hZHBpZCxwZT0+e0NhKGVlLF8sVyl9KSxBLndhdGNoKCgpPT5fLmRhdGEscGU9PntlZS5kYXRhPXBlfSksQS5vbk1vdW50ZWQoKCk9Pnt2KCgpPT57UW4ocS52YWx1ZSkudGhlbigoe3dpZHRoOnBlfSk9PntlZS53aWR0aD1wZT09PTA/LTE6cGUsQ2EoZWUsXyxXKX0pfSw1MCl9KTtsZXQgcmU9e29uRG93bmxvYWRjaGFuZ2UocGUpe1coUm8uZG93bmxvYWRjaGFuZ2UscGUpfSxvbkRpc2xpa2UocGUpe1coUm8uY2xvc2UscGUpfX07cmV0dXJuKCk9PkEuY3JlYXRlVk5vZGUoInUtYWQiLEEubWVyZ2VQcm9wcyh7cmVmOnF9LHtkYXRhOmVlLmRhdGEscmVuZGVyaW5nOiEwfSxyZSksbnVsbCl9fSk7ZnVuY3Rpb24gamEoXyl7bGV0IEY9QS5yZWYoIiIpO3JldHVybiBBLnJlYWN0aXZlKHt3aWR0aDowLGRhdGE6Rn0pfWZ1bmN0aW9uIENhKF8sRixxKXtOcyh7YWRwaWQ6Ri5hZHBpZCx3aWR0aDpfLndpZHRofSxXPT57Xy5kYXRhPVcscShSby5sb2FkLHt9KX0sVz0+e3EoUm8uZXJyb3IsVyl9KX1sZXQgbm89e307ZnVuY3Rpb24gcG8oXyxGLHEsVyxlZSl7bGV0IHJlPV8rIi0iK0YscGU9bm9bcmVdO2lmKHBlJiZwZS5sZW5ndGg+MCl7VyhwZS5zcGxpY2UoMCwxKVswXSk7cmV0dXJufWsuYWQuZ2V0RHJhd0Fkcyh7YWRwaWQ6U3RyaW5nKF8pLGNvdW50OjMsd2lkdGg6Rn0sQ2U9PntsZXQgTWU9Q2UuYWRzO1coTWUuc3BsaWNlKDAsMSlbMF0pLG5vW3JlXT1wZT9wZS5jb25jYXQoTWUpOk1lfSxDZT0+e2VlKHtlcnJDb2RlOkNlLmNvZGUsZXJyTXNnOkNlLm1lc3NhZ2V9KX0pfWxldCB1YT17YWRwaWQ6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6IiJ9LGRhdGE6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LHdpZHRoOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sZ289e2xvYWQ6ImxvYWQiLGNsb3NlOiJjbG9zZSIsZXJyb3I6ImVycm9yIn07dmFyIFJzPUEuZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJBZERyYXciLHByb3BzOnVhLGVtaXRzOltnby5sb2FkLGdvLmNsb3NlLGdvLmVycm9yXSxzZXR1cChfLHtlbWl0OkZ9KXtsZXQgcT1BLnJlZihudWxsKSxXPXNyKHEsRiksZWU9RWwoKTtBLndhdGNoKCgpPT5fLmFkcGlkLHBlPT57eHMoZWUsXyxXKX0pLEEud2F0Y2goKCk9Pl8uZGF0YSxwZT0+e2VlLmRhdGE9cGV9KTtsZXQgcmU9e29uRGlzbGlrZShwZSl7Vyhnby5jbG9zZSxwZSl9fTtyZXR1cm4gQS5vbk1vdW50ZWQoKCk9Pnt2KCgpPT57UW4ocS52YWx1ZSkudGhlbigoe3dpZHRoOnBlLGhlaWdodDpDZX0pPT57ZWUud2lkdGg9cGU9PT0wPy0xOnBlLGVlLmhlaWdodD1DZT09PTA/LTE6Q2UseHMoZWUsXyxXKX0pfSw1MCl9KSwoKT0+e2xldHtkYXRhOnBlfT1lZTtyZXR1cm4gQS5jcmVhdGVWTm9kZSgidS1hZC1kcmF3IixBLm1lcmdlUHJvcHMoe3JlZjpxfSx7ZGF0YTpwZSxyZW5kZXJpbmc6ITB9LHJlKSxudWxsKX19fSk7ZnVuY3Rpb24gRWwoXyl7bGV0IEY9QS5yZWYoIiIpO3JldHVybiBBLnJlYWN0aXZlKHt3aWR0aDowLGhlaWdodDowLGRhdGE6Rn0pfWZ1bmN0aW9uIHhzKF8sRixxKXtwbyhGLmFkcGlkLF8ud2lkdGgsXy5oZWlnaHQsVz0+e18uZGF0YT1XLHEoZ28ubG9hZCx7fSl9LFc9PntxKGdvLmVycm9yLFcpfSl9dmFyIFFzPXtOYXZpZ2F0b3I6ZWksTGFiZWw6UGksQnV0dG9uOklyLE1vdmFibGVBcmVhOnBpLE1vdmFibGVWaWV3OnduLFByb2dyZXNzOlJlLFBpY2tlclZpZXc6UmksUGlja2VyVmlld0NvbHVtbjpiYSxQaWNrZXI6am8sVVNsaWRlcjpOcixTd2l0Y2g6TGEsQ2hlY2tib3g6aWksQ2hlY2tib3hHcm91cDp0cixSYWRpbzpWLFJhZGlvR3JvdXA6WixGb3JtOkNuLEljb246Tm8sU3dpcGVyOkNzLFN3aXBlckl0ZW06d2EsUmljaFRleHQ6WHMsQWQ6a3MsQWREcmF3OlJzfTtyZXR1cm4gUXN9KEIsR2UsQXQpO3JldHVybiB0bn1mdW5jdGlvbiBBSSh2LGMpe2xldHtVbmlTaGFyZWQ6YixWdWU6VH09YztmdW5jdGlvbiBCKGssdSxJKXtsZXQgR2U9ay4kW3VdO3JldHVybiBHZSYmYi5pbnZva2VBcnJheUZucyhHZSxJKX1sZXQgQz12LnNldHVwO3JldHVybiB2LmluaGVyaXRBdHRycz0hMSx2LnNldHVwPShrLHUpPT57bGV0e2F0dHJzOntfX3BhZ2VJZDpJLF9fcGFnZVBhdGg6R2UsX19wYWdlUXVlcnk6QXR9fT11LHRuPWMuX191bmlSb3V0ZXMuZmluZChFbj0+RW4ubWV0YS5yb3V0ZT09PUdlKSxBPVQuZ2V0Q3VycmVudEluc3RhbmNlKCksc2U9QS5wcm94eTtpZih0biYmKHRuLm1ldGEuaXNTdWJOVnVlfHxPSShzZSxjLHtfX3BhZ2VJZDpJLF9fcGFnZVBhdGg6R2V9KSksVC5vbk1vdW50ZWQoKCk9PntULm5leHRUaWNrKCgpPT57QihzZSxiLk9OX1JFQURZKX0pLEEub25QYWdlU2Nyb2xsJiZzZS4kZWwuYWRkRXZlbnQoInNjcm9sbCIsRW49PntFbi5zY3JvbGxUb3A9RW4uZGV0YWlsLnNjcm9sbFRvcCxCKHNlLGIuT05fUEFHRV9TQ1JPTEwsRW4pfSksQS5vblJlYWNoQm90dG9tJiZzZS4kZWwuYWRkRXZlbnQoInNjcm9sbHRvbG93ZXIiLEVuPT57QihzZSxiLk9OX1JFQUNIX0JPVFRPTSxFbil9KX0pLFQub25CZWZvcmVVbm1vdW50KCgpPT57QihzZSxiLk9OX1VOTE9BRCl9KSxDKXJldHVybiBDKEF0LHUpfSx2fWZ1bmN0aW9uIE9JKHYsYyx7X19wYWdlSWQ6YixfX3BhZ2VQYXRoOlR9KXtsZXQgQj1jLmdldEN1cnJlbnRQYWdlcygpLEM9QltCLmxlbmd0aC0xXTtpZihDJiZDLl9fc2V0dXApQy5fX3NldHVwKHYsQyk7ZWxzZXtsZXQgaz0iLyIrVDtyZXR1cm4gYy5fX3JlZ2lzdGVyUGFnZSh7dXJsOmsscGF0aDprLHF1ZXJ5Ont9LG9wZW5UeXBlOiJsYXVuY2giLHdlYnZpZXc6e2lkOmIrIiJ9LG52dWVQYWdlVm06dn0pfX12YXIgQmM9e30seGc7ZnVuY3Rpb24gQmcodil7eGc9dn12YXIgUXU7ZnVuY3Rpb24gVEkodil7aWYoUXUpcmV0dXJuIFF1O2xldCBjPW5ldyB2LkVtaXR0ZXI7cmV0dXJuIFF1PXtvbihiLFQpe3JldHVybiBjLm9uKGIsVCl9LG9uY2UoYixUKXtyZXR1cm4gYy5vbmNlKGIsVCl9LG9mZihiLFQpe3JldHVybiBjLm9mZihiLFQpfSxlbWl0KGIsLi4uVCl7cmV0dXJuIGMuZW1pdChiLC4uLlQpfX0sUXV9ZnVuY3Rpb24gSUkodil7cmV0dXJuKGMsYixUKT0+e2xldHtudnVlOkJ9PWIsQz1YdSh2LGIpO2IuVnVlPUMsQmNbY109e2luc3RhbmNlSWQ6Yyxjb25maWc6Qi5jb25maWcsZG9jdW1lbnQ6Qi5kb2N1bWVudCxkYXRhOlR9O2xldHtjcmVhdGVBcHA6a309QztDLmNyZWF0ZVZ1ZUFwcD1DLmNyZWF0ZUFwcD0odSxJKT0+KGIuX191bmlDb25maWcuc3R5bGVzPXUuc3R5bGVzfHxbXSxrKHUsSSkudXNlKFBJLGMsYikpLEMuY3JlYXRlUGFnZUFwcD0odSxJKT0+e0FJKHUsYik7bGV0IEdlPUkuJHN0b3JlO2RlbGV0ZSBJLiRzdG9yZTtsZXQgQXQ9ayh1LEkpO3JldHVybiBHZSYmQXQudXNlKEdlKSxBdC51c2Uoa0ksQyxjLGIpfX19dmFyIFBJPXtpbnN0YWxsKHYsYyxiKXtndShiKS5pbml0QXBwKHYpLE5JKHYsYyxiKX19O2Z1bmN0aW9uIE5JKHYsYyxiKXtsZXR7bW91bnQ6VH09dixCPUJjW2NdO3JldHVybiB2Lm1vdW50PUM9PntsZXQgaz1DPT09IiNhcHAiLHU9Qi5hcHA9VChNZyhCLmRvY3VtZW50LHtpc1Jvb3Q6a30pKTtyZXR1cm4gayYmYi5fX3JlZ2lzdGVyQXBwKHUpLHV9LHZ9dmFyIGtJPXtpbnN0YWxsKHYsYyxiLFQpe2xldHt3ZWV4OkIscGx1czpDLEJyb2FkY2FzdENoYW5uZWw6ayxWdWVTaGFyZWQ6dSxVbmlTaGFyZWQ6SSxnZXRDdXJyZW50UGFnZXM6R2Usc2V0VGltZW91dDpBdCxjbGVhclRpbWVvdXQ6dG59PVQ7di5jb25maWcuZ2xvYmFsUHJvcGVydGllcy4kcmVxdWlyZU5hdGl2ZVBsdWdpbj1CLnJlcXVpcmVNb2R1bGU7bGV0IEE9Q0koe3VuaTp4ZyxWdWU6Yyx3ZWV4OkIscGx1czpDLEJyb2FkY2FzdENoYW5uZWw6ayxVbmlWaWV3SlNCcmlkZ2U6VEkoSSksVnVlU2hhcmVkOnUsVW5pU2hhcmVkOkksZ2V0Q3VycmVudFBhZ2VzOkdlLHNldFRpbWVvdXQ6QXQsY2xlYXJUaW1lb3V0OnRufSk7T2JqZWN0LmtleXMoQSkuZm9yRWFjaChzZT0+e3YuY29tcG9uZW50KGMuaHlwaGVuYXRlKHNlKSxBW3NlXSl9KSxndShUKS5pbml0QXBwKHYpLFJJKHYsYixUKX19O2Z1bmN0aW9uIFJJKHYsYyx7bnZ1ZTpifSl7bGV0e2NvbmZpZzp7Y29tcGlsZXJPcHRpb25zOlR9LG1vdW50OkJ9PXY7VC5pc0N1c3RvbUVsZW1lbnQ9az0+ISFiLnN1cHBvcnRzKGBAY29tcG9uZW50LyR7a31gKTtsZXQgQz1CY1tjXTtyZXR1cm4gdi5tb3VudD1rPT57bGV0IHU9az09PSIjcm9vdCIsST1DLmFwcD1CKE1nKEMuZG9jdW1lbnQse2lzUm9vdDp1fSkpO2lmKHUpdHJ5e2IuZG9jdW1lbnQudGFza0NlbnRlci5zZW5kKCJkb20iLHthY3Rpb246ImNyZWF0ZUZpbmlzaCJ9LFtdKX1jYXRjaChHZSl7fXJldHVybiBJfSx2fWZ1bmN0aW9uIE1nKHYse2lzUm9vdDpjfSl7aWYoYylyZXR1cm4gdi5kb2N1bWVudEVsZW1lbnQ7bGV0IGI9di5jcmVhdGVDb21tZW50KCJyb290Iik7cmV0dXJuIHYuZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKGIpLGJ9ZnVuY3Rpb24gRGcodil7bGV0IGM9QmNbdl07aWYoYyYmYy5hcHAmJmMuZG9jdW1lbnQpe3RyeXtjLmFwcC4kLmFwcENvbnRleHQuYXBwLnVubW91bnQoKSxjLmRvY3VtZW50LmRlc3Ryb3koKX1jYXRjaChiKXt9ZGVsZXRlIGMuZG9jdW1lbnQsZGVsZXRlIGMuYXBwfWRlbGV0ZSBCY1t2XX1mdW5jdGlvbiBGZyh2KXtsZXQgYz1CY1t2XTtpZighY3x8IWMuYXBwKXJldHVybiBuZXcgRXJyb3IoYHJlZnJlc2hJbnN0YW5jZTogaW5zdGFuY2UgJHt2fSBub3QgZm91bmQhYCk7Yy5kb2N1bWVudC50YXNrQ2VudGVyLnNlbmQoImRvbSIse2FjdGlvbjoicmVmcmVzaEZpbmlzaCJ9LFtdKX1mdW5jdGlvbiB4SSh2LGMpe2xldHtVbmlTaGFyZWQ6YixWdWVTaGFyZWQ6VCxWdWVSZWFjdGl2aXR5OkJ9PXY7dmFyIEM9ZnVuY3Rpb24oayx1LEksR2UpeyJ1c2Ugc3RyaWN0Ijt2YXIgQXQ9W107ZnVuY3Rpb24gdG4obyl7QXQucHVzaChvKX1mdW5jdGlvbiBBKCl7QXQucG9wKCl9ZnVuY3Rpb24gc2Uobyl7SS5wYXVzZVRyYWNraW5nKCk7Zm9yKHZhciBsPUF0Lmxlbmd0aD9BdFtBdC5sZW5ndGgtMV0uY29tcG9uZW50Om51bGwsaD1sJiZsLmFwcENvbnRleHQuY29uZmlnLndhcm5IYW5kbGVyLG09RW4oKSxTPWFyZ3VtZW50cy5sZW5ndGgsTz1uZXcgQXJyYXkoUz4xP1MtMTowKSxNPTE7TTxTO00rKylPW00tMV09YXJndW1lbnRzW01dO2lmKGgpRnQoaCxsLDExLFtvK08uam9pbigiIiksbCYmbC5wcm94eSxtLm1hcChIPT57dmFye3Zub2RlOm5lfT1IO3JldHVybiJhdCA8Ii5jb25jYXQoZGEobCxuZS50eXBlKSwiPiIpfSkuam9pbihgCmApLG1dKTtlbHNle3ZhciBZPVsiW1Z1ZSB3YXJuXTogIi5jb25jYXQobyksLi4uT107bS5sZW5ndGgmJlkucHVzaChgCmAsLi4uR24obSkpLGNvbnNvbGUud2FybiguLi5ZKX1JLnJlc2V0VHJhY2tpbmcoKX1mdW5jdGlvbiBFbigpe3ZhciBvPUF0W0F0Lmxlbmd0aC0xXTtpZighbylyZXR1cm5bXTtmb3IodmFyIGw9W107bzspe3ZhciBoPWxbMF07aCYmaC52bm9kZT09PW8/aC5yZWN1cnNlQ291bnQrKzpsLnB1c2goe3Zub2RlOm8scmVjdXJzZUNvdW50OjB9KTt2YXIgbT1vLmNvbXBvbmVudCYmby5jb21wb25lbnQucGFyZW50O289bSYmbS52bm9kZX1yZXR1cm4gbH1mdW5jdGlvbiBHbihvKXt2YXIgbD1bXTtyZXR1cm4gby5mb3JFYWNoKChoLG0pPT57bC5wdXNoKC4uLm09PT0wP1tdOltgCmBdLC4uLmJ0KGgpKX0pLGx9ZnVuY3Rpb24gYnQobyl7dmFye3Zub2RlOmwscmVjdXJzZUNvdW50Omh9PW8sbT1oPjA/Ii4uLiAoIi5jb25jYXQoaCwiIHJlY3Vyc2l2ZSBjYWxscykiKToiIixTPWwuY29tcG9uZW50P2wuY29tcG9uZW50LnBhcmVudD09bnVsbDohMSxPPSIgYXQgPCIuY29uY2F0KGRhKGwuY29tcG9uZW50LGwudHlwZSxTKSksTT0iPiIrbTtyZXR1cm4gbC5wcm9wcz9bTywuLi5RKGwucHJvcHMpLE1dOltPK01dfWZ1bmN0aW9uIFEobyl7dmFyIGw9W10saD1PYmplY3Qua2V5cyhvKTtyZXR1cm4gaC5zbGljZSgwLDMpLmZvckVhY2gobT0+e2wucHVzaCguLi5hZShtLG9bbV0pKX0pLGgubGVuZ3RoPjMmJmwucHVzaCgiIC4uLiIpLGx9ZnVuY3Rpb24gYWUobyxsLGgpe3JldHVybiB1LmlzU3RyaW5nKGwpPyhsPUpTT04uc3RyaW5naWZ5KGwpLGg/bDpbIiIuY29uY2F0KG8sIj0iKS5jb25jYXQobCldKTp0eXBlb2YgbD09Im51bWJlciJ8fHR5cGVvZiBsPT0iYm9vbGVhbiJ8fGw9PW51bGw/aD9sOlsiIi5jb25jYXQobywiPSIpLmNvbmNhdChsKV06SS5pc1JlZihsKT8obD1hZShvLEkudG9SYXcobC52YWx1ZSksITApLGg/bDpbIiIuY29uY2F0KG8sIj1SZWY8IiksbCwiPiJdKTp1LmlzRnVuY3Rpb24obCk/WyIiLmNvbmNhdChvLCI9Zm4iKS5jb25jYXQobC5uYW1lPyI8Ii5jb25jYXQobC5uYW1lLCI+Iik6IiIpXToobD1JLnRvUmF3KGwpLGg/bDpbIiIuY29uY2F0KG8sIj0iKSxsXSl9dmFyIGhuPXtzcDoic2VydmVyUHJlZmV0Y2ggaG9vayIsYmM6ImJlZm9yZUNyZWF0ZSBob29rIixjOiJjcmVhdGVkIGhvb2siLGJtOiJiZWZvcmVNb3VudCBob29rIixtOiJtb3VudGVkIGhvb2siLGJ1OiJiZWZvcmVVcGRhdGUgaG9vayIsdToidXBkYXRlZCIsYnVtOiJiZWZvcmVVbm1vdW50IGhvb2siLHVtOiJ1bm1vdW50ZWQgaG9vayIsYToiYWN0aXZhdGVkIGhvb2siLGRhOiJkZWFjdGl2YXRlZCBob29rIixlYzoiZXJyb3JDYXB0dXJlZCBob29rIixydGM6InJlbmRlclRyYWNrZWQgaG9vayIscnRnOiJyZW5kZXJUcmlnZ2VyZWQgaG9vayIsWzBdOiJzZXR1cCBmdW5jdGlvbiIsWzFdOiJyZW5kZXIgZnVuY3Rpb24iLFsyXToid2F0Y2hlciBnZXR0ZXIiLFszXToid2F0Y2hlciBjYWxsYmFjayIsWzRdOiJ3YXRjaGVyIGNsZWFudXAgZnVuY3Rpb24iLFs1XToibmF0aXZlIGV2ZW50IGhhbmRsZXIiLFs2XToiY29tcG9uZW50IGV2ZW50IGhhbmRsZXIiLFs3XToidm5vZGUgaG9vayIsWzhdOiJkaXJlY3RpdmUgaG9vayIsWzldOiJ0cmFuc2l0aW9uIGhvb2siLFsxMF06ImFwcCBlcnJvckhhbmRsZXIiLFsxMV06ImFwcCB3YXJuSGFuZGxlciIsWzEyXToicmVmIGZ1bmN0aW9uIixbMTNdOiJhc3luYyBjb21wb25lbnQgbG9hZGVyIixbMTRdOiJzY2hlZHVsZXIgZmx1c2guIFRoaXMgaXMgbGlrZWx5IGEgVnVlIGludGVybmFscyBidWcuIFBsZWFzZSBvcGVuIGFuIGlzc3VlIGF0IGh0dHBzOi8vbmV3LWlzc3VlLnZ1ZWpzLm9yZy8/cmVwbz12dWVqcy9jb3JlIn07ZnVuY3Rpb24gRnQobyxsLGgsbSl7dmFyIFM7dHJ5e1M9bT9vKC4uLm0pOm8oKX1jYXRjaChPKXt6cihPLGwsaCl9cmV0dXJuIFN9ZnVuY3Rpb24gVnQobyxsLGgsbSl7aWYodS5pc0Z1bmN0aW9uKG8pKXt2YXIgUz1GdChvLGwsaCxtKTtyZXR1cm4gUyYmdS5pc1Byb21pc2UoUykmJlMuY2F0Y2goWT0+e3pyKFksbCxoKX0pLFN9Zm9yKHZhciBPPVtdLE09MDtNPG8ubGVuZ3RoO00rKylPLnB1c2goVnQob1tNXSxsLGgsbSkpO3JldHVybiBPfWZ1bmN0aW9uIHpyKG8sbCxoKXt2YXIgbT1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106ITAsUz1sP2wudm5vZGU6bnVsbDtpZihsKXtmb3IodmFyIE89bC5wYXJlbnQsTT1sLnByb3h5LFk9aG5baF18fGg7Tzspe3ZhciBIPU8uZWM7aWYoSCl7Zm9yKHZhciBuZT0wO25lPEgubGVuZ3RoO25lKyspaWYoSFtuZV0obyxNLFkpPT09ITEpcmV0dXJufU89Ty5wYXJlbnR9dmFyIE5lPWwuYXBwQ29udGV4dC5jb25maWcuZXJyb3JIYW5kbGVyO2lmKE5lKXtGdChOZSxudWxsLDEwLFtvLE0sWV0pO3JldHVybn19ZWkobyxoLFMsbSl9ZnVuY3Rpb24gZWkobyxsLGgpe3ZhciBtPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTohMDt7dmFyIFM9aG5bbF18fGw7aWYoaCYmdG4oaCksc2UoIlVuaGFuZGxlZCBlcnJvciIuY29uY2F0KFM/IiBkdXJpbmcgZXhlY3V0aW9uIG9mICIuY29uY2F0KFMpOiIiKSksaCYmQSgpLG0pdGhyb3cgbztjb25zb2xlLmVycm9yKG8pfX12YXIgVHI9ITEsbW49ITEsR3Q9W10sYW49MCxQbj1bXSxVbj1udWxsLGlyPTAsRm49W10sQmU9bnVsbCxhdD0wLHl0PVByb21pc2UucmVzb2x2ZSgpLFp0PW51bGwsc249bnVsbCxjbj0xMDA7ZnVuY3Rpb24gZ3Iobyl7dmFyIGw9WnR8fHl0O3JldHVybiBvP2wudGhlbih0aGlzP28uYmluZCh0aGlzKTpvKTpsfWZ1bmN0aW9uIHlyKG8pe2Zvcih2YXIgbD1hbisxLGg9R3QubGVuZ3RoO2w8aDspe3ZhciBtPWwraD4+PjEsUz1oaShHdFttXSk7UzxvP2w9bSsxOmg9bX1yZXR1cm4gbH1mdW5jdGlvbiBJaShvKXsoIUd0Lmxlbmd0aHx8IUd0LmluY2x1ZGVzKG8sVHImJm8uYWxsb3dSZWN1cnNlP2FuKzE6YW4pKSYmbyE9PXNuJiYoby5pZD09bnVsbD9HdC5wdXNoKG8pOkd0LnNwbGljZSh5cihvLmlkKSwwLG8pLFBpKCkpfWZ1bmN0aW9uIFBpKCl7IVRyJiYhbW4mJihtbj0hMCxadD15dC50aGVuKFlpKSl9ZnVuY3Rpb24gb3Iobyl7dmFyIGw9R3QuaW5kZXhPZihvKTtsPmFuJiZHdC5zcGxpY2UobCwxKX1mdW5jdGlvbiB6aShvLGwsaCxtKXt1LmlzQXJyYXkobyk/aC5wdXNoKC4uLm8pOighbHx8IWwuaW5jbHVkZXMobyxvLmFsbG93UmVjdXJzZT9tKzE6bSkpJiZoLnB1c2gobyksUGkoKX1mdW5jdGlvbiAkbyhvKXt6aShvLFVuLFBuLGlyKX1mdW5jdGlvbiBOaShvKXt6aShvLEJlLEZuLGF0KX1mdW5jdGlvbiBXaShvKXt2YXIgbD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06bnVsbDtpZihQbi5sZW5ndGgpe2Zvcihzbj1sLFVuPVsuLi5uZXcgU2V0KFBuKV0sUG4ubGVuZ3RoPTAsbz1vfHxuZXcgTWFwLGlyPTA7aXI8VW4ubGVuZ3RoO2lyKyspTHIobyxVbltpcl0pfHxVbltpcl0oKTtVbj1udWxsLGlyPTAsc249bnVsbCxXaShvLGwpfX1mdW5jdGlvbiBHaShvKXtpZihXaSgpLEZuLmxlbmd0aCl7dmFyIGw9Wy4uLm5ldyBTZXQoRm4pXTtpZihGbi5sZW5ndGg9MCxCZSl7QmUucHVzaCguLi5sKTtyZXR1cm59Zm9yKEJlPWwsbz1vfHxuZXcgTWFwLEJlLnNvcnQoKGgsbSk9PmhpKGgpLWhpKG0pKSxhdD0wO2F0PEJlLmxlbmd0aDthdCsrKUxyKG8sQmVbYXRdKXx8QmVbYXRdKCk7QmU9bnVsbCxhdD0wfX12YXIgaGk9bz0+by5pZD09bnVsbD8xLzA6by5pZDtmdW5jdGlvbiBZaShvKXttbj0hMSxUcj0hMCxvPW98fG5ldyBNYXAsV2kobyksR3Quc29ydCgobSxTKT0+aGkobSktaGkoUykpO3ZhciBsPW09PkxyKG8sbSk7dHJ5e2Zvcihhbj0wO2FuPEd0Lmxlbmd0aDthbisrKXt2YXIgaD1HdFthbl07aWYoaCYmaC5hY3RpdmUhPT0hMSl7aWYobChoKSljb250aW51ZTtGdChoLG51bGwsMTQpfX19ZmluYWxseXthbj0wLEd0Lmxlbmd0aD0wLEdpKG8pLFRyPSExLFp0PW51bGwsKEd0Lmxlbmd0aHx8UG4ubGVuZ3RofHxGbi5sZW5ndGgpJiZZaShvKX19ZnVuY3Rpb24gTHIobyxsKXtpZighby5oYXMobCkpby5zZXQobCwxKTtlbHNle3ZhciBoPW8uZ2V0KGwpO2lmKGg+Y24pe3ZhciBtPWwub3duZXJJbnN0YW5jZSxTPW0mJmdzKG0udHlwZSk7cmV0dXJuIHNlKCJNYXhpbXVtIHJlY3Vyc2l2ZSB1cGRhdGVzIGV4Y2VlZGVkIi5jb25jYXQoUz8iIGluIGNvbXBvbmVudCA8Ii5jb25jYXQoUywiPiIpOiIiLCIuICIpKyJUaGlzIG1lYW5zIHlvdSBoYXZlIGEgcmVhY3RpdmUgZWZmZWN0IHRoYXQgaXMgbXV0YXRpbmcgaXRzIG93biBkZXBlbmRlbmNpZXMgYW5kIHRodXMgcmVjdXJzaXZlbHkgdHJpZ2dlcmluZyBpdHNlbGYuIFBvc3NpYmxlIHNvdXJjZXMgaW5jbHVkZSBjb21wb25lbnQgdGVtcGxhdGUsIHJlbmRlciBmdW5jdGlvbiwgdXBkYXRlZCBob29rIG9yIHdhdGNoZXIgc291cmNlIGZ1bmN0aW9uLiIpLCEwfWVsc2Ugby5zZXQobCxoKzEpfX12YXIgVnI9ITEsYXI9bmV3IFNldDt1LmdldEdsb2JhbFRoaXMoKS5fX1ZVRV9ITVJfUlVOVElNRV9fPXtjcmVhdGVSZWNvcmQ6c3IoQ28pLHJlcmVuZGVyOnNyKFFuKSxyZWxvYWQ6c3IocGkpfTt2YXIgSXI9bmV3IE1hcDtmdW5jdGlvbiBxaShvKXt2YXIgbD1vLnR5cGUuX19obXJJZCxoPUlyLmdldChsKTtofHwoQ28obCxvLnR5cGUpLGg9SXIuZ2V0KGwpKSxoLmluc3RhbmNlcy5hZGQobyl9ZnVuY3Rpb24gU28obyl7SXIuZ2V0KG8udHlwZS5fX2htcklkKS5pbnN0YW5jZXMuZGVsZXRlKG8pfWZ1bmN0aW9uIENvKG8sbCl7cmV0dXJuIElyLmhhcyhvKT8hMTooSXIuc2V0KG8se2luaXRpYWxEZWY6dGkobCksaW5zdGFuY2VzOm5ldyBTZXR9KSwhMCl9ZnVuY3Rpb24gdGkobyl7cmV0dXJuIFZzKG8pP28uX192Y2NPcHRzOm99ZnVuY3Rpb24gUW4obyxsKXt2YXIgaD1Jci5nZXQobyk7IWh8fChoLmluaXRpYWxEZWYucmVuZGVyPWwsWy4uLmguaW5zdGFuY2VzXS5mb3JFYWNoKG09PntsJiYobS5yZW5kZXI9bCx0aShtLnR5cGUpLnJlbmRlcj1sKSxtLnJlbmRlckNhY2hlPVtdLFZyPSEwLG0udXBkYXRlKCksVnI9ITF9KSl9ZnVuY3Rpb24gcGkobyxsKXt2YXIgaD1Jci5nZXQobyk7aWYoISFoKXtsPXRpKGwpLG5pKGguaW5pdGlhbERlZixsKTt2YXIgbT1bLi4uaC5pbnN0YW5jZXNdO2Zvcih2YXIgUyBvZiBtKXt2YXIgTz10aShTLnR5cGUpO2FyLmhhcyhPKXx8KE8hPT1oLmluaXRpYWxEZWYmJm5pKE8sbCksYXIuYWRkKE8pKSxTLmFwcENvbnRleHQub3B0aW9uc0NhY2hlLmRlbGV0ZShTLnR5cGUpLFMuY2VSZWxvYWQ/KGFyLmFkZChPKSxTLmNlUmVsb2FkKGwuc3R5bGVzKSxhci5kZWxldGUoTykpOlMucGFyZW50PyhJaShTLnBhcmVudC51cGRhdGUpLFMucGFyZW50LnR5cGUuX19hc3luY0xvYWRlciYmUy5wYXJlbnQuY2VSZWxvYWQmJlMucGFyZW50LmNlUmVsb2FkKGwuc3R5bGVzKSk6Uy5hcHBDb250ZXh0LnJlbG9hZD9TLmFwcENvbnRleHQucmVsb2FkKCk6dHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCI/d2luZG93LmxvY2F0aW9uLnJlbG9hZCgpOmNvbnNvbGUud2FybigiW0hNUl0gUm9vdCBvciBtYW51YWxseSBtb3VudGVkIGluc3RhbmNlIG1vZGlmaWVkLiBGdWxsIHJlbG9hZCByZXF1aXJlZC4iKX1OaSgoKT0+e2Zvcih2YXIgTSBvZiBtKWFyLmRlbGV0ZSh0aShNLnR5cGUpKX0pfX1mdW5jdGlvbiBuaShvLGwpe3UuZXh0ZW5kKG8sbCk7Zm9yKHZhciBoIGluIG8paCE9PSJfX2ZpbGUiJiYhKGggaW4gbCkmJmRlbGV0ZSBvW2hdfWZ1bmN0aW9uIHNyKG8pe3JldHVybihsLGgpPT57dHJ5e3JldHVybiBvKGwsaCl9Y2F0Y2gobSl7Y29uc29sZS5lcnJvcihtKSxjb25zb2xlLndhcm4oIltITVJdIFNvbWV0aGluZyB3ZW50IHdyb25nIGR1cmluZyBWdWUgY29tcG9uZW50IGhvdC1yZWxvYWQuIEZ1bGwgcmVsb2FkIHJlcXVpcmVkLiIpfX19ay5kZXZ0b29scz12b2lkIDA7dmFyIGdpPVtdLHZpPSExO2Z1bmN0aW9uIG1pKG8pe2Zvcih2YXIgbD1hcmd1bWVudHMubGVuZ3RoLGg9bmV3IEFycmF5KGw+MT9sLTE6MCksbT0xO208bDttKyspaFttLTFdPWFyZ3VtZW50c1ttXTtrLmRldnRvb2xzP2suZGV2dG9vbHMuZW1pdChvLC4uLmgpOnZpfHxnaS5wdXNoKHtldmVudDpvLGFyZ3M6aH0pfWZ1bmN0aW9uIEVyKG8sbCl7dmFyIGgsbTtpZihrLmRldnRvb2xzPW8say5kZXZ0b29scylrLmRldnRvb2xzLmVuYWJsZWQ9ITAsZ2kuZm9yRWFjaChPPT57dmFye2V2ZW50Ok0sYXJnczpZfT1PO3JldHVybiBrLmRldnRvb2xzLmVtaXQoTSwuLi5ZKX0pLGdpPVtdO2Vsc2UgaWYodHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJndpbmRvdy5IVE1MRWxlbWVudCYmISgobT0oaD13aW5kb3cubmF2aWdhdG9yKT09PW51bGx8fGg9PT12b2lkIDA/dm9pZCAwOmgudXNlckFnZW50KT09PW51bGx8fG09PT12b2lkIDA/dm9pZCAwOm0uaW5jbHVkZXMoImpzZG9tIikpKXt2YXIgUz1sLl9fVlVFX0RFVlRPT0xTX0hPT0tfUkVQTEFZX189bC5fX1ZVRV9ERVZUT09MU19IT09LX1JFUExBWV9ffHxbXTtTLnB1c2goTz0+e0VyKE8sbCl9KSxzZXRUaW1lb3V0KCgpPT57ay5kZXZ0b29sc3x8KGwuX19WVUVfREVWVE9PTFNfSE9PS19SRVBMQVlfXz1udWxsLHZpPSEwLGdpPVtdKX0sM2UzKX1lbHNlIHZpPSEwLGdpPVtdfWZ1bmN0aW9uIFByKG8sbCl7bWkoImFwcDppbml0IixvLGwse0ZyYWdtZW50Okh0LFRleHQ6anQsQ29tbWVudDppdCxTdGF0aWM6Zm59KX1mdW5jdGlvbiBXcihvKXttaSgiYXBwOnVubW91bnQiLG8pfXZhciBHcj1KaSgiY29tcG9uZW50OmFkZGVkIiksZXI9SmkoImNvbXBvbmVudDp1cGRhdGVkIiksS2k9SmkoImNvbXBvbmVudDpyZW1vdmVkIik7ZnVuY3Rpb24gSmkobyl7cmV0dXJuIGw9PnttaShvLGwuYXBwQ29udGV4dC5hcHAsbC51aWQsbC5wYXJlbnQ/bC5wYXJlbnQudWlkOnZvaWQgMCxsKX19dmFyIHVvPUFvKCJwZXJmOnN0YXJ0IiksX2k9QW8oInBlcmY6ZW5kIik7ZnVuY3Rpb24gQW8obyl7cmV0dXJuKGwsaCxtKT0+e21pKG8sbC5hcHBDb250ZXh0LmFwcCxsLnVpZCxsLGgsbSl9fWZ1bmN0aW9uIFVvKG8sbCxoKXttaSgiY29tcG9uZW50OmVtaXQiLG8uYXBwQ29udGV4dC5hcHAsbyxsLGgpfWZ1bmN0aW9uIF9hKG8sbCl7aWYoIW8uaXNVbm1vdW50ZWQpe2Zvcih2YXIgaD1vLnZub2RlLnByb3BzfHx1LkVNUFRZX09CSixtPWFyZ3VtZW50cy5sZW5ndGgsUz1uZXcgQXJyYXkobT4yP20tMjowKSxPPTI7TzxtO08rKylTW08tMl09YXJndW1lbnRzW09dO3t2YXJ7ZW1pdHNPcHRpb25zOk0scHJvcHNPcHRpb25zOltZXX09bztpZihNKWlmKCEobCBpbiBNKSkoIVl8fCEodS50b0hhbmRsZXJLZXkobClpbiBZKSkmJnNlKCdDb21wb25lbnQgZW1pdHRlZCBldmVudCAiJy5jb25jYXQobCwnIiBidXQgaXQgaXMgbmVpdGhlciBkZWNsYXJlZCBpbiAnKSsndGhlIGVtaXRzIG9wdGlvbiBub3IgYXMgYW4gIicuY29uY2F0KHUudG9IYW5kbGVyS2V5KGwpLCciIHByb3AuJykpO2Vsc2V7dmFyIEg9TVtsXTtpZih1LmlzRnVuY3Rpb24oSCkpe3ZhciBuZT1IKC4uLlMpO25lfHxzZSgnSW52YWxpZCBldmVudCBhcmd1bWVudHM6IGV2ZW50IHZhbGlkYXRpb24gZmFpbGVkIGZvciBldmVudCAiJy5jb25jYXQobCwnIi4nKSl9fX12YXIgTmU9UyxmZT1sLnN0YXJ0c1dpdGgoInVwZGF0ZToiKSxjZT1mZSYmbC5zbGljZSg3KTtpZihjZSYmY2UgaW4gaCl7dmFyIEZlPSIiLmNvbmNhdChjZT09PSJtb2RlbFZhbHVlIj8ibW9kZWwiOmNlLCJNb2RpZmllcnMiKSx7bnVtYmVyOlZlLHRyaW06bHR9PWhbRmVdfHx1LkVNUFRZX09CSjtsdCYmKE5lPVMubWFwKG50PT5udC50cmltKCkpKSxWZSYmKE5lPVMubWFwKHUudG9OdW1iZXIpKX1VbyhvLGwsTmUpO3t2YXIgbXQ9bC50b0xvd2VyQ2FzZSgpO210IT09bCYmaFt1LnRvSGFuZGxlcktleShtdCldJiZzZSgnRXZlbnQgIicuY29uY2F0KG10LCciIGlzIGVtaXR0ZWQgaW4gY29tcG9uZW50ICcpKyIiLmNvbmNhdChkYShvLG8udHlwZSksJyBidXQgdGhlIGhhbmRsZXIgaXMgcmVnaXN0ZXJlZCBmb3IgIicpLmNvbmNhdChsLCciLiAnKSsiTm90ZSB0aGF0IEhUTUwgYXR0cmlidXRlcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSBhbmQgeW91IGNhbm5vdCB1c2Ugdi1vbiB0byBsaXN0ZW4gdG8gY2FtZWxDYXNlIGV2ZW50cyB3aGVuIHVzaW5nIGluLURPTSB0ZW1wbGF0ZXMuICIrJ1lvdSBzaG91bGQgcHJvYmFibHkgdXNlICInLmNvbmNhdCh1Lmh5cGhlbmF0ZShsKSwnIiBpbnN0ZWFkIG9mICInKS5jb25jYXQobCwnIi4nKSl9dmFyIHdlLGRlPWhbd2U9dS50b0hhbmRsZXJLZXkobCldfHxoW3dlPXUudG9IYW5kbGVyS2V5KHUuY2FtZWxpemUobCkpXTshZGUmJmZlJiYoZGU9aFt3ZT11LnRvSGFuZGxlcktleSh1Lmh5cGhlbmF0ZShsKSldKSxkZSYmVnQoZGUsbyw2LE5lKTt2YXIgU2U9aFt3ZSsiT25jZSJdO2lmKFNlKXtpZighby5lbWl0dGVkKW8uZW1pdHRlZD17fTtlbHNlIGlmKG8uZW1pdHRlZFt3ZV0pcmV0dXJuO28uZW1pdHRlZFt3ZV09ITAsVnQoU2Usbyw2LE5lKX19fWZ1bmN0aW9uIEhvKG8sbCl7dmFyIGg9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOiExLG09bC5lbWl0c0NhY2hlLFM9bS5nZXQobyk7aWYoUyE9PXZvaWQgMClyZXR1cm4gUzt2YXIgTz1vLmVtaXRzLE09e30sWT0hMTtpZighdS5pc0Z1bmN0aW9uKG8pKXt2YXIgSD1uZT0+e3ZhciBOZT1IbyhuZSxsLCEwKTtOZSYmKFk9ITAsdS5leHRlbmQoTSxOZSkpfTshaCYmbC5taXhpbnMubGVuZ3RoJiZsLm1peGlucy5mb3JFYWNoKEgpLG8uZXh0ZW5kcyYmSChvLmV4dGVuZHMpLG8ubWl4aW5zJiZvLm1peGlucy5mb3JFYWNoKEgpfXJldHVybiFPJiYhWT8obS5zZXQobyxudWxsKSxudWxsKToodS5pc0FycmF5KE8pP08uZm9yRWFjaChuZT0+TVtuZV09bnVsbCk6dS5leHRlbmQoTSxPKSxtLnNldChvLE0pLE0pfWZ1bmN0aW9uIFppKG8sbCl7cmV0dXJuIW98fCF1LmlzT24obCk/ITE6KGw9bC5zbGljZSgyKS5yZXBsYWNlKC9PbmNlJC8sIiIpLHUuaGFzT3duKG8sbFswXS50b0xvd2VyQ2FzZSgpK2wuc2xpY2UoMSkpfHx1Lmhhc093bihvLHUuaHlwaGVuYXRlKGwpKXx8dS5oYXNPd24obyxsKSl9dmFyIHduPW51bGwsU249bnVsbDtmdW5jdGlvbiBObihvKXt2YXIgbD13bjtyZXR1cm4gd249byxTbj1vJiZvLnR5cGUuX19zY29wZUlkfHxudWxsLGx9ZnVuY3Rpb24gbHIobyl7U249b31mdW5jdGlvbiBPbygpe1NuPW51bGx9dmFyIER0PW89PlJlO2Z1bmN0aW9uIFJlKG8pe3ZhciBsPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp3bjtpZighbHx8by5fbilyZXR1cm4gbzt2YXIgaD1mdW5jdGlvbigpe2guX2QmJktvKC0xKTt2YXIgbT1ObihsKSxTPW8oLi4uYXJndW1lbnRzKTtyZXR1cm4gTm4obSksaC5fZCYmS28oMSksZXIobCksU307cmV0dXJuIGguX249ITAsaC5fYz0hMCxoLl9kPSEwLGh9dmFyIFhpPSExO2Z1bmN0aW9uIHJpKCl7WGk9ITB9ZnVuY3Rpb24ga2kobyl7dmFye3R5cGU6bCx2bm9kZTpoLHByb3h5Om0sd2l0aFByb3h5OlMscHJvcHM6Tyxwcm9wc09wdGlvbnM6W01dLHNsb3RzOlksYXR0cnM6SCxlbWl0Om5lLHJlbmRlcjpOZSxyZW5kZXJDYWNoZTpmZSxkYXRhOmNlLHNldHVwU3RhdGU6RmUsY3R4OlZlLGluaGVyaXRBdHRyczpsdH09byxtdCx3ZSxkZT1ObihvKTtYaT0hMTt0cnl7aWYoaC5zaGFwZUZsYWcmNCl7dmFyIFNlPVN8fG07bXQ9aW8oTmUuY2FsbChTZSxTZSxmZSxPLEZlLGNlLFZlKSksd2U9SH1lbHNle3ZhciBudD1sO0g9PT1PJiZyaSgpLG10PWlvKG50Lmxlbmd0aD4xP250KE8se2dldCBhdHRycygpe3JldHVybiByaSgpLEh9LHNsb3RzOlksZW1pdDpuZX0pOm50KE8sbnVsbCkpLHdlPWwucHJvcHM/SDpZcihIKX19Y2F0Y2goSyl7QnIubGVuZ3RoPTAsenIoSyxvLDEpLG10PU1uKGl0KX12YXIgemU9bXQsaT12b2lkIDA7aWYobXQucGF0Y2hGbGFnPjAmJm10LnBhdGNoRmxhZyYyMDQ4JiYoW3plLGldPVFpKG10KSksd2UmJmx0IT09ITEpe3ZhciBhPU9iamVjdC5rZXlzKHdlKSx7c2hhcGVGbGFnOmZ9PXplO2lmKGEubGVuZ3RoKXtpZihmJigxfDYpKU0mJmEuc29tZSh1LmlzTW9kZWxMaXN0ZW5lcikmJih3ZT1pYSh3ZSxNKSksemU9TGkoemUsd2UpO2Vsc2UgaWYoIVhpJiZ6ZS50eXBlIT09aXQpe2Zvcih2YXIgcD1PYmplY3Qua2V5cyhIKSx3PVtdLEU9W10sTj0wLEw9cC5sZW5ndGg7TjxMO04rKyl7dmFyIFI9cFtOXTt1LmlzT24oUik/dS5pc01vZGVsTGlzdGVuZXIoUil8fHcucHVzaChSWzJdLnRvTG93ZXJDYXNlKCkrUi5zbGljZSgzKSk6RS5wdXNoKFIpfUUubGVuZ3RoJiZzZSgiRXh0cmFuZW91cyBub24tcHJvcHMgYXR0cmlidXRlcyAoIisiIi5jb25jYXQoRS5qb2luKCIsICIpLCIpICIpKyJ3ZXJlIHBhc3NlZCB0byBjb21wb25lbnQgYnV0IGNvdWxkIG5vdCBiZSBhdXRvbWF0aWNhbGx5IGluaGVyaXRlZCBiZWNhdXNlIGNvbXBvbmVudCByZW5kZXJzIGZyYWdtZW50IG9yIHRleHQgcm9vdCBub2Rlcy4iKSx3Lmxlbmd0aCYmc2UoIkV4dHJhbmVvdXMgbm9uLWVtaXRzIGV2ZW50IGxpc3RlbmVycyAoIisiIi5jb25jYXQody5qb2luKCIsICIpLCIpICIpKyd3ZXJlIHBhc3NlZCB0byBjb21wb25lbnQgYnV0IGNvdWxkIG5vdCBiZSBhdXRvbWF0aWNhbGx5IGluaGVyaXRlZCBiZWNhdXNlIGNvbXBvbmVudCByZW5kZXJzIGZyYWdtZW50IG9yIHRleHQgcm9vdCBub2Rlcy4gSWYgdGhlIGxpc3RlbmVyIGlzIGludGVuZGVkIHRvIGJlIGEgY29tcG9uZW50IGN1c3RvbSBldmVudCBsaXN0ZW5lciBvbmx5LCBkZWNsYXJlIGl0IHVzaW5nIHRoZSAiZW1pdHMiIG9wdGlvbi4nKX19fXJldHVybiBoLmRpcnMmJihUbyh6ZSl8fHNlKCJSdW50aW1lIGRpcmVjdGl2ZSB1c2VkIG9uIGNvbXBvbmVudCB3aXRoIG5vbi1lbGVtZW50IHJvb3Qgbm9kZS4gVGhlIGRpcmVjdGl2ZXMgd2lsbCBub3QgZnVuY3Rpb24gYXMgaW50ZW5kZWQuIiksemU9TGkoemUpLHplLmRpcnM9emUuZGlycz96ZS5kaXJzLmNvbmNhdChoLmRpcnMpOmguZGlycyksaC50cmFuc2l0aW9uJiYoVG8oemUpfHxzZSgiQ29tcG9uZW50IGluc2lkZSA8VHJhbnNpdGlvbj4gcmVuZGVycyBub24tZWxlbWVudCByb290IG5vZGUgdGhhdCBjYW5ub3QgYmUgYW5pbWF0ZWQuIiksemUudHJhbnNpdGlvbj1oLnRyYW5zaXRpb24pLGk/aSh6ZSk6bXQ9emUsTm4oZGUpLG10fXZhciBRaT1vPT57dmFyIGw9by5jaGlsZHJlbixoPW8uZHluYW1pY0NoaWxkcmVuLG09UmkobCk7aWYoIW0pcmV0dXJuW28sdm9pZCAwXTt2YXIgUz1sLmluZGV4T2YobSksTz1oP2guaW5kZXhPZihtKTotMSxNPVk9PntsW1NdPVksaCYmKE8+LTE/aFtPXT1ZOlkucGF0Y2hGbGFnPjAmJihvLmR5bmFtaWNDaGlsZHJlbj1bLi4uaCxZXSkpfTtyZXR1cm5baW8obSksTV19O2Z1bmN0aW9uIFJpKG8pe2Zvcih2YXIgbCxoPTA7aDxvLmxlbmd0aDtoKyspe3ZhciBtPW9baF07aWYoYm8obSkpe2lmKG0udHlwZSE9PWl0fHxtLmNoaWxkcmVuPT09InYtaWYiKXtpZihsKXJldHVybjtsPW19fWVsc2UgcmV0dXJufXJldHVybiBsfXZhciBZcj1vPT57dmFyIGw7Zm9yKHZhciBoIGluIG8pKGg9PT0iY2xhc3MifHxoPT09InN0eWxlInx8dS5pc09uKGgpKSYmKChsfHwobD17fSkpW2hdPW9baF0pO3JldHVybiBsfSxpYT0obyxsKT0+e3ZhciBoPXt9O2Zvcih2YXIgbSBpbiBvKSghdS5pc01vZGVsTGlzdGVuZXIobSl8fCEobS5zbGljZSg5KWluIGwpKSYmKGhbbV09b1ttXSk7cmV0dXJuIGh9LFRvPW89Pm8uc2hhcGVGbGFnJig2fDEpfHxvLnR5cGU9PT1pdDtmdW5jdGlvbiBYdChvLGwsaCl7dmFye3Byb3BzOm0sY2hpbGRyZW46Uyxjb21wb25lbnQ6T309byx7cHJvcHM6TSxjaGlsZHJlbjpZLHBhdGNoRmxhZzpIfT1sLG5lPU8uZW1pdHNPcHRpb25zO2lmKChTfHxZKSYmVnJ8fGwuZGlyc3x8bC50cmFuc2l0aW9uKXJldHVybiEwO2lmKGgmJkg+PTApe2lmKEgmMTAyNClyZXR1cm4hMDtpZihIJjE2KXJldHVybiBtP2JhKG0sTSxuZSk6ISFNO2lmKEgmOClmb3IodmFyIE5lPWwuZHluYW1pY1Byb3BzLGZlPTA7ZmU8TmUubGVuZ3RoO2ZlKyspe3ZhciBjZT1OZVtmZV07aWYoTVtjZV0hPT1tW2NlXSYmIVppKG5lLGNlKSlyZXR1cm4hMH19ZWxzZSByZXR1cm4oU3x8WSkmJighWXx8IVkuJHN0YWJsZSk/ITA6bT09PU0/ITE6bT9NP2JhKG0sTSxuZSk6ITA6ISFNO3JldHVybiExfWZ1bmN0aW9uIGJhKG8sbCxoKXt2YXIgbT1PYmplY3Qua2V5cyhsKTtpZihtLmxlbmd0aCE9PU9iamVjdC5rZXlzKG8pLmxlbmd0aClyZXR1cm4hMDtmb3IodmFyIFM9MDtTPG0ubGVuZ3RoO1MrKyl7dmFyIE89bVtTXTtpZihsW09dIT09b1tPXSYmIVppKGgsTykpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24geGkobyxsKXtmb3IodmFye3Zub2RlOmgscGFyZW50Om19PW87bSYmbS5zdWJUcmVlPT09aDspKGg9bS52bm9kZSkuZWw9bCxtPW0ucGFyZW50fXZhciB1bj1vPT5vLl9faXNTdXNwZW5zZSxxcj17bmFtZToiU3VzcGVuc2UiLF9faXNTdXNwZW5zZTohMCxwcm9jZXNzKG8sbCxoLG0sUyxPLE0sWSxILG5lKXtvPT1udWxsP0lvKGwsaCxtLFMsTyxNLFksSCxuZSk6RmEobyxsLGgsbSxTLE0sWSxILG5lKX0saHlkcmF0ZTphYSxjcmVhdGU6am8sbm9ybWFsaXplOnlhfSxCaT1xcjtmdW5jdGlvbiBZbihvLGwpe3ZhciBoPW8ucHJvcHMmJm8ucHJvcHNbbF07dS5pc0Z1bmN0aW9uKGgpJiZoKCl9ZnVuY3Rpb24gSW8obyxsLGgsbSxTLE8sTSxZLEgpe3ZhcntwOm5lLG86e2NyZWF0ZUVsZW1lbnQ6TmV9fT1ILGZlPU5lKCJkaXYiKSxjZT1vLnN1c3BlbnNlPWpvKG8sUyxtLGwsZmUsaCxPLE0sWSxIKTtuZShudWxsLGNlLnBlbmRpbmdCcmFuY2g9by5zc0NvbnRlbnQsZmUsbnVsbCxtLGNlLE8sTSksY2UuZGVwcz4wPyhZbihvLCJvblBlbmRpbmciKSxZbihvLCJvbkZhbGxiYWNrIiksbmUobnVsbCxvLnNzRmFsbGJhY2ssbCxoLG0sbnVsbCxPLE0pLGtuKGNlLG8uc3NGYWxsYmFjaykpOmNlLnJlc29sdmUoKX1mdW5jdGlvbiBGYShvLGwsaCxtLFMsTyxNLFksSCl7dmFye3A6bmUsdW06TmUsbzp7Y3JlYXRlRWxlbWVudDpmZX19PUgsY2U9bC5zdXNwZW5zZT1vLnN1c3BlbnNlO2NlLnZub2RlPWwsbC5lbD1vLmVsO3ZhciBGZT1sLnNzQ29udGVudCxWZT1sLnNzRmFsbGJhY2sse2FjdGl2ZUJyYW5jaDpsdCxwZW5kaW5nQnJhbmNoOm10LGlzSW5GYWxsYmFjazp3ZSxpc0h5ZHJhdGluZzpkZX09Y2U7aWYobXQpY2UucGVuZGluZ0JyYW5jaD1GZSxmcihGZSxtdCk/KG5lKG10LEZlLGNlLmhpZGRlbkNvbnRhaW5lcixudWxsLFMsY2UsTyxNLFkpLGNlLmRlcHM8PTA/Y2UucmVzb2x2ZSgpOndlJiYobmUobHQsVmUsaCxtLFMsbnVsbCxPLE0sWSksa24oY2UsVmUpKSk6KGNlLnBlbmRpbmdJZCsrLGRlPyhjZS5pc0h5ZHJhdGluZz0hMSxjZS5hY3RpdmVCcmFuY2g9bXQpOk5lKG10LFMsY2UpLGNlLmRlcHM9MCxjZS5lZmZlY3RzLmxlbmd0aD0wLGNlLmhpZGRlbkNvbnRhaW5lcj1mZSgiZGl2Iiksd2U/KG5lKG51bGwsRmUsY2UuaGlkZGVuQ29udGFpbmVyLG51bGwsUyxjZSxPLE0sWSksY2UuZGVwczw9MD9jZS5yZXNvbHZlKCk6KG5lKGx0LFZlLGgsbSxTLG51bGwsTyxNLFkpLGtuKGNlLFZlKSkpOmx0JiZmcihGZSxsdCk/KG5lKGx0LEZlLGgsbSxTLGNlLE8sTSxZKSxjZS5yZXNvbHZlKCEwKSk6KG5lKG51bGwsRmUsY2UuaGlkZGVuQ29udGFpbmVyLG51bGwsUyxjZSxPLE0sWSksY2UuZGVwczw9MCYmY2UucmVzb2x2ZSgpKSk7ZWxzZSBpZihsdCYmZnIoRmUsbHQpKW5lKGx0LEZlLGgsbSxTLGNlLE8sTSxZKSxrbihjZSxGZSk7ZWxzZSBpZihZbihsLCJvblBlbmRpbmciKSxjZS5wZW5kaW5nQnJhbmNoPUZlLGNlLnBlbmRpbmdJZCsrLG5lKG51bGwsRmUsY2UuaGlkZGVuQ29udGFpbmVyLG51bGwsUyxjZSxPLE0sWSksY2UuZGVwczw9MCljZS5yZXNvbHZlKCk7ZWxzZXt2YXJ7dGltZW91dDpTZSxwZW5kaW5nSWQ6bnR9PWNlO1NlPjA/c2V0VGltZW91dCgoKT0+e2NlLnBlbmRpbmdJZD09PW50JiZjZS5mYWxsYmFjayhWZSl9LFNlKTpTZT09PTAmJmNlLmZhbGxiYWNrKFZlKX19dmFyIG9hPSExO2Z1bmN0aW9uIGpvKG8sbCxoLG0sUyxPLE0sWSxILG5lKXt2YXIgTmU9YXJndW1lbnRzLmxlbmd0aD4xMCYmYXJndW1lbnRzWzEwXSE9PXZvaWQgMD9hcmd1bWVudHNbMTBdOiExO29hfHwob2E9ITAsY29uc29sZVtjb25zb2xlLmluZm8/ImluZm8iOiJsb2ciXSgiPFN1c3BlbnNlPiBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBhbmQgaXRzIEFQSSB3aWxsIGxpa2VseSBjaGFuZ2UuIikpO3ZhcntwOmZlLG06Y2UsdW06RmUsbjpWZSxvOntwYXJlbnROb2RlOmx0LHJlbW92ZTptdH19PW5lLHdlPXUudG9OdW1iZXIoby5wcm9wcyYmby5wcm9wcy50aW1lb3V0KSxkZT17dm5vZGU6byxwYXJlbnQ6bCxwYXJlbnRDb21wb25lbnQ6aCxpc1NWRzpNLGNvbnRhaW5lcjptLGhpZGRlbkNvbnRhaW5lcjpTLGFuY2hvcjpPLGRlcHM6MCxwZW5kaW5nSWQ6MCx0aW1lb3V0OnR5cGVvZiB3ZT09Im51bWJlciI/d2U6LTEsYWN0aXZlQnJhbmNoOm51bGwscGVuZGluZ0JyYW5jaDpudWxsLGlzSW5GYWxsYmFjazohMCxpc0h5ZHJhdGluZzpOZSxpc1VubW91bnRlZDohMSxlZmZlY3RzOltdLHJlc29sdmUoKXt2YXIgU2U9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOiExO3tpZighU2UmJiFkZS5wZW5kaW5nQnJhbmNoKXRocm93IG5ldyBFcnJvcigic3VzcGVuc2UucmVzb2x2ZSgpIGlzIGNhbGxlZCB3aXRob3V0IGEgcGVuZGluZyBicmFuY2guIik7aWYoZGUuaXNVbm1vdW50ZWQpdGhyb3cgbmV3IEVycm9yKCJzdXNwZW5zZS5yZXNvbHZlKCkgaXMgY2FsbGVkIG9uIGFuIGFscmVhZHkgdW5tb3VudGVkIHN1c3BlbnNlIGJvdW5kYXJ5LiIpfXZhcnt2bm9kZTpudCxhY3RpdmVCcmFuY2g6emUscGVuZGluZ0JyYW5jaDppLHBlbmRpbmdJZDphLGVmZmVjdHM6ZixwYXJlbnRDb21wb25lbnQ6cCxjb250YWluZXI6d309ZGU7aWYoZGUuaXNIeWRyYXRpbmcpZGUuaXNIeWRyYXRpbmc9ITE7ZWxzZSBpZighU2Upe3ZhciBFPXplJiZpLnRyYW5zaXRpb24mJmkudHJhbnNpdGlvbi5tb2RlPT09Im91dC1pbiI7RSYmKHplLnRyYW5zaXRpb24uYWZ0ZXJMZWF2ZT0oKT0+e2E9PT1kZS5wZW5kaW5nSWQmJmNlKGksdyxOLDApfSk7dmFye2FuY2hvcjpOfT1kZTt6ZSYmKE49VmUoemUpLEZlKHplLHAsZGUsITApKSxFfHxjZShpLHcsTiwwKX1rbihkZSxpKSxkZS5wZW5kaW5nQnJhbmNoPW51bGwsZGUuaXNJbkZhbGxiYWNrPSExO2Zvcih2YXIgTD1kZS5wYXJlbnQsUj0hMTtMOyl7aWYoTC5wZW5kaW5nQnJhbmNoKXtMLmVmZmVjdHMucHVzaCguLi5mKSxSPSEwO2JyZWFrfUw9TC5wYXJlbnR9Unx8TmkoZiksZGUuZWZmZWN0cz1bXSxZbihudCwib25SZXNvbHZlIil9LGZhbGxiYWNrKFNlKXtpZighIWRlLnBlbmRpbmdCcmFuY2gpe3Zhcnt2bm9kZTpudCxhY3RpdmVCcmFuY2g6emUscGFyZW50Q29tcG9uZW50OmksY29udGFpbmVyOmEsaXNTVkc6Zn09ZGU7WW4obnQsIm9uRmFsbGJhY2siKTt2YXIgcD1WZSh6ZSksdz0oKT0+eyFkZS5pc0luRmFsbGJhY2t8fChmZShudWxsLFNlLGEscCxpLG51bGwsZixZLEgpLGtuKGRlLFNlKSl9LEU9U2UudHJhbnNpdGlvbiYmU2UudHJhbnNpdGlvbi5tb2RlPT09Im91dC1pbiI7RSYmKHplLnRyYW5zaXRpb24uYWZ0ZXJMZWF2ZT13KSxkZS5pc0luRmFsbGJhY2s9ITAsRmUoemUsaSxudWxsLCEwKSxFfHx3KCl9fSxtb3ZlKFNlLG50LHplKXtkZS5hY3RpdmVCcmFuY2gmJmNlKGRlLmFjdGl2ZUJyYW5jaCxTZSxudCx6ZSksZGUuY29udGFpbmVyPVNlfSxuZXh0KCl7cmV0dXJuIGRlLmFjdGl2ZUJyYW5jaCYmVmUoZGUuYWN0aXZlQnJhbmNoKX0scmVnaXN0ZXJEZXAoU2UsbnQpe3ZhciB6ZT0hIWRlLnBlbmRpbmdCcmFuY2g7emUmJmRlLmRlcHMrKzt2YXIgaT1TZS52bm9kZS5lbDtTZS5hc3luY0RlcC5jYXRjaChhPT57enIoYSxTZSwwKX0pLnRoZW4oYT0+e2lmKCEoU2UuaXNVbm1vdW50ZWR8fGRlLmlzVW5tb3VudGVkfHxkZS5wZW5kaW5nSWQhPT1TZS5zdXNwZW5zZUlkKSl7U2UuYXN5bmNSZXNvbHZlZD0hMDt2YXJ7dm5vZGU6Zn09U2U7dG4oZiksSWwoU2UsYSwhMSksaSYmKGYuZWw9aSk7dmFyIHA9IWkmJlNlLnN1YlRyZWUuZWw7bnQoU2UsZixsdChpfHxTZS5zdWJUcmVlLmVsKSxpP251bGw6VmUoU2Uuc3ViVHJlZSksZGUsTSxIKSxwJiZtdChwKSx4aShTZSxmLmVsKSxBKCksemUmJi0tZGUuZGVwcz09PTAmJmRlLnJlc29sdmUoKX19KX0sdW5tb3VudChTZSxudCl7ZGUuaXNVbm1vdW50ZWQ9ITAsZGUuYWN0aXZlQnJhbmNoJiZGZShkZS5hY3RpdmVCcmFuY2gsaCxTZSxudCksZGUucGVuZGluZ0JyYW5jaCYmRmUoZGUucGVuZGluZ0JyYW5jaCxoLFNlLG50KX19O3JldHVybiBkZX1mdW5jdGlvbiBhYShvLGwsaCxtLFMsTyxNLFksSCl7dmFyIG5lPWwuc3VzcGVuc2U9am8obCxtLGgsby5wYXJlbnROb2RlLGMuY3JlYXRlRWxlbWVudCgiZGl2IiksbnVsbCxTLE8sTSxZLCEwKSxOZT1IKG8sbmUucGVuZGluZ0JyYW5jaD1sLnNzQ29udGVudCxoLG5lLE8sTSk7cmV0dXJuIG5lLmRlcHM9PT0wJiZuZS5yZXNvbHZlKCksTmV9ZnVuY3Rpb24geWEobyl7dmFye3NoYXBlRmxhZzpsLGNoaWxkcmVuOmh9PW8sbT1sJjMyO28uc3NDb250ZW50PU5yKG0/aC5kZWZhdWx0OmgpLG8uc3NGYWxsYmFjaz1tP05yKGguZmFsbGJhY2spOk1uKGl0KX1mdW5jdGlvbiBOcihvKXt2YXIgbDtpZih1LmlzRnVuY3Rpb24obykpe3ZhciBoPU9hJiZvLl9jO2gmJihvLl9kPSExLE1yKCkpLG89bygpLGgmJihvLl9kPSEwLGw9cnIsX28oKSl9aWYodS5pc0FycmF5KG8pKXt2YXIgbT1SaShvKTttfHxzZSgiPFN1c3BlbnNlPiBzbG90cyBleHBlY3QgYSBzaW5nbGUgcm9vdCBub2RlLiIpLG89bX1yZXR1cm4gbz1pbyhvKSxsJiYhby5keW5hbWljQ2hpbGRyZW4mJihvLmR5bmFtaWNDaGlsZHJlbj1sLmZpbHRlcihTPT5TIT09bykpLG99ZnVuY3Rpb24ga3IobyxsKXtsJiZsLnBlbmRpbmdCcmFuY2g/dS5pc0FycmF5KG8pP2wuZWZmZWN0cy5wdXNoKC4uLm8pOmwuZWZmZWN0cy5wdXNoKG8pOk5pKG8pfWZ1bmN0aW9uIGtuKG8sbCl7by5hY3RpdmVCcmFuY2g9bDt2YXJ7dm5vZGU6aCxwYXJlbnRDb21wb25lbnQ6bX09byxTPWguZWw9bC5lbDttJiZtLnN1YlRyZWU9PT1oJiYobS52bm9kZS5lbD1TLHhpKG0sUykpfWZ1bmN0aW9uIGNyKG8sbCl7aWYoIUpuKXNlKCJwcm92aWRlKCkgY2FuIG9ubHkgYmUgdXNlZCBpbnNpZGUgc2V0dXAoKS4iKTtlbHNle3ZhciBoPUpuLnByb3ZpZGVzLG09Sm4ucGFyZW50JiZKbi5wYXJlbnQucHJvdmlkZXM7bT09PWgmJihoPUpuLnByb3ZpZGVzPU9iamVjdC5jcmVhdGUobSkpLGhbb109bCxKbi50eXBlLm1wVHlwZT09PSJhcHAiJiZKbi5hcHBDb250ZXh0LmFwcC5wcm92aWRlKG8sbCl9fWZ1bmN0aW9uIHZyKG8sbCl7dmFyIGg9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOiExLG09Sm58fHduO2lmKG0pe3ZhciBTPW0ucGFyZW50PT1udWxsP20udm5vZGUuYXBwQ29udGV4dCYmbS52bm9kZS5hcHBDb250ZXh0LnByb3ZpZGVzOm0ucGFyZW50LnByb3ZpZGVzO2lmKFMmJm8gaW4gUylyZXR1cm4gU1tvXTtpZihhcmd1bWVudHMubGVuZ3RoPjEpcmV0dXJuIGgmJnUuaXNGdW5jdGlvbihsKT9sLmNhbGwobS5wcm94eSk6bDtzZSgnaW5qZWN0aW9uICInLmNvbmNhdChTdHJpbmcobyksJyIgbm90IGZvdW5kLicpKX1lbHNlIHNlKCJpbmplY3QoKSBjYW4gb25seSBiZSB1c2VkIGluc2lkZSBzZXR1cCgpIG9yIGZ1bmN0aW9uYWwgY29tcG9uZW50cy4iKX1mdW5jdGlvbiBlbyhvLGwpe3JldHVybiBLcihvLG51bGwsbCl9ZnVuY3Rpb24gem8obyxsKXtyZXR1cm4gS3IobyxudWxsLE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxsKSx7Zmx1c2g6InBvc3QifSkpfWZ1bmN0aW9uIExhKG8sbCl7cmV0dXJuIEtyKG8sbnVsbCxPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sbCkse2ZsdXNoOiJzeW5jIn0pKX12YXIgRWE9e307ZnVuY3Rpb24gdG8obyxsLGgpe3JldHVybiB1LmlzRnVuY3Rpb24obCl8fHNlKCJgd2F0Y2goZm4sIG9wdGlvbnM/KWAgc2lnbmF0dXJlIGhhcyBiZWVuIG1vdmVkIHRvIGEgc2VwYXJhdGUgQVBJLiBVc2UgYHdhdGNoRWZmZWN0KGZuLCBvcHRpb25zPylgIGluc3RlYWQuIGB3YXRjaGAgbm93IG9ubHkgc3VwcG9ydHMgYHdhdGNoKHNvdXJjZSwgY2IsIG9wdGlvbnM/KSBzaWduYXR1cmUuIiksS3IobyxsLGgpfWZ1bmN0aW9uIEtyKG8sbCl7dmFye2ltbWVkaWF0ZTpoLGRlZXA6bSxmbHVzaDpTLG9uVHJhY2s6TyxvblRyaWdnZXI6TX09YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOnUuRU1QVFlfT0JKO2x8fChoIT09dm9pZCAwJiZzZSgnd2F0Y2goKSAiaW1tZWRpYXRlIiBvcHRpb24gaXMgb25seSByZXNwZWN0ZWQgd2hlbiB1c2luZyB0aGUgd2F0Y2goc291cmNlLCBjYWxsYmFjaywgb3B0aW9ucz8pIHNpZ25hdHVyZS4nKSxtIT09dm9pZCAwJiZzZSgnd2F0Y2goKSAiZGVlcCIgb3B0aW9uIGlzIG9ubHkgcmVzcGVjdGVkIHdoZW4gdXNpbmcgdGhlIHdhdGNoKHNvdXJjZSwgY2FsbGJhY2ssIG9wdGlvbnM/KSBzaWduYXR1cmUuJykpO3ZhciBZPVNlPT57c2UoIkludmFsaWQgd2F0Y2ggc291cmNlOiAiLFNlLCJBIHdhdGNoIHNvdXJjZSBjYW4gb25seSBiZSBhIGdldHRlci9lZmZlY3QgZnVuY3Rpb24sIGEgcmVmLCBhIHJlYWN0aXZlIG9iamVjdCwgb3IgYW4gYXJyYXkgb2YgdGhlc2UgdHlwZXMuIil9LEg9Sm4sbmUsTmU9ITEsZmU9ITE7aWYoSS5pc1JlZihvKT8obmU9KCk9Pm8udmFsdWUsTmU9SS5pc1NoYWxsb3cobykpOkkuaXNSZWFjdGl2ZShvKT8obmU9KCk9Pm8sbT0hMCk6dS5pc0FycmF5KG8pPyhmZT0hMCxOZT1vLnNvbWUoU2U9PkkuaXNSZWFjdGl2ZShTZSl8fEkuaXNTaGFsbG93KFNlKSksbmU9KCk9Pm8ubWFwKFNlPT57aWYoSS5pc1JlZihTZSkpcmV0dXJuIFNlLnZhbHVlO2lmKEkuaXNSZWFjdGl2ZShTZSkpcmV0dXJuIGlpKFNlKTtpZih1LmlzRnVuY3Rpb24oU2UpKXJldHVybiBGdChTZSxILDIpO1koU2UpfSkpOnUuaXNGdW5jdGlvbihvKT9sP25lPSgpPT5GdChvLEgsMik6bmU9KCk9PntpZighKEgmJkguaXNVbm1vdW50ZWQpKXJldHVybiBGZSYmRmUoKSxWdChvLEgsMyxbVmVdKX06KG5lPXUuTk9PUCxZKG8pKSxsJiZtKXt2YXIgY2U9bmU7bmU9KCk9PmlpKGNlKCkpfXZhciBGZSxWZT1TZT0+e0ZlPWRlLm9uU3RvcD0oKT0+e0Z0KFNlLEgsNCl9fTtpZihrLmlzSW5TU1JDb21wb25lbnRTZXR1cClyZXR1cm4gVmU9dS5OT09QLGw/aCYmVnQobCxILDMsW25lKCksZmU/W106dm9pZCAwLFZlXSk6bmUoKSx1Lk5PT1A7dmFyIGx0PWZlP1tdOkVhLG10PSgpPT57aWYoISFkZS5hY3RpdmUpaWYobCl7dmFyIFNlPWRlLnJ1bigpOyhtfHxOZXx8KGZlP1NlLnNvbWUoKG50LHplKT0+dS5oYXNDaGFuZ2VkKG50LGx0W3plXSkpOnUuaGFzQ2hhbmdlZChTZSxsdCkpKSYmKEZlJiZGZSgpLFZ0KGwsSCwzLFtTZSxsdD09PUVhP3ZvaWQgMDpsdCxWZV0pLGx0PVNlKX1lbHNlIGRlLnJ1bigpfTttdC5hbGxvd1JlY3Vyc2U9ISFsO3ZhciB3ZTtTPT09InN5bmMiP3dlPW10OlM9PT0icG9zdCI/d2U9KCk9PmpuKG10LEgmJkguc3VzcGVuc2UpOndlPSgpPT4kbyhtdCk7dmFyIGRlPW5ldyBJLlJlYWN0aXZlRWZmZWN0KG5lLHdlKTtyZXR1cm4gZGUub25UcmFjaz1PLGRlLm9uVHJpZ2dlcj1NLGw/aD9tdCgpOmx0PWRlLnJ1bigpOlM9PT0icG9zdCI/am4oZGUucnVuLmJpbmQoZGUpLEgmJkguc3VzcGVuc2UpOmRlLnJ1bigpLCgpPT57ZGUuc3RvcCgpLEgmJkguc2NvcGUmJnUucmVtb3ZlKEguc2NvcGUuZWZmZWN0cyxkZSl9fWZ1bmN0aW9uIE1pKG8sbCxoKXt2YXIgbT10aGlzLnByb3h5LFM9dS5pc1N0cmluZyhvKT9vLmluY2x1ZGVzKCIuIik/V28obSxvKTooKT0+bVtvXTpvLmJpbmQobSxtKSxPO3UuaXNGdW5jdGlvbihsKT9PPWw6KE89bC5oYW5kbGVyLGg9bCk7dmFyIE09Sm47Y2kodGhpcyk7dmFyIFk9S3IoUyxPLmJpbmQobSksaCk7cmV0dXJuIE0/Y2koTSk6WnIoKSxZfWZ1bmN0aW9uIFdvKG8sbCl7dmFyIGg9bC5zcGxpdCgiLiIpO3JldHVybigpPT57Zm9yKHZhciBtPW8sUz0wO1M8aC5sZW5ndGgmJm07UysrKW09bVtoW1NdXTtyZXR1cm4gbX19ZnVuY3Rpb24gaWkobyxsKXtpZighdS5pc09iamVjdChvKXx8by5fX3Zfc2tpcHx8KGw9bHx8bmV3IFNldCxsLmhhcyhvKSkpcmV0dXJuIG87aWYobC5hZGQobyksSS5pc1JlZihvKSlpaShvLnZhbHVlLGwpO2Vsc2UgaWYodS5pc0FycmF5KG8pKWZvcih2YXIgaD0wO2g8by5sZW5ndGg7aCsrKWlpKG9baF0sbCk7ZWxzZSBpZih1LmlzU2V0KG8pfHx1LmlzTWFwKG8pKW8uZm9yRWFjaChTPT57aWkoUyxsKX0pO2Vsc2UgaWYodS5pc1BsYWluT2JqZWN0KG8pKWZvcih2YXIgbSBpbiBvKWlpKG9bbV0sbCk7cmV0dXJuIG99ZnVuY3Rpb24gYmkoKXt2YXIgbz17aXNNb3VudGVkOiExLGlzTGVhdmluZzohMSxpc1VubW91bnRpbmc6ITEsbGVhdmluZ1ZOb2RlczpuZXcgTWFwfTtyZXR1cm4gd2EoKCk9PntvLmlzTW91bnRlZD0hMH0pLGtvKCgpPT57by5pc1VubW91bnRpbmc9ITB9KSxvfXZhciB0cj1bRnVuY3Rpb24sQXJyYXldLHdyPXtuYW1lOiJCYXNlVHJhbnNpdGlvbiIscHJvcHM6e21vZGU6U3RyaW5nLGFwcGVhcjpCb29sZWFuLHBlcnNpc3RlZDpCb29sZWFuLG9uQmVmb3JlRW50ZXI6dHIsb25FbnRlcjp0cixvbkFmdGVyRW50ZXI6dHIsb25FbnRlckNhbmNlbGxlZDp0cixvbkJlZm9yZUxlYXZlOnRyLG9uTGVhdmU6dHIsb25BZnRlckxlYXZlOnRyLG9uTGVhdmVDYW5jZWxsZWQ6dHIsb25CZWZvcmVBcHBlYXI6dHIsb25BcHBlYXI6dHIsb25BZnRlckFwcGVhcjp0cixvbkFwcGVhckNhbmNlbGxlZDp0cn0sc2V0dXAobyxsKXt2YXJ7c2xvdHM6aH09bCxtPUluKCksUz1iaSgpLE87cmV0dXJuKCk9Pnt2YXIgTT1oLmRlZmF1bHQmJlooaC5kZWZhdWx0KCksITApO2lmKCEoIU18fCFNLmxlbmd0aCkpe3ZhciBZPU1bMF07aWYoTS5sZW5ndGg+MSl7dmFyIEg9ITE7Zm9yKHZhciBuZSBvZiBNKWlmKG5lLnR5cGUhPT1pdCl7aWYoSCl7c2UoIjx0cmFuc2l0aW9uPiBjYW4gb25seSBiZSB1c2VkIG9uIGEgc2luZ2xlIGVsZW1lbnQgb3IgY29tcG9uZW50LiBVc2UgPHRyYW5zaXRpb24tZ3JvdXA+IGZvciBsaXN0cy4iKTticmVha31ZPW5lLEg9ITB9fXZhciBOZT1JLnRvUmF3KG8pLHttb2RlOmZlfT1OZTtpZihmZSYmZmUhPT0iaW4tb3V0IiYmZmUhPT0ib3V0LWluIiYmZmUhPT0iZGVmYXVsdCImJnNlKCJpbnZhbGlkIDx0cmFuc2l0aW9uPiBtb2RlOiAiLmNvbmNhdChmZSkpLFMuaXNMZWF2aW5nKXJldHVybiBHKFkpO3ZhciBjZT1WKFkpO2lmKCFjZSlyZXR1cm4gRyhZKTt2YXIgRmU9YmUoY2UsTmUsUyxtKTtKKGNlLEZlKTt2YXIgVmU9bS5zdWJUcmVlLGx0PVZlJiZWKFZlKSxtdD0hMSx7Z2V0VHJhbnNpdGlvbktleTp3ZX09Y2UudHlwZTtpZih3ZSl7dmFyIGRlPXdlKCk7Tz09PXZvaWQgMD9PPWRlOmRlIT09TyYmKE89ZGUsbXQ9ITApfWlmKGx0JiZsdC50eXBlIT09aXQmJighZnIoY2UsbHQpfHxtdCkpe3ZhciBTZT1iZShsdCxOZSxTLG0pO2lmKEoobHQsU2UpLGZlPT09Im91dC1pbiIpcmV0dXJuIFMuaXNMZWF2aW5nPSEwLFNlLmFmdGVyTGVhdmU9KCk9PntTLmlzTGVhdmluZz0hMSxtLnVwZGF0ZSgpfSxHKFkpO2ZlPT09ImluLW91dCImJmNlLnR5cGUhPT1pdCYmKFNlLmRlbGF5TGVhdmU9KG50LHplLGkpPT57dmFyIGE9aWUoUyxsdCk7YVtTdHJpbmcobHQua2V5KV09bHQsbnQuX2xlYXZlQ2I9KCk9Pnt6ZSgpLG50Ll9sZWF2ZUNiPXZvaWQgMCxkZWxldGUgRmUuZGVsYXllZExlYXZlfSxGZS5kZWxheWVkTGVhdmU9aX0pfXJldHVybiBZfX19fSxEPXdyO2Z1bmN0aW9uIGllKG8sbCl7dmFye2xlYXZpbmdWTm9kZXM6aH09byxtPWguZ2V0KGwudHlwZSk7cmV0dXJuIG18fChtPU9iamVjdC5jcmVhdGUobnVsbCksaC5zZXQobC50eXBlLG0pKSxtfWZ1bmN0aW9uIGJlKG8sbCxoLG0pe3ZhcnthcHBlYXI6Uyxtb2RlOk8scGVyc2lzdGVkOk09ITEsb25CZWZvcmVFbnRlcjpZLG9uRW50ZXI6SCxvbkFmdGVyRW50ZXI6bmUsb25FbnRlckNhbmNlbGxlZDpOZSxvbkJlZm9yZUxlYXZlOmZlLG9uTGVhdmU6Y2Usb25BZnRlckxlYXZlOkZlLG9uTGVhdmVDYW5jZWxsZWQ6VmUsb25CZWZvcmVBcHBlYXI6bHQsb25BcHBlYXI6bXQsb25BZnRlckFwcGVhcjp3ZSxvbkFwcGVhckNhbmNlbGxlZDpkZX09bCxTZT1TdHJpbmcoby5rZXkpLG50PWllKGgsbyksemU9KGYscCk9PntmJiZWdChmLG0sOSxwKX0saT0oZixwKT0+e3ZhciB3PXBbMV07emUoZixwKSx1LmlzQXJyYXkoZik/Zi5ldmVyeShFPT5FLmxlbmd0aDw9MSkmJncoKTpmLmxlbmd0aDw9MSYmdygpfSxhPXttb2RlOk8scGVyc2lzdGVkOk0sYmVmb3JlRW50ZXIoZil7dmFyIHA9WTtpZighaC5pc01vdW50ZWQpaWYoUylwPWx0fHxZO2Vsc2UgcmV0dXJuO2YuX2xlYXZlQ2ImJmYuX2xlYXZlQ2IoITApO3ZhciB3PW50W1NlXTt3JiZmcihvLHcpJiZ3LmVsLl9sZWF2ZUNiJiZ3LmVsLl9sZWF2ZUNiKCksemUocCxbZl0pfSxlbnRlcihmKXt2YXIgcD1ILHc9bmUsRT1OZTtpZighaC5pc01vdW50ZWQpaWYoUylwPW10fHxILHc9d2V8fG5lLEU9ZGV8fE5lO2Vsc2UgcmV0dXJuO3ZhciBOPSExLEw9Zi5fZW50ZXJDYj1SPT57Tnx8KE49ITAsUj96ZShFLFtmXSk6emUodyxbZl0pLGEuZGVsYXllZExlYXZlJiZhLmRlbGF5ZWRMZWF2ZSgpLGYuX2VudGVyQ2I9dm9pZCAwKX07cD9pKHAsW2YsTF0pOkwoKX0sbGVhdmUoZixwKXt2YXIgdz1TdHJpbmcoby5rZXkpO2lmKGYuX2VudGVyQ2ImJmYuX2VudGVyQ2IoITApLGguaXNVbm1vdW50aW5nKXJldHVybiBwKCk7emUoZmUsW2ZdKTt2YXIgRT0hMSxOPWYuX2xlYXZlQ2I9TD0+e0V8fChFPSEwLHAoKSxMP3plKFZlLFtmXSk6emUoRmUsW2ZdKSxmLl9sZWF2ZUNiPXZvaWQgMCxudFt3XT09PW8mJmRlbGV0ZSBudFt3XSl9O250W3ddPW8sY2U/aShjZSxbZixOXSk6TigpfSxjbG9uZShmKXtyZXR1cm4gYmUoZixsLGgsbSl9fTtyZXR1cm4gYX1mdW5jdGlvbiBHKG8pe2lmKG1yKG8pKXJldHVybiBvPUxpKG8pLG8uY2hpbGRyZW49bnVsbCxvfWZ1bmN0aW9uIFYobyl7cmV0dXJuIG1yKG8pP28uY2hpbGRyZW4/by5jaGlsZHJlblswXTp2b2lkIDA6b31mdW5jdGlvbiBKKG8sbCl7by5zaGFwZUZsYWcmNiYmby5jb21wb25lbnQ/SihvLmNvbXBvbmVudC5zdWJUcmVlLGwpOm8uc2hhcGVGbGFnJjEyOD8oby5zc0NvbnRlbnQudHJhbnNpdGlvbj1sLmNsb25lKG8uc3NDb250ZW50KSxvLnNzRmFsbGJhY2sudHJhbnNpdGlvbj1sLmNsb25lKG8uc3NGYWxsYmFjaykpOm8udHJhbnNpdGlvbj1sfWZ1bmN0aW9uIFoobyl7Zm9yKHZhciBsPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTohMSxoPWFyZ3VtZW50cy5sZW5ndGg+Mj9hcmd1bWVudHNbMl06dm9pZCAwLG09W10sUz0wLE89MDtPPG8ubGVuZ3RoO08rKyl7dmFyIE09b1tPXSxZPWg9PW51bGw/TS5rZXk6U3RyaW5nKGgpK1N0cmluZyhNLmtleSE9bnVsbD9NLmtleTpPKTtNLnR5cGU9PT1IdD8oTS5wYXRjaEZsYWcmMTI4JiZTKyssbT1tLmNvbmNhdChaKE0uY2hpbGRyZW4sbCxZKSkpOihsfHxNLnR5cGUhPT1pdCkmJm0ucHVzaChZIT1udWxsP0xpKE0se2tleTpZfSk6TSl9aWYoUz4xKWZvcih2YXIgSD0wO0g8bS5sZW5ndGg7SCsrKW1bSF0ucGF0Y2hGbGFnPS0yO3JldHVybiBtfWZ1bmN0aW9uIGdlKG8pe3JldHVybiB1LmlzRnVuY3Rpb24obyk/e3NldHVwOm8sbmFtZTpvLm5hbWV9Om99dmFyIHp0PW89PiEhby50eXBlLl9fYXN5bmNMb2FkZXI7ZnVuY3Rpb24gQ24obyl7dS5pc0Z1bmN0aW9uKG8pJiYobz17bG9hZGVyOm99KTt2YXJ7bG9hZGVyOmwsbG9hZGluZ0NvbXBvbmVudDpoLGVycm9yQ29tcG9uZW50Om0sZGVsYXk6Uz0yMDAsdGltZW91dDpPLHN1c3BlbnNpYmxlOk09ITAsb25FcnJvcjpZfT1vLEg9bnVsbCxuZSxOZT0wLGZlPSgpPT4oTmUrKyxIPW51bGwsY2UoKSksY2U9KCk9Pnt2YXIgRmU7cmV0dXJuIEh8fChGZT1IPWwoKS5jYXRjaChWZT0+e2lmKFZlPVZlIGluc3RhbmNlb2YgRXJyb3I/VmU6bmV3IEVycm9yKFN0cmluZyhWZSkpLFkpcmV0dXJuIG5ldyBQcm9taXNlKChsdCxtdCk9Pnt2YXIgd2U9KCk9Pmx0KGZlKCkpLGRlPSgpPT5tdChWZSk7WShWZSx3ZSxkZSxOZSsxKX0pO3Rocm93IFZlfSkudGhlbihWZT0+e2lmKEZlIT09SCYmSClyZXR1cm4gSDtpZihWZXx8c2UoIkFzeW5jIGNvbXBvbmVudCBsb2FkZXIgcmVzb2x2ZWQgdG8gdW5kZWZpbmVkLiBJZiB5b3UgYXJlIHVzaW5nIHJldHJ5KCksIG1ha2Ugc3VyZSB0byByZXR1cm4gaXRzIHJldHVybiB2YWx1ZS4iKSxWZSYmKFZlLl9fZXNNb2R1bGV8fFZlW1N5bWJvbC50b1N0cmluZ1RhZ109PT0iTW9kdWxlIikmJihWZT1WZS5kZWZhdWx0KSxWZSYmIXUuaXNPYmplY3QoVmUpJiYhdS5pc0Z1bmN0aW9uKFZlKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgYXN5bmMgY29tcG9uZW50IGxvYWQgcmVzdWx0OiAiLmNvbmNhdChWZSkpO3JldHVybiBuZT1WZSxWZX0pKX07cmV0dXJuIGdlKHtuYW1lOiJBc3luY0NvbXBvbmVudFdyYXBwZXIiLF9fYXN5bmNMb2FkZXI6Y2UsZ2V0IF9fYXN5bmNSZXNvbHZlZCgpe3JldHVybiBuZX0sc2V0dXAoKXt2YXIgRmU9Sm47aWYobmUpcmV0dXJuKCk9Pl9uKG5lLEZlKTt2YXIgVmU9ZGU9PntIPW51bGwsenIoZGUsRmUsMTMsIW0pfTtpZihNJiZGZS5zdXNwZW5zZXx8ay5pc0luU1NSQ29tcG9uZW50U2V0dXApcmV0dXJuIGNlKCkudGhlbihkZT0+KCk9Pl9uKGRlLEZlKSkuY2F0Y2goZGU9PihWZShkZSksKCk9Pm0/TW4obSx7ZXJyb3I6ZGV9KTpudWxsKSk7dmFyIGx0PUkucmVmKCExKSxtdD1JLnJlZigpLHdlPUkucmVmKCEhUyk7cmV0dXJuIFMmJnNldFRpbWVvdXQoKCk9Pnt3ZS52YWx1ZT0hMX0sUyksTyE9bnVsbCYmc2V0VGltZW91dCgoKT0+e2lmKCFsdC52YWx1ZSYmIW10LnZhbHVlKXt2YXIgZGU9bmV3IEVycm9yKCJBc3luYyBjb21wb25lbnQgdGltZWQgb3V0IGFmdGVyICIuY29uY2F0KE8sIm1zLiIpKTtWZShkZSksbXQudmFsdWU9ZGV9fSxPKSxjZSgpLnRoZW4oKCk9PntsdC52YWx1ZT0hMCxGZS5wYXJlbnQmJm1yKEZlLnBhcmVudC52bm9kZSkmJklpKEZlLnBhcmVudC51cGRhdGUpfSkuY2F0Y2goZGU9PntWZShkZSksbXQudmFsdWU9ZGV9KSwoKT0+e2lmKGx0LnZhbHVlJiZuZSlyZXR1cm4gX24obmUsRmUpO2lmKG10LnZhbHVlJiZtKXJldHVybiBNbihtLHtlcnJvcjptdC52YWx1ZX0pO2lmKGgmJiF3ZS52YWx1ZSlyZXR1cm4gTW4oaCl9fX0pfWZ1bmN0aW9uIF9uKG8sbCl7dmFye3Zub2RlOntyZWY6aCxwcm9wczptLGNoaWxkcmVuOlMsc2hhcGVGbGFnOk99LHBhcmVudDpNfT1sLFk9TW4obyxtLFMpO3JldHVybiBZLnJlZj1oLFl9dmFyIG1yPW89Pm8udHlwZS5fX2lzS2VlcEFsaXZlLHFuPXtuYW1lOiJLZWVwQWxpdmUiLF9faXNLZWVwQWxpdmU6ITAscHJvcHM6e2luY2x1ZGU6W1N0cmluZyxSZWdFeHAsQXJyYXldLGV4Y2x1ZGU6W1N0cmluZyxSZWdFeHAsQXJyYXldLG1heDpbU3RyaW5nLE51bWJlcl19LHNldHVwKG8sbCl7dmFye3Nsb3RzOmh9PWwsbT1JbigpLFM9bS5jdHg7aWYoIVMucmVuZGVyZXIpcmV0dXJuKCk9Pnt2YXIgU2U9aC5kZWZhdWx0JiZoLmRlZmF1bHQoKTtyZXR1cm4gU2UmJlNlLmxlbmd0aD09PTE/U2VbMF06U2V9O3ZhciBPPW5ldyBNYXAsTT1uZXcgU2V0LFk9bnVsbDttLl9fdl9jYWNoZT1PO3ZhciBIPW0uc3VzcGVuc2Use3JlbmRlcmVyOntwOm5lLG06TmUsdW06ZmUsbzp7Y3JlYXRlRWxlbWVudDpjZX19fT1TLEZlPWNlKCJkaXYiKTtTLmFjdGl2YXRlPShTZSxudCx6ZSxpLGEpPT57dmFyIGY9U2UuY29tcG9uZW50O05lKFNlLG50LHplLDAsSCksbmUoZi52bm9kZSxTZSxudCx6ZSxmLEgsaSxTZS5zbG90U2NvcGVJZHMsYSksam4oKCk9PntmLmlzRGVhY3RpdmF0ZWQ9ITEsZi5hJiZ1Lmludm9rZUFycmF5Rm5zKGYuYSk7dmFyIHA9U2UucHJvcHMmJlNlLnByb3BzLm9uVm5vZGVNb3VudGVkO3AmJkRyKHAsZi5wYXJlbnQsU2UpfSxIKSxHcihmKX0sUy5kZWFjdGl2YXRlPVNlPT57dmFyIG50PVNlLmNvbXBvbmVudDtOZShTZSxGZSxudWxsLDEsSCksam4oKCk9PntudC5kYSYmdS5pbnZva2VBcnJheUZucyhudC5kYSk7dmFyIHplPVNlLnByb3BzJiZTZS5wcm9wcy5vblZub2RlVW5tb3VudGVkO3plJiZEcih6ZSxudC5wYXJlbnQsU2UpLG50LmlzRGVhY3RpdmF0ZWQ9ITB9LEgpLEdyKG50KX07ZnVuY3Rpb24gVmUoU2Upe0NzKFNlKSxmZShTZSxtLEgsITApfWZ1bmN0aW9uIGx0KFNlKXtPLmZvckVhY2goKG50LHplKT0+e3ZhciBpPWdzKG50LnR5cGUpO2kmJighU2V8fCFTZShpKSkmJm10KHplKX0pfWZ1bmN0aW9uIG10KFNlKXt2YXIgbnQ9Ty5nZXQoU2UpOyFZfHxudC50eXBlIT09WS50eXBlP1ZlKG50KTpZJiZDcyhZKSxPLmRlbGV0ZShTZSksTS5kZWxldGUoU2UpfXRvKCgpPT5bby5pbmNsdWRlLG8uZXhjbHVkZV0sU2U9Pnt2YXJbbnQsemVdPVNlO250JiZsdChpPT5QbyhudCxpKSksemUmJmx0KGk9PiFQbyh6ZSxpKSl9LHtmbHVzaDoicG9zdCIsZGVlcDohMH0pO3ZhciB3ZT1udWxsLGRlPSgpPT57d2UhPW51bGwmJk8uc2V0KHdlLGxhKG0uc3ViVHJlZSkpfTtyZXR1cm4gd2EoZGUpLFJyKGRlKSxrbygoKT0+e08uZm9yRWFjaChTZT0+e3ZhcntzdWJUcmVlOm50LHN1c3BlbnNlOnplfT1tLGk9bGEobnQpO2lmKFNlLnR5cGU9PT1pLnR5cGUpe0NzKGkpO3ZhciBhPWkuY29tcG9uZW50LmRhO2EmJmpuKGEsemUpO3JldHVybn1WZShTZSl9KX0pLCgpPT57aWYod2U9bnVsbCwhaC5kZWZhdWx0KXJldHVybiBudWxsO3ZhciBTZT1oLmRlZmF1bHQoKSxudD1TZVswXTtpZihTZS5sZW5ndGg+MSlyZXR1cm4gc2UoIktlZXBBbGl2ZSBzaG91bGQgY29udGFpbiBleGFjdGx5IG9uZSBjb21wb25lbnQgY2hpbGQuIiksWT1udWxsLFNlO2lmKCFibyhudCl8fCEobnQuc2hhcGVGbGFnJjQpJiYhKG50LnNoYXBlRmxhZyYxMjgpKXJldHVybiBZPW51bGwsbnQ7dmFyIHplPWxhKG50KSxpPXplLnR5cGUsYT1ncyh6dCh6ZSk/emUudHlwZS5fX2FzeW5jUmVzb2x2ZWR8fHt9OmkpLHtpbmNsdWRlOmYsZXhjbHVkZTpwLG1heDp3fT1vO2lmKGYmJighYXx8IVBvKGYsYSkpfHxwJiZhJiZQbyhwLGEpKXJldHVybiBZPXplLG50O3ZhciBFPXplLmtleT09bnVsbD9pOnplLmtleSxOPU8uZ2V0KEUpO3JldHVybiB6ZS5lbCYmKHplPUxpKHplKSxudC5zaGFwZUZsYWcmMTI4JiYobnQuc3NDb250ZW50PXplKSksd2U9RSxOPyh6ZS5lbD1OLmVsLHplLmNvbXBvbmVudD1OLmNvbXBvbmVudCx6ZS50cmFuc2l0aW9uJiZKKHplLHplLnRyYW5zaXRpb24pLHplLnNoYXBlRmxhZ3w9NTEyLE0uZGVsZXRlKEUpLE0uYWRkKEUpKTooTS5hZGQoRSksdyYmTS5zaXplPnBhcnNlSW50KHcsMTApJiZtdChNLnZhbHVlcygpLm5leHQoKS52YWx1ZSkpLHplLnNoYXBlRmxhZ3w9MjU2LFk9emUsdW4obnQudHlwZSk/bnQ6emV9fX0sVmE9cW47ZnVuY3Rpb24gUG8obyxsKXtyZXR1cm4gdS5pc0FycmF5KG8pP28uc29tZShoPT5QbyhoLGwpKTp1LmlzU3RyaW5nKG8pP28uc3BsaXQoIiwiKS5pbmNsdWRlcyhsKTpvLnRlc3Q/by50ZXN0KGwpOiExfWZ1bmN0aW9uIE5vKG8sbCl7JGEobywiYSIsbCl9ZnVuY3Rpb24gc2EobyxsKXskYShvLCJkYSIsbCl9ZnVuY3Rpb24gJGEobyxsKXt2YXIgaD1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06Sm4sbT1vLl9fd2RjfHwoby5fX3dkYz0oKT0+e2Zvcih2YXIgTz1oO087KXtpZihPLmlzRGVhY3RpdmF0ZWQpcmV0dXJuO089Ty5wYXJlbnR9cmV0dXJuIG8oKX0pO2lmKEdvKGwsbSxoKSxoKWZvcih2YXIgUz1oLnBhcmVudDtTJiZTLnBhcmVudDspbXIoUy5wYXJlbnQudm5vZGUpJiZVYShtLGwsaCxTKSxTPVMucGFyZW50fWZ1bmN0aW9uIFVhKG8sbCxoLG0pe3ZhciBTPUdvKGwsbyxtLCEwKTtjYSgoKT0+e3UucmVtb3ZlKG1bbF0sUyl9LGgpfWZ1bmN0aW9uIENzKG8pe3ZhciBsPW8uc2hhcGVGbGFnO2wmMjU2JiYobC09MjU2KSxsJjUxMiYmKGwtPTUxMiksby5zaGFwZUZsYWc9bH1mdW5jdGlvbiBsYShvKXtyZXR1cm4gby5zaGFwZUZsYWcmMTI4P28uc3NDb250ZW50Om99ZnVuY3Rpb24gR28obyxsKXt2YXIgaD1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06Sm4sbT1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106ITE7aWYoaCl7aWYoR2UuaXNSb290SG9vayhvKSYmaCE9PWgucm9vdCYmKGg9aC5yb290LEdlLmlzUm9vdEltbWVkaWF0ZUhvb2sobykpKXt2YXIgUz1oLnByb3h5O1Z0KGwuYmluZChTKSxoLG8sR2UuT05fTE9BRD09PW8/W1MuJHBhZ2Uub3B0aW9uc106W10pfXZhciBPPWhbb118fChoW29dPVtdKSxNPWwuX193ZWh8fChsLl9fd2VoPWZ1bmN0aW9uKCl7aWYoIWguaXNVbm1vdW50ZWQpe0kucGF1c2VUcmFja2luZygpLGNpKGgpO2Zvcih2YXIgSD1hcmd1bWVudHMubGVuZ3RoLG5lPW5ldyBBcnJheShIKSxOZT0wO05lPEg7TmUrKyluZVtOZV09YXJndW1lbnRzW05lXTt2YXIgZmU9VnQobCxoLG8sbmUpO3JldHVybiBacigpLEkucmVzZXRUcmFja2luZygpLGZlfX0pO3JldHVybiBtP08udW5zaGlmdChNKTpPLnB1c2goTSksTX1lbHNle3ZhciBZPXUudG9IYW5kbGVyS2V5KChobltvXXx8by5yZXBsYWNlKC9eb24vLCIiKSkucmVwbGFjZSgvIGhvb2skLywiIikpO3NlKCIiLmNvbmNhdChZLCIgaXMgY2FsbGVkIHdoZW4gdGhlcmUgaXMgbm8gYWN0aXZlIGNvbXBvbmVudCBpbnN0YW5jZSB0byBiZSAiKSsiYXNzb2NpYXRlZCB3aXRoLiBMaWZlY3ljbGUgaW5qZWN0aW9uIEFQSXMgY2FuIG9ubHkgYmUgdXNlZCBkdXJpbmcgZXhlY3V0aW9uIG9mIHNldHVwKCkuIElmIHlvdSBhcmUgdXNpbmcgYXN5bmMgc2V0dXAoKSwgbWFrZSBzdXJlIHRvIHJlZ2lzdGVyIGxpZmVjeWNsZSBob29rcyBiZWZvcmUgdGhlIGZpcnN0IGF3YWl0IHN0YXRlbWVudC4iKX19dmFyIG9pPW89PmZ1bmN0aW9uKGwpe3ZhciBoPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTpKbjtyZXR1cm4oIWsuaXNJblNTUkNvbXBvbmVudFNldHVwfHxvPT09InNwIikmJkdvKG8sbCxoKX0seWk9b2koImJtIiksd2E9b2koIm0iKSxucj1vaSgiYnUiKSxScj1vaSgidSIpLGtvPW9pKCJidW0iKSxjYT1vaSgidW0iKSx4cj1vaSgic3AiKSxBcz1vaSgicnRnIiksT3M9b2koInJ0YyIpO2Z1bmN0aW9uIFRzKG8pe3ZhciBsPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTpKbjtHbygiZWMiLG8sbCl9ZnVuY3Rpb24gSXMobyl7dS5pc0J1aWx0SW5EaXJlY3RpdmUobykmJnNlKCJEbyBub3QgdXNlIGJ1aWx0LWluIGRpcmVjdGl2ZSBpZHMgYXMgY3VzdG9tIGRpcmVjdGl2ZSBpZDogIitvKX1mdW5jdGlvbiBacyhvLGwpe3ZhciBoPXduO2lmKGg9PT1udWxsKXJldHVybiBzZSgid2l0aERpcmVjdGl2ZXMgY2FuIG9ubHkgYmUgdXNlZCBpbnNpZGUgcmVuZGVyIGZ1bmN0aW9ucy4iKSxvO2Zvcih2YXIgbT1ycyhoKXx8aC5wcm94eSxTPW8uZGlyc3x8KG8uZGlycz1bXSksTz0wO088bC5sZW5ndGg7TysrKXt2YXJbTSxZLEgsbmU9dS5FTVBUWV9PQkpdPWxbT107dS5pc0Z1bmN0aW9uKE0pJiYoTT17bW91bnRlZDpNLHVwZGF0ZWQ6TX0pLE0uZGVlcCYmaWkoWSksUy5wdXNoKHtkaXI6TSxpbnN0YW5jZTptLHZhbHVlOlksb2xkVmFsdWU6dm9pZCAwLGFyZzpILG1vZGlmaWVyczpuZX0pfXJldHVybiBvfWZ1bmN0aW9uIEpyKG8sbCxoLG0pe2Zvcih2YXIgUz1vLmRpcnMsTz1sJiZsLmRpcnMsTT0wO008Uy5sZW5ndGg7TSsrKXt2YXIgWT1TW01dO08mJihZLm9sZFZhbHVlPU9bTV0udmFsdWUpO3ZhciBIPVkuZGlyW21dO0gmJihJLnBhdXNlVHJhY2tpbmcoKSxWdChILGgsOCxbby5lbCxZLG8sbF0pLEkucmVzZXRUcmFja2luZygpKX19dmFyIEVpPSJjb21wb25lbnRzIixIbj0iZGlyZWN0aXZlcyI7ZnVuY3Rpb24geWwobyxsKXtyZXR1cm4gUHMoRWksbywhMCxsKXx8b312YXIgSGE9U3ltYm9sKCk7ZnVuY3Rpb24gZm8obyl7cmV0dXJuIHUuaXNTdHJpbmcobyk/UHMoRWksbywhMSl8fG86b3x8SGF9ZnVuY3Rpb24gWHMobyl7cmV0dXJuIFBzKEhuLG8pfWZ1bmN0aW9uIFBzKG8sbCl7dmFyIGg9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOiEwLG09YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiExLFM9d258fEpuO2lmKFMpe3ZhciBPPVMudHlwZTtpZihvPT09RWkpe3ZhciBNPWdzKE8sITEpO2lmKE0mJihNPT09bHx8TT09PXUuY2FtZWxpemUobCl8fE09PT11LmNhcGl0YWxpemUodS5jYW1lbGl6ZShsKSkpKXJldHVybiBPfXZhciBZPWhvKFNbb118fE9bb10sbCl8fGhvKFMuYXBwQ29udGV4dFtvXSxsKTtpZighWSYmbSlyZXR1cm4gTztpZihoJiYhWSl7dmFyIEg9bz09PUVpP2AKSWYgdGhpcyBpcyBhIG5hdGl2ZSBjdXN0b20gZWxlbWVudCwgbWFrZSBzdXJlIHRvIGV4Y2x1ZGUgaXQgZnJvbSBjb21wb25lbnQgcmVzb2x1dGlvbiB2aWEgY29tcGlsZXJPcHRpb25zLmlzQ3VzdG9tRWxlbWVudC5gOiIiO3NlKCJGYWlsZWQgdG8gcmVzb2x2ZSAiLmNvbmNhdChvLnNsaWNlKDAsLTEpLCI6ICIpLmNvbmNhdChsKS5jb25jYXQoSCkpfXJldHVybiBZfWVsc2Ugc2UoInJlc29sdmUiLmNvbmNhdCh1LmNhcGl0YWxpemUoby5zbGljZSgwLC0xKSksIiAiKSsiY2FuIG9ubHkgYmUgdXNlZCBpbiByZW5kZXIoKSBvciBzZXR1cCgpLiIpfWZ1bmN0aW9uIGhvKG8sbCl7cmV0dXJuIG8mJihvW2xdfHxvW3UuY2FtZWxpemUobCldfHxvW3UuY2FwaXRhbGl6ZSh1LmNhbWVsaXplKGwpKV0pfWZ1bmN0aW9uIE5zKG8sbCxoLG0pe3ZhciBTLE89aCYmaFttXTtpZih1LmlzQXJyYXkobyl8fHUuaXNTdHJpbmcobykpe1M9bmV3IEFycmF5KG8ubGVuZ3RoKTtmb3IodmFyIE09MCxZPW8ubGVuZ3RoO008WTtNKyspU1tNXT1sKG9bTV0sTSx2b2lkIDAsTyYmT1tNXSl9ZWxzZSBpZih0eXBlb2Ygbz09Im51bWJlciIpe051bWJlci5pc0ludGVnZXIobyl8fHNlKCJUaGUgdi1mb3IgcmFuZ2UgZXhwZWN0IGFuIGludGVnZXIgdmFsdWUgYnV0IGdvdCAiLmNvbmNhdChvLCIuIikpLFM9bmV3IEFycmF5KG8pO2Zvcih2YXIgSD0wO0g8bztIKyspU1tIXT1sKEgrMSxILHZvaWQgMCxPJiZPW0hdKX1lbHNlIGlmKHUuaXNPYmplY3QobykpaWYob1tTeW1ib2wuaXRlcmF0b3JdKVM9QXJyYXkuZnJvbShvLChGZSxWZSk9PmwoRmUsVmUsdm9pZCAwLE8mJk9bVmVdKSk7ZWxzZXt2YXIgbmU9T2JqZWN0LmtleXMobyk7Uz1uZXcgQXJyYXkobmUubGVuZ3RoKTtmb3IodmFyIE5lPTAsZmU9bmUubGVuZ3RoO05lPGZlO05lKyspe3ZhciBjZT1uZVtOZV07U1tOZV09bChvW2NlXSxjZSxOZSxPJiZPW05lXSl9fWVsc2UgUz1bXTtyZXR1cm4gaCYmKGhbbV09UyksU31mdW5jdGlvbiBTYShvLGwpe2Zvcih2YXIgaD0wO2g8bC5sZW5ndGg7aCsrKXt2YXIgbT1sW2hdO2lmKHUuaXNBcnJheShtKSlmb3IodmFyIFM9MDtTPG0ubGVuZ3RoO1MrKylvW21bU10ubmFtZV09bVtTXS5mbjtlbHNlIG0mJihvW20ubmFtZV09bS5mbil9cmV0dXJuIG99ZnVuY3Rpb24gUm8obyxsKXt2YXIgaD1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06e30sbT1hcmd1bWVudHMubGVuZ3RoPjM/YXJndW1lbnRzWzNdOnZvaWQgMCxTPWFyZ3VtZW50cy5sZW5ndGg+ND9hcmd1bWVudHNbNF06dm9pZCAwO2lmKHduLmlzQ0V8fHduLnBhcmVudCYmenQod24ucGFyZW50KSYmd24ucGFyZW50LmlzQ0UpcmV0dXJuIE1uKCJzbG90IixsPT09ImRlZmF1bHQiP251bGw6e25hbWU6bH0sbSYmbSgpKTt2YXIgTz1vW2xdO08mJk8ubGVuZ3RoPjEmJihzZSgiU1NSLW9wdGltaXplZCBzbG90IGZ1bmN0aW9uIGRldGVjdGVkIGluIGEgbm9uLVNTUi1vcHRpbWl6ZWQgcmVuZGVyIGZ1bmN0aW9uLiBZb3UgbmVlZCB0byBtYXJrIHRoaXMgY29tcG9uZW50IHdpdGggJGR5bmFtaWMtc2xvdHMgaW4gdGhlIHBhcmVudCB0ZW1wbGF0ZS4iKSxPPSgpPT5bXSksTyYmTy5fYyYmKE8uX2Q9ITEpLE1yKCk7dmFyIE09TyYma3MoTyhoKSksWT13bChIdCx7a2V5Omgua2V5fHwiXyIuY29uY2F0KGwpfSxNfHwobT9tKCk6W10pLE0mJm8uXz09PTE/NjQ6LTIpO3JldHVybiFTJiZZLnNjb3BlSWQmJihZLnNsb3RTY29wZUlkcz1bWS5zY29wZUlkKyItcyJdKSxPJiZPLl9jJiYoTy5fZD0hMCksWX1mdW5jdGlvbiBrcyhvKXtyZXR1cm4gby5zb21lKGw9PmJvKGwpPyEobC50eXBlPT09aXR8fGwudHlwZT09PUh0JiYha3MobC5jaGlsZHJlbikpOiEwKT9vOm51bGx9ZnVuY3Rpb24gamEobyl7dmFyIGw9e307aWYoIXUuaXNPYmplY3QobykpcmV0dXJuIHNlKCJ2LW9uIHdpdGggbm8gYXJndW1lbnQgZXhwZWN0cyBhbiBvYmplY3QgdmFsdWUuIiksbDtmb3IodmFyIGggaW4gbylsW3UudG9IYW5kbGVyS2V5KGgpXT1vW2hdO3JldHVybiBsfXZhciBDYT1vPT5vP1hyKG8pP3JzKG8pfHxvLnByb3h5OkNhKG8ucGFyZW50KTpudWxsLG5vPXUuZXh0ZW5kKE9iamVjdC5jcmVhdGUobnVsbCkseyQ6bz0+bywkZWw6bz0+by52bm9kZS5lbCwkZGF0YTpvPT5vLmRhdGEsJHByb3BzOm89Pkkuc2hhbGxvd1JlYWRvbmx5KG8ucHJvcHMpLCRhdHRyczpvPT5JLnNoYWxsb3dSZWFkb25seShvLmF0dHJzKSwkc2xvdHM6bz0+SS5zaGFsbG93UmVhZG9ubHkoby5zbG90cyksJHJlZnM6bz0+SS5zaGFsbG93UmVhZG9ubHkoby5yZWZzKSwkcGFyZW50Om89PkNhKG8ucGFyZW50KSwkcm9vdDpvPT5DYShvLnJvb3QpLCRlbWl0Om89Pm8uZW1pdCwkb3B0aW9uczpvPT5yZShvKSwkZm9yY2VVcGRhdGU6bz0+by5mfHwoby5mPSgpPT5JaShvLnVwZGF0ZSkpLCRuZXh0VGljazpvPT5vLm58fChvLm49Z3IuYmluZChvLnByb3h5KSksJHdhdGNoOm89Pk1pLmJpbmQobyl9KSxwbz1vPT5vPT09Il8ifHxvPT09IiQiLHVhPXtnZXQobyxsKXt2YXJ7XzpofT1vLHtjdHg6bSxzZXR1cFN0YXRlOlMsZGF0YTpPLHByb3BzOk0sYWNjZXNzQ2FjaGU6WSx0eXBlOkgsYXBwQ29udGV4dDpuZX09aDtpZihsPT09Il9faXNWdWUiKXJldHVybiEwO2lmKFMhPT11LkVNUFRZX09CSiYmUy5fX2lzU2NyaXB0U2V0dXAmJnUuaGFzT3duKFMsbCkpcmV0dXJuIFNbbF07dmFyIE5lO2lmKGxbMF0hPT0iJCIpe3ZhciBmZT1ZW2xdO2lmKGZlIT09dm9pZCAwKXN3aXRjaChmZSl7Y2FzZSAxOnJldHVybiBTW2xdO2Nhc2UgMjpyZXR1cm4gT1tsXTtjYXNlIDQ6cmV0dXJuIG1bbF07Y2FzZSAzOnJldHVybiBNW2xdfWVsc2V7aWYoUyE9PXUuRU1QVFlfT0JKJiZ1Lmhhc093bihTLGwpKXJldHVybiBZW2xdPTEsU1tsXTtpZihPIT09dS5FTVBUWV9PQkomJnUuaGFzT3duKE8sbCkpcmV0dXJuIFlbbF09MixPW2xdO2lmKChOZT1oLnByb3BzT3B0aW9uc1swXSkmJnUuaGFzT3duKE5lLGwpKXJldHVybiBZW2xdPTMsTVtsXTtpZihtIT09dS5FTVBUWV9PQkomJnUuaGFzT3duKG0sbCkpcmV0dXJuIFlbbF09NCxtW2xdO18mJihZW2xdPTApfX12YXIgY2U9bm9bbF0sRmUsVmU7aWYoY2UpcmV0dXJuIGw9PT0iJGF0dHJzIiYmKEkudHJhY2soaCwiZ2V0IixsKSxyaSgpKSxjZShoKTtpZigoRmU9SC5fX2Nzc01vZHVsZXMpJiYoRmU9RmVbbF0pKXJldHVybiBGZTtpZihtIT09dS5FTVBUWV9PQkomJnUuaGFzT3duKG0sbCkpcmV0dXJuIFlbbF09NCxtW2xdO2lmKFZlPW5lLmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzLHUuaGFzT3duKFZlLGwpKXJldHVybiBWZVtsXTt3biYmKCF1LmlzU3RyaW5nKGwpfHxsLmluZGV4T2YoIl9fdiIpIT09MCkmJihPIT09dS5FTVBUWV9PQkomJnBvKGxbMF0pJiZ1Lmhhc093bihPLGwpP3NlKCJQcm9wZXJ0eSAiLmNvbmNhdChKU09OLnN0cmluZ2lmeShsKSwiIG11c3QgYmUgYWNjZXNzZWQgdmlhICRkYXRhIGJlY2F1c2UgaXQgc3RhcnRzIHdpdGggYSByZXNlcnZlZCAiKSsnY2hhcmFjdGVyICgiJCIgb3IgIl8iKSBhbmQgaXMgbm90IHByb3hpZWQgb24gdGhlIHJlbmRlciBjb250ZXh0LicpOmg9PT13biYmc2UoIlByb3BlcnR5ICIuY29uY2F0KEpTT04uc3RyaW5naWZ5KGwpLCIgd2FzIGFjY2Vzc2VkIGR1cmluZyByZW5kZXIgIikrImJ1dCBpcyBub3QgZGVmaW5lZCBvbiBpbnN0YW5jZS4iKSl9LHNldChvLGwsaCl7dmFye186bX09byx7ZGF0YTpTLHNldHVwU3RhdGU6TyxjdHg6TX09bTtyZXR1cm4gTyE9PXUuRU1QVFlfT0JKJiZ1Lmhhc093bihPLGwpPyhPW2xdPWgsITApOlMhPT11LkVNUFRZX09CSiYmdS5oYXNPd24oUyxsKT8oU1tsXT1oLCEwKTp1Lmhhc093bihtLnByb3BzLGwpPyhzZSgnQXR0ZW1wdGluZyB0byBtdXRhdGUgcHJvcCAiJy5jb25jYXQobCwnIi4gUHJvcHMgYXJlIHJlYWRvbmx5LicpLG0pLCExKTpsWzBdPT09IiQiJiZsLnNsaWNlKDEpaW4gbT8oc2UoJ0F0dGVtcHRpbmcgdG8gbXV0YXRlIHB1YmxpYyBwcm9wZXJ0eSAiJy5jb25jYXQobCwnIi4gJykrIlByb3BlcnRpZXMgc3RhcnRpbmcgd2l0aCAkIGFyZSByZXNlcnZlZCBhbmQgcmVhZG9ubHkuIixtKSwhMSk6KGwgaW4gbS5hcHBDb250ZXh0LmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzP09iamVjdC5kZWZpbmVQcm9wZXJ0eShNLGwse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHZhbHVlOmh9KTpNW2xdPWgsITApfSxoYXMobyxsKXt2YXJ7Xzp7ZGF0YTpoLHNldHVwU3RhdGU6bSxhY2Nlc3NDYWNoZTpTLGN0eDpPLGFwcENvbnRleHQ6TSxwcm9wc09wdGlvbnM6WX19PW8sSDtyZXR1cm4hIVNbbF18fGghPT11LkVNUFRZX09CSiYmdS5oYXNPd24oaCxsKXx8bSE9PXUuRU1QVFlfT0JKJiZ1Lmhhc093bihtLGwpfHwoSD1ZWzBdKSYmdS5oYXNPd24oSCxsKXx8dS5oYXNPd24oTyxsKXx8dS5oYXNPd24obm8sbCl8fHUuaGFzT3duKE0uY29uZmlnLmdsb2JhbFByb3BlcnRpZXMsbCl9LGRlZmluZVByb3BlcnR5KG8sbCxoKXtyZXR1cm4gaC5nZXQhPW51bGw/by5fLmFjY2Vzc0NhY2hlW2xdPTA6dS5oYXNPd24oaCwidmFsdWUiKSYmdGhpcy5zZXQobyxsLGgudmFsdWUsbnVsbCksUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eShvLGwsaCl9fTt1YS5vd25LZXlzPW89PihzZSgiQXZvaWQgYXBwIGxvZ2ljIHRoYXQgcmVsaWVzIG9uIGVudW1lcmF0aW5nIGtleXMgb24gYSBjb21wb25lbnQgaW5zdGFuY2UuIFRoZSBrZXlzIHdpbGwgYmUgZW1wdHkgaW4gcHJvZHVjdGlvbiBtb2RlIHRvIGF2b2lkIHBlcmZvcm1hbmNlIG92ZXJoZWFkLiIpLFJlZmxlY3Qub3duS2V5cyhvKSk7dmFyIGdvPXUuZXh0ZW5kKHt9LHVhLHtnZXQobyxsKXtpZihsIT09U3ltYm9sLnVuc2NvcGFibGVzKXJldHVybiB1YS5nZXQobyxsLG8pfSxoYXMobyxsKXt2YXIgaD1sWzBdIT09Il8iJiYhdS5pc0dsb2JhbGx5V2hpdGVsaXN0ZWQobCk7cmV0dXJuIWgmJnVhLmhhcyhvLGwpJiZzZSgiUHJvcGVydHkgIi5jb25jYXQoSlNPTi5zdHJpbmdpZnkobCksIiBzaG91bGQgbm90IHN0YXJ0IHdpdGggXyB3aGljaCBpcyBhIHJlc2VydmVkIHByZWZpeCBmb3IgVnVlIGludGVybmFscy4iKSksaH19KTtmdW5jdGlvbiBScyhvKXt2YXIgbD17fTtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGwsIl8iLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMSxnZXQ6KCk9Pm99KSxPYmplY3Qua2V5cyhubykuZm9yRWFjaChoPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KGwsaCx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsZ2V0OigpPT5ub1toXShvKSxzZXQ6dS5OT09QfSl9KSxsfWZ1bmN0aW9uIEVsKG8pe3ZhcntjdHg6bCxwcm9wc09wdGlvbnM6W2hdfT1vO2gmJk9iamVjdC5rZXlzKGgpLmZvckVhY2gobT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eShsLG0se2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDooKT0+by5wcm9wc1ttXSxzZXQ6dS5OT09QfSl9KX1mdW5jdGlvbiB4cyhvKXt2YXJ7Y3R4Omwsc2V0dXBTdGF0ZTpofT1vO09iamVjdC5rZXlzKEkudG9SYXcoaCkpLmZvckVhY2gobT0+e2lmKCFoLl9faXNTY3JpcHRTZXR1cCl7aWYocG8obVswXSkpe3NlKCJzZXR1cCgpIHJldHVybiBwcm9wZXJ0eSAiLmNvbmNhdChKU09OLnN0cmluZ2lmeShtKSwnIHNob3VsZCBub3Qgc3RhcnQgd2l0aCAiJCIgb3IgIl8iICcpKyJ3aGljaCBhcmUgcmVzZXJ2ZWQgcHJlZml4ZXMgZm9yIFZ1ZSBpbnRlcm5hbHMuIik7cmV0dXJufU9iamVjdC5kZWZpbmVQcm9wZXJ0eShsLG0se2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDooKT0+aFttXSxzZXQ6dS5OT09QfSl9fSl9ZnVuY3Rpb24gUXMoKXt2YXIgbz1PYmplY3QuY3JlYXRlKG51bGwpO3JldHVybihsLGgpPT57b1toXT9zZSgiIi5jb25jYXQobCwnIHByb3BlcnR5ICInKS5jb25jYXQoaCwnIiBpcyBhbHJlYWR5IGRlZmluZWQgaW4gJykuY29uY2F0KG9baF0sIi4iKSk6b1toXT1sfX12YXIgXz0hMDtmdW5jdGlvbiBGKG8pe3ZhciBsPXJlKG8pLGg9by5wcm94eSxtPW8uY3R4O189ITEsbC5iZWZvcmVDcmVhdGUmJlcobC5iZWZvcmVDcmVhdGUsbywiYmMiKTt2YXJ7ZGF0YTpTLGNvbXB1dGVkOk8sbWV0aG9kczpNLHdhdGNoOlkscHJvdmlkZTpILGluamVjdDpuZSxjcmVhdGVkOk5lLGJlZm9yZU1vdW50OmZlLG1vdW50ZWQ6Y2UsYmVmb3JlVXBkYXRlOkZlLHVwZGF0ZWQ6VmUsYWN0aXZhdGVkOmx0LGRlYWN0aXZhdGVkOm10LGJlZm9yZURlc3Ryb3k6d2UsYmVmb3JlVW5tb3VudDpkZSxkZXN0cm95ZWQ6U2UsdW5tb3VudGVkOm50LHJlbmRlcjp6ZSxyZW5kZXJUcmFja2VkOmkscmVuZGVyVHJpZ2dlcmVkOmEsZXJyb3JDYXB0dXJlZDpmLHNlcnZlclByZWZldGNoOnAsZXhwb3NlOncsaW5oZXJpdEF0dHJzOkUsY29tcG9uZW50czpOLGRpcmVjdGl2ZXM6TCxmaWx0ZXJzOlJ9PWwsSz1RcygpO3t2YXJbdWVdPW8ucHJvcHNPcHRpb25zO2lmKHVlKWZvcih2YXIgb2UgaW4gdWUpSygiUHJvcHMiLG9lKX1pZihuZSYmcShuZSxtLEssby5hcHBDb250ZXh0LmNvbmZpZy51bndyYXBJbmplY3RlZFJlZiksTSlmb3IodmFyIHRlIGluIE0pe3ZhciBFZT1NW3RlXTt1LmlzRnVuY3Rpb24oRWUpPyhPYmplY3QuZGVmaW5lUHJvcGVydHkobSx0ZSx7dmFsdWU6RWUuYmluZChoKSxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMH0pLEsoIk1ldGhvZHMiLHRlKSk6c2UoJ01ldGhvZCAiJy5jb25jYXQodGUsJyIgaGFzIHR5cGUgIicpLmNvbmNhdCh0eXBlb2YgRWUsJyIgaW4gdGhlIGNvbXBvbmVudCBkZWZpbml0aW9uLiAnKSsiRGlkIHlvdSByZWZlcmVuY2UgdGhlIGZ1bmN0aW9uIGNvcnJlY3RseT8iKX1pZihTJiZmdW5jdGlvbigpe3UuaXNGdW5jdGlvbihTKXx8c2UoIlRoZSBkYXRhIG9wdGlvbiBtdXN0IGJlIGEgZnVuY3Rpb24uIFBsYWluIG9iamVjdCB1c2FnZSBpcyBubyBsb25nZXIgc3VwcG9ydGVkLiIpO3ZhciBPZT1TLmNhbGwoaCxoKTtpZih1LmlzUHJvbWlzZShPZSkmJnNlKCJkYXRhKCkgcmV0dXJuZWQgYSBQcm9taXNlIC0gbm90ZSBkYXRhKCkgY2Fubm90IGJlIGFzeW5jOyBJZiB5b3UgaW50ZW5kIHRvIHBlcmZvcm0gZGF0YSBmZXRjaGluZyBiZWZvcmUgY29tcG9uZW50IHJlbmRlcnMsIHVzZSBhc3luYyBzZXR1cCgpICsgPFN1c3BlbnNlPi4iKSwhdS5pc09iamVjdChPZSkpc2UoImRhdGEoKSBzaG91bGQgcmV0dXJuIGFuIG9iamVjdC4iKTtlbHNle28uZGF0YT1JLnJlYWN0aXZlKE9lKTt7dmFyIG90PWZ1bmN0aW9uKFllKXtLKCJEYXRhIixZZSkscG8oWWVbMF0pfHxPYmplY3QuZGVmaW5lUHJvcGVydHkobSxZZSx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OigpPT5PZVtZZV0sc2V0OnUuTk9PUH0pfTtmb3IodmFyIGR0IGluIE9lKW90KGR0KX19fSgpLF89ITAsTyl7dmFyIEhlPWZ1bmN0aW9uKE9lKXt2YXIgb3Q9T1tPZV0sZHQ9dS5pc0Z1bmN0aW9uKG90KT9vdC5iaW5kKGgsaCk6dS5pc0Z1bmN0aW9uKG90LmdldCk/b3QuZ2V0LmJpbmQoaCxoKTp1Lk5PT1A7ZHQ9PT11Lk5PT1AmJnNlKCdDb21wdXRlZCBwcm9wZXJ0eSAiJy5jb25jYXQoT2UsJyIgaGFzIG5vIGdldHRlci4nKSk7dmFyIFllPSF1LmlzRnVuY3Rpb24ob3QpJiZ1LmlzRnVuY3Rpb24ob3Quc2V0KT9vdC5zZXQuYmluZChoKTooKT0+e3NlKCdXcml0ZSBvcGVyYXRpb24gZmFpbGVkOiBjb21wdXRlZCBwcm9wZXJ0eSAiJy5jb25jYXQoT2UsJyIgaXMgcmVhZG9ubHkuJykpfSxPdD14bCh7Z2V0OmR0LHNldDpZZX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShtLE9lLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6KCk9Pk90LnZhbHVlLHNldDpUdD0+T3QudmFsdWU9VHR9KSxLKCJDb21wdXRlZCIsT2UpfTtmb3IodmFyIHJ0IGluIE8pSGUocnQpfWlmKFkpZm9yKHZhciBmdCBpbiBZKWVlKFlbZnRdLG0saCxmdCk7aWYoSCl7dmFyIHZlPXUuaXNGdW5jdGlvbihIKT9ILmNhbGwoaCk6SDtSZWZsZWN0Lm93bktleXModmUpLmZvckVhY2goT2U9PntjcihPZSx2ZVtPZV0pfSl9TmUmJlcoTmUsbywiYyIpO2Z1bmN0aW9uIGxlKE9lLG90KXt1LmlzQXJyYXkob3QpP290LmZvckVhY2goZHQ9Pk9lKGR0LmJpbmQoaCkpKTpvdCYmT2Uob3QuYmluZChoKSl9aWYobGUoeWksZmUpLGxlKHdhLGNlKSxsZShucixGZSksbGUoUnIsVmUpLGxlKE5vLGx0KSxsZShzYSxtdCksbGUoVHMsZiksbGUoT3MsaSksbGUoQXMsYSksbGUoa28sZGUpLGxlKGNhLG50KSxsZSh4cixwKSx1LmlzQXJyYXkodykpaWYody5sZW5ndGgpe3ZhciBtZT1vLmV4cG9zZWR8fChvLmV4cG9zZWQ9e30pO3cuZm9yRWFjaChPZT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eShtZSxPZSx7Z2V0OigpPT5oW09lXSxzZXQ6b3Q9PmhbT2VdPW90fSl9KX1lbHNlIG8uZXhwb3NlZHx8KG8uZXhwb3NlZD17fSk7emUmJm8ucmVuZGVyPT09dS5OT09QJiYoby5yZW5kZXI9emUpLEUhPW51bGwmJihvLmluaGVyaXRBdHRycz1FKSxOJiYoby5jb21wb25lbnRzPU4pLEwmJihvLmRpcmVjdGl2ZXM9TCk7dmFyIFplPW8uYXBwQ29udGV4dC5jb25maWcuZ2xvYmFsUHJvcGVydGllcy4kYXBwbHlPcHRpb25zO1plJiZaZShsLG8saCl9ZnVuY3Rpb24gcShvLGwpe3ZhciBoPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTp1Lk5PT1AsbT1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106ITE7dS5pc0FycmF5KG8pJiYobz1BZShvKSk7dmFyIFM9ZnVuY3Rpb24oTSl7dmFyIFk9b1tNXSxIPXZvaWQgMDt1LmlzT2JqZWN0KFkpPyJkZWZhdWx0ImluIFk/SD12cihZLmZyb218fE0sWS5kZWZhdWx0LCEwKTpIPXZyKFkuZnJvbXx8TSk6SD12cihZKSxJLmlzUmVmKEgpP20/T2JqZWN0LmRlZmluZVByb3BlcnR5KGwsTSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OigpPT5ILnZhbHVlLHNldDpuZT0+SC52YWx1ZT1uZX0pOihzZSgnaW5qZWN0ZWQgcHJvcGVydHkgIicuY29uY2F0KE0sJyIgaXMgYSByZWYgYW5kIHdpbGwgYmUgYXV0by11bndyYXBwZWQgJykrImFuZCBubyBsb25nZXIgbmVlZHMgYC52YWx1ZWAgaW4gdGhlIG5leHQgbWlub3IgcmVsZWFzZS4gVG8gb3B0LWluIHRvIHRoZSBuZXcgYmVoYXZpb3Igbm93LCBzZXQgYGFwcC5jb25maWcudW53cmFwSW5qZWN0ZWRSZWYgPSB0cnVlYCAodGhpcyBjb25maWcgaXMgdGVtcG9yYXJ5IGFuZCB3aWxsIG5vdCBiZSBuZWVkZWQgaW4gdGhlIGZ1dHVyZS4pIiksbFtNXT1IKTpsW01dPUgsaCgiSW5qZWN0IixNKX07Zm9yKHZhciBPIGluIG8pUyhPKX1mdW5jdGlvbiBXKG8sbCxoKXtWdCh1LmlzQXJyYXkobyk/by5tYXAobT0+bS5iaW5kKGwucHJveHkpKTpvLmJpbmQobC5wcm94eSksbCxoKX1mdW5jdGlvbiBlZShvLGwsaCxtKXt2YXIgUz1tLmluY2x1ZGVzKCIuIik/V28oaCxtKTooKT0+aFttXTtpZih1LmlzU3RyaW5nKG8pKXt2YXIgTz1sW29dO3UuaXNGdW5jdGlvbihPKT90byhTLE8pOnNlKCdJbnZhbGlkIHdhdGNoIGhhbmRsZXIgc3BlY2lmaWVkIGJ5IGtleSAiJy5jb25jYXQobywnIicpLE8pfWVsc2UgaWYodS5pc0Z1bmN0aW9uKG8pKXRvKFMsby5iaW5kKGgpKTtlbHNlIGlmKHUuaXNPYmplY3QobykpaWYodS5pc0FycmF5KG8pKW8uZm9yRWFjaChZPT5lZShZLGwsaCxtKSk7ZWxzZXt2YXIgTT11LmlzRnVuY3Rpb24oby5oYW5kbGVyKT9vLmhhbmRsZXIuYmluZChoKTpsW28uaGFuZGxlcl07dS5pc0Z1bmN0aW9uKE0pP3RvKFMsTSxvKTpzZSgnSW52YWxpZCB3YXRjaCBoYW5kbGVyIHNwZWNpZmllZCBieSBrZXkgIicuY29uY2F0KG8uaGFuZGxlciwnIicpLE0pfWVsc2Ugc2UoJ0ludmFsaWQgd2F0Y2ggb3B0aW9uOiAiJy5jb25jYXQobSwnIicpLG8pfWZ1bmN0aW9uIHJlKG8pe3ZhciBsPW8udHlwZSx7bWl4aW5zOmgsZXh0ZW5kczptfT1sLHttaXhpbnM6UyxvcHRpb25zQ2FjaGU6Tyxjb25maWc6e29wdGlvbk1lcmdlU3RyYXRlZ2llczpNfX09by5hcHBDb250ZXh0LFk9Ty5nZXQobCksSDtyZXR1cm4gWT9IPVk6IVMubGVuZ3RoJiYhaCYmIW0/SD1sOihIPXt9LFMubGVuZ3RoJiZTLmZvckVhY2gobmU9PnBlKEgsbmUsTSwhMCkpLHBlKEgsbCxNKSksTy5zZXQobCxIKSxIfWZ1bmN0aW9uIHBlKG8sbCxoKXt2YXIgbT1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106ITEse21peGluczpTLGV4dGVuZHM6T309bDtPJiZwZShvLE8saCwhMCksUyYmUy5mb3JFYWNoKEg9PnBlKG8sSCxoLCEwKSk7Zm9yKHZhciBNIGluIGwpaWYobSYmTT09PSJleHBvc2UiKXNlKCciZXhwb3NlIiBvcHRpb24gaXMgaWdub3JlZCB3aGVuIGRlY2xhcmVkIGluIG1peGlucyBvciBleHRlbmRzLiBJdCBzaG91bGQgb25seSBiZSBkZWNsYXJlZCBpbiB0aGUgYmFzZSBjb21wb25lbnQgaXRzZWxmLicpO2Vsc2V7dmFyIFk9Q2VbTV18fGgmJmhbTV07b1tNXT1ZP1kob1tNXSxsW01dKTpsW01dfXJldHVybiBvfXZhciBDZT17ZGF0YTpNZSxwcm9wczpxZSxlbWl0czpxZSxtZXRob2RzOnFlLGNvbXB1dGVkOnFlLGJlZm9yZUNyZWF0ZTprZSxjcmVhdGVkOmtlLGJlZm9yZU1vdW50OmtlLG1vdW50ZWQ6a2UsYmVmb3JlVXBkYXRlOmtlLHVwZGF0ZWQ6a2UsYmVmb3JlRGVzdHJveTprZSxiZWZvcmVVbm1vdW50OmtlLGRlc3Ryb3llZDprZSx1bm1vdW50ZWQ6a2UsYWN0aXZhdGVkOmtlLGRlYWN0aXZhdGVkOmtlLGVycm9yQ2FwdHVyZWQ6a2Usc2VydmVyUHJlZmV0Y2g6a2UsY29tcG9uZW50czpxZSxkaXJlY3RpdmVzOnFlLHdhdGNoOnZ0LHByb3ZpZGU6TWUsaW5qZWN0OiRlfTtmdW5jdGlvbiBNZShvLGwpe3JldHVybiBsP28/ZnVuY3Rpb24oKXtyZXR1cm4gdS5leHRlbmQodS5pc0Z1bmN0aW9uKG8pP28uY2FsbCh0aGlzLHRoaXMpOm8sdS5pc0Z1bmN0aW9uKGwpP2wuY2FsbCh0aGlzLHRoaXMpOmwpfTpsOm99ZnVuY3Rpb24gJGUobyxsKXtyZXR1cm4gcWUoQWUobyksQWUobCkpfWZ1bmN0aW9uIEFlKG8pe2lmKHUuaXNBcnJheShvKSl7Zm9yKHZhciBsPXt9LGg9MDtoPG8ubGVuZ3RoO2grKylsW29baF1dPW9baF07cmV0dXJuIGx9cmV0dXJuIG99ZnVuY3Rpb24ga2UobyxsKXtyZXR1cm4gbz9bLi4ubmV3IFNldChbXS5jb25jYXQobyxsKSldOmx9ZnVuY3Rpb24gcWUobyxsKXtyZXR1cm4gbz91LmV4dGVuZCh1LmV4dGVuZChPYmplY3QuY3JlYXRlKG51bGwpLG8pLGwpOmx9ZnVuY3Rpb24gdnQobyxsKXtpZighbylyZXR1cm4gbDtpZighbClyZXR1cm4gbzt2YXIgaD11LmV4dGVuZChPYmplY3QuY3JlYXRlKG51bGwpLG8pO2Zvcih2YXIgbSBpbiBsKWhbbV09a2Uob1ttXSxsW21dKTtyZXR1cm4gaH1mdW5jdGlvbiBKdChvLGwsaCl7dmFyIG09YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiExLFM9e30sTz17fTt1LmRlZihPLEZzLDEpLG8ucHJvcHNEZWZhdWx0cz1PYmplY3QuY3JlYXRlKG51bGwpLHV0KG8sbCxTLE8pO2Zvcih2YXIgTSBpbiBvLnByb3BzT3B0aW9uc1swXSlNIGluIFN8fChTW01dPXZvaWQgMCk7eG4obHx8e30sUyxvKSxoP28ucHJvcHM9bT9TOkkuc2hhbGxvd1JlYWN0aXZlKFMpOm8udHlwZS5wcm9wcz9vLnByb3BzPVM6by5wcm9wcz1PLG8uYXR0cnM9T31mdW5jdGlvbiBndChvLGwsaCxtKXt2YXJ7cHJvcHM6UyxhdHRyczpPLHZub2RlOntwYXRjaEZsYWc6TX19PW8sWT1JLnRvUmF3KFMpLFtIXT1vLnByb3BzT3B0aW9ucyxuZT0hMTtpZighKG8udHlwZS5fX2htcklkfHxvLnBhcmVudCYmby5wYXJlbnQudHlwZS5fX2htcklkKSYmKG18fE0+MCkmJiEoTSYxNikpe2lmKE0mOClmb3IodmFyIE5lPW8udm5vZGUuZHluYW1pY1Byb3BzLGZlPTA7ZmU8TmUubGVuZ3RoO2ZlKyspe3ZhciBjZT1OZVtmZV07aWYoIVppKG8uZW1pdHNPcHRpb25zLGNlKSl7dmFyIEZlPWxbY2VdO2lmKEgpaWYodS5oYXNPd24oTyxjZSkpRmUhPT1PW2NlXSYmKE9bY2VdPUZlLG5lPSEwKTtlbHNle3ZhciBWZT11LmNhbWVsaXplKGNlKTtTW1ZlXT1OdChILFksVmUsRmUsbywhMSl9ZWxzZSBGZSE9PU9bY2VdJiYoT1tjZV09RmUsbmU9ITApfX19ZWxzZXt1dChvLGwsUyxPKSYmKG5lPSEwKTt2YXIgbHQ7Zm9yKHZhciBtdCBpbiBZKSghbHx8IXUuaGFzT3duKGwsbXQpJiYoKGx0PXUuaHlwaGVuYXRlKG10KSk9PT1tdHx8IXUuaGFzT3duKGwsbHQpKSkmJihIP2gmJihoW210XSE9PXZvaWQgMHx8aFtsdF0hPT12b2lkIDApJiYoU1ttdF09TnQoSCxZLG10LHZvaWQgMCxvLCEwKSk6ZGVsZXRlIFNbbXRdKTtpZihPIT09WSlmb3IodmFyIHdlIGluIE8pKCFsfHwhdS5oYXNPd24obCx3ZSkmJiEwKSYmKGRlbGV0ZSBPW3dlXSxuZT0hMCl9bmUmJkkudHJpZ2dlcihvLCJzZXQiLCIkYXR0cnMiKSx4bihsfHx7fSxTLG8pfWZ1bmN0aW9uIHV0KG8sbCxoLG0pe3ZhcltTLE9dPW8ucHJvcHNPcHRpb25zLE09ITEsWTtpZihsKXtmb3IodmFyIEggaW4gbClpZighdS5pc1Jlc2VydmVkUHJvcChIKSl7dmFyIG5lPWxbSF0sTmU9dm9pZCAwO1MmJnUuaGFzT3duKFMsTmU9dS5jYW1lbGl6ZShIKSk/IU98fCFPLmluY2x1ZGVzKE5lKT9oW05lXT1uZTooWXx8KFk9e30pKVtOZV09bmU6Wmkoby5lbWl0c09wdGlvbnMsSCl8fCghKEggaW4gbSl8fG5lIT09bVtIXSkmJihtW0hdPW5lLE09ITApfX1pZihPKWZvcih2YXIgZmU9SS50b1JhdyhoKSxjZT1ZfHx1LkVNUFRZX09CSixGZT0wO0ZlPE8ubGVuZ3RoO0ZlKyspe3ZhciBWZT1PW0ZlXTtoW1ZlXT1OdChTLGZlLFZlLGNlW1ZlXSxvLCF1Lmhhc093bihjZSxWZSkpfXJldHVybiBNfWZ1bmN0aW9uIE50KG8sbCxoLG0sUyxPKXt2YXIgTT1vW2hdO2lmKE0hPW51bGwpe3ZhciBZPXUuaGFzT3duKE0sImRlZmF1bHQiKTtpZihZJiZtPT09dm9pZCAwKXt2YXIgSD1NLmRlZmF1bHQ7aWYoTS50eXBlIT09RnVuY3Rpb24mJnUuaXNGdW5jdGlvbihIKSl7dmFye3Byb3BzRGVmYXVsdHM6bmV9PVM7aCBpbiBuZT9tPW5lW2hdOihjaShTKSxtPW5lW2hdPUguY2FsbChudWxsLGwpLFpyKCkpfWVsc2UgbT1IfU1bMF0mJihPJiYhWT9tPSExOk1bMV0mJihtPT09IiJ8fG09PT11Lmh5cGhlbmF0ZShoKSkmJihtPSEwKSl9cmV0dXJuIG19ZnVuY3Rpb24gcG4obyxsKXt2YXIgaD1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06ITEsbT1sLnByb3BzQ2FjaGUsUz1tLmdldChvKTtpZihTKXJldHVybiBTO3ZhciBPPW8ucHJvcHMsTT17fSxZPVtdLEg9ITE7aWYoIXUuaXNGdW5jdGlvbihvKSl7dmFyIG5lPVNlPT57SD0hMDt2YXJbbnQsemVdPXBuKFNlLGwsITApO3UuZXh0ZW5kKE0sbnQpLHplJiZZLnB1c2goLi4uemUpfTshaCYmbC5taXhpbnMubGVuZ3RoJiZsLm1peGlucy5mb3JFYWNoKG5lKSxvLmV4dGVuZHMmJm5lKG8uZXh0ZW5kcyksby5taXhpbnMmJm8ubWl4aW5zLmZvckVhY2gobmUpfWlmKCFPJiYhSClyZXR1cm4gbS5zZXQobyx1LkVNUFRZX0FSUiksdS5FTVBUWV9BUlI7aWYodS5pc0FycmF5KE8pKWZvcih2YXIgTmU9MDtOZTxPLmxlbmd0aDtOZSsrKXt1LmlzU3RyaW5nKE9bTmVdKXx8c2UoInByb3BzIG11c3QgYmUgc3RyaW5ncyB3aGVuIHVzaW5nIGFycmF5IHN5bnRheC4iLE9bTmVdKTt2YXIgZmU9dS5jYW1lbGl6ZShPW05lXSk7U3QoZmUpJiYoTVtmZV09dS5FTVBUWV9PQkopfWVsc2UgaWYoTyl7dS5pc09iamVjdChPKXx8c2UoImludmFsaWQgcHJvcHMgb3B0aW9ucyIsTyk7Zm9yKHZhciBjZSBpbiBPKXt2YXIgRmU9dS5jYW1lbGl6ZShjZSk7aWYoU3QoRmUpKXt2YXIgVmU9T1tjZV0sbHQ9TVtGZV09dS5pc0FycmF5KFZlKXx8dS5pc0Z1bmN0aW9uKFZlKT97dHlwZTpWZX06VmU7aWYobHQpe3ZhciBtdD1SbihCb29sZWFuLGx0LnR5cGUpLHdlPVJuKFN0cmluZyxsdC50eXBlKTtsdFswXT1tdD4tMSxsdFsxXT13ZTwwfHxtdDx3ZSwobXQ+LTF8fHUuaGFzT3duKGx0LCJkZWZhdWx0IikpJiZZLnB1c2goRmUpfX19fXZhciBkZT1bTSxZXTtyZXR1cm4gbS5zZXQobyxkZSksZGV9ZnVuY3Rpb24gU3Qobyl7cmV0dXJuIG9bMF0hPT0iJCI/ITA6KHNlKCdJbnZhbGlkIHByb3AgbmFtZTogIicuY29uY2F0KG8sJyIgaXMgYSByZXNlcnZlZCBwcm9wZXJ0eS4nKSksITEpfWZ1bmN0aW9uIGh0KG8pe3ZhciBsPW8mJm8udG9TdHJpbmcoKS5tYXRjaCgvXlxzKmZ1bmN0aW9uIChcdyspLyk7cmV0dXJuIGw/bFsxXTpvPT09bnVsbD8ibnVsbCI6IiJ9ZnVuY3Rpb24gTHQobyxsKXtyZXR1cm4gaHQobyk9PT1odChsKX1mdW5jdGlvbiBSbihvLGwpe3JldHVybiB1LmlzQXJyYXkobCk/bC5maW5kSW5kZXgoaD0+THQoaCxvKSk6dS5pc0Z1bmN0aW9uKGwpJiZMdChsLG8pPzA6LTF9ZnVuY3Rpb24geG4obyxsLGgpe3ZhciBtPUkudG9SYXcobCksUz1oLnByb3BzT3B0aW9uc1swXTtmb3IodmFyIE8gaW4gUyl7dmFyIE09U1tPXTtNIT1udWxsJiZCbihPLG1bT10sTSwhdS5oYXNPd24obyxPKSYmIXUuaGFzT3duKG8sdS5oeXBoZW5hdGUoTykpKX19ZnVuY3Rpb24gQm4obyxsLGgsbSl7dmFye3R5cGU6UyxyZXF1aXJlZDpPLHZhbGlkYXRvcjpNfT1oO2lmKE8mJm0pe3NlKCdNaXNzaW5nIHJlcXVpcmVkIHByb3A6ICInK28rJyInKTtyZXR1cm59aWYoIShsPT1udWxsJiYhaC5yZXF1aXJlZCkpe2lmKFMhPW51bGwmJlMhPT0hMCl7Zm9yKHZhciBZPSExLEg9dS5pc0FycmF5KFMpP1M6W1NdLG5lPVtdLE5lPTA7TmU8SC5sZW5ndGgmJiFZO05lKyspe3Zhcnt2YWxpZDpmZSxleHBlY3RlZFR5cGU6Y2V9PVl0KGwsSFtOZV0pO25lLnB1c2goY2V8fCIiKSxZPWZlfWlmKCFZKXtzZShLbihvLGwsbmUpKTtyZXR1cm59fU0mJiFNKGwpJiZzZSgnSW52YWxpZCBwcm9wOiBjdXN0b20gdmFsaWRhdG9yIGNoZWNrIGZhaWxlZCBmb3IgcHJvcCAiJytvKyciLicpfX12YXIgTG49dS5tYWtlTWFwKCJTdHJpbmcsTnVtYmVyLEJvb2xlYW4sRnVuY3Rpb24sU3ltYm9sLEJpZ0ludCIpO2Z1bmN0aW9uIFl0KG8sbCl7dmFyIGgsbT1odChsKTtpZihMbihtKSl7dmFyIFM9dHlwZW9mIG87aD1TPT09bS50b0xvd2VyQ2FzZSgpLCFoJiZTPT09Im9iamVjdCImJihoPW8gaW5zdGFuY2VvZiBsKX1lbHNlIG09PT0iT2JqZWN0Ij9oPXUuaXNPYmplY3Qobyk6bT09PSJBcnJheSI/aD11LmlzQXJyYXkobyk6bT09PSJudWxsIj9oPW89PT1udWxsOmg9byBpbnN0YW5jZW9mIGw7cmV0dXJue3ZhbGlkOmgsZXhwZWN0ZWRUeXBlOm19fWZ1bmN0aW9uIEtuKG8sbCxoKXt2YXIgbT0nSW52YWxpZCBwcm9wOiB0eXBlIGNoZWNrIGZhaWxlZCBmb3IgcHJvcCAiJy5jb25jYXQobywnIi4nKSsiIEV4cGVjdGVkICIuY29uY2F0KGgubWFwKHUuY2FwaXRhbGl6ZSkuam9pbigiIHwgIikpLFM9aFswXSxPPXUudG9SYXdUeXBlKGwpLE09emEobCxTKSxZPXphKGwsTyk7cmV0dXJuIGgubGVuZ3RoPT09MSYmV2EoUykmJiF4byhTLE8pJiYobSs9IiB3aXRoIHZhbHVlICIuY29uY2F0KE0pKSxtKz0iLCBnb3QgIi5jb25jYXQoTywiICIpLFdhKE8pJiYobSs9IndpdGggdmFsdWUgIi5jb25jYXQoWSwiLiIpKSxtfWZ1bmN0aW9uIHphKG8sbCl7cmV0dXJuIGw9PT0iU3RyaW5nIj8nIicuY29uY2F0KG8sJyInKTpsPT09Ik51bWJlciI/IiIuY29uY2F0KE51bWJlcihvKSk6IiIuY29uY2F0KG8pfWZ1bmN0aW9uIFdhKG8pe3ZhciBsPVsic3RyaW5nIiwibnVtYmVyIiwiYm9vbGVhbiJdO3JldHVybiBsLnNvbWUoaD0+by50b0xvd2VyQ2FzZSgpPT09aCl9ZnVuY3Rpb24geG8oKXtmb3IodmFyIG89YXJndW1lbnRzLmxlbmd0aCxsPW5ldyBBcnJheShvKSxoPTA7aDxvO2grKylsW2hdPWFyZ3VtZW50c1toXTtyZXR1cm4gbC5zb21lKG09Pm0udG9Mb3dlckNhc2UoKT09PSJib29sZWFuIil9dmFyIEdhPW89Pm9bMF09PT0iXyJ8fG89PT0iJHN0YWJsZSIsQm89bz0+dS5pc0FycmF5KG8pP28ubWFwKGlvKTpbaW8obyldLFlhPShvLGwsaCk9PntpZihsLl9uKXJldHVybiBsO3ZhciBtPVJlKGZ1bmN0aW9uKCl7cmV0dXJuIEpuJiZzZSgnU2xvdCAiJy5jb25jYXQobywnIiBpbnZva2VkIG91dHNpZGUgb2YgdGhlIHJlbmRlciBmdW5jdGlvbjogJykrInRoaXMgd2lsbCBub3QgdHJhY2sgZGVwZW5kZW5jaWVzIHVzZWQgaW4gdGhlIHNsb3QuIEludm9rZSB0aGUgc2xvdCBmdW5jdGlvbiBpbnNpZGUgdGhlIHJlbmRlciBmdW5jdGlvbiBpbnN0ZWFkLiIpLEJvKGwoLi4uYXJndW1lbnRzKSl9LGgpO3JldHVybiBtLl9jPSExLG19LEJzPShvLGwsaCk9Pnt2YXIgbT1vLl9jdHg7Zm9yKHZhciBTIGluIG8paWYoIUdhKFMpKXt2YXIgTz1vW1NdO3UuaXNGdW5jdGlvbihPKT9sW1NdPVlhKFMsTyxtKTpPIT1udWxsJiZmdW5jdGlvbigpe3NlKCdOb24tZnVuY3Rpb24gdmFsdWUgZW5jb3VudGVyZWQgZm9yIHNsb3QgIicuY29uY2F0KFMsJyIuICcpKyJQcmVmZXIgZnVuY3Rpb24gc2xvdHMgZm9yIGJldHRlciBwZXJmb3JtYW5jZS4iKTt2YXIgTT1CbyhPKTtsW1NdPSgpPT5NfSgpfX0sQW49KG8sbCk9PnttcihvLnZub2RlKXx8c2UoIk5vbi1mdW5jdGlvbiB2YWx1ZSBlbmNvdW50ZXJlZCBmb3IgZGVmYXVsdCBzbG90LiBQcmVmZXIgZnVuY3Rpb24gc2xvdHMgZm9yIGJldHRlciBwZXJmb3JtYW5jZS4iKTt2YXIgaD1CbyhsKTtvLnNsb3RzLmRlZmF1bHQ9KCk9Pmh9LFlvPShvLGwpPT57aWYoby52bm9kZS5zaGFwZUZsYWcmMzIpe3ZhciBoPWwuXztoPyhvLnNsb3RzPUkudG9SYXcobCksdS5kZWYobCwiXyIsaCkpOkJzKGwsby5zbG90cz17fSl9ZWxzZSBvLnNsb3RzPXt9LGwmJkFuKG8sbCk7dS5kZWYoby5zbG90cyxGcywxKX0scW89KG8sbCxoKT0+e3Zhcnt2bm9kZTptLHNsb3RzOlN9PW8sTz0hMCxNPXUuRU1QVFlfT0JKO2lmKG0uc2hhcGVGbGFnJjMyKXt2YXIgWT1sLl87WT9Wcj91LmV4dGVuZChTLGwpOmgmJlk9PT0xP089ITE6KHUuZXh0ZW5kKFMsbCksIWgmJlk9PT0xJiZkZWxldGUgUy5fKTooTz0hbC4kc3RhYmxlLEJzKGwsUykpLE09bH1lbHNlIGwmJihBbihvLGwpLE09e2RlZmF1bHQ6MX0pO2lmKE8pZm9yKHZhciBIIGluIFMpIUdhKEgpJiYhKEggaW4gTSkmJmRlbGV0ZSBTW0hdfTtmdW5jdGlvbiBxYSgpe3JldHVybnthcHA6bnVsbCxjb25maWc6e2lzTmF0aXZlVGFnOnUuTk8scGVyZm9ybWFuY2U6ITEsZ2xvYmFsUHJvcGVydGllczp7fSxvcHRpb25NZXJnZVN0cmF0ZWdpZXM6e30sZXJyb3JIYW5kbGVyOnZvaWQgMCx3YXJuSGFuZGxlcjp2b2lkIDAsY29tcGlsZXJPcHRpb25zOnt9fSxtaXhpbnM6W10sY29tcG9uZW50czp7fSxkaXJlY3RpdmVzOnt9LHByb3ZpZGVzOk9iamVjdC5jcmVhdGUobnVsbCksb3B0aW9uc0NhY2hlOm5ldyBXZWFrTWFwLHByb3BzQ2FjaGU6bmV3IFdlYWtNYXAsZW1pdHNDYWNoZTpuZXcgV2Vha01hcH19dmFyIE1zPTA7ZnVuY3Rpb24gS2EobyxsKXtyZXR1cm4gZnVuY3Rpb24obSl7dmFyIFM9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOm51bGw7dS5pc0Z1bmN0aW9uKG0pfHwobT1PYmplY3QuYXNzaWduKHt9LG0pKSxTIT1udWxsJiYhdS5pc09iamVjdChTKSYmKHNlKCJyb290IHByb3BzIHBhc3NlZCB0byBhcHAubW91bnQoKSBtdXN0IGJlIGFuIG9iamVjdC4iKSxTPW51bGwpO3ZhciBPPXFhKCksTT1uZXcgU2V0LFk9ITEsSD1PLmFwcD17X3VpZDpNcysrLF9jb21wb25lbnQ6bSxfcHJvcHM6UyxfY29udGFpbmVyOm51bGwsX2NvbnRleHQ6TyxfaW5zdGFuY2U6bnVsbCx2ZXJzaW9uOnJsLGdldCBjb25maWcoKXtyZXR1cm4gTy5jb25maWd9LHNldCBjb25maWcobmUpe3NlKCJhcHAuY29uZmlnIGNhbm5vdCBiZSByZXBsYWNlZC4gTW9kaWZ5IGluZGl2aWR1YWwgb3B0aW9ucyBpbnN0ZWFkLiIpfSx1c2UobmUpe2Zvcih2YXIgTmU9YXJndW1lbnRzLmxlbmd0aCxmZT1uZXcgQXJyYXkoTmU+MT9OZS0xOjApLGNlPTE7Y2U8TmU7Y2UrKylmZVtjZS0xXT1hcmd1bWVudHNbY2VdO3JldHVybiBNLmhhcyhuZSk/c2UoIlBsdWdpbiBoYXMgYWxyZWFkeSBiZWVuIGFwcGxpZWQgdG8gdGFyZ2V0IGFwcC4iKTpuZSYmdS5pc0Z1bmN0aW9uKG5lLmluc3RhbGwpPyhNLmFkZChuZSksbmUuaW5zdGFsbChILC4uLmZlKSk6dS5pc0Z1bmN0aW9uKG5lKT8oTS5hZGQobmUpLG5lKEgsLi4uZmUpKTpzZSgnQSBwbHVnaW4gbXVzdCBlaXRoZXIgYmUgYSBmdW5jdGlvbiBvciBhbiBvYmplY3Qgd2l0aCBhbiAiaW5zdGFsbCIgZnVuY3Rpb24uJyksSH0sbWl4aW4obmUpe3JldHVybiBPLm1peGlucy5pbmNsdWRlcyhuZSk/c2UoIk1peGluIGhhcyBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0YXJnZXQgYXBwIisobmUubmFtZT8iOiAiLmNvbmNhdChuZS5uYW1lKToiIikpOk8ubWl4aW5zLnB1c2gobmUpLEh9LGNvbXBvbmVudChuZSxOZSl7cmV0dXJuIHRzKG5lLE8uY29uZmlnKSxOZT8oTy5jb21wb25lbnRzW25lXSYmc2UoJ0NvbXBvbmVudCAiJy5jb25jYXQobmUsJyIgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIGluIHRhcmdldCBhcHAuJykpLE8uY29tcG9uZW50c1tuZV09TmUsSCk6Ty5jb21wb25lbnRzW25lXX0sZGlyZWN0aXZlKG5lLE5lKXtyZXR1cm4gSXMobmUpLE5lPyhPLmRpcmVjdGl2ZXNbbmVdJiZzZSgnRGlyZWN0aXZlICInLmNvbmNhdChuZSwnIiBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgaW4gdGFyZ2V0IGFwcC4nKSksTy5kaXJlY3RpdmVzW25lXT1OZSxIKTpPLmRpcmVjdGl2ZXNbbmVdfSxtb3VudChuZSxOZSxmZSl7aWYoWSlzZSgiQXBwIGhhcyBhbHJlYWR5IGJlZW4gbW91bnRlZC5cbklmIHlvdSB3YW50IHRvIHJlbW91bnQgdGhlIHNhbWUgYXBwLCBtb3ZlIHlvdXIgYXBwIGNyZWF0aW9uIGxvZ2ljIGludG8gYSBmYWN0b3J5IGZ1bmN0aW9uIGFuZCBjcmVhdGUgZnJlc2ggYXBwIGluc3RhbmNlcyBmb3IgZWFjaCBtb3VudCAtIGUuZy4gYGNvbnN0IGNyZWF0ZU15QXBwID0gKCkgPT4gY3JlYXRlQXBwKEFwcClgIik7ZWxzZXtuZS5fX3Z1ZV9hcHBfXyYmc2UoIlRoZXJlIGlzIGFscmVhZHkgYW4gYXBwIGluc3RhbmNlIG1vdW50ZWQgb24gdGhlIGhvc3QgY29udGFpbmVyLlxuIElmIHlvdSB3YW50IHRvIG1vdW50IGFub3RoZXIgYXBwIG9uIHRoZSBzYW1lIGhvc3QgY29udGFpbmVyLCB5b3UgbmVlZCB0byB1bm1vdW50IHRoZSBwcmV2aW91cyBhcHAgYnkgY2FsbGluZyBgYXBwLnVubW91bnQoKWAgZmlyc3QuIik7dmFyIGNlPU1uKG0sUyk7cmV0dXJuIGNlLmFwcENvbnRleHQ9TyxPLnJlbG9hZD0oKT0+e28oTGkoY2UpLG5lLGZlKX0sTmUmJmw/bChjZSxuZSk6byhjZSxuZSxmZSksWT0hMCxILl9jb250YWluZXI9bmUsbmUuX192dWVfYXBwX189SCxILl9pbnN0YW5jZT1jZS5jb21wb25lbnQsUHIoSCxybCkscnMoY2UuY29tcG9uZW50KXx8Y2UuY29tcG9uZW50LnByb3h5fX0sdW5tb3VudCgpe1k/KG8obnVsbCxILl9jb250YWluZXIpLEguX2luc3RhbmNlPW51bGwsV3IoSCksZGVsZXRlIEguX2NvbnRhaW5lci5fX3Z1ZV9hcHBfXyk6c2UoIkNhbm5vdCB1bm1vdW50IGFuIGFwcCB0aGF0IGlzIG5vdCBtb3VudGVkLiIpfSxwcm92aWRlKG5lLE5lKXtyZXR1cm4gbmUgaW4gTy5wcm92aWRlcyYmc2UoJ0FwcCBhbHJlYWR5IHByb3ZpZGVzIHByb3BlcnR5IHdpdGgga2V5ICInLmNvbmNhdChTdHJpbmcobmUpLCciLiAnKSsiSXQgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aXRoIHRoZSBuZXcgdmFsdWUuIiksTy5wcm92aWRlc1tuZV09TmUsSH19O3JldHVybiBIfX1mdW5jdGlvbiBEaShvLGwsaCxtKXt2YXIgUz1hcmd1bWVudHMubGVuZ3RoPjQmJmFyZ3VtZW50c1s0XSE9PXZvaWQgMD9hcmd1bWVudHNbNF06ITE7aWYodS5pc0FycmF5KG8pKXtvLmZvckVhY2goKGx0LG10KT0+RGkobHQsbCYmKHUuaXNBcnJheShsKT9sW210XTpsKSxoLG0sUykpO3JldHVybn1pZighKHp0KG0pJiYhUykpe3ZhciBPPW0uc2hhcGVGbGFnJjQ/cnMobS5jb21wb25lbnQpfHxtLmNvbXBvbmVudC5wcm94eTptLmVsLE09Uz9udWxsOk8se2k6WSxyOkh9PW87aWYoIVkpe3NlKCJNaXNzaW5nIHJlZiBvd25lciBjb250ZXh0LiByZWYgY2Fubm90IGJlIHVzZWQgb24gaG9pc3RlZCB2bm9kZXMuIEEgdm5vZGUgd2l0aCByZWYgbXVzdCBiZSBjcmVhdGVkIGluc2lkZSB0aGUgcmVuZGVyIGZ1bmN0aW9uLiIpO3JldHVybn12YXIgbmU9bCYmbC5yLE5lPVkucmVmcz09PXUuRU1QVFlfT0JKP1kucmVmcz17fTpZLnJlZnMsZmU9WS5zZXR1cFN0YXRlO2lmKG5lIT1udWxsJiZuZSE9PUgmJih1LmlzU3RyaW5nKG5lKT8oTmVbbmVdPW51bGwsdS5oYXNPd24oZmUsbmUpJiYoZmVbbmVdPW51bGwpKTpJLmlzUmVmKG5lKSYmKG5lLnZhbHVlPW51bGwpKSx1LmlzRnVuY3Rpb24oSCkpRnQoSCxZLDEyLFtNLE5lXSk7ZWxzZXt2YXIgY2U9dS5pc1N0cmluZyhIKSxGZT1JLmlzUmVmKEgpO2lmKGNlfHxGZSl7dmFyIFZlPSgpPT57aWYoby5mKXt2YXIgbHQ9Y2U/TmVbSF06SC52YWx1ZTtTP3UuaXNBcnJheShsdCkmJnUucmVtb3ZlKGx0LE8pOnUuaXNBcnJheShsdCk/bHQuaW5jbHVkZXMoTyl8fGx0LnB1c2goTyk6Y2U/KE5lW0hdPVtPXSx1Lmhhc093bihmZSxIKSYmKGZlW0hdPU5lW0hdKSk6KEgudmFsdWU9W09dLG8uayYmKE5lW28ua109SC52YWx1ZSkpfWVsc2UgY2U/KE5lW0hdPU0sdS5oYXNPd24oZmUsSCkmJihmZVtIXT1NKSk6RmU/KEgudmFsdWU9TSxvLmsmJihOZVtvLmtdPU0pKTpzZSgiSW52YWxpZCB0ZW1wbGF0ZSByZWYgdHlwZToiLEgsIigiLmNvbmNhdCh0eXBlb2YgSCwiKSIpKX07TT8oVmUuaWQ9LTEsam4oVmUsaCkpOlZlKCl9ZWxzZSBzZSgiSW52YWxpZCB0ZW1wbGF0ZSByZWYgdHlwZToiLEgsIigiLmNvbmNhdCh0eXBlb2YgSCwiKSIpKX19fXZhciB1cj0hMSxPbj1vPT4vc3ZnLy50ZXN0KG8ubmFtZXNwYWNlVVJJKSYmby50YWdOYW1lIT09ImZvcmVpZ25PYmplY3QiLHJvPW89Pm8ubm9kZVR5cGU9PT04O2Z1bmN0aW9uIEphKG8pe3ZhcnttdDpsLHA6aCxvOntwYXRjaFByb3A6bSxjcmVhdGVUZXh0OlMsbmV4dFNpYmxpbmc6TyxwYXJlbnROb2RlOk0scmVtb3ZlOlksaW5zZXJ0OkgsY3JlYXRlQ29tbWVudDpuZX19PW8sTmU9KHdlLGRlKT0+e2lmKCFkZS5oYXNDaGlsZE5vZGVzKCkpe3NlKCJBdHRlbXB0aW5nIHRvIGh5ZHJhdGUgZXhpc3RpbmcgbWFya3VwIGJ1dCBjb250YWluZXIgaXMgZW1wdHkuIFBlcmZvcm1pbmcgZnVsbCBtb3VudCBpbnN0ZWFkLiIpLGgobnVsbCx3ZSxkZSksR2koKSxkZS5fdm5vZGU9d2U7cmV0dXJufXVyPSExLGZlKGRlLmZpcnN0Q2hpbGQsd2UsbnVsbCxudWxsLG51bGwpLEdpKCksZGUuX3Zub2RlPXdlLHVyJiZjb25zb2xlLmVycm9yKCJIeWRyYXRpb24gY29tcGxldGVkIGJ1dCBjb250YWlucyBtaXNtYXRjaGVzLiIpfSxmZT1mdW5jdGlvbih3ZSxkZSxTZSxudCx6ZSl7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD41JiZhcmd1bWVudHNbNV0hPT12b2lkIDA/YXJndW1lbnRzWzVdOiExLGE9cm8od2UpJiZ3ZS5kYXRhPT09IlsiLGY9KCk9Pmx0KHdlLGRlLFNlLG50LHplLGEpLHt0eXBlOnAscmVmOncsc2hhcGVGbGFnOkUscGF0Y2hGbGFnOk59PWRlLEw9d2Uubm9kZVR5cGU7ZGUuZWw9d2UsTj09PS0yJiYoaT0hMSxkZS5keW5hbWljQ2hpbGRyZW49bnVsbCk7dmFyIFI9bnVsbDtzd2l0Y2gocCl7Y2FzZSBqdDpMIT09Mz9kZS5jaGlsZHJlbj09PSIiPyhIKGRlLmVsPVMoIiIpLE0od2UpLHdlKSxSPXdlKTpSPWYoKTood2UuZGF0YSE9PWRlLmNoaWxkcmVuJiYodXI9ITAsc2UoIkh5ZHJhdGlvbiB0ZXh0IG1pc21hdGNoOiIrYAotIENsaWVudDogYC5jb25jYXQoSlNPTi5zdHJpbmdpZnkod2UuZGF0YSkpK2AKLSBTZXJ2ZXI6IGAuY29uY2F0KEpTT04uc3RyaW5naWZ5KGRlLmNoaWxkcmVuKSkpLHdlLmRhdGE9ZGUuY2hpbGRyZW4pLFI9Tyh3ZSkpO2JyZWFrO2Nhc2UgaXQ6TCE9PTh8fGE/Uj1mKCk6Uj1PKHdlKTticmVhaztjYXNlIGZuOmlmKEwhPT0xJiZMIT09MylSPWYoKTtlbHNle1I9d2U7Zm9yKHZhciBLPSFkZS5jaGlsZHJlbi5sZW5ndGgsdWU9MDt1ZTxkZS5zdGF0aWNDb3VudDt1ZSsrKUsmJihkZS5jaGlsZHJlbis9Ui5ub2RlVHlwZT09PTE/Ui5vdXRlckhUTUw6Ui5kYXRhKSx1ZT09PWRlLnN0YXRpY0NvdW50LTEmJihkZS5hbmNob3I9UiksUj1PKFIpO3JldHVybiBSfWJyZWFrO2Nhc2UgSHQ6YT9SPVZlKHdlLGRlLFNlLG50LHplLGkpOlI9ZigpO2JyZWFrO2RlZmF1bHQ6aWYoRSYxKUwhPT0xfHxkZS50eXBlLnRvTG93ZXJDYXNlKCkhPT13ZS50YWdOYW1lLnRvTG93ZXJDYXNlKCk/Uj1mKCk6Uj1jZSh3ZSxkZSxTZSxudCx6ZSxpKTtlbHNlIGlmKEUmNil7ZGUuc2xvdFNjb3BlSWRzPXplO3ZhciBvZT1NKHdlKTtpZihsKGRlLG9lLG51bGwsU2UsbnQsT24ob2UpLGkpLFI9YT9tdCh3ZSk6Tyh3ZSksUiYmcm8oUikmJlIuZGF0YT09PSJ0ZWxlcG9ydCBlbmQiJiYoUj1PKFIpKSx6dChkZSkpe3ZhciB0ZTthPyh0ZT1NbihIdCksdGUuYW5jaG9yPVI/Ui5wcmV2aW91c1NpYmxpbmc6b2UubGFzdENoaWxkKTp0ZT13ZS5ub2RlVHlwZT09PTM/ZXMoIiIpOk1uKCJkaXYiKSx0ZS5lbD13ZSxkZS5jb21wb25lbnQuc3ViVHJlZT10ZX19ZWxzZSBFJjY0P0whPT04P1I9ZigpOlI9ZGUudHlwZS5oeWRyYXRlKHdlLGRlLFNlLG50LHplLGksbyxGZSk6RSYxMjg/Uj1kZS50eXBlLmh5ZHJhdGUod2UsZGUsU2UsbnQsT24oTSh3ZSkpLHplLGksbyxmZSk6c2UoIkludmFsaWQgSG9zdFZOb2RlIHR5cGU6IixwLCIoIi5jb25jYXQodHlwZW9mIHAsIikiKSl9cmV0dXJuIHchPW51bGwmJkRpKHcsbnVsbCxudCxkZSksUn0sY2U9KHdlLGRlLFNlLG50LHplLGkpPT57aT1pfHwhIWRlLmR5bmFtaWNDaGlsZHJlbjt2YXJ7dHlwZTphLHByb3BzOmYscGF0Y2hGbGFnOnAsc2hhcGVGbGFnOncsZGlyczpFfT1kZSxOPWE9PT0iaW5wdXQiJiZFfHxhPT09Im9wdGlvbiI7e2lmKEUmJkpyKGRlLG51bGwsU2UsImNyZWF0ZWQiKSxmKWlmKE58fCFpfHxwJigxNnwzMikpZm9yKHZhciBMIGluIGYpKE4mJkwuZW5kc1dpdGgoInZhbHVlIil8fHUuaXNPbihMKSYmIXUuaXNSZXNlcnZlZFByb3AoTCkpJiZtKHdlLEwsbnVsbCxmW0xdLCExLHZvaWQgMCxTZSk7ZWxzZSBmLm9uQ2xpY2smJm0od2UsIm9uQ2xpY2siLG51bGwsZi5vbkNsaWNrLCExLHZvaWQgMCxTZSk7dmFyIFI7aWYoKFI9ZiYmZi5vblZub2RlQmVmb3JlTW91bnQpJiZEcihSLFNlLGRlKSxFJiZKcihkZSxudWxsLFNlLCJiZWZvcmVNb3VudCIpLCgoUj1mJiZmLm9uVm5vZGVNb3VudGVkKXx8RSkmJmtyKCgpPT57UiYmRHIoUixTZSxkZSksRSYmSnIoZGUsbnVsbCxTZSwibW91bnRlZCIpfSxudCksdyYxNiYmIShmJiYoZi5pbm5lckhUTUx8fGYudGV4dENvbnRlbnQpKSlmb3IodmFyIEs9RmUod2UuZmlyc3RDaGlsZCxkZSx3ZSxTZSxudCx6ZSxpKSx1ZT0hMTtLOyl7dXI9ITAsdWV8fChzZSgiSHlkcmF0aW9uIGNoaWxkcmVuIG1pc21hdGNoIGluIDwiLmNvbmNhdChkZS50eXBlLCI+OiAiKSsic2VydmVyIHJlbmRlcmVkIGVsZW1lbnQgY29udGFpbnMgbW9yZSBjaGlsZCBub2RlcyB0aGFuIGNsaWVudCB2ZG9tLiIpLHVlPSEwKTt2YXIgb2U9SztLPUsubmV4dFNpYmxpbmcsWShvZSl9ZWxzZSB3JjgmJndlLnRleHRDb250ZW50IT09ZGUuY2hpbGRyZW4mJih1cj0hMCxzZSgiSHlkcmF0aW9uIHRleHQgY29udGVudCBtaXNtYXRjaCBpbiA8Ii5jb25jYXQoZGUudHlwZSxgPjoKYCkrIi0gQ2xpZW50OiAiLmNvbmNhdCh3ZS50ZXh0Q29udGVudCxgCmApKyItIFNlcnZlcjogIi5jb25jYXQoZGUuY2hpbGRyZW4pKSx3ZS50ZXh0Q29udGVudD1kZS5jaGlsZHJlbil9cmV0dXJuIHdlLm5leHRTaWJsaW5nfSxGZT0od2UsZGUsU2UsbnQsemUsaSxhKT0+e2E9YXx8ISFkZS5keW5hbWljQ2hpbGRyZW47Zm9yKHZhciBmPWRlLmNoaWxkcmVuLHA9Zi5sZW5ndGgsdz0hMSxFPTA7RTxwO0UrKyl7dmFyIE49YT9mW0VdOmZbRV09aW8oZltFXSk7aWYod2Upd2U9ZmUod2UsTixudCx6ZSxpLGEpO2Vsc2V7aWYoTi50eXBlPT09anQmJiFOLmNoaWxkcmVuKWNvbnRpbnVlO3VyPSEwLHd8fChzZSgiSHlkcmF0aW9uIGNoaWxkcmVuIG1pc21hdGNoIGluIDwiLmNvbmNhdChTZS50YWdOYW1lLnRvTG93ZXJDYXNlKCksIj46ICIpKyJzZXJ2ZXIgcmVuZGVyZWQgZWxlbWVudCBjb250YWlucyBmZXdlciBjaGlsZCBub2RlcyB0aGFuIGNsaWVudCB2ZG9tLiIpLHc9ITApLGgobnVsbCxOLFNlLG51bGwsbnQsemUsT24oU2UpLGkpfX1yZXR1cm4gd2V9LFZlPSh3ZSxkZSxTZSxudCx6ZSxpKT0+e3ZhcntzbG90U2NvcGVJZHM6YX09ZGU7YSYmKHplPXplP3plLmNvbmNhdChhKTphKTt2YXIgZj1NKHdlKSxwPUZlKE8od2UpLGRlLGYsU2UsbnQsemUsaSk7cmV0dXJuIHAmJnJvKHApJiZwLmRhdGE9PT0iXSI/TyhkZS5hbmNob3I9cCk6KHVyPSEwLEgoZGUuYW5jaG9yPW5lKCJdIiksZixwKSxwKX0sbHQ9KHdlLGRlLFNlLG50LHplLGkpPT57aWYodXI9ITAsc2UoYEh5ZHJhdGlvbiBub2RlIG1pc21hdGNoOgotIENsaWVudCB2bm9kZTpgLGRlLnR5cGUsYAotIFNlcnZlciByZW5kZXJlZCBET006YCx3ZSx3ZS5ub2RlVHlwZT09PTM/Iih0ZXh0KSI6cm8od2UpJiZ3ZS5kYXRhPT09IlsiPyIoc3RhcnQgb2YgZnJhZ21lbnQpIjoiIiksZGUuZWw9bnVsbCxpKWZvcih2YXIgYT1tdCh3ZSk7Oyl7dmFyIGY9Tyh3ZSk7aWYoZiYmZiE9PWEpWShmKTtlbHNlIGJyZWFrfXZhciBwPU8od2UpLHc9TSh3ZSk7cmV0dXJuIFkod2UpLGgobnVsbCxkZSx3LHAsU2UsbnQsT24odyksemUpLHB9LG10PXdlPT57Zm9yKHZhciBkZT0wO3dlOylpZih3ZT1PKHdlKSx3ZSYmcm8od2UpJiYod2UuZGF0YT09PSJbIiYmZGUrKyx3ZS5kYXRhPT09Il0iKSl7aWYoZGU9PT0wKXJldHVybiBPKHdlKTtkZS0tfXJldHVybiB3ZX07cmV0dXJuW05lLGZlXX12YXIgQWEsd2k7ZnVuY3Rpb24gJHIobyxsKXtvLmFwcENvbnRleHQuY29uZmlnLnBlcmZvcm1hbmNlJiZGaSgpJiZ3aS5tYXJrKCJ2dWUtIi5jb25jYXQobCwiLSIpLmNvbmNhdChvLnVpZCkpLHVvKG8sbCxGaSgpP3dpLm5vdygpOkRhdGUubm93KCkpfWZ1bmN0aW9uIFNyKG8sbCl7aWYoby5hcHBDb250ZXh0LmNvbmZpZy5wZXJmb3JtYW5jZSYmRmkoKSl7dmFyIGg9InZ1ZS0iLmNvbmNhdChsLCItIikuY29uY2F0KG8udWlkKSxtPWgrIjplbmQiO3dpLm1hcmsobSksd2kubWVhc3VyZSgiPCIuY29uY2F0KGRhKG8sby50eXBlKSwiPiAiKS5jb25jYXQobCksaCxtKSx3aS5jbGVhck1hcmtzKGgpLHdpLmNsZWFyTWFya3MobSl9X2kobyxsLEZpKCk/d2kubm93KCk6RGF0ZS5ub3coKSl9ZnVuY3Rpb24gRmkoKXtyZXR1cm4gQWEhPT12b2lkIDB8fCh0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmd2luZG93LnBlcmZvcm1hbmNlPyhBYT0hMCx3aT13aW5kb3cucGVyZm9ybWFuY2UpOkFhPSExKSxBYX1mdW5jdGlvbiBkcygpe3ZhciBvPVtdO2lmKG8ubGVuZ3RoKXt2YXIgbD1vLmxlbmd0aD4xO2NvbnNvbGUud2FybigiRmVhdHVyZSBmbGFnIi5jb25jYXQobD8icyI6IiIsIiAiKS5jb25jYXQoby5qb2luKCIsICIpLCIgIikuY29uY2F0KGw/ImFyZSI6ImlzIiwiIG5vdCBleHBsaWNpdGx5IGRlZmluZWQuIFlvdSBhcmUgcnVubmluZyB0aGUgZXNtLWJ1bmRsZXIgYnVpbGQgb2YgVnVlLCAiKStgd2hpY2ggZXhwZWN0cyB0aGVzZSBjb21waWxlLXRpbWUgZmVhdHVyZSBmbGFncyB0byBiZSBnbG9iYWxseSBpbmplY3RlZCB2aWEgdGhlIGJ1bmRsZXIgY29uZmlnIGluIG9yZGVyIHRvIGdldCBiZXR0ZXIgdHJlZS1zaGFraW5nIGluIHRoZSBwcm9kdWN0aW9uIGJ1bmRsZS4KCkZvciBtb3JlIGRldGFpbHMsIHNlZSBodHRwczovL2xpbmsudnVlanMub3JnL2ZlYXR1cmUtZmxhZ3MuYCl9fXZhciBqbj1rcjtmdW5jdGlvbiBDcihvKXtyZXR1cm4gU2kobyl9ZnVuY3Rpb24gaHMobyl7cmV0dXJuIFNpKG8sSmEpfWZ1bmN0aW9uIFNpKG8sbCl7ZHMoKTt2YXIgaD11LmdldEdsb2JhbFRoaXMoKTtoLl9fVlVFX189ITAsRXIoaC5fX1ZVRV9ERVZUT09MU19HTE9CQUxfSE9PS19fLGgpO3ZhcntpbnNlcnQ6bSxyZW1vdmU6UyxwYXRjaFByb3A6Tyxmb3JjZVBhdGNoUHJvcDpNLGNyZWF0ZUVsZW1lbnQ6WSxjcmVhdGVUZXh0OkgsY3JlYXRlQ29tbWVudDpuZSxzZXRUZXh0Ok5lLHNldEVsZW1lbnRUZXh0OmZlLHBhcmVudE5vZGU6Y2UsbmV4dFNpYmxpbmc6RmUsc2V0U2NvcGVJZDpWZT11Lk5PT1AsY2xvbmVOb2RlOmx0LGluc2VydFN0YXRpY0NvbnRlbnQ6bXR9PW8sd2U9ZnVuY3Rpb24oeCxVLGhlKXt2YXIgSWU9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOm51bGwsUGU9YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOm51bGwsSmU9YXJndW1lbnRzLmxlbmd0aD41JiZhcmd1bWVudHNbNV0hPT12b2lkIDA/YXJndW1lbnRzWzVdOm51bGwsY3Q9YXJndW1lbnRzLmxlbmd0aD42JiZhcmd1bWVudHNbNl0hPT12b2lkIDA/YXJndW1lbnRzWzZdOiExLFhlPWFyZ3VtZW50cy5sZW5ndGg+NyYmYXJndW1lbnRzWzddIT09dm9pZCAwP2FyZ3VtZW50c1s3XTpudWxsLHR0PWFyZ3VtZW50cy5sZW5ndGg+OCYmYXJndW1lbnRzWzhdIT09dm9pZCAwP2FyZ3VtZW50c1s4XTpWcj8hMTohIVUuZHluYW1pY0NoaWxkcmVuO2lmKHghPT1VKXt4JiYhZnIoeCxVKSYmKEllPVllKHgpLG1lKHgsUGUsSmUsITApLHg9bnVsbCksVS5wYXRjaEZsYWc9PT0tMiYmKHR0PSExLFUuZHluYW1pY0NoaWxkcmVuPW51bGwpO3Zhcnt0eXBlOldlLHJlZjpDdCxzaGFwZUZsYWc6cHR9PVU7c3dpdGNoKFdlKXtjYXNlIGp0OmRlKHgsVSxoZSxJZSk7YnJlYWs7Y2FzZSBpdDpTZSh4LFUsaGUsSWUpO2JyZWFrO2Nhc2UgZm46eD09bnVsbD9udChVLGhlLEllLGN0KTp6ZSh4LFUsaGUsY3QpO2JyZWFrO2Nhc2UgSHQ6Syh4LFUsaGUsSWUsUGUsSmUsY3QsWGUsdHQpO2JyZWFrO2RlZmF1bHQ6cHQmMT9mKHgsVSxoZSxJZSxQZSxKZSxjdCxYZSx0dCk6cHQmNj91ZSh4LFUsaGUsSWUsUGUsSmUsY3QsWGUsdHQpOnB0JjY0fHxwdCYxMjg/V2UucHJvY2Vzcyh4LFUsaGUsSWUsUGUsSmUsY3QsWGUsdHQsVHQpOnNlKCJJbnZhbGlkIFZOb2RlIHR5cGU6IixXZSwiKCIuY29uY2F0KHR5cGVvZiBXZSwiKSIpKX1DdCE9bnVsbCYmUGUmJkRpKEN0LHgmJngucmVmLEplLFV8fHgsIVUpfX0sZGU9KHgsVSxoZSxJZSk9PntpZih4PT1udWxsKW0oVS5lbD1IKFUuY2hpbGRyZW4pLGhlLEllKTtlbHNle3ZhciBQZT1VLmVsPXguZWw7VS5jaGlsZHJlbiE9PXguY2hpbGRyZW4mJk5lKFBlLFUuY2hpbGRyZW4pfX0sU2U9KHgsVSxoZSxJZSk9Pnt4PT1udWxsP20oVS5lbD1uZShVLmNoaWxkcmVufHwiIiksaGUsSWUpOlUuZWw9eC5lbH0sbnQ9KHgsVSxoZSxJZSk9PntbeC5lbCx4LmFuY2hvcl09bXQoeC5jaGlsZHJlbixVLGhlLEllLHguZWwseC5hbmNob3IpfSx6ZT0oeCxVLGhlLEllKT0+e2lmKFUuY2hpbGRyZW4hPT14LmNoaWxkcmVuKXt2YXIgUGU9RmUoeC5hbmNob3IpO2EoeCksW1UuZWwsVS5hbmNob3JdPW10KFUuY2hpbGRyZW4saGUsUGUsSWUpfWVsc2UgVS5lbD14LmVsLFUuYW5jaG9yPXguYW5jaG9yfSxpPSh4LFUsaGUpPT57Zm9yKHZhcntlbDpJZSxhbmNob3I6UGV9PXgsSmU7SWUmJkllIT09UGU7KUplPUZlKEllKSxtKEllLFUsaGUpLEllPUplO20oUGUsVSxoZSl9LGE9eD0+e2Zvcih2YXJ7ZWw6VSxhbmNob3I6aGV9PXgsSWU7VSYmVSE9PWhlOylJZT1GZShVKSxTKFUpLFU9SWU7UyhoZSl9LGY9KHgsVSxoZSxJZSxQZSxKZSxjdCxYZSx0dCk9PntjdD1jdHx8VS50eXBlPT09InN2ZyIseD09bnVsbD9wKFUsaGUsSWUsUGUsSmUsY3QsWGUsdHQpOk4oeCxVLFBlLEplLGN0LFhlLHR0KX0scD0oeCxVLGhlLEllLFBlLEplLGN0LFhlKT0+e3ZhciB0dCxXZSx7dHlwZTpDdCxwcm9wczpwdCxzaGFwZUZsYWc6UHQsdHJhbnNpdGlvbjplbixwYXRjaEZsYWc6bm4sZGlyczpXdH09eDt7aWYodHQ9eC5lbD1ZKHgudHlwZSxKZSxwdCYmcHQuaXMscHQpLFB0Jjg/ZmUodHQseC5jaGlsZHJlbik6UHQmMTYmJkUoeC5jaGlsZHJlbix0dCxudWxsLEllLFBlLEplJiZDdCE9PSJmb3JlaWduT2JqZWN0IixjdCxYZSksV3QmJkpyKHgsbnVsbCxJZSwiY3JlYXRlZCIpLHB0KXtmb3IodmFyIGduIGluIHB0KWduIT09InZhbHVlIiYmIXUuaXNSZXNlcnZlZFByb3AoZ24pJiZPKHR0LGduLG51bGwscHRbZ25dLEplLHguY2hpbGRyZW4sSWUsUGUsZHQseC5ob3N0SW5zdGFuY2UpOyJ2YWx1ZSJpbiBwdCYmTyh0dCwidmFsdWUiLG51bGwscHQudmFsdWUsITEsW10sSWUsbnVsbCx2b2lkIDAseC5ob3N0SW5zdGFuY2UpLChXZT1wdC5vblZub2RlQmVmb3JlTW91bnQpJiZEcihXZSxJZSx4KX13KHR0LHgseC5zY29wZUlkLGN0LEllKX1PYmplY3QuZGVmaW5lUHJvcGVydHkodHQsIl9fdm5vZGUiLHt2YWx1ZTp4LGVudW1lcmFibGU6ITF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodHQsIl9fdnVlUGFyZW50Q29tcG9uZW50Iix7dmFsdWU6SWUsZW51bWVyYWJsZTohMX0pLFd0JiZKcih4LG51bGwsSWUsImJlZm9yZU1vdW50Iik7dmFyIFduPSghUGV8fFBlJiYhUGUucGVuZGluZ0JyYW5jaCkmJmVuJiYhZW4ucGVyc2lzdGVkO1duJiZlbi5iZWZvcmVFbnRlcih0dCksbSh0dCxVLGhlKSwoKFdlPXB0JiZwdC5vblZub2RlTW91bnRlZCl8fFdufHxXdCkmJmpuKCgpPT57V2UmJkRyKFdlLEllLHgpLFduJiZlbi5lbnRlcih0dCksV3QmJkpyKHgsbnVsbCxJZSwibW91bnRlZCIpfSxQZSl9LHc9KHgsVSxoZSxJZSxQZSk9PntpZihoZSYmVmUoeCxoZSksSWUpZm9yKHZhciBKZT0wO0plPEllLmxlbmd0aDtKZSsrKVZlKHgsSWVbSmVdKTtpZihQZSl7dmFyIGN0PVBlLnN1YlRyZWU7aWYoY3QucGF0Y2hGbGFnPjAmJmN0LnBhdGNoRmxhZyYyMDQ4JiYoY3Q9UmkoY3QuY2hpbGRyZW4pfHxjdCksVT09PWN0KXt2YXIgWGU9UGUudm5vZGU7dyh4LFhlLFhlLnNjb3BlSWQsWGUuc2xvdFNjb3BlSWRzLFBlLnBhcmVudCl9fX0sRT1mdW5jdGlvbih4LFUsaGUsSWUsUGUsSmUsY3QsWGUpe2Zvcih2YXIgdHQ9YXJndW1lbnRzLmxlbmd0aD44JiZhcmd1bWVudHNbOF0hPT12b2lkIDA/YXJndW1lbnRzWzhdOjAsV2U9dHQ7V2U8eC5sZW5ndGg7V2UrKyl7dmFyIEN0PXhbV2VdPVhlP1RuKHhbV2VdKTppbyh4W1dlXSk7d2UobnVsbCxDdCxVLGhlLEllLFBlLEplLGN0LFhlKX19LE49KHgsVSxoZSxJZSxQZSxKZSxjdCk9Pnt2YXIgWGU9VS5lbD14LmVsLHtwYXRjaEZsYWc6dHQsZHluYW1pY0NoaWxkcmVuOldlLGRpcnM6Q3R9PVU7dHR8PXgucGF0Y2hGbGFnJjE2O3ZhciBwdD14LnByb3BzfHx1LkVNUFRZX09CSixQdD1VLnByb3BzfHx1LkVNUFRZX09CSixlbjtoZSYmdm8oaGUsITEpLChlbj1QdC5vblZub2RlQmVmb3JlVXBkYXRlKSYmRHIoZW4saGUsVSx4KSxDdCYmSnIoVSx4LGhlLCJiZWZvcmVVcGRhdGUiKSxoZSYmdm8oaGUsITApLFZyJiYodHQ9MCxjdD0hMSxXZT1udWxsKTt2YXIgbm49UGUmJlUudHlwZSE9PSJmb3JlaWduT2JqZWN0IjtpZihXZT8oTCh4LmR5bmFtaWNDaGlsZHJlbixXZSxYZSxoZSxJZSxubixKZSksaGUmJmhlLnR5cGUuX19obXJJZCYmYWkoeCxVKSk6Y3R8fHJ0KHgsVSxYZSxudWxsLGhlLEllLG5uLEplLCExKSx0dD4wKXtpZih0dCYxNilSKFhlLFUscHQsUHQsaGUsSWUsUGUpO2Vsc2UgaWYodHQmMiYmcHQuY2xhc3MhPT1QdC5jbGFzcyYmTyhYZSwiY2xhc3MiLG51bGwsUHQuY2xhc3MsUGUsW10saGUsbnVsbCx2b2lkIDAsVS5ob3N0SW5zdGFuY2UpLHR0JjQmJk8oWGUsInN0eWxlIixwdC5zdHlsZSxQdC5zdHlsZSxQZSxbXSxoZSxudWxsLHZvaWQgMCxVLmhvc3RJbnN0YW5jZSksdHQmOClmb3IodmFyIFd0PVUuZHluYW1pY1Byb3BzLGduPTA7Z248V3QubGVuZ3RoO2duKyspe3ZhciBXbj1XdFtnbl0sVm89cHRbV25dLHVpPVB0W1duXTsodWkhPT1Wb3x8V249PT0idmFsdWUifHxNJiZNKFhlLFduKSkmJk8oWGUsV24sVm8sdWksUGUseC5jaGlsZHJlbixoZSxJZSxkdCxVLmhvc3RJbnN0YW5jZSl9dHQmMSYmeC5jaGlsZHJlbiE9PVUuY2hpbGRyZW4mJmZlKFhlLFUuY2hpbGRyZW4pfWVsc2UhY3QmJldlPT1udWxsJiZSKFhlLFUscHQsUHQsaGUsSWUsUGUpOygoZW49UHQub25Wbm9kZVVwZGF0ZWQpfHxDdCkmJmpuKCgpPT57ZW4mJkRyKGVuLGhlLFUseCksQ3QmJkpyKFUseCxoZSwidXBkYXRlZCIpfSxJZSl9LEw9KHgsVSxoZSxJZSxQZSxKZSxjdCk9Pntmb3IodmFyIFhlPTA7WGU8VS5sZW5ndGg7WGUrKyl7dmFyIHR0PXhbWGVdLFdlPVVbWGVdLEN0PXR0LmVsJiYodHQudHlwZT09PUh0fHwhZnIodHQsV2UpfHx0dC5zaGFwZUZsYWcmKDZ8NjQpKT9jZSh0dC5lbCk6aGU7d2UodHQsV2UsQ3QsbnVsbCxJZSxQZSxKZSxjdCwhMCl9fSxSPSh4LFUsaGUsSWUsUGUsSmUsY3QpPT57aWYoaGUhPT1JZSl7Zm9yKHZhciBYZSBpbiBJZSlpZighdS5pc1Jlc2VydmVkUHJvcChYZSkpe3ZhciB0dD1JZVtYZV0sV2U9aGVbWGVdOyh0dCE9PVdlJiZYZSE9PSJ2YWx1ZSJ8fE0mJk0oeCxYZSkpJiZPKHgsWGUsV2UsdHQsY3QsVS5jaGlsZHJlbixQZSxKZSxkdCxVLmhvc3RJbnN0YW5jZSl9aWYoaGUhPT11LkVNUFRZX09CSilmb3IodmFyIEN0IGluIGhlKSF1LmlzUmVzZXJ2ZWRQcm9wKEN0KSYmIShDdCBpbiBJZSkmJk8oeCxDdCxoZVtDdF0sbnVsbCxjdCxVLmNoaWxkcmVuLFBlLEplLGR0LFUuaG9zdEluc3RhbmNlKTsidmFsdWUiaW4gSWUmJk8oeCwidmFsdWUiLGhlLnZhbHVlLEllLnZhbHVlLCExLFtdLFBlLG51bGwsdm9pZCAwLFUuaG9zdEluc3RhbmNlKX19LEs9KHgsVSxoZSxJZSxQZSxKZSxjdCxYZSx0dCk9Pnt2YXIgV2U9VS5lbD14P3guZWw6SCgiIiksQ3Q9VS5hbmNob3I9eD94LmFuY2hvcjpIKCIiKSx7cGF0Y2hGbGFnOnB0LGR5bmFtaWNDaGlsZHJlbjpQdCxzbG90U2NvcGVJZHM6ZW59PVU7KFZyfHxwdCYyMDQ4KSYmKHB0PTAsdHQ9ITEsUHQ9bnVsbCksZW4mJihYZT1YZT9YZS5jb25jYXQoZW4pOmVuKSx4PT1udWxsPyhtKFdlLGhlLEllKSxtKEN0LGhlLEllKSxFKFUuY2hpbGRyZW4saGUsQ3QsUGUsSmUsY3QsWGUsdHQpKTpwdD4wJiZwdCY2NCYmUHQmJnguZHluYW1pY0NoaWxkcmVuPyhMKHguZHluYW1pY0NoaWxkcmVuLFB0LGhlLFBlLEplLGN0LFhlKSxQZSYmUGUudHlwZS5fX2htcklkP2FpKHgsVSk6KFUua2V5IT1udWxsfHxQZSYmVT09PVBlLnN1YlRyZWUpJiZhaSh4LFUsITApKTpydCh4LFUsaGUsQ3QsUGUsSmUsY3QsWGUsdHQpfSx1ZT0oeCxVLGhlLEllLFBlLEplLGN0LFhlLHR0KT0+e1Uuc2xvdFNjb3BlSWRzPVhlLHg9PW51bGw/VS5zaGFwZUZsYWcmNTEyP1BlLmN0eC5hY3RpdmF0ZShVLGhlLEllLGN0LHR0KTpvZShVLGhlLEllLFBlLEplLGN0LHR0KTp0ZSh4LFUsdHQpfSxvZT0oeCxVLGhlLEllLFBlLEplLGN0KT0+e3ZhciBYZT14LmNvbXBvbmVudD1PbCh4LEllLFBlKTtpZihYZS50eXBlLl9faG1ySWQmJnFpKFhlKSx0bih4KSwkcihYZSwibW91bnQiKSxtcih4KSYmKFhlLmN0eC5yZW5kZXJlcj1UdCksJHIoWGUsImluaXQiKSxGbyhYZSksU3IoWGUsImluaXQiKSxYZS5hc3luY0RlcCl7aWYoUGUmJlBlLnJlZ2lzdGVyRGVwKFhlLEVlKSwheC5lbCl7dmFyIHR0PVhlLnN1YlRyZWU9TW4oaXQpO1NlKG51bGwsdHQsVSxoZSl9cmV0dXJufUVlKFhlLHgsVSxoZSxQZSxKZSxjdCksQSgpLFNyKFhlLCJtb3VudCIpfSx0ZT0oeCxVLGhlKT0+e3ZhciBJZT1VLmNvbXBvbmVudD14LmNvbXBvbmVudDtpZihYdCh4LFUsaGUpKWlmKEllLmFzeW5jRGVwJiYhSWUuYXN5bmNSZXNvbHZlZCl7dG4oVSksSGUoSWUsVSxoZSksQSgpO3JldHVybn1lbHNlIEllLm5leHQ9VSxvcihJZS51cGRhdGUpLEllLnVwZGF0ZSgpO2Vsc2UgVS5lbD14LmVsLEllLnZub2RlPVV9LEVlPSh4LFUsaGUsSWUsUGUsSmUsY3QpPT57dmFyIFhlPSgpPT57aWYoeC5pc01vdW50ZWQpe3ZhcntuZXh0OmhyLGJ1OkJhLHU6aixwYXJlbnQ6WCx2bm9kZTp5ZX09eCxEZT1ocix4ZTt0bihocnx8eC52bm9kZSksdm8oeCwhMSksaHI/KGhyLmVsPXllLmVsLEhlKHgsaHIsY3QpKTpocj15ZSxCYSYmdS5pbnZva2VBcnJheUZucyhCYSksKHhlPWhyLnByb3BzJiZoci5wcm9wcy5vblZub2RlQmVmb3JlVXBkYXRlKSYmRHIoeGUsWCxocix5ZSksdm8oeCwhMCksJHIoeCwicmVuZGVyIik7dmFyIFFlPWtpKHgpO1NyKHgsInJlbmRlciIpO3ZhciBzdD14LnN1YlRyZWU7eC5zdWJUcmVlPVFlLCRyKHgsInBhdGNoIiksd2Uoc3QsUWUsY2Uoc3QuZWwpLFllKHN0KSx4LFBlLEplKSxTcih4LCJwYXRjaCIpLGhyLmVsPVFlLmVsLERlPT09bnVsbCYmeGkoeCxRZS5lbCksaiYmam4oaixQZSksKHhlPWhyLnByb3BzJiZoci5wcm9wcy5vblZub2RlVXBkYXRlZCkmJmpuKCgpPT5Ecih4ZSxYLGhyLHllKSxQZSksZXIoeCksQSgpfWVsc2V7dmFyIEN0LHtlbDpwdCxwcm9wczpQdH09VSx7Ym06ZW4sbTpubixwYXJlbnQ6V3R9PXgsZ249enQoVSk7aWYodm8oeCwhMSksZW4mJnUuaW52b2tlQXJyYXlGbnMoZW4pLCFnbiYmKEN0PVB0JiZQdC5vblZub2RlQmVmb3JlTW91bnQpJiZEcihDdCxXdCxVKSx2byh4LCEwKSxwdCYmJHQpe3ZhciBXbj0oKT0+eyRyKHgsInJlbmRlciIpLHguc3ViVHJlZT1raSh4KSxTcih4LCJyZW5kZXIiKSwkcih4LCJoeWRyYXRlIiksJHQocHQseC5zdWJUcmVlLHgsUGUsbnVsbCksU3IoeCwiaHlkcmF0ZSIpfTtnbj9VLnR5cGUuX19hc3luY0xvYWRlcigpLnRoZW4oKCk9PiF4LmlzVW5tb3VudGVkJiZXbigpKTpXbigpfWVsc2V7JHIoeCwicmVuZGVyIik7dmFyIFZvPXguc3ViVHJlZT1raSh4KTtTcih4LCJyZW5kZXIiKSwkcih4LCJwYXRjaCIpLHdlKG51bGwsVm8saGUsSWUseCxQZSxKZSksU3IoeCwicGF0Y2giKSxVLmVsPVZvLmVsfWlmKG5uJiZqbihubixQZSksIWduJiYoQ3Q9UHQmJlB0Lm9uVm5vZGVNb3VudGVkKSl7dmFyIHVpPVU7am4oKCk9PkRyKEN0LFd0LHVpKSxQZSl9KFUuc2hhcGVGbGFnJjI1Nnx8V3QmJnp0KFd0LnZub2RlKSYmV3Qudm5vZGUuc2hhcGVGbGFnJjI1NikmJnguYSYmam4oeC5hLFBlKSx4LmlzTW91bnRlZD0hMCxHcih4KSxVPWhlPUllPW51bGx9fSx0dD14LmVmZmVjdD1uZXcgSS5SZWFjdGl2ZUVmZmVjdChYZSwoKT0+SWkoV2UpLHguc2NvcGUpLFdlPXgudXBkYXRlPSgpPT50dC5ydW4oKTtXZS5pZD14LnVpZCx2byh4LCEwKSx0dC5vblRyYWNrPXgucnRjP0N0PT51Lmludm9rZUFycmF5Rm5zKHgucnRjLEN0KTp2b2lkIDAsdHQub25UcmlnZ2VyPXgucnRnP0N0PT51Lmludm9rZUFycmF5Rm5zKHgucnRnLEN0KTp2b2lkIDAsV2Uub3duZXJJbnN0YW5jZT14LFdlKCl9LEhlPSh4LFUsaGUpPT57VS5jb21wb25lbnQ9eDt2YXIgSWU9eC52bm9kZS5wcm9wczt4LnZub2RlPVUseC5uZXh0PW51bGwsZ3QoeCxVLnByb3BzLEllLGhlKSxxbyh4LFUuY2hpbGRyZW4saGUpLEkucGF1c2VUcmFja2luZygpLFdpKHZvaWQgMCx4LnVwZGF0ZSksSS5yZXNldFRyYWNraW5nKCl9LHJ0PWZ1bmN0aW9uKHgsVSxoZSxJZSxQZSxKZSxjdCxYZSl7dmFyIHR0PWFyZ3VtZW50cy5sZW5ndGg+OCYmYXJndW1lbnRzWzhdIT09dm9pZCAwP2FyZ3VtZW50c1s4XTohMSxXZT14JiZ4LmNoaWxkcmVuLEN0PXg/eC5zaGFwZUZsYWc6MCxwdD1VLmNoaWxkcmVuLHtwYXRjaEZsYWc6UHQsc2hhcGVGbGFnOmVufT1VO2lmKFB0PjApe2lmKFB0JjEyOCl7dmUoV2UscHQsaGUsSWUsUGUsSmUsY3QsWGUsdHQpO3JldHVybn1lbHNlIGlmKFB0JjI1Nil7ZnQoV2UscHQsaGUsSWUsUGUsSmUsY3QsWGUsdHQpO3JldHVybn19ZW4mOD8oQ3QmMTYmJmR0KFdlLFBlLEplKSxwdCE9PVdlJiZmZShoZSxwdCkpOkN0JjE2P2VuJjE2P3ZlKFdlLHB0LGhlLEllLFBlLEplLGN0LFhlLHR0KTpkdChXZSxQZSxKZSwhMCk6KEN0JjgmJmZlKGhlLCIiKSxlbiYxNiYmRShwdCxoZSxJZSxQZSxKZSxjdCxYZSx0dCkpfSxmdD0oeCxVLGhlLEllLFBlLEplLGN0LFhlLHR0KT0+e3g9eHx8dS5FTVBUWV9BUlIsVT1VfHx1LkVNUFRZX0FSUjt2YXIgV2U9eC5sZW5ndGgsQ3Q9VS5sZW5ndGgscHQ9TWF0aC5taW4oV2UsQ3QpLFB0O2ZvcihQdD0wO1B0PHB0O1B0Kyspe3ZhciBlbj1VW1B0XT10dD9UbihVW1B0XSk6aW8oVVtQdF0pO3dlKHhbUHRdLGVuLGhlLG51bGwsUGUsSmUsY3QsWGUsdHQpfVdlPkN0P2R0KHgsUGUsSmUsITAsITEscHQpOkUoVSxoZSxJZSxQZSxKZSxjdCxYZSx0dCxwdCl9LHZlPSh4LFUsaGUsSWUsUGUsSmUsY3QsWGUsdHQpPT57Zm9yKHZhciBXZT0wLEN0PVUubGVuZ3RoLHB0PXgubGVuZ3RoLTEsUHQ9Q3QtMTtXZTw9cHQmJldlPD1QdDspe3ZhciBlbj14W1dlXSxubj1VW1dlXT10dD9UbihVW1dlXSk6aW8oVVtXZV0pO2lmKGZyKGVuLG5uKSl3ZShlbixubixoZSxudWxsLFBlLEplLGN0LFhlLHR0KTtlbHNlIGJyZWFrO1dlKyt9Zm9yKDtXZTw9cHQmJldlPD1QdDspe3ZhciBXdD14W3B0XSxnbj1VW1B0XT10dD9UbihVW1B0XSk6aW8oVVtQdF0pO2lmKGZyKFd0LGduKSl3ZShXdCxnbixoZSxudWxsLFBlLEplLGN0LFhlLHR0KTtlbHNlIGJyZWFrO3B0LS0sUHQtLX1pZihXZT5wdCl7aWYoV2U8PVB0KWZvcih2YXIgV249UHQrMSxWbz1XbjxDdD9VW1duXS5lbDpJZTtXZTw9UHQ7KXdlKG51bGwsVVtXZV09dHQ/VG4oVVtXZV0pOmlvKFVbV2VdKSxoZSxWbyxQZSxKZSxjdCxYZSx0dCksV2UrK31lbHNlIGlmKFdlPlB0KWZvcig7V2U8PXB0OyltZSh4W1dlXSxQZSxKZSwhMCksV2UrKztlbHNle3ZhciB1aT1XZSxocj1XZSxCYT1uZXcgTWFwO2ZvcihXZT1ocjtXZTw9UHQ7V2UrKyl7dmFyIGo9VVtXZV09dHQ/VG4oVVtXZV0pOmlvKFVbV2VdKTtqLmtleSE9bnVsbCYmKEJhLmhhcyhqLmtleSkmJnNlKCJEdXBsaWNhdGUga2V5cyBmb3VuZCBkdXJpbmcgdXBkYXRlOiIsSlNPTi5zdHJpbmdpZnkoai5rZXkpLCJNYWtlIHN1cmUga2V5cyBhcmUgdW5pcXVlLiIpLEJhLnNldChqLmtleSxXZSkpfXZhciBYLHllPTAsRGU9UHQtaHIrMSx4ZT0hMSxRZT0wLHN0PW5ldyBBcnJheShEZSk7Zm9yKFdlPTA7V2U8RGU7V2UrKylzdFtXZV09MDtmb3IoV2U9dWk7V2U8PXB0O1dlKyspe3ZhciBLZT14W1dlXTtpZih5ZT49RGUpe21lKEtlLFBlLEplLCEwKTtjb250aW51ZX12YXIgZXQ9dm9pZCAwO2lmKEtlLmtleSE9bnVsbClldD1CYS5nZXQoS2Uua2V5KTtlbHNlIGZvcihYPWhyO1g8PVB0O1grKylpZihzdFtYLWhyXT09PTAmJmZyKEtlLFVbWF0pKXtldD1YO2JyZWFrfWV0PT09dm9pZCAwP21lKEtlLFBlLEplLCEwKTooc3RbZXQtaHJdPVdlKzEsZXQ+PVFlP1FlPWV0OnhlPSEwLHdlKEtlLFVbZXRdLGhlLG51bGwsUGUsSmUsY3QsWGUsdHQpLHllKyspfXZhciBqZT14ZT9NbyhzdCk6dS5FTVBUWV9BUlI7Zm9yKFg9amUubGVuZ3RoLTEsV2U9RGUtMTtXZT49MDtXZS0tKXt2YXIgUnQ9aHIrV2UsTXQ9VVtSdF0seHQ9UnQrMTxDdD9VW1J0KzFdLmVsOkllO3N0W1dlXT09PTA/d2UobnVsbCxNdCxoZSx4dCxQZSxKZSxjdCxYZSx0dCk6eGUmJihYPDB8fFdlIT09amVbWF0/bGUoTXQsaGUseHQsMik6WC0tKX19fSxsZT1mdW5jdGlvbih4LFUsaGUsSWUpe3ZhciBQZT1hcmd1bWVudHMubGVuZ3RoPjQmJmFyZ3VtZW50c1s0XSE9PXZvaWQgMD9hcmd1bWVudHNbNF06bnVsbCx7ZWw6SmUsdHlwZTpjdCx0cmFuc2l0aW9uOlhlLGNoaWxkcmVuOnR0LHNoYXBlRmxhZzpXZX09eDtpZihXZSY2KXtsZSh4LmNvbXBvbmVudC5zdWJUcmVlLFUsaGUsSWUpO3JldHVybn1pZihXZSYxMjgpe3guc3VzcGVuc2UubW92ZShVLGhlLEllKTtyZXR1cm59aWYoV2UmNjQpe2N0Lm1vdmUoeCxVLGhlLFR0KTtyZXR1cm59aWYoY3Q9PT1IdCl7bShKZSxVLGhlKTtmb3IodmFyIEN0PTA7Q3Q8dHQubGVuZ3RoO0N0KyspbGUodHRbQ3RdLFUsaGUsSWUpO20oeC5hbmNob3IsVSxoZSk7cmV0dXJufWlmKGN0PT09Zm4pe2koeCxVLGhlKTtyZXR1cm59dmFyIHB0PUllIT09MiYmV2UmMSYmWGU7aWYocHQpaWYoSWU9PT0wKVhlLmJlZm9yZUVudGVyKEplKSxtKEplLFUsaGUpLGpuKCgpPT5YZS5lbnRlcihKZSksUGUpO2Vsc2V7dmFye2xlYXZlOlB0LGRlbGF5TGVhdmU6ZW4sYWZ0ZXJMZWF2ZTpubn09WGUsV3Q9KCk9Pm0oSmUsVSxoZSksZ249KCk9PntQdChKZSwoKT0+e1d0KCksbm4mJm5uKCl9KX07ZW4/ZW4oSmUsV3QsZ24pOmduKCl9ZWxzZSBtKEplLFUsaGUpfSxtZT1mdW5jdGlvbih4LFUsaGUpe3ZhciBJZT1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106ITEsUGU9YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOiExLHt0eXBlOkplLHByb3BzOmN0LHJlZjpYZSxjaGlsZHJlbjp0dCxkeW5hbWljQ2hpbGRyZW46V2Usc2hhcGVGbGFnOkN0LHBhdGNoRmxhZzpwdCxkaXJzOlB0fT14O2lmKFhlIT1udWxsJiZEaShYZSxudWxsLGhlLHgsITApLEN0JjI1Nil7VS5jdHguZGVhY3RpdmF0ZSh4KTtyZXR1cm59dmFyIGVuPUN0JjEmJlB0LG5uPSF6dCh4KSxXdDtpZihubiYmKFd0PWN0JiZjdC5vblZub2RlQmVmb3JlVW5tb3VudCkmJkRyKFd0LFUseCksQ3QmNilvdCh4LmNvbXBvbmVudCxoZSxJZSk7ZWxzZXtpZihDdCYxMjgpe3guc3VzcGVuc2UudW5tb3VudChoZSxJZSk7cmV0dXJufWVuJiZKcih4LG51bGwsVSwiYmVmb3JlVW5tb3VudCIpLEN0JjY0P3gudHlwZS5yZW1vdmUoeCxVLGhlLFBlLFR0LEllKTpXZSYmKEplIT09SHR8fHB0PjAmJnB0JjY0KT9kdChXZSxVLGhlLCExLCEwKTooSmU9PT1IdCYmcHQmKDEyOHwyNTYpfHwhUGUmJkN0JjE2KSYmZHQodHQsVSxoZSksSWUmJlplKHgpfShubiYmKFd0PWN0JiZjdC5vblZub2RlVW5tb3VudGVkKXx8ZW4pJiZqbigoKT0+e1d0JiZEcihXdCxVLHgpLGVuJiZKcih4LG51bGwsVSwidW5tb3VudGVkIil9LGhlKX0sWmU9eD0+e3Zhcnt0eXBlOlUsZWw6aGUsYW5jaG9yOkllLHRyYW5zaXRpb246UGV9PXg7aWYoVT09PUh0KXt4LnBhdGNoRmxhZz4wJiZ4LnBhdGNoRmxhZyYyMDQ4JiZQZSYmIVBlLnBlcnNpc3RlZD94LmNoaWxkcmVuLmZvckVhY2goV2U9PntXZS50eXBlPT09aXQ/UyhXZS5lbCk6WmUoV2UpfSk6T2UoaGUsSWUpO3JldHVybn1pZihVPT09Zm4pe2EoeCk7cmV0dXJufXZhciBKZT0oKT0+e1MoaGUpLFBlJiYhUGUucGVyc2lzdGVkJiZQZS5hZnRlckxlYXZlJiZQZS5hZnRlckxlYXZlKCl9O2lmKHguc2hhcGVGbGFnJjEmJlBlJiYhUGUucGVyc2lzdGVkKXt2YXJ7bGVhdmU6Y3QsZGVsYXlMZWF2ZTpYZX09UGUsdHQ9KCk9PmN0KGhlLEplKTtYZT9YZSh4LmVsLEplLHR0KTp0dCgpfWVsc2UgSmUoKX0sT2U9KHgsVSk9Pntmb3IodmFyIGhlO3ghPT1VOyloZT1GZSh4KSxTKHgpLHg9aGU7UyhVKX0sb3Q9KHgsVSxoZSk9Pnt4LnR5cGUuX19obXJJZCYmU28oeCk7dmFye2J1bTpJZSxzY29wZTpQZSx1cGRhdGU6SmUsc3ViVHJlZTpjdCx1bTpYZX09eDtJZSYmdS5pbnZva2VBcnJheUZucyhJZSksUGUuc3RvcCgpLEplJiYoSmUuYWN0aXZlPSExLG1lKGN0LHgsVSxoZSkpLFhlJiZqbihYZSxVKSxqbigoKT0+e3guaXNVbm1vdW50ZWQ9ITB9LFUpLFUmJlUucGVuZGluZ0JyYW5jaCYmIVUuaXNVbm1vdW50ZWQmJnguYXN5bmNEZXAmJiF4LmFzeW5jUmVzb2x2ZWQmJnguc3VzcGVuc2VJZD09PVUucGVuZGluZ0lkJiYoVS5kZXBzLS0sVS5kZXBzPT09MCYmVS5yZXNvbHZlKCkpLEtpKHgpfSxkdD1mdW5jdGlvbih4LFUsaGUpe2Zvcih2YXIgSWU9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiExLFBlPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTohMSxKZT1hcmd1bWVudHMubGVuZ3RoPjUmJmFyZ3VtZW50c1s1XSE9PXZvaWQgMD9hcmd1bWVudHNbNV06MCxjdD1KZTtjdDx4Lmxlbmd0aDtjdCsrKW1lKHhbY3RdLFUsaGUsSWUsUGUpfSxZZT14PT54LnNoYXBlRmxhZyY2P1llKHguY29tcG9uZW50LnN1YlRyZWUpOnguc2hhcGVGbGFnJjEyOD94LnN1c3BlbnNlLm5leHQoKTpGZSh4LmFuY2hvcnx8eC5lbCksT3Q9KHgsVSxoZSk9Pnt4PT1udWxsP1UuX3Zub2RlJiZtZShVLl92bm9kZSxudWxsLG51bGwsITApOndlKFUuX3Zub2RlfHxudWxsLHgsVSxudWxsLG51bGwsbnVsbCxoZSksR2koKSxVLl92bm9kZT14fSxUdD17cDp3ZSx1bTptZSxtOmxlLHI6WmUsbXQ6b2UsbWM6RSxwYzpydCxwYmM6TCxuOlllLG99LHd0LCR0O3JldHVybiBsJiYoW3d0LCR0XT1sKFR0KSkse3JlbmRlcjpPdCxoeWRyYXRlOnd0LGNyZWF0ZUFwcDpLYShPdCx3dCl9fWZ1bmN0aW9uIHZvKG8sbCl7dmFye2VmZmVjdDpoLHVwZGF0ZTptfT1vO2guYWxsb3dSZWN1cnNlPW0uYWxsb3dSZWN1cnNlPWx9ZnVuY3Rpb24gYWkobyxsKXt2YXIgaD1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06ITEsbT1vLmNoaWxkcmVuLFM9bC5jaGlsZHJlbjtpZih1LmlzQXJyYXkobSkmJnUuaXNBcnJheShTKSlmb3IodmFyIE89MDtPPG0ubGVuZ3RoO08rKyl7dmFyIE09bVtPXSxZPVNbT107WS5zaGFwZUZsYWcmMSYmIVkuZHluYW1pY0NoaWxkcmVuJiYoKFkucGF0Y2hGbGFnPD0wfHxZLnBhdGNoRmxhZz09PTMyKSYmKFk9U1tPXT1UbihTW09dKSxZLmVsPU0uZWwpLGh8fGFpKE0sWSkpLFkudHlwZT09PWl0JiYhWS5lbCYmKFkuZWw9TS5lbCl9fWZ1bmN0aW9uIE1vKG8pe3ZhciBsPW8uc2xpY2UoKSxoPVswXSxtLFMsTyxNLFksSD1vLmxlbmd0aDtmb3IobT0wO208SDttKyspe3ZhciBuZT1vW21dO2lmKG5lIT09MCl7aWYoUz1oW2gubGVuZ3RoLTFdLG9bU108bmUpe2xbbV09UyxoLnB1c2gobSk7Y29udGludWV9Zm9yKE89MCxNPWgubGVuZ3RoLTE7TzxNOylZPU8rTT4+MSxvW2hbWV1dPG5lP089WSsxOk09WTtuZTxvW2hbT11dJiYoTz4wJiYobFttXT1oW08tMV0pLGhbT109bSl9fWZvcihPPWgubGVuZ3RoLE09aFtPLTFdO08tLSA+MDspaFtPXT1NLE09bFtNXTtyZXR1cm4gaH12YXIgWmE9bz0+by5fX2lzVGVsZXBvcnQsQ2k9bz0+byYmKG8uZGlzYWJsZWR8fG8uZGlzYWJsZWQ9PT0iIiksbW89bz0+dHlwZW9mIFNWR0VsZW1lbnQhPSJ1bmRlZmluZWQiJiZvIGluc3RhbmNlb2YgU1ZHRWxlbWVudCxYYT0obyxsKT0+e3ZhciBoPW8mJm8udG87aWYodS5pc1N0cmluZyhoKSlpZihsKXt2YXIgbT1sKGgpO3JldHVybiBtfHxzZSgnRmFpbGVkIHRvIGxvY2F0ZSBUZWxlcG9ydCB0YXJnZXQgd2l0aCBzZWxlY3RvciAiJy5jb25jYXQoaCwnIi4gJykrIk5vdGUgdGhlIHRhcmdldCBlbGVtZW50IG11c3QgZXhpc3QgYmVmb3JlIHRoZSBjb21wb25lbnQgaXMgbW91bnRlZCAtIGkuZS4gdGhlIHRhcmdldCBjYW5ub3QgYmUgcmVuZGVyZWQgYnkgdGhlIGNvbXBvbmVudCBpdHNlbGYsIGFuZCBpZGVhbGx5IHNob3VsZCBiZSBvdXRzaWRlIG9mIHRoZSBlbnRpcmUgVnVlIGNvbXBvbmVudCB0cmVlLiIpLG19ZWxzZSByZXR1cm4gc2UoIkN1cnJlbnQgcmVuZGVyZXIgZG9lcyBub3Qgc3VwcG9ydCBzdHJpbmcgdGFyZ2V0IGZvciBUZWxlcG9ydHMuIChtaXNzaW5nIHF1ZXJ5U2VsZWN0b3IgcmVuZGVyZXIgb3B0aW9uKSIpLG51bGw7ZWxzZSByZXR1cm4haCYmIUNpKG8pJiZzZSgiSW52YWxpZCBUZWxlcG9ydCB0YXJnZXQ6ICIuY29uY2F0KGgpKSxofSxEcz17X19pc1RlbGVwb3J0OiEwLHByb2Nlc3MobyxsLGgsbSxTLE8sTSxZLEgsbmUpe3ZhcnttYzpOZSxwYzpmZSxwYmM6Y2Usbzp7aW5zZXJ0OkZlLHF1ZXJ5U2VsZWN0b3I6VmUsY3JlYXRlVGV4dDpsdCxjcmVhdGVDb21tZW50Om10fX09bmUsd2U9Q2kobC5wcm9wcykse3NoYXBlRmxhZzpkZSxjaGlsZHJlbjpTZSxkeW5hbWljQ2hpbGRyZW46bnR9PWw7aWYoVnImJihIPSExLG50PW51bGwpLG89PW51bGwpe3ZhciB6ZT1sLmVsPW10KCJ0ZWxlcG9ydCBzdGFydCIpLGk9bC5hbmNob3I9bXQoInRlbGVwb3J0IGVuZCIpO0ZlKHplLGgsbSksRmUoaSxoLG0pO3ZhciBhPWwudGFyZ2V0PVhhKGwucHJvcHMsVmUpLGY9bC50YXJnZXRBbmNob3I9bHQoIiIpO2E/KEZlKGYsYSksTT1NfHxtbyhhKSk6d2V8fHNlKCJJbnZhbGlkIFRlbGVwb3J0IHRhcmdldCBvbiBtb3VudDoiLGEsIigiLmNvbmNhdCh0eXBlb2YgYSwiKSIpKTt2YXIgcD0ob2UsdGUpPT57ZGUmMTYmJk5lKFNlLG9lLHRlLFMsTyxNLFksSCl9O3dlP3AoaCxpKTphJiZwKGEsZil9ZWxzZXtsLmVsPW8uZWw7dmFyIHc9bC5hbmNob3I9by5hbmNob3IsRT1sLnRhcmdldD1vLnRhcmdldCxOPWwudGFyZ2V0QW5jaG9yPW8udGFyZ2V0QW5jaG9yLEw9Q2koby5wcm9wcyksUj1MP2g6RSxLPUw/dzpOO2lmKE09TXx8bW8oRSksbnQ/KGNlKG8uZHluYW1pY0NoaWxkcmVuLG50LFIsUyxPLE0sWSksYWkobyxsLCEwKSk6SHx8ZmUobyxsLFIsSyxTLE8sTSxZLCExKSx3ZSlMfHxVZShsLGgsdyxuZSwxKTtlbHNlIGlmKChsLnByb3BzJiZsLnByb3BzLnRvKSE9PShvLnByb3BzJiZvLnByb3BzLnRvKSl7dmFyIHVlPWwudGFyZ2V0PVhhKGwucHJvcHMsVmUpO3VlP1VlKGwsdWUsbnVsbCxuZSwwKTpzZSgiSW52YWxpZCBUZWxlcG9ydCB0YXJnZXQgb24gdXBkYXRlOiIsRSwiKCIuY29uY2F0KHR5cGVvZiBFLCIpIikpfWVsc2UgTCYmVWUobCxFLE4sbmUsMSl9fSxyZW1vdmUobyxsLGgsbSxTLE8pe3Zhcnt1bTpNLG86e3JlbW92ZTpZfX09Uyx7c2hhcGVGbGFnOkgsY2hpbGRyZW46bmUsYW5jaG9yOk5lLHRhcmdldEFuY2hvcjpmZSx0YXJnZXQ6Y2UscHJvcHM6RmV9PW87aWYoY2UmJlkoZmUpLChPfHwhQ2koRmUpKSYmKFkoTmUpLEgmMTYpKWZvcih2YXIgVmU9MDtWZTxuZS5sZW5ndGg7VmUrKyl7dmFyIGx0PW5lW1ZlXTtNKGx0LGwsaCwhMCwhIWx0LmR5bmFtaWNDaGlsZHJlbil9fSxtb3ZlOlVlLGh5ZHJhdGU6SXR9O2Z1bmN0aW9uIFVlKG8sbCxoLG0pe3ZhcntvOntpbnNlcnQ6U30sbTpPfT1tLE09YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOjI7TT09PTAmJlMoby50YXJnZXRBbmNob3IsbCxoKTt2YXJ7ZWw6WSxhbmNob3I6SCxzaGFwZUZsYWc6bmUsY2hpbGRyZW46TmUscHJvcHM6ZmV9PW8sY2U9TT09PTI7aWYoY2UmJlMoWSxsLGgpLCghY2V8fENpKGZlKSkmJm5lJjE2KWZvcih2YXIgRmU9MDtGZTxOZS5sZW5ndGg7RmUrKylPKE5lW0ZlXSxsLGgsMik7Y2UmJlMoSCxsLGgpfWZ1bmN0aW9uIEl0KG8sbCxoLG0sUyxPLE0sWSl7dmFye286e25leHRTaWJsaW5nOkgscGFyZW50Tm9kZTpuZSxxdWVyeVNlbGVjdG9yOk5lfX09TSxmZT1sLnRhcmdldD1YYShsLnByb3BzLE5lKTtpZihmZSl7dmFyIGNlPWZlLl9scGF8fGZlLmZpcnN0Q2hpbGQ7aWYobC5zaGFwZUZsYWcmMTYpaWYoQ2kobC5wcm9wcykpbC5hbmNob3I9WShIKG8pLGwsbmUobyksaCxtLFMsTyksbC50YXJnZXRBbmNob3I9Y2U7ZWxzZXtsLmFuY2hvcj1IKG8pO2Zvcih2YXIgRmU9Y2U7RmU7KWlmKEZlPUgoRmUpLEZlJiZGZS5ub2RlVHlwZT09PTgmJkZlLmRhdGE9PT0idGVsZXBvcnQgYW5jaG9yIil7bC50YXJnZXRBbmNob3I9RmUsZmUuX2xwYT1sLnRhcmdldEFuY2hvciYmSChsLnRhcmdldEFuY2hvcik7YnJlYWt9WShjZSxsLGZlLGgsbSxTLE8pfX1yZXR1cm4gbC5hbmNob3ImJkgobC5hbmNob3IpfXZhciBCdD1EcyxIdD1TeW1ib2woIkZyYWdtZW50IiksanQ9U3ltYm9sKCJUZXh0IiksaXQ9U3ltYm9sKCJDb21tZW50IiksZm49U3ltYm9sKCJTdGF0aWMiKSxCcj1bXSxycj1udWxsO2Z1bmN0aW9uIE1yKCl7dmFyIG89YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOiExO0JyLnB1c2gocnI9bz9udWxsOltdKX1mdW5jdGlvbiBfbygpe0JyLnBvcCgpLHJyPUJyW0JyLmxlbmd0aC0xXXx8bnVsbH12YXIgT2E9MTtmdW5jdGlvbiBLbyhvKXtPYSs9b31mdW5jdGlvbiBlbChvKXtyZXR1cm4gby5keW5hbWljQ2hpbGRyZW49T2E+MD9ycnx8dS5FTVBUWV9BUlI6bnVsbCxfbygpLE9hPjAmJnJyJiZyci5wdXNoKG8pLG99ZnVuY3Rpb24gbmMobyxsLGgsbSxTLE8pe3JldHVybiBlbChwcyhvLGwsaCxtLFMsTywhMCkpfWZ1bmN0aW9uIHdsKG8sbCxoLG0sUyl7cmV0dXJuIGVsKE1uKG8sbCxoLG0sUywhMCkpfWZ1bmN0aW9uIGJvKG8pe3JldHVybiBvP28uX192X2lzVk5vZGU9PT0hMDohMX1mdW5jdGlvbiBmcihvLGwpe3JldHVybiBsLnNoYXBlRmxhZyY2JiZhci5oYXMobC50eXBlKT8hMTpvLnR5cGU9PT1sLnR5cGUmJm8ua2V5PT09bC5rZXl9dmFyIHNpO2Z1bmN0aW9uIFRhKG8pe3NpPW99dmFyIFNsPWZ1bmN0aW9uKCl7Zm9yKHZhciBvPWFyZ3VtZW50cy5sZW5ndGgsbD1uZXcgQXJyYXkobyksaD0wO2g8bztoKyspbFtoXT1hcmd1bWVudHNbaF07cmV0dXJuIHpuKC4uLnNpP3NpKGwsd24pOmwpfSxGcz0iX192SW50ZXJuYWwiLERvPW89Pnt2YXJ7a2V5Omx9PW87cmV0dXJuIGwhPW51bGw/bDpudWxsfSxRYT1vPT57dmFye3JlZjpsLHJlZl9rZXk6aCxyZWZfZm9yOm19PW87cmV0dXJuIGwhPW51bGw/dS5pc1N0cmluZyhsKXx8SS5pc1JlZihsKXx8dS5pc0Z1bmN0aW9uKGwpP3tpOnduLHI6bCxrOmgsZjohIW19Omw6bnVsbH07ZnVuY3Rpb24gcHMobyl7dmFyIGw9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOm51bGwsaD1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06bnVsbCxtPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTowLFM9YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOm51bGwsTz1hcmd1bWVudHMubGVuZ3RoPjUmJmFyZ3VtZW50c1s1XSE9PXZvaWQgMD9hcmd1bWVudHNbNV06bz09PUh0PzA6MSxNPWFyZ3VtZW50cy5sZW5ndGg+NiYmYXJndW1lbnRzWzZdIT09dm9pZCAwP2FyZ3VtZW50c1s2XTohMSxZPWFyZ3VtZW50cy5sZW5ndGg+NyYmYXJndW1lbnRzWzddIT09dm9pZCAwP2FyZ3VtZW50c1s3XTohMSxIPXtfX3ZfaXNWTm9kZTohMCxfX3Zfc2tpcDohMCx0eXBlOm8scHJvcHM6bCxrZXk6bCYmRG8obCkscmVmOmwmJlFhKGwpLHNjb3BlSWQ6U24sc2xvdFNjb3BlSWRzOm51bGwsY2hpbGRyZW46aCxjb21wb25lbnQ6bnVsbCxzdXNwZW5zZTpudWxsLHNzQ29udGVudDpudWxsLHNzRmFsbGJhY2s6bnVsbCxkaXJzOm51bGwsdHJhbnNpdGlvbjpudWxsLGVsOm51bGwsYW5jaG9yOm51bGwsdGFyZ2V0Om51bGwsdGFyZ2V0QW5jaG9yOm51bGwsc3RhdGljQ291bnQ6MCxzaGFwZUZsYWc6TyxwYXRjaEZsYWc6bSxkeW5hbWljUHJvcHM6UyxkeW5hbWljQ2hpbGRyZW46bnVsbCxhcHBDb250ZXh0Om51bGwsaG9zdEluc3RhbmNlOndufTtyZXR1cm4gWT8oVmkoSCxoKSxPJjEyOCYmby5ub3JtYWxpemUoSCkpOmgmJihILnNoYXBlRmxhZ3w9dS5pc1N0cmluZyhoKT84OjE2KSxILmtleSE9PUgua2V5JiZzZSgiVk5vZGUgY3JlYXRlZCB3aXRoIGludmFsaWQga2V5IChOYU4pLiBWTm9kZSB0eXBlOiIsSC50eXBlKSxPYT4wJiYhTSYmcnImJihILnBhdGNoRmxhZz4wfHxPJjYpJiZILnBhdGNoRmxhZyE9PTMyJiZyci5wdXNoKEgpLEh9dmFyIE1uPVNsO2Z1bmN0aW9uIHpuKG8pe3ZhciBsPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTpudWxsLGg9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOm51bGwsbT1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106MCxTPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTpudWxsLE89YXJndW1lbnRzLmxlbmd0aD41JiZhcmd1bWVudHNbNV0hPT12b2lkIDA/YXJndW1lbnRzWzVdOiExO2lmKCghb3x8bz09PUhhKSYmKG98fHNlKCJJbnZhbGlkIHZub2RlIHR5cGUgd2hlbiBjcmVhdGluZyB2bm9kZTogIi5jb25jYXQobywiLiIpKSxvPWl0KSxibyhvKSl7dmFyIE09TGkobyxsLCEwKTtyZXR1cm4gaCYmVmkoTSxoKSxPYT4wJiYhTyYmcnImJihNLnNoYXBlRmxhZyY2P3JyW3JyLmluZGV4T2YobyldPU06cnIucHVzaChNKSksTS5wYXRjaEZsYWd8PS0yLE19aWYoVnMobykmJihvPW8uX192Y2NPcHRzKSxsKXtsPUNsKGwpO3ZhcntjbGFzczpZLHN0eWxlOkh9PWw7WSYmIXUuaXNTdHJpbmcoWSkmJihsLmNsYXNzPXUubm9ybWFsaXplQ2xhc3MoWSkpLHUuaXNPYmplY3QoSCkmJihJLmlzUHJveHkoSCkmJiF1LmlzQXJyYXkoSCkmJihIPXUuZXh0ZW5kKHt9LEgpKSxsLnN0eWxlPXUubm9ybWFsaXplU3R5bGUoSCkpfXZhciBuZT11LmlzU3RyaW5nKG8pPzE6dW4obyk/MTI4OlphKG8pPzY0OnUuaXNPYmplY3Qobyk/NDp1LmlzRnVuY3Rpb24obyk/MjowO3JldHVybiBuZSY0JiZJLmlzUHJveHkobykmJihvPUkudG9SYXcobyksc2UoIlZ1ZSByZWNlaXZlZCBhIENvbXBvbmVudCB3aGljaCB3YXMgbWFkZSBhIHJlYWN0aXZlIG9iamVjdC4gVGhpcyBjYW4gbGVhZCB0byB1bm5lY2Vzc2FyeSBwZXJmb3JtYW5jZSBvdmVyaGVhZCwgYW5kIHNob3VsZCBiZSBhdm9pZGVkIGJ5IG1hcmtpbmcgdGhlIGNvbXBvbmVudCB3aXRoIGBtYXJrUmF3YCBvciB1c2luZyBgc2hhbGxvd1JlZmAgaW5zdGVhZCBvZiBgcmVmYC4iLGAKQ29tcG9uZW50IHRoYXQgd2FzIG1hZGUgcmVhY3RpdmU6IGAsbykpLHBzKG8sbCxoLG0sUyxuZSxPLCEwKX1mdW5jdGlvbiBDbChvKXtyZXR1cm4gbz9JLmlzUHJveHkobyl8fEZzIGluIG8/dS5leHRlbmQoe30sbyk6bzpudWxsfWZ1bmN0aW9uIExpKG8sbCl7dmFyIGg9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOiExLHtwcm9wczptLHJlZjpTLHBhdGNoRmxhZzpPLGNoaWxkcmVuOk19PW8sWT1sP0lhKG18fHt9LGwpOm0sSD17X192X2lzVk5vZGU6ITAsX192X3NraXA6ITAsdHlwZTpvLnR5cGUscHJvcHM6WSxrZXk6WSYmRG8oWSkscmVmOmwmJmwucmVmP2gmJlM/dS5pc0FycmF5KFMpP1MuY29uY2F0KFFhKGwpKTpbUyxRYShsKV06UWEobCk6UyxzY29wZUlkOm8uc2NvcGVJZCxzbG90U2NvcGVJZHM6by5zbG90U2NvcGVJZHMsY2hpbGRyZW46Tz09PS0xJiZ1LmlzQXJyYXkoTSk/TS5tYXAoQWkpOk0sdGFyZ2V0Om8udGFyZ2V0LHRhcmdldEFuY2hvcjpvLnRhcmdldEFuY2hvcixzdGF0aWNDb3VudDpvLnN0YXRpY0NvdW50LHNoYXBlRmxhZzpvLnNoYXBlRmxhZyxwYXRjaEZsYWc6bCYmby50eXBlIT09SHQ/Tz09PS0xPzE2Ok98MTY6TyxkeW5hbWljUHJvcHM6by5keW5hbWljUHJvcHMsZHluYW1pY0NoaWxkcmVuOm8uZHluYW1pY0NoaWxkcmVuLGFwcENvbnRleHQ6by5hcHBDb250ZXh0LGhvc3RJbnN0YW5jZTpvLmhvc3RJbnN0YW5jZSxkaXJzOm8uZGlycyx0cmFuc2l0aW9uOm8udHJhbnNpdGlvbixjb21wb25lbnQ6by5jb21wb25lbnQsc3VzcGVuc2U6by5zdXNwZW5zZSxzc0NvbnRlbnQ6by5zc0NvbnRlbnQmJkxpKG8uc3NDb250ZW50KSxzc0ZhbGxiYWNrOm8uc3NGYWxsYmFjayYmTGkoby5zc0ZhbGxiYWNrKSxlbDpvLmVsLGFuY2hvcjpvLmFuY2hvcn07cmV0dXJuIEh9ZnVuY3Rpb24gQWkobyl7dmFyIGw9TGkobyk7cmV0dXJuIHUuaXNBcnJheShvLmNoaWxkcmVuKSYmKGwuY2hpbGRyZW49by5jaGlsZHJlbi5tYXAoQWkpKSxsfWZ1bmN0aW9uIGVzKCl7dmFyIG89YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOiIgIixsPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTowO3JldHVybiBNbihqdCxudWxsLG8sbCl9ZnVuY3Rpb24gQWwobyxsKXt2YXIgaD1NbihmbixudWxsLG8pO3JldHVybiBoLnN0YXRpY0NvdW50PWwsaH1mdW5jdGlvbiByYygpe3ZhciBvPWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dm9pZCAwP2FyZ3VtZW50c1swXToiIixsPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTohMTtyZXR1cm4gbD8oTXIoKSx3bChpdCxudWxsLG8pKTpNbihpdCxudWxsLG8pfWZ1bmN0aW9uIGlvKG8pe3JldHVybiBvPT1udWxsfHx0eXBlb2Ygbz09ImJvb2xlYW4iP01uKGl0KTp1LmlzQXJyYXkobyk/TW4oSHQsbnVsbCxvLnNsaWNlKCkpOnR5cGVvZiBvPT0ib2JqZWN0Ij9UbihvKTpNbihqdCxudWxsLFN0cmluZyhvKSl9ZnVuY3Rpb24gVG4obyl7cmV0dXJuIG8uZWw9PT1udWxsfHxvLm1lbW8/bzpMaShvKX1mdW5jdGlvbiBWaShvLGwpe3ZhciBoPTAse3NoYXBlRmxhZzptfT1vO2lmKGw9PW51bGwpbD1udWxsO2Vsc2UgaWYodS5pc0FycmF5KGwpKWg9MTY7ZWxzZSBpZih0eXBlb2YgbD09Im9iamVjdCIpaWYobSYoMXw2NCkpe3ZhciBTPWwuZGVmYXVsdDtTJiYoUy5fYyYmKFMuX2Q9ITEpLFZpKG8sUygpKSxTLl9jJiYoUy5fZD0hMCkpO3JldHVybn1lbHNle2g9MzI7dmFyIE89bC5fOyFPJiYhKEZzIGluIGwpP2wuX2N0eD13bjpPPT09MyYmd24mJih3bi5zbG90cy5fPT09MT9sLl89MToobC5fPTIsby5wYXRjaEZsYWd8PTEwMjQpKX1lbHNlIHUuaXNGdW5jdGlvbihsKT8obD17ZGVmYXVsdDpsLF9jdHg6d259LGg9MzIpOihsPVN0cmluZyhsKSxtJjY0PyhoPTE2LGw9W2VzKGwpXSk6aD04KTtvLmNoaWxkcmVuPWwsby5zaGFwZUZsYWd8PWh9ZnVuY3Rpb24gSWEoKXtmb3IodmFyIG89e30sbD0wO2w8YXJndW1lbnRzLmxlbmd0aDtsKyspe3ZhciBoPWw8MHx8YXJndW1lbnRzLmxlbmd0aDw9bD92b2lkIDA6YXJndW1lbnRzW2xdO2Zvcih2YXIgbSBpbiBoKWlmKG09PT0iY2xhc3MiKW8uY2xhc3MhPT1oLmNsYXNzJiYoby5jbGFzcz11Lm5vcm1hbGl6ZUNsYXNzKFtvLmNsYXNzLGguY2xhc3NdKSk7ZWxzZSBpZihtPT09InN0eWxlIilvLnN0eWxlPXUubm9ybWFsaXplU3R5bGUoW28uc3R5bGUsaC5zdHlsZV0pO2Vsc2UgaWYodS5pc09uKG0pKXt2YXIgUz1vW21dLE89aFttXTtPJiZTIT09TyYmISh1LmlzQXJyYXkoUykmJlMuaW5jbHVkZXMoTykpJiYob1ttXT1TP1tdLmNvbmNhdChTLE8pOk8pfWVsc2UgbSE9PSIiJiYob1ttXT1oW21dKX1yZXR1cm4gb31mdW5jdGlvbiBEcihvLGwsaCl7dmFyIG09YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOm51bGw7VnQobyxsLDcsW2gsbV0pfXZhciBsaT1xYSgpLHRsPTA7ZnVuY3Rpb24gT2wobyxsLGgpe3ZhciBtPW8udHlwZSxTPShsP2wuYXBwQ29udGV4dDpvLmFwcENvbnRleHQpfHxsaSxPPXt1aWQ6dGwrKyx2bm9kZTpvLHR5cGU6bSxwYXJlbnQ6bCxhcHBDb250ZXh0OlMscm9vdDpudWxsLG5leHQ6bnVsbCxzdWJUcmVlOm51bGwsZWZmZWN0Om51bGwsdXBkYXRlOm51bGwsc2NvcGU6bmV3IEkuRWZmZWN0U2NvcGUoITApLHJlbmRlcjpudWxsLHByb3h5Om51bGwsZXhwb3NlZDpudWxsLGV4cG9zZVByb3h5Om51bGwsd2l0aFByb3h5Om51bGwscHJvdmlkZXM6bD9sLnByb3ZpZGVzOk9iamVjdC5jcmVhdGUoUy5wcm92aWRlcyksYWNjZXNzQ2FjaGU6bnVsbCxyZW5kZXJDYWNoZTpbXSxjb21wb25lbnRzOm51bGwsZGlyZWN0aXZlczpudWxsLHByb3BzT3B0aW9uczpwbihtLFMpLGVtaXRzT3B0aW9uczpIbyhtLFMpLGVtaXQ6bnVsbCxlbWl0dGVkOm51bGwscHJvcHNEZWZhdWx0czp1LkVNUFRZX09CSixpbmhlcml0QXR0cnM6bS5pbmhlcml0QXR0cnMsY3R4OnUuRU1QVFlfT0JKLGRhdGE6dS5FTVBUWV9PQkoscHJvcHM6dS5FTVBUWV9PQkosYXR0cnM6dS5FTVBUWV9PQkosc2xvdHM6dS5FTVBUWV9PQkoscmVmczp1LkVNUFRZX09CSixzZXR1cFN0YXRlOnUuRU1QVFlfT0JKLHNldHVwQ29udGV4dDpudWxsLHN1c3BlbnNlOmgsc3VzcGVuc2VJZDpoP2gucGVuZGluZ0lkOjAsYXN5bmNEZXA6bnVsbCxhc3luY1Jlc29sdmVkOiExLGlzTW91bnRlZDohMSxpc1VubW91bnRlZDohMSxpc0RlYWN0aXZhdGVkOiExLGJjOm51bGwsYzpudWxsLGJtOm51bGwsbTpudWxsLGJ1Om51bGwsdTpudWxsLHVtOm51bGwsYnVtOm51bGwsZGE6bnVsbCxhOm51bGwscnRnOm51bGwscnRjOm51bGwsZWM6bnVsbCxzcDpudWxsfTtyZXR1cm4gTy5jdHg9UnMoTyksTy5yb290PWw/bC5yb290Ok8sTy5lbWl0PV9hLmJpbmQobnVsbCxPKSxvLmNlJiZvLmNlKE8pLE99dmFyIEpuPW51bGwsSW49KCk9PkpufHx3bixjaT1vPT57Sm49byxvLnNjb3BlLm9uKCl9LFpyPSgpPT57Sm4mJkpuLnNjb3BlLm9mZigpLEpuPW51bGx9LGZhPXUubWFrZU1hcCgic2xvdCxjb21wb25lbnQiKTtmdW5jdGlvbiB0cyhvLGwpe3ZhciBoPWwuaXNOYXRpdmVUYWd8fHUuTk87KGZhKG8pfHxoKG8pKSYmc2UoIkRvIG5vdCB1c2UgYnVpbHQtaW4gb3IgcmVzZXJ2ZWQgSFRNTCBlbGVtZW50cyBhcyBjb21wb25lbnQgaWQ6ICIrbyl9ZnVuY3Rpb24gWHIobyl7cmV0dXJuIG8udm5vZGUuc2hhcGVGbGFnJjR9ay5pc0luU1NSQ29tcG9uZW50U2V0dXA9ITE7ZnVuY3Rpb24gRm8obyl7dmFyIGw9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOiExO2suaXNJblNTUkNvbXBvbmVudFNldHVwPWw7dmFye3Byb3BzOmgsY2hpbGRyZW46bX09by52bm9kZSxTPVhyKG8pO0p0KG8saCxTLGwpLFlvKG8sbSk7dmFyIE89Uz9UbChvLGwpOnZvaWQgMDtyZXR1cm4gay5pc0luU1NSQ29tcG9uZW50U2V0dXA9ITEsT31mdW5jdGlvbiBUbChvLGwpe3ZhciBoLG09by50eXBlO3tpZihtLm5hbWUmJnRzKG0ubmFtZSxvLmFwcENvbnRleHQuY29uZmlnKSxtLmNvbXBvbmVudHMpZm9yKHZhciBTPU9iamVjdC5rZXlzKG0uY29tcG9uZW50cyksTz0wO088Uy5sZW5ndGg7TysrKXRzKFNbT10sby5hcHBDb250ZXh0LmNvbmZpZyk7aWYobS5kaXJlY3RpdmVzKWZvcih2YXIgTT1PYmplY3Qua2V5cyhtLmRpcmVjdGl2ZXMpLFk9MDtZPE0ubGVuZ3RoO1krKylJcyhNW1ldKTttLmNvbXBpbGVyT3B0aW9ucyYmTmwoKSYmc2UoJyJjb21waWxlck9wdGlvbnMiIGlzIG9ubHkgc3VwcG9ydGVkIHdoZW4gdXNpbmcgYSBidWlsZCBvZiBWdWUgdGhhdCBpbmNsdWRlcyB0aGUgcnVudGltZSBjb21waWxlci4gU2luY2UgeW91IGFyZSB1c2luZyBhIHJ1bnRpbWUtb25seSBidWlsZCwgdGhlIG9wdGlvbnMgc2hvdWxkIGJlIHBhc3NlZCB2aWEgeW91ciBidWlsZCB0b29sIGNvbmZpZyBpbnN0ZWFkLicpfW8uYWNjZXNzQ2FjaGU9T2JqZWN0LmNyZWF0ZShudWxsKSxvLnByb3h5PUkubWFya1JhdyhuZXcgUHJveHkoby5jdHgsdWEpKSxFbChvKTt2YXJ7c2V0dXA6SH09bTtpZihIKXt2YXIgbmU9by5zZXR1cENvbnRleHQ9SC5sZW5ndGg+MT9rbChvKTpudWxsO2NpKG8pLEkucGF1c2VUcmFja2luZygpO3ZhciBOZT1GdChILG8sMCxbSS5zaGFsbG93UmVhZG9ubHkoby5wcm9wcyksbmVdKTtpZihJLnJlc2V0VHJhY2tpbmcoKSxacigpLHUuaXNQcm9taXNlKE5lKSl7aWYoTmUudGhlbihacixaciksbClyZXR1cm4gTmUudGhlbihjZT0+e0lsKG8sY2UsbCl9KS5jYXRjaChjZT0+e3pyKGNlLG8sMCl9KTtpZihvLmFzeW5jRGVwPU5lLCFvLnN1c3BlbnNlKXt2YXIgZmU9KGg9bS5uYW1lKSE9PW51bGwmJmghPT12b2lkIDA/aDoiQW5vbnltb3VzIjtzZSgiQ29tcG9uZW50IDwiLmNvbmNhdChmZSwiPjogc2V0dXAgZnVuY3Rpb24gcmV0dXJuZWQgYSBwcm9taXNlLCBidXQgbm8gIikrIjxTdXNwZW5zZT4gYm91bmRhcnkgd2FzIGZvdW5kIGluIHRoZSBwYXJlbnQgY29tcG9uZW50IHRyZWUuIEEgY29tcG9uZW50IHdpdGggYXN5bmMgc2V0dXAoKSBtdXN0IGJlIG5lc3RlZCBpbiBhIDxTdXNwZW5zZT4gaW4gb3JkZXIgdG8gYmUgcmVuZGVyZWQuIil9fWVsc2UgSWwobyxOZSxsKX1lbHNlIG5sKG8sbCl9ZnVuY3Rpb24gSWwobyxsLGgpe3UuaXNGdW5jdGlvbihsKT9vLnR5cGUuX19zc3JJbmxpbmVSZW5kZXI/by5zc3JSZW5kZXI9bDpvLnJlbmRlcj1sOnUuaXNPYmplY3QobCk/KGJvKGwpJiZzZSgic2V0dXAoKSBzaG91bGQgbm90IHJldHVybiBWTm9kZXMgZGlyZWN0bHkgLSByZXR1cm4gYSByZW5kZXIgZnVuY3Rpb24gaW5zdGVhZC4iKSxvLmRldnRvb2xzUmF3U2V0dXBTdGF0ZT1sLG8uc2V0dXBTdGF0ZT1JLnByb3h5UmVmcyhsKSx4cyhvKSk6bCE9PXZvaWQgMCYmc2UoInNldHVwKCkgc2hvdWxkIHJldHVybiBhbiBvYmplY3QuIFJlY2VpdmVkOiAiLmNvbmNhdChsPT09bnVsbD8ibnVsbCI6dHlwZW9mIGwpKSxubChvLGgpfXZhciBucyxQYTtmdW5jdGlvbiBQbChvKXtucz1vLFBhPWw9PntsLnJlbmRlci5fcmMmJihsLndpdGhQcm94eT1uZXcgUHJveHkobC5jdHgsZ28pKX19dmFyIE5sPSgpPT4hbnM7ZnVuY3Rpb24gbmwobyxsLGgpe3ZhciBtPW8udHlwZTtpZighby5yZW5kZXIpe2lmKCFsJiZucyYmIW0ucmVuZGVyKXt2YXIgUz1tLnRlbXBsYXRlO2lmKFMpeyRyKG8sImNvbXBpbGUiKTt2YXJ7aXNDdXN0b21FbGVtZW50Ok8sY29tcGlsZXJPcHRpb25zOk19PW8uYXBwQ29udGV4dC5jb25maWcse2RlbGltaXRlcnM6WSxjb21waWxlck9wdGlvbnM6SH09bSxuZT11LmV4dGVuZCh1LmV4dGVuZCh7aXNDdXN0b21FbGVtZW50Ok8sZGVsaW1pdGVyczpZfSxNKSxIKTttLnJlbmRlcj1ucyhTLG5lKSxTcihvLCJjb21waWxlIil9fW8ucmVuZGVyPW0ucmVuZGVyfHx1Lk5PT1AsUGEmJlBhKG8pfWNpKG8pLEkucGF1c2VUcmFja2luZygpLEYobyksSS5yZXNldFRyYWNraW5nKCksWnIoKSwhbS5yZW5kZXImJm8ucmVuZGVyPT09dS5OT09QJiYhbCYmKCFucyYmbS50ZW1wbGF0ZT9zZSgnQ29tcG9uZW50IHByb3ZpZGVkIHRlbXBsYXRlIG9wdGlvbiBidXQgcnVudGltZSBjb21waWxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnVpbGQgb2YgVnVlLiBDb25maWd1cmUgeW91ciBidW5kbGVyIHRvIGFsaWFzICJ2dWUiIHRvICJ2dWUvZGlzdC92dWUuZXNtLWJ1bmRsZXIuanMiLicpOnNlKCJDb21wb25lbnQgaXMgbWlzc2luZyB0ZW1wbGF0ZSBvciByZW5kZXIgZnVuY3Rpb24uIikpfWZ1bmN0aW9uIGljKG8pe3JldHVybiBuZXcgUHJveHkoby5hdHRycyx7Z2V0KGwsaCl7cmV0dXJuIHJpKCksSS50cmFjayhvLCJnZXQiLCIkYXR0cnMiKSxsW2hdfSxzZXQoKXtyZXR1cm4gc2UoInNldHVwQ29udGV4dC5hdHRycyBpcyByZWFkb25seS4iKSwhMX0sZGVsZXRlUHJvcGVydHkoKXtyZXR1cm4gc2UoInNldHVwQ29udGV4dC5hdHRycyBpcyByZWFkb25seS4iKSwhMX19KX1mdW5jdGlvbiBrbChvKXt2YXIgbD1tPT57by5leHBvc2VkJiZzZSgiZXhwb3NlKCkgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IG9uY2UgcGVyIHNldHVwKCkuIiksby5leHBvc2VkPW18fHt9fSxoO3JldHVybiBPYmplY3QuZnJlZXplKHtnZXQgYXR0cnMoKXtyZXR1cm4gaHx8KGg9aWMobykpfSxnZXQgc2xvdHMoKXtyZXR1cm4gSS5zaGFsbG93UmVhZG9ubHkoby5zbG90cyl9LGdldCBlbWl0KCl7cmV0dXJuIGZ1bmN0aW9uKG0pe2Zvcih2YXIgUz1hcmd1bWVudHMubGVuZ3RoLE89bmV3IEFycmF5KFM+MT9TLTE6MCksTT0xO008UztNKyspT1tNLTFdPWFyZ3VtZW50c1tNXTtyZXR1cm4gby5lbWl0KG0sLi4uTyl9fSxleHBvc2U6bH0pfWZ1bmN0aW9uIHJzKG8pe2lmKG8uZXhwb3NlZClyZXR1cm4gby5leHBvc2VQcm94eXx8KG8uZXhwb3NlUHJveHk9bmV3IFByb3h5KEkucHJveHlSZWZzKEkubWFya1JhdyhvLmV4cG9zZWQpKSx7Z2V0KGwsaCl7aWYoaCBpbiBsKXJldHVybiBsW2hdO2lmKGggaW4gbm8pcmV0dXJuIG5vW2hdKG8pfX0pKX12YXIgTHM9Lyg/Ol58Wy1fXSkoXHcpL2csUmw9bz0+by5yZXBsYWNlKExzLGw9PmwudG9VcHBlckNhc2UoKSkucmVwbGFjZSgvWy1fXS9nLCIiKTtmdW5jdGlvbiBncyhvKXt2YXIgbD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ITA7cmV0dXJuIHUuaXNGdW5jdGlvbihvKT9vLmRpc3BsYXlOYW1lfHxvLm5hbWU6by5uYW1lfHxsJiZvLl9fbmFtZX1mdW5jdGlvbiBkYShvLGwpe3ZhciBoPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTohMSxtPWdzKGwpO2lmKCFtJiZsLl9fZmlsZSl7dmFyIFM9bC5fX2ZpbGUubWF0Y2goLyhbXi9cXF0rKVwuXHcrJC8pO1MmJihtPVNbMV0pfWlmKCFtJiZvJiZvLnBhcmVudCl7dmFyIE89TT0+e2Zvcih2YXIgWSBpbiBNKWlmKE1bWV09PT1sKXJldHVybiBZfTttPU8oby5jb21wb25lbnRzfHxvLnBhcmVudC50eXBlLmNvbXBvbmVudHMpfHxPKG8uYXBwQ29udGV4dC5jb21wb25lbnRzKX1yZXR1cm4gbT9SbChtKTpoPyJBcHAiOiJBbm9ueW1vdXMifWZ1bmN0aW9uIFZzKG8pe3JldHVybiB1LmlzRnVuY3Rpb24obykmJiJfX3ZjY09wdHMiaW4gb312YXIgeGw9KG8sbCk9PkkuY29tcHV0ZWQobyxsLGsuaXNJblNTUkNvbXBvbmVudFNldHVwKSwkcz1vPT5zZSgiIi5jb25jYXQobywiKCkgaXMgYSBjb21waWxlci1oaW50IGhlbHBlciB0aGF0IGlzIG9ubHkgdXNhYmxlIGluc2lkZSAiKSsiPHNjcmlwdCBzZXR1cD4gb2YgYSBzaW5nbGUgZmlsZSBjb21wb25lbnQuIEl0cyBhcmd1bWVudHMgc2hvdWxkIGJlIGNvbXBpbGVkIGF3YXkgYW5kIHBhc3NpbmcgaXQgYXQgcnVudGltZSBoYXMgbm8gZWZmZWN0LiIpO2Z1bmN0aW9uIFVzKCl7cmV0dXJuICRzKCJkZWZpbmVQcm9wcyIpLG51bGx9ZnVuY3Rpb24gJGMoKXtyZXR1cm4gJHMoImRlZmluZUVtaXRzIiksbnVsbH1mdW5jdGlvbiBvYyhvKXskcygiZGVmaW5lRXhwb3NlIil9ZnVuY3Rpb24gVWMobyxsKXtyZXR1cm4gJHMoIndpdGhEZWZhdWx0cyIpLG51bGx9ZnVuY3Rpb24gSGMoKXtyZXR1cm4gYWMoKS5zbG90c31mdW5jdGlvbiBqYygpe3JldHVybiBhYygpLmF0dHJzfWZ1bmN0aW9uIGFjKCl7dmFyIG89SW4oKTtyZXR1cm4gb3x8c2UoInVzZUNvbnRleHQoKSBjYWxsZWQgd2l0aG91dCBhY3RpdmUgaW5zdGFuY2UuIiksby5zZXR1cENvbnRleHR8fChvLnNldHVwQ29udGV4dD1rbChvKSl9ZnVuY3Rpb24gc2MobyxsKXt2YXIgaD11LmlzQXJyYXkobyk/by5yZWR1Y2UoKE8sTSk9PihPW01dPXt9LE8pLHt9KTpvO2Zvcih2YXIgbSBpbiBsKXt2YXIgUz1oW21dO1M/dS5pc0FycmF5KFMpfHx1LmlzRnVuY3Rpb24oUyk/aFttXT17dHlwZTpTLGRlZmF1bHQ6bFttXX06Uy5kZWZhdWx0PWxbbV06Uz09PW51bGw/aFttXT17ZGVmYXVsdDpsW21dfTpzZSgncHJvcHMgZGVmYXVsdCBrZXkgIicuY29uY2F0KG0sJyIgaGFzIG5vIGNvcnJlc3BvbmRpbmcgZGVjbGFyYXRpb24uJykpfXJldHVybiBofWZ1bmN0aW9uIHpjKG8sbCl7dmFyIGg9e30sbT1mdW5jdGlvbihPKXtsLmluY2x1ZGVzKE8pfHxPYmplY3QuZGVmaW5lUHJvcGVydHkoaCxPLHtlbnVtZXJhYmxlOiEwLGdldDooKT0+b1tPXX0pfTtmb3IodmFyIFMgaW4gbyltKFMpO3JldHVybiBofWZ1bmN0aW9uIFdjKG8pe3ZhciBsPUluKCk7bHx8c2UoIndpdGhBc3luY0NvbnRleHQgY2FsbGVkIHdpdGhvdXQgYWN0aXZlIGN1cnJlbnQgaW5zdGFuY2UuIFRoaXMgaXMgbGlrZWx5IGEgYnVnLiIpO3ZhciBoPW8oKTtyZXR1cm4gWnIoKSx1LmlzUHJvbWlzZShoKSYmKGg9aC5jYXRjaChtPT57dGhyb3cgY2kobCksbX0pKSxbaCwoKT0+Y2kobCldfWZ1bmN0aW9uIEdjKG8sbCxoKXt2YXIgbT1hcmd1bWVudHMubGVuZ3RoO3JldHVybiBtPT09Mj91LmlzT2JqZWN0KGwpJiYhdS5pc0FycmF5KGwpP2JvKGwpP01uKG8sbnVsbCxbbF0pOk1uKG8sbCk6TW4obyxudWxsLGwpOihtPjM/aD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMik6bT09PTMmJmJvKGgpJiYoaD1baF0pLE1uKG8sbCxoKSl9dmFyIEJsPVN5bWJvbCgic3NyQ29udGV4dCIpLGxjPSgpPT57e3ZhciBvPXZyKEJsKTtyZXR1cm4gb3x8c2UoIlNlcnZlciByZW5kZXJpbmcgY29udGV4dCBub3QgcHJvdmlkZWQuIE1ha2Ugc3VyZSB0byBvbmx5IGNhbGwgdXNlU1NSQ29udGV4dCgpIGNvbmRpdGlvbmFsbHkgaW4gdGhlIHNlcnZlciBidWlsZC4iKSxvfX07ZnVuY3Rpb24gTWwobyl7cmV0dXJuISEobyYmby5fX3ZfaXNTaGFsbG93KX1mdW5jdGlvbiBEbCgpe2lmKHR5cGVvZiB3aW5kb3c9PSJ1bmRlZmluZWQiKXJldHVybjt2YXIgbz17c3R5bGU6ImNvbG9yOiMzYmE3NzYifSxsPXtzdHlsZToiY29sb3I6IzBiMWJjOSJ9LGg9e3N0eWxlOiJjb2xvcjojYjYyZTI0In0sbT17c3R5bGU6ImNvbG9yOiM5ZDI4OGMifSxTPXtoZWFkZXIoZmUpe3JldHVybiB1LmlzT2JqZWN0KGZlKT9mZS5fX2lzVnVlP1siZGl2IixvLCJWdWVJbnN0YW5jZSJdOkkuaXNSZWYoZmUpP1siZGl2Iix7fSxbInNwYW4iLG8sTmUoZmUpXSwiPCIsWShmZS52YWx1ZSksIj4iXTpJLmlzUmVhY3RpdmUoZmUpP1siZGl2Iix7fSxbInNwYW4iLG8sTWwoZmUpPyJTaGFsbG93UmVhY3RpdmUiOiJSZWFjdGl2ZSJdLCI8IixZKGZlKSwiPiIuY29uY2F0KEkuaXNSZWFkb25seShmZSk/IiAocmVhZG9ubHkpIjoiIildOkkuaXNSZWFkb25seShmZSk/WyJkaXYiLHt9LFsic3BhbiIsbyxNbChmZSk/IlNoYWxsb3dSZWFkb25seSI6IlJlYWRvbmx5Il0sIjwiLFkoZmUpLCI+Il06bnVsbDpudWxsfSxoYXNCb2R5KGZlKXtyZXR1cm4gZmUmJmZlLl9faXNWdWV9LGJvZHkoZmUpe2lmKGZlJiZmZS5fX2lzVnVlKXJldHVyblsiZGl2Iix7fSwuLi5PKGZlLiQpXX19O2Z1bmN0aW9uIE8oZmUpe3ZhciBjZT1bXTtmZS50eXBlLnByb3BzJiZmZS5wcm9wcyYmY2UucHVzaChNKCJwcm9wcyIsSS50b1JhdyhmZS5wcm9wcykpKSxmZS5zZXR1cFN0YXRlIT09dS5FTVBUWV9PQkomJmNlLnB1c2goTSgic2V0dXAiLGZlLnNldHVwU3RhdGUpKSxmZS5kYXRhIT09dS5FTVBUWV9PQkomJmNlLnB1c2goTSgiZGF0YSIsSS50b1JhdyhmZS5kYXRhKSkpO3ZhciBGZT1IKGZlLCJjb21wdXRlZCIpO0ZlJiZjZS5wdXNoKE0oImNvbXB1dGVkIixGZSkpO3ZhciBWZT1IKGZlLCJpbmplY3QiKTtyZXR1cm4gVmUmJmNlLnB1c2goTSgiaW5qZWN0ZWQiLFZlKSksY2UucHVzaChbImRpdiIse30sWyJzcGFuIix7c3R5bGU6bS5zdHlsZSsiO29wYWNpdHk6MC42NiJ9LCIkIChpbnRlcm5hbCk6ICJdLFsib2JqZWN0Iix7b2JqZWN0OmZlfV1dKSxjZX1mdW5jdGlvbiBNKGZlLGNlKXtyZXR1cm4gY2U9dS5leHRlbmQoe30sY2UpLE9iamVjdC5rZXlzKGNlKS5sZW5ndGg/WyJkaXYiLHtzdHlsZToibGluZS1oZWlnaHQ6MS4yNWVtO21hcmdpbi1ib3R0b206MC42ZW0ifSxbImRpdiIse3N0eWxlOiJjb2xvcjojNDc2NTgyIn0sZmVdLFsiZGl2Iix7c3R5bGU6InBhZGRpbmctbGVmdDoxLjI1ZW0ifSwuLi5PYmplY3Qua2V5cyhjZSkubWFwKEZlPT5bImRpdiIse30sWyJzcGFuIixtLEZlKyI6ICJdLFkoY2VbRmVdLCExKV0pXV06WyJzcGFuIix7fV19ZnVuY3Rpb24gWShmZSl7dmFyIGNlPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTohMDtyZXR1cm4gdHlwZW9mIGZlPT0ibnVtYmVyIj9bInNwYW4iLGwsZmVdOnR5cGVvZiBmZT09InN0cmluZyI/WyJzcGFuIixoLEpTT04uc3RyaW5naWZ5KGZlKV06dHlwZW9mIGZlPT0iYm9vbGVhbiI/WyJzcGFuIixtLGZlXTp1LmlzT2JqZWN0KGZlKT9bIm9iamVjdCIse29iamVjdDpjZT9JLnRvUmF3KGZlKTpmZX1dOlsic3BhbiIsaCxTdHJpbmcoZmUpXX1mdW5jdGlvbiBIKGZlLGNlKXt2YXIgRmU9ZmUudHlwZTtpZighdS5pc0Z1bmN0aW9uKEZlKSl7dmFyIFZlPXt9O2Zvcih2YXIgbHQgaW4gZmUuY3R4KW5lKEZlLGx0LGNlKSYmKFZlW2x0XT1mZS5jdHhbbHRdKTtyZXR1cm4gVmV9fWZ1bmN0aW9uIG5lKGZlLGNlLEZlKXt2YXIgVmU9ZmVbRmVdO2lmKHUuaXNBcnJheShWZSkmJlZlLmluY2x1ZGVzKGNlKXx8dS5pc09iamVjdChWZSkmJmNlIGluIFZlfHxmZS5leHRlbmRzJiZuZShmZS5leHRlbmRzLGNlLEZlKXx8ZmUubWl4aW5zJiZmZS5taXhpbnMuc29tZShsdD0+bmUobHQsY2UsRmUpKSlyZXR1cm4hMH1mdW5jdGlvbiBOZShmZSl7cmV0dXJuIE1sKGZlKT8iU2hhbGxvd1JlZiI6ZmUuZWZmZWN0PyJDb21wdXRlZFJlZiI6IlJlZiJ9d2luZG93LmRldnRvb2xzRm9ybWF0dGVycz93aW5kb3cuZGV2dG9vbHNGb3JtYXR0ZXJzLnB1c2goUyk6d2luZG93LmRldnRvb2xzRm9ybWF0dGVycz1bU119ZnVuY3Rpb24gWWMobyxsLGgsbSl7dmFyIFM9aFttXTtpZihTJiZjYyhTLG8pKXJldHVybiBTO3ZhciBPPWwoKTtyZXR1cm4gTy5tZW1vPW8uc2xpY2UoKSxoW21dPU99ZnVuY3Rpb24gY2MobyxsKXt2YXIgaD1vLm1lbW87aWYoaC5sZW5ndGghPWwubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgbT0wO208aC5sZW5ndGg7bSsrKWlmKHUuaGFzQ2hhbmdlZChoW21dLGxbbV0pKXJldHVybiExO3JldHVybiBPYT4wJiZyciYmcnIucHVzaChvKSwhMH12YXIgcmw9IjMuMi4zNyIsRmw9bnVsbCx5bz1udWxsLEhzPXtpbnNlcnQ6KG8sbCxoKT0+aD9sLmluc2VydEJlZm9yZShvLGgpOmwuYXBwZW5kQ2hpbGQobykscmVtb3ZlOm89Pnt2YXIgbD1vLnBhcmVudE5vZGU7bCYmbC5yZW1vdmVDaGlsZChvKX0sY3JlYXRlRWxlbWVudDpvPT5jLmNyZWF0ZUVsZW1lbnQobyksY3JlYXRlVGV4dDpvPT5jLmNyZWF0ZVRleHQobyksY3JlYXRlQ29tbWVudDpvPT5jLmNyZWF0ZUNvbW1lbnQobyksc2V0VGV4dDoobyxsKT0+e28uc2V0QXR0cigidmFsdWUiLGwpfSxzZXRFbGVtZW50VGV4dDoobyxsKT0+e28uc2V0QXR0cigidmFsdWUiLGwpfSxwYXJlbnROb2RlOm89Pm8ucGFyZW50Tm9kZSxuZXh0U2libGluZzpvPT5vLm5leHRTaWJsaW5nfTtmdW5jdGlvbiBkcihvKXtyZXR1cm4gT2JqZWN0LmtleXMobyl9ZnVuY3Rpb24gaGEobyl7dmFyIGw9e307cmV0dXJuIHUuaXNBcnJheShvKSYmby5mb3JFYWNoKGg9PntkcihoKS5mb3JFYWNoKG09Pnt2YXIgUz1oW21dLE89bFttXXx8KGxbbV09e30pO2RyKFMpLmZvckVhY2goTT0+e3ZhciBZPVNbTV0sSD1PW01dfHwoT1tNXT17fSk7ZHIoWSkuZm9yRWFjaChuZT0+e25lWzBdPT09IiEiPyhIW25lXT1ZW25lXSxkZWxldGUgSFtuZS5zbGljZSgxKV0pOnUuaGFzT3duKEgsIiEiK25lKXx8KEhbbmVdPVlbbmVdKX0pfSl9KX0pLGx9ZnVuY3Rpb24gSm8obyxsKXt2YXIgaD1sJiZsLmNsYXNzTGlzdDtyZXR1cm4gaCYmaC5pbmNsdWRlcyhvKX12YXIgdWM9L1srfj4gXSQvLGlsPSJwYXJlbnROb2RlIixabz0icHJldmlvdXNTaWJsaW5nIjtmdW5jdGlvbiBMbChvLGwpe2Zvcih2YXIgaD1vLnNwbGl0KCIuIiksbT1oLmxlbmd0aC0xO20+MDttLS0pe3ZhciBTPWhbbV0sTz1TW1MubGVuZ3RoLTFdLE09Uy5yZXBsYWNlKHVjLCIiKTtpZihPPT09In4ifHxPPT09IiAiKXtmb3IodmFyIFk9Tz09PSJ+Ij9abzppbDtsJiYobD1sW1ldLCFKbyhNLGwpKTspO2lmKCFsKXJldHVybiExfWVsc2UgaWYoTz09PSI+Ij9sPWwmJmxbaWxdOk89PT0iKyImJihsPWwmJmxbWm9dKSwhSm8oTSxsKSlyZXR1cm4hMX1yZXR1cm4hMH12YXIgWG89MWUzO2Z1bmN0aW9uIGZjKG8sbCxoKXt2YXJ7c3R5bGVzOm0sd2VpZ2h0czpTfT1vO2RyKGwpLmZvckVhY2goTz0+e2lmKCEoTyYmaCYmIUxsKE8saCkpKXt2YXIgTT1PLnNwbGl0KCIuIikubGVuZ3RoLFk9bFtPXTtkcihZKS5mb3JFYWNoKEg9Pnt2YXIgbmU9WVtIXSxOZT1IWzBdPT09IiEiO05lJiYoSD1ILnNsaWNlKDEpKTt2YXIgZmU9U1tIXXx8MCxjZT1NKyhOZT9YbzowKTtjZT49ZmUmJihTW0hdPWNlLG1bSF09bmUpfSl9fSl9ZnVuY3Rpb24gb28obyxsKXt2YXIgaD1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06bnVsbCxtPXtzdHlsZXM6e30sd2VpZ2h0czp7fX07cmV0dXJuIG8uZm9yRWFjaChTPT57dmFyIE89bFtTXTtPJiZmYyhtLE8saCl9KSxtLnN0eWxlc31mdW5jdGlvbiBkYyhvKXtyZXR1cm4gb28oby5jbGFzc0xpc3Qsby5zdHlsZVNoZWV0LG8pfWZ1bmN0aW9uIG9sKG8sbCl7dmFyIGg9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOm51bGw7cmV0dXJuIG9vKG8saGMobCksaCl9ZnVuY3Rpb24gaGMobyl7dmFye3R5cGU6bCxhcHBDb250ZXh0Omh9PW8sbT1sO2lmKCFtLl9fc3R5bGVzKWlmKGgmJnUuaXNBcnJheShoLnByb3ZpZGVzLl9fZ2xvYmFsU3R5bGVzKSYmKGgucHJvdmlkZXMuX19nbG9iYWxTdHlsZXM9aGEoaC5wcm92aWRlcy5fX2dsb2JhbFN0eWxlcykpLG0ubXBUeXBlPT09InBhZ2UiJiZoKW0uX19zdHlsZXM9aC5wcm92aWRlcy5fX2dsb2JhbFN0eWxlcztlbHNle3ZhciBTPVtdO2gmJlMucHVzaChoLnByb3ZpZGVzLl9fZ2xvYmFsU3R5bGVzKSx1LmlzQXJyYXkobS5zdHlsZXMpJiZtLnN0eWxlcy5mb3JFYWNoKE89PlMucHVzaChPKSksbS5fX3N0eWxlcz1oYShTKX1yZXR1cm4gbS5fX3N0eWxlc31mdW5jdGlvbiBwYyhvLGwsaCl7dmFyIG09YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOm51bGw7bSYmKFtsLGhdPU5hKG8sbCxoLG0pKSxvLnNldEF0dHIobCxoKX12YXIgdnM9ImhvdmVyQ2xhc3MiLGdjPSJwbGFjZWhvbGRlckNsYXNzIix2Yz0icGxhY2Vob2xkZXJTdHlsZSIscWM9ImluZGljYXRvckNsYXNzIixLYz0iaW5kaWNhdG9yU3R5bGUiLGFsPSJtYXNrQ2xhc3MiLFZsPSJtYXNrU3R5bGUiLG1jPXt2aWV3OntjbGFzczpbdnNdLHN0eWxlOltdfSxidXR0b246e2NsYXNzOlt2c10sc3R5bGU6W119LG5hdmlnYXRvcjp7Y2xhc3M6W3ZzXSxzdHlsZTpbXX0sInUtaW5wdXQiOntjbGFzczpbZ2NdLHN0eWxlOlt2Y119LCJ1LXRleHRhcmVhIjp7Y2xhc3M6W2djXSxzdHlsZTpbdmNdfSwicGlja2VyLXZpZXciOntjbGFzczpbcWMsYWxdLHN0eWxlOltLYyxWbF19fTtmdW5jdGlvbiBOYShvLGwsaCxtKXtpZighaClyZXR1cm5bbCxoXTt2YXIgUz1tY1tvLnR5cGVdO2lmKFMpe3ZhciBPPXUuY2FtZWxpemUobCk7aWYoUy5jbGFzcy5pbmRleE9mKE8pPi0xKXJldHVybltPLG9sKFtoXSxtLG8pXTtpZihTLnN0eWxlLmluZGV4T2YobCk+LTEpcmV0dXJuIHUuaXNTdHJpbmcoaCk/W08sdS5wYXJzZVN0cmluZ1N0eWxlKGgpXTpbTyx1Lm5vcm1hbGl6ZVN0eWxlKGgpXX1yZXR1cm5bbCxoXX1mdW5jdGlvbiBqcyhvLGwsaCl7dmFyIG09YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOm51bGw7aWYoISFtKXt2YXIgUz1oP2guc3BsaXQoIiAiKTpbXTtvLnNldENsYXNzTGlzdChTKSxvLnNldFN0eWxlU2hlZXQoaGMobSkpfX1mdW5jdGlvbiAkbChvLGwsaCxtKXtvLmFkZEV2ZW50KGwsaCl9ZnVuY3Rpb24gc2wobyxsKXtvLnJlbW92ZUV2ZW50KGwpfWZ1bmN0aW9uIEpjKG8sbCxoLG0pe3ZhciBTPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTpudWxsLE89by5fdmVpfHwoby5fdmVpPXt9KSxNPU9bbF07aWYobSYmTSlNLnZhbHVlPW07ZWxzZXt2YXJbWSxIXT1iYyhsKTtpZihtKXt2YXIgbmU9T1tsXT1kbihtLFMpOyRsKG8sWSxuZSl9ZWxzZSBNJiYoc2wobyxZKSxPW2xdPXZvaWQgMCl9fXZhciBrYT0vKD86T25jZXxQYXNzaXZlfENhcHR1cmUpJC87ZnVuY3Rpb24gX2Mobyl7cmV0dXJuIG89PT0ib24tcG9zdC1tZXNzYWdlIj8ib25Qb3N0TWVzc2FnZSI6b31mdW5jdGlvbiBiYyhvKXt2YXIgbDtpZihrYS50ZXN0KG8pKXtsPXt9O2Zvcih2YXIgaDtoPW8ubWF0Y2goa2EpOylvPW8uc2xpY2UoMCxvLmxlbmd0aC1oWzBdLmxlbmd0aCksbFtoWzBdLnRvTG93ZXJDYXNlKCldPSEwfXJldHVybiBvPW8uc2xpY2UoMiksW19jKHUuaHlwaGVuYXRlKG8pKSxsXX1mdW5jdGlvbiBkbihvLGwpe3ZhciBoPVM9PntWdChoLnZhbHVlLGwsNSxbU10pfTtoLnZhbHVlPW87dmFyIG09bmV3IFNldDtyZXR1cm4gdS5pc0FycmF5KGgudmFsdWUpP2gudmFsdWUuZm9yRWFjaChTPT57Uy5tb2RpZmllcnMmJlMubW9kaWZpZXJzLmZvckVhY2goTz0+e20uYWRkKE8pfSl9KTooaC52YWx1ZS5tb2RpZmllcnMmJmgudmFsdWUubW9kaWZpZXJzLmZvckVhY2goUz0+e20uYWRkKFMpfSksUW8oaCxsKSksaC5tb2RpZmllcnM9Wy4uLm1dLGh9ZnVuY3Rpb24gUW8obyxsKXtpZighIWwpe3Zhcnskd3hzTW9kdWxlczpofT1sO2lmKCEhaCl7dmFyIG09by52YWx1ZS50b1N0cmluZygpOyFoLmZpbmQoUz0+bS5pbmRleE9mKCIuIitTKyIuIik+LTEpfHwoby53eHNFdmVudD1vLnZhbHVlKCkpfX19ZnVuY3Rpb24gTG8obyxsLGgpe2lmKCEhaCl7dS5pc1N0cmluZyhoKSYmKGg9dS5wYXJzZVN0cmluZ1N0eWxlKGgpKTt2YXIgbT17fSxTPWwmJiF1LmlzU3RyaW5nKGwpO2lmKFMpe2Zvcih2YXIgTyBpbiBsKWhbT109PW51bGwmJihtW3UuY2FtZWxpemUoTyldPSIiKTtmb3IodmFyIE0gaW4gaCl7dmFyIFk9aFtNXTtZIT09bFtNXSYmKG1bdS5jYW1lbGl6ZShNKV09WSl9fWVsc2UgZm9yKHZhciBIIGluIGgpbVt1LmNhbWVsaXplKEgpXT1oW0hdO28uc2V0U3R5bGVzKG0pfX12YXIgcGE9WyJ1LWlucHV0IiwidS10ZXh0YXJlYSJdLGVhPWZ1bmN0aW9uKG8sbCxoLG0pe3ZhciBTPWFyZ3VtZW50cy5sZW5ndGg+Nj9hcmd1bWVudHNbNl06dm9pZCAwLE89YXJndW1lbnRzLmxlbmd0aD45P2FyZ3VtZW50c1s5XTp2b2lkIDA7bD09PSJjbGFzcyI/anMobyxoLG0sT3x8Uyk6bD09PSJzdHlsZSI/TG8obyxoLG0pOnUuaXNPbihsKT91LmlzTW9kZWxMaXN0ZW5lcihsKXx8SmMobyxsLGgsbSxTKTpsPT09Im1vZGVsVmFsdWUiJiZwYS5pbmNsdWRlcyhvLnR5cGUpP28uc2V0QXR0cnMoe21vZGVsVmFsdWU6bSx2YWx1ZTptfSk6cGMobyxsLG0sUyl9O2Z1bmN0aW9uIGxsKCl7dmFyIG89YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOiIkc3R5bGUiO3t2YXIgbD1JbigpO2lmKCFsKXJldHVybiBzZSgidXNlQ3NzTW9kdWxlIG11c3QgYmUgY2FsbGVkIGluc2lkZSBzZXR1cCgpIiksdS5FTVBUWV9PQko7dmFyIGg9bC50eXBlLl9fY3NzTW9kdWxlcztpZighaClyZXR1cm4gc2UoIkN1cnJlbnQgaW5zdGFuY2UgZG9lcyBub3QgaGF2ZSBDU1MgbW9kdWxlcyBpbmplY3RlZC4iKSx1LkVNUFRZX09CSjt2YXIgbT1oW29dO3JldHVybiBtfHwoc2UoJ0N1cnJlbnQgaW5zdGFuY2UgZG9lcyBub3QgaGF2ZSBDU1MgbW9kdWxlIG5hbWVkICInLmNvbmNhdChvLCciLicpKSx1LkVNUFRZX09CSil9fWZ1bmN0aW9uIGNsKG8pe3ZhciBsPUluKCk7aWYoIWwpe3NlKCJ1c2VDc3NWYXJzIGlzIGNhbGxlZCB3aXRob3V0IGN1cnJlbnQgYWN0aXZlIGNvbXBvbmVudCBpbnN0YW5jZS4iKTtyZXR1cm59dmFyIGg9KCk9PmlzKGwuc3ViVHJlZSxvKGwucHJveHkpKTt3YSgoKT0+ZW8oaCx7Zmx1c2g6InBvc3QifSkpLFJyKGgpfWZ1bmN0aW9uIGlzKG8sbCl7aWYoby5zaGFwZUZsYWcmMTI4KXt2YXIgaD1vLnN1c3BlbnNlO289aC5hY3RpdmVCcmFuY2gsaC5wZW5kaW5nQnJhbmNoJiYhaC5pc0h5ZHJhdGluZyYmaC5lZmZlY3RzLnB1c2goKCk9PntpcyhoLmFjdGl2ZUJyYW5jaCxsKX0pfWZvcig7by5jb21wb25lbnQ7KW89by5jb21wb25lbnQuc3ViVHJlZTtpZihvLnNoYXBlRmxhZyYxJiZvLmVsKXt2YXIgbT1vLmVsLnN0eWxlO2Zvcih2YXIgUyBpbiBsKW0uc2V0UHJvcGVydHkoIi0tIi5jb25jYXQoUyksbFtTXSl9ZWxzZSBvLnR5cGU9PT1IdCYmby5jaGlsZHJlbi5mb3JFYWNoKE89PmlzKE8sbCkpfXZhciB6cz1bImN0cmwiLCJzaGlmdCIsImFsdCIsIm1ldGEiXSxSYT17c3RvcDpvPT5vLnN0b3BQcm9wYWdhdGlvbigpLHByZXZlbnQ6bz0+by5wcmV2ZW50RGVmYXVsdCgpLHNlbGY6bz0+by50YXJnZXQhPT1vLmN1cnJlbnRUYXJnZXQsY3RybDpvPT4hby5jdHJsS2V5LHNoaWZ0Om89PiFvLnNoaWZ0S2V5LGFsdDpvPT4hby5hbHRLZXksbWV0YTpvPT4hby5tZXRhS2V5LGxlZnQ6bz0+ImJ1dHRvbiJpbiBvJiZvLmJ1dHRvbiE9PTAsbWlkZGxlOm89PiJidXR0b24iaW4gbyYmby5idXR0b24hPT0xLHJpZ2h0Om89PiJidXR0b24iaW4gbyYmby5idXR0b24hPT0yLGV4YWN0OihvLGwpPT56cy5zb21lKGg9Pm9bIiIuY29uY2F0KGgsIktleSIpXSYmIWwuaW5jbHVkZXMoaCkpfSxtcz0obyxsKT0+ZnVuY3Rpb24oaCl7Zm9yKHZhciBtPTA7bTxsLmxlbmd0aDttKyspe3ZhciBTPVJhW2xbbV1dO2lmKFMmJlMoaCxsKSlyZXR1cm59Zm9yKHZhciBPPWFyZ3VtZW50cy5sZW5ndGgsTT1uZXcgQXJyYXkoTz4xP08tMTowKSxZPTE7WTxPO1krKylNW1ktMV09YXJndW1lbnRzW1ldO3JldHVybiBvKGgsLi4uTSl9LEFyPShvLGwpPT5oPT57aWYoImtleSJpbiBoKXt2YXIgbT11Lmh5cGhlbmF0ZShoLmtleSk7aWYobC5zb21lKFM9PlM9PT1tKSlyZXR1cm4gbyhoKX19LF9zPXUuZXh0ZW5kKHtwYXRjaFByb3A6ZWF9LEhzKSxnYTtmdW5jdGlvbiBvcygpe3JldHVybiBnYXx8KGdhPUNyKF9zKSl9dmFyIFpjPWZ1bmN0aW9uKCl7b3MoKS5yZW5kZXIoLi4uYXJndW1lbnRzKX0seGE9ZnVuY3Rpb24oKXt2YXIgbz1vcygpLmNyZWF0ZUFwcCguLi5hcmd1bWVudHMpLHttb3VudDpsfT1vO3JldHVybiBvLm1vdW50PWg9PmwoaCksb307cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShrLCJjYW1lbGl6ZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHUuY2FtZWxpemV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGssImNhcGl0YWxpemUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB1LmNhcGl0YWxpemV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGssImh5cGhlbmF0ZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHUuaHlwaGVuYXRlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShrLCJub3JtYWxpemVDbGFzcyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHUubm9ybWFsaXplQ2xhc3N9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGssIm5vcm1hbGl6ZVByb3BzIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdS5ub3JtYWxpemVQcm9wc319KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaywibm9ybWFsaXplU3R5bGUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB1Lm5vcm1hbGl6ZVN0eWxlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShrLCJ0b0Rpc3BsYXlTdHJpbmciLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB1LnRvRGlzcGxheVN0cmluZ319KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaywidG9IYW5kbGVyS2V5Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdS50b0hhbmRsZXJLZXl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGssIkVmZmVjdFNjb3BlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS5FZmZlY3RTY29wZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaywiUmVhY3RpdmVFZmZlY3QiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBJLlJlYWN0aXZlRWZmZWN0fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShrLCJjdXN0b21SZWYiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBJLmN1c3RvbVJlZn19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaywiZWZmZWN0Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS5lZmZlY3R9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGssImVmZmVjdFNjb3BlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS5lZmZlY3RTY29wZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaywiZ2V0Q3VycmVudFNjb3BlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS5nZXRDdXJyZW50U2NvcGV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGssImlzUHJveHkiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBJLmlzUHJveHl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGssImlzUmVhY3RpdmUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBJLmlzUmVhY3RpdmV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGssImlzUmVhZG9ubHkiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBJLmlzUmVhZG9ubHl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGssImlzUmVmIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS5pc1JlZn19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaywiaXNTaGFsbG93Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS5pc1NoYWxsb3d9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGssIm1hcmtSYXciLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBJLm1hcmtSYXd9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGssIm9uU2NvcGVEaXNwb3NlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS5vblNjb3BlRGlzcG9zZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaywicHJveHlSZWZzIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS5wcm94eVJlZnN9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGssInJlYWN0aXZlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS5yZWFjdGl2ZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaywicmVhZG9ubHkiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBJLnJlYWRvbmx5fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShrLCJyZWYiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBJLnJlZn19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaywic2hhbGxvd1JlYWN0aXZlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS5zaGFsbG93UmVhY3RpdmV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGssInNoYWxsb3dSZWFkb25seSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEkuc2hhbGxvd1JlYWRvbmx5fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShrLCJzaGFsbG93UmVmIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS5zaGFsbG93UmVmfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShrLCJzdG9wIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS5zdG9wfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShrLCJ0b1JhdyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEkudG9SYXd9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGssInRvUmVmIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS50b1JlZn19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaywidG9SZWZzIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS50b1JlZnN9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGssInRyaWdnZXJSZWYiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBJLnRyaWdnZXJSZWZ9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGssInVucmVmIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS51bnJlZn19KSxrLkJhc2VUcmFuc2l0aW9uPUQsay5Db21tZW50PWl0LGsuRnJhZ21lbnQ9SHQsay5LZWVwQWxpdmU9VmEsay5TdGF0aWM9Zm4say5TdXNwZW5zZT1CaSxrLlRlbGVwb3J0PUJ0LGsuVGV4dD1qdCxrLmNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nPVZ0LGsuY2FsbFdpdGhFcnJvckhhbmRsaW5nPUZ0LGsuY2xvbmVWTm9kZT1MaSxrLmNvbXBhdFV0aWxzPXlvLGsuY29tcHV0ZWQ9eGwsay5jcmVhdGVBcHA9eGEsay5jcmVhdGVCbG9jaz13bCxrLmNyZWF0ZUNvbW1lbnRWTm9kZT1yYyxrLmNyZWF0ZUVsZW1lbnRCbG9jaz1uYyxrLmNyZWF0ZUVsZW1lbnRWTm9kZT1wcyxrLmNyZWF0ZUh5ZHJhdGlvblJlbmRlcmVyPWhzLGsuY3JlYXRlUHJvcHNSZXN0UHJveHk9emMsay5jcmVhdGVSZW5kZXJlcj1DcixrLmNyZWF0ZVNsb3RzPVNhLGsuY3JlYXRlU3RhdGljVk5vZGU9QWwsay5jcmVhdGVUZXh0Vk5vZGU9ZXMsay5jcmVhdGVWTm9kZT1NbixrLmRlZmluZUFzeW5jQ29tcG9uZW50PUNuLGsuZGVmaW5lQ29tcG9uZW50PWdlLGsuZGVmaW5lRW1pdHM9JGMsay5kZWZpbmVFeHBvc2U9b2Msay5kZWZpbmVQcm9wcz1VcyxrLmdldEN1cnJlbnRJbnN0YW5jZT1JbixrLmdldFRyYW5zaXRpb25SYXdDaGlsZHJlbj1aLGsuZ3VhcmRSZWFjdGl2ZVByb3BzPUNsLGsuaD1HYyxrLmhhbmRsZUVycm9yPXpyLGsuaW5pdEN1c3RvbUZvcm1hdHRlcj1EbCxrLmluamVjdD12cixrLmluamVjdEhvb2s9R28say5pc01lbW9TYW1lPWNjLGsuaXNSdW50aW1lT25seT1ObCxrLmlzVk5vZGU9Ym8say5tZXJnZURlZmF1bHRzPXNjLGsubWVyZ2VQcm9wcz1JYSxrLm5leHRUaWNrPWdyLGsub25BY3RpdmF0ZWQ9Tm8say5vbkJlZm9yZU1vdW50PXlpLGsub25CZWZvcmVVbm1vdW50PWtvLGsub25CZWZvcmVVcGRhdGU9bnIsay5vbkRlYWN0aXZhdGVkPXNhLGsub25FcnJvckNhcHR1cmVkPVRzLGsub25Nb3VudGVkPXdhLGsub25SZW5kZXJUcmFja2VkPU9zLGsub25SZW5kZXJUcmlnZ2VyZWQ9QXMsay5vblNlcnZlclByZWZldGNoPXhyLGsub25Vbm1vdW50ZWQ9Y2Esay5vblVwZGF0ZWQ9UnIsay5vcGVuQmxvY2s9TXIsay5wYXJzZUNsYXNzTGlzdD1vbCxrLnBhcnNlQ2xhc3NTdHlsZXM9ZGMsay5wb3BTY29wZUlkPU9vLGsucHJvdmlkZT1jcixrLnB1c2hTY29wZUlkPWxyLGsucXVldWVQb3N0Rmx1c2hDYj1OaSxrLnJlZ2lzdGVyUnVudGltZUNvbXBpbGVyPVBsLGsucmVuZGVyPVpjLGsucmVuZGVyTGlzdD1OcyxrLnJlbmRlclNsb3Q9Um8say5yZXNvbHZlQ29tcG9uZW50PXlsLGsucmVzb2x2ZURpcmVjdGl2ZT1YcyxrLnJlc29sdmVEeW5hbWljQ29tcG9uZW50PWZvLGsucmVzb2x2ZUZpbHRlcj1GbCxrLnJlc29sdmVUcmFuc2l0aW9uSG9va3M9YmUsay5zZXRCbG9ja1RyYWNraW5nPUtvLGsuc2V0RGV2dG9vbHNIb29rPUVyLGsuc2V0VHJhbnNpdGlvbkhvb2tzPUosay5zc3JDb250ZXh0S2V5PUJsLGsudG9IYW5kbGVycz1qYSxrLnRyYW5zZm9ybVZOb2RlQXJncz1UYSxrLnVzZUF0dHJzPWpjLGsudXNlQ3NzTW9kdWxlPWxsLGsudXNlQ3NzU3R5bGVzPWhhLGsudXNlQ3NzVmFycz1jbCxrLnVzZVNTUkNvbnRleHQ9bGMsay51c2VTbG90cz1IYyxrLnVzZVRyYW5zaXRpb25TdGF0ZT1iaSxrLnZlcnNpb249cmwsay53YXJuPXNlLGsud2F0Y2g9dG8say53YXRjaEVmZmVjdD1lbyxrLndhdGNoUG9zdEVmZmVjdD16byxrLndhdGNoU3luY0VmZmVjdD1MYSxrLndpdGhBc3luY0NvbnRleHQ9V2Msay53aXRoQ3R4PVJlLGsud2l0aERlZmF1bHRzPVVjLGsud2l0aERpcmVjdGl2ZXM9WnMsay53aXRoS2V5cz1BcixrLndpdGhNZW1vPVljLGsud2l0aE1vZGlmaWVycz1tcyxrLndpdGhTY29wZUlkPUR0LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShrLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxrfSh7fSxULEIsYik7cmV0dXJuIEMuX19UWVBFX189Im52dWUiLEN9dmFyIExnPUlJKHhJKTt2YXIgdnU9e307U0kodnUse0VNUFRZX0FSUjooKT0+R0ksRU1QVFlfT0JKOigpPT5XSSxOTzooKT0+cUksTk9PUDooKT0+WUksY2FtZWxpemU6KCk9PnNQLGNhcGl0YWxpemU6KCk9PnRmLGRlZjooKT0+ZFAsZXh0ZW5kOigpPT5kaSxnZXRHbG9iYWxUaGlzOigpPT5wUCxoYXNDaGFuZ2VkOigpPT51UCxoYXNPd246KCk9PnFsLGh5cGhlbmF0ZTooKT0+UWYsaW52b2tlQXJyYXlGbnM6KCk9PmZQLGlzQXJyYXk6KCk9PkhpLGlzQnVpbHRJbkRpcmVjdGl2ZTooKT0+b1AsaXNGdW5jdGlvbjooKT0+JG4saXNHbG9iYWxseVdoaXRlbGlzdGVkOigpPT5ESSxpc0hUTUxUYWc6KCk9PkhJLGlzSW50ZWdlcktleTooKT0+clAsaXNNYXA6KCk9PlVnLGlzTW9kZWxMaXN0ZW5lcjooKT0+WkksaXNPYmplY3Q6KCk9PkRjLGlzT246KCk9PkpJLGlzUGxhaW5PYmplY3Q6KCk9PkZjLGlzUHJvbWlzZTooKT0+dFAsaXNSZXNlcnZlZFByb3A6KCk9PmlQLGlzU1ZHVGFnOigpPT5qSSxpc1NldDooKT0+SGcsaXNTdHJpbmc6KCk9PmppLGlzU3ltYm9sOigpPT5lUCxtYWtlTWFwOigpPT5NYyxub3JtYWxpemVDbGFzczooKT0+WGYsbm9ybWFsaXplUHJvcHM6KCk9PlZJLG5vcm1hbGl6ZVN0eWxlOigpPT5aZixwYXJzZVN0cmluZ1N0eWxlOigpPT5WZyxyZW1vdmU6KCk9PlhJLHRvRGlzcGxheVN0cmluZzooKT0+ekksdG9IYW5kbGVyS2V5OigpPT5jUCx0b051bWJlcjooKT0+aFAsdG9SYXdUeXBlOigpPT5uUCx0b1R5cGVTdHJpbmc6KCk9PnFzfSk7ZnVuY3Rpb24gTWModixjKXtsZXQgYj1PYmplY3QuY3JlYXRlKG51bGwpLFQ9di5zcGxpdCgiLCIpO2ZvcihsZXQgQj0wO0I8VC5sZW5ndGg7QisrKWJbVFtCXV09ITA7cmV0dXJuIGM/Qj0+ISFiW0IudG9Mb3dlckNhc2UoKV06Qj0+ISFiW0JdfXZhciBNST0iSW5maW5pdHksdW5kZWZpbmVkLE5hTixpc0Zpbml0ZSxpc05hTixwYXJzZUZsb2F0LHBhcnNlSW50LGRlY29kZVVSSSxkZWNvZGVVUklDb21wb25lbnQsZW5jb2RlVVJJLGVuY29kZVVSSUNvbXBvbmVudCxNYXRoLE51bWJlcixEYXRlLEFycmF5LE9iamVjdCxCb29sZWFuLFN0cmluZyxSZWdFeHAsTWFwLFNldCxKU09OLEludGwsQmlnSW50IixEST1NYyhNSSk7ZnVuY3Rpb24gWmYodil7aWYoSGkodikpe2xldCBjPXt9O2ZvcihsZXQgYj0wO2I8di5sZW5ndGg7YisrKXtsZXQgVD12W2JdLEI9amkoVCk/VmcoVCk6WmYoVCk7aWYoQilmb3IobGV0IEMgaW4gQiljW0NdPUJbQ119cmV0dXJuIGN9ZWxzZXtpZihqaSh2KSlyZXR1cm4gdjtpZihEYyh2KSlyZXR1cm4gdn19dmFyIEZJPS87KD8hW14oXSpcKSkvZyxMST0vOiguKykvO2Z1bmN0aW9uIFZnKHYpe2xldCBjPXt9O3JldHVybiB2LnNwbGl0KEZJKS5mb3JFYWNoKGI9PntpZihiKXtsZXQgVD1iLnNwbGl0KExJKTtULmxlbmd0aD4xJiYoY1tUWzBdLnRyaW0oKV09VFsxXS50cmltKCkpfX0pLGN9ZnVuY3Rpb24gWGYodil7bGV0IGM9IiI7aWYoamkodikpYz12O2Vsc2UgaWYoSGkodikpZm9yKGxldCBiPTA7Yjx2Lmxlbmd0aDtiKyspe2xldCBUPVhmKHZbYl0pO1QmJihjKz1UKyIgIil9ZWxzZSBpZihEYyh2KSlmb3IobGV0IGIgaW4gdil2W2JdJiYoYys9YisiICIpO3JldHVybiBjLnRyaW0oKX1mdW5jdGlvbiBWSSh2KXtpZighdilyZXR1cm4gbnVsbDtsZXR7Y2xhc3M6YyxzdHlsZTpifT12O3JldHVybiBjJiYhamkoYykmJih2LmNsYXNzPVhmKGMpKSxiJiYodi5zdHlsZT1aZihiKSksdn12YXIgJEk9Imh0bWwsYm9keSxiYXNlLGhlYWQsbGluayxtZXRhLHN0eWxlLHRpdGxlLGFkZHJlc3MsYXJ0aWNsZSxhc2lkZSxmb290ZXIsaGVhZGVyLGgxLGgyLGgzLGg0LGg1LGg2LG5hdixzZWN0aW9uLGRpdixkZCxkbCxkdCxmaWdjYXB0aW9uLGZpZ3VyZSxwaWN0dXJlLGhyLGltZyxsaSxtYWluLG9sLHAscHJlLHVsLGEsYixhYmJyLGJkaSxiZG8sYnIsY2l0ZSxjb2RlLGRhdGEsZGZuLGVtLGksa2JkLG1hcmsscSxycCxydCxydWJ5LHMsc2FtcCxzbWFsbCxzcGFuLHN0cm9uZyxzdWIsc3VwLHRpbWUsdSx2YXIsd2JyLGFyZWEsYXVkaW8sbWFwLHRyYWNrLHZpZGVvLGVtYmVkLG9iamVjdCxwYXJhbSxzb3VyY2UsY2FudmFzLHNjcmlwdCxub3NjcmlwdCxkZWwsaW5zLGNhcHRpb24sY29sLGNvbGdyb3VwLHRhYmxlLHRoZWFkLHRib2R5LHRkLHRoLHRyLGJ1dHRvbixkYXRhbGlzdCxmaWVsZHNldCxmb3JtLGlucHV0LGxhYmVsLGxlZ2VuZCxtZXRlcixvcHRncm91cCxvcHRpb24sb3V0cHV0LHByb2dyZXNzLHNlbGVjdCx0ZXh0YXJlYSxkZXRhaWxzLGRpYWxvZyxtZW51LHN1bW1hcnksdGVtcGxhdGUsYmxvY2txdW90ZSxpZnJhbWUsdGZvb3QiLFVJPSJzdmcsYW5pbWF0ZSxhbmltYXRlTW90aW9uLGFuaW1hdGVUcmFuc2Zvcm0sY2lyY2xlLGNsaXBQYXRoLGNvbG9yLXByb2ZpbGUsZGVmcyxkZXNjLGRpc2NhcmQsZWxsaXBzZSxmZUJsZW5kLGZlQ29sb3JNYXRyaXgsZmVDb21wb25lbnRUcmFuc2ZlcixmZUNvbXBvc2l0ZSxmZUNvbnZvbHZlTWF0cml4LGZlRGlmZnVzZUxpZ2h0aW5nLGZlRGlzcGxhY2VtZW50TWFwLGZlRGlzdGFuY2VMaWdodCxmZURyb3BTaGFkb3csZmVGbG9vZCxmZUZ1bmNBLGZlRnVuY0IsZmVGdW5jRyxmZUZ1bmNSLGZlR2F1c3NpYW5CbHVyLGZlSW1hZ2UsZmVNZXJnZSxmZU1lcmdlTm9kZSxmZU1vcnBob2xvZ3ksZmVPZmZzZXQsZmVQb2ludExpZ2h0LGZlU3BlY3VsYXJMaWdodGluZyxmZVNwb3RMaWdodCxmZVRpbGUsZmVUdXJidWxlbmNlLGZpbHRlcixmb3JlaWduT2JqZWN0LGcsaGF0Y2gsaGF0Y2hwYXRoLGltYWdlLGxpbmUsbGluZWFyR3JhZGllbnQsbWFya2VyLG1hc2ssbWVzaCxtZXNoZ3JhZGllbnQsbWVzaHBhdGNoLG1lc2hyb3csbWV0YWRhdGEsbXBhdGgscGF0aCxwYXR0ZXJuLHBvbHlnb24scG9seWxpbmUscmFkaWFsR3JhZGllbnQscmVjdCxzZXQsc29saWRjb2xvcixzdG9wLHN3aXRjaCxzeW1ib2wsdGV4dCx0ZXh0UGF0aCx0aXRsZSx0c3Bhbix1bmtub3duLHVzZSx2aWV3IixIST1NYygkSSksakk9TWMoVUkpLHpJPXY9PmppKHYpP3Y6dj09bnVsbD8iIjpIaSh2KXx8RGModikmJih2LnRvU3RyaW5nPT09amd8fCEkbih2LnRvU3RyaW5nKSk/SlNPTi5zdHJpbmdpZnkodiwkZywyKTpTdHJpbmcodiksJGc9KHYsYyk9PmMmJmMuX192X2lzUmVmPyRnKHYsYy52YWx1ZSk6VWcoYyk/e1tgTWFwKCR7Yy5zaXplfSlgXTpbLi4uYy5lbnRyaWVzKCldLnJlZHVjZSgoYixbVCxCXSk9PihiW2Ake1R9ID0+YF09QixiKSx7fSl9OkhnKGMpP3tbYFNldCgke2Muc2l6ZX0pYF06Wy4uLmMudmFsdWVzKCldfTpEYyhjKSYmIUhpKGMpJiYhRmMoYyk/U3RyaW5nKGMpOmMsV0k9e30sR0k9W10sWUk9KCk9Pnt9LHFJPSgpPT4hMSxLST0vXm9uW15hLXpdLyxKST12PT5LSS50ZXN0KHYpLFpJPXY9PnYuc3RhcnRzV2l0aCgib25VcGRhdGU6IiksZGk9T2JqZWN0LmFzc2lnbixYST0odixjKT0+e2xldCBiPXYuaW5kZXhPZihjKTtiPi0xJiZ2LnNwbGljZShiLDEpfSxRST1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LHFsPSh2LGMpPT5RSS5jYWxsKHYsYyksSGk9QXJyYXkuaXNBcnJheSxVZz12PT5xcyh2KT09PSJbb2JqZWN0IE1hcF0iLEhnPXY9PnFzKHYpPT09IltvYmplY3QgU2V0XSIsJG49dj0+dHlwZW9mIHY9PSJmdW5jdGlvbiIsamk9dj0+dHlwZW9mIHY9PSJzdHJpbmciLGVQPXY9PnR5cGVvZiB2PT0ic3ltYm9sIixEYz12PT52IT09bnVsbCYmdHlwZW9mIHY9PSJvYmplY3QiLHRQPXY9PkRjKHYpJiYkbih2LnRoZW4pJiYkbih2LmNhdGNoKSxqZz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLHFzPXY9PmpnLmNhbGwodiksblA9dj0+cXModikuc2xpY2UoOCwtMSksRmM9dj0+cXModik9PT0iW29iamVjdCBPYmplY3RdIixyUD12PT5qaSh2KSYmdiE9PSJOYU4iJiZ2WzBdIT09Ii0iJiYiIitwYXJzZUludCh2LDEwKT09PXYsaVA9TWMoIixrZXkscmVmLHJlZl9mb3IscmVmX2tleSxvblZub2RlQmVmb3JlTW91bnQsb25Wbm9kZU1vdW50ZWQsb25Wbm9kZUJlZm9yZVVwZGF0ZSxvblZub2RlVXBkYXRlZCxvblZub2RlQmVmb3JlVW5tb3VudCxvblZub2RlVW5tb3VudGVkIiksb1A9TWMoImJpbmQsY2xvYWssZWxzZS1pZixlbHNlLGZvcixodG1sLGlmLG1vZGVsLG9uLG9uY2UscHJlLHNob3csc2xvdCx0ZXh0LG1lbW8iKSxlZj12PT57bGV0IGM9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gYj0+Y1tiXXx8KGNbYl09dihiKSl9LGFQPS8tKFx3KS9nLHNQPWVmKHY9PnYucmVwbGFjZShhUCwoYyxiKT0+Yj9iLnRvVXBwZXJDYXNlKCk6IiIpKSxsUD0vXEIoW0EtWl0pL2csUWY9ZWYodj0+di5yZXBsYWNlKGxQLCItJDEiKS50b0xvd2VyQ2FzZSgpKSx0Zj1lZih2PT52LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK3Yuc2xpY2UoMSkpLGNQPWVmKHY9PnY/YG9uJHt0Zih2KX1gOiIiKSx1UD0odixjKT0+IU9iamVjdC5pcyh2LGMpLGZQPSh2LGMpPT57Zm9yKGxldCBiPTA7Yjx2Lmxlbmd0aDtiKyspdltiXShjKX0sZFA9KHYsYyxiKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh2LGMse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHZhbHVlOmJ9KX0saFA9dj0+e2xldCBjPXBhcnNlRmxvYXQodik7cmV0dXJuIGlzTmFOKGMpP3Y6Y30semcscFA9KCk9PnpnfHwoemc9dHlwZW9mIGdsb2JhbFRoaXMhPSJ1bmRlZmluZWQiP2dsb2JhbFRoaXM6dHlwZW9mIHNlbGYhPSJ1bmRlZmluZWQiP3NlbGY6dHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCI/d2luZG93OnR5cGVvZiBnbG9iYWwhPSJ1bmRlZmluZWQiP2dsb2JhbDp7fSk7ZnVuY3Rpb24gV2codil7dmFyIGM9ZnVuY3Rpb24oYixUKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gQihELC4uLmllKXtjb25zb2xlLndhcm4oYFtWdWUgd2Fybl0gJHtEfWAsLi4uaWUpfWxldCBDO2NsYXNzIGt7Y29uc3RydWN0b3IoaWU9ITEpe3RoaXMuYWN0aXZlPSEwLHRoaXMuZWZmZWN0cz1bXSx0aGlzLmNsZWFudXBzPVtdLCFpZSYmQyYmKHRoaXMucGFyZW50PUMsdGhpcy5pbmRleD0oQy5zY29wZXN8fChDLnNjb3Blcz1bXSkpLnB1c2godGhpcyktMSl9cnVuKGllKXtpZih0aGlzLmFjdGl2ZSl7bGV0IGJlPUM7dHJ5e3JldHVybiBDPXRoaXMsaWUoKX1maW5hbGx5e0M9YmV9fX1vbigpe0M9dGhpc31vZmYoKXtDPXRoaXMucGFyZW50fXN0b3AoaWUpe2lmKHRoaXMuYWN0aXZlKXtsZXQgYmUsRztmb3IoYmU9MCxHPXRoaXMuZWZmZWN0cy5sZW5ndGg7YmU8RztiZSsrKXRoaXMuZWZmZWN0c1tiZV0uc3RvcCgpO2ZvcihiZT0wLEc9dGhpcy5jbGVhbnVwcy5sZW5ndGg7YmU8RztiZSsrKXRoaXMuY2xlYW51cHNbYmVdKCk7aWYodGhpcy5zY29wZXMpZm9yKGJlPTAsRz10aGlzLnNjb3Blcy5sZW5ndGg7YmU8RztiZSsrKXRoaXMuc2NvcGVzW2JlXS5zdG9wKCEwKTtpZih0aGlzLnBhcmVudCYmIWllKXtsZXQgVj10aGlzLnBhcmVudC5zY29wZXMucG9wKCk7ViYmViE9PXRoaXMmJih0aGlzLnBhcmVudC5zY29wZXNbdGhpcy5pbmRleF09VixWLmluZGV4PXRoaXMuaW5kZXgpfXRoaXMuYWN0aXZlPSExfX19ZnVuY3Rpb24gdShEKXtyZXR1cm4gbmV3IGsoRCl9ZnVuY3Rpb24gSShELGllPUMpe2llJiZpZS5hY3RpdmUmJmllLmVmZmVjdHMucHVzaChEKX1mdW5jdGlvbiBHZSgpe3JldHVybiBDfWZ1bmN0aW9uIEF0KEQpe0MmJkMuY2xlYW51cHMucHVzaChEKX1sZXQgdG49RD0+e2xldCBpZT1uZXcgU2V0KEQpO3JldHVybiBpZS53PTAsaWUubj0wLGllfSxBPUQ9PihELncmYWUpPjAsc2U9RD0+KEQubiZhZSk+MCxFbj0oe2RlcHM6RH0pPT57aWYoRC5sZW5ndGgpZm9yKGxldCBpZT0wO2llPEQubGVuZ3RoO2llKyspRFtpZV0ud3w9YWV9LEduPUQ9PntsZXR7ZGVwczppZX09RDtpZihpZS5sZW5ndGgpe2xldCBiZT0wO2ZvcihsZXQgRz0wO0c8aWUubGVuZ3RoO0crKyl7bGV0IFY9aWVbR107QShWKSYmIXNlKFYpP1YuZGVsZXRlKEQpOmllW2JlKytdPVYsVi53Jj1+YWUsVi5uJj1+YWV9aWUubGVuZ3RoPWJlfX0sYnQ9bmV3IFdlYWtNYXAsUT0wLGFlPTEsaG49MzAsRnQsVnQ9U3ltYm9sKCIiKSx6cj1TeW1ib2woIiIpO2NsYXNzIGVpe2NvbnN0cnVjdG9yKGllLGJlPW51bGwsRyl7dGhpcy5mbj1pZSx0aGlzLnNjaGVkdWxlcj1iZSx0aGlzLmFjdGl2ZT0hMCx0aGlzLmRlcHM9W10sdGhpcy5wYXJlbnQ9dm9pZCAwLEkodGhpcyxHKX1ydW4oKXtpZighdGhpcy5hY3RpdmUpcmV0dXJuIHRoaXMuZm4oKTtsZXQgaWU9RnQsYmU9YW47Zm9yKDtpZTspe2lmKGllPT09dGhpcylyZXR1cm47aWU9aWUucGFyZW50fXRyeXtyZXR1cm4gdGhpcy5wYXJlbnQ9RnQsRnQ9dGhpcyxhbj0hMCxhZT0xPDwrK1EsUTw9aG4/RW4odGhpcyk6VHIodGhpcyksdGhpcy5mbigpfWZpbmFsbHl7UTw9aG4mJkduKHRoaXMpLGFlPTE8PC0tUSxGdD10aGlzLnBhcmVudCxhbj1iZSx0aGlzLnBhcmVudD12b2lkIDAsdGhpcy5kZWZlclN0b3AmJnRoaXMuc3RvcCgpfX1zdG9wKCl7RnQ9PT10aGlzP3RoaXMuZGVmZXJTdG9wPSEwOnRoaXMuYWN0aXZlJiYoVHIodGhpcyksdGhpcy5vblN0b3AmJnRoaXMub25TdG9wKCksdGhpcy5hY3RpdmU9ITEpfX1mdW5jdGlvbiBUcihEKXtsZXR7ZGVwczppZX09RDtpZihpZS5sZW5ndGgpe2ZvcihsZXQgYmU9MDtiZTxpZS5sZW5ndGg7YmUrKylpZVtiZV0uZGVsZXRlKEQpO2llLmxlbmd0aD0wfX1mdW5jdGlvbiBtbihELGllKXtELmVmZmVjdCYmKEQ9RC5lZmZlY3QuZm4pO2xldCBiZT1uZXcgZWkoRCk7aWUmJihULmV4dGVuZChiZSxpZSksaWUuc2NvcGUmJkkoYmUsaWUuc2NvcGUpKSwoIWllfHwhaWUubGF6eSkmJmJlLnJ1bigpO2xldCBHPWJlLnJ1bi5iaW5kKGJlKTtyZXR1cm4gRy5lZmZlY3Q9YmUsR31mdW5jdGlvbiBHdChEKXtELmVmZmVjdC5zdG9wKCl9bGV0IGFuPSEwLFBuPVtdO2Z1bmN0aW9uIFVuKCl7UG4ucHVzaChhbiksYW49ITF9ZnVuY3Rpb24gaXIoKXtQbi5wdXNoKGFuKSxhbj0hMH1mdW5jdGlvbiBGbigpe2xldCBEPVBuLnBvcCgpO2FuPUQ9PT12b2lkIDA/ITA6RH1mdW5jdGlvbiBCZShELGllLGJlKXtpZihhbiYmRnQpe2xldCBHPWJ0LmdldChEKTtHfHxidC5zZXQoRCxHPW5ldyBNYXApO2xldCBWPUcuZ2V0KGJlKTtWfHxHLnNldChiZSxWPXRuKCkpLGF0KFYsdm9pZCAwKX19ZnVuY3Rpb24gYXQoRCxpZSl7bGV0IGJlPSExO1E8PWhuP3NlKEQpfHwoRC5ufD1hZSxiZT0hQShEKSk6YmU9IUQuaGFzKEZ0KSxiZSYmKEQuYWRkKEZ0KSxGdC5kZXBzLnB1c2goRCkpfWZ1bmN0aW9uIHl0KEQsaWUsYmUsRyxWLEope2xldCBaPWJ0LmdldChEKTtpZighWilyZXR1cm47bGV0IGdlPVtdO2lmKGllPT09ImNsZWFyIilnZT1bLi4uWi52YWx1ZXMoKV07ZWxzZSBpZihiZT09PSJsZW5ndGgiJiZULmlzQXJyYXkoRCkpWi5mb3JFYWNoKChDbixfbik9PnsoX249PT0ibGVuZ3RoInx8X24+PUcpJiZnZS5wdXNoKENuKX0pO2Vsc2Ugc3dpdGNoKGJlIT09dm9pZCAwJiZnZS5wdXNoKFouZ2V0KGJlKSksaWUpe2Nhc2UiYWRkIjpULmlzQXJyYXkoRCk/VC5pc0ludGVnZXJLZXkoYmUpJiZnZS5wdXNoKFouZ2V0KCJsZW5ndGgiKSk6KGdlLnB1c2goWi5nZXQoVnQpKSxULmlzTWFwKEQpJiZnZS5wdXNoKFouZ2V0KHpyKSkpO2JyZWFrO2Nhc2UiZGVsZXRlIjpULmlzQXJyYXkoRCl8fChnZS5wdXNoKFouZ2V0KFZ0KSksVC5pc01hcChEKSYmZ2UucHVzaChaLmdldCh6cikpKTticmVhaztjYXNlInNldCI6VC5pc01hcChEKSYmZ2UucHVzaChaLmdldChWdCkpO2JyZWFrfWxldCB6dD12b2lkIDA7aWYoZ2UubGVuZ3RoPT09MSlnZVswXSYmWnQoZ2VbMF0pO2Vsc2V7bGV0IENuPVtdO2ZvcihsZXQgX24gb2YgZ2UpX24mJkNuLnB1c2goLi4uX24pO1p0KHRuKENuKSl9fWZ1bmN0aW9uIFp0KEQsaWUpe2xldCBiZT1ULmlzQXJyYXkoRCk/RDpbLi4uRF07Zm9yKGxldCBHIG9mIGJlKUcuY29tcHV0ZWQmJnNuKEcsaWUpO2ZvcihsZXQgRyBvZiBiZSlHLmNvbXB1dGVkfHxzbihHLGllKX1mdW5jdGlvbiBzbihELGllKXsoRCE9PUZ0fHxELmFsbG93UmVjdXJzZSkmJihELnNjaGVkdWxlcj9ELnNjaGVkdWxlcigpOkQucnVuKCkpfWxldCBjbj1ULm1ha2VNYXAoIl9fcHJvdG9fXyxfX3ZfaXNSZWYsX19pc1Z1ZSIpLGdyPW5ldyBTZXQoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoU3ltYm9sKS5maWx0ZXIoRD0+RCE9PSJhcmd1bWVudHMiJiZEIT09ImNhbGxlciIpLm1hcChEPT5TeW1ib2xbRF0pLmZpbHRlcihULmlzU3ltYm9sKSkseXI9TmkoKSxJaT1OaSghMSwhMCksUGk9TmkoITApLG9yPU5pKCEwLCEwKSx6aT0kbygpO2Z1bmN0aW9uICRvKCl7bGV0IEQ9e307cmV0dXJuWyJpbmNsdWRlcyIsImluZGV4T2YiLCJsYXN0SW5kZXhPZiJdLmZvckVhY2goaWU9PntEW2llXT1mdW5jdGlvbiguLi5iZSl7bGV0IEc9WHQodGhpcyk7Zm9yKGxldCBKPTAsWj10aGlzLmxlbmd0aDtKPFo7SisrKUJlKEcsImdldCIsSisiIik7bGV0IFY9R1tpZV0oLi4uYmUpO3JldHVybiBWPT09LTF8fFY9PT0hMT9HW2llXSguLi5iZS5tYXAoWHQpKTpWfX0pLFsicHVzaCIsInBvcCIsInNoaWZ0IiwidW5zaGlmdCIsInNwbGljZSJdLmZvckVhY2goaWU9PntEW2llXT1mdW5jdGlvbiguLi5iZSl7VW4oKTtsZXQgRz1YdCh0aGlzKVtpZV0uYXBwbHkodGhpcyxiZSk7cmV0dXJuIEZuKCksR319KSxEfWZ1bmN0aW9uIE5pKEQ9ITEsaWU9ITEpe3JldHVybiBmdW5jdGlvbihHLFYsSil7aWYoVj09PSJfX3ZfaXNSZWFjdGl2ZSIpcmV0dXJuIUQ7aWYoVj09PSJfX3ZfaXNSZWFkb25seSIpcmV0dXJuIEQ7aWYoVj09PSJfX3ZfaXNTaGFsbG93IilyZXR1cm4gaWU7aWYoVj09PSJfX3ZfcmF3IiYmSj09PShEP2llP2xyOk5uOmllP1NuOnduKS5nZXQoRykpcmV0dXJuIEc7bGV0IFo9VC5pc0FycmF5KEcpO2lmKCFEJiZaJiZULmhhc093bih6aSxWKSlyZXR1cm4gUmVmbGVjdC5nZXQoemksVixKKTtsZXQgZ2U9UmVmbGVjdC5nZXQoRyxWLEopO3JldHVybihULmlzU3ltYm9sKFYpP2dyLmhhcyhWKTpjbihWKSl8fChEfHxCZShHLCJnZXQiLFYpLGllKT9nZTpZbihnZSk/WiYmVC5pc0ludGVnZXJLZXkoVik/Z2U6Z2UudmFsdWU6VC5pc09iamVjdChnZSk/RD9yaShnZSk6UmUoZ2UpOmdlfX1sZXQgV2k9aGkoKSxHaT1oaSghMCk7ZnVuY3Rpb24gaGkoRD0hMSl7cmV0dXJuIGZ1bmN0aW9uKGJlLEcsVixKKXtsZXQgWj1iZVtHXTtpZihZcihaKSYmWW4oWikmJiFZbihWKSlyZXR1cm4hMTtpZighRCYmIVlyKFYpJiYoaWEoVil8fChWPVh0KFYpLFo9WHQoWikpLCFULmlzQXJyYXkoYmUpJiZZbihaKSYmIVluKFYpKSlyZXR1cm4gWi52YWx1ZT1WLCEwO2xldCBnZT1ULmlzQXJyYXkoYmUpJiZULmlzSW50ZWdlcktleShHKT9OdW1iZXIoRyk8YmUubGVuZ3RoOlQuaGFzT3duKGJlLEcpLHp0PVJlZmxlY3Quc2V0KGJlLEcsVixKKTtyZXR1cm4gYmU9PT1YdChKKSYmKGdlP1QuaGFzQ2hhbmdlZChWLFopJiZ5dChiZSwic2V0IixHLFYsWik6eXQoYmUsImFkZCIsRyxWKSksenR9fWZ1bmN0aW9uIFlpKEQsaWUpe2xldCBiZT1ULmhhc093bihELGllKSxHPURbaWVdLFY9UmVmbGVjdC5kZWxldGVQcm9wZXJ0eShELGllKTtyZXR1cm4gViYmYmUmJnl0KEQsImRlbGV0ZSIsaWUsdm9pZCAwLEcpLFZ9ZnVuY3Rpb24gTHIoRCxpZSl7bGV0IGJlPVJlZmxlY3QuaGFzKEQsaWUpO3JldHVybighVC5pc1N5bWJvbChpZSl8fCFnci5oYXMoaWUpKSYmQmUoRCwiaGFzIixpZSksYmV9ZnVuY3Rpb24gVnIoRCl7cmV0dXJuIEJlKEQsIml0ZXJhdGUiLFQuaXNBcnJheShEKT8ibGVuZ3RoIjpWdCksUmVmbGVjdC5vd25LZXlzKEQpfWxldCBhcj17Z2V0OnlyLHNldDpXaSxkZWxldGVQcm9wZXJ0eTpZaSxoYXM6THIsb3duS2V5czpWcn0sSXI9e2dldDpQaSxzZXQoRCxpZSl7cmV0dXJuITB9LGRlbGV0ZVByb3BlcnR5KEQsaWUpe3JldHVybiEwfX0scWk9VC5leHRlbmQoe30sYXIse2dldDpJaSxzZXQ6R2l9KSxTbz1ULmV4dGVuZCh7fSxJcix7Z2V0Om9yfSksQ289RD0+RCx0aT1EPT5SZWZsZWN0LmdldFByb3RvdHlwZU9mKEQpO2Z1bmN0aW9uIFFuKEQsaWUsYmU9ITEsRz0hMSl7RD1ELl9fdl9yYXc7bGV0IFY9WHQoRCksSj1YdChpZSk7YmV8fChpZSE9PUomJkJlKFYsImdldCIsaWUpLEJlKFYsImdldCIsSikpO2xldHtoYXM6Wn09dGkoViksZ2U9Rz9DbzpiZT91bjp4aTtpZihaLmNhbGwoVixpZSkpcmV0dXJuIGdlKEQuZ2V0KGllKSk7aWYoWi5jYWxsKFYsSikpcmV0dXJuIGdlKEQuZ2V0KEopKTtEIT09ViYmRC5nZXQoaWUpfWZ1bmN0aW9uIHBpKEQsaWU9ITEpe2xldCBiZT10aGlzLl9fdl9yYXcsRz1YdChiZSksVj1YdChEKTtyZXR1cm4gaWV8fChEIT09ViYmQmUoRywiaGFzIixEKSxCZShHLCJoYXMiLFYpKSxEPT09Vj9iZS5oYXMoRCk6YmUuaGFzKEQpfHxiZS5oYXMoVil9ZnVuY3Rpb24gbmkoRCxpZT0hMSl7cmV0dXJuIEQ9RC5fX3ZfcmF3LCFpZSYmQmUoWHQoRCksIml0ZXJhdGUiLFZ0KSxSZWZsZWN0LmdldChELCJzaXplIixEKX1mdW5jdGlvbiBzcihEKXtEPVh0KEQpO2xldCBpZT1YdCh0aGlzKTtyZXR1cm4gdGkoaWUpLmhhcy5jYWxsKGllLEQpfHwoaWUuYWRkKEQpLHl0KGllLCJhZGQiLEQsRCkpLHRoaXN9ZnVuY3Rpb24gZ2koRCxpZSl7aWU9WHQoaWUpO2xldCBiZT1YdCh0aGlzKSx7aGFzOkcsZ2V0OlZ9PXRpKGJlKSxKPUcuY2FsbChiZSxEKTtKfHwoRD1YdChEKSxKPUcuY2FsbChiZSxEKSk7bGV0IFo9Vi5jYWxsKGJlLEQpO3JldHVybiBiZS5zZXQoRCxpZSksSj9ULmhhc0NoYW5nZWQoaWUsWikmJnl0KGJlLCJzZXQiLEQsaWUsWik6eXQoYmUsImFkZCIsRCxpZSksdGhpc31mdW5jdGlvbiB2aShEKXtsZXQgaWU9WHQodGhpcykse2hhczpiZSxnZXQ6R309dGkoaWUpLFY9YmUuY2FsbChpZSxEKTtWfHwoRD1YdChEKSxWPWJlLmNhbGwoaWUsRCkpO2xldCBKPUc/Ry5jYWxsKGllLEQpOnZvaWQgMCxaPWllLmRlbGV0ZShEKTtyZXR1cm4gViYmeXQoaWUsImRlbGV0ZSIsRCx2b2lkIDAsSiksWn1mdW5jdGlvbiBtaSgpe2xldCBEPVh0KHRoaXMpLGllPUQuc2l6ZSE9PTAsYmU9dm9pZCAwLEc9RC5jbGVhcigpO3JldHVybiBpZSYmeXQoRCwiY2xlYXIiLHZvaWQgMCx2b2lkIDAsYmUpLEd9ZnVuY3Rpb24gRXIoRCxpZSl7cmV0dXJuIGZ1bmN0aW9uKEcsVil7bGV0IEo9dGhpcyxaPUouX192X3JhdyxnZT1YdChaKSx6dD1pZT9DbzpEP3VuOnhpO3JldHVybiFEJiZCZShnZSwiaXRlcmF0ZSIsVnQpLFouZm9yRWFjaCgoQ24sX24pPT5HLmNhbGwoVix6dChDbiksenQoX24pLEopKX19ZnVuY3Rpb24gUHIoRCxpZSxiZSl7cmV0dXJuIGZ1bmN0aW9uKC4uLkcpe2xldCBWPXRoaXMuX192X3JhdyxKPVh0KFYpLFo9VC5pc01hcChKKSxnZT1EPT09ImVudHJpZXMifHxEPT09U3ltYm9sLml0ZXJhdG9yJiZaLHp0PUQ9PT0ia2V5cyImJlosQ249VltEXSguLi5HKSxfbj1iZT9DbzppZT91bjp4aTtyZXR1cm4haWUmJkJlKEosIml0ZXJhdGUiLHp0P3pyOlZ0KSx7bmV4dCgpe2xldHt2YWx1ZTptcixkb25lOnFufT1Dbi5uZXh0KCk7cmV0dXJuIHFuP3t2YWx1ZTptcixkb25lOnFufTp7dmFsdWU6Z2U/W19uKG1yWzBdKSxfbihtclsxXSldOl9uKG1yKSxkb25lOnFufX0sW1N5bWJvbC5pdGVyYXRvcl0oKXtyZXR1cm4gdGhpc319fX1mdW5jdGlvbiBXcihEKXtyZXR1cm4gZnVuY3Rpb24oLi4uaWUpe3JldHVybiBEPT09ImRlbGV0ZSI/ITE6dGhpc319ZnVuY3Rpb24gR3IoKXtsZXQgRD17Z2V0KEope3JldHVybiBRbih0aGlzLEopfSxnZXQgc2l6ZSgpe3JldHVybiBuaSh0aGlzKX0saGFzOnBpLGFkZDpzcixzZXQ6Z2ksZGVsZXRlOnZpLGNsZWFyOm1pLGZvckVhY2g6RXIoITEsITEpfSxpZT17Z2V0KEope3JldHVybiBRbih0aGlzLEosITEsITApfSxnZXQgc2l6ZSgpe3JldHVybiBuaSh0aGlzKX0saGFzOnBpLGFkZDpzcixzZXQ6Z2ksZGVsZXRlOnZpLGNsZWFyOm1pLGZvckVhY2g6RXIoITEsITApfSxiZT17Z2V0KEope3JldHVybiBRbih0aGlzLEosITApfSxnZXQgc2l6ZSgpe3JldHVybiBuaSh0aGlzLCEwKX0saGFzKEope3JldHVybiBwaS5jYWxsKHRoaXMsSiwhMCl9LGFkZDpXcigiYWRkIiksc2V0OldyKCJzZXQiKSxkZWxldGU6V3IoImRlbGV0ZSIpLGNsZWFyOldyKCJjbGVhciIpLGZvckVhY2g6RXIoITAsITEpfSxHPXtnZXQoSil7cmV0dXJuIFFuKHRoaXMsSiwhMCwhMCl9LGdldCBzaXplKCl7cmV0dXJuIG5pKHRoaXMsITApfSxoYXMoSil7cmV0dXJuIHBpLmNhbGwodGhpcyxKLCEwKX0sYWRkOldyKCJhZGQiKSxzZXQ6V3IoInNldCIpLGRlbGV0ZTpXcigiZGVsZXRlIiksY2xlYXI6V3IoImNsZWFyIiksZm9yRWFjaDpFcighMCwhMCl9O3JldHVyblsia2V5cyIsInZhbHVlcyIsImVudHJpZXMiLFN5bWJvbC5pdGVyYXRvcl0uZm9yRWFjaChKPT57RFtKXT1QcihKLCExLCExKSxiZVtKXT1QcihKLCEwLCExKSxpZVtKXT1QcihKLCExLCEwKSxHW0pdPVByKEosITAsITApfSksW0QsYmUsaWUsR119bGV0W2VyLEtpLEppLHVvXT1HcigpO2Z1bmN0aW9uIF9pKEQsaWUpe2xldCBiZT1pZT9EP3VvOkppOkQ/S2k6ZXI7cmV0dXJuKEcsVixKKT0+Vj09PSJfX3ZfaXNSZWFjdGl2ZSI/IUQ6Vj09PSJfX3ZfaXNSZWFkb25seSI/RDpWPT09Il9fdl9yYXciP0c6UmVmbGVjdC5nZXQoVC5oYXNPd24oYmUsVikmJlYgaW4gRz9iZTpHLFYsSil9bGV0IEFvPXtnZXQ6X2koITEsITEpfSxVbz17Z2V0Ol9pKCExLCEwKX0sX2E9e2dldDpfaSghMCwhMSl9LEhvPXtnZXQ6X2koITAsITApfTtmdW5jdGlvbiBaaShELGllLGJlKXtsZXQgRz1YdChiZSk7aWYoRyE9PWJlJiZpZS5jYWxsKEQsRykpe2xldCBWPVQudG9SYXdUeXBlKEQpO2NvbnNvbGUud2FybihgUmVhY3RpdmUgJHtWfSBjb250YWlucyBib3RoIHRoZSByYXcgYW5kIHJlYWN0aXZlIHZlcnNpb25zIG9mIHRoZSBzYW1lIG9iamVjdCR7Vj09PSJNYXAiPyIgYXMga2V5cyI6IiJ9LCB3aGljaCBjYW4gbGVhZCB0byBpbmNvbnNpc3RlbmNpZXMuIEF2b2lkIGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIHRoZSByYXcgYW5kIHJlYWN0aXZlIHZlcnNpb25zIG9mIGFuIG9iamVjdCBhbmQgb25seSB1c2UgdGhlIHJlYWN0aXZlIHZlcnNpb24gaWYgcG9zc2libGUuYCl9fWxldCB3bj1uZXcgV2Vha01hcCxTbj1uZXcgV2Vha01hcCxObj1uZXcgV2Vha01hcCxscj1uZXcgV2Vha01hcDtmdW5jdGlvbiBPbyhEKXtzd2l0Y2goRCl7Y2FzZSJPYmplY3QiOmNhc2UiQXJyYXkiOnJldHVybiAxO2Nhc2UiTWFwIjpjYXNlIlNldCI6Y2FzZSJXZWFrTWFwIjpjYXNlIldlYWtTZXQiOnJldHVybiAyO2RlZmF1bHQ6cmV0dXJuIDB9fWZ1bmN0aW9uIER0KEQpe3JldHVybiBELl9fdl9za2lwfHwhT2JqZWN0LmlzRXh0ZW5zaWJsZShEKT8wOk9vKFQudG9SYXdUeXBlKEQpKX1mdW5jdGlvbiBSZShEKXtyZXR1cm4gWXIoRCk/RDpRaShELCExLGFyLEFvLHduKX1mdW5jdGlvbiBYaShEKXtyZXR1cm4gUWkoRCwhMSxxaSxVbyxTbil9ZnVuY3Rpb24gcmkoRCl7cmV0dXJuIFFpKEQsITAsSXIsX2EsTm4pfWZ1bmN0aW9uIGtpKEQpe3JldHVybiBRaShELCEwLFNvLEhvLGxyKX1mdW5jdGlvbiBRaShELGllLGJlLEcsVil7aWYoIVQuaXNPYmplY3QoRCl8fEQuX192X3JhdyYmIShpZSYmRC5fX3ZfaXNSZWFjdGl2ZSkpcmV0dXJuIEQ7bGV0IEo9Vi5nZXQoRCk7aWYoSilyZXR1cm4gSjtsZXQgWj1EdChEKTtpZihaPT09MClyZXR1cm4gRDtsZXQgZ2U9bmV3IFByb3h5KEQsWj09PTI/RzpiZSk7cmV0dXJuIFYuc2V0KEQsZ2UpLGdlfWZ1bmN0aW9uIFJpKEQpe3JldHVybiBZcihEKT9SaShELl9fdl9yYXcpOiEhKEQmJkQuX192X2lzUmVhY3RpdmUpfWZ1bmN0aW9uIFlyKEQpe3JldHVybiEhKEQmJkQuX192X2lzUmVhZG9ubHkpfWZ1bmN0aW9uIGlhKEQpe3JldHVybiEhKEQmJkQuX192X2lzU2hhbGxvdyl9ZnVuY3Rpb24gVG8oRCl7cmV0dXJuIFJpKEQpfHxZcihEKX1mdW5jdGlvbiBYdChEKXtsZXQgaWU9RCYmRC5fX3ZfcmF3O3JldHVybiBpZT9YdChpZSk6RH1mdW5jdGlvbiBiYShEKXtyZXR1cm4gVC5kZWYoRCwiX192X3NraXAiLCEwKSxEfWxldCB4aT1EPT5ULmlzT2JqZWN0KEQpP1JlKEQpOkQsdW49RD0+VC5pc09iamVjdChEKT9yaShEKTpEO2Z1bmN0aW9uIHFyKEQpe2FuJiZGdCYmKEQ9WHQoRCksYXQoRC5kZXB8fChELmRlcD10bigpKSkpfWZ1bmN0aW9uIEJpKEQsaWUpe0Q9WHQoRCksRC5kZXAmJlp0KEQuZGVwKX1mdW5jdGlvbiBZbihEKXtyZXR1cm4hIShEJiZELl9fdl9pc1JlZj09PSEwKX1mdW5jdGlvbiBJbyhEKXtyZXR1cm4gb2EoRCwhMSl9ZnVuY3Rpb24gRmEoRCl7cmV0dXJuIG9hKEQsITApfWZ1bmN0aW9uIG9hKEQsaWUpe3JldHVybiBZbihEKT9EOm5ldyBqbyhELGllKX1jbGFzcyBqb3tjb25zdHJ1Y3RvcihpZSxiZSl7dGhpcy5fX3ZfaXNTaGFsbG93PWJlLHRoaXMuZGVwPXZvaWQgMCx0aGlzLl9fdl9pc1JlZj0hMCx0aGlzLl9yYXdWYWx1ZT1iZT9pZTpYdChpZSksdGhpcy5fdmFsdWU9YmU/aWU6eGkoaWUpfWdldCB2YWx1ZSgpe3JldHVybiBxcih0aGlzKSx0aGlzLl92YWx1ZX1zZXQgdmFsdWUoaWUpe2llPXRoaXMuX192X2lzU2hhbGxvdz9pZTpYdChpZSksVC5oYXNDaGFuZ2VkKGllLHRoaXMuX3Jhd1ZhbHVlKSYmKHRoaXMuX3Jhd1ZhbHVlPWllLHRoaXMuX3ZhbHVlPXRoaXMuX192X2lzU2hhbGxvdz9pZTp4aShpZSksQmkodGhpcyxpZSkpfX1mdW5jdGlvbiBhYShEKXtCaShELHZvaWQgMCl9ZnVuY3Rpb24geWEoRCl7cmV0dXJuIFluKEQpP0QudmFsdWU6RH1sZXQgTnI9e2dldDooRCxpZSxiZSk9PnlhKFJlZmxlY3QuZ2V0KEQsaWUsYmUpKSxzZXQ6KEQsaWUsYmUsRyk9PntsZXQgVj1EW2llXTtyZXR1cm4gWW4oVikmJiFZbihiZSk/KFYudmFsdWU9YmUsITApOlJlZmxlY3Quc2V0KEQsaWUsYmUsRyl9fTtmdW5jdGlvbiBrcihEKXtyZXR1cm4gUmkoRCk/RDpuZXcgUHJveHkoRCxOcil9Y2xhc3Mga257Y29uc3RydWN0b3IoaWUpe3RoaXMuZGVwPXZvaWQgMCx0aGlzLl9fdl9pc1JlZj0hMDtsZXR7Z2V0OmJlLHNldDpHfT1pZSgoKT0+cXIodGhpcyksKCk9PkJpKHRoaXMpKTt0aGlzLl9nZXQ9YmUsdGhpcy5fc2V0PUd9Z2V0IHZhbHVlKCl7cmV0dXJuIHRoaXMuX2dldCgpfXNldCB2YWx1ZShpZSl7dGhpcy5fc2V0KGllKX19ZnVuY3Rpb24gY3IoRCl7cmV0dXJuIG5ldyBrbihEKX1mdW5jdGlvbiB2cihEKXtsZXQgaWU9VC5pc0FycmF5KEQpP25ldyBBcnJheShELmxlbmd0aCk6e307Zm9yKGxldCBiZSBpbiBEKWllW2JlXT16byhELGJlKTtyZXR1cm4gaWV9Y2xhc3MgZW97Y29uc3RydWN0b3IoaWUsYmUsRyl7dGhpcy5fb2JqZWN0PWllLHRoaXMuX2tleT1iZSx0aGlzLl9kZWZhdWx0VmFsdWU9Ryx0aGlzLl9fdl9pc1JlZj0hMH1nZXQgdmFsdWUoKXtsZXQgaWU9dGhpcy5fb2JqZWN0W3RoaXMuX2tleV07cmV0dXJuIGllPT09dm9pZCAwP3RoaXMuX2RlZmF1bHRWYWx1ZTppZX1zZXQgdmFsdWUoaWUpe3RoaXMuX29iamVjdFt0aGlzLl9rZXldPWllfX1mdW5jdGlvbiB6byhELGllLGJlKXtsZXQgRz1EW2llXTtyZXR1cm4gWW4oRyk/RzpuZXcgZW8oRCxpZSxiZSl9Y2xhc3MgTGF7Y29uc3RydWN0b3IoaWUsYmUsRyxWKXt0aGlzLl9zZXR0ZXI9YmUsdGhpcy5kZXA9dm9pZCAwLHRoaXMuX192X2lzUmVmPSEwLHRoaXMuX2RpcnR5PSEwLHRoaXMuZWZmZWN0PW5ldyBlaShpZSwoKT0+e3RoaXMuX2RpcnR5fHwodGhpcy5fZGlydHk9ITAsQmkodGhpcykpfSksdGhpcy5lZmZlY3QuY29tcHV0ZWQ9dGhpcyx0aGlzLmVmZmVjdC5hY3RpdmU9dGhpcy5fY2FjaGVhYmxlPSFWLHRoaXMuX192X2lzUmVhZG9ubHk9R31nZXQgdmFsdWUoKXtsZXQgaWU9WHQodGhpcyk7cmV0dXJuIHFyKGllKSwoaWUuX2RpcnR5fHwhaWUuX2NhY2hlYWJsZSkmJihpZS5fZGlydHk9ITEsaWUuX3ZhbHVlPWllLmVmZmVjdC5ydW4oKSksaWUuX3ZhbHVlfXNldCB2YWx1ZShpZSl7dGhpcy5fc2V0dGVyKGllKX19ZnVuY3Rpb24gRWEoRCxpZSxiZT0hMSl7bGV0IEcsVixKPVQuaXNGdW5jdGlvbihEKTtyZXR1cm4gSj8oRz1ELFY9VC5OT09QKTooRz1ELmdldCxWPUQuc2V0KSxuZXcgTGEoRyxWLEp8fCFWLGJlKX12YXIgdG87bGV0IEtyPVByb21pc2UucmVzb2x2ZSgpLE1pPVtdLFdvPSExLGlpPUQ9PntNaS5wdXNoKEQpLFdvfHwoV289ITAsS3IudGhlbihiaSkpfSxiaT0oKT0+e2ZvcihsZXQgRD0wO0Q8TWkubGVuZ3RoO0QrKylNaVtEXSgpO01pLmxlbmd0aD0wLFdvPSExfTtjbGFzcyB0cntjb25zdHJ1Y3RvcihpZSl7dGhpcy5kZXA9dm9pZCAwLHRoaXMuX2RpcnR5PSEwLHRoaXMuX192X2lzUmVmPSEwLHRoaXNbdG9dPSEwO2xldCBiZSxHPSExLFY9ITE7dGhpcy5lZmZlY3Q9bmV3IGVpKGllLEo9PntpZih0aGlzLmRlcCl7aWYoSiliZT10aGlzLl92YWx1ZSxHPSEwO2Vsc2UgaWYoIVYpe2xldCBaPUc/YmU6dGhpcy5fdmFsdWU7Vj0hMCxHPSExLGlpKCgpPT57dGhpcy5lZmZlY3QuYWN0aXZlJiZ0aGlzLl9nZXQoKSE9PVomJkJpKHRoaXMpLFY9ITF9KX1mb3IobGV0IFogb2YgdGhpcy5kZXApWi5jb21wdXRlZCBpbnN0YW5jZW9mIHRyJiZaLnNjaGVkdWxlcighMCl9dGhpcy5fZGlydHk9ITB9KSx0aGlzLmVmZmVjdC5jb21wdXRlZD10aGlzfV9nZXQoKXtyZXR1cm4gdGhpcy5fZGlydHk/KHRoaXMuX2RpcnR5PSExLHRoaXMuX3ZhbHVlPXRoaXMuZWZmZWN0LnJ1bigpKTp0aGlzLl92YWx1ZX1nZXQgdmFsdWUoKXtyZXR1cm4gcXIodGhpcyksWHQodGhpcykuX2dldCgpfX10bz0iX192X2lzUmVhZG9ubHkiO2Z1bmN0aW9uIHdyKEQpe3JldHVybiBuZXcgdHIoRCl9cmV0dXJuIGIuRWZmZWN0U2NvcGU9ayxiLklURVJBVEVfS0VZPVZ0LGIuUmVhY3RpdmVFZmZlY3Q9ZWksYi5jb21wdXRlZD1FYSxiLmN1c3RvbVJlZj1jcixiLmRlZmVycmVkQ29tcHV0ZWQ9d3IsYi5lZmZlY3Q9bW4sYi5lZmZlY3RTY29wZT11LGIuZW5hYmxlVHJhY2tpbmc9aXIsYi5nZXRDdXJyZW50U2NvcGU9R2UsYi5pc1Byb3h5PVRvLGIuaXNSZWFjdGl2ZT1SaSxiLmlzUmVhZG9ubHk9WXIsYi5pc1JlZj1ZbixiLmlzU2hhbGxvdz1pYSxiLm1hcmtSYXc9YmEsYi5vblNjb3BlRGlzcG9zZT1BdCxiLnBhdXNlVHJhY2tpbmc9VW4sYi5wcm94eVJlZnM9a3IsYi5yZWFjdGl2ZT1SZSxiLnJlYWRvbmx5PXJpLGIucmVmPUlvLGIucmVzZXRUcmFja2luZz1GbixiLnNoYWxsb3dSZWFjdGl2ZT1YaSxiLnNoYWxsb3dSZWFkb25seT1raSxiLnNoYWxsb3dSZWY9RmEsYi5zdG9wPUd0LGIudG9SYXc9WHQsYi50b1JlZj16byxiLnRvUmVmcz12cixiLnRyYWNrPUJlLGIudHJpZ2dlcj15dCxiLnRyaWdnZXJSZWY9YWEsYi51bnJlZj15YSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksYn0oe30sdik7cmV0dXJuIGN9ZnVuY3Rpb24gR2codil7dmFyIGM9ZnVuY3Rpb24oYil7InVzZSBzdHJpY3QiO2xldCBUPWAKYCxCPTQ0LEM9NTAsaz01MCx1PVsiJSIsIiUiXSxJPSIjMDA3YWZmIixHZT0iI2Y3ZjdmNyIsQXQ9L14oW2Etei1dKzopP1wvXC8vaSx0bj0vXmRhdGE6LiosLiovLEE9IldFQl9JTlZPS0VfQVBQU0VSVklDRSIsc2U9Ind4czovLyIsRW49Impzb246Ly8iLEduPSJ3eHNNb2R1bGVzIixidD0icmVuZGVyanNNb2R1bGVzIixRPSJvblNob3ciLGFlPSJvbkhpZGUiLGhuPSJvbkxhdW5jaCIsRnQ9Im9uRXJyb3IiLFZ0PSJvblRoZW1lQ2hhbmdlIix6cj0ib25LZXlib2FyZEhlaWdodENoYW5nZSIsZWk9Im9uUGFnZU5vdEZvdW5kIixUcj0ib25VbmhhbmRsZWRSZWplY3Rpb24iLG1uPSJvbkxvYWQiLEd0PSJvblJlYWR5Iixhbj0ib25VbmxvYWQiLFBuPSJvbkluaXQiLFVuPSJvblNhdmVFeGl0U3RhdGUiLGlyPSJvblJlc2l6ZSIsRm49Im9uQmFja1ByZXNzIixCZT0ib25QYWdlU2Nyb2xsIixhdD0ib25UYWJJdGVtVGFwIix5dD0ib25SZWFjaEJvdHRvbSIsWnQ9Im9uUHVsbERvd25SZWZyZXNoIixzbj0ib25TaGFyZVRpbWVsaW5lIixjbj0ib25BZGRUb0Zhdm9yaXRlcyIsZ3I9Im9uU2hhcmVBcHBNZXNzYWdlIix5cj0ib25OYXZpZ2F0aW9uQmFyQnV0dG9uVGFwIixJaT0ib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRDbGlja2VkIixQaT0ib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRDaGFuZ2VkIixvcj0ib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRDb25maXJtZWQiLHppPSJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dEZvY3VzQ2hhbmdlZCIsJG89Im9uQXBwRW50ZXJGb3JlZ3JvdW5kIixOaT0ib25BcHBFbnRlckJhY2tncm91bmQiLFdpPSJvbld4c0ludm9rZUNhbGxNZXRob2QiO2Z1bmN0aW9uIEdpKEcpe3JldHVybiEhRy5hcHBDb250ZXh0fWZ1bmN0aW9uIGhpKEcpe3JldHVybiBHJiYoR2koRyk/Ry5wcm94eTpHKX1mdW5jdGlvbiBZaShHKXtyZXR1cm4gRy5ub2RlVHlwZT09PTF9ZnVuY3Rpb24gTHIoRyl7bGV0e3Zub2RlOlZ9PUc7aWYoWWkoVi5lbCkpcmV0dXJuIFYuZWw7bGV0e3N1YlRyZWU6Sn09RztpZihKLnNoYXBlRmxhZyYxNil7bGV0IFo9Si5jaGlsZHJlbi5maW5kKGdlPT5nZS5lbCYmWWkoZ2UuZWwpKTtpZihaKXJldHVybiBaLmVsfXJldHVybiBWLmVsfWxldCBWcj0wO2Z1bmN0aW9uIGFyKEcsLi4uVil7bGV0IEo9RGF0ZS5ub3coKSxaPVZyP0otVnI6MDtyZXR1cm4gVnI9SixgWyR7Sn1dWyR7Wn1tc11bJHtHfV1cdUZGMUEke1YubWFwKGdlPT5KU09OLnN0cmluZ2lmeShnZSkpLmpvaW4oIiAiKX1gfWZ1bmN0aW9uIElyKEcpe2xldCBWPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIEo9PlZbSl18fChWW0pdPUcoSikpfWZ1bmN0aW9uIHFpKEcpe3JldHVybiBJcihHKX1mdW5jdGlvbiBTbyhHPSIiKXtyZXR1cm4oIiIrRykucmVwbGFjZSgvW15ceDAwLVx4ZmZdL2csIioqIikubGVuZ3RofWZ1bmN0aW9uIENvKEcpe3JldHVybiBHLmluZGV4T2YoIi8iKT09PTB9ZnVuY3Rpb24gdGkoRyl7cmV0dXJuIENvKEcpP0c6Ii8iK0d9ZnVuY3Rpb24gUW4oRyl7cmV0dXJuIENvKEcpP0cuc2xpY2UoMSk6R31sZXQgcGk9KEcsVik9PntsZXQgSjtmb3IobGV0IFo9MDtaPEcubGVuZ3RoO1orKylKPUdbWl0oVik7cmV0dXJuIEp9O2Z1bmN0aW9uIG5pKEcsVj1udWxsKXtsZXQgSjtyZXR1cm4oLi4uWik9PihHJiYoSj1HLmFwcGx5KFYsWiksRz1udWxsKSxKKX1mdW5jdGlvbiBzcihHLFYpe0c9R3x8e30sYi5pc1N0cmluZyhWKSYmKFY9e2Vyck1zZzpWfSksLzpvayQvLnRlc3QoVi5lcnJNc2cpP2IuaXNGdW5jdGlvbihHLnN1Y2Nlc3MpJiZHLnN1Y2Nlc3MoVik6Yi5pc0Z1bmN0aW9uKEcuZmFpbCkmJkcuZmFpbChWKSxiLmlzRnVuY3Rpb24oRy5jb21wbGV0ZSkmJkcuY29tcGxldGUoVil9ZnVuY3Rpb24gZ2koRyl7bGV0IFY9e307cmV0dXJuIGIuaXNQbGFpbk9iamVjdChHKSYmT2JqZWN0LmtleXMoRykuc29ydCgpLmZvckVhY2goSj0+e2xldCBaPUo7VltaXT1HW1pdfSksT2JqZWN0LmtleXMoVik/VjpHfWxldCB2aT1lbmNvZGVVUklDb21wb25lbnQ7ZnVuY3Rpb24gbWkoRyxWPXZpKXtsZXQgSj1HP09iamVjdC5rZXlzKEcpLm1hcChaPT57bGV0IGdlPUdbWl07cmV0dXJuIHR5cGVvZiBnZT09PXZvaWQgMHx8Z2U9PT1udWxsP2dlPSIiOmIuaXNQbGFpbk9iamVjdChnZSkmJihnZT1KU09OLnN0cmluZ2lmeShnZSkpLFYoWikrIj0iK1YoZ2UpfSkuZmlsdGVyKFo9PloubGVuZ3RoPjApLmpvaW4oIiYiKTpudWxsO3JldHVybiBKP2A/JHtKfWA6IiJ9ZnVuY3Rpb24gRXIoRyl7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoIiIrRyl9Y2F0Y2goVil7fXJldHVybiIiK0d9bGV0IFByPS9cKy9nO2Z1bmN0aW9uIFdyKEcpe2xldCBWPXt9O2lmKEc9PT0iInx8Rz09PSI/IilyZXR1cm4gVjtsZXQgWj0oR1swXT09PSI/Ij9HLnNsaWNlKDEpOkcpLnNwbGl0KCImIik7Zm9yKGxldCBnZT0wO2dlPFoubGVuZ3RoOysrZ2Upe2xldCB6dD1aW2dlXS5yZXBsYWNlKFByLCIgIiksQ249enQuaW5kZXhPZigiPSIpLF9uPUVyKENuPDA/enQ6enQuc2xpY2UoMCxDbikpLG1yPUNuPDA/bnVsbDpFcih6dC5zbGljZShDbisxKSk7aWYoX24gaW4gVil7bGV0IHFuPVZbX25dO2IuaXNBcnJheShxbil8fChxbj1WW19uXT1bcW5dKSxxbi5wdXNoKG1yKX1lbHNlIFZbX25dPW1yfXJldHVybiBWfWZ1bmN0aW9uIEdyKEcpe2xldFtWLEpdPUcuc3BsaXQoIj8iLDIpO3JldHVybntwYXRoOlYscXVlcnk6V3IoSnx8IiIpfX1mdW5jdGlvbiBlcihHKXtsZXQgVj17fTtyZXR1cm4gRyYmT2JqZWN0LmtleXMoRykuZm9yRWFjaChKPT57Si5pbmRleE9mKCJkYXRhLSIpPT09MCYmKFZbSi5yZXBsYWNlKCJkYXRhLSIsIiIpXT1HW0pdKX0pLFZ9Y2xhc3MgS2kgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihWKXtzdXBlcihWKTt0aGlzLm5hbWU9IkRPTUV4Y2VwdGlvbiJ9fWZ1bmN0aW9uIEppKEcsVil7cmV0dXJuIFYmJihWLmNhcHR1cmUmJihHKz0iQ2FwdHVyZSIpLFYub25jZSYmKEcrPSJPbmNlIiksVi5wYXNzaXZlJiYoRys9IlBhc3NpdmUiKSksYG9uJHtiLmNhcGl0YWxpemUoYi5jYW1lbGl6ZShHKSl9YH1jbGFzcyB1b3tjb25zdHJ1Y3RvcihWLEope3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMSx0aGlzLnRpbWVTdGFtcD1EYXRlLm5vdygpLHRoaXMuX3N0b3A9ITEsdGhpcy5fZW5kPSExLHRoaXMudHlwZT1WLHRoaXMuYnViYmxlcz0hIUouYnViYmxlcyx0aGlzLmNhbmNlbGFibGU9ISFKLmNhbmNlbGFibGV9cHJldmVudERlZmF1bHQoKXt0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITB9c3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl7dGhpcy5fZW5kPXRoaXMuX3N0b3A9ITB9c3RvcFByb3BhZ2F0aW9uKCl7dGhpcy5fc3RvcD0hMH19ZnVuY3Rpb24gX2koRyl7aWYoRyBpbnN0YW5jZW9mIHVvKXJldHVybiBHO2xldFtWXT1fYShHLnR5cGUpLEo9bmV3IHVvKFYse2J1YmJsZXM6ITEsY2FuY2VsYWJsZTohMX0pO3JldHVybiBiLmV4dGVuZChKLEcpLEp9Y2xhc3MgQW97Y29uc3RydWN0b3IoKXt0aGlzLmxpc3RlbmVycz1PYmplY3QuY3JlYXRlKG51bGwpfWRpc3BhdGNoRXZlbnQoVil7bGV0IEo9dGhpcy5saXN0ZW5lcnNbVi50eXBlXTtpZighSilyZXR1cm4hMTtsZXQgWj1faShWKSxnZT1KLmxlbmd0aDtmb3IobGV0IHp0PTA7enQ8Z2UmJihKW3p0XS5jYWxsKHRoaXMsWiksIVouX2VuZCk7enQrKyk7cmV0dXJuIFouY2FuY2VsYWJsZSYmWi5kZWZhdWx0UHJldmVudGVkfWFkZEV2ZW50TGlzdGVuZXIoVixKLFope1Y9SmkoVixaKSwodGhpcy5saXN0ZW5lcnNbVl18fCh0aGlzLmxpc3RlbmVyc1tWXT1bXSkpLnB1c2goSil9cmVtb3ZlRXZlbnRMaXN0ZW5lcihWLEosWil7Vj1KaShWLFopO2xldCBnZT10aGlzLmxpc3RlbmVyc1tWXTtpZighZ2UpcmV0dXJuO2xldCB6dD1nZS5pbmRleE9mKEopO3p0Pi0xJiZnZS5zcGxpY2UoenQsMSl9fWxldCBVbz0vKD86T25jZXxQYXNzaXZlfENhcHR1cmUpJC87ZnVuY3Rpb24gX2EoRyl7bGV0IFY7aWYoVW8udGVzdChHKSl7Vj17fTtsZXQgSjtmb3IoO0o9Ry5tYXRjaChVbyk7KUc9Ry5zbGljZSgwLEcubGVuZ3RoLUpbMF0ubGVuZ3RoKSxWW0pbMF0udG9Mb3dlckNhc2UoKV09ITB9cmV0dXJuW2IuaHlwaGVuYXRlKEcuc2xpY2UoMikpLFZdfWxldCBIbz0oKCk9Pih7c3RvcDoxLHByZXZlbnQ6MTw8MSxzZWxmOjE8PDJ9KSkoKTtmdW5jdGlvbiBaaShHKXtsZXQgVj0wO3JldHVybiBHLmluY2x1ZGVzKCJzdG9wIikmJihWfD1Iby5zdG9wKSxHLmluY2x1ZGVzKCJwcmV2ZW50IikmJihWfD1Iby5wcmV2ZW50KSxHLmluY2x1ZGVzKCJzZWxmIikmJihWfD1Iby5zZWxmKSxWfWxldCB3bj0wLFNuPTEsTm49Myxscj04O2Z1bmN0aW9uIE9vKEcsVil7bGV0e3BhcmVudE5vZGU6Sn09RztpZighSilyZXR1cm4gbnVsbDtsZXR7Y2hpbGROb2RlczpafT1KO3JldHVybiBaW1ouaW5kZXhPZihHKSsoVj09PSJuIj8xOi0xKV18fG51bGx9ZnVuY3Rpb24gRHQoRyl7bGV0e3BhcmVudE5vZGU6Vn09RztWJiZWLnJlbW92ZUNoaWxkKEcpfWZ1bmN0aW9uIFJlKEcpeyFHLm5vZGVJZCYmRy5wYWdlTm9kZSYmKEcubm9kZUlkPUcucGFnZU5vZGUuZ2VuSWQoKSl9Y2xhc3MgWGkgZXh0ZW5kcyBBb3tjb25zdHJ1Y3RvcihWLEosWil7c3VwZXIoKTtpZih0aGlzLnBhZ2VOb2RlPW51bGwsdGhpcy5wYXJlbnROb2RlPW51bGwsdGhpcy5fdGV4dD1udWxsLFope2xldHtwYWdlTm9kZTpnZX09WjtnZSYmKHRoaXMucGFnZU5vZGU9Z2UsdGhpcy5ub2RlSWQ9Z2UuZ2VuSWQoKSwhZ2UuaXNVbm1vdW50ZWQmJmdlLm9uQ3JlYXRlKHRoaXMsSikpfXRoaXMubm9kZVR5cGU9Vix0aGlzLm5vZGVOYW1lPUosdGhpcy5jaGlsZE5vZGVzPVtdfWdldCBmaXJzdENoaWxkKCl7cmV0dXJuIHRoaXMuY2hpbGROb2Rlc1swXXx8bnVsbH1nZXQgbGFzdENoaWxkKCl7bGV0e2NoaWxkTm9kZXM6Vn09dGhpcyxKPVYubGVuZ3RoO3JldHVybiBKP1ZbSi0xXTpudWxsfWdldCBuZXh0U2libGluZygpe3JldHVybiBPbyh0aGlzLCJuIil9Z2V0IG5vZGVWYWx1ZSgpe3JldHVybiBudWxsfXNldCBub2RlVmFsdWUoVil7fWdldCB0ZXh0Q29udGVudCgpe3JldHVybiB0aGlzLl90ZXh0fHwiIn1zZXQgdGV4dENvbnRlbnQoVil7dGhpcy5fdGV4dD1WLHRoaXMucGFnZU5vZGUmJiF0aGlzLnBhZ2VOb2RlLmlzVW5tb3VudGVkJiZ0aGlzLnBhZ2VOb2RlLm9uVGV4dENvbnRlbnQodGhpcyxWKX1nZXQgcGFyZW50RWxlbWVudCgpe2xldHtwYXJlbnROb2RlOlZ9PXRoaXM7cmV0dXJuIFYmJlYubm9kZVR5cGU9PT1Tbj9WOm51bGx9Z2V0IHByZXZpb3VzU2libGluZygpe3JldHVybiBPbyh0aGlzLCJwIil9YXBwZW5kQ2hpbGQoVil7cmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKFYsbnVsbCl9Y2xvbmVOb2RlKFYpe2xldCBKPWIuZXh0ZW5kKE9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpKSx0aGlzKSx7YXR0cmlidXRlczpafT1KO3JldHVybiBaJiYoSi5hdHRyaWJ1dGVzPWIuZXh0ZW5kKHt9LFopKSxWJiYoSi5jaGlsZE5vZGVzPUouY2hpbGROb2Rlcy5tYXAoZ2U9PmdlLmNsb25lTm9kZSghMCkpKSxKfWluc2VydEJlZm9yZShWLEope0R0KFYpLFYucGFnZU5vZGU9dGhpcy5wYWdlTm9kZSxWLnBhcmVudE5vZGU9dGhpcyxSZShWKTtsZXR7Y2hpbGROb2RlczpafT10aGlzO2lmKEope2xldCBnZT1aLmluZGV4T2YoSik7aWYoZ2U9PT0tMSl0aHJvdyBuZXcgS2koIkZhaWxlZCB0byBleGVjdXRlICdpbnNlcnRCZWZvcmUnIG9uICdOb2RlJzogVGhlIG5vZGUgYmVmb3JlIHdoaWNoIHRoZSBuZXcgbm9kZSBpcyB0byBiZSBpbnNlcnRlZCBpcyBub3QgYSBjaGlsZCBvZiB0aGlzIG5vZGUuIik7Wi5zcGxpY2UoZ2UsMCxWKX1lbHNlIFoucHVzaChWKTtyZXR1cm4gdGhpcy5wYWdlTm9kZSYmIXRoaXMucGFnZU5vZGUuaXNVbm1vdW50ZWQ/dGhpcy5wYWdlTm9kZS5vbkluc2VydEJlZm9yZSh0aGlzLFYsSik6Vn1yZW1vdmVDaGlsZChWKXtsZXR7Y2hpbGROb2RlczpKfT10aGlzLFo9Si5pbmRleE9mKFYpO2lmKFo9PT0tMSl0aHJvdyBuZXcgS2koIkZhaWxlZCB0byBleGVjdXRlICdyZW1vdmVDaGlsZCcgb24gJ05vZGUnOiBUaGUgbm9kZSB0byBiZSByZW1vdmVkIGlzIG5vdCBhIGNoaWxkIG9mIHRoaXMgbm9kZS4iKTtyZXR1cm4gVi5wYXJlbnROb2RlPW51bGwsSi5zcGxpY2UoWiwxKSx0aGlzLnBhZ2VOb2RlJiYhdGhpcy5wYWdlTm9kZS5pc1VubW91bnRlZD90aGlzLnBhZ2VOb2RlLm9uUmVtb3ZlQ2hpbGQoVik6Vn19bGV0IHJpPSJjbGFzcyIsa2k9InN0eWxlIixRaT0iLnZPd25lcklkIixSaT0iLnZSZW5kZXJqcyI7Y2xhc3MgWXIgZXh0ZW5kcyBYaXtjb25zdHJ1Y3RvcihWLEosWil7c3VwZXIoVixKLFopO3RoaXMuYXR0cmlidXRlcz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuc3R5bGU9bnVsbCx0aGlzLnZTaG93PW51bGwsdGhpcy5faHRtbD1udWxsfWdldCBjbGFzc05hbWUoKXtyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzW3JpXXx8IiJ9c2V0IGNsYXNzTmFtZShWKXt0aGlzLnNldEF0dHJpYnV0ZShyaSxWKX1nZXQgaW5uZXJIVE1MKCl7cmV0dXJuIiJ9c2V0IGlubmVySFRNTChWKXt0aGlzLl9odG1sPVZ9YWRkRXZlbnRMaXN0ZW5lcihWLEosWil7c3VwZXIuYWRkRXZlbnRMaXN0ZW5lcihWLEosWiksdGhpcy5wYWdlTm9kZSYmIXRoaXMucGFnZU5vZGUuaXNVbm1vdW50ZWQmJihKLnd4c0V2ZW50P3RoaXMucGFnZU5vZGUub25BZGRXeHNFdmVudCh0aGlzLEppKFYsWiksSi53eHNFdmVudCxaaShKLm1vZGlmaWVyc3x8W10pKTp0aGlzLnBhZ2VOb2RlLm9uQWRkRXZlbnQodGhpcyxKaShWLFopLFppKEoubW9kaWZpZXJzfHxbXSkpKX1yZW1vdmVFdmVudExpc3RlbmVyKFYsSixaKXtzdXBlci5yZW1vdmVFdmVudExpc3RlbmVyKFYsSixaKSx0aGlzLnBhZ2VOb2RlJiYhdGhpcy5wYWdlTm9kZS5pc1VubW91bnRlZCYmdGhpcy5wYWdlTm9kZS5vblJlbW92ZUV2ZW50KHRoaXMsSmkoVixaKSl9Z2V0QXR0cmlidXRlKFYpe3JldHVybiBWPT09a2k/dGhpcy5zdHlsZTp0aGlzLmF0dHJpYnV0ZXNbVl19cmVtb3ZlQXR0cmlidXRlKFYpe1Y9PWtpP3RoaXMuc3R5bGU9bnVsbDpkZWxldGUgdGhpcy5hdHRyaWJ1dGVzW1ZdLHRoaXMucGFnZU5vZGUmJiF0aGlzLnBhZ2VOb2RlLmlzVW5tb3VudGVkJiZ0aGlzLnBhZ2VOb2RlLm9uUmVtb3ZlQXR0cmlidXRlKHRoaXMsVil9c2V0QXR0cmlidXRlKFYsSil7Vj09PWtpP3RoaXMuc3R5bGU9Sjp0aGlzLmF0dHJpYnV0ZXNbVl09Six0aGlzLnBhZ2VOb2RlJiYhdGhpcy5wYWdlTm9kZS5pc1VubW91bnRlZCYmdGhpcy5wYWdlTm9kZS5vblNldEF0dHJpYnV0ZSh0aGlzLFYsSil9dG9KU09OKHthdHRyOlYsbm9ybWFsaXplOkp9PXt9KXtsZXR7YXR0cmlidXRlczpaLHN0eWxlOmdlLGxpc3RlbmVyczp6dCxfdGV4dDpDbn09dGhpcyxfbj17fTtPYmplY3Qua2V5cyhaKS5sZW5ndGgmJihfbi5hPUo/SihaKTpaKTtsZXQgbXI9T2JqZWN0LmtleXMoenQpO2lmKG1yLmxlbmd0aCl7bGV0IHFuLFZhPXt9O21yLmZvckVhY2goUG89PntsZXQgTm89enRbUG9dO2lmKE5vLmxlbmd0aCl7bGV0e3d4c0V2ZW50OnNhLG1vZGlmaWVyczokYX09Tm9bMF0sVWE9WmkoJGF8fFtdKTtzYT8ocW58fChxbj17fSkscW5bUG9dPVtKP0ooc2EpOnNhLFVhXSk6VmFbUG9dPVVhfX0pLF9uLmU9Sj9KKFZhLCExKTpWYSxxbiYmKF9uLnc9Sj9KKHFuLCExKTpxbil9cmV0dXJuIGdlIT09bnVsbCYmKF9uLnM9Sj9KKGdlKTpnZSksVnx8KF9uLmk9dGhpcy5ub2RlSWQsX24ubj10aGlzLm5vZGVOYW1lKSxDbiE9PW51bGwmJihfbi50PUo/SihDbik6Q24pLF9ufX1jbGFzcyBpYSBleHRlbmRzIFhpe2NvbnN0cnVjdG9yKFYsSil7c3VwZXIobHIsIiNjb21tZW50IixKKTt0aGlzLl90ZXh0PSIifXRvSlNPTihWPXt9KXtyZXR1cm4gVi5hdHRyP3t9OntpOnRoaXMubm9kZUlkfX19Y2xhc3MgVG8gZXh0ZW5kcyBZcntjb25zdHJ1Y3RvcihWLEope3N1cGVyKFNuLFYudG9VcHBlckNhc2UoKSxKKTt0aGlzLnRhZ05hbWU9dGhpcy5ub2RlTmFtZX19Y2xhc3MgWHQgZXh0ZW5kcyBUb3tnZXQgdmFsdWUoKXtyZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGUoInZhbHVlIil9c2V0IHZhbHVlKFYpe3RoaXMuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsVil9fWNsYXNzIGJhIGV4dGVuZHMgWHR7fWNsYXNzIHhpIGV4dGVuZHMgWXJ7Y29uc3RydWN0b3IoVixKKXtzdXBlcihObiwiI3RleHQiLEopO3RoaXMuX3RleHQ9Vn1nZXQgbm9kZVZhbHVlKCl7cmV0dXJuIHRoaXMuX3RleHR8fCIifXNldCBub2RlVmFsdWUoVil7dGhpcy5fdGV4dD1WLHRoaXMucGFnZU5vZGUmJiF0aGlzLnBhZ2VOb2RlLmlzVW5tb3VudGVkJiZ0aGlzLnBhZ2VOb2RlLm9uTm9kZVZhbHVlKHRoaXMsVil9fWxldCB1bj17QUQ6WyJkYXRhIl0sIkFELURSQVciOlsiZGF0YSJdLCJMSVZFLVBMQVlFUiI6WyJwaWN0dXJlLWluLXBpY3R1cmUtbW9kZSJdLE1BUDpbIm1hcmtlcnMiLCJwb2x5bGluZSIsImNpcmNsZXMiLCJjb250cm9scyIsImluY2x1ZGUtcG9pbnRzIiwicG9seWdvbnMiXSxQSUNLRVI6WyJyYW5nZSIsInZhbHVlIl0sIlBJQ0tFUi1WSUVXIjpbInZhbHVlIl0sIlJJQ0gtVEVYVCI6WyJub2RlcyJdLFZJREVPOlsiZGFubXUtbGlzdCIsImhlYWRlciJdLCJXRUItVklFVyI6WyJ3ZWJ2aWV3LXN0eWxlcyJdfSxxcj1bImFuaW1hdGlvbiJdLEJpPShHLFYpPT57aWYocXIuaW5kZXhPZihWKT4tMSlyZXR1cm4hMDtsZXQgSj11bltHLm5vZGVOYW1lXTtyZXR1cm4hIShKJiZKLmluZGV4T2YoVik+LTEpfSxZbj0xLElvPTIsRmE9MyxvYT00LGpvPTUsYWE9Nix5YT03LE5yPTgsa3I9OSxrbj0xMCxjcj0xMix2cj0xNSxlbz0yMDtmdW5jdGlvbiB6byhHLFYse2NsZWFyVGltZW91dDpKLHNldFRpbWVvdXQ6Wn0pe2xldCBnZSx6dD1mdW5jdGlvbigpe0ooZ2UpLGdlPVooKCk9PkcuYXBwbHkodGhpcyxhcmd1bWVudHMpLFYpfTtyZXR1cm4genQuY2FuY2VsPWZ1bmN0aW9uKCl7SihnZSl9LHp0fWNsYXNzIExhe2NvbnN0cnVjdG9yKFYsSil7dGhpcy5pZD1WLHRoaXMubGlzdGVuZXI9e30sdGhpcy5lbWl0Q2FjaGU9e30sSiYmT2JqZWN0LmtleXMoSikuZm9yRWFjaChaPT57dGhpcy5vbihaLEpbWl0pfSl9ZW1pdChWLC4uLkope2xldCBaPXRoaXMubGlzdGVuZXJbVl07aWYoIVopcmV0dXJuKHRoaXMuZW1pdENhY2hlW1ZdfHwodGhpcy5lbWl0Q2FjaGVbVl09W10pKS5wdXNoKEopO1ouZm9yRWFjaChnZT0+e2dlLmZuLmFwcGx5KGdlLmZuLEopfSksdGhpcy5saXN0ZW5lcltWXT1aLmZpbHRlcihnZT0+Z2UudHlwZSE9PSJvbmNlIil9b24oVixKKXt0aGlzLl9hZGRMaXN0ZW5lcihWLCJvbiIsSiksdGhpcy5fY2xlYXJDYWNoZShWKX1vbmNlKFYsSil7dGhpcy5fYWRkTGlzdGVuZXIoViwib25jZSIsSiksdGhpcy5fY2xlYXJDYWNoZShWKX1vZmYoVixKKXtsZXQgWj10aGlzLmxpc3RlbmVyW1ZdO2lmKCEhWilpZihKKWZvcihsZXQgZ2U9MDtnZTxaLmxlbmd0aDspWltnZV0uZm49PT1KJiYoWi5zcGxpY2UoZ2UsMSksZ2UtLSksZ2UrKztlbHNlIGRlbGV0ZSB0aGlzLmxpc3RlbmVyW1ZdfV9jbGVhckNhY2hlKFYpe2xldCBKPXRoaXMuZW1pdENhY2hlW1ZdO2lmKEopZm9yKDtKLmxlbmd0aD4wOyl0aGlzLmVtaXQuYXBwbHkodGhpcyxbViwuLi5KLnNoaWZ0KCldKX1fYWRkTGlzdGVuZXIoVixKLFopeyh0aGlzLmxpc3RlbmVyW1ZdfHwodGhpcy5saXN0ZW5lcltWXT1bXSkpLnB1c2goe2ZuOlosdHlwZTpKfSl9fWxldCBFYT1bUG4sbW4sUSxhZSxhbixGbixCZSxhdCx5dCxadCxzbixncixjbixVbix5cixJaSxQaSxvcix6aV0sdG89W21uLFFdO2Z1bmN0aW9uIEtyKEcpe3JldHVybiB0by5pbmRleE9mKEcpPi0xfWZ1bmN0aW9uIE1pKEcpe3JldHVybiBFYS5pbmRleE9mKEcpPi0xfWxldCBXbz1bUSxhZSxobixGdCxWdCxlaSxUcixQbixtbixHdCxhbixpcixGbixCZSxhdCx5dCxadCxzbixjbixncixVbix5cixJaSxQaSxvcix6aV0saWksYmk9W107ZnVuY3Rpb24gdHIoRyl7aWYoaWkpcmV0dXJuIEcoaWkpO2JpLnB1c2goRyl9ZnVuY3Rpb24gd3IoRyl7aWk9RyxiaS5mb3JFYWNoKFY9PlYoRykpfWxldCBEPWZ1bmN0aW9uKCl7fTtELnByb3RvdHlwZT17b246ZnVuY3Rpb24oRyxWLEope3ZhciBaPXRoaXMuZXx8KHRoaXMuZT17fSk7cmV0dXJuKFpbR118fChaW0ddPVtdKSkucHVzaCh7Zm46VixjdHg6Sn0pLHRoaXN9LG9uY2U6ZnVuY3Rpb24oRyxWLEope3ZhciBaPXRoaXM7ZnVuY3Rpb24gZ2UoKXtaLm9mZihHLGdlKSxWLmFwcGx5KEosYXJndW1lbnRzKX1yZXR1cm4gZ2UuXz1WLHRoaXMub24oRyxnZSxKKX0sZW1pdDpmdW5jdGlvbihHKXt2YXIgVj1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxKPSgodGhpcy5lfHwodGhpcy5lPXt9KSlbR118fFtdKS5zbGljZSgpLFo9MCxnZT1KLmxlbmd0aDtmb3IoWjtaPGdlO1orKylKW1pdLmZuLmFwcGx5KEpbWl0uY3R4LFYpO3JldHVybiB0aGlzfSxvZmY6ZnVuY3Rpb24oRyxWKXt2YXIgSj10aGlzLmV8fCh0aGlzLmU9e30pLFo9SltHXSxnZT1bXTtpZihaJiZWKWZvcih2YXIgenQ9MCxDbj1aLmxlbmd0aDt6dDxDbjt6dCsrKVpbenRdLmZuIT09ViYmWlt6dF0uZm4uXyE9PVYmJmdlLnB1c2goWlt6dF0pO3JldHVybiBnZS5sZW5ndGg/SltHXT1nZTpkZWxldGUgSltHXSx0aGlzfX07dmFyIGllPUQsYmU9e2ludm9rZUFycmF5Rm5zOnBpLE9OX0xPQUQ6bW4sT05fU0hPVzpRLExJTkVGRUVEOlQsUkVOREVSSlNfTU9EVUxFUzpidCxXWFNfUFJPVE9DT0w6c2UsZm9ybWF0TG9nOmFyLFdYU19NT0RVTEVTOkduLE9OX0VSUk9SOkZ0LFVuaUxpZmVjeWNsZUhvb2tzOldvLGludm9rZUNyZWF0ZVZ1ZUFwcEhvb2s6d3IscGFyc2VOVnVlRGF0YXNldDplcixvbmNlOm5pLEkxOE5fSlNPTl9ERUxJTUlURVJTOnUsRW1pdHRlcjppZSxhZGRMZWFkaW5nU2xhc2g6dGkscmVzb2x2ZUNvbXBvbmVudEluc3RhbmNlOmhpLHJlbW92ZUxlYWRpbmdTbGFzaDpRbixPTl9SRVNJWkU6aXIsT05fQVBQX0VOVEVSX0ZPUkVHUk9VTkQ6JG8sT05fQVBQX0VOVEVSX0JBQ0tHUk9VTkQ6TmksT05fSElERTphZSxPTl9QQUdFX1NDUk9MTDpCZSxPTl9SRUFDSF9CT1RUT006eXQsU0NIRU1FX1JFOkF0LERBVEFfUkU6dG4sY2FjaGVTdHJpbmdGdW5jdGlvbjpxaSxwYXJzZVF1ZXJ5OldyLGNhbGxPcHRpb25zOnNyLE9OX1VOSEFORExFX1JFSkVDVElPTjpUcixPTl9QQUdFX05PVF9GT1VORDplaSxQUklNQVJZX0NPTE9SOkksZ2V0TGVuOlNvLFRBQkJBUl9IRUlHSFQ6QyxOQVZCQVJfSEVJR0hUOkIsc29ydE9iamVjdDpnaSxPTl9USEVNRV9DSEFOR0U6VnQsT05fS0VZQk9BUkRfSEVJR0hUX0NIQU5HRTp6cixCQUNLR1JPVU5EX0NPTE9SOkdlLE9OX05BVklHQVRJT05fQkFSX0JVVFRPTl9UQVA6eXIsc3RyaW5naWZ5UXVlcnk6bWksZGVib3VuY2U6em8sT05fUFVMTF9ET1dOX1JFRlJFU0g6WnQsT05fTkFWSUdBVElPTl9CQVJfU0VBUkNIX0lOUFVUX0NIQU5HRUQ6UGksT05fTkFWSUdBVElPTl9CQVJfU0VBUkNIX0lOUFVUX0NPTkZJUk1FRDpvcixPTl9OQVZJR0FUSU9OX0JBUl9TRUFSQ0hfSU5QVVRfQ0xJQ0tFRDpJaSxPTl9OQVZJR0FUSU9OX0JBUl9TRUFSQ0hfSU5QVVRfRk9DVVNfQ0hBTkdFRDp6aSxPTl9CQUNLX1BSRVNTOkZuLFVuaU5vZGU6WGksTk9ERV9UWVBFX1BBR0U6d24sQUNUSU9OX1RZUEVfUEFHRV9DUkVBVEU6WW4sQUNUSU9OX1RZUEVfUEFHRV9DUkVBVEVEOklvLEFDVElPTl9UWVBFX1BBR0VfU0NST0xMOnZyLEFDVElPTl9UWVBFX0lOU0VSVDpvYSxBQ1RJT05fVFlQRV9DUkVBVEU6RmEsQUNUSU9OX1RZUEVfUkVNT1ZFOmpvLEFDVElPTl9UWVBFX0FERF9FVkVOVDpOcixBQ1RJT05fVFlQRV9BRERfV1hTX0VWRU5UOmNyLEFDVElPTl9UWVBFX1JFTU9WRV9FVkVOVDprcixBQ1RJT05fVFlQRV9TRVRfQVRUUklCVVRFOmFhLEFDVElPTl9UWVBFX1JFTU9WRV9BVFRSSUJVVEU6eWEsQUNUSU9OX1RZUEVfU0VUX1RFWFQ6a24sT05fUkVBRFk6R3QsT05fVU5MT0FEOmFuLEV2ZW50Q2hhbm5lbDpMYSxPTl9SRUFDSF9CT1RUT01fRElTVEFOQ0U6ayxwYXJzZVVybDpHcixvbkNyZWF0ZVZ1ZUFwcDp0cixPTl9UQUJfSVRFTV9UQVA6YXQsT05fTEFVTkNIOmhuLEFDVElPTl9UWVBFX0VWRU5UOmVvLGNyZWF0ZVVuaUV2ZW50Ol9pLE9OX1dYU19JTlZPS0VfQ0FMTF9NRVRIT0Q6V2ksV0VCX0lOVk9LRV9BUFBTRVJWSUNFOkEsaXNSb290SG9vazpNaSxpc1Jvb3RJbW1lZGlhdGVIb29rOktyLFVuaUlucHV0RWxlbWVudDpYdCxVbmlUZXh0QXJlYUVsZW1lbnQ6YmEsVW5pRWxlbWVudDpUbyxVbmlUZXh0Tm9kZTp4aSxVbmlDb21tZW50Tm9kZTppYSxmb3JjZVBhdGNoUHJvcDpCaSxyZXNvbHZlT3duZXJFbDpMcixBVFRSX1ZfT1dORVJfSUQ6UWksQVRUUl9WX1JFTkRFUkpTOlJpLEpTT05fUFJPVE9DT0w6RW59O3JldHVybiBiZX0odik7cmV0dXJuIGN9dmFyIGdQPTE7ZnVuY3Rpb24gWWcoKXtyZXR1cm4oZ1ArKykudG9TdHJpbmcoKX12YXIgZWQ9dj0+diYmSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh2KSl8fHY7ZnVuY3Rpb24gbXUodil7bGV0IGM9cXModik7cmV0dXJuIGMuc3Vic3RyaW5nKDgsYy5sZW5ndGgtMSl9ZnVuY3Rpb24gdGQodil7aWYoISRuKGJ0b2EpKXJldHVybiIiO2xldCBjPUFycmF5LnByb3RvdHlwZS5tYXAuY2FsbChuZXcgVWludDhBcnJheSh2KSxiPT5TdHJpbmcuZnJvbUNoYXJDb2RlKGIpKS5qb2luKCIiKTtyZXR1cm4gYnRvYShjKX1mdW5jdGlvbiBfdSh2KXtpZighdnx8dHlwZW9mIHYhPSJvYmplY3QiKXJldHVybiEwO2ZvcihsZXQgYyBpbiB2KWlmKHFsKHYsYykpcmV0dXJuITE7cmV0dXJuITB9dmFyIG5mPVsib2ZmIiwiZXJyb3IiLCJ3YXJuIiwiaW5mbyIsImxvZyIsImRlYnVnIl0scmY9e307ZnVuY3Rpb24gcWcoKXtuZi5mb3JFYWNoKHY9PntsZXQgYz1uZi5pbmRleE9mKHYpO3JmW3ZdPXt9LG5mLmZvckVhY2goYj0+e25mLmluZGV4T2YoYik8PWMmJihyZlt2XVtiXT0hMCl9KX0pfWZ1bmN0aW9uIFhuKHYpe2xldCBjPWdsb2JhbC5XWEVudmlyb25tZW50JiZnbG9iYWwuV1hFbnZpcm9ubWVudC5sb2dMZXZlbHx8ImxvZyI7cmV0dXJuIHJmW2NdJiZyZltjXVt2XX1mdW5jdGlvbiBjbyh2KXtnbG9iYWwubmF0aXZlTG9nKCJ3eEludGVyYWN0aW9uQW5hbHl6ZXI6IFtqc2ZtXSIrdiwiX19ERUJVRyIpfWZ1bmN0aW9uIEtnKHYsYyxiKXtyZXR1cm5gJHtjfUAke2J9IyR7dn1gfXZhciBvZj1jbGFzc3tjb25zdHJ1Y3RvcihjKXt0aGlzLmluc3RhbmNlSWQ9U3RyaW5nKGMpLHRoaXMubGFzdENhbGxiYWNrSWQ9MCx0aGlzLmNhbGxiYWNrcz17fSx0aGlzLmhvb2tzPXt9fWFkZChjKXtyZXR1cm4gdGhpcy5sYXN0Q2FsbGJhY2tJZCsrLHRoaXMuY2FsbGJhY2tzW3RoaXMubGFzdENhbGxiYWNrSWRdPWMsdGhpcy5sYXN0Q2FsbGJhY2tJZH1yZW1vdmUoYyl7bGV0IGI9dGhpcy5jYWxsYmFja3NbY107cmV0dXJuIGRlbGV0ZSB0aGlzLmNhbGxiYWNrc1tjXSxifXJlZ2lzdGVySG9vayhjLGIsVCxCKXtsZXQgQz1LZyhjLGIsVCk7dGhpcy5ob29rc1tDXSYmY29uc29sZS53YXJuKGBbSlMgRnJhbWV3b3JrXSBPdmVycmlkZSBhbiBleGlzdGluZyBjb21wb25lbnQgaG9vayAiJHtDfSIuYCksdGhpcy5ob29rc1tDXT1CfXRyaWdnZXJIb29rKGMsYixULEIpe2xldCBDPUtnKGMsYixUKSxrPXRoaXMuaG9va3NbQ107aWYoISRuKGspKXJldHVybiBjb25zb2xlLmVycm9yKGBbSlMgRnJhbWV3b3JrXSBJbnZhbGlkIGhvb2sgZnVuY3Rpb24gdHlwZSAoJHt0eXBlb2Yga30pIG9uICIke0N9Ii5gKSxudWxsO2xldCB1PW51bGw7dHJ5e3U9ay5hcHBseShudWxsLEJ8fFtdKX1jYXRjaChJKXt0aHJvdyBjb25zb2xlLmVycm9yKGBbSlMgRnJhbWV3b3JrXSBGYWlsZWQgdG8gZXhlY3V0ZSB0aGUgaG9vayBmdW5jdGlvbiBvbiAiJHtDfSIuYCksSX1yZXR1cm4gdX1jb25zdW1lKGMsYixUKXtsZXQgQj10aGlzLmNhbGxiYWNrc1tjXTtpZigodHlwZW9mIFQ9PSJ1bmRlZmluZWQifHxUPT09ITEpJiZkZWxldGUgdGhpcy5jYWxsYmFja3NbY10sJG4oQikpdHJ5e3JldHVybiBCLmNhbGwobnVsbCxiLFQpfWNhdGNoKEMpe3Rocm93IGNvbnNvbGUuZXJyb3IoYFtKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byBleGVjdXRlIHRoZSBjYWxsYmFjayBmdW5jdGlvbjoKICR7Qy50b1N0cmluZygpfWApLEN9cmV0dXJuIG5ldyBFcnJvcihgaW52YWxpZCBjYWxsYmFjayBpZCAiJHtjfSJgKX1jbG9zZSgpe3RoaXMuY2FsbGJhY2tzPXt9LHRoaXMuaG9va3M9e319fTt2YXIgYWY9e307ZnVuY3Rpb24gSmcodixjKXt2JiYoYWZbdl09Yyl9ZnVuY3Rpb24gS3Modil7cmV0dXJuIGFmW3ZdfWZ1bmN0aW9uIFpnKHYpe2RlbGV0ZSBhZlt2XX1mdW5jdGlvbiBqcih2KXtpZih2KXtsZXQgYz1hZlt2XTtpZihjJiZjLnRhc2tDZW50ZXIpcmV0dXJuIGMudGFza0NlbnRlcn1yZXR1cm4gbnVsbH1mdW5jdGlvbiB2UCh2KXt2LmNhbGNDbGFzc0xpc3QmJnYuY2FsY0NsYXNzTGlzdCgpfWZ1bmN0aW9uIG5kKHYsYyxiKXtsZXR7ZG9jdW1lbnRFbGVtZW50OlR9PXY7aWYoVC5wdXJlQ2hpbGRyZW4ubGVuZ3RoPjB8fGMucGFyZW50Tm9kZSlyZXR1cm47bGV0IEI9VC5jaGlsZHJlbixDPWI/Qi5pbmRleE9mKGIpOi0xO0M8MD9CLnB1c2goYyk6Qi5zcGxpY2UoQywwLGMpLGMubm9kZVR5cGU9PT0xPyhjLnJvbGU9PT0iYm9keSI/KGMuZG9jSWQ9di5pZCxjLm93bmVyRG9jdW1lbnQ9dixjLnBhcmVudE5vZGU9VCxLbChjLFQpKTooYy5jaGlsZHJlbi5mb3JFYWNoKGs9PntrLnBhcmVudE5vZGU9Y30pLHJkKHYsYyksS2woYyxUKSxkZWxldGUgdi5ub2RlTWFwW2Mubm9kZUlkXSksVC5wdXJlQ2hpbGRyZW4ucHVzaChjKSxtUCh2LGMpKTooYy5wYXJlbnROb2RlPVQsdi5ub2RlTWFwW2MucmVmXT1jKX1mdW5jdGlvbiBtUCh2LGMpe2xldCBiPWMudG9KU09OKCk7diYmdi50YXNrQ2VudGVyJiYkbih2LnRhc2tDZW50ZXIuc2VuZCkmJnYudGFza0NlbnRlci5zZW5kKCJkb20iLHthY3Rpb246ImNyZWF0ZUJvZHkifSxbYl0pfWZ1bmN0aW9uIHJkKHYsYyl7Yy5yb2xlPSJib2R5IixjLmRlcHRoPTEsZGVsZXRlIHYubm9kZU1hcFtjLm5vZGVJZF0sYy5yZWY9Il9yb290Iix2Lm5vZGVNYXAuX3Jvb3Q9Yyx2LmJvZHk9Y31mdW5jdGlvbiBLbCh2LGMpe3YucGFyZW50Tm9kZT1jLHZQKHYpLGMuZG9jSWQmJih2LmRvY0lkPWMuZG9jSWQsdi5vd25lckRvY3VtZW50PWMub3duZXJEb2N1bWVudCx2Lm93bmVyRG9jdW1lbnQubm9kZU1hcFt2Lm5vZGVJZF09dix2LmRlcHRoPWMuZGVwdGgrMSksdi5jaGlsZHJlbi5mb3JFYWNoKGI9PntLbChiLHYpfSl9ZnVuY3Rpb24gaWQodil7Zm9yKDt2Oyl7aWYodi5ub2RlVHlwZT09PTEpcmV0dXJuIHY7dj12Lm5leHRTaWJsaW5nfX1mdW5jdGlvbiBvZCh2KXtmb3IoO3Y7KXtpZih2Lm5vZGVUeXBlPT09MSlyZXR1cm4gdjt2PXYucHJldmlvdXNTaWJsaW5nfX1mdW5jdGlvbiBKbCh2LGMsYixUPSExKXtiPDAmJihiPTApO2xldCBCPWNbYi0xXSxDPWNbYl07cmV0dXJuIGMuc3BsaWNlKGIsMCx2KSxUJiYoQiYmKEIubmV4dFNpYmxpbmc9diksdi5wcmV2aW91c1NpYmxpbmc9Qix2Lm5leHRTaWJsaW5nPUMsQyYmKEMucHJldmlvdXNTaWJsaW5nPXYpKSxifWZ1bmN0aW9uIFpsKHYsYyxiLFQ9ITEpe2xldCBCPWMuaW5kZXhPZih2KTtpZihCPDApcmV0dXJuLTE7aWYoVCl7bGV0IEk9Y1tCLTFdLEdlPWNbQisxXTtJJiYoSS5uZXh0U2libGluZz1HZSksR2UmJihHZS5wcmV2aW91c1NpYmxpbmc9SSl9Yy5zcGxpY2UoQiwxKTtsZXQgQz1iO0I8PWImJihDPWItMSk7bGV0IGs9Y1tDLTFdLHU9Y1tDXTtyZXR1cm4gYy5zcGxpY2UoQywwLHYpLFQmJihrJiYoay5uZXh0U2libGluZz12KSx2LnByZXZpb3VzU2libGluZz1rLHYubmV4dFNpYmxpbmc9dSx1JiYodS5wcmV2aW91c1NpYmxpbmc9dikpLEI9PT1DPy0xOmJ9ZnVuY3Rpb24gYWQodixjLGI9ITEpe2xldCBUPWMuaW5kZXhPZih2KTtpZighKFQ8MCkpe2lmKGIpe2xldCBCPWNbVC0xXSxDPWNbVCsxXTtCJiYoQi5uZXh0U2libGluZz1DKSxDJiYoQy5wcmV2aW91c1NpYmxpbmc9Qil9Yy5zcGxpY2UoVCwxKX19dmFyIFhsPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5kZXB0aD0wO3RoaXMubm9kZUlkPVlnKCksdGhpcy5yZWY9dGhpcy5ub2RlSWQsdGhpcy5jaGlsZHJlbj1bXSx0aGlzLnB1cmVDaGlsZHJlbj1bXSx0aGlzLnBhcmVudE5vZGU9bnVsbCx0aGlzLm5leHRTaWJsaW5nPW51bGwsdGhpcy5wcmV2aW91c1NpYmxpbmc9bnVsbH1kZXN0cm95KCl7bGV0IGM9S3ModGhpcy5kb2NJZCk7YyYmKGRlbGV0ZSB0aGlzLmRvY0lkLGRlbGV0ZSBjLm5vZGVNYXBbdGhpcy5ub2RlSWRdKSx0aGlzLmNoaWxkcmVuLmZvckVhY2goYj0+e2IuZGVzdHJveSgpfSl9fTt2YXIgWGc9e307ZnVuY3Rpb24gc2QodixjKXtpZighSGkoYyl8fCFjLmxlbmd0aClyZXR1cm47Y2xhc3MgYiBleHRlbmRzIHdve31jLmZvckVhY2goVD0+e2IucHJvdG90eXBlW1RdPWZ1bmN0aW9uKC4uLkIpe2xldCBDPWpyKHRoaXMuZG9jSWQpO2lmKEMpcmV0dXJuIEMuc2VuZCgiY29tcG9uZW50Iix7cmVmOnRoaXMucmVmLGNvbXBvbmVudDp2LG1ldGhvZDpUfSxCKX19KSxYZ1t2XT1ifWZ1bmN0aW9uIFFnKHYpe3JldHVybiBYZ1t2XX1mdW5jdGlvbiBGcih2LGMsYixULEIpe3JldHVybnt0eXBlOiJkZWNsIixwcm9wOnYsdmFsdWU6YysoYj8iICFpbXBvcnRhbnQiOiIiKSxyYXdzOlQsc291cmNlOkJ9fXZhciBfUD0iYmFja2dyb3VuZENvbG9yIixiUD0iYmFja2dyb3VuZEltYWdlIix5UD12PT57bGV0e3ZhbHVlOmMsaW1wb3J0YW50OmIscmF3czpULHNvdXJjZTpCfT12O3JldHVybi9eIz9cUyskLy50ZXN0KGMpfHwvXnJnYmE/KC4rKSQvLnRlc3QoYyk/W0ZyKF9QLGMsYixULEIpXTovXmxpbmVhci1ncmFkaWVudCguKykkLy50ZXN0KGMpP1tGcihiUCxjLGIsVCxCKV06W3ZdfSxFUD0iV2lkdGgiLHdQPSJTdHlsZSIsU1A9IkNvbG9yIixidT12PT57bGV0e3Byb3A6Yyx2YWx1ZTpiLGltcG9ydGFudDpULHJhd3M6Qixzb3VyY2U6Q309dixrPWIucmVwbGFjZSgvXHMqLFxzKi9nLCIsIikuc3BsaXQoL1xzKy8pLHU9Wy9eW1xkXC5dK1xTKiQvLC9eKHNvbGlkfGRhc2hlZHxkb3R0ZWQpJC8sL1xTKy9dLm1hcChJPT57bGV0IEdlPWsuZmluZEluZGV4KEF0PT5JLnRlc3QoQXQpKTtyZXR1cm4gR2U8MD9udWxsOmsuc3BsaWNlKEdlLDEpWzBdfSk7cmV0dXJuIGsubGVuZ3RoP1t2XTpbRnIoYytFUCwodVswXXx8IjAiKS50cmltKCksVCxCLEMpLEZyKGMrd1AsKHVbMV18fCJzb2xpZCIpLnRyaW0oKSxULEIsQyksRnIoYytTUCwodVsyXXx8IiMwMDAwMDAiKS50cmltKCksVCxCLEMpXX0sQ1A9ImJvcmRlclRvcCIsQVA9ImJvcmRlclJpZ2h0IixPUD0iYm9yZGVyQm90dG9tIixUUD0iYm9yZGVyTGVmdCIsbGQ9dj0+e2xldHtwcm9wOmMsdmFsdWU6YixpbXBvcnRhbnQ6VCxyYXdzOkIsc291cmNlOkN9PXYsaz1RZihjKS5zcGxpdCgiLSIpWzFdO2s9dGYoayk7bGV0IHU9Yi5yZXBsYWNlKC9ccyosXHMqL2csIiwiKS5zcGxpdCgvXHMrLyk7c3dpdGNoKHUubGVuZ3RoKXtjYXNlIDE6cmV0dXJuW3ZdO2Nhc2UgMjp1LnB1c2godVswXSx1WzFdKTticmVhaztjYXNlIDM6dS5wdXNoKHVbMV0pO2JyZWFrfXJldHVybltGcihDUCtrLHVbMF0sVCxCLEMpLEZyKEFQK2ssdVsxXSxULEIsQyksRnIoT1Arayx1WzJdLFQsQixDKSxGcihUUCtrLHVbM10sVCxCLEMpXX0sSVA9ImJvcmRlclRvcExlZnRSYWRpdXMiLFBQPSJib3JkZXJUb3BSaWdodFJhZGl1cyIsTlA9ImJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzIixrUD0iYm9yZGVyQm90dG9tTGVmdFJhZGl1cyIsUlA9dj0+e2xldHt2YWx1ZTpjLGltcG9ydGFudDpiLHJhd3M6VCxzb3VyY2U6Qn09dixDPWMuc3BsaXQoL1xzKy8pO2lmKGMuaW5jbHVkZXMoIi8iKSlyZXR1cm5bdl07c3dpdGNoKEMubGVuZ3RoKXtjYXNlIDE6cmV0dXJuW3ZdO2Nhc2UgMjpDLnB1c2goQ1swXSxDWzFdKTticmVhaztjYXNlIDM6Qy5wdXNoKENbMV0pO2JyZWFrfXJldHVybltGcihJUCxDWzBdLGIsVCxCKSxGcihQUCxDWzFdLGIsVCxCKSxGcihOUCxDWzJdLGIsVCxCKSxGcihrUCxDWzNdLGIsVCxCKV19LHhQPWxkLEJQPWxkLE1QPSJmbGV4RGlyZWN0aW9uIixEUD0iZmxleFdyYXAiLEZQPXY9PntsZXR7dmFsdWU6YyxpbXBvcnRhbnQ6YixyYXdzOlQsc291cmNlOkJ9PXYsQz1jLnNwbGl0KC9ccysvKSxrPVsvXihjb2x1bW58Y29sdW1uLXJldmVyc2V8cm93fHJvdy1yZXZlcnNlKSQvLC9eKG5vd3JhcHx3cmFwfHdyYXAtcmV2ZXJzZSkkL10ubWFwKHU9PntsZXQgST1DLmZpbmRJbmRleChHZT0+dS50ZXN0KEdlKSk7cmV0dXJuIEk8MD9udWxsOkMuc3BsaWNlKEksMSlbMF19KTtyZXR1cm4gQy5sZW5ndGg/W3ZdOltGcihNUCxrWzBdfHwiY29sdW1uIixiLFQsQiksRnIoRFAsa1sxXXx8Im5vd3JhcCIsYixULEIpXX0sTFA9IlRvcCIsVlA9IlJpZ2h0IiwkUD0iQm90dG9tIixVUD0iTGVmdCIsZXY9dj0+Yz0+e2xldHt2YWx1ZTpiLGltcG9ydGFudDpULHJhd3M6Qixzb3VyY2U6Q309YyxrPWIuc3BsaXQoL1xzKy8pO3N3aXRjaChrLmxlbmd0aCl7Y2FzZSAxOmsucHVzaChrWzBdLGtbMF0sa1swXSk7YnJlYWs7Y2FzZSAyOmsucHVzaChrWzBdLGtbMV0pO2JyZWFrO2Nhc2UgMzprLnB1c2goa1sxXSk7YnJlYWt9cmV0dXJuW0ZyKHYrTFAsa1swXSxULEIsQyksRnIoditWUCxrWzFdLFQsQixDKSxGcih2KyRQLGtbMl0sVCxCLEMpLEZyKHYrVVAsa1szXSxULEIsQyldfSxIUD1ldigibWFyZ2luIiksalA9ZXYoInBhZGRpbmciKSx6UD0idHJhbnNpdGlvblByb3BlcnR5IixXUD0idHJhbnNpdGlvbkR1cmF0aW9uIixHUD0idHJhbnNpdGlvblRpbWluZ0Z1bmN0aW9uIixZUD0idHJhbnNpdGlvbkRlbGF5IixxUD12PT57bGV0IGM9L14oXFMqKT9ccyooXGQqXC4/XGQrKD86bXN8cyk/KT9ccyooXFMqKT9ccyooXGQqXC4/XGQrKD86bXN8cyk/KT8kLyx7dmFsdWU6YixpbXBvcnRhbnQ6VCxyYXdzOkIsc291cmNlOkN9PXYsaz1bXSx1PWIubWF0Y2goYyk7cmV0dXJuIHUmJih1WzFdJiZrLnB1c2goRnIoelAsdVsxXSxULEIsQykpLHVbMl0mJmsucHVzaChGcihXUCx1WzJdLFQsQixDKSksdVszXSYmay5wdXNoKEZyKEdQLHVbM10sVCxCLEMpKSx1WzRdJiZrLnB1c2goRnIoWVAsdVs0XSxULEIsQykpKSxrfSx0dj17dHJhbnNpdGlvbjpxUCxtYXJnaW46SFAscGFkZGluZzpqUCxib3JkZXI6YnUsYmFja2dyb3VuZDp5UH07ZGkodHYse2JvcmRlclRvcDpidSxib3JkZXJSaWdodDpidSxib3JkZXJCb3R0b206YnUsYm9yZGVyTGVmdDpidSxib3JkZXJTdHlsZTp4UCxib3JkZXJXaWR0aDpCUCxib3JkZXJDb2xvcjpsZCxib3JkZXJSYWRpdXM6UlAsZmxleEZsb3c6RlB9KTt2YXIgbnY9U3ltYm9sKCJleHBhbmRlZCIpLHJ2PXtwb3N0Y3NzUGx1Z2luOiJudnVlOmV4cGFuZCIsRGVjbGFyYXRpb24odil7aWYodltudl0pcmV0dXJuO2xldCBjPXR2W3YucHJvcF07aWYoYyl7bGV0IGI9Yyh2KTtiLmxlbmd0aD09PTEmJmJbMF09PT12fHx2LnJlcGxhY2VXaXRoKGIpfXZbbnZdPSEwfX07dmFyIEtQPXJ2LkRlY2xhcmF0aW9uO2Z1bmN0aW9uIGNkKHYsYyl7bGV0IGI9ZGkoe3JlcGxhY2VXaXRoKEIpe1Q9Qn19LEpQKHYsYykpLFQ9W2JdO3JldHVybiBLUChiKSxUfWZ1bmN0aW9uIEpQKHYsYyl7bGV0IGI9YysiIjtyZXR1cm4gYi5pbmNsdWRlcygiIWltcG9ydGFudCIpP3twcm9wOnYsdmFsdWU6Yi5yZXBsYWNlKC9ccyohaW1wb3J0YW50LywiIiksaW1wb3J0YW50OiEwfTp7cHJvcDp2LHZhbHVlOmIsaW1wb3J0YW50OiExfX12YXIgWlA9InZpZXciLFhQPVsiY2xpY2siLCJsb25ncHJlc3MiLCJ0b3VjaHN0YXJ0IiwidG91Y2htb3ZlIiwidG91Y2hlbmQiLCJwYW5zdGFydCIsInBhbm1vdmUiLCJwYW5lbmQiLCJob3Jpem9udGFscGFuIiwidmVydGljYWxwYW4iLCJzd2lwZSJdO2Z1bmN0aW9uIHVkKHYsYyl7bGV0IGI9S3Modik7Yi5ub2RlTWFwW2Mubm9kZUlkXT1jfXZhciBmZDtmdW5jdGlvbiBpdih2KXtmZHx8KGZkPXYpfXZhciB3bz1jbGFzcyBleHRlbmRzIFhse2NvbnN0cnVjdG9yKGM9WlAsYj17fSxUKXtzdXBlcigpO2xldCBCPVFnKGMpO2lmKEImJiFUKXJldHVybiBuZXcgQihjLGIsITApO3RoaXMubm9kZVR5cGU9MSx0aGlzLnR5cGU9Yyx0aGlzLmF0dHI9Yi5hdHRyfHx7fSx0aGlzLnN0eWxlPWIuc3R5bGV8fHt9LHRoaXMuY2xhc3NTdHlsZT1iLmNsYXNzU3R5bGV8fHt9LHRoaXMuY2xhc3NMaXN0PWIuY2xhc3NMaXN0fHxbXSx0aGlzLnN0eWxlU2hlZXQ9Yi5zdHlsZVNoZWV0fHx7fSx0aGlzLmV2ZW50PXt9fWFwcGVuZENoaWxkKGMpe2lmKCEoYy5wYXJlbnROb2RlJiZjLnBhcmVudE5vZGUhPT10aGlzKSl7aWYoYy5wYXJlbnROb2RlKXtpZihYbigiZGVidWciKSYmY28oYFthcHBlbmRDaGlsZF0oJHt0aGlzLmRvY0lkfSwke2MudHlwZX0sJHtjLnJlZn0pIE1vdmUgPCR7Yy50eXBlfT4gdG8gJHt0aGlzLmNoaWxkcmVuLmxlbmd0aH0gb2YgPCR7dGhpcy50eXBlfT4gKCR7dGhpcy5yZWZ9KS5gKSxabChjLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5sZW5ndGgsITApLGMubm9kZVR5cGU9PT0xKXtsZXQgYj1abChjLHRoaXMucHVyZUNoaWxkcmVuLHRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aCksVD1qcih0aGlzLmRvY0lkKTtpZihUJiZiPj0wKXJldHVybiBULnNlbmQoImRvbSIse2FjdGlvbjoibW92ZUVsZW1lbnQifSxbYy5yZWYsdGhpcy5yZWYsYl0pfX1lbHNlIGlmKFhuKCJkZWJ1ZyIpJiZjbyhgW2FwcGVuZENoaWxkXSgke3RoaXMuZG9jSWR9LCR7Yy50eXBlfSwke2MucmVmfSkgQXBwZW5kIDwke2MudHlwZX0+IHRvIDwke3RoaXMudHlwZX0+ICgke3RoaXMucmVmfSkuYCksS2woYyx0aGlzKSxKbChjLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5sZW5ndGgsITApLHRoaXMuZG9jSWQmJnVkKHRoaXMuZG9jSWQsYyksYy5ub2RlVHlwZT09PTEpe0psKGMsdGhpcy5wdXJlQ2hpbGRyZW4sdGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoKTtsZXQgYj1qcih0aGlzLmRvY0lkKTtpZihiKXJldHVybiBiLnNlbmQoImRvbSIse2FjdGlvbjoiYWRkRWxlbWVudCJ9LFt0aGlzLnJlZixjLnRvSlNPTigpLC0xXSl9fX1pbnNlcnRCZWZvcmUoYyxiKXtpZighKGMucGFyZW50Tm9kZSYmYy5wYXJlbnROb2RlIT09dGhpcykmJiEoYz09PWJ8fGMubmV4dFNpYmxpbmcmJmMubmV4dFNpYmxpbmc9PT1iKSl7aWYoYy5wYXJlbnROb2RlKXtpZihabChjLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5pbmRleE9mKGIpLCEwKSxjLm5vZGVUeXBlPT09MSl7bGV0IFQ9aWQoYiksQj1abChjLHRoaXMucHVyZUNoaWxkcmVuLFQ/dGhpcy5wdXJlQ2hpbGRyZW4uaW5kZXhPZihUKTp0aGlzLnB1cmVDaGlsZHJlbi5sZW5ndGgpLEM9anIodGhpcy5kb2NJZCk7aWYoQyYmQj49MClyZXR1cm4gQy5zZW5kKCJkb20iLHthY3Rpb246Im1vdmVFbGVtZW50In0sW2MucmVmLHRoaXMucmVmLEJdKX19ZWxzZSBpZihYbigiZGVidWciKSYmY28oYFtpbnNlcnRCZWZvcmVdKCR7dGhpcy5kb2NJZH0sJHtjLnR5cGV9LCR7Yy5yZWZ9KSBJbnNlcnQgPCR7Yy50eXBlfT4gdG8gPCR7dGhpcy50eXBlfT4gKCR7dGhpcy5yZWZ9KSwgYmVmb3JlICgke2IucmVmfSkuYCksS2woYyx0aGlzKSxKbChjLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5pbmRleE9mKGIpLCEwKSx0aGlzLmRvY0lkJiZ1ZCh0aGlzLmRvY0lkLGMpLGMubm9kZVR5cGU9PT0xKXtsZXQgVD1pZChiKSxCPUpsKGMsdGhpcy5wdXJlQ2hpbGRyZW4sVD90aGlzLnB1cmVDaGlsZHJlbi5pbmRleE9mKFQpOnRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aCksQz1qcih0aGlzLmRvY0lkKTtpZihDKXJldHVybiBDLnNlbmQoImRvbSIse2FjdGlvbjoiYWRkRWxlbWVudCJ9LFt0aGlzLnJlZixjLnRvSlNPTigpLEJdKX19fWluc2VydEFmdGVyKGMsYil7aWYoIShjLnBhcmVudE5vZGUmJmMucGFyZW50Tm9kZSE9PXRoaXMpJiYhKGM9PT1ifHxjLnByZXZpb3VzU2libGluZyYmYy5wcmV2aW91c1NpYmxpbmc9PT1iKSl7aWYoYy5wYXJlbnROb2RlKXtpZihabChjLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5pbmRleE9mKGIpKzEsITApLGMubm9kZVR5cGU9PT0xKXtsZXQgVD1abChjLHRoaXMucHVyZUNoaWxkcmVuLHRoaXMucHVyZUNoaWxkcmVuLmluZGV4T2Yob2QoYikpKzEpLEI9anIodGhpcy5kb2NJZCk7aWYoQiYmVD49MClyZXR1cm4gQi5zZW5kKCJkb20iLHthY3Rpb246Im1vdmVFbGVtZW50In0sW2MucmVmLHRoaXMucmVmLFRdKX19ZWxzZSBpZihYbigiZGVidWciKSYmY28oYFtpbnNlcnRBZnRlcl0oJHt0aGlzLmRvY0lkfSwke2MudHlwZX0sJHtjLnJlZn0pIEluc2VydCA8JHtjLnR5cGV9PiB0byA8JHt0aGlzLnR5cGV9PiAoJHt0aGlzLnJlZn0pLCBhZnRlciAoJHtiLnJlZn0pLmApLEtsKGMsdGhpcyksSmwoYyx0aGlzLmNoaWxkcmVuLHRoaXMuY2hpbGRyZW4uaW5kZXhPZihiKSsxLCEwKSx0aGlzLmRvY0lkJiZ1ZCh0aGlzLmRvY0lkLGMpLGMubm9kZVR5cGU9PT0xKXtsZXQgVD1KbChjLHRoaXMucHVyZUNoaWxkcmVuLHRoaXMucHVyZUNoaWxkcmVuLmluZGV4T2Yob2QoYikpKzEpLEI9anIodGhpcy5kb2NJZCk7aWYoQilyZXR1cm4gQi5zZW5kKCJkb20iLHthY3Rpb246ImFkZEVsZW1lbnQifSxbdGhpcy5yZWYsYy50b0pTT04oKSxUXSl9fX1yZW1vdmVDaGlsZChjLGIpe2lmKGMucGFyZW50Tm9kZSYmKGFkKGMsdGhpcy5jaGlsZHJlbiwhMCksYy5ub2RlVHlwZT09PTEpKXtYbigiZGVidWciKSYmY28oYFtyZW1vdmVDaGlsZF0oJHt0aGlzLmRvY0lkfSwke2MudHlwZX0sJHtjLnJlZn0pIFJlbW92ZSA8JHtjLnR5cGV9PiBmcm9tIDwke3RoaXMudHlwZX0+ICgke3RoaXMucmVmfSkuYCksYWQoYyx0aGlzLnB1cmVDaGlsZHJlbik7bGV0IFQ9anIodGhpcy5kb2NJZCk7VCYmVC5zZW5kKCJkb20iLHthY3Rpb246InJlbW92ZUVsZW1lbnQifSxbYy5yZWZdKX1ifHxjLmRlc3Ryb3koKX1jbGVhcigpe2xldCBjPWpyKHRoaXMuZG9jSWQpO2MmJnRoaXMucHVyZUNoaWxkcmVuLmZvckVhY2goYj0+e2Muc2VuZCgiZG9tIix7YWN0aW9uOiJyZW1vdmVFbGVtZW50In0sW2IucmVmXSl9KSx0aGlzLmNoaWxkcmVuLmZvckVhY2goYj0+e2IuZGVzdHJveSgpfSksdGhpcy5jaGlsZHJlbi5sZW5ndGg9MCx0aGlzLnB1cmVDaGlsZHJlbi5sZW5ndGg9MH1zZXRBdHRyKGMsYixUKXtpZih0aGlzLmF0dHJbY109PT1iJiZUIT09ITEpcmV0dXJuO3RoaXMuYXR0cltjXT1iO2xldCBCPWpyKHRoaXMuZG9jSWQpOyFUJiZCJiZCLnNlbmQoImRvbSIse2FjdGlvbjoidXBkYXRlQXR0cnMifSxbdGhpcy5yZWYse1tjXTpifV0pfXNldEF0dHJzKGMsYil7aWYoX3UoYykpcmV0dXJuO2xldCBUPXt9O2ZvcihsZXQgQiBpbiBjKXRoaXMuYXR0cltCXSE9PWNbQl0mJih0aGlzLmF0dHJbQl09Y1tCXSxUW0JdPWNbQl0pO2lmKCFfdShUKSl7bGV0IEI9anIodGhpcy5kb2NJZCk7IWImJkImJkIuc2VuZCgiZG9tIix7YWN0aW9uOiJ1cGRhdGVBdHRycyJ9LFt0aGlzLnJlZixUXSl9fXNldFN0eWxlKGMsYixUKXtjZChjLGIpLmZvckVhY2goKHtwcm9wOkIsdmFsdWU6Q30pPT57aWYodGhpcy5zdHlsZVtCXT09PUMmJlQhPT0hMSlyZXR1cm47dGhpcy5zdHlsZVtCXT1DO2xldCBrPWpyKHRoaXMuZG9jSWQpOyFUJiZrJiZrLnNlbmQoImRvbSIse2FjdGlvbjoidXBkYXRlU3R5bGUifSxbdGhpcy5yZWYse1tCXTpDfV0pfSl9c2V0U3R5bGVzKGMsYil7aWYoX3UoYykpcmV0dXJuO2xldCBUPXt9O2ZvcihsZXQgQiBpbiBjKWNkKEIsY1tCXSkuZm9yRWFjaCgoe3Byb3A6Qyx2YWx1ZTprfSk9Pnt0aGlzLnN0eWxlW0NdIT09ayYmKHRoaXMuc3R5bGVbQ109ayxUW0NdPWspfSk7aWYoIV91KFQpKXtsZXQgQj1qcih0aGlzLmRvY0lkKTshYiYmQiYmQi5zZW5kKCJkb20iLHthY3Rpb246InVwZGF0ZVN0eWxlIn0sW3RoaXMucmVmLFRdKX19c2V0Q2xhc3NTdHlsZShjKXtmb3IobGV0IFQgaW4gdGhpcy5jbGFzc1N0eWxlKXRoaXMuY2xhc3NTdHlsZVtUXT0iIjtkaSh0aGlzLmNsYXNzU3R5bGUsYyk7bGV0IGI9anIodGhpcy5kb2NJZCk7YiYmYi5zZW5kKCJkb20iLHthY3Rpb246InVwZGF0ZVN0eWxlIn0sW3RoaXMucmVmLHRoaXMudG9TdHlsZSgpXSl9c2V0Q2xhc3NMaXN0KGMpe2MubGVuZ3RoPT09dGhpcy5jbGFzc0xpc3QubGVuZ3RoJiZjLmZpbHRlcihiPT4hdGhpcy5jbGFzc0xpc3QuaW5jbHVkZXMoYikpLmxlbmd0aD09PTB8fCh0aGlzLmNsYXNzTGlzdD1jLHRoaXMucGFyZW50Tm9kZSYmdGhpcy5jYWxjQ2xhc3NMaXN0KCkpfWNhbGNDbGFzc0xpc3QoKXt0aGlzLnNldENsYXNzU3R5bGUoZmQodGhpcykpfXNldFN0eWxlU2hlZXQoYyl7dGhpcy5zdHlsZVNoZWV0PWN9YWRkRXZlbnQoYyxiLFQpe2lmKHRoaXMuZXZlbnR8fCh0aGlzLmV2ZW50PXt9KSwhdGhpcy5ldmVudFtjXSl7WG4oImRlYnVnIikmJmNvKGBbYWRkRXZlbnRdKCR7dGhpcy5kb2NJZH0sJHt0aGlzLnR5cGV9LCR7dGhpcy5yZWZ9KSBBZGQgIiR7Y30iIGV2ZW50IG9uIDwke3RoaXMudHlwZX0+ICgke3RoaXMucmVmfSkuYCksdGhpcy5ldmVudFtjXT17aGFuZGxlcjpiLHBhcmFtczpUfTtsZXQgQj1qcih0aGlzLmRvY0lkKTtCJiZCLnNlbmQoImRvbSIse2FjdGlvbjoiYWRkRXZlbnQifSxbdGhpcy5yZWYsY10pfX1yZW1vdmVFdmVudChjKXtpZih0aGlzLmV2ZW50JiZ0aGlzLmV2ZW50W2NdKXtYbigiZGVidWciKSYmY28oYFtyZW1vdmVFdmVudF0oJHt0aGlzLmRvY0lkfSwke3RoaXMudHlwZX0sJHt0aGlzLnJlZn0pIFJlbW92ZSAiJHtjfSIgZXZlbnQgb24gPCR7dGhpcy50eXBlfT4gKCR7dGhpcy5yZWZ9KS5gKSxkZWxldGUgdGhpcy5ldmVudFtjXTtsZXQgYj1qcih0aGlzLmRvY0lkKTtiJiZiLnNlbmQoImRvbSIse2FjdGlvbjoicmVtb3ZlRXZlbnQifSxbdGhpcy5yZWYsY10pfX1maXJlRXZlbnQoYyxiLFQsQil7bGV0IEM9bnVsbCxrPSExLHU9dGhpcy5ldmVudFtjXTtpZih1JiZiKXtYbigiZGVidWciKSYmY28oYFtmaXJlRXZlbnRdKCR7dGhpcy5kb2NJZH0sJHt0aGlzLnR5cGV9LCR7dGhpcy5yZWZ9KSBGaXJlICIke2N9IiBldmVudCBvbiA8JHt0aGlzLnR5cGV9PiAoJHt0aGlzLnJlZn0pLmApO2xldCBJPXUuaGFuZGxlcjtiLnN0b3BQcm9wYWdhdGlvbj0oKT0+e2s9ITB9LGIucHJldmVudERlZmF1bHQ9KCk9Pnt9O3RyeXtCJiZCLnBhcmFtcz9DPUkuY2FsbCh0aGlzLC4uLkIucGFyYW1zLGIpOkM9SS5jYWxsKHRoaXMsYil9Y2F0Y2goR2Upe3Rocm93IGNvbnNvbGUuZXJyb3IoYFtKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byBpbnZva2UgdGhlIGV2ZW50IGhhbmRsZXIgb2YgIiR7Y30iIG9uICR7dGhpcy50eXBlfSAoJHt0aGlzLnJlZn0pOgogJHtHZS50b1N0cmluZygpfWApLEdlfX1yZXR1cm4hayYmVCYmWFAuaW5kZXhPZihjKSE9PS0xJiZ0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5maXJlRXZlbnQmJihiLmN1cnJlbnRUYXJnZXQ9dGhpcy5wYXJlbnROb2RlLHRoaXMucGFyZW50Tm9kZS5maXJlRXZlbnQoYyxiLFQpKSxDfXRvU3R5bGUoKXtyZXR1cm4gZGkoe30sdGhpcy5jbGFzc1N0eWxlLHRoaXMuc3R5bGUpfXRvSlNPTihjPSExKXtsZXQgYj17cmVmOnRoaXMucmVmLnRvU3RyaW5nKCksdHlwZTp0aGlzLnR5cGUsYXR0cjp0aGlzLmF0dHIsc3R5bGU6dGhpcy50b1N0eWxlKCl9LFQ9W107Zm9yKGxldCBCIGluIHRoaXMuZXZlbnQpe2xldHtwYXJhbXM6Q309dGhpcy5ldmVudFtCXTtDP1QucHVzaCh7dHlwZTpCLHBhcmFtczpDfSk6VC5wdXNoKEIpfXJldHVybiBULmxlbmd0aCYmKGIuZXZlbnQ9VCksIWMmJnRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aCYmKGIuY2hpbGRyZW49dGhpcy5wdXJlQ2hpbGRyZW4ubWFwKEI9PkIudG9KU09OKCkpKSxifXRvU3RyaW5nKCl7cmV0dXJuIjwiK3RoaXMudHlwZSsiIGF0dHI9IitKU09OLnN0cmluZ2lmeSh0aGlzLmF0dHIpKyIgc3R5bGU9IitKU09OLnN0cmluZ2lmeSh0aGlzLnRvU3R5bGUoKSkrIj4iK3RoaXMucHVyZUNoaWxkcmVuLm1hcChjPT5jLnRvU3RyaW5nKCkpLmpvaW4oIiIpKyI8LyIrdGhpcy50eXBlKyI+In19O2Z1bmN0aW9uIG92KHYpe2xldCBjPXYmJnYuX192X3JhdztyZXR1cm4gYz9vdihjKTp2fWZ1bmN0aW9uIGF2KHYpe2xldCBjPW11KHYpO3N3aXRjaChjKXtjYXNlIlVuZGVmaW5lZCI6Y2FzZSJOdWxsIjpyZXR1cm4iIjtjYXNlIlJlZ0V4cCI6cmV0dXJuIHYudG9TdHJpbmcoKTtjYXNlIkRhdGUiOnJldHVybiB2LnRvSVNPU3RyaW5nKCk7Y2FzZSJOdW1iZXIiOmNhc2UiU3RyaW5nIjpjYXNlIkJvb2xlYW4iOmNhc2UiQXJyYXkiOmNhc2UiT2JqZWN0IjpyZXR1cm4gb3Yodik7Y2FzZSJBcnJheUJ1ZmZlciI6cmV0dXJueyJAdHlwZSI6ImJpbmFyeSIsZGF0YVR5cGU6YyxiYXNlNjQ6dGQodil9O2Nhc2UiSW50OEFycmF5IjpjYXNlIlVpbnQ4QXJyYXkiOmNhc2UiVWludDhDbGFtcGVkQXJyYXkiOmNhc2UiSW50MTZBcnJheSI6Y2FzZSJVaW50MTZBcnJheSI6Y2FzZSJJbnQzMkFycmF5IjpjYXNlIlVpbnQzMkFycmF5IjpjYXNlIkZsb2F0MzJBcnJheSI6Y2FzZSJGbG9hdDY0QXJyYXkiOnJldHVybnsiQHR5cGUiOiJiaW5hcnkiLGRhdGFUeXBlOmMsYmFzZTY0OnRkKHYuYnVmZmVyKX07ZGVmYXVsdDpyZXR1cm4gSlNPTi5zdHJpbmdpZnkodil9fXZhciBzZj1mdW5jdGlvbigpe30sTGM9Y2xhc3N7Y29uc3RydWN0b3IoYyxiKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaW5zdGFuY2VJZCIse2VudW1lcmFibGU6ITAsdmFsdWU6U3RyaW5nKGMpfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImNhbGxiYWNrTWFuYWdlciIse2VudW1lcmFibGU6ITAsdmFsdWU6bmV3IG9mKGMpfSksc2Y9Ynx8ZnVuY3Rpb24oKXt9fWNhbGxiYWNrKGMsYixUKXtyZXR1cm4gdGhpcy5jYWxsYmFja01hbmFnZXIuY29uc3VtZShjLGIsVCl9cmVnaXN0ZXJIb29rKGMsYixULEIpe3JldHVybiB0aGlzLmNhbGxiYWNrTWFuYWdlci5yZWdpc3Rlckhvb2soYyxiLFQsQil9dHJpZ2dlckhvb2soYyxiLFQsQil7cmV0dXJuIHRoaXMuY2FsbGJhY2tNYW5hZ2VyLnRyaWdnZXJIb29rKGMsYixULEIpfXVwZGF0ZURhdGEoYyxiLFQpe3RoaXMuc2VuZCgibW9kdWxlIix7bW9kdWxlOiJkb20iLG1ldGhvZDoidXBkYXRlQ29tcG9uZW50RGF0YSJ9LFtjLGIsVF0pfWRlc3Ryb3lDYWxsYmFjaygpe3JldHVybiB0aGlzLmNhbGxiYWNrTWFuYWdlci5jbG9zZSgpfW5vcm1hbGl6ZShjLGI9ITEpe2xldCBUPW11KGMpO2lmKGMmJmMgaW5zdGFuY2VvZiB3bylyZXR1cm4gYy5yZWY7aWYoYyYmYy4kZWwgaW5zdGFuY2VvZiB3bylyZXR1cm4gYy4kZWwucmVmO2lmKFQ9PT0iRnVuY3Rpb24iKXJldHVybiB0aGlzLmNhbGxiYWNrTWFuYWdlci5hZGQoYykudG9TdHJpbmcoKTtpZihiKXtpZihUPT09Ik9iamVjdCIpe2xldCBCPXt9O2ZvcihsZXQgQyBpbiBjKUJbQ109dGhpcy5ub3JtYWxpemUoY1tDXSwhMCk7cmV0dXJuIEJ9aWYoVD09PSJBcnJheSIpcmV0dXJuIGMubWFwKEI9PnRoaXMubm9ybWFsaXplKEIsITApKX1yZXR1cm4gYyYmYy5yZWYmJmNbIltbVmlydHVhbEVsZW1lbnRdXSJdP2MucmVmOmF2KGMpfXNlbmQoYyxiLFQsQil7bGV0e2FjdGlvbjpDLGNvbXBvbmVudDprLHJlZjp1LG1vZHVsZTpJLG1ldGhvZDpHZX09Yjtzd2l0Y2goVD1ULm1hcChBdD0+dGhpcy5ub3JtYWxpemUoQXQsYyE9PSJtb2R1bGUiKSksbXUoQik9PT0iT2JqZWN0IiYmKEI9dGhpcy5ub3JtYWxpemUoQiwhMCkpLGMpe2Nhc2UiZG9tIjpyZXR1cm4gWG4oImRlYnVnIikmJmNvKGBbdGFza10oJHt0aGlzLmluc3RhbmNlSWR9LCR7Y30sJHtDfSkgJHtKU09OLnN0cmluZ2lmeShUKX1gKSx0aGlzW0NdKHRoaXMuaW5zdGFuY2VJZCxUKTtjYXNlImNvbXBvbmVudCI6cmV0dXJuIHRoaXMuY29tcG9uZW50SGFuZGxlcih0aGlzLmluc3RhbmNlSWQsdSxHZSxULGRpKHtjb21wb25lbnQ6a30sQikpO2RlZmF1bHQ6cmV0dXJuIFhuKCJkZWJ1ZyIpJiZjbyhgW3Rhc2tdKCR7dGhpcy5pbnN0YW5jZUlkfSwke0l9LCR7R2V9KSAke0pTT04uc3RyaW5naWZ5KFQpfWApLHRoaXMubW9kdWxlSGFuZGxlcih0aGlzLmluc3RhbmNlSWQsSSxHZSxULEIpfX1jYWxsRE9NKGMsYil7cmV0dXJuIHRoaXNbY10odGhpcy5pbnN0YW5jZUlkLGIpfWNhbGxDb21wb25lbnQoYyxiLFQsQil7cmV0dXJuIHRoaXMuY29tcG9uZW50SGFuZGxlcih0aGlzLmluc3RhbmNlSWQsYyxiLFQsQil9Y2FsbE1vZHVsZShjLGIsVCxCKXtyZXR1cm4gdGhpcy5tb2R1bGVIYW5kbGVyKHRoaXMuaW5zdGFuY2VJZCxjLGIsVCxCKX19O2Z1bmN0aW9uIHN2KCl7bGV0IHY9e2NyZWF0ZUZpbmlzaDpnbG9iYWwuY2FsbENyZWF0ZUZpbmlzaCx1cGRhdGVGaW5pc2g6Z2xvYmFsLmNhbGxVcGRhdGVGaW5pc2gscmVmcmVzaEZpbmlzaDpnbG9iYWwuY2FsbFJlZnJlc2hGaW5pc2gsY3JlYXRlQm9keTpnbG9iYWwuY2FsbENyZWF0ZUJvZHksYWRkRWxlbWVudDpnbG9iYWwuY2FsbEFkZEVsZW1lbnQscmVtb3ZlRWxlbWVudDpnbG9iYWwuY2FsbFJlbW92ZUVsZW1lbnQsbW92ZUVsZW1lbnQ6Z2xvYmFsLmNhbGxNb3ZlRWxlbWVudCx1cGRhdGVBdHRyczpnbG9iYWwuY2FsbFVwZGF0ZUF0dHJzLHVwZGF0ZVN0eWxlOmdsb2JhbC5jYWxsVXBkYXRlU3R5bGUsYWRkRXZlbnQ6Z2xvYmFsLmNhbGxBZGRFdmVudCxyZW1vdmVFdmVudDpnbG9iYWwuY2FsbFJlbW92ZUV2ZW50LF9fdXBkYXRlQ29tcG9uZW50RGF0YTpnbG9iYWwuX191cGRhdGVDb21wb25lbnREYXRhfSxjPUxjLnByb3RvdHlwZTtmb3IobGV0IGIgaW4gdil7bGV0IFQ9dltiXTtjW2JdPVQ/KEIsQyk9PlQoQiwuLi5DKTooQixDKT0+c2YoQixbe21vZHVsZToiZG9tIixtZXRob2Q6YixhcmdzOkN9XSwiLTEiKX1jLmNvbXBvbmVudEhhbmRsZXI9Z2xvYmFsLmNhbGxOYXRpdmVDb21wb25lbnR8fCgoYixULEIsQyxrKT0+c2YoYixbe2NvbXBvbmVudDprLmNvbXBvbmVudCxyZWY6VCxtZXRob2Q6QixhcmdzOkN9XSkpLGMubW9kdWxlSGFuZGxlcj1nbG9iYWwuY2FsbE5hdGl2ZU1vZHVsZXx8KChiLFQsQixDKT0+c2YoYixbe21vZHVsZTpULG1ldGhvZDpCLGFyZ3M6Q31dKSl9ZnVuY3Rpb24gUVAodixjLGIsVCxCLEMpe2xldCBrPXYuZ2V0UmVmKGMpO2lmKGspcmV0dXJuIHYuZmlyZUV2ZW50KGssYixULEIsQyk7aWYoVClyZXR1cm4gVC5fbm9kZUlkPWMsdi5maXJlRXZlbnQodi5nZXRSZWYoIl9kb2N1bWVudEVsZW1lbnQiKSxiLFQsQixDKX1mdW5jdGlvbiBlTih2LGMsYixUKXtyZXR1cm4gdi50YXNrQ2VudGVyLmNhbGxiYWNrKGMsYixUKX1mdW5jdGlvbiB0Tih2LGMsYixULEIpe2lmKCF2fHwhdi50YXNrQ2VudGVyKXJldHVybiBjb25zb2xlLmVycm9yKGBbSlMgRnJhbWV3b3JrXSBDYW4ndCBmaW5kICJkb2N1bWVudCIgb3IgInRhc2tDZW50ZXIiLmApLG51bGw7bGV0IEM9bnVsbDt0cnl7Qz12LnRhc2tDZW50ZXIudHJpZ2dlckhvb2soYyxiLFQsQil9Y2F0Y2goayl7dGhyb3cgY29uc29sZS5lcnJvcihgW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIHRyaWdnZXIgdGhlICIke2J9QCR7VH0iIGhvb2sgb24gJHtjfS5gKSxrfXJldHVybiBDfWZ1bmN0aW9uIGRkKHYsYyl7bGV0IGI9S3Modik7aWYoIWIpcmV0dXJuIG5ldyBFcnJvcihgW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIHJlY2VpdmVUYXNrcywgaW5zdGFuY2UgKCR7dn0pIGlzIG5vdCBhdmFpbGFibGUuYCk7aWYoSGkoYykpcmV0dXJuIGMubWFwKFQ9Pntzd2l0Y2goVC5tZXRob2Qpe2Nhc2UiY2FsbGJhY2siOnJldHVybiBlTihiLC4uLlQuYXJncyk7Y2FzZSJmaXJlRXZlbnRTeW5jIjpjYXNlImZpcmVFdmVudCI6cmV0dXJuIFFQKGIsLi4uVC5hcmdzKTtjYXNlImNvbXBvbmVudEhvb2siOnJldHVybiB0TihiLC4uLlQuYXJncyl9fSl9dmFyIG1sPXt9O2Z1bmN0aW9uIGx2KHY9e30pe2ZvcihsZXQgYyBpbiB2KXFsKG1sLGMpfHwobWxbY109e30pLCEhSGkodltjXSkmJnZbY10uZm9yRWFjaChiPT57amkoYik/bWxbY11bYl09ITA6RmMoYikmJmppKGIubmFtZSkmJihtbFtjXVtiLm5hbWVdPWIuYXJnc3x8W10pfSl9ZnVuY3Rpb24gbGYodixjKXtyZXR1cm4gamkoYyk/ISEobWxbdl0mJm1sW3ZdW2NdKTohIW1sW3ZdfWZ1bmN0aW9uIGN2KHYpe3JldHVybiBtbFt2XX12YXIgaGQ9e307ZnVuY3Rpb24gdXYodil7IUhpKHYpfHx2LmZvckVhY2goYz0+eyFjfHwoamkoYyk/aGRbY109ITA6RmMoYykmJmppKGMudHlwZSkmJihoZFtjLnR5cGVdPWMsc2QoYy50eXBlLGMubWV0aG9kcykpKX0pfWZ1bmN0aW9uIHBkKHYpe3JldHVybiEhaGRbdl19dmFyIF9sPVtdO2Z1bmN0aW9uIGNmKHYsYyl7Z2Qodik/Y29uc29sZS53YXJuKGBTZXJ2aWNlICIke3Z9IiBoYXMgYmVlbiByZWdpc3RlcmVkIGFscmVhZHkhYCk6KGM9ZGkoe30sYyksX2wucHVzaCh7bmFtZTp2LG9wdGlvbnM6Y30pKX1mdW5jdGlvbiB1Zih2KXtfbC5zb21lKChjLGIpPT57aWYoYy5uYW1lPT09dilyZXR1cm4gX2wuc3BsaWNlKGIsMSksITB9KX1mdW5jdGlvbiBnZCh2KXtyZXR1cm4gbk4odik+PTB9ZnVuY3Rpb24gbk4odil7cmV0dXJuIF9sLm1hcChjPT5jLm5hbWUpLmluZGV4T2Yodil9ZnVuY3Rpb24gck4odil7cmV0dXJuIGM9PntsZXQgYj1YdSh2LGMpLHtjcmVhdGVBcHA6VH09YjtiLmNyZWF0ZVZ1ZUFwcD1iLmNyZWF0ZUFwcD0oQixDKT0+VChCLEMpLnVzZShpTixjKSxjLlZ1ZT1ifX12YXIgaU49e2luc3RhbGwodixjKXtvTih2LGMpLGd1KGMpLmluaXRBcHAodil9fTtmdW5jdGlvbiBvTih2LGMpe2xldHttb3VudDpifT12O3YubW91bnQ9VD0+e2xldCBCPWIoVCk7cmV0dXJuIFQ9PT0iI2FwcCImJmMuX19yZWdpc3RlckFwcChCKSxCfX1mdW5jdGlvbiBhTih2KXtsZXR7VW5pU2hhcmVkOmMsVnVlU2hhcmVkOmIsVnVlUmVhY3Rpdml0eTpUfT12O3ZhciBCPWZ1bmN0aW9uKEMsayx1LEkpeyJ1c2Ugc3RyaWN0Ijt2YXIgR2U9W107ZnVuY3Rpb24gQXQoaSl7R2UucHVzaChpKX1mdW5jdGlvbiB0bigpe0dlLnBvcCgpfWZ1bmN0aW9uIEEoaSl7SS5wYXVzZVRyYWNraW5nKCk7Zm9yKHZhciBhPUdlLmxlbmd0aD9HZVtHZS5sZW5ndGgtMV0uY29tcG9uZW50Om51bGwsZj1hJiZhLmFwcENvbnRleHQuY29uZmlnLndhcm5IYW5kbGVyLHA9c2UoKSx3PWFyZ3VtZW50cy5sZW5ndGgsRT1uZXcgQXJyYXkodz4xP3ctMTowKSxOPTE7Tjx3O04rKylFW04tMV09YXJndW1lbnRzW05dO2lmKGYpaG4oZixhLDExLFtpK0Uuam9pbigiIiksYSYmYS5wcm94eSxwLm1hcChSPT57dmFye3Zub2RlOkt9PVI7cmV0dXJuImF0IDwiLmNvbmNhdChWcyhhLEsudHlwZSksIj4iKX0pLmpvaW4oYApgKSxwXSk7ZWxzZXt2YXIgTD1bIltWdWUgd2Fybl06ICIuY29uY2F0KGkpLC4uLkVdO3AubGVuZ3RoJiZMLnB1c2goYApgLC4uLkVuKHApKSxjb25zb2xlLndhcm4oLi4uTCl9SS5yZXNldFRyYWNraW5nKCl9ZnVuY3Rpb24gc2UoKXt2YXIgaT1HZVtHZS5sZW5ndGgtMV07aWYoIWkpcmV0dXJuW107Zm9yKHZhciBhPVtdO2k7KXt2YXIgZj1hWzBdO2YmJmYudm5vZGU9PT1pP2YucmVjdXJzZUNvdW50Kys6YS5wdXNoKHt2bm9kZTppLHJlY3Vyc2VDb3VudDowfSk7dmFyIHA9aS5jb21wb25lbnQmJmkuY29tcG9uZW50LnBhcmVudDtpPXAmJnAudm5vZGV9cmV0dXJuIGF9ZnVuY3Rpb24gRW4oaSl7dmFyIGE9W107cmV0dXJuIGkuZm9yRWFjaCgoZixwKT0+e2EucHVzaCguLi5wPT09MD9bXTpbYApgXSwuLi5HbihmKSl9KSxhfWZ1bmN0aW9uIEduKGkpe3Zhcnt2bm9kZTphLHJlY3Vyc2VDb3VudDpmfT1pLHA9Zj4wPyIuLi4gKCIuY29uY2F0KGYsIiByZWN1cnNpdmUgY2FsbHMpIik6IiIsdz1hLmNvbXBvbmVudD9hLmNvbXBvbmVudC5wYXJlbnQ9PW51bGw6ITEsRT0iIGF0IDwiLmNvbmNhdChWcyhhLmNvbXBvbmVudCxhLnR5cGUsdykpLE49Ij4iK3A7cmV0dXJuIGEucHJvcHM/W0UsLi4uYnQoYS5wcm9wcyksTl06W0UrTl19ZnVuY3Rpb24gYnQoaSl7dmFyIGE9W10sZj1PYmplY3Qua2V5cyhpKTtyZXR1cm4gZi5zbGljZSgwLDMpLmZvckVhY2gocD0+e2EucHVzaCguLi5RKHAsaVtwXSkpfSksZi5sZW5ndGg+MyYmYS5wdXNoKCIgLi4uIiksYX1mdW5jdGlvbiBRKGksYSxmKXtyZXR1cm4gdS5pc1N0cmluZyhhKT8oYT1KU09OLnN0cmluZ2lmeShhKSxmP2E6WyIiLmNvbmNhdChpLCI9IikuY29uY2F0KGEpXSk6dHlwZW9mIGE9PSJudW1iZXIifHx0eXBlb2YgYT09ImJvb2xlYW4ifHxhPT1udWxsP2Y/YTpbIiIuY29uY2F0KGksIj0iKS5jb25jYXQoYSldOkkuaXNSZWYoYSk/KGE9UShpLEkudG9SYXcoYS52YWx1ZSksITApLGY/YTpbIiIuY29uY2F0KGksIj1SZWY8IiksYSwiPiJdKTp1LmlzRnVuY3Rpb24oYSk/WyIiLmNvbmNhdChpLCI9Zm4iKS5jb25jYXQoYS5uYW1lPyI8Ii5jb25jYXQoYS5uYW1lLCI+Iik6IiIpXTooYT1JLnRvUmF3KGEpLGY/YTpbIiIuY29uY2F0KGksIj0iKSxhXSl9dmFyIGFlPXtzcDoic2VydmVyUHJlZmV0Y2ggaG9vayIsYmM6ImJlZm9yZUNyZWF0ZSBob29rIixjOiJjcmVhdGVkIGhvb2siLGJtOiJiZWZvcmVNb3VudCBob29rIixtOiJtb3VudGVkIGhvb2siLGJ1OiJiZWZvcmVVcGRhdGUgaG9vayIsdToidXBkYXRlZCIsYnVtOiJiZWZvcmVVbm1vdW50IGhvb2siLHVtOiJ1bm1vdW50ZWQgaG9vayIsYToiYWN0aXZhdGVkIGhvb2siLGRhOiJkZWFjdGl2YXRlZCBob29rIixlYzoiZXJyb3JDYXB0dXJlZCBob29rIixydGM6InJlbmRlclRyYWNrZWQgaG9vayIscnRnOiJyZW5kZXJUcmlnZ2VyZWQgaG9vayIsWzBdOiJzZXR1cCBmdW5jdGlvbiIsWzFdOiJyZW5kZXIgZnVuY3Rpb24iLFsyXToid2F0Y2hlciBnZXR0ZXIiLFszXToid2F0Y2hlciBjYWxsYmFjayIsWzRdOiJ3YXRjaGVyIGNsZWFudXAgZnVuY3Rpb24iLFs1XToibmF0aXZlIGV2ZW50IGhhbmRsZXIiLFs2XToiY29tcG9uZW50IGV2ZW50IGhhbmRsZXIiLFs3XToidm5vZGUgaG9vayIsWzhdOiJkaXJlY3RpdmUgaG9vayIsWzldOiJ0cmFuc2l0aW9uIGhvb2siLFsxMF06ImFwcCBlcnJvckhhbmRsZXIiLFsxMV06ImFwcCB3YXJuSGFuZGxlciIsWzEyXToicmVmIGZ1bmN0aW9uIixbMTNdOiJhc3luYyBjb21wb25lbnQgbG9hZGVyIixbMTRdOiJzY2hlZHVsZXIgZmx1c2guIFRoaXMgaXMgbGlrZWx5IGEgVnVlIGludGVybmFscyBidWcuIFBsZWFzZSBvcGVuIGFuIGlzc3VlIGF0IGh0dHBzOi8vbmV3LWlzc3VlLnZ1ZWpzLm9yZy8/cmVwbz12dWVqcy9jb3JlIn07ZnVuY3Rpb24gaG4oaSxhLGYscCl7dmFyIHc7dHJ5e3c9cD9pKC4uLnApOmkoKX1jYXRjaChFKXtWdChFLGEsZil9cmV0dXJuIHd9ZnVuY3Rpb24gRnQoaSxhLGYscCl7aWYodS5pc0Z1bmN0aW9uKGkpKXt2YXIgdz1obihpLGEsZixwKTtyZXR1cm4gdyYmdS5pc1Byb21pc2UodykmJncuY2F0Y2goTD0+e1Z0KEwsYSxmKX0pLHd9Zm9yKHZhciBFPVtdLE49MDtOPGkubGVuZ3RoO04rKylFLnB1c2goRnQoaVtOXSxhLGYscCkpO3JldHVybiBFfWZ1bmN0aW9uIFZ0KGksYSxmKXt2YXIgcD1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106ITAsdz1hP2Eudm5vZGU6bnVsbDtpZihhKXtmb3IodmFyIEU9YS5wYXJlbnQsTj1hLnByb3h5LEw9YWVbZl18fGY7RTspe3ZhciBSPUUuZWM7aWYoUil7Zm9yKHZhciBLPTA7SzxSLmxlbmd0aDtLKyspaWYoUltLXShpLE4sTCk9PT0hMSlyZXR1cm59RT1FLnBhcmVudH12YXIgdWU9YS5hcHBDb250ZXh0LmNvbmZpZy5lcnJvckhhbmRsZXI7aWYodWUpe2huKHVlLG51bGwsMTAsW2ksTixMXSk7cmV0dXJufX16cihpLGYsdyxwKX1mdW5jdGlvbiB6cihpLGEsZil7dmFyIHA9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiEwO3t2YXIgdz1hZVthXXx8YTtmJiZBdChmKSxBKCJVbmhhbmRsZWQgZXJyb3IiLmNvbmNhdCh3PyIgZHVyaW5nIGV4ZWN1dGlvbiBvZiAiLmNvbmNhdCh3KToiIikpLGYmJnRuKCksY29uc29sZS5lcnJvcihpKX19dmFyIGVpPSExLFRyPSExLG1uPVtdLEd0PTAsYW49W10sUG49bnVsbCxVbj0wLGlyPVtdLEZuPW51bGwsQmU9MCxhdD17dGhlbihpKXtzZXRUaW1lb3V0KCgpPT5pKCksMCl9fSx5dD1DLnBsYXRmb3JtPT09ImlPUyIsWnQ9eXQ/YXQ6UHJvbWlzZS5yZXNvbHZlKCksc249bnVsbCxjbj1udWxsLGdyPTEwMDtmdW5jdGlvbiB5cihpKXt2YXIgYT1zbnx8WnQ7cmV0dXJuIGk/YS50aGVuKHRoaXM/aS5iaW5kKHRoaXMpOmkpOmF9ZnVuY3Rpb24gSWkoaSl7Zm9yKHZhciBhPUd0KzEsZj1tbi5sZW5ndGg7YTxmOyl7dmFyIHA9YStmPj4+MSx3PVlpKG1uW3BdKTt3PGk/YT1wKzE6Zj1wfXJldHVybiBhfWZ1bmN0aW9uIFBpKGkpeyghbW4ubGVuZ3RofHwhbW4uaW5jbHVkZXMoaSxlaSYmaS5hbGxvd1JlY3Vyc2U/R3QrMTpHdCkpJiZpIT09Y24mJihpLmlkPT1udWxsP21uLnB1c2goaSk6bW4uc3BsaWNlKElpKGkuaWQpLDAsaSksb3IoKSl9ZnVuY3Rpb24gb3IoKXshZWkmJiFUciYmKFRyPSEwLHNuPVp0LnRoZW4oTHIpKX1mdW5jdGlvbiB6aShpKXt2YXIgYT1tbi5pbmRleE9mKGkpO2E+R3QmJm1uLnNwbGljZShhLDEpfWZ1bmN0aW9uICRvKGksYSxmLHApe3UuaXNBcnJheShpKT9mLnB1c2goLi4uaSk6KCFhfHwhYS5pbmNsdWRlcyhpLGkuYWxsb3dSZWN1cnNlP3ArMTpwKSkmJmYucHVzaChpKSxvcigpfWZ1bmN0aW9uIE5pKGkpeyRvKGksUG4sYW4sVW4pfWZ1bmN0aW9uIFdpKGkpeyRvKGksRm4saXIsQmUpfWZ1bmN0aW9uIEdpKGkpe3ZhciBhPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTpudWxsO2lmKGFuLmxlbmd0aCl7Zm9yKGNuPWEsUG49Wy4uLm5ldyBTZXQoYW4pXSxhbi5sZW5ndGg9MCxpPWl8fG5ldyBNYXAsVW49MDtVbjxQbi5sZW5ndGg7VW4rKylWcihpLFBuW1VuXSl8fFBuW1VuXSgpO1BuPW51bGwsVW49MCxjbj1udWxsLEdpKGksYSl9fWZ1bmN0aW9uIGhpKGkpe2lmKEdpKCksaXIubGVuZ3RoKXt2YXIgYT1bLi4ubmV3IFNldChpcildO2lmKGlyLmxlbmd0aD0wLEZuKXtGbi5wdXNoKC4uLmEpO3JldHVybn1mb3IoRm49YSxpPWl8fG5ldyBNYXAsRm4uc29ydCgoZixwKT0+WWkoZiktWWkocCkpLEJlPTA7QmU8Rm4ubGVuZ3RoO0JlKyspVnIoaSxGbltCZV0pfHxGbltCZV0oKTtGbj1udWxsLEJlPTB9fXZhciBZaT1pPT5pLmlkPT1udWxsPzEvMDppLmlkO2Z1bmN0aW9uIExyKGkpe1RyPSExLGVpPSEwLGk9aXx8bmV3IE1hcCxHaShpKSxtbi5zb3J0KChwLHcpPT5ZaShwKS1ZaSh3KSk7dmFyIGE9cD0+VnIoaSxwKTt0cnl7Zm9yKEd0PTA7R3Q8bW4ubGVuZ3RoO0d0Kyspe3ZhciBmPW1uW0d0XTtpZihmJiZmLmFjdGl2ZSE9PSExKXtpZihhKGYpKWNvbnRpbnVlO2huKGYsbnVsbCwxNCl9fX1maW5hbGx5e0d0PTAsbW4ubGVuZ3RoPTAsaGkoaSksZWk9ITEsc249bnVsbCwobW4ubGVuZ3RofHxhbi5sZW5ndGh8fGlyLmxlbmd0aCkmJkxyKGkpfX1mdW5jdGlvbiBWcihpLGEpe2lmKCFpLmhhcyhhKSlpLnNldChhLDEpO2Vsc2V7dmFyIGY9aS5nZXQoYSk7aWYoZj5ncil7dmFyIHA9YS5vd25lckluc3RhbmNlLHc9cCYmZGEocC50eXBlKTtyZXR1cm4gQSgiTWF4aW11bSByZWN1cnNpdmUgdXBkYXRlcyBleGNlZWRlZCIuY29uY2F0KHc/IiBpbiBjb21wb25lbnQgPCIuY29uY2F0KHcsIj4iKToiIiwiLiAiKSsiVGhpcyBtZWFucyB5b3UgaGF2ZSBhIHJlYWN0aXZlIGVmZmVjdCB0aGF0IGlzIG11dGF0aW5nIGl0cyBvd24gZGVwZW5kZW5jaWVzIGFuZCB0aHVzIHJlY3Vyc2l2ZWx5IHRyaWdnZXJpbmcgaXRzZWxmLiBQb3NzaWJsZSBzb3VyY2VzIGluY2x1ZGUgY29tcG9uZW50IHRlbXBsYXRlLCByZW5kZXIgZnVuY3Rpb24sIHVwZGF0ZWQgaG9vayBvciB3YXRjaGVyIHNvdXJjZSBmdW5jdGlvbi4iKSwhMH1lbHNlIGkuc2V0KGEsZisxKX19dmFyIGFyPSExLElyPW5ldyBTZXQ7dS5nZXRHbG9iYWxUaGlzKCkuX19WVUVfSE1SX1JVTlRJTUVfXz17Y3JlYXRlUmVjb3JkOmdpKHRpKSxyZXJlbmRlcjpnaShwaSkscmVsb2FkOmdpKG5pKX07dmFyIHFpPW5ldyBNYXA7ZnVuY3Rpb24gU28oaSl7dmFyIGE9aS50eXBlLl9faG1ySWQsZj1xaS5nZXQoYSk7Znx8KHRpKGEsaS50eXBlKSxmPXFpLmdldChhKSksZi5pbnN0YW5jZXMuYWRkKGkpfWZ1bmN0aW9uIENvKGkpe3FpLmdldChpLnR5cGUuX19obXJJZCkuaW5zdGFuY2VzLmRlbGV0ZShpKX1mdW5jdGlvbiB0aShpLGEpe3JldHVybiBxaS5oYXMoaSk/ITE6KHFpLnNldChpLHtpbml0aWFsRGVmOlFuKGEpLGluc3RhbmNlczpuZXcgU2V0fSksITApfWZ1bmN0aW9uIFFuKGkpe3JldHVybiB4bChpKT9pLl9fdmNjT3B0czppfWZ1bmN0aW9uIHBpKGksYSl7dmFyIGY9cWkuZ2V0KGkpOyFmfHwoZi5pbml0aWFsRGVmLnJlbmRlcj1hLFsuLi5mLmluc3RhbmNlc10uZm9yRWFjaChwPT57YSYmKHAucmVuZGVyPWEsUW4ocC50eXBlKS5yZW5kZXI9YSkscC5yZW5kZXJDYWNoZT1bXSxhcj0hMCxwLnVwZGF0ZSgpLGFyPSExfSkpfWZ1bmN0aW9uIG5pKGksYSl7dmFyIGY9cWkuZ2V0KGkpO2lmKCEhZil7YT1RbihhKSxzcihmLmluaXRpYWxEZWYsYSk7dmFyIHA9Wy4uLmYuaW5zdGFuY2VzXTtmb3IodmFyIHcgb2YgcCl7dmFyIEU9UW4ody50eXBlKTtJci5oYXMoRSl8fChFIT09Zi5pbml0aWFsRGVmJiZzcihFLGEpLElyLmFkZChFKSksdy5hcHBDb250ZXh0Lm9wdGlvbnNDYWNoZS5kZWxldGUody50eXBlKSx3LmNlUmVsb2FkPyhJci5hZGQoRSksdy5jZVJlbG9hZChhLnN0eWxlcyksSXIuZGVsZXRlKEUpKTp3LnBhcmVudD8oUGkody5wYXJlbnQudXBkYXRlKSx3LnBhcmVudC50eXBlLl9fYXN5bmNMb2FkZXImJncucGFyZW50LmNlUmVsb2FkJiZ3LnBhcmVudC5jZVJlbG9hZChhLnN0eWxlcykpOncuYXBwQ29udGV4dC5yZWxvYWQ/dy5hcHBDb250ZXh0LnJlbG9hZCgpOnR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiP3dpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTpjb25zb2xlLndhcm4oIltITVJdIFJvb3Qgb3IgbWFudWFsbHkgbW91bnRlZCBpbnN0YW5jZSBtb2RpZmllZC4gRnVsbCByZWxvYWQgcmVxdWlyZWQuIil9V2koKCk9Pntmb3IodmFyIE4gb2YgcClJci5kZWxldGUoUW4oTi50eXBlKSl9KX19ZnVuY3Rpb24gc3IoaSxhKXt1LmV4dGVuZChpLGEpO2Zvcih2YXIgZiBpbiBpKWYhPT0iX19maWxlIiYmIShmIGluIGEpJiZkZWxldGUgaVtmXX1mdW5jdGlvbiBnaShpKXtyZXR1cm4oYSxmKT0+e3RyeXtyZXR1cm4gaShhLGYpfWNhdGNoKHApe2NvbnNvbGUuZXJyb3IocCksY29uc29sZS53YXJuKCJbSE1SXSBTb21ldGhpbmcgd2VudCB3cm9uZyBkdXJpbmcgVnVlIGNvbXBvbmVudCBob3QtcmVsb2FkLiBGdWxsIHJlbG9hZCByZXF1aXJlZC4iKX19fUMuZGV2dG9vbHM9dm9pZCAwO3ZhciB2aT1bXSxtaT0hMTtmdW5jdGlvbiBFcihpKXtmb3IodmFyIGE9YXJndW1lbnRzLmxlbmd0aCxmPW5ldyBBcnJheShhPjE/YS0xOjApLHA9MTtwPGE7cCsrKWZbcC0xXT1hcmd1bWVudHNbcF07Qy5kZXZ0b29scz9DLmRldnRvb2xzLmVtaXQoaSwuLi5mKTptaXx8dmkucHVzaCh7ZXZlbnQ6aSxhcmdzOmZ9KX1mdW5jdGlvbiBQcihpLGEpe3ZhciBmLHA7aWYoQy5kZXZ0b29scz1pLEMuZGV2dG9vbHMpQy5kZXZ0b29scy5lbmFibGVkPSEwLHZpLmZvckVhY2goRT0+e3ZhcntldmVudDpOLGFyZ3M6TH09RTtyZXR1cm4gQy5kZXZ0b29scy5lbWl0KE4sLi4uTCl9KSx2aT1bXTtlbHNlIGlmKHR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiJiZ3aW5kb3cuSFRNTEVsZW1lbnQmJiEoKHA9KGY9d2luZG93Lm5hdmlnYXRvcik9PT1udWxsfHxmPT09dm9pZCAwP3ZvaWQgMDpmLnVzZXJBZ2VudCk9PT1udWxsfHxwPT09dm9pZCAwP3ZvaWQgMDpwLmluY2x1ZGVzKCJqc2RvbSIpKSl7dmFyIHc9YS5fX1ZVRV9ERVZUT09MU19IT09LX1JFUExBWV9fPWEuX19WVUVfREVWVE9PTFNfSE9PS19SRVBMQVlfX3x8W107dy5wdXNoKEU9PntQcihFLGEpfSksc2V0VGltZW91dCgoKT0+e0MuZGV2dG9vbHN8fChhLl9fVlVFX0RFVlRPT0xTX0hPT0tfUkVQTEFZX189bnVsbCxtaT0hMCx2aT1bXSl9LDNlMyl9ZWxzZSBtaT0hMCx2aT1bXX1mdW5jdGlvbiBXcihpLGEpe0VyKCJhcHA6aW5pdCIsaSxhLHtGcmFnbWVudDpqdCxUZXh0Oml0LENvbW1lbnQ6Zm4sU3RhdGljOkJyfSl9ZnVuY3Rpb24gR3IoaSl7RXIoImFwcDp1bm1vdW50IixpKX12YXIgZXI9dW8oImNvbXBvbmVudDphZGRlZCIpLEtpPXVvKCJjb21wb25lbnQ6dXBkYXRlZCIpLEppPXVvKCJjb21wb25lbnQ6cmVtb3ZlZCIpO2Z1bmN0aW9uIHVvKGkpe3JldHVybiBhPT57RXIoaSxhLmFwcENvbnRleHQuYXBwLGEudWlkLGEucGFyZW50P2EucGFyZW50LnVpZDp2b2lkIDAsYSl9fXZhciBfaT1VbygicGVyZjpzdGFydCIpLEFvPVVvKCJwZXJmOmVuZCIpO2Z1bmN0aW9uIFVvKGkpe3JldHVybihhLGYscCk9PntFcihpLGEuYXBwQ29udGV4dC5hcHAsYS51aWQsYSxmLHApfX1mdW5jdGlvbiBfYShpLGEsZil7RXIoImNvbXBvbmVudDplbWl0IixpLmFwcENvbnRleHQuYXBwLGksYSxmKX1mdW5jdGlvbiBIbyhpLGEpe2lmKCFpLmlzVW5tb3VudGVkKXtmb3IodmFyIGY9aS52bm9kZS5wcm9wc3x8dS5FTVBUWV9PQkoscD1hcmd1bWVudHMubGVuZ3RoLHc9bmV3IEFycmF5KHA+Mj9wLTI6MCksRT0yO0U8cDtFKyspd1tFLTJdPWFyZ3VtZW50c1tFXTt7dmFye2VtaXRzT3B0aW9uczpOLHByb3BzT3B0aW9uczpbTF19PWk7aWYoTilpZighKGEgaW4gTikpKCFMfHwhKHUudG9IYW5kbGVyS2V5KGEpaW4gTCkpJiZBKCdDb21wb25lbnQgZW1pdHRlZCBldmVudCAiJy5jb25jYXQoYSwnIiBidXQgaXQgaXMgbmVpdGhlciBkZWNsYXJlZCBpbiAnKSsndGhlIGVtaXRzIG9wdGlvbiBub3IgYXMgYW4gIicuY29uY2F0KHUudG9IYW5kbGVyS2V5KGEpLCciIHByb3AuJykpO2Vsc2V7dmFyIFI9TlthXTtpZih1LmlzRnVuY3Rpb24oUikpe3ZhciBLPVIoLi4udyk7S3x8QSgnSW52YWxpZCBldmVudCBhcmd1bWVudHM6IGV2ZW50IHZhbGlkYXRpb24gZmFpbGVkIGZvciBldmVudCAiJy5jb25jYXQoYSwnIi4nKSl9fX12YXIgdWU9dyxvZT1hLnN0YXJ0c1dpdGgoInVwZGF0ZToiKSx0ZT1vZSYmYS5zbGljZSg3KTtpZih0ZSYmdGUgaW4gZil7dmFyIEVlPSIiLmNvbmNhdCh0ZT09PSJtb2RlbFZhbHVlIj8ibW9kZWwiOnRlLCJNb2RpZmllcnMiKSx7bnVtYmVyOkhlLHRyaW06cnR9PWZbRWVdfHx1LkVNUFRZX09CSjtydCYmKHVlPXcubWFwKFplPT5aZS50cmltKCkpKSxIZSYmKHVlPXcubWFwKHUudG9OdW1iZXIpKX1fYShpLGEsdWUpO3t2YXIgZnQ9YS50b0xvd2VyQ2FzZSgpO2Z0IT09YSYmZlt1LnRvSGFuZGxlcktleShmdCldJiZBKCdFdmVudCAiJy5jb25jYXQoZnQsJyIgaXMgZW1pdHRlZCBpbiBjb21wb25lbnQgJykrIiIuY29uY2F0KFZzKGksaS50eXBlKSwnIGJ1dCB0aGUgaGFuZGxlciBpcyByZWdpc3RlcmVkIGZvciAiJykuY29uY2F0KGEsJyIuICcpKyJOb3RlIHRoYXQgSFRNTCBhdHRyaWJ1dGVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlIGFuZCB5b3UgY2Fubm90IHVzZSB2LW9uIHRvIGxpc3RlbiB0byBjYW1lbENhc2UgZXZlbnRzIHdoZW4gdXNpbmcgaW4tRE9NIHRlbXBsYXRlcy4gIisnWW91IHNob3VsZCBwcm9iYWJseSB1c2UgIicuY29uY2F0KHUuaHlwaGVuYXRlKGEpLCciIGluc3RlYWQgb2YgIicpLmNvbmNhdChhLCciLicpKX12YXIgdmUsbGU9Zlt2ZT11LnRvSGFuZGxlcktleShhKV18fGZbdmU9dS50b0hhbmRsZXJLZXkodS5jYW1lbGl6ZShhKSldOyFsZSYmb2UmJihsZT1mW3ZlPXUudG9IYW5kbGVyS2V5KHUuaHlwaGVuYXRlKGEpKV0pLGxlJiZGdChsZSxpLDYsdWUpO3ZhciBtZT1mW3ZlKyJPbmNlIl07aWYobWUpe2lmKCFpLmVtaXR0ZWQpaS5lbWl0dGVkPXt9O2Vsc2UgaWYoaS5lbWl0dGVkW3ZlXSlyZXR1cm47aS5lbWl0dGVkW3ZlXT0hMCxGdChtZSxpLDYsdWUpfX19ZnVuY3Rpb24gWmkoaSxhKXt2YXIgZj1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06ITEscD1hLmVtaXRzQ2FjaGUsdz1wLmdldChpKTtpZih3IT09dm9pZCAwKXJldHVybiB3O3ZhciBFPWkuZW1pdHMsTj17fSxMPSExO2lmKCF1LmlzRnVuY3Rpb24oaSkpe3ZhciBSPUs9Pnt2YXIgdWU9WmkoSyxhLCEwKTt1ZSYmKEw9ITAsdS5leHRlbmQoTix1ZSkpfTshZiYmYS5taXhpbnMubGVuZ3RoJiZhLm1peGlucy5mb3JFYWNoKFIpLGkuZXh0ZW5kcyYmUihpLmV4dGVuZHMpLGkubWl4aW5zJiZpLm1peGlucy5mb3JFYWNoKFIpfXJldHVybiFFJiYhTD8ocC5zZXQoaSxudWxsKSxudWxsKToodS5pc0FycmF5KEUpP0UuZm9yRWFjaChLPT5OW0tdPW51bGwpOnUuZXh0ZW5kKE4sRSkscC5zZXQoaSxOKSxOKX1mdW5jdGlvbiB3bihpLGEpe3JldHVybiFpfHwhdS5pc09uKGEpPyExOihhPWEuc2xpY2UoMikucmVwbGFjZSgvT25jZSQvLCIiKSx1Lmhhc093bihpLGFbMF0udG9Mb3dlckNhc2UoKSthLnNsaWNlKDEpKXx8dS5oYXNPd24oaSx1Lmh5cGhlbmF0ZShhKSl8fHUuaGFzT3duKGksYSkpfXZhciBTbj1udWxsLE5uPW51bGw7ZnVuY3Rpb24gbHIoaSl7dmFyIGE9U247cmV0dXJuIFNuPWksTm49aSYmaS50eXBlLl9fc2NvcGVJZHx8bnVsbCxhfWZ1bmN0aW9uIE9vKGkpe05uPWl9ZnVuY3Rpb24gRHQoKXtObj1udWxsfXZhciBSZT1pPT5YaTtmdW5jdGlvbiBYaShpKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06U247aWYoIWF8fGkuX24pcmV0dXJuIGk7dmFyIGY9ZnVuY3Rpb24oKXtmLl9kJiZlbCgtMSk7dmFyIHA9bHIoYSksdz1pKC4uLmFyZ3VtZW50cyk7cmV0dXJuIGxyKHApLGYuX2QmJmVsKDEpLEtpKGEpLHd9O3JldHVybiBmLl9uPSEwLGYuX2M9ITAsZi5fZD0hMCxmfXZhciByaT0hMTtmdW5jdGlvbiBraSgpe3JpPSEwfWZ1bmN0aW9uIFFpKGkpe3Zhcnt0eXBlOmEsdm5vZGU6Zixwcm94eTpwLHdpdGhQcm94eTp3LHByb3BzOkUscHJvcHNPcHRpb25zOltOXSxzbG90czpMLGF0dHJzOlIsZW1pdDpLLHJlbmRlcjp1ZSxyZW5kZXJDYWNoZTpvZSxkYXRhOnRlLHNldHVwU3RhdGU6RWUsY3R4OkhlLGluaGVyaXRBdHRyczpydH09aSxmdCx2ZSxsZT1scihpKTtyaT0hMTt0cnl7aWYoZi5zaGFwZUZsYWcmNCl7dmFyIG1lPXd8fHA7ZnQ9VG4odWUuY2FsbChtZSxtZSxvZSxFLEVlLHRlLEhlKSksdmU9Un1lbHNle3ZhciBaZT1hO1I9PT1FJiZraSgpLGZ0PVRuKFplLmxlbmd0aD4xP1plKEUse2dldCBhdHRycygpe3JldHVybiBraSgpLFJ9LHNsb3RzOkwsZW1pdDpLfSk6WmUoRSxudWxsKSksdmU9YS5wcm9wcz9SOmlhKFIpfX1jYXRjaChoZSl7cnIubGVuZ3RoPTAsVnQoaGUsaSwxKSxmdD16bihmbil9dmFyIE9lPWZ0LG90PXZvaWQgMDtpZihmdC5wYXRjaEZsYWc+MCYmZnQucGF0Y2hGbGFnJjIwNDgmJihbT2Usb3RdPVJpKGZ0KSksdmUmJnJ0IT09ITEpe3ZhciBkdD1PYmplY3Qua2V5cyh2ZSkse3NoYXBlRmxhZzpZZX09T2U7aWYoZHQubGVuZ3RoKXtpZihZZSYoMXw2KSlOJiZkdC5zb21lKHUuaXNNb2RlbExpc3RlbmVyKSYmKHZlPVRvKHZlLE4pKSxPZT1BaShPZSx2ZSk7ZWxzZSBpZighcmkmJk9lLnR5cGUhPT1mbil7Zm9yKHZhciBPdD1PYmplY3Qua2V5cyhSKSxUdD1bXSx3dD1bXSwkdD0wLHg9T3QubGVuZ3RoOyR0PHg7JHQrKyl7dmFyIFU9T3RbJHRdO3UuaXNPbihVKT91LmlzTW9kZWxMaXN0ZW5lcihVKXx8VHQucHVzaChVWzJdLnRvTG93ZXJDYXNlKCkrVS5zbGljZSgzKSk6d3QucHVzaChVKX13dC5sZW5ndGgmJkEoIkV4dHJhbmVvdXMgbm9uLXByb3BzIGF0dHJpYnV0ZXMgKCIrIiIuY29uY2F0KHd0LmpvaW4oIiwgIiksIikgIikrIndlcmUgcGFzc2VkIHRvIGNvbXBvbmVudCBidXQgY291bGQgbm90IGJlIGF1dG9tYXRpY2FsbHkgaW5oZXJpdGVkIGJlY2F1c2UgY29tcG9uZW50IHJlbmRlcnMgZnJhZ21lbnQgb3IgdGV4dCByb290IG5vZGVzLiIpLFR0Lmxlbmd0aCYmQSgiRXh0cmFuZW91cyBub24tZW1pdHMgZXZlbnQgbGlzdGVuZXJzICgiKyIiLmNvbmNhdChUdC5qb2luKCIsICIpLCIpICIpKyd3ZXJlIHBhc3NlZCB0byBjb21wb25lbnQgYnV0IGNvdWxkIG5vdCBiZSBhdXRvbWF0aWNhbGx5IGluaGVyaXRlZCBiZWNhdXNlIGNvbXBvbmVudCByZW5kZXJzIGZyYWdtZW50IG9yIHRleHQgcm9vdCBub2Rlcy4gSWYgdGhlIGxpc3RlbmVyIGlzIGludGVuZGVkIHRvIGJlIGEgY29tcG9uZW50IGN1c3RvbSBldmVudCBsaXN0ZW5lciBvbmx5LCBkZWNsYXJlIGl0IHVzaW5nIHRoZSAiZW1pdHMiIG9wdGlvbi4nKX19fXJldHVybiBmLmRpcnMmJihYdChPZSl8fEEoIlJ1bnRpbWUgZGlyZWN0aXZlIHVzZWQgb24gY29tcG9uZW50IHdpdGggbm9uLWVsZW1lbnQgcm9vdCBub2RlLiBUaGUgZGlyZWN0aXZlcyB3aWxsIG5vdCBmdW5jdGlvbiBhcyBpbnRlbmRlZC4iKSxPZT1BaShPZSksT2UuZGlycz1PZS5kaXJzP09lLmRpcnMuY29uY2F0KGYuZGlycyk6Zi5kaXJzKSxmLnRyYW5zaXRpb24mJihYdChPZSl8fEEoIkNvbXBvbmVudCBpbnNpZGUgPFRyYW5zaXRpb24+IHJlbmRlcnMgbm9uLWVsZW1lbnQgcm9vdCBub2RlIHRoYXQgY2Fubm90IGJlIGFuaW1hdGVkLiIpLE9lLnRyYW5zaXRpb249Zi50cmFuc2l0aW9uKSxvdD9vdChPZSk6ZnQ9T2UsbHIobGUpLGZ0fXZhciBSaT1pPT57dmFyIGE9aS5jaGlsZHJlbixmPWkuZHluYW1pY0NoaWxkcmVuLHA9WXIoYSk7aWYoIXApcmV0dXJuW2ksdm9pZCAwXTt2YXIgdz1hLmluZGV4T2YocCksRT1mP2YuaW5kZXhPZihwKTotMSxOPUw9PnthW3ddPUwsZiYmKEU+LTE/ZltFXT1MOkwucGF0Y2hGbGFnPjAmJihpLmR5bmFtaWNDaGlsZHJlbj1bLi4uZixMXSkpfTtyZXR1cm5bVG4ocCksTl19O2Z1bmN0aW9uIFlyKGkpe2Zvcih2YXIgYSxmPTA7ZjxpLmxlbmd0aDtmKyspe3ZhciBwPWlbZl07aWYoZnIocCkpe2lmKHAudHlwZSE9PWZufHxwLmNoaWxkcmVuPT09InYtaWYiKXtpZihhKXJldHVybjthPXB9fWVsc2UgcmV0dXJufXJldHVybiBhfXZhciBpYT1pPT57dmFyIGE7Zm9yKHZhciBmIGluIGkpKGY9PT0iY2xhc3MifHxmPT09InN0eWxlInx8dS5pc09uKGYpKSYmKChhfHwoYT17fSkpW2ZdPWlbZl0pO3JldHVybiBhfSxUbz0oaSxhKT0+e3ZhciBmPXt9O2Zvcih2YXIgcCBpbiBpKSghdS5pc01vZGVsTGlzdGVuZXIocCl8fCEocC5zbGljZSg5KWluIGEpKSYmKGZbcF09aVtwXSk7cmV0dXJuIGZ9LFh0PWk9Pmkuc2hhcGVGbGFnJig2fDEpfHxpLnR5cGU9PT1mbjtmdW5jdGlvbiBiYShpLGEsZil7dmFye3Byb3BzOnAsY2hpbGRyZW46dyxjb21wb25lbnQ6RX09aSx7cHJvcHM6TixjaGlsZHJlbjpMLHBhdGNoRmxhZzpSfT1hLEs9RS5lbWl0c09wdGlvbnM7aWYoKHd8fEwpJiZhcnx8YS5kaXJzfHxhLnRyYW5zaXRpb24pcmV0dXJuITA7aWYoZiYmUj49MCl7aWYoUiYxMDI0KXJldHVybiEwO2lmKFImMTYpcmV0dXJuIHA/eGkocCxOLEspOiEhTjtpZihSJjgpZm9yKHZhciB1ZT1hLmR5bmFtaWNQcm9wcyxvZT0wO29lPHVlLmxlbmd0aDtvZSsrKXt2YXIgdGU9dWVbb2VdO2lmKE5bdGVdIT09cFt0ZV0mJiF3bihLLHRlKSlyZXR1cm4hMH19ZWxzZSByZXR1cm4od3x8TCkmJighTHx8IUwuJHN0YWJsZSk/ITA6cD09PU4/ITE6cD9OP3hpKHAsTixLKTohMDohIU47cmV0dXJuITF9ZnVuY3Rpb24geGkoaSxhLGYpe3ZhciBwPU9iamVjdC5rZXlzKGEpO2lmKHAubGVuZ3RoIT09T2JqZWN0LmtleXMoaSkubGVuZ3RoKXJldHVybiEwO2Zvcih2YXIgdz0wO3c8cC5sZW5ndGg7dysrKXt2YXIgRT1wW3ddO2lmKGFbRV0hPT1pW0VdJiYhd24oZixFKSlyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiB1bihpLGEpe2Zvcih2YXJ7dm5vZGU6ZixwYXJlbnQ6cH09aTtwJiZwLnN1YlRyZWU9PT1mOykoZj1wLnZub2RlKS5lbD1hLHA9cC5wYXJlbnR9dmFyIHFyPWk9PmkuX19pc1N1c3BlbnNlLEJpPXtuYW1lOiJTdXNwZW5zZSIsX19pc1N1c3BlbnNlOiEwLHByb2Nlc3MoaSxhLGYscCx3LEUsTixMLFIsSyl7aT09bnVsbD9GYShhLGYscCx3LEUsTixMLFIsSyk6b2EoaSxhLGYscCx3LE4sTCxSLEspfSxoeWRyYXRlOnlhLGNyZWF0ZTphYSxub3JtYWxpemU6TnJ9LFluPUJpO2Z1bmN0aW9uIElvKGksYSl7dmFyIGY9aS5wcm9wcyYmaS5wcm9wc1thXTt1LmlzRnVuY3Rpb24oZikmJmYoKX1mdW5jdGlvbiBGYShpLGEsZixwLHcsRSxOLEwsUil7dmFye3A6SyxvOntjcmVhdGVFbGVtZW50OnVlfX09UixvZT11ZSgiZGl2IixhKSx0ZT1pLnN1c3BlbnNlPWFhKGksdyxwLGEsb2UsZixFLE4sTCxSKTtLKG51bGwsdGUucGVuZGluZ0JyYW5jaD1pLnNzQ29udGVudCxvZSxudWxsLHAsdGUsRSxOKSx0ZS5kZXBzPjA/KElvKGksIm9uUGVuZGluZyIpLElvKGksIm9uRmFsbGJhY2siKSxLKG51bGwsaS5zc0ZhbGxiYWNrLGEsZixwLG51bGwsRSxOKSxjcih0ZSxpLnNzRmFsbGJhY2spKTp0ZS5yZXNvbHZlKCl9ZnVuY3Rpb24gb2EoaSxhLGYscCx3LEUsTixMLFIpe3ZhcntwOkssdW06dWUsbzp7Y3JlYXRlRWxlbWVudDpvZX19PVIsdGU9YS5zdXNwZW5zZT1pLnN1c3BlbnNlO3RlLnZub2RlPWEsYS5lbD1pLmVsO3ZhciBFZT1hLnNzQ29udGVudCxIZT1hLnNzRmFsbGJhY2sse2FjdGl2ZUJyYW5jaDpydCxwZW5kaW5nQnJhbmNoOmZ0LGlzSW5GYWxsYmFjazp2ZSxpc0h5ZHJhdGluZzpsZX09dGU7aWYoZnQpdGUucGVuZGluZ0JyYW5jaD1FZSxzaShFZSxmdCk/KEsoZnQsRWUsdGUuaGlkZGVuQ29udGFpbmVyLG51bGwsdyx0ZSxFLE4sTCksdGUuZGVwczw9MD90ZS5yZXNvbHZlKCk6dmUmJihLKHJ0LEhlLGYscCx3LG51bGwsRSxOLEwpLGNyKHRlLEhlKSkpOih0ZS5wZW5kaW5nSWQrKyxsZT8odGUuaXNIeWRyYXRpbmc9ITEsdGUuYWN0aXZlQnJhbmNoPWZ0KTp1ZShmdCx3LHRlKSx0ZS5kZXBzPTAsdGUuZWZmZWN0cy5sZW5ndGg9MCx0ZS5oaWRkZW5Db250YWluZXI9b2UoImRpdiIsZiksdmU/KEsobnVsbCxFZSx0ZS5oaWRkZW5Db250YWluZXIsbnVsbCx3LHRlLEUsTixMKSx0ZS5kZXBzPD0wP3RlLnJlc29sdmUoKTooSyhydCxIZSxmLHAsdyxudWxsLEUsTixMKSxjcih0ZSxIZSkpKTpydCYmc2koRWUscnQpPyhLKHJ0LEVlLGYscCx3LHRlLEUsTixMKSx0ZS5yZXNvbHZlKCEwKSk6KEsobnVsbCxFZSx0ZS5oaWRkZW5Db250YWluZXIsbnVsbCx3LHRlLEUsTixMKSx0ZS5kZXBzPD0wJiZ0ZS5yZXNvbHZlKCkpKTtlbHNlIGlmKHJ0JiZzaShFZSxydCkpSyhydCxFZSxmLHAsdyx0ZSxFLE4sTCksY3IodGUsRWUpO2Vsc2UgaWYoSW8oYSwib25QZW5kaW5nIiksdGUucGVuZGluZ0JyYW5jaD1FZSx0ZS5wZW5kaW5nSWQrKyxLKG51bGwsRWUsdGUuaGlkZGVuQ29udGFpbmVyLG51bGwsdyx0ZSxFLE4sTCksdGUuZGVwczw9MCl0ZS5yZXNvbHZlKCk7ZWxzZXt2YXJ7dGltZW91dDptZSxwZW5kaW5nSWQ6WmV9PXRlO21lPjA/c2V0VGltZW91dCgoKT0+e3RlLnBlbmRpbmdJZD09PVplJiZ0ZS5mYWxsYmFjayhIZSl9LG1lKTptZT09PTAmJnRlLmZhbGxiYWNrKEhlKX19dmFyIGpvPSExO2Z1bmN0aW9uIGFhKGksYSxmLHAsdyxFLE4sTCxSLEspe3ZhciB1ZT1hcmd1bWVudHMubGVuZ3RoPjEwJiZhcmd1bWVudHNbMTBdIT09dm9pZCAwP2FyZ3VtZW50c1sxMF06ITE7am98fChqbz0hMCxjb25zb2xlW2NvbnNvbGUuaW5mbz8iaW5mbyI6ImxvZyJdKCI8U3VzcGVuc2U+IGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCBpdHMgQVBJIHdpbGwgbGlrZWx5IGNoYW5nZS4iKSk7dmFye3A6b2UsbTp0ZSx1bTpFZSxuOkhlLG86e3BhcmVudE5vZGU6cnQscmVtb3ZlOmZ0fX09Syx2ZT11LnRvTnVtYmVyKGkucHJvcHMmJmkucHJvcHMudGltZW91dCksbGU9e3Zub2RlOmkscGFyZW50OmEscGFyZW50Q29tcG9uZW50OmYsaXNTVkc6Tixjb250YWluZXI6cCxoaWRkZW5Db250YWluZXI6dyxhbmNob3I6RSxkZXBzOjAscGVuZGluZ0lkOjAsdGltZW91dDp0eXBlb2YgdmU9PSJudW1iZXIiP3ZlOi0xLGFjdGl2ZUJyYW5jaDpudWxsLHBlbmRpbmdCcmFuY2g6bnVsbCxpc0luRmFsbGJhY2s6ITAsaXNIeWRyYXRpbmc6dWUsaXNVbm1vdW50ZWQ6ITEsZWZmZWN0czpbXSxyZXNvbHZlKCl7dmFyIG1lPWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dm9pZCAwP2FyZ3VtZW50c1swXTohMTt7aWYoIW1lJiYhbGUucGVuZGluZ0JyYW5jaCl0aHJvdyBuZXcgRXJyb3IoInN1c3BlbnNlLnJlc29sdmUoKSBpcyBjYWxsZWQgd2l0aG91dCBhIHBlbmRpbmcgYnJhbmNoLiIpO2lmKGxlLmlzVW5tb3VudGVkKXRocm93IG5ldyBFcnJvcigic3VzcGVuc2UucmVzb2x2ZSgpIGlzIGNhbGxlZCBvbiBhbiBhbHJlYWR5IHVubW91bnRlZCBzdXNwZW5zZSBib3VuZGFyeS4iKX12YXJ7dm5vZGU6WmUsYWN0aXZlQnJhbmNoOk9lLHBlbmRpbmdCcmFuY2g6b3QscGVuZGluZ0lkOmR0LGVmZmVjdHM6WWUscGFyZW50Q29tcG9uZW50Ok90LGNvbnRhaW5lcjpUdH09bGU7aWYobGUuaXNIeWRyYXRpbmcpbGUuaXNIeWRyYXRpbmc9ITE7ZWxzZSBpZighbWUpe3ZhciB3dD1PZSYmb3QudHJhbnNpdGlvbiYmb3QudHJhbnNpdGlvbi5tb2RlPT09Im91dC1pbiI7d3QmJihPZS50cmFuc2l0aW9uLmFmdGVyTGVhdmU9KCk9PntkdD09PWxlLnBlbmRpbmdJZCYmdGUob3QsVHQsJHQsMCl9KTt2YXJ7YW5jaG9yOiR0fT1sZTtPZSYmKCR0PUhlKE9lKSxFZShPZSxPdCxsZSwhMCkpLHd0fHx0ZShvdCxUdCwkdCwwKX1jcihsZSxvdCksbGUucGVuZGluZ0JyYW5jaD1udWxsLGxlLmlzSW5GYWxsYmFjaz0hMTtmb3IodmFyIHg9bGUucGFyZW50LFU9ITE7eDspe2lmKHgucGVuZGluZ0JyYW5jaCl7eC5lZmZlY3RzLnB1c2goLi4uWWUpLFU9ITA7YnJlYWt9eD14LnBhcmVudH1VfHxXaShZZSksbGUuZWZmZWN0cz1bXSxJbyhaZSwib25SZXNvbHZlIil9LGZhbGxiYWNrKG1lKXtpZighIWxlLnBlbmRpbmdCcmFuY2gpe3Zhcnt2bm9kZTpaZSxhY3RpdmVCcmFuY2g6T2UscGFyZW50Q29tcG9uZW50Om90LGNvbnRhaW5lcjpkdCxpc1NWRzpZZX09bGU7SW8oWmUsIm9uRmFsbGJhY2siKTt2YXIgT3Q9SGUoT2UpLFR0PSgpPT57IWxlLmlzSW5GYWxsYmFja3x8KG9lKG51bGwsbWUsZHQsT3Qsb3QsbnVsbCxZZSxMLFIpLGNyKGxlLG1lKSl9LHd0PW1lLnRyYW5zaXRpb24mJm1lLnRyYW5zaXRpb24ubW9kZT09PSJvdXQtaW4iO3d0JiYoT2UudHJhbnNpdGlvbi5hZnRlckxlYXZlPVR0KSxsZS5pc0luRmFsbGJhY2s9ITAsRWUoT2Usb3QsbnVsbCwhMCksd3R8fFR0KCl9fSxtb3ZlKG1lLFplLE9lKXtsZS5hY3RpdmVCcmFuY2gmJnRlKGxlLmFjdGl2ZUJyYW5jaCxtZSxaZSxPZSksbGUuY29udGFpbmVyPW1lfSxuZXh0KCl7cmV0dXJuIGxlLmFjdGl2ZUJyYW5jaCYmSGUobGUuYWN0aXZlQnJhbmNoKX0scmVnaXN0ZXJEZXAobWUsWmUpe3ZhciBPZT0hIWxlLnBlbmRpbmdCcmFuY2g7T2UmJmxlLmRlcHMrKzt2YXIgb3Q9bWUudm5vZGUuZWw7bWUuYXN5bmNEZXAuY2F0Y2goZHQ9PntWdChkdCxtZSwwKX0pLnRoZW4oZHQ9PntpZighKG1lLmlzVW5tb3VudGVkfHxsZS5pc1VubW91bnRlZHx8bGUucGVuZGluZ0lkIT09bWUuc3VzcGVuc2VJZCkpe21lLmFzeW5jUmVzb2x2ZWQ9ITA7dmFye3Zub2RlOlllfT1tZTtBdChZZSksbnMobWUsZHQsITEpLG90JiYoWWUuZWw9b3QpO3ZhciBPdD0hb3QmJm1lLnN1YlRyZWUuZWw7WmUobWUsWWUscnQob3R8fG1lLnN1YlRyZWUuZWwpLG90P251bGw6SGUobWUuc3ViVHJlZSksbGUsTixSKSxPdCYmZnQoT3QpLHVuKG1lLFllLmVsKSx0bigpLE9lJiYtLWxlLmRlcHM9PT0wJiZsZS5yZXNvbHZlKCl9fSl9LHVubW91bnQobWUsWmUpe2xlLmlzVW5tb3VudGVkPSEwLGxlLmFjdGl2ZUJyYW5jaCYmRWUobGUuYWN0aXZlQnJhbmNoLGYsbWUsWmUpLGxlLnBlbmRpbmdCcmFuY2gmJkVlKGxlLnBlbmRpbmdCcmFuY2gsZixtZSxaZSl9fTtyZXR1cm4gbGV9ZnVuY3Rpb24geWEoaSxhLGYscCx3LEUsTixMLFIpe3ZhciBLPWEuc3VzcGVuc2U9YWEoYSxwLGYsaS5wYXJlbnROb2RlLGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLG51bGwsdyxFLE4sTCwhMCksdWU9UihpLEsucGVuZGluZ0JyYW5jaD1hLnNzQ29udGVudCxmLEssRSxOKTtyZXR1cm4gSy5kZXBzPT09MCYmSy5yZXNvbHZlKCksdWV9ZnVuY3Rpb24gTnIoaSl7dmFye3NoYXBlRmxhZzphLGNoaWxkcmVuOmZ9PWkscD1hJjMyO2kuc3NDb250ZW50PWtyKHA/Zi5kZWZhdWx0OmYpLGkuc3NGYWxsYmFjaz1wP2tyKGYuZmFsbGJhY2spOnpuKGZuKX1mdW5jdGlvbiBrcihpKXt2YXIgYTtpZih1LmlzRnVuY3Rpb24oaSkpe3ZhciBmPUtvJiZpLl9jO2YmJihpLl9kPSExLF9vKCkpLGk9aSgpLGYmJihpLl9kPSEwLGE9TXIsT2EoKSl9aWYodS5pc0FycmF5KGkpKXt2YXIgcD1ZcihpKTtwfHxBKCI8U3VzcGVuc2U+IHNsb3RzIGV4cGVjdCBhIHNpbmdsZSByb290IG5vZGUuIiksaT1wfXJldHVybiBpPVRuKGkpLGEmJiFpLmR5bmFtaWNDaGlsZHJlbiYmKGkuZHluYW1pY0NoaWxkcmVuPWEuZmlsdGVyKHc9PnchPT1pKSksaX1mdW5jdGlvbiBrbihpLGEpe2EmJmEucGVuZGluZ0JyYW5jaD91LmlzQXJyYXkoaSk/YS5lZmZlY3RzLnB1c2goLi4uaSk6YS5lZmZlY3RzLnB1c2goaSk6V2koaSl9ZnVuY3Rpb24gY3IoaSxhKXtpLmFjdGl2ZUJyYW5jaD1hO3Zhcnt2bm9kZTpmLHBhcmVudENvbXBvbmVudDpwfT1pLHc9Zi5lbD1hLmVsO3AmJnAuc3ViVHJlZT09PWYmJihwLnZub2RlLmVsPXcsdW4ocCx3KSl9ZnVuY3Rpb24gdnIoaSxhKXtpZighSW4pQSgicHJvdmlkZSgpIGNhbiBvbmx5IGJlIHVzZWQgaW5zaWRlIHNldHVwKCkuIik7ZWxzZXt2YXIgZj1Jbi5wcm92aWRlcyxwPUluLnBhcmVudCYmSW4ucGFyZW50LnByb3ZpZGVzO3A9PT1mJiYoZj1Jbi5wcm92aWRlcz1PYmplY3QuY3JlYXRlKHApKSxmW2ldPWEsSW4udHlwZS5tcFR5cGU9PT0iYXBwIiYmSW4uYXBwQ29udGV4dC5hcHAucHJvdmlkZShpLGEpfX1mdW5jdGlvbiBlbyhpLGEpe3ZhciBmPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTohMSxwPUlufHxTbjtpZihwKXt2YXIgdz1wLnBhcmVudD09bnVsbD9wLnZub2RlLmFwcENvbnRleHQmJnAudm5vZGUuYXBwQ29udGV4dC5wcm92aWRlczpwLnBhcmVudC5wcm92aWRlcztpZih3JiZpIGluIHcpcmV0dXJuIHdbaV07aWYoYXJndW1lbnRzLmxlbmd0aD4xKXJldHVybiBmJiZ1LmlzRnVuY3Rpb24oYSk/YS5jYWxsKHAucHJveHkpOmE7QSgnaW5qZWN0aW9uICInLmNvbmNhdChTdHJpbmcoaSksJyIgbm90IGZvdW5kLicpKX1lbHNlIEEoImluamVjdCgpIGNhbiBvbmx5IGJlIHVzZWQgaW5zaWRlIHNldHVwKCkgb3IgZnVuY3Rpb25hbCBjb21wb25lbnRzLiIpfWZ1bmN0aW9uIHpvKGksYSl7cmV0dXJuIE1pKGksbnVsbCxhKX1mdW5jdGlvbiBMYShpLGEpe3JldHVybiBNaShpLG51bGwsT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGEpLHtmbHVzaDoicG9zdCJ9KSl9ZnVuY3Rpb24gRWEoaSxhKXtyZXR1cm4gTWkoaSxudWxsLE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxhKSx7Zmx1c2g6InN5bmMifSkpfXZhciB0bz17fTtmdW5jdGlvbiBLcihpLGEsZil7cmV0dXJuIHUuaXNGdW5jdGlvbihhKXx8QSgiYHdhdGNoKGZuLCBvcHRpb25zPylgIHNpZ25hdHVyZSBoYXMgYmVlbiBtb3ZlZCB0byBhIHNlcGFyYXRlIEFQSS4gVXNlIGB3YXRjaEVmZmVjdChmbiwgb3B0aW9ucz8pYCBpbnN0ZWFkLiBgd2F0Y2hgIG5vdyBvbmx5IHN1cHBvcnRzIGB3YXRjaChzb3VyY2UsIGNiLCBvcHRpb25zPykgc2lnbmF0dXJlLiIpLE1pKGksYSxmKX1mdW5jdGlvbiBNaShpLGEpe3ZhcntpbW1lZGlhdGU6ZixkZWVwOnAsZmx1c2g6dyxvblRyYWNrOkUsb25UcmlnZ2VyOk59PWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTp1LkVNUFRZX09CSjthfHwoZiE9PXZvaWQgMCYmQSgnd2F0Y2goKSAiaW1tZWRpYXRlIiBvcHRpb24gaXMgb25seSByZXNwZWN0ZWQgd2hlbiB1c2luZyB0aGUgd2F0Y2goc291cmNlLCBjYWxsYmFjaywgb3B0aW9ucz8pIHNpZ25hdHVyZS4nKSxwIT09dm9pZCAwJiZBKCd3YXRjaCgpICJkZWVwIiBvcHRpb24gaXMgb25seSByZXNwZWN0ZWQgd2hlbiB1c2luZyB0aGUgd2F0Y2goc291cmNlLCBjYWxsYmFjaywgb3B0aW9ucz8pIHNpZ25hdHVyZS4nKSk7dmFyIEw9bWU9PntBKCJJbnZhbGlkIHdhdGNoIHNvdXJjZTogIixtZSwiQSB3YXRjaCBzb3VyY2UgY2FuIG9ubHkgYmUgYSBnZXR0ZXIvZWZmZWN0IGZ1bmN0aW9uLCBhIHJlZiwgYSByZWFjdGl2ZSBvYmplY3QsIG9yIGFuIGFycmF5IG9mIHRoZXNlIHR5cGVzLiIpfSxSPUluLEssdWU9ITEsb2U9ITE7aWYoSS5pc1JlZihpKT8oSz0oKT0+aS52YWx1ZSx1ZT1JLmlzU2hhbGxvdyhpKSk6SS5pc1JlYWN0aXZlKGkpPyhLPSgpPT5pLHA9ITApOnUuaXNBcnJheShpKT8ob2U9ITAsdWU9aS5zb21lKG1lPT5JLmlzUmVhY3RpdmUobWUpfHxJLmlzU2hhbGxvdyhtZSkpLEs9KCk9PmkubWFwKG1lPT57aWYoSS5pc1JlZihtZSkpcmV0dXJuIG1lLnZhbHVlO2lmKEkuaXNSZWFjdGl2ZShtZSkpcmV0dXJuIGJpKG1lKTtpZih1LmlzRnVuY3Rpb24obWUpKXJldHVybiBobihtZSxSLDIpO0wobWUpfSkpOnUuaXNGdW5jdGlvbihpKT9hP0s9KCk9PmhuKGksUiwyKTpLPSgpPT57aWYoIShSJiZSLmlzVW5tb3VudGVkKSlyZXR1cm4gRWUmJkVlKCksRnQoaSxSLDMsW0hlXSl9OihLPXUuTk9PUCxMKGkpKSxhJiZwKXt2YXIgdGU9SztLPSgpPT5iaSh0ZSgpKX12YXIgRWUsSGU9bWU9PntFZT1sZS5vblN0b3A9KCk9PntobihtZSxSLDQpfX07aWYoQy5pc0luU1NSQ29tcG9uZW50U2V0dXApcmV0dXJuIEhlPXUuTk9PUCxhP2YmJkZ0KGEsUiwzLFtLKCksb2U/W106dm9pZCAwLEhlXSk6SygpLHUuTk9PUDt2YXIgcnQ9b2U/W106dG8sZnQ9KCk9PntpZighIWxlLmFjdGl2ZSlpZihhKXt2YXIgbWU9bGUucnVuKCk7KHB8fHVlfHwob2U/bWUuc29tZSgoWmUsT2UpPT51Lmhhc0NoYW5nZWQoWmUscnRbT2VdKSk6dS5oYXNDaGFuZ2VkKG1lLHJ0KSkpJiYoRWUmJkVlKCksRnQoYSxSLDMsW21lLHJ0PT09dG8/dm9pZCAwOnJ0LEhlXSkscnQ9bWUpfWVsc2UgbGUucnVuKCl9O2Z0LmFsbG93UmVjdXJzZT0hIWE7dmFyIHZlO3c9PT0ic3luYyI/dmU9ZnQ6dz09PSJwb3N0Ij92ZT0oKT0+Q3IoZnQsUiYmUi5zdXNwZW5zZSk6dmU9KCk9Pk5pKGZ0KTt2YXIgbGU9bmV3IEkuUmVhY3RpdmVFZmZlY3QoSyx2ZSk7cmV0dXJuIGxlLm9uVHJhY2s9RSxsZS5vblRyaWdnZXI9TixhP2Y/ZnQoKTpydD1sZS5ydW4oKTp3PT09InBvc3QiP0NyKGxlLnJ1bi5iaW5kKGxlKSxSJiZSLnN1c3BlbnNlKTpsZS5ydW4oKSwoKT0+e2xlLnN0b3AoKSxSJiZSLnNjb3BlJiZ1LnJlbW92ZShSLnNjb3BlLmVmZmVjdHMsbGUpfX1mdW5jdGlvbiBXbyhpLGEsZil7dmFyIHA9dGhpcy5wcm94eSx3PXUuaXNTdHJpbmcoaSk/aS5pbmNsdWRlcygiLiIpP2lpKHAsaSk6KCk9PnBbaV06aS5iaW5kKHAscCksRTt1LmlzRnVuY3Rpb24oYSk/RT1hOihFPWEuaGFuZGxlcixmPWEpO3ZhciBOPUluO1pyKHRoaXMpO3ZhciBMPU1pKHcsRS5iaW5kKHApLGYpO3JldHVybiBOP1pyKE4pOmZhKCksTH1mdW5jdGlvbiBpaShpLGEpe3ZhciBmPWEuc3BsaXQoIi4iKTtyZXR1cm4oKT0+e2Zvcih2YXIgcD1pLHc9MDt3PGYubGVuZ3RoJiZwO3crKylwPXBbZlt3XV07cmV0dXJuIHB9fWZ1bmN0aW9uIGJpKGksYSl7aWYoIXUuaXNPYmplY3QoaSl8fGkuX192X3NraXB8fChhPWF8fG5ldyBTZXQsYS5oYXMoaSkpKXJldHVybiBpO2lmKGEuYWRkKGkpLEkuaXNSZWYoaSkpYmkoaS52YWx1ZSxhKTtlbHNlIGlmKHUuaXNBcnJheShpKSlmb3IodmFyIGY9MDtmPGkubGVuZ3RoO2YrKyliaShpW2ZdLGEpO2Vsc2UgaWYodS5pc1NldChpKXx8dS5pc01hcChpKSlpLmZvckVhY2godz0+e2JpKHcsYSl9KTtlbHNlIGlmKHUuaXNQbGFpbk9iamVjdChpKSlmb3IodmFyIHAgaW4gaSliaShpW3BdLGEpO3JldHVybiBpfWZ1bmN0aW9uIHRyKCl7dmFyIGk9e2lzTW91bnRlZDohMSxpc0xlYXZpbmc6ITEsaXNVbm1vdW50aW5nOiExLGxlYXZpbmdWTm9kZXM6bmV3IE1hcH07cmV0dXJuIG5yKCgpPT57aS5pc01vdW50ZWQ9ITB9KSxjYSgoKT0+e2kuaXNVbm1vdW50aW5nPSEwfSksaX12YXIgd3I9W0Z1bmN0aW9uLEFycmF5XSxEPXtuYW1lOiJCYXNlVHJhbnNpdGlvbiIscHJvcHM6e21vZGU6U3RyaW5nLGFwcGVhcjpCb29sZWFuLHBlcnNpc3RlZDpCb29sZWFuLG9uQmVmb3JlRW50ZXI6d3Isb25FbnRlcjp3cixvbkFmdGVyRW50ZXI6d3Isb25FbnRlckNhbmNlbGxlZDp3cixvbkJlZm9yZUxlYXZlOndyLG9uTGVhdmU6d3Isb25BZnRlckxlYXZlOndyLG9uTGVhdmVDYW5jZWxsZWQ6d3Isb25CZWZvcmVBcHBlYXI6d3Isb25BcHBlYXI6d3Isb25BZnRlckFwcGVhcjp3cixvbkFwcGVhckNhbmNlbGxlZDp3cn0sc2V0dXAoaSxhKXt2YXJ7c2xvdHM6Zn09YSxwPWNpKCksdz10cigpLEU7cmV0dXJuKCk9Pnt2YXIgTj1mLmRlZmF1bHQmJmdlKGYuZGVmYXVsdCgpLCEwKTtpZighKCFOfHwhTi5sZW5ndGgpKXt2YXIgTD1OWzBdO2lmKE4ubGVuZ3RoPjEpe3ZhciBSPSExO2Zvcih2YXIgSyBvZiBOKWlmKEsudHlwZSE9PWZuKXtpZihSKXtBKCI8dHJhbnNpdGlvbj4gY2FuIG9ubHkgYmUgdXNlZCBvbiBhIHNpbmdsZSBlbGVtZW50IG9yIGNvbXBvbmVudC4gVXNlIDx0cmFuc2l0aW9uLWdyb3VwPiBmb3IgbGlzdHMuIik7YnJlYWt9TD1LLFI9ITB9fXZhciB1ZT1JLnRvUmF3KGkpLHttb2RlOm9lfT11ZTtpZihvZSYmb2UhPT0iaW4tb3V0IiYmb2UhPT0ib3V0LWluIiYmb2UhPT0iZGVmYXVsdCImJkEoImludmFsaWQgPHRyYW5zaXRpb24+IG1vZGU6ICIuY29uY2F0KG9lKSksdy5pc0xlYXZpbmcpcmV0dXJuIFYoTCk7dmFyIHRlPUooTCk7aWYoIXRlKXJldHVybiBWKEwpO3ZhciBFZT1HKHRlLHVlLHcscCk7Wih0ZSxFZSk7dmFyIEhlPXAuc3ViVHJlZSxydD1IZSYmSihIZSksZnQ9ITEse2dldFRyYW5zaXRpb25LZXk6dmV9PXRlLnR5cGU7aWYodmUpe3ZhciBsZT12ZSgpO0U9PT12b2lkIDA/RT1sZTpsZSE9PUUmJihFPWxlLGZ0PSEwKX1pZihydCYmcnQudHlwZSE9PWZuJiYoIXNpKHRlLHJ0KXx8ZnQpKXt2YXIgbWU9RyhydCx1ZSx3LHApO2lmKFoocnQsbWUpLG9lPT09Im91dC1pbiIpcmV0dXJuIHcuaXNMZWF2aW5nPSEwLG1lLmFmdGVyTGVhdmU9KCk9Pnt3LmlzTGVhdmluZz0hMSxwLnVwZGF0ZSgpfSxWKEwpO29lPT09ImluLW91dCImJnRlLnR5cGUhPT1mbiYmKG1lLmRlbGF5TGVhdmU9KFplLE9lLG90KT0+e3ZhciBkdD1iZSh3LHJ0KTtkdFtTdHJpbmcocnQua2V5KV09cnQsWmUuX2xlYXZlQ2I9KCk9PntPZSgpLFplLl9sZWF2ZUNiPXZvaWQgMCxkZWxldGUgRWUuZGVsYXllZExlYXZlfSxFZS5kZWxheWVkTGVhdmU9b3R9KX1yZXR1cm4gTH19fX0saWU9RDtmdW5jdGlvbiBiZShpLGEpe3ZhcntsZWF2aW5nVk5vZGVzOmZ9PWkscD1mLmdldChhLnR5cGUpO3JldHVybiBwfHwocD1PYmplY3QuY3JlYXRlKG51bGwpLGYuc2V0KGEudHlwZSxwKSkscH1mdW5jdGlvbiBHKGksYSxmLHApe3ZhcnthcHBlYXI6dyxtb2RlOkUscGVyc2lzdGVkOk49ITEsb25CZWZvcmVFbnRlcjpMLG9uRW50ZXI6UixvbkFmdGVyRW50ZXI6SyxvbkVudGVyQ2FuY2VsbGVkOnVlLG9uQmVmb3JlTGVhdmU6b2Usb25MZWF2ZTp0ZSxvbkFmdGVyTGVhdmU6RWUsb25MZWF2ZUNhbmNlbGxlZDpIZSxvbkJlZm9yZUFwcGVhcjpydCxvbkFwcGVhcjpmdCxvbkFmdGVyQXBwZWFyOnZlLG9uQXBwZWFyQ2FuY2VsbGVkOmxlfT1hLG1lPVN0cmluZyhpLmtleSksWmU9YmUoZixpKSxPZT0oWWUsT3QpPT57WWUmJkZ0KFllLHAsOSxPdCl9LG90PShZZSxPdCk9Pnt2YXIgVHQ9T3RbMV07T2UoWWUsT3QpLHUuaXNBcnJheShZZSk/WWUuZXZlcnkod3Q9Pnd0Lmxlbmd0aDw9MSkmJlR0KCk6WWUubGVuZ3RoPD0xJiZUdCgpfSxkdD17bW9kZTpFLHBlcnNpc3RlZDpOLGJlZm9yZUVudGVyKFllKXt2YXIgT3Q9TDtpZighZi5pc01vdW50ZWQpaWYodylPdD1ydHx8TDtlbHNlIHJldHVybjtZZS5fbGVhdmVDYiYmWWUuX2xlYXZlQ2IoITApO3ZhciBUdD1aZVttZV07VHQmJnNpKGksVHQpJiZUdC5lbC5fbGVhdmVDYiYmVHQuZWwuX2xlYXZlQ2IoKSxPZShPdCxbWWVdKX0sZW50ZXIoWWUpe3ZhciBPdD1SLFR0PUssd3Q9dWU7aWYoIWYuaXNNb3VudGVkKWlmKHcpT3Q9ZnR8fFIsVHQ9dmV8fEssd3Q9bGV8fHVlO2Vsc2UgcmV0dXJuO3ZhciAkdD0hMSx4PVllLl9lbnRlckNiPVU9PnskdHx8KCR0PSEwLFU/T2Uod3QsW1llXSk6T2UoVHQsW1llXSksZHQuZGVsYXllZExlYXZlJiZkdC5kZWxheWVkTGVhdmUoKSxZZS5fZW50ZXJDYj12b2lkIDApfTtPdD9vdChPdCxbWWUseF0pOngoKX0sbGVhdmUoWWUsT3Qpe3ZhciBUdD1TdHJpbmcoaS5rZXkpO2lmKFllLl9lbnRlckNiJiZZZS5fZW50ZXJDYighMCksZi5pc1VubW91bnRpbmcpcmV0dXJuIE90KCk7T2Uob2UsW1llXSk7dmFyIHd0PSExLCR0PVllLl9sZWF2ZUNiPXg9Pnt3dHx8KHd0PSEwLE90KCkseD9PZShIZSxbWWVdKTpPZShFZSxbWWVdKSxZZS5fbGVhdmVDYj12b2lkIDAsWmVbVHRdPT09aSYmZGVsZXRlIFplW1R0XSl9O1plW1R0XT1pLHRlP290KHRlLFtZZSwkdF0pOiR0KCl9LGNsb25lKFllKXtyZXR1cm4gRyhZZSxhLGYscCl9fTtyZXR1cm4gZHR9ZnVuY3Rpb24gVihpKXtpZihxbihpKSlyZXR1cm4gaT1BaShpKSxpLmNoaWxkcmVuPW51bGwsaX1mdW5jdGlvbiBKKGkpe3JldHVybiBxbihpKT9pLmNoaWxkcmVuP2kuY2hpbGRyZW5bMF06dm9pZCAwOml9ZnVuY3Rpb24gWihpLGEpe2kuc2hhcGVGbGFnJjYmJmkuY29tcG9uZW50P1ooaS5jb21wb25lbnQuc3ViVHJlZSxhKTppLnNoYXBlRmxhZyYxMjg/KGkuc3NDb250ZW50LnRyYW5zaXRpb249YS5jbG9uZShpLnNzQ29udGVudCksaS5zc0ZhbGxiYWNrLnRyYW5zaXRpb249YS5jbG9uZShpLnNzRmFsbGJhY2spKTppLnRyYW5zaXRpb249YX1mdW5jdGlvbiBnZShpKXtmb3IodmFyIGE9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOiExLGY9YXJndW1lbnRzLmxlbmd0aD4yP2FyZ3VtZW50c1syXTp2b2lkIDAscD1bXSx3PTAsRT0wO0U8aS5sZW5ndGg7RSsrKXt2YXIgTj1pW0VdLEw9Zj09bnVsbD9OLmtleTpTdHJpbmcoZikrU3RyaW5nKE4ua2V5IT1udWxsP04ua2V5OkUpO04udHlwZT09PWp0PyhOLnBhdGNoRmxhZyYxMjgmJncrKyxwPXAuY29uY2F0KGdlKE4uY2hpbGRyZW4sYSxMKSkpOihhfHxOLnR5cGUhPT1mbikmJnAucHVzaChMIT1udWxsP0FpKE4se2tleTpMfSk6Til9aWYodz4xKWZvcih2YXIgUj0wO1I8cC5sZW5ndGg7UisrKXBbUl0ucGF0Y2hGbGFnPS0yO3JldHVybiBwfWZ1bmN0aW9uIHp0KGkpe3JldHVybiB1LmlzRnVuY3Rpb24oaSk/e3NldHVwOmksbmFtZTppLm5hbWV9Oml9dmFyIENuPWk9PiEhaS50eXBlLl9fYXN5bmNMb2FkZXI7ZnVuY3Rpb24gX24oaSl7dS5pc0Z1bmN0aW9uKGkpJiYoaT17bG9hZGVyOml9KTt2YXJ7bG9hZGVyOmEsbG9hZGluZ0NvbXBvbmVudDpmLGVycm9yQ29tcG9uZW50OnAsZGVsYXk6dz0yMDAsdGltZW91dDpFLHN1c3BlbnNpYmxlOk49ITAsb25FcnJvcjpMfT1pLFI9bnVsbCxLLHVlPTAsb2U9KCk9Pih1ZSsrLFI9bnVsbCx0ZSgpKSx0ZT0oKT0+e3ZhciBFZTtyZXR1cm4gUnx8KEVlPVI9YSgpLmNhdGNoKEhlPT57aWYoSGU9SGUgaW5zdGFuY2VvZiBFcnJvcj9IZTpuZXcgRXJyb3IoU3RyaW5nKEhlKSksTClyZXR1cm4gbmV3IFByb21pc2UoKHJ0LGZ0KT0+e3ZhciB2ZT0oKT0+cnQob2UoKSksbGU9KCk9PmZ0KEhlKTtMKEhlLHZlLGxlLHVlKzEpfSk7dGhyb3cgSGV9KS50aGVuKEhlPT57aWYoRWUhPT1SJiZSKXJldHVybiBSO2lmKEhlfHxBKCJBc3luYyBjb21wb25lbnQgbG9hZGVyIHJlc29sdmVkIHRvIHVuZGVmaW5lZC4gSWYgeW91IGFyZSB1c2luZyByZXRyeSgpLCBtYWtlIHN1cmUgdG8gcmV0dXJuIGl0cyByZXR1cm4gdmFsdWUuIiksSGUmJihIZS5fX2VzTW9kdWxlfHxIZVtTeW1ib2wudG9TdHJpbmdUYWddPT09Ik1vZHVsZSIpJiYoSGU9SGUuZGVmYXVsdCksSGUmJiF1LmlzT2JqZWN0KEhlKSYmIXUuaXNGdW5jdGlvbihIZSkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGFzeW5jIGNvbXBvbmVudCBsb2FkIHJlc3VsdDogIi5jb25jYXQoSGUpKTtyZXR1cm4gSz1IZSxIZX0pKX07cmV0dXJuIHp0KHtuYW1lOiJBc3luY0NvbXBvbmVudFdyYXBwZXIiLF9fYXN5bmNMb2FkZXI6dGUsZ2V0IF9fYXN5bmNSZXNvbHZlZCgpe3JldHVybiBLfSxzZXR1cCgpe3ZhciBFZT1JbjtpZihLKXJldHVybigpPT5tcihLLEVlKTt2YXIgSGU9bGU9PntSPW51bGwsVnQobGUsRWUsMTMsIXApfTtpZihOJiZFZS5zdXNwZW5zZXx8Qy5pc0luU1NSQ29tcG9uZW50U2V0dXApcmV0dXJuIHRlKCkudGhlbihsZT0+KCk9Pm1yKGxlLEVlKSkuY2F0Y2gobGU9PihIZShsZSksKCk9PnA/em4ocCx7ZXJyb3I6bGV9KTpudWxsKSk7dmFyIHJ0PUkucmVmKCExKSxmdD1JLnJlZigpLHZlPUkucmVmKCEhdyk7cmV0dXJuIHcmJnNldFRpbWVvdXQoKCk9Pnt2ZS52YWx1ZT0hMX0sdyksRSE9bnVsbCYmc2V0VGltZW91dCgoKT0+e2lmKCFydC52YWx1ZSYmIWZ0LnZhbHVlKXt2YXIgbGU9bmV3IEVycm9yKCJBc3luYyBjb21wb25lbnQgdGltZWQgb3V0IGFmdGVyICIuY29uY2F0KEUsIm1zLiIpKTtIZShsZSksZnQudmFsdWU9bGV9fSxFKSx0ZSgpLnRoZW4oKCk9PntydC52YWx1ZT0hMCxFZS5wYXJlbnQmJnFuKEVlLnBhcmVudC52bm9kZSkmJlBpKEVlLnBhcmVudC51cGRhdGUpfSkuY2F0Y2gobGU9PntIZShsZSksZnQudmFsdWU9bGV9KSwoKT0+e2lmKHJ0LnZhbHVlJiZLKXJldHVybiBtcihLLEVlKTtpZihmdC52YWx1ZSYmcClyZXR1cm4gem4ocCx7ZXJyb3I6ZnQudmFsdWV9KTtpZihmJiYhdmUudmFsdWUpcmV0dXJuIHpuKGYpfX19KX1mdW5jdGlvbiBtcihpLGEpe3Zhcnt2bm9kZTp7cmVmOmYscHJvcHM6cCxjaGlsZHJlbjp3LHNoYXBlRmxhZzpFfSxwYXJlbnQ6Tn09YSxMPXpuKGkscCx3KTtyZXR1cm4gTC5yZWY9ZixMfXZhciBxbj1pPT5pLnR5cGUuX19pc0tlZXBBbGl2ZSxWYT17bmFtZToiS2VlcEFsaXZlIixfX2lzS2VlcEFsaXZlOiEwLHByb3BzOntpbmNsdWRlOltTdHJpbmcsUmVnRXhwLEFycmF5XSxleGNsdWRlOltTdHJpbmcsUmVnRXhwLEFycmF5XSxtYXg6W1N0cmluZyxOdW1iZXJdfSxzZXR1cChpLGEpe3ZhcntzbG90czpmfT1hLHA9Y2koKSx3PXAuY3R4O2lmKCF3LnJlbmRlcmVyKXJldHVybigpPT57dmFyIG1lPWYuZGVmYXVsdCYmZi5kZWZhdWx0KCk7cmV0dXJuIG1lJiZtZS5sZW5ndGg9PT0xP21lWzBdOm1lfTt2YXIgRT1uZXcgTWFwLE49bmV3IFNldCxMPW51bGw7cC5fX3ZfY2FjaGU9RTt2YXIgUj1wLnN1c3BlbnNlLHtyZW5kZXJlcjp7cDpLLG06dWUsdW06b2Usbzp7Y3JlYXRlRWxlbWVudDp0ZX19fT13LEVlPXRlKCJkaXYiLG51bGwpO3cuYWN0aXZhdGU9KG1lLFplLE9lLG90LGR0KT0+e3ZhciBZZT1tZS5jb21wb25lbnQ7dWUobWUsWmUsT2UsMCxSKSxLKFllLnZub2RlLG1lLFplLE9lLFllLFIsb3QsbWUuc2xvdFNjb3BlSWRzLGR0KSxDcigoKT0+e1llLmlzRGVhY3RpdmF0ZWQ9ITEsWWUuYSYmdS5pbnZva2VBcnJheUZucyhZZS5hKTt2YXIgT3Q9bWUucHJvcHMmJm1lLnByb3BzLm9uVm5vZGVNb3VudGVkO090JiZsaShPdCxZZS5wYXJlbnQsbWUpfSxSKSxlcihZZSl9LHcuZGVhY3RpdmF0ZT1tZT0+e3ZhciBaZT1tZS5jb21wb25lbnQ7dWUobWUsRWUsbnVsbCwxLFIpLENyKCgpPT57WmUuZGEmJnUuaW52b2tlQXJyYXlGbnMoWmUuZGEpO3ZhciBPZT1tZS5wcm9wcyYmbWUucHJvcHMub25Wbm9kZVVubW91bnRlZDtPZSYmbGkoT2UsWmUucGFyZW50LG1lKSxaZS5pc0RlYWN0aXZhdGVkPSEwfSxSKSxlcihaZSl9O2Z1bmN0aW9uIEhlKG1lKXtsYShtZSksb2UobWUscCxSLCEwKX1mdW5jdGlvbiBydChtZSl7RS5mb3JFYWNoKChaZSxPZSk9Pnt2YXIgb3Q9ZGEoWmUudHlwZSk7b3QmJighbWV8fCFtZShvdCkpJiZmdChPZSl9KX1mdW5jdGlvbiBmdChtZSl7dmFyIFplPUUuZ2V0KG1lKTshTHx8WmUudHlwZSE9PUwudHlwZT9IZShaZSk6TCYmbGEoTCksRS5kZWxldGUobWUpLE4uZGVsZXRlKG1lKX1LcigoKT0+W2kuaW5jbHVkZSxpLmV4Y2x1ZGVdLG1lPT57dmFyW1plLE9lXT1tZTtaZSYmcnQob3Q9Pk5vKFplLG90KSksT2UmJnJ0KG90PT4hTm8oT2Usb3QpKX0se2ZsdXNoOiJwb3N0IixkZWVwOiEwfSk7dmFyIHZlPW51bGwsbGU9KCk9Pnt2ZSE9bnVsbCYmRS5zZXQodmUsR28ocC5zdWJUcmVlKSl9O3JldHVybiBucihsZSksa28obGUpLGNhKCgpPT57RS5mb3JFYWNoKG1lPT57dmFye3N1YlRyZWU6WmUsc3VzcGVuc2U6T2V9PXAsb3Q9R28oWmUpO2lmKG1lLnR5cGU9PT1vdC50eXBlKXtsYShvdCk7dmFyIGR0PW90LmNvbXBvbmVudC5kYTtkdCYmQ3IoZHQsT2UpO3JldHVybn1IZShtZSl9KX0pLCgpPT57aWYodmU9bnVsbCwhZi5kZWZhdWx0KXJldHVybiBudWxsO3ZhciBtZT1mLmRlZmF1bHQoKSxaZT1tZVswXTtpZihtZS5sZW5ndGg+MSlyZXR1cm4gQSgiS2VlcEFsaXZlIHNob3VsZCBjb250YWluIGV4YWN0bHkgb25lIGNvbXBvbmVudCBjaGlsZC4iKSxMPW51bGwsbWU7aWYoIWZyKFplKXx8IShaZS5zaGFwZUZsYWcmNCkmJiEoWmUuc2hhcGVGbGFnJjEyOCkpcmV0dXJuIEw9bnVsbCxaZTt2YXIgT2U9R28oWmUpLG90PU9lLnR5cGUsZHQ9ZGEoQ24oT2UpP09lLnR5cGUuX19hc3luY1Jlc29sdmVkfHx7fTpvdCkse2luY2x1ZGU6WWUsZXhjbHVkZTpPdCxtYXg6VHR9PWk7aWYoWWUmJighZHR8fCFObyhZZSxkdCkpfHxPdCYmZHQmJk5vKE90LGR0KSlyZXR1cm4gTD1PZSxaZTt2YXIgd3Q9T2Uua2V5PT1udWxsP290Ok9lLmtleSwkdD1FLmdldCh3dCk7cmV0dXJuIE9lLmVsJiYoT2U9QWkoT2UpLFplLnNoYXBlRmxhZyYxMjgmJihaZS5zc0NvbnRlbnQ9T2UpKSx2ZT13dCwkdD8oT2UuZWw9JHQuZWwsT2UuY29tcG9uZW50PSR0LmNvbXBvbmVudCxPZS50cmFuc2l0aW9uJiZaKE9lLE9lLnRyYW5zaXRpb24pLE9lLnNoYXBlRmxhZ3w9NTEyLE4uZGVsZXRlKHd0KSxOLmFkZCh3dCkpOihOLmFkZCh3dCksVHQmJk4uc2l6ZT5wYXJzZUludChUdCwxMCkmJmZ0KE4udmFsdWVzKCkubmV4dCgpLnZhbHVlKSksT2Uuc2hhcGVGbGFnfD0yNTYsTD1PZSxxcihaZS50eXBlKT9aZTpPZX19fSxQbz1WYTtmdW5jdGlvbiBObyhpLGEpe3JldHVybiB1LmlzQXJyYXkoaSk/aS5zb21lKGY9Pk5vKGYsYSkpOnUuaXNTdHJpbmcoaSk/aS5zcGxpdCgiLCIpLmluY2x1ZGVzKGEpOmkudGVzdD9pLnRlc3QoYSk6ITF9ZnVuY3Rpb24gc2EoaSxhKXtVYShpLCJhIixhKX1mdW5jdGlvbiAkYShpLGEpe1VhKGksImRhIixhKX1mdW5jdGlvbiBVYShpLGEpe3ZhciBmPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTpJbixwPWkuX193ZGN8fChpLl9fd2RjPSgpPT57Zm9yKHZhciBFPWY7RTspe2lmKEUuaXNEZWFjdGl2YXRlZClyZXR1cm47RT1FLnBhcmVudH1yZXR1cm4gaSgpfSk7aWYob2koYSxwLGYpLGYpZm9yKHZhciB3PWYucGFyZW50O3cmJncucGFyZW50Oylxbih3LnBhcmVudC52bm9kZSkmJkNzKHAsYSxmLHcpLHc9dy5wYXJlbnR9ZnVuY3Rpb24gQ3MoaSxhLGYscCl7dmFyIHc9b2koYSxpLHAsITApO3hyKCgpPT57dS5yZW1vdmUocFthXSx3KX0sZil9ZnVuY3Rpb24gbGEoaSl7dmFyIGE9aS5zaGFwZUZsYWc7YSYyNTYmJihhLT0yNTYpLGEmNTEyJiYoYS09NTEyKSxpLnNoYXBlRmxhZz1hfWZ1bmN0aW9uIEdvKGkpe3JldHVybiBpLnNoYXBlRmxhZyYxMjg/aS5zc0NvbnRlbnQ6aX1mdW5jdGlvbiBvaShpLGEpe3ZhciBmPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTpJbixwPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTohMTtpZihmKXtpZihrLmlzUm9vdEhvb2soaSkmJmYhPT1mLnJvb3QmJihmPWYucm9vdCxrLmlzUm9vdEltbWVkaWF0ZUhvb2soaSkpKXt2YXIgdz1mLnByb3h5O0Z0KGEuYmluZCh3KSxmLGksay5PTl9MT0FEPT09aT9bdy4kcGFnZS5vcHRpb25zXTpbXSl9dmFye19fcGFnZV9jb250YWluZXJfXzpFfT1mLnJvb3Qudm5vZGU7RSYmRS5vbkluamVjdEhvb2soaSk7dmFyIE49ZltpXXx8KGZbaV09W10pLEw9YS5fX3dlaHx8KGEuX193ZWg9ZnVuY3Rpb24oKXtpZighZi5pc1VubW91bnRlZCl7SS5wYXVzZVRyYWNraW5nKCksWnIoZik7Zm9yKHZhciBLPWFyZ3VtZW50cy5sZW5ndGgsdWU9bmV3IEFycmF5KEspLG9lPTA7b2U8SztvZSsrKXVlW29lXT1hcmd1bWVudHNbb2VdO3ZhciB0ZT1GdChhLGYsaSx1ZSk7cmV0dXJuIGZhKCksSS5yZXNldFRyYWNraW5nKCksdGV9fSk7cmV0dXJuIHA/Ti51bnNoaWZ0KEwpOk4ucHVzaChMKSxMfWVsc2V7dmFyIFI9dS50b0hhbmRsZXJLZXkoKGFlW2ldfHxpLnJlcGxhY2UoL15vbi8sIiIpKS5yZXBsYWNlKC8gaG9vayQvLCIiKSk7QSgiIi5jb25jYXQoUiwiIGlzIGNhbGxlZCB3aGVuIHRoZXJlIGlzIG5vIGFjdGl2ZSBjb21wb25lbnQgaW5zdGFuY2UgdG8gYmUgIikrImFzc29jaWF0ZWQgd2l0aC4gTGlmZWN5Y2xlIGluamVjdGlvbiBBUElzIGNhbiBvbmx5IGJlIHVzZWQgZHVyaW5nIGV4ZWN1dGlvbiBvZiBzZXR1cCgpLiBJZiB5b3UgYXJlIHVzaW5nIGFzeW5jIHNldHVwKCksIG1ha2Ugc3VyZSB0byByZWdpc3RlciBsaWZlY3ljbGUgaG9va3MgYmVmb3JlIHRoZSBmaXJzdCBhd2FpdCBzdGF0ZW1lbnQuIil9fXZhciB5aT1pPT5mdW5jdGlvbihhKXt2YXIgZj1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06SW47cmV0dXJuKCFDLmlzSW5TU1JDb21wb25lbnRTZXR1cHx8aT09PSJzcCIpJiZvaShpLGEsZil9LHdhPXlpKCJibSIpLG5yPXlpKCJtIiksUnI9eWkoImJ1Iiksa289eWkoInUiKSxjYT15aSgiYnVtIikseHI9eWkoInVtIiksQXM9eWkoInNwIiksT3M9eWkoInJ0ZyIpLFRzPXlpKCJydGMiKTtmdW5jdGlvbiBJcyhpKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06SW47b2koImVjIixpLGEpfWZ1bmN0aW9uIFpzKGkpe3UuaXNCdWlsdEluRGlyZWN0aXZlKGkpJiZBKCJEbyBub3QgdXNlIGJ1aWx0LWluIGRpcmVjdGl2ZSBpZHMgYXMgY3VzdG9tIGRpcmVjdGl2ZSBpZDogIitpKX1mdW5jdGlvbiBKcihpLGEpe3ZhciBmPVNuO2lmKGY9PT1udWxsKXJldHVybiBBKCJ3aXRoRGlyZWN0aXZlcyBjYW4gb25seSBiZSB1c2VkIGluc2lkZSByZW5kZXIgZnVuY3Rpb25zLiIpLGk7Zm9yKHZhciBwPUxzKGYpfHxmLnByb3h5LHc9aS5kaXJzfHwoaS5kaXJzPVtdKSxFPTA7RTxhLmxlbmd0aDtFKyspe3ZhcltOLEwsUixLPXUuRU1QVFlfT0JKXT1hW0VdO3UuaXNGdW5jdGlvbihOKSYmKE49e21vdW50ZWQ6Tix1cGRhdGVkOk59KSxOLmRlZXAmJmJpKEwpLHcucHVzaCh7ZGlyOk4saW5zdGFuY2U6cCx2YWx1ZTpMLG9sZFZhbHVlOnZvaWQgMCxhcmc6Uixtb2RpZmllcnM6S30pfXJldHVybiBpfWZ1bmN0aW9uIEVpKGksYSxmLHApe2Zvcih2YXIgdz1pLmRpcnMsRT1hJiZhLmRpcnMsTj0wO048dy5sZW5ndGg7TisrKXt2YXIgTD13W05dO0UmJihMLm9sZFZhbHVlPUVbTl0udmFsdWUpO3ZhciBSPUwuZGlyW3BdO1ImJihJLnBhdXNlVHJhY2tpbmcoKSxGdChSLGYsOCxbaS5lbCxMLGksYV0pLEkucmVzZXRUcmFja2luZygpKX19dmFyIEhuPSJjb21wb25lbnRzIix5bD0iZGlyZWN0aXZlcyI7ZnVuY3Rpb24gSGEoaSxhKXtyZXR1cm4gaG8oSG4saSwhMCxhKXx8aX12YXIgZm89U3ltYm9sKCk7ZnVuY3Rpb24gWHMoaSl7cmV0dXJuIHUuaXNTdHJpbmcoaSk/aG8oSG4saSwhMSl8fGk6aXx8Zm99ZnVuY3Rpb24gUHMoaSl7cmV0dXJuIGhvKHlsLGkpfWZ1bmN0aW9uIGhvKGksYSl7dmFyIGY9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOiEwLHA9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiExLHc9U258fEluO2lmKHcpe3ZhciBFPXcudHlwZTtpZihpPT09SG4pe3ZhciBOPWRhKEUsITEpO2lmKE4mJihOPT09YXx8Tj09PXUuY2FtZWxpemUoYSl8fE49PT11LmNhcGl0YWxpemUodS5jYW1lbGl6ZShhKSkpKXJldHVybiBFfXZhciBMPU5zKHdbaV18fEVbaV0sYSl8fE5zKHcuYXBwQ29udGV4dFtpXSxhKTtpZighTCYmcClyZXR1cm4gRTtpZihmJiYhTCl7dmFyIFI9aT09PUhuP2AKSWYgdGhpcyBpcyBhIG5hdGl2ZSBjdXN0b20gZWxlbWVudCwgbWFrZSBzdXJlIHRvIGV4Y2x1ZGUgaXQgZnJvbSBjb21wb25lbnQgcmVzb2x1dGlvbiB2aWEgY29tcGlsZXJPcHRpb25zLmlzQ3VzdG9tRWxlbWVudC5gOiIiO0EoIkZhaWxlZCB0byByZXNvbHZlICIuY29uY2F0KGkuc2xpY2UoMCwtMSksIjogIikuY29uY2F0KGEpLmNvbmNhdChSKSl9cmV0dXJuIEx9ZWxzZSBBKCJyZXNvbHZlIi5jb25jYXQodS5jYXBpdGFsaXplKGkuc2xpY2UoMCwtMSkpLCIgIikrImNhbiBvbmx5IGJlIHVzZWQgaW4gcmVuZGVyKCkgb3Igc2V0dXAoKS4iKX1mdW5jdGlvbiBOcyhpLGEpe3JldHVybiBpJiYoaVthXXx8aVt1LmNhbWVsaXplKGEpXXx8aVt1LmNhcGl0YWxpemUodS5jYW1lbGl6ZShhKSldKX1mdW5jdGlvbiBTYShpLGEsZixwKXt2YXIgdyxFPWYmJmZbcF07aWYodS5pc0FycmF5KGkpfHx1LmlzU3RyaW5nKGkpKXt3PW5ldyBBcnJheShpLmxlbmd0aCk7Zm9yKHZhciBOPTAsTD1pLmxlbmd0aDtOPEw7TisrKXdbTl09YShpW05dLE4sdm9pZCAwLEUmJkVbTl0pfWVsc2UgaWYodHlwZW9mIGk9PSJudW1iZXIiKXtOdW1iZXIuaXNJbnRlZ2VyKGkpfHxBKCJUaGUgdi1mb3IgcmFuZ2UgZXhwZWN0IGFuIGludGVnZXIgdmFsdWUgYnV0IGdvdCAiLmNvbmNhdChpLCIuIikpLHc9bmV3IEFycmF5KGkpO2Zvcih2YXIgUj0wO1I8aTtSKyspd1tSXT1hKFIrMSxSLHZvaWQgMCxFJiZFW1JdKX1lbHNlIGlmKHUuaXNPYmplY3QoaSkpaWYoaVtTeW1ib2wuaXRlcmF0b3JdKXc9QXJyYXkuZnJvbShpLChFZSxIZSk9PmEoRWUsSGUsdm9pZCAwLEUmJkVbSGVdKSk7ZWxzZXt2YXIgSz1PYmplY3Qua2V5cyhpKTt3PW5ldyBBcnJheShLLmxlbmd0aCk7Zm9yKHZhciB1ZT0wLG9lPUsubGVuZ3RoO3VlPG9lO3VlKyspe3ZhciB0ZT1LW3VlXTt3W3VlXT1hKGlbdGVdLHRlLHVlLEUmJkVbdWVdKX19ZWxzZSB3PVtdO3JldHVybiBmJiYoZltwXT13KSx3fWZ1bmN0aW9uIFJvKGksYSl7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspe3ZhciBwPWFbZl07aWYodS5pc0FycmF5KHApKWZvcih2YXIgdz0wO3c8cC5sZW5ndGg7dysrKWlbcFt3XS5uYW1lXT1wW3ddLmZuO2Vsc2UgcCYmKGlbcC5uYW1lXT1wLmZuKX1yZXR1cm4gaX1mdW5jdGlvbiBrcyhpLGEpe3ZhciBmPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTp7fSxwPWFyZ3VtZW50cy5sZW5ndGg+Mz9hcmd1bWVudHNbM106dm9pZCAwLHc9YXJndW1lbnRzLmxlbmd0aD40P2FyZ3VtZW50c1s0XTp2b2lkIDA7aWYoU24uaXNDRXx8U24ucGFyZW50JiZDbihTbi5wYXJlbnQpJiZTbi5wYXJlbnQuaXNDRSlyZXR1cm4gem4oInNsb3QiLGE9PT0iZGVmYXVsdCI/bnVsbDp7bmFtZTphfSxwJiZwKCkpO3ZhciBFPWlbYV07RSYmRS5sZW5ndGg+MSYmKEEoIlNTUi1vcHRpbWl6ZWQgc2xvdCBmdW5jdGlvbiBkZXRlY3RlZCBpbiBhIG5vbi1TU1Itb3B0aW1pemVkIHJlbmRlciBmdW5jdGlvbi4gWW91IG5lZWQgdG8gbWFyayB0aGlzIGNvbXBvbmVudCB3aXRoICRkeW5hbWljLXNsb3RzIGluIHRoZSBwYXJlbnQgdGVtcGxhdGUuIiksRT0oKT0+W10pLEUmJkUuX2MmJihFLl9kPSExKSxfbygpO3ZhciBOPUUmJmphKEUoZikpLEw9Ym8oanQse2tleTpmLmtleXx8Il8iLmNvbmNhdChhKX0sTnx8KHA/cCgpOltdKSxOJiZpLl89PT0xPzY0Oi0yKTtyZXR1cm4hdyYmTC5zY29wZUlkJiYoTC5zbG90U2NvcGVJZHM9W0wuc2NvcGVJZCsiLXMiXSksRSYmRS5fYyYmKEUuX2Q9ITApLEx9ZnVuY3Rpb24gamEoaSl7cmV0dXJuIGkuc29tZShhPT5mcihhKT8hKGEudHlwZT09PWZufHxhLnR5cGU9PT1qdCYmIWphKGEuY2hpbGRyZW4pKTohMCk/aTpudWxsfWZ1bmN0aW9uIENhKGkpe3ZhciBhPXt9O2lmKCF1LmlzT2JqZWN0KGkpKXJldHVybiBBKCJ2LW9uIHdpdGggbm8gYXJndW1lbnQgZXhwZWN0cyBhbiBvYmplY3QgdmFsdWUuIiksYTtmb3IodmFyIGYgaW4gaSlhW3UudG9IYW5kbGVyS2V5KGYpXT1pW2ZdO3JldHVybiBhfXZhciBubz1pPT5pP0ZvKGkpP0xzKGkpfHxpLnByb3h5Om5vKGkucGFyZW50KTpudWxsLHBvPXUuZXh0ZW5kKE9iamVjdC5jcmVhdGUobnVsbCkseyQ6aT0+aSwkZWw6aT0+aS52bm9kZS5lbCwkZGF0YTppPT5pLmRhdGEsJHByb3BzOmk9Pkkuc2hhbGxvd1JlYWRvbmx5KGkucHJvcHMpLCRhdHRyczppPT5JLnNoYWxsb3dSZWFkb25seShpLmF0dHJzKSwkc2xvdHM6aT0+SS5zaGFsbG93UmVhZG9ubHkoaS5zbG90cyksJHJlZnM6aT0+SS5zaGFsbG93UmVhZG9ubHkoaS5yZWZzKSwkcGFyZW50Omk9Pm5vKGkucGFyZW50KSwkcm9vdDppPT5ubyhpLnJvb3QpLCRlbWl0Omk9PmkuZW1pdCwkb3B0aW9uczppPT5wZShpKSwkZm9yY2VVcGRhdGU6aT0+aS5mfHwoaS5mPSgpPT5QaShpLnVwZGF0ZSkpLCRuZXh0VGljazppPT5pLm58fChpLm49eXIuYmluZChpLnByb3h5KSksJHdhdGNoOmk9PldvLmJpbmQoaSl9KSx1YT1pPT5pPT09Il8ifHxpPT09IiQiLGdvPXtnZXQoaSxhKXt2YXJ7XzpmfT1pLHtjdHg6cCxzZXR1cFN0YXRlOncsZGF0YTpFLHByb3BzOk4sYWNjZXNzQ2FjaGU6TCx0eXBlOlIsYXBwQ29udGV4dDpLfT1mO2lmKGE9PT0iX19pc1Z1ZSIpcmV0dXJuITA7aWYodyE9PXUuRU1QVFlfT0JKJiZ3Ll9faXNTY3JpcHRTZXR1cCYmdS5oYXNPd24odyxhKSlyZXR1cm4gd1thXTt2YXIgdWU7aWYoYVswXSE9PSIkIil7dmFyIG9lPUxbYV07aWYob2UhPT12b2lkIDApc3dpdGNoKG9lKXtjYXNlIDE6cmV0dXJuIHdbYV07Y2FzZSAyOnJldHVybiBFW2FdO2Nhc2UgNDpyZXR1cm4gcFthXTtjYXNlIDM6cmV0dXJuIE5bYV19ZWxzZXtpZih3IT09dS5FTVBUWV9PQkomJnUuaGFzT3duKHcsYSkpcmV0dXJuIExbYV09MSx3W2FdO2lmKEUhPT11LkVNUFRZX09CSiYmdS5oYXNPd24oRSxhKSlyZXR1cm4gTFthXT0yLEVbYV07aWYoKHVlPWYucHJvcHNPcHRpb25zWzBdKSYmdS5oYXNPd24odWUsYSkpcmV0dXJuIExbYV09MyxOW2FdO2lmKHAhPT11LkVNUFRZX09CSiYmdS5oYXNPd24ocCxhKSlyZXR1cm4gTFthXT00LHBbYV07RiYmKExbYV09MCl9fXZhciB0ZT1wb1thXSxFZSxIZTtpZih0ZSlyZXR1cm4gYT09PSIkYXR0cnMiJiYoSS50cmFjayhmLCJnZXQiLGEpLGtpKCkpLHRlKGYpO2lmKChFZT1SLl9fY3NzTW9kdWxlcykmJihFZT1FZVthXSkpcmV0dXJuIEVlO2lmKHAhPT11LkVNUFRZX09CSiYmdS5oYXNPd24ocCxhKSlyZXR1cm4gTFthXT00LHBbYV07aWYoSGU9Sy5jb25maWcuZ2xvYmFsUHJvcGVydGllcyx1Lmhhc093bihIZSxhKSlyZXR1cm4gSGVbYV07U24mJighdS5pc1N0cmluZyhhKXx8YS5pbmRleE9mKCJfX3YiKSE9PTApJiYoRSE9PXUuRU1QVFlfT0JKJiZ1YShhWzBdKSYmdS5oYXNPd24oRSxhKT9BKCJQcm9wZXJ0eSAiLmNvbmNhdChKU09OLnN0cmluZ2lmeShhKSwiIG11c3QgYmUgYWNjZXNzZWQgdmlhICRkYXRhIGJlY2F1c2UgaXQgc3RhcnRzIHdpdGggYSByZXNlcnZlZCAiKSsnY2hhcmFjdGVyICgiJCIgb3IgIl8iKSBhbmQgaXMgbm90IHByb3hpZWQgb24gdGhlIHJlbmRlciBjb250ZXh0LicpOmY9PT1TbiYmQSgiUHJvcGVydHkgIi5jb25jYXQoSlNPTi5zdHJpbmdpZnkoYSksIiB3YXMgYWNjZXNzZWQgZHVyaW5nIHJlbmRlciAiKSsiYnV0IGlzIG5vdCBkZWZpbmVkIG9uIGluc3RhbmNlLiIpKX0sc2V0KGksYSxmKXt2YXJ7XzpwfT1pLHtkYXRhOncsc2V0dXBTdGF0ZTpFLGN0eDpOfT1wO3JldHVybiBFIT09dS5FTVBUWV9PQkomJnUuaGFzT3duKEUsYSk/KEVbYV09ZiwhMCk6dyE9PXUuRU1QVFlfT0JKJiZ1Lmhhc093bih3LGEpPyh3W2FdPWYsITApOnUuaGFzT3duKHAucHJvcHMsYSk/KEEoJ0F0dGVtcHRpbmcgdG8gbXV0YXRlIHByb3AgIicuY29uY2F0KGEsJyIuIFByb3BzIGFyZSByZWFkb25seS4nKSxwKSwhMSk6YVswXT09PSIkIiYmYS5zbGljZSgxKWluIHA/KEEoJ0F0dGVtcHRpbmcgdG8gbXV0YXRlIHB1YmxpYyBwcm9wZXJ0eSAiJy5jb25jYXQoYSwnIi4gJykrIlByb3BlcnRpZXMgc3RhcnRpbmcgd2l0aCAkIGFyZSByZXNlcnZlZCBhbmQgcmVhZG9ubHkuIixwKSwhMSk6KGEgaW4gcC5hcHBDb250ZXh0LmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzP09iamVjdC5kZWZpbmVQcm9wZXJ0eShOLGEse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHZhbHVlOmZ9KTpOW2FdPWYsITApfSxoYXMoaSxhKXt2YXJ7Xzp7ZGF0YTpmLHNldHVwU3RhdGU6cCxhY2Nlc3NDYWNoZTp3LGN0eDpFLGFwcENvbnRleHQ6Tixwcm9wc09wdGlvbnM6TH19PWksUjtyZXR1cm4hIXdbYV18fGYhPT11LkVNUFRZX09CSiYmdS5oYXNPd24oZixhKXx8cCE9PXUuRU1QVFlfT0JKJiZ1Lmhhc093bihwLGEpfHwoUj1MWzBdKSYmdS5oYXNPd24oUixhKXx8dS5oYXNPd24oRSxhKXx8dS5oYXNPd24ocG8sYSl8fHUuaGFzT3duKE4uY29uZmlnLmdsb2JhbFByb3BlcnRpZXMsYSl9LGRlZmluZVByb3BlcnR5KGksYSxmKXtyZXR1cm4gZi5nZXQhPW51bGw/aS5fLmFjY2Vzc0NhY2hlW2FdPTA6dS5oYXNPd24oZiwidmFsdWUiKSYmdGhpcy5zZXQoaSxhLGYudmFsdWUsbnVsbCksUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eShpLGEsZil9fTtnby5vd25LZXlzPWk9PihBKCJBdm9pZCBhcHAgbG9naWMgdGhhdCByZWxpZXMgb24gZW51bWVyYXRpbmcga2V5cyBvbiBhIGNvbXBvbmVudCBpbnN0YW5jZS4gVGhlIGtleXMgd2lsbCBiZSBlbXB0eSBpbiBwcm9kdWN0aW9uIG1vZGUgdG8gYXZvaWQgcGVyZm9ybWFuY2Ugb3ZlcmhlYWQuIiksUmVmbGVjdC5vd25LZXlzKGkpKTt2YXIgUnM9dS5leHRlbmQoe30sZ28se2dldChpLGEpe2lmKGEhPT1TeW1ib2wudW5zY29wYWJsZXMpcmV0dXJuIGdvLmdldChpLGEsaSl9LGhhcyhpLGEpe3ZhciBmPWFbMF0hPT0iXyImJiF1LmlzR2xvYmFsbHlXaGl0ZWxpc3RlZChhKTtyZXR1cm4hZiYmZ28uaGFzKGksYSkmJkEoIlByb3BlcnR5ICIuY29uY2F0KEpTT04uc3RyaW5naWZ5KGEpLCIgc2hvdWxkIG5vdCBzdGFydCB3aXRoIF8gd2hpY2ggaXMgYSByZXNlcnZlZCBwcmVmaXggZm9yIFZ1ZSBpbnRlcm5hbHMuIikpLGZ9fSk7ZnVuY3Rpb24gRWwoaSl7dmFyIGE9e307cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCJfIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsZ2V0OigpPT5pfSksT2JqZWN0LmtleXMocG8pLmZvckVhY2goZj0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGYse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLGdldDooKT0+cG9bZl0oaSksc2V0OnUuTk9PUH0pfSksYX1mdW5jdGlvbiB4cyhpKXt2YXJ7Y3R4OmEscHJvcHNPcHRpb25zOltmXX09aTtmJiZPYmplY3Qua2V5cyhmKS5mb3JFYWNoKHA9PntPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxwLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6KCk9PmkucHJvcHNbcF0sc2V0OnUuTk9PUH0pfSl9ZnVuY3Rpb24gUXMoaSl7dmFye2N0eDphLHNldHVwU3RhdGU6Zn09aTtPYmplY3Qua2V5cyhJLnRvUmF3KGYpKS5mb3JFYWNoKHA9PntpZighZi5fX2lzU2NyaXB0U2V0dXApe2lmKHVhKHBbMF0pKXtBKCJzZXR1cCgpIHJldHVybiBwcm9wZXJ0eSAiLmNvbmNhdChKU09OLnN0cmluZ2lmeShwKSwnIHNob3VsZCBub3Qgc3RhcnQgd2l0aCAiJCIgb3IgIl8iICcpKyJ3aGljaCBhcmUgcmVzZXJ2ZWQgcHJlZml4ZXMgZm9yIFZ1ZSBpbnRlcm5hbHMuIik7cmV0dXJufU9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLHAse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDooKT0+ZltwXSxzZXQ6dS5OT09QfSl9fSl9ZnVuY3Rpb24gXygpe3ZhciBpPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuKGEsZik9PntpW2ZdP0EoIiIuY29uY2F0KGEsJyBwcm9wZXJ0eSAiJykuY29uY2F0KGYsJyIgaXMgYWxyZWFkeSBkZWZpbmVkIGluICcpLmNvbmNhdChpW2ZdLCIuIikpOmlbZl09YX19dmFyIEY9ITA7ZnVuY3Rpb24gcShpKXt2YXIgYT1wZShpKSxmPWkucHJveHkscD1pLmN0eDtGPSExLGEuYmVmb3JlQ3JlYXRlJiZlZShhLmJlZm9yZUNyZWF0ZSxpLCJiYyIpO3ZhcntkYXRhOncsY29tcHV0ZWQ6RSxtZXRob2RzOk4sd2F0Y2g6TCxwcm92aWRlOlIsaW5qZWN0OkssY3JlYXRlZDp1ZSxiZWZvcmVNb3VudDpvZSxtb3VudGVkOnRlLGJlZm9yZVVwZGF0ZTpFZSx1cGRhdGVkOkhlLGFjdGl2YXRlZDpydCxkZWFjdGl2YXRlZDpmdCxiZWZvcmVEZXN0cm95OnZlLGJlZm9yZVVubW91bnQ6bGUsZGVzdHJveWVkOm1lLHVubW91bnRlZDpaZSxyZW5kZXI6T2UscmVuZGVyVHJhY2tlZDpvdCxyZW5kZXJUcmlnZ2VyZWQ6ZHQsZXJyb3JDYXB0dXJlZDpZZSxzZXJ2ZXJQcmVmZXRjaDpPdCxleHBvc2U6VHQsaW5oZXJpdEF0dHJzOnd0LGNvbXBvbmVudHM6JHQsZGlyZWN0aXZlczp4LGZpbHRlcnM6VX09YSxoZT1fKCk7e3ZhcltJZV09aS5wcm9wc09wdGlvbnM7aWYoSWUpZm9yKHZhciBQZSBpbiBJZSloZSgiUHJvcHMiLFBlKX1pZihLJiZXKEsscCxoZSxpLmFwcENvbnRleHQuY29uZmlnLnVud3JhcEluamVjdGVkUmVmKSxOKWZvcih2YXIgSmUgaW4gTil7dmFyIGN0PU5bSmVdO3UuaXNGdW5jdGlvbihjdCk/KE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwLEplLHt2YWx1ZTpjdC5iaW5kKGYpLGNvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiEwfSksaGUoIk1ldGhvZHMiLEplKSk6QSgnTWV0aG9kICInLmNvbmNhdChKZSwnIiBoYXMgdHlwZSAiJykuY29uY2F0KHR5cGVvZiBjdCwnIiBpbiB0aGUgY29tcG9uZW50IGRlZmluaXRpb24uICcpKyJEaWQgeW91IHJlZmVyZW5jZSB0aGUgZnVuY3Rpb24gY29ycmVjdGx5PyIpfWlmKHcmJmZ1bmN0aW9uKCl7dS5pc0Z1bmN0aW9uKHcpfHxBKCJUaGUgZGF0YSBvcHRpb24gbXVzdCBiZSBhIGZ1bmN0aW9uLiBQbGFpbiBvYmplY3QgdXNhZ2UgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4iKTt2YXIgbm49dy5jYWxsKGYsZik7aWYodS5pc1Byb21pc2Uobm4pJiZBKCJkYXRhKCkgcmV0dXJuZWQgYSBQcm9taXNlIC0gbm90ZSBkYXRhKCkgY2Fubm90IGJlIGFzeW5jOyBJZiB5b3UgaW50ZW5kIHRvIHBlcmZvcm0gZGF0YSBmZXRjaGluZyBiZWZvcmUgY29tcG9uZW50IHJlbmRlcnMsIHVzZSBhc3luYyBzZXR1cCgpICsgPFN1c3BlbnNlPi4iKSwhdS5pc09iamVjdChubikpQSgiZGF0YSgpIHNob3VsZCByZXR1cm4gYW4gb2JqZWN0LiIpO2Vsc2V7aS5kYXRhPUkucmVhY3RpdmUobm4pO3t2YXIgV3Q9ZnVuY3Rpb24oV24pe2hlKCJEYXRhIixXbiksdWEoV25bMF0pfHxPYmplY3QuZGVmaW5lUHJvcGVydHkocCxXbix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OigpPT5ubltXbl0sc2V0OnUuTk9PUH0pfTtmb3IodmFyIGduIGluIG5uKVd0KGduKX19fSgpLEY9ITAsRSl7dmFyIFhlPWZ1bmN0aW9uKG5uKXt2YXIgV3Q9RVtubl0sZ249dS5pc0Z1bmN0aW9uKFd0KT9XdC5iaW5kKGYsZik6dS5pc0Z1bmN0aW9uKFd0LmdldCk/V3QuZ2V0LmJpbmQoZixmKTp1Lk5PT1A7Z249PT11Lk5PT1AmJkEoJ0NvbXB1dGVkIHByb3BlcnR5ICInLmNvbmNhdChubiwnIiBoYXMgbm8gZ2V0dGVyLicpKTt2YXIgV249IXUuaXNGdW5jdGlvbihXdCkmJnUuaXNGdW5jdGlvbihXdC5zZXQpP1d0LnNldC5iaW5kKGYpOigpPT57QSgnV3JpdGUgb3BlcmF0aW9uIGZhaWxlZDogY29tcHV0ZWQgcHJvcGVydHkgIicuY29uY2F0KG5uLCciIGlzIHJlYWRvbmx5LicpKX0sVm89JHMoe2dldDpnbixzZXQ6V259KTtPYmplY3QuZGVmaW5lUHJvcGVydHkocCxubix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OigpPT5Wby52YWx1ZSxzZXQ6dWk9PlZvLnZhbHVlPXVpfSksaGUoIkNvbXB1dGVkIixubil9O2Zvcih2YXIgdHQgaW4gRSlYZSh0dCl9aWYoTClmb3IodmFyIFdlIGluIEwpcmUoTFtXZV0scCxmLFdlKTtpZihSKXt2YXIgQ3Q9dS5pc0Z1bmN0aW9uKFIpP1IuY2FsbChmKTpSO1JlZmxlY3Qub3duS2V5cyhDdCkuZm9yRWFjaChubj0+e3ZyKG5uLEN0W25uXSl9KX11ZSYmZWUodWUsaSwiYyIpO2Z1bmN0aW9uIHB0KG5uLFd0KXt1LmlzQXJyYXkoV3QpP1d0LmZvckVhY2goZ249Pm5uKGduLmJpbmQoZikpKTpXdCYmbm4oV3QuYmluZChmKSl9aWYocHQod2Esb2UpLHB0KG5yLHRlKSxwdChScixFZSkscHQoa28sSGUpLHB0KHNhLHJ0KSxwdCgkYSxmdCkscHQoSXMsWWUpLHB0KFRzLG90KSxwdChPcyxkdCkscHQoY2EsbGUpLHB0KHhyLFplKSxwdChBcyxPdCksdS5pc0FycmF5KFR0KSlpZihUdC5sZW5ndGgpe3ZhciBQdD1pLmV4cG9zZWR8fChpLmV4cG9zZWQ9e30pO1R0LmZvckVhY2gobm49PntPYmplY3QuZGVmaW5lUHJvcGVydHkoUHQsbm4se2dldDooKT0+Zltubl0sc2V0Old0PT5mW25uXT1XdH0pfSl9ZWxzZSBpLmV4cG9zZWR8fChpLmV4cG9zZWQ9e30pO09lJiZpLnJlbmRlcj09PXUuTk9PUCYmKGkucmVuZGVyPU9lKSx3dCE9bnVsbCYmKGkuaW5oZXJpdEF0dHJzPXd0KSwkdCYmKGkuY29tcG9uZW50cz0kdCkseCYmKGkuZGlyZWN0aXZlcz14KTt2YXIgZW49aS5hcHBDb250ZXh0LmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzLiRhcHBseU9wdGlvbnM7ZW4mJmVuKGEsaSxmKX1mdW5jdGlvbiBXKGksYSl7dmFyIGY9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOnUuTk9PUCxwPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTohMTt1LmlzQXJyYXkoaSkmJihpPWtlKGkpKTt2YXIgdz1mdW5jdGlvbihOKXt2YXIgTD1pW05dLFI9dm9pZCAwO3UuaXNPYmplY3QoTCk/ImRlZmF1bHQiaW4gTD9SPWVvKEwuZnJvbXx8TixMLmRlZmF1bHQsITApOlI9ZW8oTC5mcm9tfHxOKTpSPWVvKEwpLEkuaXNSZWYoUik/cD9PYmplY3QuZGVmaW5lUHJvcGVydHkoYSxOLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6KCk9PlIudmFsdWUsc2V0Oks9PlIudmFsdWU9S30pOihBKCdpbmplY3RlZCBwcm9wZXJ0eSAiJy5jb25jYXQoTiwnIiBpcyBhIHJlZiBhbmQgd2lsbCBiZSBhdXRvLXVud3JhcHBlZCAnKSsiYW5kIG5vIGxvbmdlciBuZWVkcyBgLnZhbHVlYCBpbiB0aGUgbmV4dCBtaW5vciByZWxlYXNlLiBUbyBvcHQtaW4gdG8gdGhlIG5ldyBiZWhhdmlvciBub3csIHNldCBgYXBwLmNvbmZpZy51bndyYXBJbmplY3RlZFJlZiA9IHRydWVgICh0aGlzIGNvbmZpZyBpcyB0ZW1wb3JhcnkgYW5kIHdpbGwgbm90IGJlIG5lZWRlZCBpbiB0aGUgZnV0dXJlLikiKSxhW05dPVIpOmFbTl09UixmKCJJbmplY3QiLE4pfTtmb3IodmFyIEUgaW4gaSl3KEUpfWZ1bmN0aW9uIGVlKGksYSxmKXtGdCh1LmlzQXJyYXkoaSk/aS5tYXAocD0+cC5iaW5kKGEucHJveHkpKTppLmJpbmQoYS5wcm94eSksYSxmKX1mdW5jdGlvbiByZShpLGEsZixwKXt2YXIgdz1wLmluY2x1ZGVzKCIuIik/aWkoZixwKTooKT0+ZltwXTtpZih1LmlzU3RyaW5nKGkpKXt2YXIgRT1hW2ldO3UuaXNGdW5jdGlvbihFKT9Lcih3LEUpOkEoJ0ludmFsaWQgd2F0Y2ggaGFuZGxlciBzcGVjaWZpZWQgYnkga2V5ICInLmNvbmNhdChpLCciJyksRSl9ZWxzZSBpZih1LmlzRnVuY3Rpb24oaSkpS3IodyxpLmJpbmQoZikpO2Vsc2UgaWYodS5pc09iamVjdChpKSlpZih1LmlzQXJyYXkoaSkpaS5mb3JFYWNoKEw9PnJlKEwsYSxmLHApKTtlbHNle3ZhciBOPXUuaXNGdW5jdGlvbihpLmhhbmRsZXIpP2kuaGFuZGxlci5iaW5kKGYpOmFbaS5oYW5kbGVyXTt1LmlzRnVuY3Rpb24oTik/S3IodyxOLGkpOkEoJ0ludmFsaWQgd2F0Y2ggaGFuZGxlciBzcGVjaWZpZWQgYnkga2V5ICInLmNvbmNhdChpLmhhbmRsZXIsJyInKSxOKX1lbHNlIEEoJ0ludmFsaWQgd2F0Y2ggb3B0aW9uOiAiJy5jb25jYXQocCwnIicpLGkpfWZ1bmN0aW9uIHBlKGkpe3ZhciBhPWkudHlwZSx7bWl4aW5zOmYsZXh0ZW5kczpwfT1hLHttaXhpbnM6dyxvcHRpb25zQ2FjaGU6RSxjb25maWc6e29wdGlvbk1lcmdlU3RyYXRlZ2llczpOfX09aS5hcHBDb250ZXh0LEw9RS5nZXQoYSksUjtyZXR1cm4gTD9SPUw6IXcubGVuZ3RoJiYhZiYmIXA/Uj1hOihSPXt9LHcubGVuZ3RoJiZ3LmZvckVhY2goSz0+Q2UoUixLLE4sITApKSxDZShSLGEsTikpLEUuc2V0KGEsUiksUn1mdW5jdGlvbiBDZShpLGEsZil7dmFyIHA9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiExLHttaXhpbnM6dyxleHRlbmRzOkV9PWE7RSYmQ2UoaSxFLGYsITApLHcmJncuZm9yRWFjaChSPT5DZShpLFIsZiwhMCkpO2Zvcih2YXIgTiBpbiBhKWlmKHAmJk49PT0iZXhwb3NlIilBKCciZXhwb3NlIiBvcHRpb24gaXMgaWdub3JlZCB3aGVuIGRlY2xhcmVkIGluIG1peGlucyBvciBleHRlbmRzLiBJdCBzaG91bGQgb25seSBiZSBkZWNsYXJlZCBpbiB0aGUgYmFzZSBjb21wb25lbnQgaXRzZWxmLicpO2Vsc2V7dmFyIEw9TWVbTl18fGYmJmZbTl07aVtOXT1MP0woaVtOXSxhW05dKTphW05dfXJldHVybiBpfXZhciBNZT17ZGF0YTokZSxwcm9wczp2dCxlbWl0czp2dCxtZXRob2RzOnZ0LGNvbXB1dGVkOnZ0LGJlZm9yZUNyZWF0ZTpxZSxjcmVhdGVkOnFlLGJlZm9yZU1vdW50OnFlLG1vdW50ZWQ6cWUsYmVmb3JlVXBkYXRlOnFlLHVwZGF0ZWQ6cWUsYmVmb3JlRGVzdHJveTpxZSxiZWZvcmVVbm1vdW50OnFlLGRlc3Ryb3llZDpxZSx1bm1vdW50ZWQ6cWUsYWN0aXZhdGVkOnFlLGRlYWN0aXZhdGVkOnFlLGVycm9yQ2FwdHVyZWQ6cWUsc2VydmVyUHJlZmV0Y2g6cWUsY29tcG9uZW50czp2dCxkaXJlY3RpdmVzOnZ0LHdhdGNoOkp0LHByb3ZpZGU6JGUsaW5qZWN0OkFlfTtmdW5jdGlvbiAkZShpLGEpe3JldHVybiBhP2k/ZnVuY3Rpb24oKXtyZXR1cm4gdS5leHRlbmQodS5pc0Z1bmN0aW9uKGkpP2kuY2FsbCh0aGlzLHRoaXMpOmksdS5pc0Z1bmN0aW9uKGEpP2EuY2FsbCh0aGlzLHRoaXMpOmEpfTphOml9ZnVuY3Rpb24gQWUoaSxhKXtyZXR1cm4gdnQoa2UoaSksa2UoYSkpfWZ1bmN0aW9uIGtlKGkpe2lmKHUuaXNBcnJheShpKSl7Zm9yKHZhciBhPXt9LGY9MDtmPGkubGVuZ3RoO2YrKylhW2lbZl1dPWlbZl07cmV0dXJuIGF9cmV0dXJuIGl9ZnVuY3Rpb24gcWUoaSxhKXtyZXR1cm4gaT9bLi4ubmV3IFNldChbXS5jb25jYXQoaSxhKSldOmF9ZnVuY3Rpb24gdnQoaSxhKXtyZXR1cm4gaT91LmV4dGVuZCh1LmV4dGVuZChPYmplY3QuY3JlYXRlKG51bGwpLGkpLGEpOmF9ZnVuY3Rpb24gSnQoaSxhKXtpZighaSlyZXR1cm4gYTtpZighYSlyZXR1cm4gaTt2YXIgZj11LmV4dGVuZChPYmplY3QuY3JlYXRlKG51bGwpLGkpO2Zvcih2YXIgcCBpbiBhKWZbcF09cWUoaVtwXSxhW3BdKTtyZXR1cm4gZn1mdW5jdGlvbiBndChpLGEsZil7dmFyIHA9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiExLHc9e30sRT17fTt1LmRlZihFLERvLDEpLGkucHJvcHNEZWZhdWx0cz1PYmplY3QuY3JlYXRlKG51bGwpLE50KGksYSx3LEUpO2Zvcih2YXIgTiBpbiBpLnByb3BzT3B0aW9uc1swXSlOIGluIHd8fCh3W05dPXZvaWQgMCk7Qm4oYXx8e30sdyxpKSxmP2kucHJvcHM9cD93Okkuc2hhbGxvd1JlYWN0aXZlKHcpOmkudHlwZS5wcm9wcz9pLnByb3BzPXc6aS5wcm9wcz1FLGkuYXR0cnM9RX1mdW5jdGlvbiB1dChpLGEsZixwKXt2YXJ7cHJvcHM6dyxhdHRyczpFLHZub2RlOntwYXRjaEZsYWc6Tn19PWksTD1JLnRvUmF3KHcpLFtSXT1pLnByb3BzT3B0aW9ucyxLPSExO2lmKCEoaS50eXBlLl9faG1ySWR8fGkucGFyZW50JiZpLnBhcmVudC50eXBlLl9faG1ySWQpJiYocHx8Tj4wKSYmIShOJjE2KSl7aWYoTiY4KWZvcih2YXIgdWU9aS52bm9kZS5keW5hbWljUHJvcHMsb2U9MDtvZTx1ZS5sZW5ndGg7b2UrKyl7dmFyIHRlPXVlW29lXTtpZighd24oaS5lbWl0c09wdGlvbnMsdGUpKXt2YXIgRWU9YVt0ZV07aWYoUilpZih1Lmhhc093bihFLHRlKSlFZSE9PUVbdGVdJiYoRVt0ZV09RWUsSz0hMCk7ZWxzZXt2YXIgSGU9dS5jYW1lbGl6ZSh0ZSk7d1tIZV09cG4oUixMLEhlLEVlLGksITEpfWVsc2UgRWUhPT1FW3RlXSYmKEVbdGVdPUVlLEs9ITApfX19ZWxzZXtOdChpLGEsdyxFKSYmKEs9ITApO3ZhciBydDtmb3IodmFyIGZ0IGluIEwpKCFhfHwhdS5oYXNPd24oYSxmdCkmJigocnQ9dS5oeXBoZW5hdGUoZnQpKT09PWZ0fHwhdS5oYXNPd24oYSxydCkpKSYmKFI/ZiYmKGZbZnRdIT09dm9pZCAwfHxmW3J0XSE9PXZvaWQgMCkmJih3W2Z0XT1wbihSLEwsZnQsdm9pZCAwLGksITApKTpkZWxldGUgd1tmdF0pO2lmKEUhPT1MKWZvcih2YXIgdmUgaW4gRSkoIWF8fCF1Lmhhc093bihhLHZlKSYmITApJiYoZGVsZXRlIEVbdmVdLEs9ITApfUsmJkkudHJpZ2dlcihpLCJzZXQiLCIkYXR0cnMiKSxCbihhfHx7fSx3LGkpfWZ1bmN0aW9uIE50KGksYSxmLHApe3Zhclt3LEVdPWkucHJvcHNPcHRpb25zLE49ITEsTDtpZihhKXtmb3IodmFyIFIgaW4gYSlpZighdS5pc1Jlc2VydmVkUHJvcChSKSl7dmFyIEs9YVtSXSx1ZT12b2lkIDA7dyYmdS5oYXNPd24odyx1ZT11LmNhbWVsaXplKFIpKT8hRXx8IUUuaW5jbHVkZXModWUpP2ZbdWVdPUs6KEx8fChMPXt9KSlbdWVdPUs6d24oaS5lbWl0c09wdGlvbnMsUil8fCghKFIgaW4gcCl8fEshPT1wW1JdKSYmKHBbUl09SyxOPSEwKX19aWYoRSlmb3IodmFyIG9lPUkudG9SYXcoZiksdGU9THx8dS5FTVBUWV9PQkosRWU9MDtFZTxFLmxlbmd0aDtFZSsrKXt2YXIgSGU9RVtFZV07ZltIZV09cG4odyxvZSxIZSx0ZVtIZV0saSwhdS5oYXNPd24odGUsSGUpKX1yZXR1cm4gTn1mdW5jdGlvbiBwbihpLGEsZixwLHcsRSl7dmFyIE49aVtmXTtpZihOIT1udWxsKXt2YXIgTD11Lmhhc093bihOLCJkZWZhdWx0Iik7aWYoTCYmcD09PXZvaWQgMCl7dmFyIFI9Ti5kZWZhdWx0O2lmKE4udHlwZSE9PUZ1bmN0aW9uJiZ1LmlzRnVuY3Rpb24oUikpe3Zhcntwcm9wc0RlZmF1bHRzOkt9PXc7ZiBpbiBLP3A9S1tmXTooWnIodykscD1LW2ZdPVIuY2FsbChudWxsLGEpLGZhKCkpfWVsc2UgcD1SfU5bMF0mJihFJiYhTD9wPSExOk5bMV0mJihwPT09IiJ8fHA9PT11Lmh5cGhlbmF0ZShmKSkmJihwPSEwKSl9cmV0dXJuIHB9ZnVuY3Rpb24gU3QoaSxhKXt2YXIgZj1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06ITEscD1hLnByb3BzQ2FjaGUsdz1wLmdldChpKTtpZih3KXJldHVybiB3O3ZhciBFPWkucHJvcHMsTj17fSxMPVtdLFI9ITE7aWYoIXUuaXNGdW5jdGlvbihpKSl7dmFyIEs9bWU9PntSPSEwO3ZhcltaZSxPZV09U3QobWUsYSwhMCk7dS5leHRlbmQoTixaZSksT2UmJkwucHVzaCguLi5PZSl9OyFmJiZhLm1peGlucy5sZW5ndGgmJmEubWl4aW5zLmZvckVhY2goSyksaS5leHRlbmRzJiZLKGkuZXh0ZW5kcyksaS5taXhpbnMmJmkubWl4aW5zLmZvckVhY2goSyl9aWYoIUUmJiFSKXJldHVybiBwLnNldChpLHUuRU1QVFlfQVJSKSx1LkVNUFRZX0FSUjtpZih1LmlzQXJyYXkoRSkpZm9yKHZhciB1ZT0wO3VlPEUubGVuZ3RoO3VlKyspe3UuaXNTdHJpbmcoRVt1ZV0pfHxBKCJwcm9wcyBtdXN0IGJlIHN0cmluZ3Mgd2hlbiB1c2luZyBhcnJheSBzeW50YXguIixFW3VlXSk7dmFyIG9lPXUuY2FtZWxpemUoRVt1ZV0pO2h0KG9lKSYmKE5bb2VdPXUuRU1QVFlfT0JKKX1lbHNlIGlmKEUpe3UuaXNPYmplY3QoRSl8fEEoImludmFsaWQgcHJvcHMgb3B0aW9ucyIsRSk7Zm9yKHZhciB0ZSBpbiBFKXt2YXIgRWU9dS5jYW1lbGl6ZSh0ZSk7aWYoaHQoRWUpKXt2YXIgSGU9RVt0ZV0scnQ9TltFZV09dS5pc0FycmF5KEhlKXx8dS5pc0Z1bmN0aW9uKEhlKT97dHlwZTpIZX06SGU7aWYocnQpe3ZhciBmdD14bihCb29sZWFuLHJ0LnR5cGUpLHZlPXhuKFN0cmluZyxydC50eXBlKTtydFswXT1mdD4tMSxydFsxXT12ZTwwfHxmdDx2ZSwoZnQ+LTF8fHUuaGFzT3duKHJ0LCJkZWZhdWx0IikpJiZMLnB1c2goRWUpfX19fXZhciBsZT1bTixMXTtyZXR1cm4gcC5zZXQoaSxsZSksbGV9ZnVuY3Rpb24gaHQoaSl7cmV0dXJuIGlbMF0hPT0iJCI/ITA6KEEoJ0ludmFsaWQgcHJvcCBuYW1lOiAiJy5jb25jYXQoaSwnIiBpcyBhIHJlc2VydmVkIHByb3BlcnR5LicpKSwhMSl9ZnVuY3Rpb24gTHQoaSl7dmFyIGE9aSYmaS50b1N0cmluZygpLm1hdGNoKC9eXHMqZnVuY3Rpb24gKFx3KykvKTtyZXR1cm4gYT9hWzFdOmk9PT1udWxsPyJudWxsIjoiIn1mdW5jdGlvbiBSbihpLGEpe3JldHVybiBMdChpKT09PUx0KGEpfWZ1bmN0aW9uIHhuKGksYSl7cmV0dXJuIHUuaXNBcnJheShhKT9hLmZpbmRJbmRleChmPT5SbihmLGkpKTp1LmlzRnVuY3Rpb24oYSkmJlJuKGEsaSk/MDotMX1mdW5jdGlvbiBCbihpLGEsZil7dmFyIHA9SS50b1JhdyhhKSx3PWYucHJvcHNPcHRpb25zWzBdO2Zvcih2YXIgRSBpbiB3KXt2YXIgTj13W0VdO04hPW51bGwmJkxuKEUscFtFXSxOLCF1Lmhhc093bihpLEUpJiYhdS5oYXNPd24oaSx1Lmh5cGhlbmF0ZShFKSkpfX1mdW5jdGlvbiBMbihpLGEsZixwKXt2YXJ7dHlwZTp3LHJlcXVpcmVkOkUsdmFsaWRhdG9yOk59PWY7aWYoRSYmcCl7QSgnTWlzc2luZyByZXF1aXJlZCBwcm9wOiAiJytpKyciJyk7cmV0dXJufWlmKCEoYT09bnVsbCYmIWYucmVxdWlyZWQpKXtpZih3IT1udWxsJiZ3IT09ITApe2Zvcih2YXIgTD0hMSxSPXUuaXNBcnJheSh3KT93Olt3XSxLPVtdLHVlPTA7dWU8Ui5sZW5ndGgmJiFMO3VlKyspe3Zhcnt2YWxpZDpvZSxleHBlY3RlZFR5cGU6dGV9PUtuKGEsUlt1ZV0pO0sucHVzaCh0ZXx8IiIpLEw9b2V9aWYoIUwpe0EoemEoaSxhLEspKTtyZXR1cm59fU4mJiFOKGEpJiZBKCdJbnZhbGlkIHByb3A6IGN1c3RvbSB2YWxpZGF0b3IgY2hlY2sgZmFpbGVkIGZvciBwcm9wICInK2krJyIuJyl9fXZhciBZdD11Lm1ha2VNYXAoIlN0cmluZyxOdW1iZXIsQm9vbGVhbixGdW5jdGlvbixTeW1ib2wsQmlnSW50Iik7ZnVuY3Rpb24gS24oaSxhKXt2YXIgZixwPUx0KGEpO2lmKFl0KHApKXt2YXIgdz10eXBlb2YgaTtmPXc9PT1wLnRvTG93ZXJDYXNlKCksIWYmJnc9PT0ib2JqZWN0IiYmKGY9aSBpbnN0YW5jZW9mIGEpfWVsc2UgcD09PSJPYmplY3QiP2Y9dS5pc09iamVjdChpKTpwPT09IkFycmF5Ij9mPXUuaXNBcnJheShpKTpwPT09Im51bGwiP2Y9aT09PW51bGw6Zj1pIGluc3RhbmNlb2YgYTtyZXR1cm57dmFsaWQ6ZixleHBlY3RlZFR5cGU6cH19ZnVuY3Rpb24gemEoaSxhLGYpe3ZhciBwPSdJbnZhbGlkIHByb3A6IHR5cGUgY2hlY2sgZmFpbGVkIGZvciBwcm9wICInLmNvbmNhdChpLCciLicpKyIgRXhwZWN0ZWQgIi5jb25jYXQoZi5tYXAodS5jYXBpdGFsaXplKS5qb2luKCIgfCAiKSksdz1mWzBdLEU9dS50b1Jhd1R5cGUoYSksTj1XYShhLHcpLEw9V2EoYSxFKTtyZXR1cm4gZi5sZW5ndGg9PT0xJiZ4byh3KSYmIUdhKHcsRSkmJihwKz0iIHdpdGggdmFsdWUgIi5jb25jYXQoTikpLHArPSIsIGdvdCAiLmNvbmNhdChFLCIgIikseG8oRSkmJihwKz0id2l0aCB2YWx1ZSAiLmNvbmNhdChMLCIuIikpLHB9ZnVuY3Rpb24gV2EoaSxhKXtyZXR1cm4gYT09PSJTdHJpbmciPyciJy5jb25jYXQoaSwnIicpOmE9PT0iTnVtYmVyIj8iIi5jb25jYXQoTnVtYmVyKGkpKToiIi5jb25jYXQoaSl9ZnVuY3Rpb24geG8oaSl7dmFyIGE9WyJzdHJpbmciLCJudW1iZXIiLCJib29sZWFuIl07cmV0dXJuIGEuc29tZShmPT5pLnRvTG93ZXJDYXNlKCk9PT1mKX1mdW5jdGlvbiBHYSgpe2Zvcih2YXIgaT1hcmd1bWVudHMubGVuZ3RoLGE9bmV3IEFycmF5KGkpLGY9MDtmPGk7ZisrKWFbZl09YXJndW1lbnRzW2ZdO3JldHVybiBhLnNvbWUocD0+cC50b0xvd2VyQ2FzZSgpPT09ImJvb2xlYW4iKX12YXIgQm89aT0+aVswXT09PSJfInx8aT09PSIkc3RhYmxlIixZYT1pPT51LmlzQXJyYXkoaSk/aS5tYXAoVG4pOltUbihpKV0sQnM9KGksYSxmKT0+e2lmKGEuX24pcmV0dXJuIGE7dmFyIHA9WGkoZnVuY3Rpb24oKXtyZXR1cm4gSW4mJkEoJ1Nsb3QgIicuY29uY2F0KGksJyIgaW52b2tlZCBvdXRzaWRlIG9mIHRoZSByZW5kZXIgZnVuY3Rpb246ICcpKyJ0aGlzIHdpbGwgbm90IHRyYWNrIGRlcGVuZGVuY2llcyB1c2VkIGluIHRoZSBzbG90LiBJbnZva2UgdGhlIHNsb3QgZnVuY3Rpb24gaW5zaWRlIHRoZSByZW5kZXIgZnVuY3Rpb24gaW5zdGVhZC4iKSxZYShhKC4uLmFyZ3VtZW50cykpfSxmKTtyZXR1cm4gcC5fYz0hMSxwfSxBbj0oaSxhLGYpPT57dmFyIHA9aS5fY3R4O2Zvcih2YXIgdyBpbiBpKWlmKCFCbyh3KSl7dmFyIEU9aVt3XTt1LmlzRnVuY3Rpb24oRSk/YVt3XT1Ccyh3LEUscCk6RSE9bnVsbCYmZnVuY3Rpb24oKXtBKCdOb24tZnVuY3Rpb24gdmFsdWUgZW5jb3VudGVyZWQgZm9yIHNsb3QgIicuY29uY2F0KHcsJyIuICcpKyJQcmVmZXIgZnVuY3Rpb24gc2xvdHMgZm9yIGJldHRlciBwZXJmb3JtYW5jZS4iKTt2YXIgTj1ZYShFKTthW3ddPSgpPT5OfSgpfX0sWW89KGksYSk9PntxbihpLnZub2RlKXx8QSgiTm9uLWZ1bmN0aW9uIHZhbHVlIGVuY291bnRlcmVkIGZvciBkZWZhdWx0IHNsb3QuIFByZWZlciBmdW5jdGlvbiBzbG90cyBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlLiIpO3ZhciBmPVlhKGEpO2kuc2xvdHMuZGVmYXVsdD0oKT0+Zn0scW89KGksYSk9PntpZihpLnZub2RlLnNoYXBlRmxhZyYzMil7dmFyIGY9YS5fO2Y/KGkuc2xvdHM9SS50b1JhdyhhKSx1LmRlZihhLCJfIixmKSk6QW4oYSxpLnNsb3RzPXt9KX1lbHNlIGkuc2xvdHM9e30sYSYmWW8oaSxhKTt1LmRlZihpLnNsb3RzLERvLDEpfSxxYT0oaSxhLGYpPT57dmFye3Zub2RlOnAsc2xvdHM6d309aSxFPSEwLE49dS5FTVBUWV9PQko7aWYocC5zaGFwZUZsYWcmMzIpe3ZhciBMPWEuXztMP2FyP3UuZXh0ZW5kKHcsYSk6ZiYmTD09PTE/RT0hMToodS5leHRlbmQodyxhKSwhZiYmTD09PTEmJmRlbGV0ZSB3Ll8pOihFPSFhLiRzdGFibGUsQW4oYSx3KSksTj1hfWVsc2UgYSYmKFlvKGksYSksTj17ZGVmYXVsdDoxfSk7aWYoRSlmb3IodmFyIFIgaW4gdykhQm8oUikmJiEoUiBpbiBOKSYmZGVsZXRlIHdbUl19O2Z1bmN0aW9uIE1zKCl7cmV0dXJue2FwcDpudWxsLGNvbmZpZzp7aXNOYXRpdmVUYWc6dS5OTyxwZXJmb3JtYW5jZTohMSxnbG9iYWxQcm9wZXJ0aWVzOnt9LG9wdGlvbk1lcmdlU3RyYXRlZ2llczp7fSxlcnJvckhhbmRsZXI6dm9pZCAwLHdhcm5IYW5kbGVyOnZvaWQgMCxjb21waWxlck9wdGlvbnM6e319LG1peGluczpbXSxjb21wb25lbnRzOnt9LGRpcmVjdGl2ZXM6e30scHJvdmlkZXM6T2JqZWN0LmNyZWF0ZShudWxsKSxvcHRpb25zQ2FjaGU6bmV3IFdlYWtNYXAscHJvcHNDYWNoZTpuZXcgV2Vha01hcCxlbWl0c0NhY2hlOm5ldyBXZWFrTWFwfX12YXIgS2E9MDtmdW5jdGlvbiBEaShpLGEpe3JldHVybiBmdW5jdGlvbihwKXt2YXIgdz1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06bnVsbDt1LmlzRnVuY3Rpb24ocCl8fChwPU9iamVjdC5hc3NpZ24oe30scCkpLHchPW51bGwmJiF1LmlzT2JqZWN0KHcpJiYoQSgicm9vdCBwcm9wcyBwYXNzZWQgdG8gYXBwLm1vdW50KCkgbXVzdCBiZSBhbiBvYmplY3QuIiksdz1udWxsKTt2YXIgRT1NcygpLE49bmV3IFNldCxMPSExLFI9RS5hcHA9e191aWQ6S2ErKyxfY29tcG9uZW50OnAsX3Byb3BzOncsX2NvbnRhaW5lcjpudWxsLF9jb250ZXh0OkUsX2luc3RhbmNlOm51bGwsdmVyc2lvbjpGbCxnZXQgY29uZmlnKCl7cmV0dXJuIEUuY29uZmlnfSxzZXQgY29uZmlnKEspe0EoImFwcC5jb25maWcgY2Fubm90IGJlIHJlcGxhY2VkLiBNb2RpZnkgaW5kaXZpZHVhbCBvcHRpb25zIGluc3RlYWQuIil9LHVzZShLKXtmb3IodmFyIHVlPWFyZ3VtZW50cy5sZW5ndGgsb2U9bmV3IEFycmF5KHVlPjE/dWUtMTowKSx0ZT0xO3RlPHVlO3RlKyspb2VbdGUtMV09YXJndW1lbnRzW3RlXTtyZXR1cm4gTi5oYXMoSyk/QSgiUGx1Z2luIGhhcyBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0YXJnZXQgYXBwLiIpOksmJnUuaXNGdW5jdGlvbihLLmluc3RhbGwpPyhOLmFkZChLKSxLLmluc3RhbGwoUiwuLi5vZSkpOnUuaXNGdW5jdGlvbihLKT8oTi5hZGQoSyksSyhSLC4uLm9lKSk6QSgnQSBwbHVnaW4gbXVzdCBlaXRoZXIgYmUgYSBmdW5jdGlvbiBvciBhbiBvYmplY3Qgd2l0aCBhbiAiaW5zdGFsbCIgZnVuY3Rpb24uJyksUn0sbWl4aW4oSyl7cmV0dXJuIEUubWl4aW5zLmluY2x1ZGVzKEspP0EoIk1peGluIGhhcyBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0YXJnZXQgYXBwIisoSy5uYW1lPyI6ICIuY29uY2F0KEsubmFtZSk6IiIpKTpFLm1peGlucy5wdXNoKEspLFJ9LGNvbXBvbmVudChLLHVlKXtyZXR1cm4gWHIoSyxFLmNvbmZpZyksdWU/KEUuY29tcG9uZW50c1tLXSYmQSgnQ29tcG9uZW50ICInLmNvbmNhdChLLCciIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCBpbiB0YXJnZXQgYXBwLicpKSxFLmNvbXBvbmVudHNbS109dWUsUik6RS5jb21wb25lbnRzW0tdfSxkaXJlY3RpdmUoSyx1ZSl7cmV0dXJuIFpzKEspLHVlPyhFLmRpcmVjdGl2ZXNbS10mJkEoJ0RpcmVjdGl2ZSAiJy5jb25jYXQoSywnIiBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgaW4gdGFyZ2V0IGFwcC4nKSksRS5kaXJlY3RpdmVzW0tdPXVlLFIpOkUuZGlyZWN0aXZlc1tLXX0sbW91bnQoSyx1ZSxvZSl7aWYoTClBKCJBcHAgaGFzIGFscmVhZHkgYmVlbiBtb3VudGVkLlxuSWYgeW91IHdhbnQgdG8gcmVtb3VudCB0aGUgc2FtZSBhcHAsIG1vdmUgeW91ciBhcHAgY3JlYXRpb24gbG9naWMgaW50byBhIGZhY3RvcnkgZnVuY3Rpb24gYW5kIGNyZWF0ZSBmcmVzaCBhcHAgaW5zdGFuY2VzIGZvciBlYWNoIG1vdW50IC0gZS5nLiBgY29uc3QgY3JlYXRlTXlBcHAgPSAoKSA9PiBjcmVhdGVBcHAoQXBwKWAiKTtlbHNle0suX192dWVfYXBwX18mJkEoIlRoZXJlIGlzIGFscmVhZHkgYW4gYXBwIGluc3RhbmNlIG1vdW50ZWQgb24gdGhlIGhvc3QgY29udGFpbmVyLlxuIElmIHlvdSB3YW50IHRvIG1vdW50IGFub3RoZXIgYXBwIG9uIHRoZSBzYW1lIGhvc3QgY29udGFpbmVyLCB5b3UgbmVlZCB0byB1bm1vdW50IHRoZSBwcmV2aW91cyBhcHAgYnkgY2FsbGluZyBgYXBwLnVubW91bnQoKWAgZmlyc3QuIik7dmFyIHRlPXpuKHAsdyk7cmV0dXJuIHRlLmFwcENvbnRleHQ9RSxFLnJlbG9hZD0oKT0+e2koQWkodGUpLEssb2UpfSx1ZSYmYT9hKHRlLEspOmkodGUsSyxvZSksTD0hMCxSLl9jb250YWluZXI9SyxLLl9fdnVlX2FwcF9fPVIsUi5faW5zdGFuY2U9dGUuY29tcG9uZW50LFdyKFIsRmwpLExzKHRlLmNvbXBvbmVudCl8fHRlLmNvbXBvbmVudC5wcm94eX19LHVubW91bnQoKXtMPyhpKG51bGwsUi5fY29udGFpbmVyKSxSLl9pbnN0YW5jZT1udWxsLEdyKFIpLGRlbGV0ZSBSLl9jb250YWluZXIuX192dWVfYXBwX18pOkEoIkNhbm5vdCB1bm1vdW50IGFuIGFwcCB0aGF0IGlzIG5vdCBtb3VudGVkLiIpfSxwcm92aWRlKEssdWUpe3JldHVybiBLIGluIEUucHJvdmlkZXMmJkEoJ0FwcCBhbHJlYWR5IHByb3ZpZGVzIHByb3BlcnR5IHdpdGgga2V5ICInLmNvbmNhdChTdHJpbmcoSyksJyIuICcpKyJJdCB3aWxsIGJlIG92ZXJ3cml0dGVuIHdpdGggdGhlIG5ldyB2YWx1ZS4iKSxFLnByb3ZpZGVzW0tdPXVlLFJ9fTtyZXR1cm4gUn19ZnVuY3Rpb24gdXIoaSxhLGYscCl7dmFyIHc9YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOiExO2lmKHUuaXNBcnJheShpKSl7aS5mb3JFYWNoKChydCxmdCk9PnVyKHJ0LGEmJih1LmlzQXJyYXkoYSk/YVtmdF06YSksZixwLHcpKTtyZXR1cm59aWYoIShDbihwKSYmIXcpKXt2YXIgRT1wLnNoYXBlRmxhZyY0P0xzKHAuY29tcG9uZW50KXx8cC5jb21wb25lbnQucHJveHk6cC5lbCxOPXc/bnVsbDpFLHtpOkwscjpSfT1pO2lmKCFMKXtBKCJNaXNzaW5nIHJlZiBvd25lciBjb250ZXh0LiByZWYgY2Fubm90IGJlIHVzZWQgb24gaG9pc3RlZCB2bm9kZXMuIEEgdm5vZGUgd2l0aCByZWYgbXVzdCBiZSBjcmVhdGVkIGluc2lkZSB0aGUgcmVuZGVyIGZ1bmN0aW9uLiIpO3JldHVybn12YXIgSz1hJiZhLnIsdWU9TC5yZWZzPT09dS5FTVBUWV9PQko/TC5yZWZzPXt9OkwucmVmcyxvZT1MLnNldHVwU3RhdGU7aWYoSyE9bnVsbCYmSyE9PVImJih1LmlzU3RyaW5nKEspPyh1ZVtLXT1udWxsLHUuaGFzT3duKG9lLEspJiYob2VbS109bnVsbCkpOkkuaXNSZWYoSykmJihLLnZhbHVlPW51bGwpKSx1LmlzRnVuY3Rpb24oUikpaG4oUixMLDEyLFtOLHVlXSk7ZWxzZXt2YXIgdGU9dS5pc1N0cmluZyhSKSxFZT1JLmlzUmVmKFIpO2lmKHRlfHxFZSl7dmFyIEhlPSgpPT57aWYoaS5mKXt2YXIgcnQ9dGU/dWVbUl06Ui52YWx1ZTt3P3UuaXNBcnJheShydCkmJnUucmVtb3ZlKHJ0LEUpOnUuaXNBcnJheShydCk/cnQuaW5jbHVkZXMoRSl8fHJ0LnB1c2goRSk6dGU/KHVlW1JdPVtFXSx1Lmhhc093bihvZSxSKSYmKG9lW1JdPXVlW1JdKSk6KFIudmFsdWU9W0VdLGkuayYmKHVlW2kua109Ui52YWx1ZSkpfWVsc2UgdGU/KHVlW1JdPU4sdS5oYXNPd24ob2UsUikmJihvZVtSXT1OKSk6RWU/KFIudmFsdWU9TixpLmsmJih1ZVtpLmtdPU4pKTpBKCJJbnZhbGlkIHRlbXBsYXRlIHJlZiB0eXBlOiIsUiwiKCIuY29uY2F0KHR5cGVvZiBSLCIpIikpfTtOPyhIZS5pZD0tMSxDcihIZSxmKSk6SGUoKX1lbHNlIEEoIkludmFsaWQgdGVtcGxhdGUgcmVmIHR5cGU6IixSLCIoIi5jb25jYXQodHlwZW9mIFIsIikiKSl9fX12YXIgT249ITEscm89aT0+L3N2Zy8udGVzdChpLm5hbWVzcGFjZVVSSSkmJmkudGFnTmFtZSE9PSJmb3JlaWduT2JqZWN0IixKYT1pPT5pLm5vZGVUeXBlPT09ODtmdW5jdGlvbiBBYShpKXt2YXJ7bXQ6YSxwOmYsbzp7cGF0Y2hQcm9wOnAsY3JlYXRlVGV4dDp3LG5leHRTaWJsaW5nOkUscGFyZW50Tm9kZTpOLHJlbW92ZTpMLGluc2VydDpSLGNyZWF0ZUNvbW1lbnQ6S319PWksdWU9KHZlLGxlKT0+e2lmKCFsZS5oYXNDaGlsZE5vZGVzKCkpe0EoIkF0dGVtcHRpbmcgdG8gaHlkcmF0ZSBleGlzdGluZyBtYXJrdXAgYnV0IGNvbnRhaW5lciBpcyBlbXB0eS4gUGVyZm9ybWluZyBmdWxsIG1vdW50IGluc3RlYWQuIiksZihudWxsLHZlLGxlKSxoaSgpLGxlLl92bm9kZT12ZTtyZXR1cm59T249ITEsb2UobGUuZmlyc3RDaGlsZCx2ZSxudWxsLG51bGwsbnVsbCksaGkoKSxsZS5fdm5vZGU9dmUsT24mJmNvbnNvbGUuZXJyb3IoIkh5ZHJhdGlvbiBjb21wbGV0ZWQgYnV0IGNvbnRhaW5zIG1pc21hdGNoZXMuIil9LG9lPWZ1bmN0aW9uKHZlLGxlLG1lLFplLE9lKXt2YXIgb3Q9YXJndW1lbnRzLmxlbmd0aD41JiZhcmd1bWVudHNbNV0hPT12b2lkIDA/YXJndW1lbnRzWzVdOiExLGR0PUphKHZlKSYmdmUuZGF0YT09PSJbIixZZT0oKT0+cnQodmUsbGUsbWUsWmUsT2UsZHQpLHt0eXBlOk90LHJlZjpUdCxzaGFwZUZsYWc6d3QscGF0Y2hGbGFnOiR0fT1sZSx4PXZlLm5vZGVUeXBlO2xlLmVsPXZlLCR0PT09LTImJihvdD0hMSxsZS5keW5hbWljQ2hpbGRyZW49bnVsbCk7dmFyIFU9bnVsbDtzd2l0Y2goT3Qpe2Nhc2UgaXQ6eCE9PTM/bGUuY2hpbGRyZW49PT0iIj8oUihsZS5lbD13KCIiLHZlLnBhcmVudE5vZGUpLE4odmUpLHZlKSxVPXZlKTpVPVllKCk6KHZlLmRhdGEhPT1sZS5jaGlsZHJlbiYmKE9uPSEwLEEoIkh5ZHJhdGlvbiB0ZXh0IG1pc21hdGNoOiIrYAotIENsaWVudDogYC5jb25jYXQoSlNPTi5zdHJpbmdpZnkodmUuZGF0YSkpK2AKLSBTZXJ2ZXI6IGAuY29uY2F0KEpTT04uc3RyaW5naWZ5KGxlLmNoaWxkcmVuKSkpLHZlLmRhdGE9bGUuY2hpbGRyZW4pLFU9RSh2ZSkpO2JyZWFrO2Nhc2UgZm46eCE9PTh8fGR0P1U9WWUoKTpVPUUodmUpO2JyZWFrO2Nhc2UgQnI6aWYoeCE9PTEmJnghPT0zKVU9WWUoKTtlbHNle1U9dmU7Zm9yKHZhciBoZT0hbGUuY2hpbGRyZW4ubGVuZ3RoLEllPTA7SWU8bGUuc3RhdGljQ291bnQ7SWUrKyloZSYmKGxlLmNoaWxkcmVuKz1VLm5vZGVUeXBlPT09MT9VLm91dGVySFRNTDpVLmRhdGEpLEllPT09bGUuc3RhdGljQ291bnQtMSYmKGxlLmFuY2hvcj1VKSxVPUUoVSk7cmV0dXJuIFV9YnJlYWs7Y2FzZSBqdDpkdD9VPUhlKHZlLGxlLG1lLFplLE9lLG90KTpVPVllKCk7YnJlYWs7ZGVmYXVsdDppZih3dCYxKXghPT0xfHxsZS50eXBlLnRvTG93ZXJDYXNlKCkhPT12ZS50YWdOYW1lLnRvTG93ZXJDYXNlKCk/VT1ZZSgpOlU9dGUodmUsbGUsbWUsWmUsT2Usb3QpO2Vsc2UgaWYod3QmNil7bGUuc2xvdFNjb3BlSWRzPU9lO3ZhciBQZT1OKHZlKTtpZihhKGxlLFBlLG51bGwsbWUsWmUscm8oUGUpLG90KSxVPWR0P2Z0KHZlKTpFKHZlKSxVJiZKYShVKSYmVS5kYXRhPT09InRlbGVwb3J0IGVuZCImJihVPUUoVSkpLENuKGxlKSl7dmFyIEplO2R0PyhKZT16bihqdCksSmUuYW5jaG9yPVU/VS5wcmV2aW91c1NpYmxpbmc6UGUubGFzdENoaWxkKTpKZT12ZS5ub2RlVHlwZT09PTM/QWwoIiIpOnpuKCJkaXYiKSxKZS5lbD12ZSxsZS5jb21wb25lbnQuc3ViVHJlZT1KZX19ZWxzZSB3dCY2ND94IT09OD9VPVllKCk6VT1sZS50eXBlLmh5ZHJhdGUodmUsbGUsbWUsWmUsT2Usb3QsaSxFZSk6d3QmMTI4P1U9bGUudHlwZS5oeWRyYXRlKHZlLGxlLG1lLFplLHJvKE4odmUpKSxPZSxvdCxpLG9lKTpBKCJJbnZhbGlkIEhvc3RWTm9kZSB0eXBlOiIsT3QsIigiLmNvbmNhdCh0eXBlb2YgT3QsIikiKSl9cmV0dXJuIFR0IT1udWxsJiZ1cihUdCxudWxsLFplLGxlKSxVfSx0ZT0odmUsbGUsbWUsWmUsT2Usb3QpPT57b3Q9b3R8fCEhbGUuZHluYW1pY0NoaWxkcmVuO3Zhcnt0eXBlOmR0LHByb3BzOlllLHBhdGNoRmxhZzpPdCxzaGFwZUZsYWc6VHQsZGlyczp3dH09bGUsJHQ9ZHQ9PT0iaW5wdXQiJiZ3dHx8ZHQ9PT0ib3B0aW9uIjt7aWYod3QmJkVpKGxlLG51bGwsbWUsImNyZWF0ZWQiKSxZZSlpZigkdHx8IW90fHxPdCYoMTZ8MzIpKWZvcih2YXIgeCBpbiBZZSkoJHQmJnguZW5kc1dpdGgoInZhbHVlIil8fHUuaXNPbih4KSYmIXUuaXNSZXNlcnZlZFByb3AoeCkpJiZwKHZlLHgsbnVsbCxZZVt4XSwhMSx2b2lkIDAsbWUpO2Vsc2UgWWUub25DbGljayYmcCh2ZSwib25DbGljayIsbnVsbCxZZS5vbkNsaWNrLCExLHZvaWQgMCxtZSk7dmFyIFU7aWYoKFU9WWUmJlllLm9uVm5vZGVCZWZvcmVNb3VudCkmJmxpKFUsbWUsbGUpLHd0JiZFaShsZSxudWxsLG1lLCJiZWZvcmVNb3VudCIpLCgoVT1ZZSYmWWUub25Wbm9kZU1vdW50ZWQpfHx3dCkmJmtuKCgpPT57VSYmbGkoVSxtZSxsZSksd3QmJkVpKGxlLG51bGwsbWUsIm1vdW50ZWQiKX0sWmUpLFR0JjE2JiYhKFllJiYoWWUuaW5uZXJIVE1MfHxZZS50ZXh0Q29udGVudCkpKWZvcih2YXIgaGU9RWUodmUuZmlyc3RDaGlsZCxsZSx2ZSxtZSxaZSxPZSxvdCksSWU9ITE7aGU7KXtPbj0hMCxJZXx8KEEoIkh5ZHJhdGlvbiBjaGlsZHJlbiBtaXNtYXRjaCBpbiA8Ii5jb25jYXQobGUudHlwZSwiPjogIikrInNlcnZlciByZW5kZXJlZCBlbGVtZW50IGNvbnRhaW5zIG1vcmUgY2hpbGQgbm9kZXMgdGhhbiBjbGllbnQgdmRvbS4iKSxJZT0hMCk7dmFyIFBlPWhlO2hlPWhlLm5leHRTaWJsaW5nLEwoUGUpfWVsc2UgVHQmOCYmdmUudGV4dENvbnRlbnQhPT1sZS5jaGlsZHJlbiYmKE9uPSEwLEEoIkh5ZHJhdGlvbiB0ZXh0IGNvbnRlbnQgbWlzbWF0Y2ggaW4gPCIuY29uY2F0KGxlLnR5cGUsYD46CmApKyItIENsaWVudDogIi5jb25jYXQodmUudGV4dENvbnRlbnQsYApgKSsiLSBTZXJ2ZXI6ICIuY29uY2F0KGxlLmNoaWxkcmVuKSksdmUudGV4dENvbnRlbnQ9bGUuY2hpbGRyZW4pfXJldHVybiB2ZS5uZXh0U2libGluZ30sRWU9KHZlLGxlLG1lLFplLE9lLG90LGR0KT0+e2R0PWR0fHwhIWxlLmR5bmFtaWNDaGlsZHJlbjtmb3IodmFyIFllPWxlLmNoaWxkcmVuLE90PVllLmxlbmd0aCxUdD0hMSx3dD0wO3d0PE90O3d0Kyspe3ZhciAkdD1kdD9ZZVt3dF06WWVbd3RdPVRuKFllW3d0XSk7aWYodmUpdmU9b2UodmUsJHQsWmUsT2Usb3QsZHQpO2Vsc2V7aWYoJHQudHlwZT09PWl0JiYhJHQuY2hpbGRyZW4pY29udGludWU7T249ITAsVHR8fChBKCJIeWRyYXRpb24gY2hpbGRyZW4gbWlzbWF0Y2ggaW4gPCIuY29uY2F0KG1lLnRhZ05hbWUudG9Mb3dlckNhc2UoKSwiPjogIikrInNlcnZlciByZW5kZXJlZCBlbGVtZW50IGNvbnRhaW5zIGZld2VyIGNoaWxkIG5vZGVzIHRoYW4gY2xpZW50IHZkb20uIiksVHQ9ITApLGYobnVsbCwkdCxtZSxudWxsLFplLE9lLHJvKG1lKSxvdCl9fXJldHVybiB2ZX0sSGU9KHZlLGxlLG1lLFplLE9lLG90KT0+e3ZhcntzbG90U2NvcGVJZHM6ZHR9PWxlO2R0JiYoT2U9T2U/T2UuY29uY2F0KGR0KTpkdCk7dmFyIFllPU4odmUpLE90PUVlKEUodmUpLGxlLFllLG1lLFplLE9lLG90KTtyZXR1cm4gT3QmJkphKE90KSYmT3QuZGF0YT09PSJdIj9FKGxlLmFuY2hvcj1PdCk6KE9uPSEwLFIobGUuYW5jaG9yPUsoIl0iLFllKSxZZSxPdCksT3QpfSxydD0odmUsbGUsbWUsWmUsT2Usb3QpPT57aWYoT249ITAsQShgSHlkcmF0aW9uIG5vZGUgbWlzbWF0Y2g6Ci0gQ2xpZW50IHZub2RlOmAsbGUudHlwZSxgCi0gU2VydmVyIHJlbmRlcmVkIERPTTpgLHZlLHZlLm5vZGVUeXBlPT09Mz8iKHRleHQpIjpKYSh2ZSkmJnZlLmRhdGE9PT0iWyI/IihzdGFydCBvZiBmcmFnbWVudCkiOiIiKSxsZS5lbD1udWxsLG90KWZvcih2YXIgZHQ9ZnQodmUpOzspe3ZhciBZZT1FKHZlKTtpZihZZSYmWWUhPT1kdClMKFllKTtlbHNlIGJyZWFrfXZhciBPdD1FKHZlKSxUdD1OKHZlKTtyZXR1cm4gTCh2ZSksZihudWxsLGxlLFR0LE90LG1lLFplLHJvKFR0KSxPZSksT3R9LGZ0PXZlPT57Zm9yKHZhciBsZT0wO3ZlOylpZih2ZT1FKHZlKSx2ZSYmSmEodmUpJiYodmUuZGF0YT09PSJbIiYmbGUrKyx2ZS5kYXRhPT09Il0iKSl7aWYobGU9PT0wKXJldHVybiBFKHZlKTtsZS0tfXJldHVybiB2ZX07cmV0dXJuW3VlLG9lXX12YXIgd2ksJHI7ZnVuY3Rpb24gU3IoaSxhKXtpLmFwcENvbnRleHQuY29uZmlnLnBlcmZvcm1hbmNlJiZkcygpJiYkci5tYXJrKCJ2dWUtIi5jb25jYXQoYSwiLSIpLmNvbmNhdChpLnVpZCkpLF9pKGksYSxkcygpPyRyLm5vdygpOkRhdGUubm93KCkpfWZ1bmN0aW9uIEZpKGksYSl7aWYoaS5hcHBDb250ZXh0LmNvbmZpZy5wZXJmb3JtYW5jZSYmZHMoKSl7dmFyIGY9InZ1ZS0iLmNvbmNhdChhLCItIikuY29uY2F0KGkudWlkKSxwPWYrIjplbmQiOyRyLm1hcmsocCksJHIubWVhc3VyZSgiPCIuY29uY2F0KFZzKGksaS50eXBlKSwiPiAiKS5jb25jYXQoYSksZixwKSwkci5jbGVhck1hcmtzKGYpLCRyLmNsZWFyTWFya3MocCl9QW8oaSxhLGRzKCk/JHIubm93KCk6RGF0ZS5ub3coKSl9ZnVuY3Rpb24gZHMoKXtyZXR1cm4gd2khPT12b2lkIDB8fCh0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmd2luZG93LnBlcmZvcm1hbmNlPyh3aT0hMCwkcj13aW5kb3cucGVyZm9ybWFuY2UpOndpPSExKSx3aX1mdW5jdGlvbiBqbigpe3ZhciBpPVtdO2lmKGkubGVuZ3RoKXt2YXIgYT1pLmxlbmd0aD4xO2NvbnNvbGUud2FybigiRmVhdHVyZSBmbGFnIi5jb25jYXQoYT8icyI6IiIsIiAiKS5jb25jYXQoaS5qb2luKCIsICIpLCIgIikuY29uY2F0KGE/ImFyZSI6ImlzIiwiIG5vdCBleHBsaWNpdGx5IGRlZmluZWQuIFlvdSBhcmUgcnVubmluZyB0aGUgZXNtLWJ1bmRsZXIgYnVpbGQgb2YgVnVlLCAiKStgd2hpY2ggZXhwZWN0cyB0aGVzZSBjb21waWxlLXRpbWUgZmVhdHVyZSBmbGFncyB0byBiZSBnbG9iYWxseSBpbmplY3RlZCB2aWEgdGhlIGJ1bmRsZXIgY29uZmlnIGluIG9yZGVyIHRvIGdldCBiZXR0ZXIgdHJlZS1zaGFraW5nIGluIHRoZSBwcm9kdWN0aW9uIGJ1bmRsZS4KCkZvciBtb3JlIGRldGFpbHMsIHNlZSBodHRwczovL2xpbmsudnVlanMub3JnL2ZlYXR1cmUtZmxhZ3MuYCl9fXZhciBDcj1rbjtmdW5jdGlvbiBocyhpKXtyZXR1cm4gdm8oaSl9ZnVuY3Rpb24gU2koaSl7cmV0dXJuIHZvKGksQWEpfWZ1bmN0aW9uIHZvKGksYSl7am4oKTt2YXIgZj11LmdldEdsb2JhbFRoaXMoKTtmLl9fVlVFX189ITAsUHIoZi5fX1ZVRV9ERVZUT09MU19HTE9CQUxfSE9PS19fLGYpO3ZhcntpbnNlcnQ6cCxyZW1vdmU6dyxwYXRjaFByb3A6RSxmb3JjZVBhdGNoUHJvcDpOLGNyZWF0ZUVsZW1lbnQ6TCxjcmVhdGVUZXh0OlIsY3JlYXRlQ29tbWVudDpLLHNldFRleHQ6dWUsc2V0RWxlbWVudFRleHQ6b2UscGFyZW50Tm9kZTp0ZSxuZXh0U2libGluZzpFZSxzZXRTY29wZUlkOkhlPXUuTk9PUCxjbG9uZU5vZGU6cnQsaW5zZXJ0U3RhdGljQ29udGVudDpmdH09aSx2ZT1mdW5jdGlvbihqLFgseWUpe3ZhciBEZT1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106bnVsbCx4ZT1hcmd1bWVudHMubGVuZ3RoPjQmJmFyZ3VtZW50c1s0XSE9PXZvaWQgMD9hcmd1bWVudHNbNF06bnVsbCxRZT1hcmd1bWVudHMubGVuZ3RoPjUmJmFyZ3VtZW50c1s1XSE9PXZvaWQgMD9hcmd1bWVudHNbNV06bnVsbCxzdD1hcmd1bWVudHMubGVuZ3RoPjYmJmFyZ3VtZW50c1s2XSE9PXZvaWQgMD9hcmd1bWVudHNbNl06ITEsS2U9YXJndW1lbnRzLmxlbmd0aD43JiZhcmd1bWVudHNbN10hPT12b2lkIDA/YXJndW1lbnRzWzddOm51bGwsZXQ9YXJndW1lbnRzLmxlbmd0aD44JiZhcmd1bWVudHNbOF0hPT12b2lkIDA/YXJndW1lbnRzWzhdOmFyPyExOiEhWC5keW5hbWljQ2hpbGRyZW47aWYoaiE9PVgpe2omJiFzaShqLFgpJiYoRGU9V24oaiksUHQoaix4ZSxRZSwhMCksaj1udWxsKSxYLnBhdGNoRmxhZz09PS0yJiYoZXQ9ITEsWC5keW5hbWljQ2hpbGRyZW49bnVsbCk7dmFye3R5cGU6amUscmVmOlJ0LHNoYXBlRmxhZzpNdH09WDtzd2l0Y2goamUpe2Nhc2UgaXQ6bGUoaixYLHllLERlKTticmVhaztjYXNlIGZuOm1lKGosWCx5ZSxEZSk7YnJlYWs7Y2FzZSBCcjpqPT1udWxsP1plKFgseWUsRGUsc3QpOk9lKGosWCx5ZSxzdCk7YnJlYWs7Y2FzZSBqdDpoZShqLFgseWUsRGUseGUsUWUsc3QsS2UsZXQpO2JyZWFrO2RlZmF1bHQ6TXQmMT9ZZShqLFgseWUsRGUseGUsUWUsc3QsS2UsZXQpOk10JjY/SWUoaixYLHllLERlLHhlLFFlLHN0LEtlLGV0KTpNdCY2NHx8TXQmMTI4P2plLnByb2Nlc3MoaixYLHllLERlLHhlLFFlLHN0LEtlLGV0LHVpKTpBKCJJbnZhbGlkIFZOb2RlIHR5cGU6IixqZSwiKCIuY29uY2F0KHR5cGVvZiBqZSwiKSIpKX1SdCE9bnVsbCYmeGUmJnVyKFJ0LGomJmoucmVmLFFlLFh8fGosIVgpfX0sbGU9KGosWCx5ZSxEZSk9PntpZihqPT1udWxsKXAoWC5lbD1SKFguY2hpbGRyZW4seWUpLHllLERlKTtlbHNle3ZhciB4ZT1YLmVsPWouZWw7WC5jaGlsZHJlbiE9PWouY2hpbGRyZW4mJnVlKHhlLFguY2hpbGRyZW4pfX0sbWU9KGosWCx5ZSxEZSk9PntqPT1udWxsP3AoWC5lbD1LKFguY2hpbGRyZW58fCIiLHllKSx5ZSxEZSk6WC5lbD1qLmVsfSxaZT0oaixYLHllLERlKT0+e1tqLmVsLGouYW5jaG9yXT1mdChqLmNoaWxkcmVuLFgseWUsRGUsai5lbCxqLmFuY2hvcil9LE9lPShqLFgseWUsRGUpPT57aWYoWC5jaGlsZHJlbiE9PWouY2hpbGRyZW4pe3ZhciB4ZT1FZShqLmFuY2hvcik7ZHQoaiksW1guZWwsWC5hbmNob3JdPWZ0KFguY2hpbGRyZW4seWUseGUsRGUpfWVsc2UgWC5lbD1qLmVsLFguYW5jaG9yPWouYW5jaG9yfSxvdD0oaixYLHllKT0+e2Zvcih2YXJ7ZWw6RGUsYW5jaG9yOnhlfT1qLFFlO0RlJiZEZSE9PXhlOylRZT1FZShEZSkscChEZSxYLHllKSxEZT1RZTtwKHhlLFgseWUpfSxkdD1qPT57Zm9yKHZhcntlbDpYLGFuY2hvcjp5ZX09aixEZTtYJiZYIT09eWU7KURlPUVlKFgpLHcoWCksWD1EZTt3KHllKX0sWWU9KGosWCx5ZSxEZSx4ZSxRZSxzdCxLZSxldCk9PntzdD1zdHx8WC50eXBlPT09InN2ZyIsaj09bnVsbD9PdChYLHllLERlLHhlLFFlLHN0LEtlLGV0KTokdChqLFgseGUsUWUsc3QsS2UsZXQpfSxPdD0oaixYLHllLERlLHhlLFFlLHN0LEtlKT0+e3ZhciBldCxqZSx7dHlwZTpSdCxwcm9wczpNdCxzaGFwZUZsYWc6eHQsdHJhbnNpdGlvbjpibixwYXRjaEZsYWc6JGksZGlyczpabn09ajt7aWYoZXQ9ai5lbD1MKGoudHlwZSxYKSx4dCY4P29lKGV0LGouY2hpbGRyZW4pOnh0JjE2JiZ3dChqLmNoaWxkcmVuLGV0LG51bGwsRGUseGUsUWUmJlJ0IT09ImZvcmVpZ25PYmplY3QiLHN0LEtlKSxabiYmRWkoaixudWxsLERlLCJjcmVhdGVkIiksTXQpe2Zvcih2YXIgUXIgaW4gTXQpUXIhPT0idmFsdWUiJiYhdS5pc1Jlc2VydmVkUHJvcChRcikmJkUoZXQsUXIsbnVsbCxNdFtRcl0sUWUsai5jaGlsZHJlbixEZSx4ZSxnbik7InZhbHVlImluIE10JiZFKGV0LCJ2YWx1ZSIsbnVsbCxNdC52YWx1ZSksKGplPU10Lm9uVm5vZGVCZWZvcmVNb3VudCkmJmxpKGplLERlLGopfVR0KGV0LGosai5zY29wZUlkLHN0LERlKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZXQsIl9fdm5vZGUiLHt2YWx1ZTpqLGVudW1lcmFibGU6ITF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZXQsIl9fdnVlUGFyZW50Q29tcG9uZW50Iix7dmFsdWU6RGUsZW51bWVyYWJsZTohMX0pLFpuJiZFaShqLG51bGwsRGUsImJlZm9yZU1vdW50Iik7dmFyIGFvPSgheGV8fHhlJiYheGUucGVuZGluZ0JyYW5jaCkmJmJuJiYhYm4ucGVyc2lzdGVkO2FvJiZibi5iZWZvcmVFbnRlcihldCkscChldCxYLHllKSwoKGplPU10JiZNdC5vblZub2RlTW91bnRlZCl8fGFvfHxabikmJkNyKCgpPT57amUmJmxpKGplLERlLGopLGFvJiZibi5lbnRlcihldCksWm4mJkVpKGosbnVsbCxEZSwibW91bnRlZCIpfSx4ZSl9LFR0PShqLFgseWUsRGUseGUpPT57aWYoeWUmJkhlKGoseWUpLERlKWZvcih2YXIgUWU9MDtRZTxEZS5sZW5ndGg7UWUrKylIZShqLERlW1FlXSk7aWYoeGUpe3ZhciBzdD14ZS5zdWJUcmVlO2lmKHN0LnBhdGNoRmxhZz4wJiZzdC5wYXRjaEZsYWcmMjA0OCYmKHN0PVlyKHN0LmNoaWxkcmVuKXx8c3QpLFg9PT1zdCl7dmFyIEtlPXhlLnZub2RlO1R0KGosS2UsS2Uuc2NvcGVJZCxLZS5zbG90U2NvcGVJZHMseGUucGFyZW50KX19fSx3dD1mdW5jdGlvbihqLFgseWUsRGUseGUsUWUsc3QsS2Upe2Zvcih2YXIgZXQ9YXJndW1lbnRzLmxlbmd0aD44JiZhcmd1bWVudHNbOF0hPT12b2lkIDA/YXJndW1lbnRzWzhdOjAsamU9ZXQ7amU8ai5sZW5ndGg7amUrKyl7dmFyIFJ0PWpbamVdPUtlP1ZpKGpbamVdKTpUbihqW2plXSk7dmUobnVsbCxSdCxYLHllLERlLHhlLFFlLHN0LEtlKX19LCR0PShqLFgseWUsRGUseGUsUWUsc3QpPT57dmFyIEtlPVguZWw9ai5lbCx7cGF0Y2hGbGFnOmV0LGR5bmFtaWNDaGlsZHJlbjpqZSxkaXJzOlJ0fT1YO2V0fD1qLnBhdGNoRmxhZyYxNjt2YXIgTXQ9ai5wcm9wc3x8dS5FTVBUWV9PQkoseHQ9WC5wcm9wc3x8dS5FTVBUWV9PQkosYm47eWUmJmFpKHllLCExKSwoYm49eHQub25Wbm9kZUJlZm9yZVVwZGF0ZSkmJmxpKGJuLHllLFgsaiksUnQmJkVpKFgsaix5ZSwiYmVmb3JlVXBkYXRlIikseWUmJmFpKHllLCEwKSxhciYmKGV0PTAsc3Q9ITEsamU9bnVsbCk7dmFyICRpPXhlJiZYLnR5cGUhPT0iZm9yZWlnbk9iamVjdCI7aWYoamU/KHgoai5keW5hbWljQ2hpbGRyZW4samUsS2UseWUsRGUsJGksUWUpLHllJiZ5ZS50eXBlLl9faG1ySWQmJk1vKGosWCkpOnN0fHx0dChqLFgsS2UsbnVsbCx5ZSxEZSwkaSxRZSwhMSksZXQ+MCl7aWYoZXQmMTYpVShLZSxYLE10LHh0LHllLERlLHhlKTtlbHNlIGlmKGV0JjImJk10LmNsYXNzIT09eHQuY2xhc3MmJkUoS2UsImNsYXNzIixudWxsLHh0LmNsYXNzLHhlKSxldCY0JiZFKEtlLCJzdHlsZSIsTXQuc3R5bGUseHQuc3R5bGUseGUpLGV0JjgpZm9yKHZhciBabj1YLmR5bmFtaWNQcm9wcyxRcj0wO1FyPFpuLmxlbmd0aDtRcisrKXt2YXIgYW89Wm5bUXJdLE1hPU10W2FvXSx0YT14dFthb107KHRhIT09TWF8fGFvPT09InZhbHVlInx8TiYmTihLZSxhbykpJiZFKEtlLGFvLE1hLHRhLHhlLGouY2hpbGRyZW4seWUsRGUsZ24pfWV0JjEmJmouY2hpbGRyZW4hPT1YLmNoaWxkcmVuJiZvZShLZSxYLmNoaWxkcmVuKX1lbHNlIXN0JiZqZT09bnVsbCYmVShLZSxYLE10LHh0LHllLERlLHhlKTsoKGJuPXh0Lm9uVm5vZGVVcGRhdGVkKXx8UnQpJiZDcigoKT0+e2JuJiZsaShibix5ZSxYLGopLFJ0JiZFaShYLGoseWUsInVwZGF0ZWQiKX0sRGUpfSx4PShqLFgseWUsRGUseGUsUWUsc3QpPT57Zm9yKHZhciBLZT0wO0tlPFgubGVuZ3RoO0tlKyspe3ZhciBldD1qW0tlXSxqZT1YW0tlXSxSdD1ldC5lbCYmKGV0LnR5cGU9PT1qdHx8IXNpKGV0LGplKXx8ZXQuc2hhcGVGbGFnJig2fDY0KSk/dGUoZXQuZWwpOnllO3ZlKGV0LGplLFJ0LG51bGwsRGUseGUsUWUsc3QsITApfX0sVT0oaixYLHllLERlLHhlLFFlLHN0KT0+e2lmKHllIT09RGUpe2Zvcih2YXIgS2UgaW4gRGUpaWYoIXUuaXNSZXNlcnZlZFByb3AoS2UpKXt2YXIgZXQ9RGVbS2VdLGplPXllW0tlXTsoZXQhPT1qZSYmS2UhPT0idmFsdWUifHxOJiZOKGosS2UpKSYmRShqLEtlLGplLGV0LHN0LFguY2hpbGRyZW4seGUsUWUsZ24pfWlmKHllIT09dS5FTVBUWV9PQkopZm9yKHZhciBSdCBpbiB5ZSkhdS5pc1Jlc2VydmVkUHJvcChSdCkmJiEoUnQgaW4gRGUpJiZFKGosUnQseWVbUnRdLG51bGwsc3QsWC5jaGlsZHJlbix4ZSxRZSxnbik7InZhbHVlImluIERlJiZFKGosInZhbHVlIix5ZS52YWx1ZSxEZS52YWx1ZSl9fSxoZT0oaixYLHllLERlLHhlLFFlLHN0LEtlLGV0KT0+e3ZhciBqZT1YLmVsPWo/ai5lbDpSKCIiLHllKSxSdD1YLmFuY2hvcj1qP2ouYW5jaG9yOlIoIiIseWUpLHtwYXRjaEZsYWc6TXQsZHluYW1pY0NoaWxkcmVuOnh0LHNsb3RTY29wZUlkczpibn09WDsoYXJ8fE10JjIwNDgpJiYoTXQ9MCxldD0hMSx4dD1udWxsKSxibiYmKEtlPUtlP0tlLmNvbmNhdChibik6Ym4pLGo9PW51bGw/KHAoamUseWUsRGUpLHAoUnQseWUsRGUpLHd0KFguY2hpbGRyZW4seWUsUnQseGUsUWUsc3QsS2UsZXQpKTpNdD4wJiZNdCY2NCYmeHQmJmouZHluYW1pY0NoaWxkcmVuPyh4KGouZHluYW1pY0NoaWxkcmVuLHh0LHllLHhlLFFlLHN0LEtlKSx4ZSYmeGUudHlwZS5fX2htcklkP01vKGosWCk6KFgua2V5IT1udWxsfHx4ZSYmWD09PXhlLnN1YlRyZWUpJiZNbyhqLFgsITApKTp0dChqLFgseWUsUnQseGUsUWUsc3QsS2UsZXQpfSxJZT0oaixYLHllLERlLHhlLFFlLHN0LEtlLGV0KT0+e1guc2xvdFNjb3BlSWRzPUtlLGo9PW51bGw/WC5zaGFwZUZsYWcmNTEyP3hlLmN0eC5hY3RpdmF0ZShYLHllLERlLHN0LGV0KTpQZShYLHllLERlLHhlLFFlLHN0LGV0KTpKZShqLFgsZXQpfSxQZT0oaixYLHllLERlLHhlLFFlLHN0KT0+e3ZhciBLZT1qLmNvbXBvbmVudD1KbihqLERlLHhlKTtpZihLZS50eXBlLl9faG1ySWQmJlNvKEtlKSxBdChqKSxTcihLZSwibW91bnQiKSxxbihqKSYmKEtlLmN0eC5yZW5kZXJlcj11aSksU3IoS2UsImluaXQiKSxUbChLZSksRmkoS2UsImluaXQiKSxLZS5hc3luY0RlcCl7aWYoeGUmJnhlLnJlZ2lzdGVyRGVwKEtlLGN0KSwhai5lbCl7dmFyIGV0PUtlLnN1YlRyZWU9em4oZm4pO21lKG51bGwsZXQsWCx5ZSl9cmV0dXJufWlmKGN0KEtlLGosWCx5ZSx4ZSxRZSxzdCksS2UuJHd4c01vZHVsZXMpe3ZhciBqZT1rLnJlc29sdmVPd25lckVsKEtlKTtpZihqZSl7amUuc2V0QXR0cmlidXRlKGsuQVRUUl9WX09XTkVSX0lELEtlLnVpZCk7dmFyeyRyZW5kZXJqc01vZHVsZXM6UnR9PUtlLnR5cGU7UnQmJmplLnNldEF0dHJpYnV0ZShrLkFUVFJfVl9SRU5ERVJKUyxSdCl9fXRuKCksRmkoS2UsIm1vdW50Iil9LEplPShqLFgseWUpPT57dmFyIERlPVguY29tcG9uZW50PWouY29tcG9uZW50O2lmKGJhKGosWCx5ZSkpaWYoRGUuYXN5bmNEZXAmJiFEZS5hc3luY1Jlc29sdmVkKXtBdChYKSxYZShEZSxYLHllKSx0bigpO3JldHVybn1lbHNlIERlLm5leHQ9WCx6aShEZS51cGRhdGUpLERlLnVwZGF0ZSgpO2Vsc2UgWC5lbD1qLmVsLERlLnZub2RlPVh9LGN0PShqLFgseWUsRGUseGUsUWUsc3QpPT57dmFyIEtlPSgpPT57aWYoai5pc01vdW50ZWQpe3ZhcntuZXh0OlVyLGJ1OnVsLHU6ZmkscGFyZW50OkVvLHZub2RlOmJzfT1qLGZsPVVyLGFzO0F0KFVyfHxqLnZub2RlKSxhaShqLCExKSxVcj8oVXIuZWw9YnMuZWwsWGUoaixVcixzdCkpOlVyPWJzLHVsJiZ1Lmludm9rZUFycmF5Rm5zKHVsKSwoYXM9VXIucHJvcHMmJlVyLnByb3BzLm9uVm5vZGVCZWZvcmVVcGRhdGUpJiZsaShhcyxFbyxVcixicyksYWkoaiwhMCksU3IoaiwicmVuZGVyIik7dmFyIHlzPVFpKGopO0ZpKGosInJlbmRlciIpO3ZhciBEYT1qLnN1YlRyZWU7ai5zdWJUcmVlPXlzLFNyKGosInBhdGNoIiksdmUoRGEseXMsdGUoRGEuZWwpLFduKERhKSxqLHhlLFFlKSxGaShqLCJwYXRjaCIpLFVyLmVsPXlzLmVsLGZsPT09bnVsbCYmdW4oaix5cy5lbCksZmkmJkNyKGZpLHhlKSwoYXM9VXIucHJvcHMmJlVyLnByb3BzLm9uVm5vZGVVcGRhdGVkKSYmQ3IoKCk9PmxpKGFzLEVvLFVyLGJzKSx4ZSksS2koaiksdG4oKX1lbHNle3ZhciBSdCx7ZWw6TXQscHJvcHM6eHR9PVgse2JtOmJuLG06JGkscGFyZW50OlpufT1qLFFyPUNuKFgpO2lmKGFpKGosITEpLGJuJiZ1Lmludm9rZUFycmF5Rm5zKGJuKSwhUXImJihSdD14dCYmeHQub25Wbm9kZUJlZm9yZU1vdW50KSYmbGkoUnQsWm4sWCksYWkoaiwhMCksTXQmJkJhKXt2YXIgYW89KCk9PntTcihqLCJyZW5kZXIiKSxqLnN1YlRyZWU9UWkoaiksRmkoaiwicmVuZGVyIiksU3IoaiwiaHlkcmF0ZSIpLEJhKE10LGouc3ViVHJlZSxqLHhlLG51bGwpLEZpKGosImh5ZHJhdGUiKX07UXI/WC50eXBlLl9fYXN5bmNMb2FkZXIoKS50aGVuKCgpPT4hai5pc1VubW91bnRlZCYmYW8oKSk6YW8oKX1lbHNle1NyKGosInJlbmRlciIpO3ZhciBNYT1qLnN1YlRyZWU9UWkoaik7RmkoaiwicmVuZGVyIiksU3IoaiwicGF0Y2giKSx2ZShudWxsLE1hLHllLERlLGoseGUsUWUpLEZpKGosInBhdGNoIiksWC5lbD1NYS5lbH1pZigkaSYmQ3IoJGkseGUpLCFRciYmKFJ0PXh0JiZ4dC5vblZub2RlTW91bnRlZCkpe3ZhciB0YT1YO0NyKCgpPT5saShSdCxabix0YSkseGUpfShYLnNoYXBlRmxhZyYyNTZ8fFpuJiZDbihabi52bm9kZSkmJlpuLnZub2RlLnNoYXBlRmxhZyYyNTYpJiZqLmEmJkNyKGouYSx4ZSksai5pc01vdW50ZWQ9ITAsZXIoaiksWD15ZT1EZT1udWxsfX0sZXQ9ai5lZmZlY3Q9bmV3IEkuUmVhY3RpdmVFZmZlY3QoS2UsKCk9PlBpKGplKSxqLnNjb3BlKSxqZT1qLnVwZGF0ZT0oKT0+ZXQucnVuKCk7amUuaWQ9ai51aWQsYWkoaiwhMCksZXQub25UcmFjaz1qLnJ0Yz9SdD0+dS5pbnZva2VBcnJheUZucyhqLnJ0YyxSdCk6dm9pZCAwLGV0Lm9uVHJpZ2dlcj1qLnJ0Zz9SdD0+dS5pbnZva2VBcnJheUZucyhqLnJ0ZyxSdCk6dm9pZCAwLGplLm93bmVySW5zdGFuY2U9aixqZSgpfSxYZT0oaixYLHllKT0+e1guY29tcG9uZW50PWo7dmFyIERlPWoudm5vZGUucHJvcHM7ai52bm9kZT1YLGoubmV4dD1udWxsLHV0KGosWC5wcm9wcyxEZSx5ZSkscWEoaixYLmNoaWxkcmVuLHllKSxJLnBhdXNlVHJhY2tpbmcoKSxHaSh2b2lkIDAsai51cGRhdGUpLEkucmVzZXRUcmFja2luZygpfSx0dD1mdW5jdGlvbihqLFgseWUsRGUseGUsUWUsc3QsS2Upe3ZhciBldD1hcmd1bWVudHMubGVuZ3RoPjgmJmFyZ3VtZW50c1s4XSE9PXZvaWQgMD9hcmd1bWVudHNbOF06ITEsamU9aiYmai5jaGlsZHJlbixSdD1qP2ouc2hhcGVGbGFnOjAsTXQ9WC5jaGlsZHJlbix7cGF0Y2hGbGFnOnh0LHNoYXBlRmxhZzpibn09WDtpZih4dD4wKXtpZih4dCYxMjgpe0N0KGplLE10LHllLERlLHhlLFFlLHN0LEtlLGV0KTtyZXR1cm59ZWxzZSBpZih4dCYyNTYpe1dlKGplLE10LHllLERlLHhlLFFlLHN0LEtlLGV0KTtyZXR1cm59fWJuJjg/KFJ0JjE2JiZnbihqZSx4ZSxRZSksTXQhPT1qZSYmb2UoeWUsTXQpKTpSdCYxNj9ibiYxNj9DdChqZSxNdCx5ZSxEZSx4ZSxRZSxzdCxLZSxldCk6Z24oamUseGUsUWUsITApOihSdCY4JiZvZSh5ZSwiIiksYm4mMTYmJnd0KE10LHllLERlLHhlLFFlLHN0LEtlLGV0KSl9LFdlPShqLFgseWUsRGUseGUsUWUsc3QsS2UsZXQpPT57aj1qfHx1LkVNUFRZX0FSUixYPVh8fHUuRU1QVFlfQVJSO3ZhciBqZT1qLmxlbmd0aCxSdD1YLmxlbmd0aCxNdD1NYXRoLm1pbihqZSxSdCkseHQ7Zm9yKHh0PTA7eHQ8TXQ7eHQrKyl7dmFyIGJuPVhbeHRdPWV0P1ZpKFhbeHRdKTpUbihYW3h0XSk7dmUoalt4dF0sYm4seWUsbnVsbCx4ZSxRZSxzdCxLZSxldCl9amU+UnQ/Z24oaix4ZSxRZSwhMCwhMSxNdCk6d3QoWCx5ZSxEZSx4ZSxRZSxzdCxLZSxldCxNdCl9LEN0PShqLFgseWUsRGUseGUsUWUsc3QsS2UsZXQpPT57Zm9yKHZhciBqZT0wLFJ0PVgubGVuZ3RoLE10PWoubGVuZ3RoLTEseHQ9UnQtMTtqZTw9TXQmJmplPD14dDspe3ZhciBibj1qW2plXSwkaT1YW2plXT1ldD9WaShYW2plXSk6VG4oWFtqZV0pO2lmKHNpKGJuLCRpKSl2ZShibiwkaSx5ZSxudWxsLHhlLFFlLHN0LEtlLGV0KTtlbHNlIGJyZWFrO2plKyt9Zm9yKDtqZTw9TXQmJmplPD14dDspe3ZhciBabj1qW010XSxRcj1YW3h0XT1ldD9WaShYW3h0XSk6VG4oWFt4dF0pO2lmKHNpKFpuLFFyKSl2ZShabixRcix5ZSxudWxsLHhlLFFlLHN0LEtlLGV0KTtlbHNlIGJyZWFrO010LS0seHQtLX1pZihqZT5NdCl7aWYoamU8PXh0KWZvcih2YXIgYW89eHQrMSxNYT1hbzxSdD9YW2FvXS5lbDpEZTtqZTw9eHQ7KXZlKG51bGwsWFtqZV09ZXQ/VmkoWFtqZV0pOlRuKFhbamVdKSx5ZSxNYSx4ZSxRZSxzdCxLZSxldCksamUrK31lbHNlIGlmKGplPnh0KWZvcig7amU8PU10OylQdChqW2plXSx4ZSxRZSwhMCksamUrKztlbHNle3ZhciB0YT1qZSxVcj1qZSx1bD1uZXcgTWFwO2ZvcihqZT1VcjtqZTw9eHQ7amUrKyl7dmFyIGZpPVhbamVdPWV0P1ZpKFhbamVdKTpUbihYW2plXSk7Zmkua2V5IT1udWxsJiYodWwuaGFzKGZpLmtleSkmJkEoIkR1cGxpY2F0ZSBrZXlzIGZvdW5kIGR1cmluZyB1cGRhdGU6IixKU09OLnN0cmluZ2lmeShmaS5rZXkpLCJNYWtlIHN1cmUga2V5cyBhcmUgdW5pcXVlLiIpLHVsLnNldChmaS5rZXksamUpKX12YXIgRW8sYnM9MCxmbD14dC1VcisxLGFzPSExLHlzPTAsRGE9bmV3IEFycmF5KGZsKTtmb3IoamU9MDtqZTxmbDtqZSsrKURhW2plXT0wO2ZvcihqZT10YTtqZTw9TXQ7amUrKyl7dmFyIFdzPWpbamVdO2lmKGJzPj1mbCl7UHQoV3MseGUsUWUsITApO2NvbnRpbnVlfXZhciBFcz12b2lkIDA7aWYoV3Mua2V5IT1udWxsKUVzPXVsLmdldChXcy5rZXkpO2Vsc2UgZm9yKEVvPVVyO0VvPD14dDtFbysrKWlmKERhW0VvLVVyXT09PTAmJnNpKFdzLFhbRW9dKSl7RXM9RW87YnJlYWt9RXM9PT12b2lkIDA/UHQoV3MseGUsUWUsITApOihEYVtFcy1Vcl09amUrMSxFcz49eXM/eXM9RXM6YXM9ITAsdmUoV3MsWFtFc10seWUsbnVsbCx4ZSxRZSxzdCxLZSxldCksYnMrKyl9dmFyIFhjPWFzP1phKERhKTp1LkVNUFRZX0FSUjtmb3IoRW89WGMubGVuZ3RoLTEsamU9ZmwtMTtqZT49MDtqZS0tKXt2YXIgeWM9VXIramUsUWM9WFt5Y10sZXU9eWMrMTxSdD9YW3ljKzFdLmVsOkRlO0RhW2plXT09PTA/dmUobnVsbCxRYyx5ZSxldSx4ZSxRZSxzdCxLZSxldCk6YXMmJihFbzwwfHxqZSE9PVhjW0VvXT9wdChRYyx5ZSxldSwyKTpFby0tKX19fSxwdD1mdW5jdGlvbihqLFgseWUsRGUpe3ZhciB4ZT1hcmd1bWVudHMubGVuZ3RoPjQmJmFyZ3VtZW50c1s0XSE9PXZvaWQgMD9hcmd1bWVudHNbNF06bnVsbCx7ZWw6UWUsdHlwZTpzdCx0cmFuc2l0aW9uOktlLGNoaWxkcmVuOmV0LHNoYXBlRmxhZzpqZX09ajtpZihqZSY2KXtwdChqLmNvbXBvbmVudC5zdWJUcmVlLFgseWUsRGUpO3JldHVybn1pZihqZSYxMjgpe2ouc3VzcGVuc2UubW92ZShYLHllLERlKTtyZXR1cm59aWYoamUmNjQpe3N0Lm1vdmUoaixYLHllLHVpKTtyZXR1cm59aWYoc3Q9PT1qdCl7cChRZSxYLHllKTtmb3IodmFyIFJ0PTA7UnQ8ZXQubGVuZ3RoO1J0KyspcHQoZXRbUnRdLFgseWUsRGUpO3Aoai5hbmNob3IsWCx5ZSk7cmV0dXJufWlmKHN0PT09QnIpe290KGosWCx5ZSk7cmV0dXJufXZhciBNdD1EZSE9PTImJmplJjEmJktlO2lmKE10KWlmKERlPT09MClLZS5iZWZvcmVFbnRlcihRZSkscChRZSxYLHllKSxDcigoKT0+S2UuZW50ZXIoUWUpLHhlKTtlbHNle3ZhcntsZWF2ZTp4dCxkZWxheUxlYXZlOmJuLGFmdGVyTGVhdmU6JGl9PUtlLFpuPSgpPT5wKFFlLFgseWUpLFFyPSgpPT57eHQoUWUsKCk9PntabigpLCRpJiYkaSgpfSl9O2JuP2JuKFFlLFpuLFFyKTpRcigpfWVsc2UgcChRZSxYLHllKX0sUHQ9ZnVuY3Rpb24oaixYLHllKXt2YXIgRGU9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiExLHhlPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTohMSx7dHlwZTpRZSxwcm9wczpzdCxyZWY6S2UsY2hpbGRyZW46ZXQsZHluYW1pY0NoaWxkcmVuOmplLHNoYXBlRmxhZzpSdCxwYXRjaEZsYWc6TXQsZGlyczp4dH09ajtpZihLZSE9bnVsbCYmdXIoS2UsbnVsbCx5ZSxqLCEwKSxSdCYyNTYpe1guY3R4LmRlYWN0aXZhdGUoaik7cmV0dXJufXZhciBibj1SdCYxJiZ4dCwkaT0hQ24oaiksWm47aWYoJGkmJihabj1zdCYmc3Qub25Wbm9kZUJlZm9yZVVubW91bnQpJiZsaShabixYLGopLFJ0JjYpV3Qoai5jb21wb25lbnQseWUsRGUpO2Vsc2V7aWYoUnQmMTI4KXtqLnN1c3BlbnNlLnVubW91bnQoeWUsRGUpO3JldHVybn1ibiYmRWkoaixudWxsLFgsImJlZm9yZVVubW91bnQiKSxSdCY2ND9qLnR5cGUucmVtb3ZlKGosWCx5ZSx4ZSx1aSxEZSk6amUmJihRZSE9PWp0fHxNdD4wJiZNdCY2NCk/Z24oamUsWCx5ZSwhMSwhMCk6KFFlPT09anQmJk10JigxMjh8MjU2KXx8IXhlJiZSdCYxNikmJmduKGV0LFgseWUpLERlJiZlbihqKX0oJGkmJihabj1zdCYmc3Qub25Wbm9kZVVubW91bnRlZCl8fGJuKSYmQ3IoKCk9PntabiYmbGkoWm4sWCxqKSxibiYmRWkoaixudWxsLFgsInVubW91bnRlZCIpfSx5ZSl9LGVuPWo9Pnt2YXJ7dHlwZTpYLGVsOnllLGFuY2hvcjpEZSx0cmFuc2l0aW9uOnhlfT1qO2lmKFg9PT1qdCl7ai5wYXRjaEZsYWc+MCYmai5wYXRjaEZsYWcmMjA0OCYmeGUmJiF4ZS5wZXJzaXN0ZWQ/ai5jaGlsZHJlbi5mb3JFYWNoKGplPT57amUudHlwZT09PWZuP3coamUuZWwpOmVuKGplKX0pOm5uKHllLERlKTtyZXR1cm59aWYoWD09PUJyKXtkdChqKTtyZXR1cm59dmFyIFFlPSgpPT57dyh5ZSkseGUmJiF4ZS5wZXJzaXN0ZWQmJnhlLmFmdGVyTGVhdmUmJnhlLmFmdGVyTGVhdmUoKX07aWYoai5zaGFwZUZsYWcmMSYmeGUmJiF4ZS5wZXJzaXN0ZWQpe3ZhcntsZWF2ZTpzdCxkZWxheUxlYXZlOktlfT14ZSxldD0oKT0+c3QoeWUsUWUpO0tlP0tlKGouZWwsUWUsZXQpOmV0KCl9ZWxzZSBRZSgpfSxubj0oaixYKT0+e2Zvcih2YXIgeWU7aiE9PVg7KXllPUVlKGopLHcoaiksaj15ZTt3KFgpfSxXdD0oaixYLHllKT0+e2oudHlwZS5fX2htcklkJiZDbyhqKTt2YXJ7YnVtOkRlLHNjb3BlOnhlLHVwZGF0ZTpRZSxzdWJUcmVlOnN0LHVtOktlfT1qO0RlJiZ1Lmludm9rZUFycmF5Rm5zKERlKSx4ZS5zdG9wKCksUWUmJihRZS5hY3RpdmU9ITEsUHQoc3QsaixYLHllKSksS2UmJkNyKEtlLFgpLENyKCgpPT57ai5pc1VubW91bnRlZD0hMH0sWCksWCYmWC5wZW5kaW5nQnJhbmNoJiYhWC5pc1VubW91bnRlZCYmai5hc3luY0RlcCYmIWouYXN5bmNSZXNvbHZlZCYmai5zdXNwZW5zZUlkPT09WC5wZW5kaW5nSWQmJihYLmRlcHMtLSxYLmRlcHM9PT0wJiZYLnJlc29sdmUoKSksSmkoail9LGduPWZ1bmN0aW9uKGosWCx5ZSl7Zm9yKHZhciBEZT1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106ITEseGU9YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOiExLFFlPWFyZ3VtZW50cy5sZW5ndGg+NSYmYXJndW1lbnRzWzVdIT09dm9pZCAwP2FyZ3VtZW50c1s1XTowLHN0PVFlO3N0PGoubGVuZ3RoO3N0KyspUHQoaltzdF0sWCx5ZSxEZSx4ZSl9LFduPWo9Pmouc2hhcGVGbGFnJjY/V24oai5jb21wb25lbnQuc3ViVHJlZSk6ai5zaGFwZUZsYWcmMTI4P2ouc3VzcGVuc2UubmV4dCgpOkVlKGouYW5jaG9yfHxqLmVsKSxWbz0oaixYLHllKT0+e2o9PW51bGw/WC5fdm5vZGUmJlB0KFguX3Zub2RlLG51bGwsbnVsbCwhMCk6dmUoWC5fdm5vZGV8fG51bGwsaixYLG51bGwsbnVsbCxudWxsLHllKSxoaSgpLFguX3Zub2RlPWp9LHVpPXtwOnZlLHVtOlB0LG06cHQscjplbixtdDpQZSxtYzp3dCxwYzp0dCxwYmM6eCxuOlduLG86aX0saHIsQmE7cmV0dXJuIGEmJihbaHIsQmFdPWEodWkpKSx7cmVuZGVyOlZvLGh5ZHJhdGU6aHIsY3JlYXRlQXBwOkRpKFZvLGhyKX19ZnVuY3Rpb24gYWkoaSxhKXt2YXJ7ZWZmZWN0OmYsdXBkYXRlOnB9PWk7Zi5hbGxvd1JlY3Vyc2U9cC5hbGxvd1JlY3Vyc2U9YX1mdW5jdGlvbiBNbyhpLGEpe3ZhciBmPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTohMSxwPWkuY2hpbGRyZW4sdz1hLmNoaWxkcmVuO2lmKHUuaXNBcnJheShwKSYmdS5pc0FycmF5KHcpKWZvcih2YXIgRT0wO0U8cC5sZW5ndGg7RSsrKXt2YXIgTj1wW0VdLEw9d1tFXTtMLnNoYXBlRmxhZyYxJiYhTC5keW5hbWljQ2hpbGRyZW4mJigoTC5wYXRjaEZsYWc8PTB8fEwucGF0Y2hGbGFnPT09MzIpJiYoTD13W0VdPVZpKHdbRV0pLEwuZWw9Ti5lbCksZnx8TW8oTixMKSksTC50eXBlPT09Zm4mJiFMLmVsJiYoTC5lbD1OLmVsKX19ZnVuY3Rpb24gWmEoaSl7dmFyIGE9aS5zbGljZSgpLGY9WzBdLHAsdyxFLE4sTCxSPWkubGVuZ3RoO2ZvcihwPTA7cDxSO3ArKyl7dmFyIEs9aVtwXTtpZihLIT09MCl7aWYodz1mW2YubGVuZ3RoLTFdLGlbd108Syl7YVtwXT13LGYucHVzaChwKTtjb250aW51ZX1mb3IoRT0wLE49Zi5sZW5ndGgtMTtFPE47KUw9RStOPj4xLGlbZltMXV08Sz9FPUwrMTpOPUw7SzxpW2ZbRV1dJiYoRT4wJiYoYVtwXT1mW0UtMV0pLGZbRV09cCl9fWZvcihFPWYubGVuZ3RoLE49ZltFLTFdO0UtLSA+MDspZltFXT1OLE49YVtOXTtyZXR1cm4gZn12YXIgQ2k9aT0+aS5fX2lzVGVsZXBvcnQsbW89aT0+aSYmKGkuZGlzYWJsZWR8fGkuZGlzYWJsZWQ9PT0iIiksWGE9aT0+dHlwZW9mIFNWR0VsZW1lbnQhPSJ1bmRlZmluZWQiJiZpIGluc3RhbmNlb2YgU1ZHRWxlbWVudCxEcz0oaSxhKT0+e3ZhciBmPWkmJmkudG87aWYodS5pc1N0cmluZyhmKSlpZihhKXt2YXIgcD1hKGYpO3JldHVybiBwfHxBKCdGYWlsZWQgdG8gbG9jYXRlIFRlbGVwb3J0IHRhcmdldCB3aXRoIHNlbGVjdG9yICInLmNvbmNhdChmLCciLiAnKSsiTm90ZSB0aGUgdGFyZ2V0IGVsZW1lbnQgbXVzdCBleGlzdCBiZWZvcmUgdGhlIGNvbXBvbmVudCBpcyBtb3VudGVkIC0gaS5lLiB0aGUgdGFyZ2V0IGNhbm5vdCBiZSByZW5kZXJlZCBieSB0aGUgY29tcG9uZW50IGl0c2VsZiwgYW5kIGlkZWFsbHkgc2hvdWxkIGJlIG91dHNpZGUgb2YgdGhlIGVudGlyZSBWdWUgY29tcG9uZW50IHRyZWUuIikscH1lbHNlIHJldHVybiBBKCJDdXJyZW50IHJlbmRlcmVyIGRvZXMgbm90IHN1cHBvcnQgc3RyaW5nIHRhcmdldCBmb3IgVGVsZXBvcnRzLiAobWlzc2luZyBxdWVyeVNlbGVjdG9yIHJlbmRlcmVyIG9wdGlvbikiKSxudWxsO2Vsc2UgcmV0dXJuIWYmJiFtbyhpKSYmQSgiSW52YWxpZCBUZWxlcG9ydCB0YXJnZXQ6ICIuY29uY2F0KGYpKSxmfSxVZT17X19pc1RlbGVwb3J0OiEwLHByb2Nlc3MoaSxhLGYscCx3LEUsTixMLFIsSyl7dmFye21jOnVlLHBjOm9lLHBiYzp0ZSxvOntpbnNlcnQ6RWUscXVlcnlTZWxlY3RvcjpIZSxjcmVhdGVUZXh0OnJ0LGNyZWF0ZUNvbW1lbnQ6ZnR9fT1LLHZlPW1vKGEucHJvcHMpLHtzaGFwZUZsYWc6bGUsY2hpbGRyZW46bWUsZHluYW1pY0NoaWxkcmVuOlplfT1hO2lmKGFyJiYoUj0hMSxaZT1udWxsKSxpPT1udWxsKXt2YXIgT2U9YS5lbD1mdCgidGVsZXBvcnQgc3RhcnQiLGYpLG90PWEuYW5jaG9yPWZ0KCJ0ZWxlcG9ydCBlbmQiLGYpO0VlKE9lLGYscCksRWUob3QsZixwKTt2YXIgZHQ9YS50YXJnZXQ9RHMoYS5wcm9wcyxIZSksWWU9YS50YXJnZXRBbmNob3I9cnQoIiIsZik7ZHQ/KEVlKFllLGR0KSxOPU58fFhhKGR0KSk6dmV8fEEoIkludmFsaWQgVGVsZXBvcnQgdGFyZ2V0IG9uIG1vdW50OiIsZHQsIigiLmNvbmNhdCh0eXBlb2YgZHQsIikiKSk7dmFyIE90PShQZSxKZSk9PntsZSYxNiYmdWUobWUsUGUsSmUsdyxFLE4sTCxSKX07dmU/T3QoZixvdCk6ZHQmJk90KGR0LFllKX1lbHNle2EuZWw9aS5lbDt2YXIgVHQ9YS5hbmNob3I9aS5hbmNob3Isd3Q9YS50YXJnZXQ9aS50YXJnZXQsJHQ9YS50YXJnZXRBbmNob3I9aS50YXJnZXRBbmNob3IseD1tbyhpLnByb3BzKSxVPXg/Zjp3dCxoZT14P1R0OiR0O2lmKE49Tnx8WGEod3QpLFplPyh0ZShpLmR5bmFtaWNDaGlsZHJlbixaZSxVLHcsRSxOLEwpLE1vKGksYSwhMCkpOlJ8fG9lKGksYSxVLGhlLHcsRSxOLEwsITEpLHZlKXh8fEl0KGEsZixUdCxLLDEpO2Vsc2UgaWYoKGEucHJvcHMmJmEucHJvcHMudG8pIT09KGkucHJvcHMmJmkucHJvcHMudG8pKXt2YXIgSWU9YS50YXJnZXQ9RHMoYS5wcm9wcyxIZSk7SWU/SXQoYSxJZSxudWxsLEssMCk6QSgiSW52YWxpZCBUZWxlcG9ydCB0YXJnZXQgb24gdXBkYXRlOiIsd3QsIigiLmNvbmNhdCh0eXBlb2Ygd3QsIikiKSl9ZWxzZSB4JiZJdChhLHd0LCR0LEssMSl9fSxyZW1vdmUoaSxhLGYscCx3LEUpe3Zhcnt1bTpOLG86e3JlbW92ZTpMfX09dyx7c2hhcGVGbGFnOlIsY2hpbGRyZW46SyxhbmNob3I6dWUsdGFyZ2V0QW5jaG9yOm9lLHRhcmdldDp0ZSxwcm9wczpFZX09aTtpZih0ZSYmTChvZSksKEV8fCFtbyhFZSkpJiYoTCh1ZSksUiYxNikpZm9yKHZhciBIZT0wO0hlPEsubGVuZ3RoO0hlKyspe3ZhciBydD1LW0hlXTtOKHJ0LGEsZiwhMCwhIXJ0LmR5bmFtaWNDaGlsZHJlbil9fSxtb3ZlOkl0LGh5ZHJhdGU6QnR9O2Z1bmN0aW9uIEl0KGksYSxmLHApe3ZhcntvOntpbnNlcnQ6d30sbTpFfT1wLE49YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOjI7Tj09PTAmJncoaS50YXJnZXRBbmNob3IsYSxmKTt2YXJ7ZWw6TCxhbmNob3I6UixzaGFwZUZsYWc6SyxjaGlsZHJlbjp1ZSxwcm9wczpvZX09aSx0ZT1OPT09MjtpZih0ZSYmdyhMLGEsZiksKCF0ZXx8bW8ob2UpKSYmSyYxNilmb3IodmFyIEVlPTA7RWU8dWUubGVuZ3RoO0VlKyspRSh1ZVtFZV0sYSxmLDIpO3RlJiZ3KFIsYSxmKX1mdW5jdGlvbiBCdChpLGEsZixwLHcsRSxOLEwpe3ZhcntvOntuZXh0U2libGluZzpSLHBhcmVudE5vZGU6SyxxdWVyeVNlbGVjdG9yOnVlfX09TixvZT1hLnRhcmdldD1EcyhhLnByb3BzLHVlKTtpZihvZSl7dmFyIHRlPW9lLl9scGF8fG9lLmZpcnN0Q2hpbGQ7aWYoYS5zaGFwZUZsYWcmMTYpaWYobW8oYS5wcm9wcykpYS5hbmNob3I9TChSKGkpLGEsSyhpKSxmLHAsdyxFKSxhLnRhcmdldEFuY2hvcj10ZTtlbHNle2EuYW5jaG9yPVIoaSk7Zm9yKHZhciBFZT10ZTtFZTspaWYoRWU9UihFZSksRWUmJkVlLm5vZGVUeXBlPT09OCYmRWUuZGF0YT09PSJ0ZWxlcG9ydCBhbmNob3IiKXthLnRhcmdldEFuY2hvcj1FZSxvZS5fbHBhPWEudGFyZ2V0QW5jaG9yJiZSKGEudGFyZ2V0QW5jaG9yKTticmVha31MKHRlLGEsb2UsZixwLHcsRSl9fXJldHVybiBhLmFuY2hvciYmUihhLmFuY2hvcil9dmFyIEh0PVVlLGp0PVN5bWJvbCgiRnJhZ21lbnQiKSxpdD1TeW1ib2woIlRleHQiKSxmbj1TeW1ib2woIkNvbW1lbnQiKSxCcj1TeW1ib2woIlN0YXRpYyIpLHJyPVtdLE1yPW51bGw7ZnVuY3Rpb24gX28oKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXZvaWQgMD9hcmd1bWVudHNbMF06ITE7cnIucHVzaChNcj1pP251bGw6W10pfWZ1bmN0aW9uIE9hKCl7cnIucG9wKCksTXI9cnJbcnIubGVuZ3RoLTFdfHxudWxsfXZhciBLbz0xO2Z1bmN0aW9uIGVsKGkpe0tvKz1pfWZ1bmN0aW9uIG5jKGkpe3JldHVybiBpLmR5bmFtaWNDaGlsZHJlbj1Lbz4wP01yfHx1LkVNUFRZX0FSUjpudWxsLE9hKCksS28+MCYmTXImJk1yLnB1c2goaSksaX1mdW5jdGlvbiB3bChpLGEsZixwLHcsRSl7cmV0dXJuIG5jKE1uKGksYSxmLHAsdyxFLCEwKSl9ZnVuY3Rpb24gYm8oaSxhLGYscCx3KXtyZXR1cm4gbmMoem4oaSxhLGYscCx3LCEwKSl9ZnVuY3Rpb24gZnIoaSl7cmV0dXJuIGk/aS5fX3ZfaXNWTm9kZT09PSEwOiExfWZ1bmN0aW9uIHNpKGksYSl7cmV0dXJuIGEuc2hhcGVGbGFnJjYmJklyLmhhcyhhLnR5cGUpPyExOmkudHlwZT09PWEudHlwZSYmaS5rZXk9PT1hLmtleX12YXIgVGE7ZnVuY3Rpb24gU2woaSl7VGE9aX12YXIgRnM9ZnVuY3Rpb24oKXtmb3IodmFyIGk9YXJndW1lbnRzLmxlbmd0aCxhPW5ldyBBcnJheShpKSxmPTA7ZjxpO2YrKylhW2ZdPWFyZ3VtZW50c1tmXTtyZXR1cm4gQ2woLi4uVGE/VGEoYSxTbik6YSl9LERvPSJfX3ZJbnRlcm5hbCIsUWE9aT0+e3ZhcntrZXk6YX09aTtyZXR1cm4gYSE9bnVsbD9hOm51bGx9LHBzPWk9Pnt2YXJ7cmVmOmEscmVmX2tleTpmLHJlZl9mb3I6cH09aTtyZXR1cm4gYSE9bnVsbD91LmlzU3RyaW5nKGEpfHxJLmlzUmVmKGEpfHx1LmlzRnVuY3Rpb24oYSk/e2k6U24scjphLGs6ZixmOiEhcH06YTpudWxsfTtmdW5jdGlvbiBNbihpKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06bnVsbCxmPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTpudWxsLHA9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOjAsdz1hcmd1bWVudHMubGVuZ3RoPjQmJmFyZ3VtZW50c1s0XSE9PXZvaWQgMD9hcmd1bWVudHNbNF06bnVsbCxFPWFyZ3VtZW50cy5sZW5ndGg+NSYmYXJndW1lbnRzWzVdIT09dm9pZCAwP2FyZ3VtZW50c1s1XTppPT09anQ/MDoxLE49YXJndW1lbnRzLmxlbmd0aD42JiZhcmd1bWVudHNbNl0hPT12b2lkIDA/YXJndW1lbnRzWzZdOiExLEw9YXJndW1lbnRzLmxlbmd0aD43JiZhcmd1bWVudHNbN10hPT12b2lkIDA/YXJndW1lbnRzWzddOiExLFI9e19fdl9pc1ZOb2RlOiEwLF9fdl9za2lwOiEwLHR5cGU6aSxwcm9wczphLGtleTphJiZRYShhKSxyZWY6YSYmcHMoYSksc2NvcGVJZDpObixzbG90U2NvcGVJZHM6bnVsbCxjaGlsZHJlbjpmLGNvbXBvbmVudDpudWxsLHN1c3BlbnNlOm51bGwsc3NDb250ZW50Om51bGwsc3NGYWxsYmFjazpudWxsLGRpcnM6bnVsbCx0cmFuc2l0aW9uOm51bGwsZWw6bnVsbCxhbmNob3I6bnVsbCx0YXJnZXQ6bnVsbCx0YXJnZXRBbmNob3I6bnVsbCxzdGF0aWNDb3VudDowLHNoYXBlRmxhZzpFLHBhdGNoRmxhZzpwLGR5bmFtaWNQcm9wczp3LGR5bmFtaWNDaGlsZHJlbjpudWxsLGFwcENvbnRleHQ6bnVsbH07cmV0dXJuIEw/KElhKFIsZiksRSYxMjgmJmkubm9ybWFsaXplKFIpKTpmJiYoUi5zaGFwZUZsYWd8PXUuaXNTdHJpbmcoZik/ODoxNiksUi5rZXkhPT1SLmtleSYmQSgiVk5vZGUgY3JlYXRlZCB3aXRoIGludmFsaWQga2V5IChOYU4pLiBWTm9kZSB0eXBlOiIsUi50eXBlKSxLbz4wJiYhTiYmTXImJihSLnBhdGNoRmxhZz4wfHxFJjYpJiZSLnBhdGNoRmxhZyE9PTMyJiZNci5wdXNoKFIpLFJ9dmFyIHpuPUZzO2Z1bmN0aW9uIENsKGkpe3ZhciBhPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTpudWxsLGY9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOm51bGwscD1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106MCx3PWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTpudWxsLEU9YXJndW1lbnRzLmxlbmd0aD41JiZhcmd1bWVudHNbNV0hPT12b2lkIDA/YXJndW1lbnRzWzVdOiExO2lmKCghaXx8aT09PWZvKSYmKGl8fEEoIkludmFsaWQgdm5vZGUgdHlwZSB3aGVuIGNyZWF0aW5nIHZub2RlOiAiLmNvbmNhdChpLCIuIikpLGk9Zm4pLGZyKGkpKXt2YXIgTj1BaShpLGEsITApO3JldHVybiBmJiZJYShOLGYpLEtvPjAmJiFFJiZNciYmKE4uc2hhcGVGbGFnJjY/TXJbTXIuaW5kZXhPZihpKV09TjpNci5wdXNoKE4pKSxOLnBhdGNoRmxhZ3w9LTIsTn1pZih4bChpKSYmKGk9aS5fX3ZjY09wdHMpLGEpe2E9TGkoYSk7dmFye2NsYXNzOkwsc3R5bGU6Un09YTtMJiYhdS5pc1N0cmluZyhMKSYmKGEuY2xhc3M9dS5ub3JtYWxpemVDbGFzcyhMKSksdS5pc09iamVjdChSKSYmKEkuaXNQcm94eShSKSYmIXUuaXNBcnJheShSKSYmKFI9dS5leHRlbmQoe30sUikpLGEuc3R5bGU9dS5ub3JtYWxpemVTdHlsZShSKSl9dmFyIEs9dS5pc1N0cmluZyhpKT8xOnFyKGkpPzEyODpDaShpKT82NDp1LmlzT2JqZWN0KGkpPzQ6dS5pc0Z1bmN0aW9uKGkpPzI6MDtyZXR1cm4gSyY0JiZJLmlzUHJveHkoaSkmJihpPUkudG9SYXcoaSksQSgiVnVlIHJlY2VpdmVkIGEgQ29tcG9uZW50IHdoaWNoIHdhcyBtYWRlIGEgcmVhY3RpdmUgb2JqZWN0LiBUaGlzIGNhbiBsZWFkIHRvIHVubmVjZXNzYXJ5IHBlcmZvcm1hbmNlIG92ZXJoZWFkLCBhbmQgc2hvdWxkIGJlIGF2b2lkZWQgYnkgbWFya2luZyB0aGUgY29tcG9uZW50IHdpdGggYG1hcmtSYXdgIG9yIHVzaW5nIGBzaGFsbG93UmVmYCBpbnN0ZWFkIG9mIGByZWZgLiIsYApDb21wb25lbnQgdGhhdCB3YXMgbWFkZSByZWFjdGl2ZTogYCxpKSksTW4oaSxhLGYscCx3LEssRSwhMCl9ZnVuY3Rpb24gTGkoaSl7cmV0dXJuIGk/SS5pc1Byb3h5KGkpfHxEbyBpbiBpP3UuZXh0ZW5kKHt9LGkpOmk6bnVsbH1mdW5jdGlvbiBBaShpLGEpe3ZhciBmPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTohMSx7cHJvcHM6cCxyZWY6dyxwYXRjaEZsYWc6RSxjaGlsZHJlbjpOfT1pLEw9YT9EcihwfHx7fSxhKTpwLFI9e19fdl9pc1ZOb2RlOiEwLF9fdl9za2lwOiEwLHR5cGU6aS50eXBlLHByb3BzOkwsa2V5OkwmJlFhKEwpLHJlZjphJiZhLnJlZj9mJiZ3P3UuaXNBcnJheSh3KT93LmNvbmNhdChwcyhhKSk6W3cscHMoYSldOnBzKGEpOncsc2NvcGVJZDppLnNjb3BlSWQsc2xvdFNjb3BlSWRzOmkuc2xvdFNjb3BlSWRzLGNoaWxkcmVuOkU9PT0tMSYmdS5pc0FycmF5KE4pP04ubWFwKGVzKTpOLHRhcmdldDppLnRhcmdldCx0YXJnZXRBbmNob3I6aS50YXJnZXRBbmNob3Isc3RhdGljQ291bnQ6aS5zdGF0aWNDb3VudCxzaGFwZUZsYWc6aS5zaGFwZUZsYWcscGF0Y2hGbGFnOmEmJmkudHlwZSE9PWp0P0U9PT0tMT8xNjpFfDE2OkUsZHluYW1pY1Byb3BzOmkuZHluYW1pY1Byb3BzLGR5bmFtaWNDaGlsZHJlbjppLmR5bmFtaWNDaGlsZHJlbixhcHBDb250ZXh0OmkuYXBwQ29udGV4dCxkaXJzOmkuZGlycyx0cmFuc2l0aW9uOmkudHJhbnNpdGlvbixjb21wb25lbnQ6aS5jb21wb25lbnQsc3VzcGVuc2U6aS5zdXNwZW5zZSxzc0NvbnRlbnQ6aS5zc0NvbnRlbnQmJkFpKGkuc3NDb250ZW50KSxzc0ZhbGxiYWNrOmkuc3NGYWxsYmFjayYmQWkoaS5zc0ZhbGxiYWNrKSxlbDppLmVsLGFuY2hvcjppLmFuY2hvcn07cmV0dXJuIFJ9ZnVuY3Rpb24gZXMoaSl7dmFyIGE9QWkoaSk7cmV0dXJuIHUuaXNBcnJheShpLmNoaWxkcmVuKSYmKGEuY2hpbGRyZW49aS5jaGlsZHJlbi5tYXAoZXMpKSxhfWZ1bmN0aW9uIEFsKCl7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOiIgIixhPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTowO3JldHVybiB6bihpdCxudWxsLGksYSl9ZnVuY3Rpb24gcmMoaSxhKXt2YXIgZj16bihCcixudWxsLGkpO3JldHVybiBmLnN0YXRpY0NvdW50PWEsZn1mdW5jdGlvbiBpbygpe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dm9pZCAwP2FyZ3VtZW50c1swXToiIixhPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTohMTtyZXR1cm4gYT8oX28oKSxibyhmbixudWxsLGkpKTp6bihmbixudWxsLGkpfWZ1bmN0aW9uIFRuKGkpe3JldHVybiBpPT1udWxsfHx0eXBlb2YgaT09ImJvb2xlYW4iP3puKGZuKTp1LmlzQXJyYXkoaSk/em4oanQsbnVsbCxpLnNsaWNlKCkpOnR5cGVvZiBpPT0ib2JqZWN0Ij9WaShpKTp6bihpdCxudWxsLFN0cmluZyhpKSl9ZnVuY3Rpb24gVmkoaSl7cmV0dXJuIGkuZWw9PT1udWxsfHxpLm1lbW8/aTpBaShpKX1mdW5jdGlvbiBJYShpLGEpe3ZhciBmPTAse3NoYXBlRmxhZzpwfT1pO2lmKGE9PW51bGwpYT1udWxsO2Vsc2UgaWYodS5pc0FycmF5KGEpKWY9MTY7ZWxzZSBpZih0eXBlb2YgYT09Im9iamVjdCIpaWYocCYoMXw2NCkpe3ZhciB3PWEuZGVmYXVsdDt3JiYody5fYyYmKHcuX2Q9ITEpLElhKGksdygpKSx3Ll9jJiYody5fZD0hMCkpO3JldHVybn1lbHNle2Y9MzI7dmFyIEU9YS5fOyFFJiYhKERvIGluIGEpP2EuX2N0eD1TbjpFPT09MyYmU24mJihTbi5zbG90cy5fPT09MT9hLl89MTooYS5fPTIsaS5wYXRjaEZsYWd8PTEwMjQpKX1lbHNlIHUuaXNGdW5jdGlvbihhKT8oYT17ZGVmYXVsdDphLF9jdHg6U259LGY9MzIpOihhPVN0cmluZyhhKSxwJjY0PyhmPTE2LGE9W0FsKGEpXSk6Zj04KTtpLmNoaWxkcmVuPWEsaS5zaGFwZUZsYWd8PWZ9ZnVuY3Rpb24gRHIoKXtmb3IodmFyIGk9e30sYT0wO2E8YXJndW1lbnRzLmxlbmd0aDthKyspe3ZhciBmPWE8MHx8YXJndW1lbnRzLmxlbmd0aDw9YT92b2lkIDA6YXJndW1lbnRzW2FdO2Zvcih2YXIgcCBpbiBmKWlmKHA9PT0iY2xhc3MiKWkuY2xhc3MhPT1mLmNsYXNzJiYoaS5jbGFzcz11Lm5vcm1hbGl6ZUNsYXNzKFtpLmNsYXNzLGYuY2xhc3NdKSk7ZWxzZSBpZihwPT09InN0eWxlIilpLnN0eWxlPXUubm9ybWFsaXplU3R5bGUoW2kuc3R5bGUsZi5zdHlsZV0pO2Vsc2UgaWYodS5pc09uKHApKXt2YXIgdz1pW3BdLEU9ZltwXTtFJiZ3IT09RSYmISh1LmlzQXJyYXkodykmJncuaW5jbHVkZXMoRSkpJiYoaVtwXT13P1tdLmNvbmNhdCh3LEUpOkUpfWVsc2UgcCE9PSIiJiYoaVtwXT1mW3BdKX1yZXR1cm4gaX1mdW5jdGlvbiBsaShpLGEsZil7dmFyIHA9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOm51bGw7RnQoaSxhLDcsW2YscF0pfXZhciB0bD1NcygpLE9sPTA7ZnVuY3Rpb24gSm4oaSxhLGYpe3ZhciBwPWkudHlwZSx3PShhP2EuYXBwQ29udGV4dDppLmFwcENvbnRleHQpfHx0bCxFPXt1aWQ6T2wrKyx2bm9kZTppLHR5cGU6cCxwYXJlbnQ6YSxhcHBDb250ZXh0Oncscm9vdDpudWxsLG5leHQ6bnVsbCxzdWJUcmVlOm51bGwsZWZmZWN0Om51bGwsdXBkYXRlOm51bGwsc2NvcGU6bmV3IEkuRWZmZWN0U2NvcGUoITApLHJlbmRlcjpudWxsLHByb3h5Om51bGwsZXhwb3NlZDpudWxsLGV4cG9zZVByb3h5Om51bGwsd2l0aFByb3h5Om51bGwscHJvdmlkZXM6YT9hLnByb3ZpZGVzOk9iamVjdC5jcmVhdGUody5wcm92aWRlcyksYWNjZXNzQ2FjaGU6bnVsbCxyZW5kZXJDYWNoZTpbXSxjb21wb25lbnRzOm51bGwsZGlyZWN0aXZlczpudWxsLHByb3BzT3B0aW9uczpTdChwLHcpLGVtaXRzT3B0aW9uczpaaShwLHcpLGVtaXQ6bnVsbCxlbWl0dGVkOm51bGwscHJvcHNEZWZhdWx0czp1LkVNUFRZX09CSixpbmhlcml0QXR0cnM6cC5pbmhlcml0QXR0cnMsY3R4OnUuRU1QVFlfT0JKLGRhdGE6dS5FTVBUWV9PQkoscHJvcHM6dS5FTVBUWV9PQkosYXR0cnM6dS5FTVBUWV9PQkosc2xvdHM6dS5FTVBUWV9PQkoscmVmczp1LkVNUFRZX09CSixzZXR1cFN0YXRlOnUuRU1QVFlfT0JKLHNldHVwQ29udGV4dDpudWxsLHN1c3BlbnNlOmYsc3VzcGVuc2VJZDpmP2YucGVuZGluZ0lkOjAsYXN5bmNEZXA6bnVsbCxhc3luY1Jlc29sdmVkOiExLGlzTW91bnRlZDohMSxpc1VubW91bnRlZDohMSxpc0RlYWN0aXZhdGVkOiExLGJjOm51bGwsYzpudWxsLGJtOm51bGwsbTpudWxsLGJ1Om51bGwsdTpudWxsLHVtOm51bGwsYnVtOm51bGwsZGE6bnVsbCxhOm51bGwscnRnOm51bGwscnRjOm51bGwsZWM6bnVsbCxzcDpudWxsfTtyZXR1cm4gRS5jdHg9RWwoRSksRS5yb290PWE/YS5yb290OkUsRS5lbWl0PUhvLmJpbmQobnVsbCxFKSxpLmNlJiZpLmNlKEUpLEV9dmFyIEluPW51bGwsY2k9KCk9PklufHxTbixacj1pPT57SW49aSxpLnNjb3BlLm9uKCl9LGZhPSgpPT57SW4mJkluLnNjb3BlLm9mZigpLEluPW51bGx9LHRzPXUubWFrZU1hcCgic2xvdCxjb21wb25lbnQiKTtmdW5jdGlvbiBYcihpLGEpe3ZhciBmPWEuaXNOYXRpdmVUYWd8fHUuTk87KHRzKGkpfHxmKGkpKSYmQSgiRG8gbm90IHVzZSBidWlsdC1pbiBvciByZXNlcnZlZCBIVE1MIGVsZW1lbnRzIGFzIGNvbXBvbmVudCBpZDogIitpKX1mdW5jdGlvbiBGbyhpKXtyZXR1cm4gaS52bm9kZS5zaGFwZUZsYWcmNH1DLmlzSW5TU1JDb21wb25lbnRTZXR1cD0hMTtmdW5jdGlvbiBUbChpKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ITE7Qy5pc0luU1NSQ29tcG9uZW50U2V0dXA9YTt2YXJ7cHJvcHM6ZixjaGlsZHJlbjpwfT1pLnZub2RlLHc9Rm8oaSk7Z3QoaSxmLHcsYSkscW8oaSxwKTt2YXIgRT13P0lsKGksYSk6dm9pZCAwO3JldHVybiBDLmlzSW5TU1JDb21wb25lbnRTZXR1cD0hMSxFfWZ1bmN0aW9uIElsKGksYSl7dmFyIGYscD1pLnR5cGU7e2lmKHAubmFtZSYmWHIocC5uYW1lLGkuYXBwQ29udGV4dC5jb25maWcpLHAuY29tcG9uZW50cylmb3IodmFyIHc9T2JqZWN0LmtleXMocC5jb21wb25lbnRzKSxFPTA7RTx3Lmxlbmd0aDtFKyspWHIod1tFXSxpLmFwcENvbnRleHQuY29uZmlnKTtpZihwLmRpcmVjdGl2ZXMpZm9yKHZhciBOPU9iamVjdC5rZXlzKHAuZGlyZWN0aXZlcyksTD0wO0w8Ti5sZW5ndGg7TCsrKVpzKE5bTF0pO3AuY29tcGlsZXJPcHRpb25zJiZubCgpJiZBKCciY29tcGlsZXJPcHRpb25zIiBpcyBvbmx5IHN1cHBvcnRlZCB3aGVuIHVzaW5nIGEgYnVpbGQgb2YgVnVlIHRoYXQgaW5jbHVkZXMgdGhlIHJ1bnRpbWUgY29tcGlsZXIuIFNpbmNlIHlvdSBhcmUgdXNpbmcgYSBydW50aW1lLW9ubHkgYnVpbGQsIHRoZSBvcHRpb25zIHNob3VsZCBiZSBwYXNzZWQgdmlhIHlvdXIgYnVpbGQgdG9vbCBjb25maWcgaW5zdGVhZC4nKX1pLmFjY2Vzc0NhY2hlPU9iamVjdC5jcmVhdGUobnVsbCksaS5wcm94eT1JLm1hcmtSYXcobmV3IFByb3h5KGkuY3R4LGdvKSkseHMoaSk7dmFye3NldHVwOlJ9PXA7aWYoUil7dmFyIEs9aS5zZXR1cENvbnRleHQ9Ui5sZW5ndGg+MT9ycyhpKTpudWxsO1pyKGkpLEkucGF1c2VUcmFja2luZygpO3ZhciB1ZT1obihSLGksMCxbSS5zaGFsbG93UmVhZG9ubHkoaS5wcm9wcyksS10pO2lmKEkucmVzZXRUcmFja2luZygpLGZhKCksdS5pc1Byb21pc2UodWUpKXtpZih1ZS50aGVuKGZhLGZhKSxhKXJldHVybiB1ZS50aGVuKHRlPT57bnMoaSx0ZSxhKX0pLmNhdGNoKHRlPT57VnQodGUsaSwwKX0pO2lmKGkuYXN5bmNEZXA9dWUsIWkuc3VzcGVuc2Upe3ZhciBvZT0oZj1wLm5hbWUpIT09bnVsbCYmZiE9PXZvaWQgMD9mOiJBbm9ueW1vdXMiO0EoIkNvbXBvbmVudCA8Ii5jb25jYXQob2UsIj46IHNldHVwIGZ1bmN0aW9uIHJldHVybmVkIGEgcHJvbWlzZSwgYnV0IG5vICIpKyI8U3VzcGVuc2U+IGJvdW5kYXJ5IHdhcyBmb3VuZCBpbiB0aGUgcGFyZW50IGNvbXBvbmVudCB0cmVlLiBBIGNvbXBvbmVudCB3aXRoIGFzeW5jIHNldHVwKCkgbXVzdCBiZSBuZXN0ZWQgaW4gYSA8U3VzcGVuc2U+IGluIG9yZGVyIHRvIGJlIHJlbmRlcmVkLiIpfX1lbHNlIG5zKGksdWUsYSl9ZWxzZSBpYyhpLGEpfWZ1bmN0aW9uIG5zKGksYSxmKXt1LmlzRnVuY3Rpb24oYSk/aS50eXBlLl9fc3NySW5saW5lUmVuZGVyP2kuc3NyUmVuZGVyPWE6aS5yZW5kZXI9YTp1LmlzT2JqZWN0KGEpPyhmcihhKSYmQSgic2V0dXAoKSBzaG91bGQgbm90IHJldHVybiBWTm9kZXMgZGlyZWN0bHkgLSByZXR1cm4gYSByZW5kZXIgZnVuY3Rpb24gaW5zdGVhZC4iKSxpLmRldnRvb2xzUmF3U2V0dXBTdGF0ZT1hLGkuc2V0dXBTdGF0ZT1JLnByb3h5UmVmcyhhKSxRcyhpKSk6YSE9PXZvaWQgMCYmQSgic2V0dXAoKSBzaG91bGQgcmV0dXJuIGFuIG9iamVjdC4gUmVjZWl2ZWQ6ICIuY29uY2F0KGE9PT1udWxsPyJudWxsIjp0eXBlb2YgYSkpLGljKGksZil9dmFyIFBhLFBsO2Z1bmN0aW9uIE5sKGkpe1BhPWksUGw9YT0+e2EucmVuZGVyLl9yYyYmKGEud2l0aFByb3h5PW5ldyBQcm94eShhLmN0eCxScykpfX12YXIgbmw9KCk9PiFQYTtmdW5jdGlvbiBpYyhpLGEsZil7dmFyIHA9aS50eXBlO2lmKCFpLnJlbmRlcil7aWYoIWEmJlBhJiYhcC5yZW5kZXIpe3ZhciB3PXAudGVtcGxhdGU7aWYodyl7U3IoaSwiY29tcGlsZSIpO3Zhcntpc0N1c3RvbUVsZW1lbnQ6RSxjb21waWxlck9wdGlvbnM6Tn09aS5hcHBDb250ZXh0LmNvbmZpZyx7ZGVsaW1pdGVyczpMLGNvbXBpbGVyT3B0aW9uczpSfT1wLEs9dS5leHRlbmQodS5leHRlbmQoe2lzQ3VzdG9tRWxlbWVudDpFLGRlbGltaXRlcnM6TH0sTiksUik7cC5yZW5kZXI9UGEodyxLKSxGaShpLCJjb21waWxlIil9fWkucmVuZGVyPXAucmVuZGVyfHx1Lk5PT1AsUGwmJlBsKGkpfVpyKGkpLEkucGF1c2VUcmFja2luZygpLHEoaSksSS5yZXNldFRyYWNraW5nKCksZmEoKSwhcC5yZW5kZXImJmkucmVuZGVyPT09dS5OT09QJiYhYSYmKCFQYSYmcC50ZW1wbGF0ZT9BKCdDb21wb25lbnQgcHJvdmlkZWQgdGVtcGxhdGUgb3B0aW9uIGJ1dCBydW50aW1lIGNvbXBpbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBidWlsZCBvZiBWdWUuIENvbmZpZ3VyZSB5b3VyIGJ1bmRsZXIgdG8gYWxpYXMgInZ1ZSIgdG8gInZ1ZS9kaXN0L3Z1ZS5lc20tYnVuZGxlci5qcyIuJyk6QSgiQ29tcG9uZW50IGlzIG1pc3NpbmcgdGVtcGxhdGUgb3IgcmVuZGVyIGZ1bmN0aW9uLiIpKX1mdW5jdGlvbiBrbChpKXtyZXR1cm4gbmV3IFByb3h5KGkuYXR0cnMse2dldChhLGYpe3JldHVybiBraSgpLEkudHJhY2soaSwiZ2V0IiwiJGF0dHJzIiksYVtmXX0sc2V0KCl7cmV0dXJuIEEoInNldHVwQ29udGV4dC5hdHRycyBpcyByZWFkb25seS4iKSwhMX0sZGVsZXRlUHJvcGVydHkoKXtyZXR1cm4gQSgic2V0dXBDb250ZXh0LmF0dHJzIGlzIHJlYWRvbmx5LiIpLCExfX0pfWZ1bmN0aW9uIHJzKGkpe3ZhciBhPXA9PntpLmV4cG9zZWQmJkEoImV4cG9zZSgpIHNob3VsZCBiZSBjYWxsZWQgb25seSBvbmNlIHBlciBzZXR1cCgpLiIpLGkuZXhwb3NlZD1wfHx7fX0sZjtyZXR1cm4gT2JqZWN0LmZyZWV6ZSh7Z2V0IGF0dHJzKCl7cmV0dXJuIGZ8fChmPWtsKGkpKX0sZ2V0IHNsb3RzKCl7cmV0dXJuIEkuc2hhbGxvd1JlYWRvbmx5KGkuc2xvdHMpfSxnZXQgZW1pdCgpe3JldHVybiBmdW5jdGlvbihwKXtmb3IodmFyIHc9YXJndW1lbnRzLmxlbmd0aCxFPW5ldyBBcnJheSh3PjE/dy0xOjApLE49MTtOPHc7TisrKUVbTi0xXT1hcmd1bWVudHNbTl07cmV0dXJuIGkuZW1pdChwLC4uLkUpfX0sZXhwb3NlOmF9KX1mdW5jdGlvbiBMcyhpKXtpZihpLmV4cG9zZWQpcmV0dXJuIGkuZXhwb3NlUHJveHl8fChpLmV4cG9zZVByb3h5PW5ldyBQcm94eShJLnByb3h5UmVmcyhJLm1hcmtSYXcoaS5leHBvc2VkKSkse2dldChhLGYpe2lmKGYgaW4gYSlyZXR1cm4gYVtmXTtpZihmIGluIHBvKXJldHVybiBwb1tmXShpKX19KSl9dmFyIFJsPS8oPzpefFstX10pKFx3KS9nLGdzPWk9PmkucmVwbGFjZShSbCxhPT5hLnRvVXBwZXJDYXNlKCkpLnJlcGxhY2UoL1stX10vZywiIik7ZnVuY3Rpb24gZGEoaSl7dmFyIGE9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOiEwO3JldHVybiB1LmlzRnVuY3Rpb24oaSk/aS5kaXNwbGF5TmFtZXx8aS5uYW1lOmkubmFtZXx8YSYmaS5fX25hbWV9ZnVuY3Rpb24gVnMoaSxhKXt2YXIgZj1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06ITEscD1kYShhKTtpZighcCYmYS5fX2ZpbGUpe3ZhciB3PWEuX19maWxlLm1hdGNoKC8oW14vXFxdKylcLlx3KyQvKTt3JiYocD13WzFdKX1pZighcCYmaSYmaS5wYXJlbnQpe3ZhciBFPU49Pntmb3IodmFyIEwgaW4gTilpZihOW0xdPT09YSlyZXR1cm4gTH07cD1FKGkuY29tcG9uZW50c3x8aS5wYXJlbnQudHlwZS5jb21wb25lbnRzKXx8RShpLmFwcENvbnRleHQuY29tcG9uZW50cyl9cmV0dXJuIHA/Z3MocCk6Zj8iQXBwIjoiQW5vbnltb3VzIn1mdW5jdGlvbiB4bChpKXtyZXR1cm4gdS5pc0Z1bmN0aW9uKGkpJiYiX192Y2NPcHRzImluIGl9dmFyICRzPShpLGEpPT5JLmNvbXB1dGVkKGksYSxDLmlzSW5TU1JDb21wb25lbnRTZXR1cCksVXM9aT0+QSgiIi5jb25jYXQoaSwiKCkgaXMgYSBjb21waWxlci1oaW50IGhlbHBlciB0aGF0IGlzIG9ubHkgdXNhYmxlIGluc2lkZSAiKSsiPHNjcmlwdCBzZXR1cD4gb2YgYSBzaW5nbGUgZmlsZSBjb21wb25lbnQuIEl0cyBhcmd1bWVudHMgc2hvdWxkIGJlIGNvbXBpbGVkIGF3YXkgYW5kIHBhc3NpbmcgaXQgYXQgcnVudGltZSBoYXMgbm8gZWZmZWN0LiIpO2Z1bmN0aW9uICRjKCl7cmV0dXJuIFVzKCJkZWZpbmVQcm9wcyIpLG51bGx9ZnVuY3Rpb24gb2MoKXtyZXR1cm4gVXMoImRlZmluZUVtaXRzIiksbnVsbH1mdW5jdGlvbiBVYyhpKXtVcygiZGVmaW5lRXhwb3NlIil9ZnVuY3Rpb24gSGMoaSxhKXtyZXR1cm4gVXMoIndpdGhEZWZhdWx0cyIpLG51bGx9ZnVuY3Rpb24gamMoKXtyZXR1cm4gc2MoKS5zbG90c31mdW5jdGlvbiBhYygpe3JldHVybiBzYygpLmF0dHJzfWZ1bmN0aW9uIHNjKCl7dmFyIGk9Y2koKTtyZXR1cm4gaXx8QSgidXNlQ29udGV4dCgpIGNhbGxlZCB3aXRob3V0IGFjdGl2ZSBpbnN0YW5jZS4iKSxpLnNldHVwQ29udGV4dHx8KGkuc2V0dXBDb250ZXh0PXJzKGkpKX1mdW5jdGlvbiB6YyhpLGEpe3ZhciBmPXUuaXNBcnJheShpKT9pLnJlZHVjZSgoRSxOKT0+KEVbTl09e30sRSkse30pOmk7Zm9yKHZhciBwIGluIGEpe3ZhciB3PWZbcF07dz91LmlzQXJyYXkodyl8fHUuaXNGdW5jdGlvbih3KT9mW3BdPXt0eXBlOncsZGVmYXVsdDphW3BdfTp3LmRlZmF1bHQ9YVtwXTp3PT09bnVsbD9mW3BdPXtkZWZhdWx0OmFbcF19OkEoJ3Byb3BzIGRlZmF1bHQga2V5ICInLmNvbmNhdChwLCciIGhhcyBubyBjb3JyZXNwb25kaW5nIGRlY2xhcmF0aW9uLicpKX1yZXR1cm4gZn1mdW5jdGlvbiBXYyhpLGEpe3ZhciBmPXt9LHA9ZnVuY3Rpb24oRSl7YS5pbmNsdWRlcyhFKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KGYsRSx7ZW51bWVyYWJsZTohMCxnZXQ6KCk9PmlbRV19KX07Zm9yKHZhciB3IGluIGkpcCh3KTtyZXR1cm4gZn1mdW5jdGlvbiBHYyhpKXt2YXIgYT1jaSgpO2F8fEEoIndpdGhBc3luY0NvbnRleHQgY2FsbGVkIHdpdGhvdXQgYWN0aXZlIGN1cnJlbnQgaW5zdGFuY2UuIFRoaXMgaXMgbGlrZWx5IGEgYnVnLiIpO3ZhciBmPWkoKTtyZXR1cm4gZmEoKSx1LmlzUHJvbWlzZShmKSYmKGY9Zi5jYXRjaChwPT57dGhyb3cgWnIoYSkscH0pKSxbZiwoKT0+WnIoYSldfWZ1bmN0aW9uIEJsKGksYSxmKXt2YXIgcD1hcmd1bWVudHMubGVuZ3RoO3JldHVybiBwPT09Mj91LmlzT2JqZWN0KGEpJiYhdS5pc0FycmF5KGEpP2ZyKGEpP3puKGksbnVsbCxbYV0pOnpuKGksYSk6em4oaSxudWxsLGEpOihwPjM/Zj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMik6cD09PTMmJmZyKGYpJiYoZj1bZl0pLHpuKGksYSxmKSl9dmFyIGxjPVN5bWJvbCgic3NyQ29udGV4dCIpLE1sPSgpPT57e3ZhciBpPWVvKGxjKTtyZXR1cm4gaXx8QSgiU2VydmVyIHJlbmRlcmluZyBjb250ZXh0IG5vdCBwcm92aWRlZC4gTWFrZSBzdXJlIHRvIG9ubHkgY2FsbCB1c2VTU1JDb250ZXh0KCkgY29uZGl0aW9uYWxseSBpbiB0aGUgc2VydmVyIGJ1aWxkLiIpLGl9fTtmdW5jdGlvbiBEbChpKXtyZXR1cm4hIShpJiZpLl9fdl9pc1NoYWxsb3cpfWZ1bmN0aW9uIFljKCl7aWYodHlwZW9mIHdpbmRvdz09InVuZGVmaW5lZCIpcmV0dXJuO3ZhciBpPXtzdHlsZToiY29sb3I6IzNiYTc3NiJ9LGE9e3N0eWxlOiJjb2xvcjojMGIxYmM5In0sZj17c3R5bGU6ImNvbG9yOiNiNjJlMjQifSxwPXtzdHlsZToiY29sb3I6IzlkMjg4YyJ9LHc9e2hlYWRlcihvZSl7cmV0dXJuIHUuaXNPYmplY3Qob2UpP29lLl9faXNWdWU/WyJkaXYiLGksIlZ1ZUluc3RhbmNlIl06SS5pc1JlZihvZSk/WyJkaXYiLHt9LFsic3BhbiIsaSx1ZShvZSldLCI8IixMKG9lLnZhbHVlKSwiPiJdOkkuaXNSZWFjdGl2ZShvZSk/WyJkaXYiLHt9LFsic3BhbiIsaSxEbChvZSk/IlNoYWxsb3dSZWFjdGl2ZSI6IlJlYWN0aXZlIl0sIjwiLEwob2UpLCI+Ii5jb25jYXQoSS5pc1JlYWRvbmx5KG9lKT8iIChyZWFkb25seSkiOiIiKV06SS5pc1JlYWRvbmx5KG9lKT9bImRpdiIse30sWyJzcGFuIixpLERsKG9lKT8iU2hhbGxvd1JlYWRvbmx5IjoiUmVhZG9ubHkiXSwiPCIsTChvZSksIj4iXTpudWxsOm51bGx9LGhhc0JvZHkob2Upe3JldHVybiBvZSYmb2UuX19pc1Z1ZX0sYm9keShvZSl7aWYob2UmJm9lLl9faXNWdWUpcmV0dXJuWyJkaXYiLHt9LC4uLkUob2UuJCldfX07ZnVuY3Rpb24gRShvZSl7dmFyIHRlPVtdO29lLnR5cGUucHJvcHMmJm9lLnByb3BzJiZ0ZS5wdXNoKE4oInByb3BzIixJLnRvUmF3KG9lLnByb3BzKSkpLG9lLnNldHVwU3RhdGUhPT11LkVNUFRZX09CSiYmdGUucHVzaChOKCJzZXR1cCIsb2Uuc2V0dXBTdGF0ZSkpLG9lLmRhdGEhPT11LkVNUFRZX09CSiYmdGUucHVzaChOKCJkYXRhIixJLnRvUmF3KG9lLmRhdGEpKSk7dmFyIEVlPVIob2UsImNvbXB1dGVkIik7RWUmJnRlLnB1c2goTigiY29tcHV0ZWQiLEVlKSk7dmFyIEhlPVIob2UsImluamVjdCIpO3JldHVybiBIZSYmdGUucHVzaChOKCJpbmplY3RlZCIsSGUpKSx0ZS5wdXNoKFsiZGl2Iix7fSxbInNwYW4iLHtzdHlsZTpwLnN0eWxlKyI7b3BhY2l0eTowLjY2In0sIiQgKGludGVybmFsKTogIl0sWyJvYmplY3QiLHtvYmplY3Q6b2V9XV0pLHRlfWZ1bmN0aW9uIE4ob2UsdGUpe3JldHVybiB0ZT11LmV4dGVuZCh7fSx0ZSksT2JqZWN0LmtleXModGUpLmxlbmd0aD9bImRpdiIse3N0eWxlOiJsaW5lLWhlaWdodDoxLjI1ZW07bWFyZ2luLWJvdHRvbTowLjZlbSJ9LFsiZGl2Iix7c3R5bGU6ImNvbG9yOiM0NzY1ODIifSxvZV0sWyJkaXYiLHtzdHlsZToicGFkZGluZy1sZWZ0OjEuMjVlbSJ9LC4uLk9iamVjdC5rZXlzKHRlKS5tYXAoRWU9PlsiZGl2Iix7fSxbInNwYW4iLHAsRWUrIjogIl0sTCh0ZVtFZV0sITEpXSldXTpbInNwYW4iLHt9XX1mdW5jdGlvbiBMKG9lKXt2YXIgdGU9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOiEwO3JldHVybiB0eXBlb2Ygb2U9PSJudW1iZXIiP1sic3BhbiIsYSxvZV06dHlwZW9mIG9lPT0ic3RyaW5nIj9bInNwYW4iLGYsSlNPTi5zdHJpbmdpZnkob2UpXTp0eXBlb2Ygb2U9PSJib29sZWFuIj9bInNwYW4iLHAsb2VdOnUuaXNPYmplY3Qob2UpP1sib2JqZWN0Iix7b2JqZWN0OnRlP0kudG9SYXcob2UpOm9lfV06WyJzcGFuIixmLFN0cmluZyhvZSldfWZ1bmN0aW9uIFIob2UsdGUpe3ZhciBFZT1vZS50eXBlO2lmKCF1LmlzRnVuY3Rpb24oRWUpKXt2YXIgSGU9e307Zm9yKHZhciBydCBpbiBvZS5jdHgpSyhFZSxydCx0ZSkmJihIZVtydF09b2UuY3R4W3J0XSk7cmV0dXJuIEhlfX1mdW5jdGlvbiBLKG9lLHRlLEVlKXt2YXIgSGU9b2VbRWVdO2lmKHUuaXNBcnJheShIZSkmJkhlLmluY2x1ZGVzKHRlKXx8dS5pc09iamVjdChIZSkmJnRlIGluIEhlfHxvZS5leHRlbmRzJiZLKG9lLmV4dGVuZHMsdGUsRWUpfHxvZS5taXhpbnMmJm9lLm1peGlucy5zb21lKHJ0PT5LKHJ0LHRlLEVlKSkpcmV0dXJuITB9ZnVuY3Rpb24gdWUob2Upe3JldHVybiBEbChvZSk/IlNoYWxsb3dSZWYiOm9lLmVmZmVjdD8iQ29tcHV0ZWRSZWYiOiJSZWYifXdpbmRvdy5kZXZ0b29sc0Zvcm1hdHRlcnM/d2luZG93LmRldnRvb2xzRm9ybWF0dGVycy5wdXNoKHcpOndpbmRvdy5kZXZ0b29sc0Zvcm1hdHRlcnM9W3ddfWZ1bmN0aW9uIGNjKGksYSxmLHApe3ZhciB3PWZbcF07aWYodyYmcmwodyxpKSlyZXR1cm4gdzt2YXIgRT1hKCk7cmV0dXJuIEUubWVtbz1pLnNsaWNlKCksZltwXT1FfWZ1bmN0aW9uIHJsKGksYSl7dmFyIGY9aS5tZW1vO2lmKGYubGVuZ3RoIT1hLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIHA9MDtwPGYubGVuZ3RoO3ArKylpZih1Lmhhc0NoYW5nZWQoZltwXSxhW3BdKSlyZXR1cm4hMTtyZXR1cm4gS28+MCYmTXImJk1yLnB1c2goaSksITB9dmFyIEZsPSIzLjIuMzciLHlvPXtjcmVhdGVDb21wb25lbnRJbnN0YW5jZTpKbixzZXR1cENvbXBvbmVudDpUbCxyZW5kZXJDb21wb25lbnRSb290OlFpLHNldEN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZTpscixpc1ZOb2RlOmZyLG5vcm1hbGl6ZVZOb2RlOlRufSxIcz15byxkcj1udWxsLGhhPW51bGw7ZnVuY3Rpb24gSm8oaSxhKXtyZXR1cm4gaT09PSJpbnB1dCI/bmV3IGsuVW5pSW5wdXRFbGVtZW50KGksYSk6aT09PSJ0ZXh0YXJlYSI/bmV3IGsuVW5pVGV4dEFyZWFFbGVtZW50KGksYSk6bmV3IGsuVW5pRWxlbWVudChpLGEpfWZ1bmN0aW9uIHVjKGksYSl7cmV0dXJuIG5ldyBrLlVuaVRleHROb2RlKGksYSl9ZnVuY3Rpb24gaWwoaSxhKXtyZXR1cm4gbmV3IGsuVW5pQ29tbWVudE5vZGUoaSxhKX12YXIgWm8sTGw9e2luc2VydDooaSxhLGYpPT57YS5pbnNlcnRCZWZvcmUoaSxmfHxudWxsKX0scmVtb3ZlOmk9Pnt2YXIgYT1pLnBhcmVudE5vZGU7YSYmYS5yZW1vdmVDaGlsZChpKX0sY3JlYXRlRWxlbWVudDooaSxhKT0+Sm8oaSxhKSxjcmVhdGVUZXh0OihpLGEpPT51YyhpLGEpLGNyZWF0ZUNvbW1lbnQ6KGksYSk9PmlsKGksYSksc2V0VGV4dDooaSxhKT0+e2kubm9kZVZhbHVlPWF9LHNldEVsZW1lbnRUZXh0OihpLGEpPT57aS50ZXh0Q29udGVudD1hfSxwYXJlbnROb2RlOmk9PmkucGFyZW50Tm9kZSxuZXh0U2libGluZzppPT5pLm5leHRTaWJsaW5nLHNldFNjb3BlSWQoaSxhKXtpLnNldEF0dHJpYnV0ZShhLCIiKX0sY2xvbmVOb2RlKGkpe3ZhciBhPWkuY2xvbmVOb2RlKCEwKTtyZXR1cm4iX3ZhbHVlImluIGkmJihhLl92YWx1ZT1pLl92YWx1ZSksYX0saW5zZXJ0U3RhdGljQ29udGVudChpLGEsZil7dmFyIHA9Wm98fChabz1KbygiZGl2IikpO3AuaW5uZXJIVE1MPWk7Zm9yKHZhciB3PXAuZmlyc3RDaGlsZCxFPXcsTj1FO0U7KU49RSxMbC5pbnNlcnQoRSxhLGYpLEU9cC5maXJzdENoaWxkO3JldHVyblt3LE5dfX07ZnVuY3Rpb24gWG8oaSxhKXthPT1udWxsJiYoYT0iIiksaS5zZXRBdHRyaWJ1dGUoImNsYXNzIixhKX1mdW5jdGlvbiBmYyhpLGEsZil7aWYoIWYpaS5yZW1vdmVBdHRyaWJ1dGUoInN0eWxlIik7ZWxzZSBpZih1LmlzU3RyaW5nKGYpKWEhPT1mJiZpLnNldEF0dHJpYnV0ZSgic3R5bGUiLGYpO2Vsc2V7dmFyIHA9e30sdz1hJiYhdS5pc1N0cmluZyhhKTtpZih3KXtmb3IodmFyIEUgaW4gYSlmW0VdPT1udWxsJiYocFtFXT0iIik7Zm9yKHZhciBOIGluIGYpe3ZhciBMPWZbTl07TCE9PWFbTl0mJihwW05dPUwpfX1lbHNlIGZvcih2YXIgUiBpbiBmKXBbUl09ZltSXTtPYmplY3Qua2V5cyhwKS5sZW5ndGgmJmkuc2V0QXR0cmlidXRlKCJzdHlsZSIscCl9fWZ1bmN0aW9uIG9vKGksYSxmKXtmPT1udWxsP2kucmVtb3ZlQXR0cmlidXRlKGEpOmkuc2V0QXR0cmlidXRlKGEsZil9ZnVuY3Rpb24gZGMoaSxhLGYscCl7aS5hZGRFdmVudExpc3RlbmVyKGEsZixwKX1mdW5jdGlvbiBvbChpLGEsZixwKXtpLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSxmLHApfWZ1bmN0aW9uIGhjKGksYSxmLHApe3ZhciB3PWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTpudWxsLEU9aS5fdmVpfHwoaS5fdmVpPXt9KSxOPUVbYV07aWYocCYmTilOLnZhbHVlPXA7ZWxzZXt2YXJbTCxSXT12cyhhKTtpZihwKXt2YXIgSz1FW2FdPWdjKHAsdyk7ZGMoaSxMLEssUil9ZWxzZSBOJiYob2woaSxMLE4sUiksRVthXT12b2lkIDApfX12YXIgcGM9Lyg/Ok9uY2V8UGFzc2l2ZXxDYXB0dXJlKSQvO2Z1bmN0aW9uIHZzKGkpe3ZhciBhO2lmKHBjLnRlc3QoaSkpe2E9e307Zm9yKHZhciBmO2Y9aS5tYXRjaChwYyk7KWk9aS5zbGljZSgwLGkubGVuZ3RoLWZbMF0ubGVuZ3RoKSxhW2ZbMF0udG9Mb3dlckNhc2UoKV09ITB9cmV0dXJuW3UuaHlwaGVuYXRlKGkuc2xpY2UoMikpLGFdfWZ1bmN0aW9uIGdjKGksYSl7dmFyIGY9dz0+e0Z0KGYudmFsdWUsYSw1LFt3XSl9O2YudmFsdWU9aTt2YXIgcD1uZXcgU2V0O3JldHVybiB1LmlzQXJyYXkoZi52YWx1ZSk/Zi52YWx1ZS5mb3JFYWNoKHc9Pnt3Lm1vZGlmaWVycyYmdy5tb2RpZmllcnMuZm9yRWFjaChFPT57cC5hZGQoRSl9KX0pOihmLnZhbHVlLm1vZGlmaWVycyYmZi52YWx1ZS5tb2RpZmllcnMuZm9yRWFjaCh3PT57cC5hZGQodyl9KSx2YyhmLGEpKSxmLm1vZGlmaWVycz1bLi4ucF0sZn1mdW5jdGlvbiB2YyhpLGEpe2lmKCEhYSl7dmFyeyR3eHNNb2R1bGVzOmZ9PWE7aWYoISFmKXt2YXIgcD1pLnZhbHVlLnRvU3RyaW5nKCk7IWYuZmluZCh3PT5wLmluZGV4T2YoIi4iK3crIi4iKT4tMSl8fChpLnd4c0V2ZW50PWkudmFsdWUoKSl9fX12YXIgcWM9ZnVuY3Rpb24oaSxhLGYscCl7dmFyIHc9YXJndW1lbnRzLmxlbmd0aD42P2FyZ3VtZW50c1s2XTp2b2lkIDA7c3dpdGNoKGEpe2Nhc2UiY2xhc3MiOlhvKGkscCk7YnJlYWs7Y2FzZSJzdHlsZSI6ZmMoaSxmLHApO2JyZWFrO2RlZmF1bHQ6aWYodS5pc09uKGEpKXUuaXNNb2RlbExpc3RlbmVyKGEpfHxoYyhpLGEsZixwLHcpO2Vsc2V7aWYodS5pc09iamVjdChwKSl7dmFyIEU9Zj09PXA7aWYocD1rLkpTT05fUFJPVE9DT0wrSlNPTi5zdHJpbmdpZnkocCksRSYmaS5nZXRBdHRyaWJ1dGUoYSk9PT1wKXJldHVybn1lbHNlIGlmKGY9PT1wKXJldHVybjtvbyhpLGEscCl9YnJlYWt9fTtmdW5jdGlvbiBLYygpe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dm9pZCAwP2FyZ3VtZW50c1swXToiJHN0eWxlIjt7dmFyIGE9Y2koKTtpZighYSlyZXR1cm4gQSgidXNlQ3NzTW9kdWxlIG11c3QgYmUgY2FsbGVkIGluc2lkZSBzZXR1cCgpIiksdS5FTVBUWV9PQko7dmFyIGY9YS50eXBlLl9fY3NzTW9kdWxlcztpZighZilyZXR1cm4gQSgiQ3VycmVudCBpbnN0YW5jZSBkb2VzIG5vdCBoYXZlIENTUyBtb2R1bGVzIGluamVjdGVkLiIpLHUuRU1QVFlfT0JKO3ZhciBwPWZbaV07cmV0dXJuIHB8fChBKCdDdXJyZW50IGluc3RhbmNlIGRvZXMgbm90IGhhdmUgQ1NTIG1vZHVsZSBuYW1lZCAiJy5jb25jYXQoaSwnIi4nKSksdS5FTVBUWV9PQkopfX1mdW5jdGlvbiBhbChpKXt2YXIgYT1jaSgpO2lmKCFhKXtBKCJ1c2VDc3NWYXJzIGlzIGNhbGxlZCB3aXRob3V0IGN1cnJlbnQgYWN0aXZlIGNvbXBvbmVudCBpbnN0YW5jZS4iKTtyZXR1cm59dmFyIGY9KCk9PlZsKGEuc3ViVHJlZSxpKGEucHJveHkpKTtucigoKT0+em8oZix7Zmx1c2g6InBvc3QifSkpLGtvKGYpfWZ1bmN0aW9uIFZsKGksYSl7aWYoaS5zaGFwZUZsYWcmMTI4KXt2YXIgZj1pLnN1c3BlbnNlO2k9Zi5hY3RpdmVCcmFuY2gsZi5wZW5kaW5nQnJhbmNoJiYhZi5pc0h5ZHJhdGluZyYmZi5lZmZlY3RzLnB1c2goKCk9PntWbChmLmFjdGl2ZUJyYW5jaCxhKX0pfWZvcig7aS5jb21wb25lbnQ7KWk9aS5jb21wb25lbnQuc3ViVHJlZTtpZihpLnNoYXBlRmxhZyYxJiZpLmVsKW1jKGkuZWwsYSk7ZWxzZSBpZihpLnR5cGU9PT1qdClpLmNoaWxkcmVuLmZvckVhY2goRT0+VmwoRSxhKSk7ZWxzZSBpZihpLnR5cGU9PT1Ccilmb3IodmFye2VsOnAsYW5jaG9yOnd9PWk7cCYmKG1jKHAsYSkscCE9PXcpOylwPXAubmV4dFNpYmxpbmd9ZnVuY3Rpb24gbWMoaSxhKXtpZihpLm5vZGVUeXBlPT09MSlmb3IodmFyIGYgaW4gYSlpLnNldEF0dHJpYnV0ZSgiLS0iLmNvbmNhdChmKSxhW2ZdKX12YXIgTmE9InRyYW5zaXRpb24iLGpzPSJhbmltYXRpb24iLCRsPShpLGEpPT57dmFye3Nsb3RzOmZ9PWE7cmV0dXJuIEJsKGllLGJjKGkpLGYpfTskbC5kaXNwbGF5TmFtZT0iVHJhbnNpdGlvbiI7dmFyIHNsPXtuYW1lOlN0cmluZyx0eXBlOlN0cmluZyxjc3M6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiEwfSxkdXJhdGlvbjpbU3RyaW5nLE51bWJlcixPYmplY3RdLGVudGVyRnJvbUNsYXNzOlN0cmluZyxlbnRlckFjdGl2ZUNsYXNzOlN0cmluZyxlbnRlclRvQ2xhc3M6U3RyaW5nLGFwcGVhckZyb21DbGFzczpTdHJpbmcsYXBwZWFyQWN0aXZlQ2xhc3M6U3RyaW5nLGFwcGVhclRvQ2xhc3M6U3RyaW5nLGxlYXZlRnJvbUNsYXNzOlN0cmluZyxsZWF2ZUFjdGl2ZUNsYXNzOlN0cmluZyxsZWF2ZVRvQ2xhc3M6U3RyaW5nfSxKYz0kbC5wcm9wcz11LmV4dGVuZCh7fSxpZS5wcm9wcyxzbCksa2E9ZnVuY3Rpb24oaSl7dmFyIGE9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOltdO3UuaXNBcnJheShpKT9pLmZvckVhY2goZj0+ZiguLi5hKSk6aSYmaSguLi5hKX0sX2M9aT0+aT91LmlzQXJyYXkoaSk/aS5zb21lKGE9PmEubGVuZ3RoPjEpOmkubGVuZ3RoPjE6ITE7ZnVuY3Rpb24gYmMoaSl7dmFyIGE9e307Zm9yKHZhciBmIGluIGkpZiBpbiBzbHx8KGFbZl09aVtmXSk7aWYoaS5jc3M9PT0hMSlyZXR1cm4gYTt2YXJ7bmFtZTpwPSJ2Iix0eXBlOncsZHVyYXRpb246RSxlbnRlckZyb21DbGFzczpOPSIiLmNvbmNhdChwLCItZW50ZXItZnJvbSIpLGVudGVyQWN0aXZlQ2xhc3M6TD0iIi5jb25jYXQocCwiLWVudGVyLWFjdGl2ZSIpLGVudGVyVG9DbGFzczpSPSIiLmNvbmNhdChwLCItZW50ZXItdG8iKSxhcHBlYXJGcm9tQ2xhc3M6Sz1OLGFwcGVhckFjdGl2ZUNsYXNzOnVlPUwsYXBwZWFyVG9DbGFzczpvZT1SLGxlYXZlRnJvbUNsYXNzOnRlPSIiLmNvbmNhdChwLCItbGVhdmUtZnJvbSIpLGxlYXZlQWN0aXZlQ2xhc3M6RWU9IiIuY29uY2F0KHAsIi1sZWF2ZS1hY3RpdmUiKSxsZWF2ZVRvQ2xhc3M6SGU9IiIuY29uY2F0KHAsIi1sZWF2ZS10byIpfT1pLHJ0PWRuKEUpLGZ0PXJ0JiZydFswXSx2ZT1ydCYmcnRbMV0se29uQmVmb3JlRW50ZXI6bGUsb25FbnRlcjptZSxvbkVudGVyQ2FuY2VsbGVkOlplLG9uTGVhdmU6T2Usb25MZWF2ZUNhbmNlbGxlZDpvdCxvbkJlZm9yZUFwcGVhcjpkdD1sZSxvbkFwcGVhcjpZZT1tZSxvbkFwcGVhckNhbmNlbGxlZDpPdD1aZX09YSxUdD0oeCxVLGhlKT0+e2VhKHgsVT9vZTpSKSxlYSh4LFU/dWU6TCksaGUmJmhlKCl9LHd0PSh4LFUpPT57ZWEoeCxIZSksZWEoeCxFZSksVSYmVSgpfSwkdD14PT4oVSxoZSk9Pnt2YXIgSWU9eD9ZZTptZSxQZT0oKT0+VHQoVSx4LGhlKTtrYShJZSxbVSxQZV0pLGxsKCgpPT57ZWEoVSx4P0s6TikscGEoVSx4P29lOlIpLF9jKEllKXx8aXMoVSx3LGZ0LFBlKX0pfTtyZXR1cm4gdS5leHRlbmQoYSx7b25CZWZvcmVFbnRlcih4KXtrYShsZSxbeF0pLHBhKHgsTikscGEoeCxMKX0sb25CZWZvcmVBcHBlYXIoeCl7a2EoZHQsW3hdKSxwYSh4LEspLHBhKHgsdWUpfSxvbkVudGVyOiR0KCExKSxvbkFwcGVhcjokdCghMCksb25MZWF2ZSh4LFUpe3ZhciBoZT0oKT0+d3QoeCxVKTtwYSh4LHRlKSxBcigpLHBhKHgsRWUpLGxsKCgpPT57ZWEoeCx0ZSkscGEoeCxIZSksX2MoT2UpfHxpcyh4LHcsdmUsaGUpfSksa2EoT2UsW3gsaGVdKX0sb25FbnRlckNhbmNlbGxlZCh4KXtUdCh4LCExKSxrYShaZSxbeF0pfSxvbkFwcGVhckNhbmNlbGxlZCh4KXtUdCh4LCEwKSxrYShPdCxbeF0pfSxvbkxlYXZlQ2FuY2VsbGVkKHgpe3d0KHgpLGthKG90LFt4XSl9fSl9ZnVuY3Rpb24gZG4oaSl7aWYoaT09bnVsbClyZXR1cm4gbnVsbDtpZih1LmlzT2JqZWN0KGkpKXJldHVybltRbyhpLmVudGVyKSxRbyhpLmxlYXZlKV07dmFyIGE9UW8oaSk7cmV0dXJuW2EsYV19ZnVuY3Rpb24gUW8oaSl7dmFyIGE9dS50b051bWJlcihpKTtyZXR1cm4gTG8oYSksYX1mdW5jdGlvbiBMbyhpKXt0eXBlb2YgaSE9Im51bWJlciI/QSgiPHRyYW5zaXRpb24+IGV4cGxpY2l0IGR1cmF0aW9uIGlzIG5vdCBhIHZhbGlkIG51bWJlciAtICIrImdvdCAiLmNvbmNhdChKU09OLnN0cmluZ2lmeShpKSwiLiIpKTppc05hTihpKSYmQSgiPHRyYW5zaXRpb24+IGV4cGxpY2l0IGR1cmF0aW9uIGlzIE5hTiAtIHRoZSBkdXJhdGlvbiBleHByZXNzaW9uIG1pZ2h0IGJlIGluY29ycmVjdC4iKX1mdW5jdGlvbiBwYShpLGEpe2Euc3BsaXQoL1xzKy8pLmZvckVhY2goZj0+ZiYmaS5jbGFzc0xpc3QuYWRkKGYpKSwoaS5fdnRjfHwoaS5fdnRjPW5ldyBTZXQpKS5hZGQoYSl9ZnVuY3Rpb24gZWEoaSxhKXthLnNwbGl0KC9ccysvKS5mb3JFYWNoKHA9PnAmJmkuY2xhc3NMaXN0LnJlbW92ZShwKSk7dmFye192dGM6Zn09aTtmJiYoZi5kZWxldGUoYSksZi5zaXplfHwoaS5fdnRjPXZvaWQgMCkpfWZ1bmN0aW9uIGxsKGkpe3JlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e3JlcXVlc3RBbmltYXRpb25GcmFtZShpKX0pfXZhciBjbD0wO2Z1bmN0aW9uIGlzKGksYSxmLHApe3ZhciB3PWkuX2VuZElkPSsrY2wsRT0oKT0+e3c9PT1pLl9lbmRJZCYmcCgpfTtpZihmKXJldHVybiBzZXRUaW1lb3V0KEUsZik7dmFye3R5cGU6Tix0aW1lb3V0OkwscHJvcENvdW50OlJ9PXpzKGksYSk7aWYoIU4pcmV0dXJuIHAoKTt2YXIgSz1OKyJlbmQiLHVlPTAsb2U9KCk9PntpLnJlbW92ZUV2ZW50TGlzdGVuZXIoSyx0ZSksRSgpfSx0ZT1FZT0+e0VlLnRhcmdldD09PWkmJisrdWU+PVImJm9lKCl9O3NldFRpbWVvdXQoKCk9Pnt1ZTxSJiZvZSgpfSxMKzEpLGkuYWRkRXZlbnRMaXN0ZW5lcihLLHRlKX1mdW5jdGlvbiB6cyhpLGEpe3ZhciBmPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGkpLHA9SGU9PihmW0hlXXx8IiIpLnNwbGl0KCIsICIpLHc9cChOYSsiRGVsYXkiKSxFPXAoTmErIkR1cmF0aW9uIiksTj1SYSh3LEUpLEw9cChqcysiRGVsYXkiKSxSPXAoanMrIkR1cmF0aW9uIiksSz1SYShMLFIpLHVlPW51bGwsb2U9MCx0ZT0wO2E9PT1OYT9OPjAmJih1ZT1OYSxvZT1OLHRlPUUubGVuZ3RoKTphPT09anM/Sz4wJiYodWU9anMsb2U9Syx0ZT1SLmxlbmd0aCk6KG9lPU1hdGgubWF4KE4sSyksdWU9b2U+MD9OPks/TmE6anM6bnVsbCx0ZT11ZT91ZT09PU5hP0UubGVuZ3RoOlIubGVuZ3RoOjApO3ZhciBFZT11ZT09PU5hJiYvXGIodHJhbnNmb3JtfGFsbCkoLHwkKS8udGVzdChmW05hKyJQcm9wZXJ0eSJdKTtyZXR1cm57dHlwZTp1ZSx0aW1lb3V0Om9lLHByb3BDb3VudDp0ZSxoYXNUcmFuc2Zvcm06RWV9fWZ1bmN0aW9uIFJhKGksYSl7Zm9yKDtpLmxlbmd0aDxhLmxlbmd0aDspaT1pLmNvbmNhdChpKTtyZXR1cm4gTWF0aC5tYXgoLi4uYS5tYXAoKGYscCk9Pm1zKGYpK21zKGlbcF0pKSl9ZnVuY3Rpb24gbXMoaSl7cmV0dXJuIE51bWJlcihpLnNsaWNlKDAsLTEpLnJlcGxhY2UoIiwiLCIuIikpKjFlM31mdW5jdGlvbiBBcigpe3JldHVybiBkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodH12YXIgX3M9bmV3IFdlYWtNYXAsZ2E9bmV3IFdlYWtNYXAsb3M9e25hbWU6IlRyYW5zaXRpb25Hcm91cCIscHJvcHM6dS5leHRlbmQoe30sSmMse3RhZzpTdHJpbmcsbW92ZUNsYXNzOlN0cmluZ30pLHNldHVwKGksYSl7dmFye3Nsb3RzOmZ9PWEscD1jaSgpLHc9dHIoKSxFLE47cmV0dXJuIGtvKCgpPT57aWYoISFFLmxlbmd0aCl7dmFyIEw9aS5tb3ZlQ2xhc3N8fCIiLmNvbmNhdChpLm5hbWV8fCJ2IiwiLW1vdmUiKTtpZighIWgoRVswXS5lbCxwLnZub2RlLmVsLEwpKXtFLmZvckVhY2goeGEpLEUuZm9yRWFjaChvKTt2YXIgUj1FLmZpbHRlcihsKTtBcigpLFIuZm9yRWFjaChLPT57dmFyIHVlPUsuZWwsb2U9dWUuc3R5bGU7cGEodWUsTCksb2UudHJhbnNmb3JtPW9lLndlYmtpdFRyYW5zZm9ybT1vZS50cmFuc2l0aW9uRHVyYXRpb249IiI7dmFyIHRlPXVlLl9tb3ZlQ2I9RWU9PntFZSYmRWUudGFyZ2V0IT09dWV8fCghRWV8fC90cmFuc2Zvcm0kLy50ZXN0KEVlLnByb3BlcnR5TmFtZSkpJiYodWUucmVtb3ZlRXZlbnRMaXN0ZW5lcigidHJhbnNpdGlvbmVuZCIsdGUpLHVlLl9tb3ZlQ2I9bnVsbCxlYSh1ZSxMKSl9O3VlLmFkZEV2ZW50TGlzdGVuZXIoInRyYW5zaXRpb25lbmQiLHRlKX0pfX19KSwoKT0+e3ZhciBMPUkudG9SYXcoaSksUj1iYyhMKSxLPUwudGFnfHxqdDtFPU4sTj1mLmRlZmF1bHQ/Z2UoZi5kZWZhdWx0KCkpOltdO2Zvcih2YXIgdWU9MDt1ZTxOLmxlbmd0aDt1ZSsrKXt2YXIgb2U9Tlt1ZV07b2Uua2V5IT1udWxsP1oob2UsRyhvZSxSLHcscCkpOkEoIjxUcmFuc2l0aW9uR3JvdXA+IGNoaWxkcmVuIG11c3QgYmUga2V5ZWQuIil9aWYoRSlmb3IodmFyIHRlPTA7dGU8RS5sZW5ndGg7dGUrKyl7dmFyIEVlPUVbdGVdO1ooRWUsRyhFZSxSLHcscCkpLF9zLnNldChFZSxFZS5lbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSl9cmV0dXJuIHpuKEssbnVsbCxOKX19fSxaYz1vcztmdW5jdGlvbiB4YShpKXt2YXIgYT1pLmVsO2EuX21vdmVDYiYmYS5fbW92ZUNiKCksYS5fZW50ZXJDYiYmYS5fZW50ZXJDYigpfWZ1bmN0aW9uIG8oaSl7Z2Euc2V0KGksaS5lbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSl9ZnVuY3Rpb24gbChpKXt2YXIgYT1fcy5nZXQoaSksZj1nYS5nZXQoaSkscD1hLmxlZnQtZi5sZWZ0LHc9YS50b3AtZi50b3A7aWYocHx8dyl7dmFyIEU9aS5lbC5zdHlsZTtyZXR1cm4gRS50cmFuc2Zvcm09RS53ZWJraXRUcmFuc2Zvcm09InRyYW5zbGF0ZSgiLmNvbmNhdChwLCJweCwiKS5jb25jYXQodywicHgpIiksRS50cmFuc2l0aW9uRHVyYXRpb249IjBzIixpfX1mdW5jdGlvbiBoKGksYSxmKXt2YXIgcD1pLmNsb25lTm9kZSgpO2kuX3Z0YyYmaS5fdnRjLmZvckVhY2goTj0+e04uc3BsaXQoL1xzKy8pLmZvckVhY2goTD0+TCYmcC5jbGFzc0xpc3QucmVtb3ZlKEwpKX0pLGYuc3BsaXQoL1xzKy8pLmZvckVhY2goTj0+TiYmcC5jbGFzc0xpc3QuYWRkKE4pKSxwLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3ZhciB3PWEubm9kZVR5cGU9PT0xP2E6YS5wYXJlbnROb2RlO3cuYXBwZW5kQ2hpbGQocCk7dmFye2hhc1RyYW5zZm9ybTpFfT16cyhwKTtyZXR1cm4gdy5yZW1vdmVDaGlsZChwKSxFfXZhciBtPWk9Pnt2YXIgYT1pLnByb3BzWyJvblVwZGF0ZTptb2RlbFZhbHVlIl07cmV0dXJuIHUuaXNBcnJheShhKT9mPT51Lmludm9rZUFycmF5Rm5zKGEsZik6YX0sUz17Y3JlYXRlZChpLGEsZil7dmFye3ZhbHVlOnAsbW9kaWZpZXJzOnt0cmltOncsbnVtYmVyOkV9fT1hO2kudmFsdWU9cD09bnVsbD8iIjpwLGkuX2Fzc2lnbj1tKGYpLGRjKGksImlucHV0IixOPT57dmFyIEw9Ti5kZXRhaWwudmFsdWUsUj1pLnBhZ2VOb2RlO2kucGFnZU5vZGU9bnVsbCxpLnZhbHVlPUwsaS5wYWdlTm9kZT1SLHc/TD1MLnRyaW0oKTpFJiYoTD11LnRvTnVtYmVyKEwpKSxpLl9hc3NpZ24oTCl9KX0sYmVmb3JlVXBkYXRlKGksYSxmKXt2YXJ7dmFsdWU6cH09YTtpLl9hc3NpZ249bShmKTt2YXIgdz1wPT1udWxsPyIiOnA7aS52YWx1ZSE9PXcmJihpLnZhbHVlPXcpfX0sTz1TLE09WyJjdHJsIiwic2hpZnQiLCJhbHQiLCJtZXRhIl0sWT17c3RvcDppPT5pLnN0b3BQcm9wYWdhdGlvbigpLHByZXZlbnQ6aT0+aS5wcmV2ZW50RGVmYXVsdCgpLHNlbGY6aT0+aS50YXJnZXQhPT1pLmN1cnJlbnRUYXJnZXQsY3RybDppPT4haS5jdHJsS2V5LHNoaWZ0Omk9PiFpLnNoaWZ0S2V5LGFsdDppPT4haS5hbHRLZXksbWV0YTppPT4haS5tZXRhS2V5LGxlZnQ6aT0+ImJ1dHRvbiJpbiBpJiZpLmJ1dHRvbiE9PTAsbWlkZGxlOmk9PiJidXR0b24iaW4gaSYmaS5idXR0b24hPT0xLHJpZ2h0Omk9PiJidXR0b24iaW4gaSYmaS5idXR0b24hPT0yLGV4YWN0OihpLGEpPT5NLnNvbWUoZj0+aVsiIi5jb25jYXQoZiwiS2V5IildJiYhYS5pbmNsdWRlcyhmKSl9LEg9KGksYSk9Pnt2YXIgZj1mdW5jdGlvbihwKXtmb3IodmFyIHc9MDt3PGEubGVuZ3RoO3crKyl7dmFyIEU9WVthW3ddXTtpZihFJiZFKHAsYSkpcmV0dXJufWZvcih2YXIgTj1hcmd1bWVudHMubGVuZ3RoLEw9bmV3IEFycmF5KE4+MT9OLTE6MCksUj0xO1I8TjtSKyspTFtSLTFdPWFyZ3VtZW50c1tSXTtyZXR1cm4gaShwLC4uLkwpfTtyZXR1cm4gZi5tb2RpZmllcnM9YSxmfSxuZT17ZXNjOiJlc2NhcGUiLHNwYWNlOiIgIix1cDoiYXJyb3ctdXAiLGxlZnQ6ImFycm93LWxlZnQiLHJpZ2h0OiJhcnJvdy1yaWdodCIsZG93bjoiYXJyb3ctZG93biIsZGVsZXRlOiJiYWNrc3BhY2UifSxOZT0oaSxhKT0+Zj0+e2lmKCJrZXkiaW4gZil7dmFyIHA9dS5oeXBoZW5hdGUoZi5rZXkpO2lmKGEuc29tZSh3PT53PT09cHx8bmVbd109PT1wKSlyZXR1cm4gaShmKX19LGZlPXtiZWZvcmVNb3VudChpLGEpe3Zhcnt2YWx1ZTpmfT1hO2NlKGksZil9LHVwZGF0ZWQoaSxhKXt2YXJ7dmFsdWU6ZixvbGRWYWx1ZTpwfT1hOyFmIT0hcCYmY2UoaSxmKX0sYmVmb3JlVW5tb3VudChpLGEpe3Zhcnt2YWx1ZTpmfT1hO2NlKGksZil9fTtmdW5jdGlvbiBjZShpLGEpe2kuc2V0QXR0cmlidXRlKCIudlNob3ciLCEhYSl9dmFyIEZlPXUuZXh0ZW5kKHtwYXRjaFByb3A6cWMsZm9yY2VQYXRjaFByb3A6ay5mb3JjZVBhdGNoUHJvcH0sTGwpLFZlO2Z1bmN0aW9uIGx0KCl7cmV0dXJuIFZlfHwoVmU9aHMoRmUpKX12YXIgbXQ9ZnVuY3Rpb24oKXtsdCgpLnJlbmRlciguLi5hcmd1bWVudHMpfSx3ZT1mdW5jdGlvbigpe3ZhciBpPWx0KCkuY3JlYXRlQXBwKC4uLmFyZ3VtZW50cyk7U2UoaSk7dmFye21vdW50OmF9PWk7cmV0dXJuIGkubW91bnQ9Zj0+KHUuaXNTdHJpbmcoZikmJihmPWlsKGYpKSxmJiZhKGYsITEsITEpKSxpfSxkZT13ZTtmdW5jdGlvbiBTZShpKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoaS5jb25maWcsImlzTmF0aXZlVGFnIix7dmFsdWU6YT0+dS5pc0hUTUxUYWcoYSl8fHUuaXNTVkdUYWcoYSksd3JpdGFibGU6ITF9KX1mdW5jdGlvbiBudCgpe31mdW5jdGlvbiB6ZSgpe31yZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KEMsImNhbWVsaXplIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdS5jYW1lbGl6ZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoQywiY2FwaXRhbGl6ZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHUuY2FwaXRhbGl6ZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoQywibm9ybWFsaXplQ2xhc3MiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB1Lm5vcm1hbGl6ZUNsYXNzfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDLCJub3JtYWxpemVQcm9wcyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHUubm9ybWFsaXplUHJvcHN9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEMsIm5vcm1hbGl6ZVN0eWxlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdS5ub3JtYWxpemVTdHlsZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoQywidG9EaXNwbGF5U3RyaW5nIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdS50b0Rpc3BsYXlTdHJpbmd9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEMsInRvSGFuZGxlcktleSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHUudG9IYW5kbGVyS2V5fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDLCJFZmZlY3RTY29wZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEkuRWZmZWN0U2NvcGV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEMsIlJlYWN0aXZlRWZmZWN0Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS5SZWFjdGl2ZUVmZmVjdH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoQywiY3VzdG9tUmVmIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS5jdXN0b21SZWZ9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEMsImVmZmVjdCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEkuZWZmZWN0fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDLCJlZmZlY3RTY29wZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEkuZWZmZWN0U2NvcGV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEMsImdldEN1cnJlbnRTY29wZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEkuZ2V0Q3VycmVudFNjb3BlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDLCJpc1Byb3h5Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS5pc1Byb3h5fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDLCJpc1JlYWN0aXZlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS5pc1JlYWN0aXZlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDLCJpc1JlYWRvbmx5Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS5pc1JlYWRvbmx5fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDLCJpc1JlZiIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEkuaXNSZWZ9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEMsImlzU2hhbGxvdyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEkuaXNTaGFsbG93fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDLCJtYXJrUmF3Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS5tYXJrUmF3fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDLCJvblNjb3BlRGlzcG9zZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEkub25TY29wZURpc3Bvc2V9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEMsInByb3h5UmVmcyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEkucHJveHlSZWZzfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDLCJyZWFjdGl2ZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEkucmVhY3RpdmV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEMsInJlYWRvbmx5Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS5yZWFkb25seX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoQywicmVmIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS5yZWZ9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEMsInNoYWxsb3dSZWFjdGl2ZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEkuc2hhbGxvd1JlYWN0aXZlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDLCJzaGFsbG93UmVhZG9ubHkiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBJLnNoYWxsb3dSZWFkb25seX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoQywic2hhbGxvd1JlZiIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEkuc2hhbGxvd1JlZn19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoQywic3RvcCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEkuc3RvcH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoQywidG9SYXciLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBJLnRvUmF3fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDLCJ0b1JlZiIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEkudG9SZWZ9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEMsInRvUmVmcyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEkudG9SZWZzfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDLCJ0cmlnZ2VyUmVmIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS50cmlnZ2VyUmVmfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDLCJ1bnJlZiIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEkudW5yZWZ9fSksQy5CYXNlVHJhbnNpdGlvbj1pZSxDLkNvbW1lbnQ9Zm4sQy5GcmFnbWVudD1qdCxDLktlZXBBbGl2ZT1QbyxDLlN0YXRpYz1CcixDLlN1c3BlbnNlPVluLEMuVGVsZXBvcnQ9SHQsQy5UZXh0PWl0LEMuVHJhbnNpdGlvbj0kbCxDLlRyYW5zaXRpb25Hcm91cD1aYyxDLmNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nPUZ0LEMuY2FsbFdpdGhFcnJvckhhbmRsaW5nPWhuLEMuY2xvbmVWTm9kZT1BaSxDLmNvbXBhdFV0aWxzPWhhLEMuY29tcHV0ZWQ9JHMsQy5jcmVhdGVBcHA9d2UsQy5jcmVhdGVCbG9jaz1ibyxDLmNyZWF0ZUNvbW1lbnQ9aWwsQy5jcmVhdGVDb21tZW50Vk5vZGU9aW8sQy5jcmVhdGVFbGVtZW50PUpvLEMuY3JlYXRlRWxlbWVudEJsb2NrPXdsLEMuY3JlYXRlRWxlbWVudFZOb2RlPU1uLEMuY3JlYXRlSHlkcmF0aW9uUmVuZGVyZXI9U2ksQy5jcmVhdGVQcm9wc1Jlc3RQcm94eT1XYyxDLmNyZWF0ZVJlbmRlcmVyPWhzLEMuY3JlYXRlU1NSQXBwPWRlLEMuY3JlYXRlU2xvdHM9Um8sQy5jcmVhdGVTdGF0aWNWTm9kZT1yYyxDLmNyZWF0ZVRleHROb2RlPXVjLEMuY3JlYXRlVGV4dFZOb2RlPUFsLEMuY3JlYXRlVk5vZGU9em4sQy5jcmVhdGVWdWVBcHA9d2UsQy5kZWZpbmVBc3luY0NvbXBvbmVudD1fbixDLmRlZmluZUNvbXBvbmVudD16dCxDLmRlZmluZUVtaXRzPW9jLEMuZGVmaW5lRXhwb3NlPVVjLEMuZGVmaW5lUHJvcHM9JGMsQy5nZXRDdXJyZW50SW5zdGFuY2U9Y2ksQy5nZXRUcmFuc2l0aW9uUmF3Q2hpbGRyZW49Z2UsQy5ndWFyZFJlYWN0aXZlUHJvcHM9TGksQy5oPUJsLEMuaGFuZGxlRXJyb3I9VnQsQy5pbml0Q3VzdG9tRm9ybWF0dGVyPVljLEMuaW5qZWN0PWVvLEMuaW5qZWN0SG9vaz1vaSxDLmlzTWVtb1NhbWU9cmwsQy5pc1J1bnRpbWVPbmx5PW5sLEMuaXNWTm9kZT1mcixDLm1lcmdlRGVmYXVsdHM9emMsQy5tZXJnZVByb3BzPURyLEMubmV4dFRpY2s9eXIsQy5vbkFjdGl2YXRlZD1zYSxDLm9uQmVmb3JlQWN0aXZhdGU9bnQsQy5vbkJlZm9yZURlYWN0aXZhdGU9emUsQy5vbkJlZm9yZU1vdW50PXdhLEMub25CZWZvcmVVbm1vdW50PWNhLEMub25CZWZvcmVVcGRhdGU9UnIsQy5vbkRlYWN0aXZhdGVkPSRhLEMub25FcnJvckNhcHR1cmVkPUlzLEMub25Nb3VudGVkPW5yLEMub25SZW5kZXJUcmFja2VkPVRzLEMub25SZW5kZXJUcmlnZ2VyZWQ9T3MsQy5vblNlcnZlclByZWZldGNoPUFzLEMub25Vbm1vdW50ZWQ9eHIsQy5vblVwZGF0ZWQ9a28sQy5vcGVuQmxvY2s9X28sQy5wb3BTY29wZUlkPUR0LEMucHJvdmlkZT12cixDLnB1c2hTY29wZUlkPU9vLEMucXVldWVQb3N0Rmx1c2hDYj1XaSxDLnJlZ2lzdGVyUnVudGltZUNvbXBpbGVyPU5sLEMucmVuZGVyPW10LEMucmVuZGVyTGlzdD1TYSxDLnJlbmRlclNsb3Q9a3MsQy5yZXNvbHZlQ29tcG9uZW50PUhhLEMucmVzb2x2ZURpcmVjdGl2ZT1QcyxDLnJlc29sdmVEeW5hbWljQ29tcG9uZW50PVhzLEMucmVzb2x2ZUZpbHRlcj1kcixDLnJlc29sdmVUcmFuc2l0aW9uSG9va3M9RyxDLnNldEJsb2NrVHJhY2tpbmc9ZWwsQy5zZXREZXZ0b29sc0hvb2s9UHIsQy5zZXRUcmFuc2l0aW9uSG9va3M9WixDLnNzckNvbnRleHRLZXk9bGMsQy5zc3JVdGlscz1IcyxDLnRvSGFuZGxlcnM9Q2EsQy50cmFuc2Zvcm1WTm9kZUFyZ3M9U2wsQy51c2VBdHRycz1hYyxDLnVzZUNzc01vZHVsZT1LYyxDLnVzZUNzc1ZhcnM9YWwsQy51c2VTU1JDb250ZXh0PU1sLEMudXNlU2xvdHM9amMsQy51c2VUcmFuc2l0aW9uU3RhdGU9dHIsQy52TW9kZWxEeW5hbWljPU8sQy52TW9kZWxUZXh0PVMsQy52U2hvdz1mZSxDLnZlcnNpb249RmwsQy53YXJuPUEsQy53YXRjaD1LcixDLndhdGNoRWZmZWN0PXpvLEMud2F0Y2hQb3N0RWZmZWN0PUxhLEMud2F0Y2hTeW5jRWZmZWN0PUVhLEMud2l0aEFzeW5jQ29udGV4dD1HYyxDLndpdGhDdHg9WGksQy53aXRoRGVmYXVsdHM9SGMsQy53aXRoRGlyZWN0aXZlcz1KcixDLndpdGhLZXlzPU5lLEMud2l0aE1lbW89Y2MsQy53aXRoTW9kaWZpZXJzPUgsQy53aXRoU2NvcGVJZD1SZSxPYmplY3QuZGVmaW5lUHJvcGVydHkoQywiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksQ30oe30sYyxiLFQpO3JldHVybiBCLl9fVFlQRV9fPSJ2dWUiLEJ9ZnVuY3Rpb24gZnYodixjLGIpe2xldCBUPWIuVnVlLEI9Yi5zZXRUaW1lb3V0LEM9Yi5jbGVhclRpbWVvdXQsaz1iLnNldEludGVydmFsLHU9Yi5jbGVhckludGVydmFsLEk9Yi5fX3VuaUNvbmZpZyxHZT1iLl9fdW5pUm91dGVzLEF0PWIuVnVlU2hhcmVkLHRuPWIuVW5pU2hhcmVkO3ZhciBBPWZ1bmN0aW9uKFEsYWUsaG4peyJ1c2Ugc3RyaWN0Ijt2YXIgRnQ9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLFZ0PWZ1bmN0aW9uKCl7bGV0IGU9bmV3IFVpbnQ4QXJyYXkoMjU2KTtmb3IodmFyIHQ9MDt0PEZ0Lmxlbmd0aDt0KyspZVtGdC5jaGFyQ29kZUF0KHQpXT10O3JldHVybiBlfSgpO2Z1bmN0aW9uIHpyKGUpe3ZhciB0PW5ldyBVaW50OEFycmF5KGUpLG4scj10Lmxlbmd0aCxzPSIiO2ZvcihuPTA7bjxyO24rPTMpcys9RnRbdFtuXT4+Ml0scys9RnRbKHRbbl0mMyk8PDR8dFtuKzFdPj40XSxzKz1GdFsodFtuKzFdJjE1KTw8Mnx0W24rMl0+PjZdLHMrPUZ0W3RbbisyXSY2M107cmV0dXJuIHIlMz09PTI/cz1zLnN1YnN0cmluZygwLHMubGVuZ3RoLTEpKyI9IjpyJTM9PT0xJiYocz1zLnN1YnN0cmluZygwLHMubGVuZ3RoLTIpKyI9PSIpLHN9ZnVuY3Rpb24gZWkoZSl7dmFyIHQ9ZS5sZW5ndGgqLjc1LG49ZS5sZW5ndGgscixzPTAsZCxnLHksejtlW2UubGVuZ3RoLTFdPT09Ij0iJiYodC0tLGVbZS5sZW5ndGgtMl09PT0iPSImJnQtLSk7dmFyIFA9bmV3IEFycmF5QnVmZmVyKHQpLCQ9bmV3IFVpbnQ4QXJyYXkoUCk7Zm9yKHI9MDtyPG47cis9NClkPVZ0W2UuY2hhckNvZGVBdChyKV0sZz1WdFtlLmNoYXJDb2RlQXQocisxKV0seT1WdFtlLmNoYXJDb2RlQXQocisyKV0sej1WdFtlLmNoYXJDb2RlQXQociszKV0sJFtzKytdPWQ8PDJ8Zz4+NCwkW3MrK109KGcmMTUpPDw0fHk+PjIsJFtzKytdPSh5JjMpPDw2fHomNjM7cmV0dXJuIFB9bGV0IFRyPVsib3JpZ2luYWwiLCJjb21wcmVzc2VkIl0sbW49WyJhbGJ1bSIsImNhbWVyYSJdLEd0PVsiR0VUIiwiT1BUSU9OUyIsIkhFQUQiLCJQT1NUIiwiUFVUIiwiREVMRVRFIiwiVFJBQ0UiLCJDT05ORUNUIiwiUEFUQ0giXTtmdW5jdGlvbiBhbihlLHQpe3JldHVybiFlfHx0LmluZGV4T2YoZSk9PT0tMT90WzBdOmV9ZnVuY3Rpb24gUG4oZSx0KXtyZXR1cm4hUS5pc0FycmF5KGUpfHxlLmxlbmd0aD09PTB8fGUuZmluZChuPT50LmluZGV4T2Yobik9PT0tMSk/dDplfWZ1bmN0aW9uIFVuKGUsdCl7Y29uc29sZS53YXJuKGAke2V9OiAke3R9YCl9ZnVuY3Rpb24gaXIoZSx0LG4scil7cnx8KHI9VW4pO2ZvcihsZXQgcyBpbiBuKXtsZXQgZD1CZShzLHRbc10sbltzXSwhUS5oYXNPd24odCxzKSk7US5pc1N0cmluZyhkKSYmcihlLGQpfX1mdW5jdGlvbiBGbihlLHQsbixyKXtpZighbilyZXR1cm47aWYoIVEuaXNBcnJheShuKSlyZXR1cm4gaXIoZSx0WzBdfHxPYmplY3QuY3JlYXRlKG51bGwpLG4scik7bGV0IHM9bi5sZW5ndGgsZD10Lmxlbmd0aDtmb3IobGV0IGc9MDtnPHM7ZysrKXtsZXQgeT1uW2ddLHo9T2JqZWN0LmNyZWF0ZShudWxsKTtkPmcmJih6W3kubmFtZV09dFtnXSksaXIoZSx6LHtbeS5uYW1lXTp5fSxyKX19ZnVuY3Rpb24gQmUoZSx0LG4scil7US5pc1BsYWluT2JqZWN0KG4pfHwobj17dHlwZTpufSk7bGV0e3R5cGU6cyxyZXF1aXJlZDpkLHZhbGlkYXRvcjpnfT1uO2lmKGQmJnIpcmV0dXJuJ01pc3NpbmcgcmVxdWlyZWQgYXJnczogIicrZSsnIic7aWYoISh0PT1udWxsJiYhZCkpe2lmKHMhPW51bGwpe2xldCB5PSExLHo9US5pc0FycmF5KHMpP3M6W3NdLFA9W107Zm9yKGxldCAkPTA7JDx6Lmxlbmd0aCYmIXk7JCsrKXtsZXR7dmFsaWQ6X2UsZXhwZWN0ZWRUeXBlOlRlfT15dCh0LHpbJF0pO1AucHVzaChUZXx8IiIpLHk9X2V9aWYoIXkpcmV0dXJuIFp0KGUsdCxQKX1pZihnKXJldHVybiBnKHQpfX1sZXQgYXQ9US5tYWtlTWFwKCJTdHJpbmcsTnVtYmVyLEJvb2xlYW4sRnVuY3Rpb24sU3ltYm9sIik7ZnVuY3Rpb24geXQoZSx0KXtsZXQgbixyPXNuKHQpO2lmKGF0KHIpKXtsZXQgcz10eXBlb2YgZTtuPXM9PT1yLnRvTG93ZXJDYXNlKCksIW4mJnM9PT0ib2JqZWN0IiYmKG49ZSBpbnN0YW5jZW9mIHQpfWVsc2Ugcj09PSJPYmplY3QiP249US5pc09iamVjdChlKTpyPT09IkFycmF5Ij9uPVEuaXNBcnJheShlKTpuPWUgaW5zdGFuY2VvZiB0fHxRLnRvUmF3VHlwZShlKT09PXNuKHQpO3JldHVybnt2YWxpZDpuLGV4cGVjdGVkVHlwZTpyfX1mdW5jdGlvbiBadChlLHQsbil7bGV0IHI9YEludmFsaWQgYXJnczogdHlwZSBjaGVjayBmYWlsZWQgZm9yIGFyZ3MgIiR7ZX0iLiBFeHBlY3RlZCAke24ubWFwKFEuY2FwaXRhbGl6ZSkuam9pbigiLCAiKX1gLHM9blswXSxkPVEudG9SYXdUeXBlKHQpLGc9Y24odCxzKSx5PWNuKHQsZCk7cmV0dXJuIG4ubGVuZ3RoPT09MSYmZ3IocykmJiF5cihzLGQpJiYocis9YCB3aXRoIHZhbHVlICR7Z31gKSxyKz1gLCBnb3QgJHtkfSBgLGdyKGQpJiYocis9YHdpdGggdmFsdWUgJHt5fS5gKSxyfWZ1bmN0aW9uIHNuKGUpe2xldCB0PWUmJmUudG9TdHJpbmcoKS5tYXRjaCgvXlxzKmZ1bmN0aW9uIChcdyspLyk7cmV0dXJuIHQ/dFsxXToiIn1mdW5jdGlvbiBjbihlLHQpe3JldHVybiB0PT09IlN0cmluZyI/YCIke2V9ImA6dD09PSJOdW1iZXIiP2Ake051bWJlcihlKX1gOmAke2V9YH1mdW5jdGlvbiBncihlKXtyZXR1cm5bInN0cmluZyIsIm51bWJlciIsImJvb2xlYW4iXS5zb21lKG49PmUudG9Mb3dlckNhc2UoKT09PW4pfWZ1bmN0aW9uIHlyKC4uLmUpe3JldHVybiBlLnNvbWUodD0+dC50b0xvd2VyQ2FzZSgpPT09ImJvb2xlYW4iKX1mdW5jdGlvbiBJaShlKXtyZXR1cm4gZnVuY3Rpb24oKXt0cnl7cmV0dXJuIGUuYXBwbHkoZSxhcmd1bWVudHMpfWNhdGNoKHQpe2NvbnNvbGUuZXJyb3IodCl9fX1sZXQgUGk9MSxvcj17fTtmdW5jdGlvbiB6aShlLHQsbixyPSExKXtyZXR1cm4gb3JbZV09e25hbWU6dCxrZWVwQWxpdmU6cixjYWxsYmFjazpufSxlfWZ1bmN0aW9uICRvKGUsdCxuKXtpZih0eXBlb2YgZT09Im51bWJlciIpe2xldCByPW9yW2VdO2lmKHIpcmV0dXJuIHIua2VlcEFsaXZlfHxkZWxldGUgb3JbZV0sci5jYWxsYmFjayh0LG4pfXJldHVybiB0fWZ1bmN0aW9uIE5pKGUpe2ZvcihsZXQgdCBpbiBvcilpZihvclt0XS5uYW1lPT09ZSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBXaShlLHQpe2ZvcihsZXQgbiBpbiBvcil7bGV0IHI9b3Jbbl07ci5jYWxsYmFjaz09PXQmJnIubmFtZT09PWUmJmRlbGV0ZSBvcltuXX19ZnVuY3Rpb24gR2koZSl7YnQub2ZmKCJhcGkuIitlKX1mdW5jdGlvbiBoaShlKXtidC5vbigiYXBpLiIrZSx0PT57Zm9yKGxldCBuIGluIG9yKXtsZXQgcj1vcltuXTtyLm5hbWU9PT1lJiZyLmNhbGxiYWNrKHQpfX0pfWZ1bmN0aW9uIFlpKGUsdCl7cmV0dXJuIHppKFBpKyssZSx0LCEwKX1sZXQgTHI9InN1Y2Nlc3MiLFZyPSJmYWlsIixhcj0iY29tcGxldGUiO2Z1bmN0aW9uIElyKGUpe2xldCB0PXt9O2ZvcihsZXQgbiBpbiBlKXtsZXQgcj1lW25dO1EuaXNGdW5jdGlvbihyKSYmKHRbbl09SWkociksZGVsZXRlIGVbbl0pfXJldHVybiB0fWZ1bmN0aW9uIHFpKGUsdCl7cmV0dXJuIWV8fGUuaW5kZXhPZigiOmZhaWwiKT09PS0xP3QrIjpvayI6dCtlLnN1YnN0cmluZyhlLmluZGV4T2YoIjpmYWlsIikpfWZ1bmN0aW9uIFNvKGUsdD17fSx7YmVmb3JlQWxsOm4sYmVmb3JlU3VjY2VzczpyfT17fSl7US5pc1BsYWluT2JqZWN0KHQpfHwodD17fSk7bGV0e3N1Y2Nlc3M6cyxmYWlsOmQsY29tcGxldGU6Z309SXIodCkseT1RLmlzRnVuY3Rpb24ocyksej1RLmlzRnVuY3Rpb24oZCksUD1RLmlzRnVuY3Rpb24oZyksJD1QaSsrO3JldHVybiB6aSgkLGUsX2U9PntfZT1fZXx8e30sX2UuZXJyTXNnPXFpKF9lLmVyck1zZyxlKSxRLmlzRnVuY3Rpb24obikmJm4oX2UpLF9lLmVyck1zZz09PWUrIjpvayI/KFEuaXNGdW5jdGlvbihyKSYmcihfZSx0KSx5JiZzKF9lKSk6eiYmZChfZSksUCYmZyhfZSl9KSwkfWxldCBDbz0ic3VjY2VzcyIsdGk9ImZhaWwiLFFuPSJjb21wbGV0ZSIscGk9e30sbmk9e307ZnVuY3Rpb24gc3IoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlKHQpfHx0fX1mdW5jdGlvbiBnaShlLHQpe2xldCBuPSExO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cisrKXtsZXQgcz1lW3JdO2lmKG4pbj1Qcm9taXNlLnJlc29sdmUoc3IocykpO2Vsc2V7bGV0IGQ9cyh0KTtpZihRLmlzUHJvbWlzZShkKSYmKG49UHJvbWlzZS5yZXNvbHZlKGQpKSxkPT09ITEpcmV0dXJue3RoZW4oKXt9LGNhdGNoKCl7fX19fXJldHVybiBufHx7dGhlbihyKXtyZXR1cm4gcih0KX0sY2F0Y2goKXt9fX1mdW5jdGlvbiB2aShlLHQ9e30pe3JldHVybltDbyx0aSxRbl0uZm9yRWFjaChuPT57bGV0IHI9ZVtuXTtpZighUS5pc0FycmF5KHIpKXJldHVybjtsZXQgcz10W25dO3Rbbl09ZnVuY3Rpb24oZyl7Z2kocixnKS50aGVuKHk9PlEuaXNGdW5jdGlvbihzKSYmcyh5KXx8eSl9fSksdH1mdW5jdGlvbiBtaShlLHQpe2xldCBuPVtdO1EuaXNBcnJheShwaS5yZXR1cm5WYWx1ZSkmJm4ucHVzaCguLi5waS5yZXR1cm5WYWx1ZSk7bGV0IHI9bmlbZV07cmV0dXJuIHImJlEuaXNBcnJheShyLnJldHVyblZhbHVlKSYmbi5wdXNoKC4uLnIucmV0dXJuVmFsdWUpLG4uZm9yRWFjaChzPT57dD1zKHQpfHx0fSksdH1mdW5jdGlvbiBFcihlKXtsZXQgdD1PYmplY3QuY3JlYXRlKG51bGwpO09iamVjdC5rZXlzKHBpKS5mb3JFYWNoKHI9PntyIT09InJldHVyblZhbHVlIiYmKHRbcl09cGlbcl0uc2xpY2UoKSl9KTtsZXQgbj1uaVtlXTtyZXR1cm4gbiYmT2JqZWN0LmtleXMobikuZm9yRWFjaChyPT57ciE9PSJyZXR1cm5WYWx1ZSImJih0W3JdPSh0W3JdfHxbXSkuY29uY2F0KG5bcl0pKX0pLHR9ZnVuY3Rpb24gUHIoZSx0LG4scil7bGV0IHM9RXIoZSk7cmV0dXJuIHMmJk9iamVjdC5rZXlzKHMpLmxlbmd0aD9RLmlzQXJyYXkocy5pbnZva2UpP2dpKHMuaW52b2tlLG4pLnRoZW4oZz0+dCh2aShzLGcpLC4uLnIpKTp0KHZpKHMsbiksLi4ucik6dChuLC4uLnIpfWZ1bmN0aW9uIFdyKGUpe3JldHVybiEhKFEuaXNQbGFpbk9iamVjdChlKSYmW0xyLFZyLGFyXS5maW5kKHQ9PlEuaXNGdW5jdGlvbihlW3RdKSkpfWZ1bmN0aW9uIEdyKGUpe3JldHVybiBlfWZ1bmN0aW9uIGVyKGUsdCl7cmV0dXJuKG49e30sLi4ucik9PldyKG4pP21pKGUsUHIoZSx0LG4scikpOm1pKGUsbmV3IFByb21pc2UoKHMsZCk9PntQcihlLHQsUS5leHRlbmQobix7c3VjY2VzczpzLGZhaWw6ZH0pLHIpfSkpfWZ1bmN0aW9uIEtpKGUsdCl7bGV0IG49ZVswXTtpZighdHx8IVEuaXNQbGFpbk9iamVjdCh0LmZvcm1hdEFyZ3MpJiZRLmlzUGxhaW5PYmplY3QobikpcmV0dXJuO2xldCByPXQuZm9ybWF0QXJncyxzPU9iamVjdC5rZXlzKHIpO2ZvcihsZXQgZD0wO2Q8cy5sZW5ndGg7ZCsrKXtsZXQgZz1zW2RdLHk9cltnXTtpZihRLmlzRnVuY3Rpb24oeSkpe2xldCB6PXkoZVswXVtnXSxuKTtpZihRLmlzU3RyaW5nKHopKXJldHVybiB6fWVsc2UgUS5oYXNPd24obixnKXx8KG5bZ109eSl9fWZ1bmN0aW9uIEppKGUsdCxuKXtyZXR1cm4gJG8oZSxRLmV4dGVuZChufHx7fSx7ZXJyTXNnOnQrIjpvayJ9KSl9ZnVuY3Rpb24gdW8oZSx0LG4scil7cmV0dXJuICRvKGUsUS5leHRlbmQoe2Vyck1zZzp0KyI6ZmFpbCIrKG4/IiAiK246IiIpfSxyKSl9ZnVuY3Rpb24gX2koZSx0LG4scil7aWYociYmci5iZWZvcmVJbnZva2Upe2xldCBkPXIuYmVmb3JlSW52b2tlKHQpO2lmKFEuaXNTdHJpbmcoZCkpcmV0dXJuIGR9bGV0IHM9S2kodCxyKTtpZihzKXJldHVybiBzfWZ1bmN0aW9uIEFvKGUpe2lmKCFRLmlzRnVuY3Rpb24oZSkpdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3M6IHR5cGUgY2hlY2sgZmFpbGVkIGZvciBhcmdzICJjYWxsYmFjayIuIEV4cGVjdGVkIEZ1bmN0aW9uJyl9ZnVuY3Rpb24gVW8oZSx0LG4pe3JldHVybiByPT57QW8ocik7bGV0IHM9X2koZSxbcl0sdm9pZCAwLG4pO2lmKHMpdGhyb3cgbmV3IEVycm9yKHMpO2xldCBkPSFOaShlKTtZaShlLHIpLGQmJihoaShlKSx0KCkpfX1mdW5jdGlvbiBfYShlLHQsbil7cmV0dXJuIHI9PntBbyhyKTtsZXQgcz1faShlLFtyXSx2b2lkIDAsbik7aWYocyl0aHJvdyBuZXcgRXJyb3Iocyk7ZT1lLnJlcGxhY2UoIm9mZiIsIm9uIiksV2koZSxyKSxOaShlKXx8KEdpKGUpLHQoKSl9fWZ1bmN0aW9uIEhvKGUpe3JldHVybiFlfHxRLmlzU3RyaW5nKGUpP2U6ZS5zdGFjaz8oY29uc29sZS5lcnJvcihlLm1lc3NhZ2UrYWUuTElORUZFRUQrZS5zdGFjayksZS5tZXNzYWdlKTplfWZ1bmN0aW9uIFppKGUsdCxuLHIpe3JldHVybiBzPT57bGV0IGQ9U28oZSxzLHIpLGc9X2koZSxbc10sbixyKTtyZXR1cm4gZz91byhkLGUsZyk6dChzLHtyZXNvbHZlOnk9PkppKGQsZSx5KSxyZWplY3Q6KHkseik9PnVvKGQsZSxIbyh5KSx6KX0pfX1mdW5jdGlvbiB3bihlLHQsbixyKXtyZXR1cm4oLi4ucyk9PntsZXQgZD1faShlLHMsbixyKTtpZihkKXRocm93IG5ldyBFcnJvcihkKTtyZXR1cm4gdC5hcHBseShudWxsLHMpfX1mdW5jdGlvbiBTbihlLHQsbixyKXtyZXR1cm4gWmkoZSx0LG4scil9ZnVuY3Rpb24gTm4oZSx0LG4pe3JldHVybiBVbyhlLHQsbil9ZnVuY3Rpb24gbHIoZSx0LG4pe3JldHVybiBfYShlLHQsbil9ZnVuY3Rpb24gT28oZSx0LG4scil7cmV0dXJuIGVyKGUsWmkoZSx0LHZvaWQgMCxyKSl9ZnVuY3Rpb24gRHQoZSx0LG4scil7cmV0dXJuIHduKGUsdCx2b2lkIDAscil9ZnVuY3Rpb24gUmUoZSx0LG4scil7cmV0dXJuIGVyKGUsU24oZSx0LHZvaWQgMCxyKSl9bGV0IFhpPSJiYXNlNjRUb0FycmF5QnVmZmVyIixyaT1be25hbWU6ImJhc2U2NCIsdHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9XSxraT0iYXJyYXlCdWZmZXJUb0Jhc2U2NCIsUWk9W3tuYW1lOiJhcnJheUJ1ZmZlciIsdHlwZTpbQXJyYXlCdWZmZXIsVWludDhBcnJheV0scmVxdWlyZWQ6ITB9XSxSaT1EdChYaSxlPT5laShlKSxyaSksWXI9RHQoa2ksZT0+enIoZSksUWkpO2Z1bmN0aW9uIGlhKCl7aWYodHlwZW9mIF9fU1lTVEVNX0lORk9fXyE9InVuZGVmaW5lZCIpcmV0dXJuIHdpbmRvdy5fX1NZU1RFTV9JTkZPX187bGV0e3Jlc29sdXRpb25XaWR0aDplfT1jLnNjcmVlbi5nZXRDdXJyZW50U2l6ZSgpfHx7cmVzb2x1dGlvbldpZHRoOjB9O3JldHVybntwbGF0Zm9ybTooYy5vcy5uYW1lfHwiIikudG9Mb3dlckNhc2UoKSxwaXhlbFJhdGlvOmMuc2NyZWVuLnNjYWxlLHdpbmRvd1dpZHRoOk1hdGgucm91bmQoZSl9fWZ1bmN0aW9uIFRvKGUsdCxuKXtlLiRwYWdlLm1ldGEuaXNOVnVlP2JhKGUsdCxuKTpYdChlLHQsbil9ZnVuY3Rpb24gWHQoZSx0LG4pe2J0Lmludm9rZVZpZXdNZXRob2QoInJlcXVlc3RDb21wb25lbnRJbmZvIix7cmVxczp0Lm1hcChyPT4oci5jb21wb25lbnQmJihyLmNvbXBvbmVudD1yLmNvbXBvbmVudC4kZWwubm9kZUlkKSxyKSl9LGUuJHBhZ2UuaWQsbil9ZnVuY3Rpb24gYmEoZSx0LG4pe2xldCByPXhpKHQpLHM9bmV3IEFycmF5KHIubGVuZ3RoKTt1bihyLGUuJGVsLHMpLHFyKGUuJHJlcXVpcmVOYXRpdmVQbHVnaW4oImRvbSIpLHMsMCxbXSxkPT57bihkKX0pfWZ1bmN0aW9uIHhpKGUpe2xldCB0PVtdO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtsZXQgcj1lW25dLnNlbGVjdG9yO3IuaW5kZXhPZigiIyIpPT09MCYmdC5wdXNoKHIuc3Vic3RyaW5nKDEpKX1yZXR1cm4gdH1mdW5jdGlvbiB1bihlLHQsbil7bGV0IHI9dC5jaGlsZHJlbjtpZighUS5pc0FycmF5KHIpKXJldHVybiExO2ZvcihsZXQgcz0wO3M8ci5sZW5ndGg7cysrKXtsZXQgZD1yW3NdO2lmKGQuYXR0cil7bGV0IGc9ZS5pbmRleE9mKGQuYXR0ci5pZCk7aWYoZz49MCYmKG5bZ109e2lkOmVbZ10scmVmOmQucmVmLGRhdGFzZXQ6YWUucGFyc2VOVnVlRGF0YXNldChkLmF0dHIpfSxlLmxlbmd0aD09PTEpKWJyZWFrfWQuY2hpbGRyZW4mJnVuKGUsZCxuKX19ZnVuY3Rpb24gcXIoZSx0LG4scixzKXtsZXQgZD10W25dO2UuZ2V0Q29tcG9uZW50UmVjdChkLnJlZixnPT57Zy5zaXplLmlkPWQuaWQsZy5zaXplLmRhdGFzZXQ9ZC5kYXRhc2V0LHIucHVzaChnLnNpemUpLG4rPTEsbjx0Lmxlbmd0aD9xcihlLHQsbixyLHMpOnMocil9KX1mdW5jdGlvbiBCaShlLHQpe2J0Lmludm9rZVZpZXdNZXRob2QoInNldFBhZ2VNZXRhIix0LGUuJHBhZ2UuaWQpfWxldCBZbj1lPT5lIT09bnVsbCYmdHlwZW9mIGU9PSJvYmplY3QiLElvPVsieyIsIn0iXTtjbGFzcyBGYXtjb25zdHJ1Y3Rvcigpe3RoaXMuX2NhY2hlcz1PYmplY3QuY3JlYXRlKG51bGwpfWludGVycG9sYXRlKHQsbixyPUlvKXtpZighbilyZXR1cm5bdF07bGV0IHM9dGhpcy5fY2FjaGVzW3RdO3JldHVybiBzfHwocz1hYSh0LHIpLHRoaXMuX2NhY2hlc1t0XT1zKSx5YShzLG4pfX1sZXQgb2E9L14oPzpcZCkrLyxqbz0vXig/Olx3KSsvO2Z1bmN0aW9uIGFhKGUsW3Qsbl0pe2xldCByPVtdLHM9MCxkPSIiO2Zvcig7czxlLmxlbmd0aDspe2xldCBnPWVbcysrXTtpZihnPT09dCl7ZCYmci5wdXNoKHt0eXBlOiJ0ZXh0Iix2YWx1ZTpkfSksZD0iIjtsZXQgeT0iIjtmb3IoZz1lW3MrK107ZyE9PXZvaWQgMCYmZyE9PW47KXkrPWcsZz1lW3MrK107bGV0IHo9Zz09PW4sUD1vYS50ZXN0KHkpPyJsaXN0Ijp6JiZqby50ZXN0KHkpPyJuYW1lZCI6InVua25vd24iO3IucHVzaCh7dmFsdWU6eSx0eXBlOlB9KX1lbHNlIGQrPWd9cmV0dXJuIGQmJnIucHVzaCh7dHlwZToidGV4dCIsdmFsdWU6ZH0pLHJ9ZnVuY3Rpb24geWEoZSx0KXtsZXQgbj1bXSxyPTAscz1BcnJheS5pc0FycmF5KHQpPyJsaXN0IjpZbih0KT8ibmFtZWQiOiJ1bmtub3duIjtpZihzPT09InVua25vd24iKXJldHVybiBuO2Zvcig7cjxlLmxlbmd0aDspe2xldCBkPWVbcl07c3dpdGNoKGQudHlwZSl7Y2FzZSJ0ZXh0IjpuLnB1c2goZC52YWx1ZSk7YnJlYWs7Y2FzZSJsaXN0IjpuLnB1c2godFtwYXJzZUludChkLnZhbHVlLDEwKV0pO2JyZWFrO2Nhc2UibmFtZWQiOnM9PT0ibmFtZWQiJiZuLnB1c2godFtkLnZhbHVlXSk7YnJlYWs7Y2FzZSJ1bmtub3duIjpicmVha31yKyt9cmV0dXJuIG59bGV0IE5yPSJ6aC1IYW5zIixrcj0iemgtSGFudCIsa249ImVuIixjcj0iZnIiLHZyPSJlcyIsZW89T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSx6bz0oZSx0KT0+ZW8uY2FsbChlLHQpLExhPW5ldyBGYTtmdW5jdGlvbiBFYShlLHQpe3JldHVybiEhdC5maW5kKG49PmUuaW5kZXhPZihuKSE9PS0xKX1mdW5jdGlvbiB0byhlLHQpe3JldHVybiB0LmZpbmQobj0+ZS5pbmRleE9mKG4pPT09MCl9ZnVuY3Rpb24gS3IoZSx0KXtpZighZSlyZXR1cm47aWYoZT1lLnRyaW0oKS5yZXBsYWNlKC9fL2csIi0iKSx0JiZ0W2VdKXJldHVybiBlO2lmKGU9ZS50b0xvd2VyQ2FzZSgpLGU9PT0iY2hpbmVzZSIpcmV0dXJuIE5yO2lmKGUuaW5kZXhPZigiemgiKT09PTApcmV0dXJuIGUuaW5kZXhPZigiLWhhbnMiKT4tMT9OcjplLmluZGV4T2YoIi1oYW50Iik+LTF8fEVhKGUsWyItdHciLCItaGsiLCItbW8iLCItY2h0Il0pP2tyOk5yO2xldCBuPXRvKGUsW2tuLGNyLHZyXSk7aWYobilyZXR1cm4gbn1jbGFzcyBNaXtjb25zdHJ1Y3Rvcih7bG9jYWxlOnQsZmFsbGJhY2tMb2NhbGU6bixtZXNzYWdlczpyLHdhdGNoZXI6cyxmb3JtYXRlcjpkfSl7dGhpcy5sb2NhbGU9a24sdGhpcy5mYWxsYmFja0xvY2FsZT1rbix0aGlzLm1lc3NhZ2U9e30sdGhpcy5tZXNzYWdlcz17fSx0aGlzLndhdGNoZXJzPVtdLG4mJih0aGlzLmZhbGxiYWNrTG9jYWxlPW4pLHRoaXMuZm9ybWF0ZXI9ZHx8TGEsdGhpcy5tZXNzYWdlcz1yfHx7fSx0aGlzLnNldExvY2FsZSh0fHxrbikscyYmdGhpcy53YXRjaExvY2FsZShzKX1zZXRMb2NhbGUodCl7bGV0IG49dGhpcy5sb2NhbGU7dGhpcy5sb2NhbGU9S3IodCx0aGlzLm1lc3NhZ2VzKXx8dGhpcy5mYWxsYmFja0xvY2FsZSx0aGlzLm1lc3NhZ2VzW3RoaXMubG9jYWxlXXx8KHRoaXMubWVzc2FnZXNbdGhpcy5sb2NhbGVdPXt9KSx0aGlzLm1lc3NhZ2U9dGhpcy5tZXNzYWdlc1t0aGlzLmxvY2FsZV0sbiE9PXRoaXMubG9jYWxlJiZ0aGlzLndhdGNoZXJzLmZvckVhY2gocj0+e3IodGhpcy5sb2NhbGUsbil9KX1nZXRMb2NhbGUoKXtyZXR1cm4gdGhpcy5sb2NhbGV9d2F0Y2hMb2NhbGUodCl7bGV0IG49dGhpcy53YXRjaGVycy5wdXNoKHQpLTE7cmV0dXJuKCk9Pnt0aGlzLndhdGNoZXJzLnNwbGljZShuLDEpfX1hZGQodCxuLHI9ITApe2xldCBzPXRoaXMubWVzc2FnZXNbdF07cz9yP09iamVjdC5hc3NpZ24ocyxuKTpPYmplY3Qua2V5cyhuKS5mb3JFYWNoKGQ9Pnt6byhzLGQpfHwoc1tkXT1uW2RdKX0pOnRoaXMubWVzc2FnZXNbdF09bn1mKHQsbixyKXtyZXR1cm4gdGhpcy5mb3JtYXRlci5pbnRlcnBvbGF0ZSh0LG4scikuam9pbigiIil9dCh0LG4scil7bGV0IHM9dGhpcy5tZXNzYWdlO3JldHVybiB0eXBlb2Ygbj09InN0cmluZyI/KG49S3Iobix0aGlzLm1lc3NhZ2VzKSxuJiYocz10aGlzLm1lc3NhZ2VzW25dKSk6cj1uLHpvKHMsdCk/dGhpcy5mb3JtYXRlci5pbnRlcnBvbGF0ZShzW3RdLHIpLmpvaW4oIiIpOihjb25zb2xlLndhcm4oYENhbm5vdCB0cmFuc2xhdGUgdGhlIHZhbHVlIG9mIGtleXBhdGggJHt0fS4gVXNlIHRoZSB2YWx1ZSBvZiBrZXlwYXRoIGFzIGRlZmF1bHQuYCksdCl9fWZ1bmN0aW9uIFdvKGUsdCl7ZS4kd2F0Y2hMb2NhbGU/ZS4kd2F0Y2hMb2NhbGUobj0+e3Quc2V0TG9jYWxlKG4pfSk6ZS4kd2F0Y2goKCk9PmUuJGxvY2FsZSxuPT57dC5zZXRMb2NhbGUobil9KX1mdW5jdGlvbiBpaSgpe3JldHVybiB0eXBlb2Ygc2UhPSJ1bmRlZmluZWQiJiZzZS5nZXRMb2NhbGU/c2UuZ2V0TG9jYWxlKCk6dHlwZW9mIGdsb2JhbCE9InVuZGVmaW5lZCImJmdsb2JhbC5nZXRMb2NhbGU/Z2xvYmFsLmdldExvY2FsZSgpOmtufWZ1bmN0aW9uIGJpKGUsdD17fSxuLHIpe3R5cGVvZiBlIT0ic3RyaW5nIiYmKFtlLHRdPVt0LGVdKSx0eXBlb2YgZSE9InN0cmluZyImJihlPWlpKCkpLHR5cGVvZiBuIT0ic3RyaW5nIiYmKG49dHlwZW9mIEkhPSJ1bmRlZmluZWQiJiZJLmZhbGxiYWNrTG9jYWxlfHxrbik7bGV0IHM9bmV3IE1pKHtsb2NhbGU6ZSxmYWxsYmFja0xvY2FsZTpuLG1lc3NhZ2VzOnQsd2F0Y2hlcjpyfSksZD0oZyx5KT0+e2lmKHR5cGVvZiBFbiE9ImZ1bmN0aW9uIilkPWZ1bmN0aW9uKHosUCl7cmV0dXJuIHMudCh6LFApfTtlbHNle2xldCB6PSExO2Q9ZnVuY3Rpb24oUCwkKXtsZXQgX2U9RW4oKS4kdm07cmV0dXJuIF9lJiYoX2UuJGxvY2FsZSx6fHwoej0hMCxXbyhfZSxzKSkpLHMudChQLCQpfX1yZXR1cm4gZChnLHkpfTtyZXR1cm57aTE4bjpzLGYoZyx5LHope3JldHVybiBzLmYoZyx5LHopfSx0KGcseSl7cmV0dXJuIGQoZyx5KX0sYWRkKGcseSx6PSEwKXtyZXR1cm4gcy5hZGQoZyx5LHopfSx3YXRjaChnKXtyZXR1cm4gcy53YXRjaExvY2FsZShnKX0sZ2V0TG9jYWxlKCl7cmV0dXJuIHMuZ2V0TG9jYWxlKCl9LHNldExvY2FsZShnKXtyZXR1cm4gcy5zZXRMb2NhbGUoZyl9fX1mdW5jdGlvbiB0cihlLHQpe3JldHVybiBlLmluZGV4T2YodFswXSk+LTF9bGV0IHdyPWFlLm9uY2UoKCk9PnR5cGVvZiBJIT0idW5kZWZpbmVkIiYmSS5sb2NhbGVzJiYhIU9iamVjdC5rZXlzKEkubG9jYWxlcykubGVuZ3RoKSxEO2Z1bmN0aW9uIGllKCl7bGV0IGU9c2UuZ2V0TG9jYWxlKCksdD1JLmxvY2FsZXM7cmV0dXJuIHRbZV18fHRbSS5mYWxsYmFja0xvY2FsZV18fHQuZW58fHt9fWZ1bmN0aW9uIGJlKGUpe3JldHVybiB0cihlLGFlLkkxOE5fSlNPTl9ERUxJTUlURVJTKT9aKCkuZihlLGllKCksYWUuSTE4Tl9KU09OX0RFTElNSVRFUlMpOmV9ZnVuY3Rpb24gRyhlLHQpe2lmKHQubGVuZ3RoPT09MSl7aWYoZSl7bGV0IHI9ZVt0WzBdXTtpZihRLmlzU3RyaW5nKHIpJiZ0cihyLGFlLkkxOE5fSlNPTl9ERUxJTUlURVJTKSlyZXR1cm4gZX1yZXR1cm59bGV0IG49dC5zaGlmdCgpO3JldHVybiBHKGUmJmVbbl0sdCl9ZnVuY3Rpb24gVihlLHQpe3JldHVybiB0Lm1hcChuPT5KKGUsbikpfWZ1bmN0aW9uIEooZSx0KXtsZXQgbj1HKGUsdCk7aWYoIW4pcmV0dXJuITE7bGV0IHI9dFt0Lmxlbmd0aC0xXSxzPW5bcl07cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLHIse2dldCgpe3JldHVybiBiZShzKX0sc2V0KGQpe3M9ZH19KSwhMH1mdW5jdGlvbiBaKCl7aWYoIUQpe2xldCBlO2lmKHR5cGVvZiBFbj09ImZ1bmN0aW9uIj9lPXYucmVxdWlyZU1vZHVsZSgicGx1cyIpLmdldExhbmd1YWdlKCk6ZT1jLndlYnZpZXcuY3VycmVudFdlYnZpZXcoKS5nZXRTdHlsZSgpLmxvY2FsZSxEPWJpKGUpLHdyKCkpe2xldCB0PU9iamVjdC5rZXlzKEkubG9jYWxlc3x8e30pO3QubGVuZ3RoJiZ0LmZvckVhY2gobj0+RC5hZGQobixJLmxvY2FsZXNbbl0pKSxELnNldExvY2FsZShlKX19cmV0dXJuIER9ZnVuY3Rpb24gZ2UoZSx0LG4pe3JldHVybiB0LnJlZHVjZSgocixzLGQpPT4ocltlK3NdPW5bZF0scikse30pfWxldCB6dD1hZS5vbmNlKCgpPT57bGV0IGU9InVuaS5hcHAuIix0PVsicXVpdCJdO1ooKS5hZGQoa24sZ2UoZSx0LFsiUHJlc3MgYmFjayBidXR0b24gYWdhaW4gdG8gZXhpdCJdKSwhMSksWigpLmFkZCh2cixnZShlLHQsWyJQdWxzZSBvdHJhIHZleiBwYXJhIHNhbGlyIl0pLCExKSxaKCkuYWRkKGNyLGdlKGUsdCxbIkFwcHV5ZXogXHhFMCBub3V2ZWF1IHBvdXIgcXVpdHRlciBsJ2FwcGxpY2F0aW9uIl0pLCExKSxaKCkuYWRkKE5yLGdlKGUsdCxbIlx1NTE4RFx1NjMwOVx1NEUwMFx1NkIyMVx1OTAwMFx1NTFGQVx1NUU5NFx1NzUyOCJdKSwhMSksWigpLmFkZChrcixnZShlLHQsWyJcdTUxOERcdTYzMDlcdTRFMDBcdTZCMjFcdTkwMDBcdTUxRkFcdTYxQzlcdTc1MjgiXSksITEpfSksQ249YWUub25jZSgoKT0+e2xldCBlPSJ1bmkuc2hvd0FjdGlvblNoZWV0LiIsdD1bImNhbmNlbCJdO1ooKS5hZGQoa24sZ2UoZSx0LFsiQ2FuY2VsIl0pLCExKSxaKCkuYWRkKHZyLGdlKGUsdCxbIkNhbmNlbGFyIl0pLCExKSxaKCkuYWRkKGNyLGdlKGUsdCxbIkFubnVsZXIiXSksITEpLFooKS5hZGQoTnIsZ2UoZSx0LFsiXHU1M0Q2XHU2RDg4Il0pLCExKSxaKCkuYWRkKGtyLGdlKGUsdCxbIlx1NTNENlx1NkQ4OCJdKSwhMSl9KSxfbj1hZS5vbmNlKCgpPT57bGV0IGU9InVuaS5zaG93TW9kYWwuIix0PVsiY2FuY2VsIiwiY29uZmlybSJdO1ooKS5hZGQoa24sZ2UoZSx0LFsiQ2FuY2VsIiwiT0siXSksITEpLFooKS5hZGQodnIsZ2UoZSx0LFsiQ2FuY2VsYXIiLCJPSyJdKSwhMSksWigpLmFkZChjcixnZShlLHQsWyJBbm51bGVyIiwiT0siXSksITEpLFooKS5hZGQoTnIsZ2UoZSx0LFsiXHU1M0Q2XHU2RDg4IiwiXHU3ODZFXHU1QjlBIl0pLCExKSxaKCkuYWRkKGtyLGdlKGUsdCxbIlx1NTNENlx1NkQ4OCIsIlx1NzhCQVx1NUI5QSJdKSwhMSl9KSxtcj1hZS5vbmNlKCgpPT57bGV0IGU9InVuaS5jaG9vc2VJbWFnZS4iLHQ9WyJjYW5jZWwiLCJzb3VyY2VUeXBlLmFsYnVtIiwic291cmNlVHlwZS5jYW1lcmEiXTtaKCkuYWRkKGtuLGdlKGUsdCxbIkNhbmNlbCIsIkFsYnVtIiwiQ2FtZXJhIl0pLCExKSxaKCkuYWRkKHZyLGdlKGUsdCxbIkNhbmNlbGFyIiwiXHhDMWxidW0iLCJDXHhFMW1hcmEiXSksITEpLFooKS5hZGQoY3IsZ2UoZSx0LFsiQW5udWxlciIsIkFsYnVtIiwiQ2FtXHhFOXJhIl0pLCExKSxaKCkuYWRkKE5yLGdlKGUsdCxbIlx1NTNENlx1NkQ4OCIsIlx1NEVDRVx1NzZGOFx1NTE4Q1x1OTAwOVx1NjJFOSIsIlx1NjJDRFx1NjQ0NCJdKSwhMSksWigpLmFkZChrcixnZShlLHQsWyJcdTUzRDZcdTZEODgiLCJcdTVGOUVcdTc2RjhcdTUxOEFcdTkwNzhcdTY0QzciLCJcdTYyQ0RcdTY1MUQiXSksITEpfSkscW49YWUub25jZSgoKT0+e2xldCBlPSJ1bmkuY2hvb3NlVmlkZW8uIix0PVsiY2FuY2VsIiwic291cmNlVHlwZS5hbGJ1bSIsInNvdXJjZVR5cGUuY2FtZXJhIl07WigpLmFkZChrbixnZShlLHQsWyJDYW5jZWwiLCJBbGJ1bSIsIkNhbWVyYSJdKSwhMSksWigpLmFkZCh2cixnZShlLHQsWyJDYW5jZWxhciIsIlx4QzFsYnVtIiwiQ1x4RTFtYXJhIl0pLCExKSxaKCkuYWRkKGNyLGdlKGUsdCxbIkFubnVsZXIiLCJBbGJ1bSIsIkNhbVx4RTlyYSJdKSwhMSksWigpLmFkZChOcixnZShlLHQsWyJcdTUzRDZcdTZEODgiLCJcdTRFQ0VcdTc2RjhcdTUxOENcdTkwMDlcdTYyRTkiLCJcdTYyQ0RcdTY0NDQiXSksITEpLFooKS5hZGQoa3IsZ2UoZSx0LFsiXHU1M0Q2XHU2RDg4IiwiXHU1RjlFXHU3NkY4XHU1MThBXHU5MDc4XHU2NEM3IiwiXHU2MkNEXHU2NTFEIl0pLCExKX0pLFZhPWFlLm9uY2UoKCk9PntsZXQgZT0idW5pLnByZXZpZXdJbWFnZS4iLHQ9WyJjYW5jZWwiLCJidXR0b24uc2F2ZSIsInNhdmUuc3VjY2VzcyIsInNhdmUuZmFpbCJdO1ooKS5hZGQoa24sZ2UoZSx0LFsiQ2FuY2VsIiwiU2F2ZSBJbWFnZSIsIlNhdmVkIHN1Y2Nlc3NmdWxseSIsIlNhdmUgZmFpbGVkIl0pLCExKSxaKCkuYWRkKHZyLGdlKGUsdCxbIkNhbmNlbGFyIiwiR3VhcmRhciBpbWFnZW4iLCJHdWFyZGFkbyBleGl0b3NhbWVudGUiLCJFcnJvciBhbCBndWFyZGFyIl0pLCExKSxaKCkuYWRkKGNyLGdlKGUsdCxbIkFubnVsZXIiLCJHdWFyZGFyIGltYWdlbiIsIkVucmVnaXN0clx4RTkgYXZlYyBzdWNjXHhFOHMiLCJceEM5Y2hlYyBkZSBsYSBzYXV2ZWdhcmRlIl0pLCExKSxaKCkuYWRkKE5yLGdlKGUsdCxbIlx1NTNENlx1NkQ4OCIsIlx1NEZERFx1NUI1OFx1NTZGRVx1NTBDRiIsIlx1NEZERFx1NUI1OFx1NTZGRVx1NTBDRlx1NTIzMFx1NzZGOFx1NTE4Q1x1NjIxMFx1NTI5RiIsIlx1NEZERFx1NUI1OFx1NTZGRVx1NTBDRlx1NTIzMFx1NzZGOFx1NTE4Q1x1NTkzMVx1OEQyNSJdKSwhMSksWigpLmFkZChrcixnZShlLHQsWyJcdTUzRDZcdTZEODgiLCJcdTRGRERcdTVCNThcdTU3MTZcdTUwQ0YiLCJcdTRGRERcdTVCNThcdTU3MTZcdTUwQ0ZcdTUyMzBcdTc2RjhcdTUxOEFcdTYyMTBcdTUyOUYiLCJcdTRGRERcdTVCNThcdTU3MTZcdTUwQ0ZcdTUyMzBcdTc2RjhcdTUxOEFcdTU5MzFcdTY1NTciXSksITEpfSksUG89YWUub25jZSgoKT0+e2xldCBlPSJ1bmkuc2V0Q2xpcGJvYXJkRGF0YS4iLHQ9WyJzdWNjZXNzIiwiZmFpbCJdO1ooKS5hZGQoa24sZ2UoZSx0LFsiQ29udGVudCBjb3BpZWQiLCJDb3B5IGZhaWxlZCwgcGxlYXNlIGNvcHkgbWFudWFsbHkiXSksITEpLFooKS5hZGQodnIsZ2UoZSx0LFsiQ29udGVuaWRvIGNvcGlhZG8iLCJFcnJvciBhbCBjb3BpYXIsIGNvcGllIG1hbnVhbG1lbnRlIl0pLCExKSxaKCkuYWRkKGNyLGdlKGUsdCxbIkNvbnRlbnUgY29waVx4RTkiLCJceEM5Y2hlYyBkZSBsYSBjb3BpZSwgY29waWV6IG1hbnVlbGxlbWVudCJdKSwhMSksWigpLmFkZChOcixnZShlLHQsWyJcdTUxODVcdTVCQjlcdTVERjJcdTU5MERcdTUyMzYiLCJcdTU5MERcdTUyMzZcdTU5MzFcdThEMjVcdUZGMENcdThCRjdcdTYyNEJcdTUyQThcdTU5MERcdTUyMzYiXSksITEpLFooKS5hZGQoa3IsZ2UoZSx0LFsiXHU1MTY3XHU1QkI5XHU1REYyXHU1RkE5XHU1MjM2IiwiXHU1RkE5XHU1MjM2XHU1OTMxXHU2NTU3XHVGRjBDXHU4QUNCXHU2MjRCXHU1MkQ1XHU1RkE5XHU4OEZEIl0pLCExKX0pLE5vPWFlLm9uY2UoKCk9PntsZXQgZT0idW5pLnNjYW5Db2RlLiIsdD1bInRpdGxlIiwiYWxidW0iLCJmYWlsIiwiZmxhc2gub24iLCJmbGFzaC5vZmYiXTtaKCkuYWRkKGtuLGdlKGUsdCxbIlNjYW4gY29kZSIsIkFsYnVtIiwiUmVjb2duaXRpb24gZmFpbHVyZSIsIlRhcCB0byB0dXJuIGxpZ2h0IG9uIiwiVGFwIHRvIHR1cm4gbGlnaHQgb2ZmIl0pLCExKSxaKCkuYWRkKHZyLGdlKGUsdCxbIkNceEYzZGlnbyBkZSBlc2NhbmVvIiwiXHhDMWxidW0iLCJceEM5Y2hlYyBkZSBsYSByZWNvbm5haXNzYW5jZSIsIlRvcXVlIHBhcmEgZW5jZW5kZXIgbGEgbHV6IiwiVG9xdWUgcGFyYSBhcGFnYXIgbGEgbHV6Il0pLCExKSxaKCkuYWRkKGNyLGdlKGUsdCxbIkNvZGUgZFx1MjAxOWFuYWx5c2UiLCJBbGJ1bSIsIkZhbGxvIGRlIHJlY29ub2NpbWllbnRvIiwiQXBwdXlleiBwb3VyIGFjdGl2ZXIgbCdceEU5Y2xhaXJhZ2UiLCJBcHB1eWV6IHBvdXIgZFx4RTlzYWN0aXZlciBsJ1x4RTljbGFpcmFnZSJdKSwhMSksWigpLmFkZChOcixnZShlLHQsWyJcdTYyNkJcdTc4MDEiLCJcdTc2RjhcdTUxOEMiLCJcdThCQzZcdTUyMkJcdTU5MzFcdThEMjUiLCJcdThGN0JcdTg5RTZcdTcxNjdcdTRFQUUiLCJcdThGN0JcdTg5RTZcdTUxNzNcdTk1RUQiXSksITEpLFooKS5hZGQoa3IsZ2UoZSx0LFsiXHU2MzgzXHU3OEJDIiwiXHU3NkY4XHU1MThBIiwiXHU4QjU4XHU1MjI1XHU1OTMxXHU2NTU3IiwiXHU4RjE1XHU4OUY4XHU3MTY3XHU0RUFFIiwiXHU4RjE1XHU4OUY4XHU5NURDXHU5NTg5Il0pLCExKX0pLHNhPWFlLm9uY2UoKCk9PntsZXQgZT0idW5pLnN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbi4iLHQ9WyJhdXRoQ29udGVudCJdO1ooKS5hZGQoa24sZ2UoZSx0LFsiRmluZ2VycHJpbnQgcmVjb2duaXRpb24iXSksITEpLFooKS5hZGQodnIsZ2UoZSx0LFsiUmVjb25vY2ltaWVudG8gZGUgaHVlbGxhcyBkYWN0aWxhcmVzIl0pLCExKSxaKCkuYWRkKGNyLGdlKGUsdCxbIlJlY29ubmFpc3NhbmNlIGRlIGwnZW1wcmVpbnRlIGRpZ2l0YWxlIl0pLCExKSxaKCkuYWRkKE5yLGdlKGUsdCxbIlx1NjMwN1x1N0VCOVx1OEJDNlx1NTIyQlx1NEUyRC4uLiJdKSwhMSksWigpLmFkZChrcixnZShlLHQsWyJcdTYzMDdcdTdEMEJcdThCNThcdTUyMjVcdTRFMkQuLi4iXSksITEpfSk7ZnVuY3Rpb24gJGEoZSl7aWYod3IoKSlyZXR1cm4gVihlLFtbInRpdGxlVGV4dCJdLFsic2VhcmNoSW5wdXQiLCJwbGFjZWhvbGRlciJdXSl9ZnVuY3Rpb24gVWEoZSl7aWYod3IoKSl7bGV0IHQ9ImNhcHRpb24iO3JldHVybiBWKGUsW1siY29udGVudGRvd24iLHRdLFsiY29udGVudG92ZXIiLHRdLFsiY29udGVudHJlZnJlc2giLHRdXSl9fWZ1bmN0aW9uIENzKGUpe2xldCB0PW5ldyBhZS5FbWl0dGVyO3JldHVybntvbihuLHIpe3JldHVybiB0Lm9uKG4scil9LG9uY2UobixyKXtyZXR1cm4gdC5vbmNlKG4scil9LG9mZihuLHIpe3JldHVybiB0Lm9mZihuLHIpfSxlbWl0KG4sLi4ucil7cmV0dXJuIHQuZW1pdChuLC4uLnIpfSxzdWJzY3JpYmUobixyLHM9ITEpe3Rbcz8ib25jZSI6Im9uIl0oYCR7ZX0uJHtufWAscil9LHVuc3Vic2NyaWJlKG4scil7dC5vZmYoYCR7ZX0uJHtufWAscil9LHN1YnNjcmliZUhhbmRsZXIobixyLHMpe3QuZW1pdChgJHtlfS4ke259YCxyLHMpfX19bGV0IGxhPSJpbnZva2VWaWV3QXBpIixHbz0iaW52b2tlU2VydmljZUFwaSI7ZnVuY3Rpb24gb2koZSl7cmV0dXJuIGU9ZSsiIixlLmluZGV4T2YoInJweCIpIT09LTF8fGUuaW5kZXhPZigidXB4IikhPT0tMX1mdW5jdGlvbiB5aShlLHQ9ITEpe2lmKHQpcmV0dXJuIHdhKGUpO2lmKFEuaXNTdHJpbmcoZSkpe2xldCBuPXBhcnNlSW50KGUpfHwwO3JldHVybiBvaShlKT9zZS51cHgycHgobik6bn1yZXR1cm4gZX1mdW5jdGlvbiB3YShlKXtyZXR1cm4gb2koZSk/ZS5yZXBsYWNlKC8oXGQrKFwuXGQrKT8pW3J1XXB4L2csKHQsbik9PnNlLnVweDJweChwYXJzZUZsb2F0KG4pKSsicHgiKTplfWZ1bmN0aW9uIG5yKGUpe2xldCB0PWFlLnJlc29sdmVDb21wb25lbnRJbnN0YW5jZShlKTtpZih0LiRwYWdlKXJldHVybiB0LiRwYWdlLmlkO2lmKCF0LiQpcmV0dXJuO2xldCBuPXQuJC5yb290LnByb3h5O2lmKG4mJm4uJHBhZ2UpcmV0dXJuIG4uJHBhZ2UuaWR9ZnVuY3Rpb24gUnIoKXtsZXQgZT1HbigpLHQ9ZS5sZW5ndGg7aWYodClyZXR1cm4gZVt0LTFdfWZ1bmN0aW9uIGtvKCl7bGV0IGU9UnIoKTtpZihlKXJldHVybiBlLiRwYWdlLm1ldGF9ZnVuY3Rpb24gY2EoKXtsZXQgZT1rbygpO3JldHVybiBlP2UuaWQ6LTF9ZnVuY3Rpb24geHIoKXtsZXQgZT1ScigpO2lmKGUpcmV0dXJuIGUuJHZtfWxldCBBcz1bIm5hdmlnYXRpb25CYXIiLCJwdWxsVG9SZWZyZXNoIl07ZnVuY3Rpb24gT3MoKXtyZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShJLmdsb2JhbFN0eWxlfHx7fSkpfWZ1bmN0aW9uIFRzKGUsdCl7bGV0IG49T3MoKSxyPVEuZXh0ZW5kKHtpZDp0fSxuLGUpO0FzLmZvckVhY2goZD0+e3JbZF09US5leHRlbmQoe30sbltkXSxlW2RdKX0pO2xldHtuYXZpZ2F0aW9uQmFyOnN9PXI7cmV0dXJuIHMudGl0bGVUZXh0JiZzLnRpdGxlSW1hZ2UmJihzLnRpdGxlVGV4dD0iIikscn1mdW5jdGlvbiBJcyhlKXtyZXR1cm4gSlNPTi5wYXJzZSh5aShKU09OLnN0cmluZ2lmeShlKSwhMCkpfWZ1bmN0aW9uIFpzKGUpe3JldHVybiBlLm9mZnNldCYmKGUub2Zmc2V0PXlpKGUub2Zmc2V0KSksZS5oZWlnaHQmJihlLmhlaWdodD15aShlLmhlaWdodCkpLGUucmFuZ2UmJihlLnJhbmdlPXlpKGUucmFuZ2UpKSxlfWZ1bmN0aW9uIEpyKGUsdCxuLHIscyl7bGV0e2lkOmQscm91dGU6Z309cjtyZXR1cm57aWQ6ZCxwYXRoOmFlLmFkZExlYWRpbmdTbGFzaChnKSxyb3V0ZTpnLGZ1bGxQYXRoOnQsb3B0aW9uczpuLG1ldGE6cixvcGVuVHlwZTplLGV2ZW50Q2hhbm5lbDpzLHN0YXR1c0JhclN0eWxlOnIubmF2aWdhdGlvbkJhci50aXRsZUNvbG9yPT09IiMwMDAwMDAiPyJkYXJrIjoibGlnaHQifX1mdW5jdGlvbiBFaShlLHQsbil7bGV0IHI9ZS4kW3RdOyFRLmlzQXJyYXkocil8fG4uX193ZWgmJlEucmVtb3ZlKHIsbi5fX3dlaCl9ZnVuY3Rpb24gSG4oZSx0LG4pe2lmKFEuaXNTdHJpbmcoZSkpbj10LHQ9ZSxlPXhyKCk7ZWxzZSBpZih0eXBlb2YgZT09Im51bWJlciIpe2xldCBzPUduKCkuZmluZChkPT5kLiRwYWdlLmlkPT09ZSk7cz9lPXMuJHZtOmU9eHIoKX1pZighZSlyZXR1cm47aWYoZS5fX2NhbGxfaG9vaylyZXR1cm4gZS5fX2NhbGxfaG9vayh0LG4pO2xldCByPWUuJFt0XTtyZXR1cm4gciYmYWUuaW52b2tlQXJyYXlGbnMocixuKX1mdW5jdGlvbiB5bChlKXtpZihlLmluZGV4T2YoIi8iKT09PTApcmV0dXJuIGU7bGV0IHQ9IiIsbj1HbigpO3JldHVybiBuLmxlbmd0aCYmKHQ9bltuLmxlbmd0aC0xXS4kcGFnZS5yb3V0ZSksSGEodCxlKX1mdW5jdGlvbiBIYShlLHQpe2lmKHQuaW5kZXhPZigiLyIpPT09MClyZXR1cm4gdDtpZih0LmluZGV4T2YoIi4vIik9PT0wKXJldHVybiBIYShlLHQuc2xpY2UoMikpO2xldCBuPXQuc3BsaXQoIi8iKSxyPW4ubGVuZ3RoLHM9MDtmb3IoO3M8ciYmbltzXT09PSIuLiI7cysrKTtuLnNwbGljZSgwLHMpLHQ9bi5qb2luKCIvIik7bGV0IGQ9ZS5sZW5ndGg+MD9lLnNwbGl0KCIvIik6W107cmV0dXJuIGQuc3BsaWNlKGQubGVuZ3RoLXMtMSxzKzEpLGFlLmFkZExlYWRpbmdTbGFzaChkLmNvbmNhdChuKS5qb2luKCIvIikpfWZ1bmN0aW9uIGZvKGUsdD0hMSl7cmV0dXJuIHQ/R2UuZmluZChuPT5uLnBhdGg9PT1lfHxuLmFsaWFzPT09ZSk6R2UuZmluZChuPT5uLnBhdGg9PT1lKX1mdW5jdGlvbiBYcyhlKXtsZXQgdD1mbyhlKTtpZih0KXJldHVybiB0Lm1ldGF9ZnVuY3Rpb24gUHMoZSx0LG4pe2xldCByPWZvKGFlLmFkZExlYWRpbmdTbGFzaCh0KSk7aWYocil7bGV0e21ldGE6ZH09cjtkZWxldGUgZC50YWJCYXJJbmRleCxkLmlzUXVpdD1kLmlzVGFiQmFyPSExfWxldCBzPWZvKGFlLmFkZExlYWRpbmdTbGFzaChuKSk7aWYocyl7bGV0e21ldGE6ZH09cztkLnRhYkJhckluZGV4PWUsZC5pc1F1aXQ9ZC5pc1RhYkJhcj0hMDtsZXQgZz1JLnRhYkJhcjtnJiZnLmxpc3QmJmcubGlzdFtlXSYmKGcubGlzdFtlXS5wYWdlUGF0aD1hZS5yZW1vdmVMZWFkaW5nU2xhc2gobikpfX1sZXQgaG8sTnMsU2E7ZnVuY3Rpb24gUm8oKXtyZXR1cm4gdHlwZW9mIHdpbmRvdz09Im9iamVjdCImJnR5cGVvZiBuYXZpZ2F0b3I9PSJvYmplY3QiJiZ0eXBlb2YgZG9jdW1lbnQ9PSJvYmplY3QiPyJ3ZWJ2aWV3IjoidjgifWZ1bmN0aW9uIGtzKCl7cmV0dXJuIGhvLndlYnZpZXcuY3VycmVudFdlYnZpZXcoKS5pZH1sZXQgamEsQ2Esbm89e307ZnVuY3Rpb24gcG8oZSl7bGV0IHQ9ZS5kYXRhJiZlLmRhdGEuX19tZXNzYWdlO2lmKCF0fHwhdC5fX3BhZ2UpcmV0dXJuO2xldCBuPXQuX19wYWdlLHI9bm9bbl07ciYmcih0KSx0LmtlZXB8fGRlbGV0ZSBub1tuXX1mdW5jdGlvbiB1YShlLHQpe1JvKCk9PT0idjgiP1NhPyhqYSYmamEuY2xvc2UoKSxqYT1uZXcgU2Eoa3MoKSksamEub25tZXNzYWdlPXBvKTpDYXx8KENhPU5zLnJlcXVpcmVNb2R1bGUoImdsb2JhbEV2ZW50IiksQ2EuYWRkRXZlbnRMaXN0ZW5lcigicGx1c01lc3NhZ2UiLHBvKSk6d2luZG93Ll9fcGx1c01lc3NhZ2U9cG8sbm9bZV09dH1jbGFzcyBnb3tjb25zdHJ1Y3Rvcih0KXt0aGlzLndlYnZpZXc9dH1zZW5kTWVzc2FnZSh0KXtsZXQgbj1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHtfX21lc3NhZ2U6e2RhdGE6dH19KSkscj10aGlzLndlYnZpZXcuaWQ7U2E/bmV3IFNhKHIpLnBvc3RNZXNzYWdlKG4pOmhvLndlYnZpZXcucG9zdE1lc3NhZ2VUb1VuaU5WaWV3JiZoby53ZWJ2aWV3LnBvc3RNZXNzYWdlVG9VbmlOVmlldyhuLHIpfWNsb3NlKCl7dGhpcy53ZWJ2aWV3LmNsb3NlKCl9fWZ1bmN0aW9uIFJzKHtjb250ZXh0OmU9e30sdXJsOnQsZGF0YTpuPXt9LHN0eWxlOnI9e30sb25NZXNzYWdlOnMsb25DbG9zZTpkfSl7aG89ZS5wbHVzfHxjLE5zPWUud2VleHx8KHR5cGVvZiB2PT0ib2JqZWN0Ij92Om51bGwpLFNhPWUuQnJvYWRjYXN0Q2hhbm5lbHx8KHR5cGVvZiBCcm9hZGNhc3RDaGFubmVsPT0ib2JqZWN0Ij9Ccm9hZGNhc3RDaGFubmVsOm51bGwpO2xldCBnPXthdXRvQmFja0J1dHRvbjohMCx0aXRsZVNpemU6IjE3cHgifSx5PWBwYWdlJHtEYXRlLm5vdygpfWA7cj1RLmV4dGVuZCh7fSxyKSxyLnRpdGxlTlZpZXchPT0hMSYmci50aXRsZU5WaWV3IT09Im5vbmUiJiYoci50aXRsZU5WaWV3PVEuZXh0ZW5kKGcsci50aXRsZU5WaWV3KSk7bGV0IHo9e3RvcDowLGJvdHRvbTowLHVzaW5nQ29tcG9uZW50czp7fSxwb3BHZXN0dXJlOiJjbG9zZSIsc2Nyb2xsSW5kaWNhdG9yOiJub25lIixhbmltYXRpb25UeXBlOiJwb3AtaW4iLGFuaW1hdGlvbkR1cmF0aW9uOjIwMCx1bmlOVmlldzp7cGF0aDpgLyR7dH0uanNgLGRlZmF1bHRGb250U2l6ZToxNix2aWV3cG9ydDpoby5zY3JlZW4ucmVzb2x1dGlvbldpZHRofX07cj1RLmV4dGVuZCh6LHIpO2xldCBQPWhvLndlYnZpZXcuY3JlYXRlKCIiLHkscix7ZXh0cmFzOntmcm9tOmtzKCkscnVudGltZTpSbygpLGRhdGE6bix1c2VHbG9iYWxFdmVudDohU2F9fSk7cmV0dXJuIFAuYWRkRXZlbnRMaXN0ZW5lcigiY2xvc2UiLGQpLHVhKHksJD0+e1EuaXNGdW5jdGlvbihzKSYmcygkLmRhdGEpLCQua2VlcHx8UC5jbG9zZSgiYXV0byIpfSksUC5zaG93KHIuYW5pbWF0aW9uVHlwZSxyLmFuaW1hdGlvbkR1cmF0aW9uKSxuZXcgZ28oUCl9bGV0IEVsPShlLHQpPT5idC5lbWl0KCJhcGkuIitlLHQpLHhzPTE7ZnVuY3Rpb24gUXMoKXtyZXR1cm4gY2EoKSsiLiIrbGF9bGV0IF89KGUsdCxuLHIpPT57bGV0e3N1YnNjcmliZTpzLHB1Ymxpc2hIYW5kbGVyOmR9PWJ0LGc9cj94cysrOjA7ciYmcyhsYSsiLiIrZyxyLCEwKSxkKFFzKCkse2lkOmcsbmFtZTplLGFyZ3M6dH0sbil9LEY9KGUsdCxuLHIpPT57bGV0e3N1YnNjcmliZTpzLHVuc3Vic2NyaWJlOmQscHVibGlzaEhhbmRsZXI6Z309YnQseT14cysrLHo9bGErIi4iK3k7cmV0dXJuIHMoeixuKSxnKFFzKCkse2lkOnksbmFtZTplLGFyZ3M6dH0sciksKCk9PntkKHopfX0scT1PYmplY3QuY3JlYXRlKG51bGwpO2Z1bmN0aW9uIFcoKXtidC5zdWJzY3JpYmUoR28scmUpfWZ1bmN0aW9uIGVlKGUsdCl7cVtlXXx8KHFbZV09dCl9ZnVuY3Rpb24gcmUoe2lkOmUsbmFtZTp0LGFyZ3M6bn0scil7bGV0IHM9Zz0+e2UmJmJ0LnB1Ymxpc2hIYW5kbGVyKEdvKyIuIitlLGcscil9LGQ9cVt0XTtkP2QobixzKTpzKHt9KX1sZXQgcGU9US5leHRlbmQoQ3MoInZpZXciKSx7aW52b2tlT25DYWxsYmFjazpFbCxpbnZva2VWaWV3TWV0aG9kOl8saW52b2tlVmlld01ldGhvZEtlZXBBbGl2ZTpGfSk7ZnVuY3Rpb24gQ2UoKXtsZXR7b246ZX09YnQ7ZShhZS5PTl9SRVNJWkUsTWUpLGUoYWUuT05fQVBQX0VOVEVSX0ZPUkVHUk9VTkQsJGUpLGUoYWUuT05fQVBQX0VOVEVSX0JBQ0tHUk9VTkQsQWUpfWZ1bmN0aW9uIE1lKGUpe0huKFJyKCksYWUuT05fUkVTSVpFLGUpLGJ0Lmludm9rZU9uQ2FsbGJhY2soIm9uV2luZG93UmVzaXplIixlKX1mdW5jdGlvbiAkZShlKXtsZXQgdD1ScigpO0huKEVuKCksYWUuT05fU0hPVyxlKSxIbih0LGFlLk9OX1NIT1cpfWZ1bmN0aW9uIEFlKCl7SG4oRW4oKSxhZS5PTl9ISURFKSxIbihScigpLGFlLk9OX0hJREUpfWxldCBrZT1bYWUuT05fUEFHRV9TQ1JPTEwsYWUuT05fUkVBQ0hfQk9UVE9NXTtmdW5jdGlvbiBxZSgpe2tlLmZvckVhY2goZT0+YnQuc3Vic2NyaWJlKGUsdnQoZSkpKX1mdW5jdGlvbiB2dChlKXtyZXR1cm4odCxuKT0+e0huKHBhcnNlSW50KG4pLGUsdCl9fWZ1bmN0aW9uIEp0KCl7Q2UoKSxxZSgpfWZ1bmN0aW9uIGd0KGUpe2UuJHZtPWUsZS4kbXBUeXBlPSJhcHAiO2xldCB0PWhuLnJlZihaKCkuZ2V0TG9jYWxlKCkpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCIkbG9jYWxlIix7Z2V0KCl7cmV0dXJuIHQudmFsdWV9LHNldChuKXt0LnZhbHVlPW59fSl9ZnVuY3Rpb24gdXQoZSx0KXtlLnJvdXRlPXQucm91dGUsZS4kdm09ZSxlLiRwYWdlPXQsZS4kbXBUeXBlPSJwYWdlIix0Lm1ldGEuaXNUYWJCYXImJihlLiQuX19pc1RhYkJhcj0hMCxlLiQuX19pc0FjdGl2ZT0hMCl9ZnVuY3Rpb24gTnQoKXtyZXR1cm57cGF0aDoiIixxdWVyeTp7fSxzY2VuZToxMDAxLHJlZmVycmVySW5mbzp7YXBwSWQ6IiIsZXh0cmFEYXRhOnt9fX19ZnVuY3Rpb24gcG4oZSx0KXtsZXQgbj1lLiRvcHRpb25zfHx7fTtuLmdsb2JhbERhdGE9US5leHRlbmQobi5nbG9iYWxEYXRhfHx7fSx0KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiZ2xvYmFsRGF0YSIse2dldCgpe3JldHVybiBuLmdsb2JhbERhdGF9LHNldChyKXtuLmdsb2JhbERhdGE9cn19KX1mdW5jdGlvbiBTdChlKXtpZihlLmluZGV4T2YoIi8vIik9PT0wKXJldHVybiJodHRwczoiK2U7aWYoYWUuU0NIRU1FX1JFLnRlc3QoZSl8fGFlLkRBVEFfUkUudGVzdChlKSlyZXR1cm4gZTtpZihMdChlKSlyZXR1cm4iZmlsZTovLyIraHQoZSk7bGV0IHQ9ImZpbGU6Ly8iK2h0KCJfd3d3Iik7aWYoZS5pbmRleE9mKCIvIik9PT0wKXJldHVybiBlLnN0YXJ0c1dpdGgoIi9zdG9yYWdlLyIpfHxlLnN0YXJ0c1dpdGgoIi9zZGNhcmQvIil8fGUuaW5jbHVkZXMoIi9Db250YWluZXJzL0RhdGEvQXBwbGljYXRpb24vIik/ImZpbGU6Ly8iK2U6dCtlO2lmKGUuaW5kZXhPZigiLi4vIik9PT0wfHxlLmluZGV4T2YoIi4vIik9PT0wKXtpZih0eXBlb2YgX19pZF9fPT0ic3RyaW5nIilyZXR1cm4gdCtIYShhZS5hZGRMZWFkaW5nU2xhc2goX19pZF9fKSxlKTt7bGV0IG49UnIoKTtpZihuKXJldHVybiB0K0hhKGFlLmFkZExlYWRpbmdTbGFzaChuLnJvdXRlKSxlKX19cmV0dXJuIGV9bGV0IGh0PWFlLmNhY2hlU3RyaW5nRnVuY3Rpb24oZT0+Yy5pby5jb252ZXJ0TG9jYWxGaWxlU3lzdGVtVVJMKGUpLnJlcGxhY2UoL15cLz9hcHBzXC8vLCIvYW5kcm9pZF9hc3NldC9hcHBzLyIpLnJlcGxhY2UoL1wvJC8sIiIpKTtmdW5jdGlvbiBMdChlKXtyZXR1cm4gZS5pbmRleE9mKCJfd3d3Iik9PT0wfHxlLmluZGV4T2YoIl9kb2MiKT09PTB8fGUuaW5kZXhPZigiX2RvY3VtZW50cyIpPT09MHx8ZS5pbmRleE9mKCJfZG93bmxvYWRzIik9PT0wfWxldCBSbj0ic3VjY2VzcyIseG49ImZhaWwiLExuPVtSbix4biwiY29tcGxldGUiXTtmdW5jdGlvbiBZdChlLHQsbixyKXtpZighZSlyZXR1cm47aWYodHlwZW9mIG49PSJ1bmRlZmluZWQiKXJldHVybiBlW3RdKCk7bGV0WyxzXT14byhuLHIpO3JldHVybiBPYmplY3Qua2V5cyhzKS5sZW5ndGg/ZVt0XShHYSh0LHMpKTplW3RdKCl9ZnVuY3Rpb24gS24oZSx0LG4scil7aWYoIWUpcmV0dXJuO2xldFtzLGRdPXhvKG4scik7cmV0dXJuIE9iamVjdC5rZXlzKGQpLmxlbmd0aD9lW3RdKHMsR2EodCxkKSk6ZVt0XShzKX1mdW5jdGlvbiB6YShlLHQpe2xldCBuPVdhKGUsdC4kZWwpO3JldHVybiBufHxjb25zb2xlLmVycm9yKCJDYW4gbm90IGZpbmQgYCIrZSsiYCIpfWZ1bmN0aW9uIFdhKGUsdCl7aWYoIWV8fCF0KXJldHVybjtpZih0LmF0dHImJnQuYXR0ci5pZD09PWUpcmV0dXJuIHQ7bGV0IG49dC5jaGlsZHJlbjtpZighIW4pZm9yKGxldCByPTAscz1uLmxlbmd0aDtyPHM7cisrKXtsZXQgZD1XYShlLG5bcl0pO2lmKGQpcmV0dXJuIGR9fWZ1bmN0aW9uIHhvKGU9e30sdCl7bGV0IG49T2JqZWN0LmNyZWF0ZShudWxsKSxyPWZ1bmN0aW9uKGQpe2xldCBnPWVbZF07US5pc0Z1bmN0aW9uKGcpJiYobltkXT1nLGRlbGV0ZSBlW2RdKX07cmV0dXJuIExuLmZvckVhY2gociksdCYmdC5mb3JFYWNoKHIpLFtlLG5dfWZ1bmN0aW9uIEdhKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKHIpe2xldCBzPXIudHlwZTtkZWxldGUgci50eXBlO2xldCBkPXRbc107aWYocz09PVJuP3IuZXJyTXNnPWAke2V9Om9rYDpzPT09eG4mJihyLmVyck1zZz1lKyI6ZmFpbCAiKyhyLm1zZz8iICIrci5tc2c6IiIpKSxkZWxldGUgci5jb2RlLGRlbGV0ZSByLm1zZyxRLmlzRnVuY3Rpb24oZCkmJmQocikscz09PVJufHxzPT09eG4pe2xldCBnPXQuY29tcGxldGU7US5pc0Z1bmN0aW9uKGcpJiZnKHIpfX19bGV0IEJvO2Z1bmN0aW9uIFlhKCl7cmV0dXJuIEJvfWZ1bmN0aW9uIEJzKGUpe2xldCB0PWUuJC5hcHBDb250ZXh0O0JvPVEuZXh0ZW5kKHQuYXBwLHttb3VudFBhZ2UobixyLHMpe2xldCBkPWhuLmNyZWF0ZVZOb2RlKG4scik7ZC5hcHBDb250ZXh0PXQsZC5fX3BhZ2VfY29udGFpbmVyX189cyxobi5yZW5kZXIoZCxzKTtsZXQgZz1kLmNvbXBvbmVudC5wcm94eTtyZXR1cm4gZy5fX3BhZ2VfY29udGFpbmVyX189cyxnfSx1bm1vdW50UGFnZTpuPT57bGV0e19fcGFnZV9jb250YWluZXJfXzpyfT1uO3ImJihyLmlzVW5tb3VudGVkPSEwLGhuLnJlbmRlcihudWxsLHIpKX19KX1sZXQgQW49W107ZnVuY3Rpb24gWW8oZSl7aWYoIWUuJHBhZ2UubWV0YS5pc05WdWUpcmV0dXJuIEFuLnB1c2goZSk7bGV0IG49QW4uZmluZEluZGV4KHI9PnIuJHBhZ2UuaWQ9PT1lLiRwYWdlLmlkKTtuPi0xP0FuLnNwbGljZShuLDEsZSk6QW4ucHVzaChlKX1mdW5jdGlvbiBxbyhlKXtyZXR1cm4gQW4uZmluZCh0PT50LiRwYWdlLmlkPT09ZSl9ZnVuY3Rpb24gcWEoKXtyZXR1cm4gQW59ZnVuY3Rpb24gTXMoKXtsZXQgZT1bXTtyZXR1cm4gQW4uZm9yRWFjaCh0PT57dC4kLl9faXNUYWJCYXI/dC4kLl9faXNBY3RpdmUmJmUucHVzaCh0KTplLnB1c2godCl9KSxlfWZ1bmN0aW9uIEthKCl7bGV0IGU9UnIoKTshZXx8RGkoZSl9ZnVuY3Rpb24gRGkoZSl7bGV0IHQ9QW4uZmluZEluZGV4KG49Pm49PT1lKTt0IT09LTEmJihlLiRwYWdlLm1ldGEuaXNOVnVlfHxZYSgpLnVubW91bnRQYWdlKGUpLEFuLnNwbGljZSh0LDEpKX1sZXQgdXI9e3BsYXkoZSl7cmV0dXJuIFl0KGUsInBsYXkiKX0scGF1c2UoZSl7cmV0dXJuIFl0KGUsInBhdXNlIil9LHNlZWsoZSx0KXtyZXR1cm4gS24oZSwic2VlayIsdC5wb3NpdGlvbil9LHN0b3AoZSl7cmV0dXJuIFl0KGUsInN0b3AiKX0sc2VuZERhbm11KGUsdCl7cmV0dXJuIEtuKGUsInNlbmREYW5tdSIsdCl9LHBsYXliYWNrUmF0ZShlLHQpe3JldHVybiBLbihlLCJwbGF5YmFja1JhdGUiLHQucmF0ZSl9LHJlcXVlc3RGdWxsU2NyZWVuKGUsdD17fSl7cmV0dXJuIEtuKGUsInJlcXVlc3RGdWxsU2NyZWVuIix0KX0sZXhpdEZ1bGxTY3JlZW4oZSl7cmV0dXJuIFl0KGUsImV4aXRGdWxsU2NyZWVuIil9LHNob3dTdGF0dXNCYXIoZSl7cmV0dXJuIFl0KGUsInNob3dTdGF0dXNCYXIiKX0saGlkZVN0YXR1c0JhcihlKXtyZXR1cm4gWXQoZSwiaGlkZVN0YXR1c0JhciIpfX07ZnVuY3Rpb24gT24oZSx0LG4scil7bGV0IHM9cW8odCk7aWYocz09bnVsbD92b2lkIDA6cy4kcGFnZS5tZXRhLmlzTlZ1ZSl7bGV0IGQ9cy4kdm07cmV0dXJuIHVyW25dKHphKGUsZCkscil9YnQuaW52b2tlVmlld01ldGhvZCgidmlkZW8uIitlLHt2aWRlb0lkOmUsdHlwZTpuLGRhdGE6cn0sdCl9bGV0IHJvPXtnZXRDZW50ZXJMb2NhdGlvbihlLHQpe3JldHVybiBZdChlLCJnZXRDZW50ZXJMb2NhdGlvbiIsdCl9LG1vdmVUb0xvY2F0aW9uKGUsdCl7cmV0dXJuIEtuKGUsIm1vdmVUb0xvY2F0aW9uIix0KX0sdHJhbnNsYXRlTWFya2VyKGUsdCl7cmV0dXJuIEtuKGUsInRyYW5zbGF0ZU1hcmtlciIsdCxbImFuaW1hdGlvbkVuZCJdKX0saW5jbHVkZVBvaW50cyhlLHQpe3JldHVybiBLbihlLCJpbmNsdWRlUG9pbnRzIix0KX0sZ2V0UmVnaW9uKGUsdCl7cmV0dXJuIFl0KGUsImdldFJlZ2lvbiIsdCl9LGdldFNjYWxlKGUsdCl7cmV0dXJuIFl0KGUsImdldFNjYWxlIix0KX0sYWRkQ3VzdG9tTGF5ZXIoZSx0KXtyZXR1cm4gS24oZSwiYWRkQ3VzdG9tTGF5ZXIiLHQpfSxyZW1vdmVDdXN0b21MYXllcihlLHQpe3JldHVybiBLbihlLCJyZW1vdmVDdXN0b21MYXllciIsdCl9LGFkZEdyb3VuZE92ZXJsYXkoZSx0KXtyZXR1cm4gS24oZSwiYWRkR3JvdW5kT3ZlcmxheSIsdCl9LHJlbW92ZUdyb3VuZE92ZXJsYXkoZSx0KXtyZXR1cm4gS24oZSwicmVtb3ZlR3JvdW5kT3ZlcmxheSIsdCl9LHVwZGF0ZUdyb3VuZE92ZXJsYXkoZSx0KXtyZXR1cm4gS24oZSwidXBkYXRlR3JvdW5kT3ZlcmxheSIsdCl9LGluaXRNYXJrZXJDbHVzdGVyKGUsdCl7cmV0dXJuIEtuKGUsImluaXRNYXJrZXJDbHVzdGVyIix0KX0sYWRkTWFya2VycyhlLHQpe3JldHVybiBLbihlLCJhZGRNYXJrZXJzIix0KX0scmVtb3ZlTWFya2VycyhlLHQpe3JldHVybiBLbihlLCJyZW1vdmVNYXJrZXJzIix0KX0sbW92ZUFsb25nKGUsdCl7cmV0dXJuIEtuKGUsIm1vdmVBbG9uZyIsdCl9LG9wZW5NYXBBcHAoZSx0KXtyZXR1cm4gS24oZSwib3Blbk1hcEFwcCIsdCl9LG9uKGUsdCl7cmV0dXJuIGUub24odC5uYW1lLHQuY2FsbGJhY2spfX07ZnVuY3Rpb24gSmEoZSx0LG4scixzKXtsZXQgZD1xbyh0KTtpZihkPT1udWxsP3ZvaWQgMDpkLiRwYWdlLm1ldGEuaXNOVnVlKXtsZXQgZz1kLiR2bTtyZXR1cm4gcm9bbl0oemEoZSxnKSxyKX1idC5pbnZva2VWaWV3TWV0aG9kKCJtYXAuIitlLHt0eXBlOm4sZGF0YTpyfSx0LHMpfWZ1bmN0aW9uIEFhKGUpe3JldHVybmBJbnRlcnNlY3Rpb25PYnNlcnZlci4ke2V9YH1mdW5jdGlvbiB3aSh7cmVxSWQ6ZSxjb21wb25lbnQ6dCxvcHRpb25zOm4sY2FsbGJhY2s6cn0scyl7bGV0IGQ9QWEoZSk7YnQuaW52b2tlVmlld01ldGhvZCgiYWRkSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiLHtyZXFJZDplLGNvbXBvbmVudDp0LiRlbC5ub2RlSWQsb3B0aW9uczpuLGV2ZW50TmFtZTpkfSxzKSxidC5zdWJzY3JpYmUoZCxyKX1mdW5jdGlvbiAkcih7cmVxSWQ6ZSxjb21wb25lbnQ6dH0sbil7YnQuaW52b2tlVmlld01ldGhvZCgicmVtb3ZlSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiLHtyZXFJZDplLGNvbXBvbmVudDp0LiRlbC5ub2RlSWR9LG4pLGJ0LnVuc3Vic2NyaWJlKEFhKGUpKX1mdW5jdGlvbiBTcihlKXtyZXR1cm5gTWVkaWFRdWVyeU9ic2VydmVyLiR7ZX1gfWZ1bmN0aW9uIEZpKHtyZXFJZDplLGNvbXBvbmVudDp0LG9wdGlvbnM6bixjYWxsYmFjazpyfSxzKXtsZXQgZD1TcihlKTtidC5pbnZva2VWaWV3TWV0aG9kKCJhZGRNZWRpYVF1ZXJ5T2JzZXJ2ZXIiLHtyZXFJZDplLGNvbXBvbmVudDp0LiRlbC5ub2RlSWQsb3B0aW9uczpuLGV2ZW50TmFtZTpkfSxzKSxidC5zdWJzY3JpYmUoZCxyKX1mdW5jdGlvbiBkcyh7cmVxSWQ6ZSxjb21wb25lbnQ6dH0sbil7YnQuaW52b2tlVmlld01ldGhvZCgicmVtb3ZlTWVkaWFRdWVyeU9ic2VydmVyIix7cmVxSWQ6ZSxjb21wb25lbnQ6dC4kZWwubm9kZUlkfSxuKSxidC51bnN1YnNjcmliZShTcihlKSl9bGV0IGpuPTIwMCxDcj1bInVua25vd24iLCJub25lIiwiZXRoZXJuZXQiLCJ3aWZpIiwiMmciLCIzZyIsIjRnIiwiNWciXSxocz0iX2RvYy91bmlhcHBfdGVtcCIsU2k9YCR7aHN9XyR7RGF0ZS5ub3coKX1gO2Z1bmN0aW9uIHZvKGUpe2xldCB0PWUuc3BsaXQoIi8iKTtyZXR1cm4gdFt0Lmxlbmd0aC0xXX1mdW5jdGlvbiBhaShlKXtsZXQgdD1lLnNwbGl0KCIuIik7cmV0dXJuIHQubGVuZ3RoPjE/Ii4iK3RbdC5sZW5ndGgtMV06IiJ9bGV0IE1vPSJiYWNrYnV0dG9uIjtmdW5jdGlvbiBaYSgpe3NlLm5hdmlnYXRlQmFjayh7ZnJvbToiYmFja2J1dHRvbiIsc3VjY2Vzcygpe319KX1sZXQgQ2k9TnQoKSxtbz1OdCgpO2Z1bmN0aW9uIFhhKCl7cmV0dXJuIFEuZXh0ZW5kKHt9LG1vKX1mdW5jdGlvbiBEcygpe3JldHVybiBRLmV4dGVuZCh7fSxDaSl9ZnVuY3Rpb24gVWUoe3BhdGg6ZSxxdWVyeTp0LHJlZmVycmVySW5mbzpufSl7US5leHRlbmQoQ2kse3BhdGg6ZSxxdWVyeTp0P2FlLnBhcnNlUXVlcnkodCk6e30scmVmZXJyZXJJbmZvOm58fHt9fSl9ZnVuY3Rpb24gSXQoe3BhdGg6ZSxxdWVyeTp0LHJlZmVycmVySW5mbzpufSl7cmV0dXJuIFEuZXh0ZW5kKG1vLHtwYXRoOmUscXVlcnk6dD9hZS5wYXJzZVF1ZXJ5KHQpOnt9LHJlZmVycmVySW5mbzpufHx7fSxjaGFubmVsOmMucnVudGltZS5jaGFubmVsLGxhdW5jaGVyOmMucnVudGltZS5sYXVuY2hlcn0pLFEuZXh0ZW5kKENpLG1vKSxRLmV4dGVuZCh7fSxtbyl9ZnVuY3Rpb24gQnQoKXtsZXQgZT12LnJlcXVpcmVNb2R1bGUoInBsdXMiKTtpZihlLmdldFJlZGlyZWN0SW5mbyl7bGV0e3BhdGg6dCxxdWVyeTpuLGV4dHJhRGF0YTpyLHVzZXJBY3Rpb246cyxmcm9tQXBwaWQ6ZH09ZS5nZXRSZWRpcmVjdEluZm8oKXx8e30sZz17YXBwSWQ6ZCxleHRyYURhdGE6e319O3JldHVybiByJiYoZy5leHRyYURhdGE9cikse3BhdGg6dHx8IiIscXVlcnk6bj8iPyIrbjoiIixyZWZlcnJlckluZm86Zyx1c2VyQWN0aW9uOnN9fX1mdW5jdGlvbiBIdChlKXt2YXIgdD17ZXhwb3J0czp7fX07cmV0dXJuIGUodCx0LmV4cG9ydHMpLHQuZXhwb3J0c312YXIganQ9SHQoZnVuY3Rpb24oZSx0KXt2YXIgbj10eXBlb2YgVWludDhBcnJheSE9InVuZGVmaW5lZCImJnR5cGVvZiBVaW50MTZBcnJheSE9InVuZGVmaW5lZCImJnR5cGVvZiBJbnQzMkFycmF5IT0idW5kZWZpbmVkIjtmdW5jdGlvbiByKGcseSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChnLHkpfXQuYXNzaWduPWZ1bmN0aW9uKGcpe2Zvcih2YXIgeT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSk7eS5sZW5ndGg7KXt2YXIgej15LnNoaWZ0KCk7aWYoISF6KXtpZih0eXBlb2YgeiE9Im9iamVjdCIpdGhyb3cgbmV3IFR5cGVFcnJvcih6KyJtdXN0IGJlIG5vbi1vYmplY3QiKTtmb3IodmFyIFAgaW4geilyKHosUCkmJihnW1BdPXpbUF0pfX1yZXR1cm4gZ30sdC5zaHJpbmtCdWY9ZnVuY3Rpb24oZyx5KXtyZXR1cm4gZy5sZW5ndGg9PT15P2c6Zy5zdWJhcnJheT9nLnN1YmFycmF5KDAseSk6KGcubGVuZ3RoPXksZyl9O3ZhciBzPXthcnJheVNldDpmdW5jdGlvbihnLHkseixQLCQpe2lmKHkuc3ViYXJyYXkmJmcuc3ViYXJyYXkpe2cuc2V0KHkuc3ViYXJyYXkoeix6K1ApLCQpO3JldHVybn1mb3IodmFyIF9lPTA7X2U8UDtfZSsrKWdbJCtfZV09eVt6K19lXX0sZmxhdHRlbkNodW5rczpmdW5jdGlvbihnKXt2YXIgeSx6LFAsJCxfZSxUZTtmb3IoUD0wLHk9MCx6PWcubGVuZ3RoO3k8ejt5KyspUCs9Z1t5XS5sZW5ndGg7Zm9yKFRlPW5ldyBVaW50OEFycmF5KFApLCQ9MCx5PTAsej1nLmxlbmd0aDt5PHo7eSsrKV9lPWdbeV0sVGUuc2V0KF9lLCQpLCQrPV9lLmxlbmd0aDtyZXR1cm4gVGV9fSxkPXthcnJheVNldDpmdW5jdGlvbihnLHkseixQLCQpe2Zvcih2YXIgX2U9MDtfZTxQO19lKyspZ1skK19lXT15W3orX2VdfSxmbGF0dGVuQ2h1bmtzOmZ1bmN0aW9uKGcpe3JldHVybltdLmNvbmNhdC5hcHBseShbXSxnKX19O3Quc2V0VHlwZWQ9ZnVuY3Rpb24oZyl7Zz8odC5CdWY4PVVpbnQ4QXJyYXksdC5CdWYxNj1VaW50MTZBcnJheSx0LkJ1ZjMyPUludDMyQXJyYXksdC5hc3NpZ24odCxzKSk6KHQuQnVmOD1BcnJheSx0LkJ1ZjE2PUFycmF5LHQuQnVmMzI9QXJyYXksdC5hc3NpZ24odCxkKSl9LHQuc2V0VHlwZWQobil9KSxpdD1qdCxmbj00LEJyPTAscnI9MSxNcj0yO2Z1bmN0aW9uIF9vKGUpe2Zvcih2YXIgdD1lLmxlbmd0aDstLXQ+PTA7KWVbdF09MH12YXIgT2E9MCxLbz0xLGVsPTIsbmM9Myx3bD0yNTgsYm89MjksZnI9MjU2LHNpPWZyKzErYm8sVGE9MzAsU2w9MTksRnM9MipzaSsxLERvPTE1LFFhPTE2LHBzPTcsTW49MjU2LHpuPTE2LENsPTE3LExpPTE4LEFpPVswLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDBdLGVzPVswLDAsMCwwLDEsMSwyLDIsMywzLDQsNCw1LDUsNiw2LDcsNyw4LDgsOSw5LDEwLDEwLDExLDExLDEyLDEyLDEzLDEzXSxBbD1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDMsN10scmM9WzE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTVdLGlvPTUxMixUbj1uZXcgQXJyYXkoKHNpKzIpKjIpO19vKFRuKTt2YXIgVmk9bmV3IEFycmF5KFRhKjIpO19vKFZpKTt2YXIgSWE9bmV3IEFycmF5KGlvKTtfbyhJYSk7dmFyIERyPW5ldyBBcnJheSh3bC1uYysxKTtfbyhEcik7dmFyIGxpPW5ldyBBcnJheShibyk7X28obGkpO3ZhciB0bD1uZXcgQXJyYXkoVGEpO19vKHRsKTtmdW5jdGlvbiBPbChlLHQsbixyLHMpe3RoaXMuc3RhdGljX3RyZWU9ZSx0aGlzLmV4dHJhX2JpdHM9dCx0aGlzLmV4dHJhX2Jhc2U9bix0aGlzLmVsZW1zPXIsdGhpcy5tYXhfbGVuZ3RoPXMsdGhpcy5oYXNfc3RyZWU9ZSYmZS5sZW5ndGh9dmFyIEpuLEluLGNpO2Z1bmN0aW9uIFpyKGUsdCl7dGhpcy5keW5fdHJlZT1lLHRoaXMubWF4X2NvZGU9MCx0aGlzLnN0YXRfZGVzYz10fWZ1bmN0aW9uIGZhKGUpe3JldHVybiBlPDI1Nj9JYVtlXTpJYVsyNTYrKGU+Pj43KV19ZnVuY3Rpb24gdHMoZSx0KXtlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT10JjI1NSxlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT10Pj4+OCYyNTV9ZnVuY3Rpb24gWHIoZSx0LG4pe2UuYmlfdmFsaWQ+UWEtbj8oZS5iaV9idWZ8PXQ8PGUuYmlfdmFsaWQmNjU1MzUsdHMoZSxlLmJpX2J1ZiksZS5iaV9idWY9dD4+UWEtZS5iaV92YWxpZCxlLmJpX3ZhbGlkKz1uLVFhKTooZS5iaV9idWZ8PXQ8PGUuYmlfdmFsaWQmNjU1MzUsZS5iaV92YWxpZCs9bil9ZnVuY3Rpb24gRm8oZSx0LG4pe1hyKGUsblt0KjJdLG5bdCoyKzFdKX1mdW5jdGlvbiBUbChlLHQpe3ZhciBuPTA7ZG8gbnw9ZSYxLGU+Pj49MSxuPDw9MTt3aGlsZSgtLXQ+MCk7cmV0dXJuIG4+Pj4xfWZ1bmN0aW9uIElsKGUpe2UuYmlfdmFsaWQ9PT0xNj8odHMoZSxlLmJpX2J1ZiksZS5iaV9idWY9MCxlLmJpX3ZhbGlkPTApOmUuYmlfdmFsaWQ+PTgmJihlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT1lLmJpX2J1ZiYyNTUsZS5iaV9idWY+Pj04LGUuYmlfdmFsaWQtPTgpfWZ1bmN0aW9uIG5zKGUsdCl7dmFyIG49dC5keW5fdHJlZSxyPXQubWF4X2NvZGUscz10LnN0YXRfZGVzYy5zdGF0aWNfdHJlZSxkPXQuc3RhdF9kZXNjLmhhc19zdHJlZSxnPXQuc3RhdF9kZXNjLmV4dHJhX2JpdHMseT10LnN0YXRfZGVzYy5leHRyYV9iYXNlLHo9dC5zdGF0X2Rlc2MubWF4X2xlbmd0aCxQLCQsX2UsVGUsTGUsRXQsa3Q9MDtmb3IoVGU9MDtUZTw9RG87VGUrKyllLmJsX2NvdW50W1RlXT0wO2ZvcihuW2UuaGVhcFtlLmhlYXBfbWF4XSoyKzFdPTAsUD1lLmhlYXBfbWF4KzE7UDxGcztQKyspJD1lLmhlYXBbUF0sVGU9bltuWyQqMisxXSoyKzFdKzEsVGU+eiYmKFRlPXosa3QrKyksblskKjIrMV09VGUsISgkPnIpJiYoZS5ibF9jb3VudFtUZV0rKyxMZT0wLCQ+PXkmJihMZT1nWyQteV0pLEV0PW5bJCoyXSxlLm9wdF9sZW4rPUV0KihUZStMZSksZCYmKGUuc3RhdGljX2xlbis9RXQqKHNbJCoyKzFdK0xlKSkpO2lmKGt0IT09MCl7ZG97Zm9yKFRlPXotMTtlLmJsX2NvdW50W1RlXT09PTA7KVRlLS07ZS5ibF9jb3VudFtUZV0tLSxlLmJsX2NvdW50W1RlKzFdKz0yLGUuYmxfY291bnRbel0tLSxrdC09Mn13aGlsZShrdD4wKTtmb3IoVGU9ejtUZSE9PTA7VGUtLSlmb3IoJD1lLmJsX2NvdW50W1RlXTskIT09MDspX2U9ZS5oZWFwWy0tUF0sIShfZT5yKSYmKG5bX2UqMisxXSE9PVRlJiYoZS5vcHRfbGVuKz0oVGUtbltfZSoyKzFdKSpuW19lKjJdLG5bX2UqMisxXT1UZSksJC0tKX19ZnVuY3Rpb24gUGEoZSx0LG4pe3ZhciByPW5ldyBBcnJheShEbysxKSxzPTAsZCxnO2ZvcihkPTE7ZDw9RG87ZCsrKXJbZF09cz1zK25bZC0xXTw8MTtmb3IoZz0wO2c8PXQ7ZysrKXt2YXIgeT1lW2cqMisxXTt5IT09MCYmKGVbZyoyXT1UbChyW3ldKysseSkpfX1mdW5jdGlvbiBQbCgpe3ZhciBlLHQsbixyLHMsZD1uZXcgQXJyYXkoRG8rMSk7Zm9yKG49MCxyPTA7cjxiby0xO3IrKylmb3IobGlbcl09bixlPTA7ZTwxPDxBaVtyXTtlKyspRHJbbisrXT1yO2ZvcihEcltuLTFdPXIscz0wLHI9MDtyPDE2O3IrKylmb3IodGxbcl09cyxlPTA7ZTwxPDxlc1tyXTtlKyspSWFbcysrXT1yO2ZvcihzPj49NztyPFRhO3IrKylmb3IodGxbcl09czw8NyxlPTA7ZTwxPDxlc1tyXS03O2UrKylJYVsyNTYrcysrXT1yO2Zvcih0PTA7dDw9RG87dCsrKWRbdF09MDtmb3IoZT0wO2U8PTE0MzspVG5bZSoyKzFdPTgsZSsrLGRbOF0rKztmb3IoO2U8PTI1NTspVG5bZSoyKzFdPTksZSsrLGRbOV0rKztmb3IoO2U8PTI3OTspVG5bZSoyKzFdPTcsZSsrLGRbN10rKztmb3IoO2U8PTI4NzspVG5bZSoyKzFdPTgsZSsrLGRbOF0rKztmb3IoUGEoVG4sc2krMSxkKSxlPTA7ZTxUYTtlKyspVmlbZSoyKzFdPTUsVmlbZSoyXT1UbChlLDUpO0puPW5ldyBPbChUbixBaSxmcisxLHNpLERvKSxJbj1uZXcgT2woVmksZXMsMCxUYSxEbyksY2k9bmV3IE9sKG5ldyBBcnJheSgwKSxBbCwwLFNsLHBzKX1mdW5jdGlvbiBObChlKXt2YXIgdDtmb3IodD0wO3Q8c2k7dCsrKWUuZHluX2x0cmVlW3QqMl09MDtmb3IodD0wO3Q8VGE7dCsrKWUuZHluX2R0cmVlW3QqMl09MDtmb3IodD0wO3Q8U2w7dCsrKWUuYmxfdHJlZVt0KjJdPTA7ZS5keW5fbHRyZWVbTW4qMl09MSxlLm9wdF9sZW49ZS5zdGF0aWNfbGVuPTAsZS5sYXN0X2xpdD1lLm1hdGNoZXM9MH1mdW5jdGlvbiBubChlKXtlLmJpX3ZhbGlkPjg/dHMoZSxlLmJpX2J1Zik6ZS5iaV92YWxpZD4wJiYoZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK109ZS5iaV9idWYpLGUuYmlfYnVmPTAsZS5iaV92YWxpZD0wfWZ1bmN0aW9uIGljKGUsdCxuLHIpe25sKGUpLHImJih0cyhlLG4pLHRzKGUsfm4pKSxpdC5hcnJheVNldChlLnBlbmRpbmdfYnVmLGUud2luZG93LHQsbixlLnBlbmRpbmcpLGUucGVuZGluZys9bn1mdW5jdGlvbiBrbChlLHQsbixyKXt2YXIgcz10KjIsZD1uKjI7cmV0dXJuIGVbc108ZVtkXXx8ZVtzXT09PWVbZF0mJnJbdF08PXJbbl19ZnVuY3Rpb24gcnMoZSx0LG4pe2Zvcih2YXIgcj1lLmhlYXBbbl0scz1uPDwxO3M8PWUuaGVhcF9sZW4mJihzPGUuaGVhcF9sZW4mJmtsKHQsZS5oZWFwW3MrMV0sZS5oZWFwW3NdLGUuZGVwdGgpJiZzKyssIWtsKHQscixlLmhlYXBbc10sZS5kZXB0aCkpOyllLmhlYXBbbl09ZS5oZWFwW3NdLG49cyxzPDw9MTtlLmhlYXBbbl09cn1mdW5jdGlvbiBMcyhlLHQsbil7dmFyIHIscyxkPTAsZyx5O2lmKGUubGFzdF9saXQhPT0wKWRvIHI9ZS5wZW5kaW5nX2J1ZltlLmRfYnVmK2QqMl08PDh8ZS5wZW5kaW5nX2J1ZltlLmRfYnVmK2QqMisxXSxzPWUucGVuZGluZ19idWZbZS5sX2J1ZitkXSxkKysscj09PTA/Rm8oZSxzLHQpOihnPURyW3NdLEZvKGUsZytmcisxLHQpLHk9QWlbZ10seSE9PTAmJihzLT1saVtnXSxYcihlLHMseSkpLHItLSxnPWZhKHIpLEZvKGUsZyxuKSx5PWVzW2ddLHkhPT0wJiYoci09dGxbZ10sWHIoZSxyLHkpKSk7d2hpbGUoZDxlLmxhc3RfbGl0KTtGbyhlLE1uLHQpfWZ1bmN0aW9uIFJsKGUsdCl7dmFyIG49dC5keW5fdHJlZSxyPXQuc3RhdF9kZXNjLnN0YXRpY190cmVlLHM9dC5zdGF0X2Rlc2MuaGFzX3N0cmVlLGQ9dC5zdGF0X2Rlc2MuZWxlbXMsZyx5LHo9LTEsUDtmb3IoZS5oZWFwX2xlbj0wLGUuaGVhcF9tYXg9RnMsZz0wO2c8ZDtnKyspbltnKjJdIT09MD8oZS5oZWFwWysrZS5oZWFwX2xlbl09ej1nLGUuZGVwdGhbZ109MCk6bltnKjIrMV09MDtmb3IoO2UuaGVhcF9sZW48MjspUD1lLmhlYXBbKytlLmhlYXBfbGVuXT16PDI/Kyt6OjAsbltQKjJdPTEsZS5kZXB0aFtQXT0wLGUub3B0X2xlbi0tLHMmJihlLnN0YXRpY19sZW4tPXJbUCoyKzFdKTtmb3IodC5tYXhfY29kZT16LGc9ZS5oZWFwX2xlbj4+MTtnPj0xO2ctLSlycyhlLG4sZyk7UD1kO2RvIGc9ZS5oZWFwWzFdLGUuaGVhcFsxXT1lLmhlYXBbZS5oZWFwX2xlbi0tXSxycyhlLG4sMSkseT1lLmhlYXBbMV0sZS5oZWFwWy0tZS5oZWFwX21heF09ZyxlLmhlYXBbLS1lLmhlYXBfbWF4XT15LG5bUCoyXT1uW2cqMl0rblt5KjJdLGUuZGVwdGhbUF09KGUuZGVwdGhbZ10+PWUuZGVwdGhbeV0/ZS5kZXB0aFtnXTplLmRlcHRoW3ldKSsxLG5bZyoyKzFdPW5beSoyKzFdPVAsZS5oZWFwWzFdPVArKyxycyhlLG4sMSk7d2hpbGUoZS5oZWFwX2xlbj49Mik7ZS5oZWFwWy0tZS5oZWFwX21heF09ZS5oZWFwWzFdLG5zKGUsdCksUGEobix6LGUuYmxfY291bnQpfWZ1bmN0aW9uIGdzKGUsdCxuKXt2YXIgcixzPS0xLGQsZz10WzAqMisxXSx5PTAsej03LFA9NDtmb3IoZz09PTAmJih6PTEzOCxQPTMpLHRbKG4rMSkqMisxXT02NTUzNSxyPTA7cjw9bjtyKyspZD1nLGc9dFsocisxKSoyKzFdLCEoKyt5PHomJmQ9PT1nKSYmKHk8UD9lLmJsX3RyZWVbZCoyXSs9eTpkIT09MD8oZCE9PXMmJmUuYmxfdHJlZVtkKjJdKyssZS5ibF90cmVlW3puKjJdKyspOnk8PTEwP2UuYmxfdHJlZVtDbCoyXSsrOmUuYmxfdHJlZVtMaSoyXSsrLHk9MCxzPWQsZz09PTA/KHo9MTM4LFA9Myk6ZD09PWc/KHo9NixQPTMpOih6PTcsUD00KSl9ZnVuY3Rpb24gZGEoZSx0LG4pe3ZhciByLHM9LTEsZCxnPXRbMCoyKzFdLHk9MCx6PTcsUD00O2ZvcihnPT09MCYmKHo9MTM4LFA9Mykscj0wO3I8PW47cisrKWlmKGQ9ZyxnPXRbKHIrMSkqMisxXSwhKCsreTx6JiZkPT09Zykpe2lmKHk8UClkbyBGbyhlLGQsZS5ibF90cmVlKTt3aGlsZSgtLXkhPT0wKTtlbHNlIGQhPT0wPyhkIT09cyYmKEZvKGUsZCxlLmJsX3RyZWUpLHktLSksRm8oZSx6bixlLmJsX3RyZWUpLFhyKGUseS0zLDIpKTp5PD0xMD8oRm8oZSxDbCxlLmJsX3RyZWUpLFhyKGUseS0zLDMpKTooRm8oZSxMaSxlLmJsX3RyZWUpLFhyKGUseS0xMSw3KSk7eT0wLHM9ZCxnPT09MD8oej0xMzgsUD0zKTpkPT09Zz8oej02LFA9Myk6KHo9NyxQPTQpfX1mdW5jdGlvbiBWcyhlKXt2YXIgdDtmb3IoZ3MoZSxlLmR5bl9sdHJlZSxlLmxfZGVzYy5tYXhfY29kZSksZ3MoZSxlLmR5bl9kdHJlZSxlLmRfZGVzYy5tYXhfY29kZSksUmwoZSxlLmJsX2Rlc2MpLHQ9U2wtMTt0Pj0zJiZlLmJsX3RyZWVbcmNbdF0qMisxXT09PTA7dC0tKTtyZXR1cm4gZS5vcHRfbGVuKz0zKih0KzEpKzUrNSs0LHR9ZnVuY3Rpb24geGwoZSx0LG4scil7dmFyIHM7Zm9yKFhyKGUsdC0yNTcsNSksWHIoZSxuLTEsNSksWHIoZSxyLTQsNCkscz0wO3M8cjtzKyspWHIoZSxlLmJsX3RyZWVbcmNbc10qMisxXSwzKTtkYShlLGUuZHluX2x0cmVlLHQtMSksZGEoZSxlLmR5bl9kdHJlZSxuLTEpfWZ1bmN0aW9uICRzKGUpe3ZhciB0PTQwOTM2MjQ0NDcsbjtmb3Iobj0wO248PTMxO24rKyx0Pj4+PTEpaWYodCYxJiZlLmR5bl9sdHJlZVtuKjJdIT09MClyZXR1cm4gQnI7aWYoZS5keW5fbHRyZWVbOSoyXSE9PTB8fGUuZHluX2x0cmVlWzEwKjJdIT09MHx8ZS5keW5fbHRyZWVbMTMqMl0hPT0wKXJldHVybiBycjtmb3Iobj0zMjtuPGZyO24rKylpZihlLmR5bl9sdHJlZVtuKjJdIT09MClyZXR1cm4gcnI7cmV0dXJuIEJyfXZhciBVcz0hMTtmdW5jdGlvbiAkYyhlKXtVc3x8KFBsKCksVXM9ITApLGUubF9kZXNjPW5ldyBacihlLmR5bl9sdHJlZSxKbiksZS5kX2Rlc2M9bmV3IFpyKGUuZHluX2R0cmVlLEluKSxlLmJsX2Rlc2M9bmV3IFpyKGUuYmxfdHJlZSxjaSksZS5iaV9idWY9MCxlLmJpX3ZhbGlkPTAsTmwoZSl9ZnVuY3Rpb24gb2MoZSx0LG4scil7WHIoZSwoT2E8PDEpKyhyPzE6MCksMyksaWMoZSx0LG4sITApfWZ1bmN0aW9uIFVjKGUpe1hyKGUsS288PDEsMyksRm8oZSxNbixUbiksSWwoZSl9ZnVuY3Rpb24gSGMoZSx0LG4scil7dmFyIHMsZCxnPTA7ZS5sZXZlbD4wPyhlLnN0cm0uZGF0YV90eXBlPT09TXImJihlLnN0cm0uZGF0YV90eXBlPSRzKGUpKSxSbChlLGUubF9kZXNjKSxSbChlLGUuZF9kZXNjKSxnPVZzKGUpLHM9ZS5vcHRfbGVuKzMrNz4+PjMsZD1lLnN0YXRpY19sZW4rMys3Pj4+MyxkPD1zJiYocz1kKSk6cz1kPW4rNSxuKzQ8PXMmJnQhPT0tMT9vYyhlLHQsbixyKTplLnN0cmF0ZWd5PT09Zm58fGQ9PT1zPyhYcihlLChLbzw8MSkrKHI/MTowKSwzKSxMcyhlLFRuLFZpKSk6KFhyKGUsKGVsPDwxKSsocj8xOjApLDMpLHhsKGUsZS5sX2Rlc2MubWF4X2NvZGUrMSxlLmRfZGVzYy5tYXhfY29kZSsxLGcrMSksTHMoZSxlLmR5bl9sdHJlZSxlLmR5bl9kdHJlZSkpLE5sKGUpLHImJm5sKGUpfWZ1bmN0aW9uIGpjKGUsdCxuKXtyZXR1cm4gZS5wZW5kaW5nX2J1ZltlLmRfYnVmK2UubGFzdF9saXQqMl09dD4+PjgmMjU1LGUucGVuZGluZ19idWZbZS5kX2J1ZitlLmxhc3RfbGl0KjIrMV09dCYyNTUsZS5wZW5kaW5nX2J1ZltlLmxfYnVmK2UubGFzdF9saXRdPW4mMjU1LGUubGFzdF9saXQrKyx0PT09MD9lLmR5bl9sdHJlZVtuKjJdKys6KGUubWF0Y2hlcysrLHQtLSxlLmR5bl9sdHJlZVsoRHJbbl0rZnIrMSkqMl0rKyxlLmR5bl9kdHJlZVtmYSh0KSoyXSsrKSxlLmxhc3RfbGl0PT09ZS5saXRfYnVmc2l6ZS0xfXZhciBhYz0kYyxzYz1vYyx6Yz1IYyxXYz1qYyxHYz1VYyxCbD17X3RyX2luaXQ6YWMsX3RyX3N0b3JlZF9ibG9jazpzYyxfdHJfZmx1c2hfYmxvY2s6emMsX3RyX3RhbGx5OldjLF90cl9hbGlnbjpHY307ZnVuY3Rpb24gbGMoZSx0LG4scil7Zm9yKHZhciBzPWUmNjU1MzV8MCxkPWU+Pj4xNiY2NTUzNXwwLGc9MDtuIT09MDspe2c9bj4yZTM/MmUzOm4sbi09ZztkbyBzPXMrdFtyKytdfDAsZD1kK3N8MDt3aGlsZSgtLWcpO3MlPTY1NTIxLGQlPTY1NTIxfXJldHVybiBzfGQ8PDE2fDB9dmFyIE1sPWxjO2Z1bmN0aW9uIERsKCl7Zm9yKHZhciBlLHQ9W10sbj0wO248MjU2O24rKyl7ZT1uO2Zvcih2YXIgcj0wO3I8ODtyKyspZT1lJjE/Mzk4ODI5MjM4NF5lPj4+MTplPj4+MTt0W25dPWV9cmV0dXJuIHR9dmFyIFljPURsKCk7ZnVuY3Rpb24gY2MoZSx0LG4scil7dmFyIHM9WWMsZD1yK247ZV49LTE7Zm9yKHZhciBnPXI7ZzxkO2crKyllPWU+Pj44XnNbKGVedFtnXSkmMjU1XTtyZXR1cm4gZV4tMX12YXIgcmw9Y2MsRmw9ezI6Im5lZWQgZGljdGlvbmFyeSIsMToic3RyZWFtIGVuZCIsMDoiIiwiLTEiOiJmaWxlIGVycm9yIiwiLTIiOiJzdHJlYW0gZXJyb3IiLCItMyI6ImRhdGEgZXJyb3IiLCItNCI6Imluc3VmZmljaWVudCBtZW1vcnkiLCItNSI6ImJ1ZmZlciBlcnJvciIsIi02IjoiaW5jb21wYXRpYmxlIHZlcnNpb24ifSx5bz1CbCxIcz1NbCxkcj1ybCxoYT1GbCxKbz0wLHVjPTEsaWw9Myxabz00LExsPTUsWG89MCxmYz0xLG9vPS0yLGRjPS0zLG9sPS01LGhjPS0xLHBjPTEsdnM9MixnYz0zLHZjPTQscWM9MCxLYz0yLGFsPTgsVmw9OSxtYz0xNSxOYT04LGpzPTI5LCRsPTI1NixzbD0kbCsxK2pzLEpjPTMwLGthPTE5LF9jPTIqc2wrMSxiYz0xNSxkbj0zLFFvPTI1OCxMbz1RbytkbisxLHBhPTMyLGVhPTQyLGxsPTY5LGNsPTczLGlzPTkxLHpzPTEwMyxSYT0xMTMsbXM9NjY2LEFyPTEsX3M9MixnYT0zLG9zPTQsWmM9MztmdW5jdGlvbiB4YShlLHQpe3JldHVybiBlLm1zZz1oYVt0XSx0fWZ1bmN0aW9uIG8oZSl7cmV0dXJuKGU8PDEpLShlPjQ/OTowKX1mdW5jdGlvbiBsKGUpe2Zvcih2YXIgdD1lLmxlbmd0aDstLXQ+PTA7KWVbdF09MH1mdW5jdGlvbiBoKGUpe3ZhciB0PWUuc3RhdGUsbj10LnBlbmRpbmc7bj5lLmF2YWlsX291dCYmKG49ZS5hdmFpbF9vdXQpLG4hPT0wJiYoaXQuYXJyYXlTZXQoZS5vdXRwdXQsdC5wZW5kaW5nX2J1Zix0LnBlbmRpbmdfb3V0LG4sZS5uZXh0X291dCksZS5uZXh0X291dCs9bix0LnBlbmRpbmdfb3V0Kz1uLGUudG90YWxfb3V0Kz1uLGUuYXZhaWxfb3V0LT1uLHQucGVuZGluZy09bix0LnBlbmRpbmc9PT0wJiYodC5wZW5kaW5nX291dD0wKSl9ZnVuY3Rpb24gbShlLHQpe3lvLl90cl9mbHVzaF9ibG9jayhlLGUuYmxvY2tfc3RhcnQ+PTA/ZS5ibG9ja19zdGFydDotMSxlLnN0cnN0YXJ0LWUuYmxvY2tfc3RhcnQsdCksZS5ibG9ja19zdGFydD1lLnN0cnN0YXJ0LGgoZS5zdHJtKX1mdW5jdGlvbiBTKGUsdCl7ZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK109dH1mdW5jdGlvbiBPKGUsdCl7ZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK109dD4+PjgmMjU1LGUucGVuZGluZ19idWZbZS5wZW5kaW5nKytdPXQmMjU1fWZ1bmN0aW9uIE0oZSx0LG4scil7dmFyIHM9ZS5hdmFpbF9pbjtyZXR1cm4gcz5yJiYocz1yKSxzPT09MD8wOihlLmF2YWlsX2luLT1zLGl0LmFycmF5U2V0KHQsZS5pbnB1dCxlLm5leHRfaW4scyxuKSxlLnN0YXRlLndyYXA9PT0xP2UuYWRsZXI9SHMoZS5hZGxlcix0LHMsbik6ZS5zdGF0ZS53cmFwPT09MiYmKGUuYWRsZXI9ZHIoZS5hZGxlcix0LHMsbikpLGUubmV4dF9pbis9cyxlLnRvdGFsX2luKz1zLHMpfWZ1bmN0aW9uIFkoZSx0KXt2YXIgbj1lLm1heF9jaGFpbl9sZW5ndGgscj1lLnN0cnN0YXJ0LHMsZCxnPWUucHJldl9sZW5ndGgseT1lLm5pY2VfbWF0Y2gsej1lLnN0cnN0YXJ0PmUud19zaXplLUxvP2Uuc3Ryc3RhcnQtKGUud19zaXplLUxvKTowLFA9ZS53aW5kb3csJD1lLndfbWFzayxfZT1lLnByZXYsVGU9ZS5zdHJzdGFydCtRbyxMZT1QW3IrZy0xXSxFdD1QW3IrZ107ZS5wcmV2X2xlbmd0aD49ZS5nb29kX21hdGNoJiYobj4+PTIpLHk+ZS5sb29rYWhlYWQmJih5PWUubG9va2FoZWFkKTtkbyBpZihzPXQsIShQW3MrZ10hPT1FdHx8UFtzK2ctMV0hPT1MZXx8UFtzXSE9PVBbcl18fFBbKytzXSE9PVBbcisxXSkpe3IrPTIscysrO2RvO3doaWxlKFBbKytyXT09PVBbKytzXSYmUFsrK3JdPT09UFsrK3NdJiZQWysrcl09PT1QWysrc10mJlBbKytyXT09PVBbKytzXSYmUFsrK3JdPT09UFsrK3NdJiZQWysrcl09PT1QWysrc10mJlBbKytyXT09PVBbKytzXSYmUFsrK3JdPT09UFsrK3NdJiZyPFRlKTtpZihkPVFvLShUZS1yKSxyPVRlLVFvLGQ+Zyl7aWYoZS5tYXRjaF9zdGFydD10LGc9ZCxkPj15KWJyZWFrO0xlPVBbcitnLTFdLEV0PVBbcitnXX19d2hpbGUoKHQ9X2VbdCYkXSk+eiYmLS1uIT09MCk7cmV0dXJuIGc8PWUubG9va2FoZWFkP2c6ZS5sb29rYWhlYWR9ZnVuY3Rpb24gSChlKXt2YXIgdD1lLndfc2l6ZSxuLHIscyxkLGc7ZG97aWYoZD1lLndpbmRvd19zaXplLWUubG9va2FoZWFkLWUuc3Ryc3RhcnQsZS5zdHJzdGFydD49dCsodC1Mbykpe2l0LmFycmF5U2V0KGUud2luZG93LGUud2luZG93LHQsdCwwKSxlLm1hdGNoX3N0YXJ0LT10LGUuc3Ryc3RhcnQtPXQsZS5ibG9ja19zdGFydC09dCxyPWUuaGFzaF9zaXplLG49cjtkbyBzPWUuaGVhZFstLW5dLGUuaGVhZFtuXT1zPj10P3MtdDowO3doaWxlKC0tcik7cj10LG49cjtkbyBzPWUucHJldlstLW5dLGUucHJldltuXT1zPj10P3MtdDowO3doaWxlKC0tcik7ZCs9dH1pZihlLnN0cm0uYXZhaWxfaW49PT0wKWJyZWFrO2lmKHI9TShlLnN0cm0sZS53aW5kb3csZS5zdHJzdGFydCtlLmxvb2thaGVhZCxkKSxlLmxvb2thaGVhZCs9cixlLmxvb2thaGVhZCtlLmluc2VydD49ZG4pZm9yKGc9ZS5zdHJzdGFydC1lLmluc2VydCxlLmluc19oPWUud2luZG93W2ddLGUuaW5zX2g9KGUuaW5zX2g8PGUuaGFzaF9zaGlmdF5lLndpbmRvd1tnKzFdKSZlLmhhc2hfbWFzaztlLmluc2VydCYmKGUuaW5zX2g9KGUuaW5zX2g8PGUuaGFzaF9zaGlmdF5lLndpbmRvd1tnK2RuLTFdKSZlLmhhc2hfbWFzayxlLnByZXZbZyZlLndfbWFza109ZS5oZWFkW2UuaW5zX2hdLGUuaGVhZFtlLmluc19oXT1nLGcrKyxlLmluc2VydC0tLCEoZS5sb29rYWhlYWQrZS5pbnNlcnQ8ZG4pKTspO313aGlsZShlLmxvb2thaGVhZDxMbyYmZS5zdHJtLmF2YWlsX2luIT09MCl9ZnVuY3Rpb24gbmUoZSx0KXt2YXIgbj02NTUzNTtmb3Iobj5lLnBlbmRpbmdfYnVmX3NpemUtNSYmKG49ZS5wZW5kaW5nX2J1Zl9zaXplLTUpOzspe2lmKGUubG9va2FoZWFkPD0xKXtpZihIKGUpLGUubG9va2FoZWFkPT09MCYmdD09PUpvKXJldHVybiBBcjtpZihlLmxvb2thaGVhZD09PTApYnJlYWt9ZS5zdHJzdGFydCs9ZS5sb29rYWhlYWQsZS5sb29rYWhlYWQ9MDt2YXIgcj1lLmJsb2NrX3N0YXJ0K247aWYoKGUuc3Ryc3RhcnQ9PT0wfHxlLnN0cnN0YXJ0Pj1yKSYmKGUubG9va2FoZWFkPWUuc3Ryc3RhcnQtcixlLnN0cnN0YXJ0PXIsbShlLCExKSxlLnN0cm0uYXZhaWxfb3V0PT09MCl8fGUuc3Ryc3RhcnQtZS5ibG9ja19zdGFydD49ZS53X3NpemUtTG8mJihtKGUsITEpLGUuc3RybS5hdmFpbF9vdXQ9PT0wKSlyZXR1cm4gQXJ9cmV0dXJuIGUuaW5zZXJ0PTAsdD09PVpvPyhtKGUsITApLGUuc3RybS5hdmFpbF9vdXQ9PT0wP2dhOm9zKTooZS5zdHJzdGFydD5lLmJsb2NrX3N0YXJ0JiYobShlLCExKSxlLnN0cm0uYXZhaWxfb3V0PT09MCksQXIpfWZ1bmN0aW9uIE5lKGUsdCl7Zm9yKHZhciBuLHI7Oyl7aWYoZS5sb29rYWhlYWQ8TG8pe2lmKEgoZSksZS5sb29rYWhlYWQ8TG8mJnQ9PT1KbylyZXR1cm4gQXI7aWYoZS5sb29rYWhlYWQ9PT0wKWJyZWFrfWlmKG49MCxlLmxvb2thaGVhZD49ZG4mJihlLmluc19oPShlLmluc19oPDxlLmhhc2hfc2hpZnReZS53aW5kb3dbZS5zdHJzdGFydCtkbi0xXSkmZS5oYXNoX21hc2ssbj1lLnByZXZbZS5zdHJzdGFydCZlLndfbWFza109ZS5oZWFkW2UuaW5zX2hdLGUuaGVhZFtlLmluc19oXT1lLnN0cnN0YXJ0KSxuIT09MCYmZS5zdHJzdGFydC1uPD1lLndfc2l6ZS1MbyYmKGUubWF0Y2hfbGVuZ3RoPVkoZSxuKSksZS5tYXRjaF9sZW5ndGg+PWRuKWlmKHI9eW8uX3RyX3RhbGx5KGUsZS5zdHJzdGFydC1lLm1hdGNoX3N0YXJ0LGUubWF0Y2hfbGVuZ3RoLWRuKSxlLmxvb2thaGVhZC09ZS5tYXRjaF9sZW5ndGgsZS5tYXRjaF9sZW5ndGg8PWUubWF4X2xhenlfbWF0Y2gmJmUubG9va2FoZWFkPj1kbil7ZS5tYXRjaF9sZW5ndGgtLTtkbyBlLnN0cnN0YXJ0KyssZS5pbnNfaD0oZS5pbnNfaDw8ZS5oYXNoX3NoaWZ0XmUud2luZG93W2Uuc3Ryc3RhcnQrZG4tMV0pJmUuaGFzaF9tYXNrLG49ZS5wcmV2W2Uuc3Ryc3RhcnQmZS53X21hc2tdPWUuaGVhZFtlLmluc19oXSxlLmhlYWRbZS5pbnNfaF09ZS5zdHJzdGFydDt3aGlsZSgtLWUubWF0Y2hfbGVuZ3RoIT09MCk7ZS5zdHJzdGFydCsrfWVsc2UgZS5zdHJzdGFydCs9ZS5tYXRjaF9sZW5ndGgsZS5tYXRjaF9sZW5ndGg9MCxlLmluc19oPWUud2luZG93W2Uuc3Ryc3RhcnRdLGUuaW5zX2g9KGUuaW5zX2g8PGUuaGFzaF9zaGlmdF5lLndpbmRvd1tlLnN0cnN0YXJ0KzFdKSZlLmhhc2hfbWFzaztlbHNlIHI9eW8uX3RyX3RhbGx5KGUsMCxlLndpbmRvd1tlLnN0cnN0YXJ0XSksZS5sb29rYWhlYWQtLSxlLnN0cnN0YXJ0Kys7aWYociYmKG0oZSwhMSksZS5zdHJtLmF2YWlsX291dD09PTApKXJldHVybiBBcn1yZXR1cm4gZS5pbnNlcnQ9ZS5zdHJzdGFydDxkbi0xP2Uuc3Ryc3RhcnQ6ZG4tMSx0PT09Wm8/KG0oZSwhMCksZS5zdHJtLmF2YWlsX291dD09PTA/Z2E6b3MpOmUubGFzdF9saXQmJihtKGUsITEpLGUuc3RybS5hdmFpbF9vdXQ9PT0wKT9Bcjpfc31mdW5jdGlvbiBmZShlLHQpe2Zvcih2YXIgbixyLHM7Oyl7aWYoZS5sb29rYWhlYWQ8TG8pe2lmKEgoZSksZS5sb29rYWhlYWQ8TG8mJnQ9PT1KbylyZXR1cm4gQXI7aWYoZS5sb29rYWhlYWQ9PT0wKWJyZWFrfWlmKG49MCxlLmxvb2thaGVhZD49ZG4mJihlLmluc19oPShlLmluc19oPDxlLmhhc2hfc2hpZnReZS53aW5kb3dbZS5zdHJzdGFydCtkbi0xXSkmZS5oYXNoX21hc2ssbj1lLnByZXZbZS5zdHJzdGFydCZlLndfbWFza109ZS5oZWFkW2UuaW5zX2hdLGUuaGVhZFtlLmluc19oXT1lLnN0cnN0YXJ0KSxlLnByZXZfbGVuZ3RoPWUubWF0Y2hfbGVuZ3RoLGUucHJldl9tYXRjaD1lLm1hdGNoX3N0YXJ0LGUubWF0Y2hfbGVuZ3RoPWRuLTEsbiE9PTAmJmUucHJldl9sZW5ndGg8ZS5tYXhfbGF6eV9tYXRjaCYmZS5zdHJzdGFydC1uPD1lLndfc2l6ZS1MbyYmKGUubWF0Y2hfbGVuZ3RoPVkoZSxuKSxlLm1hdGNoX2xlbmd0aDw9NSYmKGUuc3RyYXRlZ3k9PT1wY3x8ZS5tYXRjaF9sZW5ndGg9PT1kbiYmZS5zdHJzdGFydC1lLm1hdGNoX3N0YXJ0PjQwOTYpJiYoZS5tYXRjaF9sZW5ndGg9ZG4tMSkpLGUucHJldl9sZW5ndGg+PWRuJiZlLm1hdGNoX2xlbmd0aDw9ZS5wcmV2X2xlbmd0aCl7cz1lLnN0cnN0YXJ0K2UubG9va2FoZWFkLWRuLHI9eW8uX3RyX3RhbGx5KGUsZS5zdHJzdGFydC0xLWUucHJldl9tYXRjaCxlLnByZXZfbGVuZ3RoLWRuKSxlLmxvb2thaGVhZC09ZS5wcmV2X2xlbmd0aC0xLGUucHJldl9sZW5ndGgtPTI7ZG8rK2Uuc3Ryc3RhcnQ8PXMmJihlLmluc19oPShlLmluc19oPDxlLmhhc2hfc2hpZnReZS53aW5kb3dbZS5zdHJzdGFydCtkbi0xXSkmZS5oYXNoX21hc2ssbj1lLnByZXZbZS5zdHJzdGFydCZlLndfbWFza109ZS5oZWFkW2UuaW5zX2hdLGUuaGVhZFtlLmluc19oXT1lLnN0cnN0YXJ0KTt3aGlsZSgtLWUucHJldl9sZW5ndGghPT0wKTtpZihlLm1hdGNoX2F2YWlsYWJsZT0wLGUubWF0Y2hfbGVuZ3RoPWRuLTEsZS5zdHJzdGFydCsrLHImJihtKGUsITEpLGUuc3RybS5hdmFpbF9vdXQ9PT0wKSlyZXR1cm4gQXJ9ZWxzZSBpZihlLm1hdGNoX2F2YWlsYWJsZSl7aWYocj15by5fdHJfdGFsbHkoZSwwLGUud2luZG93W2Uuc3Ryc3RhcnQtMV0pLHImJm0oZSwhMSksZS5zdHJzdGFydCsrLGUubG9va2FoZWFkLS0sZS5zdHJtLmF2YWlsX291dD09PTApcmV0dXJuIEFyfWVsc2UgZS5tYXRjaF9hdmFpbGFibGU9MSxlLnN0cnN0YXJ0KyssZS5sb29rYWhlYWQtLX1yZXR1cm4gZS5tYXRjaF9hdmFpbGFibGUmJihyPXlvLl90cl90YWxseShlLDAsZS53aW5kb3dbZS5zdHJzdGFydC0xXSksZS5tYXRjaF9hdmFpbGFibGU9MCksZS5pbnNlcnQ9ZS5zdHJzdGFydDxkbi0xP2Uuc3Ryc3RhcnQ6ZG4tMSx0PT09Wm8/KG0oZSwhMCksZS5zdHJtLmF2YWlsX291dD09PTA/Z2E6b3MpOmUubGFzdF9saXQmJihtKGUsITEpLGUuc3RybS5hdmFpbF9vdXQ9PT0wKT9Bcjpfc31mdW5jdGlvbiBjZShlLHQpe2Zvcih2YXIgbixyLHMsZCxnPWUud2luZG93Ozspe2lmKGUubG9va2FoZWFkPD1Rbyl7aWYoSChlKSxlLmxvb2thaGVhZDw9UW8mJnQ9PT1KbylyZXR1cm4gQXI7aWYoZS5sb29rYWhlYWQ9PT0wKWJyZWFrfWlmKGUubWF0Y2hfbGVuZ3RoPTAsZS5sb29rYWhlYWQ+PWRuJiZlLnN0cnN0YXJ0PjAmJihzPWUuc3Ryc3RhcnQtMSxyPWdbc10scj09PWdbKytzXSYmcj09PWdbKytzXSYmcj09PWdbKytzXSkpe2Q9ZS5zdHJzdGFydCtRbztkbzt3aGlsZShyPT09Z1srK3NdJiZyPT09Z1srK3NdJiZyPT09Z1srK3NdJiZyPT09Z1srK3NdJiZyPT09Z1srK3NdJiZyPT09Z1srK3NdJiZyPT09Z1srK3NdJiZyPT09Z1srK3NdJiZzPGQpO2UubWF0Y2hfbGVuZ3RoPVFvLShkLXMpLGUubWF0Y2hfbGVuZ3RoPmUubG9va2FoZWFkJiYoZS5tYXRjaF9sZW5ndGg9ZS5sb29rYWhlYWQpfWlmKGUubWF0Y2hfbGVuZ3RoPj1kbj8obj15by5fdHJfdGFsbHkoZSwxLGUubWF0Y2hfbGVuZ3RoLWRuKSxlLmxvb2thaGVhZC09ZS5tYXRjaF9sZW5ndGgsZS5zdHJzdGFydCs9ZS5tYXRjaF9sZW5ndGgsZS5tYXRjaF9sZW5ndGg9MCk6KG49eW8uX3RyX3RhbGx5KGUsMCxlLndpbmRvd1tlLnN0cnN0YXJ0XSksZS5sb29rYWhlYWQtLSxlLnN0cnN0YXJ0KyspLG4mJihtKGUsITEpLGUuc3RybS5hdmFpbF9vdXQ9PT0wKSlyZXR1cm4gQXJ9cmV0dXJuIGUuaW5zZXJ0PTAsdD09PVpvPyhtKGUsITApLGUuc3RybS5hdmFpbF9vdXQ9PT0wP2dhOm9zKTplLmxhc3RfbGl0JiYobShlLCExKSxlLnN0cm0uYXZhaWxfb3V0PT09MCk/QXI6X3N9ZnVuY3Rpb24gRmUoZSx0KXtmb3IodmFyIG47Oyl7aWYoZS5sb29rYWhlYWQ9PT0wJiYoSChlKSxlLmxvb2thaGVhZD09PTApKXtpZih0PT09Sm8pcmV0dXJuIEFyO2JyZWFrfWlmKGUubWF0Y2hfbGVuZ3RoPTAsbj15by5fdHJfdGFsbHkoZSwwLGUud2luZG93W2Uuc3Ryc3RhcnRdKSxlLmxvb2thaGVhZC0tLGUuc3Ryc3RhcnQrKyxuJiYobShlLCExKSxlLnN0cm0uYXZhaWxfb3V0PT09MCkpcmV0dXJuIEFyfXJldHVybiBlLmluc2VydD0wLHQ9PT1abz8obShlLCEwKSxlLnN0cm0uYXZhaWxfb3V0PT09MD9nYTpvcyk6ZS5sYXN0X2xpdCYmKG0oZSwhMSksZS5zdHJtLmF2YWlsX291dD09PTApP0FyOl9zfWZ1bmN0aW9uIFZlKGUsdCxuLHIscyl7dGhpcy5nb29kX2xlbmd0aD1lLHRoaXMubWF4X2xhenk9dCx0aGlzLm5pY2VfbGVuZ3RoPW4sdGhpcy5tYXhfY2hhaW49cix0aGlzLmZ1bmM9c312YXIgbHQ7bHQ9W25ldyBWZSgwLDAsMCwwLG5lKSxuZXcgVmUoNCw0LDgsNCxOZSksbmV3IFZlKDQsNSwxNiw4LE5lKSxuZXcgVmUoNCw2LDMyLDMyLE5lKSxuZXcgVmUoNCw0LDE2LDE2LGZlKSxuZXcgVmUoOCwxNiwzMiwzMixmZSksbmV3IFZlKDgsMTYsMTI4LDEyOCxmZSksbmV3IFZlKDgsMzIsMTI4LDI1NixmZSksbmV3IFZlKDMyLDEyOCwyNTgsMTAyNCxmZSksbmV3IFZlKDMyLDI1OCwyNTgsNDA5NixmZSldO2Z1bmN0aW9uIG10KGUpe2Uud2luZG93X3NpemU9MiplLndfc2l6ZSxsKGUuaGVhZCksZS5tYXhfbGF6eV9tYXRjaD1sdFtlLmxldmVsXS5tYXhfbGF6eSxlLmdvb2RfbWF0Y2g9bHRbZS5sZXZlbF0uZ29vZF9sZW5ndGgsZS5uaWNlX21hdGNoPWx0W2UubGV2ZWxdLm5pY2VfbGVuZ3RoLGUubWF4X2NoYWluX2xlbmd0aD1sdFtlLmxldmVsXS5tYXhfY2hhaW4sZS5zdHJzdGFydD0wLGUuYmxvY2tfc3RhcnQ9MCxlLmxvb2thaGVhZD0wLGUuaW5zZXJ0PTAsZS5tYXRjaF9sZW5ndGg9ZS5wcmV2X2xlbmd0aD1kbi0xLGUubWF0Y2hfYXZhaWxhYmxlPTAsZS5pbnNfaD0wfWZ1bmN0aW9uIHdlKCl7dGhpcy5zdHJtPW51bGwsdGhpcy5zdGF0dXM9MCx0aGlzLnBlbmRpbmdfYnVmPW51bGwsdGhpcy5wZW5kaW5nX2J1Zl9zaXplPTAsdGhpcy5wZW5kaW5nX291dD0wLHRoaXMucGVuZGluZz0wLHRoaXMud3JhcD0wLHRoaXMuZ3poZWFkPW51bGwsdGhpcy5nemluZGV4PTAsdGhpcy5tZXRob2Q9YWwsdGhpcy5sYXN0X2ZsdXNoPS0xLHRoaXMud19zaXplPTAsdGhpcy53X2JpdHM9MCx0aGlzLndfbWFzaz0wLHRoaXMud2luZG93PW51bGwsdGhpcy53aW5kb3dfc2l6ZT0wLHRoaXMucHJldj1udWxsLHRoaXMuaGVhZD1udWxsLHRoaXMuaW5zX2g9MCx0aGlzLmhhc2hfc2l6ZT0wLHRoaXMuaGFzaF9iaXRzPTAsdGhpcy5oYXNoX21hc2s9MCx0aGlzLmhhc2hfc2hpZnQ9MCx0aGlzLmJsb2NrX3N0YXJ0PTAsdGhpcy5tYXRjaF9sZW5ndGg9MCx0aGlzLnByZXZfbWF0Y2g9MCx0aGlzLm1hdGNoX2F2YWlsYWJsZT0wLHRoaXMuc3Ryc3RhcnQ9MCx0aGlzLm1hdGNoX3N0YXJ0PTAsdGhpcy5sb29rYWhlYWQ9MCx0aGlzLnByZXZfbGVuZ3RoPTAsdGhpcy5tYXhfY2hhaW5fbGVuZ3RoPTAsdGhpcy5tYXhfbGF6eV9tYXRjaD0wLHRoaXMubGV2ZWw9MCx0aGlzLnN0cmF0ZWd5PTAsdGhpcy5nb29kX21hdGNoPTAsdGhpcy5uaWNlX21hdGNoPTAsdGhpcy5keW5fbHRyZWU9bmV3IGl0LkJ1ZjE2KF9jKjIpLHRoaXMuZHluX2R0cmVlPW5ldyBpdC5CdWYxNigoMipKYysxKSoyKSx0aGlzLmJsX3RyZWU9bmV3IGl0LkJ1ZjE2KCgyKmthKzEpKjIpLGwodGhpcy5keW5fbHRyZWUpLGwodGhpcy5keW5fZHRyZWUpLGwodGhpcy5ibF90cmVlKSx0aGlzLmxfZGVzYz1udWxsLHRoaXMuZF9kZXNjPW51bGwsdGhpcy5ibF9kZXNjPW51bGwsdGhpcy5ibF9jb3VudD1uZXcgaXQuQnVmMTYoYmMrMSksdGhpcy5oZWFwPW5ldyBpdC5CdWYxNigyKnNsKzEpLGwodGhpcy5oZWFwKSx0aGlzLmhlYXBfbGVuPTAsdGhpcy5oZWFwX21heD0wLHRoaXMuZGVwdGg9bmV3IGl0LkJ1ZjE2KDIqc2wrMSksbCh0aGlzLmRlcHRoKSx0aGlzLmxfYnVmPTAsdGhpcy5saXRfYnVmc2l6ZT0wLHRoaXMubGFzdF9saXQ9MCx0aGlzLmRfYnVmPTAsdGhpcy5vcHRfbGVuPTAsdGhpcy5zdGF0aWNfbGVuPTAsdGhpcy5tYXRjaGVzPTAsdGhpcy5pbnNlcnQ9MCx0aGlzLmJpX2J1Zj0wLHRoaXMuYmlfdmFsaWQ9MH1mdW5jdGlvbiBkZShlKXt2YXIgdDtyZXR1cm4hZXx8IWUuc3RhdGU/eGEoZSxvbyk6KGUudG90YWxfaW49ZS50b3RhbF9vdXQ9MCxlLmRhdGFfdHlwZT1LYyx0PWUuc3RhdGUsdC5wZW5kaW5nPTAsdC5wZW5kaW5nX291dD0wLHQud3JhcDwwJiYodC53cmFwPS10LndyYXApLHQuc3RhdHVzPXQud3JhcD9lYTpSYSxlLmFkbGVyPXQud3JhcD09PTI/MDoxLHQubGFzdF9mbHVzaD1Kbyx5by5fdHJfaW5pdCh0KSxYbyl9ZnVuY3Rpb24gU2UoZSl7dmFyIHQ9ZGUoZSk7cmV0dXJuIHQ9PT1YbyYmbXQoZS5zdGF0ZSksdH1mdW5jdGlvbiBudChlLHQpe3JldHVybiFlfHwhZS5zdGF0ZXx8ZS5zdGF0ZS53cmFwIT09Mj9vbzooZS5zdGF0ZS5nemhlYWQ9dCxYbyl9ZnVuY3Rpb24gemUoZSx0LG4scixzLGQpe2lmKCFlKXJldHVybiBvbzt2YXIgZz0xO2lmKHQ9PT1oYyYmKHQ9NikscjwwPyhnPTAscj0tcik6cj4xNSYmKGc9MixyLT0xNiksczwxfHxzPlZsfHxuIT09YWx8fHI8OHx8cj4xNXx8dDwwfHx0Pjl8fGQ8MHx8ZD52YylyZXR1cm4geGEoZSxvbyk7cj09PTgmJihyPTkpO3ZhciB5PW5ldyB3ZTtyZXR1cm4gZS5zdGF0ZT15LHkuc3RybT1lLHkud3JhcD1nLHkuZ3poZWFkPW51bGwseS53X2JpdHM9cix5Lndfc2l6ZT0xPDx5LndfYml0cyx5LndfbWFzaz15Lndfc2l6ZS0xLHkuaGFzaF9iaXRzPXMrNyx5Lmhhc2hfc2l6ZT0xPDx5Lmhhc2hfYml0cyx5Lmhhc2hfbWFzaz15Lmhhc2hfc2l6ZS0xLHkuaGFzaF9zaGlmdD1+figoeS5oYXNoX2JpdHMrZG4tMSkvZG4pLHkud2luZG93PW5ldyBpdC5CdWY4KHkud19zaXplKjIpLHkuaGVhZD1uZXcgaXQuQnVmMTYoeS5oYXNoX3NpemUpLHkucHJldj1uZXcgaXQuQnVmMTYoeS53X3NpemUpLHkubGl0X2J1ZnNpemU9MTw8cys2LHkucGVuZGluZ19idWZfc2l6ZT15LmxpdF9idWZzaXplKjQseS5wZW5kaW5nX2J1Zj1uZXcgaXQuQnVmOCh5LnBlbmRpbmdfYnVmX3NpemUpLHkuZF9idWY9MSp5LmxpdF9idWZzaXplLHkubF9idWY9KDErMikqeS5saXRfYnVmc2l6ZSx5LmxldmVsPXQseS5zdHJhdGVneT1kLHkubWV0aG9kPW4sU2UoZSl9ZnVuY3Rpb24gaShlLHQpe3JldHVybiB6ZShlLHQsYWwsbWMsTmEscWMpfWZ1bmN0aW9uIGEoZSx0KXt2YXIgbixyLHMsZDtpZighZXx8IWUuc3RhdGV8fHQ+TGx8fHQ8MClyZXR1cm4gZT94YShlLG9vKTpvbztpZihyPWUuc3RhdGUsIWUub3V0cHV0fHwhZS5pbnB1dCYmZS5hdmFpbF9pbiE9PTB8fHIuc3RhdHVzPT09bXMmJnQhPT1abylyZXR1cm4geGEoZSxlLmF2YWlsX291dD09PTA/b2w6b28pO2lmKHIuc3RybT1lLG49ci5sYXN0X2ZsdXNoLHIubGFzdF9mbHVzaD10LHIuc3RhdHVzPT09ZWEpaWYoci53cmFwPT09MillLmFkbGVyPTAsUyhyLDMxKSxTKHIsMTM5KSxTKHIsOCksci5nemhlYWQ/KFMociwoci5nemhlYWQudGV4dD8xOjApKyhyLmd6aGVhZC5oY3JjPzI6MCkrKHIuZ3poZWFkLmV4dHJhPzQ6MCkrKHIuZ3poZWFkLm5hbWU/ODowKSsoci5nemhlYWQuY29tbWVudD8xNjowKSksUyhyLHIuZ3poZWFkLnRpbWUmMjU1KSxTKHIsci5nemhlYWQudGltZT4+OCYyNTUpLFMocixyLmd6aGVhZC50aW1lPj4xNiYyNTUpLFMocixyLmd6aGVhZC50aW1lPj4yNCYyNTUpLFMocixyLmxldmVsPT09OT8yOnIuc3RyYXRlZ3k+PXZzfHxyLmxldmVsPDI/NDowKSxTKHIsci5nemhlYWQub3MmMjU1KSxyLmd6aGVhZC5leHRyYSYmci5nemhlYWQuZXh0cmEubGVuZ3RoJiYoUyhyLHIuZ3poZWFkLmV4dHJhLmxlbmd0aCYyNTUpLFMocixyLmd6aGVhZC5leHRyYS5sZW5ndGg+PjgmMjU1KSksci5nemhlYWQuaGNyYyYmKGUuYWRsZXI9ZHIoZS5hZGxlcixyLnBlbmRpbmdfYnVmLHIucGVuZGluZywwKSksci5nemluZGV4PTAsci5zdGF0dXM9bGwpOihTKHIsMCksUyhyLDApLFMociwwKSxTKHIsMCksUyhyLDApLFMocixyLmxldmVsPT09OT8yOnIuc3RyYXRlZ3k+PXZzfHxyLmxldmVsPDI/NDowKSxTKHIsWmMpLHIuc3RhdHVzPVJhKTtlbHNle3ZhciBnPWFsKyhyLndfYml0cy04PDw0KTw8OCx5PS0xO3Iuc3RyYXRlZ3k+PXZzfHxyLmxldmVsPDI/eT0wOnIubGV2ZWw8Nj95PTE6ci5sZXZlbD09PTY/eT0yOnk9MyxnfD15PDw2LHIuc3Ryc3RhcnQhPT0wJiYoZ3w9cGEpLGcrPTMxLWclMzEsci5zdGF0dXM9UmEsTyhyLGcpLHIuc3Ryc3RhcnQhPT0wJiYoTyhyLGUuYWRsZXI+Pj4xNiksTyhyLGUuYWRsZXImNjU1MzUpKSxlLmFkbGVyPTF9aWYoci5zdGF0dXM9PT1sbClpZihyLmd6aGVhZC5leHRyYSl7Zm9yKHM9ci5wZW5kaW5nO3IuZ3ppbmRleDwoci5nemhlYWQuZXh0cmEubGVuZ3RoJjY1NTM1KSYmIShyLnBlbmRpbmc9PT1yLnBlbmRpbmdfYnVmX3NpemUmJihyLmd6aGVhZC5oY3JjJiZyLnBlbmRpbmc+cyYmKGUuYWRsZXI9ZHIoZS5hZGxlcixyLnBlbmRpbmdfYnVmLHIucGVuZGluZy1zLHMpKSxoKGUpLHM9ci5wZW5kaW5nLHIucGVuZGluZz09PXIucGVuZGluZ19idWZfc2l6ZSkpOylTKHIsci5nemhlYWQuZXh0cmFbci5nemluZGV4XSYyNTUpLHIuZ3ppbmRleCsrO3IuZ3poZWFkLmhjcmMmJnIucGVuZGluZz5zJiYoZS5hZGxlcj1kcihlLmFkbGVyLHIucGVuZGluZ19idWYsci5wZW5kaW5nLXMscykpLHIuZ3ppbmRleD09PXIuZ3poZWFkLmV4dHJhLmxlbmd0aCYmKHIuZ3ppbmRleD0wLHIuc3RhdHVzPWNsKX1lbHNlIHIuc3RhdHVzPWNsO2lmKHIuc3RhdHVzPT09Y2wpaWYoci5nemhlYWQubmFtZSl7cz1yLnBlbmRpbmc7ZG97aWYoci5wZW5kaW5nPT09ci5wZW5kaW5nX2J1Zl9zaXplJiYoci5nemhlYWQuaGNyYyYmci5wZW5kaW5nPnMmJihlLmFkbGVyPWRyKGUuYWRsZXIsci5wZW5kaW5nX2J1ZixyLnBlbmRpbmctcyxzKSksaChlKSxzPXIucGVuZGluZyxyLnBlbmRpbmc9PT1yLnBlbmRpbmdfYnVmX3NpemUpKXtkPTE7YnJlYWt9ci5nemluZGV4PHIuZ3poZWFkLm5hbWUubGVuZ3RoP2Q9ci5nemhlYWQubmFtZS5jaGFyQ29kZUF0KHIuZ3ppbmRleCsrKSYyNTU6ZD0wLFMocixkKX13aGlsZShkIT09MCk7ci5nemhlYWQuaGNyYyYmci5wZW5kaW5nPnMmJihlLmFkbGVyPWRyKGUuYWRsZXIsci5wZW5kaW5nX2J1ZixyLnBlbmRpbmctcyxzKSksZD09PTAmJihyLmd6aW5kZXg9MCxyLnN0YXR1cz1pcyl9ZWxzZSByLnN0YXR1cz1pcztpZihyLnN0YXR1cz09PWlzKWlmKHIuZ3poZWFkLmNvbW1lbnQpe3M9ci5wZW5kaW5nO2Rve2lmKHIucGVuZGluZz09PXIucGVuZGluZ19idWZfc2l6ZSYmKHIuZ3poZWFkLmhjcmMmJnIucGVuZGluZz5zJiYoZS5hZGxlcj1kcihlLmFkbGVyLHIucGVuZGluZ19idWYsci5wZW5kaW5nLXMscykpLGgoZSkscz1yLnBlbmRpbmcsci5wZW5kaW5nPT09ci5wZW5kaW5nX2J1Zl9zaXplKSl7ZD0xO2JyZWFrfXIuZ3ppbmRleDxyLmd6aGVhZC5jb21tZW50Lmxlbmd0aD9kPXIuZ3poZWFkLmNvbW1lbnQuY2hhckNvZGVBdChyLmd6aW5kZXgrKykmMjU1OmQ9MCxTKHIsZCl9d2hpbGUoZCE9PTApO3IuZ3poZWFkLmhjcmMmJnIucGVuZGluZz5zJiYoZS5hZGxlcj1kcihlLmFkbGVyLHIucGVuZGluZ19idWYsci5wZW5kaW5nLXMscykpLGQ9PT0wJiYoci5zdGF0dXM9enMpfWVsc2Ugci5zdGF0dXM9enM7aWYoci5zdGF0dXM9PT16cyYmKHIuZ3poZWFkLmhjcmM/KHIucGVuZGluZysyPnIucGVuZGluZ19idWZfc2l6ZSYmaChlKSxyLnBlbmRpbmcrMjw9ci5wZW5kaW5nX2J1Zl9zaXplJiYoUyhyLGUuYWRsZXImMjU1KSxTKHIsZS5hZGxlcj4+OCYyNTUpLGUuYWRsZXI9MCxyLnN0YXR1cz1SYSkpOnIuc3RhdHVzPVJhKSxyLnBlbmRpbmchPT0wKXtpZihoKGUpLGUuYXZhaWxfb3V0PT09MClyZXR1cm4gci5sYXN0X2ZsdXNoPS0xLFhvfWVsc2UgaWYoZS5hdmFpbF9pbj09PTAmJm8odCk8PW8obikmJnQhPT1abylyZXR1cm4geGEoZSxvbCk7aWYoci5zdGF0dXM9PT1tcyYmZS5hdmFpbF9pbiE9PTApcmV0dXJuIHhhKGUsb2wpO2lmKGUuYXZhaWxfaW4hPT0wfHxyLmxvb2thaGVhZCE9PTB8fHQhPT1KbyYmci5zdGF0dXMhPT1tcyl7dmFyIHo9ci5zdHJhdGVneT09PXZzP0ZlKHIsdCk6ci5zdHJhdGVneT09PWdjP2NlKHIsdCk6bHRbci5sZXZlbF0uZnVuYyhyLHQpO2lmKCh6PT09Z2F8fHo9PT1vcykmJihyLnN0YXR1cz1tcyksej09PUFyfHx6PT09Z2EpcmV0dXJuIGUuYXZhaWxfb3V0PT09MCYmKHIubGFzdF9mbHVzaD0tMSksWG87aWYoej09PV9zJiYodD09PXVjP3lvLl90cl9hbGlnbihyKTp0IT09TGwmJih5by5fdHJfc3RvcmVkX2Jsb2NrKHIsMCwwLCExKSx0PT09aWwmJihsKHIuaGVhZCksci5sb29rYWhlYWQ9PT0wJiYoci5zdHJzdGFydD0wLHIuYmxvY2tfc3RhcnQ9MCxyLmluc2VydD0wKSkpLGgoZSksZS5hdmFpbF9vdXQ9PT0wKSlyZXR1cm4gci5sYXN0X2ZsdXNoPS0xLFhvfXJldHVybiB0IT09Wm8/WG86ci53cmFwPD0wP2ZjOihyLndyYXA9PT0yPyhTKHIsZS5hZGxlciYyNTUpLFMocixlLmFkbGVyPj44JjI1NSksUyhyLGUuYWRsZXI+PjE2JjI1NSksUyhyLGUuYWRsZXI+PjI0JjI1NSksUyhyLGUudG90YWxfaW4mMjU1KSxTKHIsZS50b3RhbF9pbj4+OCYyNTUpLFMocixlLnRvdGFsX2luPj4xNiYyNTUpLFMocixlLnRvdGFsX2luPj4yNCYyNTUpKTooTyhyLGUuYWRsZXI+Pj4xNiksTyhyLGUuYWRsZXImNjU1MzUpKSxoKGUpLHIud3JhcD4wJiYoci53cmFwPS1yLndyYXApLHIucGVuZGluZyE9PTA/WG86ZmMpfWZ1bmN0aW9uIGYoZSl7dmFyIHQ7cmV0dXJuIWV8fCFlLnN0YXRlP29vOih0PWUuc3RhdGUuc3RhdHVzLHQhPT1lYSYmdCE9PWxsJiZ0IT09Y2wmJnQhPT1pcyYmdCE9PXpzJiZ0IT09UmEmJnQhPT1tcz94YShlLG9vKTooZS5zdGF0ZT1udWxsLHQ9PT1SYT94YShlLGRjKTpYbykpfWZ1bmN0aW9uIHAoZSx0KXt2YXIgbj10Lmxlbmd0aCxyLHMsZCxnLHkseixQLCQ7aWYoIWV8fCFlLnN0YXRlfHwocj1lLnN0YXRlLGc9ci53cmFwLGc9PT0yfHxnPT09MSYmci5zdGF0dXMhPT1lYXx8ci5sb29rYWhlYWQpKXJldHVybiBvbztmb3IoZz09PTEmJihlLmFkbGVyPUhzKGUuYWRsZXIsdCxuLDApKSxyLndyYXA9MCxuPj1yLndfc2l6ZSYmKGc9PT0wJiYobChyLmhlYWQpLHIuc3Ryc3RhcnQ9MCxyLmJsb2NrX3N0YXJ0PTAsci5pbnNlcnQ9MCksJD1uZXcgaXQuQnVmOChyLndfc2l6ZSksaXQuYXJyYXlTZXQoJCx0LG4tci53X3NpemUsci53X3NpemUsMCksdD0kLG49ci53X3NpemUpLHk9ZS5hdmFpbF9pbix6PWUubmV4dF9pbixQPWUuaW5wdXQsZS5hdmFpbF9pbj1uLGUubmV4dF9pbj0wLGUuaW5wdXQ9dCxIKHIpO3IubG9va2FoZWFkPj1kbjspe3M9ci5zdHJzdGFydCxkPXIubG9va2FoZWFkLShkbi0xKTtkbyByLmluc19oPShyLmluc19oPDxyLmhhc2hfc2hpZnReci53aW5kb3dbcytkbi0xXSkmci5oYXNoX21hc2ssci5wcmV2W3Mmci53X21hc2tdPXIuaGVhZFtyLmluc19oXSxyLmhlYWRbci5pbnNfaF09cyxzKys7d2hpbGUoLS1kKTtyLnN0cnN0YXJ0PXMsci5sb29rYWhlYWQ9ZG4tMSxIKHIpfXJldHVybiByLnN0cnN0YXJ0Kz1yLmxvb2thaGVhZCxyLmJsb2NrX3N0YXJ0PXIuc3Ryc3RhcnQsci5pbnNlcnQ9ci5sb29rYWhlYWQsci5sb29rYWhlYWQ9MCxyLm1hdGNoX2xlbmd0aD1yLnByZXZfbGVuZ3RoPWRuLTEsci5tYXRjaF9hdmFpbGFibGU9MCxlLm5leHRfaW49eixlLmlucHV0PVAsZS5hdmFpbF9pbj15LHIud3JhcD1nLFhvfXZhciB3PWksRT16ZSxOPVNlLEw9ZGUsUj1udCxLPWEsdWU9ZixvZT1wLHRlPSJwYWtvIGRlZmxhdGUgKGZyb20gTm9kZWNhIHByb2plY3QpIixFZT17ZGVmbGF0ZUluaXQ6dyxkZWZsYXRlSW5pdDI6RSxkZWZsYXRlUmVzZXQ6TixkZWZsYXRlUmVzZXRLZWVwOkwsZGVmbGF0ZVNldEhlYWRlcjpSLGRlZmxhdGU6SyxkZWZsYXRlRW5kOnVlLGRlZmxhdGVTZXREaWN0aW9uYXJ5Om9lLGRlZmxhdGVJbmZvOnRlfSxIZT0hMCxydD0hMDt0cnl7U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLFswXSl9Y2F0Y2goZSl7SGU9ITF9dHJ5e1N0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxuZXcgVWludDhBcnJheSgxKSl9Y2F0Y2goZSl7cnQ9ITF9Zm9yKHZhciBmdD1uZXcgaXQuQnVmOCgyNTYpLHZlPTA7dmU8MjU2O3ZlKyspZnRbdmVdPXZlPj0yNTI/Njp2ZT49MjQ4PzU6dmU+PTI0MD80OnZlPj0yMjQ/Mzp2ZT49MTkyPzI6MTtmdFsyNTRdPWZ0WzI1NF09MTt2YXIgbGU9ZnVuY3Rpb24oZSl7dmFyIHQsbixyLHMsZCxnPWUubGVuZ3RoLHk9MDtmb3Iocz0wO3M8ZztzKyspbj1lLmNoYXJDb2RlQXQocyksKG4mNjQ1MTIpPT09NTUyOTYmJnMrMTxnJiYocj1lLmNoYXJDb2RlQXQocysxKSwociY2NDUxMik9PT01NjMyMCYmKG49NjU1MzYrKG4tNTUyOTY8PDEwKSsoci01NjMyMCkscysrKSkseSs9bjwxMjg/MTpuPDIwNDg/MjpuPDY1NTM2PzM6NDtmb3IodD1uZXcgaXQuQnVmOCh5KSxkPTAscz0wO2Q8eTtzKyspbj1lLmNoYXJDb2RlQXQocyksKG4mNjQ1MTIpPT09NTUyOTYmJnMrMTxnJiYocj1lLmNoYXJDb2RlQXQocysxKSwociY2NDUxMik9PT01NjMyMCYmKG49NjU1MzYrKG4tNTUyOTY8PDEwKSsoci01NjMyMCkscysrKSksbjwxMjg/dFtkKytdPW46bjwyMDQ4Pyh0W2QrK109MTkyfG4+Pj42LHRbZCsrXT0xMjh8biY2Myk6bjw2NTUzNj8odFtkKytdPTIyNHxuPj4+MTIsdFtkKytdPTEyOHxuPj4+NiY2Myx0W2QrK109MTI4fG4mNjMpOih0W2QrK109MjQwfG4+Pj4xOCx0W2QrK109MTI4fG4+Pj4xMiY2Myx0W2QrK109MTI4fG4+Pj42JjYzLHRbZCsrXT0xMjh8biY2Myk7cmV0dXJuIHR9O2Z1bmN0aW9uIG1lKGUsdCl7aWYodDw2NTUzNCYmKGUuc3ViYXJyYXkmJnJ0fHwhZS5zdWJhcnJheSYmSGUpKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsaXQuc2hyaW5rQnVmKGUsdCkpO2Zvcih2YXIgbj0iIixyPTA7cjx0O3IrKyluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGVbcl0pO3JldHVybiBufXZhciBaZT1mdW5jdGlvbihlKXtyZXR1cm4gbWUoZSxlLmxlbmd0aCl9LE9lPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1uZXcgaXQuQnVmOChlLmxlbmd0aCksbj0wLHI9dC5sZW5ndGg7bjxyO24rKyl0W25dPWUuY2hhckNvZGVBdChuKTtyZXR1cm4gdH0sb3Q9ZnVuY3Rpb24oZSx0KXt2YXIgbixyLHMsZCxnPXR8fGUubGVuZ3RoLHk9bmV3IEFycmF5KGcqMik7Zm9yKHI9MCxuPTA7bjxnOyl7aWYocz1lW24rK10sczwxMjgpe3lbcisrXT1zO2NvbnRpbnVlfWlmKGQ9ZnRbc10sZD40KXt5W3IrK109NjU1MzMsbis9ZC0xO2NvbnRpbnVlfWZvcihzJj1kPT09Mj8zMTpkPT09Mz8xNTo3O2Q+MSYmbjxnOylzPXM8PDZ8ZVtuKytdJjYzLGQtLTtpZihkPjEpe3lbcisrXT02NTUzMztjb250aW51ZX1zPDY1NTM2P3lbcisrXT1zOihzLT02NTUzNix5W3IrK109NTUyOTZ8cz4+MTAmMTAyMyx5W3IrK109NTYzMjB8cyYxMDIzKX1yZXR1cm4gbWUoeSxyKX0sZHQ9ZnVuY3Rpb24oZSx0KXt2YXIgbjtmb3IodD10fHxlLmxlbmd0aCx0PmUubGVuZ3RoJiYodD1lLmxlbmd0aCksbj10LTE7bj49MCYmKGVbbl0mMTkyKT09PTEyODspbi0tO3JldHVybiBuPDB8fG49PT0wP3Q6bitmdFtlW25dXT50P246dH0sWWU9e3N0cmluZzJidWY6bGUsYnVmMmJpbnN0cmluZzpaZSxiaW5zdHJpbmcyYnVmOk9lLGJ1ZjJzdHJpbmc6b3QsdXRmOGJvcmRlcjpkdH07ZnVuY3Rpb24gT3QoKXt0aGlzLmlucHV0PW51bGwsdGhpcy5uZXh0X2luPTAsdGhpcy5hdmFpbF9pbj0wLHRoaXMudG90YWxfaW49MCx0aGlzLm91dHB1dD1udWxsLHRoaXMubmV4dF9vdXQ9MCx0aGlzLmF2YWlsX291dD0wLHRoaXMudG90YWxfb3V0PTAsdGhpcy5tc2c9IiIsdGhpcy5zdGF0ZT1udWxsLHRoaXMuZGF0YV90eXBlPTIsdGhpcy5hZGxlcj0wfXZhciBUdD1PdCx3dD1FZSwkdD1ZZSx4PVR0LFU9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxoZT0wLEllPTQsUGU9MCxKZT0xLGN0PTIsWGU9LTEsdHQ9MCxXZT04O2Z1bmN0aW9uIEN0KGUpe2lmKCEodGhpcyBpbnN0YW5jZW9mIEN0KSlyZXR1cm4gbmV3IEN0KGUpO3RoaXMub3B0aW9ucz1pdC5hc3NpZ24oe2xldmVsOlhlLG1ldGhvZDpXZSxjaHVua1NpemU6MTYzODQsd2luZG93Qml0czoxNSxtZW1MZXZlbDo4LHN0cmF0ZWd5OnR0LHRvOiIifSxlfHx7fSk7dmFyIHQ9dGhpcy5vcHRpb25zO3QucmF3JiZ0LndpbmRvd0JpdHM+MD90LndpbmRvd0JpdHM9LXQud2luZG93Qml0czp0Lmd6aXAmJnQud2luZG93Qml0cz4wJiZ0LndpbmRvd0JpdHM8MTYmJih0LndpbmRvd0JpdHMrPTE2KSx0aGlzLmVycj0wLHRoaXMubXNnPSIiLHRoaXMuZW5kZWQ9ITEsdGhpcy5jaHVua3M9W10sdGhpcy5zdHJtPW5ldyB4LHRoaXMuc3RybS5hdmFpbF9vdXQ9MDt2YXIgbj13dC5kZWZsYXRlSW5pdDIodGhpcy5zdHJtLHQubGV2ZWwsdC5tZXRob2QsdC53aW5kb3dCaXRzLHQubWVtTGV2ZWwsdC5zdHJhdGVneSk7aWYobiE9PVBlKXRocm93IG5ldyBFcnJvcihoYVtuXSk7aWYodC5oZWFkZXImJnd0LmRlZmxhdGVTZXRIZWFkZXIodGhpcy5zdHJtLHQuaGVhZGVyKSx0LmRpY3Rpb25hcnkpe3ZhciByO2lmKHR5cGVvZiB0LmRpY3Rpb25hcnk9PSJzdHJpbmciP3I9JHQuc3RyaW5nMmJ1Zih0LmRpY3Rpb25hcnkpOlUuY2FsbCh0LmRpY3Rpb25hcnkpPT09IltvYmplY3QgQXJyYXlCdWZmZXJdIj9yPW5ldyBVaW50OEFycmF5KHQuZGljdGlvbmFyeSk6cj10LmRpY3Rpb25hcnksbj13dC5kZWZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0sciksbiE9PVBlKXRocm93IG5ldyBFcnJvcihoYVtuXSk7dGhpcy5fZGljdF9zZXQ9ITB9fUN0LnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5zdHJtLHI9dGhpcy5vcHRpb25zLmNodW5rU2l6ZSxzLGQ7aWYodGhpcy5lbmRlZClyZXR1cm4hMTtkPXQ9PT1+fnQ/dDp0PT09ITA/SWU6aGUsdHlwZW9mIGU9PSJzdHJpbmciP24uaW5wdXQ9JHQuc3RyaW5nMmJ1ZihlKTpVLmNhbGwoZSk9PT0iW29iamVjdCBBcnJheUJ1ZmZlcl0iP24uaW5wdXQ9bmV3IFVpbnQ4QXJyYXkoZSk6bi5pbnB1dD1lLG4ubmV4dF9pbj0wLG4uYXZhaWxfaW49bi5pbnB1dC5sZW5ndGg7ZG97aWYobi5hdmFpbF9vdXQ9PT0wJiYobi5vdXRwdXQ9bmV3IGl0LkJ1Zjgociksbi5uZXh0X291dD0wLG4uYXZhaWxfb3V0PXIpLHM9d3QuZGVmbGF0ZShuLGQpLHMhPT1KZSYmcyE9PVBlKXJldHVybiB0aGlzLm9uRW5kKHMpLHRoaXMuZW5kZWQ9ITAsITE7KG4uYXZhaWxfb3V0PT09MHx8bi5hdmFpbF9pbj09PTAmJihkPT09SWV8fGQ9PT1jdCkpJiYodGhpcy5vcHRpb25zLnRvPT09InN0cmluZyI/dGhpcy5vbkRhdGEoJHQuYnVmMmJpbnN0cmluZyhpdC5zaHJpbmtCdWYobi5vdXRwdXQsbi5uZXh0X291dCkpKTp0aGlzLm9uRGF0YShpdC5zaHJpbmtCdWYobi5vdXRwdXQsbi5uZXh0X291dCkpKX13aGlsZSgobi5hdmFpbF9pbj4wfHxuLmF2YWlsX291dD09PTApJiZzIT09SmUpO3JldHVybiBkPT09SWU/KHM9d3QuZGVmbGF0ZUVuZCh0aGlzLnN0cm0pLHRoaXMub25FbmQocyksdGhpcy5lbmRlZD0hMCxzPT09UGUpOihkPT09Y3QmJih0aGlzLm9uRW5kKFBlKSxuLmF2YWlsX291dD0wKSwhMCl9LEN0LnByb3RvdHlwZS5vbkRhdGE9ZnVuY3Rpb24oZSl7dGhpcy5jaHVua3MucHVzaChlKX0sQ3QucHJvdG90eXBlLm9uRW5kPWZ1bmN0aW9uKGUpe2U9PT1QZSYmKHRoaXMub3B0aW9ucy50bz09PSJzdHJpbmciP3RoaXMucmVzdWx0PXRoaXMuY2h1bmtzLmpvaW4oIiIpOnRoaXMucmVzdWx0PWl0LmZsYXR0ZW5DaHVua3ModGhpcy5jaHVua3MpKSx0aGlzLmNodW5rcz1bXSx0aGlzLmVycj1lLHRoaXMubXNnPXRoaXMuc3RybS5tc2d9O2Z1bmN0aW9uIHB0KGUsdCl7dmFyIG49bmV3IEN0KHQpO2lmKG4ucHVzaChlLCEwKSxuLmVycil0aHJvdyBuLm1zZ3x8aGFbbi5lcnJdO3JldHVybiBuLnJlc3VsdH1mdW5jdGlvbiBQdChlLHQpe3JldHVybiB0PXR8fHt9LHQucmF3PSEwLHB0KGUsdCl9ZnVuY3Rpb24gZW4oZSx0KXtyZXR1cm4gdD10fHx7fSx0Lmd6aXA9ITAscHQoZSx0KX12YXIgbm49Q3QsV3Q9cHQsZ249UHQsV249ZW4sVm89e0RlZmxhdGU6bm4sZGVmbGF0ZTpXdCxkZWZsYXRlUmF3OmduLGd6aXA6V259LHVpPTMwLGhyPTEyLEJhPWZ1bmN0aW9uKHQsbil7dmFyIHIscyxkLGcseSx6LFAsJCxfZSxUZSxMZSxFdCxrdCxybixVdCxEbixWbixsbixfdCx2bixvbixxdCx5bixicixLdDtyPXQuc3RhdGUscz10Lm5leHRfaW4sYnI9dC5pbnB1dCxkPXMrKHQuYXZhaWxfaW4tNSksZz10Lm5leHRfb3V0LEt0PXQub3V0cHV0LHk9Zy0obi10LmF2YWlsX291dCksej1nKyh0LmF2YWlsX291dC0yNTcpLFA9ci5kbWF4LCQ9ci53c2l6ZSxfZT1yLndoYXZlLFRlPXIud25leHQsTGU9ci53aW5kb3csRXQ9ci5ob2xkLGt0PXIuYml0cyxybj1yLmxlbmNvZGUsVXQ9ci5kaXN0Y29kZSxEbj0oMTw8ci5sZW5iaXRzKS0xLFZuPSgxPDxyLmRpc3RiaXRzKS0xO2U6ZG97a3Q8MTUmJihFdCs9YnJbcysrXTw8a3Qsa3QrPTgsRXQrPWJyW3MrK108PGt0LGt0Kz04KSxsbj1ybltFdCZEbl07dDpmb3IoOzspe2lmKF90PWxuPj4+MjQsRXQ+Pj49X3Qsa3QtPV90LF90PWxuPj4+MTYmMjU1LF90PT09MClLdFtnKytdPWxuJjY1NTM1O2Vsc2UgaWYoX3QmMTYpe3ZuPWxuJjY1NTM1LF90Jj0xNSxfdCYmKGt0PF90JiYoRXQrPWJyW3MrK108PGt0LGt0Kz04KSx2bis9RXQmKDE8PF90KS0xLEV0Pj4+PV90LGt0LT1fdCksa3Q8MTUmJihFdCs9YnJbcysrXTw8a3Qsa3QrPTgsRXQrPWJyW3MrK108PGt0LGt0Kz04KSxsbj1VdFtFdCZWbl07bjpmb3IoOzspe2lmKF90PWxuPj4+MjQsRXQ+Pj49X3Qsa3QtPV90LF90PWxuPj4+MTYmMjU1LF90JjE2KXtpZihvbj1sbiY2NTUzNSxfdCY9MTUsa3Q8X3QmJihFdCs9YnJbcysrXTw8a3Qsa3QrPTgsa3Q8X3QmJihFdCs9YnJbcysrXTw8a3Qsa3QrPTgpKSxvbis9RXQmKDE8PF90KS0xLG9uPlApe3QubXNnPSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIsci5tb2RlPXVpO2JyZWFrIGV9aWYoRXQ+Pj49X3Qsa3QtPV90LF90PWcteSxvbj5fdCl7aWYoX3Q9b24tX3QsX3Q+X2UmJnIuc2FuZSl7dC5tc2c9ImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIixyLm1vZGU9dWk7YnJlYWsgZX1pZihxdD0wLHluPUxlLFRlPT09MCl7aWYocXQrPSQtX3QsX3Q8dm4pe3ZuLT1fdDtkbyBLdFtnKytdPUxlW3F0KytdO3doaWxlKC0tX3QpO3F0PWctb24seW49S3R9fWVsc2UgaWYoVGU8X3Qpe2lmKHF0Kz0kK1RlLV90LF90LT1UZSxfdDx2bil7dm4tPV90O2RvIEt0W2crK109TGVbcXQrK107d2hpbGUoLS1fdCk7aWYocXQ9MCxUZTx2bil7X3Q9VGUsdm4tPV90O2RvIEt0W2crK109TGVbcXQrK107d2hpbGUoLS1fdCk7cXQ9Zy1vbix5bj1LdH19fWVsc2UgaWYocXQrPVRlLV90LF90PHZuKXt2bi09X3Q7ZG8gS3RbZysrXT1MZVtxdCsrXTt3aGlsZSgtLV90KTtxdD1nLW9uLHluPUt0fWZvcig7dm4+MjspS3RbZysrXT15bltxdCsrXSxLdFtnKytdPXluW3F0KytdLEt0W2crK109eW5bcXQrK10sdm4tPTM7dm4mJihLdFtnKytdPXluW3F0KytdLHZuPjEmJihLdFtnKytdPXluW3F0KytdKSl9ZWxzZXtxdD1nLW9uO2RvIEt0W2crK109S3RbcXQrK10sS3RbZysrXT1LdFtxdCsrXSxLdFtnKytdPUt0W3F0KytdLHZuLT0zO3doaWxlKHZuPjIpO3ZuJiYoS3RbZysrXT1LdFtxdCsrXSx2bj4xJiYoS3RbZysrXT1LdFtxdCsrXSkpfX1lbHNlIGlmKChfdCY2NCk9PT0wKXtsbj1VdFsobG4mNjU1MzUpKyhFdCYoMTw8X3QpLTEpXTtjb250aW51ZSBufWVsc2V7dC5tc2c9ImludmFsaWQgZGlzdGFuY2UgY29kZSIsci5tb2RlPXVpO2JyZWFrIGV9YnJlYWt9fWVsc2UgaWYoKF90JjY0KT09PTApe2xuPXJuWyhsbiY2NTUzNSkrKEV0JigxPDxfdCktMSldO2NvbnRpbnVlIHR9ZWxzZSBpZihfdCYzMil7ci5tb2RlPWhyO2JyZWFrIGV9ZWxzZXt0Lm1zZz0iaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIixyLm1vZGU9dWk7YnJlYWsgZX1icmVha319d2hpbGUoczxkJiZnPHopO3ZuPWt0Pj4zLHMtPXZuLGt0LT12bjw8MyxFdCY9KDE8PGt0KS0xLHQubmV4dF9pbj1zLHQubmV4dF9vdXQ9Zyx0LmF2YWlsX2luPXM8ZD81KyhkLXMpOjUtKHMtZCksdC5hdmFpbF9vdXQ9Zzx6PzI1Nysoei1nKToyNTctKGcteiksci5ob2xkPUV0LHIuYml0cz1rdH0saj0xNSxYPTg1Mix5ZT01OTIsRGU9MCx4ZT0xLFFlPTIsc3Q9WzMsNCw1LDYsNyw4LDksMTAsMTEsMTMsMTUsMTcsMTksMjMsMjcsMzEsMzUsNDMsNTEsNTksNjcsODMsOTksMTE1LDEzMSwxNjMsMTk1LDIyNywyNTgsMCwwXSxLZT1bMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTcsMTcsMTcsMTcsMTgsMTgsMTgsMTgsMTksMTksMTksMTksMjAsMjAsMjAsMjAsMjEsMjEsMjEsMjEsMTYsNzIsNzhdLGV0PVsxLDIsMyw0LDUsNyw5LDEzLDE3LDI1LDMzLDQ5LDY1LDk3LDEyOSwxOTMsMjU3LDM4NSw1MTMsNzY5LDEwMjUsMTUzNywyMDQ5LDMwNzMsNDA5Nyw2MTQ1LDgxOTMsMTIyODksMTYzODUsMjQ1NzcsMCwwXSxqZT1bMTYsMTYsMTYsMTYsMTcsMTcsMTgsMTgsMTksMTksMjAsMjAsMjEsMjEsMjIsMjIsMjMsMjMsMjQsMjQsMjUsMjUsMjYsMjYsMjcsMjcsMjgsMjgsMjksMjksNjQsNjRdLFJ0PWZ1bmN0aW9uKHQsbixyLHMsZCxnLHkseil7dmFyIFA9ei5iaXRzLCQ9MCxfZT0wLFRlPTAsTGU9MCxFdD0wLGt0PTAscm49MCxVdD0wLERuPTAsVm49MCxsbixfdCx2bixvbixxdCx5bj1udWxsLGJyPTAsS3QsdXM9bmV3IGl0LkJ1ZjE2KGorMSkscXU9bmV3IGl0LkJ1ZjE2KGorMSksS3U9bnVsbCxrZz0wLFJnLEp1LFp1O2ZvcigkPTA7JDw9ajskKyspdXNbJF09MDtmb3IoX2U9MDtfZTxzO19lKyspdXNbbltyK19lXV0rKztmb3IoRXQ9UCxMZT1qO0xlPj0xJiZ1c1tMZV09PT0wO0xlLS0pO2lmKEV0PkxlJiYoRXQ9TGUpLExlPT09MClyZXR1cm4gZFtnKytdPTE8PDI0fDY0PDwxNnwwLGRbZysrXT0xPDwyNHw2NDw8MTZ8MCx6LmJpdHM9MSwwO2ZvcihUZT0xO1RlPExlJiZ1c1tUZV09PT0wO1RlKyspO2ZvcihFdDxUZSYmKEV0PVRlKSxVdD0xLCQ9MTskPD1qOyQrKylpZihVdDw8PTEsVXQtPXVzWyRdLFV0PDApcmV0dXJuLTE7aWYoVXQ+MCYmKHQ9PT1EZXx8TGUhPT0xKSlyZXR1cm4tMTtmb3IocXVbMV09MCwkPTE7JDxqOyQrKylxdVskKzFdPXF1WyRdK3VzWyRdO2ZvcihfZT0wO19lPHM7X2UrKyluW3IrX2VdIT09MCYmKHlbcXVbbltyK19lXV0rK109X2UpO2lmKHQ9PT1EZT8oeW49S3U9eSxLdD0xOSk6dD09PXhlPyh5bj1zdCxici09MjU3LEt1PUtlLGtnLT0yNTcsS3Q9MjU2KTooeW49ZXQsS3U9amUsS3Q9LTEpLFZuPTAsX2U9MCwkPVRlLHF0PWcsa3Q9RXQscm49MCx2bj0tMSxEbj0xPDxFdCxvbj1Ebi0xLHQ9PT14ZSYmRG4+WHx8dD09PVFlJiZEbj55ZSlyZXR1cm4gMTtmb3IoOzspe1JnPSQtcm4seVtfZV08S3Q/KEp1PTAsWnU9eVtfZV0pOnlbX2VdPkt0PyhKdT1LdVtrZyt5W19lXV0sWnU9eW5bYnIreVtfZV1dKTooSnU9MzIrNjQsWnU9MCksbG49MTw8JC1ybixfdD0xPDxrdCxUZT1fdDtkbyBfdC09bG4sZFtxdCsoVm4+PnJuKStfdF09Umc8PDI0fEp1PDwxNnxadXwwO3doaWxlKF90IT09MCk7Zm9yKGxuPTE8PCQtMTtWbiZsbjspbG4+Pj0xO2lmKGxuIT09MD8oVm4mPWxuLTEsVm4rPWxuKTpWbj0wLF9lKyssLS11c1skXT09PTApe2lmKCQ9PT1MZSlicmVhazskPW5bcit5W19lXV19aWYoJD5FdCYmKFZuJm9uKSE9PXZuKXtmb3Iocm49PT0wJiYocm49RXQpLHF0Kz1UZSxrdD0kLXJuLFV0PTE8PGt0O2t0K3JuPExlJiYoVXQtPXVzW2t0K3JuXSwhKFV0PD0wKSk7KWt0KyssVXQ8PD0xO2lmKERuKz0xPDxrdCx0PT09eGUmJkRuPlh8fHQ9PT1RZSYmRG4+eWUpcmV0dXJuIDE7dm49Vm4mb24sZFt2bl09RXQ8PDI0fGt0PDwxNnxxdC1nfDB9fXJldHVybiBWbiE9PTAmJihkW3F0K1ZuXT0kLXJuPDwyNHw2NDw8MTZ8MCksei5iaXRzPUV0LDB9LE10PUJhLHh0PVJ0LGJuPTAsJGk9MSxabj0yLFFyPTQsYW89NSxNYT02LHRhPTAsVXI9MSx1bD0yLGZpPS0yLEVvPS0zLGJzPS00LGZsPS01LGFzPTgseXM9MSxEYT0yLFdzPTMsRXM9NCxYYz01LHljPTYsUWM9NyxldT04LFRkPTksSWQ9MTAsU3U9MTEsR3M9MTIscGY9MTMsUGQ9MTQsZ2Y9MTUsTmQ9MTYsa2Q9MTcsUmQ9MTgseGQ9MTksQ3U9MjAsQXU9MjEsQmQ9MjIsTWQ9MjMsRGQ9MjQsRmQ9MjUsTGQ9MjYsdmY9MjcsVmQ9MjgsJGQ9MjksT3I9MzAsVWQ9MzEsUnY9MzIseHY9ODUyLEJ2PTU5MixNdj0xNSxEdj1NdjtmdW5jdGlvbiBIZChlKXtyZXR1cm4oZT4+PjI0JjI1NSkrKGU+Pj44JjY1MjgwKSsoKGUmNjUyODApPDw4KSsoKGUmMjU1KTw8MjQpfWZ1bmN0aW9uIEZ2KCl7dGhpcy5tb2RlPTAsdGhpcy5sYXN0PSExLHRoaXMud3JhcD0wLHRoaXMuaGF2ZWRpY3Q9ITEsdGhpcy5mbGFncz0wLHRoaXMuZG1heD0wLHRoaXMuY2hlY2s9MCx0aGlzLnRvdGFsPTAsdGhpcy5oZWFkPW51bGwsdGhpcy53Yml0cz0wLHRoaXMud3NpemU9MCx0aGlzLndoYXZlPTAsdGhpcy53bmV4dD0wLHRoaXMud2luZG93PW51bGwsdGhpcy5ob2xkPTAsdGhpcy5iaXRzPTAsdGhpcy5sZW5ndGg9MCx0aGlzLm9mZnNldD0wLHRoaXMuZXh0cmE9MCx0aGlzLmxlbmNvZGU9bnVsbCx0aGlzLmRpc3Rjb2RlPW51bGwsdGhpcy5sZW5iaXRzPTAsdGhpcy5kaXN0Yml0cz0wLHRoaXMubmNvZGU9MCx0aGlzLm5sZW49MCx0aGlzLm5kaXN0PTAsdGhpcy5oYXZlPTAsdGhpcy5uZXh0PW51bGwsdGhpcy5sZW5zPW5ldyBpdC5CdWYxNigzMjApLHRoaXMud29yaz1uZXcgaXQuQnVmMTYoMjg4KSx0aGlzLmxlbmR5bj1udWxsLHRoaXMuZGlzdGR5bj1udWxsLHRoaXMuc2FuZT0wLHRoaXMuYmFjaz0wLHRoaXMud2FzPTB9ZnVuY3Rpb24gamQoZSl7dmFyIHQ7cmV0dXJuIWV8fCFlLnN0YXRlP2ZpOih0PWUuc3RhdGUsZS50b3RhbF9pbj1lLnRvdGFsX291dD10LnRvdGFsPTAsZS5tc2c9IiIsdC53cmFwJiYoZS5hZGxlcj10LndyYXAmMSksdC5tb2RlPXlzLHQubGFzdD0wLHQuaGF2ZWRpY3Q9MCx0LmRtYXg9MzI3NjgsdC5oZWFkPW51bGwsdC5ob2xkPTAsdC5iaXRzPTAsdC5sZW5jb2RlPXQubGVuZHluPW5ldyBpdC5CdWYzMih4diksdC5kaXN0Y29kZT10LmRpc3RkeW49bmV3IGl0LkJ1ZjMyKEJ2KSx0LnNhbmU9MSx0LmJhY2s9LTEsdGEpfWZ1bmN0aW9uIHpkKGUpe3ZhciB0O3JldHVybiFlfHwhZS5zdGF0ZT9maToodD1lLnN0YXRlLHQud3NpemU9MCx0LndoYXZlPTAsdC53bmV4dD0wLGpkKGUpKX1mdW5jdGlvbiBXZChlLHQpe3ZhciBuLHI7cmV0dXJuIWV8fCFlLnN0YXRlfHwocj1lLnN0YXRlLHQ8MD8obj0wLHQ9LXQpOihuPSh0Pj40KSsxLHQ8NDgmJih0Jj0xNSkpLHQmJih0PDh8fHQ+MTUpKT9maTooci53aW5kb3chPT1udWxsJiZyLndiaXRzIT09dCYmKHIud2luZG93PW51bGwpLHIud3JhcD1uLHIud2JpdHM9dCx6ZChlKSl9ZnVuY3Rpb24gR2QoZSx0KXt2YXIgbixyO3JldHVybiBlPyhyPW5ldyBGdixlLnN0YXRlPXIsci53aW5kb3c9bnVsbCxuPVdkKGUsdCksbiE9PXRhJiYoZS5zdGF0ZT1udWxsKSxuKTpmaX1mdW5jdGlvbiBMdihlKXtyZXR1cm4gR2QoZSxEdil9dmFyIFlkPSEwLG1mLF9mO2Z1bmN0aW9uIFZ2KGUpe2lmKFlkKXt2YXIgdDtmb3IobWY9bmV3IGl0LkJ1ZjMyKDUxMiksX2Y9bmV3IGl0LkJ1ZjMyKDMyKSx0PTA7dDwxNDQ7KWUubGVuc1t0KytdPTg7Zm9yKDt0PDI1NjspZS5sZW5zW3QrK109OTtmb3IoO3Q8MjgwOyllLmxlbnNbdCsrXT03O2Zvcig7dDwyODg7KWUubGVuc1t0KytdPTg7Zm9yKHh0KCRpLGUubGVucywwLDI4OCxtZiwwLGUud29yayx7Yml0czo5fSksdD0wO3Q8MzI7KWUubGVuc1t0KytdPTU7eHQoWm4sZS5sZW5zLDAsMzIsX2YsMCxlLndvcmsse2JpdHM6NX0pLFlkPSExfWUubGVuY29kZT1tZixlLmxlbmJpdHM9OSxlLmRpc3Rjb2RlPV9mLGUuZGlzdGJpdHM9NX1mdW5jdGlvbiBxZChlLHQsbixyKXt2YXIgcyxkPWUuc3RhdGU7cmV0dXJuIGQud2luZG93PT09bnVsbCYmKGQud3NpemU9MTw8ZC53Yml0cyxkLnduZXh0PTAsZC53aGF2ZT0wLGQud2luZG93PW5ldyBpdC5CdWY4KGQud3NpemUpKSxyPj1kLndzaXplPyhpdC5hcnJheVNldChkLndpbmRvdyx0LG4tZC53c2l6ZSxkLndzaXplLDApLGQud25leHQ9MCxkLndoYXZlPWQud3NpemUpOihzPWQud3NpemUtZC53bmV4dCxzPnImJihzPXIpLGl0LmFycmF5U2V0KGQud2luZG93LHQsbi1yLHMsZC53bmV4dCksci09cyxyPyhpdC5hcnJheVNldChkLndpbmRvdyx0LG4tcixyLDApLGQud25leHQ9cixkLndoYXZlPWQud3NpemUpOihkLnduZXh0Kz1zLGQud25leHQ9PT1kLndzaXplJiYoZC53bmV4dD0wKSxkLndoYXZlPGQud3NpemUmJihkLndoYXZlKz1zKSkpLDB9ZnVuY3Rpb24gJHYoZSx0KXt2YXIgbixyLHMsZCxnLHkseixQLCQsX2UsVGUsTGUsRXQsa3Qscm49MCxVdCxEbixWbixsbixfdCx2bixvbixxdCx5bj1uZXcgaXQuQnVmOCg0KSxicixLdCx1cz1bMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV07aWYoIWV8fCFlLnN0YXRlfHwhZS5vdXRwdXR8fCFlLmlucHV0JiZlLmF2YWlsX2luIT09MClyZXR1cm4gZmk7bj1lLnN0YXRlLG4ubW9kZT09PUdzJiYobi5tb2RlPXBmKSxnPWUubmV4dF9vdXQscz1lLm91dHB1dCx6PWUuYXZhaWxfb3V0LGQ9ZS5uZXh0X2luLHI9ZS5pbnB1dCx5PWUuYXZhaWxfaW4sUD1uLmhvbGQsJD1uLmJpdHMsX2U9eSxUZT16LHF0PXRhO2U6Zm9yKDs7KXN3aXRjaChuLm1vZGUpe2Nhc2UgeXM6aWYobi53cmFwPT09MCl7bi5tb2RlPXBmO2JyZWFrfWZvcig7JDwxNjspe2lmKHk9PT0wKWJyZWFrIGU7eS0tLFArPXJbZCsrXTw8JCwkKz04fWlmKG4ud3JhcCYyJiZQPT09MzU2MTUpe24uY2hlY2s9MCx5blswXT1QJjI1NSx5blsxXT1QPj4+OCYyNTUsbi5jaGVjaz1kcihuLmNoZWNrLHluLDIsMCksUD0wLCQ9MCxuLm1vZGU9RGE7YnJlYWt9aWYobi5mbGFncz0wLG4uaGVhZCYmKG4uaGVhZC5kb25lPSExKSwhKG4ud3JhcCYxKXx8KCgoUCYyNTUpPDw4KSsoUD4+OCkpJTMxKXtlLm1zZz0iaW5jb3JyZWN0IGhlYWRlciBjaGVjayIsbi5tb2RlPU9yO2JyZWFrfWlmKChQJjE1KSE9PWFzKXtlLm1zZz0idW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QiLG4ubW9kZT1PcjticmVha31pZihQPj4+PTQsJC09NCxvbj0oUCYxNSkrOCxuLndiaXRzPT09MCluLndiaXRzPW9uO2Vsc2UgaWYob24+bi53Yml0cyl7ZS5tc2c9ImludmFsaWQgd2luZG93IHNpemUiLG4ubW9kZT1PcjticmVha31uLmRtYXg9MTw8b24sZS5hZGxlcj1uLmNoZWNrPTEsbi5tb2RlPVAmNTEyP0lkOkdzLFA9MCwkPTA7YnJlYWs7Y2FzZSBEYTpmb3IoOyQ8MTY7KXtpZih5PT09MClicmVhayBlO3ktLSxQKz1yW2QrK108PCQsJCs9OH1pZihuLmZsYWdzPVAsKG4uZmxhZ3MmMjU1KSE9PWFzKXtlLm1zZz0idW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QiLG4ubW9kZT1PcjticmVha31pZihuLmZsYWdzJjU3MzQ0KXtlLm1zZz0idW5rbm93biBoZWFkZXIgZmxhZ3Mgc2V0IixuLm1vZGU9T3I7YnJlYWt9bi5oZWFkJiYobi5oZWFkLnRleHQ9UD4+OCYxKSxuLmZsYWdzJjUxMiYmKHluWzBdPVAmMjU1LHluWzFdPVA+Pj44JjI1NSxuLmNoZWNrPWRyKG4uY2hlY2sseW4sMiwwKSksUD0wLCQ9MCxuLm1vZGU9V3M7Y2FzZSBXczpmb3IoOyQ8MzI7KXtpZih5PT09MClicmVhayBlO3ktLSxQKz1yW2QrK108PCQsJCs9OH1uLmhlYWQmJihuLmhlYWQudGltZT1QKSxuLmZsYWdzJjUxMiYmKHluWzBdPVAmMjU1LHluWzFdPVA+Pj44JjI1NSx5blsyXT1QPj4+MTYmMjU1LHluWzNdPVA+Pj4yNCYyNTUsbi5jaGVjaz1kcihuLmNoZWNrLHluLDQsMCkpLFA9MCwkPTAsbi5tb2RlPUVzO2Nhc2UgRXM6Zm9yKDskPDE2Oyl7aWYoeT09PTApYnJlYWsgZTt5LS0sUCs9cltkKytdPDwkLCQrPTh9bi5oZWFkJiYobi5oZWFkLnhmbGFncz1QJjI1NSxuLmhlYWQub3M9UD4+OCksbi5mbGFncyY1MTImJih5blswXT1QJjI1NSx5blsxXT1QPj4+OCYyNTUsbi5jaGVjaz1kcihuLmNoZWNrLHluLDIsMCkpLFA9MCwkPTAsbi5tb2RlPVhjO2Nhc2UgWGM6aWYobi5mbGFncyYxMDI0KXtmb3IoOyQ8MTY7KXtpZih5PT09MClicmVhayBlO3ktLSxQKz1yW2QrK108PCQsJCs9OH1uLmxlbmd0aD1QLG4uaGVhZCYmKG4uaGVhZC5leHRyYV9sZW49UCksbi5mbGFncyY1MTImJih5blswXT1QJjI1NSx5blsxXT1QPj4+OCYyNTUsbi5jaGVjaz1kcihuLmNoZWNrLHluLDIsMCkpLFA9MCwkPTB9ZWxzZSBuLmhlYWQmJihuLmhlYWQuZXh0cmE9bnVsbCk7bi5tb2RlPXljO2Nhc2UgeWM6aWYobi5mbGFncyYxMDI0JiYoTGU9bi5sZW5ndGgsTGU+eSYmKExlPXkpLExlJiYobi5oZWFkJiYob249bi5oZWFkLmV4dHJhX2xlbi1uLmxlbmd0aCxuLmhlYWQuZXh0cmF8fChuLmhlYWQuZXh0cmE9bmV3IEFycmF5KG4uaGVhZC5leHRyYV9sZW4pKSxpdC5hcnJheVNldChuLmhlYWQuZXh0cmEscixkLExlLG9uKSksbi5mbGFncyY1MTImJihuLmNoZWNrPWRyKG4uY2hlY2sscixMZSxkKSkseS09TGUsZCs9TGUsbi5sZW5ndGgtPUxlKSxuLmxlbmd0aCkpYnJlYWsgZTtuLmxlbmd0aD0wLG4ubW9kZT1RYztjYXNlIFFjOmlmKG4uZmxhZ3MmMjA0OCl7aWYoeT09PTApYnJlYWsgZTtMZT0wO2RvIG9uPXJbZCtMZSsrXSxuLmhlYWQmJm9uJiZuLmxlbmd0aDw2NTUzNiYmKG4uaGVhZC5uYW1lKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG9uKSk7d2hpbGUob24mJkxlPHkpO2lmKG4uZmxhZ3MmNTEyJiYobi5jaGVjaz1kcihuLmNoZWNrLHIsTGUsZCkpLHktPUxlLGQrPUxlLG9uKWJyZWFrIGV9ZWxzZSBuLmhlYWQmJihuLmhlYWQubmFtZT1udWxsKTtuLmxlbmd0aD0wLG4ubW9kZT1ldTtjYXNlIGV1OmlmKG4uZmxhZ3MmNDA5Nil7aWYoeT09PTApYnJlYWsgZTtMZT0wO2RvIG9uPXJbZCtMZSsrXSxuLmhlYWQmJm9uJiZuLmxlbmd0aDw2NTUzNiYmKG4uaGVhZC5jb21tZW50Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKG9uKSk7d2hpbGUob24mJkxlPHkpO2lmKG4uZmxhZ3MmNTEyJiYobi5jaGVjaz1kcihuLmNoZWNrLHIsTGUsZCkpLHktPUxlLGQrPUxlLG9uKWJyZWFrIGV9ZWxzZSBuLmhlYWQmJihuLmhlYWQuY29tbWVudD1udWxsKTtuLm1vZGU9VGQ7Y2FzZSBUZDppZihuLmZsYWdzJjUxMil7Zm9yKDskPDE2Oyl7aWYoeT09PTApYnJlYWsgZTt5LS0sUCs9cltkKytdPDwkLCQrPTh9aWYoUCE9PShuLmNoZWNrJjY1NTM1KSl7ZS5tc2c9ImhlYWRlciBjcmMgbWlzbWF0Y2giLG4ubW9kZT1PcjticmVha31QPTAsJD0wfW4uaGVhZCYmKG4uaGVhZC5oY3JjPW4uZmxhZ3M+PjkmMSxuLmhlYWQuZG9uZT0hMCksZS5hZGxlcj1uLmNoZWNrPTAsbi5tb2RlPUdzO2JyZWFrO2Nhc2UgSWQ6Zm9yKDskPDMyOyl7aWYoeT09PTApYnJlYWsgZTt5LS0sUCs9cltkKytdPDwkLCQrPTh9ZS5hZGxlcj1uLmNoZWNrPUhkKFApLFA9MCwkPTAsbi5tb2RlPVN1O2Nhc2UgU3U6aWYobi5oYXZlZGljdD09PTApcmV0dXJuIGUubmV4dF9vdXQ9ZyxlLmF2YWlsX291dD16LGUubmV4dF9pbj1kLGUuYXZhaWxfaW49eSxuLmhvbGQ9UCxuLmJpdHM9JCx1bDtlLmFkbGVyPW4uY2hlY2s9MSxuLm1vZGU9R3M7Y2FzZSBHczppZih0PT09YW98fHQ9PT1NYSlicmVhayBlO2Nhc2UgcGY6aWYobi5sYXN0KXtQPj4+PSQmNywkLT0kJjcsbi5tb2RlPXZmO2JyZWFrfWZvcig7JDwzOyl7aWYoeT09PTApYnJlYWsgZTt5LS0sUCs9cltkKytdPDwkLCQrPTh9c3dpdGNoKG4ubGFzdD1QJjEsUD4+Pj0xLCQtPTEsUCYzKXtjYXNlIDA6bi5tb2RlPVBkO2JyZWFrO2Nhc2UgMTppZihWdihuKSxuLm1vZGU9Q3UsdD09PU1hKXtQPj4+PTIsJC09MjticmVhayBlfWJyZWFrO2Nhc2UgMjpuLm1vZGU9a2Q7YnJlYWs7Y2FzZSAzOmUubXNnPSJpbnZhbGlkIGJsb2NrIHR5cGUiLG4ubW9kZT1Pcn1QPj4+PTIsJC09MjticmVhaztjYXNlIFBkOmZvcihQPj4+PSQmNywkLT0kJjc7JDwzMjspe2lmKHk9PT0wKWJyZWFrIGU7eS0tLFArPXJbZCsrXTw8JCwkKz04fWlmKChQJjY1NTM1KSE9PShQPj4+MTZeNjU1MzUpKXtlLm1zZz0iaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3RocyIsbi5tb2RlPU9yO2JyZWFrfWlmKG4ubGVuZ3RoPVAmNjU1MzUsUD0wLCQ9MCxuLm1vZGU9Z2YsdD09PU1hKWJyZWFrIGU7Y2FzZSBnZjpuLm1vZGU9TmQ7Y2FzZSBOZDppZihMZT1uLmxlbmd0aCxMZSl7aWYoTGU+eSYmKExlPXkpLExlPnomJihMZT16KSxMZT09PTApYnJlYWsgZTtpdC5hcnJheVNldChzLHIsZCxMZSxnKSx5LT1MZSxkKz1MZSx6LT1MZSxnKz1MZSxuLmxlbmd0aC09TGU7YnJlYWt9bi5tb2RlPUdzO2JyZWFrO2Nhc2Uga2Q6Zm9yKDskPDE0Oyl7aWYoeT09PTApYnJlYWsgZTt5LS0sUCs9cltkKytdPDwkLCQrPTh9aWYobi5ubGVuPShQJjMxKSsyNTcsUD4+Pj01LCQtPTUsbi5uZGlzdD0oUCYzMSkrMSxQPj4+PTUsJC09NSxuLm5jb2RlPShQJjE1KSs0LFA+Pj49NCwkLT00LG4ubmxlbj4yODZ8fG4ubmRpc3Q+MzApe2UubXNnPSJ0b28gbWFueSBsZW5ndGggb3IgZGlzdGFuY2Ugc3ltYm9scyIsbi5tb2RlPU9yO2JyZWFrfW4uaGF2ZT0wLG4ubW9kZT1SZDtjYXNlIFJkOmZvcig7bi5oYXZlPG4ubmNvZGU7KXtmb3IoOyQ8Mzspe2lmKHk9PT0wKWJyZWFrIGU7eS0tLFArPXJbZCsrXTw8JCwkKz04fW4ubGVuc1t1c1tuLmhhdmUrK11dPVAmNyxQPj4+PTMsJC09M31mb3IoO24uaGF2ZTwxOTspbi5sZW5zW3VzW24uaGF2ZSsrXV09MDtpZihuLmxlbmNvZGU9bi5sZW5keW4sbi5sZW5iaXRzPTcsYnI9e2JpdHM6bi5sZW5iaXRzfSxxdD14dChibixuLmxlbnMsMCwxOSxuLmxlbmNvZGUsMCxuLndvcmssYnIpLG4ubGVuYml0cz1ici5iaXRzLHF0KXtlLm1zZz0iaW52YWxpZCBjb2RlIGxlbmd0aHMgc2V0IixuLm1vZGU9T3I7YnJlYWt9bi5oYXZlPTAsbi5tb2RlPXhkO2Nhc2UgeGQ6Zm9yKDtuLmhhdmU8bi5ubGVuK24ubmRpc3Q7KXtmb3IoO3JuPW4ubGVuY29kZVtQJigxPDxuLmxlbmJpdHMpLTFdLFV0PXJuPj4+MjQsRG49cm4+Pj4xNiYyNTUsVm49cm4mNjU1MzUsIShVdDw9JCk7KXtpZih5PT09MClicmVhayBlO3ktLSxQKz1yW2QrK108PCQsJCs9OH1pZihWbjwxNilQPj4+PVV0LCQtPVV0LG4ubGVuc1tuLmhhdmUrK109Vm47ZWxzZXtpZihWbj09PTE2KXtmb3IoS3Q9VXQrMjskPEt0Oyl7aWYoeT09PTApYnJlYWsgZTt5LS0sUCs9cltkKytdPDwkLCQrPTh9aWYoUD4+Pj1VdCwkLT1VdCxuLmhhdmU9PT0wKXtlLm1zZz0iaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCIsbi5tb2RlPU9yO2JyZWFrfW9uPW4ubGVuc1tuLmhhdmUtMV0sTGU9MysoUCYzKSxQPj4+PTIsJC09Mn1lbHNlIGlmKFZuPT09MTcpe2ZvcihLdD1VdCszOyQ8S3Q7KXtpZih5PT09MClicmVhayBlO3ktLSxQKz1yW2QrK108PCQsJCs9OH1QPj4+PVV0LCQtPVV0LG9uPTAsTGU9MysoUCY3KSxQPj4+PTMsJC09M31lbHNle2ZvcihLdD1VdCs3OyQ8S3Q7KXtpZih5PT09MClicmVhayBlO3ktLSxQKz1yW2QrK108PCQsJCs9OH1QPj4+PVV0LCQtPVV0LG9uPTAsTGU9MTErKFAmMTI3KSxQPj4+PTcsJC09N31pZihuLmhhdmUrTGU+bi5ubGVuK24ubmRpc3Qpe2UubXNnPSJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0IixuLm1vZGU9T3I7YnJlYWt9Zm9yKDtMZS0tOyluLmxlbnNbbi5oYXZlKytdPW9ufX1pZihuLm1vZGU9PT1PcilicmVhaztpZihuLmxlbnNbMjU2XT09PTApe2UubXNnPSJpbnZhbGlkIGNvZGUgLS0gbWlzc2luZyBlbmQtb2YtYmxvY2siLG4ubW9kZT1PcjticmVha31pZihuLmxlbmJpdHM9OSxicj17Yml0czpuLmxlbmJpdHN9LHF0PXh0KCRpLG4ubGVucywwLG4ubmxlbixuLmxlbmNvZGUsMCxuLndvcmssYnIpLG4ubGVuYml0cz1ici5iaXRzLHF0KXtlLm1zZz0iaW52YWxpZCBsaXRlcmFsL2xlbmd0aHMgc2V0IixuLm1vZGU9T3I7YnJlYWt9aWYobi5kaXN0Yml0cz02LG4uZGlzdGNvZGU9bi5kaXN0ZHluLGJyPXtiaXRzOm4uZGlzdGJpdHN9LHF0PXh0KFpuLG4ubGVucyxuLm5sZW4sbi5uZGlzdCxuLmRpc3Rjb2RlLDAsbi53b3JrLGJyKSxuLmRpc3RiaXRzPWJyLmJpdHMscXQpe2UubXNnPSJpbnZhbGlkIGRpc3RhbmNlcyBzZXQiLG4ubW9kZT1PcjticmVha31pZihuLm1vZGU9Q3UsdD09PU1hKWJyZWFrIGU7Y2FzZSBDdTpuLm1vZGU9QXU7Y2FzZSBBdTppZih5Pj02JiZ6Pj0yNTgpe2UubmV4dF9vdXQ9ZyxlLmF2YWlsX291dD16LGUubmV4dF9pbj1kLGUuYXZhaWxfaW49eSxuLmhvbGQ9UCxuLmJpdHM9JCxNdChlLFRlKSxnPWUubmV4dF9vdXQscz1lLm91dHB1dCx6PWUuYXZhaWxfb3V0LGQ9ZS5uZXh0X2luLHI9ZS5pbnB1dCx5PWUuYXZhaWxfaW4sUD1uLmhvbGQsJD1uLmJpdHMsbi5tb2RlPT09R3MmJihuLmJhY2s9LTEpO2JyZWFrfWZvcihuLmJhY2s9MDtybj1uLmxlbmNvZGVbUCYoMTw8bi5sZW5iaXRzKS0xXSxVdD1ybj4+PjI0LERuPXJuPj4+MTYmMjU1LFZuPXJuJjY1NTM1LCEoVXQ8PSQpOyl7aWYoeT09PTApYnJlYWsgZTt5LS0sUCs9cltkKytdPDwkLCQrPTh9aWYoRG4mJihEbiYyNDApPT09MCl7Zm9yKGxuPVV0LF90PURuLHZuPVZuO3JuPW4ubGVuY29kZVt2bisoKFAmKDE8PGxuK190KS0xKT4+bG4pXSxVdD1ybj4+PjI0LERuPXJuPj4+MTYmMjU1LFZuPXJuJjY1NTM1LCEobG4rVXQ8PSQpOyl7aWYoeT09PTApYnJlYWsgZTt5LS0sUCs9cltkKytdPDwkLCQrPTh9UD4+Pj1sbiwkLT1sbixuLmJhY2srPWxufWlmKFA+Pj49VXQsJC09VXQsbi5iYWNrKz1VdCxuLmxlbmd0aD1WbixEbj09PTApe24ubW9kZT1MZDticmVha31pZihEbiYzMil7bi5iYWNrPS0xLG4ubW9kZT1HczticmVha31pZihEbiY2NCl7ZS5tc2c9ImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSIsbi5tb2RlPU9yO2JyZWFrfW4uZXh0cmE9RG4mMTUsbi5tb2RlPUJkO2Nhc2UgQmQ6aWYobi5leHRyYSl7Zm9yKEt0PW4uZXh0cmE7JDxLdDspe2lmKHk9PT0wKWJyZWFrIGU7eS0tLFArPXJbZCsrXTw8JCwkKz04fW4ubGVuZ3RoKz1QJigxPDxuLmV4dHJhKS0xLFA+Pj49bi5leHRyYSwkLT1uLmV4dHJhLG4uYmFjays9bi5leHRyYX1uLndhcz1uLmxlbmd0aCxuLm1vZGU9TWQ7Y2FzZSBNZDpmb3IoO3JuPW4uZGlzdGNvZGVbUCYoMTw8bi5kaXN0Yml0cyktMV0sVXQ9cm4+Pj4yNCxEbj1ybj4+PjE2JjI1NSxWbj1ybiY2NTUzNSwhKFV0PD0kKTspe2lmKHk9PT0wKWJyZWFrIGU7eS0tLFArPXJbZCsrXTw8JCwkKz04fWlmKChEbiYyNDApPT09MCl7Zm9yKGxuPVV0LF90PURuLHZuPVZuO3JuPW4uZGlzdGNvZGVbdm4rKChQJigxPDxsbitfdCktMSk+PmxuKV0sVXQ9cm4+Pj4yNCxEbj1ybj4+PjE2JjI1NSxWbj1ybiY2NTUzNSwhKGxuK1V0PD0kKTspe2lmKHk9PT0wKWJyZWFrIGU7eS0tLFArPXJbZCsrXTw8JCwkKz04fVA+Pj49bG4sJC09bG4sbi5iYWNrKz1sbn1pZihQPj4+PVV0LCQtPVV0LG4uYmFjays9VXQsRG4mNjQpe2UubXNnPSJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiLG4ubW9kZT1PcjticmVha31uLm9mZnNldD1WbixuLmV4dHJhPURuJjE1LG4ubW9kZT1EZDtjYXNlIERkOmlmKG4uZXh0cmEpe2ZvcihLdD1uLmV4dHJhOyQ8S3Q7KXtpZih5PT09MClicmVhayBlO3ktLSxQKz1yW2QrK108PCQsJCs9OH1uLm9mZnNldCs9UCYoMTw8bi5leHRyYSktMSxQPj4+PW4uZXh0cmEsJC09bi5leHRyYSxuLmJhY2srPW4uZXh0cmF9aWYobi5vZmZzZXQ+bi5kbWF4KXtlLm1zZz0iaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siLG4ubW9kZT1PcjticmVha31uLm1vZGU9RmQ7Y2FzZSBGZDppZih6PT09MClicmVhayBlO2lmKExlPVRlLXosbi5vZmZzZXQ+TGUpe2lmKExlPW4ub2Zmc2V0LUxlLExlPm4ud2hhdmUmJm4uc2FuZSl7ZS5tc2c9ImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIixuLm1vZGU9T3I7YnJlYWt9TGU+bi53bmV4dD8oTGUtPW4ud25leHQsRXQ9bi53c2l6ZS1MZSk6RXQ9bi53bmV4dC1MZSxMZT5uLmxlbmd0aCYmKExlPW4ubGVuZ3RoKSxrdD1uLndpbmRvd31lbHNlIGt0PXMsRXQ9Zy1uLm9mZnNldCxMZT1uLmxlbmd0aDtMZT56JiYoTGU9eiksei09TGUsbi5sZW5ndGgtPUxlO2RvIHNbZysrXT1rdFtFdCsrXTt3aGlsZSgtLUxlKTtuLmxlbmd0aD09PTAmJihuLm1vZGU9QXUpO2JyZWFrO2Nhc2UgTGQ6aWYoej09PTApYnJlYWsgZTtzW2crK109bi5sZW5ndGgsei0tLG4ubW9kZT1BdTticmVhaztjYXNlIHZmOmlmKG4ud3JhcCl7Zm9yKDskPDMyOyl7aWYoeT09PTApYnJlYWsgZTt5LS0sUHw9cltkKytdPDwkLCQrPTh9aWYoVGUtPXosZS50b3RhbF9vdXQrPVRlLG4udG90YWwrPVRlLFRlJiYoZS5hZGxlcj1uLmNoZWNrPW4uZmxhZ3M/ZHIobi5jaGVjayxzLFRlLGctVGUpOkhzKG4uY2hlY2sscyxUZSxnLVRlKSksVGU9eiwobi5mbGFncz9QOkhkKFApKSE9PW4uY2hlY2spe2UubXNnPSJpbmNvcnJlY3QgZGF0YSBjaGVjayIsbi5tb2RlPU9yO2JyZWFrfVA9MCwkPTB9bi5tb2RlPVZkO2Nhc2UgVmQ6aWYobi53cmFwJiZuLmZsYWdzKXtmb3IoOyQ8MzI7KXtpZih5PT09MClicmVhayBlO3ktLSxQKz1yW2QrK108PCQsJCs9OH1pZihQIT09KG4udG90YWwmNDI5NDk2NzI5NSkpe2UubXNnPSJpbmNvcnJlY3QgbGVuZ3RoIGNoZWNrIixuLm1vZGU9T3I7YnJlYWt9UD0wLCQ9MH1uLm1vZGU9JGQ7Y2FzZSAkZDpxdD1VcjticmVhayBlO2Nhc2UgT3I6cXQ9RW87YnJlYWsgZTtjYXNlIFVkOnJldHVybiBicztjYXNlIFJ2OmRlZmF1bHQ6cmV0dXJuIGZpfXJldHVybiBlLm5leHRfb3V0PWcsZS5hdmFpbF9vdXQ9eixlLm5leHRfaW49ZCxlLmF2YWlsX2luPXksbi5ob2xkPVAsbi5iaXRzPSQsKG4ud3NpemV8fFRlIT09ZS5hdmFpbF9vdXQmJm4ubW9kZTxPciYmKG4ubW9kZTx2Znx8dCE9PVFyKSkmJnFkKGUsZS5vdXRwdXQsZS5uZXh0X291dCxUZS1lLmF2YWlsX291dCksX2UtPWUuYXZhaWxfaW4sVGUtPWUuYXZhaWxfb3V0LGUudG90YWxfaW4rPV9lLGUudG90YWxfb3V0Kz1UZSxuLnRvdGFsKz1UZSxuLndyYXAmJlRlJiYoZS5hZGxlcj1uLmNoZWNrPW4uZmxhZ3M/ZHIobi5jaGVjayxzLFRlLGUubmV4dF9vdXQtVGUpOkhzKG4uY2hlY2sscyxUZSxlLm5leHRfb3V0LVRlKSksZS5kYXRhX3R5cGU9bi5iaXRzKyhuLmxhc3Q/NjQ6MCkrKG4ubW9kZT09PUdzPzEyODowKSsobi5tb2RlPT09Q3V8fG4ubW9kZT09PWdmPzI1NjowKSwoX2U9PT0wJiZUZT09PTB8fHQ9PT1RcikmJnF0PT09dGEmJihxdD1mbCkscXR9ZnVuY3Rpb24gVXYoZSl7aWYoIWV8fCFlLnN0YXRlKXJldHVybiBmaTt2YXIgdD1lLnN0YXRlO3JldHVybiB0LndpbmRvdyYmKHQud2luZG93PW51bGwpLGUuc3RhdGU9bnVsbCx0YX1mdW5jdGlvbiBIdihlLHQpe3ZhciBuO3JldHVybiFlfHwhZS5zdGF0ZXx8KG49ZS5zdGF0ZSwobi53cmFwJjIpPT09MCk/Zmk6KG4uaGVhZD10LHQuZG9uZT0hMSx0YSl9ZnVuY3Rpb24ganYoZSx0KXt2YXIgbj10Lmxlbmd0aCxyLHMsZDtyZXR1cm4hZXx8IWUuc3RhdGV8fChyPWUuc3RhdGUsci53cmFwIT09MCYmci5tb2RlIT09U3UpP2ZpOnIubW9kZT09PVN1JiYocz0xLHM9SHMocyx0LG4sMCkscyE9PXIuY2hlY2spP0VvOihkPXFkKGUsdCxuLG4pLGQ/KHIubW9kZT1VZCxicyk6KHIuaGF2ZWRpY3Q9MSx0YSkpfXZhciB6dj16ZCxXdj1XZCxHdj1qZCxZdj1Mdixxdj1HZCxLdj0kdixKdj1Vdixadj1IdixYdj1qdixRdj0icGFrbyBpbmZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSIsZW09e2luZmxhdGVSZXNldDp6dixpbmZsYXRlUmVzZXQyOld2LGluZmxhdGVSZXNldEtlZXA6R3YsaW5mbGF0ZUluaXQ6WXYsaW5mbGF0ZUluaXQyOnF2LGluZmxhdGU6S3YsaW5mbGF0ZUVuZDpKdixpbmZsYXRlR2V0SGVhZGVyOlp2LGluZmxhdGVTZXREaWN0aW9uYXJ5Olh2LGluZmxhdGVJbmZvOlF2fSx0bT17Wl9OT19GTFVTSDowLFpfUEFSVElBTF9GTFVTSDoxLFpfU1lOQ19GTFVTSDoyLFpfRlVMTF9GTFVTSDozLFpfRklOSVNIOjQsWl9CTE9DSzo1LFpfVFJFRVM6NixaX09LOjAsWl9TVFJFQU1fRU5EOjEsWl9ORUVEX0RJQ1Q6MixaX0VSUk5POi0xLFpfU1RSRUFNX0VSUk9SOi0yLFpfREFUQV9FUlJPUjotMyxaX0JVRl9FUlJPUjotNSxaX05PX0NPTVBSRVNTSU9OOjAsWl9CRVNUX1NQRUVEOjEsWl9CRVNUX0NPTVBSRVNTSU9OOjksWl9ERUZBVUxUX0NPTVBSRVNTSU9OOi0xLFpfRklMVEVSRUQ6MSxaX0hVRkZNQU5fT05MWToyLFpfUkxFOjMsWl9GSVhFRDo0LFpfREVGQVVMVF9TVFJBVEVHWTowLFpfQklOQVJZOjAsWl9URVhUOjEsWl9VTktOT1dOOjIsWl9ERUZMQVRFRDo4fTtmdW5jdGlvbiBubSgpe3RoaXMudGV4dD0wLHRoaXMudGltZT0wLHRoaXMueGZsYWdzPTAsdGhpcy5vcz0wLHRoaXMuZXh0cmE9bnVsbCx0aGlzLmV4dHJhX2xlbj0wLHRoaXMubmFtZT0iIix0aGlzLmNvbW1lbnQ9IiIsdGhpcy5oY3JjPTAsdGhpcy5kb25lPSExfXZhciBybT1ubSxFYz1lbSxIcj10bSxpbT1ybSxLZD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO2Z1bmN0aW9uIFVsKGUpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFVsKSlyZXR1cm4gbmV3IFVsKGUpO3RoaXMub3B0aW9ucz1pdC5hc3NpZ24oe2NodW5rU2l6ZToxNjM4NCx3aW5kb3dCaXRzOjAsdG86IiJ9LGV8fHt9KTt2YXIgdD10aGlzLm9wdGlvbnM7dC5yYXcmJnQud2luZG93Qml0cz49MCYmdC53aW5kb3dCaXRzPDE2JiYodC53aW5kb3dCaXRzPS10LndpbmRvd0JpdHMsdC53aW5kb3dCaXRzPT09MCYmKHQud2luZG93Qml0cz0tMTUpKSx0LndpbmRvd0JpdHM+PTAmJnQud2luZG93Qml0czwxNiYmIShlJiZlLndpbmRvd0JpdHMpJiYodC53aW5kb3dCaXRzKz0zMiksdC53aW5kb3dCaXRzPjE1JiZ0LndpbmRvd0JpdHM8NDgmJih0LndpbmRvd0JpdHMmMTUpPT09MCYmKHQud2luZG93Qml0c3w9MTUpLHRoaXMuZXJyPTAsdGhpcy5tc2c9IiIsdGhpcy5lbmRlZD0hMSx0aGlzLmNodW5rcz1bXSx0aGlzLnN0cm09bmV3IHgsdGhpcy5zdHJtLmF2YWlsX291dD0wO3ZhciBuPUVjLmluZmxhdGVJbml0Mih0aGlzLnN0cm0sdC53aW5kb3dCaXRzKTtpZihuIT09SHIuWl9PSyl0aHJvdyBuZXcgRXJyb3IoaGFbbl0pO2lmKHRoaXMuaGVhZGVyPW5ldyBpbSxFYy5pbmZsYXRlR2V0SGVhZGVyKHRoaXMuc3RybSx0aGlzLmhlYWRlciksdC5kaWN0aW9uYXJ5JiYodHlwZW9mIHQuZGljdGlvbmFyeT09InN0cmluZyI/dC5kaWN0aW9uYXJ5PSR0LnN0cmluZzJidWYodC5kaWN0aW9uYXJ5KTpLZC5jYWxsKHQuZGljdGlvbmFyeSk9PT0iW29iamVjdCBBcnJheUJ1ZmZlcl0iJiYodC5kaWN0aW9uYXJ5PW5ldyBVaW50OEFycmF5KHQuZGljdGlvbmFyeSkpLHQucmF3JiYobj1FYy5pbmZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0sdC5kaWN0aW9uYXJ5KSxuIT09SHIuWl9PSykpKXRocm93IG5ldyBFcnJvcihoYVtuXSl9VWwucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLnN0cm0scj10aGlzLm9wdGlvbnMuY2h1bmtTaXplLHM9dGhpcy5vcHRpb25zLmRpY3Rpb25hcnksZCxnLHkseixQLCQ9ITE7aWYodGhpcy5lbmRlZClyZXR1cm4hMTtnPXQ9PT1+fnQ/dDp0PT09ITA/SHIuWl9GSU5JU0g6SHIuWl9OT19GTFVTSCx0eXBlb2YgZT09InN0cmluZyI/bi5pbnB1dD0kdC5iaW5zdHJpbmcyYnVmKGUpOktkLmNhbGwoZSk9PT0iW29iamVjdCBBcnJheUJ1ZmZlcl0iP24uaW5wdXQ9bmV3IFVpbnQ4QXJyYXkoZSk6bi5pbnB1dD1lLG4ubmV4dF9pbj0wLG4uYXZhaWxfaW49bi5pbnB1dC5sZW5ndGg7ZG97aWYobi5hdmFpbF9vdXQ9PT0wJiYobi5vdXRwdXQ9bmV3IGl0LkJ1Zjgociksbi5uZXh0X291dD0wLG4uYXZhaWxfb3V0PXIpLGQ9RWMuaW5mbGF0ZShuLEhyLlpfTk9fRkxVU0gpLGQ9PT1Ici5aX05FRURfRElDVCYmcyYmKGQ9RWMuaW5mbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLHMpKSxkPT09SHIuWl9CVUZfRVJST1ImJiQ9PT0hMCYmKGQ9SHIuWl9PSywkPSExKSxkIT09SHIuWl9TVFJFQU1fRU5EJiZkIT09SHIuWl9PSylyZXR1cm4gdGhpcy5vbkVuZChkKSx0aGlzLmVuZGVkPSEwLCExO24ubmV4dF9vdXQmJihuLmF2YWlsX291dD09PTB8fGQ9PT1Ici5aX1NUUkVBTV9FTkR8fG4uYXZhaWxfaW49PT0wJiYoZz09PUhyLlpfRklOSVNIfHxnPT09SHIuWl9TWU5DX0ZMVVNIKSkmJih0aGlzLm9wdGlvbnMudG89PT0ic3RyaW5nIj8oeT0kdC51dGY4Ym9yZGVyKG4ub3V0cHV0LG4ubmV4dF9vdXQpLHo9bi5uZXh0X291dC15LFA9JHQuYnVmMnN0cmluZyhuLm91dHB1dCx5KSxuLm5leHRfb3V0PXosbi5hdmFpbF9vdXQ9ci16LHomJml0LmFycmF5U2V0KG4ub3V0cHV0LG4ub3V0cHV0LHkseiwwKSx0aGlzLm9uRGF0YShQKSk6dGhpcy5vbkRhdGEoaXQuc2hyaW5rQnVmKG4ub3V0cHV0LG4ubmV4dF9vdXQpKSksbi5hdmFpbF9pbj09PTAmJm4uYXZhaWxfb3V0PT09MCYmKCQ9ITApfXdoaWxlKChuLmF2YWlsX2luPjB8fG4uYXZhaWxfb3V0PT09MCkmJmQhPT1Ici5aX1NUUkVBTV9FTkQpO3JldHVybiBkPT09SHIuWl9TVFJFQU1fRU5EJiYoZz1Ici5aX0ZJTklTSCksZz09PUhyLlpfRklOSVNIPyhkPUVjLmluZmxhdGVFbmQodGhpcy5zdHJtKSx0aGlzLm9uRW5kKGQpLHRoaXMuZW5kZWQ9ITAsZD09PUhyLlpfT0spOihnPT09SHIuWl9TWU5DX0ZMVVNIJiYodGhpcy5vbkVuZChIci5aX09LKSxuLmF2YWlsX291dD0wKSwhMCl9LFVsLnByb3RvdHlwZS5vbkRhdGE9ZnVuY3Rpb24oZSl7dGhpcy5jaHVua3MucHVzaChlKX0sVWwucHJvdG90eXBlLm9uRW5kPWZ1bmN0aW9uKGUpe2U9PT1Ici5aX09LJiYodGhpcy5vcHRpb25zLnRvPT09InN0cmluZyI/dGhpcy5yZXN1bHQ9dGhpcy5jaHVua3Muam9pbigiIik6dGhpcy5yZXN1bHQ9aXQuZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcykpLHRoaXMuY2h1bmtzPVtdLHRoaXMuZXJyPWUsdGhpcy5tc2c9dGhpcy5zdHJtLm1zZ307ZnVuY3Rpb24gYmYoZSx0KXt2YXIgbj1uZXcgVWwodCk7aWYobi5wdXNoKGUsITApLG4uZXJyKXRocm93IG4ubXNnfHxoYVtuLmVycl07cmV0dXJuIG4ucmVzdWx0fWZ1bmN0aW9uIG9tKGUsdCl7cmV0dXJuIHQ9dHx8e30sdC5yYXc9ITAsYmYoZSx0KX12YXIgYW09VWwsc209YmYsbG09b20sY209YmYsdW09e0luZmxhdGU6YW0saW5mbGF0ZTpzbSxpbmZsYXRlUmF3OmxtLHVuZ3ppcDpjbX0sZm09Vm8sZG09dW0saG09aXQuYXNzaWduLEpkPXt9O2htKEpkLGZtLGRtLEhyKTt2YXIgWmQ9SmQ7bGV0IHBtPSJ1cHgycHgiLGdtPVt7bmFtZToidXB4Iix0eXBlOltOdW1iZXIsU3RyaW5nXSxyZXF1aXJlZDohMH1dLHZtPTFlLTQsbW09NzUwLFhkPSExLHlmPTAsUWQ9MCxlaD05NjAsdGg9Mzc1O2Z1bmN0aW9uIF9tKCl7bGV0e3BsYXRmb3JtOmUscGl4ZWxSYXRpbzp0LHdpbmRvd1dpZHRoOm59PWlhKCk7eWY9bixRZD10LFhkPWU9PT0iaW9zIn1mdW5jdGlvbiBuaChlLHQpe2xldCBuPU51bWJlcihlKTtyZXR1cm4gaXNOYU4obik/dDpufWZ1bmN0aW9uIGJtKCl7bGV0IGU9SS5nbG9iYWxTdHlsZXx8e307ZWg9bmgoZS5ycHhDYWxjTWF4RGV2aWNlV2lkdGgsOTYwKSx0aD1uaChlLnJweENhbGNCYXNlRGV2aWNlV2lkdGgsMzc1KX1sZXQgeW09RHQocG0sKGUsdCk9PntpZih5Zj09PTAmJihfbSgpLGJtKCkpLGU9TnVtYmVyKGUpLGU9PT0wKXJldHVybiAwO2xldCBuPXR8fHlmO249bjw9ZWg/bjp0aDtsZXQgcj1lL21tKm47cmV0dXJuIHI8MCYmKHI9LXIpLHI9TWF0aC5mbG9vcihyK3ZtKSxyPT09MCYmKFFkPT09MXx8IVhkP3I9MTpyPS41KSxlPDA/LXI6cn0sZ20pLEVtPSJhZGRJbnRlcmNlcHRvciIsd209InJlbW92ZUludGVyY2VwdG9yIixyaD1be25hbWU6Im1ldGhvZCIsdHlwZTpbU3RyaW5nLE9iamVjdF0scmVxdWlyZWQ6ITB9XSxTbT1yaDtmdW5jdGlvbiBpaChlLHQpe09iamVjdC5rZXlzKHQpLmZvckVhY2gobj0+e1EuaXNGdW5jdGlvbih0W25dKSYmKGVbbl09Q20oZVtuXSx0W25dKSl9KX1mdW5jdGlvbiBvaChlLHQpeyFlfHwhdHx8T2JqZWN0LmtleXModCkuZm9yRWFjaChuPT57bGV0IHI9ZVtuXSxzPXRbbl07US5pc0FycmF5KHIpJiZRLmlzRnVuY3Rpb24ocykmJlEucmVtb3ZlKHIscyl9KX1mdW5jdGlvbiBDbShlLHQpe2xldCBuPXQ/ZT9lLmNvbmNhdCh0KTpRLmlzQXJyYXkodCk/dDpbdF06ZTtyZXR1cm4gbiYmQW0obil9ZnVuY3Rpb24gQW0oZSl7bGV0IHQ9W107Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspdC5pbmRleE9mKGVbbl0pPT09LTEmJnQucHVzaChlW25dKTtyZXR1cm4gdH1sZXQgT209RHQoRW0sKGUsdCk9PntRLmlzU3RyaW5nKGUpJiZRLmlzUGxhaW5PYmplY3QodCk/aWgobmlbZV18fChuaVtlXT17fSksdCk6US5pc1BsYWluT2JqZWN0KGUpJiZpaChwaSxlKX0scmgpLFRtPUR0KHdtLChlLHQpPT57US5pc1N0cmluZyhlKT9RLmlzUGxhaW5PYmplY3QodCk/b2gobmlbZV0sdCk6ZGVsZXRlIG5pW2VdOlEuaXNQbGFpbk9iamVjdChlKSYmb2gocGksZSl9LFNtKSxJbT17fSxQbT0iJG9uIixhaD1be25hbWU6ImV2ZW50Iix0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0se25hbWU6ImNhbGxiYWNrIix0eXBlOkZ1bmN0aW9uLHJlcXVpcmVkOiEwfV0sTm09IiRvbmNlIixrbT1haCxSbT0iJG9mZiIseG09W3tuYW1lOiJldmVudCIsdHlwZTpbU3RyaW5nLEFycmF5XX0se25hbWU6ImNhbGxiYWNrIix0eXBlOkZ1bmN0aW9ufV0sQm09IiRlbWl0IixNbT1be25hbWU6ImV2ZW50Iix0eXBlOlN0cmluZyxyZXF1aXJlZDohMH1dLEhsPW5ldyBhZS5FbWl0dGVyLERtPUR0KFBtLChlLHQpPT4oSGwub24oZSx0KSwoKT0+SGwub2ZmKGUsdCkpLGFoKSxGbT1EdChObSwoZSx0KT0+KEhsLm9uY2UoZSx0KSwoKT0+SGwub2ZmKGUsdCkpLGttKSxMbT1EdChSbSwoZSx0KT0+e2lmKCFlKXtIbC5lPXt9O3JldHVybn1RLmlzQXJyYXkoZSl8fChlPVtlXSksZS5mb3JFYWNoKG49PkhsLm9mZihuLHQpKX0seG0pLFZtPUR0KEJtLChlLC4uLnQpPT57SGwuZW1pdChlLC4uLnQpfSxNbSksc2g9W3tuYW1lOiJpZCIsdHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9XSwkbT0iY3JlYXRlVmlkZW9Db250ZXh0IixVbT0iY3JlYXRlTWFwQ29udGV4dCIsSG09c2gsam09ImNyZWF0ZUNhbnZhc0NvbnRleHQiLHptPVt7bmFtZToiY2FudmFzSWQiLHR5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSx7bmFtZToiY29tcG9uZW50SW5zdGFuY2UiLHR5cGU6T2JqZWN0fV0sV209ImNyZWF0ZUlubmVyQXVkaW9Db250ZXh0IixHbT0iY3JlYXRlTGl2ZVB1c2hlckNvbnRleHQiLFltPXNoLmNvbmNhdCh7bmFtZToiY29tcG9uZW50SW5zdGFuY2UiLHR5cGU6T2JqZWN0fSkscW09Wy41LC44LDEsMS4yNSwxLjUsMl07Y2xhc3MgRWZ7Y29uc3RydWN0b3IodCxuKXt0aGlzLmlkPXQsdGhpcy5wYWdlSWQ9bn1wbGF5KCl7T24odGhpcy5pZCx0aGlzLnBhZ2VJZCwicGxheSIpfXBhdXNlKCl7T24odGhpcy5pZCx0aGlzLnBhZ2VJZCwicGF1c2UiKX1zdG9wKCl7T24odGhpcy5pZCx0aGlzLnBhZ2VJZCwic3RvcCIpfXNlZWsodCl7T24odGhpcy5pZCx0aGlzLnBhZ2VJZCwic2VlayIse3Bvc2l0aW9uOnR9KX1zZW5kRGFubXUodCl7T24odGhpcy5pZCx0aGlzLnBhZ2VJZCwic2VuZERhbm11Iix0KX1wbGF5YmFja1JhdGUodCl7fnFtLmluZGV4T2YodCl8fCh0PTEpLE9uKHRoaXMuaWQsdGhpcy5wYWdlSWQsInBsYXliYWNrUmF0ZSIse3JhdGU6dH0pfXJlcXVlc3RGdWxsU2NyZWVuKHQ9e30pe09uKHRoaXMuaWQsdGhpcy5wYWdlSWQsInJlcXVlc3RGdWxsU2NyZWVuIix0KX1leGl0RnVsbFNjcmVlbigpe09uKHRoaXMuaWQsdGhpcy5wYWdlSWQsImV4aXRGdWxsU2NyZWVuIil9c2hvd1N0YXR1c0Jhcigpe09uKHRoaXMuaWQsdGhpcy5wYWdlSWQsInNob3dTdGF0dXNCYXIiKX1oaWRlU3RhdHVzQmFyKCl7T24odGhpcy5pZCx0aGlzLnBhZ2VJZCwiaGlkZVN0YXR1c0JhciIpfX1sZXQgS209RHQoJG0sKGUsdCk9PnQ/bmV3IEVmKGUsbnIodCkpOm5ldyBFZihlLG5yKHhyKCkpKSksSm09KGUsdCk9PntsZXQgbj10LmVyck1zZ3x8IiI7bmV3IFJlZ0V4cCgiXFw6XFxzKmZhaWwiKS50ZXN0KG4pP2UuZmFpbCYmZS5mYWlsKHQpOmUuc3VjY2VzcyYmZS5zdWNjZXNzKHQpLGUuY29tcGxldGUmJmUuY29tcGxldGUodCl9LHNvPShlLHQsbixyKT0+e0phKGUsdCxuLHIscz0+e3ImJkptKHIscyl9KX07Y2xhc3Mgd2Z7Y29uc3RydWN0b3IodCxuKXt0aGlzLmlkPXQsdGhpcy5wYWdlSWQ9bn1nZXRDZW50ZXJMb2NhdGlvbih0KXtzbyh0aGlzLmlkLHRoaXMucGFnZUlkLCJnZXRDZW50ZXJMb2NhdGlvbiIsdCl9bW92ZVRvTG9jYXRpb24odCl7c28odGhpcy5pZCx0aGlzLnBhZ2VJZCwibW92ZVRvTG9jYXRpb24iLHQpfWdldFNjYWxlKHQpe3NvKHRoaXMuaWQsdGhpcy5wYWdlSWQsImdldFNjYWxlIix0KX1nZXRSZWdpb24odCl7c28odGhpcy5pZCx0aGlzLnBhZ2VJZCwiZ2V0UmVnaW9uIix0KX1pbmNsdWRlUG9pbnRzKHQpe3NvKHRoaXMuaWQsdGhpcy5wYWdlSWQsImluY2x1ZGVQb2ludHMiLHQpfXRyYW5zbGF0ZU1hcmtlcih0KXtzbyh0aGlzLmlkLHRoaXMucGFnZUlkLCJ0cmFuc2xhdGVNYXJrZXIiLHQpfSRnZXRBcHBNYXAoKXtyZXR1cm4gYy5tYXBzLmdldE1hcEJ5SWQodGhpcy5wYWdlSWQrIi1tYXAtIit0aGlzLmlkKX1hZGRDdXN0b21MYXllcih0KXtzbyh0aGlzLmlkLHRoaXMucGFnZUlkLCJhZGRDdXN0b21MYXllciIsdCl9cmVtb3ZlQ3VzdG9tTGF5ZXIodCl7c28odGhpcy5pZCx0aGlzLnBhZ2VJZCwicmVtb3ZlQ3VzdG9tTGF5ZXIiLHQpfWFkZEdyb3VuZE92ZXJsYXkodCl7c28odGhpcy5pZCx0aGlzLnBhZ2VJZCwiYWRkR3JvdW5kT3ZlcmxheSIsdCl9cmVtb3ZlR3JvdW5kT3ZlcmxheSh0KXtzbyh0aGlzLmlkLHRoaXMucGFnZUlkLCJyZW1vdmVHcm91bmRPdmVybGF5Iix0KX11cGRhdGVHcm91bmRPdmVybGF5KHQpe3NvKHRoaXMuaWQsdGhpcy5wYWdlSWQsInVwZGF0ZUdyb3VuZE92ZXJsYXkiLHQpfWluaXRNYXJrZXJDbHVzdGVyKHQpe3NvKHRoaXMuaWQsdGhpcy5wYWdlSWQsImluaXRNYXJrZXJDbHVzdGVyIix0KX1hZGRNYXJrZXJzKHQpe3NvKHRoaXMuaWQsdGhpcy5wYWdlSWQsImFkZE1hcmtlcnMiLHQpfXJlbW92ZU1hcmtlcnModCl7c28odGhpcy5pZCx0aGlzLnBhZ2VJZCwicmVtb3ZlTWFya2VycyIsdCl9bW92ZUFsb25nKHQpe3NvKHRoaXMuaWQsdGhpcy5wYWdlSWQsIm1vdmVBbG9uZyIsdCl9b3Blbk1hcEFwcCh0KXtzbyh0aGlzLmlkLHRoaXMucGFnZUlkLCJvcGVuTWFwQXBwIix0KX1vbih0KXtzbyh0aGlzLmlkLHRoaXMucGFnZUlkLCJvbiIsdCl9fWxldCBabT1EdChVbSwoZSx0KT0+dD9uZXcgd2YoZSxucih0KSk6bmV3IHdmKGUsbnIoeHIoKSkpLEhtKTtmdW5jdGlvbiBkbChlLHQpe3JldHVybiBmdW5jdGlvbihuLHIpe24/cltlXT1NYXRoLnJvdW5kKG4pOnR5cGVvZiB0IT0idW5kZWZpbmVkIiYmKHJbZV09dCl9fWxldCBsaD1kbCgid2lkdGgiKSxjaD1kbCgiaGVpZ2h0IiksWG09ImNhbnZhc0dldEltYWdlRGF0YSIsdWg9e2Zvcm1hdEFyZ3M6e3g6ZGwoIngiKSx5OmRsKCJ5Iiksd2lkdGg6bGgsaGVpZ2h0OmNofX0sZmg9e2NhbnZhc0lkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0seDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITB9LHk6e3R5cGU6TnVtYmVyLHJlcXVpcmVkOiEwfSx3aWR0aDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITB9LGhlaWdodDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITB9fSxRbT0iY2FudmFzUHV0SW1hZ2VEYXRhIixlXz11aCx0Xz1RLmV4dGVuZCh7ZGF0YTp7dHlwZTpVaW50OENsYW1wZWRBcnJheSxyZXF1aXJlZDohMH19LGZoLHtoZWlnaHQ6e3R5cGU6TnVtYmVyfX0pLGRoPXtQTkc6InBuZyIsSlBHOiJqcGciLEpQRUc6ImpwZyJ9LG5fPSJjYW52YXNUb1RlbXBGaWxlUGF0aCIscl89e2Zvcm1hdEFyZ3M6e3g6ZGwoIngiLDApLHk6ZGwoInkiLDApLHdpZHRoOmxoLGhlaWdodDpjaCxkZXN0V2lkdGg6ZGwoImRlc3RXaWR0aCIpLGRlc3RIZWlnaHQ6ZGwoImRlc3RIZWlnaHQiKSxmaWxlVHlwZShlLHQpe2U9KGV8fCIiKS50b1VwcGVyQ2FzZSgpO2xldCBuPWRoW2VdO258fChuPWRoLlBORyksdC5maWxlVHlwZT1ufSxxdWFsaXR5KGUsdCl7dC5xdWFsaXR5PWUmJmU+MCYmZTwxP2U6MX19fSxpXz17eDpOdW1iZXIseTpOdW1iZXIsd2lkdGg6TnVtYmVyLGhlaWdodDpOdW1iZXIsZGVzdFdpZHRoOk51bWJlcixkZXN0SGVpZ2h0Ok51bWJlcixjYW52YXNJZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LGZpbGVUeXBlOlN0cmluZyxxdWFsaXR5Ok51bWJlcn07ZnVuY3Rpb24gT3UoZSx0LG4scixzKXtidC5pbnZva2VWaWV3TWV0aG9kKGBjYW52YXMuJHtlfWAse3R5cGU6bixkYXRhOnJ9LHQsZD0+e3MmJnMoZCl9KX12YXIgb189WyJzY2FsZSIsInJvdGF0ZSIsInRyYW5zbGF0ZSIsInNldFRyYW5zZm9ybSIsInRyYW5zZm9ybSJdLGFfPVsiZHJhd0ltYWdlIiwiZmlsbFRleHQiLCJmaWxsIiwic3Ryb2tlIiwiZmlsbFJlY3QiLCJzdHJva2VSZWN0IiwiY2xlYXJSZWN0Iiwic3Ryb2tlVGV4dCJdLHNfPVsic2V0RmlsbFN0eWxlIiwic2V0VGV4dEFsaWduIiwic2V0U3Ryb2tlU3R5bGUiLCJzZXRHbG9iYWxBbHBoYSIsInNldFNoYWRvdyIsInNldEZvbnRTaXplIiwic2V0TGluZUNhcCIsInNldExpbmVKb2luIiwic2V0TGluZVdpZHRoIiwic2V0TWl0ZXJMaW1pdCIsInNldFRleHRCYXNlbGluZSIsInNldExpbmVEYXNoIl07ZnVuY3Rpb24gbF8oZSx0KXtsZXQgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0KCIyZCIpO3JldHVybiByLmZvbnQ9dCxyLm1lYXN1cmVUZXh0KGUpLndpZHRofHwwfWxldCBoaD17YWxpY2VibHVlOiIjZjBmOGZmIixhbnRpcXVld2hpdGU6IiNmYWViZDciLGFxdWE6IiMwMGZmZmYiLGFxdWFtYXJpbmU6IiM3ZmZmZDQiLGF6dXJlOiIjZjBmZmZmIixiZWlnZToiI2Y1ZjVkYyIsYmlzcXVlOiIjZmZlNGM0IixibGFjazoiIzAwMDAwMCIsYmxhbmNoZWRhbG1vbmQ6IiNmZmViY2QiLGJsdWU6IiMwMDAwZmYiLGJsdWV2aW9sZXQ6IiM4YTJiZTIiLGJyb3duOiIjYTUyYTJhIixidXJseXdvb2Q6IiNkZWI4ODciLGNhZGV0Ymx1ZToiIzVmOWVhMCIsY2hhcnRyZXVzZToiIzdmZmYwMCIsY2hvY29sYXRlOiIjZDI2OTFlIixjb3JhbDoiI2ZmN2Y1MCIsY29ybmZsb3dlcmJsdWU6IiM2NDk1ZWQiLGNvcm5zaWxrOiIjZmZmOGRjIixjcmltc29uOiIjZGMxNDNjIixjeWFuOiIjMDBmZmZmIixkYXJrYmx1ZToiIzAwMDA4YiIsZGFya2N5YW46IiMwMDhiOGIiLGRhcmtnb2xkZW5yb2Q6IiNiODg2MGIiLGRhcmtncmF5OiIjYTlhOWE5IixkYXJrZ3JleToiI2E5YTlhOSIsZGFya2dyZWVuOiIjMDA2NDAwIixkYXJra2hha2k6IiNiZGI3NmIiLGRhcmttYWdlbnRhOiIjOGIwMDhiIixkYXJrb2xpdmVncmVlbjoiIzU1NmIyZiIsZGFya29yYW5nZToiI2ZmOGMwMCIsZGFya29yY2hpZDoiIzk5MzJjYyIsZGFya3JlZDoiIzhiMDAwMCIsZGFya3NhbG1vbjoiI2U5OTY3YSIsZGFya3NlYWdyZWVuOiIjOGZiYzhmIixkYXJrc2xhdGVibHVlOiIjNDgzZDhiIixkYXJrc2xhdGVncmF5OiIjMmY0ZjRmIixkYXJrc2xhdGVncmV5OiIjMmY0ZjRmIixkYXJrdHVycXVvaXNlOiIjMDBjZWQxIixkYXJrdmlvbGV0OiIjOTQwMGQzIixkZWVwcGluazoiI2ZmMTQ5MyIsZGVlcHNreWJsdWU6IiMwMGJmZmYiLGRpbWdyYXk6IiM2OTY5NjkiLGRpbWdyZXk6IiM2OTY5NjkiLGRvZGdlcmJsdWU6IiMxZTkwZmYiLGZpcmVicmljazoiI2IyMjIyMiIsZmxvcmFsd2hpdGU6IiNmZmZhZjAiLGZvcmVzdGdyZWVuOiIjMjI4YjIyIixmdWNoc2lhOiIjZmYwMGZmIixnYWluc2Jvcm86IiNkY2RjZGMiLGdob3N0d2hpdGU6IiNmOGY4ZmYiLGdvbGQ6IiNmZmQ3MDAiLGdvbGRlbnJvZDoiI2RhYTUyMCIsZ3JheToiIzgwODA4MCIsZ3JleToiIzgwODA4MCIsZ3JlZW46IiMwMDgwMDAiLGdyZWVueWVsbG93OiIjYWRmZjJmIixob25leWRldzoiI2YwZmZmMCIsaG90cGluazoiI2ZmNjliNCIsaW5kaWFucmVkOiIjY2Q1YzVjIixpbmRpZ286IiM0YjAwODIiLGl2b3J5OiIjZmZmZmYwIixraGFraToiI2YwZTY4YyIsbGF2ZW5kZXI6IiNlNmU2ZmEiLGxhdmVuZGVyYmx1c2g6IiNmZmYwZjUiLGxhd25ncmVlbjoiIzdjZmMwMCIsbGVtb25jaGlmZm9uOiIjZmZmYWNkIixsaWdodGJsdWU6IiNhZGQ4ZTYiLGxpZ2h0Y29yYWw6IiNmMDgwODAiLGxpZ2h0Y3lhbjoiI2UwZmZmZiIsbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IiNmYWZhZDIiLGxpZ2h0Z3JheToiI2QzZDNkMyIsbGlnaHRncmV5OiIjZDNkM2QzIixsaWdodGdyZWVuOiIjOTBlZTkwIixsaWdodHBpbms6IiNmZmI2YzEiLGxpZ2h0c2FsbW9uOiIjZmZhMDdhIixsaWdodHNlYWdyZWVuOiIjMjBiMmFhIixsaWdodHNreWJsdWU6IiM4N2NlZmEiLGxpZ2h0c2xhdGVncmF5OiIjNzc4ODk5IixsaWdodHNsYXRlZ3JleToiIzc3ODg5OSIsbGlnaHRzdGVlbGJsdWU6IiNiMGM0ZGUiLGxpZ2h0eWVsbG93OiIjZmZmZmUwIixsaW1lOiIjMDBmZjAwIixsaW1lZ3JlZW46IiMzMmNkMzIiLGxpbmVuOiIjZmFmMGU2IixtYWdlbnRhOiIjZmYwMGZmIixtYXJvb246IiM4MDAwMDAiLG1lZGl1bWFxdWFtYXJpbmU6IiM2NmNkYWEiLG1lZGl1bWJsdWU6IiMwMDAwY2QiLG1lZGl1bW9yY2hpZDoiI2JhNTVkMyIsbWVkaXVtcHVycGxlOiIjOTM3MGRiIixtZWRpdW1zZWFncmVlbjoiIzNjYjM3MSIsbWVkaXVtc2xhdGVibHVlOiIjN2I2OGVlIixtZWRpdW1zcHJpbmdncmVlbjoiIzAwZmE5YSIsbWVkaXVtdHVycXVvaXNlOiIjNDhkMWNjIixtZWRpdW12aW9sZXRyZWQ6IiNjNzE1ODUiLG1pZG5pZ2h0Ymx1ZToiIzE5MTk3MCIsbWludGNyZWFtOiIjZjVmZmZhIixtaXN0eXJvc2U6IiNmZmU0ZTEiLG1vY2Nhc2luOiIjZmZlNGI1IixuYXZham93aGl0ZToiI2ZmZGVhZCIsbmF2eToiIzAwMDA4MCIsb2xkbGFjZToiI2ZkZjVlNiIsb2xpdmU6IiM4MDgwMDAiLG9saXZlZHJhYjoiIzZiOGUyMyIsb3JhbmdlOiIjZmZhNTAwIixvcmFuZ2VyZWQ6IiNmZjQ1MDAiLG9yY2hpZDoiI2RhNzBkNiIscGFsZWdvbGRlbnJvZDoiI2VlZThhYSIscGFsZWdyZWVuOiIjOThmYjk4IixwYWxldHVycXVvaXNlOiIjYWZlZWVlIixwYWxldmlvbGV0cmVkOiIjZGI3MDkzIixwYXBheWF3aGlwOiIjZmZlZmQ1IixwZWFjaHB1ZmY6IiNmZmRhYjkiLHBlcnU6IiNjZDg1M2YiLHBpbms6IiNmZmMwY2IiLHBsdW06IiNkZGEwZGQiLHBvd2RlcmJsdWU6IiNiMGUwZTYiLHB1cnBsZToiIzgwMDA4MCIscmViZWNjYXB1cnBsZToiIzY2MzM5OSIscmVkOiIjZmYwMDAwIixyb3N5YnJvd246IiNiYzhmOGYiLHJveWFsYmx1ZToiIzQxNjllMSIsc2FkZGxlYnJvd246IiM4YjQ1MTMiLHNhbG1vbjoiI2ZhODA3MiIsc2FuZHlicm93bjoiI2Y0YTQ2MCIsc2VhZ3JlZW46IiMyZThiNTciLHNlYXNoZWxsOiIjZmZmNWVlIixzaWVubmE6IiNhMDUyMmQiLHNpbHZlcjoiI2MwYzBjMCIsc2t5Ymx1ZToiIzg3Y2VlYiIsc2xhdGVibHVlOiIjNmE1YWNkIixzbGF0ZWdyYXk6IiM3MDgwOTAiLHNsYXRlZ3JleToiIzcwODA5MCIsc25vdzoiI2ZmZmFmYSIsc3ByaW5nZ3JlZW46IiMwMGZmN2YiLHN0ZWVsYmx1ZToiIzQ2ODJiNCIsdGFuOiIjZDJiNDhjIix0ZWFsOiIjMDA4MDgwIix0aGlzdGxlOiIjZDhiZmQ4Iix0b21hdG86IiNmZjYzNDciLHR1cnF1b2lzZToiIzQwZTBkMCIsdmlvbGV0OiIjZWU4MmVlIix3aGVhdDoiI2Y1ZGViMyIsd2hpdGU6IiNmZmZmZmYiLHdoaXRlc21va2U6IiNmNWY1ZjUiLHllbGxvdzoiI2ZmZmYwMCIseWVsbG93Z3JlZW46IiM5YWNkMzIiLHRyYW5zcGFyZW50OiIjMDAwMDAwMDAifTtmdW5jdGlvbiBTZihlKXtlPWV8fCIjMDAwMDAwIjt2YXIgdD1udWxsO2lmKCh0PS9eIyhbMC05fEEtRnxhLWZdezZ9KSQvLmV4ZWMoZSkpIT1udWxsKXtsZXQgcj1wYXJzZUludCh0WzFdLnNsaWNlKDAsMiksMTYpLHM9cGFyc2VJbnQodFsxXS5zbGljZSgyLDQpLDE2KSxkPXBhcnNlSW50KHRbMV0uc2xpY2UoNCksMTYpO3JldHVybltyLHMsZCwyNTVdfWlmKCh0PS9eIyhbMC05fEEtRnxhLWZdezN9KSQvLmV4ZWMoZSkpIT1udWxsKXtsZXQgcj10WzFdLnNsaWNlKDAsMSkscz10WzFdLnNsaWNlKDEsMiksZD10WzFdLnNsaWNlKDIsMyk7cmV0dXJuIHI9cGFyc2VJbnQocityLDE2KSxzPXBhcnNlSW50KHMrcywxNiksZD1wYXJzZUludChkK2QsMTYpLFtyLHMsZCwyNTVdfWlmKCh0PS9ecmdiXCgoLispXCkkLy5leGVjKGUpKSE9bnVsbClyZXR1cm4gdFsxXS5zcGxpdCgiLCIpLm1hcChmdW5jdGlvbihyKXtyZXR1cm4gTWF0aC5taW4oMjU1LHBhcnNlSW50KHIudHJpbSgpKSl9KS5jb25jYXQoMjU1KTtpZigodD0vXnJnYmFcKCguKylcKSQvLmV4ZWMoZSkpIT1udWxsKXJldHVybiB0WzFdLnNwbGl0KCIsIikubWFwKGZ1bmN0aW9uKHIscyl7cmV0dXJuIHM9PT0zP01hdGguZmxvb3IoMjU1KnBhcnNlRmxvYXQoci50cmltKCkpKTpNYXRoLm1pbigyNTUscGFyc2VJbnQoci50cmltKCkpKX0pO3ZhciBuPWUudG9Mb3dlckNhc2UoKTtpZihRLmhhc093bihoaCxuKSl7dD0vXiMoWzAtOXxBLUZ8YS1mXXs2LDh9KSQvLmV4ZWMoaGhbbl0pO2xldCByPXBhcnNlSW50KHRbMV0uc2xpY2UoMCwyKSwxNikscz1wYXJzZUludCh0WzFdLnNsaWNlKDIsNCksMTYpLGQ9cGFyc2VJbnQodFsxXS5zbGljZSg0LDYpLDE2KSxnPXBhcnNlSW50KHRbMV0uc2xpY2UoNiw4KSwxNik7cmV0dXJuIGc9Zz49MD9nOjI1NSxbcixzLGQsZ119cmV0dXJuIGNvbnNvbGUuZXJyb3IoInVuc3VwcG9ydGVkIGNvbG9yOiIrZSksWzAsMCwwLDI1NV19Y2xhc3MgcGh7Y29uc3RydWN0b3IodCxuKXt0aGlzLnR5cGU9dCx0aGlzLmRhdGE9bix0aGlzLmNvbG9yU3RvcD1bXX1hZGRDb2xvclN0b3AodCxuKXt0aGlzLmNvbG9yU3RvcC5wdXNoKFt0LFNmKG4pXSl9fWNsYXNzIGNfe2NvbnN0cnVjdG9yKHQsbil7dGhpcy50eXBlPSJwYXR0ZXJuIix0aGlzLmRhdGE9dCx0aGlzLmNvbG9yU3RvcD1ufX1jbGFzcyB1X3tjb25zdHJ1Y3Rvcih0KXt0aGlzLndpZHRoPXR9fWNsYXNzIHR1e2NvbnN0cnVjdG9yKHQsbil7dGhpcy5pZD10LHRoaXMucGFnZUlkPW4sdGhpcy5hY3Rpb25zPVtdLHRoaXMucGF0aD1bXSx0aGlzLnN1YnBhdGg9W10sdGhpcy5kcmF3aW5nU3RhdGU9W10sdGhpcy5zdGF0ZT17bGluZURhc2g6WzAsMF0sc2hhZG93T2Zmc2V0WDowLHNoYWRvd09mZnNldFk6MCxzaGFkb3dCbHVyOjAsc2hhZG93Q29sb3I6WzAsMCwwLDBdLGZvbnQ6IjEwcHggc2Fucy1zZXJpZiIsZm9udFNpemU6MTAsZm9udFdlaWdodDoibm9ybWFsIixmb250U3R5bGU6Im5vcm1hbCIsZm9udEZhbWlseToic2Fucy1zZXJpZiJ9fWRyYXcodD0hMSxuKXt2YXIgcj1bLi4udGhpcy5hY3Rpb25zXTt0aGlzLmFjdGlvbnM9W10sdGhpcy5wYXRoPVtdLE91KHRoaXMuaWQsdGhpcy5wYWdlSWQsImFjdGlvbnNDaGFuZ2VkIix7YWN0aW9uczpyLHJlc2VydmU6dH0sbil9Y3JlYXRlTGluZWFyR3JhZGllbnQodCxuLHIscyl7cmV0dXJuIG5ldyBwaCgibGluZWFyIixbdCxuLHIsc10pfWNyZWF0ZUNpcmN1bGFyR3JhZGllbnQodCxuLHIpe3JldHVybiBuZXcgcGgoInJhZGlhbCIsW3QsbixyXSl9Y3JlYXRlUGF0dGVybih0LG4pe2lmKG49PT12b2lkIDApY29uc29sZS5lcnJvcigiRmFpbGVkIHRvIGV4ZWN1dGUgJ2NyZWF0ZVBhdHRlcm4nIG9uICdDYW52YXNDb250ZXh0JzogMiBhcmd1bWVudHMgcmVxdWlyZWQsIGJ1dCBvbmx5IDEgcHJlc2VudC4iKTtlbHNlIGlmKFsicmVwZWF0IiwicmVwZWF0LXgiLCJyZXBlYXQteSIsIm5vLXJlcGVhdCJdLmluZGV4T2Yobik8MCljb25zb2xlLmVycm9yKCJGYWlsZWQgdG8gZXhlY3V0ZSAnY3JlYXRlUGF0dGVybicgb24gJ0NhbnZhc0NvbnRleHQnOiBUaGUgcHJvdmlkZWQgdHlwZSAoJyIrbisiJykgaXMgbm90IG9uZSBvZiAncmVwZWF0JywgJ25vLXJlcGVhdCcsICdyZXBlYXQteCcsIG9yICdyZXBlYXQteScuIik7ZWxzZSByZXR1cm4gbmV3IGNfKHQsbil9bWVhc3VyZVRleHQodCl7bGV0IG49dGhpcy5zdGF0ZS5mb250LHI9MDt7bGV0IHM9Yy53ZWJ2aWV3LmFsbCgpLmZpbmQoZD0+ZC5nZXRVUkwoKS5lbmRzV2l0aCgid3d3L19fdW5pYXBwdmlldy5odG1sIikpO3MmJihyPU51bWJlcihzLmV2YWxKU1N5bmMoYCgke2xfLnRvU3RyaW5nKCl9KSgke0pTT04uc3RyaW5naWZ5KHQpfSwke0pTT04uc3RyaW5naWZ5KG4pfSlgKSkpfXJldHVybiBuZXcgdV8ocil9c2F2ZSgpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNhdmUiLGRhdGE6W119KSx0aGlzLmRyYXdpbmdTdGF0ZS5wdXNoKHRoaXMuc3RhdGUpfXJlc3RvcmUoKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJyZXN0b3JlIixkYXRhOltdfSksdGhpcy5zdGF0ZT10aGlzLmRyYXdpbmdTdGF0ZS5wb3AoKXx8e2xpbmVEYXNoOlswLDBdLHNoYWRvd09mZnNldFg6MCxzaGFkb3dPZmZzZXRZOjAsc2hhZG93Qmx1cjowLHNoYWRvd0NvbG9yOlswLDAsMCwwXSxmb250OiIxMHB4IHNhbnMtc2VyaWYiLGZvbnRTaXplOjEwLGZvbnRXZWlnaHQ6Im5vcm1hbCIsZm9udFN0eWxlOiJub3JtYWwiLGZvbnRGYW1pbHk6InNhbnMtc2VyaWYifX1iZWdpblBhdGgoKXt0aGlzLnBhdGg9W10sdGhpcy5zdWJwYXRoPVtdLHRoaXMucGF0aC5wdXNoKHttZXRob2Q6ImJlZ2luUGF0aCIsZGF0YTpbXX0pfW1vdmVUbyh0LG4pe3RoaXMucGF0aC5wdXNoKHttZXRob2Q6Im1vdmVUbyIsZGF0YTpbdCxuXX0pLHRoaXMuc3VicGF0aD1bW3Qsbl1dfWxpbmVUbyh0LG4pe3RoaXMucGF0aC5sZW5ndGg9PT0wJiZ0aGlzLnN1YnBhdGgubGVuZ3RoPT09MD90aGlzLnBhdGgucHVzaCh7bWV0aG9kOiJtb3ZlVG8iLGRhdGE6W3Qsbl19KTp0aGlzLnBhdGgucHVzaCh7bWV0aG9kOiJsaW5lVG8iLGRhdGE6W3Qsbl19KSx0aGlzLnN1YnBhdGgucHVzaChbdCxuXSl9cXVhZHJhdGljQ3VydmVUbyh0LG4scixzKXt0aGlzLnBhdGgucHVzaCh7bWV0aG9kOiJxdWFkcmF0aWNDdXJ2ZVRvIixkYXRhOlt0LG4scixzXX0pLHRoaXMuc3VicGF0aC5wdXNoKFtyLHNdKX1iZXppZXJDdXJ2ZVRvKHQsbixyLHMsZCxnKXt0aGlzLnBhdGgucHVzaCh7bWV0aG9kOiJiZXppZXJDdXJ2ZVRvIixkYXRhOlt0LG4scixzLGQsZ119KSx0aGlzLnN1YnBhdGgucHVzaChbZCxnXSl9YXJjKHQsbixyLHMsZCxnPSExKXt0aGlzLnBhdGgucHVzaCh7bWV0aG9kOiJhcmMiLGRhdGE6W3QsbixyLHMsZCxnXX0pLHRoaXMuc3VicGF0aC5wdXNoKFt0LG5dKX1yZWN0KHQsbixyLHMpe3RoaXMucGF0aC5wdXNoKHttZXRob2Q6InJlY3QiLGRhdGE6W3QsbixyLHNdfSksdGhpcy5zdWJwYXRoPVtbdCxuXV19YXJjVG8odCxuLHIscyxkKXt0aGlzLnBhdGgucHVzaCh7bWV0aG9kOiJhcmNUbyIsZGF0YTpbdCxuLHIscyxkXX0pLHRoaXMuc3VicGF0aC5wdXNoKFtyLHNdKX1jbGlwKCl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoiY2xpcCIsZGF0YTpbLi4udGhpcy5wYXRoXX0pfWNsb3NlUGF0aCgpe3RoaXMucGF0aC5wdXNoKHttZXRob2Q6ImNsb3NlUGF0aCIsZGF0YTpbXX0pLHRoaXMuc3VicGF0aC5sZW5ndGgmJih0aGlzLnN1YnBhdGg9W3RoaXMuc3VicGF0aC5zaGlmdCgpXSl9Y2xlYXJBY3Rpb25zKCl7dGhpcy5hY3Rpb25zPVtdLHRoaXMucGF0aD1bXSx0aGlzLnN1YnBhdGg9W119Z2V0QWN0aW9ucygpe3ZhciB0PVsuLi50aGlzLmFjdGlvbnNdO3JldHVybiB0aGlzLmNsZWFyQWN0aW9ucygpLHR9c2V0IGxpbmVEYXNoT2Zmc2V0KHQpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldExpbmVEYXNoT2Zmc2V0IixkYXRhOlt0XX0pfXNldCBnbG9iYWxDb21wb3NpdGVPcGVyYXRpb24odCl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0R2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uIixkYXRhOlt0XX0pfXNldCBzaGFkb3dCbHVyKHQpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldFNoYWRvd0JsdXIiLGRhdGE6W3RdfSl9c2V0IHNoYWRvd0NvbG9yKHQpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldFNoYWRvd0NvbG9yIixkYXRhOlt0XX0pfXNldCBzaGFkb3dPZmZzZXRYKHQpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldFNoYWRvd09mZnNldFgiLGRhdGE6W3RdfSl9c2V0IHNoYWRvd09mZnNldFkodCl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0U2hhZG93T2Zmc2V0WSIsZGF0YTpbdF19KX1zZXQgZm9udCh0KXt2YXIgbj10aGlzO3RoaXMuc3RhdGUuZm9udD10O3ZhciByPXQubWF0Y2goL14oKFtcd1wtXStccykqKShcZCtyP3B4KShcLyhcZCtcLj9cZCoocj9weCk/KSk/XHMrKC4qKS8pO2lmKHIpe3ZhciBzPXJbMV0udHJpbSgpLnNwbGl0KC9ccy8pLGQ9cGFyc2VGbG9hdChyWzNdKSxnPXJbN10seT1bXTtzLmZvckVhY2goZnVuY3Rpb24oUCwkKXtbIml0YWxpYyIsIm9ibGlxdWUiLCJub3JtYWwiXS5pbmRleE9mKFApPi0xPyh5LnB1c2goe21ldGhvZDoic2V0Rm9udFN0eWxlIixkYXRhOltQXX0pLG4uc3RhdGUuZm9udFN0eWxlPVApOlsiYm9sZCIsIm5vcm1hbCJdLmluZGV4T2YoUCk+LTE/KHkucHVzaCh7bWV0aG9kOiJzZXRGb250V2VpZ2h0IixkYXRhOltQXX0pLG4uc3RhdGUuZm9udFdlaWdodD1QKTokPT09MD8oeS5wdXNoKHttZXRob2Q6InNldEZvbnRTdHlsZSIsZGF0YTpbIm5vcm1hbCJdfSksbi5zdGF0ZS5mb250U3R5bGU9Im5vcm1hbCIpOiQ9PT0xJiZ6KCl9KSxzLmxlbmd0aD09PTEmJnooKSxzPXkubWFwKGZ1bmN0aW9uKFApe3JldHVybiBQLmRhdGFbMF19KS5qb2luKCIgIiksdGhpcy5zdGF0ZS5mb250U2l6ZT1kLHRoaXMuc3RhdGUuZm9udEZhbWlseT1nLHRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldEZvbnQiLGRhdGE6W2Ake3N9ICR7ZH1weCAke2d9YF19KX1lbHNlIGNvbnNvbGUud2FybigiRmFpbGVkIHRvIHNldCAnZm9udCcgb24gJ0NhbnZhc0NvbnRleHQnOiBpbnZhbGlkIGZvcm1hdC4iKTtmdW5jdGlvbiB6KCl7eS5wdXNoKHttZXRob2Q6InNldEZvbnRXZWlnaHQiLGRhdGE6WyJub3JtYWwiXX0pLG4uc3RhdGUuZm9udFdlaWdodD0ibm9ybWFsIn19Z2V0IGZvbnQoKXtyZXR1cm4gdGhpcy5zdGF0ZS5mb250fXNldCBmaWxsU3R5bGUodCl7dGhpcy5zZXRGaWxsU3R5bGUodCl9c2V0IHN0cm9rZVN0eWxlKHQpe3RoaXMuc2V0U3Ryb2tlU3R5bGUodCl9c2V0IGdsb2JhbEFscGhhKHQpe3Q9TWF0aC5mbG9vcigyNTUqcGFyc2VGbG9hdCh0KSksdGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0R2xvYmFsQWxwaGEiLGRhdGE6W3RdfSl9c2V0IHRleHRBbGlnbih0KXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRUZXh0QWxpZ24iLGRhdGE6W3RdfSl9c2V0IGxpbmVDYXAodCl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0TGluZUNhcCIsZGF0YTpbdF19KX1zZXQgbGluZUpvaW4odCl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0TGluZUpvaW4iLGRhdGE6W3RdfSl9c2V0IGxpbmVXaWR0aCh0KXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRMaW5lV2lkdGgiLGRhdGE6W3RdfSl9c2V0IG1pdGVyTGltaXQodCl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0TWl0ZXJMaW1pdCIsZGF0YTpbdF19KX1zZXQgdGV4dEJhc2VsaW5lKHQpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldFRleHRCYXNlbGluZSIsZGF0YTpbdF19KX19bGV0IGZfPWFlLm9uY2UoKCk9PntbLi4ub18sLi4uYV9dLmZvckVhY2goZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChuKXtzd2l0Y2gobil7Y2FzZSJmaWxsIjpjYXNlInN0cm9rZSI6cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDpuKyJQYXRoIixkYXRhOlsuLi50aGlzLnBhdGhdfSl9O2Nhc2UiZmlsbFJlY3QiOnJldHVybiBmdW5jdGlvbihyLHMsZCxnKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJmaWxsUGF0aCIsZGF0YTpbe21ldGhvZDoicmVjdCIsZGF0YTpbcixzLGQsZ119XX0pfTtjYXNlInN0cm9rZVJlY3QiOnJldHVybiBmdW5jdGlvbihyLHMsZCxnKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzdHJva2VQYXRoIixkYXRhOlt7bWV0aG9kOiJyZWN0IixkYXRhOltyLHMsZCxnXX1dfSl9O2Nhc2UiZmlsbFRleHQiOmNhc2Uic3Ryb2tlVGV4dCI6cmV0dXJuIGZ1bmN0aW9uKHIscyxkLGcpe3ZhciB5PVtyLnRvU3RyaW5nKCkscyxkXTt0eXBlb2YgZz09Im51bWJlciImJnkucHVzaChnKSx0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOm4sZGF0YTp5fSl9O2Nhc2UiZHJhd0ltYWdlIjpyZXR1cm4gZnVuY3Rpb24ocixzLGQsZyx5LHosUCwkLF9lKXtfZT09PXZvaWQgMCYmKHo9cyxQPWQsJD1nLF9lPXkscz12b2lkIDAsZD12b2lkIDAsZz12b2lkIDAseT12b2lkIDApO3ZhciBUZTtmdW5jdGlvbiBMZShFdCl7cmV0dXJuIHR5cGVvZiBFdD09Im51bWJlciJ9VGU9TGUocykmJkxlKGQpJiZMZShnKSYmTGUoeSk/W3IseixQLCQsX2UscyxkLGcseV06TGUoJCkmJkxlKF9lKT9bcix6LFAsJCxfZV06W3IseixQXSx0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOm4sZGF0YTpUZX0pfTtkZWZhdWx0OnJldHVybiBmdW5jdGlvbiguLi5yKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOm4sZGF0YTpyfSl9fX10dS5wcm90b3R5cGVbZV09dChlKX0pLHNfLmZvckVhY2goZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChuKXtzd2l0Y2gobil7Y2FzZSJzZXRGaWxsU3R5bGUiOmNhc2Uic2V0U3Ryb2tlU3R5bGUiOnJldHVybiBmdW5jdGlvbihyKXt0eXBlb2YgciE9Im9iamVjdCI/dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDpuLGRhdGE6WyJub3JtYWwiLFNmKHIpXX0pOnRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6bixkYXRhOltyLnR5cGUsci5kYXRhLHIuY29sb3JTdG9wXX0pfTtjYXNlInNldEdsb2JhbEFscGhhIjpyZXR1cm4gZnVuY3Rpb24ocil7cj1NYXRoLmZsb29yKDI1NSpwYXJzZUZsb2F0KHIpKSx0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOm4sZGF0YTpbcl19KX07Y2FzZSJzZXRTaGFkb3ciOnJldHVybiBmdW5jdGlvbihyLHMsZCxnKXtnPVNmKGcpLHRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6bixkYXRhOltyLHMsZCxnXX0pLHRoaXMuc3RhdGUuc2hhZG93Qmx1cj1kLHRoaXMuc3RhdGUuc2hhZG93Q29sb3I9Zyx0aGlzLnN0YXRlLnNoYWRvd09mZnNldFg9cix0aGlzLnN0YXRlLnNoYWRvd09mZnNldFk9c307Y2FzZSJzZXRMaW5lRGFzaCI6cmV0dXJuIGZ1bmN0aW9uKHIscyl7cj1yfHxbMCwwXSxzPXN8fDAsdGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDpuLGRhdGE6W3Isc119KSx0aGlzLnN0YXRlLmxpbmVEYXNoPXJ9O2Nhc2Uic2V0Rm9udFNpemUiOnJldHVybiBmdW5jdGlvbihyKXt0aGlzLnN0YXRlLmZvbnQ9dGhpcy5zdGF0ZS5mb250LnJlcGxhY2UoL1xkK1wuP1xkKnB4LyxyKyJweCIpLHRoaXMuc3RhdGUuZm9udFNpemU9cix0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOm4sZGF0YTpbcl19KX07ZGVmYXVsdDpyZXR1cm4gZnVuY3Rpb24oLi4ucil7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDpuLGRhdGE6cn0pfX19dHUucHJvdG90eXBlW2VdPXQoZSl9KX0pLGRfPUR0KGptLChlLHQpPT57aWYoZl8oKSx0KXJldHVybiBuZXcgdHUoZSxucih0KSk7bGV0IG49bnIoeHIoKSk7aWYobilyZXR1cm4gbmV3IHR1KGUsbik7YnQuZW1pdChhZS5PTl9FUlJPUiwiY3JlYXRlQ2FudmFzQ29udGV4dDpmYWlsIil9LHptKSxoXz1SZShYbSwoe2NhbnZhc0lkOmUseDp0LHk6bix3aWR0aDpyLGhlaWdodDpzfSx7cmVzb2x2ZTpkLHJlamVjdDpnfSk9PntsZXQgeT1ucih4cigpKTtpZigheSl7ZygpO3JldHVybn1mdW5jdGlvbiB6KFApe2lmKFAuZXJyTXNnJiZQLmVyck1zZy5pbmRleE9mKCJmYWlsIikhPT0tMSl7ZygiIixQKTtyZXR1cm59bGV0ICQ9UC5kYXRhOyQmJiQubGVuZ3RoJiYoUC5jb21wcmVzc2VkJiYoJD1aZC5pbmZsYXRlUmF3KCQpKSxQLmRhdGE9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KCQpKSxkZWxldGUgUC5jb21wcmVzc2VkLGQoUCl9T3UoZSx5LCJnZXRJbWFnZURhdGEiLHt4OnQseTpuLHdpZHRoOnIsaGVpZ2h0OnN9LHopfSxmaCx1aCkscF89UmUoUW0sKHtjYW52YXNJZDplLGRhdGE6dCx4Om4seTpyLHdpZHRoOnMsaGVpZ2h0OmR9LHtyZXNvbHZlOmcscmVqZWN0Onl9KT0+e3ZhciB6PW5yKHhyKCkpO2lmKCF6KXt5KCk7cmV0dXJufWxldCBQLCQ9KCk9PntPdShlLHosInB1dEltYWdlRGF0YSIse2RhdGE6dCx4Om4seTpyLHdpZHRoOnMsaGVpZ2h0OmQsY29tcHJlc3NlZDpQfSxfZT0+e2lmKF9lLmVyck1zZyYmX2UuZXJyTXNnLmluZGV4T2YoImZhaWwiKSE9PS0xKXt5KCk7cmV0dXJufWcoX2UpfSl9O2Mub3MubmFtZSE9PSJpT1MifHx0eXBlb2YgX19XRUVYX0RFVlRPT0xfXz09ImJvb2xlYW4iPyh0PVpkLmRlZmxhdGVSYXcodCx7dG86InN0cmluZyJ9KSxQPSEwKTp0PUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHQpLCQoKX0sdF8sZV8pLGdfPVJlKG5fLCh7eDplPTAseTp0PTAsd2lkdGg6bixoZWlnaHQ6cixkZXN0V2lkdGg6cyxkZXN0SGVpZ2h0OmQsY2FudmFzSWQ6ZyxmaWxlVHlwZTp5LHF1YWxpdHk6en0se3Jlc29sdmU6UCxyZWplY3Q6JH0pPT57dmFyIF9lPW5yKHhyKCkpO2lmKCFfZSl7JCgpO3JldHVybn1sZXQgVGU9YCR7U2l9L2NhbnZhc2A7T3UoZyxfZSwidG9UZW1wRmlsZVBhdGgiLHt4OmUseTp0LHdpZHRoOm4saGVpZ2h0OnIsZGVzdFdpZHRoOnMsZGVzdEhlaWdodDpkLGZpbGVUeXBlOnkscXVhbGl0eTp6LGRpcm5hbWU6VGV9LExlPT57aWYoTGUuZXJyTXNnJiZMZS5lcnJNc2cuaW5kZXhPZigiZmFpbCIpIT09LTEpeyQoIiIsTGUpO3JldHVybn1QKExlKX0pfSxpXyxyXyksZ2g9WyJvbkNhbnBsYXkiLCJvblBsYXkiLCJvblBhdXNlIiwib25TdG9wIiwib25FbmRlZCIsIm9uVGltZVVwZGF0ZSIsIm9uRXJyb3IiLCJvbldhaXRpbmciLCJvblNlZWtpbmciLCJvblNlZWtlZCJdLHZfPVsib2ZmQ2FucGxheSIsIm9mZlBsYXkiLCJvZmZQYXVzZSIsIm9mZlN0b3AiLCJvZmZFbmRlZCIsIm9mZlRpbWVVcGRhdGUiLCJvZmZFcnJvciIsIm9mZldhaXRpbmciLCJvZmZTZWVraW5nIiwib2ZmU2Vla2VkIl0sbV89e3RocmVzaG9sZHM6WzBdLGluaXRpYWxSYXRpbzowLG9ic2VydmVBbGw6ITF9LF9fPVsidG9wIiwicmlnaHQiLCJib3R0b20iLCJsZWZ0Il0sYl89MTtmdW5jdGlvbiB2aChlPXt9KXtyZXR1cm4gX18ubWFwKHQ9PmAke051bWJlcihlW3RdKXx8MH1weGApLmpvaW4oIiAiKX1jbGFzcyBtaHtjb25zdHJ1Y3Rvcih0LG4pe3RoaXMuX3BhZ2VJZD1ucih0KSx0aGlzLl9jb21wb25lbnQ9dCx0aGlzLl9vcHRpb25zPVEuZXh0ZW5kKHt9LG1fLG4pfXJlbGF0aXZlVG8odCxuKXtyZXR1cm4gdGhpcy5fb3B0aW9ucy5yZWxhdGl2ZVRvU2VsZWN0b3I9dCx0aGlzLl9vcHRpb25zLnJvb3RNYXJnaW49dmgobiksdGhpc31yZWxhdGl2ZVRvVmlld3BvcnQodCl7cmV0dXJuIHRoaXMuX29wdGlvbnMucmVsYXRpdmVUb1NlbGVjdG9yPXZvaWQgMCx0aGlzLl9vcHRpb25zLnJvb3RNYXJnaW49dmgodCksdGhpc31vYnNlcnZlKHQsbil7IVEuaXNGdW5jdGlvbihuKXx8KHRoaXMuX29wdGlvbnMuc2VsZWN0b3I9dCx0aGlzLl9yZXFJZD1iXysrLHdpKHtyZXFJZDp0aGlzLl9yZXFJZCxjb21wb25lbnQ6dGhpcy5fY29tcG9uZW50LG9wdGlvbnM6dGhpcy5fb3B0aW9ucyxjYWxsYmFjazpufSx0aGlzLl9wYWdlSWQpKX1kaXNjb25uZWN0KCl7dGhpcy5fcmVxSWQmJiRyKHtyZXFJZDp0aGlzLl9yZXFJZCxjb21wb25lbnQ6dGhpcy5fY29tcG9uZW50fSx0aGlzLl9wYWdlSWQpfX1sZXQgeV89RHQoImNyZWF0ZUludGVyc2VjdGlvbk9ic2VydmVyIiwoZSx0KT0+KGU9YWUucmVzb2x2ZUNvbXBvbmVudEluc3RhbmNlKGUpLGUmJiFucihlKSYmKHQ9ZSxlPW51bGwpLGU/bmV3IG1oKGUsdCk6bmV3IG1oKHhyKCksdCkpKSxFXz0xO2NsYXNzIF9oe2NvbnN0cnVjdG9yKHQpe3RoaXMuX3BhZ2VJZD10LiRwYWdlJiZ0LiRwYWdlLmlkLHRoaXMuX2NvbXBvbmVudD10fW9ic2VydmUodCxuKXshUS5pc0Z1bmN0aW9uKG4pfHwodGhpcy5fcmVxSWQ9RV8rKyxGaSh7cmVxSWQ6dGhpcy5fcmVxSWQsY29tcG9uZW50OnRoaXMuX2NvbXBvbmVudCxvcHRpb25zOnQsY2FsbGJhY2s6bn0sdGhpcy5fcGFnZUlkKSl9ZGlzY29ubmVjdCgpe3RoaXMuX3JlcUlkJiZkcyh7cmVxSWQ6dGhpcy5fcmVxSWQsY29tcG9uZW50OnRoaXMuX2NvbXBvbmVudH0sdGhpcy5fcGFnZUlkKX19bGV0IHdfPUR0KCJjcmVhdGVNZWRpYVF1ZXJ5T2JzZXJ2ZXIiLGU9PihlPWFlLnJlc29sdmVDb21wb25lbnRJbnN0YW5jZShlKSxlJiYhbnIoZSkmJihlPW51bGwpLGU/bmV3IF9oKGUpOm5ldyBfaCh4cigpKSkpLFNfPTAsQ2Y9e307ZnVuY3Rpb24gQ18oZSx0LG4scil7bGV0IHM9e29wdGlvbnM6cn0sZD1yJiYoInN1Y2Nlc3MiaW4gcnx8ImZhaWwiaW4gcnx8ImNvbXBsZXRlImluIHIpO2lmKGQpe2xldCBnPVN0cmluZyhTXysrKTtzLmNhbGxiYWNrSWQ9ZyxDZltnXT1yfWJ0Lmludm9rZVZpZXdNZXRob2QoYGVkaXRvci4ke2V9YCx7dHlwZTpuLGRhdGE6c30sdCwoe2NhbGxiYWNrSWQ6ZyxkYXRhOnl9KT0+e2QmJihhZS5jYWxsT3B0aW9ucyhDZltnXSx5KSxkZWxldGUgQ2ZbZ10pfSl9Y2xhc3MgQV97Y29uc3RydWN0b3IodCxuKXt0aGlzLmlkPXQsdGhpcy5wYWdlSWQ9bn1mb3JtYXQodCxuKXt0aGlzLl9leGVjKCJmb3JtYXQiLHtuYW1lOnQsdmFsdWU6bn0pfWluc2VydERpdmlkZXIoKXt0aGlzLl9leGVjKCJpbnNlcnREaXZpZGVyIil9aW5zZXJ0SW1hZ2UodCl7dGhpcy5fZXhlYygiaW5zZXJ0SW1hZ2UiLHQpfWluc2VydFRleHQodCl7dGhpcy5fZXhlYygiaW5zZXJ0VGV4dCIsdCl9c2V0Q29udGVudHModCl7dGhpcy5fZXhlYygic2V0Q29udGVudHMiLHQpfWdldENvbnRlbnRzKHQpe3RoaXMuX2V4ZWMoImdldENvbnRlbnRzIix0KX1jbGVhcih0KXt0aGlzLl9leGVjKCJjbGVhciIsdCl9cmVtb3ZlRm9ybWF0KHQpe3RoaXMuX2V4ZWMoInJlbW92ZUZvcm1hdCIsdCl9dW5kbyh0KXt0aGlzLl9leGVjKCJ1bmRvIix0KX1yZWRvKHQpe3RoaXMuX2V4ZWMoInJlZG8iLHQpfWJsdXIodCl7dGhpcy5fZXhlYygiYmx1ciIsdCl9Z2V0U2VsZWN0aW9uVGV4dCh0KXt0aGlzLl9leGVjKCJnZXRTZWxlY3Rpb25UZXh0Iix0KX1zY3JvbGxJbnRvVmlldyh0KXt0aGlzLl9leGVjKCJzY3JvbGxJbnRvVmlldyIsdCl9X2V4ZWModCxuKXtDXyh0aGlzLmlkLHRoaXMucGFnZUlkLHQsbil9fWxldCBPXz17Y2FudmFzOnR1LG1hcDp3Zix2aWRlbzpFZixlZGl0b3I6QV99O2Z1bmN0aW9uIGJoKGUpe2lmKGUmJmUuY29udGV4dEluZm8pe2xldHtpZDp0LHR5cGU6bixwYWdlOnJ9PWUuY29udGV4dEluZm8scz1PX1tuXTtlLmNvbnRleHQ9bmV3IHModCxyKSxkZWxldGUgZS5jb250ZXh0SW5mb319Y2xhc3MgQWZ7Y29uc3RydWN0b3IodCxuLHIscyl7dGhpcy5fc2VsZWN0b3JRdWVyeT10LHRoaXMuX2NvbXBvbmVudD1uLHRoaXMuX3NlbGVjdG9yPXIsdGhpcy5fc2luZ2xlPXN9Ym91bmRpbmdDbGllbnRSZWN0KHQpe3JldHVybiB0aGlzLl9zZWxlY3RvclF1ZXJ5Ll9wdXNoKHRoaXMuX3NlbGVjdG9yLHRoaXMuX2NvbXBvbmVudCx0aGlzLl9zaW5nbGUse2lkOiEwLGRhdGFzZXQ6ITAscmVjdDohMCxzaXplOiEwfSx0KSx0aGlzLl9zZWxlY3RvclF1ZXJ5fWZpZWxkcyh0LG4pe3JldHVybiB0aGlzLl9zZWxlY3RvclF1ZXJ5Ll9wdXNoKHRoaXMuX3NlbGVjdG9yLHRoaXMuX2NvbXBvbmVudCx0aGlzLl9zaW5nbGUsdCxuKSx0aGlzLl9zZWxlY3RvclF1ZXJ5fXNjcm9sbE9mZnNldCh0KXtyZXR1cm4gdGhpcy5fc2VsZWN0b3JRdWVyeS5fcHVzaCh0aGlzLl9zZWxlY3Rvcix0aGlzLl9jb21wb25lbnQsdGhpcy5fc2luZ2xlLHtpZDohMCxkYXRhc2V0OiEwLHNjcm9sbE9mZnNldDohMH0sdCksdGhpcy5fc2VsZWN0b3JRdWVyeX1jb250ZXh0KHQpe3JldHVybiB0aGlzLl9zZWxlY3RvclF1ZXJ5Ll9wdXNoKHRoaXMuX3NlbGVjdG9yLHRoaXMuX2NvbXBvbmVudCx0aGlzLl9zaW5nbGUse2NvbnRleHQ6ITB9LHQpLHRoaXMuX3NlbGVjdG9yUXVlcnl9bm9kZSh0KXtyZXR1cm4gdGhpcy5fc2VsZWN0b3JRdWVyeX19Y2xhc3MgVF97Y29uc3RydWN0b3IodCl7dGhpcy5fY29tcG9uZW50PXZvaWQgMCx0aGlzLl9wYWdlPXQsdGhpcy5fcXVldWU9W10sdGhpcy5fcXVldWVDYj1bXX1leGVjKHQpe3JldHVybiBUbyh0aGlzLl9wYWdlLHRoaXMuX3F1ZXVlLG49PntsZXQgcj10aGlzLl9xdWV1ZUNiO24uZm9yRWFjaCgocyxkKT0+e1EuaXNBcnJheShzKT9zLmZvckVhY2goYmgpOmJoKHMpO2xldCBnPXJbZF07US5pc0Z1bmN0aW9uKGcpJiZnLmNhbGwodGhpcyxzKX0pLFEuaXNGdW5jdGlvbih0KSYmdC5jYWxsKHRoaXMsbil9KSx0aGlzLl9ub2Rlc1JlZn1pbih0KXtyZXR1cm4gdGhpcy5fY29tcG9uZW50PWFlLnJlc29sdmVDb21wb25lbnRJbnN0YW5jZSh0KSx0aGlzfXNlbGVjdCh0KXtyZXR1cm4gdGhpcy5fbm9kZXNSZWY9bmV3IEFmKHRoaXMsdGhpcy5fY29tcG9uZW50LHQsITApfXNlbGVjdEFsbCh0KXtyZXR1cm4gdGhpcy5fbm9kZXNSZWY9bmV3IEFmKHRoaXMsdGhpcy5fY29tcG9uZW50LHQsITEpfXNlbGVjdFZpZXdwb3J0KCl7cmV0dXJuIHRoaXMuX25vZGVzUmVmPW5ldyBBZih0aGlzLG51bGwsIiIsITApfV9wdXNoKHQsbixyLHMsZCl7dGhpcy5fcXVldWUucHVzaCh7Y29tcG9uZW50Om4sc2VsZWN0b3I6dCxzaW5nbGU6cixmaWVsZHM6c30pLHRoaXMuX3F1ZXVlQ2IucHVzaChkKX19bGV0IElfPUR0KCJjcmVhdGVTZWxlY3RvclF1ZXJ5IixlPT4oZT1hZS5yZXNvbHZlQ29tcG9uZW50SW5zdGFuY2UoZSksZSYmIW5yKGUpJiYoZT1udWxsKSxuZXcgVF8oZXx8eHIoKSkpKSxQXz0iY3JlYXRlQW5pbWF0aW9uIixOXz17Zm9ybWF0QXJnczp7fX0sa189e2R1cmF0aW9uOk51bWJlcix0aW1pbmdGdW5jdGlvbjpTdHJpbmcsZGVsYXk6TnVtYmVyLHRyYW5zZm9ybU9yaWdpbjpTdHJpbmd9LFJfPXtkdXJhdGlvbjo0MDAsdGltaW5nRnVuY3Rpb246ImxpbmVhciIsZGVsYXk6MCx0cmFuc2Zvcm1PcmlnaW46IjUwJSA1MCUgMCJ9O2NsYXNzIHloe2NvbnN0cnVjdG9yKHQpe3RoaXMuYWN0aW9ucz1bXSx0aGlzLmN1cnJlbnRUcmFuc2Zvcm09e30sdGhpcy5jdXJyZW50U3RlcEFuaW1hdGVzPVtdLHRoaXMub3B0aW9uPVEuZXh0ZW5kKHt9LFJfLHQpfV9nZXRPcHRpb24odCl7bGV0IG49e3RyYW5zaXRpb246US5leHRlbmQoe30sdGhpcy5vcHRpb24sdCksdHJhbnNmb3JtT3JpZ2luOiIifTtyZXR1cm4gbi50cmFuc2Zvcm1PcmlnaW49bi50cmFuc2l0aW9uLnRyYW5zZm9ybU9yaWdpbixkZWxldGUgbi50cmFuc2l0aW9uLnRyYW5zZm9ybU9yaWdpbixufV9wdXNoQW5pbWF0ZXModCxuKXt0aGlzLmN1cnJlbnRTdGVwQW5pbWF0ZXMucHVzaCh7dHlwZTp0LGFyZ3M6bn0pfV9jb252ZXJUeXBlKHQpe3JldHVybiB0LnJlcGxhY2UoL1tBLVpdL2csbj0+YC0ke24udG9Mb3dlckNhc2UoKX1gKX1fZ2V0VmFsdWUodCl7cmV0dXJuIHR5cGVvZiB0PT0ibnVtYmVyIj9gJHt0fXB4YDp0fWV4cG9ydCgpe2xldCB0PXRoaXMuYWN0aW9ucztyZXR1cm4gdGhpcy5hY3Rpb25zPVtdLHthY3Rpb25zOnR9fXN0ZXAodCl7cmV0dXJuIHRoaXMuY3VycmVudFN0ZXBBbmltYXRlcy5mb3JFYWNoKG49PntuLnR5cGUhPT0ic3R5bGUiP3RoaXMuY3VycmVudFRyYW5zZm9ybVtuLnR5cGVdPW46dGhpcy5jdXJyZW50VHJhbnNmb3JtW2Ake24udHlwZX0uJHtuLmFyZ3NbMF19YF09bn0pLHRoaXMuYWN0aW9ucy5wdXNoKHthbmltYXRlczpPYmplY3QudmFsdWVzKHRoaXMuY3VycmVudFRyYW5zZm9ybSksb3B0aW9uOnRoaXMuX2dldE9wdGlvbih0KX0pLHRoaXMuY3VycmVudFN0ZXBBbmltYXRlcz1bXSx0aGlzfX1sZXQgeF89YWUub25jZSgoKT0+e2xldCBlPVsibWF0cml4IiwibWF0cml4M2QiLCJyb3RhdGUiLCJyb3RhdGUzZCIsInJvdGF0ZVgiLCJyb3RhdGVZIiwicm90YXRlWiIsInNjYWxlIiwic2NhbGUzZCIsInNjYWxlWCIsInNjYWxlWSIsInNjYWxlWiIsInNrZXciLCJza2V3WCIsInNrZXdZIiwidHJhbnNsYXRlIiwidHJhbnNsYXRlM2QiLCJ0cmFuc2xhdGVYIiwidHJhbnNsYXRlWSIsInRyYW5zbGF0ZVoiXSx0PVsib3BhY2l0eSIsImJhY2tncm91bmRDb2xvciJdLG49WyJ3aWR0aCIsImhlaWdodCIsImxlZnQiLCJyaWdodCIsInRvcCIsImJvdHRvbSJdO2UuY29uY2F0KHQsbikuZm9yRWFjaChyPT57eWgucHJvdG90eXBlW3JdPWZ1bmN0aW9uKC4uLnMpe3JldHVybiB0LmNvbmNhdChuKS5pbmNsdWRlcyhyKT90aGlzLl9wdXNoQW5pbWF0ZXMoInN0eWxlIixbdGhpcy5fY29udmVyVHlwZShyKSxuLmluY2x1ZGVzKHIpP3RoaXMuX2dldFZhbHVlKHNbMF0pOnNbMF1dKTp0aGlzLl9wdXNoQW5pbWF0ZXMocixzKSx0aGlzfX0pfSksQl89RHQoUF8sZT0+KHhfKCksbmV3IHloKGUpKSxrXyxOXyksRWg9Im9uVGFiQmFyTWlkQnV0dG9uVGFwIixNXz1ObihFaCwoKT0+e30pLERfPSJvbldpbmRvd1Jlc2l6ZSIsRl89Im9mZldpbmRvd1Jlc2l6ZSIsTF89Tm4oRF8sKCk9Pnt9KSxWXz1scihGXywoKT0+e30pLHdoPSJzZXRMb2NhbGUiLCRfPSJnZXRMb2NhbGUiLFNoPSJvbkxvY2FsZUNoYW5nZSIsbnU9RHQoJF8sKCk9PntsZXQgZT1Fbih7YWxsb3dEZWZhdWx0OiEwfSk7cmV0dXJuIGUmJmUuJHZtP2UuJHZtLiRsb2NhbGU6WigpLmdldExvY2FsZSgpfSksVV89Tm4oU2gsKCk9Pnt9KSxIXz1EdCh3aCxlPT57bGV0IHQ9RW4oKTtyZXR1cm4gdCYmdC4kdm0uJGxvY2FsZSE9PWU/KHQuJHZtLiRsb2NhbGU9ZSxHbigpLmZvckVhY2gocz0+e2J0LnB1Ymxpc2hIYW5kbGVyKHdoLGUscy4kcGFnZS5pZCl9KSx2LnJlcXVpcmVNb2R1bGUoInBsdXMiKS5zZXRMYW5ndWFnZShlKSxidC5pbnZva2VPbkNhbGxiYWNrKFNoLHtsb2NhbGU6ZX0pLCEwKTohMX0pLGpfPVJlKCJzZXRQYWdlTWV0YSIsKGUse3Jlc29sdmU6dH0pPT57dChCaSh4cigpLGUpKX0pLENoPSJnZXRTZWxlY3RlZFRleHRSYW5nZSIsel89UmUoQ2gsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57YnQuaW52b2tlVmlld01ldGhvZChDaCx7fSxjYSgpLHI9Pnt0eXBlb2Ygci5lbmQ9PSJ1bmRlZmluZWQiJiZ0eXBlb2Ygci5zdGFydD09InVuZGVmaW5lZCI/bigibm8gZm9jdXNlZCIpOnQocil9KX0pLFR1PXtbYWUuT05fVU5IQU5ETEVfUkVKRUNUSU9OXTpbXSxbYWUuT05fUEFHRV9OT1RfRk9VTkRdOltdLFthZS5PTl9FUlJPUl06W10sW2FlLk9OX1NIT1ddOltdLFthZS5PTl9ISURFXTpbXX07ZnVuY3Rpb24gcnUoZSx0KXtsZXQgbj1Fbih7YWxsb3dEZWZhdWx0OiEwfSk7aWYobiYmbi4kdm0pcmV0dXJuIGhuLmluamVjdEhvb2soZSx0LG4uJHZtLiQpO1R1W2VdLnB1c2godCl9ZnVuY3Rpb24gV18oZSl7T2JqZWN0LmtleXMoVHUpLmZvckVhY2godD0+e1R1W3RdLmZvckVhY2gobj0+e2huLmluamVjdEhvb2sodCxuLGUpfSl9KX1mdW5jdGlvbiBpdShlLHQpe2xldCBuPUVuKHthbGxvd0RlZmF1bHQ6ITB9KTtpZihuJiZuLiR2bSlyZXR1cm4gRWkobi4kdm0sZSx0KTtRLnJlbW92ZShUdVtlXSx0KX1mdW5jdGlvbiBHXyhlKXtydShhZS5PTl9VTkhBTkRMRV9SRUpFQ1RJT04sZSl9ZnVuY3Rpb24gWV8oZSl7aXUoYWUuT05fVU5IQU5ETEVfUkVKRUNUSU9OLGUpfWZ1bmN0aW9uIHFfKGUpe3J1KGFlLk9OX1BBR0VfTk9UX0ZPVU5ELGUpfWZ1bmN0aW9uIEtfKGUpe2l1KGFlLk9OX1BBR0VfTk9UX0ZPVU5ELGUpfWZ1bmN0aW9uIEpfKGUpe3J1KGFlLk9OX0VSUk9SLGUpfWZ1bmN0aW9uIFpfKGUpe2l1KGFlLk9OX0VSUk9SLGUpfWZ1bmN0aW9uIFhfKGUpe3J1KGFlLk9OX1NIT1csZSl9ZnVuY3Rpb24gUV8oZSl7aXUoYWUuT05fU0hPVyxlKX1mdW5jdGlvbiBlYihlKXtydShhZS5PTl9ISURFLGUpfWZ1bmN0aW9uIHRiKGUpe2l1KGFlLk9OX0hJREUsZSl9bGV0IG5iPUR0KCJnZXRFbnRlck9wdGlvbnNTeW5jIiwoKT0+RHMoKSkscmI9RHQoImdldExhdW5jaE9wdGlvbnNTeW5jIiwoKT0+WGEoKSksb3UsT2YsVGYsQWg7ZnVuY3Rpb24gT2goZSl7dHJ5e3JldHVybiBKU09OLnBhcnNlKGUpfWNhdGNoKHQpe31yZXR1cm4gZX1mdW5jdGlvbiBJZihlKXtpZihlLnR5cGU9PT0iZW5hYmxlZCIpVGY9ITAsQWg9ZS5vZmZsaW5lO2Vsc2UgaWYoZS50eXBlPT09ImNsaWVudElkIilvdT1lLmNpZCxPZj1lLmVyck1zZyxUaChvdSxlLmVyck1zZyk7ZWxzZSBpZihlLnR5cGU9PT0icHVzaE1zZyIpe2xldCB0PXt0eXBlOiJyZWNlaXZlIixkYXRhOk9oKGUubWVzc2FnZSl9O2ZvcihsZXQgbj0wO248aGwubGVuZ3RoJiYoaGxbbl0odCksIXQuc3RvcHBlZCk7bisrKTt9ZWxzZSBlLnR5cGU9PT0iY2xpY2siJiZobC5mb3JFYWNoKHQ9Pnt0KHt0eXBlOiJjbGljayIsZGF0YTpPaChlLm1lc3NhZ2UpfSl9KX1sZXQgUGY9W107ZnVuY3Rpb24gVGgoZSx0KXtQZi5mb3JFYWNoKG49PntuKGUsdCl9KSxQZi5sZW5ndGg9MH1sZXQgaWI9UmUoImdldFB1c2hDbGllbnRJZCIsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57aWYoQWgpe2MucHVzaC5nZXRDbGllbnRJbmZvQXN5bmMocj0+e3Qoe2NpZDpyLmNsaWVudGlkfSl9LHI9PntuKHIuY29kZSsiOiAiK3IubWVzc2FnZSl9KTtyZXR1cm59UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+e3R5cGVvZiBUZj09InVuZGVmaW5lZCImJihUZj0hMSxvdT0iIixPZj0idW5pUHVzaCBpcyBub3QgZW5hYmxlZCIpLFBmLnB1c2goKHIscyk9PntyP3Qoe2NpZDpyfSk6bihzKX0pLHR5cGVvZiBvdSE9InVuZGVmaW5lZCImJlRoKG91LE9mKX0pfSksaGw9W10sSWg9ITEsb2I9ZT0+e2hsLmluZGV4T2YoZSk9PT0tMSYmaGwucHVzaChlKSxJaHx8KEloPSEwLGMucHVzaC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdD0+e0lmKHt0eXBlOiJjbGljayIsbWVzc2FnZTp0fSl9KSxjLnB1c2guYWRkRXZlbnRMaXN0ZW5lcigicmVjZWl2ZSIsdD0+e0lmKHt0eXBlOiJwdXNoTXNnIixtZXNzYWdlOnR9KX0pKX0sYWI9ZT0+e2lmKCFlKWhsLmxlbmd0aD0wO2Vsc2V7bGV0IHQ9aGwuaW5kZXhPZihlKTt0Pi0xJiZobC5zcGxpY2UodCwxKX19LHNiPSJjYW5JVXNlIixsYj1be25hbWU6InNjaGVtYSIsdHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9XSxjYj0iZ2V0QmFja2dyb3VuZEF1ZGlvTWFuYWdlciIsdWI9Im1ha2VQaG9uZUNhbGwiLGZiPXtwaG9uZU51bWJlcjpTdHJpbmd9LGRiPSJhZGRQaG9uZUNvbnRhY3QiLGhiPXtmb3JtYXRBcmdzOntmaXJzdE5hbWUoZSl7aWYoIWUpcmV0dXJuImFkZFBob25lQ29udGFjdDpmYWlsIHBhcmFtZXRlciBlcnJvcjogcGFyYW1ldGVyLmZpcnN0TmFtZSBzaG91bGQgbm90IGJlIGVtcHR5OyJ9fX0scGI9e2ZpcnN0TmFtZTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LHBob3RvRmlsZVBhdGg6U3RyaW5nLG5pY2tOYW1lOlN0cmluZyxsYXN0TmFtZTpTdHJpbmcsbWlkZGxlTmFtZTpTdHJpbmcscmVtYXJrOlN0cmluZyxtb2JpbGVQaG9uZU51bWJlcjpTdHJpbmcsd2VDaGF0TnVtYmVyOlN0cmluZyxhZGRyZXNzQ291bnRyeTpTdHJpbmcsYWRkcmVzc1N0YXRlOlN0cmluZyxhZGRyZXNzQ2l0eTpTdHJpbmcsYWRkcmVzc1N0cmVldDpTdHJpbmcsYWRkcmVzc1Bvc3RhbENvZGU6U3RyaW5nLG9yZ2FuaXphdGlvbjpTdHJpbmcsdGl0bGU6U3RyaW5nLHdvcmtGYXhOdW1iZXI6U3RyaW5nLHdvcmtQaG9uZU51bWJlcjpTdHJpbmcsaG9zdE51bWJlcjpTdHJpbmcsZW1haWw6U3RyaW5nLHVybDpTdHJpbmcsd29ya0FkZHJlc3NDb3VudHJ5OlN0cmluZyx3b3JrQWRkcmVzc1N0YXRlOlN0cmluZyx3b3JrQWRkcmVzc0NpdHk6U3RyaW5nLHdvcmtBZGRyZXNzU3RyZWV0OlN0cmluZyx3b3JrQWRkcmVzc1Bvc3RhbENvZGU6U3RyaW5nLGhvbWVGYXhOdW1iZXI6U3RyaW5nLGhvbWVQaG9uZU51bWJlcjpTdHJpbmcsaG9tZUFkZHJlc3NDb3VudHJ5OlN0cmluZyxob21lQWRkcmVzc1N0YXRlOlN0cmluZyxob21lQWRkcmVzc0NpdHk6U3RyaW5nLGhvbWVBZGRyZXNzU3RyZWV0OlN0cmluZyxob21lQWRkcmVzc1Bvc3RhbENvZGU6U3RyaW5nfSxnYj0iZ2V0Q2xpcGJvYXJkRGF0YSIsdmI9InNldENsaXBib2FyZERhdGEiLG1iPXtmb3JtYXRBcmdzOntzaG93VG9hc3Q6ITB9LGJlZm9yZUludm9rZSgpe1BvKCl9LGJlZm9yZVN1Y2Nlc3MoZSx0KXtpZighdC5zaG93VG9hc3QpcmV0dXJuO2xldHt0Om59PVooKSxyPW4oInVuaS5zZXRDbGlwYm9hcmREYXRhLnN1Y2Nlc3MiKTtyJiZzZS5zaG93VG9hc3Qoe3RpdGxlOnIsaWNvbjoic3VjY2VzcyIsbWFzazohMX0pfX0sX2I9e2RhdGE6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxzaG93VG9hc3Q6e3R5cGU6Qm9vbGVhbn19LFBoPSJvbkFjY2VsZXJvbWV0ZXIiLGJiPSJvZmZBY2NlbGVyb21ldGVyIix5Yj0ic3RhcnRBY2NlbGVyb21ldGVyIixFYj0ic3RvcEFjY2VsZXJvbWV0ZXIiLE5oPSJvbkNvbXBhc3MiLHdiPSJvZmZDb21wYXNzIixTYj0ic3RhcnRDb21wYXNzIixDYj0ic3RvcENvbXBhc3MiLEFiPSJ2aWJyYXRlU2hvcnQiLE9iPSJ2aWJyYXRlTG9uZyIsa2g9Im9uQmx1ZXRvb3RoRGV2aWNlRm91bmQiLFJoPSJvbkJsdWV0b290aEFkYXB0ZXJTdGF0ZUNoYW5nZSIseGg9Im9uQkxFQ29ubmVjdGlvblN0YXRlQ2hhbmdlIixCaD0ib25CTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlIixUYj0ic3RhcnRCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5IixJYj17c2VydmljZXM6QXJyYXksYWxsb3dEdXBsaWNhdGVzS2V5OkJvb2xlYW4saW50ZXJ2YWw6TnVtYmVyfSxQYj0iZ2V0Q29ubmVjdGVkQmx1ZXRvb3RoRGV2aWNlcyIsTmI9e3NlcnZpY2VzOnt0eXBlOkFycmF5LHJlcXVpcmVkOiEwfX0sa2I9ImNyZWF0ZUJMRUNvbm5lY3Rpb24iLFJiPXtkZXZpY2VJZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSx4Yj0iY2xvc2VCTEVDb25uZWN0aW9uIixCYj17ZGV2aWNlSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sTWI9ImdldEJMRURldmljZVNlcnZpY2VzIixEYj17ZGV2aWNlSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sRmI9ImdldEJMRURldmljZUNoYXJhY3RlcmlzdGljcyIsTGI9e2RldmljZUlkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sc2VydmljZUlkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LFZiPSJub3RpZnlCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlIiwkYj17ZGV2aWNlSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxzZXJ2aWNlSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxjaGFyYWN0ZXJpc3RpY0lkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sc3RhdGU6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMH19LFViPSJyZWFkQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZSIsSGI9e2RldmljZUlkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sc2VydmljZUlkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sY2hhcmFjdGVyaXN0aWNJZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSxqYj0id3JpdGVCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlIix6Yj17ZGV2aWNlSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxzZXJ2aWNlSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxjaGFyYWN0ZXJpc3RpY0lkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sdmFsdWU6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITB9fSxXYj0ic2V0QkxFTVRVIixHYj17ZGV2aWNlSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxtdHU6e3R5cGU6TnVtYmVyLHJlcXVpcmVkOiEwfX0sWWI9ImdldEJMRURldmljZVJTU0kiLHFiPXtkZXZpY2VJZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSxNaD0ib25CZWFjb25VcGRhdGUiLERoPSJvbkJlYWNvblNlcnZpY2VDaGFuZ2UiLEtiPSJnZXRCZWFjb25zIixKYj0ic3RhcnRCZWFjb25EaXNjb3ZlcnkiLFpiPXt1dWlkczp7dHlwZTpBcnJheSxyZXF1aXJlZDohMH19LFhiPSJzdG9wQmVhY29uRGlzY292ZXJ5IixRYj0iZ2V0U2NyZWVuQnJpZ2h0bmVzcyIsZTA9InNldFNjcmVlbkJyaWdodG5lc3MiLHQwPSJzZXRLZWVwU2NyZWVuT24iLG4wPSJzb3RlckF1dGhlbnRpY2F0aW9uIixyMD0iY2hlY2tJc1NvdGVyRW5yb2xsZWRJbkRldmljZSIsaTA9WyJmaW5nZXJQcmludCIsImZhY2lhbCIsInNwZWVjaCJdLG8wPXtmb3JtYXRBcmdzOntjaGVja0F1dGhNb2RlKGUsdCl7aWYoIWV8fCFpMC5pbmNsdWRlcyhlKSlyZXR1cm4iY2hlY2tBdXRoTW9kZSBcdTU4NkJcdTUxOTlcdTk1MTlcdThCRUYifX19LGEwPXtjaGVja0F1dGhNb2RlOlN0cmluZ30sczA9ImNoZWNrSXNTb3RlckVucm9sbGVkSW5EZXZpY2UiLGwwPXtmb3JtYXRBcmdzOntyZXF1ZXN0QXV0aE1vZGVzKGUsdCl7aWYoIWUuaW5jbHVkZXMoImZpbmdlclByaW50IikmJiFlLmluY2x1ZGVzKCJmYWNpYWwiKSlyZXR1cm4icmVxdWVzdEF1dGhNb2RlcyBcdTU4NkJcdTUxOTlcdTk1MTlcdThCRUYifX19LGMwPXtyZXF1ZXN0QXV0aE1vZGVzOnt0eXBlOkFycmF5LHJlcXVpcmVkOiEwfSxjaGFsbGVuZ2U6U3RyaW5nLGF1dGhDb250ZW50OlN0cmluZ30sdTA9InNjYW5Db2RlIixmMD17b25seUZyb21DYW1lcmE6Qm9vbGVhbixzY2FuVHlwZTpBcnJheSxhdXRvRGVjb2RlQ2hhclNldDpCb29sZWFuLHNvdW5kOlN0cmluZyxhdXRvWm9vbTpCb29sZWFufSxkMD1bImRlZmF1bHQiLCJub25lIl0saDA9e2Zvcm1hdEFyZ3M6e3NvdW5kKGUsdCl7ZDAuaW5jbHVkZXMoZSl8fCh0LnNvdW5kPSJub25lIil9LGF1dG9ab29tKGUsdCl7dHlwZW9mIGU9PSJ1bmRlZmluZWQiJiYodC5hdXRvWm9vbT0hMCl9fX0scDA9ImdldFN5c3RlbVNldHRpbmciLGcwPSJnZXRBcHBBdXRob3JpemVTZXR0aW5nIix2MD0ib3BlbkFwcEF1dGhvcml6ZVNldHRpbmciLG0wPSJnZXRTdG9yYWdlIixGaD17a2V5Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LF8wPSJnZXRTdG9yYWdlU3luYyIsTGg9W3tuYW1lOiJrZXkiLHR5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfV0sYjA9InNldFN0b3JhZ2UiLHkwPXtrZXk6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxkYXRhOntyZXF1aXJlZDohMH19LEUwPSJzZXRTdG9yYWdlU3luYyIsdzA9W3tuYW1lOiJrZXkiLHR5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSx7bmFtZToiZGF0YSIscmVxdWlyZWQ6ITB9XSxWaD0icmVtb3ZlU3RvcmFnZSIsUzA9RmgsQzA9TGgsQTA9InNhdmVGaWxlIixPMD17Zm9ybWF0QXJnczp7dGVtcEZpbGVQYXRoKGUsdCl7dC50ZW1wRmlsZVBhdGg9U3QoZSl9fX0sVDA9e3RlbXBGaWxlUGF0aDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSxJMD0iZ2V0U2F2ZWRGaWxlTGlzdCIsUDA9InJlbW92ZVNhdmVkRmlsZSIsTjA9e2Zvcm1hdEFyZ3M6e2ZpbGVQYXRoKGUsdCl7dC5maWxlUGF0aD1TdChlKX19fSxrMD17ZmlsZVBhdGg6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sUjA9ImdldEZpbGVJbmZvIix4MD17Zm9ybWF0QXJnczp7ZmlsZVBhdGgoZSx0KXt0LmZpbGVQYXRoPVN0KGUpfX19LEIwPXtmaWxlUGF0aDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSxNMD0iZ2V0U2F2ZWRGaWxlSW5mbyIsRDA9e2Zvcm1hdEFyZ3M6e2ZpbGVQYXRoKGUsdCl7dC5maWxlUGF0aD1TdChlKX19fSxGMD17ZmlsZVBhdGg6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sTDA9Im9wZW5Eb2N1bWVudCIsVjA9e2Zvcm1hdEFyZ3M6e2ZpbGVQYXRoKGUsdCl7dC5maWxlUGF0aD1TdChlKX19fSwkMD17ZmlsZVBhdGg6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxmaWxlVHlwZTpTdHJpbmd9LFUwPSJoaWRlS2V5Ym9hcmQiLEgwPSJzaG93S2V5Ym9hcmQiLGowPSJjaG9vc2VMb2NhdGlvbiIsejA9e2tleXdvcmQ6U3RyaW5nLGxhdGl0dWRlOk51bWJlcixsb25naXR1ZGU6TnVtYmVyfSxXMD0iZ2V0TG9jYXRpb24iLCRoPVsid2dzODQiLCJnY2owMiJdLEcwPXtmb3JtYXRBcmdzOnt0eXBlKGUsdCl7ZT0oZXx8IiIpLnRvTG93ZXJDYXNlKCksJGguaW5kZXhPZihlKT09PS0xP3QudHlwZT0kaFswXTp0LnR5cGU9ZX0sYWx0aXR1ZGUoZSx0KXt0LmFsdGl0dWRlPWV8fCExfX19LFkwPXt0eXBlOlN0cmluZyxhbHRpdHVkZTpCb29sZWFufSxxMD0ib3BlbkxvY2F0aW9uIixVaD0oZSx0KT0+e2lmKHQ9PT12b2lkIDApcmV0dXJuYCR7ZX0gc2hvdWxkIG5vdCBiZSBlbXB0eS5gO2lmKHR5cGVvZiB0IT0ibnVtYmVyIil7bGV0IG49dHlwZW9mIHQ7cmV0dXJuIG49blswXS50b1VwcGVyQ2FzZSgpK24uc3Vic3RyaW5nKDEpLGBFeHBlY3RlZCBOdW1iZXIsIGdvdCAke259IHdpdGggdmFsdWUgJHtKU09OLnN0cmluZ2lmeSh0KX0uYH19LEswPXtmb3JtYXRBcmdzOntsYXRpdHVkZShlLHQpe2xldCBuPVVoKCJsYXRpdHVkZSIsZSk7aWYobilyZXR1cm4gbjt0LmxhdGl0dWRlPWV9LGxvbmdpdHVkZShlLHQpe2xldCBuPVVoKCJsb25naXR1ZGUiLGUpO2lmKG4pcmV0dXJuIG47dC5sb25naXR1ZGU9ZX0sc2NhbGUoZSx0KXtlPU1hdGguZmxvb3IoZSksdC5zY2FsZT1lPj01JiZlPD0xOD9lOjE4fX19LEowPXtsYXRpdHVkZTpOdW1iZXIsbG9uZ2l0dWRlOk51bWJlcixzY2FsZTpOdW1iZXIsbmFtZTpTdHJpbmcsYWRkcmVzczpTdHJpbmd9LFowPSJjaG9vc2VJbWFnZSIsWDA9e2Zvcm1hdEFyZ3M6e2NvdW50KGUsdCl7KCFlfHxlPD0wKSYmKHQuY291bnQ9OSl9LHNpemVUeXBlKGUsdCl7dC5zaXplVHlwZT1QbihlLFRyKX0sc291cmNlVHlwZShlLHQpe3Quc291cmNlVHlwZT1QbihlLG1uKX0sZXh0ZW5zaW9uKGUsdCl7aWYoZSBpbnN0YW5jZW9mIEFycmF5JiZlLmxlbmd0aD09PTApcmV0dXJuInBhcmFtIGV4dGVuc2lvbiBzaG91bGQgbm90IGJlIGVtcHR5LiI7ZXx8KHQuZXh0ZW5zaW9uPVsiKiJdKX19fSxRMD17Y291bnQ6TnVtYmVyLHNpemVUeXBlOltBcnJheSxTdHJpbmddLHNvdXJjZVR5cGU6QXJyYXksZXh0ZW5zaW9uOkFycmF5fSxleT0iY2hvb3NlVmlkZW8iLHR5PXtmb3JtYXRBcmdzOntzb3VyY2VUeXBlKGUsdCl7dC5zb3VyY2VUeXBlPVBuKGUsbW4pfSxjb21wcmVzc2VkOiEwLG1heER1cmF0aW9uOjYwLGNhbWVyYToiYmFjayIsZXh0ZW5zaW9uKGUsdCl7aWYoZSBpbnN0YW5jZW9mIEFycmF5JiZlLmxlbmd0aD09PTApcmV0dXJuInBhcmFtIGV4dGVuc2lvbiBzaG91bGQgbm90IGJlIGVtcHR5LiI7ZXx8KHQuZXh0ZW5zaW9uPVsiKiJdKX19fSxueT17c291cmNlVHlwZTpBcnJheSxjb21wcmVzc2VkOkJvb2xlYW4sbWF4RHVyYXRpb246TnVtYmVyLGNhbWVyYTpTdHJpbmcsZXh0ZW5zaW9uOkFycmF5fSxyeT0iZ2V0SW1hZ2VJbmZvIixpeT17Zm9ybWF0QXJnczp7c3JjKGUsdCl7dC5zcmM9U3QoZSl9fX0sb3k9e3NyYzp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSxheT0icHJldmlld0ltYWdlIixzeT17Zm9ybWF0QXJnczp7dXJscyhlLHQpe3QudXJscz1lLm1hcChuPT5RLmlzU3RyaW5nKG4pJiZuP1N0KG4pOiIiKX0sY3VycmVudChlLHQpe3R5cGVvZiBlPT0ibnVtYmVyIj90LmN1cnJlbnQ9ZT4wJiZlPHQudXJscy5sZW5ndGg/ZTowOlEuaXNTdHJpbmcoZSkmJmUmJih0LmN1cnJlbnQ9U3QoZSkpfX19LGx5PXt1cmxzOnt0eXBlOkFycmF5LHJlcXVpcmVkOiEwfSxjdXJyZW50Ont0eXBlOltOdW1iZXIsU3RyaW5nXX19LGN5PSJjbG9zZVByZXZpZXdJbWFnZSIsdXk9ImdldFZpZGVvSW5mbyIsZnk9e2Zvcm1hdEFyZ3M6e3NyYyhlLHQpe3Quc3JjPVN0KGUpfX19LGR5PXtzcmM6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0saHk9InNhdmVJbWFnZVRvUGhvdG9zQWxidW0iLHB5PXtmb3JtYXRBcmdzOntmaWxlUGF0aChlLHQpe3QuZmlsZVBhdGg9U3QoZSl9fX0sZ3k9e2ZpbGVQYXRoOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LHZ5PSJzYXZlVmlkZW9Ub1Bob3Rvc0FsYnVtIixteT17Zm9ybWF0QXJnczp7ZmlsZVBhdGgoZSx0KXt0LmZpbGVQYXRoPVN0KGUpfX19LF95PXtmaWxlUGF0aDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSxieT0iZ2V0UmVjb3JkZXJNYW5hZ2VyIix5eT0iY29tcHJlc3NJbWFnZSIsRXk9e2Zvcm1hdEFyZ3M6e3NyYyhlLHQpe3Quc3JjPVN0KGUpfX19LHd5PXtzcmM6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sU3k9ImNvbXByZXNzVmlkZW8iLEN5PXtmb3JtYXRBcmdzOntzcmMoZSx0KXt0LnNyYz1TdChlKX19fSxBeT17c3JjOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0scXVhbGl0eTpTdHJpbmcsYml0cmF0ZTpOdW1iZXIsZnBzOk51bWJlcixyZXNvbHV0aW9uOk51bWJlcn0sT3k9InJlcXVlc3QiLFR5PXtKU09OOiJqc29uIn0sSXk9WyJ0ZXh0IiwiYXJyYXlidWZmZXIiXSxQeT0idGV4dCIsSGg9ZW5jb2RlVVJJQ29tcG9uZW50O2Z1bmN0aW9uIE55KGUsdCl7bGV0IG49ZS5zcGxpdCgiIyIpLHI9blsxXXx8IiI7bj1uWzBdLnNwbGl0KCI/Iik7bGV0IHM9blsxXXx8IiI7ZT1uWzBdO2xldCBkPXMuc3BsaXQoIiYiKS5maWx0ZXIoeT0+eSksZz17fTtkLmZvckVhY2goeT0+e2xldCB6PXkuc3BsaXQoIj0iKTtnW3pbMF1dPXpbMV19KTtmb3IobGV0IHkgaW4gdClpZihRLmhhc093bih0LHkpKXtsZXQgej10W3ldO3R5cGVvZiB6PT0idW5kZWZpbmVkInx8ej09PW51bGw/ej0iIjpRLmlzUGxhaW5PYmplY3QoeikmJih6PUpTT04uc3RyaW5naWZ5KHopKSxnW0hoKHkpXT1IaCh6KX1yZXR1cm4gcz1PYmplY3Qua2V5cyhnKS5tYXAoeT0+YCR7eX09JHtnW3ldfWApLmpvaW4oIiYiKSxlKyhzPyI/IitzOiIiKSsocj8iIyIrcjoiIil9bGV0IGt5PXttZXRob2Q6U3RyaW5nLGRhdGE6W09iamVjdCxTdHJpbmcsQXJyYXksQXJyYXlCdWZmZXJdLHVybDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LGhlYWRlcjpPYmplY3QsZGF0YVR5cGU6U3RyaW5nLHJlc3BvbnNlVHlwZTpTdHJpbmcsd2l0aENyZWRlbnRpYWxzOkJvb2xlYW59LFJ5PXtmb3JtYXRBcmdzOnttZXRob2QoZSx0KXt0Lm1ldGhvZD1hbigoZXx8IiIpLnRvVXBwZXJDYXNlKCksR3QpfSxkYXRhKGUsdCl7dC5kYXRhPWV8fCIifSx1cmwoZSx0KXt0Lm1ldGhvZD09PUd0WzBdJiZRLmlzUGxhaW5PYmplY3QodC5kYXRhKSYmT2JqZWN0LmtleXModC5kYXRhKS5sZW5ndGgmJih0LnVybD1OeShlLHQuZGF0YSkpfSxoZWFkZXIoZSx0KXtsZXQgbj10LmhlYWRlcj1lfHx7fTt0Lm1ldGhvZCE9PUd0WzBdJiYoT2JqZWN0LmtleXMobikuZmluZChyPT5yLnRvTG93ZXJDYXNlKCk9PT0iY29udGVudC10eXBlIil8fChuWyJDb250ZW50LVR5cGUiXT0iYXBwbGljYXRpb24vanNvbiIpKX0sZGF0YVR5cGUoZSx0KXt0LmRhdGFUeXBlPShlfHxUeS5KU09OKS50b0xvd2VyQ2FzZSgpfSxyZXNwb25zZVR5cGUoZSx0KXt0LnJlc3BvbnNlVHlwZT0oZXx8IiIpLnRvTG93ZXJDYXNlKCksSXkuaW5kZXhPZih0LnJlc3BvbnNlVHlwZSk9PT0tMSYmKHQucmVzcG9uc2VUeXBlPVB5KX19fSx4eT0iY29uZmlnTVRMUyIsQnk9e2NlcnRpZmljYXRlczp7dHlwZTpBcnJheSxyZXF1aXJlZDohMH19LE15PXtmb3JtYXRBcmdzOntjZXJ0aWZpY2F0ZXMoZSl7aWYoZS5zb21lKHQ9PlEudG9SYXdUeXBlKHQuaG9zdCkhPT0iU3RyaW5nIikpcmV0dXJuIlx1NTNDMlx1NjU3MFx1OTE0RFx1N0Y2RVx1OTUxOVx1OEJFRlx1RkYwQ1x1OEJGN1x1Nzg2RVx1OEJBNFx1NTQwRVx1OTFDRFx1OEJENSJ9fX0sRHk9ImRvd25sb2FkRmlsZSIsRnk9e2Zvcm1hdEFyZ3M6e2hlYWRlcihlLHQpe3QuaGVhZGVyPWV8fHt9fX19LEx5PXt1cmw6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxoZWFkZXI6T2JqZWN0LHRpbWVvdXQ6TnVtYmVyfSxWeT0idXBsb2FkRmlsZSIsJHk9e2Zvcm1hdEFyZ3M6e2ZpbGVQYXRoKGUsdCl7ZSYmKHQuZmlsZVBhdGg9U3QoZSkpfSxoZWFkZXIoZSx0KXt0LmhlYWRlcj1lfHx7fX0sZm9ybURhdGEoZSx0KXt0LmZvcm1EYXRhPWV8fHt9fX19LFV5PXt1cmw6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxmaWxlczpBcnJheSxmaWxlUGF0aDpTdHJpbmcsbmFtZTpTdHJpbmcsaGVhZGVyOk9iamVjdCxmb3JtRGF0YTpPYmplY3QsdGltZW91dDpOdW1iZXJ9LEh5PSJjb25uZWN0U29ja2V0IixqeT17Zm9ybWF0QXJnczp7aGVhZGVyKGUsdCl7dC5oZWFkZXI9ZXx8e319LG1ldGhvZChlLHQpe3QubWV0aG9kPWFuKChlfHwiIikudG9VcHBlckNhc2UoKSxHdCl9LHByb3RvY29scyhlLHQpe1EuaXNTdHJpbmcoZSkmJih0LnByb3RvY29scz1bZV0pfX19LHp5PXt1cmw6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxoZWFkZXI6e3R5cGU6T2JqZWN0fSxtZXRob2Q6U3RyaW5nLHByb3RvY29sczpbQXJyYXksU3RyaW5nXX0sV3k9InNlbmRTb2NrZXRNZXNzYWdlIixHeT17ZGF0YTpbU3RyaW5nLEFycmF5QnVmZmVyXX0sWXk9ImNsb3NlU29ja2V0IixxeT17Y29kZTpOdW1iZXIscmVhc29uOlN0cmluZ307ZnVuY3Rpb24gS3koZSl7aWYoIVEuaXNTdHJpbmcoZSkpcmV0dXJuIGU7bGV0IHQ9ZS5pbmRleE9mKCI/Iik7aWYodD09PS0xKXJldHVybiBlO2xldCBuPWUuc2xpY2UodCsxKS50cmltKCkucmVwbGFjZSgvXihcP3wjfCYpLywiIik7aWYoIW4pcmV0dXJuIGU7ZT1lLnNsaWNlKDAsdCk7bGV0IHI9W107cmV0dXJuIG4uc3BsaXQoIiYiKS5mb3JFYWNoKHM9PntsZXQgZD1zLnJlcGxhY2UoL1wrL2csIiAiKS5zcGxpdCgiPSIpLGc9ZC5zaGlmdCgpLHk9ZC5sZW5ndGg+MD9kLmpvaW4oIj0iKToiIjtyLnB1c2goZysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KHkpKX0pLHIubGVuZ3RoP2UrIj8iK3Iuam9pbigiJiIpOmV9bGV0IEp5PVsic2xpZGUtaW4tcmlnaHQiLCJzbGlkZS1pbi1sZWZ0Iiwic2xpZGUtaW4tdG9wIiwic2xpZGUtaW4tYm90dG9tIiwiZmFkZS1pbiIsInpvb20tb3V0Iiwiem9vbS1mYWRlLW91dCIsInBvcC1pbiIsIm5vbmUiXSxaeT1bInNsaWRlLW91dC1yaWdodCIsInNsaWRlLW91dC1sZWZ0Iiwic2xpZGUtb3V0LXRvcCIsInNsaWRlLW91dC1ib3R0b20iLCJmYWRlLW91dCIsInpvb20taW4iLCJ6b29tLWZhZGUtaW4iLCJwb3Atb3V0Iiwibm9uZSJdLHdjPXt1cmw6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sTmY9Im5hdmlnYXRlVG8iLGtmPSJyZWRpcmVjdFRvIixqaD0icmVMYXVuY2giLEl1PSJzd2l0Y2hUYWIiLFh5PSJuYXZpZ2F0ZUJhY2siLFJmPSJwcmVsb2FkUGFnZSIsemg9InVuUHJlbG9hZFBhZ2UiLFF5PVEuZXh0ZW5kKHt9LHdjLFdoKEp5KSksZUU9US5leHRlbmQoe2RlbHRhOnt0eXBlOk51bWJlcn19LFdoKFp5KSksdEU9d2MsbkU9d2MsckU9d2MsaUU9d2Msb0U9d2MsYUU9TnUoTmYpLHNFPU51KGtmKSxsRT1OdShqaCksY0U9TnUoSXUpLHVFPXtmb3JtYXRBcmdzOntkZWx0YShlLHQpe2U9cGFyc2VJbnQoZSsiIil8fDEsdC5kZWx0YT1NYXRoLm1pbihHbigpLmxlbmd0aC0xLGUpfX19O2Z1bmN0aW9uIFdoKGUpe3JldHVybnthbmltYXRpb25UeXBlOnt0eXBlOlN0cmluZyx2YWxpZGF0b3IodCl7aWYodCYmZS5pbmRleE9mKHQpPT09LTEpcmV0dXJuImAiK3QrImAgaXMgbm90IHN1cHBvcnRlZCBmb3IgYGFuaW1hdGlvblR5cGVgIChzdXBwb3J0ZWQgdmFsdWVzIGFyZTogYCIrZS5qb2luKCJgfGAiKSsiYCkifX0sYW5pbWF0aW9uRHVyYXRpb246e3R5cGU6TnVtYmVyfX19bGV0IFB1O2Z1bmN0aW9uIGZFKCl7UHU9IiJ9ZnVuY3Rpb24gTnUoZSl7cmV0dXJue2Zvcm1hdEFyZ3M6e3VybDpkRShlKX0sYmVmb3JlQWxsOmZFfX1mdW5jdGlvbiBkRShlKXtyZXR1cm4gZnVuY3Rpb24obixyKXtpZighbilyZXR1cm4nTWlzc2luZyByZXF1aXJlZCBhcmdzOiAidXJsIic7bj15bChuKTtsZXQgcz1uLnNwbGl0KCI/IilbMF0sZD1mbyhzLCEwKTtpZighZClyZXR1cm4icGFnZSBgIituKyJgIGlzIG5vdCBmb3VuZCI7aWYoZT09PU5mfHxlPT09a2Ype2lmKGQubWV0YS5pc1RhYkJhcilyZXR1cm5gY2FuIG5vdCAke2V9IGEgdGFiYmFyIHBhZ2VgfWVsc2UgaWYoZT09PUl1JiYhZC5tZXRhLmlzVGFiQmFyKXJldHVybiJjYW4gbm90IHN3aXRjaCB0byBuby10YWJCYXIgcGFnZSI7aWYoKGU9PT1JdXx8ZT09PVJmKSYmZC5tZXRhLmlzVGFiQmFyJiZyLm9wZW5UeXBlIT09ImFwcExhdW5jaCImJihuPXMpLGQubWV0YS5pc0VudHJ5JiYobj1uLnJlcGxhY2UoZC5hbGlhcywiLyIpKSxyLnVybD1LeShuKSxlIT09emgpe2lmKGU9PT1SZil7aWYoIWQubWV0YS5pc05WdWUpcmV0dXJuImNhbiBub3QgcHJlbG9hZCB2dWUgcGFnZSI7aWYoZC5tZXRhLmlzVGFiQmFyKXtsZXQgZz1HbigpLHk9ZC5wYXRoLnNsaWNlKDEpO2lmKGcuZmluZCh6PT56LnJvdXRlPT09eSkpcmV0dXJuInRhYkJhciBwYWdlIGAiK3krImAgYWxyZWFkeSBleGlzdHMifXJldHVybn1pZihQdT09PW4mJnIub3BlblR5cGUhPT0iYXBwTGF1bmNoIilyZXR1cm5gJHtQdX0gbG9ja2VkYDtJLnJlYWR5JiYoUHU9bil9fX1sZXQgaEU9ImhpZGVMb2FkaW5nIixwRT0iaGlkZVRvYXN0IixHaD0ibG9hZEZvbnRGYWNlIixnRT17ZmFtaWx5Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sc291cmNlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sZGVzYzpPYmplY3R9LHZFPVsiI2ZmZmZmZiIsIiMwMDAwMDAiXSxtRT0ic2V0TmF2aWdhdGlvbkJhckNvbG9yIixfRT17Zm9ybWF0QXJnczp7YW5pbWF0aW9uKGUsdCl7ZXx8KGU9e2R1cmF0aW9uOjAsdGltaW5nRnVuYzoibGluZWFyIn0pLHQuYW5pbWF0aW9uPXtkdXJhdGlvbjplLmR1cmF0aW9ufHwwLHRpbWluZ0Z1bmM6ZS50aW1pbmdGdW5jfHwibGluZWFyIn19fX0sYkU9e2Zyb250Q29sb3I6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcihlKXtpZih2RS5pbmRleE9mKGUpPT09LTEpcmV0dXJuYGludmFsaWQgZnJvbnRDb2xvciAiJHtlfSJgfX0sYmFja2dyb3VuZENvbG9yOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sYW5pbWF0aW9uOk9iamVjdH0seUU9InNldE5hdmlnYXRpb25CYXJUaXRsZSIsRUU9e3RpdGxlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LHdFPSJzaG93TmF2aWdhdGlvbkJhckxvYWRpbmciLFNFPSJoaWRlTmF2aWdhdGlvbkJhckxvYWRpbmciLFloPSJwYWdlU2Nyb2xsVG8iLENFPXtzY3JvbGxUb3A6TnVtYmVyLHNlbGVjdG9yOlN0cmluZyxkdXJhdGlvbjpOdW1iZXJ9LEFFPXtmb3JtYXRBcmdzOntkdXJhdGlvbjozMDB9fSxPRT0ic2hvd0FjdGlvblNoZWV0IixURT17aXRlbUxpc3Q6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITB9LHRpdGxlOlN0cmluZyxpdGVtQ29sb3I6U3RyaW5nLHBvcG92ZXI6T2JqZWN0fSxJRT17Zm9ybWF0QXJnczp7aXRlbUNvbG9yOiIjMDAwIn19LFBFPSJzaG93TG9hZGluZyIsTkU9e3RpdGxlOlN0cmluZyxtYXNrOkJvb2xlYW59LGtFPXtmb3JtYXRBcmdzOnt0aXRsZToiIixtYXNrOiExfX0sUkU9InNob3dNb2RhbCIseEU9e3RpdGxlOlN0cmluZyxjb250ZW50OlN0cmluZyxzaG93Q2FuY2VsOkJvb2xlYW4sY2FuY2VsVGV4dDpTdHJpbmcsY2FuY2VsQ29sb3I6U3RyaW5nLGNvbmZpcm1UZXh0OlN0cmluZyxjb25maXJtQ29sb3I6U3RyaW5nfSxCRT17YmVmb3JlSW52b2tlKCl7X24oKX0sZm9ybWF0QXJnczp7dGl0bGU6IiIsY29udGVudDoiIixwbGFjZWhvbGRlclRleHQ6IiIsc2hvd0NhbmNlbDohMCxlZGl0YWJsZTohMSxjYW5jZWxUZXh0KGUsdCl7aWYoIVEuaGFzT3duKHQsImNhbmNlbFRleHQiKSl7bGV0e3Q6bn09WigpO3QuY2FuY2VsVGV4dD1uKCJ1bmkuc2hvd01vZGFsLmNhbmNlbCIpfX0sY2FuY2VsQ29sb3I6IiMwMDAiLGNvbmZpcm1UZXh0KGUsdCl7aWYoIVEuaGFzT3duKHQsImNvbmZpcm1UZXh0Iikpe2xldHt0Om59PVooKTt0LmNvbmZpcm1UZXh0PW4oInVuaS5zaG93TW9kYWwuY29uZmlybSIpfX0sY29uZmlybUNvbG9yOmFlLlBSSU1BUllfQ09MT1J9fSxNRT0ic2hvd1RvYXN0IixERT1bInN1Y2Nlc3MiLCJsb2FkaW5nIiwibm9uZSIsImVycm9yIl0sRkU9e3RpdGxlOlN0cmluZyxpY29uOlN0cmluZyxpbWFnZTpTdHJpbmcsZHVyYXRpb246TnVtYmVyLG1hc2s6Qm9vbGVhbn0sTEU9e2Zvcm1hdEFyZ3M6e3RpdGxlOiIiLGljb24oZSx0KXt0Lmljb249YW4oZSxERSl9LGltYWdlKGUsdCl7ZT90LmltYWdlPVN0KGUpOnQuaW1hZ2U9IiJ9LGR1cmF0aW9uOjE1MDAsbWFzazohMX19LFZFPSJzdGFydFB1bGxEb3duUmVmcmVzaCIsJEU9InN0b3BQdWxsRG93blJlZnJlc2giLGF1PXtpbmRleDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITB9fSxwbD17YmVmb3JlSW52b2tlKCl7bGV0IGU9a28oKTtpZihlJiYhZS5pc1RhYkJhcilyZXR1cm4ibm90IFRhYkJhciBwYWdlIn0sZm9ybWF0QXJnczp7aW5kZXgoZSl7aWYoIUkudGFiQmFyLmxpc3RbZV0pcmV0dXJuInRhYmJhciBpdGVtIG5vdCBmb3VuZCJ9fX0sVUU9InNldFRhYkJhckl0ZW0iLEhFPVEuZXh0ZW5kKHt0ZXh0OlN0cmluZyxpY29uUGF0aDpTdHJpbmcsc2VsZWN0ZWRJY29uUGF0aDpTdHJpbmcscGFnZVBhdGg6U3RyaW5nfSxhdSksakU9e2JlZm9yZUludm9rZTpwbC5iZWZvcmVJbnZva2UsZm9ybWF0QXJnczpRLmV4dGVuZCh7cGFnZVBhdGgoZSx0KXtlJiYodC5wYWdlUGF0aD1hZS5yZW1vdmVMZWFkaW5nU2xhc2goZSkpfX0scGwuZm9ybWF0QXJncyl9LHpFPSJzZXRUYWJCYXJTdHlsZSIsV0U9e2NvbG9yOlN0cmluZyxzZWxlY3RlZENvbG9yOlN0cmluZyxiYWNrZ3JvdW5kQ29sb3I6U3RyaW5nLGJhY2tncm91bmRJbWFnZTpTdHJpbmcsYmFja2dyb3VuZFJlcGVhdDpTdHJpbmcsYm9yZGVyU3R5bGU6U3RyaW5nfSxHRT0vXihsaW5lYXJ8cmFkaWFsKS1ncmFkaWVudFwoLis/XCk7PyQvLFlFPXtiZWZvcmVJbnZva2U6cGwuYmVmb3JlSW52b2tlLGZvcm1hdEFyZ3M6e2JhY2tncm91bmRJbWFnZShlLHQpe2UmJiFHRS50ZXN0KGUpJiYodC5iYWNrZ3JvdW5kSW1hZ2U9U3QoZSkpfSxib3JkZXJTdHlsZShlLHQpe2UmJih0LmJvcmRlclN0eWxlPWU9PT0id2hpdGUiPyJ3aGl0ZSI6ImJsYWNrIil9fX0scUU9ImhpZGVUYWJCYXIiLHFoPXthbmltYXRpb246Qm9vbGVhbn0sS0U9InNob3dUYWJCYXIiLEpFPXFoLFpFPSJoaWRlVGFiQmFyUmVkRG90IixYRT1hdSxRRT1wbCxldz0ic2hvd1RhYkJhclJlZERvdCIsdHc9YXUsbnc9cGwscnc9InJlbW92ZVRhYkJhckJhZGdlIixpdz1hdSxvdz1wbCxhdz0ic2V0VGFiQmFyQmFkZ2UiLHN3PVEuZXh0ZW5kKHt0ZXh0Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LGF1KSxsdz17YmVmb3JlSW52b2tlOnBsLmJlZm9yZUludm9rZSxmb3JtYXRBcmdzOlEuZXh0ZW5kKHt0ZXh0KGUsdCl7YWUuZ2V0TGVuKGUpPj00JiYodC50ZXh0PSIuLi4iKX19LHBsLmZvcm1hdEFyZ3MpfSxjdz0iZ2V0UHJvdmlkZXIiLHV3PXtzZXJ2aWNlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LGZ3PSJsb2dpbiIsZHc9e3Byb3ZpZGVyOlN0cmluZyxzY29wZXM6W1N0cmluZyxBcnJheV0sdGltZW91dDpOdW1iZXIsdW5pdmVyaWZ5U3R5bGU6T2JqZWN0LG9ubHlBdXRob3JpemU6Qm9vbGVhbn0saHc9ImdldFVzZXJJbmZvIixwdz17cHJvdmlkZXI6U3RyaW5nLHdpdGhDcmVkZW50aWFsczpCb29sZWFuLHRpbWVvdXQ6TnVtYmVyLGxhbmc6U3RyaW5nfSxndz0iZ2dldFVzZXJQcm9maWxlZ2V0VXNlclByb2ZpbGUiLHZ3PXtwcm92aWRlcjpTdHJpbmcsd2l0aENyZWRlbnRpYWxzOkJvb2xlYW4sdGltZW91dDpOdW1iZXIsbGFuZzpTdHJpbmd9LG13PSJwcmVMb2dpbiIsX3c9e1VOSVZFUklGWToidW5pdmVyaWZ5In0sYnc9e2Zvcm1hdEFyZ3M6e3Byb3ZpZGVyKGUsdCl7aWYoT2JqZWN0LnZhbHVlcyhfdykuaW5kZXhPZihTdHJpbmcoZSkpPDApcmV0dXJuInByb3ZpZGVyIGVycm9yIn19fSx5dz17cHJvdmlkZXI6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sRXc9ImNsb3NlQXV0aFZpZXciLHd3PSJnZXRDaGVja0JveFN0YXRlIixTdz0iZ2V0VW5pdmVyaWZ5TWFuYWdlciIsQ3c9InNoYXJlIixLaD1bIldYU2NlbmVTZXNzaW9uIiwiV1hTY2VuZVRpbWVsaW5lIiwiV1hTY2VuZUZhdm9yaXRlIl0sQXc9e2Zvcm1hdEFyZ3M6e3NjZW5lKGUsdCl7bGV0e3Byb3ZpZGVyOm4sb3BlbkN1c3RvbWVyU2VydmljZUNoYXQ6cn09dDtpZihuPT09IndlaXhpbiImJiFyJiYoIWV8fCFLaC5pbmNsdWRlcyhlKSkpcmV0dXJuYFx1NTIwNlx1NEVBQlx1NTIzMFx1NUZBRVx1NEZFMVx1NjVGNlx1RkYwQ3NjZW5lXHU1RkM1XHU5ODdCXHU0RTNBXHU0RUU1XHU0RTBCXHU1MTc2XHU0RTJEXHU0RTAwXHU0RTJBXHVGRjFBJHtLaC5qb2luKCJcdTMwMDEiKX1gfSxzdW1tYXJ5KGUsdCl7aWYodC50eXBlPT09MSYmIWUpcmV0dXJuIlx1NTIwNlx1NEVBQlx1N0VBRlx1NjU4N1x1NjcyQ1x1NjVGNlx1RkYwQ3N1bW1hcnlcdTVGQzVcdTU4NkIifSxocmVmKGUsdCl7aWYodC50eXBlPT09MCYmIWUpcmV0dXJuIlx1NTIwNlx1NEVBQlx1NTZGRVx1NjU4N1x1NjVGNlx1RkYwQ2hyZWZcdTVGQzVcdTU4NkIifSxpbWFnZVVybChlLHQpe2lmKFswLDIsNV0uaW5jbHVkZXMoTnVtYmVyKHQudHlwZSkpJiYhZSlyZXR1cm4iXHU1MjA2XHU0RUFCXHU1NkZFXHU2NTg3XHUzMDAxXHU3RUFGXHU1NkZFXHU3MjQ3XHUzMDAxXHU1QzBGXHU3QTBCXHU1RThGXHU2NUY2XHVGRjBDaW1hZ2VVcmxcdTVGQzVcdTU4NkJcdUZGMENcdTYzQThcdTgzNTBcdTRGN0ZcdTc1MjhcdTVDMEZcdTRFOEUyMEtiXHU3Njg0XHU1NkZFXHU3MjQ3In0sbWVkaWFVcmwoZSx0KXtpZihbMyw0XS5pbmNsdWRlcyhOdW1iZXIodC50eXBlKSkmJiFlKXJldHVybiJcdTUyMDZcdTRFQUJcdTk3RjNcdTRFNTBcdTMwMDFcdTg5QzZcdTk4OTFcdTY1RjZcdUZGMENtZWRpYVVybFx1NUZDNVx1NTg2QiJ9LG1pbmlQcm9ncmFtKGUsdCl7aWYodC50eXBlPT09NSYmIWUpcmV0dXJuIlx1NTIwNlx1NEVBQlx1NUMwRlx1N0EwQlx1NUU4Rlx1NjVGNlx1RkYwQ21pbmlQcm9ncmFtXHU1RkM1XHU1ODZCIn0sY29ycGlkKGUsdCl7aWYodC5vcGVuQ3VzdG9tZXJTZXJ2aWNlQ2hhdCYmIWUpcmV0dXJuIlx1NEY3Rlx1NzUyOFx1NjI1M1x1NUYwMFx1NUJBMlx1NjcwRFx1NTI5Rlx1ODBGRFx1NjVGNiBjb3JwaWQgXHU1RkM1XHU1ODZCIn0sY3VzdG9tZXJVcmwoZSx0KXtpZih0Lm9wZW5DdXN0b21lclNlcnZpY2VDaGF0JiYhZSlyZXR1cm4iXHU0RjdGXHU3NTI4XHU2MjUzXHU1RjAwXHU1QkEyXHU2NzBEXHU1MjlGXHU4MEZEXHU2NUY2IGN1c3RvbWVyVXJsIFx1NUZDNVx1NTg2QiJ9fX0sT3c9e3Byb3ZpZGVyOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sdHlwZTpOdW1iZXIsdGl0bGU6U3RyaW5nLHNjZW5lOlN0cmluZyxzdW1tYXJ5OlN0cmluZyxocmVmOlN0cmluZyxpbWFnZVVybDpTdHJpbmcsbWVkaWFVcmw6U3RyaW5nLG1pbmlQcm9ncmFtOk9iamVjdH0sVHc9InNoYXJlV2l0aFN5c3RlbSIsSmg9WyJ0ZXh0IiwiaW1hZ2UiXSxJdz17Zm9ybWF0QXJnczp7dHlwZShlLHQpe2lmKGUmJiFKaC5pbmNsdWRlcyhlKSlyZXR1cm4iXHU1MjA2XHU0RUFCXHU1M0MyXHU2NTcwIHR5cGUgXHU0RTBEXHU2QjYzXHU3ODZFXHUzMDAyXHU1M0VBXHU2NTJGXHU2MzAxdGV4dFx1MzAwMWltYWdlIjt0LnR5cGU9YW4oZSxKaCl9fX0sUHc9e3R5cGU6U3RyaW5nLHN1bW1hcnk6U3RyaW5nLGhyZWY6U3RyaW5nLGltYWdlVXJsOlN0cmluZ30sTnc9InJlcXVlc3RQYXltZW50Iixrdz17cHJvdmlkZXI6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxvcmRlckluZm86e3R5cGU6W1N0cmluZyxPYmplY3RdLHJlcXVpcmVkOiEwfSx0aW1lU3RhbXA6U3RyaW5nLG5vbmNlU3RyOlN0cmluZyxwYWNrYWdlOlN0cmluZyxzaWduVHlwZTpTdHJpbmcscGF5U2lnbjpTdHJpbmd9LFJ3PSJjcmVhdGVQdXNoTWVzc2FnZSIseHc9e2Zvcm1hdEFyZ3M6e2NvbnRlbnQoZSl7aWYoIWUpcmV0dXJuImNvbnRlbnQgaXMgcmVxdWlyZWQifX19LEJ3PSJjcmVhdGVSZXdhcmRlZFZpZGVvQWQiLE13PXtmb3JtYXRBcmdzOnthZHBpZDoiIixhZFVuaXRJZDoiIn19LER3PXthZHBpZDpTdHJpbmcsYWRVbml0SWQ6U3RyaW5nfSxGdz0iY3JlYXRlRnVsbFNjcmVlblZpZGVvQWQiLEx3PXtmb3JtYXRBcmdzOnthZHBpZDoiIn19LFZ3PXthZHBpZDpTdHJpbmd9LCR3PSJjcmVhdGVJbnRlcnN0aXRpYWxBZCIsVXc9e2Zvcm1hdEFyZ3M6e2FkcGlkOiIiLGFkVW5pdElkOiIifX0sSHc9e2FkcGlkOlN0cmluZyxhZFVuaXRJZDpTdHJpbmd9LGp3PSJjcmVhdGVJbnRlcmFjdGl2ZUFkIix6dz17Zm9ybWF0QXJnczp7YWRwaWQoZSx0KXtpZighZSlyZXR1cm4iYWRwaWQgc2hvdWxkIG5vdCBiZSBlbXB0eS4iO2UmJih0LmFkcGlkPWUpfSxwcm92aWRlcihlLHQpe2lmKCFlKXJldHVybiJwcm92aWRlciBzaG91bGQgbm90IGJlIGVtcHR5LiI7ZSYmKHQucHJvdmlkZXI9ZSl9fX0sV3c9e2FkcGlkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0scHJvdmlkZXI6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX07ZnVuY3Rpb24gamwoZSx0KXtyZXR1cm4gZnVuY3Rpb24ocil7ZGVsZXRlIHIuY29kZSxkZWxldGUgci5tZXNzYWdlLFEuaXNGdW5jdGlvbih0KSYmKHI9dChyKSksZShyKX19ZnVuY3Rpb24gX3IoZSx0KXtyZXR1cm4gZnVuY3Rpb24ocil7cj1yfHx7fSx0PXIubWVzc2FnZXx8dHx8IiIsZGVsZXRlIHIubWVzc2FnZSxlKHQsUS5leHRlbmQoe2NvZGU6MH0scikpfX1mdW5jdGlvbiBTYyhlLHQpe3JldHVybiBmdW5jdGlvbigpe2UoKShmdW5jdGlvbihyKXtyJiYoZGVsZXRlIHIuY29kZSxkZWxldGUgci5tZXNzYWdlKSxidC5pbnZva2VPbkNhbGxiYWNrKHQscil9KX19ZnVuY3Rpb24gT2koZSx0LG4pe3JldHVybiBmdW5jdGlvbihyLHtyZXNvbHZlOnMscmVqZWN0OmR9KXtlKCkoUS5leHRlbmQoe30sUS5pc0Z1bmN0aW9uKHQpP3Qocik6cix7c3VjY2VzczpqbChzLG4pLGZhaWw6X3IoZCl9KSl9fWZ1bmN0aW9uIHN1KGU9IiIpe2lmKCEoSS50YWJCYXImJlEuaXNBcnJheShJLnRhYkJhci5saXN0KSkpcmV0dXJuITE7dHJ5e2lmKCFlKXtsZXQgbj1HbigpO2lmKCFuLmxlbmd0aClyZXR1cm4hMTtsZXQgcj1uW24ubGVuZ3RoLTFdO3JldHVybiByP3IuJHBhZ2UubWV0YS5pc1RhYkJhcjohMX0vXlwvLy50ZXN0KGUpfHwoZT1hZS5hZGRMZWFkaW5nU2xhc2goZSkpO2xldCB0PWZvKGUpO3JldHVybiB0JiZ0Lm1ldGEuaXNUYWJCYXJ9Y2F0Y2godCl7fXJldHVybiExfWxldCBzcz0iX19UWVBFIixHdz0idW5pLXN0b3JhZ2Uta2V5cyI7ZnVuY3Rpb24geGYoZSl7bGV0IHQ9WyJvYmplY3QiLCJzdHJpbmciLCJudW1iZXIiLCJib29sZWFuIiwidW5kZWZpbmVkIl07dHJ5e2xldCBuPVEuaXNTdHJpbmcoZSk/SlNPTi5wYXJzZShlKTplLHI9bi50eXBlO2lmKHQuaW5kZXhPZihyKT49MCl7bGV0IHM9T2JqZWN0LmtleXMobik7aWYocy5sZW5ndGg9PT0yJiYiZGF0YSJpbiBuKXtpZih0eXBlb2Ygbi5kYXRhPT09cilyZXR1cm4gbi5kYXRhO2lmKHI9PT0ib2JqZWN0IiYmL15cZHs0fS1cZHsyfS1cZHsyfVRcZHsyfVw6XGR7Mn1cOlxkezJ9XC5cZHszfVokLy50ZXN0KG4uZGF0YSkpcmV0dXJuIG5ldyBEYXRlKG4uZGF0YSl9ZWxzZSBpZihzLmxlbmd0aD09PTEpcmV0dXJuIiJ9fWNhdGNoKG4pe319bGV0IFl3PUR0KEUwLChlLHQpPT57bGV0IG49dHlwZW9mIHQscj1uPT09InN0cmluZyI/dDpKU09OLnN0cmluZ2lmeSh7dHlwZTpuLGRhdGE6dH0pO3RyeXtuPT09InN0cmluZyImJnhmKHIpIT09dm9pZCAwP2Muc3RvcmFnZS5zZXRJdGVtKGUrc3Msbik6Yy5zdG9yYWdlLnJlbW92ZUl0ZW0oZStzcyksYy5zdG9yYWdlLnNldEl0ZW0oZSxyKX1jYXRjaChzKXt9fSx3MCkscXc9UmUoYjAsKHtrZXk6ZSxkYXRhOnR9LHtyZXNvbHZlOm4scmVqZWN0OnJ9KT0+e2xldCBzPXR5cGVvZiB0LGQ9cz09PSJzdHJpbmciP3Q6SlNPTi5zdHJpbmdpZnkoe3R5cGU6cyxkYXRhOnR9KTt0cnl7bGV0IGc9Yy5zdG9yYWdlO3M9PT0ic3RyaW5nIiYmeGYoZCkhPT12b2lkIDA/Zy5zZXRJdGVtQXN5bmMoZStzcyxzKTpnLnJlbW92ZUl0ZW1Bc3luYyhlK3NzKSxnLnNldEl0ZW1Bc3luYyhlLGQsbixfcihyKSl9Y2F0Y2goZyl7cihnLm1lc3NhZ2UpfX0seTApO2Z1bmN0aW9uIEJmKGUsdCl7bGV0IG49dDtpZihlIT09InN0cmluZyJ8fGU9PT0ic3RyaW5nIiYmdD09PSd7InR5cGUiOiJ1bmRlZmluZWQifScpdHJ5e2xldCByPUpTT04ucGFyc2UodCkscz14ZihyKTtpZihzIT09dm9pZCAwKW49cztlbHNlIGlmKGUmJihuPXIsUS5pc1N0cmluZyhyKSkpe3I9SlNPTi5wYXJzZShyKTtsZXQgZD10eXBlb2YgcjtkPT09Im51bWJlciImJmU9PT0iZGF0ZSI/bj1uZXcgRGF0ZShyKTpkPT09KFsibnVsbCIsImFycmF5Il0uaW5kZXhPZihlKTwwP2U6Im9iamVjdCIpJiYobj1yKX19Y2F0Y2gocil7fXJldHVybiBufWxldCBLdz1EdChfMCwoZSx0KT0+e2xldCBuPWMuc3RvcmFnZS5nZXRJdGVtKGUpLHM9KGMuc3RvcmFnZS5nZXRJdGVtKGUrc3MpfHwiIikudG9Mb3dlckNhc2UoKTtyZXR1cm4gUS5pc1N0cmluZyhuKT9CZihzLG4pOiIifSxMaCksSnc9UmUobTAsKHtrZXk6ZX0se3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9Yy5zdG9yYWdlO3IuZ2V0SXRlbUFzeW5jKGUsZnVuY3Rpb24ocyl7ci5nZXRJdGVtQXN5bmMoZStzcyxmdW5jdGlvbihkKXtsZXQgeT0oZC5kYXRhfHwiIikudG9Mb3dlckNhc2UoKTt0KHtkYXRhOkJmKHkscy5kYXRhKX0pfSxmdW5jdGlvbigpe3Qoe2RhdGE6QmYoIiIscy5kYXRhKX0pfSl9LF9yKG4pKX0sRmgpLFp3PUR0KFZoLGU9PntjLnN0b3JhZ2UucmVtb3ZlSXRlbShlK3NzKSxjLnN0b3JhZ2UucmVtb3ZlSXRlbShlKX0sQzApLFh3PVJlKFZoLCh7a2V5OmV9LHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2Muc3RvcmFnZS5yZW1vdmVJdGVtQXN5bmMoZStzcyksYy5zdG9yYWdlLnJlbW92ZUl0ZW1Bc3luYyhlLHQsX3IobikpfSxTMCksUXc9RHQoImNsZWFyU3RvcmFnZVN5bmMiLCgpPT57Yy5zdG9yYWdlLmNsZWFyKCl9KSxlUz1SZSgiY2xlYXJTdG9yYWdlIiwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntjLnN0b3JhZ2UuY2xlYXJBc3luYyh0LF9yKG4pKX0pLFpoPUR0KCJnZXRTdG9yYWdlSW5mb1N5bmMiLCgpPT57bGV0IGU9Yy5zdG9yYWdlLmdldExlbmd0aCgpfHwwLHQ9W10sbj0wO2ZvcihsZXQgcj0wO3I8ZTtyKyspe2xldCBzPWMuc3RvcmFnZS5rZXkocik7aWYocyE9PUd3JiYocy5pbmRleE9mKHNzKTwwfHxzLmluZGV4T2Yoc3MpK3NzLmxlbmd0aCE9PXMubGVuZ3RoKSl7bGV0IGQ9Yy5zdG9yYWdlLmdldEl0ZW0ocyk7bis9cy5sZW5ndGgrZC5sZW5ndGgsdC5wdXNoKHMpfX1yZXR1cm57a2V5czp0LGN1cnJlbnRTaXplOk1hdGguY2VpbChuKjIvMTAyNCksbGltaXRTaXplOk51bWJlci5NQVhfVkFMVUV9fSksdFM9UmUoImdldFN0b3JhZ2VJbmZvIiwoZSx7cmVzb2x2ZTp0fSk9Pnt0KFpoKCkpfSksblM9UmUoUjAsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57Yy5pby5nZXRGaWxlSW5mbyhRLmV4dGVuZChlLHtzdWNjZXNzOmpsKHQpLGZhaWw6X3Iobil9KSl9LEIwLHgwKSxyUz0wLFhoPSJ1bmlhcHBfc2F2ZSIsaVM9YF9kb2MvJHtYaH1gO2Z1bmN0aW9uIG9TKGUsdCl7dD10fHxmdW5jdGlvbigpe30sYy5pby5yZXF1ZXN0RmlsZVN5c3RlbShjLmlvLlBSSVZBVEVfRE9DLG49PntuLnJvb3QuZ2V0RGlyZWN0b3J5KFhoLHtjcmVhdGU6ITB9LGUsdCl9LHQpfWxldCBhUz1SZShBMCwoe3RlbXBGaWxlUGF0aDplfSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1fcihuKSxzPWAke0RhdGUubm93KCl9JHtyUysrfSR7YWkoZSl9YDtjLmlvLnJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUkwoZSxkPT57b1MoZz0+e2QuY29weVRvKGcscywoKT0+e2xldCB5PWlTKyIvIitzO3Qoe3NhdmVkRmlsZVBhdGg6eX0pfSxyKX0scil9LHIpfSxUMCxPMCksc1M9InVuaWFwcF9zYXZlIjtmdW5jdGlvbiBsUyhlLHQpe3Q9dHx8ZnVuY3Rpb24oKXt9LGMuaW8ucmVxdWVzdEZpbGVTeXN0ZW0oYy5pby5QUklWQVRFX0RPQyxuPT57bi5yb290LmdldERpcmVjdG9yeShzUyx7Y3JlYXRlOiEwfSxlLHQpfSx0KX1sZXQgY1M9UmUoSTAsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9X3Iobik7bFMocz0+e3ZhciBkPXMuY3JlYXRlUmVhZGVyKCksZz1bXTtkLnJlYWRFbnRyaWVzKHk9Pnt5JiZ5Lmxlbmd0aD95LmZvckVhY2goej0+e3ouZ2V0TWV0YWRhdGEoUD0+e2cucHVzaCh7ZmlsZVBhdGg6Yy5pby5jb252ZXJ0QWJzb2x1dGVGaWxlU3lzdGVtKHouZnVsbFBhdGgpLGNyZWF0ZVRpbWU6UC5tb2RpZmljYXRpb25UaW1lLmdldFRpbWUoKSxzaXplOlAuc2l6ZX0pLGcubGVuZ3RoPT09eS5sZW5ndGgmJnQoe2ZpbGVMaXN0Omd9KX0sciwhMSl9KTp0KHtmaWxlTGlzdDpnfSl9LHIpfSxyKX0pLHVTPVJlKE0wLCh7ZmlsZVBhdGg6ZX0se3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9X3Iobik7Yy5pby5yZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJMKGUscz0+e3MuZ2V0TWV0YWRhdGEoZD0+e3Qoe2NyZWF0ZVRpbWU6ZC5tb2RpZmljYXRpb25UaW1lLmdldFRpbWUoKSxzaXplOmQuc2l6ZX0pfSxyLCExKX0scil9LEYwLEQwKSxmUz1SZShQMCwoe2ZpbGVQYXRoOmV9LHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPV9yKG4pO2MuaW8ucmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSTChlLHM9PntzLnJlbW92ZSgoKT0+e3QoKX0scil9LHIpfSxrMCxOMCksZFM9UmUoTDAsKHtmaWxlUGF0aDplLGZpbGVUeXBlOnR9LHtyZXNvbHZlOm4scmVqZWN0OnJ9KT0+e2xldCBzPV9yKHIpO2MucnVudGltZS5vcGVuRG9jdW1lbnQoU3QoZSksdm9pZCAwLG4scyl9LCQwLFYwKSxoUz1EdChzYixlPT4hIVEuaGFzT3duKHNlLGUpLGxiKSxNZjtmdW5jdGlvbiBwUygpe3JldHVybiBNZj1NZnx8Yy5kZXZpY2UudXVpZCxNZn1sZXQgbHUsRGY9ITAscHI7ZnVuY3Rpb24gZ1MoZSx0LG4peyFwcnx8KGU9PT0ibm9uZSI/KHByLmhpZGVUYWJCYXJSZWREb3Qoe2luZGV4OnR9KSxwci5yZW1vdmVUYWJCYXJCYWRnZSh7aW5kZXg6dH0pKTplPT09InRleHQiP3ByLnNldFRhYkJhckJhZGdlKHtpbmRleDp0LHRleHQ6bn0pOmU9PT0icmVkRG90IiYmcHIuc2hvd1RhYkJhclJlZERvdCh7aW5kZXg6dH0pKX1mdW5jdGlvbiB2UyhlLHQsbixyLHMsZCl7bGV0IGc9e2luZGV4OmV9O2lmKHQhPT12b2lkIDAmJihnLnRleHQ9dCksbiYmKGcuaWNvblBhdGg9U3QobikpLHImJihnLnNlbGVjdGVkSWNvblBhdGg9U3QocikpLGQhPT12b2lkIDAmJihnLmljb25mb250PWQpLHMhPT12b2lkIDApe2cudmlzaWJsZT1sdS5saXN0W2VdLnZpc2libGU9cyxkZWxldGUgZy5pbmRleDtsZXQgeT1sdS5saXN0Lm1hcCh6PT4oe3Zpc2libGU6ei52aXNpYmxlfSkpO3lbZV09ZyxwciYmcHIuc2V0VGFiQmFySXRlbXMoe2xpc3Q6eX0pfWVsc2UgcHImJnByLnNldFRhYkJhckl0ZW0oZyl9ZnVuY3Rpb24gbVMoZSl7cHImJnByLnNldFRhYkJhclN0eWxlKGUpfWZ1bmN0aW9uIF9TKGUpe0RmPSExLHByJiZwci5oaWRlVGFiQmFyKHthbmltYXRpb246ZX0pfWZ1bmN0aW9uIGJTKGUpe0RmPSEwLHByJiZwci5zaG93VGFiQmFyKHthbmltYXRpb246ZX0pfWxldCBrdT1bXTt2YXIgVGk9e2lkOiIwIixpbml0KGUsdCl7ZSYmZS5saXN0Lmxlbmd0aCYmKGx1PWUpO3RyeXtwcj12LnJlcXVpcmVNb2R1bGUoInVuaS10YWJ2aWV3Iil9Y2F0Y2gobil7Y29uc29sZS5sb2coYHVuaS5yZXF1aXJlTmF0aXZlUGx1Z2luKCJ1bmktdGFidmlldyIpIGVycm9yICR7bn1gKX1wci5vbk1hc2tDbGljaygoKT0+e2t1LmZvckVhY2gobj0+e24oKX0pfSkscHImJnByLm9uQ2xpY2soKHtpbmRleDpufSk9Pnt0KGx1Lmxpc3Rbbl0sbil9KSxwciYmcHIub25NaWRCdXR0b25DbGljaygoKT0+YnQuaW52b2tlT25DYWxsYmFjayhFaCkpfSxpbmRleE9mKGUpe2xldCB0PXRoaXMuY29uZmlnLG49dCYmdC5saXN0JiZ0Lmxpc3QubGVuZ3RoO2lmKG4pe2ZvcihsZXQgcj0wO3I8bjtyKyspaWYodC5saXN0W3JdLnBhZ2VQYXRoPT09ZXx8dC5saXN0W3JdLnBhZ2VQYXRoPT09YCR7ZX0uaHRtbGApcmV0dXJuIHJ9cmV0dXJuLTF9LHN3aXRjaFRhYihlKXtsZXQgdD10aGlzLmluZGV4T2YoZSk7cmV0dXJuIHQ+PTA/KHByJiZwci5zd2l0Y2hTZWxlY3Qoe2luZGV4OnR9KSwhMCk6ITF9LHNldFRhYkJhckJhZGdlOmdTLHNldFRhYkJhckl0ZW06dlMsc2V0VGFiQmFyU3R5bGU6bVMsaGlkZVRhYkJhcjpfUyxzaG93VGFiQmFyOmJTLGFwcGVuZChlKXtwciYmcHIuYXBwZW5kKHtpZDplLmlkfSwoe2NvZGU6dH0pPT57dCE9PTAmJkIoKCk9Pnt0aGlzLmFwcGVuZChlKX0sMjApfSl9LGdldCBjb25maWcoKXtyZXR1cm4gbHV8fEkudGFiQmFyfSxnZXQgdmlzaWJsZSgpe3JldHVybiBEZn0sZ2V0IGhlaWdodCgpe2xldCBlPXRoaXMuY29uZmlnO3JldHVybihlJiZlLmhlaWdodD9wYXJzZUZsb2F0KGUuaGVpZ2h0KTphZS5UQUJCQVJfSEVJR0hUKStjLm5hdmlnYXRvci5nZXRTYWZlQXJlYUluc2V0cygpLmRldmljZUJvdHRvbX0sZ2V0IGNvdmVyKCl7bGV0IGU9dGhpcy5jb25maWc7cmV0dXJuIGUmJlsiZXh0cmFsaWdodCIsImxpZ2h0IiwiZGFyayJdLmluZGV4T2YoZS5ibHVyRWZmZWN0KT49MH0sc2V0U3R5bGUoe21hc2s6ZX0pe3ByLnNldE1hc2soe2NvbG9yOmV9KX0sYWRkRXZlbnRMaXN0ZW5lcihlLHQpe2t1LnB1c2godCl9LHJlbW92ZUV2ZW50TGlzdGVuZXIoZSx0KXtsZXQgbj1rdS5pbmRleE9mKHQpO2t1LnNwbGljZShuLDEpfX07ZnVuY3Rpb24gUnUoKXtsZXQgZT1ScigpO3JldHVybiBlP2UuJGdldEFwcFdlYnZpZXcoKTpudWxsfWZ1bmN0aW9uIFFoKGUpe3JldHVybiBlP2UuJGdldEFwcFdlYnZpZXcoKTpSdSgpfWxldCBlcD1udWxsO2Z1bmN0aW9uIHRwKCl7cmV0dXJuIGVwfWZ1bmN0aW9uIEZmKGUpe2VwPWV9ZnVuY3Rpb24gTGYoKXtyZXR1cm4gYy5uYXZpZ2F0b3IuaXNJbW1lcnNlZFN0YXR1c2JhcigpP01hdGgucm91bmQoYy5vcy5uYW1lPT09ImlPUyI/Yy5uYXZpZ2F0b3IuZ2V0U2FmZUFyZWFJbnNldHMoKS50b3A6Yy5uYXZpZ2F0b3IuZ2V0U3RhdHVzYmFySGVpZ2h0KCkpOjB9ZnVuY3Rpb24gbnAoKXtsZXQgZT1jLm5hdmlnYXRvci5nZXRTdGF0dXNCYXJTdHlsZSgpO3JldHVybiBlPT09IlVJU3RhdHVzQmFyU3R5bGVCbGFja1RyYW5zbHVjZW50Inx8ZT09PSJVSVN0YXR1c0JhclN0eWxlQmxhY2tPcGFxdWUifHxlPT09Im51bGwiP2U9ImxpZ2h0IjplPT09IlVJU3RhdHVzQmFyU3R5bGVEZWZhdWx0IiYmKGU9ImRhcmsiKSxlfWZ1bmN0aW9uIHlTKCl7bGV0e3Jlc29sdXRpb25XaWR0aDplLHJlc29sdXRpb25IZWlnaHQ6dH09Yy5zY3JlZW4uZ2V0Q3VycmVudFNpemUoKXx8e3Jlc29sdXRpb25XaWR0aDowLHJlc29sdXRpb25IZWlnaHQ6MH07cmV0dXJue3NjcmVlbldpZHRoOk1hdGgucm91bmQoZSksc2NyZWVuSGVpZ2h0Ok1hdGgucm91bmQodCl9fWxldCBycD1EdCgiZ2V0V2luZG93SW5mbyIsKCk9PntsZXQgZT1jLm9zLm5hbWUudG9Mb3dlckNhc2UoKT09PSJpb3MiLHtzY3JlZW5XaWR0aDp0LHNjcmVlbkhlaWdodDpufT15UygpLHI9TGYoKSxzLGQ9e2hlaWdodDowLGNvdmVyOiExfSxnPVJ1KCk7aWYoZyl7bGV0IEV0PWcuZ2V0U3R5bGUoKSxrdD1FdCYmRXQudGl0bGVOVmlldztrdCYma3QudHlwZSYma3QudHlwZSE9PSJub25lIiYmKGQuaGVpZ2h0PWt0LnR5cGU9PT0idHJhbnNwYXJlbnQiPzA6cithZS5OQVZCQVJfSEVJR0hULGQuY292ZXI9a3QudHlwZT09PSJ0cmFuc3BhcmVudCJ8fGt0LnR5cGU9PT0iZmxvYXQiKSxzPWcuZ2V0U2FmZUFyZWFJbnNldHMoKX1lbHNlIHM9Yy5uYXZpZ2F0b3IuZ2V0U2FmZUFyZWFJbnNldHMoKTtsZXQgeT17aGVpZ2h0OjAsY292ZXI6ITF9O3N1KCkmJih5LmhlaWdodD1UaS52aXNpYmxlP1RpLmhlaWdodDowLHkuY292ZXI9VGkuY292ZXIpO2xldCB6PWQuY292ZXI/ZC5oZWlnaHQ6MCxQPXkuY292ZXI/eS5oZWlnaHQ6MCwkPW4tZC5oZWlnaHQteS5oZWlnaHQsX2U9bi0oZC5jb3Zlcj8wOmQuaGVpZ2h0KS0oeS5jb3Zlcj8wOnkuaGVpZ2h0KSxUZT10OygheS5oZWlnaHR8fHkuY292ZXIpJiYhcy5ib3R0b20mJnMuZGV2aWNlQm90dG9tJiYoJC09cy5kZXZpY2VCb3R0b20sX2UtPXMuZGV2aWNlQm90dG9tKSxzPWU/czp7bGVmdDowLHJpZ2h0OjAsdG9wOmQuaGVpZ2h0JiYhZC5jb3Zlcj8wOnIsYm90dG9tOjB9O2xldCBMZT17bGVmdDpzLmxlZnQscmlnaHQ6VGUtcy5yaWdodCx0b3A6cy50b3AsYm90dG9tOl9lLXMuYm90dG9tLHdpZHRoOlRlLXMubGVmdC1zLnJpZ2h0LGhlaWdodDpfZS1zLnRvcC1zLmJvdHRvbX07cmV0dXJue3BpeGVsUmF0aW86Yy5zY3JlZW4uc2NhbGUsc2NyZWVuV2lkdGg6dCxzY3JlZW5IZWlnaHQ6bix3aW5kb3dXaWR0aDpUZSx3aW5kb3dIZWlnaHQ6JCxzdGF0dXNCYXJIZWlnaHQ6cixzYWZlQXJlYTpMZSxzYWZlQXJlYUluc2V0czp7dG9wOnMudG9wLHJpZ2h0OnMucmlnaHQsYm90dG9tOnMuYm90dG9tLGxlZnQ6cy5sZWZ0fSx3aW5kb3dUb3A6eix3aW5kb3dCb3R0b206UCxzY3JlZW5Ub3A6bi0kfX0pLHdzLHh1PSEwO2Z1bmN0aW9uIFZmKCl7aWYoIXh1KXJldHVybjtsZXR7Z2V0U3lzdGVtSW5mb1N5bmM6ZX09di5yZXF1aXJlTW9kdWxlKCJwbHVzIik7aWYod3M9ZSgpLFEuaXNTdHJpbmcod3MpKXRyeXt3cz1KU09OLnBhcnNlKHdzKX1jYXRjaCh0KXt9fWxldCBpcD1EdCgiZ2V0RGV2aWNlSW5mbyIsKCk9PntWZigpO2xldHtkZXZpY2VCcmFuZDplPSIiLGRldmljZU1vZGVsOnQsb3NOYW1lOm4sb3NWZXJzaW9uOnIsZGV2aWNlT3JpZW50YXRpb246cyxkZXZpY2VUeXBlOmR9PXdzLGc9ZS50b0xvd2VyQ2FzZSgpLHk9bi50b0xvd2VyQ2FzZSgpO3JldHVybnticmFuZDpnLGRldmljZUJyYW5kOmcsZGV2aWNlTW9kZWw6dCxkZXZpY2VQaXhlbFJhdGlvOmMuc2NyZWVuLnNjYWxlLGRldmljZUlkOnBTKCksZGV2aWNlT3JpZW50YXRpb246cyxkZXZpY2VUeXBlOmQsbW9kZWw6dCxwbGF0Zm9ybTp5LHN5c3RlbTpgJHt5PT09ImlvcyI/ImlPUyI6IkFuZHJvaWQifSAke3J9YH19KSxvcD1EdCgiZ2V0QXBwQmFzZUluZm8iLCgpPT57VmYoKTtsZXR7aG9zdFBhY2thZ2VOYW1lOmUsaG9zdE5hbWU6dCxob3N0VmVyc2lvbjpuLGhvc3RMYW5ndWFnZTpyLG9zTGFuZ3VhZ2U6cyxob3N0VGhlbWU6ZCxhcHBJZDpnLGFwcE5hbWU6eSxhcHBWZXJzaW9uOnosYXBwVmVyc2lvbkNvZGU6UCxhcHBXZ3RWZXJzaW9uOiR9PXdzO3JldHVybnthcHBJZDpnLGFwcE5hbWU6eSxhcHBWZXJzaW9uOnosYXBwVmVyc2lvbkNvZGU6UCxhcHBXZ3RWZXJzaW9uOiQsYXBwTGFuZ3VhZ2U6bnU/bnUoKTpzLGVuYWJsZURlYnVnOiExLGhvc3RQYWNrYWdlTmFtZTplLGhvc3ROYW1lOnQsaG9zdFZlcnNpb246bixob3N0TGFuZ3VhZ2U6cixob3N0VGhlbWU6ZCxob3N0Rm9udFNpemVTZXR0aW5nOnZvaWQgMCxob3N0U0RLVmVyc2lvbjp2b2lkIDAsbGFuZ3VhZ2U6cyxTREtWZXJzaW9uOiIiLHRoZW1lOnZvaWQgMCx2ZXJzaW9uOmMucnVudGltZS5pbm5lclZlcnNpb259fSksYXA9RHQoImdldFN5c3RlbUluZm9TeW5jIiwoKT0+e3h1PSEwLFZmKCkseHU9ITE7bGV0IGU9cnAoKSx0PWlwKCksbj1vcCgpO3h1PSEwO2xldCByPXtmb250U2l6ZVNldHRpbmc6bi5ob3N0Rm9udFNpemVTZXR0aW5nLG9zTmFtZTp3cy5vc05hbWUudG9Mb3dlckNhc2UoKX07d3MuaG9zdE5hbWUmJihyLmhvc3RTREtWZXJzaW9uPXdzLnVuaVJ1bnRpbWVWZXJzaW9uKTtsZXQgcz1RLmV4dGVuZCh3cyxlLHQsbixyKTtyZXR1cm4gZGVsZXRlIHMuc2NyZWVuVG9wLGRlbGV0ZSBzLmVuYWJsZURlYnVnLGRlbGV0ZSBzLnRoZW1lLGFlLnNvcnRPYmplY3Qocyl9KSxFUz1SZSgiZ2V0U3lzdGVtSW5mbyIsKGUse3Jlc29sdmU6dH0pPT50KGFwKCkpKSxDYz1udWxsLHdTPU5uKE5oLCgpPT57c3AoKX0pLFNTPWxyKHdiLCgpPT57bHAoKX0pLHNwPVJlKFNiLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e0NjfHwoQ2M9Yy5vcmllbnRhdGlvbi53YXRjaE9yaWVudGF0aW9uKHI9PntidC5pbnZva2VPbkNhbGxiYWNrKE5oLHtkaXJlY3Rpb246ci5tYWduZXRpY0hlYWRpbmd9KX0scj0+e24oci5tZXNzYWdlKSxDYz1udWxsfSx7ZnJlcXVlbmN5OmpufSkpLEIodCxqbil9KSxscD1SZShDYiwoZSx7cmVzb2x2ZTp0fSk9PntDYyYmKGMub3JpZW50YXRpb24uY2xlYXJXYXRjaChDYyksQ2M9bnVsbCksdCgpfSksQ1M9UmUoQWIsKGUse3Jlc29sdmU6dH0pPT57Yy5kZXZpY2UudmlicmF0ZSgxNSksdCgpfSksQVM9UmUoT2IsKGUse3Jlc29sdmU6dH0pPT57Yy5kZXZpY2UudmlicmF0ZSg0MDApLHQoKX0pLEFjPW51bGwsT1M9Tm4oUGgsKCk9PntjcCgpfSksVFM9bHIoYmIsKCk9Pnt1cCgpfSksY3A9UmUoeWIsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57QWN8fChBYz1jLmFjY2VsZXJvbWV0ZXIud2F0Y2hBY2NlbGVyYXRpb24ocj0+e2J0Lmludm9rZU9uQ2FsbGJhY2soUGgse3g6ciYmci54QXhpc3x8MCx5OnImJnIueUF4aXN8fDAsejpyJiZyLnpBeGlzfHwwfSl9LHI9PntBYz1udWxsLG4oYHN0YXJ0QWNjZWxlcm9tZXRlcjpmYWlsICR7ci5tZXNzYWdlfWApfSx7ZnJlcXVlbmN5OmpufSkpLEIodCxqbil9KSx1cD1SZShFYiwoZSx7cmVzb2x2ZTp0fSk9PntBYyYmKGMuYWNjZWxlcm9tZXRlci5jbGVhcldhdGNoKEFjKSxBYz1udWxsKSx0KCl9KSxJUz1ObihraCxTYygoKT0+Yy5ibHVldG9vdGgub25CbHVldG9vdGhEZXZpY2VGb3VuZC5iaW5kKGMuYmx1ZXRvb3RoKSxraCkpLFBTPU5uKFJoLFNjKCgpPT5jLmJsdWV0b290aC5vbkJsdWV0b290aEFkYXB0ZXJTdGF0ZUNoYW5nZS5iaW5kKGMuYmx1ZXRvb3RoKSxSaCkpLE5TPU5uKHhoLFNjKCgpPT5jLmJsdWV0b290aC5vbkJMRUNvbm5lY3Rpb25TdGF0ZUNoYW5nZS5iaW5kKGMuYmx1ZXRvb3RoKSx4aCkpLGtTPU5uKEJoLFNjKCgpPT5jLmJsdWV0b290aC5vbkJMRUNoYXJhY3RlcmlzdGljVmFsdWVDaGFuZ2UuYmluZChjLmJsdWV0b290aCksQmgpKSxSUz1SZSgib3BlbkJsdWV0b290aEFkYXB0ZXIiLE9pKCgpPT5jLmJsdWV0b290aC5vcGVuQmx1ZXRvb3RoQWRhcHRlci5iaW5kKGMuYmx1ZXRvb3RoKSkpLHhTPVJlKCJjbG9zZUJsdWV0b290aEFkYXB0ZXIiLE9pKCgpPT5jLmJsdWV0b290aC5jbG9zZUJsdWV0b290aEFkYXB0ZXIuYmluZChjLmJsdWV0b290aCkpKSxCUz1SZSgiZ2V0Qmx1ZXRvb3RoQWRhcHRlclN0YXRlIixPaSgoKT0+Yy5ibHVldG9vdGguZ2V0Qmx1ZXRvb3RoQWRhcHRlclN0YXRlLmJpbmQoYy5ibHVldG9vdGgpKSksTVM9UmUoVGIsT2koKCk9PmMuYmx1ZXRvb3RoLnN0YXJ0Qmx1ZXRvb3RoRGV2aWNlc0Rpc2NvdmVyeS5iaW5kKGMuYmx1ZXRvb3RoKSksSWIpLERTPVJlKCJzdG9wQmx1ZXRvb3RoRGV2aWNlc0Rpc2NvdmVyeSIsT2koKCk9PmMuYmx1ZXRvb3RoLnN0b3BCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5LmJpbmQoYy5ibHVldG9vdGgpKSksRlM9UmUoImdldEJsdWV0b290aERldmljZXMiLE9pKCgpPT5jLmJsdWV0b290aC5nZXRCbHVldG9vdGhEZXZpY2VzLmJpbmQoYy5ibHVldG9vdGgpKSksTFM9UmUoUGIsT2koKCk9PmMuYmx1ZXRvb3RoLmdldENvbm5lY3RlZEJsdWV0b290aERldmljZXMuYmluZChjLmJsdWV0b290aCkpLE5iKSxWUz1SZShrYixPaSgoKT0+Yy5ibHVldG9vdGguY3JlYXRlQkxFQ29ubmVjdGlvbi5iaW5kKGMuYmx1ZXRvb3RoKSksUmIpLCRTPVJlKHhiLE9pKCgpPT5jLmJsdWV0b290aC5jbG9zZUJMRUNvbm5lY3Rpb24uYmluZChjLmJsdWV0b290aCkpLEJiKSxVUz1SZShNYixPaSgoKT0+Yy5ibHVldG9vdGguZ2V0QkxFRGV2aWNlU2VydmljZXMuYmluZChjLmJsdWV0b290aCkpLERiKSxIUz1SZShGYixPaSgoKT0+Yy5ibHVldG9vdGguZ2V0QkxFRGV2aWNlQ2hhcmFjdGVyaXN0aWNzLmJpbmQoYy5ibHVldG9vdGgpKSxMYiksalM9UmUoVmIsT2koKCk9PmMuYmx1ZXRvb3RoLm5vdGlmeUJMRUNoYXJhY3RlcmlzdGljVmFsdWVDaGFuZ2UuYmluZChjLmJsdWV0b290aCkpLCRiKSx6Uz1SZShVYixPaSgoKT0+Yy5ibHVldG9vdGgucmVhZEJMRUNoYXJhY3RlcmlzdGljVmFsdWUuYmluZChjLmJsdWV0b290aCkpLEhiKSxXUz1SZShqYixPaSgoKT0+Yy5ibHVldG9vdGgud3JpdGVCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlLmJpbmQoYy5ibHVldG9vdGgpKSx6YiksR1M9UmUoV2IsT2koKCk9PmMuYmx1ZXRvb3RoLnNldEJMRU1UVS5iaW5kKGMuYmx1ZXRvb3RoKSksR2IpLFlTPVJlKFliLE9pKCgpPT5jLmJsdWV0b290aC5nZXRCTEVEZXZpY2VSU1NJLmJpbmQoYy5ibHVldG9vdGgpKSxxYikscVM9Tm4oTWgsU2MoKCk9PmMuaWJlYWNvbi5vbkJlYWNvblVwZGF0ZS5iaW5kKGMuaWJlYWNvbiksTWgpKSxLUz1ObihEaCxTYygoKT0+Yy5pYmVhY29uLm9uQmVhY29uU2VydmljZUNoYW5nZS5iaW5kKGMuaWJlYWNvbiksRGgpKSxKUz1SZShLYixPaSgoKT0+Yy5pYmVhY29uLmdldEJlYWNvbnMuYmluZChjLmliZWFjb24pKSksWlM9UmUoSmIsT2koKCk9PmMuaWJlYWNvbi5zdGFydEJlYWNvbkRpc2NvdmVyeS5iaW5kKGMuaWJlYWNvbikpLFpiKSxYUz1SZShYYixPaSgoKT0+Yy5pYmVhY29uLnN0b3BCZWFjb25EaXNjb3ZlcnkuYmluZChjLmliZWFjb24pKSksUVM9UmUodWIsKHtwaG9uZU51bWJlcjplfSx7cmVzb2x2ZTp0fSk9PihjLmRldmljZS5kaWFsKGUpLHQoKSksZmIpLGVDPXtuYW1lOntnaXZlbk5hbWU6ImZpcnN0TmFtZSIsbWlkZGxlTmFtZToibWlkZGxlTmFtZSIsZmFtaWx5TmFtZToibGFzdE5hbWUifSxuaWNrbmFtZToibmlja05hbWUiLHBob3Rvczp7dHlwZToidXJsIix2YWx1ZToicGhvdG9GaWxlUGF0aCJ9LG5vdGU6InJlbWFyayIscGhvbmVOdW1iZXJzOlt7dHlwZToibW9iaWxlIix2YWx1ZToibW9iaWxlUGhvbmVOdW1iZXIifSx7dHlwZToid29yayIsdmFsdWU6IndvcmtQaG9uZU51bWJlciJ9LHt0eXBlOiJjb21wYW55Iix2YWx1ZToiaG9zdE51bWJlciJ9LHt0eXBlOiJob21lIGZheCIsdmFsdWU6ImhvbWVGYXhOdW1iZXIifSx7dHlwZToid29yayBmYXgiLHZhbHVlOiJ3b3JrRmF4TnVtYmVyIn1dLGVtYWlsczpbe3R5cGU6ImhvbWUiLHZhbHVlOiJlbWFpbCJ9XSx1cmxzOlt7dHlwZToib3RoZXIiLHZhbHVlOiJ1cmwifV0sb3JnYW5pemF0aW9uczpbe3R5cGU6ImNvbXBhbnkiLG5hbWU6Im9yZ2FuaXphdGlvbiIsdGl0bGU6InRpdGxlIn1dLGltczpbe3R5cGU6Im90aGVyIix2YWx1ZToid2VDaGF0TnVtYmVyIn1dLGFkZHJlc3Nlczpbe3R5cGU6Im90aGVyIixwcmVmZXJyZWQ6ITAsY291bnRyeToiYWRkcmVzc0NvdW50cnkiLHJlZ2lvbjoiYWRkcmVzc1N0YXRlIixsb2NhbGl0eToiYWRkcmVzc0NpdHkiLHN0cmVldEFkZHJlc3M6ImFkZHJlc3NTdHJlZXQiLHBvc3RhbENvZGU6ImFkZHJlc3NQb3N0YWxDb2RlIn0se3R5cGU6ImhvbWUiLGNvdW50cnk6ImhvbWVBZGRyZXNzQ291bnRyeSIscmVnaW9uOiJob21lQWRkcmVzc1N0YXRlIixsb2NhbGl0eToiaG9tZUFkZHJlc3NDaXR5IixzdHJlZXRBZGRyZXNzOiJob21lQWRkcmVzc1N0cmVldCIscG9zdGFsQ29kZToiaG9tZUFkZHJlc3NQb3N0YWxDb2RlIn0se3R5cGU6ImNvbXBhbnkiLGNvdW50cnk6IndvcmtBZGRyZXNzQ291bnRyeSIscmVnaW9uOiJ3b3JrQWRkcmVzc1N0YXRlIixsb2NhbGl0eToid29ya0FkZHJlc3NDaXR5IixzdHJlZXRBZGRyZXNzOiJ3b3JrQWRkcmVzc1N0cmVldCIscG9zdGFsQ29kZToid29ya0FkZHJlc3NQb3N0YWxDb2RlIn1dfSx0Qz1bInR5cGUiLCJwcmVmZXJyZWQiXTtmdW5jdGlvbiAkZihlLHQsbil7bGV0IHI9MDtyZXR1cm4gT2JqZWN0LmtleXMobikuZm9yRWFjaChzPT57bGV0IGQ9bltzXTt0eXBlb2YgZCE9PSJvYmplY3QiP3RDLmluZGV4T2YocykhPT0tMT9lW3NdPW5bc106dHlwZW9mIHRbZF0hPSJ1bmRlZmluZWQiPyhyKyssZVtzXT10W2RdKTpkZWxldGUgZVtzXTpkIGluc3RhbmNlb2YgQXJyYXk/KGVbc109W10sZC5mb3JFYWNoKHk9PntsZXQgej17fTskZih6LHQseSkmJmVbc10ucHVzaCh6KX0pLGVbc10ubGVuZ3RoP3IrKzpkZWxldGUgZVtzXSk6KGVbc109e30sJGYoZVtzXSx0LGQpP3IrKzpkZWxldGUgZVtzXSl9KSxyfWxldCBuQz1SZShkYiwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PnshZS5waG90b0ZpbGVQYXRoJiYoZS5waG90b0ZpbGVQYXRoPSIiKSxjLmNvbnRhY3RzLmdldEFkZHJlc3NCb29rKGMuY29udGFjdHMuQUREUkVTU0JPT0tfUEhPTkUscj0+e2xldCBzPXIuY3JlYXRlKCk7JGYocyxlLGVDKSxzLnNhdmUoKCk9PnQoKSxkPT5uKCkpfSxyPT5uKCkpfSxwYixoYik7ZnVuY3Rpb24gdmEoZSl7cmV0dXJuIHR5cGVvZiB2IT0idW5kZWZpbmVkIj92LnJlcXVpcmVNb2R1bGUoZSk6X19yZXF1aXJlTmF0aXZlUGx1Z2luX18oZSl9ZnVuY3Rpb24gZnAoZSx0LG4pe3JldHVybiB2YSgicGx1cyIpLnNlbmROYXRpdmVFdmVudChlLHQsbil9bGV0IHJDPVJlKGdiLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e3ZhKCJjbGlwYm9hcmQiKS5nZXRTdHJpbmcocz0+e3MucmVzdWx0PT09InN1Y2Nlc3MiP3Qoe2RhdGE6cy5kYXRhfSk6bigiZ2V0Q2xpcGJvYXJkRGF0YTpmYWlsIil9KX0pLGlDPVJlKHZiLChlLHtyZXNvbHZlOnR9KT0+e3ZhKCJjbGlwYm9hcmQiKS5zZXRTdHJpbmcoZS5kYXRhKSx0KCl9LF9iLG1iKSxkcD0ib25OZXR3b3JrU3RhdHVzQ2hhbmdlIjtmdW5jdGlvbiBocCgpe3BwKCkudGhlbigoe25ldHdvcmtUeXBlOmV9KT0+e2J0Lmludm9rZU9uQ2FsbGJhY2soZHAse2lzQ29ubmVjdGVkOmUhPT0ibm9uZSIsbmV0d29ya1R5cGU6ZX0pfSl9bGV0IG9DPU5uKGRwLCgpPT57Yy5nbG9iYWxFdmVudC5hZGRFdmVudExpc3RlbmVyKCJuZXRjaGFuZ2UiLGhwKX0pLGFDPWxyKCJvZmZOZXR3b3JrU3RhdHVzQ2hhbmdlIiwoKT0+e2MuZ2xvYmFsRXZlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibmV0Y2hhbmdlIixocCl9KSxwcD1SZSgiZ2V0TmV0d29ya1R5cGUiLChlLHtyZXNvbHZlOnR9KT0+e2xldCBuPUNyW2MubmV0d29ya2luZm8uZ2V0Q3VycmVudFR5cGUoKV18fCJ1bmtub3duIjtyZXR1cm4gdCh7bmV0d29ya1R5cGU6bn0pfSk7ZnVuY3Rpb24gZ3AoKXtpZihjLm9zLm5hbWUudG9Mb3dlckNhc2UoKSE9PSJpb3MiKXJldHVybiExO2xldCB0PXZhKCJmYWNlSUQiKTtyZXR1cm4hISh0JiZ0LmlzU3VwcG9ydCgpKX1mdW5jdGlvbiB2cCgpe3JldHVybiEhKGMuZmluZ2VycHJpbnQmJmMuZmluZ2VycHJpbnQuaXNTdXBwb3J0KCkpfWxldCBtcD1lPT57bGV0IHQ9W107cmV0dXJuIHZwKCkmJnQucHVzaCgiZmluZ2VyUHJpbnQiKSxncCgpJiZ0LnB1c2goImZhY2lhbCIpLGUmJmUoe3N1cHBvcnRNb2RlOnR9KSx7c3VwcG9ydE1vZGU6dCxlcnJNc2c6ImNoZWNrSXNTdXBwb3J0U290ZXJBdXRoZW50aWNhdGlvbjpvayJ9fSxzQz1SZShuMCwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PnttcCh0KX0pLF9wPSh7Y2hlY2tBdXRoTW9kZTplLHJlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9KGQsZyk9Pm4mJm4oZCxnKSxzPWQ9PnQmJnQoZCk7aWYoZT09PSJmaW5nZXJQcmludCIpe2lmKHZwKCkpe2xldCBkPWMuZmluZ2VycHJpbnQuaXNLZXlndWFyZFNlY3VyZSgpJiZjLmZpbmdlcnByaW50LmlzRW5yb2xsZWRGaW5nZXJwcmludHMoKTtyZXR1cm4gcyh7aXNFbnJvbGxlZDpkfSkse2lzRW5yb2xsZWQ6ZCxlcnJNc2c6ImNoZWNrSXNTb3RlckVucm9sbGVkSW5EZXZpY2U6b2sifX1yZXR1cm4gcigibm90IHN1cHBvcnQiLHtpc0Vucm9sbGVkOiExfSkse2lzRW5yb2xsZWQ6ITEsZXJyTXNnOiJjaGVja0lzU290ZXJFbnJvbGxlZEluRGV2aWNlOmZhaWwgbm90IHN1cHBvcnQifX1lbHNlIGlmKGU9PT0iZmFjaWFsIil7aWYoZ3AoKSl7bGV0IGQ9dmEoImZhY2VJRCIpLGc9ZCYmZC5pc0tleWd1YXJkU2VjdXJlKCkmJmQuaXNFbnJvbGxlZEZhY2VJRCgpO3JldHVybiBzKHtpc0Vucm9sbGVkOmd9KSx7aXNFbnJvbGxlZDpnLGVyck1zZzoiY2hlY2tJc1NvdGVyRW5yb2xsZWRJbkRldmljZTpvayJ9fXJldHVybiByKCJub3Qgc3VwcG9ydCIse2lzRW5yb2xsZWQ6ITF9KSx7aXNFbnJvbGxlZDohMSxlcnJNc2c6ImNoZWNrSXNTb3RlckVucm9sbGVkSW5EZXZpY2U6ZmFpbCBub3Qgc3VwcG9ydCJ9fXJldHVybiByKCJub3Qgc3VwcG9ydCIse2lzRW5yb2xsZWQ6ITF9KSx7aXNFbnJvbGxlZDohMSxlcnJNc2c6ImNoZWNrSXNTb3RlckVucm9sbGVkSW5EZXZpY2U6ZmFpbCBub3Qgc3VwcG9ydCJ9fSxsQz1SZShyMCwoe2NoZWNrQXV0aE1vZGU6ZX0se3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57X3Aoe2NoZWNrQXV0aE1vZGU6ZSxyZXNvbHZlOnQscmVqZWN0Om59KX0sYTAsbzApLGNDPVJlKHMwLCh7cmVxdWVzdEF1dGhNb2RlczplLGNoYWxsZW5nZTp0PSExLGF1dGhDb250ZW50Om59LHtyZXNvbHZlOnIscmVqZWN0OnN9KT0+e3NhKCk7bGV0e3Q6ZH09WigpLGc9bXAoKS5zdXBwb3J0TW9kZTtpZihnLmxlbmd0aD09PTApcmV0dXJue2F1dGhNb2RlOiJmaW5nZXJQcmludCIsZXJyQ29kZTo5MDAwMSxlcnJNc2c6InN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjpmYWlsIn07bGV0IHk9W107aWYoZS5tYXAoKCQsX2UpPT57Zy5pbmRleE9mKCQpPi0xJiZ5LnB1c2goJCl9KSx5Lmxlbmd0aD09PTApcmV0dXJue2F1dGhNb2RlOiJmaW5nZXJQcmludCIsZXJyQ29kZTo5MDAwMyxlcnJNc2c6InN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjpmYWlsIG5vIGNvcnJlc3BvbmRpbmcgbW9kZSJ9O2xldCB6PVtdO2lmKHkubWFwKCgkLF9lKT0+e19wKHtjaGVja0F1dGhNb2RlOiR9KS5pc0Vucm9sbGVkJiZ6LnB1c2goJCl9KSx6Lmxlbmd0aD09PTApcmV0dXJue2F1dGhNb2RlOnlbMF0sZXJyQ29kZTo5MDAxMSxlcnJNc2c6YHN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjpmYWlsIG5vICR7eVswXX0gZW5yb2xsZWRgfTtsZXQgUD16WzBdO1A9PT0iZmluZ2VyUHJpbnQiPyhjLm9zLm5hbWUudG9Mb3dlckNhc2UoKT09PSJhbmRyb2lkIiYmKGMubmF0aXZlVUkuc2hvd1dhaXRpbmcobnx8ZCgidW5pLnN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbi5hdXRoQ29udGVudCIpKS5vbmNsb3NlPWZ1bmN0aW9uKCl7Yy5maW5nZXJwcmludC5jYW5jZWwoKX0pLGMuZmluZ2VycHJpbnQuYXV0aGVudGljYXRlKCgpPT57Yy5uYXRpdmVVSS5jbG9zZVdhaXRpbmcoKSxyKHthdXRoTW9kZTpQLGVyckNvZGU6MH0pfSwkPT57bGV0IF9lPXthdXRoTW9kZTpQfTtzd2l0Y2goJC5jb2RlKXtjYXNlICQuQVVUSEVOVElDQVRFX01JU01BVENIOmJyZWFrO2Nhc2UgJC5BVVRIRU5USUNBVEVfT1ZFUkxJTUlUOmMubmF0aXZlVUkuY2xvc2VXYWl0aW5nKCkscygiYXV0aGVudGljYXRlIGZyZWV6ZS4gcGxlYXNlIHRyeSBhZ2FpbiBsYXRlciIsUS5leHRlbmQoX2Use2VyckNvZGU6OTAwMTB9KSk7YnJlYWs7Y2FzZSAkLkNBTkNFTDpjLm5hdGl2ZVVJLmNsb3NlV2FpdGluZygpLHMoImNhbmNlbCIsUS5leHRlbmQoX2Use2VyckNvZGU6OTAwMDh9KSk7YnJlYWs7ZGVmYXVsdDpjLm5hdGl2ZVVJLmNsb3NlV2FpdGluZygpLHMoIiIsUS5leHRlbmQoX2Use2VyckNvZGU6OTAwMDd9KSk7YnJlYWt9fSx7bWVzc2FnZTpufSkpOlA9PT0iZmFjaWFsIiYmdmEoImZhY2VJRCIpLmF1dGhlbnRpY2F0ZSh7bWVzc2FnZTpufSxfZT0+e2xldCBUZT17YXV0aE1vZGU6UH07aWYoX2UudHlwZT09PSJzdWNjZXNzIiYmX2UuY29kZT09PTApcih7YXV0aE1vZGU6UCxlcnJDb2RlOjB9KTtlbHNlIHN3aXRjaChfZS5jb2RlKXtjYXNlIDQ6cygiIixRLmV4dGVuZChUZSx7ZXJyQ29kZTo5MDAwOX0pKTticmVhaztjYXNlIDU6cygiYXV0aGVudGljYXRlIGZyZWV6ZS4gcGxlYXNlIHRyeSBhZ2FpbiBsYXRlciIsUS5leHRlbmQoVGUse2VyckNvZGU6OTAwMTB9KSk7YnJlYWs7Y2FzZSA2OnMoIiIsUS5leHRlbmQoVGUse2VyckNvZGU6OTAwMDh9KSk7YnJlYWs7ZGVmYXVsdDpzKCIiLFEuZXh0ZW5kKFRlLHtlcnJDb2RlOjkwMDA3fSkpO2JyZWFrfX0pfSxjMCxsMCksdUM9UmUodTAsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57Tm8oKTtsZXR7dDpyfT1aKCksZD1ucCgpIT09ImxpZ2h0IixnLHk9ITEsej1Scyh7dXJsOiJfX3VuaWFwcHNjYW4iLGRhdGE6T2JqZWN0LmFzc2lnbih7fSxlLHttZXNzYWdlczp7ZmFpbDpyKCJ1bmkuc2NhbkNvZGUuZmFpbCIpLCJmbGFzaC5vbiI6cigidW5pLnNjYW5Db2RlLmZsYXNoLm9uIiksImZsYXNoLm9mZiI6cigidW5pLnNjYW5Db2RlLmZsYXNoLm9mZiIpfX0pLHN0eWxlOnthbmltYXRpb25UeXBlOmUuYW5pbWF0aW9uVHlwZXx8InBvcC1pbiIsdGl0bGVOVmlldzp7YXV0b0JhY2tCdXR0b246ITAsdHlwZToiZmxvYXQiLHRpdGxlVGV4dDplLnRpdGxlVGV4dHx8cigidW5pLnNjYW5Db2RlLnRpdGxlIiksdGl0bGVDb2xvcjoiI2ZmZmZmZiIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIixidXR0b25zOmUub25seUZyb21DYW1lcmE/W106W3t0ZXh0OmUuYWxidW1UZXh0fHxyKCJ1bmkuc2NhbkNvZGUuYWxidW0iKSxmb250U2l6ZToiMTdweCIsd2lkdGg6IjYwcHgiLG9uY2xpY2s6KCk9Pnt6LnNlbmRNZXNzYWdlKHt0eXBlOiJnYWxsZXJ5In0pfX1dfSxwb3BHZXN0dXJlOiJjbG9zZSIsYmFja2dyb3VuZDoiIzAwMDAwMCIsYmFja0J1dHRvbkF1dG9Db250cm9sOiJjbG9zZSJ9LG9uTWVzc2FnZSh7ZXZlbnQ6UCxkZXRhaWw6JH0pe2c9JCx5PVA9PT0ibWFya2VkIn0sb25DbG9zZSgpe2QmJmMubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJkYXJrIiksZz95PyhkZWxldGUgZy5tZXNzYWdlLHQoZykpOm4oZy5tZXNzYWdlKTpuKCJjYW5jZWwiKX19KTtkJiYoYy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImxpZ2h0Iiksei53ZWJ2aWV3LmFkZEV2ZW50TGlzdGVuZXIoInBvcEdlc3R1cmUiLCh7dHlwZTpQLHJlc3VsdDokfSk9PntQPT09InN0YXJ0Ij9jLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgiZGFyayIpOlA9PT0iZW5kIiYmISQmJmMubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJsaWdodCIpfSkpfSxmMCxoMCksZkM9Tm4oYWUuT05fVEhFTUVfQ0hBTkdFLCgpPT57YnQub24oYWUuT05fVEhFTUVfQ0hBTkdFLGU9PntidC5pbnZva2VPbkNhbGxiYWNrKGFlLk9OX1RIRU1FX0NIQU5HRSxlKX0pfSksZEM9UmUoUWIsKGUse3Jlc29sdmU6dH0pPT57bGV0IG49Yy5zY3JlZW4uZ2V0QnJpZ2h0bmVzcyghMSk7dCh7dmFsdWU6bn0pfSksaEM9UmUoZTAsKGUse3Jlc29sdmU6dH0pPT57Yy5zY3JlZW4uc2V0QnJpZ2h0bmVzcyhlLnZhbHVlLCExKSx0KCl9KSxwQz1SZSh0MCwoZSx7cmVzb2x2ZTp0fSk9PntjLmRldmljZS5zZXRXYWtlbG9jayghIWUua2VlcFNjcmVlbk9uKSx0KCl9KSxnQz1EdChwMCwoKT0+e2xldHtnZXRTeXN0ZW1TZXR0aW5nOmV9PXYucmVxdWlyZU1vZHVsZSgicGx1cyIpLHQ9ZSgpO3RyeXt0eXBlb2YgdD09InN0cmluZyImJih0PUpTT04ucGFyc2UodCkpfWNhdGNoKG4pe31yZXR1cm4gdH0pLGJwPUR0KGcwLCgpPT57bGV0e2dldEFwcEF1dGhvcml6ZVNldHRpbmc6ZX09di5yZXF1aXJlTW9kdWxlKCJwbHVzIiksdD1lKCk7dHJ5e3R5cGVvZiB0PT0ic3RyaW5nIiYmKHQ9SlNPTi5wYXJzZSh0KSl9Y2F0Y2gobil7fWZvcihsZXQgbiBpbiB0KVEuaGFzT3duKHQsbikmJnRbbl09PT0idW5kZWZpbmVkIiYmKHRbbl09dm9pZCAwKTtyZXR1cm4gdH0pLHZDPVJlKHYwLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldHtvcGVuQXBwQXV0aG9yaXplU2V0dGluZzpyfT12LnJlcXVpcmVNb2R1bGUoInBsdXMiKTtyKGQ9PntkLnR5cGU9PT0ic3VjY2VzcyI/dCgpOm4oKX0pfSksbUM9UmUocnksKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9U2krIi9kb3dubG9hZC8iO2MuaW8uZ2V0SW1hZ2VJbmZvKFEuZXh0ZW5kKGUse3NhdmVQYXRoOnIsZmlsZW5hbWU6cixzdWNjZXNzOmpsKHQpLGZhaWw6X3Iobil9KSl9LG95LGl5KSxfQz1SZSh1eSwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntjLmlvLmdldFZpZGVvSW5mbyh7ZmlsZVBhdGg6ZS5zcmMsc3VjY2VzczpyPT57dCh7b3JpZW50YXRpb246ci5vcmllbnRhdGlvbix0eXBlOnIudHlwZSxkdXJhdGlvbjpyLmR1cmF0aW9uLHNpemU6ci5zaXplLGhlaWdodDpyLmhlaWdodCx3aWR0aDpyLndpZHRoLGZwczpyLmZwc3x8MzAsYml0cmF0ZTpyLmJpdHJhdGV9KX0sZmFpbDpfcihuKX0pfSxkeSxmeSksYkM9UmUoYXksKHtjdXJyZW50OmU9MCxpbmRpY2F0b3I6dD0ibnVtYmVyIixsb29wOm49ITEsdXJsczpyLGxvbmdQcmVzc0FjdGlvbnM6c30se3Jlc29sdmU6ZCxyZWplY3Q6Z30pPT57VmEoKTtsZXR7dDp5fT1aKCk7cj1yLm1hcChQPT5TdChQKSk7bGV0IHo9TnVtYmVyKGUpO2lzTmFOKHopPyhlPXIuaW5kZXhPZihTdChlKSksZT1lPDA/MDplKTplPXosYy5uYXRpdmVVSS5wcmV2aWV3SW1hZ2Uocix7Y3VycmVudDplLGluZGljYXRvcjp0LGxvb3A6bixvbkxvbmdQcmVzczpmdW5jdGlvbihQKXtsZXQgJD1bXSxfZT0iIixUZT1zJiZRLmlzUGxhaW5PYmplY3Qocyk7VGU/KCQ9cy5pdGVtTGlzdD9zLml0ZW1MaXN0OltdLF9lPXMuaXRlbUNvbG9yP3MuaXRlbUNvbG9yOiIjMDAwMDAwIik6KCQ9W3koInVuaS5wcmV2aWV3SW1hZ2UuYnV0dG9uLnNhdmUiKV0sX2U9IiMwMDAwMDAiKTtsZXQgTGU9e2J1dHRvbnM6JC5tYXAoRXQ9Pih7dGl0bGU6RXQsY29sb3I6X2V9KSksY2FuY2VsOnkoInVuaS5wcmV2aWV3SW1hZ2UuY2FuY2VsIil9O2MubmF0aXZlVUkuYWN0aW9uU2hlZXQoTGUsRXQ9PntpZihFdC5pbmRleD4wKXtpZihUZSl7US5pc0Z1bmN0aW9uKHMuc3VjY2VzcykmJnMuc3VjY2Vzcyh7dGFwSW5kZXg6RXQuaW5kZXgtMSxpbmRleDpQLmluZGV4fSk7cmV0dXJufWMuZ2FsbGVyeS5zYXZlKFAudXJsLCgpPT57Yy5uYXRpdmVVSS50b2FzdCh5KCJ1bmkucHJldmlld0ltYWdlLnNhdmUuc3VjY2VzcyIpKX0sZnVuY3Rpb24oKXtjLm5hdGl2ZVVJLnRvYXN0KHkoInVuaS5wcmV2aWV3SW1hZ2Uuc2F2ZS5mYWlsIikpfSl9ZWxzZSBUZSYmUS5pc0Z1bmN0aW9uKHMuZmFpbCkmJnMuZmFpbCh7ZXJyTXNnOiJzaG93QWN0aW9uU2hlZXQ6ZmFpbCBjYW5jZWwifSl9KX19KSxkKCl9LGx5LHN5KSx5Qz1SZShjeSwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9Pnt0cnl7Yy5uYXRpdmVVSS5jbG9zZVByZXZpZXdJbWFnZSgpLHQoKX1jYXRjaChyKXtuKCl9fSksVWYsT2M9ITEsSGYsVGM9KGUsdD17fSk9PntFQyhRLmV4dGVuZCh7c3RhdGU6ZX0sdCkpfSxjdT17c3RhcnQoe2R1cmF0aW9uOmU9NmU0LHNhbXBsZVJhdGU6dCxudW1iZXJPZkNoYW5uZWxzOm4sZW5jb2RlQml0UmF0ZTpyLGZvcm1hdDpzPSJtcDMiLGZyYW1lU2l6ZTpkfT17fSl7aWYoT2MpcmV0dXJuIFRjKCJzdGFydCIpO1VmPWMuYXVkaW8uZ2V0UmVjb3JkZXIoKSxVZi5yZWNvcmQoe2Zvcm1hdDpzLHNhbXBsZXJhdGU6dD9TdHJpbmcodCk6IiIsZmlsZW5hbWU6U2krIi9yZWNvcmRlci8ifSxnPT5UYygic3RvcCIse3RlbXBGaWxlUGF0aDpnfSksZz0+VGMoImVycm9yIix7ZXJyTXNnOmcubWVzc2FnZX0pKSxIZj1CKCgpPT57Y3Uuc3RvcCgpfSxlKSxUYygic3RhcnQiKSxPYz0hMH0sc3RvcCgpe09jJiYoVWYuc3RvcCgpLE9jPSExLEhmJiZDKEhmKSl9LHBhdXNlKCl7T2MmJlRjKCJlcnJvciIse2Vyck1zZzoiVW5zdXBwb3J0ZWQgb3BlcmF0aW9uOiBwYXVzZSJ9KX0scmVzdW1lKCl7T2MmJlRjKCJlcnJvciIse2Vyck1zZzoiVW5zdXBwb3J0ZWQgb3BlcmF0aW9uOiByZXN1bWUifSl9fSx6bD17cGF1c2U6bnVsbCxyZXN1bWU6bnVsbCxzdGFydDpudWxsLHN0b3A6bnVsbCxlcnJvcjpudWxsfTtmdW5jdGlvbiBFQyhlKXtsZXQgdD1lLnN0YXRlO2RlbGV0ZSBlLnN0YXRlLGRlbGV0ZSBlLmVyck1zZyx0JiZRLmlzRnVuY3Rpb24oemxbdF0pJiZ6bFt0XShlKX1jbGFzcyB3Q3tjb25zdHJ1Y3Rvcigpe31vbkVycm9yKHQpe3psLmVycm9yPXR9b25GcmFtZVJlY29yZGVkKHQpe31vbkludGVycnVwdGlvbkJlZ2luKHQpe31vbkludGVycnVwdGlvbkVuZCh0KXt9b25QYXVzZSh0KXt6bC5wYXVzZT10fW9uUmVzdW1lKHQpe3psLnJlc3VtZT10fW9uU3RhcnQodCl7emwuc3RhcnQ9dH1vblN0b3AodCl7emwuc3RvcD10fXBhdXNlKCl7Y3UucGF1c2UoKX1yZXN1bWUoKXtjdS5yZXN1bWUoKX1zdGFydCh0PXt9KXtjdS5zdGFydCh0KX1zdG9wKCl7Y3Uuc3RvcCgpfX1sZXQgeXAsU0M9RHQoYnksKCk9PnlwfHwoeXA9bmV3IHdDKSksQ0M9UmUodnksKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57Yy5nYWxsZXJ5LnNhdmUoZS5maWxlUGF0aCxqbCh0KSxfcihuKSl9LF95LG15KSxBQz1SZShoeSwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntjLmdhbGxlcnkuc2F2ZShlLmZpbGVQYXRoLGpsKHQpLF9yKG4pKX0sZ3kscHkpLE9DPVJlKHl5LChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPWAke1NpfS9jb21wcmVzc2VkLyR7RGF0ZS5ub3coKX1fJHt2byhlLnNyYyl9YDtjLnppcC5jb21wcmVzc0ltYWdlKFEuZXh0ZW5kKHt9LGUse2RzdDpyfSksKCk9Pnt0KHt0ZW1wRmlsZVBhdGg6cn0pfSxuKX0sd3ksRXkpLFRDPVJlKFN5LChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPWAke1NpfS9jb21wcmVzc2VkLyR7RGF0ZS5ub3coKX1fJHt2byhlLnNyYyl9YDtjLnppcC5jb21wcmVzc1ZpZGVvKFEuZXh0ZW5kKHt9LGUse2ZpbGVuYW1lOnJ9KSwoKT0+e3Qoe3RlbXBGaWxlUGF0aDpyfSl9LG4pfSxBeSxDeSk7ZnVuY3Rpb24gSUMoZSl7cmV0dXJuIG5ldyBQcm9taXNlKCh0LG4pPT57Yy5pby5yZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJMKGUsZnVuY3Rpb24ocil7ci5nZXRNZXRhZGF0YSh0LG4sITEpfSxuKX0pfWxldCBQQz1SZShaMCwoe2NvdW50OmUsc2l6ZVR5cGU6dCxzb3VyY2VUeXBlOm4sY3JvcDpyfT17fSx7cmVzb2x2ZTpzLHJlamVjdDpkfSk9PnttcigpO2xldHt0Omd9PVooKSx5PV9yKGQpO2Z1bmN0aW9uIHooX2Upe2xldCBUZT1bXSxMZT1bXTtQcm9taXNlLmFsbChfZS5tYXAoRXQ9PklDKEV0KSkpLnRoZW4oRXQ9PntFdC5mb3JFYWNoKChrdCxybik9PntsZXQgVXQ9X2Vbcm5dO0xlLnB1c2goVXQpLFRlLnB1c2goe3BhdGg6VXQsc2l6ZTprdC5zaXplfSl9KSxzKHt0ZW1wRmlsZVBhdGhzOkxlLHRlbXBGaWxlczpUZX0pfSkuY2F0Y2goeSl9ZnVuY3Rpb24gUCgpe2MuY2FtZXJhLmdldENhbWVyYSgpLmNhcHR1cmVJbWFnZShUZT0+eihbVGVdKSx5LHtmaWxlbmFtZTpTaSsiL2NhbWVyYS8iLHJlc29sdXRpb246ImhpZ2giLGNyb3A6cixzaXplVHlwZTp0fSl9ZnVuY3Rpb24gJCgpe2MuZ2FsbGVyeS5waWNrKCh7ZmlsZXM6X2V9KT0+eihfZSkseSx7bWF4aW11bTplLG11bHRpcGxlOiEwLHN5c3RlbTohMSxmaWxlbmFtZTpTaSsiL2dhbGxlcnkvIixwZXJtaXNzaW9uQWxlcnQ6ITAsY3JvcDpyLHNpemVUeXBlOnR9KX1pZihuLmxlbmd0aD09PTEpe2lmKG4uaW5jbHVkZXMoImFsYnVtIikpeyQoKTtyZXR1cm59ZWxzZSBpZihuLmluY2x1ZGVzKCJjYW1lcmEiKSl7UCgpO3JldHVybn19Yy5uYXRpdmVVSS5hY3Rpb25TaGVldCh7Y2FuY2VsOmcoInVuaS5jaG9vc2VJbWFnZS5jYW5jZWwiKSxidXR0b25zOlt7dGl0bGU6ZygidW5pLmNob29zZUltYWdlLnNvdXJjZVR5cGUuY2FtZXJhIil9LHt0aXRsZTpnKCJ1bmkuY2hvb3NlSW1hZ2Uuc291cmNlVHlwZS5hbGJ1bSIpfV19LF9lPT57c3dpdGNoKF9lLmluZGV4KXtjYXNlIDE6UCgpO2JyZWFrO2Nhc2UgMjokKCk7YnJlYWs7ZGVmYXVsdDp5KCk7YnJlYWt9fSl9LFEwLFgwKSxOQz1SZShleSwoe3NvdXJjZVR5cGU6ZSxjb21wcmVzc2VkOnQsbWF4RHVyYXRpb246bixjYW1lcmE6cn0se3Jlc29sdmU6cyxyZWplY3Q6ZH0pPT57cW4oKTtsZXR7dDpnfT1aKCkseT1fcihkKTtmdW5jdGlvbiB6KF9lKXtjLmlvLmdldFZpZGVvSW5mbyh7ZmlsZVBhdGg6X2Usc3VjY2VzcyhUZSl7bGV0IExlPXtlcnJNc2c6ImNob29zZVZpZGVvOm9rIix0ZW1wRmlsZVBhdGg6X2Usc2l6ZTpUZS5zaXplLGR1cmF0aW9uOlRlLmR1cmF0aW9uLHdpZHRoOlRlLndpZHRoLGhlaWdodDpUZS5oZWlnaHR9O3MoTGUpfSxmYWlsOnl9KX1mdW5jdGlvbiBQKCl7Yy5nYWxsZXJ5LnBpY2soKHtmaWxlczpfZX0pPT56KF9lWzBdKSx5LHtmaWx0ZXI6InZpZGVvIixzeXN0ZW06ITEsbXVsdGlwbGU6ITAsbWF4aW11bToxLGZpbGVuYW1lOlNpKyIvZ2FsbGVyeS8iLHBlcm1pc3Npb25BbGVydDohMCx2aWRlb0NvbXByZXNzOnR9KX1mdW5jdGlvbiAkKCl7Yy5jYW1lcmEuZ2V0Q2FtZXJhKCkuc3RhcnRWaWRlb0NhcHR1cmUoeix5LHtpbmRleDpyPT09ImZyb250Ij8iMiI6IjEiLHZpZGVvTWF4aW11bUR1cmF0aW9uOm4sZmlsZW5hbWU6U2krIi9jYW1lcmEvIix2aWRlb0NvbXByZXNzOnR9KX1pZihlLmxlbmd0aD09PTEpe2lmKGUuaW5jbHVkZXMoImFsYnVtIikpe1AoKTtyZXR1cm59ZWxzZSBpZihlLmluY2x1ZGVzKCJjYW1lcmEiKSl7JCgpO3JldHVybn19Yy5uYXRpdmVVSS5hY3Rpb25TaGVldCh7Y2FuY2VsOmcoInVuaS5jaG9vc2VWaWRlby5jYW5jZWwiKSxidXR0b25zOlt7dGl0bGU6ZygidW5pLmNob29zZVZpZGVvLnNvdXJjZVR5cGUuY2FtZXJhIil9LHt0aXRsZTpnKCJ1bmkuY2hvb3NlVmlkZW8uc291cmNlVHlwZS5hbGJ1bSIpfV19LF9lPT57c3dpdGNoKF9lLmluZGV4KXtjYXNlIDE6JCgpO2JyZWFrO2Nhc2UgMjpQKCk7YnJlYWs7ZGVmYXVsdDp5KCk7YnJlYWt9fSl9LG55LHR5KSxrQz1SZShIMCwoZSx7cmVzb2x2ZTp0fSk9PntjLmtleS5zaG93U29mdEtleWJvcmQoKSx0KCl9KSxSQz1SZShVMCwoZSx7cmVzb2x2ZTp0fSk9PntjLmtleS5oaWRlU29mdEtleWJvcmQoKSx0KCl9KTtmdW5jdGlvbiBFcChlKXtidC5pbnZva2VPbkNhbGxiYWNrKGFlLk9OX0tFWUJPQVJEX0hFSUdIVF9DSEFOR0UsZSl9bGV0IHhDPU5uKGFlLk9OX0tFWUJPQVJEX0hFSUdIVF9DSEFOR0UsKCk9PntidC5vbihhZS5PTl9LRVlCT0FSRF9IRUlHSFRfQ0hBTkdFLEVwKX0pLEJDPWxyKGFlLk9OX0tFWUJPQVJEX0hFSUdIVF9DSEFOR0UsKCk9PntidC5vZmYoYWUuT05fS0VZQk9BUkRfSEVJR0hUX0NIQU5HRSxFcCl9KTtjbGFzcyBNQ3tjb25zdHJ1Y3Rvcih0KXt0aGlzLl9jYWxsYmFja3M9W10sdGhpcy5fZG93bmxvYWRlcj10LHQuYWRkRXZlbnRMaXN0ZW5lcigic3RhdGVjaGFuZ2VkIiwobixyKT0+e24uZG93bmxvYWRlZFNpemUmJm4udG90YWxTaXplJiZ0aGlzLl9jYWxsYmFja3MuZm9yRWFjaChzPT57cyh7cHJvZ3Jlc3M6TWF0aC5yb3VuZChuLmRvd25sb2FkZWRTaXplL24udG90YWxTaXplKjEwMCksdG90YWxCeXRlc1dyaXR0ZW46bi5kb3dubG9hZGVkU2l6ZSx0b3RhbEJ5dGVzRXhwZWN0ZWRUb1dyaXRlOm4udG90YWxTaXplfSl9KX0pfWFib3J0KCl7dGhpcy5fZG93bmxvYWRlci5hYm9ydCgpfW9uUHJvZ3Jlc3NVcGRhdGUodCl7IVEuaXNGdW5jdGlvbih0KXx8dGhpcy5fY2FsbGJhY2tzLnB1c2godCl9b2ZmUHJvZ3Jlc3NVcGRhdGUodCl7bGV0IG49dGhpcy5fY2FsbGJhY2tzLmluZGV4T2YodCk7bj49MCYmdGhpcy5fY2FsbGJhY2tzLnNwbGljZShuLDEpfW9uSGVhZGVyc1JlY2VpdmVkKHQpe3Rocm93IG5ldyBFcnJvcigiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4iKX1vZmZIZWFkZXJzUmVjZWl2ZWQodCl7dGhyb3cgbmV3IEVycm9yKCJNZXRob2Qgbm90IGltcGxlbWVudGVkLiIpfX1sZXQgREM9T28oRHksKHt1cmw6ZSxoZWFkZXI6dCx0aW1lb3V0Om59LHtyZXNvbHZlOnIscmVqZWN0OnN9KT0+e249KG58fEkubmV0d29ya1RpbWVvdXQmJkkubmV0d29ya1RpbWVvdXQucmVxdWVzdHx8NjAqMWUzKS8xZTM7bGV0IGQ9Yy5kb3dubG9hZGVyLmNyZWF0ZURvd25sb2FkKGUse3RpbWVvdXQ6bixmaWxlbmFtZTpTaSsiL2Rvd25sb2FkLyIscmV0cnk6MCxyZXRyeUludGVydmFsOjB9LCh5LHopPT57ej9yKHt0ZW1wRmlsZVBhdGg6eS5maWxlbmFtZSxzdGF0dXNDb2RlOnp9KTpzKGBzdGF0dXNDb2RlOiAke3p9YCl9KSxnPW5ldyBNQyhkKTtmb3IobGV0IHkgaW4gdClRLmhhc093bih0LHkpJiZkLnNldFJlcXVlc3RIZWFkZXIoeSx0W3ldKTtyZXR1cm4gZC5zdGFydCgpLGd9LEx5LEZ5KSxGQz1lPT57bGV0IHQ9ZVsiU2V0LUNvb2tpZSJdfHxlWyJzZXQtY29va2llIl0sbj1bXTtpZighdClyZXR1cm5bXTt0WzBdPT09IlsiJiZ0W3QubGVuZ3RoLTFdPT09Il0iJiYodD10LnNsaWNlKDEsLTEpKTtsZXQgcj10LnNwbGl0KCI7Iik7Zm9yKGxldCBzPTA7czxyLmxlbmd0aDtzKyspcltzXS5pbmRleE9mKCJFeHBpcmVzPSIpIT09LTF8fHJbc10uaW5kZXhPZigiZXhwaXJlcz0iKSE9PS0xP24ucHVzaChyW3NdLnJlcGxhY2UoIiwiLCIiKSk6bi5wdXNoKHJbc10pO3JldHVybiBuPW4uam9pbigiOyIpLnNwbGl0KCIsIiksbn07ZnVuY3Rpb24gTEMoZSx0KXtpZihRLmlzU3RyaW5nKGUuZGF0YSkmJmUuZGF0YS5jaGFyQ29kZUF0KDApPT09NjUyNzkmJihlLmRhdGE9ZS5kYXRhLnNsaWNlKDEpKSxlLnN0YXR1c0NvZGU9cGFyc2VJbnQoU3RyaW5nKGUuc3RhdHVzQ29kZSksMTApLFEuaXNQbGFpbk9iamVjdChlLmhlYWRlcikmJihlLmhlYWRlcj1PYmplY3Qua2V5cyhlLmhlYWRlcikucmVkdWNlKGZ1bmN0aW9uKG4scil7bGV0IHM9ZS5oZWFkZXJbcl07cmV0dXJuIFEuaXNBcnJheShzKT9uW3JdPXMuam9pbigiLCIpOlEuaXNTdHJpbmcocykmJihuW3JdPXMpLG59LHt9KSksdC5kYXRhVHlwZSYmdC5kYXRhVHlwZS50b0xvd2VyQ2FzZSgpPT09Impzb24iKXRyeXtlLmRhdGE9SlNPTi5wYXJzZShlLmRhdGEpfWNhdGNoKG4pe31yZXR1cm4gZX1jbGFzcyBWQ3tjb25zdHJ1Y3Rvcih0KXt0aGlzLl9yZXF1ZXN0VGFzaz10fWFib3J0KCl7dGhpcy5fcmVxdWVzdFRhc2suYWJvcnQoKX1vZmZIZWFkZXJzUmVjZWl2ZWQoKXt9b25IZWFkZXJzUmVjZWl2ZWQoKXt9fWxldCAkQz1PbyhPeSwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXR7aGVhZGVyOnIsbWV0aG9kOnMsZGF0YTpkLHRpbWVvdXQ6Zyx1cmw6eSxyZXNwb25zZVR5cGU6eixzc2xWZXJpZnk6UCxmaXJzdElwdjQ6JCx0bHM6X2V9PWUsVGU7Zm9yKGxldCBfdCBpbiByKWlmKF90LnRvTG93ZXJDYXNlKCk9PT0iY29udGVudC10eXBlIil7VGU9cltfdF07YnJlYWt9cyE9PSJHRVQiJiZUZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qc29uIik9PT0wJiZRLmlzUGxhaW5PYmplY3QoZCkmJihkPUpTT04uc3RyaW5naWZ5KGQpKTtsZXQgTGU9dmEoInN0cmVhbSIpLEV0PXt9LGt0LHJuLFV0PSExO2ZvcihsZXQgX3QgaW4gcilpZighVXQmJl90LnRvTG93ZXJDYXNlKCk9PT0iY29udGVudC10eXBlIil7aWYoVXQ9ITAsRXRbIkNvbnRlbnQtVHlwZSJdPXJbX3RdLHMhPT0iR0VUIiYmcltfdF0uaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIik9PT0wJiYhUS5pc1N0cmluZyhkKSYmIShkIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKXtsZXQgdm49W107Zm9yKGxldCBvbiBpbiBkKVEuaGFzT3duKGQsb24pJiZ2bi5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChvbikrIj0iK2VuY29kZVVSSUNvbXBvbmVudChkW29uXSkpO2Q9dm4uam9pbigiJiIpfX1lbHNlIEV0W190XT1yW190XTshVXQmJnM9PT0iUE9TVCImJihFdFsiQ29udGVudC1UeXBlIl09ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIpLGcmJihrdD1CKCgpPT57cm49ITAsbigidGltZW91dCIpfSxnKzIwMCkpO2xldCBEbj17bWV0aG9kOnMsdXJsOnkudHJpbSgpLGhlYWRlcnM6RXQsdHlwZTp6PT09ImFycmF5YnVmZmVyIj8iYmFzZTY0IjoidGV4dCIsdGltZW91dDpnfHw2ZTUsc3NsVmVyaWZ5OiFQLGZpcnN0SXB2NDokLHRsczpfZX0sVm49ITE7cyE9PSJHRVQiJiYodG9TdHJpbmcuY2FsbChkKT09PSJbb2JqZWN0IEFycmF5QnVmZmVyXSI/Vm49ITA6RG4uYm9keT1RLmlzU3RyaW5nKGQpP2Q6SlNPTi5zdHJpbmdpZnkoZCkpO2xldCBsbj0oe29rOl90LHN0YXR1czp2bixkYXRhOm9uLGhlYWRlcnM6cXQsZXJyb3JNc2c6eW59KT0+e2lmKHJuKXJldHVybjtrdCYmQyhrdCk7bGV0IGJyPXZuO2lmKGJyPjApdChMQyh7ZGF0YTpfdCYmej09PSJhcnJheWJ1ZmZlciI/Umkob24pOm9uLHN0YXR1c0NvZGU6YnIsaGVhZGVyOnF0LGNvb2tpZXM6RkMocXQpfSxlKSk7ZWxzZXtsZXQgS3Q9ImFib3J0IHN0YXR1c0NvZGU6Iiticjt5biYmKEt0PUt0KyIgIit5biksbihLdCl9fTtyZXR1cm4gVm4/TGUuZmV0Y2hXaXRoQXJyYXlCdWZmZXIoeyJAdHlwZSI6ImJpbmFyeSIsYmFzZTY0OllyKGQpfSxEbixsbik6TGUuZmV0Y2goRG4sbG4pLG5ldyBWQyh7YWJvcnQoKXtybj0hMCxrdCYmQyhrdCksbigiYWJvcnQiKX19KX0sa3ksUnkpLFVDPVJlKHh5LCh7Y2VydGlmaWNhdGVzOmV9LHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e3ZhKCJzdHJlYW0iKS5jb25maWdNVExTKGUsKHt0eXBlOnMsY29kZTpkLG1lc3NhZ2U6Z30pPT57c3dpdGNoKHMpe2Nhc2Uic3VjY2VzcyI6dCh7Y29kZTpkfSk7YnJlYWs7Y2FzZSJmYWlsIjpuKGcse2NvZGU6ZH0pO2JyZWFrfX0pfSxCeSxNeSksSWM9W10sUGM9e30samY9e29wZW46IiIsY2xvc2U6IiIsZXJyb3I6IiIsbWVzc2FnZToiIn0sdXU7ZnVuY3Rpb24gSEMoZSl7bGV0IHQ9U3RyaW5nKERhdGUubm93KCkpLG47dHJ5e3V1fHwodXU9dmEoInVuaS13ZWJTb2NrZXQiKSxqQyh1dSkpLHV1LldlYlNvY2tldCh7aWQ6dCx1cmw6ZS51cmwscHJvdG9jb2w6US5pc0FycmF5KGUucHJvdG9jb2xzKT9lLnByb3RvY29scy5qb2luKCIsIik6ZS5wcm90b2NvbHMsaGVhZGVyOmUuaGVhZGVyfSl9Y2F0Y2gocil7bj1yfXJldHVybntzb2NrZXQ6dXUsc29ja2V0SWQ6dCxlcnJNc2c6bn19ZnVuY3Rpb24gakMoZSl7ZS5vbm9wZW4odD0+e2xldCBuPVBjW3QuaWRdOyFufHxuLl9zb2NrZXRPbk9wZW4oKX0pLGUub25tZXNzYWdlKHQ9PntsZXQgbj1QY1t0LmlkXTshbnx8bi5fc29ja2V0T25NZXNzYWdlKHQpfSksZS5vbmVycm9yKHQ9PntsZXQgbj1QY1t0LmlkXTshbnx8bi5fc29ja2V0T25FcnJvcigpfSksZS5vbmNsb3NlKHQ9PntsZXQgbj1QY1t0LmlkXTshbnx8bi5fc29ja2V0T25DbG9zZSgpfSl9Y2xhc3MgekN7Y29uc3RydWN0b3IodCxuKXt0aGlzLmlkPW4sdGhpcy5fc29ja2V0PXQsdGhpcy5fY2FsbGJhY2tzPXtvcGVuOltdLGNsb3NlOltdLGVycm9yOltdLG1lc3NhZ2U6W119LHRoaXMuQ0xPU0VEPTMsdGhpcy5DTE9TSU5HPTIsdGhpcy5DT05ORUNUSU5HPTAsdGhpcy5PUEVOPTEsdGhpcy5yZWFkeVN0YXRlPXRoaXMuQ0xPU0VELCEhdGhpcy5fc29ja2V0fV9zb2NrZXRPbk9wZW4oKXt0aGlzLnJlYWR5U3RhdGU9dGhpcy5PUEVOLHRoaXMuc29ja2V0U3RhdGVDaGFuZ2UoIm9wZW4iKX1fc29ja2V0T25NZXNzYWdlKHQpe3RoaXMuc29ja2V0U3RhdGVDaGFuZ2UoIm1lc3NhZ2UiLHtkYXRhOnR5cGVvZiB0LmRhdGE9PSJvYmplY3QiP1JpKHQuZGF0YS5iYXNlNjQpOnQuZGF0YX0pfV9zb2NrZXRPbkVycm9yKCl7dGhpcy5zb2NrZXRTdGF0ZUNoYW5nZSgiZXJyb3IiKSx0aGlzLm9uRXJyb3JPckNsb3NlKCl9X3NvY2tldE9uQ2xvc2UoKXt0aGlzLnNvY2tldFN0YXRlQ2hhbmdlKCJjbG9zZSIpLHRoaXMub25FcnJvck9yQ2xvc2UoKX1vbkVycm9yT3JDbG9zZSgpe3RoaXMucmVhZHlTdGF0ZT10aGlzLkNMT1NFRCxkZWxldGUgUGNbdGhpcy5pZF07bGV0IHQ9SWMuaW5kZXhPZih0aGlzKTt0Pj0wJiZJYy5zcGxpY2UodCwxKX1zb2NrZXRTdGF0ZUNoYW5nZSh0LG49e30pe2xldCByPXQ9PT0ibWVzc2FnZSI/bjp7fTt0aGlzPT09SWNbMF0mJmpmW3RdJiZidC5pbnZva2VPbkNhbGxiYWNrKGpmW3RdLHIpLHRoaXMuX2NhbGxiYWNrc1t0XS5mb3JFYWNoKHM9PntRLmlzRnVuY3Rpb24ocykmJnMocil9KX1zZW5kKHQsbj0hMCl7dGhpcy5yZWFkeVN0YXRlIT09dGhpcy5PUEVOJiZhZS5jYWxsT3B0aW9ucyh0LCJzZW5kU29ja2V0TWVzc2FnZTpmYWlsIFdlYlNvY2tldCBpcyBub3QgY29ubmVjdGVkIik7dHJ5e3RoaXMuX3NvY2tldC5zZW5kKHtpZDp0aGlzLmlkLGRhdGE6dHlwZW9mIHQuZGF0YT09Im9iamVjdCI/eyJAdHlwZSI6ImJpbmFyeSIsYmFzZTY0OllyKHQuZGF0YSl9OnQuZGF0YX0pLG4mJmFlLmNhbGxPcHRpb25zKHQsInNlbmRTb2NrZXRNZXNzYWdlOm9rIil9Y2F0Y2gocil7biYmYWUuY2FsbE9wdGlvbnModCxgc2VuZFNvY2tldE1lc3NhZ2U6ZmFpbCAke3J9YCl9fWNsb3NlKHQsbj0hMCl7dGhpcy5yZWFkeVN0YXRlPXRoaXMuQ0xPU0lORzt0cnl7dGhpcy5fc29ja2V0LmNsb3NlKFEuZXh0ZW5kKHtpZDp0aGlzLmlkLGFyZ3M6dH0pKSxuJiZhZS5jYWxsT3B0aW9ucyh0LCJjbG9zZVNvY2tldDpvayIpfWNhdGNoKHIpe24mJmFlLmNhbGxPcHRpb25zKHQsYGNsb3NlU29ja2V0OmZhaWwgJHtyfWApfX1vbk9wZW4odCl7dGhpcy5fY2FsbGJhY2tzLm9wZW4ucHVzaCh0KX1vbkNsb3NlKHQpe3RoaXMuX2NhbGxiYWNrcy5jbG9zZS5wdXNoKHQpfW9uRXJyb3IodCl7dGhpcy5fY2FsbGJhY2tzLmVycm9yLnB1c2godCl9b25NZXNzYWdlKHQpe3RoaXMuX2NhbGxiYWNrcy5tZXNzYWdlLnB1c2godCl9fWxldCBXQz1PbyhIeSwoe3VybDplLHByb3RvY29sczp0LGhlYWRlcjpuLG1ldGhvZDpyfSx7cmVzb2x2ZTpzLHJlamVjdDpkfSk9PntsZXR7c29ja2V0Omcsc29ja2V0SWQ6eSxlcnJNc2c6en09SEMoe3VybDplLHByb3RvY29sczp0LGhlYWRlcjpuLG1ldGhvZDpyfSksUD1uZXcgekMoZyx5KTtyZXR1cm4gej9CKCgpPT57ZCh6KX0sMCk6KEljLnB1c2goUCksUGNbeV09UCksQigoKT0+e3MoKX0sMCksUH0senksankpLEdDPVJlKFd5LChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPUljWzBdO2lmKCFyfHxyLnJlYWR5U3RhdGUhPT1yLk9QRU4pe24oIldlYlNvY2tldCBpcyBub3QgY29ubmVjdGVkIik7cmV0dXJufXIuc2VuZCh7ZGF0YTplLmRhdGF9LCExKSx0KCl9LEd5KSxZQz1SZShZeSwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1JY1swXTtpZighcil7bigiV2ViU29ja2V0IGlzIG5vdCBjb25uZWN0ZWQiKTtyZXR1cm59ci5yZWFkeVN0YXRlPXIuQ0xPU0lORyxyLmNsb3NlKGUsITEpLHQoKX0scXkpO2Z1bmN0aW9uIEJ1KGUpe2xldCB0PWBvblNvY2tldCR7US5jYXBpdGFsaXplKGUpfWA7cmV0dXJuIE5uKHQsKCk9PntqZltlXT10fSl9bGV0IHFDPUJ1KCJvcGVuIiksS0M9QnUoImVycm9yIiksSkM9QnUoIm1lc3NhZ2UiKSxaQz1CdSgiY2xvc2UiKTtjbGFzcyBYQ3tjb25zdHJ1Y3Rvcih0KXt0aGlzLl9jYWxsYmFja3M9W10sdGhpcy5fdXBsb2FkZXI9dCx0LmFkZEV2ZW50TGlzdGVuZXIoInN0YXRlY2hhbmdlZCIsKG4scik9PntuLnVwbG9hZGVkU2l6ZSYmbi50b3RhbFNpemUmJnRoaXMuX2NhbGxiYWNrcy5mb3JFYWNoKHM9PntzKHtwcm9ncmVzczpwYXJzZUludChTdHJpbmcobi51cGxvYWRlZFNpemUvbi50b3RhbFNpemUqMTAwKSksdG90YWxCeXRlc1NlbnQ6bi51cGxvYWRlZFNpemUsdG90YWxCeXRlc0V4cGVjdGVkVG9TZW5kOm4udG90YWxTaXplfSl9KX0pfWFib3J0KCl7dGhpcy5fdXBsb2FkZXIuYWJvcnQoKX1vblByb2dyZXNzVXBkYXRlKHQpeyFRLmlzRnVuY3Rpb24odCl8fHRoaXMuX2NhbGxiYWNrcy5wdXNoKHQpfW9uSGVhZGVyc1JlY2VpdmVkKCl7fW9mZlByb2dyZXNzVXBkYXRlKHQpe2xldCBuPXRoaXMuX2NhbGxiYWNrcy5pbmRleE9mKHQpO24+PTAmJnRoaXMuX2NhbGxiYWNrcy5zcGxpY2UobiwxKX1vZmZIZWFkZXJzUmVjZWl2ZWQoKXt9fWxldCBRQz1PbyhWeSwoe3VybDplLHRpbWVvdXQ6dCxoZWFkZXI6bixmb3JtRGF0YTpyLGZpbGVzOnMsZmlsZVBhdGg6ZCxuYW1lOmd9LHtyZXNvbHZlOnkscmVqZWN0Onp9KT0+e2xldCBQPWMudXBsb2FkZXIuY3JlYXRlVXBsb2FkKGUse3RpbWVvdXQ6dCxyZXRyeTowLHJldHJ5SW50ZXJ2YWw6MH0sKF9lLFRlKT0+e1RlP3koe2RhdGE6X2UucmVzcG9uc2VUZXh0LHN0YXR1c0NvZGU6VGV9KTp6KGBzdGF0dXNDb2RlOiAke1RlfWApfSk7Zm9yKGxldCBfZSBpbiBuKVEuaGFzT3duKG4sX2UpJiZQLnNldFJlcXVlc3RIZWFkZXIoX2UsU3RyaW5nKG5bX2VdKSk7Zm9yKGxldCBfZSBpbiByKVEuaGFzT3duKHIsX2UpJiZQLmFkZERhdGEoX2UsU3RyaW5nKHJbX2VdKSk7cyYmcy5sZW5ndGg/cy5mb3JFYWNoKF9lPT57UC5hZGRGaWxlKFN0KF9lLnVyaSkse2tleTpfZS5uYW1lfHwiZmlsZSJ9KX0pOlAuYWRkRmlsZShTdChkKSx7a2V5Omd9KTtsZXQgJD1uZXcgWEMoUCk7cmV0dXJuIFAuc3RhcnQoKSwkfSxVeSwkeSksZ2w9e30sZUE9WyJwbGF5IiwiY2FucGxheSIsImVuZGVkIiwic3RvcCIsIndhaXRpbmciLCJzZWVraW5nIiwic2Vla2VkIiwicGF1c2UiXSx3cD0icGxheWJhY2siLHRBPWU9PntsZXQgdD1nbFtlXTshdHx8dC5pbml0U3RhdGVDaGFnZXx8KHQuaW5pdFN0YXRlQ2hhZ2U9ITAsdC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsbj0+e1NwKHtzdGF0ZToiZXJyb3IiLGF1ZGlvSWQ6ZSxlcnJNc2c6Ik1lZGlhRXJyb3IiLGVyckNvZGU6bi5jb2RlfSl9KSxlQS5mb3JFYWNoKG49Pnt0LmFkZEV2ZW50TGlzdGVuZXIobiwoKT0+e249PT0icGxheSI/dC5pc1N0b3BwZWQ9ITE6bj09PSJzdG9wIiYmKHQuaXNTdG9wcGVkPSEwKSxTcCh7c3RhdGU6bixhdWRpb0lkOmV9KX0pfSkpfTtmdW5jdGlvbiBuQSgpe2xldCBlPWAke0RhdGUubm93KCl9JHtNYXRoLnJhbmRvbSgpfWAsdD1nbFtlXT1jLmF1ZGlvLmNyZWF0ZVBsYXllcigiIik7cmV0dXJuIHQuc3JjPSIiLHQudm9sdW1lPTEsdC5zdGFydFRpbWU9MCx0LnNldFNlc3Npb25DYXRlZ29yeSh3cCkse2Vyck1zZzoiY3JlYXRlQXVkaW9JbnN0YW5jZTpvayIsYXVkaW9JZDplfX1mdW5jdGlvbiByQSh7YXVkaW9JZDplLHNyYzp0LHN0YXJ0VGltZTpuLGF1dG9wbGF5OnI9ITEsbG9vcDpzPSExLG9iZXlNdXRlU3dpdGNoOmQsdm9sdW1lOmcsc2Vzc2lvbkNhdGVnb3J5Onk9d3AscGxheWJhY2tSYXRlOnp9KXtsZXQgUD1nbFtlXTtpZihQKXtsZXQgJD17bG9vcDpzLGF1dG9wbGF5OnJ9O2lmKHQpe2xldCBfZT1TdCh0KTtQLnNyYyE9PV9lJiYoUC5zcmM9JC5zcmM9X2UpfW4mJihQLnN0YXJ0VGltZT0kLnN0YXJ0VGltZT1uKSx0eXBlb2YgZz09Im51bWJlciImJihQLnZvbHVtZT0kLnZvbHVtZT1nKSxQLnNldFN0eWxlcygkKSx5JiZQLnNldFNlc3Npb25DYXRlZ29yeSh5KSx6JiZQLnBsYXliYWNrUmF0ZSYmUC5wbGF5YmFja1JhdGUoeiksdEEoZSl9cmV0dXJue2Vyck1zZzoic2V0QXVkaW9TdGF0ZTpvayJ9fWZ1bmN0aW9uIGlBKHthdWRpb0lkOmV9KXtsZXQgdD1nbFtlXTtpZighdClyZXR1cm57ZXJyTXNnOiJnZXRBdWRpb1N0YXRlOmZhaWwifTtsZXR7c3JjOm4sc3RhcnRUaW1lOnIsdm9sdW1lOnN9PXQ7cmV0dXJue2Vyck1zZzoiZ2V0QXVkaW9TdGF0ZTpvayIsZHVyYXRpb246MWUzKih0LmdldER1cmF0aW9uKCl8fDApLGN1cnJlbnRUaW1lOnQuaXNTdG9wcGVkPzA6MWUzKnQuZ2V0UG9zaXRpb24oKSxwYXVzZWQ6dC5pc1BhdXNlZCgpLHNyYzpuLHZvbHVtZTpzLHN0YXJ0VGltZToxZTMqcixidWZmZXJlZDoxZTMqdC5nZXRCdWZmZXJlZCgpfX1mdW5jdGlvbiBvQSh7b3BlcmF0aW9uVHlwZTplLGF1ZGlvSWQ6dCxjdXJyZW50VGltZTpufSl7bGV0IHI9Z2xbdF07c3dpdGNoKGUpe2Nhc2UicGxheSI6Y2FzZSJwYXVzZSI6Y2FzZSJzdG9wIjpyW2U9PT0icGxheSImJnIuaXNQYXVzZWQoKT8icmVzdW1lIjplXSgpO2JyZWFrO2Nhc2Uic2VlayI6dHlwZW9mIG4hPSJ1bmRlZmluZWQiJiZyLnNlZWtUbyhuLzFlMyk7YnJlYWt9cmV0dXJue2Vyck1zZzoib3BlcmF0ZUF1ZGlvOm9rIn19bGV0IHpmPU9iamVjdC5jcmVhdGUobnVsbCksU3A9KHtzdGF0ZTplLGF1ZGlvSWQ6dCxlcnJNc2c6bixlcnJDb2RlOnJ9KT0+e2xldCBzPXpmW3RdO2lmKHMpaWYoQ3AocyxlLG4sciksZT09PSJwbGF5Iil7bGV0IGQ9cy5jdXJyZW50VGltZTtzLl9fdGltaW5nPWsoKCk9PntzLmN1cnJlbnRUaW1lIT09ZCYmQ3AocywidGltZVVwZGF0ZSIpfSwyMDApfWVsc2UoZT09PSJwYXVzZSJ8fGU9PT0ic3RvcCJ8fGU9PT0iZXJyb3IiKSYmdShzLl9fdGltaW5nKX0sYUE9W3tuYW1lOiJzcmMiLGNhY2hlOiEwfSx7bmFtZToic3RhcnRUaW1lIixkZWZhdWx0OjAsY2FjaGU6ITB9LHtuYW1lOiJhdXRvcGxheSIsZGVmYXVsdDohMSxjYWNoZTohMH0se25hbWU6Imxvb3AiLGRlZmF1bHQ6ITEsY2FjaGU6ITB9LHtuYW1lOiJvYmV5TXV0ZVN3aXRjaCIsZGVmYXVsdDohMCxyZWFkb25seTohMCxjYWNoZTohMH0se25hbWU6ImR1cmF0aW9uIixyZWFkb25seTohMH0se25hbWU6ImN1cnJlbnRUaW1lIixyZWFkb25seTohMH0se25hbWU6InBhdXNlZCIscmVhZG9ubHk6ITB9LHtuYW1lOiJidWZmZXJlZCIscmVhZG9ubHk6ITB9LHtuYW1lOiJ2b2x1bWUifSx7bmFtZToicGxheWJhY2tSYXRlIixjYWNoZTohMH1dO2NsYXNzIFdme2NvbnN0cnVjdG9yKHQpe3RoaXMuaWQ9dCx0aGlzLl9jYWxsYmFja3M9e30sdGhpcy5fb3B0aW9ucz17fSxnaC5mb3JFYWNoKG49Pnt0aGlzLl9jYWxsYmFja3Nbbl09W119KSxhQS5mb3JFYWNoKG49PntsZXQgcj1uLm5hbWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMscix7Z2V0OigpPT57bGV0IHM9bi5jYWNoZT90aGlzLl9vcHRpb25zOmlBKHthdWRpb0lkOnRoaXMuaWR9KSxkPXIgaW4gcz9zW3JdOm4uZGVmYXVsdDtyZXR1cm4gdHlwZW9mIGQ9PSJudW1iZXIiJiZyIT09InZvbHVtZSI/ZC8xZTM6ZH0sc2V0Om4ucmVhZG9ubHk/dm9pZCAwOnM9Pnt0aGlzLl9vcHRpb25zW3JdPXMsckEoUS5leHRlbmQoe30sdGhpcy5fb3B0aW9ucyx7YXVkaW9JZDp0aGlzLmlkfSkpfX0pfSksc0EoKX1wbGF5KCl7dGhpcy5fb3BlcmF0ZSgicGxheSIpfXBhdXNlKCl7dGhpcy5fb3BlcmF0ZSgicGF1c2UiKX1zdG9wKCl7dGhpcy5fb3BlcmF0ZSgic3RvcCIpfXNlZWsodCl7dGhpcy5fb3BlcmF0ZSgic2VlayIse2N1cnJlbnRUaW1lOnQqMWUzfSl9ZGVzdHJveSgpe3UodGhpcy5fX3RpbWluZyksZ2xbdGhpcy5pZF0mJihnbFt0aGlzLmlkXS5jbG9zZSgpLGRlbGV0ZSBnbFt0aGlzLmlkXSksZGVsZXRlIHpmW3RoaXMuaWRdfV9vcGVyYXRlKHQsbil7b0EoUS5leHRlbmQoe30sbix7YXVkaW9JZDp0aGlzLmlkLG9wZXJhdGlvblR5cGU6dH0pKX19bGV0IHNBPWFlLm9uY2UoKCk9PntnaC5mb3JFYWNoKGU9PntXZi5wcm90b3R5cGVbZV09ZnVuY3Rpb24odCl7US5pc0Z1bmN0aW9uKHQpJiZ0aGlzLl9jYWxsYmFja3NbZV0ucHVzaCh0KX19KSx2Xy5mb3JFYWNoKGU9PntXZi5wcm90b3R5cGVbZV09ZnVuY3Rpb24odCl7bGV0IG49dGhpcy5fY2FsbGJhY2tzW2VdLHI9bi5pbmRleE9mKHQpO3I+PTAmJm4uc3BsaWNlKHIsMSl9fSl9KTtmdW5jdGlvbiBDcChlLHQsbixyKXtsZXQgcz1gb24ke1EuY2FwaXRhbGl6ZSh0KX1gO2UuX2NhbGxiYWNrc1tzXS5mb3JFYWNoKGQ9PntRLmlzRnVuY3Rpb24oZCkmJmQodD09PSJlcnJvciI/e2Vyck1zZzpuLGVyckNvZGU6cn06e30pfSl9bGV0IGxBPUR0KFdtLCgpPT57bGV0e2F1ZGlvSWQ6ZX09bkEoKSx0PW5ldyBXZihlKTtyZXR1cm4gemZbZV09dCx0fSksY0E9WyJjYW5wbGF5IiwicGxheSIsInBhdXNlIiwic3RvcCIsImVuZGVkIiwidGltZVVwZGF0ZSIsInByZXYiLCJuZXh0IiwiZXJyb3IiLCJ3YWl0aW5nIl0sQXA9e2NhbnBsYXk6W10scGxheTpbXSxwYXVzZTpbXSxzdG9wOltdLGVuZGVkOltdLHRpbWVVcGRhdGU6W10scHJldjpbXSxuZXh0OltdLGVycm9yOltdLHdhaXRpbmc6W119LFF0LEdmPW51bGwsdUE9MjUwLGZBPVsicGxheSIsInBhdXNlIiwiZW5kZWQiLCJzdG9wIiwiY2FucGxheSJdO2Z1bmN0aW9uIGRBKCl7TXUoKSxHZj1rKCgpPT57TmMoe3N0YXRlOiJ0aW1lVXBkYXRlIn0pfSx1QSl9ZnVuY3Rpb24gTXUoKXtHZiE9PW51bGwmJnUoR2YpfWZ1bmN0aW9uIGhBKCl7aWYoUXQpcmV0dXJuO2xldCBlPWJ0Lmludm9rZU9uQ2FsbGJhY2s7UXQ9Yy5hdWRpby5jcmVhdGVQbGF5ZXIoe2F1dG9wbGF5OiEwLGJhY2tncm91bmRDb250cm9sOiEwfSksUXQuc3JjPVF0LnRpdGxlPVF0LmVwbmFtZT1RdC5zaW5nZXI9UXQuY292ZXJJbWdVcmw9UXQud2ViVXJsPSIiLFF0LnN0YXJ0VGltZT0wLGZBLmZvckVhY2godD0+e1F0LmFkZEV2ZW50TGlzdGVuZXIodCwoKT0+e3Q9PT0icGxheSI/KFF0LmlzU3RvcHBlZD0hMSxkQSgpKTp0PT09InN0b3AiJiYoUXQuaXNTdG9wcGVkPSEwKSwodD09PSJwYXVzZSJ8fHQ9PT0iZW5kZWQifHx0PT09InN0b3AiKSYmTXUoKTtsZXQgbj1gb25NdXNpYyR7dFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSl9YDtlKG4se2RhdGFVcmw6UXQuc3JjLGVyck1zZzpgJHtufTpva2B9KSxOYyh7c3RhdGU6dCxkYXRhVXJsOlF0LnNyY30pfSl9KSxRdC5hZGRFdmVudExpc3RlbmVyKCJ3YWl0aW5nIiwoKT0+e011KCksTmMoe3N0YXRlOiJ3YWl0aW5nIixkYXRhVXJsOlF0LnNyY30pfSksUXQuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHQ9PntNdSgpLGUoIm9uTXVzaWNFcnJvciIse2RhdGFVcmw6UXQuc3JjLGVyck1zZzoiRXJyb3I6Iit0Lm1lc3NhZ2V9KSxOYyh7c3RhdGU6ImVycm9yIixkYXRhVXJsOlF0LnNyYyxlcnJNc2c6dC5tZXNzYWdlLGVyckNvZGU6dC5jb2RlfSl9KSxRdC5hZGRFdmVudExpc3RlbmVyKCJwcmV2IiwoKT0+e05jKHtzdGF0ZToicHJldiJ9KX0pLFF0LmFkZEV2ZW50TGlzdGVuZXIoIm5leHQiLCgpPT57TmMoe3N0YXRlOiJuZXh0In0pfSl9ZnVuY3Rpb24gcEEoKXtsZXQgZT17ZHVyYXRpb246MCxjdXJyZW50VGltZTowLHBhdXNlZDohMSxzcmM6IiIsYnVmZmVyZWQ6MCx0aXRsZToiIixlcG5hbWU6IiIsc2luZ2VyOiIiLGNvdmVySW1nVXJsOiIiLHdlYlVybDoiIixzdGFydFRpbWU6MCxlcnJNc2c6ImdldEJhY2tncm91bmRBdWRpb1N0YXRlOm9rIn07aWYoUXQpe2xldCB0PXtkdXJhdGlvbjpRdC5nZXREdXJhdGlvbigpfHwwLGN1cnJlbnRUaW1lOlF0LmlzU3RvcHBlZD8wOlF0LmdldFBvc2l0aW9uKCkscGF1c2VkOlF0LmlzUGF1c2VkKCksc3JjOlF0LnNyYyxidWZmZXJlZDpRdC5nZXRCdWZmZXJlZCgpLHRpdGxlOlF0LnRpdGxlLGVwbmFtZTpRdC5lcG5hbWUsc2luZ2VyOlF0LnNpbmdlcixjb3ZlckltZ1VybDpRdC5jb3ZlckltZ1VybCx3ZWJVcmw6UXQud2ViVXJsLHN0YXJ0VGltZTpRdC5zdGFydFRpbWV9O2U9US5leHRlbmQoZSx0KX1yZXR1cm4gZX1mdW5jdGlvbiBPcChlLHQpe2hBKCk7bGV0IG49WyJzcmMiLCJzdGFydFRpbWUiLCJjb3ZlckltZ1VybCIsIndlYlVybCIsInNpbmdlciIsImVwbmFtZSIsInRpdGxlIl07aWYodD09PSJwbGF5YmFja1JhdGUiKXtsZXQgcz1lW3RdO1F0LnBsYXliYWNrUmF0ZSYmUXQucGxheWJhY2tSYXRlKHBhcnNlRmxvYXQocykpO3JldHVybn1sZXQgcj17fTtPYmplY3Qua2V5cyhlKS5mb3JFYWNoKHM9PntpZihuLmluZGV4T2Yocyk+PTApe2xldCBkPWVbc107cz09PW5bMF0mJmQmJihkPVN0KGQpKSxRdFtzXT1yW3NdPWR9fSksUXQuc2V0U3R5bGVzKHIpfWZ1bmN0aW9uIGdBKHtvcGVyYXRpb25UeXBlOmUsc3JjOnQscG9zaXRpb246bixhcGk6cj0ib3BlcmF0ZU11c2ljUGxheWVyIix0aXRsZTpzLGNvdmVySW1nVXJsOmR9KXt2YXIgZz1bInJlc3VtZSIsInBhdXNlIiwic3RvcCJdO3JldHVybiBnLmluZGV4T2YoZSk+MD9RdCYmUXRbZV0oKTplPT09InBsYXkiPyhPcCh7c3JjOnQsc3RhcnRUaW1lOm4sdGl0bGU6cyxjb3ZlckltZ1VybDpkfSksUXQucGxheSgpKTplPT09InNlZWsiJiZRdCYmUXQuc2Vla1RvKG4pLHtlcnJNc2c6YCR7cn06b2tgfX1mdW5jdGlvbiB2QSh7b3BlcmF0aW9uVHlwZTplLHNyYzp0LHN0YXJ0VGltZTpuLGN1cnJlbnRUaW1lOnJ9KXtyZXR1cm4gZ0Eoe29wZXJhdGlvblR5cGU6ZSxzcmM6dCxwb3NpdGlvbjpufHxyfHwwLGFwaToib3BlcmF0ZUJhY2tncm91bmRBdWRpbyJ9KX1mdW5jdGlvbiBOYyh7c3RhdGU6ZSxlcnJNc2c6dCxlcnJDb2RlOm4sZGF0YVVybDpyfSl7QXBbZV0uZm9yRWFjaChzPT57US5pc0Z1bmN0aW9uKHMpJiZzKGU9PT0iZXJyb3IiP3tlcnJNc2c6dCxlcnJDb2RlOm59Ont9KX0pfWxldCBtQT1hZS5vbmNlKCgpPT57Y0EuZm9yRWFjaChlPT57VHAucHJvdG90eXBlW2BvbiR7US5jYXBpdGFsaXplKGUpfWBdPWZ1bmN0aW9uKHQpe0FwW2VdLnB1c2godCl9fSl9KSxfQT1be25hbWU6ImR1cmF0aW9uIixyZWFkb25seTohMH0se25hbWU6ImN1cnJlbnRUaW1lIixyZWFkb25seTohMH0se25hbWU6InBhdXNlZCIscmVhZG9ubHk6ITB9LHtuYW1lOiJzcmMiLGNhY2hlOiEwfSx7bmFtZToic3RhcnRUaW1lIixkZWZhdWx0OjAsY2FjaGU6ITB9LHtuYW1lOiJidWZmZXJlZCIscmVhZG9ubHk6ITB9LHtuYW1lOiJ0aXRsZSIsY2FjaGU6ITB9LHtuYW1lOiJlcG5hbWUiLGNhY2hlOiEwfSx7bmFtZToic2luZ2VyIixjYWNoZTohMH0se25hbWU6ImNvdmVySW1nVXJsIixjYWNoZTohMH0se25hbWU6IndlYlVybCIsY2FjaGU6ITB9LHtuYW1lOiJwcm90b2NvbCIscmVhZG9ubHk6ITAsZGVmYXVsdDoiaHR0cCJ9LHtuYW1lOiJwbGF5YmFja1JhdGUiLGRlZmF1bHQ6MSxjYWNoZTohMH1dO2NsYXNzIFRwe2NvbnN0cnVjdG9yKCl7dGhpcy5fb3B0aW9ucz17fSxfQS5mb3JFYWNoKHQ9PntsZXQgbj10Lm5hbWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsbix7Z2V0OigpPT57bGV0IHI9dC5jYWNoZT90aGlzLl9vcHRpb25zOnBBKCk7cmV0dXJuIG4gaW4gcj9yW25dOnQuZGVmYXVsdH0sc2V0OnQucmVhZG9ubHk/dm9pZCAwOnI9Pnt0aGlzLl9vcHRpb25zW25dPXIsT3AodGhpcy5fb3B0aW9ucyxuKX19KX0pLG1BKCl9cGxheSgpe3RoaXMuX29wZXJhdGUoInBsYXkiKX1wYXVzZSgpe3RoaXMuX29wZXJhdGUoInBhdXNlIil9c3RvcCgpe3RoaXMuX29wZXJhdGUoInN0b3AiKX1zZWVrKHQpe3RoaXMuX29wZXJhdGUoInNlZWsiLHtjdXJyZW50VGltZTp0fSl9X29wZXJhdGUodCxuKXt2QShRLmV4dGVuZCh7fSxuLHtvcGVyYXRpb25UeXBlOnR9KSl9fWxldCBJcCxiQT1EdChjYiwoKT0+SXB8fChJcD1uZXcgVHApKTtjbGFzcyB5QXtjb25zdHJ1Y3Rvcih0LG4pe3RoaXMuaWQ9dCx0aGlzLmN0eD1ufXN0YXJ0KHQpe3JldHVybiBZdCh0aGlzLmN0eCwic3RhcnQiLHQpfXN0b3AodCl7cmV0dXJuIFl0KHRoaXMuY3R4LCJzdG9wIix0KX1wYXVzZSh0KXtyZXR1cm4gWXQodGhpcy5jdHgsInBhdXNlIix0KX1yZXN1bWUodCl7cmV0dXJuIFl0KHRoaXMuY3R4LCJyZXN1bWUiLHQpfXN3aXRjaENhbWVyYSh0KXtyZXR1cm4gWXQodGhpcy5jdHgsInN3aXRjaENhbWVyYSIsdCl9c25hcHNob3QodCl7cmV0dXJuIFl0KHRoaXMuY3R4LCJzbmFwc2hvdCIsdCl9dG9nZ2xlVG9yY2godCl7cmV0dXJuIFl0KHRoaXMuY3R4LCJ0b2dnbGVUb3JjaCIsdCl9cGxheUJHTSh0KXtyZXR1cm4gS24odGhpcy5jdHgsInBsYXlCR00iLHQpfXN0b3BCR00odCl7cmV0dXJuIFl0KHRoaXMuY3R4LCJzdG9wQkdNIix0KX1wYXVzZUJHTSh0KXtyZXR1cm4gWXQodGhpcy5jdHgsInBhdXNlQkdNIix0KX1yZXN1bWVCR00odCl7cmV0dXJuIFl0KHRoaXMuY3R4LCJyZXN1bWVCR00iLHQpfXNldEJHTVZvbHVtZSh0KXtyZXR1cm4gS24odGhpcy5jdHgsInNldEJHTVZvbHVtZSIsdCl9c3RhcnRQcmV2aWV3KHQpe3JldHVybiBZdCh0aGlzLmN0eCwic3RhcnRQcmV2aWV3Iix0KX1zdG9wUHJldmlldyh0KXtyZXR1cm4gWXQodGhpcy5jdHgsInN0b3BQcmV2aWV3Iix0KX19ZnVuY3Rpb24gdmwoZSx0LG4scil7YnQuaW52b2tlVmlld01ldGhvZCgibGl2ZXB1c2hlci4iK2Use2xpdmVQdXNoZXJJZDplLHR5cGU6bixkYXRhOnJ9LHQpfWNsYXNzIEVBe2NvbnN0cnVjdG9yKHQsbil7dGhpcy5pZD10LHRoaXMucGFnZUlkPW59c3RhcnQoKXt2bCh0aGlzLmlkLHRoaXMucGFnZUlkLCJzdGFydCIpfXN0b3AoKXt2bCh0aGlzLmlkLHRoaXMucGFnZUlkLCJzdG9wIil9cGF1c2UoKXt2bCh0aGlzLmlkLHRoaXMucGFnZUlkLCJwYXVzZSIpfXJlc3VtZSgpe3ZsKHRoaXMuaWQsdGhpcy5wYWdlSWQsInJlc3VtZSIpfXN3aXRjaENhbWVyYSgpe3ZsKHRoaXMuaWQsdGhpcy5wYWdlSWQsInN3aXRjaENhbWVyYSIpfXN0YXJ0UHJldmlldygpe3ZsKHRoaXMuaWQsdGhpcy5wYWdlSWQsInByZXZpZXciKX1zdG9wUHJldmlldygpe3ZsKHRoaXMuaWQsdGhpcy5wYWdlSWQsInN0b3AiKX1zbmFwc2hvdCgpe3ZsKHRoaXMuaWQsdGhpcy5wYWdlSWQsInNuYXBzaG90Iil9fWxldCB3QT1EdChHbSwoZSx0KT0+e2lmKHQuJHBhZ2UubWV0YS5pc05WdWUpe2lmKCF0KXJldHVybiBjb25zb2xlLndhcm4oInVuaS5jcmVhdGVMaXZlUHVzaGVyQ29udGV4dDogMiBhcmd1bWVudHMgcmVxdWlyZWQsIGJ1dCBvbmx5IDEgcHJlc2VudCIpO2xldCBuPXphKGUsdCk7cmV0dXJuIG4/bmV3IHlBKGUsbik6Y29uc29sZS53YXJuKCJDYW4gbm90IGZpbmQgYCIrZSsiYCIpfXJldHVybiBuZXcgRUEoZSx0LiRwYWdlLmlkKX0sWW0pLFVpPTMuMTQxNTkyNjUzNTg5NzkzLER1PTYzNzgyNDUsRnU9LjAwNjY5MzQyMTYyMjk2NTk0MztmdW5jdGlvbiBTQShlLHQpe2lmKHQ9K3QsZT0rZSxQcChlLHQpKXJldHVybltlLHRdO2xldCBuPU5wKGUtMTA1LHQtMzUpLHI9a3AoZS0xMDUsdC0zNSkscz10LzE4MCpVaSxkPU1hdGguc2luKHMpO2Q9MS1GdSpkKmQ7bGV0IGc9TWF0aC5zcXJ0KGQpO249bioxODAvKER1KigxLUZ1KS8oZCpnKSpVaSkscj1yKjE4MC8oRHUvZypNYXRoLmNvcyhzKSpVaSk7bGV0IHk9dCtuLHo9ZStyO3JldHVybltlKjIteix0KjIteV19ZnVuY3Rpb24gQ0EoZSx0KXtpZih0PSt0LGU9K2UsUHAoZSx0KSlyZXR1cm5bZSx0XTtsZXQgbj1OcChlLTEwNSx0LTM1KSxyPWtwKGUtMTA1LHQtMzUpLHM9dC8xODAqVWksZD1NYXRoLnNpbihzKTtkPTEtRnUqZCpkO2xldCBnPU1hdGguc3FydChkKTtuPW4qMTgwLyhEdSooMS1GdSkvKGQqZykqVWkpLHI9cioxODAvKER1L2cqTWF0aC5jb3MocykqVWkpO2xldCB5PXQrbjtyZXR1cm5bZStyLHldfWxldCBQcD1mdW5jdGlvbihlLHQpe3JldHVybiBlPDcyLjAwNHx8ZT4xMzcuODM0N3x8dDwuODI5M3x8dD41NS44MjcxfHwhMX0sTnA9ZnVuY3Rpb24oZSx0KXtsZXQgbj0tMTAwKzIqZSszKnQrLjIqdCp0Ky4xKmUqdCsuMipNYXRoLnNxcnQoTWF0aC5hYnMoZSkpO3JldHVybiBuKz0oMjAqTWF0aC5zaW4oNiplKlVpKSsyMCpNYXRoLnNpbigyKmUqVWkpKSoyLzMsbis9KDIwKk1hdGguc2luKHQqVWkpKzQwKk1hdGguc2luKHQvMypVaSkpKjIvMyxuKz0oMTYwKk1hdGguc2luKHQvMTIqVWkpKzMyMCpNYXRoLnNpbih0KlVpLzMwKSkqMi8zLG59LGtwPWZ1bmN0aW9uKGUsdCl7bGV0IG49MzAwK2UrMip0Ky4xKmUqZSsuMSplKnQrLjEqTWF0aC5zcXJ0KE1hdGguYWJzKGUpKTtyZXR1cm4gbis9KDIwKk1hdGguc2luKDYqZSpVaSkrMjAqTWF0aC5zaW4oMiplKlVpKSkqMi8zLG4rPSgyMCpNYXRoLnNpbihlKlVpKSs0MCpNYXRoLnNpbihlLzMqVWkpKSoyLzMsbis9KDE1MCpNYXRoLnNpbihlLzEyKlVpKSszMDAqTWF0aC5zaW4oZS8zMCpVaSkpKjIvMyxufTtmdW5jdGlvbiBScChlLHQsbil7bGV0IHI9dC5jb29yZHM7aWYoZSE9PXQuY29vcmRzVHlwZSl7bGV0IHM7ZT09PSJ3Z3M4NCI/cz1TQShyLmxvbmdpdHVkZSxyLmxhdGl0dWRlKTplPT09ImdjajAyIiYmKHM9Q0Eoci5sb25naXR1ZGUsci5sYXRpdHVkZSkpLHMmJihyLmxvbmdpdHVkZT1zWzBdLHIubGF0aXR1ZGU9c1sxXSl9bih7dHlwZTplLGFsdGl0dWRlOnIuYWx0aXR1ZGV8fDAsbGF0aXR1ZGU6ci5sYXRpdHVkZSxsb25naXR1ZGU6ci5sb25naXR1ZGUsc3BlZWQ6ci5zcGVlZCxhY2N1cmFjeTpyLmFjY3VyYWN5LGFkZHJlc3M6dC5hZGRyZXNzLGVyck1zZzoiZ2V0TG9jYXRpb246b2sifSl9bGV0IEFBPVJlKFcwLCh7dHlwZTplPSJ3Z3M4NCIsZ2VvY29kZTp0PSExLGFsdGl0dWRlOm49ITEsaGlnaEFjY3VyYWN5RXhwaXJlVGltZTpyLGlzSGlnaEFjY3VyYWN5OnM9ITF9LHtyZXNvbHZlOmQscmVqZWN0Omd9KT0+e2MuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKHk9PntScChlLHksZCl9LHk9PntpZih5LmNvZGU9PT0xNTAxKXtScChlLHksZCk7cmV0dXJufWcoImdldExvY2F0aW9uOmZhaWwgIit5Lm1lc3NhZ2UpfSx7Z2VvY29kZTp0LGVuYWJsZUhpZ2hBY2N1cmFjeTpzfHxuLHRpbWVvdXQ6cixjb29yZHNUeXBlOmV9KX0sWTAsRzApLE9BPVJlKGowLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCBzPW5wKCkhPT0ibGlnaHQiLGQsZz1Scyh7dXJsOiJfX3VuaWFwcGNob29zZWxvY2F0aW9uIixkYXRhOlEuZXh0ZW5kKHt9LGUse2xvY2FsZTpudSgpfSksc3R5bGU6e2FuaW1hdGlvblR5cGU6ZS5hbmltYXRpb25UeXBlfHwic2xpZGUtaW4tYm90dG9tIix0aXRsZU5WaWV3OiExLHBvcEdlc3R1cmU6ImNsb3NlIixzY3JvbGxJbmRpY2F0b3I6Im5vbmUifSxvbk1lc3NhZ2Uoe2V2ZW50OnksZGV0YWlsOnp9KXt5PT09InNlbGVjdGVkIiYmKGQ9eil9LG9uQ2xvc2UoKXtzJiZjLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgiZGFyayIpLGQ/dChkKTpuKCJjYW5jZWwiKX19KTtzJiYoYy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImxpZ2h0IiksZy53ZWJ2aWV3LmFkZEV2ZW50TGlzdGVuZXIoInBvcEdlc3R1cmUiLCh7dHlwZTp5LHJlc3VsdDp6fSk9Pnt5PT09InN0YXJ0Ij9jLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgiZGFyayIpOnk9PT0iZW5kIiYmIXomJmMubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJsaWdodCIpfSkpfSx6MCksVEE9UmUocTAsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT4oUnMoe3VybDoiX191bmlhcHBvcGVubG9jYXRpb24iLGRhdGE6US5leHRlbmQoe30sZSx7bG9jYWxlOm51KCl9KSxzdHlsZTp7dGl0bGVOVmlldzp7dHlwZToidHJhbnNwYXJlbnQifSxwb3BHZXN0dXJlOiJjbG9zZSIsYmFja0J1dHRvbkF1dG9Db250cm9sOiJjbG9zZSJ9LG9uQ2xvc2UoKXtuKCJjYW5jZWwiKX19KSx0KCkpLEowLEswKSxJQT1SZShSRSwoe3RpdGxlOmU9IiIsY29udGVudDp0PSIiLHNob3dDYW5jZWw6bj0hMCxjYW5jZWxUZXh0OnIsY2FuY2VsQ29sb3I6cyxjb25maXJtVGV4dDpkLGNvbmZpcm1Db2xvcjpnLGVkaXRhYmxlOnk9ITEscGxhY2Vob2xkZXJUZXh0Ono9IiJ9PXt9LHtyZXNvbHZlOlB9KT0+e2xldCAkPW4/W3IsZF06W2RdLF9lPXk/ejokO3Q9dHx8IiAiLGMubmF0aXZlVUlbeT8icHJvbXB0IjoiY29uZmlybSJdKHQsVGU9PntpZihuKXtsZXQgTGU9VGUuaW5kZXg9PT0xLEV0PXtjb25maXJtOkxlLGNhbmNlbDpUZS5pbmRleD09PTB8fFRlLmluZGV4PT09LTF9O0xlJiZ5JiYoRXQuY29udGVudD1UZS52YWx1ZSksUChFdCl9ZWxzZXtsZXQgTGU9e2NvbmZpcm06VGUuaW5kZXg9PT0wLGNhbmNlbDohMX07eSYmKExlLmNvbnRlbnQ9VGUudmFsdWUpLFAoTGUpfX0sZSxfZSwkKX0seEUsQkUpLFBBPVJlKE9FLCh7aXRlbUxpc3Q6ZT1bXSxpdGVtQ29sb3I6dD0iIzAwMDAwMCIsdGl0bGU6bj0iIixwb3BvdmVyOnJ9LHtyZXNvbHZlOnMscmVqZWN0OmR9KT0+e0NuKCk7bGV0e3Q6Z309WigpLHk9e3RpdGxlOm4sY2FuY2VsOmcoInVuaS5zaG93QWN0aW9uU2hlZXQuY2FuY2VsIiksYnV0dG9uczplLm1hcCh6PT4oe3RpdGxlOnosY29sb3I6dH0pKX07Yy5uYXRpdmVVSS5hY3Rpb25TaGVldChRLmV4dGVuZCh5LHtwb3BvdmVyOnJ9KSx6PT57ei5pbmRleD4wP3Moe3RhcEluZGV4OnouaW5kZXgtMX0pOmQoInNob3dBY3Rpb25TaGVldDpmYWlsIGNhbmNlbCIpfSl9LFRFLElFKSxmdSxZZj0hMSxMdT0iIixWdSxOQT1SZShQRSwoZSx0KT0+eHAoUS5leHRlbmQoe30sZSx7dHlwZToibG9hZGluZyIsaWNvbjoibG9hZGluZyJ9KSx0KSxORSxrRSkseHA9KHt0aXRsZTplPSIiLGljb246dD0ic3VjY2VzcyIsaW1hZ2U6bj0iIixkdXJhdGlvbjpyPTE1MDAsbWFzazpzPSExLHBvc2l0aW9uOmQsdHlwZTpnPSJ0b2FzdCIsc3R5bGU6eX0se3Jlc29sdmU6eixyZWplY3Q6UH0pPT57aWYoJHUoIiIpLEx1PWcsWyJ0b3AiLCJjZW50ZXIiLCJib3R0b20iXS5pbmNsdWRlcyhTdHJpbmcoZCkpKWMubmF0aXZlVUkudG9hc3QoZSx7dmVydGljYWxBbGlnbjpkfSksWWY9ITA7ZWxzZXt0JiYhflsic3VjY2VzcyIsImxvYWRpbmciLCJlcnJvciIsIm5vbmUiXS5pbmRleE9mKHQpJiYodD0ic3VjY2VzcyIpO2xldCAkPXttb2RhbDpzLGJhY2s6InRyYW5zbWl0IixwYWRkaW5nOiIxMHB4IixzaXplOiIxNnB4In07IW4mJighdHx8dD09PSJub25lIik/JC5sb2FkaW5nPXtkaXNwbGF5OiJub25lIn06KCQud2lkdGg9IjE0MHB4IiwkLmhlaWdodD0iMTEycHgiKSxuPyQubG9hZGluZz17ZGlzcGxheToiYmxvY2siLGhlaWdodDoiNTVweCIsaWNvbjpuLGludGVydmFsOnJ9Olsic3VjY2VzcyIsImVycm9yIl0uaW5kZXhPZih0KSE9PS0xJiYoJC5sb2FkaW5nPXtkaXNwbGF5OiJibG9jayIsaGVpZ2h0OiI1NXB4IixpY29uOnQ9PT0ic3VjY2VzcyI/Il9fdW5pYXBwc3VjY2Vzcy5wbmciOiJfX3VuaWFwcGVycm9yLnBuZyIsaW50ZXJ2YWw6cn0pO3RyeXtmdT1jLm5hdGl2ZVVJLnNob3dXYWl0aW5nKGUsUS5leHRlbmQoJCx5KSl9Y2F0Y2goX2Upe1AoYCR7X2V9YCl9fXJldHVybiBMdT09PSJ0b2FzdCImJihWdT1CKCgpPT57JHUoIiIpfSxyKSkseigpfSxrQT1SZShNRSx4cCxGRSxMRSksUkE9UmUocEUsKGUsdCk9PiR1KCJ0b2FzdCIsdCkpLHhBPVJlKGhFLChlLHQpPT4kdSgibG9hZGluZyIsdCkpO2Z1bmN0aW9uICR1KGU9InRvYXN0Iix0KXtyZXR1cm4gZSYmZSE9PUx1fHwoVnUmJihDKFZ1KSxWdT1udWxsKSxZZj9jLm5hdGl2ZVVJLmNsb3NlVG9hc3QoKTpmdSYmZnUuY2xvc2UmJmZ1LmNsb3NlKCksZnU9bnVsbCxZZj0hMSxMdT0iIiksdCYmdC5yZXNvbHZlKCl9bGV0IEJBPVJlKFZFLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPXRwKCk7aWYociYmci5lbmRQdWxsVG9SZWZyZXNoKCkscj1SdSgpLCFyKXJldHVybiBuKCk7ci5iZWdpblB1bGxUb1JlZnJlc2goKSxGZihyKSx0KCl9KSxNQT1SZSgkRSwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj10cCgpfHxSdSgpO2lmKCFyKXJldHVybiBuKCk7ci5lbmRQdWxsVG9SZWZyZXNoKCksRmYobnVsbCksdCgpfSksREE9UmUoR2gsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9bnIoeHIoKSk7YnQuaW52b2tlVmlld01ldGhvZChHaCxlLHIscz0+e3M/bihzKTp0KCl9KX0sZ0UpLEZBPVJlKFloLChlLHtyZXNvbHZlOnR9KT0+e2xldCBuPW5yKHhyKCkpO2J0Lmludm9rZVZpZXdNZXRob2QoWWgsZSxuLHQpfSxDRSxBRSksTEE9UmUoeUUsKHtfX3BhZ2VfXzplLHRpdGxlOnR9LHtyZXNvbHZlOm4scmVqZWN0OnJ9KT0+e2xldCBzPVFoKGUpO2lmKHMpe2xldCBkPXMuZ2V0U3R5bGUoKTtkJiZkLnRpdGxlTlZpZXcmJnMuc2V0U3R5bGUoe3RpdGxlTlZpZXc6e3RpdGxlVGV4dDp0fX0pLG4oKX1lbHNlIHIoKX0sRUUpLFZBPVJlKHdFLChlLHtyZXNvbHZlOnR9KT0+e2MubmF0aXZlVUkuc2hvd1dhaXRpbmcoIiIse21vZGFsOiExfSksdCgpfSksJEE9UmUoU0UsKGUse3Jlc29sdmU6dH0pPT57Yy5uYXRpdmVVSS5jbG9zZVdhaXRpbmcoKSx0KCl9KTtmdW5jdGlvbiBVQShlKXtsZXQgdD1HbigpOyF0Lmxlbmd0aHx8KHRbdC5sZW5ndGgtMV0uJHBhZ2Uuc3RhdHVzQmFyU3R5bGU9ZSl9bGV0IEhBPVJlKG1FLCh7X19wYWdlX186ZSxmcm9udENvbG9yOnQsYmFja2dyb3VuZENvbG9yOm59LHtyZXNvbHZlOnIscmVqZWN0OnN9KT0+e2xldCBkPVFoKGUpO2lmKGQpe2xldCBnPXt9O3QmJihnLnRpdGxlQ29sb3I9dCksbiYmKGcuYmFja2dyb3VuZENvbG9yPW4pO2xldCB5PXQ9PT0iIzAwMDAwMCI/ImRhcmsiOiJsaWdodCI7Yy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoeSksVUEoeSk7bGV0IHo9ZC5nZXRTdHlsZSgpO3omJnoudGl0bGVOVmlldyYmKHoudGl0bGVOVmlldy5hdXRvQmFja0J1dHRvbiYmKGcuYmFja0J1dHRvbj1nLmJhY2tCdXR0b258fHt9LGcuYmFja0J1dHRvbi5jb2xvcj10KSxkLnNldFN0eWxlKHt0aXRsZU5WaWV3Omd9KSkscigpfWVsc2UgcygpfSxiRSxfRSksakE9UmUoYXcsKHtpbmRleDplLHRleHQ6dH0se3Jlc29sdmU6bixyZWplY3Q6cn0pPT57VGkuc2V0VGFiQmFyQmFkZ2UoInRleHQiLGUsdCksbigpfSxzdyxsdyksekE9UmUoVUUsKHtpbmRleDplLHRleHQ6dCxpY29uUGF0aDpuLHNlbGVjdGVkSWNvblBhdGg6cixwYWdlUGF0aDpzLHZpc2libGU6ZCxpY29uZm9udDpnfSx7cmVzb2x2ZTp5fSk9PntpZihUaS5zZXRUYWJCYXJJdGVtKGUsdCxuLHIsZCxnKSxzKXtsZXQgej1JLnRhYkJhci5saXN0W2VdO2lmKHope2xldCBQPXoucGFnZVBhdGgsJD1hZS5yZW1vdmVMZWFkaW5nU2xhc2gocyk7JCE9PVAmJlBzKGUsUCwkKX19eSgpfSxIRSxqRSksV0E9UmUoekUsKGU9e30se3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57aWYoIXN1KCkpcmV0dXJuIG4oIm5vdCBUYWJCYXIgcGFnZSIpO2xldCByPXtibGFjazoicmdiYSgwLDAsMCwwLjQpIix3aGl0ZToicmdiYSgyNTUsMjU1LDI1NSwwLjQpIn0scz1lLmJvcmRlclN0eWxlO3MmJnMgaW4gciYmKGUuYm9yZGVyU3R5bGU9cltzXSksVGkuc2V0VGFiQmFyU3R5bGUoZSksdCgpfSxXRSxZRSksR0E9UmUocUUsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9ZSYmZS5hbmltYXRpb247aWYoIXN1KCkpcmV0dXJuIG4oIm5vdCBUYWJCYXIgcGFnZSIpO1RpLmhpZGVUYWJCYXIoQm9vbGVhbihyKSksdCgpfSxxaCksWUE9UmUoS0UsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9ZSYmZS5hbmltYXRpb247aWYoIXN1KCkpcmV0dXJuIG4oIm5vdCBUYWJCYXIgcGFnZSIpO1RpLnNob3dUYWJCYXIoQm9vbGVhbihyKSksdCgpfSxKRSkscUE9UmUoZXcsKHtpbmRleDplfSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntUaS5zZXRUYWJCYXJCYWRnZSgicmVkRG90IixlKSx0KCl9LHR3LG53KSxCcD1lPT5UaS5zZXRUYWJCYXJCYWRnZSgibm9uZSIsZSksS0E9UmUocncsKHtpbmRleDplfSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntCcChlKSx0KCl9LGl3LG93KSxKQT1SZShaRSwoe2luZGV4OmV9LHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e0JwKGUpLHQoKX0sWEUsUUUpLE1wPSJ2ZFN5bmMiLFpBPSJfX3VuaWFwcF9fc2VydmljZSIsa2M9Im9uV2Vidmlld1JlYWR5IixYQT0wLFFBPSJ3ZWJ2aWV3SW5zZXJ0ZWQiLGVPPSJ3ZWJ2aWV3UmVtb3ZlZCIsRHA9IlVuaUFwcFN1Yk5WdWUiO2NsYXNzIHRPe2NvbnN0cnVjdG9yKHQsbil7dGhpcy5jYWxsYmFja3M9W107bGV0IHI9dGhpcy53ZWJ2aWV3PWMud2Vidmlldy5nZXRXZWJ2aWV3QnlJZCh0KTtpZih0aGlzLmlzU3ViPW58fCExLHIuX191bmlhcHBfbWFza19pZCl7bGV0IHM9dGhpcy5tYXNrV2Vidmlldz1yLl9fdW5pYXBwX21hc2tfaWQ9PT0iMCI/e3NldFN0eWxlKHttYXNrOmd9KXt2YSgidW5pLXRhYnZpZXciKS5zZXRNYXNrKHtjb2xvcjpnfSl9fTpjLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQoci5fX3VuaWFwcF9tYXNrX2lkKSxkPWZ1bmN0aW9uKCl7cy5zZXRTdHlsZSh7bWFzazoibm9uZSJ9KX07ci5hZGRFdmVudExpc3RlbmVyKCJoaWRlIixkKSxyLmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIixkKX19c2hvdyguLi50KXtpZih0aGlzLm1hc2tXZWJ2aWV3KXtsZXQgbj10aGlzLndlYnZpZXcuX191bmlhcHBfbWFzazt0aGlzLm1hc2tXZWJ2aWV3LnNldFN0eWxlKHttYXNrOm59KX10aGlzLndlYnZpZXcuc2hvdyguLi50KX1oaWRlKC4uLnQpe3RoaXMud2Vidmlldy5oaWRlKC4uLnQpfXNldFN0eWxlKHQpe3RoaXMud2Vidmlldy5zZXRTdHlsZSh0KX1pbml0TWVzc2FnZSgpe2lmKHRoaXMubWVzc2FnZVJlYWR5KXJldHVybjt0aGlzLm1lc3NhZ2VSZWFkeT0hMDtsZXQgdD1yPT57aWYoci5kYXRhJiZyLmRhdGEudHlwZT09PURwKXtsZXQgcz1yLmRhdGEudGFyZ2V0O3MuaWQ9PT10aGlzLndlYnZpZXcuaWQmJnMuaXNTdWI9PT10aGlzLmlzU3ViJiZ0aGlzLmNhbGxiYWNrcy5mb3JFYWNoKGQ9PntkKHtvcmlnaW46dGhpcy53ZWJ2aWV3Ll9fdW5pYXBwX2hvc3QsZGF0YTpyLmRhdGEuZGF0YX0pfSl9fTt2YSgiZ2xvYmFsRXZlbnQiKS5hZGRFdmVudExpc3RlbmVyKCJwbHVzTWVzc2FnZSIsdCksdGhpcy53ZWJ2aWV3LmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIiwoKT0+e3RoaXMuY2FsbGJhY2tzLmxlbmd0aD0wfSl9cG9zdE1lc3NhZ2UodCl7Yy53ZWJ2aWV3LnBvc3RNZXNzYWdlVG9VbmlOVmlldyh7dHlwZTpEcCxkYXRhOnQsdGFyZ2V0OntpZDp0aGlzLndlYnZpZXcuaWQsaXNTdWI6IXRoaXMuaXNTdWJ9fSxaQSl9b25NZXNzYWdlKHQpe3RoaXMuaW5pdE1lc3NhZ2UoKSx0aGlzLmNhbGxiYWNrcy5wdXNoKHQpfX1sZXQgbk89ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbmV3IHRPKGUsdCl9LGR1LEZwPWMubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlO2Z1bmN0aW9uIHJPKGUpe0ZwPWV9ZnVuY3Rpb24gTHAoZSl7ZHU9ZSxGcChlKX1jLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZT1McDtmdW5jdGlvbiBZcyhlKXtpZighZSl7bGV0IHQ9UnIoKTtpZighdHx8KGU9dC4kcGFnZS5zdGF0dXNCYXJTdHlsZSwhZXx8ZT09PWR1KSlyZXR1cm59ZSE9PWR1JiYoZHU9ZSxjLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZShlKSl9ZnVuY3Rpb24gaU8oZSx0LG4scixzLGQsZyl7YyE9PW4mJihUPWhuPWUsdj10LGM9bixyTyhjLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSksYy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGU9THAsQj1yLEM9cyxrPWQsdT1nKSxJLnNlcnZpY2VSZWFkeT0hMH1mdW5jdGlvbiBvTygpe2xldCBlPVsiQXJyYXlCdWZmZXIiLCJJbnQ4QXJyYXkiLCJVaW50OEFycmF5IiwiVWludDhDbGFtcGVkQXJyYXkiLCJJbnQxNkFycmF5IiwiVWludDE2QXJyYXkiLCJJbnQzMkFycmF5IiwiVWludDMyQXJyYXkiLCJGbG9hdDMyQXJyYXkiLCJGbG9hdDY0QXJyYXkiLCJCaWdJbnQ2NEFycmF5IiwiQmlnVWludDY0QXJyYXkiXSx0PXt9O2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtsZXQgcj1lW25dO3Rbcl09Z2xvYmFsW3JdfXJldHVybiB0fWxldCBWcD17b2F1dGgoZSl7Yy5vYXV0aC5nZXRTZXJ2aWNlcyh0PT57dD10O2xldCBuPVtdO3QuZm9yRWFjaCgoe2lkOnJ9KT0+e24ucHVzaChyKX0pLGUobnVsbCxuLHQpfSx0PT57dD10LGUodCl9KX0sc2hhcmUoZSl7Yy5zaGFyZS5nZXRTZXJ2aWNlcyh0PT57dD10O2xldCBuPVtdO3QuZm9yRWFjaCgoe2lkOnJ9KT0+e24ucHVzaChyKX0pLGUobnVsbCxuLHQpfSx0PT57ZSh0KX0pfSxwYXltZW50KGUpe2MucGF5bWVudC5nZXRDaGFubmVscyh0PT57bGV0IG49W107dC5mb3JFYWNoKCh7aWQ6cn0pPT57bi5wdXNoKHIpfSksZShudWxsLG4sdCl9LHQ9PntlKHQpfSl9LHB1c2goZSl7aWYodHlwZW9mIHYhPSJ1bmRlZmluZWQifHx0eXBlb2YgYyE9InVuZGVmaW5lZCIpe2xldCB0PWMucHVzaC5nZXRDbGllbnRJbmZvKCk7ZShudWxsLFt0LmlkXSxbdF0pfWVsc2UgZShudWxsLFtdKX19LGFPPVJlKGN3LCh7c2VydmljZTplfSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntWcFtlXT9WcFtlXSgocixzPVtdLGQ9W10pPT57cj9uKHIubWVzc2FnZSk6dCh7c2VydmljZTplLHByb3ZpZGVyOnMscHJvdmlkZXJzOmQubWFwKGc9Pih0eXBlb2YgZy5zZXJ2aWNlUmVhZHk9PSJib29sZWFuIiYmKGcuaXNBcHBFeGlzdD1nLnNlcnZpY2VSZWFkeSksdHlwZW9mIGcubmF0aXZlQ2xpZW50PT0iYm9vbGVhbiImJihnLmlzQXBwRXhpc3Q9Zy5uYXRpdmVDbGllbnQpLGcpKX0pfSk6bigic2VydmljZSBub3QgZm91bmQiKX0sdXcpLFV1O2Z1bmN0aW9uIGh1KGUpe3JldHVybiBuZXcgUHJvbWlzZSgodCxuKT0+e2Mub2F1dGguZ2V0U2VydmljZXMocj0+e2xldCBzPXIuZmluZCgoe2lkOmR9KT0+ZD09PWUpO3M/dChzKTpuKG5ldyBFcnJvcigicHJvdmlkZXIgbm90IGZpbmQiKSl9LG4pfSl9bGV0ICRwPVJlKGZ3LChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPWUucHJvdmlkZXJ8fCJ3ZWl4aW4iLHM9X3IobiksZD1yPT09ImFwcGxlIixnPWQ/e3Njb3BlOiJlbWFpbCJ9OmUudW5pdmVyaWZ5U3R5bGU/e3VuaXZlcmlmeVN0eWxlOmNPKGUudW5pdmVyaWZ5U3R5bGUscyl9Ont9O2h1KHIpLnRoZW4oeT0+e2Z1bmN0aW9uIHooKXtpZihlLm9ubHlBdXRob3JpemUmJnI9PT0id2VpeGluIil7eS5hdXRob3JpemUoKHtjb2RlOlB9KT0+e3Qoe2NvZGU6UCxhdXRoUmVzdWx0OiIifSl9LHMpO3JldHVybn15LmxvZ2luKFA9PntsZXQgJD1QLnRhcmdldC5hdXRoUmVzdWx0LF9lPVAudGFyZ2V0LmFwcGxlSW5mbzt0KHtjb2RlOiQuY29kZSxhdXRoUmVzdWx0OiQsYXBwbGVJbmZvOl9lfSl9LHMsZyl9ZHx8cj09PSJ1bml2ZXJpZnkiP3ooKTp5LmxvZ291dCh6LHopfSkuY2F0Y2gocyl9LGR3KSxVcD0oZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1lLnByb3ZpZGVyfHwid2VpeGluIixzPV9yKG4pO2h1KHIpLnRoZW4oZD0+e2QuZ2V0VXNlckluZm8oZz0+e2xldCB5PXtuaWNrTmFtZToiIn07aWYocj09PSJ3ZWl4aW4iKXtsZXQgUD1kLnVzZXJJbmZvO1AmJih5PXtvcGVuSWQ6UC5vcGVuaWQsbmlja05hbWU6UC5uaWNrbmFtZSxnZW5kZXI6UC5zZXgsY2l0eTpQLmNpdHkscHJvdmluY2U6UC5wcm92aW5jZSxjb3VudHJ5OlAuY291bnRyeSxhdmF0YXJVcmw6UC5oZWFkaW1ndXJsLHVuaW9uSWQ6UC51bmlvbmlkfSl9ZWxzZSBpZihyPT09ImFwcGxlIil7bGV0IFA9ZC5hcHBsZUluZm87UCYmKHk9e29wZW5JZDpQLnVzZXIsZnVsbE5hbWU6UC5mdWxsTmFtZSxlbWFpbDpQLmVtYWlsLGF1dGhvcml6YXRpb25Db2RlOlAuYXV0aG9yaXphdGlvbkNvZGUsaWRlbnRpdHlUb2tlbjpQLmlkZW50aXR5VG9rZW4scmVhbFVzZXJTdGF0dXM6UC5yZWFsVXNlclN0YXR1c30pfWVsc2UgeT1kLnVzZXJJbmZvLHkmJih5Lm9wZW5JZD15Lm9wZW5JZHx8eS5vcGVuaWR8fGQuYXV0aFJlc3VsdC5vcGVuaWQseS5uaWNrTmFtZT15Lm5pY2tOYW1lfHx5Lm5pY2tuYW1lLHkuYXZhdGFyVXJsPXkuYXZhdGFyVXJsfHx5LmhlYWRpbWd1cmwpO2xldCB6PXt9O2UuZGF0YSYmZS5kYXRhLmFwaV9uYW1lPT09IndlYmFwaV9nZXR1c2VyaW5mbyI/ei5kYXRhPXtkYXRhOkpTT04uc3RyaW5naWZ5KHkpLHJhd0RhdGE6IiIsc2lnbmF0dXJlOiIiLGVuY3J5cHRlZERhdGE6IiIsaXY6IiJ9OnoudXNlckluZm89eSx0KHopfSxzKX0pLmNhdGNoKCgpPT57bigiXHU4QkY3XHU1MTQ4XHU4QzAzXHU3NTI4IHVuaS5sb2dpbiIpfSl9LHNPPVJlKGh3LFVwLHB3KSxsTz1SZShndyxVcCx2dyksSHA9UmUobXcsKHtwcm92aWRlcjplfSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1qbCh0KSxzPV9yKG4pO2h1KGUpLnRoZW4oZD0+ZC5wcmVMb2dpbihyLHMpKS5jYXRjaChzKX0seXcsYncpLGpwPSgpPT5odSgidW5pdmVyaWZ5IikudGhlbihlPT5lLmNsb3NlQXV0aFZpZXcoKSksenA9RHQoRXcsanApLFdwPVJlKHd3LChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPWpsKHQpLHM9X3Iobik7dHJ5e2h1KCJ1bml2ZXJpZnkiKS50aGVuKGQ9PntsZXQgZz1kLmdldENoZWNrQm94U3RhdGUoKTtyKHtzdGF0ZTpnfSl9KX1jYXRjaChkKXtzKGQpfX0pO2Z1bmN0aW9uIGNPKGUsdCl7cmV0dXJuIFEuaXNQbGFpbk9iamVjdChlKSYmUS5pc1BsYWluT2JqZWN0KGUuYnV0dG9ucykmJlEudG9UeXBlU3RyaW5nKGUuYnV0dG9ucy5saXN0KT09PSJbb2JqZWN0IEFycmF5XSImJmUuYnV0dG9ucy5saXN0LmZvckVhY2goKG4scik9PntlLmJ1dHRvbnMubGlzdFtyXS5vbmNsaWNrPWZ1bmN0aW9uKCl7bGV0IHM9e2NvZGU6IjMwMDA4IixtZXNzYWdlOiJcdTc1MjhcdTYyMzdcdTcwQjlcdTUxRkJcdTRFODZcdTgxRUFcdTVCOUFcdTRFNDlcdTYzMDlcdTk0QUUiLGluZGV4OnIscHJvdmlkZXI6bi5wcm92aWRlcn07US5pc1BsYWluT2JqZWN0KFV1KT9VdS5fdHJpZ2dlclVuaXZlcmlmeUJ1dHRvbnNDbGljayhzKTpqcCgpLnRoZW4oKCk9Pnt0KHMpfSl9fSksZX1jbGFzcyB1T3tjb25zdHJ1Y3Rvcigpe3RoaXMucHJvdmlkZXI9InVuaXZlcmlmeSIsdGhpcy5ldmVudE5hbWU9ImFwaS51bml2ZXJpZnlCdXR0b25zQ2xpY2sifWNsb3NlKCl7cmV0dXJuIHpwKCl9bG9naW4odCl7cmV0dXJuICRwKHRoaXMuX2dldE9wdGlvbnModCkpfWdldENoZWNrQm94U3RhdGUodCl7cmV0dXJuIFdwKHQpfXByZUxvZ2luKHQpe3JldHVybiBIcCh0aGlzLl9nZXRPcHRpb25zKHQpKX1vbkJ1dHRvbnNDbGljayh0KXtidC5vbih0aGlzLmV2ZW50TmFtZSx0KX1vZmZCdXR0b25zQ2xpY2sodCl7YnQub2ZmKHRoaXMuZXZlbnROYW1lLHQpfV90cmlnZ2VyVW5pdmVyaWZ5QnV0dG9uc0NsaWNrKHQpe2J0LmVtaXQodGhpcy5ldmVudE5hbWUsdCl9X2dldE9wdGlvbnModD17fSl7cmV0dXJuIFEuZXh0ZW5kKHt9LHQse3Byb3ZpZGVyOnRoaXMucHJvdmlkZXJ9KX19bGV0IGZPPUR0KFN3LCgpPT5VdXx8KFV1PW5ldyB1TykpLGRPPVJlKFJ3LChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPWJwKCk7aWYoci5ub3RpZmljYXRpb25BdXRob3JpemVkIT09ImF1dGhvcml6ZWQiKXJldHVybiBuKCJub3RpZmljYXRpb25BdXRob3JpemVkOiAiK3Iubm90aWZpY2F0aW9uQXV0aG9yaXplZCk7bGV0IHM9US5leHRlbmQoe30sZSk7ZGVsZXRlIHMuY29udGVudCxkZWxldGUgcy5wYXlsb2FkLGMucHVzaC5jcmVhdGVNZXNzYWdlKGUuY29udGVudCxlLnBheWxvYWQscyksdCgpfSx2b2lkIDAseHcpLGhPPUR0KCJyZWdpc3RlclJ1bnRpbWUiLGU9PntRLmV4dGVuZChqc1J1bnRpbWUsZSl9KSxwTz17MDp7bmFtZToid2ViIix0aXRsZToiXHU1NkZFXHU2NTg3In0sMTp7bmFtZToidGV4dCIsdGl0bGU6Ilx1N0VBRlx1NjU4N1x1NUI1NyJ9LDI6e25hbWU6ImltYWdlIix0aXRsZToiXHU3RUFGXHU1NkZFXHU3MjQ3In0sMzp7bmFtZToibXVzaWMiLHRpdGxlOiJcdTk3RjNcdTRFNTAifSw0OntuYW1lOiJ2aWRlbyIsdGl0bGU6Ilx1ODlDNlx1OTg5MSJ9LDU6e25hbWU6Im1pbmlQcm9ncmFtIix0aXRsZToiXHU1QzBGXHU3QTBCXHU1RThGIn19LGdPPWU9PntlLnR5cGU9ZS50eXBlfHwwO2xldHtwcm92aWRlcjp0LHR5cGU6bix0aXRsZTpyLHN1bW1hcnk6cyxocmVmOmQsaW1hZ2VVcmw6ZyxtZWRpYVVybDp5LHNjZW5lOnosbWluaVByb2dyYW06UCxvcGVuQ3VzdG9tZXJTZXJ2aWNlQ2hhdDokLGNvcnBpZDpfZSxjdXN0b21lclVybDpUZX09ZTtRLmlzU3RyaW5nKGcpJiZnJiYoZz1TdChnKSk7bGV0IExlPXBPW25dO2lmKExlKXtsZXQgRXQ9e3Byb3ZpZGVyOnQsdHlwZTpMZS5uYW1lLHRpdGxlOnIsY29udGVudDpzLGhyZWY6ZCxwaWN0dXJlczpbZ10sdGh1bWJzOmc/W2ddOnZvaWQgMCxtZWRpYTp5LG1pbmlQcm9ncmFtOlAsZXh0cmE6e3NjZW5lOnp9LG9wZW5DdXN0b21lclNlcnZpY2VDaGF0OiQsY29ycGlkOl9lLHVybDpUZX07cmV0dXJuIHQ9PT0id2VpeGluIiYmKG49PT0xfHxuPT09MikmJmRlbGV0ZSBFdC50aHVtYnMsRXR9cmV0dXJuIlx1NTIwNlx1NEVBQlx1NTNDMlx1NjU3MCB0eXBlIFx1NEUwRFx1NkI2M1x1Nzg2RSJ9LEdwPWZ1bmN0aW9uKGUsdCxuLHIscz0ic2hhcmUiKXtsZXQgZD1fcihyKSxnPXQub3BlbkN1c3RvbWVyU2VydmljZUNoYXQ/Im9wZW5DdXN0b21lclNlcnZpY2VDaGF0Ijoic2VuZCI7dHJ5e2VbZ10odCwoKT0+e24oKX0sZCl9Y2F0Y2goeSl7ZCh7bWVzc2FnZTpgJHt0LnByb3ZpZGVyfSAke2d9IFx1NjVCOVx1NkNENVx1OEMwM1x1NzUyOFx1NTkzMVx1OEQyNWB9KX19LHZPPVJlKEN3LChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPWdPKGUpLHM9X3Iobik7aWYoUS5pc1N0cmluZyhyKSlyZXR1cm4gbihyKTtjLnNoYXJlLmdldFNlcnZpY2VzKGQ9PntsZXQgZz1kLmZpbmQoKHtpZDp5fSk9Pnk9PT1yLnByb3ZpZGVyKTtnP2cuYXV0aGVudGljYXRlZD9HcChnLHIsdCxuKTpnLmF1dGhvcml6ZSgoKT0+R3AoZyxyLHQsbikscyk6bigic2VydmljZSBub3QgZm91bmQiKX0scyl9LE93LEF3KSxtTz1SZShUdywoe3R5cGU6ZSxpbWFnZVVybDp0LHN1bW1hcnk6bixocmVmOnJ9LHtyZXNvbHZlOnMscmVqZWN0OmR9KT0+e2xldCBnPV9yKGQpO1EuaXNTdHJpbmcodCkmJnQmJih0PVN0KHQpKSxjLnNoYXJlLnNlbmRXaXRoU3lzdGVtKHt0eXBlOmUscGljdHVyZXM6dD9bdF06dm9pZCAwLGNvbnRlbnQ6bixocmVmOnJ9LCgpPT5zKCksZyl9LFB3LEl3KSxfTz1SZShOdywoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1lLnByb3ZpZGVyLHM9X3Iobik7Yy5wYXltZW50LmdldENoYW5uZWxzKGQ9PntsZXQgZz1kLmZpbmQoKHtpZDp5fSk9Pnk9PT1yKTtnP2MucGF5bWVudC5yZXF1ZXN0KGcsZS5vcmRlckluZm8seT0+e3QoeSl9LHMpOm4oInNlcnZpY2Ugbm90IGZvdW5kIil9LHMpfSxrdyksWXA9ZnAsYk89UmUoIm5hdmlnYXRlVG9NaW5pUHJvZ3JhbSIsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57WXAoIm5hdmlnYXRlVG9VbmlNUCIsZSxyPT57aWYoci5lcnJNc2cmJnIuZXJyTXNnLmluZGV4T2YoIjpvayIpPT09LTEpcmV0dXJuIG4oci5lcnJNc2cuc3BsaXQoIiAiKVsxXSk7dCgpfSl9KSxxcD1bXTtmdW5jdGlvbiBLcChlKXtxcC5wdXNoKGUpfWxldCB5Tz1LcDtmdW5jdGlvbiBFTyhlLHQpe3FwLmZvckVhY2gobj0+bihlLHQpKX1mdW5jdGlvbiB3TyhlLHQsLi4ubil7bGV0IHI9QU8oZSx0LG4pO3ImJmNvbnNvbGVbZV0ocil9ZnVuY3Rpb24gU08oKXtyZXR1cm4gdHlwZW9mIF9fY2hhbm5lbElkX189PSJzdHJpbmciJiZfX2NoYW5uZWxJZF9ffWZ1bmN0aW9uIENPKGUsdCl7c3dpdGNoKFEudG9SYXdUeXBlKHQpKXtjYXNlIkZ1bmN0aW9uIjpyZXR1cm4iZnVuY3Rpb24oKSB7IFtuYXRpdmUgY29kZV0gfSI7ZGVmYXVsdDpyZXR1cm4gdH19ZnVuY3Rpb24gQU8oZSx0LG4pe3JldHVybiBTTygpPyhuLnB1c2godC5yZXBsYWNlKCJhdCAiLCJ1bmktYXBwOi8vLyIpKSxjb25zb2xlW2VdLmFwcGx5KGNvbnNvbGUsbikpOm4ubWFwKGZ1bmN0aW9uKHMpe2xldCBkPVEudG9UeXBlU3RyaW5nKHMpLnRvTG93ZXJDYXNlKCk7aWYoWyJbb2JqZWN0IG9iamVjdF0iLCJbb2JqZWN0IGFycmF5XSIsIltvYmplY3QgbW9kdWxlXSJdLmluZGV4T2YoZCkhPT0tMSl0cnl7cz0iLS0tQkVHSU46SlNPTi0tLSIrSlNPTi5zdHJpbmdpZnkocyxDTykrIi0tLUVORDpKU09OLS0tIn1jYXRjaChnKXtzPWR9ZWxzZSBpZihzPT09bnVsbClzPSItLS1OVUxMLS0tIjtlbHNlIGlmKHM9PT12b2lkIDApcz0iLS0tVU5ERUZJTkVELS0tIjtlbHNle2xldCBnPVEudG9SYXdUeXBlKHMpLnRvVXBwZXJDYXNlKCk7Zz09PSJOVU1CRVIifHxnPT09IkJPT0xFQU4iP3M9Ii0tLUJFR0lOOiIrZysiLS0tIitzKyItLS1FTkQ6IitnKyItLS0iOnM9U3RyaW5nKHMpfXJldHVybiBzfSkuam9pbigiLS0tQ09NTUEtLS0iKSsiICIrdH1sZXQgbmE9e2xvYWQ6ImxvYWQiLGNsb3NlOiJjbG9zZSIsZXJyb3I6ImVycm9yIixhZENsaWNrZWQ6ImFkQ2xpY2tlZCJ9O2NsYXNzIEpwe2NvbnN0cnVjdG9yKCl7dGhpcy5fY2FsbGJhY2tzPXt9fW9uTG9hZCh0KXt0aGlzLl9hZGRFdmVudExpc3RlbmVyKG5hLmxvYWQsdCl9b25DbG9zZSh0KXt0aGlzLl9hZGRFdmVudExpc3RlbmVyKG5hLmNsb3NlLHQpfW9uRXJyb3IodCl7dGhpcy5fYWRkRXZlbnRMaXN0ZW5lcihuYS5lcnJvcix0KX1vZmZMb2FkKHQpe3RoaXMuX3JlbW92ZUV2ZW50TGlzdGVuZXIobmEubG9hZCx0KX1vZmZDbG9zZSh0KXt0aGlzLl9yZW1vdmVFdmVudExpc3RlbmVyKG5hLmNsb3NlLHQpfW9mZkVycm9yKHQpe3RoaXMuX3JlbW92ZUV2ZW50TGlzdGVuZXIobmEuZXJyb3IsdCl9X2FkZEV2ZW50TGlzdGVuZXIodCxuKXshUS5pc0Z1bmN0aW9uKG4pfHwodGhpcy5fY2FsbGJhY2tzW3RdfHwodGhpcy5fY2FsbGJhY2tzW3RdPVtdKSx0aGlzLl9jYWxsYmFja3NbdF0ucHVzaChuKSl9X3JlbW92ZUV2ZW50TGlzdGVuZXIodCxuKXtsZXQgcj10aGlzLl9jYWxsYmFja3NbdF0scz1yLmluZGV4T2Yobik7cz4tMSYmci5zcGxpY2UocywxKX1fZGlzcGF0Y2hFdmVudCh0LG4pe3RoaXMuX2NhbGxiYWNrc1t0XS5mb3JFYWNoKHI9PntyKG58fHt9KX0pfX1jbGFzcyBxZiBleHRlbmRzIEpwe2NvbnN0cnVjdG9yKHQsbil7c3VwZXIoKTt0aGlzLnByZWxvYWQ9ITAsdGhpcy5faXNMb2FkZWQ9ITEsdGhpcy5faXNMb2FkaW5nPSExLHRoaXMuX2xvYWRQcm9taXNlUmVzb2x2ZT1udWxsLHRoaXMuX2xvYWRQcm9taXNlUmVqZWN0PW51bGwsdGhpcy5fc2hvd1Byb21pc2VSZXNvbHZlPW51bGwsdGhpcy5fc2hvd1Byb21pc2VSZWplY3Q9bnVsbCx0aGlzLnByZWxvYWQ9bi5wcmVsb2FkIT09dm9pZCAwP24ucHJlbG9hZDohMTtsZXQgcj10aGlzLl9hZEluc3RhbmNlPXQ7ci5vbkxvYWQoKCk9Pnt0aGlzLl9pc0xvYWRlZD0hMCx0aGlzLl9pc0xvYWRpbmc9ITEsdGhpcy5fbG9hZFByb21pc2VSZXNvbHZlIT1udWxsJiYodGhpcy5fbG9hZFByb21pc2VSZXNvbHZlKCksdGhpcy5fbG9hZFByb21pc2VSZXNvbHZlPW51bGwpLHRoaXMuX3Nob3dQcm9taXNlUmVzb2x2ZSE9bnVsbCYmKHRoaXMuX3Nob3dQcm9taXNlUmVzb2x2ZSgpLHRoaXMuX3Nob3dQcm9taXNlUmVzb2x2ZT1udWxsLHRoaXMuX3Nob3dBZCgpKSx0aGlzLl9kaXNwYXRjaEV2ZW50KG5hLmxvYWQse30pfSksci5vbkNsb3NlKHM9Pnt0aGlzLl9pc0xvYWRlZD0hMSx0aGlzLl9pc0xvYWRpbmc9ITEsdGhpcy5fZGlzcGF0Y2hFdmVudChuYS5jbG9zZSxzKSx0aGlzLnByZWxvYWQ9PT0hMCYmdGhpcy5fbG9hZEFkKCl9KSxyLm9uRXJyb3Iocz0+e3RoaXMuX2lzTG9hZGluZz0hMTtsZXQgZD17Y29kZTpzLmNvZGUsZXJyTXNnOnMubWVzc2FnZX07dGhpcy5fZGlzcGF0Y2hFdmVudChuYS5lcnJvcixkKTtsZXQgZz1uZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkoZCkpO3RoaXMuX2xvYWRQcm9taXNlUmVqZWN0IT1udWxsJiYodGhpcy5fbG9hZFByb21pc2VSZWplY3QoZyksdGhpcy5fbG9hZFByb21pc2VSZWplY3Q9bnVsbCksdGhpcy5fc2hvd1Byb21pc2VSZWplY3QhPW51bGwmJih0aGlzLl9zaG93UHJvbWlzZVJlamVjdChnKSx0aGlzLl9zaG93UHJvbWlzZVJlamVjdD1udWxsKX0pLHIub25BZENsaWNrZWQmJnIub25BZENsaWNrZWQoKCk9Pnt0aGlzLl9kaXNwYXRjaEV2ZW50KG5hLmFkQ2xpY2tlZCx7fSl9KX1nZXRQcm92aWRlcigpe3JldHVybiB0aGlzLl9hZEluc3RhbmNlLmdldFByb3ZpZGVyKCl9bG9hZCgpe3JldHVybiBuZXcgUHJvbWlzZSgodCxuKT0+e3RoaXMuX2xvYWRQcm9taXNlUmVzb2x2ZT10LHRoaXMuX2xvYWRQcm9taXNlUmVqZWN0PW4sIXRoaXMuX2lzTG9hZGluZyYmKHRoaXMuX2lzTG9hZGVkP3QoIiIpOnRoaXMuX2xvYWRBZCgpKX0pfXNob3coKXtyZXR1cm4gbmV3IFByb21pc2UoKHQsbik9Pnt0aGlzLl9zaG93UHJvbWlzZVJlc29sdmU9dCx0aGlzLl9zaG93UHJvbWlzZVJlamVjdD1uLCF0aGlzLl9pc0xvYWRpbmcmJih0aGlzLl9pc0xvYWRlZD8odGhpcy5fc2hvd0FkKCksdCgiIikpOnRoaXMuX2xvYWRBZCgpKX0pfWRlc3Ryb3koKXt0aGlzLl9hZEluc3RhbmNlLmRlc3Ryb3koKX1fbG9hZEFkKCl7dGhpcy5faXNMb2FkZWQ9ITEsdGhpcy5faXNMb2FkaW5nPSEwLHRoaXMuX2FkSW5zdGFuY2UubG9hZCgpfV9zaG93QWQoKXt0aGlzLl9hZEluc3RhbmNlLnNob3coKX19Y2xhc3MgT08gZXh0ZW5kcyBxZntjb25zdHJ1Y3Rvcih0KXtzdXBlcihjLmFkLmNyZWF0ZVJld2FyZGVkVmlkZW9BZCh0KSx0KTt0aGlzLl9sb2FkQWQoKX19bGV0IFRPPUR0KEJ3LGU9Pm5ldyBPTyhlKSxEdyxNdyk7Y2xhc3MgSU8gZXh0ZW5kcyBxZntjb25zdHJ1Y3Rvcih0KXtzdXBlcihjLmFkLmNyZWF0ZUZ1bGxTY3JlZW5WaWRlb0FkKHQpLHQpO3RoaXMucHJlbG9hZD0hMX19bGV0IFBPPUR0KEZ3LGU9Pm5ldyBJTyhlKSxWdyxMdyk7Y2xhc3MgTk8gZXh0ZW5kcyBxZntjb25zdHJ1Y3Rvcih0KXtzdXBlcihjLmFkLmNyZWF0ZUludGVyc3RpdGlhbEFkKHQpLHQpO3RoaXMucHJlbG9hZD0hMSx0aGlzLl9sb2FkQWQoKX19bGV0IGtPPUR0KCR3LGU9Pm5ldyBOTyhlKSxIdyxVdyksbHM9e30sV2w9e307ZnVuY3Rpb24gUk8oZSl7bGV0IHQ9ZS5wcm92aWRlcjtpZihsc1t0XXx8KGxzW3RdPXt9KSx0eXBlb2YgbHNbdF0ucGx1Z2luPT0ib2JqZWN0Iil7ZS5zdWNjZXNzKGxzW3RdLnBsdWdpbik7cmV0dXJufWlmKFdsW3RdfHwoV2xbdF09W10pLFdsW3RdLnB1c2goZSksbHNbdF0uc3RhdHVzPT09ITApe2UuX19wbHVnaW49bHNbdF0ucGx1Z2luO3JldHVybn1sc1t0XS5zdGF0dXM9ITA7bGV0IG49dmEodCk7aWYoIW58fCFuLmluaXRTREspe1dsW3RdLmZvckVhY2gocj0+e3IuZmFpbCh7Y29kZTotMSxtZXNzYWdlOiJwcm92aWRlciBbIit0KyJdIGludmFsaWQifSl9KSxXbFt0XS5sZW5ndGg9MCxsc1t0XS5zdGF0dXM9ITE7cmV0dXJufWxzW3RdLnBsdWdpbj1uLGUuX19wbHVnaW49bixuLmluaXRTREsocj0+e2xldCBzPXIuY29kZT09PTF8fHIuY29kZT09PSIxIjtzP2xzW3RdLnBsdWdpbj1uOmxzW3RdLnN0YXR1cz0hMSxXbFt0XS5mb3JFYWNoKGQ9PntzP2Quc3VjY2VzcyhkLl9fcGx1Z2luKTpkLmZhaWwocil9KSxXbFt0XS5sZW5ndGg9MH0pfWNsYXNzIHhPIGV4dGVuZHMgSnB7Y29uc3RydWN0b3IodCl7c3VwZXIoKTt0aGlzLl9hZHBpZD0iIix0aGlzLl9wcm92aWRlcj0iIix0aGlzLl91c2VyRGF0YT1udWxsLHRoaXMuX2lzTG9hZGVkPSExLHRoaXMuX2lzTG9hZGluZz0hMSx0aGlzLl9sb2FkUHJvbWlzZVJlc29sdmU9bnVsbCx0aGlzLl9sb2FkUHJvbWlzZVJlamVjdD1udWxsLHRoaXMuX3Nob3dQcm9taXNlUmVzb2x2ZT1udWxsLHRoaXMuX3Nob3dQcm9taXNlUmVqZWN0PW51bGwsdGhpcy5fYWRJbnN0YW5jZT1udWxsLHRoaXMuX2FkRXJyb3I9IiIsdGhpcy5fYWRwaWQ9dC5hZHBpZCx0aGlzLl9wcm92aWRlcj10LnByb3ZpZGVyLHRoaXMuX3VzZXJEYXRhPXQudXNlckRhdGEsQigoKT0+e3RoaXMuX2luaXQoKX0pfV9pbml0KCl7dGhpcy5fYWRFcnJvcj0iIixSTyh7cHJvdmlkZXI6dGhpcy5fcHJvdmlkZXIsc3VjY2Vzczp0PT57dGhpcy5fYWRJbnN0YW5jZT10LHRoaXMuX3VzZXJEYXRhJiZ0aGlzLmJpbmRVc2VyRGF0YSh0aGlzLl91c2VyRGF0YSksdGhpcy5fbG9hZEFkKCl9LGZhaWw6dD0+e3RoaXMuX2FkRXJyb3I9dCx0aGlzLl9sb2FkUHJvbWlzZVJlamVjdCE9bnVsbCYmKHRoaXMuX2xvYWRQcm9taXNlUmVqZWN0KHRoaXMuX2NyZWF0ZUVycm9yKHQpKSx0aGlzLl9sb2FkUHJvbWlzZVJlamVjdD1udWxsKSx0aGlzLl9kaXNwYXRjaEV2ZW50KG5hLmVycm9yLHQpfX0pfWdldFByb3ZpZGVyKCl7cmV0dXJuIHRoaXMuX3Byb3ZpZGVyfWxvYWQoKXtyZXR1cm4gbmV3IFByb21pc2UoKHQsbik9PntpZih0aGlzLl9sb2FkUHJvbWlzZVJlc29sdmU9dCx0aGlzLl9sb2FkUHJvbWlzZVJlamVjdD1uLCF0aGlzLl9pc0xvYWRpbmcpe2lmKHRoaXMuX2FkRXJyb3Ipe3RoaXMuX2luaXQoKTtyZXR1cm59dGhpcy5faXNMb2FkZWQ/dCgiIik6dGhpcy5fbG9hZEFkKCl9fSl9c2hvdygpe3JldHVybiBuZXcgUHJvbWlzZSgodCxuKT0+e2lmKHRoaXMuX3Nob3dQcm9taXNlUmVzb2x2ZT10LHRoaXMuX3Nob3dQcm9taXNlUmVqZWN0PW4sIXRoaXMuX2lzTG9hZGluZyl7aWYodGhpcy5fYWRFcnJvcil7dGhpcy5faW5pdCgpO3JldHVybn10aGlzLl9pc0xvYWRlZD8odGhpcy5fc2hvd0FkKCksdCgiIikpOnRoaXMuX2xvYWRBZCgpfX0pfXJlcG9ydEV4cG9zdXJlKCl7dGhpcy5fYWRJbnN0YW5jZSE9PW51bGwmJnRoaXMuX2FkSW5zdGFuY2UucmVwb3J0RXhwb3N1cmUoKX1iaW5kVXNlckRhdGEodCl7dGhpcy5fYWRJbnN0YW5jZSE9PW51bGwmJnRoaXMuX2FkSW5zdGFuY2UuYmluZFVzZXJEYXRhKHQpfWRlc3Ryb3koKXt0aGlzLl9hZEluc3RhbmNlIT09bnVsbCYmdGhpcy5fYWRJbnN0YW5jZS5kZXN0cm95JiZ0aGlzLl9hZEluc3RhbmNlLmRlc3Ryb3koe2FkcGlkOnRoaXMuX2FkcGlkfSl9X2xvYWRBZCgpe2lmKHRoaXMuX2FkSW5zdGFuY2UhPT1udWxsKXtpZih0aGlzLl9pc0xvYWRpbmc9PT0hMClyZXR1cm47dGhpcy5faXNMb2FkaW5nPSEwLHRoaXMuX2FkSW5zdGFuY2UubG9hZERhdGEoe2FkcGlkOnRoaXMuX2FkcGlkfSx0PT57dGhpcy5faXNMb2FkZWQ9ITAsdGhpcy5faXNMb2FkaW5nPSExLHRoaXMuX2xvYWRQcm9taXNlUmVzb2x2ZSE9bnVsbCYmKHRoaXMuX2xvYWRQcm9taXNlUmVzb2x2ZSgpLHRoaXMuX2xvYWRQcm9taXNlUmVzb2x2ZT1udWxsKSx0aGlzLl9zaG93UHJvbWlzZVJlc29sdmUhPW51bGwmJih0aGlzLl9zaG93UHJvbWlzZVJlc29sdmUoKSx0aGlzLl9zaG93UHJvbWlzZVJlc29sdmU9bnVsbCx0aGlzLl9zaG93QWQoKSksdGhpcy5fZGlzcGF0Y2hFdmVudChuYS5sb2FkLHQpfSx0PT57dGhpcy5faXNMb2FkaW5nPSExLHRoaXMuX3Nob3dQcm9taXNlUmVqZWN0IT1udWxsJiYodGhpcy5fc2hvd1Byb21pc2VSZWplY3QodGhpcy5fY3JlYXRlRXJyb3IodCkpLHRoaXMuX3Nob3dQcm9taXNlUmVqZWN0PW51bGwpLHRoaXMuX2Rpc3BhdGNoRXZlbnQobmEuZXJyb3IsdCl9KX19X3Nob3dBZCgpe3RoaXMuX2FkSW5zdGFuY2UhPT1udWxsJiZ0aGlzLl9pc0xvYWRlZD09PSEwJiZ0aGlzLl9hZEluc3RhbmNlLnNob3coe2FkcGlkOnRoaXMuX2FkcGlkfSwoKT0+e3RoaXMuX2lzTG9hZGVkPSExfSx0PT57dGhpcy5faXNMb2FkZWQ9ITEsdGhpcy5fc2hvd1Byb21pc2VSZWplY3QhPW51bGwmJih0aGlzLl9zaG93UHJvbWlzZVJlamVjdCh0aGlzLl9jcmVhdGVFcnJvcih0KSksdGhpcy5fc2hvd1Byb21pc2VSZWplY3Q9bnVsbCksdGhpcy5fZGlzcGF0Y2hFdmVudChuYS5lcnJvcix0KX0pfV9jcmVhdGVFcnJvcih0KXtyZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KHQpKX19bGV0IEJPPUR0KGp3LGU9Pm5ldyB4TyhlKSxXdyx6dyksWnA9Yy5vcy5uYW1lPT09IkFuZHJvaWQiJiZwYXJzZUludChjLm9zLnZlcnNpb24pPDYsTU89WnA/InNsaWRlLWluLXJpZ2h0IjoicG9wLWluIixIdT0zMDAsWHA9WnA/InNsaWRlLW91dC1yaWdodCI6InBvcC1vdXQiLERPPSJfd3d3L19fdW5pYXBwdmlldy5odG1sIixGTz0id2Vidmlld0lkIixMTz0idW5pTVBOYXRpdmVFdmVudCI7ZnVuY3Rpb24gVk8oZSx0LG4pe24mJnQuaXNOVnVlJiYoZS51bmlOVmlldz17cGF0aDpuLGRlZmF1bHRGb250U2l6ZTpJLmRlZmF1bHRGb250U2l6ZSx2aWV3cG9ydDpJLnZpZXdwb3J0fSl9bGV0ICRPPS9eI1thLXowLTldezZ9JC9pO2Z1bmN0aW9uIFFwKGUpe3JldHVybiBlJiYoJE8udGVzdChlKXx8ZT09PSJ0cmFuc3BhcmVudCIpfWZ1bmN0aW9uIFVPKGUsdCl7bGV0e2JhY2tncm91bmRDb2xvcjpufT10OyFufHwhUXAobil8fChlLmJhY2tncm91bmR8fChlLmJhY2tncm91bmQ9biksZS5iYWNrZ3JvdW5kQ29sb3JUb3B8fChlLmJhY2tncm91bmRDb2xvclRvcD1uKSl9ZnVuY3Rpb24gSE8oZSx0KXtlLnBvcEdlc3R1cmU9PT0iaGlkZSImJmRlbGV0ZSBlLnBvcEdlc3R1cmUsdC5pc1F1aXQmJihlLnBvcEdlc3R1cmU9Yy5vcy5uYW1lPT09ImlPUyI/ImFwcGJhY2siOiJub25lIil9ZnVuY3Rpb24gak8oZSx0KXtpZighdC5lbmFibGVQdWxsRG93blJlZnJlc2gpcmV0dXJuO2xldCBuPVpzKFEuZXh0ZW5kKHt9LGMub3MubmFtZT09PSJBbmRyb2lkIj9XTzpHTyx0LnB1bGxUb1JlZnJlc2gpKTtlLnB1bGxUb1JlZnJlc2g9ek8obix0KX1mdW5jdGlvbiB6TyhlLHQpe2xldCBuPVVhKGUpO2lmKCFuKXJldHVybiBlO2xldFtyLHMsZF09bjtyZXR1cm4ocnx8c3x8ZCkmJnNlLm9uTG9jYWxlQ2hhbmdlKCgpPT57bGV0IGc9Yy53ZWJ2aWV3LmdldFdlYnZpZXdCeUlkKHQuaWQrIiIpO2lmKCFnKXJldHVybjtsZXQgeT17c3VwcG9ydDohMH07ciYmKHkuY29udGVudGRvd249e2NhcHRpb246ZS5jb250ZW50ZG93bi5jYXB0aW9ufSkscyYmKHkuY29udGVudG92ZXI9e2NhcHRpb246ZS5jb250ZW50b3Zlci5jYXB0aW9ufSksZCYmKHkuY29udGVudHJlZnJlc2g9e2NhcHRpb246ZS5jb250ZW50cmVmcmVzaC5jYXB0aW9ufSksZy5zZXRTdHlsZSh7cHVsbFRvUmVmcmVzaDp5fSl9KSxlfWxldCBXTz17c3VwcG9ydDohMCxzdHlsZToiY2lyY2xlIn0sR089e3N1cHBvcnQ6ITAsc3R5bGU6ImRlZmF1bHQiLGhlaWdodDoiNTBweCIscmFuZ2U6IjIwMHB4Iixjb250ZW50ZG93bjp7Y2FwdGlvbjoiIn0sY29udGVudG92ZXI6e2NhcHRpb246IiJ9LGNvbnRlbnRyZWZyZXNoOntjYXB0aW9uOiIifX07ZnVuY3Rpb24gWU8oZSx0KXtsZXR7bmF2aWdhdGlvbkJhcjpufT10O2lmKG4uc3R5bGU9PT0iY3VzdG9tIilyZXR1cm4hMTtsZXQgcj0hMDt0LmlzUXVpdCYmKHI9ITEpO2xldCBzPXthdXRvQmFja0J1dHRvbjpyfTtPYmplY3Qua2V5cyhuKS5mb3JFYWNoKGQ9PntsZXQgZz1uW2RdO2Q9PT0iYmFja2dyb3VuZENvbG9yIj9zLmJhY2tncm91bmRDb2xvcj1RcChnKT9nOmFlLkJBQ0tHUk9VTkRfQ09MT1I6ZD09PSJ0aXRsZUltYWdlIiYmZz9zLnRhZ3M9S08oZyk6ZD09PSJidXR0b25zIiYmUS5pc0FycmF5KGcpP3MuYnV0dG9ucz1nLm1hcCgoeSx6KT0+KHkub25jbGljaz1KTyh6KSx5KSk6c1tkXT1nfSksZS50aXRsZU5WaWV3PXFPKHMsdCl9ZnVuY3Rpb24gcU8oZSx0KXtsZXQgbj0kYShlKTtpZighbilyZXR1cm4gZTtsZXRbcixzXT1uO3JldHVybihyfHxzKSYmc2Uub25Mb2NhbGVDaGFuZ2UoKCk9PntsZXQgZD1jLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQodC5pZCsiIik7aWYoIWQpcmV0dXJuO2xldCBnPXt9O3ImJihnLnRpdGxlVGV4dD1lLnRpdGxlVGV4dCkscyYmKGcuc2VhcmNoSW5wdXQ9e3BsYWNlaG9sZGVyOmUuc2VhcmNoSW5wdXQucGxhY2Vob2xkZXJ9KSxkLnNldFN0eWxlKHt0aXRsZU5WaWV3Omd9KX0pLGV9ZnVuY3Rpb24gS08oZSl7cmV0dXJuW3t0YWc6ImltZyIsc3JjOmUscG9zaXRpb246e2xlZnQ6ImF1dG8iLHRvcDoiYXV0byIsd2lkdGg6ImF1dG8iLGhlaWdodDoiMjZweCJ9fV19ZnVuY3Rpb24gSk8oZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe24uaW5kZXg9ZSxIbihhZS5PTl9OQVZJR0FUSU9OX0JBUl9CVVRUT05fVEFQLG4pfX1mdW5jdGlvbiBlZyhlLHQsbil7bGV0IHI9e2JvdW5jZToidmVydGljYWwifTtyZXR1cm4gT2JqZWN0LmtleXModCkuZm9yRWFjaChzPT57Wk8uaW5kZXhPZihzKT09PS0xJiYocltzXT10W3NdKX0pLG4uaWQhPT0iMSImJlZPKHIsdCxlKSxITyhyLHQpLFVPKHIsdCksWU8ocix0KSxqTyhyLHQpLHJ9bGV0IFpPPVsiaWQiLCJyb3V0ZSIsImlzTlZ1ZSIsImlzUXVpdCIsImlzRW50cnkiLCJpc1RhYkJhciIsInRhYkJhckluZGV4Iiwid2luZG93VG9wIiwidG9wV2luZG93IiwibGVmdFdpbmRvdyIsInJpZ2h0V2luZG93IiwibWF4V2lkdGgiLCJ1c2luZ0NvbXBvbmVudHMiLCJkaXNhYmxlU2Nyb2xsIiwiZW5hYmxlUHVsbERvd25SZWZyZXNoIiwibmF2aWdhdGlvbkJhciIsInB1bGxUb1JlZnJlc2giLCJvblJlYWNoQm90dG9tRGlzdGFuY2UiLCJwYWdlT3JpZW50YXRpb24iLCJiYWNrZ3JvdW5kQ29sb3IiXSx0Zz0yO2Z1bmN0aW9uIG5nKCl7cmV0dXJuIHRnfWZ1bmN0aW9uIHJnKCl7cmV0dXJuIHRnKyt9ZnVuY3Rpb24gaWcoZSl7cmV0dXJuIGV9ZnVuY3Rpb24gb2coZSx0KXtsZXQgbj10P2FlLnN0cmluZ2lmeVF1ZXJ5KHQsaWcpOiIiO3JldHVybntwYXRoOmUuc2xpY2UoMSkscXVlcnk6biYmbi5zbGljZSgxKX19ZnVuY3Rpb24gWE8oZSx0LG4pe2xldCByPW4/YWUuc3RyaW5naWZ5UXVlcnkobixpZyk6IiI7cmV0dXJue2lzVGFiOmUsYXJndW1lbnRzOkpTT04uc3RyaW5naWZ5KHtwYXRoOnQuc2xpY2UoMSkscXVlcnk6ciYmci5zbGljZSgxKX0pfX1mdW5jdGlvbiBRTyh7cGF0aDplLHF1ZXJ5OnQscm91dGVPcHRpb25zOm4sd2Vidmlld0V4dHJhczpyfSl7bGV0IHM9cmcoKSxkPWVnKGUsbi5tZXRhLHtpZDpzKyIifSk7cmV0dXJuIGQudW5pUGFnZVVybD1vZyhlLHQpLGQuaXNUYWI9ISFuLm1ldGEuaXNUYWJCYXIsYy53ZWJ2aWV3LmNyZWF0ZSgiIixTdHJpbmcocyksZCxRLmV4dGVuZCh7bnZ1ZTohMCxfX3BhdGhfXzplLF9fcXVlcnlfXzpKU09OLnN0cmluZ2lmeSh0KX0scikpfWxldCBsbztmdW5jdGlvbiBhZyhlKXtsbz1lfWZ1bmN0aW9uIGVUKCl7cmV0dXJuIGxvfWZ1bmN0aW9uIHRUKCl7cmV0dXJuKCFsb3x8bG8uX191bmlhcHBfcm91dGUpJiYobG89Yy53ZWJ2aWV3LmNyZWF0ZShETyxTdHJpbmcocmcoKSkse2NvbnRlbnRBZGp1c3Q6ITF9KSksbG99ZnVuY3Rpb24gblQoZSl7bGV0e3BvcHVwU3ViTlZ1ZVdlYnZpZXdzOnR9PWU7IXR8fGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xvc2UiLCgpPT57T2JqZWN0LmtleXModCkuZm9yRWFjaChuPT57dFtuXS5jbG9zZSgibm9uZSIpfSl9KX1mdW5jdGlvbiBzZyhlKXtyZXR1cm4gSS5yZWFsRW50cnlQYWdlUGF0aCYmZS4kcGFnZS5yb3V0ZT09PUkuZW50cnlQYWdlUGF0aH1mdW5jdGlvbiBsZygpe0kuZW50cnlQYWdlUGF0aD1JLnJlYWxFbnRyeVBhZ2VQYXRoLGRlbGV0ZSBJLnJlYWxFbnRyeVBhZ2VQYXRoLHNlLnJlTGF1bmNoKHt1cmw6YWUuYWRkTGVhZGluZ1NsYXNoKEkuZW50cnlQYWdlUGF0aCl9KX1mdW5jdGlvbiByVChlKXtsZXQgdDtlLmFkZEV2ZW50TGlzdGVuZXIoInBvcEdlc3R1cmUiLG49PntpZihuLnR5cGU9PT0ic3RhcnQiKXtsZXQgcj1HbigpLHM9cltyLmxlbmd0aC0yXTt0PWR1O2xldCBkPXMmJnMuJHBhZ2Uuc3RhdHVzQmFyU3R5bGU7ZCYmWXMoZCl9ZWxzZSBpZihuLnR5cGU9PT0iZW5kIiYmIW4ucmVzdWx0KVlzKHQpO2Vsc2UgaWYobi50eXBlPT09ImVuZCImJm4ucmVzdWx0KXtsZXQgcj1HbigpLmxlbmd0aCxzPVJyKCk7S2EoKSxZcygpLHMmJnI9PT0xJiZzZyhzKT9sZygpOkhuKGFlLk9OX1NIT1cpfX0pfWZ1bmN0aW9uIGlUKGUpe2lmKGUubnZ1ZSlyZXR1cm47bGV0IHQ9ZS5pZCx7c3Vic2NyaWJlOm4sdW5zdWJzY3JpYmU6cn09YnQscz0oZCxnKT0+e2lmKHQhPT1nKXJldHVybjtyKGtjLHMpO2xldCB5PXFvKHBhcnNlSW50KGcpKTt5JiZ5Ll9fcGFnZV9jb250YWluZXJfXy5yZXN0b3JlKCl9O2UuYWRkRXZlbnRMaXN0ZW5lcigicmVjb3ZlcnkiLCgpPT57bihrYyxzKX0pfWZ1bmN0aW9uIG9UKGUpe2xldHtlbWl0OnR9PWJ0LG49ZnVuY3Rpb24oe3dpZHRoOnIsaGVpZ2h0OnN9KXtsZXQgZz17ZGV2aWNlT3JpZW50YXRpb246TWF0aC5hYnMoYy5uYXZpZ2F0b3IuZ2V0T3JpZW50YXRpb24oKSk9PT05MD8ibGFuZHNjYXBlIjoicG9ydHJhaXQiLHNpemU6e3dpbmRvd1dpZHRoOk1hdGguY2VpbChyKSx3aW5kb3dIZWlnaHQ6TWF0aC5jZWlsKHMpfX07dChhZS5PTl9SRVNJWkUsZyxwYXJzZUludChlLmlkKSl9O2UuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIixhZS5kZWJvdW5jZShuLDUwLHtzZXRUaW1lb3V0OkIsY2xlYXJUaW1lb3V0OkN9KSl9bGV0IGNnPXtwdWxsVG9SZWZyZXNoOmFlLk9OX1BVTExfRE9XTl9SRUZSRVNILHRpdGxlTlZpZXdTZWFyY2hJbnB1dENoYW5nZWQ6YWUuT05fTkFWSUdBVElPTl9CQVJfU0VBUkNIX0lOUFVUX0NIQU5HRUQsdGl0bGVOVmlld1NlYXJjaElucHV0Q29uZmlybWVkOmFlLk9OX05BVklHQVRJT05fQkFSX1NFQVJDSF9JTlBVVF9DT05GSVJNRUQsdGl0bGVOVmlld1NlYXJjaElucHV0Q2xpY2tlZDphZS5PTl9OQVZJR0FUSU9OX0JBUl9TRUFSQ0hfSU5QVVRfQ0xJQ0tFRCx0aXRsZU5WaWV3U2VhcmNoSW5wdXRGb2N1c0NoYW5nZWQ6YWUuT05fTkFWSUdBVElPTl9CQVJfU0VBUkNIX0lOUFVUX0ZPQ1VTX0NIQU5HRUR9O2Z1bmN0aW9uIGFUKGUpe2xldCB0PXBhcnNlSW50KGUuaWQpO09iamVjdC5rZXlzKGNnKS5mb3JFYWNoKG49PntsZXQgcj1jZ1tuXTtlLmFkZEV2ZW50TGlzdGVuZXIobixzPT57cj09PWFlLk9OX1BVTExfRE9XTl9SRUZSRVNIJiZGZihlKSxIbih0LHIscyl9KX0pLG5UKGUpLG9UKGUpLGMub3MubmFtZT09PSJpT1MiJiYoaVQoZSksclQoZSkpfWZ1bmN0aW9uIHNUKGUsdCxuLHIpe2xldCBzPWVnKHQscixlKTtzLnVuaVBhZ2VVcmw9b2codCxuKTtsZXQgZD0hIXIuaXNUYWJCYXI7ci5pc05WdWU/cy5pc1RhYj1kOnMuZGVidWdSZWZyZXNoPVhPKGQsdCxuKSxzLmxvY2FsZT12LnJlcXVpcmVNb2R1bGUoInBsdXMiKS5nZXRMYW5ndWFnZSgpLGUuc2V0U3R5bGUocyl9ZnVuY3Rpb24gbFQoZSx0LG4peyhuLnN1Yk5WdWVzfHxbXSkuZm9yRWFjaChzPT57aWYoIXMucGF0aClyZXR1cm47bGV0IGQ9SXMocy5zdHlsZXx8e30pLGc9cy50eXBlPT09Im5hdmlnYXRpb25CYXIiLHk9cy50eXBlPT09InBvcHVwIjtkLnVuaU5WaWV3PXtwYXRoOnMucGF0aC5yZXBsYWNlKCIubnZ1ZSIsIi5qcyIpLGRlZmF1bHRGb250U2l6ZTpJLmRlZmF1bHRGb250U2l6ZSx2aWV3cG9ydDpJLnZpZXdwb3J0fTtsZXQgej17X191bmlhcHBfaG9zdDp0LF9fdW5pYXBwX29yaWdpbjpkLnVuaU5WaWV3LnBhdGguc3BsaXQoIj8iKVswXS5yZXBsYWNlKCIuanMiLCIiKSxfX3VuaWFwcF9vcmlnaW5faWQ6ZS5pZCxfX3VuaWFwcF9vcmlnaW5fdHlwZTplLl9fdW5pYXBwX3R5cGV9LFA7Zz8oZC5wb3NpdGlvbj0iZG9jayIsZC5kb2NrPSJ0b3AiLGQudG9wPSIwIixkLndpZHRoPSIxMDAlIixkLmhlaWdodD1TdHJpbmcoYWUuTkFWQkFSX0hFSUdIVCtMZigpKSxkZWxldGUgZC5sZWZ0LGRlbGV0ZSBkLnJpZ2h0LGRlbGV0ZSBkLmJvdHRvbSxkZWxldGUgZC5tYXJnaW4pOnkmJihkLnBvc2l0aW9uPSJhYnNvbHV0ZSIsc3UodCk/UD1UaTpQPWUsei5fX3VuaWFwcF9tYXNrPWQubWFza3x8InJnYmEoMCwwLDAsMC41KSIsei5fX3VuaWFwcF9tYXNrX2lkPVAuaWQpLGRlbGV0ZSBkLm1hc2s7bGV0ICQ9Yy53ZWJ2aWV3LmNyZWF0ZSgiIixzLmlkLGQseik7aWYoeSl7UC5wb3B1cFN1Yk5WdWVXZWJ2aWV3c3x8KFAucG9wdXBTdWJOVnVlV2Vidmlld3M9e30pLFAucG9wdXBTdWJOVnVlV2Vidmlld3NbJC5pZF09JDtsZXQgX2U9ZnVuY3Rpb24oKXtQLnNldFN0eWxlKHttYXNrOiJub25lIn0pLCQuaGlkZSgiYXV0byIpfTtQLmFkZEV2ZW50TGlzdGVuZXIoIm1hc2tDbGljayIsX2UpO2xldCBUZT0hMTskLmFkZEV2ZW50TGlzdGVuZXIoInNob3ciLCgpPT57VGV8fChjLmtleS5yZW1vdmVFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIixaYSksYy5rZXkuYWRkRXZlbnRMaXN0ZW5lcigiYmFja2J1dHRvbiIsX2UpLFRlPSEwKX0pLCQuYWRkRXZlbnRMaXN0ZW5lcigiaGlkZSIsKCk9PntUZSYmKGMua2V5LnJlbW92ZUV2ZW50TGlzdGVuZXIoImJhY2tidXR0b24iLF9lKSxjLmtleS5hZGRFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIixaYSksVGU9ITEpfSksJC5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsKCk9PntkZWxldGUgUC5wb3B1cFN1Yk5WdWVXZWJ2aWV3c1skLmlkXSxUZSYmKGMua2V5LnJlbW92ZUV2ZW50TGlzdGVuZXIoImJhY2tidXR0b24iLF9lKSxjLmtleS5hZGRFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIixaYSksVGU9ITEpfSl9ZWxzZSBlLmFwcGVuZCgkKX0pfWZ1bmN0aW9uIGNUKGUsdCxuLHIpeyhlLmlkPT09IjEifHwhci5pc05WdWUpJiZzVChlLHQsbixyKSxsVChlLHQsciksYVQoZSl9ZnVuY3Rpb24gdWcoZSl7cmV0dXJuIGUucm91dGVPcHRpb25zLm1ldGEuaXNOVnVlP1FPKGUpOm5nKCk9PT0yP2Mud2Vidmlldy5nZXRMYXVuY2hXZWJ2aWV3KCk6ZVQoKX1mdW5jdGlvbiBmZyhlLHQpe2J0Lm9uY2Uoa2MrIi4iK2UsdCl9bGV0IGNzPSExO2Z1bmN0aW9uIGRnKGUsdCxuKXtjcz17cGF0aDplLG52dWU6WHMoZSkuaXNOVnVlLGNhbGxiYWNrOnR9fWZ1bmN0aW9uIGhnKGUsdCxuKXtEaShlKSxHbChlLiRnZXRBcHBXZWJ2aWV3KCksdCxuKX1mdW5jdGlvbiBqdShlLHQsbj0hMSl7aWYoIW4mJmNzKXJldHVybiBjb25zb2xlLmVycm9yKGBXYWl0aW5nIHRvIG5hdmlnYXRlIHRvOiAke2NzLnBhdGh9LCBkbyBub3Qgb3BlcmF0ZSBjb250aW51b3VzbHk6ICR7ZX0uYCk7aWYoSS5yZW5kZXJlcj09PSJuYXRpdmUiKXJldHVybiBHbigpLmxlbmd0aD09PTA/ZGcoZSx0LCJ3YWl0Rm9yUmVhZHkiKTp0KCk7bGV0IHI9IWxvfHxsbyYmbG8uX191bmlhcHBfcm91dGUscz1sbyYmIWxvLmxvYWRlZDtyfHxzP2RnKGUsdCxyPyJ3YWl0Rm9yQ3JlYXRlIjoid2FpdEZvclJlYWR5Iik6dCgpLHMmJmZnKGxvLmlkLHp1KX1mdW5jdGlvbiB6dSgpe2lmKCFjcylyZXR1cm47bGV0e2NhbGxiYWNrOmV9PWNzO3JldHVybiBjcz0hMSxlKCl9ZnVuY3Rpb24gcGcoKXtpZihJLnJlbmRlcmVyPT09Im5hdGl2ZSIpcmV0dXJuIGNzJiZjcy5udnVlP3p1KCk6dm9pZCAwO2xldCBlPXRUKCk7aWYoISFjcyl7aWYoY3MubnZ1ZSlyZXR1cm4genUoKTtlLmxvYWRlZD9jcy5jYWxsYmFjaygpOmZnKGUuaWQsenUpfX1mdW5jdGlvbiBHbChlLHQsbil7ZVtlLl9fcHJlbG9hZF9fPyJoaWRlIjoiY2xvc2UiXSh0LG4pfWZ1bmN0aW9uIFd1KGUsdCxuLHIscyl7dHlwZW9mIHM9PSJ1bmRlZmluZWQiJiYocz1lLm52dWU/MDoxMDApO2xldCBkPWZ1bmN0aW9uKCl7ZC5fY2FsbGVkfHwoZC5fY2FsbGVkPSEwLHImJnIoKSxwZygpKX07ZC5fY2FsbGVkPSExLEIoKCk9PntsZXQgZz1CKCgpPT57ZCgpfSxuKzE1MCk7ZS5zaG93KHQsbiwoKT0+e2QuX2NhbGxlZHx8QyhnKSxkKCl9KX0scyl9ZnVuY3Rpb24gdVQoZSx0KXtsZXQgbj1lLmNoaWxkcmVuKCk7aWYoIW58fCFuLmxlbmd0aClyZXR1cm4gdCgpO2xldCByPW4uZmluZChzPT5zLmlkLmluZGV4T2YoRk8pPT09MCl8fG5bMF07ci5jYW5CYWNrKCh7Y2FuQmFjazpzfSk9PntzP3IuYmFjaygpOnQoKX0pfWxldCBmVD1SZShYeSwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1ScigpO2lmKCFyKXJldHVybiBuKCJnZXRDdXJyZW50UGFnZXMgaXMgZW1wdHkiKTtpZihIbihyLGFlLk9OX0JBQ0tfUFJFU1Mse2Zyb206ZS5mcm9tfHwibmF2aWdhdGVCYWNrIn0pKXJldHVybiB0KCk7aWYoc2UuaGlkZVRvYXN0KCksc2UuaGlkZUxvYWRpbmcoKSxyLiRwYWdlLm1ldGEuaXNRdWl0KWRUKCk7ZWxzZSBpZihzZyhyKSlsZygpO2Vsc2V7bGV0e2RlbHRhOnMsYW5pbWF0aW9uVHlwZTpkLGFuaW1hdGlvbkR1cmF0aW9uOmd9PWU7aFQocyxkLGcpfXJldHVybiB0KCl9LGVFLHVFKSxHdT0wO2Z1bmN0aW9uIGRUKCl7enQoKSxHdT9EYXRlLm5vdygpLUd1PDJlMyYmYy5ydW50aW1lLnF1aXQoKTooR3U9RGF0ZS5ub3coKSxjLm5hdGl2ZVVJLnRvYXN0KFooKS50KCJ1bmkuYXBwLnF1aXQiKSksQigoKT0+e0d1PTB9LDJlMykpfWZ1bmN0aW9uIGhUKGUsdCxuKXtsZXQgcj1HbigpLHM9ci5sZW5ndGgsZD1yW3MtMV07ZT4xJiZyLnNsaWNlKHMtZSxzLTEpLnJldmVyc2UoKS5mb3JFYWNoKHo9PntHbChjLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQoei4kcGFnZS5pZCsiIiksIm5vbmUiLDApfSk7bGV0IGc9ZnVuY3Rpb24oeil7dD9HbCh6LHQsbnx8SHUpOmQuJHBhZ2Uub3BlblR5cGU9PT0icmVkaXJlY3RUbyI/R2woeixYcCxIdSk6R2woeiwiYXV0byIpLHIuc2xpY2Uocy1lLHMpLmZvckVhY2goUD0+RGkoUCkpLFlzKCksSG4oYWUuT05fU0hPVyl9LHk9Yy53ZWJ2aWV3LmdldFdlYnZpZXdCeUlkKGQuJHBhZ2UuaWQrIiIpO2lmKCFkLl9fdW5pYXBwX3dlYnZpZXcpcmV0dXJuIGcoeSk7dVQoeSwoKT0+e2coeSl9KX1jbGFzcyBwVCBleHRlbmRzIGFlLlVuaU5vZGV7Y29uc3RydWN0b3IodCxuLHI9ITEpe3N1cGVyKGFlLk5PREVfVFlQRV9QQUdFLCIjcGFnZSIsbnVsbCk7dGhpcy5faWQ9MSx0aGlzLl9jcmVhdGVkPSExLHRoaXMuX3VwZGF0aW5nPSExLHRoaXMuX2NyZWF0ZUFjdGlvbk1hcD1uZXcgTWFwLHRoaXMudXBkYXRlQWN0aW9ucz1bXSx0aGlzLmRpY3RzPVtdLHRoaXMubm9kZUlkPTAsdGhpcy5wYWdlSWQ9dCx0aGlzLnBhZ2VOb2RlPXRoaXMsdGhpcy5vcHRpb25zPW4sdGhpcy5pc1VubW91bnRlZD0hMSx0aGlzLmNyZWF0ZUFjdGlvbj1bYWUuQUNUSU9OX1RZUEVfUEFHRV9DUkVBVEUsbl0sdGhpcy5jcmVhdGVkQWN0aW9uPVthZS5BQ1RJT05fVFlQRV9QQUdFX0NSRUFURURdLHRoaXMubm9ybWFsaXplRGljdD10aGlzLl9ub3JtYWxpemVEaWN0LmJpbmQodGhpcyksdGhpcy5fdXBkYXRlPXRoaXMudXBkYXRlLmJpbmQodGhpcyksciYmdGhpcy5zZXR1cCgpfV9ub3JtYWxpemVEaWN0KHQsbj0hMCl7aWYoIVEuaXNQbGFpbk9iamVjdCh0KSlyZXR1cm4gdGhpcy5hZGREaWN0KHQpO2xldCByPVtdO3JldHVybiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKHM9PntsZXQgZD1bdGhpcy5hZGREaWN0KHMpXSxnPXRbc107bj9kLnB1c2godGhpcy5hZGREaWN0KGcpKTpkLnB1c2goZyksci5wdXNoKGQpfSkscn1hZGREaWN0KHQpe2xldHtkaWN0czpufT10aGlzLHI9bi5pbmRleE9mKHQpO3JldHVybiByPi0xP3I6bi5wdXNoKHQpLTF9b25JbmplY3RIb29rKHQpeyh0PT09YWUuT05fUEFHRV9TQ1JPTEx8fHQ9PT1hZS5PTl9SRUFDSF9CT1RUT00pJiYhdGhpcy5zY3JvbGxBY3Rpb24mJih0aGlzLnNjcm9sbEFjdGlvbj1bYWUuQUNUSU9OX1RZUEVfUEFHRV9TQ1JPTEwsdGhpcy5vcHRpb25zLm9uUmVhY2hCb3R0b21EaXN0YW5jZV0sdGhpcy5wdXNoKHRoaXMuc2Nyb2xsQWN0aW9uKSl9b25DcmVhdGUodCxuKXtyZXR1cm4gbVQodGhpcyx0Lm5vZGVJZCxuKSx0fW9uSW5zZXJ0QmVmb3JlKHQsbixyKXtyZXR1cm4gX1QodGhpcyxuLHQubm9kZUlkLHImJnIubm9kZUlkfHwtMSksbn1vblJlbW92ZUNoaWxkKHQpe3JldHVybiBiVCh0aGlzLHQubm9kZUlkKSx0fW9uQWRkRXZlbnQodCxuLHIpe3QucGFyZW50Tm9kZSYmeVQodGhpcyx0Lm5vZGVJZCxuLHIpfW9uQWRkV3hzRXZlbnQodCxuLHIscyl7dC5wYXJlbnROb2RlJiZFVCh0aGlzLHQubm9kZUlkLG4scixzKX1vblJlbW92ZUV2ZW50KHQsbil7dC5wYXJlbnROb2RlJiZ3VCh0aGlzLHQubm9kZUlkLG4pfW9uU2V0QXR0cmlidXRlKHQsbixyKXt0LnBhcmVudE5vZGUmJkNUKHRoaXMsdC5ub2RlSWQsbixyKX1vblJlbW92ZUF0dHJpYnV0ZSh0LG4pe3QucGFyZW50Tm9kZSYmQVQodGhpcyx0Lm5vZGVJZCxuKX1vblRleHRDb250ZW50KHQsbil7dC5wYXJlbnROb2RlJiZ2Zyh0aGlzLHQubm9kZUlkLG4pfW9uTm9kZVZhbHVlKHQsbil7dC5wYXJlbnROb2RlJiZ2Zyh0aGlzLHQubm9kZUlkLG4pfWdlbklkKCl7cmV0dXJuIHRoaXMuX2lkKyt9cHVzaCh0LG4pe2lmKCF0aGlzLmlzVW5tb3VudGVkKXtzd2l0Y2godFswXSl7Y2FzZSBhZS5BQ1RJT05fVFlQRV9DUkVBVEU6dGhpcy5fY3JlYXRlQWN0aW9uTWFwLnNldCh0WzFdLHQpO2JyZWFrO2Nhc2UgYWUuQUNUSU9OX1RZUEVfSU5TRVJUOmxldCByPXRoaXMuX2NyZWF0ZUFjdGlvbk1hcC5nZXQodFsxXSk7cj8oclszXT10WzJdLHJbNF09dFszXSxuJiYocls1XT1uKSk6KG4mJih0WzRdPW4pLHRoaXMudXBkYXRlQWN0aW9ucy5wdXNoKHQpKTticmVha310WzBdIT09YWUuQUNUSU9OX1RZUEVfSU5TRVJUJiZ0aGlzLnVwZGF0ZUFjdGlvbnMucHVzaCh0KSx0aGlzLl91cGRhdGluZ3x8KHRoaXMuX3VwZGF0aW5nPSEwLGhuLnF1ZXVlUG9zdEZsdXNoQ2IodGhpcy5fdXBkYXRlKSl9fXJlc3RvcmUoKXt0aGlzLmNsZWFyKCksdGhpcy5zZXR1cCgpLHRoaXMuc2Nyb2xsQWN0aW9uJiZ0aGlzLnB1c2godGhpcy5zY3JvbGxBY3Rpb24pO2xldCB0PW49Pnt0aGlzLm9uQ3JlYXRlKG4sbi5ub2RlTmFtZSksdGhpcy5vbkluc2VydEJlZm9yZShuLnBhcmVudE5vZGUsbixudWxsKSxuLmNoaWxkTm9kZXMuZm9yRWFjaChyPT57dChyKX0pfTt0aGlzLmNoaWxkTm9kZXMuZm9yRWFjaChuPT50KG4pKSx0aGlzLnB1c2godGhpcy5jcmVhdGVkQWN0aW9uKX1zZXR1cCgpe3RoaXMuc2VuZChbdGhpcy5jcmVhdGVBY3Rpb25dKX11cGRhdGUoKXtsZXR7ZGljdHM6dCx1cGRhdGVBY3Rpb25zOm4sX2NyZWF0ZUFjdGlvbk1hcDpyfT10aGlzO3RoaXMuX2NyZWF0ZWR8fCh0aGlzLl9jcmVhdGVkPSEwLG4ucHVzaCh0aGlzLmNyZWF0ZWRBY3Rpb24pKSxuLmxlbmd0aCYmKHQubGVuZ3RoJiZuLnVuc2hpZnQoW1hBLHRdKSx0aGlzLnNlbmQobikpLHRoaXMuY2xlYXIoKX1jbGVhcigpe3RoaXMuZGljdHMubGVuZ3RoPTAsdGhpcy51cGRhdGVBY3Rpb25zLmxlbmd0aD0wLHRoaXMuX3VwZGF0aW5nPSExLHRoaXMuX2NyZWF0ZUFjdGlvbk1hcC5jbGVhcigpfXNlbmQodCl7YnQucHVibGlzaEhhbmRsZXIoTXAsdCx0aGlzLnBhZ2VJZCl9ZmlyZUV2ZW50KHQsbil7bGV0IHI9Z2codCx0aGlzKTtyJiZyLmRpc3BhdGNoRXZlbnQobil9fWZ1bmN0aW9uIGdUKGUpe2xldCB0PXFvKGUpO3JldHVybiB0P3QuX19wYWdlX2NvbnRhaW5lcl9fOm51bGx9ZnVuY3Rpb24gS2YoZSx0LG4pe2lmKHR5cGVvZiBuPT0ibnVtYmVyIiYmKG49Z1QobikpLG5bZV09PT10KXJldHVybiBuO2xldHtjaGlsZE5vZGVzOnJ9PW47Zm9yKGxldCBzPTA7czxyLmxlbmd0aDtzKyspe2xldCBkPUtmKGUsdCxyW3NdKTtpZihkKXJldHVybiBkfXJldHVybiBudWxsfWZ1bmN0aW9uIGdnKGUsdCl7cmV0dXJuIEtmKCJub2RlSWQiLGUsdCl9ZnVuY3Rpb24gdlQoZSx0KXtyZXR1cm4gS2YoIm5vZGVOYW1lIixlLnRvVXBwZXJDYXNlKCksdCl9ZnVuY3Rpb24gbVQoZSx0LG4pe2UucHVzaChbYWUuQUNUSU9OX1RZUEVfQ1JFQVRFLHQsZS5hZGREaWN0KG4pLC0xLC0xXSl9ZnVuY3Rpb24gX1QoZSx0LG4scil7bGV0IHM9dC50b0pTT04oe2F0dHI6ITAsbm9ybWFsaXplOmUubm9ybWFsaXplRGljdH0pO2UucHVzaChbYWUuQUNUSU9OX1RZUEVfSU5TRVJULHQubm9kZUlkLG4scl0sT2JqZWN0LmtleXMocykubGVuZ3RoP3M6dm9pZCAwKX1mdW5jdGlvbiBiVChlLHQpe2UucHVzaChbYWUuQUNUSU9OX1RZUEVfUkVNT1ZFLHRdKX1mdW5jdGlvbiB5VChlLHQsbixyKXtlLnB1c2goW2FlLkFDVElPTl9UWVBFX0FERF9FVkVOVCx0LGUuYWRkRGljdChuKSxyXSl9ZnVuY3Rpb24gRVQoZSx0LG4scixzKXtlLnB1c2goW2FlLkFDVElPTl9UWVBFX0FERF9XWFNfRVZFTlQsdCxlLmFkZERpY3QobiksZS5hZGREaWN0KHIpLHNdKX1mdW5jdGlvbiB3VChlLHQsbil7ZS5wdXNoKFthZS5BQ1RJT05fVFlQRV9SRU1PVkVfRVZFTlQsdCxlLmFkZERpY3QobildKX1mdW5jdGlvbiBTVChlLHQsbil7cmV0dXJuIHQ9PT0ic3R5bGUiJiZRLmlzUGxhaW5PYmplY3Qobik/ZS5ub3JtYWxpemVEaWN0KG4pOmUuYWRkRGljdChuKX1mdW5jdGlvbiBDVChlLHQsbixyKXtlLnB1c2goW2FlLkFDVElPTl9UWVBFX1NFVF9BVFRSSUJVVEUsdCxlLmFkZERpY3QobiksU1QoZSxuLHIpXSl9ZnVuY3Rpb24gQVQoZSx0LG4pe2UucHVzaChbYWUuQUNUSU9OX1RZUEVfUkVNT1ZFX0FUVFJJQlVURSx0LGUuYWRkRGljdChuKV0pfWZ1bmN0aW9uIHZnKGUsdCxuKXtlLnB1c2goW2FlLkFDVElPTl9UWVBFX1NFVF9URVhULHQsZS5hZGREaWN0KG4pXSl9ZnVuY3Rpb24gT1QoZSx0LG4pe3JldHVybiBuZXcgcFQoZSx0LG4pfWZ1bmN0aW9uIG1nKGUpe2xldCB0PWUuc2V0dXA7cmV0dXJuIGUuaW5oZXJpdEF0dHJzPSExLGUuc2V0dXA9KG4scik9PntsZXR7YXR0cnM6e19fcGFnZUlkOnMsX19wYWdlUGF0aDpkLF9fcGFnZVF1ZXJ5OmcsX19wYWdlSW5zdGFuY2U6eX19PXIsUD1obi5nZXRDdXJyZW50SW5zdGFuY2UoKS5wcm94eTtpZih1dChQLHkpLFlvKF9nKHMsUCx5KSksaG4ub25Nb3VudGVkKCgpPT57aG4ubmV4dFRpY2soKCk9PntIbihQLGFlLk9OX1JFQURZKX0pfSksaG4ub25CZWZvcmVVbm1vdW50KCgpPT57SG4oUCxhZS5PTl9VTkxPQUQpfSksdClyZXR1cm4gdChnLHIpfSxlfWZ1bmN0aW9uIF9nKGUsdCxuKXtsZXQgcj0oKT0+Yy53ZWJ2aWV3LmdldFdlYnZpZXdCeUlkKGUrIiIpO3JldHVybiB0LiRnZXRBcHBXZWJ2aWV3PXIsdC4kLmN0eC4kc2NvcGU9eyRnZXRBcHBXZWJ2aWV3OnJ9LHQuZ2V0T3BlbmVyRXZlbnRDaGFubmVsPSgpPT4obi5ldmVudENoYW5uZWx8fChuLmV2ZW50Q2hhbm5lbD1uZXcgYWUuRXZlbnRDaGFubmVsKGUpKSxuLmV2ZW50Q2hhbm5lbCksdH1mdW5jdGlvbiBUVChlKXtyZXR1cm4gUS5pc0Z1bmN0aW9uKGUpfWxldCBiZz1uZXcgTWFwO2Z1bmN0aW9uIElUKGUsdCl7Ymcuc2V0KGUsYWUub25jZShOVCh0KSkpfWZ1bmN0aW9uIFBUKGUsdCxuLHIscyl7bGV0IGQ9T1QoZSxzLCEwKSxnPVlhKCkseT1iZy5nZXQodCkoKSx6PVA9PmcubW91bnRQYWdlKFAse19fcGFnZUlkOmUsX19wYWdlUGF0aDp0LF9fcGFnZVF1ZXJ5Om4sX19wYWdlSW5zdGFuY2U6cn0sZCk7cmV0dXJuIFEuaXNQcm9taXNlKHkpP3kudGhlbihQPT56KFApKTp6KHkpfWZ1bmN0aW9uIE5UKGUpe3JldHVybigpPT5UVChlKT9lKCkudGhlbih0PT5tZyh0KSk6bWcoZSl9bGV0IHlnPSExO2Z1bmN0aW9uIEVnKCl7aWYoeWcpcmV0dXJuO3lnPSEwO2xldCBlLHQ7aWYodi5yZXF1aXJlTW9kdWxlKCJwbHVzIikuZ2V0UmVkaXJlY3RJbmZvKXtsZXR7cGF0aDpkLHF1ZXJ5OmcscmVmZXJyZXJJbmZvOnl9PUJ0KCk7ZCYmKGU9ZCx0PWcpLEkucmVmZXJyZXJJbmZvPXl9ZWxzZXtsZXQgZD1jLnJ1bnRpbWUuYXJndW1lbnRzO2lmKCFkKXJldHVybjt0cnl7bGV0IGc9SlNPTi5wYXJzZShkKTtlPWcucGF0aHx8Zy5wYXRoTmFtZSx0PWcucXVlcnk/Ij8iK2cucXVlcnk6IiJ9Y2F0Y2goZyl7fX1pZighZXx8ZT09PUkuZW50cnlQYWdlUGF0aCl7dCYmKEkuZW50cnlQYWdlUXVlcnk9dCk7cmV0dXJufWxldCByPWFlLmFkZExlYWRpbmdTbGFzaChlKSxzPWZvKHIpOyFzfHwocy5tZXRhLmlzVGFiQmFyfHwoSS5yZWFsRW50cnlQYWdlUGF0aD1JLnJlYWxFbnRyeVBhZ2VQYXRofHxJLmVudHJ5UGFnZVBhdGgpLEkuZW50cnlQYWdlUGF0aD1lLEkuZW50cnlQYWdlUXVlcnk9dCl9ZnVuY3Rpb24gd2coZSx0KXtsZXQgbj1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGZvKGUpKSk7cmV0dXJuIG4ubWV0YT1UcyhuLm1ldGEpLHQhPT0icHJlbG9hZFBhZ2UiJiYhSS5yZWFsRW50cnlQYWdlUGF0aCYmKHQ9PT0icmVMYXVuY2gifHxHbigpLmxlbmd0aD09PTApP24ubWV0YS5pc1F1aXQ9ITA6bi5tZXRhLmlzVGFiQmFyfHwobi5tZXRhLmlzUXVpdD0hMSksbn1sZXQgU3M9e307ZnVuY3Rpb24ga1QoZSl7bGV0IHQ9T2JqZWN0LmtleXMoU3MpLmZpbmQobj0+U3Nbbl0uaWQ9PT1lLmlkKTt0JiZkZWxldGUgU3NbdF19ZnVuY3Rpb24gUlQoe3VybDplfSl7bGV0IHQ9U3NbZV07cmV0dXJuIHQmJih0Ll9fcGFnZV9fJiZHbigpLmZpbmQobj0+bj09PXQuX19wYWdlX18pP3QuX19wcmVsb2FkX189ITE6dC5jbG9zZSgibm9uZSIpLGRlbGV0ZSBTc1tlXSksdH1mdW5jdGlvbiB4VCh7dXJsOmUscGF0aDp0LHF1ZXJ5Om59KXtpZighU3NbZV0pe2xldCByPXdnKHQsInByZWxvYWRQYWdlIik7U3NbZV09dWcoe3BhdGg6dCxyb3V0ZU9wdGlvbnM6cixxdWVyeTpuLHdlYnZpZXdFeHRyYXM6e19fcHJlbG9hZF9fOiEwfX0pfXJldHVybiBTc1tlXX1mdW5jdGlvbiBwdSh7dXJsOmUscGF0aDp0LHF1ZXJ5Om4sb3BlblR5cGU6cix3ZWJ2aWV3OnMsbnZ1ZVBhZ2VWbTpkLGV2ZW50Q2hhbm5lbDpnfSl7aWYocyYmRWcoKSxTc1tlXSl7cz1Tc1tlXTtsZXQgVGU9cztpZihUZS5fX3BhZ2VfXylpZihHbigpLmZpbmQoTGU9PkxlPT09VGUuX19wYWdlX18pKXM9dm9pZCAwO2Vsc2UgcmV0dXJuIGcmJihUZS5fX3BhZ2VfXy4kcGFnZS5ldmVudENoYW5uZWw9ZyksWW8oVGUuX19wYWdlX18pLFRlfWxldCB5PXdnKHQscik7cz8ocz1jLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQocy5pZCkscy5udnVlPXkubWV0YS5pc05WdWUpOnM9dWcoe3BhdGg6dCxyb3V0ZU9wdGlvbnM6eSxxdWVyeTpufSkseS5tZXRhLmlkPXBhcnNlSW50KHMuaWQpLCEheS5tZXRhLmlzVGFiQmFyJiZUaS5hcHBlbmQocyksY1Qocyx0LG4seS5tZXRhKTtsZXQgUD10LnNsaWNlKDEpO3MuX191bmlhcHBfcm91dGU9UDtsZXQgJD1KcihyLGUsbix5Lm1ldGEsZyksX2U9cGFyc2VJbnQocy5pZCk7cmV0dXJuIHMubnZ1ZT9kP01UKF9lLGQsJCk6RFQoX2UscywkKTpQVChfZSxQLG4sJCxCVCh5KSksc31mdW5jdGlvbiBCVCh7bWV0YTplfSl7bGV0IHQ9TGYoKSx7cGxhdGZvcm06bixwaXhlbFJhdGlvOnIsd2luZG93V2lkdGg6c309aWEoKTtyZXR1cm57Y3NzOiEwLHJvdXRlOmUucm91dGUsdmVyc2lvbjoxLGxvY2FsZToiIixwbGF0Zm9ybTpuLHBpeGVsUmF0aW86cix3aW5kb3dXaWR0aDpzLGRpc2FibGVTY3JvbGw6ZS5kaXNhYmxlU2Nyb2xsPT09ITAsb25QYWdlU2Nyb2xsOiExLG9uUGFnZVJlYWNoQm90dG9tOiExLG9uUmVhY2hCb3R0b21EaXN0YW5jZTpRLmhhc093bihlLCJvblJlYWNoQm90dG9tRGlzdGFuY2UiKT9lLm9uUmVhY2hCb3R0b21EaXN0YW5jZTphZS5PTl9SRUFDSF9CT1RUT01fRElTVEFOQ0Usc3RhdHVzYmFySGVpZ2h0OnQsd2luZG93VG9wOmUubmF2aWdhdGlvbkJhci50eXBlPT09ImZsb2F0Ij90K2FlLk5BVkJBUl9IRUlHSFQ6MCx3aW5kb3dCb3R0b206VGkuaW5kZXhPZihlLnJvdXRlKT49MCYmVGkuY292ZXI/VGkuaGVpZ2h0OjB9fWZ1bmN0aW9uIE1UKGUsdCxuKXt1dCh0LG4pLFlvKF9nKGUsdCxuKSksZT09PTEmJihJLnNwbGFzaHNjcmVlbiYmSS5zcGxhc2hzY3JlZW4uYXV0b2Nsb3NlJiYhSS5zcGxhc2hzY3JlZW4uYWx3YXlzU2hvd0JlZm9yZVJlbmRlciYmYy5uYXZpZ2F0b3IuY2xvc2VTcGxhc2hzY3JlZW4oKSxJLm9uUmVhZHkoZnVuY3Rpb24oKXtwZygpfSkpfWZ1bmN0aW9uIERUKGUsdCxuKXtsZXQgcj17JDp7fSwkZ2V0QXBwV2Vidmlldygpe3JldHVybiB0fSxnZXRPcGVuZXJFdmVudENoYW5uZWwoKXtyZXR1cm4gbi5ldmVudENoYW5uZWx8fChuLmV2ZW50Q2hhbm5lbD1uZXcgYWUuRXZlbnRDaGFubmVsKGUpKSxuLmV2ZW50Q2hhbm5lbH0sX19zZXR1cChzLGQpe3MuJGdldEFwcFdlYnZpZXc9KCk9PnQscy5nZXRPcGVuZXJFdmVudENoYW5uZWw9ZC5nZXRPcGVuZXJFdmVudENoYW5uZWwsdXQocyxuKSx0Ll9fcHJlbG9hZF9fJiYodC5fX3BhZ2VfXz1zKTtsZXQgZz1xYSgpLHk9Zy5maW5kSW5kZXgoej0+ej09PWQpO3k+LTEmJmcuc3BsaWNlKHksMSxzKX19O3V0KHIsbiksdC5fX3ByZWxvYWRfXz90Ll9fcGFnZV9fPXI6WW8ocil9bGV0IFNnPShlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldHt1cmw6cixldmVudHM6cyxhbmltYXRpb25UeXBlOmQsYW5pbWF0aW9uRHVyYXRpb246Z309ZSx7cGF0aDp5LHF1ZXJ5Onp9PWFlLnBhcnNlVXJsKHIpLFtQLCRdPVZUKHksZCxnKTtqdSh5LCgpPT57TFQoe3VybDpyLHBhdGg6eSxxdWVyeTp6LGV2ZW50czpzLGFuaVR5cGU6UCxhbmlEdXJhdGlvbjokfSkudGhlbih0KS5jYXRjaChuKX0sZS5vcGVuVHlwZT09PSJhcHBMYXVuY2giKX0sRlQ9UmUoTmYsU2csUXksYUUpO2Z1bmN0aW9uIExUKHt1cmw6ZSxwYXRoOnQscXVlcnk6bixldmVudHM6cixhbmlUeXBlOnMsYW5pRHVyYXRpb246ZH0pe0huKGFlLk9OX0hJREUpO2xldCBnPW5ldyBhZS5FdmVudENoYW5uZWwobmcoKSsxLHIpO3JldHVybiBuZXcgUHJvbWlzZSh5PT57V3UocHUoe3VybDplLHBhdGg6dCxxdWVyeTpuLG9wZW5UeXBlOiJuYXZpZ2F0ZVRvIixldmVudENoYW5uZWw6Z30pLHMsZCwoKT0+e3koe2V2ZW50Q2hhbm5lbDpnfSl9KSxZcygpfSl9ZnVuY3Rpb24gVlQoZSx0LG4pe2xldHtnbG9iYWxTdHlsZTpyfT1JLHM9WHMoZSk7cmV0dXJuW3R8fHMuYW5pbWF0aW9uVHlwZXx8ci5hbmltYXRpb25UeXBlfHxNTyxufHxzLmFuaW1hdGlvbkR1cmF0aW9ufHxyLmFuaW1hdGlvbkR1cmF0aW9ufHxIdV19bGV0ICRUPVJlKGtmLCh7dXJsOmV9LHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldHtwYXRoOnIscXVlcnk6c309YWUucGFyc2VVcmwoZSk7anUociwoKT0+e1VUKHt1cmw6ZSxwYXRoOnIscXVlcnk6c30pLnRoZW4odCkuY2F0Y2gobil9KX0sdEUsc0UpO2Z1bmN0aW9uIFVUKHt1cmw6ZSxwYXRoOnQscXVlcnk6bn0pe2xldCByPVJyKCk7cmV0dXJuIHImJkRpKHIpLG5ldyBQcm9taXNlKHM9PntXdShwdSh7dXJsOmUscGF0aDp0LHF1ZXJ5Om4sb3BlblR5cGU6InJlZGlyZWN0VG8ifSksIm5vbmUiLDAsKCk9PntpZihyKXtsZXQgZD1yLiRnZXRBcHBXZWJ2aWV3KCk7ZC5fX3ByZWxvYWRfXyYma1QoZCksZC5jbG9zZSgibm9uZSIpfXModm9pZCAwKX0pLFlzKCl9KX1sZXQgSFQ9KHt1cmw6ZX0se3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0e3BhdGg6cixxdWVyeTpzfT1hZS5wYXJzZVVybChlKTtqdShyLCgpPT57alQoe3VybDplLHBhdGg6cixxdWVyeTpzfSkudGhlbih0KS5jYXRjaChuKX0pfTtmdW5jdGlvbiBqVCh7dXJsOmUscGF0aDp0LHF1ZXJ5Om59KXtyZXR1cm4gbmV3IFByb21pc2Uocj0+e2xldCBzPXFhKCkuc2xpY2UoMCk7R2UuZmluZChnPT5nLnBhdGg9PT10KS5tZXRhLmlzVGFiQmFyJiZUaS5zd2l0Y2hUYWIodC5zbGljZSgxKSksV3UocHUoe3VybDplLHBhdGg6dCxxdWVyeTpuLG9wZW5UeXBlOiJyZUxhdW5jaCJ9KSwibm9uZSIsMCwoKT0+e3MuZm9yRWFjaChnPT5oZyhnLCJub25lIikpLHIodm9pZCAwKX0pLFlzKCl9KX1sZXQgelQ9UmUoamgsSFQsbkUsbEUpLENnPShlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldHt1cmw6cn09ZSx7cGF0aDpzLHF1ZXJ5OmR9PWFlLnBhcnNlVXJsKHIpO2p1KHMsKCk9PntHVCh7dXJsOnIscGF0aDpzLHF1ZXJ5OmR9KS50aGVuKHQpLmNhdGNoKG4pfSxlLm9wZW5UeXBlPT09ImFwcExhdW5jaCIpfSxXVD1SZShJdSxDZyxyRSxjRSk7ZnVuY3Rpb24gR1Qoe3VybDplLHBhdGg6dCxxdWVyeTpufSl7VGkuc3dpdGNoVGFiKHQuc2xpY2UoMSkpO2xldCByPUduKCkscz1yLmxlbmd0aCxkPSExLGc9ITEseTtzPj0xJiYoeT1yW3MtMV0seSYmIXkuJC5fX2lzVGFiQmFyPyhnPSEwLHIucmV2ZXJzZSgpLmZvckVhY2goUD0+eyFQLiQuX19pc1RhYkJhciYmUCE9PXkmJmhnKFAsIm5vbmUiKX0pLERpKHkpLEIoKCk9Pnt5LiRwYWdlLm9wZW5UeXBlPT09InJlZGlyZWN0VG8iP0dsKHkuJGdldEFwcFdlYnZpZXcoKSxYcCxIdSk6R2woeS4kZ2V0QXBwV2VidmlldygpLCJhdXRvIil9LDEwMCkpOmQ9ITApO2xldCB6O3JldHVybiBxYSgpLmZvckVhY2goUD0+e2FlLmFkZExlYWRpbmdTbGFzaChQLnJvdXRlKT09PXQ/KFAuJC5fX2lzQWN0aXZlfHwoZz0hMCksUC4kLl9faXNBY3RpdmU9ITAsej1QKTpQLiQuX19pc1RhYkJhciYmKFAuJC5fX2lzQWN0aXZlPSExKX0pLHk9PT16JiYoZD0hMSkseSYmZCYmSG4oeSxhZS5PTl9ISURFKSxuZXcgUHJvbWlzZShQPT57aWYoeil7bGV0ICQ9ei4kZ2V0QXBwV2VidmlldygpOyQuc2hvdygibm9uZSIpLGcmJiEkLl9fcHJlbG9hZF9fJiZIbih6LGFlLk9OX1NIT1cpLFlzKCksUCh2b2lkIDApfWVsc2UgV3UocHUoe3VybDplLHBhdGg6dCxxdWVyeTpuLG9wZW5UeXBlOiJzd2l0Y2hUYWIifSksIm5vbmUiLDAsKCk9PntZcygpLFAodm9pZCAwKX0sNzApfSl9bGV0IFlUPUR0KHpoLCh7dXJsOmV9KT0+e2xldCB0PVJUKHt1cmw6ZX0pO3JldHVybiB0P3tpZDp0LmlkLHVybDplLGVyck1zZzoidW5QcmVsb2FkUGFnZTpvayJ9Ont1cmw6ZSxlcnJNc2c6InVuUHJlbG9hZFBhZ2U6ZmFpbCBub3QgZm91bmQifX0sb0UpLHFUPVJlKFJmLCh7dXJsOmV9LHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPWUuc3BsaXQoIj8iKSxzPXJbMF0sZD1hZS5wYXJzZVF1ZXJ5KHJbMV18fCIiKSxnPXhUKHt1cmw6ZSxwYXRoOnMscXVlcnk6ZH0pO3Qoe2lkOmcuaWQsdXJsOmUsZXJyTXNnOiJwcmVsb2FkUGFnZTpvayJ9KX0saUUpO3ZhciBLVD17X19wcm90b19fOm51bGwsc2VuZEhvc3RFdmVudDpZcCxuYXZpZ2F0ZVRvTWluaVByb2dyYW06Yk8sb25Ib3N0RXZlbnRSZWNlaXZlOktwLG9uTmF0aXZlRXZlbnRSZWNlaXZlOnlPLF9fbG9nX186d08sbmF2aWdhdGVUbzpGVCxyZUxhdW5jaDp6VCxzd2l0Y2hUYWI6V1QsdXB4MnB4OnltLGFkZEludGVyY2VwdG9yOk9tLHJlbW92ZUludGVyY2VwdG9yOlRtLGludGVyY2VwdG9yczpJbSxhcnJheUJ1ZmZlclRvQmFzZTY0OllyLGJhc2U2NFRvQXJyYXlCdWZmZXI6UmksY3JlYXRlSW50ZXJzZWN0aW9uT2JzZXJ2ZXI6eV8sY3JlYXRlTWVkaWFRdWVyeU9ic2VydmVyOndfLGNyZWF0ZVNlbGVjdG9yUXVlcnk6SV8sY3JlYXRlVmlkZW9Db250ZXh0OkttLGNyZWF0ZU1hcENvbnRleHQ6Wm0sY3JlYXRlQW5pbWF0aW9uOkJfLG9uV2luZG93UmVzaXplOkxfLG9mZldpbmRvd1Jlc2l6ZTpWXyxvblRhYkJhck1pZEJ1dHRvblRhcDpNXyxjcmVhdGVDYW52YXNDb250ZXh0OmRfLGNhbnZhc0dldEltYWdlRGF0YTpoXyxjYW52YXNQdXRJbWFnZURhdGE6cF8sY2FudmFzVG9UZW1wRmlsZVBhdGg6Z18sZ2V0U2VsZWN0ZWRUZXh0UmFuZ2U6el8sZ2V0TG9jYWxlOm51LHNldExvY2FsZTpIXywkb246RG0sJG9mZjpMbSwkb25jZTpGbSwkZW1pdDpWbSxvbkNyZWF0ZVZ1ZUFwcDphZS5vbkNyZWF0ZVZ1ZUFwcCxvbkxvY2FsZUNoYW5nZTpVXyxzZXRQYWdlTWV0YTpqXyxnZXRFbnRlck9wdGlvbnNTeW5jOm5iLGdldExhdW5jaE9wdGlvbnNTeW5jOnJiLGdldFB1c2hDbGllbnRJZDppYixvblB1c2hNZXNzYWdlOm9iLG9mZlB1c2hNZXNzYWdlOmFiLG9uQXBwSGlkZTplYixvbkFwcFNob3c6WF8sb25FcnJvcjpKXyxvblBhZ2VOb3RGb3VuZDpxXyxvblVuaGFuZGxlZFJlamVjdGlvbjpHXyxvZmZBcHBIaWRlOnRiLG9mZkFwcFNob3c6UV8sb2ZmRXJyb3I6Wl8sb2ZmUGFnZU5vdEZvdW5kOktfLG9mZlVuaGFuZGxlZFJlamVjdGlvbjpZXyxpbnZva2VQdXNoQ2FsbGJhY2s6SWYsc2V0U3RvcmFnZVN5bmM6WXcsc2V0U3RvcmFnZTpxdyxnZXRTdG9yYWdlU3luYzpLdyxnZXRTdG9yYWdlOkp3LHJlbW92ZVN0b3JhZ2VTeW5jOlp3LHJlbW92ZVN0b3JhZ2U6WHcsY2xlYXJTdG9yYWdlU3luYzpRdyxjbGVhclN0b3JhZ2U6ZVMsZ2V0U3RvcmFnZUluZm9TeW5jOlpoLGdldFN0b3JhZ2VJbmZvOnRTLGdldEZpbGVJbmZvOm5TLHNhdmVGaWxlOmFTLGdldFNhdmVkRmlsZUxpc3Q6Y1MsZ2V0U2F2ZWRGaWxlSW5mbzp1UyxyZW1vdmVTYXZlZEZpbGU6ZlMsb3BlbkRvY3VtZW50OmRTLGNhbklVc2U6aFMsZ2V0RGV2aWNlSW5mbzppcCxnZXRBcHBCYXNlSW5mbzpvcCxnZXRTeXN0ZW1JbmZvU3luYzphcCxnZXRTeXN0ZW1JbmZvOkVTLG9uQ29tcGFzc0NoYW5nZTp3UyxvZmZDb21wYXNzQ2hhbmdlOlNTLHN0YXJ0Q29tcGFzczpzcCxzdG9wQ29tcGFzczpscCx2aWJyYXRlU2hvcnQ6Q1MsdmlicmF0ZUxvbmc6QVMsb25BY2NlbGVyb21ldGVyQ2hhbmdlOk9TLG9mZkFjY2VsZXJvbWV0ZXJDaGFuZ2U6VFMsc3RhcnRBY2NlbGVyb21ldGVyOmNwLHN0b3BBY2NlbGVyb21ldGVyOnVwLG9uQmx1ZXRvb3RoRGV2aWNlRm91bmQ6SVMsb25CbHVldG9vdGhBZGFwdGVyU3RhdGVDaGFuZ2U6UFMsb25CTEVDb25uZWN0aW9uU3RhdGVDaGFuZ2U6TlMsb25CTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlOmtTLG9wZW5CbHVldG9vdGhBZGFwdGVyOlJTLGNsb3NlQmx1ZXRvb3RoQWRhcHRlcjp4UyxnZXRCbHVldG9vdGhBZGFwdGVyU3RhdGU6QlMsc3RhcnRCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5Ok1TLHN0b3BCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5OkRTLGdldEJsdWV0b290aERldmljZXM6RlMsZ2V0Q29ubmVjdGVkQmx1ZXRvb3RoRGV2aWNlczpMUyxjcmVhdGVCTEVDb25uZWN0aW9uOlZTLGNsb3NlQkxFQ29ubmVjdGlvbjokUyxnZXRCTEVEZXZpY2VTZXJ2aWNlczpVUyxnZXRCTEVEZXZpY2VDaGFyYWN0ZXJpc3RpY3M6SFMsbm90aWZ5QkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZUNoYW5nZTpqUyxyZWFkQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZTp6Uyx3cml0ZUJMRUNoYXJhY3RlcmlzdGljVmFsdWU6V1Msc2V0QkxFTVRVOkdTLGdldEJMRURldmljZVJTU0k6WVMsb25CZWFjb25VcGRhdGU6cVMsb25CZWFjb25TZXJ2aWNlQ2hhbmdlOktTLGdldEJlYWNvbnM6SlMsc3RhcnRCZWFjb25EaXNjb3Zlcnk6WlMsc3RvcEJlYWNvbkRpc2NvdmVyeTpYUyxtYWtlUGhvbmVDYWxsOlFTLGFkZFBob25lQ29udGFjdDpuQyxnZXRDbGlwYm9hcmREYXRhOnJDLHNldENsaXBib2FyZERhdGE6aUMsb25OZXR3b3JrU3RhdHVzQ2hhbmdlOm9DLG9mZk5ldHdvcmtTdGF0dXNDaGFuZ2U6YUMsZ2V0TmV0d29ya1R5cGU6cHAsY2hlY2tJc1N1cHBvcnRTb3RlckF1dGhlbnRpY2F0aW9uOnNDLGNoZWNrSXNTb3RlckVucm9sbGVkSW5EZXZpY2U6bEMsc3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOmNDLHNjYW5Db2RlOnVDLG9uVGhlbWVDaGFuZ2U6ZkMsZ2V0U2NyZWVuQnJpZ2h0bmVzczpkQyxzZXRTY3JlZW5CcmlnaHRuZXNzOmhDLHNldEtlZXBTY3JlZW5PbjpwQyxnZXRXaW5kb3dJbmZvOnJwLGdldFN5c3RlbVNldHRpbmc6Z0MsZ2V0QXBwQXV0aG9yaXplU2V0dGluZzpicCxvcGVuQXBwQXV0aG9yaXplU2V0dGluZzp2QyxnZXRJbWFnZUluZm86bUMsZ2V0VmlkZW9JbmZvOl9DLHByZXZpZXdJbWFnZTpiQyxjbG9zZVByZXZpZXdJbWFnZTp5QyxnZXRSZWNvcmRlck1hbmFnZXI6U0Msc2F2ZVZpZGVvVG9QaG90b3NBbGJ1bTpDQyxzYXZlSW1hZ2VUb1Bob3Rvc0FsYnVtOkFDLGNvbXByZXNzSW1hZ2U6T0MsY29tcHJlc3NWaWRlbzpUQyxjaG9vc2VJbWFnZTpQQyxjaG9vc2VWaWRlbzpOQyxzaG93S2V5Ym9hcmQ6a0MsaGlkZUtleWJvYXJkOlJDLG9uS2V5Ym9hcmRIZWlnaHRDaGFuZ2U6eEMsb2ZmS2V5Ym9hcmRIZWlnaHRDaGFuZ2U6QkMsZG93bmxvYWRGaWxlOkRDLHJlcXVlc3Q6JEMsY29uZmlnTVRMUzpVQyxjb25uZWN0U29ja2V0OldDLHNlbmRTb2NrZXRNZXNzYWdlOkdDLGNsb3NlU29ja2V0OllDLG9uU29ja2V0T3BlbjpxQyxvblNvY2tldEVycm9yOktDLG9uU29ja2V0TWVzc2FnZTpKQyxvblNvY2tldENsb3NlOlpDLHVwbG9hZEZpbGU6UUMsY3JlYXRlSW5uZXJBdWRpb0NvbnRleHQ6bEEsZ2V0QmFja2dyb3VuZEF1ZGlvTWFuYWdlcjpiQSxjcmVhdGVMaXZlUHVzaGVyQ29udGV4dDp3QSxnZXRMb2NhdGlvbjpBQSxjaG9vc2VMb2NhdGlvbjpPQSxvcGVuTG9jYXRpb246VEEsc2hvd01vZGFsOklBLHNob3dBY3Rpb25TaGVldDpQQSxzaG93TG9hZGluZzpOQSxzaG93VG9hc3Q6a0EsaGlkZVRvYXN0OlJBLGhpZGVMb2FkaW5nOnhBLHN0YXJ0UHVsbERvd25SZWZyZXNoOkJBLHN0b3BQdWxsRG93blJlZnJlc2g6TUEsbG9hZEZvbnRGYWNlOkRBLHBhZ2VTY3JvbGxUbzpGQSxzZXROYXZpZ2F0aW9uQmFyVGl0bGU6TEEsc2hvd05hdmlnYXRpb25CYXJMb2FkaW5nOlZBLGhpZGVOYXZpZ2F0aW9uQmFyTG9hZGluZzokQSxzZXROYXZpZ2F0aW9uQmFyQ29sb3I6SEEsc2V0VGFiQmFyQmFkZ2U6akEsc2V0VGFiQmFySXRlbTp6QSxzZXRUYWJCYXJTdHlsZTpXQSxoaWRlVGFiQmFyOkdBLHNob3dUYWJCYXI6WUEsc2hvd1RhYkJhclJlZERvdDpxQSxyZW1vdmVUYWJCYXJCYWRnZTpLQSxoaWRlVGFiQmFyUmVkRG90OkpBLGdldFN1Yk5WdWVCeUlkOm5PLHJlc3RvcmVHbG9iYWw6aU8scmVxdWlyZUdsb2JhbDpvTyxnZXRQcm92aWRlcjphTyxsb2dpbjokcCxnZXRVc2VySW5mbzpzTyxnZXRVc2VyUHJvZmlsZTpsTyxwcmVMb2dpbjpIcCxjbG9zZUF1dGhWaWV3OnpwLGdldENoZWNrQm94U3RhdGU6V3AsZ2V0VW5pdmVyaWZ5TWFuYWdlcjpmTyxjcmVhdGVQdXNoTWVzc2FnZTpkTyxyZWdpc3RlclJ1bnRpbWU6aE8sc2hhcmU6dk8sc2hhcmVXaXRoU3lzdGVtOm1PLHJlcXVlc3RQYXltZW50Ol9PLHJlcXVpcmVOYXRpdmVQbHVnaW46dmEsc2VuZE5hdGl2ZUV2ZW50OmZwLGNyZWF0ZVJld2FyZGVkVmlkZW9BZDpUTyxjcmVhdGVGdWxsU2NyZWVuVmlkZW9BZDpQTyxjcmVhdGVJbnRlcnN0aXRpYWxBZDprTyxjcmVhdGVJbnRlcmFjdGl2ZUFkOkJPLG5hdmlnYXRlQmFjazpmVCxyZWRpcmVjdFRvOiRULHVuUHJlbG9hZFBhZ2U6WVQscHJlbG9hZFBhZ2U6cVR9O2xldCBKVD1RLmV4dGVuZChwZSx7cHVibGlzaEhhbmRsZXI6WlR9KTtmdW5jdGlvbiBaVChlLHQsbil7dD1KU09OLnN0cmluZ2lmeSh0KSxRLmlzQXJyYXkobil8fChuPVtuXSk7bGV0IHI9YHR5cGVvZiBVbmlWaWV3SlNCcmlkZ2UgIT09ICd1bmRlZmluZWQnICYmIFVuaVZpZXdKU0JyaWRnZS5zdWJzY3JpYmVIYW5kbGVyKCIke2V9Iiwke3R9LF9fUEFHRV9JRF9fKWA7bi5mb3JFYWNoKHM9PntsZXQgZD1TdHJpbmcocyksZz1jLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQoZCk7ZyYmZy5ldmFsSlMoci5yZXBsYWNlKCJfX1BBR0VfSURfXyIsZCkpfSl9ZnVuY3Rpb24gWFQoKXtsZXR7dGFiQmFyOmV9PUk7aWYoIShlJiZlLmxpc3QmJmUubGlzdC5sZW5ndGgpKXJldHVybjtsZXR7ZW50cnlQYWdlUGF0aDpufT1JO2Uuc2VsZWN0ZWRJbmRleD0wO2xldCByPWUubGlzdC5maW5kSW5kZXgocz0+cy5wYWdlUGF0aD09PW4pO1RpLmluaXQoZSwocyxkKT0+e3NlLnN3aXRjaFRhYih7dXJsOmFlLmFkZExlYWRpbmdTbGFzaChzLnBhZ2VQYXRoKSxvcGVuVHlwZToic3dpdGNoVGFiIixmcm9tOiJ0YWJCYXIiLHN1Y2Nlc3MoKXtIbihhZS5PTl9UQUJfSVRFTV9UQVAse2luZGV4OmQsdGV4dDpzLnRleHQscGFnZVBhdGg6cy5wYWdlUGF0aH0pfX0pfSksciE9PS0xJiYoZS5zZWxlY3RlZEluZGV4PXIsciE9PTAmJlRpLnN3aXRjaFRhYihuKSl9ZnVuY3Rpb24gUVQoKXtsZXQgZT1jLmdsb2JhbEV2ZW50LHQ9di5yZXF1aXJlTW9kdWxlKCJnbG9iYWxFdmVudCIpLG49YnQuZW1pdDt2LmNvbmZpZy5wcmVsb2FkP2Mua2V5LmFkZEV2ZW50TGlzdGVuZXIoTW8sWmEpOmUuYWRkRXZlbnRMaXN0ZW5lcigic3BsYXNoY2xvc2VkIiwoKT0+e2Mua2V5LmFkZEV2ZW50TGlzdGVuZXIoTW8sWmEpfSksZS5hZGRFdmVudExpc3RlbmVyKCJwYXVzZSIsKCk9PntuKGFlLk9OX0FQUF9FTlRFUl9CQUNLR1JPVU5EKX0pLGUuYWRkRXZlbnRMaXN0ZW5lcigicmVzdW1lIiwoKT0+e2xldCBzPUJ0KCk7cyYmcy51c2VyQWN0aW9uJiZVZShzKSxuKGFlLk9OX0FQUF9FTlRFUl9GT1JFR1JPVU5ELERzKCkpfSksdC5hZGRFdmVudExpc3RlbmVyKCJ1aXN0eWxlY2hhbmdlIixmdW5jdGlvbihzKXtsZXQgZD17dGhlbWU6cy51aXN0eWxlfTtuKGFlLk9OX1RIRU1FX0NIQU5HRSxkKX0pO2xldCByPTA7ZS5hZGRFdmVudExpc3RlbmVyKCJLZXlib2FyZEhlaWdodENoYW5nZSIsZnVuY3Rpb24ocyl7ciE9PXMuaGVpZ2h0JiYocj1zLmhlaWdodCxuKGFlLk9OX0tFWUJPQVJEX0hFSUdIVF9DSEFOR0Use2hlaWdodDpyfSkpfSksdC5hZGRFdmVudExpc3RlbmVyKExPLGZ1bmN0aW9uKHMpe3MmJnMuZXZlbnQmJkVPKHMuZXZlbnQscy5kYXRhKX0pLGUuYWRkRXZlbnRMaXN0ZW5lcigicGx1c01lc3NhZ2UiLEFnKSxlLmFkZEV2ZW50TGlzdGVuZXIoIldlYnZpZXdQb3N0TWVzc2FnZSIsQWcpfWZ1bmN0aW9uIEFnKHtkYXRhOmV9KXtlJiZlLnR5cGUmJmJ0LnN1YnNjcmliZUhhbmRsZXIoInBsdXNNZXNzYWdlLiIrZS50eXBlLGUuYXJncyl9ZnVuY3Rpb24gT2coZSx0LG49ITEpe2J0LnN1YnNjcmliZSgicGx1c01lc3NhZ2UuIitlLHQsbil9ZnVuY3Rpb24gZUkoZSl7V18oZS4kKTtsZXR7ZW50cnlQYWdlUGF0aDp0LGVudHJ5UGFnZVF1ZXJ5Om4scmVmZXJyZXJJbmZvOnJ9PUkscz1JdCh7cGF0aDp0LHF1ZXJ5Om4scmVmZXJyZXJJbmZvOnJ9KTtIbihlLGFlLk9OX0xBVU5DSCxzKSxIbihlLGFlLk9OX1NIT1cscyk7bGV0IGQ9di5yZXF1aXJlTW9kdWxlKCJwbHVzIikuZ2V0QXBwU3RhdGU7KGQmJk51bWJlcihkKCkpKT09PTImJkhuKGUsYWUuT05fSElERSxzKX1mdW5jdGlvbiBUZyhlKXtyZXR1cm4gZT1lLnJlcGxhY2UoL1wvJC8sIiIpLGUuaW5kZXhPZigiXyIpPT09MD9jLmlvLmNvbnZlcnRMb2NhbEZpbGVTeXN0ZW1VUkwoZSk6ZX1mdW5jdGlvbiB0SSgpe2xldCBlPVRnKGhzKSx0PVRnKFNpKSxuPXQuc3BsaXQoIi8iKTtuLnBvcCgpO2xldCByPW4uam9pbigiLyIpO2MuaW8ucmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSTChjLmlvLmNvbnZlcnRBYnNvbHV0ZUZpbGVTeXN0ZW0ocikscz0+e3MuY3JlYXRlUmVhZGVyKCkucmVhZEVudHJpZXMoZnVuY3Rpb24oZyl7bGV0IHk9Zzt5JiZ5Lmxlbmd0aCYmeS5mb3JFYWNoKGZ1bmN0aW9uKHope3ouaXNEaXJlY3RvcnkmJnouZnVsbFBhdGguaW5kZXhPZihlKT09PTAmJnouZnVsbFBhdGguaW5kZXhPZih0KSE9PTAmJnoucmVtb3ZlUmVjdXJzaXZlbHkoKX0pfSl9KX1sZXQgSWc9MCxSYz0wLFl1PW51bGwsWWw9bnVsbDtmdW5jdGlvbiBuSShlLHQpe2lmKFl1PW51bGwsWWwmJihDKFlsKSxZbD1udWxsKSxlLnR5cGU9PT0ib25Gb2N1cyIpaWYoUmM+MCllLmRldGFpbC5oZWlnaHQ9UmM7ZWxzZXtZbD1CKGZ1bmN0aW9uKCl7ZS5kZXRhaWwuaGVpZ2h0PVJjLHQoZSl9LElnKSxZdT1mdW5jdGlvbigpe1lsJiYoQyhZbCksWWw9bnVsbCksZS5kZXRhaWwuaGVpZ2h0PVJjLHQoZSl9O3JldHVybn10KGUpfWZ1bmN0aW9uIHJJKCl7SWc9Yy5vcy5uYW1lLnRvTG93ZXJDYXNlKCk9PT0iYW5kcm9pZCI/MzAwOjcwMCxidC5vbihhZS5PTl9LRVlCT0FSRF9IRUlHSFRfQ0hBTkdFLHQ9PntpZihSYz10LmhlaWdodCxSYz4wKXtsZXQgbj1ZdTtZdT1udWxsLG4mJm4oKX19KX1mdW5jdGlvbiBpSShlLHQsbil7bGV0IHI9dC50eXBlO3I9PT0ib25Gb2N1cyJ8fHI9PT0ib25CbHVyIj9uSSh0LHM9PntuLmZpcmVFdmVudChlLHMpfSk6bi5maXJlRXZlbnQoZSx0KX1mdW5jdGlvbiBvSShlLHQpe2xldCBuPXFvKHBhcnNlSW50KHQpKTtpZighbilyZXR1cm47bGV0IHI9bi5fX3BhZ2VfY29udGFpbmVyX187ZS5mb3JFYWNoKHM9Pntzd2l0Y2goc1swXSl7Y2FzZSBhZS5BQ1RJT05fVFlQRV9FVkVOVDppSShzWzFdLHNbMl0scik7YnJlYWt9fSl9bGV0IFBnPXt9O2Z1bmN0aW9uIGFJKGUsdCxuKXtsZXR7YWRwaWQ6cix3aWR0aDpzfT1lLGQ9cisiLSIrcyxnPVBnW2RdO2lmKGcmJmcubGVuZ3RoPjApe3QoZy5zcGxpY2UoMCwxKVswXSk7cmV0dXJufWMuYWQuZ2V0QWRzKGUseT0+e2xldCB6PXkuYWRzO3Qoei5zcGxpY2UoMCwxKVswXSksUGdbZF09Zz9nLmNvbmNhdCh6KTp6fSx5PT57bih7ZXJyQ29kZTp5LmNvZGUsZXJyTXNnOnkubWVzc2FnZX0pfSl9ZnVuY3Rpb24gc0koKXtlZSgiZ2V0QWREYXRhIiwoZSx0KT0+e2FJKGUsbj0+e3Qoe2NvZGU6MCxkYXRhOm59KX0sbj0+e3Qoe2NvZGU6MSxtZXNzYWdlOm59KX0pfSl9bGV0IGxJPVsic3dpdGNoVGFiIiwicmVMYXVuY2giLCJyZWRpcmVjdFRvIiwibmF2aWdhdGVUbyIsIm5hdmlnYXRlQmFjayJdO2Z1bmN0aW9uIGNJKCl7bEkuZm9yRWFjaChlPT57ZWUoZSx0PT57c2VbZV0oUS5leHRlbmQodCx7ZmFpbChuKXtjb25zb2xlLmVycm9yKG4uZXJyTXNnKX19KSl9KX0pfWxldCBOZz0hMTtmdW5jdGlvbiB1SShlLHQpe2xldCBuPXQ9PT0iMSI7aWYoIShuJiZOZykpe2lmKG4/KE5nPSEwLGFnKGMud2Vidmlldy5nZXRMYXVuY2hXZWJ2aWV3KCkpKTpsb3x8YWcoYy53ZWJ2aWV3LmdldFdlYnZpZXdCeUlkKHQpKSwhbG8ubG9hZGVkKXtpZihsby5pZCE9PXQpcmV0dXJuIGNvbnNvbGUuZXJyb3IoYHdlYnZpZXdSZWFkeVske2xvLmlkfV1bJHt0fV0gbm90IG1hdGNoYCk7bG8ubG9hZGVkPSEwfWJ0LmVtaXQoa2MrIi4iK3QpLG4mJmZJKCl9fWZ1bmN0aW9uIGZJKCl7bGV0e2F1dG9jbG9zZTplLGFsd2F5c1Nob3dCZWZvcmVSZW5kZXI6dH09SS5zcGxhc2hzY3JlZW47ZSYmIXQmJmMubmF2aWdhdG9yLmNsb3NlU3BsYXNoc2NyZWVuKCk7bGV0IG49YWUuYWRkTGVhZGluZ1NsYXNoKEkuZW50cnlQYWdlUGF0aCkscj1mbyhuKTtpZighci5tZXRhLmlzTlZ1ZSl7bGV0IHM9e3VybDpuKyhJLmVudHJ5UGFnZVF1ZXJ5fHwiIiksb3BlblR5cGU6ImFwcExhdW5jaCJ9LGQ9e3Jlc29sdmUoKXt9LHJlamVjdCgpe319O3JldHVybiByLm1ldGEuaXNUYWJCYXI/Q2cocyxkKTpTZyhzLGQpfX1mdW5jdGlvbiBkSShlLHQpe2xldCBuPXFvKHBhcnNlSW50KHQpKTtuJiYobi5fX3VuaWFwcF93ZWJ2aWV3PSEwKX1mdW5jdGlvbiBoSShlLHQpe2xldCBuPXFvKHBhcnNlSW50KHQpKTtuJiZkZWxldGUgbi5fX3VuaWFwcF93ZWJ2aWV3fWxldCBwST0oe25hbWU6ZSxhcmc6dH0sbik9PntlPT09InBvc3RNZXNzYWdlIj9nSShuWzBdLHQpOnNlW2VdKFEuZXh0ZW5kKHQse2ZhaWwocil7Y29uc29sZS5lcnJvcihyLmVyck1zZyl9fSkpfTtmdW5jdGlvbiBnSShlLHQpe2xldCBuPXZUKCJ3ZWItdmlldyIscGFyc2VJbnQoZSkpO24mJm4uZGlzcGF0Y2hFdmVudChhZS5jcmVhdGVVbmlFdmVudCh7dHlwZToib25NZXNzYWdlIix0YXJnZXQ6T2JqZWN0LmNyZWF0ZShudWxsKSxjdXJyZW50VGFyZ2V0Ok9iamVjdC5jcmVhdGUobnVsbCksZGV0YWlsOntkYXRhOlt0XX19KSl9ZnVuY3Rpb24gdkkoe25vZGVJZDplLG93bmVySWQ6dCxtZXRob2Q6bixhcmdzOnJ9LHMpe2xldCBkPWdnKGUscGFyc2VJbnQocykpO2lmKCFkKXJldHVybjtsZXQgZz1tSSh0LGQuX192dWVQYXJlbnRDb21wb25lbnQpOyFnfHwhZ1tuXXx8Z1tuXShyKX1mdW5jdGlvbiBtSShlLHQpe2lmKCF0KXJldHVybiBudWxsO2lmKHQudWlkPT09ZSlyZXR1cm4gdC5wcm94eTtsZXQgbj10LnBhcmVudDtmb3IoO247KXtpZihuLnVpZD09PWUpcmV0dXJuIG4ucHJveHk7bj1uLnBhcmVudH1yZXR1cm4gdC5wcm94eX1mdW5jdGlvbiBfSSgpe2xldHtzdWJzY3JpYmU6ZSxzdWJzY3JpYmVIYW5kbGVyOnQscHVibGlzaEhhbmRsZXI6bn09YnQ7aWYoT2coInN1YnNjcmliZUhhbmRsZXIiLCh7dHlwZTpyLGRhdGE6cyxwYWdlSWQ6ZH0pPT57dChyLHMsZCl9KSxPZyhhZS5XRUJfSU5WT0tFX0FQUFNFUlZJQ0UsKHtkYXRhOnIsd2Vidmlld0lkczpzfSk9PntwSShyLHMpfSksSS5yZW5kZXJlciE9PSJuYXRpdmUiKXtlKGtjLHVJKSxlKE1wLG9JKSxXKCksc0koKSxjSSgpLGUoUUEsZEkpLGUoZU8saEkpLGUoYWUuT05fV1hTX0lOVk9LRV9DQUxMX01FVEhPRCx2SSk7bGV0IHI9Zm8oYWUuYWRkTGVhZGluZ1NsYXNoKEkuZW50cnlQYWdlUGF0aCkpO3ImJiFyLm1ldGEuaXNOVnVlJiZuKGtjLHt9LDEpfX1sZXQgeGMsSmY9e2dsb2JhbERhdGE6e319O2Z1bmN0aW9uIGJJKHthbGxvd0RlZmF1bHQ6ZT0hMX09e30pe2lmKHhjKXJldHVybiB4YztpZihlKXJldHVybiBKZjtjb25zb2xlLmVycm9yKCJbd2Fybl06IGdldEFwcCgpIGZhaWxlZC4gTGVhcm4gbW9yZTogaHR0cHM6Ly91bmlhcHAuZGNsb3VkLmlvL2NvbGxvY2F0aW9uL2ZyYW1lL3dpbmRvdz9pZD1nZXRhcHAuIil9ZnVuY3Rpb24geUkoZSl7aWYoc2UuVnVleCYmZS4kc3RvcmUpe2xldHt1c2VTdG9yZTp0fT1zZS5WdWV4O3NlLlZ1ZXgudXNlU3RvcmU9bj0+bj90KG4pOmUuJHN0b3JlfUJzKGUpLHhjPWUsZ3QoeGMpLFEuZXh0ZW5kKHhjLEpmKSxwbih4YyxKZi5nbG9iYWxEYXRhKSxKdCgpLEVnKCksWFQoKSxRVCgpLHJJKCksX0koKSxlSShlKSxCKHRJLDFlNCksSS5yZWFkeT0hMH12YXIgRUk9e3VuaTpLVCxnZXRBcHA6YkksZ2V0Q3VycmVudFBhZ2VzOk1zLF9fZGVmaW5lUGFnZTpJVCxfX3JlZ2lzdGVyQXBwOnlJLF9fcmVnaXN0ZXJQYWdlOnB1LFVuaVNlcnZpY2VKU0JyaWRnZTpKVH07cmV0dXJuIEVJfShBdCx0bixUKTtBPUEuZGVmYXVsdHx8QTtsZXQgc2U9QS51bmksRW49QS5nZXRBcHAsR249QS5nZXRDdXJyZW50UGFnZXMsYnQ9QS5VbmlTZXJ2aWNlSlNCcmlkZ2U7cmV0dXJuIEF9dmFyIGR2PXJOKGFOKTt2YXIgdmQsbWQsX2QsSnMsYmQseWQsRWQ7ZnVuY3Rpb24gaHYoKXtyZXR1cm4gSnM/e19fZGVmaW5lUGFnZTp2ZCxfX3JlZ2lzdGVyQXBwOm1kLF9fcmVnaXN0ZXJQYWdlOl9kLHVuaTpKcyx3eDpKcyxnZXRBcHA6YmQsZ2V0Q3VycmVudFBhZ2VzOnlkLFVuaVNlcnZpY2VKU0JyaWRnZTpFZH06e319ZnVuY3Rpb24gcHYodil7bGV0e3dlZXg6YyxwbHVzOmIsVnVlU2hhcmVkOlR9PXY7cmV0dXJuIEpzfHwoe19fZGVmaW5lUGFnZTp2ZCxfX3JlZ2lzdGVyQXBwOm1kLF9fcmVnaXN0ZXJQYWdlOl9kLHVuaTpKcyxnZXRBcHA6YmQsZ2V0Q3VycmVudFBhZ2VzOnlkLFVuaVNlcnZpY2VKU0JyaWRnZTpFZH09ZnYoYyxiLHYpLEpzLlZ1ZVNoYXJlZD1ULEJnKEpzKSkse19fZGVmaW5lUGFnZTp2ZCxfX3JlZ2lzdGVyQXBwOm1kLF9fcmVnaXN0ZXJQYWdlOl9kLHBsdXM6Yix1bmk6SnMsd3g6SnMsZ2V0QXBwOmJkLGdldEN1cnJlbnRQYWdlczp5ZCxVbmlTZXJ2aWNlSlNCcmlkZ2U6RWR9fWZ1bmN0aW9uIGd2KHYsYyl7bGV0e19fdW5pQ29uZmlnOmJ9PWM7aWYoIWIpcmV0dXJuO2xldCBUPWMud2VleDtULmRvY3VtZW50Ll9fJGF1dG9tYXRvcl9fPSEhYi5hdXRvbWF0b3I7bGV0IEI9Yi5yZW5kZXJlciE9PSJuYXRpdmUiJiZULmNvbmZpZy5idW5kbGVVcmwuaW5kZXhPZigiYXBwLXNlcnZpY2UuanMiKSE9PS0xO2lmKGRpKGMsaHYoKSksQj9kdihjKTooTGcodixjKSxpdihjLlZ1ZS5wYXJzZUNsYXNzU3R5bGVzKSksZGkoYyxwdihjKSksVC5jb25maWcucGx1c193ZWJfaWQ9PT0iMSIpe2xldCBJPVQucmVxdWlyZU1vZHVsZSgicGx1cyIpO0kuc2V0RGVmYXVsdEZvbnRTaXplJiZJLnNldERlZmF1bHRGb250U2l6ZShNYXRoLnJvdW5kKGMucGx1cy5zY3JlZW4ucmVzb2x1dGlvbldpZHRoLzIwKSl9bGV0e3NjYWxlOkMsZGV2aWNlV2lkdGg6ayxwbGF0Zm9ybTp1fT1nbG9iYWwuV1hFbnZpcm9ubWVudDtpZih1LnRvTG93ZXJDYXNlKCk9PT0iaW9zIil7bGV0IEk9TWF0aC5jZWlsKGsvQyk7VC5yZXF1aXJlTW9kdWxlKCJtZXRhIikuc2V0Vmlld3BvcnQoe3dpZHRoOkkscm91bmRPZmZEZXZpYXRpb246ITF9KX19dmFyIFFsPWNsYXNzIGV4dGVuZHMgWGx7Y29uc3RydWN0b3IoYyl7c3VwZXIoKTt0aGlzLm5vZGVUeXBlPTg7dGhpcy50eXBlPSJjb21tZW50Ijt0aGlzLnZhbHVlPSIiO3RoaXMudmFsdWU9Y310b1N0cmluZygpe3JldHVybiI8IS0tICIrdGhpcy52YWx1ZSsiIC0tPiJ9fTtmdW5jdGlvbiByYSh2LGM9W10pe3JldHVybnttb2R1bGU6ImRvbSIsbWV0aG9kOnYsYXJnczpjfX12YXIgVmM9Y2xhc3N7Y29uc3RydWN0b3IoYyxiKXt0aGlzLmlkPWMsdGhpcy5iYXRjaGVkPSExLHRoaXMudXBkYXRlcz1bXSwkbihiKT9PYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaGFuZGxlciIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KTpjb25zb2xlLmVycm9yKCJbSlMgUnVudGltZV0gaW52YWxpZCBwYXJhbWV0ZXIsIGhhbmRsZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIil9Y3JlYXRlRmluaXNoKGMpe3JldHVybiB0aGlzLmhhbmRsZXIoW3JhKCJjcmVhdGVGaW5pc2giKV0sYyl9dXBkYXRlRmluaXNoKGMpe3JldHVybiB0aGlzLmhhbmRsZXIoW3JhKCJ1cGRhdGVGaW5pc2giKV0sYyl9cmVmcmVzaEZpbmlzaChjKXtyZXR1cm4gdGhpcy5oYW5kbGVyKFtyYSgicmVmcmVzaEZpbmlzaCIpXSxjKX1jcmVhdGVCb2R5KGMpe2xldCBiPWMudG9KU09OKCksVD1iLmNoaWxkcmVuO2RlbGV0ZSBiLmNoaWxkcmVuO2xldCBCPVtyYSgiY3JlYXRlQm9keSIsW2JdKV07cmV0dXJuIFQmJkIucHVzaC5hcHBseShCLFQubWFwKEM9PnJhKCJhZGRFbGVtZW50IixbYi5yZWYsQywtMV0pKSksdGhpcy5hZGRBY3Rpb25zKEIpfWFkZEVsZW1lbnQoYyxiLFQpe3JldHVybiBUPj0wfHwoVD0tMSksdGhpcy5hZGRBY3Rpb25zKHJhKCJhZGRFbGVtZW50IixbYixjLnRvSlNPTigpLFRdKSl9cmVtb3ZlRWxlbWVudChjKXtpZihIaShjKSl7bGV0IGI9Yy5tYXAoVD0+cmEoInJlbW92ZUVsZW1lbnQiLFtUXSkpO3JldHVybiB0aGlzLmFkZEFjdGlvbnMoYil9cmV0dXJuIHRoaXMuYWRkQWN0aW9ucyhyYSgicmVtb3ZlRWxlbWVudCIsW2NdKSl9bW92ZUVsZW1lbnQoYyxiLFQpe3JldHVybiB0aGlzLmFkZEFjdGlvbnMocmEoIm1vdmVFbGVtZW50IixbYyxiLFRdKSl9c2V0QXR0cihjLGIsVCl7cmV0dXJuIHRoaXMuYWRkQWN0aW9ucyhyYSgidXBkYXRlQXR0cnMiLFtjLHtbYl06VH1dKSl9c2V0U3R5bGUoYyxiLFQpe3JldHVybiB0aGlzLmFkZEFjdGlvbnMocmEoInVwZGF0ZVN0eWxlIixbYyx7W2JdOlR9XSkpfXNldFN0eWxlcyhjLGIpe3JldHVybiB0aGlzLmFkZEFjdGlvbnMocmEoInVwZGF0ZVN0eWxlIixbYyxiXSkpfWFkZEV2ZW50KGMsYil7cmV0dXJuIHRoaXMuYWRkQWN0aW9ucyhyYSgiYWRkRXZlbnQiLFtjLGJdKSl9cmVtb3ZlRXZlbnQoYyxiKXtyZXR1cm4gdGhpcy5hZGRBY3Rpb25zKHJhKCJyZW1vdmVFdmVudCIsW2MsYl0pKX1oYW5kbGVyKGMsYil7cmV0dXJuIGImJmIoKX1hZGRBY3Rpb25zKGMpe2xldCBiPXRoaXMudXBkYXRlcyxUPXRoaXMuaGFuZGxlcjtpZihIaShjKXx8KGM9W2NdKSx0aGlzLmJhdGNoZWQpYi5wdXNoLmFwcGx5KGIsYyk7ZWxzZSByZXR1cm4gVChjKX19O3ZhciB3ZD17Y3JlYXRlQm9keToiY2FsbENyZWF0ZUJvZHkiLGFkZEVsZW1lbnQ6ImNhbGxBZGRFbGVtZW50IixyZW1vdmVFbGVtZW50OiJjYWxsUmVtb3ZlRWxlbWVudCIsbW92ZUVsZW1lbnQ6ImNhbGxNb3ZlRWxlbWVudCIsdXBkYXRlQXR0cnM6ImNhbGxVcGRhdGVBdHRycyIsdXBkYXRlU3R5bGU6ImNhbGxVcGRhdGVTdHlsZSIsYWRkRXZlbnQ6ImNhbGxBZGRFdmVudCIscmVtb3ZlRXZlbnQ6ImNhbGxSZW1vdmVFdmVudCJ9O2Z1bmN0aW9uIHZ2KHYsYyl7bGV0IGI9Y3x8Z2xvYmFsLmNhbGxOYXRpdmU7cmV0dXJuICRuKGIpfHxjb25zb2xlLmVycm9yKCJbSlMgUnVudGltZV0gbm8gZGVmYXVsdCBoYW5kbGVyIiksZnVuY3Rpb24oQil7SGkoQil8fChCPVtCXSk7Zm9yKGxldCBDPTA7QzxCLmxlbmd0aDtDKyspe2xldCBrPWxOKHYsQltDXSxiKTtpZihrPT09LTEpcmV0dXJuIGt9fX1mdW5jdGlvbiBzTih2LGMpe3JldHVybiB2PT09ImRvbSImJndkW2NdJiYkbihnbG9iYWxbd2RbY11dKX1mdW5jdGlvbiBsTih2LGMsYil7bGV0e21vZHVsZTpULG1ldGhvZDpCLGFyZ3M6Q309YztyZXR1cm4gc04oVCxCKT9nbG9iYWxbd2RbQl1dKHYsLi4uQywiLTEiKTpiKHYsW2NdLCItMSIpfXZhciBmZj1jbGFzcyBleHRlbmRzIHdve2NvbnN0cnVjdG9yKGMpe3N1cGVyKCk7dGhpcy52YWx1ZT1jLHRoaXMubm9kZVR5cGU9Myx0aGlzLnR5cGU9InRleHQiLHRoaXMudmFsdWU9IiJ9dG9TdHJpbmcoKXtyZXR1cm4iIit0aGlzLnZhbHVlfX07dmFyIG12PXtzbGlkZXI6e2NoYW5nZTpmdW5jdGlvbih2KXtyZXR1cm57aW5kZXg6di5pbmRleCxzb3VyY2U6di5zb3VyY2V9fSxzY3JvbGw6ZnVuY3Rpb24odil7cmV0dXJue29mZnNldFhSYXRpbzp2Lm9mZnNldFhSYXRpbyxvZmZzZXRZUmF0aW86di5vZmZzZXRZUmF0aW8sZHJhZzp2LmRyYWd9fX0sInNjcm9sbC12aWV3Ijp7c2Nyb2xsZW5kOmZ1bmN0aW9uKHYpe3JldHVybntjb250ZW50T2Zmc2V0OnYuY29udGVudE9mZnNldH19fX07ZnVuY3Rpb24gX3Yodil7bGV0e2F0dHI6YyxvZmZzZXRMZWZ0OmIsb2Zmc2V0VG9wOlR9PXYsQj17fTtyZXR1cm4gYyYmT2JqZWN0LmtleXMoYykuZm9yRWFjaChDPT57Qy5pbmRleE9mKCJkYXRhLSIpPT09MCYmKEJbQy5yZXBsYWNlKCJkYXRhLSIsIiIpXT1jW0NdKX0pLHtpZDpjJiZjLmlkfHwiIixkYXRhc2V0OkIsb2Zmc2V0TGVmdDpifHwwLG9mZnNldFRvcDpUfHwwfX12YXIgY049WyJhIiwiZGl2IiwibGlzdCIsImNlbGwiLCJsb2FkaW5nIiwicmVmcmVzaCIsInJlY3ljbGUtbGlzdCIsInNjcm9sbGVyIiwiaW5kaWNhdG9yIiwid2F0ZXJmYWxsIiwid2ViIiwicmljaHRleHQiXSx1Tj1bInZpZXdhcHBlYXIiLCJ2aWV3ZGlzYXBwZWFyIl0sZk49e21hcmtlcnRhcDpbIm1hcmtlcklkIl0sY29udHJvbHRhcDpbImNvbnRyb2xJZCJdLHJlZ2lvbmNoYW5nZTpbImNhdXNlZEJ5Il0sZW5kOlsiY2F1c2VkQnkiXSxhcHBlYXI6WyJkaXJlY3Rpb24iXSxkaXNhcHBlYXI6WyJkaXJlY3Rpb24iXX07ZnVuY3Rpb24gYnYodixjKXtsZXQgYj12LnR5cGU7aWYodU4uaW5kZXhPZihiKSE9PS0xKXJldHVybiB2O2xldCBUPXYuY3VycmVudFRhcmdldCxCPVQudHlwZS5yZXBsYWNlKCJ1LSIsIiIpO2lmKGNOLmluZGV4T2YoQikhPT0tMSlyZXR1cm4gdjtsZXR7dGltZXN0YW1wOkMsdGFyZ2V0Omt9PXY7aWYoIWMpe2xldCBHZT1tdltCXTtHZT8kbihHZVtiXSk/Yz1HZVtiXSh2KTpjPXYuZGV0YWlsfHx7fTpjPXYuZGV0YWlsfHx7fX1sZXQgdT17dHlwZTpiLHRpbWVTdGFtcDpDLHRhcmdldDpfdihrKSxjdXJyZW50VGFyZ2V0Ol92KFQpLGRldGFpbDpjLHRvdWNoZXM6Yj09PSJ0b3VjaGVuZCJ8fGI9PT0icGFuZW5kIj9bXTp2LmNoYW5nZWRUb3VjaGVzLGNoYW5nZWRUb3VjaGVzOnYuY2hhbmdlZFRvdWNoZXN9O3YuY29tcG9uZW50SWQmJih1LmNvbXBvbmVudElkPXYuY29tcG9uZW50SWQpO2xldCBJPWZOW2JdO3JldHVybiBJJiZJLmZvckVhY2goR2U9PntxbCh2LEdlKSYmKHVbR2VdPXZbR2VdKX0pLHV9ZnVuY3Rpb24gZE4odixjKXtsZXQgYj1jLmF0dHJzfHx7fTtmb3IobGV0IEIgaW4gYil2LnNldEF0dHIoQixiW0JdLCEwKTtsZXQgVD1jLnN0eWxlfHx7fTtmb3IobGV0IEIgaW4gVCl2LnNldFN0eWxlKEIsVFtCXSwhMCl9dmFyIG1hPWNsYXNze2NvbnN0cnVjdG9yKGMsYj0iIixUKXtjPWM/Yy50b1N0cmluZygpOiIiLHRoaXMuaWQ9Yyx0aGlzLlVSTD1iLEpnKGMsdGhpcyksdGhpcy5ub2RlTWFwPXt9O2xldCBCPW1hLkxpc3RlbmVyfHxWYzt0aGlzLmxpc3RlbmVyPW5ldyBCKGMsVHx8dnYoYyxtYS5oYW5kbGVyKSksdGhpcy50YXNrQ2VudGVyPW5ldyBMYyhjLFQ/KEMsayk9PlQoayk6bWEuaGFuZGxlciksdGhpcy5jcmVhdGVEb2N1bWVudEVsZW1lbnQoKX1nZXRSZWYoYyl7cmV0dXJuIHRoaXMubm9kZU1hcFtjXX1vcGVuKCl7dGhpcy5saXN0ZW5lci5iYXRjaGVkPSExfWNsb3NlKCl7dGhpcy5saXN0ZW5lci5iYXRjaGVkPSEwfWNyZWF0ZURvY3VtZW50RWxlbWVudCgpe2lmKCF0aGlzLmRvY3VtZW50RWxlbWVudCl7bGV0IGM9bmV3IHdvKCJkb2N1bWVudCIpO2MuZG9jSWQ9dGhpcy5pZCxjLm93bmVyRG9jdW1lbnQ9dGhpcyxjLnJvbGU9ImRvY3VtZW50RWxlbWVudCIsYy5yZWY9Il9kb2N1bWVudEVsZW1lbnQiLHRoaXMubm9kZU1hcC5fZG9jdW1lbnRFbGVtZW50PWMsdGhpcy5kb2N1bWVudEVsZW1lbnQ9YyxPYmplY3QuZGVmaW5lUHJvcGVydHkoYywiYXBwZW5kQ2hpbGQiLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpiPT57bmQodGhpcyxiKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYywiaW5zZXJ0QmVmb3JlIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6KGIsVCk9PntuZCh0aGlzLGIsVCl9fSksWG4oImRlYnVnIikmJmNvKGBDcmVhdGUgZG9jdW1lbnQgZWxlbWVudCAoaWQ6ICIke2MuZG9jSWR9IiwgcmVmOiAiJHtjLnJlZn0iKWApfXJldHVybiB0aGlzLmRvY3VtZW50RWxlbWVudH1jcmVhdGVCb2R5KGMsYil7aWYoIXRoaXMuYm9keSl7bGV0IFQ9bmV3IHdvKGMsYik7cmQodGhpcyxUKSxYbigiZGVidWciKSYmY28oYFtjcmVhdGVCb2R5XSgke3RoaXMuaWR9LCR7VC50eXBlfSwke1QucmVmfSkgKCR7SlNPTi5zdHJpbmdpZnkoVC50b0pTT04oITApKX0pLmApfXJldHVybiB0aGlzLmJvZHl9Y3JlYXRlRWxlbWVudChjLGIpe2xldCBUPW5ldyB3byhjLGIpO3JldHVybiBYbigiZGVidWciKSYmY28oYFtjcmVhdGVFbGVtZW50XSgke3RoaXMuaWR9LCR7VC50eXBlfSwke1QucmVmfSkgKCR7SlNPTi5zdHJpbmdpZnkoVC50b0pTT04oITApKX0pLmApLFR9Y3JlYXRlQ29tbWVudChjKXtyZXR1cm4gbmV3IFFsKGMpfWNyZWF0ZVRleHQoYyl7cmV0dXJuIG5ldyBmZihjKX1maXJlRXZlbnQoYyxiLFQsQixDKXtpZighYylyZXR1cm47VD1UfHx7fSxULnR5cGU9VC50eXBlfHxiLFQudGFyZ2V0PWMsVC5jdXJyZW50VGFyZ2V0PWMsVC50aW1lc3RhbXA9RGF0ZS5ub3coKSxCJiZkTihjLEIpO2xldCBrLHU9dGhpcy5nZXRSZWYoIl9yb290Iik7aWYodSYmdS5hdHRyKXtsZXQgST11LmF0dHIuYnViYmxlO2s9ST09PSJ0cnVlInx8ST09PSEwfXJldHVybiBUPWJ2KFQpLGMuZmlyZUV2ZW50KGIsVCxrLEMpfWRlc3Ryb3koKXtYbigiZGVidWciKSYmY28oYFtkZXN0cm95XSgke3RoaXMuaWR9LGRvY3VtZW50KSBEZXN0cm95IGRvY3VtZW50IChpZDogIiR7dGhpcy5pZH0iLCBVUkw6ICIke3RoaXMuVVJMfSIpYCksdGhpcy50YXNrQ2VudGVyLmRlc3Ryb3lDYWxsYmFjaygpLGRlbGV0ZSB0aGlzLmxpc3RlbmVyLGRlbGV0ZSB0aGlzLm5vZGVNYXAsZGVsZXRlIHRoaXMudGFza0NlbnRlcixaZyh0aGlzLmlkKX19O21hLmhhbmRsZXI9bnVsbDt2YXIgeXY9e0lucHV0RWxlbWVudERpdjoiPFdoaXRlU3BhY2U+fDxMaW5lVGVybWluYXRvcj58PFJlc2VydmVkV29yZD58PElkZW50aWZpZXI+fDxOdW1lcmljTGl0ZXJhbD58PFB1bmN0dWF0b3I+fDxTdHJpbmdMaXRlcmFsPiIsSW5wdXRFbGVtZW50UmVnRXhwOiI8V2hpdGVTcGFjZT58PExpbmVUZXJtaW5hdG9yPnw8UmVzZXJ2ZWRXb3JkPnw8SWRlbnRpZmllcj58PE51bWVyaWNMaXRlcmFsPnw8UHVuY3R1YXRvcj58PFN0cmluZ0xpdGVyYWw+IixSZXNlcnZlZFdvcmQ6IjxLZXl3b3JkPnw8TnVsbExpdGVyYWw+fDxCb29sZWFuTGl0ZXJhbD4iLFdoaXRlU3BhY2U6L1tcdFx2XGZcdTAwMjBcdTAwQTBcdTE2ODBcdTE4MEVcdTIwMDAtXHUyMDBBXHUyMDJGXHUyMDVmXHUzMDAwXHVGRUZGXS8sTGluZVRlcm1pbmF0b3I6L1tcblxyXHUyMDI4XHUyMDI5XS8sS2V5d29yZDovbmV3KD8hW18kYS16QS1aMC05XSl8dm9pZCg/IVtfJGEtekEtWjAtOV0pfGRlbGV0ZSg/IVtfJGEtekEtWjAtOV0pfGluKD8hW18kYS16QS1aMC05XSl8aW5zdGFuY2VvZig/IVtfJGEtekEtWjAtOV0pfHR5cGVvZig/IVtfJGEtekEtWjAtOV0pLyxOdWxsTGl0ZXJhbDovbnVsbCg/IVtfJGEtekEtWjAtOV0pLyxCb29sZWFuTGl0ZXJhbDovKD86dHJ1ZXxmYWxzZSkoPyFbXyRhLXpBLVowLTldKS8sSWRlbnRpZmllcjovW18kYS16QS1aXVtfJGEtekEtWjAtOV0qLyxQdW5jdHVhdG9yOi9cL3w9PnxcKlwqfD4+Pj18Pj49fDw8PXw9PT18IT09fD4+Pnw8PHwlPXxcKj18LT18XCs9fDw9fD49fD09fCE9fFxePXxcfD18XHxcfHwmJnwmPXw+PnxcK1wrfC0tfFw6fH18XCp8JnxcfHxcXnwhfH58LXxcK3xcP3wlfD18Pnw8fCx8O3xcLig/IVswLTldKXxcXXxcW3xcKXxcKHx7LyxEaXZQdW5jdHVhdG9yOi9cLz18XC8vLE51bWVyaWNMaXRlcmFsOi8oPzowW3hYXVswLTlhLWZBLUZdKnxcLlswLTldK3woPzpbMS05XStbMC05XSp8MCkoPzpcLlswLTldKnxcLik/KSg/OltlRV1bKy1dezAsMX1bMC05XSspPyg/IVtfJGEtekEtWjAtOV0pLyxTdHJpbmdMaXRlcmFsOi8iKD86W14iXG5cXFxyXHUyMDI4XHUyMDI5XXxcXCg/OlsnIlxcYmZucnR2XG5cclx1MjAyOFx1MjAyOV18XHJcbil8XFx4WzAtOWEtZkEtRl17Mn18XFx1WzAtOWEtZkEtRl17NH18XFxbXjAtOXV4JyJcXGJmbnJ0dlxuXFxcclx1MjAyOFx1MjAyOV0pKiJ8Jyg/OlteJ1xuXFxcclx1MjAyOFx1MjAyOV18XFwoPzpbJyJcXGJmbnJ0dlxuXHJcdTIwMjhcdTIwMjldfFxyXG4pfFxceFswLTlhLWZBLUZdezJ9fFxcdVswLTlhLWZBLUZdezR9fFxcW14wLTl1eCciXFxiZm5ydHZcblxcXHJcdTIwMjhcdTIwMjldKSonLyxSZWd1bGFyRXhwcmVzc2lvbkxpdGVyYWw6L1wvKD86XFsoPzpcXFtcc1xTXXxbXlxdXSkqXF18W14qXC9cXFxuXHJcdTIwMjhcdTIwMjldfFxcW15cblxyXHUyMDI4XHUyMDI5XSkoPzpcWyg/OlxcW1xzXFNdfFteXF1dKSpcXXxbXlwvXFxcblxyXHUyMDI4XHUyMDI5XXxcXFteXG5cclx1MjAyOFx1MjAyOV0pKlwvWzAtOWEtekEtWl0qL307ZnVuY3Rpb24gRXYodixjLGIpe3ZhciBUPVtjXTtmdW5jdGlvbiBCKGspe3ZhciB1PW5ldyBSZWdFeHA7cmV0dXJuIHUuY29tcGlsZShrLnJlcGxhY2UoLzwoW14+XSspPi9nLGZ1bmN0aW9uKEksR2Upe3JldHVybiB2W0dlXT8oVC5wdXNoKEdlKSx2W0dlXWluc3RhbmNlb2YgUmVnRXhwPyIoIit2W0dlXS5zb3VyY2UrIikiOiIoIitCKHZbR2VdKS5zb3VyY2UrIikiKToiIn0pLGIpLHV9dmFyIEM9Qih2W2NdKTt0aGlzLmV4ZWM9ZnVuY3Rpb24oayl7dmFyIHU9Qy5leGVjKGspO2lmKHU9PW51bGwpcmV0dXJuIG51bGw7Zm9yKHZhciBJPW5ldyBTdHJpbmcodVswXSksR2U9MDtHZTxULmxlbmd0aDtHZSsrKXVbR2VdJiYoSVtUW0dlXV09dVtHZV0pO3JldHVybiBJfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywibGFzdEluZGV4Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEMubGFzdEluZGV4fSxzZXQ6ZnVuY3Rpb24oayl7Qy5sYXN0SW5kZXg9a319KX1mdW5jdGlvbiBoTigpe3ZhciB2PW5ldyBFdih5diwiSW5wdXRFbGVtZW50RGl2IiwiZyIpLGM9bmV3IEV2KHl2LCJJbnB1dEVsZW1lbnRSZWdFeHAiLCJnIiksYjtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywic291cmNlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGJ9LHNldDpmdW5jdGlvbihUKXtiPVQsdi5sYXN0SW5kZXg9MCxjLmxhc3RJbmRleD0wfX0pLHRoaXMucmVzZXQ9ZnVuY3Rpb24oKXt2Lmxhc3RJbmRleD0wLGMubGFzdEluZGV4PTB9LHRoaXMuZ2V0TmV4dFRva2VuPWZ1bmN0aW9uKFQpe3ZhciBCPXYubGFzdEluZGV4LEM7VD9DPXY6Qz1jO3ZhciBrPUMuZXhlYyhiKTtpZihrJiZDLmxhc3RJbmRleC1CPmsubGVuZ3RoKXRocm93IG5ldyBTeW50YXhFcnJvcigiVW5leHBlY3RlZCB0b2tlbiBJTExFR0FMIik7cmV0dXJuIHYubGFzdEluZGV4PUMubGFzdEluZGV4LGMubGFzdEluZGV4PUMubGFzdEluZGV4LGt9fXZhciB3dj17SWRlbnRpZmllck5hbWU6W1siSWRlbnRpZmllciJdXSxMaXRlcmFsOltbIk51bGxMaXRlcmFsIl0sWyJCb29sZWFuTGl0ZXJhbCJdLFsiTnVtZXJpY0xpdGVyYWwiXSxbIlN0cmluZ0xpdGVyYWwiXSxbIlJlZ3VsYXJFeHByZXNzaW9uTGl0ZXJhbCJdXSxQcmltYXJ5RXhwcmVzc2lvbjpbWyJJZGVudGlmaWVyIl0sWyJMaXRlcmFsIl0sWyIoIiwiRXhwcmVzc2lvbiIsIikiXV0sQ2FsbEV4cHJlc3Npb246W1siUHJpbWFyeUV4cHJlc3Npb24iLCJBcmd1bWVudHMiXSxbIkNhbGxFeHByZXNzaW9uIiwiQXJndW1lbnRzIl1dLEFyZ3VtZW50czpbWyIoIiwiKSJdLFsiKCIsIkFyZ3VtZW50TGlzdCIsIikiXV0sQXJndW1lbnRMaXN0OltbIkNvbmRpdGlvbmFsRXhwcmVzc2lvbiJdLFsiQXJndW1lbnRMaXN0IiwiLCIsIkNvbmRpdGlvbmFsRXhwcmVzc2lvbiJdXSxMZWZ0SGFuZFNpZGVFeHByZXNzaW9uOltbIlByaW1hcnlFeHByZXNzaW9uIl0sWyJDYWxsRXhwcmVzc2lvbiJdXSxVbmFyeUV4cHJlc3Npb246W1siTGVmdEhhbmRTaWRlRXhwcmVzc2lvbiJdLFsidm9pZCIsIlVuYXJ5RXhwcmVzc2lvbiJdLFsiKyIsIlVuYXJ5RXhwcmVzc2lvbiJdLFsiLSIsIlVuYXJ5RXhwcmVzc2lvbiJdLFsifiIsIlVuYXJ5RXhwcmVzc2lvbiJdLFsiISIsIlVuYXJ5RXhwcmVzc2lvbiJdXSxFeHBvbmVudGlhdGlvbkV4cHJlc3Npb246W1siVW5hcnlFeHByZXNzaW9uIl0sWyJFeHBvbmVudGlhdGlvbkV4cHJlc3Npb24iLCIqKiIsIlVuYXJ5RXhwcmVzc2lvbiJdXSxNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb246W1siTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIiwiLyIsIkV4cG9uZW50aWF0aW9uRXhwcmVzc2lvbiJdLFsiRXhwb25lbnRpYXRpb25FeHByZXNzaW9uIl0sWyJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iLCIqIiwiRXhwb25lbnRpYXRpb25FeHByZXNzaW9uIl0sWyJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iLCIlIiwiRXhwb25lbnRpYXRpb25FeHByZXNzaW9uIl1dLEFkZGl0aXZlRXhwcmVzc2lvbjpbWyJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iXSxbIkFkZGl0aXZlRXhwcmVzc2lvbiIsIisiLCJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iXSxbIkFkZGl0aXZlRXhwcmVzc2lvbiIsIi0iLCJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iXV0sU2hpZnRFeHByZXNzaW9uOltbIkFkZGl0aXZlRXhwcmVzc2lvbiJdLFsiU2hpZnRFeHByZXNzaW9uIiwiPDwiLCJBZGRpdGl2ZUV4cHJlc3Npb24iXSxbIlNoaWZ0RXhwcmVzc2lvbiIsIj4+IiwiQWRkaXRpdmVFeHByZXNzaW9uIl0sWyJTaGlmdEV4cHJlc3Npb24iLCI+Pj4iLCJBZGRpdGl2ZUV4cHJlc3Npb24iXV0sUmVsYXRpb25hbEV4cHJlc3Npb246W1siU2hpZnRFeHByZXNzaW9uIl0sWyJSZWxhdGlvbmFsRXhwcmVzc2lvbiIsIjwiLCJTaGlmdEV4cHJlc3Npb24iXSxbIlJlbGF0aW9uYWxFeHByZXNzaW9uIiwiPiIsIlNoaWZ0RXhwcmVzc2lvbiJdLFsiUmVsYXRpb25hbEV4cHJlc3Npb24iLCI8PSIsIlNoaWZ0RXhwcmVzc2lvbiJdLFsiUmVsYXRpb25hbEV4cHJlc3Npb24iLCI+PSIsIlNoaWZ0RXhwcmVzc2lvbiJdLFsiUmVsYXRpb25hbEV4cHJlc3Npb24iLCJpbnN0YW5jZW9mIiwiU2hpZnRFeHByZXNzaW9uIl0sWyJSZWxhdGlvbmFsRXhwcmVzc2lvbiIsImluIiwiU2hpZnRFeHByZXNzaW9uIl1dLEVxdWFsaXR5RXhwcmVzc2lvbjpbWyJSZWxhdGlvbmFsRXhwcmVzc2lvbiJdLFsiRXF1YWxpdHlFeHByZXNzaW9uIiwiPT0iLCJSZWxhdGlvbmFsRXhwcmVzc2lvbiJdLFsiRXF1YWxpdHlFeHByZXNzaW9uIiwiIT0iLCJSZWxhdGlvbmFsRXhwcmVzc2lvbiJdLFsiRXF1YWxpdHlFeHByZXNzaW9uIiwiPT09IiwiUmVsYXRpb25hbEV4cHJlc3Npb24iXSxbIkVxdWFsaXR5RXhwcmVzc2lvbiIsIiE9PSIsIlJlbGF0aW9uYWxFeHByZXNzaW9uIl1dLEJpdHdpc2VBTkRFeHByZXNzaW9uOltbIkVxdWFsaXR5RXhwcmVzc2lvbiJdLFsiQml0d2lzZUFOREV4cHJlc3Npb24iLCImIiwiRXF1YWxpdHlFeHByZXNzaW9uIl1dLEJpdHdpc2VYT1JFeHByZXNzaW9uOltbIkJpdHdpc2VBTkRFeHByZXNzaW9uIl0sWyJCaXR3aXNlWE9SRXhwcmVzc2lvbiIsIl4iLCJCaXR3aXNlQU5ERXhwcmVzc2lvbiJdXSxCaXR3aXNlT1JFeHByZXNzaW9uOltbIkJpdHdpc2VYT1JFeHByZXNzaW9uIl0sWyJCaXR3aXNlT1JFeHByZXNzaW9uIiwifCIsIkJpdHdpc2VYT1JFeHByZXNzaW9uIl1dLExvZ2ljYWxBTkRFeHByZXNzaW9uOltbIkJpdHdpc2VPUkV4cHJlc3Npb24iXSxbIkxvZ2ljYWxBTkRFeHByZXNzaW9uIiwiJiYiLCJCaXR3aXNlT1JFeHByZXNzaW9uIl1dLExvZ2ljYWxPUkV4cHJlc3Npb246W1siTG9naWNhbEFOREV4cHJlc3Npb24iXSxbIkxvZ2ljYWxPUkV4cHJlc3Npb24iLCJ8fCIsIkxvZ2ljYWxBTkRFeHByZXNzaW9uIl1dLENvbmRpdGlvbmFsRXhwcmVzc2lvbjpbWyJMb2dpY2FsT1JFeHByZXNzaW9uIl0sWyJMb2dpY2FsT1JFeHByZXNzaW9uIiwiPyIsIkxvZ2ljYWxPUkV4cHJlc3Npb24iLCI6IiwiTG9naWNhbE9SRXhwcmVzc2lvbiJdXSxFeHByZXNzaW9uOltbIkNvbmRpdGlvbmFsRXhwcmVzc2lvbiJdLFsiRXhwcmVzc2lvbiIsIiwiLCJDb25kaXRpb25hbEV4cHJlc3Npb24iXV0sUHJvZ3JhbTpbWyJFeHByZXNzaW9uIl1dfTtmdW5jdGlvbiB5dSh2LGMpe3RoaXMubmFtZT12LHRoaXMudG9rZW49Yyx0aGlzLmNoaWxkTm9kZXM9W10sdGhpcy50b1N0cmluZz1mdW5jdGlvbihiKXtpZihifHwoYj0iIiksdGhpcy5jaGlsZE5vZGVzLmxlbmd0aD09MSlyZXR1cm4gdGhpcy5jaGlsZE5vZGVzWzBdLnRvU3RyaW5nKGIpO2Zvcih2YXIgVD1iK3RoaXMubmFtZSsodGhpcy50b2tlbiE9bnVsbCYmdGhpcy5uYW1lIT10aGlzLnRva2VuPyI6Iit0aGlzLnRva2VuOiIiKStgCmAsQj0wO0I8dGhpcy5jaGlsZE5vZGVzLmxlbmd0aDtCKyspVCs9dGhpcy5jaGlsZE5vZGVzW0JdLnRvU3RyaW5nKGIrIiAgICAiKTtyZXR1cm4gVH19ZnVuY3Rpb24gcE4oKXt2YXIgdixjPXtQcm9ncmFtOiIkIn0sYj17fTtmdW5jdGlvbiBUKHUpe2JbSlNPTi5zdHJpbmdpZnkodSldPXU7Zm9yKHZhciBJPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHUpO0kubGVuZ3RoOyl7dmFyIEdlPUkuc2hpZnQoKTshd3ZbR2VdfHx3dltHZV0uZm9yRWFjaChmdW5jdGlvbih0bil7dVt0blswXV18fEkucHVzaCh0blswXSk7dmFyIEE9dSxzZT1udWxsO3RuLmZvckVhY2goZnVuY3Rpb24oRW4pe0FbRW5dfHwoQVtFbl09e30pLHNlPUEsQT1BW0VuXX0pLHVbR2VdLiRkaXYmJihBLiRkaXY9ITApLEEuJHJlZHVjZT1HZSxBLiRjb3VudD10bi5sZW5ndGh9KX1mb3IodmFyIEF0IGluIHUpdHlwZW9mIHVbQXRdIT0ib2JqZWN0Inx8QXQuY2hhckF0KDApPT0iJCJ8fHVbQXRdLiRjbG9zdXJlfHwoYltKU09OLnN0cmluZ2lmeSh1W0F0XSldP3VbQXRdPWJbSlNPTi5zdHJpbmdpZnkodVtBdF0pXTpUKHVbQXRdKSk7dS4kY2xvc3VyZT0hMH1UKGMpO3ZhciBCPVtdLEM9W2NdLGs9Yzt0aGlzLmluc2VydFN5bWJvbD1mdW5jdGlvbihJLEdlKXtmb3IoOyFrW0kubmFtZV0mJmsuJHJlZHVjZTspe2Zvcih2YXIgQXQ9ay4kY291bnQsdG49bmV3IHl1KGsuJHJlZHVjZSk7QXQtLTspdG4uY2hpbGROb2Rlcy5wdXNoKEIucG9wKCkpLEMucG9wKCk7az1DW0MubGVuZ3RoLTFdLHRoaXMuaW5zZXJ0U3ltYm9sKHRuKX1pZihrPWtbSS5uYW1lXSxCLnB1c2goSSksQy5wdXNoKGspLCFrKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gay4kZGl2fSx0aGlzLnJlc2V0PWZ1bmN0aW9uKCl7az1jLEI9W10sQz1bY119LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJncmFtbWFyVHJlZSIse2dldDpmdW5jdGlvbigpe3RyeXtmb3IoO2suJHJlZHVjZTspe2Zvcih2YXIgdT1rLiRjb3VudCxJPW5ldyB5dShrLiRyZWR1Y2UpO3UtLTspSS5jaGlsZE5vZGVzLnB1c2goQi5wb3AoKSksQy5wb3AoKTtrPUNbQy5sZW5ndGgtMV0sdGhpcy5pbnNlcnRTeW1ib2woSSl9aWYoQi5sZW5ndGg+MCYma1siOyJdKXJldHVybiB0aGlzLmluc2VydFN5bWJvbChuZXcgeXUoIjsiLCI7IikpLHRoaXMuZ3JhbW1hclRyZWU7aWYoQi5sZW5ndGghPTF8fEJbMF0ubmFtZSE9IlByb2dyYW0iKXRocm93IG5ldyBFcnJvcn1jYXRjaChHZSl7dGhyb3cgbmV3IFN5bnRheEVycm9yKCJVbmV4cGVjdGVkIGVuZCBvZiBpbnB1dCIpfXJldHVybiBCWzBdfX0pfWZ1bmN0aW9uIGdOKCl7dGhpcy5sZXhpY2FsUGFyc2VyPW5ldyBoTix0aGlzLnN5bnRhY3RpY2FsUGFyc2VyPW5ldyBwTjt2YXIgdj1bIk51bGxMaXRlcmFsIiwiQm9vbGVhbkxpdGVyYWwiLCJOdW1lcmljTGl0ZXJhbCIsIlN0cmluZ0xpdGVyYWwiLCJSZWd1bGFyRXhwcmVzc2lvbkxpdGVyYWwiLCJJZGVudGlmaWVyIiwiKioiLCI9PiIsInsiLCJ9IiwiKCIsIikiLCJbIiwiXSIsIi4iLCI7IiwiLCIsIjwiLCI+IiwiPD0iLCI+PSIsIj09IiwiIT0iLCI9PT0iLCIhPT0iLCIrIiwiLSIsIioiLCIlIiwiKysiLCItLSIsIjw8IiwiPj4iLCI+Pj4iLCImIiwifCIsIl4iLCIhIiwifiIsIiYmIiwifHwiLCI/IiwiOiIsIj0iLCIrPSIsIi09IiwiKj0iLCIlPSIsIjw8PSIsIj4+PSIsIj4+Pj0iLCImPSIsInw9IiwiXj0iLCIvIiwiLz0iLCJpbnN0YW5jZW9mIiwidHlwZW9mIiwibmV3Iiwidm9pZCIsImRlYnVnZ2VyIiwidGhpcyIsImRlbGV0ZSIsImluIl0sYz17fTt2LmZvckVhY2goZnVuY3Rpb24oYil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGMsYix7fSl9KSx0aGlzLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5sZXhpY2FsUGFyc2VyLnJlc2V0KCksdGhpcy5zeW50YWN0aWNhbFBhcnNlci5yZXNldCgpfSx0aGlzLnBhcnNlPWZ1bmN0aW9uKGIsVCl7dmFyIEIsQz0hMTt0aGlzLmxleGljYWxQYXJzZXIuc291cmNlPWI7Zm9yKHZhciBrPSExO0I9dGhpcy5sZXhpY2FsUGFyc2VyLmdldE5leHRUb2tlbihrKTspe1QmJlQoQik7dHJ5e2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKEIpLnNvbWUodT0+Yy5oYXNPd25Qcm9wZXJ0eSh1KT8oaz10aGlzLnN5bnRhY3RpY2FsUGFyc2VyLmluc2VydFN5bWJvbChuZXcgeXUodSxCKSxDKSxDPSExLCEwKTohMSkpY29udGludWU7KEIuS2V5d29yZHx8Qi5QdW5jdHVhdG9yfHxCLkRpdlB1bmN0dWF0b3IpJiZjLmhhc093blByb3BlcnR5KEIudG9TdHJpbmcoKSkmJihrPXRoaXMuc3ludGFjdGljYWxQYXJzZXIuaW5zZXJ0U3ltYm9sKG5ldyB5dShCLnRvU3RyaW5nKCksQiksQykpfWNhdGNoKHUpe3Rocm93IG5ldyBTeW50YXhFcnJvcigiVW5leHBlY3RlZCB0b2tlbiAiK0IpfX1yZXR1cm4gdGhpcy5zeW50YWN0aWNhbFBhcnNlci5ncmFtbWFyVHJlZX19dmFyIFN2PW5ldyBnTjtmdW5jdGlvbiB2Tih2KXtTdi5yZXNldCgpLHRoaXMudHJlZT1Tdi5wYXJzZSh2KSx0aGlzLnBhdGhzPVtdO3ZhciBjPU9iamVjdC5jcmVhdGUobnVsbCksYj10aGlzLFQ9T2JqZWN0LmNyZWF0ZShudWxsKTt0aGlzLmlzU2ltcGxlLHRoaXMuaXNDb25zdCxDKHRoaXMudHJlZSksQih0aGlzLnRyZWUpLHRoaXMucGF0aHMubGVuZ3RoPT09MCYmKHRoaXMuaXNDb25zdD0hMCksdGhpcy5zZXR0ZXI9ZnVuY3Rpb24oSSl7Zm9yKHZhciBHZT1jLEF0PTA7QXQ8SS5sZW5ndGgtMTtBdCsrKUdlW0lbQXRdXXx8KEdlW0lbQXRdXT1PYmplY3QuY3JlYXRlKG51bGwpKSxHZT1HZVtJW0F0XV07cmV0dXJue2lzQ29tcGxldGVkOmZ1bmN0aW9uKCl7Zm9yKHZhciB0biBpbiBUKWlmKCFUW3RuXSlyZXR1cm4hMTtyZXR1cm4hMH0sc2V0OmZ1bmN0aW9uKHRuKXtpZihUW0kuam9pbigiLiIpXXx8KFRbSS5qb2luKCIuIildPSEwKSxHZVtJW0F0XV09dG4sdGhpcy5pc0NvbXBsZXRlZCgpKXJldHVybiBiLmV4ZWMoKX19fSx0aGlzLnZhbHVlT2Y9dGhpcy5leGVjPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBmdW5jdGlvbigpe3JldHVybigwLGV2YWwpKHYpfS5jYWxsKGMpfWNhdGNoKEkpe319O2Z1bmN0aW9uIEIoSSl7Zm9yKHZhciBHZT1JO0dlLmNoaWxkTm9kZXMubGVuZ3RoPD0xJiZHZS5uYW1lIT09Ik1lbWJlckV4cHJlc3Npb24iOylHZT1HZS5jaGlsZE5vZGVzWzBdO0dlLm5hbWU9PT0iTWVtYmVyRXhwcmVzc2lvbiI/Yi5pc1NpbXBsZT0hMDpiLmlzU2ltcGxlPSExfWZ1bmN0aW9uIEMoSSl7aWYoSS5uYW1lPT09IkNhbGxFeHByZXNzaW9uIiYmSS5jaGlsZE5vZGVzW0kuY2hpbGROb2Rlcy5sZW5ndGgtMV0ubmFtZSE9PSJDYWxsRXhwcmVzc2lvbiIpe3ZhciBHZT1rKEkuY2hpbGROb2Rlc1sxXSk7QyhJLmNoaWxkTm9kZXNbMF0pfWVsc2UgaWYoSS5uYW1lPT09Ik5ld0V4cHJlc3Npb24iJiZJLmNoaWxkTm9kZXMubGVuZ3RoPT09MSl2YXIgR2U9ayhJLmNoaWxkTm9kZXNbMF0pO2Vsc2UgaWYoSS5uYW1lPT09Ik1lbWJlckV4cHJlc3Npb24iJiZJLmNoaWxkTm9kZXMubGVuZ3RoPT09MSl2YXIgR2U9ayhJKTtlbHNlIGZvcih2YXIgQXQ9MDtBdDxJLmNoaWxkTm9kZXMubGVuZ3RoO0F0KyspQyhJLmNoaWxkTm9kZXNbQXRdKX1mdW5jdGlvbiBrKEkpe2lmKEkuY2hpbGROb2Rlc1swXS5uYW1lPT09IklkZW50aWZpZXJOYW1lIil7dmFyIEdlPWsoSS5jaGlsZE5vZGVzWzJdKTtyZXR1cm4gR2UmJihHZT1HZS5jb25jYXQoSS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF0udG9rZW4udG9TdHJpbmcoKSkpLHUoR2UpLEdlfWVsc2UgaWYoSS5jaGlsZE5vZGVzWzBdLm5hbWU9PT0iUHJpbWFyeUV4cHJlc3Npb24iKWlmKEkuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdLm5hbWU9PT0iSWRlbnRpZmllciIpe3ZhciBHZT1bSS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF0udG9rZW4udG9TdHJpbmcoKV07cmV0dXJuIHUoR2UpLEdlfWVsc2UgcmV0dXJuIG51bGw7ZWxzZXtpZihJLmNoaWxkTm9kZXNbMF0ubmFtZT09PSJdIilyZXR1cm4gayhJLmNoaWxkTm9kZXNbM10pLEMoSS5jaGlsZE5vZGVzWzFdKSxudWxsO2lmKEkuY2hpbGROb2Rlc1swXS5uYW1lPT09IkFyZ3VtZW50cyIpcmV0dXJuIEMoSS5jaGlsZE5vZGVzWzBdKSxDKEkuY2hpbGROb2Rlc1sxXSksbnVsbDtmb3IodmFyIEF0PTA7QXQ8SS5jaGlsZE5vZGVzLmxlbmd0aDtBdCsrKUMoSS5jaGlsZE5vZGVzW0F0XSl9fWZ1bmN0aW9uIHUoSSl7Zm9yKHZhciBHZT1jLEF0PTA7QXQ8SS5sZW5ndGgtMTtBdCsrKUdlW0lbQXRdXXx8KEdlW0lbQXRdXT1PYmplY3QuY3JlYXRlKG51bGwpKSxHZT1HZVtJW0F0XV07Yi5wYXRocy5wdXNoKEkpLFRbSS5qb2luKCIuIildPSExfX1mdW5jdGlvbiBlYyh2KXt2YXIgYz12LmNoaWxkTm9kZXMuc2xpY2UoKS5yZXZlcnNlKCksYj1jLmZpbHRlcihJPT4hSS50b2tlbnx8IUkudG9rZW4uUHVuY3R1YXRvcik7aWYodi5uYW1lPT09IlVuYXJ5RXhwcmVzc2lvbiImJmMubGVuZ3RoPT09MiYmY1swXS5uYW1lPT09Ii0iJiZiLmxlbmd0aD09PTEpe3ZhciBUPWVjKGJbMF0pO3JldHVybiBULnZhbHVlPS1ULnZhbHVlLFR9aWYodi5uYW1lPT09IkFyZ3VtZW50cyIpe2Zvcih2YXIgQj1bXSxDPWJbMF07QzspQy5jaGlsZE5vZGVzLmxlbmd0aD09PTMmJihCLnVuc2hpZnQoQy5jaGlsZE5vZGVzWzBdKSxDPUMuY2hpbGROb2Rlc1syXSksQy5jaGlsZE5vZGVzLmxlbmd0aD09PTEmJihCLnVuc2hpZnQoQy5jaGlsZE5vZGVzWzBdKSxDPW51bGwpO3JldHVybnt0eXBlOiJBcmd1bWVudHMiLGNoaWxkcmVuOkIubWFwKEk9PmVjKEkpKX19aWYoYiYmYi5sZW5ndGg9PT0xKXt2YXIgVD1lYyhiWzBdKTtyZXR1cm4gVH1pZih2LnRva2VuJiZbIk51bGxMaXRlcmFsIiwiQm9vbGVhbkxpdGVyYWwiLCJOdW1lcmljTGl0ZXJhbCIsIlN0cmluZ0xpdGVyYWwiLCJJZGVudGlmaWVyIl0uc29tZShJPT52LnRva2VuW0ldKSl7dmFyIGs9T2JqZWN0LmtleXModi50b2tlbikuZmlsdGVyKEk9PkkubWF0Y2goL0xpdGVyYWwvKXx8SS5tYXRjaCgvSWRlbnRpZmllci8pKVswXSx1PXtOdWxsTGl0ZXJhbDpudWxsLEJvb2xlYW5MaXRlcmFsOkJvb2xlYW4odi50b2tlbiksTnVtZXJpY0xpdGVyYWw6TnVtYmVyKHYudG9rZW4pLFN0cmluZ0xpdGVyYWw6di50b2tlbixJZGVudGlmaWVyOnYudG9rZW59W2tdO3JldHVybnt0eXBlOmssdmFsdWU6dX19cmV0dXJuIHYubmFtZT09PSJDYWxsRXhwcmVzc2lvbiI/e3R5cGU6IkNhbGxFeHByZXNzaW9uIixjaGlsZHJlbjpbZWMoY1swXSksZWMoY1sxXSldfTp7dHlwZTpjLmZpbHRlcihJPT5JLnRva2VuJiZJLnRva2VuLlB1bmN0dWF0b3IpWzBdLm5hbWUsY2hpbGRyZW46Yy5maWx0ZXIoST0+IUkudG9rZW58fCFJLnRva2VuLlB1bmN0dWF0b3IpLm1hcChJPT5lYyhJKSl9fWZ1bmN0aW9uIEN2KHYpe3ZhciBjPW5ldyB2Tih2KTtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoZWMoYy50cmVlKSxudWxsKX1mdW5jdGlvbiBtTih2LGMpe3JldHVybiBjPT09ImJpbmQiJiYodj09PSJiaW5kaW5neCJ8fHY9PT0iYmluZGluZyIpfWZ1bmN0aW9uIEF2KHYpe2lmKCF2KXJldHVybjt0cnl7dj1KU09OLnBhcnNlKHYpfWNhdGNoKGIpe31sZXQgYz17fTtpZihqaSh2KT9jLm9yaWdpbj12OnYmJihjLm9yaWdpbj12Lm9yaWdpbixjLnRyYW5zZm9ybWVkPXYudHJhbnNmb3JtZWQpLCEoIWMudHJhbnNmb3JtZWQmJiFjLm9yaWdpbikpcmV0dXJuIGMudHJhbnNmb3JtZWQ9Yy50cmFuc2Zvcm1lZHx8Q3YoYy5vcmlnaW4pLGN9ZnVuY3Rpb24gX04odil7cmV0dXJuIHYmJih2LmV4aXRFeHByZXNzaW9uPUF2KHYuZXhpdEV4cHJlc3Npb24pLHYucHJvcHMmJnYucHJvcHMuZm9yRWFjaChjPT57Yy5leHByZXNzaW9uPUF2KGMuZXhwcmVzc2lvbil9KSx2KX1mdW5jdGlvbiBiTih2KXtyZXR1cm4gZnVuY3Rpb24oYz17fSl7aWYoJG4odikpcmV0dXJuIHYoe3N0YXRlOmMuc3RhdGU9PT0iZW5kIj8iZXhpdCI6Yy5zdGF0ZSx0OmMudCE9PXZvaWQgMD9jLnQ6Yy5kZWx0YVR9KX19ZnVuY3Rpb24gT3YodixjLGIpe3JldHVybiBiJiYobU4odixjKT9mdW5jdGlvbihULEI9ZnVuY3Rpb24oKXt9KXtpZighVCl0aHJvdyBuZXcgRXJyb3IoInNob3VsZCBwYXNzIG9wdGlvbnMgZm9yIGJpbmRpbmciKTtyZXR1cm4gX04oVCksYihULFQmJlQuZXZlbnRUeXBlPT09InRpbWluZyI/Yk4oQik6Qil9OmIpfWZ1bmN0aW9uIHlOKHYsYyl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHYsIltbQ3VycmVudEluc3RhbmNlSWRdXSIse3ZhbHVlOmN9KX1mdW5jdGlvbiBUdih2KXtyZXR1cm4gdlsiW1tDdXJyZW50SW5zdGFuY2VJZF1dIl19ZnVuY3Rpb24gRU4odixjLGIpe2xldCBUPWpyKHYpO3JldHVybiFUfHwhJG4oVC5zZW5kKT8oY29uc29sZS5lcnJvcihgW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIGZpbmQgdGFza0NlbnRlciAoJHt2fSkuYCksbnVsbCk6KC4uLkIpPT5ULnNlbmQoIm1vZHVsZSIse21vZHVsZTpjLG1ldGhvZDpifSxCKX1mdW5jdGlvbiB3Tih2LGMsYixUKXtsZXQgQj1qcih2KTtyZXR1cm4hQnx8ISRuKEIuc2VuZCk/KGNvbnNvbGUuZXJyb3IoYFtKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byBmaW5kIHRhc2tDZW50ZXIgKCR7dn0pLmApLG51bGwpOiRuKFQpP0M9PkIuc2VuZCgibW9kdWxlIix7bW9kdWxlOmMsbWV0aG9kOmJ9LFtDXSk6KGNvbnNvbGUuZXJyb3IoYFtKUyBGcmFtZXdvcmtdICR7Y30uJHtifSBtdXN0IGJlIGFzc2lnbmVkIGFzIGEgZnVuY3Rpb24uYCksbnVsbCl9dmFyIGRmPWNsYXNze2NvbnN0cnVjdG9yKGMsYil7eU4odGhpcyxTdHJpbmcoYykpLHRoaXMuY29uZmlnPWJ8fHt9LHRoaXMuZG9jdW1lbnQ9bmV3IG1hKGMsdGhpcy5jb25maWcuYnVuZGxlVXJsKSx0aGlzLnJlcXVpcmVNb2R1bGU9dGhpcy5yZXF1aXJlTW9kdWxlLmJpbmQodGhpcyksdGhpcy5pbXBvcnRTY3JpcHQ9dGhpcy5pbXBvcnRTY3JpcHQuYmluZCh0aGlzKSx0aGlzLmlzUmVnaXN0ZXJlZE1vZHVsZT1sZix0aGlzLmlzUmVnaXN0ZXJlZENvbXBvbmVudD1wZH1yZXF1aXJlTW9kdWxlKGMpe2xldCBiPVR2KHRoaXMpO2lmKCEoYiYmdGhpcy5kb2N1bWVudCYmdGhpcy5kb2N1bWVudC50YXNrQ2VudGVyKSl7Y29uc29sZS5lcnJvcihgW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIHJlcXVpcmVNb2R1bGUoIiR7Y30iKSwgaW5zdGFuY2UgKCR7Yn0pIGRvZXNuJ3QgZXhpc3QgYW55bW9yZS5gKTtyZXR1cm59aWYoIWxmKGMpKXtjb25zb2xlLndhcm4oYFtKUyBGcmFtZXdvcmtdIFx1NUY1M1x1NTI0RFx1OEZEMFx1ODg0Q1x1NzY4NFx1NTdGQVx1NUVBN1x1NEUwRFx1NTMwNVx1NTQyQlx1NTM5Rlx1NzUxRlx1NjNEMlx1NEVGNlske2N9XVx1RkYwQ1x1OEJGN1x1NTcyOG1hbmlmZXN0XHU0RTJEXHU5MTREXHU3RjZFXHU4QkU1XHU2M0QyXHU0RUY2XHVGRjBDXHU5MUNEXHU2NUIwXHU1MjM2XHU0RjVDXHU1MzA1XHU2MkVDXHU4QkU1XHU1MzlGXHU3NTFGXHU2M0QyXHU0RUY2XHU3Njg0XHU4MUVBXHU1QjlBXHU0RTQ5XHU4RkQwXHU4ODRDXHU1N0ZBXHU1RUE3YCk7cmV0dXJufWxldCBUPXt9LEI9Y3YoYyk7Zm9yKGxldCBDIGluIEIpT2JqZWN0LmRlZmluZVByb3BlcnR5KFQsQyx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OigpPT5PdihjLEMsRU4oYixjLEMpKSxzZXQ6az0+d04oYixjLEMsayl9KTtyZXR1cm4gVH1zdXBwb3J0cyhjKXtpZighamkoYykpcmV0dXJuIG51bGw7bGV0IGI9Yy5tYXRjaCgvXkAoXHcrKVwvKFtcdy1dKykoXC4oXHcrKSk/JC9pKTtpZihiKXtsZXQgVD1iWzFdLEI9YlsyXSxDPWJbNF07c3dpdGNoKFQpe2Nhc2UibW9kdWxlIjpyZXR1cm4gbGYoQixDKTtjYXNlImNvbXBvbmVudCI6cmV0dXJuIHBkKEIpfX1yZXR1cm4gbnVsbH1pbXBvcnRTY3JpcHQoYyxiPXt9KXtsZXQgVD1Udih0aGlzKSxCPWpyKFQpO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihDLGspe2lmKCFCfHwhJG4oQi5zZW5kKSlyZXR1cm4gayhuZXcgRXJyb3IoYFtKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byBpbXBvcnQgc2NyaXB0ICIke2N9Iiwgbm8gdGFza0NlbnRlciAoJHtUfSkgbWF0Y2hlZC5gKSk7dHJ5e0Iuc2VuZCgibW9kdWxlIix7bW9kdWxlOiJzY3JpcHQiLG1ldGhvZDoiaW1wb3J0U2NyaXB0In0sW2MsYl0se2NhbGxiYWNrOlt1PT5DKHUpLHU9PmsodSldfSl9Y2F0Y2godSl7ayh1KX19KX19O2Z1bmN0aW9uIFNOKHYsYyl7bGV0IGI9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gYi5zZXJ2aWNlPU9iamVjdC5jcmVhdGUobnVsbCksX2wuZm9yRWFjaCgoe25hbWU6VCxvcHRpb25zOkJ9KT0+e2xldCBDPUIuY3JlYXRlO2lmKEMpdHJ5e2xldCBrPUModixjKTtkaShiLnNlcnZpY2UsayksZGkoYixrLmluc3RhbmNlKX1jYXRjaChrKXtjb25zb2xlLmVycm9yKGBbSlMgUnVudGltZV0gRmFpbGVkIHRvIGNyZWF0ZSBzZXJ2aWNlICR7VH0uYCl9fSksZGVsZXRlIGIuc2VydmljZS5pbnN0YW5jZSxmcyhiLnNlcnZpY2UpLGJ9dmFyIENOPXt1aWQ6MH0sQU49R2codnUpLE9OPVdnKHZ1KTtmdW5jdGlvbiBJdih2LGMsYil7bGV0IFQ9bmV3IGRmKHYsYyksQj0iVnVlIixDPVNOKHYse3dlZXg6VCxudnVlOlQsY29uZmlnOmMsY3JlYXRlZDpEYXRlLm5vdygpLGZyYW1ld29yazpCfSk7ZnMoQyk7bGV0IGs9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gZGkoayx4TihUKSksZGkoayxDLHtTaGFyZWRPYmplY3Q6Q04sd2VleDpULG52dWU6VCxyZXF1aXJlTW9kdWxlOnU9PlQucmVxdWlyZU1vZHVsZSh1KSxfX1dFRVhfQ0FMTF9KQVZBU0NSSVBUX186ZGQsc2VydmljZXM6Q30pLGsucGx1cz1uZXcgay5XZWV4UGx1cyhUKSxrLlZ1ZVNoYXJlZD12dSxrLlVuaVNoYXJlZD1BTixrLlZ1ZVJlYWN0aXZpdHk9T04sZ3YodixrKSxmcyhrKSxrfWZ1bmN0aW9uIFROKHYsYyxiPXt9KXtsZXQgVD0iVnVlIjtiPWVkKGIpLGIuZW52PWVkKGdsb2JhbC5XWEVudmlyb25tZW50fHx7fSksYi5idW5kbGVUeXBlPVQ7bGV0IEI9SXYodixiKTtJTihjLEIpfWZ1bmN0aW9uIElOKHYsYyl7bGV0IGI9W10sVD1bXTtmb3IobGV0IEMgaW4gYyliLnB1c2goQyksVC5wdXNoKGNbQ10pO2xldCBCPSIoZnVuY3Rpb24gKGdsb2JhbCkgeyAiK3YrIiB9KShPYmplY3QuY3JlYXRlKHRoaXMpKSI7cmV0dXJuIG5ldyBGdW5jdGlvbiguLi5iLEIpKC4uLlQpfWZ1bmN0aW9uIFBOKHYpe2xldCBjPUtzKHYpO3RyeXtpZihjJiZjLmJvZHkpcmV0dXJuIGMuYm9keS50b0pTT04oKX1jYXRjaChiKXtjb25zb2xlLmVycm9yKCJbSlMgRnJhbWV3b3JrXSBGYWlsZWQgdG8gZ2V0IHRoZSB2aXJ0dWFsIGRvbSB0cmVlLiIpO3JldHVybn19ZnVuY3Rpb24gTk4odil7RGcodiksX2wuZm9yRWFjaChjPT57bGV0IGI9Yy5vcHRpb25zLmRlc3Ryb3k7YiYmYih2KX0pfWZ1bmN0aW9uIGtOKHYpe0ZnKHYpLF9sLmZvckVhY2goYz0+e2xldCBiPWMub3B0aW9ucy5yZWZyZXNoO2ImJmIodil9KX12YXIgUk49e2NyZWF0ZUluc3RhbmNlOlROLGNyZWF0ZUluc3RhbmNlQ29udGV4dDpJdixnZXRSb290OlBOLGdldERvY3VtZW50OktzLHJlZ2lzdGVyU2VydmljZTpjZix1bnJlZ2lzdGVyU2VydmljZTp1ZixjYWxsSlModixjKXtyZXR1cm4gZGQodixjKX0scmVnaXN0ZXJDb21wb25lbnRzOnV2LHJlZ2lzdGVyTW9kdWxlczpsdixkZXN0cm95SW5zdGFuY2U6Tk4scmVmcmVzaEluc3RhbmNlOmtOfTtmdW5jdGlvbiBTZCgpe3JldHVybiBzdigpLFJOfWZ1bmN0aW9uIHhOKHYpe2lmKGdsb2JhbC5zZXRUaW1lb3V0JiZnbG9iYWwuc2V0SW50ZXJ2YWwpcmV0dXJue3NldFRpbWVvdXQ6Z2xvYmFsLnNldFRpbWVvdXQsc2V0SW50ZXJ2YWw6Z2xvYmFsLnNldEludGVydmFsLGNsZWFyVGltZW91dDpnbG9iYWwuY2xlYXJUaW1lb3V0LGNsZWFySW50ZXJ2YWw6Z2xvYmFsLmNsZWFySW50ZXJ2YWx9O2xldCBjPXYucmVxdWlyZU1vZHVsZSgidGltZXIiKTtyZXR1cm57c2V0VGltZW91dDooLi4uVCk9PntsZXQgQj1mdW5jdGlvbigpe1RbMF0oLi4uVC5zbGljZSgyKSl9O3JldHVybiBjLnNldFRpbWVvdXQoQixUWzFdKSx2LmRvY3VtZW50LnRhc2tDZW50ZXIuY2FsbGJhY2tNYW5hZ2VyLmxhc3RDYWxsYmFja0lkLnRvU3RyaW5nKCl9LHNldEludGVydmFsOiguLi5UKT0+e2xldCBCPWZ1bmN0aW9uKCl7VFswXSguLi5ULnNsaWNlKDIpKX07cmV0dXJuIGMuc2V0SW50ZXJ2YWwoQixUWzFdKSx2LmRvY3VtZW50LnRhc2tDZW50ZXIuY2FsbGJhY2tNYW5hZ2VyLmxhc3RDYWxsYmFja0lkLnRvU3RyaW5nKCl9LGNsZWFyVGltZW91dDpUPT57Yy5jbGVhclRpbWVvdXQoVCl9LGNsZWFySW50ZXJ2YWw6VD0+e2MuY2xlYXJJbnRlcnZhbChUKX19fXZhciBQdj17RG9jdW1lbnQ6bWEsRWxlbWVudDp3byxDb21tZW50OlFsLExpc3RlbmVyOlZjLFRhc2tDZW50ZXI6TGMsc2VuZFRhc2tzKC4uLnYpe3JldHVybiAkbihjYWxsTmF0aXZlKT9jYWxsTmF0aXZlKC4uLnYpOihnbG9iYWwuY2FsbE5hdGl2ZXx8KCgpPT57fSkpKC4uLnYpfX07bWEuaGFuZGxlcj1Qdi5zZW5kVGFza3M7dmFyIHRjPVB2O2Z1bmN0aW9uIEJOKCl7ZnModGMuQ29tbWVudCksZnModGMuTGlzdGVuZXIpLGZzKHRjLkRvY3VtZW50LnByb3RvdHlwZSksZnModGMuQ29tbWVudC5wcm90b3R5cGUpLGZzKHRjLkxpc3RlbmVyLnByb3RvdHlwZSl9dmFyIGhmPXtzZXJ2aWNlOntyZWdpc3RlcjpjZix1bnJlZ2lzdGVyOnVmLGhhczpnZH0sZnJlZXplUHJvdG90eXBlOkJOLGluaXQ6U2QsY29uZmlnOnRjfTt2YXIgQ2Q9Y2xhc3N7Y29uc3RydWN0b3IoYyxiPXt9KXt0aGlzLnR5cGU9Y3x8Im1lc3NhZ2UiLHRoaXMuZGF0YT1iLmRhdGF8fG51bGwsdGhpcy5vcmlnaW49Yi5vcmlnaW58fCIiLHRoaXMuc291cmNlPWIuc291cmNlfHxudWxsLHRoaXMucG9ydHM9Yi5wb3J0c3x8W10sdGhpcy50YXJnZXQ9bnVsbCx0aGlzLnRpbWVTdGFtcD1EYXRlLm5vdygpfX07dmFyIGJsPXt9LEV1PXt9O2Z1bmN0aW9uIEFkKCl7fUFkLnByb3RvdHlwZS5wb3N0TWVzc2FnZT1mdW5jdGlvbih2KXtpZih0aGlzLl9jbG9zZWQpdGhyb3cgbmV3IEVycm9yKGBCcm9hZGNhc3RDaGFubmVsICIke3RoaXMubmFtZX0iIGlzIGNsb3NlZC5gKTtsZXQgYz1ibFt0aGlzLm5hbWVdO2lmKGMmJmMubGVuZ3RoKWZvcihsZXQgYj0wO2I8Yy5sZW5ndGg7KytiKXtsZXQgVD1jW2JdO1QuX2Nsb3NlZHx8VD09PXRoaXN8fCRuKFQub25tZXNzYWdlKSYmVC5vbm1lc3NhZ2UobmV3IENkKCJtZXNzYWdlIix7ZGF0YTp2fSkpfX07QWQucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7aWYoIXRoaXMuX2Nsb3NlZCYmKHRoaXMuX2Nsb3NlZD0hMCxibFt0aGlzLm5hbWVdKSl7bGV0IHY9YmxbdGhpcy5uYW1lXS5maWx0ZXIoYz0+YyE9PXRoaXMpO3YubGVuZ3RoP2JsW3RoaXMubmFtZV09djpkZWxldGUgYmxbdGhpcy5uYW1lXX19O3ZhciBOdj17Y3JlYXRlOnY9PntpZihFdVt2XT1bXSwkbihnbG9iYWwuQnJvYWRjYXN0Q2hhbm5lbCkpcmV0dXJue307bGV0IGM9e0Jyb2FkY2FzdENoYW5uZWw6ZnVuY3Rpb24oYil7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIm5hbWUiLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMSx2YWx1ZTpTdHJpbmcoYil9KSx0aGlzLl9jbG9zZWQ9ITEsdGhpcy5vbm1lc3NhZ2U9bnVsbCxibFt0aGlzLm5hbWVdfHwoYmxbdGhpcy5uYW1lXT1bXSksYmxbdGhpcy5uYW1lXS5wdXNoKHRoaXMpLEV1W3ZdLnB1c2godGhpcyl9fTtyZXR1cm4gYy5Ccm9hZGNhc3RDaGFubmVsLnByb3RvdHlwZT1BZC5wcm90b3R5cGUse2luc3RhbmNlOmN9fSxkZXN0cm95OnY9PntFdVt2XSYmKEV1W3ZdLmZvckVhY2goYz0+Yy5jbG9zZSgpKSxkZWxldGUgRXVbdl0pfX07ZnVuY3Rpb24gT2QoKXtsZXR7aW5pdDp2fT1oZjtoZi5zZXJ2aWNlLnJlZ2lzdGVyKCJCcm9hZGNhc3RDaGFubmVsIixOdiksaGYuZnJlZXplUHJvdG90eXBlKCk7bGV0IGM9digpO2ZvcihsZXQgYiBpbiBjKWdsb2JhbFtiXT0oLi4uVCk9PntsZXQgQj1jW2JdKC4uLlQpO3JldHVybiBCIGluc3RhbmNlb2YgRXJyb3ImJmNvbnNvbGUuZXJyb3IoQi50b1N0cmluZygpKSxCfX12YXIgQ1I9Z2xvYmFsLmNvbnNvbGU7ZnVuY3Rpb24ga3YoKXtpZihxZygpLGdsb2JhbC5XWEVudmlyb25tZW50JiZnbG9iYWwuV1hFbnZpcm9ubWVudC5wbGF0Zm9ybSE9PSJXZWIiKWdsb2JhbC5jb25zb2xlPXtkZWJ1ZzooLi4udik9PntYbigiZGVidWciKSYmZ2xvYmFsLm5hdGl2ZUxvZyguLi53dSh2KSwiX19ERUJVRyIpfSxsb2c6KC4uLnYpPT57WG4oImxvZyIpJiZnbG9iYWwubmF0aXZlTG9nKC4uLnd1KHYpLCJfX0xPRyIpfSxpbmZvOiguLi52KT0+e1huKCJpbmZvIikmJmdsb2JhbC5uYXRpdmVMb2coLi4ud3UodiksIl9fSU5GTyIpfSx3YXJuOiguLi52KT0+e1huKCJ3YXJuIikmJmdsb2JhbC5uYXRpdmVMb2coLi4ud3UodiksIl9fV0FSTiIpfSxlcnJvcjooLi4udik9PntYbigiZXJyb3IiKSYmZ2xvYmFsLm5hdGl2ZUxvZyguLi53dSh2KSwiX19FUlJPUiIpfX07ZWxzZXtsZXR7ZGVidWc6dixsb2c6YyxpbmZvOmIsd2FybjpULGVycm9yOkJ9PWNvbnNvbGU7Y29uc29sZS5fX29yaV9fPXtkZWJ1Zzp2LGxvZzpjLGluZm86Yix3YXJuOlQsZXJyb3I6Qn0sY29uc29sZS5kZWJ1Zz0oLi4uQyk9PntYbigiZGVidWciKSYmY29uc29sZS5fX29yaV9fLmRlYnVnLmFwcGx5KGNvbnNvbGUsQyl9LGNvbnNvbGUubG9nPSguLi5DKT0+e1huKCJsb2ciKSYmY29uc29sZS5fX29yaV9fLmxvZy5hcHBseShjb25zb2xlLEMpfSxjb25zb2xlLmluZm89KC4uLkMpPT57WG4oImluZm8iKSYmY29uc29sZS5fX29yaV9fLmluZm8uYXBwbHkoY29uc29sZSxDKX0sY29uc29sZS53YXJuPSguLi5DKT0+e1huKCJ3YXJuIikmJmNvbnNvbGUuX19vcmlfXy53YXJuLmFwcGx5KGNvbnNvbGUsQyl9LGNvbnNvbGUuZXJyb3I9KC4uLkMpPT57WG4oImVycm9yIikmJmNvbnNvbGUuX19vcmlfXy5lcnJvci5hcHBseShjb25zb2xlLEMpfX19ZnVuY3Rpb24gd3Uodil7cmV0dXJuIHYubWFwKGM9PntpZihxcyhjKS50b0xvd2VyQ2FzZSgpPT09IltvYmplY3Qgb2JqZWN0XSIpdHJ5e2M9SlNPTi5zdHJpbmdpZnkoYyl9Y2F0Y2goVCl7Yz0iW29iamVjdCBvYmplY3RdIn1lbHNlIGM9U3RyaW5nKGMpO3JldHVybiBjfSl9a3YoKTtPZCgpO30pKCk7Cg==