mirror of
https://github.com/soapingtime/diyhrt.git
synced 2026-03-23 07:36:38 +00:00
284 lines
435 KiB
HTML
Executable file
284 lines
435 KiB
HTML
Executable file
<!DOCTYPE html> <html style lang="en"><!--
|
|
Page saved with SingleFile
|
|
url: https://noirelabs.net/diy-estradiol-guide
|
|
saved date: Tue Jun 13 2023 17:23:16 GMT-0500 (Central Daylight Time)
|
|
--><head><meta charset="utf-8">
|
|
|
|
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
|
|
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<meta name="msapplication-TileColor" content="#f395ee">
|
|
<meta name="theme-color" content="#ffffff">
|
|
<style>@font-face{font-family:"Nunito";font-style:normal;font-weight:400;src:url(data:font/woff2;base64,d09GMgABAAAAADbgAA8AAAAAgGAAADaAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGngbuQYchUoGYD9TVEFUSACFAhEICoGlaIGCKguEIAABNgIkA4g8BCAFhQIHIBt7ayXsmOkCzoMQFK55lhGpOFtl//8xuSFDxI5o7lVCoioqm9V1zZ22qHS1oRFTuBU3cYpN2kFEieXnfwThMYoJq8Ks4UfvvBMOuh3mTO+EgeG1WWcq3z/z3Z82KlEQkaiiyBbqKmfvR2im6SHmgrhyR2jsk1yuXz+Xb9Mt0M4vcVSJ5F3lAZVDk6gCoVJkES0h4uB2kSNFFhYRtUaVVT1Hj8CKQAOwPf1IksBz+I+3ACTJbg/RnDVIIUCykmwMSZyoQCBAHAsxEoJKW8RqtLS00PZapyrUqN9/lcr1tCp31/urnlf9rwyb+285/rNYLjSLZvWiiDxRnyhzYMjgwX+kS59HeKMVWLcHvGY5YbmiLlCnKdpU1YeVbBw6QzR8aIkG+De5OOmWL9t/b6+vk/ncZeE36RogkNZj2ItrAIuns6/6zQQLmMkHqbss/NO7lTOb0zdQTQhsWj9TGWHJWk7ltwq/k19DWmdN7a7BAbylNqCFisK/N9Vs/+PyS4AiMbiUMDxeyLwrGsIZTrmM1VV2Xu7/wMaPQDABC0YJJ4JUYDapiAXAm90lL0BOlEOqdHSmK2dQkke8HELlFIpOpcsrWlelO5ee65xi0fb2/bUqfhKklk19Ldgat0Bx6+00s+7rf39bzBnd57qNESeEYMVKkJBaSUPIuL3t6/3sN1vgRf5VKgoCEvmo3W74IBoBRADjNOmID/Hz03QII1E24ppCZmwgW7aQbbu0CAlIGo1SjGi27SCMUuQAX4cGyAI3wSnMUKla0jgSBvTdWJyG/gPLs9DR1S0CqT5EPlBVrcDCXBbYVcHeAwagJlD2UV+33SlDlM/UQqrnselT6j/yU93xkQZoRJAjgsKaBhDc0z82Icf2+4F3P+xvGAWXoDptwUXKNo6aKpLD0WnXmmYWmymqLk7F7HeVMJRwC3vIreirah2Ou7c0nvdOUQRpauXDe1U8NRR74YbfpsAdXNib4zZCsDEpqs0hc/kmRGtV6MRaI70VY30tEA/98tH7Gk3lXXgO9rGT85QnpAZ3oyxl8WirkpBDHXm49EbRttQoiY99G7eGoiagsSppN6O0r2khSLw9jPeZQX55Enq/7NWae/HWNGqgk2fKaJIZaJwOUBnqhmvYXKcm1CX6qdGo3IFikS0O4htfRfyJ71YsB0jldSVelfOktVw7/IJc+l1Y2VhDXOPMI7f7qz5wMg1lR6Kf4fyYbWgm+TIDM/LgGuyDsNFO17Bs0VRWElEUrVHb0Nv56BLiIOlCIoxn905Mpjc11Gwul7/u+eBMRLHpbxMqKDT2oxtbpkFvGCTQ0HDu+FEXMIzsWvjGbgJnKQTKJi6qdu+BDg07MbkxfDoxaJcHBWnAISR7DEXUGBQ9G4RFg+G1wuiZHYtKQMskC2fJtbjkplajmnWHTjNmOUnpdY2xlQohYme2I6E4+AYcjHKzFpjISG5Ioal2LTD0qSlUaNDXitDPfgGXMtWsr9Cm31VtmmQbEhDWg8EaD2sPfYH0tuY+ekIKcYRcO2B+a/2WgCWhGmuFZqzNNoivXNEYjm1Zbbo73MEArItAe5ua4mzhMiB+pXdq08oFaSzGOUwnhm4HTZFBl+I2ypmst2qkfIwKaqxqXJpUlbFq1dSHElxvRkUw0I321a8ji9olIrjlN7cwFedUa9nMiOeDSaYTBOtDngJ628QacPxaP+xsknX3UekZISN6pvqxkud++NDki5g6Y6JY8QomFQUknJraGxq56FCWK7SsHlMNkUo4aoT5fnIAQHaxUC/HVaE41oZddU3SCfRF/wi1u5EFzoz7SRujpY0TL+tABIoT6mBNSO+EyHADupTpjR0J6qKYdN7nV/PCrqZbxWtWcPZ9LBKbSqvztnaxzjVoMsPNLQalsBfdkSqLhAumgm50SxnaiNlOni5JwZesagQyJYlgyq9lp67egg3RP0KCUEu0LbCtvMXUgFKMxTgYzObj8jWBFwd6Sd5YIythWbyBJW1aRmswMzCF4Vdrg3YQyjC9kpIsQVc3JQ79BTHxvCxKpjalDZ8bnbUYl9TXpvYf8rhRqv0kW7wxSR61gNih2n7Pvma2pmNMv/oZtKn0TOWgfkez6SvQJaZOK1CFijUQiJFlx8net0wV0UoiZFmEOdNmZ5ZpURDmAG9et+HlkHGOltVMcOMiZddIe9gMxDzHrBKApZIhAoCcap/y0PEiiNpRrP4hIVam+kXxtjuWmD903iIpmi6ZuVaru7AL6eShX5iIOvTQL12rE8R94si9MG6CsUdr0RjShsHgaTfVfkO/9x85FljYo9I6bH6/ynP+tY0bDToeu6wSel4KgFqQUb+tkyb3hZ0KlSliOa8a2eyeqw94cSFQM+7nHT8/xH11U5VXOVOJJbu6J5m9zGPgiq2E+f7OAfWW03AF12YiGR7lw0Iy9iKJ4+orD5osHTaO8UoANVrWJVtjjBquMaJhQyqBNnNacygfptDIGCPBVEOBQSeFbcmlb8eYTnbrYfBZPAaNn2Q9C3ZnYSi9XF1AL4Wwy2ydD9Y12psRsPyCDthsq0l87rthi31Rgc22pXDFVlRiW9HOZAkBMQBtNX+dtPCrA821vPJHVWk/kTAzyYKewvtza7TXewirCk99/vruwaP62qzCrDELhoS4KntrFqpIt2YvTE+UQxCWbGQVjiS0XB7VJ1BYBTcmMHl0USQW9O1aXu3wGK9CzwKjxU+EGJuHAf1AvVq5JelwGov7x7U4L9lf2xYhKzFWmuBtwTgSnxTFGb3QBeoWIXcTE60K1FDovVUs0fRnTZYenSy8ZdBVgtCqQchMa4OJZYkEtYfYb3nZ9py4AWp4+/9uUqFBWK9+BpPF5vAsWbZqzbodu/YcOnfh2r1nL958+PKNOLLkCBA9RC/RTxiESViETbiER4wT08QucSfbq4B3AZ8CCgUoPZReSj/FoJgUi2JTXIpHGadMU3Ypd0o9afeq0LtCnwr90P3S/dH90xUKYD1YL9aPGZiJWZiNuZiHjWPT2C52J9+TPK+avGvyqcmPer/q/an3r162AKAH0AvoBxgAE2BJZQNcgAcYB0wDdgHCSDSRR05OTYhsImTNnAgxZ06FyFWJ5CpAcslhlJBAwJlyBSo2XLpRxhpgkdWG2GCzcXY5apLjTpjnlPOWuOiUVa76yVpP3bXLf17aj5D/RNx7RAwQIWSq6C0NJQhdoIqB6a0ERydiiieEGQ6umDvQcPFhrkTIq+PBsxZHa8dwHHHKyQiK69ECPOwaDkOF9+ZUsVufGy0duSQjAJTcfggefwrAs61w+s/KB/IGAO32aA6kK0hEFAbbAo4hAiYKKXlqQIAomsFUUNdFRxlCeWIjFET3JQ5lhhcWrlXotf1vhItwviTTU6tu1IgicZGeWFEAqq44qBqfHKUOwL62hXDMo4LhNxXhE5ZASMCXEUjkjWyHJkfRDhTczmJ27iIEbOri6by4wEj3BHktQFPFKV4XEA7RYGPAgZjARF1KTAMERfkgGUzJ6VooG9VzqRE+se6EFcrELyya1rD+DST2cLVc7elvJL76yullNF8zOzeDgdctDgxh+C0TYwOYeEvr0DSmv+HmHvri28bOLGIlVW2GGmsqpdaaayliW+2H57jzzk36H/A27szTDd3x850BbHbp0sV3fQ8QSiDsOYiIyZ1VReAYRxyY4KRvxaN7M+GqO9ER2k6pSAtqo8Ob5zSemJ3MxifLXwTmsNWgsHrIeeoae3573gIQxsnISo9XzsYbaayJpiITkdFxJIwab+6uwdMoP5imMGS4azrosIGDZjx05xsi1RMfn14h6jFjSdWSYpDnklLWSVoqQRqzyTO9v/FxOOwhxzE2rpBO1pxdMyyEChOjL1Shcg5GVg7+HUyqUliyUYBQBlLewBR3rhFlpAC5YGxsJERFT1JMmlEgFPHpItgE83RAgUBb98pwxycZ32PSTwB9oIXgnONrIZcxDAfRetjXfQ4o/hdFlzPOAntsnb1aOVSwHB3pboQ8C+TXfgvYTRhCxBjYSijYS+j9148vE4B/XVKhlMoLtnZoljwG/RBuZSy7AzqNaBCXHBvu8N4GjsMSThewMRcGU/SFqJLf4z3V//XWblGsDVlbpX06p9v0mF7SW/rNuof19u6c2/F2pTOEjZlSSrExqvh6LKt0y7RNx9c2p9cNaLnl4CJgsgFWzpAKKT9u8q/qwI9Ps1XymeZ7SXeH/mE/UkIARwEu9BTIU1lufwfyUPr9NfWG/e474r1XfnTdd7435Iu9TtnluD32+uWRxw54KIQceYqUacCQUcSJl4CBiU1EQkpGTkFLRy+JwSnHXPHCt4kQyCZKjDjJUqRKkytfgUJFStSoU69Bk2YDDDTIYMNcdMdJz+x0wFt/uO9Pd/2cEZ7qcdtzJzxLjBee2mJTIv3nJ4eCt8FYdwxYa71DBIah8mZ+g1KgDqYKFYuKho7AFB8HlwDPA4k0lFTUkok1CRUknUUIswjRksRLkCjH2v0bMVaxCqXKVCn3Xa3+JKT6GaLWULbqA2VjN110xjnnnRWC5tmnQDYFugvgH2C7swB2fheW74GxE4Bi05FGFDqc8+xHOpbGs7hlzlVZ/ggYOcCYD2cAJjzkMEYMAUlmLzuLYoCstRuy6mCqWObDwIXDzX0lMFgAzbVlNYmHicAAadWmAZ0x4jQiPIbeZLonnTdGzQI/AnZkaesUomWhJy5CGUGNihKhMew4DQui8kgiFhHixJCidiQ4TcaPSqYy6SJhPCOpqAoSdcdED0lFUogH4SEynsyNNfCIkGyJT4GY53aCxtLEo0uE8QkZcrwKwUN4liSdOUInQGgsPEGAIAhDmMwcoebgqbF4PMeSKANQeKoX4QWfKUTvYUhVvnZKp+v1NBplEhIJdkoyBMc5CjGMGwawo4RUBA8RUCgtGcmxfOkQC2KUIzxfxo+bcYgUSSUjPG/2wRA8Hy9AmXM5JymBVEJEdXYkHo5gkqb1lxmL2EbkuQuzIM1cfjRw/CLJX0a3BbfcHXQo0ewzEqRvCcUhsP122/tmec636voLB1ccv9xg+I5IE69OWITY7gpKUPw2DJz6+zjhAeB3m1nS+yD5r8qiyU66WjIrQ50eSLGMWp1fmRE77pOdUWq3oCYgbZmO9vHS/7vIny16GRH7c6U58dVnO1mCYjuC8GZLghEifYxDtV1QIl+qg8qL9JKAU68EcoiMiT85Nma7J5C+ebzHeITCKmL5AtqcPPVZ16T66NvHrvbcnIaeQEWSSYqUTbTn8Jeks21bTaIOSKsroRhZxYEsZ4mCELrKizGDzFSb1dy+onJLQYuiEX2q0PgbshpPGKzMMBGAo6Bp3fRNmhmbIp7Qr11Yni0N8fQMhL3cyUXKvA7vI3r0DZ25UKpWXjsDpVlM11pym6dn/DKtw/3hk9hxbmzU37BljJ1iMSBGD1qbZ6Aw0wcTEmriJ7KgNfdFGhmEWEYwUXtKfZbkP0YL0wH2uQVQlHkJh/OtIpAJEOuZ1k0UU5B53XlgLkipUZwnX3uMRB0s2odS9k5p3p8Tj3KXdEZ/iQIP4u99SCqpPsNIZVfSXjoRBFJ0L3eyJfb6I5Z385YjDvXqtC7Fa/rUlweTPzrLc9q+hyb/8nA4CysIGAI4qMa8WbvRYNK2B3O4XazjHif6ins/6Fylx0ItNFk+EzI4rLbVbo7KUfWkO1LZmHBtuZhEuMkQnp8Yaz8UCaosPLSPc06oQ9OZzUIrrW1Ki5VtbHG3brr2dZig+gxXOS0n2x4CUpjhAoAib6moEpvpDnDUDYMNojyV+BqBJcsxx41j8o/KhPuipabv1aDj2cQixKhJoylVxVxxhHGs8NtQSD/wkuFXooiV+AS6zD9Pzf6nEdqwKKWYuVIVh9UreFKX7qFKfBkFNzh4HyXe7b+XgOtl+mSclYvMQwK9IY3FqYPL5SF8VpJS8WoZTB+yz2cHNCpy8H+mAt6495GcOBdD8dpXSADLpPiMEUkvZeEBK2iDhE8iKb5B3SceYfBEaV2Rah3io7ubIRLRbP4C1TyYRO2t6ZFrHyT13be9Kj0TbCFaRrhBA0t3TpTzJKp59Y7cifnXL3KQ8FCQyxSzEtUpGIC5aDsF07BXM/A8LealSCQPzCTsUVRhP3qlM44WgUyYVEwJgTiJUo2B8IlvT4NZAT4YxsmylpT/qCIyXWpPARozeCSgNJ1BBTGOPxP5PxmVFrC+fgGPPOecXEAIRSCwUIJkfgvjiCn/TJrgpYkgw1mvQ614YYODHGXjo5k2IESkgjGUV0yXouu2nrL7OBD7dVBdS/5MQZwiATGyEWU1yAo0mWhiqAAqjFXusKXphuxCCNWeoKUMWeZT8GgzpCfr0NIpfYn5A/gOrGk4kEDGU/ZYoUIZiyvkEabu5ye5w8EQKWIlWQd13OVWU5KgypjbxGaXeIuYtwnRyiv/ZoBU/mGkajYtg1GxIXPLJJqNnNPyERjSwM0+JoIwVj00Zbee/ePn7Hrd/9d6pfqfS16QWqQEDlWyqzceADhaW5X3G6DTq/xImRvFkdgFtvHiKBlKbYEaUkCV68qwSBBhqc0B3LJFdSzGQcBrEEjWwP7zYkIxXSqCCny2LhHFrIfMnKumAxSpvAKHQiLjxVFaighkKm0VCHt2jsicBqpppYSJQAlVNrlBUUJA2t+cpR6dQwWuEhz61FVqzF8KItWzTVxqxfLuSTbGQYb6UZOOuRl3cCkpPJLrLSxj87uVksx848gPyMn7qB49YDFMw14RJxGkXR0jHI0DWhu0Gqav9hWfm5fihfiSPvXLD+2uSv/dFFqSQftNZfpPlHfqww4p4ogd96v6dQbFetRPSUd3BrXs/ggo5rcLFunvdg/9uLvp6brQqPstyzYylXtI9+E5ornSGhJlJD9/MNeZC1UnTbfphtgIFaqXMK0b3gXA3k8LU/KibHJ0YXk+bH6v/LcvkJAhhQVp4jcd7CDxIp/BfQsr9BC3aAUu3BrGlIQOEihGs4FA0X8o/tx69neNbVoRTYgUBg3a9hTMlrLmpNr4GM71PI2soJYV4rVanLUFG7Ugva09C+5XXSNIjpBpB2xX03vQ+DHIRJOt3K75LoJkrXE0mRAbr9agjP/9XQ0FobmBsIEGRaRst4pSoLcCIn8+B29cS5HP3JSa/EB3zZej1Cf+rjPxFGHIRi+mW7mVuVA4QsD8MVdSSTLz+QIt3Zfxcxn+V6WDoYWK/7gx8ySePERFxuZ8YT3KGUlBMvxDgU4TRAFU2yFlS1WIhNXmjm8/7BVBnpa6YTDI5D9+2/tJ/2QebEtuzaD0w/ig0+GrjVsqm/qwpiK5QX327NxQX9dLCy2pY8XbqdqUiJIliNbLikGZl+DUNT65a8xLHg8rqUftaCaCSmWSoVNX2cS24dZ6xJCde6Xwa4+OZmSDlZ49js5V7mZua0hsiMlA1ECH6IpQmNgKUvgk1S+Uxb5syGTmcRlUTvF5Sb1Xv2apBimOdC2pB6QgpEfhaQn2JyMFQEls9oTspIIZElkUHVghfMg/BZmSh37O3htQ3ohi2oMmwEbqAHcmKrfcd0iWhw/w2oAjIwlrD4cbVvNr5Kwd65pge0DiF72Yfr9yXmT7vc8O/127W6VM5b5Ht0rqnQoOI1vucruTDN0r99EF2+44WBRvfIBwIG0Vm2OVUTI1eYinjKAqUl4t9YngtuziOZAENdA/HrU8EqkLVd03tA/mLdWNuzRUWUs3Rfu8zVCKHBK66/ZAIXYuj9Iyhcmmu2d1VpLaBBFDLRaRym/CEHnJfr6EEQuH0CE/fpmQRz+UOh0lEeJmNDEEEzGSEdAdWgklJJ12MOGTihRDJLfhSXskNOtaTQxr8SdN1KiJh+iBwVSroYg9fNBaye9QF9GLsWUnv9AvkElYi1T5wubZsc6Sj1bCnWu4bo3m6dGOqo/WjVPYaPWCVjDAS5uBcL1SDTXOPcpLwXOK7qgDcu2vaJ/5NXcRluJWm2J9dCKQuGe3BxIBI33/u7lIcWZ4r7g6Vcg95P8dQgqNlhZtTxMMlaJvjSFOLwXv4KvCs0Zfk5+qRQ8+fqq1GlAoFT3zXdW1317tqCB2M4K0I1WTmXaQtc5KkHbYAYUVH21fnaXQZr7mEmRJVBQQld09RReEbmL2xTRRi58lMP0kdIlT+vNUjxV+oP0l3ULOR/ip6v/9BerA7e3+2YCc8QINvwtqwc5Zo5ZJit1PdzProDse7ShiOM//xhqHQgEWPujfdXomRg73X9v2Nu2jZGz/2DKVFJWCzAhELmwltvdNheGpnaT2HlECQvRVZe8cs3d61s5eFalh48SODt/GiWA5MZ3WPXVidwl8jshGUDZxCz498WQZkYVOvVy6DMUn+W+nRs5u4+78eeabxoPdaePr703sy/3R0w2mU+opDf3d40l2rVjnTbU4g2YClIPzF+WUd9W0/mi+5HFnmC3udM8lywmXJ8OY7kl3nQBf4EYuCboG2vzS6f7SSeq89FbOtLOz6iHaA2MgTu1utiT1lJQkTW22uFXBeOeDtn/rGoaWtPEYnb1vdx3Zv7tA3ltS1CcrWGNf7qjn2uzs0Y75s+fNWY7RNgZFEZR072vj81zU+Nn7rRn0RpCP5Jbj4sZWx1sVusEbJqqKk4GVuPbVAfdAu186o6C0W+3OGMv5cShQ97Tq8MKS+GRPizW5p3Re75LpyhLiVMaHhUQURpjE/SiKjoCXHOgfQwE9EZgD6yLbMcxOxgaxF7lrXdkdkjHIwPSjcpc+4QdZdgT/+/P73PKk38g2DLORfzcIfC5ZH5Y28fsFkRBqVxybCJFCDMf8qTE1WU/iOSTYeSGQHCrE9GAaVoC1kTtF+VlENYqqiWBKBFFL6sE0REQ6BQ1jIGFT4ve6aLAeEo/kJ1HTPtxoeghBn0r+/yNNw5ODyREkLdaN6RDk4br9NppenVMkIo/UQwpH4Li1+2xUHaYFU3DV/YWugVa/dHp+6Th1Tm1/0LXRbS6bkV82YZZzpDVpWsnsics7csZ1TS2ZNWkl2LR76OAuSyWkBXwlt3pepxK1PpeY+tkzHCHD3qPrsTdwbA72KMf8WfO3fcw7yX7sSXtXS11tV2v7yTeYnlR7zOvLcmT2Ye+xYwgfOJYcwDAtsfxUTrnmurqulvZTYwb8dtzrzcrM9LY/oB4HHdPXC8GYOQtM9Z+6BdZ4ReWuHxQSGHl5LhlVna4vHiXPWYsJVkyq2Dc5GkHRiilNZ0cfV02NwPSk9iO+fJvdmm/zHQEpOEUR7Ez4a2im45n39OW6eFNxgSVJ9ls21ICVkUqLnQq+06ovSzBkNHH2bR/nf1J1c3IgVqtzMncLlYMWfAO5Fqv0Z0u52VZtRRyQRpAKsIL7RA2CqohkosrG0v3Vuh2gCecYycvM4jY6vnCVtr6WuqaaV+emlj6yHyPp/2V/UZY+bbIJFEaQ2quIYyoL8iASqyKylhVR16IkQrLMVuKYqiqQHEH0Vd8aV+ukosqqS+XcayXVahThVF8uYV4pN5lRcurY2+OqLSSipeOMhXLOUq0GeRGoWbT7hZ35u2Yv3QxDqXsv0GLP09anQogpdu/vGuYL+1qRCiU49/xPzPqfeF0pEEVgDnIW7WPRvGgVApXOv8En3+DvTYUQJHr9h0JclhQUIMZxTSc2ZLPmk9QoqiLtQ5x1zXs3ZDHXkFQoUUUCf+DUrkSZVaxvnkJvkemk3lLIyhb1qYQnOWZJRzrFwLWjNT9pv8Y2HzwYIAkyvEKBzwxjfCJJh7mixp40J4AHOK0nUW4V6yf30Jtlepm3lGBli5aoRT+xbdKm9MxkrgOtOWX7OnzJya0FJGF2fuot6pz6tOfKXFZpXDA5DMKjLn3KYy0z+7RMbpPwPIbI0vwqH9OGvj5T+diy7HBkkC4NjMnDcjGCo8YHzDhLufX9zlLMTsJ0WDemxUh+TIyPLDNbLBVGbZsrT9tWmeY1yS0SXn5qiafCLrOKeb60Ym8loOOyR2UkdzhTmCVppgJ2Ei+P/HF5vu+WeXBJBV2wcjJmlQW9tU66e/Og6pbVt/xDLgWE48yVadq2PJe2rdJotpSZ38WIMRtGsmHdmA4j2bGKPe/LrUqTzMpqltzyxyQJZ28wJDc47Mn1dclWVS5LbdlMBdXupTYpZbn5TUPfzIgWRayhvx47GCjBuiwJ9ysn6f5sWDL2balQYrfX8yblZDKajDlBfrJZYRVwcjROVzBTZhVwszRuVwFIxOW1GI2tLmdq28gMuyqP1RwfTEIYaKku+/96Zs5pucYh5/qSIkoLK3wcC/r6ZuUty4zTkUV0MD+CZMemmxAWDCuQAn9iRWlNUeR3V2LM6tv9VT+0potPTECZMIygTdPFgHNcV0ubc6hGfYe79KibJMjMys1qj35QaTVbq4za5ix9QuECD0dtqbDcXFOG2UiYFhtobWkbH6Wwinluvddb7pCP4PqsCtAZYbI18wnZ5SnpKU4R32/GG7OgHYu0uVKsLp/9pbhop+GYnryKrJMDw2PoIFXQj1JpQ/TY7TTqzj/WDZAT9yTVnNv4apvhummWvZgmdOUlhv9OnYOGRnZ0ipGnC2RR6IXvb+UREQT31S+XpI/v3I5lw8Tyz7cvhH4rBndxWblB32esw36v3yKOuhq5cS6R+ILYhoKxFNDA8SWRbFjhHoHfmJruTLkIU0tN6UkOEVdCwV+Wx1nvJBltvsznH6c/1Y8Wg87FH3bBLtUcJRmX2ZCW3JaXwixNM/s5uk8lJWmWYbW+uH9PPzGGQGO+uG6yOGySL3ZsNyDhHPWzwXhBanNH5VFsVLK1yZVjKjUoR+UgEFqos3/SMXNOy9QWOceXFFHir/SyLJFcMuM09X4X+ztyyZk0im2kK4vHTp1HMS1W0OskzBZZSYvFXBnV4Yq02Tcqs0TiwzH/jpfhbVz2/qjCbCSSH5Pi0bU2GxYe8y7Daon37cot7/dUqCSBPqHt8ktx9xsTgdlt9pztjf5YlGEOuccIAST2C+uIrBzzS8wOnuFkxeTRyzs4FzkHG7KIPMMqXrxnVjHp8WWNTG4KcA1SF+X98mrLLdW269cYyWt48ZpgMdFEMBm1llF5YDFOEqRRt3Vqnqi2hWcSGaouXsLbATfts5L8U+zNh3Po7L8kjpz8vNNYgITpsK/axnY16nIZXYLEuKU1a1dAsT9+56SYbTqJ1OTlAQhncAr5LsOwFUVgmIlaOzG/2NWdU2L+nJvyzvBRTxqMmvoViu/bvL8evMOlOsWJAROebCVhVnKMyWVIz8u3vZw7MNIflgGxgGTHSi6mFKcBEIEu7tu9pMWQQUQSqjb3x23rr0pAEVhYvndpzSbwKgJd1Ll0qSc7DYZlvrkLaQsXVrlQpMIzbyF1/qIqI4TA9PKlS6s3oeji6iXLJIuXVS8GeSMIGdGX9v4q3nzhclQGAc6Zu+BA/MIDc1NgSBF9edNZ/t6bJ6IzIChnzapvE7ojm5MLDh+FmeIy22ru11+VC7H9oriti9pvgMPudhkIED7lB1fTJ5BjEADDMKKBJT7HHEY3lc5mwgABe3HaYjp1sNZ2R73trQ1NzMyyp6W7zN4GRIUiLCjf4jKnZ+Sb3NW1JWWDTam0Y+MnuG1KclFOkyzVl2K2lZ1A+NlyYa42QxOskgHu5OXFNYUR1+7FmjUXp17drDEZvYSYx4+8lKzHMAd56q/TxeFV9J1U2nY6PeFdsl+sVlxPlPsEWUZeiiaSjj3m0ANFCQa2koetLPzhnadty9xkumTkfxM3xccR7uKZodCvYMdqiZnPt8rl/WZmnkTsfz+F/HXCtxrNG6HotVb7BkhwXZOP/Gdc0sYWr2di96H/NsdxoNnncfg9C5Yt98zx53vnLlvmXQDW1MP/tFASe5Mk/RWnqp76x52eXXy6Cw+xiBUTiEqUqCKCaRQbMWbL6rvPEqWlSmNWukPmjnOeNf8bqBtqbU40ZFZJVP40caxHn3/8xj2ql8RCiWwS4OJSxrA3nhln+1x183iQrtDYE1Ik6d4MVyZJjSJqkkluYqaIkzNTbDI3vWWo8nHduLPtjVyDrVKs8RgkLMfA6pisGE95Vlpy4SglGIggBbAxTKyaGLP8W+Wx+WUwUkP5NpukQlEVKXsMFjD+Pp1GXUUBKThDG/v64bGBz1Vn5gXjlCoHj2eR2d1BhySTea1BjEc5SClJTfST2CjKJonolFUlUoO1Mklba7UY6kYZgBWXP8aTuqq5lD83u3KUyiqv5JoGHf4nnqH4TBrfXJwhn1pVFlWo9wUk+vSKJF2t2ZLUUJfisEutiXyHXM63WwVSqVXAt5PkWK8JDEZAaVlTTC28kYq+TamI84leFKot1RQ2lwEJzt0mSwmmqwTOTMWfsIngLDcbk32jpJlZI6UGn1HCyRreDjmiCiqz01OCbTKXNVBgtloKTAF/0GSxBs35uSobo0hg9Fmys70Wo9FrBR9xsiquedDuf8ovR3dMq9w4qM//hnUma3J9bYplk/U8v+we4N4jk1oEieFERzxM8FVYZn5jkx7zTJ/Dy/KNviw4Y46OEhbcLfKJXTK5gRXsEnslHtDBZBCeIVYl06d5X78/eNOjWk6JiT49JdqlZSZAwz0CMJOA758wbuqlabFMFYdyJ/20f1/m0GI7xhHufsXjDPOWu6P24f0pdzRMYMN6zzg2194sJ8Ry73HZjwRqZBiSz4hAcJcd38ojP0n7p3afY2iTDeOmZaaqxCNouK06WWLAFAdGhCIIrB9AUEJ078Qd7zIzEDSE+J5H+BdG/iXw9DBQ9V9AVtxCwbdhfBvWMaQbcAzlMeOEDwSiFYnUJijwDoffRfghIeE8/BmChvvjmdALLTPxS7FEWm5hgrNhLn9jdaak1q1NYvzXNMgf4G+TrsOS0nwuRmQhGYtPzcxMEaWZuPsTLwiE/+PzHwkFj8DEUAJe17y3OOE0gwE9hR8hBELUuJxBZ240+CosK5CeJCkcjJrwF/9sgWTpL2Id/68JUYOFkqRAeqZGxuWweTIZxuaQpCcEPzKZ3wuF3zOZP4KBMMamikH+ptUnyGPgCvnhCSlZWe5aYuaIXYHRNQ5JrUfHv85/JBQ+4vNvCYS/Ag9oFPAu8hr71jcmYbdJTaAjjH6HRrtDp1+i0S6BSeVr8z+NWPv6KFEb+3QxHlrsNTa5Ow3jgUXrod+l0m/T6Rfp1MvT8+gnbwp37MM/g0lfR86jUbsj4+cgd2MOrdnccZQ2b+verYGf4vF3YOKayG6KfuGVc2U/4QrMxbtfz799jiL+j07ujE15QP/XPvhLyyiu3lCQqHAombRRvGcFHEnMHfxh+lMa7SnZ8/zn44YAT2mVShJzzf+a5KKY23jCXZj5d3bI+DMJwhM6uZuW8oAO6QZ/aaznCpNpD9NpsXkd1zz1nYMjgiqvXOVWy+Uer1qr9MlUHo1K6fYqQE/rKdECe/OXveFEFwy5kFhwr61lveHQobk9yc3R3eQL5x46LFpva97bG464INhFhPSl6rJeeOj03CmHp8TQ3DMJjI9AflAlrD0ViInojoLlaOU75fuusRc0uYAM7dmWsFolh2FzQOz8DXFLVOnQ7Riw45eO8+DfToqGmMSSHYr3X4wl1B1mEDNdzE1s6QY3L1ufsIaPefq79bK/NoAqZwwlutP45L4zjhxdYwS/s11nY2c0Oc75OHaviabEAJqocfQELnYCNf/AaqjbDr4PqeHCECA/w8MxMRD+DB4a6mD8GR/Xlh7axsgVAK5uT6rX3GzLpSxSzOfZmmaMXFlNN3P70D6bjdjH7aVZOraPnAEat3eP7VpRHWvh9EZ5mohuqd5eOKNbX6f5pfKyXyyfD97uZ59qZv8uHtFPeEWAXnzTP0L0u1qjssMqiBAKqckB6h+Mtklx4XGT2hh/UgNkNRRKIKhhwN0PqwnJzSh26p/bzY0Nj527xR9UO6UdUsEOFicS7eTKbwTC7xASN3NVoL8mZoUV/cSzYBQiEOGSNyUwkZBcgL1fDAZBKDwb1sAKyu27ptPI/WstD8l7ezlH5Mb+n067g74LN+U9tvi01vfRiWpm0i+eQnC0cEt9sfeLyXGTPTMbC7b82NVimmaa2jIaZBXeGD1JU0Oh8q6TBwoa3TPnx80v+WdGcT1o2RIDGISr2FwyZNxKIFyFnoM/NlWuMba2p26srU4fGDNmQ0bVmD2llVtbg4oev91gNNpSeHNL0jV5/spAdlJHlTldb9f1x0Rb3Cz0N7bgt3hqNPsqQzCb1WCv8M1dklfbOlhRtrtzfOGOgeKW7PGivv91XBWc/3mOoo8qs+kEZcZkqlZqVwmDKcYKwMA56qRat45Ds/Rkvd74KtEpkoscrkStI+i08E6Y0zdhR68Sf86DsoQIiqIkoopUxHRmRFY3XcApECj2aG6AvGSswWQxFCoIuOt/v/x9FyuflZSbVu2ReEWUH+KvmT5PmUQX/B+QjiIv4CvGIrWyMMWgLCpSpf2E+TE1m4WEwAk9CWzw7ri+lBa5zKe5zT543YUJhENEbmK9oFmdfW0NXyRyRjbsiWYZ9K4KsVFTRKMuq7XcZh/63klO5O8I4fH9tV5T+P1qvliYS63fHcNKSvJUir+FeDePl0lMb65OVcpieUO/lkmV4d+2s9LACpyzT19dre9z5ul7q6t69Xl5vfqqKn1vnlPfV1Xdq3dKrB0Kf4Giw2ZTdPgDHQqrTeMAKjglnrqqlvE11S3tVRwrefMMr/IYuq3nX6ol2539evj2W6j/Tj3tWKzftsVG/kK3DnEtm1tF0mJ9tiyTISXLaDnCmPA9p2SMnoj/LBY1zzLF5p5dxf2nSryIz58mqQJnKAiKNOIX/BUFP2haDmPL4O4HMIGFNnJYaAjCRme+zDyNw53O/OIlkc3REElERysKI44KkbfHFGl1ELngyIDEIkg0i8WJFkuiRGzme1kyHYY5cbkwXCgKEwq4IiHvm7kADENXeWvI2GqyLA0P03eUZMNUV5WwSjSHpuIoKapYEZwcmM1hw271IK0L0sANP54qM2sa7ep4v96UK/zjlw5YA8FcuFUo9FB/Wl6Tf8t0uq2fwT+ygWwR5QdqchgLB342XdR0Lj/ppQuttTD3bjcrNr6r9fLEEnrelLezaIlZdH31zVxDLM6O/ftZeuPslbHG7J7Lk0hi8xauXkWH42/27J9zLN4u/Hd61tTnPPsnz1VIPCpV3zVXeUXuVEgnJL0FK4CuC+ZCtYgddPK6B2fan/luRpSxHSnZCTpe/KrJD2qwYlKwOCclubhOaw39qhriwpAGqr54byTfstJW/bjyTLQn3pBbmJkqH/e4llyFlfizDAZ/jdIc/rwO4oJeXFZLRmZXTMG3hQSUQEAI/q+lwEq/FAgOPNSpjBgTzJxgnjNZujK2fpW9+pP3yDEbJVGVJ1YHo83MLYQQAj6EMMgQ2qSMwYsDT+i07stos7rwciNXCczkx0PmT1W6lfwKLnBCNhi2QIGnCfcKCWw8xCIUPltgUhRXKLM0deyEoYJOPOXwpyyK2GIxm/onb4JYEJ4Nrf5XCKthWAsDSQTmIM/ZiDAhiIlsLHt3dmZC5+jzRCwYksy/JiBfFcxPhRAWfc8ZGjSD5Ic+c6TgBts40cCIOpeQsJAX8Ilj8J46NoQ8R0Jw6NzrBPwCeIYfRg4hqcDwgKn2Y9MAbuerwJ49s7n9UerZe3Y7ftmG0M7v3hOkWah/r1oV0z6FPu587wa5gUyu73rUUchB8vwPCEjBIu+aqoOnUIYC30uIFARB5QHtXlL/1q9PC90x3dpP2qs7uOObf5nw27eGlUffEJjIiLdD55P8E2FtJ0/YPB3WybawEzwgGY+8QBYeRcDnqD7a/1VBvxNCpIUHqz0cDwPoS16gYP3N2M0zxu1FKJYPTTVxdY36H/n03rGWGySK7f0kv6SuyX4SDM9HXsCHF5L5vMkBcoMNiqeTz3Z8t6c8FYo/OgzsPUuJ+VT2/X5hN6f5VzDzhzlHRNZgpHxytNloyMjz2l98F0YGxHJqEB/uoy9NJzUz4wjh18N0QAKakrV3+E3TNsTjcZffeH66p6i93iasyFXr3MVt2+SaHOb3VLvGpcuTM7+j2rSuNowvOyAf43GqtZ6inQoqc9XFrH2VRjhPAUSR3KkQCJZRv6BQZlEpE07x8ScpfhqFKoFNadWtfiWV1vHnYw6Ykto1k3TD/mBz/qaSKiEHsCSj1LT2EjVpc7B2mL8F+uwl1ZGcosIF7TlWxImsLvGtWNiDID0LAZdd/prFflnO5rheslmvXbGsLiaji8WczeBjCdbmRF+UJb1bx6LSHfh3ROpvTvqZjctm18A6hjgIb68dV8toZ8GEtoQ46An0khGPfwqD0K+JtW83t3vfHziwGY19SSQwMNz9Rb3RFk10VIxLg88Zu68mmveKxb8FRvRxqF9QKRQbT6F+NcHzEOA4gFBNSMPEOeF3HXXdhVNHmz8qg7YJpo/m0aef3fMCBZfD54CK4VnmD6pRwYnr18LIvL0FE7tUUeYJlZ3gbTvXjJg+fMyl+KUPpHFvL87E4tBc8dn+mDvSpWdlcRHHV2Cx7FzRObDOjgAYBkgqAiMwQMAheiNfe4fXKLSPF3zgCB1qc9tt/qRTnPiBDb7MnqP+BZ335WJYTj9Hpuyg0Y4nkLoiwEc1fXc6uxNwJ+ZwHhDnfrkZlseeoZJ3CAnYPkLAGn0hLcAnfPV49fomuEXRW+rONBUfdw9HGFTKZEOf8NWDeznKq/WBuE/46sG9jFkVdxdjFzb1oE/46vHqffMsWc8aZwo+UzP6hK8e3MuScpAYAYqyb2vkqI2LJKEfEsqaCEHOOLotyMm73Vvm3erdgTuZXS6OwrLZzTT0bveW4VbwfdZqbff4iu0VZRVbuFZWVguXwFXgNore7d4y71bcyVoYmuhCwLvdW4Zb2bicplCAIpmmXmWf9vpgX0W+klAlwrncBclTvU7JTaOmZkB2iHgmnoVn4zl4Lp6H5+MFRQu3JjDv/tuQaWCNWZUBMfechjzfBbnXQqnte3wCnDPn0Ooe0NVONced0a/aduIu4JvcRXyLu+K+6yB3Fd/jrr+WB3YRdMs8TLR6piv1XvmqPdZxrV+lJoe7y8cLqNsxOHXr//cK/X1HPcG017n/TFizsgJTwYDdFgDW/PfoC6hHxn7A++x6Yvj2sV0vaF44rudmBuib/VYQumMJRbzP1IPNk44M5ww8pLFvcinC2s0Ek7Ij6jzOWOb3mjq8z9wTQ9OZfcKXQjrMpIj3hXpwgcqkOrhZYQ1tT3uGHsmd6fCBP9sci80c0YNvk8+LHc8zlGV71GH8GR/b6bByY/KFOM5/74zP/TwD+aMlR8CztV9NS11H0emecfI18Jk6/Bkfw8M8Q3bizwFgZodDx2Oe7ee1PaTQ9ZjEebEnjJQutveMDH3slvUEi1BS1JNciY2zP0gkOQCZtwe5HnaoGakqKbFvCQDFIJb9DCwolTmAgp6u6Y/e3jhgFOYNifvQjDO3U70w39IQKZc8iJsnRx45+wM85mmwgT8z8jVPwLQ9h2VrMnvm0GtbntYeU1FmwjoVy0EoPIiN62crxY13RGtPTs719g2lPYu6XcW8mBwmBIwXdi7pvTavCDb+jwsbfwJ8s+3WzxDg+yO2Hv25VwJ+vcBgNQYI/GcikVW7GujmqkLsD6Bsmv+o+wvOq7WOH4X3ZTkdEHRX8pfgvp6ZmXKAJ/9kow+1CQHnDIB3BbFNaDv2yhQcQXn9g8DrNaycdCyUSLvAJlLkdfG+buDW4im8yecO77+UlvNYdw6r+qnc7fo8drXJeb2I9I5RtrdmSsxlcmczQfm8Md7y5OF6dtdkTl9loNjpnC4KHKy7mJbHsx7OazgibB2FkukEXy8puWMsEOrww0TOqZeY+xRtiOMvn0KVbCgcRm9ksy6BY0OnAByrXKbsWcHc4KxCWO/FYeKMZDJIPp0W8gIMYuEALpACoRAIbinPdLMAJIM1WIIZuIIN2IPpgWJO2Yk98/qzIzomg70lnYUqVCs6fQRe41fGg3Wvb8kxHFTd2GHhpeU7rBYyS9xMYB+opprtwrZ7PenzT7m9RsjJ6t3iVHooJ2pWQ/hMc0AsETvCDzHPhEcI7z5LmFfMc+Bwe1BwnZzKJh4Kcuy6DsvdrGzFRGtNlELcvIUKwA5cmbIHLZjH3MAcDeCAvQOyyH4YXDI28QXmRIbL0AmPYRzMBieMZoNpaIIXrCUFSjAPjg75RG1qVdBEZbmpOgdVVhLlN3uwuLBVc147LQSyqRsXEQmBrajL+cg2shiHlnXgRfBlxNymMkbZxTJOtPtlPPfQygT0k1Mm5Jra7ZV5Z+nuAhvlYwj+3LRwn0vZXXR+ZiUhNUx/dWrUGsiUmpKKFot/BVXH32WQZnUGkjDl0Z9EvSoVVNlsrH2gWhL9DWBKyLH2gaQG8Keg0JAn19485ZzVqE0RWcKxGo0hVU2imVcfwEVLITu7sjG7obyovzKJ1f46pKtSY5BGZfrzIKenpJbKJUWyKAEM2W82TjDUgnamm56tqnW1rgmTaQ37a9nMndM7VUijSnujOvPHGjkz9F+fC7doiXJUsclxxDfQqFdI7/TjVqYZBzD/w9AOAAA=)format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}/*!
|
|
* Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com
|
|
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
|
* Copyright 2023 Fonticons, Inc.
|
|
*/@-webkit-keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@-webkit-keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@-webkit-keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@-webkit-keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@-webkit-keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@-webkit-keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}:host,:root{--fa-style-family-brands:"Font Awesome 6 Brands";--fa-font-brands:normal 400 1em/1"Font Awesome 6 Brands"}:host,:root{--fa-font-regular:normal 400 1em/1"Font Awesome 6 Free"}:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1"Font Awesome 6 Free"}/*!
|
|
* Bootstrap v4.6.2 (https://getbootstrap.com/)
|
|
* Copyright 2011-2022 The Bootstrap Authors
|
|
* Copyright 2011-2022 Twitter, Inc.
|
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
*/:root{--blue:#3490dc;--indigo:#6574cd;--purple:#9561e2;--pink:#f66d9b;--red:#ec8784;--orange:#f6993f;--yellow:#eea074;--green:#8ae7af;--teal:#4dc0b5;--cyan:#6cb2eb;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#3490dc;--secondary:#6c757d;--success:#8ae7af;--info:#6cb2eb;--warning:#eea074;--danger:#ec8784;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:"Nunito",sans-serif;--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,:after,:before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}footer,main{display:block}body{margin:0;font-family:Nunito,sans-serif;font-size:1rem;font-weight:400;line-height:1.6;color:#212529;text-align:left;background-color:#fff}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3{margin-top:0}p{margin-top:0;margin-bottom:1rem}ul{margin-bottom:1rem}ol,ul{margin-top:0}ul ol{margin-bottom:0}a{color:#3490dc;text-decoration:none;background-color:transparent}a:hover{color:#1d68a7;text-decoration:underline}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}img{border-style:none}img{vertical-align:middle}button:focus:not(:focus-visible){outline:0}button{margin:0;font-family:inherit}button{overflow:visible}button{text-transform:none}[type=button]{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}h1,h2,h3{margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:2.5rem}h2{font-size:2rem}h3{font-size:1.75rem}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.row{display:flex;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.col-sm-4{position:relative;width:100%;padding-right:15px;padding-left:15px}@media (min-width:576px){.col-sm-4{flex:0 0 33.33333333%;max-width:33.33333333%}}.navbar{position:relative;padding:.5rem 1rem}.navbar,.navbar .container{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3rem;padding-bottom:.3rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:50%/100% 100%no-repeat}@media (max-width:767.98px){.navbar-expand-md>.container{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-md>.container{flex-wrap:nowrap}.navbar-expand-md .navbar-toggler{display:none}}.navbar-light .navbar-brand,.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url(data:image/svg+xml;charset=utf-8,%3Csvg\ xmlns=\'http://www.w3.org/2000/svg\'\ width=\'30\'\ height=\'30\'%3E%3Cpath\ stroke=\'rgba\(0,\ 0,\ 0,\ 0.5\)\'\ stroke-linecap=\'round\'\ stroke-miterlimit=\'10\'\ stroke-width=\'2\'\ d=\'M4\ 7h22M4\ 15h22M4\ 23h22\'/%3E%3C/svg%3E)}@keyframes progress-bar-stripes{0%{background-position:1rem 0}to{background-position:0 0}}@keyframes spinner-border{to{transform:rotate(1turn)}}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.bg-white{background-color:#fff!important}@supports (position:sticky){.sticky-top{position:sticky;top:0;z-index:1020}}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.mb-0{margin-bottom:0!important}.mt-3{margin-top:1rem!important}.pt-3{padding-top:1rem!important}.pb-3{padding-bottom:1rem!important}.pl-5{padding-left:3rem!important}.font-weight-bold{font-weight:700!important}.text-light{color:#f8f9fa!important}@media print{*,:after,:before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}img{page-break-inside:avoid}h2,h3{page-break-after:avoid}@page{size:a3}.container,body{min-width:992px!important}.navbar{display:none}}@media screen and (min-width:0 \0){.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-box-blur .trumbowyg-editor:before{color:hsla(0,0%,78.4%,.6)!important}}@supports (-ms-accelerator:true){.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-box-blur .trumbowyg-editor:before{color:hsla(0,0%,78.4%,.6)!important}}@media screen and (min-width:0 \0){.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor:before{color:rgba(20,20,20,.6)!important}}@supports (-ms-accelerator:true){.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor:before{color:rgba(20,20,20,.6)!important}}body{min-height:100vh;display:flex;flex-direction:column}footer{margin-top:auto;border-top:25px solid #fff;background-color:#212529}footer a{font-size:18px}footer a,footer a:hover{color:#fff;background-color:inherit}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}</style>
|
|
<title>Noire Labs - DIY injectable guide</title>
|
|
<link rel="icon" type="image/png" sizes="32x32" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABmFBMVEUAAADzle7ulfD2le7zlu/7j/Hzle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7zle7///+7qaO3AAAAhnRSTlMAAAAAAAAlyPqRB2/pLFv52CAKa5lEHTsMs/dtDbn9ciIOBBcaGBsZCFza3dvc3t+AAV/n/vji4O7xgwVK9Mwne5gJMvPFC2qKNIxZwBJPFcSemwZT1iNS9SioiwLH/D836Oo6f76w1ZCqje/QtFWsnb/hl/vGYM+JdSHSeW6UkpN+KYbXjrB8mPUAAAABYktHRIf72QvLAAAAB3RJTUUH5wMKERsNJetlTgAAAVFJREFUOMvdkmk7QlEUhe8yJhIlFApdRdGgAREJySxkCEmGzGSeytj+3Xqe8mi4tx9gfThfzrvX2vvswzBZQlm5oEIIhk9AJVGVqBBQLaaaWn6AgURaJwP4DeobJCgq5q9vlCuaUCiguUWpKgigVdbG30C7mmU71KyGZbWdKOGo7tLpu3sMhuRhNJnBAfQaLFabva+fBuwODoDBoHrIOTyiddEo6+buFGPjEx5MkpdvkH8CTKWAaR4AUJFciBmaneN+JogMznlgYdEq5bSA0EdLywBWFP5VrlVgbV23kbyAO0CbWxzb1G4HvTusOWkR2g3v5YXAvE8Hh7aISwO4j+hYgtyAkCV8ckqkPHOYzn0R20WOBTyXdBWltK5vbu/UyDa4Fzw8in8BCkTpKcsCzy/W11j8La33j5hN/5lBAF8UNH77/6QXUKI0E0hQnuKpj/sD5oxhZN23X+sAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjMtMDMtMTBUMTc6Mjc6MTMrMDA6MDC2mtnNAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDIzLTAzLTEwVDE3OjI3OjEzKzAwOjAwx8dhcQAAAFd6VFh0UmF3IHByb2ZpbGUgdHlwZSBpcHRjAAB4nOPyDAhxVigoyk/LzEnlUgADIwsuYwsTIxNLkxQDEyBEgDTDZAMjs1Qgy9jUyMTMxBzEB8uASKBKLgDqFxF08kI1lQAAAABJRU5ErkJggg=="><style>.sf-hidden{display:none!important}</style><link rel="canonical" href="https://noirelabs.net/diy-estradiol-guide"><style>img[src="data:,"],source[src="data:,"]{display:none!important}</style></head>
|
|
<body>
|
|
<nav class="navbar navbar-expand-md navbar-light bg-white shadow-sm">
|
|
<div class="container">
|
|
<a class="navbar-brand" href="https://noirelabs.net/"><img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMjExLjM1IDE3Ni41OSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDoxNXB4O30uY2xzLTEsLmNscy0ye3N0cm9rZTojZjM5NWVlO30uY2xzLTIsLmNscy0ze2ZpbGw6I2YzOTVlZTt9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwO308L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMiIgZGF0YS1uYW1lPSJMYXllciAyIj48ZyBpZD0iTGF5ZXJfMS0yIiBkYXRhLW5hbWU9IkxheWVyIDEiPjxnIGlkPSJMYXllcl8yLTIiIGRhdGEtbmFtZT0iTGF5ZXIgMiI+PGcgaWQ9IkxheWVyXzEtMi0yIiBkYXRhLW5hbWU9IkxheWVyIDEtMiI+PHBvbHlnb24gY2xhc3M9ImNscy0xIiBwb2ludHM9IjU4LjIyIDcuNSA1OC4yMiA4Ni41NiA3LjUgMTY5LjA5IDE0Mi4yNCAxNjkuMDkgOTQuNTEgODYuNTYgOTQuNTEgNy41IDU4LjIyIDcuNSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTUwLjI2LDEyMS4xMSwyOS44NywxNTYuNjZoOTEuMjRsLTEzLjkyLTI1Ljg1cy05LDQuNDctMTguNCw0LjQ3UzY3LjY5LDEyMS4xMSw1MC4yNiwxMjEuMTFaIi8+PGxpbmUgY2xhc3M9ImNscy0xIiB4MT0iMzkuNDUiIHkxPSI3LjUiIHgyPSIxMTEuNTQiIHkyPSI3LjUiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0yNzcuMzMsMTU2LjZIMjU5LjI0TDE4NC43Myw0Mi4xOUgxODRxMS40OSwyMC4xNCwxLjQ5LDM2LjkyVjE1Ni42SDE3MC44NFYyMC4yN2gxNy45MWw3NC4zMSwxMTRoLjc1Yy0uMTItMS42OC0uNDEtNy4wNi0uODQtMTYuMTdzLS41OS0xNS42Mi0uNDYtMTkuNTRWMjAuMjdoMTQuODJaIi8+PHBhdGggY2xhc3M9ImNscy0zIiBkPSJNNDMzLjE2LDg4LjI1cTAsMzIuNzMtMTYuNTUsNTEuNDh0LTQ2LDE4Ljc0cS0zMC4xMiwwLTQ2LjQ4LTE4LjQydC0xNi4zNi01MnEwLTMzLjMsMTYuNDEtNTEuNjJUMzcwLjgsMTguMTFxMjkuMzcsMCw0NS44OCwxOC42NVQ0MzMuMTYsODguMjVabS0xMDguNjQsMHEwLDI3LjcxLDExLjc5LDQydDM0LjI3LDE0LjMycTIyLjY3LDAsMzQuMjMtMTQuMjd0MTEuNTYtNDIuMDZxMC0yNy41MS0xMS41MS00MS43M1QzNzAuNzcsMzIuMjlxLTIyLjY2LDAtMzQuNDYsMTQuMzFUMzI0LjUyLDg4LjI1WiIvPjxwYXRoIGNsYXNzPSJjbHMtMyIgZD0iTTQ2My41NiwxNTYuNlYyMC4yN0g0NzkuNFYxNTYuNloiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik01MzIuNjUsOTkuOTFWMTU2LjZINTE2LjgxVjIwLjI3SDU1NC4ycTI1LjA4LDAsMzcuMDYsOS42MXQxMiwyOC45MXEwLDI3LTI3LjQyLDM2LjU1bDM3LDYxLjI2SDU5NC4xMWwtMzMtNTYuNjlabTAtMTMuNjJoMjEuNzNxMTYuNzksMCwyNC42Mi02LjY2dDcuODMtMjBxMC0xMy41Mi04LTE5LjQ4dC0yNS42LTZINTMyLjY1WiIvPjxwYXRoIGNsYXNzPSJjbHMtMyIgZD0iTTcxMC44NiwxNTYuNmgtNzZWMjAuMjdoNzZWMzQuMzVINjUwLjcxVjc4LjI3aDU2LjUydjE0SDY1MC43MXY1MC4xN2g2MC4xNVoiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik03OTAuNjgsMTU2LjZWMjAuMjdoMTUuODV2MTIyaDYwLjE1djE0LjM2WiIvPjxwYXRoIGNsYXNzPSJjbHMtMyIgZD0iTTk3NS41MSwxNTYuNmwtMTctNDMuMzZIOTAzLjg5TDg4Ny4xMSwxNTYuNmgtMTZMOTI1LDE5LjcxaDEzLjNMOTkxLjkyLDE1Ni42Wk05NTMuNiw5OSw5MzcuNzQsNTYuNzNxLTMuMDctOC02LjM0LTE5LjY4YTE3OS4zNiwxNzkuMzYsMCwwLDEtNS44NywxOS42OEw5MDkuNTMsOTlaIi8+PHBhdGggY2xhc3M9ImNscy0zIiBkPSJNMTAxMC42NywyMC4yN2gzOC41MXEyNy4xMywwLDM5LjI1LDguMTJUMTEwMC41Niw1NHEwLDEyLjEyLTYuNzYsMjB0LTE5LjcyLDEwLjIxdi45M3EzMSw1LjMzLDMxLjA1LDMyLjY0LDAsMTguMjgtMTIuMzYsMjguNTR0LTM0LjU1LDEwLjI1aC00Ny41NVptMTUuODQsNTguMzdoMjYuMTFxMTYuNzksMCwyNC4xNi01LjI3dDcuMzctMTcuNzVxMC0xMS40OC04LjIxLTE2LjU2VDEwNDkuODMsMzRoLTIzLjMyWm0wLDEzLjQzdjUxSDEwNTVxMTYuNSwwLDI0Ljg1LTYuMzl0OC4zNS0yMHEwLTEyLjY4LTguNTMtMTguNjV0LTI2LTZaIi8+PHBhdGggY2xhc3M9ImNscy0zIiBkPSJNMTIxMS4zNSwxMjAuMzNxMCwxOC0xMy4wNiwyOC4wN3QtMzUuNDQsMTAuMTFxLTI0LjI0LDAtMzcuMy02LjI1VjEzNi45M2E5OSw5OSwwLDAsMCwxOC4yOCw1LjYsOTYuOCw5Ni44LDAsMCwwLDE5LjU4LDJxMTUuODUsMCwyMy44OC02dDgtMTYuNzRxMC03LjA4LTIuODUtMTEuNjF0LTkuNTEtOC4zNHEtNi42Ni0zLjgyLTIwLjI4LTguNjgtMTktNi44MS0yNy4xOC0xNi4xM3QtOC4xNi0yNC4zNHEwLTE1Ljc2LDExLjg0LTI1LjA4dDMxLjMzLTkuMzNhOTIuNDIsOTIuNDIsMCwwLDEsMzcuNCw3LjQ2bC01LDEzLjgxYTg0LjMzLDg0LjMzLDAsMCwwLTMyLjgyLTcuMDlxLTEyLjU4LDAtMTkuNjcsNS40MWMtNC43NCwzLjYtNy4wOSw4LjYtNy4wOSwxNSwwLDQuNzIuODYsOC42LDIuNjEsMTEuNjFzNC42OCw1Ljc4LDguODEsOC4yOSwxMC40NSw1LjMxLDE5LDguMzZxMjEuNDUsNy42NCwyOS41MiwxNi40MVQxMjExLjM1LDEyMC4zM1oiLz48L2c+PC9nPjwvZz48L2c+PC9zdmc+" alt="Noirelabs logo" height="30"></a>
|
|
<button class="navbar-toggler collapsed" type="button" data-toggle="collapse" data-target="#collapsNav" aria-expanded="false">
|
|
<span class="navbar-toggler-icon"></span>
|
|
</button>
|
|
<div class="navbar-collapse collapse sf-hidden" id="collapsNav" style>
|
|
|
|
|
|
|
|
</div>
|
|
</div>
|
|
</nav>
|
|
|
|
|
|
|
|
|
|
<main class="container mt-3">
|
|
<h1>Making your own injections</h1>
|
|
<p>I don't wish to keep the "secret" of making estrogen for myself. Everyone should have access to life saving medication,
|
|
The knowledge how to get it, or the knowledge how to make it. There are a few other guides out there but none meet
|
|
my standards of quality or safety. This guide is largely based on <a target="_blank" href="https://groups.io/g/MTFHRT/wiki/29602">Lena's guide</a>.
|
|
However I made some changes which I believe are essential to safety and quality.</p>
|
|
<p>The base cost to make your own Estradiol in a non-professional setting is roughly € 450 for 45-50 vials.
|
|
This is a lifetime supply. However, you should do this at your own risk. The method I describe is a relatively safe and an easy way to
|
|
do it at home, but is in no way comparable to pharmaceutical grade medicine. This is only good if you use it for yourself
|
|
and understand the risks involved.</p>
|
|
<p>European countries don't prescribe injections and as far as im aware only the Czech Republic manufactures Estradiol injections in
|
|
glass ampoules (ew). This makes it basically impossible to get on injections in Europe unless you import it or buy from homebrewers.
|
|
If you don't want to make them yourself, I sell Estradiol Enanthate injections for € 50.</p>
|
|
<h2 id="#contents">Table of contents</h2>
|
|
<ul>
|
|
<li><a href="#">Making your own injections</a>
|
|
<ol>
|
|
<li><a href="#contents">Table of contents</a></li>
|
|
</ol>
|
|
</li>
|
|
<li><a href="#medical">Seek a medical professional</a></li>
|
|
<li><a href="#raws">Raw ingredients</a>
|
|
<ol>
|
|
<li><a href="#powder">Raw estradiol powder</a></li>
|
|
<li><a href="#benzylbenzoate">Benzyl benzoate</a></li>
|
|
<li><a href="#benzylalcohol">Benzyl Alcohol</a></li>
|
|
<li><a href="#mctoil">MCT Oil</a></li>
|
|
<li><a href="#castoroil">Castor Oil</a></li>
|
|
</ol>
|
|
</li>
|
|
<li><a href="#equipment">Equipment</a>
|
|
<ol>
|
|
<li><a href="#vials">Vials, stoppers and caps</a></li>
|
|
<li><a href="#syringes">Syringes</a></li>
|
|
<li><a href="#pressurecooker">Pressure cooker/autoclave</a></li>
|
|
<li><a href="#scale">Milligram scale</a></li>
|
|
<li><a href="#crimper">Vial crimper (optional)</a></li>
|
|
<li><a href="#others">Others</a></li>
|
|
</ol>
|
|
</li>
|
|
<li><a href="#prep">Preparation</a>
|
|
<ol>
|
|
<li><a href="#prepvials">Preparing the vials</a></li>
|
|
<li><a href="#prepworkarea">Preparing your work area</a></li>
|
|
</ol>
|
|
</li>
|
|
<li><a href="#mixing">Mixing</a></li>
|
|
</ul>
|
|
<hr>
|
|
<h2 id="medical">Seek a medical professional</h2>
|
|
<p>While im aware that its not possible for everyone to go to an endocrinologist or doctor, it is certainly advisable.
|
|
Unless you live in conservative or transphobic country, they usually have your best interest in mind and are there to help you.
|
|
If you can't see an endocrinologist or gender clinic its still a good idea to consult with your GP/doctor. I am not a medical professional.
|
|
Take what I say with a grain of salt and do your own research.</p>
|
|
<p>Look for medical professionals specialized in trans healthcare. Most countries have a website for transgenders where
|
|
they can find clinics, doctors, therapists/sexologists, endocrinologist, and other specialists specialized in trans care, as well as transgender friendly places.</p>
|
|
<hr>
|
|
<h2 id="raws">Raw ingredients</h2>
|
|
<h3 id="powder">Raw estradiol powder</h3>
|
|
<p>This is the main active ingredient in injections. Most Estradiol esters are about the same price so it comes down to preference
|
|
on what you want to get. However I have only used Enanthate and I can't vouch if resellers for other esters are any good. If you wish to buy Valerate or
|
|
Cypionate you have to find your own reseller.</p>
|
|
<p>Unlike testosterone, estradiol is not a controlled substance and can be bought from factories in China or India without question.
|
|
Most active ingredients sold in medication comes from China or India because its way cheaper to import it from there than
|
|
it is to manufacture it in Europe.</p>
|
|
<p>These sources for Estradiol Enanthate have been verified to be legit by other people. I have also contacted them myself
|
|
to get an inquiry about how much 20 grams of Estradiol enanthate would cost to sell and ship.</p>
|
|
<ul>
|
|
<li><a target="_blank" href="https://www.dragonordnance.com/goods?code=08101305637">Dragon ordnance</a>: $108 + 50 shipping</li>
|
|
<li><a target="_blank" href="https://hbldbiotech.en.made-in-china.com/product/fdIAjtZoAGWq/China-Estradiol-Enanthate-CAS-4956-37-0-Large-Particle-or-Powder.html">Hebei Lingding Biotechnology</a>: $183.58</li>
|
|
<li><a target="_blank" href="https://aoksbio.en.made-in-china.com/product/gdnfPERUILkb/China-99-Purity-Oestradiol-17-Heptanoate-Powder-CAS-4956-37-0-with-Safe-Delivery-and-Good-Price.html">HUBEI AOKS BIO-TECH</a>: $200</li>
|
|
</ul>
|
|
<p>The powder you receive should have a purity of ±98%. This is UPS and Ph. Eur. standard.</p>
|
|
<p class="font-weight-bold">Testing powder</p>
|
|
<p>You want to test your powder to see if its the real thing. There are two easy tests at home that you can do to verify
|
|
if the powder you have received is the real thing. Testing the melting point and Solubility in water.</p>
|
|
<p class="pl-5"><span class="font-weight-bold">Melting point</span>: <a target="_blank" href="https://www.scbt.com/p/estradiol-enanthate-4956-37-0?productCanUrl=estradiol-enanthate-4956-37-0&_requestid=1139746">The raw powder should have a melting point of 94-96°C</a>. You can test this by putting
|
|
a bit of the powder in a bottle cap and putting the cap in a pan with a bit of oil over the stove. You can monitor the temperature with
|
|
an inexpensive meat thermometer.</p>
|
|
<p class="pl-5"><span class="font-weight-bold">Water/oil solubility</span>: The raw powder does not easily dissolve in water. It does however dissolve in oils.</p>
|
|
<p>If the powder passes both tests it is most likely the real thing. It is very had to fake something that has both of these properties.</p>
|
|
<p>You can also test the powder with IR spectroscopy, but those tests can be expensive and have to be performed in a private lab.</p>
|
|
<h3 id="benzylbenzoate">Benzyl benzoate</h3>
|
|
<p>Benzyl benzoate is a solvent that's helps the powder dissolve easier in the solution. This is optional for Enanthate but still recommended as it helps
|
|
dissolve the powder better and makes the solution thinner which makes it easier to draw up and inject with needles. Benzyl benzoate can
|
|
cause allergic reactions.</p>
|
|
<p>You can easily find Benzyl Benzoate in online chemical store for about € 25/500Ml. I purchased mine <a target="_blank" href="https://www.laboratoriumdiscounter.nl/nl/benzylbenzoaat-99-puur.html">here</a>. But you may be able
|
|
to find cheaper options in your country. If you can't find anything you can probably get it on E-bay</p>
|
|
<h3 id="benzylalcohol">Benzyl Alcohol</h3>
|
|
<p>Benzyl alcohol is an antibacterial preservative. It increases the shelf life of your vials and should make them safer long-term.
|
|
Benzyl alcohol is very cheap and you don't need a lot of it (like 10ml for 50 vials). It's usually € 10/500ml</p>
|
|
<p>You can find benzyl alcohol in most chemical stores, maybe even the pool section of a hardware store. I bought mine
|
|
<a target="_blank" href="https://www.laboratoriumdiscounter.nl/nl/benzylalcohol-995-zeer-zuiver.html">here</a>. You may be able to find it cheaper on ebay
|
|
or more local chemical stores.</p>
|
|
<h3 id="mctoil">MCT Oil</h3>
|
|
<p>The carrier oil is the main ingredient in Estradiol injections and make up the bulk of it. MCT oil has a very high bio-availability
|
|
and is pretty cheap. MCT oil is an oil consisting of medium-chain triglycerides (hence the MCT). These oils usually consists of
|
|
C8 and C10 with a bit of C6 mixed in. You can find this oil at most sport stores or diet/supplement stores. There is no
|
|
such thing a "medicinal/sterile/pharmaceutical/whatever grade" oil. If you find this its a scam and they're just trying
|
|
to sell you a cheap product for a lot more than its worth. <span class="font-weight-bold">The oil should have no added additives!</span>
|
|
It should smell and taste neutral and the color should be completely transparent.</p>
|
|
<h3 id="castoroil">Castor Oil (alternative)</h3>
|
|
<p>Castor oil is a carrier oil that you can use instead of MCT oil. It is more viscous and will therefore increase
|
|
the half life of your injectable. You can read more about it <a href="https://dspace.library.uu.nl/handle/1874/348465">here (p.21)</a>.
|
|
It's typically used in the pharmaceuticals you buy with a prescription but can be more
|
|
difficult to draw due to the higher viscosity. Some prefer one over the other due to allergies or the needle size you can use.
|
|
Just like MCT oil, you can easily find castor oil in any diet/supplement store. Make sure it is 100% castor oil and doesn't
|
|
have any additives or perfumes. Castor oil should have a slight yellow tint.</p>
|
|
<hr>
|
|
<h2 id="equipment">Equipment</h2>
|
|
<h3 id="vials">Vials, stoppers and caps</h3>
|
|
<p>This is the container. Each vial has a little butyl/rubber stopper to keep whatever is inside in and whatever is outside out.
|
|
The cap is to seal the stopper to the vial and prevent it from coming off. You can easily find these on ebay and aliexpress.</p>
|
|
<ul>
|
|
<li><a target="_blank" href="https://www.ebay.com/itm/175477807318">10-100PCS/Set 10ml Vials & Stopper & Caps For 20MM Hand Crimper Sealing Machine</a></li>
|
|
<li><a target="_blank" href="https://www.aliexpress.com/item/1005004211266490.html">10 ml Clear Glass Vials, 100 Pcs Glass Headspace Vial with Plastic Aluminum Flip Caps and Rubber Stoppers</a></li>
|
|
<li><a target="_blank" href="https://www.aliexpress.com/item/1005001548328828.html">100pcs 20mm Aluminium Sealing Cap</a> - I recommend these</li>
|
|
</ul>
|
|
<p>It is recommended to not get plastic tear-off caps as these can completely tear off the cap or leave a weak spot.
|
|
Get completely metal/aluminium caps. The ebay link has the correct kind of caps but these are hard to find.</p>
|
|
<h3 id="syringes">Syringes</h3>
|
|
<p>Syringes are used to draw the exact amount of liquid needed to mix a vial. For one vial you need 2x 10ml syringes and 1x 1ml syringes.
|
|
You can get syringes for cents at any pharmacy. They don't asks questions. You don't need to order them online.</p>
|
|
<p><span class="font-weight-bold">Quick tip</span>: I like to put my benzyl alcohol in a 10ml vial and seal and crimp it. Then I draw out the correct amount
|
|
of Benzyl Alcohol with a 1ml syringe with a needle. This makes it a bit easier to get the correct amount.</p>
|
|
<h3 id="pressurecooker">Pressure cooker/autoclave</h3>
|
|
<p>No, 100°C is not enough to sterilize your vials. You need <span class="font-weight-bold">AT LEAST</span> a 120°C!</p>
|
|
<p>A pressure cooker can achieve temperatures higher than 100°C by boiling off the water and increasing the pressure
|
|
inside the pot. A higher pressure also means a higher temperature. For a pressure cooker to be able to reach temperatures
|
|
of 120°C you need a pressure of at least 2 bar or 29 psi. (in the manual they will say the pressure is 1 bar, but that is 1 bar added on top
|
|
of atmospheric pressure (which is 1 bar))</p>
|
|
<p>Here are some pressure cookers ive looked over that seem adequate.</p>
|
|
<ul>
|
|
<li><a target="_blank" href="https://www.amazon.de/-/en/SPRINGLANE-Stainless-Pressure-Induction-Mechanism/dp/B09QX32P9T">SPRINGLANE Stainless Steel Pressure Cooker 4.0 L</a></li>
|
|
<li><a target="_blank" href="https://www.ikea.com/gb/en/p/ikea-365-pressure-cooker-stainless-steel-20463650/">IKEA 365+ Pressure cooker, stainless steel</a></li>
|
|
</ul>
|
|
<p>Or you can look in any appliance store and see if they have pressure cookers. Cheap "autoclaves" sold on aliexpress or ebay are basically pressure cookers.</p>
|
|
<h3 id="scale">Milligram scale</h3>
|
|
<p>You can get a milligram scale for about € 10-15. You can easily find these by looking for diamond, gold, spice or jewelry scales.
|
|
You may also use a 0.01g scale, but this will be less precise. You can sometimes find a
|
|
milligram "spice" scale for sale in Action.</p>
|
|
<ul>
|
|
<li><a target="_blank" href="https://www.aliexpress.com/item/4000586480263.html">New High Precision Compact and Portable Experiment 10/50G 0.001g LCD Lab Digital Jewelry Scale</a></li>
|
|
<li><a target="_blank" href="https://www.ebay.com/itm/363747240371">Portable 20g * 0.001g LCD Digital Jewelry Scale</a></li>
|
|
</ul>
|
|
<h3 id="crimper">Vial crimper (optional)</h3>
|
|
<p>A vial crimper crimps the metal cap to the vial, keeping the stopper in place and sealing it tight. This is completely optional, you can "crimp"
|
|
the edges of the cap using a knife or something similar. A vial crimper will run you € 40. Get a crimper that's compatible
|
|
with your caps. If you have vial caps with a plastic cap you need to get a vial crimper compatible with those. You can
|
|
easily find these on ebay or aliexpress.</p>
|
|
<ul>
|
|
<li><a target="_blank" href="https://www.aliexpress.com/item/32529108008.html">New Stainless Vial Crimper 13/15/20mm Glass Bottle Sealing Capping Tools</a></li>
|
|
</ul>
|
|
<h3 id="others">Others</h3>
|
|
<p>Other equipment you need that I won't bother writing a paragraph about:</p>
|
|
<ul>
|
|
<li>Ethanol. You can find this at a hardware store. Sometimes its called "cleaning alcohol".</li>
|
|
<li>Nitrile gloves. You can also find this at a hardware store or general store. Pharmacies will probably sell or give you some too.</li>
|
|
<li>Disinfecting hand sanitizer. Can also be found in hardware stores, general stores and pharmacists.</li>
|
|
<li>Tweezers. Useful for moving the raw powder.</li>
|
|
<li>Aluminum foil. Used for measuring the raw powder.</li>
|
|
</ul>
|
|
<hr>
|
|
<h2 id="prep">Preparation</h2>
|
|
<p>Once you have all the ingredients and equipment you can finally start making your own Estradiol. However there is some
|
|
preparation you need to do to create a safe work environment and to make sure all your equipment is sterile</p>
|
|
<h3 id="prepvials">Preparing the vials</h3>
|
|
<p>Preheat the oven to 175° before continuing.</p>
|
|
<p>The vials you receive from China are not sterile and probably full of particles from the packaging. An easy way to clean the is to
|
|
rinse them in ethanol a couple of times. This will disinfect the vials while also cleaning them from particulates. The ethanol wil vaporize, leaving little to
|
|
no residue behind.</p>
|
|
<p>After that get a glass oven dish and clean it with ethanol as well. Put the vials upside down in the dish and put it in
|
|
the oven at 175°C for 60 minutes.</p>
|
|
<p>After the oven is done you can also microwave it at 650W for 10-15 minutes. This is optional and will probably not
|
|
be effective for sterilization since kitchen ovens have uneven heating.</p>
|
|
<h3 id="prepworkarea">Preparing your work area</h3>
|
|
<p>While the vials are in the oven you can prepare your work area. Vacuum the entire room. Then mop the floor and clean every surface with
|
|
a sponge or cleaning cloths. This will minimize dust and particulates in the air. After the entire room has been cleaned you need to clean your
|
|
working surface with ethanol to disinfect it.</p>
|
|
<p>Get your scale, tweezers and other equipment and wipe them down with ethanol too.</p>
|
|
<p>Once the vials in the oven are done, take them out, move them to your work area and let them cool down. <span class="font-weight-bold">Do not touch the vials! They can easily burn you!</span></p>
|
|
<hr>
|
|
<h3 id="mixing">Mixing</h3>
|
|
<p>Put on the nitrile gloves and use hand sanitizers to disinfect them. Wait for the disinfectant to evaporate before continuing.</p>
|
|
<p>Once you are done with preparation, you can start mixing. Basically all you have to do is mix the 4 ingredients.</p>
|
|
<p>For one 10ml vial of 40mg/ml estradiol you need the following:</p>
|
|
<ul>
|
|
<li>0.4g raw estradiol powder</li>
|
|
<li>0.2ml benzyl alcohol</li>
|
|
<li>4ml benzyl benzoate</li>
|
|
<li>5.4ml MCT oil</li>
|
|
</ul>
|
|
<p>The order of ingredients do not matter. This is just how I like to do it.</p>
|
|
<ul>
|
|
<li>Get a 5x5cm piece of aluminum foil (or something approximate to that size) and put it on the scale. Click the on button.
|
|
This should automatically calibrate the scale. If the display does not say 0 than hit the tare button until it does. Get your bag of estradiol
|
|
powder and hold it over the aluminum foil. Lightly tap the bag until you have 0.4g's measure out. If you have a little too much or
|
|
too little than you can use the tweezers to to move the estradiol powder.</li>
|
|
<li>Once you have 0.4g's measured out, grab the aluminum foil and make a little funnel with it. Pour the powder in the vial.</li>
|
|
<li>Get a 1ml syringe and measure out 0.2ml of benzyl alcohol. Pour that in the vial.</li>
|
|
<li>Get a 10ml syringe and measure out 4ml of benzyl benzoate. Pour that in the vial.</li>
|
|
<li>Get a 10ml syringe and measure out 5.4ml of MCT. Pour that in the vial.</li>
|
|
<li>Put on a rubber/butyl stopper, a cap, crimp and shake. The powder will not immediately dissolve but don't worry about that.</li>
|
|
<li>Take the finished vial(s) and put them in your pressure cooker with water. Boil them in there for 30 minutes on the highest setting.</li>
|
|
</ul>
|
|
<p>That's basically it. A good idea is to inspect your vials for any particulates. If there are some in there its not
|
|
that big of an issue since it has been sterilized. If you accidentally inject it, your body will just break it down.</p>
|
|
|
|
<script class="sf-hidden" src="data:application/javascript;base64,LyohIEZvciBsaWNlbnNlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgYXBwLmpzLkxJQ0VOU0UudHh0ICovCiFmdW5jdGlvbihlKXt2YXIgdD17fTtmdW5jdGlvbiBuKHIpe2lmKHRbcl0pcmV0dXJuIHRbcl0uZXhwb3J0czt2YXIgaT10W3JdPXtpOnIsbDohMSxleHBvcnRzOnt9fTtyZXR1cm4gZVtyXS5jYWxsKGkuZXhwb3J0cyxpLGkuZXhwb3J0cyxuKSxpLmw9ITAsaS5leHBvcnRzfW4ubT1lLG4uYz10LG4uZD1mdW5jdGlvbihlLHQscil7bi5vKGUsdCl8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2VudW1lcmFibGU6ITAsZ2V0OnJ9KX0sbi5yPWZ1bmN0aW9uKGUpeyJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wudG9TdHJpbmdUYWcmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6Ik1vZHVsZSJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSl9LG4udD1mdW5jdGlvbihlLHQpe2lmKDEmdCYmKGU9bihlKSksOCZ0KXJldHVybiBlO2lmKDQmdCYmIm9iamVjdCI9PXR5cGVvZiBlJiZlJiZlLl9fZXNNb2R1bGUpcmV0dXJuIGU7dmFyIHI9T2JqZWN0LmNyZWF0ZShudWxsKTtpZihuLnIociksT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsImRlZmF1bHQiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOmV9KSwyJnQmJiJzdHJpbmciIT10eXBlb2YgZSlmb3IodmFyIGkgaW4gZSluLmQocixpLGZ1bmN0aW9uKHQpe3JldHVybiBlW3RdfS5iaW5kKG51bGwsaSkpO3JldHVybiByfSxuLm49ZnVuY3Rpb24oZSl7dmFyIHQ9ZSYmZS5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIGUuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gZX07cmV0dXJuIG4uZCh0LCJhIix0KSx0fSxuLm89ZnVuY3Rpb24oZSx0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdCl9LG4ucD0iLyIsbihuLnM9MCl9KHswOmZ1bmN0aW9uKGUsdCxuKXtuKCJiVUM1IiksZS5leHBvcnRzPW4oInB5Q2QiKX0sIjJTVmQiOmZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybi9eKFthLXpdW2EtelxkXCtcLVwuXSo6KT9cL1wvL2kudGVzdChlKX19LCI1b01wIjpmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3JldHVybiB0P2UucmVwbGFjZSgvXC8rJC8sIiIpKyIvIit0LnJlcGxhY2UoL15cLysvLCIiKTplfX0sIjhMM0YiOmZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7bi5yKHQpLGZ1bmN0aW9uKGUpe3ZhciBuPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiYidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50JiYidW5kZWZpbmVkIiE9dHlwZW9mIG5hdmlnYXRvcixyPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVsiRWRnZSIsIlRyaWRlbnQiLCJGaXJlZm94Il0sdD0wO3Q8ZS5sZW5ndGg7dCs9MSlpZihuJiZuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoZVt0XSk+PTApcmV0dXJuIDE7cmV0dXJuIDB9KCk7dmFyIGk9biYmd2luZG93LlByb21pc2U/ZnVuY3Rpb24oZSl7dmFyIHQ9ITE7cmV0dXJuIGZ1bmN0aW9uKCl7dHx8KHQ9ITAsd2luZG93LlByb21pc2UucmVzb2x2ZSgpLnRoZW4oKGZ1bmN0aW9uKCl7dD0hMSxlKCl9KSkpfX06ZnVuY3Rpb24oZSl7dmFyIHQ9ITE7cmV0dXJuIGZ1bmN0aW9uKCl7dHx8KHQ9ITAsc2V0VGltZW91dCgoZnVuY3Rpb24oKXt0PSExLGUoKX0pLHIpKX19O2Z1bmN0aW9uIG8oZSl7cmV0dXJuIGUmJiJbb2JqZWN0IEZ1bmN0aW9uXSI9PT17fS50b1N0cmluZy5jYWxsKGUpfWZ1bmN0aW9uIGEoZSx0KXtpZigxIT09ZS5ub2RlVHlwZSlyZXR1cm5bXTt2YXIgbj1lLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlLG51bGwpO3JldHVybiB0P25bdF06bn1mdW5jdGlvbiBzKGUpe3JldHVybiJIVE1MIj09PWUubm9kZU5hbWU/ZTplLnBhcmVudE5vZGV8fGUuaG9zdH1mdW5jdGlvbiB1KGUpe2lmKCFlKXJldHVybiBkb2N1bWVudC5ib2R5O3N3aXRjaChlLm5vZGVOYW1lKXtjYXNlIkhUTUwiOmNhc2UiQk9EWSI6cmV0dXJuIGUub3duZXJEb2N1bWVudC5ib2R5O2Nhc2UiI2RvY3VtZW50IjpyZXR1cm4gZS5ib2R5fXZhciB0PWEoZSksbj10Lm92ZXJmbG93LHI9dC5vdmVyZmxvd1gsaT10Lm92ZXJmbG93WTtyZXR1cm4vKGF1dG98c2Nyb2xsfG92ZXJsYXkpLy50ZXN0KG4raStyKT9lOnUocyhlKSl9ZnVuY3Rpb24gbChlKXtyZXR1cm4gZSYmZS5yZWZlcmVuY2VOb2RlP2UucmVmZXJlbmNlTm9kZTplfXZhciBjPW4mJiEoIXdpbmRvdy5NU0lucHV0TWV0aG9kQ29udGV4dHx8IWRvY3VtZW50LmRvY3VtZW50TW9kZSksZj1uJiYvTVNJRSAxMC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtmdW5jdGlvbiBkKGUpe3JldHVybiAxMT09PWU/YzoxMD09PWU/ZjpjfHxmfWZ1bmN0aW9uIGgoZSl7aWYoIWUpcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtmb3IodmFyIHQ9ZCgxMCk/ZG9jdW1lbnQuYm9keTpudWxsLG49ZS5vZmZzZXRQYXJlbnR8fG51bGw7bj09PXQmJmUubmV4dEVsZW1lbnRTaWJsaW5nOyluPShlPWUubmV4dEVsZW1lbnRTaWJsaW5nKS5vZmZzZXRQYXJlbnQ7dmFyIHI9biYmbi5ub2RlTmFtZTtyZXR1cm4gciYmIkJPRFkiIT09ciYmIkhUTUwiIT09cj8tMSE9PVsiVEgiLCJURCIsIlRBQkxFIl0uaW5kZXhPZihuLm5vZGVOYW1lKSYmInN0YXRpYyI9PT1hKG4sInBvc2l0aW9uIik/aChuKTpuOmU/ZS5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudDpkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR9ZnVuY3Rpb24gcChlKXtyZXR1cm4gbnVsbCE9PWUucGFyZW50Tm9kZT9wKGUucGFyZW50Tm9kZSk6ZX1mdW5jdGlvbiBnKGUsdCl7aWYoIShlJiZlLm5vZGVUeXBlJiZ0JiZ0Lm5vZGVUeXBlKSlyZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O3ZhciBuPWUuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCkmTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkcscj1uP2U6dCxpPW4/dDplLG89ZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtvLnNldFN0YXJ0KHIsMCksby5zZXRFbmQoaSwwKTt2YXIgYSxzLHU9by5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtpZihlIT09dSYmdCE9PXV8fHIuY29udGFpbnMoaSkpcmV0dXJuIkJPRFkiPT09KHM9KGE9dSkubm9kZU5hbWUpfHwiSFRNTCIhPT1zJiZoKGEuZmlyc3RFbGVtZW50Q2hpbGQpIT09YT9oKHUpOnU7dmFyIGw9cChlKTtyZXR1cm4gbC5ob3N0P2cobC5ob3N0LHQpOmcoZSxwKHQpLmhvc3QpfWZ1bmN0aW9uIHYoZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOiJ0b3AiLG49InRvcCI9PT10PyJzY3JvbGxUb3AiOiJzY3JvbGxMZWZ0IixyPWUubm9kZU5hbWU7aWYoIkJPRFkiPT09cnx8IkhUTUwiPT09cil7dmFyIGk9ZS5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxvPWUub3duZXJEb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50fHxpO3JldHVybiBvW25dfXJldHVybiBlW25dfWZ1bmN0aW9uIG0oZSx0KXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzJdLHI9dih0LCJ0b3AiKSxpPXYodCwibGVmdCIpLG89bj8tMToxO3JldHVybiBlLnRvcCs9cipvLGUuYm90dG9tKz1yKm8sZS5sZWZ0Kz1pKm8sZS5yaWdodCs9aSpvLGV9ZnVuY3Rpb24geShlLHQpe3ZhciBuPSJ4Ij09PXQ/IkxlZnQiOiJUb3AiLHI9IkxlZnQiPT09bj8iUmlnaHQiOiJCb3R0b20iO3JldHVybiBwYXJzZUZsb2F0KGVbImJvcmRlciIrbisiV2lkdGgiXSkrcGFyc2VGbG9hdChlWyJib3JkZXIiK3IrIldpZHRoIl0pfWZ1bmN0aW9uIGIoZSx0LG4scil7cmV0dXJuIE1hdGgubWF4KHRbIm9mZnNldCIrZV0sdFsic2Nyb2xsIitlXSxuWyJjbGllbnQiK2VdLG5bIm9mZnNldCIrZV0sblsic2Nyb2xsIitlXSxkKDEwKT9wYXJzZUludChuWyJvZmZzZXQiK2VdKStwYXJzZUludChyWyJtYXJnaW4iKygiSGVpZ2h0Ij09PWU/IlRvcCI6IkxlZnQiKV0pK3BhcnNlSW50KHJbIm1hcmdpbiIrKCJIZWlnaHQiPT09ZT8iQm90dG9tIjoiUmlnaHQiKV0pOjApfWZ1bmN0aW9uIF8oZSl7dmFyIHQ9ZS5ib2R5LG49ZS5kb2N1bWVudEVsZW1lbnQscj1kKDEwKSYmZ2V0Q29tcHV0ZWRTdHlsZShuKTtyZXR1cm57aGVpZ2h0OmIoIkhlaWdodCIsdCxuLHIpLHdpZHRoOmIoIldpZHRoIix0LG4scil9fXZhciB3PWZ1bmN0aW9uKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9LHg9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksVD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHQgaW4gZT9PYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6ZVt0XT1uLGV9LEU9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdO2Zvcih2YXIgciBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHIpJiYoZVtyXT1uW3JdKX1yZXR1cm4gZX07ZnVuY3Rpb24gQyhlKXtyZXR1cm4gRSh7fSxlLHtyaWdodDplLmxlZnQrZS53aWR0aCxib3R0b206ZS50b3ArZS5oZWlnaHR9KX1mdW5jdGlvbiBTKGUpe3ZhciB0PXt9O3RyeXtpZihkKDEwKSl7dD1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3ZhciBuPXYoZSwidG9wIikscj12KGUsImxlZnQiKTt0LnRvcCs9bix0LmxlZnQrPXIsdC5ib3R0b20rPW4sdC5yaWdodCs9cn1lbHNlIHQ9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX1jYXRjaChlKXt9dmFyIGk9e2xlZnQ6dC5sZWZ0LHRvcDp0LnRvcCx3aWR0aDp0LnJpZ2h0LXQubGVmdCxoZWlnaHQ6dC5ib3R0b20tdC50b3B9LG89IkhUTUwiPT09ZS5ub2RlTmFtZT9fKGUub3duZXJEb2N1bWVudCk6e30scz1vLndpZHRofHxlLmNsaWVudFdpZHRofHxpLndpZHRoLHU9by5oZWlnaHR8fGUuY2xpZW50SGVpZ2h0fHxpLmhlaWdodCxsPWUub2Zmc2V0V2lkdGgtcyxjPWUub2Zmc2V0SGVpZ2h0LXU7aWYobHx8Yyl7dmFyIGY9YShlKTtsLT15KGYsIngiKSxjLT15KGYsInkiKSxpLndpZHRoLT1sLGkuaGVpZ2h0LT1jfXJldHVybiBDKGkpfWZ1bmN0aW9uIGsoZSx0KXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzJdLHI9ZCgxMCksaT0iSFRNTCI9PT10Lm5vZGVOYW1lLG89UyhlKSxzPVModCksbD11KGUpLGM9YSh0KSxmPXBhcnNlRmxvYXQoYy5ib3JkZXJUb3BXaWR0aCksaD1wYXJzZUZsb2F0KGMuYm9yZGVyTGVmdFdpZHRoKTtuJiZpJiYocy50b3A9TWF0aC5tYXgocy50b3AsMCkscy5sZWZ0PU1hdGgubWF4KHMubGVmdCwwKSk7dmFyIHA9Qyh7dG9wOm8udG9wLXMudG9wLWYsbGVmdDpvLmxlZnQtcy5sZWZ0LWgsd2lkdGg6by53aWR0aCxoZWlnaHQ6by5oZWlnaHR9KTtpZihwLm1hcmdpblRvcD0wLHAubWFyZ2luTGVmdD0wLCFyJiZpKXt2YXIgZz1wYXJzZUZsb2F0KGMubWFyZ2luVG9wKSx2PXBhcnNlRmxvYXQoYy5tYXJnaW5MZWZ0KTtwLnRvcC09Zi1nLHAuYm90dG9tLT1mLWcscC5sZWZ0LT1oLXYscC5yaWdodC09aC12LHAubWFyZ2luVG9wPWcscC5tYXJnaW5MZWZ0PXZ9cmV0dXJuKHImJiFuP3QuY29udGFpbnMobCk6dD09PWwmJiJCT0RZIiE9PWwubm9kZU5hbWUpJiYocD1tKHAsdCkpLHB9ZnVuY3Rpb24gQShlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdLG49ZS5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxyPWsoZSxuKSxpPU1hdGgubWF4KG4uY2xpZW50V2lkdGgsd2luZG93LmlubmVyV2lkdGh8fDApLG89TWF0aC5tYXgobi5jbGllbnRIZWlnaHQsd2luZG93LmlubmVySGVpZ2h0fHwwKSxhPXQ/MDp2KG4pLHM9dD8wOnYobiwibGVmdCIpLHU9e3RvcDphLXIudG9wK3IubWFyZ2luVG9wLGxlZnQ6cy1yLmxlZnQrci5tYXJnaW5MZWZ0LHdpZHRoOmksaGVpZ2h0Om99O3JldHVybiBDKHUpfWZ1bmN0aW9uIE4oZSl7dmFyIHQ9ZS5ub2RlTmFtZTtpZigiQk9EWSI9PT10fHwiSFRNTCI9PT10KXJldHVybiExO2lmKCJmaXhlZCI9PT1hKGUsInBvc2l0aW9uIikpcmV0dXJuITA7dmFyIG49cyhlKTtyZXR1cm4hIW4mJk4obil9ZnVuY3Rpb24gRChlKXtpZighZXx8IWUucGFyZW50RWxlbWVudHx8ZCgpKXJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7Zm9yKHZhciB0PWUucGFyZW50RWxlbWVudDt0JiYibm9uZSI9PT1hKHQsInRyYW5zZm9ybSIpOyl0PXQucGFyZW50RWxlbWVudDtyZXR1cm4gdHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fWZ1bmN0aW9uIGooZSx0LG4scil7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD40JiZ2b2lkIDAhPT1hcmd1bWVudHNbNF0mJmFyZ3VtZW50c1s0XSxvPXt0b3A6MCxsZWZ0OjB9LGE9aT9EKGUpOmcoZSxsKHQpKTtpZigidmlld3BvcnQiPT09cilvPUEoYSxpKTtlbHNle3ZhciBjPXZvaWQgMDsic2Nyb2xsUGFyZW50Ij09PXI/IkJPRFkiPT09KGM9dShzKHQpKSkubm9kZU5hbWUmJihjPWUub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpOmM9IndpbmRvdyI9PT1yP2Uub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ6cjt2YXIgZj1rKGMsYSxpKTtpZigiSFRNTCIhPT1jLm5vZGVOYW1lfHxOKGEpKW89ZjtlbHNle3ZhciBkPV8oZS5vd25lckRvY3VtZW50KSxoPWQuaGVpZ2h0LHA9ZC53aWR0aDtvLnRvcCs9Zi50b3AtZi5tYXJnaW5Ub3Asby5ib3R0b209aCtmLnRvcCxvLmxlZnQrPWYubGVmdC1mLm1hcmdpbkxlZnQsby5yaWdodD1wK2YubGVmdH19dmFyIHY9Im51bWJlciI9PXR5cGVvZihuPW58fDApO3JldHVybiBvLmxlZnQrPXY/bjpuLmxlZnR8fDAsby50b3ArPXY/bjpuLnRvcHx8MCxvLnJpZ2h0LT12P246bi5yaWdodHx8MCxvLmJvdHRvbS09dj9uOm4uYm90dG9tfHwwLG99ZnVuY3Rpb24gTyhlKXtyZXR1cm4gZS53aWR0aCplLmhlaWdodH1mdW5jdGlvbiBMKGUsdCxuLHIsaSl7dmFyIG89YXJndW1lbnRzLmxlbmd0aD41JiZ2b2lkIDAhPT1hcmd1bWVudHNbNV0/YXJndW1lbnRzWzVdOjA7aWYoLTE9PT1lLmluZGV4T2YoImF1dG8iKSlyZXR1cm4gZTt2YXIgYT1qKG4scixvLGkpLHM9e3RvcDp7d2lkdGg6YS53aWR0aCxoZWlnaHQ6dC50b3AtYS50b3B9LHJpZ2h0Ont3aWR0aDphLnJpZ2h0LXQucmlnaHQsaGVpZ2h0OmEuaGVpZ2h0fSxib3R0b206e3dpZHRoOmEud2lkdGgsaGVpZ2h0OmEuYm90dG9tLXQuYm90dG9tfSxsZWZ0Ont3aWR0aDp0LmxlZnQtYS5sZWZ0LGhlaWdodDphLmhlaWdodH19LHU9T2JqZWN0LmtleXMocykubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gRSh7a2V5OmV9LHNbZV0se2FyZWE6TyhzW2VdKX0pfSkpLnNvcnQoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQuYXJlYS1lLmFyZWF9KSksbD11LmZpbHRlcigoZnVuY3Rpb24oZSl7dmFyIHQ9ZS53aWR0aCxyPWUuaGVpZ2h0O3JldHVybiB0Pj1uLmNsaWVudFdpZHRoJiZyPj1uLmNsaWVudEhlaWdodH0pKSxjPWwubGVuZ3RoPjA/bFswXS5rZXk6dVswXS5rZXksZj1lLnNwbGl0KCItIilbMV07cmV0dXJuIGMrKGY/Ii0iK2Y6IiIpfWZ1bmN0aW9uIEkoZSx0LG4pe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTpudWxsLGk9cj9EKHQpOmcodCxsKG4pKTtyZXR1cm4gayhuLGkscil9ZnVuY3Rpb24gUihlKXt2YXIgdD1lLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlKSxuPXBhcnNlRmxvYXQodC5tYXJnaW5Ub3B8fDApK3BhcnNlRmxvYXQodC5tYXJnaW5Cb3R0b218fDApLHI9cGFyc2VGbG9hdCh0Lm1hcmdpbkxlZnR8fDApK3BhcnNlRmxvYXQodC5tYXJnaW5SaWdodHx8MCk7cmV0dXJue3dpZHRoOmUub2Zmc2V0V2lkdGgrcixoZWlnaHQ6ZS5vZmZzZXRIZWlnaHQrbn19ZnVuY3Rpb24gUChlKXt2YXIgdD17bGVmdDoicmlnaHQiLHJpZ2h0OiJsZWZ0Iixib3R0b206InRvcCIsdG9wOiJib3R0b20ifTtyZXR1cm4gZS5yZXBsYWNlKC9sZWZ0fHJpZ2h0fGJvdHRvbXx0b3AvZywoZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19KSl9ZnVuY3Rpb24gJChlLHQsbil7bj1uLnNwbGl0KCItIilbMF07dmFyIHI9UihlKSxpPXt3aWR0aDpyLndpZHRoLGhlaWdodDpyLmhlaWdodH0sbz0tMSE9PVsicmlnaHQiLCJsZWZ0Il0uaW5kZXhPZihuKSxhPW8/InRvcCI6ImxlZnQiLHM9bz8ibGVmdCI6InRvcCIsdT1vPyJoZWlnaHQiOiJ3aWR0aCIsbD1vPyJ3aWR0aCI6ImhlaWdodCI7cmV0dXJuIGlbYV09dFthXSt0W3VdLzItclt1XS8yLGlbc109bj09PXM/dFtzXS1yW2xdOnRbUChzKV0saX1mdW5jdGlvbiBCKGUsdCl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5maW5kP2UuZmluZCh0KTplLmZpbHRlcih0KVswXX1mdW5jdGlvbiBxKGUsdCxuKXtyZXR1cm4odm9pZCAwPT09bj9lOmUuc2xpY2UoMCxmdW5jdGlvbihlLHQsbil7aWYoQXJyYXkucHJvdG90eXBlLmZpbmRJbmRleClyZXR1cm4gZS5maW5kSW5kZXgoKGZ1bmN0aW9uKGUpe3JldHVybiBlW3RdPT09bn0pKTt2YXIgcj1CKGUsKGZ1bmN0aW9uKGUpe3JldHVybiBlW3RdPT09bn0pKTtyZXR1cm4gZS5pbmRleE9mKHIpfShlLCJuYW1lIixuKSkpLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UuZnVuY3Rpb24mJmNvbnNvbGUud2FybigiYG1vZGlmaWVyLmZ1bmN0aW9uYCBpcyBkZXByZWNhdGVkLCB1c2UgYG1vZGlmaWVyLmZuYCEiKTt2YXIgbj1lLmZ1bmN0aW9ufHxlLmZuO2UuZW5hYmxlZCYmbyhuKSYmKHQub2Zmc2V0cy5wb3BwZXI9Qyh0Lm9mZnNldHMucG9wcGVyKSx0Lm9mZnNldHMucmVmZXJlbmNlPUModC5vZmZzZXRzLnJlZmVyZW5jZSksdD1uKHQsZSkpfSkpLHR9ZnVuY3Rpb24gTSgpe2lmKCF0aGlzLnN0YXRlLmlzRGVzdHJveWVkKXt2YXIgZT17aW5zdGFuY2U6dGhpcyxzdHlsZXM6e30sYXJyb3dTdHlsZXM6e30sYXR0cmlidXRlczp7fSxmbGlwcGVkOiExLG9mZnNldHM6e319O2Uub2Zmc2V0cy5yZWZlcmVuY2U9SSh0aGlzLnN0YXRlLHRoaXMucG9wcGVyLHRoaXMucmVmZXJlbmNlLHRoaXMub3B0aW9ucy5wb3NpdGlvbkZpeGVkKSxlLnBsYWNlbWVudD1MKHRoaXMub3B0aW9ucy5wbGFjZW1lbnQsZS5vZmZzZXRzLnJlZmVyZW5jZSx0aGlzLnBvcHBlcix0aGlzLnJlZmVyZW5jZSx0aGlzLm9wdGlvbnMubW9kaWZpZXJzLmZsaXAuYm91bmRhcmllc0VsZW1lbnQsdGhpcy5vcHRpb25zLm1vZGlmaWVycy5mbGlwLnBhZGRpbmcpLGUub3JpZ2luYWxQbGFjZW1lbnQ9ZS5wbGFjZW1lbnQsZS5wb3NpdGlvbkZpeGVkPXRoaXMub3B0aW9ucy5wb3NpdGlvbkZpeGVkLGUub2Zmc2V0cy5wb3BwZXI9JCh0aGlzLnBvcHBlcixlLm9mZnNldHMucmVmZXJlbmNlLGUucGxhY2VtZW50KSxlLm9mZnNldHMucG9wcGVyLnBvc2l0aW9uPXRoaXMub3B0aW9ucy5wb3NpdGlvbkZpeGVkPyJmaXhlZCI6ImFic29sdXRlIixlPXEodGhpcy5tb2RpZmllcnMsZSksdGhpcy5zdGF0ZS5pc0NyZWF0ZWQ/dGhpcy5vcHRpb25zLm9uVXBkYXRlKGUpOih0aGlzLnN0YXRlLmlzQ3JlYXRlZD0hMCx0aGlzLm9wdGlvbnMub25DcmVhdGUoZSkpfX1mdW5jdGlvbiBIKGUsdCl7cmV0dXJuIGUuc29tZSgoZnVuY3Rpb24oZSl7dmFyIG49ZS5uYW1lO3JldHVybiBlLmVuYWJsZWQmJm49PT10fSkpfWZ1bmN0aW9uIEYoZSl7Zm9yKHZhciB0PVshMSwibXMiLCJXZWJraXQiLCJNb3oiLCJPIl0sbj1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSkscj0wO3I8dC5sZW5ndGg7cisrKXt2YXIgaT10W3JdLG89aT8iIitpK246ZTtpZih2b2lkIDAhPT1kb2N1bWVudC5ib2R5LnN0eWxlW29dKXJldHVybiBvfXJldHVybiBudWxsfWZ1bmN0aW9uIFcoKXtyZXR1cm4gdGhpcy5zdGF0ZS5pc0Rlc3Ryb3llZD0hMCxIKHRoaXMubW9kaWZpZXJzLCJhcHBseVN0eWxlIikmJih0aGlzLnBvcHBlci5yZW1vdmVBdHRyaWJ1dGUoIngtcGxhY2VtZW50IiksdGhpcy5wb3BwZXIuc3R5bGUucG9zaXRpb249IiIsdGhpcy5wb3BwZXIuc3R5bGUudG9wPSIiLHRoaXMucG9wcGVyLnN0eWxlLmxlZnQ9IiIsdGhpcy5wb3BwZXIuc3R5bGUucmlnaHQ9IiIsdGhpcy5wb3BwZXIuc3R5bGUuYm90dG9tPSIiLHRoaXMucG9wcGVyLnN0eWxlLndpbGxDaGFuZ2U9IiIsdGhpcy5wb3BwZXIuc3R5bGVbRigidHJhbnNmb3JtIildPSIiKSx0aGlzLmRpc2FibGVFdmVudExpc3RlbmVycygpLHRoaXMub3B0aW9ucy5yZW1vdmVPbkRlc3Ryb3kmJnRoaXMucG9wcGVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5wb3BwZXIpLHRoaXN9ZnVuY3Rpb24gVShlKXt2YXIgdD1lLm93bmVyRG9jdW1lbnQ7cmV0dXJuIHQ/dC5kZWZhdWx0Vmlldzp3aW5kb3d9ZnVuY3Rpb24geihlLHQsbixyKXtuLnVwZGF0ZUJvdW5kPXIsVShlKS5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLG4udXBkYXRlQm91bmQse3Bhc3NpdmU6ITB9KTt2YXIgaT11KGUpO3JldHVybiBmdW5jdGlvbiBlKHQsbixyLGkpe3ZhciBvPSJCT0RZIj09PXQubm9kZU5hbWUsYT1vP3Qub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldzp0O2EuYWRkRXZlbnRMaXN0ZW5lcihuLHIse3Bhc3NpdmU6ITB9KSxvfHxlKHUoYS5wYXJlbnROb2RlKSxuLHIsaSksaS5wdXNoKGEpfShpLCJzY3JvbGwiLG4udXBkYXRlQm91bmQsbi5zY3JvbGxQYXJlbnRzKSxuLnNjcm9sbEVsZW1lbnQ9aSxuLmV2ZW50c0VuYWJsZWQ9ITAsbn1mdW5jdGlvbiBRKCl7dGhpcy5zdGF0ZS5ldmVudHNFbmFibGVkfHwodGhpcy5zdGF0ZT16KHRoaXMucmVmZXJlbmNlLHRoaXMub3B0aW9ucyx0aGlzLnN0YXRlLHRoaXMuc2NoZWR1bGVVcGRhdGUpKX1mdW5jdGlvbiBWKCl7dmFyIGUsdDt0aGlzLnN0YXRlLmV2ZW50c0VuYWJsZWQmJihjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLnNjaGVkdWxlVXBkYXRlKSx0aGlzLnN0YXRlPShlPXRoaXMucmVmZXJlbmNlLHQ9dGhpcy5zdGF0ZSxVKGUpLnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdC51cGRhdGVCb3VuZCksdC5zY3JvbGxQYXJlbnRzLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0LnVwZGF0ZUJvdW5kKX0pKSx0LnVwZGF0ZUJvdW5kPW51bGwsdC5zY3JvbGxQYXJlbnRzPVtdLHQuc2Nyb2xsRWxlbWVudD1udWxsLHQuZXZlbnRzRW5hYmxlZD0hMSx0KSl9ZnVuY3Rpb24gSyhlKXtyZXR1cm4iIiE9PWUmJiFpc05hTihwYXJzZUZsb2F0KGUpKSYmaXNGaW5pdGUoZSl9ZnVuY3Rpb24gWChlLHQpe09iamVjdC5rZXlzKHQpLmZvckVhY2goKGZ1bmN0aW9uKG4pe3ZhciByPSIiOy0xIT09WyJ3aWR0aCIsImhlaWdodCIsInRvcCIsInJpZ2h0IiwiYm90dG9tIiwibGVmdCJdLmluZGV4T2YobikmJksodFtuXSkmJihyPSJweCIpLGUuc3R5bGVbbl09dFtuXStyfSkpfXZhciBZPW4mJi9GaXJlZm94L2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtmdW5jdGlvbiBKKGUsdCxuKXt2YXIgcj1CKGUsKGZ1bmN0aW9uKGUpe3JldHVybiBlLm5hbWU9PT10fSkpLGk9ISFyJiZlLnNvbWUoKGZ1bmN0aW9uKGUpe3JldHVybiBlLm5hbWU9PT1uJiZlLmVuYWJsZWQmJmUub3JkZXI8ci5vcmRlcn0pKTtpZighaSl7dmFyIG89ImAiK3QrImAiLGE9ImAiK24rImAiO2NvbnNvbGUud2FybihhKyIgbW9kaWZpZXIgaXMgcmVxdWlyZWQgYnkgIitvKyIgbW9kaWZpZXIgaW4gb3JkZXIgdG8gd29yaywgYmUgc3VyZSB0byBpbmNsdWRlIGl0IGJlZm9yZSAiK28rIiEiKX1yZXR1cm4gaX12YXIgRz1bImF1dG8tc3RhcnQiLCJhdXRvIiwiYXV0by1lbmQiLCJ0b3Atc3RhcnQiLCJ0b3AiLCJ0b3AtZW5kIiwicmlnaHQtc3RhcnQiLCJyaWdodCIsInJpZ2h0LWVuZCIsImJvdHRvbS1lbmQiLCJib3R0b20iLCJib3R0b20tc3RhcnQiLCJsZWZ0LWVuZCIsImxlZnQiLCJsZWZ0LXN0YXJ0Il0sWj1HLnNsaWNlKDMpO2Z1bmN0aW9uIGVlKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdJiZhcmd1bWVudHNbMV0sbj1aLmluZGV4T2YoZSkscj1aLnNsaWNlKG4rMSkuY29uY2F0KFouc2xpY2UoMCxuKSk7cmV0dXJuIHQ/ci5yZXZlcnNlKCk6cn12YXIgdGU9ImZsaXAiLG5lPSJjbG9ja3dpc2UiLHJlPSJjb3VudGVyY2xvY2t3aXNlIjtmdW5jdGlvbiBpZShlLHQsbixyKXt2YXIgaT1bMCwwXSxvPS0xIT09WyJyaWdodCIsImxlZnQiXS5pbmRleE9mKHIpLGE9ZS5zcGxpdCgvKFwrfFwtKS8pLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUudHJpbSgpfSkpLHM9YS5pbmRleE9mKEIoYSwoZnVuY3Rpb24oZSl7cmV0dXJuLTEhPT1lLnNlYXJjaCgvLHxccy8pfSkpKTthW3NdJiYtMT09PWFbc10uaW5kZXhPZigiLCIpJiZjb25zb2xlLndhcm4oIk9mZnNldHMgc2VwYXJhdGVkIGJ5IHdoaXRlIHNwYWNlKHMpIGFyZSBkZXByZWNhdGVkLCB1c2UgYSBjb21tYSAoLCkgaW5zdGVhZC4iKTt2YXIgdT0vXHMqLFxzKnxccysvLGw9LTEhPT1zP1thLnNsaWNlKDAscykuY29uY2F0KFthW3NdLnNwbGl0KHUpWzBdXSksW2Fbc10uc3BsaXQodSlbMV1dLmNvbmNhdChhLnNsaWNlKHMrMSkpXTpbYV07cmV0dXJuKGw9bC5tYXAoKGZ1bmN0aW9uKGUscil7dmFyIGk9KDE9PT1yPyFvOm8pPyJoZWlnaHQiOiJ3aWR0aCIsYT0hMTtyZXR1cm4gZS5yZWR1Y2UoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIiI9PT1lW2UubGVuZ3RoLTFdJiYtMSE9PVsiKyIsIi0iXS5pbmRleE9mKHQpPyhlW2UubGVuZ3RoLTFdPXQsYT0hMCxlKTphPyhlW2UubGVuZ3RoLTFdKz10LGE9ITEsZSk6ZS5jb25jYXQodCl9KSxbXSkubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9ZS5tYXRjaCgvKCg/OlwtfFwrKT9cZCpcLj9cZCopKC4qKS8pLG89K2lbMV0sYT1pWzJdO2lmKCFvKXJldHVybiBlO2lmKDA9PT1hLmluZGV4T2YoIiUiKSl7dmFyIHM9dm9pZCAwO3N3aXRjaChhKXtjYXNlIiVwIjpzPW47YnJlYWs7Y2FzZSIlIjpjYXNlIiVyIjpkZWZhdWx0OnM9cn1yZXR1cm4gQyhzKVt0XS8xMDAqb31pZigidmgiPT09YXx8InZ3Ij09PWEpe3JldHVybigidmgiPT09YT9NYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LHdpbmRvdy5pbm5lckhlaWdodHx8MCk6TWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLHdpbmRvdy5pbm5lcldpZHRofHwwKSkvMTAwKm99cmV0dXJuIG99KGUsaSx0LG4pfSkpfSkpKS5mb3JFYWNoKChmdW5jdGlvbihlLHQpe2UuZm9yRWFjaCgoZnVuY3Rpb24obixyKXtLKG4pJiYoaVt0XSs9biooIi0iPT09ZVtyLTFdPy0xOjEpKX0pKX0pKSxpfXZhciBvZT17cGxhY2VtZW50OiJib3R0b20iLHBvc2l0aW9uRml4ZWQ6ITEsZXZlbnRzRW5hYmxlZDohMCxyZW1vdmVPbkRlc3Ryb3k6ITEsb25DcmVhdGU6ZnVuY3Rpb24oKXt9LG9uVXBkYXRlOmZ1bmN0aW9uKCl7fSxtb2RpZmllcnM6e3NoaWZ0OntvcmRlcjoxMDAsZW5hYmxlZDohMCxmbjpmdW5jdGlvbihlKXt2YXIgdD1lLnBsYWNlbWVudCxuPXQuc3BsaXQoIi0iKVswXSxyPXQuc3BsaXQoIi0iKVsxXTtpZihyKXt2YXIgaT1lLm9mZnNldHMsbz1pLnJlZmVyZW5jZSxhPWkucG9wcGVyLHM9LTEhPT1bImJvdHRvbSIsInRvcCJdLmluZGV4T2YobiksdT1zPyJsZWZ0IjoidG9wIixsPXM/IndpZHRoIjoiaGVpZ2h0IixjPXtzdGFydDpUKHt9LHUsb1t1XSksZW5kOlQoe30sdSxvW3VdK29bbF0tYVtsXSl9O2Uub2Zmc2V0cy5wb3BwZXI9RSh7fSxhLGNbcl0pfXJldHVybiBlfX0sb2Zmc2V0OntvcmRlcjoyMDAsZW5hYmxlZDohMCxmbjpmdW5jdGlvbihlLHQpe3ZhciBuPXQub2Zmc2V0LHI9ZS5wbGFjZW1lbnQsaT1lLm9mZnNldHMsbz1pLnBvcHBlcixhPWkucmVmZXJlbmNlLHM9ci5zcGxpdCgiLSIpWzBdLHU9dm9pZCAwO3JldHVybiB1PUsoK24pP1srbiwwXTppZShuLG8sYSxzKSwibGVmdCI9PT1zPyhvLnRvcCs9dVswXSxvLmxlZnQtPXVbMV0pOiJyaWdodCI9PT1zPyhvLnRvcCs9dVswXSxvLmxlZnQrPXVbMV0pOiJ0b3AiPT09cz8oby5sZWZ0Kz11WzBdLG8udG9wLT11WzFdKToiYm90dG9tIj09PXMmJihvLmxlZnQrPXVbMF0sby50b3ArPXVbMV0pLGUucG9wcGVyPW8sZX0sb2Zmc2V0OjB9LHByZXZlbnRPdmVyZmxvdzp7b3JkZXI6MzAwLGVuYWJsZWQ6ITAsZm46ZnVuY3Rpb24oZSx0KXt2YXIgbj10LmJvdW5kYXJpZXNFbGVtZW50fHxoKGUuaW5zdGFuY2UucG9wcGVyKTtlLmluc3RhbmNlLnJlZmVyZW5jZT09PW4mJihuPWgobikpO3ZhciByPUYoInRyYW5zZm9ybSIpLGk9ZS5pbnN0YW5jZS5wb3BwZXIuc3R5bGUsbz1pLnRvcCxhPWkubGVmdCxzPWlbcl07aS50b3A9IiIsaS5sZWZ0PSIiLGlbcl09IiI7dmFyIHU9aihlLmluc3RhbmNlLnBvcHBlcixlLmluc3RhbmNlLnJlZmVyZW5jZSx0LnBhZGRpbmcsbixlLnBvc2l0aW9uRml4ZWQpO2kudG9wPW8saS5sZWZ0PWEsaVtyXT1zLHQuYm91bmRhcmllcz11O3ZhciBsPXQucHJpb3JpdHksYz1lLm9mZnNldHMucG9wcGVyLGY9e3ByaW1hcnk6ZnVuY3Rpb24oZSl7dmFyIG49Y1tlXTtyZXR1cm4gY1tlXTx1W2VdJiYhdC5lc2NhcGVXaXRoUmVmZXJlbmNlJiYobj1NYXRoLm1heChjW2VdLHVbZV0pKSxUKHt9LGUsbil9LHNlY29uZGFyeTpmdW5jdGlvbihlKXt2YXIgbj0icmlnaHQiPT09ZT8ibGVmdCI6InRvcCIscj1jW25dO3JldHVybiBjW2VdPnVbZV0mJiF0LmVzY2FwZVdpdGhSZWZlcmVuY2UmJihyPU1hdGgubWluKGNbbl0sdVtlXS0oInJpZ2h0Ij09PWU/Yy53aWR0aDpjLmhlaWdodCkpKSxUKHt9LG4scil9fTtyZXR1cm4gbC5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgdD0tMSE9PVsibGVmdCIsInRvcCJdLmluZGV4T2YoZSk/InByaW1hcnkiOiJzZWNvbmRhcnkiO2M9RSh7fSxjLGZbdF0oZSkpfSkpLGUub2Zmc2V0cy5wb3BwZXI9YyxlfSxwcmlvcml0eTpbImxlZnQiLCJyaWdodCIsInRvcCIsImJvdHRvbSJdLHBhZGRpbmc6NSxib3VuZGFyaWVzRWxlbWVudDoic2Nyb2xsUGFyZW50In0sa2VlcFRvZ2V0aGVyOntvcmRlcjo0MDAsZW5hYmxlZDohMCxmbjpmdW5jdGlvbihlKXt2YXIgdD1lLm9mZnNldHMsbj10LnBvcHBlcixyPXQucmVmZXJlbmNlLGk9ZS5wbGFjZW1lbnQuc3BsaXQoIi0iKVswXSxvPU1hdGguZmxvb3IsYT0tMSE9PVsidG9wIiwiYm90dG9tIl0uaW5kZXhPZihpKSxzPWE/InJpZ2h0IjoiYm90dG9tIix1PWE/ImxlZnQiOiJ0b3AiLGw9YT8id2lkdGgiOiJoZWlnaHQiO3JldHVybiBuW3NdPG8oclt1XSkmJihlLm9mZnNldHMucG9wcGVyW3VdPW8oclt1XSktbltsXSksblt1XT5vKHJbc10pJiYoZS5vZmZzZXRzLnBvcHBlclt1XT1vKHJbc10pKSxlfX0sYXJyb3c6e29yZGVyOjUwMCxlbmFibGVkOiEwLGZuOmZ1bmN0aW9uKGUsdCl7dmFyIG47aWYoIUooZS5pbnN0YW5jZS5tb2RpZmllcnMsImFycm93Iiwia2VlcFRvZ2V0aGVyIikpcmV0dXJuIGU7dmFyIHI9dC5lbGVtZW50O2lmKCJzdHJpbmciPT10eXBlb2Ygcil7aWYoIShyPWUuaW5zdGFuY2UucG9wcGVyLnF1ZXJ5U2VsZWN0b3IocikpKXJldHVybiBlfWVsc2UgaWYoIWUuaW5zdGFuY2UucG9wcGVyLmNvbnRhaW5zKHIpKXJldHVybiBjb25zb2xlLndhcm4oIldBUk5JTkc6IGBhcnJvdy5lbGVtZW50YCBtdXN0IGJlIGNoaWxkIG9mIGl0cyBwb3BwZXIgZWxlbWVudCEiKSxlO3ZhciBpPWUucGxhY2VtZW50LnNwbGl0KCItIilbMF0sbz1lLm9mZnNldHMscz1vLnBvcHBlcix1PW8ucmVmZXJlbmNlLGw9LTEhPT1bImxlZnQiLCJyaWdodCJdLmluZGV4T2YoaSksYz1sPyJoZWlnaHQiOiJ3aWR0aCIsZj1sPyJUb3AiOiJMZWZ0IixkPWYudG9Mb3dlckNhc2UoKSxoPWw/ImxlZnQiOiJ0b3AiLHA9bD8iYm90dG9tIjoicmlnaHQiLGc9UihyKVtjXTt1W3BdLWc8c1tkXSYmKGUub2Zmc2V0cy5wb3BwZXJbZF0tPXNbZF0tKHVbcF0tZykpLHVbZF0rZz5zW3BdJiYoZS5vZmZzZXRzLnBvcHBlcltkXSs9dVtkXStnLXNbcF0pLGUub2Zmc2V0cy5wb3BwZXI9QyhlLm9mZnNldHMucG9wcGVyKTt2YXIgdj11W2RdK3VbY10vMi1nLzIsbT1hKGUuaW5zdGFuY2UucG9wcGVyKSx5PXBhcnNlRmxvYXQobVsibWFyZ2luIitmXSksYj1wYXJzZUZsb2F0KG1bImJvcmRlciIrZisiV2lkdGgiXSksXz12LWUub2Zmc2V0cy5wb3BwZXJbZF0teS1iO3JldHVybiBfPU1hdGgubWF4KE1hdGgubWluKHNbY10tZyxfKSwwKSxlLmFycm93RWxlbWVudD1yLGUub2Zmc2V0cy5hcnJvdz0oVChuPXt9LGQsTWF0aC5yb3VuZChfKSksVChuLGgsIiIpLG4pLGV9LGVsZW1lbnQ6Ilt4LWFycm93XSJ9LGZsaXA6e29yZGVyOjYwMCxlbmFibGVkOiEwLGZuOmZ1bmN0aW9uKGUsdCl7aWYoSChlLmluc3RhbmNlLm1vZGlmaWVycywiaW5uZXIiKSlyZXR1cm4gZTtpZihlLmZsaXBwZWQmJmUucGxhY2VtZW50PT09ZS5vcmlnaW5hbFBsYWNlbWVudClyZXR1cm4gZTt2YXIgbj1qKGUuaW5zdGFuY2UucG9wcGVyLGUuaW5zdGFuY2UucmVmZXJlbmNlLHQucGFkZGluZyx0LmJvdW5kYXJpZXNFbGVtZW50LGUucG9zaXRpb25GaXhlZCkscj1lLnBsYWNlbWVudC5zcGxpdCgiLSIpWzBdLGk9UChyKSxvPWUucGxhY2VtZW50LnNwbGl0KCItIilbMV18fCIiLGE9W107c3dpdGNoKHQuYmVoYXZpb3Ipe2Nhc2UgdGU6YT1bcixpXTticmVhaztjYXNlIG5lOmE9ZWUocik7YnJlYWs7Y2FzZSByZTphPWVlKHIsITApO2JyZWFrO2RlZmF1bHQ6YT10LmJlaGF2aW9yfXJldHVybiBhLmZvckVhY2goKGZ1bmN0aW9uKHMsdSl7aWYociE9PXN8fGEubGVuZ3RoPT09dSsxKXJldHVybiBlO3I9ZS5wbGFjZW1lbnQuc3BsaXQoIi0iKVswXSxpPVAocik7dmFyIGw9ZS5vZmZzZXRzLnBvcHBlcixjPWUub2Zmc2V0cy5yZWZlcmVuY2UsZj1NYXRoLmZsb29yLGQ9ImxlZnQiPT09ciYmZihsLnJpZ2h0KT5mKGMubGVmdCl8fCJyaWdodCI9PT1yJiZmKGwubGVmdCk8ZihjLnJpZ2h0KXx8InRvcCI9PT1yJiZmKGwuYm90dG9tKT5mKGMudG9wKXx8ImJvdHRvbSI9PT1yJiZmKGwudG9wKTxmKGMuYm90dG9tKSxoPWYobC5sZWZ0KTxmKG4ubGVmdCkscD1mKGwucmlnaHQpPmYobi5yaWdodCksZz1mKGwudG9wKTxmKG4udG9wKSx2PWYobC5ib3R0b20pPmYobi5ib3R0b20pLG09ImxlZnQiPT09ciYmaHx8InJpZ2h0Ij09PXImJnB8fCJ0b3AiPT09ciYmZ3x8ImJvdHRvbSI9PT1yJiZ2LHk9LTEhPT1bInRvcCIsImJvdHRvbSJdLmluZGV4T2YociksYj0hIXQuZmxpcFZhcmlhdGlvbnMmJih5JiYic3RhcnQiPT09byYmaHx8eSYmImVuZCI9PT1vJiZwfHwheSYmInN0YXJ0Ij09PW8mJmd8fCF5JiYiZW5kIj09PW8mJnYpLF89ISF0LmZsaXBWYXJpYXRpb25zQnlDb250ZW50JiYoeSYmInN0YXJ0Ij09PW8mJnB8fHkmJiJlbmQiPT09byYmaHx8IXkmJiJzdGFydCI9PT1vJiZ2fHwheSYmImVuZCI9PT1vJiZnKSx3PWJ8fF87KGR8fG18fHcpJiYoZS5mbGlwcGVkPSEwLChkfHxtKSYmKHI9YVt1KzFdKSx3JiYobz1mdW5jdGlvbihlKXtyZXR1cm4iZW5kIj09PWU/InN0YXJ0Ijoic3RhcnQiPT09ZT8iZW5kIjplfShvKSksZS5wbGFjZW1lbnQ9cisobz8iLSIrbzoiIiksZS5vZmZzZXRzLnBvcHBlcj1FKHt9LGUub2Zmc2V0cy5wb3BwZXIsJChlLmluc3RhbmNlLnBvcHBlcixlLm9mZnNldHMucmVmZXJlbmNlLGUucGxhY2VtZW50KSksZT1xKGUuaW5zdGFuY2UubW9kaWZpZXJzLGUsImZsaXAiKSl9KSksZX0sYmVoYXZpb3I6ImZsaXAiLHBhZGRpbmc6NSxib3VuZGFyaWVzRWxlbWVudDoidmlld3BvcnQiLGZsaXBWYXJpYXRpb25zOiExLGZsaXBWYXJpYXRpb25zQnlDb250ZW50OiExfSxpbm5lcjp7b3JkZXI6NzAwLGVuYWJsZWQ6ITEsZm46ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wbGFjZW1lbnQsbj10LnNwbGl0KCItIilbMF0scj1lLm9mZnNldHMsaT1yLnBvcHBlcixvPXIucmVmZXJlbmNlLGE9LTEhPT1bImxlZnQiLCJyaWdodCJdLmluZGV4T2Yobikscz0tMT09PVsidG9wIiwibGVmdCJdLmluZGV4T2Yobik7cmV0dXJuIGlbYT8ibGVmdCI6InRvcCJdPW9bbl0tKHM/aVthPyJ3aWR0aCI6ImhlaWdodCJdOjApLGUucGxhY2VtZW50PVAodCksZS5vZmZzZXRzLnBvcHBlcj1DKGkpLGV9fSxoaWRlOntvcmRlcjo4MDAsZW5hYmxlZDohMCxmbjpmdW5jdGlvbihlKXtpZighSihlLmluc3RhbmNlLm1vZGlmaWVycywiaGlkZSIsInByZXZlbnRPdmVyZmxvdyIpKXJldHVybiBlO3ZhciB0PWUub2Zmc2V0cy5yZWZlcmVuY2Usbj1CKGUuaW5zdGFuY2UubW9kaWZpZXJzLChmdW5jdGlvbihlKXtyZXR1cm4icHJldmVudE92ZXJmbG93Ij09PWUubmFtZX0pKS5ib3VuZGFyaWVzO2lmKHQuYm90dG9tPG4udG9wfHx0LmxlZnQ+bi5yaWdodHx8dC50b3A+bi5ib3R0b218fHQucmlnaHQ8bi5sZWZ0KXtpZighMD09PWUuaGlkZSlyZXR1cm4gZTtlLmhpZGU9ITAsZS5hdHRyaWJ1dGVzWyJ4LW91dC1vZi1ib3VuZGFyaWVzIl09IiJ9ZWxzZXtpZighMT09PWUuaGlkZSlyZXR1cm4gZTtlLmhpZGU9ITEsZS5hdHRyaWJ1dGVzWyJ4LW91dC1vZi1ib3VuZGFyaWVzIl09ITF9cmV0dXJuIGV9fSxjb21wdXRlU3R5bGU6e29yZGVyOjg1MCxlbmFibGVkOiEwLGZuOmZ1bmN0aW9uKGUsdCl7dmFyIG49dC54LHI9dC55LGk9ZS5vZmZzZXRzLnBvcHBlcixvPUIoZS5pbnN0YW5jZS5tb2RpZmllcnMsKGZ1bmN0aW9uKGUpe3JldHVybiJhcHBseVN0eWxlIj09PWUubmFtZX0pKS5ncHVBY2NlbGVyYXRpb247dm9pZCAwIT09byYmY29uc29sZS53YXJuKCJXQVJOSU5HOiBgZ3B1QWNjZWxlcmF0aW9uYCBvcHRpb24gbW92ZWQgdG8gYGNvbXB1dGVTdHlsZWAgbW9kaWZpZXIgYW5kIHdpbGwgbm90IGJlIHN1cHBvcnRlZCBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgUG9wcGVyLmpzISIpO3ZhciBhPXZvaWQgMCE9PW8/bzp0LmdwdUFjY2VsZXJhdGlvbixzPWgoZS5pbnN0YW5jZS5wb3BwZXIpLHU9UyhzKSxsPXtwb3NpdGlvbjppLnBvc2l0aW9ufSxjPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5vZmZzZXRzLHI9bi5wb3BwZXIsaT1uLnJlZmVyZW5jZSxvPU1hdGgucm91bmQsYT1NYXRoLmZsb29yLHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LHU9byhpLndpZHRoKSxsPW8oci53aWR0aCksYz0tMSE9PVsibGVmdCIsInJpZ2h0Il0uaW5kZXhPZihlLnBsYWNlbWVudCksZj0tMSE9PWUucGxhY2VtZW50LmluZGV4T2YoIi0iKSxkPXQ/Y3x8Znx8dSUyPT1sJTI/bzphOnMsaD10P286cztyZXR1cm57bGVmdDpkKHUlMj09MSYmbCUyPT0xJiYhZiYmdD9yLmxlZnQtMTpyLmxlZnQpLHRvcDpoKHIudG9wKSxib3R0b206aChyLmJvdHRvbSkscmlnaHQ6ZChyLnJpZ2h0KX19KGUsd2luZG93LmRldmljZVBpeGVsUmF0aW88Mnx8IVkpLGY9ImJvdHRvbSI9PT1uPyJ0b3AiOiJib3R0b20iLGQ9InJpZ2h0Ij09PXI/ImxlZnQiOiJyaWdodCIscD1GKCJ0cmFuc2Zvcm0iKSxnPXZvaWQgMCx2PXZvaWQgMDtpZih2PSJib3R0b20iPT09Zj8iSFRNTCI9PT1zLm5vZGVOYW1lPy1zLmNsaWVudEhlaWdodCtjLmJvdHRvbTotdS5oZWlnaHQrYy5ib3R0b206Yy50b3AsZz0icmlnaHQiPT09ZD8iSFRNTCI9PT1zLm5vZGVOYW1lPy1zLmNsaWVudFdpZHRoK2MucmlnaHQ6LXUud2lkdGgrYy5yaWdodDpjLmxlZnQsYSYmcClsW3BdPSJ0cmFuc2xhdGUzZCgiK2crInB4LCAiK3YrInB4LCAwKSIsbFtmXT0wLGxbZF09MCxsLndpbGxDaGFuZ2U9InRyYW5zZm9ybSI7ZWxzZXt2YXIgbT0iYm90dG9tIj09PWY/LTE6MSx5PSJyaWdodCI9PT1kPy0xOjE7bFtmXT12Km0sbFtkXT1nKnksbC53aWxsQ2hhbmdlPWYrIiwgIitkfXZhciBiPXsieC1wbGFjZW1lbnQiOmUucGxhY2VtZW50fTtyZXR1cm4gZS5hdHRyaWJ1dGVzPUUoe30sYixlLmF0dHJpYnV0ZXMpLGUuc3R5bGVzPUUoe30sbCxlLnN0eWxlcyksZS5hcnJvd1N0eWxlcz1FKHt9LGUub2Zmc2V0cy5hcnJvdyxlLmFycm93U3R5bGVzKSxlfSxncHVBY2NlbGVyYXRpb246ITAseDoiYm90dG9tIix5OiJyaWdodCJ9LGFwcGx5U3R5bGU6e29yZGVyOjkwMCxlbmFibGVkOiEwLGZuOmZ1bmN0aW9uKGUpe3ZhciB0LG47cmV0dXJuIFgoZS5pbnN0YW5jZS5wb3BwZXIsZS5zdHlsZXMpLHQ9ZS5pbnN0YW5jZS5wb3BwZXIsbj1lLmF0dHJpYnV0ZXMsT2JqZWN0LmtleXMobikuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ITEhPT1uW2VdP3Quc2V0QXR0cmlidXRlKGUsbltlXSk6dC5yZW1vdmVBdHRyaWJ1dGUoZSl9KSksZS5hcnJvd0VsZW1lbnQmJk9iamVjdC5rZXlzKGUuYXJyb3dTdHlsZXMpLmxlbmd0aCYmWChlLmFycm93RWxlbWVudCxlLmFycm93U3R5bGVzKSxlfSxvbkxvYWQ6ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbz1JKGksdCxlLG4ucG9zaXRpb25GaXhlZCksYT1MKG4ucGxhY2VtZW50LG8sdCxlLG4ubW9kaWZpZXJzLmZsaXAuYm91bmRhcmllc0VsZW1lbnQsbi5tb2RpZmllcnMuZmxpcC5wYWRkaW5nKTtyZXR1cm4gdC5zZXRBdHRyaWJ1dGUoIngtcGxhY2VtZW50IixhKSxYKHQse3Bvc2l0aW9uOm4ucG9zaXRpb25GaXhlZD8iZml4ZWQiOiJhYnNvbHV0ZSJ9KSxufSxncHVBY2NlbGVyYXRpb246dm9pZCAwfX19LGFlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0LG4pe3ZhciByPXRoaXMsYT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06e307dyh0aGlzLGUpLHRoaXMuc2NoZWR1bGVVcGRhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHIudXBkYXRlKX0sdGhpcy51cGRhdGU9aSh0aGlzLnVwZGF0ZS5iaW5kKHRoaXMpKSx0aGlzLm9wdGlvbnM9RSh7fSxlLkRlZmF1bHRzLGEpLHRoaXMuc3RhdGU9e2lzRGVzdHJveWVkOiExLGlzQ3JlYXRlZDohMSxzY3JvbGxQYXJlbnRzOltdfSx0aGlzLnJlZmVyZW5jZT10JiZ0LmpxdWVyeT90WzBdOnQsdGhpcy5wb3BwZXI9biYmbi5qcXVlcnk/blswXTpuLHRoaXMub3B0aW9ucy5tb2RpZmllcnM9e30sT2JqZWN0LmtleXMoRSh7fSxlLkRlZmF1bHRzLm1vZGlmaWVycyxhLm1vZGlmaWVycykpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3Iub3B0aW9ucy5tb2RpZmllcnNbdF09RSh7fSxlLkRlZmF1bHRzLm1vZGlmaWVyc1t0XXx8e30sYS5tb2RpZmllcnM/YS5tb2RpZmllcnNbdF06e30pfSkpLHRoaXMubW9kaWZpZXJzPU9iamVjdC5rZXlzKHRoaXMub3B0aW9ucy5tb2RpZmllcnMpLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIEUoe25hbWU6ZX0sci5vcHRpb25zLm1vZGlmaWVyc1tlXSl9KSkuc29ydCgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5vcmRlci10Lm9yZGVyfSkpLHRoaXMubW9kaWZpZXJzLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UuZW5hYmxlZCYmbyhlLm9uTG9hZCkmJmUub25Mb2FkKHIucmVmZXJlbmNlLHIucG9wcGVyLHIub3B0aW9ucyxlLHIuc3RhdGUpfSkpLHRoaXMudXBkYXRlKCk7dmFyIHM9dGhpcy5vcHRpb25zLmV2ZW50c0VuYWJsZWQ7cyYmdGhpcy5lbmFibGVFdmVudExpc3RlbmVycygpLHRoaXMuc3RhdGUuZXZlbnRzRW5hYmxlZD1zfXJldHVybiB4KGUsW3trZXk6InVwZGF0ZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gTS5jYWxsKHRoaXMpfX0se2tleToiZGVzdHJveSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gVy5jYWxsKHRoaXMpfX0se2tleToiZW5hYmxlRXZlbnRMaXN0ZW5lcnMiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIFEuY2FsbCh0aGlzKX19LHtrZXk6ImRpc2FibGVFdmVudExpc3RlbmVycyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gVi5jYWxsKHRoaXMpfX1dKSxlfSgpO2FlLlV0aWxzPSgidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6ZSkuUG9wcGVyVXRpbHMsYWUucGxhY2VtZW50cz1HLGFlLkRlZmF1bHRzPW9lLHQuZGVmYXVsdD1hZX0uY2FsbCh0aGlzLG4oInlMcGoiKSl9LCI4b3hCIjpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaT1lLmV4cG9ydHM9e307ZnVuY3Rpb24gbygpe3Rocm93IG5ldyBFcnJvcigic2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpfWZ1bmN0aW9uIGEoKXt0aHJvdyBuZXcgRXJyb3IoImNsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpfWZ1bmN0aW9uIHMoZSl7aWYobj09PXNldFRpbWVvdXQpcmV0dXJuIHNldFRpbWVvdXQoZSwwKTtpZigobj09PW98fCFuKSYmc2V0VGltZW91dClyZXR1cm4gbj1zZXRUaW1lb3V0LHNldFRpbWVvdXQoZSwwKTt0cnl7cmV0dXJuIG4oZSwwKX1jYXRjaCh0KXt0cnl7cmV0dXJuIG4uY2FsbChudWxsLGUsMCl9Y2F0Y2godCl7cmV0dXJuIG4uY2FsbCh0aGlzLGUsMCl9fX0hZnVuY3Rpb24oKXt0cnl7bj0iZnVuY3Rpb24iPT10eXBlb2Ygc2V0VGltZW91dD9zZXRUaW1lb3V0Om99Y2F0Y2goZSl7bj1vfXRyeXtyPSJmdW5jdGlvbiI9PXR5cGVvZiBjbGVhclRpbWVvdXQ/Y2xlYXJUaW1lb3V0OmF9Y2F0Y2goZSl7cj1hfX0oKTt2YXIgdSxsPVtdLGM9ITEsZj0tMTtmdW5jdGlvbiBkKCl7YyYmdSYmKGM9ITEsdS5sZW5ndGg/bD11LmNvbmNhdChsKTpmPS0xLGwubGVuZ3RoJiZoKCkpfWZ1bmN0aW9uIGgoKXtpZighYyl7dmFyIGU9cyhkKTtjPSEwO2Zvcih2YXIgdD1sLmxlbmd0aDt0Oyl7Zm9yKHU9bCxsPVtdOysrZjx0Oyl1JiZ1W2ZdLnJ1bigpO2Y9LTEsdD1sLmxlbmd0aH11PW51bGwsYz0hMSxmdW5jdGlvbihlKXtpZihyPT09Y2xlYXJUaW1lb3V0KXJldHVybiBjbGVhclRpbWVvdXQoZSk7aWYoKHI9PT1hfHwhcikmJmNsZWFyVGltZW91dClyZXR1cm4gcj1jbGVhclRpbWVvdXQsY2xlYXJUaW1lb3V0KGUpO3RyeXtyKGUpfWNhdGNoKHQpe3RyeXtyZXR1cm4gci5jYWxsKG51bGwsZSl9Y2F0Y2godCl7cmV0dXJuIHIuY2FsbCh0aGlzLGUpfX19KGUpfX1mdW5jdGlvbiBwKGUsdCl7dGhpcy5mdW49ZSx0aGlzLmFycmF5PXR9ZnVuY3Rpb24gZygpe31pLm5leHRUaWNrPWZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpO2lmKGFyZ3VtZW50cy5sZW5ndGg+MSlmb3IodmFyIG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXRbbi0xXT1hcmd1bWVudHNbbl07bC5wdXNoKG5ldyBwKGUsdCkpLDEhPT1sLmxlbmd0aHx8Y3x8cyhoKX0scC5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX0saS50aXRsZT0iYnJvd3NlciIsaS5icm93c2VyPSEwLGkuZW52PXt9LGkuYXJndj1bXSxpLnZlcnNpb249IiIsaS52ZXJzaW9ucz17fSxpLm9uPWcsaS5hZGRMaXN0ZW5lcj1nLGkub25jZT1nLGkub2ZmPWcsaS5yZW1vdmVMaXN0ZW5lcj1nLGkucmVtb3ZlQWxsTGlzdGVuZXJzPWcsaS5lbWl0PWcsaS5wcmVwZW5kTGlzdGVuZXI9ZyxpLnByZXBlbmRPbmNlTGlzdGVuZXI9ZyxpLmxpc3RlbmVycz1mdW5jdGlvbihlKXtyZXR1cm5bXX0saS5iaW5kaW5nPWZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcigicHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQiKX0saS5jd2Q9ZnVuY3Rpb24oKXtyZXR1cm4iLyJ9LGkuY2hkaXI9ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKCJwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQiKX0saS51bWFzaz1mdW5jdGlvbigpe3JldHVybiAwfX0sIjlXaDEiOmZ1bmN0aW9uKGUsdCxuKXt3aW5kb3cuXz1uKCJMdkRsIik7dHJ5e3dpbmRvdy5Qb3BwZXI9bigiOEwzRiIpLmRlZmF1bHQsd2luZG93LiQ9d2luZG93LmpRdWVyeT1uKCJFVmRuIiksbigiU1lreSIpfWNhdGNoKGUpe313aW5kb3cuYXhpb3M9bigidkRxaSIpLHdpbmRvdy5heGlvcy5kZWZhdWx0cy5oZWFkZXJzLmNvbW1vblsiWC1SZXF1ZXN0ZWQtV2l0aCJdPSJYTUxIdHRwUmVxdWVzdCJ9LCI5clNRIjpmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oInhUSisiKTtmdW5jdGlvbiBpKCl7dGhpcy5oYW5kbGVycz1bXX1pLnByb3RvdHlwZS51c2U9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5oYW5kbGVycy5wdXNoKHtmdWxmaWxsZWQ6ZSxyZWplY3RlZDp0fSksdGhpcy5oYW5kbGVycy5sZW5ndGgtMX0saS5wcm90b3R5cGUuZWplY3Q9ZnVuY3Rpb24oZSl7dGhpcy5oYW5kbGVyc1tlXSYmKHRoaXMuaGFuZGxlcnNbZV09bnVsbCl9LGkucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24oZSl7ci5mb3JFYWNoKHRoaXMuaGFuZGxlcnMsKGZ1bmN0aW9uKHQpe251bGwhPT10JiZlKHQpfSkpfSxlLmV4cG9ydHM9aX0sQ2dhUzpmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oInhUSisiKSxpPW4oIk1MV1oiKSxvPW4oIjlyU1EiKSxhPW4oIlVuQksiKSxzPW4oIlNudEIiKTtmdW5jdGlvbiB1KGUpe3RoaXMuZGVmYXVsdHM9ZSx0aGlzLmludGVyY2VwdG9ycz17cmVxdWVzdDpuZXcgbyxyZXNwb25zZTpuZXcgb319dS5wcm90b3R5cGUucmVxdWVzdD1mdW5jdGlvbihlKXsic3RyaW5nIj09dHlwZW9mIGU/KGU9YXJndW1lbnRzWzFdfHx7fSkudXJsPWFyZ3VtZW50c1swXTplPWV8fHt9LChlPXModGhpcy5kZWZhdWx0cyxlKSkubWV0aG9kP2UubWV0aG9kPWUubWV0aG9kLnRvTG93ZXJDYXNlKCk6dGhpcy5kZWZhdWx0cy5tZXRob2Q/ZS5tZXRob2Q9dGhpcy5kZWZhdWx0cy5tZXRob2QudG9Mb3dlckNhc2UoKTplLm1ldGhvZD0iZ2V0Ijt2YXIgdD1bYSx2b2lkIDBdLG49UHJvbWlzZS5yZXNvbHZlKGUpO2Zvcih0aGlzLmludGVyY2VwdG9ycy5yZXF1ZXN0LmZvckVhY2goKGZ1bmN0aW9uKGUpe3QudW5zaGlmdChlLmZ1bGZpbGxlZCxlLnJlamVjdGVkKX0pKSx0aGlzLmludGVyY2VwdG9ycy5yZXNwb25zZS5mb3JFYWNoKChmdW5jdGlvbihlKXt0LnB1c2goZS5mdWxmaWxsZWQsZS5yZWplY3RlZCl9KSk7dC5sZW5ndGg7KW49bi50aGVuKHQuc2hpZnQoKSx0LnNoaWZ0KCkpO3JldHVybiBufSx1LnByb3RvdHlwZS5nZXRVcmk9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9cyh0aGlzLmRlZmF1bHRzLGUpLGkoZS51cmwsZS5wYXJhbXMsZS5wYXJhbXNTZXJpYWxpemVyKS5yZXBsYWNlKC9eXD8vLCIiKX0sci5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsIm9wdGlvbnMiXSwoZnVuY3Rpb24oZSl7dS5wcm90b3R5cGVbZV09ZnVuY3Rpb24odCxuKXtyZXR1cm4gdGhpcy5yZXF1ZXN0KHIubWVyZ2Uobnx8e30se21ldGhvZDplLHVybDp0fSkpfX0pKSxyLmZvckVhY2goWyJwb3N0IiwicHV0IiwicGF0Y2giXSwoZnVuY3Rpb24oZSl7dS5wcm90b3R5cGVbZV09ZnVuY3Rpb24odCxuLGkpe3JldHVybiB0aGlzLnJlcXVlc3Qoci5tZXJnZShpfHx7fSx7bWV0aG9kOmUsdXJsOnQsZGF0YTpufSkpfX0pKSxlLmV4cG9ydHM9dX0sRGZaQjpmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUuYXBwbHkobnVsbCx0KX19fSxFVmRuOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcjshZnVuY3Rpb24odCxuKXsidXNlIHN0cmljdCI7Im9iamVjdCI9PXR5cGVvZiBlLmV4cG9ydHM/ZS5leHBvcnRzPXQuZG9jdW1lbnQ/bih0LCEwKTpmdW5jdGlvbihlKXtpZighZS5kb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnQiKTtyZXR1cm4gbihlKX06bih0KX0oInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OnRoaXMsKGZ1bmN0aW9uKG4saSl7InVzZSBzdHJpY3QiO3ZhciBvPVtdLGE9T2JqZWN0LmdldFByb3RvdHlwZU9mLHM9by5zbGljZSx1PW8uZmxhdD9mdW5jdGlvbihlKXtyZXR1cm4gby5mbGF0LmNhbGwoZSl9OmZ1bmN0aW9uKGUpe3JldHVybiBvLmNvbmNhdC5hcHBseShbXSxlKX0sbD1vLnB1c2gsYz1vLmluZGV4T2YsZj17fSxkPWYudG9TdHJpbmcsaD1mLmhhc093blByb3BlcnR5LHA9aC50b1N0cmluZyxnPXAuY2FsbChPYmplY3QpLHY9e30sbT1mdW5jdGlvbihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZSYmIm51bWJlciIhPXR5cGVvZiBlLm5vZGVUeXBlJiYiZnVuY3Rpb24iIT10eXBlb2YgZS5pdGVtfSx5PWZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT1lJiZlPT09ZS53aW5kb3d9LGI9bi5kb2N1bWVudCxfPXt0eXBlOiEwLHNyYzohMCxub25jZTohMCxub01vZHVsZTohMH07ZnVuY3Rpb24gdyhlLHQsbil7dmFyIHIsaSxvPShuPW58fGIpLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2lmKG8udGV4dD1lLHQpZm9yKHIgaW4gXykoaT10W3JdfHx0LmdldEF0dHJpYnV0ZSYmdC5nZXRBdHRyaWJ1dGUocikpJiZvLnNldEF0dHJpYnV0ZShyLGkpO24uaGVhZC5hcHBlbmRDaGlsZChvKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG8pfWZ1bmN0aW9uIHgoZSl7cmV0dXJuIG51bGw9PWU/ZSsiIjoib2JqZWN0Ij09dHlwZW9mIGV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlP2ZbZC5jYWxsKGUpXXx8Im9iamVjdCI6dHlwZW9mIGV9dmFyIFQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbmV3IFQuZm4uaW5pdChlLHQpfTtmdW5jdGlvbiBFKGUpe3ZhciB0PSEhZSYmImxlbmd0aCJpbiBlJiZlLmxlbmd0aCxuPXgoZSk7cmV0dXJuIW0oZSkmJiF5KGUpJiYoImFycmF5Ij09PW58fDA9PT10fHwibnVtYmVyIj09dHlwZW9mIHQmJnQ+MCYmdC0xIGluIGUpfVQuZm49VC5wcm90b3R5cGU9e2pxdWVyeToiMy42LjQiLGNvbnN0cnVjdG9yOlQsbGVuZ3RoOjAsdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBzLmNhbGwodGhpcyl9LGdldDpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT9zLmNhbGwodGhpcyk6ZTwwP3RoaXNbZSt0aGlzLmxlbmd0aF06dGhpc1tlXX0scHVzaFN0YWNrOmZ1bmN0aW9uKGUpe3ZhciB0PVQubWVyZ2UodGhpcy5jb25zdHJ1Y3RvcigpLGUpO3JldHVybiB0LnByZXZPYmplY3Q9dGhpcyx0fSxlYWNoOmZ1bmN0aW9uKGUpe3JldHVybiBULmVhY2godGhpcyxlKX0sbWFwOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhULm1hcCh0aGlzLChmdW5jdGlvbih0LG4pe3JldHVybiBlLmNhbGwodCxuLHQpfSkpKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2socy5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxldmVuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFQuZ3JlcCh0aGlzLChmdW5jdGlvbihlLHQpe3JldHVybih0KzEpJTJ9KSkpfSxvZGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soVC5ncmVwKHRoaXMsKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQlMn0pKSl9LGVxOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMubGVuZ3RoLG49K2UrKGU8MD90OjApO3JldHVybiB0aGlzLnB1c2hTdGFjayhuPj0wJiZuPHQ/W3RoaXNbbl1dOltdKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8dGhpcy5jb25zdHJ1Y3RvcigpfSxwdXNoOmwsc29ydDpvLnNvcnQsc3BsaWNlOm8uc3BsaWNlfSxULmV4dGVuZD1ULmZuLmV4dGVuZD1mdW5jdGlvbigpe3ZhciBlLHQsbixyLGksbyxhPWFyZ3VtZW50c1swXXx8e30scz0xLHU9YXJndW1lbnRzLmxlbmd0aCxsPSExO2ZvcigiYm9vbGVhbiI9PXR5cGVvZiBhJiYobD1hLGE9YXJndW1lbnRzW3NdfHx7fSxzKyspLCJvYmplY3QiPT10eXBlb2YgYXx8bShhKXx8KGE9e30pLHM9PT11JiYoYT10aGlzLHMtLSk7czx1O3MrKylpZihudWxsIT0oZT1hcmd1bWVudHNbc10pKWZvcih0IGluIGUpcj1lW3RdLCJfX3Byb3RvX18iIT09dCYmYSE9PXImJihsJiZyJiYoVC5pc1BsYWluT2JqZWN0KHIpfHwoaT1BcnJheS5pc0FycmF5KHIpKSk/KG49YVt0XSxvPWkmJiFBcnJheS5pc0FycmF5KG4pP1tdOml8fFQuaXNQbGFpbk9iamVjdChuKT9uOnt9LGk9ITEsYVt0XT1ULmV4dGVuZChsLG8scikpOnZvaWQgMCE9PXImJihhW3RdPXIpKTtyZXR1cm4gYX0sVC5leHRlbmQoe2V4cGFuZG86ImpRdWVyeSIrKCIzLjYuNCIrTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksaXNSZWFkeTohMCxlcnJvcjpmdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoZSl9LG5vb3A6ZnVuY3Rpb24oKXt9LGlzUGxhaW5PYmplY3Q6ZnVuY3Rpb24oZSl7dmFyIHQsbjtyZXR1cm4hKCFlfHwiW29iamVjdCBPYmplY3RdIiE9PWQuY2FsbChlKSkmJighKHQ9YShlKSl8fCJmdW5jdGlvbiI9PXR5cGVvZihuPWguY2FsbCh0LCJjb25zdHJ1Y3RvciIpJiZ0LmNvbnN0cnVjdG9yKSYmcC5jYWxsKG4pPT09Zyl9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oZSl7dmFyIHQ7Zm9yKHQgaW4gZSlyZXR1cm4hMTtyZXR1cm4hMH0sZ2xvYmFsRXZhbDpmdW5jdGlvbihlLHQsbil7dyhlLHtub25jZTp0JiZ0Lm5vbmNlfSxuKX0sZWFjaDpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MDtpZihFKGUpKWZvcihuPWUubGVuZ3RoO3I8biYmITEhPT10LmNhbGwoZVtyXSxyLGVbcl0pO3IrKyk7ZWxzZSBmb3IociBpbiBlKWlmKCExPT09dC5jYWxsKGVbcl0scixlW3JdKSlicmVhaztyZXR1cm4gZX0sbWFrZUFycmF5OmZ1bmN0aW9uKGUsdCl7dmFyIG49dHx8W107cmV0dXJuIG51bGwhPWUmJihFKE9iamVjdChlKSk/VC5tZXJnZShuLCJzdHJpbmciPT10eXBlb2YgZT9bZV06ZSk6bC5jYWxsKG4sZSkpLG59LGluQXJyYXk6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBudWxsPT10Py0xOmMuY2FsbCh0LGUsbil9LG1lcmdlOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPSt0Lmxlbmd0aCxyPTAsaT1lLmxlbmd0aDtyPG47cisrKWVbaSsrXT10W3JdO3JldHVybiBlLmxlbmd0aD1pLGV9LGdyZXA6ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj1bXSxpPTAsbz1lLmxlbmd0aCxhPSFuO2k8bztpKyspIXQoZVtpXSxpKSE9PWEmJnIucHVzaChlW2ldKTtyZXR1cm4gcn0sbWFwOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89MCxhPVtdO2lmKEUoZSkpZm9yKHI9ZS5sZW5ndGg7bzxyO28rKyludWxsIT0oaT10KGVbb10sbyxuKSkmJmEucHVzaChpKTtlbHNlIGZvcihvIGluIGUpbnVsbCE9KGk9dChlW29dLG8sbikpJiZhLnB1c2goaSk7cmV0dXJuIHUoYSl9LGd1aWQ6MSxzdXBwb3J0OnZ9KSwiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYoVC5mbltTeW1ib2wuaXRlcmF0b3JdPW9bU3ltYm9sLml0ZXJhdG9yXSksVC5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIFN5bWJvbCIuc3BsaXQoIiAiKSwoZnVuY3Rpb24oZSx0KXtmWyJbb2JqZWN0ICIrdCsiXSJdPXQudG9Mb3dlckNhc2UoKX0pKTt2YXIgQz1mdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLGEscyx1LGwsYyxmLGQsaCxwLGcsdixtLHksYixfPSJzaXp6bGUiKzEqbmV3IERhdGUsdz1lLmRvY3VtZW50LHg9MCxUPTAsRT11ZSgpLEM9dWUoKSxTPXVlKCksaz11ZSgpLEE9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT09PXQmJihmPSEwKSwwfSxOPXt9Lmhhc093blByb3BlcnR5LEQ9W10saj1ELnBvcCxPPUQucHVzaCxMPUQucHVzaCxJPUQuc2xpY2UsUj1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKylpZihlW25dPT09dClyZXR1cm4gbjtyZXR1cm4tMX0sUD0iY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWQiLCQ9IltcXHgyMFxcdFxcclxcblxcZl0iLEI9Iig/OlxcXFxbXFxkYS1mQS1GXXsxLDZ9IiskKyI/fFxcXFxbXlxcclxcblxcZl18W1xcdy1dfFteXDAtXFx4N2ZdKSsiLHE9IlxcWyIrJCsiKigiK0IrIikoPzoiKyQrIiooWypeJHwhfl0/PSkiKyQrIiooPzonKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcInwoIitCKyIpKXwpIiskKyIqXFxdIixNPSI6KCIrQisiKSg/OlxcKCgoJygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCIpfCgoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfCIrcSsiKSopfC4qKVxcKXwpIixIPW5ldyBSZWdFeHAoJCsiKyIsImciKSxGPW5ldyBSZWdFeHAoIl4iKyQrIit8KCg/Ol58W15cXFxcXSkoPzpcXFxcLikqKSIrJCsiKyQiLCJnIiksVz1uZXcgUmVnRXhwKCJeIiskKyIqLCIrJCsiKiIpLFU9bmV3IFJlZ0V4cCgiXiIrJCsiKihbPit+XXwiKyQrIikiKyQrIioiKSx6PW5ldyBSZWdFeHAoJCsifD4iKSxRPW5ldyBSZWdFeHAoTSksVj1uZXcgUmVnRXhwKCJeIitCKyIkIiksSz17SUQ6bmV3IFJlZ0V4cCgiXiMoIitCKyIpIiksQ0xBU1M6bmV3IFJlZ0V4cCgiXlxcLigiK0IrIikiKSxUQUc6bmV3IFJlZ0V4cCgiXigiK0IrInxbKl0pIiksQVRUUjpuZXcgUmVnRXhwKCJeIitxKSxQU0VVRE86bmV3IFJlZ0V4cCgiXiIrTSksQ0hJTEQ6bmV3IFJlZ0V4cCgiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIiskKyIqKGV2ZW58b2RkfCgoWystXXwpKFxcZCopbnwpIiskKyIqKD86KFsrLV18KSIrJCsiKihcXGQrKXwpKSIrJCsiKlxcKXwpIiwiaSIpLGJvb2w6bmV3IFJlZ0V4cCgiXig/OiIrUCsiKSQiLCJpIiksbmVlZHNDb250ZXh0Om5ldyBSZWdFeHAoIl4iKyQrIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcKCIrJCsiKigoPzotXFxkKT9cXGQqKSIrJCsiKlxcKXwpKD89W14tXXwkKSIsImkiKX0sWD0vSFRNTCQvaSxZPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksSj0vXmhcZCQvaSxHPS9eW157XStce1xzKlxbbmF0aXZlIFx3LyxaPS9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8sZWU9L1srfl0vLHRlPW5ldyBSZWdFeHAoIlxcXFxbXFxkYS1mQS1GXXsxLDZ9IiskKyI/fFxcXFwoW15cXHJcXG5cXGZdKSIsImciKSxuZT1mdW5jdGlvbihlLHQpe3ZhciBuPSIweCIrZS5zbGljZSgxKS02NTUzNjtyZXR1cm4gdHx8KG48MD9TdHJpbmcuZnJvbUNoYXJDb2RlKG4rNjU1MzYpOlN0cmluZy5mcm9tQ2hhckNvZGUobj4+MTB8NTUyOTYsMTAyMyZufDU2MzIwKSl9LHJlPS8oW1wwLVx4MWZceDdmXXxeLT9cZCl8Xi0kfFteXDAtXHgxZlx4N2YtXHVGRkZGXHctXS9nLGllPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/IlwwIj09PWU/Iu+/vSI6ZS5zbGljZSgwLC0xKSsiXFwiK2UuY2hhckNvZGVBdChlLmxlbmd0aC0xKS50b1N0cmluZygxNikrIiAiOiJcXCIrZX0sb2U9ZnVuY3Rpb24oKXtkKCl9LGFlPV9lKChmdW5jdGlvbihlKXtyZXR1cm4hMD09PWUuZGlzYWJsZWQmJiJmaWVsZHNldCI9PT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCl9KSx7ZGlyOiJwYXJlbnROb2RlIixuZXh0OiJsZWdlbmQifSk7dHJ5e0wuYXBwbHkoRD1JLmNhbGwody5jaGlsZE5vZGVzKSx3LmNoaWxkTm9kZXMpLERbdy5jaGlsZE5vZGVzLmxlbmd0aF0ubm9kZVR5cGV9Y2F0Y2goZSl7TD17YXBwbHk6RC5sZW5ndGg/ZnVuY3Rpb24oZSx0KXtPLmFwcGx5KGUsSS5jYWxsKHQpKX06ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49ZS5sZW5ndGgscj0wO2VbbisrXT10W3IrK107KTtlLmxlbmd0aD1uLTF9fX1mdW5jdGlvbiBzZShlLHQscixpKXt2YXIgbyxzLGwsYyxmLHAsbSx5PXQmJnQub3duZXJEb2N1bWVudCx3PXQ/dC5ub2RlVHlwZTo5O2lmKHI9cnx8W10sInN0cmluZyIhPXR5cGVvZiBlfHwhZXx8MSE9PXcmJjkhPT13JiYxMSE9PXcpcmV0dXJuIHI7aWYoIWkmJihkKHQpLHQ9dHx8aCxnKSl7aWYoMTEhPT13JiYoZj1aLmV4ZWMoZSkpKWlmKG89ZlsxXSl7aWYoOT09PXcpe2lmKCEobD10LmdldEVsZW1lbnRCeUlkKG8pKSlyZXR1cm4gcjtpZihsLmlkPT09bylyZXR1cm4gci5wdXNoKGwpLHJ9ZWxzZSBpZih5JiYobD15LmdldEVsZW1lbnRCeUlkKG8pKSYmYih0LGwpJiZsLmlkPT09bylyZXR1cm4gci5wdXNoKGwpLHJ9ZWxzZXtpZihmWzJdKXJldHVybiBMLmFwcGx5KHIsdC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSkscjtpZigobz1mWzNdKSYmbi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZ0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIEwuYXBwbHkocix0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUobykpLHJ9aWYobi5xc2EmJiFrW2UrIiAiXSYmKCF2fHwhdi50ZXN0KGUpKSYmKDEhPT13fHwib2JqZWN0IiE9PXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkpe2lmKG09ZSx5PXQsMT09PXcmJih6LnRlc3QoZSl8fFUudGVzdChlKSkpe2ZvcigoeT1lZS50ZXN0KGUpJiZtZSh0LnBhcmVudE5vZGUpfHx0KT09PXQmJm4uc2NvcGV8fCgoYz10LmdldEF0dHJpYnV0ZSgiaWQiKSk/Yz1jLnJlcGxhY2UocmUsaWUpOnQuc2V0QXR0cmlidXRlKCJpZCIsYz1fKSkscz0ocD1hKGUpKS5sZW5ndGg7cy0tOylwW3NdPShjPyIjIitjOiI6c2NvcGUiKSsiICIrYmUocFtzXSk7bT1wLmpvaW4oIiwiKX10cnl7cmV0dXJuIEwuYXBwbHkocix5LnF1ZXJ5U2VsZWN0b3JBbGwobSkpLHJ9Y2F0Y2godCl7ayhlLCEwKX1maW5hbGx5e2M9PT1fJiZ0LnJlbW92ZUF0dHJpYnV0ZSgiaWQiKX19fXJldHVybiB1KGUucmVwbGFjZShGLCIkMSIpLHQscixpKX1mdW5jdGlvbiB1ZSgpe3ZhciBlPVtdO3JldHVybiBmdW5jdGlvbiB0KG4saSl7cmV0dXJuIGUucHVzaChuKyIgIik+ci5jYWNoZUxlbmd0aCYmZGVsZXRlIHRbZS5zaGlmdCgpXSx0W24rIiAiXT1pfX1mdW5jdGlvbiBsZShlKXtyZXR1cm4gZVtfXT0hMCxlfWZ1bmN0aW9uIGNlKGUpe3ZhciB0PWguY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKTt0cnl7cmV0dXJuISFlKHQpfWNhdGNoKGUpe3JldHVybiExfWZpbmFsbHl7dC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCksdD1udWxsfX1mdW5jdGlvbiBmZShlLHQpe2Zvcih2YXIgbj1lLnNwbGl0KCJ8IiksaT1uLmxlbmd0aDtpLS07KXIuYXR0ckhhbmRsZVtuW2ldXT10fWZ1bmN0aW9uIGRlKGUsdCl7dmFyIG49dCYmZSxyPW4mJjE9PT1lLm5vZGVUeXBlJiYxPT09dC5ub2RlVHlwZSYmZS5zb3VyY2VJbmRleC10LnNvdXJjZUluZGV4O2lmKHIpcmV0dXJuIHI7aWYobilmb3IoO249bi5uZXh0U2libGluZzspaWYobj09PXQpcmV0dXJuLTE7cmV0dXJuIGU/MTotMX1mdW5jdGlvbiBoZShlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuImlucHV0Ij09PXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmdC50eXBlPT09ZX19ZnVuY3Rpb24gcGUoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oImlucHV0Ij09PW58fCJidXR0b24iPT09bikmJnQudHlwZT09PWV9fWZ1bmN0aW9uIGdlKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4iZm9ybSJpbiB0P3QucGFyZW50Tm9kZSYmITE9PT10LmRpc2FibGVkPyJsYWJlbCJpbiB0PyJsYWJlbCJpbiB0LnBhcmVudE5vZGU/dC5wYXJlbnROb2RlLmRpc2FibGVkPT09ZTp0LmRpc2FibGVkPT09ZTp0LmlzRGlzYWJsZWQ9PT1lfHx0LmlzRGlzYWJsZWQhPT0hZSYmYWUodCk9PT1lOnQuZGlzYWJsZWQ9PT1lOiJsYWJlbCJpbiB0JiZ0LmRpc2FibGVkPT09ZX19ZnVuY3Rpb24gdmUoZSl7cmV0dXJuIGxlKChmdW5jdGlvbih0KXtyZXR1cm4gdD0rdCxsZSgoZnVuY3Rpb24obixyKXtmb3IodmFyIGksbz1lKFtdLG4ubGVuZ3RoLHQpLGE9by5sZW5ndGg7YS0tOyluW2k9b1thXV0mJihuW2ldPSEocltpXT1uW2ldKSl9KSl9KSl9ZnVuY3Rpb24gbWUoZSl7cmV0dXJuIGUmJnZvaWQgMCE9PWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUmJmV9Zm9yKHQgaW4gbj1zZS5zdXBwb3J0PXt9LG89c2UuaXNYTUw9ZnVuY3Rpb24oZSl7dmFyIHQ9ZSYmZS5uYW1lc3BhY2VVUkksbj1lJiYoZS5vd25lckRvY3VtZW50fHxlKS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuIVgudGVzdCh0fHxuJiZuLm5vZGVOYW1lfHwiSFRNTCIpfSxkPXNlLnNldERvY3VtZW50PWZ1bmN0aW9uKGUpe3ZhciB0LGksYT1lP2Uub3duZXJEb2N1bWVudHx8ZTp3O3JldHVybiBhIT1oJiY5PT09YS5ub2RlVHlwZSYmYS5kb2N1bWVudEVsZW1lbnQ/KHA9KGg9YSkuZG9jdW1lbnRFbGVtZW50LGc9IW8oaCksdyE9aCYmKGk9aC5kZWZhdWx0VmlldykmJmkudG9wIT09aSYmKGkuYWRkRXZlbnRMaXN0ZW5lcj9pLmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsb2UsITEpOmkuYXR0YWNoRXZlbnQmJmkuYXR0YWNoRXZlbnQoIm9udW5sb2FkIixvZSkpLG4uc2NvcGU9Y2UoKGZ1bmN0aW9uKGUpe3JldHVybiBwLmFwcGVuZENoaWxkKGUpLmFwcGVuZENoaWxkKGguY3JlYXRlRWxlbWVudCgiZGl2IikpLHZvaWQgMCE9PWUucXVlcnlTZWxlY3RvckFsbCYmIWUucXVlcnlTZWxlY3RvckFsbCgiOnNjb3BlIGZpZWxkc2V0IGRpdiIpLmxlbmd0aH0pKSxuLmNzc0hhcz1jZSgoZnVuY3Rpb24oKXt0cnl7cmV0dXJuIGgucXVlcnlTZWxlY3RvcigiOmhhcygqLDpqcWZha2UpIiksITF9Y2F0Y2goZSl7cmV0dXJuITB9fSkpLG4uYXR0cmlidXRlcz1jZSgoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2xhc3NOYW1lPSJpIiwhZS5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpfSkpLG4uZ2V0RWxlbWVudHNCeVRhZ05hbWU9Y2UoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmFwcGVuZENoaWxkKGguY3JlYXRlQ29tbWVudCgiIikpLCFlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RofSkpLG4uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT1HLnRlc3QoaC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSxuLmdldEJ5SWQ9Y2UoKGZ1bmN0aW9uKGUpe3JldHVybiBwLmFwcGVuZENoaWxkKGUpLmlkPV8sIWguZ2V0RWxlbWVudHNCeU5hbWV8fCFoLmdldEVsZW1lbnRzQnlOYW1lKF8pLmxlbmd0aH0pKSxuLmdldEJ5SWQ/KHIuZmlsdGVyLklEPWZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZSh0ZSxuZSk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSgiaWQiKT09PXR9fSxyLmZpbmQuSUQ9ZnVuY3Rpb24oZSx0KXtpZih2b2lkIDAhPT10LmdldEVsZW1lbnRCeUlkJiZnKXt2YXIgbj10LmdldEVsZW1lbnRCeUlkKGUpO3JldHVybiBuP1tuXTpbXX19KTooci5maWx0ZXIuSUQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKHRlLG5lKTtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49dm9pZCAwIT09ZS5nZXRBdHRyaWJ1dGVOb2RlJiZlLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7cmV0dXJuIG4mJm4udmFsdWU9PT10fX0sci5maW5kLklEPWZ1bmN0aW9uKGUsdCl7aWYodm9pZCAwIT09dC5nZXRFbGVtZW50QnlJZCYmZyl7dmFyIG4scixpLG89dC5nZXRFbGVtZW50QnlJZChlKTtpZihvKXtpZigobj1vLmdldEF0dHJpYnV0ZU5vZGUoImlkIikpJiZuLnZhbHVlPT09ZSlyZXR1cm5bb107Zm9yKGk9dC5nZXRFbGVtZW50c0J5TmFtZShlKSxyPTA7bz1pW3IrK107KWlmKChuPW8uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKSkmJm4udmFsdWU9PT1lKXJldHVybltvXX1yZXR1cm5bXX19KSxyLmZpbmQuVEFHPW4uZ2V0RWxlbWVudHNCeVRhZ05hbWU/ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwIT09dC5nZXRFbGVtZW50c0J5VGFnTmFtZT90LmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpOm4ucXNhP3QucXVlcnlTZWxlY3RvckFsbChlKTp2b2lkIDB9OmZ1bmN0aW9uKGUsdCl7dmFyIG4scj1bXSxpPTAsbz10LmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpO2lmKCIqIj09PWUpe2Zvcig7bj1vW2krK107KTE9PT1uLm5vZGVUeXBlJiZyLnB1c2gobik7cmV0dXJuIHJ9cmV0dXJuIG99LHIuZmluZC5DTEFTUz1uLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmZ1bmN0aW9uKGUsdCl7aWYodm9pZCAwIT09dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZnKXJldHVybiB0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoZSl9LG09W10sdj1bXSwobi5xc2E9Ry50ZXN0KGgucXVlcnlTZWxlY3RvckFsbCkpJiYoY2UoKGZ1bmN0aW9uKGUpe3ZhciB0O3AuYXBwZW5kQ2hpbGQoZSkuaW5uZXJIVE1MPSI8YSBpZD0nIitfKyInPjwvYT48c2VsZWN0IGlkPSciK18rIi1cclxcJyBtc2FsbG93Y2FwdHVyZT0nJz48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PiIsZS5xdWVyeVNlbGVjdG9yQWxsKCJbbXNhbGxvd2NhcHR1cmVePScnXSIpLmxlbmd0aCYmdi5wdXNoKCJbKl4kXT0iKyQrIiooPzonJ3xcIlwiKSIpLGUucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aHx8di5wdXNoKCJcXFsiKyQrIiooPzp2YWx1ZXwiK1ArIikiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZH49IitfKyItXSIpLmxlbmd0aHx8di5wdXNoKCJ+PSIpLCh0PWguY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkuc2V0QXR0cmlidXRlKCJuYW1lIiwiIiksZS5hcHBlbmRDaGlsZCh0KSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIltuYW1lPScnXSIpLmxlbmd0aHx8di5wdXNoKCJcXFsiKyQrIipuYW1lIiskKyIqPSIrJCsiKig/OicnfFwiXCIpIiksZS5xdWVyeVNlbGVjdG9yQWxsKCI6Y2hlY2tlZCIpLmxlbmd0aHx8di5wdXNoKCI6Y2hlY2tlZCIpLGUucXVlcnlTZWxlY3RvckFsbCgiYSMiK18rIisqIikubGVuZ3RofHx2LnB1c2goIi4jLitbK35dIiksZS5xdWVyeVNlbGVjdG9yQWxsKCJcXFxmIiksdi5wdXNoKCJbXFxyXFxuXFxmXSIpfSkpLGNlKChmdW5jdGlvbihlKXtlLmlubmVySFRNTD0iPGEgaHJlZj0nJyBkaXNhYmxlZD0nZGlzYWJsZWQnPjwvYT48c2VsZWN0IGRpc2FibGVkPSdkaXNhYmxlZCc+PG9wdGlvbi8+PC9zZWxlY3Q+Ijt2YXIgdD1oLmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7dC5zZXRBdHRyaWJ1dGUoInR5cGUiLCJoaWRkZW4iKSxlLmFwcGVuZENoaWxkKHQpLnNldEF0dHJpYnV0ZSgibmFtZSIsIkQiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIltuYW1lPWRdIikubGVuZ3RoJiZ2LnB1c2goIm5hbWUiKyQrIipbKl4kfCF+XT89IiksMiE9PWUucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGgmJnYucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSxwLmFwcGVuZENoaWxkKGUpLmRpc2FibGVkPSEwLDIhPT1lLnF1ZXJ5U2VsZWN0b3JBbGwoIjpkaXNhYmxlZCIpLmxlbmd0aCYmdi5wdXNoKCI6ZW5hYmxlZCIsIjpkaXNhYmxlZCIpLGUucXVlcnlTZWxlY3RvckFsbCgiKiw6eCIpLHYucHVzaCgiLC4qOiIpfSkpKSwobi5tYXRjaGVzU2VsZWN0b3I9Ry50ZXN0KHk9cC5tYXRjaGVzfHxwLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8cC5tb3pNYXRjaGVzU2VsZWN0b3J8fHAub01hdGNoZXNTZWxlY3Rvcnx8cC5tc01hdGNoZXNTZWxlY3RvcikpJiZjZSgoZnVuY3Rpb24oZSl7bi5kaXNjb25uZWN0ZWRNYXRjaD15LmNhbGwoZSwiKiIpLHkuY2FsbChlLCJbcyE9JyddOngiKSxtLnB1c2goIiE9IixNKX0pKSxuLmNzc0hhc3x8di5wdXNoKCI6aGFzIiksdj12Lmxlbmd0aCYmbmV3IFJlZ0V4cCh2LmpvaW4oInwiKSksbT1tLmxlbmd0aCYmbmV3IFJlZ0V4cChtLmpvaW4oInwiKSksdD1HLnRlc3QocC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiksYj10fHxHLnRlc3QocC5jb250YWlucyk/ZnVuY3Rpb24oZSx0KXt2YXIgbj05PT09ZS5ub2RlVHlwZSYmZS5kb2N1bWVudEVsZW1lbnR8fGUscj10JiZ0LnBhcmVudE5vZGU7cmV0dXJuIGU9PT1yfHwhKCFyfHwxIT09ci5ub2RlVHlwZXx8IShuLmNvbnRhaW5zP24uY29udGFpbnMocik6ZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiYmMTYmZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihyKSkpfTpmdW5jdGlvbihlLHQpe2lmKHQpZm9yKDt0PXQucGFyZW50Tm9kZTspaWYodD09PWUpcmV0dXJuITA7cmV0dXJuITF9LEE9dD9mdW5jdGlvbihlLHQpe2lmKGU9PT10KXJldHVybiBmPSEwLDA7dmFyIHI9IWUuY29tcGFyZURvY3VtZW50UG9zaXRpb24tIXQuY29tcGFyZURvY3VtZW50UG9zaXRpb247cmV0dXJuIHJ8fCgxJihyPShlLm93bmVyRG9jdW1lbnR8fGUpPT0odC5vd25lckRvY3VtZW50fHx0KT9lLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHQpOjEpfHwhbi5zb3J0RGV0YWNoZWQmJnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZSk9PT1yP2U9PWh8fGUub3duZXJEb2N1bWVudD09dyYmYih3LGUpPy0xOnQ9PWh8fHQub3duZXJEb2N1bWVudD09dyYmYih3LHQpPzE6Yz9SKGMsZSktUihjLHQpOjA6NCZyPy0xOjEpfTpmdW5jdGlvbihlLHQpe2lmKGU9PT10KXJldHVybiBmPSEwLDA7dmFyIG4scj0wLGk9ZS5wYXJlbnROb2RlLG89dC5wYXJlbnROb2RlLGE9W2VdLHM9W3RdO2lmKCFpfHwhbylyZXR1cm4gZT09aD8tMTp0PT1oPzE6aT8tMTpvPzE6Yz9SKGMsZSktUihjLHQpOjA7aWYoaT09PW8pcmV0dXJuIGRlKGUsdCk7Zm9yKG49ZTtuPW4ucGFyZW50Tm9kZTspYS51bnNoaWZ0KG4pO2ZvcihuPXQ7bj1uLnBhcmVudE5vZGU7KXMudW5zaGlmdChuKTtmb3IoO2Fbcl09PT1zW3JdOylyKys7cmV0dXJuIHI/ZGUoYVtyXSxzW3JdKTphW3JdPT13Py0xOnNbcl09PXc/MTowfSxoKTpofSxzZS5tYXRjaGVzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHNlKGUsbnVsbCxudWxsLHQpfSxzZS5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oZSx0KXtpZihkKGUpLG4ubWF0Y2hlc1NlbGVjdG9yJiZnJiYha1t0KyIgIl0mJighbXx8IW0udGVzdCh0KSkmJighdnx8IXYudGVzdCh0KSkpdHJ5e3ZhciByPXkuY2FsbChlLHQpO2lmKHJ8fG4uZGlzY29ubmVjdGVkTWF0Y2h8fGUuZG9jdW1lbnQmJjExIT09ZS5kb2N1bWVudC5ub2RlVHlwZSlyZXR1cm4gcn1jYXRjaChlKXtrKHQsITApfXJldHVybiBzZSh0LGgsbnVsbCxbZV0pLmxlbmd0aD4wfSxzZS5jb250YWlucz1mdW5jdGlvbihlLHQpe3JldHVybihlLm93bmVyRG9jdW1lbnR8fGUpIT1oJiZkKGUpLGIoZSx0KX0sc2UuYXR0cj1mdW5jdGlvbihlLHQpeyhlLm93bmVyRG9jdW1lbnR8fGUpIT1oJiZkKGUpO3ZhciBpPXIuYXR0ckhhbmRsZVt0LnRvTG93ZXJDYXNlKCldLG89aSYmTi5jYWxsKHIuYXR0ckhhbmRsZSx0LnRvTG93ZXJDYXNlKCkpP2koZSx0LCFnKTp2b2lkIDA7cmV0dXJuIHZvaWQgMCE9PW8/bzpuLmF0dHJpYnV0ZXN8fCFnP2UuZ2V0QXR0cmlidXRlKHQpOihvPWUuZ2V0QXR0cmlidXRlTm9kZSh0KSkmJm8uc3BlY2lmaWVkP28udmFsdWU6bnVsbH0sc2UuZXNjYXBlPWZ1bmN0aW9uKGUpe3JldHVybihlKyIiKS5yZXBsYWNlKHJlLGllKX0sc2UuZXJyb3I9ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK2UpfSxzZS51bmlxdWVTb3J0PWZ1bmN0aW9uKGUpe3ZhciB0LHI9W10saT0wLG89MDtpZihmPSFuLmRldGVjdER1cGxpY2F0ZXMsYz0hbi5zb3J0U3RhYmxlJiZlLnNsaWNlKDApLGUuc29ydChBKSxmKXtmb3IoO3Q9ZVtvKytdOyl0PT09ZVtvXSYmKGk9ci5wdXNoKG8pKTtmb3IoO2ktLTspZS5zcGxpY2UocltpXSwxKX1yZXR1cm4gYz1udWxsLGV9LGk9c2UuZ2V0VGV4dD1mdW5jdGlvbihlKXt2YXIgdCxuPSIiLHI9MCxvPWUubm9kZVR5cGU7aWYobyl7aWYoMT09PW98fDk9PT1vfHwxMT09PW8pe2lmKCJzdHJpbmciPT10eXBlb2YgZS50ZXh0Q29udGVudClyZXR1cm4gZS50ZXh0Q29udGVudDtmb3IoZT1lLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpbis9aShlKX1lbHNlIGlmKDM9PT1vfHw0PT09bylyZXR1cm4gZS5ub2RlVmFsdWV9ZWxzZSBmb3IoO3Q9ZVtyKytdOyluKz1pKHQpO3JldHVybiBufSwocj1zZS5zZWxlY3RvcnM9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzpsZSxtYXRjaDpLLGF0dHJIYW5kbGU6e30sZmluZDp7fSxyZWxhdGl2ZTp7Ij4iOntkaXI6InBhcmVudE5vZGUiLGZpcnN0OiEwfSwiICI6e2RpcjoicGFyZW50Tm9kZSJ9LCIrIjp7ZGlyOiJwcmV2aW91c1NpYmxpbmciLGZpcnN0OiEwfSwifiI6e2RpcjoicHJldmlvdXNTaWJsaW5nIn19LHByZUZpbHRlcjp7QVRUUjpmdW5jdGlvbihlKXtyZXR1cm4gZVsxXT1lWzFdLnJlcGxhY2UodGUsbmUpLGVbM109KGVbM118fGVbNF18fGVbNV18fCIiKS5yZXBsYWNlKHRlLG5lKSwifj0iPT09ZVsyXSYmKGVbM109IiAiK2VbM10rIiAiKSxlLnNsaWNlKDAsNCl9LENISUxEOmZ1bmN0aW9uKGUpe3JldHVybiBlWzFdPWVbMV0udG9Mb3dlckNhc2UoKSwibnRoIj09PWVbMV0uc2xpY2UoMCwzKT8oZVszXXx8c2UuZXJyb3IoZVswXSksZVs0XT0rKGVbNF0/ZVs1XSsoZVs2XXx8MSk6MiooImV2ZW4iPT09ZVszXXx8Im9kZCI9PT1lWzNdKSksZVs1XT0rKGVbN10rZVs4XXx8Im9kZCI9PT1lWzNdKSk6ZVszXSYmc2UuZXJyb3IoZVswXSksZX0sUFNFVURPOmZ1bmN0aW9uKGUpe3ZhciB0LG49IWVbNl0mJmVbMl07cmV0dXJuIEsuQ0hJTEQudGVzdChlWzBdKT9udWxsOihlWzNdP2VbMl09ZVs0XXx8ZVs1XXx8IiI6biYmUS50ZXN0KG4pJiYodD1hKG4sITApKSYmKHQ9bi5pbmRleE9mKCIpIixuLmxlbmd0aC10KS1uLmxlbmd0aCkmJihlWzBdPWVbMF0uc2xpY2UoMCx0KSxlWzJdPW4uc2xpY2UoMCx0KSksZS5zbGljZSgwLDMpKX19LGZpbHRlcjp7VEFHOmZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZSh0ZSxuZSkudG9Mb3dlckNhc2UoKTtyZXR1cm4iKiI9PT1lP2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKGUpe3JldHVybiBlLm5vZGVOYW1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT10fX0sQ0xBU1M6ZnVuY3Rpb24oZSl7dmFyIHQ9RVtlKyIgIl07cmV0dXJuIHR8fCh0PW5ldyBSZWdFeHAoIihefCIrJCsiKSIrZSsiKCIrJCsifCQpIikpJiZFKGUsKGZ1bmN0aW9uKGUpe3JldHVybiB0LnRlc3QoInN0cmluZyI9PXR5cGVvZiBlLmNsYXNzTmFtZSYmZS5jbGFzc05hbWV8fHZvaWQgMCE9PWUuZ2V0QXR0cmlidXRlJiZlLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpfSkpfSxBVFRSOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24ocil7dmFyIGk9c2UuYXR0cihyLGUpO3JldHVybiBudWxsPT1pPyIhPSI9PT10OiF0fHwoaSs9IiIsIj0iPT09dD9pPT09bjoiIT0iPT09dD9pIT09bjoiXj0iPT09dD9uJiYwPT09aS5pbmRleE9mKG4pOiIqPSI9PT10P24mJmkuaW5kZXhPZihuKT4tMToiJD0iPT09dD9uJiZpLnNsaWNlKC1uLmxlbmd0aCk9PT1uOiJ+PSI9PT10PygiICIraS5yZXBsYWNlKEgsIiAiKSsiICIpLmluZGV4T2Yobik+LTE6Inw9Ij09PXQmJihpPT09bnx8aS5zbGljZSgwLG4ubGVuZ3RoKzEpPT09bisiLSIpKX19LENISUxEOmZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG89Im50aCIhPT1lLnNsaWNlKDAsMyksYT0ibGFzdCIhPT1lLnNsaWNlKC00KSxzPSJvZi10eXBlIj09PXQ7cmV0dXJuIDE9PT1yJiYwPT09aT9mdW5jdGlvbihlKXtyZXR1cm4hIWUucGFyZW50Tm9kZX06ZnVuY3Rpb24odCxuLHUpe3ZhciBsLGMsZixkLGgscCxnPW8hPT1hPyJuZXh0U2libGluZyI6InByZXZpb3VzU2libGluZyIsdj10LnBhcmVudE5vZGUsbT1zJiZ0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkseT0hdSYmIXMsYj0hMTtpZih2KXtpZihvKXtmb3IoO2c7KXtmb3IoZD10O2Q9ZFtnXTspaWYocz9kLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1tOjE9PT1kLm5vZGVUeXBlKXJldHVybiExO3A9Zz0ib25seSI9PT1lJiYhcCYmIm5leHRTaWJsaW5nIn1yZXR1cm4hMH1pZihwPVthP3YuZmlyc3RDaGlsZDp2Lmxhc3RDaGlsZF0sYSYmeSl7Zm9yKGI9KGg9KGw9KGM9KGY9KGQ9dilbX118fChkW19dPXt9KSlbZC51bmlxdWVJRF18fChmW2QudW5pcXVlSURdPXt9KSlbZV18fFtdKVswXT09PXgmJmxbMV0pJiZsWzJdLGQ9aCYmdi5jaGlsZE5vZGVzW2hdO2Q9KytoJiZkJiZkW2ddfHwoYj1oPTApfHxwLnBvcCgpOylpZigxPT09ZC5ub2RlVHlwZSYmKytiJiZkPT09dCl7Y1tlXT1beCxoLGJdO2JyZWFrfX1lbHNlIGlmKHkmJihiPWg9KGw9KGM9KGY9KGQ9dClbX118fChkW19dPXt9KSlbZC51bmlxdWVJRF18fChmW2QudW5pcXVlSURdPXt9KSlbZV18fFtdKVswXT09PXgmJmxbMV0pLCExPT09Yilmb3IoOyhkPSsraCYmZCYmZFtnXXx8KGI9aD0wKXx8cC5wb3AoKSkmJigocz9kLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkhPT1tOjEhPT1kLm5vZGVUeXBlKXx8ISsrYnx8KHkmJigoYz0oZj1kW19dfHwoZFtfXT17fSkpW2QudW5pcXVlSURdfHwoZltkLnVuaXF1ZUlEXT17fSkpW2VdPVt4LGJdKSxkIT09dCkpOyk7cmV0dXJuKGItPWkpPT09cnx8YiVyPT0wJiZiL3I+PTB9fX0sUFNFVURPOmZ1bmN0aW9uKGUsdCl7dmFyIG4saT1yLnBzZXVkb3NbZV18fHIuc2V0RmlsdGVyc1tlLnRvTG93ZXJDYXNlKCldfHxzZS5lcnJvcigidW5zdXBwb3J0ZWQgcHNldWRvOiAiK2UpO3JldHVybiBpW19dP2kodCk6aS5sZW5ndGg+MT8obj1bZSxlLCIiLHRdLHIuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eShlLnRvTG93ZXJDYXNlKCkpP2xlKChmdW5jdGlvbihlLG4pe2Zvcih2YXIgcixvPWkoZSx0KSxhPW8ubGVuZ3RoO2EtLTspZVtyPVIoZSxvW2FdKV09IShuW3JdPW9bYV0pfSkpOmZ1bmN0aW9uKGUpe3JldHVybiBpKGUsMCxuKX0pOml9fSxwc2V1ZG9zOntub3Q6bGUoKGZ1bmN0aW9uKGUpe3ZhciB0PVtdLG49W10scj1zKGUucmVwbGFjZShGLCIkMSIpKTtyZXR1cm4gcltfXT9sZSgoZnVuY3Rpb24oZSx0LG4saSl7Zm9yKHZhciBvLGE9cihlLG51bGwsaSxbXSkscz1lLmxlbmd0aDtzLS07KShvPWFbc10pJiYoZVtzXT0hKHRbc109bykpfSkpOmZ1bmN0aW9uKGUsaSxvKXtyZXR1cm4gdFswXT1lLHIodCxudWxsLG8sbiksdFswXT1udWxsLCFuLnBvcCgpfX0pKSxoYXM6bGUoKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gc2UoZSx0KS5sZW5ndGg+MH19KSksY29udGFpbnM6bGUoKGZ1bmN0aW9uKGUpe3JldHVybiBlPWUucmVwbGFjZSh0ZSxuZSksZnVuY3Rpb24odCl7cmV0dXJuKHQudGV4dENvbnRlbnR8fGkodCkpLmluZGV4T2YoZSk+LTF9fSkpLGxhbmc6bGUoKGZ1bmN0aW9uKGUpe3JldHVybiBWLnRlc3QoZXx8IiIpfHxzZS5lcnJvcigidW5zdXBwb3J0ZWQgbGFuZzogIitlKSxlPWUucmVwbGFjZSh0ZSxuZSkudG9Mb3dlckNhc2UoKSxmdW5jdGlvbih0KXt2YXIgbjtkb3tpZihuPWc/dC5sYW5nOnQuZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpfHx0LmdldEF0dHJpYnV0ZSgibGFuZyIpKXJldHVybihuPW4udG9Mb3dlckNhc2UoKSk9PT1lfHwwPT09bi5pbmRleE9mKGUrIi0iKX13aGlsZSgodD10LnBhcmVudE5vZGUpJiYxPT09dC5ub2RlVHlwZSk7cmV0dXJuITF9fSkpLHRhcmdldDpmdW5jdGlvbih0KXt2YXIgbj1lLmxvY2F0aW9uJiZlLmxvY2F0aW9uLmhhc2g7cmV0dXJuIG4mJm4uc2xpY2UoMSk9PT10LmlkfSxyb290OmZ1bmN0aW9uKGUpe3JldHVybiBlPT09cH0sZm9jdXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1oLmFjdGl2ZUVsZW1lbnQmJighaC5oYXNGb2N1c3x8aC5oYXNGb2N1cygpKSYmISEoZS50eXBlfHxlLmhyZWZ8fH5lLnRhYkluZGV4KX0sZW5hYmxlZDpnZSghMSksZGlzYWJsZWQ6Z2UoITApLGNoZWNrZWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT10JiYhIWUuY2hlY2tlZHx8Im9wdGlvbiI9PT10JiYhIWUuc2VsZWN0ZWR9LHNlbGVjdGVkOmZ1bmN0aW9uKGUpe3JldHVybiBlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LCEwPT09ZS5zZWxlY3RlZH0sZW1wdHk6ZnVuY3Rpb24oZSl7Zm9yKGU9ZS5maXJzdENoaWxkO2U7ZT1lLm5leHRTaWJsaW5nKWlmKGUubm9kZVR5cGU8NilyZXR1cm4hMTtyZXR1cm4hMH0scGFyZW50OmZ1bmN0aW9uKGUpe3JldHVybiFyLnBzZXVkb3MuZW1wdHkoZSl9LGhlYWRlcjpmdW5jdGlvbihlKXtyZXR1cm4gSi50ZXN0KGUubm9kZU5hbWUpfSxpbnB1dDpmdW5jdGlvbihlKXtyZXR1cm4gWS50ZXN0KGUubm9kZU5hbWUpfSxidXR0b246ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT10JiYiYnV0dG9uIj09PWUudHlwZXx8ImJ1dHRvbiI9PT10fSx0ZXh0OmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiJpbnB1dCI9PT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJiJ0ZXh0Ij09PWUudHlwZSYmKG51bGw9PSh0PWUuZ2V0QXR0cmlidXRlKCJ0eXBlIikpfHwidGV4dCI9PT10LnRvTG93ZXJDYXNlKCkpfSxmaXJzdDp2ZSgoZnVuY3Rpb24oKXtyZXR1cm5bMF19KSksbGFzdDp2ZSgoZnVuY3Rpb24oZSx0KXtyZXR1cm5bdC0xXX0pKSxlcTp2ZSgoZnVuY3Rpb24oZSx0LG4pe3JldHVybltuPDA/bit0Om5dfSkpLGV2ZW46dmUoKGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTA7bjx0O24rPTIpZS5wdXNoKG4pO3JldHVybiBlfSkpLG9kZDp2ZSgoZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MTtuPHQ7bis9MillLnB1c2gobik7cmV0dXJuIGV9KSksbHQ6dmUoKGZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9bjwwP24rdDpuPnQ/dDpuOy0tcj49MDspZS5wdXNoKHIpO3JldHVybiBlfSkpLGd0OnZlKChmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPW48MD9uK3Q6bjsrK3I8dDspZS5wdXNoKHIpO3JldHVybiBlfSkpfX0pLnBzZXVkb3MubnRoPXIucHNldWRvcy5lcSx7cmFkaW86ITAsY2hlY2tib3g6ITAsZmlsZTohMCxwYXNzd29yZDohMCxpbWFnZTohMH0pci5wc2V1ZG9zW3RdPWhlKHQpO2Zvcih0IGlue3N1Ym1pdDohMCxyZXNldDohMH0pci5wc2V1ZG9zW3RdPXBlKHQpO2Z1bmN0aW9uIHllKCl7fWZ1bmN0aW9uIGJlKGUpe2Zvcih2YXIgdD0wLG49ZS5sZW5ndGgscj0iIjt0PG47dCsrKXIrPWVbdF0udmFsdWU7cmV0dXJuIHJ9ZnVuY3Rpb24gX2UoZSx0LG4pe3ZhciByPXQuZGlyLGk9dC5uZXh0LG89aXx8cixhPW4mJiJwYXJlbnROb2RlIj09PW8scz1UKys7cmV0dXJuIHQuZmlyc3Q/ZnVuY3Rpb24odCxuLGkpe2Zvcig7dD10W3JdOylpZigxPT09dC5ub2RlVHlwZXx8YSlyZXR1cm4gZSh0LG4saSk7cmV0dXJuITF9OmZ1bmN0aW9uKHQsbix1KXt2YXIgbCxjLGYsZD1beCxzXTtpZih1KXtmb3IoO3Q9dFtyXTspaWYoKDE9PT10Lm5vZGVUeXBlfHxhKSYmZSh0LG4sdSkpcmV0dXJuITB9ZWxzZSBmb3IoO3Q9dFtyXTspaWYoMT09PXQubm9kZVR5cGV8fGEpaWYoYz0oZj10W19dfHwodFtfXT17fSkpW3QudW5pcXVlSURdfHwoZlt0LnVuaXF1ZUlEXT17fSksaSYmaT09PXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSl0PXRbcl18fHQ7ZWxzZXtpZigobD1jW29dKSYmbFswXT09PXgmJmxbMV09PT1zKXJldHVybiBkWzJdPWxbMl07aWYoY1tvXT1kLGRbMl09ZSh0LG4sdSkpcmV0dXJuITB9cmV0dXJuITF9fWZ1bmN0aW9uIHdlKGUpe3JldHVybiBlLmxlbmd0aD4xP2Z1bmN0aW9uKHQsbixyKXtmb3IodmFyIGk9ZS5sZW5ndGg7aS0tOylpZighZVtpXSh0LG4scikpcmV0dXJuITE7cmV0dXJuITB9OmVbMF19ZnVuY3Rpb24geGUoZSx0LG4scixpKXtmb3IodmFyIG8sYT1bXSxzPTAsdT1lLmxlbmd0aCxsPW51bGwhPXQ7czx1O3MrKykobz1lW3NdKSYmKG4mJiFuKG8scixpKXx8KGEucHVzaChvKSxsJiZ0LnB1c2gocykpKTtyZXR1cm4gYX1mdW5jdGlvbiBUZShlLHQsbixyLGksbyl7cmV0dXJuIHImJiFyW19dJiYocj1UZShyKSksaSYmIWlbX10mJihpPVRlKGksbykpLGxlKChmdW5jdGlvbihvLGEscyx1KXt2YXIgbCxjLGYsZD1bXSxoPVtdLHA9YS5sZW5ndGgsZz1vfHxmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPTAsaT10Lmxlbmd0aDtyPGk7cisrKXNlKGUsdFtyXSxuKTtyZXR1cm4gbn0odHx8IioiLHMubm9kZVR5cGU/W3NdOnMsW10pLHY9IWV8fCFvJiZ0P2c6eGUoZyxkLGUscyx1KSxtPW4/aXx8KG8/ZTpwfHxyKT9bXTphOnY7aWYobiYmbih2LG0scyx1KSxyKWZvcihsPXhlKG0saCkscihsLFtdLHMsdSksYz1sLmxlbmd0aDtjLS07KShmPWxbY10pJiYobVtoW2NdXT0hKHZbaFtjXV09ZikpO2lmKG8pe2lmKGl8fGUpe2lmKGkpe2ZvcihsPVtdLGM9bS5sZW5ndGg7Yy0tOykoZj1tW2NdKSYmbC5wdXNoKHZbY109Zik7aShudWxsLG09W10sbCx1KX1mb3IoYz1tLmxlbmd0aDtjLS07KShmPW1bY10pJiYobD1pP1IobyxmKTpkW2NdKT4tMSYmKG9bbF09IShhW2xdPWYpKX19ZWxzZSBtPXhlKG09PT1hP20uc3BsaWNlKHAsbS5sZW5ndGgpOm0pLGk/aShudWxsLGEsbSx1KTpMLmFwcGx5KGEsbSl9KSl9ZnVuY3Rpb24gRWUoZSl7Zm9yKHZhciB0LG4saSxvPWUubGVuZ3RoLGE9ci5yZWxhdGl2ZVtlWzBdLnR5cGVdLHM9YXx8ci5yZWxhdGl2ZVsiICJdLHU9YT8xOjAsYz1fZSgoZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10fSkscywhMCksZj1fZSgoZnVuY3Rpb24oZSl7cmV0dXJuIFIodCxlKT4tMX0pLHMsITApLGQ9W2Z1bmN0aW9uKGUsbixyKXt2YXIgaT0hYSYmKHJ8fG4hPT1sKXx8KCh0PW4pLm5vZGVUeXBlP2MoZSxuLHIpOmYoZSxuLHIpKTtyZXR1cm4gdD1udWxsLGl9XTt1PG87dSsrKWlmKG49ci5yZWxhdGl2ZVtlW3VdLnR5cGVdKWQ9W19lKHdlKGQpLG4pXTtlbHNle2lmKChuPXIuZmlsdGVyW2VbdV0udHlwZV0uYXBwbHkobnVsbCxlW3VdLm1hdGNoZXMpKVtfXSl7Zm9yKGk9Kyt1O2k8byYmIXIucmVsYXRpdmVbZVtpXS50eXBlXTtpKyspO3JldHVybiBUZSh1PjEmJndlKGQpLHU+MSYmYmUoZS5zbGljZSgwLHUtMSkuY29uY2F0KHt2YWx1ZToiICI9PT1lW3UtMl0udHlwZT8iKiI6IiJ9KSkucmVwbGFjZShGLCIkMSIpLG4sdTxpJiZFZShlLnNsaWNlKHUsaSkpLGk8byYmRWUoZT1lLnNsaWNlKGkpKSxpPG8mJmJlKGUpKX1kLnB1c2gobil9cmV0dXJuIHdlKGQpfXJldHVybiB5ZS5wcm90b3R5cGU9ci5maWx0ZXJzPXIucHNldWRvcyxyLnNldEZpbHRlcnM9bmV3IHllLGE9c2UudG9rZW5pemU9ZnVuY3Rpb24oZSx0KXt2YXIgbixpLG8sYSxzLHUsbCxjPUNbZSsiICJdO2lmKGMpcmV0dXJuIHQ/MDpjLnNsaWNlKDApO2ZvcihzPWUsdT1bXSxsPXIucHJlRmlsdGVyO3M7KXtmb3IoYSBpbiBuJiYhKGk9Vy5leGVjKHMpKXx8KGkmJihzPXMuc2xpY2UoaVswXS5sZW5ndGgpfHxzKSx1LnB1c2gobz1bXSkpLG49ITEsKGk9VS5leGVjKHMpKSYmKG49aS5zaGlmdCgpLG8ucHVzaCh7dmFsdWU6bix0eXBlOmlbMF0ucmVwbGFjZShGLCIgIil9KSxzPXMuc2xpY2Uobi5sZW5ndGgpKSxyLmZpbHRlcikhKGk9S1thXS5leGVjKHMpKXx8bFthXSYmIShpPWxbYV0oaSkpfHwobj1pLnNoaWZ0KCksby5wdXNoKHt2YWx1ZTpuLHR5cGU6YSxtYXRjaGVzOml9KSxzPXMuc2xpY2Uobi5sZW5ndGgpKTtpZighbilicmVha31yZXR1cm4gdD9zLmxlbmd0aDpzP3NlLmVycm9yKGUpOkMoZSx1KS5zbGljZSgwKX0scz1zZS5jb21waWxlPWZ1bmN0aW9uKGUsdCl7dmFyIG4saT1bXSxvPVtdLHM9U1tlKyIgIl07aWYoIXMpe2Zvcih0fHwodD1hKGUpKSxuPXQubGVuZ3RoO24tLTspKHM9RWUodFtuXSkpW19dP2kucHVzaChzKTpvLnB1c2gocyk7KHM9UyhlLGZ1bmN0aW9uKGUsdCl7dmFyIG49dC5sZW5ndGg+MCxpPWUubGVuZ3RoPjAsbz1mdW5jdGlvbihvLGEscyx1LGMpe3ZhciBmLHAsdixtPTAseT0iMCIsYj1vJiZbXSxfPVtdLHc9bCxUPW98fGkmJnIuZmluZC5UQUcoIioiLGMpLEU9eCs9bnVsbD09dz8xOk1hdGgucmFuZG9tKCl8fC4xLEM9VC5sZW5ndGg7Zm9yKGMmJihsPWE9PWh8fGF8fGMpO3khPT1DJiZudWxsIT0oZj1UW3ldKTt5Kyspe2lmKGkmJmYpe2ZvcihwPTAsYXx8Zi5vd25lckRvY3VtZW50PT1ofHwoZChmKSxzPSFnKTt2PWVbcCsrXTspaWYodihmLGF8fGgscykpe3UucHVzaChmKTticmVha31jJiYoeD1FKX1uJiYoKGY9IXYmJmYpJiZtLS0sbyYmYi5wdXNoKGYpKX1pZihtKz15LG4mJnkhPT1tKXtmb3IocD0wO3Y9dFtwKytdOyl2KGIsXyxhLHMpO2lmKG8pe2lmKG0+MClmb3IoO3ktLTspYlt5XXx8X1t5XXx8KF9beV09ai5jYWxsKHUpKTtfPXhlKF8pfUwuYXBwbHkodSxfKSxjJiYhbyYmXy5sZW5ndGg+MCYmbSt0Lmxlbmd0aD4xJiZzZS51bmlxdWVTb3J0KHUpfXJldHVybiBjJiYoeD1FLGw9dyksYn07cmV0dXJuIG4/bGUobyk6b30obyxpKSkpLnNlbGVjdG9yPWV9cmV0dXJuIHN9LHU9c2Uuc2VsZWN0PWZ1bmN0aW9uKGUsdCxuLGkpe3ZhciBvLHUsbCxjLGYsZD0iZnVuY3Rpb24iPT10eXBlb2YgZSYmZSxoPSFpJiZhKGU9ZC5zZWxlY3Rvcnx8ZSk7aWYobj1ufHxbXSwxPT09aC5sZW5ndGgpe2lmKCh1PWhbMF09aFswXS5zbGljZSgwKSkubGVuZ3RoPjImJiJJRCI9PT0obD11WzBdKS50eXBlJiY5PT09dC5ub2RlVHlwZSYmZyYmci5yZWxhdGl2ZVt1WzFdLnR5cGVdKXtpZighKHQ9KHIuZmluZC5JRChsLm1hdGNoZXNbMF0ucmVwbGFjZSh0ZSxuZSksdCl8fFtdKVswXSkpcmV0dXJuIG47ZCYmKHQ9dC5wYXJlbnROb2RlKSxlPWUuc2xpY2UodS5zaGlmdCgpLnZhbHVlLmxlbmd0aCl9Zm9yKG89Sy5uZWVkc0NvbnRleHQudGVzdChlKT8wOnUubGVuZ3RoO28tLSYmKGw9dVtvXSwhci5yZWxhdGl2ZVtjPWwudHlwZV0pOylpZigoZj1yLmZpbmRbY10pJiYoaT1mKGwubWF0Y2hlc1swXS5yZXBsYWNlKHRlLG5lKSxlZS50ZXN0KHVbMF0udHlwZSkmJm1lKHQucGFyZW50Tm9kZSl8fHQpKSl7aWYodS5zcGxpY2UobywxKSwhKGU9aS5sZW5ndGgmJmJlKHUpKSlyZXR1cm4gTC5hcHBseShuLGkpLG47YnJlYWt9fXJldHVybihkfHxzKGUsaCkpKGksdCwhZyxuLCF0fHxlZS50ZXN0KGUpJiZtZSh0LnBhcmVudE5vZGUpfHx0KSxufSxuLnNvcnRTdGFibGU9Xy5zcGxpdCgiIikuc29ydChBKS5qb2luKCIiKT09PV8sbi5kZXRlY3REdXBsaWNhdGVzPSEhZixkKCksbi5zb3J0RGV0YWNoZWQ9Y2UoKGZ1bmN0aW9uKGUpe3JldHVybiAxJmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24oaC5jcmVhdGVFbGVtZW50KCJmaWVsZHNldCIpKX0pKSxjZSgoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5uZXJIVE1MPSI8YSBocmVmPScjJz48L2E+IiwiIyI9PT1lLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIil9KSl8fGZlKCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoIiwoZnVuY3Rpb24oZSx0LG4pe2lmKCFuKXJldHVybiBlLmdldEF0dHJpYnV0ZSh0LCJ0eXBlIj09PXQudG9Mb3dlckNhc2UoKT8xOjIpfSkpLG4uYXR0cmlidXRlcyYmY2UoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlubmVySFRNTD0iPGlucHV0Lz4iLGUuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIiksIiI9PT1lLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpfSkpfHxmZSgidmFsdWUiLChmdW5jdGlvbihlLHQsbil7aWYoIW4mJiJpbnB1dCI9PT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIGUuZGVmYXVsdFZhbHVlfSkpLGNlKChmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZS5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIil9KSl8fGZlKFAsKGZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtpZighbilyZXR1cm4hMD09PWVbdF0/dC50b0xvd2VyQ2FzZSgpOihyPWUuZ2V0QXR0cmlidXRlTm9kZSh0KSkmJnIuc3BlY2lmaWVkP3IudmFsdWU6bnVsbH0pKSxzZX0obik7VC5maW5kPUMsVC5leHByPUMuc2VsZWN0b3JzLFQuZXhwclsiOiJdPVQuZXhwci5wc2V1ZG9zLFQudW5pcXVlU29ydD1ULnVuaXF1ZT1DLnVuaXF1ZVNvcnQsVC50ZXh0PUMuZ2V0VGV4dCxULmlzWE1MRG9jPUMuaXNYTUwsVC5jb250YWlucz1DLmNvbnRhaW5zLFQuZXNjYXBlU2VsZWN0b3I9Qy5lc2NhcGU7dmFyIFM9ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj1bXSxpPXZvaWQgMCE9PW47KGU9ZVt0XSkmJjkhPT1lLm5vZGVUeXBlOylpZigxPT09ZS5ub2RlVHlwZSl7aWYoaSYmVChlKS5pcyhuKSlicmVhaztyLnB1c2goZSl9cmV0dXJuIHJ9LGs9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49W107ZTtlPWUubmV4dFNpYmxpbmcpMT09PWUubm9kZVR5cGUmJmUhPT10JiZuLnB1c2goZSk7cmV0dXJuIG59LEE9VC5leHByLm1hdGNoLm5lZWRzQ29udGV4dDtmdW5jdGlvbiBOKGUsdCl7cmV0dXJuIGUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXQudG9Mb3dlckNhc2UoKX12YXIgRD0vXjwoW2Etel1bXlwvXDA+Olx4MjBcdFxyXG5cZl0qKVtceDIwXHRcclxuXGZdKlwvPz4oPzo8XC9cMT58KSQvaTtmdW5jdGlvbiBqKGUsdCxuKXtyZXR1cm4gbSh0KT9ULmdyZXAoZSwoZnVuY3Rpb24oZSxyKXtyZXR1cm4hIXQuY2FsbChlLHIsZSkhPT1ufSkpOnQubm9kZVR5cGU/VC5ncmVwKGUsKGZ1bmN0aW9uKGUpe3JldHVybiBlPT09dCE9PW59KSk6InN0cmluZyIhPXR5cGVvZiB0P1QuZ3JlcChlLChmdW5jdGlvbihlKXtyZXR1cm4gYy5jYWxsKHQsZSk+LTEhPT1ufSkpOlQuZmlsdGVyKHQsZSxuKX1ULmZpbHRlcj1mdW5jdGlvbihlLHQsbil7dmFyIHI9dFswXTtyZXR1cm4gbiYmKGU9Ijpub3QoIitlKyIpIiksMT09PXQubGVuZ3RoJiYxPT09ci5ub2RlVHlwZT9ULmZpbmQubWF0Y2hlc1NlbGVjdG9yKHIsZSk/W3JdOltdOlQuZmluZC5tYXRjaGVzKGUsVC5ncmVwKHQsKGZ1bmN0aW9uKGUpe3JldHVybiAxPT09ZS5ub2RlVHlwZX0pKSl9LFQuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj10aGlzLmxlbmd0aCxpPXRoaXM7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiB0aGlzLnB1c2hTdGFjayhUKGUpLmZpbHRlcigoZnVuY3Rpb24oKXtmb3IodD0wO3Q8cjt0KyspaWYoVC5jb250YWlucyhpW3RdLHRoaXMpKXJldHVybiEwfSkpKTtmb3Iobj10aGlzLnB1c2hTdGFjayhbXSksdD0wO3Q8cjt0KyspVC5maW5kKGUsaVt0XSxuKTtyZXR1cm4gcj4xP1QudW5pcXVlU29ydChuKTpufSxmaWx0ZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGoodGhpcyxlfHxbXSwhMSkpfSxub3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGoodGhpcyxlfHxbXSwhMCkpfSxpczpmdW5jdGlvbihlKXtyZXR1cm4hIWoodGhpcywic3RyaW5nIj09dHlwZW9mIGUmJkEudGVzdChlKT9UKGUpOmV8fFtdLCExKS5sZW5ndGh9fSk7dmFyIE8sTD0vXig/OlxzKig8W1x3XFddKz4pW14+XSp8IyhbXHctXSspKSQvOyhULmZuLmluaXQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGk7aWYoIWUpcmV0dXJuIHRoaXM7aWYobj1ufHxPLCJzdHJpbmciPT10eXBlb2YgZSl7aWYoIShyPSI8Ij09PWVbMF0mJiI+Ij09PWVbZS5sZW5ndGgtMV0mJmUubGVuZ3RoPj0zP1tudWxsLGUsbnVsbF06TC5leGVjKGUpKXx8IXJbMV0mJnQpcmV0dXJuIXR8fHQuanF1ZXJ5Pyh0fHxuKS5maW5kKGUpOnRoaXMuY29uc3RydWN0b3IodCkuZmluZChlKTtpZihyWzFdKXtpZih0PXQgaW5zdGFuY2VvZiBUP3RbMF06dCxULm1lcmdlKHRoaXMsVC5wYXJzZUhUTUwoclsxXSx0JiZ0Lm5vZGVUeXBlP3Qub3duZXJEb2N1bWVudHx8dDpiLCEwKSksRC50ZXN0KHJbMV0pJiZULmlzUGxhaW5PYmplY3QodCkpZm9yKHIgaW4gdCltKHRoaXNbcl0pP3RoaXNbcl0odFtyXSk6dGhpcy5hdHRyKHIsdFtyXSk7cmV0dXJuIHRoaXN9cmV0dXJuKGk9Yi5nZXRFbGVtZW50QnlJZChyWzJdKSkmJih0aGlzWzBdPWksdGhpcy5sZW5ndGg9MSksdGhpc31yZXR1cm4gZS5ub2RlVHlwZT8odGhpc1swXT1lLHRoaXMubGVuZ3RoPTEsdGhpcyk6bShlKT92b2lkIDAhPT1uLnJlYWR5P24ucmVhZHkoZSk6ZShUKTpULm1ha2VBcnJheShlLHRoaXMpfSkucHJvdG90eXBlPVQuZm4sTz1UKGIpO3ZhciBJPS9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLFI9e2NoaWxkcmVuOiEwLGNvbnRlbnRzOiEwLG5leHQ6ITAscHJldjohMH07ZnVuY3Rpb24gUChlLHQpe2Zvcig7KGU9ZVt0XSkmJjEhPT1lLm5vZGVUeXBlOyk7cmV0dXJuIGV9VC5mbi5leHRlbmQoe2hhczpmdW5jdGlvbihlKXt2YXIgdD1UKGUsdGhpcyksbj10Lmxlbmd0aDtyZXR1cm4gdGhpcy5maWx0ZXIoKGZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTxuO2UrKylpZihULmNvbnRhaW5zKHRoaXMsdFtlXSkpcmV0dXJuITB9KSl9LGNsb3Nlc3Q6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTAsaT10aGlzLmxlbmd0aCxvPVtdLGE9InN0cmluZyIhPXR5cGVvZiBlJiZUKGUpO2lmKCFBLnRlc3QoZSkpZm9yKDtyPGk7cisrKWZvcihuPXRoaXNbcl07biYmbiE9PXQ7bj1uLnBhcmVudE5vZGUpaWYobi5ub2RlVHlwZTwxMSYmKGE/YS5pbmRleChuKT4tMToxPT09bi5ub2RlVHlwZSYmVC5maW5kLm1hdGNoZXNTZWxlY3RvcihuLGUpKSl7by5wdXNoKG4pO2JyZWFrfXJldHVybiB0aGlzLnB1c2hTdGFjayhvLmxlbmd0aD4xP1QudW5pcXVlU29ydChvKTpvKX0saW5kZXg6ZnVuY3Rpb24oZSl7cmV0dXJuIGU/InN0cmluZyI9PXR5cGVvZiBlP2MuY2FsbChUKGUpLHRoaXNbMF0pOmMuY2FsbCh0aGlzLGUuanF1ZXJ5P2VbMF06ZSk6dGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soVC51bmlxdWVTb3J0KFQubWVyZ2UodGhpcy5nZXQoKSxUKGUsdCkpKSl9LGFkZEJhY2s6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuYWRkKG51bGw9PWU/dGhpcy5wcmV2T2JqZWN0OnRoaXMucHJldk9iamVjdC5maWx0ZXIoZSkpfX0pLFQuZWFjaCh7cGFyZW50OmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZTtyZXR1cm4gdCYmMTEhPT10Lm5vZGVUeXBlP3Q6bnVsbH0scGFyZW50czpmdW5jdGlvbihlKXtyZXR1cm4gUyhlLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIFMoZSwicGFyZW50Tm9kZSIsbil9LG5leHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIFAoZSwibmV4dFNpYmxpbmciKX0scHJldjpmdW5jdGlvbihlKXtyZXR1cm4gUChlLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbihlKXtyZXR1cm4gUyhlLCJuZXh0U2libGluZyIpfSxwcmV2QWxsOmZ1bmN0aW9uKGUpe3JldHVybiBTKGUsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBTKGUsIm5leHRTaWJsaW5nIixuKX0scHJldlVudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gUyhlLCJwcmV2aW91c1NpYmxpbmciLG4pfSxzaWJsaW5nczpmdW5jdGlvbihlKXtyZXR1cm4gaygoZS5wYXJlbnROb2RlfHx7fSkuZmlyc3RDaGlsZCxlKX0sY2hpbGRyZW46ZnVuY3Rpb24oZSl7cmV0dXJuIGsoZS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWUuY29udGVudERvY3VtZW50JiZhKGUuY29udGVudERvY3VtZW50KT9lLmNvbnRlbnREb2N1bWVudDooTihlLCJ0ZW1wbGF0ZSIpJiYoZT1lLmNvbnRlbnR8fGUpLFQubWVyZ2UoW10sZS5jaGlsZE5vZGVzKSl9fSwoZnVuY3Rpb24oZSx0KXtULmZuW2VdPWZ1bmN0aW9uKG4scil7dmFyIGk9VC5tYXAodGhpcyx0LG4pO3JldHVybiJVbnRpbCIhPT1lLnNsaWNlKC01KSYmKHI9biksciYmInN0cmluZyI9PXR5cGVvZiByJiYoaT1ULmZpbHRlcihyLGkpKSx0aGlzLmxlbmd0aD4xJiYoUltlXXx8VC51bmlxdWVTb3J0KGkpLEkudGVzdChlKSYmaS5yZXZlcnNlKCkpLHRoaXMucHVzaFN0YWNrKGkpfX0pKTt2YXIgJD0vW15ceDIwXHRcclxuXGZdKy9nO2Z1bmN0aW9uIEIoZSl7cmV0dXJuIGV9ZnVuY3Rpb24gcShlKXt0aHJvdyBlfWZ1bmN0aW9uIE0oZSx0LG4scil7dmFyIGk7dHJ5e2UmJm0oaT1lLnByb21pc2UpP2kuY2FsbChlKS5kb25lKHQpLmZhaWwobik6ZSYmbShpPWUudGhlbik/aS5jYWxsKGUsdCxuKTp0LmFwcGx5KHZvaWQgMCxbZV0uc2xpY2UocikpfWNhdGNoKGUpe24uYXBwbHkodm9pZCAwLFtlXSl9fVQuQ2FsbGJhY2tzPWZ1bmN0aW9uKGUpe2U9InN0cmluZyI9PXR5cGVvZiBlP2Z1bmN0aW9uKGUpe3ZhciB0PXt9O3JldHVybiBULmVhY2goZS5tYXRjaCgkKXx8W10sKGZ1bmN0aW9uKGUsbil7dFtuXT0hMH0pKSx0fShlKTpULmV4dGVuZCh7fSxlKTt2YXIgdCxuLHIsaSxvPVtdLGE9W10scz0tMSx1PWZ1bmN0aW9uKCl7Zm9yKGk9aXx8ZS5vbmNlLHI9dD0hMDthLmxlbmd0aDtzPS0xKWZvcihuPWEuc2hpZnQoKTsrK3M8by5sZW5ndGg7KSExPT09b1tzXS5hcHBseShuWzBdLG5bMV0pJiZlLnN0b3BPbkZhbHNlJiYocz1vLmxlbmd0aCxuPSExKTtlLm1lbW9yeXx8KG49ITEpLHQ9ITEsaSYmKG89bj9bXToiIil9LGw9e2FkZDpmdW5jdGlvbigpe3JldHVybiBvJiYobiYmIXQmJihzPW8ubGVuZ3RoLTEsYS5wdXNoKG4pKSxmdW5jdGlvbiB0KG4pe1QuZWFjaChuLChmdW5jdGlvbihuLHIpe20ocik/ZS51bmlxdWUmJmwuaGFzKHIpfHxvLnB1c2gocik6ciYmci5sZW5ndGgmJiJzdHJpbmciIT09eChyKSYmdChyKX0pKX0oYXJndW1lbnRzKSxuJiYhdCYmdSgpKSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gVC5lYWNoKGFyZ3VtZW50cywoZnVuY3Rpb24oZSx0KXtmb3IodmFyIG47KG49VC5pbkFycmF5KHQsbyxuKSk+LTE7KW8uc3BsaWNlKG4sMSksbjw9cyYmcy0tfSkpLHRoaXN9LGhhczpmdW5jdGlvbihlKXtyZXR1cm4gZT9ULmluQXJyYXkoZSxvKT4tMTpvLmxlbmd0aD4wfSxlbXB0eTpmdW5jdGlvbigpe3JldHVybiBvJiYobz1bXSksdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiBpPWE9W10sbz1uPSIiLHRoaXN9LGRpc2FibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIW99LGxvY2s6ZnVuY3Rpb24oKXtyZXR1cm4gaT1hPVtdLG58fHR8fChvPW49IiIpLHRoaXN9LGxvY2tlZDpmdW5jdGlvbigpe3JldHVybiEhaX0sZmlyZVdpdGg6ZnVuY3Rpb24oZSxuKXtyZXR1cm4gaXx8KG49W2UsKG49bnx8W10pLnNsaWNlP24uc2xpY2UoKTpuXSxhLnB1c2gobiksdHx8dSgpKSx0aGlzfSxmaXJlOmZ1bmN0aW9uKCl7cmV0dXJuIGwuZmlyZVdpdGgodGhpcyxhcmd1bWVudHMpLHRoaXN9LGZpcmVkOmZ1bmN0aW9uKCl7cmV0dXJuISFyfX07cmV0dXJuIGx9LFQuZXh0ZW5kKHtEZWZlcnJlZDpmdW5jdGlvbihlKXt2YXIgdD1bWyJub3RpZnkiLCJwcm9ncmVzcyIsVC5DYWxsYmFja3MoIm1lbW9yeSIpLFQuQ2FsbGJhY2tzKCJtZW1vcnkiKSwyXSxbInJlc29sdmUiLCJkb25lIixULkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxULkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwwLCJyZXNvbHZlZCJdLFsicmVqZWN0IiwiZmFpbCIsVC5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksVC5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksMSwicmVqZWN0ZWQiXV0scj0icGVuZGluZyIsaT17c3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gcn0sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIG8uZG9uZShhcmd1bWVudHMpLmZhaWwoYXJndW1lbnRzKSx0aGlzfSxjYXRjaDpmdW5jdGlvbihlKXtyZXR1cm4gaS50aGVuKG51bGwsZSl9LHBpcGU6ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHM7cmV0dXJuIFQuRGVmZXJyZWQoKGZ1bmN0aW9uKG4pe1QuZWFjaCh0LChmdW5jdGlvbih0LHIpe3ZhciBpPW0oZVtyWzRdXSkmJmVbcls0XV07b1tyWzFdXSgoZnVuY3Rpb24oKXt2YXIgZT1pJiZpLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtlJiZtKGUucHJvbWlzZSk/ZS5wcm9taXNlKCkucHJvZ3Jlc3Mobi5ub3RpZnkpLmRvbmUobi5yZXNvbHZlKS5mYWlsKG4ucmVqZWN0KTpuW3JbMF0rIldpdGgiXSh0aGlzLGk/W2VdOmFyZ3VtZW50cyl9KSl9KSksZT1udWxsfSkpLnByb21pc2UoKX0sdGhlbjpmdW5jdGlvbihlLHIsaSl7dmFyIG89MDtmdW5jdGlvbiBhKGUsdCxyLGkpe3JldHVybiBmdW5jdGlvbigpe3ZhciBzPXRoaXMsdT1hcmd1bWVudHMsbD1mdW5jdGlvbigpe3ZhciBuLGw7aWYoIShlPG8pKXtpZigobj1yLmFwcGx5KHMsdSkpPT09dC5wcm9taXNlKCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlbmFibGUgc2VsZi1yZXNvbHV0aW9uIik7bD1uJiYoIm9iamVjdCI9PXR5cGVvZiBufHwiZnVuY3Rpb24iPT10eXBlb2YgbikmJm4udGhlbixtKGwpP2k/bC5jYWxsKG4sYShvLHQsQixpKSxhKG8sdCxxLGkpKToobysrLGwuY2FsbChuLGEobyx0LEIsaSksYShvLHQscSxpKSxhKG8sdCxCLHQubm90aWZ5V2l0aCkpKToociE9PUImJihzPXZvaWQgMCx1PVtuXSksKGl8fHQucmVzb2x2ZVdpdGgpKHMsdSkpfX0sYz1pP2w6ZnVuY3Rpb24oKXt0cnl7bCgpfWNhdGNoKG4pe1QuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayYmVC5EZWZlcnJlZC5leGNlcHRpb25Ib29rKG4sYy5zdGFja1RyYWNlKSxlKzE+PW8mJihyIT09cSYmKHM9dm9pZCAwLHU9W25dKSx0LnJlamVjdFdpdGgocyx1KSl9fTtlP2MoKTooVC5EZWZlcnJlZC5nZXRTdGFja0hvb2smJihjLnN0YWNrVHJhY2U9VC5EZWZlcnJlZC5nZXRTdGFja0hvb2soKSksbi5zZXRUaW1lb3V0KGMpKX19cmV0dXJuIFQuRGVmZXJyZWQoKGZ1bmN0aW9uKG4pe3RbMF1bM10uYWRkKGEoMCxuLG0oaSk/aTpCLG4ubm90aWZ5V2l0aCkpLHRbMV1bM10uYWRkKGEoMCxuLG0oZSk/ZTpCKSksdFsyXVszXS5hZGQoYSgwLG4sbShyKT9yOnEpKX0pKS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWU/VC5leHRlbmQoZSxpKTppfX0sbz17fTtyZXR1cm4gVC5lYWNoKHQsKGZ1bmN0aW9uKGUsbil7dmFyIGE9blsyXSxzPW5bNV07aVtuWzFdXT1hLmFkZCxzJiZhLmFkZCgoZnVuY3Rpb24oKXtyPXN9KSx0WzMtZV1bMl0uZGlzYWJsZSx0WzMtZV1bM10uZGlzYWJsZSx0WzBdWzJdLmxvY2ssdFswXVszXS5sb2NrKSxhLmFkZChuWzNdLmZpcmUpLG9bblswXV09ZnVuY3Rpb24oKXtyZXR1cm4gb1tuWzBdKyJXaXRoIl0odGhpcz09PW8/dm9pZCAwOnRoaXMsYXJndW1lbnRzKSx0aGlzfSxvW25bMF0rIldpdGgiXT1hLmZpcmVXaXRofSkpLGkucHJvbWlzZShvKSxlJiZlLmNhbGwobyxvKSxvfSx3aGVuOmZ1bmN0aW9uKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGgsbj10LHI9QXJyYXkobiksaT1zLmNhbGwoYXJndW1lbnRzKSxvPVQuRGVmZXJyZWQoKSxhPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihuKXtyW2VdPXRoaXMsaVtlXT1hcmd1bWVudHMubGVuZ3RoPjE/cy5jYWxsKGFyZ3VtZW50cyk6biwtLXR8fG8ucmVzb2x2ZVdpdGgocixpKX19O2lmKHQ8PTEmJihNKGUsby5kb25lKGEobikpLnJlc29sdmUsby5yZWplY3QsIXQpLCJwZW5kaW5nIj09PW8uc3RhdGUoKXx8bShpW25dJiZpW25dLnRoZW4pKSlyZXR1cm4gby50aGVuKCk7Zm9yKDtuLS07KU0oaVtuXSxhKG4pLG8ucmVqZWN0KTtyZXR1cm4gby5wcm9taXNlKCl9fSk7dmFyIEg9L14oRXZhbHxJbnRlcm5hbHxSYW5nZXxSZWZlcmVuY2V8U3ludGF4fFR5cGV8VVJJKUVycm9yJC87VC5EZWZlcnJlZC5leGNlcHRpb25Ib29rPWZ1bmN0aW9uKGUsdCl7bi5jb25zb2xlJiZuLmNvbnNvbGUud2FybiYmZSYmSC50ZXN0KGUubmFtZSkmJm4uY29uc29sZS53YXJuKCJqUXVlcnkuRGVmZXJyZWQgZXhjZXB0aW9uOiAiK2UubWVzc2FnZSxlLnN0YWNrLHQpfSxULnJlYWR5RXhjZXB0aW9uPWZ1bmN0aW9uKGUpe24uc2V0VGltZW91dCgoZnVuY3Rpb24oKXt0aHJvdyBlfSkpfTt2YXIgRj1ULkRlZmVycmVkKCk7ZnVuY3Rpb24gVygpe2IucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsVyksbi5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixXKSxULnJlYWR5KCl9VC5mbi5yZWFkeT1mdW5jdGlvbihlKXtyZXR1cm4gRi50aGVuKGUpLmNhdGNoKChmdW5jdGlvbihlKXtULnJlYWR5RXhjZXB0aW9uKGUpfSkpLHRoaXN9LFQuZXh0ZW5kKHtpc1JlYWR5OiExLHJlYWR5V2FpdDoxLHJlYWR5OmZ1bmN0aW9uKGUpeyghMD09PWU/LS1ULnJlYWR5V2FpdDpULmlzUmVhZHkpfHwoVC5pc1JlYWR5PSEwLCEwIT09ZSYmLS1ULnJlYWR5V2FpdD4wfHxGLnJlc29sdmVXaXRoKGIsW1RdKSl9fSksVC5yZWFkeS50aGVuPUYudGhlbiwiY29tcGxldGUiPT09Yi5yZWFkeVN0YXRlfHwibG9hZGluZyIhPT1iLnJlYWR5U3RhdGUmJiFiLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbD9uLnNldFRpbWVvdXQoVC5yZWFkeSk6KGIuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsVyksbi5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixXKSk7dmFyIFU9ZnVuY3Rpb24oZSx0LG4scixpLG8sYSl7dmFyIHM9MCx1PWUubGVuZ3RoLGw9bnVsbD09bjtpZigib2JqZWN0Ij09PXgobikpZm9yKHMgaW4gaT0hMCxuKVUoZSx0LHMsbltzXSwhMCxvLGEpO2Vsc2UgaWYodm9pZCAwIT09ciYmKGk9ITAsbShyKXx8KGE9ITApLGwmJihhPyh0LmNhbGwoZSxyKSx0PW51bGwpOihsPXQsdD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGwuY2FsbChUKGUpLG4pfSkpLHQpKWZvcig7czx1O3MrKyl0KGVbc10sbixhP3I6ci5jYWxsKGVbc10scyx0KGVbc10sbikpKTtyZXR1cm4gaT9lOmw/dC5jYWxsKGUpOnU/dChlWzBdLG4pOm99LHo9L14tbXMtLyxRPS8tKFthLXpdKS9nO2Z1bmN0aW9uIFYoZSx0KXtyZXR1cm4gdC50b1VwcGVyQ2FzZSgpfWZ1bmN0aW9uIEsoZSl7cmV0dXJuIGUucmVwbGFjZSh6LCJtcy0iKS5yZXBsYWNlKFEsVil9dmFyIFg9ZnVuY3Rpb24oZSl7cmV0dXJuIDE9PT1lLm5vZGVUeXBlfHw5PT09ZS5ub2RlVHlwZXx8IStlLm5vZGVUeXBlfTtmdW5jdGlvbiBZKCl7dGhpcy5leHBhbmRvPVQuZXhwYW5kbytZLnVpZCsrfVkudWlkPTEsWS5wcm90b3R5cGU9e2NhY2hlOmZ1bmN0aW9uKGUpe3ZhciB0PWVbdGhpcy5leHBhbmRvXTtyZXR1cm4gdHx8KHQ9e30sWChlKSYmKGUubm9kZVR5cGU/ZVt0aGlzLmV4cGFuZG9dPXQ6T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdGhpcy5leHBhbmRvLHt2YWx1ZTp0LGNvbmZpZ3VyYWJsZTohMH0pKSksdH0sc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPXRoaXMuY2FjaGUoZSk7aWYoInN0cmluZyI9PXR5cGVvZiB0KWlbSyh0KV09bjtlbHNlIGZvcihyIGluIHQpaVtLKHIpXT10W3JdO3JldHVybiBpfSxnZXQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dD90aGlzLmNhY2hlKGUpOmVbdGhpcy5leHBhbmRvXSYmZVt0aGlzLmV4cGFuZG9dW0sodCldfSxhY2Nlc3M6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2b2lkIDA9PT10fHx0JiYic3RyaW5nIj09dHlwZW9mIHQmJnZvaWQgMD09PW4/dGhpcy5nZXQoZSx0KToodGhpcy5zZXQoZSx0LG4pLHZvaWQgMCE9PW4/bjp0KX0scmVtb3ZlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj1lW3RoaXMuZXhwYW5kb107aWYodm9pZCAwIT09cil7aWYodm9pZCAwIT09dCl7bj0odD1BcnJheS5pc0FycmF5KHQpP3QubWFwKEspOih0PUsodCkpaW4gcj9bdF06dC5tYXRjaCgkKXx8W10pLmxlbmd0aDtmb3IoO24tLTspZGVsZXRlIHJbdFtuXV19KHZvaWQgMD09PXR8fFQuaXNFbXB0eU9iamVjdChyKSkmJihlLm5vZGVUeXBlP2VbdGhpcy5leHBhbmRvXT12b2lkIDA6ZGVsZXRlIGVbdGhpcy5leHBhbmRvXSl9fSxoYXNEYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PWVbdGhpcy5leHBhbmRvXTtyZXR1cm4gdm9pZCAwIT09dCYmIVQuaXNFbXB0eU9iamVjdCh0KX19O3ZhciBKPW5ldyBZLEc9bmV3IFksWj0vXig/Olx7W1x3XFddKlx9fFxbW1x3XFddKlxdKSQvLGVlPS9bQS1aXS9nO2Z1bmN0aW9uIHRlKGUsdCxuKXt2YXIgcjtpZih2b2lkIDA9PT1uJiYxPT09ZS5ub2RlVHlwZSlpZihyPSJkYXRhLSIrdC5yZXBsYWNlKGVlLCItJCYiKS50b0xvd2VyQ2FzZSgpLCJzdHJpbmciPT10eXBlb2Yobj1lLmdldEF0dHJpYnV0ZShyKSkpe3RyeXtuPWZ1bmN0aW9uKGUpe3JldHVybiJ0cnVlIj09PWV8fCJmYWxzZSIhPT1lJiYoIm51bGwiPT09ZT9udWxsOmU9PT0rZSsiIj8rZTpaLnRlc3QoZSk/SlNPTi5wYXJzZShlKTplKX0obil9Y2F0Y2goZSl7fUcuc2V0KGUsdCxuKX1lbHNlIG49dm9pZCAwO3JldHVybiBufVQuZXh0ZW5kKHtoYXNEYXRhOmZ1bmN0aW9uKGUpe3JldHVybiBHLmhhc0RhdGEoZSl8fEouaGFzRGF0YShlKX0sZGF0YTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIEcuYWNjZXNzKGUsdCxuKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihlLHQpe0cucmVtb3ZlKGUsdCl9LF9kYXRhOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gSi5hY2Nlc3MoZSx0LG4pfSxfcmVtb3ZlRGF0YTpmdW5jdGlvbihlLHQpe0oucmVtb3ZlKGUsdCl9fSksVC5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksbz10aGlzWzBdLGE9byYmby5hdHRyaWJ1dGVzO2lmKHZvaWQgMD09PWUpe2lmKHRoaXMubGVuZ3RoJiYoaT1HLmdldChvKSwxPT09by5ub2RlVHlwZSYmIUouZ2V0KG8sImhhc0RhdGFBdHRycyIpKSl7Zm9yKG49YS5sZW5ndGg7bi0tOylhW25dJiYwPT09KHI9YVtuXS5uYW1lKS5pbmRleE9mKCJkYXRhLSIpJiYocj1LKHIuc2xpY2UoNSkpLHRlKG8scixpW3JdKSk7Si5zZXQobywiaGFzRGF0YUF0dHJzIiwhMCl9cmV0dXJuIGl9cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBlP3RoaXMuZWFjaCgoZnVuY3Rpb24oKXtHLnNldCh0aGlzLGUpfSkpOlUodGhpcywoZnVuY3Rpb24odCl7dmFyIG47aWYobyYmdm9pZCAwPT09dClyZXR1cm4gdm9pZCAwIT09KG49Ry5nZXQobyxlKSl8fHZvaWQgMCE9PShuPXRlKG8sZSkpP246dm9pZCAwO3RoaXMuZWFjaCgoZnVuY3Rpb24oKXtHLnNldCh0aGlzLGUsdCl9KSl9KSxudWxsLHQsYXJndW1lbnRzLmxlbmd0aD4xLG51bGwsITApfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7Ry5yZW1vdmUodGhpcyxlKX0pKX19KSxULmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByO2lmKGUpcmV0dXJuIHQ9KHR8fCJmeCIpKyJxdWV1ZSIscj1KLmdldChlLHQpLG4mJighcnx8QXJyYXkuaXNBcnJheShuKT9yPUouYWNjZXNzKGUsdCxULm1ha2VBcnJheShuKSk6ci5wdXNoKG4pKSxyfHxbXX0sZGVxdWV1ZTpmdW5jdGlvbihlLHQpe3Q9dHx8ImZ4Ijt2YXIgbj1ULnF1ZXVlKGUsdCkscj1uLmxlbmd0aCxpPW4uc2hpZnQoKSxvPVQuX3F1ZXVlSG9va3MoZSx0KTsiaW5wcm9ncmVzcyI9PT1pJiYoaT1uLnNoaWZ0KCksci0tKSxpJiYoImZ4Ij09PXQmJm4udW5zaGlmdCgiaW5wcm9ncmVzcyIpLGRlbGV0ZSBvLnN0b3AsaS5jYWxsKGUsKGZ1bmN0aW9uKCl7VC5kZXF1ZXVlKGUsdCl9KSxvKSksIXImJm8mJm8uZW1wdHkuZmlyZSgpfSxfcXVldWVIb29rczpmdW5jdGlvbihlLHQpe3ZhciBuPXQrInF1ZXVlSG9va3MiO3JldHVybiBKLmdldChlLG4pfHxKLmFjY2VzcyhlLG4se2VtcHR5OlQuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLmFkZCgoZnVuY3Rpb24oKXtKLnJlbW92ZShlLFt0KyJxdWV1ZSIsbl0pfSkpfSl9fSksVC5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49MjtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGUmJih0PWUsZT0iZngiLG4tLSksYXJndW1lbnRzLmxlbmd0aDxuP1QucXVldWUodGhpc1swXSxlKTp2b2lkIDA9PT10P3RoaXM6dGhpcy5lYWNoKChmdW5jdGlvbigpe3ZhciBuPVQucXVldWUodGhpcyxlLHQpO1QuX3F1ZXVlSG9va3ModGhpcyxlKSwiZngiPT09ZSYmImlucHJvZ3Jlc3MiIT09blswXSYmVC5kZXF1ZXVlKHRoaXMsZSl9KSl9LGRlcXVldWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaCgoZnVuY3Rpb24oKXtULmRlcXVldWUodGhpcyxlKX0pKX0sY2xlYXJRdWV1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5xdWV1ZShlfHwiZngiLFtdKX0scHJvbWlzZTpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MSxpPVQuRGVmZXJyZWQoKSxvPXRoaXMsYT10aGlzLmxlbmd0aCxzPWZ1bmN0aW9uKCl7LS1yfHxpLnJlc29sdmVXaXRoKG8sW29dKX07Zm9yKCJzdHJpbmciIT10eXBlb2YgZSYmKHQ9ZSxlPXZvaWQgMCksZT1lfHwiZngiO2EtLTspKG49Si5nZXQob1thXSxlKyJxdWV1ZUhvb2tzIikpJiZuLmVtcHR5JiYocisrLG4uZW1wdHkuYWRkKHMpKTtyZXR1cm4gcygpLGkucHJvbWlzZSh0KX19KTt2YXIgbmU9L1srLV0/KD86XGQqXC58KVxkKyg/OltlRV1bKy1dP1xkK3wpLy5zb3VyY2UscmU9bmV3IFJlZ0V4cCgiXig/OihbKy1dKT18KSgiK25lKyIpKFthLXolXSopJCIsImkiKSxpZT1bIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLG9lPWIuZG9jdW1lbnRFbGVtZW50LGFlPWZ1bmN0aW9uKGUpe3JldHVybiBULmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKX0sc2U9e2NvbXBvc2VkOiEwfTtvZS5nZXRSb290Tm9kZSYmKGFlPWZ1bmN0aW9uKGUpe3JldHVybiBULmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKXx8ZS5nZXRSb290Tm9kZShzZSk9PT1lLm93bmVyRG9jdW1lbnR9KTt2YXIgdWU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4ibm9uZSI9PT0oZT10fHxlKS5zdHlsZS5kaXNwbGF5fHwiIj09PWUuc3R5bGUuZGlzcGxheSYmYWUoZSkmJiJub25lIj09PVQuY3NzKGUsImRpc3BsYXkiKX07ZnVuY3Rpb24gbGUoZSx0LG4scil7dmFyIGksbyxhPTIwLHM9cj9mdW5jdGlvbigpe3JldHVybiByLmN1cigpfTpmdW5jdGlvbigpe3JldHVybiBULmNzcyhlLHQsIiIpfSx1PXMoKSxsPW4mJm5bM118fChULmNzc051bWJlclt0XT8iIjoicHgiKSxjPWUubm9kZVR5cGUmJihULmNzc051bWJlclt0XXx8InB4IiE9PWwmJit1KSYmcmUuZXhlYyhULmNzcyhlLHQpKTtpZihjJiZjWzNdIT09bCl7Zm9yKHUvPTIsbD1sfHxjWzNdLGM9K3V8fDE7YS0tOylULnN0eWxlKGUsdCxjK2wpLCgxLW8pKigxLShvPXMoKS91fHwuNSkpPD0wJiYoYT0wKSxjLz1vO2MqPTIsVC5zdHlsZShlLHQsYytsKSxuPW58fFtdfXJldHVybiBuJiYoYz0rY3x8K3V8fDAsaT1uWzFdP2MrKG5bMV0rMSkqblsyXTorblsyXSxyJiYoci51bml0PWwsci5zdGFydD1jLHIuZW5kPWkpKSxpfXZhciBjZT17fTtmdW5jdGlvbiBmZShlKXt2YXIgdCxuPWUub3duZXJEb2N1bWVudCxyPWUubm9kZU5hbWUsaT1jZVtyXTtyZXR1cm4gaXx8KHQ9bi5ib2R5LmFwcGVuZENoaWxkKG4uY3JlYXRlRWxlbWVudChyKSksaT1ULmNzcyh0LCJkaXNwbGF5IiksdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpLCJub25lIj09PWkmJihpPSJibG9jayIpLGNlW3JdPWksaSl9ZnVuY3Rpb24gZGUoZSx0KXtmb3IodmFyIG4scixpPVtdLG89MCxhPWUubGVuZ3RoO288YTtvKyspKHI9ZVtvXSkuc3R5bGUmJihuPXIuc3R5bGUuZGlzcGxheSx0Pygibm9uZSI9PT1uJiYoaVtvXT1KLmdldChyLCJkaXNwbGF5Iil8fG51bGwsaVtvXXx8KHIuc3R5bGUuZGlzcGxheT0iIikpLCIiPT09ci5zdHlsZS5kaXNwbGF5JiZ1ZShyKSYmKGlbb109ZmUocikpKToibm9uZSIhPT1uJiYoaVtvXT0ibm9uZSIsSi5zZXQociwiZGlzcGxheSIsbikpKTtmb3Iobz0wO288YTtvKyspbnVsbCE9aVtvXSYmKGVbb10uc3R5bGUuZGlzcGxheT1pW29dKTtyZXR1cm4gZX1ULmZuLmV4dGVuZCh7c2hvdzpmdW5jdGlvbigpe3JldHVybiBkZSh0aGlzLCEwKX0saGlkZTpmdW5jdGlvbigpe3JldHVybiBkZSh0aGlzKX0sdG9nZ2xlOmZ1bmN0aW9uKGUpe3JldHVybiJib29sZWFuIj09dHlwZW9mIGU/ZT90aGlzLnNob3coKTp0aGlzLmhpZGUoKTp0aGlzLmVhY2goKGZ1bmN0aW9uKCl7dWUodGhpcyk/VCh0aGlzKS5zaG93KCk6VCh0aGlzKS5oaWRlKCl9KSl9fSk7dmFyIGhlLHBlLGdlPS9eKD86Y2hlY2tib3h8cmFkaW8pJC9pLHZlPS88KFthLXpdW15cL1wwPlx4MjBcdFxyXG5cZl0qKS9pLG1lPS9eJHxebW9kdWxlJHxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaTtoZT1iLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKS5hcHBlbmRDaGlsZChiLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSwocGU9Yi5jcmVhdGVFbGVtZW50KCJpbnB1dCIpKS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLHBlLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNoZWNrZWQiKSxwZS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJ0IiksaGUuYXBwZW5kQ2hpbGQocGUpLHYuY2hlY2tDbG9uZT1oZS5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsaGUuaW5uZXJIVE1MPSI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+Iix2Lm5vQ2xvbmVDaGVja2VkPSEhaGUuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuZGVmYXVsdFZhbHVlLGhlLmlubmVySFRNTD0iPG9wdGlvbj48L29wdGlvbj4iLHYub3B0aW9uPSEhaGUubGFzdENoaWxkO3ZhciB5ZT17dGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLGNvbDpbMiwiPHRhYmxlPjxjb2xncm91cD4iLCI8L2NvbGdyb3VwPjwvdGFibGU+Il0sdHI6WzIsIjx0YWJsZT48dGJvZHk+IiwiPC90Ym9keT48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxfZGVmYXVsdDpbMCwiIiwiIl19O2Z1bmN0aW9uIGJlKGUsdCl7dmFyIG47cmV0dXJuIG49dm9pZCAwIT09ZS5nZXRFbGVtZW50c0J5VGFnTmFtZT9lLmdldEVsZW1lbnRzQnlUYWdOYW1lKHR8fCIqIik6dm9pZCAwIT09ZS5xdWVyeVNlbGVjdG9yQWxsP2UucXVlcnlTZWxlY3RvckFsbCh0fHwiKiIpOltdLHZvaWQgMD09PXR8fHQmJk4oZSx0KT9ULm1lcmdlKFtlXSxuKTpufWZ1bmN0aW9uIF9lKGUsdCl7Zm9yKHZhciBuPTAscj1lLmxlbmd0aDtuPHI7bisrKUouc2V0KGVbbl0sImdsb2JhbEV2YWwiLCF0fHxKLmdldCh0W25dLCJnbG9iYWxFdmFsIikpfXllLnRib2R5PXllLnRmb290PXllLmNvbGdyb3VwPXllLmNhcHRpb249eWUudGhlYWQseWUudGg9eWUudGQsdi5vcHRpb258fCh5ZS5vcHRncm91cD15ZS5vcHRpb249WzEsIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSk7dmFyIHdlPS88fCYjP1x3KzsvO2Z1bmN0aW9uIHhlKGUsdCxuLHIsaSl7Zm9yKHZhciBvLGEscyx1LGwsYyxmPXQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLGQ9W10saD0wLHA9ZS5sZW5ndGg7aDxwO2grKylpZigobz1lW2hdKXx8MD09PW8paWYoIm9iamVjdCI9PT14KG8pKVQubWVyZ2UoZCxvLm5vZGVUeXBlP1tvXTpvKTtlbHNlIGlmKHdlLnRlc3Qobykpe2ZvcihhPWF8fGYuYXBwZW5kQ2hpbGQodC5jcmVhdGVFbGVtZW50KCJkaXYiKSkscz0odmUuZXhlYyhvKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKSx1PXllW3NdfHx5ZS5fZGVmYXVsdCxhLmlubmVySFRNTD11WzFdK1QuaHRtbFByZWZpbHRlcihvKSt1WzJdLGM9dVswXTtjLS07KWE9YS5sYXN0Q2hpbGQ7VC5tZXJnZShkLGEuY2hpbGROb2RlcyksKGE9Zi5maXJzdENoaWxkKS50ZXh0Q29udGVudD0iIn1lbHNlIGQucHVzaCh0LmNyZWF0ZVRleHROb2RlKG8pKTtmb3IoZi50ZXh0Q29udGVudD0iIixoPTA7bz1kW2grK107KWlmKHImJlQuaW5BcnJheShvLHIpPi0xKWkmJmkucHVzaChvKTtlbHNlIGlmKGw9YWUobyksYT1iZShmLmFwcGVuZENoaWxkKG8pLCJzY3JpcHQiKSxsJiZfZShhKSxuKWZvcihjPTA7bz1hW2MrK107KW1lLnRlc3Qoby50eXBlfHwiIikmJm4ucHVzaChvKTtyZXR1cm4gZn12YXIgVGU9L14oW14uXSopKD86XC4oLispfCkvO2Z1bmN0aW9uIEVlKCl7cmV0dXJuITB9ZnVuY3Rpb24gQ2UoKXtyZXR1cm4hMX1mdW5jdGlvbiBTZShlLHQpe3JldHVybiBlPT09ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIGIuYWN0aXZlRWxlbWVudH1jYXRjaChlKXt9fSgpPT0oImZvY3VzIj09PXQpfWZ1bmN0aW9uIGtlKGUsdCxuLHIsaSxvKXt2YXIgYSxzO2lmKCJvYmplY3QiPT10eXBlb2YgdCl7Zm9yKHMgaW4ic3RyaW5nIiE9dHlwZW9mIG4mJihyPXJ8fG4sbj12b2lkIDApLHQpa2UoZSxzLG4scix0W3NdLG8pO3JldHVybiBlfWlmKG51bGw9PXImJm51bGw9PWk/KGk9bixyPW49dm9pZCAwKTpudWxsPT1pJiYoInN0cmluZyI9PXR5cGVvZiBuPyhpPXIscj12b2lkIDApOihpPXIscj1uLG49dm9pZCAwKSksITE9PT1pKWk9Q2U7ZWxzZSBpZighaSlyZXR1cm4gZTtyZXR1cm4gMT09PW8mJihhPWksKGk9ZnVuY3Rpb24oZSl7cmV0dXJuIFQoKS5vZmYoZSksYS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KS5ndWlkPWEuZ3VpZHx8KGEuZ3VpZD1ULmd1aWQrKykpLGUuZWFjaCgoZnVuY3Rpb24oKXtULmV2ZW50LmFkZCh0aGlzLHQsaSxyLG4pfSkpfWZ1bmN0aW9uIEFlKGUsdCxuKXtuPyhKLnNldChlLHQsITEpLFQuZXZlbnQuYWRkKGUsdCx7bmFtZXNwYWNlOiExLGhhbmRsZXI6ZnVuY3Rpb24oZSl7dmFyIHIsaSxvPUouZ2V0KHRoaXMsdCk7aWYoMSZlLmlzVHJpZ2dlciYmdGhpc1t0XSl7aWYoby5sZW5ndGgpKFQuZXZlbnQuc3BlY2lhbFt0XXx8e30pLmRlbGVnYXRlVHlwZSYmZS5zdG9wUHJvcGFnYXRpb24oKTtlbHNlIGlmKG89cy5jYWxsKGFyZ3VtZW50cyksSi5zZXQodGhpcyx0LG8pLHI9bih0aGlzLHQpLHRoaXNbdF0oKSxvIT09KGk9Si5nZXQodGhpcyx0KSl8fHI/Si5zZXQodGhpcyx0LCExKTppPXt9LG8hPT1pKXJldHVybiBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLGUucHJldmVudERlZmF1bHQoKSxpJiZpLnZhbHVlfWVsc2Ugby5sZW5ndGgmJihKLnNldCh0aGlzLHQse3ZhbHVlOlQuZXZlbnQudHJpZ2dlcihULmV4dGVuZChvWzBdLFQuRXZlbnQucHJvdG90eXBlKSxvLnNsaWNlKDEpLHRoaXMpfSksZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSl9fSkpOnZvaWQgMD09PUouZ2V0KGUsdCkmJlQuZXZlbnQuYWRkKGUsdCxFZSl9VC5ldmVudD17Z2xvYmFsOnt9LGFkZDpmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvLGEscyx1LGwsYyxmLGQsaCxwLGcsdj1KLmdldChlKTtpZihYKGUpKWZvcihuLmhhbmRsZXImJihuPShvPW4pLmhhbmRsZXIsaT1vLnNlbGVjdG9yKSxpJiZULmZpbmQubWF0Y2hlc1NlbGVjdG9yKG9lLGkpLG4uZ3VpZHx8KG4uZ3VpZD1ULmd1aWQrKyksKHU9di5ldmVudHMpfHwodT12LmV2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpKSwoYT12LmhhbmRsZSl8fChhPXYuaGFuZGxlPWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDAhPT1UJiZULmV2ZW50LnRyaWdnZXJlZCE9PXQudHlwZT9ULmV2ZW50LmRpc3BhdGNoLmFwcGx5KGUsYXJndW1lbnRzKTp2b2lkIDB9KSxsPSh0PSh0fHwiIikubWF0Y2goJCl8fFsiIl0pLmxlbmd0aDtsLS07KWg9Zz0ocz1UZS5leGVjKHRbbF0pfHxbXSlbMV0scD0oc1syXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLGgmJihmPVQuZXZlbnQuc3BlY2lhbFtoXXx8e30saD0oaT9mLmRlbGVnYXRlVHlwZTpmLmJpbmRUeXBlKXx8aCxmPVQuZXZlbnQuc3BlY2lhbFtoXXx8e30sYz1ULmV4dGVuZCh7dHlwZTpoLG9yaWdUeXBlOmcsZGF0YTpyLGhhbmRsZXI6bixndWlkOm4uZ3VpZCxzZWxlY3RvcjppLG5lZWRzQ29udGV4dDppJiZULmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QoaSksbmFtZXNwYWNlOnAuam9pbigiLiIpfSxvKSwoZD11W2hdKXx8KChkPXVbaF09W10pLmRlbGVnYXRlQ291bnQ9MCxmLnNldHVwJiYhMSE9PWYuc2V0dXAuY2FsbChlLHIscCxhKXx8ZS5hZGRFdmVudExpc3RlbmVyJiZlLmFkZEV2ZW50TGlzdGVuZXIoaCxhKSksZi5hZGQmJihmLmFkZC5jYWxsKGUsYyksYy5oYW5kbGVyLmd1aWR8fChjLmhhbmRsZXIuZ3VpZD1uLmd1aWQpKSxpP2Quc3BsaWNlKGQuZGVsZWdhdGVDb3VudCsrLDAsYyk6ZC5wdXNoKGMpLFQuZXZlbnQuZ2xvYmFsW2hdPSEwKX0scmVtb3ZlOmZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG8sYSxzLHUsbCxjLGYsZCxoLHAsZyx2PUouaGFzRGF0YShlKSYmSi5nZXQoZSk7aWYodiYmKHU9di5ldmVudHMpKXtmb3IobD0odD0odHx8IiIpLm1hdGNoKCQpfHxbIiJdKS5sZW5ndGg7bC0tOylpZihoPWc9KHM9VGUuZXhlYyh0W2xdKXx8W10pWzFdLHA9KHNbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxoKXtmb3IoZj1ULmV2ZW50LnNwZWNpYWxbaF18fHt9LGQ9dVtoPShyP2YuZGVsZWdhdGVUeXBlOmYuYmluZFR5cGUpfHxoXXx8W10scz1zWzJdJiZuZXcgUmVnRXhwKCIoXnxcXC4pIitwLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpLGE9bz1kLmxlbmd0aDtvLS07KWM9ZFtvXSwhaSYmZyE9PWMub3JpZ1R5cGV8fG4mJm4uZ3VpZCE9PWMuZ3VpZHx8cyYmIXMudGVzdChjLm5hbWVzcGFjZSl8fHImJnIhPT1jLnNlbGVjdG9yJiYoIioqIiE9PXJ8fCFjLnNlbGVjdG9yKXx8KGQuc3BsaWNlKG8sMSksYy5zZWxlY3RvciYmZC5kZWxlZ2F0ZUNvdW50LS0sZi5yZW1vdmUmJmYucmVtb3ZlLmNhbGwoZSxjKSk7YSYmIWQubGVuZ3RoJiYoZi50ZWFyZG93biYmITEhPT1mLnRlYXJkb3duLmNhbGwoZSxwLHYuaGFuZGxlKXx8VC5yZW1vdmVFdmVudChlLGgsdi5oYW5kbGUpLGRlbGV0ZSB1W2hdKX1lbHNlIGZvcihoIGluIHUpVC5ldmVudC5yZW1vdmUoZSxoK3RbbF0sbixyLCEwKTtULmlzRW1wdHlPYmplY3QodSkmJkoucmVtb3ZlKGUsImhhbmRsZSBldmVudHMiKX19LGRpc3BhdGNoOmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpLG8sYSxzPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKSx1PVQuZXZlbnQuZml4KGUpLGw9KEouZ2V0KHRoaXMsImV2ZW50cyIpfHxPYmplY3QuY3JlYXRlKG51bGwpKVt1LnR5cGVdfHxbXSxjPVQuZXZlbnQuc3BlY2lhbFt1LnR5cGVdfHx7fTtmb3Ioc1swXT11LHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXNbdF09YXJndW1lbnRzW3RdO2lmKHUuZGVsZWdhdGVUYXJnZXQ9dGhpcywhYy5wcmVEaXNwYXRjaHx8ITEhPT1jLnByZURpc3BhdGNoLmNhbGwodGhpcyx1KSl7Zm9yKGE9VC5ldmVudC5oYW5kbGVycy5jYWxsKHRoaXMsdSxsKSx0PTA7KGk9YVt0KytdKSYmIXUuaXNQcm9wYWdhdGlvblN0b3BwZWQoKTspZm9yKHUuY3VycmVudFRhcmdldD1pLmVsZW0sbj0wOyhvPWkuaGFuZGxlcnNbbisrXSkmJiF1LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCk7KXUucm5hbWVzcGFjZSYmITEhPT1vLm5hbWVzcGFjZSYmIXUucm5hbWVzcGFjZS50ZXN0KG8ubmFtZXNwYWNlKXx8KHUuaGFuZGxlT2JqPW8sdS5kYXRhPW8uZGF0YSx2b2lkIDAhPT0ocj0oKFQuZXZlbnQuc3BlY2lhbFtvLm9yaWdUeXBlXXx8e30pLmhhbmRsZXx8by5oYW5kbGVyKS5hcHBseShpLmVsZW0scykpJiYhMT09PSh1LnJlc3VsdD1yKSYmKHUucHJldmVudERlZmF1bHQoKSx1LnN0b3BQcm9wYWdhdGlvbigpKSk7cmV0dXJuIGMucG9zdERpc3BhdGNoJiZjLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsdSksdS5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLGEscz1bXSx1PXQuZGVsZWdhdGVDb3VudCxsPWUudGFyZ2V0O2lmKHUmJmwubm9kZVR5cGUmJiEoImNsaWNrIj09PWUudHlwZSYmZS5idXR0b24+PTEpKWZvcig7bCE9PXRoaXM7bD1sLnBhcmVudE5vZGV8fHRoaXMpaWYoMT09PWwubm9kZVR5cGUmJigiY2xpY2siIT09ZS50eXBlfHwhMCE9PWwuZGlzYWJsZWQpKXtmb3Iobz1bXSxhPXt9LG49MDtuPHU7bisrKXZvaWQgMD09PWFbaT0ocj10W25dKS5zZWxlY3RvcisiICJdJiYoYVtpXT1yLm5lZWRzQ29udGV4dD9UKGksdGhpcykuaW5kZXgobCk+LTE6VC5maW5kKGksdGhpcyxudWxsLFtsXSkubGVuZ3RoKSxhW2ldJiZvLnB1c2gocik7by5sZW5ndGgmJnMucHVzaCh7ZWxlbTpsLGhhbmRsZXJzOm99KX1yZXR1cm4gbD10aGlzLHU8dC5sZW5ndGgmJnMucHVzaCh7ZWxlbTpsLGhhbmRsZXJzOnQuc2xpY2UodSl9KSxzfSxhZGRQcm9wOmZ1bmN0aW9uKGUsdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KFQuRXZlbnQucHJvdG90eXBlLGUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDptKHQpP2Z1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiB0KHRoaXMub3JpZ2luYWxFdmVudCl9OmZ1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiB0aGlzLm9yaWdpbmFsRXZlbnRbZV19LHNldDpmdW5jdGlvbih0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxlLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp0fSl9fSl9LGZpeDpmdW5jdGlvbihlKXtyZXR1cm4gZVtULmV4cGFuZG9dP2U6bmV3IFQuRXZlbnQoZSl9LHNwZWNpYWw6e2xvYWQ6e25vQnViYmxlOiEwfSxjbGljazp7c2V0dXA6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpc3x8ZTtyZXR1cm4gZ2UudGVzdCh0LnR5cGUpJiZ0LmNsaWNrJiZOKHQsImlucHV0IikmJkFlKHQsImNsaWNrIixFZSksITF9LHRyaWdnZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpc3x8ZTtyZXR1cm4gZ2UudGVzdCh0LnR5cGUpJiZ0LmNsaWNrJiZOKHQsImlucHV0IikmJkFlKHQsImNsaWNrIiksITB9LF9kZWZhdWx0OmZ1bmN0aW9uKGUpe3ZhciB0PWUudGFyZ2V0O3JldHVybiBnZS50ZXN0KHQudHlwZSkmJnQuY2xpY2smJk4odCwiaW5wdXQiKSYmSi5nZXQodCwiY2xpY2siKXx8Tih0LCJhIil9fSxiZWZvcmV1bmxvYWQ6e3Bvc3REaXNwYXRjaDpmdW5jdGlvbihlKXt2b2lkIDAhPT1lLnJlc3VsdCYmZS5vcmlnaW5hbEV2ZW50JiYoZS5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlPWUucmVzdWx0KX19fX0sVC5yZW1vdmVFdmVudD1mdW5jdGlvbihlLHQsbil7ZS5yZW1vdmVFdmVudExpc3RlbmVyJiZlLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxuKX0sVC5FdmVudD1mdW5jdGlvbihlLHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFQuRXZlbnQpKXJldHVybiBuZXcgVC5FdmVudChlLHQpO2UmJmUudHlwZT8odGhpcy5vcmlnaW5hbEV2ZW50PWUsdGhpcy50eXBlPWUudHlwZSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1lLmRlZmF1bHRQcmV2ZW50ZWR8fHZvaWQgMD09PWUuZGVmYXVsdFByZXZlbnRlZCYmITE9PT1lLnJldHVyblZhbHVlP0VlOkNlLHRoaXMudGFyZ2V0PWUudGFyZ2V0JiYzPT09ZS50YXJnZXQubm9kZVR5cGU/ZS50YXJnZXQucGFyZW50Tm9kZTplLnRhcmdldCx0aGlzLmN1cnJlbnRUYXJnZXQ9ZS5jdXJyZW50VGFyZ2V0LHRoaXMucmVsYXRlZFRhcmdldD1lLnJlbGF0ZWRUYXJnZXQpOnRoaXMudHlwZT1lLHQmJlQuZXh0ZW5kKHRoaXMsdCksdGhpcy50aW1lU3RhbXA9ZSYmZS50aW1lU3RhbXB8fERhdGUubm93KCksdGhpc1tULmV4cGFuZG9dPSEwfSxULkV2ZW50LnByb3RvdHlwZT17Y29uc3RydWN0b3I6VC5FdmVudCxpc0RlZmF1bHRQcmV2ZW50ZWQ6Q2UsaXNQcm9wYWdhdGlvblN0b3BwZWQ6Q2UsaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6Q2UsaXNTaW11bGF0ZWQ6ITEscHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9RWUsZSYmIXRoaXMuaXNTaW11bGF0ZWQmJmUucHJldmVudERlZmF1bHQoKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9RWUsZSYmIXRoaXMuaXNTaW11bGF0ZWQmJmUuc3RvcFByb3BhZ2F0aW9uKCl9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPUVlLGUmJiF0aGlzLmlzU2ltdWxhdGVkJiZlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLHRoaXMuc3RvcFByb3BhZ2F0aW9uKCl9fSxULmVhY2goe2FsdEtleTohMCxidWJibGVzOiEwLGNhbmNlbGFibGU6ITAsY2hhbmdlZFRvdWNoZXM6ITAsY3RybEtleTohMCxkZXRhaWw6ITAsZXZlbnRQaGFzZTohMCxtZXRhS2V5OiEwLHBhZ2VYOiEwLHBhZ2VZOiEwLHNoaWZ0S2V5OiEwLHZpZXc6ITAsY2hhcjohMCxjb2RlOiEwLGNoYXJDb2RlOiEwLGtleTohMCxrZXlDb2RlOiEwLGJ1dHRvbjohMCxidXR0b25zOiEwLGNsaWVudFg6ITAsY2xpZW50WTohMCxvZmZzZXRYOiEwLG9mZnNldFk6ITAscG9pbnRlcklkOiEwLHBvaW50ZXJUeXBlOiEwLHNjcmVlblg6ITAsc2NyZWVuWTohMCx0YXJnZXRUb3VjaGVzOiEwLHRvRWxlbWVudDohMCx0b3VjaGVzOiEwLHdoaWNoOiEwfSxULmV2ZW50LmFkZFByb3ApLFQuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sKGZ1bmN0aW9uKGUsdCl7VC5ldmVudC5zcGVjaWFsW2VdPXtzZXR1cDpmdW5jdGlvbigpe3JldHVybiBBZSh0aGlzLGUsU2UpLCExfSx0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIEFlKHRoaXMsZSksITB9LF9kZWZhdWx0OmZ1bmN0aW9uKHQpe3JldHVybiBKLmdldCh0LnRhcmdldCxlKX0sZGVsZWdhdGVUeXBlOnR9fSkpLFQuZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCIscG9pbnRlcmVudGVyOiJwb2ludGVyb3ZlciIscG9pbnRlcmxlYXZlOiJwb2ludGVyb3V0In0sKGZ1bmN0aW9uKGUsdCl7VC5ldmVudC5zcGVjaWFsW2VdPXtkZWxlZ2F0ZVR5cGU6dCxiaW5kVHlwZTp0LGhhbmRsZTpmdW5jdGlvbihlKXt2YXIgbixyPXRoaXMsaT1lLnJlbGF0ZWRUYXJnZXQsbz1lLmhhbmRsZU9iajtyZXR1cm4gaSYmKGk9PT1yfHxULmNvbnRhaW5zKHIsaSkpfHwoZS50eXBlPW8ub3JpZ1R5cGUsbj1vLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGUudHlwZT10KSxufX19KSksVC5mbi5leHRlbmQoe29uOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBrZSh0aGlzLGUsdCxuLHIpfSxvbmU6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIGtlKHRoaXMsZSx0LG4sciwxKX0sb2ZmOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpO2lmKGUmJmUucHJldmVudERlZmF1bHQmJmUuaGFuZGxlT2JqKXJldHVybiByPWUuaGFuZGxlT2JqLFQoZS5kZWxlZ2F0ZVRhcmdldCkub2ZmKHIubmFtZXNwYWNlP3Iub3JpZ1R5cGUrIi4iK3IubmFtZXNwYWNlOnIub3JpZ1R5cGUsci5zZWxlY3RvcixyLmhhbmRsZXIpLHRoaXM7aWYoIm9iamVjdCI9PXR5cGVvZiBlKXtmb3IoaSBpbiBlKXRoaXMub2ZmKGksdCxlW2ldKTtyZXR1cm4gdGhpc31yZXR1cm4hMSE9PXQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0fHwobj10LHQ9dm9pZCAwKSwhMT09PW4mJihuPUNlKSx0aGlzLmVhY2goKGZ1bmN0aW9uKCl7VC5ldmVudC5yZW1vdmUodGhpcyxlLG4sdCl9KSl9fSk7dmFyIE5lPS88c2NyaXB0fDxzdHlsZXw8bGluay9pLERlPS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLGplPS9eXHMqPCFcW0NEQVRBXFt8XF1cXT5ccyokL2c7ZnVuY3Rpb24gT2UoZSx0KXtyZXR1cm4gTihlLCJ0YWJsZSIpJiZOKDExIT09dC5ub2RlVHlwZT90OnQuZmlyc3RDaGlsZCwidHIiKSYmVChlKS5jaGlsZHJlbigidGJvZHkiKVswXXx8ZX1mdW5jdGlvbiBMZShlKXtyZXR1cm4gZS50eXBlPShudWxsIT09ZS5nZXRBdHRyaWJ1dGUoInR5cGUiKSkrIi8iK2UudHlwZSxlfWZ1bmN0aW9uIEllKGUpe3JldHVybiJ0cnVlLyI9PT0oZS50eXBlfHwiIikuc2xpY2UoMCw1KT9lLnR5cGU9ZS50eXBlLnNsaWNlKDUpOmUucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksZX1mdW5jdGlvbiBSZShlLHQpe3ZhciBuLHIsaSxvLGEscztpZigxPT09dC5ub2RlVHlwZSl7aWYoSi5oYXNEYXRhKGUpJiYocz1KLmdldChlKS5ldmVudHMpKWZvcihpIGluIEoucmVtb3ZlKHQsImhhbmRsZSBldmVudHMiKSxzKWZvcihuPTAscj1zW2ldLmxlbmd0aDtuPHI7bisrKVQuZXZlbnQuYWRkKHQsaSxzW2ldW25dKTtHLmhhc0RhdGEoZSkmJihvPUcuYWNjZXNzKGUpLGE9VC5leHRlbmQoe30sbyksRy5zZXQodCxhKSl9fWZ1bmN0aW9uIFBlKGUsdCl7dmFyIG49dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOyJpbnB1dCI9PT1uJiZnZS50ZXN0KGUudHlwZSk/dC5jaGVja2VkPWUuY2hlY2tlZDoiaW5wdXQiIT09biYmInRleHRhcmVhIiE9PW58fCh0LmRlZmF1bHRWYWx1ZT1lLmRlZmF1bHRWYWx1ZSl9ZnVuY3Rpb24gJGUoZSx0LG4scil7dD11KHQpO3ZhciBpLG8sYSxzLGwsYyxmPTAsZD1lLmxlbmd0aCxoPWQtMSxwPXRbMF0sZz1tKHApO2lmKGd8fGQ+MSYmInN0cmluZyI9PXR5cGVvZiBwJiYhdi5jaGVja0Nsb25lJiZEZS50ZXN0KHApKXJldHVybiBlLmVhY2goKGZ1bmN0aW9uKGkpe3ZhciBvPWUuZXEoaSk7ZyYmKHRbMF09cC5jYWxsKHRoaXMsaSxvLmh0bWwoKSkpLCRlKG8sdCxuLHIpfSkpO2lmKGQmJihvPShpPXhlKHQsZVswXS5vd25lckRvY3VtZW50LCExLGUscikpLmZpcnN0Q2hpbGQsMT09PWkuY2hpbGROb2Rlcy5sZW5ndGgmJihpPW8pLG98fHIpKXtmb3Iocz0oYT1ULm1hcChiZShpLCJzY3JpcHQiKSxMZSkpLmxlbmd0aDtmPGQ7ZisrKWw9aSxmIT09aCYmKGw9VC5jbG9uZShsLCEwLCEwKSxzJiZULm1lcmdlKGEsYmUobCwic2NyaXB0IikpKSxuLmNhbGwoZVtmXSxsLGYpO2lmKHMpZm9yKGM9YVthLmxlbmd0aC0xXS5vd25lckRvY3VtZW50LFQubWFwKGEsSWUpLGY9MDtmPHM7ZisrKWw9YVtmXSxtZS50ZXN0KGwudHlwZXx8IiIpJiYhSi5hY2Nlc3MobCwiZ2xvYmFsRXZhbCIpJiZULmNvbnRhaW5zKGMsbCkmJihsLnNyYyYmIm1vZHVsZSIhPT0obC50eXBlfHwiIikudG9Mb3dlckNhc2UoKT9ULl9ldmFsVXJsJiYhbC5ub01vZHVsZSYmVC5fZXZhbFVybChsLnNyYyx7bm9uY2U6bC5ub25jZXx8bC5nZXRBdHRyaWJ1dGUoIm5vbmNlIil9LGMpOncobC50ZXh0Q29udGVudC5yZXBsYWNlKGplLCIiKSxsLGMpKX1yZXR1cm4gZX1mdW5jdGlvbiBCZShlLHQsbil7Zm9yKHZhciByLGk9dD9ULmZpbHRlcih0LGUpOmUsbz0wO251bGwhPShyPWlbb10pO28rKylufHwxIT09ci5ub2RlVHlwZXx8VC5jbGVhbkRhdGEoYmUocikpLHIucGFyZW50Tm9kZSYmKG4mJmFlKHIpJiZfZShiZShyLCJzY3JpcHQiKSksci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHIpKTtyZXR1cm4gZX1ULmV4dGVuZCh7aHRtbFByZWZpbHRlcjpmdW5jdGlvbihlKXtyZXR1cm4gZX0sY2xvbmU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhLHM9ZS5jbG9uZU5vZGUoITApLHU9YWUoZSk7aWYoISh2Lm5vQ2xvbmVDaGVja2VkfHwxIT09ZS5ub2RlVHlwZSYmMTEhPT1lLm5vZGVUeXBlfHxULmlzWE1MRG9jKGUpKSlmb3IoYT1iZShzKSxyPTAsaT0obz1iZShlKSkubGVuZ3RoO3I8aTtyKyspUGUob1tyXSxhW3JdKTtpZih0KWlmKG4pZm9yKG89b3x8YmUoZSksYT1hfHxiZShzKSxyPTAsaT1vLmxlbmd0aDtyPGk7cisrKVJlKG9bcl0sYVtyXSk7ZWxzZSBSZShlLHMpO3JldHVybihhPWJlKHMsInNjcmlwdCIpKS5sZW5ndGg+MCYmX2UoYSwhdSYmYmUoZSwic2NyaXB0IikpLHN9LGNsZWFuRGF0YTpmdW5jdGlvbihlKXtmb3IodmFyIHQsbixyLGk9VC5ldmVudC5zcGVjaWFsLG89MDt2b2lkIDAhPT0obj1lW29dKTtvKyspaWYoWChuKSl7aWYodD1uW0ouZXhwYW5kb10pe2lmKHQuZXZlbnRzKWZvcihyIGluIHQuZXZlbnRzKWlbcl0/VC5ldmVudC5yZW1vdmUobixyKTpULnJlbW92ZUV2ZW50KG4scix0LmhhbmRsZSk7bltKLmV4cGFuZG9dPXZvaWQgMH1uW0cuZXhwYW5kb10mJihuW0cuZXhwYW5kb109dm9pZCAwKX19fSksVC5mbi5leHRlbmQoe2RldGFjaDpmdW5jdGlvbihlKXtyZXR1cm4gQmUodGhpcyxlLCEwKX0scmVtb3ZlOmZ1bmN0aW9uKGUpe3JldHVybiBCZSh0aGlzLGUpfSx0ZXh0OmZ1bmN0aW9uKGUpe3JldHVybiBVKHRoaXMsKGZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lP1QudGV4dCh0aGlzKTp0aGlzLmVtcHR5KCkuZWFjaCgoZnVuY3Rpb24oKXsxIT09dGhpcy5ub2RlVHlwZSYmMTEhPT10aGlzLm5vZGVUeXBlJiY5IT09dGhpcy5ub2RlVHlwZXx8KHRoaXMudGV4dENvbnRlbnQ9ZSl9KSl9KSxudWxsLGUsYXJndW1lbnRzLmxlbmd0aCl9LGFwcGVuZDpmdW5jdGlvbigpe3JldHVybiAkZSh0aGlzLGFyZ3VtZW50cywoZnVuY3Rpb24oZSl7MSE9PXRoaXMubm9kZVR5cGUmJjExIT09dGhpcy5ub2RlVHlwZSYmOSE9PXRoaXMubm9kZVR5cGV8fE9lKHRoaXMsZSkuYXBwZW5kQ2hpbGQoZSl9KSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gJGUodGhpcyxhcmd1bWVudHMsKGZ1bmN0aW9uKGUpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgdD1PZSh0aGlzLGUpO3QuaW5zZXJ0QmVmb3JlKGUsdC5maXJzdENoaWxkKX19KSl9LGJlZm9yZTpmdW5jdGlvbigpe3JldHVybiAkZSh0aGlzLGFyZ3VtZW50cywoZnVuY3Rpb24oZSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsdGhpcyl9KSl9LGFmdGVyOmZ1bmN0aW9uKCl7cmV0dXJuICRlKHRoaXMsYXJndW1lbnRzLChmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzLm5leHRTaWJsaW5nKX0pKX0sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIGUsdD0wO251bGwhPShlPXRoaXNbdF0pO3QrKykxPT09ZS5ub2RlVHlwZSYmKFQuY2xlYW5EYXRhKGJlKGUsITEpKSxlLnRleHRDb250ZW50PSIiKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1udWxsIT1lJiZlLHQ9bnVsbD09dD9lOnQsdGhpcy5tYXAoKGZ1bmN0aW9uKCl7cmV0dXJuIFQuY2xvbmUodGhpcyxlLHQpfSkpfSxodG1sOmZ1bmN0aW9uKGUpe3JldHVybiBVKHRoaXMsKGZ1bmN0aW9uKGUpe3ZhciB0PXRoaXNbMF18fHt9LG49MCxyPXRoaXMubGVuZ3RoO2lmKHZvaWQgMD09PWUmJjE9PT10Lm5vZGVUeXBlKXJldHVybiB0LmlubmVySFRNTDtpZigic3RyaW5nIj09dHlwZW9mIGUmJiFOZS50ZXN0KGUpJiYheWVbKHZlLmV4ZWMoZSl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCldKXtlPVQuaHRtbFByZWZpbHRlcihlKTt0cnl7Zm9yKDtuPHI7bisrKTE9PT0odD10aGlzW25dfHx7fSkubm9kZVR5cGUmJihULmNsZWFuRGF0YShiZSh0LCExKSksdC5pbm5lckhUTUw9ZSk7dD0wfWNhdGNoKGUpe319dCYmdGhpcy5lbXB0eSgpLmFwcGVuZChlKX0pLG51bGwsZSxhcmd1bWVudHMubGVuZ3RoKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24oKXt2YXIgZT1bXTtyZXR1cm4gJGUodGhpcyxhcmd1bWVudHMsKGZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMucGFyZW50Tm9kZTtULmluQXJyYXkodGhpcyxlKTwwJiYoVC5jbGVhbkRhdGEoYmUodGhpcykpLG4mJm4ucmVwbGFjZUNoaWxkKHQsdGhpcykpfSksZSl9fSksVC5lYWNoKHthcHBlbmRUbzoiYXBwZW5kIixwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRoIn0sKGZ1bmN0aW9uKGUsdCl7VC5mbltlXT1mdW5jdGlvbihlKXtmb3IodmFyIG4scj1bXSxpPVQoZSksbz1pLmxlbmd0aC0xLGE9MDthPD1vO2ErKyluPWE9PT1vP3RoaXM6dGhpcy5jbG9uZSghMCksVChpW2FdKVt0XShuKSxsLmFwcGx5KHIsbi5nZXQoKSk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHIpfX0pKTt2YXIgcWU9bmV3IFJlZ0V4cCgiXigiK25lKyIpKD8hcHgpW2EteiVdKyQiLCJpIiksTWU9L14tLS8sSGU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O3JldHVybiB0JiZ0Lm9wZW5lcnx8KHQ9biksdC5nZXRDb21wdXRlZFN0eWxlKGUpfSxGZT1mdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPXt9O2ZvcihpIGluIHQpb1tpXT1lLnN0eWxlW2ldLGUuc3R5bGVbaV09dFtpXTtmb3IoaSBpbiByPW4uY2FsbChlKSx0KWUuc3R5bGVbaV09b1tpXTtyZXR1cm4gcn0sV2U9bmV3IFJlZ0V4cChpZS5qb2luKCJ8IiksImkiKSxVZT1uZXcgUmVnRXhwKCJeW1xceDIwXFx0XFxyXFxuXFxmXSt8KCg/Ol58W15cXFxcXSkoPzpcXFxcLikqKVtcXHgyMFxcdFxcclxcblxcZl0rJCIsImciKTtmdW5jdGlvbiB6ZShlLHQsbil7dmFyIHIsaSxvLGEscz1NZS50ZXN0KHQpLHU9ZS5zdHlsZTtyZXR1cm4obj1ufHxIZShlKSkmJihhPW4uZ2V0UHJvcGVydHlWYWx1ZSh0KXx8blt0XSxzJiZhJiYoYT1hLnJlcGxhY2UoVWUsIiQxIil8fHZvaWQgMCksIiIhPT1hfHxhZShlKXx8KGE9VC5zdHlsZShlLHQpKSwhdi5waXhlbEJveFN0eWxlcygpJiZxZS50ZXN0KGEpJiZXZS50ZXN0KHQpJiYocj11LndpZHRoLGk9dS5taW5XaWR0aCxvPXUubWF4V2lkdGgsdS5taW5XaWR0aD11Lm1heFdpZHRoPXUud2lkdGg9YSxhPW4ud2lkdGgsdS53aWR0aD1yLHUubWluV2lkdGg9aSx1Lm1heFdpZHRoPW8pKSx2b2lkIDAhPT1hP2ErIiI6YX1mdW5jdGlvbiBRZShlLHQpe3JldHVybntnZXQ6ZnVuY3Rpb24oKXtpZighZSgpKXJldHVybih0aGlzLmdldD10KS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7ZGVsZXRlIHRoaXMuZ2V0fX19IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe2lmKGMpe2wuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDt3aWR0aDo2MHB4O21hcmdpbi10b3A6MXB4O3BhZGRpbmc6MDtib3JkZXI6MCIsYy5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpzY3JvbGw7bWFyZ2luOmF1dG87Ym9yZGVyOjFweDtwYWRkaW5nOjFweDt3aWR0aDo2MCU7dG9wOjElIixvZS5hcHBlbmRDaGlsZChsKS5hcHBlbmRDaGlsZChjKTt2YXIgZT1uLmdldENvbXB1dGVkU3R5bGUoYyk7cj0iMSUiIT09ZS50b3AsdT0xMj09PXQoZS5tYXJnaW5MZWZ0KSxjLnN0eWxlLnJpZ2h0PSI2MCUiLGE9MzY9PT10KGUucmlnaHQpLGk9MzY9PT10KGUud2lkdGgpLGMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixvPTEyPT09dChjLm9mZnNldFdpZHRoLzMpLG9lLnJlbW92ZUNoaWxkKGwpLGM9bnVsbH19ZnVuY3Rpb24gdChlKXtyZXR1cm4gTWF0aC5yb3VuZChwYXJzZUZsb2F0KGUpKX12YXIgcixpLG8sYSxzLHUsbD1iLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9Yi5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLnN0eWxlJiYoYy5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iY29udGVudC1ib3giLGMuY2xvbmVOb2RlKCEwKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iIix2LmNsZWFyQ2xvbmVTdHlsZT0iY29udGVudC1ib3giPT09Yy5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCxULmV4dGVuZCh2LHtib3hTaXppbmdSZWxpYWJsZTpmdW5jdGlvbigpe3JldHVybiBlKCksaX0scGl4ZWxCb3hTdHlsZXM6ZnVuY3Rpb24oKXtyZXR1cm4gZSgpLGF9LHBpeGVsUG9zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gZSgpLHJ9LHJlbGlhYmxlTWFyZ2luTGVmdDpmdW5jdGlvbigpe3JldHVybiBlKCksdX0sc2Nyb2xsYm94U2l6ZTpmdW5jdGlvbigpe3JldHVybiBlKCksb30scmVsaWFibGVUckRpbWVuc2lvbnM6ZnVuY3Rpb24oKXt2YXIgZSx0LHIsaTtyZXR1cm4gbnVsbD09cyYmKGU9Yi5jcmVhdGVFbGVtZW50KCJ0YWJsZSIpLHQ9Yi5jcmVhdGVFbGVtZW50KCJ0ciIpLHI9Yi5jcmVhdGVFbGVtZW50KCJkaXYiKSxlLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTExMTExcHg7Ym9yZGVyLWNvbGxhcHNlOnNlcGFyYXRlIix0LnN0eWxlLmNzc1RleHQ9ImJvcmRlcjoxcHggc29saWQiLHQuc3R5bGUuaGVpZ2h0PSIxcHgiLHIuc3R5bGUuaGVpZ2h0PSI5cHgiLHIuc3R5bGUuZGlzcGxheT0iYmxvY2siLG9lLmFwcGVuZENoaWxkKGUpLmFwcGVuZENoaWxkKHQpLmFwcGVuZENoaWxkKHIpLGk9bi5nZXRDb21wdXRlZFN0eWxlKHQpLHM9cGFyc2VJbnQoaS5oZWlnaHQsMTApK3BhcnNlSW50KGkuYm9yZGVyVG9wV2lkdGgsMTApK3BhcnNlSW50KGkuYm9yZGVyQm90dG9tV2lkdGgsMTApPT09dC5vZmZzZXRIZWlnaHQsb2UucmVtb3ZlQ2hpbGQoZSkpLHN9fSkpfSgpO3ZhciBWZT1bIldlYmtpdCIsIk1veiIsIm1zIl0sS2U9Yi5jcmVhdGVFbGVtZW50KCJkaXYiKS5zdHlsZSxYZT17fTtmdW5jdGlvbiBZZShlKXt2YXIgdD1ULmNzc1Byb3BzW2VdfHxYZVtlXTtyZXR1cm4gdHx8KGUgaW4gS2U/ZTpYZVtlXT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9ZVswXS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSksbj1WZS5sZW5ndGg7bi0tOylpZigoZT1WZVtuXSt0KWluIEtlKXJldHVybiBlfShlKXx8ZSl9dmFyIEplPS9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyxHZT17cG9zaXRpb246ImFic29sdXRlIix2aXNpYmlsaXR5OiJoaWRkZW4iLGRpc3BsYXk6ImJsb2NrIn0sWmU9e2xldHRlclNwYWNpbmc6IjAiLGZvbnRXZWlnaHQ6IjQwMCJ9O2Z1bmN0aW9uIGV0KGUsdCxuKXt2YXIgcj1yZS5leGVjKHQpO3JldHVybiByP01hdGgubWF4KDAsclsyXS0obnx8MCkpKyhyWzNdfHwicHgiKTp0fWZ1bmN0aW9uIHR0KGUsdCxuLHIsaSxvKXt2YXIgYT0id2lkdGgiPT09dD8xOjAscz0wLHU9MDtpZihuPT09KHI/ImJvcmRlciI6ImNvbnRlbnQiKSlyZXR1cm4gMDtmb3IoO2E8NDthKz0yKSJtYXJnaW4iPT09biYmKHUrPVQuY3NzKGUsbitpZVthXSwhMCxpKSkscj8oImNvbnRlbnQiPT09biYmKHUtPVQuY3NzKGUsInBhZGRpbmciK2llW2FdLCEwLGkpKSwibWFyZ2luIiE9PW4mJih1LT1ULmNzcyhlLCJib3JkZXIiK2llW2FdKyJXaWR0aCIsITAsaSkpKToodSs9VC5jc3MoZSwicGFkZGluZyIraWVbYV0sITAsaSksInBhZGRpbmciIT09bj91Kz1ULmNzcyhlLCJib3JkZXIiK2llW2FdKyJXaWR0aCIsITAsaSk6cys9VC5jc3MoZSwiYm9yZGVyIitpZVthXSsiV2lkdGgiLCEwLGkpKTtyZXR1cm4hciYmbz49MCYmKHUrPU1hdGgubWF4KDAsTWF0aC5jZWlsKGVbIm9mZnNldCIrdFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSldLW8tdS1zLS41KSl8fDApLHV9ZnVuY3Rpb24gbnQoZSx0LG4pe3ZhciByPUhlKGUpLGk9KCF2LmJveFNpemluZ1JlbGlhYmxlKCl8fG4pJiYiYm9yZGVyLWJveCI9PT1ULmNzcyhlLCJib3hTaXppbmciLCExLHIpLG89aSxhPXplKGUsdCxyKSxzPSJvZmZzZXQiK3RbMF0udG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpO2lmKHFlLnRlc3QoYSkpe2lmKCFuKXJldHVybiBhO2E9ImF1dG8ifXJldHVybighdi5ib3hTaXppbmdSZWxpYWJsZSgpJiZpfHwhdi5yZWxpYWJsZVRyRGltZW5zaW9ucygpJiZOKGUsInRyIil8fCJhdXRvIj09PWF8fCFwYXJzZUZsb2F0KGEpJiYiaW5saW5lIj09PVQuY3NzKGUsImRpc3BsYXkiLCExLHIpKSYmZS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCYmKGk9ImJvcmRlci1ib3giPT09VC5jc3MoZSwiYm94U2l6aW5nIiwhMSxyKSwobz1zIGluIGUpJiYoYT1lW3NdKSksKGE9cGFyc2VGbG9hdChhKXx8MCkrdHQoZSx0LG58fChpPyJib3JkZXIiOiJjb250ZW50IiksbyxyLGEpKyJweCJ9ZnVuY3Rpb24gcnQoZSx0LG4scixpKXtyZXR1cm4gbmV3IHJ0LnByb3RvdHlwZS5pbml0KGUsdCxuLHIsaSl9VC5leHRlbmQoe2Nzc0hvb2tzOntvcGFjaXR5OntnZXQ6ZnVuY3Rpb24oZSx0KXtpZih0KXt2YXIgbj16ZShlLCJvcGFjaXR5Iik7cmV0dXJuIiI9PT1uPyIxIjpufX19fSxjc3NOdW1iZXI6e2FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiEwLGNvbHVtbkNvdW50OiEwLGZpbGxPcGFjaXR5OiEwLGZsZXhHcm93OiEwLGZsZXhTaHJpbms6ITAsZm9udFdlaWdodDohMCxncmlkQXJlYTohMCxncmlkQ29sdW1uOiEwLGdyaWRDb2x1bW5FbmQ6ITAsZ3JpZENvbHVtblN0YXJ0OiEwLGdyaWRSb3c6ITAsZ3JpZFJvd0VuZDohMCxncmlkUm93U3RhcnQ6ITAsbGluZUhlaWdodDohMCxvcGFjaXR5OiEwLG9yZGVyOiEwLG9ycGhhbnM6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwfSxjc3NQcm9wczp7fSxzdHlsZTpmdW5jdGlvbihlLHQsbixyKXtpZihlJiYzIT09ZS5ub2RlVHlwZSYmOCE9PWUubm9kZVR5cGUmJmUuc3R5bGUpe3ZhciBpLG8sYSxzPUsodCksdT1NZS50ZXN0KHQpLGw9ZS5zdHlsZTtpZih1fHwodD1ZZShzKSksYT1ULmNzc0hvb2tzW3RdfHxULmNzc0hvb2tzW3NdLHZvaWQgMD09PW4pcmV0dXJuIGEmJiJnZXQiaW4gYSYmdm9pZCAwIT09KGk9YS5nZXQoZSwhMSxyKSk/aTpsW3RdOyJzdHJpbmciPT09KG89dHlwZW9mIG4pJiYoaT1yZS5leGVjKG4pKSYmaVsxXSYmKG49bGUoZSx0LGkpLG89Im51bWJlciIpLG51bGwhPW4mJm49PW4mJigibnVtYmVyIiE9PW98fHV8fChuKz1pJiZpWzNdfHwoVC5jc3NOdW1iZXJbc10/IiI6InB4IikpLHYuY2xlYXJDbG9uZVN0eWxlfHwiIiE9PW58fDAhPT10LmluZGV4T2YoImJhY2tncm91bmQiKXx8KGxbdF09ImluaGVyaXQiKSxhJiYic2V0ImluIGEmJnZvaWQgMD09PShuPWEuc2V0KGUsbixyKSl8fCh1P2wuc2V0UHJvcGVydHkodCxuKTpsW3RdPW4pKX19LGNzczpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscz1LKHQpO3JldHVybiBNZS50ZXN0KHQpfHwodD1ZZShzKSksKGE9VC5jc3NIb29rc1t0XXx8VC5jc3NIb29rc1tzXSkmJiJnZXQiaW4gYSYmKGk9YS5nZXQoZSwhMCxuKSksdm9pZCAwPT09aSYmKGk9emUoZSx0LHIpKSwibm9ybWFsIj09PWkmJnQgaW4gWmUmJihpPVplW3RdKSwiIj09PW58fG4/KG89cGFyc2VGbG9hdChpKSwhMD09PW58fGlzRmluaXRlKG8pP298fDA6aSk6aX19KSxULmVhY2goWyJoZWlnaHQiLCJ3aWR0aCJdLChmdW5jdGlvbihlLHQpe1QuY3NzSG9va3NbdF09e2dldDpmdW5jdGlvbihlLG4scil7aWYobilyZXR1cm4hSmUudGVzdChULmNzcyhlLCJkaXNwbGF5IikpfHxlLmdldENsaWVudFJlY3RzKCkubGVuZ3RoJiZlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoP250KGUsdCxyKTpGZShlLEdlLChmdW5jdGlvbigpe3JldHVybiBudChlLHQscil9KSl9LHNldDpmdW5jdGlvbihlLG4scil7dmFyIGksbz1IZShlKSxhPSF2LnNjcm9sbGJveFNpemUoKSYmImFic29sdXRlIj09PW8ucG9zaXRpb24scz0oYXx8cikmJiJib3JkZXItYm94Ij09PVQuY3NzKGUsImJveFNpemluZyIsITEsbyksdT1yP3R0KGUsdCxyLHMsbyk6MDtyZXR1cm4gcyYmYSYmKHUtPU1hdGguY2VpbChlWyJvZmZzZXQiK3RbMF0udG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpXS1wYXJzZUZsb2F0KG9bdF0pLXR0KGUsdCwiYm9yZGVyIiwhMSxvKS0uNSkpLHUmJihpPXJlLmV4ZWMobikpJiYicHgiIT09KGlbM118fCJweCIpJiYoZS5zdHlsZVt0XT1uLG49VC5jc3MoZSx0KSksZXQoMCxuLHUpfX19KSksVC5jc3NIb29rcy5tYXJnaW5MZWZ0PVFlKHYucmVsaWFibGVNYXJnaW5MZWZ0LChmdW5jdGlvbihlLHQpe2lmKHQpcmV0dXJuKHBhcnNlRmxvYXQoemUoZSwibWFyZ2luTGVmdCIpKXx8ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0LUZlKGUse21hcmdpbkxlZnQ6MH0sKGZ1bmN0aW9uKCl7cmV0dXJuIGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdH0pKSkrInB4In0pKSxULmVhY2goe21hcmdpbjoiIixwYWRkaW5nOiIiLGJvcmRlcjoiV2lkdGgifSwoZnVuY3Rpb24oZSx0KXtULmNzc0hvb2tzW2UrdF09e2V4cGFuZDpmdW5jdGlvbihuKXtmb3IodmFyIHI9MCxpPXt9LG89InN0cmluZyI9PXR5cGVvZiBuP24uc3BsaXQoIiAiKTpbbl07cjw0O3IrKylpW2UraWVbcl0rdF09b1tyXXx8b1tyLTJdfHxvWzBdO3JldHVybiBpfX0sIm1hcmdpbiIhPT1lJiYoVC5jc3NIb29rc1tlK3RdLnNldD1ldCl9KSksVC5mbi5leHRlbmQoe2NzczpmdW5jdGlvbihlLHQpe3JldHVybiBVKHRoaXMsKGZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89e30sYT0wO2lmKEFycmF5LmlzQXJyYXkodCkpe2ZvcihyPUhlKGUpLGk9dC5sZW5ndGg7YTxpO2ErKylvW3RbYV1dPVQuY3NzKGUsdFthXSwhMSxyKTtyZXR1cm4gb31yZXR1cm4gdm9pZCAwIT09bj9ULnN0eWxlKGUsdCxuKTpULmNzcyhlLHQpfSksZSx0LGFyZ3VtZW50cy5sZW5ndGg+MSl9fSksVC5Ud2Vlbj1ydCxydC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnJ0LGluaXQ6ZnVuY3Rpb24oZSx0LG4scixpLG8pe3RoaXMuZWxlbT1lLHRoaXMucHJvcD1uLHRoaXMuZWFzaW5nPWl8fFQuZWFzaW5nLl9kZWZhdWx0LHRoaXMub3B0aW9ucz10LHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD1yLHRoaXMudW5pdD1vfHwoVC5jc3NOdW1iZXJbbl0/IiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciBlPXJ0LnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiBlJiZlLmdldD9lLmdldCh0aGlzKTpydC5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24oZSl7dmFyIHQsbj1ydC5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5vcHRpb25zLmR1cmF0aW9uP3RoaXMucG9zPXQ9VC5lYXNpbmdbdGhpcy5lYXNpbmddKGUsdGhpcy5vcHRpb25zLmR1cmF0aW9uKmUsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6dGhpcy5wb3M9dD1lLHRoaXMubm93PSh0aGlzLmVuZC10aGlzLnN0YXJ0KSp0K3RoaXMuc3RhcnQsdGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLG4mJm4uc2V0P24uc2V0KHRoaXMpOnJ0LnByb3BIb29rcy5fZGVmYXVsdC5zZXQodGhpcyksdGhpc319LHJ0LnByb3RvdHlwZS5pbml0LnByb3RvdHlwZT1ydC5wcm90b3R5cGUscnQucHJvcEhvb2tzPXtfZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiAxIT09ZS5lbGVtLm5vZGVUeXBlfHxudWxsIT1lLmVsZW1bZS5wcm9wXSYmbnVsbD09ZS5lbGVtLnN0eWxlW2UucHJvcF0/ZS5lbGVtW2UucHJvcF06KHQ9VC5jc3MoZS5lbGVtLGUucHJvcCwiIikpJiYiYXV0byIhPT10P3Q6MH0sc2V0OmZ1bmN0aW9uKGUpe1QuZnguc3RlcFtlLnByb3BdP1QuZnguc3RlcFtlLnByb3BdKGUpOjEhPT1lLmVsZW0ubm9kZVR5cGV8fCFULmNzc0hvb2tzW2UucHJvcF0mJm51bGw9PWUuZWxlbS5zdHlsZVtZZShlLnByb3ApXT9lLmVsZW1bZS5wcm9wXT1lLm5vdzpULnN0eWxlKGUuZWxlbSxlLnByb3AsZS5ub3crZS51bml0KX19fSxydC5wcm9wSG9va3Muc2Nyb2xsVG9wPXJ0LnByb3BIb29rcy5zY3JvbGxMZWZ0PXtzZXQ6ZnVuY3Rpb24oZSl7ZS5lbGVtLm5vZGVUeXBlJiZlLmVsZW0ucGFyZW50Tm9kZSYmKGUuZWxlbVtlLnByb3BdPWUubm93KX19LFQuZWFzaW5nPXtsaW5lYXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LHN3aW5nOmZ1bmN0aW9uKGUpe3JldHVybi41LU1hdGguY29zKGUqTWF0aC5QSSkvMn0sX2RlZmF1bHQ6InN3aW5nIn0sVC5meD1ydC5wcm90b3R5cGUuaW5pdCxULmZ4LnN0ZXA9e307dmFyIGl0LG90LGF0PS9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyxzdD0vcXVldWVIb29rcyQvO2Z1bmN0aW9uIHV0KCl7b3QmJighMT09PWIuaGlkZGVuJiZuLnJlcXVlc3RBbmltYXRpb25GcmFtZT9uLnJlcXVlc3RBbmltYXRpb25GcmFtZSh1dCk6bi5zZXRUaW1lb3V0KHV0LFQuZnguaW50ZXJ2YWwpLFQuZngudGljaygpKX1mdW5jdGlvbiBsdCgpe3JldHVybiBuLnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7aXQ9dm9pZCAwfSkpLGl0PURhdGUubm93KCl9ZnVuY3Rpb24gY3QoZSx0KXt2YXIgbixyPTAsaT17aGVpZ2h0OmV9O2Zvcih0PXQ/MTowO3I8NDtyKz0yLXQpaVsibWFyZ2luIisobj1pZVtyXSldPWlbInBhZGRpbmciK25dPWU7cmV0dXJuIHQmJihpLm9wYWNpdHk9aS53aWR0aD1lKSxpfWZ1bmN0aW9uIGZ0KGUsdCxuKXtmb3IodmFyIHIsaT0oZHQudHdlZW5lcnNbdF18fFtdKS5jb25jYXQoZHQudHdlZW5lcnNbIioiXSksbz0wLGE9aS5sZW5ndGg7bzxhO28rKylpZihyPWlbb10uY2FsbChuLHQsZSkpcmV0dXJuIHJ9ZnVuY3Rpb24gZHQoZSx0LG4pe3ZhciByLGksbz0wLGE9ZHQucHJlZmlsdGVycy5sZW5ndGgscz1ULkRlZmVycmVkKCkuYWx3YXlzKChmdW5jdGlvbigpe2RlbGV0ZSB1LmVsZW19KSksdT1mdW5jdGlvbigpe2lmKGkpcmV0dXJuITE7Zm9yKHZhciB0PWl0fHxsdCgpLG49TWF0aC5tYXgoMCxsLnN0YXJ0VGltZStsLmR1cmF0aW9uLXQpLHI9MS0obi9sLmR1cmF0aW9ufHwwKSxvPTAsYT1sLnR3ZWVucy5sZW5ndGg7bzxhO28rKylsLnR3ZWVuc1tvXS5ydW4ocik7cmV0dXJuIHMubm90aWZ5V2l0aChlLFtsLHIsbl0pLHI8MSYmYT9uOihhfHxzLm5vdGlmeVdpdGgoZSxbbCwxLDBdKSxzLnJlc29sdmVXaXRoKGUsW2xdKSwhMSl9LGw9cy5wcm9taXNlKHtlbGVtOmUscHJvcHM6VC5leHRlbmQoe30sdCksb3B0czpULmV4dGVuZCghMCx7c3BlY2lhbEVhc2luZzp7fSxlYXNpbmc6VC5lYXNpbmcuX2RlZmF1bHR9LG4pLG9yaWdpbmFsUHJvcGVydGllczp0LG9yaWdpbmFsT3B0aW9uczpuLHN0YXJ0VGltZTppdHx8bHQoKSxkdXJhdGlvbjpuLmR1cmF0aW9uLHR3ZWVuczpbXSxjcmVhdGVUd2VlbjpmdW5jdGlvbih0LG4pe3ZhciByPVQuVHdlZW4oZSxsLm9wdHMsdCxuLGwub3B0cy5zcGVjaWFsRWFzaW5nW3RdfHxsLm9wdHMuZWFzaW5nKTtyZXR1cm4gbC50d2VlbnMucHVzaChyKSxyfSxzdG9wOmZ1bmN0aW9uKHQpe3ZhciBuPTAscj10P2wudHdlZW5zLmxlbmd0aDowO2lmKGkpcmV0dXJuIHRoaXM7Zm9yKGk9ITA7bjxyO24rKylsLnR3ZWVuc1tuXS5ydW4oMSk7cmV0dXJuIHQ/KHMubm90aWZ5V2l0aChlLFtsLDEsMF0pLHMucmVzb2x2ZVdpdGgoZSxbbCx0XSkpOnMucmVqZWN0V2l0aChlLFtsLHRdKSx0aGlzfX0pLGM9bC5wcm9wcztmb3IoIWZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG8sYTtmb3IobiBpbiBlKWlmKGk9dFtyPUsobildLG89ZVtuXSxBcnJheS5pc0FycmF5KG8pJiYoaT1vWzFdLG89ZVtuXT1vWzBdKSxuIT09ciYmKGVbcl09byxkZWxldGUgZVtuXSksKGE9VC5jc3NIb29rc1tyXSkmJiJleHBhbmQiaW4gYSlmb3IobiBpbiBvPWEuZXhwYW5kKG8pLGRlbGV0ZSBlW3JdLG8pbiBpbiBlfHwoZVtuXT1vW25dLHRbbl09aSk7ZWxzZSB0W3JdPWl9KGMsbC5vcHRzLnNwZWNpYWxFYXNpbmcpO288YTtvKyspaWYocj1kdC5wcmVmaWx0ZXJzW29dLmNhbGwobCxlLGMsbC5vcHRzKSlyZXR1cm4gbShyLnN0b3ApJiYoVC5fcXVldWVIb29rcyhsLmVsZW0sbC5vcHRzLnF1ZXVlKS5zdG9wPXIuc3RvcC5iaW5kKHIpKSxyO3JldHVybiBULm1hcChjLGZ0LGwpLG0obC5vcHRzLnN0YXJ0KSYmbC5vcHRzLnN0YXJ0LmNhbGwoZSxsKSxsLnByb2dyZXNzKGwub3B0cy5wcm9ncmVzcykuZG9uZShsLm9wdHMuZG9uZSxsLm9wdHMuY29tcGxldGUpLmZhaWwobC5vcHRzLmZhaWwpLmFsd2F5cyhsLm9wdHMuYWx3YXlzKSxULmZ4LnRpbWVyKFQuZXh0ZW5kKHUse2VsZW06ZSxhbmltOmwscXVldWU6bC5vcHRzLnF1ZXVlfSkpLGx9VC5BbmltYXRpb249VC5leHRlbmQoZHQse3R3ZWVuZXJzOnsiKiI6W2Z1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5jcmVhdGVUd2VlbihlLHQpO3JldHVybiBsZShuLmVsZW0sZSxyZS5leGVjKHQpLG4pLG59XX0sdHdlZW5lcjpmdW5jdGlvbihlLHQpe20oZSk/KHQ9ZSxlPVsiKiJdKTplPWUubWF0Y2goJCk7Zm9yKHZhciBuLHI9MCxpPWUubGVuZ3RoO3I8aTtyKyspbj1lW3JdLGR0LnR3ZWVuZXJzW25dPWR0LnR3ZWVuZXJzW25dfHxbXSxkdC50d2VlbmVyc1tuXS51bnNoaWZ0KHQpfSxwcmVmaWx0ZXJzOltmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscyx1LGwsYyxmPSJ3aWR0aCJpbiB0fHwiaGVpZ2h0ImluIHQsZD10aGlzLGg9e30scD1lLnN0eWxlLGc9ZS5ub2RlVHlwZSYmdWUoZSksdj1KLmdldChlLCJmeHNob3ciKTtmb3IociBpbiBuLnF1ZXVlfHwobnVsbD09KGE9VC5fcXVldWVIb29rcyhlLCJmeCIpKS51bnF1ZXVlZCYmKGEudW5xdWV1ZWQ9MCxzPWEuZW1wdHkuZmlyZSxhLmVtcHR5LmZpcmU9ZnVuY3Rpb24oKXthLnVucXVldWVkfHxzKCl9KSxhLnVucXVldWVkKyssZC5hbHdheXMoKGZ1bmN0aW9uKCl7ZC5hbHdheXMoKGZ1bmN0aW9uKCl7YS51bnF1ZXVlZC0tLFQucXVldWUoZSwiZngiKS5sZW5ndGh8fGEuZW1wdHkuZmlyZSgpfSkpfSkpKSx0KWlmKGk9dFtyXSxhdC50ZXN0KGkpKXtpZihkZWxldGUgdFtyXSxvPW98fCJ0b2dnbGUiPT09aSxpPT09KGc/ImhpZGUiOiJzaG93Iikpe2lmKCJzaG93IiE9PWl8fCF2fHx2b2lkIDA9PT12W3JdKWNvbnRpbnVlO2c9ITB9aFtyXT12JiZ2W3JdfHxULnN0eWxlKGUscil9aWYoKHU9IVQuaXNFbXB0eU9iamVjdCh0KSl8fCFULmlzRW1wdHlPYmplY3QoaCkpZm9yKHIgaW4gZiYmMT09PWUubm9kZVR5cGUmJihuLm92ZXJmbG93PVtwLm92ZXJmbG93LHAub3ZlcmZsb3dYLHAub3ZlcmZsb3dZXSxudWxsPT0obD12JiZ2LmRpc3BsYXkpJiYobD1KLmdldChlLCJkaXNwbGF5IikpLCJub25lIj09PShjPVQuY3NzKGUsImRpc3BsYXkiKSkmJihsP2M9bDooZGUoW2VdLCEwKSxsPWUuc3R5bGUuZGlzcGxheXx8bCxjPVQuY3NzKGUsImRpc3BsYXkiKSxkZShbZV0pKSksKCJpbmxpbmUiPT09Y3x8ImlubGluZS1ibG9jayI9PT1jJiZudWxsIT1sKSYmIm5vbmUiPT09VC5jc3MoZSwiZmxvYXQiKSYmKHV8fChkLmRvbmUoKGZ1bmN0aW9uKCl7cC5kaXNwbGF5PWx9KSksbnVsbD09bCYmKGM9cC5kaXNwbGF5LGw9Im5vbmUiPT09Yz8iIjpjKSkscC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSksbi5vdmVyZmxvdyYmKHAub3ZlcmZsb3c9ImhpZGRlbiIsZC5hbHdheXMoKGZ1bmN0aW9uKCl7cC5vdmVyZmxvdz1uLm92ZXJmbG93WzBdLHAub3ZlcmZsb3dYPW4ub3ZlcmZsb3dbMV0scC5vdmVyZmxvd1k9bi5vdmVyZmxvd1syXX0pKSksdT0hMSxoKXV8fCh2PyJoaWRkZW4iaW4gdiYmKGc9di5oaWRkZW4pOnY9Si5hY2Nlc3MoZSwiZnhzaG93Iix7ZGlzcGxheTpsfSksbyYmKHYuaGlkZGVuPSFnKSxnJiZkZShbZV0sITApLGQuZG9uZSgoZnVuY3Rpb24oKXtmb3IociBpbiBnfHxkZShbZV0pLEoucmVtb3ZlKGUsImZ4c2hvdyIpLGgpVC5zdHlsZShlLHIsaFtyXSl9KSkpLHU9ZnQoZz92W3JdOjAscixkKSxyIGluIHZ8fCh2W3JdPXUuc3RhcnQsZyYmKHUuZW5kPXUuc3RhcnQsdS5zdGFydD0wKSl9XSxwcmVmaWx0ZXI6ZnVuY3Rpb24oZSx0KXt0P2R0LnByZWZpbHRlcnMudW5zaGlmdChlKTpkdC5wcmVmaWx0ZXJzLnB1c2goZSl9fSksVC5zcGVlZD1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZSYmIm9iamVjdCI9PXR5cGVvZiBlP1QuZXh0ZW5kKHt9LGUpOntjb21wbGV0ZTpufHwhbiYmdHx8bShlKSYmZSxkdXJhdGlvbjplLGVhc2luZzpuJiZ0fHx0JiYhbSh0KSYmdH07cmV0dXJuIFQuZngub2ZmP3IuZHVyYXRpb249MDoibnVtYmVyIiE9dHlwZW9mIHIuZHVyYXRpb24mJihyLmR1cmF0aW9uIGluIFQuZnguc3BlZWRzP3IuZHVyYXRpb249VC5meC5zcGVlZHNbci5kdXJhdGlvbl06ci5kdXJhdGlvbj1ULmZ4LnNwZWVkcy5fZGVmYXVsdCksbnVsbCE9ci5xdWV1ZSYmITAhPT1yLnF1ZXVlfHwoci5xdWV1ZT0iZngiKSxyLm9sZD1yLmNvbXBsZXRlLHIuY29tcGxldGU9ZnVuY3Rpb24oKXttKHIub2xkKSYmci5vbGQuY2FsbCh0aGlzKSxyLnF1ZXVlJiZULmRlcXVldWUodGhpcyxyLnF1ZXVlKX0scn0sVC5mbi5leHRlbmQoe2ZhZGVUbzpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5maWx0ZXIodWUpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6dH0sZSxuLHIpfSxhbmltYXRlOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPVQuaXNFbXB0eU9iamVjdChlKSxvPVQuc3BlZWQodCxuLHIpLGE9ZnVuY3Rpb24oKXt2YXIgdD1kdCh0aGlzLFQuZXh0ZW5kKHt9LGUpLG8pOyhpfHxKLmdldCh0aGlzLCJmaW5pc2giKSkmJnQuc3RvcCghMCl9O3JldHVybiBhLmZpbmlzaD1hLGl8fCExPT09by5xdWV1ZT90aGlzLmVhY2goYSk6dGhpcy5xdWV1ZShvLnF1ZXVlLGEpfSxzdG9wOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1mdW5jdGlvbihlKXt2YXIgdD1lLnN0b3A7ZGVsZXRlIGUuc3RvcCx0KG4pfTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGUmJihuPXQsdD1lLGU9dm9pZCAwKSx0JiZ0aGlzLnF1ZXVlKGV8fCJmeCIsW10pLHRoaXMuZWFjaCgoZnVuY3Rpb24oKXt2YXIgdD0hMCxpPW51bGwhPWUmJmUrInF1ZXVlSG9va3MiLG89VC50aW1lcnMsYT1KLmdldCh0aGlzKTtpZihpKWFbaV0mJmFbaV0uc3RvcCYmcihhW2ldKTtlbHNlIGZvcihpIGluIGEpYVtpXSYmYVtpXS5zdG9wJiZzdC50ZXN0KGkpJiZyKGFbaV0pO2ZvcihpPW8ubGVuZ3RoO2ktLTspb1tpXS5lbGVtIT09dGhpc3x8bnVsbCE9ZSYmb1tpXS5xdWV1ZSE9PWV8fChvW2ldLmFuaW0uc3RvcChuKSx0PSExLG8uc3BsaWNlKGksMSkpOyF0JiZufHxULmRlcXVldWUodGhpcyxlKX0pKX0sZmluaXNoOmZ1bmN0aW9uKGUpe3JldHVybiExIT09ZSYmKGU9ZXx8ImZ4IiksdGhpcy5lYWNoKChmdW5jdGlvbigpe3ZhciB0LG49Si5nZXQodGhpcykscj1uW2UrInF1ZXVlIl0saT1uW2UrInF1ZXVlSG9va3MiXSxvPVQudGltZXJzLGE9cj9yLmxlbmd0aDowO2ZvcihuLmZpbmlzaD0hMCxULnF1ZXVlKHRoaXMsZSxbXSksaSYmaS5zdG9wJiZpLnN0b3AuY2FsbCh0aGlzLCEwKSx0PW8ubGVuZ3RoO3QtLTspb1t0XS5lbGVtPT09dGhpcyYmb1t0XS5xdWV1ZT09PWUmJihvW3RdLmFuaW0uc3RvcCghMCksby5zcGxpY2UodCwxKSk7Zm9yKHQ9MDt0PGE7dCsrKXJbdF0mJnJbdF0uZmluaXNoJiZyW3RdLmZpbmlzaC5jYWxsKHRoaXMpO2RlbGV0ZSBuLmZpbmlzaH0pKX19KSxULmVhY2goWyJ0b2dnbGUiLCJzaG93IiwiaGlkZSJdLChmdW5jdGlvbihlLHQpe3ZhciBuPVQuZm5bdF07VC5mblt0XT1mdW5jdGlvbihlLHIsaSl7cmV0dXJuIG51bGw9PWV8fCJib29sZWFuIj09dHlwZW9mIGU/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hbmltYXRlKGN0KHQsITApLGUscixpKX19KSksVC5lYWNoKHtzbGlkZURvd246Y3QoInNob3ciKSxzbGlkZVVwOmN0KCJoaWRlIiksc2xpZGVUb2dnbGU6Y3QoInRvZ2dsZSIpLGZhZGVJbjp7b3BhY2l0eToic2hvdyJ9LGZhZGVPdXQ6e29wYWNpdHk6ImhpZGUifSxmYWRlVG9nZ2xlOntvcGFjaXR5OiJ0b2dnbGUifX0sKGZ1bmN0aW9uKGUsdCl7VC5mbltlXT1mdW5jdGlvbihlLG4scil7cmV0dXJuIHRoaXMuYW5pbWF0ZSh0LGUsbixyKX19KSksVC50aW1lcnM9W10sVC5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIGUsdD0wLG49VC50aW1lcnM7Zm9yKGl0PURhdGUubm93KCk7dDxuLmxlbmd0aDt0KyspKGU9blt0XSkoKXx8blt0XSE9PWV8fG4uc3BsaWNlKHQtLSwxKTtuLmxlbmd0aHx8VC5meC5zdG9wKCksaXQ9dm9pZCAwfSxULmZ4LnRpbWVyPWZ1bmN0aW9uKGUpe1QudGltZXJzLnB1c2goZSksVC5meC5zdGFydCgpfSxULmZ4LmludGVydmFsPTEzLFQuZnguc3RhcnQ9ZnVuY3Rpb24oKXtvdHx8KG90PSEwLHV0KCkpfSxULmZ4LnN0b3A9ZnVuY3Rpb24oKXtvdD1udWxsfSxULmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxULmZuLmRlbGF5PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9VC5meCYmVC5meC5zcGVlZHNbZV18fGUsdD10fHwiZngiLHRoaXMucXVldWUodCwoZnVuY3Rpb24odCxyKXt2YXIgaT1uLnNldFRpbWVvdXQodCxlKTtyLnN0b3A9ZnVuY3Rpb24oKXtuLmNsZWFyVGltZW91dChpKX19KSl9LGZ1bmN0aW9uKCl7dmFyIGU9Yi5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLHQ9Yi5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKS5hcHBlbmRDaGlsZChiLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKTtlLnR5cGU9ImNoZWNrYm94Iix2LmNoZWNrT249IiIhPT1lLnZhbHVlLHYub3B0U2VsZWN0ZWQ9dC5zZWxlY3RlZCwoZT1iLmNyZWF0ZUVsZW1lbnQoImlucHV0IikpLnZhbHVlPSJ0IixlLnR5cGU9InJhZGlvIix2LnJhZGlvVmFsdWU9InQiPT09ZS52YWx1ZX0oKTt2YXIgaHQscHQ9VC5leHByLmF0dHJIYW5kbGU7VC5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gVSh0aGlzLFQuYXR0cixlLHQsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKChmdW5jdGlvbigpe1QucmVtb3ZlQXR0cih0aGlzLGUpfSkpfX0pLFQuZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89ZS5ub2RlVHlwZTtpZigzIT09byYmOCE9PW8mJjIhPT1vKXJldHVybiB2b2lkIDA9PT1lLmdldEF0dHJpYnV0ZT9ULnByb3AoZSx0LG4pOigxPT09byYmVC5pc1hNTERvYyhlKXx8KGk9VC5hdHRySG9va3NbdC50b0xvd2VyQ2FzZSgpXXx8KFQuZXhwci5tYXRjaC5ib29sLnRlc3QodCk/aHQ6dm9pZCAwKSksdm9pZCAwIT09bj9udWxsPT09bj92b2lkIFQucmVtb3ZlQXR0cihlLHQpOmkmJiJzZXQiaW4gaSYmdm9pZCAwIT09KHI9aS5zZXQoZSxuLHQpKT9yOihlLnNldEF0dHJpYnV0ZSh0LG4rIiIpLG4pOmkmJiJnZXQiaW4gaSYmbnVsbCE9PShyPWkuZ2V0KGUsdCkpP3I6bnVsbD09KHI9VC5maW5kLmF0dHIoZSx0KSk/dm9pZCAwOnIpfSxhdHRySG9va3M6e3R5cGU6e3NldDpmdW5jdGlvbihlLHQpe2lmKCF2LnJhZGlvVmFsdWUmJiJyYWRpbyI9PT10JiZOKGUsImlucHV0Iikpe3ZhciBuPWUudmFsdWU7cmV0dXJuIGUuc2V0QXR0cmlidXRlKCJ0eXBlIix0KSxuJiYoZS52YWx1ZT1uKSx0fX19fSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0wLGk9dCYmdC5tYXRjaCgkKTtpZihpJiYxPT09ZS5ub2RlVHlwZSlmb3IoO249aVtyKytdOyllLnJlbW92ZUF0dHJpYnV0ZShuKX19KSxodD17c2V0OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4hMT09PXQ/VC5yZW1vdmVBdHRyKGUsbik6ZS5zZXRBdHRyaWJ1dGUobixuKSxufX0sVC5lYWNoKFQuZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCgvXHcrL2cpLChmdW5jdGlvbihlLHQpe3ZhciBuPXB0W3RdfHxULmZpbmQuYXR0cjtwdFt0XT1mdW5jdGlvbihlLHQscil7dmFyIGksbyxhPXQudG9Mb3dlckNhc2UoKTtyZXR1cm4gcnx8KG89cHRbYV0scHRbYV09aSxpPW51bGwhPW4oZSx0LHIpP2E6bnVsbCxwdFthXT1vKSxpfX0pKTt2YXIgZ3Q9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSx2dD0vXig/OmF8YXJlYSkkL2k7ZnVuY3Rpb24gbXQoZSl7cmV0dXJuKGUubWF0Y2goJCl8fFtdKS5qb2luKCIgIil9ZnVuY3Rpb24geXQoZSl7cmV0dXJuIGUuZ2V0QXR0cmlidXRlJiZlLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiJ9ZnVuY3Rpb24gYnQoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/ZToic3RyaW5nIj09dHlwZW9mIGUmJmUubWF0Y2goJCl8fFtdfVQuZm4uZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIFUodGhpcyxULnByb3AsZSx0LGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaCgoZnVuY3Rpb24oKXtkZWxldGUgdGhpc1tULnByb3BGaXhbZV18fGVdfSkpfX0pLFQuZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89ZS5ub2RlVHlwZTtpZigzIT09byYmOCE9PW8mJjIhPT1vKXJldHVybiAxPT09byYmVC5pc1hNTERvYyhlKXx8KHQ9VC5wcm9wRml4W3RdfHx0LGk9VC5wcm9wSG9va3NbdF0pLHZvaWQgMCE9PW4/aSYmInNldCJpbiBpJiZ2b2lkIDAhPT0ocj1pLnNldChlLG4sdCkpP3I6ZVt0XT1uOmkmJiJnZXQiaW4gaSYmbnVsbCE9PShyPWkuZ2V0KGUsdCkpP3I6ZVt0XX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PVQuZmluZC5hdHRyKGUsInRhYmluZGV4Iik7cmV0dXJuIHQ/cGFyc2VJbnQodCwxMCk6Z3QudGVzdChlLm5vZGVOYW1lKXx8dnQudGVzdChlLm5vZGVOYW1lKSYmZS5ocmVmPzA6LTF9fX0scHJvcEZpeDp7Zm9yOiJodG1sRm9yIixjbGFzczoiY2xhc3NOYW1lIn19KSx2Lm9wdFNlbGVjdGVkfHwoVC5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbihlKXt2YXIgdD1lLnBhcmVudE5vZGU7cmV0dXJuIHQmJnQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsbnVsbH0sc2V0OmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZTt0JiYodC5zZWxlY3RlZEluZGV4LHQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpfX0pLFQuZWFjaChbInRhYkluZGV4IiwicmVhZE9ubHkiLCJtYXhMZW5ndGgiLCJjZWxsU3BhY2luZyIsImNlbGxQYWRkaW5nIiwicm93U3BhbiIsImNvbFNwYW4iLCJ1c2VNYXAiLCJmcmFtZUJvcmRlciIsImNvbnRlbnRFZGl0YWJsZSJdLChmdW5jdGlvbigpe1QucHJvcEZpeFt0aGlzLnRvTG93ZXJDYXNlKCldPXRoaXN9KSksVC5mbi5leHRlbmQoe2FkZENsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpLG8sYTtyZXR1cm4gbShlKT90aGlzLmVhY2goKGZ1bmN0aW9uKHQpe1QodGhpcykuYWRkQ2xhc3MoZS5jYWxsKHRoaXMsdCx5dCh0aGlzKSkpfSkpOih0PWJ0KGUpKS5sZW5ndGg/dGhpcy5lYWNoKChmdW5jdGlvbigpe2lmKHI9eXQodGhpcyksbj0xPT09dGhpcy5ub2RlVHlwZSYmIiAiK210KHIpKyIgIil7Zm9yKG89MDtvPHQubGVuZ3RoO28rKylpPXRbb10sbi5pbmRleE9mKCIgIitpKyIgIik8MCYmKG4rPWkrIiAiKTthPW10KG4pLHIhPT1hJiZ0aGlzLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGEpfX0pKTp0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLGE7cmV0dXJuIG0oZSk/dGhpcy5lYWNoKChmdW5jdGlvbih0KXtUKHRoaXMpLnJlbW92ZUNsYXNzKGUuY2FsbCh0aGlzLHQseXQodGhpcykpKX0pKTphcmd1bWVudHMubGVuZ3RoPyh0PWJ0KGUpKS5sZW5ndGg/dGhpcy5lYWNoKChmdW5jdGlvbigpe2lmKHI9eXQodGhpcyksbj0xPT09dGhpcy5ub2RlVHlwZSYmIiAiK210KHIpKyIgIil7Zm9yKG89MDtvPHQubGVuZ3RoO28rKylmb3IoaT10W29dO24uaW5kZXhPZigiICIraSsiICIpPi0xOyluPW4ucmVwbGFjZSgiICIraSsiICIsIiAiKTthPW10KG4pLHIhPT1hJiZ0aGlzLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGEpfX0pKTp0aGlzOnRoaXMuYXR0cigiY2xhc3MiLCIiKX0sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksbyxhPXR5cGVvZiBlLHM9InN0cmluZyI9PT1hfHxBcnJheS5pc0FycmF5KGUpO3JldHVybiBtKGUpP3RoaXMuZWFjaCgoZnVuY3Rpb24obil7VCh0aGlzKS50b2dnbGVDbGFzcyhlLmNhbGwodGhpcyxuLHl0KHRoaXMpLHQpLHQpfSkpOiJib29sZWFuIj09dHlwZW9mIHQmJnM/dD90aGlzLmFkZENsYXNzKGUpOnRoaXMucmVtb3ZlQ2xhc3MoZSk6KG49YnQoZSksdGhpcy5lYWNoKChmdW5jdGlvbigpe2lmKHMpZm9yKG89VCh0aGlzKSxpPTA7aTxuLmxlbmd0aDtpKyspcj1uW2ldLG8uaGFzQ2xhc3Mocik/by5yZW1vdmVDbGFzcyhyKTpvLmFkZENsYXNzKHIpO2Vsc2Ugdm9pZCAwIT09ZSYmImJvb2xlYW4iIT09YXx8KChyPXl0KHRoaXMpKSYmSi5zZXQodGhpcywiX19jbGFzc05hbWVfXyIsciksdGhpcy5zZXRBdHRyaWJ1dGUmJnRoaXMuc2V0QXR0cmlidXRlKCJjbGFzcyIscnx8ITE9PT1lPyIiOkouZ2V0KHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiIpKX0pKSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj0wO2Zvcih0PSIgIitlKyIgIjtuPXRoaXNbcisrXTspaWYoMT09PW4ubm9kZVR5cGUmJigiICIrbXQoeXQobikpKyIgIikuaW5kZXhPZih0KT4tMSlyZXR1cm4hMDtyZXR1cm4hMX19KTt2YXIgX3Q9L1xyL2c7VC5mbi5leHRlbmQoe3ZhbDpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaT10aGlzWzBdO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW0oZSksdGhpcy5lYWNoKChmdW5jdGlvbihuKXt2YXIgaTsxPT09dGhpcy5ub2RlVHlwZSYmKG51bGw9PShpPXI/ZS5jYWxsKHRoaXMsbixUKHRoaXMpLnZhbCgpKTplKT9pPSIiOiJudW1iZXIiPT10eXBlb2YgaT9pKz0iIjpBcnJheS5pc0FycmF5KGkpJiYoaT1ULm1hcChpLChmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT8iIjplKyIifSkpKSwodD1ULnZhbEhvb2tzW3RoaXMudHlwZV18fFQudmFsSG9va3NbdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSkmJiJzZXQiaW4gdCYmdm9pZCAwIT09dC5zZXQodGhpcyxpLCJ2YWx1ZSIpfHwodGhpcy52YWx1ZT1pKSl9KSkpOmk/KHQ9VC52YWxIb29rc1tpLnR5cGVdfHxULnZhbEhvb2tzW2kubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pJiYiZ2V0ImluIHQmJnZvaWQgMCE9PShuPXQuZ2V0KGksInZhbHVlIikpP246InN0cmluZyI9PXR5cGVvZihuPWkudmFsdWUpP24ucmVwbGFjZShfdCwiIik6bnVsbD09bj8iIjpuOnZvaWQgMH19KSxULmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PVQuZmluZC5hdHRyKGUsInZhbHVlIik7cmV0dXJuIG51bGwhPXQ/dDptdChULnRleHQoZSkpfX0sc2VsZWN0OntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGk9ZS5vcHRpb25zLG89ZS5zZWxlY3RlZEluZGV4LGE9InNlbGVjdC1vbmUiPT09ZS50eXBlLHM9YT9udWxsOltdLHU9YT9vKzE6aS5sZW5ndGg7Zm9yKHI9bzwwP3U6YT9vOjA7cjx1O3IrKylpZigoKG49aVtyXSkuc2VsZWN0ZWR8fHI9PT1vKSYmIW4uZGlzYWJsZWQmJighbi5wYXJlbnROb2RlLmRpc2FibGVkfHwhTihuLnBhcmVudE5vZGUsIm9wdGdyb3VwIikpKXtpZih0PVQobikudmFsKCksYSlyZXR1cm4gdDtzLnB1c2godCl9cmV0dXJuIHN9LHNldDpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbixyLGk9ZS5vcHRpb25zLG89VC5tYWtlQXJyYXkodCksYT1pLmxlbmd0aDthLS07KSgocj1pW2FdKS5zZWxlY3RlZD1ULmluQXJyYXkoVC52YWxIb29rcy5vcHRpb24uZ2V0KHIpLG8pPi0xKSYmKG49ITApO3JldHVybiBufHwoZS5zZWxlY3RlZEluZGV4PS0xKSxvfX19fSksVC5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLChmdW5jdGlvbigpe1QudmFsSG9va3NbdGhpc109e3NldDpmdW5jdGlvbihlLHQpe2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIGUuY2hlY2tlZD1ULmluQXJyYXkoVChlKS52YWwoKSx0KT4tMX19LHYuY2hlY2tPbnx8KFQudmFsSG9va3NbdGhpc10uZ2V0PWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT09ZS5nZXRBdHRyaWJ1dGUoInZhbHVlIik/Im9uIjplLnZhbHVlfSl9KSksdi5mb2N1c2luPSJvbmZvY3VzaW4iaW4gbjt2YXIgd3Q9L14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLHh0PWZ1bmN0aW9uKGUpe2Uuc3RvcFByb3BhZ2F0aW9uKCl9O1QuZXh0ZW5kKFQuZXZlbnQse3RyaWdnZXI6ZnVuY3Rpb24oZSx0LHIsaSl7dmFyIG8sYSxzLHUsbCxjLGYsZCxwPVtyfHxiXSxnPWguY2FsbChlLCJ0eXBlIik/ZS50eXBlOmUsdj1oLmNhbGwoZSwibmFtZXNwYWNlIik/ZS5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZihhPWQ9cz1yPXJ8fGIsMyE9PXIubm9kZVR5cGUmJjghPT1yLm5vZGVUeXBlJiYhd3QudGVzdChnK1QuZXZlbnQudHJpZ2dlcmVkKSYmKGcuaW5kZXhPZigiLiIpPi0xJiYodj1nLnNwbGl0KCIuIiksZz12LnNoaWZ0KCksdi5zb3J0KCkpLGw9Zy5pbmRleE9mKCI6Iik8MCYmIm9uIitnLChlPWVbVC5leHBhbmRvXT9lOm5ldyBULkV2ZW50KGcsIm9iamVjdCI9PXR5cGVvZiBlJiZlKSkuaXNUcmlnZ2VyPWk/MjozLGUubmFtZXNwYWNlPXYuam9pbigiLiIpLGUucm5hbWVzcGFjZT1lLm5hbWVzcGFjZT9uZXcgUmVnRXhwKCIoXnxcXC4pIit2LmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpOm51bGwsZS5yZXN1bHQ9dm9pZCAwLGUudGFyZ2V0fHwoZS50YXJnZXQ9ciksdD1udWxsPT10P1tlXTpULm1ha2VBcnJheSh0LFtlXSksZj1ULmV2ZW50LnNwZWNpYWxbZ118fHt9LGl8fCFmLnRyaWdnZXJ8fCExIT09Zi50cmlnZ2VyLmFwcGx5KHIsdCkpKXtpZighaSYmIWYubm9CdWJibGUmJiF5KHIpKXtmb3IodT1mLmRlbGVnYXRlVHlwZXx8Zyx3dC50ZXN0KHUrZyl8fChhPWEucGFyZW50Tm9kZSk7YTthPWEucGFyZW50Tm9kZSlwLnB1c2goYSkscz1hO3M9PT0oci5vd25lckRvY3VtZW50fHxiKSYmcC5wdXNoKHMuZGVmYXVsdFZpZXd8fHMucGFyZW50V2luZG93fHxuKX1mb3Iobz0wOyhhPXBbbysrXSkmJiFlLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7KWQ9YSxlLnR5cGU9bz4xP3U6Zi5iaW5kVHlwZXx8ZywoYz0oSi5nZXQoYSwiZXZlbnRzIil8fE9iamVjdC5jcmVhdGUobnVsbCkpW2UudHlwZV0mJkouZ2V0KGEsImhhbmRsZSIpKSYmYy5hcHBseShhLHQpLChjPWwmJmFbbF0pJiZjLmFwcGx5JiZYKGEpJiYoZS5yZXN1bHQ9Yy5hcHBseShhLHQpLCExPT09ZS5yZXN1bHQmJmUucHJldmVudERlZmF1bHQoKSk7cmV0dXJuIGUudHlwZT1nLGl8fGUuaXNEZWZhdWx0UHJldmVudGVkKCl8fGYuX2RlZmF1bHQmJiExIT09Zi5fZGVmYXVsdC5hcHBseShwLnBvcCgpLHQpfHwhWChyKXx8bCYmbShyW2ddKSYmIXkocikmJigocz1yW2xdKSYmKHJbbF09bnVsbCksVC5ldmVudC50cmlnZ2VyZWQ9ZyxlLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkmJmQuYWRkRXZlbnRMaXN0ZW5lcihnLHh0KSxyW2ddKCksZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpJiZkLnJlbW92ZUV2ZW50TGlzdGVuZXIoZyx4dCksVC5ldmVudC50cmlnZ2VyZWQ9dm9pZCAwLHMmJihyW2xdPXMpKSxlLnJlc3VsdH19LHNpbXVsYXRlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1ULmV4dGVuZChuZXcgVC5FdmVudCxuLHt0eXBlOmUsaXNTaW11bGF0ZWQ6ITB9KTtULmV2ZW50LnRyaWdnZXIocixudWxsLHQpfX0pLFQuZm4uZXh0ZW5kKHt0cmlnZ2VyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZWFjaCgoZnVuY3Rpb24oKXtULmV2ZW50LnRyaWdnZXIoZSx0LHRoaXMpfSkpfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXNbMF07aWYobilyZXR1cm4gVC5ldmVudC50cmlnZ2VyKGUsdCxuLCEwKX19KSx2LmZvY3VzaW58fFQuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sKGZ1bmN0aW9uKGUsdCl7dmFyIG49ZnVuY3Rpb24oZSl7VC5ldmVudC5zaW11bGF0ZSh0LGUudGFyZ2V0LFQuZXZlbnQuZml4KGUpKX07VC5ldmVudC5zcGVjaWFsW3RdPXtzZXR1cDpmdW5jdGlvbigpe3ZhciByPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcy5kb2N1bWVudHx8dGhpcyxpPUouYWNjZXNzKHIsdCk7aXx8ci5hZGRFdmVudExpc3RlbmVyKGUsbiwhMCksSi5hY2Nlc3Mocix0LChpfHwwKSsxKX0sdGVhcmRvd246ZnVuY3Rpb24oKXt2YXIgcj10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMuZG9jdW1lbnR8fHRoaXMsaT1KLmFjY2VzcyhyLHQpLTE7aT9KLmFjY2VzcyhyLHQsaSk6KHIucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLG4sITApLEoucmVtb3ZlKHIsdCkpfX19KSk7dmFyIFR0PW4ubG9jYXRpb24sRXQ9e2d1aWQ6RGF0ZS5ub3coKX0sQ3Q9L1w/LztULnBhcnNlWE1MPWZ1bmN0aW9uKGUpe3ZhciB0LHI7aWYoIWV8fCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gbnVsbDt0cnl7dD0obmV3IG4uRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoZSwidGV4dC94bWwiKX1jYXRjaChlKXt9cmV0dXJuIHI9dCYmdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFyc2VyZXJyb3IiKVswXSx0JiYhcnx8VC5lcnJvcigiSW52YWxpZCBYTUw6ICIrKHI/VC5tYXAoci5jaGlsZE5vZGVzLChmdW5jdGlvbihlKXtyZXR1cm4gZS50ZXh0Q29udGVudH0pKS5qb2luKCJcbiIpOmUpKSx0fTt2YXIgU3Q9L1xbXF0kLyxrdD0vXHI/XG4vZyxBdD0vXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksTnQ9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO2Z1bmN0aW9uIER0KGUsdCxuLHIpe3ZhciBpO2lmKEFycmF5LmlzQXJyYXkodCkpVC5lYWNoKHQsKGZ1bmN0aW9uKHQsaSl7bnx8U3QudGVzdChlKT9yKGUsaSk6RHQoZSsiWyIrKCJvYmplY3QiPT10eXBlb2YgaSYmbnVsbCE9aT90OiIiKSsiXSIsaSxuLHIpfSkpO2Vsc2UgaWYobnx8Im9iamVjdCIhPT14KHQpKXIoZSx0KTtlbHNlIGZvcihpIGluIHQpRHQoZSsiWyIraSsiXSIsdFtpXSxuLHIpfVQucGFyYW09ZnVuY3Rpb24oZSx0KXt2YXIgbixyPVtdLGk9ZnVuY3Rpb24oZSx0KXt2YXIgbj1tKHQpP3QoKTp0O3Jbci5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudChlKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KG51bGw9PW4/IiI6bil9O2lmKG51bGw9PWUpcmV0dXJuIiI7aWYoQXJyYXkuaXNBcnJheShlKXx8ZS5qcXVlcnkmJiFULmlzUGxhaW5PYmplY3QoZSkpVC5lYWNoKGUsKGZ1bmN0aW9uKCl7aSh0aGlzLm5hbWUsdGhpcy52YWx1ZSl9KSk7ZWxzZSBmb3IobiBpbiBlKUR0KG4sZVtuXSx0LGkpO3JldHVybiByLmpvaW4oIiYiKX0sVC5mbi5leHRlbmQoe3NlcmlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiBULnBhcmFtKHRoaXMuc2VyaWFsaXplQXJyYXkoKSl9LHNlcmlhbGl6ZUFycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKChmdW5jdGlvbigpe3ZhciBlPVQucHJvcCh0aGlzLCJlbGVtZW50cyIpO3JldHVybiBlP1QubWFrZUFycmF5KGUpOnRoaXN9KSkuZmlsdGVyKChmdW5jdGlvbigpe3ZhciBlPXRoaXMudHlwZTtyZXR1cm4gdGhpcy5uYW1lJiYhVCh0aGlzKS5pcygiOmRpc2FibGVkIikmJk50LnRlc3QodGhpcy5ub2RlTmFtZSkmJiFBdC50ZXN0KGUpJiYodGhpcy5jaGVja2VkfHwhZ2UudGVzdChlKSl9KSkubWFwKChmdW5jdGlvbihlLHQpe3ZhciBuPVQodGhpcykudmFsKCk7cmV0dXJuIG51bGw9PW4/bnVsbDpBcnJheS5pc0FycmF5KG4pP1QubWFwKG4sKGZ1bmN0aW9uKGUpe3JldHVybntuYW1lOnQubmFtZSx2YWx1ZTplLnJlcGxhY2Uoa3QsIlxyXG4iKX19KSk6e25hbWU6dC5uYW1lLHZhbHVlOm4ucmVwbGFjZShrdCwiXHJcbiIpfX0pKS5nZXQoKX19KTt2YXIganQ9LyUyMC9nLE90PS8jLiokLyxMdD0vKFs/Jl0pXz1bXiZdKi8sSXQ9L14oLio/KTpbIFx0XSooW15cclxuXSopJC9nbSxSdD0vXig/OkdFVHxIRUFEKSQvLFB0PS9eXC9cLy8sJHQ9e30sQnQ9e30scXQ9IiovIi5jb25jYXQoIioiKSxNdD1iLmNyZWF0ZUVsZW1lbnQoImEiKTtmdW5jdGlvbiBIdChlKXtyZXR1cm4gZnVuY3Rpb24odCxuKXsic3RyaW5nIiE9dHlwZW9mIHQmJihuPXQsdD0iKiIpO3ZhciByLGk9MCxvPXQudG9Mb3dlckNhc2UoKS5tYXRjaCgkKXx8W107aWYobShuKSlmb3IoO3I9b1tpKytdOykiKyI9PT1yWzBdPyhyPXIuc2xpY2UoMSl8fCIqIiwoZVtyXT1lW3JdfHxbXSkudW5zaGlmdChuKSk6KGVbcl09ZVtyXXx8W10pLnB1c2gobil9fWZ1bmN0aW9uIEZ0KGUsdCxuLHIpe3ZhciBpPXt9LG89ZT09PUJ0O2Z1bmN0aW9uIGEocyl7dmFyIHU7cmV0dXJuIGlbc109ITAsVC5lYWNoKGVbc118fFtdLChmdW5jdGlvbihlLHMpe3ZhciBsPXModCxuLHIpO3JldHVybiJzdHJpbmciIT10eXBlb2YgbHx8b3x8aVtsXT9vPyEodT1sKTp2b2lkIDA6KHQuZGF0YVR5cGVzLnVuc2hpZnQobCksYShsKSwhMSl9KSksdX1yZXR1cm4gYSh0LmRhdGFUeXBlc1swXSl8fCFpWyIqIl0mJmEoIioiKX1mdW5jdGlvbiBXdChlLHQpe3ZhciBuLHIsaT1ULmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9uc3x8e307Zm9yKG4gaW4gdCl2b2lkIDAhPT10W25dJiYoKGlbbl0/ZTpyfHwocj17fSkpW25dPXRbbl0pO3JldHVybiByJiZULmV4dGVuZCghMCxlLHIpLGV9TXQuaHJlZj1UdC5ocmVmLFQuZXh0ZW5kKHthY3RpdmU6MCxsYXN0TW9kaWZpZWQ6e30sZXRhZzp7fSxhamF4U2V0dGluZ3M6e3VybDpUdC5ocmVmLHR5cGU6IkdFVCIsaXNMb2NhbDovXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLy50ZXN0KFR0LnByb3RvY29sKSxnbG9iYWw6ITAscHJvY2Vzc0RhdGE6ITAsYXN5bmM6ITAsY29udGVudFR5cGU6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIsYWNjZXB0czp7IioiOnF0LHRleHQ6InRleHQvcGxhaW4iLGh0bWw6InRleHQvaHRtbCIseG1sOiJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIixqc29uOiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQifSxjb250ZW50czp7eG1sOi9cYnhtbFxiLyxodG1sOi9cYmh0bWwvLGpzb246L1xianNvblxiL30scmVzcG9uc2VGaWVsZHM6e3htbDoicmVzcG9uc2VYTUwiLHRleHQ6InJlc3BvbnNlVGV4dCIsanNvbjoicmVzcG9uc2VKU09OIn0sY29udmVydGVyczp7IiogdGV4dCI6U3RyaW5nLCJ0ZXh0IGh0bWwiOiEwLCJ0ZXh0IGpzb24iOkpTT04ucGFyc2UsInRleHQgeG1sIjpULnBhcnNlWE1MfSxmbGF0T3B0aW9uczp7dXJsOiEwLGNvbnRleHQ6ITB9fSxhamF4U2V0dXA6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD9XdChXdChlLFQuYWpheFNldHRpbmdzKSx0KTpXdChULmFqYXhTZXR0aW5ncyxlKX0sYWpheFByZWZpbHRlcjpIdCgkdCksYWpheFRyYW5zcG9ydDpIdChCdCksYWpheDpmdW5jdGlvbihlLHQpeyJvYmplY3QiPT10eXBlb2YgZSYmKHQ9ZSxlPXZvaWQgMCksdD10fHx7fTt2YXIgcixpLG8sYSxzLHUsbCxjLGYsZCxoPVQuYWpheFNldHVwKHt9LHQpLHA9aC5jb250ZXh0fHxoLGc9aC5jb250ZXh0JiYocC5ub2RlVHlwZXx8cC5qcXVlcnkpP1QocCk6VC5ldmVudCx2PVQuRGVmZXJyZWQoKSxtPVQuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLHk9aC5zdGF0dXNDb2RlfHx7fSxfPXt9LHc9e30seD0iY2FuY2VsZWQiLEU9e3JlYWR5U3RhdGU6MCxnZXRSZXNwb25zZUhlYWRlcjpmdW5jdGlvbihlKXt2YXIgdDtpZihsKXtpZighYSlmb3IoYT17fTt0PUl0LmV4ZWMobyk7KWFbdFsxXS50b0xvd2VyQ2FzZSgpKyIgIl09KGFbdFsxXS50b0xvd2VyQ2FzZSgpKyIgIl18fFtdKS5jb25jYXQodFsyXSk7dD1hW2UudG9Mb3dlckNhc2UoKSsiICJdfXJldHVybiBudWxsPT10P251bGw6dC5qb2luKCIsICIpfSxnZXRBbGxSZXNwb25zZUhlYWRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gbD9vOm51bGx9LHNldFJlcXVlc3RIZWFkZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbnVsbD09bCYmKGU9d1tlLnRvTG93ZXJDYXNlKCldPXdbZS50b0xvd2VyQ2FzZSgpXXx8ZSxfW2VdPXQpLHRoaXN9LG92ZXJyaWRlTWltZVR5cGU6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWwmJihoLm1pbWVUeXBlPWUpLHRoaXN9LHN0YXR1c0NvZGU6ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoZSlpZihsKUUuYWx3YXlzKGVbRS5zdGF0dXNdKTtlbHNlIGZvcih0IGluIGUpeVt0XT1beVt0XSxlW3RdXTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZXx8eDtyZXR1cm4gciYmci5hYm9ydCh0KSxDKDAsdCksdGhpc319O2lmKHYucHJvbWlzZShFKSxoLnVybD0oKGV8fGgudXJsfHxUdC5ocmVmKSsiIikucmVwbGFjZShQdCxUdC5wcm90b2NvbCsiLy8iKSxoLnR5cGU9dC5tZXRob2R8fHQudHlwZXx8aC5tZXRob2R8fGgudHlwZSxoLmRhdGFUeXBlcz0oaC5kYXRhVHlwZXx8IioiKS50b0xvd2VyQ2FzZSgpLm1hdGNoKCQpfHxbIiJdLG51bGw9PWguY3Jvc3NEb21haW4pe3U9Yi5jcmVhdGVFbGVtZW50KCJhIik7dHJ5e3UuaHJlZj1oLnVybCx1LmhyZWY9dS5ocmVmLGguY3Jvc3NEb21haW49TXQucHJvdG9jb2wrIi8vIitNdC5ob3N0IT11LnByb3RvY29sKyIvLyIrdS5ob3N0fWNhdGNoKGUpe2guY3Jvc3NEb21haW49ITB9fWlmKGguZGF0YSYmaC5wcm9jZXNzRGF0YSYmInN0cmluZyIhPXR5cGVvZiBoLmRhdGEmJihoLmRhdGE9VC5wYXJhbShoLmRhdGEsaC50cmFkaXRpb25hbCkpLEZ0KCR0LGgsdCxFKSxsKXJldHVybiBFO2ZvcihmIGluKGM9VC5ldmVudCYmaC5nbG9iYWwpJiYwPT1ULmFjdGl2ZSsrJiZULmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpLGgudHlwZT1oLnR5cGUudG9VcHBlckNhc2UoKSxoLmhhc0NvbnRlbnQ9IVJ0LnRlc3QoaC50eXBlKSxpPWgudXJsLnJlcGxhY2UoT3QsIiIpLGguaGFzQ29udGVudD9oLmRhdGEmJmgucHJvY2Vzc0RhdGEmJjA9PT0oaC5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiYoaC5kYXRhPWguZGF0YS5yZXBsYWNlKGp0LCIrIikpOihkPWgudXJsLnNsaWNlKGkubGVuZ3RoKSxoLmRhdGEmJihoLnByb2Nlc3NEYXRhfHwic3RyaW5nIj09dHlwZW9mIGguZGF0YSkmJihpKz0oQ3QudGVzdChpKT8iJiI6Ij8iKStoLmRhdGEsZGVsZXRlIGguZGF0YSksITE9PT1oLmNhY2hlJiYoaT1pLnJlcGxhY2UoTHQsIiQxIiksZD0oQ3QudGVzdChpKT8iJiI6Ij8iKSsiXz0iK0V0Lmd1aWQrKytkKSxoLnVybD1pK2QpLGguaWZNb2RpZmllZCYmKFQubGFzdE1vZGlmaWVkW2ldJiZFLnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIixULmxhc3RNb2RpZmllZFtpXSksVC5ldGFnW2ldJiZFLnNldFJlcXVlc3RIZWFkZXIoIklmLU5vbmUtTWF0Y2giLFQuZXRhZ1tpXSkpLChoLmRhdGEmJmguaGFzQ29udGVudCYmITEhPT1oLmNvbnRlbnRUeXBlfHx0LmNvbnRlbnRUeXBlKSYmRS5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLGguY29udGVudFR5cGUpLEUuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IixoLmRhdGFUeXBlc1swXSYmaC5hY2NlcHRzW2guZGF0YVR5cGVzWzBdXT9oLmFjY2VwdHNbaC5kYXRhVHlwZXNbMF1dKygiKiIhPT1oLmRhdGFUeXBlc1swXT8iLCAiK3F0KyI7IHE9MC4wMSI6IiIpOmguYWNjZXB0c1siKiJdKSxoLmhlYWRlcnMpRS5zZXRSZXF1ZXN0SGVhZGVyKGYsaC5oZWFkZXJzW2ZdKTtpZihoLmJlZm9yZVNlbmQmJighMT09PWguYmVmb3JlU2VuZC5jYWxsKHAsRSxoKXx8bCkpcmV0dXJuIEUuYWJvcnQoKTtpZih4PSJhYm9ydCIsbS5hZGQoaC5jb21wbGV0ZSksRS5kb25lKGguc3VjY2VzcyksRS5mYWlsKGguZXJyb3IpLHI9RnQoQnQsaCx0LEUpKXtpZihFLnJlYWR5U3RhdGU9MSxjJiZnLnRyaWdnZXIoImFqYXhTZW5kIixbRSxoXSksbClyZXR1cm4gRTtoLmFzeW5jJiZoLnRpbWVvdXQ+MCYmKHM9bi5zZXRUaW1lb3V0KChmdW5jdGlvbigpe0UuYWJvcnQoInRpbWVvdXQiKX0pLGgudGltZW91dCkpO3RyeXtsPSExLHIuc2VuZChfLEMpfWNhdGNoKGUpe2lmKGwpdGhyb3cgZTtDKC0xLGUpfX1lbHNlIEMoLTEsIk5vIFRyYW5zcG9ydCIpO2Z1bmN0aW9uIEMoZSx0LGEsdSl7dmFyIGYsZCxiLF8sdyx4PXQ7bHx8KGw9ITAscyYmbi5jbGVhclRpbWVvdXQocykscj12b2lkIDAsbz11fHwiIixFLnJlYWR5U3RhdGU9ZT4wPzQ6MCxmPWU+PTIwMCYmZTwzMDB8fDMwND09PWUsYSYmKF89ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcixpLG8sYSxzPWUuY29udGVudHMsdT1lLmRhdGFUeXBlczsiKiI9PT11WzBdOyl1LnNoaWZ0KCksdm9pZCAwPT09ciYmKHI9ZS5taW1lVHlwZXx8dC5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1UeXBlIikpO2lmKHIpZm9yKGkgaW4gcylpZihzW2ldJiZzW2ldLnRlc3Qocikpe3UudW5zaGlmdChpKTticmVha31pZih1WzBdaW4gbilvPXVbMF07ZWxzZXtmb3IoaSBpbiBuKXtpZighdVswXXx8ZS5jb252ZXJ0ZXJzW2krIiAiK3VbMF1dKXtvPWk7YnJlYWt9YXx8KGE9aSl9bz1vfHxhfWlmKG8pcmV0dXJuIG8hPT11WzBdJiZ1LnVuc2hpZnQobyksbltvXX0oaCxFLGEpKSwhZiYmVC5pbkFycmF5KCJzY3JpcHQiLGguZGF0YVR5cGVzKT4tMSYmVC5pbkFycmF5KCJqc29uIixoLmRhdGFUeXBlcyk8MCYmKGguY29udmVydGVyc1sidGV4dCBzY3JpcHQiXT1mdW5jdGlvbigpe30pLF89ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhLHMsdSxsPXt9LGM9ZS5kYXRhVHlwZXMuc2xpY2UoKTtpZihjWzFdKWZvcihhIGluIGUuY29udmVydGVycylsW2EudG9Mb3dlckNhc2UoKV09ZS5jb252ZXJ0ZXJzW2FdO2ZvcihvPWMuc2hpZnQoKTtvOylpZihlLnJlc3BvbnNlRmllbGRzW29dJiYobltlLnJlc3BvbnNlRmllbGRzW29dXT10KSwhdSYmciYmZS5kYXRhRmlsdGVyJiYodD1lLmRhdGFGaWx0ZXIodCxlLmRhdGFUeXBlKSksdT1vLG89Yy5zaGlmdCgpKWlmKCIqIj09PW8pbz11O2Vsc2UgaWYoIioiIT09dSYmdSE9PW8pe2lmKCEoYT1sW3UrIiAiK29dfHxsWyIqICIrb10pKWZvcihpIGluIGwpaWYoKHM9aS5zcGxpdCgiICIpKVsxXT09PW8mJihhPWxbdSsiICIrc1swXV18fGxbIiogIitzWzBdXSkpeyEwPT09YT9hPWxbaV06ITAhPT1sW2ldJiYobz1zWzBdLGMudW5zaGlmdChzWzFdKSk7YnJlYWt9aWYoITAhPT1hKWlmKGEmJmUudGhyb3dzKXQ9YSh0KTtlbHNlIHRyeXt0PWEodCl9Y2F0Y2goZSl7cmV0dXJue3N0YXRlOiJwYXJzZXJlcnJvciIsZXJyb3I6YT9lOiJObyBjb252ZXJzaW9uIGZyb20gIit1KyIgdG8gIitvfX19cmV0dXJue3N0YXRlOiJzdWNjZXNzIixkYXRhOnR9fShoLF8sRSxmKSxmPyhoLmlmTW9kaWZpZWQmJigodz1FLmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIikpJiYoVC5sYXN0TW9kaWZpZWRbaV09dyksKHc9RS5nZXRSZXNwb25zZUhlYWRlcigiZXRhZyIpKSYmKFQuZXRhZ1tpXT13KSksMjA0PT09ZXx8IkhFQUQiPT09aC50eXBlP3g9Im5vY29udGVudCI6MzA0PT09ZT94PSJub3Rtb2RpZmllZCI6KHg9Xy5zdGF0ZSxkPV8uZGF0YSxmPSEoYj1fLmVycm9yKSkpOihiPXgsIWUmJnh8fCh4PSJlcnJvciIsZTwwJiYoZT0wKSkpLEUuc3RhdHVzPWUsRS5zdGF0dXNUZXh0PSh0fHx4KSsiIixmP3YucmVzb2x2ZVdpdGgocCxbZCx4LEVdKTp2LnJlamVjdFdpdGgocCxbRSx4LGJdKSxFLnN0YXR1c0NvZGUoeSkseT12b2lkIDAsYyYmZy50cmlnZ2VyKGY/ImFqYXhTdWNjZXNzIjoiYWpheEVycm9yIixbRSxoLGY/ZDpiXSksbS5maXJlV2l0aChwLFtFLHhdKSxjJiYoZy50cmlnZ2VyKCJhamF4Q29tcGxldGUiLFtFLGhdKSwtLVQuYWN0aXZlfHxULmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpKX1yZXR1cm4gRX0sZ2V0SlNPTjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIFQuZ2V0KGUsdCxuLCJqc29uIil9LGdldFNjcmlwdDpmdW5jdGlvbihlLHQpe3JldHVybiBULmdldChlLHZvaWQgMCx0LCJzY3JpcHQiKX19KSxULmVhY2goWyJnZXQiLCJwb3N0Il0sKGZ1bmN0aW9uKGUsdCl7VFt0XT1mdW5jdGlvbihlLG4scixpKXtyZXR1cm4gbShuKSYmKGk9aXx8cixyPW4sbj12b2lkIDApLFQuYWpheChULmV4dGVuZCh7dXJsOmUsdHlwZTp0LGRhdGFUeXBlOmksZGF0YTpuLHN1Y2Nlc3M6cn0sVC5pc1BsYWluT2JqZWN0KGUpJiZlKSl9fSkpLFQuYWpheFByZWZpbHRlcigoZnVuY3Rpb24oZSl7dmFyIHQ7Zm9yKHQgaW4gZS5oZWFkZXJzKSJjb250ZW50LXR5cGUiPT09dC50b0xvd2VyQ2FzZSgpJiYoZS5jb250ZW50VHlwZT1lLmhlYWRlcnNbdF18fCIiKX0pKSxULl9ldmFsVXJsPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gVC5hamF4KHt1cmw6ZSx0eXBlOiJHRVQiLGRhdGFUeXBlOiJzY3JpcHQiLGNhY2hlOiEwLGFzeW5jOiExLGdsb2JhbDohMSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKCl7fX0sZGF0YUZpbHRlcjpmdW5jdGlvbihlKXtULmdsb2JhbEV2YWwoZSx0LG4pfX0pfSxULmZuLmV4dGVuZCh7d3JhcEFsbDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gdGhpc1swXSYmKG0oZSkmJihlPWUuY2FsbCh0aGlzWzBdKSksdD1UKGUsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCksdGhpc1swXS5wYXJlbnROb2RlJiZ0Lmluc2VydEJlZm9yZSh0aGlzWzBdKSx0Lm1hcCgoZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcztlLmZpcnN0RWxlbWVudENoaWxkOyllPWUuZmlyc3RFbGVtZW50Q2hpbGQ7cmV0dXJuIGV9KSkuYXBwZW5kKHRoaXMpKSx0aGlzfSx3cmFwSW5uZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIG0oZSk/dGhpcy5lYWNoKChmdW5jdGlvbih0KXtUKHRoaXMpLndyYXBJbm5lcihlLmNhbGwodGhpcyx0KSl9KSk6dGhpcy5lYWNoKChmdW5jdGlvbigpe3ZhciB0PVQodGhpcyksbj10LmNvbnRlbnRzKCk7bi5sZW5ndGg/bi53cmFwQWxsKGUpOnQuYXBwZW5kKGUpfSkpfSx3cmFwOmZ1bmN0aW9uKGUpe3ZhciB0PW0oZSk7cmV0dXJuIHRoaXMuZWFjaCgoZnVuY3Rpb24obil7VCh0aGlzKS53cmFwQWxsKHQ/ZS5jYWxsKHRoaXMsbik6ZSl9KSl9LHVud3JhcDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wYXJlbnQoZSkubm90KCJib2R5IikuZWFjaCgoZnVuY3Rpb24oKXtUKHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KSksdGhpc319KSxULmV4cHIucHNldWRvcy5oaWRkZW49ZnVuY3Rpb24oZSl7cmV0dXJuIVQuZXhwci5wc2V1ZG9zLnZpc2libGUoZSl9LFQuZXhwci5wc2V1ZG9zLnZpc2libGU9ZnVuY3Rpb24oZSl7cmV0dXJuISEoZS5vZmZzZXRXaWR0aHx8ZS5vZmZzZXRIZWlnaHR8fGUuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpfSxULmFqYXhTZXR0aW5ncy54aHI9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIG5ldyBuLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGUpe319O3ZhciBVdD17MDoyMDAsMTIyMzoyMDR9LHp0PVQuYWpheFNldHRpbmdzLnhocigpO3YuY29ycz0hIXp0JiYid2l0aENyZWRlbnRpYWxzImluIHp0LHYuYWpheD16dD0hIXp0LFQuYWpheFRyYW5zcG9ydCgoZnVuY3Rpb24oZSl7dmFyIHQscjtpZih2LmNvcnN8fHp0JiYhZS5jcm9zc0RvbWFpbilyZXR1cm57c2VuZDpmdW5jdGlvbihpLG8pe3ZhciBhLHM9ZS54aHIoKTtpZihzLm9wZW4oZS50eXBlLGUudXJsLGUuYXN5bmMsZS51c2VybmFtZSxlLnBhc3N3b3JkKSxlLnhockZpZWxkcylmb3IoYSBpbiBlLnhockZpZWxkcylzW2FdPWUueGhyRmllbGRzW2FdO2ZvcihhIGluIGUubWltZVR5cGUmJnMub3ZlcnJpZGVNaW1lVHlwZSYmcy5vdmVycmlkZU1pbWVUeXBlKGUubWltZVR5cGUpLGUuY3Jvc3NEb21haW58fGlbIlgtUmVxdWVzdGVkLVdpdGgiXXx8KGlbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKSxpKXMuc2V0UmVxdWVzdEhlYWRlcihhLGlbYV0pO3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dCYmKHQ9cj1zLm9ubG9hZD1zLm9uZXJyb3I9cy5vbmFib3J0PXMub250aW1lb3V0PXMub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsImFib3J0Ij09PWU/cy5hYm9ydCgpOiJlcnJvciI9PT1lPyJudW1iZXIiIT10eXBlb2Ygcy5zdGF0dXM/bygwLCJlcnJvciIpOm8ocy5zdGF0dXMscy5zdGF0dXNUZXh0KTpvKFV0W3Muc3RhdHVzXXx8cy5zdGF0dXMscy5zdGF0dXNUZXh0LCJ0ZXh0IiE9PShzLnJlc3BvbnNlVHlwZXx8InRleHQiKXx8InN0cmluZyIhPXR5cGVvZiBzLnJlc3BvbnNlVGV4dD97YmluYXJ5OnMucmVzcG9uc2V9Ont0ZXh0OnMucmVzcG9uc2VUZXh0fSxzLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSl9fSxzLm9ubG9hZD10KCkscj1zLm9uZXJyb3I9cy5vbnRpbWVvdXQ9dCgiZXJyb3IiKSx2b2lkIDAhPT1zLm9uYWJvcnQ/cy5vbmFib3J0PXI6cy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXs0PT09cy5yZWFkeVN0YXRlJiZuLnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dCYmcigpfSkpfSx0PXQoImFib3J0Iik7dHJ5e3Muc2VuZChlLmhhc0NvbnRlbnQmJmUuZGF0YXx8bnVsbCl9Y2F0Y2goZSl7aWYodCl0aHJvdyBlfX0sYWJvcnQ6ZnVuY3Rpb24oKXt0JiZ0KCl9fX0pKSxULmFqYXhQcmVmaWx0ZXIoKGZ1bmN0aW9uKGUpe2UuY3Jvc3NEb21haW4mJihlLmNvbnRlbnRzLnNjcmlwdD0hMSl9KSksVC5hamF4U2V0dXAoe2FjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQifSxjb250ZW50czp7c2NyaXB0Oi9cYig/OmphdmF8ZWNtYSlzY3JpcHRcYi99LGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oZSl7cmV0dXJuIFQuZ2xvYmFsRXZhbChlKSxlfX19KSxULmFqYXhQcmVmaWx0ZXIoInNjcmlwdCIsKGZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUuY2FjaGUmJihlLmNhY2hlPSExKSxlLmNyb3NzRG9tYWluJiYoZS50eXBlPSJHRVQiKX0pKSxULmFqYXhUcmFuc3BvcnQoInNjcmlwdCIsKGZ1bmN0aW9uKGUpe3ZhciB0LG47aWYoZS5jcm9zc0RvbWFpbnx8ZS5zY3JpcHRBdHRycylyZXR1cm57c2VuZDpmdW5jdGlvbihyLGkpe3Q9VCgiPHNjcmlwdD4iKS5hdHRyKGUuc2NyaXB0QXR0cnN8fHt9KS5wcm9wKHtjaGFyc2V0OmUuc2NyaXB0Q2hhcnNldCxzcmM6ZS51cmx9KS5vbigibG9hZCBlcnJvciIsbj1mdW5jdGlvbihlKXt0LnJlbW92ZSgpLG49bnVsbCxlJiZpKCJlcnJvciI9PT1lLnR5cGU/NDA0OjIwMCxlLnR5cGUpfSksYi5oZWFkLmFwcGVuZENoaWxkKHRbMF0pfSxhYm9ydDpmdW5jdGlvbigpe24mJm4oKX19fSkpO3ZhciBRdCxWdD1bXSxLdD0vKD0pXD8oPz0mfCQpfFw/XD8vO1QuYWpheFNldHVwKHtqc29ucDoiY2FsbGJhY2siLGpzb25wQ2FsbGJhY2s6ZnVuY3Rpb24oKXt2YXIgZT1WdC5wb3AoKXx8VC5leHBhbmRvKyJfIitFdC5ndWlkKys7cmV0dXJuIHRoaXNbZV09ITAsZX19KSxULmFqYXhQcmVmaWx0ZXIoImpzb24ganNvbnAiLChmdW5jdGlvbihlLHQscil7dmFyIGksbyxhLHM9ITEhPT1lLmpzb25wJiYoS3QudGVzdChlLnVybCk/InVybCI6InN0cmluZyI9PXR5cGVvZiBlLmRhdGEmJjA9PT0oZS5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiZLdC50ZXN0KGUuZGF0YSkmJiJkYXRhIik7aWYoc3x8Impzb25wIj09PWUuZGF0YVR5cGVzWzBdKXJldHVybiBpPWUuanNvbnBDYWxsYmFjaz1tKGUuanNvbnBDYWxsYmFjayk/ZS5qc29ucENhbGxiYWNrKCk6ZS5qc29ucENhbGxiYWNrLHM/ZVtzXT1lW3NdLnJlcGxhY2UoS3QsIiQxIitpKTohMSE9PWUuanNvbnAmJihlLnVybCs9KEN0LnRlc3QoZS51cmwpPyImIjoiPyIpK2UuanNvbnArIj0iK2kpLGUuY29udmVydGVyc1sic2NyaXB0IGpzb24iXT1mdW5jdGlvbigpe3JldHVybiBhfHxULmVycm9yKGkrIiB3YXMgbm90IGNhbGxlZCIpLGFbMF19LGUuZGF0YVR5cGVzWzBdPSJqc29uIixvPW5baV0sbltpXT1mdW5jdGlvbigpe2E9YXJndW1lbnRzfSxyLmFsd2F5cygoZnVuY3Rpb24oKXt2b2lkIDA9PT1vP1QobikucmVtb3ZlUHJvcChpKTpuW2ldPW8sZVtpXSYmKGUuanNvbnBDYWxsYmFjaz10Lmpzb25wQ2FsbGJhY2ssVnQucHVzaChpKSksYSYmbShvKSYmbyhhWzBdKSxhPW89dm9pZCAwfSkpLCJzY3JpcHQifSkpLHYuY3JlYXRlSFRNTERvY3VtZW50PSgoUXQ9Yi5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpLmJvZHkpLmlubmVySFRNTD0iPGZvcm0+PC9mb3JtPjxmb3JtPjwvZm9ybT4iLDI9PT1RdC5jaGlsZE5vZGVzLmxlbmd0aCksVC5wYXJzZUhUTUw9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiJzdHJpbmciIT10eXBlb2YgZT9bXTooImJvb2xlYW4iPT10eXBlb2YgdCYmKG49dCx0PSExKSx0fHwodi5jcmVhdGVIVE1MRG9jdW1lbnQ/KChyPSh0PWIuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCIiKSkuY3JlYXRlRWxlbWVudCgiYmFzZSIpKS5ocmVmPWIubG9jYXRpb24uaHJlZix0LmhlYWQuYXBwZW5kQ2hpbGQocikpOnQ9Yiksbz0hbiYmW10sKGk9RC5leGVjKGUpKT9bdC5jcmVhdGVFbGVtZW50KGlbMV0pXTooaT14ZShbZV0sdCxvKSxvJiZvLmxlbmd0aCYmVChvKS5yZW1vdmUoKSxULm1lcmdlKFtdLGkuY2hpbGROb2RlcykpKTt2YXIgcixpLG99LFQuZm4ubG9hZD1mdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGE9dGhpcyxzPWUuaW5kZXhPZigiICIpO3JldHVybiBzPi0xJiYocj1tdChlLnNsaWNlKHMpKSxlPWUuc2xpY2UoMCxzKSksbSh0KT8obj10LHQ9dm9pZCAwKTp0JiYib2JqZWN0Ij09dHlwZW9mIHQmJihpPSJQT1NUIiksYS5sZW5ndGg+MCYmVC5hamF4KHt1cmw6ZSx0eXBlOml8fCJHRVQiLGRhdGFUeXBlOiJodG1sIixkYXRhOnR9KS5kb25lKChmdW5jdGlvbihlKXtvPWFyZ3VtZW50cyxhLmh0bWwocj9UKCI8ZGl2PiIpLmFwcGVuZChULnBhcnNlSFRNTChlKSkuZmluZChyKTplKX0pKS5hbHdheXMobiYmZnVuY3Rpb24oZSx0KXthLmVhY2goKGZ1bmN0aW9uKCl7bi5hcHBseSh0aGlzLG98fFtlLnJlc3BvbnNlVGV4dCx0LGVdKX0pKX0pLHRoaXN9LFQuZXhwci5wc2V1ZG9zLmFuaW1hdGVkPWZ1bmN0aW9uKGUpe3JldHVybiBULmdyZXAoVC50aW1lcnMsKGZ1bmN0aW9uKHQpe3JldHVybiBlPT09dC5lbGVtfSkpLmxlbmd0aH0sVC5vZmZzZXQ9e3NldE9mZnNldDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscyx1LGw9VC5jc3MoZSwicG9zaXRpb24iKSxjPVQoZSksZj17fTsic3RhdGljIj09PWwmJihlLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpLHM9Yy5vZmZzZXQoKSxvPVQuY3NzKGUsInRvcCIpLHU9VC5jc3MoZSwibGVmdCIpLCgiYWJzb2x1dGUiPT09bHx8ImZpeGVkIj09PWwpJiYobyt1KS5pbmRleE9mKCJhdXRvIik+LTE/KGE9KHI9Yy5wb3NpdGlvbigpKS50b3AsaT1yLmxlZnQpOihhPXBhcnNlRmxvYXQobyl8fDAsaT1wYXJzZUZsb2F0KHUpfHwwKSxtKHQpJiYodD10LmNhbGwoZSxuLFQuZXh0ZW5kKHt9LHMpKSksbnVsbCE9dC50b3AmJihmLnRvcD10LnRvcC1zLnRvcCthKSxudWxsIT10LmxlZnQmJihmLmxlZnQ9dC5sZWZ0LXMubGVmdCtpKSwidXNpbmciaW4gdD90LnVzaW5nLmNhbGwoZSxmKTpjLmNzcyhmKX19LFQuZm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24oZSl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09ZT90aGlzOnRoaXMuZWFjaCgoZnVuY3Rpb24odCl7VC5vZmZzZXQuc2V0T2Zmc2V0KHRoaXMsZSx0KX0pKTt2YXIgdCxuLHI9dGhpc1swXTtyZXR1cm4gcj9yLmdldENsaWVudFJlY3RzKCkubGVuZ3RoPyh0PXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbj1yLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcse3RvcDp0LnRvcCtuLnBhZ2VZT2Zmc2V0LGxlZnQ6dC5sZWZ0K24ucGFnZVhPZmZzZXR9KTp7dG9wOjAsbGVmdDowfTp2b2lkIDB9LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpc1swXSl7dmFyIGUsdCxuLHI9dGhpc1swXSxpPXt0b3A6MCxsZWZ0OjB9O2lmKCJmaXhlZCI9PT1ULmNzcyhyLCJwb3NpdGlvbiIpKXQ9ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtlbHNle2Zvcih0PXRoaXMub2Zmc2V0KCksbj1yLm93bmVyRG9jdW1lbnQsZT1yLm9mZnNldFBhcmVudHx8bi5kb2N1bWVudEVsZW1lbnQ7ZSYmKGU9PT1uLmJvZHl8fGU9PT1uLmRvY3VtZW50RWxlbWVudCkmJiJzdGF0aWMiPT09VC5jc3MoZSwicG9zaXRpb24iKTspZT1lLnBhcmVudE5vZGU7ZSYmZSE9PXImJjE9PT1lLm5vZGVUeXBlJiYoKGk9VChlKS5vZmZzZXQoKSkudG9wKz1ULmNzcyhlLCJib3JkZXJUb3BXaWR0aCIsITApLGkubGVmdCs9VC5jc3MoZSwiYm9yZGVyTGVmdFdpZHRoIiwhMCkpfXJldHVybnt0b3A6dC50b3AtaS50b3AtVC5jc3MociwibWFyZ2luVG9wIiwhMCksbGVmdDp0LmxlZnQtaS5sZWZ0LVQuY3NzKHIsIm1hcmdpbkxlZnQiLCEwKX19fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoKGZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMub2Zmc2V0UGFyZW50O2UmJiJzdGF0aWMiPT09VC5jc3MoZSwicG9zaXRpb24iKTspZT1lLm9mZnNldFBhcmVudDtyZXR1cm4gZXx8b2V9KSl9fSksVC5lYWNoKHtzY3JvbGxMZWZ0OiJwYWdlWE9mZnNldCIsc2Nyb2xsVG9wOiJwYWdlWU9mZnNldCJ9LChmdW5jdGlvbihlLHQpe3ZhciBuPSJwYWdlWU9mZnNldCI9PT10O1QuZm5bZV09ZnVuY3Rpb24ocil7cmV0dXJuIFUodGhpcywoZnVuY3Rpb24oZSxyLGkpe3ZhciBvO2lmKHkoZSk/bz1lOjk9PT1lLm5vZGVUeXBlJiYobz1lLmRlZmF1bHRWaWV3KSx2b2lkIDA9PT1pKXJldHVybiBvP29bdF06ZVtyXTtvP28uc2Nyb2xsVG8obj9vLnBhZ2VYT2Zmc2V0Omksbj9pOm8ucGFnZVlPZmZzZXQpOmVbcl09aX0pLGUscixhcmd1bWVudHMubGVuZ3RoKX19KSksVC5lYWNoKFsidG9wIiwibGVmdCJdLChmdW5jdGlvbihlLHQpe1QuY3NzSG9va3NbdF09UWUodi5waXhlbFBvc2l0aW9uLChmdW5jdGlvbihlLG4pe2lmKG4pcmV0dXJuIG49emUoZSx0KSxxZS50ZXN0KG4pP1QoZSkucG9zaXRpb24oKVt0XSsicHgiOm59KSl9KSksVC5lYWNoKHtIZWlnaHQ6ImhlaWdodCIsV2lkdGg6IndpZHRoIn0sKGZ1bmN0aW9uKGUsdCl7VC5lYWNoKHtwYWRkaW5nOiJpbm5lciIrZSxjb250ZW50OnQsIiI6Im91dGVyIitlfSwoZnVuY3Rpb24obixyKXtULmZuW3JdPWZ1bmN0aW9uKGksbyl7dmFyIGE9YXJndW1lbnRzLmxlbmd0aCYmKG58fCJib29sZWFuIiE9dHlwZW9mIGkpLHM9bnx8KCEwPT09aXx8ITA9PT1vPyJtYXJnaW4iOiJib3JkZXIiKTtyZXR1cm4gVSh0aGlzLChmdW5jdGlvbih0LG4saSl7dmFyIG87cmV0dXJuIHkodCk/MD09PXIuaW5kZXhPZigib3V0ZXIiKT90WyJpbm5lciIrZV06dC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrZV06OT09PXQubm9kZVR5cGU/KG89dC5kb2N1bWVudEVsZW1lbnQsTWF0aC5tYXgodC5ib2R5WyJzY3JvbGwiK2VdLG9bInNjcm9sbCIrZV0sdC5ib2R5WyJvZmZzZXQiK2VdLG9bIm9mZnNldCIrZV0sb1siY2xpZW50IitlXSkpOnZvaWQgMD09PWk/VC5jc3ModCxuLHMpOlQuc3R5bGUodCxuLGkscyl9KSx0LGE/aTp2b2lkIDAsYSl9fSkpfSkpLFQuZWFjaChbImFqYXhTdGFydCIsImFqYXhTdG9wIiwiYWpheENvbXBsZXRlIiwiYWpheEVycm9yIiwiYWpheFN1Y2Nlc3MiLCJhamF4U2VuZCJdLChmdW5jdGlvbihlLHQpe1QuZm5bdF09ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub24odCxlKX19KSksVC5mbi5leHRlbmQoe2JpbmQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLm9uKGUsbnVsbCx0LG4pfSx1bmJpbmQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5vZmYoZSxudWxsLHQpfSxkZWxlZ2F0ZTpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5vbih0LGUsbixyKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMub2ZmKGUsIioqIik6dGhpcy5vZmYodCxlfHwiKioiLG4pfSxob3ZlcjpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoZSkubW91c2VsZWF2ZSh0fHxlKX19KSxULmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCByZXNpemUgc2Nyb2xsIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksKGZ1bmN0aW9uKGUsdCl7VC5mblt0XT1mdW5jdGlvbihlLG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjA/dGhpcy5vbih0LG51bGwsZSxuKTp0aGlzLnRyaWdnZXIodCl9fSkpO3ZhciBYdD0vXltcc1x1RkVGRlx4QTBdK3woW15cc1x1RkVGRlx4QTBdKVtcc1x1RkVGRlx4QTBdKyQvZztULnByb3h5PWZ1bmN0aW9uKGUsdCl7dmFyIG4scixpO2lmKCJzdHJpbmciPT10eXBlb2YgdCYmKG49ZVt0XSx0PWUsZT1uKSxtKGUpKXJldHVybiByPXMuY2FsbChhcmd1bWVudHMsMiksKGk9ZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseSh0fHx0aGlzLHIuY29uY2F0KHMuY2FsbChhcmd1bWVudHMpKSl9KS5ndWlkPWUuZ3VpZD1lLmd1aWR8fFQuZ3VpZCsrLGl9LFQuaG9sZFJlYWR5PWZ1bmN0aW9uKGUpe2U/VC5yZWFkeVdhaXQrKzpULnJlYWR5KCEwKX0sVC5pc0FycmF5PUFycmF5LmlzQXJyYXksVC5wYXJzZUpTT049SlNPTi5wYXJzZSxULm5vZGVOYW1lPU4sVC5pc0Z1bmN0aW9uPW0sVC5pc1dpbmRvdz15LFQuY2FtZWxDYXNlPUssVC50eXBlPXgsVC5ub3c9RGF0ZS5ub3csVC5pc051bWVyaWM9ZnVuY3Rpb24oZSl7dmFyIHQ9VC50eXBlKGUpO3JldHVybigibnVtYmVyIj09PXR8fCJzdHJpbmciPT09dCkmJiFpc05hTihlLXBhcnNlRmxvYXQoZSkpfSxULnRyaW09ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/IiI6KGUrIiIpLnJlcGxhY2UoWHQsIiQxIil9LHZvaWQgMD09PShyPWZ1bmN0aW9uKCl7cmV0dXJuIFR9LmFwcGx5KHQsW10pKXx8KGUuZXhwb3J0cz1yKTt2YXIgWXQ9bi5qUXVlcnksSnQ9bi4kO3JldHVybiBULm5vQ29uZmxpY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIG4uJD09PVQmJihuLiQ9SnQpLGUmJm4ualF1ZXJ5PT09VCYmKG4ualF1ZXJ5PVl0KSxUfSx2b2lkIDA9PT1pJiYobi5qUXVlcnk9bi4kPVQpLFR9KSl9LEhTc2E6ZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIG49bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpLHI9MDtyPG4ubGVuZ3RoO3IrKyluW3JdPWFyZ3VtZW50c1tyXTtyZXR1cm4gZS5hcHBseSh0LG4pfX19LEpFUXI6ZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjsoZnVuY3Rpb24odCl7dmFyIHI9bigieFRKKyIpLGk9bigieUs5cyIpLG89eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQifTtmdW5jdGlvbiBhKGUsdCl7IXIuaXNVbmRlZmluZWQoZSkmJnIuaXNVbmRlZmluZWQoZVsiQ29udGVudC1UeXBlIl0pJiYoZVsiQ29udGVudC1UeXBlIl09dCl9dmFyIHMsdT17YWRhcHRlcjooKCJ1bmRlZmluZWQiIT10eXBlb2YgWE1MSHR0cFJlcXVlc3R8fHZvaWQgMCE9PXQmJiJbb2JqZWN0IHByb2Nlc3NdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSkmJihzPW4oInRRMkIiKSkscyksdHJhbnNmb3JtUmVxdWVzdDpbZnVuY3Rpb24oZSx0KXtyZXR1cm4gaSh0LCJBY2NlcHQiKSxpKHQsIkNvbnRlbnQtVHlwZSIpLHIuaXNGb3JtRGF0YShlKXx8ci5pc0FycmF5QnVmZmVyKGUpfHxyLmlzQnVmZmVyKGUpfHxyLmlzU3RyZWFtKGUpfHxyLmlzRmlsZShlKXx8ci5pc0Jsb2IoZSk/ZTpyLmlzQXJyYXlCdWZmZXJWaWV3KGUpP2UuYnVmZmVyOnIuaXNVUkxTZWFyY2hQYXJhbXMoZSk/KGEodCwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9dXRmLTgiKSxlLnRvU3RyaW5nKCkpOnIuaXNPYmplY3QoZSk/KGEodCwiYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04IiksSlNPTi5zdHJpbmdpZnkoZSkpOmV9XSx0cmFuc2Zvcm1SZXNwb25zZTpbZnVuY3Rpb24oZSl7aWYoInN0cmluZyI9PXR5cGVvZiBlKXRyeXtlPUpTT04ucGFyc2UoZSl9Y2F0Y2goZSl7fXJldHVybiBlfV0sdGltZW91dDowLHhzcmZDb29raWVOYW1lOiJYU1JGLVRPS0VOIix4c3JmSGVhZGVyTmFtZToiWC1YU1JGLVRPS0VOIixtYXhDb250ZW50TGVuZ3RoOi0xLHZhbGlkYXRlU3RhdHVzOmZ1bmN0aW9uKGUpe3JldHVybiBlPj0yMDAmJmU8MzAwfX07dS5oZWFkZXJzPXtjb21tb246e0FjY2VwdDoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qIn19LHIuZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiXSwoZnVuY3Rpb24oZSl7dS5oZWFkZXJzW2VdPXt9fSkpLHIuZm9yRWFjaChbInBvc3QiLCJwdXQiLCJwYXRjaCJdLChmdW5jdGlvbihlKXt1LmhlYWRlcnNbZV09ci5tZXJnZShvKX0pKSxlLmV4cG9ydHM9dX0pLmNhbGwodGhpcyxuKCI4b3hCIikpfSxMWU5GOmZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigiT0g5YyIpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQsbixpLG8pe3ZhciBhPW5ldyBFcnJvcihlKTtyZXR1cm4gcihhLHQsbixpLG8pfX0sTG1lbTpmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4hKCFlfHwhZS5fX0NBTkNFTF9fKX19LEx2RGw6ZnVuY3Rpb24oZSx0LG4peyhmdW5jdGlvbihlLHIpe3ZhciBpOyhmdW5jdGlvbigpe3ZhciBvPSJFeHBlY3RlZCBhIGZ1bmN0aW9uIixhPSJfX2xvZGFzaF9wbGFjZWhvbGRlcl9fIixzPVtbImFyeSIsMTI4XSxbImJpbmQiLDFdLFsiYmluZEtleSIsMl0sWyJjdXJyeSIsOF0sWyJjdXJyeVJpZ2h0IiwxNl0sWyJmbGlwIiw1MTJdLFsicGFydGlhbCIsMzJdLFsicGFydGlhbFJpZ2h0Iiw2NF0sWyJyZWFyZyIsMjU2XV0sdT0iW29iamVjdCBBcmd1bWVudHNdIixsPSJbb2JqZWN0IEFycmF5XSIsYz0iW29iamVjdCBCb29sZWFuXSIsZj0iW29iamVjdCBEYXRlXSIsZD0iW29iamVjdCBFcnJvcl0iLGg9IltvYmplY3QgRnVuY3Rpb25dIixwPSJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSIsZz0iW29iamVjdCBNYXBdIix2PSJbb2JqZWN0IE51bWJlcl0iLG09IltvYmplY3QgT2JqZWN0XSIseT0iW29iamVjdCBSZWdFeHBdIixiPSJbb2JqZWN0IFNldF0iLF89IltvYmplY3QgU3RyaW5nXSIsdz0iW29iamVjdCBTeW1ib2xdIix4PSJbb2JqZWN0IFdlYWtNYXBdIixUPSJbb2JqZWN0IEFycmF5QnVmZmVyXSIsRT0iW29iamVjdCBEYXRhVmlld10iLEM9IltvYmplY3QgRmxvYXQzMkFycmF5XSIsUz0iW29iamVjdCBGbG9hdDY0QXJyYXldIixrPSJbb2JqZWN0IEludDhBcnJheV0iLEE9IltvYmplY3QgSW50MTZBcnJheV0iLE49IltvYmplY3QgSW50MzJBcnJheV0iLEQ9IltvYmplY3QgVWludDhBcnJheV0iLGo9IltvYmplY3QgVWludDE2QXJyYXldIixPPSJbb2JqZWN0IFVpbnQzMkFycmF5XSIsTD0vXGJfX3AgXCs9ICcnOy9nLEk9L1xiKF9fcCBcKz0pICcnIFwrL2csUj0vKF9fZVwoLio/XCl8XGJfX3RcKSkgXCtcbicnOy9nLFA9LyYoPzphbXB8bHR8Z3R8cXVvdHwjMzkpOy9nLCQ9L1smPD4iJ10vZyxCPVJlZ0V4cChQLnNvdXJjZSkscT1SZWdFeHAoJC5zb3VyY2UpLE09LzwlLShbXHNcU10rPyklPi9nLEg9LzwlKFtcc1xTXSs/KSU+L2csRj0vPCU9KFtcc1xTXSs/KSU+L2csVz0vXC58XFsoPzpbXltcXV0qfChbIiddKSg/Oig/IVwxKVteXFxdfFxcLikqP1wxKVxdLyxVPS9eXHcqJC8sej0vW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZyxRPS9bXFxeJC4qKz8oKVtcXXt9fF0vZyxWPVJlZ0V4cChRLnNvdXJjZSksSz0vXlxzKy8sWD0vXHMvLFk9L1x7KD86XG5cL1wqIFxbd3JhcHBlZCB3aXRoIC4rXF0gXCpcLyk/XG4/LyxKPS9ce1xuXC9cKiBcW3dyYXBwZWQgd2l0aCAoLispXF0gXCovLEc9Lyw/ICYgLyxaPS9bXlx4MDAtXHgyZlx4M2EtXHg0MFx4NWItXHg2MFx4N2ItXHg3Zl0rL2csZWU9L1soKT0se31cW1xdXC9cc10vLHRlPS9cXChcXCk/L2csbmU9L1wkXHsoW15cXH1dKig/OlxcLlteXFx9XSopKilcfS9nLHJlPS9cdyokLyxpZT0vXlstK10weFswLTlhLWZdKyQvaSxvZT0vXjBiWzAxXSskL2ksYWU9L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8sc2U9L14wb1swLTddKyQvaSx1ZT0vXig/OjB8WzEtOV1cZCopJC8sbGU9L1tceGMwLVx4ZDZceGQ4LVx4ZjZceGY4LVx4ZmZcdTAxMDAtXHUwMTdmXS9nLGNlPS8oJF4pLyxmZT0vWydcblxyXHUyMDI4XHUyMDI5XFxdL2csZGU9IlxcdTAzMDAtXFx1MDM2ZlxcdWZlMjAtXFx1ZmUyZlxcdTIwZDAtXFx1MjBmZiIsaGU9IlxceGFjXFx4YjFcXHhkN1xceGY3XFx4MDAtXFx4MmZcXHgzYS1cXHg0MFxceDViLVxceDYwXFx4N2ItXFx4YmZcXHUyMDAwLVxcdTIwNmYgXFx0XFx4MGJcXGZcXHhhMFxcdWZlZmZcXG5cXHJcXHUyMDI4XFx1MjAyOVxcdTE2ODBcXHUxODBlXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwM1xcdTIwMDRcXHUyMDA1XFx1MjAwNlxcdTIwMDdcXHUyMDA4XFx1MjAwOVxcdTIwMGFcXHUyMDJmXFx1MjA1ZlxcdTMwMDAiLHBlPSJbXFx1ZDgwMC1cXHVkZmZmXSIsZ2U9IlsiK2hlKyJdIix2ZT0iWyIrZGUrIl0iLG1lPSJcXGQrIix5ZT0iW1xcdTI3MDAtXFx1MjdiZl0iLGJlPSJbYS16XFx4ZGYtXFx4ZjZcXHhmOC1cXHhmZl0iLF9lPSJbXlxcdWQ4MDAtXFx1ZGZmZiIraGUrbWUrIlxcdTI3MDAtXFx1MjdiZmEtelxceGRmLVxceGY2XFx4ZjgtXFx4ZmZBLVpcXHhjMC1cXHhkNlxceGQ4LVxceGRlXSIsd2U9IlxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXSIseGU9IlteXFx1ZDgwMC1cXHVkZmZmXSIsVGU9Iig/OlxcdWQ4M2NbXFx1ZGRlNi1cXHVkZGZmXSl7Mn0iLEVlPSJbXFx1ZDgwMC1cXHVkYmZmXVtcXHVkYzAwLVxcdWRmZmZdIixDZT0iW0EtWlxceGMwLVxceGQ2XFx4ZDgtXFx4ZGVdIixTZT0iKD86IitiZSsifCIrX2UrIikiLGtlPSIoPzoiK0NlKyJ8IitfZSsiKSIsQWU9Iig/OiIrdmUrInwiK3dlKyIpIisiPyIsTmU9IltcXHVmZTBlXFx1ZmUwZl0/IitBZSsoIig/OlxcdTIwMGQoPzoiK1t4ZSxUZSxFZV0uam9pbigifCIpKyIpW1xcdWZlMGVcXHVmZTBmXT8iK0FlKyIpKiIpLERlPSIoPzoiK1t5ZSxUZSxFZV0uam9pbigifCIpKyIpIitOZSxqZT0iKD86IitbeGUrdmUrIj8iLHZlLFRlLEVlLHBlXS5qb2luKCJ8IikrIikiLE9lPVJlZ0V4cCgiWyfigJldIiwiZyIpLExlPVJlZ0V4cCh2ZSwiZyIpLEllPVJlZ0V4cCh3ZSsiKD89Iit3ZSsiKXwiK2plK05lLCJnIiksUmU9UmVnRXhwKFtDZSsiPyIrYmUrIisoPzpbJ+KAmV0oPzpkfGxsfG18cmV8c3x0fHZlKSk/KD89IitbZ2UsQ2UsIiQiXS5qb2luKCJ8IikrIikiLGtlKyIrKD86WyfigJldKD86RHxMTHxNfFJFfFN8VHxWRSkpPyg/PSIrW2dlLENlK1NlLCIkIl0uam9pbigifCIpKyIpIixDZSsiPyIrU2UrIisoPzpbJ+KAmV0oPzpkfGxsfG18cmV8c3x0fHZlKSk/IixDZSsiKyg/Olsn4oCZXSg/OkR8TEx8TXxSRXxTfFR8VkUpKT8iLCJcXGQqKD86MVNUfDJORHwzUkR8KD8hWzEyM10pXFxkVEgpKD89XFxifFthLXpfXSkiLCJcXGQqKD86MXN0fDJuZHwzcmR8KD8hWzEyM10pXFxkdGgpKD89XFxifFtBLVpfXSkiLG1lLERlXS5qb2luKCJ8IiksImciKSxQZT1SZWdFeHAoIltcXHUyMDBkXFx1ZDgwMC1cXHVkZmZmIitkZSsiXFx1ZmUwZVxcdWZlMGZdIiksJGU9L1thLXpdW0EtWl18W0EtWl17Mn1bYS16XXxbMC05XVthLXpBLVpdfFthLXpBLVpdWzAtOV18W15hLXpBLVowLTkgXS8sQmU9WyJBcnJheSIsIkJ1ZmZlciIsIkRhdGFWaWV3IiwiRGF0ZSIsIkVycm9yIiwiRmxvYXQzMkFycmF5IiwiRmxvYXQ2NEFycmF5IiwiRnVuY3Rpb24iLCJJbnQ4QXJyYXkiLCJJbnQxNkFycmF5IiwiSW50MzJBcnJheSIsIk1hcCIsIk1hdGgiLCJPYmplY3QiLCJQcm9taXNlIiwiUmVnRXhwIiwiU2V0IiwiU3RyaW5nIiwiU3ltYm9sIiwiVHlwZUVycm9yIiwiVWludDhBcnJheSIsIlVpbnQ4Q2xhbXBlZEFycmF5IiwiVWludDE2QXJyYXkiLCJVaW50MzJBcnJheSIsIldlYWtNYXAiLCJfIiwiY2xlYXJUaW1lb3V0IiwiaXNGaW5pdGUiLCJwYXJzZUludCIsInNldFRpbWVvdXQiXSxxZT0tMSxNZT17fTtNZVtDXT1NZVtTXT1NZVtrXT1NZVtBXT1NZVtOXT1NZVtEXT1NZVsiW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iXT1NZVtqXT1NZVtPXT0hMCxNZVt1XT1NZVtsXT1NZVtUXT1NZVtjXT1NZVtFXT1NZVtmXT1NZVtkXT1NZVtoXT1NZVtnXT1NZVt2XT1NZVttXT1NZVt5XT1NZVtiXT1NZVtfXT1NZVt4XT0hMTt2YXIgSGU9e307SGVbdV09SGVbbF09SGVbVF09SGVbRV09SGVbY109SGVbZl09SGVbQ109SGVbU109SGVba109SGVbQV09SGVbTl09SGVbZ109SGVbdl09SGVbbV09SGVbeV09SGVbYl09SGVbX109SGVbd109SGVbRF09SGVbIltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIl09SGVbal09SGVbT109ITAsSGVbZF09SGVbaF09SGVbeF09ITE7dmFyIEZlPXsiXFwiOiJcXCIsIiciOiInIiwiXG4iOiJuIiwiXHIiOiJyIiwiXHUyMDI4IjoidTIwMjgiLCJcdTIwMjkiOiJ1MjAyOSJ9LFdlPXBhcnNlRmxvYXQsVWU9cGFyc2VJbnQsemU9Im9iamVjdCI9PXR5cGVvZiBlJiZlJiZlLk9iamVjdD09PU9iamVjdCYmZSxRZT0ib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLFZlPXplfHxRZXx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKSxLZT10JiYhdC5ub2RlVHlwZSYmdCxYZT1LZSYmIm9iamVjdCI9PXR5cGVvZiByJiZyJiYhci5ub2RlVHlwZSYmcixZZT1YZSYmWGUuZXhwb3J0cz09PUtlLEplPVllJiZ6ZS5wcm9jZXNzLEdlPWZ1bmN0aW9uKCl7dHJ5e3ZhciBlPVhlJiZYZS5yZXF1aXJlJiZYZS5yZXF1aXJlKCJ1dGlsIikudHlwZXM7cmV0dXJuIGV8fEplJiZKZS5iaW5kaW5nJiZKZS5iaW5kaW5nKCJ1dGlsIil9Y2F0Y2goZSl7fX0oKSxaZT1HZSYmR2UuaXNBcnJheUJ1ZmZlcixldD1HZSYmR2UuaXNEYXRlLHR0PUdlJiZHZS5pc01hcCxudD1HZSYmR2UuaXNSZWdFeHAscnQ9R2UmJkdlLmlzU2V0LGl0PUdlJiZHZS5pc1R5cGVkQXJyYXk7ZnVuY3Rpb24gb3QoZSx0LG4pe3N3aXRjaChuLmxlbmd0aCl7Y2FzZSAwOnJldHVybiBlLmNhbGwodCk7Y2FzZSAxOnJldHVybiBlLmNhbGwodCxuWzBdKTtjYXNlIDI6cmV0dXJuIGUuY2FsbCh0LG5bMF0sblsxXSk7Y2FzZSAzOnJldHVybiBlLmNhbGwodCxuWzBdLG5bMV0sblsyXSl9cmV0dXJuIGUuYXBwbHkodCxuKX1mdW5jdGlvbiBhdChlLHQsbixyKXtmb3IodmFyIGk9LTEsbz1udWxsPT1lPzA6ZS5sZW5ndGg7KytpPG87KXt2YXIgYT1lW2ldO3QocixhLG4oYSksZSl9cmV0dXJuIHJ9ZnVuY3Rpb24gc3QoZSx0KXtmb3IodmFyIG49LTEscj1udWxsPT1lPzA6ZS5sZW5ndGg7KytuPHImJiExIT09dChlW25dLG4sZSk7KTtyZXR1cm4gZX1mdW5jdGlvbiB1dChlLHQpe2Zvcih2YXIgbj1udWxsPT1lPzA6ZS5sZW5ndGg7bi0tJiYhMSE9PXQoZVtuXSxuLGUpOyk7cmV0dXJuIGV9ZnVuY3Rpb24gbHQoZSx0KXtmb3IodmFyIG49LTEscj1udWxsPT1lPzA6ZS5sZW5ndGg7KytuPHI7KWlmKCF0KGVbbl0sbixlKSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBjdChlLHQpe2Zvcih2YXIgbj0tMSxyPW51bGw9PWU/MDplLmxlbmd0aCxpPTAsbz1bXTsrK248cjspe3ZhciBhPWVbbl07dChhLG4sZSkmJihvW2krK109YSl9cmV0dXJuIG99ZnVuY3Rpb24gZnQoZSx0KXtyZXR1cm4hIShudWxsPT1lPzA6ZS5sZW5ndGgpJiZ3dChlLHQsMCk+LTF9ZnVuY3Rpb24gZHQoZSx0LG4pe2Zvcih2YXIgcj0tMSxpPW51bGw9PWU/MDplLmxlbmd0aDsrK3I8aTspaWYobih0LGVbcl0pKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIGh0KGUsdCl7Zm9yKHZhciBuPS0xLHI9bnVsbD09ZT8wOmUubGVuZ3RoLGk9QXJyYXkocik7KytuPHI7KWlbbl09dChlW25dLG4sZSk7cmV0dXJuIGl9ZnVuY3Rpb24gcHQoZSx0KXtmb3IodmFyIG49LTEscj10Lmxlbmd0aCxpPWUubGVuZ3RoOysrbjxyOyllW2krbl09dFtuXTtyZXR1cm4gZX1mdW5jdGlvbiBndChlLHQsbixyKXt2YXIgaT0tMSxvPW51bGw9PWU/MDplLmxlbmd0aDtmb3IociYmbyYmKG49ZVsrK2ldKTsrK2k8bzspbj10KG4sZVtpXSxpLGUpO3JldHVybiBufWZ1bmN0aW9uIHZ0KGUsdCxuLHIpe3ZhciBpPW51bGw9PWU/MDplLmxlbmd0aDtmb3IociYmaSYmKG49ZVstLWldKTtpLS07KW49dChuLGVbaV0saSxlKTtyZXR1cm4gbn1mdW5jdGlvbiBtdChlLHQpe2Zvcih2YXIgbj0tMSxyPW51bGw9PWU/MDplLmxlbmd0aDsrK248cjspaWYodChlW25dLG4sZSkpcmV0dXJuITA7cmV0dXJuITF9dmFyIHl0PUN0KCJsZW5ndGgiKTtmdW5jdGlvbiBidChlLHQsbil7dmFyIHI7cmV0dXJuIG4oZSwoZnVuY3Rpb24oZSxuLGkpe2lmKHQoZSxuLGkpKXJldHVybiByPW4sITF9KSkscn1mdW5jdGlvbiBfdChlLHQsbixyKXtmb3IodmFyIGk9ZS5sZW5ndGgsbz1uKyhyPzE6LTEpO3I/by0tOisrbzxpOylpZih0KGVbb10sbyxlKSlyZXR1cm4gbztyZXR1cm4tMX1mdW5jdGlvbiB3dChlLHQsbil7cmV0dXJuIHQ9PXQ/ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4tMSxpPWUubGVuZ3RoO2Zvcig7KytyPGk7KWlmKGVbcl09PT10KXJldHVybiByO3JldHVybi0xfShlLHQsbik6X3QoZSxUdCxuKX1mdW5jdGlvbiB4dChlLHQsbixyKXtmb3IodmFyIGk9bi0xLG89ZS5sZW5ndGg7KytpPG87KWlmKHIoZVtpXSx0KSlyZXR1cm4gaTtyZXR1cm4tMX1mdW5jdGlvbiBUdChlKXtyZXR1cm4gZSE9ZX1mdW5jdGlvbiBFdChlLHQpe3ZhciBuPW51bGw9PWU/MDplLmxlbmd0aDtyZXR1cm4gbj9BdChlLHQpL246TmFOfWZ1bmN0aW9uIEN0KGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD92b2lkIDA6dFtlXX19ZnVuY3Rpb24gU3QoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT1lP3ZvaWQgMDplW3RdfX1mdW5jdGlvbiBrdChlLHQsbixyLGkpe3JldHVybiBpKGUsKGZ1bmN0aW9uKGUsaSxvKXtuPXI/KHI9ITEsZSk6dChuLGUsaSxvKX0pKSxufWZ1bmN0aW9uIEF0KGUsdCl7Zm9yKHZhciBuLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspe3ZhciBvPXQoZVtyXSk7dm9pZCAwIT09byYmKG49dm9pZCAwPT09bj9vOm4rbyl9cmV0dXJuIG59ZnVuY3Rpb24gTnQoZSx0KXtmb3IodmFyIG49LTEscj1BcnJheShlKTsrK248ZTspcltuXT10KG4pO3JldHVybiByfWZ1bmN0aW9uIER0KGUpe3JldHVybiBlP2Uuc2xpY2UoMCxLdChlKSsxKS5yZXBsYWNlKEssIiIpOmV9ZnVuY3Rpb24ganQoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlKHQpfX1mdW5jdGlvbiBPdChlLHQpe3JldHVybiBodCh0LChmdW5jdGlvbih0KXtyZXR1cm4gZVt0XX0pKX1mdW5jdGlvbiBMdChlLHQpe3JldHVybiBlLmhhcyh0KX1mdW5jdGlvbiBJdChlLHQpe2Zvcih2YXIgbj0tMSxyPWUubGVuZ3RoOysrbjxyJiZ3dCh0LGVbbl0sMCk+LTE7KTtyZXR1cm4gbn1mdW5jdGlvbiBSdChlLHQpe2Zvcih2YXIgbj1lLmxlbmd0aDtuLS0mJnd0KHQsZVtuXSwwKT4tMTspO3JldHVybiBufWZ1bmN0aW9uIFB0KGUsdCl7Zm9yKHZhciBuPWUubGVuZ3RoLHI9MDtuLS07KWVbbl09PT10JiYrK3I7cmV0dXJuIHJ9dmFyICR0PVN0KHsiw4AiOiJBIiwiw4EiOiJBIiwiw4IiOiJBIiwiw4MiOiJBIiwiw4QiOiJBIiwiw4UiOiJBIiwiw6AiOiJhIiwiw6EiOiJhIiwiw6IiOiJhIiwiw6MiOiJhIiwiw6QiOiJhIiwiw6UiOiJhIiwiw4ciOiJDIiwiw6ciOiJjIiwiw5AiOiJEIiwiw7AiOiJkIiwiw4giOiJFIiwiw4kiOiJFIiwiw4oiOiJFIiwiw4siOiJFIiwiw6giOiJlIiwiw6kiOiJlIiwiw6oiOiJlIiwiw6siOiJlIiwiw4wiOiJJIiwiw40iOiJJIiwiw44iOiJJIiwiw48iOiJJIiwiw6wiOiJpIiwiw60iOiJpIiwiw64iOiJpIiwiw68iOiJpIiwiw5EiOiJOIiwiw7EiOiJuIiwiw5IiOiJPIiwiw5MiOiJPIiwiw5QiOiJPIiwiw5UiOiJPIiwiw5YiOiJPIiwiw5giOiJPIiwiw7IiOiJvIiwiw7MiOiJvIiwiw7QiOiJvIiwiw7UiOiJvIiwiw7YiOiJvIiwiw7giOiJvIiwiw5kiOiJVIiwiw5oiOiJVIiwiw5siOiJVIiwiw5wiOiJVIiwiw7kiOiJ1Iiwiw7oiOiJ1Iiwiw7siOiJ1Iiwiw7wiOiJ1Iiwiw50iOiJZIiwiw70iOiJ5Iiwiw78iOiJ5Iiwiw4YiOiJBZSIsIsOmIjoiYWUiLCLDniI6IlRoIiwiw74iOiJ0aCIsIsOfIjoic3MiLCLEgCI6IkEiLCLEgiI6IkEiLCLEhCI6IkEiLCLEgSI6ImEiLCLEgyI6ImEiLCLEhSI6ImEiLCLEhiI6IkMiLCLEiCI6IkMiLCLEiiI6IkMiLCLEjCI6IkMiLCLEhyI6ImMiLCLEiSI6ImMiLCLEiyI6ImMiLCLEjSI6ImMiLCLEjiI6IkQiLCLEkCI6IkQiLCLEjyI6ImQiLCLEkSI6ImQiLCLEkiI6IkUiLCLElCI6IkUiLCLEliI6IkUiLCLEmCI6IkUiLCLEmiI6IkUiLCLEkyI6ImUiLCLElSI6ImUiLCLElyI6ImUiLCLEmSI6ImUiLCLEmyI6ImUiLCLEnCI6IkciLCLEniI6IkciLCLEoCI6IkciLCLEoiI6IkciLCLEnSI6ImciLCLEnyI6ImciLCLEoSI6ImciLCLEoyI6ImciLCLEpCI6IkgiLCLEpiI6IkgiLCLEpSI6ImgiLCLEpyI6ImgiLCLEqCI6IkkiLCLEqiI6IkkiLCLErCI6IkkiLCLEriI6IkkiLCLEsCI6IkkiLCLEqSI6ImkiLCLEqyI6ImkiLCLErSI6ImkiLCLEryI6ImkiLCLEsSI6ImkiLCLEtCI6IkoiLCLEtSI6ImoiLCLEtiI6IksiLCLEtyI6ImsiLCLEuCI6ImsiLCLEuSI6IkwiLCLEuyI6IkwiLCLEvSI6IkwiLCLEvyI6IkwiLCLFgSI6IkwiLCLEuiI6ImwiLCLEvCI6ImwiLCLEviI6ImwiLCLFgCI6ImwiLCLFgiI6ImwiLCLFgyI6Ik4iLCLFhSI6Ik4iLCLFhyI6Ik4iLCLFiiI6Ik4iLCLFhCI6Im4iLCLFhiI6Im4iLCLFiCI6Im4iLCLFiyI6Im4iLCLFjCI6Ik8iLCLFjiI6Ik8iLCLFkCI6Ik8iLCLFjSI6Im8iLCLFjyI6Im8iLCLFkSI6Im8iLCLFlCI6IlIiLCLFliI6IlIiLCLFmCI6IlIiLCLFlSI6InIiLCLFlyI6InIiLCLFmSI6InIiLCLFmiI6IlMiLCLFnCI6IlMiLCLFniI6IlMiLCLFoCI6IlMiLCLFmyI6InMiLCLFnSI6InMiLCLFnyI6InMiLCLFoSI6InMiLCLFoiI6IlQiLCLFpCI6IlQiLCLFpiI6IlQiLCLFoyI6InQiLCLFpSI6InQiLCLFpyI6InQiLCLFqCI6IlUiLCLFqiI6IlUiLCLFrCI6IlUiLCLFriI6IlUiLCLFsCI6IlUiLCLFsiI6IlUiLCLFqSI6InUiLCLFqyI6InUiLCLFrSI6InUiLCLFryI6InUiLCLFsSI6InUiLCLFsyI6InUiLCLFtCI6IlciLCLFtSI6InciLCLFtiI6IlkiLCLFtyI6InkiLCLFuCI6IlkiLCLFuSI6IloiLCLFuyI6IloiLCLFvSI6IloiLCLFuiI6InoiLCLFvCI6InoiLCLFviI6InoiLCLEsiI6IklKIiwixLMiOiJpaiIsIsWSIjoiT2UiLCLFkyI6Im9lIiwixYkiOiInbiIsIsW/IjoicyJ9KSxCdD1TdCh7IiYiOiImYW1wOyIsIjwiOiImbHQ7IiwiPiI6IiZndDsiLCciJzoiJnF1b3Q7IiwiJyI6IiYjMzk7In0pO2Z1bmN0aW9uIHF0KGUpe3JldHVybiJcXCIrRmVbZV19ZnVuY3Rpb24gTXQoZSl7cmV0dXJuIFBlLnRlc3QoZSl9ZnVuY3Rpb24gSHQoZSl7dmFyIHQ9LTEsbj1BcnJheShlLnNpemUpO3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKGUscil7blsrK3RdPVtyLGVdfSkpLG59ZnVuY3Rpb24gRnQoZSx0KXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIGUodChuKSl9fWZ1bmN0aW9uIFd0KGUsdCl7Zm9yKHZhciBuPS0xLHI9ZS5sZW5ndGgsaT0wLG89W107KytuPHI7KXt2YXIgcz1lW25dO3MhPT10JiZzIT09YXx8KGVbbl09YSxvW2krK109bil9cmV0dXJuIG99ZnVuY3Rpb24gVXQoZSl7dmFyIHQ9LTEsbj1BcnJheShlLnNpemUpO3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKGUpe25bKyt0XT1lfSkpLG59ZnVuY3Rpb24genQoZSl7dmFyIHQ9LTEsbj1BcnJheShlLnNpemUpO3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKGUpe25bKyt0XT1bZSxlXX0pKSxufWZ1bmN0aW9uIFF0KGUpe3JldHVybiBNdChlKT9mdW5jdGlvbihlKXt2YXIgdD1JZS5sYXN0SW5kZXg9MDtmb3IoO0llLnRlc3QoZSk7KSsrdDtyZXR1cm4gdH0oZSk6eXQoZSl9ZnVuY3Rpb24gVnQoZSl7cmV0dXJuIE10KGUpP2Z1bmN0aW9uKGUpe3JldHVybiBlLm1hdGNoKEllKXx8W119KGUpOmZ1bmN0aW9uKGUpe3JldHVybiBlLnNwbGl0KCIiKX0oZSl9ZnVuY3Rpb24gS3QoZSl7Zm9yKHZhciB0PWUubGVuZ3RoO3QtLSYmWC50ZXN0KGUuY2hhckF0KHQpKTspO3JldHVybiB0fXZhciBYdD1TdCh7IiZhbXA7IjoiJiIsIiZsdDsiOiI8IiwiJmd0OyI6Ij4iLCImcXVvdDsiOiciJywiJiMzOTsiOiInIn0pO3ZhciBZdD1mdW5jdGlvbiBlKHQpe3ZhciBuLHI9KHQ9bnVsbD09dD9WZTpZdC5kZWZhdWx0cyhWZS5PYmplY3QoKSx0LFl0LnBpY2soVmUsQmUpKSkuQXJyYXksaT10LkRhdGUsWD10LkVycm9yLGRlPXQuRnVuY3Rpb24saGU9dC5NYXRoLHBlPXQuT2JqZWN0LGdlPXQuUmVnRXhwLHZlPXQuU3RyaW5nLG1lPXQuVHlwZUVycm9yLHllPXIucHJvdG90eXBlLGJlPWRlLnByb3RvdHlwZSxfZT1wZS5wcm90b3R5cGUsd2U9dFsiX19jb3JlLWpzX3NoYXJlZF9fIl0seGU9YmUudG9TdHJpbmcsVGU9X2UuaGFzT3duUHJvcGVydHksRWU9MCxDZT0obj0vW14uXSskLy5leGVjKHdlJiZ3ZS5rZXlzJiZ3ZS5rZXlzLklFX1BST1RPfHwiIikpPyJTeW1ib2woc3JjKV8xLiIrbjoiIixTZT1fZS50b1N0cmluZyxrZT14ZS5jYWxsKHBlKSxBZT1WZS5fLE5lPWdlKCJeIit4ZS5jYWxsKFRlKS5yZXBsYWNlKFEsIlxcJCYiKS5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcKCl8IGZvciAuKz8oPz1cXFxdKS9nLCIkMS4qPyIpKyIkIiksRGU9WWU/dC5CdWZmZXI6dm9pZCAwLGplPXQuU3ltYm9sLEllPXQuVWludDhBcnJheSxQZT1EZT9EZS5hbGxvY1Vuc2FmZTp2b2lkIDAsRmU9RnQocGUuZ2V0UHJvdG90eXBlT2YscGUpLHplPXBlLmNyZWF0ZSxRZT1fZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxLZT15ZS5zcGxpY2UsWGU9amU/amUuaXNDb25jYXRTcHJlYWRhYmxlOnZvaWQgMCxKZT1qZT9qZS5pdGVyYXRvcjp2b2lkIDAsR2U9amU/amUudG9TdHJpbmdUYWc6dm9pZCAwLHl0PWZ1bmN0aW9uKCl7dHJ5e3ZhciBlPWVvKHBlLCJkZWZpbmVQcm9wZXJ0eSIpO3JldHVybiBlKHt9LCIiLHt9KSxlfWNhdGNoKGUpe319KCksU3Q9dC5jbGVhclRpbWVvdXQhPT1WZS5jbGVhclRpbWVvdXQmJnQuY2xlYXJUaW1lb3V0LEp0PWkmJmkubm93IT09VmUuRGF0ZS5ub3cmJmkubm93LEd0PXQuc2V0VGltZW91dCE9PVZlLnNldFRpbWVvdXQmJnQuc2V0VGltZW91dCxadD1oZS5jZWlsLGVuPWhlLmZsb29yLHRuPXBlLmdldE93blByb3BlcnR5U3ltYm9scyxubj1EZT9EZS5pc0J1ZmZlcjp2b2lkIDAscm49dC5pc0Zpbml0ZSxvbj15ZS5qb2luLGFuPUZ0KHBlLmtleXMscGUpLHNuPWhlLm1heCx1bj1oZS5taW4sbG49aS5ub3csY249dC5wYXJzZUludCxmbj1oZS5yYW5kb20sZG49eWUucmV2ZXJzZSxobj1lbyh0LCJEYXRhVmlldyIpLHBuPWVvKHQsIk1hcCIpLGduPWVvKHQsIlByb21pc2UiKSx2bj1lbyh0LCJTZXQiKSxtbj1lbyh0LCJXZWFrTWFwIikseW49ZW8ocGUsImNyZWF0ZSIpLGJuPW1uJiZuZXcgbW4sX249e30sd249QW8oaG4pLHhuPUFvKHBuKSxUbj1BbyhnbiksRW49QW8odm4pLENuPUFvKG1uKSxTbj1qZT9qZS5wcm90b3R5cGU6dm9pZCAwLGtuPVNuP1NuLnZhbHVlT2Y6dm9pZCAwLEFuPVNuP1NuLnRvU3RyaW5nOnZvaWQgMDtmdW5jdGlvbiBObihlKXtpZih6YShlKSYmIUlhKGUpJiYhKGUgaW5zdGFuY2VvZiBMbikpe2lmKGUgaW5zdGFuY2VvZiBPbilyZXR1cm4gZTtpZihUZS5jYWxsKGUsIl9fd3JhcHBlZF9fIikpcmV0dXJuIE5vKGUpfXJldHVybiBuZXcgT24oZSl9dmFyIERuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe31yZXR1cm4gZnVuY3Rpb24odCl7aWYoIVVhKHQpKXJldHVybnt9O2lmKHplKXJldHVybiB6ZSh0KTtlLnByb3RvdHlwZT10O3ZhciBuPW5ldyBlO3JldHVybiBlLnByb3RvdHlwZT12b2lkIDAsbn19KCk7ZnVuY3Rpb24gam4oKXt9ZnVuY3Rpb24gT24oZSx0KXt0aGlzLl9fd3JhcHBlZF9fPWUsdGhpcy5fX2FjdGlvbnNfXz1bXSx0aGlzLl9fY2hhaW5fXz0hIXQsdGhpcy5fX2luZGV4X189MCx0aGlzLl9fdmFsdWVzX189dm9pZCAwfWZ1bmN0aW9uIExuKGUpe3RoaXMuX193cmFwcGVkX189ZSx0aGlzLl9fYWN0aW9uc19fPVtdLHRoaXMuX19kaXJfXz0xLHRoaXMuX19maWx0ZXJlZF9fPSExLHRoaXMuX19pdGVyYXRlZXNfXz1bXSx0aGlzLl9fdGFrZUNvdW50X189NDI5NDk2NzI5NSx0aGlzLl9fdmlld3NfXz1bXX1mdW5jdGlvbiBJbihlKXt2YXIgdD0tMSxuPW51bGw9PWU/MDplLmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrdDxuOyl7dmFyIHI9ZVt0XTt0aGlzLnNldChyWzBdLHJbMV0pfX1mdW5jdGlvbiBSbihlKXt2YXIgdD0tMSxuPW51bGw9PWU/MDplLmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrdDxuOyl7dmFyIHI9ZVt0XTt0aGlzLnNldChyWzBdLHJbMV0pfX1mdW5jdGlvbiBQbihlKXt2YXIgdD0tMSxuPW51bGw9PWU/MDplLmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrdDxuOyl7dmFyIHI9ZVt0XTt0aGlzLnNldChyWzBdLHJbMV0pfX1mdW5jdGlvbiAkbihlKXt2YXIgdD0tMSxuPW51bGw9PWU/MDplLmxlbmd0aDtmb3IodGhpcy5fX2RhdGFfXz1uZXcgUG47Kyt0PG47KXRoaXMuYWRkKGVbdF0pfWZ1bmN0aW9uIEJuKGUpe3ZhciB0PXRoaXMuX19kYXRhX189bmV3IFJuKGUpO3RoaXMuc2l6ZT10LnNpemV9ZnVuY3Rpb24gcW4oZSx0KXt2YXIgbj1JYShlKSxyPSFuJiZMYShlKSxpPSFuJiYhciYmQmEoZSksbz0hbiYmIXImJiFpJiZaYShlKSxhPW58fHJ8fGl8fG8scz1hP050KGUubGVuZ3RoLHZlKTpbXSx1PXMubGVuZ3RoO2Zvcih2YXIgbCBpbiBlKSF0JiYhVGUuY2FsbChlLGwpfHxhJiYoImxlbmd0aCI9PWx8fGkmJigib2Zmc2V0Ij09bHx8InBhcmVudCI9PWwpfHxvJiYoImJ1ZmZlciI9PWx8fCJieXRlTGVuZ3RoIj09bHx8ImJ5dGVPZmZzZXQiPT1sKXx8c28obCx1KSl8fHMucHVzaChsKTtyZXR1cm4gc31mdW5jdGlvbiBNbihlKXt2YXIgdD1lLmxlbmd0aDtyZXR1cm4gdD9lWyRyKDAsdC0xKV06dm9pZCAwfWZ1bmN0aW9uIEhuKGUsdCl7cmV0dXJuIENvKHlpKGUpLFluKHQsMCxlLmxlbmd0aCkpfWZ1bmN0aW9uIEZuKGUpe3JldHVybiBDbyh5aShlKSl9ZnVuY3Rpb24gV24oZSx0LG4peyh2b2lkIDAhPT1uJiYhRGEoZVt0XSxuKXx8dm9pZCAwPT09biYmISh0IGluIGUpKSYmS24oZSx0LG4pfWZ1bmN0aW9uIFVuKGUsdCxuKXt2YXIgcj1lW3RdO1RlLmNhbGwoZSx0KSYmRGEocixuKSYmKHZvaWQgMCE9PW58fHQgaW4gZSl8fEtuKGUsdCxuKX1mdW5jdGlvbiB6bihlLHQpe2Zvcih2YXIgbj1lLmxlbmd0aDtuLS07KWlmKERhKGVbbl1bMF0sdCkpcmV0dXJuIG47cmV0dXJuLTF9ZnVuY3Rpb24gUW4oZSx0LG4scil7cmV0dXJuIHRyKGUsKGZ1bmN0aW9uKGUsaSxvKXt0KHIsZSxuKGUpLG8pfSkpLHJ9ZnVuY3Rpb24gVm4oZSx0KXtyZXR1cm4gZSYmYmkodCx3cyh0KSxlKX1mdW5jdGlvbiBLbihlLHQsbil7Il9fcHJvdG9fXyI9PXQmJnl0P3l0KGUsdCx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6bix3cml0YWJsZTohMH0pOmVbdF09bn1mdW5jdGlvbiBYbihlLHQpe2Zvcih2YXIgbj0tMSxpPXQubGVuZ3RoLG89cihpKSxhPW51bGw9PWU7KytuPGk7KW9bbl09YT92b2lkIDA6dnMoZSx0W25dKTtyZXR1cm4gb31mdW5jdGlvbiBZbihlLHQsbil7cmV0dXJuIGU9PWUmJih2b2lkIDAhPT1uJiYoZT1lPD1uP2U6biksdm9pZCAwIT09dCYmKGU9ZT49dD9lOnQpKSxlfWZ1bmN0aW9uIEpuKGUsdCxuLHIsaSxvKXt2YXIgYSxzPTEmdCxsPTImdCxkPTQmdDtpZihuJiYoYT1pP24oZSxyLGksbyk6bihlKSksdm9pZCAwIT09YSlyZXR1cm4gYTtpZighVWEoZSkpcmV0dXJuIGU7dmFyIHg9SWEoZSk7aWYoeCl7aWYoYT1mdW5jdGlvbihlKXt2YXIgdD1lLmxlbmd0aCxuPW5ldyBlLmNvbnN0cnVjdG9yKHQpO3QmJiJzdHJpbmciPT10eXBlb2YgZVswXSYmVGUuY2FsbChlLCJpbmRleCIpJiYobi5pbmRleD1lLmluZGV4LG4uaW5wdXQ9ZS5pbnB1dCk7cmV0dXJuIG59KGUpLCFzKXJldHVybiB5aShlLGEpfWVsc2V7dmFyIEw9cm8oZSksST1MPT1ofHxMPT1wO2lmKEJhKGUpKXJldHVybiBkaShlLHMpO2lmKEw9PW18fEw9PXV8fEkmJiFpKXtpZihhPWx8fEk/e306b28oZSksIXMpcmV0dXJuIGw/ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYmkoZSxubyhlKSx0KX0oZSxmdW5jdGlvbihlLHQpe3JldHVybiBlJiZiaSh0LHhzKHQpLGUpfShhLGUpKTpmdW5jdGlvbihlLHQpe3JldHVybiBiaShlLHRvKGUpLHQpfShlLFZuKGEsZSkpfWVsc2V7aWYoIUhlW0xdKXJldHVybiBpP2U6e307YT1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5jb25zdHJ1Y3Rvcjtzd2l0Y2godCl7Y2FzZSBUOnJldHVybiBoaShlKTtjYXNlIGM6Y2FzZSBmOnJldHVybiBuZXcgcigrZSk7Y2FzZSBFOnJldHVybiBmdW5jdGlvbihlLHQpe3ZhciBuPXQ/aGkoZS5idWZmZXIpOmUuYnVmZmVyO3JldHVybiBuZXcgZS5jb25zdHJ1Y3RvcihuLGUuYnl0ZU9mZnNldCxlLmJ5dGVMZW5ndGgpfShlLG4pO2Nhc2UgQzpjYXNlIFM6Y2FzZSBrOmNhc2UgQTpjYXNlIE46Y2FzZSBEOmNhc2UiW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iOmNhc2UgajpjYXNlIE86cmV0dXJuIHBpKGUsbik7Y2FzZSBnOnJldHVybiBuZXcgcjtjYXNlIHY6Y2FzZSBfOnJldHVybiBuZXcgcihlKTtjYXNlIHk6cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBlLmNvbnN0cnVjdG9yKGUuc291cmNlLHJlLmV4ZWMoZSkpO3JldHVybiB0Lmxhc3RJbmRleD1lLmxhc3RJbmRleCx0fShlKTtjYXNlIGI6cmV0dXJuIG5ldyByO2Nhc2UgdzpyZXR1cm4gaT1lLGtuP3BlKGtuLmNhbGwoaSkpOnt9fXZhciBpfShlLEwscyl9fW98fChvPW5ldyBCbik7dmFyIFI9by5nZXQoZSk7aWYoUilyZXR1cm4gUjtvLnNldChlLGEpLFlhKGUpP2UuZm9yRWFjaCgoZnVuY3Rpb24ocil7YS5hZGQoSm4ocix0LG4scixlLG8pKX0pKTpRYShlKSYmZS5mb3JFYWNoKChmdW5jdGlvbihyLGkpe2Euc2V0KGksSm4ocix0LG4saSxlLG8pKX0pKTt2YXIgUD14P3ZvaWQgMDooZD9sP1ZpOlFpOmw/eHM6d3MpKGUpO3JldHVybiBzdChQfHxlLChmdW5jdGlvbihyLGkpe1AmJihyPWVbaT1yXSksVW4oYSxpLEpuKHIsdCxuLGksZSxvKSl9KSksYX1mdW5jdGlvbiBHbihlLHQsbil7dmFyIHI9bi5sZW5ndGg7aWYobnVsbD09ZSlyZXR1cm4hcjtmb3IoZT1wZShlKTtyLS07KXt2YXIgaT1uW3JdLG89dFtpXSxhPWVbaV07aWYodm9pZCAwPT09YSYmIShpIGluIGUpfHwhbyhhKSlyZXR1cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiBabihlLHQsbil7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IG1lKG8pO3JldHVybiB3bygoZnVuY3Rpb24oKXtlLmFwcGx5KHZvaWQgMCxuKX0pLHQpfWZ1bmN0aW9uIGVyKGUsdCxuLHIpe3ZhciBpPS0xLG89ZnQsYT0hMCxzPWUubGVuZ3RoLHU9W10sbD10Lmxlbmd0aDtpZighcylyZXR1cm4gdTtuJiYodD1odCh0LGp0KG4pKSkscj8obz1kdCxhPSExKTp0Lmxlbmd0aD49MjAwJiYobz1MdCxhPSExLHQ9bmV3ICRuKHQpKTtlOmZvcig7KytpPHM7KXt2YXIgYz1lW2ldLGY9bnVsbD09bj9jOm4oYyk7aWYoYz1yfHwwIT09Yz9jOjAsYSYmZj09Zil7Zm9yKHZhciBkPWw7ZC0tOylpZih0W2RdPT09Ziljb250aW51ZSBlO3UucHVzaChjKX1lbHNlIG8odCxmLHIpfHx1LnB1c2goYyl9cmV0dXJuIHV9Tm4udGVtcGxhdGVTZXR0aW5ncz17ZXNjYXBlOk0sZXZhbHVhdGU6SCxpbnRlcnBvbGF0ZTpGLHZhcmlhYmxlOiIiLGltcG9ydHM6e186Tm59fSxObi5wcm90b3R5cGU9am4ucHJvdG90eXBlLE5uLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1ObixPbi5wcm90b3R5cGU9RG4oam4ucHJvdG90eXBlKSxPbi5wcm90b3R5cGUuY29uc3RydWN0b3I9T24sTG4ucHJvdG90eXBlPURuKGpuLnByb3RvdHlwZSksTG4ucHJvdG90eXBlLmNvbnN0cnVjdG9yPUxuLEluLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189eW4/eW4obnVsbCk6e30sdGhpcy5zaXplPTB9LEluLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5oYXMoZSkmJmRlbGV0ZSB0aGlzLl9fZGF0YV9fW2VdO3JldHVybiB0aGlzLnNpemUtPXQ/MTowLHR9LEluLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fX2RhdGFfXztpZih5bil7dmFyIG49dFtlXTtyZXR1cm4iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI9PT1uP3ZvaWQgMDpufXJldHVybiBUZS5jYWxsKHQsZSk/dFtlXTp2b2lkIDB9LEluLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fX2RhdGFfXztyZXR1cm4geW4/dm9pZCAwIT09dFtlXTpUZS5jYWxsKHQsZSl9LEluLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLl9fZGF0YV9fO3JldHVybiB0aGlzLnNpemUrPXRoaXMuaGFzKGUpPzA6MSxuW2VdPXluJiZ2b2lkIDA9PT10PyJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjp0LHRoaXN9LFJuLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189W10sdGhpcy5zaXplPTB9LFJuLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fX2RhdGFfXyxuPXpuKHQsZSk7cmV0dXJuIShuPDApJiYobj09dC5sZW5ndGgtMT90LnBvcCgpOktlLmNhbGwodCxuLDEpLC0tdGhpcy5zaXplLCEwKX0sUm4ucHJvdG90eXBlLmdldD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9fZGF0YV9fLG49em4odCxlKTtyZXR1cm4gbjwwP3ZvaWQgMDp0W25dWzFdfSxSbi5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKGUpe3JldHVybiB6bih0aGlzLl9fZGF0YV9fLGUpPi0xfSxSbi5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5fX2RhdGFfXyxyPXpuKG4sZSk7cmV0dXJuIHI8MD8oKyt0aGlzLnNpemUsbi5wdXNoKFtlLHRdKSk6bltyXVsxXT10LHRoaXN9LFBuLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuc2l6ZT0wLHRoaXMuX19kYXRhX189e2hhc2g6bmV3IEluLG1hcDpuZXcocG58fFJuKSxzdHJpbmc6bmV3IElufX0sUG4ucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbihlKXt2YXIgdD1HaSh0aGlzLGUpLmRlbGV0ZShlKTtyZXR1cm4gdGhpcy5zaXplLT10PzE6MCx0fSxQbi5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKGUpe3JldHVybiBHaSh0aGlzLGUpLmdldChlKX0sUG4ucHJvdG90eXBlLmhhcz1mdW5jdGlvbihlKXtyZXR1cm4gR2kodGhpcyxlKS5oYXMoZSl9LFBuLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj1HaSh0aGlzLGUpLHI9bi5zaXplO3JldHVybiBuLnNldChlLHQpLHRoaXMuc2l6ZSs9bi5zaXplPT1yPzA6MSx0aGlzfSwkbi5wcm90b3R5cGUuYWRkPSRuLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9fZGF0YV9fLnNldChlLCJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIiksdGhpc30sJG4ucHJvdG90eXBlLmhhcz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXMoZSl9LEJuLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189bmV3IFJuLHRoaXMuc2l6ZT0wfSxCbi5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX19kYXRhX18sbj10LmRlbGV0ZShlKTtyZXR1cm4gdGhpcy5zaXplPXQuc2l6ZSxufSxCbi5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9fZGF0YV9fLmdldChlKX0sQm4ucHJvdG90eXBlLmhhcz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXMoZSl9LEJuLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLl9fZGF0YV9fO2lmKG4gaW5zdGFuY2VvZiBSbil7dmFyIHI9bi5fX2RhdGFfXztpZighcG58fHIubGVuZ3RoPDE5OSlyZXR1cm4gci5wdXNoKFtlLHRdKSx0aGlzLnNpemU9KytuLnNpemUsdGhpcztuPXRoaXMuX19kYXRhX189bmV3IFBuKHIpfXJldHVybiBuLnNldChlLHQpLHRoaXMuc2l6ZT1uLnNpemUsdGhpc307dmFyIHRyPXhpKGxyKSxucj14aShjciwhMCk7ZnVuY3Rpb24gcnIoZSx0KXt2YXIgbj0hMDtyZXR1cm4gdHIoZSwoZnVuY3Rpb24oZSxyLGkpe3JldHVybiBuPSEhdChlLHIsaSl9KSksbn1mdW5jdGlvbiBpcihlLHQsbil7Zm9yKHZhciByPS0xLGk9ZS5sZW5ndGg7KytyPGk7KXt2YXIgbz1lW3JdLGE9dChvKTtpZihudWxsIT1hJiYodm9pZCAwPT09cz9hPT1hJiYhR2EoYSk6bihhLHMpKSl2YXIgcz1hLHU9b31yZXR1cm4gdX1mdW5jdGlvbiBvcihlLHQpe3ZhciBuPVtdO3JldHVybiB0cihlLChmdW5jdGlvbihlLHIsaSl7dChlLHIsaSkmJm4ucHVzaChlKX0pKSxufWZ1bmN0aW9uIGFyKGUsdCxuLHIsaSl7dmFyIG89LTEsYT1lLmxlbmd0aDtmb3Iobnx8KG49YW8pLGl8fChpPVtdKTsrK288YTspe3ZhciBzPWVbb107dD4wJiZuKHMpP3Q+MT9hcihzLHQtMSxuLHIsaSk6cHQoaSxzKTpyfHwoaVtpLmxlbmd0aF09cyl9cmV0dXJuIGl9dmFyIHNyPVRpKCksdXI9VGkoITApO2Z1bmN0aW9uIGxyKGUsdCl7cmV0dXJuIGUmJnNyKGUsdCx3cyl9ZnVuY3Rpb24gY3IoZSx0KXtyZXR1cm4gZSYmdXIoZSx0LHdzKX1mdW5jdGlvbiBmcihlLHQpe3JldHVybiBjdCh0LChmdW5jdGlvbih0KXtyZXR1cm4gSGEoZVt0XSl9KSl9ZnVuY3Rpb24gZHIoZSx0KXtmb3IodmFyIG49MCxyPSh0PXVpKHQsZSkpLmxlbmd0aDtudWxsIT1lJiZuPHI7KWU9ZVtrbyh0W24rK10pXTtyZXR1cm4gbiYmbj09cj9lOnZvaWQgMH1mdW5jdGlvbiBocihlLHQsbil7dmFyIHI9dChlKTtyZXR1cm4gSWEoZSk/cjpwdChyLG4oZSkpfWZ1bmN0aW9uIHByKGUpe3JldHVybiBudWxsPT1lP3ZvaWQgMD09PWU/IltvYmplY3QgVW5kZWZpbmVkXSI6IltvYmplY3QgTnVsbF0iOkdlJiZHZSBpbiBwZShlKT9mdW5jdGlvbihlKXt2YXIgdD1UZS5jYWxsKGUsR2UpLG49ZVtHZV07dHJ5e2VbR2VdPXZvaWQgMDt2YXIgcj0hMH1jYXRjaChlKXt9dmFyIGk9U2UuY2FsbChlKTtyJiYodD9lW0dlXT1uOmRlbGV0ZSBlW0dlXSk7cmV0dXJuIGl9KGUpOmZ1bmN0aW9uKGUpe3JldHVybiBTZS5jYWxsKGUpfShlKX1mdW5jdGlvbiBncihlLHQpe3JldHVybiBlPnR9ZnVuY3Rpb24gdnIoZSx0KXtyZXR1cm4gbnVsbCE9ZSYmVGUuY2FsbChlLHQpfWZ1bmN0aW9uIG1yKGUsdCl7cmV0dXJuIG51bGwhPWUmJnQgaW4gcGUoZSl9ZnVuY3Rpb24geXIoZSx0LG4pe2Zvcih2YXIgaT1uP2R0OmZ0LG89ZVswXS5sZW5ndGgsYT1lLmxlbmd0aCxzPWEsdT1yKGEpLGw9MS8wLGM9W107cy0tOyl7dmFyIGY9ZVtzXTtzJiZ0JiYoZj1odChmLGp0KHQpKSksbD11bihmLmxlbmd0aCxsKSx1W3NdPSFuJiYodHx8bz49MTIwJiZmLmxlbmd0aD49MTIwKT9uZXcgJG4ocyYmZik6dm9pZCAwfWY9ZVswXTt2YXIgZD0tMSxoPXVbMF07ZTpmb3IoOysrZDxvJiZjLmxlbmd0aDxsOyl7dmFyIHA9ZltkXSxnPXQ/dChwKTpwO2lmKHA9bnx8MCE9PXA/cDowLCEoaD9MdChoLGcpOmkoYyxnLG4pKSl7Zm9yKHM9YTstLXM7KXt2YXIgdj11W3NdO2lmKCEodj9MdCh2LGcpOmkoZVtzXSxnLG4pKSljb250aW51ZSBlfWgmJmgucHVzaChnKSxjLnB1c2gocCl9fXJldHVybiBjfWZ1bmN0aW9uIGJyKGUsdCxuKXt2YXIgcj1udWxsPT0oZT1tbyhlLHQ9dWkodCxlKSkpP2U6ZVtrbyhNbyh0KSldO3JldHVybiBudWxsPT1yP3ZvaWQgMDpvdChyLGUsbil9ZnVuY3Rpb24gX3IoZSl7cmV0dXJuIHphKGUpJiZwcihlKT09dX1mdW5jdGlvbiB3cihlLHQsbixyLGkpe3JldHVybiBlPT09dHx8KG51bGw9PWV8fG51bGw9PXR8fCF6YShlKSYmIXphKHQpP2UhPWUmJnQhPXQ6ZnVuY3Rpb24oZSx0LG4scixpLG8pe3ZhciBhPUlhKGUpLHM9SWEodCksaD1hP2w6cm8oZSkscD1zP2w6cm8odCkseD0oaD1oPT11P206aCk9PW0sQz0ocD1wPT11P206cCk9PW0sUz1oPT1wO2lmKFMmJkJhKGUpKXtpZighQmEodCkpcmV0dXJuITE7YT0hMCx4PSExfWlmKFMmJiF4KXJldHVybiBvfHwobz1uZXcgQm4pLGF8fFphKGUpP1VpKGUsdCxuLHIsaSxvKTpmdW5jdGlvbihlLHQsbixyLGksbyxhKXtzd2l0Y2gobil7Y2FzZSBFOmlmKGUuYnl0ZUxlbmd0aCE9dC5ieXRlTGVuZ3RofHxlLmJ5dGVPZmZzZXQhPXQuYnl0ZU9mZnNldClyZXR1cm4hMTtlPWUuYnVmZmVyLHQ9dC5idWZmZXI7Y2FzZSBUOnJldHVybiEoZS5ieXRlTGVuZ3RoIT10LmJ5dGVMZW5ndGh8fCFvKG5ldyBJZShlKSxuZXcgSWUodCkpKTtjYXNlIGM6Y2FzZSBmOmNhc2UgdjpyZXR1cm4gRGEoK2UsK3QpO2Nhc2UgZDpyZXR1cm4gZS5uYW1lPT10Lm5hbWUmJmUubWVzc2FnZT09dC5tZXNzYWdlO2Nhc2UgeTpjYXNlIF86cmV0dXJuIGU9PXQrIiI7Y2FzZSBnOnZhciBzPUh0O2Nhc2UgYjp2YXIgdT0xJnI7aWYoc3x8KHM9VXQpLGUuc2l6ZSE9dC5zaXplJiYhdSlyZXR1cm4hMTt2YXIgbD1hLmdldChlKTtpZihsKXJldHVybiBsPT10O3J8PTIsYS5zZXQoZSx0KTt2YXIgaD1VaShzKGUpLHModCkscixpLG8sYSk7cmV0dXJuIGEuZGVsZXRlKGUpLGg7Y2FzZSB3OmlmKGtuKXJldHVybiBrbi5jYWxsKGUpPT1rbi5jYWxsKHQpfXJldHVybiExfShlLHQsaCxuLHIsaSxvKTtpZighKDEmbikpe3ZhciBrPXgmJlRlLmNhbGwoZSwiX193cmFwcGVkX18iKSxBPUMmJlRlLmNhbGwodCwiX193cmFwcGVkX18iKTtpZihrfHxBKXt2YXIgTj1rP2UudmFsdWUoKTplLEQ9QT90LnZhbHVlKCk6dDtyZXR1cm4gb3x8KG89bmV3IEJuKSxpKE4sRCxuLHIsbyl9fWlmKCFTKXJldHVybiExO3JldHVybiBvfHwobz1uZXcgQm4pLGZ1bmN0aW9uKGUsdCxuLHIsaSxvKXt2YXIgYT0xJm4scz1RaShlKSx1PXMubGVuZ3RoLGw9UWkodCkubGVuZ3RoO2lmKHUhPWwmJiFhKXJldHVybiExO3ZhciBjPXU7Zm9yKDtjLS07KXt2YXIgZj1zW2NdO2lmKCEoYT9mIGluIHQ6VGUuY2FsbCh0LGYpKSlyZXR1cm4hMX12YXIgZD1vLmdldChlKSxoPW8uZ2V0KHQpO2lmKGQmJmgpcmV0dXJuIGQ9PXQmJmg9PWU7dmFyIHA9ITA7by5zZXQoZSx0KSxvLnNldCh0LGUpO3ZhciBnPWE7Zm9yKDsrK2M8dTspe2Y9c1tjXTt2YXIgdj1lW2ZdLG09dFtmXTtpZihyKXZhciB5PWE/cihtLHYsZix0LGUsbyk6cih2LG0sZixlLHQsbyk7aWYoISh2b2lkIDA9PT15P3Y9PT1tfHxpKHYsbSxuLHIsbyk6eSkpe3A9ITE7YnJlYWt9Z3x8KGc9ImNvbnN0cnVjdG9yIj09Zil9aWYocCYmIWcpe3ZhciBiPWUuY29uc3RydWN0b3IsXz10LmNvbnN0cnVjdG9yO2I9PV98fCEoImNvbnN0cnVjdG9yImluIGUpfHwhKCJjb25zdHJ1Y3RvciJpbiB0KXx8ImZ1bmN0aW9uIj09dHlwZW9mIGImJmIgaW5zdGFuY2VvZiBiJiYiZnVuY3Rpb24iPT10eXBlb2YgXyYmXyBpbnN0YW5jZW9mIF98fChwPSExKX1yZXR1cm4gby5kZWxldGUoZSksby5kZWxldGUodCkscH0oZSx0LG4scixpLG8pfShlLHQsbixyLHdyLGkpKX1mdW5jdGlvbiB4cihlLHQsbixyKXt2YXIgaT1uLmxlbmd0aCxvPWksYT0hcjtpZihudWxsPT1lKXJldHVybiFvO2ZvcihlPXBlKGUpO2ktLTspe3ZhciBzPW5baV07aWYoYSYmc1syXT9zWzFdIT09ZVtzWzBdXTohKHNbMF1pbiBlKSlyZXR1cm4hMX1mb3IoOysraTxvOyl7dmFyIHU9KHM9bltpXSlbMF0sbD1lW3VdLGM9c1sxXTtpZihhJiZzWzJdKXtpZih2b2lkIDA9PT1sJiYhKHUgaW4gZSkpcmV0dXJuITF9ZWxzZXt2YXIgZj1uZXcgQm47aWYocil2YXIgZD1yKGwsYyx1LGUsdCxmKTtpZighKHZvaWQgMD09PWQ/d3IoYyxsLDMscixmKTpkKSlyZXR1cm4hMX19cmV0dXJuITB9ZnVuY3Rpb24gVHIoZSl7cmV0dXJuISghVWEoZSl8fCh0PWUsQ2UmJkNlIGluIHQpKSYmKEhhKGUpP05lOmFlKS50ZXN0KEFvKGUpKTt2YXIgdH1mdW5jdGlvbiBFcihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZT9lOm51bGw9PWU/VnM6Im9iamVjdCI9PXR5cGVvZiBlP0lhKGUpP0RyKGVbMF0sZVsxXSk6TnIoZSk6bnUoZSl9ZnVuY3Rpb24gQ3IoZSl7aWYoIWhvKGUpKXJldHVybiBhbihlKTt2YXIgdD1bXTtmb3IodmFyIG4gaW4gcGUoZSkpVGUuY2FsbChlLG4pJiYiY29uc3RydWN0b3IiIT1uJiZ0LnB1c2gobik7cmV0dXJuIHR9ZnVuY3Rpb24gU3IoZSl7aWYoIVVhKGUpKXJldHVybiBmdW5jdGlvbihlKXt2YXIgdD1bXTtpZihudWxsIT1lKWZvcih2YXIgbiBpbiBwZShlKSl0LnB1c2gobik7cmV0dXJuIHR9KGUpO3ZhciB0PWhvKGUpLG49W107Zm9yKHZhciByIGluIGUpKCJjb25zdHJ1Y3RvciIhPXJ8fCF0JiZUZS5jYWxsKGUscikpJiZuLnB1c2gocik7cmV0dXJuIG59ZnVuY3Rpb24ga3IoZSx0KXtyZXR1cm4gZTx0fWZ1bmN0aW9uIEFyKGUsdCl7dmFyIG49LTEsaT1QYShlKT9yKGUubGVuZ3RoKTpbXTtyZXR1cm4gdHIoZSwoZnVuY3Rpb24oZSxyLG8pe2lbKytuXT10KGUscixvKX0pKSxpfWZ1bmN0aW9uIE5yKGUpe3ZhciB0PVppKGUpO3JldHVybiAxPT10Lmxlbmd0aCYmdFswXVsyXT9nbyh0WzBdWzBdLHRbMF1bMV0pOmZ1bmN0aW9uKG4pe3JldHVybiBuPT09ZXx8eHIobixlLHQpfX1mdW5jdGlvbiBEcihlLHQpe3JldHVybiBsbyhlKSYmcG8odCk/Z28oa28oZSksdCk6ZnVuY3Rpb24obil7dmFyIHI9dnMobixlKTtyZXR1cm4gdm9pZCAwPT09ciYmcj09PXQ/bXMobixlKTp3cih0LHIsMyl9fWZ1bmN0aW9uIGpyKGUsdCxuLHIsaSl7ZSE9PXQmJnNyKHQsKGZ1bmN0aW9uKG8sYSl7aWYoaXx8KGk9bmV3IEJuKSxVYShvKSkhZnVuY3Rpb24oZSx0LG4scixpLG8sYSl7dmFyIHM9Ym8oZSxuKSx1PWJvKHQsbiksbD1hLmdldCh1KTtpZihsKXJldHVybiB2b2lkIFduKGUsbixsKTt2YXIgYz1vP28ocyx1LG4rIiIsZSx0LGEpOnZvaWQgMCxmPXZvaWQgMD09PWM7aWYoZil7dmFyIGQ9SWEodSksaD0hZCYmQmEodSkscD0hZCYmIWgmJlphKHUpO2M9dSxkfHxofHxwP0lhKHMpP2M9czokYShzKT9jPXlpKHMpOmg/KGY9ITEsYz1kaSh1LCEwKSk6cD8oZj0hMSxjPXBpKHUsITApKTpjPVtdOkthKHUpfHxMYSh1KT8oYz1zLExhKHMpP2M9c3Mocyk6VWEocykmJiFIYShzKXx8KGM9b28odSkpKTpmPSExfWYmJihhLnNldCh1LGMpLGkoYyx1LHIsbyxhKSxhLmRlbGV0ZSh1KSk7V24oZSxuLGMpfShlLHQsYSxuLGpyLHIsaSk7ZWxzZXt2YXIgcz1yP3IoYm8oZSxhKSxvLGErIiIsZSx0LGkpOnZvaWQgMDt2b2lkIDA9PT1zJiYocz1vKSxXbihlLGEscyl9fSkseHMpfWZ1bmN0aW9uIE9yKGUsdCl7dmFyIG49ZS5sZW5ndGg7aWYobilyZXR1cm4gc28odCs9dDwwP246MCxuKT9lW3RdOnZvaWQgMH1mdW5jdGlvbiBMcihlLHQsbil7dD10Lmxlbmd0aD9odCh0LChmdW5jdGlvbihlKXtyZXR1cm4gSWEoZSk/ZnVuY3Rpb24odCl7cmV0dXJuIGRyKHQsMT09PWUubGVuZ3RoP2VbMF06ZSl9OmV9KSk6W1ZzXTt2YXIgcj0tMTtyZXR1cm4gdD1odCh0LGp0KEppKCkpKSxmdW5jdGlvbihlLHQpe3ZhciBuPWUubGVuZ3RoO2ZvcihlLnNvcnQodCk7bi0tOyllW25dPWVbbl0udmFsdWU7cmV0dXJuIGV9KEFyKGUsKGZ1bmN0aW9uKGUsbixpKXtyZXR1cm57Y3JpdGVyaWE6aHQodCwoZnVuY3Rpb24odCl7cmV0dXJuIHQoZSl9KSksaW5kZXg6KytyLHZhbHVlOmV9fSkpLChmdW5jdGlvbihlLHQpe3JldHVybiBmdW5jdGlvbihlLHQsbil7dmFyIHI9LTEsaT1lLmNyaXRlcmlhLG89dC5jcml0ZXJpYSxhPWkubGVuZ3RoLHM9bi5sZW5ndGg7Zm9yKDsrK3I8YTspe3ZhciB1PWdpKGlbcl0sb1tyXSk7aWYodSl7aWYocj49cylyZXR1cm4gdTt2YXIgbD1uW3JdO3JldHVybiB1KigiZGVzYyI9PWw/LTE6MSl9fXJldHVybiBlLmluZGV4LXQuaW5kZXh9KGUsdCxuKX0pKX1mdW5jdGlvbiBJcihlLHQsbil7Zm9yKHZhciByPS0xLGk9dC5sZW5ndGgsbz17fTsrK3I8aTspe3ZhciBhPXRbcl0scz1kcihlLGEpO24ocyxhKSYmRnIobyx1aShhLGUpLHMpfXJldHVybiBvfWZ1bmN0aW9uIFJyKGUsdCxuLHIpe3ZhciBpPXI/eHQ6d3Qsbz0tMSxhPXQubGVuZ3RoLHM9ZTtmb3IoZT09PXQmJih0PXlpKHQpKSxuJiYocz1odChlLGp0KG4pKSk7KytvPGE7KWZvcih2YXIgdT0wLGw9dFtvXSxjPW4/bihsKTpsOyh1PWkocyxjLHUscikpPi0xOylzIT09ZSYmS2UuY2FsbChzLHUsMSksS2UuY2FsbChlLHUsMSk7cmV0dXJuIGV9ZnVuY3Rpb24gUHIoZSx0KXtmb3IodmFyIG49ZT90Lmxlbmd0aDowLHI9bi0xO24tLTspe3ZhciBpPXRbbl07aWYobj09cnx8aSE9PW8pe3ZhciBvPWk7c28oaSk/S2UuY2FsbChlLGksMSk6ZWkoZSxpKX19cmV0dXJuIGV9ZnVuY3Rpb24gJHIoZSx0KXtyZXR1cm4gZStlbihmbigpKih0LWUrMSkpfWZ1bmN0aW9uIEJyKGUsdCl7dmFyIG49IiI7aWYoIWV8fHQ8MXx8dD45MDA3MTk5MjU0NzQwOTkxKXJldHVybiBuO2Rve3QlMiYmKG4rPWUpLCh0PWVuKHQvMikpJiYoZSs9ZSl9d2hpbGUodCk7cmV0dXJuIG59ZnVuY3Rpb24gcXIoZSx0KXtyZXR1cm4geG8odm8oZSx0LFZzKSxlKyIiKX1mdW5jdGlvbiBNcihlKXtyZXR1cm4gTW4oRHMoZSkpfWZ1bmN0aW9uIEhyKGUsdCl7dmFyIG49RHMoZSk7cmV0dXJuIENvKG4sWW4odCwwLG4ubGVuZ3RoKSl9ZnVuY3Rpb24gRnIoZSx0LG4scil7aWYoIVVhKGUpKXJldHVybiBlO2Zvcih2YXIgaT0tMSxvPSh0PXVpKHQsZSkpLmxlbmd0aCxhPW8tMSxzPWU7bnVsbCE9cyYmKytpPG87KXt2YXIgdT1rbyh0W2ldKSxsPW47aWYoIl9fcHJvdG9fXyI9PT11fHwiY29uc3RydWN0b3IiPT09dXx8InByb3RvdHlwZSI9PT11KXJldHVybiBlO2lmKGkhPWEpe3ZhciBjPXNbdV07dm9pZCAwPT09KGw9cj9yKGMsdSxzKTp2b2lkIDApJiYobD1VYShjKT9jOnNvKHRbaSsxXSk/W106e30pfVVuKHMsdSxsKSxzPXNbdV19cmV0dXJuIGV9dmFyIFdyPWJuP2Z1bmN0aW9uKGUsdCl7cmV0dXJuIGJuLnNldChlLHQpLGV9OlZzLFVyPXl0P2Z1bmN0aW9uKGUsdCl7cmV0dXJuIHl0KGUsInRvU3RyaW5nIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsdmFsdWU6VXModCksd3JpdGFibGU6ITB9KX06VnM7ZnVuY3Rpb24genIoZSl7cmV0dXJuIENvKERzKGUpKX1mdW5jdGlvbiBRcihlLHQsbil7dmFyIGk9LTEsbz1lLmxlbmd0aDt0PDAmJih0PS10Pm8/MDpvK3QpLChuPW4+bz9vOm4pPDAmJihuKz1vKSxvPXQ+bj8wOm4tdD4+PjAsdD4+Pj0wO2Zvcih2YXIgYT1yKG8pOysraTxvOylhW2ldPWVbaSt0XTtyZXR1cm4gYX1mdW5jdGlvbiBWcihlLHQpe3ZhciBuO3JldHVybiB0cihlLChmdW5jdGlvbihlLHIsaSl7cmV0dXJuIShuPXQoZSxyLGkpKX0pKSwhIW59ZnVuY3Rpb24gS3IoZSx0LG4pe3ZhciByPTAsaT1udWxsPT1lP3I6ZS5sZW5ndGg7aWYoIm51bWJlciI9PXR5cGVvZiB0JiZ0PT10JiZpPD0yMTQ3NDgzNjQ3KXtmb3IoO3I8aTspe3ZhciBvPXIraT4+PjEsYT1lW29dO251bGwhPT1hJiYhR2EoYSkmJihuP2E8PXQ6YTx0KT9yPW8rMTppPW99cmV0dXJuIGl9cmV0dXJuIFhyKGUsdCxWcyxuKX1mdW5jdGlvbiBYcihlLHQsbixyKXt2YXIgaT0wLG89bnVsbD09ZT8wOmUubGVuZ3RoO2lmKDA9PT1vKXJldHVybiAwO2Zvcih2YXIgYT0odD1uKHQpKSE9dCxzPW51bGw9PT10LHU9R2EodCksbD12b2lkIDA9PT10O2k8bzspe3ZhciBjPWVuKChpK28pLzIpLGY9bihlW2NdKSxkPXZvaWQgMCE9PWYsaD1udWxsPT09ZixwPWY9PWYsZz1HYShmKTtpZihhKXZhciB2PXJ8fHA7ZWxzZSB2PWw/cCYmKHJ8fGQpOnM/cCYmZCYmKHJ8fCFoKTp1P3AmJmQmJiFoJiYocnx8IWcpOiFoJiYhZyYmKHI/Zjw9dDpmPHQpO3Y/aT1jKzE6bz1jfXJldHVybiB1bihvLDQyOTQ5NjcyOTQpfWZ1bmN0aW9uIFlyKGUsdCl7Zm9yKHZhciBuPS0xLHI9ZS5sZW5ndGgsaT0wLG89W107KytuPHI7KXt2YXIgYT1lW25dLHM9dD90KGEpOmE7aWYoIW58fCFEYShzLHUpKXt2YXIgdT1zO29baSsrXT0wPT09YT8wOmF9fXJldHVybiBvfWZ1bmN0aW9uIEpyKGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZT9lOkdhKGUpP05hTjorZX1mdW5jdGlvbiBHcihlKXtpZigic3RyaW5nIj09dHlwZW9mIGUpcmV0dXJuIGU7aWYoSWEoZSkpcmV0dXJuIGh0KGUsR3IpKyIiO2lmKEdhKGUpKXJldHVybiBBbj9Bbi5jYWxsKGUpOiIiO3ZhciB0PWUrIiI7cmV0dXJuIjAiPT10JiYxL2U9PS0xLzA/Ii0wIjp0fWZ1bmN0aW9uIFpyKGUsdCxuKXt2YXIgcj0tMSxpPWZ0LG89ZS5sZW5ndGgsYT0hMCxzPVtdLHU9cztpZihuKWE9ITEsaT1kdDtlbHNlIGlmKG8+PTIwMCl7dmFyIGw9dD9udWxsOkJpKGUpO2lmKGwpcmV0dXJuIFV0KGwpO2E9ITEsaT1MdCx1PW5ldyAkbn1lbHNlIHU9dD9bXTpzO2U6Zm9yKDsrK3I8bzspe3ZhciBjPWVbcl0sZj10P3QoYyk6YztpZihjPW58fDAhPT1jP2M6MCxhJiZmPT1mKXtmb3IodmFyIGQ9dS5sZW5ndGg7ZC0tOylpZih1W2RdPT09Ziljb250aW51ZSBlO3QmJnUucHVzaChmKSxzLnB1c2goYyl9ZWxzZSBpKHUsZixuKXx8KHUhPT1zJiZ1LnB1c2goZikscy5wdXNoKGMpKX1yZXR1cm4gc31mdW5jdGlvbiBlaShlLHQpe3JldHVybiBudWxsPT0oZT1tbyhlLHQ9dWkodCxlKSkpfHxkZWxldGUgZVtrbyhNbyh0KSldfWZ1bmN0aW9uIHRpKGUsdCxuLHIpe3JldHVybiBGcihlLHQsbihkcihlLHQpKSxyKX1mdW5jdGlvbiBuaShlLHQsbixyKXtmb3IodmFyIGk9ZS5sZW5ndGgsbz1yP2k6LTE7KHI/by0tOisrbzxpKSYmdChlW29dLG8sZSk7KTtyZXR1cm4gbj9RcihlLHI/MDpvLHI/bysxOmkpOlFyKGUscj9vKzE6MCxyP2k6byl9ZnVuY3Rpb24gcmkoZSx0KXt2YXIgbj1lO3JldHVybiBuIGluc3RhbmNlb2YgTG4mJihuPW4udmFsdWUoKSksZ3QodCwoZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC5mdW5jLmFwcGx5KHQudGhpc0FyZyxwdChbZV0sdC5hcmdzKSl9KSxuKX1mdW5jdGlvbiBpaShlLHQsbil7dmFyIGk9ZS5sZW5ndGg7aWYoaTwyKXJldHVybiBpP1pyKGVbMF0pOltdO2Zvcih2YXIgbz0tMSxhPXIoaSk7KytvPGk7KWZvcih2YXIgcz1lW29dLHU9LTE7Kyt1PGk7KXUhPW8mJihhW29dPWVyKGFbb118fHMsZVt1XSx0LG4pKTtyZXR1cm4gWnIoYXIoYSwxKSx0LG4pfWZ1bmN0aW9uIG9pKGUsdCxuKXtmb3IodmFyIHI9LTEsaT1lLmxlbmd0aCxvPXQubGVuZ3RoLGE9e307KytyPGk7KXt2YXIgcz1yPG8/dFtyXTp2b2lkIDA7bihhLGVbcl0scyl9cmV0dXJuIGF9ZnVuY3Rpb24gYWkoZSl7cmV0dXJuICRhKGUpP2U6W119ZnVuY3Rpb24gc2koZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpWc31mdW5jdGlvbiB1aShlLHQpe3JldHVybiBJYShlKT9lOmxvKGUsdCk/W2VdOlNvKHVzKGUpKX12YXIgbGk9cXI7ZnVuY3Rpb24gY2koZSx0LG4pe3ZhciByPWUubGVuZ3RoO3JldHVybiBuPXZvaWQgMD09PW4/cjpuLCF0JiZuPj1yP2U6UXIoZSx0LG4pfXZhciBmaT1TdHx8ZnVuY3Rpb24oZSl7cmV0dXJuIFZlLmNsZWFyVGltZW91dChlKX07ZnVuY3Rpb24gZGkoZSx0KXtpZih0KXJldHVybiBlLnNsaWNlKCk7dmFyIG49ZS5sZW5ndGgscj1QZT9QZShuKTpuZXcgZS5jb25zdHJ1Y3RvcihuKTtyZXR1cm4gZS5jb3B5KHIpLHJ9ZnVuY3Rpb24gaGkoZSl7dmFyIHQ9bmV3IGUuY29uc3RydWN0b3IoZS5ieXRlTGVuZ3RoKTtyZXR1cm4gbmV3IEllKHQpLnNldChuZXcgSWUoZSkpLHR9ZnVuY3Rpb24gcGkoZSx0KXt2YXIgbj10P2hpKGUuYnVmZmVyKTplLmJ1ZmZlcjtyZXR1cm4gbmV3IGUuY29uc3RydWN0b3IobixlLmJ5dGVPZmZzZXQsZS5sZW5ndGgpfWZ1bmN0aW9uIGdpKGUsdCl7aWYoZSE9PXQpe3ZhciBuPXZvaWQgMCE9PWUscj1udWxsPT09ZSxpPWU9PWUsbz1HYShlKSxhPXZvaWQgMCE9PXQscz1udWxsPT09dCx1PXQ9PXQsbD1HYSh0KTtpZighcyYmIWwmJiFvJiZlPnR8fG8mJmEmJnUmJiFzJiYhbHx8ciYmYSYmdXx8IW4mJnV8fCFpKXJldHVybiAxO2lmKCFyJiYhbyYmIWwmJmU8dHx8bCYmbiYmaSYmIXImJiFvfHxzJiZuJiZpfHwhYSYmaXx8IXUpcmV0dXJuLTF9cmV0dXJuIDB9ZnVuY3Rpb24gdmkoZSx0LG4saSl7Zm9yKHZhciBvPS0xLGE9ZS5sZW5ndGgscz1uLmxlbmd0aCx1PS0xLGw9dC5sZW5ndGgsYz1zbihhLXMsMCksZj1yKGwrYyksZD0haTsrK3U8bDspZlt1XT10W3VdO2Zvcig7KytvPHM7KShkfHxvPGEpJiYoZltuW29dXT1lW29dKTtmb3IoO2MtLTspZlt1KytdPWVbbysrXTtyZXR1cm4gZn1mdW5jdGlvbiBtaShlLHQsbixpKXtmb3IodmFyIG89LTEsYT1lLmxlbmd0aCxzPS0xLHU9bi5sZW5ndGgsbD0tMSxjPXQubGVuZ3RoLGY9c24oYS11LDApLGQ9cihmK2MpLGg9IWk7KytvPGY7KWRbb109ZVtvXTtmb3IodmFyIHA9bzsrK2w8YzspZFtwK2xdPXRbbF07Zm9yKDsrK3M8dTspKGh8fG88YSkmJihkW3ArbltzXV09ZVtvKytdKTtyZXR1cm4gZH1mdW5jdGlvbiB5aShlLHQpe3ZhciBuPS0xLGk9ZS5sZW5ndGg7Zm9yKHR8fCh0PXIoaSkpOysrbjxpOyl0W25dPWVbbl07cmV0dXJuIHR9ZnVuY3Rpb24gYmkoZSx0LG4scil7dmFyIGk9IW47bnx8KG49e30pO2Zvcih2YXIgbz0tMSxhPXQubGVuZ3RoOysrbzxhOyl7dmFyIHM9dFtvXSx1PXI/cihuW3NdLGVbc10scyxuLGUpOnZvaWQgMDt2b2lkIDA9PT11JiYodT1lW3NdKSxpP0tuKG4scyx1KTpVbihuLHMsdSl9cmV0dXJuIG59ZnVuY3Rpb24gX2koZSx0KXtyZXR1cm4gZnVuY3Rpb24obixyKXt2YXIgaT1JYShuKT9hdDpRbixvPXQ/dCgpOnt9O3JldHVybiBpKG4sZSxKaShyLDIpLG8pfX1mdW5jdGlvbiB3aShlKXtyZXR1cm4gcXIoKGZ1bmN0aW9uKHQsbil7dmFyIHI9LTEsaT1uLmxlbmd0aCxvPWk+MT9uW2ktMV06dm9pZCAwLGE9aT4yP25bMl06dm9pZCAwO2ZvcihvPWUubGVuZ3RoPjMmJiJmdW5jdGlvbiI9PXR5cGVvZiBvPyhpLS0sbyk6dm9pZCAwLGEmJnVvKG5bMF0sblsxXSxhKSYmKG89aTwzP3ZvaWQgMDpvLGk9MSksdD1wZSh0KTsrK3I8aTspe3ZhciBzPW5bcl07cyYmZSh0LHMscixvKX1yZXR1cm4gdH0pKX1mdW5jdGlvbiB4aShlLHQpe3JldHVybiBmdW5jdGlvbihuLHIpe2lmKG51bGw9PW4pcmV0dXJuIG47aWYoIVBhKG4pKXJldHVybiBlKG4scik7Zm9yKHZhciBpPW4ubGVuZ3RoLG89dD9pOi0xLGE9cGUobik7KHQ/by0tOisrbzxpKSYmITEhPT1yKGFbb10sbyxhKTspO3JldHVybiBufX1mdW5jdGlvbiBUaShlKXtyZXR1cm4gZnVuY3Rpb24odCxuLHIpe2Zvcih2YXIgaT0tMSxvPXBlKHQpLGE9cih0KSxzPWEubGVuZ3RoO3MtLTspe3ZhciB1PWFbZT9zOisraV07aWYoITE9PT1uKG9bdV0sdSxvKSlicmVha31yZXR1cm4gdH19ZnVuY3Rpb24gRWkoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuPU10KHQ9dXModCkpP1Z0KHQpOnZvaWQgMCxyPW4/blswXTp0LmNoYXJBdCgwKSxpPW4/Y2kobiwxKS5qb2luKCIiKTp0LnNsaWNlKDEpO3JldHVybiByW2VdKCkraX19ZnVuY3Rpb24gQ2koZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBndChIcyhMcyh0KS5yZXBsYWNlKE9lLCIiKSksZSwiIil9fWZ1bmN0aW9uIFNpKGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cztzd2l0Y2godC5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbmV3IGU7Y2FzZSAxOnJldHVybiBuZXcgZSh0WzBdKTtjYXNlIDI6cmV0dXJuIG5ldyBlKHRbMF0sdFsxXSk7Y2FzZSAzOnJldHVybiBuZXcgZSh0WzBdLHRbMV0sdFsyXSk7Y2FzZSA0OnJldHVybiBuZXcgZSh0WzBdLHRbMV0sdFsyXSx0WzNdKTtjYXNlIDU6cmV0dXJuIG5ldyBlKHRbMF0sdFsxXSx0WzJdLHRbM10sdFs0XSk7Y2FzZSA2OnJldHVybiBuZXcgZSh0WzBdLHRbMV0sdFsyXSx0WzNdLHRbNF0sdFs1XSk7Y2FzZSA3OnJldHVybiBuZXcgZSh0WzBdLHRbMV0sdFsyXSx0WzNdLHRbNF0sdFs1XSx0WzZdKX12YXIgbj1EbihlLnByb3RvdHlwZSkscj1lLmFwcGx5KG4sdCk7cmV0dXJuIFVhKHIpP3I6bn19ZnVuY3Rpb24ga2koZSl7cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXt2YXIgaT1wZSh0KTtpZighUGEodCkpe3ZhciBvPUppKG4sMyk7dD13cyh0KSxuPWZ1bmN0aW9uKGUpe3JldHVybiBvKGlbZV0sZSxpKX19dmFyIGE9ZSh0LG4scik7cmV0dXJuIGE+LTE/aVtvP3RbYV06YV06dm9pZCAwfX1mdW5jdGlvbiBBaShlKXtyZXR1cm4gemkoKGZ1bmN0aW9uKHQpe3ZhciBuPXQubGVuZ3RoLHI9bixpPU9uLnByb3RvdHlwZS50aHJ1O2ZvcihlJiZ0LnJldmVyc2UoKTtyLS07KXt2YXIgYT10W3JdO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBhKXRocm93IG5ldyBtZShvKTtpZihpJiYhcyYmIndyYXBwZXIiPT1YaShhKSl2YXIgcz1uZXcgT24oW10sITApfWZvcihyPXM/cjpuOysrcjxuOyl7dmFyIHU9WGkoYT10W3JdKSxsPSJ3cmFwcGVyIj09dT9LaShhKTp2b2lkIDA7cz1sJiZjbyhsWzBdKSYmNDI0PT1sWzFdJiYhbFs0XS5sZW5ndGgmJjE9PWxbOV0/c1tYaShsWzBdKV0uYXBwbHkocyxsWzNdKToxPT1hLmxlbmd0aCYmY28oYSk/c1t1XSgpOnMudGhydShhKX1yZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHMscj1lWzBdO2lmKHMmJjE9PWUubGVuZ3RoJiZJYShyKSlyZXR1cm4gcy5wbGFudChyKS52YWx1ZSgpO2Zvcih2YXIgaT0wLG89bj90W2ldLmFwcGx5KHRoaXMsZSk6cjsrK2k8bjspbz10W2ldLmNhbGwodGhpcyxvKTtyZXR1cm4gb319KSl9ZnVuY3Rpb24gTmkoZSx0LG4saSxvLGEscyx1LGwsYyl7dmFyIGY9MTI4JnQsZD0xJnQsaD0yJnQscD0yNCZ0LGc9NTEyJnQsdj1oP3ZvaWQgMDpTaShlKTtyZXR1cm4gZnVuY3Rpb24gbSgpe2Zvcih2YXIgeT1hcmd1bWVudHMubGVuZ3RoLGI9cih5KSxfPXk7Xy0tOyliW19dPWFyZ3VtZW50c1tfXTtpZihwKXZhciB3PVlpKG0pLHg9UHQoYix3KTtpZihpJiYoYj12aShiLGksbyxwKSksYSYmKGI9bWkoYixhLHMscCkpLHktPXgscCYmeTxjKXt2YXIgVD1XdChiLHcpO3JldHVybiBQaShlLHQsTmksbS5wbGFjZWhvbGRlcixuLGIsVCx1LGwsYy15KX12YXIgRT1kP246dGhpcyxDPWg/RVtlXTplO3JldHVybiB5PWIubGVuZ3RoLHU/Yj15byhiLHUpOmcmJnk+MSYmYi5yZXZlcnNlKCksZiYmbDx5JiYoYi5sZW5ndGg9bCksdGhpcyYmdGhpcyE9PVZlJiZ0aGlzIGluc3RhbmNlb2YgbSYmKEM9dnx8U2koQykpLEMuYXBwbHkoRSxiKX19ZnVuY3Rpb24gRGkoZSx0KXtyZXR1cm4gZnVuY3Rpb24obixyKXtyZXR1cm4gZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIGxyKGUsKGZ1bmN0aW9uKGUsaSxvKXt0KHIsbihlKSxpLG8pfSkpLHJ9KG4sZSx0KHIpLHt9KX19ZnVuY3Rpb24gamkoZSx0KXtyZXR1cm4gZnVuY3Rpb24obixyKXt2YXIgaTtpZih2b2lkIDA9PT1uJiZ2b2lkIDA9PT1yKXJldHVybiB0O2lmKHZvaWQgMCE9PW4mJihpPW4pLHZvaWQgMCE9PXIpe2lmKHZvaWQgMD09PWkpcmV0dXJuIHI7InN0cmluZyI9PXR5cGVvZiBufHwic3RyaW5nIj09dHlwZW9mIHI/KG49R3Iobikscj1HcihyKSk6KG49SnIobikscj1KcihyKSksaT1lKG4scil9cmV0dXJuIGl9fWZ1bmN0aW9uIE9pKGUpe3JldHVybiB6aSgoZnVuY3Rpb24odCl7cmV0dXJuIHQ9aHQodCxqdChKaSgpKSkscXIoKGZ1bmN0aW9uKG4pe3ZhciByPXRoaXM7cmV0dXJuIGUodCwoZnVuY3Rpb24oZSl7cmV0dXJuIG90KGUscixuKX0pKX0pKX0pKX1mdW5jdGlvbiBMaShlLHQpe3ZhciBuPSh0PXZvaWQgMD09PXQ/IiAiOkdyKHQpKS5sZW5ndGg7aWYobjwyKXJldHVybiBuP0JyKHQsZSk6dDt2YXIgcj1Ccih0LFp0KGUvUXQodCkpKTtyZXR1cm4gTXQodCk/Y2koVnQociksMCxlKS5qb2luKCIiKTpyLnNsaWNlKDAsZSl9ZnVuY3Rpb24gSWkoZSl7cmV0dXJuIGZ1bmN0aW9uKHQsbixpKXtyZXR1cm4gaSYmIm51bWJlciIhPXR5cGVvZiBpJiZ1byh0LG4saSkmJihuPWk9dm9pZCAwKSx0PXJzKHQpLHZvaWQgMD09PW4/KG49dCx0PTApOm49cnMobiksZnVuY3Rpb24oZSx0LG4saSl7Zm9yKHZhciBvPS0xLGE9c24oWnQoKHQtZSkvKG58fDEpKSwwKSxzPXIoYSk7YS0tOylzW2k/YTorK29dPWUsZSs9bjtyZXR1cm4gc30odCxuLGk9dm9pZCAwPT09aT90PG4/MTotMTpycyhpKSxlKX19ZnVuY3Rpb24gUmkoZSl7cmV0dXJuIGZ1bmN0aW9uKHQsbil7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0JiYic3RyaW5nIj09dHlwZW9mIG58fCh0PWFzKHQpLG49YXMobikpLGUodCxuKX19ZnVuY3Rpb24gUGkoZSx0LG4scixpLG8sYSxzLHUsbCl7dmFyIGM9OCZ0O3R8PWM/MzI6NjQsNCYodCY9fihjPzY0OjMyKSl8fCh0Jj0tNCk7dmFyIGY9W2UsdCxpLGM/bzp2b2lkIDAsYz9hOnZvaWQgMCxjP3ZvaWQgMDpvLGM/dm9pZCAwOmEscyx1LGxdLGQ9bi5hcHBseSh2b2lkIDAsZik7cmV0dXJuIGNvKGUpJiZfbyhkLGYpLGQucGxhY2Vob2xkZXI9cixUbyhkLGUsdCl9ZnVuY3Rpb24gJGkoZSl7dmFyIHQ9aGVbZV07cmV0dXJuIGZ1bmN0aW9uKGUsbil7aWYoZT1hcyhlKSwobj1udWxsPT1uPzA6dW4oaXMobiksMjkyKSkmJnJuKGUpKXt2YXIgcj0odXMoZSkrImUiKS5zcGxpdCgiZSIpO3JldHVybisoKHI9KHVzKHQoclswXSsiZSIrKCtyWzFdK24pKSkrImUiKS5zcGxpdCgiZSIpKVswXSsiZSIrKCtyWzFdLW4pKX1yZXR1cm4gdChlKX19dmFyIEJpPXZuJiYxL1V0KG5ldyB2bihbLC0wXSkpWzFdPT0xLzA/ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyB2bihlKX06R3M7ZnVuY3Rpb24gcWkoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuPXJvKHQpO3JldHVybiBuPT1nP0h0KHQpOm49PWI/enQodCk6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gaHQodCwoZnVuY3Rpb24odCl7cmV0dXJuW3QsZVt0XV19KSl9KHQsZSh0KSl9fWZ1bmN0aW9uIE1pKGUsdCxuLGkscyx1LGwsYyl7dmFyIGY9MiZ0O2lmKCFmJiYiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgbWUobyk7dmFyIGQ9aT9pLmxlbmd0aDowO2lmKGR8fCh0Jj0tOTcsaT1zPXZvaWQgMCksbD12b2lkIDA9PT1sP2w6c24oaXMobCksMCksYz12b2lkIDA9PT1jP2M6aXMoYyksZC09cz9zLmxlbmd0aDowLDY0JnQpe3ZhciBoPWkscD1zO2k9cz12b2lkIDB9dmFyIGc9Zj92b2lkIDA6S2koZSksdj1bZSx0LG4saSxzLGgscCx1LGwsY107aWYoZyYmZnVuY3Rpb24oZSx0KXt2YXIgbj1lWzFdLHI9dFsxXSxpPW58cixvPWk8MTMxLHM9MTI4PT1yJiY4PT1ufHwxMjg9PXImJjI1Nj09biYmZVs3XS5sZW5ndGg8PXRbOF18fDM4ND09ciYmdFs3XS5sZW5ndGg8PXRbOF0mJjg9PW47aWYoIW8mJiFzKXJldHVybiBlOzEmciYmKGVbMl09dFsyXSxpfD0xJm4/MDo0KTt2YXIgdT10WzNdO2lmKHUpe3ZhciBsPWVbM107ZVszXT1sP3ZpKGwsdSx0WzRdKTp1LGVbNF09bD9XdChlWzNdLGEpOnRbNF19KHU9dFs1XSkmJihsPWVbNV0sZVs1XT1sP21pKGwsdSx0WzZdKTp1LGVbNl09bD9XdChlWzVdLGEpOnRbNl0pOyh1PXRbN10pJiYoZVs3XT11KTsxMjgmciYmKGVbOF09bnVsbD09ZVs4XT90WzhdOnVuKGVbOF0sdFs4XSkpO251bGw9PWVbOV0mJihlWzldPXRbOV0pO2VbMF09dFswXSxlWzFdPWl9KHYsZyksZT12WzBdLHQ9dlsxXSxuPXZbMl0saT12WzNdLHM9dls0XSwhKGM9dls5XT12b2lkIDA9PT12WzldP2Y/MDplLmxlbmd0aDpzbih2WzldLWQsMCkpJiYyNCZ0JiYodCY9LTI1KSx0JiYxIT10KW09OD09dHx8MTY9PXQ/ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPVNpKGUpO3JldHVybiBmdW5jdGlvbiBvKCl7Zm9yKHZhciBhPWFyZ3VtZW50cy5sZW5ndGgscz1yKGEpLHU9YSxsPVlpKG8pO3UtLTspc1t1XT1hcmd1bWVudHNbdV07dmFyIGM9YTwzJiZzWzBdIT09bCYmc1thLTFdIT09bD9bXTpXdChzLGwpO2lmKChhLT1jLmxlbmd0aCk8bilyZXR1cm4gUGkoZSx0LE5pLG8ucGxhY2Vob2xkZXIsdm9pZCAwLHMsYyx2b2lkIDAsdm9pZCAwLG4tYSk7dmFyIGY9dGhpcyYmdGhpcyE9PVZlJiZ0aGlzIGluc3RhbmNlb2Ygbz9pOmU7cmV0dXJuIG90KGYsdGhpcyxzKX19KGUsdCxjKTozMiE9dCYmMzMhPXR8fHMubGVuZ3RoP05pLmFwcGx5KHZvaWQgMCx2KTpmdW5jdGlvbihlLHQsbixpKXt2YXIgbz0xJnQsYT1TaShlKTtyZXR1cm4gZnVuY3Rpb24gdCgpe2Zvcih2YXIgcz0tMSx1PWFyZ3VtZW50cy5sZW5ndGgsbD0tMSxjPWkubGVuZ3RoLGY9cihjK3UpLGQ9dGhpcyYmdGhpcyE9PVZlJiZ0aGlzIGluc3RhbmNlb2YgdD9hOmU7KytsPGM7KWZbbF09aVtsXTtmb3IoO3UtLTspZltsKytdPWFyZ3VtZW50c1srK3NdO3JldHVybiBvdChkLG8/bjp0aGlzLGYpfX0oZSx0LG4saSk7ZWxzZSB2YXIgbT1mdW5jdGlvbihlLHQsbil7dmFyIHI9MSZ0LGk9U2koZSk7cmV0dXJuIGZ1bmN0aW9uIHQoKXt2YXIgbz10aGlzJiZ0aGlzIT09VmUmJnRoaXMgaW5zdGFuY2VvZiB0P2k6ZTtyZXR1cm4gby5hcHBseShyP246dGhpcyxhcmd1bWVudHMpfX0oZSx0LG4pO3JldHVybiBUbygoZz9XcjpfbykobSx2KSxlLHQpfWZ1bmN0aW9uIEhpKGUsdCxuLHIpe3JldHVybiB2b2lkIDA9PT1lfHxEYShlLF9lW25dKSYmIVRlLmNhbGwocixuKT90OmV9ZnVuY3Rpb24gRmkoZSx0LG4scixpLG8pe3JldHVybiBVYShlKSYmVWEodCkmJihvLnNldCh0LGUpLGpyKGUsdCx2b2lkIDAsRmksbyksby5kZWxldGUodCkpLGV9ZnVuY3Rpb24gV2koZSl7cmV0dXJuIEthKGUpP3ZvaWQgMDplfWZ1bmN0aW9uIFVpKGUsdCxuLHIsaSxvKXt2YXIgYT0xJm4scz1lLmxlbmd0aCx1PXQubGVuZ3RoO2lmKHMhPXUmJiEoYSYmdT5zKSlyZXR1cm4hMTt2YXIgbD1vLmdldChlKSxjPW8uZ2V0KHQpO2lmKGwmJmMpcmV0dXJuIGw9PXQmJmM9PWU7dmFyIGY9LTEsZD0hMCxoPTImbj9uZXcgJG46dm9pZCAwO2ZvcihvLnNldChlLHQpLG8uc2V0KHQsZSk7KytmPHM7KXt2YXIgcD1lW2ZdLGc9dFtmXTtpZihyKXZhciB2PWE/cihnLHAsZix0LGUsbyk6cihwLGcsZixlLHQsbyk7aWYodm9pZCAwIT09dil7aWYodiljb250aW51ZTtkPSExO2JyZWFrfWlmKGgpe2lmKCFtdCh0LChmdW5jdGlvbihlLHQpe2lmKCFMdChoLHQpJiYocD09PWV8fGkocCxlLG4scixvKSkpcmV0dXJuIGgucHVzaCh0KX0pKSl7ZD0hMTticmVha319ZWxzZSBpZihwIT09ZyYmIWkocCxnLG4scixvKSl7ZD0hMTticmVha319cmV0dXJuIG8uZGVsZXRlKGUpLG8uZGVsZXRlKHQpLGR9ZnVuY3Rpb24gemkoZSl7cmV0dXJuIHhvKHZvKGUsdm9pZCAwLFJvKSxlKyIiKX1mdW5jdGlvbiBRaShlKXtyZXR1cm4gaHIoZSx3cyx0byl9ZnVuY3Rpb24gVmkoZSl7cmV0dXJuIGhyKGUseHMsbm8pfXZhciBLaT1ibj9mdW5jdGlvbihlKXtyZXR1cm4gYm4uZ2V0KGUpfTpHcztmdW5jdGlvbiBYaShlKXtmb3IodmFyIHQ9ZS5uYW1lKyIiLG49X25bdF0scj1UZS5jYWxsKF9uLHQpP24ubGVuZ3RoOjA7ci0tOyl7dmFyIGk9bltyXSxvPWkuZnVuYztpZihudWxsPT1vfHxvPT1lKXJldHVybiBpLm5hbWV9cmV0dXJuIHR9ZnVuY3Rpb24gWWkoZSl7cmV0dXJuKFRlLmNhbGwoTm4sInBsYWNlaG9sZGVyIik/Tm46ZSkucGxhY2Vob2xkZXJ9ZnVuY3Rpb24gSmkoKXt2YXIgZT1Obi5pdGVyYXRlZXx8S3M7cmV0dXJuIGU9ZT09PUtzP0VyOmUsYXJndW1lbnRzLmxlbmd0aD9lKGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0pOmV9ZnVuY3Rpb24gR2koZSx0KXt2YXIgbixyLGk9ZS5fX2RhdGFfXztyZXR1cm4oInN0cmluZyI9PShyPXR5cGVvZihuPXQpKXx8Im51bWJlciI9PXJ8fCJzeW1ib2wiPT1yfHwiYm9vbGVhbiI9PXI/Il9fcHJvdG9fXyIhPT1uOm51bGw9PT1uKT9pWyJzdHJpbmciPT10eXBlb2YgdD8ic3RyaW5nIjoiaGFzaCJdOmkubWFwfWZ1bmN0aW9uIFppKGUpe2Zvcih2YXIgdD13cyhlKSxuPXQubGVuZ3RoO24tLTspe3ZhciByPXRbbl0saT1lW3JdO3Rbbl09W3IsaSxwbyhpKV19cmV0dXJuIHR9ZnVuY3Rpb24gZW8oZSx0KXt2YXIgbj1mdW5jdGlvbihlLHQpe3JldHVybiBudWxsPT1lP3ZvaWQgMDplW3RdfShlLHQpO3JldHVybiBUcihuKT9uOnZvaWQgMH12YXIgdG89dG4/ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/W106KGU9cGUoZSksY3QodG4oZSksKGZ1bmN0aW9uKHQpe3JldHVybiBRZS5jYWxsKGUsdCl9KSkpfTpvdSxubz10bj9mdW5jdGlvbihlKXtmb3IodmFyIHQ9W107ZTspcHQodCx0byhlKSksZT1GZShlKTtyZXR1cm4gdH06b3Uscm89cHI7ZnVuY3Rpb24gaW8oZSx0LG4pe2Zvcih2YXIgcj0tMSxpPSh0PXVpKHQsZSkpLmxlbmd0aCxvPSExOysrcjxpOyl7dmFyIGE9a28odFtyXSk7aWYoIShvPW51bGwhPWUmJm4oZSxhKSkpYnJlYWs7ZT1lW2FdfXJldHVybiBvfHwrK3IhPWk/bzohIShpPW51bGw9PWU/MDplLmxlbmd0aCkmJldhKGkpJiZzbyhhLGkpJiYoSWEoZSl8fExhKGUpKX1mdW5jdGlvbiBvbyhlKXtyZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgZS5jb25zdHJ1Y3Rvcnx8aG8oZSk/e306RG4oRmUoZSkpfWZ1bmN0aW9uIGFvKGUpe3JldHVybiBJYShlKXx8TGEoZSl8fCEhKFhlJiZlJiZlW1hlXSl9ZnVuY3Rpb24gc28oZSx0KXt2YXIgbj10eXBlb2YgZTtyZXR1cm4hISh0PW51bGw9PXQ/OTAwNzE5OTI1NDc0MDk5MTp0KSYmKCJudW1iZXIiPT1ufHwic3ltYm9sIiE9biYmdWUudGVzdChlKSkmJmU+LTEmJmUlMT09MCYmZTx0fWZ1bmN0aW9uIHVvKGUsdCxuKXtpZighVWEobikpcmV0dXJuITE7dmFyIHI9dHlwZW9mIHQ7cmV0dXJuISEoIm51bWJlciI9PXI/UGEobikmJnNvKHQsbi5sZW5ndGgpOiJzdHJpbmciPT1yJiZ0IGluIG4pJiZEYShuW3RdLGUpfWZ1bmN0aW9uIGxvKGUsdCl7aWYoSWEoZSkpcmV0dXJuITE7dmFyIG49dHlwZW9mIGU7cmV0dXJuISgibnVtYmVyIiE9biYmInN5bWJvbCIhPW4mJiJib29sZWFuIiE9biYmbnVsbCE9ZSYmIUdhKGUpKXx8KFUudGVzdChlKXx8IVcudGVzdChlKXx8bnVsbCE9dCYmZSBpbiBwZSh0KSl9ZnVuY3Rpb24gY28oZSl7dmFyIHQ9WGkoZSksbj1Oblt0XTtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbnx8ISh0IGluIExuLnByb3RvdHlwZSkpcmV0dXJuITE7aWYoZT09PW4pcmV0dXJuITA7dmFyIHI9S2kobik7cmV0dXJuISFyJiZlPT09clswXX0oaG4mJnJvKG5ldyBobihuZXcgQXJyYXlCdWZmZXIoMSkpKSE9RXx8cG4mJnJvKG5ldyBwbikhPWd8fGduJiYiW29iamVjdCBQcm9taXNlXSIhPXJvKGduLnJlc29sdmUoKSl8fHZuJiZybyhuZXcgdm4pIT1ifHxtbiYmcm8obmV3IG1uKSE9eCkmJihybz1mdW5jdGlvbihlKXt2YXIgdD1wcihlKSxuPXQ9PW0/ZS5jb25zdHJ1Y3Rvcjp2b2lkIDAscj1uP0FvKG4pOiIiO2lmKHIpc3dpdGNoKHIpe2Nhc2Ugd246cmV0dXJuIEU7Y2FzZSB4bjpyZXR1cm4gZztjYXNlIFRuOnJldHVybiJbb2JqZWN0IFByb21pc2VdIjtjYXNlIEVuOnJldHVybiBiO2Nhc2UgQ246cmV0dXJuIHh9cmV0dXJuIHR9KTt2YXIgZm89d2U/SGE6YXU7ZnVuY3Rpb24gaG8oZSl7dmFyIHQ9ZSYmZS5jb25zdHJ1Y3RvcjtyZXR1cm4gZT09PSgiZnVuY3Rpb24iPT10eXBlb2YgdCYmdC5wcm90b3R5cGV8fF9lKX1mdW5jdGlvbiBwbyhlKXtyZXR1cm4gZT09ZSYmIVVhKGUpfWZ1bmN0aW9uIGdvKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBudWxsIT1uJiYobltlXT09PXQmJih2b2lkIDAhPT10fHxlIGluIHBlKG4pKSl9fWZ1bmN0aW9uIHZvKGUsdCxuKXtyZXR1cm4gdD1zbih2b2lkIDA9PT10P2UubGVuZ3RoLTE6dCwwKSxmdW5jdGlvbigpe2Zvcih2YXIgaT1hcmd1bWVudHMsbz0tMSxhPXNuKGkubGVuZ3RoLXQsMCkscz1yKGEpOysrbzxhOylzW29dPWlbdCtvXTtvPS0xO2Zvcih2YXIgdT1yKHQrMSk7KytvPHQ7KXVbb109aVtvXTtyZXR1cm4gdVt0XT1uKHMpLG90KGUsdGhpcyx1KX19ZnVuY3Rpb24gbW8oZSx0KXtyZXR1cm4gdC5sZW5ndGg8Mj9lOmRyKGUsUXIodCwwLC0xKSl9ZnVuY3Rpb24geW8oZSx0KXtmb3IodmFyIG49ZS5sZW5ndGgscj11bih0Lmxlbmd0aCxuKSxpPXlpKGUpO3ItLTspe3ZhciBvPXRbcl07ZVtyXT1zbyhvLG4pP2lbb106dm9pZCAwfXJldHVybiBlfWZ1bmN0aW9uIGJvKGUsdCl7aWYoKCJjb25zdHJ1Y3RvciIhPT10fHwiZnVuY3Rpb24iIT10eXBlb2YgZVt0XSkmJiJfX3Byb3RvX18iIT10KXJldHVybiBlW3RdfXZhciBfbz1FbyhXciksd289R3R8fGZ1bmN0aW9uKGUsdCl7cmV0dXJuIFZlLnNldFRpbWVvdXQoZSx0KX0seG89RW8oVXIpO2Z1bmN0aW9uIFRvKGUsdCxuKXt2YXIgcj10KyIiO3JldHVybiB4byhlLGZ1bmN0aW9uKGUsdCl7dmFyIG49dC5sZW5ndGg7aWYoIW4pcmV0dXJuIGU7dmFyIHI9bi0xO3JldHVybiB0W3JdPShuPjE/IiYgIjoiIikrdFtyXSx0PXQuam9pbihuPjI/IiwgIjoiICIpLGUucmVwbGFjZShZLCJ7XG4vKiBbd3JhcHBlZCB3aXRoICIrdCsiXSAqL1xuIil9KHIsZnVuY3Rpb24oZSx0KXtyZXR1cm4gc3QocywoZnVuY3Rpb24obil7dmFyIHI9Il8uIituWzBdO3QmblsxXSYmIWZ0KGUscikmJmUucHVzaChyKX0pKSxlLnNvcnQoKX0oZnVuY3Rpb24oZSl7dmFyIHQ9ZS5tYXRjaChKKTtyZXR1cm4gdD90WzFdLnNwbGl0KEcpOltdfShyKSxuKSkpfWZ1bmN0aW9uIEVvKGUpe3ZhciB0PTAsbj0wO3JldHVybiBmdW5jdGlvbigpe3ZhciByPWxuKCksaT0xNi0oci1uKTtpZihuPXIsaT4wKXtpZigrK3Q+PTgwMClyZXR1cm4gYXJndW1lbnRzWzBdfWVsc2UgdD0wO3JldHVybiBlLmFwcGx5KHZvaWQgMCxhcmd1bWVudHMpfX1mdW5jdGlvbiBDbyhlLHQpe3ZhciBuPS0xLHI9ZS5sZW5ndGgsaT1yLTE7Zm9yKHQ9dm9pZCAwPT09dD9yOnQ7KytuPHQ7KXt2YXIgbz0kcihuLGkpLGE9ZVtvXTtlW29dPWVbbl0sZVtuXT1hfXJldHVybiBlLmxlbmd0aD10LGV9dmFyIFNvPWZ1bmN0aW9uKGUpe3ZhciB0PUVhKGUsKGZ1bmN0aW9uKGUpe3JldHVybiA1MDA9PT1uLnNpemUmJm4uY2xlYXIoKSxlfSkpLG49dC5jYWNoZTtyZXR1cm4gdH0oKGZ1bmN0aW9uKGUpe3ZhciB0PVtdO3JldHVybiA0Nj09PWUuY2hhckNvZGVBdCgwKSYmdC5wdXNoKCIiKSxlLnJlcGxhY2UoeiwoZnVuY3Rpb24oZSxuLHIsaSl7dC5wdXNoKHI/aS5yZXBsYWNlKHRlLCIkMSIpOm58fGUpfSkpLHR9KSk7ZnVuY3Rpb24ga28oZSl7aWYoInN0cmluZyI9PXR5cGVvZiBlfHxHYShlKSlyZXR1cm4gZTt2YXIgdD1lKyIiO3JldHVybiIwIj09dCYmMS9lPT0tMS8wPyItMCI6dH1mdW5jdGlvbiBBbyhlKXtpZihudWxsIT1lKXt0cnl7cmV0dXJuIHhlLmNhbGwoZSl9Y2F0Y2goZSl7fXRyeXtyZXR1cm4gZSsiIn1jYXRjaChlKXt9fXJldHVybiIifWZ1bmN0aW9uIE5vKGUpe2lmKGUgaW5zdGFuY2VvZiBMbilyZXR1cm4gZS5jbG9uZSgpO3ZhciB0PW5ldyBPbihlLl9fd3JhcHBlZF9fLGUuX19jaGFpbl9fKTtyZXR1cm4gdC5fX2FjdGlvbnNfXz15aShlLl9fYWN0aW9uc19fKSx0Ll9faW5kZXhfXz1lLl9faW5kZXhfXyx0Ll9fdmFsdWVzX189ZS5fX3ZhbHVlc19fLHR9dmFyIERvPXFyKChmdW5jdGlvbihlLHQpe3JldHVybiAkYShlKT9lcihlLGFyKHQsMSwkYSwhMCkpOltdfSkpLGpvPXFyKChmdW5jdGlvbihlLHQpe3ZhciBuPU1vKHQpO3JldHVybiAkYShuKSYmKG49dm9pZCAwKSwkYShlKT9lcihlLGFyKHQsMSwkYSwhMCksSmkobiwyKSk6W119KSksT289cXIoKGZ1bmN0aW9uKGUsdCl7dmFyIG49TW8odCk7cmV0dXJuICRhKG4pJiYobj12b2lkIDApLCRhKGUpP2VyKGUsYXIodCwxLCRhLCEwKSx2b2lkIDAsbik6W119KSk7ZnVuY3Rpb24gTG8oZSx0LG4pe3ZhciByPW51bGw9PWU/MDplLmxlbmd0aDtpZighcilyZXR1cm4tMTt2YXIgaT1udWxsPT1uPzA6aXMobik7cmV0dXJuIGk8MCYmKGk9c24ocitpLDApKSxfdChlLEppKHQsMyksaSl9ZnVuY3Rpb24gSW8oZSx0LG4pe3ZhciByPW51bGw9PWU/MDplLmxlbmd0aDtpZighcilyZXR1cm4tMTt2YXIgaT1yLTE7cmV0dXJuIHZvaWQgMCE9PW4mJihpPWlzKG4pLGk9bjwwP3NuKHIraSwwKTp1bihpLHItMSkpLF90KGUsSmkodCwzKSxpLCEwKX1mdW5jdGlvbiBSbyhlKXtyZXR1cm4obnVsbD09ZT8wOmUubGVuZ3RoKT9hcihlLDEpOltdfWZ1bmN0aW9uIFBvKGUpe3JldHVybiBlJiZlLmxlbmd0aD9lWzBdOnZvaWQgMH12YXIgJG89cXIoKGZ1bmN0aW9uKGUpe3ZhciB0PWh0KGUsYWkpO3JldHVybiB0Lmxlbmd0aCYmdFswXT09PWVbMF0/eXIodCk6W119KSksQm89cXIoKGZ1bmN0aW9uKGUpe3ZhciB0PU1vKGUpLG49aHQoZSxhaSk7cmV0dXJuIHQ9PT1NbyhuKT90PXZvaWQgMDpuLnBvcCgpLG4ubGVuZ3RoJiZuWzBdPT09ZVswXT95cihuLEppKHQsMikpOltdfSkpLHFvPXFyKChmdW5jdGlvbihlKXt2YXIgdD1NbyhlKSxuPWh0KGUsYWkpO3JldHVybih0PSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6dm9pZCAwKSYmbi5wb3AoKSxuLmxlbmd0aCYmblswXT09PWVbMF0/eXIobix2b2lkIDAsdCk6W119KSk7ZnVuY3Rpb24gTW8oZSl7dmFyIHQ9bnVsbD09ZT8wOmUubGVuZ3RoO3JldHVybiB0P2VbdC0xXTp2b2lkIDB9dmFyIEhvPXFyKEZvKTtmdW5jdGlvbiBGbyhlLHQpe3JldHVybiBlJiZlLmxlbmd0aCYmdCYmdC5sZW5ndGg/UnIoZSx0KTplfXZhciBXbz16aSgoZnVuY3Rpb24oZSx0KXt2YXIgbj1udWxsPT1lPzA6ZS5sZW5ndGgscj1YbihlLHQpO3JldHVybiBQcihlLGh0KHQsKGZ1bmN0aW9uKGUpe3JldHVybiBzbyhlLG4pPytlOmV9KSkuc29ydChnaSkpLHJ9KSk7ZnVuY3Rpb24gVW8oZSl7cmV0dXJuIG51bGw9PWU/ZTpkbi5jYWxsKGUpfXZhciB6bz1xcigoZnVuY3Rpb24oZSl7cmV0dXJuIFpyKGFyKGUsMSwkYSwhMCkpfSkpLFFvPXFyKChmdW5jdGlvbihlKXt2YXIgdD1NbyhlKTtyZXR1cm4gJGEodCkmJih0PXZvaWQgMCksWnIoYXIoZSwxLCRhLCEwKSxKaSh0LDIpKX0pKSxWbz1xcigoZnVuY3Rpb24oZSl7dmFyIHQ9TW8oZSk7cmV0dXJuIHQ9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp2b2lkIDAsWnIoYXIoZSwxLCRhLCEwKSx2b2lkIDAsdCl9KSk7ZnVuY3Rpb24gS28oZSl7aWYoIWV8fCFlLmxlbmd0aClyZXR1cm5bXTt2YXIgdD0wO3JldHVybiBlPWN0KGUsKGZ1bmN0aW9uKGUpe2lmKCRhKGUpKXJldHVybiB0PXNuKGUubGVuZ3RoLHQpLCEwfSkpLE50KHQsKGZ1bmN0aW9uKHQpe3JldHVybiBodChlLEN0KHQpKX0pKX1mdW5jdGlvbiBYbyhlLHQpe2lmKCFlfHwhZS5sZW5ndGgpcmV0dXJuW107dmFyIG49S28oZSk7cmV0dXJuIG51bGw9PXQ/bjpodChuLChmdW5jdGlvbihlKXtyZXR1cm4gb3QodCx2b2lkIDAsZSl9KSl9dmFyIFlvPXFyKChmdW5jdGlvbihlLHQpe3JldHVybiAkYShlKT9lcihlLHQpOltdfSkpLEpvPXFyKChmdW5jdGlvbihlKXtyZXR1cm4gaWkoY3QoZSwkYSkpfSkpLEdvPXFyKChmdW5jdGlvbihlKXt2YXIgdD1NbyhlKTtyZXR1cm4gJGEodCkmJih0PXZvaWQgMCksaWkoY3QoZSwkYSksSmkodCwyKSl9KSksWm89cXIoKGZ1bmN0aW9uKGUpe3ZhciB0PU1vKGUpO3JldHVybiB0PSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6dm9pZCAwLGlpKGN0KGUsJGEpLHZvaWQgMCx0KX0pKSxlYT1xcihLbyk7dmFyIHRhPXFyKChmdW5jdGlvbihlKXt2YXIgdD1lLmxlbmd0aCxuPXQ+MT9lW3QtMV06dm9pZCAwO3JldHVybiBuPSJmdW5jdGlvbiI9PXR5cGVvZiBuPyhlLnBvcCgpLG4pOnZvaWQgMCxYbyhlLG4pfSkpO2Z1bmN0aW9uIG5hKGUpe3ZhciB0PU5uKGUpO3JldHVybiB0Ll9fY2hhaW5fXz0hMCx0fWZ1bmN0aW9uIHJhKGUsdCl7cmV0dXJuIHQoZSl9dmFyIGlhPXppKChmdW5jdGlvbihlKXt2YXIgdD1lLmxlbmd0aCxuPXQ/ZVswXTowLHI9dGhpcy5fX3dyYXBwZWRfXyxpPWZ1bmN0aW9uKHQpe3JldHVybiBYbih0LGUpfTtyZXR1cm4hKHQ+MXx8dGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgpJiZyIGluc3RhbmNlb2YgTG4mJnNvKG4pPygocj1yLnNsaWNlKG4sK24rKHQ/MTowKSkpLl9fYWN0aW9uc19fLnB1c2goe2Z1bmM6cmEsYXJnczpbaV0sdGhpc0FyZzp2b2lkIDB9KSxuZXcgT24ocix0aGlzLl9fY2hhaW5fXykudGhydSgoZnVuY3Rpb24oZSl7cmV0dXJuIHQmJiFlLmxlbmd0aCYmZS5wdXNoKHZvaWQgMCksZX0pKSk6dGhpcy50aHJ1KGkpfSkpO3ZhciBvYT1faSgoZnVuY3Rpb24oZSx0LG4pe1RlLmNhbGwoZSxuKT8rK2Vbbl06S24oZSxuLDEpfSkpO3ZhciBhYT1raShMbyksc2E9a2koSW8pO2Z1bmN0aW9uIHVhKGUsdCl7cmV0dXJuKElhKGUpP3N0OnRyKShlLEppKHQsMykpfWZ1bmN0aW9uIGxhKGUsdCl7cmV0dXJuKElhKGUpP3V0Om5yKShlLEppKHQsMykpfXZhciBjYT1faSgoZnVuY3Rpb24oZSx0LG4pe1RlLmNhbGwoZSxuKT9lW25dLnB1c2godCk6S24oZSxuLFt0XSl9KSk7dmFyIGZhPXFyKChmdW5jdGlvbihlLHQsbil7dmFyIGk9LTEsbz0iZnVuY3Rpb24iPT10eXBlb2YgdCxhPVBhKGUpP3IoZS5sZW5ndGgpOltdO3JldHVybiB0cihlLChmdW5jdGlvbihlKXthWysraV09bz9vdCh0LGUsbik6YnIoZSx0LG4pfSkpLGF9KSksZGE9X2koKGZ1bmN0aW9uKGUsdCxuKXtLbihlLG4sdCl9KSk7ZnVuY3Rpb24gaGEoZSx0KXtyZXR1cm4oSWEoZSk/aHQ6QXIpKGUsSmkodCwzKSl9dmFyIHBhPV9pKChmdW5jdGlvbihlLHQsbil7ZVtuPzA6MV0ucHVzaCh0KX0pLChmdW5jdGlvbigpe3JldHVybltbXSxbXV19KSk7dmFyIGdhPXFyKChmdW5jdGlvbihlLHQpe2lmKG51bGw9PWUpcmV0dXJuW107dmFyIG49dC5sZW5ndGg7cmV0dXJuIG4+MSYmdW8oZSx0WzBdLHRbMV0pP3Q9W106bj4yJiZ1byh0WzBdLHRbMV0sdFsyXSkmJih0PVt0WzBdXSksTHIoZSxhcih0LDEpLFtdKX0pKSx2YT1KdHx8ZnVuY3Rpb24oKXtyZXR1cm4gVmUuRGF0ZS5ub3coKX07ZnVuY3Rpb24gbWEoZSx0LG4pe3JldHVybiB0PW4/dm9pZCAwOnQsTWkoZSwxMjgsdm9pZCAwLHZvaWQgMCx2b2lkIDAsdm9pZCAwLHQ9ZSYmbnVsbD09dD9lLmxlbmd0aDp0KX1mdW5jdGlvbiB5YShlLHQpe3ZhciBuO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBtZShvKTtyZXR1cm4gZT1pcyhlKSxmdW5jdGlvbigpe3JldHVybi0tZT4wJiYobj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKSksZTw9MSYmKHQ9dm9pZCAwKSxufX12YXIgYmE9cXIoKGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0xO2lmKG4ubGVuZ3RoKXt2YXIgaT1XdChuLFlpKGJhKSk7cnw9MzJ9cmV0dXJuIE1pKGUscix0LG4saSl9KSksX2E9cXIoKGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0zO2lmKG4ubGVuZ3RoKXt2YXIgaT1XdChuLFlpKF9hKSk7cnw9MzJ9cmV0dXJuIE1pKHQscixlLG4saSl9KSk7ZnVuY3Rpb24gd2EoZSx0LG4pe3ZhciByLGksYSxzLHUsbCxjPTAsZj0hMSxkPSExLGg9ITA7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IG1lKG8pO2Z1bmN0aW9uIHAodCl7dmFyIG49cixvPWk7cmV0dXJuIHI9aT12b2lkIDAsYz10LHM9ZS5hcHBseShvLG4pfWZ1bmN0aW9uIGcoZSl7cmV0dXJuIGM9ZSx1PXdvKG0sdCksZj9wKGUpOnN9ZnVuY3Rpb24gdihlKXt2YXIgbj1lLWw7cmV0dXJuIHZvaWQgMD09PWx8fG4+PXR8fG48MHx8ZCYmZS1jPj1hfWZ1bmN0aW9uIG0oKXt2YXIgZT12YSgpO2lmKHYoZSkpcmV0dXJuIHkoZSk7dT13byhtLGZ1bmN0aW9uKGUpe3ZhciBuPXQtKGUtbCk7cmV0dXJuIGQ/dW4obixhLShlLWMpKTpufShlKSl9ZnVuY3Rpb24geShlKXtyZXR1cm4gdT12b2lkIDAsaCYmcj9wKGUpOihyPWk9dm9pZCAwLHMpfWZ1bmN0aW9uIGIoKXt2YXIgZT12YSgpLG49dihlKTtpZihyPWFyZ3VtZW50cyxpPXRoaXMsbD1lLG4pe2lmKHZvaWQgMD09PXUpcmV0dXJuIGcobCk7aWYoZClyZXR1cm4gZmkodSksdT13byhtLHQpLHAobCl9cmV0dXJuIHZvaWQgMD09PXUmJih1PXdvKG0sdCkpLHN9cmV0dXJuIHQ9YXModCl8fDAsVWEobikmJihmPSEhbi5sZWFkaW5nLGE9KGQ9Im1heFdhaXQiaW4gbik/c24oYXMobi5tYXhXYWl0KXx8MCx0KTphLGg9InRyYWlsaW5nImluIG4/ISFuLnRyYWlsaW5nOmgpLGIuY2FuY2VsPWZ1bmN0aW9uKCl7dm9pZCAwIT09dSYmZmkodSksYz0wLHI9bD1pPXU9dm9pZCAwfSxiLmZsdXNoPWZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMD09PXU/czp5KHZhKCkpfSxifXZhciB4YT1xcigoZnVuY3Rpb24oZSx0KXtyZXR1cm4gWm4oZSwxLHQpfSkpLFRhPXFyKChmdW5jdGlvbihlLHQsbil7cmV0dXJuIFpuKGUsYXModCl8fDAsbil9KSk7ZnVuY3Rpb24gRWEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZXx8bnVsbCE9dCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IG1lKG8pO3ZhciBuPWZ1bmN0aW9uKCl7dmFyIHI9YXJndW1lbnRzLGk9dD90LmFwcGx5KHRoaXMscik6clswXSxvPW4uY2FjaGU7aWYoby5oYXMoaSkpcmV0dXJuIG8uZ2V0KGkpO3ZhciBhPWUuYXBwbHkodGhpcyxyKTtyZXR1cm4gbi5jYWNoZT1vLnNldChpLGEpfHxvLGF9O3JldHVybiBuLmNhY2hlPW5ldyhFYS5DYWNoZXx8UG4pLG59ZnVuY3Rpb24gQ2EoZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IG1lKG8pO3JldHVybiBmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cztzd2l0Y2godC5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4hZS5jYWxsKHRoaXMpO2Nhc2UgMTpyZXR1cm4hZS5jYWxsKHRoaXMsdFswXSk7Y2FzZSAyOnJldHVybiFlLmNhbGwodGhpcyx0WzBdLHRbMV0pO2Nhc2UgMzpyZXR1cm4hZS5jYWxsKHRoaXMsdFswXSx0WzFdLHRbMl0pfXJldHVybiFlLmFwcGx5KHRoaXMsdCl9fUVhLkNhY2hlPVBuO3ZhciBTYT1saSgoZnVuY3Rpb24oZSx0KXt2YXIgbj0odD0xPT10Lmxlbmd0aCYmSWEodFswXSk/aHQodFswXSxqdChKaSgpKSk6aHQoYXIodCwxKSxqdChKaSgpKSkpLmxlbmd0aDtyZXR1cm4gcXIoKGZ1bmN0aW9uKHIpe2Zvcih2YXIgaT0tMSxvPXVuKHIubGVuZ3RoLG4pOysraTxvOylyW2ldPXRbaV0uY2FsbCh0aGlzLHJbaV0pO3JldHVybiBvdChlLHRoaXMscil9KSl9KSksa2E9cXIoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIE1pKGUsMzIsdm9pZCAwLHQsV3QodCxZaShrYSkpKX0pKSxBYT1xcigoZnVuY3Rpb24oZSx0KXtyZXR1cm4gTWkoZSw2NCx2b2lkIDAsdCxXdCh0LFlpKEFhKSkpfSkpLE5hPXppKChmdW5jdGlvbihlLHQpe3JldHVybiBNaShlLDI1Nix2b2lkIDAsdm9pZCAwLHZvaWQgMCx0KX0pKTtmdW5jdGlvbiBEYShlLHQpe3JldHVybiBlPT09dHx8ZSE9ZSYmdCE9dH12YXIgamE9UmkoZ3IpLE9hPVJpKChmdW5jdGlvbihlLHQpe3JldHVybiBlPj10fSkpLExhPV9yKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk/X3I6ZnVuY3Rpb24oZSl7cmV0dXJuIHphKGUpJiZUZS5jYWxsKGUsImNhbGxlZSIpJiYhUWUuY2FsbChlLCJjYWxsZWUiKX0sSWE9ci5pc0FycmF5LFJhPVplP2p0KFplKTpmdW5jdGlvbihlKXtyZXR1cm4gemEoZSkmJnByKGUpPT1UfTtmdW5jdGlvbiBQYShlKXtyZXR1cm4gbnVsbCE9ZSYmV2EoZS5sZW5ndGgpJiYhSGEoZSl9ZnVuY3Rpb24gJGEoZSl7cmV0dXJuIHphKGUpJiZQYShlKX12YXIgQmE9bm58fGF1LHFhPWV0P2p0KGV0KTpmdW5jdGlvbihlKXtyZXR1cm4gemEoZSkmJnByKGUpPT1mfTtmdW5jdGlvbiBNYShlKXtpZighemEoZSkpcmV0dXJuITE7dmFyIHQ9cHIoZSk7cmV0dXJuIHQ9PWR8fCJbb2JqZWN0IERPTUV4Y2VwdGlvbl0iPT10fHwic3RyaW5nIj09dHlwZW9mIGUubWVzc2FnZSYmInN0cmluZyI9PXR5cGVvZiBlLm5hbWUmJiFLYShlKX1mdW5jdGlvbiBIYShlKXtpZighVWEoZSkpcmV0dXJuITE7dmFyIHQ9cHIoZSk7cmV0dXJuIHQ9PWh8fHQ9PXB8fCJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dIj09dHx8IltvYmplY3QgUHJveHldIj09dH1mdW5jdGlvbiBGYShlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGUmJmU9PWlzKGUpfWZ1bmN0aW9uIFdhKGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZSYmZT4tMSYmZSUxPT0wJiZlPD05MDA3MTk5MjU0NzQwOTkxfWZ1bmN0aW9uIFVhKGUpe3ZhciB0PXR5cGVvZiBlO3JldHVybiBudWxsIT1lJiYoIm9iamVjdCI9PXR8fCJmdW5jdGlvbiI9PXQpfWZ1bmN0aW9uIHphKGUpe3JldHVybiBudWxsIT1lJiYib2JqZWN0Ij09dHlwZW9mIGV9dmFyIFFhPXR0P2p0KHR0KTpmdW5jdGlvbihlKXtyZXR1cm4gemEoZSkmJnJvKGUpPT1nfTtmdW5jdGlvbiBWYShlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGV8fHphKGUpJiZwcihlKT09dn1mdW5jdGlvbiBLYShlKXtpZighemEoZSl8fHByKGUpIT1tKXJldHVybiExO3ZhciB0PUZlKGUpO2lmKG51bGw9PT10KXJldHVybiEwO3ZhciBuPVRlLmNhbGwodCwiY29uc3RydWN0b3IiKSYmdC5jb25zdHJ1Y3RvcjtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgbiYmbiBpbnN0YW5jZW9mIG4mJnhlLmNhbGwobik9PWtlfXZhciBYYT1udD9qdChudCk6ZnVuY3Rpb24oZSl7cmV0dXJuIHphKGUpJiZwcihlKT09eX07dmFyIFlhPXJ0P2p0KHJ0KTpmdW5jdGlvbihlKXtyZXR1cm4gemEoZSkmJnJvKGUpPT1ifTtmdW5jdGlvbiBKYShlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV8fCFJYShlKSYmemEoZSkmJnByKGUpPT1ffWZ1bmN0aW9uIEdhKGUpe3JldHVybiJzeW1ib2wiPT10eXBlb2YgZXx8emEoZSkmJnByKGUpPT13fXZhciBaYT1pdD9qdChpdCk6ZnVuY3Rpb24oZSl7cmV0dXJuIHphKGUpJiZXYShlLmxlbmd0aCkmJiEhTWVbcHIoZSldfTt2YXIgZXM9Umkoa3IpLHRzPVJpKChmdW5jdGlvbihlLHQpe3JldHVybiBlPD10fSkpO2Z1bmN0aW9uIG5zKGUpe2lmKCFlKXJldHVybltdO2lmKFBhKGUpKXJldHVybiBKYShlKT9WdChlKTp5aShlKTtpZihKZSYmZVtKZV0pcmV0dXJuIGZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuPVtdOyEodD1lLm5leHQoKSkuZG9uZTspbi5wdXNoKHQudmFsdWUpO3JldHVybiBufShlW0plXSgpKTt2YXIgdD1ybyhlKTtyZXR1cm4odD09Zz9IdDp0PT1iP1V0OkRzKShlKX1mdW5jdGlvbiBycyhlKXtyZXR1cm4gZT8oZT1hcyhlKSk9PT0xLzB8fGU9PT0tMS8wPzE3OTc2OTMxMzQ4NjIzMTU3ZTI5MiooZTwwPy0xOjEpOmU9PWU/ZTowOjA9PT1lP2U6MH1mdW5jdGlvbiBpcyhlKXt2YXIgdD1ycyhlKSxuPXQlMTtyZXR1cm4gdD09dD9uP3Qtbjp0OjB9ZnVuY3Rpb24gb3MoZSl7cmV0dXJuIGU/WW4oaXMoZSksMCw0Mjk0OTY3Mjk1KTowfWZ1bmN0aW9uIGFzKGUpe2lmKCJudW1iZXIiPT10eXBlb2YgZSlyZXR1cm4gZTtpZihHYShlKSlyZXR1cm4gTmFOO2lmKFVhKGUpKXt2YXIgdD0iZnVuY3Rpb24iPT10eXBlb2YgZS52YWx1ZU9mP2UudmFsdWVPZigpOmU7ZT1VYSh0KT90KyIiOnR9aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiAwPT09ZT9lOitlO2U9RHQoZSk7dmFyIG49b2UudGVzdChlKTtyZXR1cm4gbnx8c2UudGVzdChlKT9VZShlLnNsaWNlKDIpLG4/Mjo4KTppZS50ZXN0KGUpP05hTjorZX1mdW5jdGlvbiBzcyhlKXtyZXR1cm4gYmkoZSx4cyhlKSl9ZnVuY3Rpb24gdXMoZSl7cmV0dXJuIG51bGw9PWU/IiI6R3IoZSl9dmFyIGxzPXdpKChmdW5jdGlvbihlLHQpe2lmKGhvKHQpfHxQYSh0KSliaSh0LHdzKHQpLGUpO2Vsc2UgZm9yKHZhciBuIGluIHQpVGUuY2FsbCh0LG4pJiZVbihlLG4sdFtuXSl9KSksY3M9d2koKGZ1bmN0aW9uKGUsdCl7YmkodCx4cyh0KSxlKX0pKSxmcz13aSgoZnVuY3Rpb24oZSx0LG4scil7YmkodCx4cyh0KSxlLHIpfSkpLGRzPXdpKChmdW5jdGlvbihlLHQsbixyKXtiaSh0LHdzKHQpLGUscil9KSksaHM9emkoWG4pO3ZhciBwcz1xcigoZnVuY3Rpb24oZSx0KXtlPXBlKGUpO3ZhciBuPS0xLHI9dC5sZW5ndGgsaT1yPjI/dFsyXTp2b2lkIDA7Zm9yKGkmJnVvKHRbMF0sdFsxXSxpKSYmKHI9MSk7KytuPHI7KWZvcih2YXIgbz10W25dLGE9eHMobykscz0tMSx1PWEubGVuZ3RoOysrczx1Oyl7dmFyIGw9YVtzXSxjPWVbbF07KHZvaWQgMD09PWN8fERhKGMsX2VbbF0pJiYhVGUuY2FsbChlLGwpKSYmKGVbbF09b1tsXSl9cmV0dXJuIGV9KSksZ3M9cXIoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnB1c2godm9pZCAwLEZpKSxvdChFcyx2b2lkIDAsZSl9KSk7ZnVuY3Rpb24gdnMoZSx0LG4pe3ZhciByPW51bGw9PWU/dm9pZCAwOmRyKGUsdCk7cmV0dXJuIHZvaWQgMD09PXI/bjpyfWZ1bmN0aW9uIG1zKGUsdCl7cmV0dXJuIG51bGwhPWUmJmlvKGUsdCxtcil9dmFyIHlzPURpKChmdW5jdGlvbihlLHQsbil7bnVsbCE9dCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQudG9TdHJpbmcmJih0PVNlLmNhbGwodCkpLGVbdF09bn0pLFVzKFZzKSksYnM9RGkoKGZ1bmN0aW9uKGUsdCxuKXtudWxsIT10JiYiZnVuY3Rpb24iIT10eXBlb2YgdC50b1N0cmluZyYmKHQ9U2UuY2FsbCh0KSksVGUuY2FsbChlLHQpP2VbdF0ucHVzaChuKTplW3RdPVtuXX0pLEppKSxfcz1xcihicik7ZnVuY3Rpb24gd3MoZSl7cmV0dXJuIFBhKGUpP3FuKGUpOkNyKGUpfWZ1bmN0aW9uIHhzKGUpe3JldHVybiBQYShlKT9xbihlLCEwKTpTcihlKX12YXIgVHM9d2koKGZ1bmN0aW9uKGUsdCxuKXtqcihlLHQsbil9KSksRXM9d2koKGZ1bmN0aW9uKGUsdCxuLHIpe2pyKGUsdCxuLHIpfSkpLENzPXppKChmdW5jdGlvbihlLHQpe3ZhciBuPXt9O2lmKG51bGw9PWUpcmV0dXJuIG47dmFyIHI9ITE7dD1odCh0LChmdW5jdGlvbih0KXtyZXR1cm4gdD11aSh0LGUpLHJ8fChyPXQubGVuZ3RoPjEpLHR9KSksYmkoZSxWaShlKSxuKSxyJiYobj1KbihuLDcsV2kpKTtmb3IodmFyIGk9dC5sZW5ndGg7aS0tOyllaShuLHRbaV0pO3JldHVybiBufSkpO3ZhciBTcz16aSgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gbnVsbD09ZT97fTpmdW5jdGlvbihlLHQpe3JldHVybiBJcihlLHQsKGZ1bmN0aW9uKHQsbil7cmV0dXJuIG1zKGUsbil9KSl9KGUsdCl9KSk7ZnVuY3Rpb24ga3MoZSx0KXtpZihudWxsPT1lKXJldHVybnt9O3ZhciBuPWh0KFZpKGUpLChmdW5jdGlvbihlKXtyZXR1cm5bZV19KSk7cmV0dXJuIHQ9SmkodCksSXIoZSxuLChmdW5jdGlvbihlLG4pe3JldHVybiB0KGUsblswXSl9KSl9dmFyIEFzPXFpKHdzKSxOcz1xaSh4cyk7ZnVuY3Rpb24gRHMoZSl7cmV0dXJuIG51bGw9PWU/W106T3QoZSx3cyhlKSl9dmFyIGpzPUNpKChmdW5jdGlvbihlLHQsbil7cmV0dXJuIHQ9dC50b0xvd2VyQ2FzZSgpLGUrKG4/T3ModCk6dCl9KSk7ZnVuY3Rpb24gT3MoZSl7cmV0dXJuIE1zKHVzKGUpLnRvTG93ZXJDYXNlKCkpfWZ1bmN0aW9uIExzKGUpe3JldHVybihlPXVzKGUpKSYmZS5yZXBsYWNlKGxlLCR0KS5yZXBsYWNlKExlLCIiKX12YXIgSXM9Q2koKGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZSsobj8iLSI6IiIpK3QudG9Mb3dlckNhc2UoKX0pKSxScz1DaSgoZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlKyhuPyIgIjoiIikrdC50b0xvd2VyQ2FzZSgpfSkpLFBzPUVpKCJ0b0xvd2VyQ2FzZSIpO3ZhciAkcz1DaSgoZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlKyhuPyJfIjoiIikrdC50b0xvd2VyQ2FzZSgpfSkpO3ZhciBCcz1DaSgoZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlKyhuPyIgIjoiIikrTXModCl9KSk7dmFyIHFzPUNpKChmdW5jdGlvbihlLHQsbil7cmV0dXJuIGUrKG4/IiAiOiIiKSt0LnRvVXBwZXJDYXNlKCl9KSksTXM9RWkoInRvVXBwZXJDYXNlIik7ZnVuY3Rpb24gSHMoZSx0LG4pe3JldHVybiBlPXVzKGUpLHZvaWQgMD09PSh0PW4/dm9pZCAwOnQpP2Z1bmN0aW9uKGUpe3JldHVybiAkZS50ZXN0KGUpfShlKT9mdW5jdGlvbihlKXtyZXR1cm4gZS5tYXRjaChSZSl8fFtdfShlKTpmdW5jdGlvbihlKXtyZXR1cm4gZS5tYXRjaChaKXx8W119KGUpOmUubWF0Y2godCl8fFtdfXZhciBGcz1xcigoZnVuY3Rpb24oZSx0KXt0cnl7cmV0dXJuIG90KGUsdm9pZCAwLHQpfWNhdGNoKGUpe3JldHVybiBNYShlKT9lOm5ldyBYKGUpfX0pKSxXcz16aSgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gc3QodCwoZnVuY3Rpb24odCl7dD1rbyh0KSxLbihlLHQsYmEoZVt0XSxlKSl9KSksZX0pKTtmdW5jdGlvbiBVcyhlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZX19dmFyIHpzPUFpKCksUXM9QWkoITApO2Z1bmN0aW9uIFZzKGUpe3JldHVybiBlfWZ1bmN0aW9uIEtzKGUpe3JldHVybiBFcigiZnVuY3Rpb24iPT10eXBlb2YgZT9lOkpuKGUsMSkpfXZhciBYcz1xcigoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIGJyKG4sZSx0KX19KSksWXM9cXIoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBicihlLG4sdCl9fSkpO2Z1bmN0aW9uIEpzKGUsdCxuKXt2YXIgcj13cyh0KSxpPWZyKHQscik7bnVsbCE9bnx8VWEodCkmJihpLmxlbmd0aHx8IXIubGVuZ3RoKXx8KG49dCx0PWUsZT10aGlzLGk9ZnIodCx3cyh0KSkpO3ZhciBvPSEoVWEobikmJiJjaGFpbiJpbiBuJiYhbi5jaGFpbiksYT1IYShlKTtyZXR1cm4gc3QoaSwoZnVuY3Rpb24obil7dmFyIHI9dFtuXTtlW25dPXIsYSYmKGUucHJvdG90eXBlW25dPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fX2NoYWluX187aWYob3x8dCl7dmFyIG49ZSh0aGlzLl9fd3JhcHBlZF9fKSxpPW4uX19hY3Rpb25zX189eWkodGhpcy5fX2FjdGlvbnNfXyk7cmV0dXJuIGkucHVzaCh7ZnVuYzpyLGFyZ3M6YXJndW1lbnRzLHRoaXNBcmc6ZX0pLG4uX19jaGFpbl9fPXQsbn1yZXR1cm4gci5hcHBseShlLHB0KFt0aGlzLnZhbHVlKCldLGFyZ3VtZW50cykpfSl9KSksZX1mdW5jdGlvbiBHcygpe312YXIgWnM9T2koaHQpLGV1PU9pKGx0KSx0dT1PaShtdCk7ZnVuY3Rpb24gbnUoZSl7cmV0dXJuIGxvKGUpP0N0KGtvKGUpKTpmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGRyKHQsZSl9fShlKX12YXIgcnU9SWkoKSxpdT1JaSghMCk7ZnVuY3Rpb24gb3UoKXtyZXR1cm5bXX1mdW5jdGlvbiBhdSgpe3JldHVybiExfXZhciBzdT1qaSgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSt0fSksMCksdXU9JGkoImNlaWwiKSxsdT1qaSgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS90fSksMSksY3U9JGkoImZsb29yIik7dmFyIGZ1LGR1PWppKChmdW5jdGlvbihlLHQpe3JldHVybiBlKnR9KSwxKSxodT0kaSgicm91bmQiKSxwdT1qaSgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS10fSksMCk7cmV0dXJuIE5uLmFmdGVyPWZ1bmN0aW9uKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IG1lKG8pO3JldHVybiBlPWlzKGUpLGZ1bmN0aW9uKCl7aWYoLS1lPDEpcmV0dXJuIHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0sTm4uYXJ5PW1hLE5uLmFzc2lnbj1scyxObi5hc3NpZ25Jbj1jcyxObi5hc3NpZ25JbldpdGg9ZnMsTm4uYXNzaWduV2l0aD1kcyxObi5hdD1ocyxObi5iZWZvcmU9eWEsTm4uYmluZD1iYSxObi5iaW5kQWxsPVdzLE5uLmJpbmRLZXk9X2EsTm4uY2FzdEFycmF5PWZ1bmN0aW9uKCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuW107dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiBJYShlKT9lOltlXX0sTm4uY2hhaW49bmEsTm4uY2h1bms9ZnVuY3Rpb24oZSx0LG4pe3Q9KG4/dW8oZSx0LG4pOnZvaWQgMD09PXQpPzE6c24oaXModCksMCk7dmFyIGk9bnVsbD09ZT8wOmUubGVuZ3RoO2lmKCFpfHx0PDEpcmV0dXJuW107Zm9yKHZhciBvPTAsYT0wLHM9cihadChpL3QpKTtvPGk7KXNbYSsrXT1RcihlLG8sbys9dCk7cmV0dXJuIHN9LE5uLmNvbXBhY3Q9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PS0xLG49bnVsbD09ZT8wOmUubGVuZ3RoLHI9MCxpPVtdOysrdDxuOyl7dmFyIG89ZVt0XTtvJiYoaVtyKytdPW8pfXJldHVybiBpfSxObi5jb25jYXQ9ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoO2lmKCFlKXJldHVybltdO2Zvcih2YXIgdD1yKGUtMSksbj1hcmd1bWVudHNbMF0saT1lO2ktLTspdFtpLTFdPWFyZ3VtZW50c1tpXTtyZXR1cm4gcHQoSWEobik/eWkobik6W25dLGFyKHQsMSkpfSxObi5jb25kPWZ1bmN0aW9uKGUpe3ZhciB0PW51bGw9PWU/MDplLmxlbmd0aCxuPUppKCk7cmV0dXJuIGU9dD9odChlLChmdW5jdGlvbihlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZVsxXSl0aHJvdyBuZXcgbWUobyk7cmV0dXJuW24oZVswXSksZVsxXV19KSk6W10scXIoKGZ1bmN0aW9uKG4pe2Zvcih2YXIgcj0tMTsrK3I8dDspe3ZhciBpPWVbcl07aWYob3QoaVswXSx0aGlzLG4pKXJldHVybiBvdChpWzFdLHRoaXMsbil9fSkpfSxObi5jb25mb3Jtcz1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9d3MoZSk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBHbihuLGUsdCl9fShKbihlLDEpKX0sTm4uY29uc3RhbnQ9VXMsTm4uY291bnRCeT1vYSxObi5jcmVhdGU9ZnVuY3Rpb24oZSx0KXt2YXIgbj1EbihlKTtyZXR1cm4gbnVsbD09dD9uOlZuKG4sdCl9LE5uLmN1cnJ5PWZ1bmN0aW9uIGUodCxuLHIpe3ZhciBpPU1pKHQsOCx2b2lkIDAsdm9pZCAwLHZvaWQgMCx2b2lkIDAsdm9pZCAwLG49cj92b2lkIDA6bik7cmV0dXJuIGkucGxhY2Vob2xkZXI9ZS5wbGFjZWhvbGRlcixpfSxObi5jdXJyeVJpZ2h0PWZ1bmN0aW9uIGUodCxuLHIpe3ZhciBpPU1pKHQsMTYsdm9pZCAwLHZvaWQgMCx2b2lkIDAsdm9pZCAwLHZvaWQgMCxuPXI/dm9pZCAwOm4pO3JldHVybiBpLnBsYWNlaG9sZGVyPWUucGxhY2Vob2xkZXIsaX0sTm4uZGVib3VuY2U9d2EsTm4uZGVmYXVsdHM9cHMsTm4uZGVmYXVsdHNEZWVwPWdzLE5uLmRlZmVyPXhhLE5uLmRlbGF5PVRhLE5uLmRpZmZlcmVuY2U9RG8sTm4uZGlmZmVyZW5jZUJ5PWpvLE5uLmRpZmZlcmVuY2VXaXRoPU9vLE5uLmRyb3A9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW51bGw9PWU/MDplLmxlbmd0aDtyZXR1cm4gcj9RcihlLCh0PW58fHZvaWQgMD09PXQ/MTppcyh0KSk8MD8wOnQscik6W119LE5uLmRyb3BSaWdodD1mdW5jdGlvbihlLHQsbil7dmFyIHI9bnVsbD09ZT8wOmUubGVuZ3RoO3JldHVybiByP1FyKGUsMCwodD1yLSh0PW58fHZvaWQgMD09PXQ/MTppcyh0KSkpPDA/MDp0KTpbXX0sTm4uZHJvcFJpZ2h0V2hpbGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSYmZS5sZW5ndGg/bmkoZSxKaSh0LDMpLCEwLCEwKTpbXX0sTm4uZHJvcFdoaWxlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUmJmUubGVuZ3RoP25pKGUsSmkodCwzKSwhMCk6W119LE5uLmZpbGw9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9bnVsbD09ZT8wOmUubGVuZ3RoO3JldHVybiBpPyhuJiYibnVtYmVyIiE9dHlwZW9mIG4mJnVvKGUsdCxuKSYmKG49MCxyPWkpLGZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPWUubGVuZ3RoO2Zvcigobj1pcyhuKSk8MCYmKG49LW4+aT8wOmkrbiksKHI9dm9pZCAwPT09cnx8cj5pP2k6aXMocikpPDAmJihyKz1pKSxyPW4+cj8wOm9zKHIpO248cjspZVtuKytdPXQ7cmV0dXJuIGV9KGUsdCxuLHIpKTpbXX0sTm4uZmlsdGVyPWZ1bmN0aW9uKGUsdCl7cmV0dXJuKElhKGUpP2N0Om9yKShlLEppKHQsMykpfSxObi5mbGF0TWFwPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGFyKGhhKGUsdCksMSl9LE5uLmZsYXRNYXBEZWVwPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGFyKGhhKGUsdCksMS8wKX0sTm4uZmxhdE1hcERlcHRoPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbj12b2lkIDA9PT1uPzE6aXMobiksYXIoaGEoZSx0KSxuKX0sTm4uZmxhdHRlbj1SbyxObi5mbGF0dGVuRGVlcD1mdW5jdGlvbihlKXtyZXR1cm4obnVsbD09ZT8wOmUubGVuZ3RoKT9hcihlLDEvMCk6W119LE5uLmZsYXR0ZW5EZXB0aD1mdW5jdGlvbihlLHQpe3JldHVybihudWxsPT1lPzA6ZS5sZW5ndGgpP2FyKGUsdD12b2lkIDA9PT10PzE6aXModCkpOltdfSxObi5mbGlwPWZ1bmN0aW9uKGUpe3JldHVybiBNaShlLDUxMil9LE5uLmZsb3c9enMsTm4uZmxvd1JpZ2h0PVFzLE5uLmZyb21QYWlycz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9LTEsbj1udWxsPT1lPzA6ZS5sZW5ndGgscj17fTsrK3Q8bjspe3ZhciBpPWVbdF07cltpWzBdXT1pWzFdfXJldHVybiByfSxObi5mdW5jdGlvbnM9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/W106ZnIoZSx3cyhlKSl9LE5uLmZ1bmN0aW9uc0luPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP1tdOmZyKGUseHMoZSkpfSxObi5ncm91cEJ5PWNhLE5uLmluaXRpYWw9ZnVuY3Rpb24oZSl7cmV0dXJuKG51bGw9PWU/MDplLmxlbmd0aCk/UXIoZSwwLC0xKTpbXX0sTm4uaW50ZXJzZWN0aW9uPSRvLE5uLmludGVyc2VjdGlvbkJ5PUJvLE5uLmludGVyc2VjdGlvbldpdGg9cW8sTm4uaW52ZXJ0PXlzLE5uLmludmVydEJ5PWJzLE5uLmludm9rZU1hcD1mYSxObi5pdGVyYXRlZT1LcyxObi5rZXlCeT1kYSxObi5rZXlzPXdzLE5uLmtleXNJbj14cyxObi5tYXA9aGEsTm4ubWFwS2V5cz1mdW5jdGlvbihlLHQpe3ZhciBuPXt9O3JldHVybiB0PUppKHQsMyksbHIoZSwoZnVuY3Rpb24oZSxyLGkpe0tuKG4sdChlLHIsaSksZSl9KSksbn0sTm4ubWFwVmFsdWVzPWZ1bmN0aW9uKGUsdCl7dmFyIG49e307cmV0dXJuIHQ9SmkodCwzKSxscihlLChmdW5jdGlvbihlLHIsaSl7S24obixyLHQoZSxyLGkpKX0pKSxufSxObi5tYXRjaGVzPWZ1bmN0aW9uKGUpe3JldHVybiBOcihKbihlLDEpKX0sTm4ubWF0Y2hlc1Byb3BlcnR5PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIERyKGUsSm4odCwxKSl9LE5uLm1lbW9pemU9RWEsTm4ubWVyZ2U9VHMsTm4ubWVyZ2VXaXRoPUVzLE5uLm1ldGhvZD1YcyxObi5tZXRob2RPZj1ZcyxObi5taXhpbj1KcyxObi5uZWdhdGU9Q2EsTm4ubnRoQXJnPWZ1bmN0aW9uKGUpe3JldHVybiBlPWlzKGUpLHFyKChmdW5jdGlvbih0KXtyZXR1cm4gT3IodCxlKX0pKX0sTm4ub21pdD1DcyxObi5vbWl0Qnk9ZnVuY3Rpb24oZSx0KXtyZXR1cm4ga3MoZSxDYShKaSh0KSkpfSxObi5vbmNlPWZ1bmN0aW9uKGUpe3JldHVybiB5YSgyLGUpfSxObi5vcmRlckJ5PWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBudWxsPT1lP1tdOihJYSh0KXx8KHQ9bnVsbD09dD9bXTpbdF0pLElhKG49cj92b2lkIDA6bil8fChuPW51bGw9PW4/W106W25dKSxMcihlLHQsbikpfSxObi5vdmVyPVpzLE5uLm92ZXJBcmdzPVNhLE5uLm92ZXJFdmVyeT1ldSxObi5vdmVyU29tZT10dSxObi5wYXJ0aWFsPWthLE5uLnBhcnRpYWxSaWdodD1BYSxObi5wYXJ0aXRpb249cGEsTm4ucGljaz1TcyxObi5waWNrQnk9a3MsTm4ucHJvcGVydHk9bnUsTm4ucHJvcGVydHlPZj1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PWU/dm9pZCAwOmRyKGUsdCl9fSxObi5wdWxsPUhvLE5uLnB1bGxBbGw9Rm8sTm4ucHVsbEFsbEJ5PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZSYmZS5sZW5ndGgmJnQmJnQubGVuZ3RoP1JyKGUsdCxKaShuLDIpKTplfSxObi5wdWxsQWxsV2l0aD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGUmJmUubGVuZ3RoJiZ0JiZ0Lmxlbmd0aD9ScihlLHQsdm9pZCAwLG4pOmV9LE5uLnB1bGxBdD1XbyxObi5yYW5nZT1ydSxObi5yYW5nZVJpZ2h0PWl1LE5uLnJlYXJnPU5hLE5uLnJlamVjdD1mdW5jdGlvbihlLHQpe3JldHVybihJYShlKT9jdDpvcikoZSxDYShKaSh0LDMpKSl9LE5uLnJlbW92ZT1mdW5jdGlvbihlLHQpe3ZhciBuPVtdO2lmKCFlfHwhZS5sZW5ndGgpcmV0dXJuIG47dmFyIHI9LTEsaT1bXSxvPWUubGVuZ3RoO2Zvcih0PUppKHQsMyk7KytyPG87KXt2YXIgYT1lW3JdO3QoYSxyLGUpJiYobi5wdXNoKGEpLGkucHVzaChyKSl9cmV0dXJuIFByKGUsaSksbn0sTm4ucmVzdD1mdW5jdGlvbihlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBtZShvKTtyZXR1cm4gcXIoZSx0PXZvaWQgMD09PXQ/dDppcyh0KSl9LE5uLnJldmVyc2U9VW8sTm4uc2FtcGxlU2l6ZT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHQ9KG4/dW8oZSx0LG4pOnZvaWQgMD09PXQpPzE6aXModCksKElhKGUpP0huOkhyKShlLHQpfSxObi5zZXQ9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBudWxsPT1lP2U6RnIoZSx0LG4pfSxObi5zZXRXaXRoPWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiByPSJmdW5jdGlvbiI9PXR5cGVvZiByP3I6dm9pZCAwLG51bGw9PWU/ZTpGcihlLHQsbixyKX0sTm4uc2h1ZmZsZT1mdW5jdGlvbihlKXtyZXR1cm4oSWEoZSk/Rm46enIpKGUpfSxObi5zbGljZT1mdW5jdGlvbihlLHQsbil7dmFyIHI9bnVsbD09ZT8wOmUubGVuZ3RoO3JldHVybiByPyhuJiYibnVtYmVyIiE9dHlwZW9mIG4mJnVvKGUsdCxuKT8odD0wLG49cik6KHQ9bnVsbD09dD8wOmlzKHQpLG49dm9pZCAwPT09bj9yOmlzKG4pKSxRcihlLHQsbikpOltdfSxObi5zb3J0Qnk9Z2EsTm4uc29ydGVkVW5pcT1mdW5jdGlvbihlKXtyZXR1cm4gZSYmZS5sZW5ndGg/WXIoZSk6W119LE5uLnNvcnRlZFVuaXFCeT1mdW5jdGlvbihlLHQpe3JldHVybiBlJiZlLmxlbmd0aD9ZcihlLEppKHQsMikpOltdfSxObi5zcGxpdD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG4mJiJudW1iZXIiIT10eXBlb2YgbiYmdW8oZSx0LG4pJiYodD1uPXZvaWQgMCksKG49dm9pZCAwPT09bj80Mjk0OTY3Mjk1Om4+Pj4wKT8oZT11cyhlKSkmJigic3RyaW5nIj09dHlwZW9mIHR8fG51bGwhPXQmJiFYYSh0KSkmJiEodD1Hcih0KSkmJk10KGUpP2NpKFZ0KGUpLDAsbik6ZS5zcGxpdCh0LG4pOltdfSxObi5zcHJlYWQ9ZnVuY3Rpb24oZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgbWUobyk7cmV0dXJuIHQ9bnVsbD09dD8wOnNuKGlzKHQpLDApLHFyKChmdW5jdGlvbihuKXt2YXIgcj1uW3RdLGk9Y2kobiwwLHQpO3JldHVybiByJiZwdChpLHIpLG90KGUsdGhpcyxpKX0pKX0sTm4udGFpbD1mdW5jdGlvbihlKXt2YXIgdD1udWxsPT1lPzA6ZS5sZW5ndGg7cmV0dXJuIHQ/UXIoZSwxLHQpOltdfSxObi50YWtlPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZSYmZS5sZW5ndGg/UXIoZSwwLCh0PW58fHZvaWQgMD09PXQ/MTppcyh0KSk8MD8wOnQpOltdfSxObi50YWtlUmlnaHQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW51bGw9PWU/MDplLmxlbmd0aDtyZXR1cm4gcj9RcihlLCh0PXItKHQ9bnx8dm9pZCAwPT09dD8xOmlzKHQpKSk8MD8wOnQscik6W119LE5uLnRha2VSaWdodFdoaWxlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUmJmUubGVuZ3RoP25pKGUsSmkodCwzKSwhMSwhMCk6W119LE5uLnRha2VXaGlsZT1mdW5jdGlvbihlLHQpe3JldHVybiBlJiZlLmxlbmd0aD9uaShlLEppKHQsMykpOltdfSxObi50YXA9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdChlKSxlfSxObi50aHJvdHRsZT1mdW5jdGlvbihlLHQsbil7dmFyIHI9ITAsaT0hMDtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgbWUobyk7cmV0dXJuIFVhKG4pJiYocj0ibGVhZGluZyJpbiBuPyEhbi5sZWFkaW5nOnIsaT0idHJhaWxpbmciaW4gbj8hIW4udHJhaWxpbmc6aSksd2EoZSx0LHtsZWFkaW5nOnIsbWF4V2FpdDp0LHRyYWlsaW5nOml9KX0sTm4udGhydT1yYSxObi50b0FycmF5PW5zLE5uLnRvUGFpcnM9QXMsTm4udG9QYWlyc0luPU5zLE5uLnRvUGF0aD1mdW5jdGlvbihlKXtyZXR1cm4gSWEoZSk/aHQoZSxrbyk6R2EoZSk/W2VdOnlpKFNvKHVzKGUpKSl9LE5uLnRvUGxhaW5PYmplY3Q9c3MsTm4udHJhbnNmb3JtPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1JYShlKSxpPXJ8fEJhKGUpfHxaYShlKTtpZih0PUppKHQsNCksbnVsbD09bil7dmFyIG89ZSYmZS5jb25zdHJ1Y3RvcjtuPWk/cj9uZXcgbzpbXTpVYShlKSYmSGEobyk/RG4oRmUoZSkpOnt9fXJldHVybihpP3N0OmxyKShlLChmdW5jdGlvbihlLHIsaSl7cmV0dXJuIHQobixlLHIsaSl9KSksbn0sTm4udW5hcnk9ZnVuY3Rpb24oZSl7cmV0dXJuIG1hKGUsMSl9LE5uLnVuaW9uPXpvLE5uLnVuaW9uQnk9UW8sTm4udW5pb25XaXRoPVZvLE5uLnVuaXE9ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUubGVuZ3RoP1pyKGUpOltdfSxObi51bmlxQnk9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSYmZS5sZW5ndGg/WnIoZSxKaSh0LDIpKTpbXX0sTm4udW5pcVdpdGg9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnZvaWQgMCxlJiZlLmxlbmd0aD9acihlLHZvaWQgMCx0KTpbXX0sTm4udW5zZXQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbnVsbD09ZXx8ZWkoZSx0KX0sTm4udW56aXA9S28sTm4udW56aXBXaXRoPVhvLE5uLnVwZGF0ZT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG51bGw9PWU/ZTp0aShlLHQsc2kobikpfSxObi51cGRhdGVXaXRoPWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiByPSJmdW5jdGlvbiI9PXR5cGVvZiByP3I6dm9pZCAwLG51bGw9PWU/ZTp0aShlLHQsc2kobikscil9LE5uLnZhbHVlcz1EcyxObi52YWx1ZXNJbj1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT9bXTpPdChlLHhzKGUpKX0sTm4ud2l0aG91dD1ZbyxObi53b3Jkcz1IcyxObi53cmFwPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGthKHNpKHQpLGUpfSxObi54b3I9Sm8sTm4ueG9yQnk9R28sTm4ueG9yV2l0aD1abyxObi56aXA9ZWEsTm4uemlwT2JqZWN0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG9pKGV8fFtdLHR8fFtdLFVuKX0sTm4uemlwT2JqZWN0RGVlcD1mdW5jdGlvbihlLHQpe3JldHVybiBvaShlfHxbXSx0fHxbXSxGcil9LE5uLnppcFdpdGg9dGEsTm4uZW50cmllcz1BcyxObi5lbnRyaWVzSW49TnMsTm4uZXh0ZW5kPWNzLE5uLmV4dGVuZFdpdGg9ZnMsSnMoTm4sTm4pLE5uLmFkZD1zdSxObi5hdHRlbXB0PUZzLE5uLmNhbWVsQ2FzZT1qcyxObi5jYXBpdGFsaXplPU9zLE5uLmNlaWw9dXUsTm4uY2xhbXA9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2b2lkIDA9PT1uJiYobj10LHQ9dm9pZCAwKSx2b2lkIDAhPT1uJiYobj0obj1hcyhuKSk9PW4/bjowKSx2b2lkIDAhPT10JiYodD0odD1hcyh0KSk9PXQ/dDowKSxZbihhcyhlKSx0LG4pfSxObi5jbG9uZT1mdW5jdGlvbihlKXtyZXR1cm4gSm4oZSw0KX0sTm4uY2xvbmVEZWVwPWZ1bmN0aW9uKGUpe3JldHVybiBKbihlLDUpfSxObi5jbG9uZURlZXBXaXRoPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIEpuKGUsNSx0PSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6dm9pZCAwKX0sTm4uY2xvbmVXaXRoPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIEpuKGUsNCx0PSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6dm9pZCAwKX0sTm4uY29uZm9ybXNUbz1mdW5jdGlvbihlLHQpe3JldHVybiBudWxsPT10fHxHbihlLHQsd3ModCkpfSxObi5kZWJ1cnI9THMsTm4uZGVmYXVsdFRvPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG51bGw9PWV8fGUhPWU/dDplfSxObi5kaXZpZGU9bHUsTm4uZW5kc1dpdGg9ZnVuY3Rpb24oZSx0LG4pe2U9dXMoZSksdD1Hcih0KTt2YXIgcj1lLmxlbmd0aCxpPW49dm9pZCAwPT09bj9yOlluKGlzKG4pLDAscik7cmV0dXJuKG4tPXQubGVuZ3RoKT49MCYmZS5zbGljZShuLGkpPT10fSxObi5lcT1EYSxObi5lc2NhcGU9ZnVuY3Rpb24oZSl7cmV0dXJuKGU9dXMoZSkpJiZxLnRlc3QoZSk/ZS5yZXBsYWNlKCQsQnQpOmV9LE5uLmVzY2FwZVJlZ0V4cD1mdW5jdGlvbihlKXtyZXR1cm4oZT11cyhlKSkmJlYudGVzdChlKT9lLnJlcGxhY2UoUSwiXFwkJiIpOmV9LE5uLmV2ZXJ5PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1JYShlKT9sdDpycjtyZXR1cm4gbiYmdW8oZSx0LG4pJiYodD12b2lkIDApLHIoZSxKaSh0LDMpKX0sTm4uZmluZD1hYSxObi5maW5kSW5kZXg9TG8sTm4uZmluZEtleT1mdW5jdGlvbihlLHQpe3JldHVybiBidChlLEppKHQsMyksbHIpfSxObi5maW5kTGFzdD1zYSxObi5maW5kTGFzdEluZGV4PUlvLE5uLmZpbmRMYXN0S2V5PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGJ0KGUsSmkodCwzKSxjcil9LE5uLmZsb29yPWN1LE5uLmZvckVhY2g9dWEsTm4uZm9yRWFjaFJpZ2h0PWxhLE5uLmZvckluPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG51bGw9PWU/ZTpzcihlLEppKHQsMykseHMpfSxObi5mb3JJblJpZ2h0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG51bGw9PWU/ZTp1cihlLEppKHQsMykseHMpfSxObi5mb3JPd249ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSYmbHIoZSxKaSh0LDMpKX0sTm4uZm9yT3duUmlnaHQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSYmY3IoZSxKaSh0LDMpKX0sTm4uZ2V0PXZzLE5uLmd0PWphLE5uLmd0ZT1PYSxObi5oYXM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbnVsbCE9ZSYmaW8oZSx0LHZyKX0sTm4uaGFzSW49bXMsTm4uaGVhZD1QbyxObi5pZGVudGl0eT1WcyxObi5pbmNsdWRlcz1mdW5jdGlvbihlLHQsbixyKXtlPVBhKGUpP2U6RHMoZSksbj1uJiYhcj9pcyhuKTowO3ZhciBpPWUubGVuZ3RoO3JldHVybiBuPDAmJihuPXNuKGkrbiwwKSksSmEoZSk/bjw9aSYmZS5pbmRleE9mKHQsbik+LTE6ISFpJiZ3dChlLHQsbik+LTF9LE5uLmluZGV4T2Y9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW51bGw9PWU/MDplLmxlbmd0aDtpZighcilyZXR1cm4tMTt2YXIgaT1udWxsPT1uPzA6aXMobik7cmV0dXJuIGk8MCYmKGk9c24ocitpLDApKSx3dChlLHQsaSl9LE5uLmluUmFuZ2U9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0PXJzKHQpLHZvaWQgMD09PW4/KG49dCx0PTApOm49cnMobiksZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPj11bih0LG4pJiZlPHNuKHQsbil9KGU9YXMoZSksdCxuKX0sTm4uaW52b2tlPV9zLE5uLmlzQXJndW1lbnRzPUxhLE5uLmlzQXJyYXk9SWEsTm4uaXNBcnJheUJ1ZmZlcj1SYSxObi5pc0FycmF5TGlrZT1QYSxObi5pc0FycmF5TGlrZU9iamVjdD0kYSxObi5pc0Jvb2xlYW49ZnVuY3Rpb24oZSl7cmV0dXJuITA9PT1lfHwhMT09PWV8fHphKGUpJiZwcihlKT09Y30sTm4uaXNCdWZmZXI9QmEsTm4uaXNEYXRlPXFhLE5uLmlzRWxlbWVudD1mdW5jdGlvbihlKXtyZXR1cm4gemEoZSkmJjE9PT1lLm5vZGVUeXBlJiYhS2EoZSl9LE5uLmlzRW1wdHk9ZnVuY3Rpb24oZSl7aWYobnVsbD09ZSlyZXR1cm4hMDtpZihQYShlKSYmKElhKGUpfHwic3RyaW5nIj09dHlwZW9mIGV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlLnNwbGljZXx8QmEoZSl8fFphKGUpfHxMYShlKSkpcmV0dXJuIWUubGVuZ3RoO3ZhciB0PXJvKGUpO2lmKHQ9PWd8fHQ9PWIpcmV0dXJuIWUuc2l6ZTtpZihobyhlKSlyZXR1cm4hQ3IoZSkubGVuZ3RoO2Zvcih2YXIgbiBpbiBlKWlmKFRlLmNhbGwoZSxuKSlyZXR1cm4hMTtyZXR1cm4hMH0sTm4uaXNFcXVhbD1mdW5jdGlvbihlLHQpe3JldHVybiB3cihlLHQpfSxObi5pc0VxdWFsV2l0aD1mdW5jdGlvbihlLHQsbil7dmFyIHI9KG49ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjp2b2lkIDApP24oZSx0KTp2b2lkIDA7cmV0dXJuIHZvaWQgMD09PXI/d3IoZSx0LHZvaWQgMCxuKTohIXJ9LE5uLmlzRXJyb3I9TWEsTm4uaXNGaW5pdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlJiZybihlKX0sTm4uaXNGdW5jdGlvbj1IYSxObi5pc0ludGVnZXI9RmEsTm4uaXNMZW5ndGg9V2EsTm4uaXNNYXA9UWEsTm4uaXNNYXRjaD1mdW5jdGlvbihlLHQpe3JldHVybiBlPT09dHx8eHIoZSx0LFppKHQpKX0sTm4uaXNNYXRjaFdpdGg9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBuPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246dm9pZCAwLHhyKGUsdCxaaSh0KSxuKX0sTm4uaXNOYU49ZnVuY3Rpb24oZSl7cmV0dXJuIFZhKGUpJiZlIT0rZX0sTm4uaXNOYXRpdmU9ZnVuY3Rpb24oZSl7aWYoZm8oZSkpdGhyb3cgbmV3IFgoIlVuc3VwcG9ydGVkIGNvcmUtanMgdXNlLiBUcnkgaHR0cHM6Ly9ucG1zLmlvL3NlYXJjaD9xPXBvbnlmaWxsLiIpO3JldHVybiBUcihlKX0sTm4uaXNOaWw9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWV9LE5uLmlzTnVsbD1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09PWV9LE5uLmlzTnVtYmVyPVZhLE5uLmlzT2JqZWN0PVVhLE5uLmlzT2JqZWN0TGlrZT16YSxObi5pc1BsYWluT2JqZWN0PUthLE5uLmlzUmVnRXhwPVhhLE5uLmlzU2FmZUludGVnZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIEZhKGUpJiZlPj0tOTAwNzE5OTI1NDc0MDk5MSYmZTw9OTAwNzE5OTI1NDc0MDk5MX0sTm4uaXNTZXQ9WWEsTm4uaXNTdHJpbmc9SmEsTm4uaXNTeW1ib2w9R2EsTm4uaXNUeXBlZEFycmF5PVphLE5uLmlzVW5kZWZpbmVkPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lfSxObi5pc1dlYWtNYXA9ZnVuY3Rpb24oZSl7cmV0dXJuIHphKGUpJiZybyhlKT09eH0sTm4uaXNXZWFrU2V0PWZ1bmN0aW9uKGUpe3JldHVybiB6YShlKSYmIltvYmplY3QgV2Vha1NldF0iPT1wcihlKX0sTm4uam9pbj1mdW5jdGlvbihlLHQpe3JldHVybiBudWxsPT1lPyIiOm9uLmNhbGwoZSx0KX0sTm4ua2ViYWJDYXNlPUlzLE5uLmxhc3Q9TW8sTm4ubGFzdEluZGV4T2Y9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW51bGw9PWU/MDplLmxlbmd0aDtpZighcilyZXR1cm4tMTt2YXIgaT1yO3JldHVybiB2b2lkIDAhPT1uJiYoaT0oaT1pcyhuKSk8MD9zbihyK2ksMCk6dW4oaSxyLTEpKSx0PT10P2Z1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9bisxO3ItLTspaWYoZVtyXT09PXQpcmV0dXJuIHI7cmV0dXJuIHJ9KGUsdCxpKTpfdChlLFR0LGksITApfSxObi5sb3dlckNhc2U9UnMsTm4ubG93ZXJGaXJzdD1QcyxObi5sdD1lcyxObi5sdGU9dHMsTm4ubWF4PWZ1bmN0aW9uKGUpe3JldHVybiBlJiZlLmxlbmd0aD9pcihlLFZzLGdyKTp2b2lkIDB9LE5uLm1heEJ5PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUmJmUubGVuZ3RoP2lyKGUsSmkodCwyKSxncik6dm9pZCAwfSxObi5tZWFuPWZ1bmN0aW9uKGUpe3JldHVybiBFdChlLFZzKX0sTm4ubWVhbkJ5PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIEV0KGUsSmkodCwyKSl9LE5uLm1pbj1mdW5jdGlvbihlKXtyZXR1cm4gZSYmZS5sZW5ndGg/aXIoZSxWcyxrcik6dm9pZCAwfSxObi5taW5CeT1mdW5jdGlvbihlLHQpe3JldHVybiBlJiZlLmxlbmd0aD9pcihlLEppKHQsMiksa3IpOnZvaWQgMH0sTm4uc3R1YkFycmF5PW91LE5uLnN0dWJGYWxzZT1hdSxObi5zdHViT2JqZWN0PWZ1bmN0aW9uKCl7cmV0dXJue319LE5uLnN0dWJTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iIn0sTm4uc3R1YlRydWU9ZnVuY3Rpb24oKXtyZXR1cm4hMH0sTm4ubXVsdGlwbHk9ZHUsTm4ubnRoPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUmJmUubGVuZ3RoP09yKGUsaXModCkpOnZvaWQgMH0sTm4ubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiBWZS5fPT09dGhpcyYmKFZlLl89QWUpLHRoaXN9LE5uLm5vb3A9R3MsTm4ubm93PXZhLE5uLnBhZD1mdW5jdGlvbihlLHQsbil7ZT11cyhlKTt2YXIgcj0odD1pcyh0KSk/UXQoZSk6MDtpZighdHx8cj49dClyZXR1cm4gZTt2YXIgaT0odC1yKS8yO3JldHVybiBMaShlbihpKSxuKStlK0xpKFp0KGkpLG4pfSxObi5wYWRFbmQ9ZnVuY3Rpb24oZSx0LG4pe2U9dXMoZSk7dmFyIHI9KHQ9aXModCkpP1F0KGUpOjA7cmV0dXJuIHQmJnI8dD9lK0xpKHQtcixuKTplfSxObi5wYWRTdGFydD1mdW5jdGlvbihlLHQsbil7ZT11cyhlKTt2YXIgcj0odD1pcyh0KSk/UXQoZSk6MDtyZXR1cm4gdCYmcjx0P0xpKHQtcixuKStlOmV9LE5uLnBhcnNlSW50PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbnx8bnVsbD09dD90PTA6dCYmKHQ9K3QpLGNuKHVzKGUpLnJlcGxhY2UoSywiIiksdHx8MCl9LE5uLnJhbmRvbT1mdW5jdGlvbihlLHQsbil7aWYobiYmImJvb2xlYW4iIT10eXBlb2YgbiYmdW8oZSx0LG4pJiYodD1uPXZvaWQgMCksdm9pZCAwPT09biYmKCJib29sZWFuIj09dHlwZW9mIHQ/KG49dCx0PXZvaWQgMCk6ImJvb2xlYW4iPT10eXBlb2YgZSYmKG49ZSxlPXZvaWQgMCkpLHZvaWQgMD09PWUmJnZvaWQgMD09PXQ/KGU9MCx0PTEpOihlPXJzKGUpLHZvaWQgMD09PXQ/KHQ9ZSxlPTApOnQ9cnModCkpLGU+dCl7dmFyIHI9ZTtlPXQsdD1yfWlmKG58fGUlMXx8dCUxKXt2YXIgaT1mbigpO3JldHVybiB1bihlK2kqKHQtZStXZSgiMWUtIisoKGkrIiIpLmxlbmd0aC0xKSkpLHQpfXJldHVybiAkcihlLHQpfSxObi5yZWR1Y2U9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPUlhKGUpP2d0Omt0LGk9YXJndW1lbnRzLmxlbmd0aDwzO3JldHVybiByKGUsSmkodCw0KSxuLGksdHIpfSxObi5yZWR1Y2VSaWdodD1mdW5jdGlvbihlLHQsbil7dmFyIHI9SWEoZSk/dnQ6a3QsaT1hcmd1bWVudHMubGVuZ3RoPDM7cmV0dXJuIHIoZSxKaSh0LDQpLG4saSxucil9LE5uLnJlcGVhdD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHQ9KG4/dW8oZSx0LG4pOnZvaWQgMD09PXQpPzE6aXModCksQnIodXMoZSksdCl9LE5uLnJlcGxhY2U9ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHMsdD11cyhlWzBdKTtyZXR1cm4gZS5sZW5ndGg8Mz90OnQucmVwbGFjZShlWzFdLGVbMl0pfSxObi5yZXN1bHQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPS0xLGk9KHQ9dWkodCxlKSkubGVuZ3RoO2ZvcihpfHwoaT0xLGU9dm9pZCAwKTsrK3I8aTspe3ZhciBvPW51bGw9PWU/dm9pZCAwOmVba28odFtyXSldO3ZvaWQgMD09PW8mJihyPWksbz1uKSxlPUhhKG8pP28uY2FsbChlKTpvfXJldHVybiBlfSxObi5yb3VuZD1odSxObi5ydW5JbkNvbnRleHQ9ZSxObi5zYW1wbGU9ZnVuY3Rpb24oZSl7cmV0dXJuKElhKGUpP01uOk1yKShlKX0sTm4uc2l6ZT1mdW5jdGlvbihlKXtpZihudWxsPT1lKXJldHVybiAwO2lmKFBhKGUpKXJldHVybiBKYShlKT9RdChlKTplLmxlbmd0aDt2YXIgdD1ybyhlKTtyZXR1cm4gdD09Z3x8dD09Yj9lLnNpemU6Q3IoZSkubGVuZ3RofSxObi5zbmFrZUNhc2U9JHMsTm4uc29tZT1mdW5jdGlvbihlLHQsbil7dmFyIHI9SWEoZSk/bXQ6VnI7cmV0dXJuIG4mJnVvKGUsdCxuKSYmKHQ9dm9pZCAwKSxyKGUsSmkodCwzKSl9LE5uLnNvcnRlZEluZGV4PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIEtyKGUsdCl9LE5uLnNvcnRlZEluZGV4Qnk9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBYcihlLHQsSmkobiwyKSl9LE5uLnNvcnRlZEluZGV4T2Y9ZnVuY3Rpb24oZSx0KXt2YXIgbj1udWxsPT1lPzA6ZS5sZW5ndGg7aWYobil7dmFyIHI9S3IoZSx0KTtpZihyPG4mJkRhKGVbcl0sdCkpcmV0dXJuIHJ9cmV0dXJuLTF9LE5uLnNvcnRlZExhc3RJbmRleD1mdW5jdGlvbihlLHQpe3JldHVybiBLcihlLHQsITApfSxObi5zb3J0ZWRMYXN0SW5kZXhCeT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIFhyKGUsdCxKaShuLDIpLCEwKX0sTm4uc29ydGVkTGFzdEluZGV4T2Y9ZnVuY3Rpb24oZSx0KXtpZihudWxsPT1lPzA6ZS5sZW5ndGgpe3ZhciBuPUtyKGUsdCwhMCktMTtpZihEYShlW25dLHQpKXJldHVybiBufXJldHVybi0xfSxObi5zdGFydENhc2U9QnMsTm4uc3RhcnRzV2l0aD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9dXMoZSksbj1udWxsPT1uPzA6WW4oaXMobiksMCxlLmxlbmd0aCksdD1Hcih0KSxlLnNsaWNlKG4sbit0Lmxlbmd0aCk9PXR9LE5uLnN1YnRyYWN0PXB1LE5uLnN1bT1mdW5jdGlvbihlKXtyZXR1cm4gZSYmZS5sZW5ndGg/QXQoZSxWcyk6MH0sTm4uc3VtQnk9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSYmZS5sZW5ndGg/QXQoZSxKaSh0LDIpKTowfSxObi50ZW1wbGF0ZT1mdW5jdGlvbihlLHQsbil7dmFyIHI9Tm4udGVtcGxhdGVTZXR0aW5ncztuJiZ1byhlLHQsbikmJih0PXZvaWQgMCksZT11cyhlKSx0PWZzKHt9LHQscixIaSk7dmFyIGksbyxhPWZzKHt9LHQuaW1wb3J0cyxyLmltcG9ydHMsSGkpLHM9d3MoYSksdT1PdChhLHMpLGw9MCxjPXQuaW50ZXJwb2xhdGV8fGNlLGY9Il9fcCArPSAnIixkPWdlKCh0LmVzY2FwZXx8Y2UpLnNvdXJjZSsifCIrYy5zb3VyY2UrInwiKyhjPT09Rj9uZTpjZSkuc291cmNlKyJ8IisodC5ldmFsdWF0ZXx8Y2UpLnNvdXJjZSsifCQiLCJnIiksaD0iLy8jIHNvdXJjZVVSTD0iKyhUZS5jYWxsKHQsInNvdXJjZVVSTCIpPyh0LnNvdXJjZVVSTCsiIikucmVwbGFjZSgvXHMvZywiICIpOiJsb2Rhc2gudGVtcGxhdGVTb3VyY2VzWyIrICsrcWUrIl0iKSsiXG4iO2UucmVwbGFjZShkLChmdW5jdGlvbih0LG4scixhLHMsdSl7cmV0dXJuIHJ8fChyPWEpLGYrPWUuc2xpY2UobCx1KS5yZXBsYWNlKGZlLHF0KSxuJiYoaT0hMCxmKz0iJyArXG5fX2UoIituKyIpICtcbiciKSxzJiYobz0hMCxmKz0iJztcbiIrcysiO1xuX19wICs9ICciKSxyJiYoZis9IicgK1xuKChfX3QgPSAoIityKyIpKSA9PSBudWxsID8gJycgOiBfX3QpICtcbiciKSxsPXUrdC5sZW5ndGgsdH0pKSxmKz0iJztcbiI7dmFyIHA9VGUuY2FsbCh0LCJ2YXJpYWJsZSIpJiZ0LnZhcmlhYmxlO2lmKHApe2lmKGVlLnRlc3QocCkpdGhyb3cgbmV3IFgoIkludmFsaWQgYHZhcmlhYmxlYCBvcHRpb24gcGFzc2VkIGludG8gYF8udGVtcGxhdGVgIil9ZWxzZSBmPSJ3aXRoIChvYmopIHtcbiIrZisiXG59XG4iO2Y9KG8/Zi5yZXBsYWNlKEwsIiIpOmYpLnJlcGxhY2UoSSwiJDEiKS5yZXBsYWNlKFIsIiQxOyIpLGY9ImZ1bmN0aW9uKCIrKHB8fCJvYmoiKSsiKSB7XG4iKyhwPyIiOiJvYmogfHwgKG9iaiA9IHt9KTtcbiIpKyJ2YXIgX190LCBfX3AgPSAnJyIrKGk/IiwgX19lID0gXy5lc2NhcGUiOiIiKSsobz8iLCBfX2ogPSBBcnJheS5wcm90b3R5cGUuam9pbjtcbmZ1bmN0aW9uIHByaW50KCkgeyBfX3AgKz0gX19qLmNhbGwoYXJndW1lbnRzLCAnJykgfVxuIjoiO1xuIikrZisicmV0dXJuIF9fcFxufSI7dmFyIGc9RnMoKGZ1bmN0aW9uKCl7cmV0dXJuIGRlKHMsaCsicmV0dXJuICIrZikuYXBwbHkodm9pZCAwLHUpfSkpO2lmKGcuc291cmNlPWYsTWEoZykpdGhyb3cgZztyZXR1cm4gZ30sTm4udGltZXM9ZnVuY3Rpb24oZSx0KXtpZigoZT1pcyhlKSk8MXx8ZT45MDA3MTk5MjU0NzQwOTkxKXJldHVybltdO3ZhciBuPTQyOTQ5NjcyOTUscj11bihlLDQyOTQ5NjcyOTUpO2UtPTQyOTQ5NjcyOTU7Zm9yKHZhciBpPU50KHIsdD1KaSh0KSk7KytuPGU7KXQobik7cmV0dXJuIGl9LE5uLnRvRmluaXRlPXJzLE5uLnRvSW50ZWdlcj1pcyxObi50b0xlbmd0aD1vcyxObi50b0xvd2VyPWZ1bmN0aW9uKGUpe3JldHVybiB1cyhlKS50b0xvd2VyQ2FzZSgpfSxObi50b051bWJlcj1hcyxObi50b1NhZmVJbnRlZ2VyPWZ1bmN0aW9uKGUpe3JldHVybiBlP1luKGlzKGUpLC05MDA3MTk5MjU0NzQwOTkxLDkwMDcxOTkyNTQ3NDA5OTEpOjA9PT1lP2U6MH0sTm4udG9TdHJpbmc9dXMsTm4udG9VcHBlcj1mdW5jdGlvbihlKXtyZXR1cm4gdXMoZSkudG9VcHBlckNhc2UoKX0sTm4udHJpbT1mdW5jdGlvbihlLHQsbil7aWYoKGU9dXMoZSkpJiYobnx8dm9pZCAwPT09dCkpcmV0dXJuIER0KGUpO2lmKCFlfHwhKHQ9R3IodCkpKXJldHVybiBlO3ZhciByPVZ0KGUpLGk9VnQodCk7cmV0dXJuIGNpKHIsSXQocixpKSxSdChyLGkpKzEpLmpvaW4oIiIpfSxObi50cmltRW5kPWZ1bmN0aW9uKGUsdCxuKXtpZigoZT11cyhlKSkmJihufHx2b2lkIDA9PT10KSlyZXR1cm4gZS5zbGljZSgwLEt0KGUpKzEpO2lmKCFlfHwhKHQ9R3IodCkpKXJldHVybiBlO3ZhciByPVZ0KGUpO3JldHVybiBjaShyLDAsUnQocixWdCh0KSkrMSkuam9pbigiIil9LE5uLnRyaW1TdGFydD1mdW5jdGlvbihlLHQsbil7aWYoKGU9dXMoZSkpJiYobnx8dm9pZCAwPT09dCkpcmV0dXJuIGUucmVwbGFjZShLLCIiKTtpZighZXx8ISh0PUdyKHQpKSlyZXR1cm4gZTt2YXIgcj1WdChlKTtyZXR1cm4gY2kocixJdChyLFZ0KHQpKSkuam9pbigiIil9LE5uLnRydW5jYXRlPWZ1bmN0aW9uKGUsdCl7dmFyIG49MzAscj0iLi4uIjtpZihVYSh0KSl7dmFyIGk9InNlcGFyYXRvciJpbiB0P3Quc2VwYXJhdG9yOmk7bj0ibGVuZ3RoImluIHQ/aXModC5sZW5ndGgpOm4scj0ib21pc3Npb24iaW4gdD9Hcih0Lm9taXNzaW9uKTpyfXZhciBvPShlPXVzKGUpKS5sZW5ndGg7aWYoTXQoZSkpe3ZhciBhPVZ0KGUpO289YS5sZW5ndGh9aWYobj49bylyZXR1cm4gZTt2YXIgcz1uLVF0KHIpO2lmKHM8MSlyZXR1cm4gcjt2YXIgdT1hP2NpKGEsMCxzKS5qb2luKCIiKTplLnNsaWNlKDAscyk7aWYodm9pZCAwPT09aSlyZXR1cm4gdStyO2lmKGEmJihzKz11Lmxlbmd0aC1zKSxYYShpKSl7aWYoZS5zbGljZShzKS5zZWFyY2goaSkpe3ZhciBsLGM9dTtmb3IoaS5nbG9iYWx8fChpPWdlKGkuc291cmNlLHVzKHJlLmV4ZWMoaSkpKyJnIikpLGkubGFzdEluZGV4PTA7bD1pLmV4ZWMoYyk7KXZhciBmPWwuaW5kZXg7dT11LnNsaWNlKDAsdm9pZCAwPT09Zj9zOmYpfX1lbHNlIGlmKGUuaW5kZXhPZihHcihpKSxzKSE9cyl7dmFyIGQ9dS5sYXN0SW5kZXhPZihpKTtkPi0xJiYodT11LnNsaWNlKDAsZCkpfXJldHVybiB1K3J9LE5uLnVuZXNjYXBlPWZ1bmN0aW9uKGUpe3JldHVybihlPXVzKGUpKSYmQi50ZXN0KGUpP2UucmVwbGFjZShQLFh0KTplfSxObi51bmlxdWVJZD1mdW5jdGlvbihlKXt2YXIgdD0rK0VlO3JldHVybiB1cyhlKSt0fSxObi51cHBlckNhc2U9cXMsTm4udXBwZXJGaXJzdD1NcyxObi5lYWNoPXVhLE5uLmVhY2hSaWdodD1sYSxObi5maXJzdD1QbyxKcyhObiwoZnU9e30sbHIoTm4sKGZ1bmN0aW9uKGUsdCl7VGUuY2FsbChObi5wcm90b3R5cGUsdCl8fChmdVt0XT1lKX0pKSxmdSkse2NoYWluOiExfSksTm4uVkVSU0lPTj0iNC4xNy4yMSIsc3QoWyJiaW5kIiwiYmluZEtleSIsImN1cnJ5IiwiY3VycnlSaWdodCIsInBhcnRpYWwiLCJwYXJ0aWFsUmlnaHQiXSwoZnVuY3Rpb24oZSl7Tm5bZV0ucGxhY2Vob2xkZXI9Tm59KSksc3QoWyJkcm9wIiwidGFrZSJdLChmdW5jdGlvbihlLHQpe0xuLnByb3RvdHlwZVtlXT1mdW5jdGlvbihuKXtuPXZvaWQgMD09PW4/MTpzbihpcyhuKSwwKTt2YXIgcj10aGlzLl9fZmlsdGVyZWRfXyYmIXQ/bmV3IExuKHRoaXMpOnRoaXMuY2xvbmUoKTtyZXR1cm4gci5fX2ZpbHRlcmVkX18/ci5fX3Rha2VDb3VudF9fPXVuKG4sci5fX3Rha2VDb3VudF9fKTpyLl9fdmlld3NfXy5wdXNoKHtzaXplOnVuKG4sNDI5NDk2NzI5NSksdHlwZTplKyhyLl9fZGlyX188MD8iUmlnaHQiOiIiKX0pLHJ9LExuLnByb3RvdHlwZVtlKyJSaWdodCJdPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJldmVyc2UoKVtlXSh0KS5yZXZlcnNlKCl9fSkpLHN0KFsiZmlsdGVyIiwibWFwIiwidGFrZVdoaWxlIl0sKGZ1bmN0aW9uKGUsdCl7dmFyIG49dCsxLHI9MT09bnx8Mz09bjtMbi5wcm90b3R5cGVbZV09ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5jbG9uZSgpO3JldHVybiB0Ll9faXRlcmF0ZWVzX18ucHVzaCh7aXRlcmF0ZWU6SmkoZSwzKSx0eXBlOm59KSx0Ll9fZmlsdGVyZWRfXz10Ll9fZmlsdGVyZWRfX3x8cix0fX0pKSxzdChbImhlYWQiLCJsYXN0Il0sKGZ1bmN0aW9uKGUsdCl7dmFyIG49InRha2UiKyh0PyJSaWdodCI6IiIpO0xuLnByb3RvdHlwZVtlXT1mdW5jdGlvbigpe3JldHVybiB0aGlzW25dKDEpLnZhbHVlKClbMF19fSkpLHN0KFsiaW5pdGlhbCIsInRhaWwiXSwoZnVuY3Rpb24oZSx0KXt2YXIgbj0iZHJvcCIrKHQ/IiI6IlJpZ2h0Iik7TG4ucHJvdG90eXBlW2VdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX19maWx0ZXJlZF9fP25ldyBMbih0aGlzKTp0aGlzW25dKDEpfX0pKSxMbi5wcm90b3R5cGUuY29tcGFjdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbHRlcihWcyl9LExuLnByb3RvdHlwZS5maW5kPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmZpbHRlcihlKS5oZWFkKCl9LExuLnByb3RvdHlwZS5maW5kTGFzdD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5yZXZlcnNlKCkuZmluZChlKX0sTG4ucHJvdG90eXBlLmludm9rZU1hcD1xcigoZnVuY3Rpb24oZSx0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZT9uZXcgTG4odGhpcyk6dGhpcy5tYXAoKGZ1bmN0aW9uKG4pe3JldHVybiBicihuLGUsdCl9KSl9KSksTG4ucHJvdG90eXBlLnJlamVjdD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5maWx0ZXIoQ2EoSmkoZSkpKX0sTG4ucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKGUsdCl7ZT1pcyhlKTt2YXIgbj10aGlzO3JldHVybiBuLl9fZmlsdGVyZWRfXyYmKGU+MHx8dDwwKT9uZXcgTG4obik6KGU8MD9uPW4udGFrZVJpZ2h0KC1lKTplJiYobj1uLmRyb3AoZSkpLHZvaWQgMCE9PXQmJihuPSh0PWlzKHQpKTwwP24uZHJvcFJpZ2h0KC10KTpuLnRha2UodC1lKSksbil9LExuLnByb3RvdHlwZS50YWtlUmlnaHRXaGlsZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5yZXZlcnNlKCkudGFrZVdoaWxlKGUpLnJldmVyc2UoKX0sTG4ucHJvdG90eXBlLnRvQXJyYXk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50YWtlKDQyOTQ5NjcyOTUpfSxscihMbi5wcm90b3R5cGUsKGZ1bmN0aW9uKGUsdCl7dmFyIG49L14oPzpmaWx0ZXJ8ZmluZHxtYXB8cmVqZWN0KXxXaGlsZSQvLnRlc3QodCkscj0vXig/OmhlYWR8bGFzdCkkLy50ZXN0KHQpLGk9Tm5bcj8idGFrZSIrKCJsYXN0Ij09dD8iUmlnaHQiOiIiKTp0XSxvPXJ8fC9eZmluZC8udGVzdCh0KTtpJiYoTm4ucHJvdG90eXBlW3RdPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fX3dyYXBwZWRfXyxhPXI/WzFdOmFyZ3VtZW50cyxzPXQgaW5zdGFuY2VvZiBMbix1PWFbMF0sbD1zfHxJYSh0KSxjPWZ1bmN0aW9uKGUpe3ZhciB0PWkuYXBwbHkoTm4scHQoW2VdLGEpKTtyZXR1cm4gciYmZj90WzBdOnR9O2wmJm4mJiJmdW5jdGlvbiI9PXR5cGVvZiB1JiYxIT11Lmxlbmd0aCYmKHM9bD0hMSk7dmFyIGY9dGhpcy5fX2NoYWluX18sZD0hIXRoaXMuX19hY3Rpb25zX18ubGVuZ3RoLGg9byYmIWYscD1zJiYhZDtpZighbyYmbCl7dD1wP3Q6bmV3IExuKHRoaXMpO3ZhciBnPWUuYXBwbHkodCxhKTtyZXR1cm4gZy5fX2FjdGlvbnNfXy5wdXNoKHtmdW5jOnJhLGFyZ3M6W2NdLHRoaXNBcmc6dm9pZCAwfSksbmV3IE9uKGcsZil9cmV0dXJuIGgmJnA/ZS5hcHBseSh0aGlzLGEpOihnPXRoaXMudGhydShjKSxoP3I/Zy52YWx1ZSgpWzBdOmcudmFsdWUoKTpnKX0pfSkpLHN0KFsicG9wIiwicHVzaCIsInNoaWZ0Iiwic29ydCIsInNwbGljZSIsInVuc2hpZnQiXSwoZnVuY3Rpb24oZSl7dmFyIHQ9eWVbZV0sbj0vXig/OnB1c2h8c29ydHx1bnNoaWZ0KSQvLnRlc3QoZSk/InRhcCI6InRocnUiLHI9L14oPzpwb3B8c2hpZnQpJC8udGVzdChlKTtObi5wcm90b3R5cGVbZV09ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHM7aWYociYmIXRoaXMuX19jaGFpbl9fKXt2YXIgaT10aGlzLnZhbHVlKCk7cmV0dXJuIHQuYXBwbHkoSWEoaSk/aTpbXSxlKX1yZXR1cm4gdGhpc1tuXSgoZnVuY3Rpb24obil7cmV0dXJuIHQuYXBwbHkoSWEobik/bjpbXSxlKX0pKX19KSksbHIoTG4ucHJvdG90eXBlLChmdW5jdGlvbihlLHQpe3ZhciBuPU5uW3RdO2lmKG4pe3ZhciByPW4ubmFtZSsiIjtUZS5jYWxsKF9uLHIpfHwoX25bcl09W10pLF9uW3JdLnB1c2goe25hbWU6dCxmdW5jOm59KX19KSksX25bTmkodm9pZCAwLDIpLm5hbWVdPVt7bmFtZToid3JhcHBlciIsZnVuYzp2b2lkIDB9XSxMbi5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgZT1uZXcgTG4odGhpcy5fX3dyYXBwZWRfXyk7cmV0dXJuIGUuX19hY3Rpb25zX189eWkodGhpcy5fX2FjdGlvbnNfXyksZS5fX2Rpcl9fPXRoaXMuX19kaXJfXyxlLl9fZmlsdGVyZWRfXz10aGlzLl9fZmlsdGVyZWRfXyxlLl9faXRlcmF0ZWVzX189eWkodGhpcy5fX2l0ZXJhdGVlc19fKSxlLl9fdGFrZUNvdW50X189dGhpcy5fX3Rha2VDb3VudF9fLGUuX192aWV3c19fPXlpKHRoaXMuX192aWV3c19fKSxlfSxMbi5wcm90b3R5cGUucmV2ZXJzZT1mdW5jdGlvbigpe2lmKHRoaXMuX19maWx0ZXJlZF9fKXt2YXIgZT1uZXcgTG4odGhpcyk7ZS5fX2Rpcl9fPS0xLGUuX19maWx0ZXJlZF9fPSEwfWVsc2UoZT10aGlzLmNsb25lKCkpLl9fZGlyX18qPS0xO3JldHVybiBlfSxMbi5wcm90b3R5cGUudmFsdWU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9fd3JhcHBlZF9fLnZhbHVlKCksdD10aGlzLl9fZGlyX18sbj1JYShlKSxyPXQ8MCxpPW4/ZS5sZW5ndGg6MCxvPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0tMSxpPW4ubGVuZ3RoO2Zvcig7KytyPGk7KXt2YXIgbz1uW3JdLGE9by5zaXplO3N3aXRjaChvLnR5cGUpe2Nhc2UiZHJvcCI6ZSs9YTticmVhaztjYXNlImRyb3BSaWdodCI6dC09YTticmVhaztjYXNlInRha2UiOnQ9dW4odCxlK2EpO2JyZWFrO2Nhc2UidGFrZVJpZ2h0IjplPXNuKGUsdC1hKX19cmV0dXJue3N0YXJ0OmUsZW5kOnR9fSgwLGksdGhpcy5fX3ZpZXdzX18pLGE9by5zdGFydCxzPW8uZW5kLHU9cy1hLGw9cj9zOmEtMSxjPXRoaXMuX19pdGVyYXRlZXNfXyxmPWMubGVuZ3RoLGQ9MCxoPXVuKHUsdGhpcy5fX3Rha2VDb3VudF9fKTtpZighbnx8IXImJmk9PXUmJmg9PXUpcmV0dXJuIHJpKGUsdGhpcy5fX2FjdGlvbnNfXyk7dmFyIHA9W107ZTpmb3IoO3UtLSYmZDxoOyl7Zm9yKHZhciBnPS0xLHY9ZVtsKz10XTsrK2c8Zjspe3ZhciBtPWNbZ10seT1tLml0ZXJhdGVlLGI9bS50eXBlLF89eSh2KTtpZigyPT1iKXY9XztlbHNlIGlmKCFfKXtpZigxPT1iKWNvbnRpbnVlIGU7YnJlYWsgZX19cFtkKytdPXZ9cmV0dXJuIHB9LE5uLnByb3RvdHlwZS5hdD1pYSxObi5wcm90b3R5cGUuY2hhaW49ZnVuY3Rpb24oKXtyZXR1cm4gbmEodGhpcyl9LE5uLnByb3RvdHlwZS5jb21taXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE9uKHRoaXMudmFsdWUoKSx0aGlzLl9fY2hhaW5fXyl9LE5uLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7dm9pZCAwPT09dGhpcy5fX3ZhbHVlc19fJiYodGhpcy5fX3ZhbHVlc19fPW5zKHRoaXMudmFsdWUoKSkpO3ZhciBlPXRoaXMuX19pbmRleF9fPj10aGlzLl9fdmFsdWVzX18ubGVuZ3RoO3JldHVybntkb25lOmUsdmFsdWU6ZT92b2lkIDA6dGhpcy5fX3ZhbHVlc19fW3RoaXMuX19pbmRleF9fKytdfX0sTm4ucHJvdG90eXBlLnBsYW50PWZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuPXRoaXM7biBpbnN0YW5jZW9mIGpuOyl7dmFyIHI9Tm8obik7ci5fX2luZGV4X189MCxyLl9fdmFsdWVzX189dm9pZCAwLHQ/aS5fX3dyYXBwZWRfXz1yOnQ9cjt2YXIgaT1yO249bi5fX3dyYXBwZWRfX31yZXR1cm4gaS5fX3dyYXBwZWRfXz1lLHR9LE5uLnByb3RvdHlwZS5yZXZlcnNlPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fX3dyYXBwZWRfXztpZihlIGluc3RhbmNlb2YgTG4pe3ZhciB0PWU7cmV0dXJuIHRoaXMuX19hY3Rpb25zX18ubGVuZ3RoJiYodD1uZXcgTG4odGhpcykpLCh0PXQucmV2ZXJzZSgpKS5fX2FjdGlvbnNfXy5wdXNoKHtmdW5jOnJhLGFyZ3M6W1VvXSx0aGlzQXJnOnZvaWQgMH0pLG5ldyBPbih0LHRoaXMuX19jaGFpbl9fKX1yZXR1cm4gdGhpcy50aHJ1KFVvKX0sTm4ucHJvdG90eXBlLnRvSlNPTj1Obi5wcm90b3R5cGUudmFsdWVPZj1Obi5wcm90b3R5cGUudmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gcmkodGhpcy5fX3dyYXBwZWRfXyx0aGlzLl9fYWN0aW9uc19fKX0sTm4ucHJvdG90eXBlLmZpcnN0PU5uLnByb3RvdHlwZS5oZWFkLEplJiYoTm4ucHJvdG90eXBlW0plXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSksTm59KCk7VmUuXz1ZdCx2b2lkIDA9PT0oaT1mdW5jdGlvbigpe3JldHVybiBZdH0uY2FsbCh0LG4sdCxyKSl8fChyLmV4cG9ydHM9aSl9KS5jYWxsKHRoaXMpfSkuY2FsbCh0aGlzLG4oInlMcGoiKSxuKCJZdVRpIikoZSkpfSxNTFdaOmZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigieFRKKyIpO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChlKS5yZXBsYWNlKC8lNDAvZ2ksIkAiKS5yZXBsYWNlKC8lM0EvZ2ksIjoiKS5yZXBsYWNlKC8lMjQvZywiJCIpLnJlcGxhY2UoLyUyQy9naSwiLCIpLnJlcGxhY2UoLyUyMC9nLCIrIikucmVwbGFjZSgvJTVCL2dpLCJbIikucmVwbGFjZSgvJTVEL2dpLCJdIil9ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuKXtpZighdClyZXR1cm4gZTt2YXIgbztpZihuKW89bih0KTtlbHNlIGlmKHIuaXNVUkxTZWFyY2hQYXJhbXModCkpbz10LnRvU3RyaW5nKCk7ZWxzZXt2YXIgYT1bXTtyLmZvckVhY2godCwoZnVuY3Rpb24oZSx0KXtudWxsIT1lJiYoci5pc0FycmF5KGUpP3QrPSJbXSI6ZT1bZV0sci5mb3JFYWNoKGUsKGZ1bmN0aW9uKGUpe3IuaXNEYXRlKGUpP2U9ZS50b0lTT1N0cmluZygpOnIuaXNPYmplY3QoZSkmJihlPUpTT04uc3RyaW5naWZ5KGUpKSxhLnB1c2goaSh0KSsiPSIraShlKSl9KSkpfSkpLG89YS5qb2luKCImIil9aWYobyl7dmFyIHM9ZS5pbmRleE9mKCIjIik7LTEhPT1zJiYoZT1lLnNsaWNlKDAscykpLGUrPSgtMT09PWUuaW5kZXhPZigiPyIpPyI/IjoiJiIpK299cmV0dXJuIGV9fSxPSDljOmZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuLHIsaSl7cmV0dXJuIGUuY29uZmlnPXQsbiYmKGUuY29kZT1uKSxlLnJlcXVlc3Q9cixlLnJlc3BvbnNlPWksZS5pc0F4aW9zRXJyb3I9ITAsZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57bWVzc2FnZTp0aGlzLm1lc3NhZ2UsbmFtZTp0aGlzLm5hbWUsZGVzY3JpcHRpb246dGhpcy5kZXNjcmlwdGlvbixudW1iZXI6dGhpcy5udW1iZXIsZmlsZU5hbWU6dGhpcy5maWxlTmFtZSxsaW5lTnVtYmVyOnRoaXMubGluZU51bWJlcixjb2x1bW5OdW1iZXI6dGhpcy5jb2x1bW5OdW1iZXIsc3RhY2s6dGhpcy5zdGFjayxjb25maWc6dGhpcy5jb25maWcsY29kZTp0aGlzLmNvZGV9fSxlfX0sT1RUdzpmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oInhUSisiKTtlLmV4cG9ydHM9ci5pc1N0YW5kYXJkQnJvd3NlckVudigpP2Z1bmN0aW9uKCl7dmFyIGUsdD0vKG1zaWV8dHJpZGVudCkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpO2Z1bmN0aW9uIGkoZSl7dmFyIHI9ZTtyZXR1cm4gdCYmKG4uc2V0QXR0cmlidXRlKCJocmVmIixyKSxyPW4uaHJlZiksbi5zZXRBdHRyaWJ1dGUoImhyZWYiLHIpLHtocmVmOm4uaHJlZixwcm90b2NvbDpuLnByb3RvY29sP24ucHJvdG9jb2wucmVwbGFjZSgvOiQvLCIiKToiIixob3N0Om4uaG9zdCxzZWFyY2g6bi5zZWFyY2g/bi5zZWFyY2gucmVwbGFjZSgvXlw/LywiIik6IiIsaGFzaDpuLmhhc2g/bi5oYXNoLnJlcGxhY2UoL14jLywiIik6IiIsaG9zdG5hbWU6bi5ob3N0bmFtZSxwb3J0Om4ucG9ydCxwYXRobmFtZToiLyI9PT1uLnBhdGhuYW1lLmNoYXJBdCgwKT9uLnBhdGhuYW1lOiIvIituLnBhdGhuYW1lfX1yZXR1cm4gZT1pKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSxmdW5jdGlvbih0KXt2YXIgbj1yLmlzU3RyaW5nKHQpP2kodCk6dDtyZXR1cm4gbi5wcm90b2NvbD09PWUucHJvdG9jb2wmJm4uaG9zdD09PWUuaG9zdH19KCk6ZnVuY3Rpb24oKXtyZXR1cm4hMH19LCJSbitnIjpmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oIkxZTkYiKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPW4uY29uZmlnLnZhbGlkYXRlU3RhdHVzOyFpfHxpKG4uc3RhdHVzKT9lKG4pOnQocigiUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSAiK24uc3RhdHVzLG4uY29uZmlnLG51bGwsbi5yZXF1ZXN0LG4pKX19LFNZa3k6ZnVuY3Rpb24oZSx0LG4peyFmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJiJvYmplY3QiPT10eXBlb2YgZSYmImRlZmF1bHQiaW4gZT9lOntkZWZhdWx0OmV9fXZhciBpPXIodCksbz1yKG4pO2Z1bmN0aW9uIGEoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1mdW5jdGlvbiBzKGUsdCxuKXtyZXR1cm4gdCYmYShlLnByb3RvdHlwZSx0KSxuJiZhKGUsbiksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsInByb3RvdHlwZSIse3dyaXRhYmxlOiExfSksZX1mdW5jdGlvbiB1KCl7cmV0dXJuKHU9T2JqZWN0LmFzc2lnbj9PYmplY3QuYXNzaWduLmJpbmQoKTpmdW5jdGlvbihlKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgbj1hcmd1bWVudHNbdF07Zm9yKHZhciByIGluIG4pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4scikmJihlW3JdPW5bcl0pfXJldHVybiBlfSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIGwoZSx0KXtyZXR1cm4obD1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKTpmdW5jdGlvbihlLHQpe3JldHVybiBlLl9fcHJvdG9fXz10LGV9KShlLHQpfWZ1bmN0aW9uIGMoZSl7dmFyIHQ9dGhpcyxuPSExO3JldHVybiBpLmRlZmF1bHQodGhpcykub25lKGYuVFJBTlNJVElPTl9FTkQsKGZ1bmN0aW9uKCl7bj0hMH0pKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe258fGYudHJpZ2dlclRyYW5zaXRpb25FbmQodCl9KSxlKSx0aGlzfXZhciBmPXtUUkFOU0lUSU9OX0VORDoiYnNUcmFuc2l0aW9uRW5kIixnZXRVSUQ6ZnVuY3Rpb24oZSl7ZG97ZSs9fn4oMWU2Kk1hdGgucmFuZG9tKCkpfXdoaWxlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpKTtyZXR1cm4gZX0sZ2V0U2VsZWN0b3JGcm9tRWxlbWVudDpmdW5jdGlvbihlKXt2YXIgdD1lLmdldEF0dHJpYnV0ZSgiZGF0YS10YXJnZXQiKTtpZighdHx8IiMiPT09dCl7dmFyIG49ZS5nZXRBdHRyaWJ1dGUoImhyZWYiKTt0PW4mJiIjIiE9PW4/bi50cmltKCk6IiJ9dHJ5e3JldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHQpP3Q6bnVsbH1jYXRjaChlKXtyZXR1cm4gbnVsbH19LGdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50OmZ1bmN0aW9uKGUpe2lmKCFlKXJldHVybiAwO3ZhciB0PWkuZGVmYXVsdChlKS5jc3MoInRyYW5zaXRpb24tZHVyYXRpb24iKSxuPWkuZGVmYXVsdChlKS5jc3MoInRyYW5zaXRpb24tZGVsYXkiKSxyPXBhcnNlRmxvYXQodCksbz1wYXJzZUZsb2F0KG4pO3JldHVybiByfHxvPyh0PXQuc3BsaXQoIiwiKVswXSxuPW4uc3BsaXQoIiwiKVswXSwxZTMqKHBhcnNlRmxvYXQodCkrcGFyc2VGbG9hdChuKSkpOjB9LHJlZmxvdzpmdW5jdGlvbihlKXtyZXR1cm4gZS5vZmZzZXRIZWlnaHR9LHRyaWdnZXJUcmFuc2l0aW9uRW5kOmZ1bmN0aW9uKGUpe2kuZGVmYXVsdChlKS50cmlnZ2VyKCJ0cmFuc2l0aW9uZW5kIil9LHN1cHBvcnRzVHJhbnNpdGlvbkVuZDpmdW5jdGlvbigpe3JldHVybiBCb29sZWFuKCJ0cmFuc2l0aW9uZW5kIil9LGlzRWxlbWVudDpmdW5jdGlvbihlKXtyZXR1cm4oZVswXXx8ZSkubm9kZVR5cGV9LHR5cGVDaGVja0NvbmZpZzpmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByIGluIG4paWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4scikpe3ZhciBpPW5bcl0sbz10W3JdLGE9byYmZi5pc0VsZW1lbnQobyk/ImVsZW1lbnQiOm51bGw9PShzPW8pPyIiK3M6e30udG9TdHJpbmcuY2FsbChzKS5tYXRjaCgvXHMoW2Etel0rKS9pKVsxXS50b0xvd2VyQ2FzZSgpO2lmKCFuZXcgUmVnRXhwKGkpLnRlc3QoYSkpdGhyb3cgbmV3IEVycm9yKGUudG9VcHBlckNhc2UoKSsnOiBPcHRpb24gIicrcisnIiBwcm92aWRlZCB0eXBlICInK2ErJyIgYnV0IGV4cGVjdGVkIHR5cGUgIicraSsnIi4nKX12YXIgc30sZmluZFNoYWRvd1Jvb3Q6ZnVuY3Rpb24oZSl7aWYoIWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hdHRhY2hTaGFkb3cpcmV0dXJuIG51bGw7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGUuZ2V0Um9vdE5vZGUpe3ZhciB0PWUuZ2V0Um9vdE5vZGUoKTtyZXR1cm4gdCBpbnN0YW5jZW9mIFNoYWRvd1Jvb3Q/dDpudWxsfXJldHVybiBlIGluc3RhbmNlb2YgU2hhZG93Um9vdD9lOmUucGFyZW50Tm9kZT9mLmZpbmRTaGFkb3dSb290KGUucGFyZW50Tm9kZSk6bnVsbH0salF1ZXJ5RGV0ZWN0aW9uOmZ1bmN0aW9uKCl7aWYodm9pZCAwPT09aS5kZWZhdWx0KXRocm93IG5ldyBUeXBlRXJyb3IoIkJvb3RzdHJhcCdzIEphdmFTY3JpcHQgcmVxdWlyZXMgalF1ZXJ5LiBqUXVlcnkgbXVzdCBiZSBpbmNsdWRlZCBiZWZvcmUgQm9vdHN0cmFwJ3MgSmF2YVNjcmlwdC4iKTt2YXIgZT1pLmRlZmF1bHQuZm4uanF1ZXJ5LnNwbGl0KCIgIilbMF0uc3BsaXQoIi4iKTtpZihlWzBdPDImJmVbMV08OXx8MT09PWVbMF0mJjk9PT1lWzFdJiZlWzJdPDF8fGVbMF0+PTQpdGhyb3cgbmV3IEVycm9yKCJCb290c3RyYXAncyBKYXZhU2NyaXB0IHJlcXVpcmVzIGF0IGxlYXN0IGpRdWVyeSB2MS45LjEgYnV0IGxlc3MgdGhhbiB2NC4wLjAiKX19O2YualF1ZXJ5RGV0ZWN0aW9uKCksaS5kZWZhdWx0LmZuLmVtdWxhdGVUcmFuc2l0aW9uRW5kPWMsaS5kZWZhdWx0LmV2ZW50LnNwZWNpYWxbZi5UUkFOU0lUSU9OX0VORF09e2JpbmRUeXBlOiJ0cmFuc2l0aW9uZW5kIixkZWxlZ2F0ZVR5cGU6InRyYW5zaXRpb25lbmQiLGhhbmRsZTpmdW5jdGlvbihlKXtpZihpLmRlZmF1bHQoZS50YXJnZXQpLmlzKHRoaXMpKXJldHVybiBlLmhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19O3ZhciBkPWkuZGVmYXVsdC5mbi5hbGVydCxoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXt0aGlzLl9lbGVtZW50PWV9dmFyIHQ9ZS5wcm90b3R5cGU7cmV0dXJuIHQuY2xvc2U9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fZWxlbWVudDtlJiYodD10aGlzLl9nZXRSb290RWxlbWVudChlKSksdGhpcy5fdHJpZ2dlckNsb3NlRXZlbnQodCkuaXNEZWZhdWx0UHJldmVudGVkKCl8fHRoaXMuX3JlbW92ZUVsZW1lbnQodCl9LHQuZGlzcG9zZT1mdW5jdGlvbigpe2kuZGVmYXVsdC5yZW1vdmVEYXRhKHRoaXMuX2VsZW1lbnQsImJzLmFsZXJ0IiksdGhpcy5fZWxlbWVudD1udWxsfSx0Ll9nZXRSb290RWxlbWVudD1mdW5jdGlvbihlKXt2YXIgdD1mLmdldFNlbGVjdG9yRnJvbUVsZW1lbnQoZSksbj0hMTtyZXR1cm4gdCYmKG49ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0KSksbnx8KG49aS5kZWZhdWx0KGUpLmNsb3Nlc3QoIi5hbGVydCIpWzBdKSxufSx0Ll90cmlnZ2VyQ2xvc2VFdmVudD1mdW5jdGlvbihlKXt2YXIgdD1pLmRlZmF1bHQuRXZlbnQoImNsb3NlLmJzLmFsZXJ0Iik7cmV0dXJuIGkuZGVmYXVsdChlKS50cmlnZ2VyKHQpLHR9LHQuX3JlbW92ZUVsZW1lbnQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztpZihpLmRlZmF1bHQoZSkucmVtb3ZlQ2xhc3MoInNob3ciKSxpLmRlZmF1bHQoZSkuaGFzQ2xhc3MoImZhZGUiKSl7dmFyIG49Zi5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudChlKTtpLmRlZmF1bHQoZSkub25lKGYuVFJBTlNJVElPTl9FTkQsKGZ1bmN0aW9uKG4pe3JldHVybiB0Ll9kZXN0cm95RWxlbWVudChlLG4pfSkpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKG4pfWVsc2UgdGhpcy5fZGVzdHJveUVsZW1lbnQoZSl9LHQuX2Rlc3Ryb3lFbGVtZW50PWZ1bmN0aW9uKGUpe2kuZGVmYXVsdChlKS5kZXRhY2goKS50cmlnZ2VyKCJjbG9zZWQuYnMuYWxlcnQiKS5yZW1vdmUoKX0sZS5falF1ZXJ5SW50ZXJmYWNlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7dmFyIG49aS5kZWZhdWx0KHRoaXMpLHI9bi5kYXRhKCJicy5hbGVydCIpO3J8fChyPW5ldyBlKHRoaXMpLG4uZGF0YSgiYnMuYWxlcnQiLHIpKSwiY2xvc2UiPT09dCYmclt0XSh0aGlzKX0pKX0sZS5faGFuZGxlRGlzbWlzcz1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7dCYmdC5wcmV2ZW50RGVmYXVsdCgpLGUuY2xvc2UodGhpcyl9fSxzKGUsbnVsbCxbe2tleToiVkVSU0lPTiIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIjQuNi4yIn19XSksZX0oKTtpLmRlZmF1bHQoZG9jdW1lbnQpLm9uKCJjbGljay5icy5hbGVydC5kYXRhLWFwaSIsJ1tkYXRhLWRpc21pc3M9ImFsZXJ0Il0nLGguX2hhbmRsZURpc21pc3MobmV3IGgpKSxpLmRlZmF1bHQuZm4uYWxlcnQ9aC5falF1ZXJ5SW50ZXJmYWNlLGkuZGVmYXVsdC5mbi5hbGVydC5Db25zdHJ1Y3Rvcj1oLGkuZGVmYXVsdC5mbi5hbGVydC5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIGkuZGVmYXVsdC5mbi5hbGVydD1kLGguX2pRdWVyeUludGVyZmFjZX07dmFyIHA9aS5kZWZhdWx0LmZuLmJ1dHRvbixnPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXt0aGlzLl9lbGVtZW50PWUsdGhpcy5zaG91bGRBdm9pZFRyaWdnZXJDaGFuZ2U9ITF9dmFyIHQ9ZS5wcm90b3R5cGU7cmV0dXJuIHQudG9nZ2xlPWZ1bmN0aW9uKCl7dmFyIGU9ITAsdD0hMCxuPWkuZGVmYXVsdCh0aGlzLl9lbGVtZW50KS5jbG9zZXN0KCdbZGF0YS10b2dnbGU9ImJ1dHRvbnMiXScpWzBdO2lmKG4pe3ZhciByPXRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXQ6bm90KFt0eXBlPSJoaWRkZW4iXSknKTtpZihyKXtpZigicmFkaW8iPT09ci50eXBlKWlmKHIuY2hlY2tlZCYmdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoImFjdGl2ZSIpKWU9ITE7ZWxzZXt2YXIgbz1uLnF1ZXJ5U2VsZWN0b3IoIi5hY3RpdmUiKTtvJiZpLmRlZmF1bHQobykucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpfWUmJigiY2hlY2tib3giIT09ci50eXBlJiYicmFkaW8iIT09ci50eXBlfHwoci5jaGVja2VkPSF0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygiYWN0aXZlIikpLHRoaXMuc2hvdWxkQXZvaWRUcmlnZ2VyQ2hhbmdlfHxpLmRlZmF1bHQocikudHJpZ2dlcigiY2hhbmdlIikpLHIuZm9jdXMoKSx0PSExfX10aGlzLl9lbGVtZW50Lmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKXx8dGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoImRpc2FibGVkIil8fCh0JiZ0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgiYXJpYS1wcmVzc2VkIiwhdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoImFjdGl2ZSIpKSxlJiZpLmRlZmF1bHQodGhpcy5fZWxlbWVudCkudG9nZ2xlQ2xhc3MoImFjdGl2ZSIpKX0sdC5kaXNwb3NlPWZ1bmN0aW9uKCl7aS5kZWZhdWx0LnJlbW92ZURhdGEodGhpcy5fZWxlbWVudCwiYnMuYnV0dG9uIiksdGhpcy5fZWxlbWVudD1udWxsfSxlLl9qUXVlcnlJbnRlcmZhY2U9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdGhpcy5lYWNoKChmdW5jdGlvbigpe3ZhciByPWkuZGVmYXVsdCh0aGlzKSxvPXIuZGF0YSgiYnMuYnV0dG9uIik7b3x8KG89bmV3IGUodGhpcyksci5kYXRhKCJicy5idXR0b24iLG8pKSxvLnNob3VsZEF2b2lkVHJpZ2dlckNoYW5nZT1uLCJ0b2dnbGUiPT09dCYmb1t0XSgpfSkpfSxzKGUsbnVsbCxbe2tleToiVkVSU0lPTiIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIjQuNi4yIn19XSksZX0oKTtpLmRlZmF1bHQoZG9jdW1lbnQpLm9uKCJjbGljay5icy5idXR0b24uZGF0YS1hcGkiLCdbZGF0YS10b2dnbGVePSJidXR0b24iXScsKGZ1bmN0aW9uKGUpe3ZhciB0PWUudGFyZ2V0LG49dDtpZihpLmRlZmF1bHQodCkuaGFzQ2xhc3MoImJ0biIpfHwodD1pLmRlZmF1bHQodCkuY2xvc2VzdCgiLmJ0biIpWzBdKSwhdHx8dC5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIil8fHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJkaXNhYmxlZCIpKWUucHJldmVudERlZmF1bHQoKTtlbHNle3ZhciByPXQucXVlcnlTZWxlY3RvcignaW5wdXQ6bm90KFt0eXBlPSJoaWRkZW4iXSknKTtpZihyJiYoci5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIil8fHIuY2xhc3NMaXN0LmNvbnRhaW5zKCJkaXNhYmxlZCIpKSlyZXR1cm4gdm9pZCBlLnByZXZlbnREZWZhdWx0KCk7IklOUFVUIiE9PW4udGFnTmFtZSYmIkxBQkVMIj09PXQudGFnTmFtZXx8Zy5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoaS5kZWZhdWx0KHQpLCJ0b2dnbGUiLCJJTlBVVCI9PT1uLnRhZ05hbWUpfX0pKS5vbigiZm9jdXMuYnMuYnV0dG9uLmRhdGEtYXBpIGJsdXIuYnMuYnV0dG9uLmRhdGEtYXBpIiwnW2RhdGEtdG9nZ2xlXj0iYnV0dG9uIl0nLChmdW5jdGlvbihlKXt2YXIgdD1pLmRlZmF1bHQoZS50YXJnZXQpLmNsb3Nlc3QoIi5idG4iKVswXTtpLmRlZmF1bHQodCkudG9nZ2xlQ2xhc3MoImZvY3VzIiwvXmZvY3VzKGluKT8kLy50ZXN0KGUudHlwZSkpfSkpLGkuZGVmYXVsdCh3aW5kb3cpLm9uKCJsb2FkLmJzLmJ1dHRvbi5kYXRhLWFwaSIsKGZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtdG9nZ2xlPSJidXR0b25zIl0gLmJ0bicpKSx0PTAsbj1lLmxlbmd0aDt0PG47dCsrKXt2YXIgcj1lW3RdLGk9ci5xdWVyeVNlbGVjdG9yKCdpbnB1dDpub3QoW3R5cGU9ImhpZGRlbiJdKScpO2kuY2hlY2tlZHx8aS5oYXNBdHRyaWJ1dGUoImNoZWNrZWQiKT9yLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpOnIuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIil9Zm9yKHZhciBvPTAsYT0oZT1bXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXRvZ2dsZT0iYnV0dG9uIl0nKSkpLmxlbmd0aDtvPGE7bysrKXt2YXIgcz1lW29dOyJ0cnVlIj09PXMuZ2V0QXR0cmlidXRlKCJhcmlhLXByZXNzZWQiKT9zLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpOnMuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIil9fSkpLGkuZGVmYXVsdC5mbi5idXR0b249Zy5falF1ZXJ5SW50ZXJmYWNlLGkuZGVmYXVsdC5mbi5idXR0b24uQ29uc3RydWN0b3I9ZyxpLmRlZmF1bHQuZm4uYnV0dG9uLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gaS5kZWZhdWx0LmZuLmJ1dHRvbj1wLGcuX2pRdWVyeUludGVyZmFjZX07dmFyIHY9ImNhcm91c2VsIixtPSIuYnMuY2Fyb3VzZWwiLHk9aS5kZWZhdWx0LmZuW3ZdLGI9e2ludGVydmFsOjVlMyxrZXlib2FyZDohMCxzbGlkZTohMSxwYXVzZToiaG92ZXIiLHdyYXA6ITAsdG91Y2g6ITB9LF89e2ludGVydmFsOiIobnVtYmVyfGJvb2xlYW4pIixrZXlib2FyZDoiYm9vbGVhbiIsc2xpZGU6Iihib29sZWFufHN0cmluZykiLHBhdXNlOiIoc3RyaW5nfGJvb2xlYW4pIix3cmFwOiJib29sZWFuIix0b3VjaDoiYm9vbGVhbiJ9LHc9e1RPVUNIOiJ0b3VjaCIsUEVOOiJwZW4ifSx4PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe3RoaXMuX2l0ZW1zPW51bGwsdGhpcy5faW50ZXJ2YWw9bnVsbCx0aGlzLl9hY3RpdmVFbGVtZW50PW51bGwsdGhpcy5faXNQYXVzZWQ9ITEsdGhpcy5faXNTbGlkaW5nPSExLHRoaXMudG91Y2hUaW1lb3V0PW51bGwsdGhpcy50b3VjaFN0YXJ0WD0wLHRoaXMudG91Y2hEZWx0YVg9MCx0aGlzLl9jb25maWc9dGhpcy5fZ2V0Q29uZmlnKHQpLHRoaXMuX2VsZW1lbnQ9ZSx0aGlzLl9pbmRpY2F0b3JzRWxlbWVudD10aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoIi5jYXJvdXNlbC1pbmRpY2F0b3JzIiksdGhpcy5fdG91Y2hTdXBwb3J0ZWQ9Im9udG91Y2hzdGFydCJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cz4wLHRoaXMuX3BvaW50ZXJFdmVudD1Cb29sZWFuKHdpbmRvdy5Qb2ludGVyRXZlbnR8fHdpbmRvdy5NU1BvaW50ZXJFdmVudCksdGhpcy5fYWRkRXZlbnRMaXN0ZW5lcnMoKX12YXIgdD1lLnByb3RvdHlwZTtyZXR1cm4gdC5uZXh0PWZ1bmN0aW9uKCl7dGhpcy5faXNTbGlkaW5nfHx0aGlzLl9zbGlkZSgibmV4dCIpfSx0Lm5leHRXaGVuVmlzaWJsZT1mdW5jdGlvbigpe3ZhciBlPWkuZGVmYXVsdCh0aGlzLl9lbGVtZW50KTshZG9jdW1lbnQuaGlkZGVuJiZlLmlzKCI6dmlzaWJsZSIpJiYiaGlkZGVuIiE9PWUuY3NzKCJ2aXNpYmlsaXR5IikmJnRoaXMubmV4dCgpfSx0LnByZXY9ZnVuY3Rpb24oKXt0aGlzLl9pc1NsaWRpbmd8fHRoaXMuX3NsaWRlKCJwcmV2Iil9LHQucGF1c2U9ZnVuY3Rpb24oZSl7ZXx8KHRoaXMuX2lzUGF1c2VkPSEwKSx0aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoIi5jYXJvdXNlbC1pdGVtLW5leHQsIC5jYXJvdXNlbC1pdGVtLXByZXYiKSYmKGYudHJpZ2dlclRyYW5zaXRpb25FbmQodGhpcy5fZWxlbWVudCksdGhpcy5jeWNsZSghMCkpLGNsZWFySW50ZXJ2YWwodGhpcy5faW50ZXJ2YWwpLHRoaXMuX2ludGVydmFsPW51bGx9LHQuY3ljbGU9ZnVuY3Rpb24oZSl7ZXx8KHRoaXMuX2lzUGF1c2VkPSExKSx0aGlzLl9pbnRlcnZhbCYmKGNsZWFySW50ZXJ2YWwodGhpcy5faW50ZXJ2YWwpLHRoaXMuX2ludGVydmFsPW51bGwpLHRoaXMuX2NvbmZpZy5pbnRlcnZhbCYmIXRoaXMuX2lzUGF1c2VkJiYodGhpcy5fdXBkYXRlSW50ZXJ2YWwoKSx0aGlzLl9pbnRlcnZhbD1zZXRJbnRlcnZhbCgoZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlP3RoaXMubmV4dFdoZW5WaXNpYmxlOnRoaXMubmV4dCkuYmluZCh0aGlzKSx0aGlzLl9jb25maWcuaW50ZXJ2YWwpKX0sdC50bz1mdW5jdGlvbihlKXt2YXIgdD10aGlzO3RoaXMuX2FjdGl2ZUVsZW1lbnQ9dGhpcy5fZWxlbWVudC5xdWVyeVNlbGVjdG9yKCIuYWN0aXZlLmNhcm91c2VsLWl0ZW0iKTt2YXIgbj10aGlzLl9nZXRJdGVtSW5kZXgodGhpcy5fYWN0aXZlRWxlbWVudCk7aWYoIShlPnRoaXMuX2l0ZW1zLmxlbmd0aC0xfHxlPDApKWlmKHRoaXMuX2lzU2xpZGluZylpLmRlZmF1bHQodGhpcy5fZWxlbWVudCkub25lKCJzbGlkLmJzLmNhcm91c2VsIiwoZnVuY3Rpb24oKXtyZXR1cm4gdC50byhlKX0pKTtlbHNle2lmKG49PT1lKXJldHVybiB0aGlzLnBhdXNlKCksdm9pZCB0aGlzLmN5Y2xlKCk7dmFyIHI9ZT5uPyJuZXh0IjoicHJldiI7dGhpcy5fc2xpZGUocix0aGlzLl9pdGVtc1tlXSl9fSx0LmRpc3Bvc2U9ZnVuY3Rpb24oKXtpLmRlZmF1bHQodGhpcy5fZWxlbWVudCkub2ZmKG0pLGkuZGVmYXVsdC5yZW1vdmVEYXRhKHRoaXMuX2VsZW1lbnQsImJzLmNhcm91c2VsIiksdGhpcy5faXRlbXM9bnVsbCx0aGlzLl9jb25maWc9bnVsbCx0aGlzLl9lbGVtZW50PW51bGwsdGhpcy5faW50ZXJ2YWw9bnVsbCx0aGlzLl9pc1BhdXNlZD1udWxsLHRoaXMuX2lzU2xpZGluZz1udWxsLHRoaXMuX2FjdGl2ZUVsZW1lbnQ9bnVsbCx0aGlzLl9pbmRpY2F0b3JzRWxlbWVudD1udWxsfSx0Ll9nZXRDb25maWc9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9dSh7fSxiLGUpLGYudHlwZUNoZWNrQ29uZmlnKHYsZSxfKSxlfSx0Ll9oYW5kbGVTd2lwZT1mdW5jdGlvbigpe3ZhciBlPU1hdGguYWJzKHRoaXMudG91Y2hEZWx0YVgpO2lmKCEoZTw9NDApKXt2YXIgdD1lL3RoaXMudG91Y2hEZWx0YVg7dGhpcy50b3VjaERlbHRhWD0wLHQ+MCYmdGhpcy5wcmV2KCksdDwwJiZ0aGlzLm5leHQoKX19LHQuX2FkZEV2ZW50TGlzdGVuZXJzPWZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLl9jb25maWcua2V5Ym9hcmQmJmkuZGVmYXVsdCh0aGlzLl9lbGVtZW50KS5vbigia2V5ZG93bi5icy5jYXJvdXNlbCIsKGZ1bmN0aW9uKHQpe3JldHVybiBlLl9rZXlkb3duKHQpfSkpLCJob3ZlciI9PT10aGlzLl9jb25maWcucGF1c2UmJmkuZGVmYXVsdCh0aGlzLl9lbGVtZW50KS5vbigibW91c2VlbnRlci5icy5jYXJvdXNlbCIsKGZ1bmN0aW9uKHQpe3JldHVybiBlLnBhdXNlKHQpfSkpLm9uKCJtb3VzZWxlYXZlLmJzLmNhcm91c2VsIiwoZnVuY3Rpb24odCl7cmV0dXJuIGUuY3ljbGUodCl9KSksdGhpcy5fY29uZmlnLnRvdWNoJiZ0aGlzLl9hZGRUb3VjaEV2ZW50TGlzdGVuZXJzKCl9LHQuX2FkZFRvdWNoRXZlbnRMaXN0ZW5lcnM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2lmKHRoaXMuX3RvdWNoU3VwcG9ydGVkKXt2YXIgdD1mdW5jdGlvbih0KXtlLl9wb2ludGVyRXZlbnQmJndbdC5vcmlnaW5hbEV2ZW50LnBvaW50ZXJUeXBlLnRvVXBwZXJDYXNlKCldP2UudG91Y2hTdGFydFg9dC5vcmlnaW5hbEV2ZW50LmNsaWVudFg6ZS5fcG9pbnRlckV2ZW50fHwoZS50b3VjaFN0YXJ0WD10Lm9yaWdpbmFsRXZlbnQudG91Y2hlc1swXS5jbGllbnRYKX0sbj1mdW5jdGlvbih0KXtlLl9wb2ludGVyRXZlbnQmJndbdC5vcmlnaW5hbEV2ZW50LnBvaW50ZXJUeXBlLnRvVXBwZXJDYXNlKCldJiYoZS50b3VjaERlbHRhWD10Lm9yaWdpbmFsRXZlbnQuY2xpZW50WC1lLnRvdWNoU3RhcnRYKSxlLl9oYW5kbGVTd2lwZSgpLCJob3ZlciI9PT1lLl9jb25maWcucGF1c2UmJihlLnBhdXNlKCksZS50b3VjaFRpbWVvdXQmJmNsZWFyVGltZW91dChlLnRvdWNoVGltZW91dCksZS50b3VjaFRpbWVvdXQ9c2V0VGltZW91dCgoZnVuY3Rpb24odCl7cmV0dXJuIGUuY3ljbGUodCl9KSw1MDArZS5fY29uZmlnLmludGVydmFsKSl9O2kuZGVmYXVsdCh0aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5jYXJvdXNlbC1pdGVtIGltZyIpKS5vbigiZHJhZ3N0YXJ0LmJzLmNhcm91c2VsIiwoZnVuY3Rpb24oZSl7cmV0dXJuIGUucHJldmVudERlZmF1bHQoKX0pKSx0aGlzLl9wb2ludGVyRXZlbnQ/KGkuZGVmYXVsdCh0aGlzLl9lbGVtZW50KS5vbigicG9pbnRlcmRvd24uYnMuY2Fyb3VzZWwiLChmdW5jdGlvbihlKXtyZXR1cm4gdChlKX0pKSxpLmRlZmF1bHQodGhpcy5fZWxlbWVudCkub24oInBvaW50ZXJ1cC5icy5jYXJvdXNlbCIsKGZ1bmN0aW9uKGUpe3JldHVybiBuKGUpfSkpLHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZCgicG9pbnRlci1ldmVudCIpKTooaS5kZWZhdWx0KHRoaXMuX2VsZW1lbnQpLm9uKCJ0b3VjaHN0YXJ0LmJzLmNhcm91c2VsIiwoZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSl9KSksaS5kZWZhdWx0KHRoaXMuX2VsZW1lbnQpLm9uKCJ0b3VjaG1vdmUuYnMuY2Fyb3VzZWwiLChmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24odCl7ZS50b3VjaERlbHRhWD10Lm9yaWdpbmFsRXZlbnQudG91Y2hlcyYmdC5vcmlnaW5hbEV2ZW50LnRvdWNoZXMubGVuZ3RoPjE/MDp0Lm9yaWdpbmFsRXZlbnQudG91Y2hlc1swXS5jbGllbnRYLWUudG91Y2hTdGFydFh9KHQpfSkpLGkuZGVmYXVsdCh0aGlzLl9lbGVtZW50KS5vbigidG91Y2hlbmQuYnMuY2Fyb3VzZWwiLChmdW5jdGlvbihlKXtyZXR1cm4gbihlKX0pKSl9fSx0Ll9rZXlkb3duPWZ1bmN0aW9uKGUpe2lmKCEvaW5wdXR8dGV4dGFyZWEvaS50ZXN0KGUudGFyZ2V0LnRhZ05hbWUpKXN3aXRjaChlLndoaWNoKXtjYXNlIDM3OmUucHJldmVudERlZmF1bHQoKSx0aGlzLnByZXYoKTticmVhaztjYXNlIDM5OmUucHJldmVudERlZmF1bHQoKSx0aGlzLm5leHQoKX19LHQuX2dldEl0ZW1JbmRleD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5faXRlbXM9ZSYmZS5wYXJlbnROb2RlP1tdLnNsaWNlLmNhbGwoZS5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoIi5jYXJvdXNlbC1pdGVtIikpOltdLHRoaXMuX2l0ZW1zLmluZGV4T2YoZSl9LHQuX2dldEl0ZW1CeURpcmVjdGlvbj1mdW5jdGlvbihlLHQpe3ZhciBuPSJuZXh0Ij09PWUscj0icHJldiI9PT1lLGk9dGhpcy5fZ2V0SXRlbUluZGV4KHQpLG89dGhpcy5faXRlbXMubGVuZ3RoLTE7aWYoKHImJjA9PT1pfHxuJiZpPT09bykmJiF0aGlzLl9jb25maWcud3JhcClyZXR1cm4gdDt2YXIgYT0oaSsoInByZXYiPT09ZT8tMToxKSkldGhpcy5faXRlbXMubGVuZ3RoO3JldHVybi0xPT09YT90aGlzLl9pdGVtc1t0aGlzLl9pdGVtcy5sZW5ndGgtMV06dGhpcy5faXRlbXNbYV19LHQuX3RyaWdnZXJTbGlkZUV2ZW50PWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5fZ2V0SXRlbUluZGV4KGUpLHI9dGhpcy5fZ2V0SXRlbUluZGV4KHRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvcigiLmFjdGl2ZS5jYXJvdXNlbC1pdGVtIikpLG89aS5kZWZhdWx0LkV2ZW50KCJzbGlkZS5icy5jYXJvdXNlbCIse3JlbGF0ZWRUYXJnZXQ6ZSxkaXJlY3Rpb246dCxmcm9tOnIsdG86bn0pO3JldHVybiBpLmRlZmF1bHQodGhpcy5fZWxlbWVudCkudHJpZ2dlcihvKSxvfSx0Ll9zZXRBY3RpdmVJbmRpY2F0b3JFbGVtZW50PWZ1bmN0aW9uKGUpe2lmKHRoaXMuX2luZGljYXRvcnNFbGVtZW50KXt2YXIgdD1bXS5zbGljZS5jYWxsKHRoaXMuX2luZGljYXRvcnNFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5hY3RpdmUiKSk7aS5kZWZhdWx0KHQpLnJlbW92ZUNsYXNzKCJhY3RpdmUiKTt2YXIgbj10aGlzLl9pbmRpY2F0b3JzRWxlbWVudC5jaGlsZHJlblt0aGlzLl9nZXRJdGVtSW5kZXgoZSldO24mJmkuZGVmYXVsdChuKS5hZGRDbGFzcygiYWN0aXZlIil9fSx0Ll91cGRhdGVJbnRlcnZhbD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuX2FjdGl2ZUVsZW1lbnR8fHRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvcigiLmFjdGl2ZS5jYXJvdXNlbC1pdGVtIik7aWYoZSl7dmFyIHQ9cGFyc2VJbnQoZS5nZXRBdHRyaWJ1dGUoImRhdGEtaW50ZXJ2YWwiKSwxMCk7dD8odGhpcy5fY29uZmlnLmRlZmF1bHRJbnRlcnZhbD10aGlzLl9jb25maWcuZGVmYXVsdEludGVydmFsfHx0aGlzLl9jb25maWcuaW50ZXJ2YWwsdGhpcy5fY29uZmlnLmludGVydmFsPXQpOnRoaXMuX2NvbmZpZy5pbnRlcnZhbD10aGlzLl9jb25maWcuZGVmYXVsdEludGVydmFsfHx0aGlzLl9jb25maWcuaW50ZXJ2YWx9fSx0Ll9zbGlkZT1mdW5jdGlvbihlLHQpe3ZhciBuLHIsbyxhPXRoaXMscz10aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoIi5hY3RpdmUuY2Fyb3VzZWwtaXRlbSIpLHU9dGhpcy5fZ2V0SXRlbUluZGV4KHMpLGw9dHx8cyYmdGhpcy5fZ2V0SXRlbUJ5RGlyZWN0aW9uKGUscyksYz10aGlzLl9nZXRJdGVtSW5kZXgobCksZD1Cb29sZWFuKHRoaXMuX2ludGVydmFsKTtpZigibmV4dCI9PT1lPyhuPSJjYXJvdXNlbC1pdGVtLWxlZnQiLHI9ImNhcm91c2VsLWl0ZW0tbmV4dCIsbz0ibGVmdCIpOihuPSJjYXJvdXNlbC1pdGVtLXJpZ2h0IixyPSJjYXJvdXNlbC1pdGVtLXByZXYiLG89InJpZ2h0IiksbCYmaS5kZWZhdWx0KGwpLmhhc0NsYXNzKCJhY3RpdmUiKSl0aGlzLl9pc1NsaWRpbmc9ITE7ZWxzZSBpZighdGhpcy5fdHJpZ2dlclNsaWRlRXZlbnQobCxvKS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmcyYmbCl7dGhpcy5faXNTbGlkaW5nPSEwLGQmJnRoaXMucGF1c2UoKSx0aGlzLl9zZXRBY3RpdmVJbmRpY2F0b3JFbGVtZW50KGwpLHRoaXMuX2FjdGl2ZUVsZW1lbnQ9bDt2YXIgaD1pLmRlZmF1bHQuRXZlbnQoInNsaWQuYnMuY2Fyb3VzZWwiLHtyZWxhdGVkVGFyZ2V0OmwsZGlyZWN0aW9uOm8sZnJvbTp1LHRvOmN9KTtpZihpLmRlZmF1bHQodGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoInNsaWRlIikpe2kuZGVmYXVsdChsKS5hZGRDbGFzcyhyKSxmLnJlZmxvdyhsKSxpLmRlZmF1bHQocykuYWRkQ2xhc3MobiksaS5kZWZhdWx0KGwpLmFkZENsYXNzKG4pO3ZhciBwPWYuZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQocyk7aS5kZWZhdWx0KHMpLm9uZShmLlRSQU5TSVRJT05fRU5ELChmdW5jdGlvbigpe2kuZGVmYXVsdChsKS5yZW1vdmVDbGFzcyhuKyIgIityKS5hZGRDbGFzcygiYWN0aXZlIiksaS5kZWZhdWx0KHMpLnJlbW92ZUNsYXNzKCJhY3RpdmUgIityKyIgIituKSxhLl9pc1NsaWRpbmc9ITEsc2V0VGltZW91dCgoZnVuY3Rpb24oKXtyZXR1cm4gaS5kZWZhdWx0KGEuX2VsZW1lbnQpLnRyaWdnZXIoaCl9KSwwKX0pKS5lbXVsYXRlVHJhbnNpdGlvbkVuZChwKX1lbHNlIGkuZGVmYXVsdChzKS5yZW1vdmVDbGFzcygiYWN0aXZlIiksaS5kZWZhdWx0KGwpLmFkZENsYXNzKCJhY3RpdmUiKSx0aGlzLl9pc1NsaWRpbmc9ITEsaS5kZWZhdWx0KHRoaXMuX2VsZW1lbnQpLnRyaWdnZXIoaCk7ZCYmdGhpcy5jeWNsZSgpfX0sZS5falF1ZXJ5SW50ZXJmYWNlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7dmFyIG49aS5kZWZhdWx0KHRoaXMpLmRhdGEoImJzLmNhcm91c2VsIikscj11KHt9LGIsaS5kZWZhdWx0KHRoaXMpLmRhdGEoKSk7Im9iamVjdCI9PXR5cGVvZiB0JiYocj11KHt9LHIsdCkpO3ZhciBvPSJzdHJpbmciPT10eXBlb2YgdD90OnIuc2xpZGU7aWYobnx8KG49bmV3IGUodGhpcyxyKSxpLmRlZmF1bHQodGhpcykuZGF0YSgiYnMuY2Fyb3VzZWwiLG4pKSwibnVtYmVyIj09dHlwZW9mIHQpbi50byh0KTtlbHNlIGlmKCJzdHJpbmciPT10eXBlb2Ygbyl7aWYodm9pZCAwPT09bltvXSl0aHJvdyBuZXcgVHlwZUVycm9yKCdObyBtZXRob2QgbmFtZWQgIicrbysnIicpO25bb10oKX1lbHNlIHIuaW50ZXJ2YWwmJnIucmlkZSYmKG4ucGF1c2UoKSxuLmN5Y2xlKCkpfSkpfSxlLl9kYXRhQXBpQ2xpY2tIYW5kbGVyPWZ1bmN0aW9uKHQpe3ZhciBuPWYuZ2V0U2VsZWN0b3JGcm9tRWxlbWVudCh0aGlzKTtpZihuKXt2YXIgcj1pLmRlZmF1bHQobilbMF07aWYociYmaS5kZWZhdWx0KHIpLmhhc0NsYXNzKCJjYXJvdXNlbCIpKXt2YXIgbz11KHt9LGkuZGVmYXVsdChyKS5kYXRhKCksaS5kZWZhdWx0KHRoaXMpLmRhdGEoKSksYT10aGlzLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZS10byIpO2EmJihvLmludGVydmFsPSExKSxlLl9qUXVlcnlJbnRlcmZhY2UuY2FsbChpLmRlZmF1bHQociksbyksYSYmaS5kZWZhdWx0KHIpLmRhdGEoImJzLmNhcm91c2VsIikudG8oYSksdC5wcmV2ZW50RGVmYXVsdCgpfX19LHMoZSxudWxsLFt7a2V5OiJWRVJTSU9OIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iNC42LjIifX0se2tleToiRGVmYXVsdCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGJ9fV0pLGV9KCk7aS5kZWZhdWx0KGRvY3VtZW50KS5vbigiY2xpY2suYnMuY2Fyb3VzZWwuZGF0YS1hcGkiLCJbZGF0YS1zbGlkZV0sIFtkYXRhLXNsaWRlLXRvXSIseC5fZGF0YUFwaUNsaWNrSGFuZGxlciksaS5kZWZhdWx0KHdpbmRvdykub24oImxvYWQuYnMuY2Fyb3VzZWwuZGF0YS1hcGkiLChmdW5jdGlvbigpe2Zvcih2YXIgZT1bXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXJpZGU9ImNhcm91c2VsIl0nKSksdD0wLG49ZS5sZW5ndGg7dDxuO3QrKyl7dmFyIHI9aS5kZWZhdWx0KGVbdF0pO3guX2pRdWVyeUludGVyZmFjZS5jYWxsKHIsci5kYXRhKCkpfX0pKSxpLmRlZmF1bHQuZm5bdl09eC5falF1ZXJ5SW50ZXJmYWNlLGkuZGVmYXVsdC5mblt2XS5Db25zdHJ1Y3Rvcj14LGkuZGVmYXVsdC5mblt2XS5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIGkuZGVmYXVsdC5mblt2XT15LHguX2pRdWVyeUludGVyZmFjZX07dmFyIFQ9ImNvbGxhcHNlIixFPWkuZGVmYXVsdC5mbltUXSxDPXt0b2dnbGU6ITAscGFyZW50OiIifSxTPXt0b2dnbGU6ImJvb2xlYW4iLHBhcmVudDoiKHN0cmluZ3xlbGVtZW50KSJ9LGs9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7dGhpcy5faXNUcmFuc2l0aW9uaW5nPSExLHRoaXMuX2VsZW1lbnQ9ZSx0aGlzLl9jb25maWc9dGhpcy5fZ2V0Q29uZmlnKHQpLHRoaXMuX3RyaWdnZXJBcnJheT1bXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXRvZ2dsZT0iY29sbGFwc2UiXVtocmVmPSIjJytlLmlkKyciXSxbZGF0YS10b2dnbGU9ImNvbGxhcHNlIl1bZGF0YS10YXJnZXQ9IiMnK2UuaWQrJyJdJykpO2Zvcih2YXIgbj1bXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXRvZ2dsZT0iY29sbGFwc2UiXScpKSxyPTAsaT1uLmxlbmd0aDtyPGk7cisrKXt2YXIgbz1uW3JdLGE9Zi5nZXRTZWxlY3RvckZyb21FbGVtZW50KG8pLHM9W10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGEpKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0PT09ZX0pKTtudWxsIT09YSYmcy5sZW5ndGg+MCYmKHRoaXMuX3NlbGVjdG9yPWEsdGhpcy5fdHJpZ2dlckFycmF5LnB1c2gobykpfXRoaXMuX3BhcmVudD10aGlzLl9jb25maWcucGFyZW50P3RoaXMuX2dldFBhcmVudCgpOm51bGwsdGhpcy5fY29uZmlnLnBhcmVudHx8dGhpcy5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKHRoaXMuX2VsZW1lbnQsdGhpcy5fdHJpZ2dlckFycmF5KSx0aGlzLl9jb25maWcudG9nZ2xlJiZ0aGlzLnRvZ2dsZSgpfXZhciB0PWUucHJvdG90eXBlO3JldHVybiB0LnRvZ2dsZT1mdW5jdGlvbigpe2kuZGVmYXVsdCh0aGlzLl9lbGVtZW50KS5oYXNDbGFzcygic2hvdyIpP3RoaXMuaGlkZSgpOnRoaXMuc2hvdygpfSx0LnNob3c9ZnVuY3Rpb24oKXt2YXIgdCxuLHI9dGhpcztpZighKHRoaXMuX2lzVHJhbnNpdGlvbmluZ3x8aS5kZWZhdWx0KHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKCJzaG93Iil8fCh0aGlzLl9wYXJlbnQmJjA9PT0odD1bXS5zbGljZS5jYWxsKHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yQWxsKCIuc2hvdywgLmNvbGxhcHNpbmciKSkuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHIuX2NvbmZpZy5wYXJlbnQ/ZS5nZXRBdHRyaWJ1dGUoImRhdGEtcGFyZW50Iik9PT1yLl9jb25maWcucGFyZW50OmUuY2xhc3NMaXN0LmNvbnRhaW5zKCJjb2xsYXBzZSIpfSkpKS5sZW5ndGgmJih0PW51bGwpLHQmJihuPWkuZGVmYXVsdCh0KS5ub3QodGhpcy5fc2VsZWN0b3IpLmRhdGEoImJzLmNvbGxhcHNlIikpJiZuLl9pc1RyYW5zaXRpb25pbmcpKSl7dmFyIG89aS5kZWZhdWx0LkV2ZW50KCJzaG93LmJzLmNvbGxhcHNlIik7aWYoaS5kZWZhdWx0KHRoaXMuX2VsZW1lbnQpLnRyaWdnZXIobyksIW8uaXNEZWZhdWx0UHJldmVudGVkKCkpe3QmJihlLl9qUXVlcnlJbnRlcmZhY2UuY2FsbChpLmRlZmF1bHQodCkubm90KHRoaXMuX3NlbGVjdG9yKSwiaGlkZSIpLG58fGkuZGVmYXVsdCh0KS5kYXRhKCJicy5jb2xsYXBzZSIsbnVsbCkpO3ZhciBhPXRoaXMuX2dldERpbWVuc2lvbigpO2kuZGVmYXVsdCh0aGlzLl9lbGVtZW50KS5yZW1vdmVDbGFzcygiY29sbGFwc2UiKS5hZGRDbGFzcygiY29sbGFwc2luZyIpLHRoaXMuX2VsZW1lbnQuc3R5bGVbYV09MCx0aGlzLl90cmlnZ2VyQXJyYXkubGVuZ3RoJiZpLmRlZmF1bHQodGhpcy5fdHJpZ2dlckFycmF5KS5yZW1vdmVDbGFzcygiY29sbGFwc2VkIikuYXR0cigiYXJpYS1leHBhbmRlZCIsITApLHRoaXMuc2V0VHJhbnNpdGlvbmluZyghMCk7dmFyIHM9InNjcm9sbCIrKGFbMF0udG9VcHBlckNhc2UoKSthLnNsaWNlKDEpKSx1PWYuZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQodGhpcy5fZWxlbWVudCk7aS5kZWZhdWx0KHRoaXMuX2VsZW1lbnQpLm9uZShmLlRSQU5TSVRJT05fRU5ELChmdW5jdGlvbigpe2kuZGVmYXVsdChyLl9lbGVtZW50KS5yZW1vdmVDbGFzcygiY29sbGFwc2luZyIpLmFkZENsYXNzKCJjb2xsYXBzZSBzaG93Iiksci5fZWxlbWVudC5zdHlsZVthXT0iIixyLnNldFRyYW5zaXRpb25pbmcoITEpLGkuZGVmYXVsdChyLl9lbGVtZW50KS50cmlnZ2VyKCJzaG93bi5icy5jb2xsYXBzZSIpfSkpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKHUpLHRoaXMuX2VsZW1lbnQuc3R5bGVbYV09dGhpcy5fZWxlbWVudFtzXSsicHgifX19LHQuaGlkZT1mdW5jdGlvbigpe3ZhciBlPXRoaXM7aWYoIXRoaXMuX2lzVHJhbnNpdGlvbmluZyYmaS5kZWZhdWx0KHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKCJzaG93Iikpe3ZhciB0PWkuZGVmYXVsdC5FdmVudCgiaGlkZS5icy5jb2xsYXBzZSIpO2lmKGkuZGVmYXVsdCh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKHQpLCF0LmlzRGVmYXVsdFByZXZlbnRlZCgpKXt2YXIgbj10aGlzLl9nZXREaW1lbnNpb24oKTt0aGlzLl9lbGVtZW50LnN0eWxlW25dPXRoaXMuX2VsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClbbl0rInB4IixmLnJlZmxvdyh0aGlzLl9lbGVtZW50KSxpLmRlZmF1bHQodGhpcy5fZWxlbWVudCkuYWRkQ2xhc3MoImNvbGxhcHNpbmciKS5yZW1vdmVDbGFzcygiY29sbGFwc2Ugc2hvdyIpO3ZhciByPXRoaXMuX3RyaWdnZXJBcnJheS5sZW5ndGg7aWYocj4wKWZvcih2YXIgbz0wO288cjtvKyspe3ZhciBhPXRoaXMuX3RyaWdnZXJBcnJheVtvXSxzPWYuZ2V0U2VsZWN0b3JGcm9tRWxlbWVudChhKTtudWxsIT09cyYmKGkuZGVmYXVsdChbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocykpKS5oYXNDbGFzcygic2hvdyIpfHxpLmRlZmF1bHQoYSkuYWRkQ2xhc3MoImNvbGxhcHNlZCIpLmF0dHIoImFyaWEtZXhwYW5kZWQiLCExKSl9dGhpcy5zZXRUcmFuc2l0aW9uaW5nKCEwKSx0aGlzLl9lbGVtZW50LnN0eWxlW25dPSIiO3ZhciB1PWYuZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQodGhpcy5fZWxlbWVudCk7aS5kZWZhdWx0KHRoaXMuX2VsZW1lbnQpLm9uZShmLlRSQU5TSVRJT05fRU5ELChmdW5jdGlvbigpe2Uuc2V0VHJhbnNpdGlvbmluZyghMSksaS5kZWZhdWx0KGUuX2VsZW1lbnQpLnJlbW92ZUNsYXNzKCJjb2xsYXBzaW5nIikuYWRkQ2xhc3MoImNvbGxhcHNlIikudHJpZ2dlcigiaGlkZGVuLmJzLmNvbGxhcHNlIil9KSkuZW11bGF0ZVRyYW5zaXRpb25FbmQodSl9fX0sdC5zZXRUcmFuc2l0aW9uaW5nPWZ1bmN0aW9uKGUpe3RoaXMuX2lzVHJhbnNpdGlvbmluZz1lfSx0LmRpc3Bvc2U9ZnVuY3Rpb24oKXtpLmRlZmF1bHQucmVtb3ZlRGF0YSh0aGlzLl9lbGVtZW50LCJicy5jb2xsYXBzZSIpLHRoaXMuX2NvbmZpZz1udWxsLHRoaXMuX3BhcmVudD1udWxsLHRoaXMuX2VsZW1lbnQ9bnVsbCx0aGlzLl90cmlnZ2VyQXJyYXk9bnVsbCx0aGlzLl9pc1RyYW5zaXRpb25pbmc9bnVsbH0sdC5fZ2V0Q29uZmlnPWZ1bmN0aW9uKGUpe3JldHVybihlPXUoe30sQyxlKSkudG9nZ2xlPUJvb2xlYW4oZS50b2dnbGUpLGYudHlwZUNoZWNrQ29uZmlnKFQsZSxTKSxlfSx0Ll9nZXREaW1lbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gaS5kZWZhdWx0KHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKCJ3aWR0aCIpPyJ3aWR0aCI6ImhlaWdodCJ9LHQuX2dldFBhcmVudD1mdW5jdGlvbigpe3ZhciB0LG49dGhpcztmLmlzRWxlbWVudCh0aGlzLl9jb25maWcucGFyZW50KT8odD10aGlzLl9jb25maWcucGFyZW50LHZvaWQgMCE9PXRoaXMuX2NvbmZpZy5wYXJlbnQuanF1ZXJ5JiYodD10aGlzLl9jb25maWcucGFyZW50WzBdKSk6dD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuX2NvbmZpZy5wYXJlbnQpO3ZhciByPSdbZGF0YS10b2dnbGU9ImNvbGxhcHNlIl1bZGF0YS1wYXJlbnQ9IicrdGhpcy5fY29uZmlnLnBhcmVudCsnIl0nLG89W10uc2xpY2UuY2FsbCh0LnF1ZXJ5U2VsZWN0b3JBbGwocikpO3JldHVybiBpLmRlZmF1bHQobykuZWFjaCgoZnVuY3Rpb24odCxyKXtuLl9hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3MoZS5fZ2V0VGFyZ2V0RnJvbUVsZW1lbnQociksW3JdKX0pKSx0fSx0Ll9hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3M9ZnVuY3Rpb24oZSx0KXt2YXIgbj1pLmRlZmF1bHQoZSkuaGFzQ2xhc3MoInNob3ciKTt0Lmxlbmd0aCYmaS5kZWZhdWx0KHQpLnRvZ2dsZUNsYXNzKCJjb2xsYXBzZWQiLCFuKS5hdHRyKCJhcmlhLWV4cGFuZGVkIixuKX0sZS5fZ2V0VGFyZ2V0RnJvbUVsZW1lbnQ9ZnVuY3Rpb24oZSl7dmFyIHQ9Zi5nZXRTZWxlY3RvckZyb21FbGVtZW50KGUpO3JldHVybiB0P2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodCk6bnVsbH0sZS5falF1ZXJ5SW50ZXJmYWNlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7dmFyIG49aS5kZWZhdWx0KHRoaXMpLHI9bi5kYXRhKCJicy5jb2xsYXBzZSIpLG89dSh7fSxDLG4uZGF0YSgpLCJvYmplY3QiPT10eXBlb2YgdCYmdD90Ont9KTtpZighciYmby50b2dnbGUmJiJzdHJpbmciPT10eXBlb2YgdCYmL3Nob3d8aGlkZS8udGVzdCh0KSYmKG8udG9nZ2xlPSExKSxyfHwocj1uZXcgZSh0aGlzLG8pLG4uZGF0YSgiYnMuY29sbGFwc2UiLHIpKSwic3RyaW5nIj09dHlwZW9mIHQpe2lmKHZvaWQgMD09PXJbdF0pdGhyb3cgbmV3IFR5cGVFcnJvcignTm8gbWV0aG9kIG5hbWVkICInK3QrJyInKTtyW3RdKCl9fSkpfSxzKGUsbnVsbCxbe2tleToiVkVSU0lPTiIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIjQuNi4yIn19LHtrZXk6IkRlZmF1bHQiLGdldDpmdW5jdGlvbigpe3JldHVybiBDfX1dKSxlfSgpO2kuZGVmYXVsdChkb2N1bWVudCkub24oImNsaWNrLmJzLmNvbGxhcHNlLmRhdGEtYXBpIiwnW2RhdGEtdG9nZ2xlPSJjb2xsYXBzZSJdJywoZnVuY3Rpb24oZSl7IkEiPT09ZS5jdXJyZW50VGFyZ2V0LnRhZ05hbWUmJmUucHJldmVudERlZmF1bHQoKTt2YXIgdD1pLmRlZmF1bHQodGhpcyksbj1mLmdldFNlbGVjdG9yRnJvbUVsZW1lbnQodGhpcykscj1bXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwobikpO2kuZGVmYXVsdChyKS5lYWNoKChmdW5jdGlvbigpe3ZhciBlPWkuZGVmYXVsdCh0aGlzKSxuPWUuZGF0YSgiYnMuY29sbGFwc2UiKT8idG9nZ2xlIjp0LmRhdGEoKTtrLl9qUXVlcnlJbnRlcmZhY2UuY2FsbChlLG4pfSkpfSkpLGkuZGVmYXVsdC5mbltUXT1rLl9qUXVlcnlJbnRlcmZhY2UsaS5kZWZhdWx0LmZuW1RdLkNvbnN0cnVjdG9yPWssaS5kZWZhdWx0LmZuW1RdLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gaS5kZWZhdWx0LmZuW1RdPUUsay5falF1ZXJ5SW50ZXJmYWNlfTt2YXIgQT0iZHJvcGRvd24iLE49aS5kZWZhdWx0LmZuW0FdLEQ9bmV3IFJlZ0V4cCgiMzh8NDB8MjciKSxqPXtvZmZzZXQ6MCxmbGlwOiEwLGJvdW5kYXJ5OiJzY3JvbGxQYXJlbnQiLHJlZmVyZW5jZToidG9nZ2xlIixkaXNwbGF5OiJkeW5hbWljIixwb3BwZXJDb25maWc6bnVsbH0sTz17b2Zmc2V0OiIobnVtYmVyfHN0cmluZ3xmdW5jdGlvbikiLGZsaXA6ImJvb2xlYW4iLGJvdW5kYXJ5OiIoc3RyaW5nfGVsZW1lbnQpIixyZWZlcmVuY2U6IihzdHJpbmd8ZWxlbWVudCkiLGRpc3BsYXk6InN0cmluZyIscG9wcGVyQ29uZmlnOiIobnVsbHxvYmplY3QpIn0sTD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXt0aGlzLl9lbGVtZW50PWUsdGhpcy5fcG9wcGVyPW51bGwsdGhpcy5fY29uZmlnPXRoaXMuX2dldENvbmZpZyh0KSx0aGlzLl9tZW51PXRoaXMuX2dldE1lbnVFbGVtZW50KCksdGhpcy5faW5OYXZiYXI9dGhpcy5fZGV0ZWN0TmF2YmFyKCksdGhpcy5fYWRkRXZlbnRMaXN0ZW5lcnMoKX12YXIgdD1lLnByb3RvdHlwZTtyZXR1cm4gdC50b2dnbGU9ZnVuY3Rpb24oKXtpZighdGhpcy5fZWxlbWVudC5kaXNhYmxlZCYmIWkuZGVmYXVsdCh0aGlzLl9lbGVtZW50KS5oYXNDbGFzcygiZGlzYWJsZWQiKSl7dmFyIHQ9aS5kZWZhdWx0KHRoaXMuX21lbnUpLmhhc0NsYXNzKCJzaG93Iik7ZS5fY2xlYXJNZW51cygpLHR8fHRoaXMuc2hvdyghMCl9fSx0LnNob3c9ZnVuY3Rpb24odCl7aWYodm9pZCAwPT09dCYmKHQ9ITEpLCEodGhpcy5fZWxlbWVudC5kaXNhYmxlZHx8aS5kZWZhdWx0KHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKCJkaXNhYmxlZCIpfHxpLmRlZmF1bHQodGhpcy5fbWVudSkuaGFzQ2xhc3MoInNob3ciKSkpe3ZhciBuPXtyZWxhdGVkVGFyZ2V0OnRoaXMuX2VsZW1lbnR9LHI9aS5kZWZhdWx0LkV2ZW50KCJzaG93LmJzLmRyb3Bkb3duIixuKSxhPWUuX2dldFBhcmVudEZyb21FbGVtZW50KHRoaXMuX2VsZW1lbnQpO2lmKGkuZGVmYXVsdChhKS50cmlnZ2VyKHIpLCFyLmlzRGVmYXVsdFByZXZlbnRlZCgpKXtpZighdGhpcy5faW5OYXZiYXImJnQpe2lmKHZvaWQgMD09PW8uZGVmYXVsdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJCb290c3RyYXAncyBkcm9wZG93bnMgcmVxdWlyZSBQb3BwZXIgKGh0dHBzOi8vcG9wcGVyLmpzLm9yZykiKTt2YXIgcz10aGlzLl9lbGVtZW50OyJwYXJlbnQiPT09dGhpcy5fY29uZmlnLnJlZmVyZW5jZT9zPWE6Zi5pc0VsZW1lbnQodGhpcy5fY29uZmlnLnJlZmVyZW5jZSkmJihzPXRoaXMuX2NvbmZpZy5yZWZlcmVuY2Usdm9pZCAwIT09dGhpcy5fY29uZmlnLnJlZmVyZW5jZS5qcXVlcnkmJihzPXRoaXMuX2NvbmZpZy5yZWZlcmVuY2VbMF0pKSwic2Nyb2xsUGFyZW50IiE9PXRoaXMuX2NvbmZpZy5ib3VuZGFyeSYmaS5kZWZhdWx0KGEpLmFkZENsYXNzKCJwb3NpdGlvbi1zdGF0aWMiKSx0aGlzLl9wb3BwZXI9bmV3IG8uZGVmYXVsdChzLHRoaXMuX21lbnUsdGhpcy5fZ2V0UG9wcGVyQ29uZmlnKCkpfSJvbnRvdWNoc3RhcnQiaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50JiYwPT09aS5kZWZhdWx0KGEpLmNsb3Nlc3QoIi5uYXZiYXItbmF2IikubGVuZ3RoJiZpLmRlZmF1bHQoZG9jdW1lbnQuYm9keSkuY2hpbGRyZW4oKS5vbigibW91c2VvdmVyIixudWxsLGkuZGVmYXVsdC5ub29wKSx0aGlzLl9lbGVtZW50LmZvY3VzKCksdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoImFyaWEtZXhwYW5kZWQiLCEwKSxpLmRlZmF1bHQodGhpcy5fbWVudSkudG9nZ2xlQ2xhc3MoInNob3ciKSxpLmRlZmF1bHQoYSkudG9nZ2xlQ2xhc3MoInNob3ciKS50cmlnZ2VyKGkuZGVmYXVsdC5FdmVudCgic2hvd24uYnMuZHJvcGRvd24iLG4pKX19fSx0LmhpZGU9ZnVuY3Rpb24oKXtpZighdGhpcy5fZWxlbWVudC5kaXNhYmxlZCYmIWkuZGVmYXVsdCh0aGlzLl9lbGVtZW50KS5oYXNDbGFzcygiZGlzYWJsZWQiKSYmaS5kZWZhdWx0KHRoaXMuX21lbnUpLmhhc0NsYXNzKCJzaG93Iikpe3ZhciB0PXtyZWxhdGVkVGFyZ2V0OnRoaXMuX2VsZW1lbnR9LG49aS5kZWZhdWx0LkV2ZW50KCJoaWRlLmJzLmRyb3Bkb3duIix0KSxyPWUuX2dldFBhcmVudEZyb21FbGVtZW50KHRoaXMuX2VsZW1lbnQpO2kuZGVmYXVsdChyKS50cmlnZ2VyKG4pLG4uaXNEZWZhdWx0UHJldmVudGVkKCl8fCh0aGlzLl9wb3BwZXImJnRoaXMuX3BvcHBlci5kZXN0cm95KCksaS5kZWZhdWx0KHRoaXMuX21lbnUpLnRvZ2dsZUNsYXNzKCJzaG93IiksaS5kZWZhdWx0KHIpLnRvZ2dsZUNsYXNzKCJzaG93IikudHJpZ2dlcihpLmRlZmF1bHQuRXZlbnQoImhpZGRlbi5icy5kcm9wZG93biIsdCkpKX19LHQuZGlzcG9zZT1mdW5jdGlvbigpe2kuZGVmYXVsdC5yZW1vdmVEYXRhKHRoaXMuX2VsZW1lbnQsImJzLmRyb3Bkb3duIiksaS5kZWZhdWx0KHRoaXMuX2VsZW1lbnQpLm9mZigiLmJzLmRyb3Bkb3duIiksdGhpcy5fZWxlbWVudD1udWxsLHRoaXMuX21lbnU9bnVsbCxudWxsIT09dGhpcy5fcG9wcGVyJiYodGhpcy5fcG9wcGVyLmRlc3Ryb3koKSx0aGlzLl9wb3BwZXI9bnVsbCl9LHQudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5faW5OYXZiYXI9dGhpcy5fZGV0ZWN0TmF2YmFyKCksbnVsbCE9PXRoaXMuX3BvcHBlciYmdGhpcy5fcG9wcGVyLnNjaGVkdWxlVXBkYXRlKCl9LHQuX2FkZEV2ZW50TGlzdGVuZXJzPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztpLmRlZmF1bHQodGhpcy5fZWxlbWVudCkub24oImNsaWNrLmJzLmRyb3Bkb3duIiwoZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCksZS50b2dnbGUoKX0pKX0sdC5fZ2V0Q29uZmlnPWZ1bmN0aW9uKGUpe3JldHVybiBlPXUoe30sdGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0LGkuZGVmYXVsdCh0aGlzLl9lbGVtZW50KS5kYXRhKCksZSksZi50eXBlQ2hlY2tDb25maWcoQSxlLHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFR5cGUpLGV9LHQuX2dldE1lbnVFbGVtZW50PWZ1bmN0aW9uKCl7aWYoIXRoaXMuX21lbnUpe3ZhciB0PWUuX2dldFBhcmVudEZyb21FbGVtZW50KHRoaXMuX2VsZW1lbnQpO3QmJih0aGlzLl9tZW51PXQucXVlcnlTZWxlY3RvcigiLmRyb3Bkb3duLW1lbnUiKSl9cmV0dXJuIHRoaXMuX21lbnV9LHQuX2dldFBsYWNlbWVudD1mdW5jdGlvbigpe3ZhciBlPWkuZGVmYXVsdCh0aGlzLl9lbGVtZW50LnBhcmVudE5vZGUpLHQ9ImJvdHRvbS1zdGFydCI7cmV0dXJuIGUuaGFzQ2xhc3MoImRyb3B1cCIpP3Q9aS5kZWZhdWx0KHRoaXMuX21lbnUpLmhhc0NsYXNzKCJkcm9wZG93bi1tZW51LXJpZ2h0Iik/InRvcC1lbmQiOiJ0b3Atc3RhcnQiOmUuaGFzQ2xhc3MoImRyb3ByaWdodCIpP3Q9InJpZ2h0LXN0YXJ0IjplLmhhc0NsYXNzKCJkcm9wbGVmdCIpP3Q9ImxlZnQtc3RhcnQiOmkuZGVmYXVsdCh0aGlzLl9tZW51KS5oYXNDbGFzcygiZHJvcGRvd24tbWVudS1yaWdodCIpJiYodD0iYm90dG9tLWVuZCIpLHR9LHQuX2RldGVjdE5hdmJhcj1mdW5jdGlvbigpe3JldHVybiBpLmRlZmF1bHQodGhpcy5fZWxlbWVudCkuY2xvc2VzdCgiLm5hdmJhciIpLmxlbmd0aD4wfSx0Ll9nZXRPZmZzZXQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9e307cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuX2NvbmZpZy5vZmZzZXQ/dC5mbj1mdW5jdGlvbih0KXtyZXR1cm4gdC5vZmZzZXRzPXUoe30sdC5vZmZzZXRzLGUuX2NvbmZpZy5vZmZzZXQodC5vZmZzZXRzLGUuX2VsZW1lbnQpKSx0fTp0Lm9mZnNldD10aGlzLl9jb25maWcub2Zmc2V0LHR9LHQuX2dldFBvcHBlckNvbmZpZz1mdW5jdGlvbigpe3ZhciBlPXtwbGFjZW1lbnQ6dGhpcy5fZ2V0UGxhY2VtZW50KCksbW9kaWZpZXJzOntvZmZzZXQ6dGhpcy5fZ2V0T2Zmc2V0KCksZmxpcDp7ZW5hYmxlZDp0aGlzLl9jb25maWcuZmxpcH0scHJldmVudE92ZXJmbG93Ontib3VuZGFyaWVzRWxlbWVudDp0aGlzLl9jb25maWcuYm91bmRhcnl9fX07cmV0dXJuInN0YXRpYyI9PT10aGlzLl9jb25maWcuZGlzcGxheSYmKGUubW9kaWZpZXJzLmFwcGx5U3R5bGU9e2VuYWJsZWQ6ITF9KSx1KHt9LGUsdGhpcy5fY29uZmlnLnBvcHBlckNvbmZpZyl9LGUuX2pRdWVyeUludGVyZmFjZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoKChmdW5jdGlvbigpe3ZhciBuPWkuZGVmYXVsdCh0aGlzKS5kYXRhKCJicy5kcm9wZG93biIpO2lmKG58fChuPW5ldyBlKHRoaXMsIm9iamVjdCI9PXR5cGVvZiB0P3Q6bnVsbCksaS5kZWZhdWx0KHRoaXMpLmRhdGEoImJzLmRyb3Bkb3duIixuKSksInN0cmluZyI9PXR5cGVvZiB0KXtpZih2b2lkIDA9PT1uW3RdKXRocm93IG5ldyBUeXBlRXJyb3IoJ05vIG1ldGhvZCBuYW1lZCAiJyt0KyciJyk7blt0XSgpfX0pKX0sZS5fY2xlYXJNZW51cz1mdW5jdGlvbih0KXtpZighdHx8MyE9PXQud2hpY2gmJigia2V5dXAiIT09dC50eXBlfHw5PT09dC53aGljaCkpZm9yKHZhciBuPVtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtdG9nZ2xlPSJkcm9wZG93biJdJykpLHI9MCxvPW4ubGVuZ3RoO3I8bztyKyspe3ZhciBhPWUuX2dldFBhcmVudEZyb21FbGVtZW50KG5bcl0pLHM9aS5kZWZhdWx0KG5bcl0pLmRhdGEoImJzLmRyb3Bkb3duIiksdT17cmVsYXRlZFRhcmdldDpuW3JdfTtpZih0JiYiY2xpY2siPT09dC50eXBlJiYodS5jbGlja0V2ZW50PXQpLHMpe3ZhciBsPXMuX21lbnU7aWYoaS5kZWZhdWx0KGEpLmhhc0NsYXNzKCJzaG93IikmJiEodCYmKCJjbGljayI9PT10LnR5cGUmJi9pbnB1dHx0ZXh0YXJlYS9pLnRlc3QodC50YXJnZXQudGFnTmFtZSl8fCJrZXl1cCI9PT10LnR5cGUmJjk9PT10LndoaWNoKSYmaS5kZWZhdWx0LmNvbnRhaW5zKGEsdC50YXJnZXQpKSl7dmFyIGM9aS5kZWZhdWx0LkV2ZW50KCJoaWRlLmJzLmRyb3Bkb3duIix1KTtpLmRlZmF1bHQoYSkudHJpZ2dlcihjKSxjLmlzRGVmYXVsdFByZXZlbnRlZCgpfHwoIm9udG91Y2hzdGFydCJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQmJmkuZGVmYXVsdChkb2N1bWVudC5ib2R5KS5jaGlsZHJlbigpLm9mZigibW91c2VvdmVyIixudWxsLGkuZGVmYXVsdC5ub29wKSxuW3JdLnNldEF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIsImZhbHNlIikscy5fcG9wcGVyJiZzLl9wb3BwZXIuZGVzdHJveSgpLGkuZGVmYXVsdChsKS5yZW1vdmVDbGFzcygic2hvdyIpLGkuZGVmYXVsdChhKS5yZW1vdmVDbGFzcygic2hvdyIpLnRyaWdnZXIoaS5kZWZhdWx0LkV2ZW50KCJoaWRkZW4uYnMuZHJvcGRvd24iLHUpKSl9fX19LGUuX2dldFBhcmVudEZyb21FbGVtZW50PWZ1bmN0aW9uKGUpe3ZhciB0LG49Zi5nZXRTZWxlY3RvckZyb21FbGVtZW50KGUpO3JldHVybiBuJiYodD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKG4pKSx0fHxlLnBhcmVudE5vZGV9LGUuX2RhdGFBcGlLZXlkb3duSGFuZGxlcj1mdW5jdGlvbih0KXtpZighKC9pbnB1dHx0ZXh0YXJlYS9pLnRlc3QodC50YXJnZXQudGFnTmFtZSk/MzI9PT10LndoaWNofHwyNyE9PXQud2hpY2gmJig0MCE9PXQud2hpY2gmJjM4IT09dC53aGljaHx8aS5kZWZhdWx0KHQudGFyZ2V0KS5jbG9zZXN0KCIuZHJvcGRvd24tbWVudSIpLmxlbmd0aCk6IUQudGVzdCh0LndoaWNoKSkmJiF0aGlzLmRpc2FibGVkJiYhaS5kZWZhdWx0KHRoaXMpLmhhc0NsYXNzKCJkaXNhYmxlZCIpKXt2YXIgbj1lLl9nZXRQYXJlbnRGcm9tRWxlbWVudCh0aGlzKSxyPWkuZGVmYXVsdChuKS5oYXNDbGFzcygic2hvdyIpO2lmKHJ8fDI3IT09dC53aGljaCl7aWYodC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCksIXJ8fDI3PT09dC53aGljaHx8MzI9PT10LndoaWNoKXJldHVybiAyNz09PXQud2hpY2gmJmkuZGVmYXVsdChuLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXRvZ2dsZT0iZHJvcGRvd24iXScpKS50cmlnZ2VyKCJmb2N1cyIpLHZvaWQgaS5kZWZhdWx0KHRoaXMpLnRyaWdnZXIoImNsaWNrIik7dmFyIG89W10uc2xpY2UuY2FsbChuLnF1ZXJ5U2VsZWN0b3JBbGwoIi5kcm9wZG93bi1tZW51IC5kcm9wZG93bi1pdGVtOm5vdCguZGlzYWJsZWQpOm5vdCg6ZGlzYWJsZWQpIikpLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIGkuZGVmYXVsdChlKS5pcygiOnZpc2libGUiKX0pKTtpZigwIT09by5sZW5ndGgpe3ZhciBhPW8uaW5kZXhPZih0LnRhcmdldCk7Mzg9PT10LndoaWNoJiZhPjAmJmEtLSw0MD09PXQud2hpY2gmJmE8by5sZW5ndGgtMSYmYSsrLGE8MCYmKGE9MCksb1thXS5mb2N1cygpfX19fSxzKGUsbnVsbCxbe2tleToiVkVSU0lPTiIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIjQuNi4yIn19LHtrZXk6IkRlZmF1bHQiLGdldDpmdW5jdGlvbigpe3JldHVybiBqfX0se2tleToiRGVmYXVsdFR5cGUiLGdldDpmdW5jdGlvbigpe3JldHVybiBPfX1dKSxlfSgpO2kuZGVmYXVsdChkb2N1bWVudCkub24oImtleWRvd24uYnMuZHJvcGRvd24uZGF0YS1hcGkiLCdbZGF0YS10b2dnbGU9ImRyb3Bkb3duIl0nLEwuX2RhdGFBcGlLZXlkb3duSGFuZGxlcikub24oImtleWRvd24uYnMuZHJvcGRvd24uZGF0YS1hcGkiLCIuZHJvcGRvd24tbWVudSIsTC5fZGF0YUFwaUtleWRvd25IYW5kbGVyKS5vbigiY2xpY2suYnMuZHJvcGRvd24uZGF0YS1hcGkga2V5dXAuYnMuZHJvcGRvd24uZGF0YS1hcGkiLEwuX2NsZWFyTWVudXMpLm9uKCJjbGljay5icy5kcm9wZG93bi5kYXRhLWFwaSIsJ1tkYXRhLXRvZ2dsZT0iZHJvcGRvd24iXScsKGZ1bmN0aW9uKGUpe2UucHJldmVudERlZmF1bHQoKSxlLnN0b3BQcm9wYWdhdGlvbigpLEwuX2pRdWVyeUludGVyZmFjZS5jYWxsKGkuZGVmYXVsdCh0aGlzKSwidG9nZ2xlIil9KSkub24oImNsaWNrLmJzLmRyb3Bkb3duLmRhdGEtYXBpIiwiLmRyb3Bkb3duIGZvcm0iLChmdW5jdGlvbihlKXtlLnN0b3BQcm9wYWdhdGlvbigpfSkpLGkuZGVmYXVsdC5mbltBXT1MLl9qUXVlcnlJbnRlcmZhY2UsaS5kZWZhdWx0LmZuW0FdLkNvbnN0cnVjdG9yPUwsaS5kZWZhdWx0LmZuW0FdLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gaS5kZWZhdWx0LmZuW0FdPU4sTC5falF1ZXJ5SW50ZXJmYWNlfTt2YXIgST1pLmRlZmF1bHQuZm4ubW9kYWwsUj17YmFja2Ryb3A6ITAsa2V5Ym9hcmQ6ITAsZm9jdXM6ITAsc2hvdzohMH0sUD17YmFja2Ryb3A6Iihib29sZWFufHN0cmluZykiLGtleWJvYXJkOiJib29sZWFuIixmb2N1czoiYm9vbGVhbiIsc2hvdzoiYm9vbGVhbiJ9LCQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7dGhpcy5fY29uZmlnPXRoaXMuX2dldENvbmZpZyh0KSx0aGlzLl9lbGVtZW50PWUsdGhpcy5fZGlhbG9nPWUucXVlcnlTZWxlY3RvcigiLm1vZGFsLWRpYWxvZyIpLHRoaXMuX2JhY2tkcm9wPW51bGwsdGhpcy5faXNTaG93bj0hMSx0aGlzLl9pc0JvZHlPdmVyZmxvd2luZz0hMSx0aGlzLl9pZ25vcmVCYWNrZHJvcENsaWNrPSExLHRoaXMuX2lzVHJhbnNpdGlvbmluZz0hMSx0aGlzLl9zY3JvbGxiYXJXaWR0aD0wfXZhciB0PWUucHJvdG90eXBlO3JldHVybiB0LnRvZ2dsZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5faXNTaG93bj90aGlzLmhpZGUoKTp0aGlzLnNob3coZSl9LHQuc2hvdz1mdW5jdGlvbihlKXt2YXIgdD10aGlzO2lmKCF0aGlzLl9pc1Nob3duJiYhdGhpcy5faXNUcmFuc2l0aW9uaW5nKXt2YXIgbj1pLmRlZmF1bHQuRXZlbnQoInNob3cuYnMubW9kYWwiLHtyZWxhdGVkVGFyZ2V0OmV9KTtpLmRlZmF1bHQodGhpcy5fZWxlbWVudCkudHJpZ2dlcihuKSxuLmlzRGVmYXVsdFByZXZlbnRlZCgpfHwodGhpcy5faXNTaG93bj0hMCxpLmRlZmF1bHQodGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoImZhZGUiKSYmKHRoaXMuX2lzVHJhbnNpdGlvbmluZz0hMCksdGhpcy5fY2hlY2tTY3JvbGxiYXIoKSx0aGlzLl9zZXRTY3JvbGxiYXIoKSx0aGlzLl9hZGp1c3REaWFsb2coKSx0aGlzLl9zZXRFc2NhcGVFdmVudCgpLHRoaXMuX3NldFJlc2l6ZUV2ZW50KCksaS5kZWZhdWx0KHRoaXMuX2VsZW1lbnQpLm9uKCJjbGljay5kaXNtaXNzLmJzLm1vZGFsIiwnW2RhdGEtZGlzbWlzcz0ibW9kYWwiXScsKGZ1bmN0aW9uKGUpe3JldHVybiB0LmhpZGUoZSl9KSksaS5kZWZhdWx0KHRoaXMuX2RpYWxvZykub24oIm1vdXNlZG93bi5kaXNtaXNzLmJzLm1vZGFsIiwoZnVuY3Rpb24oKXtpLmRlZmF1bHQodC5fZWxlbWVudCkub25lKCJtb3VzZXVwLmRpc21pc3MuYnMubW9kYWwiLChmdW5jdGlvbihlKXtpLmRlZmF1bHQoZS50YXJnZXQpLmlzKHQuX2VsZW1lbnQpJiYodC5faWdub3JlQmFja2Ryb3BDbGljaz0hMCl9KSl9KSksdGhpcy5fc2hvd0JhY2tkcm9wKChmdW5jdGlvbigpe3JldHVybiB0Ll9zaG93RWxlbWVudChlKX0pKSl9fSx0LmhpZGU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztpZihlJiZlLnByZXZlbnREZWZhdWx0KCksdGhpcy5faXNTaG93biYmIXRoaXMuX2lzVHJhbnNpdGlvbmluZyl7dmFyIG49aS5kZWZhdWx0LkV2ZW50KCJoaWRlLmJzLm1vZGFsIik7aWYoaS5kZWZhdWx0KHRoaXMuX2VsZW1lbnQpLnRyaWdnZXIobiksdGhpcy5faXNTaG93biYmIW4uaXNEZWZhdWx0UHJldmVudGVkKCkpe3RoaXMuX2lzU2hvd249ITE7dmFyIHI9aS5kZWZhdWx0KHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKCJmYWRlIik7aWYociYmKHRoaXMuX2lzVHJhbnNpdGlvbmluZz0hMCksdGhpcy5fc2V0RXNjYXBlRXZlbnQoKSx0aGlzLl9zZXRSZXNpemVFdmVudCgpLGkuZGVmYXVsdChkb2N1bWVudCkub2ZmKCJmb2N1c2luLmJzLm1vZGFsIiksaS5kZWZhdWx0KHRoaXMuX2VsZW1lbnQpLnJlbW92ZUNsYXNzKCJzaG93IiksaS5kZWZhdWx0KHRoaXMuX2VsZW1lbnQpLm9mZigiY2xpY2suZGlzbWlzcy5icy5tb2RhbCIpLGkuZGVmYXVsdCh0aGlzLl9kaWFsb2cpLm9mZigibW91c2Vkb3duLmRpc21pc3MuYnMubW9kYWwiKSxyKXt2YXIgbz1mLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRoaXMuX2VsZW1lbnQpO2kuZGVmYXVsdCh0aGlzLl9lbGVtZW50KS5vbmUoZi5UUkFOU0lUSU9OX0VORCwoZnVuY3Rpb24oZSl7cmV0dXJuIHQuX2hpZGVNb2RhbChlKX0pKS5lbXVsYXRlVHJhbnNpdGlvbkVuZChvKX1lbHNlIHRoaXMuX2hpZGVNb2RhbCgpfX19LHQuZGlzcG9zZT1mdW5jdGlvbigpe1t3aW5kb3csdGhpcy5fZWxlbWVudCx0aGlzLl9kaWFsb2ddLmZvckVhY2goKGZ1bmN0aW9uKGUpe3JldHVybiBpLmRlZmF1bHQoZSkub2ZmKCIuYnMubW9kYWwiKX0pKSxpLmRlZmF1bHQoZG9jdW1lbnQpLm9mZigiZm9jdXNpbi5icy5tb2RhbCIpLGkuZGVmYXVsdC5yZW1vdmVEYXRhKHRoaXMuX2VsZW1lbnQsImJzLm1vZGFsIiksdGhpcy5fY29uZmlnPW51bGwsdGhpcy5fZWxlbWVudD1udWxsLHRoaXMuX2RpYWxvZz1udWxsLHRoaXMuX2JhY2tkcm9wPW51bGwsdGhpcy5faXNTaG93bj1udWxsLHRoaXMuX2lzQm9keU92ZXJmbG93aW5nPW51bGwsdGhpcy5faWdub3JlQmFja2Ryb3BDbGljaz1udWxsLHRoaXMuX2lzVHJhbnNpdGlvbmluZz1udWxsLHRoaXMuX3Njcm9sbGJhcldpZHRoPW51bGx9LHQuaGFuZGxlVXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5fYWRqdXN0RGlhbG9nKCl9LHQuX2dldENvbmZpZz1mdW5jdGlvbihlKXtyZXR1cm4gZT11KHt9LFIsZSksZi50eXBlQ2hlY2tDb25maWcoIm1vZGFsIixlLFApLGV9LHQuX3RyaWdnZXJCYWNrZHJvcFRyYW5zaXRpb249ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9aS5kZWZhdWx0LkV2ZW50KCJoaWRlUHJldmVudGVkLmJzLm1vZGFsIik7aWYoaS5kZWZhdWx0KHRoaXMuX2VsZW1lbnQpLnRyaWdnZXIodCksIXQuaXNEZWZhdWx0UHJldmVudGVkKCkpe3ZhciBuPXRoaXMuX2VsZW1lbnQuc2Nyb2xsSGVpZ2h0PmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7bnx8KHRoaXMuX2VsZW1lbnQuc3R5bGUub3ZlcmZsb3dZPSJoaWRkZW4iKSx0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoIm1vZGFsLXN0YXRpYyIpO3ZhciByPWYuZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQodGhpcy5fZGlhbG9nKTtpLmRlZmF1bHQodGhpcy5fZWxlbWVudCkub2ZmKGYuVFJBTlNJVElPTl9FTkQpLGkuZGVmYXVsdCh0aGlzLl9lbGVtZW50KS5vbmUoZi5UUkFOU0lUSU9OX0VORCwoZnVuY3Rpb24oKXtlLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoIm1vZGFsLXN0YXRpYyIpLG58fGkuZGVmYXVsdChlLl9lbGVtZW50KS5vbmUoZi5UUkFOU0lUSU9OX0VORCwoZnVuY3Rpb24oKXtlLl9lbGVtZW50LnN0eWxlLm92ZXJmbG93WT0iIn0pKS5lbXVsYXRlVHJhbnNpdGlvbkVuZChlLl9lbGVtZW50LHIpfSkpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKHIpLHRoaXMuX2VsZW1lbnQuZm9jdXMoKX19LHQuX3Nob3dFbGVtZW50PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj1pLmRlZmF1bHQodGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoImZhZGUiKSxyPXRoaXMuX2RpYWxvZz90aGlzLl9kaWFsb2cucXVlcnlTZWxlY3RvcigiLm1vZGFsLWJvZHkiKTpudWxsO3RoaXMuX2VsZW1lbnQucGFyZW50Tm9kZSYmdGhpcy5fZWxlbWVudC5wYXJlbnROb2RlLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREV8fGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5fZWxlbWVudCksdGhpcy5fZWxlbWVudC5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiksdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoImFyaWEtbW9kYWwiLCEwKSx0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgicm9sZSIsImRpYWxvZyIpLGkuZGVmYXVsdCh0aGlzLl9kaWFsb2cpLmhhc0NsYXNzKCJtb2RhbC1kaWFsb2ctc2Nyb2xsYWJsZSIpJiZyP3Iuc2Nyb2xsVG9wPTA6dGhpcy5fZWxlbWVudC5zY3JvbGxUb3A9MCxuJiZmLnJlZmxvdyh0aGlzLl9lbGVtZW50KSxpLmRlZmF1bHQodGhpcy5fZWxlbWVudCkuYWRkQ2xhc3MoInNob3ciKSx0aGlzLl9jb25maWcuZm9jdXMmJnRoaXMuX2VuZm9yY2VGb2N1cygpO3ZhciBvPWkuZGVmYXVsdC5FdmVudCgic2hvd24uYnMubW9kYWwiLHtyZWxhdGVkVGFyZ2V0OmV9KSxhPWZ1bmN0aW9uKCl7dC5fY29uZmlnLmZvY3VzJiZ0Ll9lbGVtZW50LmZvY3VzKCksdC5faXNUcmFuc2l0aW9uaW5nPSExLGkuZGVmYXVsdCh0Ll9lbGVtZW50KS50cmlnZ2VyKG8pfTtpZihuKXt2YXIgcz1mLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRoaXMuX2RpYWxvZyk7aS5kZWZhdWx0KHRoaXMuX2RpYWxvZykub25lKGYuVFJBTlNJVElPTl9FTkQsYSkuZW11bGF0ZVRyYW5zaXRpb25FbmQocyl9ZWxzZSBhKCl9LHQuX2VuZm9yY2VGb2N1cz1mdW5jdGlvbigpe3ZhciBlPXRoaXM7aS5kZWZhdWx0KGRvY3VtZW50KS5vZmYoImZvY3VzaW4uYnMubW9kYWwiKS5vbigiZm9jdXNpbi5icy5tb2RhbCIsKGZ1bmN0aW9uKHQpe2RvY3VtZW50IT09dC50YXJnZXQmJmUuX2VsZW1lbnQhPT10LnRhcmdldCYmMD09PWkuZGVmYXVsdChlLl9lbGVtZW50KS5oYXModC50YXJnZXQpLmxlbmd0aCYmZS5fZWxlbWVudC5mb2N1cygpfSkpfSx0Ll9zZXRFc2NhcGVFdmVudD1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5faXNTaG93bj9pLmRlZmF1bHQodGhpcy5fZWxlbWVudCkub24oImtleWRvd24uZGlzbWlzcy5icy5tb2RhbCIsKGZ1bmN0aW9uKHQpe2UuX2NvbmZpZy5rZXlib2FyZCYmMjc9PT10LndoaWNoPyh0LnByZXZlbnREZWZhdWx0KCksZS5oaWRlKCkpOmUuX2NvbmZpZy5rZXlib2FyZHx8MjchPT10LndoaWNofHxlLl90cmlnZ2VyQmFja2Ryb3BUcmFuc2l0aW9uKCl9KSk6dGhpcy5faXNTaG93bnx8aS5kZWZhdWx0KHRoaXMuX2VsZW1lbnQpLm9mZigia2V5ZG93bi5kaXNtaXNzLmJzLm1vZGFsIil9LHQuX3NldFJlc2l6ZUV2ZW50PWZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLl9pc1Nob3duP2kuZGVmYXVsdCh3aW5kb3cpLm9uKCJyZXNpemUuYnMubW9kYWwiLChmdW5jdGlvbih0KXtyZXR1cm4gZS5oYW5kbGVVcGRhdGUodCl9KSk6aS5kZWZhdWx0KHdpbmRvdykub2ZmKCJyZXNpemUuYnMubW9kYWwiKX0sdC5faGlkZU1vZGFsPWZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLl9lbGVtZW50LnN0eWxlLmRpc3BsYXk9Im5vbmUiLHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsITApLHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCJhcmlhLW1vZGFsIiksdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKSx0aGlzLl9pc1RyYW5zaXRpb25pbmc9ITEsdGhpcy5fc2hvd0JhY2tkcm9wKChmdW5jdGlvbigpe2kuZGVmYXVsdChkb2N1bWVudC5ib2R5KS5yZW1vdmVDbGFzcygibW9kYWwtb3BlbiIpLGUuX3Jlc2V0QWRqdXN0bWVudHMoKSxlLl9yZXNldFNjcm9sbGJhcigpLGkuZGVmYXVsdChlLl9lbGVtZW50KS50cmlnZ2VyKCJoaWRkZW4uYnMubW9kYWwiKX0pKX0sdC5fcmVtb3ZlQmFja2Ryb3A9ZnVuY3Rpb24oKXt0aGlzLl9iYWNrZHJvcCYmKGkuZGVmYXVsdCh0aGlzLl9iYWNrZHJvcCkucmVtb3ZlKCksdGhpcy5fYmFja2Ryb3A9bnVsbCl9LHQuX3Nob3dCYWNrZHJvcD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLG49aS5kZWZhdWx0KHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKCJmYWRlIik/ImZhZGUiOiIiO2lmKHRoaXMuX2lzU2hvd24mJnRoaXMuX2NvbmZpZy5iYWNrZHJvcCl7aWYodGhpcy5fYmFja2Ryb3A9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5fYmFja2Ryb3AuY2xhc3NOYW1lPSJtb2RhbC1iYWNrZHJvcCIsbiYmdGhpcy5fYmFja2Ryb3AuY2xhc3NMaXN0LmFkZChuKSxpLmRlZmF1bHQodGhpcy5fYmFja2Ryb3ApLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpLGkuZGVmYXVsdCh0aGlzLl9lbGVtZW50KS5vbigiY2xpY2suZGlzbWlzcy5icy5tb2RhbCIsKGZ1bmN0aW9uKGUpe3QuX2lnbm9yZUJhY2tkcm9wQ2xpY2s/dC5faWdub3JlQmFja2Ryb3BDbGljaz0hMTplLnRhcmdldD09PWUuY3VycmVudFRhcmdldCYmKCJzdGF0aWMiPT09dC5fY29uZmlnLmJhY2tkcm9wP3QuX3RyaWdnZXJCYWNrZHJvcFRyYW5zaXRpb24oKTp0LmhpZGUoKSl9KSksbiYmZi5yZWZsb3codGhpcy5fYmFja2Ryb3ApLGkuZGVmYXVsdCh0aGlzLl9iYWNrZHJvcCkuYWRkQ2xhc3MoInNob3ciKSwhZSlyZXR1cm47aWYoIW4pcmV0dXJuIHZvaWQgZSgpO3ZhciByPWYuZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQodGhpcy5fYmFja2Ryb3ApO2kuZGVmYXVsdCh0aGlzLl9iYWNrZHJvcCkub25lKGYuVFJBTlNJVElPTl9FTkQsZSkuZW11bGF0ZVRyYW5zaXRpb25FbmQocil9ZWxzZSBpZighdGhpcy5faXNTaG93biYmdGhpcy5fYmFja2Ryb3Ape2kuZGVmYXVsdCh0aGlzLl9iYWNrZHJvcCkucmVtb3ZlQ2xhc3MoInNob3ciKTt2YXIgbz1mdW5jdGlvbigpe3QuX3JlbW92ZUJhY2tkcm9wKCksZSYmZSgpfTtpZihpLmRlZmF1bHQodGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoImZhZGUiKSl7dmFyIGE9Zi5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCh0aGlzLl9iYWNrZHJvcCk7aS5kZWZhdWx0KHRoaXMuX2JhY2tkcm9wKS5vbmUoZi5UUkFOU0lUSU9OX0VORCxvKS5lbXVsYXRlVHJhbnNpdGlvbkVuZChhKX1lbHNlIG8oKX1lbHNlIGUmJmUoKX0sdC5fYWRqdXN0RGlhbG9nPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fZWxlbWVudC5zY3JvbGxIZWlnaHQ+ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDshdGhpcy5faXNCb2R5T3ZlcmZsb3dpbmcmJmUmJih0aGlzLl9lbGVtZW50LnN0eWxlLnBhZGRpbmdMZWZ0PXRoaXMuX3Njcm9sbGJhcldpZHRoKyJweCIpLHRoaXMuX2lzQm9keU92ZXJmbG93aW5nJiYhZSYmKHRoaXMuX2VsZW1lbnQuc3R5bGUucGFkZGluZ1JpZ2h0PXRoaXMuX3Njcm9sbGJhcldpZHRoKyJweCIpfSx0Ll9yZXNldEFkanVzdG1lbnRzPWZ1bmN0aW9uKCl7dGhpcy5fZWxlbWVudC5zdHlsZS5wYWRkaW5nTGVmdD0iIix0aGlzLl9lbGVtZW50LnN0eWxlLnBhZGRpbmdSaWdodD0iIn0sdC5fY2hlY2tTY3JvbGxiYXI9ZnVuY3Rpb24oKXt2YXIgZT1kb2N1bWVudC5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3RoaXMuX2lzQm9keU92ZXJmbG93aW5nPU1hdGgucm91bmQoZS5sZWZ0K2UucmlnaHQpPHdpbmRvdy5pbm5lcldpZHRoLHRoaXMuX3Njcm9sbGJhcldpZHRoPXRoaXMuX2dldFNjcm9sbGJhcldpZHRoKCl9LHQuX3NldFNjcm9sbGJhcj1mdW5jdGlvbigpe3ZhciBlPXRoaXM7aWYodGhpcy5faXNCb2R5T3ZlcmZsb3dpbmcpe3ZhciB0PVtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLmZpeGVkLXRvcCwgLmZpeGVkLWJvdHRvbSwgLmlzLWZpeGVkLCAuc3RpY2t5LXRvcCIpKSxuPVtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnN0aWNreS10b3AiKSk7aS5kZWZhdWx0KHQpLmVhY2goKGZ1bmN0aW9uKHQsbil7dmFyIHI9bi5zdHlsZS5wYWRkaW5nUmlnaHQsbz1pLmRlZmF1bHQobikuY3NzKCJwYWRkaW5nLXJpZ2h0Iik7aS5kZWZhdWx0KG4pLmRhdGEoInBhZGRpbmctcmlnaHQiLHIpLmNzcygicGFkZGluZy1yaWdodCIscGFyc2VGbG9hdChvKStlLl9zY3JvbGxiYXJXaWR0aCsicHgiKX0pKSxpLmRlZmF1bHQobikuZWFjaCgoZnVuY3Rpb24odCxuKXt2YXIgcj1uLnN0eWxlLm1hcmdpblJpZ2h0LG89aS5kZWZhdWx0KG4pLmNzcygibWFyZ2luLXJpZ2h0Iik7aS5kZWZhdWx0KG4pLmRhdGEoIm1hcmdpbi1yaWdodCIscikuY3NzKCJtYXJnaW4tcmlnaHQiLHBhcnNlRmxvYXQobyktZS5fc2Nyb2xsYmFyV2lkdGgrInB4Iil9KSk7dmFyIHI9ZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQsbz1pLmRlZmF1bHQoZG9jdW1lbnQuYm9keSkuY3NzKCJwYWRkaW5nLXJpZ2h0Iik7aS5kZWZhdWx0KGRvY3VtZW50LmJvZHkpLmRhdGEoInBhZGRpbmctcmlnaHQiLHIpLmNzcygicGFkZGluZy1yaWdodCIscGFyc2VGbG9hdChvKSt0aGlzLl9zY3JvbGxiYXJXaWR0aCsicHgiKX1pLmRlZmF1bHQoZG9jdW1lbnQuYm9keSkuYWRkQ2xhc3MoIm1vZGFsLW9wZW4iKX0sdC5fcmVzZXRTY3JvbGxiYXI9ZnVuY3Rpb24oKXt2YXIgZT1bXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5maXhlZC10b3AsIC5maXhlZC1ib3R0b20sIC5pcy1maXhlZCwgLnN0aWNreS10b3AiKSk7aS5kZWZhdWx0KGUpLmVhY2goKGZ1bmN0aW9uKGUsdCl7dmFyIG49aS5kZWZhdWx0KHQpLmRhdGEoInBhZGRpbmctcmlnaHQiKTtpLmRlZmF1bHQodCkucmVtb3ZlRGF0YSgicGFkZGluZy1yaWdodCIpLHQuc3R5bGUucGFkZGluZ1JpZ2h0PW58fCIifSkpO3ZhciB0PVtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnN0aWNreS10b3AiKSk7aS5kZWZhdWx0KHQpLmVhY2goKGZ1bmN0aW9uKGUsdCl7dmFyIG49aS5kZWZhdWx0KHQpLmRhdGEoIm1hcmdpbi1yaWdodCIpO3ZvaWQgMCE9PW4mJmkuZGVmYXVsdCh0KS5jc3MoIm1hcmdpbi1yaWdodCIsbikucmVtb3ZlRGF0YSgibWFyZ2luLXJpZ2h0Iil9KSk7dmFyIG49aS5kZWZhdWx0KGRvY3VtZW50LmJvZHkpLmRhdGEoInBhZGRpbmctcmlnaHQiKTtpLmRlZmF1bHQoZG9jdW1lbnQuYm9keSkucmVtb3ZlRGF0YSgicGFkZGluZy1yaWdodCIpLGRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0PW58fCIifSx0Ll9nZXRTY3JvbGxiYXJXaWR0aD1mdW5jdGlvbigpe3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2UuY2xhc3NOYW1lPSJtb2RhbC1zY3JvbGxiYXItbWVhc3VyZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTt2YXIgdD1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoLWUuY2xpZW50V2lkdGg7cmV0dXJuIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZSksdH0sZS5falF1ZXJ5SW50ZXJmYWNlPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRoaXMuZWFjaCgoZnVuY3Rpb24oKXt2YXIgcj1pLmRlZmF1bHQodGhpcykuZGF0YSgiYnMubW9kYWwiKSxvPXUoe30sUixpLmRlZmF1bHQodGhpcykuZGF0YSgpLCJvYmplY3QiPT10eXBlb2YgdCYmdD90Ont9KTtpZihyfHwocj1uZXcgZSh0aGlzLG8pLGkuZGVmYXVsdCh0aGlzKS5kYXRhKCJicy5tb2RhbCIscikpLCJzdHJpbmciPT10eXBlb2YgdCl7aWYodm9pZCAwPT09clt0XSl0aHJvdyBuZXcgVHlwZUVycm9yKCdObyBtZXRob2QgbmFtZWQgIicrdCsnIicpO3JbdF0obil9ZWxzZSBvLnNob3cmJnIuc2hvdyhuKX0pKX0scyhlLG51bGwsW3trZXk6IlZFUlNJT04iLGdldDpmdW5jdGlvbigpe3JldHVybiI0LjYuMiJ9fSx7a2V5OiJEZWZhdWx0IixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUn19XSksZX0oKTtpLmRlZmF1bHQoZG9jdW1lbnQpLm9uKCJjbGljay5icy5tb2RhbC5kYXRhLWFwaSIsJ1tkYXRhLXRvZ2dsZT0ibW9kYWwiXScsKGZ1bmN0aW9uKGUpe3ZhciB0LG49dGhpcyxyPWYuZ2V0U2VsZWN0b3JGcm9tRWxlbWVudCh0aGlzKTtyJiYodD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKHIpKTt2YXIgbz1pLmRlZmF1bHQodCkuZGF0YSgiYnMubW9kYWwiKT8idG9nZ2xlIjp1KHt9LGkuZGVmYXVsdCh0KS5kYXRhKCksaS5kZWZhdWx0KHRoaXMpLmRhdGEoKSk7IkEiIT09dGhpcy50YWdOYW1lJiYiQVJFQSIhPT10aGlzLnRhZ05hbWV8fGUucHJldmVudERlZmF1bHQoKTt2YXIgYT1pLmRlZmF1bHQodCkub25lKCJzaG93LmJzLm1vZGFsIiwoZnVuY3Rpb24oZSl7ZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8YS5vbmUoImhpZGRlbi5icy5tb2RhbCIsKGZ1bmN0aW9uKCl7aS5kZWZhdWx0KG4pLmlzKCI6dmlzaWJsZSIpJiZuLmZvY3VzKCl9KSl9KSk7JC5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoaS5kZWZhdWx0KHQpLG8sdGhpcyl9KSksaS5kZWZhdWx0LmZuLm1vZGFsPSQuX2pRdWVyeUludGVyZmFjZSxpLmRlZmF1bHQuZm4ubW9kYWwuQ29uc3RydWN0b3I9JCxpLmRlZmF1bHQuZm4ubW9kYWwubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiBpLmRlZmF1bHQuZm4ubW9kYWw9SSwkLl9qUXVlcnlJbnRlcmZhY2V9O3ZhciBCPVsiYmFja2dyb3VuZCIsImNpdGUiLCJocmVmIiwiaXRlbXR5cGUiLCJsb25nZGVzYyIsInBvc3RlciIsInNyYyIsInhsaW5rOmhyZWYiXSxxPXsiKiI6WyJjbGFzcyIsImRpciIsImlkIiwibGFuZyIsInJvbGUiLC9eYXJpYS1bXHctXSokL2ldLGE6WyJ0YXJnZXQiLCJocmVmIiwidGl0bGUiLCJyZWwiXSxhcmVhOltdLGI6W10sYnI6W10sY29sOltdLGNvZGU6W10sZGl2OltdLGVtOltdLGhyOltdLGgxOltdLGgyOltdLGgzOltdLGg0OltdLGg1OltdLGg2OltdLGk6W10saW1nOlsic3JjIiwic3Jjc2V0IiwiYWx0IiwidGl0bGUiLCJ3aWR0aCIsImhlaWdodCJdLGxpOltdLG9sOltdLHA6W10scHJlOltdLHM6W10sc21hbGw6W10sc3BhbjpbXSxzdWI6W10sc3VwOltdLHN0cm9uZzpbXSx1OltdLHVsOltdfSxNPS9eKD86KD86aHR0cHM/fG1haWx0b3xmdHB8dGVsfGZpbGV8c21zKTp8W14jJi86P10qKD86WyMvP118JCkpL2ksSD0vXmRhdGE6KD86aW1hZ2VcLyg/OmJtcHxnaWZ8anBlZ3xqcGd8cG5nfHRpZmZ8d2VicCl8dmlkZW9cLyg/Om1wZWd8bXA0fG9nZ3x3ZWJtKXxhdWRpb1wvKD86bXAzfG9nYXxvZ2d8b3B1cykpO2Jhc2U2NCxbXGQrL2Etel0rPSokL2k7ZnVuY3Rpb24gRihlLHQsbil7aWYoMD09PWUubGVuZ3RoKXJldHVybiBlO2lmKG4mJiJmdW5jdGlvbiI9PXR5cGVvZiBuKXJldHVybiBuKGUpO2Zvcih2YXIgcj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhlLCJ0ZXh0L2h0bWwiKSxpPU9iamVjdC5rZXlzKHQpLG89W10uc2xpY2UuY2FsbChyLmJvZHkucXVlcnlTZWxlY3RvckFsbCgiKiIpKSxhPWZ1bmN0aW9uKGUsbil7dmFyIHI9b1tlXSxhPXIubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtpZigtMT09PWkuaW5kZXhPZihyLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpKXJldHVybiByLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQociksImNvbnRpbnVlIjt2YXIgcz1bXS5zbGljZS5jYWxsKHIuYXR0cmlidXRlcyksdT1bXS5jb25jYXQodFsiKiJdfHxbXSx0W2FdfHxbXSk7cy5mb3JFYWNoKChmdW5jdGlvbihlKXsoZnVuY3Rpb24oZSx0KXt2YXIgbj1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7aWYoLTEhPT10LmluZGV4T2YobikpcmV0dXJuLTE9PT1CLmluZGV4T2Yobil8fEJvb2xlYW4oTS50ZXN0KGUubm9kZVZhbHVlKXx8SC50ZXN0KGUubm9kZVZhbHVlKSk7Zm9yKHZhciByPXQuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIFJlZ0V4cH0pKSxpPTAsbz1yLmxlbmd0aDtpPG87aSsrKWlmKHJbaV0udGVzdChuKSlyZXR1cm4hMDtyZXR1cm4hMX0pKGUsdSl8fHIucmVtb3ZlQXR0cmlidXRlKGUubm9kZU5hbWUpfSkpfSxzPTAsdT1vLmxlbmd0aDtzPHU7cysrKWEocyk7cmV0dXJuIHIuYm9keS5pbm5lckhUTUx9dmFyIFc9InRvb2x0aXAiLFU9aS5kZWZhdWx0LmZuW1ddLHo9bmV3IFJlZ0V4cCgiKF58XFxzKWJzLXRvb2x0aXBcXFMrIiwiZyIpLFE9WyJzYW5pdGl6ZSIsIndoaXRlTGlzdCIsInNhbml0aXplRm4iXSxWPXtBVVRPOiJhdXRvIixUT1A6InRvcCIsUklHSFQ6InJpZ2h0IixCT1RUT006ImJvdHRvbSIsTEVGVDoibGVmdCJ9LEs9e2FuaW1hdGlvbjohMCx0ZW1wbGF0ZTonPGRpdiBjbGFzcz0idG9vbHRpcCIgcm9sZT0idG9vbHRpcCI+PGRpdiBjbGFzcz0iYXJyb3ciPjwvZGl2PjxkaXYgY2xhc3M9InRvb2x0aXAtaW5uZXIiPjwvZGl2PjwvZGl2PicsdHJpZ2dlcjoiaG92ZXIgZm9jdXMiLHRpdGxlOiIiLGRlbGF5OjAsaHRtbDohMSxzZWxlY3RvcjohMSxwbGFjZW1lbnQ6InRvcCIsb2Zmc2V0OjAsY29udGFpbmVyOiExLGZhbGxiYWNrUGxhY2VtZW50OiJmbGlwIixib3VuZGFyeToic2Nyb2xsUGFyZW50IixjdXN0b21DbGFzczoiIixzYW5pdGl6ZTohMCxzYW5pdGl6ZUZuOm51bGwsd2hpdGVMaXN0OnEscG9wcGVyQ29uZmlnOm51bGx9LFg9e2FuaW1hdGlvbjoiYm9vbGVhbiIsdGVtcGxhdGU6InN0cmluZyIsdGl0bGU6IihzdHJpbmd8ZWxlbWVudHxmdW5jdGlvbikiLHRyaWdnZXI6InN0cmluZyIsZGVsYXk6IihudW1iZXJ8b2JqZWN0KSIsaHRtbDoiYm9vbGVhbiIsc2VsZWN0b3I6IihzdHJpbmd8Ym9vbGVhbikiLHBsYWNlbWVudDoiKHN0cmluZ3xmdW5jdGlvbikiLG9mZnNldDoiKG51bWJlcnxzdHJpbmd8ZnVuY3Rpb24pIixjb250YWluZXI6IihzdHJpbmd8ZWxlbWVudHxib29sZWFuKSIsZmFsbGJhY2tQbGFjZW1lbnQ6IihzdHJpbmd8YXJyYXkpIixib3VuZGFyeToiKHN0cmluZ3xlbGVtZW50KSIsY3VzdG9tQ2xhc3M6IihzdHJpbmd8ZnVuY3Rpb24pIixzYW5pdGl6ZToiYm9vbGVhbiIsc2FuaXRpemVGbjoiKG51bGx8ZnVuY3Rpb24pIix3aGl0ZUxpc3Q6Im9iamVjdCIscG9wcGVyQ29uZmlnOiIobnVsbHxvYmplY3QpIn0sWT17SElERToiaGlkZS5icy50b29sdGlwIixISURERU46ImhpZGRlbi5icy50b29sdGlwIixTSE9XOiJzaG93LmJzLnRvb2x0aXAiLFNIT1dOOiJzaG93bi5icy50b29sdGlwIixJTlNFUlRFRDoiaW5zZXJ0ZWQuYnMudG9vbHRpcCIsQ0xJQ0s6ImNsaWNrLmJzLnRvb2x0aXAiLEZPQ1VTSU46ImZvY3VzaW4uYnMudG9vbHRpcCIsRk9DVVNPVVQ6ImZvY3Vzb3V0LmJzLnRvb2x0aXAiLE1PVVNFRU5URVI6Im1vdXNlZW50ZXIuYnMudG9vbHRpcCIsTU9VU0VMRUFWRToibW91c2VsZWF2ZS5icy50b29sdGlwIn0sSj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtpZih2b2lkIDA9PT1vLmRlZmF1bHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiQm9vdHN0cmFwJ3MgdG9vbHRpcHMgcmVxdWlyZSBQb3BwZXIgKGh0dHBzOi8vcG9wcGVyLmpzLm9yZykiKTt0aGlzLl9pc0VuYWJsZWQ9ITAsdGhpcy5fdGltZW91dD0wLHRoaXMuX2hvdmVyU3RhdGU9IiIsdGhpcy5fYWN0aXZlVHJpZ2dlcj17fSx0aGlzLl9wb3BwZXI9bnVsbCx0aGlzLmVsZW1lbnQ9ZSx0aGlzLmNvbmZpZz10aGlzLl9nZXRDb25maWcodCksdGhpcy50aXA9bnVsbCx0aGlzLl9zZXRMaXN0ZW5lcnMoKX12YXIgdD1lLnByb3RvdHlwZTtyZXR1cm4gdC5lbmFibGU9ZnVuY3Rpb24oKXt0aGlzLl9pc0VuYWJsZWQ9ITB9LHQuZGlzYWJsZT1mdW5jdGlvbigpe3RoaXMuX2lzRW5hYmxlZD0hMX0sdC50b2dnbGVFbmFibGVkPWZ1bmN0aW9uKCl7dGhpcy5faXNFbmFibGVkPSF0aGlzLl9pc0VuYWJsZWR9LHQudG9nZ2xlPWZ1bmN0aW9uKGUpe2lmKHRoaXMuX2lzRW5hYmxlZClpZihlKXt2YXIgdD10aGlzLmNvbnN0cnVjdG9yLkRBVEFfS0VZLG49aS5kZWZhdWx0KGUuY3VycmVudFRhcmdldCkuZGF0YSh0KTtufHwobj1uZXcgdGhpcy5jb25zdHJ1Y3RvcihlLmN1cnJlbnRUYXJnZXQsdGhpcy5fZ2V0RGVsZWdhdGVDb25maWcoKSksaS5kZWZhdWx0KGUuY3VycmVudFRhcmdldCkuZGF0YSh0LG4pKSxuLl9hY3RpdmVUcmlnZ2VyLmNsaWNrPSFuLl9hY3RpdmVUcmlnZ2VyLmNsaWNrLG4uX2lzV2l0aEFjdGl2ZVRyaWdnZXIoKT9uLl9lbnRlcihudWxsLG4pOm4uX2xlYXZlKG51bGwsbil9ZWxzZXtpZihpLmRlZmF1bHQodGhpcy5nZXRUaXBFbGVtZW50KCkpLmhhc0NsYXNzKCJzaG93IikpcmV0dXJuIHZvaWQgdGhpcy5fbGVhdmUobnVsbCx0aGlzKTt0aGlzLl9lbnRlcihudWxsLHRoaXMpfX0sdC5kaXNwb3NlPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpLGkuZGVmYXVsdC5yZW1vdmVEYXRhKHRoaXMuZWxlbWVudCx0aGlzLmNvbnN0cnVjdG9yLkRBVEFfS0VZKSxpLmRlZmF1bHQodGhpcy5lbGVtZW50KS5vZmYodGhpcy5jb25zdHJ1Y3Rvci5FVkVOVF9LRVkpLGkuZGVmYXVsdCh0aGlzLmVsZW1lbnQpLmNsb3Nlc3QoIi5tb2RhbCIpLm9mZigiaGlkZS5icy5tb2RhbCIsdGhpcy5faGlkZU1vZGFsSGFuZGxlciksdGhpcy50aXAmJmkuZGVmYXVsdCh0aGlzLnRpcCkucmVtb3ZlKCksdGhpcy5faXNFbmFibGVkPW51bGwsdGhpcy5fdGltZW91dD1udWxsLHRoaXMuX2hvdmVyU3RhdGU9bnVsbCx0aGlzLl9hY3RpdmVUcmlnZ2VyPW51bGwsdGhpcy5fcG9wcGVyJiZ0aGlzLl9wb3BwZXIuZGVzdHJveSgpLHRoaXMuX3BvcHBlcj1udWxsLHRoaXMuZWxlbWVudD1udWxsLHRoaXMuY29uZmlnPW51bGwsdGhpcy50aXA9bnVsbH0sdC5zaG93PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztpZigibm9uZSI9PT1pLmRlZmF1bHQodGhpcy5lbGVtZW50KS5jc3MoImRpc3BsYXkiKSl0aHJvdyBuZXcgRXJyb3IoIlBsZWFzZSB1c2Ugc2hvdyBvbiB2aXNpYmxlIGVsZW1lbnRzIik7dmFyIHQ9aS5kZWZhdWx0LkV2ZW50KHRoaXMuY29uc3RydWN0b3IuRXZlbnQuU0hPVyk7aWYodGhpcy5pc1dpdGhDb250ZW50KCkmJnRoaXMuX2lzRW5hYmxlZCl7aS5kZWZhdWx0KHRoaXMuZWxlbWVudCkudHJpZ2dlcih0KTt2YXIgbj1mLmZpbmRTaGFkb3dSb290KHRoaXMuZWxlbWVudCkscj1pLmRlZmF1bHQuY29udGFpbnMobnVsbCE9PW4/bjp0aGlzLmVsZW1lbnQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsdGhpcy5lbGVtZW50KTtpZih0LmlzRGVmYXVsdFByZXZlbnRlZCgpfHwhcilyZXR1cm47dmFyIGE9dGhpcy5nZXRUaXBFbGVtZW50KCkscz1mLmdldFVJRCh0aGlzLmNvbnN0cnVjdG9yLk5BTUUpO2Euc2V0QXR0cmlidXRlKCJpZCIscyksdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgiYXJpYS1kZXNjcmliZWRieSIscyksdGhpcy5zZXRDb250ZW50KCksdGhpcy5jb25maWcuYW5pbWF0aW9uJiZpLmRlZmF1bHQoYSkuYWRkQ2xhc3MoImZhZGUiKTt2YXIgdT0iZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5jb25maWcucGxhY2VtZW50P3RoaXMuY29uZmlnLnBsYWNlbWVudC5jYWxsKHRoaXMsYSx0aGlzLmVsZW1lbnQpOnRoaXMuY29uZmlnLnBsYWNlbWVudCxsPXRoaXMuX2dldEF0dGFjaG1lbnQodSk7dGhpcy5hZGRBdHRhY2htZW50Q2xhc3MobCk7dmFyIGM9dGhpcy5fZ2V0Q29udGFpbmVyKCk7aS5kZWZhdWx0KGEpLmRhdGEodGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWSx0aGlzKSxpLmRlZmF1bHQuY29udGFpbnModGhpcy5lbGVtZW50Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LHRoaXMudGlwKXx8aS5kZWZhdWx0KGEpLmFwcGVuZFRvKGMpLGkuZGVmYXVsdCh0aGlzLmVsZW1lbnQpLnRyaWdnZXIodGhpcy5jb25zdHJ1Y3Rvci5FdmVudC5JTlNFUlRFRCksdGhpcy5fcG9wcGVyPW5ldyBvLmRlZmF1bHQodGhpcy5lbGVtZW50LGEsdGhpcy5fZ2V0UG9wcGVyQ29uZmlnKGwpKSxpLmRlZmF1bHQoYSkuYWRkQ2xhc3MoInNob3ciKSxpLmRlZmF1bHQoYSkuYWRkQ2xhc3ModGhpcy5jb25maWcuY3VzdG9tQ2xhc3MpLCJvbnRvdWNoc3RhcnQiaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50JiZpLmRlZmF1bHQoZG9jdW1lbnQuYm9keSkuY2hpbGRyZW4oKS5vbigibW91c2VvdmVyIixudWxsLGkuZGVmYXVsdC5ub29wKTt2YXIgZD1mdW5jdGlvbigpe2UuY29uZmlnLmFuaW1hdGlvbiYmZS5fZml4VHJhbnNpdGlvbigpO3ZhciB0PWUuX2hvdmVyU3RhdGU7ZS5faG92ZXJTdGF0ZT1udWxsLGkuZGVmYXVsdChlLmVsZW1lbnQpLnRyaWdnZXIoZS5jb25zdHJ1Y3Rvci5FdmVudC5TSE9XTiksIm91dCI9PT10JiZlLl9sZWF2ZShudWxsLGUpfTtpZihpLmRlZmF1bHQodGhpcy50aXApLmhhc0NsYXNzKCJmYWRlIikpe3ZhciBoPWYuZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQodGhpcy50aXApO2kuZGVmYXVsdCh0aGlzLnRpcCkub25lKGYuVFJBTlNJVElPTl9FTkQsZCkuZW11bGF0ZVRyYW5zaXRpb25FbmQoaCl9ZWxzZSBkKCl9fSx0LmhpZGU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPXRoaXMuZ2V0VGlwRWxlbWVudCgpLHI9aS5kZWZhdWx0LkV2ZW50KHRoaXMuY29uc3RydWN0b3IuRXZlbnQuSElERSksbz1mdW5jdGlvbigpeyJzaG93IiE9PXQuX2hvdmVyU3RhdGUmJm4ucGFyZW50Tm9kZSYmbi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG4pLHQuX2NsZWFuVGlwQ2xhc3MoKSx0LmVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWRlc2NyaWJlZGJ5IiksaS5kZWZhdWx0KHQuZWxlbWVudCkudHJpZ2dlcih0LmNvbnN0cnVjdG9yLkV2ZW50LkhJRERFTiksbnVsbCE9PXQuX3BvcHBlciYmdC5fcG9wcGVyLmRlc3Ryb3koKSxlJiZlKCl9O2lmKGkuZGVmYXVsdCh0aGlzLmVsZW1lbnQpLnRyaWdnZXIociksIXIuaXNEZWZhdWx0UHJldmVudGVkKCkpe2lmKGkuZGVmYXVsdChuKS5yZW1vdmVDbGFzcygic2hvdyIpLCJvbnRvdWNoc3RhcnQiaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50JiZpLmRlZmF1bHQoZG9jdW1lbnQuYm9keSkuY2hpbGRyZW4oKS5vZmYoIm1vdXNlb3ZlciIsbnVsbCxpLmRlZmF1bHQubm9vcCksdGhpcy5fYWN0aXZlVHJpZ2dlci5jbGljaz0hMSx0aGlzLl9hY3RpdmVUcmlnZ2VyLmZvY3VzPSExLHRoaXMuX2FjdGl2ZVRyaWdnZXIuaG92ZXI9ITEsaS5kZWZhdWx0KHRoaXMudGlwKS5oYXNDbGFzcygiZmFkZSIpKXt2YXIgYT1mLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KG4pO2kuZGVmYXVsdChuKS5vbmUoZi5UUkFOU0lUSU9OX0VORCxvKS5lbXVsYXRlVHJhbnNpdGlvbkVuZChhKX1lbHNlIG8oKTt0aGlzLl9ob3ZlclN0YXRlPSIifX0sdC51cGRhdGU9ZnVuY3Rpb24oKXtudWxsIT09dGhpcy5fcG9wcGVyJiZ0aGlzLl9wb3BwZXIuc2NoZWR1bGVVcGRhdGUoKX0sdC5pc1dpdGhDb250ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIEJvb2xlYW4odGhpcy5nZXRUaXRsZSgpKX0sdC5hZGRBdHRhY2htZW50Q2xhc3M9ZnVuY3Rpb24oZSl7aS5kZWZhdWx0KHRoaXMuZ2V0VGlwRWxlbWVudCgpKS5hZGRDbGFzcygiYnMtdG9vbHRpcC0iK2UpfSx0LmdldFRpcEVsZW1lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aXA9dGhpcy50aXB8fGkuZGVmYXVsdCh0aGlzLmNvbmZpZy50ZW1wbGF0ZSlbMF0sdGhpcy50aXB9LHQuc2V0Q29udGVudD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0VGlwRWxlbWVudCgpO3RoaXMuc2V0RWxlbWVudENvbnRlbnQoaS5kZWZhdWx0KGUucXVlcnlTZWxlY3RvckFsbCgiLnRvb2x0aXAtaW5uZXIiKSksdGhpcy5nZXRUaXRsZSgpKSxpLmRlZmF1bHQoZSkucmVtb3ZlQ2xhc3MoImZhZGUgc2hvdyIpfSx0LnNldEVsZW1lbnRDb250ZW50PWZ1bmN0aW9uKGUsdCl7Im9iamVjdCIhPXR5cGVvZiB0fHwhdC5ub2RlVHlwZSYmIXQuanF1ZXJ5P3RoaXMuY29uZmlnLmh0bWw/KHRoaXMuY29uZmlnLnNhbml0aXplJiYodD1GKHQsdGhpcy5jb25maWcud2hpdGVMaXN0LHRoaXMuY29uZmlnLnNhbml0aXplRm4pKSxlLmh0bWwodCkpOmUudGV4dCh0KTp0aGlzLmNvbmZpZy5odG1sP2kuZGVmYXVsdCh0KS5wYXJlbnQoKS5pcyhlKXx8ZS5lbXB0eSgpLmFwcGVuZCh0KTplLnRleHQoaS5kZWZhdWx0KHQpLnRleHQoKSl9LHQuZ2V0VGl0bGU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKCJkYXRhLW9yaWdpbmFsLXRpdGxlIik7cmV0dXJuIGV8fChlPSJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmNvbmZpZy50aXRsZT90aGlzLmNvbmZpZy50aXRsZS5jYWxsKHRoaXMuZWxlbWVudCk6dGhpcy5jb25maWcudGl0bGUpLGV9LHQuX2dldFBvcHBlckNvbmZpZz1mdW5jdGlvbihlKXt2YXIgdD10aGlzO3JldHVybiB1KHt9LHtwbGFjZW1lbnQ6ZSxtb2RpZmllcnM6e29mZnNldDp0aGlzLl9nZXRPZmZzZXQoKSxmbGlwOntiZWhhdmlvcjp0aGlzLmNvbmZpZy5mYWxsYmFja1BsYWNlbWVudH0sYXJyb3c6e2VsZW1lbnQ6Ii5hcnJvdyJ9LHByZXZlbnRPdmVyZmxvdzp7Ym91bmRhcmllc0VsZW1lbnQ6dGhpcy5jb25maWcuYm91bmRhcnl9fSxvbkNyZWF0ZTpmdW5jdGlvbihlKXtlLm9yaWdpbmFsUGxhY2VtZW50IT09ZS5wbGFjZW1lbnQmJnQuX2hhbmRsZVBvcHBlclBsYWNlbWVudENoYW5nZShlKX0sb25VcGRhdGU6ZnVuY3Rpb24oZSl7cmV0dXJuIHQuX2hhbmRsZVBvcHBlclBsYWNlbWVudENoYW5nZShlKX19LHRoaXMuY29uZmlnLnBvcHBlckNvbmZpZyl9LHQuX2dldE9mZnNldD1mdW5jdGlvbigpe3ZhciBlPXRoaXMsdD17fTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5jb25maWcub2Zmc2V0P3QuZm49ZnVuY3Rpb24odCl7cmV0dXJuIHQub2Zmc2V0cz11KHt9LHQub2Zmc2V0cyxlLmNvbmZpZy5vZmZzZXQodC5vZmZzZXRzLGUuZWxlbWVudCkpLHR9OnQub2Zmc2V0PXRoaXMuY29uZmlnLm9mZnNldCx0fSx0Ll9nZXRDb250YWluZXI9ZnVuY3Rpb24oKXtyZXR1cm4hMT09PXRoaXMuY29uZmlnLmNvbnRhaW5lcj9kb2N1bWVudC5ib2R5OmYuaXNFbGVtZW50KHRoaXMuY29uZmlnLmNvbnRhaW5lcik/aS5kZWZhdWx0KHRoaXMuY29uZmlnLmNvbnRhaW5lcik6aS5kZWZhdWx0KGRvY3VtZW50KS5maW5kKHRoaXMuY29uZmlnLmNvbnRhaW5lcil9LHQuX2dldEF0dGFjaG1lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIFZbZS50b1VwcGVyQ2FzZSgpXX0sdC5fc2V0TGlzdGVuZXJzPWZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLmNvbmZpZy50cmlnZ2VyLnNwbGl0KCIgIikuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYoImNsaWNrIj09PXQpaS5kZWZhdWx0KGUuZWxlbWVudCkub24oZS5jb25zdHJ1Y3Rvci5FdmVudC5DTElDSyxlLmNvbmZpZy5zZWxlY3RvciwoZnVuY3Rpb24odCl7cmV0dXJuIGUudG9nZ2xlKHQpfSkpO2Vsc2UgaWYoIm1hbnVhbCIhPT10KXt2YXIgbj0iaG92ZXIiPT09dD9lLmNvbnN0cnVjdG9yLkV2ZW50Lk1PVVNFRU5URVI6ZS5jb25zdHJ1Y3Rvci5FdmVudC5GT0NVU0lOLHI9ImhvdmVyIj09PXQ/ZS5jb25zdHJ1Y3Rvci5FdmVudC5NT1VTRUxFQVZFOmUuY29uc3RydWN0b3IuRXZlbnQuRk9DVVNPVVQ7aS5kZWZhdWx0KGUuZWxlbWVudCkub24obixlLmNvbmZpZy5zZWxlY3RvciwoZnVuY3Rpb24odCl7cmV0dXJuIGUuX2VudGVyKHQpfSkpLm9uKHIsZS5jb25maWcuc2VsZWN0b3IsKGZ1bmN0aW9uKHQpe3JldHVybiBlLl9sZWF2ZSh0KX0pKX19KSksdGhpcy5faGlkZU1vZGFsSGFuZGxlcj1mdW5jdGlvbigpe2UuZWxlbWVudCYmZS5oaWRlKCl9LGkuZGVmYXVsdCh0aGlzLmVsZW1lbnQpLmNsb3Nlc3QoIi5tb2RhbCIpLm9uKCJoaWRlLmJzLm1vZGFsIix0aGlzLl9oaWRlTW9kYWxIYW5kbGVyKSx0aGlzLmNvbmZpZy5zZWxlY3Rvcj90aGlzLmNvbmZpZz11KHt9LHRoaXMuY29uZmlnLHt0cmlnZ2VyOiJtYW51YWwiLHNlbGVjdG9yOiIifSk6dGhpcy5fZml4VGl0bGUoKX0sdC5fZml4VGl0bGU9ZnVuY3Rpb24oKXt2YXIgZT10eXBlb2YgdGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZSgiZGF0YS1vcmlnaW5hbC10aXRsZSIpOyh0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpfHwic3RyaW5nIiE9PWUpJiYodGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgiZGF0YS1vcmlnaW5hbC10aXRsZSIsdGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZSgidGl0bGUiKXx8IiIpLHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoInRpdGxlIiwiIikpfSx0Ll9lbnRlcj1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuY29uc3RydWN0b3IuREFUQV9LRVk7KHQ9dHx8aS5kZWZhdWx0KGUuY3VycmVudFRhcmdldCkuZGF0YShuKSl8fCh0PW5ldyB0aGlzLmNvbnN0cnVjdG9yKGUuY3VycmVudFRhcmdldCx0aGlzLl9nZXREZWxlZ2F0ZUNvbmZpZygpKSxpLmRlZmF1bHQoZS5jdXJyZW50VGFyZ2V0KS5kYXRhKG4sdCkpLGUmJih0Ll9hY3RpdmVUcmlnZ2VyWyJmb2N1c2luIj09PWUudHlwZT8iZm9jdXMiOiJob3ZlciJdPSEwKSxpLmRlZmF1bHQodC5nZXRUaXBFbGVtZW50KCkpLmhhc0NsYXNzKCJzaG93Iil8fCJzaG93Ij09PXQuX2hvdmVyU3RhdGU/dC5faG92ZXJTdGF0ZT0ic2hvdyI6KGNsZWFyVGltZW91dCh0Ll90aW1lb3V0KSx0Ll9ob3ZlclN0YXRlPSJzaG93Iix0LmNvbmZpZy5kZWxheSYmdC5jb25maWcuZGVsYXkuc2hvdz90Ll90aW1lb3V0PXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7InNob3ciPT09dC5faG92ZXJTdGF0ZSYmdC5zaG93KCl9KSx0LmNvbmZpZy5kZWxheS5zaG93KTp0LnNob3coKSl9LHQuX2xlYXZlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWTsodD10fHxpLmRlZmF1bHQoZS5jdXJyZW50VGFyZ2V0KS5kYXRhKG4pKXx8KHQ9bmV3IHRoaXMuY29uc3RydWN0b3IoZS5jdXJyZW50VGFyZ2V0LHRoaXMuX2dldERlbGVnYXRlQ29uZmlnKCkpLGkuZGVmYXVsdChlLmN1cnJlbnRUYXJnZXQpLmRhdGEobix0KSksZSYmKHQuX2FjdGl2ZVRyaWdnZXJbImZvY3Vzb3V0Ij09PWUudHlwZT8iZm9jdXMiOiJob3ZlciJdPSExKSx0Ll9pc1dpdGhBY3RpdmVUcmlnZ2VyKCl8fChjbGVhclRpbWVvdXQodC5fdGltZW91dCksdC5faG92ZXJTdGF0ZT0ib3V0Iix0LmNvbmZpZy5kZWxheSYmdC5jb25maWcuZGVsYXkuaGlkZT90Ll90aW1lb3V0PXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7Im91dCI9PT10Ll9ob3ZlclN0YXRlJiZ0LmhpZGUoKX0pLHQuY29uZmlnLmRlbGF5LmhpZGUpOnQuaGlkZSgpKX0sdC5faXNXaXRoQWN0aXZlVHJpZ2dlcj1mdW5jdGlvbigpe2Zvcih2YXIgZSBpbiB0aGlzLl9hY3RpdmVUcmlnZ2VyKWlmKHRoaXMuX2FjdGl2ZVRyaWdnZXJbZV0pcmV0dXJuITA7cmV0dXJuITF9LHQuX2dldENvbmZpZz1mdW5jdGlvbihlKXt2YXIgdD1pLmRlZmF1bHQodGhpcy5lbGVtZW50KS5kYXRhKCk7cmV0dXJuIE9iamVjdC5rZXlzKHQpLmZvckVhY2goKGZ1bmN0aW9uKGUpey0xIT09US5pbmRleE9mKGUpJiZkZWxldGUgdFtlXX0pKSwibnVtYmVyIj09dHlwZW9mKGU9dSh7fSx0aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHQsdCwib2JqZWN0Ij09dHlwZW9mIGUmJmU/ZTp7fSkpLmRlbGF5JiYoZS5kZWxheT17c2hvdzplLmRlbGF5LGhpZGU6ZS5kZWxheX0pLCJudW1iZXIiPT10eXBlb2YgZS50aXRsZSYmKGUudGl0bGU9ZS50aXRsZS50b1N0cmluZygpKSwibnVtYmVyIj09dHlwZW9mIGUuY29udGVudCYmKGUuY29udGVudD1lLmNvbnRlbnQudG9TdHJpbmcoKSksZi50eXBlQ2hlY2tDb25maWcoVyxlLHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFR5cGUpLGUuc2FuaXRpemUmJihlLnRlbXBsYXRlPUYoZS50ZW1wbGF0ZSxlLndoaXRlTGlzdCxlLnNhbml0aXplRm4pKSxlfSx0Ll9nZXREZWxlZ2F0ZUNvbmZpZz1mdW5jdGlvbigpe3ZhciBlPXt9O2lmKHRoaXMuY29uZmlnKWZvcih2YXIgdCBpbiB0aGlzLmNvbmZpZyl0aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHRbdF0hPT10aGlzLmNvbmZpZ1t0XSYmKGVbdF09dGhpcy5jb25maWdbdF0pO3JldHVybiBlfSx0Ll9jbGVhblRpcENsYXNzPWZ1bmN0aW9uKCl7dmFyIGU9aS5kZWZhdWx0KHRoaXMuZ2V0VGlwRWxlbWVudCgpKSx0PWUuYXR0cigiY2xhc3MiKS5tYXRjaCh6KTtudWxsIT09dCYmdC5sZW5ndGgmJmUucmVtb3ZlQ2xhc3ModC5qb2luKCIiKSl9LHQuX2hhbmRsZVBvcHBlclBsYWNlbWVudENoYW5nZT1mdW5jdGlvbihlKXt0aGlzLnRpcD1lLmluc3RhbmNlLnBvcHBlcix0aGlzLl9jbGVhblRpcENsYXNzKCksdGhpcy5hZGRBdHRhY2htZW50Q2xhc3ModGhpcy5fZ2V0QXR0YWNobWVudChlLnBsYWNlbWVudCkpfSx0Ll9maXhUcmFuc2l0aW9uPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRUaXBFbGVtZW50KCksdD10aGlzLmNvbmZpZy5hbmltYXRpb247bnVsbD09PWUuZ2V0QXR0cmlidXRlKCJ4LXBsYWNlbWVudCIpJiYoaS5kZWZhdWx0KGUpLnJlbW92ZUNsYXNzKCJmYWRlIiksdGhpcy5jb25maWcuYW5pbWF0aW9uPSExLHRoaXMuaGlkZSgpLHRoaXMuc2hvdygpLHRoaXMuY29uZmlnLmFuaW1hdGlvbj10KX0sZS5falF1ZXJ5SW50ZXJmYWNlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7dmFyIG49aS5kZWZhdWx0KHRoaXMpLHI9bi5kYXRhKCJicy50b29sdGlwIiksbz0ib2JqZWN0Ij09dHlwZW9mIHQmJnQ7aWYoKHJ8fCEvZGlzcG9zZXxoaWRlLy50ZXN0KHQpKSYmKHJ8fChyPW5ldyBlKHRoaXMsbyksbi5kYXRhKCJicy50b29sdGlwIixyKSksInN0cmluZyI9PXR5cGVvZiB0KSl7aWYodm9pZCAwPT09clt0XSl0aHJvdyBuZXcgVHlwZUVycm9yKCdObyBtZXRob2QgbmFtZWQgIicrdCsnIicpO3JbdF0oKX19KSl9LHMoZSxudWxsLFt7a2V5OiJWRVJTSU9OIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iNC42LjIifX0se2tleToiRGVmYXVsdCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEt9fSx7a2V5OiJOQU1FIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gV319LHtrZXk6IkRBVEFfS0VZIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iYnMudG9vbHRpcCJ9fSx7a2V5OiJFdmVudCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFl9fSx7a2V5OiJFVkVOVF9LRVkiLGdldDpmdW5jdGlvbigpe3JldHVybiIuYnMudG9vbHRpcCJ9fSx7a2V5OiJEZWZhdWx0VHlwZSIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFh9fV0pLGV9KCk7aS5kZWZhdWx0LmZuW1ddPUouX2pRdWVyeUludGVyZmFjZSxpLmRlZmF1bHQuZm5bV10uQ29uc3RydWN0b3I9SixpLmRlZmF1bHQuZm5bV10ubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiBpLmRlZmF1bHQuZm5bV109VSxKLl9qUXVlcnlJbnRlcmZhY2V9O3ZhciBHPSJwb3BvdmVyIixaPWkuZGVmYXVsdC5mbltHXSxlZT1uZXcgUmVnRXhwKCIoXnxcXHMpYnMtcG9wb3ZlclxcUysiLCJnIiksdGU9dSh7fSxKLkRlZmF1bHQse3BsYWNlbWVudDoicmlnaHQiLHRyaWdnZXI6ImNsaWNrIixjb250ZW50OiIiLHRlbXBsYXRlOic8ZGl2IGNsYXNzPSJwb3BvdmVyIiByb2xlPSJ0b29sdGlwIj48ZGl2IGNsYXNzPSJhcnJvdyI+PC9kaXY+PGgzIGNsYXNzPSJwb3BvdmVyLWhlYWRlciI+PC9oMz48ZGl2IGNsYXNzPSJwb3BvdmVyLWJvZHkiPjwvZGl2PjwvZGl2Pid9KSxuZT11KHt9LEouRGVmYXVsdFR5cGUse2NvbnRlbnQ6IihzdHJpbmd8ZWxlbWVudHxmdW5jdGlvbikifSkscmU9e0hJREU6ImhpZGUuYnMucG9wb3ZlciIsSElEREVOOiJoaWRkZW4uYnMucG9wb3ZlciIsU0hPVzoic2hvdy5icy5wb3BvdmVyIixTSE9XTjoic2hvd24uYnMucG9wb3ZlciIsSU5TRVJURUQ6Imluc2VydGVkLmJzLnBvcG92ZXIiLENMSUNLOiJjbGljay5icy5wb3BvdmVyIixGT0NVU0lOOiJmb2N1c2luLmJzLnBvcG92ZXIiLEZPQ1VTT1VUOiJmb2N1c291dC5icy5wb3BvdmVyIixNT1VTRUVOVEVSOiJtb3VzZWVudGVyLmJzLnBvcG92ZXIiLE1PVVNFTEVBVkU6Im1vdXNlbGVhdmUuYnMucG9wb3ZlciJ9LGllPWZ1bmN0aW9uKGUpe3ZhciB0LG47ZnVuY3Rpb24gcigpe3JldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31uPWUsKHQ9cikucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpLHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXQsbCh0LG4pO3ZhciBvPXIucHJvdG90eXBlO3JldHVybiBvLmlzV2l0aENvbnRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRUaXRsZSgpfHx0aGlzLl9nZXRDb250ZW50KCl9LG8uYWRkQXR0YWNobWVudENsYXNzPWZ1bmN0aW9uKGUpe2kuZGVmYXVsdCh0aGlzLmdldFRpcEVsZW1lbnQoKSkuYWRkQ2xhc3MoImJzLXBvcG92ZXItIitlKX0sby5nZXRUaXBFbGVtZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGlwPXRoaXMudGlwfHxpLmRlZmF1bHQodGhpcy5jb25maWcudGVtcGxhdGUpWzBdLHRoaXMudGlwfSxvLnNldENvbnRlbnQ9ZnVuY3Rpb24oKXt2YXIgZT1pLmRlZmF1bHQodGhpcy5nZXRUaXBFbGVtZW50KCkpO3RoaXMuc2V0RWxlbWVudENvbnRlbnQoZS5maW5kKCIucG9wb3Zlci1oZWFkZXIiKSx0aGlzLmdldFRpdGxlKCkpO3ZhciB0PXRoaXMuX2dldENvbnRlbnQoKTsiZnVuY3Rpb24iPT10eXBlb2YgdCYmKHQ9dC5jYWxsKHRoaXMuZWxlbWVudCkpLHRoaXMuc2V0RWxlbWVudENvbnRlbnQoZS5maW5kKCIucG9wb3Zlci1ib2R5IiksdCksZS5yZW1vdmVDbGFzcygiZmFkZSBzaG93Iil9LG8uX2dldENvbnRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZSgiZGF0YS1jb250ZW50Iil8fHRoaXMuY29uZmlnLmNvbnRlbnR9LG8uX2NsZWFuVGlwQ2xhc3M9ZnVuY3Rpb24oKXt2YXIgZT1pLmRlZmF1bHQodGhpcy5nZXRUaXBFbGVtZW50KCkpLHQ9ZS5hdHRyKCJjbGFzcyIpLm1hdGNoKGVlKTtudWxsIT09dCYmdC5sZW5ndGg+MCYmZS5yZW1vdmVDbGFzcyh0LmpvaW4oIiIpKX0sci5falF1ZXJ5SW50ZXJmYWNlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7dmFyIHQ9aS5kZWZhdWx0KHRoaXMpLmRhdGEoImJzLnBvcG92ZXIiKSxuPSJvYmplY3QiPT10eXBlb2YgZT9lOm51bGw7aWYoKHR8fCEvZGlzcG9zZXxoaWRlLy50ZXN0KGUpKSYmKHR8fCh0PW5ldyByKHRoaXMsbiksaS5kZWZhdWx0KHRoaXMpLmRhdGEoImJzLnBvcG92ZXIiLHQpKSwic3RyaW5nIj09dHlwZW9mIGUpKXtpZih2b2lkIDA9PT10W2VdKXRocm93IG5ldyBUeXBlRXJyb3IoJ05vIG1ldGhvZCBuYW1lZCAiJytlKyciJyk7dFtlXSgpfX0pKX0scyhyLG51bGwsW3trZXk6IlZFUlNJT04iLGdldDpmdW5jdGlvbigpe3JldHVybiI0LjYuMiJ9fSx7a2V5OiJEZWZhdWx0IixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGV9fSx7a2V5OiJOQU1FIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gR319LHtrZXk6IkRBVEFfS0VZIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iYnMucG9wb3ZlciJ9fSx7a2V5OiJFdmVudCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHJlfX0se2tleToiRVZFTlRfS0VZIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iLmJzLnBvcG92ZXIifX0se2tleToiRGVmYXVsdFR5cGUiLGdldDpmdW5jdGlvbigpe3JldHVybiBuZX19XSkscn0oSik7aS5kZWZhdWx0LmZuW0ddPWllLl9qUXVlcnlJbnRlcmZhY2UsaS5kZWZhdWx0LmZuW0ddLkNvbnN0cnVjdG9yPWllLGkuZGVmYXVsdC5mbltHXS5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIGkuZGVmYXVsdC5mbltHXT1aLGllLl9qUXVlcnlJbnRlcmZhY2V9O3ZhciBvZT0ic2Nyb2xsc3B5IixhZT1pLmRlZmF1bHQuZm5bb2VdLHNlPXtvZmZzZXQ6MTAsbWV0aG9kOiJhdXRvIix0YXJnZXQ6IiJ9LHVlPXtvZmZzZXQ6Im51bWJlciIsbWV0aG9kOiJzdHJpbmciLHRhcmdldDoiKHN0cmluZ3xlbGVtZW50KSJ9LGxlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe3ZhciBuPXRoaXM7dGhpcy5fZWxlbWVudD1lLHRoaXMuX3Njcm9sbEVsZW1lbnQ9IkJPRFkiPT09ZS50YWdOYW1lP3dpbmRvdzplLHRoaXMuX2NvbmZpZz10aGlzLl9nZXRDb25maWcodCksdGhpcy5fc2VsZWN0b3I9dGhpcy5fY29uZmlnLnRhcmdldCsiIC5uYXYtbGluaywiK3RoaXMuX2NvbmZpZy50YXJnZXQrIiAubGlzdC1ncm91cC1pdGVtLCIrdGhpcy5fY29uZmlnLnRhcmdldCsiIC5kcm9wZG93bi1pdGVtIix0aGlzLl9vZmZzZXRzPVtdLHRoaXMuX3RhcmdldHM9W10sdGhpcy5fYWN0aXZlVGFyZ2V0PW51bGwsdGhpcy5fc2Nyb2xsSGVpZ2h0PTAsaS5kZWZhdWx0KHRoaXMuX3Njcm9sbEVsZW1lbnQpLm9uKCJzY3JvbGwuYnMuc2Nyb2xsc3B5IiwoZnVuY3Rpb24oZSl7cmV0dXJuIG4uX3Byb2Nlc3MoZSl9KSksdGhpcy5yZWZyZXNoKCksdGhpcy5fcHJvY2VzcygpfXZhciB0PWUucHJvdG90eXBlO3JldHVybiB0LnJlZnJlc2g9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5fc2Nyb2xsRWxlbWVudD09PXRoaXMuX3Njcm9sbEVsZW1lbnQud2luZG93PyJvZmZzZXQiOiJwb3NpdGlvbiIsbj0iYXV0byI9PT10aGlzLl9jb25maWcubWV0aG9kP3Q6dGhpcy5fY29uZmlnLm1ldGhvZCxyPSJwb3NpdGlvbiI9PT1uP3RoaXMuX2dldFNjcm9sbFRvcCgpOjA7dGhpcy5fb2Zmc2V0cz1bXSx0aGlzLl90YXJnZXRzPVtdLHRoaXMuX3Njcm9sbEhlaWdodD10aGlzLl9nZXRTY3JvbGxIZWlnaHQoKSxbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5fc2VsZWN0b3IpKS5tYXAoKGZ1bmN0aW9uKGUpe3ZhciB0LG89Zi5nZXRTZWxlY3RvckZyb21FbGVtZW50KGUpO2lmKG8mJih0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IobykpLHQpe3ZhciBhPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoYS53aWR0aHx8YS5oZWlnaHQpcmV0dXJuW2kuZGVmYXVsdCh0KVtuXSgpLnRvcCtyLG9dfXJldHVybiBudWxsfSkpLmZpbHRlcihCb29sZWFuKS5zb3J0KChmdW5jdGlvbihlLHQpe3JldHVybiBlWzBdLXRbMF19KSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7ZS5fb2Zmc2V0cy5wdXNoKHRbMF0pLGUuX3RhcmdldHMucHVzaCh0WzFdKX0pKX0sdC5kaXNwb3NlPWZ1bmN0aW9uKCl7aS5kZWZhdWx0LnJlbW92ZURhdGEodGhpcy5fZWxlbWVudCwiYnMuc2Nyb2xsc3B5IiksaS5kZWZhdWx0KHRoaXMuX3Njcm9sbEVsZW1lbnQpLm9mZigiLmJzLnNjcm9sbHNweSIpLHRoaXMuX2VsZW1lbnQ9bnVsbCx0aGlzLl9zY3JvbGxFbGVtZW50PW51bGwsdGhpcy5fY29uZmlnPW51bGwsdGhpcy5fc2VsZWN0b3I9bnVsbCx0aGlzLl9vZmZzZXRzPW51bGwsdGhpcy5fdGFyZ2V0cz1udWxsLHRoaXMuX2FjdGl2ZVRhcmdldD1udWxsLHRoaXMuX3Njcm9sbEhlaWdodD1udWxsfSx0Ll9nZXRDb25maWc9ZnVuY3Rpb24oZSl7aWYoInN0cmluZyIhPXR5cGVvZihlPXUoe30sc2UsIm9iamVjdCI9PXR5cGVvZiBlJiZlP2U6e30pKS50YXJnZXQmJmYuaXNFbGVtZW50KGUudGFyZ2V0KSl7dmFyIHQ9aS5kZWZhdWx0KGUudGFyZ2V0KS5hdHRyKCJpZCIpO3R8fCh0PWYuZ2V0VUlEKG9lKSxpLmRlZmF1bHQoZS50YXJnZXQpLmF0dHIoImlkIix0KSksZS50YXJnZXQ9IiMiK3R9cmV0dXJuIGYudHlwZUNoZWNrQ29uZmlnKG9lLGUsdWUpLGV9LHQuX2dldFNjcm9sbFRvcD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zY3JvbGxFbGVtZW50PT09d2luZG93P3RoaXMuX3Njcm9sbEVsZW1lbnQucGFnZVlPZmZzZXQ6dGhpcy5fc2Nyb2xsRWxlbWVudC5zY3JvbGxUb3B9LHQuX2dldFNjcm9sbEhlaWdodD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zY3JvbGxFbGVtZW50LnNjcm9sbEhlaWdodHx8TWF0aC5tYXgoZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQsZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCl9LHQuX2dldE9mZnNldEhlaWdodD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zY3JvbGxFbGVtZW50PT09d2luZG93P3dpbmRvdy5pbm5lckhlaWdodDp0aGlzLl9zY3JvbGxFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodH0sdC5fcHJvY2Vzcz1mdW5jdGlvbigpe3ZhciBlPXRoaXMuX2dldFNjcm9sbFRvcCgpK3RoaXMuX2NvbmZpZy5vZmZzZXQsdD10aGlzLl9nZXRTY3JvbGxIZWlnaHQoKSxuPXRoaXMuX2NvbmZpZy5vZmZzZXQrdC10aGlzLl9nZXRPZmZzZXRIZWlnaHQoKTtpZih0aGlzLl9zY3JvbGxIZWlnaHQhPT10JiZ0aGlzLnJlZnJlc2goKSxlPj1uKXt2YXIgcj10aGlzLl90YXJnZXRzW3RoaXMuX3RhcmdldHMubGVuZ3RoLTFdO3RoaXMuX2FjdGl2ZVRhcmdldCE9PXImJnRoaXMuX2FjdGl2YXRlKHIpfWVsc2V7aWYodGhpcy5fYWN0aXZlVGFyZ2V0JiZlPHRoaXMuX29mZnNldHNbMF0mJnRoaXMuX29mZnNldHNbMF0+MClyZXR1cm4gdGhpcy5fYWN0aXZlVGFyZ2V0PW51bGwsdm9pZCB0aGlzLl9jbGVhcigpO2Zvcih2YXIgaT10aGlzLl9vZmZzZXRzLmxlbmd0aDtpLS07KXRoaXMuX2FjdGl2ZVRhcmdldCE9PXRoaXMuX3RhcmdldHNbaV0mJmU+PXRoaXMuX29mZnNldHNbaV0mJih2b2lkIDA9PT10aGlzLl9vZmZzZXRzW2krMV18fGU8dGhpcy5fb2Zmc2V0c1tpKzFdKSYmdGhpcy5fYWN0aXZhdGUodGhpcy5fdGFyZ2V0c1tpXSl9fSx0Ll9hY3RpdmF0ZT1mdW5jdGlvbihlKXt0aGlzLl9hY3RpdmVUYXJnZXQ9ZSx0aGlzLl9jbGVhcigpO3ZhciB0PXRoaXMuX3NlbGVjdG9yLnNwbGl0KCIsIikubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdCsnW2RhdGEtdGFyZ2V0PSInK2UrJyJdLCcrdCsnW2hyZWY9IicrZSsnIl0nfSkpLG49aS5kZWZhdWx0KFtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0LmpvaW4oIiwiKSkpKTtuLmhhc0NsYXNzKCJkcm9wZG93bi1pdGVtIik/KG4uY2xvc2VzdCgiLmRyb3Bkb3duIikuZmluZCgiLmRyb3Bkb3duLXRvZ2dsZSIpLmFkZENsYXNzKCJhY3RpdmUiKSxuLmFkZENsYXNzKCJhY3RpdmUiKSk6KG4uYWRkQ2xhc3MoImFjdGl2ZSIpLG4ucGFyZW50cygiLm5hdiwgLmxpc3QtZ3JvdXAiKS5wcmV2KCIubmF2LWxpbmssIC5saXN0LWdyb3VwLWl0ZW0iKS5hZGRDbGFzcygiYWN0aXZlIiksbi5wYXJlbnRzKCIubmF2LCAubGlzdC1ncm91cCIpLnByZXYoIi5uYXYtaXRlbSIpLmNoaWxkcmVuKCIubmF2LWxpbmsiKS5hZGRDbGFzcygiYWN0aXZlIikpLGkuZGVmYXVsdCh0aGlzLl9zY3JvbGxFbGVtZW50KS50cmlnZ2VyKCJhY3RpdmF0ZS5icy5zY3JvbGxzcHkiLHtyZWxhdGVkVGFyZ2V0OmV9KX0sdC5fY2xlYXI9ZnVuY3Rpb24oKXtbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5fc2VsZWN0b3IpKS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmNsYXNzTGlzdC5jb250YWlucygiYWN0aXZlIil9KSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIil9KSl9LGUuX2pRdWVyeUludGVyZmFjZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoKChmdW5jdGlvbigpe3ZhciBuPWkuZGVmYXVsdCh0aGlzKS5kYXRhKCJicy5zY3JvbGxzcHkiKTtpZihufHwobj1uZXcgZSh0aGlzLCJvYmplY3QiPT10eXBlb2YgdCYmdCksaS5kZWZhdWx0KHRoaXMpLmRhdGEoImJzLnNjcm9sbHNweSIsbikpLCJzdHJpbmciPT10eXBlb2YgdCl7aWYodm9pZCAwPT09blt0XSl0aHJvdyBuZXcgVHlwZUVycm9yKCdObyBtZXRob2QgbmFtZWQgIicrdCsnIicpO25bdF0oKX19KSl9LHMoZSxudWxsLFt7a2V5OiJWRVJTSU9OIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iNC42LjIifX0se2tleToiRGVmYXVsdCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHNlfX1dKSxlfSgpO2kuZGVmYXVsdCh3aW5kb3cpLm9uKCJsb2FkLmJzLnNjcm9sbHNweS5kYXRhLWFwaSIsKGZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtc3B5PSJzY3JvbGwiXScpKSx0PWUubGVuZ3RoO3QtLTspe3ZhciBuPWkuZGVmYXVsdChlW3RdKTtsZS5falF1ZXJ5SW50ZXJmYWNlLmNhbGwobixuLmRhdGEoKSl9fSkpLGkuZGVmYXVsdC5mbltvZV09bGUuX2pRdWVyeUludGVyZmFjZSxpLmRlZmF1bHQuZm5bb2VdLkNvbnN0cnVjdG9yPWxlLGkuZGVmYXVsdC5mbltvZV0ubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiBpLmRlZmF1bHQuZm5bb2VdPWFlLGxlLl9qUXVlcnlJbnRlcmZhY2V9O3ZhciBjZT1pLmRlZmF1bHQuZm4udGFiLGZlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXt0aGlzLl9lbGVtZW50PWV9dmFyIHQ9ZS5wcm90b3R5cGU7cmV0dXJuIHQuc2hvdz1mdW5jdGlvbigpe3ZhciBlPXRoaXM7aWYoISh0aGlzLl9lbGVtZW50LnBhcmVudE5vZGUmJnRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZS5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFJiZpLmRlZmF1bHQodGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoImFjdGl2ZSIpfHxpLmRlZmF1bHQodGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoImRpc2FibGVkIil8fHRoaXMuX2VsZW1lbnQuaGFzQXR0cmlidXRlKCJkaXNhYmxlZCIpKSl7dmFyIHQsbixyPWkuZGVmYXVsdCh0aGlzLl9lbGVtZW50KS5jbG9zZXN0KCIubmF2LCAubGlzdC1ncm91cCIpWzBdLG89Zi5nZXRTZWxlY3RvckZyb21FbGVtZW50KHRoaXMuX2VsZW1lbnQpO2lmKHIpe3ZhciBhPSJVTCI9PT1yLm5vZGVOYW1lfHwiT0wiPT09ci5ub2RlTmFtZT8iPiBsaSA+IC5hY3RpdmUiOiIuYWN0aXZlIjtuPShuPWkuZGVmYXVsdC5tYWtlQXJyYXkoaS5kZWZhdWx0KHIpLmZpbmQoYSkpKVtuLmxlbmd0aC0xXX12YXIgcz1pLmRlZmF1bHQuRXZlbnQoImhpZGUuYnMudGFiIix7cmVsYXRlZFRhcmdldDp0aGlzLl9lbGVtZW50fSksdT1pLmRlZmF1bHQuRXZlbnQoInNob3cuYnMudGFiIix7cmVsYXRlZFRhcmdldDpufSk7aWYobiYmaS5kZWZhdWx0KG4pLnRyaWdnZXIocyksaS5kZWZhdWx0KHRoaXMuX2VsZW1lbnQpLnRyaWdnZXIodSksIXUuaXNEZWZhdWx0UHJldmVudGVkKCkmJiFzLmlzRGVmYXVsdFByZXZlbnRlZCgpKXtvJiYodD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKG8pKSx0aGlzLl9hY3RpdmF0ZSh0aGlzLl9lbGVtZW50LHIpO3ZhciBsPWZ1bmN0aW9uKCl7dmFyIHQ9aS5kZWZhdWx0LkV2ZW50KCJoaWRkZW4uYnMudGFiIix7cmVsYXRlZFRhcmdldDplLl9lbGVtZW50fSkscj1pLmRlZmF1bHQuRXZlbnQoInNob3duLmJzLnRhYiIse3JlbGF0ZWRUYXJnZXQ6bn0pO2kuZGVmYXVsdChuKS50cmlnZ2VyKHQpLGkuZGVmYXVsdChlLl9lbGVtZW50KS50cmlnZ2VyKHIpfTt0P3RoaXMuX2FjdGl2YXRlKHQsdC5wYXJlbnROb2RlLGwpOmwoKX19fSx0LmRpc3Bvc2U9ZnVuY3Rpb24oKXtpLmRlZmF1bHQucmVtb3ZlRGF0YSh0aGlzLl9lbGVtZW50LCJicy50YWIiKSx0aGlzLl9lbGVtZW50PW51bGx9LHQuX2FjdGl2YXRlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLG89KCF0fHwiVUwiIT09dC5ub2RlTmFtZSYmIk9MIiE9PXQubm9kZU5hbWU/aS5kZWZhdWx0KHQpLmNoaWxkcmVuKCIuYWN0aXZlIik6aS5kZWZhdWx0KHQpLmZpbmQoIj4gbGkgPiAuYWN0aXZlIikpWzBdLGE9biYmbyYmaS5kZWZhdWx0KG8pLmhhc0NsYXNzKCJmYWRlIikscz1mdW5jdGlvbigpe3JldHVybiByLl90cmFuc2l0aW9uQ29tcGxldGUoZSxvLG4pfTtpZihvJiZhKXt2YXIgdT1mLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KG8pO2kuZGVmYXVsdChvKS5yZW1vdmVDbGFzcygic2hvdyIpLm9uZShmLlRSQU5TSVRJT05fRU5ELHMpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKHUpfWVsc2UgcygpfSx0Ll90cmFuc2l0aW9uQ29tcGxldGU9ZnVuY3Rpb24oZSx0LG4pe2lmKHQpe2kuZGVmYXVsdCh0KS5yZW1vdmVDbGFzcygiYWN0aXZlIik7dmFyIHI9aS5kZWZhdWx0KHQucGFyZW50Tm9kZSkuZmluZCgiPiAuZHJvcGRvd24tbWVudSAuYWN0aXZlIilbMF07ciYmaS5kZWZhdWx0KHIpLnJlbW92ZUNsYXNzKCJhY3RpdmUiKSwidGFiIj09PXQuZ2V0QXR0cmlidXRlKCJyb2xlIikmJnQuc2V0QXR0cmlidXRlKCJhcmlhLXNlbGVjdGVkIiwhMSl9aS5kZWZhdWx0KGUpLmFkZENsYXNzKCJhY3RpdmUiKSwidGFiIj09PWUuZ2V0QXR0cmlidXRlKCJyb2xlIikmJmUuc2V0QXR0cmlidXRlKCJhcmlhLXNlbGVjdGVkIiwhMCksZi5yZWZsb3coZSksZS5jbGFzc0xpc3QuY29udGFpbnMoImZhZGUiKSYmZS5jbGFzc0xpc3QuYWRkKCJzaG93Iik7dmFyIG89ZS5wYXJlbnROb2RlO2lmKG8mJiJMSSI9PT1vLm5vZGVOYW1lJiYobz1vLnBhcmVudE5vZGUpLG8mJmkuZGVmYXVsdChvKS5oYXNDbGFzcygiZHJvcGRvd24tbWVudSIpKXt2YXIgYT1pLmRlZmF1bHQoZSkuY2xvc2VzdCgiLmRyb3Bkb3duIilbMF07aWYoYSl7dmFyIHM9W10uc2xpY2UuY2FsbChhLnF1ZXJ5U2VsZWN0b3JBbGwoIi5kcm9wZG93bi10b2dnbGUiKSk7aS5kZWZhdWx0KHMpLmFkZENsYXNzKCJhY3RpdmUiKX1lLnNldEF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIsITApfW4mJm4oKX0sZS5falF1ZXJ5SW50ZXJmYWNlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7dmFyIG49aS5kZWZhdWx0KHRoaXMpLHI9bi5kYXRhKCJicy50YWIiKTtpZihyfHwocj1uZXcgZSh0aGlzKSxuLmRhdGEoImJzLnRhYiIscikpLCJzdHJpbmciPT10eXBlb2YgdCl7aWYodm9pZCAwPT09clt0XSl0aHJvdyBuZXcgVHlwZUVycm9yKCdObyBtZXRob2QgbmFtZWQgIicrdCsnIicpO3JbdF0oKX19KSl9LHMoZSxudWxsLFt7a2V5OiJWRVJTSU9OIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iNC42LjIifX1dKSxlfSgpO2kuZGVmYXVsdChkb2N1bWVudCkub24oImNsaWNrLmJzLnRhYi5kYXRhLWFwaSIsJ1tkYXRhLXRvZ2dsZT0idGFiIl0sIFtkYXRhLXRvZ2dsZT0icGlsbCJdLCBbZGF0YS10b2dnbGU9Imxpc3QiXScsKGZ1bmN0aW9uKGUpe2UucHJldmVudERlZmF1bHQoKSxmZS5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoaS5kZWZhdWx0KHRoaXMpLCJzaG93Iil9KSksaS5kZWZhdWx0LmZuLnRhYj1mZS5falF1ZXJ5SW50ZXJmYWNlLGkuZGVmYXVsdC5mbi50YWIuQ29uc3RydWN0b3I9ZmUsaS5kZWZhdWx0LmZuLnRhYi5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIGkuZGVmYXVsdC5mbi50YWI9Y2UsZmUuX2pRdWVyeUludGVyZmFjZX07dmFyIGRlPSJ0b2FzdCIsaGU9aS5kZWZhdWx0LmZuW2RlXSxwZT17YW5pbWF0aW9uOiEwLGF1dG9oaWRlOiEwLGRlbGF5OjUwMH0sZ2U9e2FuaW1hdGlvbjoiYm9vbGVhbiIsYXV0b2hpZGU6ImJvb2xlYW4iLGRlbGF5OiJudW1iZXIifSx2ZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXt0aGlzLl9lbGVtZW50PWUsdGhpcy5fY29uZmlnPXRoaXMuX2dldENvbmZpZyh0KSx0aGlzLl90aW1lb3V0PW51bGwsdGhpcy5fc2V0TGlzdGVuZXJzKCl9dmFyIHQ9ZS5wcm90b3R5cGU7cmV0dXJuIHQuc2hvdz1mdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1pLmRlZmF1bHQuRXZlbnQoInNob3cuYnMudG9hc3QiKTtpZihpLmRlZmF1bHQodGhpcy5fZWxlbWVudCkudHJpZ2dlcih0KSwhdC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSl7dGhpcy5fY2xlYXJUaW1lb3V0KCksdGhpcy5fY29uZmlnLmFuaW1hdGlvbiYmdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKCJmYWRlIik7dmFyIG49ZnVuY3Rpb24oKXtlLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoInNob3dpbmciKSxlLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoInNob3ciKSxpLmRlZmF1bHQoZS5fZWxlbWVudCkudHJpZ2dlcigic2hvd24uYnMudG9hc3QiKSxlLl9jb25maWcuYXV0b2hpZGUmJihlLl90aW1lb3V0PXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZS5oaWRlKCl9KSxlLl9jb25maWcuZGVsYXkpKX07aWYodGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCJoaWRlIiksZi5yZWZsb3codGhpcy5fZWxlbWVudCksdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKCJzaG93aW5nIiksdGhpcy5fY29uZmlnLmFuaW1hdGlvbil7dmFyIHI9Zi5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCh0aGlzLl9lbGVtZW50KTtpLmRlZmF1bHQodGhpcy5fZWxlbWVudCkub25lKGYuVFJBTlNJVElPTl9FTkQsbikuZW11bGF0ZVRyYW5zaXRpb25FbmQocil9ZWxzZSBuKCl9fSx0LmhpZGU9ZnVuY3Rpb24oKXtpZih0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygic2hvdyIpKXt2YXIgZT1pLmRlZmF1bHQuRXZlbnQoImhpZGUuYnMudG9hc3QiKTtpLmRlZmF1bHQodGhpcy5fZWxlbWVudCkudHJpZ2dlcihlKSxlLmlzRGVmYXVsdFByZXZlbnRlZCgpfHx0aGlzLl9jbG9zZSgpfX0sdC5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5fY2xlYXJUaW1lb3V0KCksdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKSYmdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCJzaG93IiksaS5kZWZhdWx0KHRoaXMuX2VsZW1lbnQpLm9mZigiY2xpY2suZGlzbWlzcy5icy50b2FzdCIpLGkuZGVmYXVsdC5yZW1vdmVEYXRhKHRoaXMuX2VsZW1lbnQsImJzLnRvYXN0IiksdGhpcy5fZWxlbWVudD1udWxsLHRoaXMuX2NvbmZpZz1udWxsfSx0Ll9nZXRDb25maWc9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9dSh7fSxwZSxpLmRlZmF1bHQodGhpcy5fZWxlbWVudCkuZGF0YSgpLCJvYmplY3QiPT10eXBlb2YgZSYmZT9lOnt9KSxmLnR5cGVDaGVja0NvbmZpZyhkZSxlLHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFR5cGUpLGV9LHQuX3NldExpc3RlbmVycz1mdW5jdGlvbigpe3ZhciBlPXRoaXM7aS5kZWZhdWx0KHRoaXMuX2VsZW1lbnQpLm9uKCJjbGljay5kaXNtaXNzLmJzLnRvYXN0IiwnW2RhdGEtZGlzbWlzcz0idG9hc3QiXScsKGZ1bmN0aW9uKCl7cmV0dXJuIGUuaGlkZSgpfSkpfSx0Ll9jbG9zZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1mdW5jdGlvbigpe2UuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZCgiaGlkZSIpLGkuZGVmYXVsdChlLl9lbGVtZW50KS50cmlnZ2VyKCJoaWRkZW4uYnMudG9hc3QiKX07aWYodGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCJzaG93IiksdGhpcy5fY29uZmlnLmFuaW1hdGlvbil7dmFyIG49Zi5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCh0aGlzLl9lbGVtZW50KTtpLmRlZmF1bHQodGhpcy5fZWxlbWVudCkub25lKGYuVFJBTlNJVElPTl9FTkQsdCkuZW11bGF0ZVRyYW5zaXRpb25FbmQobil9ZWxzZSB0KCl9LHQuX2NsZWFyVGltZW91dD1mdW5jdGlvbigpe2NsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KSx0aGlzLl90aW1lb3V0PW51bGx9LGUuX2pRdWVyeUludGVyZmFjZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoKChmdW5jdGlvbigpe3ZhciBuPWkuZGVmYXVsdCh0aGlzKSxyPW4uZGF0YSgiYnMudG9hc3QiKTtpZihyfHwocj1uZXcgZSh0aGlzLCJvYmplY3QiPT10eXBlb2YgdCYmdCksbi5kYXRhKCJicy50b2FzdCIscikpLCJzdHJpbmciPT10eXBlb2YgdCl7aWYodm9pZCAwPT09clt0XSl0aHJvdyBuZXcgVHlwZUVycm9yKCdObyBtZXRob2QgbmFtZWQgIicrdCsnIicpO3JbdF0odGhpcyl9fSkpfSxzKGUsbnVsbCxbe2tleToiVkVSU0lPTiIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIjQuNi4yIn19LHtrZXk6IkRlZmF1bHRUeXBlIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZ2V9fSx7a2V5OiJEZWZhdWx0IixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcGV9fV0pLGV9KCk7aS5kZWZhdWx0LmZuW2RlXT12ZS5falF1ZXJ5SW50ZXJmYWNlLGkuZGVmYXVsdC5mbltkZV0uQ29uc3RydWN0b3I9dmUsaS5kZWZhdWx0LmZuW2RlXS5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIGkuZGVmYXVsdC5mbltkZV09aGUsdmUuX2pRdWVyeUludGVyZmFjZX0sZS5BbGVydD1oLGUuQnV0dG9uPWcsZS5DYXJvdXNlbD14LGUuQ29sbGFwc2U9ayxlLkRyb3Bkb3duPUwsZS5Nb2RhbD0kLGUuUG9wb3Zlcj1pZSxlLlNjcm9sbHNweT1sZSxlLlRhYj1mZSxlLlRvYXN0PXZlLGUuVG9vbHRpcD1KLGUuVXRpbD1mLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0odCxuKCJFVmRuIiksbigiOEwzRiIpKX0sU250QjpmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oInhUSisiKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt0PXR8fHt9O3ZhciBuPXt9LGk9WyJ1cmwiLCJtZXRob2QiLCJwYXJhbXMiLCJkYXRhIl0sbz1bImhlYWRlcnMiLCJhdXRoIiwicHJveHkiXSxhPVsiYmFzZVVSTCIsInVybCIsInRyYW5zZm9ybVJlcXVlc3QiLCJ0cmFuc2Zvcm1SZXNwb25zZSIsInBhcmFtc1NlcmlhbGl6ZXIiLCJ0aW1lb3V0Iiwid2l0aENyZWRlbnRpYWxzIiwiYWRhcHRlciIsInJlc3BvbnNlVHlwZSIsInhzcmZDb29raWVOYW1lIiwieHNyZkhlYWRlck5hbWUiLCJvblVwbG9hZFByb2dyZXNzIiwib25Eb3dubG9hZFByb2dyZXNzIiwibWF4Q29udGVudExlbmd0aCIsInZhbGlkYXRlU3RhdHVzIiwibWF4UmVkaXJlY3RzIiwiaHR0cEFnZW50IiwiaHR0cHNBZ2VudCIsImNhbmNlbFRva2VuIiwic29ja2V0UGF0aCJdO3IuZm9yRWFjaChpLChmdW5jdGlvbihlKXt2b2lkIDAhPT10W2VdJiYobltlXT10W2VdKX0pKSxyLmZvckVhY2gobywoZnVuY3Rpb24oaSl7ci5pc09iamVjdCh0W2ldKT9uW2ldPXIuZGVlcE1lcmdlKGVbaV0sdFtpXSk6dm9pZCAwIT09dFtpXT9uW2ldPXRbaV06ci5pc09iamVjdChlW2ldKT9uW2ldPXIuZGVlcE1lcmdlKGVbaV0pOnZvaWQgMCE9PWVbaV0mJihuW2ldPWVbaV0pfSkpLHIuZm9yRWFjaChhLChmdW5jdGlvbihyKXt2b2lkIDAhPT10W3JdP25bcl09dFtyXTp2b2lkIDAhPT1lW3JdJiYobltyXT1lW3JdKX0pKTt2YXIgcz1pLmNvbmNhdChvKS5jb25jYXQoYSksdT1PYmplY3Qua2V5cyh0KS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybi0xPT09cy5pbmRleE9mKGUpfSkpO3JldHVybiByLmZvckVhY2godSwoZnVuY3Rpb24ocil7dm9pZCAwIT09dFtyXT9uW3JdPXRbcl06dm9pZCAwIT09ZVtyXSYmKG5bcl09ZVtyXSl9KSksbn19LFVuQks6ZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKCJ4VEorIiksaT1uKCJ4QUdRIiksbz1uKCJMbWVtIiksYT1uKCJKRVFyIik7ZnVuY3Rpb24gcyhlKXtlLmNhbmNlbFRva2VuJiZlLmNhbmNlbFRva2VuLnRocm93SWZSZXF1ZXN0ZWQoKX1lLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIHMoZSksZS5oZWFkZXJzPWUuaGVhZGVyc3x8e30sZS5kYXRhPWkoZS5kYXRhLGUuaGVhZGVycyxlLnRyYW5zZm9ybVJlcXVlc3QpLGUuaGVhZGVycz1yLm1lcmdlKGUuaGVhZGVycy5jb21tb258fHt9LGUuaGVhZGVyc1tlLm1ldGhvZF18fHt9LGUuaGVhZGVycyksci5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsInBvc3QiLCJwdXQiLCJwYXRjaCIsImNvbW1vbiJdLChmdW5jdGlvbih0KXtkZWxldGUgZS5oZWFkZXJzW3RdfSkpLChlLmFkYXB0ZXJ8fGEuYWRhcHRlcikoZSkudGhlbigoZnVuY3Rpb24odCl7cmV0dXJuIHMoZSksdC5kYXRhPWkodC5kYXRhLHQuaGVhZGVycyxlLnRyYW5zZm9ybVJlc3BvbnNlKSx0fSksKGZ1bmN0aW9uKHQpe3JldHVybiBvKHQpfHwocyhlKSx0JiZ0LnJlc3BvbnNlJiYodC5yZXNwb25zZS5kYXRhPWkodC5yZXNwb25zZS5kYXRhLHQucmVzcG9uc2UuaGVhZGVycyxlLnRyYW5zZm9ybVJlc3BvbnNlKSkpLFByb21pc2UucmVqZWN0KHQpfSkpfX0sWXVUaTpmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gZS53ZWJwYWNrUG9seWZpbGx8fChlLmRlcHJlY2F0ZT1mdW5jdGlvbigpe30sZS5wYXRocz1bXSxlLmNoaWxkcmVufHwoZS5jaGlsZHJlbj1bXSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImxvYWRlZCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGUubH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiaWQiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBlLml9fSksZS53ZWJwYWNrUG9seWZpbGw9MSksZX19LGJVQzU6ZnVuY3Rpb24oZSx0LG4pe24oIjlXaDEiKSxuKCJkajJpIiksJCgiYm9keSIpLnRvb2x0aXAoe3NlbGVjdG9yOidbZGF0YS10b2dnbGU9InRvb2x0aXAiXScsaHRtbDohMH0pLm9uKCJjbGljayIsJ1tkYXRhLXRvZ2dsZT0idG9vbHRpcCJdJywoZnVuY3Rpb24oKXskKHRoaXMpLnRvb2x0aXAoImhpZGUiKX0pKX0sZGoyaTpmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oZSl7cmV0dXJuKG49ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBlfTpmdW5jdGlvbihlKXtyZXR1cm4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmZS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmZSE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIGV9KShlKX1qUXVlcnkudHJ1bWJvd3lnPXtsYW5nczp7ZW46e3ZpZXdIVE1MOiJWaWV3IEhUTUwiLHVuZG86IlVuZG8iLHJlZG86IlJlZG8iLGZvcm1hdHRpbmc6IkZvcm1hdHRpbmciLHA6IlBhcmFncmFwaCIsYmxvY2txdW90ZToiUXVvdGUiLGNvZGU6IkNvZGUiLGhlYWRlcjoiSGVhZGVyIixib2xkOiJCb2xkIixpdGFsaWM6Ikl0YWxpYyIsc3RyaWtldGhyb3VnaDoiU3RyaWtldGhyb3VnaCIsdW5kZXJsaW5lOiJVbmRlcmxpbmUiLHN0cm9uZzoiU3Ryb25nIixlbToiRW1waGFzaXMiLGRlbDoiRGVsZXRlZCIsc3VwZXJzY3JpcHQ6IlN1cGVyc2NyaXB0IixzdWJzY3JpcHQ6IlN1YnNjcmlwdCIsdW5vcmRlcmVkTGlzdDoiVW5vcmRlcmVkIGxpc3QiLG9yZGVyZWRMaXN0OiJPcmRlcmVkIGxpc3QiLGluc2VydEltYWdlOiJJbnNlcnQgSW1hZ2UiLGxpbms6IkxpbmsiLGNyZWF0ZUxpbms6Ikluc2VydCBsaW5rIix1bmxpbms6IlJlbW92ZSBsaW5rIixfc2VsZjoiU2FtZSB0YWIgKGRlZmF1bHQpIixfYmxhbms6Ik5ldyB0YWIiLGp1c3RpZnlMZWZ0OiJBbGlnbiBMZWZ0IixqdXN0aWZ5Q2VudGVyOiJBbGlnbiBDZW50ZXIiLGp1c3RpZnlSaWdodDoiQWxpZ24gUmlnaHQiLGp1c3RpZnlGdWxsOiJBbGlnbiBKdXN0aWZ5Iixob3Jpem9udGFsUnVsZToiSW5zZXJ0IGhvcml6b250YWwgcnVsZSIscmVtb3ZlZm9ybWF0OiJSZW1vdmUgZm9ybWF0IixmdWxsc2NyZWVuOiJGdWxsc2NyZWVuIixjbG9zZToiQ2xvc2UiLHN1Ym1pdDoiQ29uZmlybSIscmVzZXQ6IkNhbmNlbCIscmVxdWlyZWQ6IlJlcXVpcmVkIixkZXNjcmlwdGlvbjoiRGVzY3JpcHRpb24iLHRpdGxlOiJUaXRsZSIsdGV4dDoiVGV4dCIsdGFyZ2V0OiJUYXJnZXQiLHdpZHRoOiJXaWR0aCJ9fSxwbHVnaW5zOnt9LHN2Z1BhdGg6bnVsbCxzdmdBYnNvbHV0ZVVzZUhyZWY6ITEsaGlkZUJ1dHRvblRleHRzOm51bGx9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShqUXVlcnkudHJ1bWJvd3lnLCJkZWZhdWx0T3B0aW9ucyIse3ZhbHVlOntsYW5nOiJlbiIsZml4ZWRCdG5QYW5lOiExLGZpeGVkRnVsbFdpZHRoOiExLGF1dG9ncm93OiExLGF1dG9ncm93T25FbnRlcjohMSxpbWFnZVdpZHRoTW9kYWxFZGl0OiExLGhpZGVCdXR0b25UZXh0czpudWxsLHByZWZpeDoidHJ1bWJvd3lnLSIsdGFnQ2xhc3Nlczp7fSxzZW1hbnRpYzohMCxzZW1hbnRpY0tlZXBBdHRyaWJ1dGVzOiExLHJlc2V0Q3NzOiExLHJlbW92ZWZvcm1hdFBhc3RlZDohMSx0YWJUb0luZGVudDohMSx0YWdzVG9SZW1vdmU6W10sdGFnc1RvS2VlcDpbImhyIiwiaW1nIiwiZW1iZWQiLCJpZnJhbWUiLCJpbnB1dCJdLGJ0bnM6W1sidmlld0hUTUwiXSxbInVuZG8iLCJyZWRvIl0sWyJmb3JtYXR0aW5nIl0sWyJzdHJvbmciLCJlbSIsImRlbCJdLFsic3VwZXJzY3JpcHQiLCJzdWJzY3JpcHQiXSxbImxpbmsiXSxbImluc2VydEltYWdlIl0sWyJqdXN0aWZ5TGVmdCIsImp1c3RpZnlDZW50ZXIiLCJqdXN0aWZ5UmlnaHQiLCJqdXN0aWZ5RnVsbCJdLFsidW5vcmRlcmVkTGlzdCIsIm9yZGVyZWRMaXN0Il0sWyJob3Jpem9udGFsUnVsZSJdLFsicmVtb3ZlZm9ybWF0Il0sWyJmdWxsc2NyZWVuIl1dLGJ0bnNEZWY6e30sY2hhbmdlQWN0aXZlRHJvcGRvd25JY29uOiExLGlubGluZUVsZW1lbnRzU2VsZWN0b3I6ImEsYWJicixhY3JvbnltLGIsY2FwdGlvbixjaXRlLGNvZGUsY29sLGRmbixkaXIsZHQsZGQsZW0sZm9udCxocixpLGtiZCxsaSxxLHNwYW4sc3RyaWtlb3V0LHN0cm9uZyxzdWIsc3VwLHUiLHBhc3RlSGFuZGxlcnM6W10scGx1Z2luczp7fSx1cmxQcm90b2NvbDohMSxtaW5pbWFsTGlua3M6ITEsbGlua1RhcmdldHM6WyJfc2VsZiIsIl9ibGFuayJdLHN2Z1BhdGg6bnVsbH0sd3JpdGFibGU6ITEsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITF9KSxmdW5jdGlvbihlLHQscixpKXsidXNlIHN0cmljdCI7dmFyIG89InRid2NvbmZpcm0iLGE9InRid2NhbmNlbCI7aS5mbi50cnVtYm93eWc9ZnVuY3Rpb24oZSx0KXt2YXIgbj0idHJ1bWJvd3lnIjtpZihlPT09T2JqZWN0KGUpfHwhZSlyZXR1cm4gdGhpcy5lYWNoKChmdW5jdGlvbigpe2kodGhpcykuZGF0YShuKXx8aSh0aGlzKS5kYXRhKG4sbmV3IHModGhpcyxlKSl9KSk7aWYoMT09PXRoaXMubGVuZ3RoKXRyeXt2YXIgcj1pKHRoaXMpLmRhdGEobik7c3dpdGNoKGUpe2Nhc2UiZXhlY0NtZCI6cmV0dXJuIHIuZXhlY0NtZCh0LmNtZCx0LnBhcmFtLHQuZm9yY2VDc3MsdC5za2lwVHJ1bWJvd3lnKTtjYXNlIm9wZW5Nb2RhbCI6cmV0dXJuIHIub3Blbk1vZGFsKHQudGl0bGUsdC5jb250ZW50KTtjYXNlImNsb3NlTW9kYWwiOnJldHVybiByLmNsb3NlTW9kYWwoKTtjYXNlIm9wZW5Nb2RhbEluc2VydCI6cmV0dXJuIHIub3Blbk1vZGFsSW5zZXJ0KHQudGl0bGUsdC5maWVsZHMsdC5jYWxsYmFjayk7Y2FzZSJzYXZlUmFuZ2UiOnJldHVybiByLnNhdmVSYW5nZSgpO2Nhc2UiZ2V0UmFuZ2UiOnJldHVybiByLnJhbmdlO2Nhc2UiZ2V0UmFuZ2VUZXh0IjpyZXR1cm4gci5nZXRSYW5nZVRleHQoKTtjYXNlInJlc3RvcmVSYW5nZSI6cmV0dXJuIHIucmVzdG9yZVJhbmdlKCk7Y2FzZSJlbmFibGUiOnJldHVybiByLnNldERpc2FibGVkKCExKTtjYXNlImRpc2FibGUiOnJldHVybiByLnNldERpc2FibGVkKCEwKTtjYXNlInRvZ2dsZSI6cmV0dXJuIHIudG9nZ2xlKCk7Y2FzZSJkZXN0cm95IjpyZXR1cm4gci5kZXN0cm95KCk7Y2FzZSJlbXB0eSI6cmV0dXJuIHIuZW1wdHkoKTtjYXNlImh0bWwiOnJldHVybiByLmh0bWwodCl9fWNhdGNoKGUpe31yZXR1cm4hMX07dmFyIHM9ZnVuY3Rpb24obixvKXt2YXIgYT10aGlzLHM9aS50cnVtYm93eWc7YS5kb2M9bi5vd25lckRvY3VtZW50fHxyLGEuJHRhPWkobiksYS4kYz1pKG4pLG51bGwhPShvPW98fHt9KS5sYW5nfHxudWxsIT1zLmxhbmdzW28ubGFuZ10/YS5sYW5nPWkuZXh0ZW5kKCEwLHt9LHMubGFuZ3MuZW4scy5sYW5nc1tvLmxhbmddKTphLmxhbmc9cy5sYW5ncy5lbixhLmhpZGVCdXR0b25UZXh0cz1udWxsIT1zLmhpZGVCdXR0b25UZXh0cz9zLmhpZGVCdXR0b25UZXh0czpvLmhpZGVCdXR0b25UZXh0czt2YXIgdT1udWxsIT1zLnN2Z1BhdGg/cy5zdmdQYXRoOm8uc3ZnUGF0aDtpZihhLmhhc1N2Zz0hMSE9PXUsITEhPT11JiYocy5zdmdBYnNvbHV0ZVVzZUhyZWZ8fDA9PT1pKCIjdHJ1bWJvd3lnLWljb25zIixhLmRvYykubGVuZ3RoKSlpZihudWxsPT11JiZpKCJzY3JpcHRbc3JjXSIpLmVhY2goKGZ1bmN0aW9uKGUsdCl7dmFyIG49dC5zcmMscj1uLm1hdGNoKCJ0cnVtYm93eWcoLm1pbik/LmpzIik7bnVsbCE9ciYmKHU9bi5zdWJzdHJpbmcoMCxuLmluZGV4T2YoclswXSkpKyJ1aS9pY29ucy5zdmciKX0pKSxudWxsPT11KWNvbnNvbGUud2FybigiWW91IG11c3QgZGVmaW5lIHN2Z1BhdGg6IGh0dHBzOi8vZ29vLmdsL0NmVFk5VSIpO2Vsc2UgaWYoIXMuc3ZnQWJzb2x1dGVVc2VIcmVmKXt2YXIgbD1hLmRvYy5jcmVhdGVFbGVtZW50KCJkaXYiKTtsLmlkPSJ0cnVtYm93eWctaWNvbnMiLGEuZG9jLmJvZHkuaW5zZXJ0QmVmb3JlKGwsYS5kb2MuYm9keS5jaGlsZE5vZGVzWzBdKSxpLmFqYXgoe2FzeW5jOiEwLHR5cGU6IkdFVCIsY29udGVudFR5cGU6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIsZGF0YVR5cGU6InhtbCIsY3Jvc3NEb21haW46ITAsdXJsOnUsZGF0YTpudWxsLGJlZm9yZVNlbmQ6bnVsbCxjb21wbGV0ZTpudWxsLHN1Y2Nlc3M6ZnVuY3Rpb24oZSl7bC5pbm5lckhUTUw9KG5ldyBYTUxTZXJpYWxpemVyKS5zZXJpYWxpemVUb1N0cmluZyhlLmRvY3VtZW50RWxlbWVudCl9fSl9dmFyIGM9YS5kb2MucXVlcnlTZWxlY3RvcigiYmFzZSIpP3QubG9jYXRpb24uaHJlZi5yZXBsYWNlKHQubG9jYXRpb24uaGFzaCwiIik6IiI7YS5zdmdQYXRoPXMuc3ZnQWJzb2x1dGVVc2VIcmVmP3U6Yzt2YXIgZj1hLmxhbmcuaGVhZGVyLGQ9ZnVuY3Rpb24oKXtyZXR1cm4odC5jaHJvbWV8fHQuSW50bCYmSW50bC52OEJyZWFrSXRlcmF0b3IpJiYiQ1NTImluIHR9O2EuYnRuc0RlZj17dmlld0hUTUw6e2ZuOiJ0b2dnbGUiLGNsYXNzOiJ0cnVtYm93eWctbm90LWRpc2FibGUifSx1bmRvOntpc1N1cHBvcnRlZDpkLGtleToiWiJ9LHJlZG86e2lzU3VwcG9ydGVkOmQsa2V5OiJZIn0scDp7Zm46ImZvcm1hdEJsb2NrIn0sYmxvY2txdW90ZTp7Zm46ImZvcm1hdEJsb2NrIn0saDE6e2ZuOiJmb3JtYXRCbG9jayIsdGl0bGU6ZisiIDEifSxoMjp7Zm46ImZvcm1hdEJsb2NrIix0aXRsZTpmKyIgMiJ9LGgzOntmbjoiZm9ybWF0QmxvY2siLHRpdGxlOmYrIiAzIn0saDQ6e2ZuOiJmb3JtYXRCbG9jayIsdGl0bGU6ZisiIDQifSxoNTp7Zm46ImZvcm1hdEJsb2NrIix0aXRsZTpmKyIgNSJ9LGg2OntmbjoiZm9ybWF0QmxvY2siLHRpdGxlOmYrIiA2In0sc3Vic2NyaXB0Ont0YWc6InN1YiJ9LHN1cGVyc2NyaXB0Ont0YWc6InN1cCJ9LGJvbGQ6e2tleToiQiIsdGFnOiJiIn0saXRhbGljOntrZXk6IkkiLHRhZzoiaSJ9LHVuZGVybGluZTp7dGFnOiJ1In0sc3RyaWtldGhyb3VnaDp7dGFnOiJzdHJpa2UifSxzdHJvbmc6e2ZuOiJib2xkIixrZXk6IkIifSxlbTp7Zm46Iml0YWxpYyIsa2V5OiJJIn0sZGVsOntmbjoic3RyaWtldGhyb3VnaCJ9LGNyZWF0ZUxpbms6e2tleToiSyIsdGFnOiJhIn0sdW5saW5rOnt9LGluc2VydEltYWdlOnt9LGp1c3RpZnlMZWZ0Ont0YWc6ImxlZnQiLGZvcmNlQ3NzOiEwfSxqdXN0aWZ5Q2VudGVyOnt0YWc6ImNlbnRlciIsZm9yY2VDc3M6ITB9LGp1c3RpZnlSaWdodDp7dGFnOiJyaWdodCIsZm9yY2VDc3M6ITB9LGp1c3RpZnlGdWxsOnt0YWc6Imp1c3RpZnkiLGZvcmNlQ3NzOiEwfSx1bm9yZGVyZWRMaXN0OntmbjoiaW5zZXJ0VW5vcmRlcmVkTGlzdCIsdGFnOiJ1bCJ9LG9yZGVyZWRMaXN0OntmbjoiaW5zZXJ0T3JkZXJlZExpc3QiLHRhZzoib2wifSxob3Jpem9udGFsUnVsZTp7Zm46Imluc2VydEhvcml6b250YWxSdWxlIn0scmVtb3ZlZm9ybWF0Ont9LGZ1bGxzY3JlZW46e2NsYXNzOiJ0cnVtYm93eWctbm90LWRpc2FibGUifSxjbG9zZTp7Zm46ImRlc3Ryb3kiLGNsYXNzOiJ0cnVtYm93eWctbm90LWRpc2FibGUifSxmb3JtYXR0aW5nOntkcm9wZG93bjpbInAiLCJibG9ja3F1b3RlIiwiaDEiLCJoMiIsImgzIiwiaDQiXSxpY286InAifSxsaW5rOntkcm9wZG93bjpbImNyZWF0ZUxpbmsiLCJ1bmxpbmsiXX19LGEubz1pLmV4dGVuZCghMCx7fSxzLmRlZmF1bHRPcHRpb25zLG8pLGEuby5oYXNPd25Qcm9wZXJ0eSgiaW1nRGJsQ2xpY2tIYW5kbGVyIil8fChhLm8uaW1nRGJsQ2xpY2tIYW5kbGVyPWEuZ2V0RGVmYXVsdEltZ0RibENsaWNrSGFuZGxlcigpKSxhLnVybFByZWZpeD1hLnNldHVwVXJsUHJlZml4KCksYS5kaXNhYmxlZD1hLm8uZGlzYWJsZWR8fCJURVhUQVJFQSI9PT1uLm5vZGVOYW1lJiZuLmRpc2FibGVkLG8uYnRucz9hLm8uYnRucz1vLmJ0bnM6YS5vLnNlbWFudGljfHwoYS5vLmJ0bnNbM109WyJib2xkIiwiaXRhbGljIiwidW5kZXJsaW5lIiwic3RyaWtldGhyb3VnaCJdKSxpLmVhY2goYS5vLmJ0bnNEZWYsKGZ1bmN0aW9uKGUsdCl7YS5hZGRCdG5EZWYoZSx0KX0pKSxhLmV2ZW50TmFtZXNwYWNlPSJ0cnVtYm93eWctZXZlbnQiLGEua2V5cz1bXSxhLnRhZ1RvQnV0dG9uPXt9LGEudGFnSGFuZGxlcnM9W10sYS5wYXN0ZUhhbmRsZXJzPVtdLmNvbmNhdChhLm8ucGFzdGVIYW5kbGVycyksYS5pc0lFPS0xIT09ZS51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpfHwtMSE9PWUuYXBwVmVyc2lvbi5pbmRleE9mKCJUcmlkZW50LyIpLGEuaXNNYWM9LTEhPT1lLnBsYXRmb3JtLnRvVXBwZXJDYXNlKCkuaW5kZXhPZigiTUFDIiksYS5pbml0KCl9O3MucHJvdG90eXBlPXtERUZBVUxUX1NFTUFOVElDX01BUDp7Yjoic3Ryb25nIixpOiJlbSIsczoiZGVsIixzdHJpa2U6ImRlbCIsZGl2OiJwIn0saW5pdDpmdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5oZWlnaHQ9ZS4kdGEuaGVpZ2h0KCksZS5pbml0UGx1Z2lucygpO3RyeXtlLmRvYy5leGVjQ29tbWFuZCgiZW5hYmxlT2JqZWN0UmVzaXppbmciLCExLCExKSxlLmRvYy5leGVjQ29tbWFuZCgiZGVmYXVsdFBhcmFncmFwaFNlcGFyYXRvciIsITEsInAiKX1jYXRjaChlKXt9ZS5idWlsZEVkaXRvcigpLGUuYnVpbGRCdG5QYW5lKCksZS5maXhlZEJ0blBhbmVFdmVudHMoKSxlLmJ1aWxkT3ZlcmxheSgpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZS5kaXNhYmxlZCYmZS5zZXREaXNhYmxlZCghMCksZS4kYy50cmlnZ2VyKCJ0Yndpbml0Iil9KSl9LGFkZEJ0bkRlZjpmdW5jdGlvbihlLHQpe3RoaXMuYnRuc0RlZltlXT1pLmV4dGVuZCh0LHRoaXMuYnRuc0RlZltlXXx8e30pfSxzZXR1cFVybFByZWZpeDpmdW5jdGlvbigpe3ZhciBlPXRoaXMuby51cmxQcm90b2NvbDtpZihlKXJldHVybiJzdHJpbmciIT10eXBlb2YgZT8iaHR0cHM6Ly8iOmUucmVwbGFjZSgiOi8vIiwiIikrIjovLyJ9LGJ1aWxkRWRpdG9yOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPWUuby5wcmVmaXgscj0iIjtlLiRib3g9aSgiPGRpdi8+Iix7Y2xhc3M6bisiYm94ICIrbisiZWRpdG9yLXZpc2libGUgIituK2Uuby5sYW5nKyIgdHJ1bWJvd3lnIn0pLGUuaXNUZXh0YXJlYT1lLiR0YS5pcygidGV4dGFyZWEiKSxlLmlzVGV4dGFyZWE/KHI9ZS4kdGEudmFsKCksZS4kZWQ9aSgiPGRpdi8+IiksZS4kYm94Lmluc2VydEFmdGVyKGUuJHRhKS5hcHBlbmQoZS4kZWQsZS4kdGEpKTooZS4kZWQ9ZS4kdGEscj1lLiRlZC5odG1sKCksZS4kdGE9aSgiPHRleHRhcmVhLz4iLHtuYW1lOmUuJHRhLmF0dHIoImlkIiksaGVpZ2h0OmUuaGVpZ2h0fSkudmFsKHIpLGUuJGJveC5pbnNlcnRBZnRlcihlLiRlZCkuYXBwZW5kKGUuJHRhLGUuJGVkKSxlLnN5bmNDb2RlKCkpLGUuJHRhLmFkZENsYXNzKG4rInRleHRhcmVhIikuYXR0cigidGFiaW5kZXgiLC0xKSxlLiRlZC5hZGRDbGFzcyhuKyJlZGl0b3IiKS5hdHRyKHtjb250ZW50ZWRpdGFibGU6ITAsZGlyOmUubGFuZy5fZGlyfHwibHRyIn0pLmh0bWwociksZS5vLnRhYmluZGV4JiZlLiRlZC5hdHRyKCJ0YWJpbmRleCIsZS5vLnRhYmluZGV4KSxlLiRjLmlzKCJbcGxhY2Vob2xkZXJdIikmJmUuJGVkLmF0dHIoInBsYWNlaG9sZGVyIixlLiRjLmF0dHIoInBsYWNlaG9sZGVyIikpLGUuJGMuaXMoIltzcGVsbGNoZWNrXSIpJiZlLiRlZC5hdHRyKCJzcGVsbGNoZWNrIixlLiRjLmF0dHIoInNwZWxsY2hlY2siKSksZS5vLnJlc2V0Q3NzJiZlLiRlZC5hZGRDbGFzcyhuKyJyZXNldC1jc3MiKSxlLm8uYXV0b2dyb3d8fGUuJHRhLmFkZChlLiRlZCkuY3NzKHtoZWlnaHQ6ZS5oZWlnaHR9KSxlLnNlbWFudGljQ29kZSgpLGUuby5hdXRvZ3Jvd09uRW50ZXImJmUuJGVkLmFkZENsYXNzKG4rImF1dG9ncm93LW9uLWVudGVyIik7dmFyIG8sYT0hMSxzPSExO2UuJGVkLm9uKCJkYmxjbGljayIsImltZyIsZS5vLmltZ0RibENsaWNrSGFuZGxlcikub24oImtleWRvd24iLChmdW5jdGlvbih0KXt2YXIgbj10LndoaWNoO2lmKDghPT1uJiYxMyE9PW4mJjQ2IT09bnx8ZS50b2dnbGVTcGFuKCEwKSwhdC5jdHJsS2V5JiYhdC5tZXRhS2V5fHx0LmFsdEtleSl7aWYoZS5vLnRhYlRvSW5kZW50JiYiVGFiIj09PXQua2V5KXRyeXtyZXR1cm4gdC5zaGlmdEtleT9lLmV4ZWNDbWQoIm91dGRlbnQiLCEwLG51bGwpOmUuZXhlY0NtZCgiaW5kZW50IiwhMCxudWxsKSwhMX1jYXRjaChlKXt9fWVsc2V7YT0hMDt2YXIgcj1lLmtleXNbU3RyaW5nLmZyb21DaGFyQ29kZSh0LndoaWNoKS50b1VwcGVyQ2FzZSgpXTt0cnl7cmV0dXJuIGUuZXhlY0NtZChyLmZuLHIucGFyYW0pLCExfWNhdGNoKGUpe319fSkpLm9uKCJjb21wb3NpdGlvbnN0YXJ0IGNvbXBvc2l0aW9udXBkYXRlIiwoZnVuY3Rpb24oKXtzPSEwfSkpLm9uKCJrZXl1cCBjb21wb3NpdGlvbmVuZCIsKGZ1bmN0aW9uKHQpe2lmKCJjb21wb3NpdGlvbmVuZCI9PT10LnR5cGUpcz0hMTtlbHNlIGlmKHMpcmV0dXJuO3ZhciBuPXQud2hpY2g7aWYoIShuPj0zNyYmbjw9NDApKXtpZig4IT09biYmMTMhPT1uJiY0NiE9PW58fGUudG9nZ2xlU3BhbigpLCF0LmN0cmxLZXkmJiF0Lm1ldGFLZXl8fDg5IT09biYmOTAhPT1uKWlmKGF8fDE3PT09bil2b2lkIDA9PT10LndoaWNoJiZlLnNlbWFudGljQ29kZSghMSwhMSwhMCk7ZWxzZXt2YXIgcj0hZS5pc0lFfHwiY29tcG9zaXRpb25lbmQiPT09dC50eXBlO2Uuc2VtYW50aWNDb2RlKCExLHImJjEzPT09biksZS4kYy50cmlnZ2VyKCJ0YndjaGFuZ2UiKX1lbHNlIGUuc2VtYW50aWNDb2RlKCExLCEwKSxlLiRjLnRyaWdnZXIoInRid2NoYW5nZSIpO3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7YT0hMX0pLDUwKX19KSkub24oIm1vdXNldXAga2V5ZG93biBrZXl1cCIsKGZ1bmN0aW9uKHQpeyghdC5jdHJsS2V5JiYhdC5tZXRhS2V5fHx0LmFsdEtleSkmJnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7YT0hMX0pLDUwKSxjbGVhclRpbWVvdXQobyksbz1zZXRUaW1lb3V0KChmdW5jdGlvbigpe2UudXBkYXRlQnV0dG9uUGFuZVN0YXR1cygpfSksNTApfSkpLm9uKCJmb2N1cyBibHVyIiwoZnVuY3Rpb24odCl7aWYoImJsdXIiPT09dC50eXBlJiZlLmNsZWFyQnV0dG9uUGFuZVN0YXR1cygpLGUuJGMudHJpZ2dlcigidGJ3Iit0LnR5cGUpLGUuby5hdXRvZ3Jvd09uRW50ZXIpe2lmKGUuYXV0b2dyb3dPbkVudGVyRG9udENsb3NlKXJldHVybjsiZm9jdXMiPT09dC50eXBlPyhlLmF1dG9ncm93T25FbnRlcldhc0ZvY3VzZWQ9ITAsZS5hdXRvZ3Jvd0VkaXRvck9uRW50ZXIoKSk6ZS5vLmF1dG9ncm93fHwoZS4kZWQuY3NzKHtoZWlnaHQ6ZS4kZWQuY3NzKCJtaW4taGVpZ2h0Iil9KSxlLiRjLnRyaWdnZXIoInRid3Jlc2l6ZSIpKX19KSkub24oImtleXVwIGZvY3VzIiwoZnVuY3Rpb24oKXtlLiR0YS52YWwoKS5tYXRjaCgvPC4qPi8pfHxlLiRlZC5odG1sKCkubWF0Y2goLzwuKj4vKXx8c2V0VGltZW91dCgoZnVuY3Rpb24oKXt2YXIgdD1lLmlzSUU/IjxwPiI6InAiO2UuZG9jLmV4ZWNDb21tYW5kKCJmb3JtYXRCbG9jayIsITEsdCksZS5zeW5jQ29kZSgpfSksMCl9KSkub24oImN1dCBkcm9wIiwoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe2Uuc2VtYW50aWNDb2RlKCExLCEwKSxlLiRjLnRyaWdnZXIoInRid2NoYW5nZSIpfSksMCl9KSkub24oInBhc3RlIiwoZnVuY3Rpb24obil7aWYoZS5vLnJlbW92ZWZvcm1hdFBhc3RlZCl7bi5wcmV2ZW50RGVmYXVsdCgpLHQuZ2V0U2VsZWN0aW9uJiZ0LmdldFNlbGVjdGlvbigpLmRlbGV0ZUZyb21Eb2N1bWVudCYmdC5nZXRTZWxlY3Rpb24oKS5kZWxldGVGcm9tRG9jdW1lbnQoKTt0cnl7dmFyIHI9dC5jbGlwYm9hcmREYXRhLmdldERhdGEoIlRleHQiKTt0cnl7ZS5kb2Muc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkucGFzdGVIVE1MKHIpfWNhdGNoKHQpe2UuZG9jLmdldFNlbGVjdGlvbigpLmdldFJhbmdlQXQoMCkuaW5zZXJ0Tm9kZShlLmRvYy5jcmVhdGVUZXh0Tm9kZShyKSl9ZS4kYy50cmlnZ2VyKCJ0YndjaGFuZ2UiLG4pfWNhdGNoKHQpe2UuZXhlY0NtZCgiaW5zZXJ0VGV4dCIsKG4ub3JpZ2luYWxFdmVudHx8bikuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCJ0ZXh0L3BsYWluIikpfX1pLmVhY2goZS5wYXN0ZUhhbmRsZXJzLChmdW5jdGlvbihlLHQpe3Qobil9KSksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtlLnNlbWFudGljQ29kZSghMSwhMCksZS4kYy50cmlnZ2VyKCJ0YndwYXN0ZSIsbiksZS4kYy50cmlnZ2VyKCJ0YndjaGFuZ2UiKX0pLDApfSkpLGUuJHRhLm9uKCJrZXl1cCIsKGZ1bmN0aW9uKCl7ZS4kYy50cmlnZ2VyKCJ0YndjaGFuZ2UiKX0pKS5vbigicGFzdGUiLChmdW5jdGlvbigpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZS4kYy50cmlnZ2VyKCJ0YndjaGFuZ2UiKX0pLDApfSkpLGkoZS5kb2MuYm9keSkub24oImtleWRvd24uIitlLmV2ZW50TmFtZXNwYWNlLChmdW5jdGlvbih0KXtpZigyNz09PXQud2hpY2gmJmkoIi4iK24rIm1vZGFsLWJveCIpLmxlbmd0aD49MSlyZXR1cm4gZS5jbG9zZU1vZGFsKCksITF9KSl9LGF1dG9ncm93RWRpdG9yT25FbnRlcjpmdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS4kZWQucmVtb3ZlQ2xhc3MoImF1dG9ncm93LW9uLWVudGVyIik7dmFyIHQ9ZS4kZWRbMF0uY2xpZW50SGVpZ2h0O2UuJGVkLmhlaWdodCgiYXV0byIpO3ZhciBuPWUuJGVkWzBdLnNjcm9sbEhlaWdodDtlLiRlZC5hZGRDbGFzcygiYXV0b2dyb3ctb24tZW50ZXIiKSx0IT09biYmKGUuJGVkLmhlaWdodCh0KSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe2UuJGVkLmNzcyh7aGVpZ2h0Om59KSxlLiRjLnRyaWdnZXIoInRid3Jlc2l6ZSIpfSksMCkpfSxidWlsZEJ0blBhbmU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9ZS5vLnByZWZpeCxuPWUuJGJ0blBhbmU9aSgiPGRpdi8+Iix7Y2xhc3M6dCsiYnV0dG9uLXBhbmUifSk7aS5lYWNoKGUuby5idG5zLChmdW5jdGlvbihyLG8pe2kuaXNBcnJheShvKXx8KG89W29dKTt2YXIgYT1pKCI8ZGl2Lz4iLHtjbGFzczp0KyJidXR0b24tZ3JvdXAgIisoby5pbmRleE9mKCJmdWxsc2NyZWVuIik+PTA/dCsicmlnaHQiOiIiKX0pO2kuZWFjaChvLChmdW5jdGlvbih0LG4pe3RyeXtlLmlzU3VwcG9ydGVkQnRuKG4pJiZhLmFwcGVuZChlLmJ1aWxkQnRuKG4pKX1jYXRjaChlKXt9fSkpLGEuaHRtbCgpLnRyaW0oKS5sZW5ndGg+MCYmbi5hcHBlbmQoYSl9KSksZS4kYm94LnByZXBlbmQobil9LGJ1aWxkQnRuOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj10Lm8ucHJlZml4LHI9dC5idG5zRGVmW2VdLG89ci5kcm9wZG93bixhPW51bGw9PXIuaGFzSWNvbnx8ci5oYXNJY29uLHM9dC5sYW5nW2VdfHxlLHU9aSgiPGJ1dHRvbi8+Iix7dHlwZToiYnV0dG9uIixjbGFzczpuK2UrIi1idXR0b24gIisoci5jbGFzc3x8IiIpKyhhPyIiOiIgIituKyJ0ZXh0dWFsLWJ1dHRvbiIpLGh0bWw6dC5oYXNTdmcmJmE/Jzxzdmc+PHVzZSB4bGluazpocmVmPSInK3Quc3ZnUGF0aCsiIyIrbisoci5pY298fGUpLnJlcGxhY2UoLyhbQS1aXSspL2csIi0kMSIpLnRvTG93ZXJDYXNlKCkrJyIvPjwvc3ZnPic6dC5oaWRlQnV0dG9uVGV4dHM/IiI6ci50ZXh0fHxyLnRpdGxlfHx0LmxhbmdbZV18fGUsdGl0bGU6KHIudGl0bGV8fHIudGV4dHx8cykrKHIua2V5PyIgKCIrKHQuaXNNYWM/IkNtZCI6IkN0cmwiKSsiICsgIityLmtleSsiKSI6IiIpLHRhYmluZGV4Oi0xLG1vdXNlZG93bjpmdW5jdGlvbigpe3JldHVybiBvJiYhaSgiLiIrZSsiLSIrbisiZHJvcGRvd24iLHQuJGJveCkuaXMoIjpoaWRkZW4iKXx8aSgiYm9keSIsdC5kb2MpLnRyaWdnZXIoIm1vdXNlZG93biIpLCEoKHQuJGJ0blBhbmUuaGFzQ2xhc3MobisiZGlzYWJsZSIpfHx0LiRib3guaGFzQ2xhc3MobisiZGlzYWJsZWQiKSkmJiFpKHRoaXMpLmhhc0NsYXNzKG4rImFjdGl2ZSIpJiYhaSh0aGlzKS5oYXNDbGFzcyhuKyJub3QtZGlzYWJsZSIpfHwodC5leGVjQ21kKChvPyJkcm9wZG93biI6ci5mbil8fGUsci5wYXJhbXx8ZSxyLmZvcmNlQ3NzKSwxKSl9fSk7aWYobyl7dS5hZGRDbGFzcyhuKyJvcGVuLWRyb3Bkb3duIik7dmFyIGw9bisiZHJvcGRvd24iLGM9e2NsYXNzOmwrIi0iK2UrIiAiK2wrIiAiK24rImZpeGVkLXRvcCAiKyhyLmRyb3Bkb3duQ2xhc3N8fCIiKX07Y1siZGF0YS0iK2xdPWU7dmFyIGY9aSgiPGRpdi8+IixjKTtpLmVhY2gobywoZnVuY3Rpb24oZSxuKXt0LmJ0bnNEZWZbbl0mJnQuaXNTdXBwb3J0ZWRCdG4obikmJmYuYXBwZW5kKHQuYnVpbGRTdWJCdG4obikpfSkpLHQuJGJveC5hcHBlbmQoZi5oaWRlKCkpfWVsc2Ugci5rZXkmJih0LmtleXNbci5rZXldPXtmbjpyLmZufHxlLHBhcmFtOnIucGFyYW18fGV9KTtyZXR1cm4gb3x8KHQudGFnVG9CdXR0b25bKHIudGFnfHxlKS50b0xvd2VyQ2FzZSgpXT1lKSx1fSxidWlsZFN1YkJ0bjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLG49dC5vLnByZWZpeCxyPXQuYnRuc0RlZltlXSxvPW51bGw9PXIuaGFzSWNvbnx8ci5oYXNJY29uO3JldHVybiByLmtleSYmKHQua2V5c1tyLmtleV09e2ZuOnIuZm58fGUscGFyYW06ci5wYXJhbXx8ZX0pLHQudGFnVG9CdXR0b25bKHIudGFnfHxlKS50b0xvd2VyQ2FzZSgpXT1lLGkoIjxidXR0b24vPiIse3R5cGU6ImJ1dHRvbiIsY2xhc3M6bitlKyItZHJvcGRvd24tYnV0dG9uICIrKHIuY2xhc3N8fCIiKSsoci5pY28/IiAiK24rci5pY28rIi1idXR0b24iOiIiKSxodG1sOnQuaGFzU3ZnJiZvPyc8c3ZnPjx1c2UgeGxpbms6aHJlZj0iJyt0LnN2Z1BhdGgrIiMiK24rKHIuaWNvfHxlKS5yZXBsYWNlKC8oW0EtWl0rKS9nLCItJDEiKS50b0xvd2VyQ2FzZSgpKyciLz48L3N2Zz4nKyhyLnRleHR8fHIudGl0bGV8fHQubGFuZ1tlXXx8ZSk6ci50ZXh0fHxyLnRpdGxlfHx0LmxhbmdbZV18fGUsdGl0bGU6ci5rZXk/IigiKyh0LmlzTWFjPyJDbWQiOiJDdHJsIikrIiArICIrci5rZXkrIikiOm51bGwsc3R5bGU6ci5zdHlsZXx8bnVsbCxtb3VzZWRvd246ZnVuY3Rpb24oKXtyZXR1cm4gaSgiYm9keSIsdC5kb2MpLnRyaWdnZXIoIm1vdXNlZG93biIpLHQuZXhlY0NtZChyLmZufHxlLHIucGFyYW18fGUsci5mb3JjZUNzcyksITF9fSl9LGlzU3VwcG9ydGVkQnRuOmZ1bmN0aW9uKGUpe3RyeXtyZXR1cm4gdGhpcy5idG5zRGVmW2VdLmlzU3VwcG9ydGVkKCl9Y2F0Y2goZSl7fXJldHVybiEwfSxidWlsZE92ZXJsYXk6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3JldHVybiBlLiRvdmVybGF5PWkoIjxkaXYvPiIse2NsYXNzOmUuby5wcmVmaXgrIm92ZXJsYXkifSkuYXBwZW5kVG8oZS4kYm94KSxlLiRvdmVybGF5fSxzaG93T3ZlcmxheTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7aSh0KS50cmlnZ2VyKCJzY3JvbGwiKSxlLiRvdmVybGF5LmZhZGVJbigyMDApLGUuJGJveC5hZGRDbGFzcyhlLm8ucHJlZml4KyJib3gtYmx1ciIpfSxoaWRlT3ZlcmxheTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS4kb3ZlcmxheS5mYWRlT3V0KDUwKSxlLiRib3gucmVtb3ZlQ2xhc3MoZS5vLnByZWZpeCsiYm94LWJsdXIiKX0sZml4ZWRCdG5QYW5lRXZlbnRzOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPWUuby5maXhlZEZ1bGxXaWR0aCxyPWUuJGJveDtlLm8uZml4ZWRCdG5QYW5lJiYoZS5pc0ZpeGVkPSExLGkodCkub24oInNjcm9sbC4iK2UuZXZlbnROYW1lc3BhY2UrIiByZXNpemUuIitlLmV2ZW50TmFtZXNwYWNlLChmdW5jdGlvbigpe2lmKHIpe2Uuc3luY0NvZGUoKTt2YXIgbz1pKHQpLnNjcm9sbFRvcCgpLGE9ci5vZmZzZXQoKS50b3ArMSxzPWUuJGJ0blBhbmUsdT1zLm91dGVySGVpZ2h0KCktMjtvLWE+MCYmby1hLWUuaGVpZ2h0PDA/KGUuaXNGaXhlZHx8KGUuaXNGaXhlZD0hMCxzLmNzcyh7cG9zaXRpb246ImZpeGVkIix0b3A6MCxsZWZ0Om4/MDoiYXV0byIsekluZGV4Ojd9KSxlLiRib3guY3NzKHtwYWRkaW5nVG9wOnMuaGVpZ2h0KCl9KSkscy5jc3Moe3dpZHRoOm4/IjEwMCUiOnIud2lkdGgoKS0xfSksaSgiLiIrZS5vLnByZWZpeCsiZml4ZWQtdG9wIixyKS5jc3Moe3Bvc2l0aW9uOm4/ImZpeGVkIjoiYWJzb2x1dGUiLHRvcDpuP3U6dSsoby1hKSx6SW5kZXg6MTV9KSk6ZS5pc0ZpeGVkJiYoZS5pc0ZpeGVkPSExLHMucmVtb3ZlQXR0cigic3R5bGUiKSxlLiRib3guY3NzKHtwYWRkaW5nVG9wOjB9KSxpKCIuIitlLm8ucHJlZml4KyJmaXhlZC10b3AiLHIpLmNzcyh7cG9zaXRpb246ImFic29sdXRlIix0b3A6dX0pKX19KSkpfSxzZXREaXNhYmxlZDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLG49dC5vLnByZWZpeDt0LmRpc2FibGVkPWUsZT90LiR0YS5hdHRyKCJkaXNhYmxlZCIsITApOnQuJHRhLnJlbW92ZUF0dHIoImRpc2FibGVkIiksdC4kYm94LnRvZ2dsZUNsYXNzKG4rImRpc2FibGVkIixlKSx0LiRlZC5hdHRyKCJjb250ZW50ZWRpdGFibGUiLCFlKX0sZGVzdHJveTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsbj1lLm8ucHJlZml4O2UuaXNUZXh0YXJlYT9lLiRib3guYWZ0ZXIoZS4kdGEuY3NzKHtoZWlnaHQ6IiJ9KS52YWwoZS5odG1sKCkpLnJlbW92ZUNsYXNzKG4rInRleHRhcmVhIikuc2hvdygpKTplLiRib3guYWZ0ZXIoZS4kZWQuY3NzKHtoZWlnaHQ6IiJ9KS5yZW1vdmVDbGFzcyhuKyJlZGl0b3IiKS5yZW1vdmVBdHRyKCJjb250ZW50ZWRpdGFibGUiKS5yZW1vdmVBdHRyKCJkaXIiKS5odG1sKGUuaHRtbCgpKS5zaG93KCkpLGUuJGVkLm9mZigiZGJsY2xpY2siLCJpbWciKSxlLmRlc3Ryb3lQbHVnaW5zKCksZS4kYm94LnJlbW92ZSgpLGUuJGMucmVtb3ZlRGF0YSgidHJ1bWJvd3lnIiksaSgiYm9keSIpLnJlbW92ZUNsYXNzKG4rImJvZHktZnVsbHNjcmVlbiIpLGUuJGMudHJpZ2dlcigidGJ3Y2xvc2UiKSxpKHQpLm9mZigic2Nyb2xsLiIrZS5ldmVudE5hbWVzcGFjZSsiIHJlc2l6ZS4iK2UuZXZlbnROYW1lc3BhY2UpLGkoZS5kb2MuYm9keSkub2ZmKCJrZXlkb3duLiIrZS5ldmVudE5hbWVzcGFjZSl9LGVtcHR5OmZ1bmN0aW9uKCl7dGhpcy4kdGEudmFsKCIiKSx0aGlzLnN5bmNDb2RlKCEwKX0sdG9nZ2xlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PWUuby5wcmVmaXg7ZS5vLmF1dG9ncm93T25FbnRlciYmKGUuYXV0b2dyb3dPbkVudGVyRG9udENsb3NlPSFlLiRib3guaGFzQ2xhc3ModCsiZWRpdG9yLWhpZGRlbiIpKSxlLnNlbWFudGljQ29kZSghMSwhMCksZS4kYy50cmlnZ2VyKCJ0YndjaGFuZ2UiKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe2UuZG9jLmFjdGl2ZUVsZW1lbnQuYmx1cigpLGUuJGJveC50b2dnbGVDbGFzcyh0KyJlZGl0b3ItaGlkZGVuICIrdCsiZWRpdG9yLXZpc2libGUiKSxlLiRidG5QYW5lLnRvZ2dsZUNsYXNzKHQrImRpc2FibGUiKSxpKCIuIit0KyJ2aWV3SFRNTC1idXR0b24iLGUuJGJ0blBhbmUpLnRvZ2dsZUNsYXNzKHQrImFjdGl2ZSIpLGUuJGJveC5oYXNDbGFzcyh0KyJlZGl0b3ItdmlzaWJsZSIpP2UuJHRhLmF0dHIoInRhYmluZGV4IiwtMSk6ZS4kdGEucmVtb3ZlQXR0cigidGFiaW5kZXgiKSxlLm8uYXV0b2dyb3dPbkVudGVyJiYhZS5hdXRvZ3Jvd09uRW50ZXJEb250Q2xvc2UmJmUuYXV0b2dyb3dFZGl0b3JPbkVudGVyKCl9KSwwKX0sdG9nZ2xlU3BhbjpmdW5jdGlvbihlKXt0aGlzLiRlZC5maW5kKCJzcGFuIikuZWFjaCgoZnVuY3Rpb24oKXshMD09PWU/aSh0aGlzKS5hdHRyKCJkYXRhLXRidy1mbGFnIiwhMCk6aSh0aGlzKS5hdHRyKCJkYXRhLXRidy1mbGFnIik/aSh0aGlzKS5yZW1vdmVBdHRyKCJkYXRhLXRidy1mbGFnIik6aSh0aGlzKS5jb250ZW50cygpLnVud3JhcCgpfSkpfSxkcm9wZG93bjpmdW5jdGlvbihlKXt2YXIgbj10aGlzLHI9aSgiYm9keSIsbi5kb2MpLG89bi5vLnByZWZpeCxhPWkoIltkYXRhLSIrbysiZHJvcGRvd249IitlKyJdIixuLiRib3gpLHM9aSgiLiIrbytlKyItYnV0dG9uIixuLiRidG5QYW5lKSx1PWEuaXMoIjpoaWRkZW4iKTtpZihyLnRyaWdnZXIoIm1vdXNlZG93biIpLHUpe3ZhciBsPXMub2Zmc2V0KCkubGVmdDtzLmFkZENsYXNzKG8rImFjdGl2ZSIpLGEuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDpzLm9mZnNldCgpLnRvcC1uLiRidG5QYW5lLm9mZnNldCgpLnRvcCtzLm91dGVySGVpZ2h0KCksbGVmdDpuLm8uZml4ZWRGdWxsV2lkdGgmJm4uaXNGaXhlZD9sOmwtbi4kYnRuUGFuZS5vZmZzZXQoKS5sZWZ0fSkuc2hvdygpLGkodCkudHJpZ2dlcigic2Nyb2xsIiksci5vbigibW91c2Vkb3duLiIrbi5ldmVudE5hbWVzcGFjZSwoZnVuY3Rpb24oZSl7YS5pcyhlLnRhcmdldCl8fChpKCIuIitvKyJkcm9wZG93biIsbi4kYm94KS5oaWRlKCksaSgiLiIrbysiYWN0aXZlIixuLiRidG5QYW5lKS5yZW1vdmVDbGFzcyhvKyJhY3RpdmUiKSxyLm9mZigibW91c2Vkb3duLiIrbi5ldmVudE5hbWVzcGFjZSkpfSkpfX0saHRtbDpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3JldHVybiBudWxsIT1lPyh0LiR0YS52YWwoZSksdC5zeW5jQ29kZSghMCksdC4kYy50cmlnZ2VyKCJ0YndjaGFuZ2UiKSx0KTp0LiR0YS52YWwoKX0sc3luY1RleHRhcmVhOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcztlLiR0YS52YWwoZS4kZWQudGV4dCgpLnRyaW0oKS5sZW5ndGg+MHx8ZS4kZWQuZmluZChlLm8udGFnc1RvS2VlcC5qb2luKCIsIikpLmxlbmd0aD4wP2UuJGVkLmh0bWwoKToiIil9LHN5bmNDb2RlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7aWYoIWUmJnQuJGVkLmlzKCI6dmlzaWJsZSIpKXQuc3luY1RleHRhcmVhKCk7ZWxzZXt2YXIgbj1pKCI8ZGl2PiIpLmh0bWwodC4kdGEudmFsKCkpLHI9aSgiPGRpdj4iKS5hcHBlbmQobik7aSh0Lm8udGFnc1RvUmVtb3ZlLmpvaW4oIiwiKSxyKS5yZW1vdmUoKSx0LiRlZC5odG1sKHIuY29udGVudHMoKS5odG1sKCkpfWlmKHQuby5hdXRvZ3JvdyYmKHQuaGVpZ2h0PXQuJGVkLmhlaWdodCgpLHQuaGVpZ2h0IT09dC4kdGEuY3NzKCJoZWlnaHQiKSYmKHQuJHRhLmNzcyh7aGVpZ2h0OnQuaGVpZ2h0fSksdC4kYy50cmlnZ2VyKCJ0YndyZXNpemUiKSkpLHQuby5hdXRvZ3Jvd09uRW50ZXIpe3QuJGVkLmhlaWdodCgiYXV0byIpO3ZhciBvPXQuYXV0b2dyb3dPbkVudGVyV2FzRm9jdXNlZD90LiRlZFswXS5zY3JvbGxIZWlnaHQ6dC4kZWQuY3NzKCJtaW4taGVpZ2h0Iik7byE9PXQuJHRhLmNzcygiaGVpZ2h0IikmJih0LiRlZC5jc3Moe2hlaWdodDpvfSksdC4kYy50cmlnZ2VyKCJ0YndyZXNpemUiKSl9fSxzZW1hbnRpY0NvZGU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXM7ci5zYXZlUmFuZ2UoKSxyLnN5bmNDb2RlKGUpO3ZhciBvPSEwO2lmKHIucmFuZ2UmJnIucmFuZ2UuY29sbGFwc2VkJiYobz0hMSksci5vLnNlbWFudGljKXtpZihyLnNlbWFudGljVGFnKCJiIixyLm8uc2VtYW50aWNLZWVwQXR0cmlidXRlcyksci5zZW1hbnRpY1RhZygiaSIsci5vLnNlbWFudGljS2VlcEF0dHJpYnV0ZXMpLHIuc2VtYW50aWNUYWcoInMiLHIuby5zZW1hbnRpY0tlZXBBdHRyaWJ1dGVzKSxyLnNlbWFudGljVGFnKCJzdHJpa2UiLHIuby5zZW1hbnRpY0tlZXBBdHRyaWJ1dGVzKSx0KXt2YXIgYT1yLm8uaW5saW5lRWxlbWVudHNTZWxlY3RvcixzPSI6bm90KCIrYSsiKSI7ci4kZWQuY29udGVudHMoKS5maWx0ZXIoKGZ1bmN0aW9uKCl7cmV0dXJuIDM9PT10aGlzLm5vZGVUeXBlJiZ0aGlzLm5vZGVWYWx1ZS50cmltKCkubGVuZ3RoPjB9KSkud3JhcCgiPHNwYW4gZGF0YS10YncvPiIpOyhmdW5jdGlvbiBlKHQpe2lmKDAhPT10Lmxlbmd0aCl7dmFyIG49dC5uZXh0VW50aWwocykuYWRkQmFjaygpLndyYXBBbGwoIjxwLz4iKS5wYXJlbnQoKSxyPW4ubmV4dEFsbChhKS5maXJzdCgpO24ubmV4dCgiYnIiKS5yZW1vdmUoKSxlKHIpfX0pKHIuJGVkLmNoaWxkcmVuKGEpLmZpcnN0KCkpLHIuc2VtYW50aWNUYWcoImRpdiIsITApLGkoIltkYXRhLXRid10iLHIuJGVkKS5jb250ZW50cygpLnVud3JhcCgpLHIuJGVkLmZpbmQoInA6ZW1wdHkiKS5yZW1vdmUoKX0hbiYmbyYmci5yZXN0b3JlUmFuZ2UoKSxyLnN5bmNUZXh0YXJlYSgpfX0sc2VtYW50aWNUYWc6ZnVuY3Rpb24oZSx0LHIpe3ZhciBvLGE9dGhpcyxzPWU7aWYobnVsbCE9dGhpcy5vLnNlbWFudGljJiYib2JqZWN0Ij09bih0aGlzLm8uc2VtYW50aWMpJiZ0aGlzLm8uc2VtYW50aWMuaGFzT3duUHJvcGVydHkoZSkpbz10aGlzLm8uc2VtYW50aWNbZV07ZWxzZXtpZighMCE9PXRoaXMuby5zZW1hbnRpY3x8IXRoaXMuREVGQVVMVF9TRU1BTlRJQ19NQVAuaGFzT3duUHJvcGVydHkoZSkpcmV0dXJuO289dGhpcy5ERUZBVUxUX1NFTUFOVElDX01BUFtlXX1yJiYoZT1vLG89cyksaShlLHRoaXMuJGVkKS5lYWNoKChmdW5jdGlvbigpe3ZhciBlPSExLG49aSh0aGlzKTtpZigwPT09bi5jb250ZW50cygpLmxlbmd0aClyZXR1cm4hMTthLnJhbmdlJiZhLnJhbmdlLnN0YXJ0Q29udGFpbmVyLnBhcmVudE5vZGU9PT10aGlzJiYoZT0hMCk7dmFyIHI9aSgiPCIrbysiLz4iKTtyLmluc2VydEJlZm9yZShuKSx0JiZpLmVhY2gobi5wcm9wKCJhdHRyaWJ1dGVzIiksKGZ1bmN0aW9uKCl7ci5hdHRyKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pKSxyLmh0bWwobi5odG1sKCkpLG4ucmVtb3ZlKCksITA9PT1lJiYoYS5yYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoci5nZXQoMCkpLGEucmFuZ2UuY29sbGFwc2UoITEpKX0pKX0sY3JlYXRlTGluazpmdW5jdGlvbigpe2Zvcih2YXIgZSx0LG4scj10aGlzLG89ci5kb2MuZ2V0U2VsZWN0aW9uKCksYT1vLmdldFJhbmdlQXQoMCkscz1vLmZvY3VzTm9kZSx1PShuZXcgWE1MU2VyaWFsaXplcikuc2VyaWFsaXplVG9TdHJpbmcoYS5jbG9uZUNvbnRlbnRzKCkpfHxhKyIiLGw9ci5vLmxpbmtUYXJnZXRzWzBdO1siQSIsIkRJViJdLmluZGV4T2Yocy5ub2RlTmFtZSk8MDspcz1zLnBhcmVudE5vZGU7aWYocyYmIkEiPT09cy5ub2RlTmFtZSl7dmFyIGM9aShzKTt1PWMudGV4dCgpLGU9Yy5hdHRyKCJocmVmIiksci5vLm1pbmltYWxMaW5rc3x8KHQ9Yy5hdHRyKCJ0aXRsZSIpLG49Yy5hdHRyKCJ0YXJnZXQiKXx8bCk7dmFyIGY9ci5kb2MuY3JlYXRlUmFuZ2UoKTtmLnNlbGVjdE5vZGUocyksby5yZW1vdmVBbGxSYW5nZXMoKSxvLmFkZFJhbmdlKGYpfXIuc2F2ZVJhbmdlKCk7dmFyIGQ9e3VybDp7bGFiZWw6ci5sYW5nLmxpbmtVcmx8fCJVUkwiLHJlcXVpcmVkOiEwLHZhbHVlOmV9LHRleHQ6e2xhYmVsOnIubGFuZy50ZXh0LHZhbHVlOnV9fTtpZighci5vLm1pbmltYWxMaW5rcyl7dmFyIGg9ci5vLmxpbmtUYXJnZXRzLnJlZHVjZSgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZVt0XT1yLmxhbmdbdF0sZX0pLHt9KTtpLmV4dGVuZChkLHt0aXRsZTp7bGFiZWw6ci5sYW5nLnRpdGxlLHZhbHVlOnR9LHRhcmdldDp7bGFiZWw6ci5sYW5nLnRhcmdldCx2YWx1ZTpuLG9wdGlvbnM6aH19KX1yLm9wZW5Nb2RhbEluc2VydChyLmxhbmcuY3JlYXRlTGluayxkLChmdW5jdGlvbihlKXt2YXIgdD1yLnByZXBlbmRVcmxQcmVmaXgoZS51cmwpO2lmKCF0Lmxlbmd0aClyZXR1cm4hMTt2YXIgbj1pKFsnPGEgaHJlZj0iJyx0LCciPicsZS50ZXh0fHxlLnVybCwiPC9hPiJdLmpvaW4oIiIpKTtyZXR1cm4gZS50aXRsZSYmbi5hdHRyKCJ0aXRsZSIsZS50aXRsZSksKGUudGFyZ2V0fHxsKSYmbi5hdHRyKCJ0YXJnZXQiLGUudGFyZ2V0fHxsKSxyLnJhbmdlLmRlbGV0ZUNvbnRlbnRzKCksci5yYW5nZS5pbnNlcnROb2RlKG5bMF0pLHIuc3luY0NvZGUoKSxyLiRjLnRyaWdnZXIoInRid2NoYW5nZSIpLCEwfSkpfSxwcmVwZW5kVXJsUHJlZml4OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnVybFByZWZpeD8vXihbYS16XVstKy5hLXowLTldKjp8XC98IykvaS50ZXN0KGUpP2U6L15bXlxzQF0rQFteXHNAXStcLlteXHNAXSskLy50ZXN0KGUpPyJtYWlsdG86IitlOnRoaXMudXJsUHJlZml4K2U6ZX0sdW5saW5rOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PWUuZG9jLmdldFNlbGVjdGlvbigpLG49dC5mb2N1c05vZGU7aWYodC5pc0NvbGxhcHNlZCl7Zm9yKDtbIkEiLCJESVYiXS5pbmRleE9mKG4ubm9kZU5hbWUpPDA7KW49bi5wYXJlbnROb2RlO2lmKG4mJiJBIj09PW4ubm9kZU5hbWUpe3ZhciByPWUuZG9jLmNyZWF0ZVJhbmdlKCk7ci5zZWxlY3ROb2RlKG4pLHQucmVtb3ZlQWxsUmFuZ2VzKCksdC5hZGRSYW5nZShyKX19ZS5leGVjQ21kKCJ1bmxpbmsiLHZvaWQgMCx2b2lkIDAsITApfSxpbnNlcnRJbWFnZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5zYXZlUmFuZ2UoKTt2YXIgdD17dXJsOntsYWJlbDoiVVJMIixyZXF1aXJlZDohMH0sYWx0OntsYWJlbDplLmxhbmcuZGVzY3JpcHRpb24sdmFsdWU6ZS5nZXRSYW5nZVRleHQoKX19O2Uuby5pbWFnZVdpZHRoTW9kYWxFZGl0JiYodC53aWR0aD17fSksZS5vcGVuTW9kYWxJbnNlcnQoZS5sYW5nLmluc2VydEltYWdlLHQsKGZ1bmN0aW9uKHQpe2UuZXhlY0NtZCgiaW5zZXJ0SW1hZ2UiLHQudXJsLCExLCEwKTt2YXIgbj1pKCdpbWdbc3JjPSInK3QudXJsKyciXTpub3QoW2FsdF0pJyxlLiRib3gpO3JldHVybiBuLmF0dHIoImFsdCIsdC5hbHQpLGUuby5pbWFnZVdpZHRoTW9kYWxFZGl0JiZuLmF0dHIoe3dpZHRoOnQud2lkdGh9KSxlLnN5bmNDb2RlKCksZS4kYy50cmlnZ2VyKCJ0YndjaGFuZ2UiKSwhMH0pKX0sZnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBlLG49dGhpcyxyPW4uby5wcmVmaXgsbz1yKyJmdWxsc2NyZWVuIixhPW8rIi1wbGFjZWhvbGRlciIscz1uLiRib3gub3V0ZXJIZWlnaHQoKTtuLiRib3gudG9nZ2xlQ2xhc3MobyksKGU9bi4kYm94Lmhhc0NsYXNzKG8pKT9uLiRib3guYmVmb3JlKGkoIjxkaXYvPiIse2NsYXNzOmF9KS5jc3Moe2hlaWdodDpzfSkpOmkoIi4iK2EpLnJlbW92ZSgpLGkoImJvZHkiKS50b2dnbGVDbGFzcyhyKyJib2R5LWZ1bGxzY3JlZW4iLGUpLGkodCkudHJpZ2dlcigic2Nyb2xsIiksbi4kYy50cmlnZ2VyKCJ0YnciKyhlPyJvcGVuIjoiY2xvc2UiKSsiZnVsbHNjcmVlbiIpfSxleGVjQ21kOmZ1bmN0aW9uKGUsbixyLG8pe3ZhciBhPXRoaXM7bz0hIW98fCIiLCJkcm9wZG93biIhPT1lJiZhLiRlZC5mb2N1cygpLCJzdHJpa2V0aHJvdWdoIj09PWUmJmEuby5zZW1hbnRpYyYmYS5zZW1hbnRpY1RhZygic3RyaWtlIixhLm8uc2VtYW50aWNLZWVwQXR0cmlidXRlcywhMCk7dHJ5e2EuZG9jLmV4ZWNDb21tYW5kKCJzdHlsZVdpdGhDU1MiLCExLHJ8fCExKX1jYXRjaChlKXt9dHJ5e2FbZStvXShuKX1jYXRjaChyKXt0cnl7ZShuKX1jYXRjaChyKXsiaW5zZXJ0SG9yaXpvbnRhbFJ1bGUiPT09ZT9uPXZvaWQgMDoiZm9ybWF0QmxvY2siPT09ZSYmYS5pc0lFJiYobj0iPCIrbisiPiIpLGEuZG9jLmV4ZWNDb21tYW5kKGUsITEsbiksYS5zeW5jQ29kZSgpLGEuc2VtYW50aWNDb2RlKCExLCEwKTt0cnl7dmFyIHM9dC5nZXRTZWxlY3Rpb24oKS5mb2N1c05vZGU7aSh0LmdldFNlbGVjdGlvbigpLmZvY3VzTm9kZS5wYXJlbnROb2RlKS5oYXNDbGFzcygidHJ1bWJvd3lnLWVkaXRvciIpfHwocz10LmdldFNlbGVjdGlvbigpLmZvY3VzTm9kZS5wYXJlbnROb2RlKTt2YXIgdT1hLm8udGFnQ2xhc3Nlc1tuXTt1JiZpKHMpLmFkZENsYXNzKHUpfWNhdGNoKGUpe319ImRyb3Bkb3duIiE9PWUmJihhLnVwZGF0ZUJ1dHRvblBhbmVTdGF0dXMoKSxhLiRjLnRyaWdnZXIoInRid2NoYW5nZSIpKX19LG9wZW5Nb2RhbDpmdW5jdGlvbihlLG4scil7dmFyIHM9dGhpcyx1PXMuby5wcmVmaXg7aWYocj0hMSE9PXIsaSgiLiIrdSsibW9kYWwtYm94IixzLiRib3gpLmxlbmd0aD4wKXJldHVybiExO3Muby5hdXRvZ3Jvd09uRW50ZXImJihzLmF1dG9ncm93T25FbnRlckRvbnRDbG9zZT0hMCkscy5zYXZlUmFuZ2UoKSxzLnNob3dPdmVybGF5KCkscy4kYnRuUGFuZS5hZGRDbGFzcyh1KyJkaXNhYmxlIik7dmFyIGwsYz1pKCI8ZGl2Lz4iLHtjbGFzczp1KyJtb2RhbCAiK3UrImZpeGVkLXRvcCJ9KS5jc3Moe3RvcDpzLiRib3gub2Zmc2V0KCkudG9wK3MuJGJ0blBhbmUuaGVpZ2h0KCksekluZGV4Ojk5OTk5fSkuYXBwZW5kVG8oaShzLmRvYy5ib2R5KSksZj11KyJkYXJrIjswIT09cy4kYy5wYXJlbnRzKCIuIitmKS5sZW5ndGgmJmMuYWRkQ2xhc3MoZikscy4kb3ZlcmxheS5vbmUoImNsaWNrIiwoZnVuY3Rpb24oKXtyZXR1cm4gYy50cmlnZ2VyKGEpLCExfSkpLGw9cj9pKCI8Zm9ybS8+Iix7YWN0aW9uOiIiLGh0bWw6bn0pLm9uKCJzdWJtaXQiLChmdW5jdGlvbigpe3JldHVybiBjLnRyaWdnZXIobyksITF9KSkub24oInJlc2V0IiwoZnVuY3Rpb24oKXtyZXR1cm4gYy50cmlnZ2VyKGEpLCExfSkpLm9uKCJzdWJtaXQgcmVzZXQiLChmdW5jdGlvbigpe3Muby5hdXRvZ3Jvd09uRW50ZXImJihzLmF1dG9ncm93T25FbnRlckRvbnRDbG9zZT0hMSl9KSk6bjt2YXIgZD1pKCI8ZGl2Lz4iLHtjbGFzczp1KyJtb2RhbC1ib3giLGh0bWw6bH0pLmNzcyh7dG9wOiItIitzLiRidG5QYW5lLm91dGVySGVpZ2h0KCksb3BhY2l0eTowLHBhZGRpbmdCb3R0b206cj9udWxsOiI1JSJ9KS5hcHBlbmRUbyhjKS5hbmltYXRlKHt0b3A6MCxvcGFjaXR5OjF9LDEwMCk7cmV0dXJuIGUmJmkoIjxzcGFuLz4iLHt0ZXh0OmUsY2xhc3M6dSsibW9kYWwtdGl0bGUifSkucHJlcGVuZFRvKGQpLHImJihpKCI6aW5wdXQ6Zmlyc3QiLGQpLmZvY3VzKCkscy5idWlsZE1vZGFsQnRuKCJzdWJtaXQiLGQpLHMuYnVpbGRNb2RhbEJ0bigicmVzZXQiLGQpLGMuaGVpZ2h0KGQub3V0ZXJIZWlnaHQoKSsxMCkpLGkodCkudHJpZ2dlcigic2Nyb2xsIikscy4kYy50cmlnZ2VyKCJ0Yndtb2RhbG9wZW4iKSxjfSxidWlsZE1vZGFsQnRuOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5vLnByZWZpeDtyZXR1cm4gaSgiPGJ1dHRvbi8+Iix7Y2xhc3M6bisibW9kYWwtYnV0dG9uICIrbisibW9kYWwtIitlLHR5cGU6ZSx0ZXh0OnRoaXMubGFuZ1tlXXx8ZX0pLmFwcGVuZFRvKGkoImZvcm0iLHQpKX0sY2xvc2VNb2RhbDpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1lLm8ucHJlZml4O2UuJGJ0blBhbmUucmVtb3ZlQ2xhc3ModCsiZGlzYWJsZSIpLGUuJG92ZXJsYXkub2ZmKCk7dmFyIG49aSgiLiIrdCsibW9kYWwtYm94IixpKGUuZG9jLmJvZHkpKTtuLmFuaW1hdGUoe3RvcDoiLSIrbi5oZWlnaHQoKX0sMTAwLChmdW5jdGlvbigpe24ucGFyZW50KCkucmVtb3ZlKCksZS5oaWRlT3ZlcmxheSgpLGUuJGMudHJpZ2dlcigidGJ3bW9kYWxjbG9zZSIpfSkpLGUucmVzdG9yZVJhbmdlKCl9LG9wZW5Nb2RhbEluc2VydDpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcyxzPXIuby5wcmVmaXgsdT1yLmxhbmcsbD0iIixjPXMrImZvcm0tIitEYXRlLm5vdygpKyItIjtyZXR1cm4gaS5lYWNoKHQsKGZ1bmN0aW9uKGUsdCl7dmFyIG49dC5sYWJlbHx8ZSxyPXQubmFtZXx8ZSxvPXQuYXR0cmlidXRlc3x8e30sYT1jK2UsZj1PYmplY3Qua2V5cyhvKS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlKyc9Iicrb1tlXSsnIid9KSkuam9pbigiICIpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0LnR5cGUpcmV0dXJuIHQubmFtZXx8KHQubmFtZT1yKSx2b2lkKGwrPXQudHlwZSh0LGEscyx1KSk7bCs9JzxkaXYgY2xhc3M9IicrcysnaW5wdXQtcm93Ij4nLGwrPSc8ZGl2IGNsYXNzPSInK3MrJ2lucHV0LWluZm9zIj48bGFiZWwgZm9yPSInK2ErJyI+PHNwYW4+JysodVtuXT91W25dOm4pKyI8L3NwYW4+PC9sYWJlbD48L2Rpdj4iLGwrPSc8ZGl2IGNsYXNzPSInK3MrJ2lucHV0LWh0bWwiPicsaS5pc1BsYWluT2JqZWN0KHQub3B0aW9ucyk/KGwrPSc8c2VsZWN0IG5hbWU9InRhcmdldCI+JyxsKz1PYmplY3Qua2V5cyh0Lm9wdGlvbnMpLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuJzxvcHRpb24gdmFsdWU9IicrZSsnIiAnKyhlPT09dC52YWx1ZT8ic2VsZWN0ZWQiOiIiKSsiPiIrdC5vcHRpb25zW2VdKyI8L29wdGlvbj4ifSkpLmpvaW4oIiIpLGwrPSI8L3NlbGVjdD4iKToobCs9JzxpbnB1dCBpZD0iJythKyciIHR5cGU9IicrKHQudHlwZXx8InRleHQiKSsnIiBuYW1lPSInK3IrJyIgJytmLGwrPSgiY2hlY2tib3giPT09dC50eXBlJiZ0LnZhbHVlPycgY2hlY2tlZD0iY2hlY2tlZCInOiIiKSsnIHZhbHVlPSInKyh0LnZhbHVlfHwiIikucmVwbGFjZSgvIi9nLCImcXVvdDsiKSsnIj4nKSxsKz0iPC9kaXY+PC9kaXY+In0pKSxyLm9wZW5Nb2RhbChlLGwpLm9uKG8sKGZ1bmN0aW9uKCl7dmFyIGU9aSgiZm9ybSIsaSh0aGlzKSksYT0hMCxzPXt9O2kuZWFjaCh0LChmdW5jdGlvbih0LG4pe3ZhciBvPW4ubmFtZXx8dCx1PWkoJzppbnB1dFtuYW1lPSInK28rJyJdJyxlKTtzd2l0Y2godVswXS50eXBlLnRvTG93ZXJDYXNlKCkpe2Nhc2UiY2hlY2tib3giOnNbb109dS5pcygiOmNoZWNrZWQiKTticmVhaztjYXNlInJhZGlvIjpzW29dPXUuZmlsdGVyKCI6Y2hlY2tlZCIpLnZhbCgpO2JyZWFrO2RlZmF1bHQ6c1tvXT1pLnRyaW0odS52YWwoKSl9bi5yZXF1aXJlZCYmIiI9PT1zW29dPyhhPSExLHIuYWRkRXJyb3JPbk1vZGFsRmllbGQodSxyLmxhbmcucmVxdWlyZWQpKTpuLnBhdHRlcm4mJiFuLnBhdHRlcm4udGVzdChzW29dKSYmKGE9ITEsci5hZGRFcnJvck9uTW9kYWxGaWVsZCh1LG4ucGF0dGVybkVycm9yKSl9KSksYSYmKHIucmVzdG9yZVJhbmdlKCksbihzLHQpJiYoci5zeW5jQ29kZSgpLHIuJGMudHJpZ2dlcigidGJ3Y2hhbmdlIiksci5jbG9zZU1vZGFsKCksaSh0aGlzKS5vZmYobykpKX0pKS5vbmUoYSwoZnVuY3Rpb24oKXtpKHRoaXMpLm9mZihvKSxyLmNsb3NlTW9kYWwoKX0pKX0sYWRkRXJyb3JPbk1vZGFsRmllbGQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLm8ucHJlZml4LHI9bisibXNnLWVycm9yIixvPWUuY2xvc2VzdCgiLiIrbisiaW5wdXQtcm93Iik7ZS5vbigiY2hhbmdlIGtleXVwIiwoZnVuY3Rpb24oKXtvLnJlbW92ZUNsYXNzKG4rImlucHV0LWVycm9yIiksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtvLmZpbmQoIi4iK3IpLnJlbW92ZSgpfSksMTUwKX0pKSxvLmFkZENsYXNzKG4rImlucHV0LWVycm9yIikuZmluZCgiLiIrbisiaW5wdXQtaW5mb3MgbGFiZWwiKS5hcHBlbmQoaSgiPHNwYW4vPiIse2NsYXNzOnIsdGV4dDp0fSkpfSxnZXREZWZhdWx0SW1nRGJsQ2xpY2tIYW5kbGVyOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdD1pKHRoaXMpLG49dC5hdHRyKCJzcmMiKSxyPSIoQmFzZTY0KSI7MD09PW4uaW5kZXhPZigiZGF0YTppbWFnZSIpJiYobj1yKTt2YXIgbz17dXJsOntsYWJlbDoiVVJMIix2YWx1ZTpuLHJlcXVpcmVkOiEwfSxhbHQ6e2xhYmVsOmUubGFuZy5kZXNjcmlwdGlvbix2YWx1ZTp0LmF0dHIoImFsdCIpfX07cmV0dXJuIGUuby5pbWFnZVdpZHRoTW9kYWxFZGl0JiYoby53aWR0aD17dmFsdWU6dC5hdHRyKCJ3aWR0aCIpP3QuYXR0cigid2lkdGgiKToiIn0pLGUub3Blbk1vZGFsSW5zZXJ0KGUubGFuZy5pbnNlcnRJbWFnZSxvLChmdW5jdGlvbihuKXtyZXR1cm4gbi51cmwhPT1yJiZ0LmF0dHIoe3NyYzpuLnVybH0pLHQuYXR0cih7YWx0Om4uYWx0fSksZS5vLmltYWdlV2lkdGhNb2RhbEVkaXQmJihwYXJzZUludChuLndpZHRoKT4wP3QuYXR0cih7d2lkdGg6bi53aWR0aH0pOnQucmVtb3ZlQXR0cigid2lkdGgiKSksITB9KSksITF9fSxzYXZlUmFuZ2U6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9ZS5kb2MuZ2V0U2VsZWN0aW9uKCk7aWYoZS5yYW5nZT1udWxsLHQmJnQucmFuZ2VDb3VudCl7dmFyIG4scj1lLnJhbmdlPXQuZ2V0UmFuZ2VBdCgwKSxpPWUuZG9jLmNyZWF0ZVJhbmdlKCk7aS5zZWxlY3ROb2RlQ29udGVudHMoZS4kZWRbMF0pLGkuc2V0RW5kKHIuc3RhcnRDb250YWluZXIsci5zdGFydE9mZnNldCksbj0oaSsiIikubGVuZ3RoLGUubWV0YVJhbmdlPXtzdGFydDpuLGVuZDpuKyhyKyIiKS5sZW5ndGh9fX0scmVzdG9yZVJhbmdlOmZ1bmN0aW9uKCl7dmFyIGUsdD10aGlzLG49dC5tZXRhUmFuZ2Uscj10LnJhbmdlLGk9dC5kb2MuZ2V0U2VsZWN0aW9uKCk7aWYocil7aWYobiYmbi5zdGFydCE9PW4uZW5kKXt2YXIgbyxhPTAscz1bdC4kZWRbMF1dLHU9ITEsbD0hMTtmb3IoZT10LmRvYy5jcmVhdGVSYW5nZSgpOyFsJiYobz1zLnBvcCgpKTspaWYoMz09PW8ubm9kZVR5cGUpe3ZhciBjPWErby5sZW5ndGg7IXUmJm4uc3RhcnQ+PWEmJm4uc3RhcnQ8PWMmJihlLnNldFN0YXJ0KG8sbi5zdGFydC1hKSx1PSEwKSx1JiZuLmVuZD49YSYmbi5lbmQ8PWMmJihlLnNldEVuZChvLG4uZW5kLWEpLGw9ITApLGE9Y31lbHNlIGZvcih2YXIgZj1vLmNoaWxkTm9kZXMsZD1mLmxlbmd0aDtkPjA7KWQtPTEscy5wdXNoKGZbZF0pfXRyeXtpLnJlbW92ZUFsbFJhbmdlcygpfWNhdGNoKGUpe31pLmFkZFJhbmdlKGV8fHIpfX0sZ2V0UmFuZ2VUZXh0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmFuZ2UrIiJ9LGNsZWFyQnV0dG9uUGFuZVN0YXR1czpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1lLm8ucHJlZml4LG49dCsiYWN0aXZlLWJ1dHRvbiAiK3QrImFjdGl2ZSIscj10KyJvcmlnaW5hbC1pY29uIjtpKCIuIit0KyJhY3RpdmUtYnV0dG9uIixlLiRidG5QYW5lKS5yZW1vdmVDbGFzcyhuKSxpKCIuIityLGUuJGJ0blBhbmUpLmVhY2goKGZ1bmN0aW9uKCl7aSh0aGlzKS5maW5kKCJzdmcgdXNlIikuYXR0cigieGxpbms6aHJlZiIsaSh0aGlzKS5kYXRhKHIpKX0pKX0sdXBkYXRlQnV0dG9uUGFuZVN0YXR1czpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1lLm8ucHJlZml4LG49dCsiYWN0aXZlLWJ1dHRvbiAiK3QrImFjdGl2ZSIscj10KyJvcmlnaW5hbC1pY29uIixvPWUuZ2V0VGFnc1JlY3Vyc2l2ZShlLmRvYy5nZXRTZWxlY3Rpb24oKS5mb2N1c05vZGUpO2UuY2xlYXJCdXR0b25QYW5lU3RhdHVzKCksaS5lYWNoKG8sKGZ1bmN0aW9uKG8sYSl7dmFyIHM9ZS50YWdUb0J1dHRvblthLnRvTG93ZXJDYXNlKCldLHU9aSgiLiIrdCtzKyItYnV0dG9uIixlLiRidG5QYW5lKTtpZih1Lmxlbmd0aD4wKXUuYWRkQ2xhc3Mobik7ZWxzZSB0cnl7dmFyIGw9KHU9aSgiLiIrdCsiZHJvcGRvd24gLiIrdCtzKyItZHJvcGRvd24tYnV0dG9uIixlLiRib3gpKS5maW5kKCJzdmcgdXNlIiksYz11LnBhcmVudCgpLmRhdGEodCsiZHJvcGRvd24iKSxmPWkoIi4iK3QrYysiLWJ1dHRvbiIsZS4kYm94KSxkPWYuZmluZCgic3ZnIHVzZSIpO2YuYWRkQ2xhc3MobiksZS5vLmNoYW5nZUFjdGl2ZURyb3Bkb3duSWNvbiYmbC5sZW5ndGg+MCYmKGYuYWRkQ2xhc3MocikuZGF0YShyLGQuYXR0cigieGxpbms6aHJlZiIpKSxkLmF0dHIoInhsaW5rOmhyZWYiLGwuYXR0cigieGxpbms6aHJlZiIpKSl9Y2F0Y2goZSl7fX0pKX0sZ2V0VGFnc1JlY3Vyc2l2ZTpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7aWYodD10fHwoZSYmZS50YWdOYW1lP1tlLnRhZ05hbWVdOltdKSwhZXx8IWUucGFyZW50Tm9kZSlyZXR1cm4gdDt2YXIgcj0oZT1lLnBhcmVudE5vZGUpLnRhZ05hbWU7cmV0dXJuIkRJViI9PT1yP3Q6KCJQIj09PXImJiIiIT09ZS5zdHlsZS50ZXh0QWxpZ24mJnQucHVzaChlLnN0eWxlLnRleHRBbGlnbiksaS5lYWNoKG4udGFnSGFuZGxlcnMsKGZ1bmN0aW9uKHIsaSl7dD10LmNvbmNhdChpKGUsbikpfSkpLHQucHVzaChyKSxuLmdldFRhZ3NSZWN1cnNpdmUoZSx0KS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT1lfSkpKX0saW5pdFBsdWdpbnM6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2UubG9hZGVkUGx1Z2lucz1bXSxpLmVhY2goaS50cnVtYm93eWcucGx1Z2lucywoZnVuY3Rpb24odCxuKXtuLnNob3VsZEluaXQmJiFuLnNob3VsZEluaXQoZSl8fChuLmluaXQoZSksbi50YWdIYW5kbGVyJiZlLnRhZ0hhbmRsZXJzLnB1c2gobi50YWdIYW5kbGVyKSxlLmxvYWRlZFBsdWdpbnMucHVzaChuKSl9KSl9LGRlc3Ryb3lQbHVnaW5zOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcztpLmVhY2godGhpcy5sb2FkZWRQbHVnaW5zLChmdW5jdGlvbih0LG4pe24uZGVzdHJveSYmbi5kZXN0cm95KGUpfSkpfX19KG5hdmlnYXRvcix3aW5kb3csZG9jdW1lbnQsalF1ZXJ5KX0sZW5kZDpmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7dGhpcy5tZXNzYWdlPWV9ci5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iQ2FuY2VsIisodGhpcy5tZXNzYWdlPyI6ICIrdGhpcy5tZXNzYWdlOiIiKX0sci5wcm90b3R5cGUuX19DQU5DRUxfXz0hMCxlLmV4cG9ydHM9cn0sZXF5ajpmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oInhUSisiKTtlLmV4cG9ydHM9ci5pc1N0YW5kYXJkQnJvd3NlckVudigpP3t3cml0ZTpmdW5jdGlvbihlLHQsbixpLG8sYSl7dmFyIHM9W107cy5wdXNoKGUrIj0iK2VuY29kZVVSSUNvbXBvbmVudCh0KSksci5pc051bWJlcihuKSYmcy5wdXNoKCJleHBpcmVzPSIrbmV3IERhdGUobikudG9HTVRTdHJpbmcoKSksci5pc1N0cmluZyhpKSYmcy5wdXNoKCJwYXRoPSIraSksci5pc1N0cmluZyhvKSYmcy5wdXNoKCJkb21haW49IitvKSwhMD09PWEmJnMucHVzaCgic2VjdXJlIiksZG9jdW1lbnQuY29va2llPXMuam9pbigiOyAiKX0scmVhZDpmdW5jdGlvbihlKXt2YXIgdD1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58O1xccyopKCIrZSsiKT0oW147XSopIikpO3JldHVybiB0P2RlY29kZVVSSUNvbXBvbmVudCh0WzNdKTpudWxsfSxyZW1vdmU6ZnVuY3Rpb24oZSl7dGhpcy53cml0ZShlLCIiLERhdGUubm93KCktODY0ZTUpfX06e3dyaXRlOmZ1bmN0aW9uKCl7fSxyZWFkOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LHJlbW92ZTpmdW5jdGlvbigpe319fSxnN25wOmZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigiMlNWZCIpLGk9bigiNW9NcCIpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3JldHVybiBlJiYhcih0KT9pKGUsdCk6dH19LCJqZlMrIjpmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oImVuZGQiKTtmdW5jdGlvbiBpKGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoImV4ZWN1dG9yIG11c3QgYmUgYSBmdW5jdGlvbi4iKTt2YXIgdDt0aGlzLnByb21pc2U9bmV3IFByb21pc2UoKGZ1bmN0aW9uKGUpe3Q9ZX0pKTt2YXIgbj10aGlzO2UoKGZ1bmN0aW9uKGUpe24ucmVhc29ufHwobi5yZWFzb249bmV3IHIoZSksdChuLnJlYXNvbikpfSkpfWkucHJvdG90eXBlLnRocm93SWZSZXF1ZXN0ZWQ9ZnVuY3Rpb24oKXtpZih0aGlzLnJlYXNvbil0aHJvdyB0aGlzLnJlYXNvbn0saS5zb3VyY2U9ZnVuY3Rpb24oKXt2YXIgZTtyZXR1cm57dG9rZW46bmV3IGkoKGZ1bmN0aW9uKHQpe2U9dH0pKSxjYW5jZWw6ZX19LGUuZXhwb3J0cz1pfSxweUNkOmZ1bmN0aW9uKGUsdCl7fSx0UTJCOmZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigieFRKKyIpLGk9bigiUm4rZyIpLG89bigiTUxXWiIpLGE9bigiZzducCIpLHM9bigidzBWaSIpLHU9bigiT1RUdyIpLGw9bigiTFlORiIpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHQsYyl7dmFyIGY9ZS5kYXRhLGQ9ZS5oZWFkZXJzO3IuaXNGb3JtRGF0YShmKSYmZGVsZXRlIGRbIkNvbnRlbnQtVHlwZSJdO3ZhciBoPW5ldyBYTUxIdHRwUmVxdWVzdDtpZihlLmF1dGgpe3ZhciBwPWUuYXV0aC51c2VybmFtZXx8IiIsZz1lLmF1dGgucGFzc3dvcmR8fCIiO2QuQXV0aG9yaXphdGlvbj0iQmFzaWMgIitidG9hKHArIjoiK2cpfXZhciB2PWEoZS5iYXNlVVJMLGUudXJsKTtpZihoLm9wZW4oZS5tZXRob2QudG9VcHBlckNhc2UoKSxvKHYsZS5wYXJhbXMsZS5wYXJhbXNTZXJpYWxpemVyKSwhMCksaC50aW1lb3V0PWUudGltZW91dCxoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2lmKGgmJjQ9PT1oLnJlYWR5U3RhdGUmJigwIT09aC5zdGF0dXN8fGgucmVzcG9uc2VVUkwmJjA9PT1oLnJlc3BvbnNlVVJMLmluZGV4T2YoImZpbGU6IikpKXt2YXIgbj0iZ2V0QWxsUmVzcG9uc2VIZWFkZXJzImluIGg/cyhoLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKTpudWxsLHI9e2RhdGE6ZS5yZXNwb25zZVR5cGUmJiJ0ZXh0IiE9PWUucmVzcG9uc2VUeXBlP2gucmVzcG9uc2U6aC5yZXNwb25zZVRleHQsc3RhdHVzOmguc3RhdHVzLHN0YXR1c1RleHQ6aC5zdGF0dXNUZXh0LGhlYWRlcnM6bixjb25maWc6ZSxyZXF1ZXN0Omh9O2kodCxjLHIpLGg9bnVsbH19LGgub25hYm9ydD1mdW5jdGlvbigpe2gmJihjKGwoIlJlcXVlc3QgYWJvcnRlZCIsZSwiRUNPTk5BQk9SVEVEIixoKSksaD1udWxsKX0saC5vbmVycm9yPWZ1bmN0aW9uKCl7YyhsKCJOZXR3b3JrIEVycm9yIixlLG51bGwsaCkpLGg9bnVsbH0saC5vbnRpbWVvdXQ9ZnVuY3Rpb24oKXt2YXIgdD0idGltZW91dCBvZiAiK2UudGltZW91dCsibXMgZXhjZWVkZWQiO2UudGltZW91dEVycm9yTWVzc2FnZSYmKHQ9ZS50aW1lb3V0RXJyb3JNZXNzYWdlKSxjKGwodCxlLCJFQ09OTkFCT1JURUQiLGgpKSxoPW51bGx9LHIuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSl7dmFyIG09bigiZXF5aiIpLHk9KGUud2l0aENyZWRlbnRpYWxzfHx1KHYpKSYmZS54c3JmQ29va2llTmFtZT9tLnJlYWQoZS54c3JmQ29va2llTmFtZSk6dm9pZCAwO3kmJihkW2UueHNyZkhlYWRlck5hbWVdPXkpfWlmKCJzZXRSZXF1ZXN0SGVhZGVyImluIGgmJnIuZm9yRWFjaChkLChmdW5jdGlvbihlLHQpe3ZvaWQgMD09PWYmJiJjb250ZW50LXR5cGUiPT09dC50b0xvd2VyQ2FzZSgpP2RlbGV0ZSBkW3RdOmguc2V0UmVxdWVzdEhlYWRlcih0LGUpfSkpLHIuaXNVbmRlZmluZWQoZS53aXRoQ3JlZGVudGlhbHMpfHwoaC53aXRoQ3JlZGVudGlhbHM9ISFlLndpdGhDcmVkZW50aWFscyksZS5yZXNwb25zZVR5cGUpdHJ5e2gucmVzcG9uc2VUeXBlPWUucmVzcG9uc2VUeXBlfWNhdGNoKHQpe2lmKCJqc29uIiE9PWUucmVzcG9uc2VUeXBlKXRocm93IHR9ImZ1bmN0aW9uIj09dHlwZW9mIGUub25Eb3dubG9hZFByb2dyZXNzJiZoLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIixlLm9uRG93bmxvYWRQcm9ncmVzcyksImZ1bmN0aW9uIj09dHlwZW9mIGUub25VcGxvYWRQcm9ncmVzcyYmaC51cGxvYWQmJmgudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIixlLm9uVXBsb2FkUHJvZ3Jlc3MpLGUuY2FuY2VsVG9rZW4mJmUuY2FuY2VsVG9rZW4ucHJvbWlzZS50aGVuKChmdW5jdGlvbihlKXtoJiYoaC5hYm9ydCgpLGMoZSksaD1udWxsKX0pKSx2b2lkIDA9PT1mJiYoZj1udWxsKSxoLnNlbmQoZil9KSl9fSx2RHFpOmZ1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9bigienVSNCIpfSx3MFZpOmZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigieFRKKyIpLGk9WyJhZ2UiLCJhdXRob3JpemF0aW9uIiwiY29udGVudC1sZW5ndGgiLCJjb250ZW50LXR5cGUiLCJldGFnIiwiZXhwaXJlcyIsImZyb20iLCJob3N0IiwiaWYtbW9kaWZpZWQtc2luY2UiLCJpZi11bm1vZGlmaWVkLXNpbmNlIiwibGFzdC1tb2RpZmllZCIsImxvY2F0aW9uIiwibWF4LWZvcndhcmRzIiwicHJveHktYXV0aG9yaXphdGlvbiIsInJlZmVyZXIiLCJyZXRyeS1hZnRlciIsInVzZXItYWdlbnQiXTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQsbixvLGE9e307cmV0dXJuIGU/KHIuZm9yRWFjaChlLnNwbGl0KCJcbiIpLChmdW5jdGlvbihlKXtpZihvPWUuaW5kZXhPZigiOiIpLHQ9ci50cmltKGUuc3Vic3RyKDAsbykpLnRvTG93ZXJDYXNlKCksbj1yLnRyaW0oZS5zdWJzdHIobysxKSksdCl7aWYoYVt0XSYmaS5pbmRleE9mKHQpPj0wKXJldHVybjthW3RdPSJzZXQtY29va2llIj09PXQ/KGFbdF0/YVt0XTpbXSkuY29uY2F0KFtuXSk6YVt0XT9hW3RdKyIsICIrbjpufX0pKSxhKTphfX0seEFHUTpmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oInhUSisiKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiByLmZvckVhY2gobiwoZnVuY3Rpb24obil7ZT1uKGUsdCl9KSksZX19LCJ4VEorIjpmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oIkhTc2EiKSxpPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7ZnVuY3Rpb24gbyhlKXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT09aS5jYWxsKGUpfWZ1bmN0aW9uIGEoZSl7cmV0dXJuIHZvaWQgMD09PWV9ZnVuY3Rpb24gcyhlKXtyZXR1cm4gbnVsbCE9PWUmJiJvYmplY3QiPT10eXBlb2YgZX1mdW5jdGlvbiB1KGUpe3JldHVybiJbb2JqZWN0IEZ1bmN0aW9uXSI9PT1pLmNhbGwoZSl9ZnVuY3Rpb24gbChlLHQpe2lmKG51bGwhPWUpaWYoIm9iamVjdCIhPXR5cGVvZiBlJiYoZT1bZV0pLG8oZSkpZm9yKHZhciBuPTAscj1lLmxlbmd0aDtuPHI7bisrKXQuY2FsbChudWxsLGVbbl0sbixlKTtlbHNlIGZvcih2YXIgaSBpbiBlKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLGkpJiZ0LmNhbGwobnVsbCxlW2ldLGksZSl9ZS5leHBvcnRzPXtpc0FycmF5Om8saXNBcnJheUJ1ZmZlcjpmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBBcnJheUJ1ZmZlcl0iPT09aS5jYWxsKGUpfSxpc0J1ZmZlcjpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9PWUmJiFhKGUpJiZudWxsIT09ZS5jb25zdHJ1Y3RvciYmIWEoZS5jb25zdHJ1Y3RvcikmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmNvbnN0cnVjdG9yLmlzQnVmZmVyJiZlLmNvbnN0cnVjdG9yLmlzQnVmZmVyKGUpfSxpc0Zvcm1EYXRhOmZ1bmN0aW9uKGUpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgRm9ybURhdGEmJmUgaW5zdGFuY2VvZiBGb3JtRGF0YX0saXNBcnJheUJ1ZmZlclZpZXc6ZnVuY3Rpb24oZSl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmQXJyYXlCdWZmZXIuaXNWaWV3P0FycmF5QnVmZmVyLmlzVmlldyhlKTplJiZlLmJ1ZmZlciYmZS5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcn0saXNTdHJpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlfSxpc051bWJlcjpmdW5jdGlvbihlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGV9LGlzT2JqZWN0OnMsaXNVbmRlZmluZWQ6YSxpc0RhdGU6ZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgRGF0ZV0iPT09aS5jYWxsKGUpfSxpc0ZpbGU6ZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgRmlsZV0iPT09aS5jYWxsKGUpfSxpc0Jsb2I6ZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgQmxvYl0iPT09aS5jYWxsKGUpfSxpc0Z1bmN0aW9uOnUsaXNTdHJlYW06ZnVuY3Rpb24oZSl7cmV0dXJuIHMoZSkmJnUoZS5waXBlKX0saXNVUkxTZWFyY2hQYXJhbXM6ZnVuY3Rpb24oZSl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBVUkxTZWFyY2hQYXJhbXMmJmUgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXN9LGlzU3RhbmRhcmRCcm93c2VyRW52OmZ1bmN0aW9uKCl7cmV0dXJuKCJ1bmRlZmluZWQiPT10eXBlb2YgbmF2aWdhdG9yfHwiUmVhY3ROYXRpdmUiIT09bmF2aWdhdG9yLnByb2R1Y3QmJiJOYXRpdmVTY3JpcHQiIT09bmF2aWdhdG9yLnByb2R1Y3QmJiJOUyIhPT1uYXZpZ2F0b3IucHJvZHVjdCkmJigidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmInVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCl9LGZvckVhY2g6bCxtZXJnZTpmdW5jdGlvbiBlKCl7dmFyIHQ9e307ZnVuY3Rpb24gbihuLHIpeyJvYmplY3QiPT10eXBlb2YgdFtyXSYmIm9iamVjdCI9PXR5cGVvZiBuP3Rbcl09ZSh0W3JdLG4pOnRbcl09bn1mb3IodmFyIHI9MCxpPWFyZ3VtZW50cy5sZW5ndGg7cjxpO3IrKylsKGFyZ3VtZW50c1tyXSxuKTtyZXR1cm4gdH0sZGVlcE1lcmdlOmZ1bmN0aW9uIGUoKXt2YXIgdD17fTtmdW5jdGlvbiBuKG4scil7Im9iamVjdCI9PXR5cGVvZiB0W3JdJiYib2JqZWN0Ij09dHlwZW9mIG4/dFtyXT1lKHRbcl0sbik6dFtyXT0ib2JqZWN0Ij09dHlwZW9mIG4/ZSh7fSxuKTpufWZvcih2YXIgcj0wLGk9YXJndW1lbnRzLmxlbmd0aDtyPGk7cisrKWwoYXJndW1lbnRzW3JdLG4pO3JldHVybiB0fSxleHRlbmQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBsKHQsKGZ1bmN0aW9uKHQsaSl7ZVtpXT1uJiYiZnVuY3Rpb24iPT10eXBlb2YgdD9yKHQsbik6dH0pKSxlfSx0cmltOmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoL15ccyovLCIiKS5yZXBsYWNlKC9ccyokLywiIil9fX0seUs5czpmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oInhUSisiKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyLmZvckVhY2goZSwoZnVuY3Rpb24obixyKXtyIT09dCYmci50b1VwcGVyQ2FzZSgpPT09dC50b1VwcGVyQ2FzZSgpJiYoZVt0XT1uLGRlbGV0ZSBlW3JdKX0pKX19LHlMcGo6ZnVuY3Rpb24oZSx0KXt2YXIgbjtuPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KCk7dHJ5e249bnx8bmV3IEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCl9Y2F0Y2goZSl7Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJihuPXdpbmRvdyl9ZS5leHBvcnRzPW59LHp1UjQ6ZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKCJ4VEorIiksaT1uKCJIU3NhIiksbz1uKCJDZ2FTIiksYT1uKCJTbnRCIik7ZnVuY3Rpb24gcyhlKXt2YXIgdD1uZXcgbyhlKSxuPWkoby5wcm90b3R5cGUucmVxdWVzdCx0KTtyZXR1cm4gci5leHRlbmQobixvLnByb3RvdHlwZSx0KSxyLmV4dGVuZChuLHQpLG59dmFyIHU9cyhuKCJKRVFyIikpO3UuQXhpb3M9byx1LmNyZWF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gcyhhKHUuZGVmYXVsdHMsZSkpfSx1LkNhbmNlbD1uKCJlbmRkIiksdS5DYW5jZWxUb2tlbj1uKCJqZlMrIiksdS5pc0NhbmNlbD1uKCJMbWVtIiksdS5hbGw9ZnVuY3Rpb24oZSl7cmV0dXJuIFByb21pc2UuYWxsKGUpfSx1LnNwcmVhZD1uKCJEZlpCIiksZS5leHBvcnRzPXUsZS5leHBvcnRzLmRlZmF1bHQ9dX19KTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXBwLmpzLm1hcA=="></script>
|
|
</main>
|
|
<footer class="pt-3 pb-3 mb-0 text-light">
|
|
<div class="container">
|
|
<div class="row">
|
|
<div class="col-sm-4">
|
|
<a href="https://noirelabs.net/contact">Contact-us</a><br>
|
|
<a href="https://noirelabs.net/shipping">Shipping</a><br>
|
|
<a href="https://noirelabs.net/about">About</a><br>
|
|
<a href="https://noirelabs.net/payment">Payment</a>
|
|
</div>
|
|
<div class="col-sm-4">
|
|
<a href="https://noirelabs.net/faq">FaQ</a><br>
|
|
<a href="https://noirelabs.net/how-to-order">How to order</a><br>
|
|
<a target="_blank" href="https://twitter.com/NovaNoiire">Twitter</a><br>
|
|
<a href="https://noirelabs.net/newsletter">Newsletter</a>
|
|
</div>
|
|
<div class="col-sm-4">
|
|
<a target="_blank" href="https://diyhrt.wiki/">diyhrt.wiki</a><br>
|
|
<a target="_blank" href="https://diyhrt.cafe/">diyhrt.cafe</a><br>
|
|
<a target="_blank" href="https://www.reddit.com/r/TransDIY">r/transdiy</a><br>
|
|
<a target="_blank" href="https://vannapharma.com/">Vanna pharma (UK customers)</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</footer>
|
|
|
|
|
|
</body></html>
|