1778692585
441d63ebbc39eba359c9061ece8482bd-phpdoc%3A045a0a0ad13c3786129d18e5c56a6065-0a8bdfa0b4e08708a6cb22cbd70cfbe5
s:140768:"TzozMzoicGhwRG9jdW1lbnRvclxSZWZsZWN0aW9uXFBocFxGaWxlIjoxNDp7czozOToiAHBocERvY3VtZW50b3JcUmVmbGVjdGlvblxQaHBcRmlsZQBuYW1lIjtzOjk6InRlc3QyLnBocCI7czo0NToiAHBocERvY3VtZW50b3JcUmVmbGVjdGlvblxQaHBcRmlsZQBuYW1lc3BhY2VzIjthOjA6e31zOjQzOiIAcGhwRG9jdW1lbnRvclxSZWZsZWN0aW9uXFBocFxGaWxlAGluY2x1ZGVzIjthOjA6e31zOjQ0OiIAcGhwRG9jdW1lbnRvclxSZWZsZWN0aW9uXFBocFxGaWxlAGZ1bmN0aW9ucyI7YTowOnt9czo0NDoiAHBocERvY3VtZW50b3JcUmVmbGVjdGlvblxQaHBcRmlsZQBjb25zdGFudHMiO2E6MDp7fXM6NDI6IgBwaHBEb2N1bWVudG9yXFJlZmxlY3Rpb25cUGhwXEZpbGUAY2xhc3NlcyI7YTowOnt9czo0NToiAHBocERvY3VtZW50b3JcUmVmbGVjdGlvblxQaHBcRmlsZQBpbnRlcmZhY2VzIjthOjA6e31zOjQxOiIAcGhwRG9jdW1lbnRvclxSZWZsZWN0aW9uXFBocFxGaWxlAHRyYWl0cyI7YTowOnt9czo0MDoiAHBocERvY3VtZW50b3JcUmVmbGVjdGlvblxQaHBcRmlsZQBlbnVtcyI7YTowOnt9czozOToiAHBocERvY3VtZW50b3JcUmVmbGVjdGlvblxQaHBcRmlsZQBoYXNoIjtzOjMyOiIwYThiZGZhMGI0ZTA4NzA4YTZjYjIyY2JkNzBjZmJlNSI7czozOToiAHBocERvY3VtZW50b3JcUmVmbGVjdGlvblxQaHBcRmlsZQBwYXRoIjtzOjE1OiJwYWdlcy90ZXN0Mi5waHAiO3M6NDE6IgBwaHBEb2N1bWVudG9yXFJlZmxlY3Rpb25cUGhwXEZpbGUAc291cmNlIjtzOjEwNDY4MzoiPD9waHAKc2Vzc2lvbl9zdGFydCgpOwppZiAoIWlzc2V0KCRfU0VTU0lPTlsnbG9nZ2VkX2luJ10pIHx8ICRfU0VTU0lPTlsnbG9nZ2VkX2luJ10gPT09IGZhbHNlKSB7CiAgaGVhZGVyKCdMb2NhdGlvbjogbG9naW4ucGhwJyk7CiAgZXhpdDsKfQo/PgoKPCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CiAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+CiAgICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CiAgICA8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPWVkZ2UiPgoKICAgIDwhLS0gVmlld3BvcnQgY29uZmlndXJhZG8gcGFyYSBtw7N2aWxlcyAtLT4KICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MSwgc2hyaW5rLXRvLWZpdD1ubyI+CiAgICA8dGl0bGU+R2VudGVsZWxsYSBBbGVsYSEgfCA8L3RpdGxlPgoKICAgIDxsaW5rIGhyZWY9Ii4uL3ZlbmRvcnMvYm9vdHN0cmFwL2Rpc3QvY3NzL2Jvb3RzdHJhcC5taW4uY3NzIiByZWw9InN0eWxlc2hlZXQiPgogICAgPGxpbmsgaHJlZj0iLi4vdmVuZG9ycy9mb250LWF3ZXNvbWUvY3NzL2ZvbnQtYXdlc29tZS5taW4uY3NzIiByZWw9InN0eWxlc2hlZXQiPgogICAgPGxpbmsgaHJlZj0iLi4vdmVuZG9ycy9pQ2hlY2svc2tpbnMvZmxhdC9ncmVlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCI+CiAgICA8bGluayBocmVmPSIuLi9idWlsZC9jc3MvY3VzdG9tLm1pbi5jc3MiIHJlbD0ic3R5bGVzaGVldCI+CgogICAgPCEtLSBFbmxhY2VzIERhdGFUYWJsZXMgcGFyYSBCb290c3RyYXAgNCAtLT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Imh0dHBzOi8vY2RuLmRhdGF0YWJsZXMubmV0LzEuMTMuNi9jc3MvZGF0YVRhYmxlcy5ib290c3RyYXA0Lm1pbi5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iaHR0cHM6Ly9jZG4uZGF0YXRhYmxlcy5uZXQvcmVzcG9uc2l2ZS8yLjUuMC9jc3MvcmVzcG9uc2l2ZS5ib290c3RyYXA0Lm1pbi5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iaHR0cHM6Ly9jZG4uZGF0YXRhYmxlcy5uZXQvYnV0dG9ucy8yLjQuMS9jc3MvYnV0dG9ucy5ib290c3RyYXA0Lm1pbi5jc3MiPgoKICAgIDwhLS0gUE5vdGlmeSBDU1MgLS0+CiAgICA8bGluayBocmVmPSIuLi92ZW5kb3JzL3Bub3RpZnkvZGlzdC9wbm90aWZ5LmNzcyIgcmVsPSJzdHlsZXNoZWV0Ij4KICAgIDxsaW5rIGhyZWY9Ii4uL3ZlbmRvcnMvcG5vdGlmeS9kaXN0L3Bub3RpZnkuYnV0dG9ucy5jc3MiIHJlbD0ic3R5bGVzaGVldCI+CiAgICA8bGluayBocmVmPSIuLi92ZW5kb3JzL3Bub3RpZnkvZGlzdC9wbm90aWZ5Lm5vbmJsb2NrLmNzcyIgcmVsPSJzdHlsZXNoZWV0Ij4KCiAgICA8IS0tIEdyaWRzdGFjayBDU1MgLS0+CiAgICA8bGluayBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2dyaWRzdGFja0A4LjIuMy9kaXN0L2dyaWRzdGFjay5taW4uY3NzIiByZWw9InN0eWxlc2hlZXQiLz4KCiAgICA8IS0tIERhdGF0aW1lIHBpY2tlciBDU1MtLT4KICAgIDxsaW5rIGhyZWY9Ii4uL3ZlbmRvcnMvYm9vdHN0cmFwLWRhdGVyYW5nZXBpY2tlci9kYXRlcmFuZ2VwaWNrZXIuY3NzIiByZWw9InN0eWxlc2hlZXQiPgogICAgPGxpbmsgaHJlZj0iLi4vdmVuZG9ycy9ib290c3RyYXAtZGF0ZXRpbWVwaWNrZXIvYnVpbGQvY3NzL2Jvb3RzdHJhcC1kYXRldGltZXBpY2tlci5jc3MiIHJlbD0ic3R5bGVzaGVldCI+CgogICAgPCEtLSBFY2hhcnQgQ1NTIC0tPgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vZWNoYXJ0c0A1LjUuMC9kaXN0L2VjaGFydHMubWluLmpzIj48L3NjcmlwdD4KCjwvaGVhZD4KCjxzdHlsZT4KICAgICNhdmlzby1yb3RhY2lvbiB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgdG9wOiAwOyBsZWZ0OiAwOyB3aWR0aDogMTAwdnc7IGhlaWdodDogMTAwdmg7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSg0MiwgNjMsIDg0LCAwLjU1KTsKICAgICAgICB6LWluZGV4OiA5OTk5OTsKICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgcGFkZGluZzogMjBweDsKICAgIH0KCiAgICBAbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIGFuZCAob3JpZW50YXRpb246IHBvcnRyYWl0KSB7CiAgICAgICAgYm9keTpub3QoLmF2aXNvLWNlcnJhZG8pICNhdmlzby1yb3RhY2lvbiB7CiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgfQogICAgfQoKICAgIC5hbmltYWNpb24tbW92aWwgewogICAgICAgIGZvbnQtc2l6ZTogODBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4OwogICAgICAgIGFuaW1hdGlvbjogcm90YXJNb3ZpbCAxLjVzIGluZmluaXRlIGVhc2UtaW4tb3V0IGFsdGVybmF0ZTsKICAgIH0KCiAgICBAa2V5ZnJhbWVzIHJvdGFyTW92aWwgewogICAgICAgIDAlICAgeyB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsgfQogICAgICAgIDEwMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgtOTBkZWcpOyB9CiAgICB9CgogICAgI3JlZ2xhcy1jb250YWluZXIgdGgsCiAgICAjcmVnbGFzLWxpc3RhIHRkIHsKICAgICAgICBwYWRkaW5nOiAxLjRweCAhaW1wb3J0YW50OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICB9CgogICAgLmdyaWQtc3RhY2staXRlbS1jb250ZW50IHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNlNmU5ZWQ7CiAgICAgICAgYm9yZGVyLXRvcDogMnB4IHNvbGlkICMxQUJCOUM7CiAgICAgICAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwwLDAsMC4wNSk7CiAgICAgICAgcGFkZGluZzogMTBweDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIH0KICAgIC5ncy1pdGVtLWhlYWRlciB7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlZWU7CiAgICAgICAgcGFkZGluZy1ib3R0b206IDVweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIH0KICAgIC5ncy1pdGVtLWJvZHkgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgY29sb3I6ICM3Mzg3OUM7CiAgICB9CiAgICAuYnRuLXJlbW92ZS13aWRnZXQgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBjb2xvcjogI2RjMzU0NTsKICAgIH0KICAgIC8qIFRhZ3MgZGUgc2VyaWVzICovCiAgICAuZ3Mtc2VyaWUtdGFnIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA0cHg7CiAgICAgICAgYmFja2dyb3VuZDogIzFBQkI5QzsgY29sb3I6ICNmZmY7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OyBwYWRkaW5nOiAycHggN3B4OyBmb250LXNpemU6IDExcHg7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIH0KICAgIC5ncy1zZXJpZS10YWcgLmJ0bi1yZW1vdmUtc2VyaWUgeyBjdXJzb3I6IHBvaW50ZXI7IG9wYWNpdHk6IC44OyB9CiAgICAuZ3Mtc2VyaWUtdGFnIC5idG4tcmVtb3ZlLXNlcmllOmhvdmVyIHsgb3BhY2l0eTogMTsgfQoKICAgIC8qIE92ZXJsYXkgInNlbGVjY2lvbmUgdW5hIHNlcmllIiAqLwogICAgLmdzLW5vLXNlcmllcy1vdmVybGF5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgaW5zZXQ6IDA7CiAgICAgICAgZGlzcGxheTogbm9uZTsgLyogb2N1bHRvIHBvciBkZWZlY3RvIGhhc3RhIHF1ZSBjYXJndWVuIGRhdG9zICovCiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICB6LWluZGV4OiAxMDsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB9CiAgICAuZ3Mtbm8tc2VyaWVzLW92ZXJsYXkgLmdzLW92ZXJsYXktaW5uZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogOHB4OwogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjYsIDE4NywgMTU2LCAwLjEyKTsKICAgICAgICBib3JkZXI6IDEuNXB4IGRhc2hlZCAjMUFCQjlDOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgICBwYWRkaW5nOiAxOHB4IDMycHg7CiAgICAgICAgY29sb3I6ICMxQUJCOUM7CiAgICB9CiAgICAuZ3Mtbm8tc2VyaWVzLW92ZXJsYXkgLmdzLW92ZXJsYXktaW5uZXIgaSB7CiAgICAgICAgZm9udC1zaXplOiAyMnB4OwogICAgICAgIG9wYWNpdHk6IDAuODsKICAgIH0KICAgIC5ncy1uby1zZXJpZXMtb3ZlcmxheSAuZ3Mtb3ZlcmxheS1pbm5lciBzcGFuIHsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLjRweDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgfQoKICAgIC8qIFBhbmVsIHVtYnJhbGVzOiBwYWRkaW5nIGxhdGVyYWwgeSByZXNwb25zaXZlICovCiAgICAuZ3MtdW1icmFsZXMtcGFuZWwgewogICAgICAgIHBhZGRpbmc6IDVweCA4cHg7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlZWU7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogNHB4OwogICAgfQogICAgLmdzLXVtYnJhbGVzLXBhbmVsIC5pbnB1dC1ncm91cC10ZXh0IHsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgcGFkZGluZzogMCA2cHg7CiAgICB9CiAgICAuZ3MtdW1icmFsZXMtcGFuZWwgaW5wdXRbdHlwZT1udW1iZXJdIHsKICAgICAgICBtaW4td2lkdGg6IDA7ICAgICAgIC8qIGV2aXRhIGRlc2JvcmRhbWllbnRvIGVuIGZsZXggKi8KICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICB9CiAgICBAbWVkaWEgKG1heC13aWR0aDogOTkycHgpIHsKICAgICAgICAuZ3MtdW1icmFsZXMtcGFuZWwgLnJvdyB7IGZsZXgtd3JhcDogbm93cmFwOyB9CiAgICAgICAgLmdzLXVtYnJhbGVzLXBhbmVsIC5jb2wtNiB7IGZsZXg6IDAgMCA1MCU7IG1heC13aWR0aDogNTAlOyB9CiAgICAgICAgLmdzLXVtYnJhbGVzLXBhbmVsIGlucHV0W3R5cGU9bnVtYmVyXSB7CiAgICAgICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsgLyogZml4IGlPUyAqLwogICAgICAgICAgICBmb250LXNpemU6IDE2cHg7IC8qIGV2aXRhIHpvb20gYXV0b23DoXRpY28gZW4gbcOzdmlsICovCiAgICAgICAgfQogICAgfQo8L3N0eWxlPgoKPGJvZHkgY2xhc3M9Im5hdi1tZCI+Cgo8IS0tIEFWSVNPIFJPVEFDSU9OIC0tPgo8ZGl2IGlkPSJhdmlzby1yb3RhY2lvbiI+CiAgICA8ZGl2PgogICAgICAgIDxpIGNsYXNzPSJmYSBmYS1tb2JpbGUgYW5pbWFjaW9uLW1vdmlsIj48L2k+CiAgICAgICAgPGgzIGNsYXNzPSJmb250LXdlaWdodC1ib2xkIj5HaXJhIHR1IGRpc3Bvc2l0aXZvPC9oMz4KICAgICAgICA8cCBjbGFzcz0ibXQtMiIgc3R5bGU9ImZvbnQtc2l6ZTogMTZweDsgbWF4LXdpZHRoOiAzMDBweDsgbWFyZ2luOiAwIGF1dG87Ij4KICAgICAgICAgICAgUGFyYSB2aXN1YWxpemFyIGxvcyBncsOhZmljb3MgZGUgZm9ybWEgw7NwdGltYSwgdGUgcmVjb21lbmRhbW9zIGVsIG1vZG8gaG9yaXpvbnRhbC4KICAgICAgICA8L3A+CiAgICAgICAgPGJ1dHRvbiBpZD0iYnRuLWNlcnJhci1hdmlzbyIgY2xhc3M9ImJ0biBidG4tb3V0bGluZS1saWdodCBtdC00IHB4LTQiPgogICAgICAgICAgICBFbnRlbmRpZG8KICAgICAgICA8L2J1dHRvbj4KICAgIDwvZGl2Pgo8L2Rpdj4KPCEtLSBDT05URU5FRE9SIFBSSU5DSVBBTCAtLT4KPGRpdiBjbGFzcz0iY29udGFpbmVyIGJvZHkiPgogICAgPGRpdiBjbGFzcz0ibWFpbl9jb250YWluZXIiPgogICAgICAgIDxkaXYgaWQ9InNpZGViYXItY29udGFpbmVyIj48L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJ0b3BiYXItY29udGFpbmVyIj48L2Rpdj4KCiAgICAgICAgPCEtLSBQQUdFIENPTlRFTlQgLS0+CiAgICAgICAgPGRpdiBjbGFzcz0icmlnaHRfY29sIiByb2xlPSJtYWluIj4KCiAgICAgICAgICAgIDwhLS0gTW9kYWwgcGFyYSBJbXBvcnRhciBDb25maWd1cmFjacOzbiAtLT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwgZmFkZSIgaWQ9Im1vZGFsSW1wb3J0YXIiIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIiBhcmlhLWhpZGRlbj0idHJ1ZSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2cgbW9kYWwtZGlhbG9nLWNlbnRlcmVkIiByb2xlPSJkb2N1bWVudCI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9Im1vZGFsLXRpdGxlIj48aSBjbGFzcz0iZmEgZmEtdXBsb2FkIj48L2k+IEltcG9ydGFyIENvbmZpZ3VyYWNpw7NuPC9oNT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGRhdGEtZGlzbWlzcz0ibW9kYWwiIGFyaWEtbGFiZWw9IkNlcnJhciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49InRydWUiPiZ0aW1lczs8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFpPTkEgRFJBRyBEUk9QIEpTT04gLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWJvZHkgdGV4dC1jZW50ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iZHJvcC16b25lIiBzdHlsZT0iYm9yZGVyOiAycHggZGFzaGVkICMxQUJCOUM7IGJvcmRlci1yYWRpdXM6IDEwcHg7IHBhZGRpbmc6IDQwcHggMjBweDsgY3Vyc29yOiBwb2ludGVyOyBiYWNrZ3JvdW5kOiAjZjlmOWY5OyB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuM3M7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtZmlsZS1jb2RlLW8gZmEtNHggdGV4dC1tdXRlZCBtYi0zIiBpZD0iZHJvcC1pY29uIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJtLTAiIHN0eWxlPSJjb2xvcjogIzczODc5QzsiPkFycmFzdHJhIHR1IGFyY2hpdm8gLmpzb24gYXF1w608L2g0PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJ0ZXh0LW11dGVkIG10LTIiPm8gaGF6IGNsaWMgcGFyYSBleGFtaW5hciB0dSBlcXVpcG88L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImZpbGUiIGlkPSJmaWxlLWlucHV0LWltcG9ydCIgYWNjZXB0PSIuanNvbixhcHBsaWNhdGlvbi9qc29uIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPCEtLSBNb2RhbCBHdWFyZGFyIExheW91dCAtLT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwgZmFkZSIgaWQ9Im1vZGFsR3VhcmRhciIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciIGFyaWEtaGlkZGVuPSJ0cnVlIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyBtb2RhbC1kaWFsb2ctY2VudGVyZWQiIHJvbGU9ImRvY3VtZW50Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz0ibW9kYWwtdGl0bGUiPjxpIGNsYXNzPSJmYSBmYS1mbG9wcHktbyI+PC9pPiBHdWFyZGFyIExheW91dDwvaDU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWxhYmVsPSJDZXJyYXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj4mdGltZXM7PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iZm9udC13ZWlnaHQtYm9sZCB0ZXh0LXNlY29uZGFyeSI+Tm9tYnJlIGRlbCBsYXlvdXQ8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJpbnB1dC1ub21icmUtbGF5b3V0IiBjbGFzcz0iZm9ybS1jb250cm9sIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSJFajogRGFzaGJvYXJkIEZyZWN1ZW5jaWEiIG1heGxlbmd0aD0iODAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPSJ0ZXh0LW11dGVkIj5TZSBndWFyZGFyw6EgZW4gbGEgYmFzZSBkZSBkYXRvcy48L3NtYWxsPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkiIGRhdGEtZGlzbWlzcz0ibW9kYWwiPkNhbmNlbGFyPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tc3VjY2VzcyIgaWQ9ImJ0bi1jb25maXJtYXItZ3VhcmRhciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLWZsb3BweS1vIj48L2k+IEd1YXJkYXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDwhLS0gTW9kYWwgQWN0dWFsaXphciBMYXlvdXQgLS0+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsIGZhZGUiIGlkPSJtb2RhbEFjdHVhbGl6YXIiIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIiBhcmlhLWhpZGRlbj0idHJ1ZSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2cgbW9kYWwtZGlhbG9nLWNlbnRlcmVkIiByb2xlPSJkb2N1bWVudCI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9Im1vZGFsLXRpdGxlIj48aSBjbGFzcz0iZmEgZmEtcGVuY2lsIj48L2k+IEFjdHVhbGl6YXIgTGF5b3V0PC9oNT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGRhdGEtZGlzbWlzcz0ibW9kYWwiIGFyaWEtbGFiZWw9IkNlcnJhciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49InRydWUiPiZ0aW1lczs8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJmb250LXdlaWdodC1ib2xkIHRleHQtc2Vjb25kYXJ5Ij5Ob21icmUgZGVsIGxheW91dDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImlucHV0LW5vbWJyZS1sYXlvdXQtYWN0dWFsaXphciIgY2xhc3M9ImZvcm0tY29udHJvbCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0iTm9tYnJlIGRlbCBsYXlvdXQiIG1heGxlbmd0aD0iODAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPSJ0ZXh0LW11dGVkIj5EZWphIGVsIG5vbWJyZSBhY3R1YWwgbyBlc2NyaWJlIHVubyBudWV2by48L3NtYWxsPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkiIGRhdGEtZGlzbWlzcz0ibW9kYWwiPkNhbmNlbGFyPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4td2FybmluZyIgaWQ9ImJ0bi1jb25maXJtYXItYWN0dWFsaXphciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXBlbmNpbCI+PC9pPiBBY3R1YWxpemFyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8IS0tIE1vZGFsIENvbmZpcm1hciBFbGltaW5hY2nDs24gLS0+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsIGZhZGUiIGlkPSJtb2RhbENvbmZpcm1hckVsaW1pbmFyIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1oaWRkZW49InRydWUiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIG1vZGFsLXNtIG1vZGFsLWRpYWxvZy1jZW50ZXJlZCIgcm9sZT0iZG9jdW1lbnQiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIgYmctZGFuZ2VyIHRleHQtd2hpdGUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPSJtb2RhbC10aXRsZSI+PGkgY2xhc3M9ImZhIGZhLXdhcm5pbmciPjwvaT4gwr9FbGltaW5hcj88L2g1PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSB0ZXh0LXdoaXRlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWxhYmVsPSJDZXJyYXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj4mdGltZXM7PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5IHRleHQtY2VudGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPsK/RXN0w6FzIHNlZ3VybyBkZSBxdWUgZGVzZWFzIGVsaW1pbmFyIGVzdGUgbGF5b3V0IHBlcm1hbmVudGVtZW50ZT88L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YiBpZD0ibm9tYnJlLWxheW91dC1lbGltaW5hciIgY2xhc3M9InRleHQtZGFyayI+PC9iPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1saWdodCIgZGF0YS1kaXNtaXNzPSJtb2RhbCI+Q2FuY2VsYXI8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1kYW5nZXIiIGlkPSJidG4tY29uZmlybWFyLWRlbGV0ZS1lamVjdXRhciI+RWxpbWluYXI8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8IS0tIENPTlRFTklETyBQUklOQ0lQQUwgLS0+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IiI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1tZC0xMiBjb2wtc20tMTIgY29sLTEyIj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUEFORUwgREUgQ09OVFJPTCBQUklOQ0lQQUwgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InhfcGFuZWwgbWItMiIgc3R5bGU9ImJvcmRlci10b3A6IDJweCBzb2xpZCAjMkEzRjU0OyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ4X3RpdGxlIG1iLTIgcGItMiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyIHN0eWxlPSJmb250LXNpemU6IDE2cHg7Ij48aSBjbGFzcz0iZmEgZmEtc2xpZGVycyI+PC9pPiBQYW5lbCBkZSBDb250cm9sPC9oMj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBIZXJyYW1pZW50YXMgc3VwZXJpb3JlcyBjb21wYWN0YXMgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2IG5hdmJhci1yaWdodCBwYW5lbF90b29sYm94IiBzdHlsZT0iZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA1cHg7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1pbmZvIG1iLTAiIGlkPSJidG4taW1wb3J0IiB0aXRsZT0iSW1wb3J0YXIgSlNPTiI+PGkgY2xhc3M9ImZhIGZhLXVwbG9hZCI+PC9pPjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLWRhcmsgbWItMCIgaWQ9ImJ0bi1leHBvcnQiIHRpdGxlPSJFeHBvcnRhciBKU09OIj48aSBjbGFzcz0iZmEgZmEtZG93bmxvYWQiPjwvaT48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9ImNvbGxhcHNlLWxpbmsiIHN0eWxlPSJjdXJzb3I6IHBvaW50ZXI7IHBhZGRpbmctbGVmdDogMTBweDsgY29sb3I6ICNDNUM3Q0I7Ij48aSBjbGFzcz0iZmEgZmEtY2hldnJvbi11cCI+PC9pPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjbGVhcmZpeCI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ4X2NvbnRlbnQiPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEJMT1FVRSAxOiBDT05UUk9MRVMgR0xPQkFMRVMgKExheW91dHMgeSBGZWNoYXMpIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InAtMiBtYi0zIHJvdW5kZWQiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjZjhmOWZhOyBib3JkZXI6IDFweCBzb2xpZCAjZTllY2VmOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyBhbGlnbi1pdGVtcy1jZW50ZXIiPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gR2VzdGnDs24gZGUgTGF5b3V0cyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1sZy02IGNvbC1tZC0xMiBtYi1sZy0wIG1iLTIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIGlucHV0LWdyb3VwLXNtIG1iLTAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1ncm91cC1wcmVwZW5kIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpbnB1dC1ncm91cC10ZXh0IGJnLXdoaXRlIj48aSBjbGFzcz0iZmEgZmEtZm9sZGVyLW9wZW4gdGV4dC13YXJuaW5nIj48L2k+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD0ic2VsZWN0LWxheW91dHMtZGIiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIHN0eWxlPSJtYXgtd2lkdGg6IDIwMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIiPi0tIE1pcyBMYXlvdXRzIC0tPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1ncm91cC1hcHBlbmQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0iYnRuLWxvYWQtbGF5b3V0IiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IiB0aXRsZT0iQ2FyZ2FyIExheW91dCI+PGkgY2xhc3M9ImZhIGZhLXBsYXkiPjwvaT48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9ImJ0bi1zYXZlIiBjbGFzcz0iYnRuIGJ0bi1zdWNjZXNzIiB0aXRsZT0iR3VhcmRhciBMYXlvdXQgQWN0dWFsIj48aSBjbGFzcz0iZmEgZmEtc2F2ZSI+PC9pPjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0iYnRuLW92ZXJ3cml0ZSIgY2xhc3M9ImJ0biBidG4td2FybmluZyIgIHRpdGxlPSJBY3R1YWxpemFyIGxheW91dCBzZWxlY2Npb25hZG8iIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48aSBjbGFzcz0iZmEgZmEtcGVuY2lsIj48L2k+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPSJidG4tZGVsZXRlLWxheW91dC1jb25maXJtIiBjbGFzcz0iYnRuIGJ0bi1kYW5nZXIiIHRpdGxlPSJFbGltaW5hciBMYXlvdXQiPjxpIGNsYXNzPSJmYSBmYS10cmFzaCI+PC9pPjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRmVjaGEgR2xvYmFsIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLWxnLTYgY29sLW1kLTEyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1ncm91cCBpbnB1dC1ncm91cC1zbSBtYi0wIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtZ3JvdXAtcHJlcGVuZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaW5wdXQtZ3JvdXAtdGV4dCBiZy13aGl0ZSI+PGkgY2xhc3M9ImZhIGZhLWNhbGVuZGFyIHRleHQtaW5mbyI+PC9pPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icGlja2VyLXJhbmdvIiBjbGFzcz0iZm9ybS1jb250cm9sIiBwbGFjZWhvbGRlcj0iSW5pY2lvIOKAlCBGaW4iIHJlYWRvbmx5Lz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtZ3JvdXAtYXBwZW5kIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBidG4taW5mbyBtYi0wIGZvbnQtd2VpZ2h0LWJvbGQiIGlkPSJidG4tYWN0dWFsaXphci1mZWNoYXMtZ2xvYmFsIiB0eXBlPSJidXR0b24iIHRpdGxlPSJBcGxpY2FyIGEgdG9kb3MiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1yZWZyZXNoIj48L2k+IFNpbmNyb25pemFyIEZlY2hhcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBCTE9RVUUgMjogQ1JFQUNJw5NOIERFIE5VRVZPIEdSw4FGSUNPIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyBhbGlnbi1pdGVtcy1lbmQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbGctMyBjb2wtbWQtNiBjb2wtc20tNiBtYi0yIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0idGV4dC1zZWNvbmRhcnkgbWItMSIgc3R5bGU9ImZvbnQtc2l6ZTogMTFweDsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsiPjxpIGNsYXNzPSJmYSBmYS10YWciPjwvaT4gVGlwbyBNZWRpZGE8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD0ic2VsZWN0LXRpcG9zZWMiIGNsYXNzPSJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIiPi0gU2VsZWNjaW9uZSBtZWRpZGEgLTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLWxnLTIgY29sLW1kLTYgY29sLXNtLTYgbWItMiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9InRleHQtc2Vjb25kYXJ5IG1iLTEiIHN0eWxlPSJmb250LXNpemU6IDExcHg7IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7Ij48aSBjbGFzcz0iZmEgZmEtcGllLWNoYXJ0Ij48L2k+IEdyw6FmaWNvPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9InNlbGVjdC1ncmFmaWNvIiBjbGFzcz0iZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbSI+PC9zZWxlY3Q+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLWxnLTIgY29sLW1kLTQgY29sLXNtLTQgbWItMiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9InRleHQtc2Vjb25kYXJ5IG1iLTEiIHN0eWxlPSJmb250LXNpemU6IDExcHg7IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7Ij48aSBjbGFzcz0iZmEgZmEtY29tcHJlc3MiPjwvaT4gQWdydXBhY2nDs248L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD0iZmlsdHJvLWFncnVwYWNpb24iIGNsYXNzPSJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJub25lIj5TaW4gYWdydXBhcjwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Im1pbnV0ZSI+TWludXRvPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaG91ciI+SG9yYTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImhvdXI2Ij42IEhvcmFzPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaG91cjEyIj4xMiBIb3Jhczwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImRheSIgc2VsZWN0ZWQ+RMOtYTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IndlZWsiPlNlbWFuYTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Im1vbnRoIj5NZXM8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1sZy0zIGNvbC1tZC01IGNvbC1zbS04IG1iLTIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJ0ZXh0LXNlY29uZGFyeSBtYi0xIiBzdHlsZT0iZm9udC1zaXplOiAxMXB4OyB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyI+PGkgY2xhc3M9ImZhIGZhLWFycm93cy1oIj48L2k+IEh1ZWNvczwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkLWZsZXgiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9ImZpbHRyby1odWVjb3MiIGNsYXNzPSJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMCI+U2luIHJlbGxlbm88L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMzYwMCI+MSBob3JhPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjIxNjAwIj42IGhvcmFzPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ijg2NDAwIj4xIGTDrWE8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iY3VzdG9tIj5QZXJzb25hbGl6YWRvPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFbCBpbnB1dCBjdXN0b20gYXBhcmVjZSBhbCBsYWRvIGRlbCBzZWxlY3QgcGFyYSBubyByb21wZXIgbGEgY3VhZHLDrWN1bGEgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgaWQ9ImlucHV0LWN1c3RvbS1zZWd1bmRvcyIgY2xhc3M9ImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc20gbWwtMSIgcGxhY2Vob2xkZXI9IlNlZ3MiIG1pbj0iMSIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7IHdpZHRoOiA4MHB4OyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbGctMiBjb2wtbWQtMyBjb2wtc20tMTIgbWItMiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPSJidG4tYWRkLWdyYWZpY28iIGNsYXNzPSJidG4gYnRuLXN1Y2Nlc3MgYnRuLXNtIHctMTAwIGZvbnQtd2VpZ2h0LWJvbGQgbWItMCIgdHlwZT0iYnV0dG9uIiBzdHlsZT0iaGVpZ2h0OiAzMXB4OyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXBsdXMiPjwvaT4gQcOxYWRpciBHcsOhZmljbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBHcmlkc3RhY2sgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InhfcGFuZWwiIHN0eWxlPSJwYWRkaW5nOiAwOyBib3JkZXI6IG5vbmU7IGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ4X2NvbnRlbnQiIHN0eWxlPSJwYWRkaW5nOiAwICFpbXBvcnRhbnQ7IG1pbi1oZWlnaHQ6IGNhbGMoMTAwdmggLSAyMjBweCk7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJncmlkLXN0YWNrIiBpZD0iZ3JpZC1nbG9iYWwiIHN0eWxlPSJiYWNrZ3JvdW5kOiAjZjRmNmY5OyI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDwhLS0gL3BhZ2UgY29udGVudCAtLT4KCiAgICAgICAgPGZvb3Rlcj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icHVsbC1yaWdodCI+CiAgICAgICAgICAgICAgICBHZW50ZWxlbGxhIC0gQm9vdHN0cmFwIEFkbWluIFRlbXBsYXRlIGJ5IDxhIGhyZWY9Imh0dHBzOi8vY29sb3JsaWIuY29tIj5Db2xvcmxpYjwvYT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNsZWFyZml4Ij48L2Rpdj4KICAgICAgICA8L2Zvb3Rlcj4KICAgIDwvZGl2Pgo8L2Rpdj4KCjwhLS0gTElCIEVYVEVSTkFTIC0tPgo8IS0tIGpRdWVyeSAtLT4KPHNjcmlwdCBzcmM9Ii4uL3ZlbmRvcnMvanF1ZXJ5L2Rpc3QvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi92ZW5kb3JzL2Jvb3RzdHJhcC9kaXN0L2pzL2Jvb3RzdHJhcC5idW5kbGUubWluLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL3ZlbmRvcnMvZmFzdGNsaWNrL2xpYi9mYXN0Y2xpY2suanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vdmVuZG9ycy9pQ2hlY2svaWNoZWNrLm1pbi5qcyI+PC9zY3JpcHQ+Cgo8IS0tICBEYXRhVGFibGVzIEJvb3RzdHJhcCA0IC0tPgo8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG4uZGF0YXRhYmxlcy5uZXQvMS4xMy42L2pzL2pxdWVyeS5kYXRhVGFibGVzLm1pbi5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5kYXRhdGFibGVzLm5ldC8xLjEzLjYvanMvZGF0YVRhYmxlcy5ib290c3RyYXA0Lm1pbi5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5kYXRhdGFibGVzLm5ldC9yZXNwb25zaXZlLzIuNS4wL2pzL2RhdGFUYWJsZXMucmVzcG9uc2l2ZS5taW4uanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG4uZGF0YXRhYmxlcy5uZXQvcmVzcG9uc2l2ZS8yLjUuMC9qcy9yZXNwb25zaXZlLmJvb3RzdHJhcDQubWluLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmRhdGF0YWJsZXMubmV0L2J1dHRvbnMvMi40LjEvanMvZGF0YVRhYmxlcy5idXR0b25zLm1pbi5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5kYXRhdGFibGVzLm5ldC9idXR0b25zLzIuNC4xL2pzL2J1dHRvbnMuYm9vdHN0cmFwNC5taW4uanMiPjwvc2NyaXB0PgoKPCEtLSBBamF4IC0tPgo8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvanN6aXAvMy4xMC4xL2pzemlwLm1pbi5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9wZGZtYWtlLzAuMi43L3BkZm1ha2UubWluLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL3BkZm1ha2UvMC4yLjcvdmZzX2ZvbnRzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmRhdGF0YWJsZXMubmV0L2J1dHRvbnMvMi40LjEvanMvYnV0dG9ucy5odG1sNS5taW4uanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG4uZGF0YXRhYmxlcy5uZXQvYnV0dG9ucy8yLjQuMS9qcy9idXR0b25zLnByaW50Lm1pbi5qcyI+PC9zY3JpcHQ+Cgo8IS0tIFBub3RpZnkgLS0+CjxzY3JpcHQgc3JjPSIuLi92ZW5kb3JzL3Bub3RpZnkvZGlzdC9wbm90aWZ5LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL3ZlbmRvcnMvcG5vdGlmeS9kaXN0L3Bub3RpZnkuYnV0dG9ucy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi92ZW5kb3JzL3Bub3RpZnkvZGlzdC9wbm90aWZ5Lm5vbmJsb2NrLmpzIj48L3NjcmlwdD4KCjwhLS0gR3JpZFN0YWNrIC0tPgo8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9ncmlkc3RhY2tAOC4yLjMvZGlzdC9ncmlkc3RhY2stYWxsLmpzIj48L3NjcmlwdD4KCjwhLS0gRGF0ZXRpbWUgKyBtb21lbnQgLS0+CjxzY3JpcHQgc3JjPSIuLi92ZW5kb3JzL21vbWVudC9taW4vbW9tZW50LXdpdGgtbG9jYWxlcy5taW4uanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vdmVuZG9ycy9ib290c3RyYXAtZGF0ZXJhbmdlcGlja2VyL2RhdGVyYW5nZXBpY2tlci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi92ZW5kb3JzL2Jvb3RzdHJhcC1kYXRldGltZXBpY2tlci9idWlsZC9qcy9ib290c3RyYXAtZGF0ZXRpbWVwaWNrZXIubWluLmpzIj48L3NjcmlwdD4KCjwhLS0gTmF2YmFycyBzY3JpcHQgLS0+CjxzY3JpcHQgc3JjPSJuYXZiYXJzL25hdmJhcnMtbG9hZGVyLmpzIj48L3NjcmlwdD4KCjwhLS0gU0NSSVBUIFBSSU5DSVBBTCAtLT4KPHNjcmlwdD4KICAgIC8vIC0tIFZhcmlhYmxlcyBnbG9iYWxlcyAtLS0tLS0tLQoKICAgIGxldCB0aXBvc1NlY3VuZGFyaW9zID0gW107CiAgICBsZXQgZ3JpZEdsb2JhbCAgICAgID0gbnVsbDsKICAgIGNvbnN0IFRJUE9TX0dSQUZJQ08gPSBbCiAgICAgICAgeyBpZDogJzEnLCBpY29ubzogJ2ZhLWxpbmUtY2hhcnQnLCAgbGFiZWw6ICdMw61uZWFzJywgICAgIGdyYXBoaWM6ICdsaW5lJyB9LAogICAgICAgIHsgaWQ6ICcyJywgaWNvbm86ICdmYS1iYXItY2hhcnQnLCAgIGxhYmVsOiAnQmFycmFzJywgICAgIGdyYXBoaWM6ICdiYXInICB9LAogICAgICAgIHsgaWQ6ICczJywgaWNvbm86ICdmYS1jaXJjbGUtbycsICAgIGxhYmVsOiAnRGlzcGVyc2nDs24nLCBncmFwaGljOiAnc2NhdHRlcicgfSwKICAgICAgICB7IGlkOiAnNCcsIGljb25vOiAnZmEtYXJlYS1jaGFydCcsICBsYWJlbDogJ8OBcmVhJywgICAgICAgZ3JhcGhpYzogJ2FyZWEnIH0sCiAgICAgICAgLy8geyBpZDogJzUnLCBpY29ubzogJ2ZhLWRhc2hib2FyZCcsICAgbGFiZWw6ICdJbmRpY2Fkb3InLCAgZ3JhcGhpYzogJ2dhdWdlJyB9LAogICAgICAgIHsgaWQ6ICc2JywgaWNvbm86ICdmYS1zdGVwLWZvcndhcmQnLGxhYmVsOiAnRXNjYWxvbmFkbycsIGdyYXBoaWM6ICdzdGVwJyB9LAogICAgICAgIC8vIHsgaWQ6ICc3JywgaWNvbm86ICdmYS10aCcsICAgICAgICAgIGxhYmVsOiAnSW50ZW5zaWRhZCcsIGdyYXBoaWM6ICdoZWF0bWFwJyB9CiAgICBdOwoKCiAgICBsZXQgaERpbmFtaWNvICAgICAgID0gMDsKCiAgICBsZXQgY2FjaGVMYXlvdXRzID0gW107CiAgICBsZXQgd2lkZ2V0RGF0YUNhY2hlID0ge307ICAgLy8geyB3aWRnZXRJZDogeyBkYXRvcywgeWtleXMsIGxhYmVscywgY29sb3JlcywgdGlwb0dyYWZpY29JZCB9IH0KICAgIGxldCBsYXlvdXRBY3Rpdm9JZCA9IG51bGw7ICAvLyBJRCBkZWwgbGF5b3V0IGFjdHVhbG1lbnRlIGNhcmdhZG8KCiAgICBsZXQgY2FjaGVTZWN1bmRhcmlvID0ge307CgogICAgY29uc3QgZmVjaGFzID0gewogICAgICAgICdub25lJyA6IDAsCiAgICAgICAgJ21pbnV0ZScgOiA2MCwKICAgICAgICAnaG91cicgOiAzNjAwLAogICAgICAgICc2aG91cicgOiAyMTYwMAogICAgfQoKCiAgICAvLyDigJTigJQgUkVBRFkg4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCUCiAgICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpewoKICAgICAgICBvYnRlbmVyX3RpcG9zX3NlY3VuZGFyaW9zKCkuZG9uZShmdW5jdGlvbihkYXRvcyl7CiAgICAgICAgICAgIGlmIChkYXRvcyAmJiBkYXRvcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBpbmljaWFyX2NvbWJvYm94KCk7CiAgICAgICAgICAgICAgICBnZW5lcmFyX09wY2lvbmVzX1RhYmxhcygpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdTaW4gdGlwb3Mgc2VjdW5kYXJpb3MnKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICBncmlkR2xvYmFsID0gaW5pdF9HcmlkX1N0YWNrKCk7CgogICAgICAgIC8vIE1vc3RyYXIvb2N1bHRhciBpbnB1dCBkZSBzZWd1bmRvcyBjdXN0b20KICAgICAgICAkKCcjZmlsdHJvLWh1ZWNvcycpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbigpewogICAgICAgICAgICBpZiAoJCh0aGlzKS52YWwoKSA9PT0gJ2N1c3RvbScpIHsKICAgICAgICAgICAgICAgICQoJyNpbnB1dC1jdXN0b20tc2VndW5kb3MnKS5zaG93KCk7IC8vIENhbWJpYWRvIGEgc2hvdygpCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkKCcjaW5wdXQtY3VzdG9tLXNlZ3VuZG9zJykuaGlkZSgpOyAvLyBDYW1iaWFkbyBhIGhpZGUoKQogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIC8vIEHDsWFkaXIgd2lkZ2V0IGFsIGdyaWQKICAgICAgICAkKCcjYnRuLWFkZC1ncmFmaWNvJykub24oJ2NsaWNrJywgZnVuY3Rpb24oKXsKICAgICAgICAgICAgY29uc3QgaWRTZWwgID0gJCgnI3NlbGVjdC10aXBvc2VjJykudmFsKCk7CiAgICAgICAgICAgIGNvbnN0IG5vbVNlbCA9ICQoJyNzZWxlY3QtdGlwb3NlYyBvcHRpb246c2VsZWN0ZWQnKS50ZXh0KCk7CiAgICAgICAgICAgIGNvbnN0IGdyYWZJZCA9ICQoJyNzZWxlY3QtZ3JhZmljbycpLnZhbCgpOwogICAgICAgICAgICBjb25zdCBncmFmTm9tID0gJCgnI3NlbGVjdC1ncmFmaWNvIG9wdGlvbjpzZWxlY3RlZCcpLnRleHQoKTsKCiAgICAgICAgICAgIGlmICghaWRTZWwgfHwgIWdyYWZJZCkgewogICAgICAgICAgICAgICAgbm90aWZpY2FyKCdGYWx0YW4gZGF0b3MnLCAnU2VsZWNjaW9uYSBlbCB0aXBvIGRlIG1lZGlkYSB5IGVsIHRpcG8gZGUgZ3LDoWZpY2EgYW50ZXMgZGUgYcOxYWRpci4nLCAnd2FybmluZycpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNyZWFyVmVudGFuYUdyYWZpY2EoaWRTZWwsIG5vbVNlbCwgZ3JhZklkLCBncmFmTm9tKTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gRXhwb3J0IC8gSW1wb3J0IC8gU2F2ZQogICAgICAgICQoJyNidG4tZXhwb3J0Jykub24oJ2NsaWNrJywgZXhwb3J0YXJDb25maWd1cmFjaW9uKTsKICAgICAgICAkKCcjYnRuLWltcG9ydCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uKCkgeyAkKCcjbW9kYWxJbXBvcnRhcicpLm1vZGFsKCdzaG93Jyk7IH0pOwogICAgICAgICQoJyNidG4tc2F2ZScpLm9uKCdjbGljaycsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoIWdyaWRHbG9iYWwgfHwgZ3JpZEdsb2JhbC5lbmdpbmUubm9kZXMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICBub3RpZmljYXIoJ1NpbiB3aWRnZXRzJywgJ0HDsWFkZSBhbCBtZW5vcyB1biBncsOhZmljbyBhbnRlcyBkZSBndWFyZGFyLicsICd3YXJuaW5nJyk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gUHJvcG9uZXIgbm9tYnJlIHBvciBkZWZlY3RvIGNvbiBmZWNoYSBhY3R1YWwKICAgICAgICAgICAgJCgnI2lucHV0LW5vbWJyZS1sYXlvdXQnKS52YWwoJ0xheW91dCAnICsgbW9tZW50KCkuZm9ybWF0KCdERC9NTS9ZWVlZIEhIOm1tJykpOwogICAgICAgICAgICAkKCcjbW9kYWxHdWFyZGFyJykubW9kYWwoJ3Nob3cnKTsKICAgICAgICB9KTsKICAgICAgICAkKCcjYnRuLWNvbmZpcm1hci1ndWFyZGFyJykub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGNvbnN0IG5vbWJyZSA9ICQoJyNpbnB1dC1ub21icmUtbGF5b3V0JykudmFsKCkudHJpbSgpOwogICAgICAgICAgICBpZiAoIW5vbWJyZSkgewogICAgICAgICAgICAgICAgbm90aWZpY2FyKCdOb21icmUgdmFjw61vJywgJ0VzY3JpYmUgdW4gbm9tYnJlIHBhcmEgZWwgbGF5b3V0LicsICd3YXJuaW5nJyk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJCgnI21vZGFsR3VhcmRhcicpLm1vZGFsKCdoaWRlJyk7CiAgICAgICAgICAgIGd1YXJkYXJfbGF5b3V0KG5vbWJyZSk7CiAgICAgICAgfSk7CgogICAgICAgICQoJyNidG4tb3ZlcndyaXRlJykub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGFjdHVhbGl6YXJfbGF5b3V0KCk7CiAgICAgICAgfSk7CiAgICAgICAgJCgnI2J0bi1jb25maXJtYXItYWN0dWFsaXphcicpLm9uKCdjbGljaycsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBjb25maXJtYXJfYWN0dWFsaXphcl9sYXlvdXQoKTsKICAgICAgICB9KTsKICAgICAgICAvLyBEcmFnICYgRHJvcCArIGNsaWNrIGVuIGRyb3Atem9uZQogICAgICAgICQoJyNkcm9wLXpvbmUnKS5vbignY2xpY2snLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIGlmIChlLnRhcmdldC5pZCAhPT0gJ2ZpbGUtaW5wdXQtaW1wb3J0JykgJCgnI2ZpbGUtaW5wdXQtaW1wb3J0JykuY2xpY2soKTsKICAgICAgICB9KTsKICAgICAgICAkKCcjZmlsZS1pbnB1dC1pbXBvcnQnKS5vbignY2hhbmdlJywgZnVuY3Rpb24oZSkgewogICAgICAgICAgICBpZiAoZS50YXJnZXQuZmlsZXMubGVuZ3RoKSBwcm9jZXNhckFyY2hpdm9KU09OKGUudGFyZ2V0LmZpbGVzWzBdKTsKICAgICAgICAgICAgJCh0aGlzKS52YWwoJycpOwogICAgICAgIH0pOwoKICAgICAgICBsZXQgZHJvcFpvbmUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHJvcC16b25lJyk7CiAgICAgICAgZHJvcFpvbmUuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgZHJvcFpvbmUuc3R5bGUuYmFja2dyb3VuZCA9ICcjZTFmNWYyJzsKICAgICAgICAgICAgJCgnI2Ryb3AtaWNvbicpLnJlbW92ZUNsYXNzKCd0ZXh0LW11dGVkJykuYWRkQ2xhc3MoJ3RleHQtc3VjY2VzcycpOwogICAgICAgIH0pOwogICAgICAgIGRyb3Bab25lLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdsZWF2ZScsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICBkcm9wWm9uZS5zdHlsZS5iYWNrZ3JvdW5kID0gJyNmOWY5ZjknOwogICAgICAgICAgICAkKCcjZHJvcC1pY29uJykucmVtb3ZlQ2xhc3MoJ3RleHQtc3VjY2VzcycpLmFkZENsYXNzKCd0ZXh0LW11dGVkJyk7CiAgICAgICAgfSk7CiAgICAgICAgZHJvcFpvbmUuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICBkcm9wWm9uZS5zdHlsZS5iYWNrZ3JvdW5kID0gJyNmOWY5ZjknOwogICAgICAgICAgICAkKCcjZHJvcC1pY29uJykucmVtb3ZlQ2xhc3MoJ3RleHQtc3VjY2VzcycpLmFkZENsYXNzKCd0ZXh0LW11dGVkJyk7CiAgICAgICAgICAgIGlmIChlLmRhdGFUcmFuc2Zlci5maWxlcy5sZW5ndGgpIHByb2Nlc2FyQXJjaGl2b0pTT04oZS5kYXRhVHJhbnNmZXIuZmlsZXNbMF0pOwogICAgICAgIH0pOwoKICAgICAgICAvLyBBdmlzbyByb3RhY2nDs24gbcOzdmlsCiAgICAgICAgJCgnI2J0bi1jZXJyYXItYXZpc28nKS5vbignY2xpY2snLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgJCgnYm9keScpLmFkZENsYXNzKCdhdmlzby1jZXJyYWRvJyk7CiAgICAgICAgICAgICQoJyNhdmlzby1yb3RhY2lvbicpLmZhZGVPdXQoMzAwKTsKICAgICAgICB9KTsKCiAgICAgICAgY2FyZ2FyX2xpc3RhX2xheW91dHMoKTsKCiAgICAgICAgLy8gRXZlbnRvIGRlbCBib3TDs24gQ2FyZ2FyCiAgICAgICAgJCgnI2J0bi1sb2FkLWxheW91dCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBjb25zdCBpZFNlbGVjY2lvbmFkbyA9ICQoJyNzZWxlY3QtbGF5b3V0cy1kYicpLnZhbCgpOwogICAgICAgICAgICBpZighaWRTZWxlY2Npb25hZG8pIHJldHVybjsKCiAgICAgICAgICAgIGNvbnN0IGxheW91dCA9IGNhY2hlTGF5b3V0cy5maW5kKGwgPT4gbC5pZCA9PSBpZFNlbGVjY2lvbmFkbyk7CgogICAgICAgICAgICBpZiAobGF5b3V0ICYmIGxheW91dC5pdGVtcykgewogICAgICAgICAgICAgICAgbGF5b3V0QWN0aXZvSWQgPSBpZFNlbGVjY2lvbmFkbzsKICAgICAgICAgICAgICAgIGFjdHVhbGl6YXJCb3RvbmVzTGF5b3V0KCk7CiAgICAgICAgICAgICAgICBwcmVwYXJhckVudG9ybm9XaWRnZXRzKGxheW91dC5pdGVtcyk7CgogICAgICAgICAgICAgICAgbGF5b3V0Lml0ZW1zLmZvckVhY2goZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IEZNVF9QSUNLRVIgPSAnREQvTU0vWVlZWSBISDptbTpzcyc7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmVjaGFJbmlOb3JtYWxpemFkYSA9IG1vbWVudChpdGVtLmZlY2hhX2luaSkuZm9ybWF0KEZNVF9QSUNLRVIpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGZlY2hhRmluTm9ybWFsaXphZGEgPSBtb21lbnQoaXRlbS5mZWNoYV9maW4pLmZvcm1hdChGTVRfUElDS0VSKTsKCiAgICAgICAgICAgICAgICAgICAgY3JlYXJWZW50YW5hR3JhZmljYSgKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS50aXBvc2VjX2lkLAogICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnRpcG9zZWNfbm9tYnJlLAogICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnRpcG9fZ3JhZmljbywKICAgICAgICAgICAgICAgICAgICAgICAgVElQT1NfR1JBRklDTy5maW5kSW5kZXgoZnVuY3Rpb24odCkgeyByZXR1cm4gdC5pZCA9PSBpdGVtLnRpcG9fZ3JhZmljbzt9KS50b1N0cmluZygpLAogICAgICAgICAgICAgICAgICAgICAgICB7IHg6IGl0ZW0ueCwgeTogaXRlbS55LCB3OiBpdGVtLncsIGg6IGl0ZW0uaCB9LAogICAgICAgICAgICAgICAgICAgICAgICB7IGluaWNpbzogZmVjaGFJbmlOb3JtYWxpemFkYSwgZmluOiBmZWNoYUZpbk5vcm1hbGl6YWRhIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsgYWdydXBhY2lvbjogaXRlbS5hZ3J1cGFjaW9uLCBodWVjb3M6IGl0ZW0uaHVlY29zLCBjdXN0b21TZWd1bmRvczogaXRlbS5jdXN0b21fc2VndW5kb3MgfSwKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXJpZXMgPz8gW10sCiAgICAgICAgICAgICAgICAgICAgICAgIHsgbWF4OiBpdGVtLnVtYnJhbF9tYXgsIG1pbjogaXRlbS51bWJyYWxfbWluIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgLy8gRXZlbnRvIEFicmlyIE1vZGFsIEVsaW1pbmFyCiAgICAgICAgJCgnI2J0bi1kZWxldGUtbGF5b3V0LWNvbmZpcm0nKS5vbignY2xpY2snLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgY29uc3QgaWQgPSAkKCcjc2VsZWN0LWxheW91dHMtZGInKS52YWwoKTsKICAgICAgICAgICAgY29uc3Qgbm9tYnJlID0gJCgnI3NlbGVjdC1sYXlvdXRzLWRiIG9wdGlvbjpzZWxlY3RlZCcpLnRleHQoKTsKICAgICAgICAgICAgaWYoIWlkKSByZXR1cm4gbm90aWZpY2FyKCdBdGVuY2nDs24nLCAnU2VsZWNjaW9uYSB1biBsYXlvdXQgcGFyYSBlbGltaW5hci4nLCAnaW5mbycpOwoKICAgICAgICAgICAgJCgnI25vbWJyZS1sYXlvdXQtZWxpbWluYXInKS50ZXh0KG5vbWJyZSk7CiAgICAgICAgICAgICQoJyNtb2RhbENvbmZpcm1hckVsaW1pbmFyJykubW9kYWwoJ3Nob3cnKTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gRXZlbnRvIEVqZWN1dGFyIEVsaW1pbmFjacOzbgogICAgICAgICQoJyNidG4tY29uZmlybWFyLWRlbGV0ZS1lamVjdXRhcicpLm9uKCdjbGljaycsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBjb25zdCBpZCA9ICQoJyNzZWxlY3QtbGF5b3V0cy1kYicpLnZhbCgpOwogICAgICAgICAgICBlbGltaW5hcl9sYXlvdXQoaWQpOwogICAgICAgIH0pOwoKICAgICAgICAvLyBUb2dnbGUgcGFuZWwgdW1icmFsZXMKICAgICAgICAkKGRvY3VtZW50KS5vbignY2xpY2snLCAnLmJ0bi10b2dnbGUtdW1icmFsZXMnLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgJCh0aGlzKS5jbG9zZXN0KCcuZ3JpZC1zdGFjay1pdGVtLWNvbnRlbnQnKS5maW5kKCcuZ3MtdW1icmFsZXMtcGFuZWwnKS5zbGlkZVRvZ2dsZSgxNTApOwogICAgICAgIH0pOwoKICAgICAgICAvLyBBw7FhZGlyIHNlcmllIGNvbW8gdGFnCiAgICAgICAgJChkb2N1bWVudCkub24oJ2NsaWNrJywgJy5idG4tYWRkLXNlcmllJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGNvbnN0ICR3aWRnZXQgID0gJCh0aGlzKS5jbG9zZXN0KCcuZ3JpZC1zdGFjay1pdGVtJyk7CiAgICAgICAgICAgIGNvbnN0ICRzZWxlY3QgID0gJHdpZGdldC5maW5kKCcuc2VsZWN0LXNlcmllLWRpc3BvbmlibGUnKTsKICAgICAgICAgICAgY29uc3QgaWR4ICAgICAgPSAkc2VsZWN0LnZhbCgpOwogICAgICAgICAgICBjb25zdCBsYWJlbCAgICA9ICRzZWxlY3QuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykudGV4dCgpOwogICAgICAgICAgICBpZiAoIWlkeCkgcmV0dXJuOwoKICAgICAgICAgICAgLy8gRXZpdGFyIGR1cGxpY2Fkb3MKICAgICAgICAgICAgaWYgKCR3aWRnZXQuZmluZCgnLmdzLXNlcmllLXRhZ1tkYXRhLWluZGV4PSInICsgaWR4ICsgJyJdJykubGVuZ3RoKSByZXR1cm47CgogICAgICAgICAgICBjb25zdCAkdGFncyA9ICR3aWRnZXQuZmluZCgnLmdzLXNlcmllcy10YWdzJyk7CiAgICAgICAgICAgICR0YWdzLmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9ImdzLXNlcmllLXRhZyIgZGF0YS1pbmRleD0iJyArIGlkeCArICciPicgKwogICAgICAgICAgICAgICAgICAgIGxhYmVsICsKICAgICAgICAgICAgICAgICAgICAnIDxpIGNsYXNzPSJmYSBmYS10aW1lcyBidG4tcmVtb3ZlLXNlcmllIj48L2k+JyArCiAgICAgICAgICAgICAgICAgICAgJzwvc3Bhbj4nCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRzZWxlY3QudmFsKCcnKTsgLy8gcmVzZXQgc2VsZWN0CiAgICAgICAgICAgIHJlbmRlcml6YXJTZXJpZXNXaWRnZXQoJHdpZGdldC5hdHRyKCdpZCcpKTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gUXVpdGFyIHNlcmllIGluZGl2aWR1YWwKICAgICAgICAkKGRvY3VtZW50KS5vbignY2xpY2snLCAnLmJ0bi1yZW1vdmUtc2VyaWUnLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgY29uc3QgJHdpZGdldCA9ICQodGhpcykuY2xvc2VzdCgnLmdyaWQtc3RhY2staXRlbScpOwogICAgICAgICAgICAkKHRoaXMpLmNsb3Nlc3QoJy5ncy1zZXJpZS10YWcnKS5yZW1vdmUoKTsKICAgICAgICAgICAgcmVuZGVyaXphclNlcmllc1dpZGdldCgkd2lkZ2V0LmF0dHIoJ2lkJykpOwogICAgICAgIH0pOwoKICAgICAgICAvLyBMaW1waWFyIHRvZGFzIGxhcyBzZXJpZXMKICAgICAgICAkKGRvY3VtZW50KS5vbignY2xpY2snLCAnLmJ0bi1saW1waWFyLXNlcmllcycsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBjb25zdCAkd2lkZ2V0ID0gJCh0aGlzKS5jbG9zZXN0KCcuZ3JpZC1zdGFjay1pdGVtJyk7CiAgICAgICAgICAgICR3aWRnZXQuZmluZCgnLmdzLXNlcmllcy10YWdzJykuZW1wdHkoKTsKICAgICAgICAgICAgcmVuZGVyaXphclNlcmllc1dpZGdldCgkd2lkZ2V0LmF0dHIoJ2lkJykpOwogICAgICAgIH0pOwoKICAgICAgICAvLyBSZS1yZW5kZXJpemFyIGFsIGNhbWJpYXIgdW1icmFsZXMgKGNvbiBwZXF1ZcOxbyBkZWJvdW5jZSkKICAgICAgICBsZXQgdW1icmFsVGltZW91dCA9IG51bGw7CiAgICAgICAgJChkb2N1bWVudCkub24oJ2lucHV0JywgJy5pbnB1dC11bWJyYWwtbWF4LCAuaW5wdXQtdW1icmFsLW1pbicsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBjb25zdCAkd2lkZ2V0ID0gJCh0aGlzKS5jbG9zZXN0KCcuZ3JpZC1zdGFjay1pdGVtJyk7CiAgICAgICAgICAgIGNsZWFyVGltZW91dCh1bWJyYWxUaW1lb3V0KTsKICAgICAgICAgICAgdW1icmFsVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZW5kZXJpemFyU2VyaWVzV2lkZ2V0KCR3aWRnZXQuYXR0cignaWQnKSk7CiAgICAgICAgICAgIH0sIDQwMCk7CiAgICAgICAgfSk7CgogICAgICAgICQoZG9jdW1lbnQpLm9uKCdjbGljaycsICcuYnRuLXRvZ2dsZS10aXBvLWdyYWZpY28nLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgY29uc3QgJGJ0biAgICAgPSAkKHRoaXMpOwogICAgICAgICAgICBjb25zdCAkd2lkZ2V0ICA9ICRidG4uY2xvc2VzdCgnLmdyaWQtc3RhY2staXRlbScpOwogICAgICAgICAgICBjb25zdCB3aWRnZXRJZCA9ICR3aWRnZXQuYXR0cignaWQnKTsKICAgICAgICAgICAgY29uc3QgY2FjaGUgICAgPSB3aWRnZXREYXRhQ2FjaGVbd2lkZ2V0SWRdOwogICAgICAgICAgICBpZiAoIWNhY2hlKSByZXR1cm47CgogICAgICAgICAgICAvLyBDYWxjdWxhciBzaWd1aWVudGUgdGlwbyBlbiBlbCBhcnJheSAoY2lyY3VsYXIpCiAgICAgICAgICAgIGNvbnN0IGlkQWN0dWFsICA9ICRidG4uZGF0YSgndGlwby1hY3R1YWwnKTsKICAgICAgICAgICAgY29uc3QgaWR4QWN0dWFsID0gVElQT1NfR1JBRklDTy5maW5kSW5kZXgoZnVuY3Rpb24odCkgeyByZXR1cm4gdC5pZCA9PSBpZEFjdHVhbDsgfSk7CiAgICAgICAgICAgIGNvbnN0IHNpZ3VpZW50ZSA9IFRJUE9TX0dSQUZJQ09bKGlkeEFjdHVhbCArIDEpICUgVElQT1NfR1JBRklDTy5sZW5ndGhdOwoKICAgICAgICAgICAgLy8gQWN0dWFsaXphciBjYWNoZSwgYm90w7NuIHkgZGF0YS1hdHRyaWJ1dGUgZGVsIHdpZGdldAogICAgICAgICAgICBjYWNoZS50aXBvR3JhZmljb0lkID0gc2lndWllbnRlLmlkOwogICAgICAgICAgICAkYnRuLnJlbW92ZUNsYXNzKGZ1bmN0aW9uKF8sIGMpIHsgcmV0dXJuIChjLm1hdGNoKC9mYS1cUysvZykgfHwgW10pLmpvaW4oJyAnKTsgfSkKICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3Moc2lndWllbnRlLmljb25vKQogICAgICAgICAgICAgICAgICAgIC5kYXRhKCd0aXBvLWFjdHVhbCcsIHNpZ3VpZW50ZS5pZCkKICAgICAgICAgICAgICAgICAgICAuYXR0cigndGl0bGUnLCAnQ2FtYmlhciB0aXBvIGRlIGdyw6FmaWNvICgnICsgc2lndWllbnRlLmxhYmVsICsgJyknKTsKICAgICAgICAgICAgJHdpZGdldC5hdHRyKCdkYXRhLXRpcG8tZ3JhZmljbycsIHNpZ3VpZW50ZS5pZCk7IC8vIHBhcmEgcXVlIG9idGVuZXJfaXRlbXNfZ3JpZCgpIGxvIHJlY29qYQoKICAgICAgICAgICAgcmVuZGVyaXphclNlcmllc1dpZGdldCh3aWRnZXRJZCk7CiAgICAgICAgfSk7CgogICAgICAgICQoJyNidG4tYWN0dWFsaXphci1mZWNoYXMtZ2xvYmFsJykub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGNvbnN0IGZlY2hhcyA9IHR5cGVvZiB3aW5kb3cub2J0ZW5lclJhbmdvRmVjaGFzID09PSAnZnVuY3Rpb24nCiAgICAgICAgICAgICAgICAgICAgPyB3aW5kb3cub2J0ZW5lclJhbmdvRmVjaGFzKCkgOiBudWxsOwogICAgICAgICAgICBpZiAoIWZlY2hhcyB8fCAhZmVjaGFzLmluaWNpbyB8fCAhZmVjaGFzLmZpbiApIHsKICAgICAgICAgICAgICAgIHJldHVybiBub3RpZmljYXIoJ0ZhbHRhbiBmZWNoYXMnLCAnU2VsZWNjaW9uZSB1biByYW5nbyBkZSBmZWNoYXMgdsOhbGlkby4nLCAnd2FybmluZycpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjb25zdCB0aXBvc2VjQWN0aXZvcyA9IG9idGVuZXJUaXBvc2VjQWN0aXZvcygpOwogICAgICAgICAgICBpZiAodGlwb3NlY0FjdGl2b3MubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbm90aWZpY2FyKCdJbmZvcm1hY2nDs24nLCAnTm8gaGF5IGdyw6FmaWNvcyBhY3Rpdm9zLicsICdpbmZvJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRpcG9zZWNBY3Rpdm9zLmZvckVhY2goZnVuY3Rpb24odElkKSB7CiAgICAgICAgICAgICAgICBwcm9jZXNhckFjdHVhbGl6YWNpb25UaXBvc2VjKHRJZCwgZmVjaGFzLmluaWNpbywgZmVjaGFzLmZpbik7CiAgICAgICAgICAgIH0pCiAgICAgICAgfSk7CgogICAgICAgICQoZG9jdW1lbnQpLm9uKCdjbGljaycsICcuYnRuLXRvZ2dsZS1maWx0cm9zJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICQodGhpcykuY2xvc2VzdCgnLmdyaWQtc3RhY2staXRlbS1jb250ZW50JykuZmluZCgnLmdzLWZpbHRyb3MtcGFuZWwnKS5zbGlkZVRvZ2dsZSgxNTApOwogICAgICAgIH0pOwoKICAgICAgICAvLyBNb3N0cmFyIGlucHV0IGRlIGN1c3RvbSBzZWd1bmRvcyBsb2NhbG1lbnRlCiAgICAgICAgJChkb2N1bWVudCkub24oJ2NoYW5nZScsICcuc2VsZWN0LWxvY2FsLWh1ZWNvcycsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoJCh0aGlzKS52YWwoKSA9PT0gJ2N1c3RvbScpIHsKICAgICAgICAgICAgICAgICQodGhpcykuc2libGluZ3MoJy5pbnB1dC1sb2NhbC1jdXN0b20nKS5zaG93KCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnNpYmxpbmdzKCcuaW5wdXQtbG9jYWwtY3VzdG9tJykuaGlkZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIC8vIEFwbGljYXIgRmlsdHJvcyBMb2NhbGVzIHVzYW5kbyBsYSBDQUNIw4kgRU4gUkFNCiAgICAgICAgJChkb2N1bWVudCkub24oJ2NsaWNrJywgJy5idG4tYXBsaWNhci1maWx0cm9zLWxvY2FsZXMnLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgY29uc3QgJHdpZGdldCA9ICQodGhpcykuY2xvc2VzdCgnLmdyaWQtc3RhY2staXRlbScpOwogICAgICAgICAgICBjb25zdCB0SWQgICAgID0gJHdpZGdldC5hdHRyKCdkYXRhLXRpcG9zZWMtaWQnKTsKICAgICAgICAgICAgY29uc3Qgc3RySW5pICA9ICR3aWRnZXQuYXR0cignZGF0YS1mZWNoYS1pbmknKTsKICAgICAgICAgICAgY29uc3Qgc3RyRmluICA9ICR3aWRnZXQuYXR0cignZGF0YS1mZWNoYS1maW4nKTsKCiAgICAgICAgICAgIC8vIFJlY29nZXIgbnVldm9zIHZhbG9yZXMKICAgICAgICAgICAgY29uc3QgYWdydXAgID0gJHdpZGdldC5maW5kKCcuc2VsZWN0LWxvY2FsLWFncnVwYWNpb24nKS52YWwoKTsKICAgICAgICAgICAgY29uc3QgaHVlY28gID0gJHdpZGdldC5maW5kKCcuc2VsZWN0LWxvY2FsLWh1ZWNvcycpLnZhbCgpOwogICAgICAgICAgICBjb25zdCBjdXN0b20gPSAkd2lkZ2V0LmZpbmQoJy5pbnB1dC1sb2NhbC1jdXN0b20nKS52YWwoKSB8fCAnMCc7CgogICAgICAgICAgICAvLyAxLiBHdWFyZGFyIGxvcyBudWV2b3MgYXRyaWJ1dG9zIGVuIGVsIEhUTUwgZGVsIHdpZGdldAogICAgICAgICAgICAkd2lkZ2V0LmF0dHIoJ2RhdGEtYWdydXBhY2lvbicsIGFncnVwKTsKICAgICAgICAgICAgJHdpZGdldC5hdHRyKCdkYXRhLWh1ZWNvcycsIGh1ZWNvKTsKICAgICAgICAgICAgJHdpZGdldC5hdHRyKCdkYXRhLWN1c3RvbS1zZWd1bmRvcycsIGN1c3RvbSk7CgogICAgICAgICAgICAvLyAyLiBSZXNjYXRhciBsYSBjYWNow6kgYmFzZSBwYXJhIG5vIGxsYW1hciBhIEJECiAgICAgICAgICAgIGNvbnN0IGNhY2hlID0gY2FjaGVTZWN1bmRhcmlvW3RJZF07CiAgICAgICAgICAgIGlmICghY2FjaGUgfHwgIWNhY2hlLmRhdG9zKSByZXR1cm47CgogICAgICAgICAgICAvLyAzLiBPY3VsdGFyIHBhbmVsIHkgbW9zdHJhciBtaW5pLWxvYWRlcgogICAgICAgICAgICAkd2lkZ2V0LmZpbmQoJy5ncy1maWx0cm9zLXBhbmVsJykuc2xpZGVVcCgxNTApOwogICAgICAgICAgICAkd2lkZ2V0LmZpbmQoJy5ncy1pdGVtLWJvZHknKS5hcHBlbmQoCiAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9ImdzLW1pbmktbG9hZGVyIiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7aW5zZXQ6MDtiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsMC42KTt6LWluZGV4OjEwO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjsiPicgKwogICAgICAgICAgICAgICAgICAgICc8aSBjbGFzcz0iZmEgZmEtc3Bpbm5lciBmYS1zcGluIGZhLTJ4IHRleHQtcHJpbWFyeSI+PC9pPicgKwogICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nKTsKCiAgICAgICAgICAgIC8vIDQuIEZpbHRyYXIgeSBwcm9jZXNhciBkYW5kbyBtYXJnZW4gcGFyYSBxdWUgc2UgZGlidWplIGVsIGxvYWRlcgogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgY29uc3Qgc3FsSW5pID0gbW9tZW50KHN0ckluaSwgJ0REL01NL1lZWVkgSEg6bW06c3MnKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW06c3MnKTsKICAgICAgICAgICAgICAgIGNvbnN0IHNxbEZpbiA9IG1vbWVudChzdHJGaW4sICdERC9NTS9ZWVlZIEhIOm1tOnNzJykuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tOnNzJyk7CgogICAgICAgICAgICAgICAgY29uc3QgZGF0b3NGaWx0cmFkb3MgPSBjYWNoZS5kYXRvcy5maWx0ZXIoZnVuY3Rpb24ocm93KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvdy5mZWNoYSA+PSBzcWxJbmkgJiYgcm93LmZlY2hhIDw9IHNxbEZpbjsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIEVzdGEgZnVuY2nDs24gc2UgZW5jYXJnYSBkZSBjYW1iaWFyIGVsIHRleHRvIGRlbCBoZWFkZXIgeSByZXBpbnRhciB0b2RvCiAgICAgICAgICAgICAgICByZXBpbnRhcldpZGdldERPTSgkd2lkZ2V0LCBkYXRvc0ZpbHRyYWRvcywgc3RySW5pLCBzdHJGaW4pOwoKICAgICAgICAgICAgICAgICR3aWRnZXQuZmluZCgnLmdzLW1pbmktbG9hZGVyJykucmVtb3ZlKCk7CiAgICAgICAgICAgIH0sIDUwKTsKICAgICAgICB9KTsKICAgIH0pOwoKCiAgICAvLyAtLSBBSkFYIC0tLS0tLS0tCiAgICAvKioKICAgICAqIEBicmllZiBPYnRpZW5lIHRvZG9zIGxvcyB0aXBvcyBzZWN1bmRhcmlvcwogICAgICovCiAgICBmdW5jdGlvbiBvYnRlbmVyX3RpcG9zX3NlY3VuZGFyaW9zKCkgewogICAgICAgIHJldHVybiAkLmFqYXgoewogICAgICAgICAgICB1cmw6ICcuLi8uLi9vbGkvYmFja2VuZC9hcGkucGhwJywKICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgICAgIGRhdGF0eXBlOiAnanNvbicsCiAgICAgICAgICAgIGRhdGE6IHsgYWN0aW9uOiAnbG9hZF90aXBvc2VjJyB9LAogICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihyZXNwb25zZSkgeyBpZiAocmVzcG9uc2UpIHRpcG9zU2VjdW5kYXJpb3MgPSByZXNwb25zZTsgfSwKICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKHhociwgc3RhdHVzLCBlcnJvcikgeyBjb25zb2xlLmVycm9yKCdFcnJvciBBSkFYIHRpcG9zOicsIGVycm9yKTsgfQogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQGJyaWVmIE9idGllbmUgZmVjaGEgZGUgbGEgdWx0aW1hIGNhbXBhw7FhIHJlZ2lzdHJhZGEKICAgICAqIEBub3RlICBDcmVhIHVuIG9mZmVzdCBkZSA0IG1lc2VzIHBhcmEgZGUgZmVjaGEgZmluCiAgICAgKi8KICAgIGZ1bmN0aW9uIG9idGVuZXJfdWx0aW1hRmVjaENhbXBhbmlhKCkgewogICAgICAgIHJldHVybiAkLmFqYXgoewogICAgICAgICAgICB1cmw6ICcuLi8uLi9vbGkvYmFja2VuZC9hcGkucGhwJywKICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgICAgIGRhdGE6IHsgYWN0aW9uOiAnbGFzdEZlY2hhQ2FtcGFuaWEnIH0sCiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBmZWNoYUluaWNpbyA9IG1vbWVudChyZXNwb25zZSwgJ1lZWVktTU0tREQgSEg6bW06c3MnKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZmVjaGFJbmljaW8uaXNWYWxpZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZlY2hhRmluID0gZmVjaGFJbmljaW8uY2xvbmUoKS5hZGQoNCwgJ21vbnRoJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZNVCA9ICdERC9NTS9ZWVlZIEhIOm1tOnNzJzsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGlja2VyUmFuZ28gPSAkKCcjcGlja2VyLXJhbmdvJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHBpY2tlclJhbmdvLnZhbChmZWNoYUluaWNpby5mb3JtYXQoRk1UKSArICcgIOKAlCAgJyArIGZlY2hhRmluLmZvcm1hdChGTVQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGlja2VyID0gcGlja2VyUmFuZ28uZGF0YSgnZGF0ZXJhbmdlcGlja2VyJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwaWNrZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY2tlci5zZXRTdGFydERhdGUoZmVjaGFJbmljaW8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlja2VyLnNldEVuZERhdGUoZmVjaGFGaW4pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdGZWNoYSBkZSBjYW1wYcOxYSBpbnbDoWxpZGE6JywgcmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKHhociwgc3RhdHVzLCBlcnJvcikgeyBjb25zb2xlLmVycm9yKCdFcnJvciBBSkFYIGxhc3RGZWNoYTonLCBlcnJvcik7IH0KICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBicmllZiBDYXJnYSB0b2RvcyBsb3MgbGF5b3V0cyBkZWwgdXN1YXJpbwogICAgICogQG5vdGUgIFNlIHBvZHJpYSBzZXBhcmFyIGVuIGRvcyBwYXJ0ZXMsIGxpc3RfbmFtZSB5IGxpc3RfZGV0YWlscyBwYXJhIGRpdmlkaXIgY2FyZ2EuCiAgICAgKiAgICAgICAgQ29tbyBlcyB1biBhcmNoaXZvIHBlcXVlw7FvIG5vIGhhY2UgZmFsdGEKICAgICAqLwogICAgZnVuY3Rpb24gY2FyZ2FyX2xpc3RhX2xheW91dHMoKSB7CiAgICAgICAgJC5hamF4KHsKICAgICAgICAgICAgdXJsOiAnLi4vLi4vb2xpL2JhY2tlbmQvYXBpLnBocCcsCiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgICAgICBkYXRhOiB7IGFjdGlvbjogJ2xpc3RfbGF5b3V0c191c2VyJyB9LAogICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLm9rKSB7CiAgICAgICAgICAgICAgICAgICAgY2FjaGVMYXlvdXRzID0gcmVzcG9uc2UubGF5b3V0czsKCiAgICAgICAgICAgICAgICAgICAgY29uc3QgJHNlbCA9ICQoJyNzZWxlY3QtbGF5b3V0cy1kYicpOwogICAgICAgICAgICAgICAgICAgICRzZWwuZmluZCgnb3B0aW9uOm5vdCg6Zmlyc3QpJykucmVtb3ZlKCk7CgogICAgICAgICAgICAgICAgICAgIGNhY2hlTGF5b3V0cy5mb3JFYWNoKGZ1bmN0aW9uKGxheW91dCkgewogICAgICAgICAgICAgICAgICAgICAgICAkc2VsLmFwcGVuZCgnPG9wdGlvbiB2YWx1ZT0iJyArIGxheW91dC5pZCArICciPicgKyBsYXlvdXQubm9tYnJlICsgJzwvb3B0aW9uPicpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gY29uZmlybWFyX2FjdHVhbGl6YXJfbGF5b3V0KCkgewogICAgICAgIGNvbnN0IG5vbWJyZSA9ICQoJyNpbnB1dC1ub21icmUtbGF5b3V0LWFjdHVhbGl6YXInKS52YWwoKS50cmltKCk7CiAgICAgICAgaWYgKCFub21icmUpIHsKICAgICAgICAgICAgbm90aWZpY2FyKCdOb21icmUgdmFjw61vJywgJ0VzY3JpYmUgdW4gbm9tYnJlIHBhcmEgZWwgbGF5b3V0LicsICd3YXJuaW5nJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY29uc3QgaXRlbXMgPSBvYnRlbmVyX2l0ZW1zX2dyaWQoKTsKICAgICAgICBpZiAoIWl0ZW1zIHx8IGl0ZW1zLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICBub3RpZmljYXIoJ1NpbiB3aWRnZXRzJywgJ05vIGhheSBncsOhZmljb3MgZW4gZWwgZ3JpZCBwYXJhIGd1YXJkYXIuJywgJ3dhcm5pbmcnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAkKCcjbW9kYWxBY3R1YWxpemFyJykubW9kYWwoJ2hpZGUnKTsKICAgICAgICAkLmFqYXgoewogICAgICAgICAgICB1cmw6ICAgICAgJy4uLy4uL29saS9iYWNrZW5kL2FwaS5waHAnLAogICAgICAgICAgICBtZXRob2Q6ICAgJ1BPU1QnLAogICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLAogICAgICAgICAgICBkYXRhOiB7CiAgICAgICAgICAgICAgICBhY3Rpb246ICAgICd1cGRhdGVfbGF5b3V0JywKICAgICAgICAgICAgICAgIGxheW91dF9pZDogbGF5b3V0QWN0aXZvSWQsCiAgICAgICAgICAgICAgICBub21icmU6ICAgIG5vbWJyZSwKICAgICAgICAgICAgICAgIGxheW91dDogICAgSlNPTi5zdHJpbmdpZnkoaXRlbXMpCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2Uub2spIHsKICAgICAgICAgICAgICAgICAgICBub3RpZmljYXIoJ0FjdHVhbGl6YWRvJywgJ0xheW91dCDCqycgKyBub21icmUgKyAnwrsgYWN0dWFsaXphZG8gY29ycmVjdGFtZW50ZS4nLCAnc3VjY2VzcycpOwogICAgICAgICAgICAgICAgICAgIGNhcmdhcl9saXN0YV9sYXlvdXRzKCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhcignRXJyb3InLCByZXNwb25zZS5lcnJvciB8fCAnTm8gc2UgcHVkbyBhY3R1YWxpemFyIGVsIGxheW91dC4nLCAnZXJyb3InKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKHhocikgewogICAgICAgICAgICAgICAgbm90aWZpY2FyKCdFcnJvciAnICsgeGhyLnN0YXR1cywgJ0ZhbGxvIGFsIGNvbmVjdGFyIGNvbiBlbCBzZXJ2aWRvci4nLCAnZXJyb3InKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gYWN0dWFsaXphcl9sYXlvdXQoKSB7CiAgICAgICAgaWYgKCFsYXlvdXRBY3Rpdm9JZCkgcmV0dXJuOwogICAgICAgIGlmICghZ3JpZEdsb2JhbCB8fCBncmlkR2xvYmFsLmVuZ2luZS5ub2Rlcy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgbm90aWZpY2FyKCdTaW4gd2lkZ2V0cycsICdObyBoYXkgZ3LDoWZpY29zIGVuIGVsIGdyaWQgcGFyYSBndWFyZGFyLicsICd3YXJuaW5nJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLy8gUHJlY2FyZ2FyIGVsIG5vbWJyZSBhY3R1YWwgZGVzZGUgZWwgc2VsZWN0CiAgICAgICAgY29uc3Qgbm9tYnJlQWN0dWFsID0gJCgnI3NlbGVjdC1sYXlvdXRzLWRiIG9wdGlvbjpzZWxlY3RlZCcpLnRleHQoKTsKICAgICAgICAkKCcjaW5wdXQtbm9tYnJlLWxheW91dC1hY3R1YWxpemFyJykudmFsKG5vbWJyZUFjdHVhbCk7CiAgICAgICAgJCgnI21vZGFsQWN0dWFsaXphcicpLm1vZGFsKCdzaG93Jyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAYnJpZWYgRWxpbWluYSB1biBkYXRvCiAgICAgKiBAaWYgICAgU2UgcHVlZGUgbW9kaWZpY2FyIGhhcmQgbyBzb2Z0IHBhcmEgZGV0ZXJtaW5hciBib3JyYWRvIHJlYWwgbyBsw7NnaWNvIHJlc3BlY3RpdmFtZW50ZQogICAgICogQHBhcmFtIHtpbnR9IGlkIDogbGF5b3V0X2lkCiAgICAgKi8KICAgIGZ1bmN0aW9uIGVsaW1pbmFyX2xheW91dChpZCkgewogICAgICAgICQuYWpheCh7CiAgICAgICAgICAgIHVybDogJy4uLy4uL29saS9iYWNrZW5kL2FwaS5waHAnLAogICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgZGF0YTogeyBhY3Rpb246ICdkZWxldGVfbGF5b3V0JywgaWQ6IGlkLCBtb2RlOiAnaGFyZCcgfSwgLy8gVXNhbW9zIGhhcmQgcG9yIGFob3JhCiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHsKICAgICAgICAgICAgICAgICAgICAkKCcjbW9kYWxDb25maXJtYXJFbGltaW5hcicpLm1vZGFsKCdoaWRlJyk7CiAgICAgICAgICAgICAgICAgICAgbm90aWZpY2FyKCdFbGltaW5hZG8nLCAnRWwgbGF5b3V0IGhhIHNpZG8gYm9ycmFkby4nLCAnc3VjY2VzcycpOwogICAgICAgICAgICAgICAgICAgIGxheW91dEFjdGl2b0lkID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICBhY3R1YWxpemFyQm90b25lc0xheW91dCgpOwogICAgICAgICAgICAgICAgICAgIGNhcmdhcl9saXN0YV9sYXlvdXRzKCk7IC8vIFJlZnJlc2NhciBjb21ibwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBub3RpZmljYXIoJ0Vycm9yJywgcmVzcG9uc2UuZXJyb3IsICdlcnJvcicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAYnJpZWYgTGxhbWEgYSBsYSBBUEksIGxhbnphIGVsIHBpcGVsaW5lIGNvbXBsZXRvIGRlIG5vcm1hbGl6YWNpw7NuIGFudGVzIGRlIHBpbnRhciBlbCBlY2hhcnQuCiAgICAgKiBAbm90ZSBEb3MgdmVyc2lvbmVzIGRpc3BvbmlibGVzLAogICAgICogIOKAlCBOUFM6ICBEZXZ1ZWx2ZSBzZWN1bmRhcmlvLiosIHByaW1hcmlvIHkgc3RzIHNvbiBpZCBlbnRlcm9zICggaW50ICkKICAgICAqICDigJQgTlBTSjogRGV2dWVsdmUgdW4gam9pbiBlbnRyZSBzZWN1bmRhcmlvLCB0aXBvc2VjIHkgc3VidGlwb3NlY3VuZGFyaW8sCiAgICAgKiAgICAgICAgICAgcHJpbWFyaW8geSBzdHMgc29uIHN1cyBub21icmVzICggc3RyaW5nICkKICAgICAqCiAgICAgKiBAcGFyYW0ge2ludH0gICAgIHdpZGdldElkCiAgICAgKiBAcGFyYW0ge2ludH0gICAgIGlkVGlwb1NlYwogICAgICogQHBhcmFtIHtzdHJpbmd9ICBub21icmVUaXBvU2VjCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gIGZlY2hhSW5pCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gIGZlY2hhRmluCiAgICAgKiBAcGFyYW0ge2ludH0gICAgIGlkR3JhZmljbwogICAgICogQHBhcmFtIHtpbnR9ICAgICBhZ3J1cGFjaW9uCiAgICAgKiBAcGFyYW0ge2ludH0gICAgIGh1ZWNvcwogICAgICogQHBhcmFtIHtpbnR9ICAgICBjdXN0b21TZWd1bmRvcwogICAgICoKICAgICAqIEBkZXByZWNhdGVkCiAgICAgKi8KICAgIGZ1bmN0aW9uIHByZXZfY2FyZ2FyRGF0b3NHcmFmaWNhKHdpZGdldElkLCBpZFRpcG9TZWMsIG5vbWJyZVRpcG9TZWMsIGZlY2hhSW5pLCBmZWNoYUZpbiwgaWRHcmFmaWNvLCBhZ3J1cGFjaW9uLCBodWVjb3MsIGN1c3RvbVNlZ3VuZG9zKSB7CiAgICAgICAgJC5hamF4KHsKICAgICAgICAgICAgdXJsOiAnLi4vLi4vb2xpL2JhY2tlbmQvYXBpLnBocCcsCiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgICAgICBkYXRhOiB7CiAgICAgICAgICAgICAgICBhY3Rpb24gICA6ICdsb2FkX3NlY3VuZGFyaW9fTlBTSicsCiAgICAgICAgICAgICAgICB0aXBvc2VjICA6IGlkVGlwb1NlYywKICAgICAgICAgICAgICAgIGZlY2hhX2luaTogZmVjaGFJbmksCiAgICAgICAgICAgICAgICBmZWNoYV9maW46IGZlY2hhRmluCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICB2YXIgZGF0b3NCcnV0b3MgPSByZXNwb25zZSB8fCBbXTsKCiAgICAgICAgICAgICAgICBpZiAoZGF0b3NCcnV0b3MubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgJCgnI2VjaGFydF8nICsgd2lkZ2V0SWQpLmh0bWwoCiAgICAgICAgICAgICAgICAgICAgICAgICc8cCBjbGFzcz0idGV4dC13YXJuaW5nIHRleHQtY2VudGVyIHctMTAwIj48aSBjbGFzcz0iZmEgZmEtZXhjbGFtYXRpb24tdHJpYW5nbGUiPjwvaT4gU2luIGRhdG9zIHBhcmEgZXN0YXMgZmVjaGFzLjwvcD4nCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGRhdG9zRmluYWxlcyA9IHJlZmluYXJfZGF0b3MoCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdG9zQnJ1dG9zLCB3aWRnZXRJZCwgaWRUaXBvU2VjLCBub21icmVUaXBvU2VjLAogICAgICAgICAgICAgICAgICAgICAgICBmZWNoYUluaSwgZmVjaGFGaW4sIGlkR3JhZmljbywgYWdydXBhY2lvbiwgaHVlY29zLCBjdXN0b21TZWd1bmRvcyk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbih4aHIsIHN0YXR1cywgZXJyb3IpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGNhcmdhbmRvIGdyw6FmaWNhOicsIGVycm9yKTsKICAgICAgICAgICAgICAgICQoJyNlY2hhcnRfJyArIHdpZGdldElkKS5odG1sKAogICAgICAgICAgICAgICAgICAgICc8cCBjbGFzcz0idGV4dC1kYW5nZXIgdGV4dC1jZW50ZXIgdy0xMDAiPjxpIGNsYXNzPSJmYSBmYS10aW1lcyI+PC9pPiBFcnJvciBkZSBjb25leGnDs24uPC9wPicKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBicmllZiBPYnRlbmNpw7NuIGRlIGRhdG9zIHkgcmVmaW5hbWllbnRvCiAgICAgKgogICAgICogQHBhcmFtIHtpbnR9ICAgICB3aWRnZXRJZCAgICAgICAgOiBpZCBkZWwgd2lkZ2V0CiAgICAgKiBAcGFyYW0ge2ludH0gICAgIGlkVGlwb1NlYyAgICAgICA6IGlkIGRlbCB0aXBvIHNlY3VuZGFyaW8KICAgICAqIEBwYXJhbSB7c3RyaW5nfSAgbm9tYnJlVGlwb1NlYyAgIDogbm9tYnJlIGRlbCB0aXBvIHNlY3VuZGFyaW8KICAgICAqIEBwYXJhbSB7c3RyaW5nfSAgZmVjaGFJbmkgICAgICAgIDogZmVjaGEgaW5pY2lvCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gIGZlY2hhRmluICAgICAgICA6IGZlY2hhIGZpbgogICAgICogQHBhcmFtIHtpbnR9ICAgICBpZEdyYWZpY28gICAgICAgOiBpZCBkZWwgZ3JhZmljbwogICAgICogQHBhcmFtIHtpbnR9ICAgICBhZ3J1cGFjaW9uICAgICAgOiBDYWRhIGN1YW50byB0aWVtcG8gc2UgYWdydXBhbiBsb3MgZGF0b3MKICAgICAqIEBwYXJhbSB7aW50fSAgICAgaHVlY29zICAgICAgICAgIDogQ2FkYSBjdWFudG8gc2UgcmVsbGVuYSBjb24gMAogICAgICogQHBhcmFtIHtpbnR9ICAgICBjdXN0b21TZWd1bmRvcyAgOiBUaWVtcG8gY3VzdG9tIHBhcmEgaHVlY29zCiAgICAgKiBAcGFyYW0gc2F2ZWRTZXJpZXMKICAgICAqLwogICAgZnVuY3Rpb24gY2FyZ2FyRGF0b3NHcmFmaWNhKHdpZGdldElkLCBpZFRpcG9TZWMsIG5vbWJyZVRpcG9TZWMsIGZlY2hhSW5pLCBmZWNoYUZpbiwgaWRHcmFmaWNvLCBhZ3J1cGFjaW9uLCBodWVjb3MsIGN1c3RvbVNlZ3VuZG9zLCBzYXZlZFNlcmllcyA9IG51bGwpIHsKCiAgICAgICAgY29uc3QgbUluaSA9IG1vbWVudChmZWNoYUluaSwgJ0REL01NL1lZWVkgSEg6bW06c3MnKTsKICAgICAgICBjb25zdCBtRmluID0gbW9tZW50KGZlY2hhRmluLCAnREQvTU0vWVlZWSBISDptbTpzcycpOwoKICAgICAgICAvLyBMbGFtYW1vcyBhIG51ZXN0cm8gbW90b3IgaW50ZWxpZ2VudGUgZW4gbHVnYXIgZGVsICQuYWpheCBkaXJlY3RvCiAgICAgICAgb2J0ZW5lckRhdG9zVjIoaWRUaXBvU2VjLCBmZWNoYUluaSwgZmVjaGFGaW4pLnRoZW4oZnVuY3Rpb24oZGF0b3NDb21wbGV0b3MpIHsKCiAgICAgICAgICAgIC8vIEZpbHRyYW1vcyBlc3RyaWN0YW1lbnRlIGVsIHJhbmdvIHNvbGljaXRhZG8gcG9yIHNpIGxhIGNhY2jDqSBlcyBtw6FzIGFtcGxpYQogICAgICAgICAgICBsZXQgZGF0b3NGaWx0cmFkb3MgPSBkYXRvc0NvbXBsZXRvcy5maWx0ZXIoZnVuY3Rpb24ocm93KSB7CiAgICAgICAgICAgICAgICBjb25zdCBkID0gbW9tZW50KHJvdy5mZWNoYSwgJ1lZWVktTU0tREQgSEg6bW06c3MnKTsKICAgICAgICAgICAgICAgIHJldHVybiBkLmlzU2FtZU9yQWZ0ZXIobUluaSkgJiYgZC5pc1NhbWVPckJlZm9yZShtRmluKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoZGF0b3NGaWx0cmFkb3MubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAkKCcjZWNoYXJ0XycgKyB3aWRnZXRJZCkuaHRtbCgKICAgICAgICAgICAgICAgICAgICAgICAgJzxwIGNsYXNzPSJ0ZXh0LXdhcm5pbmcgdGV4dC1jZW50ZXIgdy0xMDAiPjxpIGNsYXNzPSJmYSBmYS1leGNsYW1hdGlvbi10cmlhbmdsZSI+PC9pPiBTaW4gZGF0b3MgcGFyYSBlc3RhcyBmZWNoYXMuPC9wPicKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIExhbnphbW9zIGVsIHBpcGVsaW5lIGRlIHByb2Nlc2FkbwogICAgICAgICAgICByZWZpbmFyX2RhdG9zKAogICAgICAgICAgICAgICAgICAgIGRhdG9zRmlsdHJhZG9zLCB3aWRnZXRJZCwgaWRUaXBvU2VjLCBub21icmVUaXBvU2VjLAogICAgICAgICAgICAgICAgICAgIGZlY2hhSW5pLCBmZWNoYUZpbiwgaWRHcmFmaWNvLCBhZ3J1cGFjaW9uLCBodWVjb3MsIGN1c3RvbVNlZ3VuZG9zLCBzYXZlZFNlcmllcwogICAgICAgICAgICApOwoKICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihlcnJvcikgewogICAgICAgICAgICBjb25zdCBlcnJvclJlYWwgPSBlcnJvci5yZXNwb25zZVRleHQgPyBlcnJvci5yZXNwb25zZVRleHQgOiBlcnJvci5zdGF0dXNUZXh0OwogICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBjYXJnYW5kbyBncsOhZmljYSBudWV2YTonLCBlcnJvclJlYWwpOwogICAgICAgICAgICAkKCcjZWNoYXJ0XycgKyB3aWRnZXRJZCkuaHRtbCgKICAgICAgICAgICAgICAgICAgICAnPHAgY2xhc3M9InRleHQtZGFuZ2VyIHRleHQtY2VudGVyIHctMTAwIj48aSBjbGFzcz0iZmEgZmEtdGltZXMiPjwvaT4gRXJyb3IgYWwgY2FyZ2FyIGRhdG9zLjwvcD4nCiAgICAgICAgICAgICk7CiAgICAgICAgfSk7CiAgICB9CgogICAgLy8gLS0gQ09NQk9CT1ggLS0tLS0tLS0KICAgIC8qKgogICAgICogQGJyaWVmIEluaWNpYWxpemEgZWwgY29tYm9ib3ggdGlwb3NlYwogICAgICovCiAgICBmdW5jdGlvbiBpbmljaWFyX2NvbWJvYm94KCkgewogICAgICAgIHZhciAkYyA9ICQoJyNzZWxlY3QtdGlwb3NlYycpOwogICAgICAgIHRpcG9zU2VjdW5kYXJpb3MuZm9yRWFjaChmdW5jdGlvbih0aXBvc2VjKSB7CiAgICAgICAgICAgICRjLmFwcGVuZCgnPG9wdGlvbiB2YWx1ZT0iJyArIHRpcG9zZWMuaWQgKyAnIj4nICsgdGlwb3NlYy5ub21icmUgKyAnPC9vcHRpb24+Jyk7CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAYnJpZWYgR2VuZXJhIGxhcyBvcGNpb25lcyBkZSB0aXBvIGdyYWZpY29zCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdlbmVyYXJfT3BjaW9uZXNfVGFibGFzKCkgewogICAgICAgIGNvbnN0ICRzZWxlY3QgPSAkKCcjc2VsZWN0LWdyYWZpY28nKTsKICAgICAgICAkc2VsZWN0LmVtcHR5KCk7CiAgICAgICAgJHNlbGVjdC5hcHBlbmQoJzxvcHRpb24gdmFsdWU9IiI+LSBTZWxlY2Npb25lIHRpcG8gZGUgZ3LDoWZpY28gLTwvb3B0aW9uPicpOwogICAgICAgIFRJUE9TX0dSQUZJQ08uZm9yRWFjaChncmFmaWNvID0+IHsKICAgICAgICAgICAgJHNlbGVjdC5hcHBlbmQoYDxvcHRpb24gdmFsdWU9IiR7Z3JhZmljby5pZH0iPiR7Z3JhZmljby5sYWJlbH08L29wdGlvbj5gKTsKICAgICAgICB9KQogICAgfQoKCiAgICAvLyAtLSBDUkVBQ0nDk04gREUgV0lER0VUUyAtLS0tLS0tLQogICAgLyoqCiAgICAgKiBAYnJpZWYgQ3JlYWNpb24gZGUgbGFzIHZlbnRhbmFzICggV2lkZ2V0cyApIGRlbnRybyBkZWwgZ3JpZHN0YWNrIHByaW5jaXBhbAogICAgICoKICAgICAqIEBwYXJhbSB7c3RyaW5nfSAgICAgIGlkVGlwb1NlYyAgICAgICA6IElkIGRlIHRpcG9zZWMKICAgICAqIEBwYXJhbSB7c3RyaW5nfSAgICAgIG5vbWJyZVRpcG9TZWMgICA6IE5vbWJyZSBkZWwgdGlwb3NlYwogICAgICogQHBhcmFtIHtzdHJpbmd9ICAgICAgaWRHcmFmaWNvICAgICAgIDogIjEiIGzDrW5lYXMgfCAiMiIgYmFycmFzCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gICAgICBub21HcmFmaWNvICAgICAgOiBOb21icmUgZGVsIGdyYWZpY28KICAgICAqIEBwYXJhbSB7b2JqZWN0fG51bGx9IHNhdmVkTGF5b3V0ICAgICA6IHsgeCwgeSwgdywgaCB9ICAtIHNvbG8gYWwgaW1wb3J0YXIKICAgICAqIEBwYXJhbSB7b2JqZWN0fG51bGx9IHNhdmVkRmVjaGFzICAgICA6IHsgaW5pY2lvLCBmaW4gfSAtIHNvbG8gYWwgaW1wb3J0YXIKICAgICAqIEBwYXJhbSB7b2JqZWN0fG51bGx9IHNhdmVkRmlsdHJvcyAgICA6IHsgYWdydXBhY2lvbiwgaHVlY29zLCBjdXN0b21TZWd1bmRvcyB9IC0gc29sbyBhbCBpbXBvcnRhcgogICAgICogQHBhcmFtIHthcnJheX0gICAgICAgc2F2ZWRTZXJpZXMgICAgIDogYXJyYXkgc3RyaW5nIGNvbiBsYXMgc2VyaWVzIGFjdGl2YWRhcwogICAgICogQHBhcmFtIHthcnJheX0gICAgICAgc2F2ZWRVbWJyYWxlcyAgIDogcGFyIHttaW4sbWF4fSBkZSB1bWJyYWxlcwogICAgICovCiAgICBmdW5jdGlvbiBjcmVhclZlbnRhbmFHcmFmaWNhKGlkVGlwb1NlYywgbm9tYnJlVGlwb1NlYywgaWRHcmFmaWNvLCBub21HcmFmaWNvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlZExheW91dCA9IG51bGwsIHNhdmVkRmVjaGFzID0gbnVsbCwgc2F2ZWRGaWx0cm9zID0gbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWRTZXJpZXMgPSBudWxsLCBzYXZlZFVtYnJhbGVzID0gbnVsbCkgewoKICAgICAgICAvLyBGZWNoYXM6IHVzYXIgbGFzIGd1YXJkYWRhcyBvIGxlZXIgZGVsIHBpY2tlcgogICAgICAgIGNvbnN0IGZlY2hhcyA9IHNhdmVkRmVjaGFzCiAgICAgICAgICAgIHx8ICh0eXBlb2Ygd2luZG93Lm9idGVuZXJSYW5nb0ZlY2hhcyA9PT0gJ2Z1bmN0aW9uJyA/IHdpbmRvdy5vYnRlbmVyUmFuZ29GZWNoYXMoKSA6IG51bGwpOwoKICAgICAgICBpZiAoIWZlY2hhcyB8fCAhZmVjaGFzLmluaWNpbyB8fCAhZmVjaGFzLmZpbikgewogICAgICAgICAgICByZXR1cm4gbm90aWZpY2FyKCdGYWx0YW4gZmVjaGFzJywgJ1NlbGVjY2lvbmEgdW4gcmFuZ28gZGUgZmVjaGFzIHbDoWxpZG8gZW4gZWwgZmlsdHJvIHN1cGVyaW9yLicsICd3YXJuaW5nJyk7CiAgICAgICAgfQoKICAgICAgICAvLyBGaWx0cm9zOiB1c2FyIGxvcyBndWFyZGFkb3MgbyBsZWVyIGRlIGxvcyBzZWxlY3RvcmVzIGdsb2JhbGVzCiAgICAgICAgY29uc3QgYWdydXBhY2lvbiAgICAgPSBzYXZlZEZpbHRyb3MgPyBzYXZlZEZpbHRyb3MuYWdydXBhY2lvbiAgICAgOiAoJCgnI2ZpbHRyby1hZ3J1cGFjaW9uJykudmFsKCkgICAgICB8fCAnbm9uZScpOwogICAgICAgIGNvbnN0IGh1ZWNvcyAgICAgICAgID0gc2F2ZWRGaWx0cm9zID8gc2F2ZWRGaWx0cm9zLmh1ZWNvcyAgICAgICAgIDogKCQoJyNmaWx0cm8taHVlY29zJykudmFsKCkgICAgICAgICAgfHwgJzAnKTsKICAgICAgICBjb25zdCBjdXN0b21TZWd1bmRvcyA9IHNhdmVkRmlsdHJvcyA/IHNhdmVkRmlsdHJvcy5jdXN0b21TZWd1bmRvcyA6ICgkKCcjaW5wdXQtY3VzdG9tLXNlZ3VuZG9zJykudmFsKCkgIHx8ICcwJyk7CgogICAgICAgIGNvbnN0IHdpZGdldElkID0gJ3dpZGdldF8nICsgRGF0ZS5ub3coKSArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMCk7CiAgICAgICAgY29uc3QgaWNvbm8gPSBUSVBPU19HUkFGSUNPLmZpbmQoaXRlbSA9PiBpdGVtLmlkID09IGlkR3JhZmljbyk/Lmljb25vOwoKICAgICAgICAvLyBFdGlxdWV0YSBkZSBhZ3J1cGFjacOzbiBsZWdpYmxlIHBhcmEgZWwgaGVhZGVyCiAgICAgICAgbGV0IGFncnVwTGFiZWxzID0gewogICAgICAgICAgICBub25lOiAnU2luIGFncnVwYXInLCBtaW51dGU6ICdNaW51dG8nLCBob3VyOiAnSG9yYScsCiAgICAgICAgICAgIGhvdXI2OiAnNmgnLCBob3VyMTI6ICcxMmgnLCBkYXk6ICdEw61hJywgd2VlazogJ1NlbWFuYScsIG1vbnRoOiAnTWVzJwogICAgICAgIH07CiAgICAgICAgY29uc3QgYWdydXBMYWJlbCA9IGFncnVwTGFiZWxzW2FncnVwYWNpb25dIHx8IGFncnVwYWNpb247CgogICAgICAgIGNvbnN0IHdpZGdldEhUTUwgPWAKICAgICAgICAgICAgPGRpdiBjbGFzcz0iZ3JpZC1zdGFjay1pdGVtIiBpZD0iJHt3aWRnZXRJZH0iCiAgICAgICAgICAgICAgICBkYXRhLXRpcG9zZWMtaWQ9IiR7aWRUaXBvU2VjfSIKICAgICAgICAgICAgICAgIGRhdGEtdGlwb3NlYy1ub21icmU9IiR7bm9tYnJlVGlwb1NlY30iCiAgICAgICAgICAgICAgICBkYXRhLXRpcG8tZ3JhZmljbz0iJHtpZEdyYWZpY299IgogICAgICAgICAgICAgICAgZGF0YS1ub21icmUtZ3JhZmljbz0iJHtub21HcmFmaWNvfSIKICAgICAgICAgICAgICAgIGRhdGEtZmVjaGEtaW5pPSIke2ZlY2hhcy5pbmljaW99IgogICAgICAgICAgICAgICAgZGF0YS1mZWNoYS1maW49IiR7ZmVjaGFzLmZpbn0iCiAgICAgICAgICAgICAgICBkYXRhLWFncnVwYWNpb249IiR7YWdydXBhY2lvbn0iCiAgICAgICAgICAgICAgICBkYXRhLWh1ZWNvcz0iJHtodWVjb3N9IgogICAgICAgICAgICAgICAgZGF0YS1jdXN0b20tc2VndW5kb3M9IiR7Y3VzdG9tU2VndW5kb3N9Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImdyaWQtc3RhY2staXRlbS1jb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJncy1pdGVtLWhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0ZXh0LXByaW1hcnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhICR7aWNvbm99Ij48L2k+IDxiPiR7bm9tYnJlVGlwb1NlY308L2I+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9InRleHQtbXV0ZWQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgke2ZlY2hhcy5pbmljaW8uc3Vic3RyaW5nKDAsMTApfSDigJQgJHtmZWNoYXMuZmluLnN1YnN0cmluZygwLDEwKX0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7wrcmbmJzcDsgJHthZ3J1cExhYmVsfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo4cHg7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSAke2ljb25vfSBidG4tdG9nZ2xlLXRpcG8tZ3JhZmljbyIgdGl0bGU9IkNhbWJpYXIgdGlwbyBkZSBncsOhZmljbyIgZGF0YS10aXBvLWFjdHVhbD0iJHtpZEdyYWZpY299IiBzdHlsZT0iY3Vyc29yOnBvaW50ZXI7Y29sb3I6IzczODc5QzsiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1zbGlkZXJzIGJ0bi10b2dnbGUtdW1icmFsZXMiIHRpdGxlPSJVbWJyYWxlcyIgc3R5bGU9ImN1cnNvcjpwb2ludGVyO2NvbG9yOiM3Mzg3OUM7Ij48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtY29nIGJ0bi10b2dnbGUtZmlsdHJvcyIgdGl0bGU9IkZpbHRyb3MgTG9jYWxlcyIgc3R5bGU9ImN1cnNvcjpwb2ludGVyO2NvbG9yOiM3Mzg3OUM7Ij48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtdGltZXMgYnRuLXJlbW92ZS13aWRnZXQiIHRpdGxlPSJRdWl0YXIiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImdzLXVtYnJhbGVzLXBhbmVsIiBzdHlsZT0iZGlzcGxheTpub25lOyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyBuby1ndXR0ZXJzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC02IHByLTEiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIGlucHV0LWdyb3VwLXNtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtZ3JvdXAtcHJlcGVuZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpbnB1dC1ncm91cC10ZXh0IiBzdHlsZT0iYmFja2dyb3VuZDojZGMzNTQ1O2NvbG9yOiNmZmY7Ym9yZGVyLWNvbG9yOiNkYzM1NDU7Zm9udC1zaXplOjEwcHg7cGFkZGluZzowIDVweDsiPk3DgVg8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIGNsYXNzPSJmb3JtLWNvbnRyb2wgaW5wdXQtdW1icmFsLW1heCIgcGxhY2Vob2xkZXI9Ii0iIHN0ZXA9ImFueSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC02IHBsLTEiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIGlucHV0LWdyb3VwLXNtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtZ3JvdXAtcHJlcGVuZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImlucHV0LWdyb3VwLXRleHQiIHN0eWxlPSJiYWNrZ3JvdW5kOiMyOGE3NDU7Y29sb3I6I2ZmZjtib3JkZXItY29sb3I6IzI4YTc0NTtmb250LXNpemU6MTBweDtwYWRkaW5nOjAgNXB4OyI+TcONTjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgY2xhc3M9ImZvcm0tY29udHJvbCBpbnB1dC11bWJyYWwtbWluIiBwbGFjZWhvbGRlcj0iLSIgc3RlcD0iYW55Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJncy1maWx0cm9zLXBhbmVsIiBzdHlsZT0iZGlzcGxheTpub25lOyBwYWRkaW5nOjVweCA4cHg7IGJvcmRlci1ib3R0b206MXB4IHNvbGlkICNlZWU7IG1hcmdpbi1ib3R0b206NHB4OyBiYWNrZ3JvdW5kLWNvbG9yOiNmYmZiZmI7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93IG5vLWd1dHRlcnMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLTUgcHItMSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPSJmb250LXNpemU6MTBweDttYXJnaW4tYm90dG9tOjJweDtmb250LXdlaWdodDpib2xkO2NvbG9yOiM3Mzg3OUM7Ij5BZ3J1cGFjacOzbjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz0iZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbSBzZWxlY3QtbG9jYWwtYWdydXBhY2lvbiIgc3R5bGU9ImZvbnQtc2l6ZToxMXB4OyBoZWlnaHQ6MjRweDsgcGFkZGluZzoycHggNHB4OyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Im5vbmUiICR7YWdydXBhY2lvbj09PSdub25lJz8nc2VsZWN0ZWQnOicnfT5TaW4gYWdydXBhcjwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJtaW51dGUiICR7YWdydXBhY2lvbj09PSdtaW51dGUnPydzZWxlY3RlZCc6Jyd9Pk1pbnV0bzwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJob3VyIiAke2FncnVwYWNpb249PT0naG91cic/J3NlbGVjdGVkJzonJ30+SG9yYTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJob3VyNiIgJHthZ3J1cGFjaW9uPT09J2hvdXI2Jz8nc2VsZWN0ZWQnOicnfT42IEhvcmFzPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImhvdXIxMiIgJHthZ3J1cGFjaW9uPT09J2hvdXIxMic/J3NlbGVjdGVkJzonJ30+MTIgSG9yYXM8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iZGF5IiAke2FncnVwYWNpb249PT0nZGF5Jz8nc2VsZWN0ZWQnOicnfT5Ew61hPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IndlZWsiICR7YWdydXBhY2lvbj09PSd3ZWVrJz8nc2VsZWN0ZWQnOicnfT5TZW1hbmE8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0ibW9udGgiICR7YWdydXBhY2lvbj09PSdtb250aCc/J3NlbGVjdGVkJzonJ30+TWVzPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC01IHBsLTEiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBzdHlsZT0iZm9udC1zaXplOjEwcHg7bWFyZ2luLWJvdHRvbToycHg7Zm9udC13ZWlnaHQ6Ym9sZDtjb2xvcjojNzM4NzlDOyI+SHVlY29zPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPSJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtIHNlbGVjdC1sb2NhbC1odWVjb3MiIHN0eWxlPSJmb250LXNpemU6MTFweDsgaGVpZ2h0OjI0cHg7IHBhZGRpbmc6MnB4IDRweDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIwIiAke2h1ZWNvcz09PScwJz8nc2VsZWN0ZWQnOicnfT5TaW4gcmVsbGVubzwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIzNjAwIiAke2h1ZWNvcz09PSczNjAwJz8nc2VsZWN0ZWQnOicnfT4xIGhvcmE8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMjE2MDAiICR7aHVlY29zPT09JzIxNjAwJz8nc2VsZWN0ZWQnOicnfT42IGhvcmFzPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ijg2NDAwIiAke2h1ZWNvcz09PSc4NjQwMCc/J3NlbGVjdGVkJzonJ30+MSBkw61hPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImN1c3RvbSIgJHtodWVjb3M9PT0nY3VzdG9tJz8nc2VsZWN0ZWQnOicnfT5DdXN0b208L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ibnVtYmVyIiBjbGFzcz0iZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbSBpbnB1dC1sb2NhbC1jdXN0b20gbXQtMSIgcGxhY2Vob2xkZXI9IlNlZ3MiIHZhbHVlPSIke2N1c3RvbVNlZ3VuZG9zfSIgc3R5bGU9ImRpc3BsYXk6JHtodWVjb3M9PSdjdXN0b20nPydibG9jayc6J25vbmUnfTsgZm9udC1zaXplOjExcHg7IGhlaWdodDoyNHB4OyBwYWRkaW5nOjJweCA0cHg7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLTIgcGwtMSBtdC0zIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBidG4teHMgYnRuLXByaW1hcnkgYnRuLWFwbGljYXItZmlsdHJvcy1sb2NhbGVzIG0tMCIgdHlwZT0iYnV0dG9uIiBzdHlsZT0iZm9udC1zaXplOjEwcHg7Ij5BcGxpY2FyIGNhbWJpb3M8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImdzLXNlcmllcy1zZWxlY3RvciIgc3R5bGU9Im1hcmdpbi1ib3R0b206NHB4OyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIGlucHV0LWdyb3VwLXNtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9ImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc20gc2VsZWN0LXNlcmllLWRpc3BvbmlibGUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIiPuKAlCBDYXJnYW5kbyBzZXJpZXMuLi4g4oCUPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwLWFwcGVuZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1zbSBidG4tcHJpbWFyeSBidG4tYWRkLXNlcmllIG1iLTAiIHR5cGU9ImJ1dHRvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1wbHVzIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1zZWNvbmRhcnkgYnRuLWxpbXBpYXItc2VyaWVzIG1iLTAiIHR5cGU9ImJ1dHRvbiIgdGl0bGU9IlF1aXRhciB0b2RhcyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS10cmFzaC1vIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImdzLXNlcmllcy10YWdzIG10LTEiIHN0eWxlPSJtaW4taGVpZ2h0OjE4cHg7ZGlzcGxheTpmbGV4O2ZsZXgtd3JhcDp3cmFwO2dhcDozcHg7Ij48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZ3MtaXRlbS1ib2R5IiBzdHlsZT0iZmxleDoxOyBwb3NpdGlvbjpyZWxhdGl2ZTsgbWluLWhlaWdodDoxNTBweDsiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJncy1uby1zZXJpZXMtb3ZlcmxheSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJncy1vdmVybGF5LWlubmVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtbGluZS1jaGFydCI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlNlbGVjY2lvbmUgdW5hIHNlcmllPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJlY2hhcnRfJHt3aWRnZXRJZH0iIHN0eWxlPSJ3aWR0aDoxMDAlO2hlaWdodDoxMDAlO21pbi1oZWlnaHQ6MjAwcHg7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0ZXh0LWNlbnRlciB0ZXh0LW11dGVkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtc3Bpbm5lciBmYS1zcGluIGZhLTJ4Ij48L2k+PGJyPkNhcmdhbmRvIGRhdG9zLi4uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICBgOwogICAgICAgIC8vIC0tIEFsdHVyYSBkaW7DoW1pY2EgLS0tLS0tLS0KICAgICAgICBpZiAoaERpbmFtaWNvID09PSAwKSB7CiAgICAgICAgICAgIGNvbnN0IGFsdG9QYWRyZSA9ICQoJyNncmlkLWdsb2JhbCcpLnBhcmVudCgpLmlubmVySGVpZ2h0KCk7CiAgICAgICAgICAgIGNvbnN0IGFsdG9DZWxkYSA9IGdyaWRHbG9iYWwuZ2V0Q2VsbEhlaWdodCgpOwogICAgICAgICAgICBoRGluYW1pY28gPSBNYXRoLmZsb29yKGFsdG9QYWRyZSAvIGFsdG9DZWxkYSk7CiAgICAgICAgICAgIGlmIChoRGluYW1pY28gPCA0KSAgaERpbmFtaWNvID0gNDsKICAgICAgICAgICAgaWYgKGhEaW5hbWljbyA+IDEyKSBoRGluYW1pY28gPSAxMjsKICAgICAgICB9CgogICAgICAgIGNvbnN0IG9wY2lvbmVzQmFzaWNhcyA9IHsgdzogMTIsIGg6IGhEaW5hbWljbywgYXV0b1Bvc2l0aW9uOiB0cnVlIH07CiAgICAgICAgY29uc3Qgb3BjaW9uZXNGaW5hbGVzID0gc2F2ZWRMYXlvdXQgPyB7IC4uLm9wY2lvbmVzQmFzaWNhcywgLi4uc2F2ZWRMYXlvdXQgfSA6IG9wY2lvbmVzQmFzaWNhczsKCiAgICAgICAgZ3JpZEdsb2JhbC5hZGRXaWRnZXQod2lkZ2V0SFRNTCwgb3BjaW9uZXNGaW5hbGVzKTsKCiAgICAgICAgLy8gUmVzdGF1cmFyIHVtYnJhbGVzIHNpIHZpZW5lbiBndWFyZGFkb3MKICAgICAgICBpZiAoc2F2ZWRVbWJyYWxlcykgewogICAgICAgICAgICBpZiAoc2F2ZWRVbWJyYWxlcy5tYXggIT09IG51bGwgJiYgc2F2ZWRVbWJyYWxlcy5tYXggIT09ICcnKSB7CiAgICAgICAgICAgICAgICAkKCcjJyArIHdpZGdldElkKS5maW5kKCcuaW5wdXQtdW1icmFsLW1heCcpLnZhbChzYXZlZFVtYnJhbGVzLm1heCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHNhdmVkVW1icmFsZXMubWluICE9PSBudWxsICYmIHNhdmVkVW1icmFsZXMubWluICE9PSAnJykgewogICAgICAgICAgICAgICAgJCgnIycgKyB3aWRnZXRJZCkuZmluZCgnLmlucHV0LXVtYnJhbC1taW4nKS52YWwoc2F2ZWRVbWJyYWxlcy5taW4pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBDYXJnYXIgeSBwaW50YXIgZGF0b3MKICAgICAgICBjYXJnYXJEYXRvc0dyYWZpY2EoCiAgICAgICAgICAgIHdpZGdldElkLCBpZFRpcG9TZWMsIG5vbWJyZVRpcG9TZWMsCiAgICAgICAgICAgIGZlY2hhcy5pbmljaW8sIGZlY2hhcy5maW4sCiAgICAgICAgICAgIGlkR3JhZmljbywgYWdydXBhY2lvbiwgaHVlY29zLCBjdXN0b21TZWd1bmRvcywgc2F2ZWRTZXJpZXMKICAgICAgICApOwoKICAgICAgICAvLyBCb3TDs24gZGUgYm9ycmFkbyBpbmRpdmlkdWFsCiAgICAgICAgJCgnIycgKyB3aWRnZXRJZCkub24oJ2NsaWNrJywgJy5idG4tcmVtb3ZlLXdpZGdldCcsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBjb25zdCBjaGFydERvbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlY2hhcnRfJyArIHdpZGdldElkKTsKICAgICAgICAgICAgaWYgKGNoYXJ0RG9tKSB7CiAgICAgICAgICAgICAgICBjb25zdCBteUNoYXJ0ID0gZWNoYXJ0cy5nZXRJbnN0YW5jZUJ5RG9tKGNoYXJ0RG9tKTsKICAgICAgICAgICAgICAgIGlmIChteUNoYXJ0KSBteUNoYXJ0LmRpc3Bvc2UoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29uc3QgdElkID0gJCgnIycgKyB3aWRnZXRJZCkuYXR0cignZGF0YS10aXBvc2VjLWlkJyk7CgogICAgICAgICAgICBncmlkR2xvYmFsLnJlbW92ZVdpZGdldChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aWRnZXRJZCkpOwogICAgICAgICAgICBkZWxldGUgd2lkZ2V0RGF0YUNhY2hlW3dpZGdldElkXTsKCiAgICAgICAgICAgIGlmICgkKCcuZ3JpZC1zdGFjay1pdGVtW2RhdGEtdGlwb3NlYy1pZD0iJyArIHRJZCArICciXScpLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgZGVsZXRlIGNhY2hlU2VjdW5kYXJpb1t0SWRdOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAYnJpZWYgSW5pY2lhbGl6YSBlbCBncmlkU3RhY2sKICAgICAqLwogICAgZnVuY3Rpb24gaW5pdF9HcmlkX1N0YWNrKCkgewogICAgICAgIGNvbnN0IGdyaWRUZW1wID0gR3JpZFN0YWNrLmluaXQoewogICAgICAgICAgICBmbG9hdDogdHJ1ZSwKICAgICAgICAgICAgZGlzYWJsZURyYWc6IGZhbHNlLAogICAgICAgICAgICBkaXNhYmxlUmVzaXplOiBmYWxzZSwKICAgICAgICAgICAgY2VsbEhlaWdodDogJzgwcHgnLAogICAgICAgICAgICBtYXJnaW46IDAsCiAgICAgICAgICAgIGhhbmRsZTogJy5ncy1pdGVtLWhlYWRlcicsCiAgICAgICAgfSwgJyNncmlkLWdsb2JhbCcpOwoKICAgICAgICAkKHdpbmRvdykub24oJ3Jlc2l6ZSBvcmllbnRhdGlvbmNoYW5nZScsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAkKCcuZ3JpZC1zdGFjay1pdGVtJykuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHdJZCA9ICQodGhpcykuYXR0cignaWQnKTsKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXJ0RG9tID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VjaGFydF8nICsgd0lkKTsKICAgICAgICAgICAgICAgIGlmIChjaGFydERvbSkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IG15Q2hhcnQgPSBlY2hhcnRzLmdldEluc3RhbmNlQnlEb20oY2hhcnREb20pOwogICAgICAgICAgICAgICAgICAgIGlmIChteUNoYXJ0KSB7IG15Q2hhcnQucmVzaXplKCk7IH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgICAgZ3JpZFRlbXAub24oJ2FkZGVkIHJlbW92ZWQgY2hhbmdlJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7ICQod2luZG93KS50cmlnZ2VyKCdyZXNpemUnKTsgfSwgMTAwKTsKICAgICAgICB9KTsKCiAgICAgICAgcmV0dXJuIGdyaWRUZW1wOwogICAgfQoKCiAgICAvLyAtLSBFWFBPUlQgLS0tLS0tLQogICAgLyoqCiAgICAgKiBAYnJpZWYgQ29uc3RydXllIGVsIGFycmF5IGRlIGl0ZW1zIGEgcGFydGlyIGRlbCBncmlkIGFjdHVhbAogICAgICoKICAgICAqIEByZXR1cm4ge2FycmF5fSBpdGVtcyA6IGxvcyBwYXJhbWV0cm9zIGRlIGNhZGEgd2lkZ2V0IHBhcmEgcmVwbGljYXJsb3MKICAgICAqLwogICAgZnVuY3Rpb24gb2J0ZW5lcl9pdGVtc19ncmlkKCkgewogICAgICAgIGNvbnN0IGl0ZW1zID0gW107CiAgICAgICAgJCgnI2dyaWQtZ2xvYmFsIC5ncmlkLXN0YWNrLWl0ZW1bZGF0YS10aXBvc2VjLWlkXScpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGNvbnN0IGVsICA9IHRoaXM7CiAgICAgICAgICAgIGNvbnN0IG5vZG8gPSBncmlkR2xvYmFsLmVuZ2luZS5ub2Rlcy5maW5kKGZ1bmN0aW9uKG4pIHsKICAgICAgICAgICAgICAgIHJldHVybiBuLmVsID09PSBlbCB8fCBuLmVsID09PSBlbC5xdWVyeVNlbGVjdG9yKCcuZ3JpZC1zdGFjay1pdGVtLWNvbnRlbnQnKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGl0ZW1zLnB1c2goewogICAgICAgICAgICAgICAgeDogICAgICAgICAgICAgICBub2RvID8gbm9kby54IDogcGFyc2VJbnQoZWwuZ2V0QXR0cmlidXRlKCdkYXRhLWdzLXgnKSkgIHx8IDAsCiAgICAgICAgICAgICAgICB5OiAgICAgICAgICAgICAgIG5vZG8gPyBub2RvLnkgOiBwYXJzZUludChlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtZ3MteScpKSAgfHwgMCwKICAgICAgICAgICAgICAgIHc6ICAgICAgICAgICAgICAgbm9kbyA/IG5vZG8udyA6IHBhcnNlSW50KGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1ncy13JykpICB8fCAxMiwKICAgICAgICAgICAgICAgIGg6ICAgICAgICAgICAgICAgbm9kbyA/IG5vZG8uaCA6IHBhcnNlSW50KGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1ncy1oJykpICB8fCA0LAogICAgICAgICAgICAgICAgdGlwb3NlY19pZDogICAgICBlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdGlwb3NlYy1pZCcpLAogICAgICAgICAgICAgICAgdGlwb3NlY19ub21icmU6ICBlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdGlwb3NlYy1ub21icmUnKSwKICAgICAgICAgICAgICAgIHRpcG9fZ3JhZmljbzogICAgZWwuZ2V0QXR0cmlidXRlKCdkYXRhLXRpcG8tZ3JhZmljbycpLAogICAgICAgICAgICAgICAgbm9tYnJlX2dyYWZpY286ICBlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtbm9tYnJlLWdyYWZpY28nKSwKICAgICAgICAgICAgICAgIGZlY2hhX2luaTogICAgICAgZWwuZ2V0QXR0cmlidXRlKCdkYXRhLWZlY2hhLWluaScpLAogICAgICAgICAgICAgICAgZmVjaGFfZmluOiAgICAgICBlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtZmVjaGEtZmluJyksCiAgICAgICAgICAgICAgICBhZ3J1cGFjaW9uOiAgICAgIGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1hZ3J1cGFjaW9uJyksCiAgICAgICAgICAgICAgICBodWVjb3M6ICAgICAgICAgIGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1odWVjb3MnKSwKICAgICAgICAgICAgICAgIGN1c3RvbV9zZWd1bmRvczogZWwuZ2V0QXR0cmlidXRlKCdkYXRhLWN1c3RvbS1zZWd1bmRvcycpLAogICAgICAgICAgICAgICAgdW1icmFsX21heDogZWwucXVlcnlTZWxlY3RvcignLmlucHV0LXVtYnJhbC1tYXgnKT8udmFsdWUgfHwgJycsCiAgICAgICAgICAgICAgICB1bWJyYWxfbWluOiBlbC5xdWVyeVNlbGVjdG9yKCcuaW5wdXQtdW1icmFsLW1pbicpPy52YWx1ZSB8fCAnJywKICAgICAgICAgICAgICAgIHNlcmllczogQXJyYXkuZnJvbShlbC5xdWVyeVNlbGVjdG9yQWxsKCcuZ3Mtc2VyaWUtdGFnJykpLm1hcChmdW5jdGlvbih0YWcpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0YWcuY2hpbGROb2RlcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24obikgeyByZXR1cm4gbi5ub2RlVHlwZSA9PT0gMzsgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24obikgeyByZXR1cm4gbi50ZXh0Q29udGVudC50cmltKCk7IH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuam9pbignJyk7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gaXRlbXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBAYnJpZWYgRXhwb3J0YSBsYSBjb25maWd1cmFjacOzbiBhY3R1YWwgY29tbyBmaWNoZXJvIEpTT04gZGVzY2FyZ2FibGUKICAgICAqCiAgICAgKiBAZGVwcmVjYXRlZCBBdW4gZnVuY2lvbmFsIHBlcm8gbGEgbG9naWNhIHNlIGhhIHBhc2FkbyBhIGd1YXJkYXJfbGF5b3V0IGVuIEJCREQKICAgICAqLwogICAgZnVuY3Rpb24gZXhwb3J0YXJDb25maWd1cmFjaW9uKCkgewogICAgICAgIGNvbnN0IG5vbWJyZSA9ICdEYXNoYm9hcmQgJyArIG1vbWVudCgpLmZvcm1hdCgnREQvTU0vWVlZWSBISDptbScpOwogICAgICAgIGNvbnN0IHBheWxvYWQgPSB7CiAgICAgICAgICAgIG5vbWJyZTogbm9tYnJlLAogICAgICAgICAgICBpdGVtczogIG9idGVuZXJfaXRlbXNfZ3JpZCgpCiAgICAgICAgfTsKCiAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtKU09OLnN0cmluZ2lmeShwYXlsb2FkLCBudWxsLCAyKV0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nIH0pOwogICAgICAgIGNvbnN0IHVybCAgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOwogICAgICAgIGNvbnN0IGEgICAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7CiAgICAgICAgYS5ocmVmICAgICA9IHVybDsKICAgICAgICBhLmRvd25sb2FkID0gJ2Rhc2hib2FyZF9ncmFmaWNhc18nICsgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNsaWNlKDAsIDEwKSArICcuanNvbic7CiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTsKICAgICAgICBhLmNsaWNrKCk7CiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTsKICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7CgogICAgICAgIG5vdGlmaWNhcignRXhwb3J0YWNpw7NuIGNvbXBsZXRhZGEnLCAnRWwgYXJjaGl2byBKU09OIHNlIGhhIGRlc2NhcmdhZG8gY29ycmVjdGFtZW50ZS4nLCAnc3VjY2VzcycpOwogICAgfQoKICAgIC8qKgogICAgICogQGJyaWVmIEd1YXJkYSBlbCBsYXlvdXQgYWN0dWFsIGVuIGxhIGJhc2UgZGUgZGF0b3MKICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gIG5vbWJyZSA6IG5vbWJyZSBwYXJhIGJhc2UgZGUgZGF0b3MKICAgICAqIEBub3RlIGxvcyBkZW1hcyBwYXJhbWV0cm9zIHNlIG9idGllbmVuIGRlIG9idGVuZXJfaXRlbXNfZ3JpZCgpCiAgICAgKi8KICAgIGZ1bmN0aW9uIGd1YXJkYXJfbGF5b3V0KG5vbWJyZSkgewogICAgICAgIGNvbnN0IGl0ZW1zID0gb2J0ZW5lcl9pdGVtc19ncmlkKCk7CiAgICAgICAgaWYgKCFpdGVtcyB8fCBpdGVtcy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgbm90aWZpY2FyKCdTaW4gd2lkZ2V0cycsICdObyBoYXkgZ3LDoWZpY29zIGVuIGVsIGdyaWQgcGFyYSBndWFyZGFyLicsICd3YXJuaW5nJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICQuYWpheCh7CiAgICAgICAgICAgIHVybDogICAgICAnLi4vLi4vb2xpL2JhY2tlbmQvYXBpLnBocCcsCiAgICAgICAgICAgIG1ldGhvZDogICAnUE9TVCcsCiAgICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicsCiAgICAgICAgICAgIGRhdGE6IHsKICAgICAgICAgICAgICAgIGFjdGlvbjogJ3NhdmVfbGF5b3V0JywKICAgICAgICAgICAgICAgIG5vbWJyZTogbm9tYnJlLAogICAgICAgICAgICAgICAgbGF5b3V0OiBKU09OLnN0cmluZ2lmeShpdGVtcykKICAgICAgICAgICAgfSwKICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5vaykgewogICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhcignR3VhcmRhZG8nLCAnTGF5b3V0IGd1YXJkYWRvIGNvcnJlY3RhbWVudGUgKElEOiAnICsgcmVzcG9uc2UubGF5b3V0X2lkICsgJykuJywgJ3N1Y2Nlc3MnKTsKICAgICAgICAgICAgICAgICAgICBsYXlvdXRBY3Rpdm9JZCA9IHJlc3BvbnNlLmxheW91dF9pZDsKICAgICAgICAgICAgICAgICAgICBhY3R1YWxpemFyQm90b25lc0xheW91dCgpOwogICAgICAgICAgICAgICAgICAgIGNhcmdhcl9saXN0YV9sYXlvdXRzKCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhcignRXJyb3InLCByZXNwb25zZS5lcnJvciB8fCAnTm8gc2UgcHVkbyBndWFyZGFyIGVsIGxheW91dC4nLCAnZXJyb3InKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKHhocikgewogICAgICAgICAgICAgICAgbm90aWZpY2FyKCdFcnJvciAnICsgeGhyLnN0YXR1cywgJ0ZhbGxvIGFsIGNvbmVjdGFyIGNvbiBlbCBzZXJ2aWRvci4nLCAnZXJyb3InKTsKICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2d1YXJkYXJfbGF5b3V0IGVycm9yOicsIHhoci5yZXNwb25zZVRleHQpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CgoKICAgIC8vIC0tIElNUE9SVCAtLS0tLS0tLQogICAgLyoqCiAgICAgKiBAYnJpZWYgQ29tcHJ1ZWJhIHF1ZSBlbCBmb3JtYXRvIEpTT04gZXN0w6kgY29ycmVjdG8uCiAgICAgKgogICAgICogQHBhcmFtIHtkYXRhfSAgICBkYXRhIDogRGF0YSBkZWwgSlNPTgogICAgICoKICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgc2kgZXMgZXN0cnVjdHVyYSBsZWdpdGltYSwgRmFsc2UgZW4gY2FzbyBjb250cmFyaW8uCiAgICAgKi8KICAgIGZ1bmN0aW9uIGVzRXN0cnVjdHVyYUxlZ2l0aW1hKGRhdGEpIHsKICAgICAgICBjb25zdCBpdGVtcyA9IEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogKGRhdGEgJiYgQXJyYXkuaXNBcnJheShkYXRhLml0ZW1zKSA/IGRhdGEuaXRlbXMgOiBudWxsKTsKICAgICAgICBpZiAoIWl0ZW1zKSByZXR1cm4gZmFsc2U7CiAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWU7CiAgICAgICAgcmV0dXJuIGl0ZW1zLmV2ZXJ5KGZ1bmN0aW9uKGl0ZW0pIHsKICAgICAgICAgICAgcmV0dXJuIGl0ZW0uaGFzT3duUHJvcGVydHkoJ3RpcG9zZWNfaWQnKSAgJiYKICAgICAgICAgICAgICAgIGl0ZW0uaGFzT3duUHJvcGVydHkoJ3RpcG9fZ3JhZmljbycpICYmCiAgICAgICAgICAgICAgICBpdGVtLmhhc093blByb3BlcnR5KCdmZWNoYV9pbmknKSAgICAmJgogICAgICAgICAgICAgICAgaXRlbS5oYXNPd25Qcm9wZXJ0eSgnZmVjaGFfZmluJykgICAgJiYKICAgICAgICAgICAgICAgIGl0ZW0uaGFzT3duUHJvcGVydHkoJ3gnKSAgICAgICAgICAgICYmCiAgICAgICAgICAgICAgICBpdGVtLmhhc093blByb3BlcnR5KCd5Jyk7CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAYnJpZWYgRWplY3V0YSBsYSBpbXBvcnRhY2nDs24geSBjcmVhIGxvcyB3aWRnZXRzIGNvcnJlc3BvbmRpZW50ZXMKICAgICAqCiAgICAgKiBAcGFyYW0ge2RhdGF9ICAgIGRhdGEgOiBEYXRhIGRlbCBKU09OCiAgICAgKi8KICAgIGZ1bmN0aW9uIGVqZWN1dGFySW1wb3J0YWNpb24oZGF0YSkgewogICAgICAgIC8vIFNvcG9ydGEgZm9ybWF0byBudWV2byB7IG5vbWJyZSwgaXRlbXMgfSB5IGxlZ2FjeSBhcnJheSBwbGFubwogICAgICAgIGNvbnN0IGNvbmZpZ0FycmF5ID0gQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBkYXRhLml0ZW1zOwoKICAgICAgICBwcmVwYXJhckVudG9ybm9XaWRnZXRzKGNvbmZpZ0FycmF5KTsKCiAgICAgICAgY29uZmlnQXJyYXkuZm9yRWFjaChmdW5jdGlvbih2ZW50YW5hKSB7CiAgICAgICAgICAgIGNyZWFyVmVudGFuYUdyYWZpY2EoCiAgICAgICAgICAgICAgICB2ZW50YW5hLnRpcG9zZWNfaWQsCiAgICAgICAgICAgICAgICB2ZW50YW5hLnRpcG9zZWNfbm9tYnJlLAogICAgICAgICAgICAgICAgdmVudGFuYS50aXBvX2dyYWZpY28sCiAgICAgICAgICAgICAgICB2ZW50YW5hLm5vbWJyZV9ncmFmaWNvLAogICAgICAgICAgICAgICAgeyB4OiB2ZW50YW5hLngsIHk6IHZlbnRhbmEueSwgdzogdmVudGFuYS53LCBoOiB2ZW50YW5hLmggfSwKICAgICAgICAgICAgICAgIHsgaW5pY2lvOiB2ZW50YW5hLmZlY2hhX2luaSwgZmluOiB2ZW50YW5hLmZlY2hhX2ZpbiB9LAogICAgICAgICAgICAgICAgeyBhZ3J1cGFjaW9uOiB2ZW50YW5hLmFncnVwYWNpb24sIGh1ZWNvczogdmVudGFuYS5odWVjb3MsIGN1c3RvbVNlZ3VuZG9zOiB2ZW50YW5hLmN1c3RvbV9zZWd1bmRvcyB9CiAgICAgICAgICAgICk7CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAYnJpZWYgTGVlIGVsIEpTT04geSBsYW56YSBsYSBpbXBvcnRhY2nDs24KICAgICAqCiAgICAgKiBAcGFyYW0ge2ZpbGV9ICAgIGZpbGUgOiBBcmNoaXZvIGpzb24gYSB0cmF0YXIKICAgICAqIEBpZiAgc2kgZXN0cnVjdHVyYV9sZWdpdGltYSBmYWxsYSwgSlNPTiBpbnZhbGlkbwogICAgICogQHRocm93cyBlcnJvciBzaSBlbCBsZWN0b3IgcmVwb3J0YSBlcnJvcgogICAgICovCiAgICBmdW5jdGlvbiBwcm9jZXNhckFyY2hpdm9KU09OKGZpbGUpIHsKICAgICAgICBpZiAoZmlsZS50eXBlICE9PSAnYXBwbGljYXRpb24vanNvbicgJiYgIWZpbGUubmFtZS5lbmRzV2l0aCgnLmpzb24nKSkgewogICAgICAgICAgICByZXR1cm4gbm90aWZpY2FyKCdFcnJvcicsICdTb2xvIHNlIGFkbWl0ZW4gYXJjaGl2b3MgLmpzb24nLCAnZXJyb3InKTsKICAgICAgICB9CiAgICAgICAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7CiAgICAgICAgcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHZhciBkYXRhID0gSlNPTi5wYXJzZShlLnRhcmdldC5yZXN1bHQpOwogICAgICAgICAgICAgICAgaWYgKGVzRXN0cnVjdHVyYUxlZ2l0aW1hKGRhdGEpKSB7CiAgICAgICAgICAgICAgICAgICAgZWplY3V0YXJJbXBvcnRhY2lvbihkYXRhKTsKICAgICAgICAgICAgICAgICAgICAkKCcjbW9kYWxJbXBvcnRhcicpLm1vZGFsKCdoaWRlJyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5vbWJyZSA9ICghQXJyYXkuaXNBcnJheShkYXRhKSAmJiBkYXRhLm5vbWJyZSkgPyBkYXRhLm5vbWJyZSA6ICcnOwogICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhcignw4l4aXRvJywgJ0NvbmZpZ3VyYWNpw7NuJyArIChub21icmUgPyAnIMKrJyArIG5vbWJyZSArICfCuycgOiAnJykgKyAnIGltcG9ydGFkYSBjb3JyZWN0YW1lbnRlLicsICdzdWNjZXNzJyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhcignRm9ybWF0byBJbnbDoWxpZG8nLCAnRWwgYXJjaGl2byBKU09OIG5vIHRpZW5lIGxhIGVzdHJ1Y3R1cmEgZXNwZXJhZGEuJywgJ2Vycm9yJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgICAgICBub3RpZmljYXIoJ0FyY2hpdm8gQ29ycnVwdG8nLCAnTm8gc2UgcHVkbyBsZWVyIGVsIGFyY2hpdm8uIEVsIEpTT04gZXN0w6EgbWFsIGZvcm1hZG8uJywgJ2Vycm9yJyk7CiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcmVhZGVyLnJlYWRBc1RleHQoZmlsZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAYnJpZWYgSW5pY2lhbGl6YSB5IHJlbmRlcml6YSB1biBncsOhZmljbyBFQ2hhcnRzIG11bHRpc2VyaWUgZGVudHJvIGRlIHVuIGNvbnRlbmVkb3IgR3JpZHN0YWNrLgogICAgICoKICAgICAqIEBkZXRhaWxzIENvbmZpZ3VyYSBlbCBsaWVuem8gbWVkaWFudGUgbGEgZGlzcG9zaWNpw7NuIGRlIGluc3RhbmNpYXMgcHJldmlhcyB5IGVsIG1hcGVvIGRlIGRhdG9zIHRlbXBvcmFsZXMgYSBzZXJpZXMgZGUgbMOtbmVhcyBvIGJhcnJhcy4KICAgICAqICAgICAgICAgIEltcGxlbWVudGEgdW4gdG9vbHRpcCBwZXJzb25hbGl6YWRvLCBoZXJyYW1pZW50YXMgZGUgaW50ZXJhY2Npw7NuIHkgbGEgaW50ZWdyYWNpw7NuIGRlIGzDrW5lYXMgZGUgdW1icmFsIChtYXJrTGluZXMpCiAgICAgKiAgICAgICAgICB2aW5jdWxhZGFzIGV4Y2x1c2l2YW1lbnRlIGEgbGEgc2VyaWUgcHJpbWFyaWEgcGFyYSBvcHRpbWl6YXIgbGEgY2xhcmlkYWQgdmlzdWFsLgogICAgICoKICAgICAqIEBwYXJhbSB7c3RyaW5nfSAgICAgIHdpZGdldElkICAgICAgICA6IElEIGRlbCBjb250ZW5lZG9yIERPTS4KICAgICAqIEBwYXJhbSB7YXJyYXl9ICAgICAgIGRhdG9zICAgICAgICAgICA6IEFycmF5IGRlIG9iamV0b3MgY29uIG1hcmNhcyBkZSB0aWVtcG8geSB2YWxvcmVzLgogICAgICogQHBhcmFtIHtzdHJpbmdbXX0gICAgeWtleXMgICAgICAgICAgIDogSWRlbnRpZmljYWRvcmVzIGRlIGxhcyBjbGF2ZXMgZGUgZGF0b3MgcGFyYSBsYXMgc2VyaWVzLgogICAgICogQHBhcmFtIHtzdHJpbmdbXX0gICAgbGFiZWxzICAgICAgICAgIDogTm9tYnJlcyBsZWdpYmxlcyBwYXJhIGxhIGxleWVuZGEuCiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSAgICBjb2xvcmVzICAgICAgICAgOiBIZXhhZGVjaW1hbGVzIGFzaWduYWRvcyBhIGNhZGEgc2VyaWUuCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gICAgICB0aXBvR3JhZmljb0lkICAgOiBTZWxlY3RvciBkZSB0aXBvICgxIHBhcmEgbMOtbmVhcywgcmVzdG8gcGFyYSBiYXJyYXMpLCBhbXBsaWFibGUuCiAgICAgKiBAcGFyYW0ge2FycmF5fSAgICAgICBtYXJrTGluZXMgICAgICAgOiBDb25maWd1cmFjacOzbiBkZSBsw61uZWFzIGRlIHVtYnJhbCBtw6F4aW1vL23DrW5pbW8uCiAgICAgKi8KCiAgICBmdW5jdGlvbiBkaWJ1amFyRWNoYXJ0V2lkZ2V0KHdpZGdldElkLCBkYXRvcywgeWtleXMsIGxhYmVscywgY29sb3JlcywgdGlwb0dyYWZpY29JZCwgbWFya0xpbmVzKSB7CiAgICAgICAgbWFya0xpbmVzID0gbWFya0xpbmVzIHx8IFtdOwogICAgICAgIGNvbnN0IGNoYXJ0RG9tID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VjaGFydF8nICsgd2lkZ2V0SWQpOwogICAgICAgIGxldCBteUNoYXJ0ID0gZWNoYXJ0cy5nZXRJbnN0YW5jZUJ5RG9tKGNoYXJ0RG9tKTsKICAgICAgICBpZiAobXlDaGFydCkgbXlDaGFydC5kaXNwb3NlKCk7CiAgICAgICAgbXlDaGFydCA9IGVjaGFydHMuaW5pdChjaGFydERvbSk7CgogICAgICAgIGNvbnN0IGVjaGFydFR5cGUgPSBUSVBPU19HUkFGSUNPLmZpbmQoaXRlbSA9PiBpdGVtLmlkID09PSB0aXBvR3JhZmljb0lkKT8uZ3JhcGhpYzsKCiAgICAgICAgY29uc3QgeEF4aXNEYXRhID0gW107CgogICAgICAgIC8vIGNvbnN0IHNlcmllc0RhdGEgPSB5a2V5cy5tYXAoZnVuY3Rpb24oKSB7IHJldHVybiBbXTsgfSk7CiAgICAgICAgY29uc3Qgc2VyaWVzRGF0YSA9IHlrZXlzLm1hcCgoKSA9PiBbXSk7CgogICAgICAgIGRhdG9zLmZvckVhY2goZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICB4QXhpc0RhdGEucHVzaChpdGVtLmZlY2hhKTsKICAgICAgICAgICAgeWtleXMuZm9yRWFjaChmdW5jdGlvbih5a2V5LCBpKSB7CiAgICAgICAgICAgICAgICBzZXJpZXNEYXRhW2ldLnB1c2goaXRlbVt5a2V5XSAhPT0gdW5kZWZpbmVkID8gaXRlbVt5a2V5XSA6IG51bGwpOwogICAgICAgICAgICB9KTsKICAgICAgICB9KTsKCiAgICAgICAgY29uc3Qgc2VyaWVzRWNoYXJ0cyA9IHlrZXlzLm1hcChmdW5jdGlvbih5a2V5LCBpbmRleCkgewogICAgICAgICAgICBjb25zdCBzID0gewogICAgICAgICAgICAgICAgbmFtZTogbGFiZWxzW2luZGV4XSwKICAgICAgICAgICAgICAgIHR5cGU6IChlY2hhcnRUeXBlID09PSAnYXJlYScgfHwgZWNoYXJ0VHlwZSA9PT0gJ3N0ZXAnKSA/ICdsaW5lJyA6IGVjaGFydFR5cGUsCiAgICAgICAgICAgICAgICAvLyBjb25uZWN0TnVsbHM6IHRydWUsCiAgICAgICAgICAgICAgICBkYXRhOiAoZWNoYXJ0VHlwZSA9PT0gJ2dhdWdlJykgPwogICAgICAgICAgICAgICAgICAgICAgICBbeyB2YWx1ZTogc2VyaWVzRGF0YVtpbmRleF0uc2xpY2UoLTEpWzBdLCBuYW1lOiBsYWJlbHNbaW5kZXhdIH1dCiAgICAgICAgICAgICAgICAgICAgICAgIDogc2VyaWVzRGF0YVtpbmRleF0sCiAgICAgICAgICAgICAgICBpdGVtU3R5bGU6IHsgY29sb3I6IGNvbG9yZXNbaW5kZXhdIH0sCiAgICAgICAgICAgICAgICBzbW9vdGg6IChlY2hhcnRUeXBlICE9PSAnc3RlcCcpLAogICAgICAgICAgICAgICAgc3RlcDogKGVjaGFydFR5cGUgPT09ICdzdGVwJykgPyAnc3RhcnQnIDogZmFsc2UsCiAgICAgICAgICAgICAgICBhcmVhU3R5bGU6IChlY2hhcnRUeXBlID09PSAnYXJlYScpID8geyBvcGFjaXR5OiAwLjUgfSA6IHVuZGVmaW5lZCwKICAgICAgICAgICAgICAgIGNvbm5lY3ROdWxsczogdHJ1ZSwKICAgICAgICAgICAgICAgIHN5bWJvbFNpemU6IDYsCiAgICAgICAgICAgICAgICBzaG93U3ltYm9sOiAoZWNoYXJ0VHlwZSA9PT0gJ3NjYXR0ZXInKSwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKGluZGV4ID09PSAwICYmIG1hcmtMaW5lcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBzLm1hcmtMaW5lID0gewogICAgICAgICAgICAgICAgICAgIHNpbGVudDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBkYXRhOiBtYXJrTGluZXMKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0gcmV0dXJuIHM7CiAgICAgICAgfSk7CiAgICAgICAgY29uc3Qgb3B0aW9uID0gewogICAgICAgICAgICB0b29sdGlwOiB7CiAgICAgICAgICAgICAgICB0cmlnZ2VyOiAoZWNoYXJ0VHlwZSA9PT0gJ3NjYXR0ZXInKSA/ICdpdGVtJyA6ICdheGlzJywKICAgICAgICAgICAgICAgIGZvcm1hdHRlcjogZnVuY3Rpb24ocGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGh0bWwgPSAnJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBzdHlsZT0ibWFyZ2luLWJvdHRvbTo1cHg7Ij4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8YiBzdHlsZT0iZm9udC1zaXplOjE0cHg7Ij4nICsgcGFyYW1zWzBdLmF4aXNWYWx1ZSArICc8L2I+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JzsKICAgICAgICAgICAgICAgICAgICBwYXJhbXMuZm9yRWFjaChmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLnZhbHVlICE9PSBudWxsICYmIGl0ZW0udmFsdWUgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT0iZm9udC1zaXplOjEzcHg7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuOyI+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8c3Bhbj4nICsgaXRlbS5tYXJrZXIgKyAnICcgKyBpdGVtLnNlcmllc05hbWUgKyAnJm5ic3A7Jm5ic3A7PC9zcGFuPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGI+JyArIGl0ZW0udmFsdWUgKyAnPC9iPjwvZGl2Pic7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaHRtbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgbGVnZW5kOiB7IGRhdGE6IGxhYmVscywgdHlwZTogJ3Njcm9sbCcsIGJvdHRvbTogJzAlJywgaWNvbjogJ3JvdW5kUmVjdCcKICAgICAgICAgICAgfSwgZ3JpZDogeyBsZWZ0OiAnMiUnLCByaWdodDogJzQlJywgYm90dG9tOiAnMTIlJywgdG9wOiAnMTAlJywgY29udGFpbkxhYmVsOiB0cnVlCiAgICAgICAgICAgIH0sIHRvb2xib3g6IHsKICAgICAgICAgICAgICAgIGZlYXR1cmU6IHsKICAgICAgICAgICAgICAgICAgICBkYXRhWm9vbTogeyB5QXhpc0luZGV4OiAnbm9uZScsIHRpdGxlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgem9vbTogJ1pvb20nLCBiYWNrOiAnUmVzdGF1cmFyIFpvb20nIH19LAogICAgICAgICAgICAgICAgICAgIHJlc3RvcmU6IHsgdGl0bGU6ICdSZXN0YXVyYXInfSwKICAgICAgICAgICAgICAgICAgICBzYXZlQXNJbWFnZTogeyB0aXRsZTogJ0Rlc2NhcmdhciBJTUcnIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgeEF4aXM6IHsKICAgICAgICAgICAgICAgIHR5cGU6ICdjYXRlZ29yeScsCiAgICAgICAgICAgICAgICBib3VuZGFyeUdhcDogKGVjaGFydFR5cGUgPT09ICdiYXInKSwKICAgICAgICAgICAgICAgIGRhdGE6IHhBeGlzRGF0YSwKICAgICAgICAgICAgICAgIGF4aXNMYWJlbDogewogICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlcjogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vbWVudCh2YWx1ZSwgJ1lZWVktTU0tREQgSEg6bW06c3MnKS5mb3JtYXQoJ0REL01NL1lZIEhIOm1tJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB5QXhpczogeyB0eXBlOiAndmFsdWUnfSwKICAgICAgICAgICAgc2VyaWVzOiBzZXJpZXNFY2hhcnRzCiAgICAgICAgfTsgbXlDaGFydC5zZXRPcHRpb24ob3B0aW9uKTsKICAgIH0KCiAgICAvLyAtLSBUUkFUQU1JRU5UTyBERSBEQVRPUyAoIGhlcmVuY2lhIGRlIHRlc3QxICkgLS0tLS0tLS0KICAgIC8qKgogICAgICogQGJyaWVmIFBpcGVsaW5lIGRlIHByb2Nlc2FtaWVudG8sIG5vcm1hbGl6YWNpw7NuIHkgZnVzacOzbiBkZSBtw7psdGlwbGVzIHNlcmllcyBkZSBkYXRvcyB0ZW1wb3JhbGVzLgogICAgICoKICAgICAqIEBkZXRhaWxzIElkZW50aWZpY2EgY29tYmluYWNpb25lcyDDum5pY2FzIGRlIG9yaWdlbiwgYXNpZ25hIGNvbG9yZXMgbWVkaWFudGUgZ2VuZXJhclBhbGV0YURpc3RpbnRhIHkgYXBsaWNhIHVuCiAgICAgKiAgICAgICAgICBmbHVqbyBkZSB0cmFuc2Zvcm1hY2nDs25xdWUgaW5jbHV5ZSBub3JtYWxpemFjacOzbiBwb3IgaW50ZXJ2YWxvIHkgdHJhdGFtaWVudG8gZGUgaHVlY29zIChpbnRlcnBvbGFjacOzbiBhIGNlcm8pLgogICAgICogICAgICAgICAgQ29uc29saWRhIGxvcyBmbHVqb3MgaW5kZXBlbmRpZW50ZXMgZW4gdW4gc2V0IGRlIGRhdG9zIG11bHRpZGltZW5zaW9uYWwgcGFyYSBlbCBtb3RvciBncsOhZmljby4KICAgICAqCiAgICAgKiBAcGFyYW0ge09iamVjdFtdfSAgICAgICAgZGF0b3NCcnV0b3MgICAgIDogRGF0b3MgY3J1ZG9zIHJlY2liaWRvcyBkZWwgYmFja2VuZC4KICAgICAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgICB3aWRnZXRJZCAgICAgICAgOiBJZGVudGlmaWNhZG9yIGRlbCB3aWRnZXQgZGUgZGVzdGluby4KICAgICAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgICBpZFRpcG9TZWMgICAgICAgOiBJZCBkZWwgdGlwbyBzZWN1bmRhcmlvIHBhcmEgbG9hZF9zZWN1bmRhcmlvCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gICAgICAgICAgbm9tYnJlVGlwb1NlYyAgIDogTm9tYnJlIGRlIHRpcG9zZWMgZW1iZWJpZG8gcGFyYSBhaG9yYXIgYnVzcXVlZGEgZW4gYmFzZSBkZSBkYXRvcwogICAgICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgIGZlY2hhSW5pICAgICAgICA6IEZlY2hhIGluaWNpbyBkZSBidXNxdWVkYSwgcGFyYW1ldHJvIHBhcmEgbG9hZF9zZWN1bmRhcmlvCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gICAgICAgICAgZmVjaGFGaW4gICAgICAgIDogRmVjaGEgZmluIGRlIGJ1c3F1ZWRhLCBwYXJhbWV0cm8gcGFyYSBsb2FkX3NlY3VuZGFyaW8KICAgICAqIEBwYXJhbSB7aW50fSAgICAgICAgICAgICBpZEdyYWZpY28gICAgICAgOiBJZCDDum5pY28gZGVsIGdyYWZpY28KICAgICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gICBhZ3J1cGFjaW9uICAgICAgOiBJbnRlcnZhbG8gZGUgdGllbXBvIHBhcmEgbm9ybWFsaXphciAobWludXRvcy9zZWd1bmRvcykuCiAgICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9ICAgaHVlY29zICAgICAgICAgIDogVW1icmFsIG8gbcOpdG9kbyBwYXJhIHJlbGxlbmFyIHZhY8Otb3MgZGUgZGF0b3MuCiAgICAgKiBAcGFyYW0ge251bWJlcn0gICAgICAgICAgY3VzdG9tU2VndW5kb3MgIDogU2VndW5kb3MgcGVyc29uYWxpemFkb3Mgc2kgJ2h1ZWNvcycgZXMgJ2N1c3RvbScuCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlZmluYXJfZGF0b3MoZGF0b3NCcnV0b3MsIHdpZGdldElkLCBpZFRpcG9TZWMsIG5vbWJyZVRpcG9TZWMsIGZlY2hhSW5pLCBmZWNoYUZpbiwgaWRHcmFmaWNvLCBhZ3J1cGFjaW9uLCBodWVjb3MsIGN1c3RvbVNlZ3VuZG9zLCBzYXZlZFNlcmllcyA9IG51bGwpewogICAgICAgIC8vIC0tIENhbGN1bGFyIHVtYnJhbCBkZSBodWVjb3MgLS0tLS0tLS0KICAgICAgICB2YXIgbWF4R2FwU2VndW5kb3MgPSAwOwogICAgICAgIGlmIChodWVjb3MgPT09ICdjdXN0b20nKSB7CiAgICAgICAgICAgIG1heEdhcFNlZ3VuZG9zID0gcGFyc2VJbnQoY3VzdG9tU2VndW5kb3MpIHx8IDA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbWF4R2FwU2VndW5kb3MgPSBwYXJzZUludChodWVjb3MsIDEwKSB8fCAwOwogICAgICAgIH0KICAgICAgICB2YXIgc2VndW5kb3NJbnRlcnZhbG8gPSBvYnRlbmVyU2VndW5kb3NJbnRlcnZhbG8oYWdydXBhY2lvbik7CiAgICAgICAgdmFyIHVtYnJhbEZpbmFsID0gKG1heEdhcFNlZ3VuZG9zID4gMCkKICAgICAgICAgICAgPyBNYXRoLm1heChtYXhHYXBTZWd1bmRvcywgc2VndW5kb3NJbnRlcnZhbG8pCiAgICAgICAgICAgIDogMDsKCiAgICAgICAgLy8gLS0gQXV0by1kZXRlY3RhciBjb21iaW5hY2lvbmVzIMO6bmljYXMgcHJpbWFyaW8rc3RzIC0tCiAgICAgICAgdmFyIGNvbWJpbmFjaW9uZXMgPSB7fTsKICAgICAgICBkYXRvc0JydXRvcy5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHsKICAgICAgICAgICAgdmFyIGtleSA9IGl0ZW0ucHJpbWFyaW8gKyAnXycgKyBpdGVtLnN0czsKICAgICAgICAgICAgaWYgKCFjb21iaW5hY2lvbmVzW2tleV0pIHsKICAgICAgICAgICAgICAgIGNvbWJpbmFjaW9uZXNba2V5XSA9IHsgcHJpbWFyaW86IGl0ZW0ucHJpbWFyaW8sIHN0czogaXRlbS5zdHMgfTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHZhciBjb21iQXJyYXkgPSBPYmplY3QudmFsdWVzKGNvbWJpbmFjaW9uZXMpOwoKICAgICAgICB2YXIgcGFsZXRhQ29sb3JlcyA9IGdlbmVyYXJQYWxldGFEaXN0aW50YShjb21iQXJyYXkubGVuZ3RoKTsKICAgICAgICB2YXIgZGF0b3NDb21iaW5hZG9zID0ge307CiAgICAgICAgdmFyIGFycllLZXlzICAgPSBbXTsKICAgICAgICB2YXIgYXJyTGFiZWxzICA9IFtdOwogICAgICAgIHZhciBhcnJDb2xvcmVzID0gW107CgogICAgICAgIGNvbWJBcnJheS5mb3JFYWNoKGZ1bmN0aW9uKGNvbWIsIGluZGV4KSB7CiAgICAgICAgICAgIC8vIEZpbHRyYXIgZGF0b3MgZGUgZXN0YSBjb21iaW5hY2nDs24KICAgICAgICAgICAgdmFyIGRhdG9zQ29tYiA9IGRhdG9zQnJ1dG9zLmZpbHRlcihmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5wcmltYXJpbyA9PSBjb21iLnByaW1hcmlvICYmIGl0ZW0uc3RzID09IGNvbWIuc3RzOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHZhciBzZXJpZUtleSA9ICdzZXJpZV8nICsgaW5kZXg7CiAgICAgICAgICAgIGFycllLZXlzLnB1c2goc2VyaWVLZXkpOwogICAgICAgICAgICAvLyBhcnJMYWJlbHMucHVzaCgnUHJpbS4nICsgY29tYi5wcmltYXJpbyArICcgLyBTdHMuJyArIGNvbWIuc3RzKTsKICAgICAgICAgICAgYXJyTGFiZWxzLnB1c2goY29tYi5wcmltYXJpbyArICcgLyAnICsgY29tYi5zdHMpOwogICAgICAgICAgICBhcnJDb2xvcmVzLnB1c2gocGFsZXRhQ29sb3Jlc1tpbmRleCAlIHBhbGV0YUNvbG9yZXMubGVuZ3RoXSk7CgogICAgICAgICAgICAvLyBQaXBlbGluZTogZm9ybWF0ZWFyIOKGkiBub3JtYWxpemFyIOKGkiBvcmRlbmFyIOKGkiByZWxsZW5vIGh1ZWNvcwogICAgICAgICAgICB2YXIgZm9ybWF0ZWFkb3MgID0gdHJhdGFyX2RhdG9zKGRhdG9zQ29tYik7CiAgICAgICAgICAgIHZhciBub3JtYWxpemFkb3MgPSBub3JtYWxpemFyRGF0b3NQb3JUaWVtcG8oZm9ybWF0ZWFkb3MsIGFncnVwYWNpb24pOwoKICAgICAgICAgICAgbm9ybWFsaXphZG9zLnNvcnQoZnVuY3Rpb24oYSwgYikgewogICAgICAgICAgICAgICAgcmV0dXJuIGEuZmVjaGEubG9jYWxlQ29tcGFyZShiLmZlY2hhKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAodW1icmFsRmluYWwgPiAwKSB7CiAgICAgICAgICAgICAgICBub3JtYWxpemFkb3MgPSByZWxsZW5hckh1ZWNvc0NvbkNlcm8obm9ybWFsaXphZG9zLCB1bWJyYWxGaW5hbCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEZ1c2lvbmFyIGVuIG1hcGEgZGUgZmVjaGEg4oaSIHsgZmVjaGEsIHNlcmllXzAsIHNlcmllXzEsIOKApiB9CiAgICAgICAgICAgIG5vcm1hbGl6YWRvcy5mb3JFYWNoKGZ1bmN0aW9uKHB1bnRvKSB7CiAgICAgICAgICAgICAgICBpZiAoIWRhdG9zQ29tYmluYWRvc1twdW50by5mZWNoYV0pIHsKICAgICAgICAgICAgICAgICAgICBkYXRvc0NvbWJpbmFkb3NbcHVudG8uZmVjaGFdID0geyBmZWNoYTogcHVudG8uZmVjaGEgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRhdG9zQ29tYmluYWRvc1twdW50by5mZWNoYV1bc2VyaWVLZXldID0gcHVudG8udmFsb3I7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwoKICAgICAgICAvLyAtLSBDb252ZXJ0aXIgYSBhcnJheSB5IG9yZGVuYXIgLS0tLS0tLS0KICAgICAgICB2YXIgZGF0b3NGaW5hbGVzID0gT2JqZWN0LnZhbHVlcyhkYXRvc0NvbWJpbmFkb3MpOwogICAgICAgIGRhdG9zRmluYWxlcy5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICAgICAgcmV0dXJuIG1vbWVudChhLmZlY2hhLCAnWVlZWS1NTS1ERCBISDptbTpzcycpCiAgICAgICAgICAgICAgICAuZGlmZihtb21lbnQoYi5mZWNoYSwgJ1lZWVktTU0tREQgSEg6bW06c3MnKSk7CiAgICAgICAgfSk7CgogICAgICAgIGlmIChkYXRvc0ZpbmFsZXMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICQoJyNlY2hhcnRfJyArIHdpZGdldElkKS5odG1sKAogICAgICAgICAgICAgICAgJzxwIGNsYXNzPSJ0ZXh0LXdhcm5pbmcgdGV4dC1jZW50ZXIgdy0xMDAiPjxpIGNsYXNzPSJmYSBmYS1leGNsYW1hdGlvbi10cmlhbmdsZSI+PC9pPiBTaW4gZGF0b3MgdHJhcyBwcm9jZXNhci48L3A+JwogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfQoKICAgICAgICBwb2JsYXJTZXJpZXNXaWRnZXQod2lkZ2V0SWQsIGRhdG9zRmluYWxlcywgYXJyWUtleXMsIGFyckxhYmVscywgYXJyQ29sb3JlcywgaWRHcmFmaWNvLCBzYXZlZFNlcmllcyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAYnJpZWYgU2luY3Jvbml6YSBsYSBjYWNow6kgZGUgZGF0b3MgZGVsIHdpZGdldCB5IGFjdHVhbGl6YSBsb3Mgc2VsZWN0b3JlcyBkZSBjb250cm9sIGRlIGxhIGludGVyZmF6LgogICAgICoKICAgICAqIEBkZXRhaWxzIFBlcnNpc3RlIGVsIGVzdGFkbyBkZSBsYXMgc2VyaWVzIGVuIGB3aWRnZXREYXRhQ2FjaGVgIHBhcmEgcGVybWl0aXIgcmVkaWJ1amFkb3MgcsOhcGlkb3Mgc2luIHJlLXByb2Nlc2FyIGRhdG9zLgogICAgICogICAgICAgICAgQWxpbWVudGEgZGluw6FtaWNhbWVudGUgbG9zIG1lbsO6cyBkZSBzZWxlY2Npw7NuIGRlIHNlcmllcyB5IGdlc3Rpb25hIGxhIHZpc2liaWxpZGFkIGRlIGxvcyBlc3RhZG9zIHZhY8Otb3MKICAgICAqICAgICAgICAgIGJhc8OhbmRvc2UgZW4gbGEgZGlzcG9uaWJpbGlkYWQgZGUgbnVldm9zIGRhdG9zIHByb2Nlc2Fkb3MuCiAgICAgKgogICAgICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgIHdpZGdldElkICAgICAgICA6IElEIGRlbCB3aWRnZXQgYSBhY3R1YWxpemFyLgogICAgICogQHBhcmFtIHtPYmplY3RbXX0gICAgICAgIGRhdG9zICAgICAgICAgICA6IFNldCBkZSBkYXRvcyBwcm9jZXNhZG9zLgogICAgICogQHBhcmFtIHtzdHJpbmdbXX0gICAgICAgIHlrZXlzICAgICAgICAgICA6IENsYXZlcyBkZSBsYXMgc2VyaWVzLgogICAgICogQHBhcmFtIHtzdHJpbmdbXX0gICAgICAgIGxhYmVscyAgICAgICAgICA6IEV0aXF1ZXRhcyB2aXNpYmxlcyBwYXJhIGVsIHVzdWFyaW8uCiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSAgICAgICAgY29sb3JlcyAgICAgICAgIDogUGFsZXRhIGRlIGNvbG9yZXMgYXBsaWNhZGEuCiAgICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9ICAgdGlwb0dyYWZpY29JZCAgIDogSUQgZGVsIHRpcG8gZGUgZ3LDoWZpY28gc2VsZWNjaW9uYWRvLgogICAgICogQHBhcmFtIHNhdmVkU2VyaWVzCiAgICAgKi8KICAgIGZ1bmN0aW9uIHBvYmxhclNlcmllc1dpZGdldCh3aWRnZXRJZCwgZGF0b3MsIHlrZXlzLCBsYWJlbHMsIGNvbG9yZXMsIHRpcG9HcmFmaWNvSWQsIHNhdmVkU2VyaWVzID0gbnVsbCkgewogICAgICAgIHdpZGdldERhdGFDYWNoZVt3aWRnZXRJZF0gPSB7IGRhdG9zOiBkYXRvcywgeWtleXM6IHlrZXlzLCBsYWJlbHM6IGxhYmVscywgY29sb3JlczogY29sb3JlcywgdGlwb0dyYWZpY29JZDogU3RyaW5nKHRpcG9HcmFmaWNvSWQpIH07CgogICAgICAgIGNvbnN0ICR3aWRnZXQgPSAkKCcjJyArIHdpZGdldElkKTsKICAgICAgICBjb25zdCAkc2VsZWN0ID0gJHdpZGdldC5maW5kKCcuc2VsZWN0LXNlcmllLWRpc3BvbmlibGUnKTsKCiAgICAgICAgLy8gMS4gUmVzY2F0YXIgbG9zIG5vbWJyZXMgZGUgbGFzIHNlcmllcyBxdWUgZWwgdXN1YXJpbyB0ZW7DrWEgYWN0aXZhZGFzCiAgICAgICAgdmFyIGV0aXF1ZXRhc0FjdGl2YXMgPSBzYXZlZFNlcmllcyAhPT0gbnVsbAogICAgICAgICAgICAgICAgPyBzYXZlZFNlcmllcwogICAgICAgICAgICAgICAgOiAkd2lkZ2V0LmZpbmQoJy5ncy1zZXJpZS10YWcnKS5tYXAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQodGhpcykuY29udGVudHMoKS5maWx0ZXIoZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLm5vZGVUeXBlID09PSAzOyB9KS50ZXh0KCkudHJpbSgpOwogICAgICAgICAgICAgICAgfSkuZ2V0KCk7CgogICAgICAgIC8vIDIuIExpbXBpYXIgZXRpcXVldGFzIHZpZWphcyB5IHNlbGVjdG9yCiAgICAgICAgJHdpZGdldC5maW5kKCcuZ3Mtc2VyaWVzLXRhZ3MnKS5lbXB0eSgpOwogICAgICAgICRzZWxlY3QuZW1wdHkoKS5hcHBlbmQoJzxvcHRpb24gdmFsdWU9IiI+4oCUIEHDsWFkaXIgc2VyaWUg4oCUPC9vcHRpb24+Jyk7CgogICAgICAgIC8vIDMuIFZvbHZlciBhIHBvYmxhci4gU2kgbGEgc2VyaWUgeWEgZXN0YWJhIGFjdGl2YSBhbnRlcywgbGEgdm9sdmVtb3MgYSBhw7FhZGlyIGF1dG9tw6F0aWNhbWVudGUKICAgICAgICBsYWJlbHMuZm9yRWFjaChmdW5jdGlvbihsYWJlbCwgaSkgewogICAgICAgICAgICAkc2VsZWN0LmFwcGVuZCgnPG9wdGlvbiB2YWx1ZT0iJyArIGkgKyAnIj4nICsgbGFiZWwgKyAnPC9vcHRpb24+Jyk7CiAgICAgICAgICAgIGlmIChldGlxdWV0YXNBY3RpdmFzLmluY2x1ZGVzKGxhYmVsKSkgewogICAgICAgICAgICAgICAgJHdpZGdldC5maW5kKCcuZ3Mtc2VyaWVzLXRhZ3MnKS5hcHBlbmQoCiAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0iZ3Mtc2VyaWUtdGFnIiBkYXRhLWluZGV4PSInICsgaSArICciPicgKyBsYWJlbCArICcgPGkgY2xhc3M9ImZhIGZhLXRpbWVzIGJ0bi1yZW1vdmUtc2VyaWUiPjwvaT48L3NwYW4+JwogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICAvLyA0LiBMaW1waWFyIGVsIHRleHRvIGRlICJDYXJnYW5kby4uLiIKICAgICAgICAkKCcjZWNoYXJ0XycgKyB3aWRnZXRJZCkuZW1wdHkoKTsKCiAgICAgICAgLy8gNS4gRm9yemFtb3MgZWwgcmVuZGVyaXphZG8gYmFzw6FuZG9ub3MgZW4gbG9zIGRhdG9zIHJlYWxlcwogICAgICAgIHJlbmRlcml6YXJTZXJpZXNXaWRnZXQod2lkZ2V0SWQpOwogICAgfQoKICAgIC8qKgogICAgICogQGJyaWVmIEdlc3Rpb25hIGVsIHJlbmRlcml6YWRvIGRpbsOhbWljbyBkZSBzZXJpZXMgeSB1bWJyYWxlcyBlbiBncsOhZmljb3MgRUNoYXJ0cy4KICAgICAqCiAgICAgKiBAZGV0YWlscyBDb250cm9sYSBsYSB2aXNpYmlsaWRhZCBkZWwgZ3LDoWZpY28gbWVkaWFudGUgdW4gc2lzdGVtYSBkZSBldGlxdWV0YXMgKHRhZ3MpIHkgb3ZlcmxheXMgaW5mb3JtYXRpdm9zLgogICAgICogICAgICAgICAgRmlsdHJhIGxhcyBzZXJpZXMgYWN0aXZhcyBkZXNkZSBsYSBjYWNow6kgc2Vnw7puIGxhIGludGVyYWNjacOzbiBkZWwgdXN1YXJpbyB5IGNhbGN1bGEgbMOtbmVhcyBkZSB1bWJyYWwKICAgICAqICAgICAgICAgIGRpbsOhbWljYXMgKG3DoXhpbW8vbcOtbmltbykgYmFzYWRhcyBlbiBpbnB1dHMgZGUgbGEgaW50ZXJmYXouIEZpbmFsaXphIGRlc3RydXllbmRvIGluc3RhbmNpYXMgaHXDqXJmYW5hcwogICAgICogICAgICAgICAgbyByZWRpYnVqYW5kbyBlbCBjb21wb25lbnRlIGNvbiBsb3MgZGF0b3MgYWN0dWFsaXphZG9zLgogICAgICoKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB3aWRnZXRJZCA6IElEIMO6bmljbyBkZWwgY29udGVuZWRvciBkZWwgd2lkZ2V0IGEgcHJvY2VzYXIuCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlbmRlcml6YXJTZXJpZXNXaWRnZXQod2lkZ2V0SWQpIHsKICAgICAgICB2YXIgY2FjaGUgPSB3aWRnZXREYXRhQ2FjaGVbd2lkZ2V0SWRdOwogICAgICAgIGlmICghY2FjaGUpIHJldHVybjsKCiAgICAgICAgdmFyICR3aWRnZXQgID0gJCgnIycgKyB3aWRnZXRJZCk7CiAgICAgICAgdmFyICR0YWdzICAgID0gJHdpZGdldC5maW5kKCcuZ3Mtc2VyaWUtdGFnJyk7CiAgICAgICAgdmFyICRvdmVybGF5ID0gJHdpZGdldC5maW5kKCcuZ3Mtbm8tc2VyaWVzLW92ZXJsYXknKTsKCiAgICAgICAgaWYgKCR0YWdzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAkb3ZlcmxheS5zaG93KCk7CiAgICAgICAgICAgIHZhciBjaGFydERvbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlY2hhcnRfJyArIHdpZGdldElkKTsKICAgICAgICAgICAgaWYgKGNoYXJ0RG9tKSB7IHZhciBpbnN0ID0gZWNoYXJ0cy5nZXRJbnN0YW5jZUJ5RG9tKGNoYXJ0RG9tKTsgaWYgKGluc3QpIGluc3QuZGlzcG9zZSgpOyB9CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICRvdmVybGF5LmhpZGUoKTsKCiAgICAgICAgLy8gw41uZGljZXMgZGUgc2VyaWVzIGFjdGl2YXMKICAgICAgICB2YXIgaW5kaWNlcyA9IFtdOwogICAgICAgICR0YWdzLmVhY2goZnVuY3Rpb24oKSB7IGluZGljZXMucHVzaChwYXJzZUludCgkKHRoaXMpLmRhdGEoJ2luZGV4JykpKTsgfSk7CgogICAgICAgIHZhciB5a2V5c0FjdGl2b3MgID0gaW5kaWNlcy5tYXAoZnVuY3Rpb24oaSkgeyByZXR1cm4gY2FjaGUueWtleXNbaV07IH0pOwogICAgICAgIHZhciBsYWJlbHNBY3Rpdm9zID0gaW5kaWNlcy5tYXAoZnVuY3Rpb24oaSkgeyByZXR1cm4gY2FjaGUubGFiZWxzW2ldOyB9KTsKICAgICAgICB2YXIgY29sb3Jlc0FjdGl2b3MgPSBpbmRpY2VzLm1hcChmdW5jdGlvbihpKSB7IHJldHVybiBjYWNoZS5jb2xvcmVzW2ldOyB9KTsKCiAgICAgICAgLy8gVW1icmFsZXMKICAgICAgICB2YXIgdmFsTWF4ID0gcGFyc2VGbG9hdCgkd2lkZ2V0LmZpbmQoJy5pbnB1dC11bWJyYWwtbWF4JykudmFsKCkpOwogICAgICAgIHZhciB2YWxNaW4gPSBwYXJzZUZsb2F0KCR3aWRnZXQuZmluZCgnLmlucHV0LXVtYnJhbC1taW4nKS52YWwoKSk7CiAgICAgICAgdmFyIG1hcmtMaW5lcyA9IFtdOwogICAgICAgIGlmICghaXNOYU4odmFsTWF4KSkgbWFya0xpbmVzLnB1c2goeyB5QXhpczogdmFsTWF4LCBuYW1lOiAnTcOheCcsIGxpbmVTdHlsZTogeyBjb2xvcjogJyNkYzM1NDUnLCB0eXBlOiAnZGFzaGVkJywgd2lkdGg6IDEgfSwgbGFiZWw6IHsgZm9ybWF0dGVyOiAnTcOheDogJyArIHZhbE1heCwgcG9zaXRpb246ICdlbmQnLCBjb2xvcjogJyNkYzM1NDUnIH0gfSk7CiAgICAgICAgaWYgKCFpc05hTih2YWxNaW4pKSBtYXJrTGluZXMucHVzaCh7IHlBeGlzOiB2YWxNaW4sIG5hbWU6ICdNw61uJywgbGluZVN0eWxlOiB7IGNvbG9yOiAnIzI4YTc0NScsIHR5cGU6ICdkYXNoZWQnLCB3aWR0aDogMSB9LCBsYWJlbDogeyBmb3JtYXR0ZXI6ICdNw61uOiAnICsgdmFsTWluLCBwb3NpdGlvbjogJ2VuZCcsIGNvbG9yOiAnIzI4YTc0NScgfSB9KTsKCiAgICAgICAgZGlidWphckVjaGFydFdpZGdldCh3aWRnZXRJZCwgY2FjaGUuZGF0b3MsIHlrZXlzQWN0aXZvcywgbGFiZWxzQWN0aXZvcywgY29sb3Jlc0FjdGl2b3MsIGNhY2hlLnRpcG9HcmFmaWNvSWQsIG1hcmtMaW5lcyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAYnJpZWYgTm9ybWFsaXphIGVsIGZvcm1hdG8gZGUgZmVjaGEgeSBjb252aWVydGUgdmFsb3IgYSBmbG9hdAogICAgICoKICAgICAqIEBwYXJhbSB7YXJyYXl9ICAgZGF0b3NSZWdsYSA6IGRhdG9zIGEgdHJhdGFyCiAgICAgKgogICAgICogQHJldHVybiB7YXJyYXl9ICBkYXRvcyA6IGRhdG9zIGZvcm1hdGVhZG9zIGFsIGd1c3RvCiAgICAgKi8KICAgIGZ1bmN0aW9uIHRyYXRhcl9kYXRvcyhkYXRvc1JlZ2xhKSB7CiAgICAgICAgcmV0dXJuIGRhdG9zUmVnbGEubWFwKGZ1bmN0aW9uKGl0ZW0pIHsKICAgICAgICAgICAgdmFyIGZlY2hhQ29ycmVnaWRhID0gaXRlbS5mZWNoYTsKICAgICAgICAgICAgLy8gQ29ycmVnaXIgZm9ybWF0byBZWVlZOk1NOkREIOKGkiBZWVlZLU1NLUREIHNpIGVzIG5lY2VzYXJpbwogICAgICAgICAgICBpZiAoZmVjaGFDb3JyZWdpZGEuaW5kZXhPZignOicpID09PSA0KSB7CiAgICAgICAgICAgICAgICB2YXIgcGFydGVzICAgPSBmZWNoYUNvcnJlZ2lkYS5zcGxpdCgnICcpOwogICAgICAgICAgICAgICAgdmFyIGZlY2hhU29sbyA9IHBhcnRlc1swXS5yZXBsYWNlKC86L2csICctJyk7CiAgICAgICAgICAgICAgICBmZWNoYUNvcnJlZ2lkYSA9IGZlY2hhU29sbyArICcgJyArIChwYXJ0ZXNbMV0gfHwgJzAwOjAwOjAwJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGZlY2hhOiBmZWNoYUNvcnJlZ2lkYSwKICAgICAgICAgICAgICAgIHZhbG9yOiBwYXJzZUZsb2F0KGl0ZW0udmFsb3IpCiAgICAgICAgICAgIH07CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAYnJpZWYgQWdydXBhIHBvciBpbnRlcnZhbG8gZGUgdGllbXBvIGNhbGN1bGFuZG8gbGEgbWVkaWFuYSBkZSBjYWRhIGJsb3F1ZQogICAgICoKICAgICAqIEBwYXJhbSB7YXJyYXl9ICAgZGF0b3MgOiBkYXRvcyBhIG5vcm1hbGl6YXIKICAgICAqIEBwYXJhbSB7c3RyaW5nfSAgaW50ZXJ2YWxvIDogZW4gcXVlIHRpZW1wbyBzZSBhZ3J1cGEKICAgICAqCiAgICAgKiBAcmV0dXJuIHthcnJheX0gOiBkYXRvcyBjb24gZWwgaW50ZXJ2YWxvIGFwbGljYWRvICggZWwgbWlzbW8gZW4gY2FzbyBkZSBpbnRlcnZhbG8gPSBub25lCiAgICAgKi8KICAgIGZ1bmN0aW9uIG5vcm1hbGl6YXJEYXRvc1BvclRpZW1wbyhkYXRvcywgaW50ZXJ2YWxvKSB7CiAgICAgICAgaWYgKGludGVydmFsbyA9PT0gJ25vbmUnIHx8ICFpbnRlcnZhbG8pIHJldHVybiBkYXRvczsKCiAgICAgICAgdmFyIGFncnVwYWRvcyA9IHt9OwoKICAgICAgICBkYXRvcy5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHsKICAgICAgICAgICAgdmFyIG0gPSBtb21lbnQoaXRlbS5mZWNoYSwgJ1lZWVktTU0tREQgSEg6bW06c3MnKTsKICAgICAgICAgICAgaWYgKCFtLmlzVmFsaWQoKSkgcmV0dXJuOwoKICAgICAgICAgICAgdmFyIGNsYXZlRmVjaGEgPSAnJzsKICAgICAgICAgICAgc3dpdGNoIChpbnRlcnZhbG8pIHsKICAgICAgICAgICAgICAgIGNhc2UgJ21pbnV0ZSc6IGNsYXZlRmVjaGEgPSBtLnN0YXJ0T2YoJ21pbnV0ZScpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbTowMCcpOyBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ2hvdXInOiAgIGNsYXZlRmVjaGEgPSBtLnN0YXJ0T2YoJ2hvdXInKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW06MDAnKTsgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ2hvdXI2JzoKICAgICAgICAgICAgICAgICAgICB2YXIgaDYgPSBNYXRoLmZsb29yKG0uaG91cigpIC8gNikgKiA2OwogICAgICAgICAgICAgICAgICAgIGNsYXZlRmVjaGEgPSBtLmhvdXIoaDYpLnN0YXJ0T2YoJ2hvdXInKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW06MDAnKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ2hvdXIxMic6CiAgICAgICAgICAgICAgICAgICAgdmFyIGgxMiA9IE1hdGguZmxvb3IobS5ob3VyKCkgLyAxMikgKiAxMjsKICAgICAgICAgICAgICAgICAgICBjbGF2ZUZlY2hhID0gbS5ob3VyKGgxMikuc3RhcnRPZignaG91cicpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbTowMCcpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnZGF5JzogICBjbGF2ZUZlY2hhID0gbS5zdGFydE9mKCdkYXknKS5mb3JtYXQoJ1lZWVktTU0tREQnKTsgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICd3ZWVrJzogIGNsYXZlRmVjaGEgPSBtLnN0YXJ0T2YoJ2lzb1dlZWsnKS5mb3JtYXQoJ1lZWVktTU0tREQnKTsgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ21vbnRoJzogY2xhdmVGZWNoYSA9IG0uc3RhcnRPZignbW9udGgnKS5mb3JtYXQoJ1lZWVktTU0tREQnKTsgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWFncnVwYWRvc1tjbGF2ZUZlY2hhXSkgYWdydXBhZG9zW2NsYXZlRmVjaGFdID0geyB2YWxvcmVzOiBbXSB9OwogICAgICAgICAgICBhZ3J1cGFkb3NbY2xhdmVGZWNoYV0udmFsb3Jlcy5wdXNoKGl0ZW0udmFsb3IpOwogICAgICAgIH0pOwoKICAgICAgICB2YXIgcmVzdWx0YWRvID0gW107CiAgICAgICAgZm9yICh2YXIgZmVjaGEgaW4gYWdydXBhZG9zKSB7CiAgICAgICAgICAgIHZhciB2YWxvcmVzID0gYWdydXBhZG9zW2ZlY2hhXS52YWxvcmVzLnNvcnQoZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gYSAtIGI7IH0pOwogICAgICAgICAgICB2YXIgbWl0YWQgICA9IE1hdGguZmxvb3IodmFsb3Jlcy5sZW5ndGggLyAyKTsKICAgICAgICAgICAgdmFyIG1lZGlhbmEgPSAodmFsb3Jlcy5sZW5ndGggJSAyICE9PSAwKQogICAgICAgICAgICAgICAgPyB2YWxvcmVzW21pdGFkXQogICAgICAgICAgICAgICAgOiAodmFsb3Jlc1ttaXRhZCAtIDFdICsgdmFsb3Jlc1ttaXRhZF0pIC8gMi4wOwoKICAgICAgICAgICAgcmVzdWx0YWRvLnB1c2goeyBmZWNoYTogZmVjaGEsIHZhbG9yOiBwYXJzZUZsb2F0KG1lZGlhbmEudG9GaXhlZCgyKSkgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHRhZG87CiAgICB9CgogICAgLyoqCiAgICAgKiBAYnJpZWYgUmVsbGVuYSBjb24gdmFsb3IgMCBsb3MgaHVlY29zIG1heW9yZXMgYWwgdW1icmFsIGluZGljYWRvCiAgICAgKgogICAgICogQHBhcmFtIHthcnJheX0gICBkYXRvcyA6IGRhdG9zIGRlIHNlY3VuZGFyaW9zCiAgICAgKiBAcGFyYW0ge2ludH0gICAgIHVtYnJhbFNlZ3VuZG9zIDogdW1icmFsIGRlIHNlZ3VuZG9zIGEgYXBsaWNhcgogICAgICoKICAgICAqIEByZXR1cm4ge2FycmF5fSBudWV2YSBhcnJheSByZWxsZW5hCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlbGxlbmFySHVlY29zQ29uQ2VybyhkYXRvcywgdW1icmFsU2VndW5kb3MpIHsKICAgICAgICBpZiAoIWRhdG9zIHx8IGRhdG9zLmxlbmd0aCA8IDIpIHJldHVybiBkYXRvczsKCiAgICAgICAgdmFyIHJlc3VsdGFkbyAgPSBbXTsKICAgICAgICB2YXIgbW9tQWN0dWFsICA9IG1vbWVudChkYXRvc1swXS5mZWNoYSwgJ1lZWVktTU0tREQgSEg6bW06c3MnKTsKCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRvcy5sZW5ndGggLSAxOyBpKyspIHsKICAgICAgICAgICAgdmFyIGFjdHVhbCAgICA9IGRhdG9zW2ldOwogICAgICAgICAgICB2YXIgc2lndWllbnRlID0gZGF0b3NbaSArIDFdOwoKICAgICAgICAgICAgcmVzdWx0YWRvLnB1c2goYWN0dWFsKTsKCiAgICAgICAgICAgIHZhciBtb21TaWcgICA9IG1vbWVudChzaWd1aWVudGUuZmVjaGEsICdZWVlZLU1NLUREIEhIOm1tOnNzJyk7CiAgICAgICAgICAgIHZhciBkaWZmU2VnICA9IG1vbVNpZy5kaWZmKG1vbUFjdHVhbCwgJ3NlY29uZHMnKTsKCiAgICAgICAgICAgIGlmIChkaWZmU2VnID4gdW1icmFsU2VndW5kb3MpIHsKICAgICAgICAgICAgICAgIHZhciBpdGVyYWRvciA9IG1vbUFjdHVhbC5jbG9uZSgpLmFkZCh1bWJyYWxTZWd1bmRvcywgJ3NlY29uZHMnKTsKICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyYWRvci5pc0JlZm9yZShtb21TaWcpKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0YWRvLnB1c2goeyBmZWNoYTogaXRlcmFkb3IuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tOnNzJyksIHZhbG9yOiAwIH0pOwogICAgICAgICAgICAgICAgICAgIGl0ZXJhZG9yLmFkZCh1bWJyYWxTZWd1bmRvcywgJ3NlY29uZHMnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbW9tQWN0dWFsID0gbW9tU2lnOyAvLyBlbCBzaWd1aWVudGUgc2UgY29udmllcnRlIGVuIGVsIGFjdHVhbAogICAgICAgIH0KCiAgICAgICAgcmVzdWx0YWRvLnB1c2goZGF0b3NbZGF0b3MubGVuZ3RoIC0gMV0pOwogICAgICAgIHJldHVybiByZXN1bHRhZG87CiAgICB9CgogICAgLyoqCiAgICAgKiBAYnJpZWYgRGV2dWVsdmUgbG9zIHNlZ3VuZG9zIHF1ZSBjb3JyZXNwb25kZW4gYSBjYWRhIGludGVydmFsbyBkZSBhZ3J1cGFjacOzbgogICAgICoKICAgICAqIEBwYXJhbSB7c3RyaW5nfSAgaW50ZXJ2YWxvICAgOiBpbmRpY2EgZWwgaW50ZXJ2YWxvIHBhcmEgcGFzYXJsbyBhIHNlZ3VuZG9zCiAgICAgKiBAcmV0dXJuIHtpbnR9ICAgIGludGVydmFsbyBlbiBzZWd1bmRvcwogICAgICovCiAgICBmdW5jdGlvbiBvYnRlbmVyU2VndW5kb3NJbnRlcnZhbG8oaW50ZXJ2YWxvKSB7CiAgICAgICAgc3dpdGNoIChpbnRlcnZhbG8pIHsKICAgICAgICAgICAgY2FzZSAnbWludXRlJzogcmV0dXJuIDYwOwogICAgICAgICAgICBjYXNlICdob3VyJzogICByZXR1cm4gMzYwMDsKICAgICAgICAgICAgY2FzZSAnaG91cjYnOiAgcmV0dXJuIDIxNjAwOwogICAgICAgICAgICBjYXNlICdob3VyMTInOiByZXR1cm4gNDMyMDA7CiAgICAgICAgICAgIGNhc2UgJ2RheSc6ICAgIHJldHVybiA4NjQwMDsKICAgICAgICAgICAgY2FzZSAnd2Vlayc6ICAgcmV0dXJuIDYwNDgwMDsKICAgICAgICAgICAgY2FzZSAnbW9udGgnOiAgcmV0dXJuIDI1OTIwMDA7CiAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBicmllZiBHZW5lcmEgdW5hIHBhbGV0YSBkZSBOIGNvbG9yZXMgZGlzdGludG9zIHkgcGVyY2VwdHVhbG1lbnRlIHNlcGFyYWRvcwogICAgICogQGRldGFpbHMgR2VuZXJhIHVuYSBwYWxldGEgZGUgY29sb3JlcyBtZWRpYW50ZSBlbCDDoW5ndWxvIMOhdXJlbyBtYXhpbWl6YW5kbyBsYSBkaXN0YW5jaWEKICAgICAqICAgICAgICAgICBhbmd1bGFyIGVuIGVsIGPDrXJjdWxvIGNyb23DoXRpY28gcGFyYSBldml0YXIgY29sb3JlcyBzaW1pbGFyZXMuIENvbWJpbmEgdmFyaWFjaW9uZXMKICAgICAqICAgICAgICAgICBjw61jbGljYXMgZGUgc2F0dXJhY2nDs24geSBsdW1pbm9zaWRhZCBwYXJhIGdhcmFudGl6YXIgdW5hIGRpZmVyZW5jaWFjacOzbiB2aXN1YWwKICAgICAqICAgICAgICAgICDDs3B0aW1hIGVuIGludGVyZmFjZXMgeSBncsOhZmljb3MuCiAgICAgKgogICAgICogQHBhcmFtIHtpbnR9IGNhbnRpZGFkIDogY2FudGlkYWQgZGUgY29sb3JlcyBhIGdlbmVyYXIKICAgICAqIEByZXR1cm4ge2FycmF5fSBjb2xvcmVzIGdlbmVyYWRvcwogICAgICovCiAgICBmdW5jdGlvbiBnZW5lcmFyUGFsZXRhRGlzdGludGEoY2FudGlkYWQpIHsKICAgICAgICBjb25zdCBjb2xvcmVzICAgID0gW107CiAgICAgICAgY29uc3QgaHVlQmFzZSAgICA9IDE4MDsgICAgIC8vIGFycmFuY2EgZW4gY2lhbiwgem9uYSBuZXV0cmEKICAgICAgICBjb25zdCBwYXNvQXVyZW8gID0gMTM3LjUwODsgLy8gw6FuZ3VsbyDDoXVyZW8g4oaSIG3DoXhpbWEgc2VwYXJhY2nDs24gcGVyY2VwdHVhbAogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2FudGlkYWQ7IGkrKykgewogICAgICAgICAgICBjb25zdCBoID0gKGh1ZUJhc2UgKyBpICogcGFzb0F1cmVvKSAlIDM2MDsKICAgICAgICAgICAgY29uc3QgcyA9IDcyICsgKGkgJSAzKSAqIDg7ICAvLyA3MiAvIDgwIC8gODgKICAgICAgICAgICAgY29uc3QgbCA9IDQ1ICsgKGkgJSAyKSAqIDg7ICAvLyA0NSAvIDUzCiAgICAgICAgICAgIGNvbG9yZXMucHVzaChoc2xUb0hleChoLCBzLCBsKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjb2xvcmVzOwogICAgfQoKICAgIC8qKgogICAgICogQGJyaWVmIENvbnZpZXJ0ZSBIU0wgYSBjb2xvciBoZXhhZGVjaW1hbCAjUlJHR0JCCiAgICAgKgogICAgICogQHBhcmFtIHtpbnR9IGggOiBodWUgLyB0b25vCiAgICAgKiBAcGFyYW0ge2ludH0gcyA6IHNhdHVyYXRpb24gLyBzYXR1cmFjaW9uCiAgICAgKiBAcGFyYW0ge2ludH0gbCA6IGxpZ2h0bmVzcyAvIGx1bWlub3NpZGFkCiAgICAgKgogICAgICogQHJldHVybnMge3N0cmluZ30gOiBjb2RpZ28gaGV4YWRlY2ltYWwgY29ycmVzcG9uZGllbnRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGhzbFRvSGV4KGgsIHMsIGwpIHsKICAgICAgICBsIC89IDEwMDsKICAgICAgICB2YXIgYSA9IHMgKiBNYXRoLm1pbihsLCAxIC0gbCkgLyAxMDA7CiAgICAgICAgdmFyIGYgPSBmdW5jdGlvbihuKSB7CiAgICAgICAgICAgIHZhciBrICAgICA9IChuICsgaCAvIDMwKSAlIDEyOwogICAgICAgICAgICB2YXIgY29sb3IgPSBsIC0gYSAqIE1hdGgubWF4KE1hdGgubWluKGsgLSAzLCA5IC0gaywgMSksIC0xKTsKICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoMjU1ICogY29sb3IpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuICcjJyArIGYoMCkgKyBmKDgpICsgZig0KTsKICAgIH0KCgogICAgLy8gLS0gSEVMUEVSUyAtLS0tLS0tLQogICAgLyoqCiAgICAgKiBAYnJpZWYgRnVuY2lvbiBhdXhpbGlhciBwYXJhIGdlbmVyYXIgY29tb2RhbWVudGUgbm90aWZpY2FjaW9uZXMKICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gIHRpdHVsbyAgOiB0aXR1bG8gZGVsIG1lbnNhamUKICAgICAqIEBwYXJhbSB7c3RyaW5nfSAgdGV4dG8gICA6IHRleHRvIGludGVyaW9yIGRlbCBtZW5zYWplCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gIHRpcG8gICAgOiBzdWNjZXNzIC8gaW5mbyAvIHdhcm5pbmcgLyBlcnJvciAvIG5vdGljZQogICAgICogQHBhcmFtIHtpbnR9ICAgICB0aW1lICAgIDogdGllbXBvIHF1ZSBwZXJkdXJhIGVsIG1lbnNhamUgKCBtcyApIGRlZmF1bHQgMzAwMAogICAgICovCiAgICBmdW5jdGlvbiBub3RpZmljYXIodGl0dWxvLCB0ZXh0bywgdGlwbywgdGltZSA9IDMwMDApIHsKICAgICAgICBpZiAodHlwZW9mIFBOb3RpZnkgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgIG5ldyBQTm90aWZ5KHsKICAgICAgICAgICAgICAgIHRpdGxlOiB0aXR1bG8sCiAgICAgICAgICAgICAgICB0ZXh0OiB0ZXh0bywKICAgICAgICAgICAgICAgIHR5cGU6IHRpcG8sCiAgICAgICAgICAgICAgICBzdHlsaW5nOiAnYm9vdHN0cmFwMycsCiAgICAgICAgICAgICAgICBkZWxheTogdGltZSB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhbGVydCh0aXR1bG8gKyAnOiAnICsgdGV4dG8pOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBhY3R1YWxpemFyQm90b25lc0xheW91dCgpIHsKICAgICAgICBpZiAobGF5b3V0QWN0aXZvSWQpIHsKICAgICAgICAgICAgJCgnI2J0bi1vdmVyd3JpdGUnKS5zaG93KCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJCgnI2J0bi1vdmVyd3JpdGUnKS5oaWRlKCk7CiAgICAgICAgfQogICAgfQogICAgLy8g4oCU4oCUIEdFU1RJT04gREUgQ0FDSEUg4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCUCiAgICAvKioKICAgICAqIEBicmllZiBMbGFtYSBzaW1wbGUgYSBsYSBBUEkuCiAgICAgKiBAbm90ZSBEb3MgdmVyc2lvbmVzIGRpc3BvbmlibGVzLAogICAgICogIOKAlCBOUFMgIDogRGV2dWVsdmUgc2VjdW5kYXJpby4qLCBwcmltYXJpbyB5IHN0cyBzb24gaWQgZW50ZXJvcyAoIGludCApCiAgICAgKiAg4oCUIE5QU0ogOiBEZXZ1ZWx2ZSB1biBqb2luIGVudHJlIHNlY3VuZGFyaW8sIHRpcG9zZWMgeSBzdWJ0aXBvc2VjdW5kYXJpbywKICAgICAqICAgICAgICAgICBwcmltYXJpbyB5IHN0cyBzb24gc3VzIG5vbWJyZXMgKCBzdHJpbmcgKQogICAgICoKICAgICAqIEBwYXJhbSB7aW50fSAgICAgdElkICAgICA6IFRpcG9zZWMgaWQKICAgICAqIEBwYXJhbSB7c3RyaW5nfSAgaW5pY2lvICA6IGZlY2hhIGluaWNpbwogICAgICogQHBhcmFtIHtzdHJpbmd9ICBmaW4gICAgIDogZmVjaGEgZmluCiAgICAgKiBAcmV0dXJucyB7Kn0KICAgICAqLwogICAgZnVuY3Rpb24gcGVkaXJEYXRvc0FQSSh0SWQsIGluaWNpbywgZmluKSB7CiAgICAgICAgcmV0dXJuICQuYWpheCh7CiAgICAgICAgICAgIHVybDogJy4uLy4uL29saS9iYWNrZW5kL2FwaS5waHAnLAogICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgZGF0YTogewogICAgICAgICAgICAgICAgYWN0aW9uICAgOiAnbG9hZF9zZWN1bmRhcmlvX05QU0onLAogICAgICAgICAgICAgICAgdGlwb3NlYyAgOiB0SWQsCiAgICAgICAgICAgICAgICBmZWNoYV9pbmk6IGluaWNpbywKICAgICAgICAgICAgICAgIGZlY2hhX2ZpbjogZmluCiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBicmllZiBPYnRlbmNpw7NuIGRlIGRhdG9zIHZpYSBkZWx0YS1mZXRjaGluZwogICAgICoKICAgICAqIEBwYXJhbSB7aW50fSAgICAgdElkICAgICAgICAgOiB0aXBvc2VjIGlkCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gIHJlcUluaVN0ciAgIDogZmVjaGEgaW5pY2lhbCByZXF1ZXJpZGEKICAgICAqIEBwYXJhbSB7c3RyaW5nfSAgcmVxRmluU3RyICAgOiBmZWNoYSBmaW5hbCByZXF1ZXJpZGEKICAgICAqIEByZXR1cm5zIHtQcm9taXNlfQogICAgICovCiAgICBmdW5jdGlvbiBvYnRlbmVyRGF0b3NWMih0SWQsIHJlcUluaVN0ciwgcmVxRmluU3RyKSB7CiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICBjb25zdCBjYWNoZSA9IGNhY2hlU2VjdW5kYXJpb1t0SWRdOwoKICAgICAgICAgICAgLy8gMS4gQ2FjaMOpIGxpbXBpYQogICAgICAgICAgICBpZiAoIWNhY2hlKSB7CiAgICAgICAgICAgICAgICBwZWRpckRhdG9zQVBJKHRJZCwgcmVxSW5pU3RyLCByZXFGaW5TdHIpLmRvbmUoZnVuY3Rpb24oZGF0b3MpIHsKICAgICAgICAgICAgICAgICAgICBjYWNoZVNlY3VuZGFyaW9bdElkXSA9IHsgZmVjaGFNaW46IHJlcUluaVN0ciwgZmVjaGFNYXg6IHJlcUZpblN0ciwgZGF0b3M6IGRhdG9zIHx8IFtdIH07CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShjYWNoZVNlY3VuZGFyaW9bdElkXS5kYXRvcyk7CiAgICAgICAgICAgICAgICB9KS5mYWlsKHJlamVjdCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEZvcm1hdGVvIHBhcmEgY29tcGFyYWNpw7NuIG1hdGVtw6F0aWNhIGRlIGZlY2hhcwogICAgICAgICAgICBjb25zdCBmbXQgPSAnREQvTU0vWVlZWSBISDptbTpzcyc7CiAgICAgICAgICAgIGNvbnN0IHJlcUluaSA9IG1vbWVudChyZXFJbmlTdHIsIGZtdCk7CiAgICAgICAgICAgIGNvbnN0IHJlcUZpbiA9IG1vbWVudChyZXFGaW5TdHIsIGZtdCk7CiAgICAgICAgICAgIGNvbnN0IGNJbmkgPSBtb21lbnQoY2FjaGUuZmVjaGFNaW4sIGZtdCk7CiAgICAgICAgICAgIGNvbnN0IGNGaW4gPSBtb21lbnQoY2FjaGUuZmVjaGFNYXgsIGZtdCk7CgogICAgICAgICAgICBjb25zb2xlLmxvZygiUkFOR086IFxuIGluaTogIiArIHJlcUluaS50b1N0cmluZygpICsgIiA6ICIgKyBjSW5pLnRvU3RyaW5nKCkgKyAiXG4gZmluOiAiICsgcmVxRmluLnRvU3RyaW5nKCkgKyAiIDogIiArIGNGaW4udG9TdHJpbmcoKSkgOwoKICAgICAgICAgICAgLy8gMi4gMTAwJSBTYXRpc2ZlY2hvCiAgICAgICAgICAgIGlmIChyZXFJbmkuaXNTYW1lT3JBZnRlcihjSW5pKSAmJiByZXFGaW4uaXNTYW1lT3JCZWZvcmUoY0ZpbikpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCIxMDAlIFNBVElTRkVDSE8iKTsKICAgICAgICAgICAgICAgIHJlc29sdmUoY2FjaGUuZGF0b3MpOyByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIDMuIFNpbiBzb2xhcGFtaWVudG8gKCBQaXNhbW9zIGNhY2jDqSApCiAgICAgICAgICAgIGlmIChyZXFGaW4uaXNCZWZvcmUoY0luaSkgfHwgcmVxSW5pLmlzQWZ0ZXIoY0ZpbikpIHsKICAgICAgICAgICAgICAgIHBlZGlyRGF0b3NBUEkodElkLCByZXFJbmlTdHIsIHJlcUZpblN0cikuZG9uZShmdW5jdGlvbihkYXRvcykgewogICAgICAgICAgICAgICAgICAgIGNhY2hlU2VjdW5kYXJpb1t0SWRdID0geyBmZWNoYU1pbjogcmVxSW5pU3RyLCBmZWNoYU1heDogcmVxRmluU3RyLCBkYXRvczogZGF0b3MgfHwgW10gfTsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGNhY2hlU2VjdW5kYXJpb1t0SWRdLmRhdG9zKTsKICAgICAgICAgICAgICAgIH0pLmZhaWwocmVqZWN0KTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gNC4gU29sYXBhbWllbnRvIHBhcmNpYWwgKERlbHRhIEZldGNoaW5nKQogICAgICAgICAgICBsZXQgcGV0aWNpb25lcyA9W107CgogICAgICAgICAgICBpZiAocmVxSW5pLmlzQmVmb3JlKGNJbmkpKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiSVpRVUlFUk9EIik7CiAgICAgICAgICAgICAgICBwZXRpY2lvbmVzLnB1c2goIHBlZGlyRGF0b3NBUEkodElkLCByZXFJbmlTdHIsIGNhY2hlLmZlY2hhTWluKSApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocmVxRmluLmlzQWZ0ZXIoY0ZpbikpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJERVJFQ0hPIik7CiAgICAgICAgICAgICAgICBwZXRpY2lvbmVzLnB1c2goIHBlZGlyRGF0b3NBUEkodElkLCBjYWNoZS5mZWNoYU1heCwgcmVxRmluU3RyKSApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBQcm9taXNlLmFsbChwZXRpY2lvbmVzKS50aGVuKGZ1bmN0aW9uKHJlc3VsdGFkb3MpIHsKICAgICAgICAgICAgICAgIGxldCBudWV2b3NEYXRvcyA9IGNhY2hlLmRhdG9zOwoKICAgICAgICAgICAgICAgIHJlc3VsdGFkb3MuZm9yRWFjaChmdW5jdGlvbih0cm96bykgewogICAgICAgICAgICAgICAgICAgIGlmICh0cm96byAmJiB0cm96by5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG51ZXZvc0RhdG9zID0gbnVldm9zRGF0b3MuY29uY2F0KHRyb3pvKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjb25zdCBudWV2b01pbiA9IHJlcUluaS5pc0JlZm9yZShjSW5pKSA/IHJlcUluaVN0ciA6IGNhY2hlLmZlY2hhTWluOwogICAgICAgICAgICAgICAgY29uc3QgbnVldm9NYXggPSByZXFGaW4uaXNBZnRlcihjRmluKSAgPyByZXFGaW5TdHIgOiBjYWNoZS5mZWNoYU1heDsKCiAgICAgICAgICAgICAgICBjYWNoZVNlY3VuZGFyaW9bdElkXSA9IHsKICAgICAgICAgICAgICAgICAgICBmZWNoYU1pbjogbnVldm9NaW4sCiAgICAgICAgICAgICAgICAgICAgZmVjaGFNYXg6IG51ZXZvTWF4LAogICAgICAgICAgICAgICAgICAgIGRhdG9zOiBudWV2b3NEYXRvcwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICByZXNvbHZlKG51ZXZvc0RhdG9zKTsKICAgICAgICAgICAgfSkuY2F0Y2gocmVqZWN0KTsKICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBicmllZiBPYnRpZW5lIHRvZG9zIGxvcyB0aXBvc2VjIGFjdGl2b3MgZW4gd2lkZ2V0cwogICAgICoKICAgICAqIEByZXR1cm5zIHtzdHJpbmdbXXxbXX0gbGlzdGEgZGUgaWQgYWN0aXZvcwogICAgICovCiAgICBmdW5jdGlvbiBvYnRlbmVyVGlwb3NlY0FjdGl2b3MoKXsKICAgICAgICB2YXIgdGlwb3NlY1VuaWNvcyA9IFtdOwogICAgICAgICQoJyNncmlkLWdsb2JhbCAuZ3JpZC1zdGFjay1pdGVtJykuZWFjaChmdW5jdGlvbigpewogICAgICAgICAgICB2YXIgdElkID0gJCh0aGlzKS5hdHRyKCdkYXRhLXRpcG9zZWMtaWQnKTsKICAgICAgICAgICAgaWYgKHRJZCAmJiAhdGlwb3NlY1VuaWNvcy5pbmNsdWRlcyh0SWQpKXsKICAgICAgICAgICAgICAgIHRpcG9zZWNVbmljb3MucHVzaCh0SWQpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIHJldHVybiB0aXBvc2VjVW5pY29zOwogICAgfQoKICAgIC8qKgogICAgICogQGJyaWVmIExvY2FsaXphIHF1ZSBudWV2b3MgdGlwb3NlYyBoYWNlIGZhbHRhIHkgYm9ycmEgbG9zIGFudGVyaW9yZXMKICAgICAqIEBwYXJhbSB7YXJyYXl9ICAgbnVldm9zSXRlbXMgOiBpdGVtcyBkZSBsYXlvdXQKICAgICAqLwogICAgZnVuY3Rpb24gcHJlcGFyYXJFbnRvcm5vV2lkZ2V0cyhudWV2b3NJdGVtcyl7CiAgICAgICAgY29uc3QgdElkc05lY2VzYXJpb3MgPSBbXTsKICAgICAgICBudWV2b3NJdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewogICAgICAgICAgICBjb25zdCB0SWRTdHIgPSBpdGVtLnRpcG9zZWNfaWQudG9TdHJpbmcoKTsKICAgICAgICAgICAgaWYgKCF0SWRzTmVjZXNhcmlvcy5pbmNsdWRlcyh0SWRTdHIpKSB0SWRzTmVjZXNhcmlvcy5wdXNoKHRJZFN0cik7CiAgICAgICAgfSk7CgogICAgICAgIGZvciAoY29uc3QgdElkIGluIGNhY2hlU2VjdW5kYXJpbykgewogICAgICAgICAgICBpZiAoIXRJZHNOZWNlc2FyaW9zLmluY2x1ZGVzKHRJZC50b1N0cmluZygpKSl7CiAgICAgICAgICAgICAgICBkZWxldGUgY2FjaGVTZWN1bmRhcmlvW3RJZF07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHdpZGdldERhdGFDYWNoZSA9IHt9OwogICAgICAgIGdyaWRHbG9iYWwucmVtb3ZlQWxsKCk7CiAgICB9CgogICAgLy8g4oCU4oCUIFZJU1VBTEVTIERFIFdJREdFVFMg4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCUCiAgICAvKioKICAgICAqIEBicmllZiBNdWVzdHJhL29jdWx0YSBsYSBjYXBhIGRlICJDYXJnYW5kby4uLi4iIHBhcmEgdG9kb3MgbG9zIHdpZGdldHMuCiAgICAgKgogICAgICogQHBhcmFtIHtzdHJpbmd9ICB0SWQgICAgIDogdGlwb3NlY0lkCiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNob3cgICAgOiBpbmRpY2Egc2kgaGEgZGUgb2N1bHRhcnNlIG8gbm8KICAgICAqLwogICAgZnVuY3Rpb24gdG9nZ2xlTG9hZGVyV2lkZ2V0cyh0SWQsIHNob3cpIHsKICAgICAgICBjb25zdCAkYm9kaWVzID0gJCgnLmdyaWQtc3RhY2staXRlbVtkYXRhLXRpcG9zZWMtaWQ9IicgKyB0SWQgKyAnIl0gLmdzLWl0ZW0tYm9keScpOwogICAgICAgIGlmIChzaG93KSB7CiAgICAgICAgICAgICRib2RpZXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGlmICgkKHRoaXMpLmZpbmQoJy5ncy1sb2FkZXItb3ZlcmxheScpLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuYXBwZW5kKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9ImdzLWxvYWRlci1vdmVybGF5IiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7IGluc2V0OjA7IGJhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwwLjc1KTsgei1pbmRleDoyMDsgZGlzcGxheTpmbGV4OyBhbGlnbi1pdGVtczpjZW50ZXI7IGp1c3RpZnktY29udGVudDpjZW50ZXI7IGJvcmRlci1yYWRpdXM6NHB4OyI+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0idGV4dC1jZW50ZXIgdGV4dC1wcmltYXJ5Ij48aSBjbGFzcz0iZmEgZmEtc3Bpbm5lciBmYS1zcGluIGZhLTJ4Ij48L2k+PGJyPjxzbWFsbD5BY3R1YWxpemFuZG8uLi48L3NtYWxsPjwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvZGl2PicKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkYm9kaWVzLmZpbmQoJy5ncy1sb2FkZXItb3ZlcmxheScpLmZhZGVPdXQoMjAwLCBmdW5jdGlvbigpIHsgJCh0aGlzKS5yZW1vdmUoKTsgfSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQGJyaWVmIEFjdHVhbGl6YSBsb3MgYXRyaWJ1dG9zIGRlIHVuIHdpZGdldCB5IHJlcGludGEgc3UgZ3LDoWZpY2EKICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gICR3aWRnZXQgICAgICAgICA6IHdpZGdldCBhIG1vZGlmaWNhcgogICAgICogQHBhcmFtIHthcnJheX0gICBkYXRvc0ZpbHRyYWRvcyAgOiBkYXRvcyBudWV2b3MgZGVsIHdpZGdldAogICAgICogQHBhcmFtIHtzdHJpbmd9ICBzdHJJbmkgICAgICAgICAgOiBmZWNoYSBpbmljaW8gcGFyYSBlbCBsaW1pdGUKICAgICAqIEBwYXJhbSB7c3RyaW5nfSAgc3RyRmluICAgICAgICAgIDogZmVjaGEgZmluYWwgcGFyYSBlbCBsaW1pdGUKICAgICAqLwogICAgZnVuY3Rpb24gcmVwaW50YXJXaWRnZXRET00oJHdpZGdldCwgZGF0b3NGaWx0cmFkb3MsIHN0ckluaSwgc3RyRmluKSB7CiAgICAgICAgY29uc3Qgd0lkID0gJHdpZGdldC5hdHRyKCdpZCcpOwogICAgICAgIGNvbnN0IHRJZCA9ICR3aWRnZXQuYXR0cignZGF0YS10aXBvc2VjLWlkJyk7CgogICAgICAgICR3aWRnZXQuYXR0cignZGF0YS1mZWNoYS1pbmknLCBzdHJJbmkpOwogICAgICAgICR3aWRnZXQuYXR0cignZGF0YS1mZWNoYS1maW4nLCBzdHJGaW4pOwoKICAgICAgICBjb25zdCBhZ3J1cExhYmVscyA9IHsgbm9uZTonU2luIGFncnVwYXInLCBtaW51dGU6J01pbnV0bycsIGhvdXI6J0hvcmEnLCBob3VyNjonNmgnLCBob3VyMTI6JzEyaCcsIGRheTonRMOtYScsIHdlZWs6J1NlbWFuYScsIG1vbnRoOidNZXMnIH07CiAgICAgICAgY29uc3QgYWdydXBMYWJlbCAgPSBhZ3J1cExhYmVsc1skd2lkZ2V0LmF0dHIoJ2RhdGEtYWdydXBhY2lvbicpXSB8fCAkd2lkZ2V0LmF0dHIoJ2RhdGEtYWdydXBhY2lvbicpOwogICAgICAgICR3aWRnZXQuZmluZCgnLmdzLWl0ZW0taGVhZGVyIHNtYWxsJykuaHRtbCgKICAgICAgICAgICAgICAgICcoJyArIHN0ckluaS5zdWJzdHJpbmcoMCwxMCkgKyAnICZtZGFzaDsgJyArIHN0ckZpbi5zdWJzdHJpbmcoMCwxMCkgKyAnKScgKwogICAgICAgICAgICAgICAgJyZuYnNwOyZtaWRkb3Q7Jm5ic3A7JyArIGFncnVwTGFiZWwKICAgICAgICApOwoKICAgICAgICByZWZpbmFyX2RhdG9zKAogICAgICAgICAgICAgICAgZGF0b3NGaWx0cmFkb3MsIHdJZCwgdElkLAogICAgICAgICAgICAgICAgJHdpZGdldC5hdHRyKCdkYXRhLXRpcG9zZWMtbm9tYnJlJyksCiAgICAgICAgICAgICAgICBzdHJJbmksIHN0ckZpbiwKICAgICAgICAgICAgICAgICR3aWRnZXQuYXR0cignZGF0YS10aXBvLWdyYWZpY28nKSwKICAgICAgICAgICAgICAgICR3aWRnZXQuYXR0cignZGF0YS1hZ3J1cGFjaW9uJyksCiAgICAgICAgICAgICAgICAkd2lkZ2V0LmF0dHIoJ2RhdGEtaHVlY29zJyksCiAgICAgICAgICAgICAgICAkd2lkZ2V0LmF0dHIoJ2RhdGEtY3VzdG9tLXNlZ3VuZG9zJykKICAgICAgICApOwogICAgfQoKICAgIC8qKgogICAgICogQGJyaWVmIE1hbmFnZXIgZGUgc2luY3Jvbml6YWNpw7NuIGRlIGZlY2hhcwogICAgICoKICAgICAqIEBwYXJhbSB7c3RyaW5nfSAgdElkICAgICA6IHRpcG9zZWMgYSBhY3R1YWxpemFyCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gIHN0ckluaSAgOiBmZWNoYSBkZSBpbmljaW8KICAgICAqIEBwYXJhbSB7c3RyaW5nfSAgc3RyRmluICA6IGZlY2hhIGRlIGZpbgogICAgICovCiAgICBmdW5jdGlvbiBwcm9jZXNhckFjdHVhbGl6YWNpb25UaXBvc2VjKHRJZCwgc3RySW5pLCBzdHJGaW4pIHsKICAgICAgICB0b2dnbGVMb2FkZXJXaWRnZXRzKHRJZCwgdHJ1ZSk7CgogICAgICAgIGNvbnN0IHNxbEluaSA9IG1vbWVudChzdHJJbmksICdERC9NTS9ZWVlZIEhIOm1tOnNzJykuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tOnNzJyk7CiAgICAgICAgY29uc3Qgc3FsRmluID0gbW9tZW50KHN0ckZpbiwgJ0REL01NL1lZWVkgSEg6bW06c3MnKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW06c3MnKTsKCiAgICAgICAgb2J0ZW5lckRhdG9zVjIodElkLCBzdHJJbmksIHN0ckZpbikudGhlbihmdW5jdGlvbihkYXRvc0NvbXBsZXRvcykgewogICAgICAgICAgICBjb25zdCBkYXRvc0ZpbHRyYWRvcyA9IGRhdG9zQ29tcGxldG9zLmZpbHRlcihmdW5jdGlvbiAocm93KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcm93LmZlY2hhID49IHNxbEluaSAmJiByb3cuZmVjaGEgPD0gc3FsRmluOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICQoJy5ncmlkLXN0YWNrLWl0ZW1bZGF0YS10aXBvc2VjLWlkPSInICsgdElkICsgJyJdJykuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJlcGludGFyV2lkZ2V0RE9NKCQodGhpcyksIGRhdG9zRmlsdHJhZG9zLCBzdHJJbmksIHN0ckZpbik7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgdG9nZ2xlTG9hZGVyV2lkZ2V0cyh0SWQsIGZhbHNlKTsKCiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIG5vdGlmaWNhcignRXJyb3InLCAnTm8gc2UgcHVkaWVyb24gYWN0dWFsaXphciBsb3MgZGF0b3MuJywgJ2Vycm9yJyk7CiAgICAgICAgICAgIHRvZ2dsZUxvYWRlcldpZGdldHModElkLCBmYWxzZSk7CiAgICAgICAgfSk7CiAgICB9Cgo8L3NjcmlwdD4KCjwhLS0gUGlja2VyIGRlIGZlY2hhcyAtLT4KPHNjcmlwdD4KICAgICQoZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBGTVQgPSAnREQvTU0vWVlZWSBISDptbTpzcyc7CiAgICAgICAgbW9tZW50LmxvY2FsZSgnZXMnKTsKCiAgICAgICAgJCgnI3BpY2tlci1yYW5nbycpLmRhdGVyYW5nZXBpY2tlcih7CiAgICAgICAgICAgIHRpbWVQaWNrZXIgICAgICAgOiB0cnVlLAogICAgICAgICAgICB0aW1lUGlja2VyMjRIb3VyIDogdHJ1ZSwKICAgICAgICAgICAgdGltZVBpY2tlclNlY29uZHM6IGZhbHNlLAogICAgICAgICAgICBhdXRvVXBkYXRlSW5wdXQgIDogZmFsc2UsCiAgICAgICAgICAgIG9wZW5zICAgICAgICAgICAgOiAnY2VudGVyJywKICAgICAgICAgICAgbG9jYWxlOiB7CiAgICAgICAgICAgICAgICBmb3JtYXQgICAgIDogRk1ULAogICAgICAgICAgICAgICAgc2VwYXJhdG9yICA6ICcgIOKAlCAgJywKICAgICAgICAgICAgICAgIGFwcGx5TGFiZWwgOiAnQWNlcHRhcicsCiAgICAgICAgICAgICAgICBjYW5jZWxMYWJlbDogJ0NhbmNlbGFyJywKICAgICAgICAgICAgICAgIHdlZWtMYWJlbCAgOiAnUycsCiAgICAgICAgICAgICAgICBkYXlzT2ZXZWVrIDogWydEbycsJ0x1JywnTWEnLCdNaScsJ0p1JywnVmknLCdTYSddLAogICAgICAgICAgICAgICAgbW9udGhOYW1lcyA6IFsnRW5lcm8nLCdGZWJyZXJvJywnTWFyem8nLCdBYnJpbCcsJ01heW8nLCdKdW5pbycsCiAgICAgICAgICAgICAgICAgICAgJ0p1bGlvJywnQWdvc3RvJywnU2VwdGllbWJyZScsJ09jdHVicmUnLCdOb3ZpZW1icmUnLCdEaWNpZW1icmUnXSwKICAgICAgICAgICAgICAgIGZpcnN0RGF5ICAgOiAxCiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgb2J0ZW5lcl91bHRpbWFGZWNoQ2FtcGFuaWEoKTsKCiAgICAgICAgJCgnI3BpY2tlci1yYW5nbycpLm9uKCdhcHBseS5kYXRlcmFuZ2VwaWNrZXInLCBmdW5jdGlvbihldiwgcGlja2VyKSB7CiAgICAgICAgICAgICQodGhpcykudmFsKHBpY2tlci5zdGFydERhdGUuZm9ybWF0KEZNVCkgKyAnICDigJQgICcgKyBwaWNrZXIuZW5kRGF0ZS5mb3JtYXQoRk1UKSk7CiAgICAgICAgICAgIHZhbGlkYXJSYW5nbyhwaWNrZXIuc3RhcnREYXRlLCBwaWNrZXIuZW5kRGF0ZSk7CiAgICAgICAgfSk7CgogICAgICAgICQoJyNwaWNrZXItcmFuZ28nKS5vbignY2FuY2VsLmRhdGVyYW5nZXBpY2tlcicsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAkKHRoaXMpLnZhbCgnJyk7CiAgICAgICAgICAgICQoJyNmZWNoYS1lcnJvciwgI2ZlY2hhLW9rJykuaGlkZSgpOwogICAgICAgICAgICAkKCcjcGlja2VyLXJhbmdvJykuY2xvc2VzdCgnLmZvcm0tZ3JvdXAnKS5yZW1vdmVDbGFzcygnaGFzLWVycm9yJyk7CiAgICAgICAgfSk7CgogICAgICAgIGZ1bmN0aW9uIHZhbGlkYXJSYW5nbyhpbmljaW8sIGZpbikgewogICAgICAgICAgICAkKCcjcGlja2VyLXJhbmdvJykuY2xvc2VzdCgnLmZvcm0tZ3JvdXAnKS5yZW1vdmVDbGFzcygnaGFzLWVycm9yJyk7CiAgICAgICAgICAgICQoJyNmZWNoYS1lcnJvciwgI2ZlY2hhLW9rJykuaGlkZSgpOwogICAgICAgICAgICBpZiAoaW5pY2lvLmlzQmVmb3JlKGZpbikpIHJldHVybiB0cnVlOwogICAgICAgICAgICAkKCcjcGlja2VyLXJhbmdvJykuY2xvc2VzdCgnLmZvcm0tZ3JvdXAnKS5hZGRDbGFzcygnaGFzLWVycm9yJyk7CiAgICAgICAgICAgICQoJyNmZWNoYS1lcnJvcicpLnNob3coKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgd2luZG93Lm9idGVuZXJSYW5nb0ZlY2hhcyA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgdmFsID0gJCgnI3BpY2tlci1yYW5nbycpLnZhbCgpOwogICAgICAgICAgICBpZiAoIXZhbCkgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIHZhciBwYXJ0ZXMgPSB2YWwuc3BsaXQoJyAg4oCUICAnKTsKICAgICAgICAgICAgaWYgKHBhcnRlcy5sZW5ndGggPCAyKSByZXR1cm4gbnVsbDsKICAgICAgICAgICAgdmFyIGluaWNpbyA9IG1vbWVudChwYXJ0ZXNbMF0udHJpbSgpLCBGTVQsIHRydWUpOwogICAgICAgICAgICB2YXIgZmluICAgID0gbW9tZW50KHBhcnRlc1sxXS50cmltKCksIEZNVCwgdHJ1ZSk7CiAgICAgICAgICAgIGlmICghaW5pY2lvLmlzVmFsaWQoKSB8fCAhZmluLmlzVmFsaWQoKSB8fCAhaW5pY2lvLmlzQmVmb3JlKGZpbikpIHJldHVybiBudWxsOwogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgaW5pY2lvICAgOiBpbmljaW8uZm9ybWF0KEZNVCksCiAgICAgICAgICAgICAgICBmaW4gICAgICA6IGZpbi5mb3JtYXQoRk1UKSwKICAgICAgICAgICAgICAgIGluaWNpb0lTTzogaW5pY2lvLnRvSVNPU3RyaW5nKCksCiAgICAgICAgICAgICAgICBmaW5JU08gICA6IGZpbi50b0lTT1N0cmluZygpCiAgICAgICAgICAgIH07CiAgICAgICAgfTsKICAgIH0pOwo8L3NjcmlwdD4KCjwvYm9keT4KPC9odG1sPiI7czo0MzoiAHBocERvY3VtZW50b3JcUmVmbGVjdGlvblxQaHBcRmlsZQBkb2NCbG9jayI7TjtzOjQzOiIAcGhwRG9jdW1lbnRvclxSZWZsZWN0aW9uXFBocFxGaWxlAG1ldGFkYXRhIjthOjA6e319";