uni-jsframework-vue3.js 651 KB

12
  1. //{"version":"3.6.4","encode":"base64"}
  2. dmFyIF9fVW5pU2VydmljZVN0YXJ0VGltZV9fID0gRGF0ZS5ub3coKTt2YXIgZ2xvYmFsPXRoaXM7IHZhciBwcm9jZXNzPXtlbnY6e319OyB2YXIgc2V0VGltZW91dD1nbG9iYWwuc2V0VGltZW91dDsKKCgpPT57dmFyIHdQPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgU1A9KGcsbCk9Pntmb3IodmFyIF8gaW4gbCl3UChnLF8se2dldDpsW19dLGVudW1lcmFibGU6ITB9KX07dmFyIG1hPU9iamVjdC5mcmVlemU7ZnVuY3Rpb24gZGMoe2dldEN1cnJlbnRQYWdlczpnLHVuaTpsLFVuaVNoYXJlZDpfLFZ1ZTpBLFZ1ZVNoYXJlZDprfSl7dmFyIFM9ZnVuY3Rpb24oTixmLFQsemUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB4dCgpe2xldCBVZT1nKCksaXQ9VWUubGVuZ3RoO2lmKGl0KXJldHVybiBVZVtpdC0xXX1mdW5jdGlvbiBwbigpe2xldCBVZT14dCgpO2lmKFVlKXJldHVybiBVZS4kdm19ZnVuY3Rpb24gQihVZSxpdCx2dCl7aWYoZi5pc1N0cmluZyhVZSkpdnQ9aXQsaXQ9VWUsVWU9cG4oKTtlbHNlIGlmKHR5cGVvZiBVZT09Im51bWJlciIpe2xldCBubj1nKCkuZmluZChRdD0+UXQuJHBhZ2UuaWQ9PT1VZSk7bm4/VWU9bm4uJHZtOlVlPXBuKCl9aWYoIVVlKXJldHVybjtpZihVZS5fX2NhbGxfaG9vaylyZXR1cm4gVWUuX19jYWxsX2hvb2soaXQsdnQpO2xldCBxdD1VZS4kW2l0XTtyZXR1cm4gcXQmJlQuaW52b2tlQXJyYXlGbnMocXQsdnQpfWZ1bmN0aW9uIGd0KFVlLGl0LHZ0LHF0KXtmLmlzRnVuY3Rpb24oaXQpJiZ6ZS5pbmplY3RIb29rKFVlLGl0LmJpbmQodnQpLHF0KX1mdW5jdGlvbiB2bihVZSxpdCx2dCl7bGV0IHF0PVVlLm1wVHlwZXx8dnQuJG1wVHlwZTtpZighIXF0JiYoT2JqZWN0LmtleXMoVWUpLmZvckVhY2gobm49PntpZihubi5pbmRleE9mKCJvbiIpPT09MCl7bGV0IFF0PVVlW25uXTtmLmlzQXJyYXkoUXQpP1F0LmZvckVhY2goaXI9Pmd0KG5uLGlyLHZ0LGl0KSk6Z3Qobm4sUXQsdnQsaXQpfX0pLHF0PT09InBhZ2UiKSl7aXQuX19pc1Zpc2libGU9ITA7dHJ5e0IodnQsVC5PTl9MT0FELGl0LmF0dHJzLl9fcGFnZVF1ZXJ5KSxkZWxldGUgaXQuYXR0cnMuX19wYWdlUXVlcnksQih2dCxULk9OX1NIT1cpfWNhdGNoKG5uKXtjb25zb2xlLmVycm9yKG5uLm1lc3NhZ2UrVC5MSU5FRkVFRCtubi5zdGFjayl9fX1mdW5jdGlvbiBWbihVZSxpdCl7c3QoaXQsVWUuJHJlbmRlcmpzLFVlWyIkIitULlJFTkRFUkpTX01PRFVMRVNdKX1mdW5jdGlvbiBzdChVZSxpdCx2dD17fSl7aWYoIWYuaXNBcnJheShpdCkpcmV0dXJuO2xldCBxdD1VZS51aWQsbm49VWUuJHd4c01vZHVsZXN8fChVZS4kd3hzTW9kdWxlcz1bXSksUXQ9VWUuY3R4O2l0LmZvckVhY2goaXI9Pnt2dFtpcl0mJihRdFtpcl09WShxdCx2dFtpcl0saXIpLG5uLnB1c2goaXIpKX0pfWZ1bmN0aW9uIFkoVWUsaXQsdnQpe2xldCBxdD17fTtyZXR1cm4gbmV3IFByb3h5KHF0LHtnZXQobm4sUXQpe3JldHVybiBxdFtRdF18fChxdFtRdF09dGUoVWUsaXQsdnQsUXQpKX19KX1mdW5jdGlvbiB0ZShVZSxpdCx2dCxxdCl7bGV0IG5uPSgpPT57fSxRdD0oKT0+VC5XWFNfUFJPVE9DT0wrSlNPTi5zdHJpbmdpZnkoW1VlLGl0LHZ0KyIuIitxdF0pO3JldHVybiBuZXcgUHJveHkobm4se2dldChpcixscil7cmV0dXJuIGxyPT09InRvSlNPTiI/UXQ6bm5bbHJdfHwobm5bbHJdPXRlKFVlLGl0LHZ0KyIuIitxdCxscikpfSxhcHBseShpcixscixMaSl7cmV0dXJuIFQuV1hTX1BST1RPQ09MK0pTT04uc3RyaW5naWZ5KFtVZSxpdCx2dCsiLiIrcXQsWy4uLkxpXV0pfX0pfWZ1bmN0aW9uIEVuKFVlLGl0KXtzdChpdCxVZS4kd3hzLFVlWyIkIitULldYU19NT0RVTEVTXSl9ZnVuY3Rpb24geW4oVWUsaXQsdnQpe0VuKFVlLGl0KSxWbihVZSxpdCksdm4oVWUsaXQsdnQpfWZ1bmN0aW9uIGxuKFVlLGl0LHZ0KXtyZXR1cm4gVWVbaXRdPXZ0fWZ1bmN0aW9uICRuKFVlKXtyZXR1cm4gZnVuY3Rpb24odnQscXQsbm4pe2lmKCFxdCl0aHJvdyB2dDtsZXQgUXQ9VWUuX2luc3RhbmNlO2lmKCFRdHx8IVF0LnByb3h5KXRocm93IHZ0O0IoUXQucHJveHksVC5PTl9FUlJPUix2dCl9fWZ1bmN0aW9uIGFuKFVlLGl0KXtyZXR1cm4gVWU/Wy4uLm5ldyBTZXQoW10uY29uY2F0KFVlLGl0KSldOml0fWZ1bmN0aW9uIGtuKFVlKXtULlVuaUxpZmVjeWNsZUhvb2tzLmZvckVhY2goaXQ9PntVZVtpdF09YW59KX1sZXQgVW4sbW49IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Iixzbj0vXig/OltBLVphLXpcZCsvXXs0fSkqPyg/OltBLVphLXpcZCsvXXsyfSg/Oj09KT98W0EtWmEtelxkKy9dezN9PT8pPyQvO3R5cGVvZiBhdG9iIT0iZnVuY3Rpb24iP1VuPWZ1bmN0aW9uKFVlKXtpZihVZT1TdHJpbmcoVWUpLnJlcGxhY2UoL1tcdFxuXGZcciBdKy9nLCIiKSwhc24udGVzdChVZSkpdGhyb3cgbmV3IEVycm9yKCJGYWlsZWQgdG8gZXhlY3V0ZSAnYXRvYicgb24gJ1dpbmRvdyc6IFRoZSBzdHJpbmcgdG8gYmUgZGVjb2RlZCBpcyBub3QgY29ycmVjdGx5IGVuY29kZWQuIik7VWUrPSI9PSIuc2xpY2UoMi0oVWUubGVuZ3RoJjMpKTtmb3IodmFyIGl0LHZ0PSIiLHF0LG5uLFF0PTA7UXQ8VWUubGVuZ3RoOylpdD1tbi5pbmRleE9mKFVlLmNoYXJBdChRdCsrKSk8PDE4fG1uLmluZGV4T2YoVWUuY2hhckF0KFF0KyspKTw8MTJ8KHF0PW1uLmluZGV4T2YoVWUuY2hhckF0KFF0KyspKSk8PDZ8KG5uPW1uLmluZGV4T2YoVWUuY2hhckF0KFF0KyspKSksdnQrPXF0PT09NjQ/U3RyaW5nLmZyb21DaGFyQ29kZShpdD4+MTYmMjU1KTpubj09PTY0P1N0cmluZy5mcm9tQ2hhckNvZGUoaXQ+PjE2JjI1NSxpdD4+OCYyNTUpOlN0cmluZy5mcm9tQ2hhckNvZGUoaXQ+PjE2JjI1NSxpdD4+OCYyNTUsaXQmMjU1KTtyZXR1cm4gdnR9OlVuPWF0b2I7ZnVuY3Rpb24gX24oVWUpe3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoVW4oVWUpLnNwbGl0KCIiKS5tYXAoZnVuY3Rpb24oaXQpe3JldHVybiIlIisoIjAwIitpdC5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTIpfSkuam9pbigiIikpfWZ1bmN0aW9uIFJuKCl7bGV0IFVlPWwuZ2V0U3RvcmFnZVN5bmMoInVuaV9pZF90b2tlbiIpfHwiIixpdD1VZS5zcGxpdCgiLiIpO2lmKCFVZXx8aXQubGVuZ3RoIT09MylyZXR1cm57dWlkOm51bGwscm9sZTpbXSxwZXJtaXNzaW9uOltdLHRva2VuRXhwaXJlZDowfTtsZXQgdnQ7dHJ5e3Z0PUpTT04ucGFyc2UoX24oaXRbMV0pKX1jYXRjaChxdCl7dGhyb3cgbmV3IEVycm9yKCJcdTgzQjdcdTUzRDZcdTVGNTNcdTUyNERcdTc1MjhcdTYyMzdcdTRGRTFcdTYwNkZcdTUxRkFcdTk1MTlcdUZGMENcdThCRTZcdTdFQzZcdTk1MTlcdThCRUZcdTRGRTFcdTYwNkZcdTRFM0FcdUZGMUEiK3F0Lm1lc3NhZ2UpfXJldHVybiB2dC50b2tlbkV4cGlyZWQ9dnQuZXhwKjFlMyxkZWxldGUgdnQuZXhwLGRlbGV0ZSB2dC5pYXQsdnR9ZnVuY3Rpb24ga3IoVWUpe1VlLnVuaUlESGFzUm9sZT1mdW5jdGlvbihpdCl7bGV0e3JvbGU6dnR9PVJuKCk7cmV0dXJuIHZ0LmluZGV4T2YoaXQpPi0xfSxVZS51bmlJREhhc1Blcm1pc3Npb249ZnVuY3Rpb24oaXQpe2xldHtwZXJtaXNzaW9uOnZ0fT1SbigpO3JldHVybiB0aGlzLnVuaUlESGFzUm9sZSgiYWRtaW4iKXx8dnQuaW5kZXhPZihpdCk+LTF9LFVlLnVuaUlEVG9rZW5WYWxpZD1mdW5jdGlvbigpe2xldHt0b2tlbkV4cGlyZWQ6aXR9PVJuKCk7cmV0dXJuIGl0PkRhdGUubm93KCl9fWZ1bmN0aW9uIFpyKFVlKXtsZXQgaXQ9VWUuX2NvbnRleHQuY29uZmlnO2YuaXNGdW5jdGlvbihVZS5fY29tcG9uZW50Lm9uRXJyb3IpJiYoaXQuZXJyb3JIYW5kbGVyPSRuKFVlKSksa24oaXQub3B0aW9uTWVyZ2VTdHJhdGVnaWVzKTtsZXQgdnQ9aXQuZ2xvYmFsUHJvcGVydGllcztrcih2dCksdnQuJHNldD1sbix2dC4kYXBwbHlPcHRpb25zPXluLFQuaW52b2tlQ3JlYXRlVnVlQXBwSG9vayhVZSl9cmV0dXJuIE4uaW5pdEFwcD1acixPYmplY3QuZGVmaW5lUHJvcGVydHkoTiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksTn0oe30sayxfLEEpO3JldHVybiBTfWZ1bmN0aW9uIGV1KGcse252dWU6bCxVbmlTaGFyZWQ6XyxWdWVTaGFyZWQ6QSxWdWVSZWFjdGl2aXR5Omt9KXtsZXQgUz17cGxhdGZvcm06bC5jb25maWcuZW52LnBsYXRmb3JtLFVuaVNoYXJlZDpfLFZ1ZVNoYXJlZDpBLFZ1ZVJlYWN0aXZpdHk6a307cmV0dXJuIGcoUyxsLmRvY3VtZW50KX1mdW5jdGlvbiBBUCh7c2V0VGltZW91dDpnLGNsZWFyVGltZW91dDpsLHVuaTpfLGdldEN1cnJlbnRQYWdlczpBLFZ1ZTprLHdlZXg6UyxwbHVzOk4sQnJvYWRjYXN0Q2hhbm5lbDpmLFVuaVZpZXdKU0JyaWRnZTpULFZ1ZVNoYXJlZDp6ZSxVbmlTaGFyZWQ6eHR9KXt2YXIgcG49ZnVuY3Rpb24oQixndCx2bil7InVzZSBzdHJpY3QiO2xldCBWbj1bIm5hdmlnYXRlIiwicmVkaXJlY3QiLCJzd2l0Y2hUYWIiLCJyZUxhdW5jaCIsIm5hdmlnYXRlQmFjayJdLHN0PVsic2xpZGUtaW4tcmlnaHQiLCJzbGlkZS1pbi1sZWZ0Iiwic2xpZGUtaW4tdG9wIiwic2xpZGUtaW4tYm90dG9tIiwiZmFkZS1pbiIsInpvb20tb3V0Iiwiem9vbS1mYWRlLW91dCIsInBvcC1pbiIsIm5vbmUiXSxZPVsic2xpZGUtb3V0LXJpZ2h0Iiwic2xpZGUtb3V0LWxlZnQiLCJzbGlkZS1vdXQtdG9wIiwic2xpZGUtb3V0LWJvdHRvbSIsImZhZGUtb3V0Iiwiem9vbS1pbiIsInpvb20tZmFkZS1pbiIsInBvcC1vdXQiLCJub25lIl0sdGU9e2hvdmVyQ2xhc3M6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6Im5hdmlnYXRvci1ob3ZlciJ9LHVybDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sb3BlblR5cGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6Im5hdmlnYXRlIix2YWxpZGF0b3IobSl7cmV0dXJuIEJvb2xlYW4oflZuLmluZGV4T2YobSkpfX0sZGVsdGE6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MX0saG92ZXJTdGFydFRpbWU6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6NTB9LGhvdmVyU3RheVRpbWU6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6NjAwfSxleGlzdHM6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LGhvdmVyU3RvcFByb3BhZ2F0aW9uOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sYW5pbWF0aW9uVHlwZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIix2YWxpZGF0b3IobSl7cmV0dXJuIW18fHN0LmNvbmNhdChZKS5pbmNsdWRlcyhtKX19LGFuaW1hdGlvbkR1cmF0aW9uOnt0eXBlOltTdHJpbmcsTnVtYmVyXSxkZWZhdWx0OjMwMH19O2Z1bmN0aW9uIEVuKG0pe3JldHVybigpPT57aWYobS5vcGVuVHlwZSE9PSJuYXZpZ2F0ZUJhY2siJiYhbS51cmwpe2NvbnNvbGUuZXJyb3IoIjxuYXZpZ2F0b3IvPiBzaG91bGQgaGF2ZSB1cmwgYXR0cmlidXRlIHdoZW4gdXNpbmcgbmF2aWdhdGVUbywgcmVkaXJlY3RUbywgcmVMYXVuY2ggb3Igc3dpdGNoVGFiIik7cmV0dXJufWxldCBSPXBhcnNlSW50KG0uYW5pbWF0aW9uRHVyYXRpb24pO3N3aXRjaChtLm9wZW5UeXBlKXtjYXNlIm5hdmlnYXRlIjpfLm5hdmlnYXRlVG8oe3VybDptLnVybCxhbmltYXRpb25UeXBlOm0uYW5pbWF0aW9uVHlwZXx8InBvcC1pbiIsYW5pbWF0aW9uRHVyYXRpb246Un0pO2JyZWFrO2Nhc2UicmVkaXJlY3QiOl8ucmVkaXJlY3RUbyh7dXJsOm0udXJsLGV4aXN0czptLmV4aXN0c30pO2JyZWFrO2Nhc2Uic3dpdGNoVGFiIjpfLnN3aXRjaFRhYih7dXJsOm0udXJsfSk7YnJlYWs7Y2FzZSJyZUxhdW5jaCI6Xy5yZUxhdW5jaCh7dXJsOm0udXJsfSk7YnJlYWs7Y2FzZSJuYXZpZ2F0ZUJhY2siOl8ubmF2aWdhdGVCYWNrKHtkZWx0YTptLmRlbHRhLGFuaW1hdGlvblR5cGU6bS5hbmltYXRpb25UeXBlfHwicG9wLW91dCIsYW5pbWF0aW9uRHVyYXRpb246Un0pO2JyZWFrfX19ZnVuY3Rpb24geW4obSl7aWYobS5ob3ZlckNsYXNzJiZtLmhvdmVyQ2xhc3MhPT0ibm9uZSIpe2xldCBSPXtob3ZlckNsYXNzOm0uaG92ZXJDbGFzc307cmV0dXJuIGd0Lmhhc093bihtLCJob3ZlclN0YXJ0VGltZSIpJiYoUi5ob3ZlclN0YXJ0VGltZT1tLmhvdmVyU3RhcnRUaW1lKSxndC5oYXNPd24obSwiaG92ZXJTdGF5VGltZSIpJiYoUi5ob3ZlclN0YXlUaW1lPW0uaG92ZXJTdGF5VGltZSksZ3QuaGFzT3duKG0sImhvdmVyU3RvcFByb3BhZ2F0aW9uIikmJihSLmhvdmVyU3RvcFByb3BhZ2F0aW9uPW0uaG92ZXJTdG9wUHJvcGFnYXRpb24pLFJ9cmV0dXJue319ZnVuY3Rpb24gbG4obSxSKXtyZXR1cm4gQi5jcmVhdGVFbGVtZW50Vk5vZGUoInUtdGV4dCIsZ3QuZXh0ZW5kKHthcHBlbmRBc1RyZWU6ITB9LFIpLG0pfWxldCAkbj1beyJuYXZpZ2F0b3ItaG92ZXIiOnsiIjp7YmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDAuMSkiLG9wYWNpdHk6Ljd9fX1dO3ZhciBhbj1CLmRlZmluZUNvbXBvbmVudCh7bmFtZToiTmF2aWdhdG9yIixwcm9wczp0ZSxzdHlsZXM6JG4sc2V0dXAobSx7c2xvdHM6Un0pe2xldCB6PUVuKG0pO3JldHVybigpPT5CLmNyZWF0ZVZOb2RlKCJ2aWV3IixCLm1lcmdlUHJvcHMoeW4obSkse29uQ2xpY2s6en0pLFtSLmRlZmF1bHQmJlIuZGVmYXVsdCgpXSl9fSk7ZnVuY3Rpb24ga24obSl7cmV0dXJuIFN5bWJvbChtKX1mdW5jdGlvbiBVbigpe3JldHVybiBCLmdldEN1cnJlbnRJbnN0YW5jZSgpLnJvb3QucHJveHkuJHBhZ2UuaWR9bGV0IG1uLHNuLF9uO2Z1bmN0aW9uIFJuKCl7cmV0dXJuIHR5cGVvZiB3aW5kb3c9PSJvYmplY3QiJiZ0eXBlb2YgbmF2aWdhdG9yPT0ib2JqZWN0IiYmdHlwZW9mIGRvY3VtZW50PT0ib2JqZWN0Ij8id2VidmlldyI6InY4In1mdW5jdGlvbiBrcigpe3JldHVybiBtbi53ZWJ2aWV3LmN1cnJlbnRXZWJ2aWV3KCkuaWR9bGV0IFpyLFVlLGl0PXt9O2Z1bmN0aW9uIHZ0KG0pe2xldCBSPW0uZGF0YSYmbS5kYXRhLl9fbWVzc2FnZTtpZighUnx8IVIuX19wYWdlKXJldHVybjtsZXQgej1SLl9fcGFnZSxqPWl0W3pdO2omJmooUiksUi5rZWVwfHxkZWxldGUgaXRbel19ZnVuY3Rpb24gcXQobSxSKXtSbigpPT09InY4Ij9fbj8oWnImJlpyLmNsb3NlKCksWnI9bmV3IF9uKGtyKCkpLFpyLm9ubWVzc2FnZT12dCk6VWV8fChVZT1zbi5yZXF1aXJlTW9kdWxlKCJnbG9iYWxFdmVudCIpLFVlLmFkZEV2ZW50TGlzdGVuZXIoInBsdXNNZXNzYWdlIix2dCkpOndpbmRvdy5fX3BsdXNNZXNzYWdlPXZ0LGl0W21dPVJ9Y2xhc3Mgbm57Y29uc3RydWN0b3IoUil7dGhpcy53ZWJ2aWV3PVJ9c2VuZE1lc3NhZ2UoUil7bGV0IHo9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh7X19tZXNzYWdlOntkYXRhOlJ9fSkpLGo9dGhpcy53ZWJ2aWV3LmlkO19uP25ldyBfbihqKS5wb3N0TWVzc2FnZSh6KTptbi53ZWJ2aWV3LnBvc3RNZXNzYWdlVG9VbmlOVmlldyYmbW4ud2Vidmlldy5wb3N0TWVzc2FnZVRvVW5pTlZpZXcoeixqKX1jbG9zZSgpe3RoaXMud2Vidmlldy5jbG9zZSgpfX1mdW5jdGlvbiBRdCh7Y29udGV4dDptPXt9LHVybDpSLGRhdGE6ej17fSxzdHlsZTpqPXt9LG9uTWVzc2FnZTpaLG9uQ2xvc2U6UX0pe21uPW0ucGx1c3x8Tixzbj1tLndlZXh8fCh0eXBlb2YgUz09Im9iamVjdCI/UzpudWxsKSxfbj1tLkJyb2FkY2FzdENoYW5uZWx8fCh0eXBlb2YgZj09Im9iamVjdCI/ZjpudWxsKTtsZXQgY2U9e2F1dG9CYWNrQnV0dG9uOiEwLHRpdGxlU2l6ZToiMTdweCJ9LGJlPWBwYWdlJHtEYXRlLm5vdygpfWA7aj1ndC5leHRlbmQoe30saiksai50aXRsZU5WaWV3IT09ITEmJmoudGl0bGVOVmlldyE9PSJub25lIiYmKGoudGl0bGVOVmlldz1ndC5leHRlbmQoY2Usai50aXRsZU5WaWV3KSk7bGV0IE9lPXt0b3A6MCxib3R0b206MCx1c2luZ0NvbXBvbmVudHM6e30scG9wR2VzdHVyZToiY2xvc2UiLHNjcm9sbEluZGljYXRvcjoibm9uZSIsYW5pbWF0aW9uVHlwZToicG9wLWluIixhbmltYXRpb25EdXJhdGlvbjoyMDAsdW5pTlZpZXc6e3BhdGg6YC8ke1J9LmpzYCxkZWZhdWx0Rm9udFNpemU6MTYsdmlld3BvcnQ6bW4uc2NyZWVuLnJlc29sdXRpb25XaWR0aH19O2o9Z3QuZXh0ZW5kKE9lLGopO2xldCBOZT1tbi53ZWJ2aWV3LmNyZWF0ZSgiIixiZSxqLHtleHRyYXM6e2Zyb206a3IoKSxydW50aW1lOlJuKCksZGF0YTp6LHVzZUdsb2JhbEV2ZW50OiFfbn19KTtyZXR1cm4gTmUuYWRkRXZlbnRMaXN0ZW5lcigiY2xvc2UiLFEpLHF0KGJlLHZlPT57Z3QuaXNGdW5jdGlvbihaKSYmWih2ZS5kYXRhKSx2ZS5rZWVwfHxOZS5jbG9zZSgiYXV0byIpfSksTmUuc2hvdyhqLmFuaW1hdGlvblR5cGUsai5hbmltYXRpb25EdXJhdGlvbiksbmV3IG5uKE5lKX1sZXQgaXI9e2Zvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn19LGxyPWtuKCJ1bCIpO2Z1bmN0aW9uIExpKCl7bGV0IG09W107cmV0dXJuIEIucHJvdmlkZShscix7YWRkSGFuZGxlcihSKXttLnB1c2goUil9LHJlbW92ZUhhbmRsZXIoUil7bS5zcGxpY2UobS5pbmRleE9mKFIpLDEpfX0pLG19dmFyIERpPUIuZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJMYWJlbCIscHJvcHM6aXIsc3R5bGVzOltdLHNldHVwKG0se3Nsb3RzOlJ9KXtsZXQgej1VbigpLGo9TGkoKSxaPVE9PnttLmZvcj9ULmVtaXQoYHVuaS1sYWJlbC1jbGljay0ke3p9LSR7bS5mb3J9YCxRLCEwKTpqLmxlbmd0aCYmalswXShRLCEwKX07cmV0dXJuKCk9PkIuY3JlYXRlVk5vZGUoInZpZXciLHtvbkNsaWNrOlp9LFtSLmRlZmF1bHQmJlIuZGVmYXVsdCgpXSl9fSk7ZnVuY3Rpb24geG4obSxSKXt3cihtLmlkLFIpLEIud2F0Y2goKCk9Pm0uaWQsKHosaik9PntVcihqLFIsITApLHdyKHosUiwhMCl9KSxCLm9uVW5tb3VudGVkKCgpPT57VXIobS5pZCxSKX0pfWZ1bmN0aW9uIHdyKG0sUix6KXtsZXQgaj1VbigpO3omJiFtfHwhZ3QuaXNQbGFpbk9iamVjdChSKXx8T2JqZWN0LmtleXMoUikuZm9yRWFjaChaPT57ej9aLmluZGV4T2YoIkAiKSE9PTAmJlouaW5kZXhPZigidW5pLSIpIT09MCYmVC5vbihgdW5pLSR7Wn0tJHtqfS0ke219YCxSW1pdKTpaLmluZGV4T2YoInVuaS0iKT09PTA/VC5vbihaLFJbWl0pOm0mJlQub24oYHVuaS0ke1p9LSR7an0tJHttfWAsUltaXSl9KX1mdW5jdGlvbiBVcihtLFIseil7bGV0IGo9VW4oKTt6JiYhbXx8IWd0LmlzUGxhaW5PYmplY3QoUil8fE9iamVjdC5rZXlzKFIpLmZvckVhY2goWj0+e3o/Wi5pbmRleE9mKCJAIikhPT0wJiZaLmluZGV4T2YoInVuaS0iKSE9PTAmJlQub2ZmKGB1bmktJHtafS0ke2p9LSR7bX1gLFJbWl0pOlouaW5kZXhPZigidW5pLSIpPT09MD9ULm9mZihaLFJbWl0pOm0mJlQub2ZmKGB1bmktJHtafS0ke2p9LSR7bX1gLFJbWl0pfSl9ZnVuY3Rpb24gSHIobSl7cmV0dXJuIE9iamVjdC5rZXlzKG0pLm1hcChSPT5bUixtW1JdXSl9bGV0IFppPVsiY2xhc3MiLCJzdHlsZSJdLFhpPS9eb25bQS1aXSsvLE9vPShtPXt9KT0+e2xldHtleGNsdWRlTGlzdGVuZXJzOlI9ITEsZXhjbHVkZUtleXM6ej1bXX09bSxqPUIuZ2V0Q3VycmVudEluc3RhbmNlKCksWj1CLnNoYWxsb3dSZWYoe30pLFE9Qi5zaGFsbG93UmVmKHt9KSxjZT1CLnNoYWxsb3dSZWYoe30pLGJlPXouY29uY2F0KFppKTtyZXR1cm4gai5hdHRycz1CLnJlYWN0aXZlKGouYXR0cnMpLEIud2F0Y2hFZmZlY3QoKCk9PntsZXQgT2U9SHIoai5hdHRycykucmVkdWNlKChOZSxbdmUsRmVdKT0+KGJlLmluY2x1ZGVzKHZlKT9OZS5leGNsdWRlW3ZlXT1GZTpYaS50ZXN0KHZlKT8oUnx8KE5lLmF0dHJzW3ZlXT1GZSksTmUubGlzdGVuZXJzW3ZlXT1GZSk6TmUuYXR0cnNbdmVdPUZlLE5lKSx7ZXhjbHVkZTp7fSxhdHRyczp7fSxsaXN0ZW5lcnM6e319KTtaLnZhbHVlPU9lLmF0dHJzLFEudmFsdWU9T2UubGlzdGVuZXJzLGNlLnZhbHVlPU9lLmV4Y2x1ZGV9KSx7JGF0dHJzOlosJGxpc3RlbmVyczpRLCRleGNsdWRlQXR0cnM6Y2V9fSxUbz17aWQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LGhvdmVyQ2xhc3M6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6ImJ1dHRvbi1ob3ZlciJ9LGhvdmVyU3RhcnRUaW1lOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjIwfSxob3ZlclN0YXlUaW1lOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjcwfSxob3ZlclN0b3BQcm9wYWdhdGlvbjp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LGRpc2FibGVkOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sZm9ybVR5cGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LG9wZW5UeXBlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxsb2FkaW5nOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0scGxhaW46e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfX0saHI9a24oInVmIiksQ249W3t1Yjp7IiI6e2ZsZXhEaXJlY3Rpb246InJvdyIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoiY2VudGVyIixwb3NpdGlvbjoicmVsYXRpdmUiLHBhZGRpbmdMZWZ0OiI1IixwYWRkaW5nUmlnaHQ6IjUiLG92ZXJmbG93OiJoaWRkZW4iLGNvbG9yOiIjMDAwMDAwIixiYWNrZ3JvdW5kQ29sb3I6IiNmOGY4ZjgiLGJvcmRlclJhZGl1czoiNSIsYm9yZGVyU3R5bGU6InNvbGlkIixib3JkZXJXaWR0aDoiMSIsYm9yZGVyQ29sb3I6IiNkYmRiZGIifX0sInViLXQiOnsiIjp7Y29sb3I6IiMwMDAwMDAiLGZvbnRTaXplOiIxOCIsdGV4dERlY29yYXRpb246Im5vbmUiLGxpbmVIZWlnaHQ6IjQ2In19LCJ1Yi1kIjp7IiI6e2JhY2tncm91bmRDb2xvcjoiI2Y4ZjhmOCJ9fSwidWItcCI6eyIiOntiYWNrZ3JvdW5kQ29sb3I6IiMwMDdhZmYiLGJvcmRlckNvbG9yOiIjMDA2MmNjIn19LCJ1Yi13Ijp7IiI6e2JhY2tncm91bmRDb2xvcjoiI2U2NDM0MCIsYm9yZGVyQ29sb3I6IiNiODM2MzMifX0sInViLWQtdCI6eyIiOntjb2xvcjoiIzAwMDAwMCJ9fSwidWItcC10Ijp7IiI6e2NvbG9yOiIjZmZmZmZmIn19LCJ1Yi13LXQiOnsiIjp7Y29sb3I6IiNmZmZmZmYifX0sInViLWQtZCI6eyIiOntiYWNrZ3JvdW5kQ29sb3I6IiNmN2Y3ZjcifX0sInViLXAtZCI6eyIiOntiYWNrZ3JvdW5kQ29sb3I6IiM2M2FjZmMiLGJvcmRlckNvbG9yOiIjNGY4YWNhIn19LCJ1Yi13LWQiOnsiIjp7YmFja2dyb3VuZENvbG9yOiIjZWM4Yjg5Iixib3JkZXJDb2xvcjoiI2JkNmY2ZSJ9fSwidWItZC10LWQiOnsiIjp7Y29sb3I6IiNjY2NjY2MifX0sInViLXAtdC1kIjp7IiI6e2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNikifX0sInViLXctdC1kIjp7IiI6e2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNikifX0sInViLWQtcGxhaW4iOnsiIjp7Ym9yZGVyQ29sb3I6IiMzNTM1MzUiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9fSwidWItcC1wbGFpbiI6eyIiOntib3JkZXJDb2xvcjoiIzAwN2FmZiIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn19LCJ1Yi13LXBsYWluIjp7IiI6e2JvcmRlckNvbG9yOiIjZTY0MzQwIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifX0sInViLWQtdC1wbGFpbiI6eyIiOntjb2xvcjoiIzM1MzUzNSJ9fSwidWItcC10LXBsYWluIjp7IiI6e2NvbG9yOiIjMDA3YWZmIn19LCJ1Yi13LXQtcGxhaW4iOnsiIjp7Y29sb3I6IiNlNjQzNDAifX0sInViLWQtZC1wbGFpbiI6eyIiOntib3JkZXJDb2xvcjoiI2M2YzZjNiIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn19LCJ1Yi1wLWQtcGxhaW4iOnsiIjp7Ym9yZGVyQ29sb3I6IiNjNmM2YzYiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9fSwidWItdy1kLXBsYWluIjp7IiI6e2JvcmRlckNvbG9yOiIjYzZjNmM2IixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifX0sInViLWQtdC1kLXBsYWluIjp7IiI6e2NvbG9yOiJyZ2JhKDAsMCwwLDAuMikifX0sInViLXAtdC1kLXBsYWluIjp7IiI6e2NvbG9yOiJyZ2JhKDAsMCwwLDAuMikifX0sInViLXctdC1kLXBsYWluIjp7IiI6e2NvbG9yOiJyZ2JhKDAsMCwwLDAuMikifX0sInViLW1pbmkiOnsiIjp7bGluZUhlaWdodDoiMzAiLGZvbnRTaXplOiIxMyIscGFkZGluZ1RvcDowLHBhZGRpbmdSaWdodDoiMTcuNSIscGFkZGluZ0JvdHRvbTowLHBhZGRpbmdMZWZ0OiIxNy41In19LCJ1Yi1sb2FkaW5nIjp7IiI6e3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsbWFyZ2luUmlnaHQ6IjEwIn19LCJ1Yi1kLWxvYWRpbmciOnsiIjp7Y29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC42KSIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn19LCJ1Yi1wLWxvYWRpbmciOnsiIjp7Y29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC42KSIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn19LCJ1Yi13LWxvYWRpbmciOnsiIjp7Y29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC42KSIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn19LCJ1Yi1kLWxvYWRpbmctcGxhaW4iOnsiIjp7Y29sb3I6IiMzNTM1MzUifX0sInViLXAtbG9hZGluZy1wbGFpbiI6eyIiOntjb2xvcjoiIzAwN2FmZiIsYmFja2dyb3VuZENvbG9yOiIjMDA2MmNjIn19LCJ1Yi13LWxvYWRpbmctcGxhaW4iOnsiIjp7Y29sb3I6IiNlNjQzNDAiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9fSwidWItZC1ob3ZlciI6eyIiOntvcGFjaXR5Oi44LGJhY2tncm91bmRDb2xvcjoiI2RlZGVkZSJ9fSwidWItcC1ob3ZlciI6eyIiOntvcGFjaXR5Oi44LGJhY2tncm91bmRDb2xvcjoiIzAwNjJjYyJ9fSwidWItdy1ob3ZlciI6eyIiOntvcGFjaXR5Oi44LGJhY2tncm91bmRDb2xvcjoiI2NlM2MzOSJ9fSwidWItZC10LWhvdmVyIjp7IiI6e2NvbG9yOiJyZ2JhKDAsMCwwLDAuNikifX0sInViLXAtdC1ob3ZlciI6eyIiOntjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjYpIn19LCJ1Yi13LXQtaG92ZXIiOnsiIjp7Y29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC42KSJ9fSwidWItZC1ob3Zlci1wbGFpbiI6eyIiOntjb2xvcjoicmdiYSg1Myw1Myw1MywwLjYpIixib3JkZXJDb2xvcjoicmdiYSg1Myw1Myw1MywwLjYpIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifX0sInViLXAtaG92ZXItcGxhaW4iOnsiIjp7Y29sb3I6InJnYmEoMjYsMTczLDI1LDAuNikiLGJvcmRlckNvbG9yOiJyZ2JhKDAsMTIyLDI1NSwwLjYpIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifX0sInViLXctaG92ZXItcGxhaW4iOnsiIjp7Y29sb3I6InJnYmEoMjMwLDY3LDY0LDAuNikiLGJvcmRlckNvbG9yOiJyZ2JhKDIzMCw2Nyw2NCwwLjYpIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifX19XSxPbj17ZGVmYXVsdDoiZCIscHJpbWFyeToicCIsd2FybjoidyJ9O3ZhciBjaT1CLmRlZmluZUNvbXBvbmVudCh7aW5oZXJpdEF0dHJzOiExLG5hbWU6IkJ1dHRvbiIscHJvcHM6Z3QuZXh0ZW5kKFRvLHt0eXBlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJkZWZhdWx0In0sc2l6ZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiZGVmYXVsdCJ9fSksc3R5bGVzOkNuLHNldHVwKG0se3Nsb3RzOlIsYXR0cnM6en0pe2xldHskYXR0cnM6aiwkZXhjbHVkZUF0dHJzOlosJGxpc3RlbmVyczpRfT1Pbyh7ZXhjbHVkZUxpc3RlbmVyczohMH0pLGNlPW0udHlwZSxiZT1CLnJlZihudWxsKSxPZT1CLmluamVjdChociwhMSksTmU9KG50LEdlKT0+e2xldCB1dD1RLnZhbHVlLm9uQ2xpY2t8fCgoKT0+e30pO2lmKG0uZGlzYWJsZWQpcmV0dXJuO3V0KG50KTtsZXQgVnQ9bS5mb3JtVHlwZTtpZihWdCl7aWYoIU9lKXJldHVybjtWdD09PSJzdWJtaXQiP09lLnN1Ym1pdChudCk6VnQ9PT0icmVzZXQiJiZPZS5yZXNldChudCl9fSx2ZT1udD0+e2xldCBHZT0idWItIitPbltjZV0rbnQ7cmV0dXJuIG0uZGlzYWJsZWQmJihHZSs9Ii1kIiksbS5wbGFpbiYmKEdlKz0iLXBsYWluIiksbS5zaXplPT09Im1pbmkiJiZudD09PSItdCImJihHZSs9IiB1Yi1taW5pIiksR2V9LEZlPW50PT57aWYobS5kaXNhYmxlZClyZXR1cm4iIjtsZXQgR2U9InViLSIrT25bY2VdK250KyItaG92ZXIiO3JldHVybiBtLnBsYWluJiYoR2UrPSItcGxhaW4iKSxHZX0scnQ9Qi5pbmplY3QobHIsITEpO3J0JiYocnQuYWRkSGFuZGxlcihOZSksQi5vbkJlZm9yZVVubW91bnQoKCk9PntydC5yZW1vdmVIYW5kbGVyKE5lKX0pKSx4bihtLHsibGFiZWwtY2xpY2siOk5lfSk7bGV0IGJ0PUIuY29tcHV0ZWQoKCk9PntsZXQgbnQ9e307Zm9yKGxldCBHZSBpbiBRLnZhbHVlKXtsZXQgdXQ9US52YWx1ZVtHZV07R2UhPT0ib25DbGljayImJihudFtHZV09dXQpfXJldHVybiBudH0pLFd0PSgpPT57aWYoIVIuZGVmYXVsdClyZXR1cm5bXTtsZXQgbnQ9Ui5kZWZhdWx0KCk7cmV0dXJuIG50Lmxlbmd0aD09PTEmJm50WzBdLnR5cGU9PT1CLlRleHQ/W2xuKG50WzBdLmNoaWxkcmVuLHtjbGFzczoidWItdCAiK3ZlKCItdCIpfSldOm50fTtyZXR1cm4oKT0+e2xldCBudD1ndC5leHRlbmQoe30seW4obSkse2hvdmVyQ2xhc3M6RmUoIiIpfSxqLnZhbHVlLFoudmFsdWUsYnQudmFsdWUpO3JldHVybiBCLmNyZWF0ZVZOb2RlKCJ2aWV3IixCLm1lcmdlUHJvcHMoe3JlZjpiZSxjbGFzczpbInViIix2ZSgiIildLG9uQ2xpY2s6TmV9LG50KSxbbS5sb2FkaW5nP0IuY3JlYXRlVk5vZGUoImxvYWRpbmctaW5kaWNhdG9yIixCLm1lcmdlUHJvcHMoe2NsYXNzOlsidWItbG9hZGluZyIsYHViLSR7T25bY2VdfS1sb2FkaW5nYF19LHthcnJvdzoiZmFsc2UiLGFuaW1hdGluZzoidHJ1ZSJ9KSxudWxsKTpudWxsLC4uLld0KCldKX19fSk7bGV0IFFpPXtzY2FsZUFyZWE6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfX07ZnVuY3Rpb24gZW8obSl7bGV0IFI9W107cmV0dXJuIGd0LmlzQXJyYXkobSkmJm0uZm9yRWFjaCh6PT57Qi5pc1ZOb2RlKHopP3oudHlwZT09PUIuRnJhZ21lbnQ/Ui5wdXNoKC4uLmVvKHouY2hpbGRyZW4pKTpSLnB1c2goeik6Z3QuaXNBcnJheSh6KSYmUi5wdXNoKC4uLmVvKHopKX0pLFJ9ZnVuY3Rpb24gZ28obSl7bGV0IFI9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gZnVuY3Rpb24oail7cmV0dXJuIFJbal18fChSW2pdPW0oaikpfX1sZXQgU2k9Z28oZnVuY3Rpb24obSl7bGV0IFI9e30sej0vOyg/IVteKF0qXCkpL2csaj0vOiguKykvO3JldHVybiBtLnNwbGl0KHopLmZvckVhY2goZnVuY3Rpb24oWil7aWYoWil7bGV0IFE9Wi5zcGxpdChqKTtRLmxlbmd0aD4xJiYoUltRWzBdLnRyaW0oKV09UVsxXS50cmltKCkpfX0pLFJ9KSxjcj1tPT5uZXcgUHJvbWlzZSgoUix6KT0+e2lmKCFtKXJldHVybiBSKHt3aWR0aDowLGhlaWdodDowLHRvcDowLGxlZnQ6MH0pO1MucmVxdWlyZU1vZHVsZSgiZG9tIikuZ2V0Q29tcG9uZW50UmVjdChtLCh7c2l6ZTpafSk9PntSKFopfSl9KTt2YXIganI9Qi5kZWZpbmVDb21wb25lbnQoe25hbWU6Ik1vdmFibGVBcmVhIixwcm9wczpRaSxzdHlsZXM6W3sidW5pLW1vdmFibGUtYXJlYSI6eyIiOntvdmVyZmxvdzoiaGlkZGVuIix3aWR0aDoiMTBweCIsaGVpZ2h0OiIxMHB4In19fV0sc2V0dXAobSx7c2xvdHM6Un0pe2xldCB6PUIucmVmKDApLGo9Qi5yZWYoMCksWj1CLnJlZigwKSxRPUIucmVmKDApLGNlPUIucmVmKCExKSxiZT1CLnJlZihudWxsKSxPZT1bXSxOZT1udWxsLHZlPUdlPT57TmU9R2V9LEZlPSgpPT5jcihiZS52YWx1ZSkudGhlbigoe3dpZHRoOkdlLGhlaWdodDp1dCx0b3A6VnQsbGVmdDpwdH0pPT57ei52YWx1ZT1HZSxqLnZhbHVlPXV0LFoudmFsdWU9VnQsUS52YWx1ZT1wdH0pLHJ0PSgpPT57RmUoKS50aGVuKCgpPT57T2UuZm9yRWFjaChmdW5jdGlvbihHZSl7R2Uuc2V0UGFyZW50KCl9KX0pfTtCLm9uTW91bnRlZCgoKT0+e2coKCk9PntjZS52YWx1ZT0hMCxydCgpfSwyMDApfSk7bGV0IGJ0PXtvblBhbnN0YXJ0KEdlKXtOZSYmTmUudG91Y2hzdGFydChHZSl9LG9uUGFubW92ZShHZSl7R2Uuc3RvcFByb3BhZ2F0aW9uKCksTmUmJk5lLnRvdWNobW92ZShHZSl9LG9uUGFuZW5kKEdlKXtOZSYmTmUudG91Y2hlbmQoR2UpLE5lPW51bGx9fSxXdD1HZT0+e09lLnB1c2goR2UpfSxudD1HZT0+e2xldCB1dD1PZS5pbmRleE9mKEdlKTt1dD49MCYmT2Uuc3BsaWNlKHV0LDEpfTtyZXR1cm4gQi5wcm92aWRlKCJfaXNNb3VudGVkIixjZSksQi5wcm92aWRlKCJwYXJlbnRTaXplIix7d2lkdGg6eixoZWlnaHQ6aix0b3A6WixsZWZ0OlF9KSxCLnByb3ZpZGUoImFkZE1vdmFibGVWaWV3Q29udGV4dCIsV3QpLEIucHJvdmlkZSgicmVtb3ZlTW92YWJsZVZpZXdDb250ZXh0IixudCksQi5wcm92aWRlKCJzZXRUb3VjaE1vdmFibGVWaWV3Q29udGV4dCIsdmUpLCgpPT57bGV0IEdlPVIuZGVmYXVsdCYmUi5kZWZhdWx0KCksdXQ9ZW8oR2UpO3JldHVybiBCLmNyZWF0ZVZOb2RlKCJ2aWV3IixCLm1lcmdlUHJvcHMoe3JlZjpiZSxjbGFzczoidW5pLW1vdmFibGUtYXJlYSJ9LGJ0KSxbdXRdKX19fSk7ZnVuY3Rpb24gU3IobSl7bGV0IFI9e307ZnVuY3Rpb24geih2ZSxGZSl7Ult2ZV0mJlJbdmVdKEZlKX1mdW5jdGlvbiBqKHZlLEZlKXtSW3ZlXT1mdW5jdGlvbihydCl7Z3QuaXNGdW5jdGlvbihGZSkmJihydC50b3VjaGVzPXJ0LmNoYW5nZWRUb3VjaGVzLEZlKHJ0KT09PSExJiZydC5zdG9wUHJvcGFnYXRpb24oKSl9fWxldCBaPTAsUT0wLGNlPTAsYmU9MCxPZT1mdW5jdGlvbih2ZSxGZSxydCxidCl7aWYobSh7dGFyZ2V0OnZlLnRhcmdldCxjdXJyZW50VGFyZ2V0OnZlLmN1cnJlbnRUYXJnZXQsc3RvcFByb3BhZ2F0aW9uOnZlLnN0b3BQcm9wYWdhdGlvbi5iaW5kKHZlKSx0b3VjaGVzOnZlLnRvdWNoZXMsY2hhbmdlZFRvdWNoZXM6dmUuY2hhbmdlZFRvdWNoZXMsZGV0YWlsOntzdGF0ZTpGZSx4OnJ0LHk6YnQsZHg6cnQtWixkeTpidC1RLGRkeDpydC1jZSxkZHk6YnQtYmUsdGltZVN0YW1wOnZlLnRpbWVTdGFtcHx8RGF0ZS5ub3coKX19KT09PSExKXJldHVybiExfSxOZT1udWxsO3JldHVybiBqKCJ0b3VjaHN0YXJ0IixmdW5jdGlvbih2ZSl7aWYoIU5lKXJldHVybiBOZT12ZSxaPWNlPXZlLnRvdWNoZXNbMF0ucGFnZVgsUT1iZT12ZS50b3VjaGVzWzBdLnBhZ2VZLE9lKHZlLCJzdGFydCIsWixRKX0pLGooInRvdWNobW92ZSIsZnVuY3Rpb24odmUpe2lmKE5lKXtsZXQgRmU9T2UodmUsIm1vdmUiLHZlLnRvdWNoZXNbMF0ucGFnZVgsdmUudG91Y2hlc1swXS5wYWdlWSk7cmV0dXJuIGNlPXZlLnRvdWNoZXNbMF0ucGFnZVgsYmU9dmUudG91Y2hlc1swXS5wYWdlWSxGZX19KSxqKCJ0b3VjaGVuZCIsZnVuY3Rpb24odmUpe2lmKE5lKXJldHVybiBOZT1udWxsLE9lKHZlLCJlbmQiLHZlLmNoYW5nZWRUb3VjaGVzWzBdLnBhZ2VYLHZlLmNoYW5nZWRUb3VjaGVzWzBdLnBhZ2VZKX0pLHt0b3VjaHN0YXJ0OmZ1bmN0aW9uKHZlKXt6KCJ0b3VjaHN0YXJ0Iix2ZSl9LHRvdWNobW92ZTpmdW5jdGlvbih2ZSl7eigidG91Y2htb3ZlIix2ZSl9LHRvdWNoZW5kOmZ1bmN0aW9uKHZlKXt6KCJ0b3VjaGVuZCIsdmUpfX19ZnVuY3Rpb24gZ3IobSxSKXtyZXR1cm4oeixqKT0+e20udmFsdWUmJlIoeixQbyh6LG0udmFsdWUsanx8e30pKX19ZnVuY3Rpb24gUG8obSxSLHo9e30pe3JldHVybiBSPXBvKFIpLHt0eXBlOm0sdGltZVN0YW1wOkRhdGUubm93KCksdGFyZ2V0OlIsY3VycmVudFRhcmdldDpSLGRldGFpbDp6fX1sZXQgSW89dm4uY2FjaGVTdHJpbmdGdW5jdGlvbihtPT5tLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpK20uc2xpY2UoMSkpO2Z1bmN0aW9uIHBvKG0pe2xldHtvZmZzZXRMZWZ0OlIsb2Zmc2V0VG9wOnp9PW0saj1tLmF0dHIsWj17fTtyZXR1cm4gT2JqZWN0LmtleXMoanx8e30pLmZvckVhY2goUT0+e1EuaW5kZXhPZigiZGF0YSIpPT09MCYmKFpbSW8oUS5yZXBsYWNlKCJkYXRhIiwiIikpXT1qW1FdKX0pLHtpZDpqJiZqLmlkfHwiIixkYXRhc2V0Olosb2Zmc2V0TGVmdDpSfHwwLG9mZnNldFRvcDp6fHwwfX1mdW5jdGlvbiBScihtLFIseil7cmV0dXJuIG0+Ui16JiZtPFIren1mdW5jdGlvbiB1cihtLFIpe3JldHVybiBScihtLDAsUil9ZnVuY3Rpb24gQXIoKXt9QXIucHJvdG90eXBlLng9ZnVuY3Rpb24obSl7cmV0dXJuIE1hdGguc3FydChtKX07ZnVuY3Rpb24gWHIobSxSKXt0aGlzLl9tPW0sdGhpcy5fZj0xZTMqUix0aGlzLl9zdGFydFRpbWU9MCx0aGlzLl92PTB9WHIucHJvdG90eXBlLnNldFY9ZnVuY3Rpb24obSxSKXtsZXQgej1NYXRoLnBvdyhNYXRoLnBvdyhtLDIpK01hdGgucG93KFIsMiksLjUpO3RoaXMuX3hfdj1tLHRoaXMuX3lfdj1SLHRoaXMuX3hfYT0tdGhpcy5fZip0aGlzLl94X3Yveix0aGlzLl95X2E9LXRoaXMuX2YqdGhpcy5feV92L3osdGhpcy5fdD1NYXRoLmFicyhtL3RoaXMuX3hfYSl8fE1hdGguYWJzKFIvdGhpcy5feV9hKSx0aGlzLl9sYXN0RHQ9bnVsbCx0aGlzLl9zdGFydFRpbWU9bmV3IERhdGUoKS5nZXRUaW1lKCl9LFhyLnByb3RvdHlwZS5zZXRTPWZ1bmN0aW9uKG0sUil7dGhpcy5feF9zPW0sdGhpcy5feV9zPVJ9LFhyLnByb3RvdHlwZS5zPWZ1bmN0aW9uKG0pe209PT12b2lkIDAmJihtPShuZXcgRGF0ZSgpLmdldFRpbWUoKS10aGlzLl9zdGFydFRpbWUpLzFlMyksbT50aGlzLl90JiYobT10aGlzLl90LHRoaXMuX2xhc3REdD1tKTtsZXQgUj10aGlzLl94X3YqbSsuNSp0aGlzLl94X2EqTWF0aC5wb3cobSwyKSt0aGlzLl94X3Msej10aGlzLl95X3YqbSsuNSp0aGlzLl95X2EqTWF0aC5wb3cobSwyKSt0aGlzLl95X3M7cmV0dXJuKHRoaXMuX3hfYT4wJiZSPHRoaXMuX2VuZFBvc2l0aW9uWHx8dGhpcy5feF9hPDAmJlI+dGhpcy5fZW5kUG9zaXRpb25YKSYmKFI9dGhpcy5fZW5kUG9zaXRpb25YKSwodGhpcy5feV9hPjAmJno8dGhpcy5fZW5kUG9zaXRpb25ZfHx0aGlzLl95X2E8MCYmej50aGlzLl9lbmRQb3NpdGlvblkpJiYoej10aGlzLl9lbmRQb3NpdGlvblkpLHt4OlIseTp6fX0sWHIucHJvdG90eXBlLmRzPWZ1bmN0aW9uKG0pe3JldHVybiBtPT09dm9pZCAwJiYobT0obmV3IERhdGUoKS5nZXRUaW1lKCktdGhpcy5fc3RhcnRUaW1lKS8xZTMpLG0+dGhpcy5fdCYmKG09dGhpcy5fdCkse2R4OnRoaXMuX3hfdit0aGlzLl94X2EqbSxkeTp0aGlzLl95X3YrdGhpcy5feV9hKm19fSxYci5wcm90b3R5cGUuZGVsdGE9ZnVuY3Rpb24oKXtyZXR1cm57eDotMS41Kk1hdGgucG93KHRoaXMuX3hfdiwyKS90aGlzLl94X2F8fDAseTotMS41Kk1hdGgucG93KHRoaXMuX3lfdiwyKS90aGlzLl95X2F8fDB9fSxYci5wcm90b3R5cGUuZHQ9ZnVuY3Rpb24oKXtyZXR1cm4tdGhpcy5feF92L3RoaXMuX3hfYX0sWHIucHJvdG90eXBlLmRvbmU9ZnVuY3Rpb24oKXtsZXQgbT1Scih0aGlzLnMoKS54LHRoaXMuX2VuZFBvc2l0aW9uWCl8fFJyKHRoaXMucygpLnksdGhpcy5fZW5kUG9zaXRpb25ZKXx8dGhpcy5fbGFzdER0PT09dGhpcy5fdDtyZXR1cm4gdGhpcy5fbGFzdER0PW51bGwsbX0sWHIucHJvdG90eXBlLnNldEVuZD1mdW5jdGlvbihtLFIpe3RoaXMuX2VuZFBvc2l0aW9uWD1tLHRoaXMuX2VuZFBvc2l0aW9uWT1SfSxYci5wcm90b3R5cGUucmVjb25maWd1cmU9ZnVuY3Rpb24obSxSKXt0aGlzLl9tPW0sdGhpcy5fZj0xZTMqUn07ZnVuY3Rpb24gem4obSxSLHope3RoaXMuX209bSx0aGlzLl9rPVIsdGhpcy5fYz16LHRoaXMuX3NvbHV0aW9uPW51bGwsdGhpcy5fZW5kUG9zaXRpb249MCx0aGlzLl9zdGFydFRpbWU9MH16bi5wcm90b3R5cGUuX3NvbHZlPWZ1bmN0aW9uKG0sUil7bGV0IHo9dGhpcy5fYyxqPXRoaXMuX20sWj10aGlzLl9rLFE9eip6LTQqaipaO2lmKFE9PT0wKXtsZXQgdmU9LXovKDIqaiksRmU9bSxydD1SLyh2ZSptKTtyZXR1cm57eDpmdW5jdGlvbihidCl7cmV0dXJuKEZlK3J0KmJ0KSpNYXRoLnBvdyhNYXRoLkUsdmUqYnQpfSxkeDpmdW5jdGlvbihidCl7bGV0IFd0PU1hdGgucG93KE1hdGguRSx2ZSpidCk7cmV0dXJuIHZlKihGZStydCpidCkqV3QrcnQqV3R9fX1pZihRPjApe2xldCB2ZT0oLXotTWF0aC5zcXJ0KFEpKS8oMipqKSxGZT0oLXorTWF0aC5zcXJ0KFEpKS8oMipqKSxydD0oUi12ZSptKS8oRmUtdmUpLGJ0PW0tcnQ7cmV0dXJue3g6ZnVuY3Rpb24oV3Qpe2xldCBudCxHZTtyZXR1cm4gV3Q9PT10aGlzLl90JiYobnQ9dGhpcy5fcG93RVIxVCxHZT10aGlzLl9wb3dFUjJUKSx0aGlzLl90PVd0LG50fHwobnQ9dGhpcy5fcG93RVIxVD1NYXRoLnBvdyhNYXRoLkUsdmUqV3QpKSxHZXx8KEdlPXRoaXMuX3Bvd0VSMlQ9TWF0aC5wb3coTWF0aC5FLEZlKld0KSksYnQqbnQrcnQqR2V9LGR4OmZ1bmN0aW9uKFd0KXtsZXQgbnQsR2U7cmV0dXJuIFd0PT09dGhpcy5fdCYmKG50PXRoaXMuX3Bvd0VSMVQsR2U9dGhpcy5fcG93RVIyVCksdGhpcy5fdD1XdCxudHx8KG50PXRoaXMuX3Bvd0VSMVQ9TWF0aC5wb3coTWF0aC5FLHZlKld0KSksR2V8fChHZT10aGlzLl9wb3dFUjJUPU1hdGgucG93KE1hdGguRSxGZSpXdCkpLGJ0KnZlKm50K3J0KkZlKkdlfX19bGV0IGNlPU1hdGguc3FydCg0KmoqWi16KnopLygyKmopLGJlPS16LzIqaixPZT1tLE5lPShSLWJlKm0pL2NlO3JldHVybnt4OmZ1bmN0aW9uKHZlKXtyZXR1cm4gTWF0aC5wb3coTWF0aC5FLGJlKnZlKSooT2UqTWF0aC5jb3MoY2UqdmUpK05lKk1hdGguc2luKGNlKnZlKSl9LGR4OmZ1bmN0aW9uKHZlKXtsZXQgRmU9TWF0aC5wb3coTWF0aC5FLGJlKnZlKSxydD1NYXRoLmNvcyhjZSp2ZSksYnQ9TWF0aC5zaW4oY2UqdmUpO3JldHVybiBGZSooTmUqY2UqcnQtT2UqY2UqYnQpK2JlKkZlKihOZSpidCtPZSpydCl9fX0sem4ucHJvdG90eXBlLng9ZnVuY3Rpb24obSl7cmV0dXJuIG09PT12b2lkIDAmJihtPShuZXcgRGF0ZSgpLmdldFRpbWUoKS10aGlzLl9zdGFydFRpbWUpLzFlMyksdGhpcy5fc29sdXRpb24/dGhpcy5fZW5kUG9zaXRpb24rdGhpcy5fc29sdXRpb24ueChtKTowfSx6bi5wcm90b3R5cGUuZHg9ZnVuY3Rpb24obSl7cmV0dXJuIG09PT12b2lkIDAmJihtPShuZXcgRGF0ZSgpLmdldFRpbWUoKS10aGlzLl9zdGFydFRpbWUpLzFlMyksdGhpcy5fc29sdXRpb24/dGhpcy5fc29sdXRpb24uZHgobSk6MH0sem4ucHJvdG90eXBlLnNldEVuZD1mdW5jdGlvbihtLFIseil7aWYoenx8KHo9bmV3IERhdGUoKS5nZXRUaW1lKCkpLG0hPT10aGlzLl9lbmRQb3NpdGlvbnx8IXVyKFIsLjEpKXtSPVJ8fDA7bGV0IGo9dGhpcy5fZW5kUG9zaXRpb247dGhpcy5fc29sdXRpb24mJih1cihSLC4xKSYmKFI9dGhpcy5fc29sdXRpb24uZHgoKHotdGhpcy5fc3RhcnRUaW1lKS8xZTMpKSxqPXRoaXMuX3NvbHV0aW9uLngoKHotdGhpcy5fc3RhcnRUaW1lKS8xZTMpLHVyKFIsLjEpJiYoUj0wKSx1cihqLC4xKSYmKGo9MCksais9dGhpcy5fZW5kUG9zaXRpb24pLHRoaXMuX3NvbHV0aW9uJiZ1cihqLW0sLjEpJiZ1cihSLC4xKXx8KHRoaXMuX2VuZFBvc2l0aW9uPW0sdGhpcy5fc29sdXRpb249dGhpcy5fc29sdmUoai10aGlzLl9lbmRQb3NpdGlvbixSKSx0aGlzLl9zdGFydFRpbWU9eil9fSx6bi5wcm90b3R5cGUuc25hcD1mdW5jdGlvbihtKXt0aGlzLl9zdGFydFRpbWU9bmV3IERhdGUoKS5nZXRUaW1lKCksdGhpcy5fZW5kUG9zaXRpb249bSx0aGlzLl9zb2x1dGlvbj17eDpmdW5jdGlvbigpe3JldHVybiAwfSxkeDpmdW5jdGlvbigpe3JldHVybiAwfX19LHpuLnByb3RvdHlwZS5kb25lPWZ1bmN0aW9uKG0pe3JldHVybiBtfHwobT1uZXcgRGF0ZSgpLmdldFRpbWUoKSksUnIodGhpcy54KCksdGhpcy5fZW5kUG9zaXRpb24sLjEpJiZ1cih0aGlzLmR4KCksLjEpfSx6bi5wcm90b3R5cGUucmVjb25maWd1cmU9ZnVuY3Rpb24obSxSLHope3RoaXMuX209bSx0aGlzLl9rPVIsdGhpcy5fYz16LHRoaXMuZG9uZSgpfHwodGhpcy5fc29sdXRpb249dGhpcy5fc29sdmUodGhpcy54KCktdGhpcy5fZW5kUG9zaXRpb24sdGhpcy5keCgpKSx0aGlzLl9zdGFydFRpbWU9bmV3IERhdGUoKS5nZXRUaW1lKCkpfSx6bi5wcm90b3R5cGUuc3ByaW5nQ29uc3RhbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fa30sem4ucHJvdG90eXBlLmRhbXBpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY30sem4ucHJvdG90eXBlLmNvbmZpZ3VyYXRpb249ZnVuY3Rpb24oKXtmdW5jdGlvbiBtKHosail7ei5yZWNvbmZpZ3VyZSgxLGosei5kYW1waW5nKCkpfWZ1bmN0aW9uIFIoeixqKXt6LnJlY29uZmlndXJlKDEsei5zcHJpbmdDb25zdGFudCgpLGopfXJldHVyblt7bGFiZWw6IlNwcmluZyBDb25zdGFudCIscmVhZDp0aGlzLnNwcmluZ0NvbnN0YW50LmJpbmQodGhpcyksd3JpdGU6bS5iaW5kKHRoaXMsdGhpcyksbWluOjEwMCxtYXg6MWUzfSx7bGFiZWw6IkRhbXBpbmciLHJlYWQ6dGhpcy5kYW1waW5nLmJpbmQodGhpcyksd3JpdGU6Ui5iaW5kKHRoaXMsdGhpcyksbWluOjEsbWF4OjUwMH1dfTtmdW5jdGlvbiB6cihtLFIseil7dGhpcy5fc3ByaW5nWD1uZXcgem4obSxSLHopLHRoaXMuX3NwcmluZ1k9bmV3IHpuKG0sUix6KSx0aGlzLl9zcHJpbmdTY2FsZT1uZXcgem4obSxSLHopLHRoaXMuX3N0YXJ0VGltZT0wfXpyLnByb3RvdHlwZS5zZXRFbmQ9ZnVuY3Rpb24obSxSLHosail7bGV0IFo9bmV3IERhdGUoKS5nZXRUaW1lKCk7dGhpcy5fc3ByaW5nWC5zZXRFbmQobSxqLFopLHRoaXMuX3NwcmluZ1kuc2V0RW5kKFIsaixaKSx0aGlzLl9zcHJpbmdTY2FsZS5zZXRFbmQoeixqLFopLHRoaXMuX3N0YXJ0VGltZT1afSx6ci5wcm90b3R5cGUueD1mdW5jdGlvbigpe2xldCBtPShuZXcgRGF0ZSgpLmdldFRpbWUoKS10aGlzLl9zdGFydFRpbWUpLzFlMztyZXR1cm57eDp0aGlzLl9zcHJpbmdYLngobSkseTp0aGlzLl9zcHJpbmdZLngobSksc2NhbGU6dGhpcy5fc3ByaW5nU2NhbGUueChtKX19LHpyLnByb3RvdHlwZS5kb25lPWZ1bmN0aW9uKCl7bGV0IG09bmV3IERhdGUoKS5nZXRUaW1lKCk7cmV0dXJuIHRoaXMuX3NwcmluZ1guZG9uZShtKSYmdGhpcy5fc3ByaW5nWS5kb25lKG0pJiZ0aGlzLl9zcHJpbmdTY2FsZS5kb25lKG0pfSx6ci5wcm90b3R5cGUucmVjb25maWd1cmU9ZnVuY3Rpb24obSxSLHope3RoaXMuX3NwcmluZ1gucmVjb25maWd1cmUobSxSLHopLHRoaXMuX3NwcmluZ1kucmVjb25maWd1cmUobSxSLHopLHRoaXMuX3NwcmluZ1NjYWxlLnJlY29uZmlndXJlKG0sUix6KX07bGV0IHRvPXtkaXJlY3Rpb246e3R5cGU6U3RyaW5nLGRlZmF1bHQ6Im5vbmUifSxpbmVydGlhOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sb3V0T2ZCb3VuZHM6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSx4Ont0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjB9LHk6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MH0sZGFtcGluZzp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDoyMH0sZnJpY3Rpb246e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6Mn0sZGlzYWJsZWQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxzY2FsZTp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LHNjYWxlTWluOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0Oi41fSxzY2FsZU1heDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDoxMH0sc2NhbGVWYWx1ZTp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDoxfSxhbmltYXRpb246e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiEwfX07ZnVuY3Rpb24gRmkobSxSKXtyZXR1cm4rKCgxZTMqbS0xZTMqUikvMWUzKS50b0ZpeGVkKDEpfWZ1bmN0aW9uIHhyKG0sUix6KXtsZXQgaj17aWQ6MCxjYW5jZWxsZWQ6ITF9LFo9ZnVuY3Rpb24oY2Upe2NlJiZjZS5pZCYmUXIoY2UuaWQpLGNlJiYoY2UuY2FuY2VsbGVkPSEwKX07ZnVuY3Rpb24gUShjZSxiZSxPZSxOZSl7aWYoIWNlfHwhY2UuY2FuY2VsbGVkKXtPZShiZSk7bGV0IHZlPWJlLmRvbmUoKTt2ZXx8Y2UuY2FuY2VsbGVkfHwoY2UuaWQ9X28oUS5iaW5kKG51bGwsY2UsYmUsT2UsTmUpKSksdmUmJk5lJiZOZShiZSl9fXJldHVybiBRKGosbSxSLHopLHtjYW5jZWw6Wi5iaW5kKG51bGwsaiksbW9kZWw6bX19bGV0IHZvPSExO2Z1bmN0aW9uIG1vKG0pe3ZvfHwodm89ITAsX28oZnVuY3Rpb24oKXttKCksdm89ITF9KSl9ZnVuY3Rpb24gX28obSl7cmV0dXJuIGcobSwxNil9ZnVuY3Rpb24gUXIobSl7bChtKX1sZXQgZWk9Uy5yZXF1aXJlTW9kdWxlKCJhbmltYXRpb24iKTt2YXIgQWk9Qi5kZWZpbmVDb21wb25lbnQoe25hbWU6Ik1vdmFibGVWaWV3Iixwcm9wczp0byxlbWl0czpbImNoYW5nZSIsInNjYWxlIl0sc3R5bGVzOlt7InVuaS1tb3ZhYmxlLXZpZXciOnsiIjp7cG9zaXRpb246ImFic29sdXRlIix0b3A6IjBweCIsbGVmdDoiMHB4Iix3aWR0aDoiMTBweCIsaGVpZ2h0OiIxMHB4In19fV0sc2V0dXAobSx7ZW1pdDpSLHNsb3RzOnp9KXtsZXQgaj1CLnJlZihudWxsKSxaPWdyKGosUiksUT1CLmluamVjdCgic2V0VG91Y2hNb3ZhYmxlVmlld0NvbnRleHQiLCgpPT57fSksY2U9dWkobSxaLGosUSk7cmV0dXJuKCk9PntsZXQgYmU9e3ByZXZlbnRHZXN0dXJlOiEwfTtyZXR1cm4gQi5jcmVhdGVWTm9kZSgidmlldyIsQi5tZXJnZVByb3BzKHtyZWY6aixvblRvdWNoc3RhcnQ6Y2UsY2xhc3M6InVuaS1tb3ZhYmxlLXZpZXciLHN0eWxlOiJ0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXI7In0sYmUpLFt6LmRlZmF1bHQmJnouZGVmYXVsdCgpXSl9fX0pO2Z1bmN0aW9uIHVpKG0sUix6LGope2xldCBaPUIuaW5qZWN0KCJfaXNNb3VudGVkIixCLnJlZighMSkpLFE9Qi5pbmplY3QoInBhcmVudFNpemUiLHt3aWR0aDpCLnJlZigwKSxoZWlnaHQ6Qi5yZWYoMCksdG9wOkIucmVmKDApLGxlZnQ6Qi5yZWYoMCl9KSxjZT1CLmluamVjdCgiYWRkTW92YWJsZVZpZXdDb250ZXh0IiwoKT0+e30pLGJlPUIuaW5qZWN0KCJyZW1vdmVNb3ZhYmxlVmlld0NvbnRleHQiLCgpPT57fSksT2U9e3RvdWNoc3RhcnQ6KCk9Pnt9LHRvdWNobW92ZTooKT0+e30sdG91Y2hlbmQ6KCk9Pnt9fTtmdW5jdGlvbiBOZShWZSl7cmV0dXJuIE51bWJlcihWZSl8fDB9ZnVuY3Rpb24gdmUoVmUpe3JldHVybiBWZT1OdW1iZXIoVmUpLGlzTmFOKFZlKT8xOlZlfWxldCBGZT1CLnJlZihOZShtLngpKSxydD1CLnJlZihOZShtLnkpKSxidD1CLnJlZih2ZShOdW1iZXIobS5zY2FsZVZhbHVlKSkpLFd0PUIucmVmKDApLG50PUIucmVmKDApLEdlPUIucmVmKDApLHV0PUIucmVmKDApLFZ0PUIucmVmKDApLHB0PUIucmVmKDApLFplPW51bGwsT3Q9bnVsbCx3bj17eDowLHk6MH0sdW49e3g6MCx5OjB9LHJuPTEsU249MCxIdD0wLExuPSExLG1pLG9yLEVyPW51bGwsQm89bnVsbCxXaT17dG9wOjAsbGVmdDowLHdpZHRoOjAsaGVpZ2h0OjB9LE1vPW5ldyBBcixMbz1uZXcgQXIsTHQ9e2hpc3RvcnlYOlswLDBdLGhpc3RvcnlZOlswLDBdLGhpc3RvcnlUOlswLDBdfSxmbj1CLmNvbXB1dGVkKCgpPT57bGV0IFZlPU51bWJlcihtLmRhbXBpbmcpO3JldHVybiBpc05hTihWZSk/MjA6VmV9KSxjbz1CLmNvbXB1dGVkKCgpPT57bGV0IFZlPU51bWJlcihtLmZyaWN0aW9uKTtyZXR1cm4gaXNOYU4oVmUpfHxWZTw9MD8yOlZlfSkscXI9Qi5jb21wdXRlZCgoKT0+e2xldCBWZT1OdW1iZXIobS5zY2FsZU1pbik7cmV0dXJuIGlzTmFOKFZlKT8uNTpWZX0pLGlpPUIuY29tcHV0ZWQoKCk9PntsZXQgVmU9TnVtYmVyKG0uc2NhbGVNYXgpO3JldHVybiBpc05hTihWZSk/MTA6VmV9KSxEbz1CLmNvbXB1dGVkKCgpPT5tLmRpcmVjdGlvbj09PSJhbGwifHxtLmRpcmVjdGlvbj09PSJob3Jpem9udGFsIiksdW89Qi5jb21wdXRlZCgoKT0+bS5kaXJlY3Rpb249PT0iYWxsInx8bS5kaXJlY3Rpb249PT0idmVydGljYWwiKSxYbj1uZXcgenIoMSw5Kk1hdGgucG93KGZuLnZhbHVlLDIpLzQwLGZuLnZhbHVlKSxZdD1uZXcgWHIoMSxjby52YWx1ZSk7Qi53YXRjaCgoKT0+bS54LFZlPT57RmUudmFsdWU9TmUoVmUpfSksQi53YXRjaCgoKT0+bS55LFZlPT57cnQudmFsdWU9TmUoVmUpfSksQi53YXRjaCgoKT0+bS5zY2FsZVZhbHVlLFZlPT57YnQudmFsdWU9dmUoTnVtYmVyKFZlKSl9KSxCLndhdGNoKEZlLEFhKSxCLndhdGNoKHJ0LFByKSxCLndhdGNoKGJ0LFRzKSxCLndhdGNoKHFyLERyKSxCLndhdGNoKGlpLERyKTtmdW5jdGlvbiBvaSgpe090JiZPdC5jYW5jZWwoKSxaZSYmWmUuY2FuY2VsKCl9ZnVuY3Rpb24gQWEoVmUpe2lmKERvLnZhbHVlKXtpZihWZSt1bi54PT09U24pcmV0dXJuIFNuO1plJiZaZS5jYW5jZWwoKSxHaShWZSt1bi54LHJ0LnZhbHVlK3VuLnkscm4pfXJldHVybiBWZX1mdW5jdGlvbiBQcihWZSl7aWYodW8udmFsdWUpe2lmKFZlK3VuLnk9PT1IdClyZXR1cm4gSHQ7WmUmJlplLmNhbmNlbCgpLEdpKEZlLnZhbHVlK3VuLngsVmUrdW4ueSxybil9cmV0dXJuIFZlfWZ1bmN0aW9uIERyKCl7aWYoIW0uc2NhbGUpcmV0dXJuITE7Q2Eocm4sITApfWZ1bmN0aW9uIFRzKFZlKXtyZXR1cm4gbS5zY2FsZT8oVmU9WW8oVmUpLENhKFZlLCEwKSxWZSk6ITF9ZnVuY3Rpb24gcnMoKXttLmRpc2FibGVkfHwob2koKSxMdC5oaXN0b3J5WD1bMCwwXSxMdC5oaXN0b3J5WT1bMCwwXSxMdC5oaXN0b3J5VD1bMCwwXSxEby52YWx1ZSYmKG1pPVNuKSx1by52YWx1ZSYmKG9yPUh0KSxFcj1udWxsLEJvPW51bGwsTG49ITApfWZ1bmN0aW9uIEduKFZlKXtpZighbS5kaXNhYmxlZCYmTG4pe2xldCBUdD1TbixSdD1IdDtpZihCbz09PW51bGwmJihCbz1NYXRoLmFicyhWZS5kZXRhaWwuZHgvVmUuZGV0YWlsLmR5KT4xPyJodG91Y2htb3ZlIjoidnRvdWNobW92ZSIpLERvLnZhbHVlJiYoVHQ9VmUuZGV0YWlsLmR4K21pLEx0Lmhpc3RvcnlYLnNoaWZ0KCksTHQuaGlzdG9yeVgucHVzaChUdCksIXVvLnZhbHVlJiZFcj09PW51bGwmJihFcj1NYXRoLmFicyhWZS5kZXRhaWwuZHgvVmUuZGV0YWlsLmR5KTwxKSksdW8udmFsdWUmJihSdD1WZS5kZXRhaWwuZHkrb3IsTHQuaGlzdG9yeVkuc2hpZnQoKSxMdC5oaXN0b3J5WS5wdXNoKFJ0KSwhRG8udmFsdWUmJkVyPT09bnVsbCYmKEVyPU1hdGguYWJzKFZlLmRldGFpbC5keS9WZS5kZXRhaWwuZHgpPDEpKSxMdC5oaXN0b3J5VC5zaGlmdCgpLEx0Lmhpc3RvcnlULnB1c2goVmUuZGV0YWlsLnRpbWVTdGFtcCksIUVyKXtsZXQgVG49InRvdWNoIjtUdDxHZS52YWx1ZT9tLm91dE9mQm91bmRzPyhUbj0idG91Y2gtb3V0LW9mLWJvdW5kcyIsVHQ9R2UudmFsdWUtTW8ueChHZS52YWx1ZS1UdCkpOlR0PUdlLnZhbHVlOlR0PlZ0LnZhbHVlJiYobS5vdXRPZkJvdW5kcz8oVG49InRvdWNoLW91dC1vZi1ib3VuZHMiLFR0PVZ0LnZhbHVlK01vLngoVHQtVnQudmFsdWUpKTpUdD1WdC52YWx1ZSksUnQ8dXQudmFsdWU/bS5vdXRPZkJvdW5kcz8oVG49InRvdWNoLW91dC1vZi1ib3VuZHMiLFJ0PXV0LnZhbHVlLUxvLngodXQudmFsdWUtUnQpKTpSdD11dC52YWx1ZTpSdD5wdC52YWx1ZSYmKG0ub3V0T2ZCb3VuZHM/KFRuPSJ0b3VjaC1vdXQtb2YtYm91bmRzIixSdD1wdC52YWx1ZStMby54KFJ0LXB0LnZhbHVlKSk6UnQ9cHQudmFsdWUpLG1vKGZ1bmN0aW9uKCl7cWkoVHQsUnQscm4sVG4pfSl9fX1mdW5jdGlvbiBBbigpe2lmKCFtLmRpc2FibGVkJiZMbiYmKExuPSExLCFFciYmIVlpKCJvdXQtb2YtYm91bmRzIikmJm0uaW5lcnRpYSkpe2xldCBWZT0xZTMqKEx0Lmhpc3RvcnlYWzFdLUx0Lmhpc3RvcnlYWzBdKS8oTHQuaGlzdG9yeVRbMV0tTHQuaGlzdG9yeVRbMF0pLFR0PTFlMyooTHQuaGlzdG9yeVlbMV0tTHQuaGlzdG9yeVlbMF0pLyhMdC5oaXN0b3J5VFsxXS1MdC5oaXN0b3J5VFswXSk7WXQuc2V0VihWZSxUdCksWXQuc2V0UyhTbixIdCk7bGV0IFJ0PVl0LmRlbHRhKCkueCxUbj1ZdC5kZWx0YSgpLnksZXI9UnQrU24sU3Q9VG4rSHQ7ZXI8R2UudmFsdWU/KGVyPUdlLnZhbHVlLFN0PUh0KyhHZS52YWx1ZS1TbikqVG4vUnQpOmVyPlZ0LnZhbHVlJiYoZXI9VnQudmFsdWUsU3Q9SHQrKFZ0LnZhbHVlLVNuKSpUbi9SdCksU3Q8dXQudmFsdWU/KFN0PXV0LnZhbHVlLGVyPVNuKyh1dC52YWx1ZS1IdCkqUnQvVG4pOlN0PnB0LnZhbHVlJiYoU3Q9cHQudmFsdWUsZXI9U24rKHB0LnZhbHVlLUh0KSpSdC9UbiksWXQuc2V0RW5kKGVyLFN0KSxPdD14cihZdCxmdW5jdGlvbigpe2xldCB5bz1ZdC5zKCksRm89eW8ueCxjYT15by55O3FpKEZvLGNhLHJuLCJmcmljdGlvbiIpfSxmdW5jdGlvbigpe090LmNhbmNlbCgpfSl9fWZ1bmN0aW9uIFFuKFZlLFR0KXtsZXQgUnQ9ITE7cmV0dXJuIFZlPlZ0LnZhbHVlPyhWZT1WdC52YWx1ZSxSdD0hMCk6VmU8R2UudmFsdWUmJihWZT1HZS52YWx1ZSxSdD0hMCksVHQ+cHQudmFsdWU/KFR0PXB0LnZhbHVlLFJ0PSEwKTpUdDx1dC52YWx1ZSYmKFR0PXV0LnZhbHVlLFJ0PSEwKSx7eDpWZSx5OlR0LG91dE9mQm91bmRzOlJ0fX1mdW5jdGlvbiBGcigpe3duLng9V2kubGVmdC1RLmxlZnQudmFsdWUsd24ueT1XaS50b3AtUS50b3AudmFsdWV9ZnVuY3Rpb24ga2koVmUpe1ZlPVZlfHxybixWZT1ZbyhWZSksbnQudmFsdWU9V2kuaGVpZ2h0L3JuLFd0LnZhbHVlPVdpLndpZHRoL3JuO2xldCBUdD1udC52YWx1ZSpWZSxSdD1XdC52YWx1ZSpWZTt1bi54PShSdC1XdC52YWx1ZSkvMix1bi55PShUdC1udC52YWx1ZSkvMn1mdW5jdGlvbiBhaSgpe2xldCBWZT0wLXduLngrdW4ueCxUdD1RLndpZHRoLnZhbHVlLVd0LnZhbHVlLXduLngtdW4ueDtHZS52YWx1ZT1NYXRoLm1pbihWZSxUdCksVnQudmFsdWU9TWF0aC5tYXgoVmUsVHQpO2xldCBSdD0wLXduLnkrdW4ueSxUbj1RLmhlaWdodC52YWx1ZS1udC52YWx1ZS13bi55LXVuLnk7dXQudmFsdWU9TWF0aC5taW4oUnQsVG4pLHB0LnZhbHVlPU1hdGgubWF4KFJ0LFRuKX1mdW5jdGlvbiBDYShWZSxUdCl7aWYobS5zY2FsZSl7VmU9WW8oVmUpLGtpKFZlKSxhaSgpO2xldCBSdD1RbihTbixIdCksVG49UnQueCxlcj1SdC55O1R0P0dpKFRuLGVyLFZlLCIiLCEwLCEwKTptbyhmdW5jdGlvbigpe3FpKFRuLGVyLFZlLCIiLCEwLCEwKX0pfX1mdW5jdGlvbiBZbyhWZSl7cmV0dXJuIFZlPU1hdGgubWF4KC41LHFyLnZhbHVlLFZlKSxWZT1NYXRoLm1pbigxMCxpaS52YWx1ZSxWZSksVmV9ZnVuY3Rpb24gR2koVmUsVHQsUnQsVG4sZXIsU3Qpe29pKCksRG8udmFsdWV8fChWZT1TbiksdW8udmFsdWV8fChUdD1IdCksbS5zY2FsZXx8KFJ0PXJuKTtsZXQgeW89UW4oVmUsVHQpO2lmKFZlPXlvLngsVHQ9eW8ueSwhbS5hbmltYXRpb24pe3FpKFZlLFR0LFJ0LFRuLGVyLFN0KTtyZXR1cm59WG4uX3NwcmluZ1guX3NvbHV0aW9uPW51bGwsWG4uX3NwcmluZ1kuX3NvbHV0aW9uPW51bGwsWG4uX3NwcmluZ1NjYWxlLl9zb2x1dGlvbj1udWxsLFhuLl9zcHJpbmdYLl9lbmRQb3NpdGlvbj1TbixYbi5fc3ByaW5nWS5fZW5kUG9zaXRpb249SHQsWG4uX3NwcmluZ1NjYWxlLl9lbmRQb3NpdGlvbj1ybixYbi5zZXRFbmQoVmUsVHQsUnQsMSksWmU9eHIoWG4sZnVuY3Rpb24oKXtsZXQgRm89WG4ueCgpLGNhPUZvLngsUHM9Rm8ueSxxbz1Gby5zY2FsZTtxaShjYSxQcyxxbyxUbixlcixTdCl9LGZ1bmN0aW9uKCl7WmUuY2FuY2VsKCl9KX1mdW5jdGlvbiBZaShWZSl7bGV0IFR0PVFuKFNuLEh0KSxSdD1UdC54LFRuPVR0LnksZXI9VHQub3V0T2ZCb3VuZHM7cmV0dXJuIGVyJiZHaShSdCxUbixybixWZSksZXJ9ZnVuY3Rpb24gcWkoVmUsVHQsUnQsVG49IiIsZXIsU3Qpe1ZlIT09bnVsbCYmVmUudG9TdHJpbmcoKSE9PSJOYU4iJiZ0eXBlb2YgVmU9PSJudW1iZXIifHwoVmU9U258fDApLFR0IT09bnVsbCYmVHQudG9TdHJpbmcoKSE9PSJOYU4iJiZ0eXBlb2YgVHQ9PSJudW1iZXIifHwoVHQ9SHR8fDApLFZlPU51bWJlcihWZS50b0ZpeGVkKDEpKSxUdD1OdW1iZXIoVHQudG9GaXhlZCgxKSksUnQ9TnVtYmVyKFJ0LnRvRml4ZWQoMSkpLFNuPT09VmUmJkh0PT09VHR8fGVyfHxSKCJjaGFuZ2UiLHt4OkZpKFZlLHVuLngpLHk6RmkoVHQsdW4ueSksc291cmNlOlRufSksbS5zY2FsZXx8KFJ0PXJuKSxSdD1ZbyhSdCksUnQ9K1J0LnRvRml4ZWQoMyksU3QmJlJ0IT09cm4mJlIoInNjYWxlIix7eDpWZSx5OlR0LHNjYWxlOlJ0fSk7bGV0IHlvPWB0cmFuc2xhdGUoJHtWZX1weCwgJHtUdH1weCkgc2NhbGUoJHtSdH0pYDtlaS50cmFuc2l0aW9uKHoudmFsdWUse3N0eWxlczp7dHJhbnNmb3JtOnlvfSxkdXJhdGlvbjowLGRlbGF5OjB9KSxTbj1WZSxIdD1UdCxybj1SdH1mdW5jdGlvbiBPYSgpe3JldHVybiBjcih6LnZhbHVlKS50aGVuKFZlPT57V2k9VmV9KX1mdW5jdGlvbiBEYSgpe2lmKCFaLnZhbHVlKXJldHVybjtvaSgpO2xldCBWZT1tLnNjYWxlP2J0LnZhbHVlOjE7RnIoKSxraShWZSksYWkoKSxTbj1GZS52YWx1ZSt1bi54LEh0PXJ0LnZhbHVlK3VuLnk7bGV0IFR0PVFuKFNuLEh0KSxSdD1UdC54LFRuPVR0Lnk7cWkoUnQsVG4sVmUsIiIsITApfXJldHVybiBCLm9uTW91bnRlZCgoKT0+e09lPVNyKFR0PT57c3dpdGNoKFR0LmRldGFpbC5zdGF0ZSl7Y2FzZSJzdGFydCI6cnMoKTticmVhaztjYXNlIm1vdmUiOkduKFR0KTticmVhaztjYXNlImVuZCI6QW4oKX19KSxnKCgpPT57T2EoKS50aGVuKCgpPT57RGEoKX0pfSwxMDApLFl0LnJlY29uZmlndXJlKDEsY28udmFsdWUpLFhuLnJlY29uZmlndXJlKDEsOSpNYXRoLnBvdyhmbi52YWx1ZSwyKS80MCxmbi52YWx1ZSk7bGV0IFZlPXtzZXRQYXJlbnQ6RGF9O2NlKFZlKSxCLm9uVW5tb3VudGVkKCgpPT57YmUoVmUpfSl9KSxCLm9uVW5tb3VudGVkKCgpPT57b2koKX0pLCgpPT57aihPZSl9fWxldCBxbj0xNixDcj17YWN0aXZlQ29sb3I6dm4uUFJJTUFSWV9DT0xPUixiYWNrZ3JvdW5kQ29sb3I6IiNFQkVCRUIiLGFjdGl2ZU1vZGU6ImJhY2t3YXJkcyJ9LFZpPXtwZXJjZW50Ont0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjAsdmFsaWRhdG9yKG0pe3JldHVybiFpc05hTihwYXJzZUZsb2F0KG0pKX19LGZvbnRTaXplOnt0eXBlOltTdHJpbmcsTnVtYmVyXSxkZWZhdWx0OnFufSxzaG93SW5mbzp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LHN0cm9rZVdpZHRoOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjYsdmFsaWRhdG9yKG0pe3JldHVybiFpc05hTihwYXJzZUZsb2F0KG0pKX19LGNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OkNyLmFjdGl2ZUNvbG9yfSxhY3RpdmVDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDpDci5hY3RpdmVDb2xvcn0sYmFja2dyb3VuZENvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OkNyLmJhY2tncm91bmRDb2xvcn0sYWN0aXZlOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sYWN0aXZlTW9kZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDpDci5hY3RpdmVNb2RlfSxkdXJhdGlvbjp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDozMCx2YWxpZGF0b3IobSl7cmV0dXJuIWlzTmFOKHBhcnNlRmxvYXQobSkpfX0sYm9yZGVyUmFkaXVzOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjB9fSxNdD1beyJ1bmktcHJvZ3Jlc3MiOnsiIjp7ZmxleDoxLGZsZXhEaXJlY3Rpb246InJvdyIsYWxpZ25JdGVtczoiY2VudGVyIn19LCJ1bmktcHJvZ3Jlc3MtYmFyIjp7IiI6e2ZsZXg6MX19LCJ1bmktcHJvZ3Jlc3MtaW5uZXItYmFyIjp7IiI6e3Bvc2l0aW9uOiJhYnNvbHV0ZSJ9fSwidW5pLXByb2dyZXNzLWluZm8iOnsiIjp7bWFyZ2luTGVmdDoiMTVweCJ9fX1dO3ZhciB5ZT1CLmRlZmluZUNvbXBvbmVudCh7bmFtZToiUHJvZ3Jlc3MiLHByb3BzOlZpLHN0eWxlczpNdCxlbWl0czpbImFjdGl2ZWVuZCJdLHNldHVwKG0se2VtaXQ6Un0pe2xldCB6PUIucmVmKG51bGwpLGo9Qi5yZWYobnVsbCksWj1ncih6LFIpLFE9Q2kobSk7cmV0dXJuIEIud2F0Y2goKCk9PlEucmVhbFBlcmNlbnQsKGNlLGJlKT0+e1EubGFzdFBlcmNlbnQ9YmV8fDAsJGkoUSxtLFopfSksQi5vbk1vdW50ZWQoKCk9PntnKCgpPT57Y3Ioai52YWx1ZSkudGhlbigoe3dpZHRoOmNlfSk9PntRLnByb2dyZXNzV2lkdGg9Y2V8fDAsJGkoUSxtLFopfSl9LDUwKX0pLCgpPT57bGV0e3Nob3dJbmZvOmNlLGZvbnRTaXplOmJlfT1tLHtvdXRlckJhclN0eWxlOk9lLGlubmVyQmFyU3R5bGU6TmUsY3VycmVudFBlcmNlbnQ6dmV9PVE7cmV0dXJuIEIuY3JlYXRlVk5vZGUoImRpdiIse3JlZjp6LGNsYXNzOiJ1bmktcHJvZ3Jlc3MifSxbQi5jcmVhdGVWTm9kZSgiZGl2Iix7cmVmOmosc3R5bGU6T2UsY2xhc3M6InVuaS1wcm9ncmVzcy1iYXIifSxbQi5jcmVhdGVWTm9kZSgiZGl2Iix7c3R5bGU6TmUsY2xhc3M6InVuaS1wcm9ncmVzcy1pbm5lci1iYXIifSxudWxsKV0pLGNlP2xuKHZlKyIlIix7Y2xhc3M6InVuaS1wcm9ncmVzcy1pbmZvIixzdHlsZTp7Zm9udFNpemU6YmV9fSk6bnVsbF0pfX19KTtmdW5jdGlvbiBDaShtKXtsZXQgUj1CLnJlZigwKSx6PUIucmVmKDApLGo9Qi5jb21wdXRlZCgoKT0+KHtiYWNrZ3JvdW5kQ29sb3I6bS5iYWNrZ3JvdW5kQ29sb3IsYm9yZGVyUmFkaXVzOm0uYm9yZGVyUmFkaXVzLGhlaWdodDptLnN0cm9rZVdpZHRofSkpLFo9Qi5jb21wdXRlZCgoKT0+e2xldCBiZT1tLmNvbG9yIT09Q3IuYWN0aXZlQ29sb3ImJm0uYWN0aXZlQ29sb3I9PT1Dci5hY3RpdmVDb2xvcj9tLmNvbG9yOm0uYWN0aXZlQ29sb3I7cmV0dXJue3dpZHRoOlIudmFsdWUqei52YWx1ZS8xMDAsaGVpZ2h0Om0uc3Ryb2tlV2lkdGgsYmFja2dyb3VuZENvbG9yOmJlLGJvcmRlclJhZGl1czptLmJvcmRlclJhZGl1c319KSxRPUIuY29tcHV0ZWQoKCk9PntsZXQgYmU9cGFyc2VGbG9hdChtLnBlcmNlbnQpO3JldHVybiBiZTwwJiYoYmU9MCksYmU+MTAwJiYoYmU9MTAwKSxiZX0pO3JldHVybiBCLnJlYWN0aXZlKHtvdXRlckJhclN0eWxlOmosaW5uZXJCYXJTdHlsZTpaLHJlYWxQZXJjZW50OlEsY3VycmVudFBlcmNlbnQ6UixzdHJva2VUaW1lcjowLGxhc3RQZXJjZW50OjAscHJvZ3Jlc3NXaWR0aDp6fSl9ZnVuY3Rpb24gJGkobSxSLHope20uc3Ryb2tlVGltZXImJmNsZWFySW50ZXJ2YWwobS5zdHJva2VUaW1lciksUi5hY3RpdmU/KG0uY3VycmVudFBlcmNlbnQ9Ui5hY3RpdmVNb2RlPT09Q3IuYWN0aXZlTW9kZT8wOm0ubGFzdFBlcmNlbnQsbS5zdHJva2VUaW1lcj1zZXRJbnRlcnZhbCgoKT0+e20uY3VycmVudFBlcmNlbnQrMT5tLnJlYWxQZXJjZW50PyhtLmN1cnJlbnRQZXJjZW50PW0ucmVhbFBlcmNlbnQsbS5zdHJva2VUaW1lciYmY2xlYXJJbnRlcnZhbChtLnN0cm9rZVRpbWVyKSx6KCJhY3RpdmVlbmQiLHt9KSk6bS5jdXJyZW50UGVyY2VudCs9MX0scGFyc2VGbG9hdChSLmR1cmF0aW9uKSkpOm0uY3VycmVudFBlcmNlbnQ9bS5yZWFsUGVyY2VudH1sZXQgV3I9e3ZhbHVlOnt0eXBlOkFycmF5LGRlZmF1bHQoKXtyZXR1cm5bXX0sdmFsaWRhdG9yOmZ1bmN0aW9uKG0pe3JldHVybiBndC5pc0FycmF5KG0pJiZtLmZpbHRlcihSPT50eXBlb2YgUj09Im51bWJlciIpLmxlbmd0aD09PW0ubGVuZ3RofX0saW5kaWNhdG9yU3R5bGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LGluZGljYXRvckNsYXNzOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxtYXNrU3R5bGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LG1hc2tDbGFzczp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn19LEJyPWd0LmV4dGVuZCh7fSxXcix7aGVpZ2h0Ont0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjB9fSk7dmFyIEhuPUIuZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJQaWNrZXJWaWV3Iixwcm9wczpCcixlbWl0czpbImNoYW5nZSIsInVwZGF0ZTp2YWx1ZSJdLHNldHVwKG0se3Nsb3RzOlIsZW1pdDp6fSl7bGV0IGo9Qi5yZWYobnVsbCksWj1CbihtKSxRPWdyKGoseiksY2U9W10sYmU9TmU9PkFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoY2UsTmUpLE9lPU5lPT5CLmNvbXB1dGVkKHtnZXQoKXtsZXQgdmU9YmUoTmUudm5vZGUpO3JldHVybiBaLnZhbHVlW3ZlXXx8MH0sc2V0KHZlKXtpZighTmUuZGF0YS5faXNNb3VudGVkKXJldHVybjtsZXQgRmU9YmUoTmUudm5vZGUpO2lmKEZlPDApcmV0dXJuO2lmKFoudmFsdWVbRmVdIT09dmUpe1oudmFsdWVbRmVdPXZlO2xldCBidD1aLnZhbHVlLm1hcChXdD0+V3QpO3ooInVwZGF0ZTp2YWx1ZSIsYnQpLFEoImNoYW5nZSIse3ZhbHVlOmJ0fSl9fX0pO3JldHVybiBCLnByb3ZpZGUoImdldFBpY2tlclZpZXdDb2x1bW4iLE9lKSxCLnByb3ZpZGUoInBpY2tlclZpZXdQcm9wcyIsbSksKCk9PntsZXQgTmU9Ui5kZWZhdWx0JiZSLmRlZmF1bHQoKTtjZT1lbyhOZSk7bGV0IHZlPW0uaGVpZ2h0P3toZWlnaHQ6YCR7cGFyc2VGbG9hdChtLmhlaWdodCl9cHhgfTp7fTtyZXR1cm4gQi5jcmVhdGVWTm9kZSgidmlldyIsQi5tZXJnZVByb3BzKHtyZWY6aixjbGFzczoidW5pLXBpY2tlci12aWV3IixzdHlsZTp2ZX0se3ByZXZlbnRHZXN0dXJlOiEwfSksW0IuY3JlYXRlVk5vZGUoInZpZXciLHtjbGFzczoidW5pLXBpY2tlci12aWV3LXdyYXBwZXIifSxbTmVdKV0pfX0sc3R5bGVzOlt7InVuaS1waWNrZXItdmlldyI6eyIiOntwb3NpdGlvbjoicmVsYXRpdmUifX0sInVuaS1waWNrZXItdmlldy13cmFwcGVyIjp7IiI6e2Rpc3BsYXk6ImZsZXgiLGZsZXhEaXJlY3Rpb246InJvdyIscG9zaXRpb246ImFic29sdXRlIix0b3A6MCxsZWZ0OjAscmlnaHQ6MCxib3R0b206MCxvdmVyZmxvdzoiaGlkZGVuIn19fV19KTtmdW5jdGlvbiBCbihtKXtsZXQgUj1CLnJlYWN0aXZlKFsuLi5tLnZhbHVlXSksej1CLnJlYWN0aXZlKHt2YWx1ZTpSfSk7cmV0dXJuIEIud2F0Y2goKCk9Pm0udmFsdWUsaj0+e3oudmFsdWUubGVuZ3RoPWoubGVuZ3RoLGouZm9yRWFjaCgoWixRKT0+e1ohPT16LnZhbHVlW1FdJiZ6LnZhbHVlLnNwbGljZShRLDEsWil9KX0pLHp9bGV0IE5vPVMucmVxdWlyZU1vZHVsZSgiZG9tIiksT2k9Uy5jb25maWcuZW52LnBsYXRmb3JtLnRvTG93ZXJDYXNlKCk9PT0iYW5kcm9pZCI7ZnVuY3Rpb24gVXQobSl7cmV0dXJuIGd0LmV4dGVuZCh7fSxndC5pc1N0cmluZyhtKT9TaShtKTptKX12YXIgZmk9Qi5kZWZpbmVDb21wb25lbnQoe25hbWU6IlBpY2tlclZpZXdDb2x1bW4iLHByb3BzOntsZW5ndGg6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MH19LGRhdGE6KCk9Pih7X2lzTW91bnRlZDohMX0pLHNldHVwKG0se3Nsb3RzOlJ9KXtsZXQgej1CLmdldEN1cnJlbnRJbnN0YW5jZSgpLGo9Qi5yZWYobnVsbCksWj1CLnJlZihudWxsKSxRPUIucmVmKG51bGwpLGNlPUIucmVmKG51bGwpLGJlPUIuaW5qZWN0KCJwaWNrZXJWaWV3UHJvcHMiKSxOZT1CLmluamVjdCgiZ2V0UGlja2VyVmlld0NvbHVtbiIpKHopLHZlPUIuY29tcHV0ZWQoKCk9PlV0KGJlLmluZGljYXRvclN0eWxlKSksRmU9Qi5jb21wdXRlZCgoKT0+VXQoYmUubWFza1N0eWxlKSkscnQ9Qi5yZWYoMCk7cnQudmFsdWU9ZGkodmUudmFsdWUpO2xldCBidD1CLnJlZigwKTtidC52YWx1ZT1wYXJzZUZsb2F0KGJlLmhlaWdodCksQi53YXRjaCgoKT0+bS5sZW5ndGgsKCk9PntnKCgpPT57bnQoTmUudmFsdWUsITAsITApfSwxNTApfSk7bGV0IFd0LG50PShwdCxaZT0hMCxPdCk9PntOZS52YWx1ZT09PXB0JiYhT3R8fChOby5zY3JvbGxUb0VsZW1lbnQoWi52YWx1ZSx7b2Zmc2V0OnB0KnJ0LnZhbHVlLGFuaW1hdGVkOlplfSksTmUudmFsdWU9cHQsWmUmJihXdD1EYXRlLm5vdygpKSl9LEdlPXB0PT57aWYoRGF0ZS5ub3coKS1XdDwzNDApcmV0dXJuO2xldCBaZT1wdC5kZXRhaWwuY29udGVudE9mZnNldC55LE90PU1hdGgucm91bmQoWmUvcnQudmFsdWUpO1plJXJ0LnZhbHVlP250KE90LCEwLCEwKTpOZS52YWx1ZT1PdH0sdXQ9KCk9PntsZXQgcHQsWmU7ZygoKT0+e1Byb21pc2UuYWxsKFtjcihqLnZhbHVlKS50aGVuKCh7aGVpZ2h0Ok90fSk9PntwdD1idC52YWx1ZT1PdH0pLE9pJiZtLmxlbmd0aD9jcihRLnZhbHVlKS50aGVuKCh7aGVpZ2h0Ok90fSk9PntaZT1ydC52YWx1ZT1PdC9wYXJzZUZsb2F0KG0ubGVuZ3RoKX0pOmNyKGNlLnZhbHVlKS50aGVuKCh7aGVpZ2h0Ok90fSk9PntaZT1ydC52YWx1ZT1PdH0pXSkudGhlbigoKT0+e3B0JiZaZT9nKCgpPT57ei5kYXRhLl9pc01vdW50ZWQ9ITAsbnQoTmUudmFsdWUsITEsITApfSw1MCk6dXQoKX0pfSw1MCl9O0Iub25Nb3VudGVkKHV0KTtsZXQgVnQ9cHQ9PnB0P09pP0IuY3JlYXRlVk5vZGUoImRpdiIse3JlZjpRLHN0eWxlOiJmbGV4LWRpcmVjdGlvbjpjb2x1bW47In0sW3B0XSk6cHQ6bnVsbDtyZXR1cm4oKT0+e2xldCBwdD1SLmRlZmF1bHQmJlIuZGVmYXVsdCgpLFplPShidC52YWx1ZS1ydC52YWx1ZSkvMixPdD1gJHtidC52YWx1ZS1aZX1weGAsd249e3Nob3dTY3JvbGxiYXI6ITEsc2Nyb2xsVG9CZWdpbjohMSxkZWNlbGVyYXRpb25SYXRlOi4zLHNjcm9sbFk6ITB9O3JldHVybiBPaXx8KHduLnNjcm9sbFRvcD1OZS52YWx1ZSpydC52YWx1ZSksQi5jcmVhdGVWTm9kZSgidmlldyIse3JlZjpqLGNsYXNzOiJ1bmktcGlja2VyLXZpZXctY29sdW1uIn0sW0IuY3JlYXRlVk5vZGUoInNjcm9sbC12aWV3IixCLm1lcmdlUHJvcHMoe2NsYXNzOiJ1bmktcGlja2VyLXZpZXctZ3JvdXAiLHN0eWxlOiJmbGV4LWRpcmVjdGlvbjpjb2x1bW47IixvblNjcm9sbGVuZDpHZX0sd24pLFtCLmNyZWF0ZVZOb2RlKCJ2aWV3Iix7cmVmOlosY2xhc3M6InVuaS1waWNrZXItdmlldy1jb250ZW50IixzdHlsZTp7cGFkZGluZ1RvcDpgJHtaZX1weGAscGFkZGluZ0JvdHRvbTpgJHtaZX1weGB9fSxbVnQocHQpXSldKSxCLmNyZWF0ZVZOb2RlKCJ1LXNjYWxhYmxlIix7Y2xhc3M6InVuaS1waWNrZXItdmlldy1tYXNrIixzdHlsZTpGZS52YWx1ZX0sW0IuY3JlYXRlVk5vZGUoInUtc2NhbGFibGUiLHtjbGFzczoidW5pLXBpY2tlci12aWV3LW1hc2sgdW5pLXBpY2tlci12aWV3LW1hc2stdG9wIixzdHlsZTp7Ym90dG9tOk90fX0sbnVsbCksQi5jcmVhdGVWTm9kZSgidS1zY2FsYWJsZSIse2NsYXNzOiJ1bmktcGlja2VyLXZpZXctbWFzayB1bmktcGlja2VyLXZpZXctbWFzay1ib3R0b20iLHN0eWxlOnt0b3A6T3R9fSxudWxsKV0pLEIuY3JlYXRlVk5vZGUoInUtc2NhbGFibGUiLHtyZWY6Y2UsY2xhc3M6InVuaS1waWNrZXItdmlldy1pbmRpY2F0b3IiLHN0eWxlOmd0LmV4dGVuZCh7fSx2ZS52YWx1ZSx7dG9wOmAke1plfXB4YH0pfSxudWxsKV0pfX0sc3R5bGVzOlt7InVuaS1waWNrZXItdmlldy1jb2x1bW4iOnsiIjp7ZmxleDoxLHBvc2l0aW9uOiJyZWxhdGl2ZSIsYWxpZ25JdGVtczoic3RyZXRjaCIsb3ZlcmZsb3c6ImhpZGRlbiJ9fSwidW5pLXBpY2tlci12aWV3LW1hc2siOnsiIjp7cG9zaXRpb246ImFic29sdXRlIix0b3A6MCxsZWZ0OjAscmlnaHQ6MCxib3R0b206MCxwb2ludGVyRXZlbnRzOiJub25lIn19LCJ1bmktcGlja2VyLXZpZXctbWFzay10b3AiOnsiIjp7Ym90dG9tOjAsYmFja2dyb3VuZEltYWdlOiJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NSkscmdiYSgyNTUsIDI1NSwgMjU1LCAwLjYpKSJ9fSwidW5pLXBpY2tlci12aWV3LW1hc2stYm90dG9tIjp7IiI6e3RvcDowLGJhY2tncm91bmRJbWFnZToibGluZWFyLWdyYWRpZW50KHRvIHRvcCxyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTUpLHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42KSkifX0sInVuaS1waWNrZXItdmlldy1ncm91cCI6eyIiOntwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDowLGxlZnQ6MCxyaWdodDowLGJvdHRvbTowfX0sInVuaS1waWNrZXItdmlldy1jb250ZW50Ijp7IiI6e2ZsZXhEaXJlY3Rpb246ImNvbHVtbiIscGFkZGluZ1RvcDowLHBhZGRpbmdSaWdodDowLHBhZGRpbmdCb3R0b206MCxwYWRkaW5nTGVmdDowfX0sInVuaS1waWNrZXItdmlldy1pbmRpY2F0b3IiOnsiIjp7cG9zaXRpb246ImFic29sdXRlIixsZWZ0OjAscmlnaHQ6MCx0b3A6MCxoZWlnaHQ6IjM0cHgiLHBvaW50ZXJFdmVudHM6Im5vbmUiLGJvcmRlckNvbG9yOiIjZTVlNWU1Iixib3JkZXJUb3BXaWR0aDoiMXB4Iixib3JkZXJCb3R0b21XaWR0aDoiMXB4In19fV19KTtmdW5jdGlvbiBkaShtKXtsZXQgej0obS5oZWlnaHR8fG0ubGluZUhlaWdodHx8IiIpLm1hdGNoKC8oLT9bXGRcLl0rKXB4Lyksaj0wO3JldHVybiB6JiYoaj1wYXJzZUZsb2F0KHpbMV0pKSxqfWxldCBLdD17U0VMRUNUT1I6InNlbGVjdG9yIixNVUxUSVNFTEVDVE9SOiJtdWx0aVNlbGVjdG9yIixUSU1FOiJ0aW1lIixEQVRFOiJkYXRlIn0sV249e1lFQVI6InllYXIiLE1PTlRIOiJtb250aCIsREFZOiJkYXkifTtmdW5jdGlvbiBPcihtKXtyZXR1cm4gbT45P206YDAke219YH1mdW5jdGlvbiBJbihtLFIpe209U3RyaW5nKG18fCIiKTtsZXQgej1uZXcgRGF0ZTtpZihSPT09S3QuVElNRSl7bGV0IGo9bS5zcGxpdCgiOiIpO2oubGVuZ3RoPT09MiYmei5zZXRIb3VycyhwYXJzZUludChqWzBdKSxwYXJzZUludChqWzFdKSl9ZWxzZXtsZXQgaj1tLnNwbGl0KCItIik7ai5sZW5ndGg9PT0zJiZ6LnNldEZ1bGxZZWFyKHBhcnNlSW50KGpbMF0pLHBhcnNlSW50KFN0cmluZyhwYXJzZUZsb2F0KGpbMV0pLTEpKSxwYXJzZUludChqWzJdKSl9cmV0dXJuIHp9ZnVuY3Rpb24gVGkobSl7aWYobS5tb2RlPT09S3QuVElNRSlyZXR1cm4iMDA6MDAiO2lmKG0ubW9kZT09PUt0LkRBVEUpe2xldCBSPW5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKS0xMDA7c3dpdGNoKG0uZmllbGRzKXtjYXNlIFduLllFQVI6cmV0dXJuIFI7Y2FzZSBXbi5NT05USDpyZXR1cm4gUisiLTAxIjtkZWZhdWx0OnJldHVybiBSKyItMDEtMDEifX1yZXR1cm4iIn1mdW5jdGlvbiBrbyhtKXtpZihtLm1vZGU9PT1LdC5USU1FKXJldHVybiIyMzo1OSI7aWYobS5tb2RlPT09S3QuREFURSl7bGV0IFI9bmV3IERhdGUoKS5nZXRGdWxsWWVhcigpKzEwMDtzd2l0Y2gobS5maWVsZHMpe2Nhc2UgV24uWUVBUjpyZXR1cm4gUjtjYXNlIFduLk1PTlRIOnJldHVybiBSKyItMTIiO2RlZmF1bHQ6cmV0dXJuIFIrIi0xMi0zMSJ9fXJldHVybiIifWxldCBoaT17bmFtZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0scmFuZ2U6e3R5cGU6QXJyYXksZGVmYXVsdCgpe3JldHVybltdfX0scmFuZ2VLZXk6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LHZhbHVlOnt0eXBlOltOdW1iZXIsU3RyaW5nLEFycmF5XSxkZWZhdWx0OjB9LG1vZGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6S3QuU0VMRUNUT1IsdmFsaWRhdG9yKG0pe3JldHVybiBPYmplY3QudmFsdWVzKEt0KS5pbmRleE9mKG0pPj0wfX0sZmllbGRzOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxzdGFydDp7dHlwZTpTdHJpbmcsZGVmYXVsdDpUaX0sZW5kOnt0eXBlOlN0cmluZyxkZWZhdWx0OmtvfSxkaXNhYmxlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9fTt2YXIgbm89Qi5kZWZpbmVDb21wb25lbnQoe25hbWU6IlBpY2tlciIscHJvcHM6aGksZW1pdHM6WyJjaGFuZ2UiLCJjYW5jZWwiLCJjb2x1bW5jaGFuZ2UiXSxzZXR1cChtLHtzbG90czpSLGVtaXQ6en0pe2xldCBqPUIucmVmKG51bGwpLFo9Z3Ioaix6KSxRPUIucmVmKG51bGwpLGNlPUIucmVmKG51bGwpLGJlPSgpPT57bGV0IG50PW0udmFsdWU7c3dpdGNoKG0ubW9kZSl7Y2FzZSBLdC5NVUxUSVNFTEVDVE9SOntndC5pc0FycmF5KG50KXx8KG50PVtdKSxndC5pc0FycmF5KFEudmFsdWUpfHwoUS52YWx1ZT1bXSk7bGV0IEdlPVEudmFsdWUubGVuZ3RoPU1hdGgubWF4KG50Lmxlbmd0aCxtLnJhbmdlLmxlbmd0aCk7Zm9yKGxldCB1dD0wO3V0PEdlO3V0Kyspe2xldCBWdD1OdW1iZXIobnRbdXRdKSxwdD1OdW1iZXIoUS52YWx1ZVt1dF0pLFplPWlzTmFOKFZ0KT9pc05hTihwdCk/MDpwdDpWdDtRLnZhbHVlLnNwbGljZSh1dCwxLFplPDA/MDpaZSl9fWJyZWFrO2Nhc2UgS3QuVElNRTpjYXNlIEt0LkRBVEU6US52YWx1ZT1TdHJpbmcobnQpO2JyZWFrO2RlZmF1bHQ6e2xldCBHZT1OdW1iZXIobnQpO1EudmFsdWU9R2U8MD8wOkdlO2JyZWFrfX19LE9lPW50PT57Y2UudmFsdWUmJmNlLnZhbHVlLnNlbmRNZXNzYWdlKG50KX0sTmU9bnQ9PntsZXQgR2U9e2V2ZW50OiJjYW5jZWwifTtjZS52YWx1ZT1RdCh7dXJsOiJfX3VuaWFwcHBpY2tlciIsZGF0YTpudCxzdHlsZTp7dGl0bGVOVmlldzohMSxhbmltYXRpb25UeXBlOiJub25lIixhbmltYXRpb25EdXJhdGlvbjowLGJhY2tncm91bmQ6InJnYmEoMCwwLDAsMCkiLHBvcEdlc3R1cmU6Im5vbmUifSxvbk1lc3NhZ2U6dXQ9PntsZXQgVnQ9dXQuZXZlbnQ7aWYoVnQ9PT0iY3JlYXRlZCIpe09lKG50KTtyZXR1cm59aWYoVnQ9PT0iY29sdW1uY2hhbmdlIil7ZGVsZXRlIHV0LmV2ZW50LFooVnQsdXQpO3JldHVybn1HZT11dH0sb25DbG9zZTooKT0+e2NlLnZhbHVlPW51bGw7bGV0IHV0PUdlLmV2ZW50O2RlbGV0ZSBHZS5ldmVudCx1dCYmWih1dCxHZSl9fSl9LHZlPW50PT57Ti5uYXRpdmVVSVttLm1vZGU9PT1LdC5USU1FPyJwaWNrVGltZSI6InBpY2tEYXRlIl0oR2U9PntsZXQgdXQ9R2UuZGF0ZTtaKCJjaGFuZ2UiLHt2YWx1ZTptLm1vZGU9PT1LdC5USU1FP2Ake09yKHV0LmdldEhvdXJzKCkpfToke09yKHV0LmdldE1pbnV0ZXMoKSl9YDpgJHt1dC5nZXRGdWxsWWVhcigpfS0ke09yKHV0LmdldE1vbnRoKCkrMSl9LSR7T3IodXQuZ2V0RGF0ZSgpKX1gfSl9LCgpPT57WigiY2FuY2VsIix7fSl9LG0ubW9kZT09PUt0LlRJTUU/e3RpbWU6SW4obS52YWx1ZSxLdC5USU1FKX06e2RhdGU6SW4obS52YWx1ZSxLdC5EQVRFKSxtaW5EYXRlOkluKG0uc3RhcnQsS3QuREFURSksbWF4RGF0ZTpJbihtLmVuZCxLdC5EQVRFKX0pfSxGZT1udD0+eyhudC5tb2RlPT09S3QuVElNRXx8bnQubW9kZT09PUt0LkRBVEUpJiYhbnQuZmllbGRzP3ZlKCk6KG50LmZpZWxkcz1PYmplY3QudmFsdWVzKFduKS5pbmNsdWRlcyhudC5maWVsZHMpP250LmZpZWxkczpXbi5EQVksTmUobnQpKX0scnQ9bnQ9PnttLmRpc2FibGVkfHxGZShndC5leHRlbmQoe30sbSx7dmFsdWU6US52YWx1ZSxsb2NhbGU6Xy5nZXRMb2NhbGUoKX0pKX0sYnQ9Qi5pbmplY3QoaHIsITEpLFd0PXtzdWJtaXQ6KCk9PlttLm5hbWUsUS52YWx1ZV0scmVzZXQ6KCk9Pntzd2l0Y2gobS5tb2RlKXtjYXNlIEt0LlNFTEVDVE9SOlEudmFsdWU9MDticmVhaztjYXNlIEt0Lk1VTFRJU0VMRUNUT1I6Z3QuaXNBcnJheShtLnZhbHVlKSYmKFEudmFsdWU9bS52YWx1ZS5tYXAobnQ9PjApKTticmVhaztjYXNlIEt0LkRBVEU6Y2FzZSBLdC5USU1FOlEudmFsdWU9IiI7YnJlYWt9fX07cmV0dXJuIGJ0JiYoYnQuYWRkRmllbGQoV3QpLEIub25CZWZvcmVVbm1vdW50KCgpPT5idC5yZW1vdmVGaWVsZChXdCkpKSxPYmplY3Qua2V5cyhtKS5mb3JFYWNoKG50PT57Qi53YXRjaCgoKT0+bVtudF0sR2U9PntsZXQgdXQ9e307dXRbbnRdPUdlLE9lKHV0KX0se2RlZXA6ITB9KX0pLEIud2F0Y2goKCk9Pm0udmFsdWUsYmUse2RlZXA6ITB9KSxiZSgpLCgpPT5CLmNyZWF0ZVZOb2RlKCJ2aWV3Iix7cmVmOmosb25DbGljazpydH0sW1IuZGVmYXVsdCYmUi5kZWZhdWx0KCldKX19KTtsZXQgUW89e25hbWU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LG1pbjp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDowfSxtYXg6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MTAwfSx2YWx1ZTp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDowfSxzdGVwOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjF9LGRpc2FibGVkOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sY29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiNlOWU5ZTkifSxiYWNrZ3JvdW5kQ29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiNlOWU5ZTkifSxhY3RpdmVDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIzAwN2FmZiJ9LHNlbGVjdGVkQ29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiMwMDdhZmYifSxibG9ja0NvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIjZmZmZmZmIn0sYmxvY2tTaXplOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjI4fSxzaG93VmFsdWU6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfX0sVWk9W3sidW5pLXNsaWRlciI6eyIiOntmbGV4OjEsZmxleERpcmVjdGlvbjoiY29sdW1uIixtYXJnaW5Ub3A6IjEyIixtYXJnaW5SaWdodDowLG1hcmdpbkJvdHRvbToiMTIiLG1hcmdpbkxlZnQ6MCxwYWRkaW5nVG9wOjAscGFkZGluZ1JpZ2h0OjAscGFkZGluZ0JvdHRvbTowLHBhZGRpbmdMZWZ0OjB9fSwidW5pLXNsaWRlci13cmFwcGVyIjp7IiI6e2ZsZXhEaXJlY3Rpb246InJvdyIsYWxpZ25JdGVtczoiY2VudGVyIixtaW5IZWlnaHQ6IjMwIn19LCJ1bmktc2xpZGVyLXRhcC1hcmVhIjp7IiI6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsZmxleDoxLGZsZXhEaXJlY3Rpb246ImNvbHVtbiIscGFkZGluZ1RvcDoiMTUiLHBhZGRpbmdSaWdodDowLHBhZGRpbmdCb3R0b206IjE1IixwYWRkaW5nTGVmdDowfX0sInVuaS1zbGlkZXItaGFuZGxlLXdyYXBwZXIiOnsiIjp7cG9zaXRpb246InJlbGF0aXZlIixtYXJnaW5Ub3A6MCxtYXJnaW5SaWdodDoiMTgiLG1hcmdpbkJvdHRvbTowLG1hcmdpbkxlZnQ6IjE4IixoZWlnaHQ6IjIiLGJvcmRlclJhZGl1czoiNSIsYmFja2dyb3VuZENvbG9yOiIjZTllOWU5Iix0cmFuc2l0aW9uUHJvcGVydHk6ImJhY2tncm91bmRDb2xvciIsdHJhbnNpdGlvbkR1cmF0aW9uOjMwMCx0cmFuc2l0aW9uVGltaW5nRnVuY3Rpb246ImVhc2UifX0sInVuaS1zbGlkZXItdHJhY2siOnsiIjp7aGVpZ2h0OiIyIixib3JkZXJSYWRpdXM6IjYiLGJhY2tncm91bmRDb2xvcjoiIzAwN2FmZiIsdHJhbnNpdGlvblByb3BlcnR5OiJiYWNrZ3JvdW5kQ29sb3IiLHRyYW5zaXRpb25EdXJhdGlvbjozMDAsdHJhbnNpdGlvblRpbWluZ0Z1bmN0aW9uOiJlYXNlIn19LCJ1bmktc2xpZGVyLXRodW1iIjp7IiI6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsd2lkdGg6IjI4IixoZWlnaHQ6IjI4Iixib3JkZXJSYWRpdXM6NTAsYm94U2hhZG93OiIwIDAgNHB4ICNlYmViZWIiLHRyYW5zaXRpb25Qcm9wZXJ0eToiYm9yZGVyQ29sb3IiLHRyYW5zaXRpb25EdXJhdGlvbjozMDAsdHJhbnNpdGlvblRpbWluZ0Z1bmN0aW9uOiJlYXNlIn19LCJ1bmktc2xpZGVyLXN0ZXAiOnsiIjp7cG9zaXRpb246ImFic29sdXRlIix3aWR0aDoxMDAsaGVpZ2h0OiIyIixiYWNrZ3JvdW5kOiJ0cmFuc3BhcmVudCJ9fSwidW5pLXNsaWRlci12YWx1ZSI6eyIiOntjb2xvcjoiIzg4ODg4OCIsZm9udFNpemU6IjE0IixtYXJnaW5MZWZ0OiIxNCJ9fX1dO3ZhciBLbj1CLmRlZmluZUNvbXBvbmVudCh7bmFtZToiVVNsaWRlciIscHJvcHM6UW8sc3R5bGVzOlVpLHNldHVwKG0se2VtaXQ6Un0pe2xldCB6PUIucmVmKG51bGwpLGo9Qi5yZWYobnVsbCksWj1ncih6LFIpLFE9cHIobSksY2U9Sm4obSxRLFopO3JldHVybiBNcihtLFEpLEIud2F0Y2goKCk9Pm0udmFsdWUsYmU9PntRLnNsaWRlclZhbHVlPU51bWJlcihiZSl9KSxCLm9uTW91bnRlZCgoKT0+e2coKCk9Pntjcih6LnZhbHVlKS50aGVuKCh7d2lkdGg6YmV9KT0+e1Euc2xpZGVyV2lkdGg9YmV8fDAsUS5zbGlkZXJWYWx1ZT1OdW1iZXIobS52YWx1ZSl9KX0sMTAwKX0pLCgpPT57bGV0e3Nob3dWYWx1ZTpiZX09bSx7dHJhY2tTdHlsZTpPZSx0cmFja0FjdGl2ZVN0eWxlOk5lLHRodW1iU3R5bGU6dmUsc2xpZGVyVmFsdWU6RmV9PVE7cmV0dXJuIEIuY3JlYXRlVk5vZGUoImRpdiIse2NsYXNzOiJ1bmktc2xpZGVyIixyZWY6en0sW0IuY3JlYXRlVk5vZGUoImRpdiIse2NsYXNzOiJ1bmktc2xpZGVyLXdyYXBwZXIifSxbQi5jcmVhdGVWTm9kZSgiZGl2IixCLm1lcmdlUHJvcHMoe2NsYXNzOiJ1bmktc2xpZGVyLXRhcC1hcmVhIn0sY2UpLFtCLmNyZWF0ZVZOb2RlKCJkaXYiLHtjbGFzczoidW5pLXNsaWRlci1oYW5kbGUtd3JhcHBlciIscmVmOmosc3R5bGU6T2V9LFtCLmNyZWF0ZVZOb2RlKCJkaXYiLHtjbGFzczoidW5pLXNsaWRlci10cmFjayIsc3R5bGU6TmV9LG51bGwpXSksQi5jcmVhdGVWTm9kZSgiZGl2Iix7Y2xhc3M6InVuaS1zbGlkZXItdGh1bWIiLHN0eWxlOnZlfSxudWxsKV0pLGJlP2xuKEZlKyIiLHtjbGFzczoidW5pLXNsaWRlci12YWx1ZSJ9KTpudWxsXSldKX19fSk7ZnVuY3Rpb24gcHIobSl7bGV0IFI9Qi5yZWYoMCksej1CLnJlZigwKSxqPSgpPT5tLmJhY2tncm91bmRDb2xvciE9PSIjZTllOWU5Ij9tLmJhY2tncm91bmRDb2xvcjptLmNvbG9yIT09IiMwMDdhZmYiP20uY29sb3I6IiMwMDdhZmYiLFo9KCk9Pm0uYWN0aXZlQ29sb3IhPT0iIzAwN2FmZiI/bS5hY3RpdmVDb2xvcjptLnNlbGVjdGVkQ29sb3IhPT0iI2U5ZTllOSI/bS5zZWxlY3RlZENvbG9yOiIjZTllOWU5IixRPSgpPT57bGV0IGJlPU51bWJlcihtLm1heCksT2U9TnVtYmVyKG0ubWluKTtyZXR1cm4oei52YWx1ZS1PZSkvKGJlLU9lKSpSLnZhbHVlfTtyZXR1cm4gQi5yZWFjdGl2ZSh7c2xpZGVyV2lkdGg6UixzbGlkZXJWYWx1ZTp6LHRyYWNrU3R5bGU6Qi5jb21wdXRlZCgoKT0+KHtiYWNrZ3JvdW5kQ29sb3I6aigpfSkpLHRyYWNrQWN0aXZlU3R5bGU6Qi5jb21wdXRlZCgoKT0+KHtiYWNrZ3JvdW5kQ29sb3I6WigpLHdpZHRoOlEoKX0pKSx0aHVtYlN0eWxlOkIuY29tcHV0ZWQoKCk9Pih7d2lkdGg6bS5ibG9ja1NpemUsaGVpZ2h0Om0uYmxvY2tTaXplLG1hcmdpblRvcDotbS5ibG9ja1NpemUvMixsZWZ0OlEoKSxiYWNrZ3JvdW5kQ29sb3I6bS5ibG9ja0NvbG9yfSkpfSl9ZnVuY3Rpb24gSm4obSxSLHope2xldCBqPW51bGw7ZnVuY3Rpb24gWihiZSxPZSl7bS5kaXNhYmxlZHx8KGJlPT09Im1vdmUiPyhRKE9lKSx6KCJjaGFuZ2luZyIse3ZhbHVlOlIuc2xpZGVyVmFsdWV9KSk6YmU9PT0iZW5kIiYmKFEoT2UpLHooImNoYW5nZSIse3ZhbHVlOlIuc2xpZGVyVmFsdWV9KSkpfWZ1bmN0aW9uIFEoYmUpe2JlPDAmJihiZT0wKSxiZT5SLnNsaWRlcldpZHRoJiYoYmU9Ui5zbGlkZXJXaWR0aCk7bGV0IE9lPU51bWJlcihtLm1heCksTmU9TnVtYmVyKG0ubWluKSx2ZT1OdW1iZXIobS5zdGVwKSxGZT1iZS9SLnNsaWRlcldpZHRoKk9lLU5lO3ZlPjAmJkZlPnZlJiZGZSV2ZS92ZSE9PTAmJihGZS09RmUldmUpLFIuc2xpZGVyVmFsdWU9RmUrTmV9cmV0dXJue29uVG91Y2hzdGFydChiZSl7YmUuY2hhbmdlZFRvdWNoZXMubGVuZ3RoPT09MSYmIWomJihqPWJlLFooInN0YXJ0IixiZS5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWCkpfSxvblRvdWNobW92ZShiZSl7YmUuY2hhbmdlZFRvdWNoZXMubGVuZ3RoPT09MSYmaiYmWigibW92ZSIsYmUuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVgpfSxvblRvdWNoZW5kKGJlKXtiZS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGg9PT0xJiZqJiYoaj1udWxsLFooImVuZCIsYmUuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVgpKX19fWZ1bmN0aW9uIE1yKG0sUil7bGV0IHo9Qi5pbmplY3QoaHIsITEpLGo9e3N1Ym1pdDooKT0+e2xldCBaPVsiIixudWxsXTtyZXR1cm4gbS5uYW1lJiYoWlswXT1tLm5hbWUsWlsxXT1SLnNsaWRlclZhbHVlKSxafSxyZXNldDooKT0+e1Iuc2xpZGVyVmFsdWU9TnVtYmVyKG0udmFsdWUpfX07eiYmKHouYWRkRmllbGQoaiksQi5vblVubW91bnRlZCgoKT0+e3oucmVtb3ZlRmllbGQoail9KSl9bGV0IFRyPXtuYW1lOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxjaGVja2VkOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sdHlwZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoic3dpdGNoIn0saWQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LGRpc2FibGVkOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sY29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiMwMDdhZmYifX0sSGk9e3N3aXRjaDoic3dpdGNoIixjaGVja2JveDoiY2hlY2tib3gifSx0aT17d2lkdGg6NTIsaGVpZ2h0OjMyfTt2YXIgdnI9Qi5kZWZpbmVDb21wb25lbnQoe25hbWU6IlN3aXRjaCIscHJvcHM6VHIsZW1pdHM6WyJjaGFuZ2UiXSxzZXR1cChtLHtlbWl0OlJ9KXtsZXQgej1CLnJlZihudWxsKSxqPUIucmVmKG0uY2hlY2tlZCksWj1HcihtLGopLFE9Z3IoeixSKTtCLndhdGNoKCgpPT5tLmNoZWNrZWQsT2U9PntqLnZhbHVlPU9lfSk7bGV0IGNlPXtvbkNoYW5nZShPZSl7ai52YWx1ZT1PZS5kZXRhaWwudmFsdWUsUSgiY2hhbmdlIix7dmFsdWU6ai52YWx1ZX0pfX0sYmU9KE9lLE5lKT0+e20uZGlzYWJsZWR8fChqLnZhbHVlPSFqLnZhbHVlLFEoImNoYW5nZSIse3ZhbHVlOmoudmFsdWV9KSl9O3JldHVybiBaJiYoWi5hZGRIYW5kbGVyKGJlKSxCLm9uQmVmb3JlVW5tb3VudCgoKT0+e1oucmVtb3ZlSGFuZGxlcihiZSl9KSkseG4obSx7ImxhYmVsLWNsaWNrIjpiZX0pLCgpPT57bGV0e2NvbG9yOk9lLHR5cGU6TmV9PW07cmV0dXJuIEIuY3JlYXRlVk5vZGUoImRpdiIse3JlZjp6fSxbTmU9PT1IaS5zd2l0Y2g/Qi5jcmVhdGVWTm9kZSgiZGMtc3dpdGNoIixCLm1lcmdlUHJvcHMoe2RhdGFVbmNUeXBlOiJ1bmktc3dpdGNoIn0sY2Use2NoZWNrZWQ6ai52YWx1ZSxjb2xvcjpPZX0se3N0eWxlOnRpfSksbnVsbCk6bnVsbCxOZT09PUhpLmNoZWNrYm94P0IuY3JlYXRlVk5vZGUoQi5yZXNvbHZlQ29tcG9uZW50KCJjaGVja2JveCIpLEIubWVyZ2VQcm9wcyh7c3R5bGU6e2NvbG9yOk9lfX0se2NoZWNrZWQ6ai52YWx1ZX0sY2UpLG51bGwpOm51bGxdKX19fSk7ZnVuY3Rpb24gR3IobSxSKXtsZXQgej1CLmluamVjdChociwhMSksaj1CLmluamVjdChsciwhMSksWj17c3VibWl0OigpPT57bGV0IFE9WyIiLG51bGxdO3JldHVybiBtLm5hbWUmJihRWzBdPW0ubmFtZSxRWzFdPVIudmFsdWUpLFF9LHJlc2V0OigpPT57Ui52YWx1ZT0hMX19O3JldHVybiB6JiYoei5hZGRGaWVsZChaKSxCLm9uVW5tb3VudGVkKCgpPT57ei5yZW1vdmVGaWVsZChaKX0pKSxqfWxldCBQaT17Y2hlY2tlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGlkOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxkaXNhYmxlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIjMDA3YWZmIn0sdmFsdWU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9fSxnaT1rbigidWNnIikscGk9e25hbWU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9fSxZcj1beyJ1bmktY2hlY2tib3giOnsiIjp7ZmxleERpcmVjdGlvbjoicm93IixhbGlnbkl0ZW1zOiJjZW50ZXIifX0sInVuaS1jaGVja2JveC1pbnB1dCI6eyIiOntqdXN0aWZ5Q29udGVudDoiY2VudGVyIixhbGlnbkl0ZW1zOiJjZW50ZXIiLHBvc2l0aW9uOiJyZWxhdGl2ZSIsYm9yZGVyV2lkdGg6IjEiLGJvcmRlckNvbG9yOiIjZDFkMWQxIixib3JkZXJTdHlsZToic29saWQiLGJhY2tncm91bmRDb2xvcjoiI2ZmZmZmZiIsYm9yZGVyUmFkaXVzOiIzIix3aWR0aDoiMjIiLGhlaWdodDoiMjIifX0sInVuaS1pY29uIjp7IiI6e2ZvbnRGYW1pbHk6InVuaW5jb21wb25lbnRzIixmb250U2l6ZToiMTYiLG1hcmdpbkxlZnQ6IjIiLG1hcmdpblRvcDoiMiIsY29sb3I6IiMwMDdhZmYifX0sInVuaS1jaGVja2JveC1pbnB1dC1kaXNhYmxlZCI6eyIiOntiYWNrZ3JvdW5kQ29sb3I6IiNlMWUxZTEifX0sInVuaS1jaGVja2JveC1pbnB1dC1kaXNhYmxlZC1iZWZvcmUiOnsiIjp7Y29sb3I6IiNhZGFkYWQifX0sInVuaS1jaGVja2JveC1zbG90Ijp7IiI6e2ZvbnRTaXplOiIxNiIsbWFyZ2luTGVmdDoiNSJ9fX1dO3ZhciB2aT1CLmRlZmluZUNvbXBvbmVudCh7bmFtZToiQ2hlY2tib3giLHByb3BzOlBpLHN0eWxlczpZcixzZXR1cChtLHtzbG90czpSfSl7bGV0IHo9Qi5yZWYobnVsbCksaj1CLnJlZihtLmNoZWNrZWQpLFo9Qi5yZWYobS52YWx1ZSksUT1CLmNvbXB1dGVkKCgpPT5tLmRpc2FibGVkPyIjYWRhZGFkIjptLmNvbG9yKSxjZT0oKT0+e2oudmFsdWU9ITF9LGJlPShGZSxydCk9PnttLmRpc2FibGVkfHwoai52YWx1ZT0hai52YWx1ZSxPZSYmT2UuY2hlY2tib3hDaGFuZ2UoRmUpKX0se3VuaUNoZWNrR3JvdXA6T2UsdW5pTGFiZWw6TmV9PXJvKGosWixjZSk7TmUmJihOZS5hZGRIYW5kbGVyKGJlKSxCLm9uQmVmb3JlVW5tb3VudCgoKT0+e05lLnJlbW92ZUhhbmRsZXIoYmUpfSkpLHhuKG0seyJsYWJlbC1jbGljayI6YmV9KSxCLndhdGNoKFsoKT0+bS5jaGVja2VkLCgpPT5tLnZhbHVlXSwoW0ZlLHJ0XSk9PntqLnZhbHVlPUZlLFoudmFsdWU9cnR9KTtsZXQgdmU9KCk9PntpZighUi5kZWZhdWx0KXJldHVybltdO2xldCBGZT1SLmRlZmF1bHQoKTtyZXR1cm4gRmUubGVuZ3RoPT09MSYmRmVbMF0udHlwZT09PVRleHQ/W2xuKEZlWzBdLmNoaWxkcmVuLHtjbGFzczoidW5pLWNoZWNrYm94LXNsb3QifSldOkZlfTtyZXR1cm4oKT0+Qi5jcmVhdGVWTm9kZSgiZGl2IixCLm1lcmdlUHJvcHMoe3JlZjp6fSx7ZGF0YVVuY1R5cGU6InVuaS1jaGVja2JveCJ9LHtvbkNsaWNrOmJlLGNsYXNzOiJ1bmktY2hlY2tib3gifSksW0IuY3JlYXRlVk5vZGUoImRpdiIse2NsYXNzOlsidW5pLWNoZWNrYm94LWlucHV0Iix7InVuaS1jaGVja2JveC1pbnB1dC1kaXNhYmxlZCI6bS5kaXNhYmxlZH1dfSxbai52YWx1ZT9sbigiXHVFQTA4Iix7Y2xhc3M6InVuaS1pY29uIixzdHlsZTp7Y29sb3I6US52YWx1ZX19KTpudWxsXSksLi4udmUoKV0pfX0pO2Z1bmN0aW9uIHJvKG0sUix6KXtsZXQgaj1CLmNvbXB1dGVkKCgpPT4oe2NoZWNrYm94Q2hlY2tlZDpCb29sZWFuKG0udmFsdWUpLHZhbHVlOlIudmFsdWV9KSksWj17cmVzZXQ6en0sUT1CLmluamVjdChnaSwhMSk7USYmUS5hZGRGaWVsZChqKTtsZXQgY2U9Qi5pbmplY3QoaHIsITEpO2NlJiZjZS5hZGRGaWVsZChaKTtsZXQgYmU9Qi5pbmplY3QobHIsITEpO3JldHVybiBCLm9uQmVmb3JlVW5tb3VudCgoKT0+e1EmJlEucmVtb3ZlRmllbGQoaiksY2UmJmNlLnJlbW92ZUZpZWxkKFopfSkse3VuaUNoZWNrR3JvdXA6USx1bmlGb3JtOmNlLHVuaUxhYmVsOmJlfX12YXIgamk9Qi5kZWZpbmVDb21wb25lbnQoe25hbWU6IkNoZWNrYm94R3JvdXAiLHByb3BzOnBpLGVtaXRzOlsiY2hhbmdlIl0sc2V0dXAobSx7c2xvdHM6UixlbWl0Onp9KXtsZXQgaj1CLnJlZihudWxsKSxaPWdyKGoseik7cmV0dXJuIGlvKG0sWiksKCk9PkIuY3JlYXRlVk5vZGUoImRpdiIse3JlZjpqLGNsYXNzOiJ1bmktY2hlY2tib3gtZ3JvdXAifSxbUi5kZWZhdWx0JiZSLmRlZmF1bHQoKV0pfX0pO2Z1bmN0aW9uIGlvKG0sUil7bGV0IHo9W10saj0oKT0+ei5yZWR1Y2UoKFEsY2UpPT4oY2UudmFsdWUuY2hlY2tib3hDaGVja2VkJiZRLnB1c2goY2UudmFsdWUudmFsdWUpLFEpLG5ldyBBcnJheSk7Qi5wcm92aWRlKGdpLHthZGRGaWVsZChRKXt6LnB1c2goUSl9LHJlbW92ZUZpZWxkKFEpe3ouc3BsaWNlKHouaW5kZXhPZihRKSwxKX0sY2hlY2tib3hDaGFuZ2UoUSl7UigiY2hhbmdlIix7dmFsdWU6aigpfSl9fSk7bGV0IFo9Qi5pbmplY3QoaHIsITEpO3JldHVybiBaJiZaLmFkZEZpZWxkKHtzdWJtaXQ6KCk9PntsZXQgUT1bIiIsbnVsbF07cmV0dXJuIG0ubmFtZSE9PSIiJiYoUVswXT1tLm5hbWUsUVsxXT1qKCkpLFF9fSksan1sZXQgeD17Y2hlY2tlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGlkOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxkaXNhYmxlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIjMDA3YWZmIn0sdmFsdWU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9fSxuZT1rbigidWNnIiksZGU9e25hbWU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9fSxIPVt7InVuaS1yYWRpbyI6eyIiOnthbGlnbkl0ZW1zOiJjZW50ZXIiLGZsZXhEaXJlY3Rpb246InJvdyJ9fSwidW5pLXJhZGlvLWlucHV0Ijp7IiI6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoiY2VudGVyIixtYXJnaW5SaWdodDoiNSIsYm9yZGVyU3R5bGU6InNvbGlkIixib3JkZXJXaWR0aDoiMSIsYm9yZGVyQ29sb3I6IiNkMWQxZDEiLGJvcmRlclJhZGl1czo1MCx3aWR0aDoiMjIiLGhlaWdodDoiMjIiLG91dGxpbmU6MH19LCJ1bmktcmFkaW8taW5wdXQtaWNvbiI6eyIiOntmb250RmFtaWx5OiJ1bmluY29tcG9uZW50cyIsZm9udFNpemU6IjE0Iixjb2xvcjoiI2ZmZmZmZiJ9fSwidW5pLXJhZGlvLWlucHV0LWRpc2FibGVkIjp7IiI6e2JhY2tncm91bmRDb2xvcjoiI2UxZTFlMSIsYm9yZGVyQ29sb3I6IiNkMWQxZDEiLGNvbG9yOiIjYWRhZGFkIn19LCJ1bmktcmFkaW8tc2xvdCI6eyIiOntmb250U2l6ZToiMTYiLG1hcmdpbkxlZnQ6IjUifX19XTt2YXIgTT1CLmRlZmluZUNvbXBvbmVudCh7bmFtZToiUmFkaW8iLHByb3BzOngsc3R5bGVzOkgsZW1pdHM6WyJjaGFuZ2UiXSxzZXR1cChtLHtzbG90czpSfSl7bGV0IHo9Qi5yZWYobnVsbCksaj1CLnJlZihtLmNoZWNrZWQpLFo9Qi5yZWYobS52YWx1ZSksUT1CLmNvbXB1dGVkKCgpPT57bGV0IHJ0PW0uZGlzYWJsZWQ/IiNhZGFkYWQiOm0uY29sb3I7cmV0dXJuIGoudmFsdWU/e2JhY2tncm91bmRDb2xvcjpydCxib3JkZXJDb2xvcjpydH06e2JvcmRlckNvbG9yOiIjZDFkMWQxIn19KSxjZT0oKT0+e2oudmFsdWU9ITF9LHt1bmlDaGVja0dyb3VwOmJlLHVuaUxhYmVsOk9lLGZpZWxkOk5lfT1KKGosWixjZSksdmU9KHJ0LGJ0KT0+e20uZGlzYWJsZWR8fChqLnZhbHVlPSFqLnZhbHVlLGJlJiZiZS5yYWRpb0NoYW5nZShydCxOZSkpfTtPZSYmKE9lLmFkZEhhbmRsZXIodmUpLEIub25CZWZvcmVVbm1vdW50KCgpPT57T2UucmVtb3ZlSGFuZGxlcih2ZSl9KSkseG4obSx7ImxhYmVsLWNsaWNrIjp2ZX0pLEIud2F0Y2goWygpPT5tLmNoZWNrZWQsKCk9Pm0udmFsdWVdLChbcnQsYnRdKT0+e2oudmFsdWU9cnQsWi52YWx1ZT1idH0pO2xldCBGZT0oKT0+e2lmKCFSLmRlZmF1bHQpcmV0dXJuW107bGV0IHJ0PVIuZGVmYXVsdCgpO3JldHVybiBydC5sZW5ndGg9PT0xJiZydFswXS50eXBlPT09VGV4dD9bbG4ocnRbMF0uY2hpbGRyZW4se2NsYXNzOiJ1bmktcmFkaW8tc2xvdCJ9KV06cnR9O3JldHVybigpPT57bGV0e2Rpc2FibGVkOnJ0fT1tO3JldHVybiBCLmNyZWF0ZVZOb2RlKCJkaXYiLEIubWVyZ2VQcm9wcyh7cmVmOnp9LHtkYXRhVW5jVHlwZToidW5pLXJhZGlvIn0se29uQ2xpY2s6dmUsY2xhc3M6InVuaS1yYWRpbyJ9KSxbQi5jcmVhdGVWTm9kZSgiZGl2Iix7c3R5bGU6US52YWx1ZSxjbGFzczpbInVuaS1yYWRpby1pbnB1dCIseyJ1bmktcmFkaW8taW5wdXQtZGlzYWJsZWQiOnJ0fV19LFtqLnZhbHVlP2xuKCJcdUVBMDgiLHtjbGFzczoidW5pLXJhZGlvLWlucHV0LWljb24ifSk6bnVsbF0pLC4uLkZlKCldKX19fSk7ZnVuY3Rpb24gSihtLFIseil7bGV0IGo9Qi5jb21wdXRlZCh7Z2V0OigpPT4oe3JhZGlvQ2hlY2tlZDpCb29sZWFuKG0udmFsdWUpLHZhbHVlOlIudmFsdWV9KSxzZXQ6KHtyYWRpb0NoZWNrZWQ6T2V9KT0+e20udmFsdWU9T2V9fSksWj17cmVzZXQ6en0sUT1CLmluamVjdChuZSwhMSk7USYmUS5hZGRGaWVsZChqKTtsZXQgY2U9Qi5pbmplY3QoaHIsITEpO2NlJiZjZS5hZGRGaWVsZChaKTtsZXQgYmU9Qi5pbmplY3QobHIsITEpO3JldHVybiBCLm9uQmVmb3JlVW5tb3VudCgoKT0+e1EmJlEucmVtb3ZlRmllbGQoaiksY2UmJmNlLnJlbW92ZUZpZWxkKFopfSkse3VuaUNoZWNrR3JvdXA6USx1bmlGb3JtOmNlLHVuaUxhYmVsOmJlLGZpZWxkOmp9fXZhciBYPUIuZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJSYWRpb0dyb3VwIixwcm9wczpkZSxlbWl0czpbImNoYW5nZSJdLHNldHVwKG0se3Nsb3RzOlIsZW1pdDp6fSl7bGV0IGo9Qi5yZWYobnVsbCksWj1ncihqLHopO3JldHVybiB1ZShtLFopLCgpPT5CLmNyZWF0ZVZOb2RlKCJkaXYiLHtyZWY6an0sW1IuZGVmYXVsdCYmUi5kZWZhdWx0KCldKX19KTtmdW5jdGlvbiB1ZShtLFIpe2xldCB6PVtdO0Iub25Nb3VudGVkKCgpPT57YmUoei5sZW5ndGgtMSl9KTtsZXQgaj0oKT0+e3ZhciBPZTtyZXR1cm4oT2U9ei5maW5kKE5lPT5OZS52YWx1ZS5yYWRpb0NoZWNrZWQpKT09bnVsbD92b2lkIDA6T2UudmFsdWUudmFsdWV9O0IucHJvdmlkZShuZSx7YWRkRmllbGQoT2Upe3oucHVzaChPZSl9LHJlbW92ZUZpZWxkKE9lKXt6LnNwbGljZSh6LmluZGV4T2YoT2UpLDEpfSxyYWRpb0NoYW5nZShPZSxOZSl7bGV0IHZlPXouaW5kZXhPZihOZSk7YmUodmUsITApLFIoImNoYW5nZSIse3ZhbHVlOmooKX0pfX0pO2xldCBaPUIuaW5qZWN0KGhyLCExKSxRPXtzdWJtaXQ6KCk9PntsZXQgT2U9WyIiLG51bGxdO3JldHVybiBtLm5hbWUhPT0iIiYmKE9lWzBdPW0ubmFtZSxPZVsxXT1qKCkpLE9lfX07WiYmKFouYWRkRmllbGQoUSksQi5vbkJlZm9yZVVubW91bnQoKCk9PntaLnJlbW92ZUZpZWxkKFEpfSkpO2Z1bmN0aW9uIGNlKE9lLE5lKXtPZS52YWx1ZT17cmFkaW9DaGVja2VkOk5lLHZhbHVlOk9lLnZhbHVlLnZhbHVlfX1mdW5jdGlvbiBiZShPZSxOZSl7ei5mb3JFYWNoKCh2ZSxGZSk9PntGZSE9PU9lJiZOZSYmY2UoeltGZV0sITEpfSl9cmV0dXJuIHp9bGV0IHRuPVsidS1pbnB1dCIsInUtdGV4dGFyZWEiXTt2YXIgTW49Qi5kZWZpbmVDb21wb25lbnQoe25hbWU6IkZvcm0iLGVtaXRzOlsic3VibWl0IiwicmVzZXQiXSxzZXR1cCh7fSx7c2xvdHM6bSxlbWl0OlJ9KXtsZXQgej1CLnJlZihudWxsKSxqPWdyKHosUiksWj1bXSxRO3JldHVybiBCLnByb3ZpZGUoaHIse2FkZEZpZWxkKGNlKXtaLnB1c2goY2UpfSxyZW1vdmVGaWVsZChjZSl7Wi5zcGxpY2UoWi5pbmRleE9mKGNlKSwxKX0sc3VibWl0KGNlKXtsZXQgYmU9e307USYmUShiZSk7bGV0IE9lPVoucmVkdWNlKChOZSx2ZSk9PntpZih2ZS5zdWJtaXQpe2xldFtGZSxydF09dmUuc3VibWl0KCk7RmUmJihOZVtGZV09cnQpfXJldHVybiBOZX0sT2JqZWN0LmNyZWF0ZShudWxsKSk7T2JqZWN0LmFzc2lnbihiZSxPZSksaigic3VibWl0Iix7dmFsdWU6YmV9KX0scmVzZXQoY2Upe1EmJlEoKSxaLmZvckVhY2goYmU9PmJlLnJlc2V0JiZiZS5yZXNldCgpKSxqKCJyZXNldCIsY2UpfX0pLCgpPT57bGV0IGNlPW0uZGVmYXVsdCYmbS5kZWZhdWx0KCk7cmV0dXJuIFE9Y24oY2UpLEIuY3JlYXRlVk5vZGUoInZpZXciLHtyZWY6en0sW2NlXSl9fX0pO2Z1bmN0aW9uIGNuKG0pe2xldCBSPVMucmVxdWlyZU1vZHVsZSgicGx1cyIpLHo9KGosWik9PnsoWnx8bXx8W10pLmZvckVhY2goZnVuY3Rpb24oUSl7dG4uaW5kZXhPZihTdHJpbmcoUS50eXBlKSk+PTAmJlEuZWwmJlEuZWwuYXR0ciYmUS5lbC5hdHRyLm5hbWUmJihqP2pbUS5lbC5hdHRyLm5hbWVdPVIuZ2V0VmFsdWUoUS5lbC5ub2RlSWQpOlEuZWwuc2V0VmFsdWUoIiIpKSxndC5pc0FycmF5KFEuY2hpbGRyZW4pJiZRLmNoaWxkcmVuJiZRLmNoaWxkcmVuLmxlbmd0aCYmeihqLFEuY2hpbGRyZW4pfSl9O3JldHVybiB6fWxldCBuaT17dHlwZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sc2l6ZTp7dHlwZTpbU3RyaW5nLE51bWJlcl0sZGVmYXVsdDoyM30sY29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9fSxtcj17c3VjY2VzczoiIzA5YmIwNyIsaW5mbzoiIzEwYWVmZiIsd2FybjoiI2Y3NjI2MCIsd2FpdGluZzoiIzEwYWVmZiIsc2FmZV9zdWNjZXNzOiIjMDliYjA3IixzYWZlX3dhcm46IiNmZmJlMDAiLHN1Y2Nlc3NfY2lyY2xlOiIjMDliYjA3IixzdWNjZXNzX25vX2NpcmNsZToiIzA5YmIwNyIsd2FpdGluZ19jaXJjbGU6IiMxMGFlZmYiLGNpcmNsZToiI2M5YzljOSIsZG93bmxvYWQ6IiMwOWJiMDciLGluZm9fY2lyY2xlOiIjMDliYjA3IixjYW5jZWw6IiNmNDM1MzAiLHNlYXJjaDoiI2IyYjJiMiIsY2xlYXI6IiNiMmIyYjIifSxlYT17c3VjY2VzczoiXHVFQTA2IixpbmZvOiJcdUVBMDMiLHdhcm46Ilx1RUEwQiIsd2FpdGluZzoiXHVFQTA5IixzYWZlX3N1Y2Nlc3M6Ilx1RUEwNCIsc2FmZV93YXJuOiJcdUVBMDUiLHN1Y2Nlc3NfY2lyY2xlOiJcdUVBMDciLHN1Y2Nlc3Nfbm9fY2lyY2xlOiJcdUVBMDgiLHdhaXRpbmdfY2lyY2xlOiJcdUVBMEEiLGNpcmNsZToiXHVFQTAxIixkb3dubG9hZDoiXHVFQTAyIixpbmZvX2NpcmNsZToiXHVFQTBDIixjYW5jZWw6Ilx1RUEwRCIsc2VhcmNoOiJcdUVBMEUiLGNsZWFyOiJcdUVBMEYifSx6bz1beyJ1bmktaWNvbiI6eyIiOntmb250RmFtaWx5OiJ1bmluY29tcG9uZW50cyJ9fX1dO3ZhciB0YT1CLmRlZmluZUNvbXBvbmVudCh7bmFtZToiSWNvbiIscHJvcHM6bmksc3R5bGVzOnpvLHNldHVwKG0se30pe3JldHVybigpPT5sbihlYVttLnR5cGVdLHtjbGFzczoidW5pLWljb24iLHN0eWxlOntjb2xvcjptLmNvbG9yfHxtclttLnR5cGVdLGZvbnRTaXplOm0uc2l6ZX19KX19KTtsZXQgUm89e2luZGljYXRvckRvdHM6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSx2ZXJ0aWNhbDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGF1dG9wbGF5Ont0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sY2lyY3VsYXI6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxpbnRlcnZhbDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDo1ZTN9LGR1cmF0aW9uOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjUwMH0sY3VycmVudDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDowfSxpbmRpY2F0b3JDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoicmdiYSgwLDAsMCwuMykifSxpbmRpY2F0b3JBY3RpdmVDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIzAwMDAwMCJ9LHByZXZpb3VzTWFyZ2luOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxuZXh0TWFyZ2luOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxjdXJyZW50SXRlbUlkOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxza2lwSGlkZGVuSXRlbUxheW91dDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGRpc3BsYXlNdWx0aXBsZUl0ZW1zOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjF9LGRpc2FibGVUb3VjaDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9fSxibz1TLmNvbmZpZy5lbnYucGxhdGZvcm0udG9Mb3dlckNhc2UoKT09PSJhbmRyb2lkIixvbz1beyJ1bmktc3dpcGVyIjp7IiI6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsaGVpZ2h0OiIxNTBweCJ9fSwidW5pLXN3aXBlci1zbGlkZXIiOnsiIjp7cG9zaXRpb246ImFic29sdXRlIixsZWZ0OjAsdG9wOjAscmlnaHQ6MCxib3R0b206MH19LCJ1bmktc3dpcGVyLWRvdHMiOnsiIjp7cG9zaXRpb246ImFic29sdXRlIixsZWZ0OjAscmlnaHQ6MCxib3R0b206IjEwIixoZWlnaHQ6IjEwIn19fV07dmFyIFJhPUIuZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJTd2lwZXIiLHByb3BzOlJvLHN0eWxlczpvbyxlbWl0czpbImNoYW5nZSIsInRyYW5zaXRpb24iLCJhbmltYXRpb25maW5pc2giXSxzZXR1cChtLHtzbG90czpSLGVtaXQ6en0pe2xldCBqPUIucmVmKG51bGwpLFo9W10sUT1ncihqLHopLGNlPW5hKG0pLGJlPV9hKGNlLG0sWixRKTtyZXR1cm4gQi53YXRjaChbKCk9Pm0uY3VycmVudCwoKT0+bS5jdXJyZW50SXRlbUlkXSwoW09lLE5lXSk9Pnt0cyhjZSxtLFopfSksQi5vbk1vdW50ZWQoKCk9PntnKCgpPT57Y3Ioai52YWx1ZSkudGhlbigoe3dpZHRoOk9lLGhlaWdodDpOZX0pPT57Y2Uuc3dpcGVyV2lkdGg9T2UsY2Uuc3dpcGVySGVpZ2h0PU5lfSl9LDUwKX0pLCgpPT57bGV0IE9lPVIuZGVmYXVsdCYmUi5kZWZhdWx0KCkse2luZGljYXRvclN0eWxlOk5lLGN1cnJlbnRTeW5jOnZlfT1jZTtyZXR1cm4gWj1lbyhPZSksQi5jcmVhdGVWTm9kZSgiZGl2Iix7cmVmOmosY2xhc3M6InVuaS1zd2lwZXIifSxbQi5jcmVhdGVWTm9kZSgic2xpZGVyIixCLm1lcmdlUHJvcHMoe2NsYXNzOiJ1bmktc3dpcGVyLXNsaWRlciJ9LHthdXRvUGxheTptLmF1dG9wbGF5LGludGVydmFsOm0uaW50ZXJ2YWwsaW5kZXg6dmUsa2VlcEluZGV4OiEwLHNob3dJbmRpY2F0b3JzOm0uaW5kaWNhdG9yRG90cyxpbmZpbml0ZTptLmNpcmN1bGFyLHZlcnRpY2FsOm0udmVydGljYWwsc2Nyb2xsYWJsZTohbS5kaXNhYmxlVG91Y2h9LGJlKSxbWixCLmNyZWF0ZVZOb2RlKCJpbmRpY2F0b3IiLHtjbGFzczoidW5pLXN3aXBlci1kb3RzIixzdHlsZTpOZX0sbnVsbCldKV0pfX19KTtmdW5jdGlvbiBuYShtKXtsZXQgUj1CLnJlZigwKSx6PUIucmVmKDApLGo9Qi5yZWYobS5jdXJyZW50KSxaPUIucmVmKCJhdXRvcGxheSIpLFE9Qi5jb21wdXRlZCgoKT0+KHtpdGVtQ29sb3I6bS5pbmRpY2F0b3JDb2xvcixpdGVtU2VsZWN0ZWRDb2xvcjptLmluZGljYXRvckFjdGl2ZUNvbG9yLGl0ZW1TaXplOjgsb3BhY2l0eTptLmluZGljYXRvckRvdHM/MTowfSkpO3JldHVybiBCLnJlYWN0aXZlKHtzd2lwZXJXaWR0aDpSLHN3aXBlckhlaWdodDp6LGluZGljYXRvclN0eWxlOlEsY3VycmVudFN5bmM6aixjdXJyZW50Q2hhbmdlU291cmNlOlp9KX1mdW5jdGlvbiBfYShtLFIseixqKXtsZXQgWj0wLFE9dmU9PntsZXQgRmU9dmUuZGV0YWlsLHJ0PVIudmVydGljYWwsYnQ9KHJ0P0ZlLm9mZnNldFlSYXRpbzpGZS5vZmZzZXRYUmF0aW8pfHwwO2lmKCh2ZS5kcmFnfHx2ZS5kcmFnKSYmKG0uY3VycmVudENoYW5nZVNvdXJjZT0idG91Y2giKSxidD09PTApe2xldCBXdD1NYXRoLmFicyhaKTtpZihXdD09PTEpcmV0dXJuO1d0Pi41JiYoYnQ9MSl9Wj1idCxqKCJ0cmFuc2l0aW9uIix7ZHg6cnQ/MDotbS5zd2lwZXJXaWR0aCpidCxkeTpydD8tbS5zd2lwZXJIZWlnaHQqYnQ6MH0pfSxjZT12ZT0+e2xldCBGZT0oKT0+e2ooImFuaW1hdGlvbmZpbmlzaCIsT2UoKSksbS5jdXJyZW50Q2hhbmdlU291cmNlPSJhdXRvcGxheSJ9O2JvP0ZlKCk6ZyhGZSw1MCl9LGJlPXZlPT57Z3QuaXNTdHJpbmcodmUuZGV0YWlsLnNvdXJjZSkmJihtLmN1cnJlbnRDaGFuZ2VTb3VyY2U9dmUuZGV0YWlsLnNvdXJjZSksbS5jdXJyZW50U3luYz12ZS5kZXRhaWwuaW5kZXgsWj0wfTtmdW5jdGlvbiBPZSgpe2xldCB2ZT1OdW1iZXIobS5jdXJyZW50U3luYyksRmU9elt2ZV18fHt9LHJ0PUZlLmNvbXBvbmVudEluc3RhbmNlJiZGZS5jb21wb25lbnRJbnN0YW5jZS5pdGVtSWR8fCIiO3JldHVybntjdXJyZW50OnZlLGN1cnJlbnRJdGVtSWQ6cnQsc291cmNlOm0uY3VycmVudENoYW5nZVNvdXJjZX19cmV0dXJuIEIud2F0Y2goKCk9Pm0uY3VycmVudFN5bmMsdmU9PntqKCJjaGFuZ2UiLE9lKCkpfSkse29uU2Nyb2xsOlEsb25TY3JvbGxlbmQ6Y2Usb25DaGFuZ2U6YmV9fWZ1bmN0aW9uIHRzKG0sUix6KXtsZXQgaj0tMTtpZihSLmN1cnJlbnRJdGVtSWQpZm9yKGxldCBaPTAsUT16O1o8US5sZW5ndGg7WisrKXtsZXQgY2U9UVtaXS5jb21wb25lbnRJbnN0YW5jZTtpZihjZSYmY2UuaXRlbUlkPT09Ui5jdXJyZW50SXRlbUlkKXtqPVo7YnJlYWt9fWo8MCYmKGo9TWF0aC5yb3VuZChOdW1iZXIoUi5jdXJyZW50KSl8fDApLGo9ajwwPzA6aixtLmN1cnJlbnRTeW5jIT09aiYmKG0uY3VycmVudENoYW5nZVNvdXJjZT0iIixtLmN1cnJlbnRTeW5jPWopfWxldCByYT17aXRlbUlkOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX07dmFyIHhhPUIuZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJTd2lwZXJJdGVtIixwcm9wczpyYSxzZXR1cChtLHtzbG90czpSfSl7cmV0dXJuKCk9PkIuY3JlYXRlVk5vZGUoImRpdiIse2NsYXNzOiJ1bmktc3dpcGVyLWl0ZW0iLHN0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLGxlZnQ6MCx0b3A6MCxyaWdodDowLGJvdHRvbTowLG92ZXJmbG93OiJoaWRkZW4ifX0sW1IuZGVmYXVsdCYmUi5kZWZhdWx0KCldKX19KSxmcj0vXjwoWy1BLVphLXowLTlfXSspKCg/OlxzK1thLXpBLVpfOl1bLWEtekEtWjAtOV86Ll0qKD86XHMqPVxzKig/Oig/OiJbXiJdKiIpfCg/OidbXiddKicpfFtePlxzXSspKT8pKilccyooXC8/KT4vLF9yPS9ePFwvKFstQS1aYS16MC05X10rKVtePl0qPi8saWE9LyhbYS16QS1aXzpdWy1hLXpBLVowLTlfOi5dKikoPzpccyo9XHMqKD86KD86IigoPzpcXC58W14iXSkqKSIpfCg/OicoKD86XFwufFteJ10pKiknKXwoW14+XHNdKykpKT8vZyxCYT1XbygiYXJlYSxiYXNlLGJhc2Vmb250LGJyLGNvbCxmcmFtZSxocixpbWcsaW5wdXQsbGluayxtZXRhLHBhcmFtLGVtYmVkLGNvbW1hbmQsa2V5Z2VuLHNvdXJjZSx0cmFjayx3YnIiKSxMcj1XbygiYSxhZGRyZXNzLGFydGljbGUsYXBwbGV0LGFzaWRlLGF1ZGlvLGJsb2NrcXVvdGUsYnV0dG9uLGNhbnZhcyxjZW50ZXIsZGQsZGVsLGRpcixkaXYsZGwsZHQsZmllbGRzZXQsZmlnY2FwdGlvbixmaWd1cmUsZm9vdGVyLGZvcm0sZnJhbWVzZXQsaDEsaDIsaDMsaDQsaDUsaDYsaGVhZGVyLGhncm91cCxocixpZnJhbWUsaXNpbmRleCxsaSxtYXAsbWVudSxub2ZyYW1lcyxub3NjcmlwdCxvYmplY3Qsb2wsb3V0cHV0LHAscHJlLHNlY3Rpb24sc2NyaXB0LHRhYmxlLHRib2R5LHRkLHRmb290LHRoLHRoZWFkLHRyLHVsLHZpZGVvIiksTWE9V28oImFiYnIsYWNyb255bSxhcHBsZXQsYixiYXNlZm9udCxiZG8sYmlnLGJyLGJ1dHRvbixjaXRlLGNvZGUsZGVsLGRmbixlbSxmb250LGksaWZyYW1lLGltZyxpbnB1dCxpbnMsa2JkLGxhYmVsLG1hcCxvYmplY3QscSxzLHNhbXAsc2NyaXB0LHNlbGVjdCxzbWFsbCxzcGFuLHN0cmlrZSxzdHJvbmcsc3ViLHN1cCx0ZXh0YXJlYSx0dCx1LHZhciIpLGJyPVdvKCJjb2xncm91cCxkZCxkdCxsaSxvcHRpb25zLHAsdGQsdGZvb3QsdGgsdGhlYWQsdHIiKSxabj1XbygiY2hlY2tlZCxjb21wYWN0LGRlY2xhcmUsZGVmZXIsZGlzYWJsZWQsaXNtYXAsbXVsdGlwbGUsbm9ocmVmLG5vcmVzaXplLG5vc2hhZGUsbm93cmFwLHJlYWRvbmx5LHNlbGVjdGVkIikseG89V28oInNjcmlwdCxzdHlsZSIpO2Z1bmN0aW9uIENzKG0sUil7dmFyIHosaixaLFE9W10sY2U9bTtmb3IoUS5sYXN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbdGhpcy5sZW5ndGgtMV19O207KXtpZihqPSEwLCFRLmxhc3QoKXx8IXhvW1EubGFzdCgpXSl7aWYobS5pbmRleE9mKCI8IS0tIik9PTA/KHo9bS5pbmRleE9mKCItLT4iKSx6Pj0wJiYoUi5jb21tZW50JiZSLmNvbW1lbnQobS5zdWJzdHJpbmcoNCx6KSksbT1tLnN1YnN0cmluZyh6KzMpLGo9ITEpKTptLmluZGV4T2YoIjwvIik9PTA/KFo9bS5tYXRjaChfciksWiYmKG09bS5zdWJzdHJpbmcoWlswXS5sZW5ndGgpLFpbMF0ucmVwbGFjZShfcixOZSksaj0hMSkpOm0uaW5kZXhPZigiPCIpPT0wJiYoWj1tLm1hdGNoKGZyKSxaJiYobT1tLnN1YnN0cmluZyhaWzBdLmxlbmd0aCksWlswXS5yZXBsYWNlKGZyLE9lKSxqPSExKSksail7ej1tLmluZGV4T2YoIjwiKTt2YXIgYmU9ejwwP206bS5zdWJzdHJpbmcoMCx6KTttPXo8MD8iIjptLnN1YnN0cmluZyh6KSxSLmNoYXJzJiZSLmNoYXJzKGJlKX19ZWxzZSBtPW0ucmVwbGFjZShuZXcgUmVnRXhwKCIoW1xcc1xcU10qPyk8LyIrUS5sYXN0KCkrIltePl0qPiIpLGZ1bmN0aW9uKHZlLEZlKXtyZXR1cm4gRmU9RmUucmVwbGFjZSgvPCEtLShbXHNcU10qPyktLT58PCFcW0NEQVRBXFsoW1xzXFNdKj8pXV0+L2csIiQxJDIiKSxSLmNoYXJzJiZSLmNoYXJzKEZlKSwiIn0pLE5lKCIiLFEubGFzdCgpKTtpZihtPT1jZSl0aHJvdyJQYXJzZSBFcnJvcjogIittO2NlPW19TmUoKTtmdW5jdGlvbiBPZSh2ZSxGZSxydCxidCl7aWYoRmU9RmUudG9Mb3dlckNhc2UoKSxMcltGZV0pZm9yKDtRLmxhc3QoKSYmTWFbUS5sYXN0KCldOylOZSgiIixRLmxhc3QoKSk7aWYoYnJbRmVdJiZRLmxhc3QoKT09RmUmJk5lKCIiLEZlKSxidD1CYVtGZV18fCEhYnQsYnR8fFEucHVzaChGZSksUi5zdGFydCl7dmFyIFd0PVtdO3J0LnJlcGxhY2UoaWEsZnVuY3Rpb24obnQsR2Upe3ZhciB1dD1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOmFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106YXJndW1lbnRzWzRdP2FyZ3VtZW50c1s0XTpabltHZV0/R2U6IiI7V3QucHVzaCh7bmFtZTpHZSx2YWx1ZTp1dCxlc2NhcGVkOnV0LnJlcGxhY2UoLyhefFteXFxdKSIvZywnJDFcXCInKX0pfSksUi5zdGFydCYmUi5zdGFydChGZSxXdCxidCl9fWZ1bmN0aW9uIE5lKHZlLEZlKXtpZihGZSlmb3IodmFyIHJ0PVEubGVuZ3RoLTE7cnQ+PTAmJlFbcnRdIT1GZTtydC0tKTtlbHNlIHZhciBydD0wO2lmKHJ0Pj0wKXtmb3IodmFyIGJ0PVEubGVuZ3RoLTE7YnQ+PXJ0O2J0LS0pUi5lbmQmJlIuZW5kKFFbYnRdKTtRLmxlbmd0aD1ydH19fWZ1bmN0aW9uIFdvKG0pe2Zvcih2YXIgUj17fSx6PW0uc3BsaXQoIiwiKSxqPTA7ajx6Lmxlbmd0aDtqKyspUlt6W2pdXT0hMDtyZXR1cm4gUn1mdW5jdGlvbiBucyhtKXtyZXR1cm4gbS5yZXBsYWNlKC88XD94bWwuKlw/PlxuLywiIikucmVwbGFjZSgvPCFkb2N0eXBlLio+XG4vLCIiKS5yZXBsYWNlKC88IURPQ1RZUEUuKj5cbi8sIiIpfWZ1bmN0aW9uIGpuKG0pe3JldHVybiBtLnJlZHVjZShmdW5jdGlvbihSLHope2xldCBqPXoudmFsdWUsWj16Lm5hbWU7cmV0dXJuIGoubWF0Y2goLyAvKSYmWyJzdHlsZSIsInNyYyJdLmluZGV4T2YoWik9PT0tMSYmKGo9ai5zcGxpdCgiICIpKSxSW1pdP0FycmF5LmlzQXJyYXkoUltaXSk/UltaXS5wdXNoKGopOlJbWl09W1JbWl0sal06UltaXT1qLFJ9LHt9KX1mdW5jdGlvbiBiYShtKXttPW5zKG0pO2xldCBSPVtdLHo9e25vZGU6InJvb3QiLGNoaWxkcmVuOltdfTtyZXR1cm4gQ3MobSx7c3RhcnQ6ZnVuY3Rpb24oaixaLFEpe2xldCBjZT17bmFtZTpqfTtpZihaLmxlbmd0aCE9PTAmJihjZS5hdHRycz1qbihaKSksUSl7bGV0IGJlPVJbMF18fHo7YmUuY2hpbGRyZW58fChiZS5jaGlsZHJlbj1bXSksYmUuY2hpbGRyZW4ucHVzaChjZSl9ZWxzZSBSLnVuc2hpZnQoY2UpfSxlbmQ6ZnVuY3Rpb24oail7bGV0IFo9Ui5zaGlmdCgpO2lmKFoubmFtZSE9PWomJmNvbnNvbGUuZXJyb3IoImludmFsaWQgc3RhdGU6IG1pc21hdGNoIGVuZCB0YWciKSxSLmxlbmd0aD09PTApei5jaGlsZHJlbi5wdXNoKFopO2Vsc2V7bGV0IFE9UlswXTtRLmNoaWxkcmVufHwoUS5jaGlsZHJlbj1bXSksUS5jaGlsZHJlbi5wdXNoKFopfX0sY2hhcnM6ZnVuY3Rpb24oail7bGV0IFo9e3R5cGU6InRleHQiLHRleHQ6an07aWYoUi5sZW5ndGg9PT0wKXouY2hpbGRyZW4ucHVzaChaKTtlbHNle2xldCBRPVJbMF07US5jaGlsZHJlbnx8KFEuY2hpbGRyZW49W10pLFEuY2hpbGRyZW4ucHVzaChaKX19LGNvbW1lbnQ6ZnVuY3Rpb24oail7bGV0IFo9e25vZGU6ImNvbW1lbnQiLHRleHQ6an0sUT1SWzBdO1EuY2hpbGRyZW58fChRLmNoaWxkcmVuPVtdKSxRLmNoaWxkcmVuLnB1c2goWil9fSksei5jaGlsZHJlbn1sZXQgR289e25vZGVzOnt0eXBlOltBcnJheSxTdHJpbmddLGRlZmF1bHQ6ZnVuY3Rpb24oKXtyZXR1cm5bXX19fSxJaT0xNjt2YXIgRWE9Qi5kZWZpbmVDb21wb25lbnQoe25hbWU6IlJpY2hUZXh0Iixwcm9wczpHbyxzZXR1cChtKXtsZXQgUj1CLmdldEN1cnJlbnRJbnN0YW5jZSgpO3JldHVybigpPT57bGV0IHo9bS5ub2RlcztyZXR1cm4gZ3QuaXNTdHJpbmcoeikmJih6PWJhKHopKSxCLmNyZWF0ZVZOb2RlKCJ1LXJpY2gtdGV4dCIse3ZhbHVlOkxhKHp8fFtdLFIucm9vdCx7ZGVmYXVsdEZvbnRTaXplOklpfSl9LG51bGwpfX19KTtmdW5jdGlvbiBMYShtLFIseil7bGV0IGo9WyJzcGFuIiwiYSIsImltYWdlIiwiaW1nIl0sWj17YmxvY2txdW90ZTpGZSxicjpudCxkaXY6RmUsZGw6RmUsaDE6YnQoMiksaDI6YnQoMS41KSxoMzpidCgxLjE3KSxoNDpidCgxKSxoNTpidCguODMpLGg2OmJ0KC42NyksaHI6RmUsb2w6RmUscDpGZSxzdHJvbmc6V3QsdGFibGU6RmUsdGJvZHk6RmUsdGZvb3Q6RmUsdGhlYWQ6RmUsdWw6RmV9LFE9LyYoYW1wfGd0fGx0fG5ic3B8cXVvdHxhcG9zKTsvZyxjZT17YW1wOiImIixndDoiPiIsbHQ6IjwiLG5ic3A6IiAiLHF1b3Q6JyInLGFwb3M6IicifSxiZT17dHlwZToic3BhbiIsX190eXBlOiJicmVhayIsYXR0cjp7dmFsdWU6YApgfX0sT2U9e19fYmxvY2s6ITAsX19icmVhazohMCxjaGlsZHJlbjpbXX0sTmU9bnVsbDtmdW5jdGlvbiB2ZShaZSl7bGV0IE90PU9iamVjdC5jcmVhdGUobnVsbCk7aWYoWmUuYXR0cnMpe2xldCB3bj0oWmUuYXR0cnMuY2xhc3N8fCIiKS5zcGxpdCgiICIpO09iamVjdC5hc3NpZ24oT3QsQi5wYXJzZUNsYXNzTGlzdCh3bixSKSxTaShaZS5hdHRycy5zdHlsZXx8IiIpKX1pZihaZS5uYW1lPT09ImltZyJ8fFplLm5hbWU9PT0iaW1hZ2UiKXtsZXQgd249WmUuYXR0cnM7T3Qud2lkdGg9T3Qud2lkdGh8fHduLndpZHRoLE90LmhlaWdodD1PdC5oZWlnaHR8fHduLmhlaWdodH1yZXR1cm4gT3R9ZnVuY3Rpb24gRmUoWmUpe3JldHVybiBaZS5fX2Jsb2NrPSEwLFplfWZ1bmN0aW9uIHJ0KFplLE90KXtyZXR1cm4gWmUuc3R5bGUmJiFaZS5zdHlsZS5mb250U2l6ZSYmKFplLnN0eWxlLmZvbnRTaXplPXouZGVmYXVsdEZvbnRTaXplKk90KSxGZShXdChaZSkpfWZ1bmN0aW9uIGJ0KFplKXtyZXR1cm4gZnVuY3Rpb24oT3Qpe3JldHVybiBydChPdCxaZSl9fWZ1bmN0aW9uIFd0KFplKXtyZXR1cm4gWmUuc3R5bGUmJiFaZS5zdHlsZS5mb250V2VpZ2h0JiYoWmUuc3R5bGUuZm9udFdlaWdodD0iYm9sZCIpLFplfWZ1bmN0aW9uIG50KFplKXtyZXR1cm4gWmUuX192YWx1ZT0iICIsRmUoWmUpfWZ1bmN0aW9uIEdlKFplKXtyZXR1cm4gWmUucmVwbGFjZShRLGZ1bmN0aW9uKE90LHduKXtyZXR1cm4gY2Vbd25dfSl9ZnVuY3Rpb24gdXQoWmUpe2xldCBPdD0oWmUubmFtZXx8IiIpLnRvTG93ZXJDYXNlKCksd249T3QsdW49WltPdF07ai5pbmRleE9mKE90KT09PS0xJiYoT3Q9InNwYW4iKSxPdD09PSJpbWciJiYoT3Q9ImltYWdlIik7bGV0IHJuPXt0eXBlOk90LF9fdHlwZTp3bixhdHRyOk9iamVjdC5jcmVhdGUobnVsbCl9O3JldHVybihaZS50eXBlPT09InRleHQifHxaZS50ZXh0KSYmKHJuLl9fdmFsdWU9cm4uYXR0ci52YWx1ZT1HZSgoWmUudGV4dHx8IiIpLnRyaW0oKSkpLFplLmF0dHJzJiZPYmplY3Qua2V5cyhaZS5hdHRycykuZm9yRWFjaChTbj0+e1NuIT09ImNsYXNzIiYmU24hPT0ic3R5bGUiJiYocm4uYXR0cltTbl09WmUuYXR0cnNbU25dKX0pLHJuLnN0eWxlPXZlKFplKSx1biYmdW4ocm4pLChPZS5fX2Jsb2NrfHxybi5fX2Jsb2NrKSYmKE5lfHwoT2UuY2hpbGRyZW4ucHVzaChiZSksTmU9W09lLGJlXSkpLE9lPXJuLChPZS5fX3ZhbHVlfHxPZS50eXBlPT09ImltYWdlIiYmT2UuYXR0ci5zcmMpJiYoTmU9bnVsbCkscm4uY2hpbGRyZW49VnQoWmUuY2hpbGRyZW4pLE9lPXJuLE9lLl9fYmxvY2smJk9lLnN0eWxlLmhlaWdodCYmIS9eMChweCk/JC8udGVzdChPZS5zdHlsZS5oZWlnaHQpJiYoTmU9bnVsbCkscm59ZnVuY3Rpb24gVnQoWmUpe3JldHVybiBndC5pc0FycmF5KFplKT9aZS5tYXAoT3Q9PnV0KE90KSk6W119bGV0IHB0PVZ0KG0pO2lmKE5lKXtsZXRbWmUsT3RdPU5lLHduPVplLmNoaWxkcmVuLHVuPXduLmluZGV4T2YoT3QpO3duLnNwbGljZSh1biwxKX1yZXR1cm4gcHR9bGV0IGFvPXt9O2Z1bmN0aW9uIG9hKG0sUix6KXtsZXR7YWRwaWQ6aix3aWR0aDpafT1tLFE9aisiLSIrWixjZT1hb1tRXTtpZihjZSYmY2UubGVuZ3RoPjApe1IoY2Uuc3BsaWNlKDAsMSlbMF0pO3JldHVybn1OLmFkLmdldEFkcyhtLGJlPT57bGV0IE9lPWJlLmFkcztSKE9lLnNwbGljZSgwLDEpWzBdKSxhb1tRXT1jZT9jZS5jb25jYXQoT2UpOk9lfSxiZT0+e3ooe2VyckNvZGU6YmUuY29kZSxlcnJNc2c6YmUubWVzc2FnZX0pfSl9bGV0IEVvPXthZHBpZDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDoiIn0sZGF0YTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sd2lkdGg6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LGNoYW5uZWw6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9fSx6aT17bG9hZDoibG9hZCIsY2xvc2U6ImNsb3NlIixlcnJvcjoiZXJyb3IiLGRvd25sb2FkY2hhbmdlOiJkb3dubG9hZGNoYW5nZSJ9O3ZhciB5YT1CLmRlZmluZUNvbXBvbmVudCh7bmFtZToiQWQiLHByb3BzOkVvLGVtaXRzOlt6aS5sb2FkLHppLmNsb3NlLHppLmVycm9yLHppLmRvd25sb2FkY2hhbmdlXSxzZXR1cChtLHtlbWl0OlJ9KXtsZXQgej1CLnJlZihudWxsKSxqPWdyKHosUiksWj1hYSgpO0Iud2F0Y2goKCk9Pm0uYWRwaWQsY2U9Pnt3YShaLG0sail9KSxCLndhdGNoKCgpPT5tLmRhdGEsY2U9PntaLmRhdGE9Y2V9KSxCLm9uTW91bnRlZCgoKT0+e2coKCk9Pntjcih6LnZhbHVlKS50aGVuKCh7d2lkdGg6Y2V9KT0+e1oud2lkdGg9Y2U9PT0wPy0xOmNlLHdhKFosbSxqKX0pfSw1MCl9KTtsZXQgUT17b25Eb3dubG9hZGNoYW5nZShjZSl7aih6aS5kb3dubG9hZGNoYW5nZSxjZSl9LG9uRGlzbGlrZShjZSl7aih6aS5jbG9zZSxjZSl9fTtyZXR1cm4oKT0+Qi5jcmVhdGVWTm9kZSgidS1hZCIsQi5tZXJnZVByb3BzKHtyZWY6en0se2RhdGE6Wi5kYXRhLHJlbmRlcmluZzohMH0sUSksbnVsbCl9fSk7ZnVuY3Rpb24gYWEobSl7bGV0IFI9Qi5yZWYoIiIpO3JldHVybiBCLnJlYWN0aXZlKHt3aWR0aDowLGRhdGE6Un0pfWZ1bmN0aW9uIHdhKG0sUix6KXtvYSh7YWRwaWQ6Ui5hZHBpZCx3aWR0aDptLndpZHRofSxqPT57bS5kYXRhPWoseih6aS5sb2FkLHt9KX0saj0+e3ooemkuZXJyb3Isail9KX1sZXQgc2E9e307ZnVuY3Rpb24gU2EobSxSLHosaixaKXtsZXQgUT1tKyItIitSLGNlPXNhW1FdO2lmKGNlJiZjZS5sZW5ndGg+MCl7aihjZS5zcGxpY2UoMCwxKVswXSk7cmV0dXJufU4uYWQuZ2V0RHJhd0Fkcyh7YWRwaWQ6U3RyaW5nKG0pLGNvdW50OjMsd2lkdGg6Un0sYmU9PntsZXQgT2U9YmUuYWRzO2ooT2Uuc3BsaWNlKDAsMSlbMF0pLHNhW1FdPWNlP2NlLmNvbmNhdChPZSk6T2V9LGJlPT57Wih7ZXJyQ29kZTpiZS5jb2RlLGVyck1zZzpiZS5tZXNzYWdlfSl9KX1sZXQgT3M9e2FkcGlkOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OiIifSxkYXRhOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSx3aWR0aDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn19LHNvPXtsb2FkOiJsb2FkIixjbG9zZToiY2xvc2UiLGVycm9yOiJlcnJvciJ9O3ZhciByaT1CLmRlZmluZUNvbXBvbmVudCh7bmFtZToiQWREcmF3Iixwcm9wczpPcyxlbWl0czpbc28ubG9hZCxzby5jbG9zZSxzby5lcnJvcl0sc2V0dXAobSx7ZW1pdDpSfSl7bGV0IHo9Qi5yZWYobnVsbCksaj1ncih6LFIpLFo9TmkoKTtCLndhdGNoKCgpPT5tLmFkcGlkLGNlPT57bG8oWixtLGopfSksQi53YXRjaCgoKT0+bS5kYXRhLGNlPT57Wi5kYXRhPWNlfSk7bGV0IFE9e29uRGlzbGlrZShjZSl7aihzby5jbG9zZSxjZSl9fTtyZXR1cm4gQi5vbk1vdW50ZWQoKCk9PntnKCgpPT57Y3Ioei52YWx1ZSkudGhlbigoe3dpZHRoOmNlLGhlaWdodDpiZX0pPT57Wi53aWR0aD1jZT09PTA/LTE6Y2UsWi5oZWlnaHQ9YmU9PT0wPy0xOmJlLGxvKFosbSxqKX0pfSw1MCl9KSwoKT0+e2xldHtkYXRhOmNlfT1aO3JldHVybiBCLmNyZWF0ZVZOb2RlKCJ1LWFkLWRyYXciLEIubWVyZ2VQcm9wcyh7cmVmOnp9LHtkYXRhOmNlLHJlbmRlcmluZzohMH0sUSksbnVsbCl9fX0pO2Z1bmN0aW9uIE5pKG0pe2xldCBSPUIucmVmKCIiKTtyZXR1cm4gQi5yZWFjdGl2ZSh7d2lkdGg6MCxoZWlnaHQ6MCxkYXRhOlJ9KX1mdW5jdGlvbiBsbyhtLFIseil7U2EoUi5hZHBpZCxtLndpZHRoLG0uaGVpZ2h0LGo9PnttLmRhdGE9aix6KHNvLmxvYWQse30pfSxqPT57eihzby5lcnJvcixqKX0pfXZhciBsYT17TmF2aWdhdG9yOmFuLExhYmVsOkRpLEJ1dHRvbjpjaSxNb3ZhYmxlQXJlYTpqcixNb3ZhYmxlVmlldzpBaSxQcm9ncmVzczp5ZSxQaWNrZXJWaWV3OkhuLFBpY2tlclZpZXdDb2x1bW46ZmksUGlja2VyOm5vLFVTbGlkZXI6S24sU3dpdGNoOnZyLENoZWNrYm94OnZpLENoZWNrYm94R3JvdXA6amksUmFkaW86TSxSYWRpb0dyb3VwOlgsRm9ybTpNbixJY29uOnRhLFN3aXBlcjpSYSxTd2lwZXJJdGVtOnhhLFJpY2hUZXh0OkVhLEFkOnlhLEFkRHJhdzpyaX07cmV0dXJuIGxhfShrLHplLHh0KTtyZXR1cm4gcG59ZnVuY3Rpb24gQ1AoZyxsKXtsZXR7VW5pU2hhcmVkOl8sVnVlOkF9PWw7ZnVuY3Rpb24gayhOLGYsVCl7bGV0IHplPU4uJFtmXTtyZXR1cm4gemUmJl8uaW52b2tlQXJyYXlGbnMoemUsVCl9bGV0IFM9Zy5zZXR1cDtyZXR1cm4gZy5pbmhlcml0QXR0cnM9ITEsZy5zZXR1cD0oTixmKT0+e2xldHthdHRyczp7X19wYWdlSWQ6VCxfX3BhZ2VQYXRoOnplLF9fcGFnZVF1ZXJ5Onh0fX09Zixwbj1sLl9fdW5pUm91dGVzLmZpbmQodm49PnZuLm1ldGEucm91dGU9PT16ZSksQj1BLmdldEN1cnJlbnRJbnN0YW5jZSgpLGd0PUIucHJveHk7aWYocG4mJihwbi5tZXRhLmlzU3ViTlZ1ZXx8T1AoZ3QsbCx7X19wYWdlSWQ6VCxfX3BhZ2VQYXRoOnplfSkpLEEub25Nb3VudGVkKCgpPT57QS5uZXh0VGljaygoKT0+e2soZ3QsXy5PTl9SRUFEWSl9KSxCLm9uUGFnZVNjcm9sbCYmZ3QuJGVsLmFkZEV2ZW50KCJzY3JvbGwiLHZuPT57dm4uc2Nyb2xsVG9wPXZuLmRldGFpbC5zY3JvbGxUb3AsayhndCxfLk9OX1BBR0VfU0NST0xMLHZuKX0pLEIub25SZWFjaEJvdHRvbSYmZ3QuJGVsLmFkZEV2ZW50KCJzY3JvbGx0b2xvd2VyIix2bj0+e2soZ3QsXy5PTl9SRUFDSF9CT1RUT00sdm4pfSl9KSxBLm9uQmVmb3JlVW5tb3VudCgoKT0+e2soZ3QsXy5PTl9VTkxPQUQpfSksUylyZXR1cm4gUyh4dCxmKX0sZ31mdW5jdGlvbiBPUChnLGwse19fcGFnZUlkOl8sX19wYWdlUGF0aDpBfSl7bGV0IGs9bC5nZXRDdXJyZW50UGFnZXMoKSxTPWtbay5sZW5ndGgtMV07aWYoUyYmUy5fX3NldHVwKVMuX19zZXR1cChnLFMpO2Vsc2V7bGV0IE49Ii8iK0E7cmV0dXJuIGwuX19yZWdpc3RlclBhZ2Uoe3VybDpOLHBhdGg6TixxdWVyeTp7fSxvcGVuVHlwZToibGF1bmNoIix3ZWJ2aWV3OntpZDpfKyIifSxudnVlUGFnZVZtOmd9KX19dmFyIEZsPXt9LGFwO2Z1bmN0aW9uIHNwKGcpe2FwPWd9dmFyIHR1O2Z1bmN0aW9uIFRQKGcpe2lmKHR1KXJldHVybiB0dTtsZXQgbD1uZXcgZy5FbWl0dGVyO3JldHVybiB0dT17b24oXyxBKXtyZXR1cm4gbC5vbihfLEEpfSxvbmNlKF8sQSl7cmV0dXJuIGwub25jZShfLEEpfSxvZmYoXyxBKXtyZXR1cm4gbC5vZmYoXyxBKX0sZW1pdChfLC4uLkEpe3JldHVybiBsLmVtaXQoXywuLi5BKX19LHR1fWZ1bmN0aW9uIFBQKGcpe3JldHVybihsLF8sQSk9PntsZXR7bnZ1ZTprfT1fLFM9ZXUoZyxfKTtfLlZ1ZT1TLEZsW2xdPXtpbnN0YW5jZUlkOmwsY29uZmlnOmsuY29uZmlnLGRvY3VtZW50OmsuZG9jdW1lbnQsZGF0YTpBfTtsZXR7Y3JlYXRlQXBwOk59PVM7Uy5jcmVhdGVWdWVBcHA9Uy5jcmVhdGVBcHA9KGYsVCk9PihfLl9fdW5pQ29uZmlnLnN0eWxlcz1mLnN0eWxlc3x8W10sTihmLFQpLnVzZShJUCxsLF8pKSxTLmNyZWF0ZVBhZ2VBcHA9KGYsVCk9PntDUChmLF8pO2xldCB6ZT1ULiRzdG9yZTtkZWxldGUgVC4kc3RvcmU7bGV0IHh0PU4oZixUKTtyZXR1cm4gemUmJnh0LnVzZSh6ZSkseHQudXNlKGtQLFMsbCxfKX19fXZhciBJUD17aW5zdGFsbChnLGwsXyl7ZGMoXykuaW5pdEFwcChnKSxOUChnLGwsXyl9fTtmdW5jdGlvbiBOUChnLGwsXyl7bGV0e21vdW50OkF9PWcsaz1GbFtsXTtyZXR1cm4gZy5tb3VudD1TPT57bGV0IE49Uz09PSIjYXBwIixmPWsuYXBwPUEobHAoay5kb2N1bWVudCx7aXNSb290Ok59KSk7cmV0dXJuIE4mJl8uX19yZWdpc3RlckFwcChmKSxmfSxnfXZhciBrUD17aW5zdGFsbChnLGwsXyxBKXtsZXR7d2VleDprLHBsdXM6UyxCcm9hZGNhc3RDaGFubmVsOk4sVnVlU2hhcmVkOmYsVW5pU2hhcmVkOlQsZ2V0Q3VycmVudFBhZ2VzOnplLHNldFRpbWVvdXQ6eHQsY2xlYXJUaW1lb3V0OnBufT1BO2cuY29uZmlnLmdsb2JhbFByb3BlcnRpZXMuJHJlcXVpcmVOYXRpdmVQbHVnaW49ay5yZXF1aXJlTW9kdWxlO2xldCBCPUFQKHt1bmk6YXAsVnVlOmwsd2VleDprLHBsdXM6UyxCcm9hZGNhc3RDaGFubmVsOk4sVW5pVmlld0pTQnJpZGdlOlRQKFQpLFZ1ZVNoYXJlZDpmLFVuaVNoYXJlZDpULGdldEN1cnJlbnRQYWdlczp6ZSxzZXRUaW1lb3V0Onh0LGNsZWFyVGltZW91dDpwbn0pO09iamVjdC5rZXlzKEIpLmZvckVhY2goZ3Q9PntnLmNvbXBvbmVudChsLmh5cGhlbmF0ZShndCksQltndF0pfSksZGMoQSkuaW5pdEFwcChnKSxSUChnLF8sQSl9fTtmdW5jdGlvbiBSUChnLGwse252dWU6X30pe2xldHtjb25maWc6e2NvbXBpbGVyT3B0aW9uczpBfSxtb3VudDprfT1nO0EuaXNDdXN0b21FbGVtZW50PU49PiEhXy5zdXBwb3J0cyhgQGNvbXBvbmVudC8ke059YCk7bGV0IFM9RmxbbF07cmV0dXJuIGcubW91bnQ9Tj0+e2xldCBmPU49PT0iI3Jvb3QiLFQ9Uy5hcHA9ayhscChTLmRvY3VtZW50LHtpc1Jvb3Q6Zn0pKTtpZihmKXRyeXtfLmRvY3VtZW50LnRhc2tDZW50ZXIuc2VuZCgiZG9tIix7YWN0aW9uOiJjcmVhdGVGaW5pc2gifSxbXSl9Y2F0Y2goemUpe31yZXR1cm4gVH0sZ31mdW5jdGlvbiBscChnLHtpc1Jvb3Q6bH0pe2lmKGwpcmV0dXJuIGcuZG9jdW1lbnRFbGVtZW50O2xldCBfPWcuY3JlYXRlQ29tbWVudCgicm9vdCIpO3JldHVybiBnLmRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZChfKSxffWZ1bmN0aW9uIGNwKGcpe2xldCBsPUZsW2ddO2lmKGwmJmwuYXBwJiZsLmRvY3VtZW50KXt0cnl7bC5hcHAuJC5hcHBDb250ZXh0LmFwcC51bm1vdW50KCksbC5kb2N1bWVudC5kZXN0cm95KCl9Y2F0Y2goXyl7fWRlbGV0ZSBsLmRvY3VtZW50LGRlbGV0ZSBsLmFwcH1kZWxldGUgRmxbZ119ZnVuY3Rpb24gdXAoZyl7bGV0IGw9RmxbZ107aWYoIWx8fCFsLmFwcClyZXR1cm4gbmV3IEVycm9yKGByZWZyZXNoSW5zdGFuY2U6IGluc3RhbmNlICR7Z30gbm90IGZvdW5kIWApO2wuZG9jdW1lbnQudGFza0NlbnRlci5zZW5kKCJkb20iLHthY3Rpb246InJlZnJlc2hGaW5pc2gifSxbXSl9ZnVuY3Rpb24geFAoZyxsKXtsZXR7VW5pU2hhcmVkOl8sVnVlU2hhcmVkOkEsVnVlUmVhY3Rpdml0eTprfT1nO3ZhciBTPWZ1bmN0aW9uKE4sZixULHplKXsidXNlIHN0cmljdCI7dmFyIHh0PVtdO2Z1bmN0aW9uIHBuKG8pe1QucGF1c2VUcmFja2luZygpO2Zvcih2YXIgYz14dC5sZW5ndGg/eHRbeHQubGVuZ3RoLTFdLmNvbXBvbmVudDpudWxsLHY9YyYmYy5hcHBDb250ZXh0LmNvbmZpZy53YXJuSGFuZGxlcixFPUIoKSxQPWFyZ3VtZW50cy5sZW5ndGgsQz1uZXcgQXJyYXkoUD4xP1AtMTowKSxWPTE7VjxQO1YrKylDW1YtMV09YXJndW1lbnRzW1ZdO2lmKHYpWSh2LGMsMTEsW28rQy5qb2luKCIiKSxjJiZjLnByb3h5LEUubWFwKHE9Pnt2YXJ7dm5vZGU6YWV9PXE7cmV0dXJuImF0IDwiLmNvbmNhdChTdChjLGFlLnR5cGUpLCI+Iil9KS5qb2luKGAKYCksRV0pO2Vsc2V7dmFyIEc9WyJbVnVlIHdhcm5dOiAiLmNvbmNhdChvKSwuLi5DXTtFLmxlbmd0aCYmRy5wdXNoKGAKYCwuLi5ndChFKSksY29uc29sZS53YXJuKC4uLkcpfVQucmVzZXRUcmFja2luZygpfWZ1bmN0aW9uIEIoKXt2YXIgbz14dFt4dC5sZW5ndGgtMV07aWYoIW8pcmV0dXJuW107Zm9yKHZhciBjPVtdO287KXt2YXIgdj1jWzBdO3YmJnYudm5vZGU9PT1vP3YucmVjdXJzZUNvdW50Kys6Yy5wdXNoKHt2bm9kZTpvLHJlY3Vyc2VDb3VudDowfSk7dmFyIEU9by5jb21wb25lbnQmJm8uY29tcG9uZW50LnBhcmVudDtvPUUmJkUudm5vZGV9cmV0dXJuIGN9ZnVuY3Rpb24gZ3Qobyl7dmFyIGM9W107cmV0dXJuIG8uZm9yRWFjaCgodixFKT0+e2MucHVzaCguLi5FPT09MD9bXTpbYApgXSwuLi52bih2KSl9KSxjfWZ1bmN0aW9uIHZuKG8pe3Zhcnt2bm9kZTpjLHJlY3Vyc2VDb3VudDp2fT1vLEU9dj4wPyIuLi4gKCIuY29uY2F0KHYsIiByZWN1cnNpdmUgY2FsbHMpIik6IiIsUD1jLmNvbXBvbmVudD9jLmNvbXBvbmVudC5wYXJlbnQ9PW51bGw6ITEsQz0iIGF0IDwiLmNvbmNhdChTdChjLmNvbXBvbmVudCxjLnR5cGUsUCkpLFY9Ij4iK0U7cmV0dXJuIGMucHJvcHM/W0MsLi4uVm4oYy5wcm9wcyksVl06W0MrVl19ZnVuY3Rpb24gVm4obyl7dmFyIGM9W10sdj1PYmplY3Qua2V5cyhvKTtyZXR1cm4gdi5zbGljZSgwLDMpLmZvckVhY2goRT0+e2MucHVzaCguLi5zdChFLG9bRV0pKX0pLHYubGVuZ3RoPjMmJmMucHVzaCgiIC4uLiIpLGN9ZnVuY3Rpb24gc3QobyxjLHYpe3JldHVybiBmLmlzU3RyaW5nKGMpPyhjPUpTT04uc3RyaW5naWZ5KGMpLHY/YzpbIiIuY29uY2F0KG8sIj0iKS5jb25jYXQoYyldKTp0eXBlb2YgYz09Im51bWJlciJ8fHR5cGVvZiBjPT0iYm9vbGVhbiJ8fGM9PW51bGw/dj9jOlsiIi5jb25jYXQobywiPSIpLmNvbmNhdChjKV06VC5pc1JlZihjKT8oYz1zdChvLFQudG9SYXcoYy52YWx1ZSksITApLHY/YzpbIiIuY29uY2F0KG8sIj1SZWY8IiksYywiPiJdKTpmLmlzRnVuY3Rpb24oYyk/WyIiLmNvbmNhdChvLCI9Zm4iKS5jb25jYXQoYy5uYW1lPyI8Ii5jb25jYXQoYy5uYW1lLCI+Iik6IiIpXTooYz1ULnRvUmF3KGMpLHY/YzpbIiIuY29uY2F0KG8sIj0iKSxjXSl9ZnVuY3Rpb24gWShvLGMsdixFKXt2YXIgUDt0cnl7UD1FP28oLi4uRSk6bygpfWNhdGNoKEMpe0VuKEMsYyx2KX1yZXR1cm4gUH1mdW5jdGlvbiB0ZShvLGMsdixFKXtpZihmLmlzRnVuY3Rpb24obykpe3ZhciBQPVkobyxjLHYsRSk7cmV0dXJuIFAmJmYuaXNQcm9taXNlKFApJiZQLmNhdGNoKEc9PntFbihHLGMsdil9KSxQfWZvcih2YXIgQz1bXSxWPTA7VjxvLmxlbmd0aDtWKyspQy5wdXNoKHRlKG9bVl0sYyx2LEUpKTtyZXR1cm4gQ31mdW5jdGlvbiBFbihvLGMsdil7aWYoYyYmYy52bm9kZSxjKXtmb3IodmFyIEU9Yy5wYXJlbnQsUD1jLnByb3h5LEM9djtFOyl7dmFyIFY9RS5lYztpZihWKXtmb3IodmFyIEc9MDtHPFYubGVuZ3RoO0crKylpZihWW0ddKG8sUCxDKT09PSExKXJldHVybn1FPUUucGFyZW50fXZhciBxPWMuYXBwQ29udGV4dC5jb25maWcuZXJyb3JIYW5kbGVyO2lmKHEpe1kocSxudWxsLDEwLFtvLFAsQ10pO3JldHVybn19eW4obyl9ZnVuY3Rpb24geW4obyxjLHYpe2NvbnNvbGUuZXJyb3Iobyl9dmFyIGxuPSExLCRuPSExLGFuPVtdLGtuPTAsVW49W10sbW49bnVsbCxzbj0wLF9uPVtdLFJuPW51bGwsa3I9MCxacj1Qcm9taXNlLnJlc29sdmUoKSxVZT1udWxsLGl0PW51bGw7ZnVuY3Rpb24gdnQobyl7dmFyIGM9VWV8fFpyO3JldHVybiBvP2MudGhlbih0aGlzP28uYmluZCh0aGlzKTpvKTpjfWZ1bmN0aW9uIHF0KG8pe2Zvcih2YXIgYz1rbisxLHY9YW4ubGVuZ3RoO2M8djspe3ZhciBFPWMrdj4+PjEsUD1VcihhbltFXSk7UDxvP2M9RSsxOnY9RX1yZXR1cm4gY31mdW5jdGlvbiBubihvKXsoIWFuLmxlbmd0aHx8IWFuLmluY2x1ZGVzKG8sbG4mJm8uYWxsb3dSZWN1cnNlP2tuKzE6a24pKSYmbyE9PWl0JiYoby5pZD09bnVsbD9hbi5wdXNoKG8pOmFuLnNwbGljZShxdChvLmlkKSwwLG8pLFF0KCkpfWZ1bmN0aW9uIFF0KCl7IWxuJiYhJG4mJigkbj0hMCxVZT1aci50aGVuKEhyKSl9ZnVuY3Rpb24gaXIobyl7dmFyIGM9YW4uaW5kZXhPZihvKTtjPmtuJiZhbi5zcGxpY2UoYywxKX1mdW5jdGlvbiBscihvLGMsdixFKXtmLmlzQXJyYXkobyk/di5wdXNoKC4uLm8pOighY3x8IWMuaW5jbHVkZXMobyxvLmFsbG93UmVjdXJzZT9FKzE6RSkpJiZ2LnB1c2gobyksUXQoKX1mdW5jdGlvbiBMaShvKXtscihvLG1uLFVuLHNuKX1mdW5jdGlvbiBEaShvKXtscihvLFJuLF9uLGtyKX1mdW5jdGlvbiB4bihvKXt2YXIgYz1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06bnVsbDtpZihVbi5sZW5ndGgpe2ZvcihpdD1jLG1uPVsuLi5uZXcgU2V0KFVuKV0sVW4ubGVuZ3RoPTAsc249MDtzbjxtbi5sZW5ndGg7c24rKyltbltzbl0oKTttbj1udWxsLHNuPTAsaXQ9bnVsbCx4bihvLGMpfX1mdW5jdGlvbiB3cihvKXtpZih4bigpLF9uLmxlbmd0aCl7dmFyIGM9Wy4uLm5ldyBTZXQoX24pXTtpZihfbi5sZW5ndGg9MCxSbil7Um4ucHVzaCguLi5jKTtyZXR1cm59Zm9yKFJuPWMsUm4uc29ydCgodixFKT0+VXIodiktVXIoRSkpLGtyPTA7a3I8Um4ubGVuZ3RoO2tyKyspUm5ba3JdKCk7Um49bnVsbCxrcj0wfX12YXIgVXI9bz0+by5pZD09bnVsbD8xLzA6by5pZDtmdW5jdGlvbiBIcihvKXskbj0hMSxsbj0hMCx4bihvKSxhbi5zb3J0KChFLFApPT5VcihFKS1VcihQKSk7dmFyIGM9Zi5OT09QO3RyeXtmb3Ioa249MDtrbjxhbi5sZW5ndGg7a24rKyl7dmFyIHY9YW5ba25dO3YmJnYuYWN0aXZlIT09ITEmJlkodixudWxsLDE0KX19ZmluYWxseXtrbj0wLGFuLmxlbmd0aD0wLHdyKCksbG49ITEsVWU9bnVsbCwoYW4ubGVuZ3RofHxVbi5sZW5ndGh8fF9uLmxlbmd0aCkmJkhyKG8pfX1OLmRldnRvb2xzPXZvaWQgMDt2YXIgWmk9W107ZnVuY3Rpb24gWGkobyxjKXt2YXIgdixFO2lmKE4uZGV2dG9vbHM9byxOLmRldnRvb2xzKU4uZGV2dG9vbHMuZW5hYmxlZD0hMCxaaS5mb3JFYWNoKEM9Pnt2YXJ7ZXZlbnQ6VixhcmdzOkd9PUM7cmV0dXJuIE4uZGV2dG9vbHMuZW1pdChWLC4uLkcpfSksWmk9W107ZWxzZSBpZih0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmd2luZG93LkhUTUxFbGVtZW50JiYhKChFPSh2PXdpbmRvdy5uYXZpZ2F0b3IpPT09bnVsbHx8dj09PXZvaWQgMD92b2lkIDA6di51c2VyQWdlbnQpPT09bnVsbHx8RT09PXZvaWQgMD92b2lkIDA6RS5pbmNsdWRlcygianNkb20iKSkpe3ZhciBQPWMuX19WVUVfREVWVE9PTFNfSE9PS19SRVBMQVlfXz1jLl9fVlVFX0RFVlRPT0xTX0hPT0tfUkVQTEFZX198fFtdO1AucHVzaChDPT57WGkoQyxjKX0pLHNldFRpbWVvdXQoKCk9PntOLmRldnRvb2xzfHwoYy5fX1ZVRV9ERVZUT09MU19IT09LX1JFUExBWV9fPW51bGwsWmk9W10pfSwzZTMpfWVsc2UgWmk9W119ZnVuY3Rpb24gT28obyxjKXtpZighby5pc1VubW91bnRlZCl7Zm9yKHZhciB2PW8udm5vZGUucHJvcHN8fGYuRU1QVFlfT0JKLEU9YXJndW1lbnRzLmxlbmd0aCxQPW5ldyBBcnJheShFPjI/RS0yOjApLEM9MjtDPEU7QysrKVBbQy0yXT1hcmd1bWVudHNbQ107dmFyIFY9UCxHPWMuc3RhcnRzV2l0aCgidXBkYXRlOiIpLHE9RyYmYy5zbGljZSg3KTtpZihxJiZxIGluIHYpe3ZhciBhZT0iIi5jb25jYXQocT09PSJtb2RlbFZhbHVlIj8ibW9kZWwiOnEsIk1vZGlmaWVycyIpLHtudW1iZXI6TGUsdHJpbTpYZX09dlthZV18fGYuRU1QVFlfT0JKO1hlJiYoVj1QLm1hcChfdD0+X3QudHJpbSgpKSksTGUmJihWPVAubWFwKGYudG9OdW1iZXIpKX12YXIgc2UsJGU9dltzZT1mLnRvSGFuZGxlcktleShjKV18fHZbc2U9Zi50b0hhbmRsZXJLZXkoZi5jYW1lbGl6ZShjKSldOyEkZSYmRyYmKCRlPXZbc2U9Zi50b0hhbmRsZXJLZXkoZi5oeXBoZW5hdGUoYykpXSksJGUmJnRlKCRlLG8sNixWKTt2YXIgV2U9dltzZSsiT25jZSJdO2lmKFdlKXtpZighby5lbWl0dGVkKW8uZW1pdHRlZD17fTtlbHNlIGlmKG8uZW1pdHRlZFtzZV0pcmV0dXJuO28uZW1pdHRlZFtzZV09ITAsdGUoV2Usbyw2LFYpfX19ZnVuY3Rpb24gVG8obyxjKXt2YXIgdj1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06ITEsRT1jLmVtaXRzQ2FjaGUsUD1FLmdldChvKTtpZihQIT09dm9pZCAwKXJldHVybiBQO3ZhciBDPW8uZW1pdHMsVj17fSxHPSExO2lmKCFmLmlzRnVuY3Rpb24obykpe3ZhciBxPWFlPT57dmFyIExlPVRvKGFlLGMsITApO0xlJiYoRz0hMCxmLmV4dGVuZChWLExlKSl9OyF2JiZjLm1peGlucy5sZW5ndGgmJmMubWl4aW5zLmZvckVhY2gocSksby5leHRlbmRzJiZxKG8uZXh0ZW5kcyksby5taXhpbnMmJm8ubWl4aW5zLmZvckVhY2gocSl9cmV0dXJuIUMmJiFHPyhFLnNldChvLG51bGwpLG51bGwpOihmLmlzQXJyYXkoQyk/Qy5mb3JFYWNoKGFlPT5WW2FlXT1udWxsKTpmLmV4dGVuZChWLEMpLEUuc2V0KG8sViksVil9ZnVuY3Rpb24gaHIobyxjKXtyZXR1cm4hb3x8IWYuaXNPbihjKT8hMTooYz1jLnNsaWNlKDIpLnJlcGxhY2UoL09uY2UkLywiIiksZi5oYXNPd24obyxjWzBdLnRvTG93ZXJDYXNlKCkrYy5zbGljZSgxKSl8fGYuaGFzT3duKG8sZi5oeXBoZW5hdGUoYykpfHxmLmhhc093bihvLGMpKX12YXIgQ249bnVsbCxPbj1udWxsO2Z1bmN0aW9uIGNpKG8pe3ZhciBjPUNuO3JldHVybiBDbj1vLE9uPW8mJm8udHlwZS5fX3Njb3BlSWR8fG51bGwsY31mdW5jdGlvbiBRaShvKXtPbj1vfWZ1bmN0aW9uIGVvKCl7T249bnVsbH12YXIgZ289bz0+U2k7ZnVuY3Rpb24gU2kobyl7dmFyIGM9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOkNuO2lmKCFjfHxvLl9uKXJldHVybiBvO3ZhciB2PWZ1bmN0aW9uKCl7di5fZCYmcm4oLTEpO3ZhciBFPWNpKGMpLFA9byguLi5hcmd1bWVudHMpO3JldHVybiBjaShFKSx2Ll9kJiZybigxKSxQfTtyZXR1cm4gdi5fbj0hMCx2Ll9jPSEwLHYuX2Q9ITAsdn1mdW5jdGlvbiBjcigpe31mdW5jdGlvbiBqcihvKXt2YXJ7dHlwZTpjLHZub2RlOnYscHJveHk6RSx3aXRoUHJveHk6UCxwcm9wczpDLHByb3BzT3B0aW9uczpbVl0sc2xvdHM6RyxhdHRyczpxLGVtaXQ6YWUscmVuZGVyOkxlLHJlbmRlckNhY2hlOlhlLGRhdGE6c2Usc2V0dXBTdGF0ZTokZSxjdHg6V2UsaW5oZXJpdEF0dHJzOl90fT1vLFB0LF9lLGZlPWNpKG8pO3RyeXtpZih2LnNoYXBlRmxhZyY0KXt2YXIgVGU9UHx8RTtQdD1YbihMZS5jYWxsKFRlLFRlLFhlLEMsJGUsc2UsV2UpKSxfZT1xfWVsc2V7dmFyIGk9YztQdD1YbihpLmxlbmd0aD4xP2koQyx7YXR0cnM6cSxzbG90czpHLGVtaXQ6YWV9KTppKEMsbnVsbCkpLF9lPWMucHJvcHM/cTpncihxKX19Y2F0Y2goeSl7cHQubGVuZ3RoPTAsRW4oeSxvLDEpLFB0PUx0KHV0KX12YXIgcz1QdDtpZihfZSYmX3QhPT0hMSl7dmFyIGQ9T2JqZWN0LmtleXMoX2UpLHtzaGFwZUZsYWc6cH09cztkLmxlbmd0aCYmcCYoMXw2KSYmKFYmJmQuc29tZShmLmlzTW9kZWxMaXN0ZW5lcikmJihfZT1QbyhfZSxWKSkscz1xcihzLF9lKSl9cmV0dXJuIHYuZGlycyYmKHM9cXIocykscy5kaXJzPXMuZGlycz9zLmRpcnMuY29uY2F0KHYuZGlycyk6di5kaXJzKSx2LnRyYW5zaXRpb24mJihzLnRyYW5zaXRpb249di50cmFuc2l0aW9uKSxQdD1zLGNpKGZlKSxQdH1mdW5jdGlvbiBTcihvKXtmb3IodmFyIGMsdj0wO3Y8by5sZW5ndGg7disrKXt2YXIgRT1vW3ZdO2lmKG1pKEUpKXtpZihFLnR5cGUhPT11dHx8RS5jaGlsZHJlbj09PSJ2LWlmIil7aWYoYylyZXR1cm47Yz1FfX1lbHNlIHJldHVybn1yZXR1cm4gY312YXIgZ3I9bz0+e3ZhciBjO2Zvcih2YXIgdiBpbiBvKSh2PT09ImNsYXNzInx8dj09PSJzdHlsZSJ8fGYuaXNPbih2KSkmJigoY3x8KGM9e30pKVt2XT1vW3ZdKTtyZXR1cm4gY30sUG89KG8sYyk9Pnt2YXIgdj17fTtmb3IodmFyIEUgaW4gbykoIWYuaXNNb2RlbExpc3RlbmVyKEUpfHwhKEUuc2xpY2UoOSlpbiBjKSkmJih2W0VdPW9bRV0pO3JldHVybiB2fTtmdW5jdGlvbiBJbyhvLGMsdil7dmFye3Byb3BzOkUsY2hpbGRyZW46UCxjb21wb25lbnQ6Q309byx7cHJvcHM6VixjaGlsZHJlbjpHLHBhdGNoRmxhZzpxfT1jLGFlPUMuZW1pdHNPcHRpb25zO2lmKGMuZGlyc3x8Yy50cmFuc2l0aW9uKXJldHVybiEwO2lmKHYmJnE+PTApe2lmKHEmMTAyNClyZXR1cm4hMDtpZihxJjE2KXJldHVybiBFP3BvKEUsVixhZSk6ISFWO2lmKHEmOClmb3IodmFyIExlPWMuZHluYW1pY1Byb3BzLFhlPTA7WGU8TGUubGVuZ3RoO1hlKyspe3ZhciBzZT1MZVtYZV07aWYoVltzZV0hPT1FW3NlXSYmIWhyKGFlLHNlKSlyZXR1cm4hMH19ZWxzZSByZXR1cm4oUHx8RykmJighR3x8IUcuJHN0YWJsZSk/ITA6RT09PVY/ITE6RT9WP3BvKEUsVixhZSk6ITA6ISFWO3JldHVybiExfWZ1bmN0aW9uIHBvKG8sYyx2KXt2YXIgRT1PYmplY3Qua2V5cyhjKTtpZihFLmxlbmd0aCE9PU9iamVjdC5rZXlzKG8pLmxlbmd0aClyZXR1cm4hMDtmb3IodmFyIFA9MDtQPEUubGVuZ3RoO1ArKyl7dmFyIEM9RVtQXTtpZihjW0NdIT09b1tDXSYmIWhyKHYsQykpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gUnIobyxjKXtmb3IodmFye3Zub2RlOnYscGFyZW50OkV9PW87RSYmRS5zdWJUcmVlPT09djspKHY9RS52bm9kZSkuZWw9YyxFPUUucGFyZW50fXZhciB1cj1vPT5vLl9faXNTdXNwZW5zZSxBcj17bmFtZToiU3VzcGVuc2UiLF9faXNTdXNwZW5zZTohMCxwcm9jZXNzKG8sYyx2LEUsUCxDLFYsRyxxLGFlKXtvPT1udWxsP3pyKGMsdixFLFAsQyxWLEcscSxhZSk6dG8obyxjLHYsRSxQLFYsRyxxLGFlKX0saHlkcmF0ZTp4cixjcmVhdGU6Rmksbm9ybWFsaXplOnZvfSxYcj1BcjtmdW5jdGlvbiB6bihvLGMpe3ZhciB2PW8ucHJvcHMmJm8ucHJvcHNbY107Zi5pc0Z1bmN0aW9uKHYpJiZ2KCl9ZnVuY3Rpb24genIobyxjLHYsRSxQLEMsVixHLHEpe3ZhcntwOmFlLG86e2NyZWF0ZUVsZW1lbnQ6TGV9fT1xLFhlPUxlKCJkaXYiKSxzZT1vLnN1c3BlbnNlPUZpKG8sUCxFLGMsWGUsdixDLFYsRyxxKTthZShudWxsLHNlLnBlbmRpbmdCcmFuY2g9by5zc0NvbnRlbnQsWGUsbnVsbCxFLHNlLEMsViksc2UuZGVwcz4wPyh6bihvLCJvblBlbmRpbmciKSx6bihvLCJvbkZhbGxiYWNrIiksYWUobnVsbCxvLnNzRmFsbGJhY2ssYyx2LEUsbnVsbCxDLFYpLFFyKHNlLG8uc3NGYWxsYmFjaykpOnNlLnJlc29sdmUoKX1mdW5jdGlvbiB0byhvLGMsdixFLFAsQyxWLEcscSl7dmFye3A6YWUsdW06TGUsbzp7Y3JlYXRlRWxlbWVudDpYZX19PXEsc2U9Yy5zdXNwZW5zZT1vLnN1c3BlbnNlO3NlLnZub2RlPWMsYy5lbD1vLmVsO3ZhciAkZT1jLnNzQ29udGVudCxXZT1jLnNzRmFsbGJhY2sse2FjdGl2ZUJyYW5jaDpfdCxwZW5kaW5nQnJhbmNoOlB0LGlzSW5GYWxsYmFjazpfZSxpc0h5ZHJhdGluZzpmZX09c2U7aWYoUHQpc2UucGVuZGluZ0JyYW5jaD0kZSxvcigkZSxQdCk/KGFlKFB0LCRlLHNlLmhpZGRlbkNvbnRhaW5lcixudWxsLFAsc2UsQyxWLEcpLHNlLmRlcHM8PTA/c2UucmVzb2x2ZSgpOl9lJiYoYWUoX3QsV2UsdixFLFAsbnVsbCxDLFYsRyksUXIoc2UsV2UpKSk6KHNlLnBlbmRpbmdJZCsrLGZlPyhzZS5pc0h5ZHJhdGluZz0hMSxzZS5hY3RpdmVCcmFuY2g9UHQpOkxlKFB0LFAsc2UpLHNlLmRlcHM9MCxzZS5lZmZlY3RzLmxlbmd0aD0wLHNlLmhpZGRlbkNvbnRhaW5lcj1YZSgiZGl2IiksX2U/KGFlKG51bGwsJGUsc2UuaGlkZGVuQ29udGFpbmVyLG51bGwsUCxzZSxDLFYsRyksc2UuZGVwczw9MD9zZS5yZXNvbHZlKCk6KGFlKF90LFdlLHYsRSxQLG51bGwsQyxWLEcpLFFyKHNlLFdlKSkpOl90JiZvcigkZSxfdCk/KGFlKF90LCRlLHYsRSxQLHNlLEMsVixHKSxzZS5yZXNvbHZlKCEwKSk6KGFlKG51bGwsJGUsc2UuaGlkZGVuQ29udGFpbmVyLG51bGwsUCxzZSxDLFYsRyksc2UuZGVwczw9MCYmc2UucmVzb2x2ZSgpKSk7ZWxzZSBpZihfdCYmb3IoJGUsX3QpKWFlKF90LCRlLHYsRSxQLHNlLEMsVixHKSxRcihzZSwkZSk7ZWxzZSBpZih6bihjLCJvblBlbmRpbmciKSxzZS5wZW5kaW5nQnJhbmNoPSRlLHNlLnBlbmRpbmdJZCsrLGFlKG51bGwsJGUsc2UuaGlkZGVuQ29udGFpbmVyLG51bGwsUCxzZSxDLFYsRyksc2UuZGVwczw9MClzZS5yZXNvbHZlKCk7ZWxzZXt2YXJ7dGltZW91dDpUZSxwZW5kaW5nSWQ6aX09c2U7VGU+MD9zZXRUaW1lb3V0KCgpPT57c2UucGVuZGluZ0lkPT09aSYmc2UuZmFsbGJhY2soV2UpfSxUZSk6VGU9PT0wJiZzZS5mYWxsYmFjayhXZSl9fWZ1bmN0aW9uIEZpKG8sYyx2LEUsUCxDLFYsRyxxLGFlKXt2YXIgTGU9YXJndW1lbnRzLmxlbmd0aD4xMCYmYXJndW1lbnRzWzEwXSE9PXZvaWQgMD9hcmd1bWVudHNbMTBdOiExLHtwOlhlLG06c2UsdW06JGUsbjpXZSxvOntwYXJlbnROb2RlOl90LHJlbW92ZTpQdH19PWFlLF9lPWYudG9OdW1iZXIoby5wcm9wcyYmby5wcm9wcy50aW1lb3V0KSxmZT17dm5vZGU6byxwYXJlbnQ6YyxwYXJlbnRDb21wb25lbnQ6dixpc1NWRzpWLGNvbnRhaW5lcjpFLGhpZGRlbkNvbnRhaW5lcjpQLGFuY2hvcjpDLGRlcHM6MCxwZW5kaW5nSWQ6MCx0aW1lb3V0OnR5cGVvZiBfZT09Im51bWJlciI/X2U6LTEsYWN0aXZlQnJhbmNoOm51bGwscGVuZGluZ0JyYW5jaDpudWxsLGlzSW5GYWxsYmFjazohMCxpc0h5ZHJhdGluZzpMZSxpc1VubW91bnRlZDohMSxlZmZlY3RzOltdLHJlc29sdmUoKXt2YXIgVGU9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOiExLHt2bm9kZTppLGFjdGl2ZUJyYW5jaDpzLHBlbmRpbmdCcmFuY2g6ZCxwZW5kaW5nSWQ6cCxlZmZlY3RzOnkscGFyZW50Q29tcG9uZW50OncsY29udGFpbmVyOkl9PWZlO2lmKGZlLmlzSHlkcmF0aW5nKWZlLmlzSHlkcmF0aW5nPSExO2Vsc2UgaWYoIVRlKXt2YXIgTD1zJiZkLnRyYW5zaXRpb24mJmQudHJhbnNpdGlvbi5tb2RlPT09Im91dC1pbiI7TCYmKHMudHJhbnNpdGlvbi5hZnRlckxlYXZlPSgpPT57cD09PWZlLnBlbmRpbmdJZCYmc2UoZCxJLCQsMCl9KTt2YXJ7YW5jaG9yOiR9PWZlO3MmJigkPVdlKHMpLCRlKHMsdyxmZSwhMCkpLEx8fHNlKGQsSSwkLDApfVFyKGZlLGQpLGZlLnBlbmRpbmdCcmFuY2g9bnVsbCxmZS5pc0luRmFsbGJhY2s9ITE7Zm9yKHZhciBlZT1mZS5wYXJlbnQsaWU9ITE7ZWU7KXtpZihlZS5wZW5kaW5nQnJhbmNoKXtlZS5lZmZlY3RzLnB1c2goLi4ueSksaWU9ITA7YnJlYWt9ZWU9ZWUucGFyZW50fWllfHxEaSh5KSxmZS5lZmZlY3RzPVtdLHpuKGksIm9uUmVzb2x2ZSIpfSxmYWxsYmFjayhUZSl7aWYoISFmZS5wZW5kaW5nQnJhbmNoKXt2YXJ7dm5vZGU6aSxhY3RpdmVCcmFuY2g6cyxwYXJlbnRDb21wb25lbnQ6ZCxjb250YWluZXI6cCxpc1NWRzp5fT1mZTt6bihpLCJvbkZhbGxiYWNrIik7dmFyIHc9V2UocyksST0oKT0+eyFmZS5pc0luRmFsbGJhY2t8fChYZShudWxsLFRlLHAsdyxkLG51bGwseSxHLHEpLFFyKGZlLFRlKSl9LEw9VGUudHJhbnNpdGlvbiYmVGUudHJhbnNpdGlvbi5tb2RlPT09Im91dC1pbiI7TCYmKHMudHJhbnNpdGlvbi5hZnRlckxlYXZlPUkpLGZlLmlzSW5GYWxsYmFjaz0hMCwkZShzLGQsbnVsbCwhMCksTHx8SSgpfX0sbW92ZShUZSxpLHMpe2ZlLmFjdGl2ZUJyYW5jaCYmc2UoZmUuYWN0aXZlQnJhbmNoLFRlLGkscyksZmUuY29udGFpbmVyPVRlfSxuZXh0KCl7cmV0dXJuIGZlLmFjdGl2ZUJyYW5jaCYmV2UoZmUuYWN0aXZlQnJhbmNoKX0scmVnaXN0ZXJEZXAoVGUsaSl7dmFyIHM9ISFmZS5wZW5kaW5nQnJhbmNoO3MmJmZlLmRlcHMrKzt2YXIgZD1UZS52bm9kZS5lbDtUZS5hc3luY0RlcC5jYXRjaChwPT57RW4ocCxUZSwwKX0pLnRoZW4ocD0+e2lmKCEoVGUuaXNVbm1vdW50ZWR8fGZlLmlzVW5tb3VudGVkfHxmZS5wZW5kaW5nSWQhPT1UZS5zdXNwZW5zZUlkKSl7VGUuYXN5bmNSZXNvbHZlZD0hMDt2YXJ7dm5vZGU6eX09VGU7WW8oVGUscCwhMSksZCYmKHkuZWw9ZCk7dmFyIHc9IWQmJlRlLnN1YlRyZWUuZWw7aShUZSx5LF90KGR8fFRlLnN1YlRyZWUuZWwpLGQ/bnVsbDpXZShUZS5zdWJUcmVlKSxmZSxWLHEpLHcmJlB0KHcpLFJyKFRlLHkuZWwpLHMmJi0tZmUuZGVwcz09PTAmJmZlLnJlc29sdmUoKX19KX0sdW5tb3VudChUZSxpKXtmZS5pc1VubW91bnRlZD0hMCxmZS5hY3RpdmVCcmFuY2gmJiRlKGZlLmFjdGl2ZUJyYW5jaCx2LFRlLGkpLGZlLnBlbmRpbmdCcmFuY2gmJiRlKGZlLnBlbmRpbmdCcmFuY2gsdixUZSxpKX19O3JldHVybiBmZX1mdW5jdGlvbiB4cihvLGMsdixFLFAsQyxWLEcscSl7dmFyIGFlPWMuc3VzcGVuc2U9RmkoYyxFLHYsby5wYXJlbnROb2RlLGwuY3JlYXRlRWxlbWVudCgiZGl2IiksbnVsbCxQLEMsVixHLCEwKSxMZT1xKG8sYWUucGVuZGluZ0JyYW5jaD1jLnNzQ29udGVudCx2LGFlLEMsVik7cmV0dXJuIGFlLmRlcHM9PT0wJiZhZS5yZXNvbHZlKCksTGV9ZnVuY3Rpb24gdm8obyl7dmFye3NoYXBlRmxhZzpjLGNoaWxkcmVuOnZ9PW8sRT1jJjMyO28uc3NDb250ZW50PW1vKEU/di5kZWZhdWx0OnYpLG8uc3NGYWxsYmFjaz1FP21vKHYuZmFsbGJhY2spOkx0KHV0KX1mdW5jdGlvbiBtbyhvKXt2YXIgYztpZihmLmlzRnVuY3Rpb24obykpe3ZhciB2PXVuJiZvLl9jO3YmJihvLl9kPSExLE90KCkpLG89bygpLHYmJihvLl9kPSEwLGM9WmUsd24oKSl9aWYoZi5pc0FycmF5KG8pKXt2YXIgRT1TcihvKTtvPUV9cmV0dXJuIG89WG4obyksYyYmIW8uZHluYW1pY0NoaWxkcmVuJiYoby5keW5hbWljQ2hpbGRyZW49Yy5maWx0ZXIoUD0+UCE9PW8pKSxvfWZ1bmN0aW9uIF9vKG8sYyl7YyYmYy5wZW5kaW5nQnJhbmNoP2YuaXNBcnJheShvKT9jLmVmZmVjdHMucHVzaCguLi5vKTpjLmVmZmVjdHMucHVzaChvKTpEaShvKX1mdW5jdGlvbiBRcihvLGMpe28uYWN0aXZlQnJhbmNoPWM7dmFye3Zub2RlOnYscGFyZW50Q29tcG9uZW50OkV9PW8sUD12LmVsPWMuZWw7RSYmRS5zdWJUcmVlPT09diYmKEUudm5vZGUuZWw9UCxScihFLFApKX1mdW5jdGlvbiBlaShvLGMpe2lmKEduKXt2YXIgdj1Hbi5wcm92aWRlcyxFPUduLnBhcmVudCYmR24ucGFyZW50LnByb3ZpZGVzO0U9PT12JiYodj1Hbi5wcm92aWRlcz1PYmplY3QuY3JlYXRlKEUpKSx2W29dPWMsR24udHlwZS5tcFR5cGU9PT0iYXBwIiYmR24uYXBwQ29udGV4dC5hcHAucHJvdmlkZShvLGMpfX1mdW5jdGlvbiBBaShvLGMpe3ZhciB2PWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTohMSxFPUdufHxDbjtpZihFKXt2YXIgUD1FLnBhcmVudD09bnVsbD9FLnZub2RlLmFwcENvbnRleHQmJkUudm5vZGUuYXBwQ29udGV4dC5wcm92aWRlczpFLnBhcmVudC5wcm92aWRlcztpZihQJiZvIGluIFApcmV0dXJuIFBbb107aWYoYXJndW1lbnRzLmxlbmd0aD4xKXJldHVybiB2JiZmLmlzRnVuY3Rpb24oYyk/Yy5jYWxsKEUucHJveHkpOmN9fWZ1bmN0aW9uIHVpKG8sYyl7cmV0dXJuIHllKG8sbnVsbCxjKX1mdW5jdGlvbiBxbihvLGMpe3JldHVybiB5ZShvLG51bGwse2ZsdXNoOiJwb3N0In0pfWZ1bmN0aW9uIENyKG8sYyl7cmV0dXJuIHllKG8sbnVsbCx7Zmx1c2g6InN5bmMifSl9dmFyIFZpPXt9O2Z1bmN0aW9uIE10KG8sYyx2KXtyZXR1cm4geWUobyxjLHYpfWZ1bmN0aW9uIHllKG8sYyl7dmFye2ltbWVkaWF0ZTp2LGRlZXA6RSxmbHVzaDpQLG9uVHJhY2s6QyxvblRyaWdnZXI6Vn09YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOmYuRU1QVFlfT0JKLEc9R24scSxhZT0hMSxMZT0hMTtpZihULmlzUmVmKG8pPyhxPSgpPT5vLnZhbHVlLGFlPVQuaXNTaGFsbG93KG8pKTpULmlzUmVhY3RpdmUobyk/KHE9KCk9Pm8sRT0hMCk6Zi5pc0FycmF5KG8pPyhMZT0hMCxhZT1vLnNvbWUoZmU9PlQuaXNSZWFjdGl2ZShmZSl8fFQuaXNTaGFsbG93KGZlKSkscT0oKT0+by5tYXAoZmU9PntpZihULmlzUmVmKGZlKSlyZXR1cm4gZmUudmFsdWU7aWYoVC5pc1JlYWN0aXZlKGZlKSlyZXR1cm4gV3IoZmUpO2lmKGYuaXNGdW5jdGlvbihmZSkpcmV0dXJuIFkoZmUsRywyKX0pKTpmLmlzRnVuY3Rpb24obyk/Yz9xPSgpPT5ZKG8sRywyKTpxPSgpPT57aWYoIShHJiZHLmlzVW5tb3VudGVkKSlyZXR1cm4gc2UmJnNlKCksdGUobyxHLDMsWyRlXSl9OnE9Zi5OT09QLGMmJkUpe3ZhciBYZT1xO3E9KCk9PldyKFhlKCkpfXZhciBzZSwkZT1mZT0+e3NlPV9lLm9uU3RvcD0oKT0+e1koZmUsRyw0KX19O2lmKE4uaXNJblNTUkNvbXBvbmVudFNldHVwKXJldHVybiAkZT1mLk5PT1AsYz92JiZ0ZShjLEcsMyxbcSgpLExlP1tdOnZvaWQgMCwkZV0pOnEoKSxmLk5PT1A7dmFyIFdlPUxlP1tdOlZpLF90PSgpPT57aWYoISFfZS5hY3RpdmUpaWYoYyl7dmFyIGZlPV9lLnJ1bigpOyhFfHxhZXx8KExlP2ZlLnNvbWUoKFRlLGkpPT5mLmhhc0NoYW5nZWQoVGUsV2VbaV0pKTpmLmhhc0NoYW5nZWQoZmUsV2UpKSkmJihzZSYmc2UoKSx0ZShjLEcsMyxbZmUsV2U9PT1WaT92b2lkIDA6V2UsJGVdKSxXZT1mZSl9ZWxzZSBfZS5ydW4oKX07X3QuYWxsb3dSZWN1cnNlPSEhYzt2YXIgUHQ7UD09PSJzeW5jIj9QdD1fdDpQPT09InBvc3QiP1B0PSgpPT5tKF90LEcmJkcuc3VzcGVuc2UpOlB0PSgpPT5MaShfdCk7dmFyIF9lPW5ldyBULlJlYWN0aXZlRWZmZWN0KHEsUHQpO3JldHVybiBjP3Y/X3QoKTpXZT1fZS5ydW4oKTpQPT09InBvc3QiP20oX2UucnVuLmJpbmQoX2UpLEcmJkcuc3VzcGVuc2UpOl9lLnJ1bigpLCgpPT57X2Uuc3RvcCgpLEcmJkcuc2NvcGUmJmYucmVtb3ZlKEcuc2NvcGUuZWZmZWN0cyxfZSl9fWZ1bmN0aW9uIENpKG8sYyx2KXt2YXIgRT10aGlzLnByb3h5LFA9Zi5pc1N0cmluZyhvKT9vLmluY2x1ZGVzKCIuIik/JGkoRSxvKTooKT0+RVtvXTpvLmJpbmQoRSxFKSxDO2YuaXNGdW5jdGlvbihjKT9DPWM6KEM9Yy5oYW5kbGVyLHY9Yyk7dmFyIFY9R247UW4odGhpcyk7dmFyIEc9eWUoUCxDLmJpbmQoRSksdik7cmV0dXJuIFY/UW4oVik6RnIoKSxHfWZ1bmN0aW9uICRpKG8sYyl7dmFyIHY9Yy5zcGxpdCgiLiIpO3JldHVybigpPT57Zm9yKHZhciBFPW8sUD0wO1A8di5sZW5ndGgmJkU7UCsrKUU9RVt2W1BdXTtyZXR1cm4gRX19ZnVuY3Rpb24gV3IobyxjKXtpZighZi5pc09iamVjdChvKXx8by5fX3Zfc2tpcHx8KGM9Y3x8bmV3IFNldCxjLmhhcyhvKSkpcmV0dXJuIG87aWYoYy5hZGQobyksVC5pc1JlZihvKSlXcihvLnZhbHVlLGMpO2Vsc2UgaWYoZi5pc0FycmF5KG8pKWZvcih2YXIgdj0wO3Y8by5sZW5ndGg7disrKVdyKG9bdl0sYyk7ZWxzZSBpZihmLmlzU2V0KG8pfHxmLmlzTWFwKG8pKW8uZm9yRWFjaChQPT57V3IoUCxjKX0pO2Vsc2UgaWYoZi5pc1BsYWluT2JqZWN0KG8pKWZvcih2YXIgRSBpbiBvKVdyKG9bRV0sYyk7cmV0dXJuIG99ZnVuY3Rpb24gQnIoKXt2YXIgbz17aXNNb3VudGVkOiExLGlzTGVhdmluZzohMSxpc1VubW91bnRpbmc6ITEsbGVhdmluZ1ZOb2RlczpuZXcgTWFwfTtyZXR1cm4gUGkoKCk9PntvLmlzTW91bnRlZD0hMH0pLFlyKCgpPT57by5pc1VubW91bnRpbmc9ITB9KSxvfXZhciBIbj1bRnVuY3Rpb24sQXJyYXldLEJuPXtuYW1lOiJCYXNlVHJhbnNpdGlvbiIscHJvcHM6e21vZGU6U3RyaW5nLGFwcGVhcjpCb29sZWFuLHBlcnNpc3RlZDpCb29sZWFuLG9uQmVmb3JlRW50ZXI6SG4sb25FbnRlcjpIbixvbkFmdGVyRW50ZXI6SG4sb25FbnRlckNhbmNlbGxlZDpIbixvbkJlZm9yZUxlYXZlOkhuLG9uTGVhdmU6SG4sb25BZnRlckxlYXZlOkhuLG9uTGVhdmVDYW5jZWxsZWQ6SG4sb25CZWZvcmVBcHBlYXI6SG4sb25BcHBlYXI6SG4sb25BZnRlckFwcGVhcjpIbixvbkFwcGVhckNhbmNlbGxlZDpIbn0sc2V0dXAobyxjKXt2YXJ7c2xvdHM6dn09YyxFPUFuKCksUD1CcigpLEM7cmV0dXJuKCk9Pnt2YXIgVj12LmRlZmF1bHQmJlduKHYuZGVmYXVsdCgpLCEwKTtpZighKCFWfHwhVi5sZW5ndGgpKXt2YXIgRz1WWzBdO2lmKFYubGVuZ3RoPjEpe2Zvcih2YXIgcSBvZiBWKWlmKHEudHlwZSE9PXV0KXtHPXE7YnJlYWt9fXZhciBhZT1ULnRvUmF3KG8pLHttb2RlOkxlfT1hZTtpZihQLmlzTGVhdmluZylyZXR1cm4gZmkoRyk7dmFyIFhlPWRpKEcpO2lmKCFYZSlyZXR1cm4gZmkoRyk7dmFyIHNlPVV0KFhlLGFlLFAsRSk7S3QoWGUsc2UpO3ZhciAkZT1FLnN1YlRyZWUsV2U9JGUmJmRpKCRlKSxfdD0hMSx7Z2V0VHJhbnNpdGlvbktleTpQdH09WGUudHlwZTtpZihQdCl7dmFyIF9lPVB0KCk7Qz09PXZvaWQgMD9DPV9lOl9lIT09QyYmKEM9X2UsX3Q9ITApfWlmKFdlJiZXZS50eXBlIT09dXQmJighb3IoWGUsV2UpfHxfdCkpe3ZhciBmZT1VdChXZSxhZSxQLEUpO2lmKEt0KFdlLGZlKSxMZT09PSJvdXQtaW4iKXJldHVybiBQLmlzTGVhdmluZz0hMCxmZS5hZnRlckxlYXZlPSgpPT57UC5pc0xlYXZpbmc9ITEsRS51cGRhdGUoKX0sZmkoRyk7TGU9PT0iaW4tb3V0IiYmWGUudHlwZSE9PXV0JiYoZmUuZGVsYXlMZWF2ZT0oVGUsaSxzKT0+e3ZhciBkPU9pKFAsV2UpO2RbU3RyaW5nKFdlLmtleSldPVdlLFRlLl9sZWF2ZUNiPSgpPT57aSgpLFRlLl9sZWF2ZUNiPXZvaWQgMCxkZWxldGUgc2UuZGVsYXllZExlYXZlfSxzZS5kZWxheWVkTGVhdmU9c30pfXJldHVybiBHfX19fSxObz1CbjtmdW5jdGlvbiBPaShvLGMpe3ZhcntsZWF2aW5nVk5vZGVzOnZ9PW8sRT12LmdldChjLnR5cGUpO3JldHVybiBFfHwoRT1PYmplY3QuY3JlYXRlKG51bGwpLHYuc2V0KGMudHlwZSxFKSksRX1mdW5jdGlvbiBVdChvLGMsdixFKXt2YXJ7YXBwZWFyOlAsbW9kZTpDLHBlcnNpc3RlZDpWPSExLG9uQmVmb3JlRW50ZXI6RyxvbkVudGVyOnEsb25BZnRlckVudGVyOmFlLG9uRW50ZXJDYW5jZWxsZWQ6TGUsb25CZWZvcmVMZWF2ZTpYZSxvbkxlYXZlOnNlLG9uQWZ0ZXJMZWF2ZTokZSxvbkxlYXZlQ2FuY2VsbGVkOldlLG9uQmVmb3JlQXBwZWFyOl90LG9uQXBwZWFyOlB0LG9uQWZ0ZXJBcHBlYXI6X2Usb25BcHBlYXJDYW5jZWxsZWQ6ZmV9PWMsVGU9U3RyaW5nKG8ua2V5KSxpPU9pKHYsbykscz0oeSx3KT0+e3kmJnRlKHksRSw5LHcpfSxkPSh5LHcpPT57dmFyIEk9d1sxXTtzKHksdyksZi5pc0FycmF5KHkpP3kuZXZlcnkoTD0+TC5sZW5ndGg8PTEpJiZJKCk6eS5sZW5ndGg8PTEmJkkoKX0scD17bW9kZTpDLHBlcnNpc3RlZDpWLGJlZm9yZUVudGVyKHkpe3ZhciB3PUc7aWYoIXYuaXNNb3VudGVkKWlmKFApdz1fdHx8RztlbHNlIHJldHVybjt5Ll9sZWF2ZUNiJiZ5Ll9sZWF2ZUNiKCEwKTt2YXIgST1pW1RlXTtJJiZvcihvLEkpJiZJLmVsLl9sZWF2ZUNiJiZJLmVsLl9sZWF2ZUNiKCkscyh3LFt5XSl9LGVudGVyKHkpe3ZhciB3PXEsST1hZSxMPUxlO2lmKCF2LmlzTW91bnRlZClpZihQKXc9UHR8fHEsST1fZXx8YWUsTD1mZXx8TGU7ZWxzZSByZXR1cm47dmFyICQ9ITEsZWU9eS5fZW50ZXJDYj1pZT0+eyR8fCgkPSEwLGllP3MoTCxbeV0pOnMoSSxbeV0pLHAuZGVsYXllZExlYXZlJiZwLmRlbGF5ZWRMZWF2ZSgpLHkuX2VudGVyQ2I9dm9pZCAwKX07dz9kKHcsW3ksZWVdKTplZSgpfSxsZWF2ZSh5LHcpe3ZhciBJPVN0cmluZyhvLmtleSk7aWYoeS5fZW50ZXJDYiYmeS5fZW50ZXJDYighMCksdi5pc1VubW91bnRpbmcpcmV0dXJuIHcoKTtzKFhlLFt5XSk7dmFyIEw9ITEsJD15Ll9sZWF2ZUNiPWVlPT57THx8KEw9ITAsdygpLGVlP3MoV2UsW3ldKTpzKCRlLFt5XSkseS5fbGVhdmVDYj12b2lkIDAsaVtJXT09PW8mJmRlbGV0ZSBpW0ldKX07aVtJXT1vLHNlP2Qoc2UsW3ksJF0pOiQoKX0sY2xvbmUoeSl7cmV0dXJuIFV0KHksYyx2LEUpfX07cmV0dXJuIHB9ZnVuY3Rpb24gZmkobyl7aWYoaGkobykpcmV0dXJuIG89cXIobyksby5jaGlsZHJlbj1udWxsLG99ZnVuY3Rpb24gZGkobyl7cmV0dXJuIGhpKG8pP28uY2hpbGRyZW4/by5jaGlsZHJlblswXTp2b2lkIDA6b31mdW5jdGlvbiBLdChvLGMpe28uc2hhcGVGbGFnJjYmJm8uY29tcG9uZW50P0t0KG8uY29tcG9uZW50LnN1YlRyZWUsYyk6by5zaGFwZUZsYWcmMTI4PyhvLnNzQ29udGVudC50cmFuc2l0aW9uPWMuY2xvbmUoby5zc0NvbnRlbnQpLG8uc3NGYWxsYmFjay50cmFuc2l0aW9uPWMuY2xvbmUoby5zc0ZhbGxiYWNrKSk6by50cmFuc2l0aW9uPWN9ZnVuY3Rpb24gV24obyl7Zm9yKHZhciBjPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTohMSx2PWFyZ3VtZW50cy5sZW5ndGg+Mj9hcmd1bWVudHNbMl06dm9pZCAwLEU9W10sUD0wLEM9MDtDPG8ubGVuZ3RoO0MrKyl7dmFyIFY9b1tDXSxHPXY9PW51bGw/Vi5rZXk6U3RyaW5nKHYpK1N0cmluZyhWLmtleSE9bnVsbD9WLmtleTpDKTtWLnR5cGU9PT1udD8oVi5wYXRjaEZsYWcmMTI4JiZQKyssRT1FLmNvbmNhdChXbihWLmNoaWxkcmVuLGMsRykpKTooY3x8Vi50eXBlIT09dXQpJiZFLnB1c2goRyE9bnVsbD9xcihWLHtrZXk6R30pOlYpfWlmKFA+MSlmb3IodmFyIHE9MDtxPEUubGVuZ3RoO3ErKylFW3FdLnBhdGNoRmxhZz0tMjtyZXR1cm4gRX1mdW5jdGlvbiBPcihvKXtyZXR1cm4gZi5pc0Z1bmN0aW9uKG8pP3tzZXR1cDpvLG5hbWU6by5uYW1lfTpvfXZhciBJbj1vPT4hIW8udHlwZS5fX2FzeW5jTG9hZGVyO2Z1bmN0aW9uIFRpKG8pe2YuaXNGdW5jdGlvbihvKSYmKG89e2xvYWRlcjpvfSk7dmFye2xvYWRlcjpjLGxvYWRpbmdDb21wb25lbnQ6dixlcnJvckNvbXBvbmVudDpFLGRlbGF5OlA9MjAwLHRpbWVvdXQ6QyxzdXNwZW5zaWJsZTpWPSEwLG9uRXJyb3I6R309byxxPW51bGwsYWUsTGU9MCxYZT0oKT0+KExlKysscT1udWxsLHNlKCkpLHNlPSgpPT57dmFyICRlO3JldHVybiBxfHwoJGU9cT1jKCkuY2F0Y2goV2U9PntpZihXZT1XZSBpbnN0YW5jZW9mIEVycm9yP1dlOm5ldyBFcnJvcihTdHJpbmcoV2UpKSxHKXJldHVybiBuZXcgUHJvbWlzZSgoX3QsUHQpPT57dmFyIF9lPSgpPT5fdChYZSgpKSxmZT0oKT0+UHQoV2UpO0coV2UsX2UsZmUsTGUrMSl9KTt0aHJvdyBXZX0pLnRoZW4oV2U9PiRlIT09cSYmcT9xOihXZSYmKFdlLl9fZXNNb2R1bGV8fFdlW1N5bWJvbC50b1N0cmluZ1RhZ109PT0iTW9kdWxlIikmJihXZT1XZS5kZWZhdWx0KSxhZT1XZSxXZSkpKX07cmV0dXJuIE9yKHtuYW1lOiJBc3luY0NvbXBvbmVudFdyYXBwZXIiLF9fYXN5bmNMb2FkZXI6c2UsZ2V0IF9fYXN5bmNSZXNvbHZlZCgpe3JldHVybiBhZX0sc2V0dXAoKXt2YXIgJGU9R247aWYoYWUpcmV0dXJuKCk9PmtvKGFlLCRlKTt2YXIgV2U9ZmU9PntxPW51bGwsRW4oZmUsJGUsMTMpfTtpZihWJiYkZS5zdXNwZW5zZXx8Ti5pc0luU1NSQ29tcG9uZW50U2V0dXApcmV0dXJuIHNlKCkudGhlbihmZT0+KCk9PmtvKGZlLCRlKSkuY2F0Y2goZmU9PihXZShmZSksKCk9PkU/THQoRSx7ZXJyb3I6ZmV9KTpudWxsKSk7dmFyIF90PVQucmVmKCExKSxQdD1ULnJlZigpLF9lPVQucmVmKCEhUCk7cmV0dXJuIFAmJnNldFRpbWVvdXQoKCk9PntfZS52YWx1ZT0hMX0sUCksQyE9bnVsbCYmc2V0VGltZW91dCgoKT0+e2lmKCFfdC52YWx1ZSYmIVB0LnZhbHVlKXt2YXIgZmU9bmV3IEVycm9yKCJBc3luYyBjb21wb25lbnQgdGltZWQgb3V0IGFmdGVyICIuY29uY2F0KEMsIm1zLiIpKTtXZShmZSksUHQudmFsdWU9ZmV9fSxDKSxzZSgpLnRoZW4oKCk9PntfdC52YWx1ZT0hMCwkZS5wYXJlbnQmJmhpKCRlLnBhcmVudC52bm9kZSkmJm5uKCRlLnBhcmVudC51cGRhdGUpfSkuY2F0Y2goZmU9PntXZShmZSksUHQudmFsdWU9ZmV9KSwoKT0+e2lmKF90LnZhbHVlJiZhZSlyZXR1cm4ga28oYWUsJGUpO2lmKFB0LnZhbHVlJiZFKXJldHVybiBMdChFLHtlcnJvcjpQdC52YWx1ZX0pO2lmKHYmJiFfZS52YWx1ZSlyZXR1cm4gTHQodil9fX0pfWZ1bmN0aW9uIGtvKG8sYyl7dmFye3Zub2RlOntyZWY6dixwcm9wczpFLGNoaWxkcmVuOlAsc2hhcGVGbGFnOkN9LHBhcmVudDpWfT1jLEc9THQobyxFLFApO3JldHVybiBHLnJlZj12LEd9dmFyIGhpPW89Pm8udHlwZS5fX2lzS2VlcEFsaXZlLG5vPXtuYW1lOiJLZWVwQWxpdmUiLF9faXNLZWVwQWxpdmU6ITAscHJvcHM6e2luY2x1ZGU6W1N0cmluZyxSZWdFeHAsQXJyYXldLGV4Y2x1ZGU6W1N0cmluZyxSZWdFeHAsQXJyYXldLG1heDpbU3RyaW5nLE51bWJlcl19LHNldHVwKG8sYyl7dmFye3Nsb3RzOnZ9PWMsRT1BbigpLFA9RS5jdHg7aWYoIVAucmVuZGVyZXIpcmV0dXJuKCk9Pnt2YXIgVGU9di5kZWZhdWx0JiZ2LmRlZmF1bHQoKTtyZXR1cm4gVGUmJlRlLmxlbmd0aD09PTE/VGVbMF06VGV9O3ZhciBDPW5ldyBNYXAsVj1uZXcgU2V0LEc9bnVsbCxxPUUuc3VzcGVuc2Use3JlbmRlcmVyOntwOmFlLG06TGUsdW06WGUsbzp7Y3JlYXRlRWxlbWVudDpzZX19fT1QLCRlPXNlKCJkaXYiKTtQLmFjdGl2YXRlPShUZSxpLHMsZCxwKT0+e3ZhciB5PVRlLmNvbXBvbmVudDtMZShUZSxpLHMsMCxxKSxhZSh5LnZub2RlLFRlLGkscyx5LHEsZCxUZS5zbG90U2NvcGVJZHMscCksbSgoKT0+e3kuaXNEZWFjdGl2YXRlZD0hMSx5LmEmJmYuaW52b2tlQXJyYXlGbnMoeS5hKTt2YXIgdz1UZS5wcm9wcyYmVGUucHJvcHMub25Wbm9kZU1vdW50ZWQ7dyYmUHIodyx5LnBhcmVudCxUZSl9LHEpfSxQLmRlYWN0aXZhdGU9VGU9Pnt2YXIgaT1UZS5jb21wb25lbnQ7TGUoVGUsJGUsbnVsbCwxLHEpLG0oKCk9PntpLmRhJiZmLmludm9rZUFycmF5Rm5zKGkuZGEpO3ZhciBzPVRlLnByb3BzJiZUZS5wcm9wcy5vblZub2RlVW5tb3VudGVkO3MmJlByKHMsaS5wYXJlbnQsVGUpLGkuaXNEZWFjdGl2YXRlZD0hMH0scSl9O2Z1bmN0aW9uIFdlKFRlKXtUcihUZSksWGUoVGUsRSxxLCEwKX1mdW5jdGlvbiBfdChUZSl7Qy5mb3JFYWNoKChpLHMpPT57dmFyIGQ9ZXIoaS50eXBlKTtkJiYoIVRlfHwhVGUoZCkpJiZQdChzKX0pfWZ1bmN0aW9uIFB0KFRlKXt2YXIgaT1DLmdldChUZSk7IUd8fGkudHlwZSE9PUcudHlwZT9XZShpKTpHJiZUcihHKSxDLmRlbGV0ZShUZSksVi5kZWxldGUoVGUpfU10KCgpPT5bby5pbmNsdWRlLG8uZXhjbHVkZV0sVGU9Pnt2YXJbaSxzXT1UZTtpJiZfdChkPT5VaShpLGQpKSxzJiZfdChkPT4hVWkocyxkKSl9LHtmbHVzaDoicG9zdCIsZGVlcDohMH0pO3ZhciBfZT1udWxsLGZlPSgpPT57X2UhPW51bGwmJkMuc2V0KF9lLEhpKEUuc3ViVHJlZSkpfTtyZXR1cm4gUGkoZmUpLHBpKGZlKSxZcigoKT0+e0MuZm9yRWFjaChUZT0+e3ZhcntzdWJUcmVlOmksc3VzcGVuc2U6c309RSxkPUhpKGkpO2lmKFRlLnR5cGU9PT1kLnR5cGUpe1RyKGQpO3ZhciBwPWQuY29tcG9uZW50LmRhO3AmJm0ocCxzKTtyZXR1cm59V2UoVGUpfSl9KSwoKT0+e2lmKF9lPW51bGwsIXYuZGVmYXVsdClyZXR1cm4gbnVsbDt2YXIgVGU9di5kZWZhdWx0KCksaT1UZVswXTtpZihUZS5sZW5ndGg+MSlyZXR1cm4gRz1udWxsLFRlO2lmKCFtaShpKXx8IShpLnNoYXBlRmxhZyY0KSYmIShpLnNoYXBlRmxhZyYxMjgpKXJldHVybiBHPW51bGwsaTt2YXIgcz1IaShpKSxkPXMudHlwZSxwPWVyKEluKHMpP3MudHlwZS5fX2FzeW5jUmVzb2x2ZWR8fHt9OmQpLHtpbmNsdWRlOnksZXhjbHVkZTp3LG1heDpJfT1vO2lmKHkmJighcHx8IVVpKHkscCkpfHx3JiZwJiZVaSh3LHApKXJldHVybiBHPXMsaTt2YXIgTD1zLmtleT09bnVsbD9kOnMua2V5LCQ9Qy5nZXQoTCk7cmV0dXJuIHMuZWwmJihzPXFyKHMpLGkuc2hhcGVGbGFnJjEyOCYmKGkuc3NDb250ZW50PXMpKSxfZT1MLCQ/KHMuZWw9JC5lbCxzLmNvbXBvbmVudD0kLmNvbXBvbmVudCxzLnRyYW5zaXRpb24mJkt0KHMscy50cmFuc2l0aW9uKSxzLnNoYXBlRmxhZ3w9NTEyLFYuZGVsZXRlKEwpLFYuYWRkKEwpKTooVi5hZGQoTCksSSYmVi5zaXplPnBhcnNlSW50KEksMTApJiZQdChWLnZhbHVlcygpLm5leHQoKS52YWx1ZSkpLHMuc2hhcGVGbGFnfD0yNTYsRz1zLHVyKGkudHlwZSk/aTpzfX19LFFvPW5vO2Z1bmN0aW9uIFVpKG8sYyl7cmV0dXJuIGYuaXNBcnJheShvKT9vLnNvbWUodj0+VWkodixjKSk6Zi5pc1N0cmluZyhvKT9vLnNwbGl0KCIsIikuaW5jbHVkZXMoYyk6by50ZXN0P28udGVzdChjKTohMX1mdW5jdGlvbiBLbihvLGMpe0puKG8sImEiLGMpfWZ1bmN0aW9uIHByKG8sYyl7Sm4obywiZGEiLGMpfWZ1bmN0aW9uIEpuKG8sYyl7dmFyIHY9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOkduLEU9by5fX3dkY3x8KG8uX193ZGM9KCk9Pntmb3IodmFyIEM9djtDOyl7aWYoQy5pc0RlYWN0aXZhdGVkKXJldHVybjtDPUMucGFyZW50fXJldHVybiBvKCl9KTtpZih0aShjLEUsdiksdilmb3IodmFyIFA9di5wYXJlbnQ7UCYmUC5wYXJlbnQ7KWhpKFAucGFyZW50LnZub2RlKSYmTXIoRSxjLHYsUCksUD1QLnBhcmVudH1mdW5jdGlvbiBNcihvLGMsdixFKXt2YXIgUD10aShjLG8sRSwhMCk7dmkoKCk9PntmLnJlbW92ZShFW2NdLFApfSx2KX1mdW5jdGlvbiBUcihvKXt2YXIgYz1vLnNoYXBlRmxhZztjJjI1NiYmKGMtPTI1NiksYyY1MTImJihjLT01MTIpLG8uc2hhcGVGbGFnPWN9ZnVuY3Rpb24gSGkobyl7cmV0dXJuIG8uc2hhcGVGbGFnJjEyOD9vLnNzQ29udGVudDpvfWZ1bmN0aW9uIHRpKG8sYyl7dmFyIHY9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOkduLEU9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiExO2lmKHYpe2lmKHplLmlzUm9vdEhvb2sobykmJnYhPT12LnJvb3QmJih2PXYucm9vdCx6ZS5pc1Jvb3RJbW1lZGlhdGVIb29rKG8pKSl7dmFyIFA9di5wcm94eTt0ZShjLmJpbmQoUCksdixvLHplLk9OX0xPQUQ9PT1vP1tQLiRwYWdlLm9wdGlvbnNdOltdKX12YXIgQz12W29dfHwodltvXT1bXSksVj1jLl9fd2VofHwoYy5fX3dlaD1mdW5jdGlvbigpe2lmKCF2LmlzVW5tb3VudGVkKXtULnBhdXNlVHJhY2tpbmcoKSxRbih2KTtmb3IodmFyIEc9YXJndW1lbnRzLmxlbmd0aCxxPW5ldyBBcnJheShHKSxhZT0wO2FlPEc7YWUrKylxW2FlXT1hcmd1bWVudHNbYWVdO3ZhciBMZT10ZShjLHYsbyxxKTtyZXR1cm4gRnIoKSxULnJlc2V0VHJhY2tpbmcoKSxMZX19KTtyZXR1cm4gRT9DLnVuc2hpZnQoVik6Qy5wdXNoKFYpLFZ9fXZhciB2cj1vPT5mdW5jdGlvbihjKXt2YXIgdj1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06R247cmV0dXJuKCFOLmlzSW5TU1JDb21wb25lbnRTZXR1cHx8bz09PSJzcCIpJiZ0aShvLGMsdil9LEdyPXZyKCJibSIpLFBpPXZyKCJtIiksZ2k9dnIoImJ1IikscGk9dnIoInUiKSxZcj12cigiYnVtIiksdmk9dnIoInVtIikscm89dnIoInNwIiksamk9dnIoInJ0ZyIpLGlvPXZyKCJydGMiKTtmdW5jdGlvbiB4KG8pe3ZhciBjPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTpHbjt0aSgiZWMiLG8sYyl9ZnVuY3Rpb24gbmUobyxjKXt2YXIgdj1DbjtpZih2PT09bnVsbClyZXR1cm4gbztmb3IodmFyIEU9VHQodil8fHYucHJveHksUD1vLmRpcnN8fChvLmRpcnM9W10pLEM9MDtDPGMubGVuZ3RoO0MrKyl7dmFyW1YsRyxxLGFlPWYuRU1QVFlfT0JKXT1jW0NdO2YuaXNGdW5jdGlvbihWKSYmKFY9e21vdW50ZWQ6Vix1cGRhdGVkOlZ9KSxWLmRlZXAmJldyKEcpLFAucHVzaCh7ZGlyOlYsaW5zdGFuY2U6RSx2YWx1ZTpHLG9sZFZhbHVlOnZvaWQgMCxhcmc6cSxtb2RpZmllcnM6YWV9KX1yZXR1cm4gb31mdW5jdGlvbiBkZShvLGMsdixFKXtmb3IodmFyIFA9by5kaXJzLEM9YyYmYy5kaXJzLFY9MDtWPFAubGVuZ3RoO1YrKyl7dmFyIEc9UFtWXTtDJiYoRy5vbGRWYWx1ZT1DW1ZdLnZhbHVlKTt2YXIgcT1HLmRpcltFXTtxJiYoVC5wYXVzZVRyYWNraW5nKCksdGUocSx2LDgsW28uZWwsRyxvLGNdKSxULnJlc2V0VHJhY2tpbmcoKSl9fXZhciBIPSJjb21wb25lbnRzIixNPSJkaXJlY3RpdmVzIjtmdW5jdGlvbiBKKG8sYyl7cmV0dXJuIE1uKEgsbywhMCxjKXx8b312YXIgWD1TeW1ib2woKTtmdW5jdGlvbiB1ZShvKXtyZXR1cm4gZi5pc1N0cmluZyhvKT9NbihILG8sITEpfHxvOm98fFh9ZnVuY3Rpb24gdG4obyl7cmV0dXJuIE1uKE0sbyl9ZnVuY3Rpb24gTW4obyxjKXt2YXIgdj1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106ITEsRT1Dbnx8R247aWYoRSl7dmFyIFA9RS50eXBlO2lmKG89PT1IKXt2YXIgQz1lcihQLCExKTtpZihDJiYoQz09PWN8fEM9PT1mLmNhbWVsaXplKGMpfHxDPT09Zi5jYXBpdGFsaXplKGYuY2FtZWxpemUoYykpKSlyZXR1cm4gUH12YXIgVj1jbihFW29dfHxQW29dLGMpfHxjbihFLmFwcENvbnRleHRbb10sYyk7cmV0dXJuIVYmJnY/UDpWfX1mdW5jdGlvbiBjbihvLGMpe3JldHVybiBvJiYob1tjXXx8b1tmLmNhbWVsaXplKGMpXXx8b1tmLmNhcGl0YWxpemUoZi5jYW1lbGl6ZShjKSldKX1mdW5jdGlvbiBuaShvLGMsdixFKXt2YXIgUCxDPXYmJnZbRV07aWYoZi5pc0FycmF5KG8pfHxmLmlzU3RyaW5nKG8pKXtQPW5ldyBBcnJheShvLmxlbmd0aCk7Zm9yKHZhciBWPTAsRz1vLmxlbmd0aDtWPEc7VisrKVBbVl09YyhvW1ZdLFYsdm9pZCAwLEMmJkNbVl0pfWVsc2UgaWYodHlwZW9mIG89PSJudW1iZXIiKXtQPW5ldyBBcnJheShvKTtmb3IodmFyIHE9MDtxPG87cSsrKVBbcV09YyhxKzEscSx2b2lkIDAsQyYmQ1txXSl9ZWxzZSBpZihmLmlzT2JqZWN0KG8pKWlmKG9bU3ltYm9sLml0ZXJhdG9yXSlQPUFycmF5LmZyb20obywoJGUsV2UpPT5jKCRlLFdlLHZvaWQgMCxDJiZDW1dlXSkpO2Vsc2V7dmFyIGFlPU9iamVjdC5rZXlzKG8pO1A9bmV3IEFycmF5KGFlLmxlbmd0aCk7Zm9yKHZhciBMZT0wLFhlPWFlLmxlbmd0aDtMZTxYZTtMZSsrKXt2YXIgc2U9YWVbTGVdO1BbTGVdPWMob1tzZV0sc2UsTGUsQyYmQ1tMZV0pfX1lbHNlIFA9W107cmV0dXJuIHYmJih2W0VdPVApLFB9ZnVuY3Rpb24gbXIobyxjKXtmb3IodmFyIHY9MDt2PGMubGVuZ3RoO3YrKyl7dmFyIEU9Y1t2XTtpZihmLmlzQXJyYXkoRSkpZm9yKHZhciBQPTA7UDxFLmxlbmd0aDtQKyspb1tFW1BdLm5hbWVdPUVbUF0uZm47ZWxzZSBFJiYob1tFLm5hbWVdPUUuZm4pfXJldHVybiBvfWZ1bmN0aW9uIGVhKG8sYyl7dmFyIHY9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOnt9LEU9YXJndW1lbnRzLmxlbmd0aD4zP2FyZ3VtZW50c1szXTp2b2lkIDAsUD1hcmd1bWVudHMubGVuZ3RoPjQ/YXJndW1lbnRzWzRdOnZvaWQgMDtpZihDbi5pc0NFfHxDbi5wYXJlbnQmJkluKENuLnBhcmVudCkmJkNuLnBhcmVudC5pc0NFKXJldHVybiBMdCgic2xvdCIsYz09PSJkZWZhdWx0Ij9udWxsOntuYW1lOmN9LEUmJkUoKSk7dmFyIEM9b1tjXTtDJiZDLl9jJiYoQy5fZD0hMSksT3QoKTt2YXIgVj1DJiZ6byhDKHYpKSxHPUxuKG50LHtrZXk6di5rZXl8fCJfIi5jb25jYXQoYyl9LFZ8fChFP0UoKTpbXSksViYmby5fPT09MT82NDotMik7cmV0dXJuIVAmJkcuc2NvcGVJZCYmKEcuc2xvdFNjb3BlSWRzPVtHLnNjb3BlSWQrIi1zIl0pLEMmJkMuX2MmJihDLl9kPSEwKSxHfWZ1bmN0aW9uIHpvKG8pe3JldHVybiBvLnNvbWUoYz0+bWkoYyk/IShjLnR5cGU9PT11dHx8Yy50eXBlPT09bnQmJiF6byhjLmNoaWxkcmVuKSk6ITApP286bnVsbH1mdW5jdGlvbiB0YShvKXt2YXIgYz17fTtmb3IodmFyIHYgaW4gbyljW2YudG9IYW5kbGVyS2V5KHYpXT1vW3ZdO3JldHVybiBjfXZhciBSbz1vPT5vP2tpKG8pP1R0KG8pfHxvLnByb3h5OlJvKG8ucGFyZW50KTpudWxsLGJvPWYuZXh0ZW5kKE9iamVjdC5jcmVhdGUobnVsbCkseyQ6bz0+bywkZWw6bz0+by52bm9kZS5lbCwkZGF0YTpvPT5vLmRhdGEsJHByb3BzOm89Pm8ucHJvcHMsJGF0dHJzOm89Pm8uYXR0cnMsJHNsb3RzOm89Pm8uc2xvdHMsJHJlZnM6bz0+by5yZWZzLCRwYXJlbnQ6bz0+Um8oby5wYXJlbnQpLCRyb290Om89PlJvKG8ucm9vdCksJGVtaXQ6bz0+by5lbWl0LCRvcHRpb25zOm89PmZyKG8pLCRmb3JjZVVwZGF0ZTpvPT5vLmZ8fChvLmY9KCk9Pm5uKG8udXBkYXRlKSksJG5leHRUaWNrOm89Pm8ubnx8KG8ubj12dC5iaW5kKG8ucHJveHkpKSwkd2F0Y2g6bz0+Q2kuYmluZChvKX0pLG9vPXtnZXQobyxjKXt2YXJ7Xzp2fT1vLHtjdHg6RSxzZXR1cFN0YXRlOlAsZGF0YTpDLHByb3BzOlYsYWNjZXNzQ2FjaGU6Ryx0eXBlOnEsYXBwQ29udGV4dDphZX09dixMZTtpZihjWzBdIT09IiQiKXt2YXIgWGU9R1tjXTtpZihYZSE9PXZvaWQgMClzd2l0Y2goWGUpe2Nhc2UgMTpyZXR1cm4gUFtjXTtjYXNlIDI6cmV0dXJuIENbY107Y2FzZSA0OnJldHVybiBFW2NdO2Nhc2UgMzpyZXR1cm4gVltjXX1lbHNle2lmKFAhPT1mLkVNUFRZX09CSiYmZi5oYXNPd24oUCxjKSlyZXR1cm4gR1tjXT0xLFBbY107aWYoQyE9PWYuRU1QVFlfT0JKJiZmLmhhc093bihDLGMpKXJldHVybiBHW2NdPTIsQ1tjXTtpZigoTGU9di5wcm9wc09wdGlvbnNbMF0pJiZmLmhhc093bihMZSxjKSlyZXR1cm4gR1tjXT0zLFZbY107aWYoRSE9PWYuRU1QVFlfT0JKJiZmLmhhc093bihFLGMpKXJldHVybiBHW2NdPTQsRVtjXTtuYSYmKEdbY109MCl9fXZhciBzZT1ib1tjXSwkZSxXZTtpZihzZSlyZXR1cm4gYz09PSIkYXR0cnMiJiZULnRyYWNrKHYsImdldCIsYyksc2Uodik7aWYoKCRlPXEuX19jc3NNb2R1bGVzKSYmKCRlPSRlW2NdKSlyZXR1cm4gJGU7aWYoRSE9PWYuRU1QVFlfT0JKJiZmLmhhc093bihFLGMpKXJldHVybiBHW2NdPTQsRVtjXTtpZihXZT1hZS5jb25maWcuZ2xvYmFsUHJvcGVydGllcyxmLmhhc093bihXZSxjKSlyZXR1cm4gV2VbY119LHNldChvLGMsdil7dmFye186RX09byx7ZGF0YTpQLHNldHVwU3RhdGU6QyxjdHg6Vn09RTtyZXR1cm4gQyE9PWYuRU1QVFlfT0JKJiZmLmhhc093bihDLGMpPyhDW2NdPXYsITApOlAhPT1mLkVNUFRZX09CSiYmZi5oYXNPd24oUCxjKT8oUFtjXT12LCEwKTpmLmhhc093bihFLnByb3BzLGMpfHxjWzBdPT09IiQiJiZjLnNsaWNlKDEpaW4gRT8hMTooVltjXT12LCEwKX0saGFzKG8sYyl7dmFye186e2RhdGE6dixzZXR1cFN0YXRlOkUsYWNjZXNzQ2FjaGU6UCxjdHg6QyxhcHBDb250ZXh0OlYscHJvcHNPcHRpb25zOkd9fT1vLHE7cmV0dXJuISFQW2NdfHx2IT09Zi5FTVBUWV9PQkomJmYuaGFzT3duKHYsYyl8fEUhPT1mLkVNUFRZX09CSiYmZi5oYXNPd24oRSxjKXx8KHE9R1swXSkmJmYuaGFzT3duKHEsYyl8fGYuaGFzT3duKEMsYyl8fGYuaGFzT3duKGJvLGMpfHxmLmhhc093bihWLmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzLGMpfSxkZWZpbmVQcm9wZXJ0eShvLGMsdil7cmV0dXJuIHYuZ2V0IT1udWxsP28uXy5hY2Nlc3NDYWNoZVtjXT0wOmYuaGFzT3duKHYsInZhbHVlIikmJnRoaXMuc2V0KG8sYyx2LnZhbHVlLG51bGwpLFJlZmxlY3QuZGVmaW5lUHJvcGVydHkobyxjLHYpfX0sUmE9Zi5leHRlbmQoe30sb28se2dldChvLGMpe2lmKGMhPT1TeW1ib2wudW5zY29wYWJsZXMpcmV0dXJuIG9vLmdldChvLGMsbyl9LGhhcyhvLGMpe3ZhciB2PWNbMF0hPT0iXyImJiFmLmlzR2xvYmFsbHlXaGl0ZWxpc3RlZChjKTtyZXR1cm4gdn19KSxuYT0hMDtmdW5jdGlvbiBfYShvKXt2YXIgYz1mcihvKSx2PW8ucHJveHksRT1vLmN0eDtuYT0hMSxjLmJlZm9yZUNyZWF0ZSYmcmEoYy5iZWZvcmVDcmVhdGUsbywiYmMiKTt2YXJ7ZGF0YTpQLGNvbXB1dGVkOkMsbWV0aG9kczpWLHdhdGNoOkcscHJvdmlkZTpxLGluamVjdDphZSxjcmVhdGVkOkxlLGJlZm9yZU1vdW50OlhlLG1vdW50ZWQ6c2UsYmVmb3JlVXBkYXRlOiRlLHVwZGF0ZWQ6V2UsYWN0aXZhdGVkOl90LGRlYWN0aXZhdGVkOlB0LGJlZm9yZURlc3Ryb3k6X2UsYmVmb3JlVW5tb3VudDpmZSxkZXN0cm95ZWQ6VGUsdW5tb3VudGVkOmkscmVuZGVyOnMscmVuZGVyVHJhY2tlZDpkLHJlbmRlclRyaWdnZXJlZDpwLGVycm9yQ2FwdHVyZWQ6eSxzZXJ2ZXJQcmVmZXRjaDp3LGV4cG9zZTpJLGluaGVyaXRBdHRyczpMLGNvbXBvbmVudHM6JCxkaXJlY3RpdmVzOmVlLGZpbHRlcnM6aWV9PWMsSWU9bnVsbDtpZihhZSYmdHMoYWUsRSxJZSxvLmFwcENvbnRleHQuY29uZmlnLnVud3JhcEluamVjdGVkUmVmKSxWKWZvcih2YXIgb2UgaW4gVil7dmFyIENlPVZbb2VdO2YuaXNGdW5jdGlvbihDZSkmJihFW29lXT1DZS5iaW5kKHYpKX1pZihQKXt2YXIgQmU9UC5jYWxsKHYsdik7Zi5pc09iamVjdChCZSkmJihvLmRhdGE9VC5yZWFjdGl2ZShCZSkpfWlmKG5hPSEwLEMpe3ZhciBmdD1mdW5jdGlvbihSZSl7dmFyIGx0PUNbUmVdLHhlPWYuaXNGdW5jdGlvbihsdCk/bHQuYmluZCh2LHYpOmYuaXNGdW5jdGlvbihsdC5nZXQpP2x0LmdldC5iaW5kKHYsdik6Zi5OT09QLEl0PSFmLmlzRnVuY3Rpb24obHQpJiZmLmlzRnVuY3Rpb24obHQuc2V0KT9sdC5zZXQuYmluZCh2KTpmLk5PT1AsQ3Q9Rm8oe2dldDp4ZSxzZXQ6SXR9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoRSxSZSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OigpPT5DdC52YWx1ZSxzZXQ6QnQ9PkN0LnZhbHVlPUJ0fSl9O2Zvcih2YXIgQXQgaW4gQylmdChBdCl9aWYoRylmb3IodmFyIG1lIGluIEcpeGEoR1ttZV0sRSx2LG1lKTtpZihxKXt2YXIgbGU9Zi5pc0Z1bmN0aW9uKHEpP3EuY2FsbCh2KTpxO1JlZmxlY3Qub3duS2V5cyhsZSkuZm9yRWFjaChSZT0+e2VpKFJlLGxlW1JlXSl9KX1MZSYmcmEoTGUsbywiYyIpO2Z1bmN0aW9uIFNlKFJlLGx0KXtmLmlzQXJyYXkobHQpP2x0LmZvckVhY2goeGU9PlJlKHhlLmJpbmQodikpKTpsdCYmUmUobHQuYmluZCh2KSl9aWYoU2UoR3IsWGUpLFNlKFBpLHNlKSxTZShnaSwkZSksU2UocGksV2UpLFNlKEtuLF90KSxTZShwcixQdCksU2UoeCx5KSxTZShpbyxkKSxTZShqaSxwKSxTZShZcixmZSksU2UodmksaSksU2Uocm8sdyksZi5pc0FycmF5KEkpKWlmKEkubGVuZ3RoKXt2YXIgcWU9by5leHBvc2VkfHwoby5leHBvc2VkPXt9KTtJLmZvckVhY2goUmU9PntPYmplY3QuZGVmaW5lUHJvcGVydHkocWUsUmUse2dldDooKT0+dltSZV0sc2V0Omx0PT52W1JlXT1sdH0pfSl9ZWxzZSBvLmV4cG9zZWR8fChvLmV4cG9zZWQ9e30pO3MmJm8ucmVuZGVyPT09Zi5OT09QJiYoby5yZW5kZXI9cyksTCE9bnVsbCYmKG8uaW5oZXJpdEF0dHJzPUwpLCQmJihvLmNvbXBvbmVudHM9JCksZWUmJihvLmRpcmVjdGl2ZXM9ZWUpO3ZhciBIZT1vLmFwcENvbnRleHQuY29uZmlnLmdsb2JhbFByb3BlcnRpZXMuJGFwcGx5T3B0aW9ucztIZSYmSGUoYyxvLHYpfWZ1bmN0aW9uIHRzKG8sYyl7dmFyIHY9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiExO2YuaXNBcnJheShvKSYmKG89TWEobykpO3ZhciBFPWZ1bmN0aW9uKEMpe3ZhciBWPW9bQ10sRz12b2lkIDA7Zi5pc09iamVjdChWKT8iZGVmYXVsdCJpbiBWP0c9QWkoVi5mcm9tfHxDLFYuZGVmYXVsdCwhMCk6Rz1BaShWLmZyb218fEMpOkc9QWkoViksVC5pc1JlZihHKSYmdj9PYmplY3QuZGVmaW5lUHJvcGVydHkoYyxDLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6KCk9PkcudmFsdWUsc2V0OnE9PkcudmFsdWU9cX0pOmNbQ109R307Zm9yKHZhciBQIGluIG8pRShQKX1mdW5jdGlvbiByYShvLGMsdil7dGUoZi5pc0FycmF5KG8pP28ubWFwKEU9PkUuYmluZChjLnByb3h5KSk6by5iaW5kKGMucHJveHkpLGMsdil9ZnVuY3Rpb24geGEobyxjLHYsRSl7dmFyIFA9RS5pbmNsdWRlcygiLiIpPyRpKHYsRSk6KCk9PnZbRV07aWYoZi5pc1N0cmluZyhvKSl7dmFyIEM9Y1tvXTtmLmlzRnVuY3Rpb24oQykmJk10KFAsQyl9ZWxzZSBpZihmLmlzRnVuY3Rpb24obykpTXQoUCxvLmJpbmQodikpO2Vsc2UgaWYoZi5pc09iamVjdChvKSlpZihmLmlzQXJyYXkobykpby5mb3JFYWNoKEc9PnhhKEcsYyx2LEUpKTtlbHNle3ZhciBWPWYuaXNGdW5jdGlvbihvLmhhbmRsZXIpP28uaGFuZGxlci5iaW5kKHYpOmNbby5oYW5kbGVyXTtmLmlzRnVuY3Rpb24oVikmJk10KFAsVixvKX19ZnVuY3Rpb24gZnIobyl7dmFyIGM9by50eXBlLHttaXhpbnM6dixleHRlbmRzOkV9PWMse21peGluczpQLG9wdGlvbnNDYWNoZTpDLGNvbmZpZzp7b3B0aW9uTWVyZ2VTdHJhdGVnaWVzOlZ9fT1vLmFwcENvbnRleHQsRz1DLmdldChjKSxxO3JldHVybiBHP3E9RzohUC5sZW5ndGgmJiF2JiYhRT9xPWM6KHE9e30sUC5sZW5ndGgmJlAuZm9yRWFjaChhZT0+X3IocSxhZSxWLCEwKSksX3IocSxjLFYpKSxDLnNldChjLHEpLHF9ZnVuY3Rpb24gX3IobyxjLHYpe3ZhciBFPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTohMSx7bWl4aW5zOlAsZXh0ZW5kczpDfT1jO0MmJl9yKG8sQyx2LCEwKSxQJiZQLmZvckVhY2gocT0+X3IobyxxLHYsITApKTtmb3IodmFyIFYgaW4gYylpZighKEUmJlY9PT0iZXhwb3NlIikpe3ZhciBHPWlhW1ZdfHx2JiZ2W1ZdO29bVl09Rz9HKG9bVl0sY1tWXSk6Y1tWXX1yZXR1cm4gb312YXIgaWE9e2RhdGE6QmEscHJvcHM6Wm4sZW1pdHM6Wm4sbWV0aG9kczpabixjb21wdXRlZDpabixiZWZvcmVDcmVhdGU6YnIsY3JlYXRlZDpicixiZWZvcmVNb3VudDpicixtb3VudGVkOmJyLGJlZm9yZVVwZGF0ZTpicix1cGRhdGVkOmJyLGJlZm9yZURlc3Ryb3k6YnIsYmVmb3JlVW5tb3VudDpicixkZXN0cm95ZWQ6YnIsdW5tb3VudGVkOmJyLGFjdGl2YXRlZDpicixkZWFjdGl2YXRlZDpicixlcnJvckNhcHR1cmVkOmJyLHNlcnZlclByZWZldGNoOmJyLGNvbXBvbmVudHM6Wm4sZGlyZWN0aXZlczpabix3YXRjaDp4byxwcm92aWRlOkJhLGluamVjdDpMcn07ZnVuY3Rpb24gQmEobyxjKXtyZXR1cm4gYz9vP2Z1bmN0aW9uKCl7cmV0dXJuIGYuZXh0ZW5kKGYuaXNGdW5jdGlvbihvKT9vLmNhbGwodGhpcyx0aGlzKTpvLGYuaXNGdW5jdGlvbihjKT9jLmNhbGwodGhpcyx0aGlzKTpjKX06YzpvfWZ1bmN0aW9uIExyKG8sYyl7cmV0dXJuIFpuKE1hKG8pLE1hKGMpKX1mdW5jdGlvbiBNYShvKXtpZihmLmlzQXJyYXkobykpe2Zvcih2YXIgYz17fSx2PTA7djxvLmxlbmd0aDt2KyspY1tvW3ZdXT1vW3ZdO3JldHVybiBjfXJldHVybiBvfWZ1bmN0aW9uIGJyKG8sYyl7cmV0dXJuIG8/Wy4uLm5ldyBTZXQoW10uY29uY2F0KG8sYykpXTpjfWZ1bmN0aW9uIFpuKG8sYyl7cmV0dXJuIG8/Zi5leHRlbmQoZi5leHRlbmQoT2JqZWN0LmNyZWF0ZShudWxsKSxvKSxjKTpjfWZ1bmN0aW9uIHhvKG8sYyl7aWYoIW8pcmV0dXJuIGM7aWYoIWMpcmV0dXJuIG87dmFyIHY9Zi5leHRlbmQoT2JqZWN0LmNyZWF0ZShudWxsKSxvKTtmb3IodmFyIEUgaW4gYyl2W0VdPWJyKG9bRV0sY1tFXSk7cmV0dXJuIHZ9ZnVuY3Rpb24gQ3MobyxjLHYpe3ZhciBFPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTohMSxQPXt9LEM9e307Zi5kZWYoQyxCbywxKSxvLnByb3BzRGVmYXVsdHM9T2JqZWN0LmNyZWF0ZShudWxsKSxucyhvLGMsUCxDKTtmb3IodmFyIFYgaW4gby5wcm9wc09wdGlvbnNbMF0pViBpbiBQfHwoUFtWXT12b2lkIDApO3Y/by5wcm9wcz1FP1A6VC5zaGFsbG93UmVhY3RpdmUoUCk6by50eXBlLnByb3BzP28ucHJvcHM9UDpvLnByb3BzPUMsby5hdHRycz1DfWZ1bmN0aW9uIFdvKG8sYyx2LEUpe3Zhcntwcm9wczpQLGF0dHJzOkMsdm5vZGU6e3BhdGNoRmxhZzpWfX09byxHPVQudG9SYXcoUCksW3FdPW8ucHJvcHNPcHRpb25zLGFlPSExO2lmKChFfHxWPjApJiYhKFYmMTYpKXtpZihWJjgpZm9yKHZhciBMZT1vLnZub2RlLmR5bmFtaWNQcm9wcyxYZT0wO1hlPExlLmxlbmd0aDtYZSsrKXt2YXIgc2U9TGVbWGVdO2lmKCFocihvLmVtaXRzT3B0aW9ucyxzZSkpe3ZhciAkZT1jW3NlXTtpZihxKWlmKGYuaGFzT3duKEMsc2UpKSRlIT09Q1tzZV0mJihDW3NlXT0kZSxhZT0hMCk7ZWxzZXt2YXIgV2U9Zi5jYW1lbGl6ZShzZSk7UFtXZV09am4ocSxHLFdlLCRlLG8sITEpfWVsc2UgJGUhPT1DW3NlXSYmKENbc2VdPSRlLGFlPSEwKX19fWVsc2V7bnMobyxjLFAsQykmJihhZT0hMCk7dmFyIF90O2Zvcih2YXIgUHQgaW4gRykoIWN8fCFmLmhhc093bihjLFB0KSYmKChfdD1mLmh5cGhlbmF0ZShQdCkpPT09UHR8fCFmLmhhc093bihjLF90KSkpJiYocT92JiYodltQdF0hPT12b2lkIDB8fHZbX3RdIT09dm9pZCAwKSYmKFBbUHRdPWpuKHEsRyxQdCx2b2lkIDAsbywhMCkpOmRlbGV0ZSBQW1B0XSk7aWYoQyE9PUcpZm9yKHZhciBfZSBpbiBDKSghY3x8IWYuaGFzT3duKGMsX2UpJiYhMCkmJihkZWxldGUgQ1tfZV0sYWU9ITApfWFlJiZULnRyaWdnZXIobywic2V0IiwiJGF0dHJzIil9ZnVuY3Rpb24gbnMobyxjLHYsRSl7dmFyW1AsQ109by5wcm9wc09wdGlvbnMsVj0hMSxHO2lmKGMpe2Zvcih2YXIgcSBpbiBjKWlmKCFmLmlzUmVzZXJ2ZWRQcm9wKHEpKXt2YXIgYWU9Y1txXSxMZT12b2lkIDA7UCYmZi5oYXNPd24oUCxMZT1mLmNhbWVsaXplKHEpKT8hQ3x8IUMuaW5jbHVkZXMoTGUpP3ZbTGVdPWFlOihHfHwoRz17fSkpW0xlXT1hZTpocihvLmVtaXRzT3B0aW9ucyxxKXx8KCEocSBpbiBFKXx8YWUhPT1FW3FdKSYmKEVbcV09YWUsVj0hMCl9fWlmKEMpZm9yKHZhciBYZT1ULnRvUmF3KHYpLHNlPUd8fGYuRU1QVFlfT0JKLCRlPTA7JGU8Qy5sZW5ndGg7JGUrKyl7dmFyIFdlPUNbJGVdO3ZbV2VdPWpuKFAsWGUsV2Usc2VbV2VdLG8sIWYuaGFzT3duKHNlLFdlKSl9cmV0dXJuIFZ9ZnVuY3Rpb24gam4obyxjLHYsRSxQLEMpe3ZhciBWPW9bdl07aWYoViE9bnVsbCl7dmFyIEc9Zi5oYXNPd24oViwiZGVmYXVsdCIpO2lmKEcmJkU9PT12b2lkIDApe3ZhciBxPVYuZGVmYXVsdDtpZihWLnR5cGUhPT1GdW5jdGlvbiYmZi5pc0Z1bmN0aW9uKHEpKXt2YXJ7cHJvcHNEZWZhdWx0czphZX09UDt2IGluIGFlP0U9YWVbdl06KFFuKFApLEU9YWVbdl09cS5jYWxsKG51bGwsYyksRnIoKSl9ZWxzZSBFPXF9VlswXSYmKEMmJiFHP0U9ITE6VlsxXSYmKEU9PT0iInx8RT09PWYuaHlwaGVuYXRlKHYpKSYmKEU9ITApKX1yZXR1cm4gRX1mdW5jdGlvbiBiYShvLGMpe3ZhciB2PWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTohMSxFPWMucHJvcHNDYWNoZSxQPUUuZ2V0KG8pO2lmKFApcmV0dXJuIFA7dmFyIEM9by5wcm9wcyxWPXt9LEc9W10scT0hMTtpZighZi5pc0Z1bmN0aW9uKG8pKXt2YXIgYWU9VGU9PntxPSEwO3ZhcltpLHNdPWJhKFRlLGMsITApO2YuZXh0ZW5kKFYsaSkscyYmRy5wdXNoKC4uLnMpfTshdiYmYy5taXhpbnMubGVuZ3RoJiZjLm1peGlucy5mb3JFYWNoKGFlKSxvLmV4dGVuZHMmJmFlKG8uZXh0ZW5kcyksby5taXhpbnMmJm8ubWl4aW5zLmZvckVhY2goYWUpfWlmKCFDJiYhcSlyZXR1cm4gRS5zZXQobyxmLkVNUFRZX0FSUiksZi5FTVBUWV9BUlI7aWYoZi5pc0FycmF5KEMpKWZvcih2YXIgTGU9MDtMZTxDLmxlbmd0aDtMZSsrKXt2YXIgWGU9Zi5jYW1lbGl6ZShDW0xlXSk7R28oWGUpJiYoVltYZV09Zi5FTVBUWV9PQkopfWVsc2UgaWYoQylmb3IodmFyIHNlIGluIEMpe3ZhciAkZT1mLmNhbWVsaXplKHNlKTtpZihHbygkZSkpe3ZhciBXZT1DW3NlXSxfdD1WWyRlXT1mLmlzQXJyYXkoV2UpfHxmLmlzRnVuY3Rpb24oV2UpP3t0eXBlOldlfTpXZTtpZihfdCl7dmFyIFB0PUxhKEJvb2xlYW4sX3QudHlwZSksX2U9TGEoU3RyaW5nLF90LnR5cGUpO190WzBdPVB0Pi0xLF90WzFdPV9lPDB8fFB0PF9lLChQdD4tMXx8Zi5oYXNPd24oX3QsImRlZmF1bHQiKSkmJkcucHVzaCgkZSl9fX12YXIgZmU9W1YsR107cmV0dXJuIEUuc2V0KG8sZmUpLGZlfWZ1bmN0aW9uIEdvKG8pe3JldHVybiBvWzBdIT09IiQifWZ1bmN0aW9uIElpKG8pe3ZhciBjPW8mJm8udG9TdHJpbmcoKS5tYXRjaCgvXlxzKmZ1bmN0aW9uIChcdyspLyk7cmV0dXJuIGM/Y1sxXTpvPT09bnVsbD8ibnVsbCI6IiJ9ZnVuY3Rpb24gRWEobyxjKXtyZXR1cm4gSWkobyk9PT1JaShjKX1mdW5jdGlvbiBMYShvLGMpe3JldHVybiBmLmlzQXJyYXkoYyk/Yy5maW5kSW5kZXgodj0+RWEodixvKSk6Zi5pc0Z1bmN0aW9uKGMpJiZFYShjLG8pPzA6LTF9dmFyIGFvPW89Pm9bMF09PT0iXyJ8fG89PT0iJHN0YWJsZSIsb2E9bz0+Zi5pc0FycmF5KG8pP28ubWFwKFhuKTpbWG4obyldLEVvPShvLGMsdik9PntpZihjLl9uKXJldHVybiBjO3ZhciBFPVNpKGZ1bmN0aW9uKCl7cmV0dXJuIG9hKGMoLi4uYXJndW1lbnRzKSl9LHYpO3JldHVybiBFLl9jPSExLEV9LHppPShvLGMsdik9Pnt2YXIgRT1vLl9jdHg7Zm9yKHZhciBQIGluIG8paWYoIWFvKFApKXt2YXIgQz1vW1BdO2YuaXNGdW5jdGlvbihDKT9jW1BdPUVvKFAsQyxFKTpDIT1udWxsJiZmdW5jdGlvbigpe3ZhciBWPW9hKEMpO2NbUF09KCk9PlZ9KCl9fSx5YT0obyxjKT0+e3ZhciB2PW9hKGMpO28uc2xvdHMuZGVmYXVsdD0oKT0+dn0sYWE9KG8sYyk9PntpZihvLnZub2RlLnNoYXBlRmxhZyYzMil7dmFyIHY9Yy5fO3Y/KG8uc2xvdHM9VC50b1JhdyhjKSxmLmRlZihjLCJfIix2KSk6emkoYyxvLnNsb3RzPXt9KX1lbHNlIG8uc2xvdHM9e30sYyYmeWEobyxjKTtmLmRlZihvLnNsb3RzLEJvLDEpfSx3YT0obyxjLHYpPT57dmFye3Zub2RlOkUsc2xvdHM6UH09byxDPSEwLFY9Zi5FTVBUWV9PQko7aWYoRS5zaGFwZUZsYWcmMzIpe3ZhciBHPWMuXztHP3YmJkc9PT0xP0M9ITE6KGYuZXh0ZW5kKFAsYyksIXYmJkc9PT0xJiZkZWxldGUgUC5fKTooQz0hYy4kc3RhYmxlLHppKGMsUCkpLFY9Y31lbHNlIGMmJih5YShvLGMpLFY9e2RlZmF1bHQ6MX0pO2lmKEMpZm9yKHZhciBxIGluIFApIWFvKHEpJiYhKHEgaW4gVikmJmRlbGV0ZSBQW3FdfTtmdW5jdGlvbiBzYSgpe3JldHVybnthcHA6bnVsbCxjb25maWc6e2lzTmF0aXZlVGFnOmYuTk8scGVyZm9ybWFuY2U6ITEsZ2xvYmFsUHJvcGVydGllczp7fSxvcHRpb25NZXJnZVN0cmF0ZWdpZXM6e30sZXJyb3JIYW5kbGVyOnZvaWQgMCx3YXJuSGFuZGxlcjp2b2lkIDAsY29tcGlsZXJPcHRpb25zOnt9fSxtaXhpbnM6W10sY29tcG9uZW50czp7fSxkaXJlY3RpdmVzOnt9LHByb3ZpZGVzOk9iamVjdC5jcmVhdGUobnVsbCksb3B0aW9uc0NhY2hlOm5ldyBXZWFrTWFwLHByb3BzQ2FjaGU6bmV3IFdlYWtNYXAsZW1pdHNDYWNoZTpuZXcgV2Vha01hcH19dmFyIFNhPTA7ZnVuY3Rpb24gT3MobyxjKXtyZXR1cm4gZnVuY3Rpb24oRSl7dmFyIFA9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOm51bGw7Zi5pc0Z1bmN0aW9uKEUpfHwoRT1PYmplY3QuYXNzaWduKHt9LEUpKSxQIT1udWxsJiYhZi5pc09iamVjdChQKSYmKFA9bnVsbCk7dmFyIEM9c2EoKSxWPW5ldyBTZXQsRz0hMSxxPUMuYXBwPXtfdWlkOlNhKyssX2NvbXBvbmVudDpFLF9wcm9wczpQLF9jb250YWluZXI6bnVsbCxfY29udGV4dDpDLF9pbnN0YW5jZTpudWxsLHZlcnNpb246TnMsZ2V0IGNvbmZpZygpe3JldHVybiBDLmNvbmZpZ30sc2V0IGNvbmZpZyhhZSl7fSx1c2UoYWUpe2Zvcih2YXIgTGU9YXJndW1lbnRzLmxlbmd0aCxYZT1uZXcgQXJyYXkoTGU+MT9MZS0xOjApLHNlPTE7c2U8TGU7c2UrKylYZVtzZS0xXT1hcmd1bWVudHNbc2VdO3JldHVybiBWLmhhcyhhZSl8fChhZSYmZi5pc0Z1bmN0aW9uKGFlLmluc3RhbGwpPyhWLmFkZChhZSksYWUuaW5zdGFsbChxLC4uLlhlKSk6Zi5pc0Z1bmN0aW9uKGFlKSYmKFYuYWRkKGFlKSxhZShxLC4uLlhlKSkpLHF9LG1peGluKGFlKXtyZXR1cm4gQy5taXhpbnMuaW5jbHVkZXMoYWUpfHxDLm1peGlucy5wdXNoKGFlKSxxfSxjb21wb25lbnQoYWUsTGUpe3JldHVybiBMZT8oQy5jb21wb25lbnRzW2FlXT1MZSxxKTpDLmNvbXBvbmVudHNbYWVdfSxkaXJlY3RpdmUoYWUsTGUpe3JldHVybiBMZT8oQy5kaXJlY3RpdmVzW2FlXT1MZSxxKTpDLmRpcmVjdGl2ZXNbYWVdfSxtb3VudChhZSxMZSxYZSl7aWYoIUcpe3ZhciBzZT1MdChFLFApO3JldHVybiBzZS5hcHBDb250ZXh0PUMsTGUmJmM/YyhzZSxhZSk6byhzZSxhZSxYZSksRz0hMCxxLl9jb250YWluZXI9YWUsYWUuX192dWVfYXBwX189cSxxLl9pbnN0YW5jZT1zZS5jb21wb25lbnQsVHQoc2UuY29tcG9uZW50KXx8c2UuY29tcG9uZW50LnByb3h5fX0sdW5tb3VudCgpe0cmJihvKG51bGwscS5fY29udGFpbmVyKSxkZWxldGUgcS5fY29udGFpbmVyLl9fdnVlX2FwcF9fKX0scHJvdmlkZShhZSxMZSl7cmV0dXJuIEMucHJvdmlkZXNbYWVdPUxlLHF9fTtyZXR1cm4gcX19ZnVuY3Rpb24gc28obyxjLHYsRSl7dmFyIFA9YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOiExO2lmKGYuaXNBcnJheShvKSl7by5mb3JFYWNoKChfdCxQdCk9PnNvKF90LGMmJihmLmlzQXJyYXkoYyk/Y1tQdF06YyksdixFLFApKTtyZXR1cm59aWYoIShJbihFKSYmIVApKXt2YXIgQz1FLnNoYXBlRmxhZyY0P1R0KEUuY29tcG9uZW50KXx8RS5jb21wb25lbnQucHJveHk6RS5lbCxWPVA/bnVsbDpDLHtpOkcscjpxfT1vLGFlPWMmJmMucixMZT1HLnJlZnM9PT1mLkVNUFRZX09CSj9HLnJlZnM9e306Ry5yZWZzLFhlPUcuc2V0dXBTdGF0ZTtpZihhZSE9bnVsbCYmYWUhPT1xJiYoZi5pc1N0cmluZyhhZSk/KExlW2FlXT1udWxsLGYuaGFzT3duKFhlLGFlKSYmKFhlW2FlXT1udWxsKSk6VC5pc1JlZihhZSkmJihhZS52YWx1ZT1udWxsKSksZi5pc0Z1bmN0aW9uKHEpKVkocSxHLDEyLFtWLExlXSk7ZWxzZXt2YXIgc2U9Zi5pc1N0cmluZyhxKSwkZT1ULmlzUmVmKHEpO2lmKHNlfHwkZSl7dmFyIFdlPSgpPT57aWYoby5mKXt2YXIgX3Q9c2U/TGVbcV06cS52YWx1ZTtQP2YuaXNBcnJheShfdCkmJmYucmVtb3ZlKF90LEMpOmYuaXNBcnJheShfdCk/X3QuaW5jbHVkZXMoQyl8fF90LnB1c2goQyk6c2U/KExlW3FdPVtDXSxmLmhhc093bihYZSxxKSYmKFhlW3FdPUxlW3FdKSk6KHEudmFsdWU9W0NdLG8uayYmKExlW28ua109cS52YWx1ZSkpfWVsc2Ugc2U/KExlW3FdPVYsZi5oYXNPd24oWGUscSkmJihYZVtxXT1WKSk6JGUmJihxLnZhbHVlPVYsby5rJiYoTGVbby5rXT1WKSl9O1Y/KFdlLmlkPS0xLG0oV2UsdikpOldlKCl9fX19dmFyIHJpPSExLE5pPW89Pi9zdmcvLnRlc3Qoby5uYW1lc3BhY2VVUkkpJiZvLnRhZ05hbWUhPT0iZm9yZWlnbk9iamVjdCIsbG89bz0+by5ub2RlVHlwZT09PTg7ZnVuY3Rpb24gbGEobyl7dmFye210OmMscDp2LG86e3BhdGNoUHJvcDpFLGNyZWF0ZVRleHQ6UCxuZXh0U2libGluZzpDLHBhcmVudE5vZGU6VixyZW1vdmU6RyxpbnNlcnQ6cSxjcmVhdGVDb21tZW50OmFlfX09byxMZT0oX2UsZmUpPT57aWYoIWZlLmhhc0NoaWxkTm9kZXMoKSl7dihudWxsLF9lLGZlKSx3cigpLGZlLl92bm9kZT1fZTtyZXR1cm59cmk9ITEsWGUoZmUuZmlyc3RDaGlsZCxfZSxudWxsLG51bGwsbnVsbCksd3IoKSxmZS5fdm5vZGU9X2UscmkmJmNvbnNvbGUuZXJyb3IoIkh5ZHJhdGlvbiBjb21wbGV0ZWQgYnV0IGNvbnRhaW5zIG1pc21hdGNoZXMuIil9LFhlPWZ1bmN0aW9uKF9lLGZlLFRlLGkscyl7dmFyIGQ9YXJndW1lbnRzLmxlbmd0aD41JiZhcmd1bWVudHNbNV0hPT12b2lkIDA/YXJndW1lbnRzWzVdOiExLHA9bG8oX2UpJiZfZS5kYXRhPT09IlsiLHk9KCk9Pl90KF9lLGZlLFRlLGkscyxwKSx7dHlwZTp3LHJlZjpJLHNoYXBlRmxhZzpMLHBhdGNoRmxhZzokfT1mZSxlZT1fZS5ub2RlVHlwZTtmZS5lbD1fZSwkPT09LTImJihkPSExLGZlLmR5bmFtaWNDaGlsZHJlbj1udWxsKTt2YXIgaWU9bnVsbDtzd2l0Y2godyl7Y2FzZSBHZTplZSE9PTM/ZmUuY2hpbGRyZW49PT0iIj8ocShmZS5lbD1QKCIiKSxWKF9lKSxfZSksaWU9X2UpOmllPXkoKTooX2UuZGF0YSE9PWZlLmNoaWxkcmVuJiYocmk9ITAsX2UuZGF0YT1mZS5jaGlsZHJlbiksaWU9QyhfZSkpO2JyZWFrO2Nhc2UgdXQ6ZWUhPT04fHxwP2llPXkoKTppZT1DKF9lKTticmVhaztjYXNlIFZ0OmlmKGVlIT09MSYmZWUhPT0zKWllPXkoKTtlbHNle2llPV9lO2Zvcih2YXIgSWU9IWZlLmNoaWxkcmVuLmxlbmd0aCxvZT0wO29lPGZlLnN0YXRpY0NvdW50O29lKyspSWUmJihmZS5jaGlsZHJlbis9aWUubm9kZVR5cGU9PT0xP2llLm91dGVySFRNTDppZS5kYXRhKSxvZT09PWZlLnN0YXRpY0NvdW50LTEmJihmZS5hbmNob3I9aWUpLGllPUMoaWUpO3JldHVybiBpZX1icmVhaztjYXNlIG50OnA/aWU9V2UoX2UsZmUsVGUsaSxzLGQpOmllPXkoKTticmVhaztkZWZhdWx0OmlmKEwmMSllZSE9PTF8fGZlLnR5cGUudG9Mb3dlckNhc2UoKSE9PV9lLnRhZ05hbWUudG9Mb3dlckNhc2UoKT9pZT15KCk6aWU9c2UoX2UsZmUsVGUsaSxzLGQpO2Vsc2UgaWYoTCY2KXtmZS5zbG90U2NvcGVJZHM9czt2YXIgQ2U9VihfZSk7aWYoYyhmZSxDZSxudWxsLFRlLGksTmkoQ2UpLGQpLGllPXA/UHQoX2UpOkMoX2UpLGllJiZsbyhpZSkmJmllLmRhdGE9PT0idGVsZXBvcnQgZW5kIiYmKGllPUMoaWUpKSxJbihmZSkpe3ZhciBCZTtwPyhCZT1MdChudCksQmUuYW5jaG9yPWllP2llLnByZXZpb3VzU2libGluZzpDZS5sYXN0Q2hpbGQpOkJlPV9lLm5vZGVUeXBlPT09Mz9paSgiIik6THQoImRpdiIpLEJlLmVsPV9lLGZlLmNvbXBvbmVudC5zdWJUcmVlPUJlfX1lbHNlIEwmNjQ/ZWUhPT04P2llPXkoKTppZT1mZS50eXBlLmh5ZHJhdGUoX2UsZmUsVGUsaSxzLGQsbywkZSk6TCYxMjgmJihpZT1mZS50eXBlLmh5ZHJhdGUoX2UsZmUsVGUsaSxOaShWKF9lKSkscyxkLG8sWGUpKX1yZXR1cm4gSSE9bnVsbCYmc28oSSxudWxsLGksZmUpLGllfSxzZT0oX2UsZmUsVGUsaSxzLGQpPT57ZD1kfHwhIWZlLmR5bmFtaWNDaGlsZHJlbjt2YXJ7dHlwZTpwLHByb3BzOnkscGF0Y2hGbGFnOncsc2hhcGVGbGFnOkksZGlyczpMfT1mZSwkPXA9PT0iaW5wdXQiJiZMfHxwPT09Im9wdGlvbiI7aWYoJHx8dyE9PS0xKXtpZihMJiZkZShmZSxudWxsLFRlLCJjcmVhdGVkIikseSlpZigkfHwhZHx8dyYoMTZ8MzIpKWZvcih2YXIgZWUgaW4geSkoJCYmZWUuZW5kc1dpdGgoInZhbHVlIil8fGYuaXNPbihlZSkmJiFmLmlzUmVzZXJ2ZWRQcm9wKGVlKSkmJkUoX2UsZWUsbnVsbCx5W2VlXSwhMSx2b2lkIDAsVGUpO2Vsc2UgeS5vbkNsaWNrJiZFKF9lLCJvbkNsaWNrIixudWxsLHkub25DbGljaywhMSx2b2lkIDAsVGUpO3ZhciBpZTtpZigoaWU9eSYmeS5vblZub2RlQmVmb3JlTW91bnQpJiZQcihpZSxUZSxmZSksTCYmZGUoZmUsbnVsbCxUZSwiYmVmb3JlTW91bnQiKSwoKGllPXkmJnkub25Wbm9kZU1vdW50ZWQpfHxMKSYmX28oKCk9PntpZSYmUHIoaWUsVGUsZmUpLEwmJmRlKGZlLG51bGwsVGUsIm1vdW50ZWQiKX0saSksSSYxNiYmISh5JiYoeS5pbm5lckhUTUx8fHkudGV4dENvbnRlbnQpKSlmb3IodmFyIEllPSRlKF9lLmZpcnN0Q2hpbGQsZmUsX2UsVGUsaSxzLGQpO0llOyl7cmk9ITA7dmFyIG9lPUllO0llPUllLm5leHRTaWJsaW5nLEcob2UpfWVsc2UgSSY4JiZfZS50ZXh0Q29udGVudCE9PWZlLmNoaWxkcmVuJiYocmk9ITAsX2UudGV4dENvbnRlbnQ9ZmUuY2hpbGRyZW4pfXJldHVybiBfZS5uZXh0U2libGluZ30sJGU9KF9lLGZlLFRlLGkscyxkLHApPT57cD1wfHwhIWZlLmR5bmFtaWNDaGlsZHJlbjtmb3IodmFyIHk9ZmUuY2hpbGRyZW4sdz15Lmxlbmd0aCxJPTA7STx3O0krKyl7dmFyIEw9cD95W0ldOnlbSV09WG4oeVtJXSk7aWYoX2UpX2U9WGUoX2UsTCxpLHMsZCxwKTtlbHNle2lmKEwudHlwZT09PUdlJiYhTC5jaGlsZHJlbiljb250aW51ZTtyaT0hMCx2KG51bGwsTCxUZSxudWxsLGkscyxOaShUZSksZCl9fXJldHVybiBfZX0sV2U9KF9lLGZlLFRlLGkscyxkKT0+e3ZhcntzbG90U2NvcGVJZHM6cH09ZmU7cCYmKHM9cz9zLmNvbmNhdChwKTpwKTt2YXIgeT1WKF9lKSx3PSRlKEMoX2UpLGZlLHksVGUsaSxzLGQpO3JldHVybiB3JiZsbyh3KSYmdy5kYXRhPT09Il0iP0MoZmUuYW5jaG9yPXcpOihyaT0hMCxxKGZlLmFuY2hvcj1hZSgiXSIpLHksdyksdyl9LF90PShfZSxmZSxUZSxpLHMsZCk9PntpZihyaT0hMCxmZS5lbD1udWxsLGQpZm9yKHZhciBwPVB0KF9lKTs7KXt2YXIgeT1DKF9lKTtpZih5JiZ5IT09cClHKHkpO2Vsc2UgYnJlYWt9dmFyIHc9QyhfZSksST1WKF9lKTtyZXR1cm4gRyhfZSksdihudWxsLGZlLEksdyxUZSxpLE5pKEkpLHMpLHd9LFB0PV9lPT57Zm9yKHZhciBmZT0wO19lOylpZihfZT1DKF9lKSxfZSYmbG8oX2UpJiYoX2UuZGF0YT09PSJbIiYmZmUrKyxfZS5kYXRhPT09Il0iKSl7aWYoZmU9PT0wKXJldHVybiBDKF9lKTtmZS0tfXJldHVybiBfZX07cmV0dXJuW0xlLFhlXX12YXIgbT1fbztmdW5jdGlvbiBSKG8pe3JldHVybiBqKG8pfWZ1bmN0aW9uIHoobyl7cmV0dXJuIGoobyxsYSl9ZnVuY3Rpb24gaihvLGMpe3ZhciB2PWYuZ2V0R2xvYmFsVGhpcygpO3YuX19WVUVfXz0hMDt2YXJ7aW5zZXJ0OkUscmVtb3ZlOlAscGF0Y2hQcm9wOkMsZm9yY2VQYXRjaFByb3A6VixjcmVhdGVFbGVtZW50OkcsY3JlYXRlVGV4dDpxLGNyZWF0ZUNvbW1lbnQ6YWUsc2V0VGV4dDpMZSxzZXRFbGVtZW50VGV4dDpYZSxwYXJlbnROb2RlOnNlLG5leHRTaWJsaW5nOiRlLHNldFNjb3BlSWQ6V2U9Zi5OT09QLGNsb25lTm9kZTpfdCxpbnNlcnRTdGF0aWNDb250ZW50OlB0fT1vLF9lPWZ1bmN0aW9uKEYsSyxoZSl7dmFyIHBlPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTpudWxsLFBlPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTpudWxsLEtlPWFyZ3VtZW50cy5sZW5ndGg+NSYmYXJndW1lbnRzWzVdIT09dm9pZCAwP2FyZ3VtZW50c1s1XTpudWxsLGN0PWFyZ3VtZW50cy5sZW5ndGg+NiYmYXJndW1lbnRzWzZdIT09dm9pZCAwP2FyZ3VtZW50c1s2XTohMSxRZT1hcmd1bWVudHMubGVuZ3RoPjcmJmFyZ3VtZW50c1s3XSE9PXZvaWQgMD9hcmd1bWVudHNbN106bnVsbCxKZT1hcmd1bWVudHMubGVuZ3RoPjgmJmFyZ3VtZW50c1s4XSE9PXZvaWQgMD9hcmd1bWVudHNbOF06ISFLLmR5bmFtaWNDaGlsZHJlbjtpZihGIT09Syl7RiYmIW9yKEYsSykmJihwZT1JdChGKSxxZShGLFBlLEtlLCEwKSxGPW51bGwpLEsucGF0Y2hGbGFnPT09LTImJihKZT0hMSxLLmR5bmFtaWNDaGlsZHJlbj1udWxsKTt2YXJ7dHlwZTpEZSxyZWY6eXQsc2hhcGVGbGFnOnd0fT1LO3N3aXRjaChEZSl7Y2FzZSBHZTpmZShGLEssaGUscGUpO2JyZWFrO2Nhc2UgdXQ6VGUoRixLLGhlLHBlKTticmVhaztjYXNlIFZ0OkY9PW51bGwmJmkoSyxoZSxwZSxjdCk7YnJlYWs7Y2FzZSBudDppZShGLEssaGUscGUsUGUsS2UsY3QsUWUsSmUpO2JyZWFrO2RlZmF1bHQ6d3QmMT9wKEYsSyxoZSxwZSxQZSxLZSxjdCxRZSxKZSk6d3QmNj9JZShGLEssaGUscGUsUGUsS2UsY3QsUWUsSmUpOih3dCY2NHx8d3QmMTI4KSYmRGUucHJvY2VzcyhGLEssaGUscGUsUGUsS2UsY3QsUWUsSmUsQnQpfXl0IT1udWxsJiZQZSYmc28oeXQsRiYmRi5yZWYsS2UsS3x8RiwhSyl9fSxmZT0oRixLLGhlLHBlKT0+e2lmKEY9PW51bGwpRShLLmVsPXEoSy5jaGlsZHJlbiksaGUscGUpO2Vsc2V7dmFyIFBlPUsuZWw9Ri5lbDtLLmNoaWxkcmVuIT09Ri5jaGlsZHJlbiYmTGUoUGUsSy5jaGlsZHJlbil9fSxUZT0oRixLLGhlLHBlKT0+e0Y9PW51bGw/RShLLmVsPWFlKEsuY2hpbGRyZW58fCIiKSxoZSxwZSk6Sy5lbD1GLmVsfSxpPShGLEssaGUscGUpPT57W0YuZWwsRi5hbmNob3JdPVB0KEYuY2hpbGRyZW4sSyxoZSxwZSxGLmVsLEYuYW5jaG9yKX0scz0oRixLLGhlKT0+e2Zvcih2YXJ7ZWw6cGUsYW5jaG9yOlBlfT1GLEtlO3BlJiZwZSE9PVBlOylLZT0kZShwZSksRShwZSxLLGhlKSxwZT1LZTtFKFBlLEssaGUpfSxkPUY9Pntmb3IodmFye2VsOkssYW5jaG9yOmhlfT1GLHBlO0smJkshPT1oZTspcGU9JGUoSyksUChLKSxLPXBlO1AoaGUpfSxwPShGLEssaGUscGUsUGUsS2UsY3QsUWUsSmUpPT57Y3Q9Y3R8fEsudHlwZT09PSJzdmciLEY9PW51bGw/eShLLGhlLHBlLFBlLEtlLGN0LFFlLEplKTpMKEYsSyxQZSxLZSxjdCxRZSxKZSl9LHk9KEYsSyxoZSxwZSxQZSxLZSxjdCxRZSk9Pnt2YXIgSmUsRGUse3R5cGU6eXQscHJvcHM6d3Qsc2hhcGVGbGFnOmF0LHRyYW5zaXRpb246b3QscGF0Y2hGbGFnOmRuLGRpcnM6Ym59PUY7aWYoRi5lbCYmX3QhPT12b2lkIDAmJmRuPT09LTEpSmU9Ri5lbD1fdChGLmVsKTtlbHNle2lmKEplPUYuZWw9RyhGLnR5cGUsS2Usd3QmJnd0LmlzLHd0KSxhdCY4P1hlKEplLEYuY2hpbGRyZW4pOmF0JjE2JiZJKEYuY2hpbGRyZW4sSmUsbnVsbCxwZSxQZSxLZSYmeXQhPT0iZm9yZWlnbk9iamVjdCIsY3QsUWUpLGJuJiZkZShGLG51bGwscGUsImNyZWF0ZWQiKSx3dCl7Zm9yKHZhciB0ciBpbiB3dCl0ciE9PSJ2YWx1ZSImJiFmLmlzUmVzZXJ2ZWRQcm9wKHRyKSYmQyhKZSx0cixudWxsLHd0W3RyXSxLZSxGLmNoaWxkcmVuLHBlLFBlLHhlLEYuaG9zdEluc3RhbmNlKTsidmFsdWUiaW4gd3QmJkMoSmUsInZhbHVlIixudWxsLHd0LnZhbHVlLCExLFtdLHBlLG51bGwsdm9pZCAwLEYuaG9zdEluc3RhbmNlKSwoRGU9d3Qub25Wbm9kZUJlZm9yZU1vdW50KSYmUHIoRGUscGUsRil9dyhKZSxGLEYuc2NvcGVJZCxjdCxwZSl9Ym4mJmRlKEYsbnVsbCxwZSwiYmVmb3JlTW91bnQiKTt2YXIgUG49KCFQZXx8UGUmJiFQZS5wZW5kaW5nQnJhbmNoKSYmb3QmJiFvdC5wZXJzaXN0ZWQ7UG4mJm90LmJlZm9yZUVudGVyKEplKSxFKEplLEssaGUpLCgoRGU9d3QmJnd0Lm9uVm5vZGVNb3VudGVkKXx8UG58fGJuKSYmbSgoKT0+e0RlJiZQcihEZSxwZSxGKSxQbiYmb3QuZW50ZXIoSmUpLGJuJiZkZShGLG51bGwscGUsIm1vdW50ZWQiKX0sUGUpfSx3PShGLEssaGUscGUsUGUpPT57aWYoaGUmJldlKEYsaGUpLHBlKWZvcih2YXIgS2U9MDtLZTxwZS5sZW5ndGg7S2UrKylXZShGLHBlW0tlXSk7aWYoUGUpe3ZhciBjdD1QZS5zdWJUcmVlO2lmKEs9PT1jdCl7dmFyIFFlPVBlLnZub2RlO3coRixRZSxRZS5zY29wZUlkLFFlLnNsb3RTY29wZUlkcyxQZS5wYXJlbnQpfX19LEk9ZnVuY3Rpb24oRixLLGhlLHBlLFBlLEtlLGN0LFFlKXtmb3IodmFyIEplPWFyZ3VtZW50cy5sZW5ndGg+OCYmYXJndW1lbnRzWzhdIT09dm9pZCAwP2FyZ3VtZW50c1s4XTowLERlPUplO0RlPEYubGVuZ3RoO0RlKyspe3ZhciB5dD1GW0RlXT1RZT9ZdChGW0RlXSk6WG4oRltEZV0pO19lKG51bGwseXQsSyxoZSxwZSxQZSxLZSxjdCxRZSl9fSxMPShGLEssaGUscGUsUGUsS2UsY3QpPT57dmFyIFFlPUsuZWw9Ri5lbCx7cGF0Y2hGbGFnOkplLGR5bmFtaWNDaGlsZHJlbjpEZSxkaXJzOnl0fT1LO0plfD1GLnBhdGNoRmxhZyYxNjt2YXIgd3Q9Ri5wcm9wc3x8Zi5FTVBUWV9PQkosYXQ9Sy5wcm9wc3x8Zi5FTVBUWV9PQkosb3Q7aGUmJlooaGUsITEpLChvdD1hdC5vblZub2RlQmVmb3JlVXBkYXRlKSYmUHIob3QsaGUsSyxGKSx5dCYmZGUoSyxGLGhlLCJiZWZvcmVVcGRhdGUiKSxoZSYmWihoZSwhMCk7dmFyIGRuPVBlJiZLLnR5cGUhPT0iZm9yZWlnbk9iamVjdCI7aWYoRGU/JChGLmR5bmFtaWNDaGlsZHJlbixEZSxRZSxoZSxwZSxkbixLZSk6Y3R8fEF0KEYsSyxRZSxudWxsLGhlLHBlLGRuLEtlLCExKSxKZT4wKXtpZihKZSYxNillZShRZSxLLHd0LGF0LGhlLHBlLFBlKTtlbHNlIGlmKEplJjImJnd0LmNsYXNzIT09YXQuY2xhc3MmJkMoUWUsImNsYXNzIixudWxsLGF0LmNsYXNzLFBlLFtdLGhlLG51bGwsdm9pZCAwLEsuaG9zdEluc3RhbmNlKSxKZSY0JiZDKFFlLCJzdHlsZSIsd3Quc3R5bGUsYXQuc3R5bGUsUGUsW10saGUsbnVsbCx2b2lkIDAsSy5ob3N0SW5zdGFuY2UpLEplJjgpZm9yKHZhciBibj1LLmR5bmFtaWNQcm9wcyx0cj0wO3RyPGJuLmxlbmd0aDt0cisrKXt2YXIgUG49Ym5bdHJdLCRvPXd0W1BuXSxTbz1hdFtQbl07KFNvIT09JG98fFBuPT09InZhbHVlInx8ViYmVihRZSxQbikpJiZDKFFlLFBuLCRvLFNvLFBlLEYuY2hpbGRyZW4saGUscGUseGUsSy5ob3N0SW5zdGFuY2UpfUplJjEmJkYuY2hpbGRyZW4hPT1LLmNoaWxkcmVuJiZYZShRZSxLLmNoaWxkcmVuKX1lbHNlIWN0JiZEZT09bnVsbCYmZWUoUWUsSyx3dCxhdCxoZSxwZSxQZSk7KChvdD1hdC5vblZub2RlVXBkYXRlZCl8fHl0KSYmbSgoKT0+e290JiZQcihvdCxoZSxLLEYpLHl0JiZkZShLLEYsaGUsInVwZGF0ZWQiKX0scGUpfSwkPShGLEssaGUscGUsUGUsS2UsY3QpPT57Zm9yKHZhciBRZT0wO1FlPEsubGVuZ3RoO1FlKyspe3ZhciBKZT1GW1FlXSxEZT1LW1FlXSx5dD1KZS5lbCYmKEplLnR5cGU9PT1udHx8IW9yKEplLERlKXx8SmUuc2hhcGVGbGFnJig2fDY0KSk/c2UoSmUuZWwpOmhlO19lKEplLERlLHl0LG51bGwscGUsUGUsS2UsY3QsITApfX0sZWU9KEYsSyxoZSxwZSxQZSxLZSxjdCk9PntpZihoZSE9PXBlKXtmb3IodmFyIFFlIGluIHBlKWlmKCFmLmlzUmVzZXJ2ZWRQcm9wKFFlKSl7dmFyIEplPXBlW1FlXSxEZT1oZVtRZV07KEplIT09RGUmJlFlIT09InZhbHVlInx8ViYmVihGLFFlKSkmJkMoRixRZSxEZSxKZSxjdCxLLmNoaWxkcmVuLFBlLEtlLHhlLEsuaG9zdEluc3RhbmNlKX1pZihoZSE9PWYuRU1QVFlfT0JKKWZvcih2YXIgeXQgaW4gaGUpIWYuaXNSZXNlcnZlZFByb3AoeXQpJiYhKHl0IGluIHBlKSYmQyhGLHl0LGhlW3l0XSxudWxsLGN0LEsuY2hpbGRyZW4sUGUsS2UseGUsSy5ob3N0SW5zdGFuY2UpOyJ2YWx1ZSJpbiBwZSYmQyhGLCJ2YWx1ZSIsaGUudmFsdWUscGUudmFsdWUsITEsW10sUGUsbnVsbCx2b2lkIDAsSy5ob3N0SW5zdGFuY2UpfX0saWU9KEYsSyxoZSxwZSxQZSxLZSxjdCxRZSxKZSk9Pnt2YXIgRGU9Sy5lbD1GP0YuZWw6cSgiIikseXQ9Sy5hbmNob3I9Rj9GLmFuY2hvcjpxKCIiKSx7cGF0Y2hGbGFnOnd0LGR5bmFtaWNDaGlsZHJlbjphdCxzbG90U2NvcGVJZHM6b3R9PUs7b3QmJihRZT1RZT9RZS5jb25jYXQob3QpOm90KSxGPT1udWxsPyhFKERlLGhlLHBlKSxFKHl0LGhlLHBlKSxJKEsuY2hpbGRyZW4saGUseXQsUGUsS2UsY3QsUWUsSmUpKTp3dD4wJiZ3dCY2NCYmYXQmJkYuZHluYW1pY0NoaWxkcmVuPygkKEYuZHluYW1pY0NoaWxkcmVuLGF0LGhlLFBlLEtlLGN0LFFlKSwoSy5rZXkhPW51bGx8fFBlJiZLPT09UGUuc3ViVHJlZSkmJlEoRixLLCEwKSk6QXQoRixLLGhlLHl0LFBlLEtlLGN0LFFlLEplKX0sSWU9KEYsSyxoZSxwZSxQZSxLZSxjdCxRZSxKZSk9PntLLnNsb3RTY29wZUlkcz1RZSxGPT1udWxsP0suc2hhcGVGbGFnJjUxMj9QZS5jdHguYWN0aXZhdGUoSyxoZSxwZSxjdCxKZSk6b2UoSyxoZSxwZSxQZSxLZSxjdCxKZSk6Q2UoRixLLEplKX0sb2U9KEYsSyxoZSxwZSxQZSxLZSxjdCk9Pnt2YXIgUWU9Ri5jb21wb25lbnQ9cnMoRixwZSxQZSk7aWYoaGkoRikmJihRZS5jdHgucmVuZGVyZXI9QnQpLGFpKFFlKSxRZS5hc3luY0RlcCl7aWYoUGUmJlBlLnJlZ2lzdGVyRGVwKFFlLEJlKSwhRi5lbCl7dmFyIEplPVFlLnN1YlRyZWU9THQodXQpO1RlKG51bGwsSmUsSyxoZSl9cmV0dXJufUJlKFFlLEYsSyxoZSxQZSxLZSxjdCl9LENlPShGLEssaGUpPT57dmFyIHBlPUsuY29tcG9uZW50PUYuY29tcG9uZW50O2lmKElvKEYsSyxoZSkpaWYocGUuYXN5bmNEZXAmJiFwZS5hc3luY1Jlc29sdmVkKXtmdChwZSxLLGhlKTtyZXR1cm59ZWxzZSBwZS5uZXh0PUssaXIocGUudXBkYXRlKSxwZS51cGRhdGUoKTtlbHNlIEsuZWw9Ri5lbCxwZS52bm9kZT1LfSxCZT0oRixLLGhlLHBlLFBlLEtlLGN0KT0+e3ZhciBRZT0oKT0+e2lmKEYuaXNNb3VudGVkKXt2YXJ7bmV4dDpXLGJ1OnJlLHU6RWUscGFyZW50OkFlLHZub2RlOk1lfT1GLHR0PVcsaHQ7WihGLCExKSxXPyhXLmVsPU1lLmVsLGZ0KEYsVyxjdCkpOlc9TWUscmUmJmYuaW52b2tlQXJyYXlGbnMocmUpLChodD1XLnByb3BzJiZXLnByb3BzLm9uVm5vZGVCZWZvcmVVcGRhdGUpJiZQcihodCxBZSxXLE1lKSxaKEYsITApO3ZhciBZZT1qcihGKSxldD1GLnN1YlRyZWU7Ri5zdWJUcmVlPVllLF9lKGV0LFllLHNlKGV0LmVsKSxJdChldCksRixQZSxLZSksVy5lbD1ZZS5lbCx0dD09PW51bGwmJlJyKEYsWWUuZWwpLEVlJiZtKEVlLFBlKSwoaHQ9Vy5wcm9wcyYmVy5wcm9wcy5vblZub2RlVXBkYXRlZCkmJm0oKCk9PlByKGh0LEFlLFcsTWUpLFBlKX1lbHNle3ZhciB5dCx7ZWw6d3QscHJvcHM6YXR9PUsse2JtOm90LG06ZG4scGFyZW50OmJufT1GLHRyPUluKEspO2lmKFooRiwhMSksb3QmJmYuaW52b2tlQXJyYXlGbnMob3QpLCF0ciYmKHl0PWF0JiZhdC5vblZub2RlQmVmb3JlTW91bnQpJiZQcih5dCxibixLKSxaKEYsITApLHd0JiZkdCl7dmFyIFBuPSgpPT57Ri5zdWJUcmVlPWpyKEYpLGR0KHd0LEYuc3ViVHJlZSxGLFBlLG51bGwpfTt0cj9LLnR5cGUuX19hc3luY0xvYWRlcigpLnRoZW4oKCk9PiFGLmlzVW5tb3VudGVkJiZQbigpKTpQbigpfWVsc2V7dmFyICRvPUYuc3ViVHJlZT1qcihGKTtfZShudWxsLCRvLGhlLHBlLEYsUGUsS2UpLEsuZWw9JG8uZWx9aWYoZG4mJm0oZG4sUGUpLCF0ciYmKHl0PWF0JiZhdC5vblZub2RlTW91bnRlZCkpe3ZhciBTbz1LO20oKCk9PlByKHl0LGJuLFNvKSxQZSl9KEsuc2hhcGVGbGFnJjI1Nnx8Ym4mJkluKGJuLnZub2RlKSYmYm4udm5vZGUuc2hhcGVGbGFnJjI1NikmJkYuYSYmbShGLmEsUGUpLEYuaXNNb3VudGVkPSEwLEs9aGU9cGU9bnVsbH19LEplPUYuZWZmZWN0PW5ldyBULlJlYWN0aXZlRWZmZWN0KFFlLCgpPT5ubihEZSksRi5zY29wZSksRGU9Ri51cGRhdGU9KCk9PkplLnJ1bigpO0RlLmlkPUYudWlkLFooRiwhMCksRGUoKX0sZnQ9KEYsSyxoZSk9PntLLmNvbXBvbmVudD1GO3ZhciBwZT1GLnZub2RlLnByb3BzO0Yudm5vZGU9SyxGLm5leHQ9bnVsbCxXbyhGLEsucHJvcHMscGUsaGUpLHdhKEYsSy5jaGlsZHJlbixoZSksVC5wYXVzZVRyYWNraW5nKCkseG4odm9pZCAwLEYudXBkYXRlKSxULnJlc2V0VHJhY2tpbmcoKX0sQXQ9ZnVuY3Rpb24oRixLLGhlLHBlLFBlLEtlLGN0LFFlKXt2YXIgSmU9YXJndW1lbnRzLmxlbmd0aD44JiZhcmd1bWVudHNbOF0hPT12b2lkIDA/YXJndW1lbnRzWzhdOiExLERlPUYmJkYuY2hpbGRyZW4seXQ9Rj9GLnNoYXBlRmxhZzowLHd0PUsuY2hpbGRyZW4se3BhdGNoRmxhZzphdCxzaGFwZUZsYWc6b3R9PUs7aWYoYXQ+MCl7aWYoYXQmMTI4KXtsZShEZSx3dCxoZSxwZSxQZSxLZSxjdCxRZSxKZSk7cmV0dXJufWVsc2UgaWYoYXQmMjU2KXttZShEZSx3dCxoZSxwZSxQZSxLZSxjdCxRZSxKZSk7cmV0dXJufX1vdCY4Pyh5dCYxNiYmeGUoRGUsUGUsS2UpLHd0IT09RGUmJlhlKGhlLHd0KSk6eXQmMTY/b3QmMTY/bGUoRGUsd3QsaGUscGUsUGUsS2UsY3QsUWUsSmUpOnhlKERlLFBlLEtlLCEwKTooeXQmOCYmWGUoaGUsIiIpLG90JjE2JiZJKHd0LGhlLHBlLFBlLEtlLGN0LFFlLEplKSl9LG1lPShGLEssaGUscGUsUGUsS2UsY3QsUWUsSmUpPT57Rj1GfHxmLkVNUFRZX0FSUixLPUt8fGYuRU1QVFlfQVJSO3ZhciBEZT1GLmxlbmd0aCx5dD1LLmxlbmd0aCx3dD1NYXRoLm1pbihEZSx5dCksYXQ7Zm9yKGF0PTA7YXQ8d3Q7YXQrKyl7dmFyIG90PUtbYXRdPUplP1l0KEtbYXRdKTpYbihLW2F0XSk7X2UoRlthdF0sb3QsaGUsbnVsbCxQZSxLZSxjdCxRZSxKZSl9RGU+eXQ/eGUoRixQZSxLZSwhMCwhMSx3dCk6SShLLGhlLHBlLFBlLEtlLGN0LFFlLEplLHd0KX0sbGU9KEYsSyxoZSxwZSxQZSxLZSxjdCxRZSxKZSk9Pntmb3IodmFyIERlPTAseXQ9Sy5sZW5ndGgsd3Q9Ri5sZW5ndGgtMSxhdD15dC0xO0RlPD13dCYmRGU8PWF0Oyl7dmFyIG90PUZbRGVdLGRuPUtbRGVdPUplP1l0KEtbRGVdKTpYbihLW0RlXSk7aWYob3Iob3QsZG4pKV9lKG90LGRuLGhlLG51bGwsUGUsS2UsY3QsUWUsSmUpO2Vsc2UgYnJlYWs7RGUrK31mb3IoO0RlPD13dCYmRGU8PWF0Oyl7dmFyIGJuPUZbd3RdLHRyPUtbYXRdPUplP1l0KEtbYXRdKTpYbihLW2F0XSk7aWYob3IoYm4sdHIpKV9lKGJuLHRyLGhlLG51bGwsUGUsS2UsY3QsUWUsSmUpO2Vsc2UgYnJlYWs7d3QtLSxhdC0tfWlmKERlPnd0KXtpZihEZTw9YXQpZm9yKHZhciBQbj1hdCsxLCRvPVBuPHl0P0tbUG5dLmVsOnBlO0RlPD1hdDspX2UobnVsbCxLW0RlXT1KZT9ZdChLW0RlXSk6WG4oS1tEZV0pLGhlLCRvLFBlLEtlLGN0LFFlLEplKSxEZSsrfWVsc2UgaWYoRGU+YXQpZm9yKDtEZTw9d3Q7KXFlKEZbRGVdLFBlLEtlLCEwKSxEZSsrO2Vsc2V7dmFyIFNvPURlLFc9RGUscmU9bmV3IE1hcDtmb3IoRGU9VztEZTw9YXQ7RGUrKyl7dmFyIEVlPUtbRGVdPUplP1l0KEtbRGVdKTpYbihLW0RlXSk7RWUua2V5IT1udWxsJiZyZS5zZXQoRWUua2V5LERlKX12YXIgQWUsTWU9MCx0dD1hdC1XKzEsaHQ9ITEsWWU9MCxldD1uZXcgQXJyYXkodHQpO2ZvcihEZT0wO0RlPHR0O0RlKyspZXRbRGVdPTA7Zm9yKERlPVNvO0RlPD13dDtEZSsrKXt2YXIgamU9RltEZV07aWYoTWU+PXR0KXtxZShqZSxQZSxLZSwhMCk7Y29udGludWV9dmFyIE50PXZvaWQgMDtpZihqZS5rZXkhPW51bGwpTnQ9cmUuZ2V0KGplLmtleSk7ZWxzZSBmb3IoQWU9VztBZTw9YXQ7QWUrKylpZihldFtBZS1XXT09PTAmJm9yKGplLEtbQWVdKSl7TnQ9QWU7YnJlYWt9TnQ9PT12b2lkIDA/cWUoamUsUGUsS2UsITApOihldFtOdC1XXT1EZSsxLE50Pj1ZZT9ZZT1OdDpodD0hMCxfZShqZSxLW050XSxoZSxudWxsLFBlLEtlLGN0LFFlLEplKSxNZSsrKX12YXIgRHQ9aHQ/Y2UoZXQpOmYuRU1QVFlfQVJSO2ZvcihBZT1EdC5sZW5ndGgtMSxEZT10dC0xO0RlPj0wO0RlLS0pe3ZhciBGdD1XK0RlLG9uPUtbRnRdLFZyPUZ0KzE8eXQ/S1tGdCsxXS5lbDpwZTtldFtEZV09PT0wP19lKG51bGwsb24saGUsVnIsUGUsS2UsY3QsUWUsSmUpOmh0JiYoQWU8MHx8RGUhPT1EdFtBZV0/U2Uob24saGUsVnIsMik6QWUtLSl9fX0sU2U9ZnVuY3Rpb24oRixLLGhlLHBlKXt2YXIgUGU9YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOm51bGwse2VsOktlLHR5cGU6Y3QsdHJhbnNpdGlvbjpRZSxjaGlsZHJlbjpKZSxzaGFwZUZsYWc6RGV9PUY7aWYoRGUmNil7U2UoRi5jb21wb25lbnQuc3ViVHJlZSxLLGhlLHBlKTtyZXR1cm59aWYoRGUmMTI4KXtGLnN1c3BlbnNlLm1vdmUoSyxoZSxwZSk7cmV0dXJufWlmKERlJjY0KXtjdC5tb3ZlKEYsSyxoZSxCdCk7cmV0dXJufWlmKGN0PT09bnQpe0UoS2UsSyxoZSk7Zm9yKHZhciB5dD0wO3l0PEplLmxlbmd0aDt5dCsrKVNlKEplW3l0XSxLLGhlLHBlKTtFKEYuYW5jaG9yLEssaGUpO3JldHVybn1pZihjdD09PVZ0KXtzKEYsSyxoZSk7cmV0dXJufXZhciB3dD1wZSE9PTImJkRlJjEmJlFlO2lmKHd0KWlmKHBlPT09MClRZS5iZWZvcmVFbnRlcihLZSksRShLZSxLLGhlKSxtKCgpPT5RZS5lbnRlcihLZSksUGUpO2Vsc2V7dmFye2xlYXZlOmF0LGRlbGF5TGVhdmU6b3QsYWZ0ZXJMZWF2ZTpkbn09UWUsYm49KCk9PkUoS2UsSyxoZSksdHI9KCk9PnthdChLZSwoKT0+e2JuKCksZG4mJmRuKCl9KX07b3Q/b3QoS2UsYm4sdHIpOnRyKCl9ZWxzZSBFKEtlLEssaGUpfSxxZT1mdW5jdGlvbihGLEssaGUpe3ZhciBwZT1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106ITEsUGU9YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOiExLHt0eXBlOktlLHByb3BzOmN0LHJlZjpRZSxjaGlsZHJlbjpKZSxkeW5hbWljQ2hpbGRyZW46RGUsc2hhcGVGbGFnOnl0LHBhdGNoRmxhZzp3dCxkaXJzOmF0fT1GO2lmKFFlIT1udWxsJiZzbyhRZSxudWxsLGhlLEYsITApLHl0JjI1Nil7Sy5jdHguZGVhY3RpdmF0ZShGKTtyZXR1cm59dmFyIG90PXl0JjEmJmF0LGRuPSFJbihGKSxibjtpZihkbiYmKGJuPWN0JiZjdC5vblZub2RlQmVmb3JlVW5tb3VudCkmJlByKGJuLEssRikseXQmNilsdChGLmNvbXBvbmVudCxoZSxwZSk7ZWxzZXtpZih5dCYxMjgpe0Yuc3VzcGVuc2UudW5tb3VudChoZSxwZSk7cmV0dXJufW90JiZkZShGLG51bGwsSywiYmVmb3JlVW5tb3VudCIpLHl0JjY0P0YudHlwZS5yZW1vdmUoRixLLGhlLFBlLEJ0LHBlKTpEZSYmKEtlIT09bnR8fHd0PjAmJnd0JjY0KT94ZShEZSxLLGhlLCExLCEwKTooS2U9PT1udCYmd3QmKDEyOHwyNTYpfHwhUGUmJnl0JjE2KSYmeGUoSmUsSyxoZSkscGUmJkhlKEYpfShkbiYmKGJuPWN0JiZjdC5vblZub2RlVW5tb3VudGVkKXx8b3QpJiZtKCgpPT57Ym4mJlByKGJuLEssRiksb3QmJmRlKEYsbnVsbCxLLCJ1bm1vdW50ZWQiKX0saGUpfSxIZT1GPT57dmFye3R5cGU6SyxlbDpoZSxhbmNob3I6cGUsdHJhbnNpdGlvbjpQZX09RjtpZihLPT09bnQpe1JlKGhlLHBlKTtyZXR1cm59aWYoSz09PVZ0KXtkKEYpO3JldHVybn12YXIgS2U9KCk9PntQKGhlKSxQZSYmIVBlLnBlcnNpc3RlZCYmUGUuYWZ0ZXJMZWF2ZSYmUGUuYWZ0ZXJMZWF2ZSgpfTtpZihGLnNoYXBlRmxhZyYxJiZQZSYmIVBlLnBlcnNpc3RlZCl7dmFye2xlYXZlOmN0LGRlbGF5TGVhdmU6UWV9PVBlLEplPSgpPT5jdChoZSxLZSk7UWU/UWUoRi5lbCxLZSxKZSk6SmUoKX1lbHNlIEtlKCl9LFJlPShGLEspPT57Zm9yKHZhciBoZTtGIT09SzspaGU9JGUoRiksUChGKSxGPWhlO1AoSyl9LGx0PShGLEssaGUpPT57dmFye2J1bTpwZSxzY29wZTpQZSx1cGRhdGU6S2Usc3ViVHJlZTpjdCx1bTpRZX09RjtwZSYmZi5pbnZva2VBcnJheUZucyhwZSksUGUuc3RvcCgpLEtlJiYoS2UuYWN0aXZlPSExLHFlKGN0LEYsSyxoZSkpLFFlJiZtKFFlLEspLG0oKCk9PntGLmlzVW5tb3VudGVkPSEwfSxLKSxLJiZLLnBlbmRpbmdCcmFuY2gmJiFLLmlzVW5tb3VudGVkJiZGLmFzeW5jRGVwJiYhRi5hc3luY1Jlc29sdmVkJiZGLnN1c3BlbnNlSWQ9PT1LLnBlbmRpbmdJZCYmKEsuZGVwcy0tLEsuZGVwcz09PTAmJksucmVzb2x2ZSgpKX0seGU9ZnVuY3Rpb24oRixLLGhlKXtmb3IodmFyIHBlPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTohMSxQZT1hcmd1bWVudHMubGVuZ3RoPjQmJmFyZ3VtZW50c1s0XSE9PXZvaWQgMD9hcmd1bWVudHNbNF06ITEsS2U9YXJndW1lbnRzLmxlbmd0aD41JiZhcmd1bWVudHNbNV0hPT12b2lkIDA/YXJndW1lbnRzWzVdOjAsY3Q9S2U7Y3Q8Ri5sZW5ndGg7Y3QrKylxZShGW2N0XSxLLGhlLHBlLFBlKX0sSXQ9Rj0+Ri5zaGFwZUZsYWcmNj9JdChGLmNvbXBvbmVudC5zdWJUcmVlKTpGLnNoYXBlRmxhZyYxMjg/Ri5zdXNwZW5zZS5uZXh0KCk6JGUoRi5hbmNob3J8fEYuZWwpLEN0PShGLEssaGUpPT57Rj09bnVsbD9LLl92bm9kZSYmcWUoSy5fdm5vZGUsbnVsbCxudWxsLCEwKTpfZShLLl92bm9kZXx8bnVsbCxGLEssbnVsbCxudWxsLG51bGwsaGUpLHdyKCksSy5fdm5vZGU9Rn0sQnQ9e3A6X2UsdW06cWUsbTpTZSxyOkhlLG10Om9lLG1jOkkscGM6QXQscGJjOiQsbjpJdCxvfSxKdCxkdDtyZXR1cm4gYyYmKFtKdCxkdF09YyhCdCkpLHtyZW5kZXI6Q3QsaHlkcmF0ZTpKdCxjcmVhdGVBcHA6T3MoQ3QsSnQpfX1mdW5jdGlvbiBaKG8sYyl7dmFye2VmZmVjdDp2LHVwZGF0ZTpFfT1vO3YuYWxsb3dSZWN1cnNlPUUuYWxsb3dSZWN1cnNlPWN9ZnVuY3Rpb24gUShvLGMpe3ZhciB2PWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTohMSxFPW8uY2hpbGRyZW4sUD1jLmNoaWxkcmVuO2lmKGYuaXNBcnJheShFKSYmZi5pc0FycmF5KFApKWZvcih2YXIgQz0wO0M8RS5sZW5ndGg7QysrKXt2YXIgVj1FW0NdLEc9UFtDXTtHLnNoYXBlRmxhZyYxJiYhRy5keW5hbWljQ2hpbGRyZW4mJigoRy5wYXRjaEZsYWc8PTB8fEcucGF0Y2hGbGFnPT09MzIpJiYoRz1QW0NdPVl0KFBbQ10pLEcuZWw9Vi5lbCksdnx8UShWLEcpKX19ZnVuY3Rpb24gY2Uobyl7dmFyIGM9by5zbGljZSgpLHY9WzBdLEUsUCxDLFYsRyxxPW8ubGVuZ3RoO2ZvcihFPTA7RTxxO0UrKyl7dmFyIGFlPW9bRV07aWYoYWUhPT0wKXtpZihQPXZbdi5sZW5ndGgtMV0sb1tQXTxhZSl7Y1tFXT1QLHYucHVzaChFKTtjb250aW51ZX1mb3IoQz0wLFY9di5sZW5ndGgtMTtDPFY7KUc9QytWPj4xLG9bdltHXV08YWU/Qz1HKzE6Vj1HO2FlPG9bdltDXV0mJihDPjAmJihjW0VdPXZbQy0xXSksdltDXT1FKX19Zm9yKEM9di5sZW5ndGgsVj12W0MtMV07Qy0tID4wOyl2W0NdPVYsVj1jW1ZdO3JldHVybiB2fXZhciBiZT1vPT5vLl9faXNUZWxlcG9ydCxPZT1vPT5vJiYoby5kaXNhYmxlZHx8by5kaXNhYmxlZD09PSIiKSxOZT1vPT50eXBlb2YgU1ZHRWxlbWVudCE9InVuZGVmaW5lZCImJm8gaW5zdGFuY2VvZiBTVkdFbGVtZW50LHZlPShvLGMpPT57dmFyIHY9byYmby50bztpZihmLmlzU3RyaW5nKHYpKWlmKGMpe3ZhciBFPWModik7cmV0dXJuIEV9ZWxzZSByZXR1cm4gbnVsbDtlbHNlIHJldHVybiB2fSxGZT17X19pc1RlbGVwb3J0OiEwLHByb2Nlc3MobyxjLHYsRSxQLEMsVixHLHEsYWUpe3ZhcnttYzpMZSxwYzpYZSxwYmM6c2Usbzp7aW5zZXJ0OiRlLHF1ZXJ5U2VsZWN0b3I6V2UsY3JlYXRlVGV4dDpfdCxjcmVhdGVDb21tZW50OlB0fX09YWUsX2U9T2UoYy5wcm9wcykse3NoYXBlRmxhZzpmZSxjaGlsZHJlbjpUZSxkeW5hbWljQ2hpbGRyZW46aX09YztpZihvPT1udWxsKXt2YXIgcz1jLmVsPV90KCIiKSxkPWMuYW5jaG9yPV90KCIiKTskZShzLHYsRSksJGUoZCx2LEUpO3ZhciBwPWMudGFyZ2V0PXZlKGMucHJvcHMsV2UpLHk9Yy50YXJnZXRBbmNob3I9X3QoIiIpO3AmJigkZSh5LHApLFY9Vnx8TmUocCkpO3ZhciB3PShDZSxCZSk9PntmZSYxNiYmTGUoVGUsQ2UsQmUsUCxDLFYsRyxxKX07X2U/dyh2LGQpOnAmJncocCx5KX1lbHNle2MuZWw9by5lbDt2YXIgST1jLmFuY2hvcj1vLmFuY2hvcixMPWMudGFyZ2V0PW8udGFyZ2V0LCQ9Yy50YXJnZXRBbmNob3I9by50YXJnZXRBbmNob3IsZWU9T2Uoby5wcm9wcyksaWU9ZWU/djpMLEllPWVlP0k6JDtpZihWPVZ8fE5lKEwpLGk/KHNlKG8uZHluYW1pY0NoaWxkcmVuLGksaWUsUCxDLFYsRyksUShvLGMsITApKTpxfHxYZShvLGMsaWUsSWUsUCxDLFYsRywhMSksX2UpZWV8fHJ0KGMsdixJLGFlLDEpO2Vsc2UgaWYoKGMucHJvcHMmJmMucHJvcHMudG8pIT09KG8ucHJvcHMmJm8ucHJvcHMudG8pKXt2YXIgb2U9Yy50YXJnZXQ9dmUoYy5wcm9wcyxXZSk7b2UmJnJ0KGMsb2UsbnVsbCxhZSwwKX1lbHNlIGVlJiZydChjLEwsJCxhZSwxKX19LHJlbW92ZShvLGMsdixFLFAsQyl7dmFye3VtOlYsbzp7cmVtb3ZlOkd9fT1QLHtzaGFwZUZsYWc6cSxjaGlsZHJlbjphZSxhbmNob3I6TGUsdGFyZ2V0QW5jaG9yOlhlLHRhcmdldDpzZSxwcm9wczokZX09bztpZihzZSYmRyhYZSksKEN8fCFPZSgkZSkpJiYoRyhMZSkscSYxNikpZm9yKHZhciBXZT0wO1dlPGFlLmxlbmd0aDtXZSsrKXt2YXIgX3Q9YWVbV2VdO1YoX3QsYyx2LCEwLCEhX3QuZHluYW1pY0NoaWxkcmVuKX19LG1vdmU6cnQsaHlkcmF0ZTpidH07ZnVuY3Rpb24gcnQobyxjLHYsRSl7dmFye286e2luc2VydDpQfSxtOkN9PUUsVj1hcmd1bWVudHMubGVuZ3RoPjQmJmFyZ3VtZW50c1s0XSE9PXZvaWQgMD9hcmd1bWVudHNbNF06MjtWPT09MCYmUChvLnRhcmdldEFuY2hvcixjLHYpO3ZhcntlbDpHLGFuY2hvcjpxLHNoYXBlRmxhZzphZSxjaGlsZHJlbjpMZSxwcm9wczpYZX09byxzZT1WPT09MjtpZihzZSYmUChHLGMsdiksKCFzZXx8T2UoWGUpKSYmYWUmMTYpZm9yKHZhciAkZT0wOyRlPExlLmxlbmd0aDskZSsrKUMoTGVbJGVdLGMsdiwyKTtzZSYmUChxLGMsdil9ZnVuY3Rpb24gYnQobyxjLHYsRSxQLEMsVixHKXt2YXJ7bzp7bmV4dFNpYmxpbmc6cSxwYXJlbnROb2RlOmFlLHF1ZXJ5U2VsZWN0b3I6TGV9fT1WLFhlPWMudGFyZ2V0PXZlKGMucHJvcHMsTGUpO2lmKFhlKXt2YXIgc2U9WGUuX2xwYXx8WGUuZmlyc3RDaGlsZDtpZihjLnNoYXBlRmxhZyYxNilpZihPZShjLnByb3BzKSljLmFuY2hvcj1HKHEobyksYyxhZShvKSx2LEUsUCxDKSxjLnRhcmdldEFuY2hvcj1zZTtlbHNle2MuYW5jaG9yPXEobyk7Zm9yKHZhciAkZT1zZTskZTspaWYoJGU9cSgkZSksJGUmJiRlLm5vZGVUeXBlPT09OCYmJGUuZGF0YT09PSJ0ZWxlcG9ydCBhbmNob3IiKXtjLnRhcmdldEFuY2hvcj0kZSxYZS5fbHBhPWMudGFyZ2V0QW5jaG9yJiZxKGMudGFyZ2V0QW5jaG9yKTticmVha31HKHNlLGMsWGUsdixFLFAsQyl9fXJldHVybiBjLmFuY2hvciYmcShjLmFuY2hvcil9dmFyIFd0PUZlLG50PVN5bWJvbCh2b2lkIDApLEdlPVN5bWJvbCh2b2lkIDApLHV0PVN5bWJvbCh2b2lkIDApLFZ0PVN5bWJvbCh2b2lkIDApLHB0PVtdLFplPW51bGw7ZnVuY3Rpb24gT3QoKXt2YXIgbz1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXZvaWQgMD9hcmd1bWVudHNbMF06ITE7cHQucHVzaChaZT1vP251bGw6W10pfWZ1bmN0aW9uIHduKCl7cHQucG9wKCksWmU9cHRbcHQubGVuZ3RoLTFdfHxudWxsfXZhciB1bj0xO2Z1bmN0aW9uIHJuKG8pe3VuKz1vfWZ1bmN0aW9uIFNuKG8pe3JldHVybiBvLmR5bmFtaWNDaGlsZHJlbj11bj4wP1plfHxmLkVNUFRZX0FSUjpudWxsLHduKCksdW4+MCYmWmUmJlplLnB1c2gobyksb31mdW5jdGlvbiBIdChvLGMsdixFLFAsQyl7cmV0dXJuIFNuKExvKG8sYyx2LEUsUCxDLCEwKSl9ZnVuY3Rpb24gTG4obyxjLHYsRSxQKXtyZXR1cm4gU24oTHQobyxjLHYsRSxQLCEwKSl9ZnVuY3Rpb24gbWkobyl7cmV0dXJuIG8/by5fX3ZfaXNWTm9kZT09PSEwOiExfWZ1bmN0aW9uIG9yKG8sYyl7cmV0dXJuIG8udHlwZT09PWMudHlwZSYmby5rZXk9PT1jLmtleX1mdW5jdGlvbiBFcihvKXt9dmFyIEJvPSJfX3ZJbnRlcm5hbCIsV2k9bz0+e3ZhcntrZXk6Y309bztyZXR1cm4gYyE9bnVsbD9jOm51bGx9LE1vPW89Pnt2YXJ7cmVmOmMscmVmX2tleTp2LHJlZl9mb3I6RX09bztyZXR1cm4gYyE9bnVsbD9mLmlzU3RyaW5nKGMpfHxULmlzUmVmKGMpfHxmLmlzRnVuY3Rpb24oYyk/e2k6Q24scjpjLGs6dixmOiEhRX06YzpudWxsfTtmdW5jdGlvbiBMbyhvKXt2YXIgYz1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06bnVsbCx2PWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTpudWxsLEU9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOjAsUD1hcmd1bWVudHMubGVuZ3RoPjQmJmFyZ3VtZW50c1s0XSE9PXZvaWQgMD9hcmd1bWVudHNbNF06bnVsbCxDPWFyZ3VtZW50cy5sZW5ndGg+NSYmYXJndW1lbnRzWzVdIT09dm9pZCAwP2FyZ3VtZW50c1s1XTpvPT09bnQ/MDoxLFY9YXJndW1lbnRzLmxlbmd0aD42JiZhcmd1bWVudHNbNl0hPT12b2lkIDA/YXJndW1lbnRzWzZdOiExLEc9YXJndW1lbnRzLmxlbmd0aD43JiZhcmd1bWVudHNbN10hPT12b2lkIDA/YXJndW1lbnRzWzddOiExLHE9e19fdl9pc1ZOb2RlOiEwLF9fdl9za2lwOiEwLHR5cGU6byxwcm9wczpjLGtleTpjJiZXaShjKSxyZWY6YyYmTW8oYyksc2NvcGVJZDpPbixzbG90U2NvcGVJZHM6bnVsbCxjaGlsZHJlbjp2LGNvbXBvbmVudDpudWxsLHN1c3BlbnNlOm51bGwsc3NDb250ZW50Om51bGwsc3NGYWxsYmFjazpudWxsLGRpcnM6bnVsbCx0cmFuc2l0aW9uOm51bGwsZWw6bnVsbCxhbmNob3I6bnVsbCx0YXJnZXQ6bnVsbCx0YXJnZXRBbmNob3I6bnVsbCxzdGF0aWNDb3VudDowLHNoYXBlRmxhZzpDLHBhdGNoRmxhZzpFLGR5bmFtaWNQcm9wczpQLGR5bmFtaWNDaGlsZHJlbjpudWxsLGFwcENvbnRleHQ6bnVsbCxob3N0SW5zdGFuY2U6Q259O3JldHVybiBHPyhvaShxLHYpLEMmMTI4JiZvLm5vcm1hbGl6ZShxKSk6diYmKHEuc2hhcGVGbGFnfD1mLmlzU3RyaW5nKHYpPzg6MTYpLHVuPjAmJiFWJiZaZSYmKHEucGF0Y2hGbGFnPjB8fEMmNikmJnEucGF0Y2hGbGFnIT09MzImJlplLnB1c2gocSkscX12YXIgTHQ9Zm47ZnVuY3Rpb24gZm4obyl7dmFyIGM9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOm51bGwsdj1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06bnVsbCxFPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTowLFA9YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOm51bGwsQz1hcmd1bWVudHMubGVuZ3RoPjUmJmFyZ3VtZW50c1s1XSE9PXZvaWQgMD9hcmd1bWVudHNbNV06ITE7aWYoKCFvfHxvPT09WCkmJihvPXV0KSxtaShvKSl7dmFyIFY9cXIobyxjLCEwKTtyZXR1cm4gdiYmb2koVix2KSx1bj4wJiYhQyYmWmUmJihWLnNoYXBlRmxhZyY2P1plW1plLmluZGV4T2YobyldPVY6WmUucHVzaChWKSksVi5wYXRjaEZsYWd8PS0yLFZ9aWYoeW8obykmJihvPW8uX192Y2NPcHRzKSxjKXtjPWNvKGMpO3ZhcntjbGFzczpHLHN0eWxlOnF9PWM7RyYmIWYuaXNTdHJpbmcoRykmJihjLmNsYXNzPWYubm9ybWFsaXplQ2xhc3MoRykpLGYuaXNPYmplY3QocSkmJihULmlzUHJveHkocSkmJiFmLmlzQXJyYXkocSkmJihxPWYuZXh0ZW5kKHt9LHEpKSxjLnN0eWxlPWYubm9ybWFsaXplU3R5bGUocSkpfXZhciBhZT1mLmlzU3RyaW5nKG8pPzE6dXIobyk/MTI4OmJlKG8pPzY0OmYuaXNPYmplY3Qobyk/NDpmLmlzRnVuY3Rpb24obyk/MjowO3JldHVybiBMbyhvLGMsdixFLFAsYWUsQywhMCl9ZnVuY3Rpb24gY28obyl7cmV0dXJuIG8/VC5pc1Byb3h5KG8pfHxCbyBpbiBvP2YuZXh0ZW5kKHt9LG8pOm86bnVsbH1mdW5jdGlvbiBxcihvLGMpe3ZhciB2PWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTohMSx7cHJvcHM6RSxyZWY6UCxwYXRjaEZsYWc6QyxjaGlsZHJlbjpWfT1vLEc9Yz9BYShFfHx7fSxjKTpFLHE9e19fdl9pc1ZOb2RlOiEwLF9fdl9za2lwOiEwLHR5cGU6by50eXBlLHByb3BzOkcsa2V5OkcmJldpKEcpLHJlZjpjJiZjLnJlZj92JiZQP2YuaXNBcnJheShQKT9QLmNvbmNhdChNbyhjKSk6W1AsTW8oYyldOk1vKGMpOlAsc2NvcGVJZDpvLnNjb3BlSWQsc2xvdFNjb3BlSWRzOm8uc2xvdFNjb3BlSWRzLGNoaWxkcmVuOlYsdGFyZ2V0Om8udGFyZ2V0LHRhcmdldEFuY2hvcjpvLnRhcmdldEFuY2hvcixzdGF0aWNDb3VudDpvLnN0YXRpY0NvdW50LHNoYXBlRmxhZzpvLnNoYXBlRmxhZyxwYXRjaEZsYWc6YyYmby50eXBlIT09bnQ/Qz09PS0xPzE2OkN8MTY6QyxkeW5hbWljUHJvcHM6by5keW5hbWljUHJvcHMsZHluYW1pY0NoaWxkcmVuOm8uZHluYW1pY0NoaWxkcmVuLGFwcENvbnRleHQ6by5hcHBDb250ZXh0LGhvc3RJbnN0YW5jZTpvLmhvc3RJbnN0YW5jZSxkaXJzOm8uZGlycyx0cmFuc2l0aW9uOm8udHJhbnNpdGlvbixjb21wb25lbnQ6by5jb21wb25lbnQsc3VzcGVuc2U6by5zdXNwZW5zZSxzc0NvbnRlbnQ6by5zc0NvbnRlbnQmJnFyKG8uc3NDb250ZW50KSxzc0ZhbGxiYWNrOm8uc3NGYWxsYmFjayYmcXIoby5zc0ZhbGxiYWNrKSxlbDpvLmVsLGFuY2hvcjpvLmFuY2hvcn07cmV0dXJuIHF9ZnVuY3Rpb24gaWkoKXt2YXIgbz1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXZvaWQgMD9hcmd1bWVudHNbMF06IiAiLGM9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOjA7cmV0dXJuIEx0KEdlLG51bGwsbyxjKX1mdW5jdGlvbiBEbyhvLGMpe3ZhciB2PUx0KFZ0LG51bGwsbyk7cmV0dXJuIHYuc3RhdGljQ291bnQ9Yyx2fWZ1bmN0aW9uIHVvKCl7dmFyIG89YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOiIiLGM9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOiExO3JldHVybiBjPyhPdCgpLExuKHV0LG51bGwsbykpOkx0KHV0LG51bGwsbyl9ZnVuY3Rpb24gWG4obyl7cmV0dXJuIG89PW51bGx8fHR5cGVvZiBvPT0iYm9vbGVhbiI/THQodXQpOmYuaXNBcnJheShvKT9MdChudCxudWxsLG8uc2xpY2UoKSk6dHlwZW9mIG89PSJvYmplY3QiP1l0KG8pOkx0KEdlLG51bGwsU3RyaW5nKG8pKX1mdW5jdGlvbiBZdChvKXtyZXR1cm4gby5lbD09PW51bGx8fG8ubWVtbz9vOnFyKG8pfWZ1bmN0aW9uIG9pKG8sYyl7dmFyIHY9MCx7c2hhcGVGbGFnOkV9PW87aWYoYz09bnVsbCljPW51bGw7ZWxzZSBpZihmLmlzQXJyYXkoYykpdj0xNjtlbHNlIGlmKHR5cGVvZiBjPT0ib2JqZWN0IilpZihFJigxfDY0KSl7dmFyIFA9Yy5kZWZhdWx0O1AmJihQLl9jJiYoUC5fZD0hMSksb2kobyxQKCkpLFAuX2MmJihQLl9kPSEwKSk7cmV0dXJufWVsc2V7dj0zMjt2YXIgQz1jLl87IUMmJiEoQm8gaW4gYyk/Yy5fY3R4PUNuOkM9PT0zJiZDbiYmKENuLnNsb3RzLl89PT0xP2MuXz0xOihjLl89MixvLnBhdGNoRmxhZ3w9MTAyNCkpfWVsc2UgZi5pc0Z1bmN0aW9uKGMpPyhjPXtkZWZhdWx0OmMsX2N0eDpDbn0sdj0zMik6KGM9U3RyaW5nKGMpLEUmNjQ/KHY9MTYsYz1baWkoYyldKTp2PTgpO28uY2hpbGRyZW49YyxvLnNoYXBlRmxhZ3w9dn1mdW5jdGlvbiBBYSgpe2Zvcih2YXIgbz17fSxjPTA7Yzxhcmd1bWVudHMubGVuZ3RoO2MrKyl7dmFyIHY9YzwwfHxhcmd1bWVudHMubGVuZ3RoPD1jP3ZvaWQgMDphcmd1bWVudHNbY107Zm9yKHZhciBFIGluIHYpaWYoRT09PSJjbGFzcyIpby5jbGFzcyE9PXYuY2xhc3MmJihvLmNsYXNzPWYubm9ybWFsaXplQ2xhc3MoW28uY2xhc3Msdi5jbGFzc10pKTtlbHNlIGlmKEU9PT0ic3R5bGUiKW8uc3R5bGU9Zi5ub3JtYWxpemVTdHlsZShbby5zdHlsZSx2LnN0eWxlXSk7ZWxzZSBpZihmLmlzT24oRSkpe3ZhciBQPW9bRV0sQz12W0VdO0MmJlAhPT1DJiYhKGYuaXNBcnJheShQKSYmUC5pbmNsdWRlcyhDKSkmJihvW0VdPVA/W10uY29uY2F0KFAsQyk6Qyl9ZWxzZSBFIT09IiImJihvW0VdPXZbRV0pfXJldHVybiBvfWZ1bmN0aW9uIFByKG8sYyx2KXt2YXIgRT1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106bnVsbDt0ZShvLGMsNyxbdixFXSl9dmFyIERyPXNhKCksVHM9MDtmdW5jdGlvbiBycyhvLGMsdil7dmFyIEU9by50eXBlLFA9KGM/Yy5hcHBDb250ZXh0Om8uYXBwQ29udGV4dCl8fERyLEM9e3VpZDpUcysrLHZub2RlOm8sdHlwZTpFLHBhcmVudDpjLGFwcENvbnRleHQ6UCxyb290Om51bGwsbmV4dDpudWxsLHN1YlRyZWU6bnVsbCxlZmZlY3Q6bnVsbCx1cGRhdGU6bnVsbCxzY29wZTpuZXcgVC5FZmZlY3RTY29wZSghMCkscmVuZGVyOm51bGwscHJveHk6bnVsbCxleHBvc2VkOm51bGwsZXhwb3NlUHJveHk6bnVsbCx3aXRoUHJveHk6bnVsbCxwcm92aWRlczpjP2MucHJvdmlkZXM6T2JqZWN0LmNyZWF0ZShQLnByb3ZpZGVzKSxhY2Nlc3NDYWNoZTpudWxsLHJlbmRlckNhY2hlOltdLGNvbXBvbmVudHM6bnVsbCxkaXJlY3RpdmVzOm51bGwscHJvcHNPcHRpb25zOmJhKEUsUCksZW1pdHNPcHRpb25zOlRvKEUsUCksZW1pdDpudWxsLGVtaXR0ZWQ6bnVsbCxwcm9wc0RlZmF1bHRzOmYuRU1QVFlfT0JKLGluaGVyaXRBdHRyczpFLmluaGVyaXRBdHRycyxjdHg6Zi5FTVBUWV9PQkosZGF0YTpmLkVNUFRZX09CSixwcm9wczpmLkVNUFRZX09CSixhdHRyczpmLkVNUFRZX09CSixzbG90czpmLkVNUFRZX09CSixyZWZzOmYuRU1QVFlfT0JKLHNldHVwU3RhdGU6Zi5FTVBUWV9PQkosc2V0dXBDb250ZXh0Om51bGwsc3VzcGVuc2U6dixzdXNwZW5zZUlkOnY/di5wZW5kaW5nSWQ6MCxhc3luY0RlcDpudWxsLGFzeW5jUmVzb2x2ZWQ6ITEsaXNNb3VudGVkOiExLGlzVW5tb3VudGVkOiExLGlzRGVhY3RpdmF0ZWQ6ITEsYmM6bnVsbCxjOm51bGwsYm06bnVsbCxtOm51bGwsYnU6bnVsbCx1Om51bGwsdW06bnVsbCxidW06bnVsbCxkYTpudWxsLGE6bnVsbCxydGc6bnVsbCxydGM6bnVsbCxlYzpudWxsLHNwOm51bGx9O3JldHVybiBDLmN0eD17XzpDfSxDLnJvb3Q9Yz9jLnJvb3Q6QyxDLmVtaXQ9T28uYmluZChudWxsLEMpLG8uY2UmJm8uY2UoQyksQ312YXIgR249bnVsbCxBbj0oKT0+R258fENuLFFuPW89PntHbj1vLG8uc2NvcGUub24oKX0sRnI9KCk9PntHbiYmR24uc2NvcGUub2ZmKCksR249bnVsbH07ZnVuY3Rpb24ga2kobyl7cmV0dXJuIG8udm5vZGUuc2hhcGVGbGFnJjR9Ti5pc0luU1NSQ29tcG9uZW50U2V0dXA9ITE7ZnVuY3Rpb24gYWkobyl7dmFyIGM9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOiExO04uaXNJblNTUkNvbXBvbmVudFNldHVwPWM7dmFye3Byb3BzOnYsY2hpbGRyZW46RX09by52bm9kZSxQPWtpKG8pO0NzKG8sdixQLGMpLGFhKG8sRSk7dmFyIEM9UD9DYShvLGMpOnZvaWQgMDtyZXR1cm4gTi5pc0luU1NSQ29tcG9uZW50U2V0dXA9ITEsQ31mdW5jdGlvbiBDYShvLGMpe3ZhciB2PW8udHlwZTtvLmFjY2Vzc0NhY2hlPU9iamVjdC5jcmVhdGUobnVsbCksby5wcm94eT1ULm1hcmtSYXcobmV3IFByb3h5KG8uY3R4LG9vKSk7dmFye3NldHVwOkV9PXY7aWYoRSl7dmFyIFA9by5zZXR1cENvbnRleHQ9RS5sZW5ndGg+MT9WZShvKTpudWxsO1FuKG8pLFQucGF1c2VUcmFja2luZygpO3ZhciBDPVkoRSxvLDAsW28ucHJvcHMsUF0pO2lmKFQucmVzZXRUcmFja2luZygpLEZyKCksZi5pc1Byb21pc2UoQykpe2lmKEMudGhlbihGcixGciksYylyZXR1cm4gQy50aGVuKFY9PntZbyhvLFYsYyl9KS5jYXRjaChWPT57RW4oVixvLDApfSk7by5hc3luY0RlcD1DfWVsc2UgWW8obyxDLGMpfWVsc2UgRGEobyxjKX1mdW5jdGlvbiBZbyhvLGMsdil7Zi5pc0Z1bmN0aW9uKGMpP28udHlwZS5fX3NzcklubGluZVJlbmRlcj9vLnNzclJlbmRlcj1jOm8ucmVuZGVyPWM6Zi5pc09iamVjdChjKSYmKG8uc2V0dXBTdGF0ZT1ULnByb3h5UmVmcyhjKSksRGEobyx2KX12YXIgR2ksWWk7ZnVuY3Rpb24gcWkobyl7R2k9byxZaT1jPT57Yy5yZW5kZXIuX3JjJiYoYy53aXRoUHJveHk9bmV3IFByb3h5KGMuY3R4LFJhKSl9fXZhciBPYT0oKT0+IUdpO2Z1bmN0aW9uIERhKG8sYyx2KXt2YXIgRT1vLnR5cGU7aWYoIW8ucmVuZGVyKXtpZighYyYmR2kmJiFFLnJlbmRlcil7dmFyIFA9RS50ZW1wbGF0ZTtpZihQKXt2YXJ7aXNDdXN0b21FbGVtZW50OkMsY29tcGlsZXJPcHRpb25zOlZ9PW8uYXBwQ29udGV4dC5jb25maWcse2RlbGltaXRlcnM6Ryxjb21waWxlck9wdGlvbnM6cX09RSxhZT1mLmV4dGVuZChmLmV4dGVuZCh7aXNDdXN0b21FbGVtZW50OkMsZGVsaW1pdGVyczpHfSxWKSxxKTtFLnJlbmRlcj1HaShQLGFlKX19by5yZW5kZXI9RS5yZW5kZXJ8fGYuTk9PUCxZaSYmWWkobyl9UW4obyksVC5wYXVzZVRyYWNraW5nKCksX2EobyksVC5yZXNldFRyYWNraW5nKCksRnIoKX1mdW5jdGlvbiBpcyhvKXtyZXR1cm4gbmV3IFByb3h5KG8uYXR0cnMse2dldChjLHYpe3JldHVybiBULnRyYWNrKG8sImdldCIsIiRhdHRycyIpLGNbdl19fSl9ZnVuY3Rpb24gVmUobyl7dmFyIGM9RT0+e28uZXhwb3NlZD1FfHx7fX0sdjtyZXR1cm57Z2V0IGF0dHJzKCl7cmV0dXJuIHZ8fCh2PWlzKG8pKX0sc2xvdHM6by5zbG90cyxlbWl0Om8uZW1pdCxleHBvc2U6Y319ZnVuY3Rpb24gVHQobyl7aWYoby5leHBvc2VkKXJldHVybiBvLmV4cG9zZVByb3h5fHwoby5leHBvc2VQcm94eT1uZXcgUHJveHkoVC5wcm94eVJlZnMoVC5tYXJrUmF3KG8uZXhwb3NlZCkpLHtnZXQoYyx2KXtpZih2IGluIGMpcmV0dXJuIGNbdl07aWYodiBpbiBibylyZXR1cm4gYm9bdl0obyl9fSkpfXZhciBSdD0vKD86XnxbLV9dKShcdykvZyxUbj1vPT5vLnJlcGxhY2UoUnQsYz0+Yy50b1VwcGVyQ2FzZSgpKS5yZXBsYWNlKC9bLV9dL2csIiIpO2Z1bmN0aW9uIGVyKG8pe3ZhciBjPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTohMDtyZXR1cm4gZi5pc0Z1bmN0aW9uKG8pP28uZGlzcGxheU5hbWV8fG8ubmFtZTpvLm5hbWV8fGMmJm8uX19uYW1lfWZ1bmN0aW9uIFN0KG8sYyl7dmFyIHY9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOiExLEU9ZXIoYyk7aWYoIUUmJmMuX19maWxlKXt2YXIgUD1jLl9fZmlsZS5tYXRjaCgvKFteL1xcXSspXC5cdyskLyk7UCYmKEU9UFsxXSl9aWYoIUUmJm8mJm8ucGFyZW50KXt2YXIgQz1WPT57Zm9yKHZhciBHIGluIFYpaWYoVltHXT09PWMpcmV0dXJuIEd9O0U9QyhvLmNvbXBvbmVudHN8fG8ucGFyZW50LnR5cGUuY29tcG9uZW50cyl8fEMoby5hcHBDb250ZXh0LmNvbXBvbmVudHMpfXJldHVybiBFP1RuKEUpOnY/IkFwcCI6IkFub255bW91cyJ9ZnVuY3Rpb24geW8obyl7cmV0dXJuIGYuaXNGdW5jdGlvbihvKSYmIl9fdmNjT3B0cyJpbiBvfXZhciBGbz0obyxjKT0+VC5jb21wdXRlZChvLGMsTi5pc0luU1NSQ29tcG9uZW50U2V0dXApO2Z1bmN0aW9uIGNhKCl7cmV0dXJuIG51bGx9ZnVuY3Rpb24gUHMoKXtyZXR1cm4gbnVsbH1mdW5jdGlvbiBxbyhvKXt9ZnVuY3Rpb24gemwobyxjKXtyZXR1cm4gbnVsbH1mdW5jdGlvbiBhbCgpe3JldHVybiBzbCgpLnNsb3RzfWZ1bmN0aW9uIFdsKCl7cmV0dXJuIHNsKCkuYXR0cnN9ZnVuY3Rpb24gc2woKXt2YXIgbz1BbigpO3JldHVybiBvLnNldHVwQ29udGV4dHx8KG8uc2V0dXBDb250ZXh0PVZlKG8pKX1mdW5jdGlvbiBsbChvLGMpe3ZhciB2PWYuaXNBcnJheShvKT9vLnJlZHVjZSgoQyxWKT0+KENbVl09e30sQykse30pOm87Zm9yKHZhciBFIGluIGMpe3ZhciBQPXZbRV07UD9mLmlzQXJyYXkoUCl8fGYuaXNGdW5jdGlvbihQKT92W0VdPXt0eXBlOlAsZGVmYXVsdDpjW0VdfTpQLmRlZmF1bHQ9Y1tFXTpQPT09bnVsbCYmKHZbRV09e2RlZmF1bHQ6Y1tFXX0pfXJldHVybiB2fWZ1bmN0aW9uIElzKG8sYyl7dmFyIHY9e30sRT1mdW5jdGlvbihDKXtjLmluY2x1ZGVzKEMpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkodixDLHtlbnVtZXJhYmxlOiEwLGdldDooKT0+b1tDXX0pfTtmb3IodmFyIFAgaW4gbylFKFApO3JldHVybiB2fWZ1bmN0aW9uIEZhKG8pe3ZhciBjPUFuKCksdj1vKCk7cmV0dXJuIEZyKCksZi5pc1Byb21pc2UodikmJih2PXYuY2F0Y2goRT0+e3Rocm93IFFuKGMpLEV9KSksW3YsKCk9PlFuKGMpXX1mdW5jdGlvbiBWYShvLGMsdil7dmFyIEU9YXJndW1lbnRzLmxlbmd0aDtyZXR1cm4gRT09PTI/Zi5pc09iamVjdChjKSYmIWYuaXNBcnJheShjKT9taShjKT9MdChvLG51bGwsW2NdKTpMdChvLGMpOkx0KG8sbnVsbCxjKTooRT4zP3Y9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpOkU9PT0zJiZtaSh2KSYmKHY9W3ZdKSxMdChvLGMsdikpfXZhciBLbz1TeW1ib2woIiIpLG9zPSgpPT57e3ZhciBvPUFpKEtvKTtyZXR1cm4gb3x8cG4oIlNlcnZlciByZW5kZXJpbmcgY29udGV4dCBub3QgcHJvdmlkZWQuIE1ha2Ugc3VyZSB0byBvbmx5IGNhbGwgdXNlU1NSQ29udGV4dCgpIGNvbmRpdGlvbmFsbHkgaW4gdGhlIHNlcnZlciBidWlsZC4iKSxvfX07ZnVuY3Rpb24gY2woKXt9ZnVuY3Rpb24gdWEobyxjLHYsRSl7dmFyIFA9dltFXTtpZihQJiZhcyhQLG8pKXJldHVybiBQO3ZhciBDPWMoKTtyZXR1cm4gQy5tZW1vPW8uc2xpY2UoKSx2W0VdPUN9ZnVuY3Rpb24gYXMobyxjKXt2YXIgdj1vLm1lbW87aWYodi5sZW5ndGghPWMubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgRT0wO0U8di5sZW5ndGg7RSsrKWlmKGYuaGFzQ2hhbmdlZCh2W0VdLGNbRV0pKXJldHVybiExO3JldHVybiB1bj4wJiZaZSYmWmUucHVzaChvKSwhMH12YXIgTnM9IjMuMi4zNyIsc3M9bnVsbCx1bD1udWxsLGZsPXtpbnNlcnQ6KG8sYyx2KT0+dj9jLmluc2VydEJlZm9yZShvLHYpOmMuYXBwZW5kQ2hpbGQobykscmVtb3ZlOm89Pnt2YXIgYz1vLnBhcmVudE5vZGU7YyYmYy5yZW1vdmVDaGlsZChvKX0sY3JlYXRlRWxlbWVudDpvPT5sLmNyZWF0ZUVsZW1lbnQobyksY3JlYXRlVGV4dDpvPT5sLmNyZWF0ZVRleHQobyksY3JlYXRlQ29tbWVudDpvPT5sLmNyZWF0ZUNvbW1lbnQobyksc2V0VGV4dDoobyxjKT0+e28uc2V0QXR0cigidmFsdWUiLGMpfSxzZXRFbGVtZW50VGV4dDoobyxjKT0+e28uc2V0QXR0cigidmFsdWUiLGMpfSxwYXJlbnROb2RlOm89Pm8ucGFyZW50Tm9kZSxuZXh0U2libGluZzpvPT5vLm5leHRTaWJsaW5nfTtmdW5jdGlvbiBUYShvKXtyZXR1cm4gT2JqZWN0LmtleXMobyl9ZnVuY3Rpb24gJGEobyl7dmFyIGM9e307cmV0dXJuIGYuaXNBcnJheShvKSYmby5mb3JFYWNoKHY9PntUYSh2KS5mb3JFYWNoKEU9Pnt2YXIgUD12W0VdLEM9Y1tFXXx8KGNbRV09e30pO1RhKFApLmZvckVhY2goVj0+e3ZhciBHPVBbVl0scT1DW1ZdfHwoQ1tWXT17fSk7VGEoRykuZm9yRWFjaChhZT0+e2FlWzBdPT09IiEiPyhxW2FlXT1HW2FlXSxkZWxldGUgcVthZS5zbGljZSgxKV0pOmYuaGFzT3duKHEsIiEiK2FlKXx8KHFbYWVdPUdbYWVdKX0pfSl9KX0pLGN9ZnVuY3Rpb24gZmEobyxjKXt2YXIgdj1jJiZjLmNsYXNzTGlzdDtyZXR1cm4gdiYmdi5pbmNsdWRlcyhvKX12YXIgZGw9L1srfj4gXSQvLFVhPSJwYXJlbnROb2RlIixrcz0icHJldmlvdXNTaWJsaW5nIjtmdW5jdGlvbiB3byhvLGMpe2Zvcih2YXIgdj1vLnNwbGl0KCIuIiksRT12Lmxlbmd0aC0xO0U+MDtFLS0pe3ZhciBQPXZbRV0sQz1QW1AubGVuZ3RoLTFdLFY9UC5yZXBsYWNlKGRsLCIiKTtpZihDPT09In4ifHxDPT09IiAiKXtmb3IodmFyIEc9Qz09PSJ+Ij9rczpVYTtjJiYoYz1jW0ddLCFmYShWLGMpKTspO2lmKCFjKXJldHVybiExfWVsc2UgaWYoQz09PSI+Ij9jPWMmJmNbVWFdOkM9PT0iKyImJihjPWMmJmNba3NdKSwhZmEoVixjKSlyZXR1cm4hMX1yZXR1cm4hMH12YXIgSGE9MWUzO2Z1bmN0aW9uIGphKG8sYyx2KXt2YXJ7c3R5bGVzOkUsd2VpZ2h0czpQfT1vO1RhKGMpLmZvckVhY2goQz0+e2lmKCEoQyYmdiYmIXdvKEMsdikpKXt2YXIgVj1DLnNwbGl0KCIuIikubGVuZ3RoLEc9Y1tDXTtUYShHKS5mb3JFYWNoKHE9Pnt2YXIgYWU9R1txXSxMZT1xWzBdPT09IiEiO0xlJiYocT1xLnNsaWNlKDEpKTt2YXIgWGU9UFtxXXx8MCxzZT1WKyhMZT9IYTowKTtzZT49WGUmJihQW3FdPXNlLEVbcV09YWUpfSl9fSl9ZnVuY3Rpb24gUGEobyxjKXt2YXIgdj1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06bnVsbCxFPXtzdHlsZXM6e30sd2VpZ2h0czp7fX07cmV0dXJuIG8uZm9yRWFjaChQPT57dmFyIEM9Y1tQXTtDJiZqYShFLEMsdil9KSxFLnN0eWxlc31mdW5jdGlvbiBscyhvKXtyZXR1cm4gUGEoby5jbGFzc0xpc3Qsby5zdHlsZVNoZWV0LG8pfWZ1bmN0aW9uIHphKG8sYyl7dmFyIHY9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOm51bGw7cmV0dXJuIFBhKG8sY3MoYyksdil9ZnVuY3Rpb24gY3Mobyl7dmFye3R5cGU6YyxhcHBDb250ZXh0OnZ9PW8sRT1jO2lmKCFFLl9fc3R5bGVzKWlmKHYmJmYuaXNBcnJheSh2LnByb3ZpZGVzLl9fZ2xvYmFsU3R5bGVzKSYmKHYucHJvdmlkZXMuX19nbG9iYWxTdHlsZXM9JGEodi5wcm92aWRlcy5fX2dsb2JhbFN0eWxlcykpLEUubXBUeXBlPT09InBhZ2UiJiZ2KUUuX19zdHlsZXM9di5wcm92aWRlcy5fX2dsb2JhbFN0eWxlcztlbHNle3ZhciBQPVtdO3YmJlAucHVzaCh2LnByb3ZpZGVzLl9fZ2xvYmFsU3R5bGVzKSxmLmlzQXJyYXkoRS5zdHlsZXMpJiZFLnN0eWxlcy5mb3JFYWNoKEM9PlAucHVzaChDKSksRS5fX3N0eWxlcz0kYShQKX1yZXR1cm4gRS5fX3N0eWxlc31mdW5jdGlvbiBScyhvLGMsdil7dmFyIEU9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOm51bGw7RSYmKFtjLHZdPUpvKG8sYyx2LEUpKSxvLnNldEF0dHIoYyx2KX12YXIgdXM9ImhvdmVyQ2xhc3MiLHhzPSJwbGFjZWhvbGRlckNsYXNzIixmcz0icGxhY2Vob2xkZXJTdHlsZSIsaGw9ImluZGljYXRvckNsYXNzIixXYT0iaW5kaWNhdG9yU3R5bGUiLF9pPSJtYXNrQ2xhc3MiLEtpPSJtYXNrU3R5bGUiLEJzPXt2aWV3OntjbGFzczpbdXNdLHN0eWxlOltdfSxidXR0b246e2NsYXNzOlt1c10sc3R5bGU6W119LG5hdmlnYXRvcjp7Y2xhc3M6W3VzXSxzdHlsZTpbXX0sInUtaW5wdXQiOntjbGFzczpbeHNdLHN0eWxlOltmc119LCJ1LXRleHRhcmVhIjp7Y2xhc3M6W3hzXSxzdHlsZTpbZnNdfSwicGlja2VyLXZpZXciOntjbGFzczpbaGwsX2ldLHN0eWxlOltXYSxLaV19fTtmdW5jdGlvbiBKbyhvLGMsdixFKXtpZighdilyZXR1cm5bYyx2XTt2YXIgUD1Cc1tvLnR5cGVdO2lmKFApe3ZhciBDPWYuY2FtZWxpemUoYyk7aWYoUC5jbGFzcy5pbmRleE9mKEMpPi0xKXJldHVybltDLHphKFt2XSxFLG8pXTtpZihQLnN0eWxlLmluZGV4T2YoYyk+LTEpcmV0dXJuIGYuaXNTdHJpbmcodik/W0MsZi5wYXJzZVN0cmluZ1N0eWxlKHYpXTpbQyxmLm5vcm1hbGl6ZVN0eWxlKHYpXX1yZXR1cm5bYyx2XX1mdW5jdGlvbiBHYShvLGMsdil7dmFyIEU9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOm51bGw7aWYoISFFKXt2YXIgUD12P3Yuc3BsaXQoIiAiKTpbXTtvLnNldENsYXNzTGlzdChQKSxvLnNldFN0eWxlU2hlZXQoY3MoRSkpfX1mdW5jdGlvbiBkcyhvLGMsdixFKXtvLmFkZEV2ZW50KGMsdil9ZnVuY3Rpb24gZ2wobyxjKXtvLnJlbW92ZUV2ZW50KGMpfWZ1bmN0aW9uIHBsKG8sYyx2LEUpe3ZhciBQPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTpudWxsLEM9by5fdmVpfHwoby5fdmVpPXt9KSxWPUNbY107aWYoRSYmVilWLnZhbHVlPUU7ZWxzZXt2YXJbRyxxXT1NcyhjKTtpZihFKXt2YXIgYWU9Q1tjXT1McyhFLFApO2RzKG8sRyxhZSl9ZWxzZSBWJiYoZ2wobyxHKSxDW2NdPXZvaWQgMCl9fXZhciBWbz0vKD86T25jZXxQYXNzaXZlfENhcHR1cmUpJC87ZnVuY3Rpb24gdmwobyl7cmV0dXJuIG89PT0ib24tcG9zdC1tZXNzYWdlIj8ib25Qb3N0TWVzc2FnZSI6b31mdW5jdGlvbiBNcyhvKXt2YXIgYztpZihWby50ZXN0KG8pKXtjPXt9O2Zvcih2YXIgdjt2PW8ubWF0Y2goVm8pOylvPW8uc2xpY2UoMCxvLmxlbmd0aC12WzBdLmxlbmd0aCksY1t2WzBdLnRvTG93ZXJDYXNlKCldPSEwfXJldHVybiBvPW8uc2xpY2UoMiksW3ZsKGYuaHlwaGVuYXRlKG8pKSxjXX1mdW5jdGlvbiBMcyhvLGMpe3ZhciB2PVA9Pnt0ZSh2LnZhbHVlLGMsNSxbUF0pfTt2LnZhbHVlPW87dmFyIEU9bmV3IFNldDtyZXR1cm4gZi5pc0FycmF5KHYudmFsdWUpP3YudmFsdWUuZm9yRWFjaChQPT57UC5tb2RpZmllcnMmJlAubW9kaWZpZXJzLmZvckVhY2goQz0+e0UuYWRkKEMpfSl9KToodi52YWx1ZS5tb2RpZmllcnMmJnYudmFsdWUubW9kaWZpZXJzLmZvckVhY2goUD0+e0UuYWRkKFApfSksaHModixjKSksdi5tb2RpZmllcnM9Wy4uLkVdLHZ9ZnVuY3Rpb24gaHMobyxjKXtpZighIWMpe3Zhcnskd3hzTW9kdWxlczp2fT1jO2lmKCEhdil7dmFyIEU9by52YWx1ZS50b1N0cmluZygpOyF2LmZpbmQoUD0+RS5pbmRleE9mKCIuIitQKyIuIik+LTEpfHwoby53eHNFdmVudD1vLnZhbHVlKCkpfX19ZnVuY3Rpb24gZm8obyxjLHYpe2lmKCEhdil7Zi5pc1N0cmluZyh2KSYmKHY9Zi5wYXJzZVN0cmluZ1N0eWxlKHYpKTt2YXIgRT17fSxQPWMmJiFmLmlzU3RyaW5nKGMpO2lmKFApe2Zvcih2YXIgQyBpbiBjKXZbQ109PW51bGwmJihFW2YuY2FtZWxpemUoQyldPSIiKTtmb3IodmFyIFYgaW4gdil7dmFyIEc9dltWXTtHIT09Y1tWXSYmKEVbZi5jYW1lbGl6ZShWKV09Ryl9fWVsc2UgZm9yKHZhciBxIGluIHYpRVtmLmNhbWVsaXplKHEpXT12W3FdO28uc2V0U3R5bGVzKEUpfX12YXIgWm89WyJ1LWlucHV0IiwidS10ZXh0YXJlYSJdLERzPWZ1bmN0aW9uKG8sYyx2LEUpe3ZhciBQPWFyZ3VtZW50cy5sZW5ndGg+Nj9hcmd1bWVudHNbNl06dm9pZCAwLEM9YXJndW1lbnRzLmxlbmd0aD45P2FyZ3VtZW50c1s5XTp2b2lkIDA7Yz09PSJjbGFzcyI/R2Eobyx2LEUsQ3x8UCk6Yz09PSJzdHlsZSI/Zm8obyx2LEUpOmYuaXNPbihjKT9mLmlzTW9kZWxMaXN0ZW5lcihjKXx8cGwobyxjLHYsRSxQKTpjPT09Im1vZGVsVmFsdWUiJiZaby5pbmNsdWRlcyhvLnR5cGUpP28uc2V0QXR0cnMoe21vZGVsVmFsdWU6RSx2YWx1ZTpFfSk6UnMobyxjLEUsUCl9O2Z1bmN0aW9uIEdsKCl7dmFyIG89YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOiIkc3R5bGUiO3t2YXIgYz1BbigpO2lmKCFjKXJldHVybiBmLkVNUFRZX09CSjt2YXIgdj1jLnR5cGUuX19jc3NNb2R1bGVzO2lmKCF2KXJldHVybiBmLkVNUFRZX09CSjt2YXIgRT12W29dO3JldHVybiBFfHxmLkVNUFRZX09CSn19ZnVuY3Rpb24gbWwobyl7dmFyIGM9QW4oKTtpZighIWMpe3ZhciB2PSgpPT5ncyhjLnN1YlRyZWUsbyhjLnByb3h5KSk7UGkoKCk9PnVpKHYse2ZsdXNoOiJwb3N0In0pKSxwaSh2KX19ZnVuY3Rpb24gZ3MobyxjKXtpZihvLnNoYXBlRmxhZyYxMjgpe3ZhciB2PW8uc3VzcGVuc2U7bz12LmFjdGl2ZUJyYW5jaCx2LnBlbmRpbmdCcmFuY2gmJiF2LmlzSHlkcmF0aW5nJiZ2LmVmZmVjdHMucHVzaCgoKT0+e2dzKHYuYWN0aXZlQnJhbmNoLGMpfSl9Zm9yKDtvLmNvbXBvbmVudDspbz1vLmNvbXBvbmVudC5zdWJUcmVlO2lmKG8uc2hhcGVGbGFnJjEmJm8uZWwpe3ZhciBFPW8uZWwuc3R5bGU7Zm9yKHZhciBQIGluIGMpRS5zZXRQcm9wZXJ0eSgiLS0iLmNvbmNhdChQKSxjW1BdKX1lbHNlIG8udHlwZT09PW50JiZvLmNoaWxkcmVuLmZvckVhY2goQz0+Z3MoQyxjKSl9dmFyIEZzPVsiY3RybCIsInNoaWZ0IiwiYWx0IiwibWV0YSJdLF9sPXtzdG9wOm89Pm8uc3RvcFByb3BhZ2F0aW9uKCkscHJldmVudDpvPT5vLnByZXZlbnREZWZhdWx0KCksc2VsZjpvPT5vLnRhcmdldCE9PW8uY3VycmVudFRhcmdldCxjdHJsOm89PiFvLmN0cmxLZXksc2hpZnQ6bz0+IW8uc2hpZnRLZXksYWx0Om89PiFvLmFsdEtleSxtZXRhOm89PiFvLm1ldGFLZXksbGVmdDpvPT4iYnV0dG9uImluIG8mJm8uYnV0dG9uIT09MCxtaWRkbGU6bz0+ImJ1dHRvbiJpbiBvJiZvLmJ1dHRvbiE9PTEscmlnaHQ6bz0+ImJ1dHRvbiJpbiBvJiZvLmJ1dHRvbiE9PTIsZXhhY3Q6KG8sYyk9PkZzLnNvbWUodj0+b1siIi5jb25jYXQodiwiS2V5IildJiYhYy5pbmNsdWRlcyh2KSl9LFZzPShvLGMpPT5mdW5jdGlvbih2KXtmb3IodmFyIEU9MDtFPGMubGVuZ3RoO0UrKyl7dmFyIFA9X2xbY1tFXV07aWYoUCYmUCh2LGMpKXJldHVybn1mb3IodmFyIEM9YXJndW1lbnRzLmxlbmd0aCxWPW5ldyBBcnJheShDPjE/Qy0xOjApLEc9MTtHPEM7RysrKVZbRy0xXT1hcmd1bWVudHNbR107cmV0dXJuIG8odiwuLi5WKX0sYmw9KG8sYyk9PnY9PntpZigia2V5ImluIHYpe3ZhciBFPWYuaHlwaGVuYXRlKHYua2V5KTtpZihjLnNvbWUoUD0+UD09PUUpKXJldHVybiBvKHYpfX0sRWw9Zi5leHRlbmQoe3BhdGNoUHJvcDpEc30sZmwpLHlsO2Z1bmN0aW9uIHdsKCl7cmV0dXJuIHlsfHwoeWw9UihFbCkpfXZhciBZbD1mdW5jdGlvbigpe3dsKCkucmVuZGVyKC4uLmFyZ3VtZW50cyl9LHFsPWZ1bmN0aW9uKCl7dmFyIG89d2woKS5jcmVhdGVBcHAoLi4uYXJndW1lbnRzKSx7bW91bnQ6Y309bztyZXR1cm4gby5tb3VudD12PT5jKHYpLG99O3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoTiwiY2FtZWxpemUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBmLmNhbWVsaXplfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOLCJjYXBpdGFsaXplIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZi5jYXBpdGFsaXplfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOLCJoeXBoZW5hdGUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBmLmh5cGhlbmF0ZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoTiwibm9ybWFsaXplQ2xhc3MiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBmLm5vcm1hbGl6ZUNsYXNzfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOLCJub3JtYWxpemVQcm9wcyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGYubm9ybWFsaXplUHJvcHN9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KE4sIm5vcm1hbGl6ZVN0eWxlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZi5ub3JtYWxpemVTdHlsZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoTiwidG9EaXNwbGF5U3RyaW5nIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZi50b0Rpc3BsYXlTdHJpbmd9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KE4sInRvSGFuZGxlcktleSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGYudG9IYW5kbGVyS2V5fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOLCJFZmZlY3RTY29wZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFQuRWZmZWN0U2NvcGV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KE4sIlJlYWN0aXZlRWZmZWN0Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gVC5SZWFjdGl2ZUVmZmVjdH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoTiwiY3VzdG9tUmVmIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gVC5jdXN0b21SZWZ9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KE4sImVmZmVjdCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFQuZWZmZWN0fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOLCJlZmZlY3RTY29wZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFQuZWZmZWN0U2NvcGV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KE4sImdldEN1cnJlbnRTY29wZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFQuZ2V0Q3VycmVudFNjb3BlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOLCJpc1Byb3h5Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gVC5pc1Byb3h5fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOLCJpc1JlYWN0aXZlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gVC5pc1JlYWN0aXZlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOLCJpc1JlYWRvbmx5Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gVC5pc1JlYWRvbmx5fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOLCJpc1JlZiIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFQuaXNSZWZ9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KE4sImlzU2hhbGxvdyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFQuaXNTaGFsbG93fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOLCJtYXJrUmF3Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gVC5tYXJrUmF3fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOLCJvblNjb3BlRGlzcG9zZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFQub25TY29wZURpc3Bvc2V9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KE4sInByb3h5UmVmcyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFQucHJveHlSZWZzfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOLCJyZWFjdGl2ZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFQucmVhY3RpdmV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KE4sInJlYWRvbmx5Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gVC5yZWFkb25seX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoTiwicmVmIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gVC5yZWZ9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KE4sInNoYWxsb3dSZWFjdGl2ZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFQuc2hhbGxvd1JlYWN0aXZlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOLCJzaGFsbG93UmVhZG9ubHkiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBULnNoYWxsb3dSZWFkb25seX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoTiwic2hhbGxvd1JlZiIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFQuc2hhbGxvd1JlZn19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoTiwic3RvcCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFQuc3RvcH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoTiwidG9SYXciLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBULnRvUmF3fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOLCJ0b1JlZiIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFQudG9SZWZ9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KE4sInRvUmVmcyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFQudG9SZWZzfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOLCJ0cmlnZ2VyUmVmIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gVC50cmlnZ2VyUmVmfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOLCJ1bnJlZiIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFQudW5yZWZ9fSksTi5CYXNlVHJhbnNpdGlvbj1ObyxOLkNvbW1lbnQ9dXQsTi5GcmFnbWVudD1udCxOLktlZXBBbGl2ZT1RbyxOLlN0YXRpYz1WdCxOLlN1c3BlbnNlPVhyLE4uVGVsZXBvcnQ9V3QsTi5UZXh0PUdlLE4uY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmc9dGUsTi5jYWxsV2l0aEVycm9ySGFuZGxpbmc9WSxOLmNsb25lVk5vZGU9cXIsTi5jb21wYXRVdGlscz11bCxOLmNvbXB1dGVkPUZvLE4uY3JlYXRlQXBwPXFsLE4uY3JlYXRlQmxvY2s9TG4sTi5jcmVhdGVDb21tZW50Vk5vZGU9dW8sTi5jcmVhdGVFbGVtZW50QmxvY2s9SHQsTi5jcmVhdGVFbGVtZW50Vk5vZGU9TG8sTi5jcmVhdGVIeWRyYXRpb25SZW5kZXJlcj16LE4uY3JlYXRlUHJvcHNSZXN0UHJveHk9SXMsTi5jcmVhdGVSZW5kZXJlcj1SLE4uY3JlYXRlU2xvdHM9bXIsTi5jcmVhdGVTdGF0aWNWTm9kZT1EbyxOLmNyZWF0ZVRleHRWTm9kZT1paSxOLmNyZWF0ZVZOb2RlPUx0LE4uZGVmaW5lQXN5bmNDb21wb25lbnQ9VGksTi5kZWZpbmVDb21wb25lbnQ9T3IsTi5kZWZpbmVFbWl0cz1QcyxOLmRlZmluZUV4cG9zZT1xbyxOLmRlZmluZVByb3BzPWNhLE4uZ2V0Q3VycmVudEluc3RhbmNlPUFuLE4uZ2V0VHJhbnNpdGlvblJhd0NoaWxkcmVuPVduLE4uZ3VhcmRSZWFjdGl2ZVByb3BzPWNvLE4uaD1WYSxOLmhhbmRsZUVycm9yPUVuLE4uaW5pdEN1c3RvbUZvcm1hdHRlcj1jbCxOLmluamVjdD1BaSxOLmluamVjdEhvb2s9dGksTi5pc01lbW9TYW1lPWFzLE4uaXNSdW50aW1lT25seT1PYSxOLmlzVk5vZGU9bWksTi5tZXJnZURlZmF1bHRzPWxsLE4ubWVyZ2VQcm9wcz1BYSxOLm5leHRUaWNrPXZ0LE4ub25BY3RpdmF0ZWQ9S24sTi5vbkJlZm9yZU1vdW50PUdyLE4ub25CZWZvcmVVbm1vdW50PVlyLE4ub25CZWZvcmVVcGRhdGU9Z2ksTi5vbkRlYWN0aXZhdGVkPXByLE4ub25FcnJvckNhcHR1cmVkPXgsTi5vbk1vdW50ZWQ9UGksTi5vblJlbmRlclRyYWNrZWQ9aW8sTi5vblJlbmRlclRyaWdnZXJlZD1qaSxOLm9uU2VydmVyUHJlZmV0Y2g9cm8sTi5vblVubW91bnRlZD12aSxOLm9uVXBkYXRlZD1waSxOLm9wZW5CbG9jaz1PdCxOLnBhcnNlQ2xhc3NMaXN0PXphLE4ucGFyc2VDbGFzc1N0eWxlcz1scyxOLnBvcFNjb3BlSWQ9ZW8sTi5wcm92aWRlPWVpLE4ucHVzaFNjb3BlSWQ9UWksTi5xdWV1ZVBvc3RGbHVzaENiPURpLE4ucmVnaXN0ZXJSdW50aW1lQ29tcGlsZXI9cWksTi5yZW5kZXI9WWwsTi5yZW5kZXJMaXN0PW5pLE4ucmVuZGVyU2xvdD1lYSxOLnJlc29sdmVDb21wb25lbnQ9SixOLnJlc29sdmVEaXJlY3RpdmU9dG4sTi5yZXNvbHZlRHluYW1pY0NvbXBvbmVudD11ZSxOLnJlc29sdmVGaWx0ZXI9c3MsTi5yZXNvbHZlVHJhbnNpdGlvbkhvb2tzPVV0LE4uc2V0QmxvY2tUcmFja2luZz1ybixOLnNldERldnRvb2xzSG9vaz1YaSxOLnNldFRyYW5zaXRpb25Ib29rcz1LdCxOLnNzckNvbnRleHRLZXk9S28sTi50b0hhbmRsZXJzPXRhLE4udHJhbnNmb3JtVk5vZGVBcmdzPUVyLE4udXNlQXR0cnM9V2wsTi51c2VDc3NNb2R1bGU9R2wsTi51c2VDc3NTdHlsZXM9JGEsTi51c2VDc3NWYXJzPW1sLE4udXNlU1NSQ29udGV4dD1vcyxOLnVzZVNsb3RzPWFsLE4udXNlVHJhbnNpdGlvblN0YXRlPUJyLE4udmVyc2lvbj1OcyxOLndhcm49cG4sTi53YXRjaD1NdCxOLndhdGNoRWZmZWN0PXVpLE4ud2F0Y2hQb3N0RWZmZWN0PXFuLE4ud2F0Y2hTeW5jRWZmZWN0PUNyLE4ud2l0aEFzeW5jQ29udGV4dD1GYSxOLndpdGhDdHg9U2ksTi53aXRoRGVmYXVsdHM9emwsTi53aXRoRGlyZWN0aXZlcz1uZSxOLndpdGhLZXlzPWJsLE4ud2l0aE1lbW89dWEsTi53aXRoTW9kaWZpZXJzPVZzLE4ud2l0aFNjb3BlSWQ9Z28sT2JqZWN0LmRlZmluZVByb3BlcnR5KE4sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLE59KHt9LEEsayxfKTtyZXR1cm4gUy5fX1RZUEVfXz0ibnZ1ZSIsU312YXIgZnA9UFAoeFApO3ZhciBoYz17fTtTUChoYyx7RU1QVFlfQVJSOigpPT5HUCxFTVBUWV9PQko6KCk9PldQLE5POigpPT5xUCxOT09QOigpPT5ZUCxjYW1lbGl6ZTooKT0+czEsY2FwaXRhbGl6ZTooKT0+cnUsZGVmOigpPT5kMSxleHRlbmQ6KCk9PkpyLGdldEdsb2JhbFRoaXM6KCk9PmcxLGhhc0NoYW5nZWQ6KCk9PnUxLGhhc093bjooKT0+WHMsaHlwaGVuYXRlOigpPT5yZixpbnZva2VBcnJheUZuczooKT0+ZjEsaXNBcnJheTooKT0+eWksaXNCdWlsdEluRGlyZWN0aXZlOigpPT5vMSxpc0Z1bmN0aW9uOigpPT5Gbixpc0dsb2JhbGx5V2hpdGVsaXN0ZWQ6KCk9PkxQLGlzSFRNTFRhZzooKT0+SFAsaXNJbnRlZ2VyS2V5OigpPT5yMSxpc01hcDooKT0+Z3AsaXNNb2RlbExpc3RlbmVyOigpPT5aUCxpc09iamVjdDooKT0+JGwsaXNPbjooKT0+SlAsaXNQbGFpbk9iamVjdDooKT0+VWwsaXNQcm9taXNlOigpPT50MSxpc1Jlc2VydmVkUHJvcDooKT0+aTEsaXNTVkdUYWc6KCk9PmpQLGlzU2V0OigpPT5wcCxpc1N0cmluZzooKT0+d2ksaXNTeW1ib2w6KCk9PmUxLG1ha2VNYXA6KCk9PlZsLG5vcm1hbGl6ZUNsYXNzOigpPT5uZixub3JtYWxpemVQcm9wczooKT0+VlAsbm9ybWFsaXplU3R5bGU6KCk9PnRmLHBhcnNlU3RyaW5nU3R5bGU6KCk9PmRwLHJlbW92ZTooKT0+WFAsdG9EaXNwbGF5U3RyaW5nOigpPT56UCx0b0hhbmRsZXJLZXk6KCk9PmMxLHRvTnVtYmVyOigpPT5oMSx0b1Jhd1R5cGU6KCk9Pm4xLHRvVHlwZVN0cmluZzooKT0+WGF9KTtmdW5jdGlvbiBWbChnLGwpe2xldCBfPU9iamVjdC5jcmVhdGUobnVsbCksQT1nLnNwbGl0KCIsIik7Zm9yKGxldCBrPTA7azxBLmxlbmd0aDtrKyspX1tBW2tdXT0hMDtyZXR1cm4gbD9rPT4hIV9bay50b0xvd2VyQ2FzZSgpXTprPT4hIV9ba119dmFyIE1QPSJJbmZpbml0eSx1bmRlZmluZWQsTmFOLGlzRmluaXRlLGlzTmFOLHBhcnNlRmxvYXQscGFyc2VJbnQsZGVjb2RlVVJJLGRlY29kZVVSSUNvbXBvbmVudCxlbmNvZGVVUkksZW5jb2RlVVJJQ29tcG9uZW50LE1hdGgsTnVtYmVyLERhdGUsQXJyYXksT2JqZWN0LEJvb2xlYW4sU3RyaW5nLFJlZ0V4cCxNYXAsU2V0LEpTT04sSW50bCxCaWdJbnQiLExQPVZsKE1QKTtmdW5jdGlvbiB0ZihnKXtpZih5aShnKSl7bGV0IGw9e307Zm9yKGxldCBfPTA7XzxnLmxlbmd0aDtfKyspe2xldCBBPWdbX10saz13aShBKT9kcChBKTp0ZihBKTtpZihrKWZvcihsZXQgUyBpbiBrKWxbU109a1tTXX1yZXR1cm4gbH1lbHNle2lmKHdpKGcpKXJldHVybiBnO2lmKCRsKGcpKXJldHVybiBnfX12YXIgRFA9LzsoPyFbXihdKlwpKS9nLEZQPS86KC4rKS87ZnVuY3Rpb24gZHAoZyl7bGV0IGw9e307cmV0dXJuIGcuc3BsaXQoRFApLmZvckVhY2goXz0+e2lmKF8pe2xldCBBPV8uc3BsaXQoRlApO0EubGVuZ3RoPjEmJihsW0FbMF0udHJpbSgpXT1BWzFdLnRyaW0oKSl9fSksbH1mdW5jdGlvbiBuZihnKXtsZXQgbD0iIjtpZih3aShnKSlsPWc7ZWxzZSBpZih5aShnKSlmb3IobGV0IF89MDtfPGcubGVuZ3RoO18rKyl7bGV0IEE9bmYoZ1tfXSk7QSYmKGwrPUErIiAiKX1lbHNlIGlmKCRsKGcpKWZvcihsZXQgXyBpbiBnKWdbX10mJihsKz1fKyIgIik7cmV0dXJuIGwudHJpbSgpfWZ1bmN0aW9uIFZQKGcpe2lmKCFnKXJldHVybiBudWxsO2xldHtjbGFzczpsLHN0eWxlOl99PWc7cmV0dXJuIGwmJiF3aShsKSYmKGcuY2xhc3M9bmYobCkpLF8mJihnLnN0eWxlPXRmKF8pKSxnfXZhciAkUD0iaHRtbCxib2R5LGJhc2UsaGVhZCxsaW5rLG1ldGEsc3R5bGUsdGl0bGUsYWRkcmVzcyxhcnRpY2xlLGFzaWRlLGZvb3RlcixoZWFkZXIsaDEsaDIsaDMsaDQsaDUsaDYsbmF2LHNlY3Rpb24sZGl2LGRkLGRsLGR0LGZpZ2NhcHRpb24sZmlndXJlLHBpY3R1cmUsaHIsaW1nLGxpLG1haW4sb2wscCxwcmUsdWwsYSxiLGFiYnIsYmRpLGJkbyxicixjaXRlLGNvZGUsZGF0YSxkZm4sZW0saSxrYmQsbWFyayxxLHJwLHJ0LHJ1YnkscyxzYW1wLHNtYWxsLHNwYW4sc3Ryb25nLHN1YixzdXAsdGltZSx1LHZhcix3YnIsYXJlYSxhdWRpbyxtYXAsdHJhY2ssdmlkZW8sZW1iZWQsb2JqZWN0LHBhcmFtLHNvdXJjZSxjYW52YXMsc2NyaXB0LG5vc2NyaXB0LGRlbCxpbnMsY2FwdGlvbixjb2wsY29sZ3JvdXAsdGFibGUsdGhlYWQsdGJvZHksdGQsdGgsdHIsYnV0dG9uLGRhdGFsaXN0LGZpZWxkc2V0LGZvcm0saW5wdXQsbGFiZWwsbGVnZW5kLG1ldGVyLG9wdGdyb3VwLG9wdGlvbixvdXRwdXQscHJvZ3Jlc3Msc2VsZWN0LHRleHRhcmVhLGRldGFpbHMsZGlhbG9nLG1lbnUsc3VtbWFyeSx0ZW1wbGF0ZSxibG9ja3F1b3RlLGlmcmFtZSx0Zm9vdCIsVVA9InN2ZyxhbmltYXRlLGFuaW1hdGVNb3Rpb24sYW5pbWF0ZVRyYW5zZm9ybSxjaXJjbGUsY2xpcFBhdGgsY29sb3ItcHJvZmlsZSxkZWZzLGRlc2MsZGlzY2FyZCxlbGxpcHNlLGZlQmxlbmQsZmVDb2xvck1hdHJpeCxmZUNvbXBvbmVudFRyYW5zZmVyLGZlQ29tcG9zaXRlLGZlQ29udm9sdmVNYXRyaXgsZmVEaWZmdXNlTGlnaHRpbmcsZmVEaXNwbGFjZW1lbnRNYXAsZmVEaXN0YW5jZUxpZ2h0LGZlRHJvcFNoYWRvdyxmZUZsb29kLGZlRnVuY0EsZmVGdW5jQixmZUZ1bmNHLGZlRnVuY1IsZmVHYXVzc2lhbkJsdXIsZmVJbWFnZSxmZU1lcmdlLGZlTWVyZ2VOb2RlLGZlTW9ycGhvbG9neSxmZU9mZnNldCxmZVBvaW50TGlnaHQsZmVTcGVjdWxhckxpZ2h0aW5nLGZlU3BvdExpZ2h0LGZlVGlsZSxmZVR1cmJ1bGVuY2UsZmlsdGVyLGZvcmVpZ25PYmplY3QsZyxoYXRjaCxoYXRjaHBhdGgsaW1hZ2UsbGluZSxsaW5lYXJHcmFkaWVudCxtYXJrZXIsbWFzayxtZXNoLG1lc2hncmFkaWVudCxtZXNocGF0Y2gsbWVzaHJvdyxtZXRhZGF0YSxtcGF0aCxwYXRoLHBhdHRlcm4scG9seWdvbixwb2x5bGluZSxyYWRpYWxHcmFkaWVudCxyZWN0LHNldCxzb2xpZGNvbG9yLHN0b3Asc3dpdGNoLHN5bWJvbCx0ZXh0LHRleHRQYXRoLHRpdGxlLHRzcGFuLHVua25vd24sdXNlLHZpZXciLEhQPVZsKCRQKSxqUD1WbChVUCkselA9Zz0+d2koZyk/ZzpnPT1udWxsPyIiOnlpKGcpfHwkbChnKSYmKGcudG9TdHJpbmc9PT12cHx8IUZuKGcudG9TdHJpbmcpKT9KU09OLnN0cmluZ2lmeShnLGhwLDIpOlN0cmluZyhnKSxocD0oZyxsKT0+bCYmbC5fX3ZfaXNSZWY/aHAoZyxsLnZhbHVlKTpncChsKT97W2BNYXAoJHtsLnNpemV9KWBdOlsuLi5sLmVudHJpZXMoKV0ucmVkdWNlKChfLFtBLGtdKT0+KF9bYCR7QX0gPT5gXT1rLF8pLHt9KX06cHAobCk/e1tgU2V0KCR7bC5zaXplfSlgXTpbLi4ubC52YWx1ZXMoKV19OiRsKGwpJiYheWkobCkmJiFVbChsKT9TdHJpbmcobCk6bCxXUD17fSxHUD1bXSxZUD0oKT0+e30scVA9KCk9PiExLEtQPS9eb25bXmEtel0vLEpQPWc9PktQLnRlc3QoZyksWlA9Zz0+Zy5zdGFydHNXaXRoKCJvblVwZGF0ZToiKSxKcj1PYmplY3QuYXNzaWduLFhQPShnLGwpPT57bGV0IF89Zy5pbmRleE9mKGwpO18+LTEmJmcuc3BsaWNlKF8sMSl9LFFQPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksWHM9KGcsbCk9PlFQLmNhbGwoZyxsKSx5aT1BcnJheS5pc0FycmF5LGdwPWc9PlhhKGcpPT09IltvYmplY3QgTWFwXSIscHA9Zz0+WGEoZyk9PT0iW29iamVjdCBTZXRdIixGbj1nPT50eXBlb2YgZz09ImZ1bmN0aW9uIix3aT1nPT50eXBlb2YgZz09InN0cmluZyIsZTE9Zz0+dHlwZW9mIGc9PSJzeW1ib2wiLCRsPWc9PmchPT1udWxsJiZ0eXBlb2YgZz09Im9iamVjdCIsdDE9Zz0+JGwoZykmJkZuKGcudGhlbikmJkZuKGcuY2F0Y2gpLHZwPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsWGE9Zz0+dnAuY2FsbChnKSxuMT1nPT5YYShnKS5zbGljZSg4LC0xKSxVbD1nPT5YYShnKT09PSJbb2JqZWN0IE9iamVjdF0iLHIxPWc9PndpKGcpJiZnIT09Ik5hTiImJmdbMF0hPT0iLSImJiIiK3BhcnNlSW50KGcsMTApPT09ZyxpMT1WbCgiLGtleSxyZWYscmVmX2ZvcixyZWZfa2V5LG9uVm5vZGVCZWZvcmVNb3VudCxvblZub2RlTW91bnRlZCxvblZub2RlQmVmb3JlVXBkYXRlLG9uVm5vZGVVcGRhdGVkLG9uVm5vZGVCZWZvcmVVbm1vdW50LG9uVm5vZGVVbm1vdW50ZWQiKSxvMT1WbCgiYmluZCxjbG9hayxlbHNlLWlmLGVsc2UsZm9yLGh0bWwsaWYsbW9kZWwsb24sb25jZSxwcmUsc2hvdyxzbG90LHRleHQsbWVtbyIpLG51PWc9PntsZXQgbD1PYmplY3QuY3JlYXRlKG51bGwpO3JldHVybiBfPT5sW19dfHwobFtfXT1nKF8pKX0sYTE9Ly0oXHcpL2csczE9bnUoZz0+Zy5yZXBsYWNlKGExLChsLF8pPT5fP18udG9VcHBlckNhc2UoKToiIikpLGwxPS9cQihbQS1aXSkvZyxyZj1udShnPT5nLnJlcGxhY2UobDEsIi0kMSIpLnRvTG93ZXJDYXNlKCkpLHJ1PW51KGc9PmcuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZy5zbGljZSgxKSksYzE9bnUoZz0+Zz9gb24ke3J1KGcpfWA6IiIpLHUxPShnLGwpPT4hT2JqZWN0LmlzKGcsbCksZjE9KGcsbCk9Pntmb3IobGV0IF89MDtfPGcubGVuZ3RoO18rKylnW19dKGwpfSxkMT0oZyxsLF8pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KGcsbCx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsdmFsdWU6X30pfSxoMT1nPT57bGV0IGw9cGFyc2VGbG9hdChnKTtyZXR1cm4gaXNOYU4obCk/ZzpsfSxtcCxnMT0oKT0+bXB8fChtcD10eXBlb2YgZ2xvYmFsVGhpcyE9InVuZGVmaW5lZCI/Z2xvYmFsVGhpczp0eXBlb2Ygc2VsZiE9InVuZGVmaW5lZCI/c2VsZjp0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIj93aW5kb3c6dHlwZW9mIGdsb2JhbCE9InVuZGVmaW5lZCI/Z2xvYmFsOnt9KTtmdW5jdGlvbiBfcChnKXt2YXIgbD1mdW5jdGlvbihfLEEpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBrKHgsLi4ubmUpe2NvbnNvbGUud2FybihgW1Z1ZSB3YXJuXSAke3h9YCwuLi5uZSl9bGV0IFM7Y2xhc3MgTntjb25zdHJ1Y3RvcihuZT0hMSl7dGhpcy5hY3RpdmU9ITAsdGhpcy5lZmZlY3RzPVtdLHRoaXMuY2xlYW51cHM9W10sIW5lJiZTJiYodGhpcy5wYXJlbnQ9Uyx0aGlzLmluZGV4PShTLnNjb3Blc3x8KFMuc2NvcGVzPVtdKSkucHVzaCh0aGlzKS0xKX1ydW4obmUpe2lmKHRoaXMuYWN0aXZlKXtsZXQgZGU9Uzt0cnl7cmV0dXJuIFM9dGhpcyxuZSgpfWZpbmFsbHl7Uz1kZX19fW9uKCl7Uz10aGlzfW9mZigpe1M9dGhpcy5wYXJlbnR9c3RvcChuZSl7aWYodGhpcy5hY3RpdmUpe2xldCBkZSxIO2ZvcihkZT0wLEg9dGhpcy5lZmZlY3RzLmxlbmd0aDtkZTxIO2RlKyspdGhpcy5lZmZlY3RzW2RlXS5zdG9wKCk7Zm9yKGRlPTAsSD10aGlzLmNsZWFudXBzLmxlbmd0aDtkZTxIO2RlKyspdGhpcy5jbGVhbnVwc1tkZV0oKTtpZih0aGlzLnNjb3Blcylmb3IoZGU9MCxIPXRoaXMuc2NvcGVzLmxlbmd0aDtkZTxIO2RlKyspdGhpcy5zY29wZXNbZGVdLnN0b3AoITApO2lmKHRoaXMucGFyZW50JiYhbmUpe2xldCBNPXRoaXMucGFyZW50LnNjb3Blcy5wb3AoKTtNJiZNIT09dGhpcyYmKHRoaXMucGFyZW50LnNjb3Blc1t0aGlzLmluZGV4XT1NLE0uaW5kZXg9dGhpcy5pbmRleCl9dGhpcy5hY3RpdmU9ITF9fX1mdW5jdGlvbiBmKHgpe3JldHVybiBuZXcgTih4KX1mdW5jdGlvbiBUKHgsbmU9Uyl7bmUmJm5lLmFjdGl2ZSYmbmUuZWZmZWN0cy5wdXNoKHgpfWZ1bmN0aW9uIHplKCl7cmV0dXJuIFN9ZnVuY3Rpb24geHQoeCl7UyYmUy5jbGVhbnVwcy5wdXNoKHgpfWxldCBwbj14PT57bGV0IG5lPW5ldyBTZXQoeCk7cmV0dXJuIG5lLnc9MCxuZS5uPTAsbmV9LEI9eD0+KHgudyZ0ZSk+MCxndD14PT4oeC5uJnRlKT4wLHZuPSh7ZGVwczp4fSk9PntpZih4Lmxlbmd0aClmb3IobGV0IG5lPTA7bmU8eC5sZW5ndGg7bmUrKyl4W25lXS53fD10ZX0sVm49eD0+e2xldHtkZXBzOm5lfT14O2lmKG5lLmxlbmd0aCl7bGV0IGRlPTA7Zm9yKGxldCBIPTA7SDxuZS5sZW5ndGg7SCsrKXtsZXQgTT1uZVtIXTtCKE0pJiYhZ3QoTSk/TS5kZWxldGUoeCk6bmVbZGUrK109TSxNLncmPX50ZSxNLm4mPX50ZX1uZS5sZW5ndGg9ZGV9fSxzdD1uZXcgV2Vha01hcCxZPTAsdGU9MSxFbj0zMCx5bixsbj1TeW1ib2woIiIpLCRuPVN5bWJvbCgiIik7Y2xhc3MgYW57Y29uc3RydWN0b3IobmUsZGU9bnVsbCxIKXt0aGlzLmZuPW5lLHRoaXMuc2NoZWR1bGVyPWRlLHRoaXMuYWN0aXZlPSEwLHRoaXMuZGVwcz1bXSx0aGlzLnBhcmVudD12b2lkIDAsVCh0aGlzLEgpfXJ1bigpe2lmKCF0aGlzLmFjdGl2ZSlyZXR1cm4gdGhpcy5mbigpO2xldCBuZT15bixkZT1zbjtmb3IoO25lOyl7aWYobmU9PT10aGlzKXJldHVybjtuZT1uZS5wYXJlbnR9dHJ5e3JldHVybiB0aGlzLnBhcmVudD15bix5bj10aGlzLHNuPSEwLHRlPTE8PCsrWSxZPD1Fbj92bih0aGlzKTprbih0aGlzKSx0aGlzLmZuKCl9ZmluYWxseXtZPD1FbiYmVm4odGhpcyksdGU9MTw8LS1ZLHluPXRoaXMucGFyZW50LHNuPWRlLHRoaXMucGFyZW50PXZvaWQgMCx0aGlzLmRlZmVyU3RvcCYmdGhpcy5zdG9wKCl9fXN0b3AoKXt5bj09PXRoaXM/dGhpcy5kZWZlclN0b3A9ITA6dGhpcy5hY3RpdmUmJihrbih0aGlzKSx0aGlzLm9uU3RvcCYmdGhpcy5vblN0b3AoKSx0aGlzLmFjdGl2ZT0hMSl9fWZ1bmN0aW9uIGtuKHgpe2xldHtkZXBzOm5lfT14O2lmKG5lLmxlbmd0aCl7Zm9yKGxldCBkZT0wO2RlPG5lLmxlbmd0aDtkZSsrKW5lW2RlXS5kZWxldGUoeCk7bmUubGVuZ3RoPTB9fWZ1bmN0aW9uIFVuKHgsbmUpe3guZWZmZWN0JiYoeD14LmVmZmVjdC5mbik7bGV0IGRlPW5ldyBhbih4KTtuZSYmKEEuZXh0ZW5kKGRlLG5lKSxuZS5zY29wZSYmVChkZSxuZS5zY29wZSkpLCghbmV8fCFuZS5sYXp5KSYmZGUucnVuKCk7bGV0IEg9ZGUucnVuLmJpbmQoZGUpO3JldHVybiBILmVmZmVjdD1kZSxIfWZ1bmN0aW9uIG1uKHgpe3guZWZmZWN0LnN0b3AoKX1sZXQgc249ITAsX249W107ZnVuY3Rpb24gUm4oKXtfbi5wdXNoKHNuKSxzbj0hMX1mdW5jdGlvbiBrcigpe19uLnB1c2goc24pLHNuPSEwfWZ1bmN0aW9uIFpyKCl7bGV0IHg9X24ucG9wKCk7c249eD09PXZvaWQgMD8hMDp4fWZ1bmN0aW9uIFVlKHgsbmUsZGUpe2lmKHNuJiZ5bil7bGV0IEg9c3QuZ2V0KHgpO0h8fHN0LnNldCh4LEg9bmV3IE1hcCk7bGV0IE09SC5nZXQoZGUpO018fEguc2V0KGRlLE09cG4oKSksaXQoTSx2b2lkIDApfX1mdW5jdGlvbiBpdCh4LG5lKXtsZXQgZGU9ITE7WTw9RW4/Z3QoeCl8fCh4Lm58PXRlLGRlPSFCKHgpKTpkZT0heC5oYXMoeW4pLGRlJiYoeC5hZGQoeW4pLHluLmRlcHMucHVzaCh4KSl9ZnVuY3Rpb24gdnQoeCxuZSxkZSxILE0sSil7bGV0IFg9c3QuZ2V0KHgpO2lmKCFYKXJldHVybjtsZXQgdWU9W107aWYobmU9PT0iY2xlYXIiKXVlPVsuLi5YLnZhbHVlcygpXTtlbHNlIGlmKGRlPT09Imxlbmd0aCImJkEuaXNBcnJheSh4KSlYLmZvckVhY2goKE1uLGNuKT0+eyhjbj09PSJsZW5ndGgifHxjbj49SCkmJnVlLnB1c2goTW4pfSk7ZWxzZSBzd2l0Y2goZGUhPT12b2lkIDAmJnVlLnB1c2goWC5nZXQoZGUpKSxuZSl7Y2FzZSJhZGQiOkEuaXNBcnJheSh4KT9BLmlzSW50ZWdlcktleShkZSkmJnVlLnB1c2goWC5nZXQoImxlbmd0aCIpKToodWUucHVzaChYLmdldChsbikpLEEuaXNNYXAoeCkmJnVlLnB1c2goWC5nZXQoJG4pKSk7YnJlYWs7Y2FzZSJkZWxldGUiOkEuaXNBcnJheSh4KXx8KHVlLnB1c2goWC5nZXQobG4pKSxBLmlzTWFwKHgpJiZ1ZS5wdXNoKFguZ2V0KCRuKSkpO2JyZWFrO2Nhc2Uic2V0IjpBLmlzTWFwKHgpJiZ1ZS5wdXNoKFguZ2V0KGxuKSk7YnJlYWt9bGV0IHRuPXZvaWQgMDtpZih1ZS5sZW5ndGg9PT0xKXVlWzBdJiZxdCh1ZVswXSk7ZWxzZXtsZXQgTW49W107Zm9yKGxldCBjbiBvZiB1ZSljbiYmTW4ucHVzaCguLi5jbik7cXQocG4oTW4pKX19ZnVuY3Rpb24gcXQoeCxuZSl7bGV0IGRlPUEuaXNBcnJheSh4KT94OlsuLi54XTtmb3IobGV0IEggb2YgZGUpSC5jb21wdXRlZCYmbm4oSCxuZSk7Zm9yKGxldCBIIG9mIGRlKUguY29tcHV0ZWR8fG5uKEgsbmUpfWZ1bmN0aW9uIG5uKHgsbmUpeyh4IT09eW58fHguYWxsb3dSZWN1cnNlKSYmKHguc2NoZWR1bGVyP3guc2NoZWR1bGVyKCk6eC5ydW4oKSl9bGV0IFF0PUEubWFrZU1hcCgiX19wcm90b19fLF9fdl9pc1JlZixfX2lzVnVlIiksaXI9bmV3IFNldChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhTeW1ib2wpLmZpbHRlcih4PT54IT09ImFyZ3VtZW50cyImJnghPT0iY2FsbGVyIikubWFwKHg9PlN5bWJvbFt4XSkuZmlsdGVyKEEuaXNTeW1ib2wpKSxscj1IcigpLExpPUhyKCExLCEwKSxEaT1IcighMCkseG49SHIoITAsITApLHdyPVVyKCk7ZnVuY3Rpb24gVXIoKXtsZXQgeD17fTtyZXR1cm5bImluY2x1ZGVzIiwiaW5kZXhPZiIsImxhc3RJbmRleE9mIl0uZm9yRWFjaChuZT0+e3hbbmVdPWZ1bmN0aW9uKC4uLmRlKXtsZXQgSD1VdCh0aGlzKTtmb3IobGV0IEo9MCxYPXRoaXMubGVuZ3RoO0o8WDtKKyspVWUoSCwiZ2V0IixKKyIiKTtsZXQgTT1IW25lXSguLi5kZSk7cmV0dXJuIE09PT0tMXx8TT09PSExP0hbbmVdKC4uLmRlLm1hcChVdCkpOk19fSksWyJwdXNoIiwicG9wIiwic2hpZnQiLCJ1bnNoaWZ0Iiwic3BsaWNlIl0uZm9yRWFjaChuZT0+e3hbbmVdPWZ1bmN0aW9uKC4uLmRlKXtSbigpO2xldCBIPVV0KHRoaXMpW25lXS5hcHBseSh0aGlzLGRlKTtyZXR1cm4gWnIoKSxIfX0pLHh9ZnVuY3Rpb24gSHIoeD0hMSxuZT0hMSl7cmV0dXJuIGZ1bmN0aW9uKEgsTSxKKXtpZihNPT09Il9fdl9pc1JlYWN0aXZlIilyZXR1cm4heDtpZihNPT09Il9fdl9pc1JlYWRvbmx5IilyZXR1cm4geDtpZihNPT09Il9fdl9pc1NoYWxsb3ciKXJldHVybiBuZTtpZihNPT09Il9fdl9yYXciJiZKPT09KHg/bmU/Q3I6cW46bmU/dWk6QWkpLmdldChIKSlyZXR1cm4gSDtsZXQgWD1BLmlzQXJyYXkoSCk7aWYoIXgmJlgmJkEuaGFzT3duKHdyLE0pKXJldHVybiBSZWZsZWN0LmdldCh3cixNLEopO2xldCB1ZT1SZWZsZWN0LmdldChILE0sSik7cmV0dXJuKEEuaXNTeW1ib2woTSk/aXIuaGFzKE0pOlF0KE0pKXx8KHh8fFVlKEgsImdldCIsTSksbmUpP3VlOkluKHVlKT9YJiZBLmlzSW50ZWdlcktleShNKT91ZTp1ZS52YWx1ZTpBLmlzT2JqZWN0KHVlKT94PyRpKHVlKTp5ZSh1ZSk6dWV9fWxldCBaaT1PbygpLFhpPU9vKCEwKTtmdW5jdGlvbiBPbyh4PSExKXtyZXR1cm4gZnVuY3Rpb24oZGUsSCxNLEope2xldCBYPWRlW0hdO2lmKEJuKFgpJiZJbihYKSYmIUluKE0pKXJldHVybiExO2lmKCF4JiYhQm4oTSkmJihObyhNKXx8KE09VXQoTSksWD1VdChYKSksIUEuaXNBcnJheShkZSkmJkluKFgpJiYhSW4oTSkpKXJldHVybiBYLnZhbHVlPU0sITA7bGV0IHVlPUEuaXNBcnJheShkZSkmJkEuaXNJbnRlZ2VyS2V5KEgpP051bWJlcihIKTxkZS5sZW5ndGg6QS5oYXNPd24oZGUsSCksdG49UmVmbGVjdC5zZXQoZGUsSCxNLEopO3JldHVybiBkZT09PVV0KEopJiYodWU/QS5oYXNDaGFuZ2VkKE0sWCkmJnZ0KGRlLCJzZXQiLEgsTSxYKTp2dChkZSwiYWRkIixILE0pKSx0bn19ZnVuY3Rpb24gVG8oeCxuZSl7bGV0IGRlPUEuaGFzT3duKHgsbmUpLEg9eFtuZV0sTT1SZWZsZWN0LmRlbGV0ZVByb3BlcnR5KHgsbmUpO3JldHVybiBNJiZkZSYmdnQoeCwiZGVsZXRlIixuZSx2b2lkIDAsSCksTX1mdW5jdGlvbiBocih4LG5lKXtsZXQgZGU9UmVmbGVjdC5oYXMoeCxuZSk7cmV0dXJuKCFBLmlzU3ltYm9sKG5lKXx8IWlyLmhhcyhuZSkpJiZVZSh4LCJoYXMiLG5lKSxkZX1mdW5jdGlvbiBDbih4KXtyZXR1cm4gVWUoeCwiaXRlcmF0ZSIsQS5pc0FycmF5KHgpPyJsZW5ndGgiOmxuKSxSZWZsZWN0Lm93bktleXMoeCl9bGV0IE9uPXtnZXQ6bHIsc2V0OlppLGRlbGV0ZVByb3BlcnR5OlRvLGhhczpocixvd25LZXlzOkNufSxjaT17Z2V0OkRpLHNldCh4LG5lKXtyZXR1cm4hMH0sZGVsZXRlUHJvcGVydHkoeCxuZSl7cmV0dXJuITB9fSxRaT1BLmV4dGVuZCh7fSxPbix7Z2V0OkxpLHNldDpYaX0pLGVvPUEuZXh0ZW5kKHt9LGNpLHtnZXQ6eG59KSxnbz14PT54LFNpPXg9PlJlZmxlY3QuZ2V0UHJvdG90eXBlT2YoeCk7ZnVuY3Rpb24gY3IoeCxuZSxkZT0hMSxIPSExKXt4PXguX192X3JhdztsZXQgTT1VdCh4KSxKPVV0KG5lKTtkZXx8KG5lIT09SiYmVWUoTSwiZ2V0IixuZSksVWUoTSwiZ2V0IixKKSk7bGV0e2hhczpYfT1TaShNKSx1ZT1IP2dvOmRlP0t0OmRpO2lmKFguY2FsbChNLG5lKSlyZXR1cm4gdWUoeC5nZXQobmUpKTtpZihYLmNhbGwoTSxKKSlyZXR1cm4gdWUoeC5nZXQoSikpO3ghPT1NJiZ4LmdldChuZSl9ZnVuY3Rpb24ganIoeCxuZT0hMSl7bGV0IGRlPXRoaXMuX192X3JhdyxIPVV0KGRlKSxNPVV0KHgpO3JldHVybiBuZXx8KHghPT1NJiZVZShILCJoYXMiLHgpLFVlKEgsImhhcyIsTSkpLHg9PT1NP2RlLmhhcyh4KTpkZS5oYXMoeCl8fGRlLmhhcyhNKX1mdW5jdGlvbiBTcih4LG5lPSExKXtyZXR1cm4geD14Ll9fdl9yYXcsIW5lJiZVZShVdCh4KSwiaXRlcmF0ZSIsbG4pLFJlZmxlY3QuZ2V0KHgsInNpemUiLHgpfWZ1bmN0aW9uIGdyKHgpe3g9VXQoeCk7bGV0IG5lPVV0KHRoaXMpO3JldHVybiBTaShuZSkuaGFzLmNhbGwobmUseCl8fChuZS5hZGQoeCksdnQobmUsImFkZCIseCx4KSksdGhpc31mdW5jdGlvbiBQbyh4LG5lKXtuZT1VdChuZSk7bGV0IGRlPVV0KHRoaXMpLHtoYXM6SCxnZXQ6TX09U2koZGUpLEo9SC5jYWxsKGRlLHgpO0p8fCh4PVV0KHgpLEo9SC5jYWxsKGRlLHgpKTtsZXQgWD1NLmNhbGwoZGUseCk7cmV0dXJuIGRlLnNldCh4LG5lKSxKP0EuaGFzQ2hhbmdlZChuZSxYKSYmdnQoZGUsInNldCIseCxuZSxYKTp2dChkZSwiYWRkIix4LG5lKSx0aGlzfWZ1bmN0aW9uIElvKHgpe2xldCBuZT1VdCh0aGlzKSx7aGFzOmRlLGdldDpIfT1TaShuZSksTT1kZS5jYWxsKG5lLHgpO018fCh4PVV0KHgpLE09ZGUuY2FsbChuZSx4KSk7bGV0IEo9SD9ILmNhbGwobmUseCk6dm9pZCAwLFg9bmUuZGVsZXRlKHgpO3JldHVybiBNJiZ2dChuZSwiZGVsZXRlIix4LHZvaWQgMCxKKSxYfWZ1bmN0aW9uIHBvKCl7bGV0IHg9VXQodGhpcyksbmU9eC5zaXplIT09MCxkZT12b2lkIDAsSD14LmNsZWFyKCk7cmV0dXJuIG5lJiZ2dCh4LCJjbGVhciIsdm9pZCAwLHZvaWQgMCxkZSksSH1mdW5jdGlvbiBScih4LG5lKXtyZXR1cm4gZnVuY3Rpb24oSCxNKXtsZXQgSj10aGlzLFg9Si5fX3ZfcmF3LHVlPVV0KFgpLHRuPW5lP2dvOng/S3Q6ZGk7cmV0dXJuIXgmJlVlKHVlLCJpdGVyYXRlIixsbiksWC5mb3JFYWNoKChNbixjbik9PkguY2FsbChNLHRuKE1uKSx0bihjbiksSikpfX1mdW5jdGlvbiB1cih4LG5lLGRlKXtyZXR1cm4gZnVuY3Rpb24oLi4uSCl7bGV0IE09dGhpcy5fX3ZfcmF3LEo9VXQoTSksWD1BLmlzTWFwKEopLHVlPXg9PT0iZW50cmllcyJ8fHg9PT1TeW1ib2wuaXRlcmF0b3ImJlgsdG49eD09PSJrZXlzIiYmWCxNbj1NW3hdKC4uLkgpLGNuPWRlP2dvOm5lP0t0OmRpO3JldHVybiFuZSYmVWUoSiwiaXRlcmF0ZSIsdG4/JG46bG4pLHtuZXh0KCl7bGV0e3ZhbHVlOm5pLGRvbmU6bXJ9PU1uLm5leHQoKTtyZXR1cm4gbXI/e3ZhbHVlOm5pLGRvbmU6bXJ9Ont2YWx1ZTp1ZT9bY24obmlbMF0pLGNuKG5pWzFdKV06Y24obmkpLGRvbmU6bXJ9fSxbU3ltYm9sLml0ZXJhdG9yXSgpe3JldHVybiB0aGlzfX19fWZ1bmN0aW9uIEFyKHgpe3JldHVybiBmdW5jdGlvbiguLi5uZSl7cmV0dXJuIHg9PT0iZGVsZXRlIj8hMTp0aGlzfX1mdW5jdGlvbiBYcigpe2xldCB4PXtnZXQoSil7cmV0dXJuIGNyKHRoaXMsSil9LGdldCBzaXplKCl7cmV0dXJuIFNyKHRoaXMpfSxoYXM6anIsYWRkOmdyLHNldDpQbyxkZWxldGU6SW8sY2xlYXI6cG8sZm9yRWFjaDpScighMSwhMSl9LG5lPXtnZXQoSil7cmV0dXJuIGNyKHRoaXMsSiwhMSwhMCl9LGdldCBzaXplKCl7cmV0dXJuIFNyKHRoaXMpfSxoYXM6anIsYWRkOmdyLHNldDpQbyxkZWxldGU6SW8sY2xlYXI6cG8sZm9yRWFjaDpScighMSwhMCl9LGRlPXtnZXQoSil7cmV0dXJuIGNyKHRoaXMsSiwhMCl9LGdldCBzaXplKCl7cmV0dXJuIFNyKHRoaXMsITApfSxoYXMoSil7cmV0dXJuIGpyLmNhbGwodGhpcyxKLCEwKX0sYWRkOkFyKCJhZGQiKSxzZXQ6QXIoInNldCIpLGRlbGV0ZTpBcigiZGVsZXRlIiksY2xlYXI6QXIoImNsZWFyIiksZm9yRWFjaDpScighMCwhMSl9LEg9e2dldChKKXtyZXR1cm4gY3IodGhpcyxKLCEwLCEwKX0sZ2V0IHNpemUoKXtyZXR1cm4gU3IodGhpcywhMCl9LGhhcyhKKXtyZXR1cm4ganIuY2FsbCh0aGlzLEosITApfSxhZGQ6QXIoImFkZCIpLHNldDpBcigic2V0IiksZGVsZXRlOkFyKCJkZWxldGUiKSxjbGVhcjpBcigiY2xlYXIiKSxmb3JFYWNoOlJyKCEwLCEwKX07cmV0dXJuWyJrZXlzIiwidmFsdWVzIiwiZW50cmllcyIsU3ltYm9sLml0ZXJhdG9yXS5mb3JFYWNoKEo9Pnt4W0pdPXVyKEosITEsITEpLGRlW0pdPXVyKEosITAsITEpLG5lW0pdPXVyKEosITEsITApLEhbSl09dXIoSiwhMCwhMCl9KSxbeCxkZSxuZSxIXX1sZXRbem4senIsdG8sRmldPVhyKCk7ZnVuY3Rpb24geHIoeCxuZSl7bGV0IGRlPW5lP3g/Rmk6dG86eD96cjp6bjtyZXR1cm4oSCxNLEopPT5NPT09Il9fdl9pc1JlYWN0aXZlIj8heDpNPT09Il9fdl9pc1JlYWRvbmx5Ij94Ok09PT0iX192X3JhdyI/SDpSZWZsZWN0LmdldChBLmhhc093bihkZSxNKSYmTSBpbiBIP2RlOkgsTSxKKX1sZXQgdm89e2dldDp4cighMSwhMSl9LG1vPXtnZXQ6eHIoITEsITApfSxfbz17Z2V0OnhyKCEwLCExKX0sUXI9e2dldDp4cighMCwhMCl9O2Z1bmN0aW9uIGVpKHgsbmUsZGUpe2xldCBIPVV0KGRlKTtpZihIIT09ZGUmJm5lLmNhbGwoeCxIKSl7bGV0IE09QS50b1Jhd1R5cGUoeCk7Y29uc29sZS53YXJuKGBSZWFjdGl2ZSAke019IGNvbnRhaW5zIGJvdGggdGhlIHJhdyBhbmQgcmVhY3RpdmUgdmVyc2lvbnMgb2YgdGhlIHNhbWUgb2JqZWN0JHtNPT09Ik1hcCI/IiBhcyBrZXlzIjoiIn0sIHdoaWNoIGNhbiBsZWFkIHRvIGluY29uc2lzdGVuY2llcy4gQXZvaWQgZGlmZmVyZW50aWF0aW5nIGJldHdlZW4gdGhlIHJhdyBhbmQgcmVhY3RpdmUgdmVyc2lvbnMgb2YgYW4gb2JqZWN0IGFuZCBvbmx5IHVzZSB0aGUgcmVhY3RpdmUgdmVyc2lvbiBpZiBwb3NzaWJsZS5gKX19bGV0IEFpPW5ldyBXZWFrTWFwLHVpPW5ldyBXZWFrTWFwLHFuPW5ldyBXZWFrTWFwLENyPW5ldyBXZWFrTWFwO2Z1bmN0aW9uIFZpKHgpe3N3aXRjaCh4KXtjYXNlIk9iamVjdCI6Y2FzZSJBcnJheSI6cmV0dXJuIDE7Y2FzZSJNYXAiOmNhc2UiU2V0IjpjYXNlIldlYWtNYXAiOmNhc2UiV2Vha1NldCI6cmV0dXJuIDI7ZGVmYXVsdDpyZXR1cm4gMH19ZnVuY3Rpb24gTXQoeCl7cmV0dXJuIHguX192X3NraXB8fCFPYmplY3QuaXNFeHRlbnNpYmxlKHgpPzA6VmkoQS50b1Jhd1R5cGUoeCkpfWZ1bmN0aW9uIHllKHgpe3JldHVybiBCbih4KT94OkJyKHgsITEsT24sdm8sQWkpfWZ1bmN0aW9uIENpKHgpe3JldHVybiBCcih4LCExLFFpLG1vLHVpKX1mdW5jdGlvbiAkaSh4KXtyZXR1cm4gQnIoeCwhMCxjaSxfbyxxbil9ZnVuY3Rpb24gV3IoeCl7cmV0dXJuIEJyKHgsITAsZW8sUXIsQ3IpfWZ1bmN0aW9uIEJyKHgsbmUsZGUsSCxNKXtpZighQS5pc09iamVjdCh4KXx8eC5fX3ZfcmF3JiYhKG5lJiZ4Ll9fdl9pc1JlYWN0aXZlKSlyZXR1cm4geDtsZXQgSj1NLmdldCh4KTtpZihKKXJldHVybiBKO2xldCBYPU10KHgpO2lmKFg9PT0wKXJldHVybiB4O2xldCB1ZT1uZXcgUHJveHkoeCxYPT09Mj9IOmRlKTtyZXR1cm4gTS5zZXQoeCx1ZSksdWV9ZnVuY3Rpb24gSG4oeCl7cmV0dXJuIEJuKHgpP0huKHguX192X3Jhdyk6ISEoeCYmeC5fX3ZfaXNSZWFjdGl2ZSl9ZnVuY3Rpb24gQm4oeCl7cmV0dXJuISEoeCYmeC5fX3ZfaXNSZWFkb25seSl9ZnVuY3Rpb24gTm8oeCl7cmV0dXJuISEoeCYmeC5fX3ZfaXNTaGFsbG93KX1mdW5jdGlvbiBPaSh4KXtyZXR1cm4gSG4oeCl8fEJuKHgpfWZ1bmN0aW9uIFV0KHgpe2xldCBuZT14JiZ4Ll9fdl9yYXc7cmV0dXJuIG5lP1V0KG5lKTp4fWZ1bmN0aW9uIGZpKHgpe3JldHVybiBBLmRlZih4LCJfX3Zfc2tpcCIsITApLHh9bGV0IGRpPXg9PkEuaXNPYmplY3QoeCk/eWUoeCk6eCxLdD14PT5BLmlzT2JqZWN0KHgpPyRpKHgpOng7ZnVuY3Rpb24gV24oeCl7c24mJnluJiYoeD1VdCh4KSxpdCh4LmRlcHx8KHguZGVwPXBuKCkpKSl9ZnVuY3Rpb24gT3IoeCxuZSl7eD1VdCh4KSx4LmRlcCYmcXQoeC5kZXApfWZ1bmN0aW9uIEluKHgpe3JldHVybiEhKHgmJnguX192X2lzUmVmPT09ITApfWZ1bmN0aW9uIFRpKHgpe3JldHVybiBoaSh4LCExKX1mdW5jdGlvbiBrbyh4KXtyZXR1cm4gaGkoeCwhMCl9ZnVuY3Rpb24gaGkoeCxuZSl7cmV0dXJuIEluKHgpP3g6bmV3IG5vKHgsbmUpfWNsYXNzIG5ve2NvbnN0cnVjdG9yKG5lLGRlKXt0aGlzLl9fdl9pc1NoYWxsb3c9ZGUsdGhpcy5kZXA9dm9pZCAwLHRoaXMuX192X2lzUmVmPSEwLHRoaXMuX3Jhd1ZhbHVlPWRlP25lOlV0KG5lKSx0aGlzLl92YWx1ZT1kZT9uZTpkaShuZSl9Z2V0IHZhbHVlKCl7cmV0dXJuIFduKHRoaXMpLHRoaXMuX3ZhbHVlfXNldCB2YWx1ZShuZSl7bmU9dGhpcy5fX3ZfaXNTaGFsbG93P25lOlV0KG5lKSxBLmhhc0NoYW5nZWQobmUsdGhpcy5fcmF3VmFsdWUpJiYodGhpcy5fcmF3VmFsdWU9bmUsdGhpcy5fdmFsdWU9dGhpcy5fX3ZfaXNTaGFsbG93P25lOmRpKG5lKSxPcih0aGlzLG5lKSl9fWZ1bmN0aW9uIFFvKHgpe09yKHgsdm9pZCAwKX1mdW5jdGlvbiBVaSh4KXtyZXR1cm4gSW4oeCk/eC52YWx1ZTp4fWxldCBLbj17Z2V0Oih4LG5lLGRlKT0+VWkoUmVmbGVjdC5nZXQoeCxuZSxkZSkpLHNldDooeCxuZSxkZSxIKT0+e2xldCBNPXhbbmVdO3JldHVybiBJbihNKSYmIUluKGRlKT8oTS52YWx1ZT1kZSwhMCk6UmVmbGVjdC5zZXQoeCxuZSxkZSxIKX19O2Z1bmN0aW9uIHByKHgpe3JldHVybiBIbih4KT94Om5ldyBQcm94eSh4LEtuKX1jbGFzcyBKbntjb25zdHJ1Y3RvcihuZSl7dGhpcy5kZXA9dm9pZCAwLHRoaXMuX192X2lzUmVmPSEwO2xldHtnZXQ6ZGUsc2V0Okh9PW5lKCgpPT5Xbih0aGlzKSwoKT0+T3IodGhpcykpO3RoaXMuX2dldD1kZSx0aGlzLl9zZXQ9SH1nZXQgdmFsdWUoKXtyZXR1cm4gdGhpcy5fZ2V0KCl9c2V0IHZhbHVlKG5lKXt0aGlzLl9zZXQobmUpfX1mdW5jdGlvbiBNcih4KXtyZXR1cm4gbmV3IEpuKHgpfWZ1bmN0aW9uIFRyKHgpe2xldCBuZT1BLmlzQXJyYXkoeCk/bmV3IEFycmF5KHgubGVuZ3RoKTp7fTtmb3IobGV0IGRlIGluIHgpbmVbZGVdPXRpKHgsZGUpO3JldHVybiBuZX1jbGFzcyBIaXtjb25zdHJ1Y3RvcihuZSxkZSxIKXt0aGlzLl9vYmplY3Q9bmUsdGhpcy5fa2V5PWRlLHRoaXMuX2RlZmF1bHRWYWx1ZT1ILHRoaXMuX192X2lzUmVmPSEwfWdldCB2YWx1ZSgpe2xldCBuZT10aGlzLl9vYmplY3RbdGhpcy5fa2V5XTtyZXR1cm4gbmU9PT12b2lkIDA/dGhpcy5fZGVmYXVsdFZhbHVlOm5lfXNldCB2YWx1ZShuZSl7dGhpcy5fb2JqZWN0W3RoaXMuX2tleV09bmV9fWZ1bmN0aW9uIHRpKHgsbmUsZGUpe2xldCBIPXhbbmVdO3JldHVybiBJbihIKT9IOm5ldyBIaSh4LG5lLGRlKX1jbGFzcyB2cntjb25zdHJ1Y3RvcihuZSxkZSxILE0pe3RoaXMuX3NldHRlcj1kZSx0aGlzLmRlcD12b2lkIDAsdGhpcy5fX3ZfaXNSZWY9ITAsdGhpcy5fZGlydHk9ITAsdGhpcy5lZmZlY3Q9bmV3IGFuKG5lLCgpPT57dGhpcy5fZGlydHl8fCh0aGlzLl9kaXJ0eT0hMCxPcih0aGlzKSl9KSx0aGlzLmVmZmVjdC5jb21wdXRlZD10aGlzLHRoaXMuZWZmZWN0LmFjdGl2ZT10aGlzLl9jYWNoZWFibGU9IU0sdGhpcy5fX3ZfaXNSZWFkb25seT1IfWdldCB2YWx1ZSgpe2xldCBuZT1VdCh0aGlzKTtyZXR1cm4gV24obmUpLChuZS5fZGlydHl8fCFuZS5fY2FjaGVhYmxlKSYmKG5lLl9kaXJ0eT0hMSxuZS5fdmFsdWU9bmUuZWZmZWN0LnJ1bigpKSxuZS5fdmFsdWV9c2V0IHZhbHVlKG5lKXt0aGlzLl9zZXR0ZXIobmUpfX1mdW5jdGlvbiBHcih4LG5lLGRlPSExKXtsZXQgSCxNLEo9QS5pc0Z1bmN0aW9uKHgpO3JldHVybiBKPyhIPXgsTT1BLk5PT1ApOihIPXguZ2V0LE09eC5zZXQpLG5ldyB2cihILE0sSnx8IU0sZGUpfXZhciBQaTtsZXQgZ2k9UHJvbWlzZS5yZXNvbHZlKCkscGk9W10sWXI9ITEsdmk9eD0+e3BpLnB1c2goeCksWXJ8fChZcj0hMCxnaS50aGVuKHJvKSl9LHJvPSgpPT57Zm9yKGxldCB4PTA7eDxwaS5sZW5ndGg7eCsrKXBpW3hdKCk7cGkubGVuZ3RoPTAsWXI9ITF9O2NsYXNzIGppe2NvbnN0cnVjdG9yKG5lKXt0aGlzLmRlcD12b2lkIDAsdGhpcy5fZGlydHk9ITAsdGhpcy5fX3ZfaXNSZWY9ITAsdGhpc1tQaV09ITA7bGV0IGRlLEg9ITEsTT0hMTt0aGlzLmVmZmVjdD1uZXcgYW4obmUsSj0+e2lmKHRoaXMuZGVwKXtpZihKKWRlPXRoaXMuX3ZhbHVlLEg9ITA7ZWxzZSBpZighTSl7bGV0IFg9SD9kZTp0aGlzLl92YWx1ZTtNPSEwLEg9ITEsdmkoKCk9Pnt0aGlzLmVmZmVjdC5hY3RpdmUmJnRoaXMuX2dldCgpIT09WCYmT3IodGhpcyksTT0hMX0pfWZvcihsZXQgWCBvZiB0aGlzLmRlcClYLmNvbXB1dGVkIGluc3RhbmNlb2YgamkmJlguc2NoZWR1bGVyKCEwKX10aGlzLl9kaXJ0eT0hMH0pLHRoaXMuZWZmZWN0LmNvbXB1dGVkPXRoaXN9X2dldCgpe3JldHVybiB0aGlzLl9kaXJ0eT8odGhpcy5fZGlydHk9ITEsdGhpcy5fdmFsdWU9dGhpcy5lZmZlY3QucnVuKCkpOnRoaXMuX3ZhbHVlfWdldCB2YWx1ZSgpe3JldHVybiBXbih0aGlzKSxVdCh0aGlzKS5fZ2V0KCl9fVBpPSJfX3ZfaXNSZWFkb25seSI7ZnVuY3Rpb24gaW8oeCl7cmV0dXJuIG5ldyBqaSh4KX1yZXR1cm4gXy5FZmZlY3RTY29wZT1OLF8uSVRFUkFURV9LRVk9bG4sXy5SZWFjdGl2ZUVmZmVjdD1hbixfLmNvbXB1dGVkPUdyLF8uY3VzdG9tUmVmPU1yLF8uZGVmZXJyZWRDb21wdXRlZD1pbyxfLmVmZmVjdD1VbixfLmVmZmVjdFNjb3BlPWYsXy5lbmFibGVUcmFja2luZz1rcixfLmdldEN1cnJlbnRTY29wZT16ZSxfLmlzUHJveHk9T2ksXy5pc1JlYWN0aXZlPUhuLF8uaXNSZWFkb25seT1CbixfLmlzUmVmPUluLF8uaXNTaGFsbG93PU5vLF8ubWFya1Jhdz1maSxfLm9uU2NvcGVEaXNwb3NlPXh0LF8ucGF1c2VUcmFja2luZz1SbixfLnByb3h5UmVmcz1wcixfLnJlYWN0aXZlPXllLF8ucmVhZG9ubHk9JGksXy5yZWY9VGksXy5yZXNldFRyYWNraW5nPVpyLF8uc2hhbGxvd1JlYWN0aXZlPUNpLF8uc2hhbGxvd1JlYWRvbmx5PVdyLF8uc2hhbGxvd1JlZj1rbyxfLnN0b3A9bW4sXy50b1Jhdz1VdCxfLnRvUmVmPXRpLF8udG9SZWZzPVRyLF8udHJhY2s9VWUsXy50cmlnZ2VyPXZ0LF8udHJpZ2dlclJlZj1RbyxfLnVucmVmPVVpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxffSh7fSxnKTtyZXR1cm4gbH1mdW5jdGlvbiBicChnKXt2YXIgbD1mdW5jdGlvbihfKXsidXNlIHN0cmljdCI7bGV0IEE9YApgLGs9NDQsUz01MCxOPTUwLGY9WyIlIiwiJSJdLFQ9IiMwMDdhZmYiLHplPSIjZjdmN2Y3Iix4dD0vXihbYS16LV0rOik/XC9cLy9pLHBuPS9eZGF0YTouKiwuKi8sQj0iV0VCX0lOVk9LRV9BUFBTRVJWSUNFIixndD0id3hzOi8vIix2bj0ianNvbjovLyIsVm49Ind4c01vZHVsZXMiLHN0PSJyZW5kZXJqc01vZHVsZXMiLFk9Im9uU2hvdyIsdGU9Im9uSGlkZSIsRW49Im9uTGF1bmNoIix5bj0ib25FcnJvciIsbG49Im9uVGhlbWVDaGFuZ2UiLCRuPSJvbktleWJvYXJkSGVpZ2h0Q2hhbmdlIixhbj0ib25QYWdlTm90Rm91bmQiLGtuPSJvblVuaGFuZGxlZFJlamVjdGlvbiIsVW49Im9uTG9hZCIsbW49Im9uUmVhZHkiLHNuPSJvblVubG9hZCIsX249Im9uSW5pdCIsUm49Im9uU2F2ZUV4aXRTdGF0ZSIsa3I9Im9uUmVzaXplIixacj0ib25CYWNrUHJlc3MiLFVlPSJvblBhZ2VTY3JvbGwiLGl0PSJvblRhYkl0ZW1UYXAiLHZ0PSJvblJlYWNoQm90dG9tIixxdD0ib25QdWxsRG93blJlZnJlc2giLG5uPSJvblNoYXJlVGltZWxpbmUiLFF0PSJvbkFkZFRvRmF2b3JpdGVzIixpcj0ib25TaGFyZUFwcE1lc3NhZ2UiLGxyPSJvbk5hdmlnYXRpb25CYXJCdXR0b25UYXAiLExpPSJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENsaWNrZWQiLERpPSJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENoYW5nZWQiLHhuPSJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENvbmZpcm1lZCIsd3I9Im9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Rm9jdXNDaGFuZ2VkIixVcj0ib25BcHBFbnRlckZvcmVncm91bmQiLEhyPSJvbkFwcEVudGVyQmFja2dyb3VuZCIsWmk9Im9uV3hzSW52b2tlQ2FsbE1ldGhvZCI7ZnVuY3Rpb24gWGkoSCl7cmV0dXJuISFILmFwcENvbnRleHR9ZnVuY3Rpb24gT28oSCl7cmV0dXJuIEgmJihYaShIKT9ILnByb3h5OkgpfWZ1bmN0aW9uIFRvKEgpe3JldHVybiBILm5vZGVUeXBlPT09MX1mdW5jdGlvbiBocihIKXtsZXR7dm5vZGU6TX09SDtpZihUbyhNLmVsKSlyZXR1cm4gTS5lbDtsZXR7c3ViVHJlZTpKfT1IO2lmKEouc2hhcGVGbGFnJjE2KXtsZXQgWD1KLmNoaWxkcmVuLmZpbmQodWU9PnVlLmVsJiZUbyh1ZS5lbCkpO2lmKFgpcmV0dXJuIFguZWx9cmV0dXJuIE0uZWx9bGV0IENuPTA7ZnVuY3Rpb24gT24oSCwuLi5NKXtsZXQgSj1EYXRlLm5vdygpLFg9Q24/Si1DbjowO3JldHVybiBDbj1KLGBbJHtKfV1bJHtYfW1zXVske0h9XVx1RkYxQSR7TS5tYXAodWU9PkpTT04uc3RyaW5naWZ5KHVlKSkuam9pbigiICIpfWB9ZnVuY3Rpb24gY2koSCl7bGV0IE09T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gSj0+TVtKXXx8KE1bSl09SChKKSl9ZnVuY3Rpb24gUWkoSCl7cmV0dXJuIGNpKEgpfWZ1bmN0aW9uIGVvKEg9IiIpe3JldHVybigiIitIKS5yZXBsYWNlKC9bXlx4MDAtXHhmZl0vZywiKioiKS5sZW5ndGh9ZnVuY3Rpb24gZ28oSCl7cmV0dXJuIEguaW5kZXhPZigiLyIpPT09MH1mdW5jdGlvbiBTaShIKXtyZXR1cm4gZ28oSCk/SDoiLyIrSH1mdW5jdGlvbiBjcihIKXtyZXR1cm4gZ28oSCk/SC5zbGljZSgxKTpIfWxldCBqcj0oSCxNKT0+e2xldCBKO2ZvcihsZXQgWD0wO1g8SC5sZW5ndGg7WCsrKUo9SFtYXShNKTtyZXR1cm4gSn07ZnVuY3Rpb24gU3IoSCxNPW51bGwpe2xldCBKO3JldHVybiguLi5YKT0+KEgmJihKPUguYXBwbHkoTSxYKSxIPW51bGwpLEopfWZ1bmN0aW9uIGdyKEgsTSl7SD1IfHx7fSxfLmlzU3RyaW5nKE0pJiYoTT17ZXJyTXNnOk19KSwvOm9rJC8udGVzdChNLmVyck1zZyk/Xy5pc0Z1bmN0aW9uKEguc3VjY2VzcykmJkguc3VjY2VzcyhNKTpfLmlzRnVuY3Rpb24oSC5mYWlsKSYmSC5mYWlsKE0pLF8uaXNGdW5jdGlvbihILmNvbXBsZXRlKSYmSC5jb21wbGV0ZShNKX1mdW5jdGlvbiBQbyhIKXtsZXQgTT17fTtyZXR1cm4gXy5pc1BsYWluT2JqZWN0KEgpJiZPYmplY3Qua2V5cyhIKS5zb3J0KCkuZm9yRWFjaChKPT57bGV0IFg9SjtNW1hdPUhbWF19KSxPYmplY3Qua2V5cyhNKT9NOkh9bGV0IElvPWVuY29kZVVSSUNvbXBvbmVudDtmdW5jdGlvbiBwbyhILE09SW8pe2xldCBKPUg/T2JqZWN0LmtleXMoSCkubWFwKFg9PntsZXQgdWU9SFtYXTtyZXR1cm4gdHlwZW9mIHVlPT09dm9pZCAwfHx1ZT09PW51bGw/dWU9IiI6Xy5pc1BsYWluT2JqZWN0KHVlKSYmKHVlPUpTT04uc3RyaW5naWZ5KHVlKSksTShYKSsiPSIrTSh1ZSl9KS5maWx0ZXIoWD0+WC5sZW5ndGg+MCkuam9pbigiJiIpOm51bGw7cmV0dXJuIEo/YD8ke0p9YDoiIn1mdW5jdGlvbiBScihIKXt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCgiIitIKX1jYXRjaChNKXt9cmV0dXJuIiIrSH1sZXQgdXI9L1wrL2c7ZnVuY3Rpb24gQXIoSCl7bGV0IE09e307aWYoSD09PSIifHxIPT09Ij8iKXJldHVybiBNO2xldCBYPShIWzBdPT09Ij8iP0guc2xpY2UoMSk6SCkuc3BsaXQoIiYiKTtmb3IobGV0IHVlPTA7dWU8WC5sZW5ndGg7Kyt1ZSl7bGV0IHRuPVhbdWVdLnJlcGxhY2UodXIsIiAiKSxNbj10bi5pbmRleE9mKCI9IiksY249UnIoTW48MD90bjp0bi5zbGljZSgwLE1uKSksbmk9TW48MD9udWxsOlJyKHRuLnNsaWNlKE1uKzEpKTtpZihjbiBpbiBNKXtsZXQgbXI9TVtjbl07Xy5pc0FycmF5KG1yKXx8KG1yPU1bY25dPVttcl0pLG1yLnB1c2gobmkpfWVsc2UgTVtjbl09bml9cmV0dXJuIE19ZnVuY3Rpb24gWHIoSCl7bGV0W00sSl09SC5zcGxpdCgiPyIsMik7cmV0dXJue3BhdGg6TSxxdWVyeTpBcihKfHwiIil9fWZ1bmN0aW9uIHpuKEgpe2xldCBNPXt9O3JldHVybiBIJiZPYmplY3Qua2V5cyhIKS5mb3JFYWNoKEo9PntKLmluZGV4T2YoImRhdGEtIik9PT0wJiYoTVtKLnJlcGxhY2UoImRhdGEtIiwiIildPUhbSl0pfSksTX1jbGFzcyB6ciBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKE0pe3N1cGVyKE0pO3RoaXMubmFtZT0iRE9NRXhjZXB0aW9uIn19ZnVuY3Rpb24gdG8oSCxNKXtyZXR1cm4gTSYmKE0uY2FwdHVyZSYmKEgrPSJDYXB0dXJlIiksTS5vbmNlJiYoSCs9Ik9uY2UiKSxNLnBhc3NpdmUmJihIKz0iUGFzc2l2ZSIpKSxgb24ke18uY2FwaXRhbGl6ZShfLmNhbWVsaXplKEgpKX1gfWNsYXNzIEZpe2NvbnN0cnVjdG9yKE0sSil7dGhpcy5kZWZhdWx0UHJldmVudGVkPSExLHRoaXMudGltZVN0YW1wPURhdGUubm93KCksdGhpcy5fc3RvcD0hMSx0aGlzLl9lbmQ9ITEsdGhpcy50eXBlPU0sdGhpcy5idWJibGVzPSEhSi5idWJibGVzLHRoaXMuY2FuY2VsYWJsZT0hIUouY2FuY2VsYWJsZX1wcmV2ZW50RGVmYXVsdCgpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH1zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKXt0aGlzLl9lbmQ9dGhpcy5fc3RvcD0hMH1zdG9wUHJvcGFnYXRpb24oKXt0aGlzLl9zdG9wPSEwfX1mdW5jdGlvbiB4cihIKXtpZihIIGluc3RhbmNlb2YgRmkpcmV0dXJuIEg7bGV0W01dPV9vKEgudHlwZSksSj1uZXcgRmkoTSx7YnViYmxlczohMSxjYW5jZWxhYmxlOiExfSk7cmV0dXJuIF8uZXh0ZW5kKEosSCksSn1jbGFzcyB2b3tjb25zdHJ1Y3Rvcigpe3RoaXMubGlzdGVuZXJzPU9iamVjdC5jcmVhdGUobnVsbCl9ZGlzcGF0Y2hFdmVudChNKXtsZXQgSj10aGlzLmxpc3RlbmVyc1tNLnR5cGVdO2lmKCFKKXJldHVybiExO2xldCBYPXhyKE0pLHVlPUoubGVuZ3RoO2ZvcihsZXQgdG49MDt0bjx1ZSYmKEpbdG5dLmNhbGwodGhpcyxYKSwhWC5fZW5kKTt0bisrKTtyZXR1cm4gWC5jYW5jZWxhYmxlJiZYLmRlZmF1bHRQcmV2ZW50ZWR9YWRkRXZlbnRMaXN0ZW5lcihNLEosWCl7TT10byhNLFgpLCh0aGlzLmxpc3RlbmVyc1tNXXx8KHRoaXMubGlzdGVuZXJzW01dPVtdKSkucHVzaChKKX1yZW1vdmVFdmVudExpc3RlbmVyKE0sSixYKXtNPXRvKE0sWCk7bGV0IHVlPXRoaXMubGlzdGVuZXJzW01dO2lmKCF1ZSlyZXR1cm47bGV0IHRuPXVlLmluZGV4T2YoSik7dG4+LTEmJnVlLnNwbGljZSh0biwxKX19bGV0IG1vPS8oPzpPbmNlfFBhc3NpdmV8Q2FwdHVyZSkkLztmdW5jdGlvbiBfbyhIKXtsZXQgTTtpZihtby50ZXN0KEgpKXtNPXt9O2xldCBKO2Zvcig7Sj1ILm1hdGNoKG1vKTspSD1ILnNsaWNlKDAsSC5sZW5ndGgtSlswXS5sZW5ndGgpLE1bSlswXS50b0xvd2VyQ2FzZSgpXT0hMH1yZXR1cm5bXy5oeXBoZW5hdGUoSC5zbGljZSgyKSksTV19bGV0IFFyPSgoKT0+KHtzdG9wOjEscHJldmVudDoxPDwxLHNlbGY6MTw8Mn0pKSgpO2Z1bmN0aW9uIGVpKEgpe2xldCBNPTA7cmV0dXJuIEguaW5jbHVkZXMoInN0b3AiKSYmKE18PVFyLnN0b3ApLEguaW5jbHVkZXMoInByZXZlbnQiKSYmKE18PVFyLnByZXZlbnQpLEguaW5jbHVkZXMoInNlbGYiKSYmKE18PVFyLnNlbGYpLE19bGV0IEFpPTAsdWk9MSxxbj0zLENyPTg7ZnVuY3Rpb24gVmkoSCxNKXtsZXR7cGFyZW50Tm9kZTpKfT1IO2lmKCFKKXJldHVybiBudWxsO2xldHtjaGlsZE5vZGVzOlh9PUo7cmV0dXJuIFhbWC5pbmRleE9mKEgpKyhNPT09Im4iPzE6LTEpXXx8bnVsbH1mdW5jdGlvbiBNdChIKXtsZXR7cGFyZW50Tm9kZTpNfT1IO00mJk0ucmVtb3ZlQ2hpbGQoSCl9ZnVuY3Rpb24geWUoSCl7IUgubm9kZUlkJiZILnBhZ2VOb2RlJiYoSC5ub2RlSWQ9SC5wYWdlTm9kZS5nZW5JZCgpKX1jbGFzcyBDaSBleHRlbmRzIHZve2NvbnN0cnVjdG9yKE0sSixYKXtzdXBlcigpO2lmKHRoaXMucGFnZU5vZGU9bnVsbCx0aGlzLnBhcmVudE5vZGU9bnVsbCx0aGlzLl90ZXh0PW51bGwsWCl7bGV0e3BhZ2VOb2RlOnVlfT1YO3VlJiYodGhpcy5wYWdlTm9kZT11ZSx0aGlzLm5vZGVJZD11ZS5nZW5JZCgpLCF1ZS5pc1VubW91bnRlZCYmdWUub25DcmVhdGUodGhpcyxKKSl9dGhpcy5ub2RlVHlwZT1NLHRoaXMubm9kZU5hbWU9Six0aGlzLmNoaWxkTm9kZXM9W119Z2V0IGZpcnN0Q2hpbGQoKXtyZXR1cm4gdGhpcy5jaGlsZE5vZGVzWzBdfHxudWxsfWdldCBsYXN0Q2hpbGQoKXtsZXR7Y2hpbGROb2RlczpNfT10aGlzLEo9TS5sZW5ndGg7cmV0dXJuIEo/TVtKLTFdOm51bGx9Z2V0IG5leHRTaWJsaW5nKCl7cmV0dXJuIFZpKHRoaXMsIm4iKX1nZXQgbm9kZVZhbHVlKCl7cmV0dXJuIG51bGx9c2V0IG5vZGVWYWx1ZShNKXt9Z2V0IHRleHRDb250ZW50KCl7cmV0dXJuIHRoaXMuX3RleHR8fCIifXNldCB0ZXh0Q29udGVudChNKXt0aGlzLl90ZXh0PU0sdGhpcy5wYWdlTm9kZSYmIXRoaXMucGFnZU5vZGUuaXNVbm1vdW50ZWQmJnRoaXMucGFnZU5vZGUub25UZXh0Q29udGVudCh0aGlzLE0pfWdldCBwYXJlbnRFbGVtZW50KCl7bGV0e3BhcmVudE5vZGU6TX09dGhpcztyZXR1cm4gTSYmTS5ub2RlVHlwZT09PXVpP006bnVsbH1nZXQgcHJldmlvdXNTaWJsaW5nKCl7cmV0dXJuIFZpKHRoaXMsInAiKX1hcHBlbmRDaGlsZChNKXtyZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUoTSxudWxsKX1jbG9uZU5vZGUoTSl7bGV0IEo9Xy5leHRlbmQoT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykpLHRoaXMpLHthdHRyaWJ1dGVzOlh9PUo7cmV0dXJuIFgmJihKLmF0dHJpYnV0ZXM9Xy5leHRlbmQoe30sWCkpLE0mJihKLmNoaWxkTm9kZXM9Si5jaGlsZE5vZGVzLm1hcCh1ZT0+dWUuY2xvbmVOb2RlKCEwKSkpLEp9aW5zZXJ0QmVmb3JlKE0sSil7TXQoTSksTS5wYWdlTm9kZT10aGlzLnBhZ2VOb2RlLE0ucGFyZW50Tm9kZT10aGlzLHllKE0pO2xldHtjaGlsZE5vZGVzOlh9PXRoaXM7aWYoSil7bGV0IHVlPVguaW5kZXhPZihKKTtpZih1ZT09PS0xKXRocm93IG5ldyB6cigiRmFpbGVkIHRvIGV4ZWN1dGUgJ2luc2VydEJlZm9yZScgb24gJ05vZGUnOiBUaGUgbm9kZSBiZWZvcmUgd2hpY2ggdGhlIG5ldyBub2RlIGlzIHRvIGJlIGluc2VydGVkIGlzIG5vdCBhIGNoaWxkIG9mIHRoaXMgbm9kZS4iKTtYLnNwbGljZSh1ZSwwLE0pfWVsc2UgWC5wdXNoKE0pO3JldHVybiB0aGlzLnBhZ2VOb2RlJiYhdGhpcy5wYWdlTm9kZS5pc1VubW91bnRlZD90aGlzLnBhZ2VOb2RlLm9uSW5zZXJ0QmVmb3JlKHRoaXMsTSxKKTpNfXJlbW92ZUNoaWxkKE0pe2xldHtjaGlsZE5vZGVzOkp9PXRoaXMsWD1KLmluZGV4T2YoTSk7aWYoWD09PS0xKXRocm93IG5ldyB6cigiRmFpbGVkIHRvIGV4ZWN1dGUgJ3JlbW92ZUNoaWxkJyBvbiAnTm9kZSc6IFRoZSBub2RlIHRvIGJlIHJlbW92ZWQgaXMgbm90IGEgY2hpbGQgb2YgdGhpcyBub2RlLiIpO3JldHVybiBNLnBhcmVudE5vZGU9bnVsbCxKLnNwbGljZShYLDEpLHRoaXMucGFnZU5vZGUmJiF0aGlzLnBhZ2VOb2RlLmlzVW5tb3VudGVkP3RoaXMucGFnZU5vZGUub25SZW1vdmVDaGlsZChNKTpNfX1sZXQgJGk9ImNsYXNzIixXcj0ic3R5bGUiLEJyPSIudk93bmVySWQiLEhuPSIudlJlbmRlcmpzIjtjbGFzcyBCbiBleHRlbmRzIENpe2NvbnN0cnVjdG9yKE0sSixYKXtzdXBlcihNLEosWCk7dGhpcy5hdHRyaWJ1dGVzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5zdHlsZT1udWxsLHRoaXMudlNob3c9bnVsbCx0aGlzLl9odG1sPW51bGx9Z2V0IGNsYXNzTmFtZSgpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbJGldfHwiIn1zZXQgY2xhc3NOYW1lKE0pe3RoaXMuc2V0QXR0cmlidXRlKCRpLE0pfWdldCBpbm5lckhUTUwoKXtyZXR1cm4iIn1zZXQgaW5uZXJIVE1MKE0pe3RoaXMuX2h0bWw9TX1hZGRFdmVudExpc3RlbmVyKE0sSixYKXtzdXBlci5hZGRFdmVudExpc3RlbmVyKE0sSixYKSx0aGlzLnBhZ2VOb2RlJiYhdGhpcy5wYWdlTm9kZS5pc1VubW91bnRlZCYmKEoud3hzRXZlbnQ/dGhpcy5wYWdlTm9kZS5vbkFkZFd4c0V2ZW50KHRoaXMsdG8oTSxYKSxKLnd4c0V2ZW50LGVpKEoubW9kaWZpZXJzfHxbXSkpOnRoaXMucGFnZU5vZGUub25BZGRFdmVudCh0aGlzLHRvKE0sWCksZWkoSi5tb2RpZmllcnN8fFtdKSkpfXJlbW92ZUV2ZW50TGlzdGVuZXIoTSxKLFgpe3N1cGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoTSxKLFgpLHRoaXMucGFnZU5vZGUmJiF0aGlzLnBhZ2VOb2RlLmlzVW5tb3VudGVkJiZ0aGlzLnBhZ2VOb2RlLm9uUmVtb3ZlRXZlbnQodGhpcyx0byhNLFgpKX1nZXRBdHRyaWJ1dGUoTSl7cmV0dXJuIE09PT1Xcj90aGlzLnN0eWxlOnRoaXMuYXR0cmlidXRlc1tNXX1yZW1vdmVBdHRyaWJ1dGUoTSl7TT09V3I/dGhpcy5zdHlsZT1udWxsOmRlbGV0ZSB0aGlzLmF0dHJpYnV0ZXNbTV0sdGhpcy5wYWdlTm9kZSYmIXRoaXMucGFnZU5vZGUuaXNVbm1vdW50ZWQmJnRoaXMucGFnZU5vZGUub25SZW1vdmVBdHRyaWJ1dGUodGhpcyxNKX1zZXRBdHRyaWJ1dGUoTSxKKXtNPT09V3I/dGhpcy5zdHlsZT1KOnRoaXMuYXR0cmlidXRlc1tNXT1KLHRoaXMucGFnZU5vZGUmJiF0aGlzLnBhZ2VOb2RlLmlzVW5tb3VudGVkJiZ0aGlzLnBhZ2VOb2RlLm9uU2V0QXR0cmlidXRlKHRoaXMsTSxKKX10b0pTT04oe2F0dHI6TSxub3JtYWxpemU6Sn09e30pe2xldHthdHRyaWJ1dGVzOlgsc3R5bGU6dWUsbGlzdGVuZXJzOnRuLF90ZXh0Ok1ufT10aGlzLGNuPXt9O09iamVjdC5rZXlzKFgpLmxlbmd0aCYmKGNuLmE9Sj9KKFgpOlgpO2xldCBuaT1PYmplY3Qua2V5cyh0bik7aWYobmkubGVuZ3RoKXtsZXQgbXIsZWE9e307bmkuZm9yRWFjaCh6bz0+e2xldCB0YT10blt6b107aWYodGEubGVuZ3RoKXtsZXR7d3hzRXZlbnQ6Um8sbW9kaWZpZXJzOmJvfT10YVswXSxvbz1laShib3x8W10pO1JvPyhtcnx8KG1yPXt9KSxtclt6b109W0o/SihSbyk6Um8sb29dKTplYVt6b109b299fSksY24uZT1KP0ooZWEsITEpOmVhLG1yJiYoY24udz1KP0oobXIsITEpOm1yKX1yZXR1cm4gdWUhPT1udWxsJiYoY24ucz1KP0oodWUpOnVlKSxNfHwoY24uaT10aGlzLm5vZGVJZCxjbi5uPXRoaXMubm9kZU5hbWUpLE1uIT09bnVsbCYmKGNuLnQ9Sj9KKE1uKTpNbiksY259fWNsYXNzIE5vIGV4dGVuZHMgQ2l7Y29uc3RydWN0b3IoTSxKKXtzdXBlcihDciwiI2NvbW1lbnQiLEopO3RoaXMuX3RleHQ9IiJ9dG9KU09OKE09e30pe3JldHVybiBNLmF0dHI/e306e2k6dGhpcy5ub2RlSWR9fX1jbGFzcyBPaSBleHRlbmRzIEJue2NvbnN0cnVjdG9yKE0sSil7c3VwZXIodWksTS50b1VwcGVyQ2FzZSgpLEopO3RoaXMudGFnTmFtZT10aGlzLm5vZGVOYW1lfX1jbGFzcyBVdCBleHRlbmRzIE9pe2dldCB2YWx1ZSgpe3JldHVybiB0aGlzLmdldEF0dHJpYnV0ZSgidmFsdWUiKX1zZXQgdmFsdWUoTSl7dGhpcy5zZXRBdHRyaWJ1dGUoInZhbHVlIixNKX19Y2xhc3MgZmkgZXh0ZW5kcyBVdHt9Y2xhc3MgZGkgZXh0ZW5kcyBCbntjb25zdHJ1Y3RvcihNLEope3N1cGVyKHFuLCIjdGV4dCIsSik7dGhpcy5fdGV4dD1NfWdldCBub2RlVmFsdWUoKXtyZXR1cm4gdGhpcy5fdGV4dHx8IiJ9c2V0IG5vZGVWYWx1ZShNKXt0aGlzLl90ZXh0PU0sdGhpcy5wYWdlTm9kZSYmIXRoaXMucGFnZU5vZGUuaXNVbm1vdW50ZWQmJnRoaXMucGFnZU5vZGUub25Ob2RlVmFsdWUodGhpcyxNKX19bGV0IEt0PXtBRDpbImRhdGEiXSwiQUQtRFJBVyI6WyJkYXRhIl0sIkxJVkUtUExBWUVSIjpbInBpY3R1cmUtaW4tcGljdHVyZS1tb2RlIl0sTUFQOlsibWFya2VycyIsInBvbHlsaW5lIiwiY2lyY2xlcyIsImNvbnRyb2xzIiwiaW5jbHVkZS1wb2ludHMiLCJwb2x5Z29ucyJdLFBJQ0tFUjpbInJhbmdlIiwidmFsdWUiXSwiUElDS0VSLVZJRVciOlsidmFsdWUiXSwiUklDSC1URVhUIjpbIm5vZGVzIl0sVklERU86WyJkYW5tdS1saXN0IiwiaGVhZGVyIl0sIldFQi1WSUVXIjpbIndlYnZpZXctc3R5bGVzIl19LFduPVsiYW5pbWF0aW9uIl0sT3I9KEgsTSk9PntpZihXbi5pbmRleE9mKE0pPi0xKXJldHVybiEwO2xldCBKPUt0W0gubm9kZU5hbWVdO3JldHVybiEhKEomJkouaW5kZXhPZihNKT4tMSl9LEluPTEsVGk9Mixrbz0zLGhpPTQsbm89NSxRbz02LFVpPTcsS249OCxwcj05LEpuPTEwLE1yPTEyLFRyPTE1LEhpPTIwO2Z1bmN0aW9uIHRpKEgsTSx7Y2xlYXJUaW1lb3V0Okosc2V0VGltZW91dDpYfSl7bGV0IHVlLHRuPWZ1bmN0aW9uKCl7Sih1ZSksdWU9WCgoKT0+SC5hcHBseSh0aGlzLGFyZ3VtZW50cyksTSl9O3JldHVybiB0bi5jYW5jZWw9ZnVuY3Rpb24oKXtKKHVlKX0sdG59Y2xhc3MgdnJ7Y29uc3RydWN0b3IoTSxKKXt0aGlzLmlkPU0sdGhpcy5saXN0ZW5lcj17fSx0aGlzLmVtaXRDYWNoZT17fSxKJiZPYmplY3Qua2V5cyhKKS5mb3JFYWNoKFg9Pnt0aGlzLm9uKFgsSltYXSl9KX1lbWl0KE0sLi4uSil7bGV0IFg9dGhpcy5saXN0ZW5lcltNXTtpZighWClyZXR1cm4odGhpcy5lbWl0Q2FjaGVbTV18fCh0aGlzLmVtaXRDYWNoZVtNXT1bXSkpLnB1c2goSik7WC5mb3JFYWNoKHVlPT57dWUuZm4uYXBwbHkodWUuZm4sSil9KSx0aGlzLmxpc3RlbmVyW01dPVguZmlsdGVyKHVlPT51ZS50eXBlIT09Im9uY2UiKX1vbihNLEope3RoaXMuX2FkZExpc3RlbmVyKE0sIm9uIixKKSx0aGlzLl9jbGVhckNhY2hlKE0pfW9uY2UoTSxKKXt0aGlzLl9hZGRMaXN0ZW5lcihNLCJvbmNlIixKKSx0aGlzLl9jbGVhckNhY2hlKE0pfW9mZihNLEope2xldCBYPXRoaXMubGlzdGVuZXJbTV07aWYoISFYKWlmKEopZm9yKGxldCB1ZT0wO3VlPFgubGVuZ3RoOylYW3VlXS5mbj09PUomJihYLnNwbGljZSh1ZSwxKSx1ZS0tKSx1ZSsrO2Vsc2UgZGVsZXRlIHRoaXMubGlzdGVuZXJbTV19X2NsZWFyQ2FjaGUoTSl7bGV0IEo9dGhpcy5lbWl0Q2FjaGVbTV07aWYoSilmb3IoO0oubGVuZ3RoPjA7KXRoaXMuZW1pdC5hcHBseSh0aGlzLFtNLC4uLkouc2hpZnQoKV0pfV9hZGRMaXN0ZW5lcihNLEosWCl7KHRoaXMubGlzdGVuZXJbTV18fCh0aGlzLmxpc3RlbmVyW01dPVtdKSkucHVzaCh7Zm46WCx0eXBlOkp9KX19bGV0IEdyPVtfbixVbixZLHRlLHNuLFpyLFVlLGl0LHZ0LHF0LG5uLGlyLFF0LFJuLGxyLExpLERpLHhuLHdyXSxQaT1bVW4sWV07ZnVuY3Rpb24gZ2koSCl7cmV0dXJuIFBpLmluZGV4T2YoSCk+LTF9ZnVuY3Rpb24gcGkoSCl7cmV0dXJuIEdyLmluZGV4T2YoSCk+LTF9bGV0IFlyPVtZLHRlLEVuLHluLGxuLGFuLGtuLF9uLFVuLG1uLHNuLGtyLFpyLFVlLGl0LHZ0LHF0LG5uLFF0LGlyLFJuLGxyLExpLERpLHhuLHdyXSx2aSxybz1bXTtmdW5jdGlvbiBqaShIKXtpZih2aSlyZXR1cm4gSCh2aSk7cm8ucHVzaChIKX1mdW5jdGlvbiBpbyhIKXt2aT1ILHJvLmZvckVhY2goTT0+TShIKSl9bGV0IHg9ZnVuY3Rpb24oKXt9O3gucHJvdG90eXBlPXtvbjpmdW5jdGlvbihILE0sSil7dmFyIFg9dGhpcy5lfHwodGhpcy5lPXt9KTtyZXR1cm4oWFtIXXx8KFhbSF09W10pKS5wdXNoKHtmbjpNLGN0eDpKfSksdGhpc30sb25jZTpmdW5jdGlvbihILE0sSil7dmFyIFg9dGhpcztmdW5jdGlvbiB1ZSgpe1gub2ZmKEgsdWUpLE0uYXBwbHkoSixhcmd1bWVudHMpfXJldHVybiB1ZS5fPU0sdGhpcy5vbihILHVlLEopfSxlbWl0OmZ1bmN0aW9uKEgpe3ZhciBNPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLEo9KCh0aGlzLmV8fCh0aGlzLmU9e30pKVtIXXx8W10pLnNsaWNlKCksWD0wLHVlPUoubGVuZ3RoO2ZvcihYO1g8dWU7WCsrKUpbWF0uZm4uYXBwbHkoSltYXS5jdHgsTSk7cmV0dXJuIHRoaXN9LG9mZjpmdW5jdGlvbihILE0pe3ZhciBKPXRoaXMuZXx8KHRoaXMuZT17fSksWD1KW0hdLHVlPVtdO2lmKFgmJk0pZm9yKHZhciB0bj0wLE1uPVgubGVuZ3RoO3RuPE1uO3RuKyspWFt0bl0uZm4hPT1NJiZYW3RuXS5mbi5fIT09TSYmdWUucHVzaChYW3RuXSk7cmV0dXJuIHVlLmxlbmd0aD9KW0hdPXVlOmRlbGV0ZSBKW0hdLHRoaXN9fTt2YXIgbmU9eCxkZT17aW52b2tlQXJyYXlGbnM6anIsT05fTE9BRDpVbixPTl9TSE9XOlksTElORUZFRUQ6QSxSRU5ERVJKU19NT0RVTEVTOnN0LFdYU19QUk9UT0NPTDpndCxmb3JtYXRMb2c6T24sV1hTX01PRFVMRVM6Vm4sT05fRVJST1I6eW4sVW5pTGlmZWN5Y2xlSG9va3M6WXIsaW52b2tlQ3JlYXRlVnVlQXBwSG9vazppbyxwYXJzZU5WdWVEYXRhc2V0OnpuLG9uY2U6U3IsSTE4Tl9KU09OX0RFTElNSVRFUlM6ZixFbWl0dGVyOm5lLGFkZExlYWRpbmdTbGFzaDpTaSxyZXNvbHZlQ29tcG9uZW50SW5zdGFuY2U6T28scmVtb3ZlTGVhZGluZ1NsYXNoOmNyLE9OX1JFU0laRTprcixPTl9BUFBfRU5URVJfRk9SRUdST1VORDpVcixPTl9BUFBfRU5URVJfQkFDS0dST1VORDpIcixPTl9ISURFOnRlLE9OX1BBR0VfU0NST0xMOlVlLE9OX1JFQUNIX0JPVFRPTTp2dCxTQ0hFTUVfUkU6eHQsREFUQV9SRTpwbixjYWNoZVN0cmluZ0Z1bmN0aW9uOlFpLHBhcnNlUXVlcnk6QXIsY2FsbE9wdGlvbnM6Z3IsT05fVU5IQU5ETEVfUkVKRUNUSU9OOmtuLE9OX1BBR0VfTk9UX0ZPVU5EOmFuLFBSSU1BUllfQ09MT1I6VCxnZXRMZW46ZW8sVEFCQkFSX0hFSUdIVDpTLE5BVkJBUl9IRUlHSFQ6ayxzb3J0T2JqZWN0OlBvLE9OX1RIRU1FX0NIQU5HRTpsbixPTl9LRVlCT0FSRF9IRUlHSFRfQ0hBTkdFOiRuLEJBQ0tHUk9VTkRfQ09MT1I6emUsT05fTkFWSUdBVElPTl9CQVJfQlVUVE9OX1RBUDpscixzdHJpbmdpZnlRdWVyeTpwbyxkZWJvdW5jZTp0aSxPTl9QVUxMX0RPV05fUkVGUkVTSDpxdCxPTl9OQVZJR0FUSU9OX0JBUl9TRUFSQ0hfSU5QVVRfQ0hBTkdFRDpEaSxPTl9OQVZJR0FUSU9OX0JBUl9TRUFSQ0hfSU5QVVRfQ09ORklSTUVEOnhuLE9OX05BVklHQVRJT05fQkFSX1NFQVJDSF9JTlBVVF9DTElDS0VEOkxpLE9OX05BVklHQVRJT05fQkFSX1NFQVJDSF9JTlBVVF9GT0NVU19DSEFOR0VEOndyLE9OX0JBQ0tfUFJFU1M6WnIsVW5pTm9kZTpDaSxOT0RFX1RZUEVfUEFHRTpBaSxBQ1RJT05fVFlQRV9QQUdFX0NSRUFURTpJbixBQ1RJT05fVFlQRV9QQUdFX0NSRUFURUQ6VGksQUNUSU9OX1RZUEVfUEFHRV9TQ1JPTEw6VHIsQUNUSU9OX1RZUEVfSU5TRVJUOmhpLEFDVElPTl9UWVBFX0NSRUFURTprbyxBQ1RJT05fVFlQRV9SRU1PVkU6bm8sQUNUSU9OX1RZUEVfQUREX0VWRU5UOktuLEFDVElPTl9UWVBFX0FERF9XWFNfRVZFTlQ6TXIsQUNUSU9OX1RZUEVfUkVNT1ZFX0VWRU5UOnByLEFDVElPTl9UWVBFX1NFVF9BVFRSSUJVVEU6UW8sQUNUSU9OX1RZUEVfUkVNT1ZFX0FUVFJJQlVURTpVaSxBQ1RJT05fVFlQRV9TRVRfVEVYVDpKbixPTl9SRUFEWTptbixPTl9VTkxPQUQ6c24sRXZlbnRDaGFubmVsOnZyLE9OX1JFQUNIX0JPVFRPTV9ESVNUQU5DRTpOLHBhcnNlVXJsOlhyLG9uQ3JlYXRlVnVlQXBwOmppLE9OX1RBQl9JVEVNX1RBUDppdCxPTl9MQVVOQ0g6RW4sQUNUSU9OX1RZUEVfRVZFTlQ6SGksY3JlYXRlVW5pRXZlbnQ6eHIsT05fV1hTX0lOVk9LRV9DQUxMX01FVEhPRDpaaSxXRUJfSU5WT0tFX0FQUFNFUlZJQ0U6Qixpc1Jvb3RIb29rOnBpLGlzUm9vdEltbWVkaWF0ZUhvb2s6Z2ksVW5pSW5wdXRFbGVtZW50OlV0LFVuaVRleHRBcmVhRWxlbWVudDpmaSxVbmlFbGVtZW50Ok9pLFVuaVRleHROb2RlOmRpLFVuaUNvbW1lbnROb2RlOk5vLGZvcmNlUGF0Y2hQcm9wOk9yLHJlc29sdmVPd25lckVsOmhyLEFUVFJfVl9PV05FUl9JRDpCcixBVFRSX1ZfUkVOREVSSlM6SG4sSlNPTl9QUk9UT0NPTDp2bn07cmV0dXJuIGRlfShnKTtyZXR1cm4gbH12YXIgcDE9MTtmdW5jdGlvbiBFcCgpe3JldHVybihwMSsrKS50b1N0cmluZygpfXZhciBvZj1nPT5nJiZKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGcpKXx8ZztmdW5jdGlvbiBnYyhnKXtsZXQgbD1YYShnKTtyZXR1cm4gbC5zdWJzdHJpbmcoOCxsLmxlbmd0aC0xKX1mdW5jdGlvbiBhZihnKXtpZighRm4oYnRvYSkpcmV0dXJuIiI7bGV0IGw9QXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKG5ldyBVaW50OEFycmF5KGcpLF89PlN0cmluZy5mcm9tQ2hhckNvZGUoXykpLmpvaW4oIiIpO3JldHVybiBidG9hKGwpfWZ1bmN0aW9uIHBjKGcpe2lmKCFnfHx0eXBlb2YgZyE9Im9iamVjdCIpcmV0dXJuITA7Zm9yKGxldCBsIGluIGcpaWYoWHMoZyxsKSlyZXR1cm4hMTtyZXR1cm4hMH12YXIgaXU9WyJvZmYiLCJlcnJvciIsIndhcm4iLCJpbmZvIiwibG9nIiwiZGVidWciXSxvdT17fTtmdW5jdGlvbiB5cCgpe2l1LmZvckVhY2goZz0+e2xldCBsPWl1LmluZGV4T2YoZyk7b3VbZ109e30saXUuZm9yRWFjaChfPT57aXUuaW5kZXhPZihfKTw9bCYmKG91W2ddW19dPSEwKX0pfSl9ZnVuY3Rpb24gWW4oZyl7bGV0IGw9Z2xvYmFsLldYRW52aXJvbm1lbnQmJmdsb2JhbC5XWEVudmlyb25tZW50LmxvZ0xldmVsfHwibG9nIjtyZXR1cm4gb3VbbF0mJm91W2xdW2ddfWZ1bmN0aW9uIE1pKGcpe2dsb2JhbC5uYXRpdmVMb2coInd4SW50ZXJhY3Rpb25BbmFseXplcjogW2pzZm1dIitnLCJfX0RFQlVHIil9ZnVuY3Rpb24gd3AoZyxsLF8pe3JldHVybmAke2x9QCR7X30jJHtnfWB9dmFyIGF1PWNsYXNze2NvbnN0cnVjdG9yKGwpe3RoaXMuaW5zdGFuY2VJZD1TdHJpbmcobCksdGhpcy5sYXN0Q2FsbGJhY2tJZD0wLHRoaXMuY2FsbGJhY2tzPXt9LHRoaXMuaG9va3M9e319YWRkKGwpe3JldHVybiB0aGlzLmxhc3RDYWxsYmFja0lkKyssdGhpcy5jYWxsYmFja3NbdGhpcy5sYXN0Q2FsbGJhY2tJZF09bCx0aGlzLmxhc3RDYWxsYmFja0lkfXJlbW92ZShsKXtsZXQgXz10aGlzLmNhbGxiYWNrc1tsXTtyZXR1cm4gZGVsZXRlIHRoaXMuY2FsbGJhY2tzW2xdLF99cmVnaXN0ZXJIb29rKGwsXyxBLGspe2xldCBTPXdwKGwsXyxBKTt0aGlzLmhvb2tzW1NdJiZjb25zb2xlLndhcm4oYFtKUyBGcmFtZXdvcmtdIE92ZXJyaWRlIGFuIGV4aXN0aW5nIGNvbXBvbmVudCBob29rICIke1N9Ii5gKSx0aGlzLmhvb2tzW1NdPWt9dHJpZ2dlckhvb2sobCxfLEEsayl7bGV0IFM9d3AobCxfLEEpLE49dGhpcy5ob29rc1tTXTtpZighRm4oTikpcmV0dXJuIGNvbnNvbGUuZXJyb3IoYFtKUyBGcmFtZXdvcmtdIEludmFsaWQgaG9vayBmdW5jdGlvbiB0eXBlICgke3R5cGVvZiBOfSkgb24gIiR7U30iLmApLG51bGw7bGV0IGY9bnVsbDt0cnl7Zj1OLmFwcGx5KG51bGwsa3x8W10pfWNhdGNoKFQpe3Rocm93IGNvbnNvbGUuZXJyb3IoYFtKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byBleGVjdXRlIHRoZSBob29rIGZ1bmN0aW9uIG9uICIke1N9Ii5gKSxUfXJldHVybiBmfWNvbnN1bWUobCxfLEEpe2xldCBrPXRoaXMuY2FsbGJhY2tzW2xdO2lmKCh0eXBlb2YgQT09InVuZGVmaW5lZCJ8fEE9PT0hMSkmJmRlbGV0ZSB0aGlzLmNhbGxiYWNrc1tsXSxGbihrKSl0cnl7cmV0dXJuIGsuY2FsbChudWxsLF8sQSl9Y2F0Y2goUyl7dGhyb3cgY29uc29sZS5lcnJvcihgW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIGV4ZWN1dGUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uOgogJHtTLnRvU3RyaW5nKCl9YCksU31yZXR1cm4gbmV3IEVycm9yKGBpbnZhbGlkIGNhbGxiYWNrIGlkICIke2x9ImApfWNsb3NlKCl7dGhpcy5jYWxsYmFja3M9e30sdGhpcy5ob29rcz17fX19O3ZhciBzdT17fTtmdW5jdGlvbiBTcChnLGwpe2cmJihzdVtnXT1sKX1mdW5jdGlvbiBRYShnKXtyZXR1cm4gc3VbZ119ZnVuY3Rpb24gQXAoZyl7ZGVsZXRlIHN1W2ddfWZ1bmN0aW9uIE5yKGcpe2lmKGcpe2xldCBsPXN1W2ddO2lmKGwmJmwudGFza0NlbnRlcilyZXR1cm4gbC50YXNrQ2VudGVyfXJldHVybiBudWxsfWZ1bmN0aW9uIHYxKGcpe2cuY2FsY0NsYXNzTGlzdCYmZy5jYWxjQ2xhc3NMaXN0KCl9ZnVuY3Rpb24gc2YoZyxsLF8pe2xldHtkb2N1bWVudEVsZW1lbnQ6QX09ZztpZihBLnB1cmVDaGlsZHJlbi5sZW5ndGg+MHx8bC5wYXJlbnROb2RlKXJldHVybjtsZXQgaz1BLmNoaWxkcmVuLFM9Xz9rLmluZGV4T2YoXyk6LTE7UzwwP2sucHVzaChsKTprLnNwbGljZShTLDAsbCksbC5ub2RlVHlwZT09PTE/KGwucm9sZT09PSJib2R5Ij8obC5kb2NJZD1nLmlkLGwub3duZXJEb2N1bWVudD1nLGwucGFyZW50Tm9kZT1BLFFzKGwsQSkpOihsLmNoaWxkcmVuLmZvckVhY2goTj0+e04ucGFyZW50Tm9kZT1sfSksbGYoZyxsKSxRcyhsLEEpLGRlbGV0ZSBnLm5vZGVNYXBbbC5ub2RlSWRdKSxBLnB1cmVDaGlsZHJlbi5wdXNoKGwpLG0xKGcsbCkpOihsLnBhcmVudE5vZGU9QSxnLm5vZGVNYXBbbC5yZWZdPWwpfWZ1bmN0aW9uIG0xKGcsbCl7bGV0IF89bC50b0pTT04oKTtnJiZnLnRhc2tDZW50ZXImJkZuKGcudGFza0NlbnRlci5zZW5kKSYmZy50YXNrQ2VudGVyLnNlbmQoImRvbSIse2FjdGlvbjoiY3JlYXRlQm9keSJ9LFtfXSl9ZnVuY3Rpb24gbGYoZyxsKXtsLnJvbGU9ImJvZHkiLGwuZGVwdGg9MSxkZWxldGUgZy5ub2RlTWFwW2wubm9kZUlkXSxsLnJlZj0iX3Jvb3QiLGcubm9kZU1hcC5fcm9vdD1sLGcuYm9keT1sfWZ1bmN0aW9uIFFzKGcsbCl7Zy5wYXJlbnROb2RlPWwsdjEoZyksbC5kb2NJZCYmKGcuZG9jSWQ9bC5kb2NJZCxnLm93bmVyRG9jdW1lbnQ9bC5vd25lckRvY3VtZW50LGcub3duZXJEb2N1bWVudC5ub2RlTWFwW2cubm9kZUlkXT1nLGcuZGVwdGg9bC5kZXB0aCsxKSxnLmNoaWxkcmVuLmZvckVhY2goXz0+e1FzKF8sZyl9KX1mdW5jdGlvbiBjZihnKXtmb3IoO2c7KXtpZihnLm5vZGVUeXBlPT09MSlyZXR1cm4gZztnPWcubmV4dFNpYmxpbmd9fWZ1bmN0aW9uIHVmKGcpe2Zvcig7Zzspe2lmKGcubm9kZVR5cGU9PT0xKXJldHVybiBnO2c9Zy5wcmV2aW91c1NpYmxpbmd9fWZ1bmN0aW9uIGVsKGcsbCxfLEE9ITEpe188MCYmKF89MCk7bGV0IGs9bFtfLTFdLFM9bFtfXTtyZXR1cm4gbC5zcGxpY2UoXywwLGcpLEEmJihrJiYoay5uZXh0U2libGluZz1nKSxnLnByZXZpb3VzU2libGluZz1rLGcubmV4dFNpYmxpbmc9UyxTJiYoUy5wcmV2aW91c1NpYmxpbmc9ZykpLF99ZnVuY3Rpb24gdGwoZyxsLF8sQT0hMSl7bGV0IGs9bC5pbmRleE9mKGcpO2lmKGs8MClyZXR1cm4tMTtpZihBKXtsZXQgVD1sW2stMV0semU9bFtrKzFdO1QmJihULm5leHRTaWJsaW5nPXplKSx6ZSYmKHplLnByZXZpb3VzU2libGluZz1UKX1sLnNwbGljZShrLDEpO2xldCBTPV87azw9XyYmKFM9Xy0xKTtsZXQgTj1sW1MtMV0sZj1sW1NdO3JldHVybiBsLnNwbGljZShTLDAsZyksQSYmKE4mJihOLm5leHRTaWJsaW5nPWcpLGcucHJldmlvdXNTaWJsaW5nPU4sZy5uZXh0U2libGluZz1mLGYmJihmLnByZXZpb3VzU2libGluZz1nKSksaz09PVM/LTE6X31mdW5jdGlvbiBmZihnLGwsXz0hMSl7bGV0IEE9bC5pbmRleE9mKGcpO2lmKCEoQTwwKSl7aWYoXyl7bGV0IGs9bFtBLTFdLFM9bFtBKzFdO2smJihrLm5leHRTaWJsaW5nPVMpLFMmJihTLnByZXZpb3VzU2libGluZz1rKX1sLnNwbGljZShBLDEpfX12YXIgbmw9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmRlcHRoPTA7dGhpcy5ub2RlSWQ9RXAoKSx0aGlzLnJlZj10aGlzLm5vZGVJZCx0aGlzLmNoaWxkcmVuPVtdLHRoaXMucHVyZUNoaWxkcmVuPVtdLHRoaXMucGFyZW50Tm9kZT1udWxsLHRoaXMubmV4dFNpYmxpbmc9bnVsbCx0aGlzLnByZXZpb3VzU2libGluZz1udWxsfWRlc3Ryb3koKXtsZXQgbD1RYSh0aGlzLmRvY0lkKTtsJiYoZGVsZXRlIHRoaXMuZG9jSWQsZGVsZXRlIGwubm9kZU1hcFt0aGlzLm5vZGVJZF0pLHRoaXMuY2hpbGRyZW4uZm9yRWFjaChfPT57Xy5kZXN0cm95KCl9KX19O3ZhciBDcD17fTtmdW5jdGlvbiBkZihnLGwpe2lmKCF5aShsKXx8IWwubGVuZ3RoKXJldHVybjtjbGFzcyBfIGV4dGVuZHMgSml7fWwuZm9yRWFjaChBPT57Xy5wcm90b3R5cGVbQV09ZnVuY3Rpb24oLi4uayl7bGV0IFM9TnIodGhpcy5kb2NJZCk7aWYoUylyZXR1cm4gUy5zZW5kKCJjb21wb25lbnQiLHtyZWY6dGhpcy5yZWYsY29tcG9uZW50OmcsbWV0aG9kOkF9LGspfX0pLENwW2ddPV99ZnVuY3Rpb24gT3AoZyl7cmV0dXJuIENwW2ddfWZ1bmN0aW9uIHlyKGcsbCxfLEEsayl7cmV0dXJue3R5cGU6ImRlY2wiLHByb3A6Zyx2YWx1ZTpsKyhfPyIgIWltcG9ydGFudCI6IiIpLHJhd3M6QSxzb3VyY2U6a319dmFyIF8xPSJiYWNrZ3JvdW5kQ29sb3IiLGIxPSJiYWNrZ3JvdW5kSW1hZ2UiLEUxPWc9PntsZXR7dmFsdWU6bCxpbXBvcnRhbnQ6XyxyYXdzOkEsc291cmNlOmt9PWc7cmV0dXJuL14jP1xTKyQvLnRlc3QobCl8fC9ecmdiYT8oLispJC8udGVzdChsKT9beXIoXzEsbCxfLEEsayldOi9ebGluZWFyLWdyYWRpZW50KC4rKSQvLnRlc3QobCk/W3lyKGIxLGwsXyxBLGspXTpbZ119LHkxPSJXaWR0aCIsdzE9IlN0eWxlIixTMT0iQ29sb3IiLHZjPWc9PntsZXR7cHJvcDpsLHZhbHVlOl8saW1wb3J0YW50OkEscmF3czprLHNvdXJjZTpTfT1nLE49Xy5yZXBsYWNlKC9ccyosXHMqL2csIiwiKS5zcGxpdCgvXHMrLyksZj1bL15bXGRcLl0rXFMqJC8sL14oc29saWR8ZGFzaGVkfGRvdHRlZCkkLywvXFMrL10ubWFwKFQ9PntsZXQgemU9Ti5maW5kSW5kZXgoeHQ9PlQudGVzdCh4dCkpO3JldHVybiB6ZTwwP251bGw6Ti5zcGxpY2UoemUsMSlbMF19KTtyZXR1cm4gTi5sZW5ndGg/W2ddOlt5cihsK3kxLChmWzBdfHwiMCIpLnRyaW0oKSxBLGssUykseXIobCt3MSwoZlsxXXx8InNvbGlkIikudHJpbSgpLEEsayxTKSx5cihsK1MxLChmWzJdfHwiIzAwMDAwMCIpLnRyaW0oKSxBLGssUyldfSxBMT0iYm9yZGVyVG9wIixDMT0iYm9yZGVyUmlnaHQiLE8xPSJib3JkZXJCb3R0b20iLFQxPSJib3JkZXJMZWZ0IixoZj1nPT57bGV0e3Byb3A6bCx2YWx1ZTpfLGltcG9ydGFudDpBLHJhd3M6ayxzb3VyY2U6U309ZyxOPXJmKGwpLnNwbGl0KCItIilbMV07Tj1ydShOKTtsZXQgZj1fLnJlcGxhY2UoL1xzKixccyovZywiLCIpLnNwbGl0KC9ccysvKTtzd2l0Y2goZi5sZW5ndGgpe2Nhc2UgMTpyZXR1cm5bZ107Y2FzZSAyOmYucHVzaChmWzBdLGZbMV0pO2JyZWFrO2Nhc2UgMzpmLnB1c2goZlsxXSk7YnJlYWt9cmV0dXJuW3lyKEExK04sZlswXSxBLGssUykseXIoQzErTixmWzFdLEEsayxTKSx5cihPMStOLGZbMl0sQSxrLFMpLHlyKFQxK04sZlszXSxBLGssUyldfSxQMT0iYm9yZGVyVG9wTGVmdFJhZGl1cyIsSTE9ImJvcmRlclRvcFJpZ2h0UmFkaXVzIixOMT0iYm9yZGVyQm90dG9tUmlnaHRSYWRpdXMiLGsxPSJib3JkZXJCb3R0b21MZWZ0UmFkaXVzIixSMT1nPT57bGV0e3ZhbHVlOmwsaW1wb3J0YW50Ol8scmF3czpBLHNvdXJjZTprfT1nLFM9bC5zcGxpdCgvXHMrLyk7aWYobC5pbmNsdWRlcygiLyIpKXJldHVybltnXTtzd2l0Y2goUy5sZW5ndGgpe2Nhc2UgMTpyZXR1cm5bZ107Y2FzZSAyOlMucHVzaChTWzBdLFNbMV0pO2JyZWFrO2Nhc2UgMzpTLnB1c2goU1sxXSk7YnJlYWt9cmV0dXJuW3lyKFAxLFNbMF0sXyxBLGspLHlyKEkxLFNbMV0sXyxBLGspLHlyKE4xLFNbMl0sXyxBLGspLHlyKGsxLFNbM10sXyxBLGspXX0seDE9aGYsQjE9aGYsTTE9ImZsZXhEaXJlY3Rpb24iLEwxPSJmbGV4V3JhcCIsRDE9Zz0+e2xldHt2YWx1ZTpsLGltcG9ydGFudDpfLHJhd3M6QSxzb3VyY2U6a309ZyxTPWwuc3BsaXQoL1xzKy8pLE49Wy9eKGNvbHVtbnxjb2x1bW4tcmV2ZXJzZXxyb3d8cm93LXJldmVyc2UpJC8sL14obm93cmFwfHdyYXB8d3JhcC1yZXZlcnNlKSQvXS5tYXAoZj0+e2xldCBUPVMuZmluZEluZGV4KHplPT5mLnRlc3QoemUpKTtyZXR1cm4gVDwwP251bGw6Uy5zcGxpY2UoVCwxKVswXX0pO3JldHVybiBTLmxlbmd0aD9bZ106W3lyKE0xLE5bMF18fCJjb2x1bW4iLF8sQSxrKSx5cihMMSxOWzFdfHwibm93cmFwIixfLEEsayldfSxGMT0iVG9wIixWMT0iUmlnaHQiLCQxPSJCb3R0b20iLFUxPSJMZWZ0IixUcD1nPT5sPT57bGV0e3ZhbHVlOl8saW1wb3J0YW50OkEscmF3czprLHNvdXJjZTpTfT1sLE49Xy5zcGxpdCgvXHMrLyk7c3dpdGNoKE4ubGVuZ3RoKXtjYXNlIDE6Ti5wdXNoKE5bMF0sTlswXSxOWzBdKTticmVhaztjYXNlIDI6Ti5wdXNoKE5bMF0sTlsxXSk7YnJlYWs7Y2FzZSAzOk4ucHVzaChOWzFdKTticmVha31yZXR1cm5beXIoZytGMSxOWzBdLEEsayxTKSx5cihnK1YxLE5bMV0sQSxrLFMpLHlyKGcrJDEsTlsyXSxBLGssUykseXIoZytVMSxOWzNdLEEsayxTKV19LEgxPVRwKCJtYXJnaW4iKSxqMT1UcCgicGFkZGluZyIpLHoxPSJ0cmFuc2l0aW9uUHJvcGVydHkiLFcxPSJ0cmFuc2l0aW9uRHVyYXRpb24iLEcxPSJ0cmFuc2l0aW9uVGltaW5nRnVuY3Rpb24iLFkxPSJ0cmFuc2l0aW9uRGVsYXkiLHExPWc9PntsZXQgbD0vXihcUyopP1xzKihcZCpcLj9cZCsoPzptc3xzKT8pP1xzKihcUyopP1xzKihcZCpcLj9cZCsoPzptc3xzKT8pPyQvLHt2YWx1ZTpfLGltcG9ydGFudDpBLHJhd3M6ayxzb3VyY2U6U309ZyxOPVtdLGY9Xy5tYXRjaChsKTtyZXR1cm4gZiYmKGZbMV0mJk4ucHVzaCh5cih6MSxmWzFdLEEsayxTKSksZlsyXSYmTi5wdXNoKHlyKFcxLGZbMl0sQSxrLFMpKSxmWzNdJiZOLnB1c2goeXIoRzEsZlszXSxBLGssUykpLGZbNF0mJk4ucHVzaCh5cihZMSxmWzRdLEEsayxTKSkpLE59LFBwPXt0cmFuc2l0aW9uOnExLG1hcmdpbjpIMSxwYWRkaW5nOmoxLGJvcmRlcjp2YyxiYWNrZ3JvdW5kOkUxfTtKcihQcCx7Ym9yZGVyVG9wOnZjLGJvcmRlclJpZ2h0OnZjLGJvcmRlckJvdHRvbTp2Yyxib3JkZXJMZWZ0OnZjLGJvcmRlclN0eWxlOngxLGJvcmRlcldpZHRoOkIxLGJvcmRlckNvbG9yOmhmLGJvcmRlclJhZGl1czpSMSxmbGV4RmxvdzpEMX0pO3ZhciBJcD1TeW1ib2woImV4cGFuZGVkIiksTnA9e3Bvc3Rjc3NQbHVnaW46Im52dWU6ZXhwYW5kIixEZWNsYXJhdGlvbihnKXtpZihnW0lwXSlyZXR1cm47bGV0IGw9UHBbZy5wcm9wXTtpZihsKXtsZXQgXz1sKGcpO18ubGVuZ3RoPT09MSYmX1swXT09PWd8fGcucmVwbGFjZVdpdGgoXyl9Z1tJcF09ITB9fTt2YXIgSzE9TnAuRGVjbGFyYXRpb247ZnVuY3Rpb24gZ2YoZyxsKXtsZXQgXz1Kcih7cmVwbGFjZVdpdGgoayl7QT1rfX0sSjEoZyxsKSksQT1bX107cmV0dXJuIEsxKF8pLEF9ZnVuY3Rpb24gSjEoZyxsKXtsZXQgXz1sKyIiO3JldHVybiBfLmluY2x1ZGVzKCIhaW1wb3J0YW50Iik/e3Byb3A6Zyx2YWx1ZTpfLnJlcGxhY2UoL1xzKiFpbXBvcnRhbnQvLCIiKSxpbXBvcnRhbnQ6ITB9Ontwcm9wOmcsdmFsdWU6XyxpbXBvcnRhbnQ6ITF9fXZhciBaMT0idmlldyIsWDE9WyJjbGljayIsImxvbmdwcmVzcyIsInRvdWNoc3RhcnQiLCJ0b3VjaG1vdmUiLCJ0b3VjaGVuZCIsInBhbnN0YXJ0IiwicGFubW92ZSIsInBhbmVuZCIsImhvcml6b250YWxwYW4iLCJ2ZXJ0aWNhbHBhbiIsInN3aXBlIl07ZnVuY3Rpb24gcGYoZyxsKXtsZXQgXz1RYShnKTtfLm5vZGVNYXBbbC5ub2RlSWRdPWx9dmFyIHZmO2Z1bmN0aW9uIGtwKGcpe3ZmfHwodmY9Zyl9dmFyIEppPWNsYXNzIGV4dGVuZHMgbmx7Y29uc3RydWN0b3IobD1aMSxfPXt9LEEpe3N1cGVyKCk7bGV0IGs9T3AobCk7aWYoayYmIUEpcmV0dXJuIG5ldyBrKGwsXywhMCk7dGhpcy5ub2RlVHlwZT0xLHRoaXMudHlwZT1sLHRoaXMuYXR0cj1fLmF0dHJ8fHt9LHRoaXMuc3R5bGU9Xy5zdHlsZXx8e30sdGhpcy5jbGFzc1N0eWxlPV8uY2xhc3NTdHlsZXx8e30sdGhpcy5jbGFzc0xpc3Q9Xy5jbGFzc0xpc3R8fFtdLHRoaXMuc3R5bGVTaGVldD1fLnN0eWxlU2hlZXR8fHt9LHRoaXMuZXZlbnQ9e319YXBwZW5kQ2hpbGQobCl7aWYoIShsLnBhcmVudE5vZGUmJmwucGFyZW50Tm9kZSE9PXRoaXMpKXtpZihsLnBhcmVudE5vZGUpe2lmKFluKCJkZWJ1ZyIpJiZNaShgW2FwcGVuZENoaWxkXSgke3RoaXMuZG9jSWR9LCR7bC50eXBlfSwke2wucmVmfSkgTW92ZSA8JHtsLnR5cGV9PiB0byAke3RoaXMuY2hpbGRyZW4ubGVuZ3RofSBvZiA8JHt0aGlzLnR5cGV9PiAoJHt0aGlzLnJlZn0pLmApLHRsKGwsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmxlbmd0aCwhMCksbC5ub2RlVHlwZT09PTEpe2xldCBfPXRsKGwsdGhpcy5wdXJlQ2hpbGRyZW4sdGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoKSxBPU5yKHRoaXMuZG9jSWQpO2lmKEEmJl8+PTApcmV0dXJuIEEuc2VuZCgiZG9tIix7YWN0aW9uOiJtb3ZlRWxlbWVudCJ9LFtsLnJlZix0aGlzLnJlZixfXSl9fWVsc2UgaWYoWW4oImRlYnVnIikmJk1pKGBbYXBwZW5kQ2hpbGRdKCR7dGhpcy5kb2NJZH0sJHtsLnR5cGV9LCR7bC5yZWZ9KSBBcHBlbmQgPCR7bC50eXBlfT4gdG8gPCR7dGhpcy50eXBlfT4gKCR7dGhpcy5yZWZ9KS5gKSxRcyhsLHRoaXMpLGVsKGwsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmxlbmd0aCwhMCksdGhpcy5kb2NJZCYmcGYodGhpcy5kb2NJZCxsKSxsLm5vZGVUeXBlPT09MSl7ZWwobCx0aGlzLnB1cmVDaGlsZHJlbix0aGlzLnB1cmVDaGlsZHJlbi5sZW5ndGgpO2xldCBfPU5yKHRoaXMuZG9jSWQpO2lmKF8pcmV0dXJuIF8uc2VuZCgiZG9tIix7YWN0aW9uOiJhZGRFbGVtZW50In0sW3RoaXMucmVmLGwudG9KU09OKCksLTFdKX19fWluc2VydEJlZm9yZShsLF8pe2lmKCEobC5wYXJlbnROb2RlJiZsLnBhcmVudE5vZGUhPT10aGlzKSYmIShsPT09X3x8bC5uZXh0U2libGluZyYmbC5uZXh0U2libGluZz09PV8pKXtpZihsLnBhcmVudE5vZGUpe2lmKHRsKGwsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmluZGV4T2YoXyksITApLGwubm9kZVR5cGU9PT0xKXtsZXQgQT1jZihfKSxrPXRsKGwsdGhpcy5wdXJlQ2hpbGRyZW4sQT90aGlzLnB1cmVDaGlsZHJlbi5pbmRleE9mKEEpOnRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aCksUz1Ocih0aGlzLmRvY0lkKTtpZihTJiZrPj0wKXJldHVybiBTLnNlbmQoImRvbSIse2FjdGlvbjoibW92ZUVsZW1lbnQifSxbbC5yZWYsdGhpcy5yZWYsa10pfX1lbHNlIGlmKFluKCJkZWJ1ZyIpJiZNaShgW2luc2VydEJlZm9yZV0oJHt0aGlzLmRvY0lkfSwke2wudHlwZX0sJHtsLnJlZn0pIEluc2VydCA8JHtsLnR5cGV9PiB0byA8JHt0aGlzLnR5cGV9PiAoJHt0aGlzLnJlZn0pLCBiZWZvcmUgKCR7Xy5yZWZ9KS5gKSxRcyhsLHRoaXMpLGVsKGwsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmluZGV4T2YoXyksITApLHRoaXMuZG9jSWQmJnBmKHRoaXMuZG9jSWQsbCksbC5ub2RlVHlwZT09PTEpe2xldCBBPWNmKF8pLGs9ZWwobCx0aGlzLnB1cmVDaGlsZHJlbixBP3RoaXMucHVyZUNoaWxkcmVuLmluZGV4T2YoQSk6dGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoKSxTPU5yKHRoaXMuZG9jSWQpO2lmKFMpcmV0dXJuIFMuc2VuZCgiZG9tIix7YWN0aW9uOiJhZGRFbGVtZW50In0sW3RoaXMucmVmLGwudG9KU09OKCksa10pfX19aW5zZXJ0QWZ0ZXIobCxfKXtpZighKGwucGFyZW50Tm9kZSYmbC5wYXJlbnROb2RlIT09dGhpcykmJiEobD09PV98fGwucHJldmlvdXNTaWJsaW5nJiZsLnByZXZpb3VzU2libGluZz09PV8pKXtpZihsLnBhcmVudE5vZGUpe2lmKHRsKGwsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmluZGV4T2YoXykrMSwhMCksbC5ub2RlVHlwZT09PTEpe2xldCBBPXRsKGwsdGhpcy5wdXJlQ2hpbGRyZW4sdGhpcy5wdXJlQ2hpbGRyZW4uaW5kZXhPZih1ZihfKSkrMSksaz1Ocih0aGlzLmRvY0lkKTtpZihrJiZBPj0wKXJldHVybiBrLnNlbmQoImRvbSIse2FjdGlvbjoibW92ZUVsZW1lbnQifSxbbC5yZWYsdGhpcy5yZWYsQV0pfX1lbHNlIGlmKFluKCJkZWJ1ZyIpJiZNaShgW2luc2VydEFmdGVyXSgke3RoaXMuZG9jSWR9LCR7bC50eXBlfSwke2wucmVmfSkgSW5zZXJ0IDwke2wudHlwZX0+IHRvIDwke3RoaXMudHlwZX0+ICgke3RoaXMucmVmfSksIGFmdGVyICgke18ucmVmfSkuYCksUXMobCx0aGlzKSxlbChsLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5pbmRleE9mKF8pKzEsITApLHRoaXMuZG9jSWQmJnBmKHRoaXMuZG9jSWQsbCksbC5ub2RlVHlwZT09PTEpe2xldCBBPWVsKGwsdGhpcy5wdXJlQ2hpbGRyZW4sdGhpcy5wdXJlQ2hpbGRyZW4uaW5kZXhPZih1ZihfKSkrMSksaz1Ocih0aGlzLmRvY0lkKTtpZihrKXJldHVybiBrLnNlbmQoImRvbSIse2FjdGlvbjoiYWRkRWxlbWVudCJ9LFt0aGlzLnJlZixsLnRvSlNPTigpLEFdKX19fXJlbW92ZUNoaWxkKGwsXyl7aWYobC5wYXJlbnROb2RlJiYoZmYobCx0aGlzLmNoaWxkcmVuLCEwKSxsLm5vZGVUeXBlPT09MSkpe1luKCJkZWJ1ZyIpJiZNaShgW3JlbW92ZUNoaWxkXSgke3RoaXMuZG9jSWR9LCR7bC50eXBlfSwke2wucmVmfSkgUmVtb3ZlIDwke2wudHlwZX0+IGZyb20gPCR7dGhpcy50eXBlfT4gKCR7dGhpcy5yZWZ9KS5gKSxmZihsLHRoaXMucHVyZUNoaWxkcmVuKTtsZXQgQT1Ocih0aGlzLmRvY0lkKTtBJiZBLnNlbmQoImRvbSIse2FjdGlvbjoicmVtb3ZlRWxlbWVudCJ9LFtsLnJlZl0pfV98fGwuZGVzdHJveSgpfWNsZWFyKCl7bGV0IGw9TnIodGhpcy5kb2NJZCk7bCYmdGhpcy5wdXJlQ2hpbGRyZW4uZm9yRWFjaChfPT57bC5zZW5kKCJkb20iLHthY3Rpb246InJlbW92ZUVsZW1lbnQifSxbXy5yZWZdKX0pLHRoaXMuY2hpbGRyZW4uZm9yRWFjaChfPT57Xy5kZXN0cm95KCl9KSx0aGlzLmNoaWxkcmVuLmxlbmd0aD0wLHRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aD0wfXNldEF0dHIobCxfLEEpe2lmKHRoaXMuYXR0cltsXT09PV8mJkEhPT0hMSlyZXR1cm47dGhpcy5hdHRyW2xdPV87bGV0IGs9TnIodGhpcy5kb2NJZCk7IUEmJmsmJmsuc2VuZCgiZG9tIix7YWN0aW9uOiJ1cGRhdGVBdHRycyJ9LFt0aGlzLnJlZix7W2xdOl99XSl9c2V0QXR0cnMobCxfKXtpZihwYyhsKSlyZXR1cm47bGV0IEE9e307Zm9yKGxldCBrIGluIGwpdGhpcy5hdHRyW2tdIT09bFtrXSYmKHRoaXMuYXR0cltrXT1sW2tdLEFba109bFtrXSk7aWYoIXBjKEEpKXtsZXQgaz1Ocih0aGlzLmRvY0lkKTshXyYmayYmay5zZW5kKCJkb20iLHthY3Rpb246InVwZGF0ZUF0dHJzIn0sW3RoaXMucmVmLEFdKX19c2V0U3R5bGUobCxfLEEpe2dmKGwsXykuZm9yRWFjaCgoe3Byb3A6ayx2YWx1ZTpTfSk9PntpZih0aGlzLnN0eWxlW2tdPT09UyYmQSE9PSExKXJldHVybjt0aGlzLnN0eWxlW2tdPVM7bGV0IE49TnIodGhpcy5kb2NJZCk7IUEmJk4mJk4uc2VuZCgiZG9tIix7YWN0aW9uOiJ1cGRhdGVTdHlsZSJ9LFt0aGlzLnJlZix7W2tdOlN9XSl9KX1zZXRTdHlsZXMobCxfKXtpZihwYyhsKSlyZXR1cm47bGV0IEE9e307Zm9yKGxldCBrIGluIGwpZ2YoayxsW2tdKS5mb3JFYWNoKCh7cHJvcDpTLHZhbHVlOk59KT0+e3RoaXMuc3R5bGVbU10hPT1OJiYodGhpcy5zdHlsZVtTXT1OLEFbU109Til9KTtpZighcGMoQSkpe2xldCBrPU5yKHRoaXMuZG9jSWQpOyFfJiZrJiZrLnNlbmQoImRvbSIse2FjdGlvbjoidXBkYXRlU3R5bGUifSxbdGhpcy5yZWYsQV0pfX1zZXRDbGFzc1N0eWxlKGwpe2ZvcihsZXQgQSBpbiB0aGlzLmNsYXNzU3R5bGUpdGhpcy5jbGFzc1N0eWxlW0FdPSIiO0pyKHRoaXMuY2xhc3NTdHlsZSxsKTtsZXQgXz1Ocih0aGlzLmRvY0lkKTtfJiZfLnNlbmQoImRvbSIse2FjdGlvbjoidXBkYXRlU3R5bGUifSxbdGhpcy5yZWYsdGhpcy50b1N0eWxlKCldKX1zZXRDbGFzc0xpc3QobCl7bC5sZW5ndGg9PT10aGlzLmNsYXNzTGlzdC5sZW5ndGgmJmwuZmlsdGVyKF89PiF0aGlzLmNsYXNzTGlzdC5pbmNsdWRlcyhfKSkubGVuZ3RoPT09MHx8KHRoaXMuY2xhc3NMaXN0PWwsdGhpcy5wYXJlbnROb2RlJiZ0aGlzLmNhbGNDbGFzc0xpc3QoKSl9Y2FsY0NsYXNzTGlzdCgpe3RoaXMuc2V0Q2xhc3NTdHlsZSh2Zih0aGlzKSl9c2V0U3R5bGVTaGVldChsKXt0aGlzLnN0eWxlU2hlZXQ9bH1hZGRFdmVudChsLF8sQSl7aWYodGhpcy5ldmVudHx8KHRoaXMuZXZlbnQ9e30pLCF0aGlzLmV2ZW50W2xdKXtZbigiZGVidWciKSYmTWkoYFthZGRFdmVudF0oJHt0aGlzLmRvY0lkfSwke3RoaXMudHlwZX0sJHt0aGlzLnJlZn0pIEFkZCAiJHtsfSIgZXZlbnQgb24gPCR7dGhpcy50eXBlfT4gKCR7dGhpcy5yZWZ9KS5gKSx0aGlzLmV2ZW50W2xdPXtoYW5kbGVyOl8scGFyYW1zOkF9O2xldCBrPU5yKHRoaXMuZG9jSWQpO2smJmsuc2VuZCgiZG9tIix7YWN0aW9uOiJhZGRFdmVudCJ9LFt0aGlzLnJlZixsXSl9fXJlbW92ZUV2ZW50KGwpe2lmKHRoaXMuZXZlbnQmJnRoaXMuZXZlbnRbbF0pe1luKCJkZWJ1ZyIpJiZNaShgW3JlbW92ZUV2ZW50XSgke3RoaXMuZG9jSWR9LCR7dGhpcy50eXBlfSwke3RoaXMucmVmfSkgUmVtb3ZlICIke2x9IiBldmVudCBvbiA8JHt0aGlzLnR5cGV9PiAoJHt0aGlzLnJlZn0pLmApLGRlbGV0ZSB0aGlzLmV2ZW50W2xdO2xldCBfPU5yKHRoaXMuZG9jSWQpO18mJl8uc2VuZCgiZG9tIix7YWN0aW9uOiJyZW1vdmVFdmVudCJ9LFt0aGlzLnJlZixsXSl9fWZpcmVFdmVudChsLF8sQSxrKXtsZXQgUz1udWxsLE49ITEsZj10aGlzLmV2ZW50W2xdO2lmKGYmJl8pe1luKCJkZWJ1ZyIpJiZNaShgW2ZpcmVFdmVudF0oJHt0aGlzLmRvY0lkfSwke3RoaXMudHlwZX0sJHt0aGlzLnJlZn0pIEZpcmUgIiR7bH0iIGV2ZW50IG9uIDwke3RoaXMudHlwZX0+ICgke3RoaXMucmVmfSkuYCk7bGV0IFQ9Zi5oYW5kbGVyO18uc3RvcFByb3BhZ2F0aW9uPSgpPT57Tj0hMH0sXy5wcmV2ZW50RGVmYXVsdD0oKT0+e307dHJ5e2smJmsucGFyYW1zP1M9VC5jYWxsKHRoaXMsLi4uay5wYXJhbXMsXyk6Uz1ULmNhbGwodGhpcyxfKX1jYXRjaCh6ZSl7dGhyb3cgY29uc29sZS5lcnJvcihgW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIGludm9rZSB0aGUgZXZlbnQgaGFuZGxlciBvZiAiJHtsfSIgb24gJHt0aGlzLnR5cGV9ICgke3RoaXMucmVmfSk6CiAke3plLnRvU3RyaW5nKCl9YCksemV9fXJldHVybiFOJiZBJiZYMS5pbmRleE9mKGwpIT09LTEmJnRoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmZpcmVFdmVudCYmKF8uY3VycmVudFRhcmdldD10aGlzLnBhcmVudE5vZGUsdGhpcy5wYXJlbnROb2RlLmZpcmVFdmVudChsLF8sQSkpLFN9dG9TdHlsZSgpe3JldHVybiBKcih7fSx0aGlzLmNsYXNzU3R5bGUsdGhpcy5zdHlsZSl9dG9KU09OKGw9ITEpe2xldCBfPXtyZWY6dGhpcy5yZWYudG9TdHJpbmcoKSx0eXBlOnRoaXMudHlwZSxhdHRyOnRoaXMuYXR0cixzdHlsZTp0aGlzLnRvU3R5bGUoKX0sQT1bXTtmb3IobGV0IGsgaW4gdGhpcy5ldmVudCl7bGV0e3BhcmFtczpTfT10aGlzLmV2ZW50W2tdO1M/QS5wdXNoKHt0eXBlOmsscGFyYW1zOlN9KTpBLnB1c2goayl9cmV0dXJuIEEubGVuZ3RoJiYoXy5ldmVudD1BKSwhbCYmdGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoJiYoXy5jaGlsZHJlbj10aGlzLnB1cmVDaGlsZHJlbi5tYXAoaz0+ay50b0pTT04oKSkpLF99dG9TdHJpbmcoKXtyZXR1cm4iPCIrdGhpcy50eXBlKyIgYXR0cj0iK0pTT04uc3RyaW5naWZ5KHRoaXMuYXR0cikrIiBzdHlsZT0iK0pTT04uc3RyaW5naWZ5KHRoaXMudG9TdHlsZSgpKSsiPiIrdGhpcy5wdXJlQ2hpbGRyZW4ubWFwKGw9PmwudG9TdHJpbmcoKSkuam9pbigiIikrIjwvIit0aGlzLnR5cGUrIj4ifX07ZnVuY3Rpb24gUnAoZyl7bGV0IGw9ZyYmZy5fX3ZfcmF3O3JldHVybiBsP1JwKGwpOmd9ZnVuY3Rpb24geHAoZyl7bGV0IGw9Z2MoZyk7c3dpdGNoKGwpe2Nhc2UiVW5kZWZpbmVkIjpjYXNlIk51bGwiOnJldHVybiIiO2Nhc2UiUmVnRXhwIjpyZXR1cm4gZy50b1N0cmluZygpO2Nhc2UiRGF0ZSI6cmV0dXJuIGcudG9JU09TdHJpbmcoKTtjYXNlIk51bWJlciI6Y2FzZSJTdHJpbmciOmNhc2UiQm9vbGVhbiI6Y2FzZSJBcnJheSI6Y2FzZSJPYmplY3QiOnJldHVybiBScChnKTtjYXNlIkFycmF5QnVmZmVyIjpyZXR1cm57IkB0eXBlIjoiYmluYXJ5IixkYXRhVHlwZTpsLGJhc2U2NDphZihnKX07Y2FzZSJJbnQ4QXJyYXkiOmNhc2UiVWludDhBcnJheSI6Y2FzZSJVaW50OENsYW1wZWRBcnJheSI6Y2FzZSJJbnQxNkFycmF5IjpjYXNlIlVpbnQxNkFycmF5IjpjYXNlIkludDMyQXJyYXkiOmNhc2UiVWludDMyQXJyYXkiOmNhc2UiRmxvYXQzMkFycmF5IjpjYXNlIkZsb2F0NjRBcnJheSI6cmV0dXJueyJAdHlwZSI6ImJpbmFyeSIsZGF0YVR5cGU6bCxiYXNlNjQ6YWYoZy5idWZmZXIpfTtkZWZhdWx0OnJldHVybiBKU09OLnN0cmluZ2lmeShnKX19dmFyIGx1PWZ1bmN0aW9uKCl7fSxIbD1jbGFzc3tjb25zdHJ1Y3RvcihsLF8pe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpbnN0YW5jZUlkIix7ZW51bWVyYWJsZTohMCx2YWx1ZTpTdHJpbmcobCl9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiY2FsbGJhY2tNYW5hZ2VyIix7ZW51bWVyYWJsZTohMCx2YWx1ZTpuZXcgYXUobCl9KSxsdT1ffHxmdW5jdGlvbigpe319Y2FsbGJhY2sobCxfLEEpe3JldHVybiB0aGlzLmNhbGxiYWNrTWFuYWdlci5jb25zdW1lKGwsXyxBKX1yZWdpc3Rlckhvb2sobCxfLEEsayl7cmV0dXJuIHRoaXMuY2FsbGJhY2tNYW5hZ2VyLnJlZ2lzdGVySG9vayhsLF8sQSxrKX10cmlnZ2VySG9vayhsLF8sQSxrKXtyZXR1cm4gdGhpcy5jYWxsYmFja01hbmFnZXIudHJpZ2dlckhvb2sobCxfLEEsayl9dXBkYXRlRGF0YShsLF8sQSl7dGhpcy5zZW5kKCJtb2R1bGUiLHttb2R1bGU6ImRvbSIsbWV0aG9kOiJ1cGRhdGVDb21wb25lbnREYXRhIn0sW2wsXyxBXSl9ZGVzdHJveUNhbGxiYWNrKCl7cmV0dXJuIHRoaXMuY2FsbGJhY2tNYW5hZ2VyLmNsb3NlKCl9bm9ybWFsaXplKGwsXz0hMSl7bGV0IEE9Z2MobCk7aWYobCYmbCBpbnN0YW5jZW9mIEppKXJldHVybiBsLnJlZjtpZihsJiZsLiRlbCBpbnN0YW5jZW9mIEppKXJldHVybiBsLiRlbC5yZWY7aWYoQT09PSJGdW5jdGlvbiIpcmV0dXJuIHRoaXMuY2FsbGJhY2tNYW5hZ2VyLmFkZChsKS50b1N0cmluZygpO2lmKF8pe2lmKEE9PT0iT2JqZWN0Iil7bGV0IGs9e307Zm9yKGxldCBTIGluIGwpa1tTXT10aGlzLm5vcm1hbGl6ZShsW1NdLCEwKTtyZXR1cm4ga31pZihBPT09IkFycmF5IilyZXR1cm4gbC5tYXAoaz0+dGhpcy5ub3JtYWxpemUoaywhMCkpfXJldHVybiBsJiZsLnJlZiYmbFsiW1tWaXJ0dWFsRWxlbWVudF1dIl0/bC5yZWY6eHAobCl9c2VuZChsLF8sQSxrKXtsZXR7YWN0aW9uOlMsY29tcG9uZW50Ok4scmVmOmYsbW9kdWxlOlQsbWV0aG9kOnplfT1fO3N3aXRjaChBPUEubWFwKHh0PT50aGlzLm5vcm1hbGl6ZSh4dCxsIT09Im1vZHVsZSIpKSxnYyhrKT09PSJPYmplY3QiJiYoaz10aGlzLm5vcm1hbGl6ZShrLCEwKSksbCl7Y2FzZSJkb20iOnJldHVybiBZbigiZGVidWciKSYmTWkoYFt0YXNrXSgke3RoaXMuaW5zdGFuY2VJZH0sJHtsfSwke1N9KSAke0pTT04uc3RyaW5naWZ5KEEpfWApLHRoaXNbU10odGhpcy5pbnN0YW5jZUlkLEEpO2Nhc2UiY29tcG9uZW50IjpyZXR1cm4gdGhpcy5jb21wb25lbnRIYW5kbGVyKHRoaXMuaW5zdGFuY2VJZCxmLHplLEEsSnIoe2NvbXBvbmVudDpOfSxrKSk7ZGVmYXVsdDpyZXR1cm4gWW4oImRlYnVnIikmJk1pKGBbdGFza10oJHt0aGlzLmluc3RhbmNlSWR9LCR7VH0sJHt6ZX0pICR7SlNPTi5zdHJpbmdpZnkoQSl9YCksdGhpcy5tb2R1bGVIYW5kbGVyKHRoaXMuaW5zdGFuY2VJZCxULHplLEEsayl9fWNhbGxET00obCxfKXtyZXR1cm4gdGhpc1tsXSh0aGlzLmluc3RhbmNlSWQsXyl9Y2FsbENvbXBvbmVudChsLF8sQSxrKXtyZXR1cm4gdGhpcy5jb21wb25lbnRIYW5kbGVyKHRoaXMuaW5zdGFuY2VJZCxsLF8sQSxrKX1jYWxsTW9kdWxlKGwsXyxBLGspe3JldHVybiB0aGlzLm1vZHVsZUhhbmRsZXIodGhpcy5pbnN0YW5jZUlkLGwsXyxBLGspfX07ZnVuY3Rpb24gQnAoKXtsZXQgZz17Y3JlYXRlRmluaXNoOmdsb2JhbC5jYWxsQ3JlYXRlRmluaXNoLHVwZGF0ZUZpbmlzaDpnbG9iYWwuY2FsbFVwZGF0ZUZpbmlzaCxyZWZyZXNoRmluaXNoOmdsb2JhbC5jYWxsUmVmcmVzaEZpbmlzaCxjcmVhdGVCb2R5Omdsb2JhbC5jYWxsQ3JlYXRlQm9keSxhZGRFbGVtZW50Omdsb2JhbC5jYWxsQWRkRWxlbWVudCxyZW1vdmVFbGVtZW50Omdsb2JhbC5jYWxsUmVtb3ZlRWxlbWVudCxtb3ZlRWxlbWVudDpnbG9iYWwuY2FsbE1vdmVFbGVtZW50LHVwZGF0ZUF0dHJzOmdsb2JhbC5jYWxsVXBkYXRlQXR0cnMsdXBkYXRlU3R5bGU6Z2xvYmFsLmNhbGxVcGRhdGVTdHlsZSxhZGRFdmVudDpnbG9iYWwuY2FsbEFkZEV2ZW50LHJlbW92ZUV2ZW50Omdsb2JhbC5jYWxsUmVtb3ZlRXZlbnQsX191cGRhdGVDb21wb25lbnREYXRhOmdsb2JhbC5fX3VwZGF0ZUNvbXBvbmVudERhdGF9LGw9SGwucHJvdG90eXBlO2ZvcihsZXQgXyBpbiBnKXtsZXQgQT1nW19dO2xbX109QT8oayxTKT0+QShrLC4uLlMpOihrLFMpPT5sdShrLFt7bW9kdWxlOiJkb20iLG1ldGhvZDpfLGFyZ3M6U31dLCItMSIpfWwuY29tcG9uZW50SGFuZGxlcj1nbG9iYWwuY2FsbE5hdGl2ZUNvbXBvbmVudHx8KChfLEEsayxTLE4pPT5sdShfLFt7Y29tcG9uZW50Ok4uY29tcG9uZW50LHJlZjpBLG1ldGhvZDprLGFyZ3M6U31dKSksbC5tb2R1bGVIYW5kbGVyPWdsb2JhbC5jYWxsTmF0aXZlTW9kdWxlfHwoKF8sQSxrLFMpPT5sdShfLFt7bW9kdWxlOkEsbWV0aG9kOmssYXJnczpTfV0pKX1mdW5jdGlvbiBRMShnLGwsXyxBLGssUyl7bGV0IE49Zy5nZXRSZWYobCk7aWYoTilyZXR1cm4gZy5maXJlRXZlbnQoTixfLEEsayxTKTtpZihBKXJldHVybiBBLl9ub2RlSWQ9bCxnLmZpcmVFdmVudChnLmdldFJlZigiX2RvY3VtZW50RWxlbWVudCIpLF8sQSxrLFMpfWZ1bmN0aW9uIGVJKGcsbCxfLEEpe3JldHVybiBnLnRhc2tDZW50ZXIuY2FsbGJhY2sobCxfLEEpfWZ1bmN0aW9uIHRJKGcsbCxfLEEsayl7aWYoIWd8fCFnLnRhc2tDZW50ZXIpcmV0dXJuIGNvbnNvbGUuZXJyb3IoYFtKUyBGcmFtZXdvcmtdIENhbid0IGZpbmQgImRvY3VtZW50IiBvciAidGFza0NlbnRlciIuYCksbnVsbDtsZXQgUz1udWxsO3RyeXtTPWcudGFza0NlbnRlci50cmlnZ2VySG9vayhsLF8sQSxrKX1jYXRjaChOKXt0aHJvdyBjb25zb2xlLmVycm9yKGBbSlMgRnJhbWV3b3JrXSBGYWlsZWQgdG8gdHJpZ2dlciB0aGUgIiR7X31AJHtBfSIgaG9vayBvbiAke2x9LmApLE59cmV0dXJuIFN9ZnVuY3Rpb24gbWYoZyxsKXtsZXQgXz1RYShnKTtpZighXylyZXR1cm4gbmV3IEVycm9yKGBbSlMgRnJhbWV3b3JrXSBGYWlsZWQgdG8gcmVjZWl2ZVRhc2tzLCBpbnN0YW5jZSAoJHtnfSkgaXMgbm90IGF2YWlsYWJsZS5gKTtpZih5aShsKSlyZXR1cm4gbC5tYXAoQT0+e3N3aXRjaChBLm1ldGhvZCl7Y2FzZSJjYWxsYmFjayI6cmV0dXJuIGVJKF8sLi4uQS5hcmdzKTtjYXNlImZpcmVFdmVudFN5bmMiOmNhc2UiZmlyZUV2ZW50IjpyZXR1cm4gUTEoXywuLi5BLmFyZ3MpO2Nhc2UiY29tcG9uZW50SG9vayI6cmV0dXJuIHRJKF8sLi4uQS5hcmdzKX19KX12YXIgd3M9e307ZnVuY3Rpb24gTXAoZz17fSl7Zm9yKGxldCBsIGluIGcpWHMod3MsbCl8fCh3c1tsXT17fSksISF5aShnW2xdKSYmZ1tsXS5mb3JFYWNoKF89Pnt3aShfKT93c1tsXVtfXT0hMDpVbChfKSYmd2koXy5uYW1lKSYmKHdzW2xdW18ubmFtZV09Xy5hcmdzfHxbXSl9KX1mdW5jdGlvbiBjdShnLGwpe3JldHVybiB3aShsKT8hISh3c1tnXSYmd3NbZ11bbF0pOiEhd3NbZ119ZnVuY3Rpb24gTHAoZyl7cmV0dXJuIHdzW2ddfXZhciBfZj17fTtmdW5jdGlvbiBEcChnKXsheWkoZyl8fGcuZm9yRWFjaChsPT57IWx8fCh3aShsKT9fZltsXT0hMDpVbChsKSYmd2kobC50eXBlKSYmKF9mW2wudHlwZV09bCxkZihsLnR5cGUsbC5tZXRob2RzKSkpfSl9ZnVuY3Rpb24gYmYoZyl7cmV0dXJuISFfZltnXX12YXIgU3M9W107ZnVuY3Rpb24gdXUoZyxsKXtFZihnKT9jb25zb2xlLndhcm4oYFNlcnZpY2UgIiR7Z30iIGhhcyBiZWVuIHJlZ2lzdGVyZWQgYWxyZWFkeSFgKToobD1Kcih7fSxsKSxTcy5wdXNoKHtuYW1lOmcsb3B0aW9uczpsfSkpfWZ1bmN0aW9uIGZ1KGcpe1NzLnNvbWUoKGwsXyk9PntpZihsLm5hbWU9PT1nKXJldHVybiBTcy5zcGxpY2UoXywxKSwhMH0pfWZ1bmN0aW9uIEVmKGcpe3JldHVybiBuSShnKT49MH1mdW5jdGlvbiBuSShnKXtyZXR1cm4gU3MubWFwKGw9PmwubmFtZSkuaW5kZXhPZihnKX1mdW5jdGlvbiBySShnKXtyZXR1cm4gbD0+e2xldCBfPWV1KGcsbCkse2NyZWF0ZUFwcDpBfT1fO18uY3JlYXRlVnVlQXBwPV8uY3JlYXRlQXBwPShrLFMpPT5BKGssUykudXNlKGlJLGwpLGwuVnVlPV99fXZhciBpST17aW5zdGFsbChnLGwpe29JKGcsbCksZGMobCkuaW5pdEFwcChnKX19O2Z1bmN0aW9uIG9JKGcsbCl7bGV0e21vdW50Ol99PWc7Zy5tb3VudD1BPT57bGV0IGs9XyhBKTtyZXR1cm4gQT09PSIjYXBwIiYmbC5fX3JlZ2lzdGVyQXBwKGspLGt9fWZ1bmN0aW9uIGFJKGcpe2xldHtVbmlTaGFyZWQ6bCxWdWVTaGFyZWQ6XyxWdWVSZWFjdGl2aXR5OkF9PWc7dmFyIGs9ZnVuY3Rpb24oUyxOLGYsVCl7InVzZSBzdHJpY3QiO3ZhciB6ZT1bXTtmdW5jdGlvbiB4dChpKXtULnBhdXNlVHJhY2tpbmcoKTtmb3IodmFyIHM9emUubGVuZ3RoP3plW3plLmxlbmd0aC0xXS5jb21wb25lbnQ6bnVsbCxkPXMmJnMuYXBwQ29udGV4dC5jb25maWcud2FybkhhbmRsZXIscD1wbigpLHk9YXJndW1lbnRzLmxlbmd0aCx3PW5ldyBBcnJheSh5PjE/eS0xOjApLEk9MTtJPHk7SSsrKXdbSS0xXT1hcmd1bWVudHNbSV07aWYoZClzdChkLHMsMTEsW2krdy5qb2luKCIiKSxzJiZzLnByb3h5LHAubWFwKCQ9Pnt2YXJ7dm5vZGU6ZWV9PSQ7cmV0dXJuImF0IDwiLmNvbmNhdCh5byhzLGVlLnR5cGUpLCI+Iil9KS5qb2luKGAKYCkscF0pO2Vsc2V7dmFyIEw9WyJbVnVlIHdhcm5dOiAiLmNvbmNhdChpKSwuLi53XTtwLmxlbmd0aCYmTC5wdXNoKGAKYCwuLi5CKHApKSxjb25zb2xlLndhcm4oLi4uTCl9VC5yZXNldFRyYWNraW5nKCl9ZnVuY3Rpb24gcG4oKXt2YXIgaT16ZVt6ZS5sZW5ndGgtMV07aWYoIWkpcmV0dXJuW107Zm9yKHZhciBzPVtdO2k7KXt2YXIgZD1zWzBdO2QmJmQudm5vZGU9PT1pP2QucmVjdXJzZUNvdW50Kys6cy5wdXNoKHt2bm9kZTppLHJlY3Vyc2VDb3VudDowfSk7dmFyIHA9aS5jb21wb25lbnQmJmkuY29tcG9uZW50LnBhcmVudDtpPXAmJnAudm5vZGV9cmV0dXJuIHN9ZnVuY3Rpb24gQihpKXt2YXIgcz1bXTtyZXR1cm4gaS5mb3JFYWNoKChkLHApPT57cy5wdXNoKC4uLnA9PT0wP1tdOltgCmBdLC4uLmd0KGQpKX0pLHN9ZnVuY3Rpb24gZ3QoaSl7dmFye3Zub2RlOnMscmVjdXJzZUNvdW50OmR9PWkscD1kPjA/Ii4uLiAoIi5jb25jYXQoZCwiIHJlY3Vyc2l2ZSBjYWxscykiKToiIix5PXMuY29tcG9uZW50P3MuY29tcG9uZW50LnBhcmVudD09bnVsbDohMSx3PSIgYXQgPCIuY29uY2F0KHlvKHMuY29tcG9uZW50LHMudHlwZSx5KSksST0iPiIrcDtyZXR1cm4gcy5wcm9wcz9bdywuLi52bihzLnByb3BzKSxJXTpbdytJXX1mdW5jdGlvbiB2bihpKXt2YXIgcz1bXSxkPU9iamVjdC5rZXlzKGkpO3JldHVybiBkLnNsaWNlKDAsMykuZm9yRWFjaChwPT57cy5wdXNoKC4uLlZuKHAsaVtwXSkpfSksZC5sZW5ndGg+MyYmcy5wdXNoKCIgLi4uIiksc31mdW5jdGlvbiBWbihpLHMsZCl7cmV0dXJuIGYuaXNTdHJpbmcocyk/KHM9SlNPTi5zdHJpbmdpZnkocyksZD9zOlsiIi5jb25jYXQoaSwiPSIpLmNvbmNhdChzKV0pOnR5cGVvZiBzPT0ibnVtYmVyInx8dHlwZW9mIHM9PSJib29sZWFuInx8cz09bnVsbD9kP3M6WyIiLmNvbmNhdChpLCI9IikuY29uY2F0KHMpXTpULmlzUmVmKHMpPyhzPVZuKGksVC50b1JhdyhzLnZhbHVlKSwhMCksZD9zOlsiIi5jb25jYXQoaSwiPVJlZjwiKSxzLCI+Il0pOmYuaXNGdW5jdGlvbihzKT9bIiIuY29uY2F0KGksIj1mbiIpLmNvbmNhdChzLm5hbWU/IjwiLmNvbmNhdChzLm5hbWUsIj4iKToiIildOihzPVQudG9SYXcocyksZD9zOlsiIi5jb25jYXQoaSwiPSIpLHNdKX1mdW5jdGlvbiBzdChpLHMsZCxwKXt2YXIgeTt0cnl7eT1wP2koLi4ucCk6aSgpfWNhdGNoKHcpe3RlKHcscyxkKX1yZXR1cm4geX1mdW5jdGlvbiBZKGkscyxkLHApe2lmKGYuaXNGdW5jdGlvbihpKSl7dmFyIHk9c3QoaSxzLGQscCk7cmV0dXJuIHkmJmYuaXNQcm9taXNlKHkpJiZ5LmNhdGNoKEw9Pnt0ZShMLHMsZCl9KSx5fWZvcih2YXIgdz1bXSxJPTA7STxpLmxlbmd0aDtJKyspdy5wdXNoKFkoaVtJXSxzLGQscCkpO3JldHVybiB3fWZ1bmN0aW9uIHRlKGkscyxkKXtpZihzJiZzLnZub2RlLHMpe2Zvcih2YXIgcD1zLnBhcmVudCx5PXMucHJveHksdz1kO3A7KXt2YXIgST1wLmVjO2lmKEkpe2Zvcih2YXIgTD0wO0w8SS5sZW5ndGg7TCsrKWlmKElbTF0oaSx5LHcpPT09ITEpcmV0dXJufXA9cC5wYXJlbnR9dmFyICQ9cy5hcHBDb250ZXh0LmNvbmZpZy5lcnJvckhhbmRsZXI7aWYoJCl7c3QoJCxudWxsLDEwLFtpLHksd10pO3JldHVybn19RW4oaSl9ZnVuY3Rpb24gRW4oaSxzLGQpe2NvbnNvbGUuZXJyb3IoaSl9dmFyIHluPSExLGxuPSExLCRuPVtdLGFuPTAsa249W10sVW49bnVsbCxtbj0wLHNuPVtdLF9uPW51bGwsUm49MCxrcj17dGhlbihpKXtzZXRUaW1lb3V0KCgpPT5pKCksMCl9fSxacj1TLnBsYXRmb3JtPT09ImlPUyIsVWU9WnI/a3I6UHJvbWlzZS5yZXNvbHZlKCksaXQ9bnVsbCx2dD1udWxsO2Z1bmN0aW9uIHF0KGkpe3ZhciBzPWl0fHxVZTtyZXR1cm4gaT9zLnRoZW4odGhpcz9pLmJpbmQodGhpcyk6aSk6c31mdW5jdGlvbiBubihpKXtmb3IodmFyIHM9YW4rMSxkPSRuLmxlbmd0aDtzPGQ7KXt2YXIgcD1zK2Q+Pj4xLHk9SHIoJG5bcF0pO3k8aT9zPXArMTpkPXB9cmV0dXJuIHN9ZnVuY3Rpb24gUXQoaSl7KCEkbi5sZW5ndGh8fCEkbi5pbmNsdWRlcyhpLHluJiZpLmFsbG93UmVjdXJzZT9hbisxOmFuKSkmJmkhPT12dCYmKGkuaWQ9PW51bGw/JG4ucHVzaChpKTokbi5zcGxpY2Uobm4oaS5pZCksMCxpKSxpcigpKX1mdW5jdGlvbiBpcigpeyF5biYmIWxuJiYobG49ITAsaXQ9VWUudGhlbihaaSkpfWZ1bmN0aW9uIGxyKGkpe3ZhciBzPSRuLmluZGV4T2YoaSk7cz5hbiYmJG4uc3BsaWNlKHMsMSl9ZnVuY3Rpb24gTGkoaSxzLGQscCl7Zi5pc0FycmF5KGkpP2QucHVzaCguLi5pKTooIXN8fCFzLmluY2x1ZGVzKGksaS5hbGxvd1JlY3Vyc2U/cCsxOnApKSYmZC5wdXNoKGkpLGlyKCl9ZnVuY3Rpb24gRGkoaSl7TGkoaSxVbixrbixtbil9ZnVuY3Rpb24geG4oaSl7TGkoaSxfbixzbixSbil9ZnVuY3Rpb24gd3IoaSl7dmFyIHM9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOm51bGw7aWYoa24ubGVuZ3RoKXtmb3IodnQ9cyxVbj1bLi4ubmV3IFNldChrbildLGtuLmxlbmd0aD0wLG1uPTA7bW48VW4ubGVuZ3RoO21uKyspVW5bbW5dKCk7VW49bnVsbCxtbj0wLHZ0PW51bGwsd3IoaSxzKX19ZnVuY3Rpb24gVXIoaSl7aWYod3IoKSxzbi5sZW5ndGgpe3ZhciBzPVsuLi5uZXcgU2V0KHNuKV07aWYoc24ubGVuZ3RoPTAsX24pe19uLnB1c2goLi4ucyk7cmV0dXJufWZvcihfbj1zLF9uLnNvcnQoKGQscCk9PkhyKGQpLUhyKHApKSxSbj0wO1JuPF9uLmxlbmd0aDtSbisrKV9uW1JuXSgpO19uPW51bGwsUm49MH19dmFyIEhyPWk9PmkuaWQ9PW51bGw/MS8wOmkuaWQ7ZnVuY3Rpb24gWmkoaSl7bG49ITEseW49ITAsd3IoaSksJG4uc29ydCgocCx5KT0+SHIocCktSHIoeSkpO3ZhciBzPWYuTk9PUDt0cnl7Zm9yKGFuPTA7YW48JG4ubGVuZ3RoO2FuKyspe3ZhciBkPSRuW2FuXTtkJiZkLmFjdGl2ZSE9PSExJiZzdChkLG51bGwsMTQpfX1maW5hbGx5e2FuPTAsJG4ubGVuZ3RoPTAsVXIoKSx5bj0hMSxpdD1udWxsLCgkbi5sZW5ndGh8fGtuLmxlbmd0aHx8c24ubGVuZ3RoKSYmWmkoaSl9fVMuZGV2dG9vbHM9dm9pZCAwO3ZhciBYaT1bXTtmdW5jdGlvbiBPbyhpLHMpe3ZhciBkLHA7aWYoUy5kZXZ0b29scz1pLFMuZGV2dG9vbHMpUy5kZXZ0b29scy5lbmFibGVkPSEwLFhpLmZvckVhY2godz0+e3ZhcntldmVudDpJLGFyZ3M6TH09dztyZXR1cm4gUy5kZXZ0b29scy5lbWl0KEksLi4uTCl9KSxYaT1bXTtlbHNlIGlmKHR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiJiZ3aW5kb3cuSFRNTEVsZW1lbnQmJiEoKHA9KGQ9d2luZG93Lm5hdmlnYXRvcik9PT1udWxsfHxkPT09dm9pZCAwP3ZvaWQgMDpkLnVzZXJBZ2VudCk9PT1udWxsfHxwPT09dm9pZCAwP3ZvaWQgMDpwLmluY2x1ZGVzKCJqc2RvbSIpKSl7dmFyIHk9cy5fX1ZVRV9ERVZUT09MU19IT09LX1JFUExBWV9fPXMuX19WVUVfREVWVE9PTFNfSE9PS19SRVBMQVlfX3x8W107eS5wdXNoKHc9PntPbyh3LHMpfSksc2V0VGltZW91dCgoKT0+e1MuZGV2dG9vbHN8fChzLl9fVlVFX0RFVlRPT0xTX0hPT0tfUkVQTEFZX189bnVsbCxYaT1bXSl9LDNlMyl9ZWxzZSBYaT1bXX1mdW5jdGlvbiBUbyhpLHMpe2lmKCFpLmlzVW5tb3VudGVkKXtmb3IodmFyIGQ9aS52bm9kZS5wcm9wc3x8Zi5FTVBUWV9PQkoscD1hcmd1bWVudHMubGVuZ3RoLHk9bmV3IEFycmF5KHA+Mj9wLTI6MCksdz0yO3c8cDt3KyspeVt3LTJdPWFyZ3VtZW50c1t3XTt2YXIgST15LEw9cy5zdGFydHNXaXRoKCJ1cGRhdGU6IiksJD1MJiZzLnNsaWNlKDcpO2lmKCQmJiQgaW4gZCl7dmFyIGVlPSIiLmNvbmNhdCgkPT09Im1vZGVsVmFsdWUiPyJtb2RlbCI6JCwiTW9kaWZpZXJzIikse251bWJlcjppZSx0cmltOkllfT1kW2VlXXx8Zi5FTVBUWV9PQko7SWUmJihJPXkubWFwKGZ0PT5mdC50cmltKCkpKSxpZSYmKEk9eS5tYXAoZi50b051bWJlcikpfXZhciBvZSxDZT1kW29lPWYudG9IYW5kbGVyS2V5KHMpXXx8ZFtvZT1mLnRvSGFuZGxlcktleShmLmNhbWVsaXplKHMpKV07IUNlJiZMJiYoQ2U9ZFtvZT1mLnRvSGFuZGxlcktleShmLmh5cGhlbmF0ZShzKSldKSxDZSYmWShDZSxpLDYsSSk7dmFyIEJlPWRbb2UrIk9uY2UiXTtpZihCZSl7aWYoIWkuZW1pdHRlZClpLmVtaXR0ZWQ9e307ZWxzZSBpZihpLmVtaXR0ZWRbb2VdKXJldHVybjtpLmVtaXR0ZWRbb2VdPSEwLFkoQmUsaSw2LEkpfX19ZnVuY3Rpb24gaHIoaSxzKXt2YXIgZD1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06ITEscD1zLmVtaXRzQ2FjaGUseT1wLmdldChpKTtpZih5IT09dm9pZCAwKXJldHVybiB5O3ZhciB3PWkuZW1pdHMsST17fSxMPSExO2lmKCFmLmlzRnVuY3Rpb24oaSkpe3ZhciAkPWVlPT57dmFyIGllPWhyKGVlLHMsITApO2llJiYoTD0hMCxmLmV4dGVuZChJLGllKSl9OyFkJiZzLm1peGlucy5sZW5ndGgmJnMubWl4aW5zLmZvckVhY2goJCksaS5leHRlbmRzJiYkKGkuZXh0ZW5kcyksaS5taXhpbnMmJmkubWl4aW5zLmZvckVhY2goJCl9cmV0dXJuIXcmJiFMPyhwLnNldChpLG51bGwpLG51bGwpOihmLmlzQXJyYXkodyk/dy5mb3JFYWNoKGVlPT5JW2VlXT1udWxsKTpmLmV4dGVuZChJLHcpLHAuc2V0KGksSSksSSl9ZnVuY3Rpb24gQ24oaSxzKXtyZXR1cm4haXx8IWYuaXNPbihzKT8hMToocz1zLnNsaWNlKDIpLnJlcGxhY2UoL09uY2UkLywiIiksZi5oYXNPd24oaSxzWzBdLnRvTG93ZXJDYXNlKCkrcy5zbGljZSgxKSl8fGYuaGFzT3duKGksZi5oeXBoZW5hdGUocykpfHxmLmhhc093bihpLHMpKX12YXIgT249bnVsbCxjaT1udWxsO2Z1bmN0aW9uIFFpKGkpe3ZhciBzPU9uO3JldHVybiBPbj1pLGNpPWkmJmkudHlwZS5fX3Njb3BlSWR8fG51bGwsc31mdW5jdGlvbiBlbyhpKXtjaT1pfWZ1bmN0aW9uIGdvKCl7Y2k9bnVsbH12YXIgU2k9aT0+Y3I7ZnVuY3Rpb24gY3IoaSl7dmFyIHM9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOk9uO2lmKCFzfHxpLl9uKXJldHVybiBpO3ZhciBkPWZ1bmN0aW9uKCl7ZC5fZCYmU24oLTEpO3ZhciBwPVFpKHMpLHk9aSguLi5hcmd1bWVudHMpO3JldHVybiBRaShwKSxkLl9kJiZTbigxKSx5fTtyZXR1cm4gZC5fbj0hMCxkLl9jPSEwLGQuX2Q9ITAsZH1mdW5jdGlvbiBqcigpe31mdW5jdGlvbiBTcihpKXt2YXJ7dHlwZTpzLHZub2RlOmQscHJveHk6cCx3aXRoUHJveHk6eSxwcm9wczp3LHByb3BzT3B0aW9uczpbSV0sc2xvdHM6TCxhdHRyczokLGVtaXQ6ZWUscmVuZGVyOmllLHJlbmRlckNhY2hlOkllLGRhdGE6b2Usc2V0dXBTdGF0ZTpDZSxjdHg6QmUsaW5oZXJpdEF0dHJzOmZ0fT1pLEF0LG1lLGxlPVFpKGkpO3RyeXtpZihkLnNoYXBlRmxhZyY0KXt2YXIgU2U9eXx8cDtBdD1ZdChpZS5jYWxsKFNlLFNlLEllLHcsQ2Usb2UsQmUpKSxtZT0kfWVsc2V7dmFyIHFlPXM7QXQ9WXQocWUubGVuZ3RoPjE/cWUodyx7YXR0cnM6JCxzbG90czpMLGVtaXQ6ZWV9KTpxZSh3LG51bGwpKSxtZT1zLnByb3BzPyQ6UG8oJCl9fWNhdGNoKHhlKXtaZS5sZW5ndGg9MCx0ZSh4ZSxpLDEpLEF0PWZuKFZ0KX12YXIgSGU9QXQ7aWYobWUmJmZ0IT09ITEpe3ZhciBSZT1PYmplY3Qua2V5cyhtZSkse3NoYXBlRmxhZzpsdH09SGU7UmUubGVuZ3RoJiZsdCYoMXw2KSYmKEkmJlJlLnNvbWUoZi5pc01vZGVsTGlzdGVuZXIpJiYobWU9SW8obWUsSSkpLEhlPWlpKEhlLG1lKSl9cmV0dXJuIGQuZGlycyYmKEhlPWlpKEhlKSxIZS5kaXJzPUhlLmRpcnM/SGUuZGlycy5jb25jYXQoZC5kaXJzKTpkLmRpcnMpLGQudHJhbnNpdGlvbiYmKEhlLnRyYW5zaXRpb249ZC50cmFuc2l0aW9uKSxBdD1IZSxRaShsZSksQXR9ZnVuY3Rpb24gZ3IoaSl7Zm9yKHZhciBzLGQ9MDtkPGkubGVuZ3RoO2QrKyl7dmFyIHA9aVtkXTtpZihvcihwKSl7aWYocC50eXBlIT09VnR8fHAuY2hpbGRyZW49PT0idi1pZiIpe2lmKHMpcmV0dXJuO3M9cH19ZWxzZSByZXR1cm59cmV0dXJuIHN9dmFyIFBvPWk9Pnt2YXIgcztmb3IodmFyIGQgaW4gaSkoZD09PSJjbGFzcyJ8fGQ9PT0ic3R5bGUifHxmLmlzT24oZCkpJiYoKHN8fChzPXt9KSlbZF09aVtkXSk7cmV0dXJuIHN9LElvPShpLHMpPT57dmFyIGQ9e307Zm9yKHZhciBwIGluIGkpKCFmLmlzTW9kZWxMaXN0ZW5lcihwKXx8IShwLnNsaWNlKDkpaW4gcykpJiYoZFtwXT1pW3BdKTtyZXR1cm4gZH07ZnVuY3Rpb24gcG8oaSxzLGQpe3Zhcntwcm9wczpwLGNoaWxkcmVuOnksY29tcG9uZW50Ond9PWkse3Byb3BzOkksY2hpbGRyZW46TCxwYXRjaEZsYWc6JH09cyxlZT13LmVtaXRzT3B0aW9ucztpZihzLmRpcnN8fHMudHJhbnNpdGlvbilyZXR1cm4hMDtpZihkJiYkPj0wKXtpZigkJjEwMjQpcmV0dXJuITA7aWYoJCYxNilyZXR1cm4gcD9ScihwLEksZWUpOiEhSTtpZigkJjgpZm9yKHZhciBpZT1zLmR5bmFtaWNQcm9wcyxJZT0wO0llPGllLmxlbmd0aDtJZSsrKXt2YXIgb2U9aWVbSWVdO2lmKElbb2VdIT09cFtvZV0mJiFDbihlZSxvZSkpcmV0dXJuITB9fWVsc2UgcmV0dXJuKHl8fEwpJiYoIUx8fCFMLiRzdGFibGUpPyEwOnA9PT1JPyExOnA/ST9ScihwLEksZWUpOiEwOiEhSTtyZXR1cm4hMX1mdW5jdGlvbiBScihpLHMsZCl7dmFyIHA9T2JqZWN0LmtleXMocyk7aWYocC5sZW5ndGghPT1PYmplY3Qua2V5cyhpKS5sZW5ndGgpcmV0dXJuITA7Zm9yKHZhciB5PTA7eTxwLmxlbmd0aDt5Kyspe3ZhciB3PXBbeV07aWYoc1t3XSE9PWlbd10mJiFDbihkLHcpKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIHVyKGkscyl7Zm9yKHZhcnt2bm9kZTpkLHBhcmVudDpwfT1pO3AmJnAuc3ViVHJlZT09PWQ7KShkPXAudm5vZGUpLmVsPXMscD1wLnBhcmVudH12YXIgQXI9aT0+aS5fX2lzU3VzcGVuc2UsWHI9e25hbWU6IlN1c3BlbnNlIixfX2lzU3VzcGVuc2U6ITAscHJvY2VzcyhpLHMsZCxwLHksdyxJLEwsJCxlZSl7aT09bnVsbD90byhzLGQscCx5LHcsSSxMLCQsZWUpOkZpKGkscyxkLHAseSxJLEwsJCxlZSl9LGh5ZHJhdGU6dm8sY3JlYXRlOnhyLG5vcm1hbGl6ZTptb30sem49WHI7ZnVuY3Rpb24genIoaSxzKXt2YXIgZD1pLnByb3BzJiZpLnByb3BzW3NdO2YuaXNGdW5jdGlvbihkKSYmZCgpfWZ1bmN0aW9uIHRvKGkscyxkLHAseSx3LEksTCwkKXt2YXJ7cDplZSxvOntjcmVhdGVFbGVtZW50OmllfX09JCxJZT1pZSgiZGl2IixzKSxvZT1pLnN1c3BlbnNlPXhyKGkseSxwLHMsSWUsZCx3LEksTCwkKTtlZShudWxsLG9lLnBlbmRpbmdCcmFuY2g9aS5zc0NvbnRlbnQsSWUsbnVsbCxwLG9lLHcsSSksb2UuZGVwcz4wPyh6cihpLCJvblBlbmRpbmciKSx6cihpLCJvbkZhbGxiYWNrIiksZWUobnVsbCxpLnNzRmFsbGJhY2sscyxkLHAsbnVsbCx3LEkpLGVpKG9lLGkuc3NGYWxsYmFjaykpOm9lLnJlc29sdmUoKX1mdW5jdGlvbiBGaShpLHMsZCxwLHksdyxJLEwsJCl7dmFye3A6ZWUsdW06aWUsbzp7Y3JlYXRlRWxlbWVudDpJZX19PSQsb2U9cy5zdXNwZW5zZT1pLnN1c3BlbnNlO29lLnZub2RlPXMscy5lbD1pLmVsO3ZhciBDZT1zLnNzQ29udGVudCxCZT1zLnNzRmFsbGJhY2sse2FjdGl2ZUJyYW5jaDpmdCxwZW5kaW5nQnJhbmNoOkF0LGlzSW5GYWxsYmFjazptZSxpc0h5ZHJhdGluZzpsZX09b2U7aWYoQXQpb2UucGVuZGluZ0JyYW5jaD1DZSxFcihDZSxBdCk/KGVlKEF0LENlLG9lLmhpZGRlbkNvbnRhaW5lcixudWxsLHksb2UsdyxJLEwpLG9lLmRlcHM8PTA/b2UucmVzb2x2ZSgpOm1lJiYoZWUoZnQsQmUsZCxwLHksbnVsbCx3LEksTCksZWkob2UsQmUpKSk6KG9lLnBlbmRpbmdJZCsrLGxlPyhvZS5pc0h5ZHJhdGluZz0hMSxvZS5hY3RpdmVCcmFuY2g9QXQpOmllKEF0LHksb2UpLG9lLmRlcHM9MCxvZS5lZmZlY3RzLmxlbmd0aD0wLG9lLmhpZGRlbkNvbnRhaW5lcj1JZSgiZGl2IixkKSxtZT8oZWUobnVsbCxDZSxvZS5oaWRkZW5Db250YWluZXIsbnVsbCx5LG9lLHcsSSxMKSxvZS5kZXBzPD0wP29lLnJlc29sdmUoKTooZWUoZnQsQmUsZCxwLHksbnVsbCx3LEksTCksZWkob2UsQmUpKSk6ZnQmJkVyKENlLGZ0KT8oZWUoZnQsQ2UsZCxwLHksb2UsdyxJLEwpLG9lLnJlc29sdmUoITApKTooZWUobnVsbCxDZSxvZS5oaWRkZW5Db250YWluZXIsbnVsbCx5LG9lLHcsSSxMKSxvZS5kZXBzPD0wJiZvZS5yZXNvbHZlKCkpKTtlbHNlIGlmKGZ0JiZFcihDZSxmdCkpZWUoZnQsQ2UsZCxwLHksb2UsdyxJLEwpLGVpKG9lLENlKTtlbHNlIGlmKHpyKHMsIm9uUGVuZGluZyIpLG9lLnBlbmRpbmdCcmFuY2g9Q2Usb2UucGVuZGluZ0lkKyssZWUobnVsbCxDZSxvZS5oaWRkZW5Db250YWluZXIsbnVsbCx5LG9lLHcsSSxMKSxvZS5kZXBzPD0wKW9lLnJlc29sdmUoKTtlbHNle3Zhcnt0aW1lb3V0OlNlLHBlbmRpbmdJZDpxZX09b2U7U2U+MD9zZXRUaW1lb3V0KCgpPT57b2UucGVuZGluZ0lkPT09cWUmJm9lLmZhbGxiYWNrKEJlKX0sU2UpOlNlPT09MCYmb2UuZmFsbGJhY2soQmUpfX1mdW5jdGlvbiB4cihpLHMsZCxwLHksdyxJLEwsJCxlZSl7dmFyIGllPWFyZ3VtZW50cy5sZW5ndGg+MTAmJmFyZ3VtZW50c1sxMF0hPT12b2lkIDA/YXJndW1lbnRzWzEwXTohMSx7cDpJZSxtOm9lLHVtOkNlLG46QmUsbzp7cGFyZW50Tm9kZTpmdCxyZW1vdmU6QXR9fT1lZSxtZT1mLnRvTnVtYmVyKGkucHJvcHMmJmkucHJvcHMudGltZW91dCksbGU9e3Zub2RlOmkscGFyZW50OnMscGFyZW50Q29tcG9uZW50OmQsaXNTVkc6SSxjb250YWluZXI6cCxoaWRkZW5Db250YWluZXI6eSxhbmNob3I6dyxkZXBzOjAscGVuZGluZ0lkOjAsdGltZW91dDp0eXBlb2YgbWU9PSJudW1iZXIiP21lOi0xLGFjdGl2ZUJyYW5jaDpudWxsLHBlbmRpbmdCcmFuY2g6bnVsbCxpc0luRmFsbGJhY2s6ITAsaXNIeWRyYXRpbmc6aWUsaXNVbm1vdW50ZWQ6ITEsZWZmZWN0czpbXSxyZXNvbHZlKCl7dmFyIFNlPWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dm9pZCAwP2FyZ3VtZW50c1swXTohMSx7dm5vZGU6cWUsYWN0aXZlQnJhbmNoOkhlLHBlbmRpbmdCcmFuY2g6UmUscGVuZGluZ0lkOmx0LGVmZmVjdHM6eGUscGFyZW50Q29tcG9uZW50Okl0LGNvbnRhaW5lcjpDdH09bGU7aWYobGUuaXNIeWRyYXRpbmcpbGUuaXNIeWRyYXRpbmc9ITE7ZWxzZSBpZighU2Upe3ZhciBCdD1IZSYmUmUudHJhbnNpdGlvbiYmUmUudHJhbnNpdGlvbi5tb2RlPT09Im91dC1pbiI7QnQmJihIZS50cmFuc2l0aW9uLmFmdGVyTGVhdmU9KCk9PntsdD09PWxlLnBlbmRpbmdJZCYmb2UoUmUsQ3QsSnQsMCl9KTt2YXJ7YW5jaG9yOkp0fT1sZTtIZSYmKEp0PUJlKEhlKSxDZShIZSxJdCxsZSwhMCkpLEJ0fHxvZShSZSxDdCxKdCwwKX1laShsZSxSZSksbGUucGVuZGluZ0JyYW5jaD1udWxsLGxlLmlzSW5GYWxsYmFjaz0hMTtmb3IodmFyIGR0PWxlLnBhcmVudCxGPSExO2R0Oyl7aWYoZHQucGVuZGluZ0JyYW5jaCl7ZHQuZWZmZWN0cy5wdXNoKC4uLnhlKSxGPSEwO2JyZWFrfWR0PWR0LnBhcmVudH1GfHx4bih4ZSksbGUuZWZmZWN0cz1bXSx6cihxZSwib25SZXNvbHZlIil9LGZhbGxiYWNrKFNlKXtpZighIWxlLnBlbmRpbmdCcmFuY2gpe3Zhcnt2bm9kZTpxZSxhY3RpdmVCcmFuY2g6SGUscGFyZW50Q29tcG9uZW50OlJlLGNvbnRhaW5lcjpsdCxpc1NWRzp4ZX09bGU7enIocWUsIm9uRmFsbGJhY2siKTt2YXIgSXQ9QmUoSGUpLEN0PSgpPT57IWxlLmlzSW5GYWxsYmFja3x8KEllKG51bGwsU2UsbHQsSXQsUmUsbnVsbCx4ZSxMLCQpLGVpKGxlLFNlKSl9LEJ0PVNlLnRyYW5zaXRpb24mJlNlLnRyYW5zaXRpb24ubW9kZT09PSJvdXQtaW4iO0J0JiYoSGUudHJhbnNpdGlvbi5hZnRlckxlYXZlPUN0KSxsZS5pc0luRmFsbGJhY2s9ITAsQ2UoSGUsUmUsbnVsbCwhMCksQnR8fEN0KCl9fSxtb3ZlKFNlLHFlLEhlKXtsZS5hY3RpdmVCcmFuY2gmJm9lKGxlLmFjdGl2ZUJyYW5jaCxTZSxxZSxIZSksbGUuY29udGFpbmVyPVNlfSxuZXh0KCl7cmV0dXJuIGxlLmFjdGl2ZUJyYW5jaCYmQmUobGUuYWN0aXZlQnJhbmNoKX0scmVnaXN0ZXJEZXAoU2UscWUpe3ZhciBIZT0hIWxlLnBlbmRpbmdCcmFuY2g7SGUmJmxlLmRlcHMrKzt2YXIgUmU9U2Uudm5vZGUuZWw7U2UuYXN5bmNEZXAuY2F0Y2gobHQ9Pnt0ZShsdCxTZSwwKX0pLnRoZW4obHQ9PntpZighKFNlLmlzVW5tb3VudGVkfHxsZS5pc1VubW91bnRlZHx8bGUucGVuZGluZ0lkIT09U2Uuc3VzcGVuc2VJZCkpe1NlLmFzeW5jUmVzb2x2ZWQ9ITA7dmFye3Zub2RlOnhlfT1TZTtHaShTZSxsdCwhMSksUmUmJih4ZS5lbD1SZSk7dmFyIEl0PSFSZSYmU2Uuc3ViVHJlZS5lbDtxZShTZSx4ZSxmdChSZXx8U2Uuc3ViVHJlZS5lbCksUmU/bnVsbDpCZShTZS5zdWJUcmVlKSxsZSxJLCQpLEl0JiZBdChJdCksdXIoU2UseGUuZWwpLEhlJiYtLWxlLmRlcHM9PT0wJiZsZS5yZXNvbHZlKCl9fSl9LHVubW91bnQoU2UscWUpe2xlLmlzVW5tb3VudGVkPSEwLGxlLmFjdGl2ZUJyYW5jaCYmQ2UobGUuYWN0aXZlQnJhbmNoLGQsU2UscWUpLGxlLnBlbmRpbmdCcmFuY2gmJkNlKGxlLnBlbmRpbmdCcmFuY2gsZCxTZSxxZSl9fTtyZXR1cm4gbGV9ZnVuY3Rpb24gdm8oaSxzLGQscCx5LHcsSSxMLCQpe3ZhciBlZT1zLnN1c3BlbnNlPXhyKHMscCxkLGkucGFyZW50Tm9kZSxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxudWxsLHksdyxJLEwsITApLGllPSQoaSxlZS5wZW5kaW5nQnJhbmNoPXMuc3NDb250ZW50LGQsZWUsdyxJKTtyZXR1cm4gZWUuZGVwcz09PTAmJmVlLnJlc29sdmUoKSxpZX1mdW5jdGlvbiBtbyhpKXt2YXJ7c2hhcGVGbGFnOnMsY2hpbGRyZW46ZH09aSxwPXMmMzI7aS5zc0NvbnRlbnQ9X28ocD9kLmRlZmF1bHQ6ZCksaS5zc0ZhbGxiYWNrPXA/X28oZC5mYWxsYmFjayk6Zm4oVnQpfWZ1bmN0aW9uIF9vKGkpe3ZhciBzO2lmKGYuaXNGdW5jdGlvbihpKSl7dmFyIGQ9cm4mJmkuX2M7ZCYmKGkuX2Q9ITEsd24oKSksaT1pKCksZCYmKGkuX2Q9ITAscz1PdCx1bigpKX1pZihmLmlzQXJyYXkoaSkpe3ZhciBwPWdyKGkpO2k9cH1yZXR1cm4gaT1ZdChpKSxzJiYhaS5keW5hbWljQ2hpbGRyZW4mJihpLmR5bmFtaWNDaGlsZHJlbj1zLmZpbHRlcih5PT55IT09aSkpLGl9ZnVuY3Rpb24gUXIoaSxzKXtzJiZzLnBlbmRpbmdCcmFuY2g/Zi5pc0FycmF5KGkpP3MuZWZmZWN0cy5wdXNoKC4uLmkpOnMuZWZmZWN0cy5wdXNoKGkpOnhuKGkpfWZ1bmN0aW9uIGVpKGkscyl7aS5hY3RpdmVCcmFuY2g9czt2YXJ7dm5vZGU6ZCxwYXJlbnRDb21wb25lbnQ6cH09aSx5PWQuZWw9cy5lbDtwJiZwLnN1YlRyZWU9PT1kJiYocC52bm9kZS5lbD15LHVyKHAseSkpfWZ1bmN0aW9uIEFpKGkscyl7aWYoQW4pe3ZhciBkPUFuLnByb3ZpZGVzLHA9QW4ucGFyZW50JiZBbi5wYXJlbnQucHJvdmlkZXM7cD09PWQmJihkPUFuLnByb3ZpZGVzPU9iamVjdC5jcmVhdGUocCkpLGRbaV09cyxBbi50eXBlLm1wVHlwZT09PSJhcHAiJiZBbi5hcHBDb250ZXh0LmFwcC5wcm92aWRlKGkscyl9fWZ1bmN0aW9uIHVpKGkscyl7dmFyIGQ9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOiExLHA9QW58fE9uO2lmKHApe3ZhciB5PXAucGFyZW50PT1udWxsP3Audm5vZGUuYXBwQ29udGV4dCYmcC52bm9kZS5hcHBDb250ZXh0LnByb3ZpZGVzOnAucGFyZW50LnByb3ZpZGVzO2lmKHkmJmkgaW4geSlyZXR1cm4geVtpXTtpZihhcmd1bWVudHMubGVuZ3RoPjEpcmV0dXJuIGQmJmYuaXNGdW5jdGlvbihzKT9zLmNhbGwocC5wcm94eSk6c319ZnVuY3Rpb24gcW4oaSxzKXtyZXR1cm4gQ2koaSxudWxsLHMpfWZ1bmN0aW9uIENyKGkscyl7cmV0dXJuIENpKGksbnVsbCx7Zmx1c2g6InBvc3QifSl9ZnVuY3Rpb24gVmkoaSxzKXtyZXR1cm4gQ2koaSxudWxsLHtmbHVzaDoic3luYyJ9KX12YXIgTXQ9e307ZnVuY3Rpb24geWUoaSxzLGQpe3JldHVybiBDaShpLHMsZCl9ZnVuY3Rpb24gQ2koaSxzKXt2YXJ7aW1tZWRpYXRlOmQsZGVlcDpwLGZsdXNoOnksb25UcmFjazp3LG9uVHJpZ2dlcjpJfT1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06Zi5FTVBUWV9PQkosTD1BbiwkLGVlPSExLGllPSExO2lmKFQuaXNSZWYoaSk/KCQ9KCk9PmkudmFsdWUsZWU9VC5pc1NoYWxsb3coaSkpOlQuaXNSZWFjdGl2ZShpKT8oJD0oKT0+aSxwPSEwKTpmLmlzQXJyYXkoaSk/KGllPSEwLGVlPWkuc29tZShsZT0+VC5pc1JlYWN0aXZlKGxlKXx8VC5pc1NoYWxsb3cobGUpKSwkPSgpPT5pLm1hcChsZT0+e2lmKFQuaXNSZWYobGUpKXJldHVybiBsZS52YWx1ZTtpZihULmlzUmVhY3RpdmUobGUpKXJldHVybiBCcihsZSk7aWYoZi5pc0Z1bmN0aW9uKGxlKSlyZXR1cm4gc3QobGUsTCwyKX0pKTpmLmlzRnVuY3Rpb24oaSk/cz8kPSgpPT5zdChpLEwsMik6JD0oKT0+e2lmKCEoTCYmTC5pc1VubW91bnRlZCkpcmV0dXJuIG9lJiZvZSgpLFkoaSxMLDMsW0NlXSl9OiQ9Zi5OT09QLHMmJnApe3ZhciBJZT0kOyQ9KCk9PkJyKEllKCkpfXZhciBvZSxDZT1sZT0+e29lPW1lLm9uU3RvcD0oKT0+e3N0KGxlLEwsNCl9fTtpZihTLmlzSW5TU1JDb21wb25lbnRTZXR1cClyZXR1cm4gQ2U9Zi5OT09QLHM/ZCYmWShzLEwsMyxbJCgpLGllP1tdOnZvaWQgMCxDZV0pOiQoKSxmLk5PT1A7dmFyIEJlPWllP1tdOk10LGZ0PSgpPT57aWYoISFtZS5hY3RpdmUpaWYocyl7dmFyIGxlPW1lLnJ1bigpOyhwfHxlZXx8KGllP2xlLnNvbWUoKFNlLHFlKT0+Zi5oYXNDaGFuZ2VkKFNlLEJlW3FlXSkpOmYuaGFzQ2hhbmdlZChsZSxCZSkpKSYmKG9lJiZvZSgpLFkocyxMLDMsW2xlLEJlPT09TXQ/dm9pZCAwOkJlLENlXSksQmU9bGUpfWVsc2UgbWUucnVuKCl9O2Z0LmFsbG93UmVjdXJzZT0hIXM7dmFyIEF0O3k9PT0ic3luYyI/QXQ9ZnQ6eT09PSJwb3N0Ij9BdD0oKT0+UihmdCxMJiZMLnN1c3BlbnNlKTpBdD0oKT0+RGkoZnQpO3ZhciBtZT1uZXcgVC5SZWFjdGl2ZUVmZmVjdCgkLEF0KTtyZXR1cm4gcz9kP2Z0KCk6QmU9bWUucnVuKCk6eT09PSJwb3N0Ij9SKG1lLnJ1bi5iaW5kKG1lKSxMJiZMLnN1c3BlbnNlKTptZS5ydW4oKSwoKT0+e21lLnN0b3AoKSxMJiZMLnNjb3BlJiZmLnJlbW92ZShMLnNjb3BlLmVmZmVjdHMsbWUpfX1mdW5jdGlvbiAkaShpLHMsZCl7dmFyIHA9dGhpcy5wcm94eSx5PWYuaXNTdHJpbmcoaSk/aS5pbmNsdWRlcygiLiIpP1dyKHAsaSk6KCk9PnBbaV06aS5iaW5kKHAscCksdztmLmlzRnVuY3Rpb24ocyk/dz1zOih3PXMuaGFuZGxlcixkPXMpO3ZhciBJPUFuO0ZyKHRoaXMpO3ZhciBMPUNpKHksdy5iaW5kKHApLGQpO3JldHVybiBJP0ZyKEkpOmtpKCksTH1mdW5jdGlvbiBXcihpLHMpe3ZhciBkPXMuc3BsaXQoIi4iKTtyZXR1cm4oKT0+e2Zvcih2YXIgcD1pLHk9MDt5PGQubGVuZ3RoJiZwO3krKylwPXBbZFt5XV07cmV0dXJuIHB9fWZ1bmN0aW9uIEJyKGkscyl7aWYoIWYuaXNPYmplY3QoaSl8fGkuX192X3NraXB8fChzPXN8fG5ldyBTZXQscy5oYXMoaSkpKXJldHVybiBpO2lmKHMuYWRkKGkpLFQuaXNSZWYoaSkpQnIoaS52YWx1ZSxzKTtlbHNlIGlmKGYuaXNBcnJheShpKSlmb3IodmFyIGQ9MDtkPGkubGVuZ3RoO2QrKylCcihpW2RdLHMpO2Vsc2UgaWYoZi5pc1NldChpKXx8Zi5pc01hcChpKSlpLmZvckVhY2goeT0+e0JyKHkscyl9KTtlbHNlIGlmKGYuaXNQbGFpbk9iamVjdChpKSlmb3IodmFyIHAgaW4gaSlCcihpW3BdLHMpO3JldHVybiBpfWZ1bmN0aW9uIEhuKCl7dmFyIGk9e2lzTW91bnRlZDohMSxpc0xlYXZpbmc6ITEsaXNVbm1vdW50aW5nOiExLGxlYXZpbmdWTm9kZXM6bmV3IE1hcH07cmV0dXJuIGdpKCgpPT57aS5pc01vdW50ZWQ9ITB9KSx2aSgoKT0+e2kuaXNVbm1vdW50aW5nPSEwfSksaX12YXIgQm49W0Z1bmN0aW9uLEFycmF5XSxObz17bmFtZToiQmFzZVRyYW5zaXRpb24iLHByb3BzOnttb2RlOlN0cmluZyxhcHBlYXI6Qm9vbGVhbixwZXJzaXN0ZWQ6Qm9vbGVhbixvbkJlZm9yZUVudGVyOkJuLG9uRW50ZXI6Qm4sb25BZnRlckVudGVyOkJuLG9uRW50ZXJDYW5jZWxsZWQ6Qm4sb25CZWZvcmVMZWF2ZTpCbixvbkxlYXZlOkJuLG9uQWZ0ZXJMZWF2ZTpCbixvbkxlYXZlQ2FuY2VsbGVkOkJuLG9uQmVmb3JlQXBwZWFyOkJuLG9uQXBwZWFyOkJuLG9uQWZ0ZXJBcHBlYXI6Qm4sb25BcHBlYXJDYW5jZWxsZWQ6Qm59LHNldHVwKGkscyl7dmFye3Nsb3RzOmR9PXMscD1RbigpLHk9SG4oKSx3O3JldHVybigpPT57dmFyIEk9ZC5kZWZhdWx0JiZPcihkLmRlZmF1bHQoKSwhMCk7aWYoISghSXx8IUkubGVuZ3RoKSl7dmFyIEw9SVswXTtpZihJLmxlbmd0aD4xKXtmb3IodmFyICQgb2YgSSlpZigkLnR5cGUhPT1WdCl7TD0kO2JyZWFrfX12YXIgZWU9VC50b1JhdyhpKSx7bW9kZTppZX09ZWU7aWYoeS5pc0xlYXZpbmcpcmV0dXJuIGRpKEwpO3ZhciBJZT1LdChMKTtpZighSWUpcmV0dXJuIGRpKEwpO3ZhciBvZT1maShJZSxlZSx5LHApO1duKEllLG9lKTt2YXIgQ2U9cC5zdWJUcmVlLEJlPUNlJiZLdChDZSksZnQ9ITEse2dldFRyYW5zaXRpb25LZXk6QXR9PUllLnR5cGU7aWYoQXQpe3ZhciBtZT1BdCgpO3c9PT12b2lkIDA/dz1tZTptZSE9PXcmJih3PW1lLGZ0PSEwKX1pZihCZSYmQmUudHlwZSE9PVZ0JiYoIUVyKEllLEJlKXx8ZnQpKXt2YXIgbGU9ZmkoQmUsZWUseSxwKTtpZihXbihCZSxsZSksaWU9PT0ib3V0LWluIilyZXR1cm4geS5pc0xlYXZpbmc9ITAsbGUuYWZ0ZXJMZWF2ZT0oKT0+e3kuaXNMZWF2aW5nPSExLHAudXBkYXRlKCl9LGRpKEwpO2llPT09ImluLW91dCImJkllLnR5cGUhPT1WdCYmKGxlLmRlbGF5TGVhdmU9KFNlLHFlLEhlKT0+e3ZhciBSZT1VdCh5LEJlKTtSZVtTdHJpbmcoQmUua2V5KV09QmUsU2UuX2xlYXZlQ2I9KCk9PntxZSgpLFNlLl9sZWF2ZUNiPXZvaWQgMCxkZWxldGUgb2UuZGVsYXllZExlYXZlfSxvZS5kZWxheWVkTGVhdmU9SGV9KX1yZXR1cm4gTH19fX0sT2k9Tm87ZnVuY3Rpb24gVXQoaSxzKXt2YXJ7bGVhdmluZ1ZOb2RlczpkfT1pLHA9ZC5nZXQocy50eXBlKTtyZXR1cm4gcHx8KHA9T2JqZWN0LmNyZWF0ZShudWxsKSxkLnNldChzLnR5cGUscCkpLHB9ZnVuY3Rpb24gZmkoaSxzLGQscCl7dmFye2FwcGVhcjp5LG1vZGU6dyxwZXJzaXN0ZWQ6ST0hMSxvbkJlZm9yZUVudGVyOkwsb25FbnRlcjokLG9uQWZ0ZXJFbnRlcjplZSxvbkVudGVyQ2FuY2VsbGVkOmllLG9uQmVmb3JlTGVhdmU6SWUsb25MZWF2ZTpvZSxvbkFmdGVyTGVhdmU6Q2Usb25MZWF2ZUNhbmNlbGxlZDpCZSxvbkJlZm9yZUFwcGVhcjpmdCxvbkFwcGVhcjpBdCxvbkFmdGVyQXBwZWFyOm1lLG9uQXBwZWFyQ2FuY2VsbGVkOmxlfT1zLFNlPVN0cmluZyhpLmtleSkscWU9VXQoZCxpKSxIZT0oeGUsSXQpPT57eGUmJlkoeGUscCw5LEl0KX0sUmU9KHhlLEl0KT0+e3ZhciBDdD1JdFsxXTtIZSh4ZSxJdCksZi5pc0FycmF5KHhlKT94ZS5ldmVyeShCdD0+QnQubGVuZ3RoPD0xKSYmQ3QoKTp4ZS5sZW5ndGg8PTEmJkN0KCl9LGx0PXttb2RlOncscGVyc2lzdGVkOkksYmVmb3JlRW50ZXIoeGUpe3ZhciBJdD1MO2lmKCFkLmlzTW91bnRlZClpZih5KUl0PWZ0fHxMO2Vsc2UgcmV0dXJuO3hlLl9sZWF2ZUNiJiZ4ZS5fbGVhdmVDYighMCk7dmFyIEN0PXFlW1NlXTtDdCYmRXIoaSxDdCkmJkN0LmVsLl9sZWF2ZUNiJiZDdC5lbC5fbGVhdmVDYigpLEhlKEl0LFt4ZV0pfSxlbnRlcih4ZSl7dmFyIEl0PSQsQ3Q9ZWUsQnQ9aWU7aWYoIWQuaXNNb3VudGVkKWlmKHkpSXQ9QXR8fCQsQ3Q9bWV8fGVlLEJ0PWxlfHxpZTtlbHNlIHJldHVybjt2YXIgSnQ9ITEsZHQ9eGUuX2VudGVyQ2I9Rj0+e0p0fHwoSnQ9ITAsRj9IZShCdCxbeGVdKTpIZShDdCxbeGVdKSxsdC5kZWxheWVkTGVhdmUmJmx0LmRlbGF5ZWRMZWF2ZSgpLHhlLl9lbnRlckNiPXZvaWQgMCl9O0l0P1JlKEl0LFt4ZSxkdF0pOmR0KCl9LGxlYXZlKHhlLEl0KXt2YXIgQ3Q9U3RyaW5nKGkua2V5KTtpZih4ZS5fZW50ZXJDYiYmeGUuX2VudGVyQ2IoITApLGQuaXNVbm1vdW50aW5nKXJldHVybiBJdCgpO0hlKEllLFt4ZV0pO3ZhciBCdD0hMSxKdD14ZS5fbGVhdmVDYj1kdD0+e0J0fHwoQnQ9ITAsSXQoKSxkdD9IZShCZSxbeGVdKTpIZShDZSxbeGVdKSx4ZS5fbGVhdmVDYj12b2lkIDAscWVbQ3RdPT09aSYmZGVsZXRlIHFlW0N0XSl9O3FlW0N0XT1pLG9lP1JlKG9lLFt4ZSxKdF0pOkp0KCl9LGNsb25lKHhlKXtyZXR1cm4gZmkoeGUscyxkLHApfX07cmV0dXJuIGx0fWZ1bmN0aW9uIGRpKGkpe2lmKG5vKGkpKXJldHVybiBpPWlpKGkpLGkuY2hpbGRyZW49bnVsbCxpfWZ1bmN0aW9uIEt0KGkpe3JldHVybiBubyhpKT9pLmNoaWxkcmVuP2kuY2hpbGRyZW5bMF06dm9pZCAwOml9ZnVuY3Rpb24gV24oaSxzKXtpLnNoYXBlRmxhZyY2JiZpLmNvbXBvbmVudD9XbihpLmNvbXBvbmVudC5zdWJUcmVlLHMpOmkuc2hhcGVGbGFnJjEyOD8oaS5zc0NvbnRlbnQudHJhbnNpdGlvbj1zLmNsb25lKGkuc3NDb250ZW50KSxpLnNzRmFsbGJhY2sudHJhbnNpdGlvbj1zLmNsb25lKGkuc3NGYWxsYmFjaykpOmkudHJhbnNpdGlvbj1zfWZ1bmN0aW9uIE9yKGkpe2Zvcih2YXIgcz1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ITEsZD1hcmd1bWVudHMubGVuZ3RoPjI/YXJndW1lbnRzWzJdOnZvaWQgMCxwPVtdLHk9MCx3PTA7dzxpLmxlbmd0aDt3Kyspe3ZhciBJPWlbd10sTD1kPT1udWxsP0kua2V5OlN0cmluZyhkKStTdHJpbmcoSS5rZXkhPW51bGw/SS5rZXk6dyk7SS50eXBlPT09R2U/KEkucGF0Y2hGbGFnJjEyOCYmeSsrLHA9cC5jb25jYXQoT3IoSS5jaGlsZHJlbixzLEwpKSk6KHN8fEkudHlwZSE9PVZ0KSYmcC5wdXNoKEwhPW51bGw/aWkoSSx7a2V5Okx9KTpJKX1pZih5PjEpZm9yKHZhciAkPTA7JDxwLmxlbmd0aDskKyspcFskXS5wYXRjaEZsYWc9LTI7cmV0dXJuIHB9ZnVuY3Rpb24gSW4oaSl7cmV0dXJuIGYuaXNGdW5jdGlvbihpKT97c2V0dXA6aSxuYW1lOmkubmFtZX06aX12YXIgVGk9aT0+ISFpLnR5cGUuX19hc3luY0xvYWRlcjtmdW5jdGlvbiBrbyhpKXtmLmlzRnVuY3Rpb24oaSkmJihpPXtsb2FkZXI6aX0pO3Zhcntsb2FkZXI6cyxsb2FkaW5nQ29tcG9uZW50OmQsZXJyb3JDb21wb25lbnQ6cCxkZWxheTp5PTIwMCx0aW1lb3V0Oncsc3VzcGVuc2libGU6ST0hMCxvbkVycm9yOkx9PWksJD1udWxsLGVlLGllPTAsSWU9KCk9PihpZSsrLCQ9bnVsbCxvZSgpKSxvZT0oKT0+e3ZhciBDZTtyZXR1cm4gJHx8KENlPSQ9cygpLmNhdGNoKEJlPT57aWYoQmU9QmUgaW5zdGFuY2VvZiBFcnJvcj9CZTpuZXcgRXJyb3IoU3RyaW5nKEJlKSksTClyZXR1cm4gbmV3IFByb21pc2UoKGZ0LEF0KT0+e3ZhciBtZT0oKT0+ZnQoSWUoKSksbGU9KCk9PkF0KEJlKTtMKEJlLG1lLGxlLGllKzEpfSk7dGhyb3cgQmV9KS50aGVuKEJlPT5DZSE9PSQmJiQ/JDooQmUmJihCZS5fX2VzTW9kdWxlfHxCZVtTeW1ib2wudG9TdHJpbmdUYWddPT09Ik1vZHVsZSIpJiYoQmU9QmUuZGVmYXVsdCksZWU9QmUsQmUpKSl9O3JldHVybiBJbih7bmFtZToiQXN5bmNDb21wb25lbnRXcmFwcGVyIixfX2FzeW5jTG9hZGVyOm9lLGdldCBfX2FzeW5jUmVzb2x2ZWQoKXtyZXR1cm4gZWV9LHNldHVwKCl7dmFyIENlPUFuO2lmKGVlKXJldHVybigpPT5oaShlZSxDZSk7dmFyIEJlPWxlPT57JD1udWxsLHRlKGxlLENlLDEzKX07aWYoSSYmQ2Uuc3VzcGVuc2V8fFMuaXNJblNTUkNvbXBvbmVudFNldHVwKXJldHVybiBvZSgpLnRoZW4obGU9PigpPT5oaShsZSxDZSkpLmNhdGNoKGxlPT4oQmUobGUpLCgpPT5wP2ZuKHAse2Vycm9yOmxlfSk6bnVsbCkpO3ZhciBmdD1ULnJlZighMSksQXQ9VC5yZWYoKSxtZT1ULnJlZighIXkpO3JldHVybiB5JiZzZXRUaW1lb3V0KCgpPT57bWUudmFsdWU9ITF9LHkpLHchPW51bGwmJnNldFRpbWVvdXQoKCk9PntpZighZnQudmFsdWUmJiFBdC52YWx1ZSl7dmFyIGxlPW5ldyBFcnJvcigiQXN5bmMgY29tcG9uZW50IHRpbWVkIG91dCBhZnRlciAiLmNvbmNhdCh3LCJtcy4iKSk7QmUobGUpLEF0LnZhbHVlPWxlfX0sdyksb2UoKS50aGVuKCgpPT57ZnQudmFsdWU9ITAsQ2UucGFyZW50JiZubyhDZS5wYXJlbnQudm5vZGUpJiZRdChDZS5wYXJlbnQudXBkYXRlKX0pLmNhdGNoKGxlPT57QmUobGUpLEF0LnZhbHVlPWxlfSksKCk9PntpZihmdC52YWx1ZSYmZWUpcmV0dXJuIGhpKGVlLENlKTtpZihBdC52YWx1ZSYmcClyZXR1cm4gZm4ocCx7ZXJyb3I6QXQudmFsdWV9KTtpZihkJiYhbWUudmFsdWUpcmV0dXJuIGZuKGQpfX19KX1mdW5jdGlvbiBoaShpLHMpe3Zhcnt2bm9kZTp7cmVmOmQscHJvcHM6cCxjaGlsZHJlbjp5LHNoYXBlRmxhZzp3fSxwYXJlbnQ6SX09cyxMPWZuKGkscCx5KTtyZXR1cm4gTC5yZWY9ZCxMfXZhciBubz1pPT5pLnR5cGUuX19pc0tlZXBBbGl2ZSxRbz17bmFtZToiS2VlcEFsaXZlIixfX2lzS2VlcEFsaXZlOiEwLHByb3BzOntpbmNsdWRlOltTdHJpbmcsUmVnRXhwLEFycmF5XSxleGNsdWRlOltTdHJpbmcsUmVnRXhwLEFycmF5XSxtYXg6W1N0cmluZyxOdW1iZXJdfSxzZXR1cChpLHMpe3ZhcntzbG90czpkfT1zLHA9UW4oKSx5PXAuY3R4O2lmKCF5LnJlbmRlcmVyKXJldHVybigpPT57dmFyIFNlPWQuZGVmYXVsdCYmZC5kZWZhdWx0KCk7cmV0dXJuIFNlJiZTZS5sZW5ndGg9PT0xP1NlWzBdOlNlfTt2YXIgdz1uZXcgTWFwLEk9bmV3IFNldCxMPW51bGwsJD1wLnN1c3BlbnNlLHtyZW5kZXJlcjp7cDplZSxtOmllLHVtOkllLG86e2NyZWF0ZUVsZW1lbnQ6b2V9fX09eSxDZT1vZSgiZGl2IixudWxsKTt5LmFjdGl2YXRlPShTZSxxZSxIZSxSZSxsdCk9Pnt2YXIgeGU9U2UuY29tcG9uZW50O2llKFNlLHFlLEhlLDAsJCksZWUoeGUudm5vZGUsU2UscWUsSGUseGUsJCxSZSxTZS5zbG90U2NvcGVJZHMsbHQpLFIoKCk9Pnt4ZS5pc0RlYWN0aXZhdGVkPSExLHhlLmEmJmYuaW52b2tlQXJyYXlGbnMoeGUuYSk7dmFyIEl0PVNlLnByb3BzJiZTZS5wcm9wcy5vblZub2RlTW91bnRlZDtJdCYmRHIoSXQseGUucGFyZW50LFNlKX0sJCl9LHkuZGVhY3RpdmF0ZT1TZT0+e3ZhciBxZT1TZS5jb21wb25lbnQ7aWUoU2UsQ2UsbnVsbCwxLCQpLFIoKCk9PntxZS5kYSYmZi5pbnZva2VBcnJheUZucyhxZS5kYSk7dmFyIEhlPVNlLnByb3BzJiZTZS5wcm9wcy5vblZub2RlVW5tb3VudGVkO0hlJiZEcihIZSxxZS5wYXJlbnQsU2UpLHFlLmlzRGVhY3RpdmF0ZWQ9ITB9LCQpfTtmdW5jdGlvbiBCZShTZSl7SGkoU2UpLEllKFNlLHAsJCwhMCl9ZnVuY3Rpb24gZnQoU2Upe3cuZm9yRWFjaCgocWUsSGUpPT57dmFyIFJlPVN0KHFlLnR5cGUpO1JlJiYoIVNlfHwhU2UoUmUpKSYmQXQoSGUpfSl9ZnVuY3Rpb24gQXQoU2Upe3ZhciBxZT13LmdldChTZSk7IUx8fHFlLnR5cGUhPT1MLnR5cGU/QmUocWUpOkwmJkhpKEwpLHcuZGVsZXRlKFNlKSxJLmRlbGV0ZShTZSl9eWUoKCk9PltpLmluY2x1ZGUsaS5leGNsdWRlXSxTZT0+e3ZhcltxZSxIZV09U2U7cWUmJmZ0KFJlPT5LbihxZSxSZSkpLEhlJiZmdChSZT0+IUtuKEhlLFJlKSl9LHtmbHVzaDoicG9zdCIsZGVlcDohMH0pO3ZhciBtZT1udWxsLGxlPSgpPT57bWUhPW51bGwmJncuc2V0KG1lLHRpKHAuc3ViVHJlZSkpfTtyZXR1cm4gZ2kobGUpLFlyKGxlKSx2aSgoKT0+e3cuZm9yRWFjaChTZT0+e3ZhcntzdWJUcmVlOnFlLHN1c3BlbnNlOkhlfT1wLFJlPXRpKHFlKTtpZihTZS50eXBlPT09UmUudHlwZSl7SGkoUmUpO3ZhciBsdD1SZS5jb21wb25lbnQuZGE7bHQmJlIobHQsSGUpO3JldHVybn1CZShTZSl9KX0pLCgpPT57aWYobWU9bnVsbCwhZC5kZWZhdWx0KXJldHVybiBudWxsO3ZhciBTZT1kLmRlZmF1bHQoKSxxZT1TZVswXTtpZihTZS5sZW5ndGg+MSlyZXR1cm4gTD1udWxsLFNlO2lmKCFvcihxZSl8fCEocWUuc2hhcGVGbGFnJjQpJiYhKHFlLnNoYXBlRmxhZyYxMjgpKXJldHVybiBMPW51bGwscWU7dmFyIEhlPXRpKHFlKSxSZT1IZS50eXBlLGx0PVN0KFRpKEhlKT9IZS50eXBlLl9fYXN5bmNSZXNvbHZlZHx8e306UmUpLHtpbmNsdWRlOnhlLGV4Y2x1ZGU6SXQsbWF4OkN0fT1pO2lmKHhlJiYoIWx0fHwhS24oeGUsbHQpKXx8SXQmJmx0JiZLbihJdCxsdCkpcmV0dXJuIEw9SGUscWU7dmFyIEJ0PUhlLmtleT09bnVsbD9SZTpIZS5rZXksSnQ9dy5nZXQoQnQpO3JldHVybiBIZS5lbCYmKEhlPWlpKEhlKSxxZS5zaGFwZUZsYWcmMTI4JiYocWUuc3NDb250ZW50PUhlKSksbWU9QnQsSnQ/KEhlLmVsPUp0LmVsLEhlLmNvbXBvbmVudD1KdC5jb21wb25lbnQsSGUudHJhbnNpdGlvbiYmV24oSGUsSGUudHJhbnNpdGlvbiksSGUuc2hhcGVGbGFnfD01MTIsSS5kZWxldGUoQnQpLEkuYWRkKEJ0KSk6KEkuYWRkKEJ0KSxDdCYmSS5zaXplPnBhcnNlSW50KEN0LDEwKSYmQXQoSS52YWx1ZXMoKS5uZXh0KCkudmFsdWUpKSxIZS5zaGFwZUZsYWd8PTI1NixMPUhlLEFyKHFlLnR5cGUpP3FlOkhlfX19LFVpPVFvO2Z1bmN0aW9uIEtuKGkscyl7cmV0dXJuIGYuaXNBcnJheShpKT9pLnNvbWUoZD0+S24oZCxzKSk6Zi5pc1N0cmluZyhpKT9pLnNwbGl0KCIsIikuaW5jbHVkZXMocyk6aS50ZXN0P2kudGVzdChzKTohMX1mdW5jdGlvbiBwcihpLHMpe01yKGksImEiLHMpfWZ1bmN0aW9uIEpuKGkscyl7TXIoaSwiZGEiLHMpfWZ1bmN0aW9uIE1yKGkscyl7dmFyIGQ9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOkFuLHA9aS5fX3dkY3x8KGkuX193ZGM9KCk9Pntmb3IodmFyIHc9ZDt3Oyl7aWYody5pc0RlYWN0aXZhdGVkKXJldHVybjt3PXcucGFyZW50fXJldHVybiBpKCl9KTtpZih2cihzLHAsZCksZClmb3IodmFyIHk9ZC5wYXJlbnQ7eSYmeS5wYXJlbnQ7KW5vKHkucGFyZW50LnZub2RlKSYmVHIocCxzLGQseSkseT15LnBhcmVudH1mdW5jdGlvbiBUcihpLHMsZCxwKXt2YXIgeT12cihzLGkscCwhMCk7cm8oKCk9PntmLnJlbW92ZShwW3NdLHkpfSxkKX1mdW5jdGlvbiBIaShpKXt2YXIgcz1pLnNoYXBlRmxhZztzJjI1NiYmKHMtPTI1NikscyY1MTImJihzLT01MTIpLGkuc2hhcGVGbGFnPXN9ZnVuY3Rpb24gdGkoaSl7cmV0dXJuIGkuc2hhcGVGbGFnJjEyOD9pLnNzQ29udGVudDppfWZ1bmN0aW9uIHZyKGkscyl7dmFyIGQ9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOkFuLHA9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiExO2lmKGQpe2lmKE4uaXNSb290SG9vayhpKSYmZCE9PWQucm9vdCYmKGQ9ZC5yb290LE4uaXNSb290SW1tZWRpYXRlSG9vayhpKSkpe3ZhciB5PWQucHJveHk7WShzLmJpbmQoeSksZCxpLE4uT05fTE9BRD09PWk/W3kuJHBhZ2Uub3B0aW9uc106W10pfXZhcntfX3BhZ2VfY29udGFpbmVyX186d309ZC5yb290LnZub2RlO3cmJncub25JbmplY3RIb29rKGkpO3ZhciBJPWRbaV18fChkW2ldPVtdKSxMPXMuX193ZWh8fChzLl9fd2VoPWZ1bmN0aW9uKCl7aWYoIWQuaXNVbm1vdW50ZWQpe1QucGF1c2VUcmFja2luZygpLEZyKGQpO2Zvcih2YXIgJD1hcmd1bWVudHMubGVuZ3RoLGVlPW5ldyBBcnJheSgkKSxpZT0wO2llPCQ7aWUrKyllZVtpZV09YXJndW1lbnRzW2llXTt2YXIgSWU9WShzLGQsaSxlZSk7cmV0dXJuIGtpKCksVC5yZXNldFRyYWNraW5nKCksSWV9fSk7cmV0dXJuIHA/SS51bnNoaWZ0KEwpOkkucHVzaChMKSxMfX12YXIgR3I9aT0+ZnVuY3Rpb24ocyl7dmFyIGQ9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOkFuO3JldHVybighUy5pc0luU1NSQ29tcG9uZW50U2V0dXB8fGk9PT0ic3AiKSYmdnIoaSxzLGQpfSxQaT1HcigiYm0iKSxnaT1HcigibSIpLHBpPUdyKCJidSIpLFlyPUdyKCJ1Iiksdmk9R3IoImJ1bSIpLHJvPUdyKCJ1bSIpLGppPUdyKCJzcCIpLGlvPUdyKCJydGciKSx4PUdyKCJydGMiKTtmdW5jdGlvbiBuZShpKXt2YXIgcz1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06QW47dnIoImVjIixpLHMpfWZ1bmN0aW9uIGRlKGkscyl7dmFyIGQ9T247aWYoZD09PW51bGwpcmV0dXJuIGk7Zm9yKHZhciBwPVJ0KGQpfHxkLnByb3h5LHk9aS5kaXJzfHwoaS5kaXJzPVtdKSx3PTA7dzxzLmxlbmd0aDt3Kyspe3ZhcltJLEwsJCxlZT1mLkVNUFRZX09CSl09c1t3XTtmLmlzRnVuY3Rpb24oSSkmJihJPXttb3VudGVkOkksdXBkYXRlZDpJfSksSS5kZWVwJiZCcihMKSx5LnB1c2goe2RpcjpJLGluc3RhbmNlOnAsdmFsdWU6TCxvbGRWYWx1ZTp2b2lkIDAsYXJnOiQsbW9kaWZpZXJzOmVlfSl9cmV0dXJuIGl9ZnVuY3Rpb24gSChpLHMsZCxwKXtmb3IodmFyIHk9aS5kaXJzLHc9cyYmcy5kaXJzLEk9MDtJPHkubGVuZ3RoO0krKyl7dmFyIEw9eVtJXTt3JiYoTC5vbGRWYWx1ZT13W0ldLnZhbHVlKTt2YXIgJD1MLmRpcltwXTskJiYoVC5wYXVzZVRyYWNraW5nKCksWSgkLGQsOCxbaS5lbCxMLGksc10pLFQucmVzZXRUcmFja2luZygpKX19dmFyIE09ImNvbXBvbmVudHMiLEo9ImRpcmVjdGl2ZXMiO2Z1bmN0aW9uIFgoaSxzKXtyZXR1cm4gY24oTSxpLCEwLHMpfHxpfXZhciB1ZT1TeW1ib2woKTtmdW5jdGlvbiB0bihpKXtyZXR1cm4gZi5pc1N0cmluZyhpKT9jbihNLGksITEpfHxpOml8fHVlfWZ1bmN0aW9uIE1uKGkpe3JldHVybiBjbihKLGkpfWZ1bmN0aW9uIGNuKGkscyl7dmFyIGQ9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiExLHA9T258fEFuO2lmKHApe3ZhciB5PXAudHlwZTtpZihpPT09TSl7dmFyIHc9U3QoeSwhMSk7aWYodyYmKHc9PT1zfHx3PT09Zi5jYW1lbGl6ZShzKXx8dz09PWYuY2FwaXRhbGl6ZShmLmNhbWVsaXplKHMpKSkpcmV0dXJuIHl9dmFyIEk9bmkocFtpXXx8eVtpXSxzKXx8bmkocC5hcHBDb250ZXh0W2ldLHMpO3JldHVybiFJJiZkP3k6SX19ZnVuY3Rpb24gbmkoaSxzKXtyZXR1cm4gaSYmKGlbc118fGlbZi5jYW1lbGl6ZShzKV18fGlbZi5jYXBpdGFsaXplKGYuY2FtZWxpemUocykpXSl9ZnVuY3Rpb24gbXIoaSxzLGQscCl7dmFyIHksdz1kJiZkW3BdO2lmKGYuaXNBcnJheShpKXx8Zi5pc1N0cmluZyhpKSl7eT1uZXcgQXJyYXkoaS5sZW5ndGgpO2Zvcih2YXIgST0wLEw9aS5sZW5ndGg7STxMO0krKyl5W0ldPXMoaVtJXSxJLHZvaWQgMCx3JiZ3W0ldKX1lbHNlIGlmKHR5cGVvZiBpPT0ibnVtYmVyIil7eT1uZXcgQXJyYXkoaSk7Zm9yKHZhciAkPTA7JDxpOyQrKyl5WyRdPXMoJCsxLCQsdm9pZCAwLHcmJndbJF0pfWVsc2UgaWYoZi5pc09iamVjdChpKSlpZihpW1N5bWJvbC5pdGVyYXRvcl0peT1BcnJheS5mcm9tKGksKENlLEJlKT0+cyhDZSxCZSx2b2lkIDAsdyYmd1tCZV0pKTtlbHNle3ZhciBlZT1PYmplY3Qua2V5cyhpKTt5PW5ldyBBcnJheShlZS5sZW5ndGgpO2Zvcih2YXIgaWU9MCxJZT1lZS5sZW5ndGg7aWU8SWU7aWUrKyl7dmFyIG9lPWVlW2llXTt5W2llXT1zKGlbb2VdLG9lLGllLHcmJndbaWVdKX19ZWxzZSB5PVtdO3JldHVybiBkJiYoZFtwXT15KSx5fWZ1bmN0aW9uIGVhKGkscyl7Zm9yKHZhciBkPTA7ZDxzLmxlbmd0aDtkKyspe3ZhciBwPXNbZF07aWYoZi5pc0FycmF5KHApKWZvcih2YXIgeT0wO3k8cC5sZW5ndGg7eSsrKWlbcFt5XS5uYW1lXT1wW3ldLmZuO2Vsc2UgcCYmKGlbcC5uYW1lXT1wLmZuKX1yZXR1cm4gaX1mdW5jdGlvbiB6byhpLHMpe3ZhciBkPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTp7fSxwPWFyZ3VtZW50cy5sZW5ndGg+Mz9hcmd1bWVudHNbM106dm9pZCAwLHk9YXJndW1lbnRzLmxlbmd0aD40P2FyZ3VtZW50c1s0XTp2b2lkIDA7aWYoT24uaXNDRXx8T24ucGFyZW50JiZUaShPbi5wYXJlbnQpJiZPbi5wYXJlbnQuaXNDRSlyZXR1cm4gZm4oInNsb3QiLHM9PT0iZGVmYXVsdCI/bnVsbDp7bmFtZTpzfSxwJiZwKCkpO3ZhciB3PWlbc107dyYmdy5fYyYmKHcuX2Q9ITEpLHduKCk7dmFyIEk9dyYmdGEodyhkKSksTD1taShHZSx7a2V5OmQua2V5fHwiXyIuY29uY2F0KHMpfSxJfHwocD9wKCk6W10pLEkmJmkuXz09PTE/NjQ6LTIpO3JldHVybiF5JiZMLnNjb3BlSWQmJihMLnNsb3RTY29wZUlkcz1bTC5zY29wZUlkKyItcyJdKSx3JiZ3Ll9jJiYody5fZD0hMCksTH1mdW5jdGlvbiB0YShpKXtyZXR1cm4gaS5zb21lKHM9Pm9yKHMpPyEocy50eXBlPT09VnR8fHMudHlwZT09PUdlJiYhdGEocy5jaGlsZHJlbikpOiEwKT9pOm51bGx9ZnVuY3Rpb24gUm8oaSl7dmFyIHM9e307Zm9yKHZhciBkIGluIGkpc1tmLnRvSGFuZGxlcktleShkKV09aVtkXTtyZXR1cm4gc312YXIgYm89aT0+aT9haShpKT9SdChpKXx8aS5wcm94eTpibyhpLnBhcmVudCk6bnVsbCxvbz1mLmV4dGVuZChPYmplY3QuY3JlYXRlKG51bGwpLHskOmk9PmksJGVsOmk9Pmkudm5vZGUuZWwsJGRhdGE6aT0+aS5kYXRhLCRwcm9wczppPT5pLnByb3BzLCRhdHRyczppPT5pLmF0dHJzLCRzbG90czppPT5pLnNsb3RzLCRyZWZzOmk9PmkucmVmcywkcGFyZW50Omk9PmJvKGkucGFyZW50KSwkcm9vdDppPT5ibyhpLnJvb3QpLCRlbWl0Omk9PmkuZW1pdCwkb3B0aW9uczppPT5fcihpKSwkZm9yY2VVcGRhdGU6aT0+aS5mfHwoaS5mPSgpPT5RdChpLnVwZGF0ZSkpLCRuZXh0VGljazppPT5pLm58fChpLm49cXQuYmluZChpLnByb3h5KSksJHdhdGNoOmk9PiRpLmJpbmQoaSl9KSxSYT17Z2V0KGkscyl7dmFye186ZH09aSx7Y3R4OnAsc2V0dXBTdGF0ZTp5LGRhdGE6dyxwcm9wczpJLGFjY2Vzc0NhY2hlOkwsdHlwZTokLGFwcENvbnRleHQ6ZWV9PWQsaWU7aWYoc1swXSE9PSIkIil7dmFyIEllPUxbc107aWYoSWUhPT12b2lkIDApc3dpdGNoKEllKXtjYXNlIDE6cmV0dXJuIHlbc107Y2FzZSAyOnJldHVybiB3W3NdO2Nhc2UgNDpyZXR1cm4gcFtzXTtjYXNlIDM6cmV0dXJuIElbc119ZWxzZXtpZih5IT09Zi5FTVBUWV9PQkomJmYuaGFzT3duKHkscykpcmV0dXJuIExbc109MSx5W3NdO2lmKHchPT1mLkVNUFRZX09CSiYmZi5oYXNPd24odyxzKSlyZXR1cm4gTFtzXT0yLHdbc107aWYoKGllPWQucHJvcHNPcHRpb25zWzBdKSYmZi5oYXNPd24oaWUscykpcmV0dXJuIExbc109MyxJW3NdO2lmKHAhPT1mLkVNUFRZX09CSiYmZi5oYXNPd24ocCxzKSlyZXR1cm4gTFtzXT00LHBbc107X2EmJihMW3NdPTApfX12YXIgb2U9b29bc10sQ2UsQmU7aWYob2UpcmV0dXJuIHM9PT0iJGF0dHJzIiYmVC50cmFjayhkLCJnZXQiLHMpLG9lKGQpO2lmKChDZT0kLl9fY3NzTW9kdWxlcykmJihDZT1DZVtzXSkpcmV0dXJuIENlO2lmKHAhPT1mLkVNUFRZX09CSiYmZi5oYXNPd24ocCxzKSlyZXR1cm4gTFtzXT00LHBbc107aWYoQmU9ZWUuY29uZmlnLmdsb2JhbFByb3BlcnRpZXMsZi5oYXNPd24oQmUscykpcmV0dXJuIEJlW3NdfSxzZXQoaSxzLGQpe3ZhcntfOnB9PWkse2RhdGE6eSxzZXR1cFN0YXRlOncsY3R4Okl9PXA7cmV0dXJuIHchPT1mLkVNUFRZX09CSiYmZi5oYXNPd24odyxzKT8od1tzXT1kLCEwKTp5IT09Zi5FTVBUWV9PQkomJmYuaGFzT3duKHkscyk/KHlbc109ZCwhMCk6Zi5oYXNPd24ocC5wcm9wcyxzKXx8c1swXT09PSIkIiYmcy5zbGljZSgxKWluIHA/ITE6KElbc109ZCwhMCl9LGhhcyhpLHMpe3ZhcntfOntkYXRhOmQsc2V0dXBTdGF0ZTpwLGFjY2Vzc0NhY2hlOnksY3R4OncsYXBwQ29udGV4dDpJLHByb3BzT3B0aW9uczpMfX09aSwkO3JldHVybiEheVtzXXx8ZCE9PWYuRU1QVFlfT0JKJiZmLmhhc093bihkLHMpfHxwIT09Zi5FTVBUWV9PQkomJmYuaGFzT3duKHAscyl8fCgkPUxbMF0pJiZmLmhhc093bigkLHMpfHxmLmhhc093bih3LHMpfHxmLmhhc093bihvbyxzKXx8Zi5oYXNPd24oSS5jb25maWcuZ2xvYmFsUHJvcGVydGllcyxzKX0sZGVmaW5lUHJvcGVydHkoaSxzLGQpe3JldHVybiBkLmdldCE9bnVsbD9pLl8uYWNjZXNzQ2FjaGVbc109MDpmLmhhc093bihkLCJ2YWx1ZSIpJiZ0aGlzLnNldChpLHMsZC52YWx1ZSxudWxsKSxSZWZsZWN0LmRlZmluZVByb3BlcnR5KGkscyxkKX19LG5hPWYuZXh0ZW5kKHt9LFJhLHtnZXQoaSxzKXtpZihzIT09U3ltYm9sLnVuc2NvcGFibGVzKXJldHVybiBSYS5nZXQoaSxzLGkpfSxoYXMoaSxzKXt2YXIgZD1zWzBdIT09Il8iJiYhZi5pc0dsb2JhbGx5V2hpdGVsaXN0ZWQocyk7cmV0dXJuIGR9fSksX2E9ITA7ZnVuY3Rpb24gdHMoaSl7dmFyIHM9X3IoaSksZD1pLnByb3h5LHA9aS5jdHg7X2E9ITEscy5iZWZvcmVDcmVhdGUmJnhhKHMuYmVmb3JlQ3JlYXRlLGksImJjIik7dmFye2RhdGE6eSxjb21wdXRlZDp3LG1ldGhvZHM6SSx3YXRjaDpMLHByb3ZpZGU6JCxpbmplY3Q6ZWUsY3JlYXRlZDppZSxiZWZvcmVNb3VudDpJZSxtb3VudGVkOm9lLGJlZm9yZVVwZGF0ZTpDZSx1cGRhdGVkOkJlLGFjdGl2YXRlZDpmdCxkZWFjdGl2YXRlZDpBdCxiZWZvcmVEZXN0cm95Om1lLGJlZm9yZVVubW91bnQ6bGUsZGVzdHJveWVkOlNlLHVubW91bnRlZDpxZSxyZW5kZXI6SGUscmVuZGVyVHJhY2tlZDpSZSxyZW5kZXJUcmlnZ2VyZWQ6bHQsZXJyb3JDYXB0dXJlZDp4ZSxzZXJ2ZXJQcmVmZXRjaDpJdCxleHBvc2U6Q3QsaW5oZXJpdEF0dHJzOkJ0LGNvbXBvbmVudHM6SnQsZGlyZWN0aXZlczpkdCxmaWx0ZXJzOkZ9PXMsSz1udWxsO2lmKGVlJiZyYShlZSxwLEssaS5hcHBDb250ZXh0LmNvbmZpZy51bndyYXBJbmplY3RlZFJlZiksSSlmb3IodmFyIGhlIGluIEkpe3ZhciBwZT1JW2hlXTtmLmlzRnVuY3Rpb24ocGUpJiYocFtoZV09cGUuYmluZChkKSl9aWYoeSl7dmFyIFBlPXkuY2FsbChkLGQpO2YuaXNPYmplY3QoUGUpJiYoaS5kYXRhPVQucmVhY3RpdmUoUGUpKX1pZihfYT0hMCx3KXt2YXIgS2U9ZnVuY3Rpb24oYXQpe3ZhciBvdD13W2F0XSxkbj1mLmlzRnVuY3Rpb24ob3QpP290LmJpbmQoZCxkKTpmLmlzRnVuY3Rpb24ob3QuZ2V0KT9vdC5nZXQuYmluZChkLGQpOmYuTk9PUCxibj0hZi5pc0Z1bmN0aW9uKG90KSYmZi5pc0Z1bmN0aW9uKG90LnNldCk/b3Quc2V0LmJpbmQoZCk6Zi5OT09QLHRyPWNhKHtnZXQ6ZG4sc2V0OmJufSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHAsYXQse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDooKT0+dHIudmFsdWUsc2V0OlBuPT50ci52YWx1ZT1Qbn0pfTtmb3IodmFyIGN0IGluIHcpS2UoY3QpfWlmKEwpZm9yKHZhciBRZSBpbiBMKWZyKExbUWVdLHAsZCxRZSk7aWYoJCl7dmFyIEplPWYuaXNGdW5jdGlvbigkKT8kLmNhbGwoZCk6JDtSZWZsZWN0Lm93bktleXMoSmUpLmZvckVhY2goYXQ9PntBaShhdCxKZVthdF0pfSl9aWUmJnhhKGllLGksImMiKTtmdW5jdGlvbiBEZShhdCxvdCl7Zi5pc0FycmF5KG90KT9vdC5mb3JFYWNoKGRuPT5hdChkbi5iaW5kKGQpKSk6b3QmJmF0KG90LmJpbmQoZCkpfWlmKERlKFBpLEllKSxEZShnaSxvZSksRGUocGksQ2UpLERlKFlyLEJlKSxEZShwcixmdCksRGUoSm4sQXQpLERlKG5lLHhlKSxEZSh4LFJlKSxEZShpbyxsdCksRGUodmksbGUpLERlKHJvLHFlKSxEZShqaSxJdCksZi5pc0FycmF5KEN0KSlpZihDdC5sZW5ndGgpe3ZhciB5dD1pLmV4cG9zZWR8fChpLmV4cG9zZWQ9e30pO0N0LmZvckVhY2goYXQ9PntPYmplY3QuZGVmaW5lUHJvcGVydHkoeXQsYXQse2dldDooKT0+ZFthdF0sc2V0Om90PT5kW2F0XT1vdH0pfSl9ZWxzZSBpLmV4cG9zZWR8fChpLmV4cG9zZWQ9e30pO0hlJiZpLnJlbmRlcj09PWYuTk9PUCYmKGkucmVuZGVyPUhlKSxCdCE9bnVsbCYmKGkuaW5oZXJpdEF0dHJzPUJ0KSxKdCYmKGkuY29tcG9uZW50cz1KdCksZHQmJihpLmRpcmVjdGl2ZXM9ZHQpO3ZhciB3dD1pLmFwcENvbnRleHQuY29uZmlnLmdsb2JhbFByb3BlcnRpZXMuJGFwcGx5T3B0aW9uczt3dCYmd3QocyxpLGQpfWZ1bmN0aW9uIHJhKGkscyl7dmFyIGQ9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiExO2YuaXNBcnJheShpKSYmKGk9YnIoaSkpO3ZhciBwPWZ1bmN0aW9uKHcpe3ZhciBJPWlbd10sTD12b2lkIDA7Zi5pc09iamVjdChJKT8iZGVmYXVsdCJpbiBJP0w9dWkoSS5mcm9tfHx3LEkuZGVmYXVsdCwhMCk6TD11aShJLmZyb218fHcpOkw9dWkoSSksVC5pc1JlZihMKSYmZD9PYmplY3QuZGVmaW5lUHJvcGVydHkocyx3LHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6KCk9PkwudmFsdWUsc2V0OiQ9PkwudmFsdWU9JH0pOnNbd109TH07Zm9yKHZhciB5IGluIGkpcCh5KX1mdW5jdGlvbiB4YShpLHMsZCl7WShmLmlzQXJyYXkoaSk/aS5tYXAocD0+cC5iaW5kKHMucHJveHkpKTppLmJpbmQocy5wcm94eSkscyxkKX1mdW5jdGlvbiBmcihpLHMsZCxwKXt2YXIgeT1wLmluY2x1ZGVzKCIuIik/V3IoZCxwKTooKT0+ZFtwXTtpZihmLmlzU3RyaW5nKGkpKXt2YXIgdz1zW2ldO2YuaXNGdW5jdGlvbih3KSYmeWUoeSx3KX1lbHNlIGlmKGYuaXNGdW5jdGlvbihpKSl5ZSh5LGkuYmluZChkKSk7ZWxzZSBpZihmLmlzT2JqZWN0KGkpKWlmKGYuaXNBcnJheShpKSlpLmZvckVhY2goTD0+ZnIoTCxzLGQscCkpO2Vsc2V7dmFyIEk9Zi5pc0Z1bmN0aW9uKGkuaGFuZGxlcik/aS5oYW5kbGVyLmJpbmQoZCk6c1tpLmhhbmRsZXJdO2YuaXNGdW5jdGlvbihJKSYmeWUoeSxJLGkpfX1mdW5jdGlvbiBfcihpKXt2YXIgcz1pLnR5cGUse21peGluczpkLGV4dGVuZHM6cH09cyx7bWl4aW5zOnksb3B0aW9uc0NhY2hlOncsY29uZmlnOntvcHRpb25NZXJnZVN0cmF0ZWdpZXM6SX19PWkuYXBwQ29udGV4dCxMPXcuZ2V0KHMpLCQ7cmV0dXJuIEw/JD1MOiF5Lmxlbmd0aCYmIWQmJiFwPyQ9czooJD17fSx5Lmxlbmd0aCYmeS5mb3JFYWNoKGVlPT5pYSgkLGVlLEksITApKSxpYSgkLHMsSSkpLHcuc2V0KHMsJCksJH1mdW5jdGlvbiBpYShpLHMsZCl7dmFyIHA9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiExLHttaXhpbnM6eSxleHRlbmRzOnd9PXM7dyYmaWEoaSx3LGQsITApLHkmJnkuZm9yRWFjaCgkPT5pYShpLCQsZCwhMCkpO2Zvcih2YXIgSSBpbiBzKWlmKCEocCYmST09PSJleHBvc2UiKSl7dmFyIEw9QmFbSV18fGQmJmRbSV07aVtJXT1MP0woaVtJXSxzW0ldKTpzW0ldfXJldHVybiBpfXZhciBCYT17ZGF0YTpMcixwcm9wczp4byxlbWl0czp4byxtZXRob2RzOnhvLGNvbXB1dGVkOnhvLGJlZm9yZUNyZWF0ZTpabixjcmVhdGVkOlpuLGJlZm9yZU1vdW50OlpuLG1vdW50ZWQ6Wm4sYmVmb3JlVXBkYXRlOlpuLHVwZGF0ZWQ6Wm4sYmVmb3JlRGVzdHJveTpabixiZWZvcmVVbm1vdW50OlpuLGRlc3Ryb3llZDpabix1bm1vdW50ZWQ6Wm4sYWN0aXZhdGVkOlpuLGRlYWN0aXZhdGVkOlpuLGVycm9yQ2FwdHVyZWQ6Wm4sc2VydmVyUHJlZmV0Y2g6Wm4sY29tcG9uZW50czp4byxkaXJlY3RpdmVzOnhvLHdhdGNoOkNzLHByb3ZpZGU6THIsaW5qZWN0Ok1hfTtmdW5jdGlvbiBMcihpLHMpe3JldHVybiBzP2k/ZnVuY3Rpb24oKXtyZXR1cm4gZi5leHRlbmQoZi5pc0Z1bmN0aW9uKGkpP2kuY2FsbCh0aGlzLHRoaXMpOmksZi5pc0Z1bmN0aW9uKHMpP3MuY2FsbCh0aGlzLHRoaXMpOnMpfTpzOml9ZnVuY3Rpb24gTWEoaSxzKXtyZXR1cm4geG8oYnIoaSksYnIocykpfWZ1bmN0aW9uIGJyKGkpe2lmKGYuaXNBcnJheShpKSl7Zm9yKHZhciBzPXt9LGQ9MDtkPGkubGVuZ3RoO2QrKylzW2lbZF1dPWlbZF07cmV0dXJuIHN9cmV0dXJuIGl9ZnVuY3Rpb24gWm4oaSxzKXtyZXR1cm4gaT9bLi4ubmV3IFNldChbXS5jb25jYXQoaSxzKSldOnN9ZnVuY3Rpb24geG8oaSxzKXtyZXR1cm4gaT9mLmV4dGVuZChmLmV4dGVuZChPYmplY3QuY3JlYXRlKG51bGwpLGkpLHMpOnN9ZnVuY3Rpb24gQ3MoaSxzKXtpZighaSlyZXR1cm4gcztpZighcylyZXR1cm4gaTt2YXIgZD1mLmV4dGVuZChPYmplY3QuY3JlYXRlKG51bGwpLGkpO2Zvcih2YXIgcCBpbiBzKWRbcF09Wm4oaVtwXSxzW3BdKTtyZXR1cm4gZH1mdW5jdGlvbiBXbyhpLHMsZCl7dmFyIHA9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiExLHk9e30sdz17fTtmLmRlZih3LFdpLDEpLGkucHJvcHNEZWZhdWx0cz1PYmplY3QuY3JlYXRlKG51bGwpLGpuKGkscyx5LHcpO2Zvcih2YXIgSSBpbiBpLnByb3BzT3B0aW9uc1swXSlJIGluIHl8fCh5W0ldPXZvaWQgMCk7ZD9pLnByb3BzPXA/eTpULnNoYWxsb3dSZWFjdGl2ZSh5KTppLnR5cGUucHJvcHM/aS5wcm9wcz15OmkucHJvcHM9dyxpLmF0dHJzPXd9ZnVuY3Rpb24gbnMoaSxzLGQscCl7dmFye3Byb3BzOnksYXR0cnM6dyx2bm9kZTp7cGF0Y2hGbGFnOkl9fT1pLEw9VC50b1Jhdyh5KSxbJF09aS5wcm9wc09wdGlvbnMsZWU9ITE7aWYoKHB8fEk+MCkmJiEoSSYxNikpe2lmKEkmOClmb3IodmFyIGllPWkudm5vZGUuZHluYW1pY1Byb3BzLEllPTA7SWU8aWUubGVuZ3RoO0llKyspe3ZhciBvZT1pZVtJZV07aWYoIUNuKGkuZW1pdHNPcHRpb25zLG9lKSl7dmFyIENlPXNbb2VdO2lmKCQpaWYoZi5oYXNPd24odyxvZSkpQ2UhPT13W29lXSYmKHdbb2VdPUNlLGVlPSEwKTtlbHNle3ZhciBCZT1mLmNhbWVsaXplKG9lKTt5W0JlXT1iYSgkLEwsQmUsQ2UsaSwhMSl9ZWxzZSBDZSE9PXdbb2VdJiYod1tvZV09Q2UsZWU9ITApfX19ZWxzZXtqbihpLHMseSx3KSYmKGVlPSEwKTt2YXIgZnQ7Zm9yKHZhciBBdCBpbiBMKSghc3x8IWYuaGFzT3duKHMsQXQpJiYoKGZ0PWYuaHlwaGVuYXRlKEF0KSk9PT1BdHx8IWYuaGFzT3duKHMsZnQpKSkmJigkP2QmJihkW0F0XSE9PXZvaWQgMHx8ZFtmdF0hPT12b2lkIDApJiYoeVtBdF09YmEoJCxMLEF0LHZvaWQgMCxpLCEwKSk6ZGVsZXRlIHlbQXRdKTtpZih3IT09TClmb3IodmFyIG1lIGluIHcpKCFzfHwhZi5oYXNPd24ocyxtZSkmJiEwKSYmKGRlbGV0ZSB3W21lXSxlZT0hMCl9ZWUmJlQudHJpZ2dlcihpLCJzZXQiLCIkYXR0cnMiKX1mdW5jdGlvbiBqbihpLHMsZCxwKXt2YXJbeSx3XT1pLnByb3BzT3B0aW9ucyxJPSExLEw7aWYocyl7Zm9yKHZhciAkIGluIHMpaWYoIWYuaXNSZXNlcnZlZFByb3AoJCkpe3ZhciBlZT1zWyRdLGllPXZvaWQgMDt5JiZmLmhhc093bih5LGllPWYuY2FtZWxpemUoJCkpPyF3fHwhdy5pbmNsdWRlcyhpZSk/ZFtpZV09ZWU6KEx8fChMPXt9KSlbaWVdPWVlOkNuKGkuZW1pdHNPcHRpb25zLCQpfHwoISgkIGluIHApfHxlZSE9PXBbJF0pJiYocFskXT1lZSxJPSEwKX19aWYodylmb3IodmFyIEllPVQudG9SYXcoZCksb2U9THx8Zi5FTVBUWV9PQkosQ2U9MDtDZTx3Lmxlbmd0aDtDZSsrKXt2YXIgQmU9d1tDZV07ZFtCZV09YmEoeSxJZSxCZSxvZVtCZV0saSwhZi5oYXNPd24ob2UsQmUpKX1yZXR1cm4gSX1mdW5jdGlvbiBiYShpLHMsZCxwLHksdyl7dmFyIEk9aVtkXTtpZihJIT1udWxsKXt2YXIgTD1mLmhhc093bihJLCJkZWZhdWx0Iik7aWYoTCYmcD09PXZvaWQgMCl7dmFyICQ9SS5kZWZhdWx0O2lmKEkudHlwZSE9PUZ1bmN0aW9uJiZmLmlzRnVuY3Rpb24oJCkpe3Zhcntwcm9wc0RlZmF1bHRzOmVlfT15O2QgaW4gZWU/cD1lZVtkXTooRnIoeSkscD1lZVtkXT0kLmNhbGwobnVsbCxzKSxraSgpKX1lbHNlIHA9JH1JWzBdJiYodyYmIUw/cD0hMTpJWzFdJiYocD09PSIifHxwPT09Zi5oeXBoZW5hdGUoZCkpJiYocD0hMCkpfXJldHVybiBwfWZ1bmN0aW9uIEdvKGkscyl7dmFyIGQ9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOiExLHA9cy5wcm9wc0NhY2hlLHk9cC5nZXQoaSk7aWYoeSlyZXR1cm4geTt2YXIgdz1pLnByb3BzLEk9e30sTD1bXSwkPSExO2lmKCFmLmlzRnVuY3Rpb24oaSkpe3ZhciBlZT1TZT0+eyQ9ITA7dmFyW3FlLEhlXT1HbyhTZSxzLCEwKTtmLmV4dGVuZChJLHFlKSxIZSYmTC5wdXNoKC4uLkhlKX07IWQmJnMubWl4aW5zLmxlbmd0aCYmcy5taXhpbnMuZm9yRWFjaChlZSksaS5leHRlbmRzJiZlZShpLmV4dGVuZHMpLGkubWl4aW5zJiZpLm1peGlucy5mb3JFYWNoKGVlKX1pZighdyYmISQpcmV0dXJuIHAuc2V0KGksZi5FTVBUWV9BUlIpLGYuRU1QVFlfQVJSO2lmKGYuaXNBcnJheSh3KSlmb3IodmFyIGllPTA7aWU8dy5sZW5ndGg7aWUrKyl7dmFyIEllPWYuY2FtZWxpemUod1tpZV0pO0lpKEllKSYmKElbSWVdPWYuRU1QVFlfT0JKKX1lbHNlIGlmKHcpZm9yKHZhciBvZSBpbiB3KXt2YXIgQ2U9Zi5jYW1lbGl6ZShvZSk7aWYoSWkoQ2UpKXt2YXIgQmU9d1tvZV0sZnQ9SVtDZV09Zi5pc0FycmF5KEJlKXx8Zi5pc0Z1bmN0aW9uKEJlKT97dHlwZTpCZX06QmU7aWYoZnQpe3ZhciBBdD1hbyhCb29sZWFuLGZ0LnR5cGUpLG1lPWFvKFN0cmluZyxmdC50eXBlKTtmdFswXT1BdD4tMSxmdFsxXT1tZTwwfHxBdDxtZSwoQXQ+LTF8fGYuaGFzT3duKGZ0LCJkZWZhdWx0IikpJiZMLnB1c2goQ2UpfX19dmFyIGxlPVtJLExdO3JldHVybiBwLnNldChpLGxlKSxsZX1mdW5jdGlvbiBJaShpKXtyZXR1cm4gaVswXSE9PSIkIn1mdW5jdGlvbiBFYShpKXt2YXIgcz1pJiZpLnRvU3RyaW5nKCkubWF0Y2goL15ccypmdW5jdGlvbiAoXHcrKS8pO3JldHVybiBzP3NbMV06aT09PW51bGw/Im51bGwiOiIifWZ1bmN0aW9uIExhKGkscyl7cmV0dXJuIEVhKGkpPT09RWEocyl9ZnVuY3Rpb24gYW8oaSxzKXtyZXR1cm4gZi5pc0FycmF5KHMpP3MuZmluZEluZGV4KGQ9PkxhKGQsaSkpOmYuaXNGdW5jdGlvbihzKSYmTGEocyxpKT8wOi0xfXZhciBvYT1pPT5pWzBdPT09Il8ifHxpPT09IiRzdGFibGUiLEVvPWk9PmYuaXNBcnJheShpKT9pLm1hcChZdCk6W1l0KGkpXSx6aT0oaSxzLGQpPT57aWYocy5fbilyZXR1cm4gczt2YXIgcD1jcihmdW5jdGlvbigpe3JldHVybiBFbyhzKC4uLmFyZ3VtZW50cykpfSxkKTtyZXR1cm4gcC5fYz0hMSxwfSx5YT0oaSxzLGQpPT57dmFyIHA9aS5fY3R4O2Zvcih2YXIgeSBpbiBpKWlmKCFvYSh5KSl7dmFyIHc9aVt5XTtmLmlzRnVuY3Rpb24odyk/c1t5XT16aSh5LHcscCk6dyE9bnVsbCYmZnVuY3Rpb24oKXt2YXIgST1Fbyh3KTtzW3ldPSgpPT5JfSgpfX0sYWE9KGkscyk9Pnt2YXIgZD1FbyhzKTtpLnNsb3RzLmRlZmF1bHQ9KCk9PmR9LHdhPShpLHMpPT57aWYoaS52bm9kZS5zaGFwZUZsYWcmMzIpe3ZhciBkPXMuXztkPyhpLnNsb3RzPVQudG9SYXcocyksZi5kZWYocywiXyIsZCkpOnlhKHMsaS5zbG90cz17fSl9ZWxzZSBpLnNsb3RzPXt9LHMmJmFhKGkscyk7Zi5kZWYoaS5zbG90cyxXaSwxKX0sc2E9KGkscyxkKT0+e3Zhcnt2bm9kZTpwLHNsb3RzOnl9PWksdz0hMCxJPWYuRU1QVFlfT0JKO2lmKHAuc2hhcGVGbGFnJjMyKXt2YXIgTD1zLl87TD9kJiZMPT09MT93PSExOihmLmV4dGVuZCh5LHMpLCFkJiZMPT09MSYmZGVsZXRlIHkuXyk6KHc9IXMuJHN0YWJsZSx5YShzLHkpKSxJPXN9ZWxzZSBzJiYoYWEoaSxzKSxJPXtkZWZhdWx0OjF9KTtpZih3KWZvcih2YXIgJCBpbiB5KSFvYSgkKSYmISgkIGluIEkpJiZkZWxldGUgeVskXX07ZnVuY3Rpb24gU2EoKXtyZXR1cm57YXBwOm51bGwsY29uZmlnOntpc05hdGl2ZVRhZzpmLk5PLHBlcmZvcm1hbmNlOiExLGdsb2JhbFByb3BlcnRpZXM6e30sb3B0aW9uTWVyZ2VTdHJhdGVnaWVzOnt9LGVycm9ySGFuZGxlcjp2b2lkIDAsd2FybkhhbmRsZXI6dm9pZCAwLGNvbXBpbGVyT3B0aW9uczp7fX0sbWl4aW5zOltdLGNvbXBvbmVudHM6e30sZGlyZWN0aXZlczp7fSxwcm92aWRlczpPYmplY3QuY3JlYXRlKG51bGwpLG9wdGlvbnNDYWNoZTpuZXcgV2Vha01hcCxwcm9wc0NhY2hlOm5ldyBXZWFrTWFwLGVtaXRzQ2FjaGU6bmV3IFdlYWtNYXB9fXZhciBPcz0wO2Z1bmN0aW9uIHNvKGkscyl7cmV0dXJuIGZ1bmN0aW9uKHApe3ZhciB5PWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTpudWxsO2YuaXNGdW5jdGlvbihwKXx8KHA9T2JqZWN0LmFzc2lnbih7fSxwKSkseSE9bnVsbCYmIWYuaXNPYmplY3QoeSkmJih5PW51bGwpO3ZhciB3PVNhKCksST1uZXcgU2V0LEw9ITEsJD13LmFwcD17X3VpZDpPcysrLF9jb21wb25lbnQ6cCxfcHJvcHM6eSxfY29udGFpbmVyOm51bGwsX2NvbnRleHQ6dyxfaW5zdGFuY2U6bnVsbCx2ZXJzaW9uOnNzLGdldCBjb25maWcoKXtyZXR1cm4gdy5jb25maWd9LHNldCBjb25maWcoZWUpe30sdXNlKGVlKXtmb3IodmFyIGllPWFyZ3VtZW50cy5sZW5ndGgsSWU9bmV3IEFycmF5KGllPjE/aWUtMTowKSxvZT0xO29lPGllO29lKyspSWVbb2UtMV09YXJndW1lbnRzW29lXTtyZXR1cm4gSS5oYXMoZWUpfHwoZWUmJmYuaXNGdW5jdGlvbihlZS5pbnN0YWxsKT8oSS5hZGQoZWUpLGVlLmluc3RhbGwoJCwuLi5JZSkpOmYuaXNGdW5jdGlvbihlZSkmJihJLmFkZChlZSksZWUoJCwuLi5JZSkpKSwkfSxtaXhpbihlZSl7cmV0dXJuIHcubWl4aW5zLmluY2x1ZGVzKGVlKXx8dy5taXhpbnMucHVzaChlZSksJH0sY29tcG9uZW50KGVlLGllKXtyZXR1cm4gaWU/KHcuY29tcG9uZW50c1tlZV09aWUsJCk6dy5jb21wb25lbnRzW2VlXX0sZGlyZWN0aXZlKGVlLGllKXtyZXR1cm4gaWU/KHcuZGlyZWN0aXZlc1tlZV09aWUsJCk6dy5kaXJlY3RpdmVzW2VlXX0sbW91bnQoZWUsaWUsSWUpe2lmKCFMKXt2YXIgb2U9Zm4ocCx5KTtyZXR1cm4gb2UuYXBwQ29udGV4dD13LGllJiZzP3Mob2UsZWUpOmkob2UsZWUsSWUpLEw9ITAsJC5fY29udGFpbmVyPWVlLGVlLl9fdnVlX2FwcF9fPSQsJC5faW5zdGFuY2U9b2UuY29tcG9uZW50LFJ0KG9lLmNvbXBvbmVudCl8fG9lLmNvbXBvbmVudC5wcm94eX19LHVubW91bnQoKXtMJiYoaShudWxsLCQuX2NvbnRhaW5lciksZGVsZXRlICQuX2NvbnRhaW5lci5fX3Z1ZV9hcHBfXyl9LHByb3ZpZGUoZWUsaWUpe3JldHVybiB3LnByb3ZpZGVzW2VlXT1pZSwkfX07cmV0dXJuICR9fWZ1bmN0aW9uIHJpKGkscyxkLHApe3ZhciB5PWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTohMTtpZihmLmlzQXJyYXkoaSkpe2kuZm9yRWFjaCgoZnQsQXQpPT5yaShmdCxzJiYoZi5pc0FycmF5KHMpP3NbQXRdOnMpLGQscCx5KSk7cmV0dXJufWlmKCEoVGkocCkmJiF5KSl7dmFyIHc9cC5zaGFwZUZsYWcmND9SdChwLmNvbXBvbmVudCl8fHAuY29tcG9uZW50LnByb3h5OnAuZWwsST15P251bGw6dyx7aTpMLHI6JH09aSxlZT1zJiZzLnIsaWU9TC5yZWZzPT09Zi5FTVBUWV9PQko/TC5yZWZzPXt9OkwucmVmcyxJZT1MLnNldHVwU3RhdGU7aWYoZWUhPW51bGwmJmVlIT09JCYmKGYuaXNTdHJpbmcoZWUpPyhpZVtlZV09bnVsbCxmLmhhc093bihJZSxlZSkmJihJZVtlZV09bnVsbCkpOlQuaXNSZWYoZWUpJiYoZWUudmFsdWU9bnVsbCkpLGYuaXNGdW5jdGlvbigkKSlzdCgkLEwsMTIsW0ksaWVdKTtlbHNle3ZhciBvZT1mLmlzU3RyaW5nKCQpLENlPVQuaXNSZWYoJCk7aWYob2V8fENlKXt2YXIgQmU9KCk9PntpZihpLmYpe3ZhciBmdD1vZT9pZVskXTokLnZhbHVlO3k/Zi5pc0FycmF5KGZ0KSYmZi5yZW1vdmUoZnQsdyk6Zi5pc0FycmF5KGZ0KT9mdC5pbmNsdWRlcyh3KXx8ZnQucHVzaCh3KTpvZT8oaWVbJF09W3ddLGYuaGFzT3duKEllLCQpJiYoSWVbJF09aWVbJF0pKTooJC52YWx1ZT1bd10saS5rJiYoaWVbaS5rXT0kLnZhbHVlKSl9ZWxzZSBvZT8oaWVbJF09SSxmLmhhc093bihJZSwkKSYmKEllWyRdPUkpKTpDZSYmKCQudmFsdWU9SSxpLmsmJihpZVtpLmtdPUkpKX07ST8oQmUuaWQ9LTEsUihCZSxkKSk6QmUoKX19fX12YXIgTmk9ITEsbG89aT0+L3N2Zy8udGVzdChpLm5hbWVzcGFjZVVSSSkmJmkudGFnTmFtZSE9PSJmb3JlaWduT2JqZWN0IixsYT1pPT5pLm5vZGVUeXBlPT09ODtmdW5jdGlvbiBtKGkpe3ZhcnttdDpzLHA6ZCxvOntwYXRjaFByb3A6cCxjcmVhdGVUZXh0OnksbmV4dFNpYmxpbmc6dyxwYXJlbnROb2RlOkkscmVtb3ZlOkwsaW5zZXJ0OiQsY3JlYXRlQ29tbWVudDplZX19PWksaWU9KG1lLGxlKT0+e2lmKCFsZS5oYXNDaGlsZE5vZGVzKCkpe2QobnVsbCxtZSxsZSksVXIoKSxsZS5fdm5vZGU9bWU7cmV0dXJufU5pPSExLEllKGxlLmZpcnN0Q2hpbGQsbWUsbnVsbCxudWxsLG51bGwpLFVyKCksbGUuX3Zub2RlPW1lLE5pJiZjb25zb2xlLmVycm9yKCJIeWRyYXRpb24gY29tcGxldGVkIGJ1dCBjb250YWlucyBtaXNtYXRjaGVzLiIpfSxJZT1mdW5jdGlvbihtZSxsZSxTZSxxZSxIZSl7dmFyIFJlPWFyZ3VtZW50cy5sZW5ndGg+NSYmYXJndW1lbnRzWzVdIT09dm9pZCAwP2FyZ3VtZW50c1s1XTohMSxsdD1sYShtZSkmJm1lLmRhdGE9PT0iWyIseGU9KCk9PmZ0KG1lLGxlLFNlLHFlLEhlLGx0KSx7dHlwZTpJdCxyZWY6Q3Qsc2hhcGVGbGFnOkJ0LHBhdGNoRmxhZzpKdH09bGUsZHQ9bWUubm9kZVR5cGU7bGUuZWw9bWUsSnQ9PT0tMiYmKFJlPSExLGxlLmR5bmFtaWNDaGlsZHJlbj1udWxsKTt2YXIgRj1udWxsO3N3aXRjaChJdCl7Y2FzZSB1dDpkdCE9PTM/bGUuY2hpbGRyZW49PT0iIj8oJChsZS5lbD15KCIiLG1lLnBhcmVudE5vZGUpLEkobWUpLG1lKSxGPW1lKTpGPXhlKCk6KG1lLmRhdGEhPT1sZS5jaGlsZHJlbiYmKE5pPSEwLG1lLmRhdGE9bGUuY2hpbGRyZW4pLEY9dyhtZSkpO2JyZWFrO2Nhc2UgVnQ6ZHQhPT04fHxsdD9GPXhlKCk6Rj13KG1lKTticmVhaztjYXNlIHB0OmlmKGR0IT09MSYmZHQhPT0zKUY9eGUoKTtlbHNle0Y9bWU7Zm9yKHZhciBLPSFsZS5jaGlsZHJlbi5sZW5ndGgsaGU9MDtoZTxsZS5zdGF0aWNDb3VudDtoZSsrKUsmJihsZS5jaGlsZHJlbis9Ri5ub2RlVHlwZT09PTE/Ri5vdXRlckhUTUw6Ri5kYXRhKSxoZT09PWxlLnN0YXRpY0NvdW50LTEmJihsZS5hbmNob3I9RiksRj13KEYpO3JldHVybiBGfWJyZWFrO2Nhc2UgR2U6bHQ/Rj1CZShtZSxsZSxTZSxxZSxIZSxSZSk6Rj14ZSgpO2JyZWFrO2RlZmF1bHQ6aWYoQnQmMSlkdCE9PTF8fGxlLnR5cGUudG9Mb3dlckNhc2UoKSE9PW1lLnRhZ05hbWUudG9Mb3dlckNhc2UoKT9GPXhlKCk6Rj1vZShtZSxsZSxTZSxxZSxIZSxSZSk7ZWxzZSBpZihCdCY2KXtsZS5zbG90U2NvcGVJZHM9SGU7dmFyIHBlPUkobWUpO2lmKHMobGUscGUsbnVsbCxTZSxxZSxsbyhwZSksUmUpLEY9bHQ/QXQobWUpOncobWUpLEYmJmxhKEYpJiZGLmRhdGE9PT0idGVsZXBvcnQgZW5kIiYmKEY9dyhGKSksVGkobGUpKXt2YXIgUGU7bHQ/KFBlPWZuKEdlKSxQZS5hbmNob3I9Rj9GLnByZXZpb3VzU2libGluZzpwZS5sYXN0Q2hpbGQpOlBlPW1lLm5vZGVUeXBlPT09Mz9EbygiIik6Zm4oImRpdiIpLFBlLmVsPW1lLGxlLmNvbXBvbmVudC5zdWJUcmVlPVBlfX1lbHNlIEJ0JjY0P2R0IT09OD9GPXhlKCk6Rj1sZS50eXBlLmh5ZHJhdGUobWUsbGUsU2UscWUsSGUsUmUsaSxDZSk6QnQmMTI4JiYoRj1sZS50eXBlLmh5ZHJhdGUobWUsbGUsU2UscWUsbG8oSShtZSkpLEhlLFJlLGksSWUpKX1yZXR1cm4gQ3QhPW51bGwmJnJpKEN0LG51bGwscWUsbGUpLEZ9LG9lPShtZSxsZSxTZSxxZSxIZSxSZSk9PntSZT1SZXx8ISFsZS5keW5hbWljQ2hpbGRyZW47dmFye3R5cGU6bHQscHJvcHM6eGUscGF0Y2hGbGFnOkl0LHNoYXBlRmxhZzpDdCxkaXJzOkJ0fT1sZSxKdD1sdD09PSJpbnB1dCImJkJ0fHxsdD09PSJvcHRpb24iO2lmKEp0fHxJdCE9PS0xKXtpZihCdCYmSChsZSxudWxsLFNlLCJjcmVhdGVkIikseGUpaWYoSnR8fCFSZXx8SXQmKDE2fDMyKSlmb3IodmFyIGR0IGluIHhlKShKdCYmZHQuZW5kc1dpdGgoInZhbHVlIil8fGYuaXNPbihkdCkmJiFmLmlzUmVzZXJ2ZWRQcm9wKGR0KSkmJnAobWUsZHQsbnVsbCx4ZVtkdF0sITEsdm9pZCAwLFNlKTtlbHNlIHhlLm9uQ2xpY2smJnAobWUsIm9uQ2xpY2siLG51bGwseGUub25DbGljaywhMSx2b2lkIDAsU2UpO3ZhciBGO2lmKChGPXhlJiZ4ZS5vblZub2RlQmVmb3JlTW91bnQpJiZEcihGLFNlLGxlKSxCdCYmSChsZSxudWxsLFNlLCJiZWZvcmVNb3VudCIpLCgoRj14ZSYmeGUub25Wbm9kZU1vdW50ZWQpfHxCdCkmJlFyKCgpPT57RiYmRHIoRixTZSxsZSksQnQmJkgobGUsbnVsbCxTZSwibW91bnRlZCIpfSxxZSksQ3QmMTYmJiEoeGUmJih4ZS5pbm5lckhUTUx8fHhlLnRleHRDb250ZW50KSkpZm9yKHZhciBLPUNlKG1lLmZpcnN0Q2hpbGQsbGUsbWUsU2UscWUsSGUsUmUpO0s7KXtOaT0hMDt2YXIgaGU9SztLPUsubmV4dFNpYmxpbmcsTChoZSl9ZWxzZSBDdCY4JiZtZS50ZXh0Q29udGVudCE9PWxlLmNoaWxkcmVuJiYoTmk9ITAsbWUudGV4dENvbnRlbnQ9bGUuY2hpbGRyZW4pfXJldHVybiBtZS5uZXh0U2libGluZ30sQ2U9KG1lLGxlLFNlLHFlLEhlLFJlLGx0KT0+e2x0PWx0fHwhIWxlLmR5bmFtaWNDaGlsZHJlbjtmb3IodmFyIHhlPWxlLmNoaWxkcmVuLEl0PXhlLmxlbmd0aCxDdD0wO0N0PEl0O0N0Kyspe3ZhciBCdD1sdD94ZVtDdF06eGVbQ3RdPVl0KHhlW0N0XSk7aWYobWUpbWU9SWUobWUsQnQscWUsSGUsUmUsbHQpO2Vsc2V7aWYoQnQudHlwZT09PXV0JiYhQnQuY2hpbGRyZW4pY29udGludWU7Tmk9ITAsZChudWxsLEJ0LFNlLG51bGwscWUsSGUsbG8oU2UpLFJlKX19cmV0dXJuIG1lfSxCZT0obWUsbGUsU2UscWUsSGUsUmUpPT57dmFye3Nsb3RTY29wZUlkczpsdH09bGU7bHQmJihIZT1IZT9IZS5jb25jYXQobHQpOmx0KTt2YXIgeGU9SShtZSksSXQ9Q2UodyhtZSksbGUseGUsU2UscWUsSGUsUmUpO3JldHVybiBJdCYmbGEoSXQpJiZJdC5kYXRhPT09Il0iP3cobGUuYW5jaG9yPUl0KTooTmk9ITAsJChsZS5hbmNob3I9ZWUoIl0iLHhlKSx4ZSxJdCksSXQpfSxmdD0obWUsbGUsU2UscWUsSGUsUmUpPT57aWYoTmk9ITAsbGUuZWw9bnVsbCxSZSlmb3IodmFyIGx0PUF0KG1lKTs7KXt2YXIgeGU9dyhtZSk7aWYoeGUmJnhlIT09bHQpTCh4ZSk7ZWxzZSBicmVha312YXIgSXQ9dyhtZSksQ3Q9SShtZSk7cmV0dXJuIEwobWUpLGQobnVsbCxsZSxDdCxJdCxTZSxxZSxsbyhDdCksSGUpLEl0fSxBdD1tZT0+e2Zvcih2YXIgbGU9MDttZTspaWYobWU9dyhtZSksbWUmJmxhKG1lKSYmKG1lLmRhdGE9PT0iWyImJmxlKyssbWUuZGF0YT09PSJdIikpe2lmKGxlPT09MClyZXR1cm4gdyhtZSk7bGUtLX1yZXR1cm4gbWV9O3JldHVybltpZSxJZV19dmFyIFI9UXI7ZnVuY3Rpb24geihpKXtyZXR1cm4gWihpKX1mdW5jdGlvbiBqKGkpe3JldHVybiBaKGksbSl9ZnVuY3Rpb24gWihpLHMpe3ZhciBkPWYuZ2V0R2xvYmFsVGhpcygpO2QuX19WVUVfXz0hMDt2YXJ7aW5zZXJ0OnAscmVtb3ZlOnkscGF0Y2hQcm9wOncsZm9yY2VQYXRjaFByb3A6SSxjcmVhdGVFbGVtZW50OkwsY3JlYXRlVGV4dDokLGNyZWF0ZUNvbW1lbnQ6ZWUsc2V0VGV4dDppZSxzZXRFbGVtZW50VGV4dDpJZSxwYXJlbnROb2RlOm9lLG5leHRTaWJsaW5nOkNlLHNldFNjb3BlSWQ6QmU9Zi5OT09QLGNsb25lTm9kZTpmdCxpbnNlcnRTdGF0aWNDb250ZW50OkF0fT1pLG1lPWZ1bmN0aW9uKFcscmUsRWUpe3ZhciBBZT1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106bnVsbCxNZT1hcmd1bWVudHMubGVuZ3RoPjQmJmFyZ3VtZW50c1s0XSE9PXZvaWQgMD9hcmd1bWVudHNbNF06bnVsbCx0dD1hcmd1bWVudHMubGVuZ3RoPjUmJmFyZ3VtZW50c1s1XSE9PXZvaWQgMD9hcmd1bWVudHNbNV06bnVsbCxodD1hcmd1bWVudHMubGVuZ3RoPjYmJmFyZ3VtZW50c1s2XSE9PXZvaWQgMD9hcmd1bWVudHNbNl06ITEsWWU9YXJndW1lbnRzLmxlbmd0aD43JiZhcmd1bWVudHNbN10hPT12b2lkIDA/YXJndW1lbnRzWzddOm51bGwsZXQ9YXJndW1lbnRzLmxlbmd0aD44JiZhcmd1bWVudHNbOF0hPT12b2lkIDA/YXJndW1lbnRzWzhdOiEhcmUuZHluYW1pY0NoaWxkcmVuO2lmKFchPT1yZSl7VyYmIUVyKFcscmUpJiYoQWU9Ym4oVykseXQoVyxNZSx0dCwhMCksVz1udWxsKSxyZS5wYXRjaEZsYWc9PT0tMiYmKGV0PSExLHJlLmR5bmFtaWNDaGlsZHJlbj1udWxsKTt2YXJ7dHlwZTpqZSxyZWY6TnQsc2hhcGVGbGFnOkR0fT1yZTtzd2l0Y2goamUpe2Nhc2UgdXQ6bGUoVyxyZSxFZSxBZSk7YnJlYWs7Y2FzZSBWdDpTZShXLHJlLEVlLEFlKTticmVhaztjYXNlIHB0Olc9PW51bGwmJnFlKHJlLEVlLEFlLGh0KTticmVhaztjYXNlIEdlOkYoVyxyZSxFZSxBZSxNZSx0dCxodCxZZSxldCk7YnJlYWs7ZGVmYXVsdDpEdCYxP2x0KFcscmUsRWUsQWUsTWUsdHQsaHQsWWUsZXQpOkR0JjY/SyhXLHJlLEVlLEFlLE1lLHR0LGh0LFllLGV0KTooRHQmNjR8fER0JjEyOCkmJmplLnByb2Nlc3MoVyxyZSxFZSxBZSxNZSx0dCxodCxZZSxldCxQbil9TnQhPW51bGwmJk1lJiZyaShOdCxXJiZXLnJlZix0dCxyZXx8VywhcmUpfX0sbGU9KFcscmUsRWUsQWUpPT57aWYoVz09bnVsbClwKHJlLmVsPSQocmUuY2hpbGRyZW4sRWUpLEVlLEFlKTtlbHNle3ZhciBNZT1yZS5lbD1XLmVsO3JlLmNoaWxkcmVuIT09Vy5jaGlsZHJlbiYmaWUoTWUscmUuY2hpbGRyZW4pfX0sU2U9KFcscmUsRWUsQWUpPT57Vz09bnVsbD9wKHJlLmVsPWVlKHJlLmNoaWxkcmVufHwiIixFZSksRWUsQWUpOnJlLmVsPVcuZWx9LHFlPShXLHJlLEVlLEFlKT0+e1tXLmVsLFcuYW5jaG9yXT1BdChXLmNoaWxkcmVuLHJlLEVlLEFlLFcuZWwsVy5hbmNob3IpfSxIZT0oVyxyZSxFZSk9Pntmb3IodmFye2VsOkFlLGFuY2hvcjpNZX09Vyx0dDtBZSYmQWUhPT1NZTspdHQ9Q2UoQWUpLHAoQWUscmUsRWUpLEFlPXR0O3AoTWUscmUsRWUpfSxSZT1XPT57Zm9yKHZhcntlbDpyZSxhbmNob3I6RWV9PVcsQWU7cmUmJnJlIT09RWU7KUFlPUNlKHJlKSx5KHJlKSxyZT1BZTt5KEVlKX0sbHQ9KFcscmUsRWUsQWUsTWUsdHQsaHQsWWUsZXQpPT57aHQ9aHR8fHJlLnR5cGU9PT0ic3ZnIixXPT1udWxsP3hlKHJlLEVlLEFlLE1lLHR0LGh0LFllLGV0KTpCdChXLHJlLE1lLHR0LGh0LFllLGV0KX0seGU9KFcscmUsRWUsQWUsTWUsdHQsaHQsWWUpPT57dmFyIGV0LGplLHt0eXBlOk50LHByb3BzOkR0LHNoYXBlRmxhZzpGdCx0cmFuc2l0aW9uOm9uLHBhdGNoRmxhZzpWcixkaXJzOm5yfT1XO2lmKFcuZWwmJmZ0IT09dm9pZCAwJiZWcj09PS0xKWV0PVcuZWw9ZnQoVy5lbCk7ZWxzZXtpZihldD1XLmVsPUwoVy50eXBlLHJlKSxGdCY4P0llKGV0LFcuY2hpbGRyZW4pOkZ0JjE2JiZDdChXLmNoaWxkcmVuLGV0LG51bGwsQWUsTWUsdHQmJk50IT09ImZvcmVpZ25PYmplY3QiLGh0LFllKSxuciYmSChXLG51bGwsQWUsImNyZWF0ZWQiKSxEdCl7Zm9yKHZhciBLciBpbiBEdClLciE9PSJ2YWx1ZSImJiFmLmlzUmVzZXJ2ZWRQcm9wKEtyKSYmdyhldCxLcixudWxsLER0W0tyXSx0dCxXLmNoaWxkcmVuLEFlLE1lLGRuKTsidmFsdWUiaW4gRHQmJncoZXQsInZhbHVlIixudWxsLER0LnZhbHVlKSwoamU9RHQub25Wbm9kZUJlZm9yZU1vdW50KSYmRHIoamUsQWUsVyl9SXQoZXQsVyxXLnNjb3BlSWQsaHQsQWUpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShldCwiX192dWVQYXJlbnRDb21wb25lbnQiLHt2YWx1ZTpBZSxlbnVtZXJhYmxlOiExfSksbnImJkgoVyxudWxsLEFlLCJiZWZvcmVNb3VudCIpO3ZhciBSaT0oIU1lfHxNZSYmIU1lLnBlbmRpbmdCcmFuY2gpJiZvbiYmIW9uLnBlcnNpc3RlZDtSaSYmb24uYmVmb3JlRW50ZXIoZXQpLHAoZXQscmUsRWUpLCgoamU9RHQmJkR0Lm9uVm5vZGVNb3VudGVkKXx8Uml8fG5yKSYmUigoKT0+e2plJiZEcihqZSxBZSxXKSxSaSYmb24uZW50ZXIoZXQpLG5yJiZIKFcsbnVsbCxBZSwibW91bnRlZCIpfSxNZSl9LEl0PShXLHJlLEVlLEFlLE1lKT0+e2lmKEVlJiZCZShXLEVlKSxBZSlmb3IodmFyIHR0PTA7dHQ8QWUubGVuZ3RoO3R0KyspQmUoVyxBZVt0dF0pO2lmKE1lKXt2YXIgaHQ9TWUuc3ViVHJlZTtpZihyZT09PWh0KXt2YXIgWWU9TWUudm5vZGU7SXQoVyxZZSxZZS5zY29wZUlkLFllLnNsb3RTY29wZUlkcyxNZS5wYXJlbnQpfX19LEN0PWZ1bmN0aW9uKFcscmUsRWUsQWUsTWUsdHQsaHQsWWUpe2Zvcih2YXIgZXQ9YXJndW1lbnRzLmxlbmd0aD44JiZhcmd1bWVudHNbOF0hPT12b2lkIDA/YXJndW1lbnRzWzhdOjAsamU9ZXQ7amU8Vy5sZW5ndGg7amUrKyl7dmFyIE50PVdbamVdPVllP29pKFdbamVdKTpZdChXW2plXSk7bWUobnVsbCxOdCxyZSxFZSxBZSxNZSx0dCxodCxZZSl9fSxCdD0oVyxyZSxFZSxBZSxNZSx0dCxodCk9Pnt2YXIgWWU9cmUuZWw9Vy5lbCx7cGF0Y2hGbGFnOmV0LGR5bmFtaWNDaGlsZHJlbjpqZSxkaXJzOk50fT1yZTtldHw9Vy5wYXRjaEZsYWcmMTY7dmFyIER0PVcucHJvcHN8fGYuRU1QVFlfT0JKLEZ0PXJlLnByb3BzfHxmLkVNUFRZX09CSixvbjtFZSYmUShFZSwhMSksKG9uPUZ0Lm9uVm5vZGVCZWZvcmVVcGRhdGUpJiZEcihvbixFZSxyZSxXKSxOdCYmSChyZSxXLEVlLCJiZWZvcmVVcGRhdGUiKSxFZSYmUShFZSwhMCk7dmFyIFZyPU1lJiZyZS50eXBlIT09ImZvcmVpZ25PYmplY3QiO2lmKGplP0p0KFcuZHluYW1pY0NoaWxkcmVuLGplLFllLEVlLEFlLFZyLHR0KTpodHx8Y3QoVyxyZSxZZSxudWxsLEVlLEFlLFZyLHR0LCExKSxldD4wKXtpZihldCYxNilkdChZZSxyZSxEdCxGdCxFZSxBZSxNZSk7ZWxzZSBpZihldCYyJiZEdC5jbGFzcyE9PUZ0LmNsYXNzJiZ3KFllLCJjbGFzcyIsbnVsbCxGdC5jbGFzcyxNZSksZXQmNCYmdyhZZSwic3R5bGUiLER0LnN0eWxlLEZ0LnN0eWxlLE1lKSxldCY4KWZvcih2YXIgbnI9cmUuZHluYW1pY1Byb3BzLEtyPTA7S3I8bnIubGVuZ3RoO0tyKyspe3ZhciBSaT1ucltLcl0sWWE9RHRbUmldLHBzPUZ0W1JpXTsocHMhPT1ZYXx8Umk9PT0idmFsdWUifHxJJiZJKFllLFJpKSkmJncoWWUsUmksWWEscHMsTWUsVy5jaGlsZHJlbixFZSxBZSxkbil9ZXQmMSYmVy5jaGlsZHJlbiE9PXJlLmNoaWxkcmVuJiZJZShZZSxyZS5jaGlsZHJlbil9ZWxzZSFodCYmamU9PW51bGwmJmR0KFllLHJlLER0LEZ0LEVlLEFlLE1lKTsoKG9uPUZ0Lm9uVm5vZGVVcGRhdGVkKXx8TnQpJiZSKCgpPT57b24mJkRyKG9uLEVlLHJlLFcpLE50JiZIKHJlLFcsRWUsInVwZGF0ZWQiKX0sQWUpfSxKdD0oVyxyZSxFZSxBZSxNZSx0dCxodCk9Pntmb3IodmFyIFllPTA7WWU8cmUubGVuZ3RoO1llKyspe3ZhciBldD1XW1llXSxqZT1yZVtZZV0sTnQ9ZXQuZWwmJihldC50eXBlPT09R2V8fCFFcihldCxqZSl8fGV0LnNoYXBlRmxhZyYoNnw2NCkpP29lKGV0LmVsKTpFZTttZShldCxqZSxOdCxudWxsLEFlLE1lLHR0LGh0LCEwKX19LGR0PShXLHJlLEVlLEFlLE1lLHR0LGh0KT0+e2lmKEVlIT09QWUpe2Zvcih2YXIgWWUgaW4gQWUpaWYoIWYuaXNSZXNlcnZlZFByb3AoWWUpKXt2YXIgZXQ9QWVbWWVdLGplPUVlW1llXTsoZXQhPT1qZSYmWWUhPT0idmFsdWUifHxJJiZJKFcsWWUpKSYmdyhXLFllLGplLGV0LGh0LHJlLmNoaWxkcmVuLE1lLHR0LGRuKX1pZihFZSE9PWYuRU1QVFlfT0JKKWZvcih2YXIgTnQgaW4gRWUpIWYuaXNSZXNlcnZlZFByb3AoTnQpJiYhKE50IGluIEFlKSYmdyhXLE50LEVlW050XSxudWxsLGh0LHJlLmNoaWxkcmVuLE1lLHR0LGRuKTsidmFsdWUiaW4gQWUmJncoVywidmFsdWUiLEVlLnZhbHVlLEFlLnZhbHVlKX19LEY9KFcscmUsRWUsQWUsTWUsdHQsaHQsWWUsZXQpPT57dmFyIGplPXJlLmVsPVc/Vy5lbDokKCIiLEVlKSxOdD1yZS5hbmNob3I9Vz9XLmFuY2hvcjokKCIiLEVlKSx7cGF0Y2hGbGFnOkR0LGR5bmFtaWNDaGlsZHJlbjpGdCxzbG90U2NvcGVJZHM6b259PXJlO29uJiYoWWU9WWU/WWUuY29uY2F0KG9uKTpvbiksVz09bnVsbD8ocChqZSxFZSxBZSkscChOdCxFZSxBZSksQ3QocmUuY2hpbGRyZW4sRWUsTnQsTWUsdHQsaHQsWWUsZXQpKTpEdD4wJiZEdCY2NCYmRnQmJlcuZHluYW1pY0NoaWxkcmVuPyhKdChXLmR5bmFtaWNDaGlsZHJlbixGdCxFZSxNZSx0dCxodCxZZSksKHJlLmtleSE9bnVsbHx8TWUmJnJlPT09TWUuc3ViVHJlZSkmJmNlKFcscmUsITApKTpjdChXLHJlLEVlLE50LE1lLHR0LGh0LFllLGV0KX0sSz0oVyxyZSxFZSxBZSxNZSx0dCxodCxZZSxldCk9PntyZS5zbG90U2NvcGVJZHM9WWUsVz09bnVsbD9yZS5zaGFwZUZsYWcmNTEyP01lLmN0eC5hY3RpdmF0ZShyZSxFZSxBZSxodCxldCk6aGUocmUsRWUsQWUsTWUsdHQsaHQsZXQpOnBlKFcscmUsZXQpfSxoZT0oVyxyZSxFZSxBZSxNZSx0dCxodCk9Pnt2YXIgWWU9Vy5jb21wb25lbnQ9R24oVyxBZSxNZSk7aWYobm8oVykmJihZZS5jdHgucmVuZGVyZXI9UG4pLENhKFllKSxZZS5hc3luY0RlcCl7aWYoTWUmJk1lLnJlZ2lzdGVyRGVwKFllLFBlKSwhVy5lbCl7dmFyIGV0PVllLnN1YlRyZWU9Zm4oVnQpO1NlKG51bGwsZXQscmUsRWUpfXJldHVybn1pZihQZShZZSxXLHJlLEVlLE1lLHR0LGh0KSxZZS4kd3hzTW9kdWxlcyl7dmFyIGplPU4ucmVzb2x2ZU93bmVyRWwoWWUpO2lmKGplKXtqZS5zZXRBdHRyaWJ1dGUoTi5BVFRSX1ZfT1dORVJfSUQsWWUudWlkKTt2YXJ7JHJlbmRlcmpzTW9kdWxlczpOdH09WWUudHlwZTtOdCYmamUuc2V0QXR0cmlidXRlKE4uQVRUUl9WX1JFTkRFUkpTLE50KX19fSxwZT0oVyxyZSxFZSk9Pnt2YXIgQWU9cmUuY29tcG9uZW50PVcuY29tcG9uZW50O2lmKHBvKFcscmUsRWUpKWlmKEFlLmFzeW5jRGVwJiYhQWUuYXN5bmNSZXNvbHZlZCl7S2UoQWUscmUsRWUpO3JldHVybn1lbHNlIEFlLm5leHQ9cmUsbHIoQWUudXBkYXRlKSxBZS51cGRhdGUoKTtlbHNlIHJlLmVsPVcuZWwsQWUudm5vZGU9cmV9LFBlPShXLHJlLEVlLEFlLE1lLHR0LGh0KT0+e3ZhciBZZT0oKT0+e2lmKFcuaXNNb3VudGVkKXt2YXJ7bmV4dDokcixidTokcyx1OlVzLHBhcmVudDpobyx2bm9kZTpxYX09VyxLYT0kcixkYTtRKFcsITEpLCRyPygkci5lbD1xYS5lbCxLZShXLCRyLGh0KSk6JHI9cWEsJHMmJmYuaW52b2tlQXJyYXlGbnMoJHMpLChkYT0kci5wcm9wcyYmJHIucHJvcHMub25Wbm9kZUJlZm9yZVVwZGF0ZSkmJkRyKGRhLGhvLCRyLHFhKSxRKFcsITApO3ZhciBVbz1TcihXKSxiaT1XLnN1YlRyZWU7Vy5zdWJUcmVlPVVvLG1lKGJpLFVvLG9lKGJpLmVsKSxibihiaSksVyxNZSx0dCksJHIuZWw9VW8uZWwsS2E9PT1udWxsJiZ1cihXLFVvLmVsKSxVcyYmUihVcyxNZSksKGRhPSRyLnByb3BzJiYkci5wcm9wcy5vblZub2RlVXBkYXRlZCkmJlIoKCk9PkRyKGRhLGhvLCRyLHFhKSxNZSl9ZWxzZXt2YXIgTnQse2VsOkR0LHByb3BzOkZ0fT1yZSx7Ym06b24sbTpWcixwYXJlbnQ6bnJ9PVcsS3I9VGkocmUpO2lmKFEoVywhMSksb24mJmYuaW52b2tlQXJyYXlGbnMob24pLCFLciYmKE50PUZ0JiZGdC5vblZub2RlQmVmb3JlTW91bnQpJiZEcihOdCxucixyZSksUShXLCEwKSxEdCYmU28pe3ZhciBSaT0oKT0+e1cuc3ViVHJlZT1TcihXKSxTbyhEdCxXLnN1YlRyZWUsVyxNZSxudWxsKX07S3I/cmUudHlwZS5fX2FzeW5jTG9hZGVyKCkudGhlbigoKT0+IVcuaXNVbm1vdW50ZWQmJlJpKCkpOlJpKCl9ZWxzZXt2YXIgWWE9Vy5zdWJUcmVlPVNyKFcpO21lKG51bGwsWWEsRWUsQWUsVyxNZSx0dCkscmUuZWw9WWEuZWx9aWYoVnImJlIoVnIsTWUpLCFLciYmKE50PUZ0JiZGdC5vblZub2RlTW91bnRlZCkpe3ZhciBwcz1yZTtSKCgpPT5EcihOdCxucixwcyksTWUpfShyZS5zaGFwZUZsYWcmMjU2fHxuciYmVGkobnIudm5vZGUpJiZuci52bm9kZS5zaGFwZUZsYWcmMjU2KSYmVy5hJiZSKFcuYSxNZSksVy5pc01vdW50ZWQ9ITAscmU9RWU9QWU9bnVsbH19LGV0PVcuZWZmZWN0PW5ldyBULlJlYWN0aXZlRWZmZWN0KFllLCgpPT5RdChqZSksVy5zY29wZSksamU9Vy51cGRhdGU9KCk9PmV0LnJ1bigpO2plLmlkPVcudWlkLFEoVywhMCksamUoKX0sS2U9KFcscmUsRWUpPT57cmUuY29tcG9uZW50PVc7dmFyIEFlPVcudm5vZGUucHJvcHM7Vy52bm9kZT1yZSxXLm5leHQ9bnVsbCxucyhXLHJlLnByb3BzLEFlLEVlKSxzYShXLHJlLmNoaWxkcmVuLEVlKSxULnBhdXNlVHJhY2tpbmcoKSx3cih2b2lkIDAsVy51cGRhdGUpLFQucmVzZXRUcmFja2luZygpfSxjdD1mdW5jdGlvbihXLHJlLEVlLEFlLE1lLHR0LGh0LFllKXt2YXIgZXQ9YXJndW1lbnRzLmxlbmd0aD44JiZhcmd1bWVudHNbOF0hPT12b2lkIDA/YXJndW1lbnRzWzhdOiExLGplPVcmJlcuY2hpbGRyZW4sTnQ9Vz9XLnNoYXBlRmxhZzowLER0PXJlLmNoaWxkcmVuLHtwYXRjaEZsYWc6RnQsc2hhcGVGbGFnOm9ufT1yZTtpZihGdD4wKXtpZihGdCYxMjgpe0plKGplLER0LEVlLEFlLE1lLHR0LGh0LFllLGV0KTtyZXR1cm59ZWxzZSBpZihGdCYyNTYpe1FlKGplLER0LEVlLEFlLE1lLHR0LGh0LFllLGV0KTtyZXR1cm59fW9uJjg/KE50JjE2JiZkbihqZSxNZSx0dCksRHQhPT1qZSYmSWUoRWUsRHQpKTpOdCYxNj9vbiYxNj9KZShqZSxEdCxFZSxBZSxNZSx0dCxodCxZZSxldCk6ZG4oamUsTWUsdHQsITApOihOdCY4JiZJZShFZSwiIiksb24mMTYmJkN0KER0LEVlLEFlLE1lLHR0LGh0LFllLGV0KSl9LFFlPShXLHJlLEVlLEFlLE1lLHR0LGh0LFllLGV0KT0+e1c9V3x8Zi5FTVBUWV9BUlIscmU9cmV8fGYuRU1QVFlfQVJSO3ZhciBqZT1XLmxlbmd0aCxOdD1yZS5sZW5ndGgsRHQ9TWF0aC5taW4oamUsTnQpLEZ0O2ZvcihGdD0wO0Z0PER0O0Z0Kyspe3ZhciBvbj1yZVtGdF09ZXQ/b2kocmVbRnRdKTpZdChyZVtGdF0pO21lKFdbRnRdLG9uLEVlLG51bGwsTWUsdHQsaHQsWWUsZXQpfWplPk50P2RuKFcsTWUsdHQsITAsITEsRHQpOkN0KHJlLEVlLEFlLE1lLHR0LGh0LFllLGV0LER0KX0sSmU9KFcscmUsRWUsQWUsTWUsdHQsaHQsWWUsZXQpPT57Zm9yKHZhciBqZT0wLE50PXJlLmxlbmd0aCxEdD1XLmxlbmd0aC0xLEZ0PU50LTE7amU8PUR0JiZqZTw9RnQ7KXt2YXIgb249V1tqZV0sVnI9cmVbamVdPWV0P29pKHJlW2plXSk6WXQocmVbamVdKTtpZihFcihvbixWcikpbWUob24sVnIsRWUsbnVsbCxNZSx0dCxodCxZZSxldCk7ZWxzZSBicmVhaztqZSsrfWZvcig7amU8PUR0JiZqZTw9RnQ7KXt2YXIgbnI9V1tEdF0sS3I9cmVbRnRdPWV0P29pKHJlW0Z0XSk6WXQocmVbRnRdKTtpZihFcihucixLcikpbWUobnIsS3IsRWUsbnVsbCxNZSx0dCxodCxZZSxldCk7ZWxzZSBicmVhaztEdC0tLEZ0LS19aWYoamU+RHQpe2lmKGplPD1GdClmb3IodmFyIFJpPUZ0KzEsWWE9Umk8TnQ/cmVbUmldLmVsOkFlO2plPD1GdDspbWUobnVsbCxyZVtqZV09ZXQ/b2kocmVbamVdKTpZdChyZVtqZV0pLEVlLFlhLE1lLHR0LGh0LFllLGV0KSxqZSsrfWVsc2UgaWYoamU+RnQpZm9yKDtqZTw9RHQ7KXl0KFdbamVdLE1lLHR0LCEwKSxqZSsrO2Vsc2V7dmFyIHBzPWplLCRyPWplLCRzPW5ldyBNYXA7Zm9yKGplPSRyO2plPD1GdDtqZSsrKXt2YXIgVXM9cmVbamVdPWV0P29pKHJlW2plXSk6WXQocmVbamVdKTtVcy5rZXkhPW51bGwmJiRzLnNldChVcy5rZXksamUpfXZhciBobyxxYT0wLEthPUZ0LSRyKzEsZGE9ITEsVW89MCxiaT1uZXcgQXJyYXkoS2EpO2ZvcihqZT0wO2plPEthO2plKyspYmlbamVdPTA7Zm9yKGplPXBzO2plPD1EdDtqZSsrKXt2YXIgdnM9V1tqZV07aWYocWE+PUthKXt5dCh2cyxNZSx0dCwhMCk7Y29udGludWV9dmFyIElhPXZvaWQgMDtpZih2cy5rZXkhPW51bGwpSWE9JHMuZ2V0KHZzLmtleSk7ZWxzZSBmb3IoaG89JHI7aG88PUZ0O2hvKyspaWYoYmlbaG8tJHJdPT09MCYmRXIodnMscmVbaG9dKSl7SWE9aG87YnJlYWt9SWE9PT12b2lkIDA/eXQodnMsTWUsdHQsITApOihiaVtJYS0kcl09amUrMSxJYT49VW8/VW89SWE6ZGE9ITAsbWUodnMscmVbSWFdLEVlLG51bGwsTWUsdHQsaHQsWWUsZXQpLHFhKyspfXZhciBFYz1kYT9iZShiaSk6Zi5FTVBUWV9BUlI7Zm9yKGhvPUVjLmxlbmd0aC0xLGplPUthLTE7amU+PTA7amUtLSl7dmFyIEtsPSRyK2plLHljPXJlW0tsXSx3Yz1LbCsxPE50P3JlW0tsKzFdLmVsOkFlO2JpW2plXT09PTA/bWUobnVsbCx5YyxFZSx3YyxNZSx0dCxodCxZZSxldCk6ZGEmJihobzwwfHxqZSE9PUVjW2hvXT9EZSh5YyxFZSx3YywyKTpoby0tKX19fSxEZT1mdW5jdGlvbihXLHJlLEVlLEFlKXt2YXIgTWU9YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOm51bGwse2VsOnR0LHR5cGU6aHQsdHJhbnNpdGlvbjpZZSxjaGlsZHJlbjpldCxzaGFwZUZsYWc6amV9PVc7aWYoamUmNil7RGUoVy5jb21wb25lbnQuc3ViVHJlZSxyZSxFZSxBZSk7cmV0dXJufWlmKGplJjEyOCl7Vy5zdXNwZW5zZS5tb3ZlKHJlLEVlLEFlKTtyZXR1cm59aWYoamUmNjQpe2h0Lm1vdmUoVyxyZSxFZSxQbik7cmV0dXJufWlmKGh0PT09R2Upe3AodHQscmUsRWUpO2Zvcih2YXIgTnQ9MDtOdDxldC5sZW5ndGg7TnQrKylEZShldFtOdF0scmUsRWUsQWUpO3AoVy5hbmNob3IscmUsRWUpO3JldHVybn1pZihodD09PXB0KXtIZShXLHJlLEVlKTtyZXR1cm59dmFyIER0PUFlIT09MiYmamUmMSYmWWU7aWYoRHQpaWYoQWU9PT0wKVllLmJlZm9yZUVudGVyKHR0KSxwKHR0LHJlLEVlKSxSKCgpPT5ZZS5lbnRlcih0dCksTWUpO2Vsc2V7dmFye2xlYXZlOkZ0LGRlbGF5TGVhdmU6b24sYWZ0ZXJMZWF2ZTpWcn09WWUsbnI9KCk9PnAodHQscmUsRWUpLEtyPSgpPT57RnQodHQsKCk9PntucigpLFZyJiZWcigpfSl9O29uP29uKHR0LG5yLEtyKTpLcigpfWVsc2UgcCh0dCxyZSxFZSl9LHl0PWZ1bmN0aW9uKFcscmUsRWUpe3ZhciBBZT1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106ITEsTWU9YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOiExLHt0eXBlOnR0LHByb3BzOmh0LHJlZjpZZSxjaGlsZHJlbjpldCxkeW5hbWljQ2hpbGRyZW46amUsc2hhcGVGbGFnOk50LHBhdGNoRmxhZzpEdCxkaXJzOkZ0fT1XO2lmKFllIT1udWxsJiZyaShZZSxudWxsLEVlLFcsITApLE50JjI1Nil7cmUuY3R4LmRlYWN0aXZhdGUoVyk7cmV0dXJufXZhciBvbj1OdCYxJiZGdCxWcj0hVGkoVyksbnI7aWYoVnImJihucj1odCYmaHQub25Wbm9kZUJlZm9yZVVubW91bnQpJiZEcihucixyZSxXKSxOdCY2KW90KFcuY29tcG9uZW50LEVlLEFlKTtlbHNle2lmKE50JjEyOCl7Vy5zdXNwZW5zZS51bm1vdW50KEVlLEFlKTtyZXR1cm59b24mJkgoVyxudWxsLHJlLCJiZWZvcmVVbm1vdW50IiksTnQmNjQ/Vy50eXBlLnJlbW92ZShXLHJlLEVlLE1lLFBuLEFlKTpqZSYmKHR0IT09R2V8fER0PjAmJkR0JjY0KT9kbihqZSxyZSxFZSwhMSwhMCk6KHR0PT09R2UmJkR0JigxMjh8MjU2KXx8IU1lJiZOdCYxNikmJmRuKGV0LHJlLEVlKSxBZSYmd3QoVyl9KFZyJiYobnI9aHQmJmh0Lm9uVm5vZGVVbm1vdW50ZWQpfHxvbikmJlIoKCk9PntuciYmRHIobnIscmUsVyksb24mJkgoVyxudWxsLHJlLCJ1bm1vdW50ZWQiKX0sRWUpfSx3dD1XPT57dmFye3R5cGU6cmUsZWw6RWUsYW5jaG9yOkFlLHRyYW5zaXRpb246TWV9PVc7aWYocmU9PT1HZSl7YXQoRWUsQWUpO3JldHVybn1pZihyZT09PXB0KXtSZShXKTtyZXR1cm59dmFyIHR0PSgpPT57eShFZSksTWUmJiFNZS5wZXJzaXN0ZWQmJk1lLmFmdGVyTGVhdmUmJk1lLmFmdGVyTGVhdmUoKX07aWYoVy5zaGFwZUZsYWcmMSYmTWUmJiFNZS5wZXJzaXN0ZWQpe3ZhcntsZWF2ZTpodCxkZWxheUxlYXZlOlllfT1NZSxldD0oKT0+aHQoRWUsdHQpO1llP1llKFcuZWwsdHQsZXQpOmV0KCl9ZWxzZSB0dCgpfSxhdD0oVyxyZSk9Pntmb3IodmFyIEVlO1chPT1yZTspRWU9Q2UoVykseShXKSxXPUVlO3kocmUpfSxvdD0oVyxyZSxFZSk9Pnt2YXJ7YnVtOkFlLHNjb3BlOk1lLHVwZGF0ZTp0dCxzdWJUcmVlOmh0LHVtOlllfT1XO0FlJiZmLmludm9rZUFycmF5Rm5zKEFlKSxNZS5zdG9wKCksdHQmJih0dC5hY3RpdmU9ITEseXQoaHQsVyxyZSxFZSkpLFllJiZSKFllLHJlKSxSKCgpPT57Vy5pc1VubW91bnRlZD0hMH0scmUpLHJlJiZyZS5wZW5kaW5nQnJhbmNoJiYhcmUuaXNVbm1vdW50ZWQmJlcuYXN5bmNEZXAmJiFXLmFzeW5jUmVzb2x2ZWQmJlcuc3VzcGVuc2VJZD09PXJlLnBlbmRpbmdJZCYmKHJlLmRlcHMtLSxyZS5kZXBzPT09MCYmcmUucmVzb2x2ZSgpKX0sZG49ZnVuY3Rpb24oVyxyZSxFZSl7Zm9yKHZhciBBZT1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106ITEsTWU9YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOiExLHR0PWFyZ3VtZW50cy5sZW5ndGg+NSYmYXJndW1lbnRzWzVdIT09dm9pZCAwP2FyZ3VtZW50c1s1XTowLGh0PXR0O2h0PFcubGVuZ3RoO2h0KyspeXQoV1todF0scmUsRWUsQWUsTWUpfSxibj1XPT5XLnNoYXBlRmxhZyY2P2JuKFcuY29tcG9uZW50LnN1YlRyZWUpOlcuc2hhcGVGbGFnJjEyOD9XLnN1c3BlbnNlLm5leHQoKTpDZShXLmFuY2hvcnx8Vy5lbCksdHI9KFcscmUsRWUpPT57Vz09bnVsbD9yZS5fdm5vZGUmJnl0KHJlLl92bm9kZSxudWxsLG51bGwsITApOm1lKHJlLl92bm9kZXx8bnVsbCxXLHJlLG51bGwsbnVsbCxudWxsLEVlKSxVcigpLHJlLl92bm9kZT1XfSxQbj17cDptZSx1bTp5dCxtOkRlLHI6d3QsbXQ6aGUsbWM6Q3QscGM6Y3QscGJjOkp0LG46Ym4sbzppfSwkbyxTbztyZXR1cm4gcyYmKFskbyxTb109cyhQbikpLHtyZW5kZXI6dHIsaHlkcmF0ZTokbyxjcmVhdGVBcHA6c28odHIsJG8pfX1mdW5jdGlvbiBRKGkscyl7dmFye2VmZmVjdDpkLHVwZGF0ZTpwfT1pO2QuYWxsb3dSZWN1cnNlPXAuYWxsb3dSZWN1cnNlPXN9ZnVuY3Rpb24gY2UoaSxzKXt2YXIgZD1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06ITEscD1pLmNoaWxkcmVuLHk9cy5jaGlsZHJlbjtpZihmLmlzQXJyYXkocCkmJmYuaXNBcnJheSh5KSlmb3IodmFyIHc9MDt3PHAubGVuZ3RoO3crKyl7dmFyIEk9cFt3XSxMPXlbd107TC5zaGFwZUZsYWcmMSYmIUwuZHluYW1pY0NoaWxkcmVuJiYoKEwucGF0Y2hGbGFnPD0wfHxMLnBhdGNoRmxhZz09PTMyKSYmKEw9eVt3XT1vaSh5W3ddKSxMLmVsPUkuZWwpLGR8fGNlKEksTCkpfX1mdW5jdGlvbiBiZShpKXt2YXIgcz1pLnNsaWNlKCksZD1bMF0scCx5LHcsSSxMLCQ9aS5sZW5ndGg7Zm9yKHA9MDtwPCQ7cCsrKXt2YXIgZWU9aVtwXTtpZihlZSE9PTApe2lmKHk9ZFtkLmxlbmd0aC0xXSxpW3ldPGVlKXtzW3BdPXksZC5wdXNoKHApO2NvbnRpbnVlfWZvcih3PTAsST1kLmxlbmd0aC0xO3c8STspTD13K0k+PjEsaVtkW0xdXTxlZT93PUwrMTpJPUw7ZWU8aVtkW3ddXSYmKHc+MCYmKHNbcF09ZFt3LTFdKSxkW3ddPXApfX1mb3Iodz1kLmxlbmd0aCxJPWRbdy0xXTt3LS0gPjA7KWRbd109SSxJPXNbSV07cmV0dXJuIGR9dmFyIE9lPWk9PmkuX19pc1RlbGVwb3J0LE5lPWk9PmkmJihpLmRpc2FibGVkfHxpLmRpc2FibGVkPT09IiIpLHZlPWk9PnR5cGVvZiBTVkdFbGVtZW50IT0idW5kZWZpbmVkIiYmaSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQsRmU9KGkscyk9Pnt2YXIgZD1pJiZpLnRvO2lmKGYuaXNTdHJpbmcoZCkpaWYocyl7dmFyIHA9cyhkKTtyZXR1cm4gcH1lbHNlIHJldHVybiBudWxsO2Vsc2UgcmV0dXJuIGR9LHJ0PXtfX2lzVGVsZXBvcnQ6ITAscHJvY2VzcyhpLHMsZCxwLHksdyxJLEwsJCxlZSl7dmFye21jOmllLHBjOkllLHBiYzpvZSxvOntpbnNlcnQ6Q2UscXVlcnlTZWxlY3RvcjpCZSxjcmVhdGVUZXh0OmZ0LGNyZWF0ZUNvbW1lbnQ6QXR9fT1lZSxtZT1OZShzLnByb3BzKSx7c2hhcGVGbGFnOmxlLGNoaWxkcmVuOlNlLGR5bmFtaWNDaGlsZHJlbjpxZX09cztpZihpPT1udWxsKXt2YXIgSGU9cy5lbD1mdCgiIixkKSxSZT1zLmFuY2hvcj1mdCgiIixkKTtDZShIZSxkLHApLENlKFJlLGQscCk7dmFyIGx0PXMudGFyZ2V0PUZlKHMucHJvcHMsQmUpLHhlPXMudGFyZ2V0QW5jaG9yPWZ0KCIiLGQpO2x0JiYoQ2UoeGUsbHQpLEk9SXx8dmUobHQpKTt2YXIgSXQ9KHBlLFBlKT0+e2xlJjE2JiZpZShTZSxwZSxQZSx5LHcsSSxMLCQpfTttZT9JdChkLFJlKTpsdCYmSXQobHQseGUpfWVsc2V7cy5lbD1pLmVsO3ZhciBDdD1zLmFuY2hvcj1pLmFuY2hvcixCdD1zLnRhcmdldD1pLnRhcmdldCxKdD1zLnRhcmdldEFuY2hvcj1pLnRhcmdldEFuY2hvcixkdD1OZShpLnByb3BzKSxGPWR0P2Q6QnQsSz1kdD9DdDpKdDtpZihJPUl8fHZlKEJ0KSxxZT8ob2UoaS5keW5hbWljQ2hpbGRyZW4scWUsRix5LHcsSSxMKSxjZShpLHMsITApKTokfHxJZShpLHMsRixLLHksdyxJLEwsITEpLG1lKWR0fHxidChzLGQsQ3QsZWUsMSk7ZWxzZSBpZigocy5wcm9wcyYmcy5wcm9wcy50bykhPT0oaS5wcm9wcyYmaS5wcm9wcy50bykpe3ZhciBoZT1zLnRhcmdldD1GZShzLnByb3BzLEJlKTtoZSYmYnQocyxoZSxudWxsLGVlLDApfWVsc2UgZHQmJmJ0KHMsQnQsSnQsZWUsMSl9fSxyZW1vdmUoaSxzLGQscCx5LHcpe3Zhcnt1bTpJLG86e3JlbW92ZTpMfX09eSx7c2hhcGVGbGFnOiQsY2hpbGRyZW46ZWUsYW5jaG9yOmllLHRhcmdldEFuY2hvcjpJZSx0YXJnZXQ6b2UscHJvcHM6Q2V9PWk7aWYob2UmJkwoSWUpLCh3fHwhTmUoQ2UpKSYmKEwoaWUpLCQmMTYpKWZvcih2YXIgQmU9MDtCZTxlZS5sZW5ndGg7QmUrKyl7dmFyIGZ0PWVlW0JlXTtJKGZ0LHMsZCwhMCwhIWZ0LmR5bmFtaWNDaGlsZHJlbil9fSxtb3ZlOmJ0LGh5ZHJhdGU6V3R9O2Z1bmN0aW9uIGJ0KGkscyxkLHApe3ZhcntvOntpbnNlcnQ6eX0sbTp3fT1wLEk9YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOjI7ST09PTAmJnkoaS50YXJnZXRBbmNob3IscyxkKTt2YXJ7ZWw6TCxhbmNob3I6JCxzaGFwZUZsYWc6ZWUsY2hpbGRyZW46aWUscHJvcHM6SWV9PWksb2U9ST09PTI7aWYob2UmJnkoTCxzLGQpLCghb2V8fE5lKEllKSkmJmVlJjE2KWZvcih2YXIgQ2U9MDtDZTxpZS5sZW5ndGg7Q2UrKyl3KGllW0NlXSxzLGQsMik7b2UmJnkoJCxzLGQpfWZ1bmN0aW9uIFd0KGkscyxkLHAseSx3LEksTCl7dmFye286e25leHRTaWJsaW5nOiQscGFyZW50Tm9kZTplZSxxdWVyeVNlbGVjdG9yOmllfX09SSxJZT1zLnRhcmdldD1GZShzLnByb3BzLGllKTtpZihJZSl7dmFyIG9lPUllLl9scGF8fEllLmZpcnN0Q2hpbGQ7aWYocy5zaGFwZUZsYWcmMTYpaWYoTmUocy5wcm9wcykpcy5hbmNob3I9TCgkKGkpLHMsZWUoaSksZCxwLHksdykscy50YXJnZXRBbmNob3I9b2U7ZWxzZXtzLmFuY2hvcj0kKGkpO2Zvcih2YXIgQ2U9b2U7Q2U7KWlmKENlPSQoQ2UpLENlJiZDZS5ub2RlVHlwZT09PTgmJkNlLmRhdGE9PT0idGVsZXBvcnQgYW5jaG9yIil7cy50YXJnZXRBbmNob3I9Q2UsSWUuX2xwYT1zLnRhcmdldEFuY2hvciYmJChzLnRhcmdldEFuY2hvcik7YnJlYWt9TChvZSxzLEllLGQscCx5LHcpfX1yZXR1cm4gcy5hbmNob3ImJiQocy5hbmNob3IpfXZhciBudD1ydCxHZT1TeW1ib2wodm9pZCAwKSx1dD1TeW1ib2wodm9pZCAwKSxWdD1TeW1ib2wodm9pZCAwKSxwdD1TeW1ib2wodm9pZCAwKSxaZT1bXSxPdD1udWxsO2Z1bmN0aW9uIHduKCl7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOiExO1plLnB1c2goT3Q9aT9udWxsOltdKX1mdW5jdGlvbiB1bigpe1plLnBvcCgpLE90PVplW1plLmxlbmd0aC0xXXx8bnVsbH12YXIgcm49MTtmdW5jdGlvbiBTbihpKXtybis9aX1mdW5jdGlvbiBIdChpKXtyZXR1cm4gaS5keW5hbWljQ2hpbGRyZW49cm4+MD9PdHx8Zi5FTVBUWV9BUlI6bnVsbCx1bigpLHJuPjAmJk90JiZPdC5wdXNoKGkpLGl9ZnVuY3Rpb24gTG4oaSxzLGQscCx5LHcpe3JldHVybiBIdChMdChpLHMsZCxwLHksdywhMCkpfWZ1bmN0aW9uIG1pKGkscyxkLHAseSl7cmV0dXJuIEh0KGZuKGkscyxkLHAseSwhMCkpfWZ1bmN0aW9uIG9yKGkpe3JldHVybiBpP2kuX192X2lzVk5vZGU9PT0hMDohMX1mdW5jdGlvbiBFcihpLHMpe3JldHVybiBpLnR5cGU9PT1zLnR5cGUmJmkua2V5PT09cy5rZXl9ZnVuY3Rpb24gQm8oaSl7fXZhciBXaT0iX192SW50ZXJuYWwiLE1vPWk9Pnt2YXJ7a2V5OnN9PWk7cmV0dXJuIHMhPW51bGw/czpudWxsfSxMbz1pPT57dmFye3JlZjpzLHJlZl9rZXk6ZCxyZWZfZm9yOnB9PWk7cmV0dXJuIHMhPW51bGw/Zi5pc1N0cmluZyhzKXx8VC5pc1JlZihzKXx8Zi5pc0Z1bmN0aW9uKHMpP3tpOk9uLHI6cyxrOmQsZjohIXB9OnM6bnVsbH07ZnVuY3Rpb24gTHQoaSl7dmFyIHM9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOm51bGwsZD1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06bnVsbCxwPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTowLHk9YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOm51bGwsdz1hcmd1bWVudHMubGVuZ3RoPjUmJmFyZ3VtZW50c1s1XSE9PXZvaWQgMD9hcmd1bWVudHNbNV06aT09PUdlPzA6MSxJPWFyZ3VtZW50cy5sZW5ndGg+NiYmYXJndW1lbnRzWzZdIT09dm9pZCAwP2FyZ3VtZW50c1s2XTohMSxMPWFyZ3VtZW50cy5sZW5ndGg+NyYmYXJndW1lbnRzWzddIT09dm9pZCAwP2FyZ3VtZW50c1s3XTohMSwkPXtfX3ZfaXNWTm9kZTohMCxfX3Zfc2tpcDohMCx0eXBlOmkscHJvcHM6cyxrZXk6cyYmTW8ocykscmVmOnMmJkxvKHMpLHNjb3BlSWQ6Y2ksc2xvdFNjb3BlSWRzOm51bGwsY2hpbGRyZW46ZCxjb21wb25lbnQ6bnVsbCxzdXNwZW5zZTpudWxsLHNzQ29udGVudDpudWxsLHNzRmFsbGJhY2s6bnVsbCxkaXJzOm51bGwsdHJhbnNpdGlvbjpudWxsLGVsOm51bGwsYW5jaG9yOm51bGwsdGFyZ2V0Om51bGwsdGFyZ2V0QW5jaG9yOm51bGwsc3RhdGljQ291bnQ6MCxzaGFwZUZsYWc6dyxwYXRjaEZsYWc6cCxkeW5hbWljUHJvcHM6eSxkeW5hbWljQ2hpbGRyZW46bnVsbCxhcHBDb250ZXh0Om51bGx9O3JldHVybiBMPyhBYSgkLGQpLHcmMTI4JiZpLm5vcm1hbGl6ZSgkKSk6ZCYmKCQuc2hhcGVGbGFnfD1mLmlzU3RyaW5nKGQpPzg6MTYpLHJuPjAmJiFJJiZPdCYmKCQucGF0Y2hGbGFnPjB8fHcmNikmJiQucGF0Y2hGbGFnIT09MzImJk90LnB1c2goJCksJH12YXIgZm49Y287ZnVuY3Rpb24gY28oaSl7dmFyIHM9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOm51bGwsZD1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06bnVsbCxwPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTowLHk9YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOm51bGwsdz1hcmd1bWVudHMubGVuZ3RoPjUmJmFyZ3VtZW50c1s1XSE9PXZvaWQgMD9hcmd1bWVudHNbNV06ITE7aWYoKCFpfHxpPT09dWUpJiYoaT1WdCksb3IoaSkpe3ZhciBJPWlpKGkscywhMCk7cmV0dXJuIGQmJkFhKEksZCkscm4+MCYmIXcmJk90JiYoSS5zaGFwZUZsYWcmNj9PdFtPdC5pbmRleE9mKGkpXT1JOk90LnB1c2goSSkpLEkucGF0Y2hGbGFnfD0tMixJfWlmKEZvKGkpJiYoaT1pLl9fdmNjT3B0cykscyl7cz1xcihzKTt2YXJ7Y2xhc3M6TCxzdHlsZTokfT1zO0wmJiFmLmlzU3RyaW5nKEwpJiYocy5jbGFzcz1mLm5vcm1hbGl6ZUNsYXNzKEwpKSxmLmlzT2JqZWN0KCQpJiYoVC5pc1Byb3h5KCQpJiYhZi5pc0FycmF5KCQpJiYoJD1mLmV4dGVuZCh7fSwkKSkscy5zdHlsZT1mLm5vcm1hbGl6ZVN0eWxlKCQpKX12YXIgZWU9Zi5pc1N0cmluZyhpKT8xOkFyKGkpPzEyODpPZShpKT82NDpmLmlzT2JqZWN0KGkpPzQ6Zi5pc0Z1bmN0aW9uKGkpPzI6MDtyZXR1cm4gTHQoaSxzLGQscCx5LGVlLHcsITApfWZ1bmN0aW9uIHFyKGkpe3JldHVybiBpP1QuaXNQcm94eShpKXx8V2kgaW4gaT9mLmV4dGVuZCh7fSxpKTppOm51bGx9ZnVuY3Rpb24gaWkoaSxzKXt2YXIgZD1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06ITEse3Byb3BzOnAscmVmOnkscGF0Y2hGbGFnOncsY2hpbGRyZW46SX09aSxMPXM/UHIocHx8e30scyk6cCwkPXtfX3ZfaXNWTm9kZTohMCxfX3Zfc2tpcDohMCx0eXBlOmkudHlwZSxwcm9wczpMLGtleTpMJiZNbyhMKSxyZWY6cyYmcy5yZWY/ZCYmeT9mLmlzQXJyYXkoeSk/eS5jb25jYXQoTG8ocykpOlt5LExvKHMpXTpMbyhzKTp5LHNjb3BlSWQ6aS5zY29wZUlkLHNsb3RTY29wZUlkczppLnNsb3RTY29wZUlkcyxjaGlsZHJlbjpJLHRhcmdldDppLnRhcmdldCx0YXJnZXRBbmNob3I6aS50YXJnZXRBbmNob3Isc3RhdGljQ291bnQ6aS5zdGF0aWNDb3VudCxzaGFwZUZsYWc6aS5zaGFwZUZsYWcscGF0Y2hGbGFnOnMmJmkudHlwZSE9PUdlP3c9PT0tMT8xNjp3fDE2OncsZHluYW1pY1Byb3BzOmkuZHluYW1pY1Byb3BzLGR5bmFtaWNDaGlsZHJlbjppLmR5bmFtaWNDaGlsZHJlbixhcHBDb250ZXh0OmkuYXBwQ29udGV4dCxkaXJzOmkuZGlycyx0cmFuc2l0aW9uOmkudHJhbnNpdGlvbixjb21wb25lbnQ6aS5jb21wb25lbnQsc3VzcGVuc2U6aS5zdXNwZW5zZSxzc0NvbnRlbnQ6aS5zc0NvbnRlbnQmJmlpKGkuc3NDb250ZW50KSxzc0ZhbGxiYWNrOmkuc3NGYWxsYmFjayYmaWkoaS5zc0ZhbGxiYWNrKSxlbDppLmVsLGFuY2hvcjppLmFuY2hvcn07cmV0dXJuICR9ZnVuY3Rpb24gRG8oKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXZvaWQgMD9hcmd1bWVudHNbMF06IiAiLHM9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOjA7cmV0dXJuIGZuKHV0LG51bGwsaSxzKX1mdW5jdGlvbiB1byhpLHMpe3ZhciBkPWZuKHB0LG51bGwsaSk7cmV0dXJuIGQuc3RhdGljQ291bnQ9cyxkfWZ1bmN0aW9uIFhuKCl7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOiIiLHM9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOiExO3JldHVybiBzPyh3bigpLG1pKFZ0LG51bGwsaSkpOmZuKFZ0LG51bGwsaSl9ZnVuY3Rpb24gWXQoaSl7cmV0dXJuIGk9PW51bGx8fHR5cGVvZiBpPT0iYm9vbGVhbiI/Zm4oVnQpOmYuaXNBcnJheShpKT9mbihHZSxudWxsLGkuc2xpY2UoKSk6dHlwZW9mIGk9PSJvYmplY3QiP29pKGkpOmZuKHV0LG51bGwsU3RyaW5nKGkpKX1mdW5jdGlvbiBvaShpKXtyZXR1cm4gaS5lbD09PW51bGx8fGkubWVtbz9pOmlpKGkpfWZ1bmN0aW9uIEFhKGkscyl7dmFyIGQ9MCx7c2hhcGVGbGFnOnB9PWk7aWYocz09bnVsbClzPW51bGw7ZWxzZSBpZihmLmlzQXJyYXkocykpZD0xNjtlbHNlIGlmKHR5cGVvZiBzPT0ib2JqZWN0IilpZihwJigxfDY0KSl7dmFyIHk9cy5kZWZhdWx0O3kmJih5Ll9jJiYoeS5fZD0hMSksQWEoaSx5KCkpLHkuX2MmJih5Ll9kPSEwKSk7cmV0dXJufWVsc2V7ZD0zMjt2YXIgdz1zLl87IXcmJiEoV2kgaW4gcyk/cy5fY3R4PU9uOnc9PT0zJiZPbiYmKE9uLnNsb3RzLl89PT0xP3MuXz0xOihzLl89MixpLnBhdGNoRmxhZ3w9MTAyNCkpfWVsc2UgZi5pc0Z1bmN0aW9uKHMpPyhzPXtkZWZhdWx0OnMsX2N0eDpPbn0sZD0zMik6KHM9U3RyaW5nKHMpLHAmNjQ/KGQ9MTYscz1bRG8ocyldKTpkPTgpO2kuY2hpbGRyZW49cyxpLnNoYXBlRmxhZ3w9ZH1mdW5jdGlvbiBQcigpe2Zvcih2YXIgaT17fSxzPTA7czxhcmd1bWVudHMubGVuZ3RoO3MrKyl7dmFyIGQ9czwwfHxhcmd1bWVudHMubGVuZ3RoPD1zP3ZvaWQgMDphcmd1bWVudHNbc107Zm9yKHZhciBwIGluIGQpaWYocD09PSJjbGFzcyIpaS5jbGFzcyE9PWQuY2xhc3MmJihpLmNsYXNzPWYubm9ybWFsaXplQ2xhc3MoW2kuY2xhc3MsZC5jbGFzc10pKTtlbHNlIGlmKHA9PT0ic3R5bGUiKWkuc3R5bGU9Zi5ub3JtYWxpemVTdHlsZShbaS5zdHlsZSxkLnN0eWxlXSk7ZWxzZSBpZihmLmlzT24ocCkpe3ZhciB5PWlbcF0sdz1kW3BdO3cmJnkhPT13JiYhKGYuaXNBcnJheSh5KSYmeS5pbmNsdWRlcyh3KSkmJihpW3BdPXk/W10uY29uY2F0KHksdyk6dyl9ZWxzZSBwIT09IiImJihpW3BdPWRbcF0pfXJldHVybiBpfWZ1bmN0aW9uIERyKGkscyxkKXt2YXIgcD1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106bnVsbDtZKGkscyw3LFtkLHBdKX12YXIgVHM9U2EoKSxycz0wO2Z1bmN0aW9uIEduKGkscyxkKXt2YXIgcD1pLnR5cGUseT0ocz9zLmFwcENvbnRleHQ6aS5hcHBDb250ZXh0KXx8VHMsdz17dWlkOnJzKyssdm5vZGU6aSx0eXBlOnAscGFyZW50OnMsYXBwQ29udGV4dDp5LHJvb3Q6bnVsbCxuZXh0Om51bGwsc3ViVHJlZTpudWxsLGVmZmVjdDpudWxsLHVwZGF0ZTpudWxsLHNjb3BlOm5ldyBULkVmZmVjdFNjb3BlKCEwKSxyZW5kZXI6bnVsbCxwcm94eTpudWxsLGV4cG9zZWQ6bnVsbCxleHBvc2VQcm94eTpudWxsLHdpdGhQcm94eTpudWxsLHByb3ZpZGVzOnM/cy5wcm92aWRlczpPYmplY3QuY3JlYXRlKHkucHJvdmlkZXMpLGFjY2Vzc0NhY2hlOm51bGwscmVuZGVyQ2FjaGU6W10sY29tcG9uZW50czpudWxsLGRpcmVjdGl2ZXM6bnVsbCxwcm9wc09wdGlvbnM6R28ocCx5KSxlbWl0c09wdGlvbnM6aHIocCx5KSxlbWl0Om51bGwsZW1pdHRlZDpudWxsLHByb3BzRGVmYXVsdHM6Zi5FTVBUWV9PQkosaW5oZXJpdEF0dHJzOnAuaW5oZXJpdEF0dHJzLGN0eDpmLkVNUFRZX09CSixkYXRhOmYuRU1QVFlfT0JKLHByb3BzOmYuRU1QVFlfT0JKLGF0dHJzOmYuRU1QVFlfT0JKLHNsb3RzOmYuRU1QVFlfT0JKLHJlZnM6Zi5FTVBUWV9PQkosc2V0dXBTdGF0ZTpmLkVNUFRZX09CSixzZXR1cENvbnRleHQ6bnVsbCxzdXNwZW5zZTpkLHN1c3BlbnNlSWQ6ZD9kLnBlbmRpbmdJZDowLGFzeW5jRGVwOm51bGwsYXN5bmNSZXNvbHZlZDohMSxpc01vdW50ZWQ6ITEsaXNVbm1vdW50ZWQ6ITEsaXNEZWFjdGl2YXRlZDohMSxiYzpudWxsLGM6bnVsbCxibTpudWxsLG06bnVsbCxidTpudWxsLHU6bnVsbCx1bTpudWxsLGJ1bTpudWxsLGRhOm51bGwsYTpudWxsLHJ0ZzpudWxsLHJ0YzpudWxsLGVjOm51bGwsc3A6bnVsbH07cmV0dXJuIHcuY3R4PXtfOnd9LHcucm9vdD1zP3Mucm9vdDp3LHcuZW1pdD1Uby5iaW5kKG51bGwsdyksaS5jZSYmaS5jZSh3KSx3fXZhciBBbj1udWxsLFFuPSgpPT5Bbnx8T24sRnI9aT0+e0FuPWksaS5zY29wZS5vbigpfSxraT0oKT0+e0FuJiZBbi5zY29wZS5vZmYoKSxBbj1udWxsfTtmdW5jdGlvbiBhaShpKXtyZXR1cm4gaS52bm9kZS5zaGFwZUZsYWcmNH1TLmlzSW5TU1JDb21wb25lbnRTZXR1cD0hMTtmdW5jdGlvbiBDYShpKXt2YXIgcz1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ITE7Uy5pc0luU1NSQ29tcG9uZW50U2V0dXA9czt2YXJ7cHJvcHM6ZCxjaGlsZHJlbjpwfT1pLnZub2RlLHk9YWkoaSk7V28oaSxkLHkscyksd2EoaSxwKTt2YXIgdz15P1lvKGkscyk6dm9pZCAwO3JldHVybiBTLmlzSW5TU1JDb21wb25lbnRTZXR1cD0hMSx3fWZ1bmN0aW9uIFlvKGkscyl7dmFyIGQ9aS50eXBlO2kuYWNjZXNzQ2FjaGU9T2JqZWN0LmNyZWF0ZShudWxsKSxpLnByb3h5PVQubWFya1JhdyhuZXcgUHJveHkoaS5jdHgsUmEpKTt2YXJ7c2V0dXA6cH09ZDtpZihwKXt2YXIgeT1pLnNldHVwQ29udGV4dD1wLmxlbmd0aD4xP1R0KGkpOm51bGw7RnIoaSksVC5wYXVzZVRyYWNraW5nKCk7dmFyIHc9c3QocCxpLDAsW2kucHJvcHMseV0pO2lmKFQucmVzZXRUcmFja2luZygpLGtpKCksZi5pc1Byb21pc2Uodykpe2lmKHcudGhlbihraSxraSkscylyZXR1cm4gdy50aGVuKEk9PntHaShpLEkscyl9KS5jYXRjaChJPT57dGUoSSxpLDApfSk7aS5hc3luY0RlcD13fWVsc2UgR2koaSx3LHMpfWVsc2UgaXMoaSxzKX1mdW5jdGlvbiBHaShpLHMsZCl7Zi5pc0Z1bmN0aW9uKHMpP2kudHlwZS5fX3NzcklubGluZVJlbmRlcj9pLnNzclJlbmRlcj1zOmkucmVuZGVyPXM6Zi5pc09iamVjdChzKSYmKGkuc2V0dXBTdGF0ZT1ULnByb3h5UmVmcyhzKSksaXMoaSxkKX12YXIgWWkscWk7ZnVuY3Rpb24gT2EoaSl7WWk9aSxxaT1zPT57cy5yZW5kZXIuX3JjJiYocy53aXRoUHJveHk9bmV3IFByb3h5KHMuY3R4LG5hKSl9fXZhciBEYT0oKT0+IVlpO2Z1bmN0aW9uIGlzKGkscyxkKXt2YXIgcD1pLnR5cGU7aWYoIWkucmVuZGVyKXtpZighcyYmWWkmJiFwLnJlbmRlcil7dmFyIHk9cC50ZW1wbGF0ZTtpZih5KXt2YXJ7aXNDdXN0b21FbGVtZW50OncsY29tcGlsZXJPcHRpb25zOkl9PWkuYXBwQ29udGV4dC5jb25maWcse2RlbGltaXRlcnM6TCxjb21waWxlck9wdGlvbnM6JH09cCxlZT1mLmV4dGVuZChmLmV4dGVuZCh7aXNDdXN0b21FbGVtZW50OncsZGVsaW1pdGVyczpMfSxJKSwkKTtwLnJlbmRlcj1ZaSh5LGVlKX19aS5yZW5kZXI9cC5yZW5kZXJ8fGYuTk9PUCxxaSYmcWkoaSl9RnIoaSksVC5wYXVzZVRyYWNraW5nKCksdHMoaSksVC5yZXNldFRyYWNraW5nKCksa2koKX1mdW5jdGlvbiBWZShpKXtyZXR1cm4gbmV3IFByb3h5KGkuYXR0cnMse2dldChzLGQpe3JldHVybiBULnRyYWNrKGksImdldCIsIiRhdHRycyIpLHNbZF19fSl9ZnVuY3Rpb24gVHQoaSl7dmFyIHM9cD0+e2kuZXhwb3NlZD1wfHx7fX0sZDtyZXR1cm57Z2V0IGF0dHJzKCl7cmV0dXJuIGR8fChkPVZlKGkpKX0sc2xvdHM6aS5zbG90cyxlbWl0OmkuZW1pdCxleHBvc2U6c319ZnVuY3Rpb24gUnQoaSl7aWYoaS5leHBvc2VkKXJldHVybiBpLmV4cG9zZVByb3h5fHwoaS5leHBvc2VQcm94eT1uZXcgUHJveHkoVC5wcm94eVJlZnMoVC5tYXJrUmF3KGkuZXhwb3NlZCkpLHtnZXQocyxkKXtpZihkIGluIHMpcmV0dXJuIHNbZF07aWYoZCBpbiBvbylyZXR1cm4gb29bZF0oaSl9fSkpfXZhciBUbj0vKD86XnxbLV9dKShcdykvZyxlcj1pPT5pLnJlcGxhY2UoVG4scz0+cy50b1VwcGVyQ2FzZSgpKS5yZXBsYWNlKC9bLV9dL2csIiIpO2Z1bmN0aW9uIFN0KGkpe3ZhciBzPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTohMDtyZXR1cm4gZi5pc0Z1bmN0aW9uKGkpP2kuZGlzcGxheU5hbWV8fGkubmFtZTppLm5hbWV8fHMmJmkuX19uYW1lfWZ1bmN0aW9uIHlvKGkscyl7dmFyIGQ9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOiExLHA9U3Qocyk7aWYoIXAmJnMuX19maWxlKXt2YXIgeT1zLl9fZmlsZS5tYXRjaCgvKFteL1xcXSspXC5cdyskLyk7eSYmKHA9eVsxXSl9aWYoIXAmJmkmJmkucGFyZW50KXt2YXIgdz1JPT57Zm9yKHZhciBMIGluIEkpaWYoSVtMXT09PXMpcmV0dXJuIEx9O3A9dyhpLmNvbXBvbmVudHN8fGkucGFyZW50LnR5cGUuY29tcG9uZW50cyl8fHcoaS5hcHBDb250ZXh0LmNvbXBvbmVudHMpfXJldHVybiBwP2VyKHApOmQ/IkFwcCI6IkFub255bW91cyJ9ZnVuY3Rpb24gRm8oaSl7cmV0dXJuIGYuaXNGdW5jdGlvbihpKSYmIl9fdmNjT3B0cyJpbiBpfXZhciBjYT0oaSxzKT0+VC5jb21wdXRlZChpLHMsUy5pc0luU1NSQ29tcG9uZW50U2V0dXApO2Z1bmN0aW9uIFBzKCl7cmV0dXJuIG51bGx9ZnVuY3Rpb24gcW8oKXtyZXR1cm4gbnVsbH1mdW5jdGlvbiB6bChpKXt9ZnVuY3Rpb24gYWwoaSxzKXtyZXR1cm4gbnVsbH1mdW5jdGlvbiBXbCgpe3JldHVybiBsbCgpLnNsb3RzfWZ1bmN0aW9uIHNsKCl7cmV0dXJuIGxsKCkuYXR0cnN9ZnVuY3Rpb24gbGwoKXt2YXIgaT1RbigpO3JldHVybiBpLnNldHVwQ29udGV4dHx8KGkuc2V0dXBDb250ZXh0PVR0KGkpKX1mdW5jdGlvbiBJcyhpLHMpe3ZhciBkPWYuaXNBcnJheShpKT9pLnJlZHVjZSgodyxJKT0+KHdbSV09e30sdykse30pOmk7Zm9yKHZhciBwIGluIHMpe3ZhciB5PWRbcF07eT9mLmlzQXJyYXkoeSl8fGYuaXNGdW5jdGlvbih5KT9kW3BdPXt0eXBlOnksZGVmYXVsdDpzW3BdfTp5LmRlZmF1bHQ9c1twXTp5PT09bnVsbCYmKGRbcF09e2RlZmF1bHQ6c1twXX0pfXJldHVybiBkfWZ1bmN0aW9uIEZhKGkscyl7dmFyIGQ9e30scD1mdW5jdGlvbih3KXtzLmluY2x1ZGVzKHcpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkoZCx3LHtlbnVtZXJhYmxlOiEwLGdldDooKT0+aVt3XX0pfTtmb3IodmFyIHkgaW4gaSlwKHkpO3JldHVybiBkfWZ1bmN0aW9uIFZhKGkpe3ZhciBzPVFuKCksZD1pKCk7cmV0dXJuIGtpKCksZi5pc1Byb21pc2UoZCkmJihkPWQuY2F0Y2gocD0+e3Rocm93IEZyKHMpLHB9KSksW2QsKCk9PkZyKHMpXX1mdW5jdGlvbiBLbyhpLHMsZCl7dmFyIHA9YXJndW1lbnRzLmxlbmd0aDtyZXR1cm4gcD09PTI/Zi5pc09iamVjdChzKSYmIWYuaXNBcnJheShzKT9vcihzKT9mbihpLG51bGwsW3NdKTpmbihpLHMpOmZuKGksbnVsbCxzKToocD4zP2Q9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpOnA9PT0zJiZvcihkKSYmKGQ9W2RdKSxmbihpLHMsZCkpfXZhciBvcz1TeW1ib2woIiIpLGNsPSgpPT57e3ZhciBpPXVpKG9zKTtyZXR1cm4gaXx8eHQoIlNlcnZlciByZW5kZXJpbmcgY29udGV4dCBub3QgcHJvdmlkZWQuIE1ha2Ugc3VyZSB0byBvbmx5IGNhbGwgdXNlU1NSQ29udGV4dCgpIGNvbmRpdGlvbmFsbHkgaW4gdGhlIHNlcnZlciBidWlsZC4iKSxpfX07ZnVuY3Rpb24gdWEoKXt9ZnVuY3Rpb24gYXMoaSxzLGQscCl7dmFyIHk9ZFtwXTtpZih5JiZOcyh5LGkpKXJldHVybiB5O3ZhciB3PXMoKTtyZXR1cm4gdy5tZW1vPWkuc2xpY2UoKSxkW3BdPXd9ZnVuY3Rpb24gTnMoaSxzKXt2YXIgZD1pLm1lbW87aWYoZC5sZW5ndGghPXMubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgcD0wO3A8ZC5sZW5ndGg7cCsrKWlmKGYuaGFzQ2hhbmdlZChkW3BdLHNbcF0pKXJldHVybiExO3JldHVybiBybj4wJiZPdCYmT3QucHVzaChpKSwhMH12YXIgc3M9IjMuMi4zNyIsdWw9e2NyZWF0ZUNvbXBvbmVudEluc3RhbmNlOkduLHNldHVwQ29tcG9uZW50OkNhLHJlbmRlckNvbXBvbmVudFJvb3Q6U3Isc2V0Q3VycmVudFJlbmRlcmluZ0luc3RhbmNlOlFpLGlzVk5vZGU6b3Isbm9ybWFsaXplVk5vZGU6WXR9LGZsPXVsLFRhPW51bGwsJGE9bnVsbDtmdW5jdGlvbiBmYShpLHMpe3JldHVybiBpPT09ImlucHV0Ij9uZXcgTi5VbmlJbnB1dEVsZW1lbnQoaSxzKTppPT09InRleHRhcmVhIj9uZXcgTi5VbmlUZXh0QXJlYUVsZW1lbnQoaSxzKTpuZXcgTi5VbmlFbGVtZW50KGkscyl9ZnVuY3Rpb24gZGwoaSxzKXtyZXR1cm4gbmV3IE4uVW5pVGV4dE5vZGUoaSxzKX1mdW5jdGlvbiBVYShpLHMpe3JldHVybiBuZXcgTi5VbmlDb21tZW50Tm9kZShpLHMpfXZhciBrcyx3bz17aW5zZXJ0OihpLHMsZCk9PntzLmluc2VydEJlZm9yZShpLGR8fG51bGwpfSxyZW1vdmU6aT0+e3ZhciBzPWkucGFyZW50Tm9kZTtzJiZzLnJlbW92ZUNoaWxkKGkpfSxjcmVhdGVFbGVtZW50OihpLHMpPT5mYShpLHMpLGNyZWF0ZVRleHQ6KGkscyk9PmRsKGkscyksY3JlYXRlQ29tbWVudDooaSxzKT0+VWEoaSxzKSxzZXRUZXh0OihpLHMpPT57aS5ub2RlVmFsdWU9c30sc2V0RWxlbWVudFRleHQ6KGkscyk9PntpLnRleHRDb250ZW50PXN9LHBhcmVudE5vZGU6aT0+aS5wYXJlbnROb2RlLG5leHRTaWJsaW5nOmk9PmkubmV4dFNpYmxpbmcsc2V0U2NvcGVJZChpLHMpe2kuc2V0QXR0cmlidXRlKHMsIiIpfSxjbG9uZU5vZGUoaSl7dmFyIHM9aS5jbG9uZU5vZGUoITApO3JldHVybiJfdmFsdWUiaW4gaSYmKHMuX3ZhbHVlPWkuX3ZhbHVlKSxzfSxpbnNlcnRTdGF0aWNDb250ZW50KGkscyxkKXt2YXIgcD1rc3x8KGtzPWZhKCJkaXYiKSk7cC5pbm5lckhUTUw9aTtmb3IodmFyIHk9cC5maXJzdENoaWxkLHc9eSxJPXc7dzspST13LHdvLmluc2VydCh3LHMsZCksdz1wLmZpcnN0Q2hpbGQ7cmV0dXJuW3ksSV19fTtmdW5jdGlvbiBIYShpLHMpe3M9PW51bGwmJihzPSIiKSxpLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHMpfWZ1bmN0aW9uIGphKGkscyxkKXtpZighZClpLnJlbW92ZUF0dHJpYnV0ZSgic3R5bGUiKTtlbHNlIGlmKGYuaXNTdHJpbmcoZCkpcyE9PWQmJmkuc2V0QXR0cmlidXRlKCJzdHlsZSIsZCk7ZWxzZXt2YXIgcD17fSx5PXMmJiFmLmlzU3RyaW5nKHMpO2lmKHkpe2Zvcih2YXIgdyBpbiBzKWRbd109PW51bGwmJihwW3ddPSIiKTtmb3IodmFyIEkgaW4gZCl7dmFyIEw9ZFtJXTtMIT09c1tJXSYmKHBbSV09TCl9fWVsc2UgZm9yKHZhciAkIGluIGQpcFskXT1kWyRdO09iamVjdC5rZXlzKHApLmxlbmd0aCYmaS5zZXRBdHRyaWJ1dGUoInN0eWxlIixwKX19ZnVuY3Rpb24gUGEoaSxzLGQpe2Q9PW51bGw/aS5yZW1vdmVBdHRyaWJ1dGUocyk6aS5zZXRBdHRyaWJ1dGUocyxkKX1mdW5jdGlvbiBscyhpLHMsZCxwKXtpLmFkZEV2ZW50TGlzdGVuZXIocyxkLHApfWZ1bmN0aW9uIHphKGkscyxkLHApe2kucmVtb3ZlRXZlbnRMaXN0ZW5lcihzLGQscCl9ZnVuY3Rpb24gY3MoaSxzLGQscCl7dmFyIHk9YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOm51bGwsdz1pLl92ZWl8fChpLl92ZWk9e30pLEk9d1tzXTtpZihwJiZJKUkudmFsdWU9cDtlbHNle3ZhcltMLCRdPXVzKHMpO2lmKHApe3ZhciBlZT13W3NdPXhzKHAseSk7bHMoaSxMLGVlLCQpfWVsc2UgSSYmKHphKGksTCxJLCQpLHdbc109dm9pZCAwKX19dmFyIFJzPS8oPzpPbmNlfFBhc3NpdmV8Q2FwdHVyZSkkLztmdW5jdGlvbiB1cyhpKXt2YXIgcztpZihScy50ZXN0KGkpKXtzPXt9O2Zvcih2YXIgZDtkPWkubWF0Y2goUnMpOylpPWkuc2xpY2UoMCxpLmxlbmd0aC1kWzBdLmxlbmd0aCksc1tkWzBdLnRvTG93ZXJDYXNlKCldPSEwfXJldHVybltmLmh5cGhlbmF0ZShpLnNsaWNlKDIpKSxzXX1mdW5jdGlvbiB4cyhpLHMpe3ZhciBkPXk9PntZKGQudmFsdWUscyw1LFt5XSl9O2QudmFsdWU9aTt2YXIgcD1uZXcgU2V0O3JldHVybiBmLmlzQXJyYXkoZC52YWx1ZSk/ZC52YWx1ZS5mb3JFYWNoKHk9Pnt5Lm1vZGlmaWVycyYmeS5tb2RpZmllcnMuZm9yRWFjaCh3PT57cC5hZGQodyl9KX0pOihkLnZhbHVlLm1vZGlmaWVycyYmZC52YWx1ZS5tb2RpZmllcnMuZm9yRWFjaCh5PT57cC5hZGQoeSl9KSxmcyhkLHMpKSxkLm1vZGlmaWVycz1bLi4ucF0sZH1mdW5jdGlvbiBmcyhpLHMpe2lmKCEhcyl7dmFyeyR3eHNNb2R1bGVzOmR9PXM7aWYoISFkKXt2YXIgcD1pLnZhbHVlLnRvU3RyaW5nKCk7IWQuZmluZCh5PT5wLmluZGV4T2YoIi4iK3krIi4iKT4tMSl8fChpLnd4c0V2ZW50PWkudmFsdWUoKSl9fX12YXIgaGw9ZnVuY3Rpb24oaSxzLGQscCl7dmFyIHk9YXJndW1lbnRzLmxlbmd0aD42P2FyZ3VtZW50c1s2XTp2b2lkIDA7c3dpdGNoKHMpe2Nhc2UiY2xhc3MiOkhhKGkscCk7YnJlYWs7Y2FzZSJzdHlsZSI6amEoaSxkLHApO2JyZWFrO2RlZmF1bHQ6aWYoZi5pc09uKHMpKWYuaXNNb2RlbExpc3RlbmVyKHMpfHxjcyhpLHMsZCxwLHkpO2Vsc2V7aWYoZi5pc09iamVjdChwKSl7dmFyIHc9ZD09PXA7aWYocD1OLkpTT05fUFJPVE9DT0wrSlNPTi5zdHJpbmdpZnkocCksdyYmaS5nZXRBdHRyaWJ1dGUocyk9PT1wKXJldHVybn1lbHNlIGlmKGQ9PT1wKXJldHVybjtQYShpLHMscCl9YnJlYWt9fTtmdW5jdGlvbiBXYSgpe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dm9pZCAwP2FyZ3VtZW50c1swXToiJHN0eWxlIjt7dmFyIHM9UW4oKTtpZighcylyZXR1cm4gZi5FTVBUWV9PQko7dmFyIGQ9cy50eXBlLl9fY3NzTW9kdWxlcztpZighZClyZXR1cm4gZi5FTVBUWV9PQko7dmFyIHA9ZFtpXTtyZXR1cm4gcHx8Zi5FTVBUWV9PQkp9fWZ1bmN0aW9uIF9pKGkpe3ZhciBzPVFuKCk7aWYoISFzKXt2YXIgZD0oKT0+S2kocy5zdWJUcmVlLGkocy5wcm94eSkpO2dpKCgpPT5xbihkLHtmbHVzaDoicG9zdCJ9KSksWXIoZCl9fWZ1bmN0aW9uIEtpKGkscyl7aWYoaS5zaGFwZUZsYWcmMTI4KXt2YXIgZD1pLnN1c3BlbnNlO2k9ZC5hY3RpdmVCcmFuY2gsZC5wZW5kaW5nQnJhbmNoJiYhZC5pc0h5ZHJhdGluZyYmZC5lZmZlY3RzLnB1c2goKCk9PntLaShkLmFjdGl2ZUJyYW5jaCxzKX0pfWZvcig7aS5jb21wb25lbnQ7KWk9aS5jb21wb25lbnQuc3ViVHJlZTtpZihpLnNoYXBlRmxhZyYxJiZpLmVsKUJzKGkuZWwscyk7ZWxzZSBpZihpLnR5cGU9PT1HZSlpLmNoaWxkcmVuLmZvckVhY2godz0+S2kodyxzKSk7ZWxzZSBpZihpLnR5cGU9PT1wdClmb3IodmFye2VsOnAsYW5jaG9yOnl9PWk7cCYmKEJzKHAscykscCE9PXkpOylwPXAubmV4dFNpYmxpbmd9ZnVuY3Rpb24gQnMoaSxzKXtpZihpLm5vZGVUeXBlPT09MSlmb3IodmFyIGQgaW4gcylpLnNldEF0dHJpYnV0ZSgiLS0iLmNvbmNhdChkKSxzW2RdKX12YXIgSm89InRyYW5zaXRpb24iLEdhPSJhbmltYXRpb24iLGRzPShpLHMpPT57dmFye3Nsb3RzOmR9PXM7cmV0dXJuIEtvKE9pLE1zKGkpLGQpfTtkcy5kaXNwbGF5TmFtZT0iVHJhbnNpdGlvbiI7dmFyIGdsPXtuYW1lOlN0cmluZyx0eXBlOlN0cmluZyxjc3M6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiEwfSxkdXJhdGlvbjpbU3RyaW5nLE51bWJlcixPYmplY3RdLGVudGVyRnJvbUNsYXNzOlN0cmluZyxlbnRlckFjdGl2ZUNsYXNzOlN0cmluZyxlbnRlclRvQ2xhc3M6U3RyaW5nLGFwcGVhckZyb21DbGFzczpTdHJpbmcsYXBwZWFyQWN0aXZlQ2xhc3M6U3RyaW5nLGFwcGVhclRvQ2xhc3M6U3RyaW5nLGxlYXZlRnJvbUNsYXNzOlN0cmluZyxsZWF2ZUFjdGl2ZUNsYXNzOlN0cmluZyxsZWF2ZVRvQ2xhc3M6U3RyaW5nfSxwbD1kcy5wcm9wcz1mLmV4dGVuZCh7fSxPaS5wcm9wcyxnbCksVm89ZnVuY3Rpb24oaSl7dmFyIHM9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOltdO2YuaXNBcnJheShpKT9pLmZvckVhY2goZD0+ZCguLi5zKSk6aSYmaSguLi5zKX0sdmw9aT0+aT9mLmlzQXJyYXkoaSk/aS5zb21lKHM9PnMubGVuZ3RoPjEpOmkubGVuZ3RoPjE6ITE7ZnVuY3Rpb24gTXMoaSl7dmFyIHM9e307Zm9yKHZhciBkIGluIGkpZCBpbiBnbHx8KHNbZF09aVtkXSk7aWYoaS5jc3M9PT0hMSlyZXR1cm4gczt2YXJ7bmFtZTpwPSJ2Iix0eXBlOnksZHVyYXRpb246dyxlbnRlckZyb21DbGFzczpJPSIiLmNvbmNhdChwLCItZW50ZXItZnJvbSIpLGVudGVyQWN0aXZlQ2xhc3M6TD0iIi5jb25jYXQocCwiLWVudGVyLWFjdGl2ZSIpLGVudGVyVG9DbGFzczokPSIiLmNvbmNhdChwLCItZW50ZXItdG8iKSxhcHBlYXJGcm9tQ2xhc3M6ZWU9SSxhcHBlYXJBY3RpdmVDbGFzczppZT1MLGFwcGVhclRvQ2xhc3M6SWU9JCxsZWF2ZUZyb21DbGFzczpvZT0iIi5jb25jYXQocCwiLWxlYXZlLWZyb20iKSxsZWF2ZUFjdGl2ZUNsYXNzOkNlPSIiLmNvbmNhdChwLCItbGVhdmUtYWN0aXZlIiksbGVhdmVUb0NsYXNzOkJlPSIiLmNvbmNhdChwLCItbGVhdmUtdG8iKX09aSxmdD1Mcyh3KSxBdD1mdCYmZnRbMF0sbWU9ZnQmJmZ0WzFdLHtvbkJlZm9yZUVudGVyOmxlLG9uRW50ZXI6U2Usb25FbnRlckNhbmNlbGxlZDpxZSxvbkxlYXZlOkhlLG9uTGVhdmVDYW5jZWxsZWQ6UmUsb25CZWZvcmVBcHBlYXI6bHQ9bGUsb25BcHBlYXI6eGU9U2Usb25BcHBlYXJDYW5jZWxsZWQ6SXQ9cWV9PXMsQ3Q9KGR0LEYsSyk9PntabyhkdCxGP0llOiQpLFpvKGR0LEY/aWU6TCksSyYmSygpfSxCdD0oZHQsRik9PntabyhkdCxCZSksWm8oZHQsQ2UpLEYmJkYoKX0sSnQ9ZHQ9PihGLEspPT57dmFyIGhlPWR0P3hlOlNlLHBlPSgpPT5DdChGLGR0LEspO1ZvKGhlLFtGLHBlXSksRHMoKCk9PntabyhGLGR0P2VlOkkpLGZvKEYsZHQ/SWU6JCksdmwoaGUpfHxtbChGLHksQXQscGUpfSl9O3JldHVybiBmLmV4dGVuZChzLHtvbkJlZm9yZUVudGVyKGR0KXtWbyhsZSxbZHRdKSxmbyhkdCxJKSxmbyhkdCxMKX0sb25CZWZvcmVBcHBlYXIoZHQpe1ZvKGx0LFtkdF0pLGZvKGR0LGVlKSxmbyhkdCxpZSl9LG9uRW50ZXI6SnQoITEpLG9uQXBwZWFyOkp0KCEwKSxvbkxlYXZlKGR0LEYpe3ZhciBLPSgpPT5CdChkdCxGKTtmbyhkdCxvZSksVnMoKSxmbyhkdCxDZSksRHMoKCk9PntabyhkdCxvZSksZm8oZHQsQmUpLHZsKEhlKXx8bWwoZHQseSxtZSxLKX0pLFZvKEhlLFtkdCxLXSl9LG9uRW50ZXJDYW5jZWxsZWQoZHQpe0N0KGR0LCExKSxWbyhxZSxbZHRdKX0sb25BcHBlYXJDYW5jZWxsZWQoZHQpe0N0KGR0LCEwKSxWbyhJdCxbZHRdKX0sb25MZWF2ZUNhbmNlbGxlZChkdCl7QnQoZHQpLFZvKFJlLFtkdF0pfX0pfWZ1bmN0aW9uIExzKGkpe2lmKGk9PW51bGwpcmV0dXJuIG51bGw7aWYoZi5pc09iamVjdChpKSlyZXR1cm5baHMoaS5lbnRlciksaHMoaS5sZWF2ZSldO3ZhciBzPWhzKGkpO3JldHVybltzLHNdfWZ1bmN0aW9uIGhzKGkpe3ZhciBzPWYudG9OdW1iZXIoaSk7cmV0dXJuIHN9ZnVuY3Rpb24gZm8oaSxzKXtzLnNwbGl0KC9ccysvKS5mb3JFYWNoKGQ9PmQmJmkuY2xhc3NMaXN0LmFkZChkKSksKGkuX3Z0Y3x8KGkuX3Z0Yz1uZXcgU2V0KSkuYWRkKHMpfWZ1bmN0aW9uIFpvKGkscyl7cy5zcGxpdCgvXHMrLykuZm9yRWFjaChwPT5wJiZpLmNsYXNzTGlzdC5yZW1vdmUocCkpO3ZhcntfdnRjOmR9PWk7ZCYmKGQuZGVsZXRlKHMpLGQuc2l6ZXx8KGkuX3Z0Yz12b2lkIDApKX1mdW5jdGlvbiBEcyhpKXtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PntyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoaSl9KX12YXIgR2w9MDtmdW5jdGlvbiBtbChpLHMsZCxwKXt2YXIgeT1pLl9lbmRJZD0rK0dsLHc9KCk9Pnt5PT09aS5fZW5kSWQmJnAoKX07aWYoZClyZXR1cm4gc2V0VGltZW91dCh3LGQpO3Zhcnt0eXBlOkksdGltZW91dDpMLHByb3BDb3VudDokfT1ncyhpLHMpO2lmKCFJKXJldHVybiBwKCk7dmFyIGVlPUkrImVuZCIsaWU9MCxJZT0oKT0+e2kucmVtb3ZlRXZlbnRMaXN0ZW5lcihlZSxvZSksdygpfSxvZT1DZT0+e0NlLnRhcmdldD09PWkmJisraWU+PSQmJkllKCl9O3NldFRpbWVvdXQoKCk9PntpZTwkJiZJZSgpfSxMKzEpLGkuYWRkRXZlbnRMaXN0ZW5lcihlZSxvZSl9ZnVuY3Rpb24gZ3MoaSxzKXt2YXIgZD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShpKSxwPUJlPT4oZFtCZV18fCIiKS5zcGxpdCgiLCAiKSx5PXAoSm8rIkRlbGF5Iiksdz1wKEpvKyJEdXJhdGlvbiIpLEk9RnMoeSx3KSxMPXAoR2ErIkRlbGF5IiksJD1wKEdhKyJEdXJhdGlvbiIpLGVlPUZzKEwsJCksaWU9bnVsbCxJZT0wLG9lPTA7cz09PUpvP0k+MCYmKGllPUpvLEllPUksb2U9dy5sZW5ndGgpOnM9PT1HYT9lZT4wJiYoaWU9R2EsSWU9ZWUsb2U9JC5sZW5ndGgpOihJZT1NYXRoLm1heChJLGVlKSxpZT1JZT4wP0k+ZWU/Sm86R2E6bnVsbCxvZT1pZT9pZT09PUpvP3cubGVuZ3RoOiQubGVuZ3RoOjApO3ZhciBDZT1pZT09PUpvJiYvXGIodHJhbnNmb3JtfGFsbCkoLHwkKS8udGVzdChkW0pvKyJQcm9wZXJ0eSJdKTtyZXR1cm57dHlwZTppZSx0aW1lb3V0OkllLHByb3BDb3VudDpvZSxoYXNUcmFuc2Zvcm06Q2V9fWZ1bmN0aW9uIEZzKGkscyl7Zm9yKDtpLmxlbmd0aDxzLmxlbmd0aDspaT1pLmNvbmNhdChpKTtyZXR1cm4gTWF0aC5tYXgoLi4ucy5tYXAoKGQscCk9Pl9sKGQpK19sKGlbcF0pKSl9ZnVuY3Rpb24gX2woaSl7cmV0dXJuIE51bWJlcihpLnNsaWNlKDAsLTEpLnJlcGxhY2UoIiwiLCIuIikpKjFlM31mdW5jdGlvbiBWcygpe3JldHVybiBkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodH12YXIgYmw9bmV3IFdlYWtNYXAsRWw9bmV3IFdlYWtNYXAseWw9e25hbWU6IlRyYW5zaXRpb25Hcm91cCIscHJvcHM6Zi5leHRlbmQoe30scGwse3RhZzpTdHJpbmcsbW92ZUNsYXNzOlN0cmluZ30pLHNldHVwKGkscyl7dmFye3Nsb3RzOmR9PXMscD1RbigpLHk9SG4oKSx3LEk7cmV0dXJuIFlyKCgpPT57aWYoISF3Lmxlbmd0aCl7dmFyIEw9aS5tb3ZlQ2xhc3N8fCIiLmNvbmNhdChpLm5hbWV8fCJ2IiwiLW1vdmUiKTtpZighIWMod1swXS5lbCxwLnZub2RlLmVsLEwpKXt3LmZvckVhY2goWWwpLHcuZm9yRWFjaChxbCk7dmFyICQ9dy5maWx0ZXIobyk7VnMoKSwkLmZvckVhY2goZWU9Pnt2YXIgaWU9ZWUuZWwsSWU9aWUuc3R5bGU7Zm8oaWUsTCksSWUudHJhbnNmb3JtPUllLndlYmtpdFRyYW5zZm9ybT1JZS50cmFuc2l0aW9uRHVyYXRpb249IiI7dmFyIG9lPWllLl9tb3ZlQ2I9Q2U9PntDZSYmQ2UudGFyZ2V0IT09aWV8fCghQ2V8fC90cmFuc2Zvcm0kLy50ZXN0KENlLnByb3BlcnR5TmFtZSkpJiYoaWUucmVtb3ZlRXZlbnRMaXN0ZW5lcigidHJhbnNpdGlvbmVuZCIsb2UpLGllLl9tb3ZlQ2I9bnVsbCxabyhpZSxMKSl9O2llLmFkZEV2ZW50TGlzdGVuZXIoInRyYW5zaXRpb25lbmQiLG9lKX0pfX19KSwoKT0+e3ZhciBMPVQudG9SYXcoaSksJD1NcyhMKSxlZT1MLnRhZ3x8R2U7dz1JLEk9ZC5kZWZhdWx0P09yKGQuZGVmYXVsdCgpKTpbXTtmb3IodmFyIGllPTA7aWU8SS5sZW5ndGg7aWUrKyl7dmFyIEllPUlbaWVdO0llLmtleSE9bnVsbCYmV24oSWUsZmkoSWUsJCx5LHApKX1pZih3KWZvcih2YXIgb2U9MDtvZTx3Lmxlbmd0aDtvZSsrKXt2YXIgQ2U9d1tvZV07V24oQ2UsZmkoQ2UsJCx5LHApKSxibC5zZXQoQ2UsQ2UuZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpfXJldHVybiBmbihlZSxudWxsLEkpfX19LHdsPXlsO2Z1bmN0aW9uIFlsKGkpe3ZhciBzPWkuZWw7cy5fbW92ZUNiJiZzLl9tb3ZlQ2IoKSxzLl9lbnRlckNiJiZzLl9lbnRlckNiKCl9ZnVuY3Rpb24gcWwoaSl7RWwuc2V0KGksaS5lbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSl9ZnVuY3Rpb24gbyhpKXt2YXIgcz1ibC5nZXQoaSksZD1FbC5nZXQoaSkscD1zLmxlZnQtZC5sZWZ0LHk9cy50b3AtZC50b3A7aWYocHx8eSl7dmFyIHc9aS5lbC5zdHlsZTtyZXR1cm4gdy50cmFuc2Zvcm09dy53ZWJraXRUcmFuc2Zvcm09InRyYW5zbGF0ZSgiLmNvbmNhdChwLCJweCwiKS5jb25jYXQoeSwicHgpIiksdy50cmFuc2l0aW9uRHVyYXRpb249IjBzIixpfX1mdW5jdGlvbiBjKGkscyxkKXt2YXIgcD1pLmNsb25lTm9kZSgpO2kuX3Z0YyYmaS5fdnRjLmZvckVhY2goST0+e0kuc3BsaXQoL1xzKy8pLmZvckVhY2goTD0+TCYmcC5jbGFzc0xpc3QucmVtb3ZlKEwpKX0pLGQuc3BsaXQoL1xzKy8pLmZvckVhY2goST0+SSYmcC5jbGFzc0xpc3QuYWRkKEkpKSxwLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3ZhciB5PXMubm9kZVR5cGU9PT0xP3M6cy5wYXJlbnROb2RlO3kuYXBwZW5kQ2hpbGQocCk7dmFye2hhc1RyYW5zZm9ybTp3fT1ncyhwKTtyZXR1cm4geS5yZW1vdmVDaGlsZChwKSx3fXZhciB2PWk9Pnt2YXIgcz1pLnByb3BzWyJvblVwZGF0ZTptb2RlbFZhbHVlIl07cmV0dXJuIGYuaXNBcnJheShzKT9kPT5mLmludm9rZUFycmF5Rm5zKHMsZCk6c30sRT17Y3JlYXRlZChpLHMsZCl7dmFye3ZhbHVlOnAsbW9kaWZpZXJzOnt0cmltOnksbnVtYmVyOnd9fT1zO2kudmFsdWU9cD09bnVsbD8iIjpwLGkuX2Fzc2lnbj12KGQpLGxzKGksImlucHV0IixJPT57dmFyIEw9SS5kZXRhaWwudmFsdWUsJD1pLnBhZ2VOb2RlO2kucGFnZU5vZGU9bnVsbCxpLnZhbHVlPUwsaS5wYWdlTm9kZT0kLHk/TD1MLnRyaW0oKTp3JiYoTD1mLnRvTnVtYmVyKEwpKSxpLl9hc3NpZ24oTCl9KX0sYmVmb3JlVXBkYXRlKGkscyxkKXt2YXJ7dmFsdWU6cH09cztpLl9hc3NpZ249dihkKTt2YXIgeT1wPT1udWxsPyIiOnA7aS52YWx1ZSE9PXkmJihpLnZhbHVlPXkpfX0sUD1FLEM9WyJjdHJsIiwic2hpZnQiLCJhbHQiLCJtZXRhIl0sVj17c3RvcDppPT5pLnN0b3BQcm9wYWdhdGlvbigpLHByZXZlbnQ6aT0+aS5wcmV2ZW50RGVmYXVsdCgpLHNlbGY6aT0+aS50YXJnZXQhPT1pLmN1cnJlbnRUYXJnZXQsY3RybDppPT4haS5jdHJsS2V5LHNoaWZ0Omk9PiFpLnNoaWZ0S2V5LGFsdDppPT4haS5hbHRLZXksbWV0YTppPT4haS5tZXRhS2V5LGxlZnQ6aT0+ImJ1dHRvbiJpbiBpJiZpLmJ1dHRvbiE9PTAsbWlkZGxlOmk9PiJidXR0b24iaW4gaSYmaS5idXR0b24hPT0xLHJpZ2h0Omk9PiJidXR0b24iaW4gaSYmaS5idXR0b24hPT0yLGV4YWN0OihpLHMpPT5DLnNvbWUoZD0+aVsiIi5jb25jYXQoZCwiS2V5IildJiYhcy5pbmNsdWRlcyhkKSl9LEc9KGkscyk9Pnt2YXIgZD1mdW5jdGlvbihwKXtmb3IodmFyIHk9MDt5PHMubGVuZ3RoO3krKyl7dmFyIHc9VltzW3ldXTtpZih3JiZ3KHAscykpcmV0dXJufWZvcih2YXIgST1hcmd1bWVudHMubGVuZ3RoLEw9bmV3IEFycmF5KEk+MT9JLTE6MCksJD0xOyQ8STskKyspTFskLTFdPWFyZ3VtZW50c1skXTtyZXR1cm4gaShwLC4uLkwpfTtyZXR1cm4gZC5tb2RpZmllcnM9cyxkfSxxPXtlc2M6ImVzY2FwZSIsc3BhY2U6IiAiLHVwOiJhcnJvdy11cCIsbGVmdDoiYXJyb3ctbGVmdCIscmlnaHQ6ImFycm93LXJpZ2h0Iixkb3duOiJhcnJvdy1kb3duIixkZWxldGU6ImJhY2tzcGFjZSJ9LGFlPShpLHMpPT5kPT57aWYoImtleSJpbiBkKXt2YXIgcD1mLmh5cGhlbmF0ZShkLmtleSk7aWYocy5zb21lKHk9Pnk9PT1wfHxxW3ldPT09cCkpcmV0dXJuIGkoZCl9fSxMZT17YmVmb3JlTW91bnQoaSxzKXt2YXJ7dmFsdWU6ZH09cztYZShpLGQpfSx1cGRhdGVkKGkscyl7dmFye3ZhbHVlOmQsb2xkVmFsdWU6cH09czshZCE9IXAmJlhlKGksZCl9LGJlZm9yZVVubW91bnQoaSxzKXt2YXJ7dmFsdWU6ZH09cztYZShpLGQpfX07ZnVuY3Rpb24gWGUoaSxzKXtpLnNldEF0dHJpYnV0ZSgiLnZTaG93IiwhIXMpfXZhciBzZT1mLmV4dGVuZCh7cGF0Y2hQcm9wOmhsLGZvcmNlUGF0Y2hQcm9wOk4uZm9yY2VQYXRjaFByb3B9LHdvKSwkZTtmdW5jdGlvbiBXZSgpe3JldHVybiAkZXx8KCRlPXooc2UpKX12YXIgX3Q9ZnVuY3Rpb24oKXtXZSgpLnJlbmRlciguLi5hcmd1bWVudHMpfSxQdD1mdW5jdGlvbigpe3ZhciBpPVdlKCkuY3JlYXRlQXBwKC4uLmFyZ3VtZW50cykse21vdW50OnN9PWk7cmV0dXJuIGkubW91bnQ9ZD0+KGYuaXNTdHJpbmcoZCkmJihkPVVhKGQpKSxkJiZzKGQsITEsITEpKSxpfSxfZT1QdDtmdW5jdGlvbiBmZSgpe31mdW5jdGlvbiBUZSgpe31yZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KFMsImNhbWVsaXplIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZi5jYW1lbGl6ZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoUywiY2FwaXRhbGl6ZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGYuY2FwaXRhbGl6ZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoUywibm9ybWFsaXplQ2xhc3MiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBmLm5vcm1hbGl6ZUNsYXNzfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTLCJub3JtYWxpemVQcm9wcyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGYubm9ybWFsaXplUHJvcHN9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KFMsIm5vcm1hbGl6ZVN0eWxlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZi5ub3JtYWxpemVTdHlsZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoUywidG9EaXNwbGF5U3RyaW5nIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZi50b0Rpc3BsYXlTdHJpbmd9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KFMsInRvSGFuZGxlcktleSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGYudG9IYW5kbGVyS2V5fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTLCJFZmZlY3RTY29wZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFQuRWZmZWN0U2NvcGV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KFMsIlJlYWN0aXZlRWZmZWN0Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gVC5SZWFjdGl2ZUVmZmVjdH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoUywiY3VzdG9tUmVmIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gVC5jdXN0b21SZWZ9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KFMsImVmZmVjdCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFQuZWZmZWN0fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTLCJlZmZlY3RTY29wZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFQuZWZmZWN0U2NvcGV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KFMsImdldEN1cnJlbnRTY29wZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFQuZ2V0Q3VycmVudFNjb3BlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTLCJpc1Byb3h5Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gVC5pc1Byb3h5fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTLCJpc1JlYWN0aXZlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gVC5pc1JlYWN0aXZlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTLCJpc1JlYWRvbmx5Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gVC5pc1JlYWRvbmx5fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTLCJpc1JlZiIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFQuaXNSZWZ9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KFMsImlzU2hhbGxvdyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFQuaXNTaGFsbG93fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTLCJtYXJrUmF3Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gVC5tYXJrUmF3fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTLCJvblNjb3BlRGlzcG9zZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFQub25TY29wZURpc3Bvc2V9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KFMsInByb3h5UmVmcyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFQucHJveHlSZWZzfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTLCJyZWFjdGl2ZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFQucmVhY3RpdmV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KFMsInJlYWRvbmx5Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gVC5yZWFkb25seX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoUywicmVmIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gVC5yZWZ9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KFMsInNoYWxsb3dSZWFjdGl2ZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFQuc2hhbGxvd1JlYWN0aXZlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTLCJzaGFsbG93UmVhZG9ubHkiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBULnNoYWxsb3dSZWFkb25seX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoUywic2hhbGxvd1JlZiIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFQuc2hhbGxvd1JlZn19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoUywic3RvcCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFQuc3RvcH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoUywidG9SYXciLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBULnRvUmF3fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTLCJ0b1JlZiIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFQudG9SZWZ9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KFMsInRvUmVmcyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFQudG9SZWZzfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTLCJ0cmlnZ2VyUmVmIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gVC50cmlnZ2VyUmVmfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTLCJ1bnJlZiIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFQudW5yZWZ9fSksUy5CYXNlVHJhbnNpdGlvbj1PaSxTLkNvbW1lbnQ9VnQsUy5GcmFnbWVudD1HZSxTLktlZXBBbGl2ZT1VaSxTLlN0YXRpYz1wdCxTLlN1c3BlbnNlPXpuLFMuVGVsZXBvcnQ9bnQsUy5UZXh0PXV0LFMuVHJhbnNpdGlvbj1kcyxTLlRyYW5zaXRpb25Hcm91cD13bCxTLmNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nPVksUy5jYWxsV2l0aEVycm9ySGFuZGxpbmc9c3QsUy5jbG9uZVZOb2RlPWlpLFMuY29tcGF0VXRpbHM9JGEsUy5jb21wdXRlZD1jYSxTLmNyZWF0ZUFwcD1QdCxTLmNyZWF0ZUJsb2NrPW1pLFMuY3JlYXRlQ29tbWVudD1VYSxTLmNyZWF0ZUNvbW1lbnRWTm9kZT1YbixTLmNyZWF0ZUVsZW1lbnQ9ZmEsUy5jcmVhdGVFbGVtZW50QmxvY2s9TG4sUy5jcmVhdGVFbGVtZW50Vk5vZGU9THQsUy5jcmVhdGVIeWRyYXRpb25SZW5kZXJlcj1qLFMuY3JlYXRlUHJvcHNSZXN0UHJveHk9RmEsUy5jcmVhdGVSZW5kZXJlcj16LFMuY3JlYXRlU1NSQXBwPV9lLFMuY3JlYXRlU2xvdHM9ZWEsUy5jcmVhdGVTdGF0aWNWTm9kZT11byxTLmNyZWF0ZVRleHROb2RlPWRsLFMuY3JlYXRlVGV4dFZOb2RlPURvLFMuY3JlYXRlVk5vZGU9Zm4sUy5jcmVhdGVWdWVBcHA9UHQsUy5kZWZpbmVBc3luY0NvbXBvbmVudD1rbyxTLmRlZmluZUNvbXBvbmVudD1JbixTLmRlZmluZUVtaXRzPXFvLFMuZGVmaW5lRXhwb3NlPXpsLFMuZGVmaW5lUHJvcHM9UHMsUy5nZXRDdXJyZW50SW5zdGFuY2U9UW4sUy5nZXRUcmFuc2l0aW9uUmF3Q2hpbGRyZW49T3IsUy5ndWFyZFJlYWN0aXZlUHJvcHM9cXIsUy5oPUtvLFMuaGFuZGxlRXJyb3I9dGUsUy5pbml0Q3VzdG9tRm9ybWF0dGVyPXVhLFMuaW5qZWN0PXVpLFMuaW5qZWN0SG9vaz12cixTLmlzTWVtb1NhbWU9TnMsUy5pc1J1bnRpbWVPbmx5PURhLFMuaXNWTm9kZT1vcixTLm1lcmdlRGVmYXVsdHM9SXMsUy5tZXJnZVByb3BzPVByLFMubmV4dFRpY2s9cXQsUy5vbkFjdGl2YXRlZD1wcixTLm9uQmVmb3JlQWN0aXZhdGU9ZmUsUy5vbkJlZm9yZURlYWN0aXZhdGU9VGUsUy5vbkJlZm9yZU1vdW50PVBpLFMub25CZWZvcmVVbm1vdW50PXZpLFMub25CZWZvcmVVcGRhdGU9cGksUy5vbkRlYWN0aXZhdGVkPUpuLFMub25FcnJvckNhcHR1cmVkPW5lLFMub25Nb3VudGVkPWdpLFMub25SZW5kZXJUcmFja2VkPXgsUy5vblJlbmRlclRyaWdnZXJlZD1pbyxTLm9uU2VydmVyUHJlZmV0Y2g9amksUy5vblVubW91bnRlZD1ybyxTLm9uVXBkYXRlZD1ZcixTLm9wZW5CbG9jaz13bixTLnBvcFNjb3BlSWQ9Z28sUy5wcm92aWRlPUFpLFMucHVzaFNjb3BlSWQ9ZW8sUy5xdWV1ZVBvc3RGbHVzaENiPXhuLFMucmVnaXN0ZXJSdW50aW1lQ29tcGlsZXI9T2EsUy5yZW5kZXI9X3QsUy5yZW5kZXJMaXN0PW1yLFMucmVuZGVyU2xvdD16byxTLnJlc29sdmVDb21wb25lbnQ9WCxTLnJlc29sdmVEaXJlY3RpdmU9TW4sUy5yZXNvbHZlRHluYW1pY0NvbXBvbmVudD10bixTLnJlc29sdmVGaWx0ZXI9VGEsUy5yZXNvbHZlVHJhbnNpdGlvbkhvb2tzPWZpLFMuc2V0QmxvY2tUcmFja2luZz1TbixTLnNldERldnRvb2xzSG9vaz1PbyxTLnNldFRyYW5zaXRpb25Ib29rcz1XbixTLnNzckNvbnRleHRLZXk9b3MsUy5zc3JVdGlscz1mbCxTLnRvSGFuZGxlcnM9Um8sUy50cmFuc2Zvcm1WTm9kZUFyZ3M9Qm8sUy51c2VBdHRycz1zbCxTLnVzZUNzc01vZHVsZT1XYSxTLnVzZUNzc1ZhcnM9X2ksUy51c2VTU1JDb250ZXh0PWNsLFMudXNlU2xvdHM9V2wsUy51c2VUcmFuc2l0aW9uU3RhdGU9SG4sUy52TW9kZWxEeW5hbWljPVAsUy52TW9kZWxUZXh0PUUsUy52U2hvdz1MZSxTLnZlcnNpb249c3MsUy53YXJuPXh0LFMud2F0Y2g9eWUsUy53YXRjaEVmZmVjdD1xbixTLndhdGNoUG9zdEVmZmVjdD1DcixTLndhdGNoU3luY0VmZmVjdD1WaSxTLndpdGhBc3luY0NvbnRleHQ9VmEsUy53aXRoQ3R4PWNyLFMud2l0aERlZmF1bHRzPWFsLFMud2l0aERpcmVjdGl2ZXM9ZGUsUy53aXRoS2V5cz1hZSxTLndpdGhNZW1vPWFzLFMud2l0aE1vZGlmaWVycz1HLFMud2l0aFNjb3BlSWQ9U2ksT2JqZWN0LmRlZmluZVByb3BlcnR5KFMsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLFN9KHt9LGwsXyxBKTtyZXR1cm4gay5fX1RZUEVfXz0idnVlIixrfWZ1bmN0aW9uIEZwKGcsbCxfKXtsZXQgQT1fLlZ1ZSxrPV8uc2V0VGltZW91dCxTPV8uY2xlYXJUaW1lb3V0LE49Xy5zZXRJbnRlcnZhbCxmPV8uY2xlYXJJbnRlcnZhbCxUPV8uX191bmlDb25maWcsemU9Xy5fX3VuaVJvdXRlcyx4dD1fLlZ1ZVNoYXJlZCxwbj1fLlVuaVNoYXJlZDt2YXIgQj1mdW5jdGlvbihZLHRlLEVuKXsidXNlIHN0cmljdCI7dmFyIHluPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIixsbj1mdW5jdGlvbigpe2xldCBlPW5ldyBVaW50OEFycmF5KDI1Nik7Zm9yKHZhciB0PTA7dDx5bi5sZW5ndGg7dCsrKWVbeW4uY2hhckNvZGVBdCh0KV09dDtyZXR1cm4gZX0oKTtmdW5jdGlvbiAkbihlKXt2YXIgdD1uZXcgVWludDhBcnJheShlKSxuLHI9dC5sZW5ndGgsYT0iIjtmb3Iobj0wO248cjtuKz0zKWErPXluW3Rbbl0+PjJdLGErPXluWyh0W25dJjMpPDw0fHRbbisxXT4+NF0sYSs9eW5bKHRbbisxXSYxNSk8PDJ8dFtuKzJdPj42XSxhKz15blt0W24rMl0mNjNdO3JldHVybiByJTM9PT0yP2E9YS5zdWJzdHJpbmcoMCxhLmxlbmd0aC0xKSsiPSI6ciUzPT09MSYmKGE9YS5zdWJzdHJpbmcoMCxhLmxlbmd0aC0yKSsiPT0iKSxhfWZ1bmN0aW9uIGFuKGUpe3ZhciB0PWUubGVuZ3RoKi43NSxuPWUubGVuZ3RoLHIsYT0wLHUsaCxiLFU7ZVtlLmxlbmd0aC0xXT09PSI9IiYmKHQtLSxlW2UubGVuZ3RoLTJdPT09Ij0iJiZ0LS0pO3ZhciBPPW5ldyBBcnJheUJ1ZmZlcih0KSxEPW5ldyBVaW50OEFycmF5KE8pO2ZvcihyPTA7cjxuO3IrPTQpdT1sbltlLmNoYXJDb2RlQXQocildLGg9bG5bZS5jaGFyQ29kZUF0KHIrMSldLGI9bG5bZS5jaGFyQ29kZUF0KHIrMildLFU9bG5bZS5jaGFyQ29kZUF0KHIrMyldLERbYSsrXT11PDwyfGg+PjQsRFthKytdPShoJjE1KTw8NHxiPj4yLERbYSsrXT0oYiYzKTw8NnxVJjYzO3JldHVybiBPfWxldCBrbj1bIm9yaWdpbmFsIiwiY29tcHJlc3NlZCJdLFVuPVsiYWxidW0iLCJjYW1lcmEiXSxtbj1bIkdFVCIsIk9QVElPTlMiLCJIRUFEIiwiUE9TVCIsIlBVVCIsIkRFTEVURSIsIlRSQUNFIiwiQ09OTkVDVCIsIlBBVENIIl07ZnVuY3Rpb24gc24oZSx0KXtyZXR1cm4hZXx8dC5pbmRleE9mKGUpPT09LTE/dFswXTplfWZ1bmN0aW9uIF9uKGUsdCl7cmV0dXJuIVkuaXNBcnJheShlKXx8ZS5sZW5ndGg9PT0wfHxlLmZpbmQobj0+dC5pbmRleE9mKG4pPT09LTEpP3Q6ZX1mdW5jdGlvbiBSbihlLHQpe2NvbnNvbGUud2FybihgJHtlfTogJHt0fWApfWZ1bmN0aW9uIGtyKGUsdCxuLHIpe3J8fChyPVJuKTtmb3IobGV0IGEgaW4gbil7bGV0IHU9VWUoYSx0W2FdLG5bYV0sIVkuaGFzT3duKHQsYSkpO1kuaXNTdHJpbmcodSkmJnIoZSx1KX19ZnVuY3Rpb24gWnIoZSx0LG4scil7aWYoIW4pcmV0dXJuO2lmKCFZLmlzQXJyYXkobikpcmV0dXJuIGtyKGUsdFswXXx8T2JqZWN0LmNyZWF0ZShudWxsKSxuLHIpO2xldCBhPW4ubGVuZ3RoLHU9dC5sZW5ndGg7Zm9yKGxldCBoPTA7aDxhO2grKyl7bGV0IGI9bltoXSxVPU9iamVjdC5jcmVhdGUobnVsbCk7dT5oJiYoVVtiLm5hbWVdPXRbaF0pLGtyKGUsVSx7W2IubmFtZV06Yn0scil9fWZ1bmN0aW9uIFVlKGUsdCxuLHIpe1kuaXNQbGFpbk9iamVjdChuKXx8KG49e3R5cGU6bn0pO2xldHt0eXBlOmEscmVxdWlyZWQ6dSx2YWxpZGF0b3I6aH09bjtpZih1JiZyKXJldHVybidNaXNzaW5nIHJlcXVpcmVkIGFyZ3M6ICInK2UrJyInO2lmKCEodD09bnVsbCYmIXUpKXtpZihhIT1udWxsKXtsZXQgYj0hMSxVPVkuaXNBcnJheShhKT9hOlthXSxPPVtdO2ZvcihsZXQgRD0wO0Q8VS5sZW5ndGgmJiFiO0QrKyl7bGV0e3ZhbGlkOmdlLGV4cGVjdGVkVHlwZTp3ZX09dnQodCxVW0RdKTtPLnB1c2god2V8fCIiKSxiPWdlfWlmKCFiKXJldHVybiBxdChlLHQsTyl9aWYoaClyZXR1cm4gaCh0KX19bGV0IGl0PVkubWFrZU1hcCgiU3RyaW5nLE51bWJlcixCb29sZWFuLEZ1bmN0aW9uLFN5bWJvbCIpO2Z1bmN0aW9uIHZ0KGUsdCl7bGV0IG4scj1ubih0KTtpZihpdChyKSl7bGV0IGE9dHlwZW9mIGU7bj1hPT09ci50b0xvd2VyQ2FzZSgpLCFuJiZhPT09Im9iamVjdCImJihuPWUgaW5zdGFuY2VvZiB0KX1lbHNlIHI9PT0iT2JqZWN0Ij9uPVkuaXNPYmplY3QoZSk6cj09PSJBcnJheSI/bj1ZLmlzQXJyYXkoZSk6bj1lIGluc3RhbmNlb2YgdHx8WS50b1Jhd1R5cGUoZSk9PT1ubih0KTtyZXR1cm57dmFsaWQ6bixleHBlY3RlZFR5cGU6cn19ZnVuY3Rpb24gcXQoZSx0LG4pe2xldCByPWBJbnZhbGlkIGFyZ3M6IHR5cGUgY2hlY2sgZmFpbGVkIGZvciBhcmdzICIke2V9Ii4gRXhwZWN0ZWQgJHtuLm1hcChZLmNhcGl0YWxpemUpLmpvaW4oIiwgIil9YCxhPW5bMF0sdT1ZLnRvUmF3VHlwZSh0KSxoPVF0KHQsYSksYj1RdCh0LHUpO3JldHVybiBuLmxlbmd0aD09PTEmJmlyKGEpJiYhbHIoYSx1KSYmKHIrPWAgd2l0aCB2YWx1ZSAke2h9YCkscis9YCwgZ290ICR7dX0gYCxpcih1KSYmKHIrPWB3aXRoIHZhbHVlICR7Yn0uYCkscn1mdW5jdGlvbiBubihlKXtsZXQgdD1lJiZlLnRvU3RyaW5nKCkubWF0Y2goL15ccypmdW5jdGlvbiAoXHcrKS8pO3JldHVybiB0P3RbMV06IiJ9ZnVuY3Rpb24gUXQoZSx0KXtyZXR1cm4gdD09PSJTdHJpbmciP2AiJHtlfSJgOnQ9PT0iTnVtYmVyIj9gJHtOdW1iZXIoZSl9YDpgJHtlfWB9ZnVuY3Rpb24gaXIoZSl7cmV0dXJuWyJzdHJpbmciLCJudW1iZXIiLCJib29sZWFuIl0uc29tZShuPT5lLnRvTG93ZXJDYXNlKCk9PT1uKX1mdW5jdGlvbiBsciguLi5lKXtyZXR1cm4gZS5zb21lKHQ9PnQudG9Mb3dlckNhc2UoKT09PSJib29sZWFuIil9ZnVuY3Rpb24gTGkoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dHJ5e3JldHVybiBlLmFwcGx5KGUsYXJndW1lbnRzKX1jYXRjaCh0KXtjb25zb2xlLmVycm9yKHQpfX19bGV0IERpPTEseG49e307ZnVuY3Rpb24gd3IoZSx0LG4scj0hMSl7cmV0dXJuIHhuW2VdPXtuYW1lOnQsa2VlcEFsaXZlOnIsY2FsbGJhY2s6bn0sZX1mdW5jdGlvbiBVcihlLHQsbil7aWYodHlwZW9mIGU9PSJudW1iZXIiKXtsZXQgcj14bltlXTtpZihyKXJldHVybiByLmtlZXBBbGl2ZXx8ZGVsZXRlIHhuW2VdLHIuY2FsbGJhY2sodCxuKX1yZXR1cm4gdH1mdW5jdGlvbiBIcihlKXtmb3IobGV0IHQgaW4geG4paWYoeG5bdF0ubmFtZT09PWUpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gWmkoZSx0KXtmb3IobGV0IG4gaW4geG4pe2xldCByPXhuW25dO3IuY2FsbGJhY2s9PT10JiZyLm5hbWU9PT1lJiZkZWxldGUgeG5bbl19fWZ1bmN0aW9uIFhpKGUpe3N0Lm9mZigiYXBpLiIrZSl9ZnVuY3Rpb24gT28oZSl7c3Qub24oImFwaS4iK2UsdD0+e2ZvcihsZXQgbiBpbiB4bil7bGV0IHI9eG5bbl07ci5uYW1lPT09ZSYmci5jYWxsYmFjayh0KX19KX1mdW5jdGlvbiBUbyhlLHQpe3JldHVybiB3cihEaSsrLGUsdCwhMCl9bGV0IGhyPSJzdWNjZXNzIixDbj0iZmFpbCIsT249ImNvbXBsZXRlIjtmdW5jdGlvbiBjaShlKXtsZXQgdD17fTtmb3IobGV0IG4gaW4gZSl7bGV0IHI9ZVtuXTtZLmlzRnVuY3Rpb24ocikmJih0W25dPUxpKHIpLGRlbGV0ZSBlW25dKX1yZXR1cm4gdH1mdW5jdGlvbiBRaShlLHQpe3JldHVybiFlfHxlLmluZGV4T2YoIjpmYWlsIik9PT0tMT90KyI6b2siOnQrZS5zdWJzdHJpbmcoZS5pbmRleE9mKCI6ZmFpbCIpKX1mdW5jdGlvbiBlbyhlLHQ9e30se2JlZm9yZUFsbDpuLGJlZm9yZVN1Y2Nlc3M6cn09e30pe1kuaXNQbGFpbk9iamVjdCh0KXx8KHQ9e30pO2xldHtzdWNjZXNzOmEsZmFpbDp1LGNvbXBsZXRlOmh9PWNpKHQpLGI9WS5pc0Z1bmN0aW9uKGEpLFU9WS5pc0Z1bmN0aW9uKHUpLE89WS5pc0Z1bmN0aW9uKGgpLEQ9RGkrKztyZXR1cm4gd3IoRCxlLGdlPT57Z2U9Z2V8fHt9LGdlLmVyck1zZz1RaShnZS5lcnJNc2csZSksWS5pc0Z1bmN0aW9uKG4pJiZuKGdlKSxnZS5lcnJNc2c9PT1lKyI6b2siPyhZLmlzRnVuY3Rpb24ocikmJnIoZ2UsdCksYiYmYShnZSkpOlUmJnUoZ2UpLE8mJmgoZ2UpfSksRH1sZXQgZ289InN1Y2Nlc3MiLFNpPSJmYWlsIixjcj0iY29tcGxldGUiLGpyPXt9LFNyPXt9O2Z1bmN0aW9uIGdyKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZSh0KXx8dH19ZnVuY3Rpb24gUG8oZSx0KXtsZXQgbj0hMTtmb3IobGV0IHI9MDtyPGUubGVuZ3RoO3IrKyl7bGV0IGE9ZVtyXTtpZihuKW49UHJvbWlzZS5yZXNvbHZlKGdyKGEpKTtlbHNle2xldCB1PWEodCk7aWYoWS5pc1Byb21pc2UodSkmJihuPVByb21pc2UucmVzb2x2ZSh1KSksdT09PSExKXJldHVybnt0aGVuKCl7fSxjYXRjaCgpe319fX1yZXR1cm4gbnx8e3RoZW4ocil7cmV0dXJuIHIodCl9LGNhdGNoKCl7fX19ZnVuY3Rpb24gSW8oZSx0PXt9KXtyZXR1cm5bZ28sU2ksY3JdLmZvckVhY2gobj0+e2xldCByPWVbbl07aWYoIVkuaXNBcnJheShyKSlyZXR1cm47bGV0IGE9dFtuXTt0W25dPWZ1bmN0aW9uKGgpe1BvKHIsaCkudGhlbihiPT5ZLmlzRnVuY3Rpb24oYSkmJmEoYil8fGIpfX0pLHR9ZnVuY3Rpb24gcG8oZSx0KXtsZXQgbj1bXTtZLmlzQXJyYXkoanIucmV0dXJuVmFsdWUpJiZuLnB1c2goLi4uanIucmV0dXJuVmFsdWUpO2xldCByPVNyW2VdO3JldHVybiByJiZZLmlzQXJyYXkoci5yZXR1cm5WYWx1ZSkmJm4ucHVzaCguLi5yLnJldHVyblZhbHVlKSxuLmZvckVhY2goYT0+e3Q9YSh0KXx8dH0pLHR9ZnVuY3Rpb24gUnIoZSl7bGV0IHQ9T2JqZWN0LmNyZWF0ZShudWxsKTtPYmplY3Qua2V5cyhqcikuZm9yRWFjaChyPT57ciE9PSJyZXR1cm5WYWx1ZSImJih0W3JdPWpyW3JdLnNsaWNlKCkpfSk7bGV0IG49U3JbZV07cmV0dXJuIG4mJk9iamVjdC5rZXlzKG4pLmZvckVhY2gocj0+e3IhPT0icmV0dXJuVmFsdWUiJiYodFtyXT0odFtyXXx8W10pLmNvbmNhdChuW3JdKSl9KSx0fWZ1bmN0aW9uIHVyKGUsdCxuLHIpe2xldCBhPVJyKGUpO3JldHVybiBhJiZPYmplY3Qua2V5cyhhKS5sZW5ndGg/WS5pc0FycmF5KGEuaW52b2tlKT9QbyhhLmludm9rZSxuKS50aGVuKGg9PnQoSW8oYSxoKSwuLi5yKSk6dChJbyhhLG4pLC4uLnIpOnQobiwuLi5yKX1mdW5jdGlvbiBBcihlKXtyZXR1cm4hIShZLmlzUGxhaW5PYmplY3QoZSkmJltocixDbixPbl0uZmluZCh0PT5ZLmlzRnVuY3Rpb24oZVt0XSkpKX1mdW5jdGlvbiBYcihlKXtyZXR1cm4gZX1mdW5jdGlvbiB6bihlLHQpe3JldHVybihuPXt9LC4uLnIpPT5BcihuKT9wbyhlLHVyKGUsdCxuLHIpKTpwbyhlLG5ldyBQcm9taXNlKChhLHUpPT57dXIoZSx0LFkuZXh0ZW5kKG4se3N1Y2Nlc3M6YSxmYWlsOnV9KSxyKX0pKX1mdW5jdGlvbiB6cihlLHQpe2xldCBuPWVbMF07aWYoIXR8fCFZLmlzUGxhaW5PYmplY3QodC5mb3JtYXRBcmdzKSYmWS5pc1BsYWluT2JqZWN0KG4pKXJldHVybjtsZXQgcj10LmZvcm1hdEFyZ3MsYT1PYmplY3Qua2V5cyhyKTtmb3IobGV0IHU9MDt1PGEubGVuZ3RoO3UrKyl7bGV0IGg9YVt1XSxiPXJbaF07aWYoWS5pc0Z1bmN0aW9uKGIpKXtsZXQgVT1iKGVbMF1baF0sbik7aWYoWS5pc1N0cmluZyhVKSlyZXR1cm4gVX1lbHNlIFkuaGFzT3duKG4saCl8fChuW2hdPWIpfX1mdW5jdGlvbiB0byhlLHQsbil7cmV0dXJuIFVyKGUsWS5leHRlbmQobnx8e30se2Vyck1zZzp0KyI6b2sifSkpfWZ1bmN0aW9uIEZpKGUsdCxuLHIpe3JldHVybiBVcihlLFkuZXh0ZW5kKHtlcnJNc2c6dCsiOmZhaWwiKyhuPyIgIituOiIiKX0scikpfWZ1bmN0aW9uIHhyKGUsdCxuLHIpe2lmKHImJnIuYmVmb3JlSW52b2tlKXtsZXQgdT1yLmJlZm9yZUludm9rZSh0KTtpZihZLmlzU3RyaW5nKHUpKXJldHVybiB1fWxldCBhPXpyKHQscik7aWYoYSlyZXR1cm4gYX1mdW5jdGlvbiB2byhlKXtpZighWS5pc0Z1bmN0aW9uKGUpKXRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmdzOiB0eXBlIGNoZWNrIGZhaWxlZCBmb3IgYXJncyAiY2FsbGJhY2siLiBFeHBlY3RlZCBGdW5jdGlvbicpfWZ1bmN0aW9uIG1vKGUsdCxuKXtyZXR1cm4gcj0+e3ZvKHIpO2xldCBhPXhyKGUsW3JdLHZvaWQgMCxuKTtpZihhKXRocm93IG5ldyBFcnJvcihhKTtsZXQgdT0hSHIoZSk7VG8oZSxyKSx1JiYoT28oZSksdCgpKX19ZnVuY3Rpb24gX28oZSx0LG4pe3JldHVybiByPT57dm8ocik7bGV0IGE9eHIoZSxbcl0sdm9pZCAwLG4pO2lmKGEpdGhyb3cgbmV3IEVycm9yKGEpO2U9ZS5yZXBsYWNlKCJvZmYiLCJvbiIpLFppKGUsciksSHIoZSl8fChYaShlKSx0KCkpfX1mdW5jdGlvbiBRcihlKXtyZXR1cm4hZXx8WS5pc1N0cmluZyhlKT9lOmUuc3RhY2s/KGNvbnNvbGUuZXJyb3IoZS5tZXNzYWdlK3RlLkxJTkVGRUVEK2Uuc3RhY2spLGUubWVzc2FnZSk6ZX1mdW5jdGlvbiBlaShlLHQsbixyKXtyZXR1cm4gYT0+e2xldCB1PWVvKGUsYSxyKSxoPXhyKGUsW2FdLG4scik7cmV0dXJuIGg/RmkodSxlLGgpOnQoYSx7cmVzb2x2ZTpiPT50byh1LGUsYikscmVqZWN0OihiLFUpPT5GaSh1LGUsUXIoYiksVSl9KX19ZnVuY3Rpb24gQWkoZSx0LG4scil7cmV0dXJuKC4uLmEpPT57bGV0IHU9eHIoZSxhLG4scik7aWYodSl0aHJvdyBuZXcgRXJyb3IodSk7cmV0dXJuIHQuYXBwbHkobnVsbCxhKX19ZnVuY3Rpb24gdWkoZSx0LG4scil7cmV0dXJuIGVpKGUsdCxuLHIpfWZ1bmN0aW9uIHFuKGUsdCxuKXtyZXR1cm4gbW8oZSx0LG4pfWZ1bmN0aW9uIENyKGUsdCxuKXtyZXR1cm4gX28oZSx0LG4pfWZ1bmN0aW9uIFZpKGUsdCxuLHIpe3JldHVybiB6bihlLGVpKGUsdCx2b2lkIDAscikpfWZ1bmN0aW9uIE10KGUsdCxuLHIpe3JldHVybiBBaShlLHQsdm9pZCAwLHIpfWZ1bmN0aW9uIHllKGUsdCxuLHIpe3JldHVybiB6bihlLHVpKGUsdCx2b2lkIDAscikpfWxldCBDaT0iYmFzZTY0VG9BcnJheUJ1ZmZlciIsJGk9W3tuYW1lOiJiYXNlNjQiLHR5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfV0sV3I9ImFycmF5QnVmZmVyVG9CYXNlNjQiLEJyPVt7bmFtZToiYXJyYXlCdWZmZXIiLHR5cGU6W0FycmF5QnVmZmVyLFVpbnQ4QXJyYXldLHJlcXVpcmVkOiEwfV0sSG49TXQoQ2ksZT0+YW4oZSksJGkpLEJuPU10KFdyLGU9PiRuKGUpLEJyKTtmdW5jdGlvbiBObygpe2lmKHR5cGVvZiBfX1NZU1RFTV9JTkZPX18hPSJ1bmRlZmluZWQiKXJldHVybiB3aW5kb3cuX19TWVNURU1fSU5GT19fO2xldHtyZXNvbHV0aW9uV2lkdGg6ZX09bC5zY3JlZW4uZ2V0Q3VycmVudFNpemUoKXx8e3Jlc29sdXRpb25XaWR0aDowfTtyZXR1cm57cGxhdGZvcm06KGwub3MubmFtZXx8IiIpLnRvTG93ZXJDYXNlKCkscGl4ZWxSYXRpbzpsLnNjcmVlbi5zY2FsZSx3aW5kb3dXaWR0aDpNYXRoLnJvdW5kKGUpfX1mdW5jdGlvbiBPaShlLHQsbil7ZS4kcGFnZS5tZXRhLmlzTlZ1ZT9maShlLHQsbik6VXQoZSx0LG4pfWZ1bmN0aW9uIFV0KGUsdCxuKXtzdC5pbnZva2VWaWV3TWV0aG9kKCJyZXF1ZXN0Q29tcG9uZW50SW5mbyIse3JlcXM6dC5tYXAocj0+KHIuY29tcG9uZW50JiYoci5jb21wb25lbnQ9ci5jb21wb25lbnQuJGVsLm5vZGVJZCkscikpfSxlLiRwYWdlLmlkLG4pfWZ1bmN0aW9uIGZpKGUsdCxuKXtsZXQgcj1kaSh0KSxhPW5ldyBBcnJheShyLmxlbmd0aCk7S3QocixlLiRlbCxhKSxXbihlLiRyZXF1aXJlTmF0aXZlUGx1Z2luKCJkb20iKSxhLDAsW10sdT0+e24odSl9KX1mdW5jdGlvbiBkaShlKXtsZXQgdD1bXTtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl7bGV0IHI9ZVtuXS5zZWxlY3RvcjtyLmluZGV4T2YoIiMiKT09PTAmJnQucHVzaChyLnN1YnN0cmluZygxKSl9cmV0dXJuIHR9ZnVuY3Rpb24gS3QoZSx0LG4pe2xldCByPXQuY2hpbGRyZW47aWYoIVkuaXNBcnJheShyKSlyZXR1cm4hMTtmb3IobGV0IGE9MDthPHIubGVuZ3RoO2ErKyl7bGV0IHU9clthXTtpZih1LmF0dHIpe2xldCBoPWUuaW5kZXhPZih1LmF0dHIuaWQpO2lmKGg+PTAmJihuW2hdPXtpZDplW2hdLHJlZjp1LnJlZixkYXRhc2V0OnRlLnBhcnNlTlZ1ZURhdGFzZXQodS5hdHRyKX0sZS5sZW5ndGg9PT0xKSlicmVha311LmNoaWxkcmVuJiZLdChlLHUsbil9fWZ1bmN0aW9uIFduKGUsdCxuLHIsYSl7bGV0IHU9dFtuXTtlLmdldENvbXBvbmVudFJlY3QodS5yZWYsaD0+e2guc2l6ZS5pZD11LmlkLGguc2l6ZS5kYXRhc2V0PXUuZGF0YXNldCxyLnB1c2goaC5zaXplKSxuKz0xLG48dC5sZW5ndGg/V24oZSx0LG4scixhKTphKHIpfSl9ZnVuY3Rpb24gT3IoZSx0KXtzdC5pbnZva2VWaWV3TWV0aG9kKCJzZXRQYWdlTWV0YSIsdCxlLiRwYWdlLmlkKX1sZXQgSW49ZT0+ZSE9PW51bGwmJnR5cGVvZiBlPT0ib2JqZWN0IixUaT1bInsiLCJ9Il07Y2xhc3Mga297Y29uc3RydWN0b3IoKXt0aGlzLl9jYWNoZXM9T2JqZWN0LmNyZWF0ZShudWxsKX1pbnRlcnBvbGF0ZSh0LG4scj1UaSl7aWYoIW4pcmV0dXJuW3RdO2xldCBhPXRoaXMuX2NhY2hlc1t0XTtyZXR1cm4gYXx8KGE9UW8odCxyKSx0aGlzLl9jYWNoZXNbdF09YSksVWkoYSxuKX19bGV0IGhpPS9eKD86XGQpKy8sbm89L14oPzpcdykrLztmdW5jdGlvbiBRbyhlLFt0LG5dKXtsZXQgcj1bXSxhPTAsdT0iIjtmb3IoO2E8ZS5sZW5ndGg7KXtsZXQgaD1lW2ErK107aWYoaD09PXQpe3UmJnIucHVzaCh7dHlwZToidGV4dCIsdmFsdWU6dX0pLHU9IiI7bGV0IGI9IiI7Zm9yKGg9ZVthKytdO2ghPT12b2lkIDAmJmghPT1uOyliKz1oLGg9ZVthKytdO2xldCBVPWg9PT1uLE89aGkudGVzdChiKT8ibGlzdCI6VSYmbm8udGVzdChiKT8ibmFtZWQiOiJ1bmtub3duIjtyLnB1c2goe3ZhbHVlOmIsdHlwZTpPfSl9ZWxzZSB1Kz1ofXJldHVybiB1JiZyLnB1c2goe3R5cGU6InRleHQiLHZhbHVlOnV9KSxyfWZ1bmN0aW9uIFVpKGUsdCl7bGV0IG49W10scj0wLGE9QXJyYXkuaXNBcnJheSh0KT8ibGlzdCI6SW4odCk/Im5hbWVkIjoidW5rbm93biI7aWYoYT09PSJ1bmtub3duIilyZXR1cm4gbjtmb3IoO3I8ZS5sZW5ndGg7KXtsZXQgdT1lW3JdO3N3aXRjaCh1LnR5cGUpe2Nhc2UidGV4dCI6bi5wdXNoKHUudmFsdWUpO2JyZWFrO2Nhc2UibGlzdCI6bi5wdXNoKHRbcGFyc2VJbnQodS52YWx1ZSwxMCldKTticmVhaztjYXNlIm5hbWVkIjphPT09Im5hbWVkIiYmbi5wdXNoKHRbdS52YWx1ZV0pO2JyZWFrO2Nhc2UidW5rbm93biI6YnJlYWt9cisrfXJldHVybiBufWxldCBLbj0iemgtSGFucyIscHI9InpoLUhhbnQiLEpuPSJlbiIsTXI9ImZyIixUcj0iZXMiLEhpPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksdGk9KGUsdCk9PkhpLmNhbGwoZSx0KSx2cj1uZXcga287ZnVuY3Rpb24gR3IoZSx0KXtyZXR1cm4hIXQuZmluZChuPT5lLmluZGV4T2YobikhPT0tMSl9ZnVuY3Rpb24gUGkoZSx0KXtyZXR1cm4gdC5maW5kKG49PmUuaW5kZXhPZihuKT09PTApfWZ1bmN0aW9uIGdpKGUsdCl7aWYoIWUpcmV0dXJuO2lmKGU9ZS50cmltKCkucmVwbGFjZSgvXy9nLCItIiksdCYmdFtlXSlyZXR1cm4gZTtpZihlPWUudG9Mb3dlckNhc2UoKSxlPT09ImNoaW5lc2UiKXJldHVybiBLbjtpZihlLmluZGV4T2YoInpoIik9PT0wKXJldHVybiBlLmluZGV4T2YoIi1oYW5zIik+LTE/S246ZS5pbmRleE9mKCItaGFudCIpPi0xfHxHcihlLFsiLXR3IiwiLWhrIiwiLW1vIiwiLWNodCJdKT9wcjpLbjtsZXQgbj1QaShlLFtKbixNcixUcl0pO2lmKG4pcmV0dXJuIG59Y2xhc3MgcGl7Y29uc3RydWN0b3Ioe2xvY2FsZTp0LGZhbGxiYWNrTG9jYWxlOm4sbWVzc2FnZXM6cix3YXRjaGVyOmEsZm9ybWF0ZXI6dX0pe3RoaXMubG9jYWxlPUpuLHRoaXMuZmFsbGJhY2tMb2NhbGU9Sm4sdGhpcy5tZXNzYWdlPXt9LHRoaXMubWVzc2FnZXM9e30sdGhpcy53YXRjaGVycz1bXSxuJiYodGhpcy5mYWxsYmFja0xvY2FsZT1uKSx0aGlzLmZvcm1hdGVyPXV8fHZyLHRoaXMubWVzc2FnZXM9cnx8e30sdGhpcy5zZXRMb2NhbGUodHx8Sm4pLGEmJnRoaXMud2F0Y2hMb2NhbGUoYSl9c2V0TG9jYWxlKHQpe2xldCBuPXRoaXMubG9jYWxlO3RoaXMubG9jYWxlPWdpKHQsdGhpcy5tZXNzYWdlcyl8fHRoaXMuZmFsbGJhY2tMb2NhbGUsdGhpcy5tZXNzYWdlc1t0aGlzLmxvY2FsZV18fCh0aGlzLm1lc3NhZ2VzW3RoaXMubG9jYWxlXT17fSksdGhpcy5tZXNzYWdlPXRoaXMubWVzc2FnZXNbdGhpcy5sb2NhbGVdLG4hPT10aGlzLmxvY2FsZSYmdGhpcy53YXRjaGVycy5mb3JFYWNoKHI9PntyKHRoaXMubG9jYWxlLG4pfSl9Z2V0TG9jYWxlKCl7cmV0dXJuIHRoaXMubG9jYWxlfXdhdGNoTG9jYWxlKHQpe2xldCBuPXRoaXMud2F0Y2hlcnMucHVzaCh0KS0xO3JldHVybigpPT57dGhpcy53YXRjaGVycy5zcGxpY2UobiwxKX19YWRkKHQsbixyPSEwKXtsZXQgYT10aGlzLm1lc3NhZ2VzW3RdO2E/cj9PYmplY3QuYXNzaWduKGEsbik6T2JqZWN0LmtleXMobikuZm9yRWFjaCh1PT57dGkoYSx1KXx8KGFbdV09blt1XSl9KTp0aGlzLm1lc3NhZ2VzW3RdPW59Zih0LG4scil7cmV0dXJuIHRoaXMuZm9ybWF0ZXIuaW50ZXJwb2xhdGUodCxuLHIpLmpvaW4oIiIpfXQodCxuLHIpe2xldCBhPXRoaXMubWVzc2FnZTtyZXR1cm4gdHlwZW9mIG49PSJzdHJpbmciPyhuPWdpKG4sdGhpcy5tZXNzYWdlcyksbiYmKGE9dGhpcy5tZXNzYWdlc1tuXSkpOnI9bix0aShhLHQpP3RoaXMuZm9ybWF0ZXIuaW50ZXJwb2xhdGUoYVt0XSxyKS5qb2luKCIiKTooY29uc29sZS53YXJuKGBDYW5ub3QgdHJhbnNsYXRlIHRoZSB2YWx1ZSBvZiBrZXlwYXRoICR7dH0uIFVzZSB0aGUgdmFsdWUgb2Yga2V5cGF0aCBhcyBkZWZhdWx0LmApLHQpfX1mdW5jdGlvbiBZcihlLHQpe2UuJHdhdGNoTG9jYWxlP2UuJHdhdGNoTG9jYWxlKG49Pnt0LnNldExvY2FsZShuKX0pOmUuJHdhdGNoKCgpPT5lLiRsb2NhbGUsbj0+e3Quc2V0TG9jYWxlKG4pfSl9ZnVuY3Rpb24gdmkoKXtyZXR1cm4gdHlwZW9mIGd0IT0idW5kZWZpbmVkIiYmZ3QuZ2V0TG9jYWxlP2d0LmdldExvY2FsZSgpOnR5cGVvZiBnbG9iYWwhPSJ1bmRlZmluZWQiJiZnbG9iYWwuZ2V0TG9jYWxlP2dsb2JhbC5nZXRMb2NhbGUoKTpKbn1mdW5jdGlvbiBybyhlLHQ9e30sbixyKXt0eXBlb2YgZSE9InN0cmluZyImJihbZSx0XT1bdCxlXSksdHlwZW9mIGUhPSJzdHJpbmciJiYoZT12aSgpKSx0eXBlb2YgbiE9InN0cmluZyImJihuPXR5cGVvZiBUIT0idW5kZWZpbmVkIiYmVC5mYWxsYmFja0xvY2FsZXx8Sm4pO2xldCBhPW5ldyBwaSh7bG9jYWxlOmUsZmFsbGJhY2tMb2NhbGU6bixtZXNzYWdlczp0LHdhdGNoZXI6cn0pLHU9KGgsYik9PntpZih0eXBlb2Ygdm4hPSJmdW5jdGlvbiIpdT1mdW5jdGlvbihVLE8pe3JldHVybiBhLnQoVSxPKX07ZWxzZXtsZXQgVT0hMTt1PWZ1bmN0aW9uKE8sRCl7bGV0IGdlPXZuKCkuJHZtO3JldHVybiBnZSYmKGdlLiRsb2NhbGUsVXx8KFU9ITAsWXIoZ2UsYSkpKSxhLnQoTyxEKX19cmV0dXJuIHUoaCxiKX07cmV0dXJue2kxOG46YSxmKGgsYixVKXtyZXR1cm4gYS5mKGgsYixVKX0sdChoLGIpe3JldHVybiB1KGgsYil9LGFkZChoLGIsVT0hMCl7cmV0dXJuIGEuYWRkKGgsYixVKX0sd2F0Y2goaCl7cmV0dXJuIGEud2F0Y2hMb2NhbGUoaCl9LGdldExvY2FsZSgpe3JldHVybiBhLmdldExvY2FsZSgpfSxzZXRMb2NhbGUoaCl7cmV0dXJuIGEuc2V0TG9jYWxlKGgpfX19ZnVuY3Rpb24gamkoZSx0KXtyZXR1cm4gZS5pbmRleE9mKHRbMF0pPi0xfWxldCBpbz10ZS5vbmNlKCgpPT50eXBlb2YgVCE9InVuZGVmaW5lZCImJlQubG9jYWxlcyYmISFPYmplY3Qua2V5cyhULmxvY2FsZXMpLmxlbmd0aCkseDtmdW5jdGlvbiBuZSgpe2xldCBlPWd0LmdldExvY2FsZSgpLHQ9VC5sb2NhbGVzO3JldHVybiB0W2VdfHx0W1QuZmFsbGJhY2tMb2NhbGVdfHx0LmVufHx7fX1mdW5jdGlvbiBkZShlKXtyZXR1cm4gamkoZSx0ZS5JMThOX0pTT05fREVMSU1JVEVSUyk/WCgpLmYoZSxuZSgpLHRlLkkxOE5fSlNPTl9ERUxJTUlURVJTKTplfWZ1bmN0aW9uIEgoZSx0KXtpZih0Lmxlbmd0aD09PTEpe2lmKGUpe2xldCByPWVbdFswXV07aWYoWS5pc1N0cmluZyhyKSYmamkocix0ZS5JMThOX0pTT05fREVMSU1JVEVSUykpcmV0dXJuIGV9cmV0dXJufWxldCBuPXQuc2hpZnQoKTtyZXR1cm4gSChlJiZlW25dLHQpfWZ1bmN0aW9uIE0oZSx0KXtyZXR1cm4gdC5tYXAobj0+SihlLG4pKX1mdW5jdGlvbiBKKGUsdCl7bGV0IG49SChlLHQpO2lmKCFuKXJldHVybiExO2xldCByPXRbdC5sZW5ndGgtMV0sYT1uW3JdO3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkobixyLHtnZXQoKXtyZXR1cm4gZGUoYSl9LHNldCh1KXthPXV9fSksITB9ZnVuY3Rpb24gWCgpe2lmKCF4KXtsZXQgZTtpZih0eXBlb2Ygdm49PSJmdW5jdGlvbiI/ZT1nLnJlcXVpcmVNb2R1bGUoInBsdXMiKS5nZXRMYW5ndWFnZSgpOmU9bC53ZWJ2aWV3LmN1cnJlbnRXZWJ2aWV3KCkuZ2V0U3R5bGUoKS5sb2NhbGUseD1ybyhlKSxpbygpKXtsZXQgdD1PYmplY3Qua2V5cyhULmxvY2FsZXN8fHt9KTt0Lmxlbmd0aCYmdC5mb3JFYWNoKG49PnguYWRkKG4sVC5sb2NhbGVzW25dKSkseC5zZXRMb2NhbGUoZSl9fXJldHVybiB4fWZ1bmN0aW9uIHVlKGUsdCxuKXtyZXR1cm4gdC5yZWR1Y2UoKHIsYSx1KT0+KHJbZSthXT1uW3VdLHIpLHt9KX1sZXQgdG49dGUub25jZSgoKT0+e2xldCBlPSJ1bmkuYXBwLiIsdD1bInF1aXQiXTtYKCkuYWRkKEpuLHVlKGUsdCxbIlByZXNzIGJhY2sgYnV0dG9uIGFnYWluIHRvIGV4aXQiXSksITEpLFgoKS5hZGQoVHIsdWUoZSx0LFsiUHVsc2Ugb3RyYSB2ZXogcGFyYSBzYWxpciJdKSwhMSksWCgpLmFkZChNcix1ZShlLHQsWyJBcHB1eWV6IFx4RTAgbm91dmVhdSBwb3VyIHF1aXR0ZXIgbCdhcHBsaWNhdGlvbiJdKSwhMSksWCgpLmFkZChLbix1ZShlLHQsWyJcdTUxOERcdTYzMDlcdTRFMDBcdTZCMjFcdTkwMDBcdTUxRkFcdTVFOTRcdTc1MjgiXSksITEpLFgoKS5hZGQocHIsdWUoZSx0LFsiXHU1MThEXHU2MzA5XHU0RTAwXHU2QjIxXHU5MDAwXHU1MUZBXHU2MUM5XHU3NTI4Il0pLCExKX0pLE1uPXRlLm9uY2UoKCk9PntsZXQgZT0idW5pLnNob3dBY3Rpb25TaGVldC4iLHQ9WyJjYW5jZWwiXTtYKCkuYWRkKEpuLHVlKGUsdCxbIkNhbmNlbCJdKSwhMSksWCgpLmFkZChUcix1ZShlLHQsWyJDYW5jZWxhciJdKSwhMSksWCgpLmFkZChNcix1ZShlLHQsWyJBbm51bGVyIl0pLCExKSxYKCkuYWRkKEtuLHVlKGUsdCxbIlx1NTNENlx1NkQ4OCJdKSwhMSksWCgpLmFkZChwcix1ZShlLHQsWyJcdTUzRDZcdTZEODgiXSksITEpfSksY249dGUub25jZSgoKT0+e2xldCBlPSJ1bmkuc2hvd01vZGFsLiIsdD1bImNhbmNlbCIsImNvbmZpcm0iXTtYKCkuYWRkKEpuLHVlKGUsdCxbIkNhbmNlbCIsIk9LIl0pLCExKSxYKCkuYWRkKFRyLHVlKGUsdCxbIkNhbmNlbGFyIiwiT0siXSksITEpLFgoKS5hZGQoTXIsdWUoZSx0LFsiQW5udWxlciIsIk9LIl0pLCExKSxYKCkuYWRkKEtuLHVlKGUsdCxbIlx1NTNENlx1NkQ4OCIsIlx1Nzg2RVx1NUI5QSJdKSwhMSksWCgpLmFkZChwcix1ZShlLHQsWyJcdTUzRDZcdTZEODgiLCJcdTc4QkFcdTVCOUEiXSksITEpfSksbmk9dGUub25jZSgoKT0+e2xldCBlPSJ1bmkuY2hvb3NlSW1hZ2UuIix0PVsiY2FuY2VsIiwic291cmNlVHlwZS5hbGJ1bSIsInNvdXJjZVR5cGUuY2FtZXJhIl07WCgpLmFkZChKbix1ZShlLHQsWyJDYW5jZWwiLCJBbGJ1bSIsIkNhbWVyYSJdKSwhMSksWCgpLmFkZChUcix1ZShlLHQsWyJDYW5jZWxhciIsIlx4QzFsYnVtIiwiQ1x4RTFtYXJhIl0pLCExKSxYKCkuYWRkKE1yLHVlKGUsdCxbIkFubnVsZXIiLCJBbGJ1bSIsIkNhbVx4RTlyYSJdKSwhMSksWCgpLmFkZChLbix1ZShlLHQsWyJcdTUzRDZcdTZEODgiLCJcdTRFQ0VcdTc2RjhcdTUxOENcdTkwMDlcdTYyRTkiLCJcdTYyQ0RcdTY0NDQiXSksITEpLFgoKS5hZGQocHIsdWUoZSx0LFsiXHU1M0Q2XHU2RDg4IiwiXHU1RjlFXHU3NkY4XHU1MThBXHU5MDc4XHU2NEM3IiwiXHU2MkNEXHU2NTFEIl0pLCExKX0pLG1yPXRlLm9uY2UoKCk9PntsZXQgZT0idW5pLmNob29zZVZpZGVvLiIsdD1bImNhbmNlbCIsInNvdXJjZVR5cGUuYWxidW0iLCJzb3VyY2VUeXBlLmNhbWVyYSJdO1goKS5hZGQoSm4sdWUoZSx0LFsiQ2FuY2VsIiwiQWxidW0iLCJDYW1lcmEiXSksITEpLFgoKS5hZGQoVHIsdWUoZSx0LFsiQ2FuY2VsYXIiLCJceEMxbGJ1bSIsIkNceEUxbWFyYSJdKSwhMSksWCgpLmFkZChNcix1ZShlLHQsWyJBbm51bGVyIiwiQWxidW0iLCJDYW1ceEU5cmEiXSksITEpLFgoKS5hZGQoS24sdWUoZSx0LFsiXHU1M0Q2XHU2RDg4IiwiXHU0RUNFXHU3NkY4XHU1MThDXHU5MDA5XHU2MkU5IiwiXHU2MkNEXHU2NDQ0Il0pLCExKSxYKCkuYWRkKHByLHVlKGUsdCxbIlx1NTNENlx1NkQ4OCIsIlx1NUY5RVx1NzZGOFx1NTE4QVx1OTA3OFx1NjRDNyIsIlx1NjJDRFx1NjUxRCJdKSwhMSl9KSxlYT10ZS5vbmNlKCgpPT57bGV0IGU9InVuaS5wcmV2aWV3SW1hZ2UuIix0PVsiY2FuY2VsIiwiYnV0dG9uLnNhdmUiLCJzYXZlLnN1Y2Nlc3MiLCJzYXZlLmZhaWwiXTtYKCkuYWRkKEpuLHVlKGUsdCxbIkNhbmNlbCIsIlNhdmUgSW1hZ2UiLCJTYXZlZCBzdWNjZXNzZnVsbHkiLCJTYXZlIGZhaWxlZCJdKSwhMSksWCgpLmFkZChUcix1ZShlLHQsWyJDYW5jZWxhciIsIkd1YXJkYXIgaW1hZ2VuIiwiR3VhcmRhZG8gZXhpdG9zYW1lbnRlIiwiRXJyb3IgYWwgZ3VhcmRhciJdKSwhMSksWCgpLmFkZChNcix1ZShlLHQsWyJBbm51bGVyIiwiR3VhcmRhciBpbWFnZW4iLCJFbnJlZ2lzdHJceEU5IGF2ZWMgc3VjY1x4RThzIiwiXHhDOWNoZWMgZGUgbGEgc2F1dmVnYXJkZSJdKSwhMSksWCgpLmFkZChLbix1ZShlLHQsWyJcdTUzRDZcdTZEODgiLCJcdTRGRERcdTVCNThcdTU2RkVcdTUwQ0YiLCJcdTRGRERcdTVCNThcdTU2RkVcdTUwQ0ZcdTUyMzBcdTc2RjhcdTUxOENcdTYyMTBcdTUyOUYiLCJcdTRGRERcdTVCNThcdTU2RkVcdTUwQ0ZcdTUyMzBcdTc2RjhcdTUxOENcdTU5MzFcdThEMjUiXSksITEpLFgoKS5hZGQocHIsdWUoZSx0LFsiXHU1M0Q2XHU2RDg4IiwiXHU0RkREXHU1QjU4XHU1NzE2XHU1MENGIiwiXHU0RkREXHU1QjU4XHU1NzE2XHU1MENGXHU1MjMwXHU3NkY4XHU1MThBXHU2MjEwXHU1MjlGIiwiXHU0RkREXHU1QjU4XHU1NzE2XHU1MENGXHU1MjMwXHU3NkY4XHU1MThBXHU1OTMxXHU2NTU3Il0pLCExKX0pLHpvPXRlLm9uY2UoKCk9PntsZXQgZT0idW5pLnNldENsaXBib2FyZERhdGEuIix0PVsic3VjY2VzcyIsImZhaWwiXTtYKCkuYWRkKEpuLHVlKGUsdCxbIkNvbnRlbnQgY29waWVkIiwiQ29weSBmYWlsZWQsIHBsZWFzZSBjb3B5IG1hbnVhbGx5Il0pLCExKSxYKCkuYWRkKFRyLHVlKGUsdCxbIkNvbnRlbmlkbyBjb3BpYWRvIiwiRXJyb3IgYWwgY29waWFyLCBjb3BpZSBtYW51YWxtZW50ZSJdKSwhMSksWCgpLmFkZChNcix1ZShlLHQsWyJDb250ZW51IGNvcGlceEU5IiwiXHhDOWNoZWMgZGUgbGEgY29waWUsIGNvcGlleiBtYW51ZWxsZW1lbnQiXSksITEpLFgoKS5hZGQoS24sdWUoZSx0LFsiXHU1MTg1XHU1QkI5XHU1REYyXHU1OTBEXHU1MjM2IiwiXHU1OTBEXHU1MjM2XHU1OTMxXHU4RDI1XHVGRjBDXHU4QkY3XHU2MjRCXHU1MkE4XHU1OTBEXHU1MjM2Il0pLCExKSxYKCkuYWRkKHByLHVlKGUsdCxbIlx1NTE2N1x1NUJCOVx1NURGMlx1NUZBOVx1NTIzNiIsIlx1NUZBOVx1NTIzNlx1NTkzMVx1NjU1N1x1RkYwQ1x1OEFDQlx1NjI0Qlx1NTJENVx1NUZBOVx1ODhGRCJdKSwhMSl9KSx0YT10ZS5vbmNlKCgpPT57bGV0IGU9InVuaS5zY2FuQ29kZS4iLHQ9WyJ0aXRsZSIsImFsYnVtIiwiZmFpbCIsImZsYXNoLm9uIiwiZmxhc2gub2ZmIl07WCgpLmFkZChKbix1ZShlLHQsWyJTY2FuIGNvZGUiLCJBbGJ1bSIsIlJlY29nbml0aW9uIGZhaWx1cmUiLCJUYXAgdG8gdHVybiBsaWdodCBvbiIsIlRhcCB0byB0dXJuIGxpZ2h0IG9mZiJdKSwhMSksWCgpLmFkZChUcix1ZShlLHQsWyJDXHhGM2RpZ28gZGUgZXNjYW5lbyIsIlx4QzFsYnVtIiwiXHhDOWNoZWMgZGUgbGEgcmVjb25uYWlzc2FuY2UiLCJUb3F1ZSBwYXJhIGVuY2VuZGVyIGxhIGx1eiIsIlRvcXVlIHBhcmEgYXBhZ2FyIGxhIGx1eiJdKSwhMSksWCgpLmFkZChNcix1ZShlLHQsWyJDb2RlIGRcdTIwMTlhbmFseXNlIiwiQWxidW0iLCJGYWxsbyBkZSByZWNvbm9jaW1pZW50byIsIkFwcHV5ZXogcG91ciBhY3RpdmVyIGwnXHhFOWNsYWlyYWdlIiwiQXBwdXlleiBwb3VyIGRceEU5c2FjdGl2ZXIgbCdceEU5Y2xhaXJhZ2UiXSksITEpLFgoKS5hZGQoS24sdWUoZSx0LFsiXHU2MjZCXHU3ODAxIiwiXHU3NkY4XHU1MThDIiwiXHU4QkM2XHU1MjJCXHU1OTMxXHU4RDI1IiwiXHU4RjdCXHU4OUU2XHU3MTY3XHU0RUFFIiwiXHU4RjdCXHU4OUU2XHU1MTczXHU5NUVEIl0pLCExKSxYKCkuYWRkKHByLHVlKGUsdCxbIlx1NjM4M1x1NzhCQyIsIlx1NzZGOFx1NTE4QSIsIlx1OEI1OFx1NTIyNVx1NTkzMVx1NjU1NyIsIlx1OEYxNVx1ODlGOFx1NzE2N1x1NEVBRSIsIlx1OEYxNVx1ODlGOFx1OTVEQ1x1OTU4OSJdKSwhMSl9KSxSbz10ZS5vbmNlKCgpPT57bGV0IGU9InVuaS5zdGFydFNvdGVyQXV0aGVudGljYXRpb24uIix0PVsiYXV0aENvbnRlbnQiXTtYKCkuYWRkKEpuLHVlKGUsdCxbIkZpbmdlcnByaW50IHJlY29nbml0aW9uIl0pLCExKSxYKCkuYWRkKFRyLHVlKGUsdCxbIlJlY29ub2NpbWllbnRvIGRlIGh1ZWxsYXMgZGFjdGlsYXJlcyJdKSwhMSksWCgpLmFkZChNcix1ZShlLHQsWyJSZWNvbm5haXNzYW5jZSBkZSBsJ2VtcHJlaW50ZSBkaWdpdGFsZSJdKSwhMSksWCgpLmFkZChLbix1ZShlLHQsWyJcdTYzMDdcdTdFQjlcdThCQzZcdTUyMkJcdTRFMkQuLi4iXSksITEpLFgoKS5hZGQocHIsdWUoZSx0LFsiXHU2MzA3XHU3RDBCXHU4QjU4XHU1MjI1XHU0RTJELi4uIl0pLCExKX0pO2Z1bmN0aW9uIGJvKGUpe2lmKGlvKCkpcmV0dXJuIE0oZSxbWyJ0aXRsZVRleHQiXSxbInNlYXJjaElucHV0IiwicGxhY2Vob2xkZXIiXV0pfWZ1bmN0aW9uIG9vKGUpe2lmKGlvKCkpe2xldCB0PSJjYXB0aW9uIjtyZXR1cm4gTShlLFtbImNvbnRlbnRkb3duIix0XSxbImNvbnRlbnRvdmVyIix0XSxbImNvbnRlbnRyZWZyZXNoIix0XV0pfX1mdW5jdGlvbiBSYShlKXtsZXQgdD1uZXcgdGUuRW1pdHRlcjtyZXR1cm57b24obixyKXtyZXR1cm4gdC5vbihuLHIpfSxvbmNlKG4scil7cmV0dXJuIHQub25jZShuLHIpfSxvZmYobixyKXtyZXR1cm4gdC5vZmYobixyKX0sZW1pdChuLC4uLnIpe3JldHVybiB0LmVtaXQobiwuLi5yKX0sc3Vic2NyaWJlKG4scixhPSExKXt0W2E/Im9uY2UiOiJvbiJdKGAke2V9LiR7bn1gLHIpfSx1bnN1YnNjcmliZShuLHIpe3Qub2ZmKGAke2V9LiR7bn1gLHIpfSxzdWJzY3JpYmVIYW5kbGVyKG4scixhKXt0LmVtaXQoYCR7ZX0uJHtufWAscixhKX19fWxldCBuYT0iaW52b2tlVmlld0FwaSIsX2E9Imludm9rZVNlcnZpY2VBcGkiO2Z1bmN0aW9uIHRzKGUpe3JldHVybiBlPWUrIiIsZS5pbmRleE9mKCJycHgiKSE9PS0xfHxlLmluZGV4T2YoInVweCIpIT09LTF9ZnVuY3Rpb24gcmEoZSx0PSExKXtpZih0KXJldHVybiB4YShlKTtpZihZLmlzU3RyaW5nKGUpKXtsZXQgbj1wYXJzZUludChlKXx8MDtyZXR1cm4gdHMoZSk/Z3QudXB4MnB4KG4pOm59cmV0dXJuIGV9ZnVuY3Rpb24geGEoZSl7cmV0dXJuIHRzKGUpP2UucmVwbGFjZSgvKFxkKyhcLlxkKyk/KVtydV1weC9nLCh0LG4pPT5ndC51cHgycHgocGFyc2VGbG9hdChuKSkrInB4Iik6ZX1mdW5jdGlvbiBmcihlKXtsZXQgdD10ZS5yZXNvbHZlQ29tcG9uZW50SW5zdGFuY2UoZSk7aWYodC4kcGFnZSlyZXR1cm4gdC4kcGFnZS5pZDtpZighdC4kKXJldHVybjtsZXQgbj10LiQucm9vdC5wcm94eTtpZihuJiZuLiRwYWdlKXJldHVybiBuLiRwYWdlLmlkfWZ1bmN0aW9uIF9yKCl7bGV0IGU9Vm4oKSx0PWUubGVuZ3RoO2lmKHQpcmV0dXJuIGVbdC0xXX1mdW5jdGlvbiBpYSgpe2xldCBlPV9yKCk7aWYoZSlyZXR1cm4gZS4kcGFnZS5tZXRhfWZ1bmN0aW9uIEJhKCl7bGV0IGU9aWEoKTtyZXR1cm4gZT9lLmlkOi0xfWZ1bmN0aW9uIExyKCl7bGV0IGU9X3IoKTtpZihlKXJldHVybiBlLiR2bX1sZXQgTWE9WyJuYXZpZ2F0aW9uQmFyIiwicHVsbFRvUmVmcmVzaCJdO2Z1bmN0aW9uIGJyKCl7cmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoVC5nbG9iYWxTdHlsZXx8e30pKX1mdW5jdGlvbiBabihlLHQpe2xldCBuPWJyKCkscj1ZLmV4dGVuZCh7aWQ6dH0sbixlKTtNYS5mb3JFYWNoKHU9PntyW3VdPVkuZXh0ZW5kKHt9LG5bdV0sZVt1XSl9KTtsZXR7bmF2aWdhdGlvbkJhcjphfT1yO3JldHVybiBhLnRpdGxlVGV4dCYmYS50aXRsZUltYWdlJiYoYS50aXRsZVRleHQ9IiIpLHJ9ZnVuY3Rpb24geG8oZSl7cmV0dXJuIEpTT04ucGFyc2UocmEoSlNPTi5zdHJpbmdpZnkoZSksITApKX1mdW5jdGlvbiBDcyhlKXtyZXR1cm4gZS5vZmZzZXQmJihlLm9mZnNldD1yYShlLm9mZnNldCkpLGUuaGVpZ2h0JiYoZS5oZWlnaHQ9cmEoZS5oZWlnaHQpKSxlLnJhbmdlJiYoZS5yYW5nZT1yYShlLnJhbmdlKSksZX1mdW5jdGlvbiBXbyhlLHQsbixyLGEpe2xldHtpZDp1LHJvdXRlOmh9PXI7cmV0dXJue2lkOnUscGF0aDp0ZS5hZGRMZWFkaW5nU2xhc2goaCkscm91dGU6aCxmdWxsUGF0aDp0LG9wdGlvbnM6bixtZXRhOnIsb3BlblR5cGU6ZSxldmVudENoYW5uZWw6YSxzdGF0dXNCYXJTdHlsZTpyLm5hdmlnYXRpb25CYXIudGl0bGVDb2xvcj09PSIjMDAwMDAwIj8iZGFyayI6ImxpZ2h0In19ZnVuY3Rpb24gbnMoZSx0LG4pe2xldCByPWUuJFt0XTshWS5pc0FycmF5KHIpfHxuLl9fd2VoJiZZLnJlbW92ZShyLG4uX193ZWgpfWZ1bmN0aW9uIGpuKGUsdCxuKXtpZihZLmlzU3RyaW5nKGUpKW49dCx0PWUsZT1McigpO2Vsc2UgaWYodHlwZW9mIGU9PSJudW1iZXIiKXtsZXQgYT1WbigpLmZpbmQodT0+dS4kcGFnZS5pZD09PWUpO2E/ZT1hLiR2bTplPUxyKCl9aWYoIWUpcmV0dXJuO2lmKGUuX19jYWxsX2hvb2spcmV0dXJuIGUuX19jYWxsX2hvb2sodCxuKTtsZXQgcj1lLiRbdF07cmV0dXJuIHImJnRlLmludm9rZUFycmF5Rm5zKHIsbil9ZnVuY3Rpb24gYmEoZSl7aWYoZS5pbmRleE9mKCIvIik9PT0wKXJldHVybiBlO2xldCB0PSIiLG49Vm4oKTtyZXR1cm4gbi5sZW5ndGgmJih0PW5bbi5sZW5ndGgtMV0uJHBhZ2Uucm91dGUpLEdvKHQsZSl9ZnVuY3Rpb24gR28oZSx0KXtpZih0LmluZGV4T2YoIi8iKT09PTApcmV0dXJuIHQ7aWYodC5pbmRleE9mKCIuLyIpPT09MClyZXR1cm4gR28oZSx0LnNsaWNlKDIpKTtsZXQgbj10LnNwbGl0KCIvIikscj1uLmxlbmd0aCxhPTA7Zm9yKDthPHImJm5bYV09PT0iLi4iO2ErKyk7bi5zcGxpY2UoMCxhKSx0PW4uam9pbigiLyIpO2xldCB1PWUubGVuZ3RoPjA/ZS5zcGxpdCgiLyIpOltdO3JldHVybiB1LnNwbGljZSh1Lmxlbmd0aC1hLTEsYSsxKSx0ZS5hZGRMZWFkaW5nU2xhc2godS5jb25jYXQobikuam9pbigiLyIpKX1mdW5jdGlvbiBJaShlLHQ9ITEpe3JldHVybiB0P3plLmZpbmQobj0+bi5wYXRoPT09ZXx8bi5hbGlhcz09PWUpOnplLmZpbmQobj0+bi5wYXRoPT09ZSl9ZnVuY3Rpb24gRWEoZSl7bGV0IHQ9SWkoZSk7aWYodClyZXR1cm4gdC5tZXRhfWZ1bmN0aW9uIExhKGUsdCxuKXtsZXQgcj1JaSh0ZS5hZGRMZWFkaW5nU2xhc2godCkpO2lmKHIpe2xldHttZXRhOnV9PXI7ZGVsZXRlIHUudGFiQmFySW5kZXgsdS5pc1F1aXQ9dS5pc1RhYkJhcj0hMX1sZXQgYT1JaSh0ZS5hZGRMZWFkaW5nU2xhc2gobikpO2lmKGEpe2xldHttZXRhOnV9PWE7dS50YWJCYXJJbmRleD1lLHUuaXNRdWl0PXUuaXNUYWJCYXI9ITA7bGV0IGg9VC50YWJCYXI7aCYmaC5saXN0JiZoLmxpc3RbZV0mJihoLmxpc3RbZV0ucGFnZVBhdGg9dGUucmVtb3ZlTGVhZGluZ1NsYXNoKG4pKX19bGV0IGFvLG9hLEVvO2Z1bmN0aW9uIHppKCl7cmV0dXJuIHR5cGVvZiB3aW5kb3c9PSJvYmplY3QiJiZ0eXBlb2YgbmF2aWdhdG9yPT0ib2JqZWN0IiYmdHlwZW9mIGRvY3VtZW50PT0ib2JqZWN0Ij8id2VidmlldyI6InY4In1mdW5jdGlvbiB5YSgpe3JldHVybiBhby53ZWJ2aWV3LmN1cnJlbnRXZWJ2aWV3KCkuaWR9bGV0IGFhLHdhLHNhPXt9O2Z1bmN0aW9uIFNhKGUpe2xldCB0PWUuZGF0YSYmZS5kYXRhLl9fbWVzc2FnZTtpZighdHx8IXQuX19wYWdlKXJldHVybjtsZXQgbj10Ll9fcGFnZSxyPXNhW25dO3ImJnIodCksdC5rZWVwfHxkZWxldGUgc2Fbbl19ZnVuY3Rpb24gT3MoZSx0KXt6aSgpPT09InY4Ij9Fbz8oYWEmJmFhLmNsb3NlKCksYWE9bmV3IEVvKHlhKCkpLGFhLm9ubWVzc2FnZT1TYSk6d2F8fCh3YT1vYS5yZXF1aXJlTW9kdWxlKCJnbG9iYWxFdmVudCIpLHdhLmFkZEV2ZW50TGlzdGVuZXIoInBsdXNNZXNzYWdlIixTYSkpOndpbmRvdy5fX3BsdXNNZXNzYWdlPVNhLHNhW2VdPXR9Y2xhc3Mgc297Y29uc3RydWN0b3IodCl7dGhpcy53ZWJ2aWV3PXR9c2VuZE1lc3NhZ2UodCl7bGV0IG49SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh7X19tZXNzYWdlOntkYXRhOnR9fSkpLHI9dGhpcy53ZWJ2aWV3LmlkO0VvP25ldyBFbyhyKS5wb3N0TWVzc2FnZShuKTphby53ZWJ2aWV3LnBvc3RNZXNzYWdlVG9VbmlOVmlldyYmYW8ud2Vidmlldy5wb3N0TWVzc2FnZVRvVW5pTlZpZXcobixyKX1jbG9zZSgpe3RoaXMud2Vidmlldy5jbG9zZSgpfX1mdW5jdGlvbiByaSh7Y29udGV4dDplPXt9LHVybDp0LGRhdGE6bj17fSxzdHlsZTpyPXt9LG9uTWVzc2FnZTphLG9uQ2xvc2U6dX0pe2FvPWUucGx1c3x8bCxvYT1lLndlZXh8fCh0eXBlb2YgZz09Im9iamVjdCI/ZzpudWxsKSxFbz1lLkJyb2FkY2FzdENoYW5uZWx8fCh0eXBlb2YgQnJvYWRjYXN0Q2hhbm5lbD09Im9iamVjdCI/QnJvYWRjYXN0Q2hhbm5lbDpudWxsKTtsZXQgaD17YXV0b0JhY2tCdXR0b246ITAsdGl0bGVTaXplOiIxN3B4In0sYj1gcGFnZSR7RGF0ZS5ub3coKX1gO3I9WS5leHRlbmQoe30sciksci50aXRsZU5WaWV3IT09ITEmJnIudGl0bGVOVmlldyE9PSJub25lIiYmKHIudGl0bGVOVmlldz1ZLmV4dGVuZChoLHIudGl0bGVOVmlldykpO2xldCBVPXt0b3A6MCxib3R0b206MCx1c2luZ0NvbXBvbmVudHM6e30scG9wR2VzdHVyZToiY2xvc2UiLHNjcm9sbEluZGljYXRvcjoibm9uZSIsYW5pbWF0aW9uVHlwZToicG9wLWluIixhbmltYXRpb25EdXJhdGlvbjoyMDAsdW5pTlZpZXc6e3BhdGg6YC8ke3R9LmpzYCxkZWZhdWx0Rm9udFNpemU6MTYsdmlld3BvcnQ6YW8uc2NyZWVuLnJlc29sdXRpb25XaWR0aH19O3I9WS5leHRlbmQoVSxyKTtsZXQgTz1hby53ZWJ2aWV3LmNyZWF0ZSgiIixiLHIse2V4dHJhczp7ZnJvbTp5YSgpLHJ1bnRpbWU6emkoKSxkYXRhOm4sdXNlR2xvYmFsRXZlbnQ6IUVvfX0pO3JldHVybiBPLmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIix1KSxPcyhiLEQ9PntZLmlzRnVuY3Rpb24oYSkmJmEoRC5kYXRhKSxELmtlZXB8fE8uY2xvc2UoImF1dG8iKX0pLE8uc2hvdyhyLmFuaW1hdGlvblR5cGUsci5hbmltYXRpb25EdXJhdGlvbiksbmV3IHNvKE8pfWxldCBOaT0oZSx0KT0+c3QuZW1pdCgiYXBpLiIrZSx0KSxsbz0xO2Z1bmN0aW9uIGxhKCl7cmV0dXJuIEJhKCkrIi4iK25hfWxldCBtPShlLHQsbixyKT0+e2xldHtzdWJzY3JpYmU6YSxwdWJsaXNoSGFuZGxlcjp1fT1zdCxoPXI/bG8rKzowO3ImJmEobmErIi4iK2gsciwhMCksdShsYSgpLHtpZDpoLG5hbWU6ZSxhcmdzOnR9LG4pfSxSPShlLHQsbixyKT0+e2xldHtzdWJzY3JpYmU6YSx1bnN1YnNjcmliZTp1LHB1Ymxpc2hIYW5kbGVyOmh9PXN0LGI9bG8rKyxVPW5hKyIuIitiO3JldHVybiBhKFUsbiksaChsYSgpLHtpZDpiLG5hbWU6ZSxhcmdzOnR9LHIpLCgpPT57dShVKX19LHo9T2JqZWN0LmNyZWF0ZShudWxsKTtmdW5jdGlvbiBqKCl7c3Quc3Vic2NyaWJlKF9hLFEpfWZ1bmN0aW9uIFooZSx0KXt6W2VdfHwoeltlXT10KX1mdW5jdGlvbiBRKHtpZDplLG5hbWU6dCxhcmdzOm59LHIpe2xldCBhPWg9PntlJiZzdC5wdWJsaXNoSGFuZGxlcihfYSsiLiIrZSxoLHIpfSx1PXpbdF07dT91KG4sYSk6YSh7fSl9bGV0IGNlPVkuZXh0ZW5kKFJhKCJ2aWV3Iikse2ludm9rZU9uQ2FsbGJhY2s6TmksaW52b2tlVmlld01ldGhvZDptLGludm9rZVZpZXdNZXRob2RLZWVwQWxpdmU6Un0pO2Z1bmN0aW9uIGJlKCl7bGV0e29uOmV9PXN0O2UodGUuT05fUkVTSVpFLE9lKSxlKHRlLk9OX0FQUF9FTlRFUl9GT1JFR1JPVU5ELE5lKSxlKHRlLk9OX0FQUF9FTlRFUl9CQUNLR1JPVU5ELHZlKX1mdW5jdGlvbiBPZShlKXtqbihfcigpLHRlLk9OX1JFU0laRSxlKSxzdC5pbnZva2VPbkNhbGxiYWNrKCJvbldpbmRvd1Jlc2l6ZSIsZSl9ZnVuY3Rpb24gTmUoZSl7bGV0IHQ9X3IoKTtqbih2bigpLHRlLk9OX1NIT1csZSksam4odCx0ZS5PTl9TSE9XKX1mdW5jdGlvbiB2ZSgpe2puKHZuKCksdGUuT05fSElERSksam4oX3IoKSx0ZS5PTl9ISURFKX1sZXQgRmU9W3RlLk9OX1BBR0VfU0NST0xMLHRlLk9OX1JFQUNIX0JPVFRPTV07ZnVuY3Rpb24gcnQoKXtGZS5mb3JFYWNoKGU9PnN0LnN1YnNjcmliZShlLGJ0KGUpKSl9ZnVuY3Rpb24gYnQoZSl7cmV0dXJuKHQsbik9PntqbihwYXJzZUludChuKSxlLHQpfX1mdW5jdGlvbiBXdCgpe2JlKCkscnQoKX1mdW5jdGlvbiBudChlKXtlLiR2bT1lLGUuJG1wVHlwZT0iYXBwIjtsZXQgdD1Fbi5yZWYoWCgpLmdldExvY2FsZSgpKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiJGxvY2FsZSIse2dldCgpe3JldHVybiB0LnZhbHVlfSxzZXQobil7dC52YWx1ZT1ufX0pfWZ1bmN0aW9uIEdlKGUsdCl7ZS5yb3V0ZT10LnJvdXRlLGUuJHZtPWUsZS4kcGFnZT10LGUuJG1wVHlwZT0icGFnZSIsdC5tZXRhLmlzVGFiQmFyJiYoZS4kLl9faXNUYWJCYXI9ITAsZS4kLl9faXNBY3RpdmU9ITApfWZ1bmN0aW9uIHV0KCl7cmV0dXJue3BhdGg6IiIscXVlcnk6e30sc2NlbmU6MTAwMSxyZWZlcnJlckluZm86e2FwcElkOiIiLGV4dHJhRGF0YTp7fX19fWZ1bmN0aW9uIFZ0KGUsdCl7bGV0IG49ZS4kb3B0aW9uc3x8e307bi5nbG9iYWxEYXRhPVkuZXh0ZW5kKG4uZ2xvYmFsRGF0YXx8e30sdCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImdsb2JhbERhdGEiLHtnZXQoKXtyZXR1cm4gbi5nbG9iYWxEYXRhfSxzZXQocil7bi5nbG9iYWxEYXRhPXJ9fSl9ZnVuY3Rpb24gcHQoZSl7aWYoZS5pbmRleE9mKCIvLyIpPT09MClyZXR1cm4iaHR0cHM6IitlO2lmKHRlLlNDSEVNRV9SRS50ZXN0KGUpfHx0ZS5EQVRBX1JFLnRlc3QoZSkpcmV0dXJuIGU7aWYoT3QoZSkpcmV0dXJuImZpbGU6Ly8iK1plKGUpO2xldCB0PSJmaWxlOi8vIitaZSgiX3d3dyIpO2lmKGUuaW5kZXhPZigiLyIpPT09MClyZXR1cm4gZS5zdGFydHNXaXRoKCIvc3RvcmFnZS8iKXx8ZS5zdGFydHNXaXRoKCIvc2RjYXJkLyIpfHxlLmluY2x1ZGVzKCIvQ29udGFpbmVycy9EYXRhL0FwcGxpY2F0aW9uLyIpPyJmaWxlOi8vIitlOnQrZTtpZihlLmluZGV4T2YoIi4uLyIpPT09MHx8ZS5pbmRleE9mKCIuLyIpPT09MCl7aWYodHlwZW9mIF9faWRfXz09InN0cmluZyIpcmV0dXJuIHQrR28odGUuYWRkTGVhZGluZ1NsYXNoKF9faWRfXyksZSk7e2xldCBuPV9yKCk7aWYobilyZXR1cm4gdCtHbyh0ZS5hZGRMZWFkaW5nU2xhc2gobi5yb3V0ZSksZSl9fXJldHVybiBlfWxldCBaZT10ZS5jYWNoZVN0cmluZ0Z1bmN0aW9uKGU9PmwuaW8uY29udmVydExvY2FsRmlsZVN5c3RlbVVSTChlKS5yZXBsYWNlKC9eXC8/YXBwc1wvLywiL2FuZHJvaWRfYXNzZXQvYXBwcy8iKS5yZXBsYWNlKC9cLyQvLCIiKSk7ZnVuY3Rpb24gT3QoZSl7cmV0dXJuIGUuaW5kZXhPZigiX3d3dyIpPT09MHx8ZS5pbmRleE9mKCJfZG9jIik9PT0wfHxlLmluZGV4T2YoIl9kb2N1bWVudHMiKT09PTB8fGUuaW5kZXhPZigiX2Rvd25sb2FkcyIpPT09MH1sZXQgd249InN1Y2Nlc3MiLHVuPSJmYWlsIixTbj1bd24sdW4sImNvbXBsZXRlIl07ZnVuY3Rpb24gSHQoZSx0LG4scil7aWYoIWUpcmV0dXJuO2lmKHR5cGVvZiBuPT0idW5kZWZpbmVkIilyZXR1cm4gZVt0XSgpO2xldFssYV09RXIobixyKTtyZXR1cm4gT2JqZWN0LmtleXMoYSkubGVuZ3RoP2VbdF0oQm8odCxhKSk6ZVt0XSgpfWZ1bmN0aW9uIExuKGUsdCxuLHIpe2lmKCFlKXJldHVybjtsZXRbYSx1XT1FcihuLHIpO3JldHVybiBPYmplY3Qua2V5cyh1KS5sZW5ndGg/ZVt0XShhLEJvKHQsdSkpOmVbdF0oYSl9ZnVuY3Rpb24gbWkoZSx0KXtsZXQgbj1vcihlLHQuJGVsKTtyZXR1cm4gbnx8Y29uc29sZS5lcnJvcigiQ2FuIG5vdCBmaW5kIGAiK2UrImAiKX1mdW5jdGlvbiBvcihlLHQpe2lmKCFlfHwhdClyZXR1cm47aWYodC5hdHRyJiZ0LmF0dHIuaWQ9PT1lKXJldHVybiB0O2xldCBuPXQuY2hpbGRyZW47aWYoISFuKWZvcihsZXQgcj0wLGE9bi5sZW5ndGg7cjxhO3IrKyl7bGV0IHU9b3IoZSxuW3JdKTtpZih1KXJldHVybiB1fX1mdW5jdGlvbiBFcihlPXt9LHQpe2xldCBuPU9iamVjdC5jcmVhdGUobnVsbCkscj1mdW5jdGlvbih1KXtsZXQgaD1lW3VdO1kuaXNGdW5jdGlvbihoKSYmKG5bdV09aCxkZWxldGUgZVt1XSl9O3JldHVybiBTbi5mb3JFYWNoKHIpLHQmJnQuZm9yRWFjaChyKSxbZSxuXX1mdW5jdGlvbiBCbyhlLHQpe3JldHVybiBmdW5jdGlvbihyKXtsZXQgYT1yLnR5cGU7ZGVsZXRlIHIudHlwZTtsZXQgdT10W2FdO2lmKGE9PT13bj9yLmVyck1zZz1gJHtlfTpva2A6YT09PXVuJiYoci5lcnJNc2c9ZSsiOmZhaWwgIisoci5tc2c/IiAiK3IubXNnOiIiKSksZGVsZXRlIHIuY29kZSxkZWxldGUgci5tc2csWS5pc0Z1bmN0aW9uKHUpJiZ1KHIpLGE9PT13bnx8YT09PXVuKXtsZXQgaD10LmNvbXBsZXRlO1kuaXNGdW5jdGlvbihoKSYmaChyKX19fWxldCBXaTtmdW5jdGlvbiBNbygpe3JldHVybiBXaX1mdW5jdGlvbiBMbyhlKXtsZXQgdD1lLiQuYXBwQ29udGV4dDtXaT1ZLmV4dGVuZCh0LmFwcCx7bW91bnRQYWdlKG4scixhKXtsZXQgdT1Fbi5jcmVhdGVWTm9kZShuLHIpO3UuYXBwQ29udGV4dD10LHUuX19wYWdlX2NvbnRhaW5lcl9fPWEsRW4ucmVuZGVyKHUsYSk7bGV0IGg9dS5jb21wb25lbnQucHJveHk7cmV0dXJuIGguX19wYWdlX2NvbnRhaW5lcl9fPWEsaH0sdW5tb3VudFBhZ2U6bj0+e2xldHtfX3BhZ2VfY29udGFpbmVyX186cn09bjtyJiYoci5pc1VubW91bnRlZD0hMCxFbi5yZW5kZXIobnVsbCxyKSl9fSl9bGV0IEx0PVtdO2Z1bmN0aW9uIGZuKGUpe2lmKCFlLiRwYWdlLm1ldGEuaXNOVnVlKXJldHVybiBMdC5wdXNoKGUpO2xldCBuPUx0LmZpbmRJbmRleChyPT5yLiRwYWdlLmlkPT09ZS4kcGFnZS5pZCk7bj4tMT9MdC5zcGxpY2UobiwxLGUpOkx0LnB1c2goZSl9ZnVuY3Rpb24gY28oZSl7cmV0dXJuIEx0LmZpbmQodD0+dC4kcGFnZS5pZD09PWUpfWZ1bmN0aW9uIHFyKCl7cmV0dXJuIEx0fWZ1bmN0aW9uIGlpKCl7bGV0IGU9W107cmV0dXJuIEx0LmZvckVhY2godD0+e3QuJC5fX2lzVGFiQmFyP3QuJC5fX2lzQWN0aXZlJiZlLnB1c2godCk6ZS5wdXNoKHQpfSksZX1mdW5jdGlvbiBEbygpe2xldCBlPV9yKCk7IWV8fHVvKGUpfWZ1bmN0aW9uIHVvKGUpe2xldCB0PUx0LmZpbmRJbmRleChuPT5uPT09ZSk7dCE9PS0xJiYoZS4kcGFnZS5tZXRhLmlzTlZ1ZXx8TW8oKS51bm1vdW50UGFnZShlKSxMdC5zcGxpY2UodCwxKSl9bGV0IFhuPXtwbGF5KGUpe3JldHVybiBIdChlLCJwbGF5Iil9LHBhdXNlKGUpe3JldHVybiBIdChlLCJwYXVzZSIpfSxzZWVrKGUsdCl7cmV0dXJuIExuKGUsInNlZWsiLHQucG9zaXRpb24pfSxzdG9wKGUpe3JldHVybiBIdChlLCJzdG9wIil9LHNlbmREYW5tdShlLHQpe3JldHVybiBMbihlLCJzZW5kRGFubXUiLHQpfSxwbGF5YmFja1JhdGUoZSx0KXtyZXR1cm4gTG4oZSwicGxheWJhY2tSYXRlIix0LnJhdGUpfSxyZXF1ZXN0RnVsbFNjcmVlbihlLHQ9e30pe3JldHVybiBMbihlLCJyZXF1ZXN0RnVsbFNjcmVlbiIsdCl9LGV4aXRGdWxsU2NyZWVuKGUpe3JldHVybiBIdChlLCJleGl0RnVsbFNjcmVlbiIpfSxzaG93U3RhdHVzQmFyKGUpe3JldHVybiBIdChlLCJzaG93U3RhdHVzQmFyIil9LGhpZGVTdGF0dXNCYXIoZSl7cmV0dXJuIEh0KGUsImhpZGVTdGF0dXNCYXIiKX19O2Z1bmN0aW9uIFl0KGUsdCxuLHIpe2xldCBhPWNvKHQpO2lmKGE9PW51bGw/dm9pZCAwOmEuJHBhZ2UubWV0YS5pc05WdWUpe2xldCB1PWEuJHZtO3JldHVybiBYbltuXShtaShlLHUpLHIpfXN0Lmludm9rZVZpZXdNZXRob2QoInZpZGVvLiIrZSx7dmlkZW9JZDplLHR5cGU6bixkYXRhOnJ9LHQpfWxldCBvaT17Z2V0Q2VudGVyTG9jYXRpb24oZSx0KXtyZXR1cm4gSHQoZSwiZ2V0Q2VudGVyTG9jYXRpb24iLHQpfSxtb3ZlVG9Mb2NhdGlvbihlLHQpe3JldHVybiBMbihlLCJtb3ZlVG9Mb2NhdGlvbiIsdCl9LHRyYW5zbGF0ZU1hcmtlcihlLHQpe3JldHVybiBMbihlLCJ0cmFuc2xhdGVNYXJrZXIiLHQsWyJhbmltYXRpb25FbmQiXSl9LGluY2x1ZGVQb2ludHMoZSx0KXtyZXR1cm4gTG4oZSwiaW5jbHVkZVBvaW50cyIsdCl9LGdldFJlZ2lvbihlLHQpe3JldHVybiBIdChlLCJnZXRSZWdpb24iLHQpfSxnZXRTY2FsZShlLHQpe3JldHVybiBIdChlLCJnZXRTY2FsZSIsdCl9LGFkZEN1c3RvbUxheWVyKGUsdCl7cmV0dXJuIExuKGUsImFkZEN1c3RvbUxheWVyIix0KX0scmVtb3ZlQ3VzdG9tTGF5ZXIoZSx0KXtyZXR1cm4gTG4oZSwicmVtb3ZlQ3VzdG9tTGF5ZXIiLHQpfSxhZGRHcm91bmRPdmVybGF5KGUsdCl7cmV0dXJuIExuKGUsImFkZEdyb3VuZE92ZXJsYXkiLHQpfSxyZW1vdmVHcm91bmRPdmVybGF5KGUsdCl7cmV0dXJuIExuKGUsInJlbW92ZUdyb3VuZE92ZXJsYXkiLHQpfSx1cGRhdGVHcm91bmRPdmVybGF5KGUsdCl7cmV0dXJuIExuKGUsInVwZGF0ZUdyb3VuZE92ZXJsYXkiLHQpfSxpbml0TWFya2VyQ2x1c3RlcihlLHQpe3JldHVybiBMbihlLCJpbml0TWFya2VyQ2x1c3RlciIsdCl9LGFkZE1hcmtlcnMoZSx0KXtyZXR1cm4gTG4oZSwiYWRkTWFya2VycyIsdCl9LHJlbW92ZU1hcmtlcnMoZSx0KXtyZXR1cm4gTG4oZSwicmVtb3ZlTWFya2VycyIsdCl9LG1vdmVBbG9uZyhlLHQpe3JldHVybiBMbihlLCJtb3ZlQWxvbmciLHQpfSxvcGVuTWFwQXBwKGUsdCl7cmV0dXJuIExuKGUsIm9wZW5NYXBBcHAiLHQpfSxvbihlLHQpe3JldHVybiBlLm9uKHQubmFtZSx0LmNhbGxiYWNrKX19O2Z1bmN0aW9uIEFhKGUsdCxuLHIsYSl7bGV0IHU9Y28odCk7aWYodT09bnVsbD92b2lkIDA6dS4kcGFnZS5tZXRhLmlzTlZ1ZSl7bGV0IGg9dS4kdm07cmV0dXJuIG9pW25dKG1pKGUsaCkscil9c3QuaW52b2tlVmlld01ldGhvZCgibWFwLiIrZSx7dHlwZTpuLGRhdGE6cn0sdCxhKX1mdW5jdGlvbiBQcihlKXtyZXR1cm5gSW50ZXJzZWN0aW9uT2JzZXJ2ZXIuJHtlfWB9ZnVuY3Rpb24gRHIoe3JlcUlkOmUsY29tcG9uZW50OnQsb3B0aW9uczpuLGNhbGxiYWNrOnJ9LGEpe2xldCB1PVByKGUpO3N0Lmludm9rZVZpZXdNZXRob2QoImFkZEludGVyc2VjdGlvbk9ic2VydmVyIix7cmVxSWQ6ZSxjb21wb25lbnQ6dC4kZWwubm9kZUlkLG9wdGlvbnM6bixldmVudE5hbWU6dX0sYSksc3Quc3Vic2NyaWJlKHUscil9ZnVuY3Rpb24gVHMoe3JlcUlkOmUsY29tcG9uZW50OnR9LG4pe3N0Lmludm9rZVZpZXdNZXRob2QoInJlbW92ZUludGVyc2VjdGlvbk9ic2VydmVyIix7cmVxSWQ6ZSxjb21wb25lbnQ6dC4kZWwubm9kZUlkfSxuKSxzdC51bnN1YnNjcmliZShQcihlKSl9ZnVuY3Rpb24gcnMoZSl7cmV0dXJuYE1lZGlhUXVlcnlPYnNlcnZlci4ke2V9YH1mdW5jdGlvbiBHbih7cmVxSWQ6ZSxjb21wb25lbnQ6dCxvcHRpb25zOm4sY2FsbGJhY2s6cn0sYSl7bGV0IHU9cnMoZSk7c3QuaW52b2tlVmlld01ldGhvZCgiYWRkTWVkaWFRdWVyeU9ic2VydmVyIix7cmVxSWQ6ZSxjb21wb25lbnQ6dC4kZWwubm9kZUlkLG9wdGlvbnM6bixldmVudE5hbWU6dX0sYSksc3Quc3Vic2NyaWJlKHUscil9ZnVuY3Rpb24gQW4oe3JlcUlkOmUsY29tcG9uZW50OnR9LG4pe3N0Lmludm9rZVZpZXdNZXRob2QoInJlbW92ZU1lZGlhUXVlcnlPYnNlcnZlciIse3JlcUlkOmUsY29tcG9uZW50OnQuJGVsLm5vZGVJZH0sbiksc3QudW5zdWJzY3JpYmUocnMoZSkpfWxldCBRbj0yMDAsRnI9WyJ1bmtub3duIiwibm9uZSIsImV0aGVybmV0Iiwid2lmaSIsIjJnIiwiM2ciLCI0ZyIsIjVnIl0sa2k9Il9kb2MvdW5pYXBwX3RlbXAiLGFpPWAke2tpfV8ke0RhdGUubm93KCl9YDtmdW5jdGlvbiBDYShlKXtsZXQgdD1lLnNwbGl0KCIvIik7cmV0dXJuIHRbdC5sZW5ndGgtMV19ZnVuY3Rpb24gWW8oZSl7bGV0IHQ9ZS5zcGxpdCgiLiIpO3JldHVybiB0Lmxlbmd0aD4xPyIuIit0W3QubGVuZ3RoLTFdOiIifWxldCBHaT0iYmFja2J1dHRvbiI7ZnVuY3Rpb24gWWkoKXtndC5uYXZpZ2F0ZUJhY2soe2Zyb206ImJhY2tidXR0b24iLHN1Y2Nlc3MoKXt9fSl9bGV0IHFpPXV0KCksT2E9dXQoKTtmdW5jdGlvbiBEYSgpe3JldHVybiBZLmV4dGVuZCh7fSxPYSl9ZnVuY3Rpb24gaXMoKXtyZXR1cm4gWS5leHRlbmQoe30scWkpfWZ1bmN0aW9uIFZlKHtwYXRoOmUscXVlcnk6dCxyZWZlcnJlckluZm86bn0pe1kuZXh0ZW5kKHFpLHtwYXRoOmUscXVlcnk6dD90ZS5wYXJzZVF1ZXJ5KHQpOnt9LHJlZmVycmVySW5mbzpufHx7fX0pfWZ1bmN0aW9uIFR0KHtwYXRoOmUscXVlcnk6dCxyZWZlcnJlckluZm86bn0pe3JldHVybiBZLmV4dGVuZChPYSx7cGF0aDplLHF1ZXJ5OnQ/dGUucGFyc2VRdWVyeSh0KTp7fSxyZWZlcnJlckluZm86bnx8e30sY2hhbm5lbDpsLnJ1bnRpbWUuY2hhbm5lbCxsYXVuY2hlcjpsLnJ1bnRpbWUubGF1bmNoZXJ9KSxZLmV4dGVuZChxaSxPYSksWS5leHRlbmQoe30sT2EpfWZ1bmN0aW9uIFJ0KCl7bGV0IGU9Zy5yZXF1aXJlTW9kdWxlKCJwbHVzIik7aWYoZS5nZXRSZWRpcmVjdEluZm8pe2xldHtwYXRoOnQscXVlcnk6bixleHRyYURhdGE6cix1c2VyQWN0aW9uOmEsZnJvbUFwcGlkOnV9PWUuZ2V0UmVkaXJlY3RJbmZvKCl8fHt9LGg9e2FwcElkOnUsZXh0cmFEYXRhOnt9fTtyZXR1cm4gciYmKGguZXh0cmFEYXRhPXIpLHtwYXRoOnR8fCIiLHF1ZXJ5Om4/Ij8iK246IiIscmVmZXJyZXJJbmZvOmgsdXNlckFjdGlvbjphfX19ZnVuY3Rpb24gVG4oZSl7dmFyIHQ9e2V4cG9ydHM6e319O3JldHVybiBlKHQsdC5leHBvcnRzKSx0LmV4cG9ydHN9dmFyIGVyPVRuKGZ1bmN0aW9uKGUsdCl7dmFyIG49dHlwZW9mIFVpbnQ4QXJyYXkhPSJ1bmRlZmluZWQiJiZ0eXBlb2YgVWludDE2QXJyYXkhPSJ1bmRlZmluZWQiJiZ0eXBlb2YgSW50MzJBcnJheSE9InVuZGVmaW5lZCI7ZnVuY3Rpb24gcihoLGIpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaCxiKX10LmFzc2lnbj1mdW5jdGlvbihoKXtmb3IodmFyIGI9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO2IubGVuZ3RoOyl7dmFyIFU9Yi5zaGlmdCgpO2lmKCEhVSl7aWYodHlwZW9mIFUhPSJvYmplY3QiKXRocm93IG5ldyBUeXBlRXJyb3IoVSsibXVzdCBiZSBub24tb2JqZWN0Iik7Zm9yKHZhciBPIGluIFUpcihVLE8pJiYoaFtPXT1VW09dKX19cmV0dXJuIGh9LHQuc2hyaW5rQnVmPWZ1bmN0aW9uKGgsYil7cmV0dXJuIGgubGVuZ3RoPT09Yj9oOmguc3ViYXJyYXk/aC5zdWJhcnJheSgwLGIpOihoLmxlbmd0aD1iLGgpfTt2YXIgYT17YXJyYXlTZXQ6ZnVuY3Rpb24oaCxiLFUsTyxEKXtpZihiLnN1YmFycmF5JiZoLnN1YmFycmF5KXtoLnNldChiLnN1YmFycmF5KFUsVStPKSxEKTtyZXR1cm59Zm9yKHZhciBnZT0wO2dlPE87Z2UrKyloW0QrZ2VdPWJbVStnZV19LGZsYXR0ZW5DaHVua3M6ZnVuY3Rpb24oaCl7dmFyIGIsVSxPLEQsZ2Usd2U7Zm9yKE89MCxiPTAsVT1oLmxlbmd0aDtiPFU7YisrKU8rPWhbYl0ubGVuZ3RoO2Zvcih3ZT1uZXcgVWludDhBcnJheShPKSxEPTAsYj0wLFU9aC5sZW5ndGg7YjxVO2IrKylnZT1oW2JdLHdlLnNldChnZSxEKSxEKz1nZS5sZW5ndGg7cmV0dXJuIHdlfX0sdT17YXJyYXlTZXQ6ZnVuY3Rpb24oaCxiLFUsTyxEKXtmb3IodmFyIGdlPTA7Z2U8TztnZSsrKWhbRCtnZV09YltVK2dlXX0sZmxhdHRlbkNodW5rczpmdW5jdGlvbihoKXtyZXR1cm5bXS5jb25jYXQuYXBwbHkoW10saCl9fTt0LnNldFR5cGVkPWZ1bmN0aW9uKGgpe2g/KHQuQnVmOD1VaW50OEFycmF5LHQuQnVmMTY9VWludDE2QXJyYXksdC5CdWYzMj1JbnQzMkFycmF5LHQuYXNzaWduKHQsYSkpOih0LkJ1Zjg9QXJyYXksdC5CdWYxNj1BcnJheSx0LkJ1ZjMyPUFycmF5LHQuYXNzaWduKHQsdSkpfSx0LnNldFR5cGVkKG4pfSksU3Q9ZXIseW89NCxGbz0wLGNhPTEsUHM9MjtmdW5jdGlvbiBxbyhlKXtmb3IodmFyIHQ9ZS5sZW5ndGg7LS10Pj0wOyllW3RdPTB9dmFyIHpsPTAsYWw9MSxXbD0yLHNsPTMsbGw9MjU4LElzPTI5LEZhPTI1NixWYT1GYSsxK0lzLEtvPTMwLG9zPTE5LGNsPTIqVmErMSx1YT0xNSxhcz0xNixOcz03LHNzPTI1Nix1bD0xNixmbD0xNyxUYT0xOCwkYT1bMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMiwyLDIsMiwzLDMsMywzLDQsNCw0LDQsNSw1LDUsNSwwXSxmYT1bMCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxM10sZGw9WzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwzLDddLFVhPVsxNiwxNywxOCwwLDgsNyw5LDYsMTAsNSwxMSw0LDEyLDMsMTMsMiwxNCwxLDE1XSxrcz01MTIsd289bmV3IEFycmF5KChWYSsyKSoyKTtxbyh3byk7dmFyIEhhPW5ldyBBcnJheShLbyoyKTtxbyhIYSk7dmFyIGphPW5ldyBBcnJheShrcyk7cW8oamEpO3ZhciBQYT1uZXcgQXJyYXkobGwtc2wrMSk7cW8oUGEpO3ZhciBscz1uZXcgQXJyYXkoSXMpO3FvKGxzKTt2YXIgemE9bmV3IEFycmF5KEtvKTtxbyh6YSk7ZnVuY3Rpb24gY3MoZSx0LG4scixhKXt0aGlzLnN0YXRpY190cmVlPWUsdGhpcy5leHRyYV9iaXRzPXQsdGhpcy5leHRyYV9iYXNlPW4sdGhpcy5lbGVtcz1yLHRoaXMubWF4X2xlbmd0aD1hLHRoaXMuaGFzX3N0cmVlPWUmJmUubGVuZ3RofXZhciBScyx1cyx4cztmdW5jdGlvbiBmcyhlLHQpe3RoaXMuZHluX3RyZWU9ZSx0aGlzLm1heF9jb2RlPTAsdGhpcy5zdGF0X2Rlc2M9dH1mdW5jdGlvbiBobChlKXtyZXR1cm4gZTwyNTY/amFbZV06amFbMjU2KyhlPj4+NyldfWZ1bmN0aW9uIFdhKGUsdCl7ZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK109dCYyNTUsZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK109dD4+PjgmMjU1fWZ1bmN0aW9uIF9pKGUsdCxuKXtlLmJpX3ZhbGlkPmFzLW4/KGUuYmlfYnVmfD10PDxlLmJpX3ZhbGlkJjY1NTM1LFdhKGUsZS5iaV9idWYpLGUuYmlfYnVmPXQ+PmFzLWUuYmlfdmFsaWQsZS5iaV92YWxpZCs9bi1hcyk6KGUuYmlfYnVmfD10PDxlLmJpX3ZhbGlkJjY1NTM1LGUuYmlfdmFsaWQrPW4pfWZ1bmN0aW9uIEtpKGUsdCxuKXtfaShlLG5bdCoyXSxuW3QqMisxXSl9ZnVuY3Rpb24gQnMoZSx0KXt2YXIgbj0wO2RvIG58PWUmMSxlPj4+PTEsbjw8PTE7d2hpbGUoLS10PjApO3JldHVybiBuPj4+MX1mdW5jdGlvbiBKbyhlKXtlLmJpX3ZhbGlkPT09MTY/KFdhKGUsZS5iaV9idWYpLGUuYmlfYnVmPTAsZS5iaV92YWxpZD0wKTplLmJpX3ZhbGlkPj04JiYoZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK109ZS5iaV9idWYmMjU1LGUuYmlfYnVmPj49OCxlLmJpX3ZhbGlkLT04KX1mdW5jdGlvbiBHYShlLHQpe3ZhciBuPXQuZHluX3RyZWUscj10Lm1heF9jb2RlLGE9dC5zdGF0X2Rlc2Muc3RhdGljX3RyZWUsdT10LnN0YXRfZGVzYy5oYXNfc3RyZWUsaD10LnN0YXRfZGVzYy5leHRyYV9iaXRzLGI9dC5zdGF0X2Rlc2MuZXh0cmFfYmFzZSxVPXQuc3RhdF9kZXNjLm1heF9sZW5ndGgsTyxELGdlLHdlLGtlLEV0LGt0PTA7Zm9yKHdlPTA7d2U8PXVhO3dlKyspZS5ibF9jb3VudFt3ZV09MDtmb3IobltlLmhlYXBbZS5oZWFwX21heF0qMisxXT0wLE89ZS5oZWFwX21heCsxO088Y2w7TysrKUQ9ZS5oZWFwW09dLHdlPW5bbltEKjIrMV0qMisxXSsxLHdlPlUmJih3ZT1VLGt0KyspLG5bRCoyKzFdPXdlLCEoRD5yKSYmKGUuYmxfY291bnRbd2VdKyssa2U9MCxEPj1iJiYoa2U9aFtELWJdKSxFdD1uW0QqMl0sZS5vcHRfbGVuKz1FdCood2Ura2UpLHUmJihlLnN0YXRpY19sZW4rPUV0KihhW0QqMisxXStrZSkpKTtpZihrdCE9PTApe2Rve2Zvcih3ZT1VLTE7ZS5ibF9jb3VudFt3ZV09PT0wOyl3ZS0tO2UuYmxfY291bnRbd2VdLS0sZS5ibF9jb3VudFt3ZSsxXSs9MixlLmJsX2NvdW50W1VdLS0sa3QtPTJ9d2hpbGUoa3Q+MCk7Zm9yKHdlPVU7d2UhPT0wO3dlLS0pZm9yKEQ9ZS5ibF9jb3VudFt3ZV07RCE9PTA7KWdlPWUuaGVhcFstLU9dLCEoZ2U+cikmJihuW2dlKjIrMV0hPT13ZSYmKGUub3B0X2xlbis9KHdlLW5bZ2UqMisxXSkqbltnZSoyXSxuW2dlKjIrMV09d2UpLEQtLSl9fWZ1bmN0aW9uIGRzKGUsdCxuKXt2YXIgcj1uZXcgQXJyYXkodWErMSksYT0wLHUsaDtmb3IodT0xO3U8PXVhO3UrKylyW3VdPWE9YStuW3UtMV08PDE7Zm9yKGg9MDtoPD10O2grKyl7dmFyIGI9ZVtoKjIrMV07YiE9PTAmJihlW2gqMl09QnMocltiXSsrLGIpKX19ZnVuY3Rpb24gZ2woKXt2YXIgZSx0LG4scixhLHU9bmV3IEFycmF5KHVhKzEpO2ZvcihuPTAscj0wO3I8SXMtMTtyKyspZm9yKGxzW3JdPW4sZT0wO2U8MTw8JGFbcl07ZSsrKVBhW24rK109cjtmb3IoUGFbbi0xXT1yLGE9MCxyPTA7cjwxNjtyKyspZm9yKHphW3JdPWEsZT0wO2U8MTw8ZmFbcl07ZSsrKWphW2ErK109cjtmb3IoYT4+PTc7cjxLbztyKyspZm9yKHphW3JdPWE8PDcsZT0wO2U8MTw8ZmFbcl0tNztlKyspamFbMjU2K2ErK109cjtmb3IodD0wO3Q8PXVhO3QrKyl1W3RdPTA7Zm9yKGU9MDtlPD0xNDM7KXdvW2UqMisxXT04LGUrKyx1WzhdKys7Zm9yKDtlPD0yNTU7KXdvW2UqMisxXT05LGUrKyx1WzldKys7Zm9yKDtlPD0yNzk7KXdvW2UqMisxXT03LGUrKyx1WzddKys7Zm9yKDtlPD0yODc7KXdvW2UqMisxXT04LGUrKyx1WzhdKys7Zm9yKGRzKHdvLFZhKzEsdSksZT0wO2U8S287ZSsrKUhhW2UqMisxXT01LEhhW2UqMl09QnMoZSw1KTtScz1uZXcgY3Mod28sJGEsRmErMSxWYSx1YSksdXM9bmV3IGNzKEhhLGZhLDAsS28sdWEpLHhzPW5ldyBjcyhuZXcgQXJyYXkoMCksZGwsMCxvcyxOcyl9ZnVuY3Rpb24gcGwoZSl7dmFyIHQ7Zm9yKHQ9MDt0PFZhO3QrKyllLmR5bl9sdHJlZVt0KjJdPTA7Zm9yKHQ9MDt0PEtvO3QrKyllLmR5bl9kdHJlZVt0KjJdPTA7Zm9yKHQ9MDt0PG9zO3QrKyllLmJsX3RyZWVbdCoyXT0wO2UuZHluX2x0cmVlW3NzKjJdPTEsZS5vcHRfbGVuPWUuc3RhdGljX2xlbj0wLGUubGFzdF9saXQ9ZS5tYXRjaGVzPTB9ZnVuY3Rpb24gVm8oZSl7ZS5iaV92YWxpZD44P1dhKGUsZS5iaV9idWYpOmUuYmlfdmFsaWQ+MCYmKGUucGVuZGluZ19idWZbZS5wZW5kaW5nKytdPWUuYmlfYnVmKSxlLmJpX2J1Zj0wLGUuYmlfdmFsaWQ9MH1mdW5jdGlvbiB2bChlLHQsbixyKXtWbyhlKSxyJiYoV2EoZSxuKSxXYShlLH5uKSksU3QuYXJyYXlTZXQoZS5wZW5kaW5nX2J1ZixlLndpbmRvdyx0LG4sZS5wZW5kaW5nKSxlLnBlbmRpbmcrPW59ZnVuY3Rpb24gTXMoZSx0LG4scil7dmFyIGE9dCoyLHU9bioyO3JldHVybiBlW2FdPGVbdV18fGVbYV09PT1lW3VdJiZyW3RdPD1yW25dfWZ1bmN0aW9uIExzKGUsdCxuKXtmb3IodmFyIHI9ZS5oZWFwW25dLGE9bjw8MTthPD1lLmhlYXBfbGVuJiYoYTxlLmhlYXBfbGVuJiZNcyh0LGUuaGVhcFthKzFdLGUuaGVhcFthXSxlLmRlcHRoKSYmYSsrLCFNcyh0LHIsZS5oZWFwW2FdLGUuZGVwdGgpKTspZS5oZWFwW25dPWUuaGVhcFthXSxuPWEsYTw8PTE7ZS5oZWFwW25dPXJ9ZnVuY3Rpb24gaHMoZSx0LG4pe3ZhciByLGEsdT0wLGgsYjtpZihlLmxhc3RfbGl0IT09MClkbyByPWUucGVuZGluZ19idWZbZS5kX2J1Zit1KjJdPDw4fGUucGVuZGluZ19idWZbZS5kX2J1Zit1KjIrMV0sYT1lLnBlbmRpbmdfYnVmW2UubF9idWYrdV0sdSsrLHI9PT0wP0tpKGUsYSx0KTooaD1QYVthXSxLaShlLGgrRmErMSx0KSxiPSRhW2hdLGIhPT0wJiYoYS09bHNbaF0sX2koZSxhLGIpKSxyLS0saD1obChyKSxLaShlLGgsbiksYj1mYVtoXSxiIT09MCYmKHItPXphW2hdLF9pKGUscixiKSkpO3doaWxlKHU8ZS5sYXN0X2xpdCk7S2koZSxzcyx0KX1mdW5jdGlvbiBmbyhlLHQpe3ZhciBuPXQuZHluX3RyZWUscj10LnN0YXRfZGVzYy5zdGF0aWNfdHJlZSxhPXQuc3RhdF9kZXNjLmhhc19zdHJlZSx1PXQuc3RhdF9kZXNjLmVsZW1zLGgsYixVPS0xLE87Zm9yKGUuaGVhcF9sZW49MCxlLmhlYXBfbWF4PWNsLGg9MDtoPHU7aCsrKW5baCoyXSE9PTA/KGUuaGVhcFsrK2UuaGVhcF9sZW5dPVU9aCxlLmRlcHRoW2hdPTApOm5baCoyKzFdPTA7Zm9yKDtlLmhlYXBfbGVuPDI7KU89ZS5oZWFwWysrZS5oZWFwX2xlbl09VTwyPysrVTowLG5bTyoyXT0xLGUuZGVwdGhbT109MCxlLm9wdF9sZW4tLSxhJiYoZS5zdGF0aWNfbGVuLT1yW08qMisxXSk7Zm9yKHQubWF4X2NvZGU9VSxoPWUuaGVhcF9sZW4+PjE7aD49MTtoLS0pTHMoZSxuLGgpO089dTtkbyBoPWUuaGVhcFsxXSxlLmhlYXBbMV09ZS5oZWFwW2UuaGVhcF9sZW4tLV0sTHMoZSxuLDEpLGI9ZS5oZWFwWzFdLGUuaGVhcFstLWUuaGVhcF9tYXhdPWgsZS5oZWFwWy0tZS5oZWFwX21heF09YixuW08qMl09bltoKjJdK25bYioyXSxlLmRlcHRoW09dPShlLmRlcHRoW2hdPj1lLmRlcHRoW2JdP2UuZGVwdGhbaF06ZS5kZXB0aFtiXSkrMSxuW2gqMisxXT1uW2IqMisxXT1PLGUuaGVhcFsxXT1PKyssTHMoZSxuLDEpO3doaWxlKGUuaGVhcF9sZW4+PTIpO2UuaGVhcFstLWUuaGVhcF9tYXhdPWUuaGVhcFsxXSxHYShlLHQpLGRzKG4sVSxlLmJsX2NvdW50KX1mdW5jdGlvbiBabyhlLHQsbil7dmFyIHIsYT0tMSx1LGg9dFswKjIrMV0sYj0wLFU9NyxPPTQ7Zm9yKGg9PT0wJiYoVT0xMzgsTz0zKSx0WyhuKzEpKjIrMV09NjU1MzUscj0wO3I8PW47cisrKXU9aCxoPXRbKHIrMSkqMisxXSwhKCsrYjxVJiZ1PT09aCkmJihiPE8/ZS5ibF90cmVlW3UqMl0rPWI6dSE9PTA/KHUhPT1hJiZlLmJsX3RyZWVbdSoyXSsrLGUuYmxfdHJlZVt1bCoyXSsrKTpiPD0xMD9lLmJsX3RyZWVbZmwqMl0rKzplLmJsX3RyZWVbVGEqMl0rKyxiPTAsYT11LGg9PT0wPyhVPTEzOCxPPTMpOnU9PT1oPyhVPTYsTz0zKTooVT03LE89NCkpfWZ1bmN0aW9uIERzKGUsdCxuKXt2YXIgcixhPS0xLHUsaD10WzAqMisxXSxiPTAsVT03LE89NDtmb3IoaD09PTAmJihVPTEzOCxPPTMpLHI9MDtyPD1uO3IrKylpZih1PWgsaD10WyhyKzEpKjIrMV0sISgrK2I8VSYmdT09PWgpKXtpZihiPE8pZG8gS2koZSx1LGUuYmxfdHJlZSk7d2hpbGUoLS1iIT09MCk7ZWxzZSB1IT09MD8odSE9PWEmJihLaShlLHUsZS5ibF90cmVlKSxiLS0pLEtpKGUsdWwsZS5ibF90cmVlKSxfaShlLGItMywyKSk6Yjw9MTA/KEtpKGUsZmwsZS5ibF90cmVlKSxfaShlLGItMywzKSk6KEtpKGUsVGEsZS5ibF90cmVlKSxfaShlLGItMTEsNykpO2I9MCxhPXUsaD09PTA/KFU9MTM4LE89Myk6dT09PWg/KFU9NixPPTMpOihVPTcsTz00KX19ZnVuY3Rpb24gR2woZSl7dmFyIHQ7Zm9yKFpvKGUsZS5keW5fbHRyZWUsZS5sX2Rlc2MubWF4X2NvZGUpLFpvKGUsZS5keW5fZHRyZWUsZS5kX2Rlc2MubWF4X2NvZGUpLGZvKGUsZS5ibF9kZXNjKSx0PW9zLTE7dD49MyYmZS5ibF90cmVlW1VhW3RdKjIrMV09PT0wO3QtLSk7cmV0dXJuIGUub3B0X2xlbis9MyoodCsxKSs1KzUrNCx0fWZ1bmN0aW9uIG1sKGUsdCxuLHIpe3ZhciBhO2ZvcihfaShlLHQtMjU3LDUpLF9pKGUsbi0xLDUpLF9pKGUsci00LDQpLGE9MDthPHI7YSsrKV9pKGUsZS5ibF90cmVlW1VhW2FdKjIrMV0sMyk7RHMoZSxlLmR5bl9sdHJlZSx0LTEpLERzKGUsZS5keW5fZHRyZWUsbi0xKX1mdW5jdGlvbiBncyhlKXt2YXIgdD00MDkzNjI0NDQ3LG47Zm9yKG49MDtuPD0zMTtuKyssdD4+Pj0xKWlmKHQmMSYmZS5keW5fbHRyZWVbbioyXSE9PTApcmV0dXJuIEZvO2lmKGUuZHluX2x0cmVlWzkqMl0hPT0wfHxlLmR5bl9sdHJlZVsxMCoyXSE9PTB8fGUuZHluX2x0cmVlWzEzKjJdIT09MClyZXR1cm4gY2E7Zm9yKG49MzI7bjxGYTtuKyspaWYoZS5keW5fbHRyZWVbbioyXSE9PTApcmV0dXJuIGNhO3JldHVybiBGb312YXIgRnM9ITE7ZnVuY3Rpb24gX2woZSl7RnN8fChnbCgpLEZzPSEwKSxlLmxfZGVzYz1uZXcgZnMoZS5keW5fbHRyZWUsUnMpLGUuZF9kZXNjPW5ldyBmcyhlLmR5bl9kdHJlZSx1cyksZS5ibF9kZXNjPW5ldyBmcyhlLmJsX3RyZWUseHMpLGUuYmlfYnVmPTAsZS5iaV92YWxpZD0wLHBsKGUpfWZ1bmN0aW9uIFZzKGUsdCxuLHIpe19pKGUsKHpsPDwxKSsocj8xOjApLDMpLHZsKGUsdCxuLCEwKX1mdW5jdGlvbiBibChlKXtfaShlLGFsPDwxLDMpLEtpKGUsc3Msd28pLEpvKGUpfWZ1bmN0aW9uIEVsKGUsdCxuLHIpe3ZhciBhLHUsaD0wO2UubGV2ZWw+MD8oZS5zdHJtLmRhdGFfdHlwZT09PVBzJiYoZS5zdHJtLmRhdGFfdHlwZT1ncyhlKSksZm8oZSxlLmxfZGVzYyksZm8oZSxlLmRfZGVzYyksaD1HbChlKSxhPWUub3B0X2xlbiszKzc+Pj4zLHU9ZS5zdGF0aWNfbGVuKzMrNz4+PjMsdTw9YSYmKGE9dSkpOmE9dT1uKzUsbis0PD1hJiZ0IT09LTE/VnMoZSx0LG4scik6ZS5zdHJhdGVneT09PXlvfHx1PT09YT8oX2koZSwoYWw8PDEpKyhyPzE6MCksMyksaHMoZSx3byxIYSkpOihfaShlLChXbDw8MSkrKHI/MTowKSwzKSxtbChlLGUubF9kZXNjLm1heF9jb2RlKzEsZS5kX2Rlc2MubWF4X2NvZGUrMSxoKzEpLGhzKGUsZS5keW5fbHRyZWUsZS5keW5fZHRyZWUpKSxwbChlKSxyJiZWbyhlKX1mdW5jdGlvbiB5bChlLHQsbil7cmV0dXJuIGUucGVuZGluZ19idWZbZS5kX2J1ZitlLmxhc3RfbGl0KjJdPXQ+Pj44JjI1NSxlLnBlbmRpbmdfYnVmW2UuZF9idWYrZS5sYXN0X2xpdCoyKzFdPXQmMjU1LGUucGVuZGluZ19idWZbZS5sX2J1ZitlLmxhc3RfbGl0XT1uJjI1NSxlLmxhc3RfbGl0KyssdD09PTA/ZS5keW5fbHRyZWVbbioyXSsrOihlLm1hdGNoZXMrKyx0LS0sZS5keW5fbHRyZWVbKFBhW25dK0ZhKzEpKjJdKyssZS5keW5fZHRyZWVbaGwodCkqMl0rKyksZS5sYXN0X2xpdD09PWUubGl0X2J1ZnNpemUtMX12YXIgd2w9X2wsWWw9VnMscWw9RWwsbz15bCxjPWJsLHY9e190cl9pbml0OndsLF90cl9zdG9yZWRfYmxvY2s6WWwsX3RyX2ZsdXNoX2Jsb2NrOnFsLF90cl90YWxseTpvLF90cl9hbGlnbjpjfTtmdW5jdGlvbiBFKGUsdCxuLHIpe2Zvcih2YXIgYT1lJjY1NTM1fDAsdT1lPj4+MTYmNjU1MzV8MCxoPTA7biE9PTA7KXtoPW4+MmUzPzJlMzpuLG4tPWg7ZG8gYT1hK3RbcisrXXwwLHU9dSthfDA7d2hpbGUoLS1oKTthJT02NTUyMSx1JT02NTUyMX1yZXR1cm4gYXx1PDwxNnwwfXZhciBQPUU7ZnVuY3Rpb24gQygpe2Zvcih2YXIgZSx0PVtdLG49MDtuPDI1NjtuKyspe2U9bjtmb3IodmFyIHI9MDtyPDg7cisrKWU9ZSYxPzM5ODgyOTIzODReZT4+PjE6ZT4+PjE7dFtuXT1lfXJldHVybiB0fXZhciBWPUMoKTtmdW5jdGlvbiBHKGUsdCxuLHIpe3ZhciBhPVYsdT1yK247ZV49LTE7Zm9yKHZhciBoPXI7aDx1O2grKyllPWU+Pj44XmFbKGVedFtoXSkmMjU1XTtyZXR1cm4gZV4tMX12YXIgcT1HLGFlPXsyOiJuZWVkIGRpY3Rpb25hcnkiLDE6InN0cmVhbSBlbmQiLDA6IiIsIi0xIjoiZmlsZSBlcnJvciIsIi0yIjoic3RyZWFtIGVycm9yIiwiLTMiOiJkYXRhIGVycm9yIiwiLTQiOiJpbnN1ZmZpY2llbnQgbWVtb3J5IiwiLTUiOiJidWZmZXIgZXJyb3IiLCItNiI6ImluY29tcGF0aWJsZSB2ZXJzaW9uIn0sTGU9dixYZT1QLHNlPXEsJGU9YWUsV2U9MCxfdD0xLFB0PTMsX2U9NCxmZT01LFRlPTAsaT0xLHM9LTIsZD0tMyxwPS01LHk9LTEsdz0xLEk9MixMPTMsJD00LGVlPTAsaWU9MixJZT04LG9lPTksQ2U9MTUsQmU9OCxmdD0yOSxBdD0yNTYsbWU9QXQrMStmdCxsZT0zMCxTZT0xOSxxZT0yKm1lKzEsSGU9MTUsUmU9MyxsdD0yNTgseGU9bHQrUmUrMSxJdD0zMixDdD00MixCdD02OSxKdD03MyxkdD05MSxGPTEwMyxLPTExMyxoZT02NjYscGU9MSxQZT0yLEtlPTMsY3Q9NCxRZT0zO2Z1bmN0aW9uIEplKGUsdCl7cmV0dXJuIGUubXNnPSRlW3RdLHR9ZnVuY3Rpb24gRGUoZSl7cmV0dXJuKGU8PDEpLShlPjQ/OTowKX1mdW5jdGlvbiB5dChlKXtmb3IodmFyIHQ9ZS5sZW5ndGg7LS10Pj0wOyllW3RdPTB9ZnVuY3Rpb24gd3QoZSl7dmFyIHQ9ZS5zdGF0ZSxuPXQucGVuZGluZztuPmUuYXZhaWxfb3V0JiYobj1lLmF2YWlsX291dCksbiE9PTAmJihTdC5hcnJheVNldChlLm91dHB1dCx0LnBlbmRpbmdfYnVmLHQucGVuZGluZ19vdXQsbixlLm5leHRfb3V0KSxlLm5leHRfb3V0Kz1uLHQucGVuZGluZ19vdXQrPW4sZS50b3RhbF9vdXQrPW4sZS5hdmFpbF9vdXQtPW4sdC5wZW5kaW5nLT1uLHQucGVuZGluZz09PTAmJih0LnBlbmRpbmdfb3V0PTApKX1mdW5jdGlvbiBhdChlLHQpe0xlLl90cl9mbHVzaF9ibG9jayhlLGUuYmxvY2tfc3RhcnQ+PTA/ZS5ibG9ja19zdGFydDotMSxlLnN0cnN0YXJ0LWUuYmxvY2tfc3RhcnQsdCksZS5ibG9ja19zdGFydD1lLnN0cnN0YXJ0LHd0KGUuc3RybSl9ZnVuY3Rpb24gb3QoZSx0KXtlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT10fWZ1bmN0aW9uIGRuKGUsdCl7ZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK109dD4+PjgmMjU1LGUucGVuZGluZ19idWZbZS5wZW5kaW5nKytdPXQmMjU1fWZ1bmN0aW9uIGJuKGUsdCxuLHIpe3ZhciBhPWUuYXZhaWxfaW47cmV0dXJuIGE+ciYmKGE9ciksYT09PTA/MDooZS5hdmFpbF9pbi09YSxTdC5hcnJheVNldCh0LGUuaW5wdXQsZS5uZXh0X2luLGEsbiksZS5zdGF0ZS53cmFwPT09MT9lLmFkbGVyPVhlKGUuYWRsZXIsdCxhLG4pOmUuc3RhdGUud3JhcD09PTImJihlLmFkbGVyPXNlKGUuYWRsZXIsdCxhLG4pKSxlLm5leHRfaW4rPWEsZS50b3RhbF9pbis9YSxhKX1mdW5jdGlvbiB0cihlLHQpe3ZhciBuPWUubWF4X2NoYWluX2xlbmd0aCxyPWUuc3Ryc3RhcnQsYSx1LGg9ZS5wcmV2X2xlbmd0aCxiPWUubmljZV9tYXRjaCxVPWUuc3Ryc3RhcnQ+ZS53X3NpemUteGU/ZS5zdHJzdGFydC0oZS53X3NpemUteGUpOjAsTz1lLndpbmRvdyxEPWUud19tYXNrLGdlPWUucHJldix3ZT1lLnN0cnN0YXJ0K2x0LGtlPU9bcitoLTFdLEV0PU9bcitoXTtlLnByZXZfbGVuZ3RoPj1lLmdvb2RfbWF0Y2gmJihuPj49MiksYj5lLmxvb2thaGVhZCYmKGI9ZS5sb29rYWhlYWQpO2RvIGlmKGE9dCwhKE9bYStoXSE9PUV0fHxPW2EraC0xXSE9PWtlfHxPW2FdIT09T1tyXXx8T1srK2FdIT09T1tyKzFdKSl7cis9MixhKys7ZG87d2hpbGUoT1srK3JdPT09T1srK2FdJiZPWysrcl09PT1PWysrYV0mJk9bKytyXT09PU9bKythXSYmT1srK3JdPT09T1srK2FdJiZPWysrcl09PT1PWysrYV0mJk9bKytyXT09PU9bKythXSYmT1srK3JdPT09T1srK2FdJiZPWysrcl09PT1PWysrYV0mJnI8d2UpO2lmKHU9bHQtKHdlLXIpLHI9d2UtbHQsdT5oKXtpZihlLm1hdGNoX3N0YXJ0PXQsaD11LHU+PWIpYnJlYWs7a2U9T1tyK2gtMV0sRXQ9T1tyK2hdfX13aGlsZSgodD1nZVt0JkRdKT5VJiYtLW4hPT0wKTtyZXR1cm4gaDw9ZS5sb29rYWhlYWQ/aDplLmxvb2thaGVhZH1mdW5jdGlvbiBQbihlKXt2YXIgdD1lLndfc2l6ZSxuLHIsYSx1LGg7ZG97aWYodT1lLndpbmRvd19zaXplLWUubG9va2FoZWFkLWUuc3Ryc3RhcnQsZS5zdHJzdGFydD49dCsodC14ZSkpe1N0LmFycmF5U2V0KGUud2luZG93LGUud2luZG93LHQsdCwwKSxlLm1hdGNoX3N0YXJ0LT10LGUuc3Ryc3RhcnQtPXQsZS5ibG9ja19zdGFydC09dCxyPWUuaGFzaF9zaXplLG49cjtkbyBhPWUuaGVhZFstLW5dLGUuaGVhZFtuXT1hPj10P2EtdDowO3doaWxlKC0tcik7cj10LG49cjtkbyBhPWUucHJldlstLW5dLGUucHJldltuXT1hPj10P2EtdDowO3doaWxlKC0tcik7dSs9dH1pZihlLnN0cm0uYXZhaWxfaW49PT0wKWJyZWFrO2lmKHI9Ym4oZS5zdHJtLGUud2luZG93LGUuc3Ryc3RhcnQrZS5sb29rYWhlYWQsdSksZS5sb29rYWhlYWQrPXIsZS5sb29rYWhlYWQrZS5pbnNlcnQ+PVJlKWZvcihoPWUuc3Ryc3RhcnQtZS5pbnNlcnQsZS5pbnNfaD1lLndpbmRvd1toXSxlLmluc19oPShlLmluc19oPDxlLmhhc2hfc2hpZnReZS53aW5kb3dbaCsxXSkmZS5oYXNoX21hc2s7ZS5pbnNlcnQmJihlLmluc19oPShlLmluc19oPDxlLmhhc2hfc2hpZnReZS53aW5kb3dbaCtSZS0xXSkmZS5oYXNoX21hc2ssZS5wcmV2W2gmZS53X21hc2tdPWUuaGVhZFtlLmluc19oXSxlLmhlYWRbZS5pbnNfaF09aCxoKyssZS5pbnNlcnQtLSwhKGUubG9va2FoZWFkK2UuaW5zZXJ0PFJlKSk7KTt9d2hpbGUoZS5sb29rYWhlYWQ8eGUmJmUuc3RybS5hdmFpbF9pbiE9PTApfWZ1bmN0aW9uICRvKGUsdCl7dmFyIG49NjU1MzU7Zm9yKG4+ZS5wZW5kaW5nX2J1Zl9zaXplLTUmJihuPWUucGVuZGluZ19idWZfc2l6ZS01KTs7KXtpZihlLmxvb2thaGVhZDw9MSl7aWYoUG4oZSksZS5sb29rYWhlYWQ9PT0wJiZ0PT09V2UpcmV0dXJuIHBlO2lmKGUubG9va2FoZWFkPT09MClicmVha31lLnN0cnN0YXJ0Kz1lLmxvb2thaGVhZCxlLmxvb2thaGVhZD0wO3ZhciByPWUuYmxvY2tfc3RhcnQrbjtpZigoZS5zdHJzdGFydD09PTB8fGUuc3Ryc3RhcnQ+PXIpJiYoZS5sb29rYWhlYWQ9ZS5zdHJzdGFydC1yLGUuc3Ryc3RhcnQ9cixhdChlLCExKSxlLnN0cm0uYXZhaWxfb3V0PT09MCl8fGUuc3Ryc3RhcnQtZS5ibG9ja19zdGFydD49ZS53X3NpemUteGUmJihhdChlLCExKSxlLnN0cm0uYXZhaWxfb3V0PT09MCkpcmV0dXJuIHBlfXJldHVybiBlLmluc2VydD0wLHQ9PT1fZT8oYXQoZSwhMCksZS5zdHJtLmF2YWlsX291dD09PTA/S2U6Y3QpOihlLnN0cnN0YXJ0PmUuYmxvY2tfc3RhcnQmJihhdChlLCExKSxlLnN0cm0uYXZhaWxfb3V0PT09MCkscGUpfWZ1bmN0aW9uIFNvKGUsdCl7Zm9yKHZhciBuLHI7Oyl7aWYoZS5sb29rYWhlYWQ8eGUpe2lmKFBuKGUpLGUubG9va2FoZWFkPHhlJiZ0PT09V2UpcmV0dXJuIHBlO2lmKGUubG9va2FoZWFkPT09MClicmVha31pZihuPTAsZS5sb29rYWhlYWQ+PVJlJiYoZS5pbnNfaD0oZS5pbnNfaDw8ZS5oYXNoX3NoaWZ0XmUud2luZG93W2Uuc3Ryc3RhcnQrUmUtMV0pJmUuaGFzaF9tYXNrLG49ZS5wcmV2W2Uuc3Ryc3RhcnQmZS53X21hc2tdPWUuaGVhZFtlLmluc19oXSxlLmhlYWRbZS5pbnNfaF09ZS5zdHJzdGFydCksbiE9PTAmJmUuc3Ryc3RhcnQtbjw9ZS53X3NpemUteGUmJihlLm1hdGNoX2xlbmd0aD10cihlLG4pKSxlLm1hdGNoX2xlbmd0aD49UmUpaWYocj1MZS5fdHJfdGFsbHkoZSxlLnN0cnN0YXJ0LWUubWF0Y2hfc3RhcnQsZS5tYXRjaF9sZW5ndGgtUmUpLGUubG9va2FoZWFkLT1lLm1hdGNoX2xlbmd0aCxlLm1hdGNoX2xlbmd0aDw9ZS5tYXhfbGF6eV9tYXRjaCYmZS5sb29rYWhlYWQ+PVJlKXtlLm1hdGNoX2xlbmd0aC0tO2RvIGUuc3Ryc3RhcnQrKyxlLmluc19oPShlLmluc19oPDxlLmhhc2hfc2hpZnReZS53aW5kb3dbZS5zdHJzdGFydCtSZS0xXSkmZS5oYXNoX21hc2ssbj1lLnByZXZbZS5zdHJzdGFydCZlLndfbWFza109ZS5oZWFkW2UuaW5zX2hdLGUuaGVhZFtlLmluc19oXT1lLnN0cnN0YXJ0O3doaWxlKC0tZS5tYXRjaF9sZW5ndGghPT0wKTtlLnN0cnN0YXJ0Kyt9ZWxzZSBlLnN0cnN0YXJ0Kz1lLm1hdGNoX2xlbmd0aCxlLm1hdGNoX2xlbmd0aD0wLGUuaW5zX2g9ZS53aW5kb3dbZS5zdHJzdGFydF0sZS5pbnNfaD0oZS5pbnNfaDw8ZS5oYXNoX3NoaWZ0XmUud2luZG93W2Uuc3Ryc3RhcnQrMV0pJmUuaGFzaF9tYXNrO2Vsc2Ugcj1MZS5fdHJfdGFsbHkoZSwwLGUud2luZG93W2Uuc3Ryc3RhcnRdKSxlLmxvb2thaGVhZC0tLGUuc3Ryc3RhcnQrKztpZihyJiYoYXQoZSwhMSksZS5zdHJtLmF2YWlsX291dD09PTApKXJldHVybiBwZX1yZXR1cm4gZS5pbnNlcnQ9ZS5zdHJzdGFydDxSZS0xP2Uuc3Ryc3RhcnQ6UmUtMSx0PT09X2U/KGF0KGUsITApLGUuc3RybS5hdmFpbF9vdXQ9PT0wP0tlOmN0KTplLmxhc3RfbGl0JiYoYXQoZSwhMSksZS5zdHJtLmF2YWlsX291dD09PTApP3BlOlBlfWZ1bmN0aW9uIFcoZSx0KXtmb3IodmFyIG4scixhOzspe2lmKGUubG9va2FoZWFkPHhlKXtpZihQbihlKSxlLmxvb2thaGVhZDx4ZSYmdD09PVdlKXJldHVybiBwZTtpZihlLmxvb2thaGVhZD09PTApYnJlYWt9aWYobj0wLGUubG9va2FoZWFkPj1SZSYmKGUuaW5zX2g9KGUuaW5zX2g8PGUuaGFzaF9zaGlmdF5lLndpbmRvd1tlLnN0cnN0YXJ0K1JlLTFdKSZlLmhhc2hfbWFzayxuPWUucHJldltlLnN0cnN0YXJ0JmUud19tYXNrXT1lLmhlYWRbZS5pbnNfaF0sZS5oZWFkW2UuaW5zX2hdPWUuc3Ryc3RhcnQpLGUucHJldl9sZW5ndGg9ZS5tYXRjaF9sZW5ndGgsZS5wcmV2X21hdGNoPWUubWF0Y2hfc3RhcnQsZS5tYXRjaF9sZW5ndGg9UmUtMSxuIT09MCYmZS5wcmV2X2xlbmd0aDxlLm1heF9sYXp5X21hdGNoJiZlLnN0cnN0YXJ0LW48PWUud19zaXplLXhlJiYoZS5tYXRjaF9sZW5ndGg9dHIoZSxuKSxlLm1hdGNoX2xlbmd0aDw9NSYmKGUuc3RyYXRlZ3k9PT13fHxlLm1hdGNoX2xlbmd0aD09PVJlJiZlLnN0cnN0YXJ0LWUubWF0Y2hfc3RhcnQ+NDA5NikmJihlLm1hdGNoX2xlbmd0aD1SZS0xKSksZS5wcmV2X2xlbmd0aD49UmUmJmUubWF0Y2hfbGVuZ3RoPD1lLnByZXZfbGVuZ3RoKXthPWUuc3Ryc3RhcnQrZS5sb29rYWhlYWQtUmUscj1MZS5fdHJfdGFsbHkoZSxlLnN0cnN0YXJ0LTEtZS5wcmV2X21hdGNoLGUucHJldl9sZW5ndGgtUmUpLGUubG9va2FoZWFkLT1lLnByZXZfbGVuZ3RoLTEsZS5wcmV2X2xlbmd0aC09MjtkbysrZS5zdHJzdGFydDw9YSYmKGUuaW5zX2g9KGUuaW5zX2g8PGUuaGFzaF9zaGlmdF5lLndpbmRvd1tlLnN0cnN0YXJ0K1JlLTFdKSZlLmhhc2hfbWFzayxuPWUucHJldltlLnN0cnN0YXJ0JmUud19tYXNrXT1lLmhlYWRbZS5pbnNfaF0sZS5oZWFkW2UuaW5zX2hdPWUuc3Ryc3RhcnQpO3doaWxlKC0tZS5wcmV2X2xlbmd0aCE9PTApO2lmKGUubWF0Y2hfYXZhaWxhYmxlPTAsZS5tYXRjaF9sZW5ndGg9UmUtMSxlLnN0cnN0YXJ0KyssciYmKGF0KGUsITEpLGUuc3RybS5hdmFpbF9vdXQ9PT0wKSlyZXR1cm4gcGV9ZWxzZSBpZihlLm1hdGNoX2F2YWlsYWJsZSl7aWYocj1MZS5fdHJfdGFsbHkoZSwwLGUud2luZG93W2Uuc3Ryc3RhcnQtMV0pLHImJmF0KGUsITEpLGUuc3Ryc3RhcnQrKyxlLmxvb2thaGVhZC0tLGUuc3RybS5hdmFpbF9vdXQ9PT0wKXJldHVybiBwZX1lbHNlIGUubWF0Y2hfYXZhaWxhYmxlPTEsZS5zdHJzdGFydCsrLGUubG9va2FoZWFkLS19cmV0dXJuIGUubWF0Y2hfYXZhaWxhYmxlJiYocj1MZS5fdHJfdGFsbHkoZSwwLGUud2luZG93W2Uuc3Ryc3RhcnQtMV0pLGUubWF0Y2hfYXZhaWxhYmxlPTApLGUuaW5zZXJ0PWUuc3Ryc3RhcnQ8UmUtMT9lLnN0cnN0YXJ0OlJlLTEsdD09PV9lPyhhdChlLCEwKSxlLnN0cm0uYXZhaWxfb3V0PT09MD9LZTpjdCk6ZS5sYXN0X2xpdCYmKGF0KGUsITEpLGUuc3RybS5hdmFpbF9vdXQ9PT0wKT9wZTpQZX1mdW5jdGlvbiByZShlLHQpe2Zvcih2YXIgbixyLGEsdSxoPWUud2luZG93Ozspe2lmKGUubG9va2FoZWFkPD1sdCl7aWYoUG4oZSksZS5sb29rYWhlYWQ8PWx0JiZ0PT09V2UpcmV0dXJuIHBlO2lmKGUubG9va2FoZWFkPT09MClicmVha31pZihlLm1hdGNoX2xlbmd0aD0wLGUubG9va2FoZWFkPj1SZSYmZS5zdHJzdGFydD4wJiYoYT1lLnN0cnN0YXJ0LTEscj1oW2FdLHI9PT1oWysrYV0mJnI9PT1oWysrYV0mJnI9PT1oWysrYV0pKXt1PWUuc3Ryc3RhcnQrbHQ7ZG87d2hpbGUocj09PWhbKythXSYmcj09PWhbKythXSYmcj09PWhbKythXSYmcj09PWhbKythXSYmcj09PWhbKythXSYmcj09PWhbKythXSYmcj09PWhbKythXSYmcj09PWhbKythXSYmYTx1KTtlLm1hdGNoX2xlbmd0aD1sdC0odS1hKSxlLm1hdGNoX2xlbmd0aD5lLmxvb2thaGVhZCYmKGUubWF0Y2hfbGVuZ3RoPWUubG9va2FoZWFkKX1pZihlLm1hdGNoX2xlbmd0aD49UmU/KG49TGUuX3RyX3RhbGx5KGUsMSxlLm1hdGNoX2xlbmd0aC1SZSksZS5sb29rYWhlYWQtPWUubWF0Y2hfbGVuZ3RoLGUuc3Ryc3RhcnQrPWUubWF0Y2hfbGVuZ3RoLGUubWF0Y2hfbGVuZ3RoPTApOihuPUxlLl90cl90YWxseShlLDAsZS53aW5kb3dbZS5zdHJzdGFydF0pLGUubG9va2FoZWFkLS0sZS5zdHJzdGFydCsrKSxuJiYoYXQoZSwhMSksZS5zdHJtLmF2YWlsX291dD09PTApKXJldHVybiBwZX1yZXR1cm4gZS5pbnNlcnQ9MCx0PT09X2U/KGF0KGUsITApLGUuc3RybS5hdmFpbF9vdXQ9PT0wP0tlOmN0KTplLmxhc3RfbGl0JiYoYXQoZSwhMSksZS5zdHJtLmF2YWlsX291dD09PTApP3BlOlBlfWZ1bmN0aW9uIEVlKGUsdCl7Zm9yKHZhciBuOzspe2lmKGUubG9va2FoZWFkPT09MCYmKFBuKGUpLGUubG9va2FoZWFkPT09MCkpe2lmKHQ9PT1XZSlyZXR1cm4gcGU7YnJlYWt9aWYoZS5tYXRjaF9sZW5ndGg9MCxuPUxlLl90cl90YWxseShlLDAsZS53aW5kb3dbZS5zdHJzdGFydF0pLGUubG9va2FoZWFkLS0sZS5zdHJzdGFydCsrLG4mJihhdChlLCExKSxlLnN0cm0uYXZhaWxfb3V0PT09MCkpcmV0dXJuIHBlfXJldHVybiBlLmluc2VydD0wLHQ9PT1fZT8oYXQoZSwhMCksZS5zdHJtLmF2YWlsX291dD09PTA/S2U6Y3QpOmUubGFzdF9saXQmJihhdChlLCExKSxlLnN0cm0uYXZhaWxfb3V0PT09MCk/cGU6UGV9ZnVuY3Rpb24gQWUoZSx0LG4scixhKXt0aGlzLmdvb2RfbGVuZ3RoPWUsdGhpcy5tYXhfbGF6eT10LHRoaXMubmljZV9sZW5ndGg9bix0aGlzLm1heF9jaGFpbj1yLHRoaXMuZnVuYz1hfXZhciBNZTtNZT1bbmV3IEFlKDAsMCwwLDAsJG8pLG5ldyBBZSg0LDQsOCw0LFNvKSxuZXcgQWUoNCw1LDE2LDgsU28pLG5ldyBBZSg0LDYsMzIsMzIsU28pLG5ldyBBZSg0LDQsMTYsMTYsVyksbmV3IEFlKDgsMTYsMzIsMzIsVyksbmV3IEFlKDgsMTYsMTI4LDEyOCxXKSxuZXcgQWUoOCwzMiwxMjgsMjU2LFcpLG5ldyBBZSgzMiwxMjgsMjU4LDEwMjQsVyksbmV3IEFlKDMyLDI1OCwyNTgsNDA5NixXKV07ZnVuY3Rpb24gdHQoZSl7ZS53aW5kb3dfc2l6ZT0yKmUud19zaXplLHl0KGUuaGVhZCksZS5tYXhfbGF6eV9tYXRjaD1NZVtlLmxldmVsXS5tYXhfbGF6eSxlLmdvb2RfbWF0Y2g9TWVbZS5sZXZlbF0uZ29vZF9sZW5ndGgsZS5uaWNlX21hdGNoPU1lW2UubGV2ZWxdLm5pY2VfbGVuZ3RoLGUubWF4X2NoYWluX2xlbmd0aD1NZVtlLmxldmVsXS5tYXhfY2hhaW4sZS5zdHJzdGFydD0wLGUuYmxvY2tfc3RhcnQ9MCxlLmxvb2thaGVhZD0wLGUuaW5zZXJ0PTAsZS5tYXRjaF9sZW5ndGg9ZS5wcmV2X2xlbmd0aD1SZS0xLGUubWF0Y2hfYXZhaWxhYmxlPTAsZS5pbnNfaD0wfWZ1bmN0aW9uIGh0KCl7dGhpcy5zdHJtPW51bGwsdGhpcy5zdGF0dXM9MCx0aGlzLnBlbmRpbmdfYnVmPW51bGwsdGhpcy5wZW5kaW5nX2J1Zl9zaXplPTAsdGhpcy5wZW5kaW5nX291dD0wLHRoaXMucGVuZGluZz0wLHRoaXMud3JhcD0wLHRoaXMuZ3poZWFkPW51bGwsdGhpcy5nemluZGV4PTAsdGhpcy5tZXRob2Q9SWUsdGhpcy5sYXN0X2ZsdXNoPS0xLHRoaXMud19zaXplPTAsdGhpcy53X2JpdHM9MCx0aGlzLndfbWFzaz0wLHRoaXMud2luZG93PW51bGwsdGhpcy53aW5kb3dfc2l6ZT0wLHRoaXMucHJldj1udWxsLHRoaXMuaGVhZD1udWxsLHRoaXMuaW5zX2g9MCx0aGlzLmhhc2hfc2l6ZT0wLHRoaXMuaGFzaF9iaXRzPTAsdGhpcy5oYXNoX21hc2s9MCx0aGlzLmhhc2hfc2hpZnQ9MCx0aGlzLmJsb2NrX3N0YXJ0PTAsdGhpcy5tYXRjaF9sZW5ndGg9MCx0aGlzLnByZXZfbWF0Y2g9MCx0aGlzLm1hdGNoX2F2YWlsYWJsZT0wLHRoaXMuc3Ryc3RhcnQ9MCx0aGlzLm1hdGNoX3N0YXJ0PTAsdGhpcy5sb29rYWhlYWQ9MCx0aGlzLnByZXZfbGVuZ3RoPTAsdGhpcy5tYXhfY2hhaW5fbGVuZ3RoPTAsdGhpcy5tYXhfbGF6eV9tYXRjaD0wLHRoaXMubGV2ZWw9MCx0aGlzLnN0cmF0ZWd5PTAsdGhpcy5nb29kX21hdGNoPTAsdGhpcy5uaWNlX21hdGNoPTAsdGhpcy5keW5fbHRyZWU9bmV3IFN0LkJ1ZjE2KHFlKjIpLHRoaXMuZHluX2R0cmVlPW5ldyBTdC5CdWYxNigoMipsZSsxKSoyKSx0aGlzLmJsX3RyZWU9bmV3IFN0LkJ1ZjE2KCgyKlNlKzEpKjIpLHl0KHRoaXMuZHluX2x0cmVlKSx5dCh0aGlzLmR5bl9kdHJlZSkseXQodGhpcy5ibF90cmVlKSx0aGlzLmxfZGVzYz1udWxsLHRoaXMuZF9kZXNjPW51bGwsdGhpcy5ibF9kZXNjPW51bGwsdGhpcy5ibF9jb3VudD1uZXcgU3QuQnVmMTYoSGUrMSksdGhpcy5oZWFwPW5ldyBTdC5CdWYxNigyKm1lKzEpLHl0KHRoaXMuaGVhcCksdGhpcy5oZWFwX2xlbj0wLHRoaXMuaGVhcF9tYXg9MCx0aGlzLmRlcHRoPW5ldyBTdC5CdWYxNigyKm1lKzEpLHl0KHRoaXMuZGVwdGgpLHRoaXMubF9idWY9MCx0aGlzLmxpdF9idWZzaXplPTAsdGhpcy5sYXN0X2xpdD0wLHRoaXMuZF9idWY9MCx0aGlzLm9wdF9sZW49MCx0aGlzLnN0YXRpY19sZW49MCx0aGlzLm1hdGNoZXM9MCx0aGlzLmluc2VydD0wLHRoaXMuYmlfYnVmPTAsdGhpcy5iaV92YWxpZD0wfWZ1bmN0aW9uIFllKGUpe3ZhciB0O3JldHVybiFlfHwhZS5zdGF0ZT9KZShlLHMpOihlLnRvdGFsX2luPWUudG90YWxfb3V0PTAsZS5kYXRhX3R5cGU9aWUsdD1lLnN0YXRlLHQucGVuZGluZz0wLHQucGVuZGluZ19vdXQ9MCx0LndyYXA8MCYmKHQud3JhcD0tdC53cmFwKSx0LnN0YXR1cz10LndyYXA/Q3Q6SyxlLmFkbGVyPXQud3JhcD09PTI/MDoxLHQubGFzdF9mbHVzaD1XZSxMZS5fdHJfaW5pdCh0KSxUZSl9ZnVuY3Rpb24gZXQoZSl7dmFyIHQ9WWUoZSk7cmV0dXJuIHQ9PT1UZSYmdHQoZS5zdGF0ZSksdH1mdW5jdGlvbiBqZShlLHQpe3JldHVybiFlfHwhZS5zdGF0ZXx8ZS5zdGF0ZS53cmFwIT09Mj9zOihlLnN0YXRlLmd6aGVhZD10LFRlKX1mdW5jdGlvbiBOdChlLHQsbixyLGEsdSl7aWYoIWUpcmV0dXJuIHM7dmFyIGg9MTtpZih0PT09eSYmKHQ9NikscjwwPyhoPTAscj0tcik6cj4xNSYmKGg9MixyLT0xNiksYTwxfHxhPm9lfHxuIT09SWV8fHI8OHx8cj4xNXx8dDwwfHx0Pjl8fHU8MHx8dT4kKXJldHVybiBKZShlLHMpO3I9PT04JiYocj05KTt2YXIgYj1uZXcgaHQ7cmV0dXJuIGUuc3RhdGU9YixiLnN0cm09ZSxiLndyYXA9aCxiLmd6aGVhZD1udWxsLGIud19iaXRzPXIsYi53X3NpemU9MTw8Yi53X2JpdHMsYi53X21hc2s9Yi53X3NpemUtMSxiLmhhc2hfYml0cz1hKzcsYi5oYXNoX3NpemU9MTw8Yi5oYXNoX2JpdHMsYi5oYXNoX21hc2s9Yi5oYXNoX3NpemUtMSxiLmhhc2hfc2hpZnQ9fn4oKGIuaGFzaF9iaXRzK1JlLTEpL1JlKSxiLndpbmRvdz1uZXcgU3QuQnVmOChiLndfc2l6ZSoyKSxiLmhlYWQ9bmV3IFN0LkJ1ZjE2KGIuaGFzaF9zaXplKSxiLnByZXY9bmV3IFN0LkJ1ZjE2KGIud19zaXplKSxiLmxpdF9idWZzaXplPTE8PGErNixiLnBlbmRpbmdfYnVmX3NpemU9Yi5saXRfYnVmc2l6ZSo0LGIucGVuZGluZ19idWY9bmV3IFN0LkJ1ZjgoYi5wZW5kaW5nX2J1Zl9zaXplKSxiLmRfYnVmPTEqYi5saXRfYnVmc2l6ZSxiLmxfYnVmPSgxKzIpKmIubGl0X2J1ZnNpemUsYi5sZXZlbD10LGIuc3RyYXRlZ3k9dSxiLm1ldGhvZD1uLGV0KGUpfWZ1bmN0aW9uIER0KGUsdCl7cmV0dXJuIE50KGUsdCxJZSxDZSxCZSxlZSl9ZnVuY3Rpb24gRnQoZSx0KXt2YXIgbixyLGEsdTtpZighZXx8IWUuc3RhdGV8fHQ+ZmV8fHQ8MClyZXR1cm4gZT9KZShlLHMpOnM7aWYocj1lLnN0YXRlLCFlLm91dHB1dHx8IWUuaW5wdXQmJmUuYXZhaWxfaW4hPT0wfHxyLnN0YXR1cz09PWhlJiZ0IT09X2UpcmV0dXJuIEplKGUsZS5hdmFpbF9vdXQ9PT0wP3A6cyk7aWYoci5zdHJtPWUsbj1yLmxhc3RfZmx1c2gsci5sYXN0X2ZsdXNoPXQsci5zdGF0dXM9PT1DdClpZihyLndyYXA9PT0yKWUuYWRsZXI9MCxvdChyLDMxKSxvdChyLDEzOSksb3Qociw4KSxyLmd6aGVhZD8ob3Qociwoci5nemhlYWQudGV4dD8xOjApKyhyLmd6aGVhZC5oY3JjPzI6MCkrKHIuZ3poZWFkLmV4dHJhPzQ6MCkrKHIuZ3poZWFkLm5hbWU/ODowKSsoci5nemhlYWQuY29tbWVudD8xNjowKSksb3QocixyLmd6aGVhZC50aW1lJjI1NSksb3QocixyLmd6aGVhZC50aW1lPj44JjI1NSksb3QocixyLmd6aGVhZC50aW1lPj4xNiYyNTUpLG90KHIsci5nemhlYWQudGltZT4+MjQmMjU1KSxvdChyLHIubGV2ZWw9PT05PzI6ci5zdHJhdGVneT49SXx8ci5sZXZlbDwyPzQ6MCksb3QocixyLmd6aGVhZC5vcyYyNTUpLHIuZ3poZWFkLmV4dHJhJiZyLmd6aGVhZC5leHRyYS5sZW5ndGgmJihvdChyLHIuZ3poZWFkLmV4dHJhLmxlbmd0aCYyNTUpLG90KHIsci5nemhlYWQuZXh0cmEubGVuZ3RoPj44JjI1NSkpLHIuZ3poZWFkLmhjcmMmJihlLmFkbGVyPXNlKGUuYWRsZXIsci5wZW5kaW5nX2J1ZixyLnBlbmRpbmcsMCkpLHIuZ3ppbmRleD0wLHIuc3RhdHVzPUJ0KToob3QociwwKSxvdChyLDApLG90KHIsMCksb3QociwwKSxvdChyLDApLG90KHIsci5sZXZlbD09PTk/MjpyLnN0cmF0ZWd5Pj1JfHxyLmxldmVsPDI/NDowKSxvdChyLFFlKSxyLnN0YXR1cz1LKTtlbHNle3ZhciBoPUllKyhyLndfYml0cy04PDw0KTw8OCxiPS0xO3Iuc3RyYXRlZ3k+PUl8fHIubGV2ZWw8Mj9iPTA6ci5sZXZlbDw2P2I9MTpyLmxldmVsPT09Nj9iPTI6Yj0zLGh8PWI8PDYsci5zdHJzdGFydCE9PTAmJihofD1JdCksaCs9MzEtaCUzMSxyLnN0YXR1cz1LLGRuKHIsaCksci5zdHJzdGFydCE9PTAmJihkbihyLGUuYWRsZXI+Pj4xNiksZG4ocixlLmFkbGVyJjY1NTM1KSksZS5hZGxlcj0xfWlmKHIuc3RhdHVzPT09QnQpaWYoci5nemhlYWQuZXh0cmEpe2ZvcihhPXIucGVuZGluZztyLmd6aW5kZXg8KHIuZ3poZWFkLmV4dHJhLmxlbmd0aCY2NTUzNSkmJiEoci5wZW5kaW5nPT09ci5wZW5kaW5nX2J1Zl9zaXplJiYoci5nemhlYWQuaGNyYyYmci5wZW5kaW5nPmEmJihlLmFkbGVyPXNlKGUuYWRsZXIsci5wZW5kaW5nX2J1ZixyLnBlbmRpbmctYSxhKSksd3QoZSksYT1yLnBlbmRpbmcsci5wZW5kaW5nPT09ci5wZW5kaW5nX2J1Zl9zaXplKSk7KW90KHIsci5nemhlYWQuZXh0cmFbci5nemluZGV4XSYyNTUpLHIuZ3ppbmRleCsrO3IuZ3poZWFkLmhjcmMmJnIucGVuZGluZz5hJiYoZS5hZGxlcj1zZShlLmFkbGVyLHIucGVuZGluZ19idWYsci5wZW5kaW5nLWEsYSkpLHIuZ3ppbmRleD09PXIuZ3poZWFkLmV4dHJhLmxlbmd0aCYmKHIuZ3ppbmRleD0wLHIuc3RhdHVzPUp0KX1lbHNlIHIuc3RhdHVzPUp0O2lmKHIuc3RhdHVzPT09SnQpaWYoci5nemhlYWQubmFtZSl7YT1yLnBlbmRpbmc7ZG97aWYoci5wZW5kaW5nPT09ci5wZW5kaW5nX2J1Zl9zaXplJiYoci5nemhlYWQuaGNyYyYmci5wZW5kaW5nPmEmJihlLmFkbGVyPXNlKGUuYWRsZXIsci5wZW5kaW5nX2J1ZixyLnBlbmRpbmctYSxhKSksd3QoZSksYT1yLnBlbmRpbmcsci5wZW5kaW5nPT09ci5wZW5kaW5nX2J1Zl9zaXplKSl7dT0xO2JyZWFrfXIuZ3ppbmRleDxyLmd6aGVhZC5uYW1lLmxlbmd0aD91PXIuZ3poZWFkLm5hbWUuY2hhckNvZGVBdChyLmd6aW5kZXgrKykmMjU1OnU9MCxvdChyLHUpfXdoaWxlKHUhPT0wKTtyLmd6aGVhZC5oY3JjJiZyLnBlbmRpbmc+YSYmKGUuYWRsZXI9c2UoZS5hZGxlcixyLnBlbmRpbmdfYnVmLHIucGVuZGluZy1hLGEpKSx1PT09MCYmKHIuZ3ppbmRleD0wLHIuc3RhdHVzPWR0KX1lbHNlIHIuc3RhdHVzPWR0O2lmKHIuc3RhdHVzPT09ZHQpaWYoci5nemhlYWQuY29tbWVudCl7YT1yLnBlbmRpbmc7ZG97aWYoci5wZW5kaW5nPT09ci5wZW5kaW5nX2J1Zl9zaXplJiYoci5nemhlYWQuaGNyYyYmci5wZW5kaW5nPmEmJihlLmFkbGVyPXNlKGUuYWRsZXIsci5wZW5kaW5nX2J1ZixyLnBlbmRpbmctYSxhKSksd3QoZSksYT1yLnBlbmRpbmcsci5wZW5kaW5nPT09ci5wZW5kaW5nX2J1Zl9zaXplKSl7dT0xO2JyZWFrfXIuZ3ppbmRleDxyLmd6aGVhZC5jb21tZW50Lmxlbmd0aD91PXIuZ3poZWFkLmNvbW1lbnQuY2hhckNvZGVBdChyLmd6aW5kZXgrKykmMjU1OnU9MCxvdChyLHUpfXdoaWxlKHUhPT0wKTtyLmd6aGVhZC5oY3JjJiZyLnBlbmRpbmc+YSYmKGUuYWRsZXI9c2UoZS5hZGxlcixyLnBlbmRpbmdfYnVmLHIucGVuZGluZy1hLGEpKSx1PT09MCYmKHIuc3RhdHVzPUYpfWVsc2Ugci5zdGF0dXM9RjtpZihyLnN0YXR1cz09PUYmJihyLmd6aGVhZC5oY3JjPyhyLnBlbmRpbmcrMj5yLnBlbmRpbmdfYnVmX3NpemUmJnd0KGUpLHIucGVuZGluZysyPD1yLnBlbmRpbmdfYnVmX3NpemUmJihvdChyLGUuYWRsZXImMjU1KSxvdChyLGUuYWRsZXI+PjgmMjU1KSxlLmFkbGVyPTAsci5zdGF0dXM9SykpOnIuc3RhdHVzPUspLHIucGVuZGluZyE9PTApe2lmKHd0KGUpLGUuYXZhaWxfb3V0PT09MClyZXR1cm4gci5sYXN0X2ZsdXNoPS0xLFRlfWVsc2UgaWYoZS5hdmFpbF9pbj09PTAmJkRlKHQpPD1EZShuKSYmdCE9PV9lKXJldHVybiBKZShlLHApO2lmKHIuc3RhdHVzPT09aGUmJmUuYXZhaWxfaW4hPT0wKXJldHVybiBKZShlLHApO2lmKGUuYXZhaWxfaW4hPT0wfHxyLmxvb2thaGVhZCE9PTB8fHQhPT1XZSYmci5zdGF0dXMhPT1oZSl7dmFyIFU9ci5zdHJhdGVneT09PUk/RWUocix0KTpyLnN0cmF0ZWd5PT09TD9yZShyLHQpOk1lW3IubGV2ZWxdLmZ1bmMocix0KTtpZigoVT09PUtlfHxVPT09Y3QpJiYoci5zdGF0dXM9aGUpLFU9PT1wZXx8VT09PUtlKXJldHVybiBlLmF2YWlsX291dD09PTAmJihyLmxhc3RfZmx1c2g9LTEpLFRlO2lmKFU9PT1QZSYmKHQ9PT1fdD9MZS5fdHJfYWxpZ24ocik6dCE9PWZlJiYoTGUuX3RyX3N0b3JlZF9ibG9jayhyLDAsMCwhMSksdD09PVB0JiYoeXQoci5oZWFkKSxyLmxvb2thaGVhZD09PTAmJihyLnN0cnN0YXJ0PTAsci5ibG9ja19zdGFydD0wLHIuaW5zZXJ0PTApKSksd3QoZSksZS5hdmFpbF9vdXQ9PT0wKSlyZXR1cm4gci5sYXN0X2ZsdXNoPS0xLFRlfXJldHVybiB0IT09X2U/VGU6ci53cmFwPD0wP2k6KHIud3JhcD09PTI/KG90KHIsZS5hZGxlciYyNTUpLG90KHIsZS5hZGxlcj4+OCYyNTUpLG90KHIsZS5hZGxlcj4+MTYmMjU1KSxvdChyLGUuYWRsZXI+PjI0JjI1NSksb3QocixlLnRvdGFsX2luJjI1NSksb3QocixlLnRvdGFsX2luPj44JjI1NSksb3QocixlLnRvdGFsX2luPj4xNiYyNTUpLG90KHIsZS50b3RhbF9pbj4+MjQmMjU1KSk6KGRuKHIsZS5hZGxlcj4+PjE2KSxkbihyLGUuYWRsZXImNjU1MzUpKSx3dChlKSxyLndyYXA+MCYmKHIud3JhcD0tci53cmFwKSxyLnBlbmRpbmchPT0wP1RlOmkpfWZ1bmN0aW9uIG9uKGUpe3ZhciB0O3JldHVybiFlfHwhZS5zdGF0ZT9zOih0PWUuc3RhdGUuc3RhdHVzLHQhPT1DdCYmdCE9PUJ0JiZ0IT09SnQmJnQhPT1kdCYmdCE9PUYmJnQhPT1LJiZ0IT09aGU/SmUoZSxzKTooZS5zdGF0ZT1udWxsLHQ9PT1LP0plKGUsZCk6VGUpKX1mdW5jdGlvbiBWcihlLHQpe3ZhciBuPXQubGVuZ3RoLHIsYSx1LGgsYixVLE8sRDtpZighZXx8IWUuc3RhdGV8fChyPWUuc3RhdGUsaD1yLndyYXAsaD09PTJ8fGg9PT0xJiZyLnN0YXR1cyE9PUN0fHxyLmxvb2thaGVhZCkpcmV0dXJuIHM7Zm9yKGg9PT0xJiYoZS5hZGxlcj1YZShlLmFkbGVyLHQsbiwwKSksci53cmFwPTAsbj49ci53X3NpemUmJihoPT09MCYmKHl0KHIuaGVhZCksci5zdHJzdGFydD0wLHIuYmxvY2tfc3RhcnQ9MCxyLmluc2VydD0wKSxEPW5ldyBTdC5CdWY4KHIud19zaXplKSxTdC5hcnJheVNldChELHQsbi1yLndfc2l6ZSxyLndfc2l6ZSwwKSx0PUQsbj1yLndfc2l6ZSksYj1lLmF2YWlsX2luLFU9ZS5uZXh0X2luLE89ZS5pbnB1dCxlLmF2YWlsX2luPW4sZS5uZXh0X2luPTAsZS5pbnB1dD10LFBuKHIpO3IubG9va2FoZWFkPj1SZTspe2E9ci5zdHJzdGFydCx1PXIubG9va2FoZWFkLShSZS0xKTtkbyByLmluc19oPShyLmluc19oPDxyLmhhc2hfc2hpZnReci53aW5kb3dbYStSZS0xXSkmci5oYXNoX21hc2ssci5wcmV2W2Emci53X21hc2tdPXIuaGVhZFtyLmluc19oXSxyLmhlYWRbci5pbnNfaF09YSxhKys7d2hpbGUoLS11KTtyLnN0cnN0YXJ0PWEsci5sb29rYWhlYWQ9UmUtMSxQbihyKX1yZXR1cm4gci5zdHJzdGFydCs9ci5sb29rYWhlYWQsci5ibG9ja19zdGFydD1yLnN0cnN0YXJ0LHIuaW5zZXJ0PXIubG9va2FoZWFkLHIubG9va2FoZWFkPTAsci5tYXRjaF9sZW5ndGg9ci5wcmV2X2xlbmd0aD1SZS0xLHIubWF0Y2hfYXZhaWxhYmxlPTAsZS5uZXh0X2luPVUsZS5pbnB1dD1PLGUuYXZhaWxfaW49YixyLndyYXA9aCxUZX12YXIgbnI9RHQsS3I9TnQsUmk9ZXQsWWE9WWUscHM9amUsJHI9RnQsJHM9b24sVXM9VnIsaG89InBha28gZGVmbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCkiLHFhPXtkZWZsYXRlSW5pdDpucixkZWZsYXRlSW5pdDI6S3IsZGVmbGF0ZVJlc2V0OlJpLGRlZmxhdGVSZXNldEtlZXA6WWEsZGVmbGF0ZVNldEhlYWRlcjpwcyxkZWZsYXRlOiRyLGRlZmxhdGVFbmQ6JHMsZGVmbGF0ZVNldERpY3Rpb25hcnk6VXMsZGVmbGF0ZUluZm86aG99LEthPSEwLGRhPSEwO3RyeXtTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsWzBdKX1jYXRjaChlKXtLYT0hMX10cnl7U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLG5ldyBVaW50OEFycmF5KDEpKX1jYXRjaChlKXtkYT0hMX1mb3IodmFyIFVvPW5ldyBTdC5CdWY4KDI1NiksYmk9MDtiaTwyNTY7YmkrKylVb1tiaV09Ymk+PTI1Mj82OmJpPj0yNDg/NTpiaT49MjQwPzQ6Ymk+PTIyND8zOmJpPj0xOTI/MjoxO1VvWzI1NF09VW9bMjU0XT0xO3ZhciB2cz1mdW5jdGlvbihlKXt2YXIgdCxuLHIsYSx1LGg9ZS5sZW5ndGgsYj0wO2ZvcihhPTA7YTxoO2ErKyluPWUuY2hhckNvZGVBdChhKSwobiY2NDUxMik9PT01NTI5NiYmYSsxPGgmJihyPWUuY2hhckNvZGVBdChhKzEpLChyJjY0NTEyKT09PTU2MzIwJiYobj02NTUzNisobi01NTI5Njw8MTApKyhyLTU2MzIwKSxhKyspKSxiKz1uPDEyOD8xOm48MjA0OD8yOm48NjU1MzY/Mzo0O2Zvcih0PW5ldyBTdC5CdWY4KGIpLHU9MCxhPTA7dTxiO2ErKyluPWUuY2hhckNvZGVBdChhKSwobiY2NDUxMik9PT01NTI5NiYmYSsxPGgmJihyPWUuY2hhckNvZGVBdChhKzEpLChyJjY0NTEyKT09PTU2MzIwJiYobj02NTUzNisobi01NTI5Njw8MTApKyhyLTU2MzIwKSxhKyspKSxuPDEyOD90W3UrK109bjpuPDIwNDg/KHRbdSsrXT0xOTJ8bj4+PjYsdFt1KytdPTEyOHxuJjYzKTpuPDY1NTM2Pyh0W3UrK109MjI0fG4+Pj4xMix0W3UrK109MTI4fG4+Pj42JjYzLHRbdSsrXT0xMjh8biY2Myk6KHRbdSsrXT0yNDB8bj4+PjE4LHRbdSsrXT0xMjh8bj4+PjEyJjYzLHRbdSsrXT0xMjh8bj4+PjYmNjMsdFt1KytdPTEyOHxuJjYzKTtyZXR1cm4gdH07ZnVuY3Rpb24gSWEoZSx0KXtpZih0PDY1NTM0JiYoZS5zdWJhcnJheSYmZGF8fCFlLnN1YmFycmF5JiZLYSkpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxTdC5zaHJpbmtCdWYoZSx0KSk7Zm9yKHZhciBuPSIiLHI9MDtyPHQ7cisrKW4rPVN0cmluZy5mcm9tQ2hhckNvZGUoZVtyXSk7cmV0dXJuIG59dmFyIEVjPWZ1bmN0aW9uKGUpe3JldHVybiBJYShlLGUubGVuZ3RoKX0sS2w9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PW5ldyBTdC5CdWY4KGUubGVuZ3RoKSxuPTAscj10Lmxlbmd0aDtuPHI7bisrKXRbbl09ZS5jaGFyQ29kZUF0KG4pO3JldHVybiB0fSx5Yz1mdW5jdGlvbihlLHQpe3ZhciBuLHIsYSx1LGg9dHx8ZS5sZW5ndGgsYj1uZXcgQXJyYXkoaCoyKTtmb3Iocj0wLG49MDtuPGg7KXtpZihhPWVbbisrXSxhPDEyOCl7YltyKytdPWE7Y29udGludWV9aWYodT1Vb1thXSx1PjQpe2JbcisrXT02NTUzMyxuKz11LTE7Y29udGludWV9Zm9yKGEmPXU9PT0yPzMxOnU9PT0zPzE1Ojc7dT4xJiZuPGg7KWE9YTw8NnxlW24rK10mNjMsdS0tO2lmKHU+MSl7YltyKytdPTY1NTMzO2NvbnRpbnVlfWE8NjU1MzY/YltyKytdPWE6KGEtPTY1NTM2LGJbcisrXT01NTI5NnxhPj4xMCYxMDIzLGJbcisrXT01NjMyMHxhJjEwMjMpfXJldHVybiBJYShiLHIpfSx3Yz1mdW5jdGlvbihlLHQpe3ZhciBuO2Zvcih0PXR8fGUubGVuZ3RoLHQ+ZS5sZW5ndGgmJih0PWUubGVuZ3RoKSxuPXQtMTtuPj0wJiYoZVtuXSYxOTIpPT09MTI4OyluLS07cmV0dXJuIG48MHx8bj09PTA/dDpuK1VvW2Vbbl1dPnQ/bjp0fSxvdj17c3RyaW5nMmJ1Zjp2cyxidWYyYmluc3RyaW5nOkVjLGJpbnN0cmluZzJidWY6S2wsYnVmMnN0cmluZzp5Yyx1dGY4Ym9yZGVyOndjfTtmdW5jdGlvbiBhdigpe3RoaXMuaW5wdXQ9bnVsbCx0aGlzLm5leHRfaW49MCx0aGlzLmF2YWlsX2luPTAsdGhpcy50b3RhbF9pbj0wLHRoaXMub3V0cHV0PW51bGwsdGhpcy5uZXh0X291dD0wLHRoaXMuYXZhaWxfb3V0PTAsdGhpcy50b3RhbF9vdXQ9MCx0aGlzLm1zZz0iIix0aGlzLnN0YXRlPW51bGwsdGhpcy5kYXRhX3R5cGU9Mix0aGlzLmFkbGVyPTB9dmFyIHN2PWF2LEpsPXFhLEhzPW92LFJmPXN2LHhmPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsbHY9MCxwdT00LFNsPTAsQmY9MSxNZj0yLGN2PS0xLHV2PTAsZnY9ODtmdW5jdGlvbiBqcyhlKXtpZighKHRoaXMgaW5zdGFuY2VvZiBqcykpcmV0dXJuIG5ldyBqcyhlKTt0aGlzLm9wdGlvbnM9U3QuYXNzaWduKHtsZXZlbDpjdixtZXRob2Q6ZnYsY2h1bmtTaXplOjE2Mzg0LHdpbmRvd0JpdHM6MTUsbWVtTGV2ZWw6OCxzdHJhdGVneTp1dix0bzoiIn0sZXx8e30pO3ZhciB0PXRoaXMub3B0aW9uczt0LnJhdyYmdC53aW5kb3dCaXRzPjA/dC53aW5kb3dCaXRzPS10LndpbmRvd0JpdHM6dC5nemlwJiZ0LndpbmRvd0JpdHM+MCYmdC53aW5kb3dCaXRzPDE2JiYodC53aW5kb3dCaXRzKz0xNiksdGhpcy5lcnI9MCx0aGlzLm1zZz0iIix0aGlzLmVuZGVkPSExLHRoaXMuY2h1bmtzPVtdLHRoaXMuc3RybT1uZXcgUmYsdGhpcy5zdHJtLmF2YWlsX291dD0wO3ZhciBuPUpsLmRlZmxhdGVJbml0Mih0aGlzLnN0cm0sdC5sZXZlbCx0Lm1ldGhvZCx0LndpbmRvd0JpdHMsdC5tZW1MZXZlbCx0LnN0cmF0ZWd5KTtpZihuIT09U2wpdGhyb3cgbmV3IEVycm9yKCRlW25dKTtpZih0LmhlYWRlciYmSmwuZGVmbGF0ZVNldEhlYWRlcih0aGlzLnN0cm0sdC5oZWFkZXIpLHQuZGljdGlvbmFyeSl7dmFyIHI7aWYodHlwZW9mIHQuZGljdGlvbmFyeT09InN0cmluZyI/cj1Icy5zdHJpbmcyYnVmKHQuZGljdGlvbmFyeSk6eGYuY2FsbCh0LmRpY3Rpb25hcnkpPT09IltvYmplY3QgQXJyYXlCdWZmZXJdIj9yPW5ldyBVaW50OEFycmF5KHQuZGljdGlvbmFyeSk6cj10LmRpY3Rpb25hcnksbj1KbC5kZWZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0sciksbiE9PVNsKXRocm93IG5ldyBFcnJvcigkZVtuXSk7dGhpcy5fZGljdF9zZXQ9ITB9fWpzLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5zdHJtLHI9dGhpcy5vcHRpb25zLmNodW5rU2l6ZSxhLHU7aWYodGhpcy5lbmRlZClyZXR1cm4hMTt1PXQ9PT1+fnQ/dDp0PT09ITA/cHU6bHYsdHlwZW9mIGU9PSJzdHJpbmciP24uaW5wdXQ9SHMuc3RyaW5nMmJ1ZihlKTp4Zi5jYWxsKGUpPT09IltvYmplY3QgQXJyYXlCdWZmZXJdIj9uLmlucHV0PW5ldyBVaW50OEFycmF5KGUpOm4uaW5wdXQ9ZSxuLm5leHRfaW49MCxuLmF2YWlsX2luPW4uaW5wdXQubGVuZ3RoO2Rve2lmKG4uYXZhaWxfb3V0PT09MCYmKG4ub3V0cHV0PW5ldyBTdC5CdWY4KHIpLG4ubmV4dF9vdXQ9MCxuLmF2YWlsX291dD1yKSxhPUpsLmRlZmxhdGUobix1KSxhIT09QmYmJmEhPT1TbClyZXR1cm4gdGhpcy5vbkVuZChhKSx0aGlzLmVuZGVkPSEwLCExOyhuLmF2YWlsX291dD09PTB8fG4uYXZhaWxfaW49PT0wJiYodT09PXB1fHx1PT09TWYpKSYmKHRoaXMub3B0aW9ucy50bz09PSJzdHJpbmciP3RoaXMub25EYXRhKEhzLmJ1ZjJiaW5zdHJpbmcoU3Quc2hyaW5rQnVmKG4ub3V0cHV0LG4ubmV4dF9vdXQpKSk6dGhpcy5vbkRhdGEoU3Quc2hyaW5rQnVmKG4ub3V0cHV0LG4ubmV4dF9vdXQpKSl9d2hpbGUoKG4uYXZhaWxfaW4+MHx8bi5hdmFpbF9vdXQ9PT0wKSYmYSE9PUJmKTtyZXR1cm4gdT09PXB1PyhhPUpsLmRlZmxhdGVFbmQodGhpcy5zdHJtKSx0aGlzLm9uRW5kKGEpLHRoaXMuZW5kZWQ9ITAsYT09PVNsKToodT09PU1mJiYodGhpcy5vbkVuZChTbCksbi5hdmFpbF9vdXQ9MCksITApfSxqcy5wcm90b3R5cGUub25EYXRhPWZ1bmN0aW9uKGUpe3RoaXMuY2h1bmtzLnB1c2goZSl9LGpzLnByb3RvdHlwZS5vbkVuZD1mdW5jdGlvbihlKXtlPT09U2wmJih0aGlzLm9wdGlvbnMudG89PT0ic3RyaW5nIj90aGlzLnJlc3VsdD10aGlzLmNodW5rcy5qb2luKCIiKTp0aGlzLnJlc3VsdD1TdC5mbGF0dGVuQ2h1bmtzKHRoaXMuY2h1bmtzKSksdGhpcy5jaHVua3M9W10sdGhpcy5lcnI9ZSx0aGlzLm1zZz10aGlzLnN0cm0ubXNnfTtmdW5jdGlvbiB2dShlLHQpe3ZhciBuPW5ldyBqcyh0KTtpZihuLnB1c2goZSwhMCksbi5lcnIpdGhyb3cgbi5tc2d8fCRlW24uZXJyXTtyZXR1cm4gbi5yZXN1bHR9ZnVuY3Rpb24gZHYoZSx0KXtyZXR1cm4gdD10fHx7fSx0LnJhdz0hMCx2dShlLHQpfWZ1bmN0aW9uIGh2KGUsdCl7cmV0dXJuIHQ9dHx8e30sdC5nemlwPSEwLHZ1KGUsdCl9dmFyIGd2PWpzLHB2PXZ1LHZ2PWR2LG12PWh2LF92PXtEZWZsYXRlOmd2LGRlZmxhdGU6cHYsZGVmbGF0ZVJhdzp2dixnemlwOm12fSxTYz0zMCxidj0xMixFdj1mdW5jdGlvbih0LG4pe3ZhciByLGEsdSxoLGIsVSxPLEQsZ2Usd2Usa2UsRXQsa3QsWnQsJHQsTm4sRG4sZW4sbXQsaG4sWHQsanQsZ24sc3IsenQ7cj10LnN0YXRlLGE9dC5uZXh0X2luLHNyPXQuaW5wdXQsdT1hKyh0LmF2YWlsX2luLTUpLGg9dC5uZXh0X291dCx6dD10Lm91dHB1dCxiPWgtKG4tdC5hdmFpbF9vdXQpLFU9aCsodC5hdmFpbF9vdXQtMjU3KSxPPXIuZG1heCxEPXIud3NpemUsZ2U9ci53aGF2ZSx3ZT1yLnduZXh0LGtlPXIud2luZG93LEV0PXIuaG9sZCxrdD1yLmJpdHMsWnQ9ci5sZW5jb2RlLCR0PXIuZGlzdGNvZGUsTm49KDE8PHIubGVuYml0cyktMSxEbj0oMTw8ci5kaXN0Yml0cyktMTtlOmRve2t0PDE1JiYoRXQrPXNyW2ErK108PGt0LGt0Kz04LEV0Kz1zclthKytdPDxrdCxrdCs9OCksZW49WnRbRXQmTm5dO3Q6Zm9yKDs7KXtpZihtdD1lbj4+PjI0LEV0Pj4+PW10LGt0LT1tdCxtdD1lbj4+PjE2JjI1NSxtdD09PTApenRbaCsrXT1lbiY2NTUzNTtlbHNlIGlmKG10JjE2KXtobj1lbiY2NTUzNSxtdCY9MTUsbXQmJihrdDxtdCYmKEV0Kz1zclthKytdPDxrdCxrdCs9OCksaG4rPUV0JigxPDxtdCktMSxFdD4+Pj1tdCxrdC09bXQpLGt0PDE1JiYoRXQrPXNyW2ErK108PGt0LGt0Kz04LEV0Kz1zclthKytdPDxrdCxrdCs9OCksZW49JHRbRXQmRG5dO246Zm9yKDs7KXtpZihtdD1lbj4+PjI0LEV0Pj4+PW10LGt0LT1tdCxtdD1lbj4+PjE2JjI1NSxtdCYxNil7aWYoWHQ9ZW4mNjU1MzUsbXQmPTE1LGt0PG10JiYoRXQrPXNyW2ErK108PGt0LGt0Kz04LGt0PG10JiYoRXQrPXNyW2ErK108PGt0LGt0Kz04KSksWHQrPUV0JigxPDxtdCktMSxYdD5PKXt0Lm1zZz0iaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siLHIubW9kZT1TYzticmVhayBlfWlmKEV0Pj4+PW10LGt0LT1tdCxtdD1oLWIsWHQ+bXQpe2lmKG10PVh0LW10LG10PmdlJiZyLnNhbmUpe3QubXNnPSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIsci5tb2RlPVNjO2JyZWFrIGV9aWYoanQ9MCxnbj1rZSx3ZT09PTApe2lmKGp0Kz1ELW10LG10PGhuKXtobi09bXQ7ZG8genRbaCsrXT1rZVtqdCsrXTt3aGlsZSgtLW10KTtqdD1oLVh0LGduPXp0fX1lbHNlIGlmKHdlPG10KXtpZihqdCs9RCt3ZS1tdCxtdC09d2UsbXQ8aG4pe2huLT1tdDtkbyB6dFtoKytdPWtlW2p0KytdO3doaWxlKC0tbXQpO2lmKGp0PTAsd2U8aG4pe210PXdlLGhuLT1tdDtkbyB6dFtoKytdPWtlW2p0KytdO3doaWxlKC0tbXQpO2p0PWgtWHQsZ249enR9fX1lbHNlIGlmKGp0Kz13ZS1tdCxtdDxobil7aG4tPW10O2RvIHp0W2grK109a2VbanQrK107d2hpbGUoLS1tdCk7anQ9aC1YdCxnbj16dH1mb3IoO2huPjI7KXp0W2grK109Z25banQrK10senRbaCsrXT1nbltqdCsrXSx6dFtoKytdPWduW2p0KytdLGhuLT0zO2huJiYoenRbaCsrXT1nbltqdCsrXSxobj4xJiYoenRbaCsrXT1nbltqdCsrXSkpfWVsc2V7anQ9aC1YdDtkbyB6dFtoKytdPXp0W2p0KytdLHp0W2grK109enRbanQrK10senRbaCsrXT16dFtqdCsrXSxobi09Mzt3aGlsZShobj4yKTtobiYmKHp0W2grK109enRbanQrK10saG4+MSYmKHp0W2grK109enRbanQrK10pKX19ZWxzZSBpZigobXQmNjQpPT09MCl7ZW49JHRbKGVuJjY1NTM1KSsoRXQmKDE8PG10KS0xKV07Y29udGludWUgbn1lbHNle3QubXNnPSJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiLHIubW9kZT1TYzticmVhayBlfWJyZWFrfX1lbHNlIGlmKChtdCY2NCk9PT0wKXtlbj1adFsoZW4mNjU1MzUpKyhFdCYoMTw8bXQpLTEpXTtjb250aW51ZSB0fWVsc2UgaWYobXQmMzIpe3IubW9kZT1idjticmVhayBlfWVsc2V7dC5tc2c9ImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSIsci5tb2RlPVNjO2JyZWFrIGV9YnJlYWt9fXdoaWxlKGE8dSYmaDxVKTtobj1rdD4+MyxhLT1obixrdC09aG48PDMsRXQmPSgxPDxrdCktMSx0Lm5leHRfaW49YSx0Lm5leHRfb3V0PWgsdC5hdmFpbF9pbj1hPHU/NSsodS1hKTo1LShhLXUpLHQuYXZhaWxfb3V0PWg8VT8yNTcrKFUtaCk6MjU3LShoLVUpLHIuaG9sZD1FdCxyLmJpdHM9a3R9LEFsPTE1LExmPTg1MixEZj01OTIsRmY9MCxtdT0xLFZmPTIseXY9WzMsNCw1LDYsNyw4LDksMTAsMTEsMTMsMTUsMTcsMTksMjMsMjcsMzEsMzUsNDMsNTEsNTksNjcsODMsOTksMTE1LDEzMSwxNjMsMTk1LDIyNywyNTgsMCwwXSx3dj1bMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTcsMTcsMTcsMTcsMTgsMTgsMTgsMTgsMTksMTksMTksMTksMjAsMjAsMjAsMjAsMjEsMjEsMjEsMjEsMTYsNzIsNzhdLFN2PVsxLDIsMyw0LDUsNyw5LDEzLDE3LDI1LDMzLDQ5LDY1LDk3LDEyOSwxOTMsMjU3LDM4NSw1MTMsNzY5LDEwMjUsMTUzNywyMDQ5LDMwNzMsNDA5Nyw2MTQ1LDgxOTMsMTIyODksMTYzODUsMjQ1NzcsMCwwXSxBdj1bMTYsMTYsMTYsMTYsMTcsMTcsMTgsMTgsMTksMTksMjAsMjAsMjEsMjEsMjIsMjIsMjMsMjMsMjQsMjQsMjUsMjUsMjYsMjYsMjcsMjcsMjgsMjgsMjksMjksNjQsNjRdLEN2PWZ1bmN0aW9uKHQsbixyLGEsdSxoLGIsVSl7dmFyIE89VS5iaXRzLEQ9MCxnZT0wLHdlPTAsa2U9MCxFdD0wLGt0PTAsWnQ9MCwkdD0wLE5uPTAsRG49MCxlbixtdCxobixYdCxqdCxnbj1udWxsLHNyPTAsenQsdmE9bmV3IFN0LkJ1ZjE2KEFsKzEpLEpjPW5ldyBTdC5CdWYxNihBbCsxKSxaYz1udWxsLGlwPTAsb3AsWGMsUWM7Zm9yKEQ9MDtEPD1BbDtEKyspdmFbRF09MDtmb3IoZ2U9MDtnZTxhO2dlKyspdmFbbltyK2dlXV0rKztmb3IoRXQ9TyxrZT1BbDtrZT49MSYmdmFba2VdPT09MDtrZS0tKTtpZihFdD5rZSYmKEV0PWtlKSxrZT09PTApcmV0dXJuIHVbaCsrXT0xPDwyNHw2NDw8MTZ8MCx1W2grK109MTw8MjR8NjQ8PDE2fDAsVS5iaXRzPTEsMDtmb3Iod2U9MTt3ZTxrZSYmdmFbd2VdPT09MDt3ZSsrKTtmb3IoRXQ8d2UmJihFdD13ZSksJHQ9MSxEPTE7RDw9QWw7RCsrKWlmKCR0PDw9MSwkdC09dmFbRF0sJHQ8MClyZXR1cm4tMTtpZigkdD4wJiYodD09PUZmfHxrZSE9PTEpKXJldHVybi0xO2ZvcihKY1sxXT0wLEQ9MTtEPEFsO0QrKylKY1tEKzFdPUpjW0RdK3ZhW0RdO2ZvcihnZT0wO2dlPGE7Z2UrKyluW3IrZ2VdIT09MCYmKGJbSmNbbltyK2dlXV0rK109Z2UpO2lmKHQ9PT1GZj8oZ249WmM9Yix6dD0xOSk6dD09PW11Pyhnbj15dixzci09MjU3LFpjPXd2LGlwLT0yNTcsenQ9MjU2KTooZ249U3YsWmM9QXYsenQ9LTEpLERuPTAsZ2U9MCxEPXdlLGp0PWgsa3Q9RXQsWnQ9MCxobj0tMSxObj0xPDxFdCxYdD1Obi0xLHQ9PT1tdSYmTm4+TGZ8fHQ9PT1WZiYmTm4+RGYpcmV0dXJuIDE7Zm9yKDs7KXtvcD1ELVp0LGJbZ2VdPHp0PyhYYz0wLFFjPWJbZ2VdKTpiW2dlXT56dD8oWGM9WmNbaXArYltnZV1dLFFjPWduW3NyK2JbZ2VdXSk6KFhjPTMyKzY0LFFjPTApLGVuPTE8PEQtWnQsbXQ9MTw8a3Qsd2U9bXQ7ZG8gbXQtPWVuLHVbanQrKERuPj5adCkrbXRdPW9wPDwyNHxYYzw8MTZ8UWN8MDt3aGlsZShtdCE9PTApO2Zvcihlbj0xPDxELTE7RG4mZW47KWVuPj49MTtpZihlbiE9PTA/KERuJj1lbi0xLERuKz1lbik6RG49MCxnZSsrLC0tdmFbRF09PT0wKXtpZihEPT09a2UpYnJlYWs7RD1uW3IrYltnZV1dfWlmKEQ+RXQmJihEbiZYdCkhPT1obil7Zm9yKFp0PT09MCYmKFp0PUV0KSxqdCs9d2Usa3Q9RC1adCwkdD0xPDxrdDtrdCtadDxrZSYmKCR0LT12YVtrdCtadF0sISgkdDw9MCkpOylrdCsrLCR0PDw9MTtpZihObis9MTw8a3QsdD09PW11JiZObj5MZnx8dD09PVZmJiZObj5EZilyZXR1cm4gMTtobj1EbiZYdCx1W2huXT1FdDw8MjR8a3Q8PDE2fGp0LWh8MH19cmV0dXJuIERuIT09MCYmKHVbanQrRG5dPUQtWnQ8PDI0fDY0PDwxNnwwKSxVLmJpdHM9RXQsMH0sT3Y9RXYsWmw9Q3YsVHY9MCwkZj0xLFVmPTIsSGY9NCxQdj01LEFjPTYsenM9MCxJdj0xLE52PTIsWG89LTIsamY9LTMsemY9LTQsa3Y9LTUsV2Y9OCxHZj0xLFlmPTIscWY9MyxLZj00LEpmPTUsWmY9NixYZj03LFFmPTgsZWQ9OSx0ZD0xMCxDYz0xMSxKYT0xMixfdT0xMyxuZD0xNCxidT0xNSxyZD0xNixpZD0xNyxvZD0xOCxhZD0xOSxPYz0yMCxUYz0yMSxzZD0yMixsZD0yMyxjZD0yNCx1ZD0yNSxmZD0yNixFdT0yNyxkZD0yOCxoZD0yOSxkcj0zMCxnZD0zMSxSdj0zMix4dj04NTIsQnY9NTkyLE12PTE1LEx2PU12O2Z1bmN0aW9uIHBkKGUpe3JldHVybihlPj4+MjQmMjU1KSsoZT4+PjgmNjUyODApKygoZSY2NTI4MCk8PDgpKygoZSYyNTUpPDwyNCl9ZnVuY3Rpb24gRHYoKXt0aGlzLm1vZGU9MCx0aGlzLmxhc3Q9ITEsdGhpcy53cmFwPTAsdGhpcy5oYXZlZGljdD0hMSx0aGlzLmZsYWdzPTAsdGhpcy5kbWF4PTAsdGhpcy5jaGVjaz0wLHRoaXMudG90YWw9MCx0aGlzLmhlYWQ9bnVsbCx0aGlzLndiaXRzPTAsdGhpcy53c2l6ZT0wLHRoaXMud2hhdmU9MCx0aGlzLnduZXh0PTAsdGhpcy53aW5kb3c9bnVsbCx0aGlzLmhvbGQ9MCx0aGlzLmJpdHM9MCx0aGlzLmxlbmd0aD0wLHRoaXMub2Zmc2V0PTAsdGhpcy5leHRyYT0wLHRoaXMubGVuY29kZT1udWxsLHRoaXMuZGlzdGNvZGU9bnVsbCx0aGlzLmxlbmJpdHM9MCx0aGlzLmRpc3RiaXRzPTAsdGhpcy5uY29kZT0wLHRoaXMubmxlbj0wLHRoaXMubmRpc3Q9MCx0aGlzLmhhdmU9MCx0aGlzLm5leHQ9bnVsbCx0aGlzLmxlbnM9bmV3IFN0LkJ1ZjE2KDMyMCksdGhpcy53b3JrPW5ldyBTdC5CdWYxNigyODgpLHRoaXMubGVuZHluPW51bGwsdGhpcy5kaXN0ZHluPW51bGwsdGhpcy5zYW5lPTAsdGhpcy5iYWNrPTAsdGhpcy53YXM9MH1mdW5jdGlvbiB2ZChlKXt2YXIgdDtyZXR1cm4hZXx8IWUuc3RhdGU/WG86KHQ9ZS5zdGF0ZSxlLnRvdGFsX2luPWUudG90YWxfb3V0PXQudG90YWw9MCxlLm1zZz0iIix0LndyYXAmJihlLmFkbGVyPXQud3JhcCYxKSx0Lm1vZGU9R2YsdC5sYXN0PTAsdC5oYXZlZGljdD0wLHQuZG1heD0zMjc2OCx0LmhlYWQ9bnVsbCx0LmhvbGQ9MCx0LmJpdHM9MCx0LmxlbmNvZGU9dC5sZW5keW49bmV3IFN0LkJ1ZjMyKHh2KSx0LmRpc3Rjb2RlPXQuZGlzdGR5bj1uZXcgU3QuQnVmMzIoQnYpLHQuc2FuZT0xLHQuYmFjaz0tMSx6cyl9ZnVuY3Rpb24gbWQoZSl7dmFyIHQ7cmV0dXJuIWV8fCFlLnN0YXRlP1hvOih0PWUuc3RhdGUsdC53c2l6ZT0wLHQud2hhdmU9MCx0LnduZXh0PTAsdmQoZSkpfWZ1bmN0aW9uIF9kKGUsdCl7dmFyIG4scjtyZXR1cm4hZXx8IWUuc3RhdGV8fChyPWUuc3RhdGUsdDwwPyhuPTAsdD0tdCk6KG49KHQ+PjQpKzEsdDw0OCYmKHQmPTE1KSksdCYmKHQ8OHx8dD4xNSkpP1hvOihyLndpbmRvdyE9PW51bGwmJnIud2JpdHMhPT10JiYoci53aW5kb3c9bnVsbCksci53cmFwPW4sci53Yml0cz10LG1kKGUpKX1mdW5jdGlvbiBiZChlLHQpe3ZhciBuLHI7cmV0dXJuIGU/KHI9bmV3IER2LGUuc3RhdGU9cixyLndpbmRvdz1udWxsLG49X2QoZSx0KSxuIT09enMmJihlLnN0YXRlPW51bGwpLG4pOlhvfWZ1bmN0aW9uIEZ2KGUpe3JldHVybiBiZChlLEx2KX12YXIgRWQ9ITAseXUsd3U7ZnVuY3Rpb24gVnYoZSl7aWYoRWQpe3ZhciB0O2Zvcih5dT1uZXcgU3QuQnVmMzIoNTEyKSx3dT1uZXcgU3QuQnVmMzIoMzIpLHQ9MDt0PDE0NDspZS5sZW5zW3QrK109ODtmb3IoO3Q8MjU2OyllLmxlbnNbdCsrXT05O2Zvcig7dDwyODA7KWUubGVuc1t0KytdPTc7Zm9yKDt0PDI4ODspZS5sZW5zW3QrK109ODtmb3IoWmwoJGYsZS5sZW5zLDAsMjg4LHl1LDAsZS53b3JrLHtiaXRzOjl9KSx0PTA7dDwzMjspZS5sZW5zW3QrK109NTtabChVZixlLmxlbnMsMCwzMix3dSwwLGUud29yayx7Yml0czo1fSksRWQ9ITF9ZS5sZW5jb2RlPXl1LGUubGVuYml0cz05LGUuZGlzdGNvZGU9d3UsZS5kaXN0Yml0cz01fWZ1bmN0aW9uIHlkKGUsdCxuLHIpe3ZhciBhLHU9ZS5zdGF0ZTtyZXR1cm4gdS53aW5kb3c9PT1udWxsJiYodS53c2l6ZT0xPDx1LndiaXRzLHUud25leHQ9MCx1LndoYXZlPTAsdS53aW5kb3c9bmV3IFN0LkJ1ZjgodS53c2l6ZSkpLHI+PXUud3NpemU/KFN0LmFycmF5U2V0KHUud2luZG93LHQsbi11LndzaXplLHUud3NpemUsMCksdS53bmV4dD0wLHUud2hhdmU9dS53c2l6ZSk6KGE9dS53c2l6ZS11LnduZXh0LGE+ciYmKGE9ciksU3QuYXJyYXlTZXQodS53aW5kb3csdCxuLXIsYSx1LnduZXh0KSxyLT1hLHI/KFN0LmFycmF5U2V0KHUud2luZG93LHQsbi1yLHIsMCksdS53bmV4dD1yLHUud2hhdmU9dS53c2l6ZSk6KHUud25leHQrPWEsdS53bmV4dD09PXUud3NpemUmJih1LnduZXh0PTApLHUud2hhdmU8dS53c2l6ZSYmKHUud2hhdmUrPWEpKSksMH1mdW5jdGlvbiAkdihlLHQpe3ZhciBuLHIsYSx1LGgsYixVLE8sRCxnZSx3ZSxrZSxFdCxrdCxadD0wLCR0LE5uLERuLGVuLG10LGhuLFh0LGp0LGduPW5ldyBTdC5CdWY4KDQpLHNyLHp0LHZhPVsxNiwxNywxOCwwLDgsNyw5LDYsMTAsNSwxMSw0LDEyLDMsMTMsMiwxNCwxLDE1XTtpZighZXx8IWUuc3RhdGV8fCFlLm91dHB1dHx8IWUuaW5wdXQmJmUuYXZhaWxfaW4hPT0wKXJldHVybiBYbztuPWUuc3RhdGUsbi5tb2RlPT09SmEmJihuLm1vZGU9X3UpLGg9ZS5uZXh0X291dCxhPWUub3V0cHV0LFU9ZS5hdmFpbF9vdXQsdT1lLm5leHRfaW4scj1lLmlucHV0LGI9ZS5hdmFpbF9pbixPPW4uaG9sZCxEPW4uYml0cyxnZT1iLHdlPVUsanQ9enM7ZTpmb3IoOzspc3dpdGNoKG4ubW9kZSl7Y2FzZSBHZjppZihuLndyYXA9PT0wKXtuLm1vZGU9X3U7YnJlYWt9Zm9yKDtEPDE2Oyl7aWYoYj09PTApYnJlYWsgZTtiLS0sTys9clt1KytdPDxELEQrPTh9aWYobi53cmFwJjImJk89PT0zNTYxNSl7bi5jaGVjaz0wLGduWzBdPU8mMjU1LGduWzFdPU8+Pj44JjI1NSxuLmNoZWNrPXNlKG4uY2hlY2ssZ24sMiwwKSxPPTAsRD0wLG4ubW9kZT1ZZjticmVha31pZihuLmZsYWdzPTAsbi5oZWFkJiYobi5oZWFkLmRvbmU9ITEpLCEobi53cmFwJjEpfHwoKChPJjI1NSk8PDgpKyhPPj44KSklMzEpe2UubXNnPSJpbmNvcnJlY3QgaGVhZGVyIGNoZWNrIixuLm1vZGU9ZHI7YnJlYWt9aWYoKE8mMTUpIT09V2Ype2UubXNnPSJ1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCIsbi5tb2RlPWRyO2JyZWFrfWlmKE8+Pj49NCxELT00LFh0PShPJjE1KSs4LG4ud2JpdHM9PT0wKW4ud2JpdHM9WHQ7ZWxzZSBpZihYdD5uLndiaXRzKXtlLm1zZz0iaW52YWxpZCB3aW5kb3cgc2l6ZSIsbi5tb2RlPWRyO2JyZWFrfW4uZG1heD0xPDxYdCxlLmFkbGVyPW4uY2hlY2s9MSxuLm1vZGU9TyY1MTI/dGQ6SmEsTz0wLEQ9MDticmVhaztjYXNlIFlmOmZvcig7RDwxNjspe2lmKGI9PT0wKWJyZWFrIGU7Yi0tLE8rPXJbdSsrXTw8RCxEKz04fWlmKG4uZmxhZ3M9Tywobi5mbGFncyYyNTUpIT09V2Ype2UubXNnPSJ1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCIsbi5tb2RlPWRyO2JyZWFrfWlmKG4uZmxhZ3MmNTczNDQpe2UubXNnPSJ1bmtub3duIGhlYWRlciBmbGFncyBzZXQiLG4ubW9kZT1kcjticmVha31uLmhlYWQmJihuLmhlYWQudGV4dD1PPj44JjEpLG4uZmxhZ3MmNTEyJiYoZ25bMF09TyYyNTUsZ25bMV09Tz4+PjgmMjU1LG4uY2hlY2s9c2Uobi5jaGVjayxnbiwyLDApKSxPPTAsRD0wLG4ubW9kZT1xZjtjYXNlIHFmOmZvcig7RDwzMjspe2lmKGI9PT0wKWJyZWFrIGU7Yi0tLE8rPXJbdSsrXTw8RCxEKz04fW4uaGVhZCYmKG4uaGVhZC50aW1lPU8pLG4uZmxhZ3MmNTEyJiYoZ25bMF09TyYyNTUsZ25bMV09Tz4+PjgmMjU1LGduWzJdPU8+Pj4xNiYyNTUsZ25bM109Tz4+PjI0JjI1NSxuLmNoZWNrPXNlKG4uY2hlY2ssZ24sNCwwKSksTz0wLEQ9MCxuLm1vZGU9S2Y7Y2FzZSBLZjpmb3IoO0Q8MTY7KXtpZihiPT09MClicmVhayBlO2ItLSxPKz1yW3UrK108PEQsRCs9OH1uLmhlYWQmJihuLmhlYWQueGZsYWdzPU8mMjU1LG4uaGVhZC5vcz1PPj44KSxuLmZsYWdzJjUxMiYmKGduWzBdPU8mMjU1LGduWzFdPU8+Pj44JjI1NSxuLmNoZWNrPXNlKG4uY2hlY2ssZ24sMiwwKSksTz0wLEQ9MCxuLm1vZGU9SmY7Y2FzZSBKZjppZihuLmZsYWdzJjEwMjQpe2Zvcig7RDwxNjspe2lmKGI9PT0wKWJyZWFrIGU7Yi0tLE8rPXJbdSsrXTw8RCxEKz04fW4ubGVuZ3RoPU8sbi5oZWFkJiYobi5oZWFkLmV4dHJhX2xlbj1PKSxuLmZsYWdzJjUxMiYmKGduWzBdPU8mMjU1LGduWzFdPU8+Pj44JjI1NSxuLmNoZWNrPXNlKG4uY2hlY2ssZ24sMiwwKSksTz0wLEQ9MH1lbHNlIG4uaGVhZCYmKG4uaGVhZC5leHRyYT1udWxsKTtuLm1vZGU9WmY7Y2FzZSBaZjppZihuLmZsYWdzJjEwMjQmJihrZT1uLmxlbmd0aCxrZT5iJiYoa2U9Yiksa2UmJihuLmhlYWQmJihYdD1uLmhlYWQuZXh0cmFfbGVuLW4ubGVuZ3RoLG4uaGVhZC5leHRyYXx8KG4uaGVhZC5leHRyYT1uZXcgQXJyYXkobi5oZWFkLmV4dHJhX2xlbikpLFN0LmFycmF5U2V0KG4uaGVhZC5leHRyYSxyLHUsa2UsWHQpKSxuLmZsYWdzJjUxMiYmKG4uY2hlY2s9c2Uobi5jaGVjayxyLGtlLHUpKSxiLT1rZSx1Kz1rZSxuLmxlbmd0aC09a2UpLG4ubGVuZ3RoKSlicmVhayBlO24ubGVuZ3RoPTAsbi5tb2RlPVhmO2Nhc2UgWGY6aWYobi5mbGFncyYyMDQ4KXtpZihiPT09MClicmVhayBlO2tlPTA7ZG8gWHQ9clt1K2tlKytdLG4uaGVhZCYmWHQmJm4ubGVuZ3RoPDY1NTM2JiYobi5oZWFkLm5hbWUrPVN0cmluZy5mcm9tQ2hhckNvZGUoWHQpKTt3aGlsZShYdCYma2U8Yik7aWYobi5mbGFncyY1MTImJihuLmNoZWNrPXNlKG4uY2hlY2sscixrZSx1KSksYi09a2UsdSs9a2UsWHQpYnJlYWsgZX1lbHNlIG4uaGVhZCYmKG4uaGVhZC5uYW1lPW51bGwpO24ubGVuZ3RoPTAsbi5tb2RlPVFmO2Nhc2UgUWY6aWYobi5mbGFncyY0MDk2KXtpZihiPT09MClicmVhayBlO2tlPTA7ZG8gWHQ9clt1K2tlKytdLG4uaGVhZCYmWHQmJm4ubGVuZ3RoPDY1NTM2JiYobi5oZWFkLmNvbW1lbnQrPVN0cmluZy5mcm9tQ2hhckNvZGUoWHQpKTt3aGlsZShYdCYma2U8Yik7aWYobi5mbGFncyY1MTImJihuLmNoZWNrPXNlKG4uY2hlY2sscixrZSx1KSksYi09a2UsdSs9a2UsWHQpYnJlYWsgZX1lbHNlIG4uaGVhZCYmKG4uaGVhZC5jb21tZW50PW51bGwpO24ubW9kZT1lZDtjYXNlIGVkOmlmKG4uZmxhZ3MmNTEyKXtmb3IoO0Q8MTY7KXtpZihiPT09MClicmVhayBlO2ItLSxPKz1yW3UrK108PEQsRCs9OH1pZihPIT09KG4uY2hlY2smNjU1MzUpKXtlLm1zZz0iaGVhZGVyIGNyYyBtaXNtYXRjaCIsbi5tb2RlPWRyO2JyZWFrfU89MCxEPTB9bi5oZWFkJiYobi5oZWFkLmhjcmM9bi5mbGFncz4+OSYxLG4uaGVhZC5kb25lPSEwKSxlLmFkbGVyPW4uY2hlY2s9MCxuLm1vZGU9SmE7YnJlYWs7Y2FzZSB0ZDpmb3IoO0Q8MzI7KXtpZihiPT09MClicmVhayBlO2ItLSxPKz1yW3UrK108PEQsRCs9OH1lLmFkbGVyPW4uY2hlY2s9cGQoTyksTz0wLEQ9MCxuLm1vZGU9Q2M7Y2FzZSBDYzppZihuLmhhdmVkaWN0PT09MClyZXR1cm4gZS5uZXh0X291dD1oLGUuYXZhaWxfb3V0PVUsZS5uZXh0X2luPXUsZS5hdmFpbF9pbj1iLG4uaG9sZD1PLG4uYml0cz1ELE52O2UuYWRsZXI9bi5jaGVjaz0xLG4ubW9kZT1KYTtjYXNlIEphOmlmKHQ9PT1Qdnx8dD09PUFjKWJyZWFrIGU7Y2FzZSBfdTppZihuLmxhc3Qpe08+Pj49RCY3LEQtPUQmNyxuLm1vZGU9RXU7YnJlYWt9Zm9yKDtEPDM7KXtpZihiPT09MClicmVhayBlO2ItLSxPKz1yW3UrK108PEQsRCs9OH1zd2l0Y2gobi5sYXN0PU8mMSxPPj4+PTEsRC09MSxPJjMpe2Nhc2UgMDpuLm1vZGU9bmQ7YnJlYWs7Y2FzZSAxOmlmKFZ2KG4pLG4ubW9kZT1PYyx0PT09QWMpe08+Pj49MixELT0yO2JyZWFrIGV9YnJlYWs7Y2FzZSAyOm4ubW9kZT1pZDticmVhaztjYXNlIDM6ZS5tc2c9ImludmFsaWQgYmxvY2sgdHlwZSIsbi5tb2RlPWRyfU8+Pj49MixELT0yO2JyZWFrO2Nhc2UgbmQ6Zm9yKE8+Pj49RCY3LEQtPUQmNztEPDMyOyl7aWYoYj09PTApYnJlYWsgZTtiLS0sTys9clt1KytdPDxELEQrPTh9aWYoKE8mNjU1MzUpIT09KE8+Pj4xNl42NTUzNSkpe2UubXNnPSJpbnZhbGlkIHN0b3JlZCBibG9jayBsZW5ndGhzIixuLm1vZGU9ZHI7YnJlYWt9aWYobi5sZW5ndGg9TyY2NTUzNSxPPTAsRD0wLG4ubW9kZT1idSx0PT09QWMpYnJlYWsgZTtjYXNlIGJ1Om4ubW9kZT1yZDtjYXNlIHJkOmlmKGtlPW4ubGVuZ3RoLGtlKXtpZihrZT5iJiYoa2U9Yiksa2U+VSYmKGtlPVUpLGtlPT09MClicmVhayBlO1N0LmFycmF5U2V0KGEscix1LGtlLGgpLGItPWtlLHUrPWtlLFUtPWtlLGgrPWtlLG4ubGVuZ3RoLT1rZTticmVha31uLm1vZGU9SmE7YnJlYWs7Y2FzZSBpZDpmb3IoO0Q8MTQ7KXtpZihiPT09MClicmVhayBlO2ItLSxPKz1yW3UrK108PEQsRCs9OH1pZihuLm5sZW49KE8mMzEpKzI1NyxPPj4+PTUsRC09NSxuLm5kaXN0PShPJjMxKSsxLE8+Pj49NSxELT01LG4ubmNvZGU9KE8mMTUpKzQsTz4+Pj00LEQtPTQsbi5ubGVuPjI4Nnx8bi5uZGlzdD4zMCl7ZS5tc2c9InRvbyBtYW55IGxlbmd0aCBvciBkaXN0YW5jZSBzeW1ib2xzIixuLm1vZGU9ZHI7YnJlYWt9bi5oYXZlPTAsbi5tb2RlPW9kO2Nhc2Ugb2Q6Zm9yKDtuLmhhdmU8bi5uY29kZTspe2Zvcig7RDwzOyl7aWYoYj09PTApYnJlYWsgZTtiLS0sTys9clt1KytdPDxELEQrPTh9bi5sZW5zW3ZhW24uaGF2ZSsrXV09TyY3LE8+Pj49MyxELT0zfWZvcig7bi5oYXZlPDE5OyluLmxlbnNbdmFbbi5oYXZlKytdXT0wO2lmKG4ubGVuY29kZT1uLmxlbmR5bixuLmxlbmJpdHM9Nyxzcj17Yml0czpuLmxlbmJpdHN9LGp0PVpsKFR2LG4ubGVucywwLDE5LG4ubGVuY29kZSwwLG4ud29yayxzciksbi5sZW5iaXRzPXNyLmJpdHMsanQpe2UubXNnPSJpbnZhbGlkIGNvZGUgbGVuZ3RocyBzZXQiLG4ubW9kZT1kcjticmVha31uLmhhdmU9MCxuLm1vZGU9YWQ7Y2FzZSBhZDpmb3IoO24uaGF2ZTxuLm5sZW4rbi5uZGlzdDspe2Zvcig7WnQ9bi5sZW5jb2RlW08mKDE8PG4ubGVuYml0cyktMV0sJHQ9WnQ+Pj4yNCxObj1adD4+PjE2JjI1NSxEbj1adCY2NTUzNSwhKCR0PD1EKTspe2lmKGI9PT0wKWJyZWFrIGU7Yi0tLE8rPXJbdSsrXTw8RCxEKz04fWlmKERuPDE2KU8+Pj49JHQsRC09JHQsbi5sZW5zW24uaGF2ZSsrXT1EbjtlbHNle2lmKERuPT09MTYpe2Zvcih6dD0kdCsyO0Q8enQ7KXtpZihiPT09MClicmVhayBlO2ItLSxPKz1yW3UrK108PEQsRCs9OH1pZihPPj4+PSR0LEQtPSR0LG4uaGF2ZT09PTApe2UubXNnPSJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0IixuLm1vZGU9ZHI7YnJlYWt9WHQ9bi5sZW5zW24uaGF2ZS0xXSxrZT0zKyhPJjMpLE8+Pj49MixELT0yfWVsc2UgaWYoRG49PT0xNyl7Zm9yKHp0PSR0KzM7RDx6dDspe2lmKGI9PT0wKWJyZWFrIGU7Yi0tLE8rPXJbdSsrXTw8RCxEKz04fU8+Pj49JHQsRC09JHQsWHQ9MCxrZT0zKyhPJjcpLE8+Pj49MyxELT0zfWVsc2V7Zm9yKHp0PSR0Kzc7RDx6dDspe2lmKGI9PT0wKWJyZWFrIGU7Yi0tLE8rPXJbdSsrXTw8RCxEKz04fU8+Pj49JHQsRC09JHQsWHQ9MCxrZT0xMSsoTyYxMjcpLE8+Pj49NyxELT03fWlmKG4uaGF2ZStrZT5uLm5sZW4rbi5uZGlzdCl7ZS5tc2c9ImludmFsaWQgYml0IGxlbmd0aCByZXBlYXQiLG4ubW9kZT1kcjticmVha31mb3IoO2tlLS07KW4ubGVuc1tuLmhhdmUrK109WHR9fWlmKG4ubW9kZT09PWRyKWJyZWFrO2lmKG4ubGVuc1syNTZdPT09MCl7ZS5tc2c9ImludmFsaWQgY29kZSAtLSBtaXNzaW5nIGVuZC1vZi1ibG9jayIsbi5tb2RlPWRyO2JyZWFrfWlmKG4ubGVuYml0cz05LHNyPXtiaXRzOm4ubGVuYml0c30sanQ9WmwoJGYsbi5sZW5zLDAsbi5ubGVuLG4ubGVuY29kZSwwLG4ud29yayxzciksbi5sZW5iaXRzPXNyLmJpdHMsanQpe2UubXNnPSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RocyBzZXQiLG4ubW9kZT1kcjticmVha31pZihuLmRpc3RiaXRzPTYsbi5kaXN0Y29kZT1uLmRpc3RkeW4sc3I9e2JpdHM6bi5kaXN0Yml0c30sanQ9WmwoVWYsbi5sZW5zLG4ubmxlbixuLm5kaXN0LG4uZGlzdGNvZGUsMCxuLndvcmssc3IpLG4uZGlzdGJpdHM9c3IuYml0cyxqdCl7ZS5tc2c9ImludmFsaWQgZGlzdGFuY2VzIHNldCIsbi5tb2RlPWRyO2JyZWFrfWlmKG4ubW9kZT1PYyx0PT09QWMpYnJlYWsgZTtjYXNlIE9jOm4ubW9kZT1UYztjYXNlIFRjOmlmKGI+PTYmJlU+PTI1OCl7ZS5uZXh0X291dD1oLGUuYXZhaWxfb3V0PVUsZS5uZXh0X2luPXUsZS5hdmFpbF9pbj1iLG4uaG9sZD1PLG4uYml0cz1ELE92KGUsd2UpLGg9ZS5uZXh0X291dCxhPWUub3V0cHV0LFU9ZS5hdmFpbF9vdXQsdT1lLm5leHRfaW4scj1lLmlucHV0LGI9ZS5hdmFpbF9pbixPPW4uaG9sZCxEPW4uYml0cyxuLm1vZGU9PT1KYSYmKG4uYmFjaz0tMSk7YnJlYWt9Zm9yKG4uYmFjaz0wO1p0PW4ubGVuY29kZVtPJigxPDxuLmxlbmJpdHMpLTFdLCR0PVp0Pj4+MjQsTm49WnQ+Pj4xNiYyNTUsRG49WnQmNjU1MzUsISgkdDw9RCk7KXtpZihiPT09MClicmVhayBlO2ItLSxPKz1yW3UrK108PEQsRCs9OH1pZihObiYmKE5uJjI0MCk9PT0wKXtmb3IoZW49JHQsbXQ9Tm4saG49RG47WnQ9bi5sZW5jb2RlW2huKygoTyYoMTw8ZW4rbXQpLTEpPj5lbildLCR0PVp0Pj4+MjQsTm49WnQ+Pj4xNiYyNTUsRG49WnQmNjU1MzUsIShlbiskdDw9RCk7KXtpZihiPT09MClicmVhayBlO2ItLSxPKz1yW3UrK108PEQsRCs9OH1PPj4+PWVuLEQtPWVuLG4uYmFjays9ZW59aWYoTz4+Pj0kdCxELT0kdCxuLmJhY2srPSR0LG4ubGVuZ3RoPURuLE5uPT09MCl7bi5tb2RlPWZkO2JyZWFrfWlmKE5uJjMyKXtuLmJhY2s9LTEsbi5tb2RlPUphO2JyZWFrfWlmKE5uJjY0KXtlLm1zZz0iaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIixuLm1vZGU9ZHI7YnJlYWt9bi5leHRyYT1ObiYxNSxuLm1vZGU9c2Q7Y2FzZSBzZDppZihuLmV4dHJhKXtmb3IoenQ9bi5leHRyYTtEPHp0Oyl7aWYoYj09PTApYnJlYWsgZTtiLS0sTys9clt1KytdPDxELEQrPTh9bi5sZW5ndGgrPU8mKDE8PG4uZXh0cmEpLTEsTz4+Pj1uLmV4dHJhLEQtPW4uZXh0cmEsbi5iYWNrKz1uLmV4dHJhfW4ud2FzPW4ubGVuZ3RoLG4ubW9kZT1sZDtjYXNlIGxkOmZvcig7WnQ9bi5kaXN0Y29kZVtPJigxPDxuLmRpc3RiaXRzKS0xXSwkdD1adD4+PjI0LE5uPVp0Pj4+MTYmMjU1LERuPVp0JjY1NTM1LCEoJHQ8PUQpOyl7aWYoYj09PTApYnJlYWsgZTtiLS0sTys9clt1KytdPDxELEQrPTh9aWYoKE5uJjI0MCk9PT0wKXtmb3IoZW49JHQsbXQ9Tm4saG49RG47WnQ9bi5kaXN0Y29kZVtobisoKE8mKDE8PGVuK210KS0xKT4+ZW4pXSwkdD1adD4+PjI0LE5uPVp0Pj4+MTYmMjU1LERuPVp0JjY1NTM1LCEoZW4rJHQ8PUQpOyl7aWYoYj09PTApYnJlYWsgZTtiLS0sTys9clt1KytdPDxELEQrPTh9Tz4+Pj1lbixELT1lbixuLmJhY2srPWVufWlmKE8+Pj49JHQsRC09JHQsbi5iYWNrKz0kdCxObiY2NCl7ZS5tc2c9ImludmFsaWQgZGlzdGFuY2UgY29kZSIsbi5tb2RlPWRyO2JyZWFrfW4ub2Zmc2V0PURuLG4uZXh0cmE9Tm4mMTUsbi5tb2RlPWNkO2Nhc2UgY2Q6aWYobi5leHRyYSl7Zm9yKHp0PW4uZXh0cmE7RDx6dDspe2lmKGI9PT0wKWJyZWFrIGU7Yi0tLE8rPXJbdSsrXTw8RCxEKz04fW4ub2Zmc2V0Kz1PJigxPDxuLmV4dHJhKS0xLE8+Pj49bi5leHRyYSxELT1uLmV4dHJhLG4uYmFjays9bi5leHRyYX1pZihuLm9mZnNldD5uLmRtYXgpe2UubXNnPSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIsbi5tb2RlPWRyO2JyZWFrfW4ubW9kZT11ZDtjYXNlIHVkOmlmKFU9PT0wKWJyZWFrIGU7aWYoa2U9d2UtVSxuLm9mZnNldD5rZSl7aWYoa2U9bi5vZmZzZXQta2Usa2U+bi53aGF2ZSYmbi5zYW5lKXtlLm1zZz0iaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siLG4ubW9kZT1kcjticmVha31rZT5uLnduZXh0PyhrZS09bi53bmV4dCxFdD1uLndzaXplLWtlKTpFdD1uLnduZXh0LWtlLGtlPm4ubGVuZ3RoJiYoa2U9bi5sZW5ndGgpLGt0PW4ud2luZG93fWVsc2Uga3Q9YSxFdD1oLW4ub2Zmc2V0LGtlPW4ubGVuZ3RoO2tlPlUmJihrZT1VKSxVLT1rZSxuLmxlbmd0aC09a2U7ZG8gYVtoKytdPWt0W0V0KytdO3doaWxlKC0ta2UpO24ubGVuZ3RoPT09MCYmKG4ubW9kZT1UYyk7YnJlYWs7Y2FzZSBmZDppZihVPT09MClicmVhayBlO2FbaCsrXT1uLmxlbmd0aCxVLS0sbi5tb2RlPVRjO2JyZWFrO2Nhc2UgRXU6aWYobi53cmFwKXtmb3IoO0Q8MzI7KXtpZihiPT09MClicmVhayBlO2ItLSxPfD1yW3UrK108PEQsRCs9OH1pZih3ZS09VSxlLnRvdGFsX291dCs9d2Usbi50b3RhbCs9d2Usd2UmJihlLmFkbGVyPW4uY2hlY2s9bi5mbGFncz9zZShuLmNoZWNrLGEsd2UsaC13ZSk6WGUobi5jaGVjayxhLHdlLGgtd2UpKSx3ZT1VLChuLmZsYWdzP086cGQoTykpIT09bi5jaGVjayl7ZS5tc2c9ImluY29ycmVjdCBkYXRhIGNoZWNrIixuLm1vZGU9ZHI7YnJlYWt9Tz0wLEQ9MH1uLm1vZGU9ZGQ7Y2FzZSBkZDppZihuLndyYXAmJm4uZmxhZ3Mpe2Zvcig7RDwzMjspe2lmKGI9PT0wKWJyZWFrIGU7Yi0tLE8rPXJbdSsrXTw8RCxEKz04fWlmKE8hPT0obi50b3RhbCY0Mjk0OTY3Mjk1KSl7ZS5tc2c9ImluY29ycmVjdCBsZW5ndGggY2hlY2siLG4ubW9kZT1kcjticmVha31PPTAsRD0wfW4ubW9kZT1oZDtjYXNlIGhkOmp0PUl2O2JyZWFrIGU7Y2FzZSBkcjpqdD1qZjticmVhayBlO2Nhc2UgZ2Q6cmV0dXJuIHpmO2Nhc2UgUnY6ZGVmYXVsdDpyZXR1cm4gWG99cmV0dXJuIGUubmV4dF9vdXQ9aCxlLmF2YWlsX291dD1VLGUubmV4dF9pbj11LGUuYXZhaWxfaW49YixuLmhvbGQ9TyxuLmJpdHM9RCwobi53c2l6ZXx8d2UhPT1lLmF2YWlsX291dCYmbi5tb2RlPGRyJiYobi5tb2RlPEV1fHx0IT09SGYpKSYmeWQoZSxlLm91dHB1dCxlLm5leHRfb3V0LHdlLWUuYXZhaWxfb3V0KSxnZS09ZS5hdmFpbF9pbix3ZS09ZS5hdmFpbF9vdXQsZS50b3RhbF9pbis9Z2UsZS50b3RhbF9vdXQrPXdlLG4udG90YWwrPXdlLG4ud3JhcCYmd2UmJihlLmFkbGVyPW4uY2hlY2s9bi5mbGFncz9zZShuLmNoZWNrLGEsd2UsZS5uZXh0X291dC13ZSk6WGUobi5jaGVjayxhLHdlLGUubmV4dF9vdXQtd2UpKSxlLmRhdGFfdHlwZT1uLmJpdHMrKG4ubGFzdD82NDowKSsobi5tb2RlPT09SmE/MTI4OjApKyhuLm1vZGU9PT1PY3x8bi5tb2RlPT09YnU/MjU2OjApLChnZT09PTAmJndlPT09MHx8dD09PUhmKSYmanQ9PT16cyYmKGp0PWt2KSxqdH1mdW5jdGlvbiBVdihlKXtpZighZXx8IWUuc3RhdGUpcmV0dXJuIFhvO3ZhciB0PWUuc3RhdGU7cmV0dXJuIHQud2luZG93JiYodC53aW5kb3c9bnVsbCksZS5zdGF0ZT1udWxsLHpzfWZ1bmN0aW9uIEh2KGUsdCl7dmFyIG47cmV0dXJuIWV8fCFlLnN0YXRlfHwobj1lLnN0YXRlLChuLndyYXAmMik9PT0wKT9Ybzoobi5oZWFkPXQsdC5kb25lPSExLHpzKX1mdW5jdGlvbiBqdihlLHQpe3ZhciBuPXQubGVuZ3RoLHIsYSx1O3JldHVybiFlfHwhZS5zdGF0ZXx8KHI9ZS5zdGF0ZSxyLndyYXAhPT0wJiZyLm1vZGUhPT1DYyk/WG86ci5tb2RlPT09Q2MmJihhPTEsYT1YZShhLHQsbiwwKSxhIT09ci5jaGVjayk/amY6KHU9eWQoZSx0LG4sbiksdT8oci5tb2RlPWdkLHpmKTooci5oYXZlZGljdD0xLHpzKSl9dmFyIHp2PW1kLFd2PV9kLEd2PXZkLFl2PUZ2LHF2PWJkLEt2PSR2LEp2PVV2LFp2PUh2LFh2PWp2LFF2PSJwYWtvIGluZmxhdGUgKGZyb20gTm9kZWNhIHByb2plY3QpIixlbT17aW5mbGF0ZVJlc2V0Onp2LGluZmxhdGVSZXNldDI6V3YsaW5mbGF0ZVJlc2V0S2VlcDpHdixpbmZsYXRlSW5pdDpZdixpbmZsYXRlSW5pdDI6cXYsaW5mbGF0ZTpLdixpbmZsYXRlRW5kOkp2LGluZmxhdGVHZXRIZWFkZXI6WnYsaW5mbGF0ZVNldERpY3Rpb25hcnk6WHYsaW5mbGF0ZUluZm86UXZ9LHRtPXtaX05PX0ZMVVNIOjAsWl9QQVJUSUFMX0ZMVVNIOjEsWl9TWU5DX0ZMVVNIOjIsWl9GVUxMX0ZMVVNIOjMsWl9GSU5JU0g6NCxaX0JMT0NLOjUsWl9UUkVFUzo2LFpfT0s6MCxaX1NUUkVBTV9FTkQ6MSxaX05FRURfRElDVDoyLFpfRVJSTk86LTEsWl9TVFJFQU1fRVJST1I6LTIsWl9EQVRBX0VSUk9SOi0zLFpfQlVGX0VSUk9SOi01LFpfTk9fQ09NUFJFU1NJT046MCxaX0JFU1RfU1BFRUQ6MSxaX0JFU1RfQ09NUFJFU1NJT046OSxaX0RFRkFVTFRfQ09NUFJFU1NJT046LTEsWl9GSUxURVJFRDoxLFpfSFVGRk1BTl9PTkxZOjIsWl9STEU6MyxaX0ZJWEVEOjQsWl9ERUZBVUxUX1NUUkFURUdZOjAsWl9CSU5BUlk6MCxaX1RFWFQ6MSxaX1VOS05PV046MixaX0RFRkxBVEVEOjh9O2Z1bmN0aW9uIG5tKCl7dGhpcy50ZXh0PTAsdGhpcy50aW1lPTAsdGhpcy54ZmxhZ3M9MCx0aGlzLm9zPTAsdGhpcy5leHRyYT1udWxsLHRoaXMuZXh0cmFfbGVuPTAsdGhpcy5uYW1lPSIiLHRoaXMuY29tbWVudD0iIix0aGlzLmhjcmM9MCx0aGlzLmRvbmU9ITF9dmFyIHJtPW5tLENsPWVtLElyPXRtLGltPXJtLHdkPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7ZnVuY3Rpb24gV3MoZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgV3MpKXJldHVybiBuZXcgV3MoZSk7dGhpcy5vcHRpb25zPVN0LmFzc2lnbih7Y2h1bmtTaXplOjE2Mzg0LHdpbmRvd0JpdHM6MCx0bzoiIn0sZXx8e30pO3ZhciB0PXRoaXMub3B0aW9uczt0LnJhdyYmdC53aW5kb3dCaXRzPj0wJiZ0LndpbmRvd0JpdHM8MTYmJih0LndpbmRvd0JpdHM9LXQud2luZG93Qml0cyx0LndpbmRvd0JpdHM9PT0wJiYodC53aW5kb3dCaXRzPS0xNSkpLHQud2luZG93Qml0cz49MCYmdC53aW5kb3dCaXRzPDE2JiYhKGUmJmUud2luZG93Qml0cykmJih0LndpbmRvd0JpdHMrPTMyKSx0LndpbmRvd0JpdHM+MTUmJnQud2luZG93Qml0czw0OCYmKHQud2luZG93Qml0cyYxNSk9PT0wJiYodC53aW5kb3dCaXRzfD0xNSksdGhpcy5lcnI9MCx0aGlzLm1zZz0iIix0aGlzLmVuZGVkPSExLHRoaXMuY2h1bmtzPVtdLHRoaXMuc3RybT1uZXcgUmYsdGhpcy5zdHJtLmF2YWlsX291dD0wO3ZhciBuPUNsLmluZmxhdGVJbml0Mih0aGlzLnN0cm0sdC53aW5kb3dCaXRzKTtpZihuIT09SXIuWl9PSyl0aHJvdyBuZXcgRXJyb3IoJGVbbl0pO2lmKHRoaXMuaGVhZGVyPW5ldyBpbSxDbC5pbmZsYXRlR2V0SGVhZGVyKHRoaXMuc3RybSx0aGlzLmhlYWRlciksdC5kaWN0aW9uYXJ5JiYodHlwZW9mIHQuZGljdGlvbmFyeT09InN0cmluZyI/dC5kaWN0aW9uYXJ5PUhzLnN0cmluZzJidWYodC5kaWN0aW9uYXJ5KTp3ZC5jYWxsKHQuZGljdGlvbmFyeSk9PT0iW29iamVjdCBBcnJheUJ1ZmZlcl0iJiYodC5kaWN0aW9uYXJ5PW5ldyBVaW50OEFycmF5KHQuZGljdGlvbmFyeSkpLHQucmF3JiYobj1DbC5pbmZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0sdC5kaWN0aW9uYXJ5KSxuIT09SXIuWl9PSykpKXRocm93IG5ldyBFcnJvcigkZVtuXSl9V3MucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLnN0cm0scj10aGlzLm9wdGlvbnMuY2h1bmtTaXplLGE9dGhpcy5vcHRpb25zLmRpY3Rpb25hcnksdSxoLGIsVSxPLEQ9ITE7aWYodGhpcy5lbmRlZClyZXR1cm4hMTtoPXQ9PT1+fnQ/dDp0PT09ITA/SXIuWl9GSU5JU0g6SXIuWl9OT19GTFVTSCx0eXBlb2YgZT09InN0cmluZyI/bi5pbnB1dD1Icy5iaW5zdHJpbmcyYnVmKGUpOndkLmNhbGwoZSk9PT0iW29iamVjdCBBcnJheUJ1ZmZlcl0iP24uaW5wdXQ9bmV3IFVpbnQ4QXJyYXkoZSk6bi5pbnB1dD1lLG4ubmV4dF9pbj0wLG4uYXZhaWxfaW49bi5pbnB1dC5sZW5ndGg7ZG97aWYobi5hdmFpbF9vdXQ9PT0wJiYobi5vdXRwdXQ9bmV3IFN0LkJ1Zjgociksbi5uZXh0X291dD0wLG4uYXZhaWxfb3V0PXIpLHU9Q2wuaW5mbGF0ZShuLElyLlpfTk9fRkxVU0gpLHU9PT1Jci5aX05FRURfRElDVCYmYSYmKHU9Q2wuaW5mbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLGEpKSx1PT09SXIuWl9CVUZfRVJST1ImJkQ9PT0hMCYmKHU9SXIuWl9PSyxEPSExKSx1IT09SXIuWl9TVFJFQU1fRU5EJiZ1IT09SXIuWl9PSylyZXR1cm4gdGhpcy5vbkVuZCh1KSx0aGlzLmVuZGVkPSEwLCExO24ubmV4dF9vdXQmJihuLmF2YWlsX291dD09PTB8fHU9PT1Jci5aX1NUUkVBTV9FTkR8fG4uYXZhaWxfaW49PT0wJiYoaD09PUlyLlpfRklOSVNIfHxoPT09SXIuWl9TWU5DX0ZMVVNIKSkmJih0aGlzLm9wdGlvbnMudG89PT0ic3RyaW5nIj8oYj1Icy51dGY4Ym9yZGVyKG4ub3V0cHV0LG4ubmV4dF9vdXQpLFU9bi5uZXh0X291dC1iLE89SHMuYnVmMnN0cmluZyhuLm91dHB1dCxiKSxuLm5leHRfb3V0PVUsbi5hdmFpbF9vdXQ9ci1VLFUmJlN0LmFycmF5U2V0KG4ub3V0cHV0LG4ub3V0cHV0LGIsVSwwKSx0aGlzLm9uRGF0YShPKSk6dGhpcy5vbkRhdGEoU3Quc2hyaW5rQnVmKG4ub3V0cHV0LG4ubmV4dF9vdXQpKSksbi5hdmFpbF9pbj09PTAmJm4uYXZhaWxfb3V0PT09MCYmKEQ9ITApfXdoaWxlKChuLmF2YWlsX2luPjB8fG4uYXZhaWxfb3V0PT09MCkmJnUhPT1Jci5aX1NUUkVBTV9FTkQpO3JldHVybiB1PT09SXIuWl9TVFJFQU1fRU5EJiYoaD1Jci5aX0ZJTklTSCksaD09PUlyLlpfRklOSVNIPyh1PUNsLmluZmxhdGVFbmQodGhpcy5zdHJtKSx0aGlzLm9uRW5kKHUpLHRoaXMuZW5kZWQ9ITAsdT09PUlyLlpfT0spOihoPT09SXIuWl9TWU5DX0ZMVVNIJiYodGhpcy5vbkVuZChJci5aX09LKSxuLmF2YWlsX291dD0wKSwhMCl9LFdzLnByb3RvdHlwZS5vbkRhdGE9ZnVuY3Rpb24oZSl7dGhpcy5jaHVua3MucHVzaChlKX0sV3MucHJvdG90eXBlLm9uRW5kPWZ1bmN0aW9uKGUpe2U9PT1Jci5aX09LJiYodGhpcy5vcHRpb25zLnRvPT09InN0cmluZyI/dGhpcy5yZXN1bHQ9dGhpcy5jaHVua3Muam9pbigiIik6dGhpcy5yZXN1bHQ9U3QuZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcykpLHRoaXMuY2h1bmtzPVtdLHRoaXMuZXJyPWUsdGhpcy5tc2c9dGhpcy5zdHJtLm1zZ307ZnVuY3Rpb24gU3UoZSx0KXt2YXIgbj1uZXcgV3ModCk7aWYobi5wdXNoKGUsITApLG4uZXJyKXRocm93IG4ubXNnfHwkZVtuLmVycl07cmV0dXJuIG4ucmVzdWx0fWZ1bmN0aW9uIG9tKGUsdCl7cmV0dXJuIHQ9dHx8e30sdC5yYXc9ITAsU3UoZSx0KX12YXIgYW09V3Msc209U3UsbG09b20sY209U3UsdW09e0luZmxhdGU6YW0saW5mbGF0ZTpzbSxpbmZsYXRlUmF3OmxtLHVuZ3ppcDpjbX0sZm09X3YsZG09dW0saG09U3QuYXNzaWduLFNkPXt9O2htKFNkLGZtLGRtLElyKTt2YXIgQWQ9U2Q7bGV0IGdtPSJ1cHgycHgiLHBtPVt7bmFtZToidXB4Iix0eXBlOltOdW1iZXIsU3RyaW5nXSxyZXF1aXJlZDohMH1dLHZtPTFlLTQsbW09NzUwLENkPSExLEF1PTAsT2Q9MCxUZD05NjAsUGQ9Mzc1O2Z1bmN0aW9uIF9tKCl7bGV0e3BsYXRmb3JtOmUscGl4ZWxSYXRpbzp0LHdpbmRvd1dpZHRoOm59PU5vKCk7QXU9bixPZD10LENkPWU9PT0iaW9zIn1mdW5jdGlvbiBJZChlLHQpe2xldCBuPU51bWJlcihlKTtyZXR1cm4gaXNOYU4obik/dDpufWZ1bmN0aW9uIGJtKCl7bGV0IGU9VC5nbG9iYWxTdHlsZXx8e307VGQ9SWQoZS5ycHhDYWxjTWF4RGV2aWNlV2lkdGgsOTYwKSxQZD1JZChlLnJweENhbGNCYXNlRGV2aWNlV2lkdGgsMzc1KX1sZXQgRW09TXQoZ20sKGUsdCk9PntpZihBdT09PTAmJihfbSgpLGJtKCkpLGU9TnVtYmVyKGUpLGU9PT0wKXJldHVybiAwO2xldCBuPXR8fEF1O249bjw9VGQ/bjpQZDtsZXQgcj1lL21tKm47cmV0dXJuIHI8MCYmKHI9LXIpLHI9TWF0aC5mbG9vcihyK3ZtKSxyPT09MCYmKE9kPT09MXx8IUNkP3I9MTpyPS41KSxlPDA/LXI6cn0scG0pLHltPSJhZGRJbnRlcmNlcHRvciIsd209InJlbW92ZUludGVyY2VwdG9yIixOZD1be25hbWU6Im1ldGhvZCIsdHlwZTpbU3RyaW5nLE9iamVjdF0scmVxdWlyZWQ6ITB9XSxTbT1OZDtmdW5jdGlvbiBrZChlLHQpe09iamVjdC5rZXlzKHQpLmZvckVhY2gobj0+e1kuaXNGdW5jdGlvbih0W25dKSYmKGVbbl09QW0oZVtuXSx0W25dKSl9KX1mdW5jdGlvbiBSZChlLHQpeyFlfHwhdHx8T2JqZWN0LmtleXModCkuZm9yRWFjaChuPT57bGV0IHI9ZVtuXSxhPXRbbl07WS5pc0FycmF5KHIpJiZZLmlzRnVuY3Rpb24oYSkmJlkucmVtb3ZlKHIsYSl9KX1mdW5jdGlvbiBBbShlLHQpe2xldCBuPXQ/ZT9lLmNvbmNhdCh0KTpZLmlzQXJyYXkodCk/dDpbdF06ZTtyZXR1cm4gbiYmQ20obil9ZnVuY3Rpb24gQ20oZSl7bGV0IHQ9W107Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspdC5pbmRleE9mKGVbbl0pPT09LTEmJnQucHVzaChlW25dKTtyZXR1cm4gdH1sZXQgT209TXQoeW0sKGUsdCk9PntZLmlzU3RyaW5nKGUpJiZZLmlzUGxhaW5PYmplY3QodCk/a2QoU3JbZV18fChTcltlXT17fSksdCk6WS5pc1BsYWluT2JqZWN0KGUpJiZrZChqcixlKX0sTmQpLFRtPU10KHdtLChlLHQpPT57WS5pc1N0cmluZyhlKT9ZLmlzUGxhaW5PYmplY3QodCk/UmQoU3JbZV0sdCk6ZGVsZXRlIFNyW2VdOlkuaXNQbGFpbk9iamVjdChlKSYmUmQoanIsZSl9LFNtKSxQbT17fSxJbT0iJG9uIix4ZD1be25hbWU6ImV2ZW50Iix0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0se25hbWU6ImNhbGxiYWNrIix0eXBlOkZ1bmN0aW9uLHJlcXVpcmVkOiEwfV0sTm09IiRvbmNlIixrbT14ZCxSbT0iJG9mZiIseG09W3tuYW1lOiJldmVudCIsdHlwZTpbU3RyaW5nLEFycmF5XX0se25hbWU6ImNhbGxiYWNrIix0eXBlOkZ1bmN0aW9ufV0sQm09IiRlbWl0IixNbT1be25hbWU6ImV2ZW50Iix0eXBlOlN0cmluZyxyZXF1aXJlZDohMH1dLEdzPW5ldyB0ZS5FbWl0dGVyLExtPU10KEltLChlLHQpPT4oR3Mub24oZSx0KSwoKT0+R3Mub2ZmKGUsdCkpLHhkKSxEbT1NdChObSwoZSx0KT0+KEdzLm9uY2UoZSx0KSwoKT0+R3Mub2ZmKGUsdCkpLGttKSxGbT1NdChSbSwoZSx0KT0+e2lmKCFlKXtHcy5lPXt9O3JldHVybn1ZLmlzQXJyYXkoZSl8fChlPVtlXSksZS5mb3JFYWNoKG49PkdzLm9mZihuLHQpKX0seG0pLFZtPU10KEJtLChlLC4uLnQpPT57R3MuZW1pdChlLC4uLnQpfSxNbSksQmQ9W3tuYW1lOiJpZCIsdHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9XSwkbT0iY3JlYXRlVmlkZW9Db250ZXh0IixVbT0iY3JlYXRlTWFwQ29udGV4dCIsSG09QmQsam09ImNyZWF0ZUNhbnZhc0NvbnRleHQiLHptPVt7bmFtZToiY2FudmFzSWQiLHR5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSx7bmFtZToiY29tcG9uZW50SW5zdGFuY2UiLHR5cGU6T2JqZWN0fV0sV209ImNyZWF0ZUlubmVyQXVkaW9Db250ZXh0IixHbT0iY3JlYXRlTGl2ZVB1c2hlckNvbnRleHQiLFltPUJkLmNvbmNhdCh7bmFtZToiY29tcG9uZW50SW5zdGFuY2UiLHR5cGU6T2JqZWN0fSkscW09Wy41LC44LDEsMS4yNSwxLjUsMl07Y2xhc3MgQ3V7Y29uc3RydWN0b3IodCxuKXt0aGlzLmlkPXQsdGhpcy5wYWdlSWQ9bn1wbGF5KCl7WXQodGhpcy5pZCx0aGlzLnBhZ2VJZCwicGxheSIpfXBhdXNlKCl7WXQodGhpcy5pZCx0aGlzLnBhZ2VJZCwicGF1c2UiKX1zdG9wKCl7WXQodGhpcy5pZCx0aGlzLnBhZ2VJZCwic3RvcCIpfXNlZWsodCl7WXQodGhpcy5pZCx0aGlzLnBhZ2VJZCwic2VlayIse3Bvc2l0aW9uOnR9KX1zZW5kRGFubXUodCl7WXQodGhpcy5pZCx0aGlzLnBhZ2VJZCwic2VuZERhbm11Iix0KX1wbGF5YmFja1JhdGUodCl7fnFtLmluZGV4T2YodCl8fCh0PTEpLFl0KHRoaXMuaWQsdGhpcy5wYWdlSWQsInBsYXliYWNrUmF0ZSIse3JhdGU6dH0pfXJlcXVlc3RGdWxsU2NyZWVuKHQ9e30pe1l0KHRoaXMuaWQsdGhpcy5wYWdlSWQsInJlcXVlc3RGdWxsU2NyZWVuIix0KX1leGl0RnVsbFNjcmVlbigpe1l0KHRoaXMuaWQsdGhpcy5wYWdlSWQsImV4aXRGdWxsU2NyZWVuIil9c2hvd1N0YXR1c0Jhcigpe1l0KHRoaXMuaWQsdGhpcy5wYWdlSWQsInNob3dTdGF0dXNCYXIiKX1oaWRlU3RhdHVzQmFyKCl7WXQodGhpcy5pZCx0aGlzLnBhZ2VJZCwiaGlkZVN0YXR1c0JhciIpfX1sZXQgS209TXQoJG0sKGUsdCk9PnQ/bmV3IEN1KGUsZnIodCkpOm5ldyBDdShlLGZyKExyKCkpKSksSm09KGUsdCk9PntsZXQgbj10LmVyck1zZ3x8IiI7bmV3IFJlZ0V4cCgiXFw6XFxzKmZhaWwiKS50ZXN0KG4pP2UuZmFpbCYmZS5mYWlsKHQpOmUuc3VjY2VzcyYmZS5zdWNjZXNzKHQpLGUuY29tcGxldGUmJmUuY29tcGxldGUodCl9LHhpPShlLHQsbixyKT0+e0FhKGUsdCxuLHIsYT0+e3ImJkptKHIsYSl9KX07Y2xhc3MgT3V7Y29uc3RydWN0b3IodCxuKXt0aGlzLmlkPXQsdGhpcy5wYWdlSWQ9bn1nZXRDZW50ZXJMb2NhdGlvbih0KXt4aSh0aGlzLmlkLHRoaXMucGFnZUlkLCJnZXRDZW50ZXJMb2NhdGlvbiIsdCl9bW92ZVRvTG9jYXRpb24odCl7eGkodGhpcy5pZCx0aGlzLnBhZ2VJZCwibW92ZVRvTG9jYXRpb24iLHQpfWdldFNjYWxlKHQpe3hpKHRoaXMuaWQsdGhpcy5wYWdlSWQsImdldFNjYWxlIix0KX1nZXRSZWdpb24odCl7eGkodGhpcy5pZCx0aGlzLnBhZ2VJZCwiZ2V0UmVnaW9uIix0KX1pbmNsdWRlUG9pbnRzKHQpe3hpKHRoaXMuaWQsdGhpcy5wYWdlSWQsImluY2x1ZGVQb2ludHMiLHQpfXRyYW5zbGF0ZU1hcmtlcih0KXt4aSh0aGlzLmlkLHRoaXMucGFnZUlkLCJ0cmFuc2xhdGVNYXJrZXIiLHQpfSRnZXRBcHBNYXAoKXtyZXR1cm4gbC5tYXBzLmdldE1hcEJ5SWQodGhpcy5wYWdlSWQrIi1tYXAtIit0aGlzLmlkKX1hZGRDdXN0b21MYXllcih0KXt4aSh0aGlzLmlkLHRoaXMucGFnZUlkLCJhZGRDdXN0b21MYXllciIsdCl9cmVtb3ZlQ3VzdG9tTGF5ZXIodCl7eGkodGhpcy5pZCx0aGlzLnBhZ2VJZCwicmVtb3ZlQ3VzdG9tTGF5ZXIiLHQpfWFkZEdyb3VuZE92ZXJsYXkodCl7eGkodGhpcy5pZCx0aGlzLnBhZ2VJZCwiYWRkR3JvdW5kT3ZlcmxheSIsdCl9cmVtb3ZlR3JvdW5kT3ZlcmxheSh0KXt4aSh0aGlzLmlkLHRoaXMucGFnZUlkLCJyZW1vdmVHcm91bmRPdmVybGF5Iix0KX11cGRhdGVHcm91bmRPdmVybGF5KHQpe3hpKHRoaXMuaWQsdGhpcy5wYWdlSWQsInVwZGF0ZUdyb3VuZE92ZXJsYXkiLHQpfWluaXRNYXJrZXJDbHVzdGVyKHQpe3hpKHRoaXMuaWQsdGhpcy5wYWdlSWQsImluaXRNYXJrZXJDbHVzdGVyIix0KX1hZGRNYXJrZXJzKHQpe3hpKHRoaXMuaWQsdGhpcy5wYWdlSWQsImFkZE1hcmtlcnMiLHQpfXJlbW92ZU1hcmtlcnModCl7eGkodGhpcy5pZCx0aGlzLnBhZ2VJZCwicmVtb3ZlTWFya2VycyIsdCl9bW92ZUFsb25nKHQpe3hpKHRoaXMuaWQsdGhpcy5wYWdlSWQsIm1vdmVBbG9uZyIsdCl9b3Blbk1hcEFwcCh0KXt4aSh0aGlzLmlkLHRoaXMucGFnZUlkLCJvcGVuTWFwQXBwIix0KX1vbih0KXt4aSh0aGlzLmlkLHRoaXMucGFnZUlkLCJvbiIsdCl9fWxldCBabT1NdChVbSwoZSx0KT0+dD9uZXcgT3UoZSxmcih0KSk6bmV3IE91KGUsZnIoTHIoKSkpLEhtKTtmdW5jdGlvbiBtcyhlLHQpe3JldHVybiBmdW5jdGlvbihuLHIpe24/cltlXT1NYXRoLnJvdW5kKG4pOnR5cGVvZiB0IT0idW5kZWZpbmVkIiYmKHJbZV09dCl9fWxldCBNZD1tcygid2lkdGgiKSxMZD1tcygiaGVpZ2h0IiksWG09ImNhbnZhc0dldEltYWdlRGF0YSIsRGQ9e2Zvcm1hdEFyZ3M6e3g6bXMoIngiKSx5Om1zKCJ5Iiksd2lkdGg6TWQsaGVpZ2h0OkxkfX0sRmQ9e2NhbnZhc0lkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0seDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITB9LHk6e3R5cGU6TnVtYmVyLHJlcXVpcmVkOiEwfSx3aWR0aDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITB9LGhlaWdodDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITB9fSxRbT0iY2FudmFzUHV0SW1hZ2VEYXRhIixlXz1EZCx0Xz1ZLmV4dGVuZCh7ZGF0YTp7dHlwZTpVaW50OENsYW1wZWRBcnJheSxyZXF1aXJlZDohMH19LEZkLHtoZWlnaHQ6e3R5cGU6TnVtYmVyfX0pLFZkPXtQTkc6InBuZyIsSlBHOiJqcGciLEpQRUc6ImpwZyJ9LG5fPSJjYW52YXNUb1RlbXBGaWxlUGF0aCIscl89e2Zvcm1hdEFyZ3M6e3g6bXMoIngiLDApLHk6bXMoInkiLDApLHdpZHRoOk1kLGhlaWdodDpMZCxkZXN0V2lkdGg6bXMoImRlc3RXaWR0aCIpLGRlc3RIZWlnaHQ6bXMoImRlc3RIZWlnaHQiKSxmaWxlVHlwZShlLHQpe2U9KGV8fCIiKS50b1VwcGVyQ2FzZSgpO2xldCBuPVZkW2VdO258fChuPVZkLlBORyksdC5maWxlVHlwZT1ufSxxdWFsaXR5KGUsdCl7dC5xdWFsaXR5PWUmJmU+MCYmZTwxP2U6MX19fSxpXz17eDpOdW1iZXIseTpOdW1iZXIsd2lkdGg6TnVtYmVyLGhlaWdodDpOdW1iZXIsZGVzdFdpZHRoOk51bWJlcixkZXN0SGVpZ2h0Ok51bWJlcixjYW52YXNJZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LGZpbGVUeXBlOlN0cmluZyxxdWFsaXR5Ok51bWJlcn07ZnVuY3Rpb24gUGMoZSx0LG4scixhKXtzdC5pbnZva2VWaWV3TWV0aG9kKGBjYW52YXMuJHtlfWAse3R5cGU6bixkYXRhOnJ9LHQsdT0+e2EmJmEodSl9KX12YXIgb189WyJzY2FsZSIsInJvdGF0ZSIsInRyYW5zbGF0ZSIsInNldFRyYW5zZm9ybSIsInRyYW5zZm9ybSJdLGFfPVsiZHJhd0ltYWdlIiwiZmlsbFRleHQiLCJmaWxsIiwic3Ryb2tlIiwiZmlsbFJlY3QiLCJzdHJva2VSZWN0IiwiY2xlYXJSZWN0Iiwic3Ryb2tlVGV4dCJdLHNfPVsic2V0RmlsbFN0eWxlIiwic2V0VGV4dEFsaWduIiwic2V0U3Ryb2tlU3R5bGUiLCJzZXRHbG9iYWxBbHBoYSIsInNldFNoYWRvdyIsInNldEZvbnRTaXplIiwic2V0TGluZUNhcCIsInNldExpbmVKb2luIiwic2V0TGluZVdpZHRoIiwic2V0TWl0ZXJMaW1pdCIsInNldFRleHRCYXNlbGluZSIsInNldExpbmVEYXNoIl07ZnVuY3Rpb24gbF8oZSx0KXtsZXQgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0KCIyZCIpO3JldHVybiByLmZvbnQ9dCxyLm1lYXN1cmVUZXh0KGUpLndpZHRofHwwfWxldCAkZD17YWxpY2VibHVlOiIjZjBmOGZmIixhbnRpcXVld2hpdGU6IiNmYWViZDciLGFxdWE6IiMwMGZmZmYiLGFxdWFtYXJpbmU6IiM3ZmZmZDQiLGF6dXJlOiIjZjBmZmZmIixiZWlnZToiI2Y1ZjVkYyIsYmlzcXVlOiIjZmZlNGM0IixibGFjazoiIzAwMDAwMCIsYmxhbmNoZWRhbG1vbmQ6IiNmZmViY2QiLGJsdWU6IiMwMDAwZmYiLGJsdWV2aW9sZXQ6IiM4YTJiZTIiLGJyb3duOiIjYTUyYTJhIixidXJseXdvb2Q6IiNkZWI4ODciLGNhZGV0Ymx1ZToiIzVmOWVhMCIsY2hhcnRyZXVzZToiIzdmZmYwMCIsY2hvY29sYXRlOiIjZDI2OTFlIixjb3JhbDoiI2ZmN2Y1MCIsY29ybmZsb3dlcmJsdWU6IiM2NDk1ZWQiLGNvcm5zaWxrOiIjZmZmOGRjIixjcmltc29uOiIjZGMxNDNjIixjeWFuOiIjMDBmZmZmIixkYXJrYmx1ZToiIzAwMDA4YiIsZGFya2N5YW46IiMwMDhiOGIiLGRhcmtnb2xkZW5yb2Q6IiNiODg2MGIiLGRhcmtncmF5OiIjYTlhOWE5IixkYXJrZ3JleToiI2E5YTlhOSIsZGFya2dyZWVuOiIjMDA2NDAwIixkYXJra2hha2k6IiNiZGI3NmIiLGRhcmttYWdlbnRhOiIjOGIwMDhiIixkYXJrb2xpdmVncmVlbjoiIzU1NmIyZiIsZGFya29yYW5nZToiI2ZmOGMwMCIsZGFya29yY2hpZDoiIzk5MzJjYyIsZGFya3JlZDoiIzhiMDAwMCIsZGFya3NhbG1vbjoiI2U5OTY3YSIsZGFya3NlYWdyZWVuOiIjOGZiYzhmIixkYXJrc2xhdGVibHVlOiIjNDgzZDhiIixkYXJrc2xhdGVncmF5OiIjMmY0ZjRmIixkYXJrc2xhdGVncmV5OiIjMmY0ZjRmIixkYXJrdHVycXVvaXNlOiIjMDBjZWQxIixkYXJrdmlvbGV0OiIjOTQwMGQzIixkZWVwcGluazoiI2ZmMTQ5MyIsZGVlcHNreWJsdWU6IiMwMGJmZmYiLGRpbWdyYXk6IiM2OTY5NjkiLGRpbWdyZXk6IiM2OTY5NjkiLGRvZGdlcmJsdWU6IiMxZTkwZmYiLGZpcmVicmljazoiI2IyMjIyMiIsZmxvcmFsd2hpdGU6IiNmZmZhZjAiLGZvcmVzdGdyZWVuOiIjMjI4YjIyIixmdWNoc2lhOiIjZmYwMGZmIixnYWluc2Jvcm86IiNkY2RjZGMiLGdob3N0d2hpdGU6IiNmOGY4ZmYiLGdvbGQ6IiNmZmQ3MDAiLGdvbGRlbnJvZDoiI2RhYTUyMCIsZ3JheToiIzgwODA4MCIsZ3JleToiIzgwODA4MCIsZ3JlZW46IiMwMDgwMDAiLGdyZWVueWVsbG93OiIjYWRmZjJmIixob25leWRldzoiI2YwZmZmMCIsaG90cGluazoiI2ZmNjliNCIsaW5kaWFucmVkOiIjY2Q1YzVjIixpbmRpZ286IiM0YjAwODIiLGl2b3J5OiIjZmZmZmYwIixraGFraToiI2YwZTY4YyIsbGF2ZW5kZXI6IiNlNmU2ZmEiLGxhdmVuZGVyYmx1c2g6IiNmZmYwZjUiLGxhd25ncmVlbjoiIzdjZmMwMCIsbGVtb25jaGlmZm9uOiIjZmZmYWNkIixsaWdodGJsdWU6IiNhZGQ4ZTYiLGxpZ2h0Y29yYWw6IiNmMDgwODAiLGxpZ2h0Y3lhbjoiI2UwZmZmZiIsbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IiNmYWZhZDIiLGxpZ2h0Z3JheToiI2QzZDNkMyIsbGlnaHRncmV5OiIjZDNkM2QzIixsaWdodGdyZWVuOiIjOTBlZTkwIixsaWdodHBpbms6IiNmZmI2YzEiLGxpZ2h0c2FsbW9uOiIjZmZhMDdhIixsaWdodHNlYWdyZWVuOiIjMjBiMmFhIixsaWdodHNreWJsdWU6IiM4N2NlZmEiLGxpZ2h0c2xhdGVncmF5OiIjNzc4ODk5IixsaWdodHNsYXRlZ3JleToiIzc3ODg5OSIsbGlnaHRzdGVlbGJsdWU6IiNiMGM0ZGUiLGxpZ2h0eWVsbG93OiIjZmZmZmUwIixsaW1lOiIjMDBmZjAwIixsaW1lZ3JlZW46IiMzMmNkMzIiLGxpbmVuOiIjZmFmMGU2IixtYWdlbnRhOiIjZmYwMGZmIixtYXJvb246IiM4MDAwMDAiLG1lZGl1bWFxdWFtYXJpbmU6IiM2NmNkYWEiLG1lZGl1bWJsdWU6IiMwMDAwY2QiLG1lZGl1bW9yY2hpZDoiI2JhNTVkMyIsbWVkaXVtcHVycGxlOiIjOTM3MGRiIixtZWRpdW1zZWFncmVlbjoiIzNjYjM3MSIsbWVkaXVtc2xhdGVibHVlOiIjN2I2OGVlIixtZWRpdW1zcHJpbmdncmVlbjoiIzAwZmE5YSIsbWVkaXVtdHVycXVvaXNlOiIjNDhkMWNjIixtZWRpdW12aW9sZXRyZWQ6IiNjNzE1ODUiLG1pZG5pZ2h0Ymx1ZToiIzE5MTk3MCIsbWludGNyZWFtOiIjZjVmZmZhIixtaXN0eXJvc2U6IiNmZmU0ZTEiLG1vY2Nhc2luOiIjZmZlNGI1IixuYXZham93aGl0ZToiI2ZmZGVhZCIsbmF2eToiIzAwMDA4MCIsb2xkbGFjZToiI2ZkZjVlNiIsb2xpdmU6IiM4MDgwMDAiLG9saXZlZHJhYjoiIzZiOGUyMyIsb3JhbmdlOiIjZmZhNTAwIixvcmFuZ2VyZWQ6IiNmZjQ1MDAiLG9yY2hpZDoiI2RhNzBkNiIscGFsZWdvbGRlbnJvZDoiI2VlZThhYSIscGFsZWdyZWVuOiIjOThmYjk4IixwYWxldHVycXVvaXNlOiIjYWZlZWVlIixwYWxldmlvbGV0cmVkOiIjZGI3MDkzIixwYXBheWF3aGlwOiIjZmZlZmQ1IixwZWFjaHB1ZmY6IiNmZmRhYjkiLHBlcnU6IiNjZDg1M2YiLHBpbms6IiNmZmMwY2IiLHBsdW06IiNkZGEwZGQiLHBvd2RlcmJsdWU6IiNiMGUwZTYiLHB1cnBsZToiIzgwMDA4MCIscmViZWNjYXB1cnBsZToiIzY2MzM5OSIscmVkOiIjZmYwMDAwIixyb3N5YnJvd246IiNiYzhmOGYiLHJveWFsYmx1ZToiIzQxNjllMSIsc2FkZGxlYnJvd246IiM4YjQ1MTMiLHNhbG1vbjoiI2ZhODA3MiIsc2FuZHlicm93bjoiI2Y0YTQ2MCIsc2VhZ3JlZW46IiMyZThiNTciLHNlYXNoZWxsOiIjZmZmNWVlIixzaWVubmE6IiNhMDUyMmQiLHNpbHZlcjoiI2MwYzBjMCIsc2t5Ymx1ZToiIzg3Y2VlYiIsc2xhdGVibHVlOiIjNmE1YWNkIixzbGF0ZWdyYXk6IiM3MDgwOTAiLHNsYXRlZ3JleToiIzcwODA5MCIsc25vdzoiI2ZmZmFmYSIsc3ByaW5nZ3JlZW46IiMwMGZmN2YiLHN0ZWVsYmx1ZToiIzQ2ODJiNCIsdGFuOiIjZDJiNDhjIix0ZWFsOiIjMDA4MDgwIix0aGlzdGxlOiIjZDhiZmQ4Iix0b21hdG86IiNmZjYzNDciLHR1cnF1b2lzZToiIzQwZTBkMCIsdmlvbGV0OiIjZWU4MmVlIix3aGVhdDoiI2Y1ZGViMyIsd2hpdGU6IiNmZmZmZmYiLHdoaXRlc21va2U6IiNmNWY1ZjUiLHllbGxvdzoiI2ZmZmYwMCIseWVsbG93Z3JlZW46IiM5YWNkMzIiLHRyYW5zcGFyZW50OiIjMDAwMDAwMDAifTtmdW5jdGlvbiBUdShlKXtlPWV8fCIjMDAwMDAwIjt2YXIgdD1udWxsO2lmKCh0PS9eIyhbMC05fEEtRnxhLWZdezZ9KSQvLmV4ZWMoZSkpIT1udWxsKXtsZXQgcj1wYXJzZUludCh0WzFdLnNsaWNlKDAsMiksMTYpLGE9cGFyc2VJbnQodFsxXS5zbGljZSgyLDQpLDE2KSx1PXBhcnNlSW50KHRbMV0uc2xpY2UoNCksMTYpO3JldHVybltyLGEsdSwyNTVdfWlmKCh0PS9eIyhbMC05fEEtRnxhLWZdezN9KSQvLmV4ZWMoZSkpIT1udWxsKXtsZXQgcj10WzFdLnNsaWNlKDAsMSksYT10WzFdLnNsaWNlKDEsMiksdT10WzFdLnNsaWNlKDIsMyk7cmV0dXJuIHI9cGFyc2VJbnQocityLDE2KSxhPXBhcnNlSW50KGErYSwxNiksdT1wYXJzZUludCh1K3UsMTYpLFtyLGEsdSwyNTVdfWlmKCh0PS9ecmdiXCgoLispXCkkLy5leGVjKGUpKSE9bnVsbClyZXR1cm4gdFsxXS5zcGxpdCgiLCIpLm1hcChmdW5jdGlvbihyKXtyZXR1cm4gTWF0aC5taW4oMjU1LHBhcnNlSW50KHIudHJpbSgpKSl9KS5jb25jYXQoMjU1KTtpZigodD0vXnJnYmFcKCguKylcKSQvLmV4ZWMoZSkpIT1udWxsKXJldHVybiB0WzFdLnNwbGl0KCIsIikubWFwKGZ1bmN0aW9uKHIsYSl7cmV0dXJuIGE9PT0zP01hdGguZmxvb3IoMjU1KnBhcnNlRmxvYXQoci50cmltKCkpKTpNYXRoLm1pbigyNTUscGFyc2VJbnQoci50cmltKCkpKX0pO3ZhciBuPWUudG9Mb3dlckNhc2UoKTtpZihZLmhhc093bigkZCxuKSl7dD0vXiMoWzAtOXxBLUZ8YS1mXXs2LDh9KSQvLmV4ZWMoJGRbbl0pO2xldCByPXBhcnNlSW50KHRbMV0uc2xpY2UoMCwyKSwxNiksYT1wYXJzZUludCh0WzFdLnNsaWNlKDIsNCksMTYpLHU9cGFyc2VJbnQodFsxXS5zbGljZSg0LDYpLDE2KSxoPXBhcnNlSW50KHRbMV0uc2xpY2UoNiw4KSwxNik7cmV0dXJuIGg9aD49MD9oOjI1NSxbcixhLHUsaF19cmV0dXJuIGNvbnNvbGUuZXJyb3IoInVuc3VwcG9ydGVkIGNvbG9yOiIrZSksWzAsMCwwLDI1NV19Y2xhc3MgVWR7Y29uc3RydWN0b3IodCxuKXt0aGlzLnR5cGU9dCx0aGlzLmRhdGE9bix0aGlzLmNvbG9yU3RvcD1bXX1hZGRDb2xvclN0b3AodCxuKXt0aGlzLmNvbG9yU3RvcC5wdXNoKFt0LFR1KG4pXSl9fWNsYXNzIGNfe2NvbnN0cnVjdG9yKHQsbil7dGhpcy50eXBlPSJwYXR0ZXJuIix0aGlzLmRhdGE9dCx0aGlzLmNvbG9yU3RvcD1ufX1jbGFzcyB1X3tjb25zdHJ1Y3Rvcih0KXt0aGlzLndpZHRoPXR9fWNsYXNzIFhse2NvbnN0cnVjdG9yKHQsbil7dGhpcy5pZD10LHRoaXMucGFnZUlkPW4sdGhpcy5hY3Rpb25zPVtdLHRoaXMucGF0aD1bXSx0aGlzLnN1YnBhdGg9W10sdGhpcy5kcmF3aW5nU3RhdGU9W10sdGhpcy5zdGF0ZT17bGluZURhc2g6WzAsMF0sc2hhZG93T2Zmc2V0WDowLHNoYWRvd09mZnNldFk6MCxzaGFkb3dCbHVyOjAsc2hhZG93Q29sb3I6WzAsMCwwLDBdLGZvbnQ6IjEwcHggc2Fucy1zZXJpZiIsZm9udFNpemU6MTAsZm9udFdlaWdodDoibm9ybWFsIixmb250U3R5bGU6Im5vcm1hbCIsZm9udEZhbWlseToic2Fucy1zZXJpZiJ9fWRyYXcodD0hMSxuKXt2YXIgcj1bLi4udGhpcy5hY3Rpb25zXTt0aGlzLmFjdGlvbnM9W10sdGhpcy5wYXRoPVtdLFBjKHRoaXMuaWQsdGhpcy5wYWdlSWQsImFjdGlvbnNDaGFuZ2VkIix7YWN0aW9uczpyLHJlc2VydmU6dH0sbil9Y3JlYXRlTGluZWFyR3JhZGllbnQodCxuLHIsYSl7cmV0dXJuIG5ldyBVZCgibGluZWFyIixbdCxuLHIsYV0pfWNyZWF0ZUNpcmN1bGFyR3JhZGllbnQodCxuLHIpe3JldHVybiBuZXcgVWQoInJhZGlhbCIsW3QsbixyXSl9Y3JlYXRlUGF0dGVybih0LG4pe2lmKG49PT12b2lkIDApY29uc29sZS5lcnJvcigiRmFpbGVkIHRvIGV4ZWN1dGUgJ2NyZWF0ZVBhdHRlcm4nIG9uICdDYW52YXNDb250ZXh0JzogMiBhcmd1bWVudHMgcmVxdWlyZWQsIGJ1dCBvbmx5IDEgcHJlc2VudC4iKTtlbHNlIGlmKFsicmVwZWF0IiwicmVwZWF0LXgiLCJyZXBlYXQteSIsIm5vLXJlcGVhdCJdLmluZGV4T2Yobik8MCljb25zb2xlLmVycm9yKCJGYWlsZWQgdG8gZXhlY3V0ZSAnY3JlYXRlUGF0dGVybicgb24gJ0NhbnZhc0NvbnRleHQnOiBUaGUgcHJvdmlkZWQgdHlwZSAoJyIrbisiJykgaXMgbm90IG9uZSBvZiAncmVwZWF0JywgJ25vLXJlcGVhdCcsICdyZXBlYXQteCcsIG9yICdyZXBlYXQteScuIik7ZWxzZSByZXR1cm4gbmV3IGNfKHQsbil9bWVhc3VyZVRleHQodCl7bGV0IG49dGhpcy5zdGF0ZS5mb250LHI9MDt7bGV0IGE9bC53ZWJ2aWV3LmFsbCgpLmZpbmQodT0+dS5nZXRVUkwoKS5lbmRzV2l0aCgid3d3L19fdW5pYXBwdmlldy5odG1sIikpO2EmJihyPU51bWJlcihhLmV2YWxKU1N5bmMoYCgke2xfLnRvU3RyaW5nKCl9KSgke0pTT04uc3RyaW5naWZ5KHQpfSwke0pTT04uc3RyaW5naWZ5KG4pfSlgKSkpfXJldHVybiBuZXcgdV8ocil9c2F2ZSgpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNhdmUiLGRhdGE6W119KSx0aGlzLmRyYXdpbmdTdGF0ZS5wdXNoKHRoaXMuc3RhdGUpfXJlc3RvcmUoKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJyZXN0b3JlIixkYXRhOltdfSksdGhpcy5zdGF0ZT10aGlzLmRyYXdpbmdTdGF0ZS5wb3AoKXx8e2xpbmVEYXNoOlswLDBdLHNoYWRvd09mZnNldFg6MCxzaGFkb3dPZmZzZXRZOjAsc2hhZG93Qmx1cjowLHNoYWRvd0NvbG9yOlswLDAsMCwwXSxmb250OiIxMHB4IHNhbnMtc2VyaWYiLGZvbnRTaXplOjEwLGZvbnRXZWlnaHQ6Im5vcm1hbCIsZm9udFN0eWxlOiJub3JtYWwiLGZvbnRGYW1pbHk6InNhbnMtc2VyaWYifX1iZWdpblBhdGgoKXt0aGlzLnBhdGg9W10sdGhpcy5zdWJwYXRoPVtdLHRoaXMucGF0aC5wdXNoKHttZXRob2Q6ImJlZ2luUGF0aCIsZGF0YTpbXX0pfW1vdmVUbyh0LG4pe3RoaXMucGF0aC5wdXNoKHttZXRob2Q6Im1vdmVUbyIsZGF0YTpbdCxuXX0pLHRoaXMuc3VicGF0aD1bW3Qsbl1dfWxpbmVUbyh0LG4pe3RoaXMucGF0aC5sZW5ndGg9PT0wJiZ0aGlzLnN1YnBhdGgubGVuZ3RoPT09MD90aGlzLnBhdGgucHVzaCh7bWV0aG9kOiJtb3ZlVG8iLGRhdGE6W3Qsbl19KTp0aGlzLnBhdGgucHVzaCh7bWV0aG9kOiJsaW5lVG8iLGRhdGE6W3Qsbl19KSx0aGlzLnN1YnBhdGgucHVzaChbdCxuXSl9cXVhZHJhdGljQ3VydmVUbyh0LG4scixhKXt0aGlzLnBhdGgucHVzaCh7bWV0aG9kOiJxdWFkcmF0aWNDdXJ2ZVRvIixkYXRhOlt0LG4scixhXX0pLHRoaXMuc3VicGF0aC5wdXNoKFtyLGFdKX1iZXppZXJDdXJ2ZVRvKHQsbixyLGEsdSxoKXt0aGlzLnBhdGgucHVzaCh7bWV0aG9kOiJiZXppZXJDdXJ2ZVRvIixkYXRhOlt0LG4scixhLHUsaF19KSx0aGlzLnN1YnBhdGgucHVzaChbdSxoXSl9YXJjKHQsbixyLGEsdSxoPSExKXt0aGlzLnBhdGgucHVzaCh7bWV0aG9kOiJhcmMiLGRhdGE6W3QsbixyLGEsdSxoXX0pLHRoaXMuc3VicGF0aC5wdXNoKFt0LG5dKX1yZWN0KHQsbixyLGEpe3RoaXMucGF0aC5wdXNoKHttZXRob2Q6InJlY3QiLGRhdGE6W3QsbixyLGFdfSksdGhpcy5zdWJwYXRoPVtbdCxuXV19YXJjVG8odCxuLHIsYSx1KXt0aGlzLnBhdGgucHVzaCh7bWV0aG9kOiJhcmNUbyIsZGF0YTpbdCxuLHIsYSx1XX0pLHRoaXMuc3VicGF0aC5wdXNoKFtyLGFdKX1jbGlwKCl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoiY2xpcCIsZGF0YTpbLi4udGhpcy5wYXRoXX0pfWNsb3NlUGF0aCgpe3RoaXMucGF0aC5wdXNoKHttZXRob2Q6ImNsb3NlUGF0aCIsZGF0YTpbXX0pLHRoaXMuc3VicGF0aC5sZW5ndGgmJih0aGlzLnN1YnBhdGg9W3RoaXMuc3VicGF0aC5zaGlmdCgpXSl9Y2xlYXJBY3Rpb25zKCl7dGhpcy5hY3Rpb25zPVtdLHRoaXMucGF0aD1bXSx0aGlzLnN1YnBhdGg9W119Z2V0QWN0aW9ucygpe3ZhciB0PVsuLi50aGlzLmFjdGlvbnNdO3JldHVybiB0aGlzLmNsZWFyQWN0aW9ucygpLHR9c2V0IGxpbmVEYXNoT2Zmc2V0KHQpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldExpbmVEYXNoT2Zmc2V0IixkYXRhOlt0XX0pfXNldCBnbG9iYWxDb21wb3NpdGVPcGVyYXRpb24odCl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0R2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uIixkYXRhOlt0XX0pfXNldCBzaGFkb3dCbHVyKHQpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldFNoYWRvd0JsdXIiLGRhdGE6W3RdfSl9c2V0IHNoYWRvd0NvbG9yKHQpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldFNoYWRvd0NvbG9yIixkYXRhOlt0XX0pfXNldCBzaGFkb3dPZmZzZXRYKHQpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldFNoYWRvd09mZnNldFgiLGRhdGE6W3RdfSl9c2V0IHNoYWRvd09mZnNldFkodCl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0U2hhZG93T2Zmc2V0WSIsZGF0YTpbdF19KX1zZXQgZm9udCh0KXt2YXIgbj10aGlzO3RoaXMuc3RhdGUuZm9udD10O3ZhciByPXQubWF0Y2goL14oKFtcd1wtXStccykqKShcZCtyP3B4KShcLyhcZCtcLj9cZCoocj9weCk/KSk/XHMrKC4qKS8pO2lmKHIpe3ZhciBhPXJbMV0udHJpbSgpLnNwbGl0KC9ccy8pLHU9cGFyc2VGbG9hdChyWzNdKSxoPXJbN10sYj1bXTthLmZvckVhY2goZnVuY3Rpb24oTyxEKXtbIml0YWxpYyIsIm9ibGlxdWUiLCJub3JtYWwiXS5pbmRleE9mKE8pPi0xPyhiLnB1c2goe21ldGhvZDoic2V0Rm9udFN0eWxlIixkYXRhOltPXX0pLG4uc3RhdGUuZm9udFN0eWxlPU8pOlsiYm9sZCIsIm5vcm1hbCJdLmluZGV4T2YoTyk+LTE/KGIucHVzaCh7bWV0aG9kOiJzZXRGb250V2VpZ2h0IixkYXRhOltPXX0pLG4uc3RhdGUuZm9udFdlaWdodD1PKTpEPT09MD8oYi5wdXNoKHttZXRob2Q6InNldEZvbnRTdHlsZSIsZGF0YTpbIm5vcm1hbCJdfSksbi5zdGF0ZS5mb250U3R5bGU9Im5vcm1hbCIpOkQ9PT0xJiZVKCl9KSxhLmxlbmd0aD09PTEmJlUoKSxhPWIubWFwKGZ1bmN0aW9uKE8pe3JldHVybiBPLmRhdGFbMF19KS5qb2luKCIgIiksdGhpcy5zdGF0ZS5mb250U2l6ZT11LHRoaXMuc3RhdGUuZm9udEZhbWlseT1oLHRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldEZvbnQiLGRhdGE6W2Ake2F9ICR7dX1weCAke2h9YF19KX1lbHNlIGNvbnNvbGUud2FybigiRmFpbGVkIHRvIHNldCAnZm9udCcgb24gJ0NhbnZhc0NvbnRleHQnOiBpbnZhbGlkIGZvcm1hdC4iKTtmdW5jdGlvbiBVKCl7Yi5wdXNoKHttZXRob2Q6InNldEZvbnRXZWlnaHQiLGRhdGE6WyJub3JtYWwiXX0pLG4uc3RhdGUuZm9udFdlaWdodD0ibm9ybWFsIn19Z2V0IGZvbnQoKXtyZXR1cm4gdGhpcy5zdGF0ZS5mb250fXNldCBmaWxsU3R5bGUodCl7dGhpcy5zZXRGaWxsU3R5bGUodCl9c2V0IHN0cm9rZVN0eWxlKHQpe3RoaXMuc2V0U3Ryb2tlU3R5bGUodCl9c2V0IGdsb2JhbEFscGhhKHQpe3Q9TWF0aC5mbG9vcigyNTUqcGFyc2VGbG9hdCh0KSksdGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0R2xvYmFsQWxwaGEiLGRhdGE6W3RdfSl9c2V0IHRleHRBbGlnbih0KXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRUZXh0QWxpZ24iLGRhdGE6W3RdfSl9c2V0IGxpbmVDYXAodCl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0TGluZUNhcCIsZGF0YTpbdF19KX1zZXQgbGluZUpvaW4odCl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0TGluZUpvaW4iLGRhdGE6W3RdfSl9c2V0IGxpbmVXaWR0aCh0KXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRMaW5lV2lkdGgiLGRhdGE6W3RdfSl9c2V0IG1pdGVyTGltaXQodCl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0TWl0ZXJMaW1pdCIsZGF0YTpbdF19KX1zZXQgdGV4dEJhc2VsaW5lKHQpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldFRleHRCYXNlbGluZSIsZGF0YTpbdF19KX19bGV0IGZfPXRlLm9uY2UoKCk9PntbLi4ub18sLi4uYV9dLmZvckVhY2goZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChuKXtzd2l0Y2gobil7Y2FzZSJmaWxsIjpjYXNlInN0cm9rZSI6cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDpuKyJQYXRoIixkYXRhOlsuLi50aGlzLnBhdGhdfSl9O2Nhc2UiZmlsbFJlY3QiOnJldHVybiBmdW5jdGlvbihyLGEsdSxoKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJmaWxsUGF0aCIsZGF0YTpbe21ldGhvZDoicmVjdCIsZGF0YTpbcixhLHUsaF19XX0pfTtjYXNlInN0cm9rZVJlY3QiOnJldHVybiBmdW5jdGlvbihyLGEsdSxoKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzdHJva2VQYXRoIixkYXRhOlt7bWV0aG9kOiJyZWN0IixkYXRhOltyLGEsdSxoXX1dfSl9O2Nhc2UiZmlsbFRleHQiOmNhc2Uic3Ryb2tlVGV4dCI6cmV0dXJuIGZ1bmN0aW9uKHIsYSx1LGgpe3ZhciBiPVtyLnRvU3RyaW5nKCksYSx1XTt0eXBlb2YgaD09Im51bWJlciImJmIucHVzaChoKSx0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOm4sZGF0YTpifSl9O2Nhc2UiZHJhd0ltYWdlIjpyZXR1cm4gZnVuY3Rpb24ocixhLHUsaCxiLFUsTyxELGdlKXtnZT09PXZvaWQgMCYmKFU9YSxPPXUsRD1oLGdlPWIsYT12b2lkIDAsdT12b2lkIDAsaD12b2lkIDAsYj12b2lkIDApO3ZhciB3ZTtmdW5jdGlvbiBrZShFdCl7cmV0dXJuIHR5cGVvZiBFdD09Im51bWJlciJ9d2U9a2UoYSkmJmtlKHUpJiZrZShoKSYma2UoYik/W3IsVSxPLEQsZ2UsYSx1LGgsYl06a2UoRCkmJmtlKGdlKT9bcixVLE8sRCxnZV06W3IsVSxPXSx0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOm4sZGF0YTp3ZX0pfTtkZWZhdWx0OnJldHVybiBmdW5jdGlvbiguLi5yKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOm4sZGF0YTpyfSl9fX1YbC5wcm90b3R5cGVbZV09dChlKX0pLHNfLmZvckVhY2goZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChuKXtzd2l0Y2gobil7Y2FzZSJzZXRGaWxsU3R5bGUiOmNhc2Uic2V0U3Ryb2tlU3R5bGUiOnJldHVybiBmdW5jdGlvbihyKXt0eXBlb2YgciE9Im9iamVjdCI/dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDpuLGRhdGE6WyJub3JtYWwiLFR1KHIpXX0pOnRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6bixkYXRhOltyLnR5cGUsci5kYXRhLHIuY29sb3JTdG9wXX0pfTtjYXNlInNldEdsb2JhbEFscGhhIjpyZXR1cm4gZnVuY3Rpb24ocil7cj1NYXRoLmZsb29yKDI1NSpwYXJzZUZsb2F0KHIpKSx0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOm4sZGF0YTpbcl19KX07Y2FzZSJzZXRTaGFkb3ciOnJldHVybiBmdW5jdGlvbihyLGEsdSxoKXtoPVR1KGgpLHRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6bixkYXRhOltyLGEsdSxoXX0pLHRoaXMuc3RhdGUuc2hhZG93Qmx1cj11LHRoaXMuc3RhdGUuc2hhZG93Q29sb3I9aCx0aGlzLnN0YXRlLnNoYWRvd09mZnNldFg9cix0aGlzLnN0YXRlLnNoYWRvd09mZnNldFk9YX07Y2FzZSJzZXRMaW5lRGFzaCI6cmV0dXJuIGZ1bmN0aW9uKHIsYSl7cj1yfHxbMCwwXSxhPWF8fDAsdGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDpuLGRhdGE6W3IsYV19KSx0aGlzLnN0YXRlLmxpbmVEYXNoPXJ9O2Nhc2Uic2V0Rm9udFNpemUiOnJldHVybiBmdW5jdGlvbihyKXt0aGlzLnN0YXRlLmZvbnQ9dGhpcy5zdGF0ZS5mb250LnJlcGxhY2UoL1xkK1wuP1xkKnB4LyxyKyJweCIpLHRoaXMuc3RhdGUuZm9udFNpemU9cix0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOm4sZGF0YTpbcl19KX07ZGVmYXVsdDpyZXR1cm4gZnVuY3Rpb24oLi4ucil7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDpuLGRhdGE6cn0pfX19WGwucHJvdG90eXBlW2VdPXQoZSl9KX0pLGRfPU10KGptLChlLHQpPT57aWYoZl8oKSx0KXJldHVybiBuZXcgWGwoZSxmcih0KSk7bGV0IG49ZnIoTHIoKSk7aWYobilyZXR1cm4gbmV3IFhsKGUsbik7c3QuZW1pdCh0ZS5PTl9FUlJPUiwiY3JlYXRlQ2FudmFzQ29udGV4dDpmYWlsIil9LHptKSxoXz15ZShYbSwoe2NhbnZhc0lkOmUseDp0LHk6bix3aWR0aDpyLGhlaWdodDphfSx7cmVzb2x2ZTp1LHJlamVjdDpofSk9PntsZXQgYj1mcihMcigpKTtpZighYil7aCgpO3JldHVybn1mdW5jdGlvbiBVKE8pe2lmKE8uZXJyTXNnJiZPLmVyck1zZy5pbmRleE9mKCJmYWlsIikhPT0tMSl7aCgiIixPKTtyZXR1cm59bGV0IEQ9Ty5kYXRhO0QmJkQubGVuZ3RoJiYoTy5jb21wcmVzc2VkJiYoRD1BZC5pbmZsYXRlUmF3KEQpKSxPLmRhdGE9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KEQpKSxkZWxldGUgTy5jb21wcmVzc2VkLHUoTyl9UGMoZSxiLCJnZXRJbWFnZURhdGEiLHt4OnQseTpuLHdpZHRoOnIsaGVpZ2h0OmF9LFUpfSxGZCxEZCksZ189eWUoUW0sKHtjYW52YXNJZDplLGRhdGE6dCx4Om4seTpyLHdpZHRoOmEsaGVpZ2h0OnV9LHtyZXNvbHZlOmgscmVqZWN0OmJ9KT0+e3ZhciBVPWZyKExyKCkpO2lmKCFVKXtiKCk7cmV0dXJufWxldCBPLEQ9KCk9PntQYyhlLFUsInB1dEltYWdlRGF0YSIse2RhdGE6dCx4Om4seTpyLHdpZHRoOmEsaGVpZ2h0OnUsY29tcHJlc3NlZDpPfSxnZT0+e2lmKGdlLmVyck1zZyYmZ2UuZXJyTXNnLmluZGV4T2YoImZhaWwiKSE9PS0xKXtiKCk7cmV0dXJufWgoZ2UpfSl9O2wub3MubmFtZSE9PSJpT1MifHx0eXBlb2YgX19XRUVYX0RFVlRPT0xfXz09ImJvb2xlYW4iPyh0PUFkLmRlZmxhdGVSYXcodCx7dG86InN0cmluZyJ9KSxPPSEwKTp0PUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHQpLEQoKX0sdF8sZV8pLHBfPXllKG5fLCh7eDplPTAseTp0PTAsd2lkdGg6bixoZWlnaHQ6cixkZXN0V2lkdGg6YSxkZXN0SGVpZ2h0OnUsY2FudmFzSWQ6aCxmaWxlVHlwZTpiLHF1YWxpdHk6VX0se3Jlc29sdmU6TyxyZWplY3Q6RH0pPT57dmFyIGdlPWZyKExyKCkpO2lmKCFnZSl7RCgpO3JldHVybn1sZXQgd2U9YCR7YWl9L2NhbnZhc2A7UGMoaCxnZSwidG9UZW1wRmlsZVBhdGgiLHt4OmUseTp0LHdpZHRoOm4saGVpZ2h0OnIsZGVzdFdpZHRoOmEsZGVzdEhlaWdodDp1LGZpbGVUeXBlOmIscXVhbGl0eTpVLGRpcm5hbWU6d2V9LGtlPT57aWYoa2UuZXJyTXNnJiZrZS5lcnJNc2cuaW5kZXhPZigiZmFpbCIpIT09LTEpe0QoIiIsa2UpO3JldHVybn1PKGtlKX0pfSxpXyxyXyksSGQ9WyJvbkNhbnBsYXkiLCJvblBsYXkiLCJvblBhdXNlIiwib25TdG9wIiwib25FbmRlZCIsIm9uVGltZVVwZGF0ZSIsIm9uRXJyb3IiLCJvbldhaXRpbmciLCJvblNlZWtpbmciLCJvblNlZWtlZCJdLHZfPVsib2ZmQ2FucGxheSIsIm9mZlBsYXkiLCJvZmZQYXVzZSIsIm9mZlN0b3AiLCJvZmZFbmRlZCIsIm9mZlRpbWVVcGRhdGUiLCJvZmZFcnJvciIsIm9mZldhaXRpbmciLCJvZmZTZWVraW5nIiwib2ZmU2Vla2VkIl0sbV89e3RocmVzaG9sZHM6WzBdLGluaXRpYWxSYXRpbzowLG9ic2VydmVBbGw6ITF9LF9fPVsidG9wIiwicmlnaHQiLCJib3R0b20iLCJsZWZ0Il0sYl89MTtmdW5jdGlvbiBqZChlPXt9KXtyZXR1cm4gX18ubWFwKHQ9PmAke051bWJlcihlW3RdKXx8MH1weGApLmpvaW4oIiAiKX1jbGFzcyB6ZHtjb25zdHJ1Y3Rvcih0LG4pe3RoaXMuX3BhZ2VJZD1mcih0KSx0aGlzLl9jb21wb25lbnQ9dCx0aGlzLl9vcHRpb25zPVkuZXh0ZW5kKHt9LG1fLG4pfXJlbGF0aXZlVG8odCxuKXtyZXR1cm4gdGhpcy5fb3B0aW9ucy5yZWxhdGl2ZVRvU2VsZWN0b3I9dCx0aGlzLl9vcHRpb25zLnJvb3RNYXJnaW49amQobiksdGhpc31yZWxhdGl2ZVRvVmlld3BvcnQodCl7cmV0dXJuIHRoaXMuX29wdGlvbnMucmVsYXRpdmVUb1NlbGVjdG9yPXZvaWQgMCx0aGlzLl9vcHRpb25zLnJvb3RNYXJnaW49amQodCksdGhpc31vYnNlcnZlKHQsbil7IVkuaXNGdW5jdGlvbihuKXx8KHRoaXMuX29wdGlvbnMuc2VsZWN0b3I9dCx0aGlzLl9yZXFJZD1iXysrLERyKHtyZXFJZDp0aGlzLl9yZXFJZCxjb21wb25lbnQ6dGhpcy5fY29tcG9uZW50LG9wdGlvbnM6dGhpcy5fb3B0aW9ucyxjYWxsYmFjazpufSx0aGlzLl9wYWdlSWQpKX1kaXNjb25uZWN0KCl7dGhpcy5fcmVxSWQmJlRzKHtyZXFJZDp0aGlzLl9yZXFJZCxjb21wb25lbnQ6dGhpcy5fY29tcG9uZW50fSx0aGlzLl9wYWdlSWQpfX1sZXQgRV89TXQoImNyZWF0ZUludGVyc2VjdGlvbk9ic2VydmVyIiwoZSx0KT0+KGU9dGUucmVzb2x2ZUNvbXBvbmVudEluc3RhbmNlKGUpLGUmJiFmcihlKSYmKHQ9ZSxlPW51bGwpLGU/bmV3IHpkKGUsdCk6bmV3IHpkKExyKCksdCkpKSx5Xz0xO2NsYXNzIFdke2NvbnN0cnVjdG9yKHQpe3RoaXMuX3BhZ2VJZD10LiRwYWdlJiZ0LiRwYWdlLmlkLHRoaXMuX2NvbXBvbmVudD10fW9ic2VydmUodCxuKXshWS5pc0Z1bmN0aW9uKG4pfHwodGhpcy5fcmVxSWQ9eV8rKyxHbih7cmVxSWQ6dGhpcy5fcmVxSWQsY29tcG9uZW50OnRoaXMuX2NvbXBvbmVudCxvcHRpb25zOnQsY2FsbGJhY2s6bn0sdGhpcy5fcGFnZUlkKSl9ZGlzY29ubmVjdCgpe3RoaXMuX3JlcUlkJiZBbih7cmVxSWQ6dGhpcy5fcmVxSWQsY29tcG9uZW50OnRoaXMuX2NvbXBvbmVudH0sdGhpcy5fcGFnZUlkKX19bGV0IHdfPU10KCJjcmVhdGVNZWRpYVF1ZXJ5T2JzZXJ2ZXIiLGU9PihlPXRlLnJlc29sdmVDb21wb25lbnRJbnN0YW5jZShlKSxlJiYhZnIoZSkmJihlPW51bGwpLGU/bmV3IFdkKGUpOm5ldyBXZChMcigpKSkpLFNfPTAsUHU9e307ZnVuY3Rpb24gQV8oZSx0LG4scil7bGV0IGE9e29wdGlvbnM6cn0sdT1yJiYoInN1Y2Nlc3MiaW4gcnx8ImZhaWwiaW4gcnx8ImNvbXBsZXRlImluIHIpO2lmKHUpe2xldCBoPVN0cmluZyhTXysrKTthLmNhbGxiYWNrSWQ9aCxQdVtoXT1yfXN0Lmludm9rZVZpZXdNZXRob2QoYGVkaXRvci4ke2V9YCx7dHlwZTpuLGRhdGE6YX0sdCwoe2NhbGxiYWNrSWQ6aCxkYXRhOmJ9KT0+e3UmJih0ZS5jYWxsT3B0aW9ucyhQdVtoXSxiKSxkZWxldGUgUHVbaF0pfSl9Y2xhc3MgQ197Y29uc3RydWN0b3IodCxuKXt0aGlzLmlkPXQsdGhpcy5wYWdlSWQ9bn1mb3JtYXQodCxuKXt0aGlzLl9leGVjKCJmb3JtYXQiLHtuYW1lOnQsdmFsdWU6bn0pfWluc2VydERpdmlkZXIoKXt0aGlzLl9leGVjKCJpbnNlcnREaXZpZGVyIil9aW5zZXJ0SW1hZ2UodCl7dGhpcy5fZXhlYygiaW5zZXJ0SW1hZ2UiLHQpfWluc2VydFRleHQodCl7dGhpcy5fZXhlYygiaW5zZXJ0VGV4dCIsdCl9c2V0Q29udGVudHModCl7dGhpcy5fZXhlYygic2V0Q29udGVudHMiLHQpfWdldENvbnRlbnRzKHQpe3RoaXMuX2V4ZWMoImdldENvbnRlbnRzIix0KX1jbGVhcih0KXt0aGlzLl9leGVjKCJjbGVhciIsdCl9cmVtb3ZlRm9ybWF0KHQpe3RoaXMuX2V4ZWMoInJlbW92ZUZvcm1hdCIsdCl9dW5kbyh0KXt0aGlzLl9leGVjKCJ1bmRvIix0KX1yZWRvKHQpe3RoaXMuX2V4ZWMoInJlZG8iLHQpfWJsdXIodCl7dGhpcy5fZXhlYygiYmx1ciIsdCl9Z2V0U2VsZWN0aW9uVGV4dCh0KXt0aGlzLl9leGVjKCJnZXRTZWxlY3Rpb25UZXh0Iix0KX1zY3JvbGxJbnRvVmlldyh0KXt0aGlzLl9leGVjKCJzY3JvbGxJbnRvVmlldyIsdCl9X2V4ZWModCxuKXtBXyh0aGlzLmlkLHRoaXMucGFnZUlkLHQsbil9fWxldCBPXz17Y2FudmFzOlhsLG1hcDpPdSx2aWRlbzpDdSxlZGl0b3I6Q199O2Z1bmN0aW9uIEdkKGUpe2lmKGUmJmUuY29udGV4dEluZm8pe2xldHtpZDp0LHR5cGU6bixwYWdlOnJ9PWUuY29udGV4dEluZm8sYT1PX1tuXTtlLmNvbnRleHQ9bmV3IGEodCxyKSxkZWxldGUgZS5jb250ZXh0SW5mb319Y2xhc3MgSXV7Y29uc3RydWN0b3IodCxuLHIsYSl7dGhpcy5fc2VsZWN0b3JRdWVyeT10LHRoaXMuX2NvbXBvbmVudD1uLHRoaXMuX3NlbGVjdG9yPXIsdGhpcy5fc2luZ2xlPWF9Ym91bmRpbmdDbGllbnRSZWN0KHQpe3JldHVybiB0aGlzLl9zZWxlY3RvclF1ZXJ5Ll9wdXNoKHRoaXMuX3NlbGVjdG9yLHRoaXMuX2NvbXBvbmVudCx0aGlzLl9zaW5nbGUse2lkOiEwLGRhdGFzZXQ6ITAscmVjdDohMCxzaXplOiEwfSx0KSx0aGlzLl9zZWxlY3RvclF1ZXJ5fWZpZWxkcyh0LG4pe3JldHVybiB0aGlzLl9zZWxlY3RvclF1ZXJ5Ll9wdXNoKHRoaXMuX3NlbGVjdG9yLHRoaXMuX2NvbXBvbmVudCx0aGlzLl9zaW5nbGUsdCxuKSx0aGlzLl9zZWxlY3RvclF1ZXJ5fXNjcm9sbE9mZnNldCh0KXtyZXR1cm4gdGhpcy5fc2VsZWN0b3JRdWVyeS5fcHVzaCh0aGlzLl9zZWxlY3Rvcix0aGlzLl9jb21wb25lbnQsdGhpcy5fc2luZ2xlLHtpZDohMCxkYXRhc2V0OiEwLHNjcm9sbE9mZnNldDohMH0sdCksdGhpcy5fc2VsZWN0b3JRdWVyeX1jb250ZXh0KHQpe3JldHVybiB0aGlzLl9zZWxlY3RvclF1ZXJ5Ll9wdXNoKHRoaXMuX3NlbGVjdG9yLHRoaXMuX2NvbXBvbmVudCx0aGlzLl9zaW5nbGUse2NvbnRleHQ6ITB9LHQpLHRoaXMuX3NlbGVjdG9yUXVlcnl9bm9kZSh0KXtyZXR1cm4gdGhpcy5fc2VsZWN0b3JRdWVyeX19Y2xhc3MgVF97Y29uc3RydWN0b3IodCl7dGhpcy5fY29tcG9uZW50PXZvaWQgMCx0aGlzLl9wYWdlPXQsdGhpcy5fcXVldWU9W10sdGhpcy5fcXVldWVDYj1bXX1leGVjKHQpe3JldHVybiBPaSh0aGlzLl9wYWdlLHRoaXMuX3F1ZXVlLG49PntsZXQgcj10aGlzLl9xdWV1ZUNiO24uZm9yRWFjaCgoYSx1KT0+e1kuaXNBcnJheShhKT9hLmZvckVhY2goR2QpOkdkKGEpO2xldCBoPXJbdV07WS5pc0Z1bmN0aW9uKGgpJiZoLmNhbGwodGhpcyxhKX0pLFkuaXNGdW5jdGlvbih0KSYmdC5jYWxsKHRoaXMsbil9KSx0aGlzLl9ub2Rlc1JlZn1pbih0KXtyZXR1cm4gdGhpcy5fY29tcG9uZW50PXRlLnJlc29sdmVDb21wb25lbnRJbnN0YW5jZSh0KSx0aGlzfXNlbGVjdCh0KXtyZXR1cm4gdGhpcy5fbm9kZXNSZWY9bmV3IEl1KHRoaXMsdGhpcy5fY29tcG9uZW50LHQsITApfXNlbGVjdEFsbCh0KXtyZXR1cm4gdGhpcy5fbm9kZXNSZWY9bmV3IEl1KHRoaXMsdGhpcy5fY29tcG9uZW50LHQsITEpfXNlbGVjdFZpZXdwb3J0KCl7cmV0dXJuIHRoaXMuX25vZGVzUmVmPW5ldyBJdSh0aGlzLG51bGwsIiIsITApfV9wdXNoKHQsbixyLGEsdSl7dGhpcy5fcXVldWUucHVzaCh7Y29tcG9uZW50Om4sc2VsZWN0b3I6dCxzaW5nbGU6cixmaWVsZHM6YX0pLHRoaXMuX3F1ZXVlQ2IucHVzaCh1KX19bGV0IFBfPU10KCJjcmVhdGVTZWxlY3RvclF1ZXJ5IixlPT4oZT10ZS5yZXNvbHZlQ29tcG9uZW50SW5zdGFuY2UoZSksZSYmIWZyKGUpJiYoZT1udWxsKSxuZXcgVF8oZXx8THIoKSkpKSxJXz0iY3JlYXRlQW5pbWF0aW9uIixOXz17Zm9ybWF0QXJnczp7fX0sa189e2R1cmF0aW9uOk51bWJlcix0aW1pbmdGdW5jdGlvbjpTdHJpbmcsZGVsYXk6TnVtYmVyLHRyYW5zZm9ybU9yaWdpbjpTdHJpbmd9LFJfPXtkdXJhdGlvbjo0MDAsdGltaW5nRnVuY3Rpb246ImxpbmVhciIsZGVsYXk6MCx0cmFuc2Zvcm1PcmlnaW46IjUwJSA1MCUgMCJ9O2NsYXNzIFlke2NvbnN0cnVjdG9yKHQpe3RoaXMuYWN0aW9ucz1bXSx0aGlzLmN1cnJlbnRUcmFuc2Zvcm09e30sdGhpcy5jdXJyZW50U3RlcEFuaW1hdGVzPVtdLHRoaXMub3B0aW9uPVkuZXh0ZW5kKHt9LFJfLHQpfV9nZXRPcHRpb24odCl7bGV0IG49e3RyYW5zaXRpb246WS5leHRlbmQoe30sdGhpcy5vcHRpb24sdCksdHJhbnNmb3JtT3JpZ2luOiIifTtyZXR1cm4gbi50cmFuc2Zvcm1PcmlnaW49bi50cmFuc2l0aW9uLnRyYW5zZm9ybU9yaWdpbixkZWxldGUgbi50cmFuc2l0aW9uLnRyYW5zZm9ybU9yaWdpbixufV9wdXNoQW5pbWF0ZXModCxuKXt0aGlzLmN1cnJlbnRTdGVwQW5pbWF0ZXMucHVzaCh7dHlwZTp0LGFyZ3M6bn0pfV9jb252ZXJUeXBlKHQpe3JldHVybiB0LnJlcGxhY2UoL1tBLVpdL2csbj0+YC0ke24udG9Mb3dlckNhc2UoKX1gKX1fZ2V0VmFsdWUodCl7cmV0dXJuIHR5cGVvZiB0PT0ibnVtYmVyIj9gJHt0fXB4YDp0fWV4cG9ydCgpe2xldCB0PXRoaXMuYWN0aW9ucztyZXR1cm4gdGhpcy5hY3Rpb25zPVtdLHthY3Rpb25zOnR9fXN0ZXAodCl7cmV0dXJuIHRoaXMuY3VycmVudFN0ZXBBbmltYXRlcy5mb3JFYWNoKG49PntuLnR5cGUhPT0ic3R5bGUiP3RoaXMuY3VycmVudFRyYW5zZm9ybVtuLnR5cGVdPW46dGhpcy5jdXJyZW50VHJhbnNmb3JtW2Ake24udHlwZX0uJHtuLmFyZ3NbMF19YF09bn0pLHRoaXMuYWN0aW9ucy5wdXNoKHthbmltYXRlczpPYmplY3QudmFsdWVzKHRoaXMuY3VycmVudFRyYW5zZm9ybSksb3B0aW9uOnRoaXMuX2dldE9wdGlvbih0KX0pLHRoaXMuY3VycmVudFN0ZXBBbmltYXRlcz1bXSx0aGlzfX1sZXQgeF89dGUub25jZSgoKT0+e2xldCBlPVsibWF0cml4IiwibWF0cml4M2QiLCJyb3RhdGUiLCJyb3RhdGUzZCIsInJvdGF0ZVgiLCJyb3RhdGVZIiwicm90YXRlWiIsInNjYWxlIiwic2NhbGUzZCIsInNjYWxlWCIsInNjYWxlWSIsInNjYWxlWiIsInNrZXciLCJza2V3WCIsInNrZXdZIiwidHJhbnNsYXRlIiwidHJhbnNsYXRlM2QiLCJ0cmFuc2xhdGVYIiwidHJhbnNsYXRlWSIsInRyYW5zbGF0ZVoiXSx0PVsib3BhY2l0eSIsImJhY2tncm91bmRDb2xvciJdLG49WyJ3aWR0aCIsImhlaWdodCIsImxlZnQiLCJyaWdodCIsInRvcCIsImJvdHRvbSJdO2UuY29uY2F0KHQsbikuZm9yRWFjaChyPT57WWQucHJvdG90eXBlW3JdPWZ1bmN0aW9uKC4uLmEpe3JldHVybiB0LmNvbmNhdChuKS5pbmNsdWRlcyhyKT90aGlzLl9wdXNoQW5pbWF0ZXMoInN0eWxlIixbdGhpcy5fY29udmVyVHlwZShyKSxuLmluY2x1ZGVzKHIpP3RoaXMuX2dldFZhbHVlKGFbMF0pOmFbMF1dKTp0aGlzLl9wdXNoQW5pbWF0ZXMocixhKSx0aGlzfX0pfSksQl89TXQoSV8sZT0+KHhfKCksbmV3IFlkKGUpKSxrXyxOXykscWQ9Im9uVGFiQmFyTWlkQnV0dG9uVGFwIixNXz1xbihxZCwoKT0+e30pLExfPSJvbldpbmRvd1Jlc2l6ZSIsRF89Im9mZldpbmRvd1Jlc2l6ZSIsRl89cW4oTF8sKCk9Pnt9KSxWXz1DcihEXywoKT0+e30pLEtkPSJzZXRMb2NhbGUiLCRfPSJnZXRMb2NhbGUiLEpkPSJvbkxvY2FsZUNoYW5nZSIsUWw9TXQoJF8sKCk9PntsZXQgZT12bih7YWxsb3dEZWZhdWx0OiEwfSk7cmV0dXJuIGUmJmUuJHZtP2UuJHZtLiRsb2NhbGU6WCgpLmdldExvY2FsZSgpfSksVV89cW4oSmQsKCk9Pnt9KSxIXz1NdChLZCxlPT57bGV0IHQ9dm4oKTtyZXR1cm4gdCYmdC4kdm0uJGxvY2FsZSE9PWU/KHQuJHZtLiRsb2NhbGU9ZSxWbigpLmZvckVhY2goYT0+e3N0LnB1Ymxpc2hIYW5kbGVyKEtkLGUsYS4kcGFnZS5pZCl9KSxnLnJlcXVpcmVNb2R1bGUoInBsdXMiKS5zZXRMYW5ndWFnZShlKSxzdC5pbnZva2VPbkNhbGxiYWNrKEpkLHtsb2NhbGU6ZX0pLCEwKTohMX0pLGpfPXllKCJzZXRQYWdlTWV0YSIsKGUse3Jlc29sdmU6dH0pPT57dChPcihMcigpLGUpKX0pLFpkPSJnZXRTZWxlY3RlZFRleHRSYW5nZSIsel89eWUoWmQsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57c3QuaW52b2tlVmlld01ldGhvZChaZCx7fSxCYSgpLHI9Pnt0eXBlb2Ygci5lbmQ9PSJ1bmRlZmluZWQiJiZ0eXBlb2Ygci5zdGFydD09InVuZGVmaW5lZCI/bigibm8gZm9jdXNlZCIpOnQocil9KX0pLEljPXtbdGUuT05fVU5IQU5ETEVfUkVKRUNUSU9OXTpbXSxbdGUuT05fUEFHRV9OT1RfRk9VTkRdOltdLFt0ZS5PTl9FUlJPUl06W10sW3RlLk9OX1NIT1ddOltdLFt0ZS5PTl9ISURFXTpbXX07ZnVuY3Rpb24gZWMoZSx0KXtsZXQgbj12bih7YWxsb3dEZWZhdWx0OiEwfSk7aWYobiYmbi4kdm0pcmV0dXJuIEVuLmluamVjdEhvb2soZSx0LG4uJHZtLiQpO0ljW2VdLnB1c2godCl9ZnVuY3Rpb24gV18oZSl7T2JqZWN0LmtleXMoSWMpLmZvckVhY2godD0+e0ljW3RdLmZvckVhY2gobj0+e0VuLmluamVjdEhvb2sodCxuLGUpfSl9KX1mdW5jdGlvbiB0YyhlLHQpe2xldCBuPXZuKHthbGxvd0RlZmF1bHQ6ITB9KTtpZihuJiZuLiR2bSlyZXR1cm4gbnMobi4kdm0sZSx0KTtZLnJlbW92ZShJY1tlXSx0KX1mdW5jdGlvbiBHXyhlKXtlYyh0ZS5PTl9VTkhBTkRMRV9SRUpFQ1RJT04sZSl9ZnVuY3Rpb24gWV8oZSl7dGModGUuT05fVU5IQU5ETEVfUkVKRUNUSU9OLGUpfWZ1bmN0aW9uIHFfKGUpe2VjKHRlLk9OX1BBR0VfTk9UX0ZPVU5ELGUpfWZ1bmN0aW9uIEtfKGUpe3RjKHRlLk9OX1BBR0VfTk9UX0ZPVU5ELGUpfWZ1bmN0aW9uIEpfKGUpe2VjKHRlLk9OX0VSUk9SLGUpfWZ1bmN0aW9uIFpfKGUpe3RjKHRlLk9OX0VSUk9SLGUpfWZ1bmN0aW9uIFhfKGUpe2VjKHRlLk9OX1NIT1csZSl9ZnVuY3Rpb24gUV8oZSl7dGModGUuT05fU0hPVyxlKX1mdW5jdGlvbiBlYihlKXtlYyh0ZS5PTl9ISURFLGUpfWZ1bmN0aW9uIHRiKGUpe3RjKHRlLk9OX0hJREUsZSl9bGV0IG5iPU10KCJnZXRFbnRlck9wdGlvbnNTeW5jIiwoKT0+aXMoKSkscmI9TXQoImdldExhdW5jaE9wdGlvbnNTeW5jIiwoKT0+RGEoKSksbmMsTnUsa3UsWGQ7ZnVuY3Rpb24gUWQoZSl7dHJ5e3JldHVybiBKU09OLnBhcnNlKGUpfWNhdGNoKHQpe31yZXR1cm4gZX1mdW5jdGlvbiBSdShlKXtpZihlLnR5cGU9PT0iZW5hYmxlZCIpa3U9ITAsWGQ9ZS5vZmZsaW5lO2Vsc2UgaWYoZS50eXBlPT09ImNsaWVudElkIiluYz1lLmNpZCxOdT1lLmVyck1zZyxlaChuYyxlLmVyck1zZyk7ZWxzZSBpZihlLnR5cGU9PT0icHVzaE1zZyIpe2xldCB0PXt0eXBlOiJyZWNlaXZlIixkYXRhOlFkKGUubWVzc2FnZSl9O2ZvcihsZXQgbj0wO248X3MubGVuZ3RoJiYoX3Nbbl0odCksIXQuc3RvcHBlZCk7bisrKTt9ZWxzZSBlLnR5cGU9PT0iY2xpY2siJiZfcy5mb3JFYWNoKHQ9Pnt0KHt0eXBlOiJjbGljayIsZGF0YTpRZChlLm1lc3NhZ2UpfSl9KX1sZXQgeHU9W107ZnVuY3Rpb24gZWgoZSx0KXt4dS5mb3JFYWNoKG49PntuKGUsdCl9KSx4dS5sZW5ndGg9MH1sZXQgaWI9eWUoImdldFB1c2hDbGllbnRJZCIsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57aWYoWGQpe2wucHVzaC5nZXRDbGllbnRJbmZvQXN5bmMocj0+e3Qoe2NpZDpyLmNsaWVudGlkfSl9LHI9PntuKHIuY29kZSsiOiAiK3IubWVzc2FnZSl9KTtyZXR1cm59UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+e3R5cGVvZiBrdT09InVuZGVmaW5lZCImJihrdT0hMSxuYz0iIixOdT0idW5pUHVzaCBpcyBub3QgZW5hYmxlZCIpLHh1LnB1c2goKHIsYSk9PntyP3Qoe2NpZDpyfSk6bihhKX0pLHR5cGVvZiBuYyE9InVuZGVmaW5lZCImJmVoKG5jLE51KX0pfSksX3M9W10sdGg9ITEsb2I9ZT0+e19zLmluZGV4T2YoZSk9PT0tMSYmX3MucHVzaChlKSx0aHx8KHRoPSEwLGwucHVzaC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdD0+e1J1KHt0eXBlOiJjbGljayIsbWVzc2FnZTp0fSl9KSxsLnB1c2guYWRkRXZlbnRMaXN0ZW5lcigicmVjZWl2ZSIsdD0+e1J1KHt0eXBlOiJwdXNoTXNnIixtZXNzYWdlOnR9KX0pKX0sYWI9ZT0+e2lmKCFlKV9zLmxlbmd0aD0wO2Vsc2V7bGV0IHQ9X3MuaW5kZXhPZihlKTt0Pi0xJiZfcy5zcGxpY2UodCwxKX19LHNiPSJjYW5JVXNlIixsYj1be25hbWU6InNjaGVtYSIsdHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9XSxjYj0iZ2V0QmFja2dyb3VuZEF1ZGlvTWFuYWdlciIsdWI9Im1ha2VQaG9uZUNhbGwiLGZiPXtwaG9uZU51bWJlcjpTdHJpbmd9LGRiPSJhZGRQaG9uZUNvbnRhY3QiLGhiPXtmb3JtYXRBcmdzOntmaXJzdE5hbWUoZSl7aWYoIWUpcmV0dXJuImFkZFBob25lQ29udGFjdDpmYWlsIHBhcmFtZXRlciBlcnJvcjogcGFyYW1ldGVyLmZpcnN0TmFtZSBzaG91bGQgbm90IGJlIGVtcHR5OyJ9fX0sZ2I9e2ZpcnN0TmFtZTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LHBob3RvRmlsZVBhdGg6U3RyaW5nLG5pY2tOYW1lOlN0cmluZyxsYXN0TmFtZTpTdHJpbmcsbWlkZGxlTmFtZTpTdHJpbmcscmVtYXJrOlN0cmluZyxtb2JpbGVQaG9uZU51bWJlcjpTdHJpbmcsd2VDaGF0TnVtYmVyOlN0cmluZyxhZGRyZXNzQ291bnRyeTpTdHJpbmcsYWRkcmVzc1N0YXRlOlN0cmluZyxhZGRyZXNzQ2l0eTpTdHJpbmcsYWRkcmVzc1N0cmVldDpTdHJpbmcsYWRkcmVzc1Bvc3RhbENvZGU6U3RyaW5nLG9yZ2FuaXphdGlvbjpTdHJpbmcsdGl0bGU6U3RyaW5nLHdvcmtGYXhOdW1iZXI6U3RyaW5nLHdvcmtQaG9uZU51bWJlcjpTdHJpbmcsaG9zdE51bWJlcjpTdHJpbmcsZW1haWw6U3RyaW5nLHVybDpTdHJpbmcsd29ya0FkZHJlc3NDb3VudHJ5OlN0cmluZyx3b3JrQWRkcmVzc1N0YXRlOlN0cmluZyx3b3JrQWRkcmVzc0NpdHk6U3RyaW5nLHdvcmtBZGRyZXNzU3RyZWV0OlN0cmluZyx3b3JrQWRkcmVzc1Bvc3RhbENvZGU6U3RyaW5nLGhvbWVGYXhOdW1iZXI6U3RyaW5nLGhvbWVQaG9uZU51bWJlcjpTdHJpbmcsaG9tZUFkZHJlc3NDb3VudHJ5OlN0cmluZyxob21lQWRkcmVzc1N0YXRlOlN0cmluZyxob21lQWRkcmVzc0NpdHk6U3RyaW5nLGhvbWVBZGRyZXNzU3RyZWV0OlN0cmluZyxob21lQWRkcmVzc1Bvc3RhbENvZGU6U3RyaW5nfSxwYj0iZ2V0Q2xpcGJvYXJkRGF0YSIsdmI9InNldENsaXBib2FyZERhdGEiLG1iPXtmb3JtYXRBcmdzOntzaG93VG9hc3Q6ITB9LGJlZm9yZUludm9rZSgpe3pvKCl9LGJlZm9yZVN1Y2Nlc3MoZSx0KXtpZighdC5zaG93VG9hc3QpcmV0dXJuO2xldHt0Om59PVgoKSxyPW4oInVuaS5zZXRDbGlwYm9hcmREYXRhLnN1Y2Nlc3MiKTtyJiZndC5zaG93VG9hc3Qoe3RpdGxlOnIsaWNvbjoic3VjY2VzcyIsbWFzazohMX0pfX0sX2I9e2RhdGE6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxzaG93VG9hc3Q6e3R5cGU6Qm9vbGVhbn19LG5oPSJvbkFjY2VsZXJvbWV0ZXIiLGJiPSJvZmZBY2NlbGVyb21ldGVyIixFYj0ic3RhcnRBY2NlbGVyb21ldGVyIix5Yj0ic3RvcEFjY2VsZXJvbWV0ZXIiLHJoPSJvbkNvbXBhc3MiLHdiPSJvZmZDb21wYXNzIixTYj0ic3RhcnRDb21wYXNzIixBYj0ic3RvcENvbXBhc3MiLENiPSJ2aWJyYXRlU2hvcnQiLE9iPSJ2aWJyYXRlTG9uZyIsaWg9Im9uQmx1ZXRvb3RoRGV2aWNlRm91bmQiLG9oPSJvbkJsdWV0b290aEFkYXB0ZXJTdGF0ZUNoYW5nZSIsYWg9Im9uQkxFQ29ubmVjdGlvblN0YXRlQ2hhbmdlIixzaD0ib25CTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlIixUYj0ic3RhcnRCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5IixQYj17c2VydmljZXM6QXJyYXksYWxsb3dEdXBsaWNhdGVzS2V5OkJvb2xlYW4saW50ZXJ2YWw6TnVtYmVyfSxJYj0iZ2V0Q29ubmVjdGVkQmx1ZXRvb3RoRGV2aWNlcyIsTmI9e3NlcnZpY2VzOnt0eXBlOkFycmF5LHJlcXVpcmVkOiEwfX0sa2I9ImNyZWF0ZUJMRUNvbm5lY3Rpb24iLFJiPXtkZXZpY2VJZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSx4Yj0iY2xvc2VCTEVDb25uZWN0aW9uIixCYj17ZGV2aWNlSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sTWI9ImdldEJMRURldmljZVNlcnZpY2VzIixMYj17ZGV2aWNlSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sRGI9ImdldEJMRURldmljZUNoYXJhY3RlcmlzdGljcyIsRmI9e2RldmljZUlkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sc2VydmljZUlkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LFZiPSJub3RpZnlCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlIiwkYj17ZGV2aWNlSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxzZXJ2aWNlSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxjaGFyYWN0ZXJpc3RpY0lkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sc3RhdGU6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMH19LFViPSJyZWFkQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZSIsSGI9e2RldmljZUlkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sc2VydmljZUlkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sY2hhcmFjdGVyaXN0aWNJZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSxqYj0id3JpdGVCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlIix6Yj17ZGV2aWNlSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxzZXJ2aWNlSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxjaGFyYWN0ZXJpc3RpY0lkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sdmFsdWU6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITB9fSxXYj0ic2V0QkxFTVRVIixHYj17ZGV2aWNlSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxtdHU6e3R5cGU6TnVtYmVyLHJlcXVpcmVkOiEwfX0sWWI9ImdldEJMRURldmljZVJTU0kiLHFiPXtkZXZpY2VJZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSxsaD0ib25CZWFjb25VcGRhdGUiLGNoPSJvbkJlYWNvblNlcnZpY2VDaGFuZ2UiLEtiPSJnZXRCZWFjb25zIixKYj0ic3RhcnRCZWFjb25EaXNjb3ZlcnkiLFpiPXt1dWlkczp7dHlwZTpBcnJheSxyZXF1aXJlZDohMH19LFhiPSJzdG9wQmVhY29uRGlzY292ZXJ5IixRYj0iZ2V0U2NyZWVuQnJpZ2h0bmVzcyIsZTA9InNldFNjcmVlbkJyaWdodG5lc3MiLHQwPSJzZXRLZWVwU2NyZWVuT24iLG4wPSJzb3RlckF1dGhlbnRpY2F0aW9uIixyMD0iY2hlY2tJc1NvdGVyRW5yb2xsZWRJbkRldmljZSIsaTA9WyJmaW5nZXJQcmludCIsImZhY2lhbCIsInNwZWVjaCJdLG8wPXtmb3JtYXRBcmdzOntjaGVja0F1dGhNb2RlKGUsdCl7aWYoIWV8fCFpMC5pbmNsdWRlcyhlKSlyZXR1cm4iY2hlY2tBdXRoTW9kZSBcdTU4NkJcdTUxOTlcdTk1MTlcdThCRUYifX19LGEwPXtjaGVja0F1dGhNb2RlOlN0cmluZ30sczA9ImNoZWNrSXNTb3RlckVucm9sbGVkSW5EZXZpY2UiLGwwPXtmb3JtYXRBcmdzOntyZXF1ZXN0QXV0aE1vZGVzKGUsdCl7aWYoIWUuaW5jbHVkZXMoImZpbmdlclByaW50IikmJiFlLmluY2x1ZGVzKCJmYWNpYWwiKSlyZXR1cm4icmVxdWVzdEF1dGhNb2RlcyBcdTU4NkJcdTUxOTlcdTk1MTlcdThCRUYifX19LGMwPXtyZXF1ZXN0QXV0aE1vZGVzOnt0eXBlOkFycmF5LHJlcXVpcmVkOiEwfSxjaGFsbGVuZ2U6U3RyaW5nLGF1dGhDb250ZW50OlN0cmluZ30sdTA9InNjYW5Db2RlIixmMD17b25seUZyb21DYW1lcmE6Qm9vbGVhbixzY2FuVHlwZTpBcnJheSxhdXRvRGVjb2RlQ2hhclNldDpCb29sZWFuLHNvdW5kOlN0cmluZyxhdXRvWm9vbTpCb29sZWFufSxkMD1bImRlZmF1bHQiLCJub25lIl0saDA9e2Zvcm1hdEFyZ3M6e3NvdW5kKGUsdCl7ZDAuaW5jbHVkZXMoZSl8fCh0LnNvdW5kPSJub25lIil9LGF1dG9ab29tKGUsdCl7dHlwZW9mIGU9PSJ1bmRlZmluZWQiJiYodC5hdXRvWm9vbT0hMCl9fX0sZzA9ImdldFN5c3RlbVNldHRpbmciLHAwPSJnZXRBcHBBdXRob3JpemVTZXR0aW5nIix2MD0ib3BlbkFwcEF1dGhvcml6ZVNldHRpbmciLG0wPSJnZXRTdG9yYWdlIix1aD17a2V5Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LF8wPSJnZXRTdG9yYWdlU3luYyIsZmg9W3tuYW1lOiJrZXkiLHR5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfV0sYjA9InNldFN0b3JhZ2UiLEUwPXtrZXk6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxkYXRhOntyZXF1aXJlZDohMH19LHkwPSJzZXRTdG9yYWdlU3luYyIsdzA9W3tuYW1lOiJrZXkiLHR5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSx7bmFtZToiZGF0YSIscmVxdWlyZWQ6ITB9XSxkaD0icmVtb3ZlU3RvcmFnZSIsUzA9dWgsQTA9ZmgsQzA9InNhdmVGaWxlIixPMD17Zm9ybWF0QXJnczp7dGVtcEZpbGVQYXRoKGUsdCl7dC50ZW1wRmlsZVBhdGg9cHQoZSl9fX0sVDA9e3RlbXBGaWxlUGF0aDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSxQMD0iZ2V0U2F2ZWRGaWxlTGlzdCIsSTA9InJlbW92ZVNhdmVkRmlsZSIsTjA9e2Zvcm1hdEFyZ3M6e2ZpbGVQYXRoKGUsdCl7dC5maWxlUGF0aD1wdChlKX19fSxrMD17ZmlsZVBhdGg6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sUjA9ImdldEZpbGVJbmZvIix4MD17Zm9ybWF0QXJnczp7ZmlsZVBhdGgoZSx0KXt0LmZpbGVQYXRoPXB0KGUpfX19LEIwPXtmaWxlUGF0aDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSxNMD0iZ2V0U2F2ZWRGaWxlSW5mbyIsTDA9e2Zvcm1hdEFyZ3M6e2ZpbGVQYXRoKGUsdCl7dC5maWxlUGF0aD1wdChlKX19fSxEMD17ZmlsZVBhdGg6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sRjA9Im9wZW5Eb2N1bWVudCIsVjA9e2Zvcm1hdEFyZ3M6e2ZpbGVQYXRoKGUsdCl7dC5maWxlUGF0aD1wdChlKX19fSwkMD17ZmlsZVBhdGg6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxmaWxlVHlwZTpTdHJpbmd9LFUwPSJoaWRlS2V5Ym9hcmQiLEgwPSJzaG93S2V5Ym9hcmQiLGowPSJjaG9vc2VMb2NhdGlvbiIsejA9e2tleXdvcmQ6U3RyaW5nLGxhdGl0dWRlOk51bWJlcixsb25naXR1ZGU6TnVtYmVyfSxXMD0iZ2V0TG9jYXRpb24iLGhoPVsid2dzODQiLCJnY2owMiJdLEcwPXtmb3JtYXRBcmdzOnt0eXBlKGUsdCl7ZT0oZXx8IiIpLnRvTG93ZXJDYXNlKCksaGguaW5kZXhPZihlKT09PS0xP3QudHlwZT1oaFswXTp0LnR5cGU9ZX0sYWx0aXR1ZGUoZSx0KXt0LmFsdGl0dWRlPWV8fCExfX19LFkwPXt0eXBlOlN0cmluZyxhbHRpdHVkZTpCb29sZWFufSxxMD0ib3BlbkxvY2F0aW9uIixnaD0oZSx0KT0+e2lmKHQ9PT12b2lkIDApcmV0dXJuYCR7ZX0gc2hvdWxkIG5vdCBiZSBlbXB0eS5gO2lmKHR5cGVvZiB0IT0ibnVtYmVyIil7bGV0IG49dHlwZW9mIHQ7cmV0dXJuIG49blswXS50b1VwcGVyQ2FzZSgpK24uc3Vic3RyaW5nKDEpLGBFeHBlY3RlZCBOdW1iZXIsIGdvdCAke259IHdpdGggdmFsdWUgJHtKU09OLnN0cmluZ2lmeSh0KX0uYH19LEswPXtmb3JtYXRBcmdzOntsYXRpdHVkZShlLHQpe2xldCBuPWdoKCJsYXRpdHVkZSIsZSk7aWYobilyZXR1cm4gbjt0LmxhdGl0dWRlPWV9LGxvbmdpdHVkZShlLHQpe2xldCBuPWdoKCJsb25naXR1ZGUiLGUpO2lmKG4pcmV0dXJuIG47dC5sb25naXR1ZGU9ZX0sc2NhbGUoZSx0KXtlPU1hdGguZmxvb3IoZSksdC5zY2FsZT1lPj01JiZlPD0xOD9lOjE4fX19LEowPXtsYXRpdHVkZTpOdW1iZXIsbG9uZ2l0dWRlOk51bWJlcixzY2FsZTpOdW1iZXIsbmFtZTpTdHJpbmcsYWRkcmVzczpTdHJpbmd9LFowPSJjaG9vc2VJbWFnZSIsWDA9e2Zvcm1hdEFyZ3M6e2NvdW50KGUsdCl7KCFlfHxlPD0wKSYmKHQuY291bnQ9OSl9LHNpemVUeXBlKGUsdCl7dC5zaXplVHlwZT1fbihlLGtuKX0sc291cmNlVHlwZShlLHQpe3Quc291cmNlVHlwZT1fbihlLFVuKX0sZXh0ZW5zaW9uKGUsdCl7aWYoZSBpbnN0YW5jZW9mIEFycmF5JiZlLmxlbmd0aD09PTApcmV0dXJuInBhcmFtIGV4dGVuc2lvbiBzaG91bGQgbm90IGJlIGVtcHR5LiI7ZXx8KHQuZXh0ZW5zaW9uPVsiKiJdKX19fSxRMD17Y291bnQ6TnVtYmVyLHNpemVUeXBlOltBcnJheSxTdHJpbmddLHNvdXJjZVR5cGU6QXJyYXksZXh0ZW5zaW9uOkFycmF5fSxlRT0iY2hvb3NlVmlkZW8iLHRFPXtmb3JtYXRBcmdzOntzb3VyY2VUeXBlKGUsdCl7dC5zb3VyY2VUeXBlPV9uKGUsVW4pfSxjb21wcmVzc2VkOiEwLG1heER1cmF0aW9uOjYwLGNhbWVyYToiYmFjayIsZXh0ZW5zaW9uKGUsdCl7aWYoZSBpbnN0YW5jZW9mIEFycmF5JiZlLmxlbmd0aD09PTApcmV0dXJuInBhcmFtIGV4dGVuc2lvbiBzaG91bGQgbm90IGJlIGVtcHR5LiI7ZXx8KHQuZXh0ZW5zaW9uPVsiKiJdKX19fSxuRT17c291cmNlVHlwZTpBcnJheSxjb21wcmVzc2VkOkJvb2xlYW4sbWF4RHVyYXRpb246TnVtYmVyLGNhbWVyYTpTdHJpbmcsZXh0ZW5zaW9uOkFycmF5fSxyRT0iZ2V0SW1hZ2VJbmZvIixpRT17Zm9ybWF0QXJnczp7c3JjKGUsdCl7dC5zcmM9cHQoZSl9fX0sb0U9e3NyYzp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSxhRT0icHJldmlld0ltYWdlIixzRT17Zm9ybWF0QXJnczp7dXJscyhlLHQpe3QudXJscz1lLm1hcChuPT5ZLmlzU3RyaW5nKG4pJiZuP3B0KG4pOiIiKX0sY3VycmVudChlLHQpe3R5cGVvZiBlPT0ibnVtYmVyIj90LmN1cnJlbnQ9ZT4wJiZlPHQudXJscy5sZW5ndGg/ZTowOlkuaXNTdHJpbmcoZSkmJmUmJih0LmN1cnJlbnQ9cHQoZSkpfX19LGxFPXt1cmxzOnt0eXBlOkFycmF5LHJlcXVpcmVkOiEwfSxjdXJyZW50Ont0eXBlOltOdW1iZXIsU3RyaW5nXX19LGNFPSJjbG9zZVByZXZpZXdJbWFnZSIsdUU9ImdldFZpZGVvSW5mbyIsZkU9e2Zvcm1hdEFyZ3M6e3NyYyhlLHQpe3Quc3JjPXB0KGUpfX19LGRFPXtzcmM6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0saEU9InNhdmVJbWFnZVRvUGhvdG9zQWxidW0iLGdFPXtmb3JtYXRBcmdzOntmaWxlUGF0aChlLHQpe3QuZmlsZVBhdGg9cHQoZSl9fX0scEU9e2ZpbGVQYXRoOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LHZFPSJzYXZlVmlkZW9Ub1Bob3Rvc0FsYnVtIixtRT17Zm9ybWF0QXJnczp7ZmlsZVBhdGgoZSx0KXt0LmZpbGVQYXRoPXB0KGUpfX19LF9FPXtmaWxlUGF0aDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSxiRT0iZ2V0UmVjb3JkZXJNYW5hZ2VyIixFRT0iY29tcHJlc3NJbWFnZSIseUU9e2Zvcm1hdEFyZ3M6e3NyYyhlLHQpe3Quc3JjPXB0KGUpfX19LHdFPXtzcmM6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sU0U9ImNvbXByZXNzVmlkZW8iLEFFPXtmb3JtYXRBcmdzOntzcmMoZSx0KXt0LnNyYz1wdChlKX19fSxDRT17c3JjOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0scXVhbGl0eTpTdHJpbmcsYml0cmF0ZTpOdW1iZXIsZnBzOk51bWJlcixyZXNvbHV0aW9uOk51bWJlcn0sT0U9InJlcXVlc3QiLFRFPXtKU09OOiJqc29uIn0sUEU9WyJ0ZXh0IiwiYXJyYXlidWZmZXIiXSxJRT0idGV4dCIscGg9ZW5jb2RlVVJJQ29tcG9uZW50O2Z1bmN0aW9uIE5FKGUsdCl7bGV0IG49ZS5zcGxpdCgiIyIpLHI9blsxXXx8IiI7bj1uWzBdLnNwbGl0KCI/Iik7bGV0IGE9blsxXXx8IiI7ZT1uWzBdO2xldCB1PWEuc3BsaXQoIiYiKS5maWx0ZXIoYj0+YiksaD17fTt1LmZvckVhY2goYj0+e2xldCBVPWIuc3BsaXQoIj0iKTtoW1VbMF1dPVVbMV19KTtmb3IobGV0IGIgaW4gdClpZihZLmhhc093bih0LGIpKXtsZXQgVT10W2JdO3R5cGVvZiBVPT0idW5kZWZpbmVkInx8VT09PW51bGw/VT0iIjpZLmlzUGxhaW5PYmplY3QoVSkmJihVPUpTT04uc3RyaW5naWZ5KFUpKSxoW3BoKGIpXT1waChVKX1yZXR1cm4gYT1PYmplY3Qua2V5cyhoKS5tYXAoYj0+YCR7Yn09JHtoW2JdfWApLmpvaW4oIiYiKSxlKyhhPyI/IithOiIiKSsocj8iIyIrcjoiIil9bGV0IGtFPXttZXRob2Q6U3RyaW5nLGRhdGE6W09iamVjdCxTdHJpbmcsQXJyYXksQXJyYXlCdWZmZXJdLHVybDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LGhlYWRlcjpPYmplY3QsZGF0YVR5cGU6U3RyaW5nLHJlc3BvbnNlVHlwZTpTdHJpbmcsd2l0aENyZWRlbnRpYWxzOkJvb2xlYW59LFJFPXtmb3JtYXRBcmdzOnttZXRob2QoZSx0KXt0Lm1ldGhvZD1zbigoZXx8IiIpLnRvVXBwZXJDYXNlKCksbW4pfSxkYXRhKGUsdCl7dC5kYXRhPWV8fCIifSx1cmwoZSx0KXt0Lm1ldGhvZD09PW1uWzBdJiZZLmlzUGxhaW5PYmplY3QodC5kYXRhKSYmT2JqZWN0LmtleXModC5kYXRhKS5sZW5ndGgmJih0LnVybD1ORShlLHQuZGF0YSkpfSxoZWFkZXIoZSx0KXtsZXQgbj10LmhlYWRlcj1lfHx7fTt0Lm1ldGhvZCE9PW1uWzBdJiYoT2JqZWN0LmtleXMobikuZmluZChyPT5yLnRvTG93ZXJDYXNlKCk9PT0iY29udGVudC10eXBlIil8fChuWyJDb250ZW50LVR5cGUiXT0iYXBwbGljYXRpb24vanNvbiIpKX0sZGF0YVR5cGUoZSx0KXt0LmRhdGFUeXBlPShlfHxURS5KU09OKS50b0xvd2VyQ2FzZSgpfSxyZXNwb25zZVR5cGUoZSx0KXt0LnJlc3BvbnNlVHlwZT0oZXx8IiIpLnRvTG93ZXJDYXNlKCksUEUuaW5kZXhPZih0LnJlc3BvbnNlVHlwZSk9PT0tMSYmKHQucmVzcG9uc2VUeXBlPUlFKX19fSx4RT0iY29uZmlnTVRMUyIsQkU9e2NlcnRpZmljYXRlczp7dHlwZTpBcnJheSxyZXF1aXJlZDohMH19LE1FPXtmb3JtYXRBcmdzOntjZXJ0aWZpY2F0ZXMoZSl7aWYoZS5zb21lKHQ9PlkudG9SYXdUeXBlKHQuaG9zdCkhPT0iU3RyaW5nIikpcmV0dXJuIlx1NTNDMlx1NjU3MFx1OTE0RFx1N0Y2RVx1OTUxOVx1OEJFRlx1RkYwQ1x1OEJGN1x1Nzg2RVx1OEJBNFx1NTQwRVx1OTFDRFx1OEJENSJ9fX0sTEU9ImRvd25sb2FkRmlsZSIsREU9e2Zvcm1hdEFyZ3M6e2hlYWRlcihlLHQpe3QuaGVhZGVyPWV8fHt9fX19LEZFPXt1cmw6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxoZWFkZXI6T2JqZWN0LHRpbWVvdXQ6TnVtYmVyfSxWRT0idXBsb2FkRmlsZSIsJEU9e2Zvcm1hdEFyZ3M6e2ZpbGVQYXRoKGUsdCl7ZSYmKHQuZmlsZVBhdGg9cHQoZSkpfSxoZWFkZXIoZSx0KXt0LmhlYWRlcj1lfHx7fX0sZm9ybURhdGEoZSx0KXt0LmZvcm1EYXRhPWV8fHt9fX19LFVFPXt1cmw6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxmaWxlczpBcnJheSxmaWxlUGF0aDpTdHJpbmcsbmFtZTpTdHJpbmcsaGVhZGVyOk9iamVjdCxmb3JtRGF0YTpPYmplY3QsdGltZW91dDpOdW1iZXJ9LEhFPSJjb25uZWN0U29ja2V0IixqRT17Zm9ybWF0QXJnczp7aGVhZGVyKGUsdCl7dC5oZWFkZXI9ZXx8e319LG1ldGhvZChlLHQpe3QubWV0aG9kPXNuKChlfHwiIikudG9VcHBlckNhc2UoKSxtbil9LHByb3RvY29scyhlLHQpe1kuaXNTdHJpbmcoZSkmJih0LnByb3RvY29scz1bZV0pfX19LHpFPXt1cmw6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxoZWFkZXI6e3R5cGU6T2JqZWN0fSxtZXRob2Q6U3RyaW5nLHByb3RvY29sczpbQXJyYXksU3RyaW5nXX0sV0U9InNlbmRTb2NrZXRNZXNzYWdlIixHRT17ZGF0YTpbU3RyaW5nLEFycmF5QnVmZmVyXX0sWUU9ImNsb3NlU29ja2V0IixxRT17Y29kZTpOdW1iZXIscmVhc29uOlN0cmluZ307ZnVuY3Rpb24gS0UoZSl7aWYoIVkuaXNTdHJpbmcoZSkpcmV0dXJuIGU7bGV0IHQ9ZS5pbmRleE9mKCI/Iik7aWYodD09PS0xKXJldHVybiBlO2xldCBuPWUuc2xpY2UodCsxKS50cmltKCkucmVwbGFjZSgvXihcP3wjfCYpLywiIik7aWYoIW4pcmV0dXJuIGU7ZT1lLnNsaWNlKDAsdCk7bGV0IHI9W107cmV0dXJuIG4uc3BsaXQoIiYiKS5mb3JFYWNoKGE9PntsZXQgdT1hLnJlcGxhY2UoL1wrL2csIiAiKS5zcGxpdCgiPSIpLGg9dS5zaGlmdCgpLGI9dS5sZW5ndGg+MD91LmpvaW4oIj0iKToiIjtyLnB1c2goaCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKX0pLHIubGVuZ3RoP2UrIj8iK3Iuam9pbigiJiIpOmV9bGV0IEpFPVsic2xpZGUtaW4tcmlnaHQiLCJzbGlkZS1pbi1sZWZ0Iiwic2xpZGUtaW4tdG9wIiwic2xpZGUtaW4tYm90dG9tIiwiZmFkZS1pbiIsInpvb20tb3V0Iiwiem9vbS1mYWRlLW91dCIsInBvcC1pbiIsIm5vbmUiXSxaRT1bInNsaWRlLW91dC1yaWdodCIsInNsaWRlLW91dC1sZWZ0Iiwic2xpZGUtb3V0LXRvcCIsInNsaWRlLW91dC1ib3R0b20iLCJmYWRlLW91dCIsInpvb20taW4iLCJ6b29tLWZhZGUtaW4iLCJwb3Atb3V0Iiwibm9uZSJdLE9sPXt1cmw6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sQnU9Im5hdmlnYXRlVG8iLE11PSJyZWRpcmVjdFRvIix2aD0icmVMYXVuY2giLE5jPSJzd2l0Y2hUYWIiLFhFPSJuYXZpZ2F0ZUJhY2siLEx1PSJwcmVsb2FkUGFnZSIsbWg9InVuUHJlbG9hZFBhZ2UiLFFFPVkuZXh0ZW5kKHt9LE9sLF9oKEpFKSksZXk9WS5leHRlbmQoe2RlbHRhOnt0eXBlOk51bWJlcn19LF9oKFpFKSksdHk9T2wsbnk9T2wscnk9T2wsaXk9T2wsb3k9T2wsYXk9UmMoQnUpLHN5PVJjKE11KSxseT1SYyh2aCksY3k9UmMoTmMpLHV5PXtmb3JtYXRBcmdzOntkZWx0YShlLHQpe2U9cGFyc2VJbnQoZSsiIil8fDEsdC5kZWx0YT1NYXRoLm1pbihWbigpLmxlbmd0aC0xLGUpfX19O2Z1bmN0aW9uIF9oKGUpe3JldHVybnthbmltYXRpb25UeXBlOnt0eXBlOlN0cmluZyx2YWxpZGF0b3IodCl7aWYodCYmZS5pbmRleE9mKHQpPT09LTEpcmV0dXJuImAiK3QrImAgaXMgbm90IHN1cHBvcnRlZCBmb3IgYGFuaW1hdGlvblR5cGVgIChzdXBwb3J0ZWQgdmFsdWVzIGFyZTogYCIrZS5qb2luKCJgfGAiKSsiYCkifX0sYW5pbWF0aW9uRHVyYXRpb246e3R5cGU6TnVtYmVyfX19bGV0IGtjO2Z1bmN0aW9uIGZ5KCl7a2M9IiJ9ZnVuY3Rpb24gUmMoZSl7cmV0dXJue2Zvcm1hdEFyZ3M6e3VybDpkeShlKX0sYmVmb3JlQWxsOmZ5fX1mdW5jdGlvbiBkeShlKXtyZXR1cm4gZnVuY3Rpb24obixyKXtpZighbilyZXR1cm4nTWlzc2luZyByZXF1aXJlZCBhcmdzOiAidXJsIic7bj1iYShuKTtsZXQgYT1uLnNwbGl0KCI/IilbMF0sdT1JaShhLCEwKTtpZighdSlyZXR1cm4icGFnZSBgIituKyJgIGlzIG5vdCBmb3VuZCI7aWYoZT09PUJ1fHxlPT09TXUpe2lmKHUubWV0YS5pc1RhYkJhcilyZXR1cm5gY2FuIG5vdCAke2V9IGEgdGFiYmFyIHBhZ2VgfWVsc2UgaWYoZT09PU5jJiYhdS5tZXRhLmlzVGFiQmFyKXJldHVybiJjYW4gbm90IHN3aXRjaCB0byBuby10YWJCYXIgcGFnZSI7aWYoKGU9PT1OY3x8ZT09PUx1KSYmdS5tZXRhLmlzVGFiQmFyJiZyLm9wZW5UeXBlIT09ImFwcExhdW5jaCImJihuPWEpLHUubWV0YS5pc0VudHJ5JiYobj1uLnJlcGxhY2UodS5hbGlhcywiLyIpKSxyLnVybD1LRShuKSxlIT09bWgpe2lmKGU9PT1MdSl7aWYoIXUubWV0YS5pc05WdWUpcmV0dXJuImNhbiBub3QgcHJlbG9hZCB2dWUgcGFnZSI7aWYodS5tZXRhLmlzVGFiQmFyKXtsZXQgaD1WbigpLGI9dS5wYXRoLnNsaWNlKDEpO2lmKGguZmluZChVPT5VLnJvdXRlPT09YikpcmV0dXJuInRhYkJhciBwYWdlIGAiK2IrImAgYWxyZWFkeSBleGlzdHMifXJldHVybn1pZihrYz09PW4mJnIub3BlblR5cGUhPT0iYXBwTGF1bmNoIilyZXR1cm5gJHtrY30gbG9ja2VkYDtULnJlYWR5JiYoa2M9bil9fX1sZXQgaHk9ImhpZGVMb2FkaW5nIixneT0iaGlkZVRvYXN0IixiaD0ibG9hZEZvbnRGYWNlIixweT17ZmFtaWx5Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sc291cmNlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sZGVzYzpPYmplY3R9LHZ5PVsiI2ZmZmZmZiIsIiMwMDAwMDAiXSxteT0ic2V0TmF2aWdhdGlvbkJhckNvbG9yIixfeT17Zm9ybWF0QXJnczp7YW5pbWF0aW9uKGUsdCl7ZXx8KGU9e2R1cmF0aW9uOjAsdGltaW5nRnVuYzoibGluZWFyIn0pLHQuYW5pbWF0aW9uPXtkdXJhdGlvbjplLmR1cmF0aW9ufHwwLHRpbWluZ0Z1bmM6ZS50aW1pbmdGdW5jfHwibGluZWFyIn19fX0sYnk9e2Zyb250Q29sb3I6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcihlKXtpZih2eS5pbmRleE9mKGUpPT09LTEpcmV0dXJuYGludmFsaWQgZnJvbnRDb2xvciAiJHtlfSJgfX0sYmFja2dyb3VuZENvbG9yOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sYW5pbWF0aW9uOk9iamVjdH0sRXk9InNldE5hdmlnYXRpb25CYXJUaXRsZSIseXk9e3RpdGxlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LHd5PSJzaG93TmF2aWdhdGlvbkJhckxvYWRpbmciLFN5PSJoaWRlTmF2aWdhdGlvbkJhckxvYWRpbmciLEVoPSJwYWdlU2Nyb2xsVG8iLEF5PXtzY3JvbGxUb3A6TnVtYmVyLHNlbGVjdG9yOlN0cmluZyxkdXJhdGlvbjpOdW1iZXJ9LEN5PXtmb3JtYXRBcmdzOntkdXJhdGlvbjozMDB9fSxPeT0ic2hvd0FjdGlvblNoZWV0IixUeT17aXRlbUxpc3Q6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITB9LHRpdGxlOlN0cmluZyxpdGVtQ29sb3I6U3RyaW5nLHBvcG92ZXI6T2JqZWN0fSxQeT17Zm9ybWF0QXJnczp7aXRlbUNvbG9yOiIjMDAwIn19LEl5PSJzaG93TG9hZGluZyIsTnk9e3RpdGxlOlN0cmluZyxtYXNrOkJvb2xlYW59LGt5PXtmb3JtYXRBcmdzOnt0aXRsZToiIixtYXNrOiExfX0sUnk9InNob3dNb2RhbCIseHk9e3RpdGxlOlN0cmluZyxjb250ZW50OlN0cmluZyxzaG93Q2FuY2VsOkJvb2xlYW4sY2FuY2VsVGV4dDpTdHJpbmcsY2FuY2VsQ29sb3I6U3RyaW5nLGNvbmZpcm1UZXh0OlN0cmluZyxjb25maXJtQ29sb3I6U3RyaW5nfSxCeT17YmVmb3JlSW52b2tlKCl7Y24oKX0sZm9ybWF0QXJnczp7dGl0bGU6IiIsY29udGVudDoiIixwbGFjZWhvbGRlclRleHQ6IiIsc2hvd0NhbmNlbDohMCxlZGl0YWJsZTohMSxjYW5jZWxUZXh0KGUsdCl7aWYoIVkuaGFzT3duKHQsImNhbmNlbFRleHQiKSl7bGV0e3Q6bn09WCgpO3QuY2FuY2VsVGV4dD1uKCJ1bmkuc2hvd01vZGFsLmNhbmNlbCIpfX0sY2FuY2VsQ29sb3I6IiMwMDAiLGNvbmZpcm1UZXh0KGUsdCl7aWYoIVkuaGFzT3duKHQsImNvbmZpcm1UZXh0Iikpe2xldHt0Om59PVgoKTt0LmNvbmZpcm1UZXh0PW4oInVuaS5zaG93TW9kYWwuY29uZmlybSIpfX0sY29uZmlybUNvbG9yOnRlLlBSSU1BUllfQ09MT1J9fSxNeT0ic2hvd1RvYXN0IixMeT1bInN1Y2Nlc3MiLCJsb2FkaW5nIiwibm9uZSIsImVycm9yIl0sRHk9e3RpdGxlOlN0cmluZyxpY29uOlN0cmluZyxpbWFnZTpTdHJpbmcsZHVyYXRpb246TnVtYmVyLG1hc2s6Qm9vbGVhbn0sRnk9e2Zvcm1hdEFyZ3M6e3RpdGxlOiIiLGljb24oZSx0KXt0Lmljb249c24oZSxMeSl9LGltYWdlKGUsdCl7ZT90LmltYWdlPXB0KGUpOnQuaW1hZ2U9IiJ9LGR1cmF0aW9uOjE1MDAsbWFzazohMX19LFZ5PSJzdGFydFB1bGxEb3duUmVmcmVzaCIsJHk9InN0b3BQdWxsRG93blJlZnJlc2giLHJjPXtpbmRleDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITB9fSxicz17YmVmb3JlSW52b2tlKCl7bGV0IGU9aWEoKTtpZihlJiYhZS5pc1RhYkJhcilyZXR1cm4ibm90IFRhYkJhciBwYWdlIn0sZm9ybWF0QXJnczp7aW5kZXgoZSl7aWYoIVQudGFiQmFyLmxpc3RbZV0pcmV0dXJuInRhYmJhciBpdGVtIG5vdCBmb3VuZCJ9fX0sVXk9InNldFRhYkJhckl0ZW0iLEh5PVkuZXh0ZW5kKHt0ZXh0OlN0cmluZyxpY29uUGF0aDpTdHJpbmcsc2VsZWN0ZWRJY29uUGF0aDpTdHJpbmcscGFnZVBhdGg6U3RyaW5nfSxyYyksank9e2JlZm9yZUludm9rZTpicy5iZWZvcmVJbnZva2UsZm9ybWF0QXJnczpZLmV4dGVuZCh7cGFnZVBhdGgoZSx0KXtlJiYodC5wYWdlUGF0aD10ZS5yZW1vdmVMZWFkaW5nU2xhc2goZSkpfX0sYnMuZm9ybWF0QXJncyl9LHp5PSJzZXRUYWJCYXJTdHlsZSIsV3k9e2NvbG9yOlN0cmluZyxzZWxlY3RlZENvbG9yOlN0cmluZyxiYWNrZ3JvdW5kQ29sb3I6U3RyaW5nLGJhY2tncm91bmRJbWFnZTpTdHJpbmcsYmFja2dyb3VuZFJlcGVhdDpTdHJpbmcsYm9yZGVyU3R5bGU6U3RyaW5nfSxHeT0vXihsaW5lYXJ8cmFkaWFsKS1ncmFkaWVudFwoLis/XCk7PyQvLFl5PXtiZWZvcmVJbnZva2U6YnMuYmVmb3JlSW52b2tlLGZvcm1hdEFyZ3M6e2JhY2tncm91bmRJbWFnZShlLHQpe2UmJiFHeS50ZXN0KGUpJiYodC5iYWNrZ3JvdW5kSW1hZ2U9cHQoZSkpfSxib3JkZXJTdHlsZShlLHQpe2UmJih0LmJvcmRlclN0eWxlPWU9PT0id2hpdGUiPyJ3aGl0ZSI6ImJsYWNrIil9fX0scXk9ImhpZGVUYWJCYXIiLHloPXthbmltYXRpb246Qm9vbGVhbn0sS3k9InNob3dUYWJCYXIiLEp5PXloLFp5PSJoaWRlVGFiQmFyUmVkRG90IixYeT1yYyxReT1icyxldz0ic2hvd1RhYkJhclJlZERvdCIsdHc9cmMsbnc9YnMscnc9InJlbW92ZVRhYkJhckJhZGdlIixpdz1yYyxvdz1icyxhdz0ic2V0VGFiQmFyQmFkZ2UiLHN3PVkuZXh0ZW5kKHt0ZXh0Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LHJjKSxsdz17YmVmb3JlSW52b2tlOmJzLmJlZm9yZUludm9rZSxmb3JtYXRBcmdzOlkuZXh0ZW5kKHt0ZXh0KGUsdCl7dGUuZ2V0TGVuKGUpPj00JiYodC50ZXh0PSIuLi4iKX19LGJzLmZvcm1hdEFyZ3MpfSxjdz0iZ2V0UHJvdmlkZXIiLHV3PXtzZXJ2aWNlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LGZ3PSJsb2dpbiIsZHc9e3Byb3ZpZGVyOlN0cmluZyxzY29wZXM6W1N0cmluZyxBcnJheV0sdGltZW91dDpOdW1iZXIsdW5pdmVyaWZ5U3R5bGU6T2JqZWN0LG9ubHlBdXRob3JpemU6Qm9vbGVhbn0saHc9ImdldFVzZXJJbmZvIixndz17cHJvdmlkZXI6U3RyaW5nLHdpdGhDcmVkZW50aWFsczpCb29sZWFuLHRpbWVvdXQ6TnVtYmVyLGxhbmc6U3RyaW5nfSxwdz0iZ2dldFVzZXJQcm9maWxlZ2V0VXNlclByb2ZpbGUiLHZ3PXtwcm92aWRlcjpTdHJpbmcsd2l0aENyZWRlbnRpYWxzOkJvb2xlYW4sdGltZW91dDpOdW1iZXIsbGFuZzpTdHJpbmd9LG13PSJwcmVMb2dpbiIsX3c9e1VOSVZFUklGWToidW5pdmVyaWZ5In0sYnc9e2Zvcm1hdEFyZ3M6e3Byb3ZpZGVyKGUsdCl7aWYoT2JqZWN0LnZhbHVlcyhfdykuaW5kZXhPZihTdHJpbmcoZSkpPDApcmV0dXJuInByb3ZpZGVyIGVycm9yIn19fSxFdz17cHJvdmlkZXI6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0seXc9ImNsb3NlQXV0aFZpZXciLHd3PSJnZXRDaGVja0JveFN0YXRlIixTdz0iZ2V0VW5pdmVyaWZ5TWFuYWdlciIsQXc9InNoYXJlIix3aD1bIldYU2NlbmVTZXNzaW9uIiwiV1hTY2VuZVRpbWVsaW5lIiwiV1hTY2VuZUZhdm9yaXRlIl0sQ3c9e2Zvcm1hdEFyZ3M6e3NjZW5lKGUsdCl7bGV0e3Byb3ZpZGVyOm4sb3BlbkN1c3RvbWVyU2VydmljZUNoYXQ6cn09dDtpZihuPT09IndlaXhpbiImJiFyJiYoIWV8fCF3aC5pbmNsdWRlcyhlKSkpcmV0dXJuYFx1NTIwNlx1NEVBQlx1NTIzMFx1NUZBRVx1NEZFMVx1NjVGNlx1RkYwQ3NjZW5lXHU1RkM1XHU5ODdCXHU0RTNBXHU0RUU1XHU0RTBCXHU1MTc2XHU0RTJEXHU0RTAwXHU0RTJBXHVGRjFBJHt3aC5qb2luKCJcdTMwMDEiKX1gfSxzdW1tYXJ5KGUsdCl7aWYodC50eXBlPT09MSYmIWUpcmV0dXJuIlx1NTIwNlx1NEVBQlx1N0VBRlx1NjU4N1x1NjcyQ1x1NjVGNlx1RkYwQ3N1bW1hcnlcdTVGQzVcdTU4NkIifSxocmVmKGUsdCl7aWYodC50eXBlPT09MCYmIWUpcmV0dXJuIlx1NTIwNlx1NEVBQlx1NTZGRVx1NjU4N1x1NjVGNlx1RkYwQ2hyZWZcdTVGQzVcdTU4NkIifSxpbWFnZVVybChlLHQpe2lmKFswLDIsNV0uaW5jbHVkZXMoTnVtYmVyKHQudHlwZSkpJiYhZSlyZXR1cm4iXHU1MjA2XHU0RUFCXHU1NkZFXHU2NTg3XHUzMDAxXHU3RUFGXHU1NkZFXHU3MjQ3XHUzMDAxXHU1QzBGXHU3QTBCXHU1RThGXHU2NUY2XHVGRjBDaW1hZ2VVcmxcdTVGQzVcdTU4NkJcdUZGMENcdTYzQThcdTgzNTBcdTRGN0ZcdTc1MjhcdTVDMEZcdTRFOEUyMEtiXHU3Njg0XHU1NkZFXHU3MjQ3In0sbWVkaWFVcmwoZSx0KXtpZihbMyw0XS5pbmNsdWRlcyhOdW1iZXIodC50eXBlKSkmJiFlKXJldHVybiJcdTUyMDZcdTRFQUJcdTk3RjNcdTRFNTBcdTMwMDFcdTg5QzZcdTk4OTFcdTY1RjZcdUZGMENtZWRpYVVybFx1NUZDNVx1NTg2QiJ9LG1pbmlQcm9ncmFtKGUsdCl7aWYodC50eXBlPT09NSYmIWUpcmV0dXJuIlx1NTIwNlx1NEVBQlx1NUMwRlx1N0EwQlx1NUU4Rlx1NjVGNlx1RkYwQ21pbmlQcm9ncmFtXHU1RkM1XHU1ODZCIn0sY29ycGlkKGUsdCl7aWYodC5vcGVuQ3VzdG9tZXJTZXJ2aWNlQ2hhdCYmIWUpcmV0dXJuIlx1NEY3Rlx1NzUyOFx1NjI1M1x1NUYwMFx1NUJBMlx1NjcwRFx1NTI5Rlx1ODBGRFx1NjVGNiBjb3JwaWQgXHU1RkM1XHU1ODZCIn0sY3VzdG9tZXJVcmwoZSx0KXtpZih0Lm9wZW5DdXN0b21lclNlcnZpY2VDaGF0JiYhZSlyZXR1cm4iXHU0RjdGXHU3NTI4XHU2MjUzXHU1RjAwXHU1QkEyXHU2NzBEXHU1MjlGXHU4MEZEXHU2NUY2IGN1c3RvbWVyVXJsIFx1NUZDNVx1NTg2QiJ9fX0sT3c9e3Byb3ZpZGVyOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sdHlwZTpOdW1iZXIsdGl0bGU6U3RyaW5nLHNjZW5lOlN0cmluZyxzdW1tYXJ5OlN0cmluZyxocmVmOlN0cmluZyxpbWFnZVVybDpTdHJpbmcsbWVkaWFVcmw6U3RyaW5nLG1pbmlQcm9ncmFtOk9iamVjdH0sVHc9InNoYXJlV2l0aFN5c3RlbSIsU2g9WyJ0ZXh0IiwiaW1hZ2UiXSxQdz17Zm9ybWF0QXJnczp7dHlwZShlLHQpe2lmKGUmJiFTaC5pbmNsdWRlcyhlKSlyZXR1cm4iXHU1MjA2XHU0RUFCXHU1M0MyXHU2NTcwIHR5cGUgXHU0RTBEXHU2QjYzXHU3ODZFXHUzMDAyXHU1M0VBXHU2NTJGXHU2MzAxdGV4dFx1MzAwMWltYWdlIjt0LnR5cGU9c24oZSxTaCl9fX0sSXc9e3R5cGU6U3RyaW5nLHN1bW1hcnk6U3RyaW5nLGhyZWY6U3RyaW5nLGltYWdlVXJsOlN0cmluZ30sTnc9InJlcXVlc3RQYXltZW50Iixrdz17cHJvdmlkZXI6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxvcmRlckluZm86e3R5cGU6W1N0cmluZyxPYmplY3RdLHJlcXVpcmVkOiEwfSx0aW1lU3RhbXA6U3RyaW5nLG5vbmNlU3RyOlN0cmluZyxwYWNrYWdlOlN0cmluZyxzaWduVHlwZTpTdHJpbmcscGF5U2lnbjpTdHJpbmd9LFJ3PSJjcmVhdGVQdXNoTWVzc2FnZSIseHc9e2Zvcm1hdEFyZ3M6e2NvbnRlbnQoZSl7aWYoIWUpcmV0dXJuImNvbnRlbnQgaXMgcmVxdWlyZWQifX19LEJ3PSJjcmVhdGVSZXdhcmRlZFZpZGVvQWQiLE13PXtmb3JtYXRBcmdzOnthZHBpZDoiIixhZFVuaXRJZDoiIn19LEx3PXthZHBpZDpTdHJpbmcsYWRVbml0SWQ6U3RyaW5nfSxEdz0iY3JlYXRlRnVsbFNjcmVlblZpZGVvQWQiLEZ3PXtmb3JtYXRBcmdzOnthZHBpZDoiIn19LFZ3PXthZHBpZDpTdHJpbmd9LCR3PSJjcmVhdGVJbnRlcnN0aXRpYWxBZCIsVXc9e2Zvcm1hdEFyZ3M6e2FkcGlkOiIiLGFkVW5pdElkOiIifX0sSHc9e2FkcGlkOlN0cmluZyxhZFVuaXRJZDpTdHJpbmd9LGp3PSJjcmVhdGVJbnRlcmFjdGl2ZUFkIix6dz17Zm9ybWF0QXJnczp7YWRwaWQoZSx0KXtpZighZSlyZXR1cm4iYWRwaWQgc2hvdWxkIG5vdCBiZSBlbXB0eS4iO2UmJih0LmFkcGlkPWUpfSxwcm92aWRlcihlLHQpe2lmKCFlKXJldHVybiJwcm92aWRlciBzaG91bGQgbm90IGJlIGVtcHR5LiI7ZSYmKHQucHJvdmlkZXI9ZSl9fX0sV3c9e2FkcGlkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0scHJvdmlkZXI6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX07ZnVuY3Rpb24gWXMoZSx0KXtyZXR1cm4gZnVuY3Rpb24ocil7ZGVsZXRlIHIuY29kZSxkZWxldGUgci5tZXNzYWdlLFkuaXNGdW5jdGlvbih0KSYmKHI9dChyKSksZShyKX19ZnVuY3Rpb24gYXIoZSx0KXtyZXR1cm4gZnVuY3Rpb24ocil7cj1yfHx7fSx0PXIubWVzc2FnZXx8dHx8IiIsZGVsZXRlIHIubWVzc2FnZSxlKHQsWS5leHRlbmQoe2NvZGU6MH0scikpfX1mdW5jdGlvbiBUbChlLHQpe3JldHVybiBmdW5jdGlvbigpe2UoKShmdW5jdGlvbihyKXtyJiYoZGVsZXRlIHIuY29kZSxkZWxldGUgci5tZXNzYWdlKSxzdC5pbnZva2VPbkNhbGxiYWNrKHQscil9KX19ZnVuY3Rpb24gc2koZSx0LG4pe3JldHVybiBmdW5jdGlvbihyLHtyZXNvbHZlOmEscmVqZWN0OnV9KXtlKCkoWS5leHRlbmQoe30sWS5pc0Z1bmN0aW9uKHQpP3Qocik6cix7c3VjY2VzczpZcyhhLG4pLGZhaWw6YXIodSl9KSl9fWZ1bmN0aW9uIGljKGU9IiIpe2lmKCEoVC50YWJCYXImJlkuaXNBcnJheShULnRhYkJhci5saXN0KSkpcmV0dXJuITE7dHJ5e2lmKCFlKXtsZXQgbj1WbigpO2lmKCFuLmxlbmd0aClyZXR1cm4hMTtsZXQgcj1uW24ubGVuZ3RoLTFdO3JldHVybiByP3IuJHBhZ2UubWV0YS5pc1RhYkJhcjohMX0vXlwvLy50ZXN0KGUpfHwoZT10ZS5hZGRMZWFkaW5nU2xhc2goZSkpO2xldCB0PUlpKGUpO3JldHVybiB0JiZ0Lm1ldGEuaXNUYWJCYXJ9Y2F0Y2godCl7fXJldHVybiExfWxldCBoYT0iX19UWVBFIixHdz0idW5pLXN0b3JhZ2Uta2V5cyI7ZnVuY3Rpb24gRHUoZSl7bGV0IHQ9WyJvYmplY3QiLCJzdHJpbmciLCJudW1iZXIiLCJib29sZWFuIiwidW5kZWZpbmVkIl07dHJ5e2xldCBuPVkuaXNTdHJpbmcoZSk/SlNPTi5wYXJzZShlKTplLHI9bi50eXBlO2lmKHQuaW5kZXhPZihyKT49MCl7bGV0IGE9T2JqZWN0LmtleXMobik7aWYoYS5sZW5ndGg9PT0yJiYiZGF0YSJpbiBuKXtpZih0eXBlb2Ygbi5kYXRhPT09cilyZXR1cm4gbi5kYXRhO2lmKHI9PT0ib2JqZWN0IiYmL15cZHs0fS1cZHsyfS1cZHsyfVRcZHsyfVw6XGR7Mn1cOlxkezJ9XC5cZHszfVokLy50ZXN0KG4uZGF0YSkpcmV0dXJuIG5ldyBEYXRlKG4uZGF0YSl9ZWxzZSBpZihhLmxlbmd0aD09PTEpcmV0dXJuIiJ9fWNhdGNoKG4pe319bGV0IFl3PU10KHkwLChlLHQpPT57bGV0IG49dHlwZW9mIHQscj1uPT09InN0cmluZyI/dDpKU09OLnN0cmluZ2lmeSh7dHlwZTpuLGRhdGE6dH0pO3RyeXtuPT09InN0cmluZyImJkR1KHIpIT09dm9pZCAwP2wuc3RvcmFnZS5zZXRJdGVtKGUraGEsbik6bC5zdG9yYWdlLnJlbW92ZUl0ZW0oZStoYSksbC5zdG9yYWdlLnNldEl0ZW0oZSxyKX1jYXRjaChhKXt9fSx3MCkscXc9eWUoYjAsKHtrZXk6ZSxkYXRhOnR9LHtyZXNvbHZlOm4scmVqZWN0OnJ9KT0+e2xldCBhPXR5cGVvZiB0LHU9YT09PSJzdHJpbmciP3Q6SlNPTi5zdHJpbmdpZnkoe3R5cGU6YSxkYXRhOnR9KTt0cnl7bGV0IGg9bC5zdG9yYWdlO2E9PT0ic3RyaW5nIiYmRHUodSkhPT12b2lkIDA/aC5zZXRJdGVtQXN5bmMoZStoYSxhKTpoLnJlbW92ZUl0ZW1Bc3luYyhlK2hhKSxoLnNldEl0ZW1Bc3luYyhlLHUsbixhcihyKSl9Y2F0Y2goaCl7cihoLm1lc3NhZ2UpfX0sRTApO2Z1bmN0aW9uIEZ1KGUsdCl7bGV0IG49dDtpZihlIT09InN0cmluZyJ8fGU9PT0ic3RyaW5nIiYmdD09PSd7InR5cGUiOiJ1bmRlZmluZWQifScpdHJ5e2xldCByPUpTT04ucGFyc2UodCksYT1EdShyKTtpZihhIT09dm9pZCAwKW49YTtlbHNlIGlmKGUmJihuPXIsWS5pc1N0cmluZyhyKSkpe3I9SlNPTi5wYXJzZShyKTtsZXQgdT10eXBlb2Ygcjt1PT09Im51bWJlciImJmU9PT0iZGF0ZSI/bj1uZXcgRGF0ZShyKTp1PT09KFsibnVsbCIsImFycmF5Il0uaW5kZXhPZihlKTwwP2U6Im9iamVjdCIpJiYobj1yKX19Y2F0Y2gocil7fXJldHVybiBufWxldCBLdz1NdChfMCwoZSx0KT0+e2xldCBuPWwuc3RvcmFnZS5nZXRJdGVtKGUpLGE9KGwuc3RvcmFnZS5nZXRJdGVtKGUraGEpfHwiIikudG9Mb3dlckNhc2UoKTtyZXR1cm4gWS5pc1N0cmluZyhuKT9GdShhLG4pOiIifSxmaCksSnc9eWUobTAsKHtrZXk6ZX0se3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9bC5zdG9yYWdlO3IuZ2V0SXRlbUFzeW5jKGUsZnVuY3Rpb24oYSl7ci5nZXRJdGVtQXN5bmMoZStoYSxmdW5jdGlvbih1KXtsZXQgYj0odS5kYXRhfHwiIikudG9Mb3dlckNhc2UoKTt0KHtkYXRhOkZ1KGIsYS5kYXRhKX0pfSxmdW5jdGlvbigpe3Qoe2RhdGE6RnUoIiIsYS5kYXRhKX0pfSl9LGFyKG4pKX0sdWgpLFp3PU10KGRoLGU9PntsLnN0b3JhZ2UucmVtb3ZlSXRlbShlK2hhKSxsLnN0b3JhZ2UucmVtb3ZlSXRlbShlKX0sQTApLFh3PXllKGRoLCh7a2V5OmV9LHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2wuc3RvcmFnZS5yZW1vdmVJdGVtQXN5bmMoZStoYSksbC5zdG9yYWdlLnJlbW92ZUl0ZW1Bc3luYyhlLHQsYXIobikpfSxTMCksUXc9TXQoImNsZWFyU3RvcmFnZVN5bmMiLCgpPT57bC5zdG9yYWdlLmNsZWFyKCl9KSxlUz15ZSgiY2xlYXJTdG9yYWdlIiwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsLnN0b3JhZ2UuY2xlYXJBc3luYyh0LGFyKG4pKX0pLEFoPU10KCJnZXRTdG9yYWdlSW5mb1N5bmMiLCgpPT57bGV0IGU9bC5zdG9yYWdlLmdldExlbmd0aCgpfHwwLHQ9W10sbj0wO2ZvcihsZXQgcj0wO3I8ZTtyKyspe2xldCBhPWwuc3RvcmFnZS5rZXkocik7aWYoYSE9PUd3JiYoYS5pbmRleE9mKGhhKTwwfHxhLmluZGV4T2YoaGEpK2hhLmxlbmd0aCE9PWEubGVuZ3RoKSl7bGV0IHU9bC5zdG9yYWdlLmdldEl0ZW0oYSk7bis9YS5sZW5ndGgrdS5sZW5ndGgsdC5wdXNoKGEpfX1yZXR1cm57a2V5czp0LGN1cnJlbnRTaXplOk1hdGguY2VpbChuKjIvMTAyNCksbGltaXRTaXplOk51bWJlci5NQVhfVkFMVUV9fSksdFM9eWUoImdldFN0b3JhZ2VJbmZvIiwoZSx7cmVzb2x2ZTp0fSk9Pnt0KEFoKCkpfSksblM9eWUoUjAsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bC5pby5nZXRGaWxlSW5mbyhZLmV4dGVuZChlLHtzdWNjZXNzOllzKHQpLGZhaWw6YXIobil9KSl9LEIwLHgwKSxyUz0wLENoPSJ1bmlhcHBfc2F2ZSIsaVM9YF9kb2MvJHtDaH1gO2Z1bmN0aW9uIG9TKGUsdCl7dD10fHxmdW5jdGlvbigpe30sbC5pby5yZXF1ZXN0RmlsZVN5c3RlbShsLmlvLlBSSVZBVEVfRE9DLG49PntuLnJvb3QuZ2V0RGlyZWN0b3J5KENoLHtjcmVhdGU6ITB9LGUsdCl9LHQpfWxldCBhUz15ZShDMCwoe3RlbXBGaWxlUGF0aDplfSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1hcihuKSxhPWAke0RhdGUubm93KCl9JHtyUysrfSR7WW8oZSl9YDtsLmlvLnJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUkwoZSx1PT57b1MoaD0+e3UuY29weVRvKGgsYSwoKT0+e2xldCBiPWlTKyIvIithO3Qoe3NhdmVkRmlsZVBhdGg6Yn0pfSxyKX0scil9LHIpfSxUMCxPMCksc1M9InVuaWFwcF9zYXZlIjtmdW5jdGlvbiBsUyhlLHQpe3Q9dHx8ZnVuY3Rpb24oKXt9LGwuaW8ucmVxdWVzdEZpbGVTeXN0ZW0obC5pby5QUklWQVRFX0RPQyxuPT57bi5yb290LmdldERpcmVjdG9yeShzUyx7Y3JlYXRlOiEwfSxlLHQpfSx0KX1sZXQgY1M9eWUoUDAsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9YXIobik7bFMoYT0+e3ZhciB1PWEuY3JlYXRlUmVhZGVyKCksaD1bXTt1LnJlYWRFbnRyaWVzKGI9PntiJiZiLmxlbmd0aD9iLmZvckVhY2goVT0+e1UuZ2V0TWV0YWRhdGEoTz0+e2gucHVzaCh7ZmlsZVBhdGg6bC5pby5jb252ZXJ0QWJzb2x1dGVGaWxlU3lzdGVtKFUuZnVsbFBhdGgpLGNyZWF0ZVRpbWU6Ty5tb2RpZmljYXRpb25UaW1lLmdldFRpbWUoKSxzaXplOk8uc2l6ZX0pLGgubGVuZ3RoPT09Yi5sZW5ndGgmJnQoe2ZpbGVMaXN0Omh9KX0sciwhMSl9KTp0KHtmaWxlTGlzdDpofSl9LHIpfSxyKX0pLHVTPXllKE0wLCh7ZmlsZVBhdGg6ZX0se3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9YXIobik7bC5pby5yZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJMKGUsYT0+e2EuZ2V0TWV0YWRhdGEodT0+e3Qoe2NyZWF0ZVRpbWU6dS5tb2RpZmljYXRpb25UaW1lLmdldFRpbWUoKSxzaXplOnUuc2l6ZX0pfSxyLCExKX0scil9LEQwLEwwKSxmUz15ZShJMCwoe2ZpbGVQYXRoOmV9LHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPWFyKG4pO2wuaW8ucmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSTChlLGE9PnthLnJlbW92ZSgoKT0+e3QoKX0scil9LHIpfSxrMCxOMCksZFM9eWUoRjAsKHtmaWxlUGF0aDplLGZpbGVUeXBlOnR9LHtyZXNvbHZlOm4scmVqZWN0OnJ9KT0+e2xldCBhPWFyKHIpO2wucnVudGltZS5vcGVuRG9jdW1lbnQocHQoZSksdm9pZCAwLG4sYSl9LCQwLFYwKSxoUz1NdChzYixlPT4hIVkuaGFzT3duKGd0LGUpLGxiKSxWdTtmdW5jdGlvbiBnUygpe3JldHVybiBWdT1WdXx8bC5kZXZpY2UudXVpZCxWdX1sZXQgb2MsJHU9ITAscnI7ZnVuY3Rpb24gcFMoZSx0LG4peyFycnx8KGU9PT0ibm9uZSI/KHJyLmhpZGVUYWJCYXJSZWREb3Qoe2luZGV4OnR9KSxyci5yZW1vdmVUYWJCYXJCYWRnZSh7aW5kZXg6dH0pKTplPT09InRleHQiP3JyLnNldFRhYkJhckJhZGdlKHtpbmRleDp0LHRleHQ6bn0pOmU9PT0icmVkRG90IiYmcnIuc2hvd1RhYkJhclJlZERvdCh7aW5kZXg6dH0pKX1mdW5jdGlvbiB2UyhlLHQsbixyLGEsdSl7bGV0IGg9e2luZGV4OmV9O2lmKHQhPT12b2lkIDAmJihoLnRleHQ9dCksbiYmKGguaWNvblBhdGg9cHQobikpLHImJihoLnNlbGVjdGVkSWNvblBhdGg9cHQocikpLHUhPT12b2lkIDAmJihoLmljb25mb250PXUpLGEhPT12b2lkIDApe2gudmlzaWJsZT1vYy5saXN0W2VdLnZpc2libGU9YSxkZWxldGUgaC5pbmRleDtsZXQgYj1vYy5saXN0Lm1hcChVPT4oe3Zpc2libGU6VS52aXNpYmxlfSkpO2JbZV09aCxyciYmcnIuc2V0VGFiQmFySXRlbXMoe2xpc3Q6Yn0pfWVsc2UgcnImJnJyLnNldFRhYkJhckl0ZW0oaCl9ZnVuY3Rpb24gbVMoZSl7cnImJnJyLnNldFRhYkJhclN0eWxlKGUpfWZ1bmN0aW9uIF9TKGUpeyR1PSExLHJyJiZyci5oaWRlVGFiQmFyKHthbmltYXRpb246ZX0pfWZ1bmN0aW9uIGJTKGUpeyR1PSEwLHJyJiZyci5zaG93VGFiQmFyKHthbmltYXRpb246ZX0pfWxldCB4Yz1bXTt2YXIgbGk9e2lkOiIwIixpbml0KGUsdCl7ZSYmZS5saXN0Lmxlbmd0aCYmKG9jPWUpO3RyeXtycj1nLnJlcXVpcmVNb2R1bGUoInVuaS10YWJ2aWV3Iil9Y2F0Y2gobil7Y29uc29sZS5sb2coYHVuaS5yZXF1aXJlTmF0aXZlUGx1Z2luKCJ1bmktdGFidmlldyIpIGVycm9yICR7bn1gKX1yci5vbk1hc2tDbGljaygoKT0+e3hjLmZvckVhY2gobj0+e24oKX0pfSkscnImJnJyLm9uQ2xpY2soKHtpbmRleDpufSk9Pnt0KG9jLmxpc3Rbbl0sbil9KSxyciYmcnIub25NaWRCdXR0b25DbGljaygoKT0+c3QuaW52b2tlT25DYWxsYmFjayhxZCkpfSxpbmRleE9mKGUpe2xldCB0PXRoaXMuY29uZmlnLG49dCYmdC5saXN0JiZ0Lmxpc3QubGVuZ3RoO2lmKG4pe2ZvcihsZXQgcj0wO3I8bjtyKyspaWYodC5saXN0W3JdLnBhZ2VQYXRoPT09ZXx8dC5saXN0W3JdLnBhZ2VQYXRoPT09YCR7ZX0uaHRtbGApcmV0dXJuIHJ9cmV0dXJuLTF9LHN3aXRjaFRhYihlKXtsZXQgdD10aGlzLmluZGV4T2YoZSk7cmV0dXJuIHQ+PTA/KHJyJiZyci5zd2l0Y2hTZWxlY3Qoe2luZGV4OnR9KSwhMCk6ITF9LHNldFRhYkJhckJhZGdlOnBTLHNldFRhYkJhckl0ZW06dlMsc2V0VGFiQmFyU3R5bGU6bVMsaGlkZVRhYkJhcjpfUyxzaG93VGFiQmFyOmJTLGFwcGVuZChlKXtyciYmcnIuYXBwZW5kKHtpZDplLmlkfSwoe2NvZGU6dH0pPT57dCE9PTAmJmsoKCk9Pnt0aGlzLmFwcGVuZChlKX0sMjApfSl9LGdldCBjb25maWcoKXtyZXR1cm4gb2N8fFQudGFiQmFyfSxnZXQgdmlzaWJsZSgpe3JldHVybiAkdX0sZ2V0IGhlaWdodCgpe2xldCBlPXRoaXMuY29uZmlnO3JldHVybihlJiZlLmhlaWdodD9wYXJzZUZsb2F0KGUuaGVpZ2h0KTp0ZS5UQUJCQVJfSEVJR0hUKStsLm5hdmlnYXRvci5nZXRTYWZlQXJlYUluc2V0cygpLmRldmljZUJvdHRvbX0sZ2V0IGNvdmVyKCl7bGV0IGU9dGhpcy5jb25maWc7cmV0dXJuIGUmJlsiZXh0cmFsaWdodCIsImxpZ2h0IiwiZGFyayJdLmluZGV4T2YoZS5ibHVyRWZmZWN0KT49MH0sc2V0U3R5bGUoe21hc2s6ZX0pe3JyLnNldE1hc2soe2NvbG9yOmV9KX0sYWRkRXZlbnRMaXN0ZW5lcihlLHQpe3hjLnB1c2godCl9LHJlbW92ZUV2ZW50TGlzdGVuZXIoZSx0KXtsZXQgbj14Yy5pbmRleE9mKHQpO3hjLnNwbGljZShuLDEpfX07ZnVuY3Rpb24gQmMoKXtsZXQgZT1fcigpO3JldHVybiBlP2UuJGdldEFwcFdlYnZpZXcoKTpudWxsfWZ1bmN0aW9uIE9oKGUpe3JldHVybiBlP2UuJGdldEFwcFdlYnZpZXcoKTpCYygpfWxldCBUaD1udWxsO2Z1bmN0aW9uIFBoKCl7cmV0dXJuIFRofWZ1bmN0aW9uIFV1KGUpe1RoPWV9ZnVuY3Rpb24gSHUoKXtyZXR1cm4gbC5uYXZpZ2F0b3IuaXNJbW1lcnNlZFN0YXR1c2JhcigpP01hdGgucm91bmQobC5vcy5uYW1lPT09ImlPUyI/bC5uYXZpZ2F0b3IuZ2V0U2FmZUFyZWFJbnNldHMoKS50b3A6bC5uYXZpZ2F0b3IuZ2V0U3RhdHVzYmFySGVpZ2h0KCkpOjB9ZnVuY3Rpb24gSWgoKXtsZXQgZT1sLm5hdmlnYXRvci5nZXRTdGF0dXNCYXJTdHlsZSgpO3JldHVybiBlPT09IlVJU3RhdHVzQmFyU3R5bGVCbGFja1RyYW5zbHVjZW50Inx8ZT09PSJVSVN0YXR1c0JhclN0eWxlQmxhY2tPcGFxdWUifHxlPT09Im51bGwiP2U9ImxpZ2h0IjplPT09IlVJU3RhdHVzQmFyU3R5bGVEZWZhdWx0IiYmKGU9ImRhcmsiKSxlfWZ1bmN0aW9uIEVTKCl7bGV0e3Jlc29sdXRpb25XaWR0aDplLHJlc29sdXRpb25IZWlnaHQ6dH09bC5zY3JlZW4uZ2V0Q3VycmVudFNpemUoKXx8e3Jlc29sdXRpb25XaWR0aDowLHJlc29sdXRpb25IZWlnaHQ6MH07cmV0dXJue3NjcmVlbldpZHRoOk1hdGgucm91bmQoZSksc2NyZWVuSGVpZ2h0Ok1hdGgucm91bmQodCl9fWxldCBOaD1NdCgiZ2V0V2luZG93SW5mbyIsKCk9PntsZXQgZT1sLm9zLm5hbWUudG9Mb3dlckNhc2UoKT09PSJpb3MiLHtzY3JlZW5XaWR0aDp0LHNjcmVlbkhlaWdodDpufT1FUygpLHI9SHUoKSxhLHU9e2hlaWdodDowLGNvdmVyOiExfSxoPUJjKCk7aWYoaCl7bGV0IEV0PWguZ2V0U3R5bGUoKSxrdD1FdCYmRXQudGl0bGVOVmlldztrdCYma3QudHlwZSYma3QudHlwZSE9PSJub25lIiYmKHUuaGVpZ2h0PWt0LnR5cGU9PT0idHJhbnNwYXJlbnQiPzA6cit0ZS5OQVZCQVJfSEVJR0hULHUuY292ZXI9a3QudHlwZT09PSJ0cmFuc3BhcmVudCJ8fGt0LnR5cGU9PT0iZmxvYXQiKSxhPWguZ2V0U2FmZUFyZWFJbnNldHMoKX1lbHNlIGE9bC5uYXZpZ2F0b3IuZ2V0U2FmZUFyZWFJbnNldHMoKTtsZXQgYj17aGVpZ2h0OjAsY292ZXI6ITF9O2ljKCkmJihiLmhlaWdodD1saS52aXNpYmxlP2xpLmhlaWdodDowLGIuY292ZXI9bGkuY292ZXIpO2xldCBVPXUuY292ZXI/dS5oZWlnaHQ6MCxPPWIuY292ZXI/Yi5oZWlnaHQ6MCxEPW4tdS5oZWlnaHQtYi5oZWlnaHQsZ2U9bi0odS5jb3Zlcj8wOnUuaGVpZ2h0KS0oYi5jb3Zlcj8wOmIuaGVpZ2h0KSx3ZT10OyghYi5oZWlnaHR8fGIuY292ZXIpJiYhYS5ib3R0b20mJmEuZGV2aWNlQm90dG9tJiYoRC09YS5kZXZpY2VCb3R0b20sZ2UtPWEuZGV2aWNlQm90dG9tKSxhPWU/YTp7bGVmdDowLHJpZ2h0OjAsdG9wOnUuaGVpZ2h0JiYhdS5jb3Zlcj8wOnIsYm90dG9tOjB9O2xldCBrZT17bGVmdDphLmxlZnQscmlnaHQ6d2UtYS5yaWdodCx0b3A6YS50b3AsYm90dG9tOmdlLWEuYm90dG9tLHdpZHRoOndlLWEubGVmdC1hLnJpZ2h0LGhlaWdodDpnZS1hLnRvcC1hLmJvdHRvbX07cmV0dXJue3BpeGVsUmF0aW86bC5zY3JlZW4uc2NhbGUsc2NyZWVuV2lkdGg6dCxzY3JlZW5IZWlnaHQ6bix3aW5kb3dXaWR0aDp3ZSx3aW5kb3dIZWlnaHQ6RCxzdGF0dXNCYXJIZWlnaHQ6cixzYWZlQXJlYTprZSxzYWZlQXJlYUluc2V0czp7dG9wOmEudG9wLHJpZ2h0OmEucmlnaHQsYm90dG9tOmEuYm90dG9tLGxlZnQ6YS5sZWZ0fSx3aW5kb3dUb3A6VSx3aW5kb3dCb3R0b206TyxzY3JlZW5Ub3A6bi1EfX0pLE5hLE1jPSEwO2Z1bmN0aW9uIGp1KCl7aWYoIU1jKXJldHVybjtsZXR7Z2V0U3lzdGVtSW5mb1N5bmM6ZX09Zy5yZXF1aXJlTW9kdWxlKCJwbHVzIik7aWYoTmE9ZSgpLFkuaXNTdHJpbmcoTmEpKXRyeXtOYT1KU09OLnBhcnNlKE5hKX1jYXRjaCh0KXt9fWxldCBraD1NdCgiZ2V0RGV2aWNlSW5mbyIsKCk9PntqdSgpO2xldHtkZXZpY2VCcmFuZDplPSIiLGRldmljZU1vZGVsOnQsb3NOYW1lOm4sb3NWZXJzaW9uOnIsZGV2aWNlT3JpZW50YXRpb246YSxkZXZpY2VUeXBlOnV9PU5hLGg9ZS50b0xvd2VyQ2FzZSgpLGI9bi50b0xvd2VyQ2FzZSgpO3JldHVybnticmFuZDpoLGRldmljZUJyYW5kOmgsZGV2aWNlTW9kZWw6dCxkZXZpY2VQaXhlbFJhdGlvOmwuc2NyZWVuLnNjYWxlLGRldmljZUlkOmdTKCksZGV2aWNlT3JpZW50YXRpb246YSxkZXZpY2VUeXBlOnUsbW9kZWw6dCxwbGF0Zm9ybTpiLHN5c3RlbTpgJHtiPT09ImlvcyI/ImlPUyI6IkFuZHJvaWQifSAke3J9YH19KSxSaD1NdCgiZ2V0QXBwQmFzZUluZm8iLCgpPT57anUoKTtsZXR7aG9zdFBhY2thZ2VOYW1lOmUsaG9zdE5hbWU6dCxob3N0VmVyc2lvbjpuLGhvc3RMYW5ndWFnZTpyLG9zTGFuZ3VhZ2U6YSxob3N0VGhlbWU6dSxhcHBJZDpoLGFwcE5hbWU6YixhcHBWZXJzaW9uOlUsYXBwVmVyc2lvbkNvZGU6TyxhcHBXZ3RWZXJzaW9uOkR9PU5hO3JldHVybnthcHBJZDpoLGFwcE5hbWU6YixhcHBWZXJzaW9uOlUsYXBwVmVyc2lvbkNvZGU6TyxhcHBXZ3RWZXJzaW9uOkQsYXBwTGFuZ3VhZ2U6UWw/UWwoKTphLGVuYWJsZURlYnVnOiExLGhvc3RQYWNrYWdlTmFtZTplLGhvc3ROYW1lOnQsaG9zdFZlcnNpb246bixob3N0TGFuZ3VhZ2U6cixob3N0VGhlbWU6dSxob3N0Rm9udFNpemVTZXR0aW5nOnZvaWQgMCxob3N0U0RLVmVyc2lvbjp2b2lkIDAsbGFuZ3VhZ2U6YSxTREtWZXJzaW9uOiIiLHRoZW1lOnZvaWQgMCx2ZXJzaW9uOmwucnVudGltZS5pbm5lclZlcnNpb259fSkseGg9TXQoImdldFN5c3RlbUluZm9TeW5jIiwoKT0+e01jPSEwLGp1KCksTWM9ITE7bGV0IGU9TmgoKSx0PWtoKCksbj1SaCgpO01jPSEwO2xldCByPXtmb250U2l6ZVNldHRpbmc6bi5ob3N0Rm9udFNpemVTZXR0aW5nLG9zTmFtZTpOYS5vc05hbWUudG9Mb3dlckNhc2UoKX07TmEuaG9zdE5hbWUmJihyLmhvc3RTREtWZXJzaW9uPU5hLnVuaVJ1bnRpbWVWZXJzaW9uKTtsZXQgYT1ZLmV4dGVuZChOYSxlLHQsbixyKTtyZXR1cm4gZGVsZXRlIGEuc2NyZWVuVG9wLGRlbGV0ZSBhLmVuYWJsZURlYnVnLGRlbGV0ZSBhLnRoZW1lLHRlLnNvcnRPYmplY3QoYSl9KSx5Uz15ZSgiZ2V0U3lzdGVtSW5mbyIsKGUse3Jlc29sdmU6dH0pPT50KHhoKCkpKSxQbD1udWxsLHdTPXFuKHJoLCgpPT57QmgoKX0pLFNTPUNyKHdiLCgpPT57TWgoKX0pLEJoPXllKFNiLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e1BsfHwoUGw9bC5vcmllbnRhdGlvbi53YXRjaE9yaWVudGF0aW9uKHI9PntzdC5pbnZva2VPbkNhbGxiYWNrKHJoLHtkaXJlY3Rpb246ci5tYWduZXRpY0hlYWRpbmd9KX0scj0+e24oci5tZXNzYWdlKSxQbD1udWxsfSx7ZnJlcXVlbmN5OlFufSkpLGsodCxRbil9KSxNaD15ZShBYiwoZSx7cmVzb2x2ZTp0fSk9PntQbCYmKGwub3JpZW50YXRpb24uY2xlYXJXYXRjaChQbCksUGw9bnVsbCksdCgpfSksQVM9eWUoQ2IsKGUse3Jlc29sdmU6dH0pPT57bC5kZXZpY2UudmlicmF0ZSgxNSksdCgpfSksQ1M9eWUoT2IsKGUse3Jlc29sdmU6dH0pPT57bC5kZXZpY2UudmlicmF0ZSg0MDApLHQoKX0pLElsPW51bGwsT1M9cW4obmgsKCk9PntMaCgpfSksVFM9Q3IoYmIsKCk9PntEaCgpfSksTGg9eWUoRWIsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57SWx8fChJbD1sLmFjY2VsZXJvbWV0ZXIud2F0Y2hBY2NlbGVyYXRpb24ocj0+e3N0Lmludm9rZU9uQ2FsbGJhY2sobmgse3g6ciYmci54QXhpc3x8MCx5OnImJnIueUF4aXN8fDAsejpyJiZyLnpBeGlzfHwwfSl9LHI9PntJbD1udWxsLG4oYHN0YXJ0QWNjZWxlcm9tZXRlcjpmYWlsICR7ci5tZXNzYWdlfWApfSx7ZnJlcXVlbmN5OlFufSkpLGsodCxRbil9KSxEaD15ZSh5YiwoZSx7cmVzb2x2ZTp0fSk9PntJbCYmKGwuYWNjZWxlcm9tZXRlci5jbGVhcldhdGNoKElsKSxJbD1udWxsKSx0KCl9KSxQUz1xbihpaCxUbCgoKT0+bC5ibHVldG9vdGgub25CbHVldG9vdGhEZXZpY2VGb3VuZC5iaW5kKGwuYmx1ZXRvb3RoKSxpaCkpLElTPXFuKG9oLFRsKCgpPT5sLmJsdWV0b290aC5vbkJsdWV0b290aEFkYXB0ZXJTdGF0ZUNoYW5nZS5iaW5kKGwuYmx1ZXRvb3RoKSxvaCkpLE5TPXFuKGFoLFRsKCgpPT5sLmJsdWV0b290aC5vbkJMRUNvbm5lY3Rpb25TdGF0ZUNoYW5nZS5iaW5kKGwuYmx1ZXRvb3RoKSxhaCkpLGtTPXFuKHNoLFRsKCgpPT5sLmJsdWV0b290aC5vbkJMRUNoYXJhY3RlcmlzdGljVmFsdWVDaGFuZ2UuYmluZChsLmJsdWV0b290aCksc2gpKSxSUz15ZSgib3BlbkJsdWV0b290aEFkYXB0ZXIiLHNpKCgpPT5sLmJsdWV0b290aC5vcGVuQmx1ZXRvb3RoQWRhcHRlci5iaW5kKGwuYmx1ZXRvb3RoKSkpLHhTPXllKCJjbG9zZUJsdWV0b290aEFkYXB0ZXIiLHNpKCgpPT5sLmJsdWV0b290aC5jbG9zZUJsdWV0b290aEFkYXB0ZXIuYmluZChsLmJsdWV0b290aCkpKSxCUz15ZSgiZ2V0Qmx1ZXRvb3RoQWRhcHRlclN0YXRlIixzaSgoKT0+bC5ibHVldG9vdGguZ2V0Qmx1ZXRvb3RoQWRhcHRlclN0YXRlLmJpbmQobC5ibHVldG9vdGgpKSksTVM9eWUoVGIsc2koKCk9PmwuYmx1ZXRvb3RoLnN0YXJ0Qmx1ZXRvb3RoRGV2aWNlc0Rpc2NvdmVyeS5iaW5kKGwuYmx1ZXRvb3RoKSksUGIpLExTPXllKCJzdG9wQmx1ZXRvb3RoRGV2aWNlc0Rpc2NvdmVyeSIsc2koKCk9PmwuYmx1ZXRvb3RoLnN0b3BCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5LmJpbmQobC5ibHVldG9vdGgpKSksRFM9eWUoImdldEJsdWV0b290aERldmljZXMiLHNpKCgpPT5sLmJsdWV0b290aC5nZXRCbHVldG9vdGhEZXZpY2VzLmJpbmQobC5ibHVldG9vdGgpKSksRlM9eWUoSWIsc2koKCk9PmwuYmx1ZXRvb3RoLmdldENvbm5lY3RlZEJsdWV0b290aERldmljZXMuYmluZChsLmJsdWV0b290aCkpLE5iKSxWUz15ZShrYixzaSgoKT0+bC5ibHVldG9vdGguY3JlYXRlQkxFQ29ubmVjdGlvbi5iaW5kKGwuYmx1ZXRvb3RoKSksUmIpLCRTPXllKHhiLHNpKCgpPT5sLmJsdWV0b290aC5jbG9zZUJMRUNvbm5lY3Rpb24uYmluZChsLmJsdWV0b290aCkpLEJiKSxVUz15ZShNYixzaSgoKT0+bC5ibHVldG9vdGguZ2V0QkxFRGV2aWNlU2VydmljZXMuYmluZChsLmJsdWV0b290aCkpLExiKSxIUz15ZShEYixzaSgoKT0+bC5ibHVldG9vdGguZ2V0QkxFRGV2aWNlQ2hhcmFjdGVyaXN0aWNzLmJpbmQobC5ibHVldG9vdGgpKSxGYiksalM9eWUoVmIsc2koKCk9PmwuYmx1ZXRvb3RoLm5vdGlmeUJMRUNoYXJhY3RlcmlzdGljVmFsdWVDaGFuZ2UuYmluZChsLmJsdWV0b290aCkpLCRiKSx6Uz15ZShVYixzaSgoKT0+bC5ibHVldG9vdGgucmVhZEJMRUNoYXJhY3RlcmlzdGljVmFsdWUuYmluZChsLmJsdWV0b290aCkpLEhiKSxXUz15ZShqYixzaSgoKT0+bC5ibHVldG9vdGgud3JpdGVCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlLmJpbmQobC5ibHVldG9vdGgpKSx6YiksR1M9eWUoV2Isc2koKCk9PmwuYmx1ZXRvb3RoLnNldEJMRU1UVS5iaW5kKGwuYmx1ZXRvb3RoKSksR2IpLFlTPXllKFliLHNpKCgpPT5sLmJsdWV0b290aC5nZXRCTEVEZXZpY2VSU1NJLmJpbmQobC5ibHVldG9vdGgpKSxxYikscVM9cW4obGgsVGwoKCk9PmwuaWJlYWNvbi5vbkJlYWNvblVwZGF0ZS5iaW5kKGwuaWJlYWNvbiksbGgpKSxLUz1xbihjaCxUbCgoKT0+bC5pYmVhY29uLm9uQmVhY29uU2VydmljZUNoYW5nZS5iaW5kKGwuaWJlYWNvbiksY2gpKSxKUz15ZShLYixzaSgoKT0+bC5pYmVhY29uLmdldEJlYWNvbnMuYmluZChsLmliZWFjb24pKSksWlM9eWUoSmIsc2koKCk9PmwuaWJlYWNvbi5zdGFydEJlYWNvbkRpc2NvdmVyeS5iaW5kKGwuaWJlYWNvbikpLFpiKSxYUz15ZShYYixzaSgoKT0+bC5pYmVhY29uLnN0b3BCZWFjb25EaXNjb3ZlcnkuYmluZChsLmliZWFjb24pKSksUVM9eWUodWIsKHtwaG9uZU51bWJlcjplfSx7cmVzb2x2ZTp0fSk9PihsLmRldmljZS5kaWFsKGUpLHQoKSksZmIpLGVBPXtuYW1lOntnaXZlbk5hbWU6ImZpcnN0TmFtZSIsbWlkZGxlTmFtZToibWlkZGxlTmFtZSIsZmFtaWx5TmFtZToibGFzdE5hbWUifSxuaWNrbmFtZToibmlja05hbWUiLHBob3Rvczp7dHlwZToidXJsIix2YWx1ZToicGhvdG9GaWxlUGF0aCJ9LG5vdGU6InJlbWFyayIscGhvbmVOdW1iZXJzOlt7dHlwZToibW9iaWxlIix2YWx1ZToibW9iaWxlUGhvbmVOdW1iZXIifSx7dHlwZToid29yayIsdmFsdWU6IndvcmtQaG9uZU51bWJlciJ9LHt0eXBlOiJjb21wYW55Iix2YWx1ZToiaG9zdE51bWJlciJ9LHt0eXBlOiJob21lIGZheCIsdmFsdWU6ImhvbWVGYXhOdW1iZXIifSx7dHlwZToid29yayBmYXgiLHZhbHVlOiJ3b3JrRmF4TnVtYmVyIn1dLGVtYWlsczpbe3R5cGU6ImhvbWUiLHZhbHVlOiJlbWFpbCJ9XSx1cmxzOlt7dHlwZToib3RoZXIiLHZhbHVlOiJ1cmwifV0sb3JnYW5pemF0aW9uczpbe3R5cGU6ImNvbXBhbnkiLG5hbWU6Im9yZ2FuaXphdGlvbiIsdGl0bGU6InRpdGxlIn1dLGltczpbe3R5cGU6Im90aGVyIix2YWx1ZToid2VDaGF0TnVtYmVyIn1dLGFkZHJlc3Nlczpbe3R5cGU6Im90aGVyIixwcmVmZXJyZWQ6ITAsY291bnRyeToiYWRkcmVzc0NvdW50cnkiLHJlZ2lvbjoiYWRkcmVzc1N0YXRlIixsb2NhbGl0eToiYWRkcmVzc0NpdHkiLHN0cmVldEFkZHJlc3M6ImFkZHJlc3NTdHJlZXQiLHBvc3RhbENvZGU6ImFkZHJlc3NQb3N0YWxDb2RlIn0se3R5cGU6ImhvbWUiLGNvdW50cnk6ImhvbWVBZGRyZXNzQ291bnRyeSIscmVnaW9uOiJob21lQWRkcmVzc1N0YXRlIixsb2NhbGl0eToiaG9tZUFkZHJlc3NDaXR5IixzdHJlZXRBZGRyZXNzOiJob21lQWRkcmVzc1N0cmVldCIscG9zdGFsQ29kZToiaG9tZUFkZHJlc3NQb3N0YWxDb2RlIn0se3R5cGU6ImNvbXBhbnkiLGNvdW50cnk6IndvcmtBZGRyZXNzQ291bnRyeSIscmVnaW9uOiJ3b3JrQWRkcmVzc1N0YXRlIixsb2NhbGl0eToid29ya0FkZHJlc3NDaXR5IixzdHJlZXRBZGRyZXNzOiJ3b3JrQWRkcmVzc1N0cmVldCIscG9zdGFsQ29kZToid29ya0FkZHJlc3NQb3N0YWxDb2RlIn1dfSx0QT1bInR5cGUiLCJwcmVmZXJyZWQiXTtmdW5jdGlvbiB6dShlLHQsbil7bGV0IHI9MDtyZXR1cm4gT2JqZWN0LmtleXMobikuZm9yRWFjaChhPT57bGV0IHU9blthXTt0eXBlb2YgdSE9PSJvYmplY3QiP3RBLmluZGV4T2YoYSkhPT0tMT9lW2FdPW5bYV06dHlwZW9mIHRbdV0hPSJ1bmRlZmluZWQiPyhyKyssZVthXT10W3VdKTpkZWxldGUgZVthXTp1IGluc3RhbmNlb2YgQXJyYXk/KGVbYV09W10sdS5mb3JFYWNoKGI9PntsZXQgVT17fTt6dShVLHQsYikmJmVbYV0ucHVzaChVKX0pLGVbYV0ubGVuZ3RoP3IrKzpkZWxldGUgZVthXSk6KGVbYV09e30senUoZVthXSx0LHUpP3IrKzpkZWxldGUgZVthXSl9KSxyfWxldCBuQT15ZShkYiwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PnshZS5waG90b0ZpbGVQYXRoJiYoZS5waG90b0ZpbGVQYXRoPSIiKSxsLmNvbnRhY3RzLmdldEFkZHJlc3NCb29rKGwuY29udGFjdHMuQUREUkVTU0JPT0tfUEhPTkUscj0+e2xldCBhPXIuY3JlYXRlKCk7enUoYSxlLGVBKSxhLnNhdmUoKCk9PnQoKSx1PT5uKCkpfSxyPT5uKCkpfSxnYixoYik7ZnVuY3Rpb24gSG8oZSl7cmV0dXJuIHR5cGVvZiBnIT0idW5kZWZpbmVkIj9nLnJlcXVpcmVNb2R1bGUoZSk6X19yZXF1aXJlTmF0aXZlUGx1Z2luX18oZSl9ZnVuY3Rpb24gRmgoZSx0LG4pe3JldHVybiBIbygicGx1cyIpLnNlbmROYXRpdmVFdmVudChlLHQsbil9bGV0IHJBPXllKHBiLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e0hvKCJjbGlwYm9hcmQiKS5nZXRTdHJpbmcoYT0+e2EucmVzdWx0PT09InN1Y2Nlc3MiP3Qoe2RhdGE6YS5kYXRhfSk6bigiZ2V0Q2xpcGJvYXJkRGF0YTpmYWlsIil9KX0pLGlBPXllKHZiLChlLHtyZXNvbHZlOnR9KT0+e0hvKCJjbGlwYm9hcmQiKS5zZXRTdHJpbmcoZS5kYXRhKSx0KCl9LF9iLG1iKSxWaD0ib25OZXR3b3JrU3RhdHVzQ2hhbmdlIjtmdW5jdGlvbiAkaCgpe1VoKCkudGhlbigoe25ldHdvcmtUeXBlOmV9KT0+e3N0Lmludm9rZU9uQ2FsbGJhY2soVmgse2lzQ29ubmVjdGVkOmUhPT0ibm9uZSIsbmV0d29ya1R5cGU6ZX0pfSl9bGV0IG9BPXFuKFZoLCgpPT57bC5nbG9iYWxFdmVudC5hZGRFdmVudExpc3RlbmVyKCJuZXRjaGFuZ2UiLCRoKX0pLGFBPUNyKCJvZmZOZXR3b3JrU3RhdHVzQ2hhbmdlIiwoKT0+e2wuZ2xvYmFsRXZlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibmV0Y2hhbmdlIiwkaCl9KSxVaD15ZSgiZ2V0TmV0d29ya1R5cGUiLChlLHtyZXNvbHZlOnR9KT0+e2xldCBuPUZyW2wubmV0d29ya2luZm8uZ2V0Q3VycmVudFR5cGUoKV18fCJ1bmtub3duIjtyZXR1cm4gdCh7bmV0d29ya1R5cGU6bn0pfSk7ZnVuY3Rpb24gSGgoKXtpZihsLm9zLm5hbWUudG9Mb3dlckNhc2UoKSE9PSJpb3MiKXJldHVybiExO2xldCB0PUhvKCJmYWNlSUQiKTtyZXR1cm4hISh0JiZ0LmlzU3VwcG9ydCgpKX1mdW5jdGlvbiBqaCgpe3JldHVybiEhKGwuZmluZ2VycHJpbnQmJmwuZmluZ2VycHJpbnQuaXNTdXBwb3J0KCkpfWxldCB6aD1lPT57bGV0IHQ9W107cmV0dXJuIGpoKCkmJnQucHVzaCgiZmluZ2VyUHJpbnQiKSxIaCgpJiZ0LnB1c2goImZhY2lhbCIpLGUmJmUoe3N1cHBvcnRNb2RlOnR9KSx7c3VwcG9ydE1vZGU6dCxlcnJNc2c6ImNoZWNrSXNTdXBwb3J0U290ZXJBdXRoZW50aWNhdGlvbjpvayJ9fSxzQT15ZShuMCwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9Pnt6aCh0KX0pLFdoPSh7Y2hlY2tBdXRoTW9kZTplLHJlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9KHUsaCk9Pm4mJm4odSxoKSxhPXU9PnQmJnQodSk7aWYoZT09PSJmaW5nZXJQcmludCIpe2lmKGpoKCkpe2xldCB1PWwuZmluZ2VycHJpbnQuaXNLZXlndWFyZFNlY3VyZSgpJiZsLmZpbmdlcnByaW50LmlzRW5yb2xsZWRGaW5nZXJwcmludHMoKTtyZXR1cm4gYSh7aXNFbnJvbGxlZDp1fSkse2lzRW5yb2xsZWQ6dSxlcnJNc2c6ImNoZWNrSXNTb3RlckVucm9sbGVkSW5EZXZpY2U6b2sifX1yZXR1cm4gcigibm90IHN1cHBvcnQiLHtpc0Vucm9sbGVkOiExfSkse2lzRW5yb2xsZWQ6ITEsZXJyTXNnOiJjaGVja0lzU290ZXJFbnJvbGxlZEluRGV2aWNlOmZhaWwgbm90IHN1cHBvcnQifX1lbHNlIGlmKGU9PT0iZmFjaWFsIil7aWYoSGgoKSl7bGV0IHU9SG8oImZhY2VJRCIpLGg9dSYmdS5pc0tleWd1YXJkU2VjdXJlKCkmJnUuaXNFbnJvbGxlZEZhY2VJRCgpO3JldHVybiBhKHtpc0Vucm9sbGVkOmh9KSx7aXNFbnJvbGxlZDpoLGVyck1zZzoiY2hlY2tJc1NvdGVyRW5yb2xsZWRJbkRldmljZTpvayJ9fXJldHVybiByKCJub3Qgc3VwcG9ydCIse2lzRW5yb2xsZWQ6ITF9KSx7aXNFbnJvbGxlZDohMSxlcnJNc2c6ImNoZWNrSXNTb3RlckVucm9sbGVkSW5EZXZpY2U6ZmFpbCBub3Qgc3VwcG9ydCJ9fXJldHVybiByKCJub3Qgc3VwcG9ydCIse2lzRW5yb2xsZWQ6ITF9KSx7aXNFbnJvbGxlZDohMSxlcnJNc2c6ImNoZWNrSXNTb3RlckVucm9sbGVkSW5EZXZpY2U6ZmFpbCBub3Qgc3VwcG9ydCJ9fSxsQT15ZShyMCwoe2NoZWNrQXV0aE1vZGU6ZX0se3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57V2goe2NoZWNrQXV0aE1vZGU6ZSxyZXNvbHZlOnQscmVqZWN0Om59KX0sYTAsbzApLGNBPXllKHMwLCh7cmVxdWVzdEF1dGhNb2RlczplLGNoYWxsZW5nZTp0PSExLGF1dGhDb250ZW50Om59LHtyZXNvbHZlOnIscmVqZWN0OmF9KT0+e1JvKCk7bGV0e3Q6dX09WCgpLGg9emgoKS5zdXBwb3J0TW9kZTtpZihoLmxlbmd0aD09PTApcmV0dXJue2F1dGhNb2RlOiJmaW5nZXJQcmludCIsZXJyQ29kZTo5MDAwMSxlcnJNc2c6InN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjpmYWlsIn07bGV0IGI9W107aWYoZS5tYXAoKEQsZ2UpPT57aC5pbmRleE9mKEQpPi0xJiZiLnB1c2goRCl9KSxiLmxlbmd0aD09PTApcmV0dXJue2F1dGhNb2RlOiJmaW5nZXJQcmludCIsZXJyQ29kZTo5MDAwMyxlcnJNc2c6InN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjpmYWlsIG5vIGNvcnJlc3BvbmRpbmcgbW9kZSJ9O2xldCBVPVtdO2lmKGIubWFwKChELGdlKT0+e1doKHtjaGVja0F1dGhNb2RlOkR9KS5pc0Vucm9sbGVkJiZVLnB1c2goRCl9KSxVLmxlbmd0aD09PTApcmV0dXJue2F1dGhNb2RlOmJbMF0sZXJyQ29kZTo5MDAxMSxlcnJNc2c6YHN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjpmYWlsIG5vICR7YlswXX0gZW5yb2xsZWRgfTtsZXQgTz1VWzBdO089PT0iZmluZ2VyUHJpbnQiPyhsLm9zLm5hbWUudG9Mb3dlckNhc2UoKT09PSJhbmRyb2lkIiYmKGwubmF0aXZlVUkuc2hvd1dhaXRpbmcobnx8dSgidW5pLnN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbi5hdXRoQ29udGVudCIpKS5vbmNsb3NlPWZ1bmN0aW9uKCl7bC5maW5nZXJwcmludC5jYW5jZWwoKX0pLGwuZmluZ2VycHJpbnQuYXV0aGVudGljYXRlKCgpPT57bC5uYXRpdmVVSS5jbG9zZVdhaXRpbmcoKSxyKHthdXRoTW9kZTpPLGVyckNvZGU6MH0pfSxEPT57bGV0IGdlPXthdXRoTW9kZTpPfTtzd2l0Y2goRC5jb2RlKXtjYXNlIEQuQVVUSEVOVElDQVRFX01JU01BVENIOmJyZWFrO2Nhc2UgRC5BVVRIRU5USUNBVEVfT1ZFUkxJTUlUOmwubmF0aXZlVUkuY2xvc2VXYWl0aW5nKCksYSgiYXV0aGVudGljYXRlIGZyZWV6ZS4gcGxlYXNlIHRyeSBhZ2FpbiBsYXRlciIsWS5leHRlbmQoZ2Use2VyckNvZGU6OTAwMTB9KSk7YnJlYWs7Y2FzZSBELkNBTkNFTDpsLm5hdGl2ZVVJLmNsb3NlV2FpdGluZygpLGEoImNhbmNlbCIsWS5leHRlbmQoZ2Use2VyckNvZGU6OTAwMDh9KSk7YnJlYWs7ZGVmYXVsdDpsLm5hdGl2ZVVJLmNsb3NlV2FpdGluZygpLGEoIiIsWS5leHRlbmQoZ2Use2VyckNvZGU6OTAwMDd9KSk7YnJlYWt9fSx7bWVzc2FnZTpufSkpOk89PT0iZmFjaWFsIiYmSG8oImZhY2VJRCIpLmF1dGhlbnRpY2F0ZSh7bWVzc2FnZTpufSxnZT0+e2xldCB3ZT17YXV0aE1vZGU6T307aWYoZ2UudHlwZT09PSJzdWNjZXNzIiYmZ2UuY29kZT09PTApcih7YXV0aE1vZGU6TyxlcnJDb2RlOjB9KTtlbHNlIHN3aXRjaChnZS5jb2RlKXtjYXNlIDQ6YSgiIixZLmV4dGVuZCh3ZSx7ZXJyQ29kZTo5MDAwOX0pKTticmVhaztjYXNlIDU6YSgiYXV0aGVudGljYXRlIGZyZWV6ZS4gcGxlYXNlIHRyeSBhZ2FpbiBsYXRlciIsWS5leHRlbmQod2Use2VyckNvZGU6OTAwMTB9KSk7YnJlYWs7Y2FzZSA2OmEoIiIsWS5leHRlbmQod2Use2VyckNvZGU6OTAwMDh9KSk7YnJlYWs7ZGVmYXVsdDphKCIiLFkuZXh0ZW5kKHdlLHtlcnJDb2RlOjkwMDA3fSkpO2JyZWFrfX0pfSxjMCxsMCksdUE9eWUodTAsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57dGEoKTtsZXR7dDpyfT1YKCksdT1JaCgpIT09ImxpZ2h0IixoLGI9ITEsVT1yaSh7dXJsOiJfX3VuaWFwcHNjYW4iLGRhdGE6T2JqZWN0LmFzc2lnbih7fSxlLHttZXNzYWdlczp7ZmFpbDpyKCJ1bmkuc2NhbkNvZGUuZmFpbCIpLCJmbGFzaC5vbiI6cigidW5pLnNjYW5Db2RlLmZsYXNoLm9uIiksImZsYXNoLm9mZiI6cigidW5pLnNjYW5Db2RlLmZsYXNoLm9mZiIpfX0pLHN0eWxlOnthbmltYXRpb25UeXBlOmUuYW5pbWF0aW9uVHlwZXx8InBvcC1pbiIsdGl0bGVOVmlldzp7YXV0b0JhY2tCdXR0b246ITAsdHlwZToiZmxvYXQiLHRpdGxlVGV4dDplLnRpdGxlVGV4dHx8cigidW5pLnNjYW5Db2RlLnRpdGxlIiksdGl0bGVDb2xvcjoiI2ZmZmZmZiIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIixidXR0b25zOmUub25seUZyb21DYW1lcmE/W106W3t0ZXh0OmUuYWxidW1UZXh0fHxyKCJ1bmkuc2NhbkNvZGUuYWxidW0iKSxmb250U2l6ZToiMTdweCIsd2lkdGg6IjYwcHgiLG9uY2xpY2s6KCk9PntVLnNlbmRNZXNzYWdlKHt0eXBlOiJnYWxsZXJ5In0pfX1dfSxwb3BHZXN0dXJlOiJjbG9zZSIsYmFja2dyb3VuZDoiIzAwMDAwMCIsYmFja0J1dHRvbkF1dG9Db250cm9sOiJjbG9zZSJ9LG9uTWVzc2FnZSh7ZXZlbnQ6TyxkZXRhaWw6RH0pe2g9RCxiPU89PT0ibWFya2VkIn0sb25DbG9zZSgpe3UmJmwubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJkYXJrIiksaD9iPyhkZWxldGUgaC5tZXNzYWdlLHQoaCkpOm4oaC5tZXNzYWdlKTpuKCJjYW5jZWwiKX19KTt1JiYobC5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImxpZ2h0IiksVS53ZWJ2aWV3LmFkZEV2ZW50TGlzdGVuZXIoInBvcEdlc3R1cmUiLCh7dHlwZTpPLHJlc3VsdDpEfSk9PntPPT09InN0YXJ0Ij9sLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgiZGFyayIpOk89PT0iZW5kIiYmIUQmJmwubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJsaWdodCIpfSkpfSxmMCxoMCksZkE9cW4odGUuT05fVEhFTUVfQ0hBTkdFLCgpPT57c3Qub24odGUuT05fVEhFTUVfQ0hBTkdFLGU9PntzdC5pbnZva2VPbkNhbGxiYWNrKHRlLk9OX1RIRU1FX0NIQU5HRSxlKX0pfSksZEE9eWUoUWIsKGUse3Jlc29sdmU6dH0pPT57bGV0IG49bC5zY3JlZW4uZ2V0QnJpZ2h0bmVzcyghMSk7dCh7dmFsdWU6bn0pfSksaEE9eWUoZTAsKGUse3Jlc29sdmU6dH0pPT57bC5zY3JlZW4uc2V0QnJpZ2h0bmVzcyhlLnZhbHVlLCExKSx0KCl9KSxnQT15ZSh0MCwoZSx7cmVzb2x2ZTp0fSk9PntsLmRldmljZS5zZXRXYWtlbG9jayghIWUua2VlcFNjcmVlbk9uKSx0KCl9KSxwQT1NdChnMCwoKT0+e2xldHtnZXRTeXN0ZW1TZXR0aW5nOmV9PWcucmVxdWlyZU1vZHVsZSgicGx1cyIpLHQ9ZSgpO3RyeXt0eXBlb2YgdD09InN0cmluZyImJih0PUpTT04ucGFyc2UodCkpfWNhdGNoKG4pe31yZXR1cm4gdH0pLEdoPU10KHAwLCgpPT57bGV0e2dldEFwcEF1dGhvcml6ZVNldHRpbmc6ZX09Zy5yZXF1aXJlTW9kdWxlKCJwbHVzIiksdD1lKCk7dHJ5e3R5cGVvZiB0PT0ic3RyaW5nIiYmKHQ9SlNPTi5wYXJzZSh0KSl9Y2F0Y2gobil7fWZvcihsZXQgbiBpbiB0KVkuaGFzT3duKHQsbikmJnRbbl09PT0idW5kZWZpbmVkIiYmKHRbbl09dm9pZCAwKTtyZXR1cm4gdH0pLHZBPXllKHYwLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldHtvcGVuQXBwQXV0aG9yaXplU2V0dGluZzpyfT1nLnJlcXVpcmVNb2R1bGUoInBsdXMiKTtyKHU9Pnt1LnR5cGU9PT0ic3VjY2VzcyI/dCgpOm4oKX0pfSksbUE9eWUockUsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9YWkrIi9kb3dubG9hZC8iO2wuaW8uZ2V0SW1hZ2VJbmZvKFkuZXh0ZW5kKGUse3NhdmVQYXRoOnIsZmlsZW5hbWU6cixzdWNjZXNzOllzKHQpLGZhaWw6YXIobil9KSl9LG9FLGlFKSxfQT15ZSh1RSwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsLmlvLmdldFZpZGVvSW5mbyh7ZmlsZVBhdGg6ZS5zcmMsc3VjY2VzczpyPT57dCh7b3JpZW50YXRpb246ci5vcmllbnRhdGlvbix0eXBlOnIudHlwZSxkdXJhdGlvbjpyLmR1cmF0aW9uLHNpemU6ci5zaXplLGhlaWdodDpyLmhlaWdodCx3aWR0aDpyLndpZHRoLGZwczpyLmZwc3x8MzAsYml0cmF0ZTpyLmJpdHJhdGV9KX0sZmFpbDphcihuKX0pfSxkRSxmRSksYkE9eWUoYUUsKHtjdXJyZW50OmU9MCxpbmRpY2F0b3I6dD0ibnVtYmVyIixsb29wOm49ITEsdXJsczpyLGxvbmdQcmVzc0FjdGlvbnM6YX0se3Jlc29sdmU6dSxyZWplY3Q6aH0pPT57ZWEoKTtsZXR7dDpifT1YKCk7cj1yLm1hcChPPT5wdChPKSk7bGV0IFU9TnVtYmVyKGUpO2lzTmFOKFUpPyhlPXIuaW5kZXhPZihwdChlKSksZT1lPDA/MDplKTplPVUsbC5uYXRpdmVVSS5wcmV2aWV3SW1hZ2Uocix7Y3VycmVudDplLGluZGljYXRvcjp0LGxvb3A6bixvbkxvbmdQcmVzczpmdW5jdGlvbihPKXtsZXQgRD1bXSxnZT0iIix3ZT1hJiZZLmlzUGxhaW5PYmplY3QoYSk7d2U/KEQ9YS5pdGVtTGlzdD9hLml0ZW1MaXN0OltdLGdlPWEuaXRlbUNvbG9yP2EuaXRlbUNvbG9yOiIjMDAwMDAwIik6KEQ9W2IoInVuaS5wcmV2aWV3SW1hZ2UuYnV0dG9uLnNhdmUiKV0sZ2U9IiMwMDAwMDAiKTtsZXQga2U9e2J1dHRvbnM6RC5tYXAoRXQ9Pih7dGl0bGU6RXQsY29sb3I6Z2V9KSksY2FuY2VsOmIoInVuaS5wcmV2aWV3SW1hZ2UuY2FuY2VsIil9O2wubmF0aXZlVUkuYWN0aW9uU2hlZXQoa2UsRXQ9PntpZihFdC5pbmRleD4wKXtpZih3ZSl7WS5pc0Z1bmN0aW9uKGEuc3VjY2VzcykmJmEuc3VjY2Vzcyh7dGFwSW5kZXg6RXQuaW5kZXgtMSxpbmRleDpPLmluZGV4fSk7cmV0dXJufWwuZ2FsbGVyeS5zYXZlKE8udXJsLCgpPT57bC5uYXRpdmVVSS50b2FzdChiKCJ1bmkucHJldmlld0ltYWdlLnNhdmUuc3VjY2VzcyIpKX0sZnVuY3Rpb24oKXtsLm5hdGl2ZVVJLnRvYXN0KGIoInVuaS5wcmV2aWV3SW1hZ2Uuc2F2ZS5mYWlsIikpfSl9ZWxzZSB3ZSYmWS5pc0Z1bmN0aW9uKGEuZmFpbCkmJmEuZmFpbCh7ZXJyTXNnOiJzaG93QWN0aW9uU2hlZXQ6ZmFpbCBjYW5jZWwifSl9KX19KSx1KCl9LGxFLHNFKSxFQT15ZShjRSwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9Pnt0cnl7bC5uYXRpdmVVSS5jbG9zZVByZXZpZXdJbWFnZSgpLHQoKX1jYXRjaChyKXtuKCl9fSksV3UsTmw9ITEsR3Usa2w9KGUsdD17fSk9Pnt5QShZLmV4dGVuZCh7c3RhdGU6ZX0sdCkpfSxhYz17c3RhcnQoe2R1cmF0aW9uOmU9NmU0LHNhbXBsZVJhdGU6dCxudW1iZXJPZkNoYW5uZWxzOm4sZW5jb2RlQml0UmF0ZTpyLGZvcm1hdDphPSJtcDMiLGZyYW1lU2l6ZTp1fT17fSl7aWYoTmwpcmV0dXJuIGtsKCJzdGFydCIpO1d1PWwuYXVkaW8uZ2V0UmVjb3JkZXIoKSxXdS5yZWNvcmQoe2Zvcm1hdDphLHNhbXBsZXJhdGU6dD9TdHJpbmcodCk6IiIsZmlsZW5hbWU6YWkrIi9yZWNvcmRlci8ifSxoPT5rbCgic3RvcCIse3RlbXBGaWxlUGF0aDpofSksaD0+a2woImVycm9yIix7ZXJyTXNnOmgubWVzc2FnZX0pKSxHdT1rKCgpPT57YWMuc3RvcCgpfSxlKSxrbCgic3RhcnQiKSxObD0hMH0sc3RvcCgpe05sJiYoV3Uuc3RvcCgpLE5sPSExLEd1JiZTKEd1KSl9LHBhdXNlKCl7TmwmJmtsKCJlcnJvciIse2Vyck1zZzoiVW5zdXBwb3J0ZWQgb3BlcmF0aW9uOiBwYXVzZSJ9KX0scmVzdW1lKCl7TmwmJmtsKCJlcnJvciIse2Vyck1zZzoiVW5zdXBwb3J0ZWQgb3BlcmF0aW9uOiByZXN1bWUifSl9fSxxcz17cGF1c2U6bnVsbCxyZXN1bWU6bnVsbCxzdGFydDpudWxsLHN0b3A6bnVsbCxlcnJvcjpudWxsfTtmdW5jdGlvbiB5QShlKXtsZXQgdD1lLnN0YXRlO2RlbGV0ZSBlLnN0YXRlLGRlbGV0ZSBlLmVyck1zZyx0JiZZLmlzRnVuY3Rpb24ocXNbdF0pJiZxc1t0XShlKX1jbGFzcyB3QXtjb25zdHJ1Y3Rvcigpe31vbkVycm9yKHQpe3FzLmVycm9yPXR9b25GcmFtZVJlY29yZGVkKHQpe31vbkludGVycnVwdGlvbkJlZ2luKHQpe31vbkludGVycnVwdGlvbkVuZCh0KXt9b25QYXVzZSh0KXtxcy5wYXVzZT10fW9uUmVzdW1lKHQpe3FzLnJlc3VtZT10fW9uU3RhcnQodCl7cXMuc3RhcnQ9dH1vblN0b3AodCl7cXMuc3RvcD10fXBhdXNlKCl7YWMucGF1c2UoKX1yZXN1bWUoKXthYy5yZXN1bWUoKX1zdGFydCh0PXt9KXthYy5zdGFydCh0KX1zdG9wKCl7YWMuc3RvcCgpfX1sZXQgWWgsU0E9TXQoYkUsKCk9PllofHwoWWg9bmV3IHdBKSksQUE9eWUodkUsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bC5nYWxsZXJ5LnNhdmUoZS5maWxlUGF0aCxZcyh0KSxhcihuKSl9LF9FLG1FKSxDQT15ZShoRSwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsLmdhbGxlcnkuc2F2ZShlLmZpbGVQYXRoLFlzKHQpLGFyKG4pKX0scEUsZ0UpLE9BPXllKEVFLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPWAke2FpfS9jb21wcmVzc2VkLyR7RGF0ZS5ub3coKX1fJHtDYShlLnNyYyl9YDtsLnppcC5jb21wcmVzc0ltYWdlKFkuZXh0ZW5kKHt9LGUse2RzdDpyfSksKCk9Pnt0KHt0ZW1wRmlsZVBhdGg6cn0pfSxuKX0sd0UseUUpLFRBPXllKFNFLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPWAke2FpfS9jb21wcmVzc2VkLyR7RGF0ZS5ub3coKX1fJHtDYShlLnNyYyl9YDtsLnppcC5jb21wcmVzc1ZpZGVvKFkuZXh0ZW5kKHt9LGUse2ZpbGVuYW1lOnJ9KSwoKT0+e3Qoe3RlbXBGaWxlUGF0aDpyfSl9LG4pfSxDRSxBRSk7ZnVuY3Rpb24gUEEoZSl7cmV0dXJuIG5ldyBQcm9taXNlKCh0LG4pPT57bC5pby5yZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJMKGUsZnVuY3Rpb24ocil7ci5nZXRNZXRhZGF0YSh0LG4sITEpfSxuKX0pfWxldCBJQT15ZShaMCwoe2NvdW50OmUsc2l6ZVR5cGU6dCxzb3VyY2VUeXBlOm4sY3JvcDpyfT17fSx7cmVzb2x2ZTphLHJlamVjdDp1fSk9PntuaSgpO2xldHt0Omh9PVgoKSxiPWFyKHUpO2Z1bmN0aW9uIFUoZ2Upe2xldCB3ZT1bXSxrZT1bXTtQcm9taXNlLmFsbChnZS5tYXAoRXQ9PlBBKEV0KSkpLnRoZW4oRXQ9PntFdC5mb3JFYWNoKChrdCxadCk9PntsZXQgJHQ9Z2VbWnRdO2tlLnB1c2goJHQpLHdlLnB1c2goe3BhdGg6JHQsc2l6ZTprdC5zaXplfSl9KSxhKHt0ZW1wRmlsZVBhdGhzOmtlLHRlbXBGaWxlczp3ZX0pfSkuY2F0Y2goYil9ZnVuY3Rpb24gTygpe2wuY2FtZXJhLmdldENhbWVyYSgpLmNhcHR1cmVJbWFnZSh3ZT0+VShbd2VdKSxiLHtmaWxlbmFtZTphaSsiL2NhbWVyYS8iLHJlc29sdXRpb246ImhpZ2giLGNyb3A6cixzaXplVHlwZTp0fSl9ZnVuY3Rpb24gRCgpe2wuZ2FsbGVyeS5waWNrKCh7ZmlsZXM6Z2V9KT0+VShnZSksYix7bWF4aW11bTplLG11bHRpcGxlOiEwLHN5c3RlbTohMSxmaWxlbmFtZTphaSsiL2dhbGxlcnkvIixwZXJtaXNzaW9uQWxlcnQ6ITAsY3JvcDpyLHNpemVUeXBlOnR9KX1pZihuLmxlbmd0aD09PTEpe2lmKG4uaW5jbHVkZXMoImFsYnVtIikpe0QoKTtyZXR1cm59ZWxzZSBpZihuLmluY2x1ZGVzKCJjYW1lcmEiKSl7TygpO3JldHVybn19bC5uYXRpdmVVSS5hY3Rpb25TaGVldCh7Y2FuY2VsOmgoInVuaS5jaG9vc2VJbWFnZS5jYW5jZWwiKSxidXR0b25zOlt7dGl0bGU6aCgidW5pLmNob29zZUltYWdlLnNvdXJjZVR5cGUuY2FtZXJhIil9LHt0aXRsZTpoKCJ1bmkuY2hvb3NlSW1hZ2Uuc291cmNlVHlwZS5hbGJ1bSIpfV19LGdlPT57c3dpdGNoKGdlLmluZGV4KXtjYXNlIDE6TygpO2JyZWFrO2Nhc2UgMjpEKCk7YnJlYWs7ZGVmYXVsdDpiKCk7YnJlYWt9fSl9LFEwLFgwKSxOQT15ZShlRSwoe3NvdXJjZVR5cGU6ZSxjb21wcmVzc2VkOnQsbWF4RHVyYXRpb246bixjYW1lcmE6cn0se3Jlc29sdmU6YSxyZWplY3Q6dX0pPT57bXIoKTtsZXR7dDpofT1YKCksYj1hcih1KTtmdW5jdGlvbiBVKGdlKXtsLmlvLmdldFZpZGVvSW5mbyh7ZmlsZVBhdGg6Z2Usc3VjY2Vzcyh3ZSl7bGV0IGtlPXtlcnJNc2c6ImNob29zZVZpZGVvOm9rIix0ZW1wRmlsZVBhdGg6Z2Usc2l6ZTp3ZS5zaXplLGR1cmF0aW9uOndlLmR1cmF0aW9uLHdpZHRoOndlLndpZHRoLGhlaWdodDp3ZS5oZWlnaHR9O2Eoa2UpfSxmYWlsOmJ9KX1mdW5jdGlvbiBPKCl7bC5nYWxsZXJ5LnBpY2soKHtmaWxlczpnZX0pPT5VKGdlWzBdKSxiLHtmaWx0ZXI6InZpZGVvIixzeXN0ZW06ITEsbXVsdGlwbGU6ITAsbWF4aW11bToxLGZpbGVuYW1lOmFpKyIvZ2FsbGVyeS8iLHBlcm1pc3Npb25BbGVydDohMCx2aWRlb0NvbXByZXNzOnR9KX1mdW5jdGlvbiBEKCl7bC5jYW1lcmEuZ2V0Q2FtZXJhKCkuc3RhcnRWaWRlb0NhcHR1cmUoVSxiLHtpbmRleDpyPT09ImZyb250Ij8iMiI6IjEiLHZpZGVvTWF4aW11bUR1cmF0aW9uOm4sZmlsZW5hbWU6YWkrIi9jYW1lcmEvIix2aWRlb0NvbXByZXNzOnR9KX1pZihlLmxlbmd0aD09PTEpe2lmKGUuaW5jbHVkZXMoImFsYnVtIikpe08oKTtyZXR1cm59ZWxzZSBpZihlLmluY2x1ZGVzKCJjYW1lcmEiKSl7RCgpO3JldHVybn19bC5uYXRpdmVVSS5hY3Rpb25TaGVldCh7Y2FuY2VsOmgoInVuaS5jaG9vc2VWaWRlby5jYW5jZWwiKSxidXR0b25zOlt7dGl0bGU6aCgidW5pLmNob29zZVZpZGVvLnNvdXJjZVR5cGUuY2FtZXJhIil9LHt0aXRsZTpoKCJ1bmkuY2hvb3NlVmlkZW8uc291cmNlVHlwZS5hbGJ1bSIpfV19LGdlPT57c3dpdGNoKGdlLmluZGV4KXtjYXNlIDE6RCgpO2JyZWFrO2Nhc2UgMjpPKCk7YnJlYWs7ZGVmYXVsdDpiKCk7YnJlYWt9fSl9LG5FLHRFKSxrQT15ZShIMCwoZSx7cmVzb2x2ZTp0fSk9PntsLmtleS5zaG93U29mdEtleWJvcmQoKSx0KCl9KSxSQT15ZShVMCwoZSx7cmVzb2x2ZTp0fSk9PntsLmtleS5oaWRlU29mdEtleWJvcmQoKSx0KCl9KTtmdW5jdGlvbiBxaChlKXtzdC5pbnZva2VPbkNhbGxiYWNrKHRlLk9OX0tFWUJPQVJEX0hFSUdIVF9DSEFOR0UsZSl9bGV0IHhBPXFuKHRlLk9OX0tFWUJPQVJEX0hFSUdIVF9DSEFOR0UsKCk9PntzdC5vbih0ZS5PTl9LRVlCT0FSRF9IRUlHSFRfQ0hBTkdFLHFoKX0pLEJBPUNyKHRlLk9OX0tFWUJPQVJEX0hFSUdIVF9DSEFOR0UsKCk9PntzdC5vZmYodGUuT05fS0VZQk9BUkRfSEVJR0hUX0NIQU5HRSxxaCl9KTtjbGFzcyBNQXtjb25zdHJ1Y3Rvcih0KXt0aGlzLl9jYWxsYmFja3M9W10sdGhpcy5fZG93bmxvYWRlcj10LHQuYWRkRXZlbnRMaXN0ZW5lcigic3RhdGVjaGFuZ2VkIiwobixyKT0+e24uZG93bmxvYWRlZFNpemUmJm4udG90YWxTaXplJiZ0aGlzLl9jYWxsYmFja3MuZm9yRWFjaChhPT57YSh7cHJvZ3Jlc3M6TWF0aC5yb3VuZChuLmRvd25sb2FkZWRTaXplL24udG90YWxTaXplKjEwMCksdG90YWxCeXRlc1dyaXR0ZW46bi5kb3dubG9hZGVkU2l6ZSx0b3RhbEJ5dGVzRXhwZWN0ZWRUb1dyaXRlOm4udG90YWxTaXplfSl9KX0pfWFib3J0KCl7dGhpcy5fZG93bmxvYWRlci5hYm9ydCgpfW9uUHJvZ3Jlc3NVcGRhdGUodCl7IVkuaXNGdW5jdGlvbih0KXx8dGhpcy5fY2FsbGJhY2tzLnB1c2godCl9b2ZmUHJvZ3Jlc3NVcGRhdGUodCl7bGV0IG49dGhpcy5fY2FsbGJhY2tzLmluZGV4T2YodCk7bj49MCYmdGhpcy5fY2FsbGJhY2tzLnNwbGljZShuLDEpfW9uSGVhZGVyc1JlY2VpdmVkKHQpe3Rocm93IG5ldyBFcnJvcigiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4iKX1vZmZIZWFkZXJzUmVjZWl2ZWQodCl7dGhyb3cgbmV3IEVycm9yKCJNZXRob2Qgbm90IGltcGxlbWVudGVkLiIpfX1sZXQgTEE9VmkoTEUsKHt1cmw6ZSxoZWFkZXI6dCx0aW1lb3V0Om59LHtyZXNvbHZlOnIscmVqZWN0OmF9KT0+e249KG58fFQubmV0d29ya1RpbWVvdXQmJlQubmV0d29ya1RpbWVvdXQucmVxdWVzdHx8NjAqMWUzKS8xZTM7bGV0IHU9bC5kb3dubG9hZGVyLmNyZWF0ZURvd25sb2FkKGUse3RpbWVvdXQ6bixmaWxlbmFtZTphaSsiL2Rvd25sb2FkLyIscmV0cnk6MCxyZXRyeUludGVydmFsOjB9LChiLFUpPT57VT9yKHt0ZW1wRmlsZVBhdGg6Yi5maWxlbmFtZSxzdGF0dXNDb2RlOlV9KTphKGBzdGF0dXNDb2RlOiAke1V9YCl9KSxoPW5ldyBNQSh1KTtmb3IobGV0IGIgaW4gdClZLmhhc093bih0LGIpJiZ1LnNldFJlcXVlc3RIZWFkZXIoYix0W2JdKTtyZXR1cm4gdS5zdGFydCgpLGh9LEZFLERFKSxEQT1lPT57bGV0IHQ9ZVsiU2V0LUNvb2tpZSJdfHxlWyJzZXQtY29va2llIl0sbj1bXTtpZighdClyZXR1cm5bXTt0WzBdPT09IlsiJiZ0W3QubGVuZ3RoLTFdPT09Il0iJiYodD10LnNsaWNlKDEsLTEpKTtsZXQgcj10LnNwbGl0KCI7Iik7Zm9yKGxldCBhPTA7YTxyLmxlbmd0aDthKyspclthXS5pbmRleE9mKCJFeHBpcmVzPSIpIT09LTF8fHJbYV0uaW5kZXhPZigiZXhwaXJlcz0iKSE9PS0xP24ucHVzaChyW2FdLnJlcGxhY2UoIiwiLCIiKSk6bi5wdXNoKHJbYV0pO3JldHVybiBuPW4uam9pbigiOyIpLnNwbGl0KCIsIiksbn07ZnVuY3Rpb24gRkEoZSx0KXtpZihZLmlzU3RyaW5nKGUuZGF0YSkmJmUuZGF0YS5jaGFyQ29kZUF0KDApPT09NjUyNzkmJihlLmRhdGE9ZS5kYXRhLnNsaWNlKDEpKSxlLnN0YXR1c0NvZGU9cGFyc2VJbnQoU3RyaW5nKGUuc3RhdHVzQ29kZSksMTApLFkuaXNQbGFpbk9iamVjdChlLmhlYWRlcikmJihlLmhlYWRlcj1PYmplY3Qua2V5cyhlLmhlYWRlcikucmVkdWNlKGZ1bmN0aW9uKG4scil7bGV0IGE9ZS5oZWFkZXJbcl07cmV0dXJuIFkuaXNBcnJheShhKT9uW3JdPWEuam9pbigiLCIpOlkuaXNTdHJpbmcoYSkmJihuW3JdPWEpLG59LHt9KSksdC5kYXRhVHlwZSYmdC5kYXRhVHlwZS50b0xvd2VyQ2FzZSgpPT09Impzb24iKXRyeXtlLmRhdGE9SlNPTi5wYXJzZShlLmRhdGEpfWNhdGNoKG4pe31yZXR1cm4gZX1jbGFzcyBWQXtjb25zdHJ1Y3Rvcih0KXt0aGlzLl9yZXF1ZXN0VGFzaz10fWFib3J0KCl7dGhpcy5fcmVxdWVzdFRhc2suYWJvcnQoKX1vZmZIZWFkZXJzUmVjZWl2ZWQoKXt9b25IZWFkZXJzUmVjZWl2ZWQoKXt9fWxldCAkQT1WaShPRSwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXR7aGVhZGVyOnIsbWV0aG9kOmEsZGF0YTp1LHRpbWVvdXQ6aCx1cmw6YixyZXNwb25zZVR5cGU6VSxzc2xWZXJpZnk6TyxmaXJzdElwdjQ6RCx0bHM6Z2V9PWUsd2U7Zm9yKGxldCBtdCBpbiByKWlmKG10LnRvTG93ZXJDYXNlKCk9PT0iY29udGVudC10eXBlIil7d2U9clttdF07YnJlYWt9YSE9PSJHRVQiJiZ3ZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qc29uIik9PT0wJiZZLmlzUGxhaW5PYmplY3QodSkmJih1PUpTT04uc3RyaW5naWZ5KHUpKTtsZXQga2U9SG8oInN0cmVhbSIpLEV0PXt9LGt0LFp0LCR0PSExO2ZvcihsZXQgbXQgaW4gcilpZighJHQmJm10LnRvTG93ZXJDYXNlKCk9PT0iY29udGVudC10eXBlIil7aWYoJHQ9ITAsRXRbIkNvbnRlbnQtVHlwZSJdPXJbbXRdLGEhPT0iR0VUIiYmclttdF0uaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIik9PT0wJiYhWS5pc1N0cmluZyh1KSYmISh1IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKXtsZXQgaG49W107Zm9yKGxldCBYdCBpbiB1KVkuaGFzT3duKHUsWHQpJiZobi5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChYdCkrIj0iK2VuY29kZVVSSUNvbXBvbmVudCh1W1h0XSkpO3U9aG4uam9pbigiJiIpfX1lbHNlIEV0W210XT1yW210XTshJHQmJmE9PT0iUE9TVCImJihFdFsiQ29udGVudC1UeXBlIl09ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIpLGgmJihrdD1rKCgpPT57WnQ9ITAsbigidGltZW91dCIpfSxoKzIwMCkpO2xldCBObj17bWV0aG9kOmEsdXJsOmIudHJpbSgpLGhlYWRlcnM6RXQsdHlwZTpVPT09ImFycmF5YnVmZmVyIj8iYmFzZTY0IjoidGV4dCIsdGltZW91dDpofHw2ZTUsc3NsVmVyaWZ5OiFPLGZpcnN0SXB2NDpELHRsczpnZX0sRG49ITE7YSE9PSJHRVQiJiYodG9TdHJpbmcuY2FsbCh1KT09PSJbb2JqZWN0IEFycmF5QnVmZmVyXSI/RG49ITA6Tm4uYm9keT1ZLmlzU3RyaW5nKHUpP3U6SlNPTi5zdHJpbmdpZnkodSkpO2xldCBlbj0oe29rOm10LHN0YXR1czpobixkYXRhOlh0LGhlYWRlcnM6anQsZXJyb3JNc2c6Z259KT0+e2lmKFp0KXJldHVybjtrdCYmUyhrdCk7bGV0IHNyPWhuO2lmKHNyPjApdChGQSh7ZGF0YTptdCYmVT09PSJhcnJheWJ1ZmZlciI/SG4oWHQpOlh0LHN0YXR1c0NvZGU6c3IsaGVhZGVyOmp0LGNvb2tpZXM6REEoanQpfSxlKSk7ZWxzZXtsZXQgenQ9ImFib3J0IHN0YXR1c0NvZGU6IitzcjtnbiYmKHp0PXp0KyIgIitnbiksbih6dCl9fTtyZXR1cm4gRG4/a2UuZmV0Y2hXaXRoQXJyYXlCdWZmZXIoeyJAdHlwZSI6ImJpbmFyeSIsYmFzZTY0OkJuKHUpfSxObixlbik6a2UuZmV0Y2goTm4sZW4pLG5ldyBWQSh7YWJvcnQoKXtadD0hMCxrdCYmUyhrdCksbigiYWJvcnQiKX19KX0sa0UsUkUpLFVBPXllKHhFLCh7Y2VydGlmaWNhdGVzOmV9LHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e0hvKCJzdHJlYW0iKS5jb25maWdNVExTKGUsKHt0eXBlOmEsY29kZTp1LG1lc3NhZ2U6aH0pPT57c3dpdGNoKGEpe2Nhc2Uic3VjY2VzcyI6dCh7Y29kZTp1fSk7YnJlYWs7Y2FzZSJmYWlsIjpuKGgse2NvZGU6dX0pO2JyZWFrfX0pfSxCRSxNRSksUmw9W10seGw9e30sWXU9e29wZW46IiIsY2xvc2U6IiIsZXJyb3I6IiIsbWVzc2FnZToiIn0sc2M7ZnVuY3Rpb24gSEEoZSl7bGV0IHQ9U3RyaW5nKERhdGUubm93KCkpLG47dHJ5e3NjfHwoc2M9SG8oInVuaS13ZWJTb2NrZXQiKSxqQShzYykpLHNjLldlYlNvY2tldCh7aWQ6dCx1cmw6ZS51cmwscHJvdG9jb2w6WS5pc0FycmF5KGUucHJvdG9jb2xzKT9lLnByb3RvY29scy5qb2luKCIsIik6ZS5wcm90b2NvbHMsaGVhZGVyOmUuaGVhZGVyfSl9Y2F0Y2gocil7bj1yfXJldHVybntzb2NrZXQ6c2Msc29ja2V0SWQ6dCxlcnJNc2c6bn19ZnVuY3Rpb24gakEoZSl7ZS5vbm9wZW4odD0+e2xldCBuPXhsW3QuaWRdOyFufHxuLl9zb2NrZXRPbk9wZW4oKX0pLGUub25tZXNzYWdlKHQ9PntsZXQgbj14bFt0LmlkXTshbnx8bi5fc29ja2V0T25NZXNzYWdlKHQpfSksZS5vbmVycm9yKHQ9PntsZXQgbj14bFt0LmlkXTshbnx8bi5fc29ja2V0T25FcnJvcigpfSksZS5vbmNsb3NlKHQ9PntsZXQgbj14bFt0LmlkXTshbnx8bi5fc29ja2V0T25DbG9zZSgpfSl9Y2xhc3MgekF7Y29uc3RydWN0b3IodCxuKXt0aGlzLmlkPW4sdGhpcy5fc29ja2V0PXQsdGhpcy5fY2FsbGJhY2tzPXtvcGVuOltdLGNsb3NlOltdLGVycm9yOltdLG1lc3NhZ2U6W119LHRoaXMuQ0xPU0VEPTMsdGhpcy5DTE9TSU5HPTIsdGhpcy5DT05ORUNUSU5HPTAsdGhpcy5PUEVOPTEsdGhpcy5yZWFkeVN0YXRlPXRoaXMuQ0xPU0VELCEhdGhpcy5fc29ja2V0fV9zb2NrZXRPbk9wZW4oKXt0aGlzLnJlYWR5U3RhdGU9dGhpcy5PUEVOLHRoaXMuc29ja2V0U3RhdGVDaGFuZ2UoIm9wZW4iKX1fc29ja2V0T25NZXNzYWdlKHQpe3RoaXMuc29ja2V0U3RhdGVDaGFuZ2UoIm1lc3NhZ2UiLHtkYXRhOnR5cGVvZiB0LmRhdGE9PSJvYmplY3QiP0huKHQuZGF0YS5iYXNlNjQpOnQuZGF0YX0pfV9zb2NrZXRPbkVycm9yKCl7dGhpcy5zb2NrZXRTdGF0ZUNoYW5nZSgiZXJyb3IiKSx0aGlzLm9uRXJyb3JPckNsb3NlKCl9X3NvY2tldE9uQ2xvc2UoKXt0aGlzLnNvY2tldFN0YXRlQ2hhbmdlKCJjbG9zZSIpLHRoaXMub25FcnJvck9yQ2xvc2UoKX1vbkVycm9yT3JDbG9zZSgpe3RoaXMucmVhZHlTdGF0ZT10aGlzLkNMT1NFRCxkZWxldGUgeGxbdGhpcy5pZF07bGV0IHQ9UmwuaW5kZXhPZih0aGlzKTt0Pj0wJiZSbC5zcGxpY2UodCwxKX1zb2NrZXRTdGF0ZUNoYW5nZSh0LG49e30pe2xldCByPXQ9PT0ibWVzc2FnZSI/bjp7fTt0aGlzPT09UmxbMF0mJll1W3RdJiZzdC5pbnZva2VPbkNhbGxiYWNrKFl1W3RdLHIpLHRoaXMuX2NhbGxiYWNrc1t0XS5mb3JFYWNoKGE9PntZLmlzRnVuY3Rpb24oYSkmJmEocil9KX1zZW5kKHQsbj0hMCl7dGhpcy5yZWFkeVN0YXRlIT09dGhpcy5PUEVOJiZ0ZS5jYWxsT3B0aW9ucyh0LCJzZW5kU29ja2V0TWVzc2FnZTpmYWlsIFdlYlNvY2tldCBpcyBub3QgY29ubmVjdGVkIik7dHJ5e3RoaXMuX3NvY2tldC5zZW5kKHtpZDp0aGlzLmlkLGRhdGE6dHlwZW9mIHQuZGF0YT09Im9iamVjdCI/eyJAdHlwZSI6ImJpbmFyeSIsYmFzZTY0OkJuKHQuZGF0YSl9OnQuZGF0YX0pLG4mJnRlLmNhbGxPcHRpb25zKHQsInNlbmRTb2NrZXRNZXNzYWdlOm9rIil9Y2F0Y2gocil7biYmdGUuY2FsbE9wdGlvbnModCxgc2VuZFNvY2tldE1lc3NhZ2U6ZmFpbCAke3J9YCl9fWNsb3NlKHQsbj0hMCl7dGhpcy5yZWFkeVN0YXRlPXRoaXMuQ0xPU0lORzt0cnl7dGhpcy5fc29ja2V0LmNsb3NlKFkuZXh0ZW5kKHtpZDp0aGlzLmlkLGFyZ3M6dH0pKSxuJiZ0ZS5jYWxsT3B0aW9ucyh0LCJjbG9zZVNvY2tldDpvayIpfWNhdGNoKHIpe24mJnRlLmNhbGxPcHRpb25zKHQsYGNsb3NlU29ja2V0OmZhaWwgJHtyfWApfX1vbk9wZW4odCl7dGhpcy5fY2FsbGJhY2tzLm9wZW4ucHVzaCh0KX1vbkNsb3NlKHQpe3RoaXMuX2NhbGxiYWNrcy5jbG9zZS5wdXNoKHQpfW9uRXJyb3IodCl7dGhpcy5fY2FsbGJhY2tzLmVycm9yLnB1c2godCl9b25NZXNzYWdlKHQpe3RoaXMuX2NhbGxiYWNrcy5tZXNzYWdlLnB1c2godCl9fWxldCBXQT1WaShIRSwoe3VybDplLHByb3RvY29sczp0LGhlYWRlcjpuLG1ldGhvZDpyfSx7cmVzb2x2ZTphLHJlamVjdDp1fSk9PntsZXR7c29ja2V0Omgsc29ja2V0SWQ6YixlcnJNc2c6VX09SEEoe3VybDplLHByb3RvY29sczp0LGhlYWRlcjpuLG1ldGhvZDpyfSksTz1uZXcgekEoaCxiKTtyZXR1cm4gVT9rKCgpPT57dShVKX0sMCk6KFJsLnB1c2goTykseGxbYl09TyksaygoKT0+e2EoKX0sMCksT30sekUsakUpLEdBPXllKFdFLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPVJsWzBdO2lmKCFyfHxyLnJlYWR5U3RhdGUhPT1yLk9QRU4pe24oIldlYlNvY2tldCBpcyBub3QgY29ubmVjdGVkIik7cmV0dXJufXIuc2VuZCh7ZGF0YTplLmRhdGF9LCExKSx0KCl9LEdFKSxZQT15ZShZRSwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1SbFswXTtpZighcil7bigiV2ViU29ja2V0IGlzIG5vdCBjb25uZWN0ZWQiKTtyZXR1cm59ci5yZWFkeVN0YXRlPXIuQ0xPU0lORyxyLmNsb3NlKGUsITEpLHQoKX0scUUpO2Z1bmN0aW9uIExjKGUpe2xldCB0PWBvblNvY2tldCR7WS5jYXBpdGFsaXplKGUpfWA7cmV0dXJuIHFuKHQsKCk9PntZdVtlXT10fSl9bGV0IHFBPUxjKCJvcGVuIiksS0E9TGMoImVycm9yIiksSkE9TGMoIm1lc3NhZ2UiKSxaQT1MYygiY2xvc2UiKTtjbGFzcyBYQXtjb25zdHJ1Y3Rvcih0KXt0aGlzLl9jYWxsYmFja3M9W10sdGhpcy5fdXBsb2FkZXI9dCx0LmFkZEV2ZW50TGlzdGVuZXIoInN0YXRlY2hhbmdlZCIsKG4scik9PntuLnVwbG9hZGVkU2l6ZSYmbi50b3RhbFNpemUmJnRoaXMuX2NhbGxiYWNrcy5mb3JFYWNoKGE9PnthKHtwcm9ncmVzczpwYXJzZUludChTdHJpbmcobi51cGxvYWRlZFNpemUvbi50b3RhbFNpemUqMTAwKSksdG90YWxCeXRlc1NlbnQ6bi51cGxvYWRlZFNpemUsdG90YWxCeXRlc0V4cGVjdGVkVG9TZW5kOm4udG90YWxTaXplfSl9KX0pfWFib3J0KCl7dGhpcy5fdXBsb2FkZXIuYWJvcnQoKX1vblByb2dyZXNzVXBkYXRlKHQpeyFZLmlzRnVuY3Rpb24odCl8fHRoaXMuX2NhbGxiYWNrcy5wdXNoKHQpfW9uSGVhZGVyc1JlY2VpdmVkKCl7fW9mZlByb2dyZXNzVXBkYXRlKHQpe2xldCBuPXRoaXMuX2NhbGxiYWNrcy5pbmRleE9mKHQpO24+PTAmJnRoaXMuX2NhbGxiYWNrcy5zcGxpY2UobiwxKX1vZmZIZWFkZXJzUmVjZWl2ZWQoKXt9fWxldCBRQT1WaShWRSwoe3VybDplLHRpbWVvdXQ6dCxoZWFkZXI6bixmb3JtRGF0YTpyLGZpbGVzOmEsZmlsZVBhdGg6dSxuYW1lOmh9LHtyZXNvbHZlOmIscmVqZWN0OlV9KT0+e2xldCBPPWwudXBsb2FkZXIuY3JlYXRlVXBsb2FkKGUse3RpbWVvdXQ6dCxyZXRyeTowLHJldHJ5SW50ZXJ2YWw6MH0sKGdlLHdlKT0+e3dlP2Ioe2RhdGE6Z2UucmVzcG9uc2VUZXh0LHN0YXR1c0NvZGU6d2V9KTpVKGBzdGF0dXNDb2RlOiAke3dlfWApfSk7Zm9yKGxldCBnZSBpbiBuKVkuaGFzT3duKG4sZ2UpJiZPLnNldFJlcXVlc3RIZWFkZXIoZ2UsU3RyaW5nKG5bZ2VdKSk7Zm9yKGxldCBnZSBpbiByKVkuaGFzT3duKHIsZ2UpJiZPLmFkZERhdGEoZ2UsU3RyaW5nKHJbZ2VdKSk7YSYmYS5sZW5ndGg/YS5mb3JFYWNoKGdlPT57Ty5hZGRGaWxlKHB0KGdlLnVyaSkse2tleTpnZS5uYW1lfHwiZmlsZSJ9KX0pOk8uYWRkRmlsZShwdCh1KSx7a2V5Omh9KTtsZXQgRD1uZXcgWEEoTyk7cmV0dXJuIE8uc3RhcnQoKSxEfSxVRSwkRSksRXM9e30sZUM9WyJwbGF5IiwiY2FucGxheSIsImVuZGVkIiwic3RvcCIsIndhaXRpbmciLCJzZWVraW5nIiwic2Vla2VkIiwicGF1c2UiXSxLaD0icGxheWJhY2siLHRDPWU9PntsZXQgdD1Fc1tlXTshdHx8dC5pbml0U3RhdGVDaGFnZXx8KHQuaW5pdFN0YXRlQ2hhZ2U9ITAsdC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsbj0+e0poKHtzdGF0ZToiZXJyb3IiLGF1ZGlvSWQ6ZSxlcnJNc2c6Ik1lZGlhRXJyb3IiLGVyckNvZGU6bi5jb2RlfSl9KSxlQy5mb3JFYWNoKG49Pnt0LmFkZEV2ZW50TGlzdGVuZXIobiwoKT0+e249PT0icGxheSI/dC5pc1N0b3BwZWQ9ITE6bj09PSJzdG9wIiYmKHQuaXNTdG9wcGVkPSEwKSxKaCh7c3RhdGU6bixhdWRpb0lkOmV9KX0pfSkpfTtmdW5jdGlvbiBuQygpe2xldCBlPWAke0RhdGUubm93KCl9JHtNYXRoLnJhbmRvbSgpfWAsdD1Fc1tlXT1sLmF1ZGlvLmNyZWF0ZVBsYXllcigiIik7cmV0dXJuIHQuc3JjPSIiLHQudm9sdW1lPTEsdC5zdGFydFRpbWU9MCx0LnNldFNlc3Npb25DYXRlZ29yeShLaCkse2Vyck1zZzoiY3JlYXRlQXVkaW9JbnN0YW5jZTpvayIsYXVkaW9JZDplfX1mdW5jdGlvbiByQyh7YXVkaW9JZDplLHNyYzp0LHN0YXJ0VGltZTpuLGF1dG9wbGF5OnI9ITEsbG9vcDphPSExLG9iZXlNdXRlU3dpdGNoOnUsdm9sdW1lOmgsc2Vzc2lvbkNhdGVnb3J5OmI9S2gscGxheWJhY2tSYXRlOlV9KXtsZXQgTz1Fc1tlXTtpZihPKXtsZXQgRD17bG9vcDphLGF1dG9wbGF5OnJ9O2lmKHQpe2xldCBnZT1wdCh0KTtPLnNyYyE9PWdlJiYoTy5zcmM9RC5zcmM9Z2UpfW4mJihPLnN0YXJ0VGltZT1ELnN0YXJ0VGltZT1uKSx0eXBlb2YgaD09Im51bWJlciImJihPLnZvbHVtZT1ELnZvbHVtZT1oKSxPLnNldFN0eWxlcyhEKSxiJiZPLnNldFNlc3Npb25DYXRlZ29yeShiKSxVJiZPLnBsYXliYWNrUmF0ZSYmTy5wbGF5YmFja1JhdGUoVSksdEMoZSl9cmV0dXJue2Vyck1zZzoic2V0QXVkaW9TdGF0ZTpvayJ9fWZ1bmN0aW9uIGlDKHthdWRpb0lkOmV9KXtsZXQgdD1Fc1tlXTtpZighdClyZXR1cm57ZXJyTXNnOiJnZXRBdWRpb1N0YXRlOmZhaWwifTtsZXR7c3JjOm4sc3RhcnRUaW1lOnIsdm9sdW1lOmF9PXQ7cmV0dXJue2Vyck1zZzoiZ2V0QXVkaW9TdGF0ZTpvayIsZHVyYXRpb246MWUzKih0LmdldER1cmF0aW9uKCl8fDApLGN1cnJlbnRUaW1lOnQuaXNTdG9wcGVkPzA6MWUzKnQuZ2V0UG9zaXRpb24oKSxwYXVzZWQ6dC5pc1BhdXNlZCgpLHNyYzpuLHZvbHVtZTphLHN0YXJ0VGltZToxZTMqcixidWZmZXJlZDoxZTMqdC5nZXRCdWZmZXJlZCgpfX1mdW5jdGlvbiBvQyh7b3BlcmF0aW9uVHlwZTplLGF1ZGlvSWQ6dCxjdXJyZW50VGltZTpufSl7bGV0IHI9RXNbdF07c3dpdGNoKGUpe2Nhc2UicGxheSI6Y2FzZSJwYXVzZSI6Y2FzZSJzdG9wIjpyW2U9PT0icGxheSImJnIuaXNQYXVzZWQoKT8icmVzdW1lIjplXSgpO2JyZWFrO2Nhc2Uic2VlayI6dHlwZW9mIG4hPSJ1bmRlZmluZWQiJiZyLnNlZWtUbyhuLzFlMyk7YnJlYWt9cmV0dXJue2Vyck1zZzoib3BlcmF0ZUF1ZGlvOm9rIn19bGV0IHF1PU9iamVjdC5jcmVhdGUobnVsbCksSmg9KHtzdGF0ZTplLGF1ZGlvSWQ6dCxlcnJNc2c6bixlcnJDb2RlOnJ9KT0+e2xldCBhPXF1W3RdO2lmKGEpaWYoWmgoYSxlLG4sciksZT09PSJwbGF5Iil7bGV0IHU9YS5jdXJyZW50VGltZTthLl9fdGltaW5nPU4oKCk9PnthLmN1cnJlbnRUaW1lIT09dSYmWmgoYSwidGltZVVwZGF0ZSIpfSwyMDApfWVsc2UoZT09PSJwYXVzZSJ8fGU9PT0ic3RvcCJ8fGU9PT0iZXJyb3IiKSYmZihhLl9fdGltaW5nKX0sYUM9W3tuYW1lOiJzcmMiLGNhY2hlOiEwfSx7bmFtZToic3RhcnRUaW1lIixkZWZhdWx0OjAsY2FjaGU6ITB9LHtuYW1lOiJhdXRvcGxheSIsZGVmYXVsdDohMSxjYWNoZTohMH0se25hbWU6Imxvb3AiLGRlZmF1bHQ6ITEsY2FjaGU6ITB9LHtuYW1lOiJvYmV5TXV0ZVN3aXRjaCIsZGVmYXVsdDohMCxyZWFkb25seTohMCxjYWNoZTohMH0se25hbWU6ImR1cmF0aW9uIixyZWFkb25seTohMH0se25hbWU6ImN1cnJlbnRUaW1lIixyZWFkb25seTohMH0se25hbWU6InBhdXNlZCIscmVhZG9ubHk6ITB9LHtuYW1lOiJidWZmZXJlZCIscmVhZG9ubHk6ITB9LHtuYW1lOiJ2b2x1bWUifSx7bmFtZToicGxheWJhY2tSYXRlIixjYWNoZTohMH1dO2NsYXNzIEt1e2NvbnN0cnVjdG9yKHQpe3RoaXMuaWQ9dCx0aGlzLl9jYWxsYmFja3M9e30sdGhpcy5fb3B0aW9ucz17fSxIZC5mb3JFYWNoKG49Pnt0aGlzLl9jYWxsYmFja3Nbbl09W119KSxhQy5mb3JFYWNoKG49PntsZXQgcj1uLm5hbWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMscix7Z2V0OigpPT57bGV0IGE9bi5jYWNoZT90aGlzLl9vcHRpb25zOmlDKHthdWRpb0lkOnRoaXMuaWR9KSx1PXIgaW4gYT9hW3JdOm4uZGVmYXVsdDtyZXR1cm4gdHlwZW9mIHU9PSJudW1iZXIiJiZyIT09InZvbHVtZSI/dS8xZTM6dX0sc2V0Om4ucmVhZG9ubHk/dm9pZCAwOmE9Pnt0aGlzLl9vcHRpb25zW3JdPWEsckMoWS5leHRlbmQoe30sdGhpcy5fb3B0aW9ucyx7YXVkaW9JZDp0aGlzLmlkfSkpfX0pfSksc0MoKX1wbGF5KCl7dGhpcy5fb3BlcmF0ZSgicGxheSIpfXBhdXNlKCl7dGhpcy5fb3BlcmF0ZSgicGF1c2UiKX1zdG9wKCl7dGhpcy5fb3BlcmF0ZSgic3RvcCIpfXNlZWsodCl7dGhpcy5fb3BlcmF0ZSgic2VlayIse2N1cnJlbnRUaW1lOnQqMWUzfSl9ZGVzdHJveSgpe2YodGhpcy5fX3RpbWluZyksRXNbdGhpcy5pZF0mJihFc1t0aGlzLmlkXS5jbG9zZSgpLGRlbGV0ZSBFc1t0aGlzLmlkXSksZGVsZXRlIHF1W3RoaXMuaWRdfV9vcGVyYXRlKHQsbil7b0MoWS5leHRlbmQoe30sbix7YXVkaW9JZDp0aGlzLmlkLG9wZXJhdGlvblR5cGU6dH0pKX19bGV0IHNDPXRlLm9uY2UoKCk9PntIZC5mb3JFYWNoKGU9PntLdS5wcm90b3R5cGVbZV09ZnVuY3Rpb24odCl7WS5pc0Z1bmN0aW9uKHQpJiZ0aGlzLl9jYWxsYmFja3NbZV0ucHVzaCh0KX19KSx2Xy5mb3JFYWNoKGU9PntLdS5wcm90b3R5cGVbZV09ZnVuY3Rpb24odCl7bGV0IG49dGhpcy5fY2FsbGJhY2tzW2VdLHI9bi5pbmRleE9mKHQpO3I+PTAmJm4uc3BsaWNlKHIsMSl9fSl9KTtmdW5jdGlvbiBaaChlLHQsbixyKXtsZXQgYT1gb24ke1kuY2FwaXRhbGl6ZSh0KX1gO2UuX2NhbGxiYWNrc1thXS5mb3JFYWNoKHU9PntZLmlzRnVuY3Rpb24odSkmJnUodD09PSJlcnJvciI/e2Vyck1zZzpuLGVyckNvZGU6cn06e30pfSl9bGV0IGxDPU10KFdtLCgpPT57bGV0e2F1ZGlvSWQ6ZX09bkMoKSx0PW5ldyBLdShlKTtyZXR1cm4gcXVbZV09dCx0fSksY0M9WyJjYW5wbGF5IiwicGxheSIsInBhdXNlIiwic3RvcCIsImVuZGVkIiwidGltZVVwZGF0ZSIsInByZXYiLCJuZXh0IiwiZXJyb3IiLCJ3YWl0aW5nIl0sWGg9e2NhbnBsYXk6W10scGxheTpbXSxwYXVzZTpbXSxzdG9wOltdLGVuZGVkOltdLHRpbWVVcGRhdGU6W10scHJldjpbXSxuZXh0OltdLGVycm9yOltdLHdhaXRpbmc6W119LEd0LEp1PW51bGwsdUM9MjUwLGZDPVsicGxheSIsInBhdXNlIiwiZW5kZWQiLCJzdG9wIiwiY2FucGxheSJdO2Z1bmN0aW9uIGRDKCl7RGMoKSxKdT1OKCgpPT57Qmwoe3N0YXRlOiJ0aW1lVXBkYXRlIn0pfSx1Qyl9ZnVuY3Rpb24gRGMoKXtKdSE9PW51bGwmJmYoSnUpfWZ1bmN0aW9uIGhDKCl7aWYoR3QpcmV0dXJuO2xldCBlPXN0Lmludm9rZU9uQ2FsbGJhY2s7R3Q9bC5hdWRpby5jcmVhdGVQbGF5ZXIoe2F1dG9wbGF5OiEwLGJhY2tncm91bmRDb250cm9sOiEwfSksR3Quc3JjPUd0LnRpdGxlPUd0LmVwbmFtZT1HdC5zaW5nZXI9R3QuY292ZXJJbWdVcmw9R3Qud2ViVXJsPSIiLEd0LnN0YXJ0VGltZT0wLGZDLmZvckVhY2godD0+e0d0LmFkZEV2ZW50TGlzdGVuZXIodCwoKT0+e3Q9PT0icGxheSI/KEd0LmlzU3RvcHBlZD0hMSxkQygpKTp0PT09InN0b3AiJiYoR3QuaXNTdG9wcGVkPSEwKSwodD09PSJwYXVzZSJ8fHQ9PT0iZW5kZWQifHx0PT09InN0b3AiKSYmRGMoKTtsZXQgbj1gb25NdXNpYyR7dFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSl9YDtlKG4se2RhdGFVcmw6R3Quc3JjLGVyck1zZzpgJHtufTpva2B9KSxCbCh7c3RhdGU6dCxkYXRhVXJsOkd0LnNyY30pfSl9KSxHdC5hZGRFdmVudExpc3RlbmVyKCJ3YWl0aW5nIiwoKT0+e0RjKCksQmwoe3N0YXRlOiJ3YWl0aW5nIixkYXRhVXJsOkd0LnNyY30pfSksR3QuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHQ9PntEYygpLGUoIm9uTXVzaWNFcnJvciIse2RhdGFVcmw6R3Quc3JjLGVyck1zZzoiRXJyb3I6Iit0Lm1lc3NhZ2V9KSxCbCh7c3RhdGU6ImVycm9yIixkYXRhVXJsOkd0LnNyYyxlcnJNc2c6dC5tZXNzYWdlLGVyckNvZGU6dC5jb2RlfSl9KSxHdC5hZGRFdmVudExpc3RlbmVyKCJwcmV2IiwoKT0+e0JsKHtzdGF0ZToicHJldiJ9KX0pLEd0LmFkZEV2ZW50TGlzdGVuZXIoIm5leHQiLCgpPT57Qmwoe3N0YXRlOiJuZXh0In0pfSl9ZnVuY3Rpb24gZ0MoKXtsZXQgZT17ZHVyYXRpb246MCxjdXJyZW50VGltZTowLHBhdXNlZDohMSxzcmM6IiIsYnVmZmVyZWQ6MCx0aXRsZToiIixlcG5hbWU6IiIsc2luZ2VyOiIiLGNvdmVySW1nVXJsOiIiLHdlYlVybDoiIixzdGFydFRpbWU6MCxlcnJNc2c6ImdldEJhY2tncm91bmRBdWRpb1N0YXRlOm9rIn07aWYoR3Qpe2xldCB0PXtkdXJhdGlvbjpHdC5nZXREdXJhdGlvbigpfHwwLGN1cnJlbnRUaW1lOkd0LmlzU3RvcHBlZD8wOkd0LmdldFBvc2l0aW9uKCkscGF1c2VkOkd0LmlzUGF1c2VkKCksc3JjOkd0LnNyYyxidWZmZXJlZDpHdC5nZXRCdWZmZXJlZCgpLHRpdGxlOkd0LnRpdGxlLGVwbmFtZTpHdC5lcG5hbWUsc2luZ2VyOkd0LnNpbmdlcixjb3ZlckltZ1VybDpHdC5jb3ZlckltZ1VybCx3ZWJVcmw6R3Qud2ViVXJsLHN0YXJ0VGltZTpHdC5zdGFydFRpbWV9O2U9WS5leHRlbmQoZSx0KX1yZXR1cm4gZX1mdW5jdGlvbiBRaChlLHQpe2hDKCk7bGV0IG49WyJzcmMiLCJzdGFydFRpbWUiLCJjb3ZlckltZ1VybCIsIndlYlVybCIsInNpbmdlciIsImVwbmFtZSIsInRpdGxlIl07aWYodD09PSJwbGF5YmFja1JhdGUiKXtsZXQgYT1lW3RdO0d0LnBsYXliYWNrUmF0ZSYmR3QucGxheWJhY2tSYXRlKHBhcnNlRmxvYXQoYSkpO3JldHVybn1sZXQgcj17fTtPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGE9PntpZihuLmluZGV4T2YoYSk+PTApe2xldCB1PWVbYV07YT09PW5bMF0mJnUmJih1PXB0KHUpKSxHdFthXT1yW2FdPXV9fSksR3Quc2V0U3R5bGVzKHIpfWZ1bmN0aW9uIHBDKHtvcGVyYXRpb25UeXBlOmUsc3JjOnQscG9zaXRpb246bixhcGk6cj0ib3BlcmF0ZU11c2ljUGxheWVyIix0aXRsZTphLGNvdmVySW1nVXJsOnV9KXt2YXIgaD1bInJlc3VtZSIsInBhdXNlIiwic3RvcCJdO3JldHVybiBoLmluZGV4T2YoZSk+MD9HdCYmR3RbZV0oKTplPT09InBsYXkiPyhRaCh7c3JjOnQsc3RhcnRUaW1lOm4sdGl0bGU6YSxjb3ZlckltZ1VybDp1fSksR3QucGxheSgpKTplPT09InNlZWsiJiZHdCYmR3Quc2Vla1RvKG4pLHtlcnJNc2c6YCR7cn06b2tgfX1mdW5jdGlvbiB2Qyh7b3BlcmF0aW9uVHlwZTplLHNyYzp0LHN0YXJ0VGltZTpuLGN1cnJlbnRUaW1lOnJ9KXtyZXR1cm4gcEMoe29wZXJhdGlvblR5cGU6ZSxzcmM6dCxwb3NpdGlvbjpufHxyfHwwLGFwaToib3BlcmF0ZUJhY2tncm91bmRBdWRpbyJ9KX1mdW5jdGlvbiBCbCh7c3RhdGU6ZSxlcnJNc2c6dCxlcnJDb2RlOm4sZGF0YVVybDpyfSl7WGhbZV0uZm9yRWFjaChhPT57WS5pc0Z1bmN0aW9uKGEpJiZhKGU9PT0iZXJyb3IiP3tlcnJNc2c6dCxlcnJDb2RlOm59Ont9KX0pfWxldCBtQz10ZS5vbmNlKCgpPT57Y0MuZm9yRWFjaChlPT57ZWcucHJvdG90eXBlW2BvbiR7WS5jYXBpdGFsaXplKGUpfWBdPWZ1bmN0aW9uKHQpe1hoW2VdLnB1c2godCl9fSl9KSxfQz1be25hbWU6ImR1cmF0aW9uIixyZWFkb25seTohMH0se25hbWU6ImN1cnJlbnRUaW1lIixyZWFkb25seTohMH0se25hbWU6InBhdXNlZCIscmVhZG9ubHk6ITB9LHtuYW1lOiJzcmMiLGNhY2hlOiEwfSx7bmFtZToic3RhcnRUaW1lIixkZWZhdWx0OjAsY2FjaGU6ITB9LHtuYW1lOiJidWZmZXJlZCIscmVhZG9ubHk6ITB9LHtuYW1lOiJ0aXRsZSIsY2FjaGU6ITB9LHtuYW1lOiJlcG5hbWUiLGNhY2hlOiEwfSx7bmFtZToic2luZ2VyIixjYWNoZTohMH0se25hbWU6ImNvdmVySW1nVXJsIixjYWNoZTohMH0se25hbWU6IndlYlVybCIsY2FjaGU6ITB9LHtuYW1lOiJwcm90b2NvbCIscmVhZG9ubHk6ITAsZGVmYXVsdDoiaHR0cCJ9LHtuYW1lOiJwbGF5YmFja1JhdGUiLGRlZmF1bHQ6MSxjYWNoZTohMH1dO2NsYXNzIGVne2NvbnN0cnVjdG9yKCl7dGhpcy5fb3B0aW9ucz17fSxfQy5mb3JFYWNoKHQ9PntsZXQgbj10Lm5hbWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsbix7Z2V0OigpPT57bGV0IHI9dC5jYWNoZT90aGlzLl9vcHRpb25zOmdDKCk7cmV0dXJuIG4gaW4gcj9yW25dOnQuZGVmYXVsdH0sc2V0OnQucmVhZG9ubHk/dm9pZCAwOnI9Pnt0aGlzLl9vcHRpb25zW25dPXIsUWgodGhpcy5fb3B0aW9ucyxuKX19KX0pLG1DKCl9cGxheSgpe3RoaXMuX29wZXJhdGUoInBsYXkiKX1wYXVzZSgpe3RoaXMuX29wZXJhdGUoInBhdXNlIil9c3RvcCgpe3RoaXMuX29wZXJhdGUoInN0b3AiKX1zZWVrKHQpe3RoaXMuX29wZXJhdGUoInNlZWsiLHtjdXJyZW50VGltZTp0fSl9X29wZXJhdGUodCxuKXt2QyhZLmV4dGVuZCh7fSxuLHtvcGVyYXRpb25UeXBlOnR9KSl9fWxldCB0ZyxiQz1NdChjYiwoKT0+dGd8fCh0Zz1uZXcgZWcpKTtjbGFzcyBFQ3tjb25zdHJ1Y3Rvcih0LG4pe3RoaXMuaWQ9dCx0aGlzLmN0eD1ufXN0YXJ0KHQpe3JldHVybiBIdCh0aGlzLmN0eCwic3RhcnQiLHQpfXN0b3AodCl7cmV0dXJuIEh0KHRoaXMuY3R4LCJzdG9wIix0KX1wYXVzZSh0KXtyZXR1cm4gSHQodGhpcy5jdHgsInBhdXNlIix0KX1yZXN1bWUodCl7cmV0dXJuIEh0KHRoaXMuY3R4LCJyZXN1bWUiLHQpfXN3aXRjaENhbWVyYSh0KXtyZXR1cm4gSHQodGhpcy5jdHgsInN3aXRjaENhbWVyYSIsdCl9c25hcHNob3QodCl7cmV0dXJuIEh0KHRoaXMuY3R4LCJzbmFwc2hvdCIsdCl9dG9nZ2xlVG9yY2godCl7cmV0dXJuIEh0KHRoaXMuY3R4LCJ0b2dnbGVUb3JjaCIsdCl9cGxheUJHTSh0KXtyZXR1cm4gTG4odGhpcy5jdHgsInBsYXlCR00iLHQpfXN0b3BCR00odCl7cmV0dXJuIEh0KHRoaXMuY3R4LCJzdG9wQkdNIix0KX1wYXVzZUJHTSh0KXtyZXR1cm4gSHQodGhpcy5jdHgsInBhdXNlQkdNIix0KX1yZXN1bWVCR00odCl7cmV0dXJuIEh0KHRoaXMuY3R4LCJyZXN1bWVCR00iLHQpfXNldEJHTVZvbHVtZSh0KXtyZXR1cm4gTG4odGhpcy5jdHgsInNldEJHTVZvbHVtZSIsdCl9c3RhcnRQcmV2aWV3KHQpe3JldHVybiBIdCh0aGlzLmN0eCwic3RhcnRQcmV2aWV3Iix0KX1zdG9wUHJldmlldyh0KXtyZXR1cm4gSHQodGhpcy5jdHgsInN0b3BQcmV2aWV3Iix0KX19ZnVuY3Rpb24geXMoZSx0LG4scil7c3QuaW52b2tlVmlld01ldGhvZCgibGl2ZXB1c2hlci4iK2Use2xpdmVQdXNoZXJJZDplLHR5cGU6bixkYXRhOnJ9LHQpfWNsYXNzIHlDe2NvbnN0cnVjdG9yKHQsbil7dGhpcy5pZD10LHRoaXMucGFnZUlkPW59c3RhcnQoKXt5cyh0aGlzLmlkLHRoaXMucGFnZUlkLCJzdGFydCIpfXN0b3AoKXt5cyh0aGlzLmlkLHRoaXMucGFnZUlkLCJzdG9wIil9cGF1c2UoKXt5cyh0aGlzLmlkLHRoaXMucGFnZUlkLCJwYXVzZSIpfXJlc3VtZSgpe3lzKHRoaXMuaWQsdGhpcy5wYWdlSWQsInJlc3VtZSIpfXN3aXRjaENhbWVyYSgpe3lzKHRoaXMuaWQsdGhpcy5wYWdlSWQsInN3aXRjaENhbWVyYSIpfXN0YXJ0UHJldmlldygpe3lzKHRoaXMuaWQsdGhpcy5wYWdlSWQsInByZXZpZXciKX1zdG9wUHJldmlldygpe3lzKHRoaXMuaWQsdGhpcy5wYWdlSWQsInN0b3AiKX1zbmFwc2hvdCgpe3lzKHRoaXMuaWQsdGhpcy5wYWdlSWQsInNuYXBzaG90Iil9fWxldCB3Qz1NdChHbSwoZSx0KT0+e2lmKHQuJHBhZ2UubWV0YS5pc05WdWUpe2lmKCF0KXJldHVybiBjb25zb2xlLndhcm4oInVuaS5jcmVhdGVMaXZlUHVzaGVyQ29udGV4dDogMiBhcmd1bWVudHMgcmVxdWlyZWQsIGJ1dCBvbmx5IDEgcHJlc2VudCIpO2xldCBuPW1pKGUsdCk7cmV0dXJuIG4/bmV3IEVDKGUsbik6Y29uc29sZS53YXJuKCJDYW4gbm90IGZpbmQgYCIrZSsiYCIpfXJldHVybiBuZXcgeUMoZSx0LiRwYWdlLmlkKX0sWW0pLEVpPTMuMTQxNTkyNjUzNTg5NzkzLEZjPTYzNzgyNDUsVmM9LjAwNjY5MzQyMTYyMjk2NTk0MztmdW5jdGlvbiBTQyhlLHQpe2lmKHQ9K3QsZT0rZSxuZyhlLHQpKXJldHVybltlLHRdO2xldCBuPXJnKGUtMTA1LHQtMzUpLHI9aWcoZS0xMDUsdC0zNSksYT10LzE4MCpFaSx1PU1hdGguc2luKGEpO3U9MS1WYyp1KnU7bGV0IGg9TWF0aC5zcXJ0KHUpO249bioxODAvKEZjKigxLVZjKS8odSpoKSpFaSkscj1yKjE4MC8oRmMvaCpNYXRoLmNvcyhhKSpFaSk7bGV0IGI9dCtuLFU9ZStyO3JldHVybltlKjItVSx0KjItYl19ZnVuY3Rpb24gQUMoZSx0KXtpZih0PSt0LGU9K2UsbmcoZSx0KSlyZXR1cm5bZSx0XTtsZXQgbj1yZyhlLTEwNSx0LTM1KSxyPWlnKGUtMTA1LHQtMzUpLGE9dC8xODAqRWksdT1NYXRoLnNpbihhKTt1PTEtVmMqdSp1O2xldCBoPU1hdGguc3FydCh1KTtuPW4qMTgwLyhGYyooMS1WYykvKHUqaCkqRWkpLHI9cioxODAvKEZjL2gqTWF0aC5jb3MoYSkqRWkpO2xldCBiPXQrbjtyZXR1cm5bZStyLGJdfWxldCBuZz1mdW5jdGlvbihlLHQpe3JldHVybiBlPDcyLjAwNHx8ZT4xMzcuODM0N3x8dDwuODI5M3x8dD41NS44MjcxfHwhMX0scmc9ZnVuY3Rpb24oZSx0KXtsZXQgbj0tMTAwKzIqZSszKnQrLjIqdCp0Ky4xKmUqdCsuMipNYXRoLnNxcnQoTWF0aC5hYnMoZSkpO3JldHVybiBuKz0oMjAqTWF0aC5zaW4oNiplKkVpKSsyMCpNYXRoLnNpbigyKmUqRWkpKSoyLzMsbis9KDIwKk1hdGguc2luKHQqRWkpKzQwKk1hdGguc2luKHQvMypFaSkpKjIvMyxuKz0oMTYwKk1hdGguc2luKHQvMTIqRWkpKzMyMCpNYXRoLnNpbih0KkVpLzMwKSkqMi8zLG59LGlnPWZ1bmN0aW9uKGUsdCl7bGV0IG49MzAwK2UrMip0Ky4xKmUqZSsuMSplKnQrLjEqTWF0aC5zcXJ0KE1hdGguYWJzKGUpKTtyZXR1cm4gbis9KDIwKk1hdGguc2luKDYqZSpFaSkrMjAqTWF0aC5zaW4oMiplKkVpKSkqMi8zLG4rPSgyMCpNYXRoLnNpbihlKkVpKSs0MCpNYXRoLnNpbihlLzMqRWkpKSoyLzMsbis9KDE1MCpNYXRoLnNpbihlLzEyKkVpKSszMDAqTWF0aC5zaW4oZS8zMCpFaSkpKjIvMyxufTtmdW5jdGlvbiBvZyhlLHQsbil7bGV0IHI9dC5jb29yZHM7aWYoZSE9PXQuY29vcmRzVHlwZSl7bGV0IGE7ZT09PSJ3Z3M4NCI/YT1TQyhyLmxvbmdpdHVkZSxyLmxhdGl0dWRlKTplPT09ImdjajAyIiYmKGE9QUMoci5sb25naXR1ZGUsci5sYXRpdHVkZSkpLGEmJihyLmxvbmdpdHVkZT1hWzBdLHIubGF0aXR1ZGU9YVsxXSl9bih7dHlwZTplLGFsdGl0dWRlOnIuYWx0aXR1ZGV8fDAsbGF0aXR1ZGU6ci5sYXRpdHVkZSxsb25naXR1ZGU6ci5sb25naXR1ZGUsc3BlZWQ6ci5zcGVlZCxhY2N1cmFjeTpyLmFjY3VyYWN5LGFkZHJlc3M6dC5hZGRyZXNzLGVyck1zZzoiZ2V0TG9jYXRpb246b2sifSl9bGV0IENDPXllKFcwLCh7dHlwZTplPSJ3Z3M4NCIsZ2VvY29kZTp0PSExLGFsdGl0dWRlOm49ITEsaGlnaEFjY3VyYWN5RXhwaXJlVGltZTpyLGlzSGlnaEFjY3VyYWN5OmE9ITF9LHtyZXNvbHZlOnUscmVqZWN0Omh9KT0+e2wuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKGI9PntvZyhlLGIsdSl9LGI9PntpZihiLmNvZGU9PT0xNTAxKXtvZyhlLGIsdSk7cmV0dXJufWgoImdldExvY2F0aW9uOmZhaWwgIitiLm1lc3NhZ2UpfSx7Z2VvY29kZTp0LGVuYWJsZUhpZ2hBY2N1cmFjeTphfHxuLHRpbWVvdXQ6cixjb29yZHNUeXBlOmV9KX0sWTAsRzApLE9DPXllKGowLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCBhPUloKCkhPT0ibGlnaHQiLHUsaD1yaSh7dXJsOiJfX3VuaWFwcGNob29zZWxvY2F0aW9uIixkYXRhOlkuZXh0ZW5kKHt9LGUse2xvY2FsZTpRbCgpfSksc3R5bGU6e2FuaW1hdGlvblR5cGU6ZS5hbmltYXRpb25UeXBlfHwic2xpZGUtaW4tYm90dG9tIix0aXRsZU5WaWV3OiExLHBvcEdlc3R1cmU6ImNsb3NlIixzY3JvbGxJbmRpY2F0b3I6Im5vbmUifSxvbk1lc3NhZ2Uoe2V2ZW50OmIsZGV0YWlsOlV9KXtiPT09InNlbGVjdGVkIiYmKHU9VSl9LG9uQ2xvc2UoKXthJiZsLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgiZGFyayIpLHU/dCh1KTpuKCJjYW5jZWwiKX19KTthJiYobC5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImxpZ2h0IiksaC53ZWJ2aWV3LmFkZEV2ZW50TGlzdGVuZXIoInBvcEdlc3R1cmUiLCh7dHlwZTpiLHJlc3VsdDpVfSk9PntiPT09InN0YXJ0Ij9sLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgiZGFyayIpOmI9PT0iZW5kIiYmIVUmJmwubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJsaWdodCIpfSkpfSx6MCksVEM9eWUocTAsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT4ocmkoe3VybDoiX191bmlhcHBvcGVubG9jYXRpb24iLGRhdGE6WS5leHRlbmQoe30sZSx7bG9jYWxlOlFsKCl9KSxzdHlsZTp7dGl0bGVOVmlldzp7dHlwZToidHJhbnNwYXJlbnQifSxwb3BHZXN0dXJlOiJjbG9zZSIsYmFja0J1dHRvbkF1dG9Db250cm9sOiJjbG9zZSJ9LG9uQ2xvc2UoKXtuKCJjYW5jZWwiKX19KSx0KCkpLEowLEswKSxQQz15ZShSeSwoe3RpdGxlOmU9IiIsY29udGVudDp0PSIiLHNob3dDYW5jZWw6bj0hMCxjYW5jZWxUZXh0OnIsY2FuY2VsQ29sb3I6YSxjb25maXJtVGV4dDp1LGNvbmZpcm1Db2xvcjpoLGVkaXRhYmxlOmI9ITEscGxhY2Vob2xkZXJUZXh0OlU9IiJ9PXt9LHtyZXNvbHZlOk99KT0+e2xldCBEPW4/W3IsdV06W3VdLGdlPWI/VTpEO3Q9dHx8IiAiLGwubmF0aXZlVUlbYj8icHJvbXB0IjoiY29uZmlybSJdKHQsd2U9PntpZihuKXtsZXQga2U9d2UuaW5kZXg9PT0xLEV0PXtjb25maXJtOmtlLGNhbmNlbDp3ZS5pbmRleD09PTB8fHdlLmluZGV4PT09LTF9O2tlJiZiJiYoRXQuY29udGVudD13ZS52YWx1ZSksTyhFdCl9ZWxzZXtsZXQga2U9e2NvbmZpcm06d2UuaW5kZXg9PT0wLGNhbmNlbDohMX07YiYmKGtlLmNvbnRlbnQ9d2UudmFsdWUpLE8oa2UpfX0sZSxnZSxEKX0seHksQnkpLElDPXllKE95LCh7aXRlbUxpc3Q6ZT1bXSxpdGVtQ29sb3I6dD0iIzAwMDAwMCIsdGl0bGU6bj0iIixwb3BvdmVyOnJ9LHtyZXNvbHZlOmEscmVqZWN0OnV9KT0+e01uKCk7bGV0e3Q6aH09WCgpLGI9e3RpdGxlOm4sY2FuY2VsOmgoInVuaS5zaG93QWN0aW9uU2hlZXQuY2FuY2VsIiksYnV0dG9uczplLm1hcChVPT4oe3RpdGxlOlUsY29sb3I6dH0pKX07bC5uYXRpdmVVSS5hY3Rpb25TaGVldChZLmV4dGVuZChiLHtwb3BvdmVyOnJ9KSxVPT57VS5pbmRleD4wP2Eoe3RhcEluZGV4OlUuaW5kZXgtMX0pOnUoInNob3dBY3Rpb25TaGVldDpmYWlsIGNhbmNlbCIpfSl9LFR5LFB5KSxsYyxadT0hMSwkYz0iIixVYyxOQz15ZShJeSwoZSx0KT0+YWcoWS5leHRlbmQoe30sZSx7dHlwZToibG9hZGluZyIsaWNvbjoibG9hZGluZyJ9KSx0KSxOeSxreSksYWc9KHt0aXRsZTplPSIiLGljb246dD0ic3VjY2VzcyIsaW1hZ2U6bj0iIixkdXJhdGlvbjpyPTE1MDAsbWFzazphPSExLHBvc2l0aW9uOnUsdHlwZTpoPSJ0b2FzdCIsc3R5bGU6Yn0se3Jlc29sdmU6VSxyZWplY3Q6T30pPT57aWYoSGMoIiIpLCRjPWgsWyJ0b3AiLCJjZW50ZXIiLCJib3R0b20iXS5pbmNsdWRlcyhTdHJpbmcodSkpKWwubmF0aXZlVUkudG9hc3QoZSx7dmVydGljYWxBbGlnbjp1fSksWnU9ITA7ZWxzZXt0JiYhflsic3VjY2VzcyIsImxvYWRpbmciLCJlcnJvciIsIm5vbmUiXS5pbmRleE9mKHQpJiYodD0ic3VjY2VzcyIpO2xldCBEPXttb2RhbDphLGJhY2s6InRyYW5zbWl0IixwYWRkaW5nOiIxMHB4IixzaXplOiIxNnB4In07IW4mJighdHx8dD09PSJub25lIik/RC5sb2FkaW5nPXtkaXNwbGF5OiJub25lIn06KEQud2lkdGg9IjE0MHB4IixELmhlaWdodD0iMTEycHgiKSxuP0QubG9hZGluZz17ZGlzcGxheToiYmxvY2siLGhlaWdodDoiNTVweCIsaWNvbjpuLGludGVydmFsOnJ9Olsic3VjY2VzcyIsImVycm9yIl0uaW5kZXhPZih0KSE9PS0xJiYoRC5sb2FkaW5nPXtkaXNwbGF5OiJibG9jayIsaGVpZ2h0OiI1NXB4IixpY29uOnQ9PT0ic3VjY2VzcyI/Il9fdW5pYXBwc3VjY2Vzcy5wbmciOiJfX3VuaWFwcGVycm9yLnBuZyIsaW50ZXJ2YWw6cn0pO3RyeXtsYz1sLm5hdGl2ZVVJLnNob3dXYWl0aW5nKGUsWS5leHRlbmQoRCxiKSl9Y2F0Y2goZ2Upe08oYCR7Z2V9YCl9fXJldHVybiAkYz09PSJ0b2FzdCImJihVYz1rKCgpPT57SGMoIiIpfSxyKSksVSgpfSxrQz15ZShNeSxhZyxEeSxGeSksUkM9eWUoZ3ksKGUsdCk9PkhjKCJ0b2FzdCIsdCkpLHhDPXllKGh5LChlLHQpPT5IYygibG9hZGluZyIsdCkpO2Z1bmN0aW9uIEhjKGU9InRvYXN0Iix0KXtyZXR1cm4gZSYmZSE9PSRjfHwoVWMmJihTKFVjKSxVYz1udWxsKSxadT9sLm5hdGl2ZVVJLmNsb3NlVG9hc3QoKTpsYyYmbGMuY2xvc2UmJmxjLmNsb3NlKCksbGM9bnVsbCxadT0hMSwkYz0iIiksdCYmdC5yZXNvbHZlKCl9bGV0IEJDPXllKFZ5LChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPVBoKCk7aWYociYmci5lbmRQdWxsVG9SZWZyZXNoKCkscj1CYygpLCFyKXJldHVybiBuKCk7ci5iZWdpblB1bGxUb1JlZnJlc2goKSxVdShyKSx0KCl9KSxNQz15ZSgkeSwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1QaCgpfHxCYygpO2lmKCFyKXJldHVybiBuKCk7ci5lbmRQdWxsVG9SZWZyZXNoKCksVXUobnVsbCksdCgpfSksTEM9eWUoYmgsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9ZnIoTHIoKSk7c3QuaW52b2tlVmlld01ldGhvZChiaCxlLHIsYT0+e2E/bihhKTp0KCl9KX0scHkpLERDPXllKEVoLChlLHtyZXNvbHZlOnR9KT0+e2xldCBuPWZyKExyKCkpO3N0Lmludm9rZVZpZXdNZXRob2QoRWgsZSxuLHQpfSxBeSxDeSksRkM9eWUoRXksKHtfX3BhZ2VfXzplLHRpdGxlOnR9LHtyZXNvbHZlOm4scmVqZWN0OnJ9KT0+e2xldCBhPU9oKGUpO2lmKGEpe2xldCB1PWEuZ2V0U3R5bGUoKTt1JiZ1LnRpdGxlTlZpZXcmJmEuc2V0U3R5bGUoe3RpdGxlTlZpZXc6e3RpdGxlVGV4dDp0fX0pLG4oKX1lbHNlIHIoKX0seXkpLFZDPXllKHd5LChlLHtyZXNvbHZlOnR9KT0+e2wubmF0aXZlVUkuc2hvd1dhaXRpbmcoIiIse21vZGFsOiExfSksdCgpfSksJEM9eWUoU3ksKGUse3Jlc29sdmU6dH0pPT57bC5uYXRpdmVVSS5jbG9zZVdhaXRpbmcoKSx0KCl9KTtmdW5jdGlvbiBVQyhlKXtsZXQgdD1WbigpOyF0Lmxlbmd0aHx8KHRbdC5sZW5ndGgtMV0uJHBhZ2Uuc3RhdHVzQmFyU3R5bGU9ZSl9bGV0IEhDPXllKG15LCh7X19wYWdlX186ZSxmcm9udENvbG9yOnQsYmFja2dyb3VuZENvbG9yOm59LHtyZXNvbHZlOnIscmVqZWN0OmF9KT0+e2xldCB1PU9oKGUpO2lmKHUpe2xldCBoPXt9O3QmJihoLnRpdGxlQ29sb3I9dCksbiYmKGguYmFja2dyb3VuZENvbG9yPW4pO2xldCBiPXQ9PT0iIzAwMDAwMCI/ImRhcmsiOiJsaWdodCI7bC5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoYiksVUMoYik7bGV0IFU9dS5nZXRTdHlsZSgpO1UmJlUudGl0bGVOVmlldyYmKFUudGl0bGVOVmlldy5hdXRvQmFja0J1dHRvbiYmKGguYmFja0J1dHRvbj1oLmJhY2tCdXR0b258fHt9LGguYmFja0J1dHRvbi5jb2xvcj10KSx1LnNldFN0eWxlKHt0aXRsZU5WaWV3Omh9KSkscigpfWVsc2UgYSgpfSxieSxfeSksakM9eWUoYXcsKHtpbmRleDplLHRleHQ6dH0se3Jlc29sdmU6bixyZWplY3Q6cn0pPT57bGkuc2V0VGFiQmFyQmFkZ2UoInRleHQiLGUsdCksbigpfSxzdyxsdyksekM9eWUoVXksKHtpbmRleDplLHRleHQ6dCxpY29uUGF0aDpuLHNlbGVjdGVkSWNvblBhdGg6cixwYWdlUGF0aDphLHZpc2libGU6dSxpY29uZm9udDpofSx7cmVzb2x2ZTpifSk9PntpZihsaS5zZXRUYWJCYXJJdGVtKGUsdCxuLHIsdSxoKSxhKXtsZXQgVT1ULnRhYkJhci5saXN0W2VdO2lmKFUpe2xldCBPPVUucGFnZVBhdGgsRD10ZS5yZW1vdmVMZWFkaW5nU2xhc2goYSk7RCE9PU8mJkxhKGUsTyxEKX19YigpfSxIeSxqeSksV0M9eWUoenksKGU9e30se3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57aWYoIWljKCkpcmV0dXJuIG4oIm5vdCBUYWJCYXIgcGFnZSIpO2xldCByPXtibGFjazoicmdiYSgwLDAsMCwwLjQpIix3aGl0ZToicmdiYSgyNTUsMjU1LDI1NSwwLjQpIn0sYT1lLmJvcmRlclN0eWxlO2EmJmEgaW4gciYmKGUuYm9yZGVyU3R5bGU9clthXSksbGkuc2V0VGFiQmFyU3R5bGUoZSksdCgpfSxXeSxZeSksR0M9eWUocXksKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9ZSYmZS5hbmltYXRpb247aWYoIWljKCkpcmV0dXJuIG4oIm5vdCBUYWJCYXIgcGFnZSIpO2xpLmhpZGVUYWJCYXIoQm9vbGVhbihyKSksdCgpfSx5aCksWUM9eWUoS3ksKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9ZSYmZS5hbmltYXRpb247aWYoIWljKCkpcmV0dXJuIG4oIm5vdCBUYWJCYXIgcGFnZSIpO2xpLnNob3dUYWJCYXIoQm9vbGVhbihyKSksdCgpfSxKeSkscUM9eWUoZXcsKHtpbmRleDplfSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsaS5zZXRUYWJCYXJCYWRnZSgicmVkRG90IixlKSx0KCl9LHR3LG53KSxzZz1lPT5saS5zZXRUYWJCYXJCYWRnZSgibm9uZSIsZSksS0M9eWUocncsKHtpbmRleDplfSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntzZyhlKSx0KCl9LGl3LG93KSxKQz15ZShaeSwoe2luZGV4OmV9LHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e3NnKGUpLHQoKX0sWHksUXkpLGxnPSJ2ZFN5bmMiLFpDPSJfX3VuaWFwcF9fc2VydmljZSIsTWw9Im9uV2Vidmlld1JlYWR5IixYQz0wLFFDPSJ3ZWJ2aWV3SW5zZXJ0ZWQiLGVPPSJ3ZWJ2aWV3UmVtb3ZlZCIsY2c9IlVuaUFwcFN1Yk5WdWUiO2NsYXNzIHRPe2NvbnN0cnVjdG9yKHQsbil7dGhpcy5jYWxsYmFja3M9W107bGV0IHI9dGhpcy53ZWJ2aWV3PWwud2Vidmlldy5nZXRXZWJ2aWV3QnlJZCh0KTtpZih0aGlzLmlzU3ViPW58fCExLHIuX191bmlhcHBfbWFza19pZCl7bGV0IGE9dGhpcy5tYXNrV2Vidmlldz1yLl9fdW5pYXBwX21hc2tfaWQ9PT0iMCI/e3NldFN0eWxlKHttYXNrOmh9KXtIbygidW5pLXRhYnZpZXciKS5zZXRNYXNrKHtjb2xvcjpofSl9fTpsLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQoci5fX3VuaWFwcF9tYXNrX2lkKSx1PWZ1bmN0aW9uKCl7YS5zZXRTdHlsZSh7bWFzazoibm9uZSJ9KX07ci5hZGRFdmVudExpc3RlbmVyKCJoaWRlIix1KSxyLmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIix1KX19c2hvdyguLi50KXtpZih0aGlzLm1hc2tXZWJ2aWV3KXtsZXQgbj10aGlzLndlYnZpZXcuX191bmlhcHBfbWFzazt0aGlzLm1hc2tXZWJ2aWV3LnNldFN0eWxlKHttYXNrOm59KX10aGlzLndlYnZpZXcuc2hvdyguLi50KX1oaWRlKC4uLnQpe3RoaXMud2Vidmlldy5oaWRlKC4uLnQpfXNldFN0eWxlKHQpe3RoaXMud2Vidmlldy5zZXRTdHlsZSh0KX1pbml0TWVzc2FnZSgpe2lmKHRoaXMubWVzc2FnZVJlYWR5KXJldHVybjt0aGlzLm1lc3NhZ2VSZWFkeT0hMDtsZXQgdD1yPT57aWYoci5kYXRhJiZyLmRhdGEudHlwZT09PWNnKXtsZXQgYT1yLmRhdGEudGFyZ2V0O2EuaWQ9PT10aGlzLndlYnZpZXcuaWQmJmEuaXNTdWI9PT10aGlzLmlzU3ViJiZ0aGlzLmNhbGxiYWNrcy5mb3JFYWNoKHU9Pnt1KHtvcmlnaW46dGhpcy53ZWJ2aWV3Ll9fdW5pYXBwX2hvc3QsZGF0YTpyLmRhdGEuZGF0YX0pfSl9fTtIbygiZ2xvYmFsRXZlbnQiKS5hZGRFdmVudExpc3RlbmVyKCJwbHVzTWVzc2FnZSIsdCksdGhpcy53ZWJ2aWV3LmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIiwoKT0+e3RoaXMuY2FsbGJhY2tzLmxlbmd0aD0wfSl9cG9zdE1lc3NhZ2UodCl7bC53ZWJ2aWV3LnBvc3RNZXNzYWdlVG9VbmlOVmlldyh7dHlwZTpjZyxkYXRhOnQsdGFyZ2V0OntpZDp0aGlzLndlYnZpZXcuaWQsaXNTdWI6IXRoaXMuaXNTdWJ9fSxaQyl9b25NZXNzYWdlKHQpe3RoaXMuaW5pdE1lc3NhZ2UoKSx0aGlzLmNhbGxiYWNrcy5wdXNoKHQpfX1sZXQgbk89ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbmV3IHRPKGUsdCl9LGNjLHVnPWwubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlO2Z1bmN0aW9uIHJPKGUpe3VnPWV9ZnVuY3Rpb24gZmcoZSl7Y2M9ZSx1ZyhlKX1sLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZT1mZztmdW5jdGlvbiBaYShlKXtpZighZSl7bGV0IHQ9X3IoKTtpZighdHx8KGU9dC4kcGFnZS5zdGF0dXNCYXJTdHlsZSwhZXx8ZT09PWNjKSlyZXR1cm59ZSE9PWNjJiYoY2M9ZSxsLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZShlKSl9ZnVuY3Rpb24gaU8oZSx0LG4scixhLHUsaCl7bCE9PW4mJihBPUVuPWUsZz10LGw9bixyTyhsLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSksbC5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGU9Zmcsaz1yLFM9YSxOPXUsZj1oKSxULnNlcnZpY2VSZWFkeT0hMH1mdW5jdGlvbiBvTygpe2xldCBlPVsiQXJyYXlCdWZmZXIiLCJJbnQ4QXJyYXkiLCJVaW50OEFycmF5IiwiVWludDhDbGFtcGVkQXJyYXkiLCJJbnQxNkFycmF5IiwiVWludDE2QXJyYXkiLCJJbnQzMkFycmF5IiwiVWludDMyQXJyYXkiLCJGbG9hdDMyQXJyYXkiLCJGbG9hdDY0QXJyYXkiLCJCaWdJbnQ2NEFycmF5IiwiQmlnVWludDY0QXJyYXkiXSx0PXt9O2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtsZXQgcj1lW25dO3Rbcl09Z2xvYmFsW3JdfXJldHVybiB0fWxldCBkZz17b2F1dGgoZSl7bC5vYXV0aC5nZXRTZXJ2aWNlcyh0PT57dD10O2xldCBuPVtdO3QuZm9yRWFjaCgoe2lkOnJ9KT0+e24ucHVzaChyKX0pLGUobnVsbCxuLHQpfSx0PT57dD10LGUodCl9KX0sc2hhcmUoZSl7bC5zaGFyZS5nZXRTZXJ2aWNlcyh0PT57dD10O2xldCBuPVtdO3QuZm9yRWFjaCgoe2lkOnJ9KT0+e24ucHVzaChyKX0pLGUobnVsbCxuLHQpfSx0PT57ZSh0KX0pfSxwYXltZW50KGUpe2wucGF5bWVudC5nZXRDaGFubmVscyh0PT57bGV0IG49W107dC5mb3JFYWNoKCh7aWQ6cn0pPT57bi5wdXNoKHIpfSksZShudWxsLG4sdCl9LHQ9PntlKHQpfSl9LHB1c2goZSl7aWYodHlwZW9mIGchPSJ1bmRlZmluZWQifHx0eXBlb2YgbCE9InVuZGVmaW5lZCIpe2xldCB0PWwucHVzaC5nZXRDbGllbnRJbmZvKCk7ZShudWxsLFt0LmlkXSxbdF0pfWVsc2UgZShudWxsLFtdKX19LGFPPXllKGN3LCh7c2VydmljZTplfSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntkZ1tlXT9kZ1tlXSgocixhPVtdLHU9W10pPT57cj9uKHIubWVzc2FnZSk6dCh7c2VydmljZTplLHByb3ZpZGVyOmEscHJvdmlkZXJzOnUubWFwKGg9Pih0eXBlb2YgaC5zZXJ2aWNlUmVhZHk9PSJib29sZWFuIiYmKGguaXNBcHBFeGlzdD1oLnNlcnZpY2VSZWFkeSksdHlwZW9mIGgubmF0aXZlQ2xpZW50PT0iYm9vbGVhbiImJihoLmlzQXBwRXhpc3Q9aC5uYXRpdmVDbGllbnQpLGgpKX0pfSk6bigic2VydmljZSBub3QgZm91bmQiKX0sdXcpLGpjO2Z1bmN0aW9uIHVjKGUpe3JldHVybiBuZXcgUHJvbWlzZSgodCxuKT0+e2wub2F1dGguZ2V0U2VydmljZXMocj0+e2xldCBhPXIuZmluZCgoe2lkOnV9KT0+dT09PWUpO2E/dChhKTpuKG5ldyBFcnJvcigicHJvdmlkZXIgbm90IGZpbmQiKSl9LG4pfSl9bGV0IGhnPXllKGZ3LChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPWUucHJvdmlkZXJ8fCJ3ZWl4aW4iLGE9YXIobiksdT1yPT09ImFwcGxlIixoPXU/e3Njb3BlOiJlbWFpbCJ9OmUudW5pdmVyaWZ5U3R5bGU/e3VuaXZlcmlmeVN0eWxlOmNPKGUudW5pdmVyaWZ5U3R5bGUsYSl9Ont9O3VjKHIpLnRoZW4oYj0+e2Z1bmN0aW9uIFUoKXtpZihlLm9ubHlBdXRob3JpemUmJnI9PT0id2VpeGluIil7Yi5hdXRob3JpemUoKHtjb2RlOk99KT0+e3Qoe2NvZGU6TyxhdXRoUmVzdWx0OiIifSl9LGEpO3JldHVybn1iLmxvZ2luKE89PntsZXQgRD1PLnRhcmdldC5hdXRoUmVzdWx0LGdlPU8udGFyZ2V0LmFwcGxlSW5mbzt0KHtjb2RlOkQuY29kZSxhdXRoUmVzdWx0OkQsYXBwbGVJbmZvOmdlfSl9LGEsaCl9dXx8cj09PSJ1bml2ZXJpZnkiP1UoKTpiLmxvZ291dChVLFUpfSkuY2F0Y2goYSl9LGR3KSxnZz0oZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1lLnByb3ZpZGVyfHwid2VpeGluIixhPWFyKG4pO3VjKHIpLnRoZW4odT0+e3UuZ2V0VXNlckluZm8oaD0+e2xldCBiPXtuaWNrTmFtZToiIn07aWYocj09PSJ3ZWl4aW4iKXtsZXQgTz11LnVzZXJJbmZvO08mJihiPXtvcGVuSWQ6Ty5vcGVuaWQsbmlja05hbWU6Ty5uaWNrbmFtZSxnZW5kZXI6Ty5zZXgsY2l0eTpPLmNpdHkscHJvdmluY2U6Ty5wcm92aW5jZSxjb3VudHJ5Ok8uY291bnRyeSxhdmF0YXJVcmw6Ty5oZWFkaW1ndXJsLHVuaW9uSWQ6Ty51bmlvbmlkfSl9ZWxzZSBpZihyPT09ImFwcGxlIil7bGV0IE89dS5hcHBsZUluZm87TyYmKGI9e29wZW5JZDpPLnVzZXIsZnVsbE5hbWU6Ty5mdWxsTmFtZSxlbWFpbDpPLmVtYWlsLGF1dGhvcml6YXRpb25Db2RlOk8uYXV0aG9yaXphdGlvbkNvZGUsaWRlbnRpdHlUb2tlbjpPLmlkZW50aXR5VG9rZW4scmVhbFVzZXJTdGF0dXM6Ty5yZWFsVXNlclN0YXR1c30pfWVsc2UgYj11LnVzZXJJbmZvLGImJihiLm9wZW5JZD1iLm9wZW5JZHx8Yi5vcGVuaWR8fHUuYXV0aFJlc3VsdC5vcGVuaWQsYi5uaWNrTmFtZT1iLm5pY2tOYW1lfHxiLm5pY2tuYW1lLGIuYXZhdGFyVXJsPWIuYXZhdGFyVXJsfHxiLmhlYWRpbWd1cmwpO2xldCBVPXt9O2UuZGF0YSYmZS5kYXRhLmFwaV9uYW1lPT09IndlYmFwaV9nZXR1c2VyaW5mbyI/VS5kYXRhPXtkYXRhOkpTT04uc3RyaW5naWZ5KGIpLHJhd0RhdGE6IiIsc2lnbmF0dXJlOiIiLGVuY3J5cHRlZERhdGE6IiIsaXY6IiJ9OlUudXNlckluZm89Yix0KFUpfSxhKX0pLmNhdGNoKCgpPT57bigiXHU4QkY3XHU1MTQ4XHU4QzAzXHU3NTI4IHVuaS5sb2dpbiIpfSl9LHNPPXllKGh3LGdnLGd3KSxsTz15ZShwdyxnZyx2dykscGc9eWUobXcsKHtwcm92aWRlcjplfSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1Zcyh0KSxhPWFyKG4pO3VjKGUpLnRoZW4odT0+dS5wcmVMb2dpbihyLGEpKS5jYXRjaChhKX0sRXcsYncpLHZnPSgpPT51YygidW5pdmVyaWZ5IikudGhlbihlPT5lLmNsb3NlQXV0aFZpZXcoKSksbWc9TXQoeXcsdmcpLF9nPXllKHd3LChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPVlzKHQpLGE9YXIobik7dHJ5e3VjKCJ1bml2ZXJpZnkiKS50aGVuKHU9PntsZXQgaD11LmdldENoZWNrQm94U3RhdGUoKTtyKHtzdGF0ZTpofSl9KX1jYXRjaCh1KXthKHUpfX0pO2Z1bmN0aW9uIGNPKGUsdCl7cmV0dXJuIFkuaXNQbGFpbk9iamVjdChlKSYmWS5pc1BsYWluT2JqZWN0KGUuYnV0dG9ucykmJlkudG9UeXBlU3RyaW5nKGUuYnV0dG9ucy5saXN0KT09PSJbb2JqZWN0IEFycmF5XSImJmUuYnV0dG9ucy5saXN0LmZvckVhY2goKG4scik9PntlLmJ1dHRvbnMubGlzdFtyXS5vbmNsaWNrPWZ1bmN0aW9uKCl7bGV0IGE9e2NvZGU6IjMwMDA4IixtZXNzYWdlOiJcdTc1MjhcdTYyMzdcdTcwQjlcdTUxRkJcdTRFODZcdTgxRUFcdTVCOUFcdTRFNDlcdTYzMDlcdTk0QUUiLGluZGV4OnIscHJvdmlkZXI6bi5wcm92aWRlcn07WS5pc1BsYWluT2JqZWN0KGpjKT9qYy5fdHJpZ2dlclVuaXZlcmlmeUJ1dHRvbnNDbGljayhhKTp2ZygpLnRoZW4oKCk9Pnt0KGEpfSl9fSksZX1jbGFzcyB1T3tjb25zdHJ1Y3Rvcigpe3RoaXMucHJvdmlkZXI9InVuaXZlcmlmeSIsdGhpcy5ldmVudE5hbWU9ImFwaS51bml2ZXJpZnlCdXR0b25zQ2xpY2sifWNsb3NlKCl7cmV0dXJuIG1nKCl9bG9naW4odCl7cmV0dXJuIGhnKHRoaXMuX2dldE9wdGlvbnModCkpfWdldENoZWNrQm94U3RhdGUodCl7cmV0dXJuIF9nKHQpfXByZUxvZ2luKHQpe3JldHVybiBwZyh0aGlzLl9nZXRPcHRpb25zKHQpKX1vbkJ1dHRvbnNDbGljayh0KXtzdC5vbih0aGlzLmV2ZW50TmFtZSx0KX1vZmZCdXR0b25zQ2xpY2sodCl7c3Qub2ZmKHRoaXMuZXZlbnROYW1lLHQpfV90cmlnZ2VyVW5pdmVyaWZ5QnV0dG9uc0NsaWNrKHQpe3N0LmVtaXQodGhpcy5ldmVudE5hbWUsdCl9X2dldE9wdGlvbnModD17fSl7cmV0dXJuIFkuZXh0ZW5kKHt9LHQse3Byb3ZpZGVyOnRoaXMucHJvdmlkZXJ9KX19bGV0IGZPPU10KFN3LCgpPT5qY3x8KGpjPW5ldyB1TykpLGRPPXllKFJ3LChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPUdoKCk7aWYoci5ub3RpZmljYXRpb25BdXRob3JpemVkIT09ImF1dGhvcml6ZWQiKXJldHVybiBuKCJub3RpZmljYXRpb25BdXRob3JpemVkOiAiK3Iubm90aWZpY2F0aW9uQXV0aG9yaXplZCk7bGV0IGE9WS5leHRlbmQoe30sZSk7ZGVsZXRlIGEuY29udGVudCxkZWxldGUgYS5wYXlsb2FkLGwucHVzaC5jcmVhdGVNZXNzYWdlKGUuY29udGVudCxlLnBheWxvYWQsYSksdCgpfSx2b2lkIDAseHcpLGhPPU10KCJyZWdpc3RlclJ1bnRpbWUiLGU9PntZLmV4dGVuZChqc1J1bnRpbWUsZSl9KSxnTz17MDp7bmFtZToid2ViIix0aXRsZToiXHU1NkZFXHU2NTg3In0sMTp7bmFtZToidGV4dCIsdGl0bGU6Ilx1N0VBRlx1NjU4N1x1NUI1NyJ9LDI6e25hbWU6ImltYWdlIix0aXRsZToiXHU3RUFGXHU1NkZFXHU3MjQ3In0sMzp7bmFtZToibXVzaWMiLHRpdGxlOiJcdTk3RjNcdTRFNTAifSw0OntuYW1lOiJ2aWRlbyIsdGl0bGU6Ilx1ODlDNlx1OTg5MSJ9LDU6e25hbWU6Im1pbmlQcm9ncmFtIix0aXRsZToiXHU1QzBGXHU3QTBCXHU1RThGIn19LHBPPWU9PntlLnR5cGU9ZS50eXBlfHwwO2xldHtwcm92aWRlcjp0LHR5cGU6bix0aXRsZTpyLHN1bW1hcnk6YSxocmVmOnUsaW1hZ2VVcmw6aCxtZWRpYVVybDpiLHNjZW5lOlUsbWluaVByb2dyYW06TyxvcGVuQ3VzdG9tZXJTZXJ2aWNlQ2hhdDpELGNvcnBpZDpnZSxjdXN0b21lclVybDp3ZX09ZTtZLmlzU3RyaW5nKGgpJiZoJiYoaD1wdChoKSk7bGV0IGtlPWdPW25dO2lmKGtlKXtsZXQgRXQ9e3Byb3ZpZGVyOnQsdHlwZTprZS5uYW1lLHRpdGxlOnIsY29udGVudDphLGhyZWY6dSxwaWN0dXJlczpbaF0sdGh1bWJzOmg/W2hdOnZvaWQgMCxtZWRpYTpiLG1pbmlQcm9ncmFtOk8sZXh0cmE6e3NjZW5lOlV9LG9wZW5DdXN0b21lclNlcnZpY2VDaGF0OkQsY29ycGlkOmdlLHVybDp3ZX07cmV0dXJuIHQ9PT0id2VpeGluIiYmKG49PT0xfHxuPT09MikmJmRlbGV0ZSBFdC50aHVtYnMsRXR9cmV0dXJuIlx1NTIwNlx1NEVBQlx1NTNDMlx1NjU3MCB0eXBlIFx1NEUwRFx1NkI2M1x1Nzg2RSJ9LGJnPWZ1bmN0aW9uKGUsdCxuLHIsYT0ic2hhcmUiKXtsZXQgdT1hcihyKSxoPXQub3BlbkN1c3RvbWVyU2VydmljZUNoYXQ/Im9wZW5DdXN0b21lclNlcnZpY2VDaGF0Ijoic2VuZCI7dHJ5e2VbaF0odCwoKT0+e24oKX0sdSl9Y2F0Y2goYil7dSh7bWVzc2FnZTpgJHt0LnByb3ZpZGVyfSAke2h9IFx1NjVCOVx1NkNENVx1OEMwM1x1NzUyOFx1NTkzMVx1OEQyNWB9KX19LHZPPXllKEF3LChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPXBPKGUpLGE9YXIobik7aWYoWS5pc1N0cmluZyhyKSlyZXR1cm4gbihyKTtsLnNoYXJlLmdldFNlcnZpY2VzKHU9PntsZXQgaD11LmZpbmQoKHtpZDpifSk9PmI9PT1yLnByb3ZpZGVyKTtoP2guYXV0aGVudGljYXRlZD9iZyhoLHIsdCxuKTpoLmF1dGhvcml6ZSgoKT0+YmcoaCxyLHQsbiksYSk6bigic2VydmljZSBub3QgZm91bmQiKX0sYSl9LE93LEN3KSxtTz15ZShUdywoe3R5cGU6ZSxpbWFnZVVybDp0LHN1bW1hcnk6bixocmVmOnJ9LHtyZXNvbHZlOmEscmVqZWN0OnV9KT0+e2xldCBoPWFyKHUpO1kuaXNTdHJpbmcodCkmJnQmJih0PXB0KHQpKSxsLnNoYXJlLnNlbmRXaXRoU3lzdGVtKHt0eXBlOmUscGljdHVyZXM6dD9bdF06dm9pZCAwLGNvbnRlbnQ6bixocmVmOnJ9LCgpPT5hKCksaCl9LEl3LFB3KSxfTz15ZShOdywoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1lLnByb3ZpZGVyLGE9YXIobik7bC5wYXltZW50LmdldENoYW5uZWxzKHU9PntsZXQgaD11LmZpbmQoKHtpZDpifSk9PmI9PT1yKTtoP2wucGF5bWVudC5yZXF1ZXN0KGgsZS5vcmRlckluZm8sYj0+e3QoYil9LGEpOm4oInNlcnZpY2Ugbm90IGZvdW5kIil9LGEpfSxrdyksRWc9RmgsYk89eWUoIm5hdmlnYXRlVG9NaW5pUHJvZ3JhbSIsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57RWcoIm5hdmlnYXRlVG9VbmlNUCIsZSxyPT57aWYoci5lcnJNc2cmJnIuZXJyTXNnLmluZGV4T2YoIjpvayIpPT09LTEpcmV0dXJuIG4oci5lcnJNc2cuc3BsaXQoIiAiKVsxXSk7dCgpfSl9KSx5Zz1bXTtmdW5jdGlvbiB3ZyhlKXt5Zy5wdXNoKGUpfWxldCBFTz13ZztmdW5jdGlvbiB5TyhlLHQpe3lnLmZvckVhY2gobj0+bihlLHQpKX1mdW5jdGlvbiB3TyhlLHQsLi4ubil7bGV0IHI9Q08oZSx0LG4pO3ImJmNvbnNvbGVbZV0ocil9ZnVuY3Rpb24gU08oKXtyZXR1cm4gdHlwZW9mIF9fY2hhbm5lbElkX189PSJzdHJpbmciJiZfX2NoYW5uZWxJZF9ffWZ1bmN0aW9uIEFPKGUsdCl7c3dpdGNoKFkudG9SYXdUeXBlKHQpKXtjYXNlIkZ1bmN0aW9uIjpyZXR1cm4iZnVuY3Rpb24oKSB7IFtuYXRpdmUgY29kZV0gfSI7ZGVmYXVsdDpyZXR1cm4gdH19ZnVuY3Rpb24gQ08oZSx0LG4pe3JldHVybiBTTygpPyhuLnB1c2godC5yZXBsYWNlKCJhdCAiLCJ1bmktYXBwOi8vLyIpKSxjb25zb2xlW2VdLmFwcGx5KGNvbnNvbGUsbikpOm4ubWFwKGZ1bmN0aW9uKGEpe2xldCB1PVkudG9UeXBlU3RyaW5nKGEpLnRvTG93ZXJDYXNlKCk7aWYoWyJbb2JqZWN0IG9iamVjdF0iLCJbb2JqZWN0IGFycmF5XSIsIltvYmplY3QgbW9kdWxlXSJdLmluZGV4T2YodSkhPT0tMSl0cnl7YT0iLS0tQkVHSU46SlNPTi0tLSIrSlNPTi5zdHJpbmdpZnkoYSxBTykrIi0tLUVORDpKU09OLS0tIn1jYXRjaChoKXthPXV9ZWxzZSBpZihhPT09bnVsbClhPSItLS1OVUxMLS0tIjtlbHNlIGlmKGE9PT12b2lkIDApYT0iLS0tVU5ERUZJTkVELS0tIjtlbHNle2xldCBoPVkudG9SYXdUeXBlKGEpLnRvVXBwZXJDYXNlKCk7aD09PSJOVU1CRVIifHxoPT09IkJPT0xFQU4iP2E9Ii0tLUJFR0lOOiIraCsiLS0tIithKyItLS1FTkQ6IitoKyItLS0iOmE9U3RyaW5nKGEpfXJldHVybiBhfSkuam9pbigiLS0tQ09NTUEtLS0iKSsiICIrdH1sZXQgQW89e2xvYWQ6ImxvYWQiLGNsb3NlOiJjbG9zZSIsZXJyb3I6ImVycm9yIixhZENsaWNrZWQ6ImFkQ2xpY2tlZCJ9O2NsYXNzIFNne2NvbnN0cnVjdG9yKCl7dGhpcy5fY2FsbGJhY2tzPXt9fW9uTG9hZCh0KXt0aGlzLl9hZGRFdmVudExpc3RlbmVyKEFvLmxvYWQsdCl9b25DbG9zZSh0KXt0aGlzLl9hZGRFdmVudExpc3RlbmVyKEFvLmNsb3NlLHQpfW9uRXJyb3IodCl7dGhpcy5fYWRkRXZlbnRMaXN0ZW5lcihBby5lcnJvcix0KX1vZmZMb2FkKHQpe3RoaXMuX3JlbW92ZUV2ZW50TGlzdGVuZXIoQW8ubG9hZCx0KX1vZmZDbG9zZSh0KXt0aGlzLl9yZW1vdmVFdmVudExpc3RlbmVyKEFvLmNsb3NlLHQpfW9mZkVycm9yKHQpe3RoaXMuX3JlbW92ZUV2ZW50TGlzdGVuZXIoQW8uZXJyb3IsdCl9X2FkZEV2ZW50TGlzdGVuZXIodCxuKXshWS5pc0Z1bmN0aW9uKG4pfHwodGhpcy5fY2FsbGJhY2tzW3RdfHwodGhpcy5fY2FsbGJhY2tzW3RdPVtdKSx0aGlzLl9jYWxsYmFja3NbdF0ucHVzaChuKSl9X3JlbW92ZUV2ZW50TGlzdGVuZXIodCxuKXtsZXQgcj10aGlzLl9jYWxsYmFja3NbdF0sYT1yLmluZGV4T2Yobik7YT4tMSYmci5zcGxpY2UoYSwxKX1fZGlzcGF0Y2hFdmVudCh0LG4pe3RoaXMuX2NhbGxiYWNrc1t0XS5mb3JFYWNoKHI9PntyKG58fHt9KX0pfX1jbGFzcyBYdSBleHRlbmRzIFNne2NvbnN0cnVjdG9yKHQsbil7c3VwZXIoKTt0aGlzLnByZWxvYWQ9ITAsdGhpcy5faXNMb2FkZWQ9ITEsdGhpcy5faXNMb2FkaW5nPSExLHRoaXMuX2xvYWRQcm9taXNlUmVzb2x2ZT1udWxsLHRoaXMuX2xvYWRQcm9taXNlUmVqZWN0PW51bGwsdGhpcy5fc2hvd1Byb21pc2VSZXNvbHZlPW51bGwsdGhpcy5fc2hvd1Byb21pc2VSZWplY3Q9bnVsbCx0aGlzLnByZWxvYWQ9bi5wcmVsb2FkIT09dm9pZCAwP24ucHJlbG9hZDohMTtsZXQgcj10aGlzLl9hZEluc3RhbmNlPXQ7ci5vbkxvYWQoKCk9Pnt0aGlzLl9pc0xvYWRlZD0hMCx0aGlzLl9pc0xvYWRpbmc9ITEsdGhpcy5fbG9hZFByb21pc2VSZXNvbHZlIT1udWxsJiYodGhpcy5fbG9hZFByb21pc2VSZXNvbHZlKCksdGhpcy5fbG9hZFByb21pc2VSZXNvbHZlPW51bGwpLHRoaXMuX3Nob3dQcm9taXNlUmVzb2x2ZSE9bnVsbCYmKHRoaXMuX3Nob3dQcm9taXNlUmVzb2x2ZSgpLHRoaXMuX3Nob3dQcm9taXNlUmVzb2x2ZT1udWxsLHRoaXMuX3Nob3dBZCgpKSx0aGlzLl9kaXNwYXRjaEV2ZW50KEFvLmxvYWQse30pfSksci5vbkNsb3NlKGE9Pnt0aGlzLl9pc0xvYWRlZD0hMSx0aGlzLl9pc0xvYWRpbmc9ITEsdGhpcy5fZGlzcGF0Y2hFdmVudChBby5jbG9zZSxhKSx0aGlzLnByZWxvYWQ9PT0hMCYmdGhpcy5fbG9hZEFkKCl9KSxyLm9uRXJyb3IoYT0+e3RoaXMuX2lzTG9hZGluZz0hMTtsZXQgdT17Y29kZTphLmNvZGUsZXJyTXNnOmEubWVzc2FnZX07dGhpcy5fZGlzcGF0Y2hFdmVudChBby5lcnJvcix1KTtsZXQgaD1uZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkodSkpO3RoaXMuX2xvYWRQcm9taXNlUmVqZWN0IT1udWxsJiYodGhpcy5fbG9hZFByb21pc2VSZWplY3QoaCksdGhpcy5fbG9hZFByb21pc2VSZWplY3Q9bnVsbCksdGhpcy5fc2hvd1Byb21pc2VSZWplY3QhPW51bGwmJih0aGlzLl9zaG93UHJvbWlzZVJlamVjdChoKSx0aGlzLl9zaG93UHJvbWlzZVJlamVjdD1udWxsKX0pLHIub25BZENsaWNrZWQmJnIub25BZENsaWNrZWQoKCk9Pnt0aGlzLl9kaXNwYXRjaEV2ZW50KEFvLmFkQ2xpY2tlZCx7fSl9KX1nZXRQcm92aWRlcigpe3JldHVybiB0aGlzLl9hZEluc3RhbmNlLmdldFByb3ZpZGVyKCl9bG9hZCgpe3JldHVybiBuZXcgUHJvbWlzZSgodCxuKT0+e3RoaXMuX2xvYWRQcm9taXNlUmVzb2x2ZT10LHRoaXMuX2xvYWRQcm9taXNlUmVqZWN0PW4sIXRoaXMuX2lzTG9hZGluZyYmKHRoaXMuX2lzTG9hZGVkP3QoIiIpOnRoaXMuX2xvYWRBZCgpKX0pfXNob3coKXtyZXR1cm4gbmV3IFByb21pc2UoKHQsbik9Pnt0aGlzLl9zaG93UHJvbWlzZVJlc29sdmU9dCx0aGlzLl9zaG93UHJvbWlzZVJlamVjdD1uLCF0aGlzLl9pc0xvYWRpbmcmJih0aGlzLl9pc0xvYWRlZD8odGhpcy5fc2hvd0FkKCksdCgiIikpOnRoaXMuX2xvYWRBZCgpKX0pfWRlc3Ryb3koKXt0aGlzLl9hZEluc3RhbmNlLmRlc3Ryb3koKX1fbG9hZEFkKCl7dGhpcy5faXNMb2FkZWQ9ITEsdGhpcy5faXNMb2FkaW5nPSEwLHRoaXMuX2FkSW5zdGFuY2UubG9hZCgpfV9zaG93QWQoKXt0aGlzLl9hZEluc3RhbmNlLnNob3coKX19Y2xhc3MgT08gZXh0ZW5kcyBYdXtjb25zdHJ1Y3Rvcih0KXtzdXBlcihsLmFkLmNyZWF0ZVJld2FyZGVkVmlkZW9BZCh0KSx0KTt0aGlzLl9sb2FkQWQoKX19bGV0IFRPPU10KEJ3LGU9Pm5ldyBPTyhlKSxMdyxNdyk7Y2xhc3MgUE8gZXh0ZW5kcyBYdXtjb25zdHJ1Y3Rvcih0KXtzdXBlcihsLmFkLmNyZWF0ZUZ1bGxTY3JlZW5WaWRlb0FkKHQpLHQpO3RoaXMucHJlbG9hZD0hMX19bGV0IElPPU10KER3LGU9Pm5ldyBQTyhlKSxWdyxGdyk7Y2xhc3MgTk8gZXh0ZW5kcyBYdXtjb25zdHJ1Y3Rvcih0KXtzdXBlcihsLmFkLmNyZWF0ZUludGVyc3RpdGlhbEFkKHQpLHQpO3RoaXMucHJlbG9hZD0hMSx0aGlzLl9sb2FkQWQoKX19bGV0IGtPPU10KCR3LGU9Pm5ldyBOTyhlKSxIdyxVdyksZ2E9e30sS3M9e307ZnVuY3Rpb24gUk8oZSl7bGV0IHQ9ZS5wcm92aWRlcjtpZihnYVt0XXx8KGdhW3RdPXt9KSx0eXBlb2YgZ2FbdF0ucGx1Z2luPT0ib2JqZWN0Iil7ZS5zdWNjZXNzKGdhW3RdLnBsdWdpbik7cmV0dXJufWlmKEtzW3RdfHwoS3NbdF09W10pLEtzW3RdLnB1c2goZSksZ2FbdF0uc3RhdHVzPT09ITApe2UuX19wbHVnaW49Z2FbdF0ucGx1Z2luO3JldHVybn1nYVt0XS5zdGF0dXM9ITA7bGV0IG49SG8odCk7aWYoIW58fCFuLmluaXRTREspe0tzW3RdLmZvckVhY2gocj0+e3IuZmFpbCh7Y29kZTotMSxtZXNzYWdlOiJwcm92aWRlciBbIit0KyJdIGludmFsaWQifSl9KSxLc1t0XS5sZW5ndGg9MCxnYVt0XS5zdGF0dXM9ITE7cmV0dXJufWdhW3RdLnBsdWdpbj1uLGUuX19wbHVnaW49bixuLmluaXRTREsocj0+e2xldCBhPXIuY29kZT09PTF8fHIuY29kZT09PSIxIjthP2dhW3RdLnBsdWdpbj1uOmdhW3RdLnN0YXR1cz0hMSxLc1t0XS5mb3JFYWNoKHU9PnthP3Uuc3VjY2Vzcyh1Ll9fcGx1Z2luKTp1LmZhaWwocil9KSxLc1t0XS5sZW5ndGg9MH0pfWNsYXNzIHhPIGV4dGVuZHMgU2d7Y29uc3RydWN0b3IodCl7c3VwZXIoKTt0aGlzLl9hZHBpZD0iIix0aGlzLl9wcm92aWRlcj0iIix0aGlzLl91c2VyRGF0YT1udWxsLHRoaXMuX2lzTG9hZGVkPSExLHRoaXMuX2lzTG9hZGluZz0hMSx0aGlzLl9sb2FkUHJvbWlzZVJlc29sdmU9bnVsbCx0aGlzLl9sb2FkUHJvbWlzZVJlamVjdD1udWxsLHRoaXMuX3Nob3dQcm9taXNlUmVzb2x2ZT1udWxsLHRoaXMuX3Nob3dQcm9taXNlUmVqZWN0PW51bGwsdGhpcy5fYWRJbnN0YW5jZT1udWxsLHRoaXMuX2FkRXJyb3I9IiIsdGhpcy5fYWRwaWQ9dC5hZHBpZCx0aGlzLl9wcm92aWRlcj10LnByb3ZpZGVyLHRoaXMuX3VzZXJEYXRhPXQudXNlckRhdGEsaygoKT0+e3RoaXMuX2luaXQoKX0pfV9pbml0KCl7dGhpcy5fYWRFcnJvcj0iIixSTyh7cHJvdmlkZXI6dGhpcy5fcHJvdmlkZXIsc3VjY2Vzczp0PT57dGhpcy5fYWRJbnN0YW5jZT10LHRoaXMuX3VzZXJEYXRhJiZ0aGlzLmJpbmRVc2VyRGF0YSh0aGlzLl91c2VyRGF0YSksdGhpcy5fbG9hZEFkKCl9LGZhaWw6dD0+e3RoaXMuX2FkRXJyb3I9dCx0aGlzLl9sb2FkUHJvbWlzZVJlamVjdCE9bnVsbCYmKHRoaXMuX2xvYWRQcm9taXNlUmVqZWN0KHRoaXMuX2NyZWF0ZUVycm9yKHQpKSx0aGlzLl9sb2FkUHJvbWlzZVJlamVjdD1udWxsKSx0aGlzLl9kaXNwYXRjaEV2ZW50KEFvLmVycm9yLHQpfX0pfWdldFByb3ZpZGVyKCl7cmV0dXJuIHRoaXMuX3Byb3ZpZGVyfWxvYWQoKXtyZXR1cm4gbmV3IFByb21pc2UoKHQsbik9PntpZih0aGlzLl9sb2FkUHJvbWlzZVJlc29sdmU9dCx0aGlzLl9sb2FkUHJvbWlzZVJlamVjdD1uLCF0aGlzLl9pc0xvYWRpbmcpe2lmKHRoaXMuX2FkRXJyb3Ipe3RoaXMuX2luaXQoKTtyZXR1cm59dGhpcy5faXNMb2FkZWQ/dCgiIik6dGhpcy5fbG9hZEFkKCl9fSl9c2hvdygpe3JldHVybiBuZXcgUHJvbWlzZSgodCxuKT0+e2lmKHRoaXMuX3Nob3dQcm9taXNlUmVzb2x2ZT10LHRoaXMuX3Nob3dQcm9taXNlUmVqZWN0PW4sIXRoaXMuX2lzTG9hZGluZyl7aWYodGhpcy5fYWRFcnJvcil7dGhpcy5faW5pdCgpO3JldHVybn10aGlzLl9pc0xvYWRlZD8odGhpcy5fc2hvd0FkKCksdCgiIikpOnRoaXMuX2xvYWRBZCgpfX0pfXJlcG9ydEV4cG9zdXJlKCl7dGhpcy5fYWRJbnN0YW5jZSE9PW51bGwmJnRoaXMuX2FkSW5zdGFuY2UucmVwb3J0RXhwb3N1cmUoKX1iaW5kVXNlckRhdGEodCl7dGhpcy5fYWRJbnN0YW5jZSE9PW51bGwmJnRoaXMuX2FkSW5zdGFuY2UuYmluZFVzZXJEYXRhKHQpfWRlc3Ryb3koKXt0aGlzLl9hZEluc3RhbmNlIT09bnVsbCYmdGhpcy5fYWRJbnN0YW5jZS5kZXN0cm95JiZ0aGlzLl9hZEluc3RhbmNlLmRlc3Ryb3koe2FkcGlkOnRoaXMuX2FkcGlkfSl9X2xvYWRBZCgpe2lmKHRoaXMuX2FkSW5zdGFuY2UhPT1udWxsKXtpZih0aGlzLl9pc0xvYWRpbmc9PT0hMClyZXR1cm47dGhpcy5faXNMb2FkaW5nPSEwLHRoaXMuX2FkSW5zdGFuY2UubG9hZERhdGEoe2FkcGlkOnRoaXMuX2FkcGlkfSx0PT57dGhpcy5faXNMb2FkZWQ9ITAsdGhpcy5faXNMb2FkaW5nPSExLHRoaXMuX2xvYWRQcm9taXNlUmVzb2x2ZSE9bnVsbCYmKHRoaXMuX2xvYWRQcm9taXNlUmVzb2x2ZSgpLHRoaXMuX2xvYWRQcm9taXNlUmVzb2x2ZT1udWxsKSx0aGlzLl9zaG93UHJvbWlzZVJlc29sdmUhPW51bGwmJih0aGlzLl9zaG93UHJvbWlzZVJlc29sdmUoKSx0aGlzLl9zaG93UHJvbWlzZVJlc29sdmU9bnVsbCx0aGlzLl9zaG93QWQoKSksdGhpcy5fZGlzcGF0Y2hFdmVudChBby5sb2FkLHQpfSx0PT57dGhpcy5faXNMb2FkaW5nPSExLHRoaXMuX3Nob3dQcm9taXNlUmVqZWN0IT1udWxsJiYodGhpcy5fc2hvd1Byb21pc2VSZWplY3QodGhpcy5fY3JlYXRlRXJyb3IodCkpLHRoaXMuX3Nob3dQcm9taXNlUmVqZWN0PW51bGwpLHRoaXMuX2Rpc3BhdGNoRXZlbnQoQW8uZXJyb3IsdCl9KX19X3Nob3dBZCgpe3RoaXMuX2FkSW5zdGFuY2UhPT1udWxsJiZ0aGlzLl9pc0xvYWRlZD09PSEwJiZ0aGlzLl9hZEluc3RhbmNlLnNob3coe2FkcGlkOnRoaXMuX2FkcGlkfSwoKT0+e3RoaXMuX2lzTG9hZGVkPSExfSx0PT57dGhpcy5faXNMb2FkZWQ9ITEsdGhpcy5fc2hvd1Byb21pc2VSZWplY3QhPW51bGwmJih0aGlzLl9zaG93UHJvbWlzZVJlamVjdCh0aGlzLl9jcmVhdGVFcnJvcih0KSksdGhpcy5fc2hvd1Byb21pc2VSZWplY3Q9bnVsbCksdGhpcy5fZGlzcGF0Y2hFdmVudChBby5lcnJvcix0KX0pfV9jcmVhdGVFcnJvcih0KXtyZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KHQpKX19bGV0IEJPPU10KGp3LGU9Pm5ldyB4TyhlKSxXdyx6dyksQWc9bC5vcy5uYW1lPT09IkFuZHJvaWQiJiZwYXJzZUludChsLm9zLnZlcnNpb24pPDYsTU89QWc/InNsaWRlLWluLXJpZ2h0IjoicG9wLWluIix6Yz0zMDAsQ2c9QWc/InNsaWRlLW91dC1yaWdodCI6InBvcC1vdXQiLExPPSJfd3d3L19fdW5pYXBwdmlldy5odG1sIixETz0id2Vidmlld0lkIixGTz0idW5pTVBOYXRpdmVFdmVudCI7ZnVuY3Rpb24gVk8oZSx0LG4pe24mJnQuaXNOVnVlJiYoZS51bmlOVmlldz17cGF0aDpuLGRlZmF1bHRGb250U2l6ZTpULmRlZmF1bHRGb250U2l6ZSx2aWV3cG9ydDpULnZpZXdwb3J0fSl9bGV0ICRPPS9eI1thLXowLTldezZ9JC9pO2Z1bmN0aW9uIE9nKGUpe3JldHVybiBlJiYoJE8udGVzdChlKXx8ZT09PSJ0cmFuc3BhcmVudCIpfWZ1bmN0aW9uIFVPKGUsdCl7bGV0e2JhY2tncm91bmRDb2xvcjpufT10OyFufHwhT2cobil8fChlLmJhY2tncm91bmR8fChlLmJhY2tncm91bmQ9biksZS5iYWNrZ3JvdW5kQ29sb3JUb3B8fChlLmJhY2tncm91bmRDb2xvclRvcD1uKSl9ZnVuY3Rpb24gSE8oZSx0KXtlLnBvcEdlc3R1cmU9PT0iaGlkZSImJmRlbGV0ZSBlLnBvcEdlc3R1cmUsdC5pc1F1aXQmJihlLnBvcEdlc3R1cmU9bC5vcy5uYW1lPT09ImlPUyI/ImFwcGJhY2siOiJub25lIil9ZnVuY3Rpb24gak8oZSx0KXtpZighdC5lbmFibGVQdWxsRG93blJlZnJlc2gpcmV0dXJuO2xldCBuPUNzKFkuZXh0ZW5kKHt9LGwub3MubmFtZT09PSJBbmRyb2lkIj9XTzpHTyx0LnB1bGxUb1JlZnJlc2gpKTtlLnB1bGxUb1JlZnJlc2g9ek8obix0KX1mdW5jdGlvbiB6TyhlLHQpe2xldCBuPW9vKGUpO2lmKCFuKXJldHVybiBlO2xldFtyLGEsdV09bjtyZXR1cm4ocnx8YXx8dSkmJmd0Lm9uTG9jYWxlQ2hhbmdlKCgpPT57bGV0IGg9bC53ZWJ2aWV3LmdldFdlYnZpZXdCeUlkKHQuaWQrIiIpO2lmKCFoKXJldHVybjtsZXQgYj17c3VwcG9ydDohMH07ciYmKGIuY29udGVudGRvd249e2NhcHRpb246ZS5jb250ZW50ZG93bi5jYXB0aW9ufSksYSYmKGIuY29udGVudG92ZXI9e2NhcHRpb246ZS5jb250ZW50b3Zlci5jYXB0aW9ufSksdSYmKGIuY29udGVudHJlZnJlc2g9e2NhcHRpb246ZS5jb250ZW50cmVmcmVzaC5jYXB0aW9ufSksaC5zZXRTdHlsZSh7cHVsbFRvUmVmcmVzaDpifSl9KSxlfWxldCBXTz17c3VwcG9ydDohMCxzdHlsZToiY2lyY2xlIn0sR089e3N1cHBvcnQ6ITAsc3R5bGU6ImRlZmF1bHQiLGhlaWdodDoiNTBweCIscmFuZ2U6IjIwMHB4Iixjb250ZW50ZG93bjp7Y2FwdGlvbjoiIn0sY29udGVudG92ZXI6e2NhcHRpb246IiJ9LGNvbnRlbnRyZWZyZXNoOntjYXB0aW9uOiIifX07ZnVuY3Rpb24gWU8oZSx0KXtsZXR7bmF2aWdhdGlvbkJhcjpufT10O2lmKG4uc3R5bGU9PT0iY3VzdG9tIilyZXR1cm4hMTtsZXQgcj0hMDt0LmlzUXVpdCYmKHI9ITEpO2xldCBhPXthdXRvQmFja0J1dHRvbjpyfTtPYmplY3Qua2V5cyhuKS5mb3JFYWNoKHU9PntsZXQgaD1uW3VdO3U9PT0iYmFja2dyb3VuZENvbG9yIj9hLmJhY2tncm91bmRDb2xvcj1PZyhoKT9oOnRlLkJBQ0tHUk9VTkRfQ09MT1I6dT09PSJ0aXRsZUltYWdlIiYmaD9hLnRhZ3M9S08oaCk6dT09PSJidXR0b25zIiYmWS5pc0FycmF5KGgpP2EuYnV0dG9ucz1oLm1hcCgoYixVKT0+KGIub25jbGljaz1KTyhVKSxiKSk6YVt1XT1ofSksZS50aXRsZU5WaWV3PXFPKGEsdCl9ZnVuY3Rpb24gcU8oZSx0KXtsZXQgbj1ibyhlKTtpZighbilyZXR1cm4gZTtsZXRbcixhXT1uO3JldHVybihyfHxhKSYmZ3Qub25Mb2NhbGVDaGFuZ2UoKCk9PntsZXQgdT1sLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQodC5pZCsiIik7aWYoIXUpcmV0dXJuO2xldCBoPXt9O3ImJihoLnRpdGxlVGV4dD1lLnRpdGxlVGV4dCksYSYmKGguc2VhcmNoSW5wdXQ9e3BsYWNlaG9sZGVyOmUuc2VhcmNoSW5wdXQucGxhY2Vob2xkZXJ9KSx1LnNldFN0eWxlKHt0aXRsZU5WaWV3Omh9KX0pLGV9ZnVuY3Rpb24gS08oZSl7cmV0dXJuW3t0YWc6ImltZyIsc3JjOmUscG9zaXRpb246e2xlZnQ6ImF1dG8iLHRvcDoiYXV0byIsd2lkdGg6ImF1dG8iLGhlaWdodDoiMjZweCJ9fV19ZnVuY3Rpb24gSk8oZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe24uaW5kZXg9ZSxqbih0ZS5PTl9OQVZJR0FUSU9OX0JBUl9CVVRUT05fVEFQLG4pfX1mdW5jdGlvbiBUZyhlLHQsbil7bGV0IHI9e2JvdW5jZToidmVydGljYWwifTtyZXR1cm4gT2JqZWN0LmtleXModCkuZm9yRWFjaChhPT57Wk8uaW5kZXhPZihhKT09PS0xJiYoclthXT10W2FdKX0pLG4uaWQhPT0iMSImJlZPKHIsdCxlKSxITyhyLHQpLFVPKHIsdCksWU8ocix0KSxqTyhyLHQpLHJ9bGV0IFpPPVsiaWQiLCJyb3V0ZSIsImlzTlZ1ZSIsImlzUXVpdCIsImlzRW50cnkiLCJpc1RhYkJhciIsInRhYkJhckluZGV4Iiwid2luZG93VG9wIiwidG9wV2luZG93IiwibGVmdFdpbmRvdyIsInJpZ2h0V2luZG93IiwibWF4V2lkdGgiLCJ1c2luZ0NvbXBvbmVudHMiLCJkaXNhYmxlU2Nyb2xsIiwiZW5hYmxlUHVsbERvd25SZWZyZXNoIiwibmF2aWdhdGlvbkJhciIsInB1bGxUb1JlZnJlc2giLCJvblJlYWNoQm90dG9tRGlzdGFuY2UiLCJwYWdlT3JpZW50YXRpb24iLCJiYWNrZ3JvdW5kQ29sb3IiXSxQZz0yO2Z1bmN0aW9uIElnKCl7cmV0dXJuIFBnfWZ1bmN0aW9uIE5nKCl7cmV0dXJuIFBnKyt9ZnVuY3Rpb24ga2coZSl7cmV0dXJuIGV9ZnVuY3Rpb24gUmcoZSx0KXtsZXQgbj10P3RlLnN0cmluZ2lmeVF1ZXJ5KHQsa2cpOiIiO3JldHVybntwYXRoOmUuc2xpY2UoMSkscXVlcnk6biYmbi5zbGljZSgxKX19ZnVuY3Rpb24gWE8oZSx0LG4pe2xldCByPW4/dGUuc3RyaW5naWZ5UXVlcnkobixrZyk6IiI7cmV0dXJue2lzVGFiOmUsYXJndW1lbnRzOkpTT04uc3RyaW5naWZ5KHtwYXRoOnQuc2xpY2UoMSkscXVlcnk6ciYmci5zbGljZSgxKX0pfX1mdW5jdGlvbiBRTyh7cGF0aDplLHF1ZXJ5OnQscm91dGVPcHRpb25zOm4sd2Vidmlld0V4dHJhczpyfSl7bGV0IGE9TmcoKSx1PVRnKGUsbi5tZXRhLHtpZDphKyIifSk7cmV0dXJuIHUudW5pUGFnZVVybD1SZyhlLHQpLHUuaXNUYWI9ISFuLm1ldGEuaXNUYWJCYXIsbC53ZWJ2aWV3LmNyZWF0ZSgiIixTdHJpbmcoYSksdSxZLmV4dGVuZCh7bnZ1ZTohMCxfX3BhdGhfXzplLF9fcXVlcnlfXzpKU09OLnN0cmluZ2lmeSh0KX0scikpfWxldCBCaTtmdW5jdGlvbiB4ZyhlKXtCaT1lfWZ1bmN0aW9uIGVUKCl7cmV0dXJuIEJpfWZ1bmN0aW9uIHRUKCl7cmV0dXJuKCFCaXx8QmkuX191bmlhcHBfcm91dGUpJiYoQmk9bC53ZWJ2aWV3LmNyZWF0ZShMTyxTdHJpbmcoTmcoKSkse2NvbnRlbnRBZGp1c3Q6ITF9KSksQml9ZnVuY3Rpb24gblQoZSl7bGV0e3BvcHVwU3ViTlZ1ZVdlYnZpZXdzOnR9PWU7IXR8fGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xvc2UiLCgpPT57T2JqZWN0LmtleXModCkuZm9yRWFjaChuPT57dFtuXS5jbG9zZSgibm9uZSIpfSl9KX1mdW5jdGlvbiBCZyhlKXtyZXR1cm4gVC5yZWFsRW50cnlQYWdlUGF0aCYmZS4kcGFnZS5yb3V0ZT09PVQuZW50cnlQYWdlUGF0aH1mdW5jdGlvbiBNZygpe1QuZW50cnlQYWdlUGF0aD1ULnJlYWxFbnRyeVBhZ2VQYXRoLGRlbGV0ZSBULnJlYWxFbnRyeVBhZ2VQYXRoLGd0LnJlTGF1bmNoKHt1cmw6dGUuYWRkTGVhZGluZ1NsYXNoKFQuZW50cnlQYWdlUGF0aCl9KX1mdW5jdGlvbiByVChlKXtsZXQgdDtlLmFkZEV2ZW50TGlzdGVuZXIoInBvcEdlc3R1cmUiLG49PntpZihuLnR5cGU9PT0ic3RhcnQiKXtsZXQgcj1WbigpLGE9cltyLmxlbmd0aC0yXTt0PWNjO2xldCB1PWEmJmEuJHBhZ2Uuc3RhdHVzQmFyU3R5bGU7dSYmWmEodSl9ZWxzZSBpZihuLnR5cGU9PT0iZW5kIiYmIW4ucmVzdWx0KVphKHQpO2Vsc2UgaWYobi50eXBlPT09ImVuZCImJm4ucmVzdWx0KXtsZXQgcj1WbigpLmxlbmd0aCxhPV9yKCk7RG8oKSxaYSgpLGEmJnI9PT0xJiZCZyhhKT9NZygpOmpuKHRlLk9OX1NIT1cpfX0pfWZ1bmN0aW9uIGlUKGUpe2lmKGUubnZ1ZSlyZXR1cm47bGV0IHQ9ZS5pZCx7c3Vic2NyaWJlOm4sdW5zdWJzY3JpYmU6cn09c3QsYT0odSxoKT0+e2lmKHQhPT1oKXJldHVybjtyKE1sLGEpO2xldCBiPWNvKHBhcnNlSW50KGgpKTtiJiZiLl9fcGFnZV9jb250YWluZXJfXy5yZXN0b3JlKCl9O2UuYWRkRXZlbnRMaXN0ZW5lcigicmVjb3ZlcnkiLCgpPT57bihNbCxhKX0pfWZ1bmN0aW9uIG9UKGUpe2xldHtlbWl0OnR9PXN0LG49ZnVuY3Rpb24oe3dpZHRoOnIsaGVpZ2h0OmF9KXtsZXQgaD17ZGV2aWNlT3JpZW50YXRpb246TWF0aC5hYnMobC5uYXZpZ2F0b3IuZ2V0T3JpZW50YXRpb24oKSk9PT05MD8ibGFuZHNjYXBlIjoicG9ydHJhaXQiLHNpemU6e3dpbmRvd1dpZHRoOk1hdGguY2VpbChyKSx3aW5kb3dIZWlnaHQ6TWF0aC5jZWlsKGEpfX07dCh0ZS5PTl9SRVNJWkUsaCxwYXJzZUludChlLmlkKSl9O2UuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIix0ZS5kZWJvdW5jZShuLDUwLHtzZXRUaW1lb3V0OmssY2xlYXJUaW1lb3V0OlN9KSl9bGV0IExnPXtwdWxsVG9SZWZyZXNoOnRlLk9OX1BVTExfRE9XTl9SRUZSRVNILHRpdGxlTlZpZXdTZWFyY2hJbnB1dENoYW5nZWQ6dGUuT05fTkFWSUdBVElPTl9CQVJfU0VBUkNIX0lOUFVUX0NIQU5HRUQsdGl0bGVOVmlld1NlYXJjaElucHV0Q29uZmlybWVkOnRlLk9OX05BVklHQVRJT05fQkFSX1NFQVJDSF9JTlBVVF9DT05GSVJNRUQsdGl0bGVOVmlld1NlYXJjaElucHV0Q2xpY2tlZDp0ZS5PTl9OQVZJR0FUSU9OX0JBUl9TRUFSQ0hfSU5QVVRfQ0xJQ0tFRCx0aXRsZU5WaWV3U2VhcmNoSW5wdXRGb2N1c0NoYW5nZWQ6dGUuT05fTkFWSUdBVElPTl9CQVJfU0VBUkNIX0lOUFVUX0ZPQ1VTX0NIQU5HRUR9O2Z1bmN0aW9uIGFUKGUpe2xldCB0PXBhcnNlSW50KGUuaWQpO09iamVjdC5rZXlzKExnKS5mb3JFYWNoKG49PntsZXQgcj1MZ1tuXTtlLmFkZEV2ZW50TGlzdGVuZXIobixhPT57cj09PXRlLk9OX1BVTExfRE9XTl9SRUZSRVNIJiZVdShlKSxqbih0LHIsYSl9KX0pLG5UKGUpLG9UKGUpLGwub3MubmFtZT09PSJpT1MiJiYoaVQoZSksclQoZSkpfWZ1bmN0aW9uIHNUKGUsdCxuLHIpe2xldCBhPVRnKHQscixlKTthLnVuaVBhZ2VVcmw9UmcodCxuKTtsZXQgdT0hIXIuaXNUYWJCYXI7ci5pc05WdWU/YS5pc1RhYj11OmEuZGVidWdSZWZyZXNoPVhPKHUsdCxuKSxhLmxvY2FsZT1nLnJlcXVpcmVNb2R1bGUoInBsdXMiKS5nZXRMYW5ndWFnZSgpLGUuc2V0U3R5bGUoYSl9ZnVuY3Rpb24gbFQoZSx0LG4peyhuLnN1Yk5WdWVzfHxbXSkuZm9yRWFjaChhPT57aWYoIWEucGF0aClyZXR1cm47bGV0IHU9eG8oYS5zdHlsZXx8e30pLGg9YS50eXBlPT09Im5hdmlnYXRpb25CYXIiLGI9YS50eXBlPT09InBvcHVwIjt1LnVuaU5WaWV3PXtwYXRoOmEucGF0aC5yZXBsYWNlKCIubnZ1ZSIsIi5qcyIpLGRlZmF1bHRGb250U2l6ZTpULmRlZmF1bHRGb250U2l6ZSx2aWV3cG9ydDpULnZpZXdwb3J0fTtsZXQgVT17X191bmlhcHBfaG9zdDp0LF9fdW5pYXBwX29yaWdpbjp1LnVuaU5WaWV3LnBhdGguc3BsaXQoIj8iKVswXS5yZXBsYWNlKCIuanMiLCIiKSxfX3VuaWFwcF9vcmlnaW5faWQ6ZS5pZCxfX3VuaWFwcF9vcmlnaW5fdHlwZTplLl9fdW5pYXBwX3R5cGV9LE87aD8odS5wb3NpdGlvbj0iZG9jayIsdS5kb2NrPSJ0b3AiLHUudG9wPSIwIix1LndpZHRoPSIxMDAlIix1LmhlaWdodD1TdHJpbmcodGUuTkFWQkFSX0hFSUdIVCtIdSgpKSxkZWxldGUgdS5sZWZ0LGRlbGV0ZSB1LnJpZ2h0LGRlbGV0ZSB1LmJvdHRvbSxkZWxldGUgdS5tYXJnaW4pOmImJih1LnBvc2l0aW9uPSJhYnNvbHV0ZSIsaWModCk/Tz1saTpPPWUsVS5fX3VuaWFwcF9tYXNrPXUubWFza3x8InJnYmEoMCwwLDAsMC41KSIsVS5fX3VuaWFwcF9tYXNrX2lkPU8uaWQpLGRlbGV0ZSB1Lm1hc2s7bGV0IEQ9bC53ZWJ2aWV3LmNyZWF0ZSgiIixhLmlkLHUsVSk7aWYoYil7Ty5wb3B1cFN1Yk5WdWVXZWJ2aWV3c3x8KE8ucG9wdXBTdWJOVnVlV2Vidmlld3M9e30pLE8ucG9wdXBTdWJOVnVlV2Vidmlld3NbRC5pZF09RDtsZXQgZ2U9ZnVuY3Rpb24oKXtPLnNldFN0eWxlKHttYXNrOiJub25lIn0pLEQuaGlkZSgiYXV0byIpfTtPLmFkZEV2ZW50TGlzdGVuZXIoIm1hc2tDbGljayIsZ2UpO2xldCB3ZT0hMTtELmFkZEV2ZW50TGlzdGVuZXIoInNob3ciLCgpPT57d2V8fChsLmtleS5yZW1vdmVFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIixZaSksbC5rZXkuYWRkRXZlbnRMaXN0ZW5lcigiYmFja2J1dHRvbiIsZ2UpLHdlPSEwKX0pLEQuYWRkRXZlbnRMaXN0ZW5lcigiaGlkZSIsKCk9Pnt3ZSYmKGwua2V5LnJlbW92ZUV2ZW50TGlzdGVuZXIoImJhY2tidXR0b24iLGdlKSxsLmtleS5hZGRFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIixZaSksd2U9ITEpfSksRC5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsKCk9PntkZWxldGUgTy5wb3B1cFN1Yk5WdWVXZWJ2aWV3c1tELmlkXSx3ZSYmKGwua2V5LnJlbW92ZUV2ZW50TGlzdGVuZXIoImJhY2tidXR0b24iLGdlKSxsLmtleS5hZGRFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIixZaSksd2U9ITEpfSl9ZWxzZSBlLmFwcGVuZChEKX0pfWZ1bmN0aW9uIGNUKGUsdCxuLHIpeyhlLmlkPT09IjEifHwhci5pc05WdWUpJiZzVChlLHQsbixyKSxsVChlLHQsciksYVQoZSl9ZnVuY3Rpb24gRGcoZSl7cmV0dXJuIGUucm91dGVPcHRpb25zLm1ldGEuaXNOVnVlP1FPKGUpOklnKCk9PT0yP2wud2Vidmlldy5nZXRMYXVuY2hXZWJ2aWV3KCk6ZVQoKX1mdW5jdGlvbiBGZyhlLHQpe3N0Lm9uY2UoTWwrIi4iK2UsdCl9bGV0IHBhPSExO2Z1bmN0aW9uIFZnKGUsdCxuKXtwYT17cGF0aDplLG52dWU6RWEoZSkuaXNOVnVlLGNhbGxiYWNrOnR9fWZ1bmN0aW9uICRnKGUsdCxuKXt1byhlKSxKcyhlLiRnZXRBcHBXZWJ2aWV3KCksdCxuKX1mdW5jdGlvbiBXYyhlLHQsbj0hMSl7aWYoIW4mJnBhKXJldHVybiBjb25zb2xlLmVycm9yKGBXYWl0aW5nIHRvIG5hdmlnYXRlIHRvOiAke3BhLnBhdGh9LCBkbyBub3Qgb3BlcmF0ZSBjb250aW51b3VzbHk6ICR7ZX0uYCk7aWYoVC5yZW5kZXJlcj09PSJuYXRpdmUiKXJldHVybiBWbigpLmxlbmd0aD09PTA/VmcoZSx0LCJ3YWl0Rm9yUmVhZHkiKTp0KCk7bGV0IHI9IUJpfHxCaSYmQmkuX191bmlhcHBfcm91dGUsYT1CaSYmIUJpLmxvYWRlZDtyfHxhP1ZnKGUsdCxyPyJ3YWl0Rm9yQ3JlYXRlIjoid2FpdEZvclJlYWR5Iik6dCgpLGEmJkZnKEJpLmlkLEdjKX1mdW5jdGlvbiBHYygpe2lmKCFwYSlyZXR1cm47bGV0e2NhbGxiYWNrOmV9PXBhO3JldHVybiBwYT0hMSxlKCl9ZnVuY3Rpb24gVWcoKXtpZihULnJlbmRlcmVyPT09Im5hdGl2ZSIpcmV0dXJuIHBhJiZwYS5udnVlP0djKCk6dm9pZCAwO2xldCBlPXRUKCk7aWYoISFwYSl7aWYocGEubnZ1ZSlyZXR1cm4gR2MoKTtlLmxvYWRlZD9wYS5jYWxsYmFjaygpOkZnKGUuaWQsR2MpfX1mdW5jdGlvbiBKcyhlLHQsbil7ZVtlLl9fcHJlbG9hZF9fPyJoaWRlIjoiY2xvc2UiXSh0LG4pfWZ1bmN0aW9uIFljKGUsdCxuLHIsYSl7dHlwZW9mIGE9PSJ1bmRlZmluZWQiJiYoYT1lLm52dWU/MDoxMDApO2xldCB1PWZ1bmN0aW9uKCl7dS5fY2FsbGVkfHwodS5fY2FsbGVkPSEwLHImJnIoKSxVZygpKX07dS5fY2FsbGVkPSExLGsoKCk9PntsZXQgaD1rKCgpPT57dSgpfSxuKzE1MCk7ZS5zaG93KHQsbiwoKT0+e3UuX2NhbGxlZHx8UyhoKSx1KCl9KX0sYSl9ZnVuY3Rpb24gdVQoZSx0KXtsZXQgbj1lLmNoaWxkcmVuKCk7aWYoIW58fCFuLmxlbmd0aClyZXR1cm4gdCgpO2xldCByPW4uZmluZChhPT5hLmlkLmluZGV4T2YoRE8pPT09MCl8fG5bMF07ci5jYW5CYWNrKCh7Y2FuQmFjazphfSk9PnthP3IuYmFjaygpOnQoKX0pfWxldCBmVD15ZShYRSwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1fcigpO2lmKCFyKXJldHVybiBuKCJnZXRDdXJyZW50UGFnZXMgaXMgZW1wdHkiKTtpZihqbihyLHRlLk9OX0JBQ0tfUFJFU1Mse2Zyb206ZS5mcm9tfHwibmF2aWdhdGVCYWNrIn0pKXJldHVybiB0KCk7aWYoZ3QuaGlkZVRvYXN0KCksZ3QuaGlkZUxvYWRpbmcoKSxyLiRwYWdlLm1ldGEuaXNRdWl0KWRUKCk7ZWxzZSBpZihCZyhyKSlNZygpO2Vsc2V7bGV0e2RlbHRhOmEsYW5pbWF0aW9uVHlwZTp1LGFuaW1hdGlvbkR1cmF0aW9uOmh9PWU7aFQoYSx1LGgpfXJldHVybiB0KCl9LGV5LHV5KSxxYz0wO2Z1bmN0aW9uIGRUKCl7dG4oKSxxYz9EYXRlLm5vdygpLXFjPDJlMyYmbC5ydW50aW1lLnF1aXQoKToocWM9RGF0ZS5ub3coKSxsLm5hdGl2ZVVJLnRvYXN0KFgoKS50KCJ1bmkuYXBwLnF1aXQiKSksaygoKT0+e3FjPTB9LDJlMykpfWZ1bmN0aW9uIGhUKGUsdCxuKXtsZXQgcj1WbigpLGE9ci5sZW5ndGgsdT1yW2EtMV07ZT4xJiZyLnNsaWNlKGEtZSxhLTEpLnJldmVyc2UoKS5mb3JFYWNoKFU9PntKcyhsLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQoVS4kcGFnZS5pZCsiIiksIm5vbmUiLDApfSk7bGV0IGg9ZnVuY3Rpb24oVSl7dD9KcyhVLHQsbnx8emMpOnUuJHBhZ2Uub3BlblR5cGU9PT0icmVkaXJlY3RUbyI/SnMoVSxDZyx6Yyk6SnMoVSwiYXV0byIpLHIuc2xpY2UoYS1lLGEpLmZvckVhY2goTz0+dW8oTykpLFphKCksam4odGUuT05fU0hPVyl9LGI9bC53ZWJ2aWV3LmdldFdlYnZpZXdCeUlkKHUuJHBhZ2UuaWQrIiIpO2lmKCF1Ll9fdW5pYXBwX3dlYnZpZXcpcmV0dXJuIGgoYik7dVQoYiwoKT0+e2goYil9KX1jbGFzcyBnVCBleHRlbmRzIHRlLlVuaU5vZGV7Y29uc3RydWN0b3IodCxuLHI9ITEpe3N1cGVyKHRlLk5PREVfVFlQRV9QQUdFLCIjcGFnZSIsbnVsbCk7dGhpcy5faWQ9MSx0aGlzLl9jcmVhdGVkPSExLHRoaXMuX3VwZGF0aW5nPSExLHRoaXMuX2NyZWF0ZUFjdGlvbk1hcD1uZXcgTWFwLHRoaXMudXBkYXRlQWN0aW9ucz1bXSx0aGlzLmRpY3RzPVtdLHRoaXMubm9kZUlkPTAsdGhpcy5wYWdlSWQ9dCx0aGlzLnBhZ2VOb2RlPXRoaXMsdGhpcy5vcHRpb25zPW4sdGhpcy5pc1VubW91bnRlZD0hMSx0aGlzLmNyZWF0ZUFjdGlvbj1bdGUuQUNUSU9OX1RZUEVfUEFHRV9DUkVBVEUsbl0sdGhpcy5jcmVhdGVkQWN0aW9uPVt0ZS5BQ1RJT05fVFlQRV9QQUdFX0NSRUFURURdLHRoaXMubm9ybWFsaXplRGljdD10aGlzLl9ub3JtYWxpemVEaWN0LmJpbmQodGhpcyksdGhpcy5fdXBkYXRlPXRoaXMudXBkYXRlLmJpbmQodGhpcyksciYmdGhpcy5zZXR1cCgpfV9ub3JtYWxpemVEaWN0KHQsbj0hMCl7aWYoIVkuaXNQbGFpbk9iamVjdCh0KSlyZXR1cm4gdGhpcy5hZGREaWN0KHQpO2xldCByPVtdO3JldHVybiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGE9PntsZXQgdT1bdGhpcy5hZGREaWN0KGEpXSxoPXRbYV07bj91LnB1c2godGhpcy5hZGREaWN0KGgpKTp1LnB1c2goaCksci5wdXNoKHUpfSkscn1hZGREaWN0KHQpe2xldHtkaWN0czpufT10aGlzLHI9bi5pbmRleE9mKHQpO3JldHVybiByPi0xP3I6bi5wdXNoKHQpLTF9b25JbmplY3RIb29rKHQpeyh0PT09dGUuT05fUEFHRV9TQ1JPTEx8fHQ9PT10ZS5PTl9SRUFDSF9CT1RUT00pJiYhdGhpcy5zY3JvbGxBY3Rpb24mJih0aGlzLnNjcm9sbEFjdGlvbj1bdGUuQUNUSU9OX1RZUEVfUEFHRV9TQ1JPTEwsdGhpcy5vcHRpb25zLm9uUmVhY2hCb3R0b21EaXN0YW5jZV0sdGhpcy5wdXNoKHRoaXMuc2Nyb2xsQWN0aW9uKSl9b25DcmVhdGUodCxuKXtyZXR1cm4gbVQodGhpcyx0Lm5vZGVJZCxuKSx0fW9uSW5zZXJ0QmVmb3JlKHQsbixyKXtyZXR1cm4gX1QodGhpcyxuLHQubm9kZUlkLHImJnIubm9kZUlkfHwtMSksbn1vblJlbW92ZUNoaWxkKHQpe3JldHVybiBiVCh0aGlzLHQubm9kZUlkKSx0fW9uQWRkRXZlbnQodCxuLHIpe3QucGFyZW50Tm9kZSYmRVQodGhpcyx0Lm5vZGVJZCxuLHIpfW9uQWRkV3hzRXZlbnQodCxuLHIsYSl7dC5wYXJlbnROb2RlJiZ5VCh0aGlzLHQubm9kZUlkLG4scixhKX1vblJlbW92ZUV2ZW50KHQsbil7dC5wYXJlbnROb2RlJiZ3VCh0aGlzLHQubm9kZUlkLG4pfW9uU2V0QXR0cmlidXRlKHQsbixyKXt0LnBhcmVudE5vZGUmJkFUKHRoaXMsdC5ub2RlSWQsbixyKX1vblJlbW92ZUF0dHJpYnV0ZSh0LG4pe3QucGFyZW50Tm9kZSYmQ1QodGhpcyx0Lm5vZGVJZCxuKX1vblRleHRDb250ZW50KHQsbil7dC5wYXJlbnROb2RlJiZqZyh0aGlzLHQubm9kZUlkLG4pfW9uTm9kZVZhbHVlKHQsbil7dC5wYXJlbnROb2RlJiZqZyh0aGlzLHQubm9kZUlkLG4pfWdlbklkKCl7cmV0dXJuIHRoaXMuX2lkKyt9cHVzaCh0LG4pe2lmKCF0aGlzLmlzVW5tb3VudGVkKXtzd2l0Y2godFswXSl7Y2FzZSB0ZS5BQ1RJT05fVFlQRV9DUkVBVEU6dGhpcy5fY3JlYXRlQWN0aW9uTWFwLnNldCh0WzFdLHQpO2JyZWFrO2Nhc2UgdGUuQUNUSU9OX1RZUEVfSU5TRVJUOmxldCByPXRoaXMuX2NyZWF0ZUFjdGlvbk1hcC5nZXQodFsxXSk7cj8oclszXT10WzJdLHJbNF09dFszXSxuJiYocls1XT1uKSk6KG4mJih0WzRdPW4pLHRoaXMudXBkYXRlQWN0aW9ucy5wdXNoKHQpKTticmVha310WzBdIT09dGUuQUNUSU9OX1RZUEVfSU5TRVJUJiZ0aGlzLnVwZGF0ZUFjdGlvbnMucHVzaCh0KSx0aGlzLl91cGRhdGluZ3x8KHRoaXMuX3VwZGF0aW5nPSEwLEVuLnF1ZXVlUG9zdEZsdXNoQ2IodGhpcy5fdXBkYXRlKSl9fXJlc3RvcmUoKXt0aGlzLmNsZWFyKCksdGhpcy5zZXR1cCgpLHRoaXMuc2Nyb2xsQWN0aW9uJiZ0aGlzLnB1c2godGhpcy5zY3JvbGxBY3Rpb24pO2xldCB0PW49Pnt0aGlzLm9uQ3JlYXRlKG4sbi5ub2RlTmFtZSksdGhpcy5vbkluc2VydEJlZm9yZShuLnBhcmVudE5vZGUsbixudWxsKSxuLmNoaWxkTm9kZXMuZm9yRWFjaChyPT57dChyKX0pfTt0aGlzLmNoaWxkTm9kZXMuZm9yRWFjaChuPT50KG4pKSx0aGlzLnB1c2godGhpcy5jcmVhdGVkQWN0aW9uKX1zZXR1cCgpe3RoaXMuc2VuZChbdGhpcy5jcmVhdGVBY3Rpb25dKX11cGRhdGUoKXtsZXR7ZGljdHM6dCx1cGRhdGVBY3Rpb25zOm4sX2NyZWF0ZUFjdGlvbk1hcDpyfT10aGlzO3RoaXMuX2NyZWF0ZWR8fCh0aGlzLl9jcmVhdGVkPSEwLG4ucHVzaCh0aGlzLmNyZWF0ZWRBY3Rpb24pKSxuLmxlbmd0aCYmKHQubGVuZ3RoJiZuLnVuc2hpZnQoW1hDLHRdKSx0aGlzLnNlbmQobikpLHRoaXMuY2xlYXIoKX1jbGVhcigpe3RoaXMuZGljdHMubGVuZ3RoPTAsdGhpcy51cGRhdGVBY3Rpb25zLmxlbmd0aD0wLHRoaXMuX3VwZGF0aW5nPSExLHRoaXMuX2NyZWF0ZUFjdGlvbk1hcC5jbGVhcigpfXNlbmQodCl7c3QucHVibGlzaEhhbmRsZXIobGcsdCx0aGlzLnBhZ2VJZCl9ZmlyZUV2ZW50KHQsbil7bGV0IHI9SGcodCx0aGlzKTtyJiZyLmRpc3BhdGNoRXZlbnQobil9fWZ1bmN0aW9uIHBUKGUpe2xldCB0PWNvKGUpO3JldHVybiB0P3QuX19wYWdlX2NvbnRhaW5lcl9fOm51bGx9ZnVuY3Rpb24gUXUoZSx0LG4pe2lmKHR5cGVvZiBuPT0ibnVtYmVyIiYmKG49cFQobikpLG5bZV09PT10KXJldHVybiBuO2xldHtjaGlsZE5vZGVzOnJ9PW47Zm9yKGxldCBhPTA7YTxyLmxlbmd0aDthKyspe2xldCB1PVF1KGUsdCxyW2FdKTtpZih1KXJldHVybiB1fXJldHVybiBudWxsfWZ1bmN0aW9uIEhnKGUsdCl7cmV0dXJuIFF1KCJub2RlSWQiLGUsdCl9ZnVuY3Rpb24gdlQoZSx0KXtyZXR1cm4gUXUoIm5vZGVOYW1lIixlLnRvVXBwZXJDYXNlKCksdCl9ZnVuY3Rpb24gbVQoZSx0LG4pe2UucHVzaChbdGUuQUNUSU9OX1RZUEVfQ1JFQVRFLHQsZS5hZGREaWN0KG4pLC0xLC0xXSl9ZnVuY3Rpb24gX1QoZSx0LG4scil7bGV0IGE9dC50b0pTT04oe2F0dHI6ITAsbm9ybWFsaXplOmUubm9ybWFsaXplRGljdH0pO2UucHVzaChbdGUuQUNUSU9OX1RZUEVfSU5TRVJULHQubm9kZUlkLG4scl0sT2JqZWN0LmtleXMoYSkubGVuZ3RoP2E6dm9pZCAwKX1mdW5jdGlvbiBiVChlLHQpe2UucHVzaChbdGUuQUNUSU9OX1RZUEVfUkVNT1ZFLHRdKX1mdW5jdGlvbiBFVChlLHQsbixyKXtlLnB1c2goW3RlLkFDVElPTl9UWVBFX0FERF9FVkVOVCx0LGUuYWRkRGljdChuKSxyXSl9ZnVuY3Rpb24geVQoZSx0LG4scixhKXtlLnB1c2goW3RlLkFDVElPTl9UWVBFX0FERF9XWFNfRVZFTlQsdCxlLmFkZERpY3QobiksZS5hZGREaWN0KHIpLGFdKX1mdW5jdGlvbiB3VChlLHQsbil7ZS5wdXNoKFt0ZS5BQ1RJT05fVFlQRV9SRU1PVkVfRVZFTlQsdCxlLmFkZERpY3QobildKX1mdW5jdGlvbiBTVChlLHQsbil7cmV0dXJuIHQ9PT0ic3R5bGUiJiZZLmlzUGxhaW5PYmplY3Qobik/ZS5ub3JtYWxpemVEaWN0KG4pOmUuYWRkRGljdChuKX1mdW5jdGlvbiBBVChlLHQsbixyKXtlLnB1c2goW3RlLkFDVElPTl9UWVBFX1NFVF9BVFRSSUJVVEUsdCxlLmFkZERpY3QobiksU1QoZSxuLHIpXSl9ZnVuY3Rpb24gQ1QoZSx0LG4pe2UucHVzaChbdGUuQUNUSU9OX1RZUEVfUkVNT1ZFX0FUVFJJQlVURSx0LGUuYWRkRGljdChuKV0pfWZ1bmN0aW9uIGpnKGUsdCxuKXtlLnB1c2goW3RlLkFDVElPTl9UWVBFX1NFVF9URVhULHQsZS5hZGREaWN0KG4pXSl9ZnVuY3Rpb24gT1QoZSx0LG4pe3JldHVybiBuZXcgZ1QoZSx0LG4pfWZ1bmN0aW9uIHpnKGUpe2xldCB0PWUuc2V0dXA7cmV0dXJuIGUuaW5oZXJpdEF0dHJzPSExLGUuc2V0dXA9KG4scik9PntsZXR7YXR0cnM6e19fcGFnZUlkOmEsX19wYWdlUGF0aDp1LF9fcGFnZVF1ZXJ5OmgsX19wYWdlSW5zdGFuY2U6Yn19PXIsTz1Fbi5nZXRDdXJyZW50SW5zdGFuY2UoKS5wcm94eTtpZihHZShPLGIpLGZuKFdnKGEsTyxiKSksRW4ub25Nb3VudGVkKCgpPT57RW4ubmV4dFRpY2soKCk9PntqbihPLHRlLk9OX1JFQURZKX0pfSksRW4ub25CZWZvcmVVbm1vdW50KCgpPT57am4oTyx0ZS5PTl9VTkxPQUQpfSksdClyZXR1cm4gdChoLHIpfSxlfWZ1bmN0aW9uIFdnKGUsdCxuKXtsZXQgcj0oKT0+bC53ZWJ2aWV3LmdldFdlYnZpZXdCeUlkKGUrIiIpO3JldHVybiB0LiRnZXRBcHBXZWJ2aWV3PXIsdC4kLmN0eC4kc2NvcGU9eyRnZXRBcHBXZWJ2aWV3OnJ9LHQuZ2V0T3BlbmVyRXZlbnRDaGFubmVsPSgpPT4obi5ldmVudENoYW5uZWx8fChuLmV2ZW50Q2hhbm5lbD1uZXcgdGUuRXZlbnRDaGFubmVsKGUpKSxuLmV2ZW50Q2hhbm5lbCksdH1mdW5jdGlvbiBUVChlKXtyZXR1cm4gWS5pc0Z1bmN0aW9uKGUpfWxldCBHZz1uZXcgTWFwO2Z1bmN0aW9uIFBUKGUsdCl7R2cuc2V0KGUsdGUub25jZShOVCh0KSkpfWZ1bmN0aW9uIElUKGUsdCxuLHIsYSl7bGV0IHU9T1QoZSxhLCEwKSxoPU1vKCksYj1HZy5nZXQodCkoKSxVPU89PmgubW91bnRQYWdlKE8se19fcGFnZUlkOmUsX19wYWdlUGF0aDp0LF9fcGFnZVF1ZXJ5Om4sX19wYWdlSW5zdGFuY2U6cn0sdSk7cmV0dXJuIFkuaXNQcm9taXNlKGIpP2IudGhlbihPPT5VKE8pKTpVKGIpfWZ1bmN0aW9uIE5UKGUpe3JldHVybigpPT5UVChlKT9lKCkudGhlbih0PT56Zyh0KSk6emcoZSl9bGV0IFlnPSExO2Z1bmN0aW9uIHFnKCl7aWYoWWcpcmV0dXJuO1lnPSEwO2xldCBlLHQ7aWYoZy5yZXF1aXJlTW9kdWxlKCJwbHVzIikuZ2V0UmVkaXJlY3RJbmZvKXtsZXR7cGF0aDp1LHF1ZXJ5OmgscmVmZXJyZXJJbmZvOmJ9PVJ0KCk7dSYmKGU9dSx0PWgpLFQucmVmZXJyZXJJbmZvPWJ9ZWxzZXtsZXQgdT1sLnJ1bnRpbWUuYXJndW1lbnRzO2lmKCF1KXJldHVybjt0cnl7bGV0IGg9SlNPTi5wYXJzZSh1KTtlPWgucGF0aHx8aC5wYXRoTmFtZSx0PWgucXVlcnk/Ij8iK2gucXVlcnk6IiJ9Y2F0Y2goaCl7fX1pZighZXx8ZT09PVQuZW50cnlQYWdlUGF0aCl7dCYmKFQuZW50cnlQYWdlUXVlcnk9dCk7cmV0dXJufWxldCByPXRlLmFkZExlYWRpbmdTbGFzaChlKSxhPUlpKHIpOyFhfHwoYS5tZXRhLmlzVGFiQmFyfHwoVC5yZWFsRW50cnlQYWdlUGF0aD1ULnJlYWxFbnRyeVBhZ2VQYXRofHxULmVudHJ5UGFnZVBhdGgpLFQuZW50cnlQYWdlUGF0aD1lLFQuZW50cnlQYWdlUXVlcnk9dCl9ZnVuY3Rpb24gS2coZSx0KXtsZXQgbj1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KElpKGUpKSk7cmV0dXJuIG4ubWV0YT1abihuLm1ldGEpLHQhPT0icHJlbG9hZFBhZ2UiJiYhVC5yZWFsRW50cnlQYWdlUGF0aCYmKHQ9PT0icmVMYXVuY2gifHxWbigpLmxlbmd0aD09PTApP24ubWV0YS5pc1F1aXQ9ITA6bi5tZXRhLmlzVGFiQmFyfHwobi5tZXRhLmlzUXVpdD0hMSksbn1sZXQga2E9e307ZnVuY3Rpb24ga1QoZSl7bGV0IHQ9T2JqZWN0LmtleXMoa2EpLmZpbmQobj0+a2Fbbl0uaWQ9PT1lLmlkKTt0JiZkZWxldGUga2FbdF19ZnVuY3Rpb24gUlQoe3VybDplfSl7bGV0IHQ9a2FbZV07cmV0dXJuIHQmJih0Ll9fcGFnZV9fJiZWbigpLmZpbmQobj0+bj09PXQuX19wYWdlX18pP3QuX19wcmVsb2FkX189ITE6dC5jbG9zZSgibm9uZSIpLGRlbGV0ZSBrYVtlXSksdH1mdW5jdGlvbiB4VCh7dXJsOmUscGF0aDp0LHF1ZXJ5Om59KXtpZigha2FbZV0pe2xldCByPUtnKHQsInByZWxvYWRQYWdlIik7a2FbZV09RGcoe3BhdGg6dCxyb3V0ZU9wdGlvbnM6cixxdWVyeTpuLHdlYnZpZXdFeHRyYXM6e19fcHJlbG9hZF9fOiEwfX0pfXJldHVybiBrYVtlXX1mdW5jdGlvbiBmYyh7dXJsOmUscGF0aDp0LHF1ZXJ5Om4sb3BlblR5cGU6cix3ZWJ2aWV3OmEsbnZ1ZVBhZ2VWbTp1LGV2ZW50Q2hhbm5lbDpofSl7aWYoYSYmcWcoKSxrYVtlXSl7YT1rYVtlXTtsZXQgd2U9YTtpZih3ZS5fX3BhZ2VfXylpZihWbigpLmZpbmQoa2U9PmtlPT09d2UuX19wYWdlX18pKWE9dm9pZCAwO2Vsc2UgcmV0dXJuIGgmJih3ZS5fX3BhZ2VfXy4kcGFnZS5ldmVudENoYW5uZWw9aCksZm4od2UuX19wYWdlX18pLHdlfWxldCBiPUtnKHQscik7YT8oYT1sLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQoYS5pZCksYS5udnVlPWIubWV0YS5pc05WdWUpOmE9RGcoe3BhdGg6dCxyb3V0ZU9wdGlvbnM6YixxdWVyeTpufSksYi5tZXRhLmlkPXBhcnNlSW50KGEuaWQpLCEhYi5tZXRhLmlzVGFiQmFyJiZsaS5hcHBlbmQoYSksY1QoYSx0LG4sYi5tZXRhKTtsZXQgTz10LnNsaWNlKDEpO2EuX191bmlhcHBfcm91dGU9TztsZXQgRD1XbyhyLGUsbixiLm1ldGEsaCksZ2U9cGFyc2VJbnQoYS5pZCk7cmV0dXJuIGEubnZ1ZT91P01UKGdlLHUsRCk6TFQoZ2UsYSxEKTpJVChnZSxPLG4sRCxCVChiKSksYX1mdW5jdGlvbiBCVCh7bWV0YTplfSl7bGV0IHQ9SHUoKSx7cGxhdGZvcm06bixwaXhlbFJhdGlvOnIsd2luZG93V2lkdGg6YX09Tm8oKTtyZXR1cm57Y3NzOiEwLHJvdXRlOmUucm91dGUsdmVyc2lvbjoxLGxvY2FsZToiIixwbGF0Zm9ybTpuLHBpeGVsUmF0aW86cix3aW5kb3dXaWR0aDphLGRpc2FibGVTY3JvbGw6ZS5kaXNhYmxlU2Nyb2xsPT09ITAsb25QYWdlU2Nyb2xsOiExLG9uUGFnZVJlYWNoQm90dG9tOiExLG9uUmVhY2hCb3R0b21EaXN0YW5jZTpZLmhhc093bihlLCJvblJlYWNoQm90dG9tRGlzdGFuY2UiKT9lLm9uUmVhY2hCb3R0b21EaXN0YW5jZTp0ZS5PTl9SRUFDSF9CT1RUT01fRElTVEFOQ0Usc3RhdHVzYmFySGVpZ2h0OnQsd2luZG93VG9wOmUubmF2aWdhdGlvbkJhci50eXBlPT09ImZsb2F0Ij90K3RlLk5BVkJBUl9IRUlHSFQ6MCx3aW5kb3dCb3R0b206bGkuaW5kZXhPZihlLnJvdXRlKT49MCYmbGkuY292ZXI/bGkuaGVpZ2h0OjB9fWZ1bmN0aW9uIE1UKGUsdCxuKXtHZSh0LG4pLGZuKFdnKGUsdCxuKSksZT09PTEmJihULnNwbGFzaHNjcmVlbiYmVC5zcGxhc2hzY3JlZW4uYXV0b2Nsb3NlJiYhVC5zcGxhc2hzY3JlZW4uYWx3YXlzU2hvd0JlZm9yZVJlbmRlciYmbC5uYXZpZ2F0b3IuY2xvc2VTcGxhc2hzY3JlZW4oKSxULm9uUmVhZHkoZnVuY3Rpb24oKXtVZygpfSkpfWZ1bmN0aW9uIExUKGUsdCxuKXtsZXQgcj17JDp7fSwkZ2V0QXBwV2Vidmlldygpe3JldHVybiB0fSxnZXRPcGVuZXJFdmVudENoYW5uZWwoKXtyZXR1cm4gbi5ldmVudENoYW5uZWx8fChuLmV2ZW50Q2hhbm5lbD1uZXcgdGUuRXZlbnRDaGFubmVsKGUpKSxuLmV2ZW50Q2hhbm5lbH0sX19zZXR1cChhLHUpe2EuJGdldEFwcFdlYnZpZXc9KCk9PnQsYS5nZXRPcGVuZXJFdmVudENoYW5uZWw9dS5nZXRPcGVuZXJFdmVudENoYW5uZWwsR2UoYSxuKSx0Ll9fcHJlbG9hZF9fJiYodC5fX3BhZ2VfXz1hKTtsZXQgaD1xcigpLGI9aC5maW5kSW5kZXgoVT0+VT09PXUpO2I+LTEmJmguc3BsaWNlKGIsMSxhKX19O0dlKHIsbiksdC5fX3ByZWxvYWRfXz90Ll9fcGFnZV9fPXI6Zm4ocil9bGV0IEpnPShlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldHt1cmw6cixldmVudHM6YSxhbmltYXRpb25UeXBlOnUsYW5pbWF0aW9uRHVyYXRpb246aH09ZSx7cGF0aDpiLHF1ZXJ5OlV9PXRlLnBhcnNlVXJsKHIpLFtPLERdPVZUKGIsdSxoKTtXYyhiLCgpPT57RlQoe3VybDpyLHBhdGg6YixxdWVyeTpVLGV2ZW50czphLGFuaVR5cGU6TyxhbmlEdXJhdGlvbjpEfSkudGhlbih0KS5jYXRjaChuKX0sZS5vcGVuVHlwZT09PSJhcHBMYXVuY2giKX0sRFQ9eWUoQnUsSmcsUUUsYXkpO2Z1bmN0aW9uIEZUKHt1cmw6ZSxwYXRoOnQscXVlcnk6bixldmVudHM6cixhbmlUeXBlOmEsYW5pRHVyYXRpb246dX0pe2puKHRlLk9OX0hJREUpO2xldCBoPW5ldyB0ZS5FdmVudENoYW5uZWwoSWcoKSsxLHIpO3JldHVybiBuZXcgUHJvbWlzZShiPT57WWMoZmMoe3VybDplLHBhdGg6dCxxdWVyeTpuLG9wZW5UeXBlOiJuYXZpZ2F0ZVRvIixldmVudENoYW5uZWw6aH0pLGEsdSwoKT0+e2Ioe2V2ZW50Q2hhbm5lbDpofSl9KSxaYSgpfSl9ZnVuY3Rpb24gVlQoZSx0LG4pe2xldHtnbG9iYWxTdHlsZTpyfT1ULGE9RWEoZSk7cmV0dXJuW3R8fGEuYW5pbWF0aW9uVHlwZXx8ci5hbmltYXRpb25UeXBlfHxNTyxufHxhLmFuaW1hdGlvbkR1cmF0aW9ufHxyLmFuaW1hdGlvbkR1cmF0aW9ufHx6Y119bGV0ICRUPXllKE11LCh7dXJsOmV9LHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldHtwYXRoOnIscXVlcnk6YX09dGUucGFyc2VVcmwoZSk7V2MociwoKT0+e1VUKHt1cmw6ZSxwYXRoOnIscXVlcnk6YX0pLnRoZW4odCkuY2F0Y2gobil9KX0sdHksc3kpO2Z1bmN0aW9uIFVUKHt1cmw6ZSxwYXRoOnQscXVlcnk6bn0pe2xldCByPV9yKCk7cmV0dXJuIHImJnVvKHIpLG5ldyBQcm9taXNlKGE9PntZYyhmYyh7dXJsOmUscGF0aDp0LHF1ZXJ5Om4sb3BlblR5cGU6InJlZGlyZWN0VG8ifSksIm5vbmUiLDAsKCk9PntpZihyKXtsZXQgdT1yLiRnZXRBcHBXZWJ2aWV3KCk7dS5fX3ByZWxvYWRfXyYma1QodSksdS5jbG9zZSgibm9uZSIpfWEodm9pZCAwKX0pLFphKCl9KX1sZXQgSFQ9KHt1cmw6ZX0se3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0e3BhdGg6cixxdWVyeTphfT10ZS5wYXJzZVVybChlKTtXYyhyLCgpPT57alQoe3VybDplLHBhdGg6cixxdWVyeTphfSkudGhlbih0KS5jYXRjaChuKX0pfTtmdW5jdGlvbiBqVCh7dXJsOmUscGF0aDp0LHF1ZXJ5Om59KXtyZXR1cm4gbmV3IFByb21pc2Uocj0+e2xldCBhPXFyKCkuc2xpY2UoMCk7emUuZmluZChoPT5oLnBhdGg9PT10KS5tZXRhLmlzVGFiQmFyJiZsaS5zd2l0Y2hUYWIodC5zbGljZSgxKSksWWMoZmMoe3VybDplLHBhdGg6dCxxdWVyeTpuLG9wZW5UeXBlOiJyZUxhdW5jaCJ9KSwibm9uZSIsMCwoKT0+e2EuZm9yRWFjaChoPT4kZyhoLCJub25lIikpLHIodm9pZCAwKX0pLFphKCl9KX1sZXQgelQ9eWUodmgsSFQsbnksbHkpLFpnPShlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldHt1cmw6cn09ZSx7cGF0aDphLHF1ZXJ5OnV9PXRlLnBhcnNlVXJsKHIpO1djKGEsKCk9PntHVCh7dXJsOnIscGF0aDphLHF1ZXJ5OnV9KS50aGVuKHQpLmNhdGNoKG4pfSxlLm9wZW5UeXBlPT09ImFwcExhdW5jaCIpfSxXVD15ZShOYyxaZyxyeSxjeSk7ZnVuY3Rpb24gR1Qoe3VybDplLHBhdGg6dCxxdWVyeTpufSl7bGkuc3dpdGNoVGFiKHQuc2xpY2UoMSkpO2xldCByPVZuKCksYT1yLmxlbmd0aCx1PSExLGg9ITEsYjthPj0xJiYoYj1yW2EtMV0sYiYmIWIuJC5fX2lzVGFiQmFyPyhoPSEwLHIucmV2ZXJzZSgpLmZvckVhY2goTz0+eyFPLiQuX19pc1RhYkJhciYmTyE9PWImJiRnKE8sIm5vbmUiKX0pLHVvKGIpLGsoKCk9PntiLiRwYWdlLm9wZW5UeXBlPT09InJlZGlyZWN0VG8iP0pzKGIuJGdldEFwcFdlYnZpZXcoKSxDZyx6Yyk6SnMoYi4kZ2V0QXBwV2VidmlldygpLCJhdXRvIil9LDEwMCkpOnU9ITApO2xldCBVO3JldHVybiBxcigpLmZvckVhY2goTz0+e3RlLmFkZExlYWRpbmdTbGFzaChPLnJvdXRlKT09PXQ/KE8uJC5fX2lzQWN0aXZlfHwoaD0hMCksTy4kLl9faXNBY3RpdmU9ITAsVT1PKTpPLiQuX19pc1RhYkJhciYmKE8uJC5fX2lzQWN0aXZlPSExKX0pLGI9PT1VJiYodT0hMSksYiYmdSYmam4oYix0ZS5PTl9ISURFKSxuZXcgUHJvbWlzZShPPT57aWYoVSl7bGV0IEQ9VS4kZ2V0QXBwV2VidmlldygpO0Quc2hvdygibm9uZSIpLGgmJiFELl9fcHJlbG9hZF9fJiZqbihVLHRlLk9OX1NIT1cpLFphKCksTyh2b2lkIDApfWVsc2UgWWMoZmMoe3VybDplLHBhdGg6dCxxdWVyeTpuLG9wZW5UeXBlOiJzd2l0Y2hUYWIifSksIm5vbmUiLDAsKCk9PntaYSgpLE8odm9pZCAwKX0sNzApfSl9bGV0IFlUPU10KG1oLCh7dXJsOmV9KT0+e2xldCB0PVJUKHt1cmw6ZX0pO3JldHVybiB0P3tpZDp0LmlkLHVybDplLGVyck1zZzoidW5QcmVsb2FkUGFnZTpvayJ9Ont1cmw6ZSxlcnJNc2c6InVuUHJlbG9hZFBhZ2U6ZmFpbCBub3QgZm91bmQifX0sb3kpLHFUPXllKEx1LCh7dXJsOmV9LHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPWUuc3BsaXQoIj8iKSxhPXJbMF0sdT10ZS5wYXJzZVF1ZXJ5KHJbMV18fCIiKSxoPXhUKHt1cmw6ZSxwYXRoOmEscXVlcnk6dX0pO3Qoe2lkOmguaWQsdXJsOmUsZXJyTXNnOiJwcmVsb2FkUGFnZTpvayJ9KX0saXkpO3ZhciBLVD17X19wcm90b19fOm51bGwsc2VuZEhvc3RFdmVudDpFZyxuYXZpZ2F0ZVRvTWluaVByb2dyYW06Yk8sb25Ib3N0RXZlbnRSZWNlaXZlOndnLG9uTmF0aXZlRXZlbnRSZWNlaXZlOkVPLF9fbG9nX186d08sbmF2aWdhdGVUbzpEVCxyZUxhdW5jaDp6VCxzd2l0Y2hUYWI6V1QsdXB4MnB4OkVtLGFkZEludGVyY2VwdG9yOk9tLHJlbW92ZUludGVyY2VwdG9yOlRtLGludGVyY2VwdG9yczpQbSxhcnJheUJ1ZmZlclRvQmFzZTY0OkJuLGJhc2U2NFRvQXJyYXlCdWZmZXI6SG4sY3JlYXRlSW50ZXJzZWN0aW9uT2JzZXJ2ZXI6RV8sY3JlYXRlTWVkaWFRdWVyeU9ic2VydmVyOndfLGNyZWF0ZVNlbGVjdG9yUXVlcnk6UF8sY3JlYXRlVmlkZW9Db250ZXh0OkttLGNyZWF0ZU1hcENvbnRleHQ6Wm0sY3JlYXRlQW5pbWF0aW9uOkJfLG9uV2luZG93UmVzaXplOkZfLG9mZldpbmRvd1Jlc2l6ZTpWXyxvblRhYkJhck1pZEJ1dHRvblRhcDpNXyxjcmVhdGVDYW52YXNDb250ZXh0OmRfLGNhbnZhc0dldEltYWdlRGF0YTpoXyxjYW52YXNQdXRJbWFnZURhdGE6Z18sY2FudmFzVG9UZW1wRmlsZVBhdGg6cF8sZ2V0U2VsZWN0ZWRUZXh0UmFuZ2U6el8sZ2V0TG9jYWxlOlFsLHNldExvY2FsZTpIXywkb246TG0sJG9mZjpGbSwkb25jZTpEbSwkZW1pdDpWbSxvbkNyZWF0ZVZ1ZUFwcDp0ZS5vbkNyZWF0ZVZ1ZUFwcCxvbkxvY2FsZUNoYW5nZTpVXyxzZXRQYWdlTWV0YTpqXyxnZXRFbnRlck9wdGlvbnNTeW5jOm5iLGdldExhdW5jaE9wdGlvbnNTeW5jOnJiLGdldFB1c2hDbGllbnRJZDppYixvblB1c2hNZXNzYWdlOm9iLG9mZlB1c2hNZXNzYWdlOmFiLG9uQXBwSGlkZTplYixvbkFwcFNob3c6WF8sb25FcnJvcjpKXyxvblBhZ2VOb3RGb3VuZDpxXyxvblVuaGFuZGxlZFJlamVjdGlvbjpHXyxvZmZBcHBIaWRlOnRiLG9mZkFwcFNob3c6UV8sb2ZmRXJyb3I6Wl8sb2ZmUGFnZU5vdEZvdW5kOktfLG9mZlVuaGFuZGxlZFJlamVjdGlvbjpZXyxpbnZva2VQdXNoQ2FsbGJhY2s6UnUsc2V0U3RvcmFnZVN5bmM6WXcsc2V0U3RvcmFnZTpxdyxnZXRTdG9yYWdlU3luYzpLdyxnZXRTdG9yYWdlOkp3LHJlbW92ZVN0b3JhZ2VTeW5jOlp3LHJlbW92ZVN0b3JhZ2U6WHcsY2xlYXJTdG9yYWdlU3luYzpRdyxjbGVhclN0b3JhZ2U6ZVMsZ2V0U3RvcmFnZUluZm9TeW5jOkFoLGdldFN0b3JhZ2VJbmZvOnRTLGdldEZpbGVJbmZvOm5TLHNhdmVGaWxlOmFTLGdldFNhdmVkRmlsZUxpc3Q6Y1MsZ2V0U2F2ZWRGaWxlSW5mbzp1UyxyZW1vdmVTYXZlZEZpbGU6ZlMsb3BlbkRvY3VtZW50OmRTLGNhbklVc2U6aFMsZ2V0RGV2aWNlSW5mbzpraCxnZXRBcHBCYXNlSW5mbzpSaCxnZXRTeXN0ZW1JbmZvU3luYzp4aCxnZXRTeXN0ZW1JbmZvOnlTLG9uQ29tcGFzc0NoYW5nZTp3UyxvZmZDb21wYXNzQ2hhbmdlOlNTLHN0YXJ0Q29tcGFzczpCaCxzdG9wQ29tcGFzczpNaCx2aWJyYXRlU2hvcnQ6QVMsdmlicmF0ZUxvbmc6Q1Msb25BY2NlbGVyb21ldGVyQ2hhbmdlOk9TLG9mZkFjY2VsZXJvbWV0ZXJDaGFuZ2U6VFMsc3RhcnRBY2NlbGVyb21ldGVyOkxoLHN0b3BBY2NlbGVyb21ldGVyOkRoLG9uQmx1ZXRvb3RoRGV2aWNlRm91bmQ6UFMsb25CbHVldG9vdGhBZGFwdGVyU3RhdGVDaGFuZ2U6SVMsb25CTEVDb25uZWN0aW9uU3RhdGVDaGFuZ2U6TlMsb25CTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlOmtTLG9wZW5CbHVldG9vdGhBZGFwdGVyOlJTLGNsb3NlQmx1ZXRvb3RoQWRhcHRlcjp4UyxnZXRCbHVldG9vdGhBZGFwdGVyU3RhdGU6QlMsc3RhcnRCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5Ok1TLHN0b3BCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5OkxTLGdldEJsdWV0b290aERldmljZXM6RFMsZ2V0Q29ubmVjdGVkQmx1ZXRvb3RoRGV2aWNlczpGUyxjcmVhdGVCTEVDb25uZWN0aW9uOlZTLGNsb3NlQkxFQ29ubmVjdGlvbjokUyxnZXRCTEVEZXZpY2VTZXJ2aWNlczpVUyxnZXRCTEVEZXZpY2VDaGFyYWN0ZXJpc3RpY3M6SFMsbm90aWZ5QkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZUNoYW5nZTpqUyxyZWFkQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZTp6Uyx3cml0ZUJMRUNoYXJhY3RlcmlzdGljVmFsdWU6V1Msc2V0QkxFTVRVOkdTLGdldEJMRURldmljZVJTU0k6WVMsb25CZWFjb25VcGRhdGU6cVMsb25CZWFjb25TZXJ2aWNlQ2hhbmdlOktTLGdldEJlYWNvbnM6SlMsc3RhcnRCZWFjb25EaXNjb3Zlcnk6WlMsc3RvcEJlYWNvbkRpc2NvdmVyeTpYUyxtYWtlUGhvbmVDYWxsOlFTLGFkZFBob25lQ29udGFjdDpuQSxnZXRDbGlwYm9hcmREYXRhOnJBLHNldENsaXBib2FyZERhdGE6aUEsb25OZXR3b3JrU3RhdHVzQ2hhbmdlOm9BLG9mZk5ldHdvcmtTdGF0dXNDaGFuZ2U6YUEsZ2V0TmV0d29ya1R5cGU6VWgsY2hlY2tJc1N1cHBvcnRTb3RlckF1dGhlbnRpY2F0aW9uOnNBLGNoZWNrSXNTb3RlckVucm9sbGVkSW5EZXZpY2U6bEEsc3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOmNBLHNjYW5Db2RlOnVBLG9uVGhlbWVDaGFuZ2U6ZkEsZ2V0U2NyZWVuQnJpZ2h0bmVzczpkQSxzZXRTY3JlZW5CcmlnaHRuZXNzOmhBLHNldEtlZXBTY3JlZW5PbjpnQSxnZXRXaW5kb3dJbmZvOk5oLGdldFN5c3RlbVNldHRpbmc6cEEsZ2V0QXBwQXV0aG9yaXplU2V0dGluZzpHaCxvcGVuQXBwQXV0aG9yaXplU2V0dGluZzp2QSxnZXRJbWFnZUluZm86bUEsZ2V0VmlkZW9JbmZvOl9BLHByZXZpZXdJbWFnZTpiQSxjbG9zZVByZXZpZXdJbWFnZTpFQSxnZXRSZWNvcmRlck1hbmFnZXI6U0Esc2F2ZVZpZGVvVG9QaG90b3NBbGJ1bTpBQSxzYXZlSW1hZ2VUb1Bob3Rvc0FsYnVtOkNBLGNvbXByZXNzSW1hZ2U6T0EsY29tcHJlc3NWaWRlbzpUQSxjaG9vc2VJbWFnZTpJQSxjaG9vc2VWaWRlbzpOQSxzaG93S2V5Ym9hcmQ6a0EsaGlkZUtleWJvYXJkOlJBLG9uS2V5Ym9hcmRIZWlnaHRDaGFuZ2U6eEEsb2ZmS2V5Ym9hcmRIZWlnaHRDaGFuZ2U6QkEsZG93bmxvYWRGaWxlOkxBLHJlcXVlc3Q6JEEsY29uZmlnTVRMUzpVQSxjb25uZWN0U29ja2V0OldBLHNlbmRTb2NrZXRNZXNzYWdlOkdBLGNsb3NlU29ja2V0OllBLG9uU29ja2V0T3BlbjpxQSxvblNvY2tldEVycm9yOktBLG9uU29ja2V0TWVzc2FnZTpKQSxvblNvY2tldENsb3NlOlpBLHVwbG9hZEZpbGU6UUEsY3JlYXRlSW5uZXJBdWRpb0NvbnRleHQ6bEMsZ2V0QmFja2dyb3VuZEF1ZGlvTWFuYWdlcjpiQyxjcmVhdGVMaXZlUHVzaGVyQ29udGV4dDp3QyxnZXRMb2NhdGlvbjpDQyxjaG9vc2VMb2NhdGlvbjpPQyxvcGVuTG9jYXRpb246VEMsc2hvd01vZGFsOlBDLHNob3dBY3Rpb25TaGVldDpJQyxzaG93TG9hZGluZzpOQyxzaG93VG9hc3Q6a0MsaGlkZVRvYXN0OlJDLGhpZGVMb2FkaW5nOnhDLHN0YXJ0UHVsbERvd25SZWZyZXNoOkJDLHN0b3BQdWxsRG93blJlZnJlc2g6TUMsbG9hZEZvbnRGYWNlOkxDLHBhZ2VTY3JvbGxUbzpEQyxzZXROYXZpZ2F0aW9uQmFyVGl0bGU6RkMsc2hvd05hdmlnYXRpb25CYXJMb2FkaW5nOlZDLGhpZGVOYXZpZ2F0aW9uQmFyTG9hZGluZzokQyxzZXROYXZpZ2F0aW9uQmFyQ29sb3I6SEMsc2V0VGFiQmFyQmFkZ2U6akMsc2V0VGFiQmFySXRlbTp6QyxzZXRUYWJCYXJTdHlsZTpXQyxoaWRlVGFiQmFyOkdDLHNob3dUYWJCYXI6WUMsc2hvd1RhYkJhclJlZERvdDpxQyxyZW1vdmVUYWJCYXJCYWRnZTpLQyxoaWRlVGFiQmFyUmVkRG90OkpDLGdldFN1Yk5WdWVCeUlkOm5PLHJlc3RvcmVHbG9iYWw6aU8scmVxdWlyZUdsb2JhbDpvTyxnZXRQcm92aWRlcjphTyxsb2dpbjpoZyxnZXRVc2VySW5mbzpzTyxnZXRVc2VyUHJvZmlsZTpsTyxwcmVMb2dpbjpwZyxjbG9zZUF1dGhWaWV3Om1nLGdldENoZWNrQm94U3RhdGU6X2csZ2V0VW5pdmVyaWZ5TWFuYWdlcjpmTyxjcmVhdGVQdXNoTWVzc2FnZTpkTyxyZWdpc3RlclJ1bnRpbWU6aE8sc2hhcmU6dk8sc2hhcmVXaXRoU3lzdGVtOm1PLHJlcXVlc3RQYXltZW50Ol9PLHJlcXVpcmVOYXRpdmVQbHVnaW46SG8sc2VuZE5hdGl2ZUV2ZW50OkZoLGNyZWF0ZVJld2FyZGVkVmlkZW9BZDpUTyxjcmVhdGVGdWxsU2NyZWVuVmlkZW9BZDpJTyxjcmVhdGVJbnRlcnN0aXRpYWxBZDprTyxjcmVhdGVJbnRlcmFjdGl2ZUFkOkJPLG5hdmlnYXRlQmFjazpmVCxyZWRpcmVjdFRvOiRULHVuUHJlbG9hZFBhZ2U6WVQscHJlbG9hZFBhZ2U6cVR9O2xldCBKVD1ZLmV4dGVuZChjZSx7cHVibGlzaEhhbmRsZXI6WlR9KTtmdW5jdGlvbiBaVChlLHQsbil7dD1KU09OLnN0cmluZ2lmeSh0KSxZLmlzQXJyYXkobil8fChuPVtuXSk7bGV0IHI9YHR5cGVvZiBVbmlWaWV3SlNCcmlkZ2UgIT09ICd1bmRlZmluZWQnICYmIFVuaVZpZXdKU0JyaWRnZS5zdWJzY3JpYmVIYW5kbGVyKCIke2V9Iiwke3R9LF9fUEFHRV9JRF9fKWA7bi5mb3JFYWNoKGE9PntsZXQgdT1TdHJpbmcoYSksaD1sLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQodSk7aCYmaC5ldmFsSlMoci5yZXBsYWNlKCJfX1BBR0VfSURfXyIsdSkpfSl9ZnVuY3Rpb24gWFQoKXtsZXR7dGFiQmFyOmV9PVQ7aWYoIShlJiZlLmxpc3QmJmUubGlzdC5sZW5ndGgpKXJldHVybjtsZXR7ZW50cnlQYWdlUGF0aDpufT1UO2Uuc2VsZWN0ZWRJbmRleD0wO2xldCByPWUubGlzdC5maW5kSW5kZXgoYT0+YS5wYWdlUGF0aD09PW4pO2xpLmluaXQoZSwoYSx1KT0+e2d0LnN3aXRjaFRhYih7dXJsOnRlLmFkZExlYWRpbmdTbGFzaChhLnBhZ2VQYXRoKSxvcGVuVHlwZToic3dpdGNoVGFiIixmcm9tOiJ0YWJCYXIiLHN1Y2Nlc3MoKXtqbih0ZS5PTl9UQUJfSVRFTV9UQVAse2luZGV4OnUsdGV4dDphLnRleHQscGFnZVBhdGg6YS5wYWdlUGF0aH0pfX0pfSksciE9PS0xJiYoZS5zZWxlY3RlZEluZGV4PXIsciE9PTAmJmxpLnN3aXRjaFRhYihuKSl9ZnVuY3Rpb24gUVQoKXtsZXQgZT1sLmdsb2JhbEV2ZW50LHQ9Zy5yZXF1aXJlTW9kdWxlKCJnbG9iYWxFdmVudCIpLG49c3QuZW1pdDtnLmNvbmZpZy5wcmVsb2FkP2wua2V5LmFkZEV2ZW50TGlzdGVuZXIoR2ksWWkpOmUuYWRkRXZlbnRMaXN0ZW5lcigic3BsYXNoY2xvc2VkIiwoKT0+e2wua2V5LmFkZEV2ZW50TGlzdGVuZXIoR2ksWWkpfSksZS5hZGRFdmVudExpc3RlbmVyKCJwYXVzZSIsKCk9PntuKHRlLk9OX0FQUF9FTlRFUl9CQUNLR1JPVU5EKX0pLGUuYWRkRXZlbnRMaXN0ZW5lcigicmVzdW1lIiwoKT0+e2xldCBhPVJ0KCk7YSYmYS51c2VyQWN0aW9uJiZWZShhKSxuKHRlLk9OX0FQUF9FTlRFUl9GT1JFR1JPVU5ELGlzKCkpfSksdC5hZGRFdmVudExpc3RlbmVyKCJ1aXN0eWxlY2hhbmdlIixmdW5jdGlvbihhKXtsZXQgdT17dGhlbWU6YS51aXN0eWxlfTtuKHRlLk9OX1RIRU1FX0NIQU5HRSx1KX0pO2xldCByPTA7ZS5hZGRFdmVudExpc3RlbmVyKCJLZXlib2FyZEhlaWdodENoYW5nZSIsZnVuY3Rpb24oYSl7ciE9PWEuaGVpZ2h0JiYocj1hLmhlaWdodCxuKHRlLk9OX0tFWUJPQVJEX0hFSUdIVF9DSEFOR0Use2hlaWdodDpyfSkpfSksdC5hZGRFdmVudExpc3RlbmVyKEZPLGZ1bmN0aW9uKGEpe2EmJmEuZXZlbnQmJnlPKGEuZXZlbnQsYS5kYXRhKX0pLGUuYWRkRXZlbnRMaXN0ZW5lcigicGx1c01lc3NhZ2UiLFhnKSxlLmFkZEV2ZW50TGlzdGVuZXIoIldlYnZpZXdQb3N0TWVzc2FnZSIsWGcpfWZ1bmN0aW9uIFhnKHtkYXRhOmV9KXtlJiZlLnR5cGUmJnN0LnN1YnNjcmliZUhhbmRsZXIoInBsdXNNZXNzYWdlLiIrZS50eXBlLGUuYXJncyl9ZnVuY3Rpb24gUWcoZSx0LG49ITEpe3N0LnN1YnNjcmliZSgicGx1c01lc3NhZ2UuIitlLHQsbil9ZnVuY3Rpb24gZVAoZSl7V18oZS4kKTtsZXR7ZW50cnlQYWdlUGF0aDp0LGVudHJ5UGFnZVF1ZXJ5Om4scmVmZXJyZXJJbmZvOnJ9PVQsYT1UdCh7cGF0aDp0LHF1ZXJ5Om4scmVmZXJyZXJJbmZvOnJ9KTtqbihlLHRlLk9OX0xBVU5DSCxhKSxqbihlLHRlLk9OX1NIT1csYSk7bGV0IHU9Zy5yZXF1aXJlTW9kdWxlKCJwbHVzIikuZ2V0QXBwU3RhdGU7KHUmJk51bWJlcih1KCkpKT09PTImJmpuKGUsdGUuT05fSElERSxhKX1mdW5jdGlvbiBlcChlKXtyZXR1cm4gZT1lLnJlcGxhY2UoL1wvJC8sIiIpLGUuaW5kZXhPZigiXyIpPT09MD9sLmlvLmNvbnZlcnRMb2NhbEZpbGVTeXN0ZW1VUkwoZSk6ZX1mdW5jdGlvbiB0UCgpe2xldCBlPWVwKGtpKSx0PWVwKGFpKSxuPXQuc3BsaXQoIi8iKTtuLnBvcCgpO2xldCByPW4uam9pbigiLyIpO2wuaW8ucmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSTChsLmlvLmNvbnZlcnRBYnNvbHV0ZUZpbGVTeXN0ZW0ociksYT0+e2EuY3JlYXRlUmVhZGVyKCkucmVhZEVudHJpZXMoZnVuY3Rpb24oaCl7bGV0IGI9aDtiJiZiLmxlbmd0aCYmYi5mb3JFYWNoKGZ1bmN0aW9uKFUpe1UuaXNEaXJlY3RvcnkmJlUuZnVsbFBhdGguaW5kZXhPZihlKT09PTAmJlUuZnVsbFBhdGguaW5kZXhPZih0KSE9PTAmJlUucmVtb3ZlUmVjdXJzaXZlbHkoKX0pfSl9KX1sZXQgdHA9MCxMbD0wLEtjPW51bGwsWnM9bnVsbDtmdW5jdGlvbiBuUChlLHQpe2lmKEtjPW51bGwsWnMmJihTKFpzKSxacz1udWxsKSxlLnR5cGU9PT0ib25Gb2N1cyIpaWYoTGw+MCllLmRldGFpbC5oZWlnaHQ9TGw7ZWxzZXtacz1rKGZ1bmN0aW9uKCl7ZS5kZXRhaWwuaGVpZ2h0PUxsLHQoZSl9LHRwKSxLYz1mdW5jdGlvbigpe1pzJiYoUyhacyksWnM9bnVsbCksZS5kZXRhaWwuaGVpZ2h0PUxsLHQoZSl9O3JldHVybn10KGUpfWZ1bmN0aW9uIHJQKCl7dHA9bC5vcy5uYW1lLnRvTG93ZXJDYXNlKCk9PT0iYW5kcm9pZCI/MzAwOjcwMCxzdC5vbih0ZS5PTl9LRVlCT0FSRF9IRUlHSFRfQ0hBTkdFLHQ9PntpZihMbD10LmhlaWdodCxMbD4wKXtsZXQgbj1LYztLYz1udWxsLG4mJm4oKX19KX1mdW5jdGlvbiBpUChlLHQsbil7bGV0IHI9dC50eXBlO3I9PT0ib25Gb2N1cyJ8fHI9PT0ib25CbHVyIj9uUCh0LGE9PntuLmZpcmVFdmVudChlLGEpfSk6bi5maXJlRXZlbnQoZSx0KX1mdW5jdGlvbiBvUChlLHQpe2xldCBuPWNvKHBhcnNlSW50KHQpKTtpZighbilyZXR1cm47bGV0IHI9bi5fX3BhZ2VfY29udGFpbmVyX187ZS5mb3JFYWNoKGE9Pntzd2l0Y2goYVswXSl7Y2FzZSB0ZS5BQ1RJT05fVFlQRV9FVkVOVDppUChhWzFdLGFbMl0scik7YnJlYWt9fSl9bGV0IG5wPXt9O2Z1bmN0aW9uIGFQKGUsdCxuKXtsZXR7YWRwaWQ6cix3aWR0aDphfT1lLHU9cisiLSIrYSxoPW5wW3VdO2lmKGgmJmgubGVuZ3RoPjApe3QoaC5zcGxpY2UoMCwxKVswXSk7cmV0dXJufWwuYWQuZ2V0QWRzKGUsYj0+e2xldCBVPWIuYWRzO3QoVS5zcGxpY2UoMCwxKVswXSksbnBbdV09aD9oLmNvbmNhdChVKTpVfSxiPT57bih7ZXJyQ29kZTpiLmNvZGUsZXJyTXNnOmIubWVzc2FnZX0pfSl9ZnVuY3Rpb24gc1AoKXtaKCJnZXRBZERhdGEiLChlLHQpPT57YVAoZSxuPT57dCh7Y29kZTowLGRhdGE6bn0pfSxuPT57dCh7Y29kZToxLG1lc3NhZ2U6bn0pfSl9KX1sZXQgbFA9WyJzd2l0Y2hUYWIiLCJyZUxhdW5jaCIsInJlZGlyZWN0VG8iLCJuYXZpZ2F0ZVRvIiwibmF2aWdhdGVCYWNrIl07ZnVuY3Rpb24gY1AoKXtsUC5mb3JFYWNoKGU9PntaKGUsdD0+e2d0W2VdKFkuZXh0ZW5kKHQse2ZhaWwobil7Y29uc29sZS5lcnJvcihuLmVyck1zZyl9fSkpfSl9KX1sZXQgcnA9ITE7ZnVuY3Rpb24gdVAoZSx0KXtsZXQgbj10PT09IjEiO2lmKCEobiYmcnApKXtpZihuPyhycD0hMCx4ZyhsLndlYnZpZXcuZ2V0TGF1bmNoV2VidmlldygpKSk6Qml8fHhnKGwud2Vidmlldy5nZXRXZWJ2aWV3QnlJZCh0KSksIUJpLmxvYWRlZCl7aWYoQmkuaWQhPT10KXJldHVybiBjb25zb2xlLmVycm9yKGB3ZWJ2aWV3UmVhZHlbJHtCaS5pZH1dWyR7dH1dIG5vdCBtYXRjaGApO0JpLmxvYWRlZD0hMH1zdC5lbWl0KE1sKyIuIit0KSxuJiZmUCgpfX1mdW5jdGlvbiBmUCgpe2xldHthdXRvY2xvc2U6ZSxhbHdheXNTaG93QmVmb3JlUmVuZGVyOnR9PVQuc3BsYXNoc2NyZWVuO2UmJiF0JiZsLm5hdmlnYXRvci5jbG9zZVNwbGFzaHNjcmVlbigpO2xldCBuPXRlLmFkZExlYWRpbmdTbGFzaChULmVudHJ5UGFnZVBhdGgpLHI9SWkobik7aWYoIXIubWV0YS5pc05WdWUpe2xldCBhPXt1cmw6bisoVC5lbnRyeVBhZ2VRdWVyeXx8IiIpLG9wZW5UeXBlOiJhcHBMYXVuY2gifSx1PXtyZXNvbHZlKCl7fSxyZWplY3QoKXt9fTtyZXR1cm4gci5tZXRhLmlzVGFiQmFyP1pnKGEsdSk6SmcoYSx1KX19ZnVuY3Rpb24gZFAoZSx0KXtsZXQgbj1jbyhwYXJzZUludCh0KSk7biYmKG4uX191bmlhcHBfd2Vidmlldz0hMCl9ZnVuY3Rpb24gaFAoZSx0KXtsZXQgbj1jbyhwYXJzZUludCh0KSk7biYmZGVsZXRlIG4uX191bmlhcHBfd2Vidmlld31sZXQgZ1A9KHtuYW1lOmUsYXJnOnR9LG4pPT57ZT09PSJwb3N0TWVzc2FnZSI/cFAoblswXSx0KTpndFtlXShZLmV4dGVuZCh0LHtmYWlsKHIpe2NvbnNvbGUuZXJyb3Ioci5lcnJNc2cpfX0pKX07ZnVuY3Rpb24gcFAoZSx0KXtsZXQgbj12VCgid2ViLXZpZXciLHBhcnNlSW50KGUpKTtuJiZuLmRpc3BhdGNoRXZlbnQodGUuY3JlYXRlVW5pRXZlbnQoe3R5cGU6Im9uTWVzc2FnZSIsdGFyZ2V0Ok9iamVjdC5jcmVhdGUobnVsbCksY3VycmVudFRhcmdldDpPYmplY3QuY3JlYXRlKG51bGwpLGRldGFpbDp7ZGF0YTpbdF19fSkpfWZ1bmN0aW9uIHZQKHtub2RlSWQ6ZSxvd25lcklkOnQsbWV0aG9kOm4sYXJnczpyfSxhKXtsZXQgdT1IZyhlLHBhcnNlSW50KGEpKTtpZighdSlyZXR1cm47bGV0IGg9bVAodCx1Ll9fdnVlUGFyZW50Q29tcG9uZW50KTshaHx8IWhbbl18fGhbbl0ocil9ZnVuY3Rpb24gbVAoZSx0KXtpZighdClyZXR1cm4gbnVsbDtpZih0LnVpZD09PWUpcmV0dXJuIHQucHJveHk7bGV0IG49dC5wYXJlbnQ7Zm9yKDtuOyl7aWYobi51aWQ9PT1lKXJldHVybiBuLnByb3h5O249bi5wYXJlbnR9cmV0dXJuIHQucHJveHl9ZnVuY3Rpb24gX1AoKXtsZXR7c3Vic2NyaWJlOmUsc3Vic2NyaWJlSGFuZGxlcjp0LHB1Ymxpc2hIYW5kbGVyOm59PXN0O2lmKFFnKCJzdWJzY3JpYmVIYW5kbGVyIiwoe3R5cGU6cixkYXRhOmEscGFnZUlkOnV9KT0+e3QocixhLHUpfSksUWcodGUuV0VCX0lOVk9LRV9BUFBTRVJWSUNFLCh7ZGF0YTpyLHdlYnZpZXdJZHM6YX0pPT57Z1AocixhKX0pLFQucmVuZGVyZXIhPT0ibmF0aXZlIil7ZShNbCx1UCksZShsZyxvUCksaigpLHNQKCksY1AoKSxlKFFDLGRQKSxlKGVPLGhQKSxlKHRlLk9OX1dYU19JTlZPS0VfQ0FMTF9NRVRIT0QsdlApO2xldCByPUlpKHRlLmFkZExlYWRpbmdTbGFzaChULmVudHJ5UGFnZVBhdGgpKTtyJiYhci5tZXRhLmlzTlZ1ZSYmbihNbCx7fSwxKX19bGV0IERsLGVmPXtnbG9iYWxEYXRhOnt9fTtmdW5jdGlvbiBiUCh7YWxsb3dEZWZhdWx0OmU9ITF9PXt9KXtpZihEbClyZXR1cm4gRGw7aWYoZSlyZXR1cm4gZWY7Y29uc29sZS5lcnJvcigiW3dhcm5dOiBnZXRBcHAoKSBmYWlsZWQuIExlYXJuIG1vcmU6IGh0dHBzOi8vdW5pYXBwLmRjbG91ZC5pby9jb2xsb2NhdGlvbi9mcmFtZS93aW5kb3c/aWQ9Z2V0YXBwLiIpfWZ1bmN0aW9uIEVQKGUpe2lmKGd0LlZ1ZXgmJmUuJHN0b3JlKXtsZXR7dXNlU3RvcmU6dH09Z3QuVnVleDtndC5WdWV4LnVzZVN0b3JlPW49Pm4/dChuKTplLiRzdG9yZX1MbyhlKSxEbD1lLG50KERsKSxZLmV4dGVuZChEbCxlZiksVnQoRGwsZWYuZ2xvYmFsRGF0YSksV3QoKSxxZygpLFhUKCksUVQoKSxyUCgpLF9QKCksZVAoZSksayh0UCwxZTQpLFQucmVhZHk9ITB9dmFyIHlQPXt1bmk6S1QsZ2V0QXBwOmJQLGdldEN1cnJlbnRQYWdlczppaSxfX2RlZmluZVBhZ2U6UFQsX19yZWdpc3RlckFwcDpFUCxfX3JlZ2lzdGVyUGFnZTpmYyxVbmlTZXJ2aWNlSlNCcmlkZ2U6SlR9O3JldHVybiB5UH0oeHQscG4sQSk7Qj1CLmRlZmF1bHR8fEI7bGV0IGd0PUIudW5pLHZuPUIuZ2V0QXBwLFZuPUIuZ2V0Q3VycmVudFBhZ2VzLHN0PUIuVW5pU2VydmljZUpTQnJpZGdlO3JldHVybiBCfXZhciBWcD1ySShhSSk7dmFyIHlmLHdmLFNmLGVzLEFmLENmLE9mO2Z1bmN0aW9uICRwKCl7cmV0dXJuIGVzP3tfX2RlZmluZVBhZ2U6eWYsX19yZWdpc3RlckFwcDp3ZixfX3JlZ2lzdGVyUGFnZTpTZix1bmk6ZXMsd3g6ZXMsZ2V0QXBwOkFmLGdldEN1cnJlbnRQYWdlczpDZixVbmlTZXJ2aWNlSlNCcmlkZ2U6T2Z9Ont9fWZ1bmN0aW9uIFVwKGcpe2xldHt3ZWV4OmwscGx1czpfLFZ1ZVNoYXJlZDpBfT1nO3JldHVybiBlc3x8KHtfX2RlZmluZVBhZ2U6eWYsX19yZWdpc3RlckFwcDp3ZixfX3JlZ2lzdGVyUGFnZTpTZix1bmk6ZXMsZ2V0QXBwOkFmLGdldEN1cnJlbnRQYWdlczpDZixVbmlTZXJ2aWNlSlNCcmlkZ2U6T2Z9PUZwKGwsXyxnKSxlcy5WdWVTaGFyZWQ9QSxzcChlcykpLHtfX2RlZmluZVBhZ2U6eWYsX19yZWdpc3RlckFwcDp3ZixfX3JlZ2lzdGVyUGFnZTpTZixwbHVzOl8sdW5pOmVzLHd4OmVzLGdldEFwcDpBZixnZXRDdXJyZW50UGFnZXM6Q2YsVW5pU2VydmljZUpTQnJpZGdlOk9mfX1mdW5jdGlvbiBIcChnLGwpe2xldHtfX3VuaUNvbmZpZzpffT1sO2lmKCFfKXJldHVybjtsZXQgQT1sLndlZXg7QS5kb2N1bWVudC5fXyRhdXRvbWF0b3JfXz0hIV8uYXV0b21hdG9yO2xldCBrPV8ucmVuZGVyZXIhPT0ibmF0aXZlIiYmQS5jb25maWcuYnVuZGxlVXJsLmluZGV4T2YoImFwcC1zZXJ2aWNlLmpzIikhPT0tMTtpZihKcihsLCRwKCkpLGs/VnAobCk6KGZwKGcsbCksa3AobC5WdWUucGFyc2VDbGFzc1N0eWxlcykpLEpyKGwsVXAobCkpLEEuY29uZmlnLnBsdXNfd2ViX2lkPT09IjEiKXtsZXQgVD1BLnJlcXVpcmVNb2R1bGUoInBsdXMiKTtULnNldERlZmF1bHRGb250U2l6ZSYmVC5zZXREZWZhdWx0Rm9udFNpemUoTWF0aC5yb3VuZChsLnBsdXMuc2NyZWVuLnJlc29sdXRpb25XaWR0aC8yMCkpfWxldHtzY2FsZTpTLGRldmljZVdpZHRoOk4scGxhdGZvcm06Zn09Z2xvYmFsLldYRW52aXJvbm1lbnQ7aWYoZi50b0xvd2VyQ2FzZSgpPT09ImlvcyIpe2xldCBUPU1hdGguY2VpbChOL1MpO0EucmVxdWlyZU1vZHVsZSgibWV0YSIpLnNldFZpZXdwb3J0KHt3aWR0aDpULHJvdW5kT2ZmRGV2aWF0aW9uOiExfSl9fXZhciBybD1jbGFzcyBleHRlbmRzIG5se2NvbnN0cnVjdG9yKGwpe3N1cGVyKCk7dGhpcy5ub2RlVHlwZT04O3RoaXMudHlwZT0iY29tbWVudCI7dGhpcy52YWx1ZT0iIjt0aGlzLnZhbHVlPWx9dG9TdHJpbmcoKXtyZXR1cm4iPCEtLSAiK3RoaXMudmFsdWUrIiAtLT4ifX07ZnVuY3Rpb24gQ28oZyxsPVtdKXtyZXR1cm57bW9kdWxlOiJkb20iLG1ldGhvZDpnLGFyZ3M6bH19dmFyIGpsPWNsYXNze2NvbnN0cnVjdG9yKGwsXyl7dGhpcy5pZD1sLHRoaXMuYmF0Y2hlZD0hMSx0aGlzLnVwZGF0ZXM9W10sRm4oXyk/T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImhhbmRsZXIiLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpffSk6Y29uc29sZS5lcnJvcigiW0pTIFJ1bnRpbWVdIGludmFsaWQgcGFyYW1ldGVyLCBoYW5kbGVyIG11c3QgYmUgYSBmdW5jdGlvbiIpfWNyZWF0ZUZpbmlzaChsKXtyZXR1cm4gdGhpcy5oYW5kbGVyKFtDbygiY3JlYXRlRmluaXNoIildLGwpfXVwZGF0ZUZpbmlzaChsKXtyZXR1cm4gdGhpcy5oYW5kbGVyKFtDbygidXBkYXRlRmluaXNoIildLGwpfXJlZnJlc2hGaW5pc2gobCl7cmV0dXJuIHRoaXMuaGFuZGxlcihbQ28oInJlZnJlc2hGaW5pc2giKV0sbCl9Y3JlYXRlQm9keShsKXtsZXQgXz1sLnRvSlNPTigpLEE9Xy5jaGlsZHJlbjtkZWxldGUgXy5jaGlsZHJlbjtsZXQgaz1bQ28oImNyZWF0ZUJvZHkiLFtfXSldO3JldHVybiBBJiZrLnB1c2guYXBwbHkoayxBLm1hcChTPT5DbygiYWRkRWxlbWVudCIsW18ucmVmLFMsLTFdKSkpLHRoaXMuYWRkQWN0aW9ucyhrKX1hZGRFbGVtZW50KGwsXyxBKXtyZXR1cm4gQT49MHx8KEE9LTEpLHRoaXMuYWRkQWN0aW9ucyhDbygiYWRkRWxlbWVudCIsW18sbC50b0pTT04oKSxBXSkpfXJlbW92ZUVsZW1lbnQobCl7aWYoeWkobCkpe2xldCBfPWwubWFwKEE9PkNvKCJyZW1vdmVFbGVtZW50IixbQV0pKTtyZXR1cm4gdGhpcy5hZGRBY3Rpb25zKF8pfXJldHVybiB0aGlzLmFkZEFjdGlvbnMoQ28oInJlbW92ZUVsZW1lbnQiLFtsXSkpfW1vdmVFbGVtZW50KGwsXyxBKXtyZXR1cm4gdGhpcy5hZGRBY3Rpb25zKENvKCJtb3ZlRWxlbWVudCIsW2wsXyxBXSkpfXNldEF0dHIobCxfLEEpe3JldHVybiB0aGlzLmFkZEFjdGlvbnMoQ28oInVwZGF0ZUF0dHJzIixbbCx7W19dOkF9XSkpfXNldFN0eWxlKGwsXyxBKXtyZXR1cm4gdGhpcy5hZGRBY3Rpb25zKENvKCJ1cGRhdGVTdHlsZSIsW2wse1tfXTpBfV0pKX1zZXRTdHlsZXMobCxfKXtyZXR1cm4gdGhpcy5hZGRBY3Rpb25zKENvKCJ1cGRhdGVTdHlsZSIsW2wsX10pKX1hZGRFdmVudChsLF8pe3JldHVybiB0aGlzLmFkZEFjdGlvbnMoQ28oImFkZEV2ZW50IixbbCxfXSkpfXJlbW92ZUV2ZW50KGwsXyl7cmV0dXJuIHRoaXMuYWRkQWN0aW9ucyhDbygicmVtb3ZlRXZlbnQiLFtsLF9dKSl9aGFuZGxlcihsLF8pe3JldHVybiBfJiZfKCl9YWRkQWN0aW9ucyhsKXtsZXQgXz10aGlzLnVwZGF0ZXMsQT10aGlzLmhhbmRsZXI7aWYoeWkobCl8fChsPVtsXSksdGhpcy5iYXRjaGVkKV8ucHVzaC5hcHBseShfLGwpO2Vsc2UgcmV0dXJuIEEobCl9fTt2YXIgVGY9e2NyZWF0ZUJvZHk6ImNhbGxDcmVhdGVCb2R5IixhZGRFbGVtZW50OiJjYWxsQWRkRWxlbWVudCIscmVtb3ZlRWxlbWVudDoiY2FsbFJlbW92ZUVsZW1lbnQiLG1vdmVFbGVtZW50OiJjYWxsTW92ZUVsZW1lbnQiLHVwZGF0ZUF0dHJzOiJjYWxsVXBkYXRlQXR0cnMiLHVwZGF0ZVN0eWxlOiJjYWxsVXBkYXRlU3R5bGUiLGFkZEV2ZW50OiJjYWxsQWRkRXZlbnQiLHJlbW92ZUV2ZW50OiJjYWxsUmVtb3ZlRXZlbnQifTtmdW5jdGlvbiBqcChnLGwpe2xldCBfPWx8fGdsb2JhbC5jYWxsTmF0aXZlO3JldHVybiBGbihfKXx8Y29uc29sZS5lcnJvcigiW0pTIFJ1bnRpbWVdIG5vIGRlZmF1bHQgaGFuZGxlciIpLGZ1bmN0aW9uKGspe3lpKGspfHwoaz1ba10pO2ZvcihsZXQgUz0wO1M8ay5sZW5ndGg7UysrKXtsZXQgTj1sSShnLGtbU10sXyk7aWYoTj09PS0xKXJldHVybiBOfX19ZnVuY3Rpb24gc0koZyxsKXtyZXR1cm4gZz09PSJkb20iJiZUZltsXSYmRm4oZ2xvYmFsW1RmW2xdXSl9ZnVuY3Rpb24gbEkoZyxsLF8pe2xldHttb2R1bGU6QSxtZXRob2Q6ayxhcmdzOlN9PWw7cmV0dXJuIHNJKEEsayk/Z2xvYmFsW1RmW2tdXShnLC4uLlMsIi0xIik6XyhnLFtsXSwiLTEiKX12YXIgZHU9Y2xhc3MgZXh0ZW5kcyBKaXtjb25zdHJ1Y3RvcihsKXtzdXBlcigpO3RoaXMudmFsdWU9bCx0aGlzLm5vZGVUeXBlPTMsdGhpcy50eXBlPSJ0ZXh0Iix0aGlzLnZhbHVlPSIifXRvU3RyaW5nKCl7cmV0dXJuIiIrdGhpcy52YWx1ZX19O3ZhciB6cD17c2xpZGVyOntjaGFuZ2U6ZnVuY3Rpb24oZyl7cmV0dXJue2luZGV4OmcuaW5kZXgsc291cmNlOmcuc291cmNlfX0sc2Nyb2xsOmZ1bmN0aW9uKGcpe3JldHVybntvZmZzZXRYUmF0aW86Zy5vZmZzZXRYUmF0aW8sb2Zmc2V0WVJhdGlvOmcub2Zmc2V0WVJhdGlvLGRyYWc6Zy5kcmFnfX19LCJzY3JvbGwtdmlldyI6e3Njcm9sbGVuZDpmdW5jdGlvbihnKXtyZXR1cm57Y29udGVudE9mZnNldDpnLmNvbnRlbnRPZmZzZXR9fX19O2Z1bmN0aW9uIFdwKGcpe2xldHthdHRyOmwsb2Zmc2V0TGVmdDpfLG9mZnNldFRvcDpBfT1nLGs9e307cmV0dXJuIGwmJk9iamVjdC5rZXlzKGwpLmZvckVhY2goUz0+e1MuaW5kZXhPZigiZGF0YS0iKT09PTAmJihrW1MucmVwbGFjZSgiZGF0YS0iLCIiKV09bFtTXSl9KSx7aWQ6bCYmbC5pZHx8IiIsZGF0YXNldDprLG9mZnNldExlZnQ6X3x8MCxvZmZzZXRUb3A6QXx8MH19dmFyIGNJPVsiYSIsImRpdiIsImxpc3QiLCJjZWxsIiwibG9hZGluZyIsInJlZnJlc2giLCJyZWN5Y2xlLWxpc3QiLCJzY3JvbGxlciIsImluZGljYXRvciIsIndhdGVyZmFsbCIsIndlYiIsInJpY2h0ZXh0Il0sdUk9WyJ2aWV3YXBwZWFyIiwidmlld2Rpc2FwcGVhciJdLGZJPXttYXJrZXJ0YXA6WyJtYXJrZXJJZCJdLGNvbnRyb2x0YXA6WyJjb250cm9sSWQiXSxyZWdpb25jaGFuZ2U6WyJjYXVzZWRCeSJdLGVuZDpbImNhdXNlZEJ5Il0sYXBwZWFyOlsiZGlyZWN0aW9uIl0sZGlzYXBwZWFyOlsiZGlyZWN0aW9uIl19O2Z1bmN0aW9uIEdwKGcsbCl7bGV0IF89Zy50eXBlO2lmKHVJLmluZGV4T2YoXykhPT0tMSlyZXR1cm4gZztsZXQgQT1nLmN1cnJlbnRUYXJnZXQsaz1BLnR5cGUucmVwbGFjZSgidS0iLCIiKTtpZihjSS5pbmRleE9mKGspIT09LTEpcmV0dXJuIGc7bGV0e3RpbWVzdGFtcDpTLHRhcmdldDpOfT1nO2lmKCFsKXtsZXQgemU9enBba107emU/Rm4oemVbX10pP2w9emVbX10oZyk6bD1nLmRldGFpbHx8e306bD1nLmRldGFpbHx8e319bGV0IGY9e3R5cGU6Xyx0aW1lU3RhbXA6Uyx0YXJnZXQ6V3AoTiksY3VycmVudFRhcmdldDpXcChBKSxkZXRhaWw6bCx0b3VjaGVzOl89PT0idG91Y2hlbmQifHxfPT09InBhbmVuZCI/W106Zy5jaGFuZ2VkVG91Y2hlcyxjaGFuZ2VkVG91Y2hlczpnLmNoYW5nZWRUb3VjaGVzfTtnLmNvbXBvbmVudElkJiYoZi5jb21wb25lbnRJZD1nLmNvbXBvbmVudElkKTtsZXQgVD1mSVtfXTtyZXR1cm4gVCYmVC5mb3JFYWNoKHplPT57WHMoZyx6ZSkmJihmW3plXT1nW3plXSl9KSxmfWZ1bmN0aW9uIGRJKGcsbCl7bGV0IF89bC5hdHRyc3x8e307Zm9yKGxldCBrIGluIF8pZy5zZXRBdHRyKGssX1trXSwhMCk7bGV0IEE9bC5zdHlsZXx8e307Zm9yKGxldCBrIGluIEEpZy5zZXRTdHlsZShrLEFba10sITApfXZhciBqbz1jbGFzc3tjb25zdHJ1Y3RvcihsLF89IiIsQSl7bD1sP2wudG9TdHJpbmcoKToiIix0aGlzLmlkPWwsdGhpcy5VUkw9XyxTcChsLHRoaXMpLHRoaXMubm9kZU1hcD17fTtsZXQgaz1qby5MaXN0ZW5lcnx8amw7dGhpcy5saXN0ZW5lcj1uZXcgayhsLEF8fGpwKGwsam8uaGFuZGxlcikpLHRoaXMudGFza0NlbnRlcj1uZXcgSGwobCxBPyhTLE4pPT5BKE4pOmpvLmhhbmRsZXIpLHRoaXMuY3JlYXRlRG9jdW1lbnRFbGVtZW50KCl9Z2V0UmVmKGwpe3JldHVybiB0aGlzLm5vZGVNYXBbbF19b3Blbigpe3RoaXMubGlzdGVuZXIuYmF0Y2hlZD0hMX1jbG9zZSgpe3RoaXMubGlzdGVuZXIuYmF0Y2hlZD0hMH1jcmVhdGVEb2N1bWVudEVsZW1lbnQoKXtpZighdGhpcy5kb2N1bWVudEVsZW1lbnQpe2xldCBsPW5ldyBKaSgiZG9jdW1lbnQiKTtsLmRvY0lkPXRoaXMuaWQsbC5vd25lckRvY3VtZW50PXRoaXMsbC5yb2xlPSJkb2N1bWVudEVsZW1lbnQiLGwucmVmPSJfZG9jdW1lbnRFbGVtZW50Iix0aGlzLm5vZGVNYXAuX2RvY3VtZW50RWxlbWVudD1sLHRoaXMuZG9jdW1lbnRFbGVtZW50PWwsT2JqZWN0LmRlZmluZVByb3BlcnR5KGwsImFwcGVuZENoaWxkIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6Xz0+e3NmKHRoaXMsXyl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGwsImluc2VydEJlZm9yZSIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOihfLEEpPT57c2YodGhpcyxfLEEpfX0pLFluKCJkZWJ1ZyIpJiZNaShgQ3JlYXRlIGRvY3VtZW50IGVsZW1lbnQgKGlkOiAiJHtsLmRvY0lkfSIsIHJlZjogIiR7bC5yZWZ9IilgKX1yZXR1cm4gdGhpcy5kb2N1bWVudEVsZW1lbnR9Y3JlYXRlQm9keShsLF8pe2lmKCF0aGlzLmJvZHkpe2xldCBBPW5ldyBKaShsLF8pO2xmKHRoaXMsQSksWW4oImRlYnVnIikmJk1pKGBbY3JlYXRlQm9keV0oJHt0aGlzLmlkfSwke0EudHlwZX0sJHtBLnJlZn0pICgke0pTT04uc3RyaW5naWZ5KEEudG9KU09OKCEwKSl9KS5gKX1yZXR1cm4gdGhpcy5ib2R5fWNyZWF0ZUVsZW1lbnQobCxfKXtsZXQgQT1uZXcgSmkobCxfKTtyZXR1cm4gWW4oImRlYnVnIikmJk1pKGBbY3JlYXRlRWxlbWVudF0oJHt0aGlzLmlkfSwke0EudHlwZX0sJHtBLnJlZn0pICgke0pTT04uc3RyaW5naWZ5KEEudG9KU09OKCEwKSl9KS5gKSxBfWNyZWF0ZUNvbW1lbnQobCl7cmV0dXJuIG5ldyBybChsKX1jcmVhdGVUZXh0KGwpe3JldHVybiBuZXcgZHUobCl9ZmlyZUV2ZW50KGwsXyxBLGssUyl7aWYoIWwpcmV0dXJuO0E9QXx8e30sQS50eXBlPUEudHlwZXx8XyxBLnRhcmdldD1sLEEuY3VycmVudFRhcmdldD1sLEEudGltZXN0YW1wPURhdGUubm93KCksayYmZEkobCxrKTtsZXQgTixmPXRoaXMuZ2V0UmVmKCJfcm9vdCIpO2lmKGYmJmYuYXR0cil7bGV0IFQ9Zi5hdHRyLmJ1YmJsZTtOPVQ9PT0idHJ1ZSJ8fFQ9PT0hMH1yZXR1cm4gQT1HcChBKSxsLmZpcmVFdmVudChfLEEsTixTKX1kZXN0cm95KCl7WW4oImRlYnVnIikmJk1pKGBbZGVzdHJveV0oJHt0aGlzLmlkfSxkb2N1bWVudCkgRGVzdHJveSBkb2N1bWVudCAoaWQ6ICIke3RoaXMuaWR9IiwgVVJMOiAiJHt0aGlzLlVSTH0iKWApLHRoaXMudGFza0NlbnRlci5kZXN0cm95Q2FsbGJhY2soKSxkZWxldGUgdGhpcy5saXN0ZW5lcixkZWxldGUgdGhpcy5ub2RlTWFwLGRlbGV0ZSB0aGlzLnRhc2tDZW50ZXIsQXAodGhpcy5pZCl9fTtqby5oYW5kbGVyPW51bGw7dmFyIFlwPXtJbnB1dEVsZW1lbnREaXY6IjxXaGl0ZVNwYWNlPnw8TGluZVRlcm1pbmF0b3I+fDxSZXNlcnZlZFdvcmQ+fDxJZGVudGlmaWVyPnw8TnVtZXJpY0xpdGVyYWw+fDxQdW5jdHVhdG9yPnw8U3RyaW5nTGl0ZXJhbD4iLElucHV0RWxlbWVudFJlZ0V4cDoiPFdoaXRlU3BhY2U+fDxMaW5lVGVybWluYXRvcj58PFJlc2VydmVkV29yZD58PElkZW50aWZpZXI+fDxOdW1lcmljTGl0ZXJhbD58PFB1bmN0dWF0b3I+fDxTdHJpbmdMaXRlcmFsPiIsUmVzZXJ2ZWRXb3JkOiI8S2V5d29yZD58PE51bGxMaXRlcmFsPnw8Qm9vbGVhbkxpdGVyYWw+IixXaGl0ZVNwYWNlOi9bXHRcdlxmXHUwMDIwXHUwMEEwXHUxNjgwXHUxODBFXHUyMDAwLVx1MjAwQVx1MjAyRlx1MjA1Zlx1MzAwMFx1RkVGRl0vLExpbmVUZXJtaW5hdG9yOi9bXG5cclx1MjAyOFx1MjAyOV0vLEtleXdvcmQ6L25ldyg/IVtfJGEtekEtWjAtOV0pfHZvaWQoPyFbXyRhLXpBLVowLTldKXxkZWxldGUoPyFbXyRhLXpBLVowLTldKXxpbig/IVtfJGEtekEtWjAtOV0pfGluc3RhbmNlb2YoPyFbXyRhLXpBLVowLTldKXx0eXBlb2YoPyFbXyRhLXpBLVowLTldKS8sTnVsbExpdGVyYWw6L251bGwoPyFbXyRhLXpBLVowLTldKS8sQm9vbGVhbkxpdGVyYWw6Lyg/OnRydWV8ZmFsc2UpKD8hW18kYS16QS1aMC05XSkvLElkZW50aWZpZXI6L1tfJGEtekEtWl1bXyRhLXpBLVowLTldKi8sUHVuY3R1YXRvcjovXC98PT58XCpcKnw+Pj49fD4+PXw8PD18PT09fCE9PXw+Pj58PDx8JT18XCo9fC09fFwrPXw8PXw+PXw9PXwhPXxcXj18XHw9fFx8XHx8JiZ8Jj18Pj58XCtcK3wtLXxcOnx9fFwqfCZ8XHx8XF58IXx+fC18XCt8XD98JXw9fD58PHwsfDt8XC4oPyFbMC05XSl8XF18XFt8XCl8XCh8ey8sRGl2UHVuY3R1YXRvcjovXC89fFwvLyxOdW1lcmljTGl0ZXJhbDovKD86MFt4WF1bMC05YS1mQS1GXSp8XC5bMC05XSt8KD86WzEtOV0rWzAtOV0qfDApKD86XC5bMC05XSp8XC4pPykoPzpbZUVdWystXXswLDF9WzAtOV0rKT8oPyFbXyRhLXpBLVowLTldKS8sU3RyaW5nTGl0ZXJhbDovIig/OlteIlxuXFxcclx1MjAyOFx1MjAyOV18XFwoPzpbJyJcXGJmbnJ0dlxuXHJcdTIwMjhcdTIwMjldfFxyXG4pfFxceFswLTlhLWZBLUZdezJ9fFxcdVswLTlhLWZBLUZdezR9fFxcW14wLTl1eCciXFxiZm5ydHZcblxcXHJcdTIwMjhcdTIwMjldKSoifCcoPzpbXidcblxcXHJcdTIwMjhcdTIwMjldfFxcKD86WyciXFxiZm5ydHZcblxyXHUyMDI4XHUyMDI5XXxcclxuKXxcXHhbMC05YS1mQS1GXXsyfXxcXHVbMC05YS1mQS1GXXs0fXxcXFteMC05dXgnIlxcYmZucnR2XG5cXFxyXHUyMDI4XHUyMDI5XSkqJy8sUmVndWxhckV4cHJlc3Npb25MaXRlcmFsOi9cLyg/OlxbKD86XFxbXHNcU118W15cXV0pKlxdfFteKlwvXFxcblxyXHUyMDI4XHUyMDI5XXxcXFteXG5cclx1MjAyOFx1MjAyOV0pKD86XFsoPzpcXFtcc1xTXXxbXlxdXSkqXF18W15cL1xcXG5cclx1MjAyOFx1MjAyOV18XFxbXlxuXHJcdTIwMjhcdTIwMjldKSpcL1swLTlhLXpBLVpdKi99O2Z1bmN0aW9uIHFwKGcsbCxfKXt2YXIgQT1bbF07ZnVuY3Rpb24gayhOKXt2YXIgZj1uZXcgUmVnRXhwO3JldHVybiBmLmNvbXBpbGUoTi5yZXBsYWNlKC88KFtePl0rKT4vZyxmdW5jdGlvbihULHplKXtyZXR1cm4gZ1t6ZV0/KEEucHVzaCh6ZSksZ1t6ZV1pbnN0YW5jZW9mIFJlZ0V4cD8iKCIrZ1t6ZV0uc291cmNlKyIpIjoiKCIrayhnW3plXSkuc291cmNlKyIpIik6IiJ9KSxfKSxmfXZhciBTPWsoZ1tsXSk7dGhpcy5leGVjPWZ1bmN0aW9uKE4pe3ZhciBmPVMuZXhlYyhOKTtpZihmPT1udWxsKXJldHVybiBudWxsO2Zvcih2YXIgVD1uZXcgU3RyaW5nKGZbMF0pLHplPTA7emU8QS5sZW5ndGg7emUrKylmW3plXSYmKFRbQVt6ZV1dPWZbemVdKTtyZXR1cm4gVH0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImxhc3RJbmRleCIse2dldDpmdW5jdGlvbigpe3JldHVybiBTLmxhc3RJbmRleH0sc2V0OmZ1bmN0aW9uKE4pe1MubGFzdEluZGV4PU59fSl9ZnVuY3Rpb24gaEkoKXt2YXIgZz1uZXcgcXAoWXAsIklucHV0RWxlbWVudERpdiIsImciKSxsPW5ldyBxcChZcCwiSW5wdXRFbGVtZW50UmVnRXhwIiwiZyIpLF87T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInNvdXJjZSIse2dldDpmdW5jdGlvbigpe3JldHVybiBffSxzZXQ6ZnVuY3Rpb24oQSl7Xz1BLGcubGFzdEluZGV4PTAsbC5sYXN0SW5kZXg9MH19KSx0aGlzLnJlc2V0PWZ1bmN0aW9uKCl7Zy5sYXN0SW5kZXg9MCxsLmxhc3RJbmRleD0wfSx0aGlzLmdldE5leHRUb2tlbj1mdW5jdGlvbihBKXt2YXIgaz1nLmxhc3RJbmRleCxTO0E/Uz1nOlM9bDt2YXIgTj1TLmV4ZWMoXyk7aWYoTiYmUy5sYXN0SW5kZXgtaz5OLmxlbmd0aCl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIlVuZXhwZWN0ZWQgdG9rZW4gSUxMRUdBTCIpO3JldHVybiBnLmxhc3RJbmRleD1TLmxhc3RJbmRleCxsLmxhc3RJbmRleD1TLmxhc3RJbmRleCxOfX12YXIgS3A9e0lkZW50aWZpZXJOYW1lOltbIklkZW50aWZpZXIiXV0sTGl0ZXJhbDpbWyJOdWxsTGl0ZXJhbCJdLFsiQm9vbGVhbkxpdGVyYWwiXSxbIk51bWVyaWNMaXRlcmFsIl0sWyJTdHJpbmdMaXRlcmFsIl0sWyJSZWd1bGFyRXhwcmVzc2lvbkxpdGVyYWwiXV0sUHJpbWFyeUV4cHJlc3Npb246W1siSWRlbnRpZmllciJdLFsiTGl0ZXJhbCJdLFsiKCIsIkV4cHJlc3Npb24iLCIpIl1dLENhbGxFeHByZXNzaW9uOltbIlByaW1hcnlFeHByZXNzaW9uIiwiQXJndW1lbnRzIl0sWyJDYWxsRXhwcmVzc2lvbiIsIkFyZ3VtZW50cyJdXSxBcmd1bWVudHM6W1siKCIsIikiXSxbIigiLCJBcmd1bWVudExpc3QiLCIpIl1dLEFyZ3VtZW50TGlzdDpbWyJDb25kaXRpb25hbEV4cHJlc3Npb24iXSxbIkFyZ3VtZW50TGlzdCIsIiwiLCJDb25kaXRpb25hbEV4cHJlc3Npb24iXV0sTGVmdEhhbmRTaWRlRXhwcmVzc2lvbjpbWyJQcmltYXJ5RXhwcmVzc2lvbiJdLFsiQ2FsbEV4cHJlc3Npb24iXV0sVW5hcnlFeHByZXNzaW9uOltbIkxlZnRIYW5kU2lkZUV4cHJlc3Npb24iXSxbInZvaWQiLCJVbmFyeUV4cHJlc3Npb24iXSxbIisiLCJVbmFyeUV4cHJlc3Npb24iXSxbIi0iLCJVbmFyeUV4cHJlc3Npb24iXSxbIn4iLCJVbmFyeUV4cHJlc3Npb24iXSxbIiEiLCJVbmFyeUV4cHJlc3Npb24iXV0sRXhwb25lbnRpYXRpb25FeHByZXNzaW9uOltbIlVuYXJ5RXhwcmVzc2lvbiJdLFsiRXhwb25lbnRpYXRpb25FeHByZXNzaW9uIiwiKioiLCJVbmFyeUV4cHJlc3Npb24iXV0sTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uOltbIk11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiIsIi8iLCJFeHBvbmVudGlhdGlvbkV4cHJlc3Npb24iXSxbIkV4cG9uZW50aWF0aW9uRXhwcmVzc2lvbiJdLFsiTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIiwiKiIsIkV4cG9uZW50aWF0aW9uRXhwcmVzc2lvbiJdLFsiTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIiwiJSIsIkV4cG9uZW50aWF0aW9uRXhwcmVzc2lvbiJdXSxBZGRpdGl2ZUV4cHJlc3Npb246W1siTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIl0sWyJBZGRpdGl2ZUV4cHJlc3Npb24iLCIrIiwiTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIl0sWyJBZGRpdGl2ZUV4cHJlc3Npb24iLCItIiwiTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIl1dLFNoaWZ0RXhwcmVzc2lvbjpbWyJBZGRpdGl2ZUV4cHJlc3Npb24iXSxbIlNoaWZ0RXhwcmVzc2lvbiIsIjw8IiwiQWRkaXRpdmVFeHByZXNzaW9uIl0sWyJTaGlmdEV4cHJlc3Npb24iLCI+PiIsIkFkZGl0aXZlRXhwcmVzc2lvbiJdLFsiU2hpZnRFeHByZXNzaW9uIiwiPj4+IiwiQWRkaXRpdmVFeHByZXNzaW9uIl1dLFJlbGF0aW9uYWxFeHByZXNzaW9uOltbIlNoaWZ0RXhwcmVzc2lvbiJdLFsiUmVsYXRpb25hbEV4cHJlc3Npb24iLCI8IiwiU2hpZnRFeHByZXNzaW9uIl0sWyJSZWxhdGlvbmFsRXhwcmVzc2lvbiIsIj4iLCJTaGlmdEV4cHJlc3Npb24iXSxbIlJlbGF0aW9uYWxFeHByZXNzaW9uIiwiPD0iLCJTaGlmdEV4cHJlc3Npb24iXSxbIlJlbGF0aW9uYWxFeHByZXNzaW9uIiwiPj0iLCJTaGlmdEV4cHJlc3Npb24iXSxbIlJlbGF0aW9uYWxFeHByZXNzaW9uIiwiaW5zdGFuY2VvZiIsIlNoaWZ0RXhwcmVzc2lvbiJdLFsiUmVsYXRpb25hbEV4cHJlc3Npb24iLCJpbiIsIlNoaWZ0RXhwcmVzc2lvbiJdXSxFcXVhbGl0eUV4cHJlc3Npb246W1siUmVsYXRpb25hbEV4cHJlc3Npb24iXSxbIkVxdWFsaXR5RXhwcmVzc2lvbiIsIj09IiwiUmVsYXRpb25hbEV4cHJlc3Npb24iXSxbIkVxdWFsaXR5RXhwcmVzc2lvbiIsIiE9IiwiUmVsYXRpb25hbEV4cHJlc3Npb24iXSxbIkVxdWFsaXR5RXhwcmVzc2lvbiIsIj09PSIsIlJlbGF0aW9uYWxFeHByZXNzaW9uIl0sWyJFcXVhbGl0eUV4cHJlc3Npb24iLCIhPT0iLCJSZWxhdGlvbmFsRXhwcmVzc2lvbiJdXSxCaXR3aXNlQU5ERXhwcmVzc2lvbjpbWyJFcXVhbGl0eUV4cHJlc3Npb24iXSxbIkJpdHdpc2VBTkRFeHByZXNzaW9uIiwiJiIsIkVxdWFsaXR5RXhwcmVzc2lvbiJdXSxCaXR3aXNlWE9SRXhwcmVzc2lvbjpbWyJCaXR3aXNlQU5ERXhwcmVzc2lvbiJdLFsiQml0d2lzZVhPUkV4cHJlc3Npb24iLCJeIiwiQml0d2lzZUFOREV4cHJlc3Npb24iXV0sQml0d2lzZU9SRXhwcmVzc2lvbjpbWyJCaXR3aXNlWE9SRXhwcmVzc2lvbiJdLFsiQml0d2lzZU9SRXhwcmVzc2lvbiIsInwiLCJCaXR3aXNlWE9SRXhwcmVzc2lvbiJdXSxMb2dpY2FsQU5ERXhwcmVzc2lvbjpbWyJCaXR3aXNlT1JFeHByZXNzaW9uIl0sWyJMb2dpY2FsQU5ERXhwcmVzc2lvbiIsIiYmIiwiQml0d2lzZU9SRXhwcmVzc2lvbiJdXSxMb2dpY2FsT1JFeHByZXNzaW9uOltbIkxvZ2ljYWxBTkRFeHByZXNzaW9uIl0sWyJMb2dpY2FsT1JFeHByZXNzaW9uIiwifHwiLCJMb2dpY2FsQU5ERXhwcmVzc2lvbiJdXSxDb25kaXRpb25hbEV4cHJlc3Npb246W1siTG9naWNhbE9SRXhwcmVzc2lvbiJdLFsiTG9naWNhbE9SRXhwcmVzc2lvbiIsIj8iLCJMb2dpY2FsT1JFeHByZXNzaW9uIiwiOiIsIkxvZ2ljYWxPUkV4cHJlc3Npb24iXV0sRXhwcmVzc2lvbjpbWyJDb25kaXRpb25hbEV4cHJlc3Npb24iXSxbIkV4cHJlc3Npb24iLCIsIiwiQ29uZGl0aW9uYWxFeHByZXNzaW9uIl1dLFByb2dyYW06W1siRXhwcmVzc2lvbiJdXX07ZnVuY3Rpb24gbWMoZyxsKXt0aGlzLm5hbWU9Zyx0aGlzLnRva2VuPWwsdGhpcy5jaGlsZE5vZGVzPVtdLHRoaXMudG9TdHJpbmc9ZnVuY3Rpb24oXyl7aWYoX3x8KF89IiIpLHRoaXMuY2hpbGROb2Rlcy5sZW5ndGg9PTEpcmV0dXJuIHRoaXMuY2hpbGROb2Rlc1swXS50b1N0cmluZyhfKTtmb3IodmFyIEE9Xyt0aGlzLm5hbWUrKHRoaXMudG9rZW4hPW51bGwmJnRoaXMubmFtZSE9dGhpcy50b2tlbj8iOiIrdGhpcy50b2tlbjoiIikrYApgLGs9MDtrPHRoaXMuY2hpbGROb2Rlcy5sZW5ndGg7aysrKUErPXRoaXMuY2hpbGROb2Rlc1trXS50b1N0cmluZyhfKyIgICAgIik7cmV0dXJuIEF9fWZ1bmN0aW9uIGdJKCl7dmFyIGcsbD17UHJvZ3JhbToiJCJ9LF89e307ZnVuY3Rpb24gQShmKXtfW0pTT04uc3RyaW5naWZ5KGYpXT1mO2Zvcih2YXIgVD1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhmKTtULmxlbmd0aDspe3ZhciB6ZT1ULnNoaWZ0KCk7IUtwW3plXXx8S3BbemVdLmZvckVhY2goZnVuY3Rpb24ocG4pe2ZbcG5bMF1dfHxULnB1c2gocG5bMF0pO3ZhciBCPWYsZ3Q9bnVsbDtwbi5mb3JFYWNoKGZ1bmN0aW9uKHZuKXtCW3ZuXXx8KEJbdm5dPXt9KSxndD1CLEI9Qlt2bl19KSxmW3plXS4kZGl2JiYoQi4kZGl2PSEwKSxCLiRyZWR1Y2U9emUsQi4kY291bnQ9cG4ubGVuZ3RofSl9Zm9yKHZhciB4dCBpbiBmKXR5cGVvZiBmW3h0XSE9Im9iamVjdCJ8fHh0LmNoYXJBdCgwKT09IiQifHxmW3h0XS4kY2xvc3VyZXx8KF9bSlNPTi5zdHJpbmdpZnkoZlt4dF0pXT9mW3h0XT1fW0pTT04uc3RyaW5naWZ5KGZbeHRdKV06QShmW3h0XSkpO2YuJGNsb3N1cmU9ITB9QShsKTt2YXIgaz1bXSxTPVtsXSxOPWw7dGhpcy5pbnNlcnRTeW1ib2w9ZnVuY3Rpb24oVCx6ZSl7Zm9yKDshTltULm5hbWVdJiZOLiRyZWR1Y2U7KXtmb3IodmFyIHh0PU4uJGNvdW50LHBuPW5ldyBtYyhOLiRyZWR1Y2UpO3h0LS07KXBuLmNoaWxkTm9kZXMucHVzaChrLnBvcCgpKSxTLnBvcCgpO049U1tTLmxlbmd0aC0xXSx0aGlzLmluc2VydFN5bWJvbChwbil9aWYoTj1OW1QubmFtZV0say5wdXNoKFQpLFMucHVzaChOKSwhTil0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIE4uJGRpdn0sdGhpcy5yZXNldD1mdW5jdGlvbigpe049bCxrPVtdLFM9W2xdfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiZ3JhbW1hclRyZWUiLHtnZXQ6ZnVuY3Rpb24oKXt0cnl7Zm9yKDtOLiRyZWR1Y2U7KXtmb3IodmFyIGY9Ti4kY291bnQsVD1uZXcgbWMoTi4kcmVkdWNlKTtmLS07KVQuY2hpbGROb2Rlcy5wdXNoKGsucG9wKCkpLFMucG9wKCk7Tj1TW1MubGVuZ3RoLTFdLHRoaXMuaW5zZXJ0U3ltYm9sKFQpfWlmKGsubGVuZ3RoPjAmJk5bIjsiXSlyZXR1cm4gdGhpcy5pbnNlcnRTeW1ib2wobmV3IG1jKCI7IiwiOyIpKSx0aGlzLmdyYW1tYXJUcmVlO2lmKGsubGVuZ3RoIT0xfHxrWzBdLm5hbWUhPSJQcm9ncmFtIil0aHJvdyBuZXcgRXJyb3J9Y2F0Y2goemUpe3Rocm93IG5ldyBTeW50YXhFcnJvcigiVW5leHBlY3RlZCBlbmQgb2YgaW5wdXQiKX1yZXR1cm4ga1swXX19KX1mdW5jdGlvbiBwSSgpe3RoaXMubGV4aWNhbFBhcnNlcj1uZXcgaEksdGhpcy5zeW50YWN0aWNhbFBhcnNlcj1uZXcgZ0k7dmFyIGc9WyJOdWxsTGl0ZXJhbCIsIkJvb2xlYW5MaXRlcmFsIiwiTnVtZXJpY0xpdGVyYWwiLCJTdHJpbmdMaXRlcmFsIiwiUmVndWxhckV4cHJlc3Npb25MaXRlcmFsIiwiSWRlbnRpZmllciIsIioqIiwiPT4iLCJ7IiwifSIsIigiLCIpIiwiWyIsIl0iLCIuIiwiOyIsIiwiLCI8IiwiPiIsIjw9IiwiPj0iLCI9PSIsIiE9IiwiPT09IiwiIT09IiwiKyIsIi0iLCIqIiwiJSIsIisrIiwiLS0iLCI8PCIsIj4+IiwiPj4+IiwiJiIsInwiLCJeIiwiISIsIn4iLCImJiIsInx8IiwiPyIsIjoiLCI9IiwiKz0iLCItPSIsIio9IiwiJT0iLCI8PD0iLCI+Pj0iLCI+Pj49IiwiJj0iLCJ8PSIsIl49IiwiLyIsIi89IiwiaW5zdGFuY2VvZiIsInR5cGVvZiIsIm5ldyIsInZvaWQiLCJkZWJ1Z2dlciIsInRoaXMiLCJkZWxldGUiLCJpbiJdLGw9e307Zy5mb3JFYWNoKGZ1bmN0aW9uKF8pe09iamVjdC5kZWZpbmVQcm9wZXJ0eShsLF8se30pfSksdGhpcy5yZXNldD1mdW5jdGlvbigpe3RoaXMubGV4aWNhbFBhcnNlci5yZXNldCgpLHRoaXMuc3ludGFjdGljYWxQYXJzZXIucmVzZXQoKX0sdGhpcy5wYXJzZT1mdW5jdGlvbihfLEEpe3ZhciBrLFM9ITE7dGhpcy5sZXhpY2FsUGFyc2VyLnNvdXJjZT1fO2Zvcih2YXIgTj0hMTtrPXRoaXMubGV4aWNhbFBhcnNlci5nZXROZXh0VG9rZW4oTik7KXtBJiZBKGspO3RyeXtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhrKS5zb21lKGY9PmwuaGFzT3duUHJvcGVydHkoZik/KE49dGhpcy5zeW50YWN0aWNhbFBhcnNlci5pbnNlcnRTeW1ib2wobmV3IG1jKGYsayksUyksUz0hMSwhMCk6ITEpKWNvbnRpbnVlOyhrLktleXdvcmR8fGsuUHVuY3R1YXRvcnx8ay5EaXZQdW5jdHVhdG9yKSYmbC5oYXNPd25Qcm9wZXJ0eShrLnRvU3RyaW5nKCkpJiYoTj10aGlzLnN5bnRhY3RpY2FsUGFyc2VyLmluc2VydFN5bWJvbChuZXcgbWMoay50b1N0cmluZygpLGspLFMpKX1jYXRjaChmKXt0aHJvdyBuZXcgU3ludGF4RXJyb3IoIlVuZXhwZWN0ZWQgdG9rZW4gIitrKX19cmV0dXJuIHRoaXMuc3ludGFjdGljYWxQYXJzZXIuZ3JhbW1hclRyZWV9fXZhciBKcD1uZXcgcEk7ZnVuY3Rpb24gdkkoZyl7SnAucmVzZXQoKSx0aGlzLnRyZWU9SnAucGFyc2UoZyksdGhpcy5wYXRocz1bXTt2YXIgbD1PYmplY3QuY3JlYXRlKG51bGwpLF89dGhpcyxBPU9iamVjdC5jcmVhdGUobnVsbCk7dGhpcy5pc1NpbXBsZSx0aGlzLmlzQ29uc3QsUyh0aGlzLnRyZWUpLGsodGhpcy50cmVlKSx0aGlzLnBhdGhzLmxlbmd0aD09PTAmJih0aGlzLmlzQ29uc3Q9ITApLHRoaXMuc2V0dGVyPWZ1bmN0aW9uKFQpe2Zvcih2YXIgemU9bCx4dD0wO3h0PFQubGVuZ3RoLTE7eHQrKyl6ZVtUW3h0XV18fCh6ZVtUW3h0XV09T2JqZWN0LmNyZWF0ZShudWxsKSksemU9emVbVFt4dF1dO3JldHVybntpc0NvbXBsZXRlZDpmdW5jdGlvbigpe2Zvcih2YXIgcG4gaW4gQSlpZighQVtwbl0pcmV0dXJuITE7cmV0dXJuITB9LHNldDpmdW5jdGlvbihwbil7aWYoQVtULmpvaW4oIi4iKV18fChBW1Quam9pbigiLiIpXT0hMCksemVbVFt4dF1dPXBuLHRoaXMuaXNDb21wbGV0ZWQoKSlyZXR1cm4gXy5leGVjKCl9fX0sdGhpcy52YWx1ZU9mPXRoaXMuZXhlYz1mdW5jdGlvbigpe3RyeXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4oMCxldmFsKShnKX0uY2FsbChsKX1jYXRjaChUKXt9fTtmdW5jdGlvbiBrKFQpe2Zvcih2YXIgemU9VDt6ZS5jaGlsZE5vZGVzLmxlbmd0aDw9MSYmemUubmFtZSE9PSJNZW1iZXJFeHByZXNzaW9uIjspemU9emUuY2hpbGROb2Rlc1swXTt6ZS5uYW1lPT09Ik1lbWJlckV4cHJlc3Npb24iP18uaXNTaW1wbGU9ITA6Xy5pc1NpbXBsZT0hMX1mdW5jdGlvbiBTKFQpe2lmKFQubmFtZT09PSJDYWxsRXhwcmVzc2lvbiImJlQuY2hpbGROb2Rlc1tULmNoaWxkTm9kZXMubGVuZ3RoLTFdLm5hbWUhPT0iQ2FsbEV4cHJlc3Npb24iKXt2YXIgemU9TihULmNoaWxkTm9kZXNbMV0pO1MoVC5jaGlsZE5vZGVzWzBdKX1lbHNlIGlmKFQubmFtZT09PSJOZXdFeHByZXNzaW9uIiYmVC5jaGlsZE5vZGVzLmxlbmd0aD09PTEpdmFyIHplPU4oVC5jaGlsZE5vZGVzWzBdKTtlbHNlIGlmKFQubmFtZT09PSJNZW1iZXJFeHByZXNzaW9uIiYmVC5jaGlsZE5vZGVzLmxlbmd0aD09PTEpdmFyIHplPU4oVCk7ZWxzZSBmb3IodmFyIHh0PTA7eHQ8VC5jaGlsZE5vZGVzLmxlbmd0aDt4dCsrKVMoVC5jaGlsZE5vZGVzW3h0XSl9ZnVuY3Rpb24gTihUKXtpZihULmNoaWxkTm9kZXNbMF0ubmFtZT09PSJJZGVudGlmaWVyTmFtZSIpe3ZhciB6ZT1OKFQuY2hpbGROb2Rlc1syXSk7cmV0dXJuIHplJiYoemU9emUuY29uY2F0KFQuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdLnRva2VuLnRvU3RyaW5nKCkpKSxmKHplKSx6ZX1lbHNlIGlmKFQuY2hpbGROb2Rlc1swXS5uYW1lPT09IlByaW1hcnlFeHByZXNzaW9uIilpZihULmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXS5uYW1lPT09IklkZW50aWZpZXIiKXt2YXIgemU9W1QuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdLnRva2VuLnRvU3RyaW5nKCldO3JldHVybiBmKHplKSx6ZX1lbHNlIHJldHVybiBudWxsO2Vsc2V7aWYoVC5jaGlsZE5vZGVzWzBdLm5hbWU9PT0iXSIpcmV0dXJuIE4oVC5jaGlsZE5vZGVzWzNdKSxTKFQuY2hpbGROb2Rlc1sxXSksbnVsbDtpZihULmNoaWxkTm9kZXNbMF0ubmFtZT09PSJBcmd1bWVudHMiKXJldHVybiBTKFQuY2hpbGROb2Rlc1swXSksUyhULmNoaWxkTm9kZXNbMV0pLG51bGw7Zm9yKHZhciB4dD0wO3h0PFQuY2hpbGROb2Rlcy5sZW5ndGg7eHQrKylTKFQuY2hpbGROb2Rlc1t4dF0pfX1mdW5jdGlvbiBmKFQpe2Zvcih2YXIgemU9bCx4dD0wO3h0PFQubGVuZ3RoLTE7eHQrKyl6ZVtUW3h0XV18fCh6ZVtUW3h0XV09T2JqZWN0LmNyZWF0ZShudWxsKSksemU9emVbVFt4dF1dO18ucGF0aHMucHVzaChUKSxBW1Quam9pbigiLiIpXT0hMX19ZnVuY3Rpb24gaWwoZyl7dmFyIGw9Zy5jaGlsZE5vZGVzLnNsaWNlKCkucmV2ZXJzZSgpLF89bC5maWx0ZXIoVD0+IVQudG9rZW58fCFULnRva2VuLlB1bmN0dWF0b3IpO2lmKGcubmFtZT09PSJVbmFyeUV4cHJlc3Npb24iJiZsLmxlbmd0aD09PTImJmxbMF0ubmFtZT09PSItIiYmXy5sZW5ndGg9PT0xKXt2YXIgQT1pbChfWzBdKTtyZXR1cm4gQS52YWx1ZT0tQS52YWx1ZSxBfWlmKGcubmFtZT09PSJBcmd1bWVudHMiKXtmb3IodmFyIGs9W10sUz1fWzBdO1M7KVMuY2hpbGROb2Rlcy5sZW5ndGg9PT0zJiYoay51bnNoaWZ0KFMuY2hpbGROb2Rlc1swXSksUz1TLmNoaWxkTm9kZXNbMl0pLFMuY2hpbGROb2Rlcy5sZW5ndGg9PT0xJiYoay51bnNoaWZ0KFMuY2hpbGROb2Rlc1swXSksUz1udWxsKTtyZXR1cm57dHlwZToiQXJndW1lbnRzIixjaGlsZHJlbjprLm1hcChUPT5pbChUKSl9fWlmKF8mJl8ubGVuZ3RoPT09MSl7dmFyIEE9aWwoX1swXSk7cmV0dXJuIEF9aWYoZy50b2tlbiYmWyJOdWxsTGl0ZXJhbCIsIkJvb2xlYW5MaXRlcmFsIiwiTnVtZXJpY0xpdGVyYWwiLCJTdHJpbmdMaXRlcmFsIiwiSWRlbnRpZmllciJdLnNvbWUoVD0+Zy50b2tlbltUXSkpe3ZhciBOPU9iamVjdC5rZXlzKGcudG9rZW4pLmZpbHRlcihUPT5ULm1hdGNoKC9MaXRlcmFsLyl8fFQubWF0Y2goL0lkZW50aWZpZXIvKSlbMF0sZj17TnVsbExpdGVyYWw6bnVsbCxCb29sZWFuTGl0ZXJhbDpCb29sZWFuKGcudG9rZW4pLE51bWVyaWNMaXRlcmFsOk51bWJlcihnLnRva2VuKSxTdHJpbmdMaXRlcmFsOmcudG9rZW4sSWRlbnRpZmllcjpnLnRva2VufVtOXTtyZXR1cm57dHlwZTpOLHZhbHVlOmZ9fXJldHVybiBnLm5hbWU9PT0iQ2FsbEV4cHJlc3Npb24iP3t0eXBlOiJDYWxsRXhwcmVzc2lvbiIsY2hpbGRyZW46W2lsKGxbMF0pLGlsKGxbMV0pXX06e3R5cGU6bC5maWx0ZXIoVD0+VC50b2tlbiYmVC50b2tlbi5QdW5jdHVhdG9yKVswXS5uYW1lLGNoaWxkcmVuOmwuZmlsdGVyKFQ9PiFULnRva2VufHwhVC50b2tlbi5QdW5jdHVhdG9yKS5tYXAoVD0+aWwoVCkpfX1mdW5jdGlvbiBacChnKXt2YXIgbD1uZXcgdkkoZyk7cmV0dXJuIEpTT04uc3RyaW5naWZ5KGlsKGwudHJlZSksbnVsbCl9ZnVuY3Rpb24gbUkoZyxsKXtyZXR1cm4gbD09PSJiaW5kIiYmKGc9PT0iYmluZGluZ3gifHxnPT09ImJpbmRpbmciKX1mdW5jdGlvbiBYcChnKXtpZighZylyZXR1cm47dHJ5e2c9SlNPTi5wYXJzZShnKX1jYXRjaChfKXt9bGV0IGw9e307aWYod2koZyk/bC5vcmlnaW49ZzpnJiYobC5vcmlnaW49Zy5vcmlnaW4sbC50cmFuc2Zvcm1lZD1nLnRyYW5zZm9ybWVkKSwhKCFsLnRyYW5zZm9ybWVkJiYhbC5vcmlnaW4pKXJldHVybiBsLnRyYW5zZm9ybWVkPWwudHJhbnNmb3JtZWR8fFpwKGwub3JpZ2luKSxsfWZ1bmN0aW9uIF9JKGcpe3JldHVybiBnJiYoZy5leGl0RXhwcmVzc2lvbj1YcChnLmV4aXRFeHByZXNzaW9uKSxnLnByb3BzJiZnLnByb3BzLmZvckVhY2gobD0+e2wuZXhwcmVzc2lvbj1YcChsLmV4cHJlc3Npb24pfSksZyl9ZnVuY3Rpb24gYkkoZyl7cmV0dXJuIGZ1bmN0aW9uKGw9e30pe2lmKEZuKGcpKXJldHVybiBnKHtzdGF0ZTpsLnN0YXRlPT09ImVuZCI/ImV4aXQiOmwuc3RhdGUsdDpsLnQhPT12b2lkIDA/bC50OmwuZGVsdGFUfSl9fWZ1bmN0aW9uIFFwKGcsbCxfKXtyZXR1cm4gXyYmKG1JKGcsbCk/ZnVuY3Rpb24oQSxrPWZ1bmN0aW9uKCl7fSl7aWYoIUEpdGhyb3cgbmV3IEVycm9yKCJzaG91bGQgcGFzcyBvcHRpb25zIGZvciBiaW5kaW5nIik7cmV0dXJuIF9JKEEpLF8oQSxBJiZBLmV2ZW50VHlwZT09PSJ0aW1pbmciP2JJKGspOmspfTpfKX1mdW5jdGlvbiBFSShnLGwpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShnLCJbW0N1cnJlbnRJbnN0YW5jZUlkXV0iLHt2YWx1ZTpsfSl9ZnVuY3Rpb24gZXYoZyl7cmV0dXJuIGdbIltbQ3VycmVudEluc3RhbmNlSWRdXSJdfWZ1bmN0aW9uIHlJKGcsbCxfKXtsZXQgQT1OcihnKTtyZXR1cm4hQXx8IUZuKEEuc2VuZCk/KGNvbnNvbGUuZXJyb3IoYFtKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byBmaW5kIHRhc2tDZW50ZXIgKCR7Z30pLmApLG51bGwpOiguLi5rKT0+QS5zZW5kKCJtb2R1bGUiLHttb2R1bGU6bCxtZXRob2Q6X30sayl9ZnVuY3Rpb24gd0koZyxsLF8sQSl7bGV0IGs9TnIoZyk7cmV0dXJuIWt8fCFGbihrLnNlbmQpPyhjb25zb2xlLmVycm9yKGBbSlMgRnJhbWV3b3JrXSBGYWlsZWQgdG8gZmluZCB0YXNrQ2VudGVyICgke2d9KS5gKSxudWxsKTpGbihBKT9TPT5rLnNlbmQoIm1vZHVsZSIse21vZHVsZTpsLG1ldGhvZDpffSxbU10pOihjb25zb2xlLmVycm9yKGBbSlMgRnJhbWV3b3JrXSAke2x9LiR7X30gbXVzdCBiZSBhc3NpZ25lZCBhcyBhIGZ1bmN0aW9uLmApLG51bGwpfXZhciBodT1jbGFzc3tjb25zdHJ1Y3RvcihsLF8pe0VJKHRoaXMsU3RyaW5nKGwpKSx0aGlzLmNvbmZpZz1ffHx7fSx0aGlzLmRvY3VtZW50PW5ldyBqbyhsLHRoaXMuY29uZmlnLmJ1bmRsZVVybCksdGhpcy5yZXF1aXJlTW9kdWxlPXRoaXMucmVxdWlyZU1vZHVsZS5iaW5kKHRoaXMpLHRoaXMuaW1wb3J0U2NyaXB0PXRoaXMuaW1wb3J0U2NyaXB0LmJpbmQodGhpcyksdGhpcy5pc1JlZ2lzdGVyZWRNb2R1bGU9Y3UsdGhpcy5pc1JlZ2lzdGVyZWRDb21wb25lbnQ9YmZ9cmVxdWlyZU1vZHVsZShsKXtsZXQgXz1ldih0aGlzKTtpZighKF8mJnRoaXMuZG9jdW1lbnQmJnRoaXMuZG9jdW1lbnQudGFza0NlbnRlcikpe2NvbnNvbGUuZXJyb3IoYFtKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byByZXF1aXJlTW9kdWxlKCIke2x9IiksIGluc3RhbmNlICgke199KSBkb2Vzbid0IGV4aXN0IGFueW1vcmUuYCk7cmV0dXJufWlmKCFjdShsKSl7Y29uc29sZS53YXJuKGBbSlMgRnJhbWV3b3JrXSBcdTVGNTNcdTUyNERcdThGRDBcdTg4NENcdTc2ODRcdTU3RkFcdTVFQTdcdTRFMERcdTUzMDVcdTU0MkJcdTUzOUZcdTc1MUZcdTYzRDJcdTRFRjZbJHtsfV1cdUZGMENcdThCRjdcdTU3MjhtYW5pZmVzdFx1NEUyRFx1OTE0RFx1N0Y2RVx1OEJFNVx1NjNEMlx1NEVGNlx1RkYwQ1x1OTFDRFx1NjVCMFx1NTIzNlx1NEY1Q1x1NTMwNVx1NjJFQ1x1OEJFNVx1NTM5Rlx1NzUxRlx1NjNEMlx1NEVGNlx1NzY4NFx1ODFFQVx1NUI5QVx1NEU0OVx1OEZEMFx1ODg0Q1x1NTdGQVx1NUVBN2ApO3JldHVybn1sZXQgQT17fSxrPUxwKGwpO2ZvcihsZXQgUyBpbiBrKU9iamVjdC5kZWZpbmVQcm9wZXJ0eShBLFMse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDooKT0+UXAobCxTLHlJKF8sbCxTKSksc2V0Ok49PndJKF8sbCxTLE4pfSk7cmV0dXJuIEF9c3VwcG9ydHMobCl7aWYoIXdpKGwpKXJldHVybiBudWxsO2xldCBfPWwubWF0Y2goL15AKFx3KylcLyhbXHctXSspKFwuKFx3KykpPyQvaSk7aWYoXyl7bGV0IEE9X1sxXSxrPV9bMl0sUz1fWzRdO3N3aXRjaChBKXtjYXNlIm1vZHVsZSI6cmV0dXJuIGN1KGssUyk7Y2FzZSJjb21wb25lbnQiOnJldHVybiBiZihrKX19cmV0dXJuIG51bGx9aW1wb3J0U2NyaXB0KGwsXz17fSl7bGV0IEE9ZXYodGhpcyksaz1OcihBKTtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oUyxOKXtpZigha3x8IUZuKGsuc2VuZCkpcmV0dXJuIE4obmV3IEVycm9yKGBbSlMgRnJhbWV3b3JrXSBGYWlsZWQgdG8gaW1wb3J0IHNjcmlwdCAiJHtsfSIsIG5vIHRhc2tDZW50ZXIgKCR7QX0pIG1hdGNoZWQuYCkpO3RyeXtrLnNlbmQoIm1vZHVsZSIse21vZHVsZToic2NyaXB0IixtZXRob2Q6ImltcG9ydFNjcmlwdCJ9LFtsLF9dLHtjYWxsYmFjazpbZj0+UyhmKSxmPT5OKGYpXX0pfWNhdGNoKGYpe04oZil9fSl9fTtmdW5jdGlvbiBTSShnLGwpe2xldCBfPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIF8uc2VydmljZT1PYmplY3QuY3JlYXRlKG51bGwpLFNzLmZvckVhY2goKHtuYW1lOkEsb3B0aW9uczprfSk9PntsZXQgUz1rLmNyZWF0ZTtpZihTKXRyeXtsZXQgTj1TKGcsbCk7SnIoXy5zZXJ2aWNlLE4pLEpyKF8sTi5pbnN0YW5jZSl9Y2F0Y2goTil7Y29uc29sZS5lcnJvcihgW0pTIFJ1bnRpbWVdIEZhaWxlZCB0byBjcmVhdGUgc2VydmljZSAke0F9LmApfX0pLGRlbGV0ZSBfLnNlcnZpY2UuaW5zdGFuY2UsbWEoXy5zZXJ2aWNlKSxffXZhciBBST17dWlkOjB9LENJPWJwKGhjKSxPST1fcChoYyk7ZnVuY3Rpb24gdHYoZyxsLF8pe2xldCBBPW5ldyBodShnLGwpLGs9IlZ1ZSIsUz1TSShnLHt3ZWV4OkEsbnZ1ZTpBLGNvbmZpZzpsLGNyZWF0ZWQ6RGF0ZS5ub3coKSxmcmFtZXdvcms6a30pO21hKFMpO2xldCBOPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIEpyKE4seEkoQSkpLEpyKE4sUyx7U2hhcmVkT2JqZWN0OkFJLHdlZXg6QSxudnVlOkEscmVxdWlyZU1vZHVsZTpmPT5BLnJlcXVpcmVNb2R1bGUoZiksX19XRUVYX0NBTExfSkFWQVNDUklQVF9fOm1mLHNlcnZpY2VzOlN9KSxOLnBsdXM9bmV3IE4uV2VleFBsdXMoQSksTi5WdWVTaGFyZWQ9aGMsTi5VbmlTaGFyZWQ9Q0ksTi5WdWVSZWFjdGl2aXR5PU9JLEhwKGcsTiksbWEoTiksTn1mdW5jdGlvbiBUSShnLGwsXz17fSl7bGV0IEE9IlZ1ZSI7Xz1vZihfKSxfLmVudj1vZihnbG9iYWwuV1hFbnZpcm9ubWVudHx8e30pLF8uYnVuZGxlVHlwZT1BO2xldCBrPXR2KGcsXyk7UEkobCxrKX1mdW5jdGlvbiBQSShnLGwpe2xldCBfPVtdLEE9W107Zm9yKGxldCBTIGluIGwpXy5wdXNoKFMpLEEucHVzaChsW1NdKTtsZXQgaz0iKGZ1bmN0aW9uIChnbG9iYWwpIHsgIitnKyIgfSkoT2JqZWN0LmNyZWF0ZSh0aGlzKSkiO3JldHVybiBuZXcgRnVuY3Rpb24oLi4uXyxrKSguLi5BKX1mdW5jdGlvbiBJSShnKXtsZXQgbD1RYShnKTt0cnl7aWYobCYmbC5ib2R5KXJldHVybiBsLmJvZHkudG9KU09OKCl9Y2F0Y2goXyl7Y29uc29sZS5lcnJvcigiW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIGdldCB0aGUgdmlydHVhbCBkb20gdHJlZS4iKTtyZXR1cm59fWZ1bmN0aW9uIE5JKGcpe2NwKGcpLFNzLmZvckVhY2gobD0+e2xldCBfPWwub3B0aW9ucy5kZXN0cm95O18mJl8oZyl9KX1mdW5jdGlvbiBrSShnKXt1cChnKSxTcy5mb3JFYWNoKGw9PntsZXQgXz1sLm9wdGlvbnMucmVmcmVzaDtfJiZfKGcpfSl9dmFyIFJJPXtjcmVhdGVJbnN0YW5jZTpUSSxjcmVhdGVJbnN0YW5jZUNvbnRleHQ6dHYsZ2V0Um9vdDpJSSxnZXREb2N1bWVudDpRYSxyZWdpc3RlclNlcnZpY2U6dXUsdW5yZWdpc3RlclNlcnZpY2U6ZnUsY2FsbEpTKGcsbCl7cmV0dXJuIG1mKGcsbCl9LHJlZ2lzdGVyQ29tcG9uZW50czpEcCxyZWdpc3Rlck1vZHVsZXM6TXAsZGVzdHJveUluc3RhbmNlOk5JLHJlZnJlc2hJbnN0YW5jZTprSX07ZnVuY3Rpb24gUGYoKXtyZXR1cm4gQnAoKSxSSX1mdW5jdGlvbiB4SShnKXtpZihnbG9iYWwuc2V0VGltZW91dCYmZ2xvYmFsLnNldEludGVydmFsKXJldHVybntzZXRUaW1lb3V0Omdsb2JhbC5zZXRUaW1lb3V0LHNldEludGVydmFsOmdsb2JhbC5zZXRJbnRlcnZhbCxjbGVhclRpbWVvdXQ6Z2xvYmFsLmNsZWFyVGltZW91dCxjbGVhckludGVydmFsOmdsb2JhbC5jbGVhckludGVydmFsfTtsZXQgbD1nLnJlcXVpcmVNb2R1bGUoInRpbWVyIik7cmV0dXJue3NldFRpbWVvdXQ6KC4uLkEpPT57bGV0IGs9ZnVuY3Rpb24oKXtBWzBdKC4uLkEuc2xpY2UoMikpfTtyZXR1cm4gbC5zZXRUaW1lb3V0KGssQVsxXSksZy5kb2N1bWVudC50YXNrQ2VudGVyLmNhbGxiYWNrTWFuYWdlci5sYXN0Q2FsbGJhY2tJZC50b1N0cmluZygpfSxzZXRJbnRlcnZhbDooLi4uQSk9PntsZXQgaz1mdW5jdGlvbigpe0FbMF0oLi4uQS5zbGljZSgyKSl9O3JldHVybiBsLnNldEludGVydmFsKGssQVsxXSksZy5kb2N1bWVudC50YXNrQ2VudGVyLmNhbGxiYWNrTWFuYWdlci5sYXN0Q2FsbGJhY2tJZC50b1N0cmluZygpfSxjbGVhclRpbWVvdXQ6QT0+e2wuY2xlYXJUaW1lb3V0KEEpfSxjbGVhckludGVydmFsOkE9PntsLmNsZWFySW50ZXJ2YWwoQSl9fX12YXIgbnY9e0RvY3VtZW50OmpvLEVsZW1lbnQ6SmksQ29tbWVudDpybCxMaXN0ZW5lcjpqbCxUYXNrQ2VudGVyOkhsLHNlbmRUYXNrcyguLi5nKXtyZXR1cm4gRm4oY2FsbE5hdGl2ZSk/Y2FsbE5hdGl2ZSguLi5nKTooZ2xvYmFsLmNhbGxOYXRpdmV8fCgoKT0+e30pKSguLi5nKX19O2pvLmhhbmRsZXI9bnYuc2VuZFRhc2tzO3ZhciBvbD1udjtmdW5jdGlvbiBCSSgpe21hKG9sLkNvbW1lbnQpLG1hKG9sLkxpc3RlbmVyKSxtYShvbC5Eb2N1bWVudC5wcm90b3R5cGUpLG1hKG9sLkNvbW1lbnQucHJvdG90eXBlKSxtYShvbC5MaXN0ZW5lci5wcm90b3R5cGUpfXZhciBndT17c2VydmljZTp7cmVnaXN0ZXI6dXUsdW5yZWdpc3RlcjpmdSxoYXM6RWZ9LGZyZWV6ZVByb3RvdHlwZTpCSSxpbml0OlBmLGNvbmZpZzpvbH07dmFyIElmPWNsYXNze2NvbnN0cnVjdG9yKGwsXz17fSl7dGhpcy50eXBlPWx8fCJtZXNzYWdlIix0aGlzLmRhdGE9Xy5kYXRhfHxudWxsLHRoaXMub3JpZ2luPV8ub3JpZ2lufHwiIix0aGlzLnNvdXJjZT1fLnNvdXJjZXx8bnVsbCx0aGlzLnBvcnRzPV8ucG9ydHN8fFtdLHRoaXMudGFyZ2V0PW51bGwsdGhpcy50aW1lU3RhbXA9RGF0ZS5ub3coKX19O3ZhciBBcz17fSxfYz17fTtmdW5jdGlvbiBOZigpe31OZi5wcm90b3R5cGUucG9zdE1lc3NhZ2U9ZnVuY3Rpb24oZyl7aWYodGhpcy5fY2xvc2VkKXRocm93IG5ldyBFcnJvcihgQnJvYWRjYXN0Q2hhbm5lbCAiJHt0aGlzLm5hbWV9IiBpcyBjbG9zZWQuYCk7bGV0IGw9QXNbdGhpcy5uYW1lXTtpZihsJiZsLmxlbmd0aClmb3IobGV0IF89MDtfPGwubGVuZ3RoOysrXyl7bGV0IEE9bFtfXTtBLl9jbG9zZWR8fEE9PT10aGlzfHxGbihBLm9ubWVzc2FnZSkmJkEub25tZXNzYWdlKG5ldyBJZigibWVzc2FnZSIse2RhdGE6Z30pKX19O05mLnByb3RvdHlwZS5jbG9zZT1mdW5jdGlvbigpe2lmKCF0aGlzLl9jbG9zZWQmJih0aGlzLl9jbG9zZWQ9ITAsQXNbdGhpcy5uYW1lXSkpe2xldCBnPUFzW3RoaXMubmFtZV0uZmlsdGVyKGw9PmwhPT10aGlzKTtnLmxlbmd0aD9Bc1t0aGlzLm5hbWVdPWc6ZGVsZXRlIEFzW3RoaXMubmFtZV19fTt2YXIgcnY9e2NyZWF0ZTpnPT57aWYoX2NbZ109W10sRm4oZ2xvYmFsLkJyb2FkY2FzdENoYW5uZWwpKXJldHVybnt9O2xldCBsPXtCcm9hZGNhc3RDaGFubmVsOmZ1bmN0aW9uKF8pe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJuYW1lIix7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITEsdmFsdWU6U3RyaW5nKF8pfSksdGhpcy5fY2xvc2VkPSExLHRoaXMub25tZXNzYWdlPW51bGwsQXNbdGhpcy5uYW1lXXx8KEFzW3RoaXMubmFtZV09W10pLEFzW3RoaXMubmFtZV0ucHVzaCh0aGlzKSxfY1tnXS5wdXNoKHRoaXMpfX07cmV0dXJuIGwuQnJvYWRjYXN0Q2hhbm5lbC5wcm90b3R5cGU9TmYucHJvdG90eXBlLHtpbnN0YW5jZTpsfX0sZGVzdHJveTpnPT57X2NbZ10mJihfY1tnXS5mb3JFYWNoKGw9PmwuY2xvc2UoKSksZGVsZXRlIF9jW2ddKX19O2Z1bmN0aW9uIGtmKCl7bGV0e2luaXQ6Z309Z3U7Z3Uuc2VydmljZS5yZWdpc3RlcigiQnJvYWRjYXN0Q2hhbm5lbCIscnYpLGd1LmZyZWV6ZVByb3RvdHlwZSgpO2xldCBsPWcoKTtmb3IobGV0IF8gaW4gbClnbG9iYWxbX109KC4uLkEpPT57bGV0IGs9bFtfXSguLi5BKTtyZXR1cm4gayBpbnN0YW5jZW9mIEVycm9yJiZjb25zb2xlLmVycm9yKGsudG9TdHJpbmcoKSksa319dmFyIEFSPWdsb2JhbC5jb25zb2xlO2Z1bmN0aW9uIGl2KCl7aWYoeXAoKSxnbG9iYWwuV1hFbnZpcm9ubWVudCYmZ2xvYmFsLldYRW52aXJvbm1lbnQucGxhdGZvcm0hPT0iV2ViIilnbG9iYWwuY29uc29sZT17ZGVidWc6KC4uLmcpPT57WW4oImRlYnVnIikmJmdsb2JhbC5uYXRpdmVMb2coLi4uYmMoZyksIl9fREVCVUciKX0sbG9nOiguLi5nKT0+e1luKCJsb2ciKSYmZ2xvYmFsLm5hdGl2ZUxvZyguLi5iYyhnKSwiX19MT0ciKX0saW5mbzooLi4uZyk9PntZbigiaW5mbyIpJiZnbG9iYWwubmF0aXZlTG9nKC4uLmJjKGcpLCJfX0lORk8iKX0sd2FybjooLi4uZyk9PntZbigid2FybiIpJiZnbG9iYWwubmF0aXZlTG9nKC4uLmJjKGcpLCJfX1dBUk4iKX0sZXJyb3I6KC4uLmcpPT57WW4oImVycm9yIikmJmdsb2JhbC5uYXRpdmVMb2coLi4uYmMoZyksIl9fRVJST1IiKX19O2Vsc2V7bGV0e2RlYnVnOmcsbG9nOmwsaW5mbzpfLHdhcm46QSxlcnJvcjprfT1jb25zb2xlO2NvbnNvbGUuX19vcmlfXz17ZGVidWc6Zyxsb2c6bCxpbmZvOl8sd2FybjpBLGVycm9yOmt9LGNvbnNvbGUuZGVidWc9KC4uLlMpPT57WW4oImRlYnVnIikmJmNvbnNvbGUuX19vcmlfXy5kZWJ1Zy5hcHBseShjb25zb2xlLFMpfSxjb25zb2xlLmxvZz0oLi4uUyk9PntZbigibG9nIikmJmNvbnNvbGUuX19vcmlfXy5sb2cuYXBwbHkoY29uc29sZSxTKX0sY29uc29sZS5pbmZvPSguLi5TKT0+e1luKCJpbmZvIikmJmNvbnNvbGUuX19vcmlfXy5pbmZvLmFwcGx5KGNvbnNvbGUsUyl9LGNvbnNvbGUud2Fybj0oLi4uUyk9PntZbigid2FybiIpJiZjb25zb2xlLl9fb3JpX18ud2Fybi5hcHBseShjb25zb2xlLFMpfSxjb25zb2xlLmVycm9yPSguLi5TKT0+e1luKCJlcnJvciIpJiZjb25zb2xlLl9fb3JpX18uZXJyb3IuYXBwbHkoY29uc29sZSxTKX19fWZ1bmN0aW9uIGJjKGcpe3JldHVybiBnLm1hcChsPT57aWYoWGEobCkudG9Mb3dlckNhc2UoKT09PSJbb2JqZWN0IG9iamVjdF0iKXRyeXtsPUpTT04uc3RyaW5naWZ5KGwpfWNhdGNoKEEpe2w9IltvYmplY3Qgb2JqZWN0XSJ9ZWxzZSBsPVN0cmluZyhsKTtyZXR1cm4gbH0pfWl2KCk7a2YoKTt9KSgpOwo=