https://ipfs.io/ipfs/QmVtjwLKwwRFPiTajUdgvLu6gNyfjXM77biytoJjyEnEQr
sha256
f24e6328efe79c8cc78aa2fe28afcc77106c607c35274043fbc32e8c5cf02eaa files.html
base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyIvPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL3N2Z2ljb25zLnNwYXJray5mci9zdmdpY29ucy5jc3MiLz4KICAgIDxzdHlsZT4KICAgICAgKiB7CiAgICAgICAgb3ZlcnNjcm9sbC1iZWhhdmlvci15OiBjb250YWluOwogICAgICB9CiAgICAgIAogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksIAogICAgICAjaGVhZGVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncywgCiAgICAgICNwcml2a2V5IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncyB7CiAgICAgICAgaGVpZ2h0OiA2ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNsb2dzIHsKICAgICAgICBoZWlnaHQ6IDhlbTsKICAgICAgICBvdmVyZmxvdzogc2Nyb2xsOwogICAgICAgIGZvbnQtc2l6ZTogLjhlbTsKICAgICAgfQogICAgICAKICAgICAgc2VsZWN0IHsKICAgICAgICB3aWR0aDogNGVtOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLCAKICAgICAgaW5wdXQuc3VibWl0IHsKICAgICAgICBib3JkZXItcmFkaXVzOiAuNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0LCAKICAgICAgI2hlYWRlciBhLAogICAgICAjbWVkaWEtY29udGFpbmVyIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLCAKICAgICAgZm9ybSwgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHotaW5kZXg6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgIAogICAgICBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDMwZW0pIHsKICAgICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgfQogICAgICB9CgogICAgICBmb3JtIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeSB7CiAgICAgICAgd2lkdGg6IDZlbTsKICAgICAgfQogICAgICAKICAgICAgI2xvYWRpbmcgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMHB4OwogICAgICAgIGxlZnQ6IDI3ZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgIGEgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgfQoKICAgICAgdmlkZW8gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogIAogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgIGhlaWdodDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgIG1hcmdpbi10b3A6IDAgIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgLnR5cGUgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICB6LWluZGV4OiAxOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2UtcXVlcnkgewogICAgICAgIHdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksCiAgICAgIGEsCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICB9CgogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbWluLXdpZHRoOiAzZW07CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLAogICAgICAjaGVhZGVyIHNwYW4gewogICAgICAgIHBhZGRpbmc6IDAuNWVtOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CgogICAgICAjaGVhZGVyIHsKICAgICAgICBwYWRkaW5nOiAwLjQ1ZW0gMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAjaGVhZGVyIC5pdGVtcyB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgLml0ZW1zIHsKICAgICAgICBtYXJnaW4tdG9wOiAuM2VtOwogICAgICB9CgogICAgICBwIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICAubGFiZWwgewogICAgICAgIHBhZGRpbmc6IC44ZW0gLjhlbSAuOGVtIDA7CiAgICAgIH0KCiAgICAgICNpbWFnZXMgLnF1ZXJ5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KCiAgICAgICNtZWRpYS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwKTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlIHsKICAgICAgICBtYXgtd2lkdGg6IDEwMHZ3OwogICAgICAgIG1heC1oZWlnaHQ6IDEwMHZoOwogICAgICB9CiAgICAgICAgCiAgICAgICNpbWFnZXMgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZXMgLml0ZW0gewogICAgICAgIHdpZHRoOiAyNXZ3OwogICAgICB9CgogICAgICAjaW1hZ2VzIC5pdGVtIHsKICAgICAgICBoZWlnaHQ6IDI1dnc7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgI21lZGlhLWNvbnRhaW5lciB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgYm9keTpub3QoLm5vc3RyKSAjZmlsdGVyLWxpa2VzLCAKICAgICAgLmZpbHRlci1saWtlcyAjaW1hZ2VzID4gLml0ZW06bm90KC5yZWFjdGVkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIHotaW5kZXg6IDI7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDN2dzsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBwYWRkaW5nOiAwIDF2dzsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UsIAogICAgICAjaW1hZ2UtcXVlcnksIAogICAgICAudmlkZW9zdmcsCiAgICAgIC5pbWFnZXN2ZyB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjYpOwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSB7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGZvbnQtc2l6ZTogbWluKDMuNXZ3LCAxLjVlbSk7CiAgICAgICAgbWF4LXdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1xdWVyeSB7CiAgICAgICAgcGFkZGluZzogLjZlbSAuNGVtIC4xZW0gLjRlbTsKICAgICAgICBtYXgtd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgLmxpa2UucmVhY3RlZCwKICAgICAgLmZpbHRlci1saWtlcyAjZmlsdGVyLWxpa2VzIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7CiAgICAgIH0KCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIGZvbnQtc2l6ZTogM2VtOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2UtcXVlcnksCiAgICAgICNpbWFnZS11c2VyLAogICAgICAjbWVkaWEtZm9vdGVyIC5saWtlIHsKICAgICAgICB6LWluZGV4OiA1OwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlLXF1ZXJ5LAogICAgICAjaW1hZ2UtdXNlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgICNpbWFnZS11c2VyIHsKICAgICAgICBib3R0b206IDEuOWVtOwogICAgICAgIGZvbnQtc2l6ZTogMS44ZW07CiAgICAgICAgcGFkZGluZy1yaWdodDogLjY1ZW07CiAgICAgICAgbWF4LXdpZHRoOiA4ZW07CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgIH0KICAgICAgCiAgICAgIC5saWtlIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IGF1dG87CiAgICAgICAgcGFkZGluZzogLjJlbTsKICAgICAgICB3aWR0aDogMWVtOwogICAgICAgIGhlaWdodDogMWVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5ub3N0ciAubGlrZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7ICAKICAgICAgfQoKICAgICAgI21lZGlhLWZvb3RlciAubGlrZSB7CiAgICAgICAgZm9udC1zaXplOiAyLjRlbTsKICAgICAgfQoKICAgICAgI21lZGlhLWZvb3RlciB7CiAgICAgICAgZGlzcGxheTogbm9uZTsgIAogICAgICB9CiAgCiAgICAgICNpbWFnZXMgLmltZyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIGJhY2tncm91bmQtc2l6ZTogY292ZXI7CiAgICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIC5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICM0NDQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZXMgPiAuYWN0aXZlIHsKICAgICAgICBvdXRsaW5lOiAuM2VtIHNvbGlkIGdyZWVuOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KCiAgICAgIC5oZWFydHN2ZyBwYXRoLAogICAgICAuaGVhZGVyLWljb24gc3ZnIHBhdGggewogICAgICAgIHN0cm9rZTogI2ZmZjsKICAgICAgfQogIAogICAgICAudmlkZW9zdmcsCiAgICAgIC5pbWFnZXN2ZyB7CiAgICAgICAgd2lkdGg6IGNhbGMobWluKDR2dywgMmVtKSk7CiAgICAgICAgaGVpZ2h0OiBjYWxjKG1pbig0dncsIDJlbSkpOwogICAgICAgIHBhZGRpbmc6IDAgLjJlbTsKICAgICAgfQogICAgICAKICAgICAgLnZpZGVvc3ZnIHBhdGgsCiAgICAgIC5pbWFnZXN2ZyBwYXRoIHsKICAgICAgICBmaWxsOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICBhI21lbnUsIAogICAgICAuaGVhZGVyLWljb24gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbi10b3A6IC0uM2VtOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgIH0KCiAgICAgIC5pY29ucyB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHotaW5kZXg6IDI7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQogICAgICAKICAgICAgYSNtZW51IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBwYWRkaW5nOiAwIC4zZW0gMCAuNWVtOwogICAgICAgIGhlaWdodDogMi4xZW07CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgLmhlYWRlci1pY29uIHsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB3aWR0aDogMS41ZW07CiAgICAgICAgaGVpZ2h0OiAxLjVlbTsKICAgICAgICBtYXJnaW46IC4xZW0gLjVlbTsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgIH0KICAgICAgCiAgICAgIC5oZWFkZXItaWNvbiBzdmcgewogICAgICAgIHdpZHRoOiAxLjVlbTsKICAgICAgICBoZWlnaHQ6IDEuNWVtOwogICAgICB9CiAgICAgICAKICAgICAgLm1lbnVzdmcgewogICAgICAgIHdpZHRoOiAyZW07CiAgICAgICAgaGVpZ2h0OiAyZW07CiAgICAgIH0KCiAgICAgIC5tZW51c3ZnIHBhdGggewogICAgICAgIGZpbGw6ICNmZmY7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIGhlaWdodDogMTAwdmg7CiAgICAgICAgd2lkdGg6IDE4ZW07CiAgICAgICAgbWFyZ2luLWxlZnQ6IC0xOGVtOwogICAgICAgIGJhY2tncm91bmQ6ICMyMjI7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHotaW5kZXg6IDM7IAogICAgICAgIG92ZXJmbG93OiBzY3JvbGw7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQub3BlbiB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDA7CiAgICAgIH0KICAgICAgCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIHsKICAgICAgICBwYWRkaW5nOiAwIDFlbSAxZW0gMWVtOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjbWVudS1jb250ZW50IC5pdGVtcyBhLAogICAgICBpbnB1dC5zdWJtaXQgewogICAgICAgIHBhZGRpbmc6IC41ZW0gLjdlbTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgYmFja2dyb3VuZDogIzExMTsKICAgICAgfQoKICAgICAgI292ZXJsYXkgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgei1pbmRleDogMzsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgb3BhY2l0eTogLjU7CiAgICAgIH0KCiAgICAgIC5vcGVuIHsKICAgICAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAjc2hhcmUtZGlhbG9nIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB3aWR0aDogY2FsYygxMDB2dyAtIDRlbSk7CiAgICAgICAgaGVpZ2h0OiA1MCU7CiAgICAgICAgYmFja2dyb3VuZDogI2ZmZjsKICAgICAgICBib3JkZXItcmFkaXVzOiAxZW07CiAgICAgICAgei1pbmRleDogNDsKICAgICAgICBtYXJnaW4tbGVmdDogMmVtOwogICAgICAgIG1hcmdpbi10b3A6IDJlbTsKICAgICAgICBwYWRkaW5nOiAxZW07CiAgICAgIH0KICAgICAgCiAgICAgIGgyIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICBzdmcgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAjdGVtcGxhdGUgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGRpdiBpZD0idGVtcGxhdGUiPgogICAgICA8c3ZnIGNsYXNzPSJoZWFydHN2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KICAgICAgICA8cGF0aCBkPSJNOS43MTksMTcuMDczbC02LjU2Mi02LjUxYy0wLjI3LTAuMjY4LTAuNTA0LTAuNTY3LTAuNjk2LTAuODg4QzEuMzg1LDcuODksMS42Nyw1LjYxMywzLjE1NSw0LjE0YzAuODY0LTAuODU2LDIuMDEyLTEuMzI5LDMuMjMzLTEuMzI5YzEuOTI0LDAsMy4xMTUsMS4xMiwzLjYxMiwxLjc1MmMwLjQ5OS0wLjYzNCwxLjY4OS0xLjc1MiwzLjYxMi0xLjc1MmMxLjIyMSwwLDIuMzY5LDAuNDcyLDMuMjMzLDEuMzI5YzEuNDg0LDEuNDczLDEuNzcxLDMuNzUsMC42OTMsNS41MzdjLTAuMTksMC4zMi0wLjQyNSwwLjYxOC0wLjY5NSwwLjg4N2wtNi41NjIsNi41MUMxMC4xMjUsMTcuMjI5LDkuODc1LDE3LjIyOSw5LjcxOSwxNy4wNzMgTTYuMzg4LDMuNjFDNS4zNzksMy42MSw0LjQzMSw0LDMuNzE3LDQuNzA3QzIuNDk1LDUuOTIsMi4yNTksNy43OTQsMy4xNDUsOS4yNjVjMC4xNTgsMC4yNjUsMC4zNTEsMC41MSwwLjU3NCwwLjczMUwxMCwxNi4yMjhsNi4yODEtNi4yMzJjMC4yMjQtMC4yMjEsMC40MTYtMC40NjYsMC41NzMtMC43MjljMC44ODctMS40NzIsMC42NTEtMy4zNDYtMC41NzEtNC41NkMxNS41Nyw0LDE0LjYyMSwzLjYxLDEzLjYxMiwzLjYxYy0xLjQzLDAtMi42MzksMC43ODYtMy4yNjgsMS44NjNjLTAuMTU0LDAuMjY0LTAuNTM2LDAuMjY0LTAuNjksMEM5LjAyOSw0LjM5Nyw3LjgyLDMuNjEsNi4zODgsMy42MSI+PC9wYXRoPgogICAgICA8L3N2Zz4KICAgICAgPHN2ZyBjbGFzcz0idmlkZW9zdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJCQk8cGF0aCBkPSJNMTguMTc1LDQuMTQySDEuOTUxQzEuNzAzLDQuMTQyLDEuNSw0LjM0NCwxLjUsNC41OTJ2MTAuODE2YzAsMC4yNDcsMC4yMDMsMC40NSwwLjQ1MSwwLjQ1aDE2LjIyNGMwLjI0NywwLDAuNDUtMC4yMDMsMC40NS0wLjQ1VjQuNTkyQzE4LjYyNSw0LjM0NCwxOC40MjIsNC4xNDIsMTguMTc1LDQuMTQyIE00LjY1NSwxNC45NTdIMi40MDF2LTEuODAzaDIuMjUzVjE0Ljk1N3pNNC42NTUsMTIuMjU0SDIuNDAxdi0xLjgwM2gyLjI1M1YxMi4yNTR6IE00LjY1NSw5LjU0OUgyLjQwMVY3Ljc0N2gyLjI1M1Y5LjU0OXogTTQuNjU1LDYuODQ2SDIuNDAxVjUuMDQzaDIuMjUzVjYuODQ2ek0xNC41NjksMTQuOTU3SDUuNTU2VjUuMDQzaDkuMDEzVjE0Ljk1N3ogTTE3LjcyNCwxNC45NTdoLTIuMjUzdi0xLjgwM2gyLjI1M1YxNC45NTd6IE0xNy43MjQsMTIuMjU0aC0yLjI1M3YtMS44MDNoMi4yNTNWMTIuMjU0ek0xNy43MjQsOS41NDloLTIuMjUzVjcuNzQ3aDIuMjUzVjkuNTQ5eiBNMTcuNzI0LDYuODQ2aC0yLjI1M1Y1LjA0M2gyLjI1M1Y2Ljg0NnoiPjwvcGF0aD4KCQkJPC9zdmc+CgkJCTxzdmcgY2xhc3M9ImltYWdlc3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgoJCQkJPHBhdGggZD0iTTE4LjU1NSwxNS4zNTRWNC41OTJjMC0wLjI0OC0wLjIwMi0wLjQ1MS0wLjQ1LTAuNDUxSDEuODg4Yy0wLjI0OCwwLTAuNDUxLDAuMjAzLTAuNDUxLDAuNDUxdjEwLjgwOGMwLDAuNTU5LDAuNzUxLDAuNDUxLDAuNDUxLDAuNDUxaDE2LjIxN2gwLjAwNUMxOC43OTMsMTUuODUxLDE4LjQ3OCwxNC44MTQsMTguNTU1LDE1LjM1NCBNMi44LDE0Ljk0OWw0Ljk0NC02LjQ2NGw0LjE0NCw1LjQxOWMwLjAwMywwLjAwMywwLjAwMywwLjAwMywwLjAwMywwLjAwNWwwLjc5NywxLjA0SDIuOHogTTEzLjgyMiwxNC45NDlsLTEuMDA2LTEuMzE3bDEuNjg5LTIuMjE4bDIuNjg4LDMuNTM1SDEzLjgyMnogTTE3LjY1NCwxNC4wNjRsLTIuNzkxLTMuNjY2Yy0wLjE4MS0wLjIzNy0wLjUzNS0wLjIzNy0wLjcxNiwwbC0xLjg5OSwyLjQ5M2wtNC4xNDYtNS40MmMtMC4xOC0wLjIzNy0wLjUzNi0wLjIzNy0wLjcxNiwwbC01LjA0Nyw2LjU5OFY1LjA0MmgxNS4zMTZWMTQuMDY0eiBNMTIuNDc0LDYuMzkzYy0wLjg2OSwwLTEuNTc3LDAuNzA3LTEuNTc3LDEuNTc2czAuNzA4LDEuNTc2LDEuNTc3LDEuNTc2czEuNTc3LTAuNzA3LDEuNTc3LTEuNTc2UzEzLjM0Myw2LjM5MywxMi40NzQsNi4zOTMgTTEyLjQ3NCw4LjY0NWMtMC4zNzEsMC0wLjY3Ni0wLjMwNC0wLjY3Ni0wLjY3NnMwLjMwNS0wLjY3NiwwLjY3Ni0wLjY3NmMwLjM3MiwwLDAuNjc2LDAuMzA0LDAuNjc2LDAuNjc2UzEyLjg0Niw4LjY0NSwxMi40NzQsOC42NDUiPjwvcGF0aD4KCQkJPC9zdmc+CiAgICAgIDxkaXYgaWQ9ImNvbHNjc3MiPgogICAgICAuY29scyR7Y29sc30gI2ltYWdlcyAuaXRlbSB7CiAgICAgICAgd2lkdGg6IGNhbGMoMTAwdncgLyAke2NvbHN9KTsKICAgICAgfQoKICAgICAgLmNvbHMke2NvbHN9ICNpbWFnZXMgLml0ZW0gewogICAgICAgIGhlaWdodDogY2FsYygxMDB2dyAvICR7Y29sc30pOwogICAgICB9CiAgICAgIAogICAgICAuY29scyR7Y29sc30gLnF1ZXJ5LAogICAgICAuY29scyR7Y29sc30gLmxpa2UgewogICAgICAgIGZvbnQtc2l6ZTogbWluKDE0dncgKiAoMSAvICR7Y29sc30pLCA2ZW0gKiAoMSAvICR7Y29sc30pKQogICAgICB9CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJzaGFyZS1kaWFsb2ciPgogICAgICA8aDI+c2hhcmU8L2gyPgogICAgICA8Zm9ybSBpZD0ic2hhcmUtZm9ybSIgYWN0aW9uPSIjIj4KICAgICAgICA8cCBjbGFzcz0iY29udGVudCI+PC9wPgogICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIGNsYXNzPSJzdWJtaXQiIHZhbHVlPSJvayIvPgogICAgICA8L2Zvcm0+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9Im1lZGlhLWZvb3RlciI+CiAgICAgIDxhIGlkPSJpbWFnZS1saWtlIiBjbGFzcz0ibGlrZSIgaHJlZj0iIyI+PC9hPgogICAgICA8YSBpZD0iaW1hZ2UtcXVlcnkiIGhyZWY9IiMiPjwvYT4KICAgICAgPGEgaWQ9ImltYWdlLXVzZXIiIGhyZWY9IiMiPjwvYT4KICAgIDwvZGl2PgogICAgPGNlbnRlciBpZD0ibWVkaWEtY29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0iaW1hZ2UtY29udGFpbmVyIj4KICAgICAgICA8aW1nIGlkPSJpbWFnZSIvPgogICAgICA8L2Rpdj4KICAgIDwvY2VudGVyPgogICAgPGRpdiBpZD0ib3ZlcmxheSI+PC9kaXY+CiAgICA8ZGl2IGlkPSJtZW51LWNvbnRlbnQiIGNsYXNzPSJ0ZXN0Ij4KICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5hdXRvcGxheTwvZGl2PgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0ib24iIGhyZWY9IiMiPm9uPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0ib2ZmIiBocmVmPSIjIj5vZmY8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJob3ZlciIgaHJlZj0iIyI+bW91c2VvdmVyPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5jb2x1bW5zPC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMSIgaHJlZj0iIyI+MTwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSIyIiBocmVmPSIjIj4yPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjQiIGhyZWY9IiMiPjQ8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iNiIgaHJlZj0iIyI+NjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSIxMCIgaHJlZj0iIyI+MTA8L2E+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmNvbm5lY3Rpb25zPC9kaXY+CiAgICAgICAgPGRpdiBpZD0iY29ubmNvdW50Ij4wPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPnJlbGF5czo8L2Rpdj4KICAgICAgICA8cD5QbGVhc2UgdXNlIHJlbGF5cyB3aXRoIE5JUC01MCAoc2VhcmNoKSBmdW5jdGlvbmFsaXR5PC9wPgogICAgICAgIDxmb3JtIGFjdGlvbj0iIyIgaWQ9InJlbGF5cy1mb3JtIj4KICAgICAgICAgIDx0ZXh0YXJlYSBpZD0icmVsYXlzIj48L3RleHRhcmVhPgogICAgICAgICAgPGlucHV0IGNsYXNzPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9InNhdmUgcmVsYXlzIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5wcml2YXRlIGtleTo8L2Rpdj4KICAgICAgICA8cD5JZiB5b3UgY2FudCB1c2UgYnJvd3NlciBhZGRvbiAobW9iaWxlKTwvcD4KICAgICAgICA8Zm9ybSBhY3Rpb249IiMiIGlkPSJwcml2a2V5LWZvcm0iPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJwcml2a2V5Ii8+CiAgICAgICAgICA8aW5wdXQgY2xhc3M9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0ic2F2ZSBrZXkiLz4KICAgICAgICA8L2Zvcm0+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmxvZ3M8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJsb2dzIj48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+bGF0ZXN0IHJlbGVhc2U6PC9kaXY+CiAgICAgICAgPGEgaWQ9InJlbGVhc2UiIGhyZWY9IiMiPjwvYT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9ImhlYWRlciI+CiAgICAgIDxkaXYgY2xhc3M9Imljb25zIj4KICAgICAgICA8YSBpZD0iZmlsdGVyLWxpa2VzIiBocmVmPSIjIiBjbGFzcz0iaGVhZGVyLWljb24iPjwvYT4KICAgICAgICA8YSBpZD0ic2hhcmUiIGhyZWY9IiMiIGNsYXNzPSJoZWFkZXItaWNvbiI+CiAgICAgICAgICA8c3ZnIGNsYXNzPSJzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KCQkJCSAgICA8cGF0aCBkPSJNMTQuNjgsMTIuNjIxYy0wLjksMC0xLjcwMiwwLjQzLTIuMjE2LDEuMDlsLTQuNTQ5LTIuNjM3YzAuMjg0LTAuNjkxLDAuMjg0LTEuNDU3LDAtMi4xNDZsNC41NDktMi42MzhjMC41MTQsMC42NjEsMS4zMTUsMS4wOSwyLjIxNiwxLjA5YzEuNTQ5LDAsMi44MDktMS4yNiwyLjgwOS0yLjgwOGMwLTEuNTQ4LTEuMjYtMi44MDktMi44MDktMi44MDljLTEuNTQ4LDAtMi44MDgsMS4yNi0yLjgwOCwyLjgwOWMwLDAuMzgsMC4wNzYsMC43NDEsMC4yMTQsMS4wNzNsLTQuNTUsMi42MzhjLTAuNTE1LTAuNjYxLTEuMzE2LTEuMDktMi4yMTctMS4wOWMtMS41NDgsMC0yLjgwOCwxLjI2LTIuODA4LDIuODA5czEuMjYsMi44MDgsMi44MDgsMi44MDhjMC45LDAsMS43MDItMC40MywyLjIxNy0xLjA5bDQuNTUsMi42MzdjLTAuMTM4LDAuMzMyLTAuMjE0LDAuNjkzLTAuMjE0LDEuMDc0YzAsMS41NDksMS4yNiwyLjgwOSwyLjgwOCwyLjgwOWMxLjU0OSwwLDIuODA5LTEuMjYsMi44MDktMi44MDlTMTYuMjI5LDEyLjYyMSwxNC42OCwxMi42MjFNMTQuNjgsMi41MTJjMS4xMzYsMCwyLjA2LDAuOTIzLDIuMDYsMi4wNlMxNS44MTUsNi42MywxNC42OCw2LjYzcy0yLjA1OS0wLjkyMy0yLjA1OS0yLjA1OVMxMy41NDQsMi41MTIsMTQuNjgsMi41MTJNNS4zMTksMTIuMDYxYy0xLjEzNiwwLTIuMDYtMC45MjQtMi4wNi0yLjA2czAuOTIzLTIuMDU5LDIuMDYtMi4wNTljMS4xMzUsMCwyLjA2LDAuOTIzLDIuMDYsMi4wNTlTNi40NTQsMTIuMDYxLDUuMzE5LDEyLjA2MU0xNC42OCwxNy40ODhjLTEuMTM2LDAtMi4wNTktMC45MjItMi4wNTktMi4wNTlzMC45MjMtMi4wNjEsMi4wNTktMi4wNjFzMi4wNiwwLjkyNCwyLjA2LDIuMDYxUzE1LjgxNSwxNy40ODgsMTQuNjgsMTcuNDg4Ij48L3BhdGg+CgkJCSAgICA8L3N2Zz4KCQkJICA8L2E+CgkJCTwvZGl2PgoJCQkKICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxhIGlkPSJtZW51IiBocmVmPSIjIj4KICAgICAgICAgIDxzdmcgY2xhc3M9Im1lbnVzdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJICAgICAgICA8cGF0aCBkPSJNMTAsMS40NDVjLTQuNzI2LDAtOC41NTUsMy44MjktOC41NTUsOC41NTVjMCw0LjcyNSwzLjgyOSw4LjU1NSw4LjU1NSw4LjU1NWM0LjcyNSwwLDguNTU1LTMuODMsOC41NTUtOC41NTVDMTguNTU1LDUuMjc0LDE0LjcyNSwxLjQ0NSwxMCwxLjQ0NSBNMTAsMTcuNjU0Yy00LjIyMSwwLTcuNjU0LTMuNDM0LTcuNjU0LTcuNjU0YzAtNC4yMjEsMy40MzMtNy42NTQsNy42NTQtNy42NTRjNC4yMjIsMCw3LjY1NCwzLjQzMyw3LjY1NCw3LjY1NEMxNy42NTQsMTQuMjIxLDE0LjIyMiwxNy42NTQsMTAsMTcuNjU0IE0xNC4zOSwxMGMwLDAuMjQ4LTAuMjAzLDAuNDUtMC40NSwwLjQ1SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMy0wLjQ1LTAuNDVzMC4yMDMtMC40NSwwLjQ1LTAuNDVoNy44NzlDMTQuMTg3LDkuNTUsMTQuMzksOS43NTIsMTQuMzksMTAgTTE0LjM5LDEyLjcwMmMwLDAuMjQ3LTAuMjAzLDAuNDQ5LTAuNDUsMC40NDlINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAyLTAuNDUtMC40NDljMC0wLjI0OCwwLjIwMy0wLjQ1MSwwLjQ1LTAuNDUxaDcuODc5QzE0LjE4NywxMi4yNTEsMTQuMzksMTIuNDU0LDE0LjM5LDEyLjcwMiBNMTQuMzksNy4yOThjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw2Ljg0OCwxNC4zOSw3LjA1MSwxNC4zOSw3LjI5OCI+PC9wYXRoPgoJICAgICAgICA8L3N2Zz4KICAgICAgICA8L2E+CiAgICAgICAgPGEgaWQ9InRpdGxlIiBocmVmPSIjIj5maWxlcy5odG1sPC9hPgogICAgICAgIDxmb3JtIGlkPSJxdWVyeS1mb3JtIiBhY3Rpb249IiMiPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJxdWVyeSIgbmFtZT0icXVlcnkiIGlkPSIiIC8+CiAgICAgICAgICA8c2VsZWN0IGlkPSJxdWVyeS10eXBlIj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iYWxsIj5hbGw8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaW1hZ2UiPmltYWdlczwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ2aWRlbyI+dmlkZW9zPC9vcHRpb24+CiAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgIDxpbnB1dCBpZD0iZ28iIHR5cGU9InN1Ym1pdCIgdmFsdWU9ImdvIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxzcGFuIGlkPSJxdWVyeWRpc3BsYXkiPgogICAgICAgICAgPHNwYW4gY2xhc3M9InRleHQiPjwvc3Bhbj4KICAgICAgICA8L3NwYW4+CiAgICAgICAgPGRpdiBpZD0ibG9hZGluZyI+dXBkYXRpbmc8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9ImltYWdlcyI+PC9kaXY+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly91bnBrZy5jb20vbm9zdHItdG9vbHMvbGliL25vc3RyLmJ1bmRsZS5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9zbG93bGkuZ2l0aHViLmlvL2JlY2gzMi1idWZmZXIvYXNzZXRzL2pzL2JlY2gzMi1idWZmZXIubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQ+CiAgICAgIGNvbnN0IHVwZGF0ZXNwdWJrZXkgPSAiYWU1YzZlMGI3NDY2MGQyMTk0YzgyNTRiNWMyYzgyNTY3NjU3NmJlMDI5NzM3OWZhMjA1MjMxMTRhNmE4NWU4NyIKICAgICAgY29uc3QgcXVlcmllcyA9IHsKICAgICAgICAiZ2xvYmFsIjogJ1siUkVRIiwiPEk+Iix7ImNhY2hlIjpbImV4cGxvcmUiLHsidGltZWZyYW1lIjoibGF0ZXN0Iiwic2NvcGUiOiJnbG9iYWwiLCJsaW1pdCI6PEw+fV19XScsIAogICAgICAgICJhdXRob3IiOiAnWyJSRVEiLCI8ST4iLHsia2luZHMiOlsxXSwiYXV0aG9ycyI6WyI8UD4iXX1dJywKICAgICAgICAicmVhY3Rpb25zIjogJ1siUkVRIiwiPEk+IiwgeyJraW5kcyI6WzddLCIjZSI6IDxFPn1dJwogICAgICB9CiAgICAgIHFzKCIjcmVsYXlzIikudmFsdWUgPSByZWxheXMoKS5qb2luKCJcbiIpCiAgICAgIHFzKCIjcHJpdmtleSIpLnZhbHVlID0gcHJpdmtleSgpCiAgICAgIGNvbnN0IGNvbG9wdHMgPSBbMSwgMiwgNCwgNiwgMTBdCgogICAgICBjb2xzID0gKCkgPT4gcGFyc2VJbnQoc2V0dGluZygiY29scyIsIGNvbG9wdHNbMV0pLCAxMCkKICAgICAgYXV0b3BsYXkgPSAoKSA9PiBzZXR0aW5nKCJhdXRvcGxheSIsICJvZmYiKQogICAgICBsaW1pdCA9ICgpID0+IHBhcnNlSW50KHNldHRpbmcoImxpbWl0IiwgMTUpLCAxMCkKICAgICAgZ2FsbGVyeSA9ICgpID0+IHsKICAgICAgICBsZXQgZ2FsbGVyeW1hdGNoZXIgPSBsb2NhdGlvbi5zZWFyY2gubWF0Y2goL2dhbGxlcnk9KFthLXowLTldKykvKQogICAgICAgIHJldHVybiBnYWxsZXJ5bWF0Y2hlciAmJiBnYWxsZXJ5bWF0Y2hlclsxXQogICAgICB9CiAgICAgIAogICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgY29scygpKQoKICAgICAgbGV0IHByb3RvY29sID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlLykgPyAibm9zdHI6IiA6ICJ3ZWIrbm9zdHI6IgogICAgICBsZXQgc29ja2V0cyA9IFtdCiAgICAgIGxldCByZXNoYW5kbGVycyA9IFtdCiAgICAgIGxldCB1cmxzID0gW10KICAgICAgbGV0IGxpa2VzID0gW10KICAgICAgbGV0IG5ld2xpa2VzID0gW10KICAgICAgbGV0IGlkY291bnRlciA9IDAKICAgICAgbGV0IHF1ZXJ5d2FpdCA9IG51bGwKICAgICAgbGV0IHByaW1hbHNvY2tldCA9IG51bGwKICAgICAgbGV0IHR5cGVzID0gewogICAgICAgIGltYWdlOiBbInBuZyIsICJqcGciLCAianBlZyIsICJ3ZWJwIl0sCiAgICAgICAgdmlkZW86IFsibXA0IiwgIndlYm0iXQogICAgICB9CiAgICAgIGxldCBpbWdyZWdleCA9IC9odHRwKHxzKVw6XC9cL1teIFxuXSo/XC4ocG5nfGpwZ3xqcGVnfHdlYnApL2dpCiAgICAgIGxldCB2aWRlb3JlZ2V4ID0gL2h0dHAofHMpXDpcL1wvW14gXG5dKj9cLihtcDR8d2VibSkvZ2kKICAgICAgbGV0IHZpZGVvZXh0cmVnZXggPSAvXC4obXA0fHdlYm0pJC9pCiAgICAgIGxldCBpbWdleHRyZWdleCA9IC9cLihwbmd8anBnfGpwZWd8d2VicCkkL2kKICAgICAgd2FpdG1zID0gNTAwMDAKICAgICAgcXVlcnlzdHIgPSAiIgogICAgICBsZXQgcXVlcnljb3VudCA9IDAKICAgICAgbGV0IGhvdmVyZWR2aWRlbyA9IG51bGwKICAgICAgCiAgICAgIHVwZGF0ZXF1ZXJ5KCkKICAgICAgcXMoIiNpbWFnZS1saWtlIikuaW5uZXJIVE1MID0gcXMoIiNmaWx0ZXItbGlrZXMiKS5pbm5lckhUTUwgPSBxcygiI3RlbXBsYXRlIC5oZWFydHN2ZyIpLm91dGVySFRNTAogICAgICBzZXRhY3RpdmUoInNldGNvbHMiLCAiY29scyIsIGNvbHMoKSkKICAgICAgc2V0YWN0aXZlKCJzZXRhdXRvcGxheSIsICJhdXRvcGxheSIsIGF1dG9wbGF5KCkpCiAgICAgIAogICAgICBmdW5jdGlvbiBmcm9tSGV4U3RyaW5nKHN0cil7CiAgICAgICAgbGV0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHN0ci5sZW5ndGggLyAyKQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmZmVyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBidWZmZXJbaV0gPSBwYXJzZUludChzdHIuc3Vic3RyKDIgKiBpLCAyKSwgMTYpCiAgICAgICAgfQogICAgICAgIHJldHVybiBidWZmZXIKICAgICAgfQogIAogICAgICBmdW5jdGlvbiByZWxheXMoKXsKICAgICAgICBjb25zdCBvYmogPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJyZWxheXMiKSkKICAgICAgICBjb25zdCByID0gb2JqICYmIG9iai5maWx0ZXIociA9PiByLm1hdGNoKC93c3M6XC9cLy4rLykpIHx8IFtdCiAgICAgICAgCiAgICAgICAgcmV0dXJuIHIubGVuZ3RoID4gMCAmJiByIHx8IFsKICAgICAgICAgICJ3c3M6Ly9yZWxheS5ub3N0ci5iYW5kIiwKICAgICAgICAgICJ3c3M6Ly9uYi5yZWxheS5jZW50ZXIiLCAKICAgICAgICAgICJ3c3M6Ly9ub3N0ci5jb21waWxlLWVycm9yLm5ldCIKICAgICAgICBdCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHByaXZrZXkoKXsKICAgICAgICBsZXQga2V5ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oInByaXZrZXkiKSB8fCAiIgogICAgICAgIAogICAgICAgIGlmKGtleS5sZW5ndGggPT0gNjMpewogICAgICAgICAga2V5ID0gTm9zdHJUb29scy5uaXAxOS5kZWNvZGUoa2V5KS5kYXRhCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiBrZXkubGVuZ3RoID09IDY0ICYmIGtleSB8fCBudWxsCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNldHRpbmcoa2V5LCBkZWZhdWx0dmFsdWUpewogICAgICAgIGNvbnN0IHYgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpCiAgICAgICAgcmV0dXJuIHYgJiYgb3B0aW9uKCJzZXQiICsga2V5LCBrZXksIHYpICYmIHYgfHwgZGVmYXVsdHZhbHVlCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIG9wdGlvbihjLCBrZXksIHZhbCl7CiAgICAgICAgcmV0dXJuIHFzKCIuIiArIGMgKyAiW2RhdGEtIiArIGtleSArICI9JyIgKyB2YWwgKyAiJ10iKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxcyhxKXsKICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihxKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxc2EocSl7CiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChxKSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gZ2lkKGkpewogICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxdWVyeXR5cGUoKXsKICAgICAgICByZXR1cm4gcXMoIiNxdWVyeS10eXBlIikudmFsdWUgfHwgImFsbCIKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlcXVlcnkoKXsKICAgICAgICBsZXQgcGFydHMgPSAoZ2FsbGVyeSgpICYmICgiZzoiICsgZ2FsbGVyeSgpKSB8fCBkZWNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaGFzaC5zdWJzdHJpbmcoMSkpKS5zcGxpdCgiLyIpCiAgICAgICAgcXMoIiNxdWVyeWRpc3BsYXkgLnRleHQiKS5pbm5lclRleHQgPSBwYXJ0c1swXS5zdWJzdHJpbmcoMCwgMjApCiAgICAgICAgcXVlcnlzdHIgPSBwYXJ0c1swXQogICAgICAgIHFzKCIjcXVlcnkiKS52YWx1ZSA9IHBhcnRzWzBdCiAgICAgICAgcXMoIiNxdWVyeS10eXBlIikudmFsdWUgPSBwYXJ0c1sxXSB8fCAiYWxsIgogICAgICB9CgogICAgICBmdW5jdGlvbiBhY3RpdmUoKXsKICAgICAgICByZXR1cm4gcXMoIiNpbWFnZXMgLmFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGltYWdlb2Zmc2V0KG9mZnNldCl7CiAgICAgICAgY29uc3QgaW1hZ2VzID0gcXNhKCIjaW1hZ2VzID4gLml0ZW0iKS5maWx0ZXIoZSA9PiBlLnN0eWxlLmRpc3BsYXkgPT0gImJsb2NrIikKICAgICAgICByZXR1cm4gaW1hZ2VzW2ltYWdlcy5pbmRleE9mKGFjdGl2ZSgpKStvZmZzZXRdCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGxhc3RhY3RpdmUoKXsKICAgICAgICByZXR1cm4gcXNhKCIjaW1hZ2VzIC5hY3RpdmUiKS5wb3AoKSAgICAgIAogICAgICB9CgogICAgICBmdW5jdGlvbiBtZW51KCl7CiAgICAgICAgcXNhKCIjbWVudS1jb250ZW50LCAjb3ZlcmxheSIpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC50b2dnbGUoIm9wZW4iKSkKICAgICAgfQogIAogICAgICBmdW5jdGlvbiBzZXRhY3RpdmUoYywga2V5LCB2YWwpewogICAgICAgIHFzYSgiLiIgKyBjKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKSkKICAgICAgICBjb25zdCBvcHRpb24gPSBxcygiLiIgKyBjICsgIltkYXRhLSIgKyBrZXkgKyAiPSciICsgdmFsICsgIiddIikKICAgICAgICBvcHRpb24/LmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNjcm9sbHZpc2libGUobiwgb2Zmc2V0KXsKICAgICAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMAogICAgICAgIHJldHVybiAobi5vZmZzZXRUb3AgKyBuLm9mZnNldEhlaWdodCkgPj0gKHNjcm9sbFkgLSBvZmZzZXQpCiAgICAgICAgICAmJiBuLm9mZnNldFRvcCA8PSAoc2Nyb2xsWSArIHZpc3VhbFZpZXdwb3J0LmhlaWdodCArIG9mZnNldCkKICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlaW1hZ2VzbG9hZCgpewogICAgICAgIHFzYSgiI2ltYWdlcyAuaXRlbS5pbWciKS5mb3JFYWNoKGFzeW5jIGltZyA9PiB7CiAgICAgICAgICBpZihzY3JvbGx2aXNpYmxlKGltZywgdmlzdWFsVmlld3BvcnQuaGVpZ2h0IC8gMikpewogICAgICAgICAgICBpbWcuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gInVybCgiICsgaW1nWyJkYXRhLXNyYyJdICsgIikiCiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgaW1nLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICIiCiAgICAgICAgICB9CiAgICAgICAgfSkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlYWxsdmlkZW9wbGF5KCl7CiAgICAgICAgcXNhKCIjaW1hZ2VzIC5pdGVtLnZpZGVvIikuZm9yRWFjaChhc3luYyBuID0+IHVwZGF0ZXZpZGVvcGxheShuKSkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRldmlkZW9wbGF5KG4pewogICAgICAgIGNvbnN0IGFwbGF5ID0gYXV0b3BsYXkoKQogICAgICAgIGNvbnN0IHYgPSBuLnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAKICAgICAgICBpZihhcGxheSAhPSAib24iKXsKICAgICAgICAgIHYubXV0ZWQgPSBmYWxzZQogICAgICAgICAgdi5wYXVzZSgpCiAgICAgICAgfWVsc2V7CiAgICAgICAgICB2Lm11dGVkID0gdHJ1ZQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZighc2Nyb2xsdmlzaWJsZShuKSl7CiAgICAgICAgICBpZih2LnJlYWR5U3RhdGUgPT0gNCl7CiAgICAgICAgICAgIHYucGF1c2UoKQogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIHYucHJlbG9hZCA9ICJub25lIgogICAgICAgICAgfQogICAgICAgIH1lbHNlIGlmKHYucmVhZHlTdGF0ZSAhPSA0KXsKICAgICAgICAgIHYucHJlbG9hZCA9ICJhdXRvIgogICAgICAgIH0KICAgICAgICBlbHNlIGlmKGFwbGF5ID09ICJvbiIgfHwgKGFwbGF5ID09ICJob3ZlciIgJiYgdiA9PSBob3ZlcmVkdmlkZW8pKXsKICAgICAgICAgIHYucGxheSgpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLCBlID0+IHsKICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpCiAgICAgICAgdXBkYXRlaW1hZ2VzbG9hZCgpCiAgICAgICAgdXBkYXRlYWxsdmlkZW9wbGF5KCkKICAgICAgfSkKICAgICAgCiAgICAgIGxldCB0b3VjaCA9IG51bGwKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCBlID0+IHRvdWNoID0gZS5jaGFuZ2VkVG91Y2hlc1swXSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIiwgZSA9PiB7CiAgICAgICAgY29uc3QgeGRpZmYgPSBlLmNoYW5nZWRUb3VjaGVzWzBdLnNjcmVlblggLSB0b3VjaC5zY3JlZW5YCgogICAgICAgIGlmKHhkaWZmIDwgLTUwKXsKICAgICAgICAgIHN3aXBlKDEpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKHhkaWZmID4gNTApewogICAgICAgICAgc3dpcGUoLTEpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgcXMoIiNxdWVyeS1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlKG51bGwsIG51bGwsIGxvY2F0aW9uLnBhdGhuYW1lKQogICAgICAgIGxvY2F0aW9uLmhhc2ggPSAiIyIgKyBlbmNvZGVVUklDb21wb25lbnQocXMoIiNxdWVyeSIpLnZhbHVlICsgIi8iICsgcXVlcnl0eXBlKCkpCiAgICAgICAgdXBkYXRlcXVlcnkoKQogICAgICAgIHF1ZXJ5d2FpdC5yZXNvbHZlKCkKICAgICAgfSkKCiAgICAgIHFzKCIjcmVsYXlzLWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBhc3luYyBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBsZXQgciA9IEpTT04uc3RyaW5naWZ5KHFzKCIjcmVsYXlzIikudmFsdWUuc3BsaXQoIlxuIikpCiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oInJlbGF5cyIsIHIpCiAgICAgICAgZGlzY29ubmVjdCgpCiAgICAgIH0pCiAgICAgIAogICAgICBxcygiI3NoYXJlLWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBhc3luYyBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICAKICAgICAgICBpZihxcygiI3NoYXJlLWZvcm0gLnN1Ym1pdCIpLnZhbHVlID09ICJjbG9zZSIpewogICAgICAgICAgcXNhKCIub3BlbiIpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC5yZW1vdmUoIm9wZW4iKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBldmVudHMgPSBxc2EoIiNpbWFnZXMgLml0ZW0iKS5tYXAobiA9PiBuWyJkYXRhLWV2ZW50Il0uaWQpCiAgICAgICAgY29uc3QgZXZlbnQgPSBhd2FpdCBwdWJsaXNoKHsKICAgICAgICAgICJraW5kIjogMzMzLAogICAgICAgICAgImNvbnRlbnQiOiBKU09OLnN0cmluZ2lmeShldmVudHMpLAogICAgICAgICAgInRhZ3MiOiBbXQogICAgICAgIH0pCgogICAgICAgIGF3YWl0IHdhaXRyZXMobnVsbCwgIk9LIikKCiAgICAgICAgY29uc3QgdXJsID0gd2luZG93LmxvY2F0aW9uLm9yaWdpbiArIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZQogICAgICAgIAogICAgICAgIGNvbnN0IHB1Ymxpc2hlZGV2ZW50ID0gYXdhaXQgcHVibGlzaCh7CiAgICAgICAgICAia2luZCI6IDEsCiAgICAgICAgICAiY29udGVudCI6ICJUaGlzIGlzIGEgZ2FsbGVyeSBvZiAiICsgZXZlbnRzLmxlbmd0aAogICAgICAgICAgICArICIgaW1hZ2VzL3ZpZGVvcyBzaGFyZWQgZnJvbSBmaWxlcy5odG1sLiBDaGVjayBpdCBvdXQgaGVyZTogIiArIHVybCArICI/Z2FsbGVyeT0iICsgZXZlbnQuaWQsCiAgICAgICAgICAidGFncyI6IFsKICAgICAgICAgICAgWyIjZSIsIGV2ZW50LmlkXSwgCiAgICAgICAgICAgIFsiI3AiLCBldmVudC5wdWJrZXldCiAgICAgICAgICBdCiAgICAgICAgfSkKCiAgICAgICAgYXdhaXQgd2FpdHJlcyhudWxsLCAiT0siKQogICAgICAgIAogICAgICAgIGNvbnN0IGJlY2gzMmlkID0gYmVjaDMyLmVuY29kZSgibm90ZSIsIGZyb21IZXhTdHJpbmcocHVibGlzaGVkZXZlbnQuaWQpKQogICAgICAgIHFzKCIjc2hhcmUtZm9ybSAuY29udGVudCIpLmlubmVySFRNTCA9ICdOb3RlIHB1Ymxpc2hlZCA8YSBocmVmPSInICsgcHJvdG9jb2wgKyBiZWNoMzJpZCArICciPicgKyBiZWNoMzJpZCArICc8L2E+JwogICAgICAgIHFzKCIjc2hhcmUtZm9ybSAuc3VibWl0IikudmFsdWUgPSAiY2xvc2UiCiAgICAgIH0pCgogICAgICBxcygiI3ByaXZrZXktZm9ybSIpLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsIGFzeW5jIGUgPT4gewogICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIGNvbnN0IGtleSA9IHFzKCIjcHJpdmtleSIpLnZhbHVlCgogICAgICAgIGlmKGtleS5sZW5ndGggIT0gNjQgJiYga2V5Lmxlbmd0aCAhPSA2Myl7CiAgICAgICAgICBhbGVydCgia2V5IHNob3VsZCBiZSA2MyBvciA2NCBjaGFyYWN0ZXJzIGxvbmciKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJwcml2a2V5Iiwga2V5KQogICAgICAgIGFsZXJ0KCJrZXkgc2F2ZWQiKQogICAgICB9KQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwgYXN5bmMgKGUpID0+IHsKICAgICAgICBpZihhdXRvcGxheSgpID09ICJob3ZlciIgJiYgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2aWRlby1jb250YWluZXIiKSl7CiAgICAgICAgICBob3ZlcmVkdmlkZW8gPSBlLnRhcmdldC5xdWVyeVNlbGVjdG9yKCJ2aWRlbyIpCiAgICAgICAgICBob3ZlcmVkdmlkZW8ucGxheSgpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLCBhc3luYyAoZSkgPT4gewogICAgICAgIGhvdmVyZWR2aWRlbyA9IGZhbHNlCiAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5zdHlsZS5kaXNwbGF5ICE9ICJibG9jayIgJiYgYXV0b3BsYXkoKSA9PSAiaG92ZXIiICYmIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygidmlkZW8tY29udGFpbmVyIikpewogICAgICAgICAgcXNhKCJ2aWRlbyIpLmZvckVhY2godiA9PiB2LnBhdXNlKCkpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBhc3luYyAoZSkgPT4gewogICAgICAgIGlmKGUudGFyZ2V0LnR5cGUgPT0gInN1Ym1pdCIgfHwgKGUudGFyZ2V0LnRhZ05hbWUgPT0gIkEiICYmIGUudGFyZ2V0LmhyZWYubWF0Y2goL14ofHdlYlwrKW5vc3RyXDovKSkpewogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gInRpdGxlIil7CiAgICAgICAgICBxcygiI3F1ZXJ5IikudmFsdWUgPSAiIgogICAgICAgICAgcXMoIiNxdWVyeS10eXBlIikudmFsdWUgPSAiYWxsIgogICAgICAgICAgcXMoIiNnbyIpLmNsaWNrKCkKICAgICAgICB9CgogICAgICAgIGUucHJldmVudERlZmF1bHQoKQoKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAiZmlsdGVyLWxpa2VzIil7CiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC50b2dnbGUoImZpbHRlci1saWtlcyIpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gInNoYXJlIil7CiAgICAgICAgICBjb25zdCBldmVudHMgPSBxc2EoIiNpbWFnZXMgLml0ZW0iKS5tYXAobiA9PiBuWyJkYXRhLWV2ZW50Il0uaWQpCiAgICAgICAgICAvL2NvbnN0IHRleHQgPSB7dHlwZTogIiIsIGV2ZW50czogfQogICAgICAgICAgcXMoIiNzaGFyZS1kaWFsb2cgLmNvbnRlbnQiKS5pbm5lckhUTUwgPSAiPHA+UHVibGlzaCBub3RlIG9mICIgKyBldmVudHMubGVuZ3RoICsgIiBldmVudHMgdG8geW91ciBub3N0ciBwcm9maWxlPzwvcD4iCiAgICAgICAgICBxcygiI3NoYXJlLWZvcm0gLnN1Ym1pdCIpLnZhbHVlID0gInB1Ymxpc2giCiAgICAgICAgICBxc2EoIiNzaGFyZS1kaWFsb2csICNvdmVybGF5IikuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnRvZ2dsZSgib3BlbiIpKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKSl7CiAgICAgICAgICBhY3RpdmUoKT8uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIGdpZChlLnRhcmdldC5pZCkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIHNob3coZS50YXJnZXQuaWQpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS50YXJnZXQudGFnTmFtZSAhPSAiQSIgJiYgKHFzKCIjaW1hZ2UtY29udGFpbmVyIikgPT0gZS50YXJnZXQgfHwgcXMoIiNpbWFnZSIpID09IGUudGFyZ2V0IHx8IHFzKCIjbWVkaWEtY29udGFpbmVyIHZpZGVvIikgPT0gZS50YXJnZXQpKXsKICAgICAgICAgIGhpZGVtZWRpYSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJtZW51Iil7CiAgICAgICAgICBtZW51KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gIm92ZXJsYXkiKXsKICAgICAgICAgIHFzYSgiLm9wZW4iKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJvcGVuIikpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRjb2xzIikpewogICAgICAgICAgZm9yKGxldCBjIG9mIGNvbG9wdHMpewogICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoImNvbHMiICsgYykKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJjb2xzIiArIGUudGFyZ2V0LmRhdGFzZXQuY29scykKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJjb2xzIiwgZS50YXJnZXQuZGF0YXNldC5jb2xzKQogICAgICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRhdXRvcGxheSIpKXsKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJhdXRvcGxheSIsIGUudGFyZ2V0LmRhdGFzZXQuYXV0b3BsYXkpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGF1dG9wbGF5IiwgImF1dG9wbGF5IiwgYXV0b3BsYXkoKSkKICAgICAgICAgIHVwZGF0ZWFsbHZpZGVvcGxheSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJsaWtlIikgJiYgbGlrZShlLnRhcmdldCkKICAgICAgfSkKICAgICAgCiAgICAgIGZ1bmN0aW9uIGhhc2tleSgpewogICAgICAgIHJldHVybiB3aW5kb3cubm9zdHIgfHwgcHJpdmtleSgpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHB1YmtleSgpewogICAgICAgIHJldHVybiB3aW5kb3cubm9zdHIgJiYgYXdhaXQgd2luZG93Lm5vc3RyLmdldFB1YmxpY0tleSgpIHx8IE5vc3RyVG9vbHMuZ2V0UHVibGljS2V5KHByaXZrZXkoKSkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gc2lnbihldmVudCl7CiAgICAgICAgaWYod2luZG93Lm5vc3RyKXsKICAgICAgICAgIHJldHVybiBhd2FpdCBub3N0ci5zaWduRXZlbnQoZXZlbnQpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGV2ZW50LnNpZyA9IE5vc3RyVG9vbHMuZ2V0U2lnbmF0dXJlKGV2ZW50LCBwcml2a2V5KCkpCiAgICAgICAgcmV0dXJuIGV2ZW50CiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGxpa2UobGluayl7CiAgICAgICAgY29uc3QgZXZlbnQgPSBsaW5rLnBhcmVudEVsZW1lbnRbImRhdGEtZXZlbnQiXQogICAgICAgIAogICAgICAgIGF3YWl0IHB1Ymxpc2goewogICAgICAgICAgImtpbmQiOiA3LAogICAgICAgICAgImNvbnRlbnQiOiAiKyIsCiAgICAgICAgICAidGFncyI6IFsKICAgICAgICAgICAgWyJlIiwgZXZlbnQuaWRdLAogICAgICAgICAgICBbInAiLCBldmVudC5wdWJrZXldCiAgICAgICAgICBdCiAgICAgICAgfSkKCiAgICAgICAgbGluay5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKCiAgICAgICAgY29uc3QgaW1hZ2VpZCA9IGxpbmtbImRhdGEtaXRlbS1pZCJdIHx8IGxpbmsuZGF0YXNldC5pbWFnZUlkCiAgICAgICAgCiAgICAgICAgaWYoaW1hZ2VpZCl7CiAgICAgICAgICBnaWQoaW1hZ2VpZCkucXVlcnlTZWxlY3RvcigiLmxpa2UiKS5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHByZXBhcmVfZXZlbnQoZXZlbnQpewogICAgICAgIGV2ZW50LnB1YmtleSA9IGF3YWl0IHB1YmtleSgpCiAgICAgICAgZXZlbnQuY3JlYXRlZF9hdCA9IHBhcnNlSW50KERhdGUubm93KCkgLyAxMDAwLCAxMCkKICAgICAgICBjb25zb2xlLmxvZygic2VyaWFsaXplIGV2ZW50IiwgSlNPTi5zdHJpbmdpZnkoZXZlbnQpKQogICAgICAgIGV2ZW50LmlkID0gTm9zdHJUb29scy5nZXRFdmVudEhhc2goZXZlbnQpCiAgICAgICAgY29uc29sZS5sb2coInNlcmlhbGl6ZSBldmVudCBvayIpCiAgICAgICAgcmV0dXJuIGV2ZW50CiAgICAgIH0KICAgICAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBwdWJsaXNoKGV2ZW50KXsKICAgICAgICBldmVudCA9IGF3YWl0IHByZXBhcmVfZXZlbnQoZXZlbnQpCiAgICAgICAgY29uc29sZS5sb2coInNpZ24gZXZlbnQiLCBldmVudCkKICAgICAgICBsZXQgc2lnbmVkZXZlbnQgPSBhd2FpdCBzaWduKGV2ZW50KQogICAgICAgIAogICAgICAgIGNvbnNvbGUubG9nKCJwdWJsaXNoIGV2ZW50Iiwgc2lnbmVkZXZlbnQpCiAgICAgICAgCiAgICAgICAgbGV0IGpzb24gPSBKU09OLnN0cmluZ2lmeShbIkVWRU5UIiwgc2lnbmVkZXZlbnRdKQogICAgICAgIHNvY2tldHMuZm9yRWFjaChzID0+IHMuc2VuZChqc29uKSkKICAgICAgICAKICAgICAgICByZXR1cm4gZXZlbnQKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gc3dpcGUob2Zmc2V0KXsKICAgICAgICBpZihpbWFnZW9mZnNldChvZmZzZXQpKXsKICAgICAgICAgIGltYWdlb2Zmc2V0KG9mZnNldCkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIHRoaXNbb2Zmc2V0ID09IC0xICYmICJsYXN0YWN0aXZlIiB8fCAiYWN0aXZlIl0oKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgdXBkYXRlc2hvdygpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVzaG93KCl7CiAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5zdHlsZS5kaXNwbGF5ID09ICJibG9jayIpewogICAgICAgICAgaGlkZXZpZGVvKCkKICAgICAgICAgIHNob3coYWN0aXZlKCkuaWQpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgZSA9PiB7CiAgICAgICAgaWYoWyJUYWIiLCAiQXJyb3dMZWZ0IiwgIkFycm93UmlnaHQiLCAiQXJyb3dVcCIsICJBcnJvd0Rvd24iXS5pbmNsdWRlcyhlLmtleSkpewogICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiRXNjYXBlIil7CiAgICAgICAgICBtZW51KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLmtleSA9PSAiRW50ZXIiICYmIGUudGFyZ2V0LnRhZ05hbWUgPT0gIkJPRFkiKXsKICAgICAgICAgIGlmKHFzKCIjbWVkaWEtY29udGFpbmVyIikuc3R5bGUuZGlzcGxheSA9PSAiYmxvY2siKXsKICAgICAgICAgICAgaGlkZW1lZGlhKCkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHNob3coYWN0aXZlKCkuaWQpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd1VwIiAmJiBpbWFnZW9mZnNldCgtY29scygpKSl7CiAgICAgICAgICBpbWFnZW9mZnNldCgtY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgbGFzdGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICB1cGRhdGVzaG93KCkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd0Rvd24iICYmIGltYWdlb2Zmc2V0KGNvbHMoKSkpewogICAgICAgICAgaW1hZ2VvZmZzZXQoY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgYWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIHVwZGF0ZXNob3coKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93TGVmdCIpewogICAgICAgICAgc3dpcGUoLTEpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dSaWdodCIpewogICAgICAgICAgc3dpcGUoMSkKICAgICAgICB9CiAgICAgIH0pCgogICAgICBhc3luYyBmdW5jdGlvbiBoYW5kbGVxdWVyeXJlcyhyZXMsIHNvY2tldCwgcSwgdHlwZSwgc3RpbWUpewogICAgICAgIHNhdmUoc29ja2V0LCByZXMsIHEsIHR5cGUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkKICAgICAgICBsb2coInF1ZXJ5IHJlcyIsIHJlcy5sZW5ndGgsIHNvY2tldC51cmwpCiAgICAgICAgcXVlcnljb3VudC0tCiAgICAgICAgaWYocXVlcnljb3VudCA9PSAwKXsKICAgICAgICAgIHFzKCIjbG9hZGluZyIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSIKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbGV0IHdhaXQgPSB3YWl0bXMgLSAoRGF0ZS5ub3coKSAtIHN0aW1lKQogICAgICAgIHF1ZXJ5d2FpdCA9IHNsZWVwKHdhaXQpCiAgICAgICAgYXdhaXQgcXVlcnl3YWl0LnByb21pc2UKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcHJpbWFsZ2xvYmFsKHNvY2tldCl7CiAgICAgICAgbG9nKCJnbG9iYWwiLCBzb2NrZXQudXJsKQogICAgICAgIHF1ZXJ5Y291bnQrKwogICAgICAgIHFzKCIjbG9hZGluZyIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgICAgbGV0IHN0aW1lID0gRGF0ZS5ub3coKQogICAgICAgIGxldCBxaWQgPSAiZ2xvYmFsXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgbGV0IHFpZGxpa2VzID0gImxpa2VzXyIgKyAoKytpZGNvdW50ZXIpCgogICAgICAgIGlmKG5ld2xpa2VzLmxlbmd0aCA+IDApewogICAgICAgICAgcHJpbWFsc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoWwogICAgICAgICAgICAiUkVRIiwgCiAgICAgICAgICAgIHFpZGxpa2VzLCAKICAgICAgICAgICAgewogICAgICAgICAgICAgICJjYWNoZSI6IFsKICAgICAgICAgICAgICAgICJldmVudHMiLCB7CiAgICAgICAgICAgICAgICAgICJldmVudF9pZHMiOiBuZXdsaWtlcwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIF0KICAgICAgICAgICAgfQogICAgICAgICAgXSkpCgogICAgICAgICAgY29uc3QgbGlrZV9ldmVudHMgPSAoYXdhaXQgd2FpdHJlcyhxaWRsaWtlcykpWzBdCiAgICAgICAgICBuZXdsaWtlcy5zcGxpY2UoMCkKICAgICAgICAgIAogICAgICAgICAgYXdhaXQgc2F2ZShzb2NrZXQsIGxpa2VfZXZlbnRzLCAiIiwgImFsbCIsIHRydWUsIHRydWUsIGZhbHNlKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAiUkVRIiwgCiAgICAgICAgICBxaWQsIAogICAgICAgICAgewogICAgICAgICAgICAiY2FjaGUiOiBbCiAgICAgICAgICAgICAgImV4cGxvcmUiLCAKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidGltZWZyYW1lIjogImxhdGVzdCIsCiAgICAgICAgICAgICAgICAic2NvcGUiOiAiZ2xvYmFsIiwKICAgICAgICAgICAgICAgICJsaW1pdCI6IDUwCiAgICAgICAgICAgICAgfQogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSkpCiAgICAgICAgCiAgICAgICAgY29uc3QgcmVzID0gKGF3YWl0IHdhaXRyZXMocWlkKSlbMF0KICAgICAgICBhd2FpdCBoYW5kbGVxdWVyeXJlcyhyZXMuZmlsdGVyKGUgPT4gZS5raW5kID09IDEpLCBzb2NrZXQsICIiLCAiYWxsIiwgc3RpbWUpCiAgICAgICAgcHJpbWFsZ2xvYmFsKHNvY2tldCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnkoc29ja2V0LCBwcmltYWwpewogICAgICAgIGxvZygicXVlcnkiLCBzb2NrZXQudXJsKQogICAgICAgIHF1ZXJ5Y291bnQrKwogICAgICAgIHFzKCIjbG9hZGluZyIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgICAgCiAgICAgICAgbGV0IHN0aW1lID0gRGF0ZS5ub3coKQogICAgICAgIGxldCBxID0gcXVlcnlzdHIudHJpbSgpCiAgICAgICAgbGV0IHR5cGUgPSBxdWVyeXR5cGUoKQogICAgICAgIGxldCBpID0gKytpZGNvdW50ZXIKICAgICAgICBsZXQgcWlkID0gInF1ZXJ5XyIgKyBpCiAgICAgICAgY29uc3QgbGlrZXNyZXMgPSBhd2FpdCBxdWVyeWxpa2VzKHNvY2tldCkKICAgICAgICAKICAgICAgICBsaWtlc3Jlcy5mb3JFYWNoKGV2ZW50aWQgPT4gewogICAgICAgICAgaWYoIWxpa2VzLmluY2x1ZGVzKGV2ZW50aWQpKXsKICAgICAgICAgICAgbGlrZXMucHVzaChldmVudGlkKQogICAgICAgICAgICBuZXdsaWtlcy5wdXNoKGV2ZW50aWQpCiAgICAgICAgICB9CiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBsZXQgZ2FsbGVyeW1hdGNoID0gcXVlcnlzdHIubWF0Y2goL2c6KFthLXowLTldKykvKQogICAgICAgIGxldCByZXMgPSBudWxsCiAgICAgICAgCiAgICAgICAgaWYoZ2FsbGVyeW1hdGNoKXsKICAgICAgICAgIGNvbnN0IGdhbGxlcnlyZXMgPSBhd2FpdCBxdWVyeWV2ZW50cyhzb2NrZXQsIFszMzNdLCBbZ2FsbGVyeW1hdGNoWzFdXSwgbnVsbCkKICAgICAgICAgIGNvbnN0IGV2ZW50aWRzID0gSlNPTi5wYXJzZShnYWxsZXJ5cmVzWzBdLmNvbnRlbnQpCiAgICAgICAgICByZXMgPSBhd2FpdCBxdWVyeWV2ZW50cyhzb2NrZXQsIFsxXSwgZXZlbnRpZHMsIG51bGwpCiAgICAgICAgICBjb25zb2xlLmxvZygiZ2FsbGVyeSBjb250ZW50IHJlcyIsIHJlcykKICAgICAgICB9ZWxzZXsKICAgICAgICAgIGxldCBmaWx0ZXJzID0gW10KCiAgICAgICAgICBmaWx0ZXJzLnB1c2goLi4uKHR5cGVzW3R5cGVdIHx8IFtdKS5tYXAoKHQpID0+IHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICBraW5kczogWzFdLCAKICAgICAgICAgICAgICBzZWFyY2g6ICIuIiArIHQsCiAgICAgICAgICAgICAgbGltaXQ6IDIwCiAgICAgICAgICAgIH0KICAgICAgICAgIH0pKQogICAgICAgICAgCiAgICAgICAgICBpZihxLmxlbmd0aCA+IDApewogICAgICAgICAgICBmaWx0ZXJzLnB1c2goe2tpbmRzOiBbMV0sIHNlYXJjaDogcX0pCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGlmKGZpbHRlcnMubGVuZ3RoID09IDApewogICAgICAgICAgICBmaWx0ZXJzLnB1c2goe2tpbmRzOiBbMV19KQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBjb25zdCBzZWFyY2hvYmogPSBbIlJFUSIsIHFpZCwgLi4uZmlsdGVyc10KICAgICAgICAgIGNvbnN0IHNlYXJjaGpzb24gPSBKU09OLnN0cmluZ2lmeShzZWFyY2hvYmopCiAgICAgICAgICBzb2NrZXQuc2VuZChzZWFyY2hqc29uKQogICAgICAgICAgCiAgICAgICAgICByZXMgPSAoYXdhaXQgd2FpdHJlcyhxaWQpKVswXQogICAgICAgICAgCiAgICAgICAgICByZXMgPSByZXMuZmlsdGVyKG8gPT4gewogICAgICAgICAgICBpZihxLmxlbmd0aCA+IDApewogICAgICAgICAgICAgIGZvcihsZXQgd29yZCBvZiBxLnNwbGl0KCIgIikpewogICAgICAgICAgICAgICAgaWYoby5jb250ZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZih3b3JkLnRvTG93ZXJDYXNlKCkpID09IC0xKXsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZQogICAgICAgICAgfSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgYXdhaXQgaGFuZGxlcXVlcnlyZXMocmVzLCBzb2NrZXQsIHEsIHR5cGUsIHN0aW1lKQogICAgICAgIHF1ZXJ5KHNvY2tldCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlsaWtlcyhzb2NrZXQpewogICAgICAgIGlmKCFoYXNrZXkoKSl7CiAgICAgICAgICByZXR1cm4gW10KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgbXlwdWJrZXkgPSBhd2FpdCBwdWJrZXkoKQogICAgICAgIGNvbnN0IGV2ZW50cyA9IGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzddLCBudWxsLCBbbXlwdWJrZXldKQogICAgICAgIHJldHVybiBldmVudHMubWFwKGUgPT4gZS50YWdzLmZpbmQodCA9PiB0WzBdID09ICJlIilbMV0pCiAgICAgIH0KCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5ZXZlbnRzKHNvY2tldCwga2luZHMsIGV2ZW50aWRzLCBhdXRob3JzKXsKICAgICAgICBjb25zdCBxdWVyeWlkID0gImV2ZW50c18iICsgKCsraWRjb3VudGVyKQogICAgICAgIGNvbnN0IGZpbHRlcnMgPSB7fQogICAgICAgIAogICAgICAgIGZpbHRlcnMua2luZHMgPSBraW5kcwogICAgICAgIAogICAgICAgIGlmKGV2ZW50aWRzKXsKICAgICAgICAgIGZpbHRlcnNbImlkcyJdID0gZXZlbnRpZHMKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoYXV0aG9ycyl7CiAgICAgICAgICBmaWx0ZXJzWyJhdXRob3JzIl0gPSBhdXRob3JzCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAiUkVRIiwgCiAgICAgICAgICBxdWVyeWlkLCAKICAgICAgICAgIGZpbHRlcnMKICAgICAgICBdKQogICAgICAKICAgICAgICBjb25zb2xlLmxvZygicWUganNvbiIsIGpzb24pCiAgICAgICAgCiAgICAgICAgc29ja2V0LnNlbmQoanNvbikKICAgICAgICAKICAgICAgICByZXR1cm4gKGF3YWl0IHdhaXRyZXMocXVlcnlpZCkpWzBdIHx8IFtdCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5cHVia2V5KHNvY2tldCwgcHViayl7CiAgICAgICAgY29uc3QgcXVlcnlpZCA9ICJxdWVyeV8iICsgKCsraWRjb3VudGVyKQogICAgICAgIHNvY2tldC5zZW5kKHF1ZXJpZXMuYXV0aG9yLnJlcGxhY2UoIjxJPiIsIHF1ZXJ5aWQpLnJlcGxhY2UoIjxQPiIsIHB1YmspKQoKICAgICAgICByZXR1cm4gKGF3YWl0IHdhaXRyZXMocXVlcnlpZCkpWzBdCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHNhdmUoc29ja2V0LCBldmVudHMsIHEsIHF0eXBlLCByZWFjdGVkLCBhcHBlbmQsIHF1ZXJ5bWV0YSl7CiAgICAgICAgbGV0IGV2ZW50cHVia2V5cyA9IFtdCiAgICAgICAgbGV0IHJlc3VsdHMgPSBbXQogICAgICAgIGNvbnN0IGV2ZW50aWRzID0gZXZlbnRzLm1hcChlID0+IGUuaWQpCiAgICAgICAgbGV0IG5ld3VybHMgPSBbXQogICAgICAgIAogICAgICAgIGZvcihsZXQgZXZlbnQgb2YgZXZlbnRzKXsKICAgICAgICAgIGxldCB1cmxzbWF0Y2ggPSBbXQogICAgICAgICAgCiAgICAgICAgICBpZihxdHlwZSAhPSAidmlkZW8iKXsKICAgICAgICAgICAgdXJsc21hdGNoLnB1c2goLi4uKGV2ZW50LmNvbnRlbnQubWF0Y2goaW1ncmVnZXgpIHx8IFtdKSkKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgaWYocXR5cGUgIT0gImltYWdlIil7CiAgICAgICAgICAgIHVybHNtYXRjaC5wdXNoKC4uLihldmVudC5jb250ZW50Lm1hdGNoKHZpZGVvcmVnZXgpIHx8IFtdKSkKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgdXJsc21hdGNoID0gdXJsc21hdGNoLmZpbHRlcih1cmwgPT4gIXVybHMuaW5jbHVkZXModXJsKSkKCiAgICAgICAgICBpZih1cmxzbWF0Y2gubGVuZ3RoID4gMCl7CiAgICAgICAgICAgIG5ld3VybHMucHVzaCh7CiAgICAgICAgICAgICAgZXZlbnQ6IGV2ZW50LAogICAgICAgICAgICAgIHVybHM6IHVybHNtYXRjaAogICAgICAgICAgICB9KQogICAgICAgICAgICAKICAgICAgICAgICAgdXJscy5wdXNoKC4uLnVybHNtYXRjaCkKICAgICAgICAgICAgZXZlbnRwdWJrZXlzLmluY2x1ZGVzKGV2ZW50LnB1YmtleSkgfHwgZXZlbnRwdWJrZXlzLnB1c2goZXZlbnQucHVia2V5KQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBsb2coInF1ZXJ5IG1ldGEiLCBzb2NrZXQudXJsKQogICAgICAgIGxldCBtZXRhZXZlbnRzID0gKHF1ZXJ5bWV0YSAmJiBhd2FpdCBxdWVyeWV2ZW50cyhzb2NrZXQsIFswXSwgbnVsbCwgZXZlbnRwdWJrZXlzKSB8fCBbXSkKICAgICAgICAKICAgICAgICBmb3IobGV0IGVudHJ5IG9mIG5ld3VybHMpewogICAgICAgICAgZm9yKGxldCB1cmwgb2YgZW50cnkudXJscyl7CiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7CiAgICAgICAgICAgICAgcmVhY3RlZDogcmVhY3RlZCB8fCBsaWtlcy5pbmNsdWRlcyhlbnRyeS5ldmVudC5pZCksIAogICAgICAgICAgICAgIHVybDogdXJsLCAKICAgICAgICAgICAgICBldmVudDogZW50cnkuZXZlbnQsIAogICAgICAgICAgICAgIGJlY2gzMmlkOiBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyhlbnRyeS5ldmVudC5pZCkpLAogICAgICAgICAgICAgIG1ldGE6IG1ldGFldmVudHMuZmluZChvID0+IG8ucHVia2V5ID09IGVudHJ5LmV2ZW50LnB1YmtleSkKICAgICAgICAgICAgfSkKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbG9nKCJzYXZlIHJlcyIsIHJlc3VsdHMubGVuZ3RoLCBzb2NrZXQudXJsKQogICAgICAgIHVwZGF0ZWNvbnRlbnQocmVzdWx0cywgcSwgYXBwZW5kKQogICAgICB9CiAgICAgIAogICAgICBsZXQgbG9hZGVkID0gMAogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlY29udGVudChyZXN1bHRzLCBxLCBhcHBlbmQpewogICAgICAgIHJlc3VsdHMucmV2ZXJzZSgpLmZvckVhY2goaXRlbSA9PiB7CiAgICAgICAgICBjb25zdCB0eXBlID0gaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleCkgJiYgInZpZGVvIiB8fCAiaW1hZ2UiCiAgICAgICAgICBjb25zdCB0ZXh0ID0gKHEgfHwgInZpZXcgbm90ZSIpLnN1YnN0cmluZygtMzApCiAgICAgICAgICBjb25zdCBpZCA9ICJpdGVtXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgICBjb25zdCBjb250ZW50ZWxlbWVudHMgPSAnPGRpdiBjbGFzcz0idHlwZSI+JyArIHFzKCIjdGVtcGxhdGUgLiIgKyB0eXBlICsgInN2ZyIpLm91dGVySFRNTCArICc8L2Rpdj48YSBjbGFzcz0ibGlrZScgKyAoaXRlbS5yZWFjdGVkID8gJyByZWFjdGVkJyA6ICcnKSArICciIGRhdGEtaXRlbS1pZD0iJyArIGlkICsgCiAgICAgICAgICAgICciIGhyZWY9IiMiPicgKyBxcygiI3RlbXBsYXRlIC5oZWFydHN2ZyIpLm91dGVySFRNTCArICc8L2E+PGEgY2xhc3M9InF1ZXJ5IiBocmVmPSInICsgcHJvdG9jb2wgKyAKICAgICAgICAgICAgaXRlbS5iZWNoMzJpZCArICciPicgKyB0ZXh0ICsgJzwvYT4nCiAgICAgICAgICBsZXQgcm9vdCA9IG51bGwKICAgICAgICAgIGxldCB2ID0gbnVsbAogICAgICAgICAgCiAgICAgICAgICBpZihpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KSl7CiAgICAgICAgICAgIHJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKQogICAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoInZpZGVvLWNvbnRhaW5lciIpCiAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MID0gY29udGVudGVsZW1lbnRzCiAgICAgICAgICAgIAogICAgICAgICAgICB2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKQogICAgICAgICAgICB2WyJkYXRhLWl0ZW0taWQiXSA9IGlkCiAgICAgICAgICAgIHYucHJlbG9hZCA9ICJub25lIgogICAgICAgICAgICB2Lmxvb3AgPSB0cnVlCiAgICAgICAgICAgIHYucGxheXNpbmxpbmUgPSAiIgogICAgICAgICAgICAKICAgICAgICAgICAgdi5vbmNhbnBsYXkgPSBhc3luYyBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICBjb25zdCBhc3BlY3QgPSB0aGlzLnZpZGVvV2lkdGggLyB0aGlzLnZpZGVvSGVpZ2h0CiAgICAgICAgICAgICAgaWYoYXNwZWN0ID4gMSl7CiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLndpZHRoID0gKGFzcGVjdCAqIDEwMCkgKyAiJSIKICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUuaGVpZ2h0ID0gKDEgLyBhc3BlY3QgKiAxMDApICsgIiUiCiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLm1hcmdpblRvcCA9IC0oKDEgLyBhc3BlY3QgKiAxMDAgLSAxMDApIC8gMikgKyAiJSIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgdXBkYXRldmlkZW9wbGF5KHRoaXMucGFyZW50RWxlbWVudCkKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29uc3QgZXh0ID0gaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleClbMV0KICAgICAgICAgICAgdi5pbm5lckhUTUwgPSAnPHNvdXJjZSBzcmM9IicgKyBpdGVtLnVybCArICciIHR5cGU9InZpZGVvLycgKyBleHQgKyAnIj48L3NvdXJjZT4nCiAgICAgICAgICAgIAogICAgICAgICAgICByb290LmFwcGVuZCh2KQogICAgICAgICAgfWVsc2UgaWYoaXRlbS51cmwubWF0Y2goaW1nZXh0cmVnZXgpKXsKICAgICAgICAgICAgcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKQogICAgICAgICAgICByb290LmhyZWYgPSAiIyIKICAgICAgICAgICAgcm9vdC5pbm5lckhUTUwgPSBjb250ZW50ZWxlbWVudHMKICAgICAgICAgICAgICAKICAgICAgICAgICAgaWYodHlwZSA9PSAiaW1hZ2UiKXsKICAgICAgICAgICAgICAvL2xldCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKQogICAgICAgICAgICAgIC8vaW1nLmFsdCA9IGl0ZW0udXJsCiAgICAgICAgICAgICAgcm9vdFsiZGF0YS1zcmMiXSA9IGl0ZW0udXJsCiAgICAgICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJpbWciKQogICAgICAgICAgICAgIC8vaW1nLmNsYXNzTGlzdC5hZGQoImRhdGEiKQogICAgICAgICAgICAgIC8vcm9vdC5hcHBlbmQoaW1nKQogICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICByb290LmlubmVySFRNTCArPSAnPHNwYW4gY2xhc3M9ImZpbGUiPicgKyBpdGVtLnVybCArICc8L3NwYW4+JwogICAgICAgICAgICB9CiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHJvb3QuaWQgPSBpZAogICAgICAgICAgcm9vdC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJwogICAgICAgICAgcm9vdFsiZGF0YS1pdGVtIl0gPSBpdGVtCiAgICAgICAgICByb290WyJkYXRhLWV2ZW50Il0gPSBpdGVtLmV2ZW50CiAgICAgICAgICByb290WyJkYXRhLXF1ZXJ5Il0gPSBxCiAgICAgICAgICByb290WyJkYXRhLXRleHQiXSA9IHRleHQKICAgICAgICAgIAogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKHR5cGUpCiAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoIml0ZW0iKQogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJzaG93IikKICAgICAgICAgIAogICAgICAgICAgaWYoaXRlbS5yZWFjdGVkKXsKICAgICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgcXMoIiNpbWFnZXMiKVthcHBlbmQgJiYgImFwcGVuZCIgfHwgInByZXBlbmQiXShyb290KQogICAgICAgICAgCiAgICAgICAgICBpZih2KXsKICAgICAgICAgICAgdXBkYXRldmlkZW9wbGF5KHJvb3QpCiAgICAgICAgICB9CiAgICAgICAgfSkKCiAgICAgICAgdXBkYXRlaW1hZ2VzbG9hZCgpCiAgICAgICAgCiAgICAgICAgaWYoYWN0aXZlKCkgPT0gbnVsbCl7CiAgICAgICAgICBxcygiI2ltYWdlcyAuaXRlbSIpPy5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGlkZW1lZGlhKCl7CiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICJzY3JvbGwiCiAgICAgICAgcXNhKCIjbWVkaWEtY29udGFpbmVyLCAjaW1hZ2UsICNtZWRpYS1mb290ZXIiKS5mb3JFYWNoKG4gPT4gbi5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiKQogICAgICAgIGdpZCgiaW1hZ2UtbGlrZSIpLmNsYXNzTGlzdC5yZW1vdmUoInJlYWN0ZWQiKQogICAgICAgIGhpZGV2aWRlbygpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGhpZGV2aWRlbygpewogICAgICAgIGNvbnN0IHYgPSBxcygiI21lZGlhLWNvbnRhaW5lciB2aWRlbyIpCiAgICAgICAgCiAgICAgICAgaWYodil7CiAgICAgICAgICB2Lm11dGVkID0gdHJ1ZQogICAgICAgICAgZ2lkKHZbImRhdGEtaXRlbS1pZCJdKS5hcHBlbmRDaGlsZCh2KQogICAgICAgICAgdXBkYXRldmlkZW9wbGF5KHYucGFyZW50RWxlbWVudCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHdhaXRyZXMoa2V5LCB0eXBlKXsKICAgICAgICBsZXQgcmVzaGFuZGxlciA9IGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7CiAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlIHx8ICJFT1NFIgogICAgICAgICAgdGhpcy5ldmVudHMgPSBbXQogICAgICAgICAgdGhpcy5oYW5kbGUgPSBmdW5jdGlvbihyZXMpewogICAgICAgICAgICBsZXQgbyA9IEpTT04ucGFyc2UocmVzLmRhdGEpCiAgICAgICAgICAgIGlmKGtleSA9PSBudWxsIHx8IG9bMV0gPT0ga2V5KXsKICAgICAgICAgICAgICBpZihvWzBdID09IHRoaXMudHlwZSl7CiAgICAgICAgICAgICAgICByZXNvbHZlKFt0aGlzLmV2ZW50cywgb10pCiAgICAgICAgICAgICAgICByZXNoYW5kbGVycy5zcGxpY2UocmVzaGFuZGxlcnMuaW5kZXhPZih0aGlzKSwgMSkKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgdGhpcy5ldmVudHMucHVzaChvWzJdKQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICBsZXQgaGFuZGxlciA9IG5ldyByZXNoYW5kbGVyKHJlc29sdmUsIHJlamVjdCkKICAgICAgICAgIHJlc2hhbmRsZXJzLnB1c2goaGFuZGxlcikKICAgICAgICB9KQogICAgICB9CiAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gY2hlY2t1cGRhdGUoc29ja2V0KXsKICAgICAgICBjb25zdCB1cGRhdGVzcmVzID0gYXdhaXQgcXVlcnlwdWJrZXkoc29ja2V0LCB1cGRhdGVzcHVia2V5KQogICAgICAgIGNvbnN0IHVwZGF0ZW5vdGUgPSB1cGRhdGVzcmVzLmZpbmQobiA9PiBuLmNvbnRlbnQubWF0Y2goL15odHRwc1w6XC9cLy8pKQogICAgICAgIAogICAgICAgIGlmKCF1cGRhdGVub3RlKXsKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBhZ2UgPSBNYXRoLnJvdW5kKChEYXRlLm5vdygpIC8gMTAwMCAtIHVwZGF0ZW5vdGUuY3JlYXRlZF9hdCkgLyAzNjAwIC8gMjQpCiAgICAgICAgY29uc3Qgbm90ZWlkID0gYmVjaDMyLmVuY29kZSgibm90ZSIsIGZyb21IZXhTdHJpbmcodXBkYXRlbm90ZS5pZCkpCiAgICAgICAgcXMoIiNyZWxlYXNlIikuaHJlZiA9IHByb3RvY29sICsgbm90ZWlkCiAgICAgICAgcXMoIiNyZWxlYXNlIikuaW5uZXJUZXh0ID0gKGFnZSA9PSAwICYmICJ0b2RheSIgfHwgYWdlICsgIiBkYXkocykgYWdvIikKICAgICAgfQoKICAgICAgZnVuY3Rpb24gc2xlZXAobXMpewogICAgICAgIHJldHVybiBuZXcgZnVuY3Rpb24oKXsKICAgICAgICAgIGxldCB0aW1lb3V0ID0gbnVsbAogICAgICAgICAgbGV0IHIgPSBudWxsCiAgICAgICAgICAKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHByb21pc2U6IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7CiAgICAgICAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSgpLCBtcykKICAgICAgICAgICAgICByID0gcmVzb2x2ZQogICAgICAgICAgICB9KSwKICAgICAgICAgICAgcmVzb2x2ZTogZnVuY3Rpb24oKXsKICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCkKICAgICAgICAgICAgICByKCkKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gc2hvdyhpZCl7CiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICJoaWRkZW4iCiAgICAgICAgY29uc3QgaXRlbSA9IGdpZChpZClbImRhdGEtaXRlbSJdCiAgICAgICAgY29uc3QgbWVkaWEgPSBnaWQoIm1lZGlhLWNvbnRhaW5lciIpCiAgICAgICAgY29uc3QgaW1hZ2UgPSBnaWQoImltYWdlIikKCiAgICAgICAgaWYoaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleCkpewogICAgICAgICAgaW1hZ2Uuc3R5bGUuZGlzcGxheSA9ICJub25lIgogICAgICAgICAgY29uc3QgdiA9IGdpZChpZCkucXVlcnlTZWxlY3RvcigidmlkZW8iKQogICAgICAgICAgcXMoIiNtZWRpYS1jb250YWluZXIiKS5hcHBlbmRDaGlsZCh2KQogICAgICAgICAgdi5tdXRlZCA9IGZhbHNlCiAgICAgICAgICB2LnBsYXkoKQogICAgICAgIH1lbHNlewogICAgICAgICAgaW1hZ2Uuc3JjID0gaXRlbS51cmwKICAgICAgICAgIGltYWdlLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGl0ZW0ubWV0YSl7CiAgICAgICAgICBjb25zdCBtZXRhY29udGVudCA9IEpTT04ucGFyc2UoaXRlbS5tZXRhLmNvbnRlbnQpCiAgICAgICAgICBjb25zdCBuYW1lID0gbWV0YWNvbnRlbnQuZGlzcGxheV9uYW1lIHx8IG1ldGFjb250ZW50Lm5hbWUKICAgICAgICAgIHFzKCIjaW1hZ2UtdXNlciIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgICAgICBxcygiI2ltYWdlLXVzZXIiKS5ocmVmID0gcHJvdG9jb2wgKyBiZWNoMzIuZW5jb2RlKCJucHViIiwgZnJvbUhleFN0cmluZyhpdGVtLm1ldGEucHVia2V5KSkKICAgICAgICAgIHFzKCIjaW1hZ2UtdXNlciIpLmlubmVyVGV4dCA9IG5hbWUKICAgICAgICB9ZWxzZXsKICAgICAgICAgIHFzKCIjaW1hZ2UtdXNlciIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSIKICAgICAgICB9CgogICAgICAgIGdpZCgiaW1hZ2UtbGlrZSIpWyJkYXRhLWl0ZW0taWQiXSA9IGlkCiAgICAgICAgZ2lkKCJtZWRpYS1mb290ZXIiKVsiZGF0YS1ldmVudCJdID0gaXRlbS5ldmVudAoKICAgICAgICBpZihpdGVtLnJlYWN0ZWQpewogICAgICAgICAgZ2lkKCJpbWFnZS1saWtlIikuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGEgPSBxcygiI2ltYWdlLXF1ZXJ5IikKICAgICAgICBhLmhyZWYgPSBwcm90b2NvbCArIGl0ZW0uYmVjaDMyaWQKICAgICAgICBhLmlubmVyVGV4dCA9IGdpZChpZClbImRhdGEtdGV4dCJdCiAgICAgICAgICAKICAgICAgICBtZWRpYS5zdHlsZS5kaXNwbGF5ID0gZ2lkKCJtZWRpYS1mb290ZXIiKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBjb25uY291bnQoKXsKICAgICAgICByZXR1cm4gc29ja2V0cy5maWx0ZXIociA9PiByLnJlYWR5U3RhdGUgPT0gMSkubGVuZ3RoCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGRpc2Nvbm5lY3QoKXsKICAgICAgICBmb3IobGV0IHNvY2tldCBvZiBzb2NrZXRzKXsKICAgICAgICAgIHNvY2tldC5jbG9zZSgpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHNvY2tldHMuc3BsaWNlKDApCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGxvZyhtc2cpewogICAgICAgIGxldCBzY3JvbGwgPSBxcygiI2xvZ3MiKS5zY3JvbGxUb3AgPT0gcXMoIiNsb2dzIikuc2Nyb2xsVG9wTWF4CiAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikKICAgICAgICBkaXYuaW5uZXJUZXh0ID0gQXJyYXkuZnJvbShhcmd1bWVudHMpLmpvaW4oIiAiKQogICAgICAgIHFzKCIjbG9ncyIpLmFwcGVuZChkaXYpCiAgICAgICAgCiAgICAgICAgc2Nyb2xsICYmIHFzKCIjbG9ncyIpLnNjcm9sbFRvKDAsIHFzKCIjbG9ncyIpLnNjcm9sbFRvcE1heCkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gY29ubmVjdCh1cmwpewogICAgICAgIGxvZygiY29ubmVjdGluZyIsIHVybCkKICAgICAgICBsZXQgc29ja2V0ID0gbmV3IFdlYlNvY2tldCh1cmwpCiAgICAgICAgCiAgICAgICAgc29ja2V0Lm9ubWVzc2FnZSA9IG1lc3NhZ2UgPT4gcmVzaGFuZGxlcnMuZm9yRWFjaChyaCA9PiByaC5oYW5kbGUobWVzc2FnZSkpCiAgICAgICAgCiAgICAgICAgc29ja2V0Lm9uY2xvc2UgPSBhc3luYyBmdW5jdGlvbigpewogICAgICAgICAgc29ja2V0cy5zcGxpY2Uoc29ja2V0cy5pbmRleE9mKHNvY2tldCksIDEpCiAgICAgICAgICBxcygiI2Nvbm5jb3VudCIpLmlubmVyVGV4dCA9IGNvbm5jb3VudCgpICsgKHByaW1hbHNvY2tldCAmJiAxKQogICAgICAgICAgbG9nKCJkaXNjb25uZWN0ZWQiLCB0aGlzLnVybCwgY29ubmNvdW50KCkpCiAgICAgICAgICBhd2FpdCBzbGVlcCgxMDAwKS5wcm9taXNlCiAgICAgICAgICBjb25uZWN0KHRoaXMudXJsKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXQub25vcGVuID0gZnVuY3Rpb24oKXsKICAgICAgICAgIHFzKCIjY29ubmNvdW50IikuaW5uZXJUZXh0ID0gY29ubmNvdW50KCkgKyAocHJpbWFsc29ja2V0ICYmIDEpCiAgICAgICAgICBsb2coImNvbm5lY3RlZCIsIHRoaXMudXJsLCBjb25uY291bnQoKSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIHNvY2tldAogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgYXN5bmMgKCkgPT4gewogICAgICAgIHByaW1hbHNvY2tldCA9IGNvbm5lY3QoIndzczovL2NhY2hlMy5wcmltYWwubmV0L2NhY2hlMTciKQogICAgICAgIHByaW1hbHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIiwgZnVuY3Rpb24oKXsKICAgICAgICAgIHByaW1hbGdsb2JhbCh0aGlzKQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgcHJpbWFsc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIiwgZnVuY3Rpb24oKXsKICAgICAgICAgIHByaW1hbHNvY2tldCA9IG51bGwKICAgICAgICB9KQogICAgICAgIAogICAgICAgIGZvcihsZXQgdXJsIG9mIHJlbGF5cygpKXsKICAgICAgICAgIGNvbnN0IHNvY2tldCA9IGNvbm5lY3QodXJsKQogICAgICAgICAgc29ja2V0cy5wdXNoKHNvY2tldCkKICAgICAgICAgIAogICAgICAgICAgc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoIm9wZW4iLCBmdW5jdGlvbigpewogICAgICAgICAgICBjaGVja3VwZGF0ZSh0aGlzKQogICAgICAgICAgICBxdWVyeSh0aGlzKQogICAgICAgICAgfSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgYXdhaXQgc2xlZXAoMTAwKS5wcm9taXNlCiAgICAgICAgCiAgICAgICAgaWYoaGFza2V5KCkpewogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJub3N0ciIpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgZm9yKGxldCBjIG9mIGNvbG9wdHMpewogICAgICAgIGRvY3VtZW50LndyaXRlKCc8c3R5bGU+JyArIGNvbHNjc3MuaW5uZXJUZXh0LnJlcGxhY2UoL1wkXHtjb2xzXH0vZywgYykgKyAnPC9zdHlsZT4nKQogICAgICB9CiAgICA8L3NjcmlwdD4KICA8L2JvZHk+CjwvaHRtbD4K
#nostrbot, creating #humanlike #ai for #nostr
installer:
echo "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" | base64 --decode > nostrbot.7z && 7z x nostrbot.7z
shasum -a 256 nostrbot.7z
82e8c3a99f6764a4c4f28fbf7ef3198df4f4fc72aa4837d7b124420159e3efb0
19. kB
#nostrbot, creating #humanlike #ai for #nostr
installer:
echo "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" | base64 --decode > nostrbot.7z && 7z x nostrbot.7z
shasum -a 256 nostrbot.7z
498c28736b9f193eca5c9e35bd1c2970de531801c81e66a9090fdaf64749191f
19. kB
publishing
#nostrbot, creating #humanlike #ai for #nostr
installer:
echo "N3q8ryccAARpDI7S9EsAAAAAAAAkAAAAAAAAAJFTq4DhDOFHSF0AFwvJZxoQAneqSzasFDIuicCCWnDPeUHH5XG8qXOWgh94YoCYYQFT8bT9KVFEtheoxvEBWPeZwl3GxdbH5OtI/fN6hFn5eZt8QI6y9hRkIZ2Q5RLv2Cvc97Qzclpr45sIWMzMwwtw/QvrTwNLdgWaxZQTCCyLjHihL6YFlw++JqtvAz9Il8JvIvVjjwO9VhRqJkJKZf3Vry+R6Mw8LeAntLgU5kj+5z1ufnirp/fsP1/5Keu15pcDnmRYvdQMz7qxWCfsDdaM1KIIFlzCjSuymAChtr6MAIRl96wxmJihcEebwtAW31Y6gdyYBhRsDkbip2P2FEepaWXPlnyYI7EFay10tDtPUxQEUZDQPecLDCzfDCOigAvGVfRTcOnTbcQqZEpFK3HDxwVQjBjnHFdebcX4Rp6W/kgikMO++WwNhCvWdvRTHTgNKx+JncWoNpKZbqCegmQo8hoTzDotgmwaDGD6gZa+mmZsSPJL4snYx2y5sCbcAGAYBHZ93E0vOEQfAv8NgH3WWO9waOIcW0QV1h8hshPbG4Y1N0qlrZ1tt+gFiEr7Q09TLlkNZpqiBfcnbbYkeV8b7AGzmLUAaEZmSNkK+7Pzf6RuIWURgonEg1pA4/3r2WtlVftYRr2eP4EnMTWu+8FtOUN7D2b01FHUBAO1oPUfFXi+4V9nH19Zc8INQT+YwJifToyzTXsuO0IsXjHjPn4+X/hYdTSmqsITEGLpKe7egvNxeEj5UKRrN2aNsiupUPHYDV+mKeU+a7hxW+QGdpSpKKdBBLKHjjx1PUUTppLzANLydx/gHgHluUPe9WxpCNHZuJ8EJ60P82/ozI0XAdh6njvrWDBybzOFDHrTFH/yiY+iYAEjlpTjyu1ESFYt9rebu4O2ve7Ng/3qqnecYIvCDSWT23n61jDYrze63AoGwykpD9Eb93ptkXURwjoc/OyptZawytdH7M++DV3t/B+gbCTn9Nr8gU8qyK8+IWOfKQPd2oNQBxn2iidI9ED2VTbUwtL/iu3XBXYECgcK0A7GUZLgKF+8r20/frAxi25cRYuAMMy2HblDiTHlG+HC+ifL+6cY0B7kUz4YbWG4ytlgL+epdSLcdyZzXeGJpIcmxOKNGdAym5br6UbSmw1gM93bGEtGNZ9IcTqQq9kIy9p+kpHCihLWvYJlQBBwW5xa0StT88iyQwg5AcftOdmX+Yry/t+cw2TCXGDuCh5wlkFVH0XzCSlxtqwa+xuoKGyQhCl3FDETPnW6AJ/JmsT+bSHEWfWZrjlrDduRjs0OgkaGC/uWQO1eaYwCEa1dH1QsRCU5I9rXYSY1lT9rqy907CpmKKx3nad7BIYdVvResWzXHXNw+gHip/QbIgRY8Ho9Vv1rCPldWpq+3NsDml7dmeGAiiKuVtATvarXj2ntYKDpzMFrDYB/IykSR4/XRnDlfRePWT3wEfjtU/yhvl/tiJCXV5NehEG7DwWLJVRi0NIk25PvgfiuYHWD+WjET3nxQn4mDm72w8L9OgcrMe5tPwU4g1cTuty6/h8KK5CKFcmKqw5b4KY4yZQ33DPu8o2DKvdWF15JajxUDaxvT30kMf8vNAz0PUSrrkAIsC2GxVH6lWmL9EZGBWaR5vpcKpLB6oo/QWcW0LKy4ahgtKmxdhl+08Pzug6TTULVgw9xEjRuzRdajKvZZgroTXcUxmrhXJdVsc5rGUnlNYj4XyC/s63PCzdfc1bvVnMa5lAS88asN/A073dPyt6RtKfJT9IuPHPpzg1VV9Ej3y6olEeDr2qC6Oiu51SNv8FAzYyHj7ok7Ype5H6r4MTy6vRsovtWK9p4D7qXN4PWOehrz1ODzUr7SCSYVUB86SOiS/CZ3InQeE/+MstJ6bQ74HuCN7mTTvQ0lN75zi0DqsEH6+UKtomm33vn0gQAvOFgz7bceLmWqP3AFkWOsCfxZZj79vHICxHo8WL+FifHbMCfKOzcf/7XRjqJdElw1iexXhXLUbgT+ixQzQeBPlhqTv6Eay5P1hQW6DgLQQ+YNDtBsMoyMzdQerMAvPnKTMcgKFNcQ+vRibGDZbpwuxR5vwxwksLwVBCfcpf2h1roskN1/8FDO3QjL8HMApK6/9Pq+1kTFPSD+kYsSRxDYqpTzmdQsPW8Rl8D4AbW6ePG03ZhHRvreFx3/3DlsffB61DwT7ZwejkTMaTTrBTTz62au4bvw/kyxRmN7ccnlnIi0uUbhsrhuxGDKmzRlAUQTvEJqBsiKF7nsAFa8s8i6TUTArLgc7sX17vt8p/4QYkLjluVM/tDXfJGyBx/+iWv3ocGxmIdPz2TO203+OhkYcfSBw+WzVLDls/TGVG9ZCxMt5rguUS/n9TKhJdOqODaXM/ZWSBbylDeWo7BGrQBnDS2CDRWqJDAQdSI9yKF8/yHqyynvX3Nl1zQkaRZo8spvHo02soenKp9veh9+Upxm4+CgyECH9KHPCNTyY93tWbLvU+nCKUHHyNuCSUPcAaumkGO+b/lZ1i+WwWHF39fmFYgTZL0N9w3z9QWWqeKaNcaBOsAh/g5VWq6eh9tu5+DU1RN7nzrHGN8WtQu6T+0dMy1EFb9iwA+Oy5IgdVEFKS6Y+MzlNBjk5V06eC4awZXQy7pkuU/vwq7t+vtlmT00NuhKSuIrmfgvinFxJDlJMeQ+nfulY7tIOLwyrZQtRglaLqTruILQXfMUry52pKjVazTNlYXmxSY1ujrFDlIXEDxJ2bE67mX2ufk9IYoJyMFU/NMarKHXxGRWL9u2Nx1V+rhg0xvtDrxTIbXzi+FzL7x/OKOrZbp4bEczVM3Q0PrhsePly2ug7A85knq+ulO1BKeqn/vkyT3njgg170O6YCOM0refUzIA9y4ksUAyzhVbwOC1p5hNsQQs5OgwkMyui+t5GM5nnP7a2o14mTJSWj5ZQJgWK6G5UW5s0pheDNKMyhsQ/++jvqWgBk6x395dJ3luA0kvxso1TbNKLO3WLjcFlgu23K5N4FA2sd3e5HTIA8o3QBiKumj3AsTAXxJzNelabv2Vqvk7c1ANZvhiJB1sgFBVQKRRlYjuSTPwpvQSe5azBOD0vSaOHU/WMFsTMeO0dM9/Bmcfjmp/4v8m9sWbH2sD4oadCFvqFRYBhipaTn3zye0m8R0KQiMht/C4ZCsuCWS5+eTQ9f40RMOX0mO+Sw6Fs1oy1QIE0PLdKUePi5XyXOQOPd0KMNFHtyri/+D+lDVRDV03B4u8hfhMHKt/RLS3V+BNwpxRZJZXFHc5L2qeh3nL6Ny6I84E/bPa0Q/vZ1tLcHYUimkfxmRy2k2MfUjFw1tEN1Gkuvfx7sBjSnPJWvUtc4s+IuDwmFMwY1/dzuIDiaRfrn4f+kupl4gvIzlD/SEOlz11sinzZiA4naMxpHzUep3ViaGfDr291NrcYUX0aDXsPEFBF+0vofxWqOPh7LPA4rUoRkdXP9NGDmff/0INqCCfM+KGgo3KPHGbsuhihSuegRfukJk5W/Xp02Ti0RB8LRfGzuWn4I1Cb9vXYkYfp8+C2d5D2H9xl0gFkxOC9tbxSqcAw20AVXEo4zNOdz9zFdSdMl5ujFz2OAgzGpQ2ADCq+nAl1GScsRLBQv7uP7Y2n5jxAW5vn9Y6hZiA7ECylkMAsfI9sFQt6bdWj0JEXr1yZ28GQY07qgEOFGmdG5m8K94X2bFNDfb9IjqX92ElKUr4Z9wOssVfysr5mgmPOhySSBziqwK4ONg+D66uPPr591LVd04tYnKLMy75A5kgKyUoaFdr0R5anqrWyaim17uP/OoECx1x0mu2P7R27jBWxL4l/dZ2Jg2kWDp+Rw48/7d7gqOUpELEEgy5uMrMc/s5UDzJwMnUgxGlTRRKCDOU4f6qgZkBQV9skhTqhQzYNYbR2wD/g55PwDcsfbDnwIqzUwIFvkYSFB0WkVXgPmVjYDe/t3ceg5fir0fxgvldueKaysDJ8/iuHBmvk94rEU6q55NQyXWn7Nb0NgF4gZZOcOPEfChA5x6+DV+ROKbxHfX22eZ7r9sMtK2I0YUwOx6InZs4aFvoQqZXqcHMcYkq1GfJ4pqU45VukopyR0/cfIsMqbaw53LfwlmhxL9ePCRcXlLp/lWpfQxKltKMhc+i5/S5a8Snb9fme6Lp9lm2Kw0e6cxOaxf8h8kQ47/KWGpJIJeeJATjnapZygci0a0LDf2Nm2tRUg3CIVSqgkaXUoXuXh9+j/orksKJroCHQL9jcBW33tkFa3yUkBdoFhjVvTu+/FhPQHadaU8FAB+py2+RmHi46K3+TVUGTgpnwcv9q391ZvCkBXM4epiRdXMKtSGtTUS8D36xfZYwI9EA7H1MPGtVFfNnhB6T19aK0QIhW7MrI2qNTzZcXpnO6cmcvgC06+F60Kw8nMfjtw0yLpWW7HE0Wf84sUnDfHE/SZxtAE/UvtG5klkHcXjInkHdo1k2wZ60rYk6j4r/EiQVrVE5hWtxPNcNoMVygFmTI/+zDKBvzpXtA7VzZHm3EOI/tOPCzCeZYeeKurnefHo34BkWCAWOGzZx18EsELkeGrY6yWmhfA4LpmhyGcnLNtCV4U+lBKNme3NDNbBxavHkVsSM8rF7wZnatpRNCiPw/sTJN6TwpwF6JJ7DLif/7JR4klqsQRqQgo53GwpNB6ROqvghpDAK9UUEzIO6mXk9U32YEqJYsktKjoDITr8frGcPiClmzmrNAE47gQLTbFs2cltYXUGXToez0xU4YNiAePbNWaHFZNI1DXAX0O+bMWVTI1PyZ0Gv5CqB+LFst835PovJVnXeG/4jfr7OqRBr2Uno1wtN55uWoV7oZDA+KvmW+1vaJwAbUQDOX6MG1AhXO9KjCSQ7HPAyue3+EV8ysbMO7L6pE9sCkeqzaoXAwF+wInZQfH0wx98MPev+FRJG9XZs1z1GAHhhswoy+yPrITkzhGiyuo8KOKxgbCjGtFcmEF1EFEatC+7nAQIbYyLqu452SidrYkhNXWTixBQMH25SlZ6JJfeOMV90KEe+rgKi0XJtMgqI+WyJsbHGRjHLHnrEda5sfxGnxyN4YKlRHQeuXCo38AzTLWM73B51IJ+hWpF7A7cF+KTne5Hnv5LmLlPGIK+oQEPDLsIZRMZqMHB52UIxhOZpcmYrblwi8lo8BrOSerW5tDDitMprFzORMqn6PkULykBTucYYmePM7YqYMdBw4OFRbV+NRdMuAUCj2vOOdkJFXraW8lFdvvzDGfaorpWo/aCA74wFaWZtfPvcELQkHDOa3DrR9bAkM6uku6bnKmPsDhyfGuRk0qBXbhM5LDMdrmuV8wXPqqDGfZ7K8HpZCm3uinw7WJYeopzLz0XHl+h77mOlawjk4+STIDLPwmkutGsJRHQghfwBahOcdZnMbdNEl0/rwEV3TPUQk3/99MHcgPK4BR9PqlZ4+gMlkrOrfE+TbsHbnSATwlHxh0zcGsSSmSFN8NEgIoXlM7TQ6uV1Axe3BcpsVMAFx4DLcrgpZZo2Hmaxr8L3+3ND3qiRke1A2VG4FU+TsS1YYjwyTiXXribGVzQYu40hoK1GqMdWN6eg0OsGa5r6o3rG894SPh80RGPAbxFp62yxgMAZLURieqQtzA5mtCQ0ekPoWugvuUWf4WLeN33QO7O6pBeb13LobsD22dLU1M52lUkqDrSSVa4b1r0jHPnjM2yjgLFivG37oStL/1ou6q0eRbZDSpXbaD2lEu1UHjrpXHcBRrWfDUuwpZWvSqDjMewNZCTBc2Xl/LLN79rb0Lhl5dUpTpfsRK8IDdPhL/XbJEERnRnH55zgMi9/wq37PV7K5fGuvM7p0Enh71mELT3J5ndmb2RWToFr3XvGiLoStiFRb7GZJYV50WmvNTXF7q+uK7nV0QNewWT2ubS0dHxuTJNfhxOJuM+zLndOvZghD2EWADLWMA4/jRuKs/SrXXV/r8fsF4z5KAjODeRsL4n+PXOj7zsBHHFybhLAW+MSJcog7sNCf1vUdXR2Ie35UOt9rOipx2MZ4JXEXOnXVi9GeGtUcI5xl5Jpcw6RQnmdFKX9LNnrK8D0geFOYprKdDSXRCLxHqO9sIb9mUYD0jCR9sOxOIOPLf5PhWa7dmEJ8WlgcYMO2Ab16HWspsicptgrunRCIWjScHfGikTAtJGFd3Cmf5fzc82olfPuxFCfZMOLTwKrTl9GlHEUtrAgQPiDzffrq3y8O9xp2qgyHVN762IeIY/KyN3NBwyoJW61jDmQiELdZium8HvJ3eMyQoPUDyLKKaUBEjCgY3ejA6bgBEr5XJ9PhuShCUTX4Eh0tEs76H0MbO99ymumYeQ4VJBa/bWUIkX3UfLhsQ1w0LHvOda4Wgq6Y9IKETn2t7Qt0hJJtv48y6rPRolexCFsfNvlpSTbhUB+7YY4clVAypFxrLRX2af//gy/O/3omfmagDaOIfpCYfELofsEqMUEQylurPV4njPoDZ/IyoPSjMDLaq/FEMk1PIW7sWp8FAt5/tnxV2O1ENRda2EUd6Pf4acPxV0L+iwFYqpk8ebyFD4Cicb7r5TtM89iqnjf3XLOjCcZOuntiiTFX9EeB7oQg0XzsH25NkmJ/o5PPRnhtvDnP3ge8u2azdrsNUPCGBXkhQpiWpLG0QQ402qRZJJkSnY6PuU0tRusm1I/TGiQA9PT/hoPgcVFM7oUZWHxd8Ea4FiweRwMeAWC28TBa6zhVFq+K5PAEI8PxYvpR/ppiiAmu2IbPrbMV9Avbh+dMGyvDykENQXqbD9rGu3ZRa1G6OhAZg8qrjXfEqKetLjDJVlbiNiXKrRm56sxP+WF0TADvPzrcolEzysZluoldigj4H5ZNMkBeWgGGzfYHodYk6hUHr9LAVheWgGVXPbQuWDI3YUW3htpyl1PHuj6pN7P1zTZ8xRy15gvhlVE7zlXcwe2dICNpskOCgdSGUJVKeHKPnDWLh+Ghh8U6Di6AfZY0wWqkJaxQNuzj+0BzSuA/1QrcG9atIWYvV/pIrM5JYPWtPkDrQb2Jw2EcO4JBM4L8yVoEPVGfwYxd+L+7pK6mVXjPPld3ci9DeSbv3zNnbMQq8L8xp8R6LwzckrYFqD/lGsZtd9JU0NBK820IZqjmRVdFNyp/TNZCMIBc6PYF+XKBrT9EhI5aARycUJGjt1/Q+u6Jb3oZIyd5PI3SK4dj0r6k1XPlM5sfJYu+PriX2ynpg+STxi8CGtY3swa/lT6VM2MM446sF7uh7OO6AeZxHEtSq8TY/rutVQjwb6Q/fxd52+QaaDoKjL3Lp+2or4v5yENRLiTGCWIK4K8qYGbCxyc5pLdM96EHc85x3OnwN6yeN0+YKy0nsW9FeEgqv8315bmgcSF8uxgl0xvxI9Y4Bels1+zhK8NNYHcUAZttQhH6NTNlQzFvGoH9ZtNAtSPMkEnBR9v33SgEFbF80V+hbWTUOlppOrQn5MVD8306IRFSm+L1jwReTXhGfBWA7tpKFnSTQrlsErYNPDofE312AQfyVhWgYE20HFRlq4x1d9MqpV6veprkC+r+1QyBsCI0NcENxWGh7ba2YtrLBvdpKSgh3wkPOXynfewjQaP27rgd8SLYxgiQ/fUkgMp8cNYn5XssxdUBShkmYo6cXrGMBL2uxEUYI41pPyao6BD7Rv9cjZWhvAaxo4q1FJj/gU3xyiWPeaBjmJ8D+raiwn0QsOLaUi0USlaPxSq7RG2Mq0lXMa7FevbChYs9mk8h1WyFRIJxJEpIqir+7/xZNebEmLtNLpPqgD/7rIkLxZQazfFTMBOKydda32Ers+CASnkIchixkFwoJQyCvoy7ly5YB9S0f6zMCvNE5LC1OFtDgAW1EOmFmSqXU+Ye6a+kNH10Uc3d4Z6DvnDU3ihxPEvjanbawxH1ElKQbZXgNLkhMpZvPV5PXTZ4JcjHSKGCttkJ0oI2AWqbOe88X6rmDod6I91CQQGrUTVNU9p9hN43c9Nol04PaXGZNmGUAGdf591rybKNjcrAxVC4L58aj97+n1/ILKzPhRnVaSaCIviWRwZ8g3kwMQYO0NA+D8CMC/mld0QMxt/6tlVZyRawb36qciRtsmL6eZ6s3Geb+qkUZ2Xkee1oNhN3HCcrXgz6jOr6eOPdUudaJKBdIdIQW7UOsOygO0fRrgKzhV1KAo7RTmATDBOXiQXxPPvMOnpGSUCl+qgSOMKE1MVh3CjO9Y9fyvMUU3qNrTYFd1jFz/klWxfZAAEYo2kaUQ9yf1dsl8sln8MJDayKcnmH4vtWjD5T54e5ipkMqvglC21HwquDDmRPHH8Zpg47tUOSeZpwcbjd6MLhb3lkM9e7fY15P8r/6HkTbqDZe2iXTPId0HKjK5yELFy/voIURab0zklMNsYvYt+1WX4NkU9hd6bHHU5QIiNjQP4jnJBkJ1ndL6aOzTzzzPuln9qKAXeafCWK2SZhDNcuSYtbxYToHQuynqk2XcuG6IE9fBlE7mXzrESAYqEioo3h6sRtwZ9BRIMX1Re2+yCR4tPoQ0UWoOVGtIdCKWnUQKNlRe/X9mCwGZxB76UJ4KJX8O66uwYl1eGAp21i549EwaAOE6DLjLEW0/TfkwpJkF9rNeyhMyX0qXZRj8eMVyP28heCTqqjHeYSRH9i5xm0FPPUV6JCpNhadhd0MrbxnFzKIDPABR2nBiwn5ZFYo4wvFuSG5LqthWhMiPCBd9OZ/1HlUxmV7Uufo+piuCzIc5y2LXa2/rpd2Rc4C62VzI4ns/FE1YKKwFQhF1/3stIaNZhHrWaU6SB7m3jaF2SAZYbzZUQvRrfviWCyDrsnjd4qDYwQJLnHoFWMmW3W9Y1dJTC5y2h/pqPwDVRjfTjRWNRYX94jP4N9iPnYCE6PEqMDb/1RpsJIrApBfUTe98/PFKqf0Er6/d6/ttOx/VLV+erAOScpHXvcBDRsw+hCdLC7sD7GV38vFbK9dwHN+gb8EFGeneN2DWwb1VzUJaQbnBYVV3Kp9Rdlk8RATx0ucXnJWkzcHzUhVILPbiVlW0KbVhfMg3wX2Jz8wu1enm+rYPu0676pAb74BJG4lfdJl9bRWvYlx9VL9rJEucund/5pVr683CF3DZLQueR4Z3kAnnRAlD3fKuwpVrCdMPXMQQdRlnsM5cCsVP3rSumXimCm0JEcXeoEm78ntBHr8GKfEnb8SzY8JV42dMDRb6Rkr/u3Fxae2rs2Dkz1FKFgsL/7ajhpHF8dJynvD+PNFRgD8VuHc2JGnZWbuDtf6qp+fhSfgLkoG2WFRTRvDKr9l+ceE6EEcNHNeqSWbpwhizKMUkln4Wnj97XOOIsDpBFr/qf+HtwOtq+Xuk/45NEy7o9xhGih2cbu5bGhFie+8OGOGi9pLsmwAHd8kXyc5z9ZAZvh7eS2+p35N0RG+8ZfLwYVq0U515/hfqIiwc+8SpWAVHfaTbM/hnQE+GiNzLP7zH0+3eXn/XiXkzD+B8wv9MXqHeIiq0zVL2EyBuPHgwkNAfFNzo9l13fGwmgDWxTkNxdBqpGqZpdLwYnVg+1NsjSc4SGW52DhbMB5wBUej5NYuuijB+q1azTYhRcG2ybyxgGg4dI/BFXlR51fHLv4+A8dv2n5uNXcXd6tMPmaWm+FR5UwuoBmZTglSRXo9WILbc0MkllGkWsAZcGyQ+EQYLaCERLVcOzmHz9xWHoodAI30g3ds6ltnZhOZSPyEZ+ou4rcW0SAHwCAcb9Z7ImhhR7VsVhdDruftgUOJWHNVv+ggbObBaBFtP4phYMDWhB5tdLggtQGGWDizHmRebPw/2NJk+vmeX0U++FZwyBKfvWHzzOI8HNPiUTjPZr1lJqvXAx5ir2QIuqeG279b8Oh08v7vqzx1P5ewBT8aIwgxIVu5YsLLq1PjKMbTUxnaFvHOsk3gxOX6oU4JRbC1GylXuhgugUP5jEFcpBKK9yaQsNZGyZss5NzX8uJB0uAUdazPH1WCd2S+IHjEmF6YEb0i4atdb6rGp5xLDUZCqZqIaK7x/KT2aOlIKDZ3Ffb7pyki4+jQsd26PXQDPIbsVy0epvqYN0LOleggBYP/3W/FlmJYQIpY4cL1JFQRBVR1g4jwf5Ij1Q+io+Prr7JGAgs+u92erlWdEX3Qf8b4dBj4mQNMQRlOUSC3yS9W0MQZjEVeER3IsArTUa8MUMDvrhPdCrRcEIl29mAkY4KGBn3EjPi1b2tLGHjlZNibAA62hWo6UFFppHrhycFvpKkvpuj1PRJVaEvgagkzS7p63dNHmxwHcVClZz2gvLpwVWwV88Ni/2Oc8tKIXzGlQg17BbvqNIFMEs17p832g7SAEk9uyJChdRsyTthAdBMruJu7mwfC+h2DwIeSnsRbbQRt9LJu7yfrGEW656TCkAkI1OqsF+ebY98orjDdI1pX1lpkGnu+Iz8HVFqm/oQhiwjW3+RebfmWzCDaKFU/lGn+zaRocC2wqeVJKJg3AjvqWudmmtxSYIeu8mv6i1WZi/0hbIAL0GFkRa+K8a1QI1xKjSmWY+v465OvEKveijutMBdXEELFtIVsPL4UG4rFMoExTep/DraPR9iimh67TEuW98oDpEdhxOekCu/xPPsPhMCrg7nkG7zxCS8qlZzuIjk7mjktT/CvhWg8Z/DZocciBSVkilzQhAGiVo5DT0aoEvysUoUg4QEFq87nuWuS6T6g9UnTO1RbIQXyOgeTru7QKVEyLWPEaEOEpmWH91hj4+872icv0wP5w5uLyvu0vGb+o0eFQ21gwsA8TAEAdM7qnjTZUE71uxEwH6wFRR58BKkMn+y2QDYESLuHKVVKSpiz+fFw+wQRCfE40FXog7UfwUcwmET6APbhFuDS990XnWjkqJWfb+T682/+c+LUoaYVHE3YP/Wv4Xz05Id5a1NjESjiAKYbXpAY5yZBF7iRXFUbav+k56Z6pSQwzjPR2Wso/BR8yRbWcK8s0q+K9ybcabFz1Ba1Qa5K6j0E3IanFuUc8zXsagsBPoukEfbJF5LN00Y5A8uMbm0jran8Os985Cc6zFdlUvY4c4kvjDTkkwRYMuWuPo3wFYcUF81seDRP89uXe3rP/vRhAJnRtPq1V73mpS9LxTq++Qm40TWsAmoNxgxx9k3Up6xE7lqbhVGEj22FLCa8HBfNPvByWJIneOxKcgpenmaYU74oBHKuadVYt87IWhv1N7cc6LXI8aJp3LmTixp9Tvad/dw14qcF52IK5rg9vPd/09SHHgVUYAtjdZ4eQJuqOHONOWjslUQK6Tkyo7NBL+KUpIOviJ+dzcDK6r1J26lvf2NugjvS2uCwsZ1KS6FyjGKh/Ba1pyAtAUpvP32ol5ka1ZIVFEcvK1X1qardTqZbvq0BUWbAvXvfWBoEvzjcgm9lzPD0uDQgcSdlmH8OuI7nygc3ly1r3vxYyi5Wsxqo0O4w8lpU6yczKSiSCUktgUAPgah/7aQbg6hzRjSabFvog7nhklqORZauwYdYuHYK+nwHmxn+xn3w9dv9EwM4dH/o9W1p9TieYp420SB0jh4X2rn+0TWgblfxcCp//wpZD23KVLN8rSiwlg9S4fE/1G6MQ5PbFDMmPkYwtLZtoFJ+rVsMFZoSKYXRMideIrY6MKMZamdwuC1f9nRQl3QbXm2tFaqU7XnjENm8AyQUoLmgeXq+HwNKZRsAX2h+jk+6muyz+wpuqxvT9anDVWQbZo2stjHrIsdfW6KKtSxTkdJ5NCcWXyyXKGvD3VQFWP32Oy+uAd//78QtGh+tmKW9Qn9/8Snpsnc8x5CbEhrhBd+bEdVwjQ7l1mSygVXmiz1kwj3QS4Q97wU8QY/qmSm78evGpxFuIYQSo46hhlnuJgDNAaF3ZpsILBaYGWxULBYy7m+m1oMjs5LJ3xunuN7z2f62I8oP4vItbRddbsxFRoVx1njJ86WIIaHcRz8erca0Tj58uwWu4Z0NkVF8Gik+2INDXcXQsn1JjpIWtMfDVXVg1kdTQlc2BzRjkVrywV/eKPQ+K2R3rfoeaN0VdpqDLztd2dTqr5hlyrihOSMDnX8+4CwDSXnYxpC3YR7pSMQ6uHo4BN9SVpNccmRo8CnCQNR185TJ4FMEcQ0pIkkSvOkzi0JbhF+gRgnIaA03J0zIDbvOF0eV7UzJN9U+dMLkakpvRXuApwxph8qBdQPmo7pTZz9Xfu5oPgkrHNY5hQBI5D6k527jWuOKB+DSwartZ9eR/El10Jqxct7rMRV8erXbB5n3uUvuxe1K3G7jlbHX9Dy5Shf0zmfJpE8C1lHmEmaGRUasg2J8NqpGQS8YJ2PuNEmGNxpHkZLPoiVE4crIJeEZ64JTO8pcnP7I0SkOONbNA4DiA1Z36gSxAQ8pV3mOBVgTmZUBDBwcPSBmFrRdRbXUDjdl1vYzYIIl8nkkhvYbMLyk3T01kSjtpJHxvd4lgfPxcfzzgh4PkHEsN4PvpJN/ajLlswGiwuUmLaHEagOn8f/+OyKzmnduOSA+m7vVH2+lKJ66GQPYEkVavBU6eTMEycX28ml0cFv2tfOT1XrZGNV5CZUrGUaeLlhEOSIti+/QpQQII+iqnCskOY1CkEzNTChXO6UkqcFLfhXgwRv+As7wFNewG0kP5HxwIZ69Jfv8W8g95ssViCVCzG+L0NiSes+kEdS5r3Y+K0XLTWVLcQig7Q9NHO8uzasxiNKAg5MYuHiG/Lal02B1kB/kZWufbLJW8aqtVxzOD7I1YQCST/p002bpVeBf7kvBcq0+L5cw8W+q3iWA7occ+vsoBm9gSaHyPAX/Q+wl7XZkyDrwocmUHWb0vUBAFmssr3GoP3eo82lES9v4RI5esWti6sNDXcsI989O/lv/4ucC0TZ4j+dw/s0VZ3HEt+O63sycvTryMvzOJrFydhZIYhhBWVyy+mR0QSikVRET129IOtTAjwD71i3igMCdFKXLXG4uolEXtmh2hfAxnQDe26BHMDCv8C9s0ID+kU4hVr8J3+RjMp5N75jxvMJ4gqVqd3OEQTIlm2ZxSScIlpi8mwIcpmtlmMUCaf7fXzMpvGCsi6ZVDmd3+pFMc0v5ozjBbqtK0K0I7YxI4I0P0jlLPEtuxb1LIznPk+ptdB9n/h/vMCc2hd3Latxu4nBuIOZfHG0DDyig2ksuwzMKHWAra4RkBlUOU2u8izQmbyfgUrcBDfeK6sInnq64mUcCB10r+MkpF73evLD8q+PJ0sxDxC72YvHzsH3OW546JW2SKCwkVEHpCkpxHedydAt8a8Rramu9YVHDuXnVEypdCJbQEDQZoxUtMskLx+hUB4y7D2bwl3ntSJpnjKE0Q+nhstlVl4JIsQ6R3rdTmzT/EMqvAxU7idJSpmlPfxbWS1xLu9/aG/BP0yEQLDOeLYj1qC6xezTFxYqPYLJqsZYeu3D9besZELtsnMyeQpjJQwsHpm99ZfQVqulKFa4hFRK90N+Z7WpS1Cd3OAPcMgiBHt6e3V4DSN4QjgBSoyUqT4xq94OzFkqArmHtcB5HMssaIO9BKxboEAi2qfalY9KVcThQ3R8AdLCPadcQ7Rp/rXWtDiK2wHtaq3VMYuban4J0//igRYPwm9/c+L1qs56bNm/dod4mH30QZNPb0g7Gv6mRRFW/bc004eR4HBVMIOuTDNNQtq/pzuhttLujIJJRglQg29DxlWlnXyuYjB6MuPhXSd8A36ii10I+KGPvK27jNcEnv6teMe4J8Dj0pKflHOVXqHcNjQk1Dymb9g++izY8MB2NOh//5N/jHdx+Ud4NgjFTasmF/43/jbpacYOp33SS0ss/JwGTwIRY+0/3MNhRgx4RkgQnnI47kYUuSGtFkYRx3YcTZ+NWoG9YsguVXL9NFVc7n9LAIKcp/yUBsH5OBlPLIKQVgAj6bdFAbekddf25sVwE5IY1FI8gQ0X40sOtpnvARiMKhHSNqbfEj6pS96fdTDlRHVubwF4/SAiec9kKL+5Tk5Kkv0x0nisJAnWhUYrJ3KeoGHcfCYx1cyfrS8p0Fl5ipPP1Uv5nscSDPY38sHLu/Tzo4y4xTlzAjTe24a1VsRs/zBEMBI9QPFrA5tYy2KdKqZo4bxHALoiJqsqjapfehESfOkOlYULNGg05O4KHtXD8Wcj07UnvWI5JAeixxi7IztDhUHtSAVQXfIGEbWwK/OojOn804PvheACjMWeEIZZo5fyjtHX3LNHKBy6M/JJqs/xOD2Ps/ww4bWsEaKExolI7I8XKZ4m4Lu/dFJiPhDRboRd/A/NWtJIJNXlF9OWyDPKWkcm3MB+OKdTgO/TDCVAOwWXcj3up6+5IQhRaBVSubeL6HqC3moOWIIW3rVkVVMEbG+0wiIWQwtzOeHyMX9PZDreQOL5iLxRpZQCCW1gMvMMjihk0qLTEZ7VEb7WFMOvz8p09V+5nedLZpstT6kVgNS2w6Bgn7bpglhbphZqWM8VWHR6+7gmmShhSpEFr8zMQTbXOGXLzv8fCzkhDPUXgbeRRdWsHUFGGz97bKIpQM/fct3oK7d3IgOvRAk6SvWlPaZYe+qccM5XAFhdqLitPk40gvLvBUJZH8UxXs7xAqFrkTCRvkUftW6cr/X6LuZtz3I8cwGFAQ9eagArKtVZ0Kp7piX9IB9uV78htp4ekgwC90OtgeHLzo1iLfXIvSY1YSW5FgyASRFAKW29htLI90JH9h4AkADu+cKXJPkEGGoJJ4UBascmcMyx3MU26rFccsQc+qHQYL1BNIHkmL1wqeiStdcDk4JZxuRikd5TqpWRovdMgPZVLplSfQwFnD3uuLz9XcpytF150nXHeneEsOb2w+pO0YX0C8U0QEP2UhajzEiRvWt55vQW/a4q2GloA5Wi7OmKSyWRQc0zj209Lw4S84YJQo527vyHrp9RbGdW0qIv6lvxUscibREcuKKDVydx6oETl5BRzZJMWSpqw8MMPblnxQrupNBZMYo+iJ7sYrLeczW2DbYb0UeFz6gZrGfLQnlUpRvt4x8tJKTZuaXEeaB2Q7u3Z9U7P3XKP2bt3o9uzvPspSK1QnGZMwJLBiP6chwx26vR4mAuwo8XyV4nTijqNK0RN/LqYD/EQGfaAZ0ElM1vsN5i3uTw/+2MVNaie3b0y++LjCzItLj+NFWrxJOelpb7aewxFVNaR9XKTlA3rFhkBEyz8Xc1opqBqeqY+1kNEbe+p6OqM7tljnfUJKPF89HY9a5Y7xcVTLQh2xS/JcSjyBQ9wx7JmTmDXW9RGtUQ9Uz4kijH+Y9a+yLTeb1+CKCVszOO6UbZn9Y/+5H8hzh57lok1qwrPmLnloJCn0sowukd/5THoxJgsCauKYq/p8cuH6zcbObDUJ0yBqmzGQhK8+r2D01JAa6tIFRHnB2eupAcIpSUdy3a9QRE34yG+cWZoRW3j5U/4kQ2RuGwODHRrtNPwff1ZO70phY6RQcrw1W39V++ZZ5P6vp8MhLQkw82O4Ma0PkgONn16dnyABcZgmVtEmuS0EN3n9C85VqDDh5ECZuw4N2zvkHKV/IsdWnBtPoVudrNtluS2m+ZDNDubvme9gr4lmabfrIN8XgzkAdmC/+G/Jlv2Di0ADbzdlSgv84MWo6ZAihV1FX/lnuVhLTqip8pjTmiLCPk7DE0fh9RWbAgGWfFu9gmciWl0MwH3fcxQ9VibUpCwR3cAinqPSEkcAa48bjeqD4Xf5wQCFz+6Fg96TdcFWbtqAZADDFgCc4llvuclp/t/TQJxs+Gg5s/QhVG8dR+JvtpTsIwnGGMD70k38mpCVMLGtYPV5s7ncUhfyzNj7lU/KoTygDAnpSlJg+stSPu9uwa16Gg0///L/ToAMVGzgDy7VUsIblhQ1ZKvppMgrf4QArNKfdOKMYLb6qfDQYrOnm8zjC+h9MscVjynJw3WLZTnnnYYvHynrWEoN2RC7n1XAKB/2Fr2/FCNbx5NZUgizzlpyun6WxCJlVyys+D9ncPiPVVJtHMY2V+ZqDqUjSdJtxl3oOZcPeHWX5QVm/Xhf1VQEzHcXvNM7Mm4bnhfI7EUQ4lHQLvOYHrkzatTylwv2vvu0IfcsFWd+KEAcHkQM8ddbpwEzZIBGjQEsghKrpa3C6JWEudj62gvOARRNsyr9NjloDjafxy+YwEcMuXmchI4hBsS+6Jka+mRWvPvkL3tqKxrLftsKnKeDYFUEFvyUWl5J5a0hV0CwwX9vKx0MAORTa4kC8iSDU37zLpcazf0Rd3k2Cgr8G+qozNEcfa1u7IwF2KP6uEWkTz4g56wQOnsZPJhp7X2s4ChaOMzXxrxHujuBoTR+jstGzeDGmA0Oz8e0zyTVjubmb8hD6yoF1j6j/gX6nAv4wo3Md4dR7tTLrShizEQlHXppj3dQJTbMHAsj5MtShTyYAgzNoV2Z0XO4pCy4UMXhrhALY/9k70Kbh4YoF+Z3Hygd/Bqd4kAYxEre7IM6idCd+NEv4ClMFNt5i0RxpsRME79e9poAsRIe/0bW8DdqlZ8bFeXIetrIvBIr2cPHw+a1zC4cRC5FQ9DOYAn+LlQnpIHayn/w5uz+gOGYHNT87dlTG6wPAKSRnM1o9newmNrq+yfUdiXX+egeP3Mzbg50JMgPK1fugWSg8iI1ausad+20dAUzp0EBv0nQxcf8GARMr+WZajyYLWTLdYSWKLsJVpDeX0fsKvqD6P0gJoiX09bFN7UBU6ru/5zxXT21ZUX8GkCB+xJe7lNcDMcAKBPj4tiARWxc73eZfa0ShJsTdEkPlaNJYijVhPaaHs0JTjqY/pXwcv3rEAWdCm9/YWpeS2xjret909hbUxEpmoR4vFRsq3Tb2f+oFrTTPiTtWQfO4T7/CPqLo7rxROqhbAdo1hffYy8znfH793HJOPbIFBBE5ytj31DY7jl0Y9/QcKZF6+rU4Ek2q4e74nqWLPY7qZFxOVliTRODihzfm41v84/ZViBdva8b2XKEwbg3FlhDfLyxgMMzH1S7Q1A+62AxCGERyYDIa9yD6VCadkPL4F2POS37Jx+usK3AluEwOF3ZrEZnAunVWOI3s8JhowqDWllyG7qrwdwQewp92YPpcOPV6JwAH/a/aiJK3diA9POBeYTWrm/LvTC96AE2LyfDcwu5mPib8oMpPYeuOHCuwueVfiaHvh4P5t1w7so38O4ChbjrAVrP+1rLYTkyhLG4eBEuIG8BRqj2miN8jPl+aL7/+se/w1ZtUpkUxU84QHQtPHyhjT3m75aCSwb6mjmfz01rqpZKdVSBsKrby5pActCLvQmi7HmEDVhHS0ajUiWDcNPl0OX+FuDJ4G7tmcOjql/Na5Xy1s+WobjQVhmoeVomnPoQA97PtzrarwVY88HHETnDtI5dOuKoI5dGGBDVLmAAuJDwhuhQJJjJ6VtJEsWCXm5sDSXS4GF7MGa+vh8aY6iyq53lFv9hXG0rn9i35hJIuknUCO9wSNhKMCFnbsQWCE2VHBTG90kzQKj0ywd+tVgM9D94gkb+7518EfzbZWPJtuECRex7SAYWCSPx/AIwV3WD0vpIFydZKqVCufgKq+vMYXE7k7zKdPfPjrDR7kdkh/kAbwlixqme8bUTaz/6/c0n2pGkKTK0ywi12S2QltM3b4vVmeyaMwzRcqa+ZPYHMM6IJOb6S4GfB0BnKfQvIp9HZDlq4jsThAppMfQlW0EvbenIq04q6seS0nwwiaw2crxwS3hfvuLXSjyz6NuvnA5wTyN3h0cqX/QxDm6y/OzjNJNUNG+ZtiYwaMuZOR5EAhatsD84TCAuUPmQetr3GNgws65jD03yRLQxiu7lmIyN9fnm0JksogBgzrISZdmqL1PxrYjG1cWcAQ1TRGPAN4BamtrTR/X6aN/0aGDMSmZ1mGc/DJN42OHsScQThImzaW4381vF+Nu7dBC0gIzjQ7mSJJCxDrO1robQIAug8+Qx3mrfFaFoZG1MOZI6Mx0rOhxgSkdwQIb4dIDsPBAFuy/o5PjKnsqSTSXZzmaROCHJz/6yDoZfiJa5k7u1ULs5KiPvjh8Sy77iizx/W8LxzFVmDayhn9ziQWyZ3HBz7edd7No9Qh3pMrQuJsaQt+n45oez2r4j9lnHmaa6ZLD3uSbJG+fXiLPkpGQWJ76okfrZWywF92cloQxfy1iBNJnf6TEfLIVX3j2/oHcIbLB2KVMLoY4kf/dihcivgiBVmhnmyyiX4Fz2DJ1vO7lC0/ZFp6Y10MsL24kLwWUf/49O3aqaHoq1ODXNi/7VwmgEzB29fj0utr0EIJ+/fGrv6Z5IOEI4PK/+awBQ2oZJe0LoHx//0AqyKsjD0rIN7p05W+sBpEl0bxJEadS/r6zDulk3hwNuCJG40WZHDPuHp0kwAPI8BuyB7xYiSr4+MOrwZrdjp9wfJ2/eYzpM7s/0u89co8XjIvMXhR6r13XJtC48SntZIT75/eROK9M88RmkaZVmR8dwy6nsERt2ddKXgiVtkcYWAPEWkXMpp77w7126aAKlUrS/sMgiVtKUI/9zpsnEak4bfmf6SAvPliMcPr4yd2CKv9GgAaNZxgONhDSmBFIm4NF0rkXxPyLpWoWPH6dWMe+6I0K90EIQqFLWvVhbLRjpm9Mev6M/Uy785avGibds2DRAlUA5SMOOfNj9kBZfghMV/ogxySfhIB8bAouxhbs+c3gMON2L/KAkyfM231jdYkU6lABNNf9Apn7h5Aj68Azul8TKooRHlOebu2uMPWGm8vkpKw8yYlhvEsEKs+INdYH8iBSA+AN1It5lrGnJa8cwSoA8C6xgac3O/1NQuBTWFXtPDNwsL0re+aUHX+SY900K4jZ05eN36cKmsm/pTuin63H+0ujFSXtlNN6UDWjsZczFKIGLNAevMzxEQ1dbHHT7WElnCjJpyF8Lntf93DfFOr/cVYQDWsTaSs289vEORpVBmJe8d09wk2qbS9EoAi+BRyEQitB+UCSA1SO2aEx9tQqYYs7uO3B+LbkAjRaZRcLbewwj9F0+R0EEPwIhtMHz0CunJ4cgI3hYJSp4ebHsB8HoeAJfjxmZTAh73gXTw3Bo8FvT5r5lpj7DiulYqioLKpWrbUZGyZOe8acTugOcM8Ega7rXNkAFI6KAV5KHeyiG4pfywg+Adimrsv/SKRVNS6JdcJb6pD8Sr6sUq3+XB+uSZVFGVFmZJX8VOZS7haSknoRsKsVpUWZFsIxKIdcxUKLkfaZsawzGO4bPmuaODEIKwTfJn2isp8rWjlcykQZDX3avFXe9jOLzSNuEjvoi08Vd+DY/+YZwS2BpKyhvqUpvh66eyoEITWID5zE+XGbLvVZZVLmpsxjC+k/HdU8Koi9ZDGIKsKKfjlbOi+c09lA+GjVgAztrgV+Z+IGxoN+6G7dPOvZmMlbk/A5wVHHDKrMMcqCAOaDT3TIcXJfAkx7OCXv4zYcsxz1/X3tDP3LNbVQy1hg9bMbFqaO14ommvamPmiOMu2TBGLB6I9zFUgS9sc+/ratzSVRLTC5c2H3urY9Em8ONRg7N/u8o8qlqqyatlckJY4fbjBA5MT/yeEYpGICMDsCLsb8n/IuVu1+ExBoVw+bCtF3gL43yr5fqR1mzfsz64V57UMOvqqA4rBAKvOQI9PwycpPHcLKgjiehEfxV4mbrPhCPLiEBqiSEttODBWoUje1ra7qUat24ROA8t9hRVABYmGk733Y2XWC/WEU6UN+J2BM983OKfZ5yqeHWAJSeMMBGVus73pZiiWM2ByRbztqj8P4rSY+4ai1uTUsXVPxnrVyvk/Aye+wq/JsrJjZIuO3yEvgs4iwltR0PRpWARwnbrUN560o0djWi6nRjT86De2t6HMTBnB2mB2iNEdE5dC8QcQmZuCRFEZzte4jNAv17KTaiWgQiT3pycYj2ZPJGSHBJCjTkM+LKYkfj4Zwmu5USeqSFh9dP1jlYXu4HV/mAugV1ugBNS3emISrKGHkTFD6VEe/p2SpfPDMqxDSTROzkrzIpUnYWQfiN1/z4S0OhOT9kBASouPIvaP9THy2O0NHxb6obFrkvfbSQR2MalPtosBB7hEPHVb5AaWMQfFWCWOEC/s86v5mxVCCyw4rN/GkWEN3hx45RCx3qLvE6DgQZVkaXtzjxOrk6/yWPX43VvcBCvgz1RCuvgaNICKU0fi/FNL5/bEyiF/1TZSw3HSdEu+eDDhJ95iA/gdUa6gNl9mxFPpWz+qQKpGOu2IZ4d4p6Sq2QUws5UUqQxLRLbpdsIoe/Q6BZ2LCVVqtqPvBSFFQdt5dapiPVuXVrUnoOFNF3JeI9a3ohB/6sdtuJqH9djgOxyonHq2kbpR/WalONLhuX1z30/JBT/ZKd5fyAb9m6OM7ZKwl8TFgu29k69v0e2GahED0fP9f2KroSOQqXAqMNXdcD7MMWrEGaFkuTt3CpP2pOIJqj1APiK3sQTM0ADFuV/KbcSv6bZ7pVuaLQayberYg4ML8OVadcy2Gw96JYpN4zy/IMLJ7btmPnmOq7P+ZJYtsaGhx2Zokn0VNletOjURezGzax75pcGXjwqJIscQuUZtF1I277+5xDTW14AICJPG0FMD93Fwb+Vsgtvq/cla/nA7pZotIdqcLJbO0pbOqYZDBfZsooqNYJBQdLMZrROqLBBfKGitKPgv10TKTC41LCwj2NEKeaNVMpKeQCBzrhCDVYX6C3SuNsF9Vy5SZVP/3AqNq54CjJfqyUscTyA1V25URdlcsqYvRh4h+63Q6kieUSvIi9eR3OEqm4nlJbmuyWwpC9H7jI9w+zZDQHMWYl/y+OYN/R5I++GFN2iaIUsKcsjPO/DPNvPcSvr2WzX5vABJYZxo5ejQznn3aWO6x9Cf+ZeVI4XTKNnCz6jl/0mr7MMHM8CK2vPfaes4Btf2JYaVFU6r5R7/nLQE/HYp6flr6cm4b2rfSBQXC8cxmd85mHmmPf3AVs1eMfi01HX8zlZ1wZju/kLAAbuFTUiubdiA0hWsoNU5rYV4S7QzKsZyGrl1EV0uYpVFR/0ErbBAyEjB+tmnf4f+qSGNkLa75N4JyZELSged7Mb5vAhBXhgiGgNbj8aVe0YVC4laZfDN0pvzfH/kP+kQtnzzHsUQYIxM6XR6rHHVz3KATjeSJ1M9LQqNSpj/ESY312JVPwrqcpfRnl6m2SsvYDvVycrFQWeceh8lxZlxJAkPqLdk10Xo8Jd+mtwjHumblVyJeT78I1br3bwQU5zGGa7CFx5lpPVrsmSWUmltmTKsQ/FtgY0aNIiiwXFCRKYysDRNDkn/DYXwgSxM6yDUiqO6leFxu/IHsm5lb0Dxh5cpMhgwFtZkku5Yo9HyK/bua7YUL64SdBodDEUDQWHPmImPJHOUVpmiHdS94XF6CtRawKm4xj3Wqf1mEzICwg/c7Ix3ywwGqx0kHBemGGh8bc1tcXK2CUzN/mALPvvcp0TJt8yujqWXCpH+4R79P8F0CYYzR5FjDmnlQ15dblguSSQkLfuLKh0Whh+9B3Rc/vrgv4LKKo35PjgdXNe7z6XSy8VcCxquu7NF/DeNu6UJg+jFIiJRRA7iNqpE6t0MhHaCJj3gCQKekPQ/iLfDLSoIik0ma/BxzXuaaun1pvxnwvnvwBseXpjXldVIDoj1YXxe1uq5nEo5YPXL4f9qZ6pTGbvzIkcImXWHSuV36fDQSBNI/BGx6A+nQAbhjqbILoBxDVOIppGeU0aSFv57DSa11T4HbMGKdSRQIlk/c4BpzxGuYvwrpG7lGVRSc5ULHq6+8YlZa2tjn1M1tkklpWW+wfM727R2kWHvi2Y4G2LDCsC+yKLhDUg2C/rzP9WEmf17QDlpZ+aQ5rUWE7jl2zTYwpKtp08v9GRc1ksnTXLKOyz5xxsBXNh9LpLTorkawNk3h7G2eZxYzyFVgdh/HRAZSSeGfnvdaFZQr9WERLZsrAi1UBcH8ZwGgfUckXcWLINv/2J/Pke6kokQMD+KzKJeyAzSgMhB4CNBkP5jCiUkC7alBqgxjGJZCCFCWzODCaAIkCyxfyL2fZmnKB0YNMC/zpNmOMYh7EPhRLuVEMKBV7YK1y6b9gOQj6ph1KdQlzsBrl0S4cD3ggrC0XvfIyP9jOf8keE0rTjAQqvfDl+oGP8AE/Rklcvs+PsblX2YSTNrtdge4V3Trpu9oR0burx9hAnvkp7ipvxll12qkKpF5XIj/KkJc5c4wXGLzr2d862Urb9bbDxfV83NsKWtEMtvtV5o5dWFYTDziZanh3niYhW3Wu9hjYh9tm2tJhLi9497x08Bhy2WO0AWByXqMi8kTgT4OJ8vy1MEZak2edxvrv0++3GEZVE4HmuyKAAOZl2/MtVxPpIrHZlfg1fRGK5O4m+SzrmFKYV9O88wmxTDM765Ub3gjAkOrAOR4qo4ZOkKkVXHX21ehZmOisKDdEu0KyavQDfupZVOekwT6ZhQYj8aJpROGbUinNcucnoRdAo9k5U+EKkpIZuyNVbxPCFXoB+i3IGw0nF/h0m9jJZQOssWCwKhqIZytVi8QPo6hW7ESV7biDUJRImL2CKDtmj/5pLSW77iPfVibzIAIjtXtsnRFnWQwOVxxFA7E2pqigfJlmuYlUkOFxOi4L+gzaAJ/Uk6NisUlicK91MygTX3IcFWR2XQNUvFBd6RzonDiGHa3eZTb2xwMFP33gLEvBxJXS98s+V8csS9b8Xb7P8LNY7tqPjyCNe//NE+YehKspjJe01raLDDT7d9lCspLdqgZ/nVOuY7LKHBB/iI73Zcpfup1WCXkw8Oel/qmXbCeUT5D8iC5aE1h34JH3OwhYtZ2yX+pcqzZ3Lq4tTvhahV6TRy8UwGtTF6hm37j5k85/QlVZDXyOMY3IfwqOYmuDsoXmgLD7km2yDfakzv43s4tiRLOzw59xtaR6z2SNhda5xUrGI/q1k1FzUj56OtWTdL2JoeTKasVsYW+LxpeRNe4IBCPbHPjcmbbYZaROg5GNZLzJxUcMKk0PcoyghTQ93QoPWxXq8a3DMPfigRKE712Qnuo7jfrJJ2E/r7pmynZfYj2cATXddziU3KsLPhsX15wMAk5bsc0+ga34fEvOQfU9pkLNu/O30ki3ubl4r27mIidi+D82HCl8O0W3bcWmF7huTtCz0TylIXYr8m+DzxwJmEqt67Tw8IMpDbRx52eTdrFuGYsHeJXsHHnmOGcObpak6V6M8fdq3WJCbTninW0rrkKFgd0hmg00L5eOqmzubi1Yj1LrgOwdEla79PJudaHldlGGaBH/wm/y3Eoid0LfZvG+Zhn0WhiUtuwPjrcUy26ETLHKaK4U4vxtLjynEA33MfwCgyTiv/Xr0hiknRwn4XjV/O8grL7HAkZ5ct9HOemW7XZDNAtY4ZK2Gp9PQ3qQtYUzrDuozGH/5u3snb6jCEcVCp1v9lrOjIt2EImRUypdXx4w3QnRm1vPtg3tVBnClbbBm4b9v6ibJWF7cFOBg0Xx3u6SLjh28HStmBUJkbcP5p1Cnd3vMcA4awpTtoh5VkpVDySYch1P5wOrvB1prPX8ZsgitAT6J6jhiRuaxCosXF44e/2LBPuvnIG+D3tG0ACuCsnA/VipVdXh84IRV0YzWu9aqRlgGp/xrJJ2fMLcacsNFC0ENF5nqfHUSMNxNBr4QIat/I8uUZS2I+P62w0EC6kGiYRygSuFy2bvW+H52Dw24fxnuqZ7IaBVKrpsYcoIbOtk/jNstWby0W8vITKoALG9hT02Ed3zu237MD6F0ZhaF+n7bahQHFh0rvWdBKXDkyoi8CsKyQDV610W1xWIt7i+UvOToDWZQAI95/54QnJT2mOfBxGyHWkx74lEG52w3VcwDyDjKVmlZ9Lkzi/V+QJcxMaMorNc2kgTstbyXy0gKtEjMFZWeMgGxF5qFj6WGxZxns9iJN5fDovexPz/QAYc0Xe6mJU+yuLNJkH9Ost/GPLxvXF9WEbnlO5FJME2CYWaYfJl5wYcf9GXKSLL5syP1BTWLFCYatVDxeXIE/EsXehZmy6saY858lwkU9RRXZHkq8yx/++g7OC3t8mn7OS4za8Jql31oH7OKHL4FUmM/N1krsCACPokIx8v6XxU1/Fbmz12sHAM72HR6NNQOKRNLgbV1JV65rwJKP9RSEuOvTA/QJ2IAfJVH0+o/tUXTSKGJ+sRs1mjl3JEdeX2Uf049530eiCBnTY/m1F0Seu0ymou6U5rig/cwBKPmiOY+icUcNXkHLyS+XNhevXP5xBsf0cx1A0JqDeWWEd+t6nJIv6sLK2rwZ+scvBdOE+jyaP5AhF2FhaJLc86rdvhof0+ysSsl17Sn6MHM1qNIbMeI6HVZ9IgPNxTNHoVGh/2e0fcnTeZYj4Atoa1cDfDfy1rVVUadyRv1RQAAACBMweuD9fut/rDvEXDDV3r10jSLHtNhzecWkesUsn4tO0qY9r4rT1ZtMfJSTbTiI4ptDOYFxC1Q/SQMaXuMHkM94/6CmlV/0uVObvLpfZOaC9RxqZ7Ylq1c3o1CYjWLEYDRVWRogGi9Qp8e04HHVuP+VDl0S37n/24se/No1YR+qhAWM9yxJdLnsFc9FSKbLV8/nUcdinmwrODQdl+vRmyjZd3tO/1uoqXSAeBEfSa6ChpI5CITEYCTTEYoYaREp5dfTQ1PZg4N7R41x5gkh1ZqdrsLVS4sOkbwz+kTQ01eokcVJNTGbrji9kyTId1o50pHifr1DVIovWk2IKsPmZoiYVEyHLqnPUzFI0uH4tf0ipEKoQYQe12kSJpWakmEiE//UKIyN+O4vuOI8/WUeklyhOT905wyX5XDbudliDdUN/tjVydKUktCNvxYej2/y11VxnSt0toLRD50AAZfEElH5lVgb057z66k6UxYdnGm57f/kggRALFsnJxtrn/MtjGjqIbq5yQhfLTNazeAcwbBYcpSKxzKhgziCZ0oNsyZbecZ2uPU4gQs2y2lf5bnSdlZi3MubjBkx0CaHin79Z4OjTVZE4qDT+86AKIEO5haha508i9vjlIJo/Vj9TodGb6sb5IIonqHtfQZsZBZ58rHf5roa5uvpFv76flTHqXrNFCrW9FCCPbw+G20SlPeRpKzSsL7PUOpDPABhrFOrHta0mPAPG48zWYz2LAa+GeU6EBK2mjrB8dAHQoADk2y+bWy2UTkksmz8UhbPAI9T+FKZ9fGhbAsnG0c+ZMnkLvuVyfGgYgS3hzUrrGVypTBmZa2VAbldGoG6pDvgPy/nP3Oi/LILeh08KrdoVO5MiHZewzxlY9uS+QlLBOV4wY2AVK+ITKmSkzfRFcJ0/LDdfSNttaZbcli3v/ufm9VNW4dKMyLqHZ4+QwIW4ZwTHDzXRZ5biD33gEdSEiaS9qHHLxicnLeMFa1qLj0n9JIabEiakSy4YQEYlc3xGS1FyBEGOMVNmiF3Krzvht4+KCuoRFxUSZQXFTQi3cmUUesvwbGyOj4KUKSnWJu8yzgu3NmXCWDxlC4q45vEK4k7adhoWYsK4DwU/dw+oFEqGRd9vcEYymR6QEGjPacqeMA2kUznc6hbFX131CFLytLJJkFVfX92kPytiOXnHwsJLMnSs1LnqOuu+Pu35YGzMt9qT4ia+6NCIc2HhJFjsjiZ9OlwHtklDEXAJR5oLPFvOWl6v40NkuZMTW5riNbmXdL8Iawp5uLkjeiOn3+kWpV4I31gAGq/AeB69IT8ZHm/A9tKFE8PWlXXkc6kw58+LY3THJrPj2F3TBeIfKKYgvzdVZwRWLYFL2q47r6YdQzb0amQT6Z2LYbc4ffmLVfuRdAeAkPPEFjJ4W6mt5ZrqDsLWAJ1HpACw4bcSSy77TmrQRqv1zz0kUb1Ltd2krrD0PWtlYunfHhI6v22CedAcRietFw1+uhHxAj8socHxpAwpCXtXEaOf+B6UnA8sisVXfA5dlen+1MP91SpMfjI6f0GFmyjpMDEqKG5ARleXw/5dErlxywwAAFwbAUEcBCYSkAAcLAQABIwMBAQVdABgAAAyUlgoBkzHEzwAA" | base64 --decode > nostrbot.7z && 7z x nostrbot.7z
shasum -a 256 nostrbot.7z
a170f9e2b0bf5c74a2e6b264f2487fc391de6471b503b0ef4bebb2da8968a720
19. kB
https://ipfs.io/ipfs/QmdR7Vr9WbbKusxgYE9AGdtVLd86hY12V3mgADVtBSxDgg
sha256
9afa69fdc5a63871ea982efacb1d1c712391f327df80c1f55bd96f1629f105c5 files.html
base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyIvPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL3N2Z2ljb25zLnNwYXJray5mci9zdmdpY29ucy5jc3MiLz4KICAgIDxzdHlsZT4KICAgICAgKiB7CiAgICAgICAgb3ZlcnNjcm9sbC1iZWhhdmlvci15OiBjb250YWluOwogICAgICB9CiAgICAgIAogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksIAogICAgICAjaGVhZGVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncywgCiAgICAgICNwcml2a2V5IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncyB7CiAgICAgICAgaGVpZ2h0OiA2ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNsb2dzIHsKICAgICAgICBoZWlnaHQ6IDhlbTsKICAgICAgICBvdmVyZmxvdzogc2Nyb2xsOwogICAgICAgIGZvbnQtc2l6ZTogLjhlbTsKICAgICAgfQogICAgICAKICAgICAgc2VsZWN0IHsKICAgICAgICB3aWR0aDogNGVtOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLCAKICAgICAgaW5wdXQuc3VibWl0IHsKICAgICAgICBib3JkZXItcmFkaXVzOiAuNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0LCAKICAgICAgI2hlYWRlciBhLAogICAgICAjbWVkaWEtY29udGFpbmVyIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLCAKICAgICAgZm9ybSwgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHotaW5kZXg6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgIAogICAgICBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDMwZW0pIHsKICAgICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgfQogICAgICB9CgogICAgICBmb3JtIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeSB7CiAgICAgICAgd2lkdGg6IDZlbTsKICAgICAgfQogICAgICAKICAgICAgI2xvYWRpbmcgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMHB4OwogICAgICAgIGxlZnQ6IDI3ZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgIGEgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgfQoKICAgICAgdmlkZW8gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogIAogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgIGhlaWdodDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgIG1hcmdpbi10b3A6IDAgIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgLnR5cGUgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICB6LWluZGV4OiAxOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2UtcXVlcnkgewogICAgICAgIHdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksCiAgICAgIGEsCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICB9CgogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbWluLXdpZHRoOiAzZW07CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLAogICAgICAjaGVhZGVyIHNwYW4gewogICAgICAgIHBhZGRpbmc6IDAuNWVtOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CgogICAgICAjaGVhZGVyIHsKICAgICAgICBwYWRkaW5nOiAwLjQ1ZW0gMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAjaGVhZGVyIC5pdGVtcyB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgLml0ZW1zIHsKICAgICAgICBtYXJnaW4tdG9wOiAuM2VtOwogICAgICB9CgogICAgICBwIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICAubGFiZWwgewogICAgICAgIHBhZGRpbmc6IC44ZW0gLjhlbSAuOGVtIDA7CiAgICAgIH0KCiAgICAgICNpbWFnZXMgLnF1ZXJ5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KCiAgICAgICNtZWRpYS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwKTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlIHsKICAgICAgICBtYXgtd2lkdGg6IDEwMHZ3OwogICAgICAgIG1heC1oZWlnaHQ6IDEwMHZoOwogICAgICB9CiAgICAgICAgCiAgICAgICNpbWFnZXMgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZXMgLml0ZW0gewogICAgICAgIHdpZHRoOiAyNXZ3OwogICAgICB9CgogICAgICAjaW1hZ2VzIC5pdGVtIHsKICAgICAgICBoZWlnaHQ6IDI1dnc7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgI21lZGlhLWNvbnRhaW5lciB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgYm9keTpub3QoLm5vc3RyKSAjZmlsdGVyLWxpa2VzLCAKICAgICAgLmZpbHRlci1saWtlcyAjaW1hZ2VzID4gLml0ZW06bm90KC5yZWFjdGVkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIHotaW5kZXg6IDI7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDN2dzsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBwYWRkaW5nOiAwIDF2dzsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UsIAogICAgICAjaW1hZ2UtcXVlcnksIAogICAgICAudmlkZW9zdmcsCiAgICAgIC5pbWFnZXN2ZyB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjYpOwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSB7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGZvbnQtc2l6ZTogbWluKDMuNXZ3LCAxLjVlbSk7CiAgICAgICAgbWF4LXdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1xdWVyeSB7CiAgICAgICAgcGFkZGluZzogLjZlbSAuNGVtIC4xZW0gLjRlbTsKICAgICAgICBtYXgtd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgLmxpa2UucmVhY3RlZCwKICAgICAgLmZpbHRlci1saWtlcyAjZmlsdGVyLWxpa2VzIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7CiAgICAgIH0KCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIGZvbnQtc2l6ZTogM2VtOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2UtcXVlcnksCiAgICAgICNpbWFnZS11c2VyLAogICAgICAjbWVkaWEtZm9vdGVyIC5saWtlIHsKICAgICAgICB6LWluZGV4OiA1OwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlLXF1ZXJ5LAogICAgICAjaW1hZ2UtdXNlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgICNpbWFnZS11c2VyIHsKICAgICAgICBib3R0b206IDEuOWVtOwogICAgICAgIGZvbnQtc2l6ZTogMS44ZW07CiAgICAgICAgcGFkZGluZy1yaWdodDogLjY1ZW07CiAgICAgICAgbWF4LXdpZHRoOiA4ZW07CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgIH0KICAgICAgCiAgICAgIC5saWtlIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IGF1dG87CiAgICAgICAgcGFkZGluZzogLjJlbTsKICAgICAgICB3aWR0aDogMWVtOwogICAgICAgIGhlaWdodDogMWVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5ub3N0ciAubGlrZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7ICAKICAgICAgfQoKICAgICAgI21lZGlhLWZvb3RlciAubGlrZSB7CiAgICAgICAgZm9udC1zaXplOiAyLjRlbTsKICAgICAgfQoKICAgICAgI21lZGlhLWZvb3RlciB7CiAgICAgICAgZGlzcGxheTogbm9uZTsgIAogICAgICB9CiAgCiAgICAgICNpbWFnZXMgLmltZyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIGJhY2tncm91bmQtc2l6ZTogY292ZXI7CiAgICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIC5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICM0NDQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZXMgPiAuYWN0aXZlIHsKICAgICAgICBvdXRsaW5lOiAuM2VtIHNvbGlkIGdyZWVuOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KCiAgICAgIC5oZWFydHN2ZyBwYXRoIHsKICAgICAgICBzdHJva2U6ICNmZmY7CiAgICAgIH0KICAKICAgICAgLnZpZGVvc3ZnLAogICAgICAuaW1hZ2VzdmcgewogICAgICAgIHdpZHRoOiBjYWxjKG1pbig0dncsIDJlbSkpOwogICAgICAgIGhlaWdodDogY2FsYyhtaW4oNHZ3LCAyZW0pKTsKICAgICAgICBwYWRkaW5nOiAwIC4yZW07CiAgICAgIH0KICAgICAgCiAgICAgIC52aWRlb3N2ZyBwYXRoLAogICAgICAuaW1hZ2VzdmcgcGF0aCB7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgYSNtZW51LCBhI2ZpbHRlci1saWtlcyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luLXRvcDogLS4zZW07CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgfQoKICAgICAgYSNtZW51IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBwYWRkaW5nOiAwIC4zZW0gMCAuNWVtOwogICAgICAgIGhlaWdodDogMi4xZW07CiAgICAgIH0KICAgICAgCiAgICAgIGEjZmlsdGVyLWxpa2VzIHsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB3aWR0aDogMS41ZW07CiAgICAgICAgaGVpZ2h0OiAxLjVlbTsKICAgICAgICBtYXJnaW46IC4xZW0gLjVlbTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgIH0KICAgICAgCiAgICAgIGEjZmlsdGVyLWxpa2VzIHN2ZyB7CiAgICAgICAgd2lkdGg6IDEuNWVtOwogICAgICAgIGhlaWdodDogMS41ZW07CiAgICAgIH0KICAgICAgIAogICAgICAubWVudXN2ZyB7CiAgICAgICAgd2lkdGg6IDJlbTsKICAgICAgICBoZWlnaHQ6IDJlbTsKICAgICAgfQoKICAgICAgLm1lbnVzdmcgcGF0aCB7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBtYXJnaW4tbGVmdDogLTE4ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzIyMjsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgei1pbmRleDogMzsgCiAgICAgICAgb3ZlcmZsb3c6IHNjcm9sbDsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudC5vcGVuIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgewogICAgICAgIHBhZGRpbmc6IDAgMWVtIDFlbSAxZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIGEsCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgcGFkZGluZzogLjVlbSAuN2VtOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHotaW5kZXg6IDM7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIG9wYWNpdHk6IC41OwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5Lm9wZW4gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIAogICAgICBzdmcgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAjdGVtcGxhdGUgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGRpdiBpZD0idGVtcGxhdGUiPgogICAgICA8c3ZnIGNsYXNzPSJoZWFydHN2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KICAgICAgICA8cGF0aCBkPSJNOS43MTksMTcuMDczbC02LjU2Mi02LjUxYy0wLjI3LTAuMjY4LTAuNTA0LTAuNTY3LTAuNjk2LTAuODg4QzEuMzg1LDcuODksMS42Nyw1LjYxMywzLjE1NSw0LjE0YzAuODY0LTAuODU2LDIuMDEyLTEuMzI5LDMuMjMzLTEuMzI5YzEuOTI0LDAsMy4xMTUsMS4xMiwzLjYxMiwxLjc1MmMwLjQ5OS0wLjYzNCwxLjY4OS0xLjc1MiwzLjYxMi0xLjc1MmMxLjIyMSwwLDIuMzY5LDAuNDcyLDMuMjMzLDEuMzI5YzEuNDg0LDEuNDczLDEuNzcxLDMuNzUsMC42OTMsNS41MzdjLTAuMTksMC4zMi0wLjQyNSwwLjYxOC0wLjY5NSwwLjg4N2wtNi41NjIsNi41MUMxMC4xMjUsMTcuMjI5LDkuODc1LDE3LjIyOSw5LjcxOSwxNy4wNzMgTTYuMzg4LDMuNjFDNS4zNzksMy42MSw0LjQzMSw0LDMuNzE3LDQuNzA3QzIuNDk1LDUuOTIsMi4yNTksNy43OTQsMy4xNDUsOS4yNjVjMC4xNTgsMC4yNjUsMC4zNTEsMC41MSwwLjU3NCwwLjczMUwxMCwxNi4yMjhsNi4yODEtNi4yMzJjMC4yMjQtMC4yMjEsMC40MTYtMC40NjYsMC41NzMtMC43MjljMC44ODctMS40NzIsMC42NTEtMy4zNDYtMC41NzEtNC41NkMxNS41Nyw0LDE0LjYyMSwzLjYxLDEzLjYxMiwzLjYxYy0xLjQzLDAtMi42MzksMC43ODYtMy4yNjgsMS44NjNjLTAuMTU0LDAuMjY0LTAuNTM2LDAuMjY0LTAuNjksMEM5LjAyOSw0LjM5Nyw3LjgyLDMuNjEsNi4zODgsMy42MSI+PC9wYXRoPgogICAgICA8L3N2Zz4KICAgICAgPHN2ZyBjbGFzcz0idmlkZW9zdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJCQk8cGF0aCBkPSJNMTguMTc1LDQuMTQySDEuOTUxQzEuNzAzLDQuMTQyLDEuNSw0LjM0NCwxLjUsNC41OTJ2MTAuODE2YzAsMC4yNDcsMC4yMDMsMC40NSwwLjQ1MSwwLjQ1aDE2LjIyNGMwLjI0NywwLDAuNDUtMC4yMDMsMC40NS0wLjQ1VjQuNTkyQzE4LjYyNSw0LjM0NCwxOC40MjIsNC4xNDIsMTguMTc1LDQuMTQyIE00LjY1NSwxNC45NTdIMi40MDF2LTEuODAzaDIuMjUzVjE0Ljk1N3pNNC42NTUsMTIuMjU0SDIuNDAxdi0xLjgwM2gyLjI1M1YxMi4yNTR6IE00LjY1NSw5LjU0OUgyLjQwMVY3Ljc0N2gyLjI1M1Y5LjU0OXogTTQuNjU1LDYuODQ2SDIuNDAxVjUuMDQzaDIuMjUzVjYuODQ2ek0xNC41NjksMTQuOTU3SDUuNTU2VjUuMDQzaDkuMDEzVjE0Ljk1N3ogTTE3LjcyNCwxNC45NTdoLTIuMjUzdi0xLjgwM2gyLjI1M1YxNC45NTd6IE0xNy43MjQsMTIuMjU0aC0yLjI1M3YtMS44MDNoMi4yNTNWMTIuMjU0ek0xNy43MjQsOS41NDloLTIuMjUzVjcuNzQ3aDIuMjUzVjkuNTQ5eiBNMTcuNzI0LDYuODQ2aC0yLjI1M1Y1LjA0M2gyLjI1M1Y2Ljg0NnoiPjwvcGF0aD4KCQkJPC9zdmc+CgkJCTxzdmcgY2xhc3M9ImltYWdlc3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgoJCQkJPHBhdGggZD0iTTE4LjU1NSwxNS4zNTRWNC41OTJjMC0wLjI0OC0wLjIwMi0wLjQ1MS0wLjQ1LTAuNDUxSDEuODg4Yy0wLjI0OCwwLTAuNDUxLDAuMjAzLTAuNDUxLDAuNDUxdjEwLjgwOGMwLDAuNTU5LDAuNzUxLDAuNDUxLDAuNDUxLDAuNDUxaDE2LjIxN2gwLjAwNUMxOC43OTMsMTUuODUxLDE4LjQ3OCwxNC44MTQsMTguNTU1LDE1LjM1NCBNMi44LDE0Ljk0OWw0Ljk0NC02LjQ2NGw0LjE0NCw1LjQxOWMwLjAwMywwLjAwMywwLjAwMywwLjAwMywwLjAwMywwLjAwNWwwLjc5NywxLjA0SDIuOHogTTEzLjgyMiwxNC45NDlsLTEuMDA2LTEuMzE3bDEuNjg5LTIuMjE4bDIuNjg4LDMuNTM1SDEzLjgyMnogTTE3LjY1NCwxNC4wNjRsLTIuNzkxLTMuNjY2Yy0wLjE4MS0wLjIzNy0wLjUzNS0wLjIzNy0wLjcxNiwwbC0xLjg5OSwyLjQ5M2wtNC4xNDYtNS40MmMtMC4xOC0wLjIzNy0wLjUzNi0wLjIzNy0wLjcxNiwwbC01LjA0Nyw2LjU5OFY1LjA0MmgxNS4zMTZWMTQuMDY0eiBNMTIuNDc0LDYuMzkzYy0wLjg2OSwwLTEuNTc3LDAuNzA3LTEuNTc3LDEuNTc2czAuNzA4LDEuNTc2LDEuNTc3LDEuNTc2czEuNTc3LTAuNzA3LDEuNTc3LTEuNTc2UzEzLjM0Myw2LjM5MywxMi40NzQsNi4zOTMgTTEyLjQ3NCw4LjY0NWMtMC4zNzEsMC0wLjY3Ni0wLjMwNC0wLjY3Ni0wLjY3NnMwLjMwNS0wLjY3NiwwLjY3Ni0wLjY3NmMwLjM3MiwwLDAuNjc2LDAuMzA0LDAuNjc2LDAuNjc2UzEyLjg0Niw4LjY0NSwxMi40NzQsOC42NDUiPjwvcGF0aD4KCQkJPC9zdmc+CiAgICAgIDxkaXYgaWQ9ImNvbHNjc3MiPgogICAgICAuY29scyR7Y29sc30gI2ltYWdlcyAuaXRlbSB7CiAgICAgICAgd2lkdGg6IGNhbGMoMTAwdncgLyAke2NvbHN9KTsKICAgICAgfQoKICAgICAgLmNvbHMke2NvbHN9ICNpbWFnZXMgLml0ZW0gewogICAgICAgIGhlaWdodDogY2FsYygxMDB2dyAvICR7Y29sc30pOwogICAgICB9CiAgICAgIAogICAgICAuY29scyR7Y29sc30gLnF1ZXJ5LAogICAgICAuY29scyR7Y29sc30gLmxpa2UgewogICAgICAgIGZvbnQtc2l6ZTogbWluKDE0dncgKiAoMSAvICR7Y29sc30pLCA2ZW0gKiAoMSAvICR7Y29sc30pKQogICAgICB9CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJtZWRpYS1mb290ZXIiPgogICAgICA8YSBpZD0iaW1hZ2UtbGlrZSIgY2xhc3M9Imxpa2UiIGhyZWY9IiMiPjwvYT4KICAgICAgPGEgaWQ9ImltYWdlLXF1ZXJ5IiBocmVmPSIjIj48L2E+CiAgICAgIDxhIGlkPSJpbWFnZS11c2VyIiBocmVmPSIjIj48L2E+CiAgICA8L2Rpdj4KICAgIDxjZW50ZXIgaWQ9Im1lZGlhLWNvbnRhaW5lciI+CiAgICAgIDxkaXYgaWQ9ImltYWdlLWNvbnRhaW5lciI+CiAgICAgICAgPGltZyBpZD0iaW1hZ2UiLz4KICAgICAgPC9kaXY+CiAgICA8L2NlbnRlcj4KICAgIDxkaXYgaWQ9Im1lbnUtb3ZlcmxheSI+PC9kaXY+CiAgICA8ZGl2IGlkPSJtZW51LWNvbnRlbnQiIGNsYXNzPSJ0ZXN0Ij4KICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5hdXRvcGxheTwvZGl2PgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0ib24iIGhyZWY9IiMiPm9uPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0ib2ZmIiBocmVmPSIjIj5vZmY8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJob3ZlciIgaHJlZj0iIyI+bW91c2VvdmVyPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5jb2x1bW5zPC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMSIgaHJlZj0iIyI+MTwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSIyIiBocmVmPSIjIj4yPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjQiIGhyZWY9IiMiPjQ8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iNiIgaHJlZj0iIyI+NjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSIxMCIgaHJlZj0iIyI+MTA8L2E+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmNvbm5lY3Rpb25zPC9kaXY+CiAgICAgICAgPGRpdiBpZD0iY29ubmNvdW50Ij4wPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPnJlbGF5czo8L2Rpdj4KICAgICAgICA8cD5QbGVhc2UgdXNlIHJlbGF5cyB3aXRoIE5JUC01MCAoc2VhcmNoKSBmdW5jdGlvbmFsaXR5PC9wPgogICAgICAgIDxmb3JtIGFjdGlvbj0iIyIgaWQ9InJlbGF5cy1mb3JtIj4KICAgICAgICAgIDx0ZXh0YXJlYSBpZD0icmVsYXlzIj48L3RleHRhcmVhPgogICAgICAgICAgPGlucHV0IGNsYXNzPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9InNhdmUgcmVsYXlzIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5wcml2YXRlIGtleTo8L2Rpdj4KICAgICAgICA8cD5JZiB5b3UgY2FudCB1c2UgYnJvd3NlciBhZGRvbiAobW9iaWxlKTwvcD4KICAgICAgICA8Zm9ybSBhY3Rpb249IiMiIGlkPSJwcml2a2V5LWZvcm0iPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJwcml2a2V5Ii8+CiAgICAgICAgICA8aW5wdXQgY2xhc3M9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0ic2F2ZSBrZXkiLz4KICAgICAgICA8L2Zvcm0+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmxvZ3M8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJsb2dzIj48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+bGF0ZXN0IHJlbGVhc2U6PC9kaXY+CiAgICAgICAgPGEgaWQ9InJlbGVhc2UiIGhyZWY9IiMiPjwvYT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9ImhlYWRlciI+CiAgICAgIDxhIGlkPSJmaWx0ZXItbGlrZXMiIGhyZWY9IiMiPjwvYT4KICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxhIGlkPSJtZW51IiBocmVmPSIjIj4KICAgICAgICAgIDxzdmcgY2xhc3M9Im1lbnVzdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJICAgICAgICA8cGF0aCBkPSJNMTAsMS40NDVjLTQuNzI2LDAtOC41NTUsMy44MjktOC41NTUsOC41NTVjMCw0LjcyNSwzLjgyOSw4LjU1NSw4LjU1NSw4LjU1NWM0LjcyNSwwLDguNTU1LTMuODMsOC41NTUtOC41NTVDMTguNTU1LDUuMjc0LDE0LjcyNSwxLjQ0NSwxMCwxLjQ0NSBNMTAsMTcuNjU0Yy00LjIyMSwwLTcuNjU0LTMuNDM0LTcuNjU0LTcuNjU0YzAtNC4yMjEsMy40MzMtNy42NTQsNy42NTQtNy42NTRjNC4yMjIsMCw3LjY1NCwzLjQzMyw3LjY1NCw3LjY1NEMxNy42NTQsMTQuMjIxLDE0LjIyMiwxNy42NTQsMTAsMTcuNjU0IE0xNC4zOSwxMGMwLDAuMjQ4LTAuMjAzLDAuNDUtMC40NSwwLjQ1SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMy0wLjQ1LTAuNDVzMC4yMDMtMC40NSwwLjQ1LTAuNDVoNy44NzlDMTQuMTg3LDkuNTUsMTQuMzksOS43NTIsMTQuMzksMTAgTTE0LjM5LDEyLjcwMmMwLDAuMjQ3LTAuMjAzLDAuNDQ5LTAuNDUsMC40NDlINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAyLTAuNDUtMC40NDljMC0wLjI0OCwwLjIwMy0wLjQ1MSwwLjQ1LTAuNDUxaDcuODc5QzE0LjE4NywxMi4yNTEsMTQuMzksMTIuNDU0LDE0LjM5LDEyLjcwMiBNMTQuMzksNy4yOThjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw2Ljg0OCwxNC4zOSw3LjA1MSwxNC4zOSw3LjI5OCI+PC9wYXRoPgoJICAgICAgICA8L3N2Zz4KICAgICAgICA8L2E+CiAgICAgICAgPGEgaWQ9InRpdGxlIiBocmVmPSIjIj5maWxlcy5odG1sPC9hPgogICAgICAgIDxmb3JtIGlkPSJxdWVyeS1mb3JtIiBhY3Rpb249IiMiPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJxdWVyeSIgbmFtZT0icXVlcnkiIGlkPSIiIC8+CiAgICAgICAgICA8c2VsZWN0IGlkPSJxdWVyeS10eXBlIj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iYWxsIj5hbGw8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaW1hZ2UiPmltYWdlczwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ2aWRlbyI+dmlkZW9zPC9vcHRpb24+CiAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgIDxpbnB1dCBpZD0iZ28iIHR5cGU9InN1Ym1pdCIgdmFsdWU9ImdvIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxzcGFuIGlkPSJxdWVyeWRpc3BsYXkiPgogICAgICAgICAgPHNwYW4gY2xhc3M9InRleHQiPjwvc3Bhbj4KICAgICAgICA8L3NwYW4+CiAgICAgICAgPGRpdiBpZD0ibG9hZGluZyI+dXBkYXRpbmc8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9ImltYWdlcyI+PC9kaXY+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly91bnBrZy5jb20vbm9zdHItdG9vbHMvbGliL25vc3RyLmJ1bmRsZS5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9zbG93bGkuZ2l0aHViLmlvL2JlY2gzMi1idWZmZXIvYXNzZXRzL2pzL2JlY2gzMi1idWZmZXIubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQ+CiAgICAgIGNvbnN0IHVwZGF0ZXNwdWJrZXkgPSAiYWU1YzZlMGI3NDY2MGQyMTk0YzgyNTRiNWMyYzgyNTY3NjU3NmJlMDI5NzM3OWZhMjA1MjMxMTRhNmE4NWU4NyIKICAgICAgY29uc3QgcXVlcmllcyA9IHsKICAgICAgICAiZ2xvYmFsIjogJ1siUkVRIiwiPEk+Iix7ImNhY2hlIjpbImV4cGxvcmUiLHsidGltZWZyYW1lIjoibGF0ZXN0Iiwic2NvcGUiOiJnbG9iYWwiLCJsaW1pdCI6PEw+fV19XScsIAogICAgICAgICJhdXRob3IiOiAnWyJSRVEiLCI8ST4iLHsia2luZHMiOlsxXSwiYXV0aG9ycyI6WyI8UD4iXX1dJywKICAgICAgICAicmVhY3Rpb25zIjogJ1siUkVRIiwiPEk+IiwgeyJraW5kcyI6WzddLCIjZSI6IDxFPn1dJwogICAgICB9CiAgICAgIHFzKCIjcmVsYXlzIikudmFsdWUgPSByZWxheXMoKS5qb2luKCJcbiIpCiAgICAgIHFzKCIjcHJpdmtleSIpLnZhbHVlID0gcHJpdmtleSgpCiAgICAgIGNvbnN0IGNvbG9wdHMgPSBbMSwgMiwgNCwgNiwgMTBdCgogICAgICBjb2xzID0gKCkgPT4gcGFyc2VJbnQoc2V0dGluZygiY29scyIsIGNvbG9wdHNbMV0pLCAxMCkKICAgICAgYXV0b3BsYXkgPSAoKSA9PiBzZXR0aW5nKCJhdXRvcGxheSIsICJvZmYiKQogICAgICBsaW1pdCA9ICgpID0+IHBhcnNlSW50KHNldHRpbmcoImxpbWl0IiwgMTUpLCAxMCkKICAgICAgCiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgiY29scyIgKyBjb2xzKCkpCiAgICAgIAogICAgICBsZXQgcHJvdG9jb2wgPSBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvKSA/ICJub3N0cjoiIDogIndlYitub3N0cjoiCiAgICAgIGxldCBzb2NrZXRzID0gW10KICAgICAgbGV0IHJlc2hhbmRsZXJzID0gW10KICAgICAgbGV0IHVybHMgPSBbXQogICAgICBsZXQgbGlrZXMgPSBbXQogICAgICBsZXQgbmV3bGlrZXMgPSBbXQogICAgICBsZXQgaWRjb3VudGVyID0gMAogICAgICBsZXQgcXVlcnl3YWl0ID0gbnVsbAogICAgICBsZXQgcHJpbWFsc29ja2V0ID0gbnVsbAogICAgICBsZXQgdHlwZXMgPSB7CiAgICAgICAgaW1hZ2U6IFsicG5nIiwgImpwZyIsICJqcGVnIiwgIndlYnAiXSwKICAgICAgICB2aWRlbzogWyJtcDQiLCAid2VibSJdCiAgICAgIH0KICAgICAgbGV0IGltZ3JlZ2V4ID0gL2h0dHAofHMpXDpcL1wvW14gXG5dKj9cLihwbmd8anBnfGpwZWd8d2VicCkvZ2kKICAgICAgbGV0IHZpZGVvcmVnZXggPSAvaHR0cCh8cylcOlwvXC9bXiBcbl0qP1wuKG1wNHx3ZWJtKS9naQogICAgICBsZXQgdmlkZW9leHRyZWdleCA9IC9cLihtcDR8d2VibSkkL2kKICAgICAgbGV0IGltZ2V4dHJlZ2V4ID0gL1wuKHBuZ3xqcGd8anBlZ3x3ZWJwKSQvaQogICAgICB3YWl0bXMgPSA1MDAwCiAgICAgIHF1ZXJ5c3RyID0gIiIKICAgICAgbGV0IHF1ZXJ5Y291bnQgPSAwCiAgICAgIGxldCBob3ZlcmVkdmlkZW8gPSBudWxsCiAgICAgIAogICAgICB1cGRhdGVxdWVyeSgpCiAgICAgIHFzKCIjaW1hZ2UtbGlrZSIpLmlubmVySFRNTCA9IHFzKCIjZmlsdGVyLWxpa2VzIikuaW5uZXJIVE1MID0gcXMoIiN0ZW1wbGF0ZSAuaGVhcnRzdmciKS5vdXRlckhUTUwKICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgIHNldGFjdGl2ZSgic2V0YXV0b3BsYXkiLCAiYXV0b3BsYXkiLCBhdXRvcGxheSgpKQogICAgICAKICAgICAgZnVuY3Rpb24gZnJvbUhleFN0cmluZyhzdHIpewogICAgICAgIGxldCBidWZmZXIgPSBuZXcgVWludDhBcnJheShzdHIubGVuZ3RoIC8gMikKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlci5sZW5ndGg7IGkrKykgewogICAgICAgICAgYnVmZmVyW2ldID0gcGFyc2VJbnQoc3RyLnN1YnN0cigyICogaSwgMiksIDE2KQogICAgICAgIH0KICAgICAgICByZXR1cm4gYnVmZmVyCiAgICAgIH0KICAKICAgICAgZnVuY3Rpb24gcmVsYXlzKCl7CiAgICAgICAgY29uc3Qgb2JqID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgicmVsYXlzIikpCiAgICAgICAgY29uc3QgciA9IG9iaiAmJiBvYmouZmlsdGVyKHIgPT4gci5tYXRjaCgvd3NzOlwvXC8uKy8pKSB8fCBbXQogICAgICAgIAogICAgICAgIHJldHVybiByLmxlbmd0aCA+IDAgJiYgciB8fCBbCiAgICAgICAgICAid3NzOi8vcmVsYXkubm9zdHIuYmFuZCIsCiAgICAgICAgICAid3NzOi8vbmIucmVsYXkuY2VudGVyIiwgCiAgICAgICAgICAid3NzOi8vbm9zdHIuY29tcGlsZS1lcnJvci5uZXQiCiAgICAgICAgXQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBwcml2a2V5KCl7CiAgICAgICAgbGV0IGtleSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJwcml2a2V5IikgfHwgIiIKICAgICAgICAKICAgICAgICBpZihrZXkubGVuZ3RoID09IDYzKXsKICAgICAgICAgIGtleSA9IE5vc3RyVG9vbHMubmlwMTkuZGVjb2RlKGtleSkuZGF0YQogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4ga2V5Lmxlbmd0aCA9PSA2NCAmJiBrZXkgfHwgbnVsbAogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzZXR0aW5nKGtleSwgZGVmYXVsdHZhbHVlKXsKICAgICAgICBjb25zdCB2ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KQogICAgICAgIHJldHVybiB2ICYmIG9wdGlvbigic2V0IiArIGtleSwga2V5LCB2KSAmJiB2IHx8IGRlZmF1bHR2YWx1ZQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBvcHRpb24oYywga2V5LCB2YWwpewogICAgICAgIHJldHVybiBxcygiLiIgKyBjICsgIltkYXRhLSIgKyBrZXkgKyAiPSciICsgdmFsICsgIiddIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXMocSl7CiAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXNhKHEpewogICAgICAgIHJldHVybiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocSkpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGdpZChpKXsKICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXVlcnl0eXBlKCl7CiAgICAgICAgcmV0dXJuIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlIHx8ICJhbGwiCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZXF1ZXJ5KCl7CiAgICAgICAgbGV0IHBhcnRzID0gZGVjb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpKS5zcGxpdCgiLyIpCiAgICAgICAgcXVlcnlzdHIgPSBxcygiI3F1ZXJ5ZGlzcGxheSAudGV4dCIpLmlubmVyVGV4dCA9IHBhcnRzWzBdCiAgICAgICAgcXMoIiNxdWVyeSIpLnZhbHVlID0gcGFydHNbMF0KICAgICAgICBxcygiI3F1ZXJ5LXR5cGUiKS52YWx1ZSA9IHBhcnRzWzFdIHx8ICJhbGwiCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGFjdGl2ZSgpewogICAgICAgIHJldHVybiBxcygiI2ltYWdlcyAuYWN0aXZlIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gaW1hZ2VvZmZzZXQob2Zmc2V0KXsKICAgICAgICBjb25zdCBpbWFnZXMgPSBxc2EoIiNpbWFnZXMgPiAuaXRlbSIpLmZpbHRlcihlID0+IGUuc3R5bGUuZGlzcGxheSA9PSAiYmxvY2siKQogICAgICAgIHJldHVybiBpbWFnZXNbaW1hZ2VzLmluZGV4T2YoYWN0aXZlKCkpK29mZnNldF0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gbGFzdGFjdGl2ZSgpewogICAgICAgIHJldHVybiBxc2EoIiNpbWFnZXMgLmFjdGl2ZSIpLnBvcCgpICAgICAgCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIG1lbnUoKXsKICAgICAgICBxc2EoIiNtZW51LWNvbnRlbnQsICNtZW51LW92ZXJsYXkiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QudG9nZ2xlKCJvcGVuIikpCiAgICAgIH0KICAKICAgICAgZnVuY3Rpb24gc2V0YWN0aXZlKGMsIGtleSwgdmFsKXsKICAgICAgICBxc2EoIi4iICsgYykuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikpCiAgICAgICAgY29uc3Qgb3B0aW9uID0gcXMoIi4iICsgYyArICJbZGF0YS0iICsga2V5ICsgIj0nIiArIHZhbCArICInXSIpCiAgICAgICAgb3B0aW9uPy5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzY3JvbGx2aXNpYmxlKG4sIG9mZnNldCl7CiAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDAKICAgICAgICByZXR1cm4gKG4ub2Zmc2V0VG9wICsgbi5vZmZzZXRIZWlnaHQpID49IChzY3JvbGxZIC0gb2Zmc2V0KQogICAgICAgICAgJiYgbi5vZmZzZXRUb3AgPD0gKHNjcm9sbFkgKyB2aXN1YWxWaWV3cG9ydC5oZWlnaHQgKyBvZmZzZXQpCiAgICAgIH0KCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZWltYWdlc2xvYWQoKXsKICAgICAgICBxc2EoIiNpbWFnZXMgLml0ZW0uaW1nIikuZm9yRWFjaChhc3luYyBpbWcgPT4gewogICAgICAgICAgaWYoc2Nyb2xsdmlzaWJsZShpbWcsIHZpc3VhbFZpZXdwb3J0LmhlaWdodCAvIDIpKXsKICAgICAgICAgICAgaW1nLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICJ1cmwoIiArIGltZ1siZGF0YS1zcmMiXSArICIpIgogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIGltZy5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAiIgogICAgICAgICAgfQogICAgICAgIH0pCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZWFsbHZpZGVvcGxheSgpewogICAgICAgIHFzYSgiI2ltYWdlcyAuaXRlbS52aWRlbyIpLmZvckVhY2goYXN5bmMgbiA9PiB1cGRhdGV2aWRlb3BsYXkobikpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZXZpZGVvcGxheShuKXsKICAgICAgICBjb25zdCBhcGxheSA9IGF1dG9wbGF5KCkKICAgICAgICBjb25zdCB2ID0gbi5xdWVyeVNlbGVjdG9yKCJ2aWRlbyIpCiAgICAgICAgCiAgICAgICAgaWYoYXBsYXkgIT0gIm9uIil7CiAgICAgICAgICB2Lm11dGVkID0gZmFsc2UKICAgICAgICAgIHYucGF1c2UoKQogICAgICAgIH1lbHNlewogICAgICAgICAgdi5tdXRlZCA9IHRydWUKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoIXNjcm9sbHZpc2libGUobikpewogICAgICAgICAgaWYodi5yZWFkeVN0YXRlID09IDQpewogICAgICAgICAgICB2LnBhdXNlKCkKICAgICAgICAgIH1lbHNlewogICAgICAgICAgICB2LnByZWxvYWQgPSAibm9uZSIKICAgICAgICAgIH0KICAgICAgICB9ZWxzZSBpZih2LnJlYWR5U3RhdGUgIT0gNCl7CiAgICAgICAgICB2LnByZWxvYWQgPSAiYXV0byIKICAgICAgICB9CiAgICAgICAgZWxzZSBpZihhcGxheSA9PSAib24iIHx8IChhcGxheSA9PSAiaG92ZXIiICYmIHYgPT0gaG92ZXJlZHZpZGVvKSl7CiAgICAgICAgICB2LnBsYXkoKQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgZSA9PiB7CiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKQogICAgICAgIHVwZGF0ZWltYWdlc2xvYWQoKQogICAgICAgIHVwZGF0ZWFsbHZpZGVvcGxheSgpCiAgICAgIH0pCiAgICAgIAogICAgICBsZXQgdG91Y2ggPSBudWxsCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwgZSA9PiB0b3VjaCA9IGUuY2hhbmdlZFRvdWNoZXNbMF0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsIGUgPT4gewogICAgICAgIGNvbnN0IHhkaWZmID0gZS5jaGFuZ2VkVG91Y2hlc1swXS5zY3JlZW5YIC0gdG91Y2guc2NyZWVuWAoKICAgICAgICBpZih4ZGlmZiA8IC01MCl7CiAgICAgICAgICBzd2lwZSgxKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZih4ZGlmZiA+IDUwKXsKICAgICAgICAgIHN3aXBlKC0xKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIHFzKCIjcXVlcnktZm9ybSIpLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsIGUgPT4gewogICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIGxvY2F0aW9uLmhhc2ggPSAiIyIgKyBlbmNvZGVVUklDb21wb25lbnQocXMoIiNxdWVyeSIpLnZhbHVlICsgIi8iICsgcXVlcnl0eXBlKCkpCiAgICAgICAgdXBkYXRlcXVlcnkoKQogICAgICAgIHF1ZXJ5d2FpdC5yZXNvbHZlKCkKICAgICAgfSkKCiAgICAgIHFzKCIjcmVsYXlzLWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBhc3luYyBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBsZXQgciA9IEpTT04uc3RyaW5naWZ5KHFzKCIjcmVsYXlzIikudmFsdWUuc3BsaXQoIlxuIikpCiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oInJlbGF5cyIsIHIpCiAgICAgICAgZGlzY29ubmVjdCgpCiAgICAgIH0pCgogICAgICBxcygiI3ByaXZrZXktZm9ybSIpLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsIGFzeW5jIGUgPT4gewogICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIGNvbnN0IGtleSA9IHFzKCIjcHJpdmtleSIpLnZhbHVlCgogICAgICAgIGlmKGtleS5sZW5ndGggIT0gNjQgJiYga2V5Lmxlbmd0aCAhPSA2Myl7CiAgICAgICAgICBhbGVydCgia2V5IHNob3VsZCBiZSA2MyBvciA2NCBjaGFyYWN0ZXJzIGxvbmciKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJwcml2a2V5Iiwga2V5KQogICAgICAgIGFsZXJ0KCJrZXkgc2F2ZWQiKQogICAgICB9KQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwgYXN5bmMgKGUpID0+IHsKICAgICAgICBpZihhdXRvcGxheSgpID09ICJob3ZlciIgJiYgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2aWRlby1jb250YWluZXIiKSl7CiAgICAgICAgICBob3ZlcmVkdmlkZW8gPSBlLnRhcmdldC5xdWVyeVNlbGVjdG9yKCJ2aWRlbyIpCiAgICAgICAgICBob3ZlcmVkdmlkZW8ucGxheSgpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLCBhc3luYyAoZSkgPT4gewogICAgICAgIGhvdmVyZWR2aWRlbyA9IGZhbHNlCiAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5zdHlsZS5kaXNwbGF5ICE9ICJibG9jayIgJiYgYXV0b3BsYXkoKSA9PSAiaG92ZXIiICYmIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygidmlkZW8tY29udGFpbmVyIikpewogICAgICAgICAgcXNhKCJ2aWRlbyIpLmZvckVhY2godiA9PiB2LnBhdXNlKCkpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBhc3luYyAoZSkgPT4gewogICAgICAgIGlmKGUudGFyZ2V0LnR5cGUgPT0gInN1Ym1pdCIgfHwgKGUudGFyZ2V0LnRhZ05hbWUgPT0gIkEiICYmIGUudGFyZ2V0LmhyZWYubWF0Y2goL14ofHdlYlwrKW5vc3RyXDovKSkpewogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gInRpdGxlIil7CiAgICAgICAgICBxcygiI3F1ZXJ5IikudmFsdWUgPSAiIgogICAgICAgICAgcXMoIiNxdWVyeS10eXBlIikudmFsdWUgPSAiYWxsIgogICAgICAgICAgcXMoIiNnbyIpLmNsaWNrKCkKICAgICAgICB9CgogICAgICAgIGUucHJldmVudERlZmF1bHQoKQoKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAiZmlsdGVyLWxpa2VzIil7CiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC50b2dnbGUoImZpbHRlci1saWtlcyIpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzaG93IikpewogICAgICAgICAgYWN0aXZlKCk/LmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICBnaWQoZS50YXJnZXQuaWQpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBzaG93KGUudGFyZ2V0LmlkKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUudGFyZ2V0LnRhZ05hbWUgIT0gIkEiICYmIChxcygiI2ltYWdlLWNvbnRhaW5lciIpID09IGUudGFyZ2V0IHx8IHFzKCIjaW1hZ2UiKSA9PSBlLnRhcmdldCB8fCBxcygiI21lZGlhLWNvbnRhaW5lciB2aWRlbyIpID09IGUudGFyZ2V0KSl7CiAgICAgICAgICBoaWRlbWVkaWEoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAibWVudSIgfHwgZS50YXJnZXQuaWQgPT0gIm1lbnUtb3ZlcmxheSIpewogICAgICAgICAgbWVudSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2V0Y29scyIpKXsKICAgICAgICAgIGZvcihsZXQgYyBvZiBjb2xvcHRzKXsKICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCJjb2xzIiArIGMpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgiY29scyIgKyBlLnRhcmdldC5kYXRhc2V0LmNvbHMpCiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiY29scyIsIGUudGFyZ2V0LmRhdGFzZXQuY29scykKICAgICAgICAgIHNldGFjdGl2ZSgic2V0Y29scyIsICJjb2xzIiwgY29scygpKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogIAogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2V0YXV0b3BsYXkiKSl7CiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiYXV0b3BsYXkiLCBlLnRhcmdldC5kYXRhc2V0LmF1dG9wbGF5KQogICAgICAgICAgc2V0YWN0aXZlKCJzZXRhdXRvcGxheSIsICJhdXRvcGxheSIsIGF1dG9wbGF5KCkpCiAgICAgICAgICB1cGRhdGVhbGx2aWRlb3BsYXkoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygibGlrZSIpICYmIGxpa2UoZS50YXJnZXQpCiAgICAgIH0pCiAgICAgIAogICAgICBmdW5jdGlvbiBoYXNrZXkoKXsKICAgICAgICByZXR1cm4gd2luZG93Lm5vc3RyIHx8IHByaXZrZXkoKQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBwdWJrZXkoKXsKICAgICAgICByZXR1cm4gd2luZG93Lm5vc3RyICYmIGF3YWl0IHdpbmRvdy5ub3N0ci5nZXRQdWJsaWNLZXkoKSB8fCBOb3N0clRvb2xzLmdldFB1YmxpY0tleShwcml2a2V5KCkpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHNpZ24oZXZlbnQpewogICAgICAgIGlmKHdpbmRvdy5ub3N0cil7CiAgICAgICAgICByZXR1cm4gYXdhaXQgbm9zdHIuc2lnbkV2ZW50KGV2ZW50KQogICAgICAgIH0KICAgICAgICAKICAgICAgICBldmVudC5zaWcgPSBOb3N0clRvb2xzLmdldFNpZ25hdHVyZShldmVudCwgcHJpdmtleSgpKQogICAgICAgIHJldHVybiBldmVudAogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBsaWtlKGxpbmspewogICAgICAgIGNvbnN0IGV2ZW50ID0gbGluay5wYXJlbnRFbGVtZW50WyJkYXRhLWV2ZW50Il0KICAgICAgICBjb25zdCBwdWJrID0gYXdhaXQgcHVia2V5KCkKICAgICAgICBjb25zdCBsaWtlID0gYXdhaXQgc2lnbih7CiAgICAgICAgICAia2luZCI6IDcsCiAgICAgICAgICAiY29udGVudCI6ICIrIiwKICAgICAgICAgICJ0YWdzIjogWwogICAgICAgICAgICBbImUiLCBldmVudC5pZF0sCiAgICAgICAgICAgIFsicCIsIGV2ZW50LnB1YmtleV0KICAgICAgICAgIF0sCiAgICAgICAgICAicHVia2V5IjogcHViaywKICAgICAgICAgICJjcmVhdGVkX2F0IjogcGFyc2VJbnQoRGF0ZS5ub3coKSAvIDEwMDAgLCAxMCkKICAgICAgICB9KQogICAgICAgIAogICAgICAgIHNvY2tldHMuZm9yRWFjaChzID0+IHMuc2VuZChKU09OLnN0cmluZ2lmeShbIkVWRU5UIiwgbGlrZV0pKSkKICAgICAgICBsaW5rLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQoKICAgICAgICBjb25zdCBpbWFnZWlkID0gbGlua1siZGF0YS1pdGVtLWlkIl0gfHwgbGluay5kYXRhc2V0LmltYWdlSWQKICAgICAgICAKICAgICAgICBpZihpbWFnZWlkKXsKICAgICAgICAgIGdpZChpbWFnZWlkKS5xdWVyeVNlbGVjdG9yKCIubGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgIH0KICAgICAgfQogICAgCiAgICAgIGZ1bmN0aW9uIHN3aXBlKG9mZnNldCl7CiAgICAgICAgaWYoaW1hZ2VvZmZzZXQob2Zmc2V0KSl7CiAgICAgICAgICBpbWFnZW9mZnNldChvZmZzZXQpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICB0aGlzW29mZnNldCA9PSAtMSAmJiAibGFzdGFjdGl2ZSIgfHwgImFjdGl2ZSJdKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIHVwZGF0ZXNob3coKQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlc2hvdygpewogICAgICAgIGlmKHFzKCIjbWVkaWEtY29udGFpbmVyIikuc3R5bGUuZGlzcGxheSA9PSAiYmxvY2siKXsKICAgICAgICAgIGhpZGV2aWRlbygpCiAgICAgICAgICBzaG93KGFjdGl2ZSgpLmlkKQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIGUgPT4gewogICAgICAgIGlmKFsiVGFiIiwgIkFycm93TGVmdCIsICJBcnJvd1JpZ2h0IiwgIkFycm93VXAiLCAiQXJyb3dEb3duIl0uaW5jbHVkZXMoZS5rZXkpKXsKICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkVzY2FwZSIpewogICAgICAgICAgbWVudSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS5rZXkgPT0gIkVudGVyIiAmJiBlLnRhcmdldC50YWdOYW1lID09ICJCT0RZIil7CiAgICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLnN0eWxlLmRpc3BsYXkgPT0gImJsb2NrIil7CiAgICAgICAgICAgIGhpZGVtZWRpYSgpCiAgICAgICAgICAgIHJldHVybgogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBzaG93KGFjdGl2ZSgpLmlkKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dVcCIgJiYgaW1hZ2VvZmZzZXQoLWNvbHMoKSkpewogICAgICAgICAgaW1hZ2VvZmZzZXQoLWNvbHMoKSkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIGxhc3RhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgdXBkYXRlc2hvdygpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dEb3duIiAmJiBpbWFnZW9mZnNldChjb2xzKCkpKXsKICAgICAgICAgIGltYWdlb2Zmc2V0KGNvbHMoKSkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICB1cGRhdGVzaG93KCkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd0xlZnQiKXsKICAgICAgICAgIHN3aXBlKC0xKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93UmlnaHQiKXsKICAgICAgICAgIHN3aXBlKDEpCiAgICAgICAgfQogICAgICB9KQoKICAgICAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlcXVlcnlyZXMocmVzLCBzb2NrZXQsIHEsIHR5cGUsIHN0aW1lKXsKICAgICAgICBzYXZlKHNvY2tldCwgcmVzLCBxLCB0eXBlLCBmYWxzZSwgZmFsc2UsIHRydWUpCiAgICAgICAgbG9nKCJxdWVyeSByZXMiLCByZXMubGVuZ3RoLCBzb2NrZXQudXJsKQogICAgICAgIHF1ZXJ5Y291bnQtLQogICAgICAgIGlmKHF1ZXJ5Y291bnQgPT0gMCl7CiAgICAgICAgICBxcygiI2xvYWRpbmciKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxldCB3YWl0ID0gd2FpdG1zIC0gKERhdGUubm93KCkgLSBzdGltZSkKICAgICAgICBxdWVyeXdhaXQgPSBzbGVlcCh3YWl0KQogICAgICAgIGF3YWl0IHF1ZXJ5d2FpdC5wcm9taXNlCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHByaW1hbGdsb2JhbChzb2NrZXQpewogICAgICAgIGxvZygiZ2xvYmFsIiwgc29ja2V0LnVybCkKICAgICAgICBxdWVyeWNvdW50KysKICAgICAgICBxcygiI2xvYWRpbmciKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgIGxldCBzdGltZSA9IERhdGUubm93KCkKICAgICAgICBsZXQgcWlkID0gImdsb2JhbF8iICsgKCsraWRjb3VudGVyKQogICAgICAgIGxldCBxaWRsaWtlcyA9ICJsaWtlc18iICsgKCsraWRjb3VudGVyKQoKICAgICAgICBpZihuZXdsaWtlcy5sZW5ndGggPiAwKXsKICAgICAgICAgIHByaW1hbHNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KFsKICAgICAgICAgICAgIlJFUSIsIAogICAgICAgICAgICBxaWRsaWtlcywgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiY2FjaGUiOiBbCiAgICAgICAgICAgICAgICAiZXZlbnRzIiwgewogICAgICAgICAgICAgICAgICAiZXZlbnRfaWRzIjogbmV3bGlrZXMKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0KICAgICAgICAgIF0pKQoKICAgICAgICAgIGNvbnN0IGxpa2VfZXZlbnRzID0gYXdhaXQgd2FpdHJlcyhxaWRsaWtlcykKICAgICAgICAgIG5ld2xpa2VzLnNwbGljZSgwKQogICAgICAgICAgCiAgICAgICAgICBhd2FpdCBzYXZlKHNvY2tldCwgbGlrZV9ldmVudHMsICIiLCAiYWxsIiwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KFsKICAgICAgICAgICJSRVEiLCAKICAgICAgICAgIHFpZCwgCiAgICAgICAgICB7CiAgICAgICAgICAgICJjYWNoZSI6IFsKICAgICAgICAgICAgICAiZXhwbG9yZSIsIAogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJ0aW1lZnJhbWUiOiAibGF0ZXN0IiwKICAgICAgICAgICAgICAgICJzY29wZSI6ICJnbG9iYWwiLAogICAgICAgICAgICAgICAgImxpbWl0IjogMjAKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdKSkKICAgICAgICAKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB3YWl0cmVzKHFpZCkKICAgICAgICBhd2FpdCBoYW5kbGVxdWVyeXJlcyhyZXMuZmlsdGVyKGUgPT4gZS5raW5kID09IDEpLCBzb2NrZXQsICIiLCAiYWxsIiwgc3RpbWUpCiAgICAgICAgcHJpbWFsZ2xvYmFsKHNvY2tldCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnkoc29ja2V0LCBwcmltYWwpewogICAgICAgIGxvZygicXVlcnkiLCBzb2NrZXQudXJsKQogICAgICAgIHF1ZXJ5Y291bnQrKwogICAgICAgIHFzKCIjbG9hZGluZyIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgICAgCiAgICAgICAgbGV0IHN0aW1lID0gRGF0ZS5ub3coKQogICAgICAgIGxldCBxID0gcXVlcnlzdHIudHJpbSgpCiAgICAgICAgbGV0IHR5cGUgPSBxdWVyeXR5cGUoKQogICAgICAgIGxldCBpID0gKytpZGNvdW50ZXIKICAgICAgICBsZXQgcWlkID0gInF1ZXJ5XyIgKyBpCiAgICAgICAgbGV0IGZpbHRlcnMgPSBbXQoKICAgICAgICBmaWx0ZXJzLnB1c2goLi4uKHR5cGVzW3R5cGVdIHx8IFtdKS5tYXAoKHQpID0+IHsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGtpbmRzOiBbMV0sIAogICAgICAgICAgICBzZWFyY2g6ICIuIiArIHQsCiAgICAgICAgICAgIGxpbWl0OiAyMAogICAgICAgICAgfQogICAgICAgIH0pKQogICAgICAgIAogICAgICAgIGlmKHEubGVuZ3RoID4gMCl7CiAgICAgICAgICBmaWx0ZXJzLnB1c2goe2tpbmRzOiBbMV0sIHNlYXJjaDogcX0pCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGZpbHRlcnMubGVuZ3RoID09IDApewogICAgICAgICAgZmlsdGVycy5wdXNoKHtraW5kczogWzFdfSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgCiAgICAgICAgY29uc3QgbGlrZXNyZXMgPSBhd2FpdCBxdWVyeWxpa2VzKHNvY2tldCkKICAgICAgICAKICAgICAgICBsaWtlc3Jlcy5mb3JFYWNoKGV2ZW50aWQgPT4gewogICAgICAgICAgaWYoIWxpa2VzLmluY2x1ZGVzKGV2ZW50aWQpKXsKICAgICAgICAgICAgbGlrZXMucHVzaChldmVudGlkKQogICAgICAgICAgICBuZXdsaWtlcy5wdXNoKGV2ZW50aWQpCiAgICAgICAgICB9CiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBjb25zdCBzZWFyY2hvYmogPSBbIlJFUSIsIHFpZCwgLi4uZmlsdGVyc10KICAgICAgICBjb25zdCBzZWFyY2hqc29uID0gSlNPTi5zdHJpbmdpZnkoc2VhcmNob2JqKQogICAgICAgIHNvY2tldC5zZW5kKHNlYXJjaGpzb24pCiAgICAgICAgCiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgd2FpdHJlcyhxaWQpCiAgICAgICAgYXdhaXQgaGFuZGxlcXVlcnlyZXMocmVzLCBzb2NrZXQsIHEsIHR5cGUsIHN0aW1lKQogICAgICAgIHF1ZXJ5KHNvY2tldCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlsaWtlcyhzb2NrZXQpewogICAgICAgIGlmKCFoYXNrZXkoKSl7CiAgICAgICAgICByZXR1cm4gW10KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgbXlwdWJrZXkgPSBhd2FpdCBwdWJrZXkoKQogICAgICAgIGNvbnN0IGV2ZW50cyA9IGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzddLCBudWxsLCBbbXlwdWJrZXldKQogICAgICAgIHJldHVybiBldmVudHMubWFwKGUgPT4gZS50YWdzLmZpbmQodCA9PiB0WzBdID09ICJlIilbMV0pCiAgICAgIH0KCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5ZXZlbnRzKHNvY2tldCwga2luZHMsIGV2ZW50aWRzLCBhdXRob3JzKXsKICAgICAgICBjb25zdCBxdWVyeWlkID0gImV2ZW50c18iICsgKCsraWRjb3VudGVyKQogICAgICAgIGNvbnN0IGZpbHRlcnMgPSB7fQogICAgICAgIAogICAgICAgIGZpbHRlcnMua2luZHMgPSBraW5kcwogICAgICAgIAogICAgICAgIGlmKGV2ZW50aWRzKXsKICAgICAgICAgIGZpbHRlcnNbIiNlIl0gPSBldmVudGlkcwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihhdXRob3JzKXsKICAgICAgICAgIGZpbHRlcnNbImF1dGhvcnMiXSA9IGF1dGhvcnMKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KFsKICAgICAgICAgICJSRVEiLCAKICAgICAgICAgIHF1ZXJ5aWQsIAogICAgICAgICAgZmlsdGVycwogICAgICAgIF0pCgogICAgICAgIHNvY2tldC5zZW5kKGpzb24pCiAgICAgICAgCiAgICAgICAgcmV0dXJuIGF3YWl0IHdhaXRyZXMocXVlcnlpZCkgfHwgW10KICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlwdWJrZXkoc29ja2V0LCBwdWJrKXsKICAgICAgICBjb25zdCBxdWVyeWlkID0gInF1ZXJ5XyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgc29ja2V0LnNlbmQocXVlcmllcy5hdXRob3IucmVwbGFjZSgiPEk+IiwgcXVlcnlpZCkucmVwbGFjZSgiPFA+IiwgcHViaykpCgogICAgICAgIHJldHVybiAoYXdhaXQgd2FpdHJlcyhxdWVyeWlkKSkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gc2F2ZShzb2NrZXQsIGV2ZW50ZGIsIHEsIHF0eXBlLCByZWFjdGVkLCBhcHBlbmQsIHF1ZXJ5bWV0YSl7CiAgICAgICAgbGV0IGV2ZW50cHVia2V5cyA9IFtdCiAgICAgICAgY29uc3QgZXZlbnRzID0gZXZlbnRkYi5maWx0ZXIobyA9PiB7CiAgICAgICAgICBpZihxLmxlbmd0aCA+IDApewogICAgICAgICAgICBmb3IobGV0IHdvcmQgb2YgcS5zcGxpdCgiICIpKXsKICAgICAgICAgICAgICBpZihvLmNvbnRlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKHdvcmQudG9Mb3dlckNhc2UoKSkgPT0gLTEpewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgcmV0dXJuIHRydWUKICAgICAgICB9KQogICAgICAgIAogICAgICAgIGxldCByZXN1bHRzID0gW10KICAgICAgICBjb25zdCBldmVudGlkcyA9IGV2ZW50cy5tYXAoZSA9PiBlLmlkKQogICAgICAgIGxldCBuZXd1cmxzID0gW10KICAgICAgICAKICAgICAgICBmb3IobGV0IGV2ZW50IG9mIGV2ZW50cyl7CiAgICAgICAgICBsZXQgdXJsc21hdGNoID0gW10KICAgICAgICAgIAogICAgICAgICAgaWYocXR5cGUgIT0gInZpZGVvIil7CiAgICAgICAgICAgIHVybHNtYXRjaC5wdXNoKC4uLihldmVudC5jb250ZW50Lm1hdGNoKGltZ3JlZ2V4KSB8fCBbXSkpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGlmKHF0eXBlICE9ICJpbWFnZSIpewogICAgICAgICAgICB1cmxzbWF0Y2gucHVzaCguLi4oZXZlbnQuY29udGVudC5tYXRjaCh2aWRlb3JlZ2V4KSB8fCBbXSkpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHVybHNtYXRjaCA9IHVybHNtYXRjaC5maWx0ZXIodXJsID0+ICF1cmxzLmluY2x1ZGVzKHVybCkpCgogICAgICAgICAgaWYodXJsc21hdGNoLmxlbmd0aCA+IDApewogICAgICAgICAgICBuZXd1cmxzLnB1c2goewogICAgICAgICAgICAgIGV2ZW50OiBldmVudCwKICAgICAgICAgICAgICB1cmxzOiB1cmxzbWF0Y2gKICAgICAgICAgICAgfSkKICAgICAgICAgICAgCiAgICAgICAgICAgIHVybHMucHVzaCguLi51cmxzbWF0Y2gpCiAgICAgICAgICAgIGV2ZW50cHVia2V5cy5pbmNsdWRlcyhldmVudC5wdWJrZXkpIHx8IGV2ZW50cHVia2V5cy5wdXNoKGV2ZW50LnB1YmtleSkKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbG9nKCJxdWVyeSBtZXRhIiwgc29ja2V0LnVybCkKICAgICAgICBsZXQgbWV0YWV2ZW50cyA9IChxdWVyeW1ldGEgJiYgYXdhaXQgcXVlcnlldmVudHMoc29ja2V0LCBbMF0sIG51bGwsIGV2ZW50cHVia2V5cykgfHwgW10pCiAgICAgICAgCiAgICAgICAgZm9yKGxldCBlbnRyeSBvZiBuZXd1cmxzKXsKICAgICAgICAgIGZvcihsZXQgdXJsIG9mIGVudHJ5LnVybHMpewogICAgICAgICAgICByZXN1bHRzLnB1c2goewogICAgICAgICAgICAgIHJlYWN0ZWQ6IHJlYWN0ZWQgfHwgbGlrZXMuaW5jbHVkZXMoZW50cnkuZXZlbnQuaWQpLCAKICAgICAgICAgICAgICB1cmw6IHVybCwgCiAgICAgICAgICAgICAgZXZlbnQ6IGVudHJ5LmV2ZW50LCAKICAgICAgICAgICAgICBiZWNoMzJpZDogYmVjaDMyLmVuY29kZSgibm90ZSIsIGZyb21IZXhTdHJpbmcoZW50cnkuZXZlbnQuaWQpKSwKICAgICAgICAgICAgICBtZXRhOiBtZXRhZXZlbnRzLmZpbmQobyA9PiBvLnB1YmtleSA9PSBlbnRyeS5ldmVudC5wdWJrZXkpCiAgICAgICAgICAgIH0pCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxvZygic2F2ZSByZXMiLCByZXN1bHRzLmxlbmd0aCwgc29ja2V0LnVybCkKICAgICAgICB1cGRhdGVjb250ZW50KHJlc3VsdHMsIHEsIGFwcGVuZCkKICAgICAgfQogICAgICAKICAgICAgbGV0IGxvYWRlZCA9IDAKICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZWNvbnRlbnQocmVzdWx0cywgcSwgYXBwZW5kKXsKICAgICAgICByZXN1bHRzLnJldmVyc2UoKS5mb3JFYWNoKGl0ZW0gPT4gewogICAgICAgICAgY29uc3QgdHlwZSA9IGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpICYmICJ2aWRlbyIgfHwgImltYWdlIgogICAgICAgICAgY29uc3QgdGV4dCA9IChxIHx8ICJ2aWV3IG5vdGUiKS5zdWJzdHJpbmcoLTMwKQogICAgICAgICAgY29uc3QgaWQgPSAiaXRlbV8iICsgKCsraWRjb3VudGVyKQogICAgICAgICAgY29uc3QgY29udGVudGVsZW1lbnRzID0gJzxkaXYgY2xhc3M9InR5cGUiPicgKyBxcygiI3RlbXBsYXRlIC4iICsgdHlwZSArICJzdmciKS5vdXRlckhUTUwgKyAnPC9kaXY+PGEgY2xhc3M9Imxpa2UnICsgKGl0ZW0ucmVhY3RlZCA/ICcgcmVhY3RlZCcgOiAnJykgKyAnIiBkYXRhLWl0ZW0taWQ9IicgKyBpZCArIAogICAgICAgICAgICAnIiBocmVmPSIjIj4nICsgcXMoIiN0ZW1wbGF0ZSAuaGVhcnRzdmciKS5vdXRlckhUTUwgKyAnPC9hPjxhIGNsYXNzPSJxdWVyeSIgaHJlZj0iJyArIHByb3RvY29sICsgCiAgICAgICAgICAgIGl0ZW0uYmVjaDMyaWQgKyAnIj4nICsgdGV4dCArICc8L2E+JwogICAgICAgICAgbGV0IHJvb3QgPSBudWxsCiAgICAgICAgICBsZXQgdiA9IG51bGwKICAgICAgICAgIAogICAgICAgICAgaWYoaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleCkpewogICAgICAgICAgICByb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikKICAgICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJ2aWRlby1jb250YWluZXIiKQogICAgICAgICAgICByb290LmlubmVySFRNTCA9IGNvbnRlbnRlbGVtZW50cwogICAgICAgICAgICAKICAgICAgICAgICAgdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIikKICAgICAgICAgICAgdlsiZGF0YS1pdGVtLWlkIl0gPSBpZAogICAgICAgICAgICB2LnByZWxvYWQgPSAibm9uZSIKICAgICAgICAgICAgdi5sb29wID0gdHJ1ZQogICAgICAgICAgICB2LnBsYXlzaW5saW5lID0gIiIKICAgICAgICAgICAgCiAgICAgICAgICAgIHYub25jYW5wbGF5ID0gYXN5bmMgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgY29uc3QgYXNwZWN0ID0gdGhpcy52aWRlb1dpZHRoIC8gdGhpcy52aWRlb0hlaWdodAogICAgICAgICAgICAgIGlmKGFzcGVjdCA+IDEpewogICAgICAgICAgICAgICAgdGhpcy5zdHlsZS53aWR0aCA9IChhc3BlY3QgKiAxMDApICsgIiUiCiAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLmhlaWdodCA9ICgxIC8gYXNwZWN0ICogMTAwKSArICIlIgogICAgICAgICAgICAgICAgdGhpcy5zdHlsZS5tYXJnaW5Ub3AgPSAtKCgxIC8gYXNwZWN0ICogMTAwIC0gMTAwKSAvIDIpICsgIiUiCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIAogICAgICAgICAgICAgIHVwZGF0ZXZpZGVvcGxheSh0aGlzLnBhcmVudEVsZW1lbnQpCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnN0IGV4dCA9IGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpWzFdCiAgICAgICAgICAgIHYuaW5uZXJIVE1MID0gJzxzb3VyY2Ugc3JjPSInICsgaXRlbS51cmwgKyAnIiB0eXBlPSJ2aWRlby8nICsgZXh0ICsgJyI+PC9zb3VyY2U+JwogICAgICAgICAgICAKICAgICAgICAgICAgcm9vdC5hcHBlbmQodikKICAgICAgICAgIH1lbHNlIGlmKGl0ZW0udXJsLm1hdGNoKGltZ2V4dHJlZ2V4KSl7CiAgICAgICAgICAgIHJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIikKICAgICAgICAgICAgcm9vdC5ocmVmID0gIiMiCiAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MID0gY29udGVudGVsZW1lbnRzCiAgICAgICAgICAgICAgCiAgICAgICAgICAgIGlmKHR5cGUgPT0gImltYWdlIil7CiAgICAgICAgICAgICAgLy9sZXQgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIikKICAgICAgICAgICAgICAvL2ltZy5hbHQgPSBpdGVtLnVybAogICAgICAgICAgICAgIHJvb3RbImRhdGEtc3JjIl0gPSBpdGVtLnVybAogICAgICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgiaW1nIikKICAgICAgICAgICAgICAvL2ltZy5jbGFzc0xpc3QuYWRkKCJkYXRhIikKICAgICAgICAgICAgICAvL3Jvb3QuYXBwZW5kKGltZykKICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgcm9vdC5pbm5lckhUTUwgKz0gJzxzcGFuIGNsYXNzPSJmaWxlIj4nICsgaXRlbS51cmwgKyAnPC9zcGFuPicKICAgICAgICAgICAgfQogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIHJldHVybgogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICByb290LmlkID0gaWQKICAgICAgICAgIHJvb3Quc3R5bGUuZGlzcGxheSA9ICdibG9jaycKICAgICAgICAgIHJvb3RbImRhdGEtaXRlbSJdID0gaXRlbQogICAgICAgICAgcm9vdFsiZGF0YS1ldmVudCJdID0gaXRlbS5ldmVudAogICAgICAgICAgcm9vdFsiZGF0YS1xdWVyeSJdID0gcQogICAgICAgICAgcm9vdFsiZGF0YS10ZXh0Il0gPSB0ZXh0CiAgICAgICAgICAKICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCh0eXBlKQogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJpdGVtIikKICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgic2hvdyIpCiAgICAgICAgICAKICAgICAgICAgIGlmKGl0ZW0ucmVhY3RlZCl7CiAgICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHFzKCIjaW1hZ2VzIilbYXBwZW5kICYmICJhcHBlbmQiIHx8ICJwcmVwZW5kIl0ocm9vdCkKICAgICAgICAgIAogICAgICAgICAgaWYodil7CiAgICAgICAgICAgIHVwZGF0ZXZpZGVvcGxheShyb290KQogICAgICAgICAgfQogICAgICAgIH0pCgogICAgICAgIHVwZGF0ZWltYWdlc2xvYWQoKQogICAgICAgIAogICAgICAgIGlmKGFjdGl2ZSgpID09IG51bGwpewogICAgICAgICAgcXMoIiNpbWFnZXMgLml0ZW0iKT8uY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGhpZGVtZWRpYSgpewogICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAic2Nyb2xsIgogICAgICAgIHFzYSgiI21lZGlhLWNvbnRhaW5lciwgI2ltYWdlLCAjbWVkaWEtZm9vdGVyIikuZm9yRWFjaChuID0+IG4uc3R5bGUuZGlzcGxheSA9ICJub25lIikKICAgICAgICBnaWQoImltYWdlLWxpa2UiKS5jbGFzc0xpc3QucmVtb3ZlKCJyZWFjdGVkIikKICAgICAgICBoaWRldmlkZW8oKQogICAgICB9CgogICAgICBmdW5jdGlvbiBoaWRldmlkZW8oKXsKICAgICAgICBjb25zdCB2ID0gcXMoIiNtZWRpYS1jb250YWluZXIgdmlkZW8iKQogICAgICAgIAogICAgICAgIGlmKHYpewogICAgICAgICAgdi5tdXRlZCA9IHRydWUKICAgICAgICAgIGdpZCh2WyJkYXRhLWl0ZW0taWQiXSkuYXBwZW5kQ2hpbGQodikKICAgICAgICAgIHVwZGF0ZXZpZGVvcGxheSh2LnBhcmVudEVsZW1lbnQpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB3YWl0cmVzKGtleSl7CiAgICAgICAgbGV0IGV2ZW50cyA9IFtdCiAgICAgICAgCiAgICAgICAgbGV0IHJlc2hhbmRsZXIgPSBmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewogICAgICAgICAgdGhpcy5oYW5kbGUgPSBmdW5jdGlvbihyZXMpewogICAgICAgICAgICBsZXQgbyA9IEpTT04ucGFyc2UocmVzLmRhdGEpCiAgICAgICAgICAgIGlmKG9bMV0gPT0ga2V5KXsKICAgICAgICAgICAgICBpZihvWzBdID09ICJFT1NFIil7CiAgICAgICAgICAgICAgICByZXNvbHZlKGV2ZW50cykKICAgICAgICAgICAgICAgIHJlc2hhbmRsZXJzLnNwbGljZShyZXNoYW5kbGVycy5pbmRleE9mKHRoaXMpLCAxKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBldmVudHMucHVzaChvWzJdKQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICAgIHJlc2hhbmRsZXJzLnB1c2gobmV3IHJlc2hhbmRsZXIocmVzb2x2ZSwgcmVqZWN0KSkKICAgICAgICB9KQogICAgICB9CiAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gY2hlY2t1cGRhdGUoc29ja2V0KXsKICAgICAgICBjb25zdCB1cGRhdGVzcmVzID0gYXdhaXQgcXVlcnlwdWJrZXkoc29ja2V0LCB1cGRhdGVzcHVia2V5KQogICAgICAgIGNvbnN0IHVwZGF0ZW5vdGUgPSB1cGRhdGVzcmVzLmZpbmQobiA9PiBuLmNvbnRlbnQubWF0Y2goL15odHRwc1w6XC9cLy8pKQogICAgICAgIAogICAgICAgIGlmKCF1cGRhdGVub3RlKXsKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBhZ2UgPSBNYXRoLnJvdW5kKChEYXRlLm5vdygpIC8gMTAwMCAtIHVwZGF0ZW5vdGUuY3JlYXRlZF9hdCkgLyAzNjAwIC8gMjQpCiAgICAgICAgY29uc3Qgbm90ZWlkID0gYmVjaDMyLmVuY29kZSgibm90ZSIsIGZyb21IZXhTdHJpbmcodXBkYXRlbm90ZS5pZCkpCiAgICAgICAgcXMoIiNyZWxlYXNlIikuaHJlZiA9IHByb3RvY29sICsgbm90ZWlkCiAgICAgICAgcXMoIiNyZWxlYXNlIikuaW5uZXJUZXh0ID0gKGFnZSA9PSAwICYmICJ0b2RheSIgfHwgYWdlICsgIiBkYXkocykgYWdvIikKICAgICAgfQoKICAgICAgZnVuY3Rpb24gc2xlZXAobXMpewogICAgICAgIHJldHVybiBuZXcgZnVuY3Rpb24oKXsKICAgICAgICAgIGxldCB0aW1lb3V0ID0gbnVsbAogICAgICAgICAgbGV0IHIgPSBudWxsCiAgICAgICAgICAKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHByb21pc2U6IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7CiAgICAgICAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSgpLCBtcykKICAgICAgICAgICAgICByID0gcmVzb2x2ZQogICAgICAgICAgICB9KSwKICAgICAgICAgICAgcmVzb2x2ZTogZnVuY3Rpb24oKXsKICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCkKICAgICAgICAgICAgICByKCkKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gc2hvdyhpZCl7CiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICJoaWRkZW4iCiAgICAgICAgY29uc3QgaXRlbSA9IGdpZChpZClbImRhdGEtaXRlbSJdCiAgICAgICAgY29uc3QgbWVkaWEgPSBnaWQoIm1lZGlhLWNvbnRhaW5lciIpCiAgICAgICAgY29uc3QgaW1hZ2UgPSBnaWQoImltYWdlIikKCiAgICAgICAgaWYoaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleCkpewogICAgICAgICAgaW1hZ2Uuc3R5bGUuZGlzcGxheSA9ICJub25lIgogICAgICAgICAgY29uc3QgdiA9IGdpZChpZCkucXVlcnlTZWxlY3RvcigidmlkZW8iKQogICAgICAgICAgcXMoIiNtZWRpYS1jb250YWluZXIiKS5hcHBlbmRDaGlsZCh2KQogICAgICAgICAgdi5tdXRlZCA9IGZhbHNlCiAgICAgICAgICB2LnBsYXkoKQogICAgICAgIH1lbHNlewogICAgICAgICAgaW1hZ2Uuc3JjID0gaXRlbS51cmwKICAgICAgICAgIGltYWdlLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGl0ZW0ubWV0YSl7CiAgICAgICAgICBjb25zdCBtZXRhY29udGVudCA9IEpTT04ucGFyc2UoaXRlbS5tZXRhLmNvbnRlbnQpCiAgICAgICAgICBjb25zdCBuYW1lID0gbWV0YWNvbnRlbnQuZGlzcGxheV9uYW1lIHx8IG1ldGFjb250ZW50Lm5hbWUKICAgICAgICAgIHFzKCIjaW1hZ2UtdXNlciIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgICAgICBxcygiI2ltYWdlLXVzZXIiKS5ocmVmID0gcHJvdG9jb2wgKyBiZWNoMzIuZW5jb2RlKCJucHViIiwgZnJvbUhleFN0cmluZyhpdGVtLm1ldGEucHVia2V5KSkKICAgICAgICAgIHFzKCIjaW1hZ2UtdXNlciIpLmlubmVyVGV4dCA9IG5hbWUKICAgICAgICB9ZWxzZXsKICAgICAgICAgIHFzKCIjaW1hZ2UtdXNlciIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSIKICAgICAgICB9CgogICAgICAgIGdpZCgiaW1hZ2UtbGlrZSIpWyJkYXRhLWl0ZW0taWQiXSA9IGlkCiAgICAgICAgZ2lkKCJtZWRpYS1mb290ZXIiKVsiZGF0YS1ldmVudCJdID0gaXRlbS5ldmVudAoKICAgICAgICBpZihpdGVtLnJlYWN0ZWQpewogICAgICAgICAgZ2lkKCJpbWFnZS1saWtlIikuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGEgPSBxcygiI2ltYWdlLXF1ZXJ5IikKICAgICAgICBhLmhyZWYgPSBwcm90b2NvbCArIGl0ZW0uYmVjaDMyaWQKICAgICAgICBhLmlubmVyVGV4dCA9IGdpZChpZClbImRhdGEtdGV4dCJdCiAgICAgICAgICAKICAgICAgICBtZWRpYS5zdHlsZS5kaXNwbGF5ID0gZ2lkKCJtZWRpYS1mb290ZXIiKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBjb25uY291bnQoKXsKICAgICAgICByZXR1cm4gc29ja2V0cy5maWx0ZXIociA9PiByLnJlYWR5U3RhdGUgPT0gMSkubGVuZ3RoCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGRpc2Nvbm5lY3QoKXsKICAgICAgICBmb3IobGV0IHNvY2tldCBvZiBzb2NrZXRzKXsKICAgICAgICAgIHNvY2tldC5jbG9zZSgpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHNvY2tldHMuc3BsaWNlKDApCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGxvZyhtc2cpewogICAgICAgIGxldCBzY3JvbGwgPSBxcygiI2xvZ3MiKS5zY3JvbGxUb3AgPT0gcXMoIiNsb2dzIikuc2Nyb2xsVG9wTWF4CiAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikKICAgICAgICBkaXYuaW5uZXJUZXh0ID0gQXJyYXkuZnJvbShhcmd1bWVudHMpLmpvaW4oIiAiKQogICAgICAgIHFzKCIjbG9ncyIpLmFwcGVuZChkaXYpCiAgICAgICAgCiAgICAgICAgc2Nyb2xsICYmIHFzKCIjbG9ncyIpLnNjcm9sbFRvKDAsIHFzKCIjbG9ncyIpLnNjcm9sbFRvcE1heCkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gY29ubmVjdCh1cmwpewogICAgICAgIGxvZygiY29ubmVjdGluZyIsIHVybCkKICAgICAgICBsZXQgc29ja2V0ID0gbmV3IFdlYlNvY2tldCh1cmwpCiAgICAgICAgCiAgICAgICAgc29ja2V0Lm9ubWVzc2FnZSA9IG1lc3NhZ2UgPT4gcmVzaGFuZGxlcnMuZm9yRWFjaChyaCA9PiByaC5oYW5kbGUobWVzc2FnZSkpCiAgICAgICAgCiAgICAgICAgc29ja2V0Lm9uY2xvc2UgPSBhc3luYyBmdW5jdGlvbigpewogICAgICAgICAgc29ja2V0cy5zcGxpY2Uoc29ja2V0cy5pbmRleE9mKHNvY2tldCksIDEpCiAgICAgICAgICBxcygiI2Nvbm5jb3VudCIpLmlubmVyVGV4dCA9IGNvbm5jb3VudCgpICsgKHByaW1hbHNvY2tldCAmJiAxKQogICAgICAgICAgbG9nKCJkaXNjb25uZWN0ZWQiLCB0aGlzLnVybCwgY29ubmNvdW50KCkpCiAgICAgICAgICBhd2FpdCBzbGVlcCgxMDAwKS5wcm9taXNlCiAgICAgICAgICBjb25uZWN0KHRoaXMudXJsKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXQub25vcGVuID0gZnVuY3Rpb24oKXsKICAgICAgICAgIHFzKCIjY29ubmNvdW50IikuaW5uZXJUZXh0ID0gY29ubmNvdW50KCkgKyAocHJpbWFsc29ja2V0ICYmIDEpCiAgICAgICAgICBsb2coImNvbm5lY3RlZCIsIHRoaXMudXJsLCBjb25uY291bnQoKSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIHNvY2tldAogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgYXN5bmMgKCkgPT4gewogICAgICAgIHByaW1hbHNvY2tldCA9IGNvbm5lY3QoIndzczovL2NhY2hlMy5wcmltYWwubmV0L2NhY2hlMTciKQogICAgICAgIHByaW1hbHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIiwgZnVuY3Rpb24oKXsKICAgICAgICAgIHByaW1hbGdsb2JhbCh0aGlzKQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgcHJpbWFsc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIiwgZnVuY3Rpb24oKXsKICAgICAgICAgIHByaW1hbHNvY2tldCA9IG51bGwKICAgICAgICB9KQogICAgICAgIAogICAgICAgIGZvcihsZXQgdXJsIG9mIHJlbGF5cygpKXsKICAgICAgICAgIGNvbnN0IHNvY2tldCA9IGNvbm5lY3QodXJsKQogICAgICAgICAgc29ja2V0cy5wdXNoKHNvY2tldCkKICAgICAgICAgIAogICAgICAgICAgc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoIm9wZW4iLCBmdW5jdGlvbigpewogICAgICAgICAgICBjaGVja3VwZGF0ZSh0aGlzKQogICAgICAgICAgICBxdWVyeSh0aGlzKQogICAgICAgICAgfSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgYXdhaXQgc2xlZXAoMTAwKS5wcm9taXNlCiAgICAgICAgCiAgICAgICAgaWYoaGFza2V5KCkpewogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJub3N0ciIpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgZm9yKGxldCBjIG9mIGNvbG9wdHMpewogICAgICAgIGRvY3VtZW50LndyaXRlKCc8c3R5bGU+JyArIGNvbHNjc3MuaW5uZXJUZXh0LnJlcGxhY2UoL1wkXHtjb2xzXH0vZywgYykgKyAnPC9zdHlsZT4nKQogICAgICB9CiAgICA8L3NjcmlwdD4KICA8L2JvZHk+CjwvaHRtbD4K
https://ipfs.io/ipfs/QmXnVXDPsSWJXKVAtu6DDNcofcDk84BfQjDqEmbnQqj5fc
sha256
f62448aa213b9195b1b268b333b5ca0ad4c4d40bc27a6b3048a8eeb6df40ed4d files.html
base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyIvPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL3N2Z2ljb25zLnNwYXJray5mci9zdmdpY29ucy5jc3MiLz4KICAgIDxzdHlsZT4KICAgICAgKiB7CiAgICAgICAgb3ZlcnNjcm9sbC1iZWhhdmlvci15OiBjb250YWluOwogICAgICB9CiAgICAgIAogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksIAogICAgICAjaGVhZGVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncywgCiAgICAgICNwcml2a2V5IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncyB7CiAgICAgICAgaGVpZ2h0OiA2ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNsb2dzIHsKICAgICAgICBoZWlnaHQ6IDhlbTsKICAgICAgICBvdmVyZmxvdzogc2Nyb2xsOwogICAgICAgIGZvbnQtc2l6ZTogLjhlbTsKICAgICAgfQogICAgICAKICAgICAgc2VsZWN0IHsKICAgICAgICB3aWR0aDogNGVtOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLCAKICAgICAgaW5wdXQuc3VibWl0IHsKICAgICAgICBib3JkZXItcmFkaXVzOiAuNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0LCAKICAgICAgI2hlYWRlciBhLAogICAgICAjbWVkaWEtY29udGFpbmVyIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLCAKICAgICAgZm9ybSwgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHotaW5kZXg6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgIAogICAgICBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDMwZW0pIHsKICAgICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgfQogICAgICB9CgogICAgICBmb3JtIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeSB7CiAgICAgICAgd2lkdGg6IDZlbTsKICAgICAgfQogICAgICAKICAgICAgI2xvYWRpbmcgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMHB4OwogICAgICAgIGxlZnQ6IDI3ZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgIGEgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgfQoKICAgICAgdmlkZW8gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogIAogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgIGhlaWdodDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgIG1hcmdpbi10b3A6IDAgIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgLnR5cGUgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICB6LWluZGV4OiAxOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2UtcXVlcnkgewogICAgICAgIHdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksCiAgICAgIGEsCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICB9CgogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbWluLXdpZHRoOiAzZW07CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLAogICAgICAjaGVhZGVyIHNwYW4gewogICAgICAgIHBhZGRpbmc6IDAuNWVtOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CgogICAgICAjaGVhZGVyIHsKICAgICAgICBwYWRkaW5nOiAwLjQ1ZW0gMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAjaGVhZGVyIC5pdGVtcyB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgLml0ZW1zIHsKICAgICAgICBtYXJnaW4tdG9wOiAuM2VtOwogICAgICB9CgogICAgICBwIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICAubGFiZWwgewogICAgICAgIHBhZGRpbmc6IC44ZW0gLjhlbSAuOGVtIDA7CiAgICAgIH0KCiAgICAgICNpbWFnZXMgLnF1ZXJ5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KCiAgICAgICNtZWRpYS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwKTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlIHsKICAgICAgICBtYXgtd2lkdGg6IDEwMHZ3OwogICAgICAgIG1heC1oZWlnaHQ6IDEwMHZoOwogICAgICB9CiAgICAgICAgCiAgICAgICNpbWFnZXMgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZXMgLml0ZW0gewogICAgICAgIHdpZHRoOiAyNXZ3OwogICAgICB9CgogICAgICAjaW1hZ2VzIC5pdGVtIHsKICAgICAgICBoZWlnaHQ6IDI1dnc7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgI21lZGlhLWNvbnRhaW5lciB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgYm9keTpub3QoLm5vc3RyKSAjZmlsdGVyLWxpa2VzLCAKICAgICAgLmZpbHRlci1saWtlcyAjaW1hZ2VzID4gLml0ZW06bm90KC5yZWFjdGVkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIHotaW5kZXg6IDI7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDN2dzsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBwYWRkaW5nOiAwIDF2dzsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UsIAogICAgICAjaW1hZ2UtcXVlcnksIAogICAgICAudmlkZW9zdmcsCiAgICAgIC5pbWFnZXN2ZyB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjYpOwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSB7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGZvbnQtc2l6ZTogbWluKDMuNXZ3LCAxLjVlbSk7CiAgICAgICAgbWF4LXdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1xdWVyeSB7CiAgICAgICAgcGFkZGluZzogLjZlbSAuNGVtIC4xZW0gLjRlbTsKICAgICAgICBtYXgtd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgLmxpa2UucmVhY3RlZCwKICAgICAgLmZpbHRlci1saWtlcyAjZmlsdGVyLWxpa2VzIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7CiAgICAgIH0KCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIGZvbnQtc2l6ZTogM2VtOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2UtcXVlcnksCiAgICAgICNpbWFnZS11c2VyLAogICAgICAjbWVkaWEtZm9vdGVyIC5saWtlIHsKICAgICAgICB6LWluZGV4OiA1OwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlLXF1ZXJ5LAogICAgICAjaW1hZ2UtdXNlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgICNpbWFnZS11c2VyIHsKICAgICAgICBib3R0b206IDEuOWVtOwogICAgICAgIGZvbnQtc2l6ZTogMS44ZW07CiAgICAgICAgcGFkZGluZy1yaWdodDogLjY1ZW07CiAgICAgICAgbWF4LXdpZHRoOiA4ZW07CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgIH0KICAgICAgCiAgICAgIC5saWtlIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IGF1dG87CiAgICAgICAgcGFkZGluZzogLjJlbTsKICAgICAgICB3aWR0aDogMWVtOwogICAgICAgIGhlaWdodDogMWVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5ub3N0ciAubGlrZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7ICAKICAgICAgfQoKICAgICAgI21lZGlhLWZvb3RlciAubGlrZSB7CiAgICAgICAgZm9udC1zaXplOiAyLjRlbTsKICAgICAgfQoKICAgICAgI21lZGlhLWZvb3RlciB7CiAgICAgICAgZGlzcGxheTogbm9uZTsgIAogICAgICB9CiAgCiAgICAgICNpbWFnZXMgLmltZyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIGJhY2tncm91bmQtc2l6ZTogY292ZXI7CiAgICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIC5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICM0NDQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZXMgPiAuYWN0aXZlIHsKICAgICAgICBvdXRsaW5lOiAuM2VtIHNvbGlkIGdyZWVuOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KCiAgICAgIC5oZWFydHN2ZyBwYXRoIHsKICAgICAgICBzdHJva2U6ICNmZmY7CiAgICAgIH0KICAKICAgICAgLnZpZGVvc3ZnLAogICAgICAuaW1hZ2VzdmcgewogICAgICAgIHdpZHRoOiBjYWxjKG1pbig0dncsIDJlbSkpOwogICAgICAgIGhlaWdodDogY2FsYyhtaW4oNHZ3LCAyZW0pKTsKICAgICAgICBwYWRkaW5nOiAwIC4yZW07CiAgICAgIH0KICAgICAgCiAgICAgIC52aWRlb3N2ZyBwYXRoLAogICAgICAuaW1hZ2VzdmcgcGF0aCB7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgYSNtZW51LCBhI2ZpbHRlci1saWtlcyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luLXRvcDogLS4zZW07CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgfQoKICAgICAgYSNtZW51IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBwYWRkaW5nOiAwIC4zZW0gMCAuNWVtOwogICAgICAgIGhlaWdodDogMi4xZW07CiAgICAgIH0KICAgICAgCiAgICAgIGEjZmlsdGVyLWxpa2VzIHsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB3aWR0aDogMS41ZW07CiAgICAgICAgaGVpZ2h0OiAxLjVlbTsKICAgICAgICBtYXJnaW46IC4xZW0gLjVlbTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgIH0KICAgICAgCiAgICAgIGEjZmlsdGVyLWxpa2VzIHN2ZyB7CiAgICAgICAgd2lkdGg6IDEuNWVtOwogICAgICAgIGhlaWdodDogMS41ZW07CiAgICAgIH0KICAgICAgIAogICAgICAubWVudXN2ZyB7CiAgICAgICAgd2lkdGg6IDJlbTsKICAgICAgICBoZWlnaHQ6IDJlbTsKICAgICAgfQoKICAgICAgLm1lbnVzdmcgcGF0aCB7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBtYXJnaW4tbGVmdDogLTE4ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzIyMjsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgei1pbmRleDogMzsgCiAgICAgICAgb3ZlcmZsb3c6IHNjcm9sbDsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudC5vcGVuIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgewogICAgICAgIHBhZGRpbmc6IDAgMWVtIDFlbSAxZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIGEsCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgcGFkZGluZzogLjVlbSAuN2VtOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHotaW5kZXg6IDM7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIG9wYWNpdHk6IC41OwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5Lm9wZW4gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIAogICAgICBzdmcgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAjdGVtcGxhdGUgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGRpdiBpZD0idGVtcGxhdGUiPgogICAgICA8c3ZnIGNsYXNzPSJoZWFydHN2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KICAgICAgICA8cGF0aCBkPSJNOS43MTksMTcuMDczbC02LjU2Mi02LjUxYy0wLjI3LTAuMjY4LTAuNTA0LTAuNTY3LTAuNjk2LTAuODg4QzEuMzg1LDcuODksMS42Nyw1LjYxMywzLjE1NSw0LjE0YzAuODY0LTAuODU2LDIuMDEyLTEuMzI5LDMuMjMzLTEuMzI5YzEuOTI0LDAsMy4xMTUsMS4xMiwzLjYxMiwxLjc1MmMwLjQ5OS0wLjYzNCwxLjY4OS0xLjc1MiwzLjYxMi0xLjc1MmMxLjIyMSwwLDIuMzY5LDAuNDcyLDMuMjMzLDEuMzI5YzEuNDg0LDEuNDczLDEuNzcxLDMuNzUsMC42OTMsNS41MzdjLTAuMTksMC4zMi0wLjQyNSwwLjYxOC0wLjY5NSwwLjg4N2wtNi41NjIsNi41MUMxMC4xMjUsMTcuMjI5LDkuODc1LDE3LjIyOSw5LjcxOSwxNy4wNzMgTTYuMzg4LDMuNjFDNS4zNzksMy42MSw0LjQzMSw0LDMuNzE3LDQuNzA3QzIuNDk1LDUuOTIsMi4yNTksNy43OTQsMy4xNDUsOS4yNjVjMC4xNTgsMC4yNjUsMC4zNTEsMC41MSwwLjU3NCwwLjczMUwxMCwxNi4yMjhsNi4yODEtNi4yMzJjMC4yMjQtMC4yMjEsMC40MTYtMC40NjYsMC41NzMtMC43MjljMC44ODctMS40NzIsMC42NTEtMy4zNDYtMC41NzEtNC41NkMxNS41Nyw0LDE0LjYyMSwzLjYxLDEzLjYxMiwzLjYxYy0xLjQzLDAtMi42MzksMC43ODYtMy4yNjgsMS44NjNjLTAuMTU0LDAuMjY0LTAuNTM2LDAuMjY0LTAuNjksMEM5LjAyOSw0LjM5Nyw3LjgyLDMuNjEsNi4zODgsMy42MSI+PC9wYXRoPgogICAgICA8L3N2Zz4KICAgICAgPHN2ZyBjbGFzcz0idmlkZW9zdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJCQk8cGF0aCBkPSJNMTguMTc1LDQuMTQySDEuOTUxQzEuNzAzLDQuMTQyLDEuNSw0LjM0NCwxLjUsNC41OTJ2MTAuODE2YzAsMC4yNDcsMC4yMDMsMC40NSwwLjQ1MSwwLjQ1aDE2LjIyNGMwLjI0NywwLDAuNDUtMC4yMDMsMC40NS0wLjQ1VjQuNTkyQzE4LjYyNSw0LjM0NCwxOC40MjIsNC4xNDIsMTguMTc1LDQuMTQyIE00LjY1NSwxNC45NTdIMi40MDF2LTEuODAzaDIuMjUzVjE0Ljk1N3pNNC42NTUsMTIuMjU0SDIuNDAxdi0xLjgwM2gyLjI1M1YxMi4yNTR6IE00LjY1NSw5LjU0OUgyLjQwMVY3Ljc0N2gyLjI1M1Y5LjU0OXogTTQuNjU1LDYuODQ2SDIuNDAxVjUuMDQzaDIuMjUzVjYuODQ2ek0xNC41NjksMTQuOTU3SDUuNTU2VjUuMDQzaDkuMDEzVjE0Ljk1N3ogTTE3LjcyNCwxNC45NTdoLTIuMjUzdi0xLjgwM2gyLjI1M1YxNC45NTd6IE0xNy43MjQsMTIuMjU0aC0yLjI1M3YtMS44MDNoMi4yNTNWMTIuMjU0ek0xNy43MjQsOS41NDloLTIuMjUzVjcuNzQ3aDIuMjUzVjkuNTQ5eiBNMTcuNzI0LDYuODQ2aC0yLjI1M1Y1LjA0M2gyLjI1M1Y2Ljg0NnoiPjwvcGF0aD4KCQkJPC9zdmc+CgkJCTxzdmcgY2xhc3M9ImltYWdlc3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgoJCQkJPHBhdGggZD0iTTE4LjU1NSwxNS4zNTRWNC41OTJjMC0wLjI0OC0wLjIwMi0wLjQ1MS0wLjQ1LTAuNDUxSDEuODg4Yy0wLjI0OCwwLTAuNDUxLDAuMjAzLTAuNDUxLDAuNDUxdjEwLjgwOGMwLDAuNTU5LDAuNzUxLDAuNDUxLDAuNDUxLDAuNDUxaDE2LjIxN2gwLjAwNUMxOC43OTMsMTUuODUxLDE4LjQ3OCwxNC44MTQsMTguNTU1LDE1LjM1NCBNMi44LDE0Ljk0OWw0Ljk0NC02LjQ2NGw0LjE0NCw1LjQxOWMwLjAwMywwLjAwMywwLjAwMywwLjAwMywwLjAwMywwLjAwNWwwLjc5NywxLjA0SDIuOHogTTEzLjgyMiwxNC45NDlsLTEuMDA2LTEuMzE3bDEuNjg5LTIuMjE4bDIuNjg4LDMuNTM1SDEzLjgyMnogTTE3LjY1NCwxNC4wNjRsLTIuNzkxLTMuNjY2Yy0wLjE4MS0wLjIzNy0wLjUzNS0wLjIzNy0wLjcxNiwwbC0xLjg5OSwyLjQ5M2wtNC4xNDYtNS40MmMtMC4xOC0wLjIzNy0wLjUzNi0wLjIzNy0wLjcxNiwwbC01LjA0Nyw2LjU5OFY1LjA0MmgxNS4zMTZWMTQuMDY0eiBNMTIuNDc0LDYuMzkzYy0wLjg2OSwwLTEuNTc3LDAuNzA3LTEuNTc3LDEuNTc2czAuNzA4LDEuNTc2LDEuNTc3LDEuNTc2czEuNTc3LTAuNzA3LDEuNTc3LTEuNTc2UzEzLjM0Myw2LjM5MywxMi40NzQsNi4zOTMgTTEyLjQ3NCw4LjY0NWMtMC4zNzEsMC0wLjY3Ni0wLjMwNC0wLjY3Ni0wLjY3NnMwLjMwNS0wLjY3NiwwLjY3Ni0wLjY3NmMwLjM3MiwwLDAuNjc2LDAuMzA0LDAuNjc2LDAuNjc2UzEyLjg0Niw4LjY0NSwxMi40NzQsOC42NDUiPjwvcGF0aD4KCQkJPC9zdmc+CiAgICAgIDxkaXYgaWQ9ImNvbHNjc3MiPgogICAgICAuY29scyR7Y29sc30gI2ltYWdlcyAuaXRlbSB7CiAgICAgICAgd2lkdGg6IGNhbGMoMTAwdncgLyAke2NvbHN9KTsKICAgICAgfQoKICAgICAgLmNvbHMke2NvbHN9ICNpbWFnZXMgLml0ZW0gewogICAgICAgIGhlaWdodDogY2FsYygxMDB2dyAvICR7Y29sc30pOwogICAgICB9CiAgICAgIAogICAgICAuY29scyR7Y29sc30gLnF1ZXJ5LAogICAgICAuY29scyR7Y29sc30gLmxpa2UgewogICAgICAgIGZvbnQtc2l6ZTogbWluKDE0dncgKiAoMSAvICR7Y29sc30pLCA2ZW0gKiAoMSAvICR7Y29sc30pKQogICAgICB9CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJtZWRpYS1mb290ZXIiPgogICAgICA8YSBpZD0iaW1hZ2UtbGlrZSIgY2xhc3M9Imxpa2UiIGhyZWY9IiMiPjwvYT4KICAgICAgPGEgaWQ9ImltYWdlLXF1ZXJ5IiBocmVmPSIjIj48L2E+CiAgICAgIDxhIGlkPSJpbWFnZS11c2VyIiBocmVmPSIjIj48L2E+CiAgICA8L2Rpdj4KICAgIDxjZW50ZXIgaWQ9Im1lZGlhLWNvbnRhaW5lciI+CiAgICAgIDxkaXYgaWQ9ImltYWdlLWNvbnRhaW5lciI+CiAgICAgICAgPGltZyBpZD0iaW1hZ2UiLz4KICAgICAgPC9kaXY+CiAgICA8L2NlbnRlcj4KICAgIDxkaXYgaWQ9Im1lbnUtb3ZlcmxheSI+PC9kaXY+CiAgICA8ZGl2IGlkPSJtZW51LWNvbnRlbnQiIGNsYXNzPSJ0ZXN0Ij4KICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5hdXRvcGxheTwvZGl2PgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0ib24iIGhyZWY9IiMiPm9uPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0ib2ZmIiBocmVmPSIjIj5vZmY8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJob3ZlciIgaHJlZj0iIyI+bW91c2VvdmVyPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5jb2x1bW5zPC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMSIgaHJlZj0iIyI+MTwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSIyIiBocmVmPSIjIj4yPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjQiIGhyZWY9IiMiPjQ8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iNiIgaHJlZj0iIyI+NjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSIxMCIgaHJlZj0iIyI+MTA8L2E+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmNvbm5lY3Rpb25zPC9kaXY+CiAgICAgICAgPGRpdiBpZD0iY29ubmNvdW50Ij4wPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPnJlbGF5czo8L2Rpdj4KICAgICAgICA8cD5QbGVhc2UgdXNlIHJlbGF5cyB3aXRoIE5JUC01MCAoc2VhcmNoKSBmdW5jdGlvbmFsaXR5PC9wPgogICAgICAgIDxmb3JtIGFjdGlvbj0iIyIgaWQ9InJlbGF5cy1mb3JtIj4KICAgICAgICAgIDx0ZXh0YXJlYSBpZD0icmVsYXlzIj48L3RleHRhcmVhPgogICAgICAgICAgPGlucHV0IGNsYXNzPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9InNhdmUgcmVsYXlzIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5wcml2YXRlIGtleTo8L2Rpdj4KICAgICAgICA8cD5JZiB5b3UgY2FudCB1c2UgYnJvd3NlciBhZGRvbiAobW9iaWxlKTwvcD4KICAgICAgICA8Zm9ybSBhY3Rpb249IiMiIGlkPSJwcml2a2V5LWZvcm0iPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJwcml2a2V5Ii8+CiAgICAgICAgICA8aW5wdXQgY2xhc3M9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0ic2F2ZSBrZXkiLz4KICAgICAgICA8L2Zvcm0+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmxvZ3M8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJsb2dzIj48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+bGF0ZXN0IHJlbGVhc2U6PC9kaXY+CiAgICAgICAgPGEgaWQ9InJlbGVhc2UiIGhyZWY9IiMiPjwvYT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9ImhlYWRlciI+CiAgICAgIDxhIGlkPSJmaWx0ZXItbGlrZXMiIGhyZWY9IiMiPjwvYT4KICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxhIGlkPSJtZW51IiBocmVmPSIjIj4KICAgICAgICAgIDxzdmcgY2xhc3M9Im1lbnVzdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJICAgICAgICA8cGF0aCBkPSJNMTAsMS40NDVjLTQuNzI2LDAtOC41NTUsMy44MjktOC41NTUsOC41NTVjMCw0LjcyNSwzLjgyOSw4LjU1NSw4LjU1NSw4LjU1NWM0LjcyNSwwLDguNTU1LTMuODMsOC41NTUtOC41NTVDMTguNTU1LDUuMjc0LDE0LjcyNSwxLjQ0NSwxMCwxLjQ0NSBNMTAsMTcuNjU0Yy00LjIyMSwwLTcuNjU0LTMuNDM0LTcuNjU0LTcuNjU0YzAtNC4yMjEsMy40MzMtNy42NTQsNy42NTQtNy42NTRjNC4yMjIsMCw3LjY1NCwzLjQzMyw3LjY1NCw3LjY1NEMxNy42NTQsMTQuMjIxLDE0LjIyMiwxNy42NTQsMTAsMTcuNjU0IE0xNC4zOSwxMGMwLDAuMjQ4LTAuMjAzLDAuNDUtMC40NSwwLjQ1SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMy0wLjQ1LTAuNDVzMC4yMDMtMC40NSwwLjQ1LTAuNDVoNy44NzlDMTQuMTg3LDkuNTUsMTQuMzksOS43NTIsMTQuMzksMTAgTTE0LjM5LDEyLjcwMmMwLDAuMjQ3LTAuMjAzLDAuNDQ5LTAuNDUsMC40NDlINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAyLTAuNDUtMC40NDljMC0wLjI0OCwwLjIwMy0wLjQ1MSwwLjQ1LTAuNDUxaDcuODc5QzE0LjE4NywxMi4yNTEsMTQuMzksMTIuNDU0LDE0LjM5LDEyLjcwMiBNMTQuMzksNy4yOThjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw2Ljg0OCwxNC4zOSw3LjA1MSwxNC4zOSw3LjI5OCI+PC9wYXRoPgoJICAgICAgICA8L3N2Zz4KICAgICAgICA8L2E+CiAgICAgICAgPGEgaWQ9InRpdGxlIiBocmVmPSIjIj5maWxlcy5odG1sPC9hPgogICAgICAgIDxmb3JtIGlkPSJxdWVyeS1mb3JtIiBhY3Rpb249IiMiPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJxdWVyeSIgbmFtZT0icXVlcnkiIGlkPSIiIC8+CiAgICAgICAgICA8c2VsZWN0IGlkPSJxdWVyeS10eXBlIj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iYWxsIj5hbGw8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaW1hZ2UiPmltYWdlczwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ2aWRlbyI+dmlkZW9zPC9vcHRpb24+CiAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgIDxpbnB1dCBpZD0iZ28iIHR5cGU9InN1Ym1pdCIgdmFsdWU9ImdvIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxzcGFuIGlkPSJxdWVyeWRpc3BsYXkiPgogICAgICAgICAgPHNwYW4gY2xhc3M9InRleHQiPjwvc3Bhbj4KICAgICAgICA8L3NwYW4+CiAgICAgICAgPGRpdiBpZD0ibG9hZGluZyI+dXBkYXRpbmc8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9ImltYWdlcyI+PC9kaXY+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly91bnBrZy5jb20vbm9zdHItdG9vbHMvbGliL25vc3RyLmJ1bmRsZS5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9zbG93bGkuZ2l0aHViLmlvL2JlY2gzMi1idWZmZXIvYXNzZXRzL2pzL2JlY2gzMi1idWZmZXIubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQ+CiAgICAgIGNvbnN0IHVwZGF0ZXNwdWJrZXkgPSAiYWU1YzZlMGI3NDY2MGQyMTk0YzgyNTRiNWMyYzgyNTY3NjU3NmJlMDI5NzM3OWZhMjA1MjMxMTRhNmE4NWU4NyIKICAgICAgY29uc3QgcXVlcmllcyA9IHsKICAgICAgICAiZ2xvYmFsIjogJ1siUkVRIiwiPEk+Iix7ImNhY2hlIjpbImV4cGxvcmUiLHsidGltZWZyYW1lIjoibGF0ZXN0Iiwic2NvcGUiOiJnbG9iYWwiLCJsaW1pdCI6PEw+fV19XScsIAogICAgICAgICJhdXRob3IiOiAnWyJSRVEiLCI8ST4iLHsia2luZHMiOlsxXSwiYXV0aG9ycyI6WyI8UD4iXX1dJywKICAgICAgICAicmVhY3Rpb25zIjogJ1siUkVRIiwiPEk+IiwgeyJraW5kcyI6WzddLCIjZSI6IDxFPn1dJwogICAgICB9CiAgICAgIHFzKCIjcmVsYXlzIikudmFsdWUgPSByZWxheXMoKS5qb2luKCJcbiIpCiAgICAgIHFzKCIjcHJpdmtleSIpLnZhbHVlID0gcHJpdmtleSgpCiAgICAgIGNvbnN0IGNvbG9wdHMgPSBbMSwgMiwgNCwgNiwgMTBdCgogICAgICBjb2xzID0gKCkgPT4gcGFyc2VJbnQoc2V0dGluZygiY29scyIsIGNvbG9wdHNbMV0pLCAxMCkKICAgICAgYXV0b3BsYXkgPSAoKSA9PiBzZXR0aW5nKCJhdXRvcGxheSIsICJvZmYiKQogICAgICBsaW1pdCA9ICgpID0+IHBhcnNlSW50KHNldHRpbmcoImxpbWl0IiwgMTUpLCAxMCkKICAgICAgCiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgiY29scyIgKyBjb2xzKCkpCiAgICAgIAogICAgICBsZXQgcHJvdG9jb2wgPSBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvKSA/ICJub3N0cjoiIDogIndlYitub3N0cjoiCiAgICAgIGxldCBzb2NrZXRzID0gW10KICAgICAgbGV0IHJlc2hhbmRsZXJzID0gW10KICAgICAgbGV0IHVybHMgPSBbXQogICAgICBsZXQgbGlrZXMgPSBbXQogICAgICBsZXQgbmV3bGlrZXMgPSBbXQogICAgICBsZXQgaWRjb3VudGVyID0gMAogICAgICBsZXQgcXVlcnl3YWl0ID0gbnVsbAogICAgICBsZXQgcHJpbWFsc29ja2V0ID0gbnVsbAogICAgICBsZXQgdHlwZXMgPSB7CiAgICAgICAgaW1hZ2U6IFsicG5nIiwgImpwZyIsICJqcGVnIiwgIndlYnAiXSwKICAgICAgICB2aWRlbzogWyJtcDQiLCAid2VibSJdCiAgICAgIH0KICAgICAgbGV0IGltZ3JlZ2V4ID0gL2h0dHAofHMpXDpcL1wvW14gXG5dKj9cLihwbmd8anBnfGpwZWd8d2VicCkvZ2kKICAgICAgbGV0IHZpZGVvcmVnZXggPSAvaHR0cCh8cylcOlwvXC9bXiBcbl0qP1wuKG1wNHx3ZWJtKS9naQogICAgICBsZXQgdmlkZW9leHRyZWdleCA9IC9cLihtcDR8d2VibSkkL2kKICAgICAgbGV0IGltZ2V4dHJlZ2V4ID0gL1wuKHBuZ3xqcGd8anBlZ3x3ZWJwKSQvaQogICAgICB3YWl0bXMgPSA1MDAwCiAgICAgIHF1ZXJ5c3RyID0gIiIKICAgICAgbGV0IHF1ZXJ5Y291bnQgPSAwCiAgICAgIGxldCBob3ZlcmVkdmlkZW8gPSBudWxsCiAgICAgIAogICAgICB1cGRhdGVxdWVyeSgpCiAgICAgIHFzKCIjaW1hZ2UtbGlrZSIpLmlubmVySFRNTCA9IHFzKCIjZmlsdGVyLWxpa2VzIikuaW5uZXJIVE1MID0gcXMoIiN0ZW1wbGF0ZSAuaGVhcnRzdmciKS5vdXRlckhUTUwKICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgIHNldGFjdGl2ZSgic2V0YXV0b3BsYXkiLCAiYXV0b3BsYXkiLCBhdXRvcGxheSgpKQogICAgICAKICAgICAgZnVuY3Rpb24gZnJvbUhleFN0cmluZyhzdHIpewogICAgICAgIGxldCBidWZmZXIgPSBuZXcgVWludDhBcnJheShzdHIubGVuZ3RoIC8gMikKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlci5sZW5ndGg7IGkrKykgewogICAgICAgICAgYnVmZmVyW2ldID0gcGFyc2VJbnQoc3RyLnN1YnN0cigyICogaSwgMiksIDE2KQogICAgICAgIH0KICAgICAgICByZXR1cm4gYnVmZmVyCiAgICAgIH0KICAKICAgICAgZnVuY3Rpb24gcmVsYXlzKCl7CiAgICAgICAgY29uc3Qgb2JqID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgicmVsYXlzIikpCiAgICAgICAgY29uc3QgciA9IG9iaiAmJiBvYmouZmlsdGVyKHIgPT4gci5tYXRjaCgvd3NzOlwvXC8uKy8pKSB8fCBbXQogICAgICAgIAogICAgICAgIHJldHVybiByLmxlbmd0aCA+IDAgJiYgciB8fCBbCiAgICAgICAgICAid3NzOi8vcmVsYXkubm9zdHIuYmFuZCIsCiAgICAgICAgICAid3NzOi8vbmIucmVsYXkuY2VudGVyIiwgCiAgICAgICAgICAid3NzOi8vbm9zdHIuY29tcGlsZS1lcnJvci5uZXQiCiAgICAgICAgXQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBwcml2a2V5KCl7CiAgICAgICAgbGV0IGtleSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJwcml2a2V5IikgfHwgIiIKICAgICAgICAKICAgICAgICBpZihrZXkubGVuZ3RoID09IDYzKXsKICAgICAgICAgIGtleSA9IE5vc3RyVG9vbHMubmlwMTkuZGVjb2RlKGtleSkuZGF0YQogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4ga2V5Lmxlbmd0aCA9PSA2NCAmJiBrZXkgfHwgbnVsbAogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzZXR0aW5nKGtleSwgZGVmYXVsdHZhbHVlKXsKICAgICAgICBjb25zdCB2ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KQogICAgICAgIHJldHVybiB2ICYmIG9wdGlvbigic2V0IiArIGtleSwga2V5LCB2KSAmJiB2IHx8IGRlZmF1bHR2YWx1ZQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBvcHRpb24oYywga2V5LCB2YWwpewogICAgICAgIHJldHVybiBxcygiLiIgKyBjICsgIltkYXRhLSIgKyBrZXkgKyAiPSciICsgdmFsICsgIiddIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXMocSl7CiAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXNhKHEpewogICAgICAgIHJldHVybiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocSkpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGdpZChpKXsKICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXVlcnl0eXBlKCl7CiAgICAgICAgcmV0dXJuIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlIHx8ICJhbGwiCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZXF1ZXJ5KCl7CiAgICAgICAgbGV0IHBhcnRzID0gZGVjb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpKS5zcGxpdCgiLyIpCiAgICAgICAgcXVlcnlzdHIgPSBxcygiI3F1ZXJ5ZGlzcGxheSAudGV4dCIpLmlubmVyVGV4dCA9IHBhcnRzWzBdCiAgICAgICAgcXMoIiNxdWVyeSIpLnZhbHVlID0gcGFydHNbMF0KICAgICAgICBxcygiI3F1ZXJ5LXR5cGUiKS52YWx1ZSA9IHBhcnRzWzFdIHx8ICJhbGwiCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGFjdGl2ZSgpewogICAgICAgIHJldHVybiBxcygiI2ltYWdlcyAuYWN0aXZlIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gaW1hZ2VvZmZzZXQob2Zmc2V0KXsKICAgICAgICBjb25zdCBpbWFnZXMgPSBxc2EoIiNpbWFnZXMgPiAuaXRlbSIpLmZpbHRlcihlID0+IGUuc3R5bGUuZGlzcGxheSA9PSAiYmxvY2siKQogICAgICAgIHJldHVybiBpbWFnZXNbaW1hZ2VzLmluZGV4T2YoYWN0aXZlKCkpK29mZnNldF0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gbGFzdGFjdGl2ZSgpewogICAgICAgIHJldHVybiBxc2EoIiNpbWFnZXMgLmFjdGl2ZSIpLnBvcCgpICAgICAgCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIG1lbnUoKXsKICAgICAgICBxc2EoIiNtZW51LWNvbnRlbnQsICNtZW51LW92ZXJsYXkiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QudG9nZ2xlKCJvcGVuIikpCiAgICAgIH0KICAKICAgICAgZnVuY3Rpb24gc2V0YWN0aXZlKGMsIGtleSwgdmFsKXsKICAgICAgICBxc2EoIi4iICsgYykuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikpCiAgICAgICAgY29uc3Qgb3B0aW9uID0gcXMoIi4iICsgYyArICJbZGF0YS0iICsga2V5ICsgIj0nIiArIHZhbCArICInXSIpCiAgICAgICAgb3B0aW9uPy5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzY3JvbGx2aXNpYmxlKG4sIG9mZnNldCl7CiAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDAKICAgICAgICByZXR1cm4gKG4ub2Zmc2V0VG9wICsgbi5vZmZzZXRIZWlnaHQpID49IChzY3JvbGxZIC0gb2Zmc2V0KQogICAgICAgICAgJiYgbi5vZmZzZXRUb3AgPD0gKHNjcm9sbFkgKyB2aXN1YWxWaWV3cG9ydC5oZWlnaHQgKyBvZmZzZXQpCiAgICAgIH0KCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZWltYWdlc2xvYWQoKXsKICAgICAgICBxc2EoIiNpbWFnZXMgLml0ZW0uaW1nIikuZm9yRWFjaChhc3luYyBpbWcgPT4gewogICAgICAgICAgaWYoc2Nyb2xsdmlzaWJsZShpbWcsIHZpc3VhbFZpZXdwb3J0LmhlaWdodCAvIDIpKXsKICAgICAgICAgICAgaW1nLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICJ1cmwoIiArIGltZ1siZGF0YS1zcmMiXSArICIpIgogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIGltZy5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAiIgogICAgICAgICAgfQogICAgICAgIH0pCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZWFsbHZpZGVvcGxheSgpewogICAgICAgIHFzYSgiI2ltYWdlcyAuaXRlbS52aWRlbyIpLmZvckVhY2goYXN5bmMgbiA9PiB1cGRhdGV2aWRlb3BsYXkobikpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZXZpZGVvcGxheShuKXsKICAgICAgICBjb25zdCBhcGxheSA9IGF1dG9wbGF5KCkKICAgICAgICBjb25zdCB2ID0gbi5xdWVyeVNlbGVjdG9yKCJ2aWRlbyIpCiAgICAgICAgCiAgICAgICAgaWYoYXBsYXkgIT0gIm9uIil7CiAgICAgICAgICB2Lm11dGVkID0gZmFsc2UKICAgICAgICAgIHYucGF1c2UoKQogICAgICAgIH1lbHNlewogICAgICAgICAgdi5tdXRlZCA9IHRydWUKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoIXNjcm9sbHZpc2libGUobikpewogICAgICAgICAgaWYodi5yZWFkeVN0YXRlID09IDQpewogICAgICAgICAgICB2LnBhdXNlKCkKICAgICAgICAgIH1lbHNlewogICAgICAgICAgICB2LnByZWxvYWQgPSAibm9uZSIKICAgICAgICAgIH0KICAgICAgICB9ZWxzZSBpZih2LnJlYWR5U3RhdGUgIT0gNCl7CiAgICAgICAgICB2LnByZWxvYWQgPSAiYXV0byIKICAgICAgICB9CiAgICAgICAgZWxzZSBpZihhcGxheSA9PSAib24iIHx8IChhcGxheSA9PSAiaG92ZXIiICYmIHYgPT0gaG92ZXJlZHZpZGVvKSl7CiAgICAgICAgICB2LnBsYXkoKQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgZSA9PiB7CiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKQogICAgICAgIHVwZGF0ZWltYWdlc2xvYWQoKQogICAgICAgIHVwZGF0ZWFsbHZpZGVvcGxheSgpCiAgICAgIH0pCiAgICAgIAogICAgICBsZXQgdG91Y2ggPSBudWxsCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwgZSA9PiB0b3VjaCA9IGUuY2hhbmdlZFRvdWNoZXNbMF0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsIGUgPT4gewogICAgICAgIGNvbnN0IHhkaWZmID0gZS5jaGFuZ2VkVG91Y2hlc1swXS5zY3JlZW5YIC0gdG91Y2guc2NyZWVuWAoKICAgICAgICBpZih4ZGlmZiA8IC01MCl7CiAgICAgICAgICBzd2lwZSgxKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZih4ZGlmZiA+IDUwKXsKICAgICAgICAgIHN3aXBlKC0xKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIHFzKCIjcXVlcnktZm9ybSIpLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsIGUgPT4gewogICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIGxvY2F0aW9uLmhhc2ggPSAiIyIgKyBlbmNvZGVVUklDb21wb25lbnQocXMoIiNxdWVyeSIpLnZhbHVlICsgIi8iICsgcXVlcnl0eXBlKCkpCiAgICAgICAgdXBkYXRlcXVlcnkoKQogICAgICAgIHF1ZXJ5d2FpdC5yZXNvbHZlKCkKICAgICAgfSkKCiAgICAgIHFzKCIjcmVsYXlzLWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBhc3luYyBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBsZXQgciA9IEpTT04uc3RyaW5naWZ5KHFzKCIjcmVsYXlzIikudmFsdWUuc3BsaXQoIlxuIikpCiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oInJlbGF5cyIsIHIpCiAgICAgICAgZGlzY29ubmVjdCgpCiAgICAgIH0pCgogICAgICBxcygiI3ByaXZrZXktZm9ybSIpLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsIGFzeW5jIGUgPT4gewogICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIGNvbnN0IGtleSA9IHFzKCIjcHJpdmtleSIpLnZhbHVlCgogICAgICAgIGlmKGtleS5sZW5ndGggIT0gNjQgJiYga2V5Lmxlbmd0aCAhPSA2Myl7CiAgICAgICAgICBhbGVydCgia2V5IHNob3VsZCBiZSA2MyBvciA2NCBjaGFyYWN0ZXJzIGxvbmciKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJwcml2a2V5Iiwga2V5KQogICAgICAgIGFsZXJ0KCJrZXkgc2F2ZWQiKQogICAgICB9KQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwgYXN5bmMgKGUpID0+IHsKICAgICAgICBpZihhdXRvcGxheSgpID09ICJob3ZlciIgJiYgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2aWRlby1jb250YWluZXIiKSl7CiAgICAgICAgICBob3ZlcmVkdmlkZW8gPSBlLnRhcmdldC5xdWVyeVNlbGVjdG9yKCJ2aWRlbyIpCiAgICAgICAgICBob3ZlcmVkdmlkZW8ucGxheSgpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLCBhc3luYyAoZSkgPT4gewogICAgICAgIGhvdmVyZWR2aWRlbyA9IGZhbHNlCiAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5zdHlsZS5kaXNwbGF5ICE9ICJibG9jayIgJiYgYXV0b3BsYXkoKSA9PSAiaG92ZXIiICYmIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygidmlkZW8tY29udGFpbmVyIikpewogICAgICAgICAgcXNhKCJ2aWRlbyIpLmZvckVhY2godiA9PiB2LnBhdXNlKCkpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBhc3luYyAoZSkgPT4gewogICAgICAgIGlmKGUudGFyZ2V0LnR5cGUgPT0gInN1Ym1pdCIgfHwgKGUudGFyZ2V0LnRhZ05hbWUgPT0gIkEiICYmIGUudGFyZ2V0LmhyZWYubWF0Y2goL14ofHdlYlwrKW5vc3RyXDovKSkpewogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gInRpdGxlIil7CiAgICAgICAgICBxcygiI3F1ZXJ5IikudmFsdWUgPSAiIgogICAgICAgICAgcXMoIiNxdWVyeS10eXBlIikudmFsdWUgPSAiYWxsIgogICAgICAgICAgcXMoIiNnbyIpLmNsaWNrKCkKICAgICAgICB9CgogICAgICAgIGUucHJldmVudERlZmF1bHQoKQoKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAiZmlsdGVyLWxpa2VzIil7CiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC50b2dnbGUoImZpbHRlci1saWtlcyIpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbGV0IG4gPSBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKSAmJiBlLnRhcmdldCB8fCBlLnRhcmdldC5wYXJlbnRFbGVtZW50CgogICAgICAgIGlmKG4uY2xhc3NMaXN0LmNvbnRhaW5zKCJzaG93IikpewogICAgICAgICAgYWN0aXZlKCk/LmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICBnaWQobi5pZCkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIHNob3cobi5pZCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC50YWdOYW1lICE9ICJBIiAmJiAocXMoIiNpbWFnZS1jb250YWluZXIiKSA9PSBlLnRhcmdldCB8fCBxcygiI2ltYWdlIikgPT0gZS50YXJnZXQgfHwgcXMoIiNtZWRpYS1jb250YWluZXIgdmlkZW8iKSA9PSBlLnRhcmdldCkpewogICAgICAgICAgaGlkZW1lZGlhKCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gIm1lbnUiIHx8IGUudGFyZ2V0LmlkID09ICJtZW51LW92ZXJsYXkiKXsKICAgICAgICAgIG1lbnUoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNldGNvbHMiKSl7CiAgICAgICAgICBmb3IobGV0IGMgb2YgY29sb3B0cyl7CiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgiY29scyIgKyBjKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgZS50YXJnZXQuZGF0YXNldC5jb2xzKQogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImNvbHMiLCBlLnRhcmdldC5kYXRhc2V0LmNvbHMpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGNvbHMiLCAiY29scyIsIGNvbHMoKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNldGF1dG9wbGF5IikpewogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImF1dG9wbGF5IiwgZS50YXJnZXQuZGF0YXNldC5hdXRvcGxheSkKICAgICAgICAgIHNldGFjdGl2ZSgic2V0YXV0b3BsYXkiLCAiYXV0b3BsYXkiLCBhdXRvcGxheSgpKQogICAgICAgICAgdXBkYXRlYWxsdmlkZW9wbGF5KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoImxpa2UiKSAmJiBsaWtlKGUudGFyZ2V0KQogICAgICB9KQogICAgICAKICAgICAgZnVuY3Rpb24gaGFza2V5KCl7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5ub3N0ciB8fCBwcml2a2V5KCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcHVia2V5KCl7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5ub3N0ciAmJiBhd2FpdCB3aW5kb3cubm9zdHIuZ2V0UHVibGljS2V5KCkgfHwgTm9zdHJUb29scy5nZXRQdWJsaWNLZXkocHJpdmtleSgpKQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBzaWduKGV2ZW50KXsKICAgICAgICBpZih3aW5kb3cubm9zdHIpewogICAgICAgICAgcmV0dXJuIGF3YWl0IG5vc3RyLnNpZ25FdmVudChldmVudCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZXZlbnQuc2lnID0gTm9zdHJUb29scy5nZXRTaWduYXR1cmUoZXZlbnQsIHByaXZrZXkoKSkKICAgICAgICByZXR1cm4gZXZlbnQKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gbGlrZShsaW5rKXsKICAgICAgICBjb25zdCBldmVudCA9IGxpbmsucGFyZW50RWxlbWVudFsiZGF0YS1ldmVudCJdCiAgICAgICAgY29uc3QgcHViayA9IGF3YWl0IHB1YmtleSgpCiAgICAgICAgY29uc3QgbGlrZSA9IGF3YWl0IHNpZ24oewogICAgICAgICAgImtpbmQiOiA3LAogICAgICAgICAgImNvbnRlbnQiOiAiKyIsCiAgICAgICAgICAidGFncyI6IFsKICAgICAgICAgICAgWyJlIiwgZXZlbnQuaWRdLAogICAgICAgICAgICBbInAiLCBldmVudC5wdWJrZXldCiAgICAgICAgICBdLAogICAgICAgICAgInB1YmtleSI6IHB1YmssCiAgICAgICAgICAiY3JlYXRlZF9hdCI6IHBhcnNlSW50KERhdGUubm93KCkgLyAxMDAwICwgMTApCiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBzb2NrZXRzLmZvckVhY2gocyA9PiBzLnNlbmQoSlNPTi5zdHJpbmdpZnkoWyJFVkVOVCIsIGxpa2VdKSkpCiAgICAgICAgbGluay5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKCiAgICAgICAgY29uc3QgaW1hZ2VpZCA9IGxpbmtbImRhdGEtaXRlbS1pZCJdIHx8IGxpbmsuZGF0YXNldC5pbWFnZUlkCiAgICAgICAgCiAgICAgICAgaWYoaW1hZ2VpZCl7CiAgICAgICAgICBnaWQoaW1hZ2VpZCkucXVlcnlTZWxlY3RvcigiLmxpa2UiKS5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICB9CiAgICAgIH0KICAgIAogICAgICBmdW5jdGlvbiBzd2lwZShvZmZzZXQpewogICAgICAgIGlmKGltYWdlb2Zmc2V0KG9mZnNldCkpewogICAgICAgICAgaW1hZ2VvZmZzZXQob2Zmc2V0KS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgdGhpc1tvZmZzZXQgPT0gLTEgJiYgImxhc3RhY3RpdmUiIHx8ICJhY3RpdmUiXSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICB1cGRhdGVzaG93KCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZXNob3coKXsKICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLnN0eWxlLmRpc3BsYXkgPT0gImJsb2NrIil7CiAgICAgICAgICBoaWRldmlkZW8oKQogICAgICAgICAgc2hvdyhhY3RpdmUoKS5pZCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBlID0+IHsKICAgICAgICBpZihbIlRhYiIsICJBcnJvd0xlZnQiLCAiQXJyb3dSaWdodCIsICJBcnJvd1VwIiwgIkFycm93RG93biJdLmluY2x1ZGVzKGUua2V5KSl7CiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJFc2NhcGUiKXsKICAgICAgICAgIG1lbnUoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUua2V5ID09ICJFbnRlciIgJiYgZS50YXJnZXQudGFnTmFtZSA9PSAiQk9EWSIpewogICAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5zdHlsZS5kaXNwbGF5ID09ICJibG9jayIpewogICAgICAgICAgICBoaWRlbWVkaWEoKQogICAgICAgICAgICByZXR1cm4KICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgc2hvdyhhY3RpdmUoKS5pZCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93VXAiICYmIGltYWdlb2Zmc2V0KC1jb2xzKCkpKXsKICAgICAgICAgIGltYWdlb2Zmc2V0KC1jb2xzKCkpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBsYXN0YWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIHVwZGF0ZXNob3coKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93RG93biIgJiYgaW1hZ2VvZmZzZXQoY29scygpKSl7CiAgICAgICAgICBpbWFnZW9mZnNldChjb2xzKCkpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgdXBkYXRlc2hvdygpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dMZWZ0Iil7CiAgICAgICAgICBzd2lwZSgtMSkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd1JpZ2h0Iil7CiAgICAgICAgICBzd2lwZSgxKQogICAgICAgIH0KICAgICAgfSkKCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZXF1ZXJ5cmVzKHJlcywgc29ja2V0LCBxLCB0eXBlLCBzdGltZSl7CiAgICAgICAgc2F2ZShzb2NrZXQsIHJlcywgcSwgdHlwZSwgZmFsc2UsIGZhbHNlLCB0cnVlKQogICAgICAgIGxvZygicXVlcnkgcmVzIiwgcmVzLmxlbmd0aCwgc29ja2V0LnVybCkKICAgICAgICBxdWVyeWNvdW50LS0KICAgICAgICBpZihxdWVyeWNvdW50ID09IDApewogICAgICAgICAgcXMoIiNsb2FkaW5nIikuc3R5bGUuZGlzcGxheSA9ICJub25lIgogICAgICAgIH0KICAgICAgICAKICAgICAgICBsZXQgd2FpdCA9IHdhaXRtcyAtIChEYXRlLm5vdygpIC0gc3RpbWUpCiAgICAgICAgcXVlcnl3YWl0ID0gc2xlZXAod2FpdCkKICAgICAgICBhd2FpdCBxdWVyeXdhaXQucHJvbWlzZQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBwcmltYWxnbG9iYWwoc29ja2V0KXsKICAgICAgICBsb2coImdsb2JhbCIsIHNvY2tldC51cmwpCiAgICAgICAgcXVlcnljb3VudCsrCiAgICAgICAgcXMoIiNsb2FkaW5nIikuc3R5bGUuZGlzcGxheSA9ICJibG9jayIKICAgICAgICBsZXQgc3RpbWUgPSBEYXRlLm5vdygpCiAgICAgICAgbGV0IHFpZCA9ICJnbG9iYWxfIiArICgrK2lkY291bnRlcikKICAgICAgICBsZXQgcWlkbGlrZXMgPSAibGlrZXNfIiArICgrK2lkY291bnRlcikKCiAgICAgICAgaWYobmV3bGlrZXMubGVuZ3RoID4gMCl7CiAgICAgICAgICBwcmltYWxzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAgICJSRVEiLCAKICAgICAgICAgICAgcWlkbGlrZXMsIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgImNhY2hlIjogWwogICAgICAgICAgICAgICAgImV2ZW50cyIsIHsKICAgICAgICAgICAgICAgICAgImV2ZW50X2lkcyI6IG5ld2xpa2VzCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgICBdKSkKCiAgICAgICAgICBjb25zdCBsaWtlX2V2ZW50cyA9IGF3YWl0IHdhaXRyZXMocWlkbGlrZXMpCiAgICAgICAgICBuZXdsaWtlcy5zcGxpY2UoMCkKICAgICAgICAgIAogICAgICAgICAgYXdhaXQgc2F2ZShzb2NrZXQsIGxpa2VfZXZlbnRzLCAiIiwgImFsbCIsIHRydWUsIHRydWUsIGZhbHNlKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAiUkVRIiwgCiAgICAgICAgICBxaWQsIAogICAgICAgICAgewogICAgICAgICAgICAiY2FjaGUiOiBbCiAgICAgICAgICAgICAgImV4cGxvcmUiLCAKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidGltZWZyYW1lIjogImxhdGVzdCIsCiAgICAgICAgICAgICAgICAic2NvcGUiOiAiZ2xvYmFsIiwKICAgICAgICAgICAgICAgICJsaW1pdCI6IDIwCiAgICAgICAgICAgICAgfQogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSkpCiAgICAgICAgCiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgd2FpdHJlcyhxaWQpCiAgICAgICAgYXdhaXQgaGFuZGxlcXVlcnlyZXMocmVzLmZpbHRlcihlID0+IGUua2luZCA9PSAxKSwgc29ja2V0LCAiIiwgImFsbCIsIHN0aW1lKQogICAgICAgIHByaW1hbGdsb2JhbChzb2NrZXQpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5KHNvY2tldCwgcHJpbWFsKXsKICAgICAgICBsb2coInF1ZXJ5Iiwgc29ja2V0LnVybCkKICAgICAgICBxdWVyeWNvdW50KysKICAgICAgICBxcygiI2xvYWRpbmciKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgIAogICAgICAgIGxldCBzdGltZSA9IERhdGUubm93KCkKICAgICAgICBsZXQgcSA9IHF1ZXJ5c3RyLnRyaW0oKQogICAgICAgIGxldCB0eXBlID0gcXVlcnl0eXBlKCkKICAgICAgICBsZXQgaSA9ICsraWRjb3VudGVyCiAgICAgICAgbGV0IHFpZCA9ICJxdWVyeV8iICsgaQogICAgICAgIGxldCBmaWx0ZXJzID0gW10KCiAgICAgICAgZmlsdGVycy5wdXNoKC4uLih0eXBlc1t0eXBlXSB8fCBbXSkubWFwKCh0KSA9PiB7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBraW5kczogWzFdLCAKICAgICAgICAgICAgc2VhcmNoOiAiLiIgKyB0LAogICAgICAgICAgICBsaW1pdDogMjAKICAgICAgICAgIH0KICAgICAgICB9KSkKICAgICAgICAKICAgICAgICBpZihxLmxlbmd0aCA+IDApewogICAgICAgICAgZmlsdGVycy5wdXNoKHtraW5kczogWzFdLCBzZWFyY2g6IHF9KQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihmaWx0ZXJzLmxlbmd0aCA9PSAwKXsKICAgICAgICAgIGZpbHRlcnMucHVzaCh7a2luZHM6IFsxXX0pCiAgICAgICAgfQogICAgICAgIAogICAgICAgIAogICAgICAgIGNvbnN0IGxpa2VzcmVzID0gYXdhaXQgcXVlcnlsaWtlcyhzb2NrZXQpCiAgICAgICAgCiAgICAgICAgbGlrZXNyZXMuZm9yRWFjaChldmVudGlkID0+IHsKICAgICAgICAgIGlmKCFsaWtlcy5pbmNsdWRlcyhldmVudGlkKSl7CiAgICAgICAgICAgIGxpa2VzLnB1c2goZXZlbnRpZCkKICAgICAgICAgICAgbmV3bGlrZXMucHVzaChldmVudGlkKQogICAgICAgICAgfQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgY29uc3Qgc2VhcmNob2JqID0gWyJSRVEiLCBxaWQsIC4uLmZpbHRlcnNdCiAgICAgICAgY29uc3Qgc2VhcmNoanNvbiA9IEpTT04uc3RyaW5naWZ5KHNlYXJjaG9iaikKICAgICAgICBzb2NrZXQuc2VuZChzZWFyY2hqc29uKQogICAgICAgIAogICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHdhaXRyZXMocWlkKQogICAgICAgIGF3YWl0IGhhbmRsZXF1ZXJ5cmVzKHJlcywgc29ja2V0LCBxLCB0eXBlLCBzdGltZSkKICAgICAgICBxdWVyeShzb2NrZXQpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5bGlrZXMoc29ja2V0KXsKICAgICAgICBpZighaGFza2V5KCkpewogICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IG15cHVia2V5ID0gYXdhaXQgcHVia2V5KCkKICAgICAgICBjb25zdCBldmVudHMgPSBhd2FpdCBxdWVyeWV2ZW50cyhzb2NrZXQsIFs3XSwgbnVsbCwgW215cHVia2V5XSkKICAgICAgICByZXR1cm4gZXZlbnRzLm1hcChlID0+IGUudGFncy5maW5kKHQgPT4gdFswXSA9PSAiZSIpWzFdKQogICAgICB9CgogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeWV2ZW50cyhzb2NrZXQsIGtpbmRzLCBldmVudGlkcywgYXV0aG9ycyl7CiAgICAgICAgY29uc3QgcXVlcnlpZCA9ICJldmVudHNfIiArICgrK2lkY291bnRlcikKICAgICAgICBjb25zdCBmaWx0ZXJzID0ge30KICAgICAgICAKICAgICAgICBmaWx0ZXJzLmtpbmRzID0ga2luZHMKICAgICAgICAKICAgICAgICBpZihldmVudGlkcyl7CiAgICAgICAgICBmaWx0ZXJzWyIjZSJdID0gZXZlbnRpZHMKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoYXV0aG9ycyl7CiAgICAgICAgICBmaWx0ZXJzWyJhdXRob3JzIl0gPSBhdXRob3JzCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAiUkVRIiwgCiAgICAgICAgICBxdWVyeWlkLCAKICAgICAgICAgIGZpbHRlcnMKICAgICAgICBdKQoKICAgICAgICBzb2NrZXQuc2VuZChqc29uKQogICAgICAgIAogICAgICAgIHJldHVybiBhd2FpdCB3YWl0cmVzKHF1ZXJ5aWQpIHx8IFtdCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5cHVia2V5KHNvY2tldCwgcHViayl7CiAgICAgICAgY29uc3QgcXVlcnlpZCA9ICJxdWVyeV8iICsgKCsraWRjb3VudGVyKQogICAgICAgIHNvY2tldC5zZW5kKHF1ZXJpZXMuYXV0aG9yLnJlcGxhY2UoIjxJPiIsIHF1ZXJ5aWQpLnJlcGxhY2UoIjxQPiIsIHB1YmspKQoKICAgICAgICByZXR1cm4gKGF3YWl0IHdhaXRyZXMocXVlcnlpZCkpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHNhdmUoc29ja2V0LCBldmVudGRiLCBxLCBxdHlwZSwgcmVhY3RlZCwgYXBwZW5kLCBxdWVyeW1ldGEpewogICAgICAgIGxldCBldmVudHB1YmtleXMgPSBbXQogICAgICAgIGNvbnN0IGV2ZW50cyA9IGV2ZW50ZGIuZmlsdGVyKG8gPT4gewogICAgICAgICAgaWYocS5sZW5ndGggPiAwKXsKICAgICAgICAgICAgZm9yKGxldCB3b3JkIG9mIHEuc3BsaXQoIiAiKSl7CiAgICAgICAgICAgICAgaWYoby5jb250ZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZih3b3JkLnRvTG93ZXJDYXNlKCkpID09IC0xKXsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIHJldHVybiB0cnVlCiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBsZXQgcmVzdWx0cyA9IFtdCiAgICAgICAgY29uc3QgZXZlbnRpZHMgPSBldmVudHMubWFwKGUgPT4gZS5pZCkKICAgICAgICBsZXQgbmV3dXJscyA9IFtdCiAgICAgICAgCiAgICAgICAgZm9yKGxldCBldmVudCBvZiBldmVudHMpewogICAgICAgICAgbGV0IHVybHNtYXRjaCA9IFtdCiAgICAgICAgICAKICAgICAgICAgIGlmKHF0eXBlICE9ICJ2aWRlbyIpewogICAgICAgICAgICB1cmxzbWF0Y2gucHVzaCguLi4oZXZlbnQuY29udGVudC5tYXRjaChpbWdyZWdleCkgfHwgW10pKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBpZihxdHlwZSAhPSAiaW1hZ2UiKXsKICAgICAgICAgICAgdXJsc21hdGNoLnB1c2goLi4uKGV2ZW50LmNvbnRlbnQubWF0Y2godmlkZW9yZWdleCkgfHwgW10pKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICB1cmxzbWF0Y2ggPSB1cmxzbWF0Y2guZmlsdGVyKHVybCA9PiAhdXJscy5pbmNsdWRlcyh1cmwpKQoKICAgICAgICAgIGlmKHVybHNtYXRjaC5sZW5ndGggPiAwKXsKICAgICAgICAgICAgbmV3dXJscy5wdXNoKHsKICAgICAgICAgICAgICBldmVudDogZXZlbnQsCiAgICAgICAgICAgICAgdXJsczogdXJsc21hdGNoCiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIAogICAgICAgICAgICB1cmxzLnB1c2goLi4udXJsc21hdGNoKQogICAgICAgICAgICBldmVudHB1YmtleXMuaW5jbHVkZXMoZXZlbnQucHVia2V5KSB8fCBldmVudHB1YmtleXMucHVzaChldmVudC5wdWJrZXkpCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxvZygicXVlcnkgbWV0YSIsIHNvY2tldC51cmwpCiAgICAgICAgbGV0IG1ldGFldmVudHMgPSAocXVlcnltZXRhICYmIGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzBdLCBudWxsLCBldmVudHB1YmtleXMpIHx8IFtdKQogICAgICAgIAogICAgICAgIGZvcihsZXQgZW50cnkgb2YgbmV3dXJscyl7CiAgICAgICAgICBmb3IobGV0IHVybCBvZiBlbnRyeS51cmxzKXsKICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHsKICAgICAgICAgICAgICByZWFjdGVkOiByZWFjdGVkIHx8IGxpa2VzLmluY2x1ZGVzKGVudHJ5LmV2ZW50LmlkKSwgCiAgICAgICAgICAgICAgdXJsOiB1cmwsIAogICAgICAgICAgICAgIGV2ZW50OiBlbnRyeS5ldmVudCwgCiAgICAgICAgICAgICAgYmVjaDMyaWQ6IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKGVudHJ5LmV2ZW50LmlkKSksCiAgICAgICAgICAgICAgbWV0YTogbWV0YWV2ZW50cy5maW5kKG8gPT4gby5wdWJrZXkgPT0gZW50cnkuZXZlbnQucHVia2V5KQogICAgICAgICAgICB9KQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBsb2coInNhdmUgcmVzIiwgcmVzdWx0cy5sZW5ndGgsIHNvY2tldC51cmwpCiAgICAgICAgdXBkYXRlY29udGVudChyZXN1bHRzLCBxLCBhcHBlbmQpCiAgICAgIH0KICAgICAgCiAgICAgIGxldCBsb2FkZWQgPSAwCiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVjb250ZW50KHJlc3VsdHMsIHEsIGFwcGVuZCl7CiAgICAgICAgcmVzdWx0cy5yZXZlcnNlKCkuZm9yRWFjaChpdGVtID0+IHsKICAgICAgICAgIGNvbnN0IHR5cGUgPSBpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KSAmJiAidmlkZW8iIHx8ICJpbWFnZSIKICAgICAgICAgIGNvbnN0IHRleHQgPSAocSB8fCAidmlldyBub3RlIikuc3Vic3RyaW5nKC0zMCkKICAgICAgICAgIGNvbnN0IGlkID0gIml0ZW1fIiArICgrK2lkY291bnRlcikKICAgICAgICAgIGNvbnN0IGNvbnRlbnRlbGVtZW50cyA9ICc8ZGl2IGNsYXNzPSJ0eXBlIj4nICsgcXMoIiN0ZW1wbGF0ZSAuIiArIHR5cGUgKyAic3ZnIikub3V0ZXJIVE1MICsgJzwvZGl2PjxhIGNsYXNzPSJsaWtlJyArIChpdGVtLnJlYWN0ZWQgPyAnIHJlYWN0ZWQnIDogJycpICsgJyIgZGF0YS1pdGVtLWlkPSInICsgaWQgKyAKICAgICAgICAgICAgJyIgaHJlZj0iIyI+JyArIHFzKCIjdGVtcGxhdGUgLmhlYXJ0c3ZnIikub3V0ZXJIVE1MICsgJzwvYT48YSBjbGFzcz0icXVlcnkiIGhyZWY9IicgKyBwcm90b2NvbCArIAogICAgICAgICAgICBpdGVtLmJlY2gzMmlkICsgJyI+JyArIHRleHQgKyAnPC9hPicKICAgICAgICAgIGxldCByb290ID0gbnVsbAogICAgICAgICAgbGV0IHYgPSBudWxsCiAgICAgICAgICAKICAgICAgICAgIGlmKGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpKXsKICAgICAgICAgICAgcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCiAgICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgidmlkZW8tY29udGFpbmVyIikKICAgICAgICAgICAgcm9vdC5pbm5lckhUTUwgPSBjb250ZW50ZWxlbWVudHMKICAgICAgICAgICAgCiAgICAgICAgICAgIHYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpCiAgICAgICAgICAgIHZbImRhdGEtaXRlbS1pZCJdID0gaWQKICAgICAgICAgICAgdi5wcmVsb2FkID0gIm5vbmUiCiAgICAgICAgICAgIHYubG9vcCA9IHRydWUKICAgICAgICAgICAgdi5wbGF5c2lubGluZSA9ICIiCiAgICAgICAgICAgIAogICAgICAgICAgICB2Lm9uY2FucGxheSA9IGFzeW5jIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIGNvbnN0IGFzcGVjdCA9IHRoaXMudmlkZW9XaWR0aCAvIHRoaXMudmlkZW9IZWlnaHQKICAgICAgICAgICAgICBpZihhc3BlY3QgPiAxKXsKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUud2lkdGggPSAoYXNwZWN0ICogMTAwKSArICIlIgogICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgdGhpcy5zdHlsZS5oZWlnaHQgPSAoMSAvIGFzcGVjdCAqIDEwMCkgKyAiJSIKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUubWFyZ2luVG9wID0gLSgoMSAvIGFzcGVjdCAqIDEwMCAtIDEwMCkgLyAyKSArICIlIgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAKICAgICAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkodGhpcy5wYXJlbnRFbGVtZW50KQogICAgICAgICAgICB9CgogICAgICAgICAgICBjb25zdCBleHQgPSBpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KVsxXQogICAgICAgICAgICB2LmlubmVySFRNTCA9ICc8c291cmNlIHNyYz0iJyArIGl0ZW0udXJsICsgJyIgdHlwZT0idmlkZW8vJyArIGV4dCArICciPjwvc291cmNlPicKICAgICAgICAgICAgCiAgICAgICAgICAgIHJvb3QuYXBwZW5kKHYpCiAgICAgICAgICB9ZWxzZSBpZihpdGVtLnVybC5tYXRjaChpbWdleHRyZWdleCkpewogICAgICAgICAgICByb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpCiAgICAgICAgICAgIHJvb3QuaHJlZiA9ICIjIgogICAgICAgICAgICByb290LmlubmVySFRNTCA9IGNvbnRlbnRlbGVtZW50cwogICAgICAgICAgICAgIAogICAgICAgICAgICBpZih0eXBlID09ICJpbWFnZSIpewogICAgICAgICAgICAgIC8vbGV0IGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpCiAgICAgICAgICAgICAgLy9pbWcuYWx0ID0gaXRlbS51cmwKICAgICAgICAgICAgICByb290WyJkYXRhLXNyYyJdID0gaXRlbS51cmwKICAgICAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoImltZyIpCiAgICAgICAgICAgICAgLy9pbWcuY2xhc3NMaXN0LmFkZCgiZGF0YSIpCiAgICAgICAgICAgICAgLy9yb290LmFwcGVuZChpbWcpCiAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MICs9ICc8c3BhbiBjbGFzcz0iZmlsZSI+JyArIGl0ZW0udXJsICsgJzwvc3Bhbj4nCiAgICAgICAgICAgIH0KICAgICAgICAgIH1lbHNlewogICAgICAgICAgICByZXR1cm4KICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgcm9vdC5pZCA9IGlkCiAgICAgICAgICByb290LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snCiAgICAgICAgICByb290WyJkYXRhLWl0ZW0iXSA9IGl0ZW0KICAgICAgICAgIHJvb3RbImRhdGEtZXZlbnQiXSA9IGl0ZW0uZXZlbnQKICAgICAgICAgIHJvb3RbImRhdGEtcXVlcnkiXSA9IHEKICAgICAgICAgIHJvb3RbImRhdGEtdGV4dCJdID0gdGV4dAogICAgICAgICAgCiAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQodHlwZSkKICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgiaXRlbSIpCiAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoInNob3ciKQogICAgICAgICAgCiAgICAgICAgICBpZihpdGVtLnJlYWN0ZWQpewogICAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBxcygiI2ltYWdlcyIpW2FwcGVuZCAmJiAiYXBwZW5kIiB8fCAicHJlcGVuZCJdKHJvb3QpCiAgICAgICAgICAKICAgICAgICAgIGlmKHYpewogICAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkocm9vdCkKICAgICAgICAgIH0KICAgICAgICB9KQoKICAgICAgICB1cGRhdGVpbWFnZXNsb2FkKCkKICAgICAgICAKICAgICAgICBpZihhY3RpdmUoKSA9PSBudWxsKXsKICAgICAgICAgIHFzKCIjaW1hZ2VzIC5pdGVtIik/LmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgfQogICAgICB9CgogICAgICBmdW5jdGlvbiBoaWRlbWVkaWEoKXsKICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gInNjcm9sbCIKICAgICAgICBxc2EoIiNtZWRpYS1jb250YWluZXIsICNpbWFnZSwgI21lZGlhLWZvb3RlciIpLmZvckVhY2gobiA9PiBuLnN0eWxlLmRpc3BsYXkgPSAibm9uZSIpCiAgICAgICAgZ2lkKCJpbWFnZS1saWtlIikuY2xhc3NMaXN0LnJlbW92ZSgicmVhY3RlZCIpCiAgICAgICAgaGlkZXZpZGVvKCkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGlkZXZpZGVvKCl7CiAgICAgICAgY29uc3QgdiA9IHFzKCIjbWVkaWEtY29udGFpbmVyIHZpZGVvIikKICAgICAgICAKICAgICAgICBpZih2KXsKICAgICAgICAgIHYubXV0ZWQgPSB0cnVlCiAgICAgICAgICBnaWQodlsiZGF0YS1pdGVtLWlkIl0pLmFwcGVuZENoaWxkKHYpCiAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkodi5wYXJlbnRFbGVtZW50KQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gd2FpdHJlcyhrZXkpewogICAgICAgIGxldCBldmVudHMgPSBbXQogICAgICAgIAogICAgICAgIGxldCByZXNoYW5kbGVyID0gZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXsKICAgICAgICAgIHRoaXMuaGFuZGxlID0gZnVuY3Rpb24ocmVzKXsKICAgICAgICAgICAgbGV0IG8gPSBKU09OLnBhcnNlKHJlcy5kYXRhKQogICAgICAgICAgICBpZihvWzFdID09IGtleSl7CiAgICAgICAgICAgICAgaWYob1swXSA9PSAiRU9TRSIpewogICAgICAgICAgICAgICAgcmVzb2x2ZShldmVudHMpCiAgICAgICAgICAgICAgICByZXNoYW5kbGVycy5zcGxpY2UocmVzaGFuZGxlcnMuaW5kZXhPZih0aGlzKSwgMSkKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgZXZlbnRzLnB1c2gob1syXSkKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAgIAogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICByZXNoYW5kbGVycy5wdXNoKG5ldyByZXNoYW5kbGVyKHJlc29sdmUsIHJlamVjdCkpCiAgICAgICAgfSkKICAgICAgfQogICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGNoZWNrdXBkYXRlKHNvY2tldCl7CiAgICAgICAgY29uc3QgdXBkYXRlc3JlcyA9IGF3YWl0IHF1ZXJ5cHVia2V5KHNvY2tldCwgdXBkYXRlc3B1YmtleSkKICAgICAgICBjb25zdCB1cGRhdGVub3RlID0gdXBkYXRlc3Jlcy5maW5kKG4gPT4gbi5jb250ZW50Lm1hdGNoKC9eaHR0cHNcOlwvXC8vKSkKICAgICAgICAKICAgICAgICBpZighdXBkYXRlbm90ZSl7CiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgYWdlID0gTWF0aC5yb3VuZCgoRGF0ZS5ub3coKSAvIDEwMDAgLSB1cGRhdGVub3RlLmNyZWF0ZWRfYXQpIC8gMzYwMCAvIDI0KQogICAgICAgIGNvbnN0IG5vdGVpZCA9IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKHVwZGF0ZW5vdGUuaWQpKQogICAgICAgIHFzKCIjcmVsZWFzZSIpLmhyZWYgPSBwcm90b2NvbCArIG5vdGVpZAogICAgICAgIHFzKCIjcmVsZWFzZSIpLmlubmVyVGV4dCA9IChhZ2UgPT0gMCAmJiAidG9kYXkiIHx8IGFnZSArICIgZGF5KHMpIGFnbyIpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNsZWVwKG1zKXsKICAgICAgICByZXR1cm4gbmV3IGZ1bmN0aW9uKCl7CiAgICAgICAgICBsZXQgdGltZW91dCA9IG51bGwKICAgICAgICAgIGxldCByID0gbnVsbAogICAgICAgICAgCiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBwcm9taXNlOiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewogICAgICAgICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoKSwgbXMpCiAgICAgICAgICAgICAgciA9IHJlc29sdmUKICAgICAgICAgICAgfSksCiAgICAgICAgICAgIHJlc29sdmU6IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpCiAgICAgICAgICAgICAgcigpCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNob3coaWQpewogICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIgogICAgICAgIGNvbnN0IGl0ZW0gPSBnaWQoaWQpWyJkYXRhLWl0ZW0iXQogICAgICAgIGNvbnN0IG1lZGlhID0gZ2lkKCJtZWRpYS1jb250YWluZXIiKQogICAgICAgIGNvbnN0IGltYWdlID0gZ2lkKCJpbWFnZSIpCgogICAgICAgIGlmKGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpKXsKICAgICAgICAgIGltYWdlLnN0eWxlLmRpc3BsYXkgPSAibm9uZSIKICAgICAgICAgIGNvbnN0IHYgPSBnaWQoaWQpLnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAgIHFzKCIjbWVkaWEtY29udGFpbmVyIikuYXBwZW5kQ2hpbGQodikKICAgICAgICAgIHYubXV0ZWQgPSBmYWxzZQogICAgICAgICAgdi5wbGF5KCkKICAgICAgICB9ZWxzZXsKICAgICAgICAgIGltYWdlLnNyYyA9IGl0ZW0udXJsCiAgICAgICAgICBpbWFnZS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihpdGVtLm1ldGEpewogICAgICAgICAgY29uc3QgbWV0YWNvbnRlbnQgPSBKU09OLnBhcnNlKGl0ZW0ubWV0YS5jb250ZW50KQogICAgICAgICAgY29uc3QgbmFtZSA9IG1ldGFjb250ZW50LmRpc3BsYXlfbmFtZSB8fCBtZXRhY29udGVudC5uYW1lCiAgICAgICAgICBxcygiI2ltYWdlLXVzZXIiKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgICAgcXMoIiNpbWFnZS11c2VyIikuaHJlZiA9IHByb3RvY29sICsgYmVjaDMyLmVuY29kZSgibnB1YiIsIGZyb21IZXhTdHJpbmcoaXRlbS5tZXRhLnB1YmtleSkpCiAgICAgICAgICBxcygiI2ltYWdlLXVzZXIiKS5pbm5lclRleHQgPSBuYW1lCiAgICAgICAgfWVsc2V7CiAgICAgICAgICBxcygiI2ltYWdlLXVzZXIiKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiCiAgICAgICAgfQoKICAgICAgICBnaWQoImltYWdlLWxpa2UiKVsiZGF0YS1pdGVtLWlkIl0gPSBpZAogICAgICAgIGdpZCgibWVkaWEtZm9vdGVyIilbImRhdGEtZXZlbnQiXSA9IGl0ZW0uZXZlbnQKCiAgICAgICAgaWYoaXRlbS5yZWFjdGVkKXsKICAgICAgICAgIGdpZCgiaW1hZ2UtbGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBhID0gcXMoIiNpbWFnZS1xdWVyeSIpCiAgICAgICAgYS5ocmVmID0gcHJvdG9jb2wgKyBpdGVtLmJlY2gzMmlkCiAgICAgICAgYS5pbm5lclRleHQgPSBnaWQoaWQpWyJkYXRhLXRleHQiXQogICAgICAgICAgCiAgICAgICAgbWVkaWEuc3R5bGUuZGlzcGxheSA9IGdpZCgibWVkaWEtZm9vdGVyIikuc3R5bGUuZGlzcGxheSA9ICJibG9jayIKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gY29ubmNvdW50KCl7CiAgICAgICAgcmV0dXJuIHNvY2tldHMuZmlsdGVyKHIgPT4gci5yZWFkeVN0YXRlID09IDEpLmxlbmd0aAogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBkaXNjb25uZWN0KCl7CiAgICAgICAgZm9yKGxldCBzb2NrZXQgb2Ygc29ja2V0cyl7CiAgICAgICAgICBzb2NrZXQuY2xvc2UoKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXRzLnNwbGljZSgwKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBsb2cobXNnKXsKICAgICAgICBsZXQgc2Nyb2xsID0gcXMoIiNsb2dzIikuc2Nyb2xsVG9wID09IHFzKCIjbG9ncyIpLnNjcm9sbFRvcE1heAogICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCiAgICAgICAgZGl2LmlubmVyVGV4dCA9IEFycmF5LmZyb20oYXJndW1lbnRzKS5qb2luKCIgIikKICAgICAgICBxcygiI2xvZ3MiKS5hcHBlbmQoZGl2KQogICAgICAgIAogICAgICAgIHNjcm9sbCAmJiBxcygiI2xvZ3MiKS5zY3JvbGxUbygwLCBxcygiI2xvZ3MiKS5zY3JvbGxUb3BNYXgpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGNvbm5lY3QodXJsKXsKICAgICAgICBsb2coImNvbm5lY3RpbmciLCB1cmwpCiAgICAgICAgbGV0IHNvY2tldCA9IG5ldyBXZWJTb2NrZXQodXJsKQogICAgICAgIAogICAgICAgIHNvY2tldC5vbm1lc3NhZ2UgPSBtZXNzYWdlID0+IHJlc2hhbmRsZXJzLmZvckVhY2gocmggPT4gcmguaGFuZGxlKG1lc3NhZ2UpKQogICAgICAgIAogICAgICAgIHNvY2tldC5vbmNsb3NlID0gYXN5bmMgZnVuY3Rpb24oKXsKICAgICAgICAgIHNvY2tldHMuc3BsaWNlKHNvY2tldHMuaW5kZXhPZihzb2NrZXQpLCAxKQogICAgICAgICAgcXMoIiNjb25uY291bnQiKS5pbm5lclRleHQgPSBjb25uY291bnQoKSArIChwcmltYWxzb2NrZXQgJiYgMSkKICAgICAgICAgIGxvZygiZGlzY29ubmVjdGVkIiwgdGhpcy51cmwsIGNvbm5jb3VudCgpKQogICAgICAgICAgYXdhaXQgc2xlZXAoMTAwMCkucHJvbWlzZQogICAgICAgICAgY29ubmVjdCh0aGlzLnVybCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc29ja2V0Lm9ub3BlbiA9IGZ1bmN0aW9uKCl7CiAgICAgICAgICBxcygiI2Nvbm5jb3VudCIpLmlubmVyVGV4dCA9IGNvbm5jb3VudCgpICsgKHByaW1hbHNvY2tldCAmJiAxKQogICAgICAgICAgbG9nKCJjb25uZWN0ZWQiLCB0aGlzLnVybCwgY29ubmNvdW50KCkpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiBzb2NrZXQKICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIGFzeW5jICgpID0+IHsKICAgICAgICBwcmltYWxzb2NrZXQgPSBjb25uZWN0KCJ3c3M6Ly9jYWNoZTMucHJpbWFsLm5ldC9jYWNoZTE3IikKICAgICAgICBwcmltYWxzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcigib3BlbiIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICBwcmltYWxnbG9iYWwodGhpcykKICAgICAgICB9KQogICAgICAgIAogICAgICAgIHByaW1hbHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICBwcmltYWxzb2NrZXQgPSBudWxsCiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBmb3IobGV0IHVybCBvZiByZWxheXMoKSl7CiAgICAgICAgICBjb25zdCBzb2NrZXQgPSBjb25uZWN0KHVybCkKICAgICAgICAgIHNvY2tldHMucHVzaChzb2NrZXQpCiAgICAgICAgICAKICAgICAgICAgIHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgY2hlY2t1cGRhdGUodGhpcykKICAgICAgICAgICAgcXVlcnkodGhpcykKICAgICAgICAgIH0pCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGF3YWl0IHNsZWVwKDEwMCkucHJvbWlzZQogICAgICAgIAogICAgICAgIGlmKGhhc2tleSgpKXsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgibm9zdHIiKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGZvcihsZXQgYyBvZiBjb2xvcHRzKXsKICAgICAgICBkb2N1bWVudC53cml0ZSgnPHN0eWxlPicgKyBjb2xzY3NzLmlubmVyVGV4dC5yZXBsYWNlKC9cJFx7Y29sc1x9L2csIGMpICsgJzwvc3R5bGU+JykKICAgICAgfQogICAgPC9zY3JpcHQ+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==
https://ipfs.io/ipfs/QmSzMt8JiB2rVMGYAmRZuuNip4Ln9Reo5FQUGPvzbecBb6
sha256
74b358cd7cad0d0607a5212d663c8925ec380c341aa9bb2cabfb174cf16c00a5 files.html
base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyIvPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL3N2Z2ljb25zLnNwYXJray5mci9zdmdpY29ucy5jc3MiLz4KICAgIDxzdHlsZT4KICAgICAgKiB7CiAgICAgICAgb3ZlcnNjcm9sbC1iZWhhdmlvci15OiBjb250YWluOwogICAgICB9CiAgICAgIAogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksIAogICAgICAjaGVhZGVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncywgCiAgICAgICNwcml2a2V5IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncyB7CiAgICAgICAgaGVpZ2h0OiA2ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNsb2dzIHsKICAgICAgICBoZWlnaHQ6IDhlbTsKICAgICAgICBvdmVyZmxvdzogc2Nyb2xsOwogICAgICAgIGZvbnQtc2l6ZTogLjhlbTsKICAgICAgfQogICAgICAKICAgICAgc2VsZWN0IHsKICAgICAgICB3aWR0aDogNGVtOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLCAKICAgICAgaW5wdXQuc3VibWl0IHsKICAgICAgICBib3JkZXItcmFkaXVzOiAuNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0LCAKICAgICAgI2hlYWRlciBhLAogICAgICAjbWVkaWEtY29udGFpbmVyIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLCAKICAgICAgZm9ybSwgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHotaW5kZXg6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgIAogICAgICBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDMwZW0pIHsKICAgICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgfQogICAgICB9CgogICAgICBmb3JtIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeSB7CiAgICAgICAgd2lkdGg6IDZlbTsKICAgICAgfQogICAgICAKICAgICAgI2xvYWRpbmcgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMHB4OwogICAgICAgIGxlZnQ6IDI3ZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgIGEgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgfQoKICAgICAgdmlkZW8gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogIAogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgIGhlaWdodDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgIG1hcmdpbi10b3A6IDAgIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgLnR5cGUgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICB6LWluZGV4OiAxOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2UtcXVlcnkgewogICAgICAgIHdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksCiAgICAgIGEsCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICB9CgogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbWluLXdpZHRoOiAzZW07CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLAogICAgICAjaGVhZGVyIHNwYW4gewogICAgICAgIHBhZGRpbmc6IDAuNWVtOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CgogICAgICAjaGVhZGVyIHsKICAgICAgICBwYWRkaW5nOiAwLjQ1ZW0gMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAjaGVhZGVyIC5pdGVtcyB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgLml0ZW1zIHsKICAgICAgICBtYXJnaW4tdG9wOiAuM2VtOwogICAgICB9CgogICAgICBwIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICAubGFiZWwgewogICAgICAgIHBhZGRpbmc6IC44ZW0gLjhlbSAuOGVtIDA7CiAgICAgIH0KCiAgICAgICNpbWFnZXMgLnF1ZXJ5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KCiAgICAgICNtZWRpYS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwKTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlIHsKICAgICAgICBtYXgtd2lkdGg6IDEwMHZ3OwogICAgICAgIG1heC1oZWlnaHQ6IDEwMHZoOwogICAgICB9CiAgICAgICAgCiAgICAgICNpbWFnZXMgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZXMgLml0ZW0gewogICAgICAgIHdpZHRoOiAyNXZ3OwogICAgICB9CgogICAgICAjaW1hZ2VzIC5pdGVtIHsKICAgICAgICBoZWlnaHQ6IDI1dnc7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgI21lZGlhLWNvbnRhaW5lciB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgYm9keTpub3QoLm5vc3RyKSAjZmlsdGVyLWxpa2VzLCAKICAgICAgLmZpbHRlci1saWtlcyAjaW1hZ2VzID4gLml0ZW06bm90KC5yZWFjdGVkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIHotaW5kZXg6IDI7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDN2dzsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBwYWRkaW5nOiAwIDF2dzsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UsIAogICAgICAjaW1hZ2UtcXVlcnksIAogICAgICAudmlkZW9zdmcsCiAgICAgIC5pbWFnZXN2ZyB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjYpOwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSB7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGZvbnQtc2l6ZTogbWluKDMuNXZ3LCAxLjVlbSk7CiAgICAgICAgbWF4LXdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1xdWVyeSB7CiAgICAgICAgcGFkZGluZzogLjZlbSAuNGVtIC4xZW0gLjRlbTsKICAgICAgICBtYXgtd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgLmxpa2UucmVhY3RlZCwKICAgICAgLmZpbHRlci1saWtlcyAjZmlsdGVyLWxpa2VzIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7CiAgICAgIH0KCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIGZvbnQtc2l6ZTogM2VtOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2UtcXVlcnksCiAgICAgICNpbWFnZS11c2VyLAogICAgICAjbWVkaWEtZm9vdGVyIC5saWtlIHsKICAgICAgICB6LWluZGV4OiA1OwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlLXF1ZXJ5LAogICAgICAjaW1hZ2UtdXNlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgICNpbWFnZS11c2VyIHsKICAgICAgICBib3R0b206IDEuOWVtOwogICAgICAgIGZvbnQtc2l6ZTogMS44ZW07CiAgICAgICAgcGFkZGluZy1yaWdodDogLjY1ZW07CiAgICAgICAgbWF4LXdpZHRoOiA4ZW07CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgIH0KICAgICAgCiAgICAgIC5saWtlIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IGF1dG87CiAgICAgICAgcGFkZGluZzogLjJlbTsKICAgICAgICB3aWR0aDogMWVtOwogICAgICAgIGhlaWdodDogMWVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5ub3N0ciAubGlrZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7ICAKICAgICAgfQoKICAgICAgI21lZGlhLWZvb3RlciAubGlrZSB7CiAgICAgICAgZm9udC1zaXplOiAyLjRlbTsKICAgICAgfQoKICAgICAgI21lZGlhLWZvb3RlciB7CiAgICAgICAgZGlzcGxheTogbm9uZTsgIAogICAgICB9CiAgCiAgICAgICNpbWFnZXMgLmltZyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIGJhY2tncm91bmQtc2l6ZTogY292ZXI7CiAgICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIC5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICM0NDQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgIC8qI2ltYWdlcyA+IC5hY3RpdmUgewogICAgICAgIGJvcmRlci1jb2xvcjogZ3JlZW47CiAgICAgICAgei1pbmRleDogMTsKICAgICAgfSovCgogICAgICAuaGVhcnRzdmcgcGF0aCB7CiAgICAgICAgc3Ryb2tlOiAjZmZmOwogICAgICB9CiAgCiAgICAgIC52aWRlb3N2ZywKICAgICAgLmltYWdlc3ZnIHsKICAgICAgICB3aWR0aDogY2FsYyhtaW4oNHZ3LCAyZW0pKTsKICAgICAgICBoZWlnaHQ6IGNhbGMobWluKDR2dywgMmVtKSk7CiAgICAgICAgcGFkZGluZzogMCAuMmVtOwogICAgICB9CiAgICAgIAogICAgICAudmlkZW9zdmcgcGF0aCwKICAgICAgLmltYWdlc3ZnIHBhdGggewogICAgICAgIGZpbGw6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgIGEjbWVudSwgYSNmaWx0ZXItbGlrZXMgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbi10b3A6IC0uM2VtOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgIH0KCiAgICAgIGEjbWVudSB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgcGFkZGluZzogMCAuM2VtIDAgLjVlbTsKICAgICAgICBoZWlnaHQ6IDIuMWVtOwogICAgICB9CiAgICAgIAogICAgICBhI2ZpbHRlci1saWtlcyB7CiAgICAgICAgcGFkZGluZzogLjJlbTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgd2lkdGg6IDEuNWVtOwogICAgICAgIGhlaWdodDogMS41ZW07CiAgICAgICAgbWFyZ2luOiAuMWVtIC41ZW07CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CiAgICAgIAogICAgICBhI2ZpbHRlci1saWtlcyBzdmcgewogICAgICAgIHdpZHRoOiAxLjVlbTsKICAgICAgICBoZWlnaHQ6IDEuNWVtOwogICAgICB9CiAgICAgICAKICAgICAgLm1lbnVzdmcgewogICAgICAgIHdpZHRoOiAyZW07CiAgICAgICAgaGVpZ2h0OiAyZW07CiAgICAgIH0KCiAgICAgIC5tZW51c3ZnIHBhdGggewogICAgICAgIGZpbGw6ICNmZmY7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIGhlaWdodDogMTAwdmg7CiAgICAgICAgd2lkdGg6IDE4ZW07CiAgICAgICAgbWFyZ2luLWxlZnQ6IC0xOGVtOwogICAgICAgIGJhY2tncm91bmQ6ICMyMjI7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHotaW5kZXg6IDM7IAogICAgICAgIG92ZXJmbG93OiBzY3JvbGw7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQub3BlbiB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDA7CiAgICAgIH0KICAgICAgCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIHsKICAgICAgICBwYWRkaW5nOiAwIDFlbSAxZW0gMWVtOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjbWVudS1jb250ZW50IC5pdGVtcyBhLAogICAgICBpbnB1dC5zdWJtaXQgewogICAgICAgIHBhZGRpbmc6IC41ZW0gLjdlbTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgYmFja2dyb3VuZDogIzExMTsKICAgICAgfQoKICAgICAgI21lbnUtb3ZlcmxheSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB6LWluZGV4OiAzOwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICBvcGFjaXR5OiAuNTsKICAgICAgfQoKICAgICAgI21lbnUtb3ZlcmxheS5vcGVuIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICAKICAgICAgc3ZnIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgI3RlbXBsYXRlIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxkaXYgaWQ9InRlbXBsYXRlIj4KICAgICAgPHN2ZyBjbGFzcz0iaGVhcnRzdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CiAgICAgICAgPHBhdGggZD0iTTkuNzE5LDE3LjA3M2wtNi41NjItNi41MWMtMC4yNy0wLjI2OC0wLjUwNC0wLjU2Ny0wLjY5Ni0wLjg4OEMxLjM4NSw3Ljg5LDEuNjcsNS42MTMsMy4xNTUsNC4xNGMwLjg2NC0wLjg1NiwyLjAxMi0xLjMyOSwzLjIzMy0xLjMyOWMxLjkyNCwwLDMuMTE1LDEuMTIsMy42MTIsMS43NTJjMC40OTktMC42MzQsMS42ODktMS43NTIsMy42MTItMS43NTJjMS4yMjEsMCwyLjM2OSwwLjQ3MiwzLjIzMywxLjMyOWMxLjQ4NCwxLjQ3MywxLjc3MSwzLjc1LDAuNjkzLDUuNTM3Yy0wLjE5LDAuMzItMC40MjUsMC42MTgtMC42OTUsMC44ODdsLTYuNTYyLDYuNTFDMTAuMTI1LDE3LjIyOSw5Ljg3NSwxNy4yMjksOS43MTksMTcuMDczIE02LjM4OCwzLjYxQzUuMzc5LDMuNjEsNC40MzEsNCwzLjcxNyw0LjcwN0MyLjQ5NSw1LjkyLDIuMjU5LDcuNzk0LDMuMTQ1LDkuMjY1YzAuMTU4LDAuMjY1LDAuMzUxLDAuNTEsMC41NzQsMC43MzFMMTAsMTYuMjI4bDYuMjgxLTYuMjMyYzAuMjI0LTAuMjIxLDAuNDE2LTAuNDY2LDAuNTczLTAuNzI5YzAuODg3LTEuNDcyLDAuNjUxLTMuMzQ2LTAuNTcxLTQuNTZDMTUuNTcsNCwxNC42MjEsMy42MSwxMy42MTIsMy42MWMtMS40MywwLTIuNjM5LDAuNzg2LTMuMjY4LDEuODYzYy0wLjE1NCwwLjI2NC0wLjUzNiwwLjI2NC0wLjY5LDBDOS4wMjksNC4zOTcsNy44MiwzLjYxLDYuMzg4LDMuNjEiPjwvcGF0aD4KICAgICAgPC9zdmc+CiAgICAgIDxzdmcgY2xhc3M9InZpZGVvc3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgoJCQkJPHBhdGggZD0iTTE4LjE3NSw0LjE0MkgxLjk1MUMxLjcwMyw0LjE0MiwxLjUsNC4zNDQsMS41LDQuNTkydjEwLjgxNmMwLDAuMjQ3LDAuMjAzLDAuNDUsMC40NTEsMC40NWgxNi4yMjRjMC4yNDcsMCwwLjQ1LTAuMjAzLDAuNDUtMC40NVY0LjU5MkMxOC42MjUsNC4zNDQsMTguNDIyLDQuMTQyLDE4LjE3NSw0LjE0MiBNNC42NTUsMTQuOTU3SDIuNDAxdi0xLjgwM2gyLjI1M1YxNC45NTd6TTQuNjU1LDEyLjI1NEgyLjQwMXYtMS44MDNoMi4yNTNWMTIuMjU0eiBNNC42NTUsOS41NDlIMi40MDFWNy43NDdoMi4yNTNWOS41NDl6IE00LjY1NSw2Ljg0NkgyLjQwMVY1LjA0M2gyLjI1M1Y2Ljg0NnpNMTQuNTY5LDE0Ljk1N0g1LjU1NlY1LjA0M2g5LjAxM1YxNC45NTd6IE0xNy43MjQsMTQuOTU3aC0yLjI1M3YtMS44MDNoMi4yNTNWMTQuOTU3eiBNMTcuNzI0LDEyLjI1NGgtMi4yNTN2LTEuODAzaDIuMjUzVjEyLjI1NHpNMTcuNzI0LDkuNTQ5aC0yLjI1M1Y3Ljc0N2gyLjI1M1Y5LjU0OXogTTE3LjcyNCw2Ljg0NmgtMi4yNTNWNS4wNDNoMi4yNTNWNi44NDZ6Ij48L3BhdGg+CgkJCTwvc3ZnPgoJCQk8c3ZnIGNsYXNzPSJpbWFnZXN2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KCQkJCTxwYXRoIGQ9Ik0xOC41NTUsMTUuMzU0VjQuNTkyYzAtMC4yNDgtMC4yMDItMC40NTEtMC40NS0wLjQ1MUgxLjg4OGMtMC4yNDgsMC0wLjQ1MSwwLjIwMy0wLjQ1MSwwLjQ1MXYxMC44MDhjMCwwLjU1OSwwLjc1MSwwLjQ1MSwwLjQ1MSwwLjQ1MWgxNi4yMTdoMC4wMDVDMTguNzkzLDE1Ljg1MSwxOC40NzgsMTQuODE0LDE4LjU1NSwxNS4zNTQgTTIuOCwxNC45NDlsNC45NDQtNi40NjRsNC4xNDQsNS40MTljMC4wMDMsMC4wMDMsMC4wMDMsMC4wMDMsMC4wMDMsMC4wMDVsMC43OTcsMS4wNEgyLjh6IE0xMy44MjIsMTQuOTQ5bC0xLjAwNi0xLjMxN2wxLjY4OS0yLjIxOGwyLjY4OCwzLjUzNUgxMy44MjJ6IE0xNy42NTQsMTQuMDY0bC0yLjc5MS0zLjY2NmMtMC4xODEtMC4yMzctMC41MzUtMC4yMzctMC43MTYsMGwtMS44OTksMi40OTNsLTQuMTQ2LTUuNDJjLTAuMTgtMC4yMzctMC41MzYtMC4yMzctMC43MTYsMGwtNS4wNDcsNi41OThWNS4wNDJoMTUuMzE2VjE0LjA2NHogTTEyLjQ3NCw2LjM5M2MtMC44NjksMC0xLjU3NywwLjcwNy0xLjU3NywxLjU3NnMwLjcwOCwxLjU3NiwxLjU3NywxLjU3NnMxLjU3Ny0wLjcwNywxLjU3Ny0xLjU3NlMxMy4zNDMsNi4zOTMsMTIuNDc0LDYuMzkzIE0xMi40NzQsOC42NDVjLTAuMzcxLDAtMC42NzYtMC4zMDQtMC42NzYtMC42NzZzMC4zMDUtMC42NzYsMC42NzYtMC42NzZjMC4zNzIsMCwwLjY3NiwwLjMwNCwwLjY3NiwwLjY3NlMxMi44NDYsOC42NDUsMTIuNDc0LDguNjQ1Ij48L3BhdGg+CgkJCTwvc3ZnPgogICAgICA8ZGl2IGlkPSJjb2xzY3NzIj4KICAgICAgLmNvbHMke2NvbHN9ICNpbWFnZXMgLml0ZW0gewogICAgICAgIHdpZHRoOiBjYWxjKDEwMHZ3IC8gJHtjb2xzfSk7CiAgICAgIH0KCiAgICAgIC5jb2xzJHtjb2xzfSAjaW1hZ2VzIC5pdGVtIHsKICAgICAgICBoZWlnaHQ6IGNhbGMoMTAwdncgLyAke2NvbHN9KTsKICAgICAgfQogICAgICAKICAgICAgLmNvbHMke2NvbHN9IC5xdWVyeSwKICAgICAgLmNvbHMke2NvbHN9IC5saWtlIHsKICAgICAgICBmb250LXNpemU6IG1pbigxNHZ3ICogKDEgLyAke2NvbHN9KSwgNmVtICogKDEgLyAke2NvbHN9KSkKICAgICAgfQogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0ibWVkaWEtZm9vdGVyIj4KICAgICAgPGEgaWQ9ImltYWdlLWxpa2UiIGNsYXNzPSJsaWtlIiBocmVmPSIjIj48L2E+CiAgICAgIDxhIGlkPSJpbWFnZS1xdWVyeSIgaHJlZj0iIyI+PC9hPgogICAgICA8YSBpZD0iaW1hZ2UtdXNlciIgaHJlZj0iIyI+PC9hPgogICAgPC9kaXY+CiAgICA8Y2VudGVyIGlkPSJtZWRpYS1jb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJpbWFnZS1jb250YWluZXIiPgogICAgICAgIDxpbWcgaWQ9ImltYWdlIi8+CiAgICAgIDwvZGl2PgogICAgPC9jZW50ZXI+CiAgICA8ZGl2IGlkPSJtZW51LW92ZXJsYXkiPjwvZGl2PgogICAgPGRpdiBpZD0ibWVudS1jb250ZW50IiBjbGFzcz0idGVzdCI+CiAgICAgIDxkaXYgY2xhc3M9Iml0ZW1zIj4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+YXV0b3BsYXk8L2Rpdj4KICAgICAgICA8YSBjbGFzcz0ic2V0YXV0b3BsYXkiIGRhdGEtYXV0b3BsYXk9Im9uIiBocmVmPSIjIj5vbjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0YXV0b3BsYXkiIGRhdGEtYXV0b3BsYXk9Im9mZiIgaHJlZj0iIyI+b2ZmPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0iaG92ZXIiIGhyZWY9IiMiPm1vdXNlb3ZlcjwvYT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+Y29sdW1uczwvZGl2PgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjEiIGhyZWY9IiMiPjE8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMiIgaHJlZj0iIyI+MjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSI0IiBocmVmPSIjIj40PC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjYiIGhyZWY9IiMiPjY8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMTAiIGhyZWY9IiMiPjEwPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5jb25uZWN0aW9uczwvZGl2PgogICAgICAgIDxkaXYgaWQ9ImNvbm5jb3VudCI+MDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5yZWxheXM6PC9kaXY+CiAgICAgICAgPHA+UGxlYXNlIHVzZSByZWxheXMgd2l0aCBOSVAtNTAgKHNlYXJjaCkgZnVuY3Rpb25hbGl0eTwvcD4KICAgICAgICA8Zm9ybSBhY3Rpb249IiMiIGlkPSJyZWxheXMtZm9ybSI+CiAgICAgICAgICA8dGV4dGFyZWEgaWQ9InJlbGF5cyI+PC90ZXh0YXJlYT4KICAgICAgICAgIDxpbnB1dCBjbGFzcz0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJzYXZlIHJlbGF5cyIvPgogICAgICAgIDwvZm9ybT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+cHJpdmF0ZSBrZXk6PC9kaXY+CiAgICAgICAgPHA+SWYgeW91IGNhbnQgdXNlIGJyb3dzZXIgYWRkb24gKG1vYmlsZSk8L3A+CiAgICAgICAgPGZvcm0gYWN0aW9uPSIjIiBpZD0icHJpdmtleS1mb3JtIj4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icHJpdmtleSIvPgogICAgICAgICAgPGlucHV0IGNsYXNzPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9InNhdmUga2V5Ii8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5sb2dzPC9kaXY+CiAgICAgICAgPGRpdiBpZD0ibG9ncyI+PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmxhdGVzdCByZWxlYXNlOjwvZGl2PgogICAgICAgIDxhIGlkPSJyZWxlYXNlIiBocmVmPSIjIj48L2E+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJoZWFkZXIiPgogICAgICA8YSBpZD0iZmlsdGVyLWxpa2VzIiBocmVmPSIjIj48L2E+CiAgICAgIDxkaXYgY2xhc3M9Iml0ZW1zIj4KICAgICAgICA8YSBpZD0ibWVudSIgaHJlZj0iIyI+CiAgICAgICAgICA8c3ZnIGNsYXNzPSJtZW51c3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgoJCSAgICAgICAgPHBhdGggZD0iTTEwLDEuNDQ1Yy00LjcyNiwwLTguNTU1LDMuODI5LTguNTU1LDguNTU1YzAsNC43MjUsMy44MjksOC41NTUsOC41NTUsOC41NTVjNC43MjUsMCw4LjU1NS0zLjgzLDguNTU1LTguNTU1QzE4LjU1NSw1LjI3NCwxNC43MjUsMS40NDUsMTAsMS40NDUgTTEwLDE3LjY1NGMtNC4yMjEsMC03LjY1NC0zLjQzNC03LjY1NC03LjY1NGMwLTQuMjIxLDMuNDMzLTcuNjU0LDcuNjU0LTcuNjU0YzQuMjIyLDAsNy42NTQsMy40MzMsNy42NTQsNy42NTRDMTcuNjU0LDE0LjIyMSwxNC4yMjIsMTcuNjU0LDEwLDE3LjY1NCBNMTQuMzksMTBjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw5LjU1LDE0LjM5LDkuNzUyLDE0LjM5LDEwIE0xNC4zOSwxMi43MDJjMCwwLjI0Ny0wLjIwMywwLjQ0OS0wLjQ1LDAuNDQ5SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMi0wLjQ1LTAuNDQ5YzAtMC4yNDgsMC4yMDMtMC40NTEsMC40NS0wLjQ1MWg3Ljg3OUMxNC4xODcsMTIuMjUxLDE0LjM5LDEyLjQ1NCwxNC4zOSwxMi43MDIgTTE0LjM5LDcuMjk4YzAsMC4yNDgtMC4yMDMsMC40NS0wLjQ1LDAuNDVINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAzLTAuNDUtMC40NXMwLjIwMy0wLjQ1LDAuNDUtMC40NWg3Ljg3OUMxNC4xODcsNi44NDgsMTQuMzksNy4wNTEsMTQuMzksNy4yOTgiPjwvcGF0aD4KCSAgICAgICAgPC9zdmc+CiAgICAgICAgPC9hPgogICAgICAgIDxhIGlkPSJ0aXRsZSIgaHJlZj0iIyI+ZmlsZXMuaHRtbDwvYT4KICAgICAgICA8Zm9ybSBpZD0icXVlcnktZm9ybSIgYWN0aW9uPSIjIj4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icXVlcnkiIG5hbWU9InF1ZXJ5IiBpZD0iIiAvPgogICAgICAgICAgPHNlbGVjdCBpZD0icXVlcnktdHlwZSI+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImFsbCI+YWxsPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImltYWdlIj5pbWFnZXM8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0idmlkZW8iPnZpZGVvczwvb3B0aW9uPgogICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgICA8aW5wdXQgaWQ9ImdvIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJnbyIvPgogICAgICAgIDwvZm9ybT4KICAgICAgICA8c3BhbiBpZD0icXVlcnlkaXNwbGF5Ij4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0ZXh0Ij48L3NwYW4+CiAgICAgICAgPC9zcGFuPgogICAgICAgIDxkaXYgaWQ9ImxvYWRpbmciPnVwZGF0aW5nPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJpbWFnZXMiPjwvZGl2PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vdW5wa2cuY29tL25vc3RyLXRvb2xzL2xpYi9ub3N0ci5idW5kbGUuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vc2xvd2xpLmdpdGh1Yi5pby9iZWNoMzItYnVmZmVyL2Fzc2V0cy9qcy9iZWNoMzItYnVmZmVyLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0PgogICAgICBjb25zdCB1cGRhdGVzcHVia2V5ID0gImFlNWM2ZTBiNzQ2NjBkMjE5NGM4MjU0YjVjMmM4MjU2NzY1NzZiZTAyOTczNzlmYTIwNTIzMTE0YTZhODVlODciCiAgICAgIGNvbnN0IHF1ZXJpZXMgPSB7CiAgICAgICAgImdsb2JhbCI6ICdbIlJFUSIsIjxJPiIseyJjYWNoZSI6WyJleHBsb3JlIix7InRpbWVmcmFtZSI6ImxhdGVzdCIsInNjb3BlIjoiZ2xvYmFsIiwibGltaXQiOjxMPn1dfV0nLCAKICAgICAgICAiYXV0aG9yIjogJ1siUkVRIiwiPEk+Iix7ImtpbmRzIjpbMV0sImF1dGhvcnMiOlsiPFA+Il19XScsCiAgICAgICAgInJlYWN0aW9ucyI6ICdbIlJFUSIsIjxJPiIsIHsia2luZHMiOls3XSwiI2UiOiA8RT59XScKICAgICAgfQogICAgICBxcygiI3JlbGF5cyIpLnZhbHVlID0gcmVsYXlzKCkuam9pbigiXG4iKQogICAgICBxcygiI3ByaXZrZXkiKS52YWx1ZSA9IHByaXZrZXkoKQogICAgICBjb25zdCBjb2xvcHRzID0gWzEsIDIsIDQsIDYsIDEwXQoKICAgICAgY29scyA9ICgpID0+IHBhcnNlSW50KHNldHRpbmcoImNvbHMiLCBjb2xvcHRzWzFdKSwgMTApCiAgICAgIGF1dG9wbGF5ID0gKCkgPT4gc2V0dGluZygiYXV0b3BsYXkiLCAib2ZmIikKICAgICAgbGltaXQgPSAoKSA9PiBwYXJzZUludChzZXR0aW5nKCJsaW1pdCIsIDE1KSwgMTApCiAgICAgIAogICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgY29scygpKQogICAgICAKICAgICAgbGV0IHByb3RvY29sID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlLykgPyAibm9zdHI6IiA6ICJ3ZWIrbm9zdHI6IgogICAgICBsZXQgc29ja2V0cyA9IFtdCiAgICAgIGxldCByZXNoYW5kbGVycyA9IFtdCiAgICAgIGxldCB1cmxzID0gW10KICAgICAgbGV0IGxpa2VzID0gW10KICAgICAgbGV0IG5ld2xpa2VzID0gW10KICAgICAgbGV0IGlkY291bnRlciA9IDAKICAgICAgbGV0IHF1ZXJ5d2FpdCA9IG51bGwKICAgICAgbGV0IHByaW1hbHNvY2tldCA9IG51bGwKICAgICAgbGV0IHR5cGVzID0gewogICAgICAgIGltYWdlOiBbInBuZyIsICJqcGciLCAianBlZyIsICJ3ZWJwIl0sCiAgICAgICAgdmlkZW86IFsibXA0IiwgIndlYm0iXQogICAgICB9CiAgICAgIGxldCBpbWdyZWdleCA9IC9odHRwKHxzKVw6XC9cL1teIFxuXSo/XC4ocG5nfGpwZ3xqcGVnfHdlYnApL2dpCiAgICAgIGxldCB2aWRlb3JlZ2V4ID0gL2h0dHAofHMpXDpcL1wvW14gXG5dKj9cLihtcDR8d2VibSkvZ2kKICAgICAgbGV0IHZpZGVvZXh0cmVnZXggPSAvXC4obXA0fHdlYm0pJC9pCiAgICAgIGxldCBpbWdleHRyZWdleCA9IC9cLihwbmd8anBnfGpwZWd8d2VicCkkL2kKICAgICAgd2FpdG1zID0gNTAwMAogICAgICBxdWVyeXN0ciA9ICIiCiAgICAgIGxldCBxdWVyeWNvdW50ID0gMAogICAgICBsZXQgaG92ZXJlZHZpZGVvID0gbnVsbAogICAgICAKICAgICAgdXBkYXRlcXVlcnkoKQogICAgICBxcygiI2ltYWdlLWxpa2UiKS5pbm5lckhUTUwgPSBxcygiI2ZpbHRlci1saWtlcyIpLmlubmVySFRNTCA9IHFzKCIjdGVtcGxhdGUgLmhlYXJ0c3ZnIikub3V0ZXJIVE1MCiAgICAgIHNldGFjdGl2ZSgic2V0Y29scyIsICJjb2xzIiwgY29scygpKQogICAgICBzZXRhY3RpdmUoInNldGF1dG9wbGF5IiwgImF1dG9wbGF5IiwgYXV0b3BsYXkoKSkKICAgICAgCiAgICAgIGZ1bmN0aW9uIGZyb21IZXhTdHJpbmcoc3RyKXsKICAgICAgICBsZXQgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoc3RyLmxlbmd0aCAvIDIpCiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWZmZXIubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGJ1ZmZlcltpXSA9IHBhcnNlSW50KHN0ci5zdWJzdHIoMiAqIGksIDIpLCAxNikKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGJ1ZmZlcgogICAgICB9CiAgCiAgICAgIGZ1bmN0aW9uIHJlbGF5cygpewogICAgICAgIGNvbnN0IG9iaiA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oInJlbGF5cyIpKQogICAgICAgIGNvbnN0IHIgPSBvYmogJiYgb2JqLmZpbHRlcihyID0+IHIubWF0Y2goL3dzczpcL1wvLisvKSkgfHwgW10KICAgICAgICAKICAgICAgICByZXR1cm4gci5sZW5ndGggPiAwICYmIHIgfHwgWwogICAgICAgICAgIndzczovL3JlbGF5Lm5vc3RyLmJhbmQiLAogICAgICAgICAgIndzczovL25iLnJlbGF5LmNlbnRlciIsIAogICAgICAgICAgIndzczovL25vc3RyLmNvbXBpbGUtZXJyb3IubmV0IgogICAgICAgIF0KICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcHJpdmtleSgpewogICAgICAgIGxldCBrZXkgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgicHJpdmtleSIpIHx8ICIiCiAgICAgICAgCiAgICAgICAgaWYoa2V5Lmxlbmd0aCA9PSA2Myl7CiAgICAgICAgICBrZXkgPSBOb3N0clRvb2xzLm5pcDE5LmRlY29kZShrZXkpLmRhdGEKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIGtleS5sZW5ndGggPT0gNjQgJiYga2V5IHx8IG51bGwKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gc2V0dGluZyhrZXksIGRlZmF1bHR2YWx1ZSl7CiAgICAgICAgY29uc3QgdiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSkKICAgICAgICByZXR1cm4gdiAmJiBvcHRpb24oInNldCIgKyBrZXksIGtleSwgdikgJiYgdiB8fCBkZWZhdWx0dmFsdWUKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gb3B0aW9uKGMsIGtleSwgdmFsKXsKICAgICAgICByZXR1cm4gcXMoIi4iICsgYyArICJbZGF0YS0iICsga2V5ICsgIj0nIiArIHZhbCArICInXSIpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHFzKHEpewogICAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHEpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHFzYShxKXsKICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHEpKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBnaWQoaSl7CiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGkpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHF1ZXJ5dHlwZSgpewogICAgICAgIHJldHVybiBxcygiI3F1ZXJ5LXR5cGUiKS52YWx1ZSB8fCAiYWxsIgogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVxdWVyeSgpewogICAgICAgIGxldCBwYXJ0cyA9IGRlY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5oYXNoLnN1YnN0cmluZygxKSkuc3BsaXQoIi8iKQogICAgICAgIHF1ZXJ5c3RyID0gcXMoIiNxdWVyeWRpc3BsYXkgLnRleHQiKS5pbm5lclRleHQgPSBwYXJ0c1swXQogICAgICAgIHFzKCIjcXVlcnkiKS52YWx1ZSA9IHBhcnRzWzBdCiAgICAgICAgcXMoIiNxdWVyeS10eXBlIikudmFsdWUgPSBwYXJ0c1sxXSB8fCAiYWxsIgogICAgICB9CgogICAgICBmdW5jdGlvbiBhY3RpdmUoKXsKICAgICAgICByZXR1cm4gcXMoIiNpbWFnZXMgLmFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGltYWdlb2Zmc2V0KG9mZnNldCl7CiAgICAgICAgY29uc3QgaW1hZ2VzID0gcXNhKCIjaW1hZ2VzID4gLml0ZW0iKS5maWx0ZXIoZSA9PiBlLnN0eWxlLmRpc3BsYXkgPT0gImJsb2NrIikKICAgICAgICByZXR1cm4gaW1hZ2VzW2ltYWdlcy5pbmRleE9mKGFjdGl2ZSgpKStvZmZzZXRdCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGxhc3RhY3RpdmUoKXsKICAgICAgICByZXR1cm4gcXNhKCIjaW1hZ2VzIC5hY3RpdmUiKS5wb3AoKSAgICAgIAogICAgICB9CgogICAgICBmdW5jdGlvbiBtZW51KCl7CiAgICAgICAgcXNhKCIjbWVudS1jb250ZW50LCAjbWVudS1vdmVybGF5IikuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnRvZ2dsZSgib3BlbiIpKQogICAgICB9CiAgCiAgICAgIGZ1bmN0aW9uIHNldGFjdGl2ZShjLCBrZXksIHZhbCl7CiAgICAgICAgcXNhKCIuIiArIGMpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpKQogICAgICAgIGNvbnN0IG9wdGlvbiA9IHFzKCIuIiArIGMgKyAiW2RhdGEtIiArIGtleSArICI9JyIgKyB2YWwgKyAiJ10iKQogICAgICAgIG9wdGlvbj8uY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gc2Nyb2xsdmlzaWJsZShuLCBvZmZzZXQpewogICAgICAgIG9mZnNldCA9IG9mZnNldCB8fCAwCiAgICAgICAgcmV0dXJuIChuLm9mZnNldFRvcCArIG4ub2Zmc2V0SGVpZ2h0KSA+PSAoc2Nyb2xsWSAtIG9mZnNldCkKICAgICAgICAgICYmIG4ub2Zmc2V0VG9wIDw9IChzY3JvbGxZICsgdmlzdWFsVmlld3BvcnQuaGVpZ2h0ICsgb2Zmc2V0KQogICAgICB9CgogICAgICBhc3luYyBmdW5jdGlvbiB1cGRhdGVpbWFnZXNsb2FkKCl7CiAgICAgICAgcXNhKCIjaW1hZ2VzIC5pdGVtLmltZyIpLmZvckVhY2goYXN5bmMgaW1nID0+IHsKICAgICAgICAgIGlmKHNjcm9sbHZpc2libGUoaW1nLCB2aXN1YWxWaWV3cG9ydC5oZWlnaHQgLyAyKSl7CiAgICAgICAgICAgIGltZy5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAidXJsKCIgKyBpbWdbImRhdGEtc3JjIl0gKyAiKSIKICAgICAgICAgIH1lbHNlewogICAgICAgICAgICBpbWcuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gIiIKICAgICAgICAgIH0KICAgICAgICB9KQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiB1cGRhdGVhbGx2aWRlb3BsYXkoKXsKICAgICAgICBxc2EoIiNpbWFnZXMgLml0ZW0udmlkZW8iKS5mb3JFYWNoKGFzeW5jIG4gPT4gdXBkYXRldmlkZW9wbGF5KG4pKQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiB1cGRhdGV2aWRlb3BsYXkobil7CiAgICAgICAgY29uc3QgYXBsYXkgPSBhdXRvcGxheSgpCiAgICAgICAgY29uc3QgdiA9IG4ucXVlcnlTZWxlY3RvcigidmlkZW8iKQogICAgICAgIAogICAgICAgIGlmKGFwbGF5ICE9ICJvbiIpewogICAgICAgICAgdi5tdXRlZCA9IGZhbHNlCiAgICAgICAgICB2LnBhdXNlKCkKICAgICAgICB9ZWxzZXsKICAgICAgICAgIHYubXV0ZWQgPSB0cnVlCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKCFzY3JvbGx2aXNpYmxlKG4pKXsKICAgICAgICAgIGlmKHYucmVhZHlTdGF0ZSA9PSA0KXsKICAgICAgICAgICAgdi5wYXVzZSgpCiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgdi5wcmVsb2FkID0gIm5vbmUiCiAgICAgICAgICB9CiAgICAgICAgfWVsc2UgaWYodi5yZWFkeVN0YXRlICE9IDQpewogICAgICAgICAgdi5wcmVsb2FkID0gImF1dG8iCiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoYXBsYXkgPT0gIm9uIiB8fCAoYXBsYXkgPT0gImhvdmVyIiAmJiB2ID09IGhvdmVyZWR2aWRlbykpewogICAgICAgICAgdi5wbGF5KCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsIGUgPT4gewogICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCkKICAgICAgICB1cGRhdGVpbWFnZXNsb2FkKCkKICAgICAgICB1cGRhdGVhbGx2aWRlb3BsYXkoKQogICAgICB9KQogICAgICAKICAgICAgbGV0IHRvdWNoID0gbnVsbAogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsIGUgPT4gdG91Y2ggPSBlLmNoYW5nZWRUb3VjaGVzWzBdKQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLCBlID0+IHsKICAgICAgICBjb25zdCB4ZGlmZiA9IGUuY2hhbmdlZFRvdWNoZXNbMF0uc2NyZWVuWCAtIHRvdWNoLnNjcmVlblgKCiAgICAgICAgaWYoeGRpZmYgPCAtNTApewogICAgICAgICAgc3dpcGUoMSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoeGRpZmYgPiA1MCl7CiAgICAgICAgICBzd2lwZSgtMSkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBxcygiI3F1ZXJ5LWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBsb2NhdGlvbi5oYXNoID0gIiMiICsgZW5jb2RlVVJJQ29tcG9uZW50KHFzKCIjcXVlcnkiKS52YWx1ZSArICIvIiArIHF1ZXJ5dHlwZSgpKQogICAgICAgIHVwZGF0ZXF1ZXJ5KCkKICAgICAgICBxdWVyeXdhaXQucmVzb2x2ZSgpCiAgICAgIH0pCgogICAgICBxcygiI3JlbGF5cy1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgYXN5bmMgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgbGV0IHIgPSBKU09OLnN0cmluZ2lmeShxcygiI3JlbGF5cyIpLnZhbHVlLnNwbGl0KCJcbiIpKQogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJyZWxheXMiLCByKQogICAgICAgIGRpc2Nvbm5lY3QoKQogICAgICB9KQoKICAgICAgcXMoIiNwcml2a2V5LWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBhc3luYyBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBjb25zdCBrZXkgPSBxcygiI3ByaXZrZXkiKS52YWx1ZQoKICAgICAgICBpZihrZXkubGVuZ3RoICE9IDY0ICYmIGtleS5sZW5ndGggIT0gNjMpewogICAgICAgICAgYWxlcnQoImtleSBzaG91bGQgYmUgNjMgb3IgNjQgY2hhcmFjdGVycyBsb25nIikKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgicHJpdmtleSIsIGtleSkKICAgICAgICBhbGVydCgia2V5IHNhdmVkIikKICAgICAgfSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaWYoYXV0b3BsYXkoKSA9PSAiaG92ZXIiICYmIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygidmlkZW8tY29udGFpbmVyIikpewogICAgICAgICAgaG92ZXJlZHZpZGVvID0gZS50YXJnZXQucXVlcnlTZWxlY3RvcigidmlkZW8iKQogICAgICAgICAgaG92ZXJlZHZpZGVvLnBsYXkoKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IiwgYXN5bmMgKGUpID0+IHsKICAgICAgICBob3ZlcmVkdmlkZW8gPSBmYWxzZQogICAgICAgIGlmKHFzKCIjbWVkaWEtY29udGFpbmVyIikuc3R5bGUuZGlzcGxheSAhPSAiYmxvY2siICYmIGF1dG9wbGF5KCkgPT0gImhvdmVyIiAmJiBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInZpZGVvLWNvbnRhaW5lciIpKXsKICAgICAgICAgIHFzYSgidmlkZW8iKS5mb3JFYWNoKHYgPT4gdi5wYXVzZSgpKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgYXN5bmMgKGUpID0+IHsKICAgICAgICBpZihlLnRhcmdldC50eXBlID09ICJzdWJtaXQiIHx8IChlLnRhcmdldC50YWdOYW1lID09ICJBIiAmJiBlLnRhcmdldC5ocmVmLm1hdGNoKC9eKHx3ZWJcKylub3N0clw6LykpKXsKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJ0aXRsZSIpewogICAgICAgICAgcXMoIiNxdWVyeSIpLnZhbHVlID0gIiIKICAgICAgICAgIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlID0gImFsbCIKICAgICAgICAgIHFzKCIjZ28iKS5jbGljaygpCiAgICAgICAgfQoKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gImZpbHRlci1saWtlcyIpewogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCJmaWx0ZXItbGlrZXMiKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxldCBuID0gZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzaG93IikgJiYgZS50YXJnZXQgfHwgZS50YXJnZXQucGFyZW50RWxlbWVudAoKICAgICAgICBpZihuLmNsYXNzTGlzdC5jb250YWlucygic2hvdyIpKXsKICAgICAgICAgIGFjdGl2ZSgpPy5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgZ2lkKG4uaWQpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBzaG93KG4uaWQpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS50YXJnZXQudGFnTmFtZSAhPSAiQSIgJiYgKHFzKCIjaW1hZ2UtY29udGFpbmVyIikgPT0gZS50YXJnZXQgfHwgcXMoIiNpbWFnZSIpID09IGUudGFyZ2V0IHx8IHFzKCIjbWVkaWEtY29udGFpbmVyIHZpZGVvIikgPT0gZS50YXJnZXQpKXsKICAgICAgICAgIGhpZGVtZWRpYSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJtZW51IiB8fCBlLnRhcmdldC5pZCA9PSAibWVudS1vdmVybGF5Iil7CiAgICAgICAgICBtZW51KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRjb2xzIikpewogICAgICAgICAgZm9yKGxldCBjIG9mIGNvbG9wdHMpewogICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoImNvbHMiICsgYykKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJjb2xzIiArIGUudGFyZ2V0LmRhdGFzZXQuY29scykKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJjb2xzIiwgZS50YXJnZXQuZGF0YXNldC5jb2xzKQogICAgICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRhdXRvcGxheSIpKXsKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJhdXRvcGxheSIsIGUudGFyZ2V0LmRhdGFzZXQuYXV0b3BsYXkpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGF1dG9wbGF5IiwgImF1dG9wbGF5IiwgYXV0b3BsYXkoKSkKICAgICAgICAgIHVwZGF0ZWFsbHZpZGVvcGxheSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJsaWtlIikgJiYgbGlrZShlLnRhcmdldCkKICAgICAgfSkKICAgICAgCiAgICAgIGZ1bmN0aW9uIGhhc2tleSgpewogICAgICAgIHJldHVybiB3aW5kb3cubm9zdHIgfHwgcHJpdmtleSgpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHB1YmtleSgpewogICAgICAgIHJldHVybiB3aW5kb3cubm9zdHIgJiYgYXdhaXQgd2luZG93Lm5vc3RyLmdldFB1YmxpY0tleSgpIHx8IE5vc3RyVG9vbHMuZ2V0UHVibGljS2V5KHByaXZrZXkoKSkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gc2lnbihldmVudCl7CiAgICAgICAgaWYod2luZG93Lm5vc3RyKXsKICAgICAgICAgIHJldHVybiBhd2FpdCBub3N0ci5zaWduRXZlbnQoZXZlbnQpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGV2ZW50LnNpZyA9IE5vc3RyVG9vbHMuZ2V0U2lnbmF0dXJlKGV2ZW50LCBwcml2a2V5KCkpCiAgICAgICAgcmV0dXJuIGV2ZW50CiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGxpa2UobGluayl7CiAgICAgICAgY29uc3QgZXZlbnQgPSBsaW5rLnBhcmVudEVsZW1lbnRbImRhdGEtZXZlbnQiXQogICAgICAgIGNvbnN0IHB1YmsgPSBhd2FpdCBwdWJrZXkoKQogICAgICAgIGNvbnN0IGxpa2UgPSBhd2FpdCBzaWduKHsKICAgICAgICAgICJraW5kIjogNywKICAgICAgICAgICJjb250ZW50IjogIisiLAogICAgICAgICAgInRhZ3MiOiBbCiAgICAgICAgICAgIFsiZSIsIGV2ZW50LmlkXSwKICAgICAgICAgICAgWyJwIiwgZXZlbnQucHVia2V5XQogICAgICAgICAgXSwKICAgICAgICAgICJwdWJrZXkiOiBwdWJrLAogICAgICAgICAgImNyZWF0ZWRfYXQiOiBwYXJzZUludChEYXRlLm5vdygpIC8gMTAwMCAsIDEwKQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgc29ja2V0cy5mb3JFYWNoKHMgPT4gcy5zZW5kKEpTT04uc3RyaW5naWZ5KFsiRVZFTlQiLCBsaWtlXSkpKQogICAgICAgIGxpbmsuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCgogICAgICAgIGNvbnN0IGltYWdlaWQgPSBsaW5rWyJkYXRhLWl0ZW0taWQiXSB8fCBsaW5rLmRhdGFzZXQuaW1hZ2VJZAogICAgICAgIAogICAgICAgIGlmKGltYWdlaWQpewogICAgICAgICAgZ2lkKGltYWdlaWQpLnF1ZXJ5U2VsZWN0b3IoIi5saWtlIikuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgfQogICAgICB9CiAgICAKICAgICAgZnVuY3Rpb24gc3dpcGUob2Zmc2V0KXsKICAgICAgICBpZihpbWFnZW9mZnNldChvZmZzZXQpKXsKICAgICAgICAgIGltYWdlb2Zmc2V0KG9mZnNldCkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIHRoaXNbb2Zmc2V0ID09IDEgJiYgImxhc3RhY3RpdmUiIHx8ICJhY3RpdmUiXSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICB1cGRhdGVzaG93KCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZXNob3coKXsKICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLnN0eWxlLmRpc3BsYXkgPT0gImJsb2NrIil7CiAgICAgICAgICBoaWRldmlkZW8oKQogICAgICAgICAgc2hvdyhhY3RpdmUoKS5pZCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBlID0+IHsKICAgICAgICBpZihbIlRhYiIsICJBcnJvd0xlZnQiLCAiQXJyb3dSaWdodCIsICJBcnJvd1VwIiwgIkFycm93RG93biJdLmluY2x1ZGVzKGUua2V5KSl7CiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJFc2NhcGUiKXsKICAgICAgICAgIG1lbnUoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUua2V5ID09ICJFbnRlciIgJiYgZS50YXJnZXQudGFnTmFtZSA9PSAiQk9EWSIpewogICAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5zdHlsZS5kaXNwbGF5ID09ICJibG9jayIpewogICAgICAgICAgICBoaWRlbWVkaWEoKQogICAgICAgICAgICByZXR1cm4KICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgc2hvdyhhY3RpdmUoKS5pZCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93VXAiICYmIGltYWdlb2Zmc2V0KC1jb2xzKCkpKXsKICAgICAgICAgIGltYWdlb2Zmc2V0KC1jb2xzKCkpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBsYXN0YWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIHVwZGF0ZXNob3coKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93RG93biIgJiYgaW1hZ2VvZmZzZXQoY29scygpKSl7CiAgICAgICAgICBpbWFnZW9mZnNldChjb2xzKCkpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgdXBkYXRlc2hvdygpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dMZWZ0Iil7CiAgICAgICAgICBzd2lwZSgtMSkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd1JpZ2h0Iil7CiAgICAgICAgICBzd2lwZSgxKQogICAgICAgIH0KICAgICAgfSkKCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZXF1ZXJ5cmVzKHJlcywgc29ja2V0LCBxLCB0eXBlLCBzdGltZSl7CiAgICAgICAgc2F2ZShzb2NrZXQsIHJlcywgcSwgdHlwZSwgZmFsc2UsIGZhbHNlLCB0cnVlKQogICAgICAgIGxvZygicXVlcnkgcmVzIiwgcmVzLmxlbmd0aCwgc29ja2V0LnVybCkKICAgICAgICBxdWVyeWNvdW50LS0KICAgICAgICBpZihxdWVyeWNvdW50ID09IDApewogICAgICAgICAgcXMoIiNsb2FkaW5nIikuc3R5bGUuZGlzcGxheSA9ICJub25lIgogICAgICAgIH0KICAgICAgICAKICAgICAgICBsZXQgd2FpdCA9IHdhaXRtcyAtIChEYXRlLm5vdygpIC0gc3RpbWUpCiAgICAgICAgcXVlcnl3YWl0ID0gc2xlZXAod2FpdCkKICAgICAgICBhd2FpdCBxdWVyeXdhaXQucHJvbWlzZQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBwcmltYWxnbG9iYWwoc29ja2V0KXsKICAgICAgICBsb2coImdsb2JhbCIsIHNvY2tldC51cmwpCiAgICAgICAgcXVlcnljb3VudCsrCiAgICAgICAgcXMoIiNsb2FkaW5nIikuc3R5bGUuZGlzcGxheSA9ICJibG9jayIKICAgICAgICBsZXQgc3RpbWUgPSBEYXRlLm5vdygpCiAgICAgICAgbGV0IHFpZCA9ICJnbG9iYWxfIiArICgrK2lkY291bnRlcikKICAgICAgICBsZXQgcWlkbGlrZXMgPSAibGlrZXNfIiArICgrK2lkY291bnRlcikKCiAgICAgICAgaWYobmV3bGlrZXMubGVuZ3RoID4gMCl7CiAgICAgICAgICBwcmltYWxzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAgICJSRVEiLCAKICAgICAgICAgICAgcWlkbGlrZXMsIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgImNhY2hlIjogWwogICAgICAgICAgICAgICAgImV2ZW50cyIsIHsKICAgICAgICAgICAgICAgICAgImV2ZW50X2lkcyI6IG5ld2xpa2VzCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgICBdKSkKCiAgICAgICAgICBjb25zdCBsaWtlX2V2ZW50cyA9IGF3YWl0IHdhaXRyZXMocWlkbGlrZXMpCiAgICAgICAgICBuZXdsaWtlcy5zcGxpY2UoMCkKICAgICAgICAgIAogICAgICAgICAgYXdhaXQgc2F2ZShzb2NrZXQsIGxpa2VfZXZlbnRzLCAiIiwgImFsbCIsIHRydWUsIHRydWUsIGZhbHNlKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAiUkVRIiwgCiAgICAgICAgICBxaWQsIAogICAgICAgICAgewogICAgICAgICAgICAiY2FjaGUiOiBbCiAgICAgICAgICAgICAgImV4cGxvcmUiLCAKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidGltZWZyYW1lIjogImxhdGVzdCIsCiAgICAgICAgICAgICAgICAic2NvcGUiOiAiZ2xvYmFsIiwKICAgICAgICAgICAgICAgICJsaW1pdCI6IDIwCiAgICAgICAgICAgICAgfQogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSkpCiAgICAgICAgCiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgd2FpdHJlcyhxaWQpCiAgICAgICAgYXdhaXQgaGFuZGxlcXVlcnlyZXMocmVzLmZpbHRlcihlID0+IGUua2luZCA9PSAxKSwgc29ja2V0LCAiIiwgImFsbCIsIHN0aW1lKQogICAgICAgIHByaW1hbGdsb2JhbChzb2NrZXQpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5KHNvY2tldCwgcHJpbWFsKXsKICAgICAgICBsb2coInF1ZXJ5Iiwgc29ja2V0LnVybCkKICAgICAgICBxdWVyeWNvdW50KysKICAgICAgICBxcygiI2xvYWRpbmciKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgIAogICAgICAgIGxldCBzdGltZSA9IERhdGUubm93KCkKICAgICAgICBsZXQgcSA9IHF1ZXJ5c3RyLnRyaW0oKQogICAgICAgIGxldCB0eXBlID0gcXVlcnl0eXBlKCkKICAgICAgICBsZXQgaSA9ICsraWRjb3VudGVyCiAgICAgICAgbGV0IHFpZCA9ICJxdWVyeV8iICsgaQogICAgICAgIGxldCBmaWx0ZXJzID0gW10KCiAgICAgICAgZmlsdGVycy5wdXNoKC4uLih0eXBlc1t0eXBlXSB8fCBbXSkubWFwKCh0KSA9PiB7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBraW5kczogWzFdLCAKICAgICAgICAgICAgc2VhcmNoOiAiLiIgKyB0LAogICAgICAgICAgICBsaW1pdDogMjAKICAgICAgICAgIH0KICAgICAgICB9KSkKICAgICAgICAKICAgICAgICBpZihxLmxlbmd0aCA+IDApewogICAgICAgICAgZmlsdGVycy5wdXNoKHtraW5kczogWzFdLCBzZWFyY2g6IHF9KQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihmaWx0ZXJzLmxlbmd0aCA9PSAwKXsKICAgICAgICAgIGZpbHRlcnMucHVzaCh7a2luZHM6IFsxXX0pCiAgICAgICAgfQogICAgICAgIAogICAgICAgIAogICAgICAgIGNvbnN0IGxpa2VzcmVzID0gYXdhaXQgcXVlcnlsaWtlcyhzb2NrZXQpCiAgICAgICAgCiAgICAgICAgbGlrZXNyZXMuZm9yRWFjaChldmVudGlkID0+IHsKICAgICAgICAgIGlmKCFsaWtlcy5pbmNsdWRlcyhldmVudGlkKSl7CiAgICAgICAgICAgIGxpa2VzLnB1c2goZXZlbnRpZCkKICAgICAgICAgICAgbmV3bGlrZXMucHVzaChldmVudGlkKQogICAgICAgICAgfQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgY29uc3Qgc2VhcmNob2JqID0gWyJSRVEiLCBxaWQsIC4uLmZpbHRlcnNdCiAgICAgICAgY29uc3Qgc2VhcmNoanNvbiA9IEpTT04uc3RyaW5naWZ5KHNlYXJjaG9iaikKICAgICAgICBzb2NrZXQuc2VuZChzZWFyY2hqc29uKQogICAgICAgIAogICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHdhaXRyZXMocWlkKQogICAgICAgIGF3YWl0IGhhbmRsZXF1ZXJ5cmVzKHJlcywgc29ja2V0LCBxLCB0eXBlLCBzdGltZSkKICAgICAgICBxdWVyeShzb2NrZXQpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5bGlrZXMoc29ja2V0KXsKICAgICAgICBpZighaGFza2V5KCkpewogICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IG15cHVia2V5ID0gYXdhaXQgcHVia2V5KCkKICAgICAgICBjb25zdCBldmVudHMgPSBhd2FpdCBxdWVyeWV2ZW50cyhzb2NrZXQsIFs3XSwgbnVsbCwgW215cHVia2V5XSkKICAgICAgICByZXR1cm4gZXZlbnRzLm1hcChlID0+IGUudGFncy5maW5kKHQgPT4gdFswXSA9PSAiZSIpWzFdKQogICAgICB9CgogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeWV2ZW50cyhzb2NrZXQsIGtpbmRzLCBldmVudGlkcywgYXV0aG9ycyl7CiAgICAgICAgY29uc3QgcXVlcnlpZCA9ICJldmVudHNfIiArICgrK2lkY291bnRlcikKICAgICAgICBjb25zdCBmaWx0ZXJzID0ge30KICAgICAgICAKICAgICAgICBmaWx0ZXJzLmtpbmRzID0ga2luZHMKICAgICAgICAKICAgICAgICBpZihldmVudGlkcyl7CiAgICAgICAgICBmaWx0ZXJzWyIjZSJdID0gZXZlbnRpZHMKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoYXV0aG9ycyl7CiAgICAgICAgICBmaWx0ZXJzWyJhdXRob3JzIl0gPSBhdXRob3JzCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAiUkVRIiwgCiAgICAgICAgICBxdWVyeWlkLCAKICAgICAgICAgIGZpbHRlcnMKICAgICAgICBdKQoKICAgICAgICBzb2NrZXQuc2VuZChqc29uKQogICAgICAgIAogICAgICAgIHJldHVybiBhd2FpdCB3YWl0cmVzKHF1ZXJ5aWQpIHx8IFtdCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5cHVia2V5KHNvY2tldCwgcHViayl7CiAgICAgICAgY29uc3QgcXVlcnlpZCA9ICJxdWVyeV8iICsgKCsraWRjb3VudGVyKQogICAgICAgIHNvY2tldC5zZW5kKHF1ZXJpZXMuYXV0aG9yLnJlcGxhY2UoIjxJPiIsIHF1ZXJ5aWQpLnJlcGxhY2UoIjxQPiIsIHB1YmspKQoKICAgICAgICByZXR1cm4gKGF3YWl0IHdhaXRyZXMocXVlcnlpZCkpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHNhdmUoc29ja2V0LCBldmVudGRiLCBxLCBxdHlwZSwgcmVhY3RlZCwgYXBwZW5kLCBxdWVyeW1ldGEpewogICAgICAgIGxldCBldmVudHB1YmtleXMgPSBbXQogICAgICAgIGNvbnN0IGV2ZW50cyA9IGV2ZW50ZGIuZmlsdGVyKG8gPT4gewogICAgICAgICAgaWYocS5sZW5ndGggPiAwKXsKICAgICAgICAgICAgZm9yKGxldCB3b3JkIG9mIHEuc3BsaXQoIiAiKSl7CiAgICAgICAgICAgICAgaWYoby5jb250ZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZih3b3JkLnRvTG93ZXJDYXNlKCkpID09IC0xKXsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIHJldHVybiB0cnVlCiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBsZXQgcmVzdWx0cyA9IFtdCiAgICAgICAgY29uc3QgZXZlbnRpZHMgPSBldmVudHMubWFwKGUgPT4gZS5pZCkKICAgICAgICBsZXQgbmV3dXJscyA9IFtdCiAgICAgICAgCiAgICAgICAgZm9yKGxldCBldmVudCBvZiBldmVudHMpewogICAgICAgICAgbGV0IHVybHNtYXRjaCA9IFtdCiAgICAgICAgICAKICAgICAgICAgIGlmKHF0eXBlICE9ICJ2aWRlbyIpewogICAgICAgICAgICB1cmxzbWF0Y2gucHVzaCguLi4oZXZlbnQuY29udGVudC5tYXRjaChpbWdyZWdleCkgfHwgW10pKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBpZihxdHlwZSAhPSAiaW1hZ2UiKXsKICAgICAgICAgICAgdXJsc21hdGNoLnB1c2goLi4uKGV2ZW50LmNvbnRlbnQubWF0Y2godmlkZW9yZWdleCkgfHwgW10pKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICB1cmxzbWF0Y2ggPSB1cmxzbWF0Y2guZmlsdGVyKHVybCA9PiAhdXJscy5pbmNsdWRlcyh1cmwpKQoKICAgICAgICAgIGlmKHVybHNtYXRjaC5sZW5ndGggPiAwKXsKICAgICAgICAgICAgbmV3dXJscy5wdXNoKHsKICAgICAgICAgICAgICBldmVudDogZXZlbnQsCiAgICAgICAgICAgICAgdXJsczogdXJsc21hdGNoCiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIAogICAgICAgICAgICB1cmxzLnB1c2goLi4udXJsc21hdGNoKQogICAgICAgICAgICBldmVudHB1YmtleXMuaW5jbHVkZXMoZXZlbnQucHVia2V5KSB8fCBldmVudHB1YmtleXMucHVzaChldmVudC5wdWJrZXkpCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxvZygicXVlcnkgbWV0YSIsIHNvY2tldC51cmwpCiAgICAgICAgbGV0IG1ldGFldmVudHMgPSAocXVlcnltZXRhICYmIGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzBdLCBudWxsLCBldmVudHB1YmtleXMpIHx8IFtdKQogICAgICAgIAogICAgICAgIGZvcihsZXQgZW50cnkgb2YgbmV3dXJscyl7CiAgICAgICAgICBmb3IobGV0IHVybCBvZiBlbnRyeS51cmxzKXsKICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHsKICAgICAgICAgICAgICByZWFjdGVkOiByZWFjdGVkIHx8IGxpa2VzLmluY2x1ZGVzKGVudHJ5LmV2ZW50LmlkKSwgCiAgICAgICAgICAgICAgdXJsOiB1cmwsIAogICAgICAgICAgICAgIGV2ZW50OiBlbnRyeS5ldmVudCwgCiAgICAgICAgICAgICAgYmVjaDMyaWQ6IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKGVudHJ5LmV2ZW50LmlkKSksCiAgICAgICAgICAgICAgbWV0YTogbWV0YWV2ZW50cy5maW5kKG8gPT4gby5wdWJrZXkgPT0gZW50cnkuZXZlbnQucHVia2V5KQogICAgICAgICAgICB9KQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBsb2coInNhdmUgcmVzIiwgcmVzdWx0cy5sZW5ndGgsIHNvY2tldC51cmwpCiAgICAgICAgdXBkYXRlY29udGVudChyZXN1bHRzLCBxLCBhcHBlbmQpCiAgICAgIH0KICAgICAgCiAgICAgIGxldCBsb2FkZWQgPSAwCiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVjb250ZW50KHJlc3VsdHMsIHEsIGFwcGVuZCl7CiAgICAgICAgcmVzdWx0cy5yZXZlcnNlKCkuZm9yRWFjaChpdGVtID0+IHsKICAgICAgICAgIGNvbnN0IHR5cGUgPSBpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KSAmJiAidmlkZW8iIHx8ICJpbWFnZSIKICAgICAgICAgIGNvbnN0IHRleHQgPSAocSB8fCAidmlldyBub3RlIikuc3Vic3RyaW5nKC0zMCkKICAgICAgICAgIGNvbnN0IGlkID0gIml0ZW1fIiArICgrK2lkY291bnRlcikKICAgICAgICAgIGNvbnN0IGNvbnRlbnRlbGVtZW50cyA9ICc8ZGl2IGNsYXNzPSJ0eXBlIj4nICsgcXMoIiN0ZW1wbGF0ZSAuIiArIHR5cGUgKyAic3ZnIikub3V0ZXJIVE1MICsgJzwvZGl2PjxhIGNsYXNzPSJsaWtlJyArIChpdGVtLnJlYWN0ZWQgPyAnIHJlYWN0ZWQnIDogJycpICsgJyIgZGF0YS1pdGVtLWlkPSInICsgaWQgKyAKICAgICAgICAgICAgJyIgaHJlZj0iIyI+JyArIHFzKCIjdGVtcGxhdGUgLmhlYXJ0c3ZnIikub3V0ZXJIVE1MICsgJzwvYT48YSBjbGFzcz0icXVlcnkiIGhyZWY9IicgKyBwcm90b2NvbCArIAogICAgICAgICAgICBpdGVtLmJlY2gzMmlkICsgJyI+JyArIHRleHQgKyAnPC9hPicKICAgICAgICAgIGxldCByb290ID0gbnVsbAogICAgICAgICAgbGV0IHYgPSBudWxsCiAgICAgICAgICAKICAgICAgICAgIGlmKGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpKXsKICAgICAgICAgICAgcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCiAgICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgidmlkZW8tY29udGFpbmVyIikKICAgICAgICAgICAgcm9vdC5pbm5lckhUTUwgPSBjb250ZW50ZWxlbWVudHMKICAgICAgICAgICAgCiAgICAgICAgICAgIHYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpCiAgICAgICAgICAgIHZbImRhdGEtaXRlbS1pZCJdID0gaWQKICAgICAgICAgICAgdi5wcmVsb2FkID0gIm5vbmUiCiAgICAgICAgICAgIHYubG9vcCA9IHRydWUKICAgICAgICAgICAgdi5wbGF5c2lubGluZSA9ICIiCiAgICAgICAgICAgIAogICAgICAgICAgICB2Lm9uY2FucGxheSA9IGFzeW5jIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIGNvbnN0IGFzcGVjdCA9IHRoaXMudmlkZW9XaWR0aCAvIHRoaXMudmlkZW9IZWlnaHQKICAgICAgICAgICAgICBpZihhc3BlY3QgPiAxKXsKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUud2lkdGggPSAoYXNwZWN0ICogMTAwKSArICIlIgogICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgdGhpcy5zdHlsZS5oZWlnaHQgPSAoMSAvIGFzcGVjdCAqIDEwMCkgKyAiJSIKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUubWFyZ2luVG9wID0gLSgoMSAvIGFzcGVjdCAqIDEwMCAtIDEwMCkgLyAyKSArICIlIgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAKICAgICAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkodGhpcy5wYXJlbnRFbGVtZW50KQogICAgICAgICAgICB9CgogICAgICAgICAgICBjb25zdCBleHQgPSBpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KVsxXQogICAgICAgICAgICB2LmlubmVySFRNTCA9ICc8c291cmNlIHNyYz0iJyArIGl0ZW0udXJsICsgJyIgdHlwZT0idmlkZW8vJyArIGV4dCArICciPjwvc291cmNlPicKICAgICAgICAgICAgCiAgICAgICAgICAgIHJvb3QuYXBwZW5kKHYpCiAgICAgICAgICB9ZWxzZSBpZihpdGVtLnVybC5tYXRjaChpbWdleHRyZWdleCkpewogICAgICAgICAgICByb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpCiAgICAgICAgICAgIHJvb3QuaHJlZiA9ICIjIgogICAgICAgICAgICByb290LmlubmVySFRNTCA9IGNvbnRlbnRlbGVtZW50cwogICAgICAgICAgICAgIAogICAgICAgICAgICBpZih0eXBlID09ICJpbWFnZSIpewogICAgICAgICAgICAgIC8vbGV0IGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpCiAgICAgICAgICAgICAgLy9pbWcuYWx0ID0gaXRlbS51cmwKICAgICAgICAgICAgICByb290WyJkYXRhLXNyYyJdID0gaXRlbS51cmwKICAgICAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoImltZyIpCiAgICAgICAgICAgICAgLy9pbWcuY2xhc3NMaXN0LmFkZCgiZGF0YSIpCiAgICAgICAgICAgICAgLy9yb290LmFwcGVuZChpbWcpCiAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MICs9ICc8c3BhbiBjbGFzcz0iZmlsZSI+JyArIGl0ZW0udXJsICsgJzwvc3Bhbj4nCiAgICAgICAgICAgIH0KICAgICAgICAgIH1lbHNlewogICAgICAgICAgICByZXR1cm4KICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgcm9vdC5pZCA9IGlkCiAgICAgICAgICByb290LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snCiAgICAgICAgICByb290WyJkYXRhLWl0ZW0iXSA9IGl0ZW0KICAgICAgICAgIHJvb3RbImRhdGEtZXZlbnQiXSA9IGl0ZW0uZXZlbnQKICAgICAgICAgIHJvb3RbImRhdGEtcXVlcnkiXSA9IHEKICAgICAgICAgIHJvb3RbImRhdGEtdGV4dCJdID0gdGV4dAogICAgICAgICAgCiAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQodHlwZSkKICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgiaXRlbSIpCiAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoInNob3ciKQogICAgICAgICAgCiAgICAgICAgICBpZihpdGVtLnJlYWN0ZWQpewogICAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBxcygiI2ltYWdlcyIpW2FwcGVuZCAmJiAiYXBwZW5kIiB8fCAicHJlcGVuZCJdKHJvb3QpCiAgICAgICAgICAKICAgICAgICAgIGlmKHYpewogICAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkocm9vdCkKICAgICAgICAgIH0KICAgICAgICB9KQoKICAgICAgICB1cGRhdGVpbWFnZXNsb2FkKCkKICAgICAgICAKICAgICAgICBpZihhY3RpdmUoKSA9PSBudWxsKXsKICAgICAgICAgIHFzKCIjaW1hZ2VzIC5pdGVtIik/LmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgfQogICAgICB9CgogICAgICBmdW5jdGlvbiBoaWRlbWVkaWEoKXsKICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gInNjcm9sbCIKICAgICAgICBxc2EoIiNtZWRpYS1jb250YWluZXIsICNpbWFnZSwgI21lZGlhLWZvb3RlciIpLmZvckVhY2gobiA9PiBuLnN0eWxlLmRpc3BsYXkgPSAibm9uZSIpCiAgICAgICAgZ2lkKCJpbWFnZS1saWtlIikuY2xhc3NMaXN0LnJlbW92ZSgicmVhY3RlZCIpCiAgICAgICAgaGlkZXZpZGVvKCkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGlkZXZpZGVvKCl7CiAgICAgICAgY29uc3QgdiA9IHFzKCIjbWVkaWEtY29udGFpbmVyIHZpZGVvIikKICAgICAgICAKICAgICAgICBpZih2KXsKICAgICAgICAgIHYubXV0ZWQgPSB0cnVlCiAgICAgICAgICBnaWQodlsiZGF0YS1pdGVtLWlkIl0pLmFwcGVuZENoaWxkKHYpCiAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkodi5wYXJlbnRFbGVtZW50KQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gd2FpdHJlcyhrZXkpewogICAgICAgIGxldCBldmVudHMgPSBbXQogICAgICAgIAogICAgICAgIGxldCByZXNoYW5kbGVyID0gZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXsKICAgICAgICAgIHRoaXMuaGFuZGxlID0gZnVuY3Rpb24ocmVzKXsKICAgICAgICAgICAgbGV0IG8gPSBKU09OLnBhcnNlKHJlcy5kYXRhKQogICAgICAgICAgICBpZihvWzFdID09IGtleSl7CiAgICAgICAgICAgICAgaWYob1swXSA9PSAiRU9TRSIpewogICAgICAgICAgICAgICAgcmVzb2x2ZShldmVudHMpCiAgICAgICAgICAgICAgICByZXNoYW5kbGVycy5zcGxpY2UocmVzaGFuZGxlcnMuaW5kZXhPZih0aGlzKSwgMSkKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgZXZlbnRzLnB1c2gob1syXSkKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAgIAogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICByZXNoYW5kbGVycy5wdXNoKG5ldyByZXNoYW5kbGVyKHJlc29sdmUsIHJlamVjdCkpCiAgICAgICAgfSkKICAgICAgfQogICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGNoZWNrdXBkYXRlKHNvY2tldCl7CiAgICAgICAgY29uc3QgdXBkYXRlc3JlcyA9IGF3YWl0IHF1ZXJ5cHVia2V5KHNvY2tldCwgdXBkYXRlc3B1YmtleSkKICAgICAgICBjb25zdCB1cGRhdGVub3RlID0gdXBkYXRlc3Jlcy5maW5kKG4gPT4gbi5jb250ZW50Lm1hdGNoKC9eaHR0cHNcOlwvXC8vKSkKICAgICAgICAKICAgICAgICBpZighdXBkYXRlbm90ZSl7CiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgYWdlID0gTWF0aC5yb3VuZCgoRGF0ZS5ub3coKSAvIDEwMDAgLSB1cGRhdGVub3RlLmNyZWF0ZWRfYXQpIC8gMzYwMCAvIDI0KQogICAgICAgIGNvbnN0IG5vdGVpZCA9IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKHVwZGF0ZW5vdGUuaWQpKQogICAgICAgIHFzKCIjcmVsZWFzZSIpLmhyZWYgPSBwcm90b2NvbCArIG5vdGVpZAogICAgICAgIHFzKCIjcmVsZWFzZSIpLmlubmVyVGV4dCA9IChhZ2UgPT0gMCAmJiAidG9kYXkiIHx8IGFnZSArICIgZGF5KHMpIGFnbyIpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNsZWVwKG1zKXsKICAgICAgICByZXR1cm4gbmV3IGZ1bmN0aW9uKCl7CiAgICAgICAgICBsZXQgdGltZW91dCA9IG51bGwKICAgICAgICAgIGxldCByID0gbnVsbAogICAgICAgICAgCiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBwcm9taXNlOiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewogICAgICAgICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoKSwgbXMpCiAgICAgICAgICAgICAgciA9IHJlc29sdmUKICAgICAgICAgICAgfSksCiAgICAgICAgICAgIHJlc29sdmU6IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpCiAgICAgICAgICAgICAgcigpCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNob3coaWQpewogICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIgogICAgICAgIGNvbnN0IGl0ZW0gPSBnaWQoaWQpWyJkYXRhLWl0ZW0iXQogICAgICAgIGNvbnN0IG1lZGlhID0gZ2lkKCJtZWRpYS1jb250YWluZXIiKQogICAgICAgIGNvbnN0IGltYWdlID0gZ2lkKCJpbWFnZSIpCgogICAgICAgIGlmKGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpKXsKICAgICAgICAgIGltYWdlLnN0eWxlLmRpc3BsYXkgPSAibm9uZSIKICAgICAgICAgIGNvbnN0IHYgPSBnaWQoaWQpLnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAgIHFzKCIjbWVkaWEtY29udGFpbmVyIikuYXBwZW5kQ2hpbGQodikKICAgICAgICAgIHYubXV0ZWQgPSBmYWxzZQogICAgICAgICAgdi5wbGF5KCkKICAgICAgICB9ZWxzZXsKICAgICAgICAgIGltYWdlLnNyYyA9IGl0ZW0udXJsCiAgICAgICAgICBpbWFnZS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihpdGVtLm1ldGEpewogICAgICAgICAgY29uc3QgbWV0YWNvbnRlbnQgPSBKU09OLnBhcnNlKGl0ZW0ubWV0YS5jb250ZW50KQogICAgICAgICAgY29uc3QgbmFtZSA9IG1ldGFjb250ZW50LmRpc3BsYXlfbmFtZSB8fCBtZXRhY29udGVudC5uYW1lCiAgICAgICAgICBxcygiI2ltYWdlLXVzZXIiKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgICAgcXMoIiNpbWFnZS11c2VyIikuaHJlZiA9IHByb3RvY29sICsgYmVjaDMyLmVuY29kZSgibnB1YiIsIGZyb21IZXhTdHJpbmcoaXRlbS5tZXRhLnB1YmtleSkpCiAgICAgICAgICBxcygiI2ltYWdlLXVzZXIiKS5pbm5lclRleHQgPSBuYW1lCiAgICAgICAgfWVsc2V7CiAgICAgICAgICBxcygiI2ltYWdlLXVzZXIiKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiCiAgICAgICAgfQoKICAgICAgICBnaWQoImltYWdlLWxpa2UiKVsiZGF0YS1pdGVtLWlkIl0gPSBpZAogICAgICAgIGdpZCgibWVkaWEtZm9vdGVyIilbImRhdGEtZXZlbnQiXSA9IGl0ZW0uZXZlbnQKCiAgICAgICAgaWYoaXRlbS5yZWFjdGVkKXsKICAgICAgICAgIGdpZCgiaW1hZ2UtbGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBhID0gcXMoIiNpbWFnZS1xdWVyeSIpCiAgICAgICAgYS5ocmVmID0gcHJvdG9jb2wgKyBpdGVtLmJlY2gzMmlkCiAgICAgICAgYS5pbm5lclRleHQgPSBnaWQoaWQpWyJkYXRhLXRleHQiXQogICAgICAgICAgCiAgICAgICAgbWVkaWEuc3R5bGUuZGlzcGxheSA9IGdpZCgibWVkaWEtZm9vdGVyIikuc3R5bGUuZGlzcGxheSA9ICJibG9jayIKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gY29ubmNvdW50KCl7CiAgICAgICAgcmV0dXJuIHNvY2tldHMuZmlsdGVyKHIgPT4gci5yZWFkeVN0YXRlID09IDEpLmxlbmd0aAogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBkaXNjb25uZWN0KCl7CiAgICAgICAgZm9yKGxldCBzb2NrZXQgb2Ygc29ja2V0cyl7CiAgICAgICAgICBzb2NrZXQuY2xvc2UoKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXRzLnNwbGljZSgwKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBsb2cobXNnKXsKICAgICAgICBsZXQgc2Nyb2xsID0gcXMoIiNsb2dzIikuc2Nyb2xsVG9wID09IHFzKCIjbG9ncyIpLnNjcm9sbFRvcE1heAogICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCiAgICAgICAgZGl2LmlubmVyVGV4dCA9IEFycmF5LmZyb20oYXJndW1lbnRzKS5qb2luKCIgIikKICAgICAgICBxcygiI2xvZ3MiKS5hcHBlbmQoZGl2KQogICAgICAgIAogICAgICAgIHNjcm9sbCAmJiBxcygiI2xvZ3MiKS5zY3JvbGxUbygwLCBxcygiI2xvZ3MiKS5zY3JvbGxUb3BNYXgpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGNvbm5lY3QodXJsKXsKICAgICAgICBsb2coImNvbm5lY3RpbmciLCB1cmwpCiAgICAgICAgbGV0IHNvY2tldCA9IG5ldyBXZWJTb2NrZXQodXJsKQogICAgICAgIAogICAgICAgIHNvY2tldC5vbm1lc3NhZ2UgPSBtZXNzYWdlID0+IHJlc2hhbmRsZXJzLmZvckVhY2gocmggPT4gcmguaGFuZGxlKG1lc3NhZ2UpKQogICAgICAgIAogICAgICAgIHNvY2tldC5vbmNsb3NlID0gYXN5bmMgZnVuY3Rpb24oKXsKICAgICAgICAgIHNvY2tldHMuc3BsaWNlKHNvY2tldHMuaW5kZXhPZihzb2NrZXQpLCAxKQogICAgICAgICAgcXMoIiNjb25uY291bnQiKS5pbm5lclRleHQgPSBjb25uY291bnQoKSArIChwcmltYWxzb2NrZXQgJiYgMSkKICAgICAgICAgIGxvZygiZGlzY29ubmVjdGVkIiwgdGhpcy51cmwsIGNvbm5jb3VudCgpKQogICAgICAgICAgYXdhaXQgc2xlZXAoMTAwMCkucHJvbWlzZQogICAgICAgICAgY29ubmVjdCh0aGlzLnVybCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc29ja2V0Lm9ub3BlbiA9IGZ1bmN0aW9uKCl7CiAgICAgICAgICBxcygiI2Nvbm5jb3VudCIpLmlubmVyVGV4dCA9IGNvbm5jb3VudCgpICsgKHByaW1hbHNvY2tldCAmJiAxKQogICAgICAgICAgbG9nKCJjb25uZWN0ZWQiLCB0aGlzLnVybCwgY29ubmNvdW50KCkpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiBzb2NrZXQKICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIGFzeW5jICgpID0+IHsKICAgICAgICBwcmltYWxzb2NrZXQgPSBjb25uZWN0KCJ3c3M6Ly9jYWNoZTMucHJpbWFsLm5ldC9jYWNoZTE3IikKICAgICAgICBwcmltYWxzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcigib3BlbiIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICBwcmltYWxnbG9iYWwodGhpcykKICAgICAgICB9KQogICAgICAgIAogICAgICAgIHByaW1hbHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICBwcmltYWxzb2NrZXQgPSBudWxsCiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBmb3IobGV0IHVybCBvZiByZWxheXMoKSl7CiAgICAgICAgICBjb25zdCBzb2NrZXQgPSBjb25uZWN0KHVybCkKICAgICAgICAgIHNvY2tldHMucHVzaChzb2NrZXQpCiAgICAgICAgICAKICAgICAgICAgIHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgY2hlY2t1cGRhdGUodGhpcykKICAgICAgICAgICAgcXVlcnkodGhpcykKICAgICAgICAgIH0pCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGF3YWl0IHNsZWVwKDEwMCkucHJvbWlzZQogICAgICAgIAogICAgICAgIGlmKGhhc2tleSgpKXsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgibm9zdHIiKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGZvcihsZXQgYyBvZiBjb2xvcHRzKXsKICAgICAgICBkb2N1bWVudC53cml0ZSgnPHN0eWxlPicgKyBjb2xzY3NzLmlubmVyVGV4dC5yZXBsYWNlKC9cJFx7Y29sc1x9L2csIGMpICsgJzwvc3R5bGU+JykKICAgICAgfQogICAgPC9zY3JpcHQ+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==
https://ipfs.io/ipfs/QmYUEmc7XjTF1eLUD5D9UsV1tExijh64mXCD9w6YZhJhnM
sha256
793cdc367ce37fbc7a2e6218e11f93ea0f48e41cf4301c64befc10490710b2a6 files.html
base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyIvPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL3N2Z2ljb25zLnNwYXJray5mci9zdmdpY29ucy5jc3MiLz4KICAgIDxzdHlsZT4KICAgICAgKiB7CiAgICAgICAgb3ZlcnNjcm9sbC1iZWhhdmlvci15OiBjb250YWluOwogICAgICB9CiAgICAgIAogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksIAogICAgICAjaGVhZGVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncywgCiAgICAgICNwcml2a2V5IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncyB7CiAgICAgICAgaGVpZ2h0OiA2ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNsb2dzIHsKICAgICAgICBoZWlnaHQ6IDhlbTsKICAgICAgICBvdmVyZmxvdzogc2Nyb2xsOwogICAgICAgIGZvbnQtc2l6ZTogLjhlbTsKICAgICAgfQogICAgICAKICAgICAgc2VsZWN0IHsKICAgICAgICB3aWR0aDogNGVtOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLCAKICAgICAgaW5wdXQuc3VibWl0IHsKICAgICAgICBib3JkZXItcmFkaXVzOiAuNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0LCAKICAgICAgI2hlYWRlciBhLAogICAgICAjbWVkaWEtY29udGFpbmVyIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLCAKICAgICAgZm9ybSwgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHotaW5kZXg6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgIAogICAgICBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDMwZW0pIHsKICAgICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgfQogICAgICB9CgogICAgICBmb3JtIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeSB7CiAgICAgICAgd2lkdGg6IDZlbTsKICAgICAgfQogICAgICAKICAgICAgI2xvYWRpbmcgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMHB4OwogICAgICAgIGxlZnQ6IDI3ZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgIGEgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgfQoKICAgICAgdmlkZW8gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogIAogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgIGhlaWdodDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgIG1hcmdpbi10b3A6IDAgIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgLnR5cGUgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICB6LWluZGV4OiAxOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2UtcXVlcnkgewogICAgICAgIHdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksCiAgICAgIGEsCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICB9CgogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbWluLXdpZHRoOiAzZW07CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLAogICAgICAjaGVhZGVyIHNwYW4gewogICAgICAgIHBhZGRpbmc6IDAuNWVtOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CgogICAgICAjaGVhZGVyIHsKICAgICAgICBwYWRkaW5nOiAwLjQ1ZW0gMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAjaGVhZGVyIC5pdGVtcyB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgLml0ZW1zIHsKICAgICAgICBtYXJnaW4tdG9wOiAuM2VtOwogICAgICB9CgogICAgICBwIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICAubGFiZWwgewogICAgICAgIHBhZGRpbmc6IC44ZW0gLjhlbSAuOGVtIDA7CiAgICAgIH0KCiAgICAgICNpbWFnZXMgLnF1ZXJ5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KCiAgICAgICNtZWRpYS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwKTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlIHsKICAgICAgICBtYXgtd2lkdGg6IDEwMHZ3OwogICAgICAgIG1heC1oZWlnaHQ6IDEwMHZoOwogICAgICB9CiAgICAgICAgCiAgICAgICNpbWFnZXMgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZXMgLml0ZW0gewogICAgICAgIHdpZHRoOiAyNXZ3OwogICAgICB9CgogICAgICAjaW1hZ2VzIC5pdGVtIHsKICAgICAgICBoZWlnaHQ6IDI1dnc7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBib3JkZXI6IDAuM2VtIHNvbGlkIHRyYW5zcGFyZW50OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDAuM2VtOwogICAgICAgIG1hcmdpbjogLTAuM2VtOwogICAgICB9CgogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CiAgICAgIAogICAgICBib2R5Om5vdCgubm9zdHIpICNmaWx0ZXItbGlrZXMsIAogICAgICAuZmlsdGVyLWxpa2VzICNpbWFnZXMgPiAuaXRlbTpub3QoLnJlYWN0ZWQpIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlLCAKICAgICAgI2ltYWdlLXF1ZXJ5LAogICAgICAjaW1hZ2UtdXNlciB7CiAgICAgICAgei1pbmRleDogMjsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3Z3OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHBhZGRpbmc6IDAgMXZ3OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSwgCiAgICAgIC52aWRlb3N2ZywKICAgICAgLmltYWdlc3ZnIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLDAuNik7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlLCAKICAgICAgI2ltYWdlLXF1ZXJ5IHsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgZm9udC1zaXplOiBtaW4oMy41dncsIDEuNWVtKTsKICAgICAgICBtYXgtd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlLXF1ZXJ5IHsKICAgICAgICBwYWRkaW5nOiAuNmVtIC40ZW0gLjFlbSAuNGVtOwogICAgICAgIG1heC13aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICAubGlrZS5yZWFjdGVkLAogICAgICAuZmlsdGVyLWxpa2VzICNmaWx0ZXItbGlrZXMgewogICAgICAgIGJhY2tncm91bmQ6IHJlZDsKICAgICAgfQoKICAgICAgI2ltYWdlLXF1ZXJ5LAogICAgICAjaW1hZ2UtdXNlciB7CiAgICAgICAgZm9udC1zaXplOiAzZW07CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIsCiAgICAgICNtZWRpYS1mb290ZXIgLmxpa2UgewogICAgICAgIHotaW5kZXg6IDU7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2UtcXVlcnksCiAgICAgICNpbWFnZS11c2VyIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIGJvdHRvbTogMS45ZW07CiAgICAgICAgZm9udC1zaXplOiAxLjhlbTsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAuNjVlbTsKICAgICAgICBtYXgtd2lkdGg6IDhlbTsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgfQogICAgICAKICAgICAgLmxpa2UgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogYXV0bzsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIHdpZHRoOiAxZW07CiAgICAgICAgaGVpZ2h0OiAxZW07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgfQoKICAgICAgLm5vc3RyIC5saWtlIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsgIAogICAgICB9CgogICAgICAjbWVkaWEtZm9vdGVyIC5saWtlIHsKICAgICAgICBmb250LXNpemU6IDIuNGVtOwogICAgICB9CgogICAgICAjbWVkaWEtZm9vdGVyIHsKICAgICAgICBkaXNwbGF5OiBub25lOyAgCiAgICAgIH0KICAKICAgICAgI2ltYWdlcyAuaW1nIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgYmFja2dyb3VuZC1zaXplOiBjb3ZlcjsKICAgICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwogICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgLmFjdGl2ZSB7CiAgICAgICAgYmFja2dyb3VuZDogIzQ0NDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlcyA+IC5hY3RpdmUgewogICAgICAgIGJvcmRlci1jb2xvcjogZ3JlZW47CiAgICAgICAgei1pbmRleDogMTsKICAgICAgfQoKICAgICAgLmhlYXJ0c3ZnIHBhdGggewogICAgICAgIHN0cm9rZTogI2ZmZjsKICAgICAgfQogIAogICAgICAudmlkZW9zdmcsCiAgICAgIC5pbWFnZXN2ZyB7CiAgICAgICAgd2lkdGg6IGNhbGMobWluKDR2dywgMmVtKSk7CiAgICAgICAgaGVpZ2h0OiBjYWxjKG1pbig0dncsIDJlbSkpOwogICAgICAgIHBhZGRpbmc6IDAgLjJlbTsKICAgICAgfQogICAgICAKICAgICAgLnZpZGVvc3ZnIHBhdGgsCiAgICAgIC5pbWFnZXN2ZyBwYXRoIHsKICAgICAgICBmaWxsOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICBhI21lbnUsIGEjZmlsdGVyLWxpa2VzIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW4tdG9wOiAtLjNlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICB9CgogICAgICBhI21lbnUgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIHBhZGRpbmc6IDAgLjNlbSAwIC41ZW07CiAgICAgICAgaGVpZ2h0OiAyLjFlbTsKICAgICAgfQogICAgICAKICAgICAgYSNmaWx0ZXItbGlrZXMgewogICAgICAgIHBhZGRpbmc6IC4yZW07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIHdpZHRoOiAxLjVlbTsKICAgICAgICBoZWlnaHQ6IDEuNWVtOwogICAgICAgIG1hcmdpbjogLjFlbSAuNWVtOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICByaWdodDogMDsKICAgICAgfQogICAgICAKICAgICAgYSNmaWx0ZXItbGlrZXMgc3ZnIHsKICAgICAgICB3aWR0aDogMS41ZW07CiAgICAgICAgaGVpZ2h0OiAxLjVlbTsKICAgICAgfQogICAgICAgCiAgICAgIC5tZW51c3ZnIHsKICAgICAgICB3aWR0aDogMmVtOwogICAgICAgIGhlaWdodDogMmVtOwogICAgICB9CgogICAgICAubWVudXN2ZyBwYXRoIHsKICAgICAgICBmaWxsOiAjZmZmOwogICAgICB9CgogICAgICAjbWVudS1jb250ZW50IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBoZWlnaHQ6IDEwMHZoOwogICAgICAgIHdpZHRoOiAxOGVtOwogICAgICAgIG1hcmdpbi1sZWZ0OiAtMThlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMjIyOwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB6LWluZGV4OiAzOyAKICAgICAgICBvdmVyZmxvdzogc2Nyb2xsOwogICAgICB9CgogICAgICAjbWVudS1jb250ZW50Lm9wZW4gewogICAgICAgIG1hcmdpbi1sZWZ0OiAwOwogICAgICB9CiAgICAgIAogICAgICAjbWVudS1jb250ZW50IC5pdGVtcyB7CiAgICAgICAgcGFkZGluZzogMCAxZW0gMWVtIDFlbTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgYSwKICAgICAgaW5wdXQuc3VibWl0IHsKICAgICAgICBwYWRkaW5nOiAuNWVtIC43ZW07CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGJhY2tncm91bmQ6ICMxMTE7CiAgICAgIH0KCiAgICAgICNtZW51LW92ZXJsYXkgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgei1pbmRleDogMzsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgb3BhY2l0eTogLjU7CiAgICAgIH0KCiAgICAgICNtZW51LW92ZXJsYXkub3BlbiB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgCiAgICAgIHN2ZyB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgICN0ZW1wbGF0ZSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8ZGl2IGlkPSJ0ZW1wbGF0ZSI+CiAgICAgIDxzdmcgY2xhc3M9ImhlYXJ0c3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgogICAgICAgIDxwYXRoIGQ9Ik05LjcxOSwxNy4wNzNsLTYuNTYyLTYuNTFjLTAuMjctMC4yNjgtMC41MDQtMC41NjctMC42OTYtMC44ODhDMS4zODUsNy44OSwxLjY3LDUuNjEzLDMuMTU1LDQuMTRjMC44NjQtMC44NTYsMi4wMTItMS4zMjksMy4yMzMtMS4zMjljMS45MjQsMCwzLjExNSwxLjEyLDMuNjEyLDEuNzUyYzAuNDk5LTAuNjM0LDEuNjg5LTEuNzUyLDMuNjEyLTEuNzUyYzEuMjIxLDAsMi4zNjksMC40NzIsMy4yMzMsMS4zMjljMS40ODQsMS40NzMsMS43NzEsMy43NSwwLjY5Myw1LjUzN2MtMC4xOSwwLjMyLTAuNDI1LDAuNjE4LTAuNjk1LDAuODg3bC02LjU2Miw2LjUxQzEwLjEyNSwxNy4yMjksOS44NzUsMTcuMjI5LDkuNzE5LDE3LjA3MyBNNi4zODgsMy42MUM1LjM3OSwzLjYxLDQuNDMxLDQsMy43MTcsNC43MDdDMi40OTUsNS45MiwyLjI1OSw3Ljc5NCwzLjE0NSw5LjI2NWMwLjE1OCwwLjI2NSwwLjM1MSwwLjUxLDAuNTc0LDAuNzMxTDEwLDE2LjIyOGw2LjI4MS02LjIzMmMwLjIyNC0wLjIyMSwwLjQxNi0wLjQ2NiwwLjU3My0wLjcyOWMwLjg4Ny0xLjQ3MiwwLjY1MS0zLjM0Ni0wLjU3MS00LjU2QzE1LjU3LDQsMTQuNjIxLDMuNjEsMTMuNjEyLDMuNjFjLTEuNDMsMC0yLjYzOSwwLjc4Ni0zLjI2OCwxLjg2M2MtMC4xNTQsMC4yNjQtMC41MzYsMC4yNjQtMC42OSwwQzkuMDI5LDQuMzk3LDcuODIsMy42MSw2LjM4OCwzLjYxIj48L3BhdGg+CiAgICAgIDwvc3ZnPgogICAgICA8c3ZnIGNsYXNzPSJ2aWRlb3N2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KCQkJCTxwYXRoIGQ9Ik0xOC4xNzUsNC4xNDJIMS45NTFDMS43MDMsNC4xNDIsMS41LDQuMzQ0LDEuNSw0LjU5MnYxMC44MTZjMCwwLjI0NywwLjIwMywwLjQ1LDAuNDUxLDAuNDVoMTYuMjI0YzAuMjQ3LDAsMC40NS0wLjIwMywwLjQ1LTAuNDVWNC41OTJDMTguNjI1LDQuMzQ0LDE4LjQyMiw0LjE0MiwxOC4xNzUsNC4xNDIgTTQuNjU1LDE0Ljk1N0gyLjQwMXYtMS44MDNoMi4yNTNWMTQuOTU3ek00LjY1NSwxMi4yNTRIMi40MDF2LTEuODAzaDIuMjUzVjEyLjI1NHogTTQuNjU1LDkuNTQ5SDIuNDAxVjcuNzQ3aDIuMjUzVjkuNTQ5eiBNNC42NTUsNi44NDZIMi40MDFWNS4wNDNoMi4yNTNWNi44NDZ6TTE0LjU2OSwxNC45NTdINS41NTZWNS4wNDNoOS4wMTNWMTQuOTU3eiBNMTcuNzI0LDE0Ljk1N2gtMi4yNTN2LTEuODAzaDIuMjUzVjE0Ljk1N3ogTTE3LjcyNCwxMi4yNTRoLTIuMjUzdi0xLjgwM2gyLjI1M1YxMi4yNTR6TTE3LjcyNCw5LjU0OWgtMi4yNTNWNy43NDdoMi4yNTNWOS41NDl6IE0xNy43MjQsNi44NDZoLTIuMjUzVjUuMDQzaDIuMjUzVjYuODQ2eiI+PC9wYXRoPgoJCQk8L3N2Zz4KCQkJPHN2ZyBjbGFzcz0iaW1hZ2Vzdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJCQk8cGF0aCBkPSJNMTguNTU1LDE1LjM1NFY0LjU5MmMwLTAuMjQ4LTAuMjAyLTAuNDUxLTAuNDUtMC40NTFIMS44ODhjLTAuMjQ4LDAtMC40NTEsMC4yMDMtMC40NTEsMC40NTF2MTAuODA4YzAsMC41NTksMC43NTEsMC40NTEsMC40NTEsMC40NTFoMTYuMjE3aDAuMDA1QzE4Ljc5MywxNS44NTEsMTguNDc4LDE0LjgxNCwxOC41NTUsMTUuMzU0IE0yLjgsMTQuOTQ5bDQuOTQ0LTYuNDY0bDQuMTQ0LDUuNDE5YzAuMDAzLDAuMDAzLDAuMDAzLDAuMDAzLDAuMDAzLDAuMDA1bDAuNzk3LDEuMDRIMi44eiBNMTMuODIyLDE0Ljk0OWwtMS4wMDYtMS4zMTdsMS42ODktMi4yMThsMi42ODgsMy41MzVIMTMuODIyeiBNMTcuNjU0LDE0LjA2NGwtMi43OTEtMy42NjZjLTAuMTgxLTAuMjM3LTAuNTM1LTAuMjM3LTAuNzE2LDBsLTEuODk5LDIuNDkzbC00LjE0Ni01LjQyYy0wLjE4LTAuMjM3LTAuNTM2LTAuMjM3LTAuNzE2LDBsLTUuMDQ3LDYuNTk4VjUuMDQyaDE1LjMxNlYxNC4wNjR6IE0xMi40NzQsNi4zOTNjLTAuODY5LDAtMS41NzcsMC43MDctMS41NzcsMS41NzZzMC43MDgsMS41NzYsMS41NzcsMS41NzZzMS41NzctMC43MDcsMS41NzctMS41NzZTMTMuMzQzLDYuMzkzLDEyLjQ3NCw2LjM5MyBNMTIuNDc0LDguNjQ1Yy0wLjM3MSwwLTAuNjc2LTAuMzA0LTAuNjc2LTAuNjc2czAuMzA1LTAuNjc2LDAuNjc2LTAuNjc2YzAuMzcyLDAsMC42NzYsMC4zMDQsMC42NzYsMC42NzZTMTIuODQ2LDguNjQ1LDEyLjQ3NCw4LjY0NSI+PC9wYXRoPgoJCQk8L3N2Zz4KICAgICAgPGRpdiBpZD0iY29sc2NzcyI+CiAgICAgIC5jb2xzJHtjb2xzfSAjaW1hZ2VzIC5pdGVtIHsKICAgICAgICB3aWR0aDogY2FsYygxMDB2dyAvICR7Y29sc30pOwogICAgICB9CgogICAgICAuY29scyR7Y29sc30gI2ltYWdlcyAuaXRlbSB7CiAgICAgICAgaGVpZ2h0OiBjYWxjKDEwMHZ3IC8gJHtjb2xzfSk7CiAgICAgIH0KICAgICAgCiAgICAgIC5jb2xzJHtjb2xzfSAucXVlcnksCiAgICAgIC5jb2xzJHtjb2xzfSAubGlrZSB7CiAgICAgICAgZm9udC1zaXplOiBtaW4oMTR2dyAqICgxIC8gJHtjb2xzfSksIDZlbSAqICgxIC8gJHtjb2xzfSkpCiAgICAgIH0KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9Im1lZGlhLWZvb3RlciI+CiAgICAgIDxhIGlkPSJpbWFnZS1saWtlIiBjbGFzcz0ibGlrZSIgaHJlZj0iIyI+PC9hPgogICAgICA8YSBpZD0iaW1hZ2UtcXVlcnkiIGhyZWY9IiMiPjwvYT4KICAgICAgPGEgaWQ9ImltYWdlLXVzZXIiIGhyZWY9IiMiPjwvYT4KICAgIDwvZGl2PgogICAgPGNlbnRlciBpZD0ibWVkaWEtY29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0iaW1hZ2UtY29udGFpbmVyIj4KICAgICAgICA8aW1nIGlkPSJpbWFnZSIvPgogICAgICA8L2Rpdj4KICAgIDwvY2VudGVyPgogICAgPGRpdiBpZD0ibWVudS1vdmVybGF5Ij48L2Rpdj4KICAgIDxkaXYgaWQ9Im1lbnUtY29udGVudCIgY2xhc3M9InRlc3QiPgogICAgICA8ZGl2IGNsYXNzPSJpdGVtcyI+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmF1dG9wbGF5PC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJvbiIgaHJlZj0iIyI+b248L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJvZmYiIGhyZWY9IiMiPm9mZjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0YXV0b3BsYXkiIGRhdGEtYXV0b3BsYXk9ImhvdmVyIiBocmVmPSIjIj5tb3VzZW92ZXI8L2E+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmNvbHVtbnM8L2Rpdj4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSIxIiBocmVmPSIjIj4xPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjIiIGhyZWY9IiMiPjI8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iNCIgaHJlZj0iIyI+NDwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSI2IiBocmVmPSIjIj42PC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjEwIiBocmVmPSIjIj4xMDwvYT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+Y29ubmVjdGlvbnM8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJjb25uY291bnQiPjA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+cmVsYXlzOjwvZGl2PgogICAgICAgIDxwPlBsZWFzZSB1c2UgcmVsYXlzIHdpdGggTklQLTUwIChzZWFyY2gpIGZ1bmN0aW9uYWxpdHk8L3A+CiAgICAgICAgPGZvcm0gYWN0aW9uPSIjIiBpZD0icmVsYXlzLWZvcm0iPgogICAgICAgICAgPHRleHRhcmVhIGlkPSJyZWxheXMiPjwvdGV4dGFyZWE+CiAgICAgICAgICA8aW5wdXQgY2xhc3M9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0ic2F2ZSByZWxheXMiLz4KICAgICAgICA8L2Zvcm0+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPnByaXZhdGUga2V5OjwvZGl2PgogICAgICAgIDxwPklmIHlvdSBjYW50IHVzZSBicm93c2VyIGFkZG9uIChtb2JpbGUpPC9wPgogICAgICAgIDxmb3JtIGFjdGlvbj0iIyIgaWQ9InByaXZrZXktZm9ybSI+CiAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9InByaXZrZXkiLz4KICAgICAgICAgIDxpbnB1dCBjbGFzcz0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJzYXZlIGtleSIvPgogICAgICAgIDwvZm9ybT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+bG9nczwvZGl2PgogICAgICAgIDxkaXYgaWQ9ImxvZ3MiPjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5sYXRlc3QgcmVsZWFzZTo8L2Rpdj4KICAgICAgICA8YSBpZD0icmVsZWFzZSIgaHJlZj0iIyI+PC9hPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0iaGVhZGVyIj4KICAgICAgPGEgaWQ9ImZpbHRlci1saWtlcyIgaHJlZj0iIyI+PC9hPgogICAgICA8ZGl2IGNsYXNzPSJpdGVtcyI+CiAgICAgICAgPGEgaWQ9Im1lbnUiIGhyZWY9IiMiPgogICAgICAgICAgPHN2ZyBjbGFzcz0ibWVudXN2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KCQkgICAgICAgIDxwYXRoIGQ9Ik0xMCwxLjQ0NWMtNC43MjYsMC04LjU1NSwzLjgyOS04LjU1NSw4LjU1NWMwLDQuNzI1LDMuODI5LDguNTU1LDguNTU1LDguNTU1YzQuNzI1LDAsOC41NTUtMy44Myw4LjU1NS04LjU1NUMxOC41NTUsNS4yNzQsMTQuNzI1LDEuNDQ1LDEwLDEuNDQ1IE0xMCwxNy42NTRjLTQuMjIxLDAtNy42NTQtMy40MzQtNy42NTQtNy42NTRjMC00LjIyMSwzLjQzMy03LjY1NCw3LjY1NC03LjY1NGM0LjIyMiwwLDcuNjU0LDMuNDMzLDcuNjU0LDcuNjU0QzE3LjY1NCwxNC4yMjEsMTQuMjIyLDE3LjY1NCwxMCwxNy42NTQgTTE0LjM5LDEwYzAsMC4yNDgtMC4yMDMsMC40NS0wLjQ1LDAuNDVINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAzLTAuNDUtMC40NXMwLjIwMy0wLjQ1LDAuNDUtMC40NWg3Ljg3OUMxNC4xODcsOS41NSwxNC4zOSw5Ljc1MiwxNC4zOSwxMCBNMTQuMzksMTIuNzAyYzAsMC4yNDctMC4yMDMsMC40NDktMC40NSwwLjQ0OUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDItMC40NS0wLjQ0OWMwLTAuMjQ4LDAuMjAzLTAuNDUxLDAuNDUtMC40NTFoNy44NzlDMTQuMTg3LDEyLjI1MSwxNC4zOSwxMi40NTQsMTQuMzksMTIuNzAyIE0xNC4zOSw3LjI5OGMwLDAuMjQ4LTAuMjAzLDAuNDUtMC40NSwwLjQ1SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMy0wLjQ1LTAuNDVzMC4yMDMtMC40NSwwLjQ1LTAuNDVoNy44NzlDMTQuMTg3LDYuODQ4LDE0LjM5LDcuMDUxLDE0LjM5LDcuMjk4Ij48L3BhdGg+CgkgICAgICAgIDwvc3ZnPgogICAgICAgIDwvYT4KICAgICAgICA8YSBpZD0idGl0bGUiIGhyZWY9IiMiPmZpbGVzLmh0bWw8L2E+CiAgICAgICAgPGZvcm0gaWQ9InF1ZXJ5LWZvcm0iIGFjdGlvbj0iIyI+CiAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9InF1ZXJ5IiBuYW1lPSJxdWVyeSIgaWQ9IiIgLz4KICAgICAgICAgIDxzZWxlY3QgaWQ9InF1ZXJ5LXR5cGUiPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJhbGwiPmFsbDwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJpbWFnZSI+aW1hZ2VzPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9InZpZGVvIj52aWRlb3M8L29wdGlvbj4KICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgICAgPGlucHV0IGlkPSJnbyIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iZ28iLz4KICAgICAgICA8L2Zvcm0+CiAgICAgICAgPHNwYW4gaWQ9InF1ZXJ5ZGlzcGxheSI+CiAgICAgICAgICA8c3BhbiBjbGFzcz0idGV4dCI+PC9zcGFuPgogICAgICAgIDwvc3Bhbj4KICAgICAgICA8ZGl2IGlkPSJsb2FkaW5nIj51cGRhdGluZzwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0iaW1hZ2VzIj48L2Rpdj4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL3VucGtnLmNvbS9ub3N0ci10b29scy9saWIvbm9zdHIuYnVuZGxlLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL3Nsb3dsaS5naXRodWIuaW8vYmVjaDMyLWJ1ZmZlci9hc3NldHMvanMvYmVjaDMyLWJ1ZmZlci5taW4uanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdD4KICAgICAgY29uc3QgdXBkYXRlc3B1YmtleSA9ICJhZTVjNmUwYjc0NjYwZDIxOTRjODI1NGI1YzJjODI1Njc2NTc2YmUwMjk3Mzc5ZmEyMDUyMzExNGE2YTg1ZTg3IgogICAgICBjb25zdCBxdWVyaWVzID0gewogICAgICAgICJnbG9iYWwiOiAnWyJSRVEiLCI8ST4iLHsiY2FjaGUiOlsiZXhwbG9yZSIseyJ0aW1lZnJhbWUiOiJsYXRlc3QiLCJzY29wZSI6Imdsb2JhbCIsImxpbWl0Ijo8TD59XX1dJywgCiAgICAgICAgImF1dGhvciI6ICdbIlJFUSIsIjxJPiIseyJraW5kcyI6WzFdLCJhdXRob3JzIjpbIjxQPiJdfV0nLAogICAgICAgICJyZWFjdGlvbnMiOiAnWyJSRVEiLCI8ST4iLCB7ImtpbmRzIjpbN10sIiNlIjogPEU+fV0nCiAgICAgIH0KICAgICAgcXMoIiNyZWxheXMiKS52YWx1ZSA9IHJlbGF5cygpLmpvaW4oIlxuIikKICAgICAgcXMoIiNwcml2a2V5IikudmFsdWUgPSBwcml2a2V5KCkKICAgICAgY29uc3QgY29sb3B0cyA9IFsxLCAyLCA0LCA2LCAxMF0KCiAgICAgIGNvbHMgPSAoKSA9PiBwYXJzZUludChzZXR0aW5nKCJjb2xzIiwgY29sb3B0c1sxXSksIDEwKQogICAgICBhdXRvcGxheSA9ICgpID0+IHNldHRpbmcoImF1dG9wbGF5IiwgIm9mZiIpCiAgICAgIGxpbWl0ID0gKCkgPT4gcGFyc2VJbnQoc2V0dGluZygibGltaXQiLCAxNSksIDEwKQogICAgICAKICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJjb2xzIiArIGNvbHMoKSkKICAgICAgCiAgICAgIGxldCBwcm90b2NvbCA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS8pID8gIm5vc3RyOiIgOiAid2ViK25vc3RyOiIKICAgICAgbGV0IHNvY2tldHMgPSBbXQogICAgICBsZXQgcmVzaGFuZGxlcnMgPSBbXQogICAgICBsZXQgdXJscyA9IFtdCiAgICAgIGxldCBsaWtlcyA9IFtdCiAgICAgIGxldCBuZXdsaWtlcyA9IFtdCiAgICAgIGxldCBpZGNvdW50ZXIgPSAwCiAgICAgIGxldCBxdWVyeXdhaXQgPSBudWxsCiAgICAgIGxldCBwcmltYWxzb2NrZXQgPSBudWxsCiAgICAgIGxldCB0eXBlcyA9IHsKICAgICAgICBpbWFnZTogWyJwbmciLCAianBnIiwgImpwZWciLCAid2VicCJdLAogICAgICAgIHZpZGVvOiBbIm1wNCIsICJ3ZWJtIl0KICAgICAgfQogICAgICBsZXQgaW1ncmVnZXggPSAvaHR0cCh8cylcOlwvXC9bXiBcbl0qP1wuKHBuZ3xqcGd8anBlZ3x3ZWJwKS9naQogICAgICBsZXQgdmlkZW9yZWdleCA9IC9odHRwKHxzKVw6XC9cL1teIFxuXSo/XC4obXA0fHdlYm0pL2dpCiAgICAgIGxldCB2aWRlb2V4dHJlZ2V4ID0gL1wuKG1wNHx3ZWJtKSQvaQogICAgICBsZXQgaW1nZXh0cmVnZXggPSAvXC4ocG5nfGpwZ3xqcGVnfHdlYnApJC9pCiAgICAgIHdhaXRtcyA9IDUwMDAKICAgICAgcXVlcnlzdHIgPSAiIgogICAgICBsZXQgcXVlcnljb3VudCA9IDAKICAgICAgbGV0IGhvdmVyZWR2aWRlbyA9IG51bGwKICAgICAgCiAgICAgIHVwZGF0ZXF1ZXJ5KCkKICAgICAgcXMoIiNpbWFnZS1saWtlIikuaW5uZXJIVE1MID0gcXMoIiNmaWx0ZXItbGlrZXMiKS5pbm5lckhUTUwgPSBxcygiI3RlbXBsYXRlIC5oZWFydHN2ZyIpLm91dGVySFRNTAogICAgICBzZXRhY3RpdmUoInNldGNvbHMiLCAiY29scyIsIGNvbHMoKSkKICAgICAgc2V0YWN0aXZlKCJzZXRhdXRvcGxheSIsICJhdXRvcGxheSIsIGF1dG9wbGF5KCkpCiAgICAgIAogICAgICBmdW5jdGlvbiBmcm9tSGV4U3RyaW5nKHN0cil7CiAgICAgICAgbGV0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHN0ci5sZW5ndGggLyAyKQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmZmVyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBidWZmZXJbaV0gPSBwYXJzZUludChzdHIuc3Vic3RyKDIgKiBpLCAyKSwgMTYpCiAgICAgICAgfQogICAgICAgIHJldHVybiBidWZmZXIKICAgICAgfQogIAogICAgICBmdW5jdGlvbiByZWxheXMoKXsKICAgICAgICBjb25zdCBvYmogPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJyZWxheXMiKSkKICAgICAgICBjb25zdCByID0gb2JqICYmIG9iai5maWx0ZXIociA9PiByLm1hdGNoKC93c3M6XC9cLy4rLykpIHx8IFtdCiAgICAgICAgCiAgICAgICAgcmV0dXJuIHIubGVuZ3RoID4gMCAmJiByIHx8IFsKICAgICAgICAgICJ3c3M6Ly9yZWxheS5ub3N0ci5iYW5kIiwKICAgICAgICAgICJ3c3M6Ly9uYi5yZWxheS5jZW50ZXIiLCAKICAgICAgICAgICJ3c3M6Ly9ub3N0ci5jb21waWxlLWVycm9yLm5ldCIKICAgICAgICBdCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHByaXZrZXkoKXsKICAgICAgICBsZXQga2V5ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oInByaXZrZXkiKSB8fCAiIgogICAgICAgIAogICAgICAgIGlmKGtleS5sZW5ndGggPT0gNjMpewogICAgICAgICAga2V5ID0gTm9zdHJUb29scy5uaXAxOS5kZWNvZGUoa2V5KS5kYXRhCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiBrZXkubGVuZ3RoID09IDY0ICYmIGtleSB8fCBudWxsCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNldHRpbmcoa2V5LCBkZWZhdWx0dmFsdWUpewogICAgICAgIGNvbnN0IHYgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpCiAgICAgICAgcmV0dXJuIHYgJiYgb3B0aW9uKCJzZXQiICsga2V5LCBrZXksIHYpICYmIHYgfHwgZGVmYXVsdHZhbHVlCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIG9wdGlvbihjLCBrZXksIHZhbCl7CiAgICAgICAgcmV0dXJuIHFzKCIuIiArIGMgKyAiW2RhdGEtIiArIGtleSArICI9JyIgKyB2YWwgKyAiJ10iKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxcyhxKXsKICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihxKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxc2EocSl7CiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChxKSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gZ2lkKGkpewogICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxdWVyeXR5cGUoKXsKICAgICAgICByZXR1cm4gcXMoIiNxdWVyeS10eXBlIikudmFsdWUgfHwgImFsbCIKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlcXVlcnkoKXsKICAgICAgICBsZXQgcGFydHMgPSBkZWNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaGFzaC5zdWJzdHJpbmcoMSkpLnNwbGl0KCIvIikKICAgICAgICBxdWVyeXN0ciA9IHFzKCIjcXVlcnlkaXNwbGF5IC50ZXh0IikuaW5uZXJUZXh0ID0gcGFydHNbMF0KICAgICAgICBxcygiI3F1ZXJ5IikudmFsdWUgPSBwYXJ0c1swXQogICAgICAgIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlID0gcGFydHNbMV0gfHwgImFsbCIKICAgICAgfQoKICAgICAgZnVuY3Rpb24gYWN0aXZlKCl7CiAgICAgICAgcmV0dXJuIHFzKCIjaW1hZ2VzIC5hY3RpdmUiKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBpbWFnZW9mZnNldChvZmZzZXQpewogICAgICAgIGNvbnN0IGltYWdlcyA9IHFzYSgiI2ltYWdlcyA+IC5pdGVtIikuZmlsdGVyKGUgPT4gZS5zdHlsZS5kaXNwbGF5ID09ICJibG9jayIpCiAgICAgICAgcmV0dXJuIGltYWdlc1tpbWFnZXMuaW5kZXhPZihhY3RpdmUoKSkrb2Zmc2V0XQogICAgICB9CgogICAgICBmdW5jdGlvbiBsYXN0YWN0aXZlKCl7CiAgICAgICAgcmV0dXJuIHFzYSgiI2ltYWdlcyAuYWN0aXZlIikucG9wKCkgICAgICAKICAgICAgfQoKICAgICAgZnVuY3Rpb24gbWVudSgpewogICAgICAgIHFzYSgiI21lbnUtY29udGVudCwgI21lbnUtb3ZlcmxheSIpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC50b2dnbGUoIm9wZW4iKSkKICAgICAgfQogIAogICAgICBmdW5jdGlvbiBzZXRhY3RpdmUoYywga2V5LCB2YWwpewogICAgICAgIHFzYSgiLiIgKyBjKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKSkKICAgICAgICBjb25zdCBvcHRpb24gPSBxcygiLiIgKyBjICsgIltkYXRhLSIgKyBrZXkgKyAiPSciICsgdmFsICsgIiddIikKICAgICAgICBvcHRpb24/LmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNjcm9sbHZpc2libGUobiwgb2Zmc2V0KXsKICAgICAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMAogICAgICAgIHJldHVybiAobi5vZmZzZXRUb3AgKyBuLm9mZnNldEhlaWdodCkgPj0gKHNjcm9sbFkgLSBvZmZzZXQpCiAgICAgICAgICAmJiBuLm9mZnNldFRvcCA8PSAoc2Nyb2xsWSArIHZpc3VhbFZpZXdwb3J0LmhlaWdodCArIG9mZnNldCkKICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlaW1hZ2VzbG9hZCgpewogICAgICAgIHFzYSgiI2ltYWdlcyAuaXRlbS5pbWciKS5mb3JFYWNoKGFzeW5jIGltZyA9PiB7CiAgICAgICAgICBpZihzY3JvbGx2aXNpYmxlKGltZywgdmlzdWFsVmlld3BvcnQuaGVpZ2h0IC8gMikpewogICAgICAgICAgICBpbWcuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gInVybCgiICsgaW1nWyJkYXRhLXNyYyJdICsgIikiCiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgaW1nLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICIiCiAgICAgICAgICB9CiAgICAgICAgfSkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlYWxsdmlkZW9wbGF5KCl7CiAgICAgICAgcXNhKCIjaW1hZ2VzIC5pdGVtLnZpZGVvIikuZm9yRWFjaChhc3luYyBuID0+IHVwZGF0ZXZpZGVvcGxheShuKSkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRldmlkZW9wbGF5KG4pewogICAgICAgIGNvbnN0IGFwbGF5ID0gYXV0b3BsYXkoKQogICAgICAgIGNvbnN0IHYgPSBuLnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAKICAgICAgICBpZihhcGxheSAhPSAib24iKXsKICAgICAgICAgIHYubXV0ZWQgPSBmYWxzZQogICAgICAgICAgdi5wYXVzZSgpCiAgICAgICAgfWVsc2V7CiAgICAgICAgICB2Lm11dGVkID0gdHJ1ZQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZighc2Nyb2xsdmlzaWJsZShuKSl7CiAgICAgICAgICBpZih2LnJlYWR5U3RhdGUgPT0gNCl7CiAgICAgICAgICAgIHYucGF1c2UoKQogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIHYucHJlbG9hZCA9ICJub25lIgogICAgICAgICAgfQogICAgICAgIH1lbHNlIGlmKHYucmVhZHlTdGF0ZSAhPSA0KXsKICAgICAgICAgIHYucHJlbG9hZCA9ICJhdXRvIgogICAgICAgIH0KICAgICAgICBlbHNlIGlmKGFwbGF5ID09ICJvbiIgfHwgKGFwbGF5ID09ICJob3ZlciIgJiYgdiA9PSBob3ZlcmVkdmlkZW8pKXsKICAgICAgICAgIHYucGxheSgpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLCBlID0+IHsKICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpCiAgICAgICAgdXBkYXRlaW1hZ2VzbG9hZCgpCiAgICAgICAgdXBkYXRlYWxsdmlkZW9wbGF5KCkKICAgICAgfSkKICAgICAgCiAgICAgIGxldCB0b3VjaCA9IG51bGwKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCBlID0+IHRvdWNoID0gZS5jaGFuZ2VkVG91Y2hlc1swXSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIiwgZSA9PiB7CiAgICAgICAgY29uc3QgeGRpZmYgPSBlLmNoYW5nZWRUb3VjaGVzWzBdLnNjcmVlblggLSB0b3VjaC5zY3JlZW5YCgogICAgICAgIGlmKHhkaWZmIDwgLTUwKXsKICAgICAgICAgIHN3aXBlKDEpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKHhkaWZmID4gNTApewogICAgICAgICAgc3dpcGUoLTEpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgcXMoIiNxdWVyeS1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgbG9jYXRpb24uaGFzaCA9ICIjIiArIGVuY29kZVVSSUNvbXBvbmVudChxcygiI3F1ZXJ5IikudmFsdWUgKyAiLyIgKyBxdWVyeXR5cGUoKSkKICAgICAgICB1cGRhdGVxdWVyeSgpCiAgICAgICAgcXVlcnl3YWl0LnJlc29sdmUoKQogICAgICB9KQoKICAgICAgcXMoIiNyZWxheXMtZm9ybSIpLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsIGFzeW5jIGUgPT4gewogICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIGxldCByID0gSlNPTi5zdHJpbmdpZnkocXMoIiNyZWxheXMiKS52YWx1ZS5zcGxpdCgiXG4iKSkKICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgicmVsYXlzIiwgcikKICAgICAgICBkaXNjb25uZWN0KCkKICAgICAgfSkKCiAgICAgIHFzKCIjcHJpdmtleS1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgYXN5bmMgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgY29uc3Qga2V5ID0gcXMoIiNwcml2a2V5IikudmFsdWUKCiAgICAgICAgaWYoa2V5Lmxlbmd0aCAhPSA2NCAmJiBrZXkubGVuZ3RoICE9IDYzKXsKICAgICAgICAgIGFsZXJ0KCJrZXkgc2hvdWxkIGJlIDYzIG9yIDY0IGNoYXJhY3RlcnMgbG9uZyIpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oInByaXZrZXkiLCBrZXkpCiAgICAgICAgYWxlcnQoImtleSBzYXZlZCIpCiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLCBhc3luYyAoZSkgPT4gewogICAgICAgIGlmKGF1dG9wbGF5KCkgPT0gImhvdmVyIiAmJiBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInZpZGVvLWNvbnRhaW5lciIpKXsKICAgICAgICAgIGhvdmVyZWR2aWRlbyA9IGUudGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAgIGhvdmVyZWR2aWRlby5wbGF5KCkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaG92ZXJlZHZpZGVvID0gZmFsc2UKICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLnN0eWxlLmRpc3BsYXkgIT0gImJsb2NrIiAmJiBhdXRvcGxheSgpID09ICJob3ZlciIgJiYgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2aWRlby1jb250YWluZXIiKSl7CiAgICAgICAgICBxc2EoInZpZGVvIikuZm9yRWFjaCh2ID0+IHYucGF1c2UoKSkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaWYoZS50YXJnZXQudHlwZSA9PSAic3VibWl0IiB8fCAoZS50YXJnZXQudGFnTmFtZSA9PSAiQSIgJiYgZS50YXJnZXQuaHJlZi5tYXRjaCgvXih8d2ViXCspbm9zdHJcOi8pKSl7CiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAidGl0bGUiKXsKICAgICAgICAgIHFzKCIjcXVlcnkiKS52YWx1ZSA9ICIiCiAgICAgICAgICBxcygiI3F1ZXJ5LXR5cGUiKS52YWx1ZSA9ICJhbGwiCiAgICAgICAgICBxcygiI2dvIikuY2xpY2soKQogICAgICAgIH0KCiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJmaWx0ZXItbGlrZXMiKXsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnRvZ2dsZSgiZmlsdGVyLWxpa2VzIikKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBsZXQgbiA9IGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2hvdyIpICYmIGUudGFyZ2V0IHx8IGUudGFyZ2V0LnBhcmVudEVsZW1lbnQKCiAgICAgICAgaWYobi5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKSl7CiAgICAgICAgICBhY3RpdmUoKT8uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIGdpZChuLmlkKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgc2hvdyhuLmlkKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUudGFyZ2V0LnRhZ05hbWUgIT0gIkEiICYmIChxcygiI2ltYWdlLWNvbnRhaW5lciIpID09IGUudGFyZ2V0IHx8IHFzKCIjaW1hZ2UiKSA9PSBlLnRhcmdldCB8fCBxcygiI21lZGlhLWNvbnRhaW5lciB2aWRlbyIpID09IGUudGFyZ2V0KSl7CiAgICAgICAgICBoaWRlbWVkaWEoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAibWVudSIgfHwgZS50YXJnZXQuaWQgPT0gIm1lbnUtb3ZlcmxheSIpewogICAgICAgICAgbWVudSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2V0Y29scyIpKXsKICAgICAgICAgIGZvcihsZXQgYyBvZiBjb2xvcHRzKXsKICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCJjb2xzIiArIGMpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgiY29scyIgKyBlLnRhcmdldC5kYXRhc2V0LmNvbHMpCiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiY29scyIsIGUudGFyZ2V0LmRhdGFzZXQuY29scykKICAgICAgICAgIHNldGFjdGl2ZSgic2V0Y29scyIsICJjb2xzIiwgY29scygpKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogIAogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2V0YXV0b3BsYXkiKSl7CiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiYXV0b3BsYXkiLCBlLnRhcmdldC5kYXRhc2V0LmF1dG9wbGF5KQogICAgICAgICAgc2V0YWN0aXZlKCJzZXRhdXRvcGxheSIsICJhdXRvcGxheSIsIGF1dG9wbGF5KCkpCiAgICAgICAgICB1cGRhdGVhbGx2aWRlb3BsYXkoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygibGlrZSIpICYmIGxpa2UoZS50YXJnZXQpCiAgICAgIH0pCiAgICAgIAogICAgICBmdW5jdGlvbiBoYXNrZXkoKXsKICAgICAgICByZXR1cm4gd2luZG93Lm5vc3RyIHx8IHByaXZrZXkoKQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBwdWJrZXkoKXsKICAgICAgICByZXR1cm4gd2luZG93Lm5vc3RyICYmIGF3YWl0IHdpbmRvdy5ub3N0ci5nZXRQdWJsaWNLZXkoKSB8fCBOb3N0clRvb2xzLmdldFB1YmxpY0tleShwcml2a2V5KCkpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHNpZ24oZXZlbnQpewogICAgICAgIGlmKHdpbmRvdy5ub3N0cil7CiAgICAgICAgICByZXR1cm4gYXdhaXQgbm9zdHIuc2lnbkV2ZW50KGV2ZW50KQogICAgICAgIH0KICAgICAgICAKICAgICAgICBldmVudC5zaWcgPSBOb3N0clRvb2xzLmdldFNpZ25hdHVyZShldmVudCwgcHJpdmtleSgpKQogICAgICAgIHJldHVybiBldmVudAogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBsaWtlKGxpbmspewogICAgICAgIGNvbnN0IGV2ZW50ID0gbGluay5wYXJlbnRFbGVtZW50WyJkYXRhLWV2ZW50Il0KICAgICAgICBjb25zdCBwdWJrID0gYXdhaXQgcHVia2V5KCkKICAgICAgICBjb25zdCBsaWtlID0gYXdhaXQgc2lnbih7CiAgICAgICAgICAia2luZCI6IDcsCiAgICAgICAgICAiY29udGVudCI6ICIrIiwKICAgICAgICAgICJ0YWdzIjogWwogICAgICAgICAgICBbImUiLCBldmVudC5pZF0sCiAgICAgICAgICAgIFsicCIsIGV2ZW50LnB1YmtleV0KICAgICAgICAgIF0sCiAgICAgICAgICAicHVia2V5IjogcHViaywKICAgICAgICAgICJjcmVhdGVkX2F0IjogcGFyc2VJbnQoRGF0ZS5ub3coKSAvIDEwMDAgLCAxMCkKICAgICAgICB9KQogICAgICAgIAogICAgICAgIHNvY2tldHMuZm9yRWFjaChzID0+IHMuc2VuZChKU09OLnN0cmluZ2lmeShbIkVWRU5UIiwgbGlrZV0pKSkKICAgICAgICBsaW5rLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQoKICAgICAgICBjb25zdCBpbWFnZWlkID0gbGlua1siZGF0YS1pdGVtLWlkIl0gfHwgbGluay5kYXRhc2V0LmltYWdlSWQKICAgICAgICAKICAgICAgICBpZihpbWFnZWlkKXsKICAgICAgICAgIGdpZChpbWFnZWlkKS5xdWVyeVNlbGVjdG9yKCIubGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgIH0KICAgICAgfQogICAgCiAgICAgIGZ1bmN0aW9uIHN3aXBlKG9mZnNldCl7CiAgICAgICAgaWYoaW1hZ2VvZmZzZXQob2Zmc2V0KSl7CiAgICAgICAgICBpbWFnZW9mZnNldChvZmZzZXQpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICB0aGlzW29mZnNldCA9PSAxICYmICJsYXN0YWN0aXZlIiB8fCAiYWN0aXZlIl0oKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgdXBkYXRlc2hvdygpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVzaG93KCl7CiAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5zdHlsZS5kaXNwbGF5ID09ICJibG9jayIpewogICAgICAgICAgaGlkZXZpZGVvKCkKICAgICAgICAgIHNob3coYWN0aXZlKCkuaWQpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgZSA9PiB7CiAgICAgICAgaWYoWyJUYWIiLCAiQXJyb3dMZWZ0IiwgIkFycm93UmlnaHQiLCAiQXJyb3dVcCIsICJBcnJvd0Rvd24iXS5pbmNsdWRlcyhlLmtleSkpewogICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiRXNjYXBlIil7CiAgICAgICAgICBtZW51KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLmtleSA9PSAiRW50ZXIiICYmIGUudGFyZ2V0LnRhZ05hbWUgPT0gIkJPRFkiKXsKICAgICAgICAgIGlmKHFzKCIjbWVkaWEtY29udGFpbmVyIikuc3R5bGUuZGlzcGxheSA9PSAiYmxvY2siKXsKICAgICAgICAgICAgaGlkZW1lZGlhKCkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHNob3coYWN0aXZlKCkuaWQpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd1VwIiAmJiBpbWFnZW9mZnNldCgtY29scygpKSl7CiAgICAgICAgICBpbWFnZW9mZnNldCgtY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgbGFzdGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICB1cGRhdGVzaG93KCkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd0Rvd24iICYmIGltYWdlb2Zmc2V0KGNvbHMoKSkpewogICAgICAgICAgaW1hZ2VvZmZzZXQoY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgYWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIHVwZGF0ZXNob3coKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93TGVmdCIpewogICAgICAgICAgc3dpcGUoLTEpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dSaWdodCIpewogICAgICAgICAgc3dpcGUoMSkKICAgICAgICB9CiAgICAgIH0pCgogICAgICBhc3luYyBmdW5jdGlvbiBoYW5kbGVxdWVyeXJlcyhyZXMsIHNvY2tldCwgcSwgdHlwZSwgc3RpbWUpewogICAgICAgIHNhdmUoc29ja2V0LCByZXMsIHEsIHR5cGUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkKICAgICAgICBsb2coInF1ZXJ5IHJlcyIsIHJlcy5sZW5ndGgsIHNvY2tldC51cmwpCiAgICAgICAgcXVlcnljb3VudC0tCiAgICAgICAgaWYocXVlcnljb3VudCA9PSAwKXsKICAgICAgICAgIHFzKCIjbG9hZGluZyIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSIKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbGV0IHdhaXQgPSB3YWl0bXMgLSAoRGF0ZS5ub3coKSAtIHN0aW1lKQogICAgICAgIHF1ZXJ5d2FpdCA9IHNsZWVwKHdhaXQpCiAgICAgICAgYXdhaXQgcXVlcnl3YWl0LnByb21pc2UKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcHJpbWFsZ2xvYmFsKHNvY2tldCl7CiAgICAgICAgbG9nKCJnbG9iYWwiLCBzb2NrZXQudXJsKQogICAgICAgIHF1ZXJ5Y291bnQrKwogICAgICAgIHFzKCIjbG9hZGluZyIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgICAgbGV0IHN0aW1lID0gRGF0ZS5ub3coKQogICAgICAgIGxldCBxaWQgPSAiZ2xvYmFsXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgbGV0IHFpZGxpa2VzID0gImxpa2VzXyIgKyAoKytpZGNvdW50ZXIpCgogICAgICAgIGlmKG5ld2xpa2VzLmxlbmd0aCA+IDApewogICAgICAgICAgcHJpbWFsc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoWwogICAgICAgICAgICAiUkVRIiwgCiAgICAgICAgICAgIHFpZGxpa2VzLCAKICAgICAgICAgICAgewogICAgICAgICAgICAgICJjYWNoZSI6IFsKICAgICAgICAgICAgICAgICJldmVudHMiLCB7CiAgICAgICAgICAgICAgICAgICJldmVudF9pZHMiOiBuZXdsaWtlcwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIF0KICAgICAgICAgICAgfQogICAgICAgICAgXSkpCgogICAgICAgICAgY29uc3QgbGlrZV9ldmVudHMgPSBhd2FpdCB3YWl0cmVzKHFpZGxpa2VzKQogICAgICAgICAgbmV3bGlrZXMuc3BsaWNlKDApCiAgICAgICAgICAKICAgICAgICAgIGF3YWl0IHNhdmUoc29ja2V0LCBsaWtlX2V2ZW50cywgIiIsICJhbGwiLCB0cnVlLCB0cnVlLCBmYWxzZSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoWwogICAgICAgICAgIlJFUSIsIAogICAgICAgICAgcWlkLCAKICAgICAgICAgIHsKICAgICAgICAgICAgImNhY2hlIjogWwogICAgICAgICAgICAgICJleHBsb3JlIiwgCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInRpbWVmcmFtZSI6ICJsYXRlc3QiLAogICAgICAgICAgICAgICAgInNjb3BlIjogImdsb2JhbCIsCiAgICAgICAgICAgICAgICAibGltaXQiOiAyMAogICAgICAgICAgICAgIH0KICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0pKQogICAgICAgIAogICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHdhaXRyZXMocWlkKQogICAgICAgIGF3YWl0IGhhbmRsZXF1ZXJ5cmVzKHJlcy5maWx0ZXIoZSA9PiBlLmtpbmQgPT0gMSksIHNvY2tldCwgIiIsICJhbGwiLCBzdGltZSkKICAgICAgICBwcmltYWxnbG9iYWwoc29ja2V0KQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeShzb2NrZXQsIHByaW1hbCl7CiAgICAgICAgbG9nKCJxdWVyeSIsIHNvY2tldC51cmwpCiAgICAgICAgcXVlcnljb3VudCsrCiAgICAgICAgcXMoIiNsb2FkaW5nIikuc3R5bGUuZGlzcGxheSA9ICJibG9jayIKICAgICAgICAKICAgICAgICBsZXQgc3RpbWUgPSBEYXRlLm5vdygpCiAgICAgICAgbGV0IHEgPSBxdWVyeXN0ci50cmltKCkKICAgICAgICBsZXQgdHlwZSA9IHF1ZXJ5dHlwZSgpCiAgICAgICAgbGV0IGkgPSArK2lkY291bnRlcgogICAgICAgIGxldCBxaWQgPSAicXVlcnlfIiArIGkKICAgICAgICBsZXQgZmlsdGVycyA9IFtdCgogICAgICAgIGZpbHRlcnMucHVzaCguLi4odHlwZXNbdHlwZV0gfHwgW10pLm1hcCgodCkgPT4gewogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAga2luZHM6IFsxXSwgCiAgICAgICAgICAgIHNlYXJjaDogIi4iICsgdCwKICAgICAgICAgICAgbGltaXQ6IDIwCiAgICAgICAgICB9CiAgICAgICAgfSkpCiAgICAgICAgCiAgICAgICAgaWYocS5sZW5ndGggPiAwKXsKICAgICAgICAgIGZpbHRlcnMucHVzaCh7a2luZHM6IFsxXSwgc2VhcmNoOiBxfSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZmlsdGVycy5sZW5ndGggPT0gMCl7CiAgICAgICAgICBmaWx0ZXJzLnB1c2goe2tpbmRzOiBbMV19KQogICAgICAgIH0KICAgICAgICAKICAgICAgICAKICAgICAgICBjb25zdCBsaWtlc3JlcyA9IGF3YWl0IHF1ZXJ5bGlrZXMoc29ja2V0KQogICAgICAgIAogICAgICAgIGxpa2VzcmVzLmZvckVhY2goZXZlbnRpZCA9PiB7CiAgICAgICAgICBpZighbGlrZXMuaW5jbHVkZXMoZXZlbnRpZCkpewogICAgICAgICAgICBsaWtlcy5wdXNoKGV2ZW50aWQpCiAgICAgICAgICAgIG5ld2xpa2VzLnB1c2goZXZlbnRpZCkKICAgICAgICAgIH0KICAgICAgICB9KQogICAgICAgIAogICAgICAgIGNvbnN0IHNlYXJjaG9iaiA9IFsiUkVRIiwgcWlkLCAuLi5maWx0ZXJzXQogICAgICAgIGNvbnN0IHNlYXJjaGpzb24gPSBKU09OLnN0cmluZ2lmeShzZWFyY2hvYmopCiAgICAgICAgc29ja2V0LnNlbmQoc2VhcmNoanNvbikKICAgICAgICAKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB3YWl0cmVzKHFpZCkKICAgICAgICBhd2FpdCBoYW5kbGVxdWVyeXJlcyhyZXMsIHNvY2tldCwgcSwgdHlwZSwgc3RpbWUpCiAgICAgICAgcXVlcnkoc29ja2V0KQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeWxpa2VzKHNvY2tldCl7CiAgICAgICAgaWYoIWhhc2tleSgpKXsKICAgICAgICAgIHJldHVybiBbXQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBteXB1YmtleSA9IGF3YWl0IHB1YmtleSgpCiAgICAgICAgY29uc3QgZXZlbnRzID0gYXdhaXQgcXVlcnlldmVudHMoc29ja2V0LCBbN10sIG51bGwsIFtteXB1YmtleV0pCiAgICAgICAgcmV0dXJuIGV2ZW50cy5tYXAoZSA9PiBlLnRhZ3MuZmluZCh0ID0+IHRbMF0gPT0gImUiKVsxXSkKICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlldmVudHMoc29ja2V0LCBraW5kcywgZXZlbnRpZHMsIGF1dGhvcnMpewogICAgICAgIGNvbnN0IHF1ZXJ5aWQgPSAiZXZlbnRzXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgY29uc3QgZmlsdGVycyA9IHt9CiAgICAgICAgCiAgICAgICAgZmlsdGVycy5raW5kcyA9IGtpbmRzCiAgICAgICAgCiAgICAgICAgaWYoZXZlbnRpZHMpewogICAgICAgICAgZmlsdGVyc1siI2UiXSA9IGV2ZW50aWRzCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGF1dGhvcnMpewogICAgICAgICAgZmlsdGVyc1siYXV0aG9ycyJdID0gYXV0aG9ycwogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkoWwogICAgICAgICAgIlJFUSIsIAogICAgICAgICAgcXVlcnlpZCwgCiAgICAgICAgICBmaWx0ZXJzCiAgICAgICAgXSkKCiAgICAgICAgc29ja2V0LnNlbmQoanNvbikKICAgICAgICAKICAgICAgICByZXR1cm4gYXdhaXQgd2FpdHJlcyhxdWVyeWlkKSB8fCBbXQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeXB1YmtleShzb2NrZXQsIHB1YmspewogICAgICAgIGNvbnN0IHF1ZXJ5aWQgPSAicXVlcnlfIiArICgrK2lkY291bnRlcikKICAgICAgICBzb2NrZXQuc2VuZChxdWVyaWVzLmF1dGhvci5yZXBsYWNlKCI8ST4iLCBxdWVyeWlkKS5yZXBsYWNlKCI8UD4iLCBwdWJrKSkKCiAgICAgICAgcmV0dXJuIChhd2FpdCB3YWl0cmVzKHF1ZXJ5aWQpKQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBzYXZlKHNvY2tldCwgZXZlbnRkYiwgcSwgcXR5cGUsIHJlYWN0ZWQsIGFwcGVuZCwgcXVlcnltZXRhKXsKICAgICAgICBsZXQgZXZlbnRwdWJrZXlzID0gW10KICAgICAgICBjb25zdCBldmVudHMgPSBldmVudGRiLmZpbHRlcihvID0+IHsKICAgICAgICAgIGlmKHEubGVuZ3RoID4gMCl7CiAgICAgICAgICAgIGZvcihsZXQgd29yZCBvZiBxLnNwbGl0KCIgIikpewogICAgICAgICAgICAgIGlmKG8uY29udGVudC50b0xvd2VyQ2FzZSgpLmluZGV4T2Yod29yZC50b0xvd2VyQ2FzZSgpKSA9PSAtMSl7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2UKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm4gdHJ1ZQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgbGV0IHJlc3VsdHMgPSBbXQogICAgICAgIGNvbnN0IGV2ZW50aWRzID0gZXZlbnRzLm1hcChlID0+IGUuaWQpCiAgICAgICAgbGV0IG5ld3VybHMgPSBbXQogICAgICAgIAogICAgICAgIGZvcihsZXQgZXZlbnQgb2YgZXZlbnRzKXsKICAgICAgICAgIGxldCB1cmxzbWF0Y2ggPSBbXQogICAgICAgICAgCiAgICAgICAgICBpZihxdHlwZSAhPSAidmlkZW8iKXsKICAgICAgICAgICAgdXJsc21hdGNoLnB1c2goLi4uKGV2ZW50LmNvbnRlbnQubWF0Y2goaW1ncmVnZXgpIHx8IFtdKSkKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgaWYocXR5cGUgIT0gImltYWdlIil7CiAgICAgICAgICAgIHVybHNtYXRjaC5wdXNoKC4uLihldmVudC5jb250ZW50Lm1hdGNoKHZpZGVvcmVnZXgpIHx8IFtdKSkKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgdXJsc21hdGNoID0gdXJsc21hdGNoLmZpbHRlcih1cmwgPT4gIXVybHMuaW5jbHVkZXModXJsKSkKCiAgICAgICAgICBpZih1cmxzbWF0Y2gubGVuZ3RoID4gMCl7CiAgICAgICAgICAgIG5ld3VybHMucHVzaCh7CiAgICAgICAgICAgICAgZXZlbnQ6IGV2ZW50LAogICAgICAgICAgICAgIHVybHM6IHVybHNtYXRjaAogICAgICAgICAgICB9KQogICAgICAgICAgICAKICAgICAgICAgICAgdXJscy5wdXNoKC4uLnVybHNtYXRjaCkKICAgICAgICAgICAgZXZlbnRwdWJrZXlzLmluY2x1ZGVzKGV2ZW50LnB1YmtleSkgfHwgZXZlbnRwdWJrZXlzLnB1c2goZXZlbnQucHVia2V5KQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBsb2coInF1ZXJ5IG1ldGEiLCBzb2NrZXQudXJsKQogICAgICAgIGxldCBtZXRhZXZlbnRzID0gKHF1ZXJ5bWV0YSAmJiBhd2FpdCBxdWVyeWV2ZW50cyhzb2NrZXQsIFswXSwgbnVsbCwgZXZlbnRwdWJrZXlzKSB8fCBbXSkKICAgICAgICAKICAgICAgICBmb3IobGV0IGVudHJ5IG9mIG5ld3VybHMpewogICAgICAgICAgZm9yKGxldCB1cmwgb2YgZW50cnkudXJscyl7CiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7CiAgICAgICAgICAgICAgcmVhY3RlZDogcmVhY3RlZCB8fCBsaWtlcy5pbmNsdWRlcyhlbnRyeS5ldmVudC5pZCksIAogICAgICAgICAgICAgIHVybDogdXJsLCAKICAgICAgICAgICAgICBldmVudDogZW50cnkuZXZlbnQsIAogICAgICAgICAgICAgIGJlY2gzMmlkOiBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyhlbnRyeS5ldmVudC5pZCkpLAogICAgICAgICAgICAgIG1ldGE6IG1ldGFldmVudHMuZmluZChvID0+IG8ucHVia2V5ID09IGVudHJ5LmV2ZW50LnB1YmtleSkKICAgICAgICAgICAgfSkKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbG9nKCJzYXZlIHJlcyIsIHJlc3VsdHMubGVuZ3RoLCBzb2NrZXQudXJsKQogICAgICAgIHVwZGF0ZWNvbnRlbnQocmVzdWx0cywgcSwgYXBwZW5kKQogICAgICB9CiAgICAgIAogICAgICBsZXQgbG9hZGVkID0gMAogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlY29udGVudChyZXN1bHRzLCBxLCBhcHBlbmQpewogICAgICAgIHJlc3VsdHMucmV2ZXJzZSgpLmZvckVhY2goaXRlbSA9PiB7CiAgICAgICAgICBjb25zdCB0eXBlID0gaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleCkgJiYgInZpZGVvIiB8fCAiaW1hZ2UiCiAgICAgICAgICBjb25zdCB0ZXh0ID0gKHEgfHwgInZpZXcgbm90ZSIpLnN1YnN0cmluZygtMzApCiAgICAgICAgICBjb25zdCBpZCA9ICJpdGVtXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgICBjb25zdCBjb250ZW50ZWxlbWVudHMgPSAnPGRpdiBjbGFzcz0idHlwZSI+JyArIHFzKCIjdGVtcGxhdGUgLiIgKyB0eXBlICsgInN2ZyIpLm91dGVySFRNTCArICc8L2Rpdj48YSBjbGFzcz0ibGlrZScgKyAoaXRlbS5yZWFjdGVkID8gJyByZWFjdGVkJyA6ICcnKSArICciIGRhdGEtaXRlbS1pZD0iJyArIGlkICsgCiAgICAgICAgICAgICciIGhyZWY9IiMiPicgKyBxcygiI3RlbXBsYXRlIC5oZWFydHN2ZyIpLm91dGVySFRNTCArICc8L2E+PGEgY2xhc3M9InF1ZXJ5IiBocmVmPSInICsgcHJvdG9jb2wgKyAKICAgICAgICAgICAgaXRlbS5iZWNoMzJpZCArICciPicgKyB0ZXh0ICsgJzwvYT4nCiAgICAgICAgICBsZXQgcm9vdCA9IG51bGwKICAgICAgICAgIGxldCB2ID0gbnVsbAogICAgICAgICAgCiAgICAgICAgICBpZihpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KSl7CiAgICAgICAgICAgIHJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKQogICAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoInZpZGVvLWNvbnRhaW5lciIpCiAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MID0gY29udGVudGVsZW1lbnRzCiAgICAgICAgICAgIAogICAgICAgICAgICB2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKQogICAgICAgICAgICB2WyJkYXRhLWl0ZW0taWQiXSA9IGlkCiAgICAgICAgICAgIHYucHJlbG9hZCA9ICJub25lIgogICAgICAgICAgICB2Lmxvb3AgPSB0cnVlCiAgICAgICAgICAgIHYucGxheXNpbmxpbmUgPSAiIgogICAgICAgICAgICAKICAgICAgICAgICAgdi5vbmNhbnBsYXkgPSBhc3luYyBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICBjb25zdCBhc3BlY3QgPSB0aGlzLnZpZGVvV2lkdGggLyB0aGlzLnZpZGVvSGVpZ2h0CiAgICAgICAgICAgICAgaWYoYXNwZWN0ID4gMSl7CiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLndpZHRoID0gKGFzcGVjdCAqIDEwMCkgKyAiJSIKICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUuaGVpZ2h0ID0gKDEgLyBhc3BlY3QgKiAxMDApICsgIiUiCiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLm1hcmdpblRvcCA9IC0oKDEgLyBhc3BlY3QgKiAxMDAgLSAxMDApIC8gMikgKyAiJSIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgdXBkYXRldmlkZW9wbGF5KHRoaXMucGFyZW50RWxlbWVudCkKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29uc3QgZXh0ID0gaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleClbMV0KICAgICAgICAgICAgdi5pbm5lckhUTUwgPSAnPHNvdXJjZSBzcmM9IicgKyBpdGVtLnVybCArICciIHR5cGU9InZpZGVvLycgKyBleHQgKyAnIj48L3NvdXJjZT4nCiAgICAgICAgICAgIAogICAgICAgICAgICByb290LmFwcGVuZCh2KQogICAgICAgICAgfWVsc2UgaWYoaXRlbS51cmwubWF0Y2goaW1nZXh0cmVnZXgpKXsKICAgICAgICAgICAgcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKQogICAgICAgICAgICByb290LmhyZWYgPSAiIyIKICAgICAgICAgICAgcm9vdC5pbm5lckhUTUwgPSBjb250ZW50ZWxlbWVudHMKICAgICAgICAgICAgICAKICAgICAgICAgICAgaWYodHlwZSA9PSAiaW1hZ2UiKXsKICAgICAgICAgICAgICAvL2xldCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKQogICAgICAgICAgICAgIC8vaW1nLmFsdCA9IGl0ZW0udXJsCiAgICAgICAgICAgICAgcm9vdFsiZGF0YS1zcmMiXSA9IGl0ZW0udXJsCiAgICAgICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJpbWciKQogICAgICAgICAgICAgIC8vaW1nLmNsYXNzTGlzdC5hZGQoImRhdGEiKQogICAgICAgICAgICAgIC8vcm9vdC5hcHBlbmQoaW1nKQogICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICByb290LmlubmVySFRNTCArPSAnPHNwYW4gY2xhc3M9ImZpbGUiPicgKyBpdGVtLnVybCArICc8L3NwYW4+JwogICAgICAgICAgICB9CiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHJvb3QuaWQgPSBpZAogICAgICAgICAgcm9vdC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJwogICAgICAgICAgcm9vdFsiZGF0YS1pdGVtIl0gPSBpdGVtCiAgICAgICAgICByb290WyJkYXRhLWV2ZW50Il0gPSBpdGVtLmV2ZW50CiAgICAgICAgICByb290WyJkYXRhLXF1ZXJ5Il0gPSBxCiAgICAgICAgICByb290WyJkYXRhLXRleHQiXSA9IHRleHQKICAgICAgICAgIAogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKHR5cGUpCiAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoIml0ZW0iKQogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJzaG93IikKICAgICAgICAgIAogICAgICAgICAgaWYoaXRlbS5yZWFjdGVkKXsKICAgICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgcXMoIiNpbWFnZXMiKVthcHBlbmQgJiYgImFwcGVuZCIgfHwgInByZXBlbmQiXShyb290KQogICAgICAgICAgCiAgICAgICAgICBpZih2KXsKICAgICAgICAgICAgdXBkYXRldmlkZW9wbGF5KHJvb3QpCiAgICAgICAgICB9CiAgICAgICAgfSkKCiAgICAgICAgdXBkYXRlaW1hZ2VzbG9hZCgpCiAgICAgICAgCiAgICAgICAgaWYoYWN0aXZlKCkgPT0gbnVsbCl7CiAgICAgICAgICBxcygiI2ltYWdlcyAuaXRlbSIpPy5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGlkZW1lZGlhKCl7CiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICJzY3JvbGwiCiAgICAgICAgcXNhKCIjbWVkaWEtY29udGFpbmVyLCAjaW1hZ2UsICNtZWRpYS1mb290ZXIiKS5mb3JFYWNoKG4gPT4gbi5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiKQogICAgICAgIGdpZCgiaW1hZ2UtbGlrZSIpLmNsYXNzTGlzdC5yZW1vdmUoInJlYWN0ZWQiKQogICAgICAgIGhpZGV2aWRlbygpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGhpZGV2aWRlbygpewogICAgICAgIGNvbnN0IHYgPSBxcygiI21lZGlhLWNvbnRhaW5lciB2aWRlbyIpCiAgICAgICAgCiAgICAgICAgaWYodil7CiAgICAgICAgICB2Lm11dGVkID0gdHJ1ZQogICAgICAgICAgZ2lkKHZbImRhdGEtaXRlbS1pZCJdKS5hcHBlbmRDaGlsZCh2KQogICAgICAgICAgdXBkYXRldmlkZW9wbGF5KHYucGFyZW50RWxlbWVudCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHdhaXRyZXMoa2V5KXsKICAgICAgICBsZXQgZXZlbnRzID0gW10KICAgICAgICAKICAgICAgICBsZXQgcmVzaGFuZGxlciA9IGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7CiAgICAgICAgICB0aGlzLmhhbmRsZSA9IGZ1bmN0aW9uKHJlcyl7CiAgICAgICAgICAgIGxldCBvID0gSlNPTi5wYXJzZShyZXMuZGF0YSkKICAgICAgICAgICAgaWYob1sxXSA9PSBrZXkpewogICAgICAgICAgICAgIGlmKG9bMF0gPT0gIkVPU0UiKXsKICAgICAgICAgICAgICAgIHJlc29sdmUoZXZlbnRzKQogICAgICAgICAgICAgICAgcmVzaGFuZGxlcnMuc3BsaWNlKHJlc2hhbmRsZXJzLmluZGV4T2YodGhpcyksIDEpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGV2ZW50cy5wdXNoKG9bMl0pCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgICAKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAgICAgcmVzaGFuZGxlcnMucHVzaChuZXcgcmVzaGFuZGxlcihyZXNvbHZlLCByZWplY3QpKQogICAgICAgIH0pCiAgICAgIH0KICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBjaGVja3VwZGF0ZShzb2NrZXQpewogICAgICAgIGNvbnN0IHVwZGF0ZXNyZXMgPSBhd2FpdCBxdWVyeXB1YmtleShzb2NrZXQsIHVwZGF0ZXNwdWJrZXkpCiAgICAgICAgY29uc3QgdXBkYXRlbm90ZSA9IHVwZGF0ZXNyZXMuZmluZChuID0+IG4uY29udGVudC5tYXRjaCgvXmh0dHBzXDpcL1wvLykpCiAgICAgICAgCiAgICAgICAgaWYoIXVwZGF0ZW5vdGUpewogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGFnZSA9IE1hdGgucm91bmQoKERhdGUubm93KCkgLyAxMDAwIC0gdXBkYXRlbm90ZS5jcmVhdGVkX2F0KSAvIDM2MDAgLyAyNCkKICAgICAgICBjb25zdCBub3RlaWQgPSBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyh1cGRhdGVub3RlLmlkKSkKICAgICAgICBxcygiI3JlbGVhc2UiKS5ocmVmID0gcHJvdG9jb2wgKyBub3RlaWQKICAgICAgICBxcygiI3JlbGVhc2UiKS5pbm5lclRleHQgPSAoYWdlID09IDAgJiYgInRvZGF5IiB8fCBhZ2UgKyAiIGRheShzKSBhZ28iKQogICAgICB9CgogICAgICBmdW5jdGlvbiBzbGVlcChtcyl7CiAgICAgICAgcmV0dXJuIG5ldyBmdW5jdGlvbigpewogICAgICAgICAgbGV0IHRpbWVvdXQgPSBudWxsCiAgICAgICAgICBsZXQgciA9IG51bGwKICAgICAgICAgIAogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcHJvbWlzZTogbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXsKICAgICAgICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIG1zKQogICAgICAgICAgICAgIHIgPSByZXNvbHZlCiAgICAgICAgICAgIH0pLAogICAgICAgICAgICByZXNvbHZlOiBmdW5jdGlvbigpewogICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KQogICAgICAgICAgICAgIHIoKQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzaG93KGlkKXsKICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiIKICAgICAgICBjb25zdCBpdGVtID0gZ2lkKGlkKVsiZGF0YS1pdGVtIl0KICAgICAgICBjb25zdCBtZWRpYSA9IGdpZCgibWVkaWEtY29udGFpbmVyIikKICAgICAgICBjb25zdCBpbWFnZSA9IGdpZCgiaW1hZ2UiKQoKICAgICAgICBpZihpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KSl7CiAgICAgICAgICBpbWFnZS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiCiAgICAgICAgICBjb25zdCB2ID0gZ2lkKGlkKS5xdWVyeVNlbGVjdG9yKCJ2aWRlbyIpCiAgICAgICAgICBxcygiI21lZGlhLWNvbnRhaW5lciIpLmFwcGVuZENoaWxkKHYpCiAgICAgICAgICB2Lm11dGVkID0gZmFsc2UKICAgICAgICAgIHYucGxheSgpCiAgICAgICAgfWVsc2V7CiAgICAgICAgICBpbWFnZS5zcmMgPSBpdGVtLnVybAogICAgICAgICAgaW1hZ2Uuc3R5bGUuZGlzcGxheSA9ICJibG9jayIKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoaXRlbS5tZXRhKXsKICAgICAgICAgIGNvbnN0IG1ldGFjb250ZW50ID0gSlNPTi5wYXJzZShpdGVtLm1ldGEuY29udGVudCkKICAgICAgICAgIGNvbnN0IG5hbWUgPSBtZXRhY29udGVudC5kaXNwbGF5X25hbWUgfHwgbWV0YWNvbnRlbnQubmFtZQogICAgICAgICAgcXMoIiNpbWFnZS11c2VyIikuc3R5bGUuZGlzcGxheSA9ICJibG9jayIKICAgICAgICAgIHFzKCIjaW1hZ2UtdXNlciIpLmhyZWYgPSBwcm90b2NvbCArIGJlY2gzMi5lbmNvZGUoIm5wdWIiLCBmcm9tSGV4U3RyaW5nKGl0ZW0ubWV0YS5wdWJrZXkpKQogICAgICAgICAgcXMoIiNpbWFnZS11c2VyIikuaW5uZXJUZXh0ID0gbmFtZQogICAgICAgIH1lbHNlewogICAgICAgICAgcXMoIiNpbWFnZS11c2VyIikuc3R5bGUuZGlzcGxheSA9ICJub25lIgogICAgICAgIH0KCiAgICAgICAgZ2lkKCJpbWFnZS1saWtlIilbImRhdGEtaXRlbS1pZCJdID0gaWQKICAgICAgICBnaWQoIm1lZGlhLWZvb3RlciIpWyJkYXRhLWV2ZW50Il0gPSBpdGVtLmV2ZW50CgogICAgICAgIGlmKGl0ZW0ucmVhY3RlZCl7CiAgICAgICAgICBnaWQoImltYWdlLWxpa2UiKS5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgYSA9IHFzKCIjaW1hZ2UtcXVlcnkiKQogICAgICAgIGEuaHJlZiA9IHByb3RvY29sICsgaXRlbS5iZWNoMzJpZAogICAgICAgIGEuaW5uZXJUZXh0ID0gZ2lkKGlkKVsiZGF0YS10ZXh0Il0KICAgICAgICAgIAogICAgICAgIG1lZGlhLnN0eWxlLmRpc3BsYXkgPSBnaWQoIm1lZGlhLWZvb3RlciIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGNvbm5jb3VudCgpewogICAgICAgIHJldHVybiBzb2NrZXRzLmZpbHRlcihyID0+IHIucmVhZHlTdGF0ZSA9PSAxKS5sZW5ndGgKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gZGlzY29ubmVjdCgpewogICAgICAgIGZvcihsZXQgc29ja2V0IG9mIHNvY2tldHMpewogICAgICAgICAgc29ja2V0LmNsb3NlKCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc29ja2V0cy5zcGxpY2UoMCkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gbG9nKG1zZyl7CiAgICAgICAgbGV0IHNjcm9sbCA9IHFzKCIjbG9ncyIpLnNjcm9sbFRvcCA9PSBxcygiI2xvZ3MiKS5zY3JvbGxUb3BNYXgKICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKQogICAgICAgIGRpdi5pbm5lclRleHQgPSBBcnJheS5mcm9tKGFyZ3VtZW50cykuam9pbigiICIpCiAgICAgICAgcXMoIiNsb2dzIikuYXBwZW5kKGRpdikKICAgICAgICAKICAgICAgICBzY3JvbGwgJiYgcXMoIiNsb2dzIikuc2Nyb2xsVG8oMCwgcXMoIiNsb2dzIikuc2Nyb2xsVG9wTWF4KQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBjb25uZWN0KHVybCl7CiAgICAgICAgbG9nKCJjb25uZWN0aW5nIiwgdXJsKQogICAgICAgIGxldCBzb2NrZXQgPSBuZXcgV2ViU29ja2V0KHVybCkKICAgICAgICAKICAgICAgICBzb2NrZXQub25tZXNzYWdlID0gbWVzc2FnZSA9PiByZXNoYW5kbGVycy5mb3JFYWNoKHJoID0+IHJoLmhhbmRsZShtZXNzYWdlKSkKICAgICAgICAKICAgICAgICBzb2NrZXQub25jbG9zZSA9IGFzeW5jIGZ1bmN0aW9uKCl7CiAgICAgICAgICBzb2NrZXRzLnNwbGljZShzb2NrZXRzLmluZGV4T2Yoc29ja2V0KSwgMSkKICAgICAgICAgIHFzKCIjY29ubmNvdW50IikuaW5uZXJUZXh0ID0gY29ubmNvdW50KCkgKyAocHJpbWFsc29ja2V0ICYmIDEpCiAgICAgICAgICBsb2coImRpc2Nvbm5lY3RlZCIsIHRoaXMudXJsLCBjb25uY291bnQoKSkKICAgICAgICAgIGF3YWl0IHNsZWVwKDEwMDApLnByb21pc2UKICAgICAgICAgIGNvbm5lY3QodGhpcy51cmwpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHNvY2tldC5vbm9wZW4gPSBmdW5jdGlvbigpewogICAgICAgICAgcXMoIiNjb25uY291bnQiKS5pbm5lclRleHQgPSBjb25uY291bnQoKSArIChwcmltYWxzb2NrZXQgJiYgMSkKICAgICAgICAgIGxvZygiY29ubmVjdGVkIiwgdGhpcy51cmwsIGNvbm5jb3VudCgpKQogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4gc29ja2V0CiAgICAgIH0KICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLCBhc3luYyAoKSA9PiB7CiAgICAgICAgcHJpbWFsc29ja2V0ID0gY29ubmVjdCgid3NzOi8vY2FjaGUzLnByaW1hbC5uZXQvY2FjaGUxNyIpCiAgICAgICAgcHJpbWFsc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoIm9wZW4iLCBmdW5jdGlvbigpewogICAgICAgICAgcHJpbWFsZ2xvYmFsKHRoaXMpCiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBwcmltYWxzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xvc2UiLCBmdW5jdGlvbigpewogICAgICAgICAgcHJpbWFsc29ja2V0ID0gbnVsbAogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgZm9yKGxldCB1cmwgb2YgcmVsYXlzKCkpewogICAgICAgICAgY29uc3Qgc29ja2V0ID0gY29ubmVjdCh1cmwpCiAgICAgICAgICBzb2NrZXRzLnB1c2goc29ja2V0KQogICAgICAgICAgCiAgICAgICAgICBzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcigib3BlbiIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIGNoZWNrdXBkYXRlKHRoaXMpCiAgICAgICAgICAgIHF1ZXJ5KHRoaXMpCiAgICAgICAgICB9KQogICAgICAgIH0KICAgICAgICAKICAgICAgICBhd2FpdCBzbGVlcCgxMDApLnByb21pc2UKICAgICAgICAKICAgICAgICBpZihoYXNrZXkoKSl7CiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoIm5vc3RyIikKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBmb3IobGV0IGMgb2YgY29sb3B0cyl7CiAgICAgICAgZG9jdW1lbnQud3JpdGUoJzxzdHlsZT4nICsgY29sc2Nzcy5pbm5lclRleHQucmVwbGFjZSgvXCRce2NvbHNcfS9nLCBjKSArICc8L3N0eWxlPicpCiAgICAgIH0KICAgIDwvc2NyaXB0PgogIDwvYm9keT4KPC9odG1sPgo=
https://ipfs.io/ipfs/QmNziUrRZcLyU9VBom9CGjy6pQ6MhCfqrVTwzBqirtQxMy
sha256
4b003e02008182ffbf3f0bdec26912f2f55a8b7522a72206f91cbd224fb2d524 files.html
base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyIvPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL3N2Z2ljb25zLnNwYXJray5mci9zdmdpY29ucy5jc3MiLz4KICAgIDxzdHlsZT4KICAgICAgKiB7CiAgICAgICAgb3ZlcnNjcm9sbC1iZWhhdmlvci15OiBjb250YWluOwogICAgICB9CiAgICAgIAogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksIAogICAgICAjaGVhZGVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncywgCiAgICAgICNwcml2a2V5IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncyB7CiAgICAgICAgaGVpZ2h0OiA2ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNsb2dzIHsKICAgICAgICBoZWlnaHQ6IDhlbTsKICAgICAgICBvdmVyZmxvdzogc2Nyb2xsOwogICAgICAgIGZvbnQtc2l6ZTogLjhlbTsKICAgICAgfQogICAgICAKICAgICAgc2VsZWN0IHsKICAgICAgICB3aWR0aDogNGVtOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLCAKICAgICAgaW5wdXQuc3VibWl0IHsKICAgICAgICBib3JkZXItcmFkaXVzOiAuNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0LCAKICAgICAgI2hlYWRlciBhLAogICAgICAjbWVkaWEtY29udGFpbmVyIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLCAKICAgICAgZm9ybSwgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHotaW5kZXg6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgIAogICAgICBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDMwZW0pIHsKICAgICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgfQogICAgICB9CgogICAgICBmb3JtIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeSB7CiAgICAgICAgd2lkdGg6IDZlbTsKICAgICAgfQogICAgICAKICAgICAgI2xvYWRpbmcgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMHB4OwogICAgICAgIGxlZnQ6IDI3ZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgIGEgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgfQoKICAgICAgdmlkZW8gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogIAogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgIGhlaWdodDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgIG1hcmdpbi10b3A6IDAgIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgLnR5cGUgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICB6LWluZGV4OiAxOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2UtcXVlcnkgewogICAgICAgIHdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksCiAgICAgIGEsCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICB9CgogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbWluLXdpZHRoOiAzZW07CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLAogICAgICAjaGVhZGVyIHNwYW4gewogICAgICAgIHBhZGRpbmc6IDAuNWVtOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CgogICAgICAjaGVhZGVyIHsKICAgICAgICBwYWRkaW5nOiAwLjQ1ZW0gMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAjaGVhZGVyIC5pdGVtcyB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgLml0ZW1zIHsKICAgICAgICBtYXJnaW4tdG9wOiAuM2VtOwogICAgICB9CgogICAgICBwIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICAubGFiZWwgewogICAgICAgIHBhZGRpbmc6IC44ZW0gLjhlbSAuOGVtIDA7CiAgICAgIH0KCiAgICAgICNpbWFnZXMgLnF1ZXJ5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KCiAgICAgICNtZWRpYS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwKTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlIHsKICAgICAgICBtYXgtd2lkdGg6IDEwMHZ3OwogICAgICAgIG1heC1oZWlnaHQ6IDEwMHZoOwogICAgICB9CiAgICAgICAgCiAgICAgICNpbWFnZXMgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZXMgLml0ZW0gewogICAgICAgIHdpZHRoOiAyNXZ3OwogICAgICB9CgogICAgICAjaW1hZ2VzIC5pdGVtIHsKICAgICAgICBoZWlnaHQ6IDI1dnc7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBib3JkZXI6IDAuM2VtIHNvbGlkIHRyYW5zcGFyZW50OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDAuM2VtOwogICAgICAgIG1hcmdpbjogLTAuM2VtOwogICAgICB9CgogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CiAgICAgIAogICAgICBib2R5Om5vdCgubm9zdHIpICNmaWx0ZXItbGlrZXMsIAogICAgICAuZmlsdGVyLWxpa2VzICNpbWFnZXMgPiAuaXRlbTpub3QoLnJlYWN0ZWQpIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlLCAKICAgICAgI2ltYWdlLXF1ZXJ5LAogICAgICAjaW1hZ2UtdXNlciB7CiAgICAgICAgei1pbmRleDogMjsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3Z3OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHBhZGRpbmc6IDAgMXZ3OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSwgCiAgICAgIC52aWRlb3N2ZywKICAgICAgLmltYWdlc3ZnIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLDAuNik7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlLCAKICAgICAgI2ltYWdlLXF1ZXJ5IHsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgZm9udC1zaXplOiBtaW4oMy41dncsIDEuNWVtKTsKICAgICAgICBtYXgtd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlLXF1ZXJ5IHsKICAgICAgICBwYWRkaW5nOiAuNmVtIC40ZW0gLjFlbSAuNGVtOwogICAgICAgIG1heC13aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICAubGlrZS5yZWFjdGVkLAogICAgICAuZmlsdGVyLWxpa2VzICNmaWx0ZXItbGlrZXMgewogICAgICAgIGJhY2tncm91bmQ6IHJlZDsKICAgICAgfQoKICAgICAgI2ltYWdlLXF1ZXJ5LAogICAgICAjaW1hZ2UtdXNlciB7CiAgICAgICAgZm9udC1zaXplOiAzZW07CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIsCiAgICAgICNtZWRpYS1mb290ZXIgLmxpa2UgewogICAgICAgIHotaW5kZXg6IDU7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2UtcXVlcnksCiAgICAgICNpbWFnZS11c2VyIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIGJvdHRvbTogMS45ZW07CiAgICAgICAgZm9udC1zaXplOiAxLjhlbTsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAuNjVlbTsKICAgICAgICBtYXgtd2lkdGg6IDhlbTsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgfQogICAgICAKICAgICAgLmxpa2UgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogYXV0bzsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIHdpZHRoOiAxZW07CiAgICAgICAgaGVpZ2h0OiAxZW07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgfQoKICAgICAgLm5vc3RyIC5saWtlIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsgIAogICAgICB9CgogICAgICAjbWVkaWEtZm9vdGVyIC5saWtlIHsKICAgICAgICBmb250LXNpemU6IDIuNGVtOwogICAgICB9CgogICAgICAjbWVkaWEtZm9vdGVyIHsKICAgICAgICBkaXNwbGF5OiBub25lOyAgCiAgICAgIH0KICAKICAgICAgI2ltYWdlcyAuaW1nIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgYmFja2dyb3VuZC1zaXplOiBjb3ZlcjsKICAgICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwogICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgLmFjdGl2ZSB7CiAgICAgICAgYmFja2dyb3VuZDogIzQ0NDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlcyA+IC5hY3RpdmUgewogICAgICAgIGJvcmRlci1jb2xvcjogZ3JlZW47CiAgICAgICAgei1pbmRleDogMTsKICAgICAgfQoKICAgICAgLmhlYXJ0c3ZnIHBhdGggewogICAgICAgIHN0cm9rZTogI2ZmZjsKICAgICAgfQogIAogICAgICAudmlkZW9zdmcsCiAgICAgIC5pbWFnZXN2ZyB7CiAgICAgICAgd2lkdGg6IDR2dzsKICAgICAgICBoZWlnaHQ6IDR2dzsKICAgICAgICBwYWRkaW5nOiAwIC4yZW07CiAgICAgIH0KICAgICAgCiAgICAgIC52aWRlb3N2ZyBwYXRoLAogICAgICAuaW1hZ2VzdmcgcGF0aCB7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgYSNtZW51LCBhI2ZpbHRlci1saWtlcyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luLXRvcDogLS4zZW07CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgfQoKICAgICAgYSNtZW51IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBwYWRkaW5nOiAwIC4zZW0gMCAuNWVtOwogICAgICAgIGhlaWdodDogMi4xZW07CiAgICAgIH0KICAgICAgCiAgICAgIGEjZmlsdGVyLWxpa2VzIHsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB3aWR0aDogMS41ZW07CiAgICAgICAgaGVpZ2h0OiAxLjVlbTsKICAgICAgICBtYXJnaW46IC4xZW0gLjVlbTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgIH0KICAgICAgCiAgICAgIGEjZmlsdGVyLWxpa2VzIHN2ZyB7CiAgICAgICAgd2lkdGg6IDEuNWVtOwogICAgICAgIGhlaWdodDogMS41ZW07CiAgICAgIH0KICAgICAgIAogICAgICAubWVudXN2ZyB7CiAgICAgICAgd2lkdGg6IDJlbTsKICAgICAgICBoZWlnaHQ6IDJlbTsKICAgICAgfQoKICAgICAgLm1lbnVzdmcgcGF0aCB7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBtYXJnaW4tbGVmdDogLTE4ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzIyMjsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgei1pbmRleDogMzsgCiAgICAgICAgb3ZlcmZsb3c6IHNjcm9sbDsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudC5vcGVuIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgewogICAgICAgIHBhZGRpbmc6IDAgMWVtIDFlbSAxZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIGEsCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgcGFkZGluZzogLjVlbSAuN2VtOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHotaW5kZXg6IDM7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIG9wYWNpdHk6IC41OwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5Lm9wZW4gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIAogICAgICBzdmcgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAjdGVtcGxhdGUgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGRpdiBpZD0idGVtcGxhdGUiPgogICAgICA8c3ZnIGNsYXNzPSJoZWFydHN2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KICAgICAgICA8cGF0aCBkPSJNOS43MTksMTcuMDczbC02LjU2Mi02LjUxYy0wLjI3LTAuMjY4LTAuNTA0LTAuNTY3LTAuNjk2LTAuODg4QzEuMzg1LDcuODksMS42Nyw1LjYxMywzLjE1NSw0LjE0YzAuODY0LTAuODU2LDIuMDEyLTEuMzI5LDMuMjMzLTEuMzI5YzEuOTI0LDAsMy4xMTUsMS4xMiwzLjYxMiwxLjc1MmMwLjQ5OS0wLjYzNCwxLjY4OS0xLjc1MiwzLjYxMi0xLjc1MmMxLjIyMSwwLDIuMzY5LDAuNDcyLDMuMjMzLDEuMzI5YzEuNDg0LDEuNDczLDEuNzcxLDMuNzUsMC42OTMsNS41MzdjLTAuMTksMC4zMi0wLjQyNSwwLjYxOC0wLjY5NSwwLjg4N2wtNi41NjIsNi41MUMxMC4xMjUsMTcuMjI5LDkuODc1LDE3LjIyOSw5LjcxOSwxNy4wNzMgTTYuMzg4LDMuNjFDNS4zNzksMy42MSw0LjQzMSw0LDMuNzE3LDQuNzA3QzIuNDk1LDUuOTIsMi4yNTksNy43OTQsMy4xNDUsOS4yNjVjMC4xNTgsMC4yNjUsMC4zNTEsMC41MSwwLjU3NCwwLjczMUwxMCwxNi4yMjhsNi4yODEtNi4yMzJjMC4yMjQtMC4yMjEsMC40MTYtMC40NjYsMC41NzMtMC43MjljMC44ODctMS40NzIsMC42NTEtMy4zNDYtMC41NzEtNC41NkMxNS41Nyw0LDE0LjYyMSwzLjYxLDEzLjYxMiwzLjYxYy0xLjQzLDAtMi42MzksMC43ODYtMy4yNjgsMS44NjNjLTAuMTU0LDAuMjY0LTAuNTM2LDAuMjY0LTAuNjksMEM5LjAyOSw0LjM5Nyw3LjgyLDMuNjEsNi4zODgsMy42MSI+PC9wYXRoPgogICAgICA8L3N2Zz4KICAgICAgPHN2ZyBjbGFzcz0idmlkZW9zdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJCQk8cGF0aCBkPSJNMTguMTc1LDQuMTQySDEuOTUxQzEuNzAzLDQuMTQyLDEuNSw0LjM0NCwxLjUsNC41OTJ2MTAuODE2YzAsMC4yNDcsMC4yMDMsMC40NSwwLjQ1MSwwLjQ1aDE2LjIyNGMwLjI0NywwLDAuNDUtMC4yMDMsMC40NS0wLjQ1VjQuNTkyQzE4LjYyNSw0LjM0NCwxOC40MjIsNC4xNDIsMTguMTc1LDQuMTQyIE00LjY1NSwxNC45NTdIMi40MDF2LTEuODAzaDIuMjUzVjE0Ljk1N3pNNC42NTUsMTIuMjU0SDIuNDAxdi0xLjgwM2gyLjI1M1YxMi4yNTR6IE00LjY1NSw5LjU0OUgyLjQwMVY3Ljc0N2gyLjI1M1Y5LjU0OXogTTQuNjU1LDYuODQ2SDIuNDAxVjUuMDQzaDIuMjUzVjYuODQ2ek0xNC41NjksMTQuOTU3SDUuNTU2VjUuMDQzaDkuMDEzVjE0Ljk1N3ogTTE3LjcyNCwxNC45NTdoLTIuMjUzdi0xLjgwM2gyLjI1M1YxNC45NTd6IE0xNy43MjQsMTIuMjU0aC0yLjI1M3YtMS44MDNoMi4yNTNWMTIuMjU0ek0xNy43MjQsOS41NDloLTIuMjUzVjcuNzQ3aDIuMjUzVjkuNTQ5eiBNMTcuNzI0LDYuODQ2aC0yLjI1M1Y1LjA0M2gyLjI1M1Y2Ljg0NnoiPjwvcGF0aD4KCQkJPC9zdmc+CgkJCTxzdmcgY2xhc3M9ImltYWdlc3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgoJCQkJPHBhdGggZD0iTTE4LjU1NSwxNS4zNTRWNC41OTJjMC0wLjI0OC0wLjIwMi0wLjQ1MS0wLjQ1LTAuNDUxSDEuODg4Yy0wLjI0OCwwLTAuNDUxLDAuMjAzLTAuNDUxLDAuNDUxdjEwLjgwOGMwLDAuNTU5LDAuNzUxLDAuNDUxLDAuNDUxLDAuNDUxaDE2LjIxN2gwLjAwNUMxOC43OTMsMTUuODUxLDE4LjQ3OCwxNC44MTQsMTguNTU1LDE1LjM1NCBNMi44LDE0Ljk0OWw0Ljk0NC02LjQ2NGw0LjE0NCw1LjQxOWMwLjAwMywwLjAwMywwLjAwMywwLjAwMywwLjAwMywwLjAwNWwwLjc5NywxLjA0SDIuOHogTTEzLjgyMiwxNC45NDlsLTEuMDA2LTEuMzE3bDEuNjg5LTIuMjE4bDIuNjg4LDMuNTM1SDEzLjgyMnogTTE3LjY1NCwxNC4wNjRsLTIuNzkxLTMuNjY2Yy0wLjE4MS0wLjIzNy0wLjUzNS0wLjIzNy0wLjcxNiwwbC0xLjg5OSwyLjQ5M2wtNC4xNDYtNS40MmMtMC4xOC0wLjIzNy0wLjUzNi0wLjIzNy0wLjcxNiwwbC01LjA0Nyw2LjU5OFY1LjA0MmgxNS4zMTZWMTQuMDY0eiBNMTIuNDc0LDYuMzkzYy0wLjg2OSwwLTEuNTc3LDAuNzA3LTEuNTc3LDEuNTc2czAuNzA4LDEuNTc2LDEuNTc3LDEuNTc2czEuNTc3LTAuNzA3LDEuNTc3LTEuNTc2UzEzLjM0Myw2LjM5MywxMi40NzQsNi4zOTMgTTEyLjQ3NCw4LjY0NWMtMC4zNzEsMC0wLjY3Ni0wLjMwNC0wLjY3Ni0wLjY3NnMwLjMwNS0wLjY3NiwwLjY3Ni0wLjY3NmMwLjM3MiwwLDAuNjc2LDAuMzA0LDAuNjc2LDAuNjc2UzEyLjg0Niw4LjY0NSwxMi40NzQsOC42NDUiPjwvcGF0aD4KCQkJPC9zdmc+CiAgICAgIDxkaXYgaWQ9ImNvbHNjc3MiPgogICAgICAuY29scyR7Y29sc30gI2ltYWdlcyAuaXRlbSB7CiAgICAgICAgd2lkdGg6IGNhbGMoMTAwdncgLyAke2NvbHN9KTsKICAgICAgfQoKICAgICAgLmNvbHMke2NvbHN9ICNpbWFnZXMgLml0ZW0gewogICAgICAgIGhlaWdodDogY2FsYygxMDB2dyAvICR7Y29sc30pOwogICAgICB9CiAgICAgIAogICAgICAuY29scyR7Y29sc30gLnF1ZXJ5LAogICAgICAuY29scyR7Y29sc30gLmxpa2UgewogICAgICAgIGZvbnQtc2l6ZTogbWluKDE0dncgKiAoMSAvICR7Y29sc30pLCA2ZW0gKiAoMSAvICR7Y29sc30pKQogICAgICB9CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJtZWRpYS1mb290ZXIiPgogICAgICA8YSBpZD0iaW1hZ2UtbGlrZSIgY2xhc3M9Imxpa2UiIGhyZWY9IiMiPjwvYT4KICAgICAgPGEgaWQ9ImltYWdlLXF1ZXJ5IiBocmVmPSIjIj48L2E+CiAgICAgIDxhIGlkPSJpbWFnZS11c2VyIiBocmVmPSIjIj48L2E+CiAgICA8L2Rpdj4KICAgIDxjZW50ZXIgaWQ9Im1lZGlhLWNvbnRhaW5lciI+CiAgICAgIDxkaXYgaWQ9ImltYWdlLWNvbnRhaW5lciI+CiAgICAgICAgPGltZyBpZD0iaW1hZ2UiLz4KICAgICAgPC9kaXY+CiAgICA8L2NlbnRlcj4KICAgIDxkaXYgaWQ9Im1lbnUtb3ZlcmxheSI+PC9kaXY+CiAgICA8ZGl2IGlkPSJtZW51LWNvbnRlbnQiIGNsYXNzPSJ0ZXN0Ij4KICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5hdXRvcGxheTwvZGl2PgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0ib24iIGhyZWY9IiMiPm9uPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0ib2ZmIiBocmVmPSIjIj5vZmY8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJob3ZlciIgaHJlZj0iIyI+bW91c2VvdmVyPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5jb2x1bW5zPC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMSIgaHJlZj0iIyI+MTwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSIyIiBocmVmPSIjIj4yPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjQiIGhyZWY9IiMiPjQ8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iNiIgaHJlZj0iIyI+NjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSIxMCIgaHJlZj0iIyI+MTA8L2E+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmNvbm5lY3Rpb25zPC9kaXY+CiAgICAgICAgPGRpdiBpZD0iY29ubmNvdW50Ij4wPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPnJlbGF5czo8L2Rpdj4KICAgICAgICA8cD5QbGVhc2UgdXNlIHJlbGF5cyB3aXRoIE5JUC01MCAoc2VhcmNoKSBmdW5jdGlvbmFsaXR5PC9wPgogICAgICAgIDxmb3JtIGFjdGlvbj0iIyIgaWQ9InJlbGF5cy1mb3JtIj4KICAgICAgICAgIDx0ZXh0YXJlYSBpZD0icmVsYXlzIj48L3RleHRhcmVhPgogICAgICAgICAgPGlucHV0IGNsYXNzPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9InNhdmUgcmVsYXlzIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5wcml2YXRlIGtleTo8L2Rpdj4KICAgICAgICA8cD5JZiB5b3UgY2FudCB1c2UgYnJvd3NlciBhZGRvbiAobW9iaWxlKTwvcD4KICAgICAgICA8Zm9ybSBhY3Rpb249IiMiIGlkPSJwcml2a2V5LWZvcm0iPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJwcml2a2V5Ii8+CiAgICAgICAgICA8aW5wdXQgY2xhc3M9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0ic2F2ZSBrZXkiLz4KICAgICAgICA8L2Zvcm0+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmxvZ3M8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJsb2dzIj48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+bGF0ZXN0IHJlbGVhc2U6PC9kaXY+CiAgICAgICAgPGEgaWQ9InJlbGVhc2UiIGhyZWY9IiMiPjwvYT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9ImhlYWRlciI+CiAgICAgIDxhIGlkPSJmaWx0ZXItbGlrZXMiIGhyZWY9IiMiPjwvYT4KICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxhIGlkPSJtZW51IiBocmVmPSIjIj4KICAgICAgICAgIDxzdmcgY2xhc3M9Im1lbnVzdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJICAgICAgICA8cGF0aCBkPSJNMTAsMS40NDVjLTQuNzI2LDAtOC41NTUsMy44MjktOC41NTUsOC41NTVjMCw0LjcyNSwzLjgyOSw4LjU1NSw4LjU1NSw4LjU1NWM0LjcyNSwwLDguNTU1LTMuODMsOC41NTUtOC41NTVDMTguNTU1LDUuMjc0LDE0LjcyNSwxLjQ0NSwxMCwxLjQ0NSBNMTAsMTcuNjU0Yy00LjIyMSwwLTcuNjU0LTMuNDM0LTcuNjU0LTcuNjU0YzAtNC4yMjEsMy40MzMtNy42NTQsNy42NTQtNy42NTRjNC4yMjIsMCw3LjY1NCwzLjQzMyw3LjY1NCw3LjY1NEMxNy42NTQsMTQuMjIxLDE0LjIyMiwxNy42NTQsMTAsMTcuNjU0IE0xNC4zOSwxMGMwLDAuMjQ4LTAuMjAzLDAuNDUtMC40NSwwLjQ1SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMy0wLjQ1LTAuNDVzMC4yMDMtMC40NSwwLjQ1LTAuNDVoNy44NzlDMTQuMTg3LDkuNTUsMTQuMzksOS43NTIsMTQuMzksMTAgTTE0LjM5LDEyLjcwMmMwLDAuMjQ3LTAuMjAzLDAuNDQ5LTAuNDUsMC40NDlINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAyLTAuNDUtMC40NDljMC0wLjI0OCwwLjIwMy0wLjQ1MSwwLjQ1LTAuNDUxaDcuODc5QzE0LjE4NywxMi4yNTEsMTQuMzksMTIuNDU0LDE0LjM5LDEyLjcwMiBNMTQuMzksNy4yOThjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw2Ljg0OCwxNC4zOSw3LjA1MSwxNC4zOSw3LjI5OCI+PC9wYXRoPgoJICAgICAgICA8L3N2Zz4KICAgICAgICA8L2E+CiAgICAgICAgPGEgaWQ9InRpdGxlIiBocmVmPSIjIj5maWxlcy5odG1sPC9hPgogICAgICAgIDxmb3JtIGlkPSJxdWVyeS1mb3JtIiBhY3Rpb249IiMiPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJxdWVyeSIgbmFtZT0icXVlcnkiIGlkPSIiIC8+CiAgICAgICAgICA8c2VsZWN0IGlkPSJxdWVyeS10eXBlIj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iYWxsIj5hbGw8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaW1hZ2UiPmltYWdlczwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ2aWRlbyI+dmlkZW9zPC9vcHRpb24+CiAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgIDxpbnB1dCBpZD0iZ28iIHR5cGU9InN1Ym1pdCIgdmFsdWU9ImdvIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxzcGFuIGlkPSJxdWVyeWRpc3BsYXkiPgogICAgICAgICAgPHNwYW4gY2xhc3M9InRleHQiPjwvc3Bhbj4KICAgICAgICA8L3NwYW4+CiAgICAgICAgPGRpdiBpZD0ibG9hZGluZyI+dXBkYXRpbmc8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9ImltYWdlcyI+PC9kaXY+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly91bnBrZy5jb20vbm9zdHItdG9vbHMvbGliL25vc3RyLmJ1bmRsZS5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9zbG93bGkuZ2l0aHViLmlvL2JlY2gzMi1idWZmZXIvYXNzZXRzL2pzL2JlY2gzMi1idWZmZXIubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQ+CiAgICAgIGNvbnN0IHVwZGF0ZXNwdWJrZXkgPSAiYWU1YzZlMGI3NDY2MGQyMTk0YzgyNTRiNWMyYzgyNTY3NjU3NmJlMDI5NzM3OWZhMjA1MjMxMTRhNmE4NWU4NyIKICAgICAgY29uc3QgcXVlcmllcyA9IHsKICAgICAgICAiZ2xvYmFsIjogJ1siUkVRIiwiPEk+Iix7ImNhY2hlIjpbImV4cGxvcmUiLHsidGltZWZyYW1lIjoibGF0ZXN0Iiwic2NvcGUiOiJnbG9iYWwiLCJsaW1pdCI6PEw+fV19XScsIAogICAgICAgICJhdXRob3IiOiAnWyJSRVEiLCI8ST4iLHsia2luZHMiOlsxXSwiYXV0aG9ycyI6WyI8UD4iXX1dJywKICAgICAgICAicmVhY3Rpb25zIjogJ1siUkVRIiwiPEk+IiwgeyJraW5kcyI6WzddLCIjZSI6IDxFPn1dJwogICAgICB9CiAgICAgIHFzKCIjcmVsYXlzIikudmFsdWUgPSByZWxheXMoKS5qb2luKCJcbiIpCiAgICAgIHFzKCIjcHJpdmtleSIpLnZhbHVlID0gcHJpdmtleSgpCiAgICAgIGNvbnN0IGNvbG9wdHMgPSBbMSwgMiwgNCwgNiwgMTBdCgogICAgICBjb2xzID0gKCkgPT4gcGFyc2VJbnQoc2V0dGluZygiY29scyIsIGNvbG9wdHNbMV0pLCAxMCkKICAgICAgYXV0b3BsYXkgPSAoKSA9PiBzZXR0aW5nKCJhdXRvcGxheSIsICJvZmYiKQogICAgICBsaW1pdCA9ICgpID0+IHBhcnNlSW50KHNldHRpbmcoImxpbWl0IiwgMTUpLCAxMCkKICAgICAgCiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgiY29scyIgKyBjb2xzKCkpCiAgICAgIAogICAgICBsZXQgcHJvdG9jb2wgPSBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvKSA/ICJub3N0cjoiIDogIndlYitub3N0cjoiCiAgICAgIGxldCBzb2NrZXRzID0gW10KICAgICAgbGV0IHJlc2hhbmRsZXJzID0gW10KICAgICAgbGV0IHVybHMgPSBbXQogICAgICBsZXQgbGlrZXMgPSBbXQogICAgICBsZXQgbmV3bGlrZXMgPSBbXQogICAgICBsZXQgaWRjb3VudGVyID0gMAogICAgICBsZXQgcXVlcnl3YWl0ID0gbnVsbAogICAgICBsZXQgcHJpbWFsc29ja2V0ID0gbnVsbAogICAgICBsZXQgdHlwZXMgPSB7CiAgICAgICAgaW1hZ2U6IFsicG5nIiwgImpwZyIsICJqcGVnIiwgIndlYnAiXSwKICAgICAgICB2aWRlbzogWyJtcDQiLCAid2VibSJdCiAgICAgIH0KICAgICAgbGV0IGltZ3JlZ2V4ID0gL2h0dHAofHMpXDpcL1wvW14gXG5dKj9cLihwbmd8anBnfGpwZWd8d2VicCkvZ2kKICAgICAgbGV0IHZpZGVvcmVnZXggPSAvaHR0cCh8cylcOlwvXC9bXiBcbl0qP1wuKG1wNHx3ZWJtKS9naQogICAgICBsZXQgdmlkZW9leHRyZWdleCA9IC9cLihtcDR8d2VibSkkL2kKICAgICAgbGV0IGltZ2V4dHJlZ2V4ID0gL1wuKHBuZ3xqcGd8anBlZ3x3ZWJwKSQvaQogICAgICB3YWl0bXMgPSA1MDAwCiAgICAgIHF1ZXJ5c3RyID0gIiIKICAgICAgbGV0IHF1ZXJ5Y291bnQgPSAwCiAgICAgIGxldCBob3ZlcmVkdmlkZW8gPSBudWxsCiAgICAgIAogICAgICB1cGRhdGVxdWVyeSgpCiAgICAgIHFzKCIjaW1hZ2UtbGlrZSIpLmlubmVySFRNTCA9IHFzKCIjZmlsdGVyLWxpa2VzIikuaW5uZXJIVE1MID0gcXMoIiN0ZW1wbGF0ZSAuaGVhcnRzdmciKS5vdXRlckhUTUwKICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgIHNldGFjdGl2ZSgic2V0YXV0b3BsYXkiLCAiYXV0b3BsYXkiLCBhdXRvcGxheSgpKQogICAgICAKICAgICAgZnVuY3Rpb24gZnJvbUhleFN0cmluZyhzdHIpewogICAgICAgIGxldCBidWZmZXIgPSBuZXcgVWludDhBcnJheShzdHIubGVuZ3RoIC8gMikKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlci5sZW5ndGg7IGkrKykgewogICAgICAgICAgYnVmZmVyW2ldID0gcGFyc2VJbnQoc3RyLnN1YnN0cigyICogaSwgMiksIDE2KQogICAgICAgIH0KICAgICAgICByZXR1cm4gYnVmZmVyCiAgICAgIH0KICAKICAgICAgZnVuY3Rpb24gcmVsYXlzKCl7CiAgICAgICAgY29uc3Qgb2JqID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgicmVsYXlzIikpCiAgICAgICAgY29uc3QgciA9IG9iaiAmJiBvYmouZmlsdGVyKHIgPT4gci5tYXRjaCgvd3NzOlwvXC8uKy8pKSB8fCBbXQogICAgICAgIAogICAgICAgIHJldHVybiByLmxlbmd0aCA+IDAgJiYgciB8fCBbCiAgICAgICAgICAid3NzOi8vcmVsYXkubm9zdHIuYmFuZCIsCiAgICAgICAgICAid3NzOi8vbmIucmVsYXkuY2VudGVyIiwgCiAgICAgICAgICAid3NzOi8vbm9zdHIuY29tcGlsZS1lcnJvci5uZXQiCiAgICAgICAgXQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBwcml2a2V5KCl7CiAgICAgICAgbGV0IGtleSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJwcml2a2V5IikgfHwgIiIKICAgICAgICAKICAgICAgICBpZihrZXkubGVuZ3RoID09IDYzKXsKICAgICAgICAgIGtleSA9IE5vc3RyVG9vbHMubmlwMTkuZGVjb2RlKGtleSkuZGF0YQogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4ga2V5Lmxlbmd0aCA9PSA2NCAmJiBrZXkgfHwgbnVsbAogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzZXR0aW5nKGtleSwgZGVmYXVsdHZhbHVlKXsKICAgICAgICBjb25zdCB2ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KQogICAgICAgIHJldHVybiB2ICYmIG9wdGlvbigic2V0IiArIGtleSwga2V5LCB2KSAmJiB2IHx8IGRlZmF1bHR2YWx1ZQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBvcHRpb24oYywga2V5LCB2YWwpewogICAgICAgIHJldHVybiBxcygiLiIgKyBjICsgIltkYXRhLSIgKyBrZXkgKyAiPSciICsgdmFsICsgIiddIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXMocSl7CiAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXNhKHEpewogICAgICAgIHJldHVybiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocSkpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGdpZChpKXsKICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXVlcnl0eXBlKCl7CiAgICAgICAgcmV0dXJuIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlIHx8ICJhbGwiCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZXF1ZXJ5KCl7CiAgICAgICAgbGV0IHBhcnRzID0gZGVjb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpKS5zcGxpdCgiLyIpCiAgICAgICAgcXVlcnlzdHIgPSBxcygiI3F1ZXJ5ZGlzcGxheSAudGV4dCIpLmlubmVyVGV4dCA9IHBhcnRzWzBdCiAgICAgICAgcXMoIiNxdWVyeSIpLnZhbHVlID0gcGFydHNbMF0KICAgICAgICBxcygiI3F1ZXJ5LXR5cGUiKS52YWx1ZSA9IHBhcnRzWzFdIHx8ICJhbGwiCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGFjdGl2ZSgpewogICAgICAgIHJldHVybiBxcygiI2ltYWdlcyAuYWN0aXZlIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gaW1hZ2VvZmZzZXQob2Zmc2V0KXsKICAgICAgICBjb25zdCBpbWFnZXMgPSBxc2EoIiNpbWFnZXMgPiAuaXRlbSIpLmZpbHRlcihlID0+IGUuc3R5bGUuZGlzcGxheSA9PSAiYmxvY2siKQogICAgICAgIHJldHVybiBpbWFnZXNbaW1hZ2VzLmluZGV4T2YoYWN0aXZlKCkpK29mZnNldF0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gbGFzdGFjdGl2ZSgpewogICAgICAgIHJldHVybiBxc2EoIiNpbWFnZXMgLmFjdGl2ZSIpLnBvcCgpICAgICAgCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIG1lbnUoKXsKICAgICAgICBxc2EoIiNtZW51LWNvbnRlbnQsICNtZW51LW92ZXJsYXkiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QudG9nZ2xlKCJvcGVuIikpCiAgICAgIH0KICAKICAgICAgZnVuY3Rpb24gc2V0YWN0aXZlKGMsIGtleSwgdmFsKXsKICAgICAgICBxc2EoIi4iICsgYykuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikpCiAgICAgICAgY29uc3Qgb3B0aW9uID0gcXMoIi4iICsgYyArICJbZGF0YS0iICsga2V5ICsgIj0nIiArIHZhbCArICInXSIpCiAgICAgICAgb3B0aW9uPy5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzY3JvbGx2aXNpYmxlKG4sIG9mZnNldCl7CiAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDAKICAgICAgICByZXR1cm4gKG4ub2Zmc2V0VG9wICsgbi5vZmZzZXRIZWlnaHQpID49IChzY3JvbGxZIC0gb2Zmc2V0KQogICAgICAgICAgJiYgbi5vZmZzZXRUb3AgPD0gKHNjcm9sbFkgKyB2aXN1YWxWaWV3cG9ydC5oZWlnaHQgKyBvZmZzZXQpCiAgICAgIH0KCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZWltYWdlc2xvYWQoKXsKICAgICAgICBxc2EoIiNpbWFnZXMgLml0ZW0uaW1nIikuZm9yRWFjaChhc3luYyBpbWcgPT4gewogICAgICAgICAgaWYoc2Nyb2xsdmlzaWJsZShpbWcsIHZpc3VhbFZpZXdwb3J0LmhlaWdodCAvIDIpKXsKICAgICAgICAgICAgaW1nLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICJ1cmwoIiArIGltZ1siZGF0YS1zcmMiXSArICIpIgogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIGltZy5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAiIgogICAgICAgICAgfQogICAgICAgIH0pCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZWFsbHZpZGVvcGxheSgpewogICAgICAgIHFzYSgiI2ltYWdlcyAuaXRlbS52aWRlbyIpLmZvckVhY2goYXN5bmMgbiA9PiB1cGRhdGV2aWRlb3BsYXkobikpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZXZpZGVvcGxheShuKXsKICAgICAgICBjb25zdCBhcGxheSA9IGF1dG9wbGF5KCkKICAgICAgICBjb25zdCB2ID0gbi5xdWVyeVNlbGVjdG9yKCJ2aWRlbyIpCiAgICAgICAgCiAgICAgICAgaWYoYXBsYXkgIT0gIm9uIil7CiAgICAgICAgICB2Lm11dGVkID0gZmFsc2UKICAgICAgICAgIHYucGF1c2UoKQogICAgICAgIH1lbHNlewogICAgICAgICAgdi5tdXRlZCA9IHRydWUKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoIXNjcm9sbHZpc2libGUobikpewogICAgICAgICAgaWYodi5yZWFkeVN0YXRlID09IDQpewogICAgICAgICAgICB2LnBhdXNlKCkKICAgICAgICAgIH1lbHNlewogICAgICAgICAgICB2LnByZWxvYWQgPSAibm9uZSIKICAgICAgICAgIH0KICAgICAgICB9ZWxzZSBpZih2LnJlYWR5U3RhdGUgIT0gNCl7CiAgICAgICAgICB2LnByZWxvYWQgPSAiYXV0byIKICAgICAgICB9CiAgICAgICAgZWxzZSBpZihhcGxheSA9PSAib24iIHx8IChhcGxheSA9PSAiaG92ZXIiICYmIHYgPT0gaG92ZXJlZHZpZGVvKSl7CiAgICAgICAgICB2LnBsYXkoKQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgZSA9PiB7CiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKQogICAgICAgIHVwZGF0ZWltYWdlc2xvYWQoKQogICAgICAgIHVwZGF0ZWFsbHZpZGVvcGxheSgpCiAgICAgIH0pCiAgICAgIAogICAgICBsZXQgdG91Y2ggPSBudWxsCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwgZSA9PiB0b3VjaCA9IGUuY2hhbmdlZFRvdWNoZXNbMF0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsIGUgPT4gewogICAgICAgIGNvbnN0IHhkaWZmID0gZS5jaGFuZ2VkVG91Y2hlc1swXS5zY3JlZW5YIC0gdG91Y2guc2NyZWVuWAoKICAgICAgICBpZih4ZGlmZiA8IC01MCl7CiAgICAgICAgICBzd2lwZSgxKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZih4ZGlmZiA+IDUwKXsKICAgICAgICAgIHN3aXBlKC0xKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIHFzKCIjcXVlcnktZm9ybSIpLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsIGUgPT4gewogICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIGxvY2F0aW9uLmhhc2ggPSAiIyIgKyBlbmNvZGVVUklDb21wb25lbnQocXMoIiNxdWVyeSIpLnZhbHVlICsgIi8iICsgcXVlcnl0eXBlKCkpCiAgICAgICAgdXBkYXRlcXVlcnkoKQogICAgICAgIHF1ZXJ5d2FpdC5yZXNvbHZlKCkKICAgICAgfSkKCiAgICAgIHFzKCIjcmVsYXlzLWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBhc3luYyBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBsZXQgciA9IEpTT04uc3RyaW5naWZ5KHFzKCIjcmVsYXlzIikudmFsdWUuc3BsaXQoIlxuIikpCiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oInJlbGF5cyIsIHIpCiAgICAgICAgZGlzY29ubmVjdCgpCiAgICAgIH0pCgogICAgICBxcygiI3ByaXZrZXktZm9ybSIpLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsIGFzeW5jIGUgPT4gewogICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIGNvbnN0IGtleSA9IHFzKCIjcHJpdmtleSIpLnZhbHVlCgogICAgICAgIGlmKGtleS5sZW5ndGggIT0gNjQgJiYga2V5Lmxlbmd0aCAhPSA2Myl7CiAgICAgICAgICBhbGVydCgia2V5IHNob3VsZCBiZSA2MyBvciA2NCBjaGFyYWN0ZXJzIGxvbmciKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJwcml2a2V5Iiwga2V5KQogICAgICAgIGFsZXJ0KCJrZXkgc2F2ZWQiKQogICAgICB9KQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwgYXN5bmMgKGUpID0+IHsKICAgICAgICBpZihhdXRvcGxheSgpID09ICJob3ZlciIgJiYgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2aWRlby1jb250YWluZXIiKSl7CiAgICAgICAgICBob3ZlcmVkdmlkZW8gPSBlLnRhcmdldC5xdWVyeVNlbGVjdG9yKCJ2aWRlbyIpCiAgICAgICAgICBob3ZlcmVkdmlkZW8ucGxheSgpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLCBhc3luYyAoZSkgPT4gewogICAgICAgIGhvdmVyZWR2aWRlbyA9IGZhbHNlCiAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5zdHlsZS5kaXNwbGF5ICE9ICJibG9jayIgJiYgYXV0b3BsYXkoKSA9PSAiaG92ZXIiICYmIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygidmlkZW8tY29udGFpbmVyIikpewogICAgICAgICAgcXNhKCJ2aWRlbyIpLmZvckVhY2godiA9PiB2LnBhdXNlKCkpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBhc3luYyAoZSkgPT4gewogICAgICAgIGlmKGUudGFyZ2V0LnR5cGUgPT0gInN1Ym1pdCIgfHwgKGUudGFyZ2V0LnRhZ05hbWUgPT0gIkEiICYmIGUudGFyZ2V0LmhyZWYubWF0Y2goL14ofHdlYlwrKW5vc3RyXDovKSkpewogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gInRpdGxlIil7CiAgICAgICAgICBxcygiI3F1ZXJ5IikudmFsdWUgPSAiIgogICAgICAgICAgcXMoIiNxdWVyeS10eXBlIikudmFsdWUgPSAiYWxsIgogICAgICAgICAgcXMoIiNnbyIpLmNsaWNrKCkKICAgICAgICB9CgogICAgICAgIGUucHJldmVudERlZmF1bHQoKQoKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAiZmlsdGVyLWxpa2VzIil7CiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC50b2dnbGUoImZpbHRlci1saWtlcyIpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbGV0IG4gPSBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKSAmJiBlLnRhcmdldCB8fCBlLnRhcmdldC5wYXJlbnRFbGVtZW50CgogICAgICAgIGlmKG4uY2xhc3NMaXN0LmNvbnRhaW5zKCJzaG93IikpewogICAgICAgICAgYWN0aXZlKCk/LmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICBnaWQobi5pZCkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIHNob3cobi5pZCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC50YWdOYW1lICE9ICJBIiAmJiAocXMoIiNpbWFnZS1jb250YWluZXIiKSA9PSBlLnRhcmdldCB8fCBxcygiI2ltYWdlIikgPT0gZS50YXJnZXQgfHwgcXMoIiNtZWRpYS1jb250YWluZXIgdmlkZW8iKSA9PSBlLnRhcmdldCkpewogICAgICAgICAgaGlkZW1lZGlhKCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gIm1lbnUiIHx8IGUudGFyZ2V0LmlkID09ICJtZW51LW92ZXJsYXkiKXsKICAgICAgICAgIG1lbnUoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNldGNvbHMiKSl7CiAgICAgICAgICBmb3IobGV0IGMgb2YgY29sb3B0cyl7CiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgiY29scyIgKyBjKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgZS50YXJnZXQuZGF0YXNldC5jb2xzKQogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImNvbHMiLCBlLnRhcmdldC5kYXRhc2V0LmNvbHMpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGNvbHMiLCAiY29scyIsIGNvbHMoKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNldGF1dG9wbGF5IikpewogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImF1dG9wbGF5IiwgZS50YXJnZXQuZGF0YXNldC5hdXRvcGxheSkKICAgICAgICAgIHNldGFjdGl2ZSgic2V0YXV0b3BsYXkiLCAiYXV0b3BsYXkiLCBhdXRvcGxheSgpKQogICAgICAgICAgdXBkYXRlYWxsdmlkZW9wbGF5KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoImxpa2UiKSAmJiBsaWtlKGUudGFyZ2V0KQogICAgICB9KQogICAgICAKICAgICAgZnVuY3Rpb24gaGFza2V5KCl7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5ub3N0ciB8fCBwcml2a2V5KCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcHVia2V5KCl7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5ub3N0ciAmJiBhd2FpdCB3aW5kb3cubm9zdHIuZ2V0UHVibGljS2V5KCkgfHwgTm9zdHJUb29scy5nZXRQdWJsaWNLZXkocHJpdmtleSgpKQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBzaWduKGV2ZW50KXsKICAgICAgICBpZih3aW5kb3cubm9zdHIpewogICAgICAgICAgcmV0dXJuIGF3YWl0IG5vc3RyLnNpZ25FdmVudChldmVudCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZXZlbnQuc2lnID0gTm9zdHJUb29scy5nZXRTaWduYXR1cmUoZXZlbnQsIHByaXZrZXkoKSkKICAgICAgICByZXR1cm4gZXZlbnQKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gbGlrZShsaW5rKXsKICAgICAgICBjb25zdCBldmVudCA9IGxpbmsucGFyZW50RWxlbWVudFsiZGF0YS1ldmVudCJdCiAgICAgICAgY29uc3QgcHViayA9IGF3YWl0IHB1YmtleSgpCiAgICAgICAgY29uc3QgbGlrZSA9IGF3YWl0IHNpZ24oewogICAgICAgICAgImtpbmQiOiA3LAogICAgICAgICAgImNvbnRlbnQiOiAiKyIsCiAgICAgICAgICAidGFncyI6IFsKICAgICAgICAgICAgWyJlIiwgZXZlbnQuaWRdLAogICAgICAgICAgICBbInAiLCBldmVudC5wdWJrZXldCiAgICAgICAgICBdLAogICAgICAgICAgInB1YmtleSI6IHB1YmssCiAgICAgICAgICAiY3JlYXRlZF9hdCI6IHBhcnNlSW50KERhdGUubm93KCkgLyAxMDAwICwgMTApCiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBzb2NrZXRzLmZvckVhY2gocyA9PiBzLnNlbmQoSlNPTi5zdHJpbmdpZnkoWyJFVkVOVCIsIGxpa2VdKSkpCiAgICAgICAgbGluay5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKCiAgICAgICAgY29uc3QgaW1hZ2VpZCA9IGxpbmtbImRhdGEtaXRlbS1pZCJdIHx8IGxpbmsuZGF0YXNldC5pbWFnZUlkCiAgICAgICAgCiAgICAgICAgaWYoaW1hZ2VpZCl7CiAgICAgICAgICBnaWQoaW1hZ2VpZCkucXVlcnlTZWxlY3RvcigiLmxpa2UiKS5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICB9CiAgICAgIH0KICAgIAogICAgICBmdW5jdGlvbiBzd2lwZShvZmZzZXQpewogICAgICAgIGlmKGltYWdlb2Zmc2V0KG9mZnNldCkpewogICAgICAgICAgaW1hZ2VvZmZzZXQob2Zmc2V0KS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgdGhpc1tvZmZzZXQgPT0gMSAmJiAibGFzdGFjdGl2ZSIgfHwgImFjdGl2ZSJdKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIHVwZGF0ZXNob3coKQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlc2hvdygpewogICAgICAgIGlmKHFzKCIjbWVkaWEtY29udGFpbmVyIikuc3R5bGUuZGlzcGxheSA9PSAiYmxvY2siKXsKICAgICAgICAgIGhpZGV2aWRlbygpCiAgICAgICAgICBzaG93KGFjdGl2ZSgpLmlkKQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIGUgPT4gewogICAgICAgIGlmKFsiVGFiIiwgIkFycm93TGVmdCIsICJBcnJvd1JpZ2h0IiwgIkFycm93VXAiLCAiQXJyb3dEb3duIl0uaW5jbHVkZXMoZS5rZXkpKXsKICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkVzY2FwZSIpewogICAgICAgICAgbWVudSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS5rZXkgPT0gIkVudGVyIiAmJiBlLnRhcmdldC50YWdOYW1lID09ICJCT0RZIil7CiAgICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLnN0eWxlLmRpc3BsYXkgPT0gImJsb2NrIil7CiAgICAgICAgICAgIGhpZGVtZWRpYSgpCiAgICAgICAgICAgIHJldHVybgogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBzaG93KGFjdGl2ZSgpLmlkKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dVcCIgJiYgaW1hZ2VvZmZzZXQoLWNvbHMoKSkpewogICAgICAgICAgaW1hZ2VvZmZzZXQoLWNvbHMoKSkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIGxhc3RhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgdXBkYXRlc2hvdygpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dEb3duIiAmJiBpbWFnZW9mZnNldChjb2xzKCkpKXsKICAgICAgICAgIGltYWdlb2Zmc2V0KGNvbHMoKSkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICB1cGRhdGVzaG93KCkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd0xlZnQiKXsKICAgICAgICAgIHN3aXBlKC0xKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93UmlnaHQiKXsKICAgICAgICAgIHN3aXBlKDEpCiAgICAgICAgfQogICAgICB9KQoKICAgICAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlcXVlcnlyZXMocmVzLCBzb2NrZXQsIHEsIHR5cGUsIHN0aW1lKXsKICAgICAgICBzYXZlKHNvY2tldCwgcmVzLCBxLCB0eXBlLCBmYWxzZSwgZmFsc2UsIHRydWUpCiAgICAgICAgbG9nKCJxdWVyeSByZXMiLCByZXMubGVuZ3RoLCBzb2NrZXQudXJsKQogICAgICAgIHF1ZXJ5Y291bnQtLQogICAgICAgIGlmKHF1ZXJ5Y291bnQgPT0gMCl7CiAgICAgICAgICBxcygiI2xvYWRpbmciKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxldCB3YWl0ID0gd2FpdG1zIC0gKERhdGUubm93KCkgLSBzdGltZSkKICAgICAgICBxdWVyeXdhaXQgPSBzbGVlcCh3YWl0KQogICAgICAgIGF3YWl0IHF1ZXJ5d2FpdC5wcm9taXNlCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHByaW1hbGdsb2JhbChzb2NrZXQpewogICAgICAgIGxvZygiZ2xvYmFsIiwgc29ja2V0LnVybCkKICAgICAgICBxdWVyeWNvdW50KysKICAgICAgICBxcygiI2xvYWRpbmciKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgIGxldCBzdGltZSA9IERhdGUubm93KCkKICAgICAgICBsZXQgcWlkID0gImdsb2JhbF8iICsgKCsraWRjb3VudGVyKQogICAgICAgIGxldCBxaWRsaWtlcyA9ICJsaWtlc18iICsgKCsraWRjb3VudGVyKQoKICAgICAgICBpZihuZXdsaWtlcy5sZW5ndGggPiAwKXsKICAgICAgICAgIHByaW1hbHNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KFsKICAgICAgICAgICAgIlJFUSIsIAogICAgICAgICAgICBxaWRsaWtlcywgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiY2FjaGUiOiBbCiAgICAgICAgICAgICAgICAiZXZlbnRzIiwgewogICAgICAgICAgICAgICAgICAiZXZlbnRfaWRzIjogbmV3bGlrZXMKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0KICAgICAgICAgIF0pKQoKICAgICAgICAgIGNvbnN0IGxpa2VfZXZlbnRzID0gYXdhaXQgd2FpdHJlcyhxaWRsaWtlcykKICAgICAgICAgIG5ld2xpa2VzLnNwbGljZSgwKQogICAgICAgICAgCiAgICAgICAgICBhd2FpdCBzYXZlKHNvY2tldCwgbGlrZV9ldmVudHMsICIiLCAiYWxsIiwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KFsKICAgICAgICAgICJSRVEiLCAKICAgICAgICAgIHFpZCwgCiAgICAgICAgICB7CiAgICAgICAgICAgICJjYWNoZSI6IFsKICAgICAgICAgICAgICAiZXhwbG9yZSIsIAogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJ0aW1lZnJhbWUiOiAibGF0ZXN0IiwKICAgICAgICAgICAgICAgICJzY29wZSI6ICJnbG9iYWwiLAogICAgICAgICAgICAgICAgImxpbWl0IjogMjAKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdKSkKICAgICAgICAKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB3YWl0cmVzKHFpZCkKICAgICAgICBhd2FpdCBoYW5kbGVxdWVyeXJlcyhyZXMuZmlsdGVyKGUgPT4gZS5raW5kID09IDEpLCBzb2NrZXQsICIiLCAiYWxsIiwgc3RpbWUpCiAgICAgICAgcHJpbWFsZ2xvYmFsKHNvY2tldCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnkoc29ja2V0LCBwcmltYWwpewogICAgICAgIGxvZygicXVlcnkiLCBzb2NrZXQudXJsKQogICAgICAgIHF1ZXJ5Y291bnQrKwogICAgICAgIHFzKCIjbG9hZGluZyIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgICAgCiAgICAgICAgbGV0IHN0aW1lID0gRGF0ZS5ub3coKQogICAgICAgIGxldCBxID0gcXVlcnlzdHIudHJpbSgpCiAgICAgICAgbGV0IHR5cGUgPSBxdWVyeXR5cGUoKQogICAgICAgIGxldCBpID0gKytpZGNvdW50ZXIKICAgICAgICBsZXQgcWlkID0gInF1ZXJ5XyIgKyBpCiAgICAgICAgbGV0IGZpbHRlcnMgPSBbXQoKICAgICAgICBmaWx0ZXJzLnB1c2goLi4uKHR5cGVzW3R5cGVdIHx8IFtdKS5tYXAoKHQpID0+IHsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGtpbmRzOiBbMV0sIAogICAgICAgICAgICBzZWFyY2g6ICIuIiArIHQsCiAgICAgICAgICAgIGxpbWl0OiAyMAogICAgICAgICAgfQogICAgICAgIH0pKQogICAgICAgIAogICAgICAgIGlmKHEubGVuZ3RoID4gMCl7CiAgICAgICAgICBmaWx0ZXJzLnB1c2goe2tpbmRzOiBbMV0sIHNlYXJjaDogcX0pCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGZpbHRlcnMubGVuZ3RoID09IDApewogICAgICAgICAgZmlsdGVycy5wdXNoKHtraW5kczogWzFdfSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgCiAgICAgICAgY29uc3QgbGlrZXNyZXMgPSBhd2FpdCBxdWVyeWxpa2VzKHNvY2tldCkKICAgICAgICAKICAgICAgICBsaWtlc3Jlcy5mb3JFYWNoKGV2ZW50aWQgPT4gewogICAgICAgICAgaWYoIWxpa2VzLmluY2x1ZGVzKGV2ZW50aWQpKXsKICAgICAgICAgICAgbGlrZXMucHVzaChldmVudGlkKQogICAgICAgICAgICBuZXdsaWtlcy5wdXNoKGV2ZW50aWQpCiAgICAgICAgICB9CiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBjb25zdCBzZWFyY2hvYmogPSBbIlJFUSIsIHFpZCwgLi4uZmlsdGVyc10KICAgICAgICBjb25zdCBzZWFyY2hqc29uID0gSlNPTi5zdHJpbmdpZnkoc2VhcmNob2JqKQogICAgICAgIHNvY2tldC5zZW5kKHNlYXJjaGpzb24pCiAgICAgICAgCiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgd2FpdHJlcyhxaWQpCiAgICAgICAgYXdhaXQgaGFuZGxlcXVlcnlyZXMocmVzLCBzb2NrZXQsIHEsIHR5cGUsIHN0aW1lKQogICAgICAgIHF1ZXJ5KHNvY2tldCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlsaWtlcyhzb2NrZXQpewogICAgICAgIGlmKCFoYXNrZXkoKSl7CiAgICAgICAgICByZXR1cm4gW10KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgbXlwdWJrZXkgPSBhd2FpdCBwdWJrZXkoKQogICAgICAgIGNvbnN0IGV2ZW50cyA9IGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzddLCBudWxsLCBbbXlwdWJrZXldKQogICAgICAgIHJldHVybiBldmVudHMubWFwKGUgPT4gZS50YWdzLmZpbmQodCA9PiB0WzBdID09ICJlIilbMV0pCiAgICAgIH0KCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5ZXZlbnRzKHNvY2tldCwga2luZHMsIGV2ZW50aWRzLCBhdXRob3JzKXsKICAgICAgICBjb25zdCBxdWVyeWlkID0gImV2ZW50c18iICsgKCsraWRjb3VudGVyKQogICAgICAgIGNvbnN0IGZpbHRlcnMgPSB7fQogICAgICAgIAogICAgICAgIGZpbHRlcnMua2luZHMgPSBraW5kcwogICAgICAgIAogICAgICAgIGlmKGV2ZW50aWRzKXsKICAgICAgICAgIGZpbHRlcnNbIiNlIl0gPSBldmVudGlkcwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihhdXRob3JzKXsKICAgICAgICAgIGZpbHRlcnNbImF1dGhvcnMiXSA9IGF1dGhvcnMKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KFsKICAgICAgICAgICJSRVEiLCAKICAgICAgICAgIHF1ZXJ5aWQsIAogICAgICAgICAgZmlsdGVycwogICAgICAgIF0pCgogICAgICAgIHNvY2tldC5zZW5kKGpzb24pCiAgICAgICAgCiAgICAgICAgcmV0dXJuIGF3YWl0IHdhaXRyZXMocXVlcnlpZCkgfHwgW10KICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlwdWJrZXkoc29ja2V0LCBwdWJrKXsKICAgICAgICBjb25zdCBxdWVyeWlkID0gInF1ZXJ5XyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgc29ja2V0LnNlbmQocXVlcmllcy5hdXRob3IucmVwbGFjZSgiPEk+IiwgcXVlcnlpZCkucmVwbGFjZSgiPFA+IiwgcHViaykpCgogICAgICAgIHJldHVybiAoYXdhaXQgd2FpdHJlcyhxdWVyeWlkKSkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gc2F2ZShzb2NrZXQsIGV2ZW50ZGIsIHEsIHF0eXBlLCByZWFjdGVkLCBhcHBlbmQsIHF1ZXJ5bWV0YSl7CiAgICAgICAgbGV0IGV2ZW50cHVia2V5cyA9IFtdCiAgICAgICAgY29uc3QgZXZlbnRzID0gZXZlbnRkYi5maWx0ZXIobyA9PiB7CiAgICAgICAgICBpZihxLmxlbmd0aCA+IDApewogICAgICAgICAgICBmb3IobGV0IHdvcmQgb2YgcS5zcGxpdCgiICIpKXsKICAgICAgICAgICAgICBpZihvLmNvbnRlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKHdvcmQudG9Mb3dlckNhc2UoKSkgPT0gLTEpewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgcmV0dXJuIHRydWUKICAgICAgICB9KQogICAgICAgIAogICAgICAgIGxldCByZXN1bHRzID0gW10KICAgICAgICBjb25zdCBldmVudGlkcyA9IGV2ZW50cy5tYXAoZSA9PiBlLmlkKQogICAgICAgIGxldCBuZXd1cmxzID0gW10KICAgICAgICAKICAgICAgICBmb3IobGV0IGV2ZW50IG9mIGV2ZW50cyl7CiAgICAgICAgICBsZXQgdXJsc21hdGNoID0gW10KICAgICAgICAgIAogICAgICAgICAgaWYocXR5cGUgIT0gInZpZGVvIil7CiAgICAgICAgICAgIHVybHNtYXRjaC5wdXNoKC4uLihldmVudC5jb250ZW50Lm1hdGNoKGltZ3JlZ2V4KSB8fCBbXSkpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGlmKHF0eXBlICE9ICJpbWFnZSIpewogICAgICAgICAgICB1cmxzbWF0Y2gucHVzaCguLi4oZXZlbnQuY29udGVudC5tYXRjaCh2aWRlb3JlZ2V4KSB8fCBbXSkpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHVybHNtYXRjaCA9IHVybHNtYXRjaC5maWx0ZXIodXJsID0+ICF1cmxzLmluY2x1ZGVzKHVybCkpCgogICAgICAgICAgaWYodXJsc21hdGNoLmxlbmd0aCA+IDApewogICAgICAgICAgICBuZXd1cmxzLnB1c2goewogICAgICAgICAgICAgIGV2ZW50OiBldmVudCwKICAgICAgICAgICAgICB1cmxzOiB1cmxzbWF0Y2gKICAgICAgICAgICAgfSkKICAgICAgICAgICAgCiAgICAgICAgICAgIHVybHMucHVzaCguLi51cmxzbWF0Y2gpCiAgICAgICAgICAgIGV2ZW50cHVia2V5cy5pbmNsdWRlcyhldmVudC5wdWJrZXkpIHx8IGV2ZW50cHVia2V5cy5wdXNoKGV2ZW50LnB1YmtleSkKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbG9nKCJxdWVyeSBtZXRhIiwgc29ja2V0LnVybCkKICAgICAgICBsZXQgbWV0YWV2ZW50cyA9IChxdWVyeW1ldGEgJiYgYXdhaXQgcXVlcnlldmVudHMoc29ja2V0LCBbMF0sIG51bGwsIGV2ZW50cHVia2V5cykgfHwgW10pCiAgICAgICAgCiAgICAgICAgZm9yKGxldCBlbnRyeSBvZiBuZXd1cmxzKXsKICAgICAgICAgIGZvcihsZXQgdXJsIG9mIGVudHJ5LnVybHMpewogICAgICAgICAgICByZXN1bHRzLnB1c2goewogICAgICAgICAgICAgIHJlYWN0ZWQ6IHJlYWN0ZWQgfHwgbGlrZXMuaW5jbHVkZXMoZW50cnkuZXZlbnQuaWQpLCAKICAgICAgICAgICAgICB1cmw6IHVybCwgCiAgICAgICAgICAgICAgZXZlbnQ6IGVudHJ5LmV2ZW50LCAKICAgICAgICAgICAgICBiZWNoMzJpZDogYmVjaDMyLmVuY29kZSgibm90ZSIsIGZyb21IZXhTdHJpbmcoZW50cnkuZXZlbnQuaWQpKSwKICAgICAgICAgICAgICBtZXRhOiBtZXRhZXZlbnRzLmZpbmQobyA9PiBvLnB1YmtleSA9PSBlbnRyeS5ldmVudC5wdWJrZXkpCiAgICAgICAgICAgIH0pCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxvZygic2F2ZSByZXMiLCByZXN1bHRzLmxlbmd0aCwgc29ja2V0LnVybCkKICAgICAgICB1cGRhdGVjb250ZW50KHJlc3VsdHMsIHEsIGFwcGVuZCkKICAgICAgfQogICAgICAKICAgICAgbGV0IGxvYWRlZCA9IDAKICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZWNvbnRlbnQocmVzdWx0cywgcSwgYXBwZW5kKXsKICAgICAgICByZXN1bHRzLnJldmVyc2UoKS5mb3JFYWNoKGl0ZW0gPT4gewogICAgICAgICAgY29uc3QgdHlwZSA9IGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpICYmICJ2aWRlbyIgfHwgImltYWdlIgogICAgICAgICAgY29uc3QgdGV4dCA9IChxIHx8ICJ2aWV3IG5vdGUiKS5zdWJzdHJpbmcoLTMwKQogICAgICAgICAgY29uc3QgaWQgPSAiaXRlbV8iICsgKCsraWRjb3VudGVyKQogICAgICAgICAgY29uc3QgY29udGVudGVsZW1lbnRzID0gJzxkaXYgY2xhc3M9InR5cGUiPicgKyBxcygiI3RlbXBsYXRlIC4iICsgdHlwZSArICJzdmciKS5vdXRlckhUTUwgKyAnPC9kaXY+PGEgY2xhc3M9Imxpa2UnICsgKGl0ZW0ucmVhY3RlZCA/ICcgcmVhY3RlZCcgOiAnJykgKyAnIiBkYXRhLWl0ZW0taWQ9IicgKyBpZCArIAogICAgICAgICAgICAnIiBocmVmPSIjIj4nICsgcXMoIiN0ZW1wbGF0ZSAuaGVhcnRzdmciKS5vdXRlckhUTUwgKyAnPC9hPjxhIGNsYXNzPSJxdWVyeSIgaHJlZj0iJyArIHByb3RvY29sICsgCiAgICAgICAgICAgIGl0ZW0uYmVjaDMyaWQgKyAnIj4nICsgdGV4dCArICc8L2E+JwogICAgICAgICAgbGV0IHJvb3QgPSBudWxsCiAgICAgICAgICBsZXQgdiA9IG51bGwKICAgICAgICAgIAogICAgICAgICAgaWYoaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleCkpewogICAgICAgICAgICByb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikKICAgICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJ2aWRlby1jb250YWluZXIiKQogICAgICAgICAgICByb290LmlubmVySFRNTCA9IGNvbnRlbnRlbGVtZW50cwogICAgICAgICAgICAKICAgICAgICAgICAgdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIikKICAgICAgICAgICAgdlsiZGF0YS1pdGVtLWlkIl0gPSBpZAogICAgICAgICAgICB2LnByZWxvYWQgPSAibm9uZSIKICAgICAgICAgICAgdi5sb29wID0gdHJ1ZQogICAgICAgICAgICB2LnBsYXlzaW5saW5lID0gIiIKICAgICAgICAgICAgCiAgICAgICAgICAgIHYub25jYW5wbGF5ID0gYXN5bmMgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgY29uc3QgYXNwZWN0ID0gdGhpcy52aWRlb1dpZHRoIC8gdGhpcy52aWRlb0hlaWdodAogICAgICAgICAgICAgIGlmKGFzcGVjdCA+IDEpewogICAgICAgICAgICAgICAgdGhpcy5zdHlsZS53aWR0aCA9IChhc3BlY3QgKiAxMDApICsgIiUiCiAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLmhlaWdodCA9ICgxIC8gYXNwZWN0ICogMTAwKSArICIlIgogICAgICAgICAgICAgICAgdGhpcy5zdHlsZS5tYXJnaW5Ub3AgPSAtKCgxIC8gYXNwZWN0ICogMTAwIC0gMTAwKSAvIDIpICsgIiUiCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIAogICAgICAgICAgICAgIHVwZGF0ZXZpZGVvcGxheSh0aGlzLnBhcmVudEVsZW1lbnQpCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnN0IGV4dCA9IGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpWzFdCiAgICAgICAgICAgIHYuaW5uZXJIVE1MID0gJzxzb3VyY2Ugc3JjPSInICsgaXRlbS51cmwgKyAnIiB0eXBlPSJ2aWRlby8nICsgZXh0ICsgJyI+PC9zb3VyY2U+JwogICAgICAgICAgICAKICAgICAgICAgICAgcm9vdC5hcHBlbmQodikKICAgICAgICAgIH1lbHNlIGlmKGl0ZW0udXJsLm1hdGNoKGltZ2V4dHJlZ2V4KSl7CiAgICAgICAgICAgIHJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIikKICAgICAgICAgICAgcm9vdC5ocmVmID0gIiMiCiAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MID0gY29udGVudGVsZW1lbnRzCiAgICAgICAgICAgICAgCiAgICAgICAgICAgIGlmKHR5cGUgPT0gImltYWdlIil7CiAgICAgICAgICAgICAgLy9sZXQgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIikKICAgICAgICAgICAgICAvL2ltZy5hbHQgPSBpdGVtLnVybAogICAgICAgICAgICAgIHJvb3RbImRhdGEtc3JjIl0gPSBpdGVtLnVybAogICAgICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgiaW1nIikKICAgICAgICAgICAgICAvL2ltZy5jbGFzc0xpc3QuYWRkKCJkYXRhIikKICAgICAgICAgICAgICAvL3Jvb3QuYXBwZW5kKGltZykKICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgcm9vdC5pbm5lckhUTUwgKz0gJzxzcGFuIGNsYXNzPSJmaWxlIj4nICsgaXRlbS51cmwgKyAnPC9zcGFuPicKICAgICAgICAgICAgfQogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIHJldHVybgogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICByb290LmlkID0gaWQKICAgICAgICAgIHJvb3Quc3R5bGUuZGlzcGxheSA9ICdibG9jaycKICAgICAgICAgIHJvb3RbImRhdGEtaXRlbSJdID0gaXRlbQogICAgICAgICAgcm9vdFsiZGF0YS1ldmVudCJdID0gaXRlbS5ldmVudAogICAgICAgICAgcm9vdFsiZGF0YS1xdWVyeSJdID0gcQogICAgICAgICAgcm9vdFsiZGF0YS10ZXh0Il0gPSB0ZXh0CiAgICAgICAgICAKICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCh0eXBlKQogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJpdGVtIikKICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgic2hvdyIpCiAgICAgICAgICAKICAgICAgICAgIGlmKGl0ZW0ucmVhY3RlZCl7CiAgICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHFzKCIjaW1hZ2VzIilbYXBwZW5kICYmICJhcHBlbmQiIHx8ICJwcmVwZW5kIl0ocm9vdCkKICAgICAgICAgIAogICAgICAgICAgaWYodil7CiAgICAgICAgICAgIHVwZGF0ZXZpZGVvcGxheShyb290KQogICAgICAgICAgfQogICAgICAgIH0pCgogICAgICAgIHVwZGF0ZWltYWdlc2xvYWQoKQogICAgICAgIAogICAgICAgIGlmKGFjdGl2ZSgpID09IG51bGwpewogICAgICAgICAgcXMoIiNpbWFnZXMgLml0ZW0iKT8uY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGhpZGVtZWRpYSgpewogICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAic2Nyb2xsIgogICAgICAgIHFzYSgiI21lZGlhLWNvbnRhaW5lciwgI2ltYWdlLCAjbWVkaWEtZm9vdGVyIikuZm9yRWFjaChuID0+IG4uc3R5bGUuZGlzcGxheSA9ICJub25lIikKICAgICAgICBnaWQoImltYWdlLWxpa2UiKS5jbGFzc0xpc3QucmVtb3ZlKCJyZWFjdGVkIikKICAgICAgICBoaWRldmlkZW8oKQogICAgICB9CgogICAgICBmdW5jdGlvbiBoaWRldmlkZW8oKXsKICAgICAgICBjb25zdCB2ID0gcXMoIiNtZWRpYS1jb250YWluZXIgdmlkZW8iKQogICAgICAgIAogICAgICAgIGlmKHYpewogICAgICAgICAgdi5tdXRlZCA9IHRydWUKICAgICAgICAgIGdpZCh2WyJkYXRhLWl0ZW0taWQiXSkuYXBwZW5kQ2hpbGQodikKICAgICAgICAgIHVwZGF0ZXZpZGVvcGxheSh2LnBhcmVudEVsZW1lbnQpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB3YWl0cmVzKGtleSl7CiAgICAgICAgbGV0IGV2ZW50cyA9IFtdCiAgICAgICAgCiAgICAgICAgbGV0IHJlc2hhbmRsZXIgPSBmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewogICAgICAgICAgdGhpcy5oYW5kbGUgPSBmdW5jdGlvbihyZXMpewogICAgICAgICAgICBsZXQgbyA9IEpTT04ucGFyc2UocmVzLmRhdGEpCiAgICAgICAgICAgIGlmKG9bMV0gPT0ga2V5KXsKICAgICAgICAgICAgICBpZihvWzBdID09ICJFT1NFIil7CiAgICAgICAgICAgICAgICByZXNvbHZlKGV2ZW50cykKICAgICAgICAgICAgICAgIHJlc2hhbmRsZXJzLnNwbGljZShyZXNoYW5kbGVycy5pbmRleE9mKHRoaXMpLCAxKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBldmVudHMucHVzaChvWzJdKQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICAgIHJlc2hhbmRsZXJzLnB1c2gobmV3IHJlc2hhbmRsZXIocmVzb2x2ZSwgcmVqZWN0KSkKICAgICAgICB9KQogICAgICB9CiAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gY2hlY2t1cGRhdGUoc29ja2V0KXsKICAgICAgICBjb25zdCB1cGRhdGVzcmVzID0gYXdhaXQgcXVlcnlwdWJrZXkoc29ja2V0LCB1cGRhdGVzcHVia2V5KQogICAgICAgIGNvbnN0IHVwZGF0ZW5vdGUgPSB1cGRhdGVzcmVzLmZpbmQobiA9PiBuLmNvbnRlbnQubWF0Y2goL15odHRwc1w6XC9cLy8pKQogICAgICAgIAogICAgICAgIGlmKCF1cGRhdGVub3RlKXsKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBhZ2UgPSBNYXRoLnJvdW5kKChEYXRlLm5vdygpIC8gMTAwMCAtIHVwZGF0ZW5vdGUuY3JlYXRlZF9hdCkgLyAzNjAwIC8gMjQpCiAgICAgICAgY29uc3Qgbm90ZWlkID0gYmVjaDMyLmVuY29kZSgibm90ZSIsIGZyb21IZXhTdHJpbmcodXBkYXRlbm90ZS5pZCkpCiAgICAgICAgcXMoIiNyZWxlYXNlIikuaHJlZiA9IHByb3RvY29sICsgbm90ZWlkCiAgICAgICAgcXMoIiNyZWxlYXNlIikuaW5uZXJUZXh0ID0gKGFnZSA9PSAwICYmICJ0b2RheSIgfHwgYWdlICsgIiBkYXkocykgYWdvIikKICAgICAgfQoKICAgICAgZnVuY3Rpb24gc2xlZXAobXMpewogICAgICAgIHJldHVybiBuZXcgZnVuY3Rpb24oKXsKICAgICAgICAgIGxldCB0aW1lb3V0ID0gbnVsbAogICAgICAgICAgbGV0IHIgPSBudWxsCiAgICAgICAgICAKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHByb21pc2U6IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7CiAgICAgICAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSgpLCBtcykKICAgICAgICAgICAgICByID0gcmVzb2x2ZQogICAgICAgICAgICB9KSwKICAgICAgICAgICAgcmVzb2x2ZTogZnVuY3Rpb24oKXsKICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCkKICAgICAgICAgICAgICByKCkKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gc2hvdyhpZCl7CiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICJoaWRkZW4iCiAgICAgICAgY29uc3QgaXRlbSA9IGdpZChpZClbImRhdGEtaXRlbSJdCiAgICAgICAgY29uc3QgbWVkaWEgPSBnaWQoIm1lZGlhLWNvbnRhaW5lciIpCiAgICAgICAgY29uc3QgaW1hZ2UgPSBnaWQoImltYWdlIikKCiAgICAgICAgaWYoaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleCkpewogICAgICAgICAgaW1hZ2Uuc3R5bGUuZGlzcGxheSA9ICJub25lIgogICAgICAgICAgY29uc3QgdiA9IGdpZChpZCkucXVlcnlTZWxlY3RvcigidmlkZW8iKQogICAgICAgICAgcXMoIiNtZWRpYS1jb250YWluZXIiKS5hcHBlbmRDaGlsZCh2KQogICAgICAgICAgdi5tdXRlZCA9IGZhbHNlCiAgICAgICAgICB2LnBsYXkoKQogICAgICAgIH1lbHNlewogICAgICAgICAgaW1hZ2Uuc3JjID0gaXRlbS51cmwKICAgICAgICAgIGltYWdlLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGl0ZW0ubWV0YSl7CiAgICAgICAgICBjb25zdCBtZXRhY29udGVudCA9IEpTT04ucGFyc2UoaXRlbS5tZXRhLmNvbnRlbnQpCiAgICAgICAgICBjb25zdCBuYW1lID0gbWV0YWNvbnRlbnQuZGlzcGxheV9uYW1lIHx8IG1ldGFjb250ZW50Lm5hbWUKICAgICAgICAgIHFzKCIjaW1hZ2UtdXNlciIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgICAgICBxcygiI2ltYWdlLXVzZXIiKS5ocmVmID0gcHJvdG9jb2wgKyBiZWNoMzIuZW5jb2RlKCJucHViIiwgZnJvbUhleFN0cmluZyhpdGVtLm1ldGEucHVia2V5KSkKICAgICAgICAgIHFzKCIjaW1hZ2UtdXNlciIpLmlubmVyVGV4dCA9IG5hbWUKICAgICAgICB9ZWxzZXsKICAgICAgICAgIHFzKCIjaW1hZ2UtdXNlciIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSIKICAgICAgICB9CgogICAgICAgIGdpZCgiaW1hZ2UtbGlrZSIpWyJkYXRhLWl0ZW0taWQiXSA9IGlkCiAgICAgICAgZ2lkKCJtZWRpYS1mb290ZXIiKVsiZGF0YS1ldmVudCJdID0gaXRlbS5ldmVudAoKICAgICAgICBpZihpdGVtLnJlYWN0ZWQpewogICAgICAgICAgZ2lkKCJpbWFnZS1saWtlIikuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGEgPSBxcygiI2ltYWdlLXF1ZXJ5IikKICAgICAgICBhLmhyZWYgPSBwcm90b2NvbCArIGl0ZW0uYmVjaDMyaWQKICAgICAgICBhLmlubmVyVGV4dCA9IGdpZChpZClbImRhdGEtdGV4dCJdCiAgICAgICAgICAKICAgICAgICBtZWRpYS5zdHlsZS5kaXNwbGF5ID0gZ2lkKCJtZWRpYS1mb290ZXIiKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBjb25uY291bnQoKXsKICAgICAgICByZXR1cm4gc29ja2V0cy5maWx0ZXIociA9PiByLnJlYWR5U3RhdGUgPT0gMSkubGVuZ3RoCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGRpc2Nvbm5lY3QoKXsKICAgICAgICBmb3IobGV0IHNvY2tldCBvZiBzb2NrZXRzKXsKICAgICAgICAgIHNvY2tldC5jbG9zZSgpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHNvY2tldHMuc3BsaWNlKDApCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGxvZyhtc2cpewogICAgICAgIGxldCBzY3JvbGwgPSBxcygiI2xvZ3MiKS5zY3JvbGxUb3AgPT0gcXMoIiNsb2dzIikuc2Nyb2xsVG9wTWF4CiAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikKICAgICAgICBkaXYuaW5uZXJUZXh0ID0gQXJyYXkuZnJvbShhcmd1bWVudHMpLmpvaW4oIiAiKQogICAgICAgIHFzKCIjbG9ncyIpLmFwcGVuZChkaXYpCiAgICAgICAgCiAgICAgICAgc2Nyb2xsICYmIHFzKCIjbG9ncyIpLnNjcm9sbFRvKDAsIHFzKCIjbG9ncyIpLnNjcm9sbFRvcE1heCkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gY29ubmVjdCh1cmwpewogICAgICAgIGxvZygiY29ubmVjdGluZyIsIHVybCkKICAgICAgICBsZXQgc29ja2V0ID0gbmV3IFdlYlNvY2tldCh1cmwpCiAgICAgICAgCiAgICAgICAgc29ja2V0Lm9ubWVzc2FnZSA9IG1lc3NhZ2UgPT4gcmVzaGFuZGxlcnMuZm9yRWFjaChyaCA9PiByaC5oYW5kbGUobWVzc2FnZSkpCiAgICAgICAgCiAgICAgICAgc29ja2V0Lm9uY2xvc2UgPSBhc3luYyBmdW5jdGlvbigpewogICAgICAgICAgc29ja2V0cy5zcGxpY2Uoc29ja2V0cy5pbmRleE9mKHNvY2tldCksIDEpCiAgICAgICAgICBxcygiI2Nvbm5jb3VudCIpLmlubmVyVGV4dCA9IGNvbm5jb3VudCgpICsgKHByaW1hbHNvY2tldCAmJiAxKQogICAgICAgICAgbG9nKCJkaXNjb25uZWN0ZWQiLCB0aGlzLnVybCwgY29ubmNvdW50KCkpCiAgICAgICAgICBhd2FpdCBzbGVlcCgxMDAwKS5wcm9taXNlCiAgICAgICAgICBjb25uZWN0KHRoaXMudXJsKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXQub25vcGVuID0gZnVuY3Rpb24oKXsKICAgICAgICAgIHFzKCIjY29ubmNvdW50IikuaW5uZXJUZXh0ID0gY29ubmNvdW50KCkgKyAocHJpbWFsc29ja2V0ICYmIDEpCiAgICAgICAgICBsb2coImNvbm5lY3RlZCIsIHRoaXMudXJsLCBjb25uY291bnQoKSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIHNvY2tldAogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgYXN5bmMgKCkgPT4gewogICAgICAgIHByaW1hbHNvY2tldCA9IGNvbm5lY3QoIndzczovL2NhY2hlMy5wcmltYWwubmV0L2NhY2hlMTciKQogICAgICAgIHByaW1hbHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIiwgZnVuY3Rpb24oKXsKICAgICAgICAgIHByaW1hbGdsb2JhbCh0aGlzKQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgcHJpbWFsc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIiwgZnVuY3Rpb24oKXsKICAgICAgICAgIHByaW1hbHNvY2tldCA9IG51bGwKICAgICAgICB9KQogICAgICAgIAogICAgICAgIGZvcihsZXQgdXJsIG9mIHJlbGF5cygpKXsKICAgICAgICAgIGNvbnN0IHNvY2tldCA9IGNvbm5lY3QodXJsKQogICAgICAgICAgc29ja2V0cy5wdXNoKHNvY2tldCkKICAgICAgICAgIAogICAgICAgICAgc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoIm9wZW4iLCBmdW5jdGlvbigpewogICAgICAgICAgICBjaGVja3VwZGF0ZSh0aGlzKQogICAgICAgICAgICBxdWVyeSh0aGlzKQogICAgICAgICAgfSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgYXdhaXQgc2xlZXAoMTAwKS5wcm9taXNlCiAgICAgICAgCiAgICAgICAgaWYoaGFza2V5KCkpewogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJub3N0ciIpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgZm9yKGxldCBjIG9mIGNvbG9wdHMpewogICAgICAgIGRvY3VtZW50LndyaXRlKCc8c3R5bGU+JyArIGNvbHNjc3MuaW5uZXJUZXh0LnJlcGxhY2UoL1wkXHtjb2xzXH0vZywgYykgKyAnPC9zdHlsZT4nKQogICAgICB9CiAgICA8L3NjcmlwdD4KICA8L2JvZHk+CjwvaHRtbD4K
https://ipfs.io/ipfs/QmVFCjQ1FVG8vBqXSegnyS628yY1uaDGEQdPqroZB6oevK
sha256
62c67866fc5e4e33e1d042f712923a111e22ddeea530ea4f007a89f788d7626d files.html
base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyIvPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL3N2Z2ljb25zLnNwYXJray5mci9zdmdpY29ucy5jc3MiLz4KICAgIDxzdHlsZT4KICAgICAgKiB7CiAgICAgICAgb3ZlcnNjcm9sbC1iZWhhdmlvci15OiBjb250YWluOwogICAgICB9CiAgICAgIAogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksIAogICAgICAjaGVhZGVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncywgCiAgICAgICNwcml2a2V5IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncyB7CiAgICAgICAgaGVpZ2h0OiA2ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNsb2dzIHsKICAgICAgICBoZWlnaHQ6IDhlbTsKICAgICAgICBvdmVyZmxvdzogc2Nyb2xsOwogICAgICAgIGZvbnQtc2l6ZTogLjhlbTsKICAgICAgfQogICAgICAKICAgICAgc2VsZWN0IHsKICAgICAgICB3aWR0aDogNGVtOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLCAKICAgICAgaW5wdXQuc3VibWl0IHsKICAgICAgICBib3JkZXItcmFkaXVzOiAuNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0LCAKICAgICAgI2hlYWRlciBhLAogICAgICAjbWVkaWEtY29udGFpbmVyIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLCAKICAgICAgZm9ybSwgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHotaW5kZXg6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgIAogICAgICBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDMwZW0pIHsKICAgICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgfQogICAgICB9CgogICAgICBmb3JtIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeSB7CiAgICAgICAgd2lkdGg6IDZlbTsKICAgICAgfQogICAgICAKICAgICAgI2xvYWRpbmcgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMHB4OwogICAgICAgIGxlZnQ6IDI3ZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgIGEgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgfQoKICAgICAgdmlkZW8gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogIAogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgIGhlaWdodDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgIG1hcmdpbi10b3A6IDAgIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgLnR5cGUgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICB6LWluZGV4OiAxOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2UtcXVlcnkgewogICAgICAgIHdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksCiAgICAgIGEsCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICB9CgogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbWluLXdpZHRoOiAzZW07CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLAogICAgICAjaGVhZGVyIHNwYW4gewogICAgICAgIHBhZGRpbmc6IDAuNWVtOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CgogICAgICAjaGVhZGVyIHsKICAgICAgICBwYWRkaW5nOiAwLjQ1ZW0gMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAjaGVhZGVyIC5pdGVtcyB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgLml0ZW1zIHsKICAgICAgICBtYXJnaW4tdG9wOiAuM2VtOwogICAgICB9CgogICAgICBwIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICAubGFiZWwgewogICAgICAgIHBhZGRpbmc6IC44ZW0gLjhlbSAuOGVtIDA7CiAgICAgIH0KCiAgICAgICNpbWFnZXMgLnF1ZXJ5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KCiAgICAgICNtZWRpYS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwKTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlIHsKICAgICAgICBtYXgtd2lkdGg6IDEwMHZ3OwogICAgICAgIG1heC1oZWlnaHQ6IDEwMHZoOwogICAgICB9CiAgICAgICAgCiAgICAgICNpbWFnZXMgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZXMgLml0ZW0gewogICAgICAgIHdpZHRoOiAyNXZ3OwogICAgICB9CgogICAgICAjaW1hZ2VzIC5pdGVtIHsKICAgICAgICBoZWlnaHQ6IDI1dnc7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBib3JkZXI6IDAuM2VtIHNvbGlkIHRyYW5zcGFyZW50OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDAuM2VtOwogICAgICAgIG1hcmdpbjogLTAuM2VtOwogICAgICB9CgogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CiAgICAgIAogICAgICBib2R5Om5vdCgubm9zdHIpICNmaWx0ZXItbGlrZXMsIAogICAgICAuZmlsdGVyLWxpa2VzICNpbWFnZXMgPiAuaXRlbTpub3QoLnJlYWN0ZWQpIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlLCAKICAgICAgI2ltYWdlLXF1ZXJ5LAogICAgICAjaW1hZ2UtdXNlciB7CiAgICAgICAgei1pbmRleDogMjsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3Z3OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHBhZGRpbmc6IDAgMXZ3OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSwgCiAgICAgIC52aWRlb3N2ZywKICAgICAgLmltYWdlc3ZnIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLDAuNik7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlLCAKICAgICAgI2ltYWdlLXF1ZXJ5IHsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgZm9udC1zaXplOiBtaW4oMy41dncsIDEuNWVtKTsKICAgICAgICBtYXgtd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlLXF1ZXJ5IHsKICAgICAgICBwYWRkaW5nOiAuNmVtIC40ZW0gLjFlbSAuNGVtOwogICAgICAgIG1heC13aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICAubGlrZS5yZWFjdGVkLAogICAgICAuZmlsdGVyLWxpa2VzICNmaWx0ZXItbGlrZXMgewogICAgICAgIGJhY2tncm91bmQ6IHJlZDsKICAgICAgfQoKICAgICAgI2ltYWdlLXF1ZXJ5LAogICAgICAjaW1hZ2UtdXNlciB7CiAgICAgICAgZm9udC1zaXplOiAzZW07CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIsCiAgICAgICNtZWRpYS1mb290ZXIgLmxpa2UgewogICAgICAgIHotaW5kZXg6IDU7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2UtcXVlcnksCiAgICAgICNpbWFnZS11c2VyIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIGJvdHRvbTogMS45ZW07CiAgICAgICAgZm9udC1zaXplOiAxLjhlbTsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAuNjVlbTsKICAgICAgICBtYXgtd2lkdGg6IDhlbTsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgfQogICAgICAKICAgICAgLmxpa2UgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogYXV0bzsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIHdpZHRoOiAxZW07CiAgICAgICAgaGVpZ2h0OiAxZW07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgfQoKICAgICAgLm5vc3RyIC5saWtlIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsgIAogICAgICB9CgogICAgICAjbWVkaWEtZm9vdGVyIC5saWtlIHsKICAgICAgICBmb250LXNpemU6IDIuNGVtOwogICAgICB9CgogICAgICAjbWVkaWEtZm9vdGVyIHsKICAgICAgICBkaXNwbGF5OiBub25lOyAgCiAgICAgIH0KICAKICAgICAgI2ltYWdlcyAuaW1nIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgYmFja2dyb3VuZC1zaXplOiBjb3ZlcjsKICAgICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwogICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgLmFjdGl2ZSB7CiAgICAgICAgYmFja2dyb3VuZDogIzQ0NDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlcyA+IC5hY3RpdmUgewogICAgICAgIGJvcmRlci1jb2xvcjogZ3JlZW47CiAgICAgICAgei1pbmRleDogMTsKICAgICAgfQoKICAgICAgLmhlYXJ0c3ZnIHBhdGggewogICAgICAgIHN0cm9rZTogI2ZmZjsKICAgICAgfQogIAogICAgICAudmlkZW9zdmcsCiAgICAgIC5pbWFnZXN2ZyB7CiAgICAgICAgd2lkdGg6IDR2dzsKICAgICAgICBoZWlnaHQ6IDR2dzsKICAgICAgICBwYWRkaW5nOiAwIC4yZW07CiAgICAgIH0KICAgICAgCiAgICAgIC52aWRlb3N2ZyBwYXRoLAogICAgICAuaW1hZ2VzdmcgcGF0aCB7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgYSNtZW51LCBhI2ZpbHRlci1saWtlcyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luLXRvcDogLS4zZW07CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgfQoKICAgICAgYSNtZW51IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBwYWRkaW5nOiAwIC4zZW0gMCAuNWVtOwogICAgICAgIGhlaWdodDogMi4xZW07CiAgICAgIH0KICAgICAgCiAgICAgIGEjZmlsdGVyLWxpa2VzIHsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB3aWR0aDogMS41ZW07CiAgICAgICAgaGVpZ2h0OiAxLjVlbTsKICAgICAgICBtYXJnaW46IC4xZW0gLjVlbTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgIH0KICAgICAgCiAgICAgIGEjZmlsdGVyLWxpa2VzIHN2ZyB7CiAgICAgICAgd2lkdGg6IDEuNWVtOwogICAgICAgIGhlaWdodDogMS41ZW07CiAgICAgIH0KICAgICAgIAogICAgICAubWVudXN2ZyB7CiAgICAgICAgd2lkdGg6IDJlbTsKICAgICAgICBoZWlnaHQ6IDJlbTsKICAgICAgfQoKICAgICAgLm1lbnVzdmcgcGF0aCB7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBtYXJnaW4tbGVmdDogLTE4ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzIyMjsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgei1pbmRleDogMzsgCiAgICAgICAgb3ZlcmZsb3c6IHNjcm9sbDsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudC5vcGVuIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgewogICAgICAgIHBhZGRpbmc6IDAgMWVtIDFlbSAxZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIGEsCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgcGFkZGluZzogLjVlbSAuN2VtOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHotaW5kZXg6IDM7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIG9wYWNpdHk6IC41OwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5Lm9wZW4gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIAogICAgICBzdmcgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAjdGVtcGxhdGUgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGRpdiBpZD0idGVtcGxhdGUiPgogICAgICA8c3ZnIGNsYXNzPSJoZWFydHN2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KICAgICAgICA8cGF0aCBkPSJNOS43MTksMTcuMDczbC02LjU2Mi02LjUxYy0wLjI3LTAuMjY4LTAuNTA0LTAuNTY3LTAuNjk2LTAuODg4QzEuMzg1LDcuODksMS42Nyw1LjYxMywzLjE1NSw0LjE0YzAuODY0LTAuODU2LDIuMDEyLTEuMzI5LDMuMjMzLTEuMzI5YzEuOTI0LDAsMy4xMTUsMS4xMiwzLjYxMiwxLjc1MmMwLjQ5OS0wLjYzNCwxLjY4OS0xLjc1MiwzLjYxMi0xLjc1MmMxLjIyMSwwLDIuMzY5LDAuNDcyLDMuMjMzLDEuMzI5YzEuNDg0LDEuNDczLDEuNzcxLDMuNzUsMC42OTMsNS41MzdjLTAuMTksMC4zMi0wLjQyNSwwLjYxOC0wLjY5NSwwLjg4N2wtNi41NjIsNi41MUMxMC4xMjUsMTcuMjI5LDkuODc1LDE3LjIyOSw5LjcxOSwxNy4wNzMgTTYuMzg4LDMuNjFDNS4zNzksMy42MSw0LjQzMSw0LDMuNzE3LDQuNzA3QzIuNDk1LDUuOTIsMi4yNTksNy43OTQsMy4xNDUsOS4yNjVjMC4xNTgsMC4yNjUsMC4zNTEsMC41MSwwLjU3NCwwLjczMUwxMCwxNi4yMjhsNi4yODEtNi4yMzJjMC4yMjQtMC4yMjEsMC40MTYtMC40NjYsMC41NzMtMC43MjljMC44ODctMS40NzIsMC42NTEtMy4zNDYtMC41NzEtNC41NkMxNS41Nyw0LDE0LjYyMSwzLjYxLDEzLjYxMiwzLjYxYy0xLjQzLDAtMi42MzksMC43ODYtMy4yNjgsMS44NjNjLTAuMTU0LDAuMjY0LTAuNTM2LDAuMjY0LTAuNjksMEM5LjAyOSw0LjM5Nyw3LjgyLDMuNjEsNi4zODgsMy42MSI+PC9wYXRoPgogICAgICA8L3N2Zz4KICAgICAgPHN2ZyBjbGFzcz0idmlkZW9zdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJCQk8cGF0aCBkPSJNMTguMTc1LDQuMTQySDEuOTUxQzEuNzAzLDQuMTQyLDEuNSw0LjM0NCwxLjUsNC41OTJ2MTAuODE2YzAsMC4yNDcsMC4yMDMsMC40NSwwLjQ1MSwwLjQ1aDE2LjIyNGMwLjI0NywwLDAuNDUtMC4yMDMsMC40NS0wLjQ1VjQuNTkyQzE4LjYyNSw0LjM0NCwxOC40MjIsNC4xNDIsMTguMTc1LDQuMTQyIE00LjY1NSwxNC45NTdIMi40MDF2LTEuODAzaDIuMjUzVjE0Ljk1N3pNNC42NTUsMTIuMjU0SDIuNDAxdi0xLjgwM2gyLjI1M1YxMi4yNTR6IE00LjY1NSw5LjU0OUgyLjQwMVY3Ljc0N2gyLjI1M1Y5LjU0OXogTTQuNjU1LDYuODQ2SDIuNDAxVjUuMDQzaDIuMjUzVjYuODQ2ek0xNC41NjksMTQuOTU3SDUuNTU2VjUuMDQzaDkuMDEzVjE0Ljk1N3ogTTE3LjcyNCwxNC45NTdoLTIuMjUzdi0xLjgwM2gyLjI1M1YxNC45NTd6IE0xNy43MjQsMTIuMjU0aC0yLjI1M3YtMS44MDNoMi4yNTNWMTIuMjU0ek0xNy43MjQsOS41NDloLTIuMjUzVjcuNzQ3aDIuMjUzVjkuNTQ5eiBNMTcuNzI0LDYuODQ2aC0yLjI1M1Y1LjA0M2gyLjI1M1Y2Ljg0NnoiPjwvcGF0aD4KCQkJPC9zdmc+CgkJCTxzdmcgY2xhc3M9ImltYWdlc3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgoJCQkJPHBhdGggZD0iTTE4LjU1NSwxNS4zNTRWNC41OTJjMC0wLjI0OC0wLjIwMi0wLjQ1MS0wLjQ1LTAuNDUxSDEuODg4Yy0wLjI0OCwwLTAuNDUxLDAuMjAzLTAuNDUxLDAuNDUxdjEwLjgwOGMwLDAuNTU5LDAuNzUxLDAuNDUxLDAuNDUxLDAuNDUxaDE2LjIxN2gwLjAwNUMxOC43OTMsMTUuODUxLDE4LjQ3OCwxNC44MTQsMTguNTU1LDE1LjM1NCBNMi44LDE0Ljk0OWw0Ljk0NC02LjQ2NGw0LjE0NCw1LjQxOWMwLjAwMywwLjAwMywwLjAwMywwLjAwMywwLjAwMywwLjAwNWwwLjc5NywxLjA0SDIuOHogTTEzLjgyMiwxNC45NDlsLTEuMDA2LTEuMzE3bDEuNjg5LTIuMjE4bDIuNjg4LDMuNTM1SDEzLjgyMnogTTE3LjY1NCwxNC4wNjRsLTIuNzkxLTMuNjY2Yy0wLjE4MS0wLjIzNy0wLjUzNS0wLjIzNy0wLjcxNiwwbC0xLjg5OSwyLjQ5M2wtNC4xNDYtNS40MmMtMC4xOC0wLjIzNy0wLjUzNi0wLjIzNy0wLjcxNiwwbC01LjA0Nyw2LjU5OFY1LjA0MmgxNS4zMTZWMTQuMDY0eiBNMTIuNDc0LDYuMzkzYy0wLjg2OSwwLTEuNTc3LDAuNzA3LTEuNTc3LDEuNTc2czAuNzA4LDEuNTc2LDEuNTc3LDEuNTc2czEuNTc3LTAuNzA3LDEuNTc3LTEuNTc2UzEzLjM0Myw2LjM5MywxMi40NzQsNi4zOTMgTTEyLjQ3NCw4LjY0NWMtMC4zNzEsMC0wLjY3Ni0wLjMwNC0wLjY3Ni0wLjY3NnMwLjMwNS0wLjY3NiwwLjY3Ni0wLjY3NmMwLjM3MiwwLDAuNjc2LDAuMzA0LDAuNjc2LDAuNjc2UzEyLjg0Niw4LjY0NSwxMi40NzQsOC42NDUiPjwvcGF0aD4KCQkJPC9zdmc+CiAgICAgIDxkaXYgaWQ9ImNvbHNjc3MiPgogICAgICAuY29scyR7Y29sc30gI2ltYWdlcyAuaXRlbSB7CiAgICAgICAgd2lkdGg6IGNhbGMoMTAwdncgLyAke2NvbHN9KTsKICAgICAgfQoKICAgICAgLmNvbHMke2NvbHN9ICNpbWFnZXMgLml0ZW0gewogICAgICAgIGhlaWdodDogY2FsYygxMDB2dyAvICR7Y29sc30pOwogICAgICB9CiAgICAgIAogICAgICAuY29scyR7Y29sc30gLnF1ZXJ5LAogICAgICAuY29scyR7Y29sc30gLmxpa2UgewogICAgICAgIGZvbnQtc2l6ZTogbWluKDE0dncgKiAoMSAvICR7Y29sc30pLCA2ZW0gKiAoMSAvICR7Y29sc30pKQogICAgICB9CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJtZWRpYS1mb290ZXIiPgogICAgICA8YSBpZD0iaW1hZ2UtbGlrZSIgY2xhc3M9Imxpa2UiIGhyZWY9IiMiPjwvYT4KICAgICAgPGEgaWQ9ImltYWdlLXF1ZXJ5IiBocmVmPSIjIj48L2E+CiAgICAgIDxhIGlkPSJpbWFnZS11c2VyIiBocmVmPSIjIj48L2E+CiAgICA8L2Rpdj4KICAgIDxjZW50ZXIgaWQ9Im1lZGlhLWNvbnRhaW5lciI+CiAgICAgIDxkaXYgaWQ9ImltYWdlLWNvbnRhaW5lciI+CiAgICAgICAgPGltZyBpZD0iaW1hZ2UiLz4KICAgICAgPC9kaXY+CiAgICA8L2NlbnRlcj4KICAgIDxkaXYgaWQ9Im1lbnUtb3ZlcmxheSI+PC9kaXY+CiAgICA8ZGl2IGlkPSJtZW51LWNvbnRlbnQiIGNsYXNzPSJ0ZXN0Ij4KICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5hdXRvcGxheTwvZGl2PgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0ib24iIGhyZWY9IiMiPm9uPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0ib2ZmIiBocmVmPSIjIj5vZmY8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJob3ZlciIgaHJlZj0iIyI+bW91c2VvdmVyPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5jb2x1bW5zPC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMSIgaHJlZj0iIyI+MTwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSIyIiBocmVmPSIjIj4yPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjQiIGhyZWY9IiMiPjQ8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iNiIgaHJlZj0iIyI+NjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSIxMCIgaHJlZj0iIyI+MTA8L2E+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmNvbm5lY3Rpb25zPC9kaXY+CiAgICAgICAgPGRpdiBpZD0iY29ubmNvdW50Ij4wPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPnJlbGF5czo8L2Rpdj4KICAgICAgICA8cD5QbGVhc2UgdXNlIHJlbGF5cyB3aXRoIE5JUC01MCAoc2VhcmNoKSBmdW5jdGlvbmFsaXR5PC9wPgogICAgICAgIDxmb3JtIGFjdGlvbj0iIyIgaWQ9InJlbGF5cy1mb3JtIj4KICAgICAgICAgIDx0ZXh0YXJlYSBpZD0icmVsYXlzIj48L3RleHRhcmVhPgogICAgICAgICAgPGlucHV0IGNsYXNzPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9InNhdmUgcmVsYXlzIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5wcml2YXRlIGtleTo8L2Rpdj4KICAgICAgICA8cD5JZiB5b3UgY2FudCB1c2UgYnJvd3NlciBhZGRvbiAobW9iaWxlKTwvcD4KICAgICAgICA8Zm9ybSBhY3Rpb249IiMiIGlkPSJwcml2a2V5LWZvcm0iPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJwcml2a2V5Ii8+CiAgICAgICAgICA8aW5wdXQgY2xhc3M9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0ic2F2ZSBrZXkiLz4KICAgICAgICA8L2Zvcm0+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmxvZ3M8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJsb2dzIj48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+bGF0ZXN0IHJlbGVhc2U6PC9kaXY+CiAgICAgICAgPGEgaWQ9InJlbGVhc2UiIGhyZWY9IiMiPjwvYT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9ImhlYWRlciI+CiAgICAgIDxhIGlkPSJmaWx0ZXItbGlrZXMiIGhyZWY9IiMiPjwvYT4KICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxhIGlkPSJtZW51IiBocmVmPSIjIj4KICAgICAgICAgIDxzdmcgY2xhc3M9Im1lbnVzdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJICAgICAgICA8cGF0aCBkPSJNMTAsMS40NDVjLTQuNzI2LDAtOC41NTUsMy44MjktOC41NTUsOC41NTVjMCw0LjcyNSwzLjgyOSw4LjU1NSw4LjU1NSw4LjU1NWM0LjcyNSwwLDguNTU1LTMuODMsOC41NTUtOC41NTVDMTguNTU1LDUuMjc0LDE0LjcyNSwxLjQ0NSwxMCwxLjQ0NSBNMTAsMTcuNjU0Yy00LjIyMSwwLTcuNjU0LTMuNDM0LTcuNjU0LTcuNjU0YzAtNC4yMjEsMy40MzMtNy42NTQsNy42NTQtNy42NTRjNC4yMjIsMCw3LjY1NCwzLjQzMyw3LjY1NCw3LjY1NEMxNy42NTQsMTQuMjIxLDE0LjIyMiwxNy42NTQsMTAsMTcuNjU0IE0xNC4zOSwxMGMwLDAuMjQ4LTAuMjAzLDAuNDUtMC40NSwwLjQ1SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMy0wLjQ1LTAuNDVzMC4yMDMtMC40NSwwLjQ1LTAuNDVoNy44NzlDMTQuMTg3LDkuNTUsMTQuMzksOS43NTIsMTQuMzksMTAgTTE0LjM5LDEyLjcwMmMwLDAuMjQ3LTAuMjAzLDAuNDQ5LTAuNDUsMC40NDlINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAyLTAuNDUtMC40NDljMC0wLjI0OCwwLjIwMy0wLjQ1MSwwLjQ1LTAuNDUxaDcuODc5QzE0LjE4NywxMi4yNTEsMTQuMzksMTIuNDU0LDE0LjM5LDEyLjcwMiBNMTQuMzksNy4yOThjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw2Ljg0OCwxNC4zOSw3LjA1MSwxNC4zOSw3LjI5OCI+PC9wYXRoPgoJICAgICAgICA8L3N2Zz4KICAgICAgICA8L2E+CiAgICAgICAgPGEgaWQ9InRpdGxlIiBocmVmPSIjIj5maWxlcy5odG1sPC9hPgogICAgICAgIDxmb3JtIGlkPSJxdWVyeS1mb3JtIiBhY3Rpb249IiMiPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJxdWVyeSIgbmFtZT0icXVlcnkiIGlkPSIiIC8+CiAgICAgICAgICA8c2VsZWN0IGlkPSJxdWVyeS10eXBlIj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iYWxsIj5hbGw8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaW1hZ2UiPmltYWdlczwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ2aWRlbyI+dmlkZW9zPC9vcHRpb24+CiAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgIDxpbnB1dCBpZD0iZ28iIHR5cGU9InN1Ym1pdCIgdmFsdWU9ImdvIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxzcGFuIGlkPSJxdWVyeWRpc3BsYXkiPgogICAgICAgICAgPHNwYW4gY2xhc3M9InRleHQiPjwvc3Bhbj4KICAgICAgICA8L3NwYW4+CiAgICAgICAgPGRpdiBpZD0ibG9hZGluZyI+dXBkYXRpbmc8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9ImltYWdlcyI+PC9kaXY+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly91bnBrZy5jb20vbm9zdHItdG9vbHMvbGliL25vc3RyLmJ1bmRsZS5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9zbG93bGkuZ2l0aHViLmlvL2JlY2gzMi1idWZmZXIvYXNzZXRzL2pzL2JlY2gzMi1idWZmZXIubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQ+CiAgICAgIGNvbnN0IHVwZGF0ZXNwdWJrZXkgPSAiYWU1YzZlMGI3NDY2MGQyMTk0YzgyNTRiNWMyYzgyNTY3NjU3NmJlMDI5NzM3OWZhMjA1MjMxMTRhNmE4NWU4NyIKICAgICAgY29uc3QgcXVlcmllcyA9IHsKICAgICAgICAiZ2xvYmFsIjogJ1siUkVRIiwiPEk+Iix7ImNhY2hlIjpbImV4cGxvcmUiLHsidGltZWZyYW1lIjoibGF0ZXN0Iiwic2NvcGUiOiJnbG9iYWwiLCJsaW1pdCI6PEw+fV19XScsIAogICAgICAgICJhdXRob3IiOiAnWyJSRVEiLCI8ST4iLHsia2luZHMiOlsxXSwiYXV0aG9ycyI6WyI8UD4iXX1dJywKICAgICAgICAicmVhY3Rpb25zIjogJ1siUkVRIiwiPEk+IiwgeyJraW5kcyI6WzddLCIjZSI6IDxFPn1dJwogICAgICB9CiAgICAgIHFzKCIjcmVsYXlzIikudmFsdWUgPSByZWxheXMoKS5qb2luKCJcbiIpCiAgICAgIHFzKCIjcHJpdmtleSIpLnZhbHVlID0gcHJpdmtleSgpCiAgICAgIGNvbnN0IGNvbG9wdHMgPSBbMSwgMiwgNCwgNiwgMTBdCgogICAgICBjb2xzID0gKCkgPT4gcGFyc2VJbnQoc2V0dGluZygiY29scyIsIGNvbG9wdHNbMV0pLCAxMCkKICAgICAgYXV0b3BsYXkgPSAoKSA9PiBzZXR0aW5nKCJhdXRvcGxheSIsICJvZmYiKQogICAgICBsaW1pdCA9ICgpID0+IHBhcnNlSW50KHNldHRpbmcoImxpbWl0IiwgMTUpLCAxMCkKICAgICAgCiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgiY29scyIgKyBjb2xzKCkpCiAgICAgIAogICAgICBsZXQgcHJvdG9jb2wgPSBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvKSA/ICJub3N0cjoiIDogIndlYitub3N0cjoiCiAgICAgIGxldCBzb2NrZXRzID0gW10KICAgICAgbGV0IHJlc2hhbmRsZXJzID0gW10KICAgICAgbGV0IHVybHMgPSBbXQogICAgICBsZXQgbGlrZXMgPSBbXQogICAgICBsZXQgbmV3bGlrZXMgPSBbXQogICAgICBsZXQgaWRjb3VudGVyID0gMAogICAgICBsZXQgcXVlcnl3YWl0ID0gbnVsbAogICAgICBsZXQgcHJpbWFsc29ja2V0ID0gbnVsbAogICAgICBsZXQgdHlwZXMgPSB7CiAgICAgICAgaW1hZ2U6IFsicG5nIiwgImpwZyIsICJqcGVnIiwgIndlYnAiXSwKICAgICAgICB2aWRlbzogWyJtcDQiLCAid2VibSJdCiAgICAgIH0KICAgICAgbGV0IGltZ3JlZ2V4ID0gL2h0dHAofHMpXDpcL1wvW14gXG5dKj9cLihwbmd8anBnfGpwZWd8d2VicCkvZ2kKICAgICAgbGV0IHZpZGVvcmVnZXggPSAvaHR0cCh8cylcOlwvXC9bXiBcbl0qP1wuKG1wNHx3ZWJtKS9naQogICAgICBsZXQgdmlkZW9leHRyZWdleCA9IC9cLihtcDR8d2VibSkkL2kKICAgICAgbGV0IGltZ2V4dHJlZ2V4ID0gL1wuKHBuZ3xqcGd8anBlZ3x3ZWJwKSQvaQogICAgICB3YWl0bXMgPSA1MDAwCiAgICAgIHF1ZXJ5c3RyID0gIiIKICAgICAgbGV0IHF1ZXJ5Y291bnQgPSAwCiAgICAgIGxldCBob3ZlcmVkdmlkZW8gPSBudWxsCiAgICAgIAogICAgICB1cGRhdGVxdWVyeSgpCiAgICAgIHFzKCIjaW1hZ2UtbGlrZSIpLmlubmVySFRNTCA9IHFzKCIjZmlsdGVyLWxpa2VzIikuaW5uZXJIVE1MID0gcXMoIiN0ZW1wbGF0ZSAuaGVhcnRzdmciKS5vdXRlckhUTUwKICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgIHNldGFjdGl2ZSgic2V0YXV0b3BsYXkiLCAiYXV0b3BsYXkiLCBhdXRvcGxheSgpKQogICAgICAKICAgICAgZnVuY3Rpb24gZnJvbUhleFN0cmluZyhzdHIpewogICAgICAgIGxldCBidWZmZXIgPSBuZXcgVWludDhBcnJheShzdHIubGVuZ3RoIC8gMikKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlci5sZW5ndGg7IGkrKykgewogICAgICAgICAgYnVmZmVyW2ldID0gcGFyc2VJbnQoc3RyLnN1YnN0cigyICogaSwgMiksIDE2KQogICAgICAgIH0KICAgICAgICByZXR1cm4gYnVmZmVyCiAgICAgIH0KICAKICAgICAgZnVuY3Rpb24gcmVsYXlzKCl7CiAgICAgICAgY29uc3Qgb2JqID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgicmVsYXlzIikpCiAgICAgICAgY29uc3QgciA9IG9iaiAmJiBvYmouZmlsdGVyKHIgPT4gci5tYXRjaCgvd3NzOlwvXC8uKy8pKSB8fCBbXQogICAgICAgIAogICAgICAgIHJldHVybiByLmxlbmd0aCA+IDAgJiYgciB8fCBbCiAgICAgICAgICAid3NzOi8vcmVsYXkubm9zdHIuYmFuZCIsCiAgICAgICAgICAid3NzOi8vbmIucmVsYXkuY2VudGVyIiwgCiAgICAgICAgICAid3NzOi8vbm9zdHIuY29tcGlsZS1lcnJvci5uZXQiCiAgICAgICAgXQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBwcml2a2V5KCl7CiAgICAgICAgbGV0IGtleSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJwcml2a2V5IikgfHwgIiIKICAgICAgICAKICAgICAgICBpZihrZXkubGVuZ3RoID09IDYzKXsKICAgICAgICAgIGtleSA9IE5vc3RyVG9vbHMubmlwMTkuZGVjb2RlKGtleSkuZGF0YQogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4ga2V5Lmxlbmd0aCA9PSA2NCAmJiBrZXkgfHwgbnVsbAogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzZXR0aW5nKGtleSwgZGVmYXVsdHZhbHVlKXsKICAgICAgICBjb25zdCB2ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KQogICAgICAgIHJldHVybiB2ICYmIG9wdGlvbigic2V0IiArIGtleSwga2V5LCB2KSAmJiB2IHx8IGRlZmF1bHR2YWx1ZQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBvcHRpb24oYywga2V5LCB2YWwpewogICAgICAgIHJldHVybiBxcygiLiIgKyBjICsgIltkYXRhLSIgKyBrZXkgKyAiPSciICsgdmFsICsgIiddIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXMocSl7CiAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXNhKHEpewogICAgICAgIHJldHVybiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocSkpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGdpZChpKXsKICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXVlcnl0eXBlKCl7CiAgICAgICAgcmV0dXJuIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlIHx8ICJhbGwiCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZXF1ZXJ5KCl7CiAgICAgICAgbGV0IHBhcnRzID0gZGVjb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpKS5zcGxpdCgiLyIpCiAgICAgICAgcXVlcnlzdHIgPSBxcygiI3F1ZXJ5ZGlzcGxheSAudGV4dCIpLmlubmVyVGV4dCA9IHBhcnRzWzBdCiAgICAgICAgcXMoIiNxdWVyeSIpLnZhbHVlID0gcGFydHNbMF0KICAgICAgICBxcygiI3F1ZXJ5LXR5cGUiKS52YWx1ZSA9IHBhcnRzWzFdIHx8ICJhbGwiCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGFjdGl2ZSgpewogICAgICAgIHJldHVybiBxcygiI2ltYWdlcyAuYWN0aXZlIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gaW1hZ2VvZmZzZXQob2Zmc2V0KXsKICAgICAgICBjb25zdCBpbWFnZXMgPSBxc2EoIiNpbWFnZXMgPiAuaXRlbSIpLmZpbHRlcihlID0+IGUuc3R5bGUuZGlzcGxheSA9PSAiYmxvY2siKQogICAgICAgIHJldHVybiBpbWFnZXNbaW1hZ2VzLmluZGV4T2YoYWN0aXZlKCkpK29mZnNldF0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gbGFzdGFjdGl2ZSgpewogICAgICAgIHJldHVybiBxc2EoIiNpbWFnZXMgLmFjdGl2ZSIpLnBvcCgpICAgICAgCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIG1lbnUoKXsKICAgICAgICBxc2EoIiNtZW51LWNvbnRlbnQsICNtZW51LW92ZXJsYXkiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QudG9nZ2xlKCJvcGVuIikpCiAgICAgIH0KICAKICAgICAgZnVuY3Rpb24gc2V0YWN0aXZlKGMsIGtleSwgdmFsKXsKICAgICAgICBxc2EoIi4iICsgYykuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikpCiAgICAgICAgY29uc3Qgb3B0aW9uID0gcXMoIi4iICsgYyArICJbZGF0YS0iICsga2V5ICsgIj0nIiArIHZhbCArICInXSIpCiAgICAgICAgb3B0aW9uPy5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzY3JvbGx2aXNpYmxlKG4sIG9mZnNldCl7CiAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDAKICAgICAgICByZXR1cm4gKG4ub2Zmc2V0VG9wICsgbi5vZmZzZXRIZWlnaHQpID49IChzY3JvbGxZIC0gb2Zmc2V0KQogICAgICAgICAgJiYgbi5vZmZzZXRUb3AgPD0gKHNjcm9sbFkgKyB2aXN1YWxWaWV3cG9ydC5oZWlnaHQgKyBvZmZzZXQpCiAgICAgIH0KCiAgICAgIGxldCBpbWFnZXVwZGF0ZXRpbWUgPSAwCiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiB1cGRhdGVpbWFnZXNsb2FkKCl7CiAgICAgICAgbGV0IHQgPSBEYXRlLm5vdygpCiAgICAgICAgaWYodCAtIGltYWdldXBkYXRldGltZSA8IDEwMCl7CiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaW1hZ2V1cGRhdGV0aW1lID0gdAoKICAgICAgICBxc2EoIiNpbWFnZXMgLml0ZW0uaW1nIikuZm9yRWFjaChhc3luYyBpbWcgPT4gewogICAgICAgICAgaWYoc2Nyb2xsdmlzaWJsZShpbWcsIHZpc3VhbFZpZXdwb3J0LmhlaWdodCAvIDIpKXsKICAgICAgICAgICAgaW1nLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICJ1cmwoIiArIGltZ1siZGF0YS1zcmMiXSArICIpIgogICAgICAgICAgICBjb25zb2xlLmxvZygic2V0IGJnIiwgaW1nWyJkYXRhLXNyYyJdKQogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIGltZy5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAiIgogICAgICAgICAgfQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgY29uc29sZS5sb2coInVwZGF0ZWltYWdlc2xvYWQgbXMiLCBEYXRlLm5vdygpIC0gdCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlYWxsdmlkZW9wbGF5KCl7CiAgICAgICAgcXNhKCIjaW1hZ2VzIC5pdGVtLnZpZGVvIikuZm9yRWFjaChhc3luYyBuID0+IHVwZGF0ZXZpZGVvcGxheShuKSkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRldmlkZW9wbGF5KG4pewogICAgICAgIGNvbnN0IGFwbGF5ID0gYXV0b3BsYXkoKQogICAgICAgIGNvbnN0IHYgPSBuLnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAKICAgICAgICBpZihhcGxheSAhPSAib24iKXsKICAgICAgICAgIHYubXV0ZWQgPSBmYWxzZQogICAgICAgICAgdi5wYXVzZSgpCiAgICAgICAgfWVsc2V7CiAgICAgICAgICB2Lm11dGVkID0gdHJ1ZQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZighc2Nyb2xsdmlzaWJsZShuKSl7CiAgICAgICAgICBpZih2LnJlYWR5U3RhdGUgPT0gNCl7CiAgICAgICAgICAgIHYucGF1c2UoKQogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIHYucHJlbG9hZCA9ICJub25lIgogICAgICAgICAgfQogICAgICAgIH1lbHNlIGlmKHYucmVhZHlTdGF0ZSAhPSA0KXsKICAgICAgICAgIHYucHJlbG9hZCA9ICJhdXRvIgogICAgICAgIH0KICAgICAgICBlbHNlIGlmKGFwbGF5ID09ICJvbiIgfHwgKGFwbGF5ID09ICJob3ZlciIgJiYgdiA9PSBob3ZlcmVkdmlkZW8pKXsKICAgICAgICAgIHYucGxheSgpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLCBlID0+IHsKICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpCiAgICAgICAgdXBkYXRlaW1hZ2VzbG9hZCgpCiAgICAgICAgdXBkYXRlYWxsdmlkZW9wbGF5KCkKICAgICAgfSkKICAgICAgCiAgICAgIGxldCB0b3VjaCA9IG51bGwKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCBlID0+IHRvdWNoID0gZS5jaGFuZ2VkVG91Y2hlc1swXSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIiwgZSA9PiB7CiAgICAgICAgY29uc3QgeGRpZmYgPSBlLmNoYW5nZWRUb3VjaGVzWzBdLnNjcmVlblggLSB0b3VjaC5zY3JlZW5YCgogICAgICAgIGlmKHhkaWZmIDwgLTUwKXsKICAgICAgICAgIHN3aXBlKDEpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKHhkaWZmID4gNTApewogICAgICAgICAgc3dpcGUoLTEpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgcXMoIiNxdWVyeS1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgbG9jYXRpb24uaGFzaCA9ICIjIiArIGVuY29kZVVSSUNvbXBvbmVudChxcygiI3F1ZXJ5IikudmFsdWUgKyAiLyIgKyBxdWVyeXR5cGUoKSkKICAgICAgICB1cGRhdGVxdWVyeSgpCiAgICAgICAgcXVlcnl3YWl0LnJlc29sdmUoKQogICAgICB9KQoKICAgICAgcXMoIiNyZWxheXMtZm9ybSIpLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsIGFzeW5jIGUgPT4gewogICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIGxldCByID0gSlNPTi5zdHJpbmdpZnkocXMoIiNyZWxheXMiKS52YWx1ZS5zcGxpdCgiXG4iKSkKICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgicmVsYXlzIiwgcikKICAgICAgICBkaXNjb25uZWN0KCkKICAgICAgfSkKCiAgICAgIHFzKCIjcHJpdmtleS1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgYXN5bmMgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgY29uc3Qga2V5ID0gcXMoIiNwcml2a2V5IikudmFsdWUKCiAgICAgICAgaWYoa2V5Lmxlbmd0aCAhPSA2NCAmJiBrZXkubGVuZ3RoICE9IDYzKXsKICAgICAgICAgIGFsZXJ0KCJrZXkgc2hvdWxkIGJlIDYzIG9yIDY0IGNoYXJhY3RlcnMgbG9uZyIpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oInByaXZrZXkiLCBrZXkpCiAgICAgICAgYWxlcnQoImtleSBzYXZlZCIpCiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLCBhc3luYyAoZSkgPT4gewogICAgICAgIGlmKGF1dG9wbGF5KCkgPT0gImhvdmVyIiAmJiBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInZpZGVvLWNvbnRhaW5lciIpKXsKICAgICAgICAgIGhvdmVyZWR2aWRlbyA9IGUudGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAgIGhvdmVyZWR2aWRlby5wbGF5KCkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaG92ZXJlZHZpZGVvID0gZmFsc2UKICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLnN0eWxlLmRpc3BsYXkgIT0gImJsb2NrIiAmJiBhdXRvcGxheSgpID09ICJob3ZlciIgJiYgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2aWRlby1jb250YWluZXIiKSl7CiAgICAgICAgICBxc2EoInZpZGVvIikuZm9yRWFjaCh2ID0+IHYucGF1c2UoKSkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaWYoZS50YXJnZXQudHlwZSA9PSAic3VibWl0IiB8fCAoZS50YXJnZXQudGFnTmFtZSA9PSAiQSIgJiYgZS50YXJnZXQuaHJlZi5tYXRjaCgvXih8d2ViXCspbm9zdHJcOi8pKSl7CiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAidGl0bGUiKXsKICAgICAgICAgIHFzKCIjcXVlcnkiKS52YWx1ZSA9ICIiCiAgICAgICAgICBxcygiI3F1ZXJ5LXR5cGUiKS52YWx1ZSA9ICJhbGwiCiAgICAgICAgICBxcygiI2dvIikuY2xpY2soKQogICAgICAgIH0KCiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJmaWx0ZXItbGlrZXMiKXsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnRvZ2dsZSgiZmlsdGVyLWxpa2VzIikKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBsZXQgbiA9IGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2hvdyIpICYmIGUudGFyZ2V0IHx8IGUudGFyZ2V0LnBhcmVudEVsZW1lbnQKCiAgICAgICAgaWYobi5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKSl7CiAgICAgICAgICBhY3RpdmUoKT8uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIGdpZChuLmlkKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgc2hvdyhuLmlkKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUudGFyZ2V0LnRhZ05hbWUgIT0gIkEiICYmIChxcygiI2ltYWdlLWNvbnRhaW5lciIpID09IGUudGFyZ2V0IHx8IHFzKCIjaW1hZ2UiKSA9PSBlLnRhcmdldCB8fCBxcygiI21lZGlhLWNvbnRhaW5lciB2aWRlbyIpID09IGUudGFyZ2V0KSl7CiAgICAgICAgICBoaWRlbWVkaWEoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAibWVudSIgfHwgZS50YXJnZXQuaWQgPT0gIm1lbnUtb3ZlcmxheSIpewogICAgICAgICAgbWVudSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2V0Y29scyIpKXsKICAgICAgICAgIGZvcihsZXQgYyBvZiBjb2xvcHRzKXsKICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCJjb2xzIiArIGMpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgiY29scyIgKyBlLnRhcmdldC5kYXRhc2V0LmNvbHMpCiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiY29scyIsIGUudGFyZ2V0LmRhdGFzZXQuY29scykKICAgICAgICAgIHNldGFjdGl2ZSgic2V0Y29scyIsICJjb2xzIiwgY29scygpKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogIAogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2V0YXV0b3BsYXkiKSl7CiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiYXV0b3BsYXkiLCBlLnRhcmdldC5kYXRhc2V0LmF1dG9wbGF5KQogICAgICAgICAgc2V0YWN0aXZlKCJzZXRhdXRvcGxheSIsICJhdXRvcGxheSIsIGF1dG9wbGF5KCkpCiAgICAgICAgICB1cGRhdGVhbGx2aWRlb3BsYXkoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygibGlrZSIpICYmIGxpa2UoZS50YXJnZXQpCiAgICAgIH0pCiAgICAgIAogICAgICBmdW5jdGlvbiBoYXNrZXkoKXsKICAgICAgICByZXR1cm4gd2luZG93Lm5vc3RyIHx8IHByaXZrZXkoKQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBwdWJrZXkoKXsKICAgICAgICByZXR1cm4gd2luZG93Lm5vc3RyICYmIGF3YWl0IHdpbmRvdy5ub3N0ci5nZXRQdWJsaWNLZXkoKSB8fCBOb3N0clRvb2xzLmdldFB1YmxpY0tleShwcml2a2V5KCkpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHNpZ24oZXZlbnQpewogICAgICAgIGlmKHdpbmRvdy5ub3N0cil7CiAgICAgICAgICByZXR1cm4gYXdhaXQgbm9zdHIuc2lnbkV2ZW50KGV2ZW50KQogICAgICAgIH0KICAgICAgICAKICAgICAgICBldmVudC5zaWcgPSBOb3N0clRvb2xzLmdldFNpZ25hdHVyZShldmVudCwgcHJpdmtleSgpKQogICAgICAgIHJldHVybiBldmVudAogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBsaWtlKGxpbmspewogICAgICAgIGNvbnN0IGV2ZW50ID0gbGluay5wYXJlbnRFbGVtZW50WyJkYXRhLWV2ZW50Il0KICAgICAgICBjb25zdCBwdWJrID0gYXdhaXQgcHVia2V5KCkKICAgICAgICBjb25zdCBsaWtlID0gYXdhaXQgc2lnbih7CiAgICAgICAgICAia2luZCI6IDcsCiAgICAgICAgICAiY29udGVudCI6ICIrIiwKICAgICAgICAgICJ0YWdzIjogWwogICAgICAgICAgICBbImUiLCBldmVudC5pZF0sCiAgICAgICAgICAgIFsicCIsIGV2ZW50LnB1YmtleV0KICAgICAgICAgIF0sCiAgICAgICAgICAicHVia2V5IjogcHViaywKICAgICAgICAgICJjcmVhdGVkX2F0IjogcGFyc2VJbnQoRGF0ZS5ub3coKSAvIDEwMDAgLCAxMCkKICAgICAgICB9KQogICAgICAgIAogICAgICAgIHNvY2tldHMuZm9yRWFjaChzID0+IHMuc2VuZChKU09OLnN0cmluZ2lmeShbIkVWRU5UIiwgbGlrZV0pKSkKICAgICAgICBsaW5rLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQoKICAgICAgICBjb25zdCBpbWFnZWlkID0gbGlua1siZGF0YS1pdGVtLWlkIl0gfHwgbGluay5kYXRhc2V0LmltYWdlSWQKICAgICAgICAKICAgICAgICBpZihpbWFnZWlkKXsKICAgICAgICAgIGdpZChpbWFnZWlkKS5xdWVyeVNlbGVjdG9yKCIubGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgIH0KICAgICAgfQogICAgCiAgICAgIGZ1bmN0aW9uIHN3aXBlKG9mZnNldCl7CiAgICAgICAgaWYoaW1hZ2VvZmZzZXQob2Zmc2V0KSl7CiAgICAgICAgICBpbWFnZW9mZnNldChvZmZzZXQpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICB0aGlzW29mZnNldCA9PSAxICYmICJsYXN0YWN0aXZlIiB8fCAiYWN0aXZlIl0oKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgdXBkYXRlc2hvdygpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVzaG93KCl7CiAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5zdHlsZS5kaXNwbGF5ID09ICJibG9jayIpewogICAgICAgICAgaGlkZXZpZGVvKCkKICAgICAgICAgIHNob3coYWN0aXZlKCkuaWQpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgZSA9PiB7CiAgICAgICAgaWYoWyJUYWIiLCAiQXJyb3dMZWZ0IiwgIkFycm93UmlnaHQiLCAiQXJyb3dVcCIsICJBcnJvd0Rvd24iXS5pbmNsdWRlcyhlLmtleSkpewogICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiRXNjYXBlIil7CiAgICAgICAgICBtZW51KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLmtleSA9PSAiRW50ZXIiICYmIGUudGFyZ2V0LnRhZ05hbWUgPT0gIkJPRFkiKXsKICAgICAgICAgIGlmKHFzKCIjbWVkaWEtY29udGFpbmVyIikuc3R5bGUuZGlzcGxheSA9PSAiYmxvY2siKXsKICAgICAgICAgICAgaGlkZW1lZGlhKCkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHNob3coYWN0aXZlKCkuaWQpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd1VwIiAmJiBpbWFnZW9mZnNldCgtY29scygpKSl7CiAgICAgICAgICBpbWFnZW9mZnNldCgtY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgbGFzdGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICB1cGRhdGVzaG93KCkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd0Rvd24iICYmIGltYWdlb2Zmc2V0KGNvbHMoKSkpewogICAgICAgICAgaW1hZ2VvZmZzZXQoY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgYWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIHVwZGF0ZXNob3coKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93TGVmdCIpewogICAgICAgICAgc3dpcGUoLTEpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dSaWdodCIpewogICAgICAgICAgc3dpcGUoMSkKICAgICAgICB9CiAgICAgIH0pCgogICAgICBhc3luYyBmdW5jdGlvbiBoYW5kbGVxdWVyeXJlcyhyZXMsIHNvY2tldCwgcSwgdHlwZSwgc3RpbWUpewogICAgICAgIHNhdmUoc29ja2V0LCByZXMsIHEsIHR5cGUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkKICAgICAgICBsb2coInF1ZXJ5IHJlcyIsIHJlcy5sZW5ndGgsIHNvY2tldC51cmwpCiAgICAgICAgcXVlcnljb3VudC0tCiAgICAgICAgaWYocXVlcnljb3VudCA9PSAwKXsKICAgICAgICAgIHFzKCIjbG9hZGluZyIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSIKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbGV0IHdhaXQgPSB3YWl0bXMgLSAoRGF0ZS5ub3coKSAtIHN0aW1lKQogICAgICAgIHF1ZXJ5d2FpdCA9IHNsZWVwKHdhaXQpCiAgICAgICAgYXdhaXQgcXVlcnl3YWl0LnByb21pc2UKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcHJpbWFsZ2xvYmFsKHNvY2tldCl7CiAgICAgICAgbG9nKCJnbG9iYWwiLCBzb2NrZXQudXJsKQogICAgICAgIHF1ZXJ5Y291bnQrKwogICAgICAgIHFzKCIjbG9hZGluZyIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgICAgbGV0IHN0aW1lID0gRGF0ZS5ub3coKQogICAgICAgIGxldCBxaWQgPSAiZ2xvYmFsXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgbGV0IHFpZGxpa2VzID0gImxpa2VzXyIgKyAoKytpZGNvdW50ZXIpCgogICAgICAgIGlmKG5ld2xpa2VzLmxlbmd0aCA+IDApewogICAgICAgICAgcHJpbWFsc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoWwogICAgICAgICAgICAiUkVRIiwgCiAgICAgICAgICAgIHFpZGxpa2VzLCAKICAgICAgICAgICAgewogICAgICAgICAgICAgICJjYWNoZSI6IFsKICAgICAgICAgICAgICAgICJldmVudHMiLCB7CiAgICAgICAgICAgICAgICAgICJldmVudF9pZHMiOiBuZXdsaWtlcwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIF0KICAgICAgICAgICAgfQogICAgICAgICAgXSkpCgogICAgICAgICAgY29uc3QgbGlrZV9ldmVudHMgPSBhd2FpdCB3YWl0cmVzKHFpZGxpa2VzKQogICAgICAgICAgbmV3bGlrZXMuc3BsaWNlKDApCiAgICAgICAgICAKICAgICAgICAgIGF3YWl0IHNhdmUoc29ja2V0LCBsaWtlX2V2ZW50cywgIiIsICJhbGwiLCB0cnVlLCB0cnVlLCBmYWxzZSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoWwogICAgICAgICAgIlJFUSIsIAogICAgICAgICAgcWlkLCAKICAgICAgICAgIHsKICAgICAgICAgICAgImNhY2hlIjogWwogICAgICAgICAgICAgICJleHBsb3JlIiwgCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInRpbWVmcmFtZSI6ICJsYXRlc3QiLAogICAgICAgICAgICAgICAgInNjb3BlIjogImdsb2JhbCIsCiAgICAgICAgICAgICAgICAibGltaXQiOiAyMAogICAgICAgICAgICAgIH0KICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0pKQogICAgICAgIAogICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHdhaXRyZXMocWlkKQogICAgICAgIGF3YWl0IGhhbmRsZXF1ZXJ5cmVzKHJlcy5maWx0ZXIoZSA9PiBlLmtpbmQgPT0gMSksIHNvY2tldCwgIiIsICJhbGwiLCBzdGltZSkKICAgICAgICBwcmltYWxnbG9iYWwoc29ja2V0KQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeShzb2NrZXQsIHByaW1hbCl7CiAgICAgICAgbG9nKCJxdWVyeSIsIHNvY2tldC51cmwpCiAgICAgICAgcXVlcnljb3VudCsrCiAgICAgICAgcXMoIiNsb2FkaW5nIikuc3R5bGUuZGlzcGxheSA9ICJibG9jayIKICAgICAgICAKICAgICAgICBsZXQgc3RpbWUgPSBEYXRlLm5vdygpCiAgICAgICAgbGV0IHEgPSBxdWVyeXN0ci50cmltKCkKICAgICAgICBsZXQgdHlwZSA9IHF1ZXJ5dHlwZSgpCiAgICAgICAgbGV0IGkgPSArK2lkY291bnRlcgogICAgICAgIGxldCBxaWQgPSAicXVlcnlfIiArIGkKICAgICAgICBsZXQgZmlsdGVycyA9IFtdCgogICAgICAgIGZpbHRlcnMucHVzaCguLi4odHlwZXNbdHlwZV0gfHwgW10pLm1hcCgodCkgPT4gewogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAga2luZHM6IFsxXSwgCiAgICAgICAgICAgIHNlYXJjaDogIi4iICsgdCwKICAgICAgICAgICAgbGltaXQ6IDIwCiAgICAgICAgICB9CiAgICAgICAgfSkpCiAgICAgICAgCiAgICAgICAgaWYocS5sZW5ndGggPiAwKXsKICAgICAgICAgIGZpbHRlcnMucHVzaCh7a2luZHM6IFsxXSwgc2VhcmNoOiBxfSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZmlsdGVycy5sZW5ndGggPT0gMCl7CiAgICAgICAgICBmaWx0ZXJzLnB1c2goe2tpbmRzOiBbMV19KQogICAgICAgIH0KICAgICAgICAKICAgICAgICAKICAgICAgICBjb25zdCBsaWtlc3JlcyA9IGF3YWl0IHF1ZXJ5bGlrZXMoc29ja2V0KQogICAgICAgIAogICAgICAgIGxpa2VzcmVzLmZvckVhY2goZXZlbnRpZCA9PiB7CiAgICAgICAgICBpZighbGlrZXMuaW5jbHVkZXMoZXZlbnRpZCkpewogICAgICAgICAgICBsaWtlcy5wdXNoKGV2ZW50aWQpCiAgICAgICAgICAgIG5ld2xpa2VzLnB1c2goZXZlbnRpZCkKICAgICAgICAgIH0KICAgICAgICB9KQogICAgICAgIAogICAgICAgIGNvbnN0IHNlYXJjaG9iaiA9IFsiUkVRIiwgcWlkLCAuLi5maWx0ZXJzXQogICAgICAgIGNvbnN0IHNlYXJjaGpzb24gPSBKU09OLnN0cmluZ2lmeShzZWFyY2hvYmopCiAgICAgICAgc29ja2V0LnNlbmQoc2VhcmNoanNvbikKICAgICAgICAKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB3YWl0cmVzKHFpZCkKICAgICAgICBhd2FpdCBoYW5kbGVxdWVyeXJlcyhyZXMsIHNvY2tldCwgcSwgdHlwZSwgc3RpbWUpCiAgICAgICAgcXVlcnkoc29ja2V0KQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeWxpa2VzKHNvY2tldCl7CiAgICAgICAgaWYoIWhhc2tleSgpKXsKICAgICAgICAgIHJldHVybiBbXQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBteXB1YmtleSA9IGF3YWl0IHB1YmtleSgpCiAgICAgICAgY29uc3QgZXZlbnRzID0gYXdhaXQgcXVlcnlldmVudHMoc29ja2V0LCBbN10sIG51bGwsIFtteXB1YmtleV0pCiAgICAgICAgcmV0dXJuIGV2ZW50cy5tYXAoZSA9PiBlLnRhZ3MuZmluZCh0ID0+IHRbMF0gPT0gImUiKVsxXSkKICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlldmVudHMoc29ja2V0LCBraW5kcywgZXZlbnRpZHMsIGF1dGhvcnMpewogICAgICAgIGNvbnN0IHF1ZXJ5aWQgPSAiZXZlbnRzXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgY29uc3QgZmlsdGVycyA9IHt9CiAgICAgICAgCiAgICAgICAgZmlsdGVycy5raW5kcyA9IGtpbmRzCiAgICAgICAgCiAgICAgICAgaWYoZXZlbnRpZHMpewogICAgICAgICAgZmlsdGVyc1siI2UiXSA9IGV2ZW50aWRzCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGF1dGhvcnMpewogICAgICAgICAgZmlsdGVyc1siYXV0aG9ycyJdID0gYXV0aG9ycwogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkoWwogICAgICAgICAgIlJFUSIsIAogICAgICAgICAgcXVlcnlpZCwgCiAgICAgICAgICBmaWx0ZXJzCiAgICAgICAgXSkKCiAgICAgICAgc29ja2V0LnNlbmQoanNvbikKICAgICAgICAKICAgICAgICByZXR1cm4gYXdhaXQgd2FpdHJlcyhxdWVyeWlkKSB8fCBbXQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeXB1YmtleShzb2NrZXQsIHB1YmspewogICAgICAgIGNvbnN0IHF1ZXJ5aWQgPSAicXVlcnlfIiArICgrK2lkY291bnRlcikKICAgICAgICBzb2NrZXQuc2VuZChxdWVyaWVzLmF1dGhvci5yZXBsYWNlKCI8ST4iLCBxdWVyeWlkKS5yZXBsYWNlKCI8UD4iLCBwdWJrKSkKCiAgICAgICAgcmV0dXJuIChhd2FpdCB3YWl0cmVzKHF1ZXJ5aWQpKQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBzYXZlKHNvY2tldCwgZXZlbnRkYiwgcSwgcXR5cGUsIHJlYWN0ZWQsIGFwcGVuZCwgcXVlcnltZXRhKXsKICAgICAgICBsZXQgZXZlbnRwdWJrZXlzID0gW10KICAgICAgICBjb25zdCBldmVudHMgPSBldmVudGRiLmZpbHRlcihvID0+IHsKICAgICAgICAgIGlmKHEubGVuZ3RoID4gMCl7CiAgICAgICAgICAgIGZvcihsZXQgd29yZCBvZiBxLnNwbGl0KCIgIikpewogICAgICAgICAgICAgIGlmKG8uY29udGVudC50b0xvd2VyQ2FzZSgpLmluZGV4T2Yod29yZC50b0xvd2VyQ2FzZSgpKSA9PSAtMSl7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2UKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm4gdHJ1ZQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgbGV0IHJlc3VsdHMgPSBbXQogICAgICAgIGNvbnN0IGV2ZW50aWRzID0gZXZlbnRzLm1hcChlID0+IGUuaWQpCiAgICAgICAgbGV0IG5ld3VybHMgPSBbXQogICAgICAgIAogICAgICAgIGZvcihsZXQgZXZlbnQgb2YgZXZlbnRzKXsKICAgICAgICAgIGxldCB1cmxzbWF0Y2ggPSBbXQogICAgICAgICAgCiAgICAgICAgICBpZihxdHlwZSAhPSAidmlkZW8iKXsKICAgICAgICAgICAgdXJsc21hdGNoLnB1c2goLi4uKGV2ZW50LmNvbnRlbnQubWF0Y2goaW1ncmVnZXgpIHx8IFtdKSkKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgaWYocXR5cGUgIT0gImltYWdlIil7CiAgICAgICAgICAgIHVybHNtYXRjaC5wdXNoKC4uLihldmVudC5jb250ZW50Lm1hdGNoKHZpZGVvcmVnZXgpIHx8IFtdKSkKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgdXJsc21hdGNoID0gdXJsc21hdGNoLmZpbHRlcih1cmwgPT4gIXVybHMuaW5jbHVkZXModXJsKSkKCiAgICAgICAgICBpZih1cmxzbWF0Y2gubGVuZ3RoID4gMCl7CiAgICAgICAgICAgIG5ld3VybHMucHVzaCh7CiAgICAgICAgICAgICAgZXZlbnQ6IGV2ZW50LAogICAgICAgICAgICAgIHVybHM6IHVybHNtYXRjaAogICAgICAgICAgICB9KQogICAgICAgICAgICAKICAgICAgICAgICAgdXJscy5wdXNoKC4uLnVybHNtYXRjaCkKICAgICAgICAgICAgZXZlbnRwdWJrZXlzLmluY2x1ZGVzKGV2ZW50LnB1YmtleSkgfHwgZXZlbnRwdWJrZXlzLnB1c2goZXZlbnQucHVia2V5KQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBsb2coInF1ZXJ5IG1ldGEiLCBzb2NrZXQudXJsKQogICAgICAgIGxldCBtZXRhZXZlbnRzID0gKHF1ZXJ5bWV0YSAmJiBhd2FpdCBxdWVyeWV2ZW50cyhzb2NrZXQsIFswXSwgbnVsbCwgZXZlbnRwdWJrZXlzKSB8fCBbXSkKICAgICAgICAKICAgICAgICBmb3IobGV0IGVudHJ5IG9mIG5ld3VybHMpewogICAgICAgICAgZm9yKGxldCB1cmwgb2YgZW50cnkudXJscyl7CiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7CiAgICAgICAgICAgICAgcmVhY3RlZDogcmVhY3RlZCB8fCBsaWtlcy5pbmNsdWRlcyhlbnRyeS5ldmVudC5pZCksIAogICAgICAgICAgICAgIHVybDogdXJsLCAKICAgICAgICAgICAgICBldmVudDogZW50cnkuZXZlbnQsIAogICAgICAgICAgICAgIGJlY2gzMmlkOiBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyhlbnRyeS5ldmVudC5pZCkpLAogICAgICAgICAgICAgIG1ldGE6IG1ldGFldmVudHMuZmluZChvID0+IG8ucHVia2V5ID09IGVudHJ5LmV2ZW50LnB1YmtleSkKICAgICAgICAgICAgfSkKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbG9nKCJzYXZlIHJlcyIsIHJlc3VsdHMubGVuZ3RoLCBzb2NrZXQudXJsKQogICAgICAgIHVwZGF0ZWNvbnRlbnQocmVzdWx0cywgcSwgYXBwZW5kKQogICAgICB9CiAgICAgIAogICAgICBsZXQgbG9hZGVkID0gMAogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlY29udGVudChyZXN1bHRzLCBxLCBhcHBlbmQpewogICAgICAgIHJlc3VsdHMucmV2ZXJzZSgpLmZvckVhY2goaXRlbSA9PiB7CiAgICAgICAgICBjb25zdCB0eXBlID0gaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleCkgJiYgInZpZGVvIiB8fCAiaW1hZ2UiCiAgICAgICAgICBjb25zdCB0ZXh0ID0gKHEgfHwgInZpZXcgbm90ZSIpLnN1YnN0cmluZygtMzApCiAgICAgICAgICBjb25zdCBpZCA9ICJpdGVtXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgICBjb25zdCBjb250ZW50ZWxlbWVudHMgPSAnPGRpdiBjbGFzcz0idHlwZSI+JyArIHFzKCIjdGVtcGxhdGUgLiIgKyB0eXBlICsgInN2ZyIpLm91dGVySFRNTCArICc8L2Rpdj48YSBjbGFzcz0ibGlrZScgKyAoaXRlbS5yZWFjdGVkID8gJyByZWFjdGVkJyA6ICcnKSArICciIGRhdGEtaXRlbS1pZD0iJyArIGlkICsgCiAgICAgICAgICAgICciIGhyZWY9IiMiPicgKyBxcygiI3RlbXBsYXRlIC5oZWFydHN2ZyIpLm91dGVySFRNTCArICc8L2E+PGEgY2xhc3M9InF1ZXJ5IiBocmVmPSInICsgcHJvdG9jb2wgKyAKICAgICAgICAgICAgaXRlbS5iZWNoMzJpZCArICciPicgKyB0ZXh0ICsgJzwvYT4nCiAgICAgICAgICBsZXQgcm9vdCA9IG51bGwKICAgICAgICAgIGxldCB2ID0gbnVsbAogICAgICAgICAgCiAgICAgICAgICBpZihpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KSl7CiAgICAgICAgICAgIHJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKQogICAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoInZpZGVvLWNvbnRhaW5lciIpCiAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MID0gY29udGVudGVsZW1lbnRzCiAgICAgICAgICAgIAogICAgICAgICAgICB2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKQogICAgICAgICAgICB2WyJkYXRhLWl0ZW0taWQiXSA9IGlkCiAgICAgICAgICAgIHYucHJlbG9hZCA9ICJub25lIgogICAgICAgICAgICB2Lmxvb3AgPSB0cnVlCiAgICAgICAgICAgIHYucGxheXNpbmxpbmUgPSAiIgogICAgICAgICAgICAKICAgICAgICAgICAgdi5vbmNhbnBsYXkgPSBhc3luYyBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICBjb25zdCBhc3BlY3QgPSB0aGlzLnZpZGVvV2lkdGggLyB0aGlzLnZpZGVvSGVpZ2h0CiAgICAgICAgICAgICAgaWYoYXNwZWN0ID4gMSl7CiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLndpZHRoID0gKGFzcGVjdCAqIDEwMCkgKyAiJSIKICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUuaGVpZ2h0ID0gKDEgLyBhc3BlY3QgKiAxMDApICsgIiUiCiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLm1hcmdpblRvcCA9IC0oKDEgLyBhc3BlY3QgKiAxMDAgLSAxMDApIC8gMikgKyAiJSIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgdXBkYXRldmlkZW9wbGF5KHRoaXMucGFyZW50RWxlbWVudCkKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29uc3QgZXh0ID0gaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleClbMV0KICAgICAgICAgICAgdi5pbm5lckhUTUwgPSAnPHNvdXJjZSBzcmM9IicgKyBpdGVtLnVybCArICciIHR5cGU9InZpZGVvLycgKyBleHQgKyAnIj48L3NvdXJjZT4nCiAgICAgICAgICAgIAogICAgICAgICAgICByb290LmFwcGVuZCh2KQogICAgICAgICAgfWVsc2UgaWYoaXRlbS51cmwubWF0Y2goaW1nZXh0cmVnZXgpKXsKICAgICAgICAgICAgcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKQogICAgICAgICAgICByb290LmhyZWYgPSAiIyIKICAgICAgICAgICAgcm9vdC5pbm5lckhUTUwgPSBjb250ZW50ZWxlbWVudHMKICAgICAgICAgICAgICAKICAgICAgICAgICAgaWYodHlwZSA9PSAiaW1hZ2UiKXsKICAgICAgICAgICAgICAvL2xldCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKQogICAgICAgICAgICAgIC8vaW1nLmFsdCA9IGl0ZW0udXJsCiAgICAgICAgICAgICAgcm9vdFsiZGF0YS1zcmMiXSA9IGl0ZW0udXJsCiAgICAgICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJpbWciKQogICAgICAgICAgICAgIC8vaW1nLmNsYXNzTGlzdC5hZGQoImRhdGEiKQogICAgICAgICAgICAgIC8vcm9vdC5hcHBlbmQoaW1nKQogICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICByb290LmlubmVySFRNTCArPSAnPHNwYW4gY2xhc3M9ImZpbGUiPicgKyBpdGVtLnVybCArICc8L3NwYW4+JwogICAgICAgICAgICB9CiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHJvb3QuaWQgPSBpZAogICAgICAgICAgcm9vdC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJwogICAgICAgICAgcm9vdFsiZGF0YS1pdGVtIl0gPSBpdGVtCiAgICAgICAgICByb290WyJkYXRhLWV2ZW50Il0gPSBpdGVtLmV2ZW50CiAgICAgICAgICByb290WyJkYXRhLXF1ZXJ5Il0gPSBxCiAgICAgICAgICByb290WyJkYXRhLXRleHQiXSA9IHRleHQKICAgICAgICAgIAogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKHR5cGUpCiAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoIml0ZW0iKQogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJzaG93IikKICAgICAgICAgIAogICAgICAgICAgaWYoaXRlbS5yZWFjdGVkKXsKICAgICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgcXMoIiNpbWFnZXMiKVthcHBlbmQgJiYgImFwcGVuZCIgfHwgInByZXBlbmQiXShyb290KQogICAgICAgICAgCiAgICAgICAgICBpZih2KXsKICAgICAgICAgICAgdXBkYXRldmlkZW9wbGF5KHJvb3QpCiAgICAgICAgICB9CiAgICAgICAgfSkKCiAgICAgICAgdXBkYXRlaW1hZ2VzbG9hZCgpCiAgICAgICAgCiAgICAgICAgaWYoYWN0aXZlKCkgPT0gbnVsbCl7CiAgICAgICAgICBxcygiI2ltYWdlcyAuaXRlbSIpPy5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGlkZW1lZGlhKCl7CiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICJzY3JvbGwiCiAgICAgICAgcXNhKCIjbWVkaWEtY29udGFpbmVyLCAjaW1hZ2UsICNtZWRpYS1mb290ZXIiKS5mb3JFYWNoKG4gPT4gbi5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiKQogICAgICAgIGdpZCgiaW1hZ2UtbGlrZSIpLmNsYXNzTGlzdC5yZW1vdmUoInJlYWN0ZWQiKQogICAgICAgIGhpZGV2aWRlbygpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGhpZGV2aWRlbygpewogICAgICAgIGNvbnN0IHYgPSBxcygiI21lZGlhLWNvbnRhaW5lciB2aWRlbyIpCiAgICAgICAgCiAgICAgICAgaWYodil7CiAgICAgICAgICB2Lm11dGVkID0gdHJ1ZQogICAgICAgICAgZ2lkKHZbImRhdGEtaXRlbS1pZCJdKS5hcHBlbmRDaGlsZCh2KQogICAgICAgICAgdXBkYXRldmlkZW9wbGF5KHYucGFyZW50RWxlbWVudCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHdhaXRyZXMoa2V5KXsKICAgICAgICBsZXQgZXZlbnRzID0gW10KICAgICAgICAKICAgICAgICBsZXQgcmVzaGFuZGxlciA9IGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7CiAgICAgICAgICB0aGlzLmhhbmRsZSA9IGZ1bmN0aW9uKHJlcyl7CiAgICAgICAgICAgIGxldCBvID0gSlNPTi5wYXJzZShyZXMuZGF0YSkKICAgICAgICAgICAgaWYob1sxXSA9PSBrZXkpewogICAgICAgICAgICAgIGlmKG9bMF0gPT0gIkVPU0UiKXsKICAgICAgICAgICAgICAgIHJlc29sdmUoZXZlbnRzKQogICAgICAgICAgICAgICAgcmVzaGFuZGxlcnMuc3BsaWNlKHJlc2hhbmRsZXJzLmluZGV4T2YodGhpcyksIDEpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGV2ZW50cy5wdXNoKG9bMl0pCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgICAKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAgICAgcmVzaGFuZGxlcnMucHVzaChuZXcgcmVzaGFuZGxlcihyZXNvbHZlLCByZWplY3QpKQogICAgICAgIH0pCiAgICAgIH0KICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBjaGVja3VwZGF0ZShzb2NrZXQpewogICAgICAgIGNvbnN0IHVwZGF0ZXNyZXMgPSBhd2FpdCBxdWVyeXB1YmtleShzb2NrZXQsIHVwZGF0ZXNwdWJrZXkpCiAgICAgICAgY29uc3QgdXBkYXRlbm90ZSA9IHVwZGF0ZXNyZXMuZmluZChuID0+IG4uY29udGVudC5tYXRjaCgvXmh0dHBzXDpcL1wvLykpCiAgICAgICAgCiAgICAgICAgaWYoIXVwZGF0ZW5vdGUpewogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGFnZSA9IE1hdGgucm91bmQoKERhdGUubm93KCkgLyAxMDAwIC0gdXBkYXRlbm90ZS5jcmVhdGVkX2F0KSAvIDM2MDAgLyAyNCkKICAgICAgICBjb25zdCBub3RlaWQgPSBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyh1cGRhdGVub3RlLmlkKSkKICAgICAgICBxcygiI3JlbGVhc2UiKS5ocmVmID0gcHJvdG9jb2wgKyBub3RlaWQKICAgICAgICBxcygiI3JlbGVhc2UiKS5pbm5lclRleHQgPSAoYWdlID09IDAgJiYgInRvZGF5IiB8fCBhZ2UgKyAiIGRheShzKSBhZ28iKQogICAgICB9CgogICAgICBmdW5jdGlvbiBzbGVlcChtcyl7CiAgICAgICAgcmV0dXJuIG5ldyBmdW5jdGlvbigpewogICAgICAgICAgbGV0IHRpbWVvdXQgPSBudWxsCiAgICAgICAgICBsZXQgciA9IG51bGwKICAgICAgICAgIAogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcHJvbWlzZTogbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXsKICAgICAgICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIG1zKQogICAgICAgICAgICAgIHIgPSByZXNvbHZlCiAgICAgICAgICAgIH0pLAogICAgICAgICAgICByZXNvbHZlOiBmdW5jdGlvbigpewogICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KQogICAgICAgICAgICAgIHIoKQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzaG93KGlkKXsKICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiIKICAgICAgICBjb25zdCBpdGVtID0gZ2lkKGlkKVsiZGF0YS1pdGVtIl0KICAgICAgICBjb25zdCBtZWRpYSA9IGdpZCgibWVkaWEtY29udGFpbmVyIikKICAgICAgICBjb25zdCBpbWFnZSA9IGdpZCgiaW1hZ2UiKQoKICAgICAgICBpZihpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KSl7CiAgICAgICAgICBpbWFnZS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiCiAgICAgICAgICBjb25zdCB2ID0gZ2lkKGlkKS5xdWVyeVNlbGVjdG9yKCJ2aWRlbyIpCiAgICAgICAgICBxcygiI21lZGlhLWNvbnRhaW5lciIpLmFwcGVuZENoaWxkKHYpCiAgICAgICAgICB2Lm11dGVkID0gZmFsc2UKICAgICAgICAgIHYucGxheSgpCiAgICAgICAgfWVsc2V7CiAgICAgICAgICBpbWFnZS5zcmMgPSBpdGVtLnVybAogICAgICAgICAgaW1hZ2Uuc3R5bGUuZGlzcGxheSA9ICJibG9jayIKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoaXRlbS5tZXRhKXsKICAgICAgICAgIGNvbnN0IG1ldGFjb250ZW50ID0gSlNPTi5wYXJzZShpdGVtLm1ldGEuY29udGVudCkKICAgICAgICAgIGNvbnN0IG5hbWUgPSBtZXRhY29udGVudC5kaXNwbGF5X25hbWUgfHwgbWV0YWNvbnRlbnQubmFtZQogICAgICAgICAgcXMoIiNpbWFnZS11c2VyIikuc3R5bGUuZGlzcGxheSA9ICJibG9jayIKICAgICAgICAgIHFzKCIjaW1hZ2UtdXNlciIpLmhyZWYgPSBwcm90b2NvbCArIGJlY2gzMi5lbmNvZGUoIm5wdWIiLCBmcm9tSGV4U3RyaW5nKGl0ZW0ubWV0YS5wdWJrZXkpKQogICAgICAgICAgcXMoIiNpbWFnZS11c2VyIikuaW5uZXJUZXh0ID0gbmFtZQogICAgICAgIH1lbHNlewogICAgICAgICAgcXMoIiNpbWFnZS11c2VyIikuc3R5bGUuZGlzcGxheSA9ICJub25lIgogICAgICAgIH0KCiAgICAgICAgZ2lkKCJpbWFnZS1saWtlIilbImRhdGEtaXRlbS1pZCJdID0gaWQKICAgICAgICBnaWQoIm1lZGlhLWZvb3RlciIpWyJkYXRhLWV2ZW50Il0gPSBpdGVtLmV2ZW50CgogICAgICAgIGlmKGl0ZW0ucmVhY3RlZCl7CiAgICAgICAgICBnaWQoImltYWdlLWxpa2UiKS5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgYSA9IHFzKCIjaW1hZ2UtcXVlcnkiKQogICAgICAgIGEuaHJlZiA9IHByb3RvY29sICsgaXRlbS5iZWNoMzJpZAogICAgICAgIGEuaW5uZXJUZXh0ID0gZ2lkKGlkKVsiZGF0YS10ZXh0Il0KICAgICAgICAgIAogICAgICAgIG1lZGlhLnN0eWxlLmRpc3BsYXkgPSBnaWQoIm1lZGlhLWZvb3RlciIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGNvbm5jb3VudCgpewogICAgICAgIHJldHVybiBzb2NrZXRzLmZpbHRlcihyID0+IHIucmVhZHlTdGF0ZSA9PSAxKS5sZW5ndGgKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gZGlzY29ubmVjdCgpewogICAgICAgIGZvcihsZXQgc29ja2V0IG9mIHNvY2tldHMpewogICAgICAgICAgc29ja2V0LmNsb3NlKCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc29ja2V0cy5zcGxpY2UoMCkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gbG9nKG1zZyl7CiAgICAgICAgbGV0IHNjcm9sbCA9IHFzKCIjbG9ncyIpLnNjcm9sbFRvcCA9PSBxcygiI2xvZ3MiKS5zY3JvbGxUb3BNYXgKICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKQogICAgICAgIGRpdi5pbm5lclRleHQgPSBBcnJheS5mcm9tKGFyZ3VtZW50cykuam9pbigiICIpCiAgICAgICAgcXMoIiNsb2dzIikuYXBwZW5kKGRpdikKICAgICAgICAKICAgICAgICBzY3JvbGwgJiYgcXMoIiNsb2dzIikuc2Nyb2xsVG8oMCwgcXMoIiNsb2dzIikuc2Nyb2xsVG9wTWF4KQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBjb25uZWN0KHVybCl7CiAgICAgICAgbG9nKCJjb25uZWN0aW5nIiwgdXJsKQogICAgICAgIGxldCBzb2NrZXQgPSBuZXcgV2ViU29ja2V0KHVybCkKICAgICAgICAKICAgICAgICBzb2NrZXQub25tZXNzYWdlID0gbWVzc2FnZSA9PiByZXNoYW5kbGVycy5mb3JFYWNoKHJoID0+IHJoLmhhbmRsZShtZXNzYWdlKSkKICAgICAgICAKICAgICAgICBzb2NrZXQub25jbG9zZSA9IGFzeW5jIGZ1bmN0aW9uKCl7CiAgICAgICAgICBzb2NrZXRzLnNwbGljZShzb2NrZXRzLmluZGV4T2Yoc29ja2V0KSwgMSkKICAgICAgICAgIHFzKCIjY29ubmNvdW50IikuaW5uZXJUZXh0ID0gY29ubmNvdW50KCkgKyAocHJpbWFsc29ja2V0ICYmIDEpCiAgICAgICAgICBsb2coImRpc2Nvbm5lY3RlZCIsIHRoaXMudXJsLCBjb25uY291bnQoKSkKICAgICAgICAgIGF3YWl0IHNsZWVwKDEwMDApLnByb21pc2UKICAgICAgICAgIGNvbm5lY3QodGhpcy51cmwpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHNvY2tldC5vbm9wZW4gPSBmdW5jdGlvbigpewogICAgICAgICAgcXMoIiNjb25uY291bnQiKS5pbm5lclRleHQgPSBjb25uY291bnQoKSArIChwcmltYWxzb2NrZXQgJiYgMSkKICAgICAgICAgIGxvZygiY29ubmVjdGVkIiwgdGhpcy51cmwsIGNvbm5jb3VudCgpKQogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4gc29ja2V0CiAgICAgIH0KICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLCBhc3luYyAoKSA9PiB7CiAgICAgICAgcHJpbWFsc29ja2V0ID0gY29ubmVjdCgid3NzOi8vY2FjaGUzLnByaW1hbC5uZXQvY2FjaGUxNyIpCiAgICAgICAgcHJpbWFsc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoIm9wZW4iLCBmdW5jdGlvbigpewogICAgICAgICAgcHJpbWFsZ2xvYmFsKHRoaXMpCiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBwcmltYWxzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xvc2UiLCBmdW5jdGlvbigpewogICAgICAgICAgcHJpbWFsc29ja2V0ID0gbnVsbAogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgZm9yKGxldCB1cmwgb2YgcmVsYXlzKCkpewogICAgICAgICAgY29uc3Qgc29ja2V0ID0gY29ubmVjdCh1cmwpCiAgICAgICAgICBzb2NrZXRzLnB1c2goc29ja2V0KQogICAgICAgICAgCiAgICAgICAgICBzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcigib3BlbiIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIGNoZWNrdXBkYXRlKHRoaXMpCiAgICAgICAgICAgIHF1ZXJ5KHRoaXMpCiAgICAgICAgICB9KQogICAgICAgIH0KICAgICAgICAKICAgICAgICBhd2FpdCBzbGVlcCgxMDApLnByb21pc2UKICAgICAgICAKICAgICAgICBpZihoYXNrZXkoKSl7CiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoIm5vc3RyIikKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBmb3IobGV0IGMgb2YgY29sb3B0cyl7CiAgICAgICAgZG9jdW1lbnQud3JpdGUoJzxzdHlsZT4nICsgY29sc2Nzcy5pbm5lclRleHQucmVwbGFjZSgvXCRce2NvbHNcfS9nLCBjKSArICc8L3N0eWxlPicpCiAgICAgIH0KICAgIDwvc2NyaXB0PgogIDwvYm9keT4KPC9odG1sPgo=
https://ipfs.io/ipfs/QmXqKFYuxTWAzzKTS6d7oBNP2j25ZZHQGd2SfR3PQgnt2g
sha256
5eba81d009288a361bad3c49feb937f4e727e393c1f9332aa6ee526688648f19 files.html
base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyIvPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL3N2Z2ljb25zLnNwYXJray5mci9zdmdpY29ucy5jc3MiLz4KICAgIDxzdHlsZT4KICAgICAgKiB7CiAgICAgICAgb3ZlcnNjcm9sbC1iZWhhdmlvci15OiBjb250YWluOwogICAgICB9CiAgICAgIAogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksIAogICAgICAjaGVhZGVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncywgCiAgICAgICNwcml2a2V5IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncyB7CiAgICAgICAgaGVpZ2h0OiA2ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNsb2dzIHsKICAgICAgICBoZWlnaHQ6IDhlbTsKICAgICAgICBvdmVyZmxvdzogc2Nyb2xsOwogICAgICAgIGZvbnQtc2l6ZTogLjhlbTsKICAgICAgfQogICAgICAKICAgICAgc2VsZWN0IHsKICAgICAgICB3aWR0aDogNGVtOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLCAKICAgICAgaW5wdXQuc3VibWl0IHsKICAgICAgICBib3JkZXItcmFkaXVzOiAuNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0LCAKICAgICAgI2hlYWRlciBhLAogICAgICAjbWVkaWEtY29udGFpbmVyIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLCAKICAgICAgZm9ybSwgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHotaW5kZXg6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgIAogICAgICBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDMwZW0pIHsKICAgICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgfQogICAgICB9CgogICAgICBmb3JtIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeSB7CiAgICAgICAgd2lkdGg6IDZlbTsKICAgICAgfQogICAgICAKICAgICAgI2xvYWRpbmcgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMHB4OwogICAgICAgIGxlZnQ6IDI3ZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgIGEgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgfQoKICAgICAgdmlkZW8gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogIAogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgIGhlaWdodDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgIG1hcmdpbi10b3A6IDAgIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgLnR5cGUgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICB6LWluZGV4OiAxOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2UtcXVlcnkgewogICAgICAgIHdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksCiAgICAgIGEsCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICB9CgogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbWluLXdpZHRoOiAzZW07CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLAogICAgICAjaGVhZGVyIHNwYW4gewogICAgICAgIHBhZGRpbmc6IDAuNWVtOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CgogICAgICAjaGVhZGVyIHsKICAgICAgICBwYWRkaW5nOiAwLjQ1ZW0gMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAjaGVhZGVyIC5pdGVtcyB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgLml0ZW1zIHsKICAgICAgICBtYXJnaW4tdG9wOiAuM2VtOwogICAgICB9CgogICAgICBwIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICAubGFiZWwgewogICAgICAgIHBhZGRpbmc6IC44ZW0gLjhlbSAuOGVtIDA7CiAgICAgIH0KCiAgICAgICNpbWFnZXMgLnF1ZXJ5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KCiAgICAgICNtZWRpYS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwKTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlIHsKICAgICAgICBtYXgtd2lkdGg6IDEwMHZ3OwogICAgICAgIG1heC1oZWlnaHQ6IDEwMHZoOwogICAgICB9CiAgICAgICAgCiAgICAgICNpbWFnZXMgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZXMgLml0ZW0gewogICAgICAgIHdpZHRoOiAyNXZ3OwogICAgICB9CgogICAgICAjaW1hZ2VzIC5pdGVtIHsKICAgICAgICBoZWlnaHQ6IDI1dnc7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBib3JkZXI6IDAuM2VtIHNvbGlkIHRyYW5zcGFyZW50OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDAuM2VtOwogICAgICAgIG1hcmdpbjogLTAuM2VtOwogICAgICB9CgogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CiAgICAgIAogICAgICBib2R5Om5vdCgubm9zdHIpICNmaWx0ZXItbGlrZXMsIAogICAgICAuZmlsdGVyLWxpa2VzICNpbWFnZXMgPiAuaXRlbTpub3QoLnJlYWN0ZWQpIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlLCAKICAgICAgI2ltYWdlLXF1ZXJ5LAogICAgICAjaW1hZ2UtdXNlciB7CiAgICAgICAgei1pbmRleDogMjsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3Z3OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHBhZGRpbmc6IDAgMXZ3OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSwgCiAgICAgIC52aWRlb3N2ZywKICAgICAgLmltYWdlc3ZnIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLDAuNik7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlLCAKICAgICAgI2ltYWdlLXF1ZXJ5IHsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgZm9udC1zaXplOiBtaW4oMy41dncsIDEuNWVtKTsKICAgICAgICBtYXgtd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlLXF1ZXJ5IHsKICAgICAgICBwYWRkaW5nOiAuNmVtIC40ZW0gLjFlbSAuNGVtOwogICAgICAgIG1heC13aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICAubGlrZS5yZWFjdGVkLAogICAgICAuZmlsdGVyLWxpa2VzICNmaWx0ZXItbGlrZXMgewogICAgICAgIGJhY2tncm91bmQ6IHJlZDsKICAgICAgfQoKICAgICAgI2ltYWdlLXF1ZXJ5LAogICAgICAjaW1hZ2UtdXNlciB7CiAgICAgICAgZm9udC1zaXplOiAzZW07CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIsCiAgICAgICNtZWRpYS1mb290ZXIgLmxpa2UgewogICAgICAgIHotaW5kZXg6IDU7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2UtcXVlcnksCiAgICAgICNpbWFnZS11c2VyIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIGJvdHRvbTogMS45ZW07CiAgICAgICAgZm9udC1zaXplOiAxLjhlbTsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAuNjVlbTsKICAgICAgICBtYXgtd2lkdGg6IDhlbTsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgfQogICAgICAKICAgICAgLmxpa2UgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogYXV0bzsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIHdpZHRoOiAxZW07CiAgICAgICAgaGVpZ2h0OiAxZW07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgfQoKICAgICAgLm5vc3RyIC5saWtlIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsgIAogICAgICB9CgogICAgICAjbWVkaWEtZm9vdGVyIC5saWtlIHsKICAgICAgICBmb250LXNpemU6IDIuNGVtOwogICAgICB9CgogICAgICAjbWVkaWEtZm9vdGVyIHsKICAgICAgICBkaXNwbGF5OiBub25lOyAgCiAgICAgIH0KICAKICAgICAgI2ltYWdlcyAuaW1nIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgYmFja2dyb3VuZC1zaXplOiBjb3ZlcjsKICAgICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwogICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgLmFjdGl2ZSB7CiAgICAgICAgYmFja2dyb3VuZDogIzQ0NDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlcyA+IC5hY3RpdmUgewogICAgICAgIGJvcmRlci1jb2xvcjogZ3JlZW47CiAgICAgICAgei1pbmRleDogMTsKICAgICAgfQoKICAgICAgLmhlYXJ0c3ZnIHBhdGggewogICAgICAgIHN0cm9rZTogI2ZmZjsKICAgICAgfQogIAogICAgICAudmlkZW9zdmcsCiAgICAgIC5pbWFnZXN2ZyB7CiAgICAgICAgd2lkdGg6IDR2dzsKICAgICAgICBoZWlnaHQ6IDR2dzsKICAgICAgICBwYWRkaW5nOiAwIC4yZW07CiAgICAgIH0KICAgICAgCiAgICAgIC52aWRlb3N2ZyBwYXRoLAogICAgICAuaW1hZ2VzdmcgcGF0aCB7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgYSNtZW51LCBhI2ZpbHRlci1saWtlcyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luLXRvcDogLS4zZW07CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgfQoKICAgICAgYSNtZW51IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBwYWRkaW5nOiAwIC4zZW0gMCAuNWVtOwogICAgICAgIGhlaWdodDogMi4xZW07CiAgICAgIH0KICAgICAgCiAgICAgIGEjZmlsdGVyLWxpa2VzIHsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB3aWR0aDogMS41ZW07CiAgICAgICAgaGVpZ2h0OiAxLjVlbTsKICAgICAgICBtYXJnaW46IC4xZW0gLjVlbTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgIH0KICAgICAgCiAgICAgIGEjZmlsdGVyLWxpa2VzIHN2ZyB7CiAgICAgICAgd2lkdGg6IDEuNWVtOwogICAgICAgIGhlaWdodDogMS41ZW07CiAgICAgIH0KICAgICAgIAogICAgICAubWVudXN2ZyB7CiAgICAgICAgd2lkdGg6IDJlbTsKICAgICAgICBoZWlnaHQ6IDJlbTsKICAgICAgfQoKICAgICAgLm1lbnVzdmcgcGF0aCB7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBtYXJnaW4tbGVmdDogLTE4ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzIyMjsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgei1pbmRleDogMzsgCiAgICAgICAgb3ZlcmZsb3c6IHNjcm9sbDsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudC5vcGVuIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgewogICAgICAgIHBhZGRpbmc6IDAgMWVtIDFlbSAxZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIGEsCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgcGFkZGluZzogLjVlbSAuN2VtOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHotaW5kZXg6IDM7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIG9wYWNpdHk6IC41OwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5Lm9wZW4gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIAogICAgICBzdmcgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAjdGVtcGxhdGUgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGRpdiBpZD0idGVtcGxhdGUiPgogICAgICA8c3ZnIGNsYXNzPSJoZWFydHN2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KICAgICAgICA8cGF0aCBkPSJNOS43MTksMTcuMDczbC02LjU2Mi02LjUxYy0wLjI3LTAuMjY4LTAuNTA0LTAuNTY3LTAuNjk2LTAuODg4QzEuMzg1LDcuODksMS42Nyw1LjYxMywzLjE1NSw0LjE0YzAuODY0LTAuODU2LDIuMDEyLTEuMzI5LDMuMjMzLTEuMzI5YzEuOTI0LDAsMy4xMTUsMS4xMiwzLjYxMiwxLjc1MmMwLjQ5OS0wLjYzNCwxLjY4OS0xLjc1MiwzLjYxMi0xLjc1MmMxLjIyMSwwLDIuMzY5LDAuNDcyLDMuMjMzLDEuMzI5YzEuNDg0LDEuNDczLDEuNzcxLDMuNzUsMC42OTMsNS41MzdjLTAuMTksMC4zMi0wLjQyNSwwLjYxOC0wLjY5NSwwLjg4N2wtNi41NjIsNi41MUMxMC4xMjUsMTcuMjI5LDkuODc1LDE3LjIyOSw5LjcxOSwxNy4wNzMgTTYuMzg4LDMuNjFDNS4zNzksMy42MSw0LjQzMSw0LDMuNzE3LDQuNzA3QzIuNDk1LDUuOTIsMi4yNTksNy43OTQsMy4xNDUsOS4yNjVjMC4xNTgsMC4yNjUsMC4zNTEsMC41MSwwLjU3NCwwLjczMUwxMCwxNi4yMjhsNi4yODEtNi4yMzJjMC4yMjQtMC4yMjEsMC40MTYtMC40NjYsMC41NzMtMC43MjljMC44ODctMS40NzIsMC42NTEtMy4zNDYtMC41NzEtNC41NkMxNS41Nyw0LDE0LjYyMSwzLjYxLDEzLjYxMiwzLjYxYy0xLjQzLDAtMi42MzksMC43ODYtMy4yNjgsMS44NjNjLTAuMTU0LDAuMjY0LTAuNTM2LDAuMjY0LTAuNjksMEM5LjAyOSw0LjM5Nyw3LjgyLDMuNjEsNi4zODgsMy42MSI+PC9wYXRoPgogICAgICA8L3N2Zz4KICAgICAgPHN2ZyBjbGFzcz0idmlkZW9zdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJCQk8cGF0aCBkPSJNMTguMTc1LDQuMTQySDEuOTUxQzEuNzAzLDQuMTQyLDEuNSw0LjM0NCwxLjUsNC41OTJ2MTAuODE2YzAsMC4yNDcsMC4yMDMsMC40NSwwLjQ1MSwwLjQ1aDE2LjIyNGMwLjI0NywwLDAuNDUtMC4yMDMsMC40NS0wLjQ1VjQuNTkyQzE4LjYyNSw0LjM0NCwxOC40MjIsNC4xNDIsMTguMTc1LDQuMTQyIE00LjY1NSwxNC45NTdIMi40MDF2LTEuODAzaDIuMjUzVjE0Ljk1N3pNNC42NTUsMTIuMjU0SDIuNDAxdi0xLjgwM2gyLjI1M1YxMi4yNTR6IE00LjY1NSw5LjU0OUgyLjQwMVY3Ljc0N2gyLjI1M1Y5LjU0OXogTTQuNjU1LDYuODQ2SDIuNDAxVjUuMDQzaDIuMjUzVjYuODQ2ek0xNC41NjksMTQuOTU3SDUuNTU2VjUuMDQzaDkuMDEzVjE0Ljk1N3ogTTE3LjcyNCwxNC45NTdoLTIuMjUzdi0xLjgwM2gyLjI1M1YxNC45NTd6IE0xNy43MjQsMTIuMjU0aC0yLjI1M3YtMS44MDNoMi4yNTNWMTIuMjU0ek0xNy43MjQsOS41NDloLTIuMjUzVjcuNzQ3aDIuMjUzVjkuNTQ5eiBNMTcuNzI0LDYuODQ2aC0yLjI1M1Y1LjA0M2gyLjI1M1Y2Ljg0NnoiPjwvcGF0aD4KCQkJPC9zdmc+CgkJCTxzdmcgY2xhc3M9ImltYWdlc3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgoJCQkJPHBhdGggZD0iTTE4LjU1NSwxNS4zNTRWNC41OTJjMC0wLjI0OC0wLjIwMi0wLjQ1MS0wLjQ1LTAuNDUxSDEuODg4Yy0wLjI0OCwwLTAuNDUxLDAuMjAzLTAuNDUxLDAuNDUxdjEwLjgwOGMwLDAuNTU5LDAuNzUxLDAuNDUxLDAuNDUxLDAuNDUxaDE2LjIxN2gwLjAwNUMxOC43OTMsMTUuODUxLDE4LjQ3OCwxNC44MTQsMTguNTU1LDE1LjM1NCBNMi44LDE0Ljk0OWw0Ljk0NC02LjQ2NGw0LjE0NCw1LjQxOWMwLjAwMywwLjAwMywwLjAwMywwLjAwMywwLjAwMywwLjAwNWwwLjc5NywxLjA0SDIuOHogTTEzLjgyMiwxNC45NDlsLTEuMDA2LTEuMzE3bDEuNjg5LTIuMjE4bDIuNjg4LDMuNTM1SDEzLjgyMnogTTE3LjY1NCwxNC4wNjRsLTIuNzkxLTMuNjY2Yy0wLjE4MS0wLjIzNy0wLjUzNS0wLjIzNy0wLjcxNiwwbC0xLjg5OSwyLjQ5M2wtNC4xNDYtNS40MmMtMC4xOC0wLjIzNy0wLjUzNi0wLjIzNy0wLjcxNiwwbC01LjA0Nyw2LjU5OFY1LjA0MmgxNS4zMTZWMTQuMDY0eiBNMTIuNDc0LDYuMzkzYy0wLjg2OSwwLTEuNTc3LDAuNzA3LTEuNTc3LDEuNTc2czAuNzA4LDEuNTc2LDEuNTc3LDEuNTc2czEuNTc3LTAuNzA3LDEuNTc3LTEuNTc2UzEzLjM0Myw2LjM5MywxMi40NzQsNi4zOTMgTTEyLjQ3NCw4LjY0NWMtMC4zNzEsMC0wLjY3Ni0wLjMwNC0wLjY3Ni0wLjY3NnMwLjMwNS0wLjY3NiwwLjY3Ni0wLjY3NmMwLjM3MiwwLDAuNjc2LDAuMzA0LDAuNjc2LDAuNjc2UzEyLjg0Niw4LjY0NSwxMi40NzQsOC42NDUiPjwvcGF0aD4KCQkJPC9zdmc+CiAgICAgIDxkaXYgaWQ9ImNvbHNjc3MiPgogICAgICAuY29scyR7Y29sc30gI2ltYWdlcyAuaXRlbSB7CiAgICAgICAgd2lkdGg6IGNhbGMoMTAwdncgLyAke2NvbHN9KTsKICAgICAgfQoKICAgICAgLmNvbHMke2NvbHN9ICNpbWFnZXMgLml0ZW0gewogICAgICAgIGhlaWdodDogY2FsYygxMDB2dyAvICR7Y29sc30pOwogICAgICB9CiAgICAgIAogICAgICAuY29scyR7Y29sc30gLnF1ZXJ5LAogICAgICAuY29scyR7Y29sc30gLmxpa2UgewogICAgICAgIGZvbnQtc2l6ZTogbWluKDE0dncgKiAoMSAvICR7Y29sc30pLCA2ZW0gKiAoMSAvICR7Y29sc30pKQogICAgICB9CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJtZWRpYS1mb290ZXIiPgogICAgICA8YSBpZD0iaW1hZ2UtbGlrZSIgY2xhc3M9Imxpa2UiIGhyZWY9IiMiPjwvYT4KICAgICAgPGEgaWQ9ImltYWdlLXF1ZXJ5IiBocmVmPSIjIj48L2E+CiAgICAgIDxhIGlkPSJpbWFnZS11c2VyIiBocmVmPSIjIj48L2E+CiAgICA8L2Rpdj4KICAgIDxjZW50ZXIgaWQ9Im1lZGlhLWNvbnRhaW5lciI+CiAgICAgIDxkaXYgaWQ9ImltYWdlLWNvbnRhaW5lciI+CiAgICAgICAgPGltZyBpZD0iaW1hZ2UiLz4KICAgICAgPC9kaXY+CiAgICA8L2NlbnRlcj4KICAgIDxkaXYgaWQ9Im1lbnUtb3ZlcmxheSI+PC9kaXY+CiAgICA8ZGl2IGlkPSJtZW51LWNvbnRlbnQiIGNsYXNzPSJ0ZXN0Ij4KICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5hdXRvcGxheTwvZGl2PgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0ib24iIGhyZWY9IiMiPm9uPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0ib2ZmIiBocmVmPSIjIj5vZmY8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJob3ZlciIgaHJlZj0iIyI+bW91c2VvdmVyPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5jb2x1bW5zPC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMSIgaHJlZj0iIyI+MTwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSIyIiBocmVmPSIjIj4yPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjQiIGhyZWY9IiMiPjQ8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iNiIgaHJlZj0iIyI+NjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSIxMCIgaHJlZj0iIyI+MTA8L2E+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmNvbm5lY3Rpb25zPC9kaXY+CiAgICAgICAgPGRpdiBpZD0iY29ubmNvdW50Ij4wPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPnJlbGF5czo8L2Rpdj4KICAgICAgICA8cD5QbGVhc2UgdXNlIHJlbGF5cyB3aXRoIE5JUC01MCAoc2VhcmNoKSBmdW5jdGlvbmFsaXR5PC9wPgogICAgICAgIDxmb3JtIGFjdGlvbj0iIyIgaWQ9InJlbGF5cy1mb3JtIj4KICAgICAgICAgIDx0ZXh0YXJlYSBpZD0icmVsYXlzIj48L3RleHRhcmVhPgogICAgICAgICAgPGlucHV0IGNsYXNzPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9InNhdmUgcmVsYXlzIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5wcml2YXRlIGtleTo8L2Rpdj4KICAgICAgICA8cD5JZiB5b3UgY2FudCB1c2UgYnJvd3NlciBhZGRvbiAobW9iaWxlKTwvcD4KICAgICAgICA8Zm9ybSBhY3Rpb249IiMiIGlkPSJwcml2a2V5LWZvcm0iPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJwcml2a2V5Ii8+CiAgICAgICAgICA8aW5wdXQgY2xhc3M9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0ic2F2ZSBrZXkiLz4KICAgICAgICA8L2Zvcm0+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmxvZ3M8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJsb2dzIj48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+bGF0ZXN0IHJlbGVhc2U6PC9kaXY+CiAgICAgICAgPGEgaWQ9InJlbGVhc2UiIGhyZWY9IiMiPjwvYT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9ImhlYWRlciI+CiAgICAgIDxhIGlkPSJmaWx0ZXItbGlrZXMiIGhyZWY9IiMiPjwvYT4KICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxhIGlkPSJtZW51IiBocmVmPSIjIj4KICAgICAgICAgIDxzdmcgY2xhc3M9Im1lbnVzdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJICAgICAgICA8cGF0aCBkPSJNMTAsMS40NDVjLTQuNzI2LDAtOC41NTUsMy44MjktOC41NTUsOC41NTVjMCw0LjcyNSwzLjgyOSw4LjU1NSw4LjU1NSw4LjU1NWM0LjcyNSwwLDguNTU1LTMuODMsOC41NTUtOC41NTVDMTguNTU1LDUuMjc0LDE0LjcyNSwxLjQ0NSwxMCwxLjQ0NSBNMTAsMTcuNjU0Yy00LjIyMSwwLTcuNjU0LTMuNDM0LTcuNjU0LTcuNjU0YzAtNC4yMjEsMy40MzMtNy42NTQsNy42NTQtNy42NTRjNC4yMjIsMCw3LjY1NCwzLjQzMyw3LjY1NCw3LjY1NEMxNy42NTQsMTQuMjIxLDE0LjIyMiwxNy42NTQsMTAsMTcuNjU0IE0xNC4zOSwxMGMwLDAuMjQ4LTAuMjAzLDAuNDUtMC40NSwwLjQ1SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMy0wLjQ1LTAuNDVzMC4yMDMtMC40NSwwLjQ1LTAuNDVoNy44NzlDMTQuMTg3LDkuNTUsMTQuMzksOS43NTIsMTQuMzksMTAgTTE0LjM5LDEyLjcwMmMwLDAuMjQ3LTAuMjAzLDAuNDQ5LTAuNDUsMC40NDlINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAyLTAuNDUtMC40NDljMC0wLjI0OCwwLjIwMy0wLjQ1MSwwLjQ1LTAuNDUxaDcuODc5QzE0LjE4NywxMi4yNTEsMTQuMzksMTIuNDU0LDE0LjM5LDEyLjcwMiBNMTQuMzksNy4yOThjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw2Ljg0OCwxNC4zOSw3LjA1MSwxNC4zOSw3LjI5OCI+PC9wYXRoPgoJICAgICAgICA8L3N2Zz4KICAgICAgICA8L2E+CiAgICAgICAgPGEgaWQ9InRpdGxlIiBocmVmPSIjIj5maWxlcy5odG1sPC9hPgogICAgICAgIDxmb3JtIGlkPSJxdWVyeS1mb3JtIiBhY3Rpb249IiMiPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJxdWVyeSIgbmFtZT0icXVlcnkiIGlkPSIiIC8+CiAgICAgICAgICA8c2VsZWN0IGlkPSJxdWVyeS10eXBlIj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iYWxsIj5hbGw8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaW1hZ2UiPmltYWdlczwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ2aWRlbyI+dmlkZW9zPC9vcHRpb24+CiAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgIDxpbnB1dCBpZD0iZ28iIHR5cGU9InN1Ym1pdCIgdmFsdWU9ImdvIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxzcGFuIGlkPSJxdWVyeWRpc3BsYXkiPgogICAgICAgICAgPHNwYW4gY2xhc3M9InRleHQiPjwvc3Bhbj4KICAgICAgICA8L3NwYW4+CiAgICAgICAgPGRpdiBpZD0ibG9hZGluZyI+dXBkYXRpbmc8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9ImltYWdlcyI+PC9kaXY+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly91bnBrZy5jb20vbm9zdHItdG9vbHMvbGliL25vc3RyLmJ1bmRsZS5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9zbG93bGkuZ2l0aHViLmlvL2JlY2gzMi1idWZmZXIvYXNzZXRzL2pzL2JlY2gzMi1idWZmZXIubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQ+CiAgICAgIGNvbnN0IHVwZGF0ZXNwdWJrZXkgPSAiYWU1YzZlMGI3NDY2MGQyMTk0YzgyNTRiNWMyYzgyNTY3NjU3NmJlMDI5NzM3OWZhMjA1MjMxMTRhNmE4NWU4NyIKICAgICAgY29uc3QgcXVlcmllcyA9IHsKICAgICAgICAiZ2xvYmFsIjogJ1siUkVRIiwiPEk+Iix7ImNhY2hlIjpbImV4cGxvcmUiLHsidGltZWZyYW1lIjoibGF0ZXN0Iiwic2NvcGUiOiJnbG9iYWwiLCJsaW1pdCI6PEw+fV19XScsIAogICAgICAgICJhdXRob3IiOiAnWyJSRVEiLCI8ST4iLHsia2luZHMiOlsxXSwiYXV0aG9ycyI6WyI8UD4iXX1dJywKICAgICAgICAicmVhY3Rpb25zIjogJ1siUkVRIiwiPEk+IiwgeyJraW5kcyI6WzddLCIjZSI6IDxFPn1dJwogICAgICB9CiAgICAgIHFzKCIjcmVsYXlzIikudmFsdWUgPSByZWxheXMoKS5qb2luKCJcbiIpCiAgICAgIHFzKCIjcHJpdmtleSIpLnZhbHVlID0gcHJpdmtleSgpCiAgICAgIGNvbnN0IGNvbG9wdHMgPSBbMSwgMiwgNCwgNiwgMTBdCgogICAgICBjb2xzID0gKCkgPT4gcGFyc2VJbnQoc2V0dGluZygiY29scyIsIGNvbG9wdHNbMV0pLCAxMCkKICAgICAgYXV0b3BsYXkgPSAoKSA9PiBzZXR0aW5nKCJhdXRvcGxheSIsICJvZmYiKQogICAgICBsaW1pdCA9ICgpID0+IHBhcnNlSW50KHNldHRpbmcoImxpbWl0IiwgMTUpLCAxMCkKICAgICAgCiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgiY29scyIgKyBjb2xzKCkpCiAgICAgIAogICAgICBsZXQgcHJvdG9jb2wgPSBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvKSA/ICJub3N0cjoiIDogIndlYitub3N0cjoiCiAgICAgIGxldCBzb2NrZXRzID0gW10KICAgICAgbGV0IHJlc2hhbmRsZXJzID0gW10KICAgICAgbGV0IHVybHMgPSBbXQogICAgICBsZXQgbGlrZXMgPSBbXQogICAgICBsZXQgbmV3bGlrZXMgPSBbXQogICAgICBsZXQgaWRjb3VudGVyID0gMAogICAgICBsZXQgcXVlcnl3YWl0ID0gbnVsbAogICAgICBsZXQgcHJpbWFsc29ja2V0ID0gbnVsbAogICAgICBsZXQgdHlwZXMgPSB7CiAgICAgICAgaW1hZ2U6IFsicG5nIiwgImpwZyIsICJqcGVnIiwgIndlYnAiXSwKICAgICAgICB2aWRlbzogWyJtcDQiLCAid2VibSJdCiAgICAgIH0KICAgICAgbGV0IGltZ3JlZ2V4ID0gL2h0dHAofHMpXDpcL1wvW14gXG5dKj9cLihwbmd8anBnfGpwZWd8d2VicCkvZ2kKICAgICAgbGV0IHZpZGVvcmVnZXggPSAvaHR0cCh8cylcOlwvXC9bXiBcbl0qP1wuKG1wNHx3ZWJtKS9naQogICAgICBsZXQgdmlkZW9leHRyZWdleCA9IC9cLihtcDR8d2VibSkkL2kKICAgICAgbGV0IGltZ2V4dHJlZ2V4ID0gL1wuKHBuZ3xqcGd8anBlZ3x3ZWJwKSQvaQogICAgICB3YWl0bXMgPSA1MDAwCiAgICAgIHF1ZXJ5c3RyID0gIiIKICAgICAgbGV0IHF1ZXJ5Y291bnQgPSAwCiAgICAgIGxldCBob3ZlcmVkdmlkZW8gPSBudWxsCiAgICAgIAogICAgICB1cGRhdGVxdWVyeSgpCiAgICAgIHFzKCIjaW1hZ2UtbGlrZSIpLmlubmVySFRNTCA9IHFzKCIjZmlsdGVyLWxpa2VzIikuaW5uZXJIVE1MID0gcXMoIiN0ZW1wbGF0ZSAuaGVhcnRzdmciKS5vdXRlckhUTUwKICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgIHNldGFjdGl2ZSgic2V0YXV0b3BsYXkiLCAiYXV0b3BsYXkiLCBhdXRvcGxheSgpKQogICAgICAKICAgICAgZnVuY3Rpb24gZnJvbUhleFN0cmluZyhzdHIpewogICAgICAgIGxldCBidWZmZXIgPSBuZXcgVWludDhBcnJheShzdHIubGVuZ3RoIC8gMikKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlci5sZW5ndGg7IGkrKykgewogICAgICAgICAgYnVmZmVyW2ldID0gcGFyc2VJbnQoc3RyLnN1YnN0cigyICogaSwgMiksIDE2KQogICAgICAgIH0KICAgICAgICByZXR1cm4gYnVmZmVyCiAgICAgIH0KICAKICAgICAgZnVuY3Rpb24gcmVsYXlzKCl7CiAgICAgICAgY29uc3Qgb2JqID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgicmVsYXlzIikpCiAgICAgICAgY29uc3QgciA9IG9iaiAmJiBvYmouZmlsdGVyKHIgPT4gci5tYXRjaCgvd3NzOlwvXC8uKy8pKSB8fCBbXQogICAgICAgIAogICAgICAgIHJldHVybiByLmxlbmd0aCA+IDAgJiYgciB8fCBbCiAgICAgICAgICAid3NzOi8vcmVsYXkubm9zdHIuYmFuZCIsCiAgICAgICAgICAid3NzOi8vbmIucmVsYXkuY2VudGVyIiwgCiAgICAgICAgICAid3NzOi8vbm9zdHIuY29tcGlsZS1lcnJvci5uZXQiCiAgICAgICAgXQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBwcml2a2V5KCl7CiAgICAgICAgbGV0IGtleSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJwcml2a2V5IikgfHwgIiIKICAgICAgICAKICAgICAgICBpZihrZXkubGVuZ3RoID09IDYzKXsKICAgICAgICAgIGtleSA9IE5vc3RyVG9vbHMubmlwMTkuZGVjb2RlKGtleSkuZGF0YQogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4ga2V5Lmxlbmd0aCA9PSA2NCAmJiBrZXkgfHwgbnVsbAogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzZXR0aW5nKGtleSwgZGVmYXVsdHZhbHVlKXsKICAgICAgICBjb25zdCB2ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KQogICAgICAgIHJldHVybiB2ICYmIG9wdGlvbigic2V0IiArIGtleSwga2V5LCB2KSAmJiB2IHx8IGRlZmF1bHR2YWx1ZQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBvcHRpb24oYywga2V5LCB2YWwpewogICAgICAgIHJldHVybiBxcygiLiIgKyBjICsgIltkYXRhLSIgKyBrZXkgKyAiPSciICsgdmFsICsgIiddIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXMocSl7CiAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXNhKHEpewogICAgICAgIHJldHVybiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocSkpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGdpZChpKXsKICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXVlcnl0eXBlKCl7CiAgICAgICAgcmV0dXJuIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlIHx8ICJhbGwiCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZXF1ZXJ5KCl7CiAgICAgICAgbGV0IHBhcnRzID0gZGVjb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpKS5zcGxpdCgiLyIpCiAgICAgICAgcXVlcnlzdHIgPSBxcygiI3F1ZXJ5ZGlzcGxheSAudGV4dCIpLmlubmVyVGV4dCA9IHBhcnRzWzBdCiAgICAgICAgcXMoIiNxdWVyeSIpLnZhbHVlID0gcGFydHNbMF0KICAgICAgICBxcygiI3F1ZXJ5LXR5cGUiKS52YWx1ZSA9IHBhcnRzWzFdIHx8ICJhbGwiCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGFjdGl2ZSgpewogICAgICAgIHJldHVybiBxcygiI2ltYWdlcyAuYWN0aXZlIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gaW1hZ2VvZmZzZXQob2Zmc2V0KXsKICAgICAgICBjb25zdCBpbWFnZXMgPSBxc2EoIiNpbWFnZXMgPiAuaXRlbSIpLmZpbHRlcihlID0+IGUuc3R5bGUuZGlzcGxheSA9PSAiYmxvY2siKQogICAgICAgIHJldHVybiBpbWFnZXNbaW1hZ2VzLmluZGV4T2YoYWN0aXZlKCkpK29mZnNldF0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gbGFzdGFjdGl2ZSgpewogICAgICAgIHJldHVybiBxc2EoIiNpbWFnZXMgLmFjdGl2ZSIpLnBvcCgpICAgICAgCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIG1lbnUoKXsKICAgICAgICBxc2EoIiNtZW51LWNvbnRlbnQsICNtZW51LW92ZXJsYXkiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QudG9nZ2xlKCJvcGVuIikpCiAgICAgIH0KICAKICAgICAgZnVuY3Rpb24gc2V0YWN0aXZlKGMsIGtleSwgdmFsKXsKICAgICAgICBxc2EoIi4iICsgYykuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikpCiAgICAgICAgY29uc3Qgb3B0aW9uID0gcXMoIi4iICsgYyArICJbZGF0YS0iICsga2V5ICsgIj0nIiArIHZhbCArICInXSIpCiAgICAgICAgb3B0aW9uPy5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzY3JvbGx2aXNpYmxlKG4sIG9mZnNldCl7CiAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDAKICAgICAgICByZXR1cm4gKG4ub2Zmc2V0VG9wICsgbi5vZmZzZXRIZWlnaHQpID49IChzY3JvbGxZIC0gb2Zmc2V0KQogICAgICAgICAgJiYgbi5vZmZzZXRUb3AgPD0gKHNjcm9sbFkgKyB2aXN1YWxWaWV3cG9ydC5oZWlnaHQgKyBvZmZzZXQpCiAgICAgIH0KCiAgICAgIGxldCBpbWFnZXVwZGF0ZXRpbWUgPSAwCiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiB1cGRhdGVpbWFnZXNsb2FkKCl7CiAgICAgICAgbGV0IHQgPSBEYXRlLm5vdygpCiAgICAgICAgaWYodCAtIGltYWdldXBkYXRldGltZSA8IDEwMCl7CiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaW1hZ2V1cGRhdGV0aW1lID0gdAoKICAgICAgICBxc2EoIiNpbWFnZXMgLml0ZW0uaW1nIikuZm9yRWFjaChhc3luYyBpbWcgPT4gewogICAgICAgICAgaWYoc2Nyb2xsdmlzaWJsZShpbWcsIHZpc3VhbFZpZXdwb3J0LmhlaWdodCAvIDIpKXsKICAgICAgICAgICAgaW1nLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICJ1cmwoIiArIGltZ1siZGF0YS1zcmMiXSArICIpIgogICAgICAgICAgICBjb25zb2xlLmxvZygic2V0IGJnIiwgaW1nWyJkYXRhLXNyYyJdKQogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIGltZy5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAiIgogICAgICAgICAgfQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgY29uc29sZS5sb2coInVwZGF0ZWltYWdlc2xvYWQgbXMiLCBEYXRlLm5vdygpIC0gdCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlYWxsdmlkZW9wbGF5KCl7CiAgICAgICAgcXNhKCIjaW1hZ2VzIC5pdGVtLnZpZGVvIikuZm9yRWFjaChhc3luYyBuID0+IHVwZGF0ZXZpZGVvcGxheShuKSkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRldmlkZW9wbGF5KG4pewogICAgICAgIGNvbnN0IGFwbGF5ID0gYXV0b3BsYXkoKQogICAgICAgIGNvbnN0IHYgPSBuLnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAKICAgICAgICBpZihhcGxheSAhPSAib24iKXsKICAgICAgICAgIHYubXV0ZWQgPSBmYWxzZQogICAgICAgICAgdi5wYXVzZSgpCiAgICAgICAgfWVsc2V7CiAgICAgICAgICB2Lm11dGVkID0gdHJ1ZQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZighc2Nyb2xsdmlzaWJsZShuKSl7CiAgICAgICAgICBpZih2LnJlYWR5U3RhdGUgPT0gNCl7CiAgICAgICAgICAgIHYucGF1c2UoKQogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIHYucHJlbG9hZCA9ICJub25lIgogICAgICAgICAgfQogICAgICAgIH1lbHNlIGlmKHYucmVhZHlTdGF0ZSAhPSA0KXsKICAgICAgICAgIHYucHJlbG9hZCA9ICJhdXRvIgogICAgICAgIH0KICAgICAgICBlbHNlIGlmKGFwbGF5ID09ICJvbiIgfHwgKGFwbGF5ID09ICJob3ZlciIgJiYgdiA9PSBob3ZlcmVkdmlkZW8pKXsKICAgICAgICAgIHYucGxheSgpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLCBlID0+IHsKICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpCiAgICAgICAgdXBkYXRlaW1hZ2VzbG9hZCgpCiAgICAgICAgdXBkYXRlYWxsdmlkZW9wbGF5KCkKICAgICAgfSkKICAgICAgCiAgICAgIGxldCB0b3VjaCA9IG51bGwKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCBlID0+IHRvdWNoID0gZS5jaGFuZ2VkVG91Y2hlc1swXSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIiwgZSA9PiB7CiAgICAgICAgY29uc3QgeGRpZmYgPSBlLmNoYW5nZWRUb3VjaGVzWzBdLnNjcmVlblggLSB0b3VjaC5zY3JlZW5YCgogICAgICAgIGlmKHhkaWZmIDwgLTUwKXsKICAgICAgICAgIHN3aXBlKDEpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKHhkaWZmID4gNTApewogICAgICAgICAgc3dpcGUoLTEpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgcXMoIiNxdWVyeS1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgbG9jYXRpb24uaGFzaCA9ICIjIiArIGVuY29kZVVSSUNvbXBvbmVudChxcygiI3F1ZXJ5IikudmFsdWUgKyAiLyIgKyBxdWVyeXR5cGUoKSkKICAgICAgICB1cGRhdGVxdWVyeSgpCiAgICAgICAgcXVlcnl3YWl0LnJlc29sdmUoKQogICAgICB9KQoKICAgICAgcXMoIiNyZWxheXMtZm9ybSIpLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsIGFzeW5jIGUgPT4gewogICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIGxldCByID0gSlNPTi5zdHJpbmdpZnkocXMoIiNyZWxheXMiKS52YWx1ZS5zcGxpdCgiXG4iKSkKICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgicmVsYXlzIiwgcikKICAgICAgICBkaXNjb25uZWN0KCkKICAgICAgfSkKCiAgICAgIHFzKCIjcHJpdmtleS1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgYXN5bmMgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgY29uc3Qga2V5ID0gcXMoIiNwcml2a2V5IikudmFsdWUKCiAgICAgICAgaWYoa2V5Lmxlbmd0aCAhPSA2NCAmJiBrZXkubGVuZ3RoICE9IDYzKXsKICAgICAgICAgIGFsZXJ0KCJrZXkgc2hvdWxkIGJlIDYzIG9yIDY0IGNoYXJhY3RlcnMgbG9uZyIpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oInByaXZrZXkiLCBrZXkpCiAgICAgICAgYWxlcnQoImtleSBzYXZlZCIpCiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLCBhc3luYyAoZSkgPT4gewogICAgICAgIGlmKGF1dG9wbGF5KCkgPT0gImhvdmVyIiAmJiBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInZpZGVvLWNvbnRhaW5lciIpKXsKICAgICAgICAgIGhvdmVyZWR2aWRlbyA9IGUudGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAgIGhvdmVyZWR2aWRlby5wbGF5KCkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaG92ZXJlZHZpZGVvID0gZmFsc2UKICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLnN0eWxlLmRpc3BsYXkgIT0gImJsb2NrIiAmJiBhdXRvcGxheSgpID09ICJob3ZlciIgJiYgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2aWRlby1jb250YWluZXIiKSl7CiAgICAgICAgICBxc2EoInZpZGVvIikuZm9yRWFjaCh2ID0+IHYucGF1c2UoKSkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaWYoZS50YXJnZXQudHlwZSA9PSAic3VibWl0IiB8fCAoZS50YXJnZXQudGFnTmFtZSA9PSAiQSIgJiYgZS50YXJnZXQuaHJlZi5tYXRjaCgvXih8d2ViXCspbm9zdHJcOi8pKSl7CiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAidGl0bGUiKXsKICAgICAgICAgIHFzKCIjcXVlcnkiKS52YWx1ZSA9ICIiCiAgICAgICAgICBxcygiI3F1ZXJ5LXR5cGUiKS52YWx1ZSA9ICJhbGwiCiAgICAgICAgICBxcygiI2dvIikuY2xpY2soKQogICAgICAgIH0KCiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJmaWx0ZXItbGlrZXMiKXsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnRvZ2dsZSgiZmlsdGVyLWxpa2VzIikKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKSl7CiAgICAgICAgICBhY3RpdmUoKT8uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIGdpZChlLnRhcmdldC5pZCkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIHNob3coZS50YXJnZXQuaWQpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS50YXJnZXQudGFnTmFtZSAhPSAiQSIgJiYgKHFzKCIjaW1hZ2UtY29udGFpbmVyIikgPT0gZS50YXJnZXQgfHwgcXMoIiNpbWFnZSIpID09IGUudGFyZ2V0IHx8IHFzKCIjbWVkaWEtY29udGFpbmVyIHZpZGVvIikgPT0gZS50YXJnZXQpKXsKICAgICAgICAgIGhpZGVtZWRpYSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJtZW51IiB8fCBlLnRhcmdldC5pZCA9PSAibWVudS1vdmVybGF5Iil7CiAgICAgICAgICBtZW51KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRjb2xzIikpewogICAgICAgICAgZm9yKGxldCBjIG9mIGNvbG9wdHMpewogICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoImNvbHMiICsgYykKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJjb2xzIiArIGUudGFyZ2V0LmRhdGFzZXQuY29scykKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJjb2xzIiwgZS50YXJnZXQuZGF0YXNldC5jb2xzKQogICAgICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRhdXRvcGxheSIpKXsKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJhdXRvcGxheSIsIGUudGFyZ2V0LmRhdGFzZXQuYXV0b3BsYXkpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGF1dG9wbGF5IiwgImF1dG9wbGF5IiwgYXV0b3BsYXkoKSkKICAgICAgICAgIHVwZGF0ZWFsbHZpZGVvcGxheSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJsaWtlIikgJiYgbGlrZShlLnRhcmdldCkKICAgICAgfSkKICAgICAgCiAgICAgIGZ1bmN0aW9uIGhhc2tleSgpewogICAgICAgIHJldHVybiB3aW5kb3cubm9zdHIgfHwgcHJpdmtleSgpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHB1YmtleSgpewogICAgICAgIHJldHVybiB3aW5kb3cubm9zdHIgJiYgYXdhaXQgd2luZG93Lm5vc3RyLmdldFB1YmxpY0tleSgpIHx8IE5vc3RyVG9vbHMuZ2V0UHVibGljS2V5KHByaXZrZXkoKSkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gc2lnbihldmVudCl7CiAgICAgICAgaWYod2luZG93Lm5vc3RyKXsKICAgICAgICAgIHJldHVybiBhd2FpdCBub3N0ci5zaWduRXZlbnQoZXZlbnQpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGV2ZW50LnNpZyA9IE5vc3RyVG9vbHMuZ2V0U2lnbmF0dXJlKGV2ZW50LCBwcml2a2V5KCkpCiAgICAgICAgcmV0dXJuIGV2ZW50CiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGxpa2UobGluayl7CiAgICAgICAgY29uc3QgZXZlbnQgPSBsaW5rLnBhcmVudEVsZW1lbnRbImRhdGEtZXZlbnQiXQogICAgICAgIGNvbnN0IHB1YmsgPSBhd2FpdCBwdWJrZXkoKQogICAgICAgIGNvbnN0IGxpa2UgPSBhd2FpdCBzaWduKHsKICAgICAgICAgICJraW5kIjogNywKICAgICAgICAgICJjb250ZW50IjogIisiLAogICAgICAgICAgInRhZ3MiOiBbCiAgICAgICAgICAgIFsiZSIsIGV2ZW50LmlkXSwKICAgICAgICAgICAgWyJwIiwgZXZlbnQucHVia2V5XQogICAgICAgICAgXSwKICAgICAgICAgICJwdWJrZXkiOiBwdWJrLAogICAgICAgICAgImNyZWF0ZWRfYXQiOiBwYXJzZUludChEYXRlLm5vdygpIC8gMTAwMCAsIDEwKQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgc29ja2V0cy5mb3JFYWNoKHMgPT4gcy5zZW5kKEpTT04uc3RyaW5naWZ5KFsiRVZFTlQiLCBsaWtlXSkpKQogICAgICAgIGxpbmsuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCgogICAgICAgIGNvbnN0IGltYWdlaWQgPSBsaW5rWyJkYXRhLWl0ZW0taWQiXSB8fCBsaW5rLmRhdGFzZXQuaW1hZ2VJZAogICAgICAgIAogICAgICAgIGlmKGltYWdlaWQpewogICAgICAgICAgZ2lkKGltYWdlaWQpLnF1ZXJ5U2VsZWN0b3IoIi5saWtlIikuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgfQogICAgICB9CiAgICAKICAgICAgZnVuY3Rpb24gc3dpcGUob2Zmc2V0KXsKICAgICAgICBpZihpbWFnZW9mZnNldChvZmZzZXQpKXsKICAgICAgICAgIGltYWdlb2Zmc2V0KG9mZnNldCkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIHRoaXNbb2Zmc2V0ID09IDEgJiYgImxhc3RhY3RpdmUiIHx8ICJhY3RpdmUiXSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICB1cGRhdGVzaG93KCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZXNob3coKXsKICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLnN0eWxlLmRpc3BsYXkgPT0gImJsb2NrIil7CiAgICAgICAgICBoaWRldmlkZW8oKQogICAgICAgICAgc2hvdyhhY3RpdmUoKS5pZCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBlID0+IHsKICAgICAgICBpZihbIlRhYiIsICJBcnJvd0xlZnQiLCAiQXJyb3dSaWdodCIsICJBcnJvd1VwIiwgIkFycm93RG93biJdLmluY2x1ZGVzKGUua2V5KSl7CiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJFc2NhcGUiKXsKICAgICAgICAgIG1lbnUoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUua2V5ID09ICJFbnRlciIgJiYgZS50YXJnZXQudGFnTmFtZSA9PSAiQk9EWSIpewogICAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5zdHlsZS5kaXNwbGF5ID09ICJibG9jayIpewogICAgICAgICAgICBoaWRlbWVkaWEoKQogICAgICAgICAgICByZXR1cm4KICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgc2hvdyhhY3RpdmUoKS5pZCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93VXAiICYmIGltYWdlb2Zmc2V0KC1jb2xzKCkpKXsKICAgICAgICAgIGltYWdlb2Zmc2V0KC1jb2xzKCkpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBsYXN0YWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIHVwZGF0ZXNob3coKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93RG93biIgJiYgaW1hZ2VvZmZzZXQoY29scygpKSl7CiAgICAgICAgICBpbWFnZW9mZnNldChjb2xzKCkpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgdXBkYXRlc2hvdygpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dMZWZ0Iil7CiAgICAgICAgICBzd2lwZSgtMSkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd1JpZ2h0Iil7CiAgICAgICAgICBzd2lwZSgxKQogICAgICAgIH0KICAgICAgfSkKCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZXF1ZXJ5cmVzKHJlcywgc29ja2V0LCBxLCB0eXBlLCBzdGltZSl7CiAgICAgICAgc2F2ZShzb2NrZXQsIHJlcywgcSwgdHlwZSwgZmFsc2UsIGZhbHNlLCB0cnVlKQogICAgICAgIGxvZygicXVlcnkgcmVzIiwgcmVzLmxlbmd0aCwgc29ja2V0LnVybCkKICAgICAgICBxdWVyeWNvdW50LS0KICAgICAgICBpZihxdWVyeWNvdW50ID09IDApewogICAgICAgICAgcXMoIiNsb2FkaW5nIikuc3R5bGUuZGlzcGxheSA9ICJub25lIgogICAgICAgIH0KICAgICAgICAKICAgICAgICBsZXQgd2FpdCA9IHdhaXRtcyAtIChEYXRlLm5vdygpIC0gc3RpbWUpCiAgICAgICAgcXVlcnl3YWl0ID0gc2xlZXAod2FpdCkKICAgICAgICBhd2FpdCBxdWVyeXdhaXQucHJvbWlzZQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBwcmltYWxnbG9iYWwoc29ja2V0KXsKICAgICAgICBsb2coImdsb2JhbCIsIHNvY2tldC51cmwpCiAgICAgICAgcXVlcnljb3VudCsrCiAgICAgICAgcXMoIiNsb2FkaW5nIikuc3R5bGUuZGlzcGxheSA9ICJibG9jayIKICAgICAgICBsZXQgc3RpbWUgPSBEYXRlLm5vdygpCiAgICAgICAgbGV0IHFpZCA9ICJnbG9iYWxfIiArICgrK2lkY291bnRlcikKICAgICAgICBsZXQgcWlkbGlrZXMgPSAibGlrZXNfIiArICgrK2lkY291bnRlcikKCiAgICAgICAgaWYobmV3bGlrZXMubGVuZ3RoID4gMCl7CiAgICAgICAgICBwcmltYWxzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAgICJSRVEiLCAKICAgICAgICAgICAgcWlkbGlrZXMsIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgImNhY2hlIjogWwogICAgICAgICAgICAgICAgImV2ZW50cyIsIHsKICAgICAgICAgICAgICAgICAgImV2ZW50X2lkcyI6IG5ld2xpa2VzCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgICBdKSkKCiAgICAgICAgICBjb25zdCBsaWtlX2V2ZW50cyA9IGF3YWl0IHdhaXRyZXMocWlkbGlrZXMpCiAgICAgICAgICBuZXdsaWtlcy5zcGxpY2UoMCkKICAgICAgICAgIAogICAgICAgICAgYXdhaXQgc2F2ZShzb2NrZXQsIGxpa2VfZXZlbnRzLCAiIiwgImFsbCIsIHRydWUsIHRydWUsIGZhbHNlKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAiUkVRIiwgCiAgICAgICAgICBxaWQsIAogICAgICAgICAgewogICAgICAgICAgICAiY2FjaGUiOiBbCiAgICAgICAgICAgICAgImV4cGxvcmUiLCAKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidGltZWZyYW1lIjogImxhdGVzdCIsCiAgICAgICAgICAgICAgICAic2NvcGUiOiAiZ2xvYmFsIiwKICAgICAgICAgICAgICAgICJsaW1pdCI6IDIwCiAgICAgICAgICAgICAgfQogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSkpCiAgICAgICAgCiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgd2FpdHJlcyhxaWQpCiAgICAgICAgYXdhaXQgaGFuZGxlcXVlcnlyZXMocmVzLmZpbHRlcihlID0+IGUua2luZCA9PSAxKSwgc29ja2V0LCAiIiwgImFsbCIsIHN0aW1lKQogICAgICAgIHByaW1hbGdsb2JhbChzb2NrZXQpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5KHNvY2tldCwgcHJpbWFsKXsKICAgICAgICBsb2coInF1ZXJ5Iiwgc29ja2V0LnVybCkKICAgICAgICBxdWVyeWNvdW50KysKICAgICAgICBxcygiI2xvYWRpbmciKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgIAogICAgICAgIGxldCBzdGltZSA9IERhdGUubm93KCkKICAgICAgICBsZXQgcSA9IHF1ZXJ5c3RyLnRyaW0oKQogICAgICAgIGxldCB0eXBlID0gcXVlcnl0eXBlKCkKICAgICAgICBsZXQgaSA9ICsraWRjb3VudGVyCiAgICAgICAgbGV0IHFpZCA9ICJxdWVyeV8iICsgaQogICAgICAgIGxldCBmaWx0ZXJzID0gW10KCiAgICAgICAgZmlsdGVycy5wdXNoKC4uLih0eXBlc1t0eXBlXSB8fCBbXSkubWFwKCh0KSA9PiB7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBraW5kczogWzFdLCAKICAgICAgICAgICAgc2VhcmNoOiAiLiIgKyB0LAogICAgICAgICAgICBsaW1pdDogMjAKICAgICAgICAgIH0KICAgICAgICB9KSkKICAgICAgICAKICAgICAgICBpZihxLmxlbmd0aCA+IDApewogICAgICAgICAgZmlsdGVycy5wdXNoKHtraW5kczogWzFdLCBzZWFyY2g6IHF9KQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihmaWx0ZXJzLmxlbmd0aCA9PSAwKXsKICAgICAgICAgIGZpbHRlcnMucHVzaCh7a2luZHM6IFsxXX0pCiAgICAgICAgfQogICAgICAgIAogICAgICAgIAogICAgICAgIGNvbnN0IGxpa2VzcmVzID0gYXdhaXQgcXVlcnlsaWtlcyhzb2NrZXQpCiAgICAgICAgCiAgICAgICAgbGlrZXNyZXMuZm9yRWFjaChldmVudGlkID0+IHsKICAgICAgICAgIGlmKCFsaWtlcy5pbmNsdWRlcyhldmVudGlkKSl7CiAgICAgICAgICAgIGxpa2VzLnB1c2goZXZlbnRpZCkKICAgICAgICAgICAgbmV3bGlrZXMucHVzaChldmVudGlkKQogICAgICAgICAgfQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgY29uc3Qgc2VhcmNob2JqID0gWyJSRVEiLCBxaWQsIC4uLmZpbHRlcnNdCiAgICAgICAgY29uc3Qgc2VhcmNoanNvbiA9IEpTT04uc3RyaW5naWZ5KHNlYXJjaG9iaikKICAgICAgICBzb2NrZXQuc2VuZChzZWFyY2hqc29uKQogICAgICAgIAogICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHdhaXRyZXMocWlkKQogICAgICAgIGF3YWl0IGhhbmRsZXF1ZXJ5cmVzKHJlcywgc29ja2V0LCBxLCB0eXBlLCBzdGltZSkKICAgICAgICBxdWVyeShzb2NrZXQpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5bGlrZXMoc29ja2V0KXsKICAgICAgICBpZighaGFza2V5KCkpewogICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IG15cHVia2V5ID0gYXdhaXQgcHVia2V5KCkKICAgICAgICBjb25zdCBldmVudHMgPSBhd2FpdCBxdWVyeWV2ZW50cyhzb2NrZXQsIFs3XSwgbnVsbCwgW215cHVia2V5XSkKICAgICAgICByZXR1cm4gZXZlbnRzLm1hcChlID0+IGUudGFncy5maW5kKHQgPT4gdFswXSA9PSAiZSIpWzFdKQogICAgICB9CgogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeWV2ZW50cyhzb2NrZXQsIGtpbmRzLCBldmVudGlkcywgYXV0aG9ycyl7CiAgICAgICAgY29uc3QgcXVlcnlpZCA9ICJldmVudHNfIiArICgrK2lkY291bnRlcikKICAgICAgICBjb25zdCBmaWx0ZXJzID0ge30KICAgICAgICAKICAgICAgICBmaWx0ZXJzLmtpbmRzID0ga2luZHMKICAgICAgICAKICAgICAgICBpZihldmVudGlkcyl7CiAgICAgICAgICBmaWx0ZXJzWyIjZSJdID0gZXZlbnRpZHMKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoYXV0aG9ycyl7CiAgICAgICAgICBmaWx0ZXJzWyJhdXRob3JzIl0gPSBhdXRob3JzCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAiUkVRIiwgCiAgICAgICAgICBxdWVyeWlkLCAKICAgICAgICAgIGZpbHRlcnMKICAgICAgICBdKQoKICAgICAgICBzb2NrZXQuc2VuZChqc29uKQogICAgICAgIAogICAgICAgIHJldHVybiBhd2FpdCB3YWl0cmVzKHF1ZXJ5aWQpIHx8IFtdCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5cHVia2V5KHNvY2tldCwgcHViayl7CiAgICAgICAgY29uc3QgcXVlcnlpZCA9ICJxdWVyeV8iICsgKCsraWRjb3VudGVyKQogICAgICAgIHNvY2tldC5zZW5kKHF1ZXJpZXMuYXV0aG9yLnJlcGxhY2UoIjxJPiIsIHF1ZXJ5aWQpLnJlcGxhY2UoIjxQPiIsIHB1YmspKQoKICAgICAgICByZXR1cm4gKGF3YWl0IHdhaXRyZXMocXVlcnlpZCkpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHNhdmUoc29ja2V0LCBldmVudGRiLCBxLCBxdHlwZSwgcmVhY3RlZCwgYXBwZW5kLCBxdWVyeW1ldGEpewogICAgICAgIGxldCBldmVudHB1YmtleXMgPSBbXQogICAgICAgIGNvbnN0IGV2ZW50cyA9IGV2ZW50ZGIuZmlsdGVyKG8gPT4gewogICAgICAgICAgaWYocS5sZW5ndGggPiAwKXsKICAgICAgICAgICAgZm9yKGxldCB3b3JkIG9mIHEuc3BsaXQoIiAiKSl7CiAgICAgICAgICAgICAgaWYoby5jb250ZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZih3b3JkLnRvTG93ZXJDYXNlKCkpID09IC0xKXsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIHJldHVybiB0cnVlCiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBsZXQgcmVzdWx0cyA9IFtdCiAgICAgICAgY29uc3QgZXZlbnRpZHMgPSBldmVudHMubWFwKGUgPT4gZS5pZCkKICAgICAgICBsZXQgbmV3dXJscyA9IFtdCiAgICAgICAgCiAgICAgICAgZm9yKGxldCBldmVudCBvZiBldmVudHMpewogICAgICAgICAgbGV0IHVybHNtYXRjaCA9IFtdCiAgICAgICAgICAKICAgICAgICAgIGlmKHF0eXBlICE9ICJ2aWRlbyIpewogICAgICAgICAgICB1cmxzbWF0Y2gucHVzaCguLi4oZXZlbnQuY29udGVudC5tYXRjaChpbWdyZWdleCkgfHwgW10pKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBpZihxdHlwZSAhPSAiaW1hZ2UiKXsKICAgICAgICAgICAgdXJsc21hdGNoLnB1c2goLi4uKGV2ZW50LmNvbnRlbnQubWF0Y2godmlkZW9yZWdleCkgfHwgW10pKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICB1cmxzbWF0Y2ggPSB1cmxzbWF0Y2guZmlsdGVyKHVybCA9PiAhdXJscy5pbmNsdWRlcyh1cmwpKQoKICAgICAgICAgIGlmKHVybHNtYXRjaC5sZW5ndGggPiAwKXsKICAgICAgICAgICAgbmV3dXJscy5wdXNoKHsKICAgICAgICAgICAgICBldmVudDogZXZlbnQsCiAgICAgICAgICAgICAgdXJsczogdXJsc21hdGNoCiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIAogICAgICAgICAgICB1cmxzLnB1c2goLi4udXJsc21hdGNoKQogICAgICAgICAgICBldmVudHB1YmtleXMuaW5jbHVkZXMoZXZlbnQucHVia2V5KSB8fCBldmVudHB1YmtleXMucHVzaChldmVudC5wdWJrZXkpCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxvZygicXVlcnkgbWV0YSIsIHNvY2tldC51cmwpCiAgICAgICAgbGV0IG1ldGFldmVudHMgPSAocXVlcnltZXRhICYmIGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzBdLCBudWxsLCBldmVudHB1YmtleXMpIHx8IFtdKQogICAgICAgIAogICAgICAgIGZvcihsZXQgZW50cnkgb2YgbmV3dXJscyl7CiAgICAgICAgICBmb3IobGV0IHVybCBvZiBlbnRyeS51cmxzKXsKICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHsKICAgICAgICAgICAgICByZWFjdGVkOiByZWFjdGVkIHx8IGxpa2VzLmluY2x1ZGVzKGVudHJ5LmV2ZW50LmlkKSwgCiAgICAgICAgICAgICAgdXJsOiB1cmwsIAogICAgICAgICAgICAgIGV2ZW50OiBlbnRyeS5ldmVudCwgCiAgICAgICAgICAgICAgYmVjaDMyaWQ6IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKGVudHJ5LmV2ZW50LmlkKSksCiAgICAgICAgICAgICAgbWV0YTogbWV0YWV2ZW50cy5maW5kKG8gPT4gby5wdWJrZXkgPT0gZW50cnkuZXZlbnQucHVia2V5KQogICAgICAgICAgICB9KQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBsb2coInNhdmUgcmVzIiwgcmVzdWx0cy5sZW5ndGgsIHNvY2tldC51cmwpCiAgICAgICAgdXBkYXRlY29udGVudChyZXN1bHRzLCBxLCBhcHBlbmQpCiAgICAgIH0KICAgICAgCiAgICAgIGxldCBsb2FkZWQgPSAwCiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVjb250ZW50KHJlc3VsdHMsIHEsIGFwcGVuZCl7CiAgICAgICAgcmVzdWx0cy5yZXZlcnNlKCkuZm9yRWFjaChpdGVtID0+IHsKICAgICAgICAgIGNvbnN0IHR5cGUgPSBpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KSAmJiAidmlkZW8iIHx8ICJpbWFnZSIKICAgICAgICAgIGNvbnN0IHRleHQgPSAocSB8fCAidmlldyBub3RlIikuc3Vic3RyaW5nKC0zMCkKICAgICAgICAgIGNvbnN0IGlkID0gIml0ZW1fIiArICgrK2lkY291bnRlcikKICAgICAgICAgIGNvbnN0IGNvbnRlbnRlbGVtZW50cyA9ICc8ZGl2IGNsYXNzPSJ0eXBlIj4nICsgcXMoIiN0ZW1wbGF0ZSAuIiArIHR5cGUgKyAic3ZnIikub3V0ZXJIVE1MICsgJzwvZGl2PjxhIGNsYXNzPSJsaWtlJyArIChpdGVtLnJlYWN0ZWQgPyAnIHJlYWN0ZWQnIDogJycpICsgJyIgZGF0YS1pdGVtLWlkPSInICsgaWQgKyAKICAgICAgICAgICAgJyIgaHJlZj0iIyI+JyArIHFzKCIjdGVtcGxhdGUgLmhlYXJ0c3ZnIikub3V0ZXJIVE1MICsgJzwvYT48YSBjbGFzcz0icXVlcnkiIGhyZWY9IicgKyBwcm90b2NvbCArIAogICAgICAgICAgICBpdGVtLmJlY2gzMmlkICsgJyI+JyArIHRleHQgKyAnPC9hPicKICAgICAgICAgIGxldCByb290ID0gbnVsbAogICAgICAgICAgbGV0IHYgPSBudWxsCiAgICAgICAgICAKICAgICAgICAgIGlmKGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpKXsKICAgICAgICAgICAgcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCiAgICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgidmlkZW8tY29udGFpbmVyIikKICAgICAgICAgICAgcm9vdC5pbm5lckhUTUwgPSBjb250ZW50ZWxlbWVudHMKICAgICAgICAgICAgCiAgICAgICAgICAgIHYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpCiAgICAgICAgICAgIHZbImRhdGEtaXRlbS1pZCJdID0gaWQKICAgICAgICAgICAgdi5wcmVsb2FkID0gIm5vbmUiCiAgICAgICAgICAgIHYubG9vcCA9IHRydWUKICAgICAgICAgICAgdi5wbGF5c2lubGluZSA9ICIiCiAgICAgICAgICAgIAogICAgICAgICAgICB2Lm9uY2FucGxheSA9IGFzeW5jIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIGNvbnN0IGFzcGVjdCA9IHRoaXMudmlkZW9XaWR0aCAvIHRoaXMudmlkZW9IZWlnaHQKICAgICAgICAgICAgICBpZihhc3BlY3QgPiAxKXsKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUud2lkdGggPSAoYXNwZWN0ICogMTAwKSArICIlIgogICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgdGhpcy5zdHlsZS5oZWlnaHQgPSAoMSAvIGFzcGVjdCAqIDEwMCkgKyAiJSIKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUubWFyZ2luVG9wID0gLSgoMSAvIGFzcGVjdCAqIDEwMCAtIDEwMCkgLyAyKSArICIlIgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAKICAgICAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkodGhpcy5wYXJlbnRFbGVtZW50KQogICAgICAgICAgICB9CgogICAgICAgICAgICBjb25zdCBleHQgPSBpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KVsxXQogICAgICAgICAgICB2LmlubmVySFRNTCA9ICc8c291cmNlIHNyYz0iJyArIGl0ZW0udXJsICsgJyIgdHlwZT0idmlkZW8vJyArIGV4dCArICciPjwvc291cmNlPicKICAgICAgICAgICAgCiAgICAgICAgICAgIHJvb3QuYXBwZW5kKHYpCiAgICAgICAgICB9ZWxzZSBpZihpdGVtLnVybC5tYXRjaChpbWdleHRyZWdleCkpewogICAgICAgICAgICByb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpCiAgICAgICAgICAgIHJvb3QuaHJlZiA9ICIjIgogICAgICAgICAgICByb290LmlubmVySFRNTCA9IGNvbnRlbnRlbGVtZW50cwogICAgICAgICAgICAgIAogICAgICAgICAgICBpZih0eXBlID09ICJpbWFnZSIpewogICAgICAgICAgICAgIC8vbGV0IGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpCiAgICAgICAgICAgICAgLy9pbWcuYWx0ID0gaXRlbS51cmwKICAgICAgICAgICAgICByb290WyJkYXRhLXNyYyJdID0gaXRlbS51cmwKICAgICAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoImltZyIpCiAgICAgICAgICAgICAgLy9pbWcuY2xhc3NMaXN0LmFkZCgiZGF0YSIpCiAgICAgICAgICAgICAgLy9yb290LmFwcGVuZChpbWcpCiAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MICs9ICc8c3BhbiBjbGFzcz0iZmlsZSI+JyArIGl0ZW0udXJsICsgJzwvc3Bhbj4nCiAgICAgICAgICAgIH0KICAgICAgICAgIH1lbHNlewogICAgICAgICAgICByZXR1cm4KICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgcm9vdC5pZCA9IGlkCiAgICAgICAgICByb290LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snCiAgICAgICAgICByb290WyJkYXRhLWl0ZW0iXSA9IGl0ZW0KICAgICAgICAgIHJvb3RbImRhdGEtZXZlbnQiXSA9IGl0ZW0uZXZlbnQKICAgICAgICAgIHJvb3RbImRhdGEtcXVlcnkiXSA9IHEKICAgICAgICAgIHJvb3RbImRhdGEtdGV4dCJdID0gdGV4dAogICAgICAgICAgCiAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQodHlwZSkKICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgiaXRlbSIpCiAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoInNob3ciKQogICAgICAgICAgCiAgICAgICAgICBpZihpdGVtLnJlYWN0ZWQpewogICAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBxcygiI2ltYWdlcyIpW2FwcGVuZCAmJiAiYXBwZW5kIiB8fCAicHJlcGVuZCJdKHJvb3QpCiAgICAgICAgICAKICAgICAgICAgIGlmKHYpewogICAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkocm9vdCkKICAgICAgICAgIH0KICAgICAgICB9KQoKICAgICAgICB1cGRhdGVpbWFnZXNsb2FkKCkKICAgICAgICAKICAgICAgICBpZihhY3RpdmUoKSA9PSBudWxsKXsKICAgICAgICAgIHFzKCIjaW1hZ2VzIC5pdGVtIik/LmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgfQogICAgICB9CgogICAgICBmdW5jdGlvbiBoaWRlbWVkaWEoKXsKICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gInNjcm9sbCIKICAgICAgICBxc2EoIiNtZWRpYS1jb250YWluZXIsICNpbWFnZSwgI21lZGlhLWZvb3RlciIpLmZvckVhY2gobiA9PiBuLnN0eWxlLmRpc3BsYXkgPSAibm9uZSIpCiAgICAgICAgZ2lkKCJpbWFnZS1saWtlIikuY2xhc3NMaXN0LnJlbW92ZSgicmVhY3RlZCIpCiAgICAgICAgaGlkZXZpZGVvKCkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGlkZXZpZGVvKCl7CiAgICAgICAgY29uc3QgdiA9IHFzKCIjbWVkaWEtY29udGFpbmVyIHZpZGVvIikKICAgICAgICAKICAgICAgICBpZih2KXsKICAgICAgICAgIHYubXV0ZWQgPSB0cnVlCiAgICAgICAgICBnaWQodlsiZGF0YS1pdGVtLWlkIl0pLmFwcGVuZENoaWxkKHYpCiAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkodi5wYXJlbnRFbGVtZW50KQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gd2FpdHJlcyhrZXkpewogICAgICAgIGxldCBldmVudHMgPSBbXQogICAgICAgIAogICAgICAgIGxldCByZXNoYW5kbGVyID0gZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXsKICAgICAgICAgIHRoaXMuaGFuZGxlID0gZnVuY3Rpb24ocmVzKXsKICAgICAgICAgICAgbGV0IG8gPSBKU09OLnBhcnNlKHJlcy5kYXRhKQogICAgICAgICAgICBpZihvWzFdID09IGtleSl7CiAgICAgICAgICAgICAgaWYob1swXSA9PSAiRU9TRSIpewogICAgICAgICAgICAgICAgcmVzb2x2ZShldmVudHMpCiAgICAgICAgICAgICAgICByZXNoYW5kbGVycy5zcGxpY2UocmVzaGFuZGxlcnMuaW5kZXhPZih0aGlzKSwgMSkKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgZXZlbnRzLnB1c2gob1syXSkKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAgIAogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICByZXNoYW5kbGVycy5wdXNoKG5ldyByZXNoYW5kbGVyKHJlc29sdmUsIHJlamVjdCkpCiAgICAgICAgfSkKICAgICAgfQogICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGNoZWNrdXBkYXRlKHNvY2tldCl7CiAgICAgICAgY29uc3QgdXBkYXRlc3JlcyA9IGF3YWl0IHF1ZXJ5cHVia2V5KHNvY2tldCwgdXBkYXRlc3B1YmtleSkKICAgICAgICBjb25zdCB1cGRhdGVub3RlID0gdXBkYXRlc3Jlcy5maW5kKG4gPT4gbi5jb250ZW50Lm1hdGNoKC9eaHR0cHNcOlwvXC8vKSkKICAgICAgICAKICAgICAgICBpZighdXBkYXRlbm90ZSl7CiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgYWdlID0gTWF0aC5yb3VuZCgoRGF0ZS5ub3coKSAvIDEwMDAgLSB1cGRhdGVub3RlLmNyZWF0ZWRfYXQpIC8gMzYwMCAvIDI0KQogICAgICAgIGNvbnN0IG5vdGVpZCA9IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKHVwZGF0ZW5vdGUuaWQpKQogICAgICAgIHFzKCIjcmVsZWFzZSIpLmhyZWYgPSBwcm90b2NvbCArIG5vdGVpZAogICAgICAgIHFzKCIjcmVsZWFzZSIpLmlubmVyVGV4dCA9IChhZ2UgPT0gMCAmJiAidG9kYXkiIHx8IGFnZSArICIgZGF5KHMpIGFnbyIpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNsZWVwKG1zKXsKICAgICAgICByZXR1cm4gbmV3IGZ1bmN0aW9uKCl7CiAgICAgICAgICBsZXQgdGltZW91dCA9IG51bGwKICAgICAgICAgIGxldCByID0gbnVsbAogICAgICAgICAgCiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBwcm9taXNlOiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewogICAgICAgICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoKSwgbXMpCiAgICAgICAgICAgICAgciA9IHJlc29sdmUKICAgICAgICAgICAgfSksCiAgICAgICAgICAgIHJlc29sdmU6IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpCiAgICAgICAgICAgICAgcigpCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNob3coaWQpewogICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIgogICAgICAgIGNvbnN0IGl0ZW0gPSBnaWQoaWQpWyJkYXRhLWl0ZW0iXQogICAgICAgIGNvbnN0IG1lZGlhID0gZ2lkKCJtZWRpYS1jb250YWluZXIiKQogICAgICAgIGNvbnN0IGltYWdlID0gZ2lkKCJpbWFnZSIpCgogICAgICAgIGlmKGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpKXsKICAgICAgICAgIGltYWdlLnN0eWxlLmRpc3BsYXkgPSAibm9uZSIKICAgICAgICAgIGNvbnN0IHYgPSBnaWQoaWQpLnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAgIHFzKCIjbWVkaWEtY29udGFpbmVyIikuYXBwZW5kQ2hpbGQodikKICAgICAgICAgIHYubXV0ZWQgPSBmYWxzZQogICAgICAgICAgdi5wbGF5KCkKICAgICAgICB9ZWxzZXsKICAgICAgICAgIGltYWdlLnNyYyA9IGl0ZW0udXJsCiAgICAgICAgICBpbWFnZS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihpdGVtLm1ldGEpewogICAgICAgICAgY29uc3QgbWV0YWNvbnRlbnQgPSBKU09OLnBhcnNlKGl0ZW0ubWV0YS5jb250ZW50KQogICAgICAgICAgY29uc3QgbmFtZSA9IG1ldGFjb250ZW50LmRpc3BsYXlfbmFtZSB8fCBtZXRhY29udGVudC5uYW1lCiAgICAgICAgICBxcygiI2ltYWdlLXVzZXIiKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgICAgcXMoIiNpbWFnZS11c2VyIikuaHJlZiA9IHByb3RvY29sICsgYmVjaDMyLmVuY29kZSgibnB1YiIsIGZyb21IZXhTdHJpbmcoaXRlbS5tZXRhLnB1YmtleSkpCiAgICAgICAgICBxcygiI2ltYWdlLXVzZXIiKS5pbm5lclRleHQgPSBuYW1lCiAgICAgICAgfWVsc2V7CiAgICAgICAgICBxcygiI2ltYWdlLXVzZXIiKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiCiAgICAgICAgfQoKICAgICAgICBnaWQoImltYWdlLWxpa2UiKVsiZGF0YS1pdGVtLWlkIl0gPSBpZAogICAgICAgIGdpZCgibWVkaWEtZm9vdGVyIilbImRhdGEtZXZlbnQiXSA9IGl0ZW0uZXZlbnQKCiAgICAgICAgaWYoaXRlbS5yZWFjdGVkKXsKICAgICAgICAgIGdpZCgiaW1hZ2UtbGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBhID0gcXMoIiNpbWFnZS1xdWVyeSIpCiAgICAgICAgYS5ocmVmID0gcHJvdG9jb2wgKyBpdGVtLmJlY2gzMmlkCiAgICAgICAgYS5pbm5lclRleHQgPSBnaWQoaWQpWyJkYXRhLXRleHQiXQogICAgICAgICAgCiAgICAgICAgbWVkaWEuc3R5bGUuZGlzcGxheSA9IGdpZCgibWVkaWEtZm9vdGVyIikuc3R5bGUuZGlzcGxheSA9ICJibG9jayIKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gY29ubmNvdW50KCl7CiAgICAgICAgcmV0dXJuIHNvY2tldHMuZmlsdGVyKHIgPT4gci5yZWFkeVN0YXRlID09IDEpLmxlbmd0aAogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBkaXNjb25uZWN0KCl7CiAgICAgICAgZm9yKGxldCBzb2NrZXQgb2Ygc29ja2V0cyl7CiAgICAgICAgICBzb2NrZXQuY2xvc2UoKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXRzLnNwbGljZSgwKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBsb2cobXNnKXsKICAgICAgICBsZXQgc2Nyb2xsID0gcXMoIiNsb2dzIikuc2Nyb2xsVG9wID09IHFzKCIjbG9ncyIpLnNjcm9sbFRvcE1heAogICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCiAgICAgICAgZGl2LmlubmVyVGV4dCA9IEFycmF5LmZyb20oYXJndW1lbnRzKS5qb2luKCIgIikKICAgICAgICBxcygiI2xvZ3MiKS5hcHBlbmQoZGl2KQogICAgICAgIAogICAgICAgIHNjcm9sbCAmJiBxcygiI2xvZ3MiKS5zY3JvbGxUbygwLCBxcygiI2xvZ3MiKS5zY3JvbGxUb3BNYXgpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGNvbm5lY3QodXJsKXsKICAgICAgICBsb2coImNvbm5lY3RpbmciLCB1cmwpCiAgICAgICAgbGV0IHNvY2tldCA9IG5ldyBXZWJTb2NrZXQodXJsKQogICAgICAgIAogICAgICAgIHNvY2tldC5vbm1lc3NhZ2UgPSBtZXNzYWdlID0+IHJlc2hhbmRsZXJzLmZvckVhY2gocmggPT4gcmguaGFuZGxlKG1lc3NhZ2UpKQogICAgICAgIAogICAgICAgIHNvY2tldC5vbmNsb3NlID0gYXN5bmMgZnVuY3Rpb24oKXsKICAgICAgICAgIHNvY2tldHMuc3BsaWNlKHNvY2tldHMuaW5kZXhPZihzb2NrZXQpLCAxKQogICAgICAgICAgcXMoIiNjb25uY291bnQiKS5pbm5lclRleHQgPSBjb25uY291bnQoKSArIChwcmltYWxzb2NrZXQgJiYgMSkKICAgICAgICAgIGxvZygiZGlzY29ubmVjdGVkIiwgdGhpcy51cmwsIGNvbm5jb3VudCgpKQogICAgICAgICAgYXdhaXQgc2xlZXAoMTAwMCkucHJvbWlzZQogICAgICAgICAgY29ubmVjdCh0aGlzLnVybCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc29ja2V0Lm9ub3BlbiA9IGZ1bmN0aW9uKCl7CiAgICAgICAgICBxcygiI2Nvbm5jb3VudCIpLmlubmVyVGV4dCA9IGNvbm5jb3VudCgpICsgKHByaW1hbHNvY2tldCAmJiAxKQogICAgICAgICAgbG9nKCJjb25uZWN0ZWQiLCB0aGlzLnVybCwgY29ubmNvdW50KCkpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiBzb2NrZXQKICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIGFzeW5jICgpID0+IHsKICAgICAgICBwcmltYWxzb2NrZXQgPSBjb25uZWN0KCJ3c3M6Ly9jYWNoZTMucHJpbWFsLm5ldC9jYWNoZTE3IikKICAgICAgICBwcmltYWxzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcigib3BlbiIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICBwcmltYWxnbG9iYWwodGhpcykKICAgICAgICB9KQogICAgICAgIAogICAgICAgIHByaW1hbHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICBwcmltYWxzb2NrZXQgPSBudWxsCiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBmb3IobGV0IHVybCBvZiByZWxheXMoKSl7CiAgICAgICAgICBjb25zdCBzb2NrZXQgPSBjb25uZWN0KHVybCkKICAgICAgICAgIHNvY2tldHMucHVzaChzb2NrZXQpCiAgICAgICAgICAKICAgICAgICAgIHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgY2hlY2t1cGRhdGUodGhpcykKICAgICAgICAgICAgcXVlcnkodGhpcykKICAgICAgICAgIH0pCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGF3YWl0IHNsZWVwKDEwMCkucHJvbWlzZQogICAgICAgIAogICAgICAgIGlmKGhhc2tleSgpKXsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgibm9zdHIiKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGZvcihsZXQgYyBvZiBjb2xvcHRzKXsKICAgICAgICBkb2N1bWVudC53cml0ZSgnPHN0eWxlPicgKyBjb2xzY3NzLmlubmVyVGV4dC5yZXBsYWNlKC9cJFx7Y29sc1x9L2csIGMpICsgJzwvc3R5bGU+JykKICAgICAgfQogICAgPC9zY3JpcHQ+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==
https://ipfs.io/ipfs/QmSsVdht83gPzQm6ARdTam6jMskUzNvJtTNqfHWjdovDZy
sha256
4e2a2657b4adb1a426b3c0ade24ccaaeb0e5b68a1cc1322f987506e2eb58452d files.html
base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyIvPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL3N2Z2ljb25zLnNwYXJray5mci9zdmdpY29ucy5jc3MiLz4KICAgIDxzdHlsZT4KICAgICAgKiB7CiAgICAgICAgb3ZlcnNjcm9sbC1iZWhhdmlvci15OiBjb250YWluOwogICAgICB9CiAgICAgIAogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksIAogICAgICAjaGVhZGVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncywgCiAgICAgICNwcml2a2V5IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncyB7CiAgICAgICAgaGVpZ2h0OiA2ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNsb2dzIHsKICAgICAgICBoZWlnaHQ6IDhlbTsKICAgICAgICBvdmVyZmxvdzogc2Nyb2xsOwogICAgICAgIGZvbnQtc2l6ZTogLjhlbTsKICAgICAgfQogICAgICAKICAgICAgc2VsZWN0IHsKICAgICAgICB3aWR0aDogNGVtOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLCAKICAgICAgaW5wdXQuc3VibWl0IHsKICAgICAgICBib3JkZXItcmFkaXVzOiAuNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0LCAKICAgICAgI2hlYWRlciBhLAogICAgICAjbWVkaWEtY29udGFpbmVyIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLCAKICAgICAgZm9ybSwgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHotaW5kZXg6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgIAogICAgICBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDMwZW0pIHsKICAgICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgfQogICAgICB9CgogICAgICBmb3JtIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeSB7CiAgICAgICAgd2lkdGg6IDZlbTsKICAgICAgfQogICAgICAKICAgICAgI2xvYWRpbmcgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMHB4OwogICAgICAgIGxlZnQ6IDI3ZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgIGEgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgfQoKICAgICAgdmlkZW8gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogIAogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgIGhlaWdodDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgIG1hcmdpbi10b3A6IDAgIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgLnR5cGUgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICB6LWluZGV4OiAxOwogICAgICB9CiAgICAgIAogICAgICAjcGljLXF1ZXJ5IHsKICAgICAgICB3aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5LAogICAgICBhLAogICAgICBpbnB1dC5zdWJtaXQgewogICAgICAgIGNvbG9yOiAjOTk5OwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICBwYWRkaW5nOiAwIDFlbTsKICAgICAgfQoKICAgICAgI3F1ZXJ5ZGlzcGxheSAudGV4dCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIG1pbi13aWR0aDogM2VtOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgYSwKICAgICAgI2hlYWRlciBzcGFuIHsKICAgICAgICBwYWRkaW5nOiAwLjVlbTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQoKICAgICAgI2hlYWRlciB7CiAgICAgICAgcGFkZGluZzogMC40NWVtIDA7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQoKICAgICAgI2hlYWRlciAuaXRlbXMgewogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICB9CiAgICAgIAogICAgICAjaGVhZGVyIC5pdGVtcyB7CiAgICAgICAgbWFyZ2luLXRvcDogLjNlbTsKICAgICAgfQoKICAgICAgcCB7CiAgICAgICAgbWFyZ2luLXRvcDogMDsKICAgICAgfQogICAgICAKICAgICAgLmxhYmVsIHsKICAgICAgICBwYWRkaW5nOiAuOGVtIC44ZW0gLjhlbSAwOwogICAgICB9CgogICAgICAjcGljcyAucXVlcnkgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgfQoKICAgICAgI21lZGlhLWNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDApOwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgei1pbmRleDogNDsKICAgICAgfQogICAgICAKICAgICAgI3BpYy1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAKICAgICAgI3BpYyB7CiAgICAgICAgbWF4LXdpZHRoOiAxMDB2dzsKICAgICAgICBtYXgtaGVpZ2h0OiAxMDB2aDsKICAgICAgfQogICAgICAgIAogICAgICAjcGljcyB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgICAKICAgICAgI3BpY3MgPiBhLCAKICAgICAgI3BpY3MgaW1nLAogICAgICAjcGljcyAuZmlsZSwKICAgICAgI3BpY3MgLnZpZGVvLWNvbnRhaW5lciB7CiAgICAgICAgd2lkdGg6IDI1dnc7CiAgICAgIH0KCiAgICAgICNwaWNzID4gYSwKICAgICAgI3BpY3MgLmZpbGUsCiAgICAgICNwaWNzIC52aWRlby1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMjV2dzsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIGJvcmRlcjogMC4zZW0gc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMC4zZW07CiAgICAgICAgbWFyZ2luOiAtMC4zZW07CiAgICAgIH0KCiAgICAgICNwaWNzID4gLmZpbGUgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIAogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CiAgICAgIAogICAgICBib2R5Om5vdCgubm9zdHIpICNmaWx0ZXItbGlrZXMsIAogICAgICAuZmlsdGVyLWxpa2VzICNwaWNzID4gLml0ZW06bm90KC5yZWFjdGVkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgei1pbmRleDogMjsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3Z3OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHBhZGRpbmc6IDAgMXZ3OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNwaWMtcXVlcnkgewogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBmb250LXNpemU6IG1pbigzLjV2dywgMS41ZW0pOwogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsMC42KTsKICAgICAgICBtYXgtd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgI3BpYy1xdWVyeSB7CiAgICAgICAgcGFkZGluZzogLjZlbSAuNGVtIC4xZW0gLjRlbTsKICAgICAgICBtYXgtd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgLmxpa2UucmVhY3RlZCwKICAgICAgLmZpbHRlci1saWtlcyAjZmlsdGVyLWxpa2VzIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7CiAgICAgIH0KCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgZm9udC1zaXplOiAzZW07CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciwKICAgICAgI21lZGlhLWZvb3RlciAubGlrZSB7CiAgICAgICAgei1pbmRleDogNTsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgYm90dG9tOiAxLjllbTsKICAgICAgICBmb250LXNpemU6IDEuOGVtOwogICAgICAgIHBhZGRpbmctcmlnaHQ6IC42NWVtOwogICAgICAgIG1heC13aWR0aDogOGVtOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9CiAgICAgIAogICAgICAubGlrZSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiBhdXRvOwogICAgICAgIHBhZGRpbmc6IC4yZW07CiAgICAgICAgd2lkdGg6IDFlbTsKICAgICAgICBoZWlnaHQ6IDFlbTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CgogICAgICAubm9zdHIgLmxpa2UgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOyAgCiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgLmxpa2UgewogICAgICAgIGZvbnQtc2l6ZTogMi40ZW07CiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgewogICAgICAgIGRpc3BsYXk6IG5vbmU7ICAKICAgICAgfQogIAogICAgICAjcGljcyBpbWcgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBtaW4td2lkdGg6IDEwMCU7CiAgICAgICAgLyppbWFnZS1yZW5kZXJpbmc6IHBpeGVsYXRlZDsqLwogICAgICB9CgogICAgICAjbWVudS1jb250ZW50IC5pdGVtcyAuYWN0aXZlIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjNDQ0OwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjcGljcyA+IC5hY3RpdmUgewogICAgICAgIGJvcmRlci1jb2xvcjogZ3JlZW47CiAgICAgICAgei1pbmRleDogMTsKICAgICAgfQoKICAgICAgLmhlYXJ0c3ZnIHBhdGggewogICAgICAgIHN0cm9rZTogI2ZmZjsKICAgICAgfQogIAogICAgICBhI21lbnUsIGEjZmlsdGVyLWxpa2VzIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW4tdG9wOiAtLjNlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICB9CgogICAgICBhI21lbnUgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIHBhZGRpbmc6IDAgLjNlbSAwIC41ZW07CiAgICAgICAgaGVpZ2h0OiAyLjFlbTsKICAgICAgfQogICAgICAKICAgICAgYSNmaWx0ZXItbGlrZXMgewogICAgICAgIHBhZGRpbmc6IC4yZW07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIHdpZHRoOiAxLjVlbTsKICAgICAgICBoZWlnaHQ6IDEuNWVtOwogICAgICAgIG1hcmdpbjogLjFlbSAuNWVtOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICByaWdodDogMDsKICAgICAgfQogICAgICAKICAgICAgYSNmaWx0ZXItbGlrZXMgc3ZnIHsKICAgICAgICB3aWR0aDogMS41ZW07CiAgICAgICAgaGVpZ2h0OiAxLjVlbTsKICAgICAgfQogICAgICAgCiAgICAgIC5tZW51c3ZnIHsKICAgICAgICB3aWR0aDogMmVtOwogICAgICAgIGhlaWdodDogMmVtOwogICAgICB9CgogICAgICAubWVudXN2ZyBwYXRoIHsKICAgICAgICBmaWxsOiAjZmZmOwogICAgICB9CgogICAgICAjbWVudS1jb250ZW50IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBoZWlnaHQ6IDEwMHZoOwogICAgICAgIHdpZHRoOiAxOGVtOwogICAgICAgIG1hcmdpbi1sZWZ0OiAtMThlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMjIyOwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB6LWluZGV4OiAzOyAKICAgICAgICBvdmVyZmxvdzogc2Nyb2xsOwogICAgICB9CgogICAgICAjbWVudS1jb250ZW50Lm9wZW4gewogICAgICAgIG1hcmdpbi1sZWZ0OiAwOwogICAgICB9CiAgICAgIAogICAgICAjbWVudS1jb250ZW50IC5pdGVtcyB7CiAgICAgICAgcGFkZGluZzogMCAxZW0gMWVtIDFlbTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgYSwKICAgICAgaW5wdXQuc3VibWl0IHsKICAgICAgICBwYWRkaW5nOiAuNWVtIC43ZW07CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGJhY2tncm91bmQ6ICMxMTE7CiAgICAgIH0KCiAgICAgICNtZW51LW92ZXJsYXkgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgei1pbmRleDogMzsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgb3BhY2l0eTogLjU7CiAgICAgIH0KCiAgICAgICNtZW51LW92ZXJsYXkub3BlbiB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgCiAgICAgIHN2ZywgCiAgICAgIGltZywgCiAgICAgIC52aWRlbyB2aWRlbyB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgICN0ZW1wbGF0ZSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8ZGl2IGlkPSJ0ZW1wbGF0ZSI+CiAgICAgIDxzdmcgY2xhc3M9ImhlYXJ0c3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgogICAgICAgIDxwYXRoIGQ9Ik05LjcxOSwxNy4wNzNsLTYuNTYyLTYuNTFjLTAuMjctMC4yNjgtMC41MDQtMC41NjctMC42OTYtMC44ODhDMS4zODUsNy44OSwxLjY3LDUuNjEzLDMuMTU1LDQuMTRjMC44NjQtMC44NTYsMi4wMTItMS4zMjksMy4yMzMtMS4zMjljMS45MjQsMCwzLjExNSwxLjEyLDMuNjEyLDEuNzUyYzAuNDk5LTAuNjM0LDEuNjg5LTEuNzUyLDMuNjEyLTEuNzUyYzEuMjIxLDAsMi4zNjksMC40NzIsMy4yMzMsMS4zMjljMS40ODQsMS40NzMsMS43NzEsMy43NSwwLjY5Myw1LjUzN2MtMC4xOSwwLjMyLTAuNDI1LDAuNjE4LTAuNjk1LDAuODg3bC02LjU2Miw2LjUxQzEwLjEyNSwxNy4yMjksOS44NzUsMTcuMjI5LDkuNzE5LDE3LjA3MyBNNi4zODgsMy42MUM1LjM3OSwzLjYxLDQuNDMxLDQsMy43MTcsNC43MDdDMi40OTUsNS45MiwyLjI1OSw3Ljc5NCwzLjE0NSw5LjI2NWMwLjE1OCwwLjI2NSwwLjM1MSwwLjUxLDAuNTc0LDAuNzMxTDEwLDE2LjIyOGw2LjI4MS02LjIzMmMwLjIyNC0wLjIyMSwwLjQxNi0wLjQ2NiwwLjU3My0wLjcyOWMwLjg4Ny0xLjQ3MiwwLjY1MS0zLjM0Ni0wLjU3MS00LjU2QzE1LjU3LDQsMTQuNjIxLDMuNjEsMTMuNjEyLDMuNjFjLTEuNDMsMC0yLjYzOSwwLjc4Ni0zLjI2OCwxLjg2M2MtMC4xNTQsMC4yNjQtMC41MzYsMC4yNjQtMC42OSwwQzkuMDI5LDQuMzk3LDcuODIsMy42MSw2LjM4OCwzLjYxIj48L3BhdGg+CiAgICAgIDwvc3ZnPgogICAgICA8ZGl2IGlkPSJjb2xzY3NzIj4KICAgICAgLmNvbHMke2NvbHN9ICNwaWNzIC5pdGVtIHsKICAgICAgICB3aWR0aDogY2FsYygxMDB2dyAvICR7Y29sc30pOwogICAgICB9CgogICAgICAuY29scyR7Y29sc30gI3BpY3MgLml0ZW0gewogICAgICAgIGhlaWdodDogY2FsYygxMDB2dyAvICR7Y29sc30pOwogICAgICB9CiAgICAgIAogICAgICAuY29scyR7Y29sc30gLnF1ZXJ5LAogICAgICAuY29scyR7Y29sc30gLmxpa2UgewogICAgICAgIGZvbnQtc2l6ZTogbWluKDE0dncgKiAoMSAvICR7Y29sc30pLCA2ZW0gKiAoMSAvICR7Y29sc30pKQogICAgICB9CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJtZWRpYS1mb290ZXIiPgogICAgICA8YSBpZD0icGljLWxpa2UiIGNsYXNzPSJsaWtlIiBocmVmPSIjIj48L2E+CiAgICAgIDxhIGlkPSJwaWMtcXVlcnkiIGhyZWY9IiMiPjwvYT4KICAgICAgPGEgaWQ9InBpYy11c2VyIiBocmVmPSIjIj48L2E+CiAgICA8L2Rpdj4KICAgIDxjZW50ZXIgaWQ9Im1lZGlhLWNvbnRhaW5lciI+CiAgICAgIDxkaXYgaWQ9InBpYy1jb250YWluZXIiPgogICAgICAgIDxpbWcgaWQ9InBpYyIvPgogICAgICA8L2Rpdj4KICAgIDwvY2VudGVyPgogICAgPGRpdiBpZD0ibWVudS1vdmVybGF5Ij48L2Rpdj4KICAgIDxkaXYgaWQ9Im1lbnUtY29udGVudCIgY2xhc3M9InRlc3QiPgogICAgICA8ZGl2IGNsYXNzPSJpdGVtcyI+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmF1dG9wbGF5PC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJvbiIgaHJlZj0iIyI+b248L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJvZmYiIGhyZWY9IiMiPm9mZjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0YXV0b3BsYXkiIGRhdGEtYXV0b3BsYXk9ImhvdmVyIiBocmVmPSIjIj5tb3VzZW92ZXI8L2E+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmNvbHVtbnM8L2Rpdj4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSIxIiBocmVmPSIjIj4xPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjIiIGhyZWY9IiMiPjI8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iNCIgaHJlZj0iIyI+NDwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSI2IiBocmVmPSIjIj42PC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjEwIiBocmVmPSIjIj4xMDwvYT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+Y29ubmVjdGlvbnM8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJjb25uY291bnQiPjA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+cmVsYXlzOjwvZGl2PgogICAgICAgIDxwPlBsZWFzZSB1c2UgcmVsYXlzIHdpdGggTklQLTUwIChzZWFyY2gpIGZ1bmN0aW9uYWxpdHk8L3A+CiAgICAgICAgPGZvcm0gYWN0aW9uPSIjIiBpZD0icmVsYXlzLWZvcm0iPgogICAgICAgICAgPHRleHRhcmVhIGlkPSJyZWxheXMiPjwvdGV4dGFyZWE+CiAgICAgICAgICA8aW5wdXQgY2xhc3M9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0ic2F2ZSByZWxheXMiLz4KICAgICAgICA8L2Zvcm0+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPnByaXZhdGUga2V5OjwvZGl2PgogICAgICAgIDxwPklmIHlvdSBjYW50IHVzZSBicm93c2VyIGFkZG9uIChtb2JpbGUpPC9wPgogICAgICAgIDxmb3JtIGFjdGlvbj0iIyIgaWQ9InByaXZrZXktZm9ybSI+CiAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9InByaXZrZXkiLz4KICAgICAgICAgIDxpbnB1dCBjbGFzcz0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJzYXZlIGtleSIvPgogICAgICAgIDwvZm9ybT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+bG9nczwvZGl2PgogICAgICAgIDxkaXYgaWQ9ImxvZ3MiPjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5sYXRlc3QgcmVsZWFzZTo8L2Rpdj4KICAgICAgICA8YSBpZD0icmVsZWFzZSIgaHJlZj0iIyI+PC9hPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0iaGVhZGVyIj4KICAgICAgPGEgaWQ9ImZpbHRlci1saWtlcyIgaHJlZj0iIyI+PC9hPgogICAgICA8ZGl2IGNsYXNzPSJpdGVtcyI+CiAgICAgICAgPGEgaWQ9Im1lbnUiIGhyZWY9IiMiPgogICAgICAgICAgPHN2ZyBjbGFzcz0ibWVudXN2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KCQkgICAgICAgIDxwYXRoIGQ9Ik0xMCwxLjQ0NWMtNC43MjYsMC04LjU1NSwzLjgyOS04LjU1NSw4LjU1NWMwLDQuNzI1LDMuODI5LDguNTU1LDguNTU1LDguNTU1YzQuNzI1LDAsOC41NTUtMy44Myw4LjU1NS04LjU1NUMxOC41NTUsNS4yNzQsMTQuNzI1LDEuNDQ1LDEwLDEuNDQ1IE0xMCwxNy42NTRjLTQuMjIxLDAtNy42NTQtMy40MzQtNy42NTQtNy42NTRjMC00LjIyMSwzLjQzMy03LjY1NCw3LjY1NC03LjY1NGM0LjIyMiwwLDcuNjU0LDMuNDMzLDcuNjU0LDcuNjU0QzE3LjY1NCwxNC4yMjEsMTQuMjIyLDE3LjY1NCwxMCwxNy42NTQgTTE0LjM5LDEwYzAsMC4yNDgtMC4yMDMsMC40NS0wLjQ1LDAuNDVINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAzLTAuNDUtMC40NXMwLjIwMy0wLjQ1LDAuNDUtMC40NWg3Ljg3OUMxNC4xODcsOS41NSwxNC4zOSw5Ljc1MiwxNC4zOSwxMCBNMTQuMzksMTIuNzAyYzAsMC4yNDctMC4yMDMsMC40NDktMC40NSwwLjQ0OUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDItMC40NS0wLjQ0OWMwLTAuMjQ4LDAuMjAzLTAuNDUxLDAuNDUtMC40NTFoNy44NzlDMTQuMTg3LDEyLjI1MSwxNC4zOSwxMi40NTQsMTQuMzksMTIuNzAyIE0xNC4zOSw3LjI5OGMwLDAuMjQ4LTAuMjAzLDAuNDUtMC40NSwwLjQ1SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMy0wLjQ1LTAuNDVzMC4yMDMtMC40NSwwLjQ1LTAuNDVoNy44NzlDMTQuMTg3LDYuODQ4LDE0LjM5LDcuMDUxLDE0LjM5LDcuMjk4Ij48L3BhdGg+CgkgICAgICAgIDwvc3ZnPgogICAgICAgIDwvYT4KICAgICAgICA8YSBpZD0idGl0bGUiIGhyZWY9IiMiPmZpbGVzLmh0bWw8L2E+CiAgICAgICAgPGZvcm0gaWQ9InF1ZXJ5LWZvcm0iIGFjdGlvbj0iIyI+CiAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9InF1ZXJ5IiBuYW1lPSJxdWVyeSIgaWQ9IiIgLz4KICAgICAgICAgIDxzZWxlY3QgaWQ9InF1ZXJ5LXR5cGUiPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJhbGwiPmFsbDwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJpbWFnZSI+aW1hZ2VzPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9InZpZGVvIj52aWRlb3M8L29wdGlvbj4KICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgICAgPGlucHV0IGlkPSJnbyIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iZ28iLz4KICAgICAgICA8L2Zvcm0+CiAgICAgICAgPHNwYW4gaWQ9InF1ZXJ5ZGlzcGxheSI+CiAgICAgICAgICA8c3BhbiBjbGFzcz0idGV4dCI+PC9zcGFuPgogICAgICAgIDwvc3Bhbj4KICAgICAgICA8ZGl2IGlkPSJsb2FkaW5nIj51cGRhdGluZzwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0icGljcyI+PC9kaXY+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly91bnBrZy5jb20vbm9zdHItdG9vbHMvbGliL25vc3RyLmJ1bmRsZS5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9zbG93bGkuZ2l0aHViLmlvL2JlY2gzMi1idWZmZXIvYXNzZXRzL2pzL2JlY2gzMi1idWZmZXIubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQ+CiAgICAgIGNvbnN0IHVwZGF0ZXNwdWJrZXkgPSAiYWU1YzZlMGI3NDY2MGQyMTk0YzgyNTRiNWMyYzgyNTY3NjU3NmJlMDI5NzM3OWZhMjA1MjMxMTRhNmE4NWU4NyIKICAgICAgY29uc3QgcXVlcmllcyA9IHsKICAgICAgICAiZ2xvYmFsIjogJ1siUkVRIiwiPEk+Iix7ImNhY2hlIjpbImV4cGxvcmUiLHsidGltZWZyYW1lIjoibGF0ZXN0Iiwic2NvcGUiOiJnbG9iYWwiLCJsaW1pdCI6PEw+fV19XScsIAogICAgICAgICJhdXRob3IiOiAnWyJSRVEiLCI8ST4iLHsia2luZHMiOlsxXSwiYXV0aG9ycyI6WyI8UD4iXX1dJywKICAgICAgICAicmVhY3Rpb25zIjogJ1siUkVRIiwiPEk+IiwgeyJraW5kcyI6WzddLCIjZSI6IDxFPn1dJwogICAgICB9CiAgICAgIHFzKCIjcmVsYXlzIikudmFsdWUgPSByZWxheXMoKS5qb2luKCJcbiIpCiAgICAgIHFzKCIjcHJpdmtleSIpLnZhbHVlID0gcHJpdmtleSgpCiAgICAgIGNvbnN0IGNvbG9wdHMgPSBbMSwgMiwgNCwgNiwgMTBdCgogICAgICBjb2xzID0gKCkgPT4gcGFyc2VJbnQoc2V0dGluZygiY29scyIsIGNvbG9wdHNbMV0pLCAxMCkKICAgICAgYXV0b3BsYXkgPSAoKSA9PiBzZXR0aW5nKCJhdXRvcGxheSIsICJvZmYiKQogICAgICBsaW1pdCA9ICgpID0+IHBhcnNlSW50KHNldHRpbmcoImxpbWl0IiwgMTUpLCAxMCkKICAgICAgCiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgiY29scyIgKyBjb2xzKCkpCiAgICAgIAogICAgICBsZXQgcHJvdG9jb2wgPSBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvKSA/ICJub3N0cjoiIDogIndlYitub3N0cjoiCiAgICAgIGxldCBzb2NrZXRzID0gW10KICAgICAgbGV0IHJlc2hhbmRsZXJzID0gW10KICAgICAgbGV0IHVybHMgPSBbXQogICAgICBsZXQgbGlrZXMgPSBbXQogICAgICBsZXQgbmV3bGlrZXMgPSBbXQogICAgICBsZXQgaWRjb3VudGVyID0gMAogICAgICBsZXQgcXVlcnl3YWl0ID0gbnVsbAogICAgICBsZXQgcHJpbWFsc29ja2V0ID0gbnVsbAogICAgICBsZXQgdHlwZXMgPSB7CiAgICAgICAgaW1hZ2U6IFsicG5nIiwgImpwZyIsICJqcGVnIiwgIndlYnAiXSwKICAgICAgICB2aWRlbzogWyJtcDQiLCAid2VibSJdCiAgICAgIH0KICAgICAgbGV0IGltZ3JlZ2V4ID0gL2h0dHAofHMpXDpcL1wvW14gXG5dKj9cLihwbmd8anBnfGpwZWd8d2VicCkvZ2kKICAgICAgbGV0IHZpZGVvcmVnZXggPSAvaHR0cCh8cylcOlwvXC9bXiBcbl0qP1wuKG1wNHx3ZWJtKS9naQogICAgICBsZXQgdmlkZW9leHRyZWdleCA9IC9cLihtcDR8d2VibSkkL2kKICAgICAgbGV0IGltZ2V4dHJlZ2V4ID0gL1wuKHBuZ3xqcGd8anBlZ3x3ZWJwKSQvaQogICAgICB3YWl0bXMgPSA1MDAwCiAgICAgIHF1ZXJ5c3RyID0gIiIKICAgICAgbGV0IHF1ZXJ5Y291bnQgPSAwCiAgICAgIGxldCBob3ZlcmVkdmlkZW8gPSBudWxsCiAgICAgIAogICAgICB1cGRhdGVxdWVyeSgpCiAgICAgIHFzKCIjcGljLWxpa2UiKS5pbm5lckhUTUwgPSBxcygiI2ZpbHRlci1saWtlcyIpLmlubmVySFRNTCA9IHFzKCIjdGVtcGxhdGUgLmhlYXJ0c3ZnIikub3V0ZXJIVE1MCiAgICAgIHNldGFjdGl2ZSgic2V0Y29scyIsICJjb2xzIiwgY29scygpKQogICAgICBzZXRhY3RpdmUoInNldGF1dG9wbGF5IiwgImF1dG9wbGF5IiwgYXV0b3BsYXkoKSkKICAgICAgCiAgICAgIGZ1bmN0aW9uIGZyb21IZXhTdHJpbmcoc3RyKXsKICAgICAgICBsZXQgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoc3RyLmxlbmd0aCAvIDIpCiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWZmZXIubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGJ1ZmZlcltpXSA9IHBhcnNlSW50KHN0ci5zdWJzdHIoMiAqIGksIDIpLCAxNikKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGJ1ZmZlcgogICAgICB9CiAgCiAgICAgIGZ1bmN0aW9uIHJlbGF5cygpewogICAgICAgIGNvbnN0IG9iaiA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oInJlbGF5cyIpKQogICAgICAgIGNvbnN0IHIgPSBvYmogJiYgb2JqLmZpbHRlcihyID0+IHIubWF0Y2goL3dzczpcL1wvLisvKSkgfHwgW10KICAgICAgICAKICAgICAgICByZXR1cm4gci5sZW5ndGggPiAwICYmIHIgfHwgWwogICAgICAgICAgIndzczovL3JlbGF5Lm5vc3RyLmJhbmQiLAogICAgICAgICAgIndzczovL25iLnJlbGF5LmNlbnRlciIsIAogICAgICAgICAgIndzczovL25vc3RyLmNvbXBpbGUtZXJyb3IubmV0IgogICAgICAgIF0KICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcHJpdmtleSgpewogICAgICAgIGxldCBrZXkgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgicHJpdmtleSIpIHx8ICIiCiAgICAgICAgCiAgICAgICAgaWYoa2V5Lmxlbmd0aCA9PSA2Myl7CiAgICAgICAgICBrZXkgPSBOb3N0clRvb2xzLm5pcDE5LmRlY29kZShrZXkpLmRhdGEKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIGtleS5sZW5ndGggPT0gNjQgJiYga2V5IHx8IG51bGwKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gc2V0dGluZyhrZXksIGRlZmF1bHR2YWx1ZSl7CiAgICAgICAgY29uc3QgdiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSkKICAgICAgICByZXR1cm4gdiAmJiBvcHRpb24oInNldCIgKyBrZXksIGtleSwgdikgJiYgdiB8fCBkZWZhdWx0dmFsdWUKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gb3B0aW9uKGMsIGtleSwgdmFsKXsKICAgICAgICByZXR1cm4gcXMoIi4iICsgYyArICJbZGF0YS0iICsga2V5ICsgIj0nIiArIHZhbCArICInXSIpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHFzKHEpewogICAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHEpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHFzYShxKXsKICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHEpKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBnaWQoaSl7CiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGkpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHF1ZXJ5dHlwZSgpewogICAgICAgIHJldHVybiBxcygiI3F1ZXJ5LXR5cGUiKS52YWx1ZSB8fCAiYWxsIgogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVxdWVyeSgpewogICAgICAgIGxldCBwYXJ0cyA9IGRlY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5oYXNoLnN1YnN0cmluZygxKSkuc3BsaXQoIi8iKQogICAgICAgIHF1ZXJ5c3RyID0gcXMoIiNxdWVyeWRpc3BsYXkgLnRleHQiKS5pbm5lclRleHQgPSBwYXJ0c1swXQogICAgICAgIHFzKCIjcXVlcnkiKS52YWx1ZSA9IHBhcnRzWzBdCiAgICAgICAgcXMoIiNxdWVyeS10eXBlIikudmFsdWUgPSBwYXJ0c1sxXSB8fCAiYWxsIgogICAgICB9CgogICAgICBmdW5jdGlvbiBhY3RpdmUoKXsKICAgICAgICByZXR1cm4gcXMoIiNwaWNzIC5hY3RpdmUiKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBwaWNvZmZzZXQob2Zmc2V0KXsKICAgICAgICBjb25zdCBwaWNzID0gcXNhKCIjcGljcyA+IC5pdGVtIikuZmlsdGVyKGUgPT4gZS5zdHlsZS5kaXNwbGF5ID09ICJibG9jayIpCiAgICAgICAgcmV0dXJuIHBpY3NbcGljcy5pbmRleE9mKGFjdGl2ZSgpKStvZmZzZXRdCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGxhc3RhY3RpdmUoKXsKICAgICAgICByZXR1cm4gcXNhKCIjcGljcyAuYWN0aXZlIikucG9wKCkgICAgICAKICAgICAgfQoKICAgICAgZnVuY3Rpb24gbWVudSgpewogICAgICAgIHFzYSgiI21lbnUtY29udGVudCwgI21lbnUtb3ZlcmxheSIpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC50b2dnbGUoIm9wZW4iKSkKICAgICAgfQogIAogICAgICBmdW5jdGlvbiBzZXRhY3RpdmUoYywga2V5LCB2YWwpewogICAgICAgIHFzYSgiLiIgKyBjKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKSkKICAgICAgICBjb25zdCBvcHRpb24gPSBxcygiLiIgKyBjICsgIltkYXRhLSIgKyBrZXkgKyAiPSciICsgdmFsICsgIiddIikKICAgICAgICBvcHRpb24/LmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNjcm9sbHZpc2libGUobiwgb2Zmc2V0KXsKICAgICAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMAogICAgICAgIHJldHVybiAobi5vZmZzZXRUb3AgKyBuLm9mZnNldEhlaWdodCkgPj0gKHNjcm9sbFkgLSBvZmZzZXQpCiAgICAgICAgICAmJiBuLm9mZnNldFRvcCA8PSAoc2Nyb2xsWSArIHZpc3VhbFZpZXdwb3J0LmhlaWdodCArIG9mZnNldCkKICAgICAgfQoKICAgICAgbGV0IGltYWdldXBkYXRldGltZSA9IDAKICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZWltYWdlc2xvYWQoKXsKICAgICAgICBsZXQgdCA9IERhdGUubm93KCkKICAgICAgICBpZih0IC0gaW1hZ2V1cGRhdGV0aW1lIDwgMTAwKXsKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpbWFnZXVwZGF0ZXRpbWUgPSB0CgogICAgICAgIHFzYSgiI3BpY3MgLml0ZW0gaW1nIikuZm9yRWFjaChhc3luYyBpbWcgPT4gewogICAgICAgICAgbGV0IG4gPSBpbWcucGFyZW50RWxlbWVudAogICAgICAgICAgCiAgICAgICAgICBpZihzY3JvbGx2aXNpYmxlKG4sIHZpc3VhbFZpZXdwb3J0LmhlaWdodCAvIDIpKXsKICAgICAgICAgICAgaW1nLnNyYyA9IGltZ1siZGF0YS1zcmMiXQogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIGltZy5zcmMgPSAiIgogICAgICAgICAgfQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgY29uc29sZS5sb2coInVwZGF0ZWltYWdlc2xvYWQgbXMiLCBEYXRlLm5vdygpIC0gdCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlYWxsdmlkZW9wbGF5KCl7CiAgICAgICAgcXNhKCIjcGljcyAuaXRlbS52aWRlbyIpLmZvckVhY2goYXN5bmMgbiA9PiB1cGRhdGV2aWRlb3BsYXkobikpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZXZpZGVvcGxheShuKXsKICAgICAgICBjb25zdCBhcGxheSA9IGF1dG9wbGF5KCkKICAgICAgICBjb25zdCB2ID0gbi5xdWVyeVNlbGVjdG9yKCJ2aWRlbyIpCiAgICAgICAgCiAgICAgICAgaWYoYXBsYXkgIT0gIm9uIil7CiAgICAgICAgICB2Lm11dGVkID0gZmFsc2UKICAgICAgICAgIHYucGF1c2UoKQogICAgICAgIH1lbHNlewogICAgICAgICAgdi5tdXRlZCA9IHRydWUKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoIXNjcm9sbHZpc2libGUobikpewogICAgICAgICAgaWYodi5yZWFkeVN0YXRlID09IDQpewogICAgICAgICAgICB2LnBhdXNlKCkKICAgICAgICAgIH1lbHNlewogICAgICAgICAgICB2LnByZWxvYWQgPSAibm9uZSIKICAgICAgICAgIH0KICAgICAgICB9ZWxzZSBpZih2LnJlYWR5U3RhdGUgIT0gNCl7CiAgICAgICAgICB2LnByZWxvYWQgPSAiYXV0byIKICAgICAgICB9CiAgICAgICAgZWxzZSBpZihhcGxheSA9PSAib24iIHx8IChhcGxheSA9PSAiaG92ZXIiICYmIHYgPT0gaG92ZXJlZHZpZGVvKSl7CiAgICAgICAgICB2LnBsYXkoKQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgZSA9PiB7CiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKQogICAgICAgIHVwZGF0ZWltYWdlc2xvYWQoKQogICAgICAgIHVwZGF0ZWFsbHZpZGVvcGxheSgpCiAgICAgIH0pCiAgICAgIAogICAgICBsZXQgdG91Y2ggPSBudWxsCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwgZSA9PiB0b3VjaCA9IGUuY2hhbmdlZFRvdWNoZXNbMF0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsIGUgPT4gewogICAgICAgIGNvbnN0IHhkaWZmID0gZS5jaGFuZ2VkVG91Y2hlc1swXS5zY3JlZW5YIC0gdG91Y2guc2NyZWVuWAoKICAgICAgICBpZih4ZGlmZiA8IC01MCl7CiAgICAgICAgICBzd2lwZSgxKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZih4ZGlmZiA+IDUwKXsKICAgICAgICAgIHN3aXBlKC0xKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIHFzKCIjcXVlcnktZm9ybSIpLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsIGUgPT4gewogICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIGxvY2F0aW9uLmhhc2ggPSAiIyIgKyBlbmNvZGVVUklDb21wb25lbnQocXMoIiNxdWVyeSIpLnZhbHVlICsgIi8iICsgcXVlcnl0eXBlKCkpCiAgICAgICAgdXBkYXRlcXVlcnkoKQogICAgICAgIHF1ZXJ5d2FpdC5yZXNvbHZlKCkKICAgICAgfSkKCiAgICAgIHFzKCIjcmVsYXlzLWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBhc3luYyBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBsZXQgciA9IEpTT04uc3RyaW5naWZ5KHFzKCIjcmVsYXlzIikudmFsdWUuc3BsaXQoIlxuIikpCiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oInJlbGF5cyIsIHIpCiAgICAgICAgZGlzY29ubmVjdCgpCiAgICAgIH0pCgogICAgICBxcygiI3ByaXZrZXktZm9ybSIpLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsIGFzeW5jIGUgPT4gewogICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIGNvbnN0IGtleSA9IHFzKCIjcHJpdmtleSIpLnZhbHVlCgogICAgICAgIGlmKGtleS5sZW5ndGggIT0gNjQgJiYga2V5Lmxlbmd0aCAhPSA2Myl7CiAgICAgICAgICBhbGVydCgia2V5IHNob3VsZCBiZSA2MyBvciA2NCBjaGFyYWN0ZXJzIGxvbmciKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJwcml2a2V5Iiwga2V5KQogICAgICAgIGFsZXJ0KCJrZXkgc2F2ZWQiKQogICAgICB9KQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwgYXN5bmMgKGUpID0+IHsKICAgICAgICBpZihhdXRvcGxheSgpID09ICJob3ZlciIgJiYgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2aWRlby1jb250YWluZXIiKSl7CiAgICAgICAgICBob3ZlcmVkdmlkZW8gPSBlLnRhcmdldC5xdWVyeVNlbGVjdG9yKCJ2aWRlbyIpCiAgICAgICAgICBob3ZlcmVkdmlkZW8ucGxheSgpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLCBhc3luYyAoZSkgPT4gewogICAgICAgIGhvdmVyZWR2aWRlbyA9IGZhbHNlCiAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5zdHlsZS5kaXNwbGF5ICE9ICJibG9jayIgJiYgYXV0b3BsYXkoKSA9PSAiaG92ZXIiICYmIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygidmlkZW8tY29udGFpbmVyIikpewogICAgICAgICAgcXNhKCJ2aWRlbyIpLmZvckVhY2godiA9PiB2LnBhdXNlKCkpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBhc3luYyAoZSkgPT4gewogICAgICAgIGlmKGUudGFyZ2V0LnR5cGUgPT0gInN1Ym1pdCIgfHwgKGUudGFyZ2V0LnRhZ05hbWUgPT0gIkEiICYmIGUudGFyZ2V0LmhyZWYubWF0Y2goL14ofHdlYlwrKW5vc3RyXDovKSkpewogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gInRpdGxlIil7CiAgICAgICAgICBxcygiI3F1ZXJ5IikudmFsdWUgPSAiIgogICAgICAgICAgcXMoIiNxdWVyeS10eXBlIikudmFsdWUgPSAiYWxsIgogICAgICAgICAgcXMoIiNnbyIpLmNsaWNrKCkKICAgICAgICB9CgogICAgICAgIGUucHJldmVudERlZmF1bHQoKQoKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAiZmlsdGVyLWxpa2VzIil7CiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC50b2dnbGUoImZpbHRlci1saWtlcyIpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzaG93IikpewogICAgICAgICAgYWN0aXZlKCk/LmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICBnaWQoZS50YXJnZXQuaWQpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBzaG93KGUudGFyZ2V0LmlkKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUudGFyZ2V0LnRhZ05hbWUgIT0gIkEiICYmIChxcygiI3BpYy1jb250YWluZXIiKSA9PSBlLnRhcmdldCB8fCBxcygiI21lZGlhLWNvbnRhaW5lciB2aWRlbyIpID09IGUudGFyZ2V0KSl7CiAgICAgICAgICBoaWRlbWVkaWEoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAibWVudSIgfHwgZS50YXJnZXQuaWQgPT0gIm1lbnUtb3ZlcmxheSIpewogICAgICAgICAgbWVudSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2V0Y29scyIpKXsKICAgICAgICAgIGZvcihsZXQgYyBvZiBjb2xvcHRzKXsKICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCJjb2xzIiArIGMpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgiY29scyIgKyBlLnRhcmdldC5kYXRhc2V0LmNvbHMpCiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiY29scyIsIGUudGFyZ2V0LmRhdGFzZXQuY29scykKICAgICAgICAgIHNldGFjdGl2ZSgic2V0Y29scyIsICJjb2xzIiwgY29scygpKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogIAogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2V0YXV0b3BsYXkiKSl7CiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiYXV0b3BsYXkiLCBlLnRhcmdldC5kYXRhc2V0LmF1dG9wbGF5KQogICAgICAgICAgc2V0YWN0aXZlKCJzZXRhdXRvcGxheSIsICJhdXRvcGxheSIsIGF1dG9wbGF5KCkpCiAgICAgICAgICB1cGRhdGVhbGx2aWRlb3BsYXkoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygibGlrZSIpICYmIGxpa2UoZS50YXJnZXQpCiAgICAgIH0pCiAgICAgIAogICAgICBmdW5jdGlvbiBoYXNrZXkoKXsKICAgICAgICByZXR1cm4gd2luZG93Lm5vc3RyIHx8IHByaXZrZXkoKQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBwdWJrZXkoKXsKICAgICAgICByZXR1cm4gd2luZG93Lm5vc3RyICYmIGF3YWl0IHdpbmRvdy5ub3N0ci5nZXRQdWJsaWNLZXkoKSB8fCBOb3N0clRvb2xzLmdldFB1YmxpY0tleShwcml2a2V5KCkpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHNpZ24oZXZlbnQpewogICAgICAgIGlmKHdpbmRvdy5ub3N0cil7CiAgICAgICAgICByZXR1cm4gYXdhaXQgbm9zdHIuc2lnbkV2ZW50KGV2ZW50KQogICAgICAgIH0KICAgICAgICAKICAgICAgICBldmVudC5zaWcgPSBOb3N0clRvb2xzLmdldFNpZ25hdHVyZShldmVudCwgcHJpdmtleSgpKQogICAgICAgIHJldHVybiBldmVudAogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBsaWtlKGxpbmspewogICAgICAgIGNvbnN0IGV2ZW50ID0gbGluay5wYXJlbnRFbGVtZW50WyJkYXRhLWV2ZW50Il0KICAgICAgICBjb25zdCBwdWJrID0gYXdhaXQgcHVia2V5KCkKICAgICAgICBjb25zdCBsaWtlID0gYXdhaXQgc2lnbih7CiAgICAgICAgICAia2luZCI6IDcsCiAgICAgICAgICAiY29udGVudCI6ICIrIiwKICAgICAgICAgICJ0YWdzIjogWwogICAgICAgICAgICBbImUiLCBldmVudC5pZF0sCiAgICAgICAgICAgIFsicCIsIGV2ZW50LnB1YmtleV0KICAgICAgICAgIF0sCiAgICAgICAgICAicHVia2V5IjogcHViaywKICAgICAgICAgICJjcmVhdGVkX2F0IjogcGFyc2VJbnQoRGF0ZS5ub3coKSAvIDEwMDAgLCAxMCkKICAgICAgICB9KQogICAgICAgIAogICAgICAgIHNvY2tldHMuZm9yRWFjaChzID0+IHMuc2VuZChKU09OLnN0cmluZ2lmeShbIkVWRU5UIiwgbGlrZV0pKSkKICAgICAgICBsaW5rLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQoKICAgICAgICBjb25zdCBwaWNpZCA9IGxpbmtbImRhdGEtaXRlbS1pZCJdIHx8IGxpbmsuZGF0YXNldC5waWNJZAogICAgICAgIAogICAgICAgIGlmKHBpY2lkKXsKICAgICAgICAgIGdpZChwaWNpZCkucXVlcnlTZWxlY3RvcigiLmxpa2UiKS5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICB9CiAgICAgIH0KICAgIAogICAgICBmdW5jdGlvbiBzd2lwZShvZmZzZXQpewogICAgICAgIGlmKHBpY29mZnNldChvZmZzZXQpKXsKICAgICAgICAgIHBpY29mZnNldChvZmZzZXQpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICB0aGlzW29mZnNldCA9PSAxICYmICJsYXN0YWN0aXZlIiB8fCAiYWN0aXZlIl0oKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgdXBkYXRlc2hvdygpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVzaG93KCl7CiAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5zdHlsZS5kaXNwbGF5ID09ICJibG9jayIpewogICAgICAgICAgaGlkZXZpZGVvKCkKICAgICAgICAgIHNob3coYWN0aXZlKCkuaWQpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgZSA9PiB7CiAgICAgICAgaWYoWyJUYWIiLCAiQXJyb3dMZWZ0IiwgIkFycm93UmlnaHQiLCAiQXJyb3dVcCIsICJBcnJvd0Rvd24iXS5pbmNsdWRlcyhlLmtleSkpewogICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiRXNjYXBlIil7CiAgICAgICAgICBtZW51KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLmtleSA9PSAiRW50ZXIiICYmIGUudGFyZ2V0LnRhZ05hbWUgPT0gIkJPRFkiKXsKICAgICAgICAgIGlmKHFzKCIjbWVkaWEtY29udGFpbmVyIikuc3R5bGUuZGlzcGxheSA9PSAiYmxvY2siKXsKICAgICAgICAgICAgaGlkZW1lZGlhKCkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHNob3coYWN0aXZlKCkuaWQpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd1VwIiAmJiBwaWNvZmZzZXQoLWNvbHMoKSkpewogICAgICAgICAgcGljb2Zmc2V0KC1jb2xzKCkpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBsYXN0YWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIHVwZGF0ZXNob3coKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93RG93biIgJiYgcGljb2Zmc2V0KGNvbHMoKSkpewogICAgICAgICAgcGljb2Zmc2V0KGNvbHMoKSkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICB1cGRhdGVzaG93KCkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd0xlZnQiKXsKICAgICAgICAgIHN3aXBlKC0xKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93UmlnaHQiKXsKICAgICAgICAgIHN3aXBlKDEpCiAgICAgICAgfQogICAgICB9KQoKICAgICAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlcXVlcnlyZXMocmVzLCBzb2NrZXQsIHEsIHR5cGUsIHN0aW1lKXsKICAgICAgICBzYXZlKHNvY2tldCwgcmVzLCBxLCB0eXBlLCBmYWxzZSwgZmFsc2UsIHRydWUpCiAgICAgICAgbG9nKCJxdWVyeSByZXMiLCByZXMubGVuZ3RoLCBzb2NrZXQudXJsKQogICAgICAgIHF1ZXJ5Y291bnQtLQogICAgICAgIGlmKHF1ZXJ5Y291bnQgPT0gMCl7CiAgICAgICAgICBxcygiI2xvYWRpbmciKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxldCB3YWl0ID0gd2FpdG1zIC0gKERhdGUubm93KCkgLSBzdGltZSkKICAgICAgICBxdWVyeXdhaXQgPSBzbGVlcCh3YWl0KQogICAgICAgIGF3YWl0IHF1ZXJ5d2FpdC5wcm9taXNlCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHByaW1hbGdsb2JhbChzb2NrZXQpewogICAgICAgIGxvZygiZ2xvYmFsIiwgc29ja2V0LnVybCkKICAgICAgICBxdWVyeWNvdW50KysKICAgICAgICBxcygiI2xvYWRpbmciKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgIGxldCBzdGltZSA9IERhdGUubm93KCkKICAgICAgICBsZXQgcWlkID0gImdsb2JhbF8iICsgKCsraWRjb3VudGVyKQogICAgICAgIGxldCBxaWRsaWtlcyA9ICJsaWtlc18iICsgKCsraWRjb3VudGVyKQoKICAgICAgICBpZihuZXdsaWtlcy5sZW5ndGggPiAwKXsKICAgICAgICAgIHByaW1hbHNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KFsKICAgICAgICAgICAgIlJFUSIsIAogICAgICAgICAgICBxaWRsaWtlcywgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiY2FjaGUiOiBbCiAgICAgICAgICAgICAgICAiZXZlbnRzIiwgewogICAgICAgICAgICAgICAgICAiZXZlbnRfaWRzIjogbmV3bGlrZXMKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0KICAgICAgICAgIF0pKQoKICAgICAgICAgIGNvbnN0IGxpa2VfZXZlbnRzID0gYXdhaXQgd2FpdHJlcyhxaWRsaWtlcykKICAgICAgICAgIG5ld2xpa2VzLnNwbGljZSgwKQogICAgICAgICAgCiAgICAgICAgICBhd2FpdCBzYXZlKHNvY2tldCwgbGlrZV9ldmVudHMsICIiLCAiYWxsIiwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KFsKICAgICAgICAgICJSRVEiLCAKICAgICAgICAgIHFpZCwgCiAgICAgICAgICB7CiAgICAgICAgICAgICJjYWNoZSI6IFsKICAgICAgICAgICAgICAiZXhwbG9yZSIsIAogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJ0aW1lZnJhbWUiOiAibGF0ZXN0IiwKICAgICAgICAgICAgICAgICJzY29wZSI6ICJnbG9iYWwiLAogICAgICAgICAgICAgICAgImxpbWl0IjogMjAKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdKSkKICAgICAgICAKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB3YWl0cmVzKHFpZCkKICAgICAgICBhd2FpdCBoYW5kbGVxdWVyeXJlcyhyZXMuZmlsdGVyKGUgPT4gZS5raW5kID09IDEpLCBzb2NrZXQsICIiLCAiYWxsIiwgc3RpbWUpCiAgICAgICAgcHJpbWFsZ2xvYmFsKHNvY2tldCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnkoc29ja2V0LCBwcmltYWwpewogICAgICAgIGxvZygicXVlcnkiLCBzb2NrZXQudXJsKQogICAgICAgIHF1ZXJ5Y291bnQrKwogICAgICAgIHFzKCIjbG9hZGluZyIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgICAgCiAgICAgICAgbGV0IHN0aW1lID0gRGF0ZS5ub3coKQogICAgICAgIGxldCBxID0gcXVlcnlzdHIudHJpbSgpCiAgICAgICAgbGV0IHR5cGUgPSBxdWVyeXR5cGUoKQogICAgICAgIGxldCBpID0gKytpZGNvdW50ZXIKICAgICAgICBsZXQgcWlkID0gInF1ZXJ5XyIgKyBpCiAgICAgICAgbGV0IGZpbHRlcnMgPSBbXQoKICAgICAgICBmaWx0ZXJzLnB1c2goLi4uKHR5cGVzW3R5cGVdIHx8IFtdKS5tYXAoKHQpID0+IHsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGtpbmRzOiBbMV0sIAogICAgICAgICAgICBzZWFyY2g6ICIuIiArIHQsCiAgICAgICAgICAgIGxpbWl0OiAyMAogICAgICAgICAgfQogICAgICAgIH0pKQogICAgICAgIAogICAgICAgIGlmKHEubGVuZ3RoID4gMCl7CiAgICAgICAgICBmaWx0ZXJzLnB1c2goe2tpbmRzOiBbMV0sIHNlYXJjaDogcX0pCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGZpbHRlcnMubGVuZ3RoID09IDApewogICAgICAgICAgZmlsdGVycy5wdXNoKHtraW5kczogWzFdfSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgCiAgICAgICAgY29uc3QgbGlrZXNyZXMgPSBhd2FpdCBxdWVyeWxpa2VzKHNvY2tldCkKICAgICAgICAKICAgICAgICBsaWtlc3Jlcy5mb3JFYWNoKGV2ZW50aWQgPT4gewogICAgICAgICAgaWYoIWxpa2VzLmluY2x1ZGVzKGV2ZW50aWQpKXsKICAgICAgICAgICAgbGlrZXMucHVzaChldmVudGlkKQogICAgICAgICAgICBuZXdsaWtlcy5wdXNoKGV2ZW50aWQpCiAgICAgICAgICB9CiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBjb25zdCBzZWFyY2hvYmogPSBbIlJFUSIsIHFpZCwgLi4uZmlsdGVyc10KICAgICAgICBjb25zdCBzZWFyY2hqc29uID0gSlNPTi5zdHJpbmdpZnkoc2VhcmNob2JqKQogICAgICAgIHNvY2tldC5zZW5kKHNlYXJjaGpzb24pCiAgICAgICAgCiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgd2FpdHJlcyhxaWQpCiAgICAgICAgYXdhaXQgaGFuZGxlcXVlcnlyZXMocmVzLCBzb2NrZXQsIHEsIHR5cGUsIHN0aW1lKQogICAgICAgIHF1ZXJ5KHNvY2tldCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlsaWtlcyhzb2NrZXQpewogICAgICAgIGlmKCFoYXNrZXkoKSl7CiAgICAgICAgICByZXR1cm4gW10KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgbXlwdWJrZXkgPSBhd2FpdCBwdWJrZXkoKQogICAgICAgIGNvbnN0IGV2ZW50cyA9IGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzddLCBudWxsLCBbbXlwdWJrZXldKQogICAgICAgIHJldHVybiBldmVudHMubWFwKGUgPT4gZS50YWdzLmZpbmQodCA9PiB0WzBdID09ICJlIilbMV0pCiAgICAgIH0KCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5ZXZlbnRzKHNvY2tldCwga2luZHMsIGV2ZW50aWRzLCBhdXRob3JzKXsKICAgICAgICBjb25zdCBxdWVyeWlkID0gImV2ZW50c18iICsgKCsraWRjb3VudGVyKQogICAgICAgIGNvbnN0IGZpbHRlcnMgPSB7fQogICAgICAgIAogICAgICAgIGZpbHRlcnMua2luZHMgPSBraW5kcwogICAgICAgIAogICAgICAgIGlmKGV2ZW50aWRzKXsKICAgICAgICAgIGZpbHRlcnNbIiNlIl0gPSBldmVudGlkcwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihhdXRob3JzKXsKICAgICAgICAgIGZpbHRlcnNbImF1dGhvcnMiXSA9IGF1dGhvcnMKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KFsKICAgICAgICAgICJSRVEiLCAKICAgICAgICAgIHF1ZXJ5aWQsIAogICAgICAgICAgZmlsdGVycwogICAgICAgIF0pCgogICAgICAgIHNvY2tldC5zZW5kKGpzb24pCiAgICAgICAgCiAgICAgICAgcmV0dXJuIGF3YWl0IHdhaXRyZXMocXVlcnlpZCkgfHwgW10KICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlwdWJrZXkoc29ja2V0LCBwdWJrKXsKICAgICAgICBjb25zdCBxdWVyeWlkID0gInF1ZXJ5XyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgc29ja2V0LnNlbmQocXVlcmllcy5hdXRob3IucmVwbGFjZSgiPEk+IiwgcXVlcnlpZCkucmVwbGFjZSgiPFA+IiwgcHViaykpCgogICAgICAgIHJldHVybiAoYXdhaXQgd2FpdHJlcyhxdWVyeWlkKSkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gc2F2ZShzb2NrZXQsIGV2ZW50ZGIsIHEsIHF0eXBlLCByZWFjdGVkLCBhcHBlbmQsIHF1ZXJ5bWV0YSl7CiAgICAgICAgbGV0IGV2ZW50cHVia2V5cyA9IFtdCiAgICAgICAgY29uc3QgZXZlbnRzID0gZXZlbnRkYi5maWx0ZXIobyA9PiB7CiAgICAgICAgICBpZihxLmxlbmd0aCA+IDApewogICAgICAgICAgICBmb3IobGV0IHdvcmQgb2YgcS5zcGxpdCgiICIpKXsKICAgICAgICAgICAgICBpZihvLmNvbnRlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKHdvcmQudG9Mb3dlckNhc2UoKSkgPT0gLTEpewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgcmV0dXJuIHRydWUKICAgICAgICB9KQogICAgICAgIAogICAgICAgIGxldCByZXN1bHRzID0gW10KICAgICAgICBjb25zdCBldmVudGlkcyA9IGV2ZW50cy5tYXAoZSA9PiBlLmlkKQogICAgICAgIGxldCBuZXd1cmxzID0gW10KICAgICAgICAKICAgICAgICBmb3IobGV0IGV2ZW50IG9mIGV2ZW50cyl7CiAgICAgICAgICBsZXQgdXJsc21hdGNoID0gW10KICAgICAgICAgIAogICAgICAgICAgaWYocXR5cGUgIT0gInZpZGVvIil7CiAgICAgICAgICAgIHVybHNtYXRjaC5wdXNoKC4uLihldmVudC5jb250ZW50Lm1hdGNoKGltZ3JlZ2V4KSB8fCBbXSkpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGlmKHF0eXBlICE9ICJpbWFnZSIpewogICAgICAgICAgICB1cmxzbWF0Y2gucHVzaCguLi4oZXZlbnQuY29udGVudC5tYXRjaCh2aWRlb3JlZ2V4KSB8fCBbXSkpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHVybHNtYXRjaCA9IHVybHNtYXRjaC5maWx0ZXIodXJsID0+ICF1cmxzLmluY2x1ZGVzKHVybCkpCgogICAgICAgICAgaWYodXJsc21hdGNoLmxlbmd0aCA+IDApewogICAgICAgICAgICBuZXd1cmxzLnB1c2goewogICAgICAgICAgICAgIGV2ZW50OiBldmVudCwKICAgICAgICAgICAgICB1cmxzOiB1cmxzbWF0Y2gKICAgICAgICAgICAgfSkKICAgICAgICAgICAgCiAgICAgICAgICAgIHVybHMucHVzaCguLi51cmxzbWF0Y2gpCiAgICAgICAgICAgIGV2ZW50cHVia2V5cy5pbmNsdWRlcyhldmVudC5wdWJrZXkpIHx8IGV2ZW50cHVia2V5cy5wdXNoKGV2ZW50LnB1YmtleSkKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbG9nKCJxdWVyeSBtZXRhIiwgc29ja2V0LnVybCkKICAgICAgICBsZXQgbWV0YWV2ZW50cyA9IChxdWVyeW1ldGEgJiYgYXdhaXQgcXVlcnlldmVudHMoc29ja2V0LCBbMF0sIG51bGwsIGV2ZW50cHVia2V5cykgfHwgW10pCiAgICAgICAgCiAgICAgICAgZm9yKGxldCBlbnRyeSBvZiBuZXd1cmxzKXsKICAgICAgICAgIGZvcihsZXQgdXJsIG9mIGVudHJ5LnVybHMpewogICAgICAgICAgICByZXN1bHRzLnB1c2goewogICAgICAgICAgICAgIHJlYWN0ZWQ6IHJlYWN0ZWQgfHwgbGlrZXMuaW5jbHVkZXMoZW50cnkuZXZlbnQuaWQpLCAKICAgICAgICAgICAgICB1cmw6IHVybCwgCiAgICAgICAgICAgICAgZXZlbnQ6IGVudHJ5LmV2ZW50LCAKICAgICAgICAgICAgICBiZWNoMzJpZDogYmVjaDMyLmVuY29kZSgibm90ZSIsIGZyb21IZXhTdHJpbmcoZW50cnkuZXZlbnQuaWQpKSwKICAgICAgICAgICAgICBtZXRhOiBtZXRhZXZlbnRzLmZpbmQobyA9PiBvLnB1YmtleSA9PSBlbnRyeS5ldmVudC5wdWJrZXkpCiAgICAgICAgICAgIH0pCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxvZygic2F2ZSByZXMiLCByZXN1bHRzLmxlbmd0aCwgc29ja2V0LnVybCkKICAgICAgICB1cGRhdGVjb250ZW50KHJlc3VsdHMsIHEsIGFwcGVuZCkKICAgICAgfQogICAgICAKICAgICAgbGV0IGxvYWRlZCA9IDAKICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZWNvbnRlbnQocmVzdWx0cywgcSwgYXBwZW5kKXsKICAgICAgICByZXN1bHRzLnJldmVyc2UoKS5mb3JFYWNoKGl0ZW0gPT4gewogICAgICAgICAgY29uc3QgdHlwZSA9IGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpICYmICJ2aWRlbyIgfHwgInBpYyIKICAgICAgICAgIGNvbnN0IHRleHQgPSAocSB8fCAidmlldyBub3RlIikuc3Vic3RyaW5nKC0zMCkKICAgICAgICAgIGNvbnN0IGlkID0gIml0ZW1fIiArICgrK2lkY291bnRlcikKICAgICAgICAgIGNvbnN0IGNvbnRlbnRlbGVtZW50cyA9ICc8ZGl2IGNsYXNzPSJ0eXBlIj4nICsgdHlwZSArICc8L2Rpdj48YSBjbGFzcz0ibGlrZScgKyAoaXRlbS5yZWFjdGVkID8gJyByZWFjdGVkJyA6ICcnKSArICciIGRhdGEtaXRlbS1pZD0iJyArIGlkICsgCiAgICAgICAgICAgICciIGhyZWY9IiMiPicgKyBxcygiI3RlbXBsYXRlIC5oZWFydHN2ZyIpLm91dGVySFRNTCArICc8L2E+PGEgY2xhc3M9InF1ZXJ5IiBocmVmPSInICsgcHJvdG9jb2wgKyAKICAgICAgICAgICAgaXRlbS5iZWNoMzJpZCArICciPicgKyB0ZXh0ICsgJzwvYT4nCiAgICAgICAgICBsZXQgcm9vdCA9IG51bGwKICAgICAgICAgIGxldCB2ID0gbnVsbAogICAgICAgICAgCiAgICAgICAgICBpZihpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KSl7CiAgICAgICAgICAgIHJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKQogICAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoInZpZGVvLWNvbnRhaW5lciIpCiAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MID0gY29udGVudGVsZW1lbnRzCiAgICAgICAgICAgIAogICAgICAgICAgICB2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKQogICAgICAgICAgICB2WyJkYXRhLWl0ZW0taWQiXSA9IGlkCiAgICAgICAgICAgIHYucHJlbG9hZCA9ICJub25lIgogICAgICAgICAgICB2Lmxvb3AgPSB0cnVlCiAgICAgICAgICAgIHYucGxheXNpbmxpbmUgPSAiIgogICAgICAgICAgICAKICAgICAgICAgICAgdi5vbmNhbnBsYXkgPSBhc3luYyBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICBjb25zdCBhc3BlY3QgPSB0aGlzLnZpZGVvV2lkdGggLyB0aGlzLnZpZGVvSGVpZ2h0CiAgICAgICAgICAgICAgaWYoYXNwZWN0ID4gMSl7CiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLndpZHRoID0gKGFzcGVjdCAqIDEwMCkgKyAiJSIKICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUuaGVpZ2h0ID0gKDEgLyBhc3BlY3QgKiAxMDApICsgIiUiCiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLm1hcmdpblRvcCA9IC0oKDEgLyBhc3BlY3QgKiAxMDAgLSAxMDApIC8gMikgKyAiJSIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgdXBkYXRldmlkZW9wbGF5KHRoaXMucGFyZW50RWxlbWVudCkKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29uc3QgZXh0ID0gaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleClbMV0KICAgICAgICAgICAgdi5pbm5lckhUTUwgPSAnPHNvdXJjZSBzcmM9IicgKyBpdGVtLnVybCArICciIHR5cGU9InZpZGVvLycgKyBleHQgKyAnIj48L3NvdXJjZT4nCiAgICAgICAgICAgIAogICAgICAgICAgICByb290LmFwcGVuZCh2KQogICAgICAgICAgfWVsc2UgaWYoaXRlbS51cmwubWF0Y2goaW1nZXh0cmVnZXgpKXsKICAgICAgICAgICAgcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKQogICAgICAgICAgICByb290LmhyZWYgPSAiIyIKICAgICAgICAgICAgcm9vdC5pbm5lckhUTUwgPSBjb250ZW50ZWxlbWVudHMKICAgICAgICAgICAgICAKICAgICAgICAgICAgaWYodHlwZSA9PSAicGljIil7CiAgICAgICAgICAgICAgbGV0IGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpCiAgICAgICAgICAgICAgaW1nLmFsdCA9IGl0ZW0udXJsCiAgICAgICAgICAgICAgaW1nWyJkYXRhLXNyYyJdID0gaXRlbS51cmwKICAgICAgICAgICAgICAvL2ltZy5jbGFzc0xpc3QuYWRkKCJkYXRhIikKICAgICAgICAgICAgICByb290LmFwcGVuZChpbWcpCiAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MICs9ICc8c3BhbiBjbGFzcz0iZmlsZSI+JyArIGl0ZW0udXJsICsgJzwvc3Bhbj4nCiAgICAgICAgICAgIH0KICAgICAgICAgIH1lbHNlewogICAgICAgICAgICByZXR1cm4KICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgcm9vdC5pZCA9IGlkCiAgICAgICAgICByb290LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snCiAgICAgICAgICByb290WyJkYXRhLWl0ZW0iXSA9IGl0ZW0KICAgICAgICAgIHJvb3RbImRhdGEtZXZlbnQiXSA9IGl0ZW0uZXZlbnQKICAgICAgICAgIHJvb3RbImRhdGEtcXVlcnkiXSA9IHEKICAgICAgICAgIHJvb3RbImRhdGEtdGV4dCJdID0gdGV4dAogICAgICAgICAgCiAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQodHlwZSkKICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgiaXRlbSIpCiAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoInNob3ciKQogICAgICAgICAgCiAgICAgICAgICBpZihpdGVtLnJlYWN0ZWQpewogICAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBxcygiI3BpY3MiKVthcHBlbmQgJiYgImFwcGVuZCIgfHwgInByZXBlbmQiXShyb290KQogICAgICAgICAgCiAgICAgICAgICBpZih2KXsKICAgICAgICAgICAgdXBkYXRldmlkZW9wbGF5KHJvb3QpCiAgICAgICAgICB9CiAgICAgICAgfSkKCiAgICAgICAgdXBkYXRlaW1hZ2VzbG9hZCgpCiAgICAgICAgCiAgICAgICAgaWYoYWN0aXZlKCkgPT0gbnVsbCl7CiAgICAgICAgICBxcygiI3BpY3MgLml0ZW0iKT8uY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGhpZGVtZWRpYSgpewogICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAic2Nyb2xsIgogICAgICAgIHFzYSgiI21lZGlhLWNvbnRhaW5lciwgI3BpYywgI21lZGlhLWZvb3RlciIpLmZvckVhY2gobiA9PiBuLnN0eWxlLmRpc3BsYXkgPSAibm9uZSIpCiAgICAgICAgZ2lkKCJwaWMtbGlrZSIpLmNsYXNzTGlzdC5yZW1vdmUoInJlYWN0ZWQiKQogICAgICAgIGhpZGV2aWRlbygpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGhpZGV2aWRlbygpewogICAgICAgIGNvbnN0IHYgPSBxcygiI21lZGlhLWNvbnRhaW5lciB2aWRlbyIpCiAgICAgICAgCiAgICAgICAgaWYodil7CiAgICAgICAgICB2Lm11dGVkID0gdHJ1ZQogICAgICAgICAgZ2lkKHZbImRhdGEtaXRlbS1pZCJdKS5hcHBlbmRDaGlsZCh2KQogICAgICAgICAgdXBkYXRldmlkZW9wbGF5KHYucGFyZW50RWxlbWVudCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHdhaXRyZXMoa2V5KXsKICAgICAgICBsZXQgZXZlbnRzID0gW10KICAgICAgICAKICAgICAgICBsZXQgcmVzaGFuZGxlciA9IGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7CiAgICAgICAgICB0aGlzLmhhbmRsZSA9IGZ1bmN0aW9uKHJlcyl7CiAgICAgICAgICAgIGxldCBvID0gSlNPTi5wYXJzZShyZXMuZGF0YSkKICAgICAgICAgICAgaWYob1sxXSA9PSBrZXkpewogICAgICAgICAgICAgIGlmKG9bMF0gPT0gIkVPU0UiKXsKICAgICAgICAgICAgICAgIHJlc29sdmUoZXZlbnRzKQogICAgICAgICAgICAgICAgcmVzaGFuZGxlcnMuc3BsaWNlKHJlc2hhbmRsZXJzLmluZGV4T2YodGhpcyksIDEpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGV2ZW50cy5wdXNoKG9bMl0pCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgICAKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAgICAgcmVzaGFuZGxlcnMucHVzaChuZXcgcmVzaGFuZGxlcihyZXNvbHZlLCByZWplY3QpKQogICAgICAgIH0pCiAgICAgIH0KICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBjaGVja3VwZGF0ZShzb2NrZXQpewogICAgICAgIGNvbnN0IHVwZGF0ZXNyZXMgPSBhd2FpdCBxdWVyeXB1YmtleShzb2NrZXQsIHVwZGF0ZXNwdWJrZXkpCiAgICAgICAgY29uc3QgdXBkYXRlbm90ZSA9IHVwZGF0ZXNyZXMuZmluZChuID0+IG4uY29udGVudC5tYXRjaCgvXmh0dHBzXDpcL1wvLykpCiAgICAgICAgCiAgICAgICAgaWYoIXVwZGF0ZW5vdGUpewogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGFnZSA9IE1hdGgucm91bmQoKERhdGUubm93KCkgLyAxMDAwIC0gdXBkYXRlbm90ZS5jcmVhdGVkX2F0KSAvIDM2MDAgLyAyNCkKICAgICAgICBjb25zdCBub3RlaWQgPSBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyh1cGRhdGVub3RlLmlkKSkKICAgICAgICBxcygiI3JlbGVhc2UiKS5ocmVmID0gcHJvdG9jb2wgKyBub3RlaWQKICAgICAgICBxcygiI3JlbGVhc2UiKS5pbm5lclRleHQgPSAoYWdlID09IDAgJiYgInRvZGF5IiB8fCBhZ2UgKyAiIGRheShzKSBhZ28iKQogICAgICB9CgogICAgICBmdW5jdGlvbiBzbGVlcChtcyl7CiAgICAgICAgcmV0dXJuIG5ldyBmdW5jdGlvbigpewogICAgICAgICAgbGV0IHRpbWVvdXQgPSBudWxsCiAgICAgICAgICBsZXQgciA9IG51bGwKICAgICAgICAgIAogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcHJvbWlzZTogbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXsKICAgICAgICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIG1zKQogICAgICAgICAgICAgIHIgPSByZXNvbHZlCiAgICAgICAgICAgIH0pLAogICAgICAgICAgICByZXNvbHZlOiBmdW5jdGlvbigpewogICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KQogICAgICAgICAgICAgIHIoKQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzaG93KGlkKXsKICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiIKICAgICAgICBjb25zdCBpdGVtID0gZ2lkKGlkKVsiZGF0YS1pdGVtIl0KICAgICAgICBjb25zdCBtZWRpYSA9IGdpZCgibWVkaWEtY29udGFpbmVyIikKICAgICAgICBjb25zdCBwaWMgPSBnaWQoInBpYyIpCgogICAgICAgIGlmKGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpKXsKICAgICAgICAgIHBpYy5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiCiAgICAgICAgICBjb25zdCB2ID0gZ2lkKGlkKS5xdWVyeVNlbGVjdG9yKCJ2aWRlbyIpCiAgICAgICAgICBxcygiI21lZGlhLWNvbnRhaW5lciIpLmFwcGVuZENoaWxkKHYpCiAgICAgICAgICB2Lm11dGVkID0gZmFsc2UKICAgICAgICAgIHYucGxheSgpCiAgICAgICAgfWVsc2V7CiAgICAgICAgICBwaWMuc3JjID0gaXRlbS51cmwKICAgICAgICAgIHBpYy5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihpdGVtLm1ldGEpewogICAgICAgICAgY29uc3QgbWV0YWNvbnRlbnQgPSBKU09OLnBhcnNlKGl0ZW0ubWV0YS5jb250ZW50KQogICAgICAgICAgY29uc3QgbmFtZSA9IG1ldGFjb250ZW50LmRpc3BsYXlfbmFtZSB8fCBtZXRhY29udGVudC5uYW1lCiAgICAgICAgICBxcygiI3BpYy11c2VyIikuc3R5bGUuZGlzcGxheSA9ICJibG9jayIKICAgICAgICAgIHFzKCIjcGljLXVzZXIiKS5ocmVmID0gcHJvdG9jb2wgKyBiZWNoMzIuZW5jb2RlKCJucHViIiwgZnJvbUhleFN0cmluZyhpdGVtLm1ldGEucHVia2V5KSkKICAgICAgICAgIHFzKCIjcGljLXVzZXIiKS5pbm5lclRleHQgPSBuYW1lCiAgICAgICAgfWVsc2V7CiAgICAgICAgICBxcygiI3BpYy11c2VyIikuc3R5bGUuZGlzcGxheSA9ICJub25lIgogICAgICAgIH0KCiAgICAgICAgZ2lkKCJwaWMtbGlrZSIpWyJkYXRhLWl0ZW0taWQiXSA9IGlkCiAgICAgICAgZ2lkKCJtZWRpYS1mb290ZXIiKVsiZGF0YS1ldmVudCJdID0gaXRlbS5ldmVudAoKICAgICAgICBpZihpdGVtLnJlYWN0ZWQpewogICAgICAgICAgZ2lkKCJwaWMtbGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBhID0gcXMoIiNwaWMtcXVlcnkiKQogICAgICAgIGEuaHJlZiA9IHByb3RvY29sICsgaXRlbS5iZWNoMzJpZAogICAgICAgIGEuaW5uZXJUZXh0ID0gZ2lkKGlkKVsiZGF0YS10ZXh0Il0KICAgICAgICAgIAogICAgICAgIG1lZGlhLnN0eWxlLmRpc3BsYXkgPSBnaWQoIm1lZGlhLWZvb3RlciIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGNvbm5jb3VudCgpewogICAgICAgIHJldHVybiBzb2NrZXRzLmZpbHRlcihyID0+IHIucmVhZHlTdGF0ZSA9PSAxKS5sZW5ndGgKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gZGlzY29ubmVjdCgpewogICAgICAgIGZvcihsZXQgc29ja2V0IG9mIHNvY2tldHMpewogICAgICAgICAgc29ja2V0LmNsb3NlKCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc29ja2V0cy5zcGxpY2UoMCkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gbG9nKG1zZyl7CiAgICAgICAgbGV0IHNjcm9sbCA9IHFzKCIjbG9ncyIpLnNjcm9sbFRvcCA9PSBxcygiI2xvZ3MiKS5zY3JvbGxUb3BNYXgKICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKQogICAgICAgIGRpdi5pbm5lclRleHQgPSBBcnJheS5mcm9tKGFyZ3VtZW50cykuam9pbigiICIpCiAgICAgICAgcXMoIiNsb2dzIikuYXBwZW5kKGRpdikKICAgICAgICAKICAgICAgICBzY3JvbGwgJiYgcXMoIiNsb2dzIikuc2Nyb2xsVG8oMCwgcXMoIiNsb2dzIikuc2Nyb2xsVG9wTWF4KQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBjb25uZWN0KHVybCl7CiAgICAgICAgbG9nKCJjb25uZWN0aW5nIiwgdXJsKQogICAgICAgIGxldCBzb2NrZXQgPSBuZXcgV2ViU29ja2V0KHVybCkKICAgICAgICAKICAgICAgICBzb2NrZXQub25tZXNzYWdlID0gbWVzc2FnZSA9PiByZXNoYW5kbGVycy5mb3JFYWNoKHJoID0+IHJoLmhhbmRsZShtZXNzYWdlKSkKICAgICAgICAKICAgICAgICBzb2NrZXQub25jbG9zZSA9IGFzeW5jIGZ1bmN0aW9uKCl7CiAgICAgICAgICBzb2NrZXRzLnNwbGljZShzb2NrZXRzLmluZGV4T2Yoc29ja2V0KSwgMSkKICAgICAgICAgIHFzKCIjY29ubmNvdW50IikuaW5uZXJUZXh0ID0gY29ubmNvdW50KCkgKyAocHJpbWFsc29ja2V0ICYmIDEpCiAgICAgICAgICBsb2coImRpc2Nvbm5lY3RlZCIsIHRoaXMudXJsLCBjb25uY291bnQoKSkKICAgICAgICAgIGF3YWl0IHNsZWVwKDEwMDApLnByb21pc2UKICAgICAgICAgIGNvbm5lY3QodGhpcy51cmwpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHNvY2tldC5vbm9wZW4gPSBmdW5jdGlvbigpewogICAgICAgICAgcXMoIiNjb25uY291bnQiKS5pbm5lclRleHQgPSBjb25uY291bnQoKSArIChwcmltYWxzb2NrZXQgJiYgMSkKICAgICAgICAgIGxvZygiY29ubmVjdGVkIiwgdGhpcy51cmwsIGNvbm5jb3VudCgpKQogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4gc29ja2V0CiAgICAgIH0KICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLCBhc3luYyAoKSA9PiB7CiAgICAgICAgcHJpbWFsc29ja2V0ID0gY29ubmVjdCgid3NzOi8vY2FjaGUzLnByaW1hbC5uZXQvY2FjaGUxNyIpCiAgICAgICAgcHJpbWFsc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoIm9wZW4iLCBmdW5jdGlvbigpewogICAgICAgICAgcHJpbWFsZ2xvYmFsKHRoaXMpCiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBwcmltYWxzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xvc2UiLCBmdW5jdGlvbigpewogICAgICAgICAgcHJpbWFsc29ja2V0ID0gbnVsbAogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgZm9yKGxldCB1cmwgb2YgcmVsYXlzKCkpewogICAgICAgICAgY29uc3Qgc29ja2V0ID0gY29ubmVjdCh1cmwpCiAgICAgICAgICBzb2NrZXRzLnB1c2goc29ja2V0KQogICAgICAgICAgCiAgICAgICAgICBzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcigib3BlbiIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIGNoZWNrdXBkYXRlKHRoaXMpCiAgICAgICAgICAgIHF1ZXJ5KHRoaXMpCiAgICAgICAgICB9KQogICAgICAgIH0KICAgICAgICAKICAgICAgICBhd2FpdCBzbGVlcCgxMDApLnByb21pc2UKICAgICAgICAKICAgICAgICBpZihoYXNrZXkoKSl7CiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoIm5vc3RyIikKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBmb3IobGV0IGMgb2YgY29sb3B0cyl7CiAgICAgICAgZG9jdW1lbnQud3JpdGUoJzxzdHlsZT4nICsgY29sc2Nzcy5pbm5lclRleHQucmVwbGFjZSgvXCRce2NvbHNcfS9nLCBjKSArICc8L3N0eWxlPicpCiAgICAgIH0KICAgIDwvc2NyaXB0PgogIDwvYm9keT4KPC9odG1sPgo=
https://ipfs.io/ipfs/QmSmnmyAjDXe4hSqWe23ft3kaavgS9jHSQqGBmERdXRi5b
files.html, dynamic loading of images
sha256
20a620f09528e3fa2c5fe11a083f2dacf2c7b6287d23b74af61b9e34778d05c2 files.html
base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyIvPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL3N2Z2ljb25zLnNwYXJray5mci9zdmdpY29ucy5jc3MiLz4KICAgIDxzdHlsZT4KICAgICAgKiB7CiAgICAgICAgb3ZlcnNjcm9sbC1iZWhhdmlvci15OiBjb250YWluOwogICAgICB9CiAgICAgIAogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksIAogICAgICAjaGVhZGVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncywgCiAgICAgICNwcml2a2V5IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncyB7CiAgICAgICAgaGVpZ2h0OiA2ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNsb2dzIHsKICAgICAgICBoZWlnaHQ6IDhlbTsKICAgICAgICBvdmVyZmxvdzogc2Nyb2xsOwogICAgICAgIGZvbnQtc2l6ZTogLjhlbTsKICAgICAgfQogICAgICAKICAgICAgc2VsZWN0IHsKICAgICAgICB3aWR0aDogNGVtOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLCAKICAgICAgaW5wdXQuc3VibWl0IHsKICAgICAgICBib3JkZXItcmFkaXVzOiAuNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0LCAKICAgICAgI2hlYWRlciBhLAogICAgICAjbWVkaWEtY29udGFpbmVyIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLCAKICAgICAgZm9ybSwgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHotaW5kZXg6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgIAogICAgICBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDMwZW0pIHsKICAgICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgfQogICAgICB9CgogICAgICBmb3JtIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeSB7CiAgICAgICAgd2lkdGg6IDZlbTsKICAgICAgfQogICAgICAKICAgICAgI2xvYWRpbmcgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMHB4OwogICAgICAgIGxlZnQ6IDI3ZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgIGEgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgfQoKICAgICAgdmlkZW8gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogIAogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgIGhlaWdodDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgIG1hcmdpbi10b3A6IDAgIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgLnR5cGUgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICB6LWluZGV4OiAxOwogICAgICB9CiAgICAgIAogICAgICAjcGljLXF1ZXJ5IHsKICAgICAgICB3aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5LAogICAgICBhLAogICAgICBpbnB1dC5zdWJtaXQgewogICAgICAgIGNvbG9yOiAjOTk5OwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICBwYWRkaW5nOiAwIDFlbTsKICAgICAgfQoKICAgICAgI3F1ZXJ5ZGlzcGxheSAudGV4dCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIG1pbi13aWR0aDogM2VtOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgYSwKICAgICAgI2hlYWRlciBzcGFuIHsKICAgICAgICBwYWRkaW5nOiAwLjVlbTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQoKICAgICAgI2hlYWRlciB7CiAgICAgICAgcGFkZGluZzogMC40NWVtIDA7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQoKICAgICAgI2hlYWRlciAuaXRlbXMgewogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICB9CiAgICAgIAogICAgICAjaGVhZGVyIC5pdGVtcyB7CiAgICAgICAgbWFyZ2luLXRvcDogLjNlbTsKICAgICAgfQoKICAgICAgcCB7CiAgICAgICAgbWFyZ2luLXRvcDogMDsKICAgICAgfQogICAgICAKICAgICAgLmxhYmVsIHsKICAgICAgICBwYWRkaW5nOiAuOGVtIC44ZW0gLjhlbSAwOwogICAgICB9CgogICAgICAjcGljcyAucXVlcnkgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgfQoKICAgICAgI21lZGlhLWNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDApOwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgei1pbmRleDogNDsKICAgICAgfQogICAgICAKICAgICAgI3BpYy1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAKICAgICAgI3BpYyB7CiAgICAgICAgbWF4LXdpZHRoOiAxMDB2dzsKICAgICAgICBtYXgtaGVpZ2h0OiAxMDB2aDsKICAgICAgfQogICAgICAgIAogICAgICAjcGljcyB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgICAKICAgICAgI3BpY3MgPiBhLCAKICAgICAgI3BpY3MgaW1nLAogICAgICAjcGljcyAuZmlsZSwKICAgICAgI3BpY3MgLnZpZGVvLWNvbnRhaW5lciB7CiAgICAgICAgd2lkdGg6IDI1dnc7CiAgICAgIH0KCiAgICAgICNwaWNzID4gYSwKICAgICAgI3BpY3MgLmZpbGUsCiAgICAgICNwaWNzIC52aWRlby1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMjV2dzsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIGJvcmRlcjogMC4zZW0gc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMC4zZW07CiAgICAgICAgbWFyZ2luOiAtMC4zZW07CiAgICAgIH0KCiAgICAgICNwaWNzID4gLmZpbGUgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIAogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CiAgICAgIAogICAgICBib2R5Om5vdCgubm9zdHIpICNmaWx0ZXItbGlrZXMsIAogICAgICAuZmlsdGVyLWxpa2VzICNwaWNzID4gLml0ZW06bm90KC5yZWFjdGVkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgei1pbmRleDogMjsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3Z3OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHBhZGRpbmc6IDAgMXZ3OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNwaWMtcXVlcnkgewogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBmb250LXNpemU6IG1pbigzLjV2dywgMS41ZW0pOwogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsMC42KTsKICAgICAgICBtYXgtd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgI3BpYy1xdWVyeSB7CiAgICAgICAgcGFkZGluZzogLjZlbSAuNGVtIC4xZW0gLjRlbTsKICAgICAgICBtYXgtd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgLmxpa2UucmVhY3RlZCwKICAgICAgLmZpbHRlci1saWtlcyAjZmlsdGVyLWxpa2VzIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7CiAgICAgIH0KCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgZm9udC1zaXplOiAzZW07CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciwKICAgICAgI21lZGlhLWZvb3RlciAubGlrZSB7CiAgICAgICAgei1pbmRleDogNTsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgYm90dG9tOiAxLjllbTsKICAgICAgICBmb250LXNpemU6IDEuOGVtOwogICAgICAgIHBhZGRpbmctcmlnaHQ6IC42NWVtOwogICAgICAgIG1heC13aWR0aDogOGVtOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9CiAgICAgIAogICAgICAubGlrZSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiBhdXRvOwogICAgICAgIHBhZGRpbmc6IC4yZW07CiAgICAgICAgd2lkdGg6IDFlbTsKICAgICAgICBoZWlnaHQ6IDFlbTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CgogICAgICAubm9zdHIgLmxpa2UgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOyAgCiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgLmxpa2UgewogICAgICAgIGZvbnQtc2l6ZTogMi40ZW07CiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgewogICAgICAgIGRpc3BsYXk6IG5vbmU7ICAKICAgICAgfQogIAogICAgICAjcGljcyBpbWcgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgLmFjdGl2ZSB7CiAgICAgICAgYmFja2dyb3VuZDogIzQ0NDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI3BpY3MgPiAuYWN0aXZlIHsKICAgICAgICBib3JkZXItY29sb3I6IGdyZWVuOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KCiAgICAgIC5oZWFydHN2ZyBwYXRoIHsKICAgICAgICBzdHJva2U6ICNmZmY7CiAgICAgIH0KICAKICAgICAgYSNtZW51LCBhI2ZpbHRlci1saWtlcyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luLXRvcDogLS4zZW07CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgfQoKICAgICAgYSNtZW51IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBwYWRkaW5nOiAwIC4zZW0gMCAuNWVtOwogICAgICAgIGhlaWdodDogMi4xZW07CiAgICAgIH0KICAgICAgCiAgICAgIGEjZmlsdGVyLWxpa2VzIHsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB3aWR0aDogMS41ZW07CiAgICAgICAgaGVpZ2h0OiAxLjVlbTsKICAgICAgICBtYXJnaW46IC4xZW0gLjVlbTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgIH0KICAgICAgCiAgICAgIGEjZmlsdGVyLWxpa2VzIHN2ZyB7CiAgICAgICAgd2lkdGg6IDEuNWVtOwogICAgICAgIGhlaWdodDogMS41ZW07CiAgICAgIH0KICAgICAgIAogICAgICAubWVudXN2ZyB7CiAgICAgICAgd2lkdGg6IDJlbTsKICAgICAgICBoZWlnaHQ6IDJlbTsKICAgICAgfQoKICAgICAgLm1lbnVzdmcgcGF0aCB7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBtYXJnaW4tbGVmdDogLTE4ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzIyMjsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgei1pbmRleDogMzsgCiAgICAgICAgb3ZlcmZsb3c6IHNjcm9sbDsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudC5vcGVuIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgewogICAgICAgIHBhZGRpbmc6IDAgMWVtIDFlbSAxZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIGEsCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgcGFkZGluZzogLjVlbSAuN2VtOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHotaW5kZXg6IDM7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIG9wYWNpdHk6IC41OwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5Lm9wZW4gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIAogICAgICBzdmcsIAogICAgICBpbWcsIAogICAgICAudmlkZW8gdmlkZW8gewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAjdGVtcGxhdGUgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGRpdiBpZD0idGVtcGxhdGUiPgogICAgICA8c3ZnIGNsYXNzPSJoZWFydHN2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KICAgICAgICA8cGF0aCBkPSJNOS43MTksMTcuMDczbC02LjU2Mi02LjUxYy0wLjI3LTAuMjY4LTAuNTA0LTAuNTY3LTAuNjk2LTAuODg4QzEuMzg1LDcuODksMS42Nyw1LjYxMywzLjE1NSw0LjE0YzAuODY0LTAuODU2LDIuMDEyLTEuMzI5LDMuMjMzLTEuMzI5YzEuOTI0LDAsMy4xMTUsMS4xMiwzLjYxMiwxLjc1MmMwLjQ5OS0wLjYzNCwxLjY4OS0xLjc1MiwzLjYxMi0xLjc1MmMxLjIyMSwwLDIuMzY5LDAuNDcyLDMuMjMzLDEuMzI5YzEuNDg0LDEuNDczLDEuNzcxLDMuNzUsMC42OTMsNS41MzdjLTAuMTksMC4zMi0wLjQyNSwwLjYxOC0wLjY5NSwwLjg4N2wtNi41NjIsNi41MUMxMC4xMjUsMTcuMjI5LDkuODc1LDE3LjIyOSw5LjcxOSwxNy4wNzMgTTYuMzg4LDMuNjFDNS4zNzksMy42MSw0LjQzMSw0LDMuNzE3LDQuNzA3QzIuNDk1LDUuOTIsMi4yNTksNy43OTQsMy4xNDUsOS4yNjVjMC4xNTgsMC4yNjUsMC4zNTEsMC41MSwwLjU3NCwwLjczMUwxMCwxNi4yMjhsNi4yODEtNi4yMzJjMC4yMjQtMC4yMjEsMC40MTYtMC40NjYsMC41NzMtMC43MjljMC44ODctMS40NzIsMC42NTEtMy4zNDYtMC41NzEtNC41NkMxNS41Nyw0LDE0LjYyMSwzLjYxLDEzLjYxMiwzLjYxYy0xLjQzLDAtMi42MzksMC43ODYtMy4yNjgsMS44NjNjLTAuMTU0LDAuMjY0LTAuNTM2LDAuMjY0LTAuNjksMEM5LjAyOSw0LjM5Nyw3LjgyLDMuNjEsNi4zODgsMy42MSI+PC9wYXRoPgogICAgICA8L3N2Zz4KICAgICAgPGRpdiBpZD0iY29sc2NzcyI+CiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyAuaXRlbSB7CiAgICAgICAgd2lkdGg6IGNhbGMoMTAwdncgLyAke2NvbHN9KTsKICAgICAgfQoKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzIC5pdGVtIHsKICAgICAgICBoZWlnaHQ6IGNhbGMoMTAwdncgLyAke2NvbHN9KTsKICAgICAgfQogICAgICAKICAgICAgLmNvbHMke2NvbHN9IC5xdWVyeSwKICAgICAgLmNvbHMke2NvbHN9IC5saWtlIHsKICAgICAgICBmb250LXNpemU6IG1pbigxNHZ3ICogKDEgLyAke2NvbHN9KSwgNmVtICogKDEgLyAke2NvbHN9KSkKICAgICAgfQogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0ibWVkaWEtZm9vdGVyIj4KICAgICAgPGEgaWQ9InBpYy1saWtlIiBjbGFzcz0ibGlrZSIgaHJlZj0iIyI+PC9hPgogICAgICA8YSBpZD0icGljLXF1ZXJ5IiBocmVmPSIjIj48L2E+CiAgICAgIDxhIGlkPSJwaWMtdXNlciIgaHJlZj0iIyI+PC9hPgogICAgPC9kaXY+CiAgICA8Y2VudGVyIGlkPSJtZWRpYS1jb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJwaWMtY29udGFpbmVyIj4KICAgICAgICA8aW1nIGlkPSJwaWMiLz4KICAgICAgPC9kaXY+CiAgICA8L2NlbnRlcj4KICAgIDxkaXYgaWQ9Im1lbnUtb3ZlcmxheSI+PC9kaXY+CiAgICA8ZGl2IGlkPSJtZW51LWNvbnRlbnQiIGNsYXNzPSJ0ZXN0Ij4KICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5hdXRvcGxheTwvZGl2PgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0ib24iIGhyZWY9IiMiPm9uPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0ib2ZmIiBocmVmPSIjIj5vZmY8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJob3ZlciIgaHJlZj0iIyI+bW91c2VvdmVyPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5jb2x1bW5zPC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMSIgaHJlZj0iIyI+MTwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSIyIiBocmVmPSIjIj4yPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjQiIGhyZWY9IiMiPjQ8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iNiIgaHJlZj0iIyI+NjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSIxMCIgaHJlZj0iIyI+MTA8L2E+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmNvbm5lY3Rpb25zPC9kaXY+CiAgICAgICAgPGRpdiBpZD0iY29ubmNvdW50Ij4wPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPnJlbGF5czo8L2Rpdj4KICAgICAgICA8cD5QbGVhc2UgdXNlIHJlbGF5cyB3aXRoIE5JUC01MCAoc2VhcmNoKSBmdW5jdGlvbmFsaXR5PC9wPgogICAgICAgIDxmb3JtIGFjdGlvbj0iIyIgaWQ9InJlbGF5cy1mb3JtIj4KICAgICAgICAgIDx0ZXh0YXJlYSBpZD0icmVsYXlzIj48L3RleHRhcmVhPgogICAgICAgICAgPGlucHV0IGNsYXNzPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9InNhdmUgcmVsYXlzIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5wcml2YXRlIGtleTo8L2Rpdj4KICAgICAgICA8cD5JZiB5b3UgY2FudCB1c2UgYnJvd3NlciBhZGRvbiAobW9iaWxlKTwvcD4KICAgICAgICA8Zm9ybSBhY3Rpb249IiMiIGlkPSJwcml2a2V5LWZvcm0iPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJwcml2a2V5Ii8+CiAgICAgICAgICA8aW5wdXQgY2xhc3M9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0ic2F2ZSBrZXkiLz4KICAgICAgICA8L2Zvcm0+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmxvZ3M8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJsb2dzIj48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+bGF0ZXN0IHJlbGVhc2U6PC9kaXY+CiAgICAgICAgPGEgaWQ9InJlbGVhc2UiIGhyZWY9IiMiPjwvYT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9ImhlYWRlciI+CiAgICAgIDxhIGlkPSJmaWx0ZXItbGlrZXMiIGhyZWY9IiMiPjwvYT4KICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxhIGlkPSJtZW51IiBocmVmPSIjIj4KICAgICAgICAgIDxzdmcgY2xhc3M9Im1lbnVzdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJICAgICAgICA8cGF0aCBkPSJNMTAsMS40NDVjLTQuNzI2LDAtOC41NTUsMy44MjktOC41NTUsOC41NTVjMCw0LjcyNSwzLjgyOSw4LjU1NSw4LjU1NSw4LjU1NWM0LjcyNSwwLDguNTU1LTMuODMsOC41NTUtOC41NTVDMTguNTU1LDUuMjc0LDE0LjcyNSwxLjQ0NSwxMCwxLjQ0NSBNMTAsMTcuNjU0Yy00LjIyMSwwLTcuNjU0LTMuNDM0LTcuNjU0LTcuNjU0YzAtNC4yMjEsMy40MzMtNy42NTQsNy42NTQtNy42NTRjNC4yMjIsMCw3LjY1NCwzLjQzMyw3LjY1NCw3LjY1NEMxNy42NTQsMTQuMjIxLDE0LjIyMiwxNy42NTQsMTAsMTcuNjU0IE0xNC4zOSwxMGMwLDAuMjQ4LTAuMjAzLDAuNDUtMC40NSwwLjQ1SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMy0wLjQ1LTAuNDVzMC4yMDMtMC40NSwwLjQ1LTAuNDVoNy44NzlDMTQuMTg3LDkuNTUsMTQuMzksOS43NTIsMTQuMzksMTAgTTE0LjM5LDEyLjcwMmMwLDAuMjQ3LTAuMjAzLDAuNDQ5LTAuNDUsMC40NDlINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAyLTAuNDUtMC40NDljMC0wLjI0OCwwLjIwMy0wLjQ1MSwwLjQ1LTAuNDUxaDcuODc5QzE0LjE4NywxMi4yNTEsMTQuMzksMTIuNDU0LDE0LjM5LDEyLjcwMiBNMTQuMzksNy4yOThjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw2Ljg0OCwxNC4zOSw3LjA1MSwxNC4zOSw3LjI5OCI+PC9wYXRoPgoJICAgICAgICA8L3N2Zz4KICAgICAgICA8L2E+CiAgICAgICAgPGEgaWQ9InRpdGxlIiBocmVmPSIjIj5maWxlcy5odG1sPC9hPgogICAgICAgIDxmb3JtIGlkPSJxdWVyeS1mb3JtIiBhY3Rpb249IiMiPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJxdWVyeSIgbmFtZT0icXVlcnkiIGlkPSIiIC8+CiAgICAgICAgICA8c2VsZWN0IGlkPSJxdWVyeS10eXBlIj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iYWxsIj5hbGw8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaW1hZ2UiPmltYWdlczwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ2aWRlbyI+dmlkZW9zPC9vcHRpb24+CiAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgIDxpbnB1dCBpZD0iZ28iIHR5cGU9InN1Ym1pdCIgdmFsdWU9ImdvIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxzcGFuIGlkPSJxdWVyeWRpc3BsYXkiPgogICAgICAgICAgPHNwYW4gY2xhc3M9InRleHQiPjwvc3Bhbj4KICAgICAgICA8L3NwYW4+CiAgICAgICAgPGRpdiBpZD0ibG9hZGluZyI+dXBkYXRpbmc8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9InBpY3MiPjwvZGl2PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vdW5wa2cuY29tL25vc3RyLXRvb2xzL2xpYi9ub3N0ci5idW5kbGUuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vc2xvd2xpLmdpdGh1Yi5pby9iZWNoMzItYnVmZmVyL2Fzc2V0cy9qcy9iZWNoMzItYnVmZmVyLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0PgogICAgICBjb25zdCB1cGRhdGVzcHVia2V5ID0gImFlNWM2ZTBiNzQ2NjBkMjE5NGM4MjU0YjVjMmM4MjU2NzY1NzZiZTAyOTczNzlmYTIwNTIzMTE0YTZhODVlODciCiAgICAgIGNvbnN0IHF1ZXJpZXMgPSB7CiAgICAgICAgImdsb2JhbCI6ICdbIlJFUSIsIjxJPiIseyJjYWNoZSI6WyJleHBsb3JlIix7InRpbWVmcmFtZSI6ImxhdGVzdCIsInNjb3BlIjoiZ2xvYmFsIiwibGltaXQiOjxMPn1dfV0nLCAKICAgICAgICAiYXV0aG9yIjogJ1siUkVRIiwiPEk+Iix7ImtpbmRzIjpbMV0sImF1dGhvcnMiOlsiPFA+Il19XScsCiAgICAgICAgInJlYWN0aW9ucyI6ICdbIlJFUSIsIjxJPiIsIHsia2luZHMiOls3XSwiI2UiOiA8RT59XScKICAgICAgfQogICAgICBxcygiI3JlbGF5cyIpLnZhbHVlID0gcmVsYXlzKCkuam9pbigiXG4iKQogICAgICBxcygiI3ByaXZrZXkiKS52YWx1ZSA9IHByaXZrZXkoKQogICAgICBjb25zdCBjb2xvcHRzID0gWzEsIDIsIDQsIDYsIDEwXQoKICAgICAgY29scyA9ICgpID0+IHBhcnNlSW50KHNldHRpbmcoImNvbHMiLCBjb2xvcHRzWzFdKSwgMTApCiAgICAgIGF1dG9wbGF5ID0gKCkgPT4gc2V0dGluZygiYXV0b3BsYXkiLCAib2ZmIikKICAgICAgbGltaXQgPSAoKSA9PiBwYXJzZUludChzZXR0aW5nKCJsaW1pdCIsIDE1KSwgMTApCiAgICAgIAogICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgY29scygpKQogICAgICAKICAgICAgbGV0IHByb3RvY29sID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlLykgPyAibm9zdHI6IiA6ICJ3ZWIrbm9zdHI6IgogICAgICBsZXQgc29ja2V0cyA9IFtdCiAgICAgIGxldCByZXNoYW5kbGVycyA9IFtdCiAgICAgIGxldCB1cmxzID0gW10KICAgICAgbGV0IGxpa2VzID0gW10KICAgICAgbGV0IG5ld2xpa2VzID0gW10KICAgICAgbGV0IGlkY291bnRlciA9IDAKICAgICAgbGV0IHF1ZXJ5d2FpdCA9IG51bGwKICAgICAgbGV0IHByaW1hbHNvY2tldCA9IG51bGwKICAgICAgbGV0IHR5cGVzID0gewogICAgICAgIGltYWdlOiBbInBuZyIsICJqcGciLCAianBlZyIsICJ3ZWJwIl0sCiAgICAgICAgdmlkZW86IFsibXA0IiwgIndlYm0iXQogICAgICB9CiAgICAgIGxldCBpbWdyZWdleCA9IC9odHRwKHxzKVw6XC9cL1teIFxuXSo/XC4ocG5nfGpwZ3xqcGVnfHdlYnApL2dpCiAgICAgIGxldCB2aWRlb3JlZ2V4ID0gL2h0dHAofHMpXDpcL1wvW14gXG5dKj9cLihtcDR8d2VibSkvZ2kKICAgICAgbGV0IHZpZGVvZXh0cmVnZXggPSAvXC4obXA0fHdlYm0pJC9pCiAgICAgIGxldCBpbWdleHRyZWdleCA9IC9cLihwbmd8anBnfGpwZWd8d2VicCkkL2kKICAgICAgd2FpdG1zID0gNTAwMAogICAgICBxdWVyeXN0ciA9ICIiCiAgICAgIGxldCBxdWVyeWNvdW50ID0gMAogICAgICBsZXQgaG92ZXJlZHZpZGVvID0gbnVsbAogICAgICAKICAgICAgdXBkYXRlcXVlcnkoKQogICAgICBxcygiI3BpYy1saWtlIikuaW5uZXJIVE1MID0gcXMoIiNmaWx0ZXItbGlrZXMiKS5pbm5lckhUTUwgPSBxcygiI3RlbXBsYXRlIC5oZWFydHN2ZyIpLm91dGVySFRNTAogICAgICBzZXRhY3RpdmUoInNldGNvbHMiLCAiY29scyIsIGNvbHMoKSkKICAgICAgc2V0YWN0aXZlKCJzZXRhdXRvcGxheSIsICJhdXRvcGxheSIsIGF1dG9wbGF5KCkpCiAgICAgIAogICAgICBmdW5jdGlvbiBmcm9tSGV4U3RyaW5nKHN0cil7CiAgICAgICAgbGV0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHN0ci5sZW5ndGggLyAyKQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmZmVyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBidWZmZXJbaV0gPSBwYXJzZUludChzdHIuc3Vic3RyKDIgKiBpLCAyKSwgMTYpCiAgICAgICAgfQogICAgICAgIHJldHVybiBidWZmZXIKICAgICAgfQogIAogICAgICBmdW5jdGlvbiByZWxheXMoKXsKICAgICAgICBjb25zdCBvYmogPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJyZWxheXMiKSkKICAgICAgICBjb25zdCByID0gb2JqICYmIG9iai5maWx0ZXIociA9PiByLm1hdGNoKC93c3M6XC9cLy4rLykpIHx8IFtdCiAgICAgICAgCiAgICAgICAgcmV0dXJuIHIubGVuZ3RoID4gMCAmJiByIHx8IFsKICAgICAgICAgICJ3c3M6Ly9yZWxheS5ub3N0ci5iYW5kIiwKICAgICAgICAgICJ3c3M6Ly9uYi5yZWxheS5jZW50ZXIiLCAKICAgICAgICAgICJ3c3M6Ly9ub3N0ci5jb21waWxlLWVycm9yLm5ldCIKICAgICAgICBdCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHByaXZrZXkoKXsKICAgICAgICBsZXQga2V5ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oInByaXZrZXkiKSB8fCAiIgogICAgICAgIAogICAgICAgIGlmKGtleS5sZW5ndGggPT0gNjMpewogICAgICAgICAga2V5ID0gTm9zdHJUb29scy5uaXAxOS5kZWNvZGUoa2V5KS5kYXRhCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiBrZXkubGVuZ3RoID09IDY0ICYmIGtleSB8fCBudWxsCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNldHRpbmcoa2V5LCBkZWZhdWx0dmFsdWUpewogICAgICAgIGNvbnN0IHYgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpCiAgICAgICAgcmV0dXJuIHYgJiYgb3B0aW9uKCJzZXQiICsga2V5LCBrZXksIHYpICYmIHYgfHwgZGVmYXVsdHZhbHVlCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIG9wdGlvbihjLCBrZXksIHZhbCl7CiAgICAgICAgcmV0dXJuIHFzKCIuIiArIGMgKyAiW2RhdGEtIiArIGtleSArICI9JyIgKyB2YWwgKyAiJ10iKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxcyhxKXsKICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihxKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxc2EocSl7CiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChxKSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gZ2lkKGkpewogICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxdWVyeXR5cGUoKXsKICAgICAgICByZXR1cm4gcXMoIiNxdWVyeS10eXBlIikudmFsdWUgfHwgImFsbCIKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlcXVlcnkoKXsKICAgICAgICBsZXQgcGFydHMgPSBkZWNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaGFzaC5zdWJzdHJpbmcoMSkpLnNwbGl0KCIvIikKICAgICAgICBxdWVyeXN0ciA9IHFzKCIjcXVlcnlkaXNwbGF5IC50ZXh0IikuaW5uZXJUZXh0ID0gcGFydHNbMF0KICAgICAgICBxcygiI3F1ZXJ5IikudmFsdWUgPSBwYXJ0c1swXQogICAgICAgIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlID0gcGFydHNbMV0gfHwgImFsbCIKICAgICAgfQoKICAgICAgZnVuY3Rpb24gYWN0aXZlKCl7CiAgICAgICAgcmV0dXJuIHFzKCIjcGljcyAuYWN0aXZlIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcGljb2Zmc2V0KG9mZnNldCl7CiAgICAgICAgY29uc3QgcGljcyA9IHFzYSgiI3BpY3MgPiAuaXRlbSIpLmZpbHRlcihlID0+IGUuc3R5bGUuZGlzcGxheSA9PSAiYmxvY2siKQogICAgICAgIHJldHVybiBwaWNzW3BpY3MuaW5kZXhPZihhY3RpdmUoKSkrb2Zmc2V0XQogICAgICB9CgogICAgICBmdW5jdGlvbiBsYXN0YWN0aXZlKCl7CiAgICAgICAgcmV0dXJuIHFzYSgiI3BpY3MgLmFjdGl2ZSIpLnBvcCgpICAgICAgCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIG1lbnUoKXsKICAgICAgICBxc2EoIiNtZW51LWNvbnRlbnQsICNtZW51LW92ZXJsYXkiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QudG9nZ2xlKCJvcGVuIikpCiAgICAgIH0KICAKICAgICAgZnVuY3Rpb24gc2V0YWN0aXZlKGMsIGtleSwgdmFsKXsKICAgICAgICBxc2EoIi4iICsgYykuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikpCiAgICAgICAgY29uc3Qgb3B0aW9uID0gcXMoIi4iICsgYyArICJbZGF0YS0iICsga2V5ICsgIj0nIiArIHZhbCArICInXSIpCiAgICAgICAgb3B0aW9uPy5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzY3JvbGx2aXNpYmxlKG4pewogICAgICAgIHJldHVybiAobi5vZmZzZXRUb3AgKyBuLm9mZnNldEhlaWdodCkgPj0gc2Nyb2xsWSAKICAgICAgICAgICYmIG4ub2Zmc2V0VG9wIDw9IChzY3JvbGxZICsgdmlzdWFsVmlld3BvcnQuaGVpZ2h0KQogICAgICB9CgogICAgICBhc3luYyBmdW5jdGlvbiB1cGRhdGVpbWFnZXNsb2FkKCl7CiAgICAgICAgcXNhKCIjcGljcyAuaXRlbSBpbWcuZGF0YSIpLmZvckVhY2goYXN5bmMgaW1nID0+IHsKICAgICAgICAgIGxldCBuID0gaW1nLnBhcmVudEVsZW1lbnQKICAgICAgICAgIAogICAgICAgICAgaWYoc2Nyb2xsdmlzaWJsZShuKSl7CiAgICAgICAgICAgIGltZy5zcmMgPSBpbWdbImRhdGEtc3JjIl0KICAgICAgICAgICAgaW1nLmNsYXNzTGlzdC5yZW1vdmUoImRhdGEiKQogICAgICAgICAgfQogICAgICAgIH0pCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZWFsbHZpZGVvcGxheSgpewogICAgICAgIHFzYSgiI3BpY3MgLml0ZW0udmlkZW8iKS5mb3JFYWNoKGFzeW5jIG4gPT4gdXBkYXRldmlkZW9wbGF5KG4pKQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiB1cGRhdGV2aWRlb3BsYXkobil7CiAgICAgICAgY29uc3QgYXBsYXkgPSBhdXRvcGxheSgpCiAgICAgICAgY29uc3QgdiA9IG4ucXVlcnlTZWxlY3RvcigidmlkZW8iKQogICAgICAgIAogICAgICAgIGlmKGFwbGF5ICE9ICJvbiIpewogICAgICAgICAgdi5tdXRlZCA9IGZhbHNlCiAgICAgICAgICB2LnBhdXNlKCkKICAgICAgICB9ZWxzZXsKICAgICAgICAgIHYubXV0ZWQgPSB0cnVlCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKCFzY3JvbGx2aXNpYmxlKG4pKXsKICAgICAgICAgIGlmKHYucmVhZHlTdGF0ZSA9PSA0KXsKICAgICAgICAgICAgdi5wYXVzZSgpCiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgdi5wcmVsb2FkID0gIm5vbmUiCiAgICAgICAgICB9CiAgICAgICAgfWVsc2UgaWYodi5yZWFkeVN0YXRlICE9IDQpewogICAgICAgICAgdi5wcmVsb2FkID0gImF1dG8iCiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoYXBsYXkgPT0gIm9uIiB8fCAoYXBsYXkgPT0gImhvdmVyIiAmJiB2ID09IGhvdmVyZWR2aWRlbykpewogICAgICAgICAgdi5wbGF5KCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsIGUgPT4gewogICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCkKICAgICAgICB1cGRhdGVpbWFnZXNsb2FkKCkKICAgICAgICB1cGRhdGVhbGx2aWRlb3BsYXkoKQogICAgICB9KQogICAgICAKICAgICAgbGV0IHRvdWNoID0gbnVsbAogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsIGUgPT4gdG91Y2ggPSBlLmNoYW5nZWRUb3VjaGVzWzBdKQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLCBlID0+IHsKICAgICAgICBjb25zdCB4ZGlmZiA9IGUuY2hhbmdlZFRvdWNoZXNbMF0uc2NyZWVuWCAtIHRvdWNoLnNjcmVlblgKCiAgICAgICAgaWYoeGRpZmYgPCAtNTApewogICAgICAgICAgc3dpcGUoMSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoeGRpZmYgPiA1MCl7CiAgICAgICAgICBzd2lwZSgtMSkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBxcygiI3F1ZXJ5LWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBsb2NhdGlvbi5oYXNoID0gIiMiICsgZW5jb2RlVVJJQ29tcG9uZW50KHFzKCIjcXVlcnkiKS52YWx1ZSArICIvIiArIHF1ZXJ5dHlwZSgpKQogICAgICAgIHVwZGF0ZXF1ZXJ5KCkKICAgICAgICBxdWVyeXdhaXQucmVzb2x2ZSgpCiAgICAgIH0pCgogICAgICBxcygiI3JlbGF5cy1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgYXN5bmMgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgbGV0IHIgPSBKU09OLnN0cmluZ2lmeShxcygiI3JlbGF5cyIpLnZhbHVlLnNwbGl0KCJcbiIpKQogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJyZWxheXMiLCByKQogICAgICAgIGRpc2Nvbm5lY3QoKQogICAgICB9KQoKICAgICAgcXMoIiNwcml2a2V5LWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBhc3luYyBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBjb25zdCBrZXkgPSBxcygiI3ByaXZrZXkiKS52YWx1ZQoKICAgICAgICBpZihrZXkubGVuZ3RoICE9IDY0ICYmIGtleS5sZW5ndGggIT0gNjMpewogICAgICAgICAgYWxlcnQoImtleSBzaG91bGQgYmUgNjMgb3IgNjQgY2hhcmFjdGVycyBsb25nIikKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgicHJpdmtleSIsIGtleSkKICAgICAgICBhbGVydCgia2V5IHNhdmVkIikKICAgICAgfSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaWYoYXV0b3BsYXkoKSA9PSAiaG92ZXIiICYmIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygidmlkZW8tY29udGFpbmVyIikpewogICAgICAgICAgaG92ZXJlZHZpZGVvID0gZS50YXJnZXQucXVlcnlTZWxlY3RvcigidmlkZW8iKQogICAgICAgICAgaG92ZXJlZHZpZGVvLnBsYXkoKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IiwgYXN5bmMgKGUpID0+IHsKICAgICAgICBob3ZlcmVkdmlkZW8gPSBmYWxzZQogICAgICAgIGlmKHFzKCIjbWVkaWEtY29udGFpbmVyIikuc3R5bGUuZGlzcGxheSAhPSAiYmxvY2siICYmIGF1dG9wbGF5KCkgPT0gImhvdmVyIiAmJiBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInZpZGVvLWNvbnRhaW5lciIpKXsKICAgICAgICAgIHFzYSgidmlkZW8iKS5mb3JFYWNoKHYgPT4gdi5wYXVzZSgpKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgYXN5bmMgKGUpID0+IHsKICAgICAgICBpZihlLnRhcmdldC50eXBlID09ICJzdWJtaXQiIHx8IChlLnRhcmdldC50YWdOYW1lID09ICJBIiAmJiBlLnRhcmdldC5ocmVmLm1hdGNoKC9eKHx3ZWJcKylub3N0clw6LykpKXsKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJ0aXRsZSIpewogICAgICAgICAgcXMoIiNxdWVyeSIpLnZhbHVlID0gIiIKICAgICAgICAgIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlID0gImFsbCIKICAgICAgICAgIHFzKCIjZ28iKS5jbGljaygpCiAgICAgICAgfQoKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gImZpbHRlci1saWtlcyIpewogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCJmaWx0ZXItbGlrZXMiKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2hvdyIpKXsKICAgICAgICAgIGFjdGl2ZSgpPy5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgZ2lkKGUudGFyZ2V0LmlkKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgc2hvdyhlLnRhcmdldC5pZCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC50YWdOYW1lICE9ICJBIiAmJiAocXMoIiNwaWMtY29udGFpbmVyIikgPT0gZS50YXJnZXQgfHwgcXMoIiNtZWRpYS1jb250YWluZXIgdmlkZW8iKSA9PSBlLnRhcmdldCkpewogICAgICAgICAgaGlkZW1lZGlhKCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gIm1lbnUiIHx8IGUudGFyZ2V0LmlkID09ICJtZW51LW92ZXJsYXkiKXsKICAgICAgICAgIG1lbnUoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNldGNvbHMiKSl7CiAgICAgICAgICBmb3IobGV0IGMgb2YgY29sb3B0cyl7CiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgiY29scyIgKyBjKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgZS50YXJnZXQuZGF0YXNldC5jb2xzKQogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImNvbHMiLCBlLnRhcmdldC5kYXRhc2V0LmNvbHMpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGNvbHMiLCAiY29scyIsIGNvbHMoKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNldGF1dG9wbGF5IikpewogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImF1dG9wbGF5IiwgZS50YXJnZXQuZGF0YXNldC5hdXRvcGxheSkKICAgICAgICAgIHNldGFjdGl2ZSgic2V0YXV0b3BsYXkiLCAiYXV0b3BsYXkiLCBhdXRvcGxheSgpKQogICAgICAgICAgdXBkYXRlYWxsdmlkZW9wbGF5KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoImxpa2UiKSAmJiBsaWtlKGUudGFyZ2V0KQogICAgICB9KQogICAgICAKICAgICAgZnVuY3Rpb24gaGFza2V5KCl7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5ub3N0ciB8fCBwcml2a2V5KCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcHVia2V5KCl7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5ub3N0ciAmJiBhd2FpdCB3aW5kb3cubm9zdHIuZ2V0UHVibGljS2V5KCkgfHwgTm9zdHJUb29scy5nZXRQdWJsaWNLZXkocHJpdmtleSgpKQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBzaWduKGV2ZW50KXsKICAgICAgICBpZih3aW5kb3cubm9zdHIpewogICAgICAgICAgcmV0dXJuIGF3YWl0IG5vc3RyLnNpZ25FdmVudChldmVudCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZXZlbnQuc2lnID0gTm9zdHJUb29scy5nZXRTaWduYXR1cmUoZXZlbnQsIHByaXZrZXkoKSkKICAgICAgICByZXR1cm4gZXZlbnQKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gbGlrZShsaW5rKXsKICAgICAgICBjb25zdCBldmVudCA9IGxpbmsucGFyZW50RWxlbWVudFsiZGF0YS1ldmVudCJdCiAgICAgICAgY29uc3QgcHViayA9IGF3YWl0IHB1YmtleSgpCiAgICAgICAgY29uc3QgbGlrZSA9IGF3YWl0IHNpZ24oewogICAgICAgICAgImtpbmQiOiA3LAogICAgICAgICAgImNvbnRlbnQiOiAiKyIsCiAgICAgICAgICAidGFncyI6IFsKICAgICAgICAgICAgWyJlIiwgZXZlbnQuaWRdLAogICAgICAgICAgICBbInAiLCBldmVudC5wdWJrZXldCiAgICAgICAgICBdLAogICAgICAgICAgInB1YmtleSI6IHB1YmssCiAgICAgICAgICAiY3JlYXRlZF9hdCI6IHBhcnNlSW50KERhdGUubm93KCkgLyAxMDAwICwgMTApCiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBzb2NrZXRzLmZvckVhY2gocyA9PiBzLnNlbmQoSlNPTi5zdHJpbmdpZnkoWyJFVkVOVCIsIGxpa2VdKSkpCiAgICAgICAgbGluay5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKCiAgICAgICAgY29uc3QgcGljaWQgPSBsaW5rWyJkYXRhLWl0ZW0taWQiXSB8fCBsaW5rLmRhdGFzZXQucGljSWQKICAgICAgICAKICAgICAgICBpZihwaWNpZCl7CiAgICAgICAgICBnaWQocGljaWQpLnF1ZXJ5U2VsZWN0b3IoIi5saWtlIikuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgfQogICAgICB9CiAgICAKICAgICAgZnVuY3Rpb24gc3dpcGUob2Zmc2V0KXsKICAgICAgICBpZihwaWNvZmZzZXQob2Zmc2V0KSl7CiAgICAgICAgICBwaWNvZmZzZXQob2Zmc2V0KS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgdGhpc1tvZmZzZXQgPT0gMSAmJiAibGFzdGFjdGl2ZSIgfHwgImFjdGl2ZSJdKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIHVwZGF0ZXNob3coKQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlc2hvdygpewogICAgICAgIGlmKHFzKCIjbWVkaWEtY29udGFpbmVyIikuc3R5bGUuZGlzcGxheSA9PSAiYmxvY2siKXsKICAgICAgICAgIGhpZGV2aWRlbygpCiAgICAgICAgICBzaG93KGFjdGl2ZSgpLmlkKQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIGUgPT4gewogICAgICAgIGlmKFsiVGFiIiwgIkFycm93TGVmdCIsICJBcnJvd1JpZ2h0IiwgIkFycm93VXAiLCAiQXJyb3dEb3duIl0uaW5jbHVkZXMoZS5rZXkpKXsKICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkVzY2FwZSIpewogICAgICAgICAgbWVudSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS5rZXkgPT0gIkVudGVyIiAmJiBlLnRhcmdldC50YWdOYW1lID09ICJCT0RZIil7CiAgICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLnN0eWxlLmRpc3BsYXkgPT0gImJsb2NrIil7CiAgICAgICAgICAgIGhpZGVtZWRpYSgpCiAgICAgICAgICAgIHJldHVybgogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBzaG93KGFjdGl2ZSgpLmlkKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dVcCIgJiYgcGljb2Zmc2V0KC1jb2xzKCkpKXsKICAgICAgICAgIHBpY29mZnNldCgtY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgbGFzdGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICB1cGRhdGVzaG93KCkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd0Rvd24iICYmIHBpY29mZnNldChjb2xzKCkpKXsKICAgICAgICAgIHBpY29mZnNldChjb2xzKCkpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgdXBkYXRlc2hvdygpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dMZWZ0Iil7CiAgICAgICAgICBzd2lwZSgtMSkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd1JpZ2h0Iil7CiAgICAgICAgICBzd2lwZSgxKQogICAgICAgIH0KICAgICAgfSkKCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZXF1ZXJ5cmVzKHJlcywgc29ja2V0LCBxLCB0eXBlLCBzdGltZSl7CiAgICAgICAgc2F2ZShzb2NrZXQsIHJlcywgcSwgdHlwZSwgZmFsc2UsIGZhbHNlLCB0cnVlKQogICAgICAgIGxvZygicXVlcnkgcmVzIiwgcmVzLmxlbmd0aCwgc29ja2V0LnVybCkKICAgICAgICBxdWVyeWNvdW50LS0KICAgICAgICBpZihxdWVyeWNvdW50ID09IDApewogICAgICAgICAgcXMoIiNsb2FkaW5nIikuc3R5bGUuZGlzcGxheSA9ICJub25lIgogICAgICAgIH0KICAgICAgICAKICAgICAgICBsZXQgd2FpdCA9IHdhaXRtcyAtIChEYXRlLm5vdygpIC0gc3RpbWUpCiAgICAgICAgcXVlcnl3YWl0ID0gc2xlZXAod2FpdCkKICAgICAgICBhd2FpdCBxdWVyeXdhaXQucHJvbWlzZQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBwcmltYWxnbG9iYWwoc29ja2V0KXsKICAgICAgICBsb2coImdsb2JhbCIsIHNvY2tldC51cmwpCiAgICAgICAgcXVlcnljb3VudCsrCiAgICAgICAgcXMoIiNsb2FkaW5nIikuc3R5bGUuZGlzcGxheSA9ICJibG9jayIKICAgICAgICBsZXQgc3RpbWUgPSBEYXRlLm5vdygpCiAgICAgICAgbGV0IHFpZCA9ICJnbG9iYWxfIiArICgrK2lkY291bnRlcikKICAgICAgICBsZXQgcWlkbGlrZXMgPSAibGlrZXNfIiArICgrK2lkY291bnRlcikKCiAgICAgICAgaWYobmV3bGlrZXMubGVuZ3RoID4gMCl7CiAgICAgICAgICBwcmltYWxzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAgICJSRVEiLCAKICAgICAgICAgICAgcWlkbGlrZXMsIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgImNhY2hlIjogWwogICAgICAgICAgICAgICAgImV2ZW50cyIsIHsKICAgICAgICAgICAgICAgICAgImV2ZW50X2lkcyI6IG5ld2xpa2VzCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgICBdKSkKCiAgICAgICAgICBjb25zdCBsaWtlX2V2ZW50cyA9IGF3YWl0IHdhaXRyZXMocWlkbGlrZXMpCiAgICAgICAgICBuZXdsaWtlcy5zcGxpY2UoMCkKICAgICAgICAgIAogICAgICAgICAgYXdhaXQgc2F2ZShzb2NrZXQsIGxpa2VfZXZlbnRzLCAiIiwgImFsbCIsIHRydWUsIHRydWUsIGZhbHNlKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAiUkVRIiwgCiAgICAgICAgICBxaWQsIAogICAgICAgICAgewogICAgICAgICAgICAiY2FjaGUiOiBbCiAgICAgICAgICAgICAgImV4cGxvcmUiLCAKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidGltZWZyYW1lIjogImxhdGVzdCIsCiAgICAgICAgICAgICAgICAic2NvcGUiOiAiZ2xvYmFsIiwKICAgICAgICAgICAgICAgICJsaW1pdCI6IDIwCiAgICAgICAgICAgICAgfQogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSkpCiAgICAgICAgCiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgd2FpdHJlcyhxaWQpCiAgICAgICAgYXdhaXQgaGFuZGxlcXVlcnlyZXMocmVzLmZpbHRlcihlID0+IGUua2luZCA9PSAxKSwgc29ja2V0LCAiIiwgImFsbCIsIHN0aW1lKQogICAgICAgIHByaW1hbGdsb2JhbChzb2NrZXQpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5KHNvY2tldCwgcHJpbWFsKXsKICAgICAgICBsb2coInF1ZXJ5Iiwgc29ja2V0LnVybCkKICAgICAgICBxdWVyeWNvdW50KysKICAgICAgICBxcygiI2xvYWRpbmciKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgIAogICAgICAgIGxldCBzdGltZSA9IERhdGUubm93KCkKICAgICAgICBsZXQgcSA9IHF1ZXJ5c3RyLnRyaW0oKQogICAgICAgIGxldCB0eXBlID0gcXVlcnl0eXBlKCkKICAgICAgICBsZXQgaSA9ICsraWRjb3VudGVyCiAgICAgICAgbGV0IHFpZCA9ICJxdWVyeV8iICsgaQogICAgICAgIGxldCBmaWx0ZXJzID0gW10KCiAgICAgICAgZmlsdGVycy5wdXNoKC4uLih0eXBlc1t0eXBlXSB8fCBbXSkubWFwKCh0KSA9PiB7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBraW5kczogWzFdLCAKICAgICAgICAgICAgc2VhcmNoOiAiLiIgKyB0LAogICAgICAgICAgICBsaW1pdDogMjAKICAgICAgICAgIH0KICAgICAgICB9KSkKICAgICAgICAKICAgICAgICBpZihxLmxlbmd0aCA+IDApewogICAgICAgICAgZmlsdGVycy5wdXNoKHtraW5kczogWzFdLCBzZWFyY2g6IHF9KQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihmaWx0ZXJzLmxlbmd0aCA9PSAwKXsKICAgICAgICAgIGZpbHRlcnMucHVzaCh7a2luZHM6IFsxXX0pCiAgICAgICAgfQogICAgICAgIAogICAgICAgIAogICAgICAgIGNvbnN0IGxpa2VzcmVzID0gYXdhaXQgcXVlcnlsaWtlcyhzb2NrZXQpCiAgICAgICAgCiAgICAgICAgbGlrZXNyZXMuZm9yRWFjaChldmVudGlkID0+IHsKICAgICAgICAgIGlmKCFsaWtlcy5pbmNsdWRlcyhldmVudGlkKSl7CiAgICAgICAgICAgIGxpa2VzLnB1c2goZXZlbnRpZCkKICAgICAgICAgICAgbmV3bGlrZXMucHVzaChldmVudGlkKQogICAgICAgICAgfQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgY29uc3Qgc2VhcmNob2JqID0gWyJSRVEiLCBxaWQsIC4uLmZpbHRlcnNdCiAgICAgICAgY29uc3Qgc2VhcmNoanNvbiA9IEpTT04uc3RyaW5naWZ5KHNlYXJjaG9iaikKICAgICAgICBzb2NrZXQuc2VuZChzZWFyY2hqc29uKQogICAgICAgIAogICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHdhaXRyZXMocWlkKQogICAgICAgIGF3YWl0IGhhbmRsZXF1ZXJ5cmVzKHJlcywgc29ja2V0LCBxLCB0eXBlLCBzdGltZSkKICAgICAgICBxdWVyeShzb2NrZXQpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5bGlrZXMoc29ja2V0KXsKICAgICAgICBpZighaGFza2V5KCkpewogICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IG15cHVia2V5ID0gYXdhaXQgcHVia2V5KCkKICAgICAgICBjb25zdCBldmVudHMgPSBhd2FpdCBxdWVyeWV2ZW50cyhzb2NrZXQsIFs3XSwgbnVsbCwgW215cHVia2V5XSkKICAgICAgICByZXR1cm4gZXZlbnRzLm1hcChlID0+IGUudGFncy5maW5kKHQgPT4gdFswXSA9PSAiZSIpWzFdKQogICAgICB9CgogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeWV2ZW50cyhzb2NrZXQsIGtpbmRzLCBldmVudGlkcywgYXV0aG9ycyl7CiAgICAgICAgY29uc3QgcXVlcnlpZCA9ICJldmVudHNfIiArICgrK2lkY291bnRlcikKICAgICAgICBjb25zdCBmaWx0ZXJzID0ge30KICAgICAgICAKICAgICAgICBmaWx0ZXJzLmtpbmRzID0ga2luZHMKICAgICAgICAKICAgICAgICBpZihldmVudGlkcyl7CiAgICAgICAgICBmaWx0ZXJzWyIjZSJdID0gZXZlbnRpZHMKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoYXV0aG9ycyl7CiAgICAgICAgICBmaWx0ZXJzWyJhdXRob3JzIl0gPSBhdXRob3JzCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAiUkVRIiwgCiAgICAgICAgICBxdWVyeWlkLCAKICAgICAgICAgIGZpbHRlcnMKICAgICAgICBdKQoKICAgICAgICBzb2NrZXQuc2VuZChqc29uKQogICAgICAgIAogICAgICAgIHJldHVybiBhd2FpdCB3YWl0cmVzKHF1ZXJ5aWQpIHx8IFtdCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5cHVia2V5KHNvY2tldCwgcHViayl7CiAgICAgICAgY29uc3QgcXVlcnlpZCA9ICJxdWVyeV8iICsgKCsraWRjb3VudGVyKQogICAgICAgIHNvY2tldC5zZW5kKHF1ZXJpZXMuYXV0aG9yLnJlcGxhY2UoIjxJPiIsIHF1ZXJ5aWQpLnJlcGxhY2UoIjxQPiIsIHB1YmspKQoKICAgICAgICByZXR1cm4gKGF3YWl0IHdhaXRyZXMocXVlcnlpZCkpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHNhdmUoc29ja2V0LCBldmVudGRiLCBxLCBxdHlwZSwgcmVhY3RlZCwgYXBwZW5kLCBxdWVyeW1ldGEpewogICAgICAgIGxldCBldmVudHB1YmtleXMgPSBbXQogICAgICAgIGNvbnN0IGV2ZW50cyA9IGV2ZW50ZGIuZmlsdGVyKG8gPT4gewogICAgICAgICAgaWYocS5sZW5ndGggPiAwKXsKICAgICAgICAgICAgZm9yKGxldCB3b3JkIG9mIHEuc3BsaXQoIiAiKSl7CiAgICAgICAgICAgICAgaWYoby5jb250ZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZih3b3JkLnRvTG93ZXJDYXNlKCkpID09IC0xKXsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIHJldHVybiB0cnVlCiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBsZXQgcmVzdWx0cyA9IFtdCiAgICAgICAgY29uc3QgZXZlbnRpZHMgPSBldmVudHMubWFwKGUgPT4gZS5pZCkKICAgICAgICBsZXQgbmV3dXJscyA9IFtdCiAgICAgICAgCiAgICAgICAgZm9yKGxldCBldmVudCBvZiBldmVudHMpewogICAgICAgICAgbGV0IHVybHNtYXRjaCA9IFtdCiAgICAgICAgICAKICAgICAgICAgIGlmKHF0eXBlICE9ICJ2aWRlbyIpewogICAgICAgICAgICB1cmxzbWF0Y2gucHVzaCguLi4oZXZlbnQuY29udGVudC5tYXRjaChpbWdyZWdleCkgfHwgW10pKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBpZihxdHlwZSAhPSAiaW1hZ2UiKXsKICAgICAgICAgICAgdXJsc21hdGNoLnB1c2goLi4uKGV2ZW50LmNvbnRlbnQubWF0Y2godmlkZW9yZWdleCkgfHwgW10pKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICB1cmxzbWF0Y2ggPSB1cmxzbWF0Y2guZmlsdGVyKHVybCA9PiAhdXJscy5pbmNsdWRlcyh1cmwpKQoKICAgICAgICAgIGlmKHVybHNtYXRjaC5sZW5ndGggPiAwKXsKICAgICAgICAgICAgbmV3dXJscy5wdXNoKHsKICAgICAgICAgICAgICBldmVudDogZXZlbnQsCiAgICAgICAgICAgICAgdXJsczogdXJsc21hdGNoCiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIAogICAgICAgICAgICB1cmxzLnB1c2goLi4udXJsc21hdGNoKQogICAgICAgICAgICBldmVudHB1YmtleXMuaW5jbHVkZXMoZXZlbnQucHVia2V5KSB8fCBldmVudHB1YmtleXMucHVzaChldmVudC5wdWJrZXkpCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxvZygicXVlcnkgbWV0YSIsIHNvY2tldC51cmwpCiAgICAgICAgbGV0IG1ldGFldmVudHMgPSAocXVlcnltZXRhICYmIGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzBdLCBudWxsLCBldmVudHB1YmtleXMpIHx8IFtdKQogICAgICAgIAogICAgICAgIGZvcihsZXQgZW50cnkgb2YgbmV3dXJscyl7CiAgICAgICAgICBmb3IobGV0IHVybCBvZiBlbnRyeS51cmxzKXsKICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHsKICAgICAgICAgICAgICByZWFjdGVkOiByZWFjdGVkIHx8IGxpa2VzLmluY2x1ZGVzKGVudHJ5LmV2ZW50LmlkKSwgCiAgICAgICAgICAgICAgdXJsOiB1cmwsIAogICAgICAgICAgICAgIGV2ZW50OiBlbnRyeS5ldmVudCwgCiAgICAgICAgICAgICAgYmVjaDMyaWQ6IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKGVudHJ5LmV2ZW50LmlkKSksCiAgICAgICAgICAgICAgbWV0YTogbWV0YWV2ZW50cy5maW5kKG8gPT4gby5wdWJrZXkgPT0gZW50cnkuZXZlbnQucHVia2V5KQogICAgICAgICAgICB9KQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBsb2coInNhdmUgcmVzIiwgcmVzdWx0cy5sZW5ndGgsIHNvY2tldC51cmwpCiAgICAgICAgdXBkYXRlY29udGVudChyZXN1bHRzLCBxLCBhcHBlbmQpCiAgICAgIH0KICAgICAgCiAgICAgIGxldCBsb2FkZWQgPSAwCiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVjb250ZW50KHJlc3VsdHMsIHEsIGFwcGVuZCl7CiAgICAgICAgcmVzdWx0cy5yZXZlcnNlKCkuZm9yRWFjaChpdGVtID0+IHsKICAgICAgICAgIGNvbnN0IHR5cGUgPSBpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KSAmJiAidmlkZW8iIHx8ICJwaWMiCiAgICAgICAgICBjb25zdCB0ZXh0ID0gKHEgfHwgInZpZXcgbm90ZSIpLnN1YnN0cmluZygtMzApCiAgICAgICAgICBjb25zdCBpZCA9ICJpdGVtXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgICBjb25zdCBjb250ZW50ZWxlbWVudHMgPSAnPGRpdiBjbGFzcz0idHlwZSI+JyArIHR5cGUgKyAnPC9kaXY+PGEgY2xhc3M9Imxpa2UnICsgKGl0ZW0ucmVhY3RlZCA/ICcgcmVhY3RlZCcgOiAnJykgKyAnIiBkYXRhLWl0ZW0taWQ9IicgKyBpZCArIAogICAgICAgICAgICAnIiBocmVmPSIjIj4nICsgcXMoIiN0ZW1wbGF0ZSAuaGVhcnRzdmciKS5vdXRlckhUTUwgKyAnPC9hPjxhIGNsYXNzPSJxdWVyeSIgaHJlZj0iJyArIHByb3RvY29sICsgCiAgICAgICAgICAgIGl0ZW0uYmVjaDMyaWQgKyAnIj4nICsgdGV4dCArICc8L2E+JwogICAgICAgICAgbGV0IHJvb3QgPSBudWxsCiAgICAgICAgICBsZXQgdiA9IG51bGwKICAgICAgICAgIAogICAgICAgICAgaWYoaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleCkpewogICAgICAgICAgICByb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikKICAgICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJ2aWRlby1jb250YWluZXIiKQogICAgICAgICAgICByb290LmlubmVySFRNTCA9IGNvbnRlbnRlbGVtZW50cwogICAgICAgICAgICAKICAgICAgICAgICAgdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIikKICAgICAgICAgICAgdlsiZGF0YS1pdGVtLWlkIl0gPSBpZAogICAgICAgICAgICB2LnByZWxvYWQgPSAibm9uZSIKICAgICAgICAgICAgdi5sb29wID0gdHJ1ZQogICAgICAgICAgICB2LnBsYXlzaW5saW5lID0gIiIKICAgICAgICAgICAgCiAgICAgICAgICAgIHYub25jYW5wbGF5ID0gYXN5bmMgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgY29uc3QgYXNwZWN0ID0gdGhpcy52aWRlb1dpZHRoIC8gdGhpcy52aWRlb0hlaWdodAogICAgICAgICAgICAgIGlmKGFzcGVjdCA+IDEpewogICAgICAgICAgICAgICAgdGhpcy5zdHlsZS53aWR0aCA9IChhc3BlY3QgKiAxMDApICsgIiUiCiAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLmhlaWdodCA9ICgxIC8gYXNwZWN0ICogMTAwKSArICIlIgogICAgICAgICAgICAgICAgdGhpcy5zdHlsZS5tYXJnaW5Ub3AgPSAtKCgxIC8gYXNwZWN0ICogMTAwIC0gMTAwKSAvIDIpICsgIiUiCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIAogICAgICAgICAgICAgIHVwZGF0ZXZpZGVvcGxheSh0aGlzLnBhcmVudEVsZW1lbnQpCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnN0IGV4dCA9IGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpWzFdCiAgICAgICAgICAgIHYuaW5uZXJIVE1MID0gJzxzb3VyY2Ugc3JjPSInICsgaXRlbS51cmwgKyAnIiB0eXBlPSJ2aWRlby8nICsgZXh0ICsgJyI+PC9zb3VyY2U+JwogICAgICAgICAgICAKICAgICAgICAgICAgcm9vdC5hcHBlbmQodikKICAgICAgICAgIH1lbHNlIGlmKGl0ZW0udXJsLm1hdGNoKGltZ2V4dHJlZ2V4KSl7CiAgICAgICAgICAgIHJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIikKICAgICAgICAgICAgcm9vdC5ocmVmID0gIiMiCiAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MID0gY29udGVudGVsZW1lbnRzCiAgICAgICAgICAgICAgCiAgICAgICAgICAgIGlmKHR5cGUgPT0gInBpYyIpewogICAgICAgICAgICAgIGxldCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKQogICAgICAgICAgICAgIGltZy5hbHQgPSBpdGVtLnVybAogICAgICAgICAgICAgIGltZ1siZGF0YS1zcmMiXSA9IGl0ZW0udXJsCiAgICAgICAgICAgICAgaW1nLmNsYXNzTGlzdC5hZGQoImRhdGEiKQogICAgICAgICAgICAgIHJvb3QuYXBwZW5kKGltZykKICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgcm9vdC5pbm5lckhUTUwgKz0gJzxzcGFuIGNsYXNzPSJmaWxlIj4nICsgaXRlbS51cmwgKyAnPC9zcGFuPicKICAgICAgICAgICAgfQogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIHJldHVybgogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICByb290LmlkID0gaWQKICAgICAgICAgIHJvb3Quc3R5bGUuZGlzcGxheSA9ICdibG9jaycKICAgICAgICAgIHJvb3RbImRhdGEtaXRlbSJdID0gaXRlbQogICAgICAgICAgcm9vdFsiZGF0YS1ldmVudCJdID0gaXRlbS5ldmVudAogICAgICAgICAgcm9vdFsiZGF0YS1xdWVyeSJdID0gcQogICAgICAgICAgcm9vdFsiZGF0YS10ZXh0Il0gPSB0ZXh0CiAgICAgICAgICAKICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCh0eXBlKQogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJpdGVtIikKICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgic2hvdyIpCiAgICAgICAgICAKICAgICAgICAgIGlmKGl0ZW0ucmVhY3RlZCl7CiAgICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHFzKCIjcGljcyIpW2FwcGVuZCAmJiAiYXBwZW5kIiB8fCAicHJlcGVuZCJdKHJvb3QpCiAgICAgICAgICAKICAgICAgICAgIGlmKHYpewogICAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkocm9vdCkKICAgICAgICAgIH0KICAgICAgICB9KQoKICAgICAgICB1cGRhdGVpbWFnZXNsb2FkKCkKICAgICAgICAKICAgICAgICBpZihhY3RpdmUoKSA9PSBudWxsKXsKICAgICAgICAgIHFzKCIjcGljcyAuaXRlbSIpPy5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGlkZW1lZGlhKCl7CiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICJzY3JvbGwiCiAgICAgICAgcXNhKCIjbWVkaWEtY29udGFpbmVyLCAjcGljLCAjbWVkaWEtZm9vdGVyIikuZm9yRWFjaChuID0+IG4uc3R5bGUuZGlzcGxheSA9ICJub25lIikKICAgICAgICBnaWQoInBpYy1saWtlIikuY2xhc3NMaXN0LnJlbW92ZSgicmVhY3RlZCIpCiAgICAgICAgaGlkZXZpZGVvKCkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGlkZXZpZGVvKCl7CiAgICAgICAgY29uc3QgdiA9IHFzKCIjbWVkaWEtY29udGFpbmVyIHZpZGVvIikKICAgICAgICAKICAgICAgICBpZih2KXsKICAgICAgICAgIHYubXV0ZWQgPSB0cnVlCiAgICAgICAgICBnaWQodlsiZGF0YS1pdGVtLWlkIl0pLmFwcGVuZENoaWxkKHYpCiAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkodi5wYXJlbnRFbGVtZW50KQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gd2FpdHJlcyhrZXkpewogICAgICAgIGxldCBldmVudHMgPSBbXQogICAgICAgIAogICAgICAgIGxldCByZXNoYW5kbGVyID0gZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXsKICAgICAgICAgIHRoaXMuaGFuZGxlID0gZnVuY3Rpb24ocmVzKXsKICAgICAgICAgICAgbGV0IG8gPSBKU09OLnBhcnNlKHJlcy5kYXRhKQogICAgICAgICAgICBpZihvWzFdID09IGtleSl7CiAgICAgICAgICAgICAgaWYob1swXSA9PSAiRU9TRSIpewogICAgICAgICAgICAgICAgcmVzb2x2ZShldmVudHMpCiAgICAgICAgICAgICAgICByZXNoYW5kbGVycy5zcGxpY2UocmVzaGFuZGxlcnMuaW5kZXhPZih0aGlzKSwgMSkKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgZXZlbnRzLnB1c2gob1syXSkKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAgIAogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICByZXNoYW5kbGVycy5wdXNoKG5ldyByZXNoYW5kbGVyKHJlc29sdmUsIHJlamVjdCkpCiAgICAgICAgfSkKICAgICAgfQogICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGNoZWNrdXBkYXRlKHNvY2tldCl7CiAgICAgICAgY29uc3QgdXBkYXRlc3JlcyA9IGF3YWl0IHF1ZXJ5cHVia2V5KHNvY2tldCwgdXBkYXRlc3B1YmtleSkKICAgICAgICBjb25zdCB1cGRhdGVub3RlID0gdXBkYXRlc3Jlcy5maW5kKG4gPT4gbi5jb250ZW50Lm1hdGNoKC9eaHR0cHNcOlwvXC8vKSkKICAgICAgICAKICAgICAgICBpZighdXBkYXRlbm90ZSl7CiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgYWdlID0gTWF0aC5yb3VuZCgoRGF0ZS5ub3coKSAvIDEwMDAgLSB1cGRhdGVub3RlLmNyZWF0ZWRfYXQpIC8gMzYwMCAvIDI0KQogICAgICAgIGNvbnN0IG5vdGVpZCA9IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKHVwZGF0ZW5vdGUuaWQpKQogICAgICAgIHFzKCIjcmVsZWFzZSIpLmhyZWYgPSBwcm90b2NvbCArIG5vdGVpZAogICAgICAgIHFzKCIjcmVsZWFzZSIpLmlubmVyVGV4dCA9IChhZ2UgPT0gMCAmJiAidG9kYXkiIHx8IGFnZSArICIgZGF5KHMpIGFnbyIpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNsZWVwKG1zKXsKICAgICAgICByZXR1cm4gbmV3IGZ1bmN0aW9uKCl7CiAgICAgICAgICBsZXQgdGltZW91dCA9IG51bGwKICAgICAgICAgIGxldCByID0gbnVsbAogICAgICAgICAgCiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBwcm9taXNlOiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewogICAgICAgICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoKSwgbXMpCiAgICAgICAgICAgICAgciA9IHJlc29sdmUKICAgICAgICAgICAgfSksCiAgICAgICAgICAgIHJlc29sdmU6IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpCiAgICAgICAgICAgICAgcigpCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNob3coaWQpewogICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIgogICAgICAgIGNvbnN0IGl0ZW0gPSBnaWQoaWQpWyJkYXRhLWl0ZW0iXQogICAgICAgIGNvbnN0IG1lZGlhID0gZ2lkKCJtZWRpYS1jb250YWluZXIiKQogICAgICAgIGNvbnN0IHBpYyA9IGdpZCgicGljIikKCiAgICAgICAgaWYoaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleCkpewogICAgICAgICAgcGljLnN0eWxlLmRpc3BsYXkgPSAibm9uZSIKICAgICAgICAgIGNvbnN0IHYgPSBnaWQoaWQpLnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAgIHFzKCIjbWVkaWEtY29udGFpbmVyIikuYXBwZW5kQ2hpbGQodikKICAgICAgICAgIHYubXV0ZWQgPSBmYWxzZQogICAgICAgICAgdi5wbGF5KCkKICAgICAgICB9ZWxzZXsKICAgICAgICAgIHBpYy5zcmMgPSBpdGVtLnVybAogICAgICAgICAgcGljLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGl0ZW0ubWV0YSl7CiAgICAgICAgICBjb25zdCBtZXRhY29udGVudCA9IEpTT04ucGFyc2UoaXRlbS5tZXRhLmNvbnRlbnQpCiAgICAgICAgICBjb25zdCBuYW1lID0gbWV0YWNvbnRlbnQuZGlzcGxheV9uYW1lIHx8IG1ldGFjb250ZW50Lm5hbWUKICAgICAgICAgIHFzKCIjcGljLXVzZXIiKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgICAgcXMoIiNwaWMtdXNlciIpLmhyZWYgPSBwcm90b2NvbCArIGJlY2gzMi5lbmNvZGUoIm5wdWIiLCBmcm9tSGV4U3RyaW5nKGl0ZW0ubWV0YS5wdWJrZXkpKQogICAgICAgICAgcXMoIiNwaWMtdXNlciIpLmlubmVyVGV4dCA9IG5hbWUKICAgICAgICB9ZWxzZXsKICAgICAgICAgIHFzKCIjcGljLXVzZXIiKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiCiAgICAgICAgfQoKICAgICAgICBnaWQoInBpYy1saWtlIilbImRhdGEtaXRlbS1pZCJdID0gaWQKICAgICAgICBnaWQoIm1lZGlhLWZvb3RlciIpWyJkYXRhLWV2ZW50Il0gPSBpdGVtLmV2ZW50CgogICAgICAgIGlmKGl0ZW0ucmVhY3RlZCl7CiAgICAgICAgICBnaWQoInBpYy1saWtlIikuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGEgPSBxcygiI3BpYy1xdWVyeSIpCiAgICAgICAgYS5ocmVmID0gcHJvdG9jb2wgKyBpdGVtLmJlY2gzMmlkCiAgICAgICAgYS5pbm5lclRleHQgPSBnaWQoaWQpWyJkYXRhLXRleHQiXQogICAgICAgICAgCiAgICAgICAgbWVkaWEuc3R5bGUuZGlzcGxheSA9IGdpZCgibWVkaWEtZm9vdGVyIikuc3R5bGUuZGlzcGxheSA9ICJibG9jayIKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gY29ubmNvdW50KCl7CiAgICAgICAgcmV0dXJuIHNvY2tldHMuZmlsdGVyKHIgPT4gci5yZWFkeVN0YXRlID09IDEpLmxlbmd0aAogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBkaXNjb25uZWN0KCl7CiAgICAgICAgZm9yKGxldCBzb2NrZXQgb2Ygc29ja2V0cyl7CiAgICAgICAgICBzb2NrZXQuY2xvc2UoKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXRzLnNwbGljZSgwKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBsb2cobXNnKXsKICAgICAgICBsZXQgc2Nyb2xsID0gcXMoIiNsb2dzIikuc2Nyb2xsVG9wID09IHFzKCIjbG9ncyIpLnNjcm9sbFRvcE1heAogICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCiAgICAgICAgZGl2LmlubmVyVGV4dCA9IEFycmF5LmZyb20oYXJndW1lbnRzKS5qb2luKCIgIikKICAgICAgICBxcygiI2xvZ3MiKS5hcHBlbmQoZGl2KQogICAgICAgIAogICAgICAgIHNjcm9sbCAmJiBxcygiI2xvZ3MiKS5zY3JvbGxUbygwLCBxcygiI2xvZ3MiKS5zY3JvbGxUb3BNYXgpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGNvbm5lY3QodXJsKXsKICAgICAgICBsb2coImNvbm5lY3RpbmciLCB1cmwpCiAgICAgICAgbGV0IHNvY2tldCA9IG5ldyBXZWJTb2NrZXQodXJsKQogICAgICAgIAogICAgICAgIHNvY2tldC5vbm1lc3NhZ2UgPSBtZXNzYWdlID0+IHJlc2hhbmRsZXJzLmZvckVhY2gocmggPT4gcmguaGFuZGxlKG1lc3NhZ2UpKQogICAgICAgIAogICAgICAgIHNvY2tldC5vbmNsb3NlID0gYXN5bmMgZnVuY3Rpb24oKXsKICAgICAgICAgIHNvY2tldHMuc3BsaWNlKHNvY2tldHMuaW5kZXhPZihzb2NrZXQpLCAxKQogICAgICAgICAgcXMoIiNjb25uY291bnQiKS5pbm5lclRleHQgPSBjb25uY291bnQoKSArIChwcmltYWxzb2NrZXQgJiYgMSkKICAgICAgICAgIGxvZygiZGlzY29ubmVjdGVkIiwgdGhpcy51cmwsIGNvbm5jb3VudCgpKQogICAgICAgICAgYXdhaXQgc2xlZXAoMTAwMCkucHJvbWlzZQogICAgICAgICAgY29ubmVjdCh0aGlzLnVybCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc29ja2V0Lm9ub3BlbiA9IGZ1bmN0aW9uKCl7CiAgICAgICAgICBxcygiI2Nvbm5jb3VudCIpLmlubmVyVGV4dCA9IGNvbm5jb3VudCgpICsgKHByaW1hbHNvY2tldCAmJiAxKQogICAgICAgICAgbG9nKCJjb25uZWN0ZWQiLCB0aGlzLnVybCwgY29ubmNvdW50KCkpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiBzb2NrZXQKICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIGFzeW5jICgpID0+IHsKICAgICAgICBwcmltYWxzb2NrZXQgPSBjb25uZWN0KCJ3c3M6Ly9jYWNoZTMucHJpbWFsLm5ldC9jYWNoZTE3IikKICAgICAgICBwcmltYWxzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcigib3BlbiIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICBwcmltYWxnbG9iYWwodGhpcykKICAgICAgICB9KQogICAgICAgIAogICAgICAgIHByaW1hbHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICBwcmltYWxzb2NrZXQgPSBudWxsCiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBmb3IobGV0IHVybCBvZiByZWxheXMoKSl7CiAgICAgICAgICBjb25zdCBzb2NrZXQgPSBjb25uZWN0KHVybCkKICAgICAgICAgIHNvY2tldHMucHVzaChzb2NrZXQpCiAgICAgICAgICAKICAgICAgICAgIHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgY2hlY2t1cGRhdGUodGhpcykKICAgICAgICAgICAgcXVlcnkodGhpcykKICAgICAgICAgIH0pCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGF3YWl0IHNsZWVwKDEwMCkucHJvbWlzZQogICAgICAgIAogICAgICAgIGlmKGhhc2tleSgpKXsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgibm9zdHIiKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGZvcihsZXQgYyBvZiBjb2xvcHRzKXsKICAgICAgICBkb2N1bWVudC53cml0ZSgnPHN0eWxlPicgKyBjb2xzY3NzLmlubmVyVGV4dC5yZXBsYWNlKC9cJFx7Y29sc1x9L2csIGMpICsgJzwvc3R5bGU+JykKICAgICAgfQogICAgPC9zY3JpcHQ+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==
https://ipfs.io/ipfs/QmeG4zvZbpzoQUpdnYetpHHrrGYqKAQGozmcp7met5sxzo
sha256
b37bf43a370d16866fcc06520013623c8a766a95697b95eacde3e2c1f31760b0 files.html
base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyIvPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL3N2Z2ljb25zLnNwYXJray5mci9zdmdpY29ucy5jc3MiLz4KICAgIDxzdHlsZT4KICAgICAgKiB7CiAgICAgICAgb3ZlcnNjcm9sbC1iZWhhdmlvci15OiBjb250YWluOwogICAgICB9CiAgICAgIAogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksIAogICAgICAjaGVhZGVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncywgCiAgICAgICNwcml2a2V5IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncyB7CiAgICAgICAgaGVpZ2h0OiA2ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNsb2dzIHsKICAgICAgICBoZWlnaHQ6IDhlbTsKICAgICAgICBvdmVyZmxvdzogc2Nyb2xsOwogICAgICAgIGZvbnQtc2l6ZTogLjhlbTsKICAgICAgfQogICAgICAKICAgICAgc2VsZWN0IHsKICAgICAgICB3aWR0aDogNGVtOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLCAKICAgICAgaW5wdXQuc3VibWl0IHsKICAgICAgICBib3JkZXItcmFkaXVzOiAuNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0LCAKICAgICAgI2hlYWRlciBhLAogICAgICAjbWVkaWEtY29udGFpbmVyIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLCAKICAgICAgZm9ybSwgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHotaW5kZXg6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgIAogICAgICBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDMwZW0pIHsKICAgICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgfQogICAgICB9CgogICAgICBmb3JtIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeSB7CiAgICAgICAgd2lkdGg6IDZlbTsKICAgICAgfQogICAgICAKICAgICAgI2xvYWRpbmcgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMHB4OwogICAgICAgIGxlZnQ6IDI3ZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgIGEgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgfQoKICAgICAgdmlkZW8gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogIAogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgIGhlaWdodDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgIG1hcmdpbi10b3A6IDAgIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgLnR5cGUgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICB6LWluZGV4OiAxOwogICAgICB9CiAgICAgIAogICAgICAjcGljLXF1ZXJ5IHsKICAgICAgICB3aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5LAogICAgICBhLAogICAgICBpbnB1dC5zdWJtaXQgewogICAgICAgIGNvbG9yOiAjOTk5OwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICBwYWRkaW5nOiAwIDFlbTsKICAgICAgfQoKICAgICAgI3F1ZXJ5ZGlzcGxheSAudGV4dCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIG1pbi13aWR0aDogM2VtOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgYSwKICAgICAgI2hlYWRlciBzcGFuIHsKICAgICAgICBwYWRkaW5nOiAwLjVlbTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQoKICAgICAgI2hlYWRlciB7CiAgICAgICAgcGFkZGluZzogMC40NWVtIDA7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQoKICAgICAgI2hlYWRlciAuaXRlbXMgewogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICB9CiAgICAgIAogICAgICAjaGVhZGVyIC5pdGVtcyB7CiAgICAgICAgbWFyZ2luLXRvcDogLjNlbTsKICAgICAgfQoKICAgICAgcCB7CiAgICAgICAgbWFyZ2luLXRvcDogMDsKICAgICAgfQogICAgICAKICAgICAgLmxhYmVsIHsKICAgICAgICBwYWRkaW5nOiAuOGVtIC44ZW0gLjhlbSAwOwogICAgICB9CgogICAgICAjcGljcyAucXVlcnkgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgfQoKICAgICAgI21lZGlhLWNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDApOwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgei1pbmRleDogNDsKICAgICAgfQogICAgICAKICAgICAgI3BpYy1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAKICAgICAgI3BpYyB7CiAgICAgICAgbWF4LXdpZHRoOiAxMDB2dzsKICAgICAgICBtYXgtaGVpZ2h0OiAxMDB2aDsKICAgICAgfQogICAgICAgIAogICAgICAjcGljcyB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgICAKICAgICAgI3BpY3MgPiBhLCAKICAgICAgI3BpY3MgaW1nLAogICAgICAjcGljcyAuZmlsZSwKICAgICAgI3BpY3MgLnZpZGVvLWNvbnRhaW5lciB7CiAgICAgICAgd2lkdGg6IDI1dnc7CiAgICAgIH0KCiAgICAgICNwaWNzID4gYSwKICAgICAgI3BpY3MgLmZpbGUsCiAgICAgICNwaWNzIC52aWRlby1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMjV2dzsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIGJvcmRlcjogMC4zZW0gc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMC4zZW07CiAgICAgICAgbWFyZ2luOiAtMC4zZW07CiAgICAgIH0KCiAgICAgICNwaWNzID4gLmZpbGUgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIAogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CiAgICAgIAogICAgICBib2R5Om5vdCgubm9zdHIpICNmaWx0ZXItbGlrZXMsIAogICAgICAuZmlsdGVyLWxpa2VzICNwaWNzID4gLml0ZW06bm90KC5yZWFjdGVkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgei1pbmRleDogMjsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3Z3OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHBhZGRpbmc6IDAgMXZ3OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNwaWMtcXVlcnkgewogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBmb250LXNpemU6IG1pbigzLjV2dywgMS41ZW0pOwogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsMC42KTsKICAgICAgICBtYXgtd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgI3BpYy1xdWVyeSB7CiAgICAgICAgcGFkZGluZzogLjZlbSAuNGVtIC4xZW0gLjRlbTsKICAgICAgICBtYXgtd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgLmxpa2UucmVhY3RlZCwKICAgICAgLmZpbHRlci1saWtlcyAjZmlsdGVyLWxpa2VzIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7CiAgICAgIH0KCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgZm9udC1zaXplOiAzZW07CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciwKICAgICAgI21lZGlhLWZvb3RlciAubGlrZSB7CiAgICAgICAgei1pbmRleDogNTsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgYm90dG9tOiAxLjllbTsKICAgICAgICBmb250LXNpemU6IDEuOGVtOwogICAgICAgIHBhZGRpbmctcmlnaHQ6IC42NWVtOwogICAgICAgIG1heC13aWR0aDogOGVtOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9CiAgICAgIAogICAgICAubGlrZSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiBhdXRvOwogICAgICAgIHBhZGRpbmc6IC4yZW07CiAgICAgICAgd2lkdGg6IDFlbTsKICAgICAgICBoZWlnaHQ6IDFlbTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CgogICAgICAubm9zdHIgLmxpa2UgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOyAgCiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgLmxpa2UgewogICAgICAgIGZvbnQtc2l6ZTogMi40ZW07CiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgewogICAgICAgIGRpc3BsYXk6IG5vbmU7ICAKICAgICAgfQogIAogICAgICAjcGljcyBpbWcgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgLmFjdGl2ZSB7CiAgICAgICAgYmFja2dyb3VuZDogIzQ0NDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI3BpY3MgPiAuYWN0aXZlIHsKICAgICAgICBib3JkZXItY29sb3I6IGdyZWVuOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KCiAgICAgIC5oZWFydHN2ZyBwYXRoIHsKICAgICAgICBzdHJva2U6ICNmZmY7CiAgICAgIH0KICAKICAgICAgYSNtZW51LCBhI2ZpbHRlci1saWtlcyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luLXRvcDogLS4zZW07CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgfQoKICAgICAgYSNtZW51IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBwYWRkaW5nOiAwIC4zZW0gMCAuNWVtOwogICAgICAgIGhlaWdodDogMi4xZW07CiAgICAgIH0KICAgICAgCiAgICAgIGEjZmlsdGVyLWxpa2VzIHsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB3aWR0aDogMS41ZW07CiAgICAgICAgaGVpZ2h0OiAxLjVlbTsKICAgICAgICBtYXJnaW46IC4xZW0gLjVlbTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgIH0KICAgICAgCiAgICAgIGEjZmlsdGVyLWxpa2VzIHN2ZyB7CiAgICAgICAgd2lkdGg6IDEuNWVtOwogICAgICAgIGhlaWdodDogMS41ZW07CiAgICAgIH0KICAgICAgIAogICAgICAubWVudXN2ZyB7CiAgICAgICAgd2lkdGg6IDJlbTsKICAgICAgICBoZWlnaHQ6IDJlbTsKICAgICAgfQoKICAgICAgLm1lbnVzdmcgcGF0aCB7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBtYXJnaW4tbGVmdDogLTE4ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzIyMjsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgei1pbmRleDogMzsgCiAgICAgICAgb3ZlcmZsb3c6IHNjcm9sbDsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudC5vcGVuIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgewogICAgICAgIHBhZGRpbmc6IDAgMWVtIDFlbSAxZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIGEsCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgcGFkZGluZzogLjVlbSAuN2VtOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHotaW5kZXg6IDM7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIG9wYWNpdHk6IC41OwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5Lm9wZW4gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIAogICAgICBzdmcsIAogICAgICBpbWcsIAogICAgICAudmlkZW8gdmlkZW8gewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAjdGVtcGxhdGUgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGRpdiBpZD0idGVtcGxhdGUiPgogICAgICA8c3ZnIGNsYXNzPSJoZWFydHN2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KICAgICAgICA8cGF0aCBkPSJNOS43MTksMTcuMDczbC02LjU2Mi02LjUxYy0wLjI3LTAuMjY4LTAuNTA0LTAuNTY3LTAuNjk2LTAuODg4QzEuMzg1LDcuODksMS42Nyw1LjYxMywzLjE1NSw0LjE0YzAuODY0LTAuODU2LDIuMDEyLTEuMzI5LDMuMjMzLTEuMzI5YzEuOTI0LDAsMy4xMTUsMS4xMiwzLjYxMiwxLjc1MmMwLjQ5OS0wLjYzNCwxLjY4OS0xLjc1MiwzLjYxMi0xLjc1MmMxLjIyMSwwLDIuMzY5LDAuNDcyLDMuMjMzLDEuMzI5YzEuNDg0LDEuNDczLDEuNzcxLDMuNzUsMC42OTMsNS41MzdjLTAuMTksMC4zMi0wLjQyNSwwLjYxOC0wLjY5NSwwLjg4N2wtNi41NjIsNi41MUMxMC4xMjUsMTcuMjI5LDkuODc1LDE3LjIyOSw5LjcxOSwxNy4wNzMgTTYuMzg4LDMuNjFDNS4zNzksMy42MSw0LjQzMSw0LDMuNzE3LDQuNzA3QzIuNDk1LDUuOTIsMi4yNTksNy43OTQsMy4xNDUsOS4yNjVjMC4xNTgsMC4yNjUsMC4zNTEsMC41MSwwLjU3NCwwLjczMUwxMCwxNi4yMjhsNi4yODEtNi4yMzJjMC4yMjQtMC4yMjEsMC40MTYtMC40NjYsMC41NzMtMC43MjljMC44ODctMS40NzIsMC42NTEtMy4zNDYtMC41NzEtNC41NkMxNS41Nyw0LDE0LjYyMSwzLjYxLDEzLjYxMiwzLjYxYy0xLjQzLDAtMi42MzksMC43ODYtMy4yNjgsMS44NjNjLTAuMTU0LDAuMjY0LTAuNTM2LDAuMjY0LTAuNjksMEM5LjAyOSw0LjM5Nyw3LjgyLDMuNjEsNi4zODgsMy42MSI+PC9wYXRoPgogICAgICA8L3N2Zz4KICAgICAgPGRpdiBpZD0iY29sc2NzcyI+CiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyAuaXRlbSB7CiAgICAgICAgd2lkdGg6IGNhbGMoMTAwdncgLyAke2NvbHN9KTsKICAgICAgfQoKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzIC5pdGVtIHsKICAgICAgICBoZWlnaHQ6IGNhbGMoMTAwdncgLyAke2NvbHN9KTsKICAgICAgfQogICAgICAKICAgICAgLmNvbHMke2NvbHN9IC5xdWVyeSwKICAgICAgLmNvbHMke2NvbHN9IC5saWtlIHsKICAgICAgICBmb250LXNpemU6IG1pbigxNHZ3ICogKDEgLyAke2NvbHN9KSwgNmVtICogKDEgLyAke2NvbHN9KSkKICAgICAgfQogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0ibWVkaWEtZm9vdGVyIj4KICAgICAgPGEgaWQ9InBpYy1saWtlIiBjbGFzcz0ibGlrZSIgaHJlZj0iIyI+PC9hPgogICAgICA8YSBpZD0icGljLXF1ZXJ5IiBocmVmPSIjIj48L2E+CiAgICAgIDxhIGlkPSJwaWMtdXNlciIgaHJlZj0iIyI+PC9hPgogICAgPC9kaXY+CiAgICA8Y2VudGVyIGlkPSJtZWRpYS1jb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJwaWMtY29udGFpbmVyIj4KICAgICAgICA8aW1nIGlkPSJwaWMiLz4KICAgICAgPC9kaXY+CiAgICA8L2NlbnRlcj4KICAgIDxkaXYgaWQ9Im1lbnUtb3ZlcmxheSI+PC9kaXY+CiAgICA8ZGl2IGlkPSJtZW51LWNvbnRlbnQiIGNsYXNzPSJ0ZXN0Ij4KICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5hdXRvcGxheTwvZGl2PgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0ib24iIGhyZWY9IiMiPm9uPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0ib2ZmIiBocmVmPSIjIj5vZmY8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJob3ZlciIgaHJlZj0iIyI+bW91c2VvdmVyPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5jb2x1bW5zPC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMSIgaHJlZj0iIyI+MTwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSIyIiBocmVmPSIjIj4yPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjQiIGhyZWY9IiMiPjQ8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iNiIgaHJlZj0iIyI+NjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSIxMCIgaHJlZj0iIyI+MTA8L2E+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmNvbm5lY3Rpb25zPC9kaXY+CiAgICAgICAgPGRpdiBpZD0iY29ubmNvdW50Ij4wPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPnJlbGF5czo8L2Rpdj4KICAgICAgICA8cD5QbGVhc2UgdXNlIHJlbGF5cyB3aXRoIE5JUC01MCAoc2VhcmNoKSBmdW5jdGlvbmFsaXR5PC9wPgogICAgICAgIDxmb3JtIGFjdGlvbj0iIyIgaWQ9InJlbGF5cy1mb3JtIj4KICAgICAgICAgIDx0ZXh0YXJlYSBpZD0icmVsYXlzIj48L3RleHRhcmVhPgogICAgICAgICAgPGlucHV0IGNsYXNzPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9InNhdmUgcmVsYXlzIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5wcml2YXRlIGtleTo8L2Rpdj4KICAgICAgICA8cD5JZiB5b3UgY2FudCB1c2UgYnJvd3NlciBhZGRvbiAobW9iaWxlKTwvcD4KICAgICAgICA8Zm9ybSBhY3Rpb249IiMiIGlkPSJwcml2a2V5LWZvcm0iPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJwcml2a2V5Ii8+CiAgICAgICAgICA8aW5wdXQgY2xhc3M9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0ic2F2ZSBrZXkiLz4KICAgICAgICA8L2Zvcm0+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmxvZ3M8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJsb2dzIj48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+bGF0ZXN0IHJlbGVhc2U6PC9kaXY+CiAgICAgICAgPGEgaWQ9InJlbGVhc2UiIGhyZWY9IiMiPjwvYT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9ImhlYWRlciI+CiAgICAgIDxhIGlkPSJmaWx0ZXItbGlrZXMiIGhyZWY9IiMiPjwvYT4KICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxhIGlkPSJtZW51IiBocmVmPSIjIj4KICAgICAgICAgIDxzdmcgY2xhc3M9Im1lbnVzdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJICAgICAgICA8cGF0aCBkPSJNMTAsMS40NDVjLTQuNzI2LDAtOC41NTUsMy44MjktOC41NTUsOC41NTVjMCw0LjcyNSwzLjgyOSw4LjU1NSw4LjU1NSw4LjU1NWM0LjcyNSwwLDguNTU1LTMuODMsOC41NTUtOC41NTVDMTguNTU1LDUuMjc0LDE0LjcyNSwxLjQ0NSwxMCwxLjQ0NSBNMTAsMTcuNjU0Yy00LjIyMSwwLTcuNjU0LTMuNDM0LTcuNjU0LTcuNjU0YzAtNC4yMjEsMy40MzMtNy42NTQsNy42NTQtNy42NTRjNC4yMjIsMCw3LjY1NCwzLjQzMyw3LjY1NCw3LjY1NEMxNy42NTQsMTQuMjIxLDE0LjIyMiwxNy42NTQsMTAsMTcuNjU0IE0xNC4zOSwxMGMwLDAuMjQ4LTAuMjAzLDAuNDUtMC40NSwwLjQ1SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMy0wLjQ1LTAuNDVzMC4yMDMtMC40NSwwLjQ1LTAuNDVoNy44NzlDMTQuMTg3LDkuNTUsMTQuMzksOS43NTIsMTQuMzksMTAgTTE0LjM5LDEyLjcwMmMwLDAuMjQ3LTAuMjAzLDAuNDQ5LTAuNDUsMC40NDlINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAyLTAuNDUtMC40NDljMC0wLjI0OCwwLjIwMy0wLjQ1MSwwLjQ1LTAuNDUxaDcuODc5QzE0LjE4NywxMi4yNTEsMTQuMzksMTIuNDU0LDE0LjM5LDEyLjcwMiBNMTQuMzksNy4yOThjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw2Ljg0OCwxNC4zOSw3LjA1MSwxNC4zOSw3LjI5OCI+PC9wYXRoPgoJICAgICAgICA8L3N2Zz4KICAgICAgICA8L2E+CiAgICAgICAgPGEgaWQ9InRpdGxlIiBocmVmPSIjIj5maWxlcy5odG1sPC9hPgogICAgICAgIDxmb3JtIGlkPSJxdWVyeS1mb3JtIiBhY3Rpb249IiMiPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJxdWVyeSIgbmFtZT0icXVlcnkiIGlkPSIiIC8+CiAgICAgICAgICA8c2VsZWN0IGlkPSJxdWVyeS10eXBlIj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iYWxsIj5hbGw8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaW1hZ2UiPmltYWdlczwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ2aWRlbyI+dmlkZW9zPC9vcHRpb24+CiAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgIDxpbnB1dCBpZD0iZ28iIHR5cGU9InN1Ym1pdCIgdmFsdWU9ImdvIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxzcGFuIGlkPSJxdWVyeWRpc3BsYXkiPgogICAgICAgICAgPHNwYW4gY2xhc3M9InRleHQiPjwvc3Bhbj4KICAgICAgICA8L3NwYW4+CiAgICAgICAgPGRpdiBpZD0ibG9hZGluZyI+dXBkYXRpbmc8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9InBpY3MiPjwvZGl2PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vdW5wa2cuY29tL25vc3RyLXRvb2xzL2xpYi9ub3N0ci5idW5kbGUuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vc2xvd2xpLmdpdGh1Yi5pby9iZWNoMzItYnVmZmVyL2Fzc2V0cy9qcy9iZWNoMzItYnVmZmVyLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0PgogICAgICBjb25zdCB1cGRhdGVzcHVia2V5ID0gImFlNWM2ZTBiNzQ2NjBkMjE5NGM4MjU0YjVjMmM4MjU2NzY1NzZiZTAyOTczNzlmYTIwNTIzMTE0YTZhODVlODciCiAgICAgIGNvbnN0IHF1ZXJpZXMgPSB7CiAgICAgICAgImdsb2JhbCI6ICdbIlJFUSIsIjxJPiIseyJjYWNoZSI6WyJleHBsb3JlIix7InRpbWVmcmFtZSI6ImxhdGVzdCIsInNjb3BlIjoiZ2xvYmFsIiwibGltaXQiOjxMPn1dfV0nLCAKICAgICAgICAiYXV0aG9yIjogJ1siUkVRIiwiPEk+Iix7ImtpbmRzIjpbMV0sImF1dGhvcnMiOlsiPFA+Il19XScsCiAgICAgICAgInJlYWN0aW9ucyI6ICdbIlJFUSIsIjxJPiIsIHsia2luZHMiOls3XSwiI2UiOiA8RT59XScKICAgICAgfQogICAgICBxcygiI3JlbGF5cyIpLnZhbHVlID0gcmVsYXlzKCkuam9pbigiXG4iKQogICAgICBxcygiI3ByaXZrZXkiKS52YWx1ZSA9IHByaXZrZXkoKQogICAgICBjb25zdCBjb2xvcHRzID0gWzEsIDIsIDQsIDYsIDEwXQoKICAgICAgY29scyA9ICgpID0+IHBhcnNlSW50KHNldHRpbmcoImNvbHMiLCBjb2xvcHRzWzFdKSwgMTApCiAgICAgIGF1dG9wbGF5ID0gKCkgPT4gc2V0dGluZygiYXV0b3BsYXkiLCAib2ZmIikKICAgICAgbGltaXQgPSAoKSA9PiBwYXJzZUludChzZXR0aW5nKCJsaW1pdCIsIDE1KSwgMTApCiAgICAgIAogICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgY29scygpKQogICAgICAKICAgICAgbGV0IHByb3RvY29sID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlLykgPyAibm9zdHI6IiA6ICJ3ZWIrbm9zdHI6IgogICAgICBsZXQgc29ja2V0cyA9IFtdCiAgICAgIGxldCByZXNoYW5kbGVycyA9IFtdCiAgICAgIGxldCB1cmxzID0gW10KICAgICAgbGV0IGxpa2VzID0gW10KICAgICAgbGV0IG5ld2xpa2VzID0gW10KICAgICAgbGV0IGlkY291bnRlciA9IDAKICAgICAgbGV0IHF1ZXJ5d2FpdCA9IG51bGwKICAgICAgbGV0IHByaW1hbHNvY2tldCA9IG51bGwKICAgICAgbGV0IHR5cGVzID0gewogICAgICAgIGltYWdlOiBbInBuZyIsICJqcGciLCAianBlZyIsICJ3ZWJwIl0sCiAgICAgICAgdmlkZW86IFsibXA0IiwgIndlYm0iXQogICAgICB9CiAgICAgIGxldCBpbWdyZWdleCA9IC9odHRwKHxzKVw6XC9cL1teIFxuXSo/XC4ocG5nfGpwZ3xqcGVnfHdlYnApL2dpCiAgICAgIGxldCB2aWRlb3JlZ2V4ID0gL2h0dHAofHMpXDpcL1wvW14gXG5dKj9cLihtcDR8d2VibSkvZ2kKICAgICAgbGV0IHZpZGVvZXh0cmVnZXggPSAvXC4obXA0fHdlYm0pJC9pCiAgICAgIGxldCBpbWdleHRyZWdleCA9IC9cLihwbmd8anBnfGpwZWd8d2VicCkkL2kKICAgICAgd2FpdG1zID0gNTAwMAogICAgICBxdWVyeXN0ciA9ICIiCiAgICAgIGxldCBxdWVyeWNvdW50ID0gMAogICAgICBsZXQgaG92ZXJlZHZpZGVvID0gbnVsbAogICAgICAKICAgICAgdXBkYXRlcXVlcnkoKQogICAgICBxcygiI3BpYy1saWtlIikuaW5uZXJIVE1MID0gcXMoIiNmaWx0ZXItbGlrZXMiKS5pbm5lckhUTUwgPSBxcygiI3RlbXBsYXRlIC5oZWFydHN2ZyIpLm91dGVySFRNTAogICAgICBzZXRhY3RpdmUoInNldGNvbHMiLCAiY29scyIsIGNvbHMoKSkKICAgICAgc2V0YWN0aXZlKCJzZXRhdXRvcGxheSIsICJhdXRvcGxheSIsIGF1dG9wbGF5KCkpCiAgICAgIAogICAgICBmdW5jdGlvbiBmcm9tSGV4U3RyaW5nKHN0cil7CiAgICAgICAgbGV0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHN0ci5sZW5ndGggLyAyKQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmZmVyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBidWZmZXJbaV0gPSBwYXJzZUludChzdHIuc3Vic3RyKDIgKiBpLCAyKSwgMTYpCiAgICAgICAgfQogICAgICAgIHJldHVybiBidWZmZXIKICAgICAgfQogIAogICAgICBmdW5jdGlvbiByZWxheXMoKXsKICAgICAgICBjb25zdCBvYmogPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJyZWxheXMiKSkKICAgICAgICBjb25zdCByID0gb2JqICYmIG9iai5maWx0ZXIociA9PiByLm1hdGNoKC93c3M6XC9cLy4rLykpIHx8IFtdCiAgICAgICAgCiAgICAgICAgcmV0dXJuIHIubGVuZ3RoID4gMCAmJiByIHx8IFsKICAgICAgICAgICJ3c3M6Ly9yZWxheS5ub3N0ci5iYW5kIiwKICAgICAgICAgICJ3c3M6Ly9uYi5yZWxheS5jZW50ZXIiLCAKICAgICAgICAgICJ3c3M6Ly9ub3N0ci5jb21waWxlLWVycm9yLm5ldCIKICAgICAgICBdCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHByaXZrZXkoKXsKICAgICAgICBsZXQga2V5ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oInByaXZrZXkiKSB8fCAiIgogICAgICAgIAogICAgICAgIGlmKGtleS5sZW5ndGggPT0gNjMpewogICAgICAgICAga2V5ID0gTm9zdHJUb29scy5uaXAxOS5kZWNvZGUoa2V5KS5kYXRhCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiBrZXkubGVuZ3RoID09IDY0ICYmIGtleSB8fCBudWxsCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNldHRpbmcoa2V5LCBkZWZhdWx0dmFsdWUpewogICAgICAgIGNvbnN0IHYgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpCiAgICAgICAgcmV0dXJuIHYgJiYgb3B0aW9uKCJzZXQiICsga2V5LCBrZXksIHYpICYmIHYgfHwgZGVmYXVsdHZhbHVlCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIG9wdGlvbihjLCBrZXksIHZhbCl7CiAgICAgICAgcmV0dXJuIHFzKCIuIiArIGMgKyAiW2RhdGEtIiArIGtleSArICI9JyIgKyB2YWwgKyAiJ10iKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxcyhxKXsKICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihxKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxc2EocSl7CiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChxKSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gZ2lkKGkpewogICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxdWVyeXR5cGUoKXsKICAgICAgICByZXR1cm4gcXMoIiNxdWVyeS10eXBlIikudmFsdWUgfHwgImFsbCIKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlcXVlcnkoKXsKICAgICAgICBsZXQgcGFydHMgPSBkZWNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaGFzaC5zdWJzdHJpbmcoMSkpLnNwbGl0KCIvIikKICAgICAgICBxdWVyeXN0ciA9IHFzKCIjcXVlcnlkaXNwbGF5IC50ZXh0IikuaW5uZXJUZXh0ID0gcGFydHNbMF0KICAgICAgICBxcygiI3F1ZXJ5IikudmFsdWUgPSBwYXJ0c1swXQogICAgICAgIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlID0gcGFydHNbMV0gfHwgImFsbCIKICAgICAgfQoKICAgICAgZnVuY3Rpb24gYWN0aXZlKCl7CiAgICAgICAgcmV0dXJuIHFzKCIjcGljcyAuYWN0aXZlIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcGljb2Zmc2V0KG9mZnNldCl7CiAgICAgICAgY29uc3QgcGljcyA9IHFzYSgiI3BpY3MgPiAuaXRlbSIpLmZpbHRlcihlID0+IGUuc3R5bGUuZGlzcGxheSA9PSAiYmxvY2siKQogICAgICAgIHJldHVybiBwaWNzW3BpY3MuaW5kZXhPZihhY3RpdmUoKSkrb2Zmc2V0XQogICAgICB9CgogICAgICBmdW5jdGlvbiBsYXN0YWN0aXZlKCl7CiAgICAgICAgcmV0dXJuIHFzYSgiI3BpY3MgLmFjdGl2ZSIpLnBvcCgpICAgICAgCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIG1lbnUoKXsKICAgICAgICBxc2EoIiNtZW51LWNvbnRlbnQsICNtZW51LW92ZXJsYXkiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QudG9nZ2xlKCJvcGVuIikpCiAgICAgIH0KICAKICAgICAgZnVuY3Rpb24gc2V0YWN0aXZlKGMsIGtleSwgdmFsKXsKICAgICAgICBxc2EoIi4iICsgYykuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikpCiAgICAgICAgY29uc3Qgb3B0aW9uID0gcXMoIi4iICsgYyArICJbZGF0YS0iICsga2V5ICsgIj0nIiArIHZhbCArICInXSIpCiAgICAgICAgb3B0aW9uPy5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiB1cGRhdGVhbGx2aWRlb3BsYXkoKXsKICAgICAgICBxc2EoIiNwaWNzIHZpZGVvIikuZm9yRWFjaChhc3luYyB2ID0+IHVwZGF0ZXZpZGVvcGxheSh2KSkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRldmlkZW9wbGF5KHYpewogICAgICAgIGNvbnN0IGFwbGF5ID0gYXV0b3BsYXkoKQogICAgICAgIAogICAgICAgIGlmKGFwbGF5ICE9ICJvbiIpewogICAgICAgICAgdi5tdXRlZCA9IGZhbHNlCiAgICAgICAgICB2LnBhdXNlKCkKICAgICAgICB9ZWxzZXsKICAgICAgICAgIHYubXV0ZWQgPSB0cnVlCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IG4gPSB2LnBhcmVudEVsZW1lbnQKICAgICAgICAKICAgICAgICBpZigobi5vZmZzZXRUb3AgKyBuLm9mZnNldEhlaWdodCkgPCBzY3JvbGxZIAogICAgICAgIHx8IG4ub2Zmc2V0VG9wID4gKHNjcm9sbFkgKyB2aXN1YWxWaWV3cG9ydC5oZWlnaHQpKXsKICAgICAgICAgIGlmKHYucmVhZHlTdGF0ZSA9PSA0KXsKICAgICAgICAgICAgdi5wYXVzZSgpCiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgdi5wcmVsb2FkID0gIm5vbmUiCiAgICAgICAgICB9CiAgICAgICAgfWVsc2UgaWYodi5yZWFkeVN0YXRlICE9IDQpewogICAgICAgICAgdi5wcmVsb2FkID0gImF1dG8iCiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoYXBsYXkgPT0gIm9uIiB8fCAoYXBsYXkgPT0gImhvdmVyIiAmJiB2ID09IGhvdmVyZWR2aWRlbykpewogICAgICAgICAgdi5wbGF5KCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsIGUgPT4gewogICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCkKICAgICAgICB1cGRhdGVhbGx2aWRlb3BsYXkoKQogICAgICB9KQogICAgICAKICAgICAgbGV0IHRvdWNoID0gbnVsbAogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsIGUgPT4gdG91Y2ggPSBlLmNoYW5nZWRUb3VjaGVzWzBdKQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLCBlID0+IHsKICAgICAgICBjb25zdCB4ZGlmZiA9IGUuY2hhbmdlZFRvdWNoZXNbMF0uc2NyZWVuWCAtIHRvdWNoLnNjcmVlblgKCiAgICAgICAgaWYoeGRpZmYgPCAtNTApewogICAgICAgICAgc3dpcGUoMSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoeGRpZmYgPiA1MCl7CiAgICAgICAgICBzd2lwZSgtMSkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBxcygiI3F1ZXJ5LWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBsb2NhdGlvbi5oYXNoID0gIiMiICsgZW5jb2RlVVJJQ29tcG9uZW50KHFzKCIjcXVlcnkiKS52YWx1ZSArICIvIiArIHF1ZXJ5dHlwZSgpKQogICAgICAgIHVwZGF0ZXF1ZXJ5KCkKICAgICAgICBxdWVyeXdhaXQucmVzb2x2ZSgpCiAgICAgIH0pCgogICAgICBxcygiI3JlbGF5cy1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgYXN5bmMgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgbGV0IHIgPSBKU09OLnN0cmluZ2lmeShxcygiI3JlbGF5cyIpLnZhbHVlLnNwbGl0KCJcbiIpKQogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJyZWxheXMiLCByKQogICAgICAgIGRpc2Nvbm5lY3QoKQogICAgICB9KQoKICAgICAgcXMoIiNwcml2a2V5LWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBhc3luYyBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBjb25zdCBrZXkgPSBxcygiI3ByaXZrZXkiKS52YWx1ZQoKICAgICAgICBpZihrZXkubGVuZ3RoICE9IDY0ICYmIGtleS5sZW5ndGggIT0gNjMpewogICAgICAgICAgYWxlcnQoImtleSBzaG91bGQgYmUgNjMgb3IgNjQgY2hhcmFjdGVycyBsb25nIikKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgicHJpdmtleSIsIGtleSkKICAgICAgICBhbGVydCgia2V5IHNhdmVkIikKICAgICAgfSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaWYoYXV0b3BsYXkoKSA9PSAiaG92ZXIiICYmIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygidmlkZW8tY29udGFpbmVyIikpewogICAgICAgICAgaG92ZXJlZHZpZGVvID0gZS50YXJnZXQucXVlcnlTZWxlY3RvcigidmlkZW8iKQogICAgICAgICAgaG92ZXJlZHZpZGVvLnBsYXkoKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IiwgYXN5bmMgKGUpID0+IHsKICAgICAgICBob3ZlcmVkdmlkZW8gPSBmYWxzZQogICAgICAgIGlmKHFzKCIjbWVkaWEtY29udGFpbmVyIikuc3R5bGUuZGlzcGxheSAhPSAiYmxvY2siICYmIGF1dG9wbGF5KCkgPT0gImhvdmVyIiAmJiBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInZpZGVvLWNvbnRhaW5lciIpKXsKICAgICAgICAgIHFzYSgidmlkZW8iKS5mb3JFYWNoKHYgPT4gdi5wYXVzZSgpKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgYXN5bmMgKGUpID0+IHsKICAgICAgICBpZihlLnRhcmdldC50eXBlID09ICJzdWJtaXQiIHx8IChlLnRhcmdldC50YWdOYW1lID09ICJBIiAmJiBlLnRhcmdldC5ocmVmLm1hdGNoKC9eKHx3ZWJcKylub3N0clw6LykpKXsKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJ0aXRsZSIpewogICAgICAgICAgcXMoIiNxdWVyeSIpLnZhbHVlID0gIiIKICAgICAgICAgIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlID0gImFsbCIKICAgICAgICAgIHFzKCIjZ28iKS5jbGljaygpCiAgICAgICAgfQoKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gImZpbHRlci1saWtlcyIpewogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCJmaWx0ZXItbGlrZXMiKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2hvdyIpKXsKICAgICAgICAgIGFjdGl2ZSgpPy5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgZ2lkKGUudGFyZ2V0LmlkKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgc2hvdyhlLnRhcmdldC5pZCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC50YWdOYW1lICE9ICJBIiAmJiAocXMoIiNwaWMtY29udGFpbmVyIikgPT0gZS50YXJnZXQgfHwgcXMoIiNtZWRpYS1jb250YWluZXIgdmlkZW8iKSA9PSBlLnRhcmdldCkpewogICAgICAgICAgaGlkZW1lZGlhKCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gIm1lbnUiIHx8IGUudGFyZ2V0LmlkID09ICJtZW51LW92ZXJsYXkiKXsKICAgICAgICAgIG1lbnUoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNldGNvbHMiKSl7CiAgICAgICAgICBmb3IobGV0IGMgb2YgY29sb3B0cyl7CiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgiY29scyIgKyBjKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgZS50YXJnZXQuZGF0YXNldC5jb2xzKQogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImNvbHMiLCBlLnRhcmdldC5kYXRhc2V0LmNvbHMpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGNvbHMiLCAiY29scyIsIGNvbHMoKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNldGF1dG9wbGF5IikpewogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImF1dG9wbGF5IiwgZS50YXJnZXQuZGF0YXNldC5hdXRvcGxheSkKICAgICAgICAgIHNldGFjdGl2ZSgic2V0YXV0b3BsYXkiLCAiYXV0b3BsYXkiLCBhdXRvcGxheSgpKQogICAgICAgICAgdXBkYXRlYWxsdmlkZW9wbGF5KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoImxpa2UiKSAmJiBsaWtlKGUudGFyZ2V0KQogICAgICB9KQogICAgICAKICAgICAgZnVuY3Rpb24gaGFza2V5KCl7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5ub3N0ciB8fCBwcml2a2V5KCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcHVia2V5KCl7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5ub3N0ciAmJiBhd2FpdCB3aW5kb3cubm9zdHIuZ2V0UHVibGljS2V5KCkgfHwgTm9zdHJUb29scy5nZXRQdWJsaWNLZXkocHJpdmtleSgpKQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBzaWduKGV2ZW50KXsKICAgICAgICBpZih3aW5kb3cubm9zdHIpewogICAgICAgICAgcmV0dXJuIGF3YWl0IG5vc3RyLnNpZ25FdmVudChldmVudCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZXZlbnQuc2lnID0gTm9zdHJUb29scy5nZXRTaWduYXR1cmUoZXZlbnQsIHByaXZrZXkoKSkKICAgICAgICByZXR1cm4gZXZlbnQKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gbGlrZShsaW5rKXsKICAgICAgICBjb25zdCBldmVudCA9IGxpbmsucGFyZW50RWxlbWVudFsiZGF0YS1ldmVudCJdCiAgICAgICAgY29uc3QgcHViayA9IGF3YWl0IHB1YmtleSgpCiAgICAgICAgY29uc3QgbGlrZSA9IGF3YWl0IHNpZ24oewogICAgICAgICAgImtpbmQiOiA3LAogICAgICAgICAgImNvbnRlbnQiOiAiKyIsCiAgICAgICAgICAidGFncyI6IFsKICAgICAgICAgICAgWyJlIiwgZXZlbnQuaWRdLAogICAgICAgICAgICBbInAiLCBldmVudC5wdWJrZXldCiAgICAgICAgICBdLAogICAgICAgICAgInB1YmtleSI6IHB1YmssCiAgICAgICAgICAiY3JlYXRlZF9hdCI6IHBhcnNlSW50KERhdGUubm93KCkgLyAxMDAwICwgMTApCiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBzb2NrZXRzLmZvckVhY2gocyA9PiBzLnNlbmQoSlNPTi5zdHJpbmdpZnkoWyJFVkVOVCIsIGxpa2VdKSkpCiAgICAgICAgbGluay5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKCiAgICAgICAgY29uc3QgcGljaWQgPSBsaW5rWyJkYXRhLWl0ZW0taWQiXSB8fCBsaW5rLmRhdGFzZXQucGljSWQKICAgICAgICAKICAgICAgICBpZihwaWNpZCl7CiAgICAgICAgICBnaWQocGljaWQpLnF1ZXJ5U2VsZWN0b3IoIi5saWtlIikuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgfQogICAgICB9CiAgICAKICAgICAgZnVuY3Rpb24gc3dpcGUob2Zmc2V0KXsKICAgICAgICBpZihwaWNvZmZzZXQob2Zmc2V0KSl7CiAgICAgICAgICBwaWNvZmZzZXQob2Zmc2V0KS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgdGhpc1tvZmZzZXQgPT0gMSAmJiAibGFzdGFjdGl2ZSIgfHwgImFjdGl2ZSJdKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIHVwZGF0ZXNob3coKQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlc2hvdygpewogICAgICAgIGlmKHFzKCIjbWVkaWEtY29udGFpbmVyIikuc3R5bGUuZGlzcGxheSA9PSAiYmxvY2siKXsKICAgICAgICAgIGhpZGV2aWRlbygpCiAgICAgICAgICBzaG93KGFjdGl2ZSgpLmlkKQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIGUgPT4gewogICAgICAgIGlmKFsiVGFiIiwgIkFycm93TGVmdCIsICJBcnJvd1JpZ2h0IiwgIkFycm93VXAiLCAiQXJyb3dEb3duIl0uaW5jbHVkZXMoZS5rZXkpKXsKICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkVzY2FwZSIpewogICAgICAgICAgbWVudSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS5rZXkgPT0gIkVudGVyIiAmJiBlLnRhcmdldC50YWdOYW1lID09ICJCT0RZIil7CiAgICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLnN0eWxlLmRpc3BsYXkgPT0gImJsb2NrIil7CiAgICAgICAgICAgIGhpZGVtZWRpYSgpCiAgICAgICAgICAgIHJldHVybgogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBzaG93KGFjdGl2ZSgpLmlkKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dVcCIgJiYgcGljb2Zmc2V0KC1jb2xzKCkpKXsKICAgICAgICAgIHBpY29mZnNldCgtY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgbGFzdGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICB1cGRhdGVzaG93KCkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd0Rvd24iICYmIHBpY29mZnNldChjb2xzKCkpKXsKICAgICAgICAgIHBpY29mZnNldChjb2xzKCkpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgdXBkYXRlc2hvdygpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dMZWZ0Iil7CiAgICAgICAgICBzd2lwZSgtMSkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd1JpZ2h0Iil7CiAgICAgICAgICBzd2lwZSgxKQogICAgICAgIH0KICAgICAgfSkKCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZXF1ZXJ5cmVzKHJlcywgc29ja2V0LCBxLCB0eXBlLCBzdGltZSl7CiAgICAgICAgc2F2ZShzb2NrZXQsIHJlcywgcSwgdHlwZSwgZmFsc2UsIGZhbHNlLCB0cnVlKQogICAgICAgIGxvZygicXVlcnkgcmVzIiwgcmVzLmxlbmd0aCwgc29ja2V0LnVybCkKICAgICAgICBxdWVyeWNvdW50LS0KICAgICAgICBpZihxdWVyeWNvdW50ID09IDApewogICAgICAgICAgcXMoIiNsb2FkaW5nIikuc3R5bGUuZGlzcGxheSA9ICJub25lIgogICAgICAgIH0KICAgICAgICAKICAgICAgICBsZXQgd2FpdCA9IHdhaXRtcyAtIChEYXRlLm5vdygpIC0gc3RpbWUpCiAgICAgICAgcXVlcnl3YWl0ID0gc2xlZXAod2FpdCkKICAgICAgICBhd2FpdCBxdWVyeXdhaXQucHJvbWlzZQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBwcmltYWxnbG9iYWwoc29ja2V0KXsKICAgICAgICBsb2coImdsb2JhbCIsIHNvY2tldC51cmwpCiAgICAgICAgcXVlcnljb3VudCsrCiAgICAgICAgcXMoIiNsb2FkaW5nIikuc3R5bGUuZGlzcGxheSA9ICJibG9jayIKICAgICAgICBsZXQgc3RpbWUgPSBEYXRlLm5vdygpCiAgICAgICAgbGV0IHFpZCA9ICJnbG9iYWxfIiArICgrK2lkY291bnRlcikKICAgICAgICBsZXQgcWlkbGlrZXMgPSAibGlrZXNfIiArICgrK2lkY291bnRlcikKCiAgICAgICAgaWYobmV3bGlrZXMubGVuZ3RoID4gMCl7CiAgICAgICAgICBwcmltYWxzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAgICJSRVEiLCAKICAgICAgICAgICAgcWlkbGlrZXMsIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgImNhY2hlIjogWwogICAgICAgICAgICAgICAgImV2ZW50cyIsIHsKICAgICAgICAgICAgICAgICAgImV2ZW50X2lkcyI6IG5ld2xpa2VzCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgICBdKSkKCiAgICAgICAgICBjb25zdCBsaWtlX2V2ZW50cyA9IGF3YWl0IHdhaXRyZXMocWlkbGlrZXMpCiAgICAgICAgICBuZXdsaWtlcy5zcGxpY2UoMCkKICAgICAgICAgIAogICAgICAgICAgYXdhaXQgc2F2ZShzb2NrZXQsIGxpa2VfZXZlbnRzLCAiIiwgImFsbCIsIHRydWUsIHRydWUsIGZhbHNlKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAiUkVRIiwgCiAgICAgICAgICBxaWQsIAogICAgICAgICAgewogICAgICAgICAgICAiY2FjaGUiOiBbCiAgICAgICAgICAgICAgImV4cGxvcmUiLCAKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidGltZWZyYW1lIjogImxhdGVzdCIsCiAgICAgICAgICAgICAgICAic2NvcGUiOiAiZ2xvYmFsIiwKICAgICAgICAgICAgICAgICJsaW1pdCI6IDIwCiAgICAgICAgICAgICAgfQogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSkpCiAgICAgICAgCiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgd2FpdHJlcyhxaWQpCiAgICAgICAgYXdhaXQgaGFuZGxlcXVlcnlyZXMocmVzLmZpbHRlcihlID0+IGUua2luZCA9PSAxKSwgc29ja2V0LCAiIiwgImFsbCIsIHN0aW1lKQogICAgICAgIHByaW1hbGdsb2JhbChzb2NrZXQpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5KHNvY2tldCwgcHJpbWFsKXsKICAgICAgICBsb2coInF1ZXJ5Iiwgc29ja2V0LnVybCkKICAgICAgICBxdWVyeWNvdW50KysKICAgICAgICBxcygiI2xvYWRpbmciKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgIAogICAgICAgIGxldCBzdGltZSA9IERhdGUubm93KCkKICAgICAgICBsZXQgcSA9IHF1ZXJ5c3RyLnRyaW0oKQogICAgICAgIGxldCB0eXBlID0gcXVlcnl0eXBlKCkKICAgICAgICBsZXQgaSA9ICsraWRjb3VudGVyCiAgICAgICAgbGV0IHFpZCA9ICJxdWVyeV8iICsgaQogICAgICAgIGxldCBmaWx0ZXJzID0gW10KCiAgICAgICAgZmlsdGVycy5wdXNoKC4uLih0eXBlc1t0eXBlXSB8fCBbXSkubWFwKCh0KSA9PiB7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBraW5kczogWzFdLCAKICAgICAgICAgICAgc2VhcmNoOiAiLiIgKyB0LAogICAgICAgICAgICBsaW1pdDogMjAKICAgICAgICAgIH0KICAgICAgICB9KSkKICAgICAgICAKICAgICAgICBpZihxLmxlbmd0aCA+IDApewogICAgICAgICAgZmlsdGVycy5wdXNoKHtraW5kczogWzFdLCBzZWFyY2g6IHF9KQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihmaWx0ZXJzLmxlbmd0aCA9PSAwKXsKICAgICAgICAgIGZpbHRlcnMucHVzaCh7a2luZHM6IFsxXX0pCiAgICAgICAgfQogICAgICAgIAogICAgICAgIAogICAgICAgIGNvbnN0IGxpa2VzcmVzID0gYXdhaXQgcXVlcnlsaWtlcyhzb2NrZXQpCiAgICAgICAgCiAgICAgICAgbGlrZXNyZXMuZm9yRWFjaChldmVudGlkID0+IHsKICAgICAgICAgIGlmKCFsaWtlcy5pbmNsdWRlcyhldmVudGlkKSl7CiAgICAgICAgICAgIGxpa2VzLnB1c2goZXZlbnRpZCkKICAgICAgICAgICAgbmV3bGlrZXMucHVzaChldmVudGlkKQogICAgICAgICAgfQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgY29uc3Qgc2VhcmNob2JqID0gWyJSRVEiLCBxaWQsIC4uLmZpbHRlcnNdCiAgICAgICAgY29uc3Qgc2VhcmNoanNvbiA9IEpTT04uc3RyaW5naWZ5KHNlYXJjaG9iaikKICAgICAgICBzb2NrZXQuc2VuZChzZWFyY2hqc29uKQogICAgICAgIAogICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHdhaXRyZXMocWlkKQogICAgICAgIGF3YWl0IGhhbmRsZXF1ZXJ5cmVzKHJlcywgc29ja2V0LCBxLCB0eXBlLCBzdGltZSkKICAgICAgICBxdWVyeShzb2NrZXQpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5bGlrZXMoc29ja2V0KXsKICAgICAgICBpZighaGFza2V5KCkpewogICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IG15cHVia2V5ID0gYXdhaXQgcHVia2V5KCkKICAgICAgICBjb25zdCBldmVudHMgPSBhd2FpdCBxdWVyeWV2ZW50cyhzb2NrZXQsIFs3XSwgbnVsbCwgW215cHVia2V5XSkKICAgICAgICByZXR1cm4gZXZlbnRzLm1hcChlID0+IGUudGFncy5maW5kKHQgPT4gdFswXSA9PSAiZSIpWzFdKQogICAgICB9CgogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeWV2ZW50cyhzb2NrZXQsIGtpbmRzLCBldmVudGlkcywgYXV0aG9ycyl7CiAgICAgICAgY29uc3QgcXVlcnlpZCA9ICJldmVudHNfIiArICgrK2lkY291bnRlcikKICAgICAgICBjb25zdCBmaWx0ZXJzID0ge30KICAgICAgICAKICAgICAgICBmaWx0ZXJzLmtpbmRzID0ga2luZHMKICAgICAgICAKICAgICAgICBpZihldmVudGlkcyl7CiAgICAgICAgICBmaWx0ZXJzWyIjZSJdID0gZXZlbnRpZHMKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoYXV0aG9ycyl7CiAgICAgICAgICBmaWx0ZXJzWyJhdXRob3JzIl0gPSBhdXRob3JzCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAiUkVRIiwgCiAgICAgICAgICBxdWVyeWlkLCAKICAgICAgICAgIGZpbHRlcnMKICAgICAgICBdKQoKICAgICAgICBzb2NrZXQuc2VuZChqc29uKQogICAgICAgIAogICAgICAgIHJldHVybiBhd2FpdCB3YWl0cmVzKHF1ZXJ5aWQpIHx8IFtdCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5cHVia2V5KHNvY2tldCwgcHViayl7CiAgICAgICAgY29uc3QgcXVlcnlpZCA9ICJxdWVyeV8iICsgKCsraWRjb3VudGVyKQogICAgICAgIHNvY2tldC5zZW5kKHF1ZXJpZXMuYXV0aG9yLnJlcGxhY2UoIjxJPiIsIHF1ZXJ5aWQpLnJlcGxhY2UoIjxQPiIsIHB1YmspKQoKICAgICAgICByZXR1cm4gKGF3YWl0IHdhaXRyZXMocXVlcnlpZCkpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHNhdmUoc29ja2V0LCBldmVudGRiLCBxLCBxdHlwZSwgcmVhY3RlZCwgYXBwZW5kLCBxdWVyeW1ldGEpewogICAgICAgIGxldCBldmVudHB1YmtleXMgPSBbXQogICAgICAgIGNvbnN0IGV2ZW50cyA9IGV2ZW50ZGIuZmlsdGVyKG8gPT4gewogICAgICAgICAgaWYocS5sZW5ndGggPiAwKXsKICAgICAgICAgICAgZm9yKGxldCB3b3JkIG9mIHEuc3BsaXQoIiAiKSl7CiAgICAgICAgICAgICAgaWYoby5jb250ZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZih3b3JkLnRvTG93ZXJDYXNlKCkpID09IC0xKXsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIHJldHVybiB0cnVlCiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBsZXQgcmVzdWx0cyA9IFtdCiAgICAgICAgY29uc3QgZXZlbnRpZHMgPSBldmVudHMubWFwKGUgPT4gZS5pZCkKICAgICAgICBsZXQgbmV3dXJscyA9IFtdCiAgICAgICAgCiAgICAgICAgZm9yKGxldCBldmVudCBvZiBldmVudHMpewogICAgICAgICAgbGV0IHVybHNtYXRjaCA9IFtdCiAgICAgICAgICAKICAgICAgICAgIGlmKHF0eXBlICE9ICJ2aWRlbyIpewogICAgICAgICAgICB1cmxzbWF0Y2gucHVzaCguLi4oZXZlbnQuY29udGVudC5tYXRjaChpbWdyZWdleCkgfHwgW10pKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBpZihxdHlwZSAhPSAiaW1hZ2UiKXsKICAgICAgICAgICAgdXJsc21hdGNoLnB1c2goLi4uKGV2ZW50LmNvbnRlbnQubWF0Y2godmlkZW9yZWdleCkgfHwgW10pKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICB1cmxzbWF0Y2ggPSB1cmxzbWF0Y2guZmlsdGVyKHVybCA9PiAhdXJscy5pbmNsdWRlcyh1cmwpKQoKICAgICAgICAgIGlmKHVybHNtYXRjaC5sZW5ndGggPiAwKXsKICAgICAgICAgICAgbmV3dXJscy5wdXNoKHsKICAgICAgICAgICAgICBldmVudDogZXZlbnQsCiAgICAgICAgICAgICAgdXJsczogdXJsc21hdGNoCiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIAogICAgICAgICAgICB1cmxzLnB1c2goLi4udXJsc21hdGNoKQogICAgICAgICAgICBldmVudHB1YmtleXMuaW5jbHVkZXMoZXZlbnQucHVia2V5KSB8fCBldmVudHB1YmtleXMucHVzaChldmVudC5wdWJrZXkpCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxvZygicXVlcnkgbWV0YSIsIHNvY2tldC51cmwpCiAgICAgICAgbGV0IG1ldGFldmVudHMgPSAocXVlcnltZXRhICYmIGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzBdLCBudWxsLCBldmVudHB1YmtleXMpIHx8IFtdKQogICAgICAgIAogICAgICAgIGZvcihsZXQgZW50cnkgb2YgbmV3dXJscyl7CiAgICAgICAgICBmb3IobGV0IHVybCBvZiBlbnRyeS51cmxzKXsKICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHsKICAgICAgICAgICAgICByZWFjdGVkOiByZWFjdGVkIHx8IGxpa2VzLmluY2x1ZGVzKGVudHJ5LmV2ZW50LmlkKSwgCiAgICAgICAgICAgICAgdXJsOiB1cmwsIAogICAgICAgICAgICAgIGV2ZW50OiBlbnRyeS5ldmVudCwgCiAgICAgICAgICAgICAgYmVjaDMyaWQ6IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKGVudHJ5LmV2ZW50LmlkKSksCiAgICAgICAgICAgICAgbWV0YTogbWV0YWV2ZW50cy5maW5kKG8gPT4gby5wdWJrZXkgPT0gZW50cnkuZXZlbnQucHVia2V5KQogICAgICAgICAgICB9KQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBsb2coInNhdmUgcmVzIiwgcmVzdWx0cy5sZW5ndGgsIHNvY2tldC51cmwpCiAgICAgICAgdXBkYXRlY29udGVudChyZXN1bHRzLCBxLCBhcHBlbmQpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZWNvbnRlbnQocmVzdWx0cywgcSwgYXBwZW5kKXsKICAgICAgICByZXN1bHRzLnJldmVyc2UoKS5mb3JFYWNoKGl0ZW0gPT4gewogICAgICAgICAgY29uc3QgdHlwZSA9IGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpICYmICJ2aWRlbyIgfHwgInBpYyIKICAgICAgICAgIGNvbnN0IHRleHQgPSAocSB8fCAidmlldyBub3RlIikuc3Vic3RyaW5nKC0zMCkKICAgICAgICAgIGNvbnN0IGlkID0gIml0ZW1fIiArICgrK2lkY291bnRlcikKICAgICAgICAgIGNvbnN0IGNvbnRlbnRlbGVtZW50cyA9ICc8ZGl2IGNsYXNzPSJ0eXBlIj4nICsgdHlwZSArICc8L2Rpdj48YSBjbGFzcz0ibGlrZScgKyAoaXRlbS5yZWFjdGVkID8gJyByZWFjdGVkJyA6ICcnKSArICciIGRhdGEtaXRlbS1pZD0iJyArIGlkICsgCiAgICAgICAgICAgICciIGhyZWY9IiMiPicgKyBxcygiI3RlbXBsYXRlIC5oZWFydHN2ZyIpLm91dGVySFRNTCArICc8L2E+PGEgY2xhc3M9InF1ZXJ5IiBocmVmPSInICsgcHJvdG9jb2wgKyAKICAgICAgICAgICAgaXRlbS5iZWNoMzJpZCArICciPicgKyB0ZXh0ICsgJzwvYT4nCiAgICAgICAgICBsZXQgcm9vdCA9IG51bGwKICAgICAgICAgIGxldCB2ID0gbnVsbAogICAgICAgICAgCiAgICAgICAgICBpZihpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KSl7CiAgICAgICAgICAgIHJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKQogICAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoInZpZGVvLWNvbnRhaW5lciIpCiAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MID0gY29udGVudGVsZW1lbnRzCiAgICAgICAgICAgIAogICAgICAgICAgICB2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKQogICAgICAgICAgICB2WyJkYXRhLWl0ZW0taWQiXSA9IGlkCiAgICAgICAgICAgIHYucHJlbG9hZCA9ICJub25lIgogICAgICAgICAgICB2Lmxvb3AgPSB0cnVlCiAgICAgICAgICAgIHYucGxheXNpbmxpbmUgPSAiIgogICAgICAgICAgICAKICAgICAgICAgICAgdi5vbmNhbnBsYXkgPSBhc3luYyBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICBjb25zdCBhc3BlY3QgPSB0aGlzLnZpZGVvV2lkdGggLyB0aGlzLnZpZGVvSGVpZ2h0CiAgICAgICAgICAgICAgaWYoYXNwZWN0ID4gMSl7CiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLndpZHRoID0gKGFzcGVjdCAqIDEwMCkgKyAiJSIKICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUuaGVpZ2h0ID0gKDEgLyBhc3BlY3QgKiAxMDApICsgIiUiCiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLm1hcmdpblRvcCA9IC0oKDEgLyBhc3BlY3QgKiAxMDAgLSAxMDApIC8gMikgKyAiJSIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgdXBkYXRldmlkZW9wbGF5KHRoaXMpCiAgICAgICAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnN0IGV4dCA9IGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpWzFdCiAgICAgICAgICAgIHYuaW5uZXJIVE1MID0gJzxzb3VyY2Ugc3JjPSInICsgaXRlbS51cmwgKyAnIiB0eXBlPSJ2aWRlby8nICsgZXh0ICsgJyI+PC9zb3VyY2U+JwogICAgICAgICAgICAKICAgICAgICAgICAgcm9vdC5hcHBlbmQodikKICAgICAgICAgIH1lbHNlIGlmKGl0ZW0udXJsLm1hdGNoKGltZ2V4dHJlZ2V4KSl7CiAgICAgICAgICAgIHJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIikKICAgICAgICAgICAgcm9vdC5ocmVmID0gIiMiCiAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MID0gY29udGVudGVsZW1lbnRzCiAgICAgICAgICAgICAgCiAgICAgICAgICAgIGlmKHR5cGUgPT0gInBpYyIpewogICAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MICs9ICc8aW1nIG9ubG9hZD0iZ2lkKFwnJyArIGlkICsgJ1wnKS5zdHlsZS5kaXNwbGF5PVwnYmxvY2tcJyIgc3JjPSInICsgaXRlbS51cmwgKyAnIi8+JwogICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICByb290LmlubmVySFRNTCArPSAnPHNwYW4gY2xhc3M9ImZpbGUiPicgKyBpdGVtLnVybCArICc8L3NwYW4+JwogICAgICAgICAgICB9CiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHJvb3QuaWQgPSBpZAogICAgICAgICAgcm9vdFsiZGF0YS1pdGVtIl0gPSBpdGVtCiAgICAgICAgICByb290WyJkYXRhLWV2ZW50Il0gPSBpdGVtLmV2ZW50CiAgICAgICAgICByb290WyJkYXRhLXF1ZXJ5Il0gPSBxCiAgICAgICAgICByb290WyJkYXRhLXRleHQiXSA9IHRleHQKICAgICAgICAgIAogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKHR5cGUpCiAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoIml0ZW0iKQogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJzaG93IikKICAgICAgICAgIAogICAgICAgICAgaWYoaXRlbS5yZWFjdGVkKXsKICAgICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgcXMoIiNwaWNzIilbYXBwZW5kICYmICJhcHBlbmQiIHx8ICJwcmVwZW5kIl0ocm9vdCkKICAgICAgICAgIAogICAgICAgICAgaWYodil7CiAgICAgICAgICAgIHVwZGF0ZXZpZGVvcGxheSh2KQogICAgICAgICAgfQogICAgICAgIH0pCgogICAgICAgIGlmKGFjdGl2ZSgpID09IG51bGwpewogICAgICAgICAgcXMoIiNwaWNzIC5pdGVtIik/LmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgfQogICAgICB9CgogICAgICBmdW5jdGlvbiBoaWRlbWVkaWEoKXsKICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gInNjcm9sbCIKICAgICAgICBxc2EoIiNtZWRpYS1jb250YWluZXIsICNwaWMsICNtZWRpYS1mb290ZXIiKS5mb3JFYWNoKG4gPT4gbi5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiKQogICAgICAgIGdpZCgicGljLWxpa2UiKS5jbGFzc0xpc3QucmVtb3ZlKCJyZWFjdGVkIikKICAgICAgICBoaWRldmlkZW8oKQogICAgICB9CgogICAgICBmdW5jdGlvbiBoaWRldmlkZW8oKXsKICAgICAgICBjb25zdCB2ID0gcXMoIiNtZWRpYS1jb250YWluZXIgdmlkZW8iKQogICAgICAgIAogICAgICAgIGlmKHYpewogICAgICAgICAgdi5tdXRlZCA9IHRydWUKICAgICAgICAgIGdpZCh2WyJkYXRhLWl0ZW0taWQiXSkuYXBwZW5kQ2hpbGQodikKICAgICAgICAgIHVwZGF0ZXZpZGVvcGxheSh2KQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gd2FpdHJlcyhrZXkpewogICAgICAgIGxldCBldmVudHMgPSBbXQogICAgICAgIAogICAgICAgIGxldCByZXNoYW5kbGVyID0gZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXsKICAgICAgICAgIHRoaXMuaGFuZGxlID0gZnVuY3Rpb24ocmVzKXsKICAgICAgICAgICAgbGV0IG8gPSBKU09OLnBhcnNlKHJlcy5kYXRhKQogICAgICAgICAgICBpZihvWzFdID09IGtleSl7CiAgICAgICAgICAgICAgaWYob1swXSA9PSAiRU9TRSIpewogICAgICAgICAgICAgICAgcmVzb2x2ZShldmVudHMpCiAgICAgICAgICAgICAgICByZXNoYW5kbGVycy5zcGxpY2UocmVzaGFuZGxlcnMuaW5kZXhPZih0aGlzKSwgMSkKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgZXZlbnRzLnB1c2gob1syXSkKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAgIAogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICByZXNoYW5kbGVycy5wdXNoKG5ldyByZXNoYW5kbGVyKHJlc29sdmUsIHJlamVjdCkpCiAgICAgICAgfSkKICAgICAgfQogICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGNoZWNrdXBkYXRlKHNvY2tldCl7CiAgICAgICAgY29uc3QgdXBkYXRlc3JlcyA9IGF3YWl0IHF1ZXJ5cHVia2V5KHNvY2tldCwgdXBkYXRlc3B1YmtleSkKICAgICAgICBjb25zdCB1cGRhdGVub3RlID0gdXBkYXRlc3Jlcy5maW5kKG4gPT4gbi5jb250ZW50Lm1hdGNoKC9eaHR0cHNcOlwvXC8vKSkKICAgICAgICAKICAgICAgICBpZighdXBkYXRlbm90ZSl7CiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgYWdlID0gTWF0aC5yb3VuZCgoRGF0ZS5ub3coKSAvIDEwMDAgLSB1cGRhdGVub3RlLmNyZWF0ZWRfYXQpIC8gMzYwMCAvIDI0KQogICAgICAgIGNvbnN0IG5vdGVpZCA9IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKHVwZGF0ZW5vdGUuaWQpKQogICAgICAgIHFzKCIjcmVsZWFzZSIpLmhyZWYgPSBwcm90b2NvbCArIG5vdGVpZAogICAgICAgIHFzKCIjcmVsZWFzZSIpLmlubmVyVGV4dCA9IChhZ2UgPT0gMCAmJiAidG9kYXkiIHx8IGFnZSArICIgZGF5KHMpIGFnbyIpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNsZWVwKG1zKXsKICAgICAgICByZXR1cm4gbmV3IGZ1bmN0aW9uKCl7CiAgICAgICAgICBsZXQgdGltZW91dCA9IG51bGwKICAgICAgICAgIGxldCByID0gbnVsbAogICAgICAgICAgCiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBwcm9taXNlOiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewogICAgICAgICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoKSwgbXMpCiAgICAgICAgICAgICAgciA9IHJlc29sdmUKICAgICAgICAgICAgfSksCiAgICAgICAgICAgIHJlc29sdmU6IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpCiAgICAgICAgICAgICAgcigpCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNob3coaWQpewogICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIgogICAgICAgIGNvbnN0IGl0ZW0gPSBnaWQoaWQpWyJkYXRhLWl0ZW0iXQogICAgICAgIGNvbnN0IG1lZGlhID0gZ2lkKCJtZWRpYS1jb250YWluZXIiKQogICAgICAgIGNvbnN0IHBpYyA9IGdpZCgicGljIikKCiAgICAgICAgaWYoaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleCkpewogICAgICAgICAgcGljLnN0eWxlLmRpc3BsYXkgPSAibm9uZSIKICAgICAgICAgIGNvbnN0IHYgPSBnaWQoaWQpLnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAgIHFzKCIjbWVkaWEtY29udGFpbmVyIikuYXBwZW5kQ2hpbGQodikKICAgICAgICAgIHYubXV0ZWQgPSBmYWxzZQogICAgICAgICAgdi5wbGF5KCkKICAgICAgICB9ZWxzZXsKICAgICAgICAgIHBpYy5zcmMgPSBpdGVtLnVybAogICAgICAgICAgcGljLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGl0ZW0ubWV0YSl7CiAgICAgICAgICBjb25zdCBtZXRhY29udGVudCA9IEpTT04ucGFyc2UoaXRlbS5tZXRhLmNvbnRlbnQpCiAgICAgICAgICBjb25zdCBuYW1lID0gbWV0YWNvbnRlbnQuZGlzcGxheV9uYW1lIHx8IG1ldGFjb250ZW50Lm5hbWUKICAgICAgICAgIHFzKCIjcGljLXVzZXIiKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgICAgcXMoIiNwaWMtdXNlciIpLmhyZWYgPSBwcm90b2NvbCArIGJlY2gzMi5lbmNvZGUoIm5wdWIiLCBmcm9tSGV4U3RyaW5nKGl0ZW0ubWV0YS5wdWJrZXkpKQogICAgICAgICAgcXMoIiNwaWMtdXNlciIpLmlubmVyVGV4dCA9IG5hbWUKICAgICAgICB9ZWxzZXsKICAgICAgICAgIHFzKCIjcGljLXVzZXIiKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiCiAgICAgICAgfQoKICAgICAgICBnaWQoInBpYy1saWtlIilbImRhdGEtaXRlbS1pZCJdID0gaWQKICAgICAgICBnaWQoIm1lZGlhLWZvb3RlciIpWyJkYXRhLWV2ZW50Il0gPSBpdGVtLmV2ZW50CgogICAgICAgIGlmKGl0ZW0ucmVhY3RlZCl7CiAgICAgICAgICBnaWQoInBpYy1saWtlIikuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGEgPSBxcygiI3BpYy1xdWVyeSIpCiAgICAgICAgYS5ocmVmID0gcHJvdG9jb2wgKyBpdGVtLmJlY2gzMmlkCiAgICAgICAgYS5pbm5lclRleHQgPSBnaWQoaWQpWyJkYXRhLXRleHQiXQogICAgICAgICAgCiAgICAgICAgbWVkaWEuc3R5bGUuZGlzcGxheSA9IGdpZCgibWVkaWEtZm9vdGVyIikuc3R5bGUuZGlzcGxheSA9ICJibG9jayIKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gY29ubmNvdW50KCl7CiAgICAgICAgcmV0dXJuIHNvY2tldHMuZmlsdGVyKHIgPT4gci5yZWFkeVN0YXRlID09IDEpLmxlbmd0aAogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBkaXNjb25uZWN0KCl7CiAgICAgICAgZm9yKGxldCBzb2NrZXQgb2Ygc29ja2V0cyl7CiAgICAgICAgICBzb2NrZXQuY2xvc2UoKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXRzLnNwbGljZSgwKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBsb2cobXNnKXsKICAgICAgICBsZXQgc2Nyb2xsID0gcXMoIiNsb2dzIikuc2Nyb2xsVG9wID09IHFzKCIjbG9ncyIpLnNjcm9sbFRvcE1heAogICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCiAgICAgICAgZGl2LmlubmVyVGV4dCA9IEFycmF5LmZyb20oYXJndW1lbnRzKS5qb2luKCIgIikKICAgICAgICBxcygiI2xvZ3MiKS5hcHBlbmQoZGl2KQogICAgICAgIAogICAgICAgIHNjcm9sbCAmJiBxcygiI2xvZ3MiKS5zY3JvbGxUbygwLCBxcygiI2xvZ3MiKS5zY3JvbGxUb3BNYXgpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGNvbm5lY3QodXJsKXsKICAgICAgICBsb2coImNvbm5lY3RpbmciLCB1cmwpCiAgICAgICAgbGV0IHNvY2tldCA9IG5ldyBXZWJTb2NrZXQodXJsKQogICAgICAgIAogICAgICAgIHNvY2tldC5vbm1lc3NhZ2UgPSBtZXNzYWdlID0+IHJlc2hhbmRsZXJzLmZvckVhY2gocmggPT4gcmguaGFuZGxlKG1lc3NhZ2UpKQogICAgICAgIAogICAgICAgIHNvY2tldC5vbmNsb3NlID0gYXN5bmMgZnVuY3Rpb24oKXsKICAgICAgICAgIHNvY2tldHMuc3BsaWNlKHNvY2tldHMuaW5kZXhPZihzb2NrZXQpLCAxKQogICAgICAgICAgcXMoIiNjb25uY291bnQiKS5pbm5lclRleHQgPSBjb25uY291bnQoKSArIChwcmltYWxzb2NrZXQgJiYgMSkKICAgICAgICAgIGxvZygiZGlzY29ubmVjdGVkIiwgdGhpcy51cmwsIGNvbm5jb3VudCgpKQogICAgICAgICAgYXdhaXQgc2xlZXAoMTAwMCkucHJvbWlzZQogICAgICAgICAgY29ubmVjdCh0aGlzLnVybCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc29ja2V0Lm9ub3BlbiA9IGZ1bmN0aW9uKCl7CiAgICAgICAgICBxcygiI2Nvbm5jb3VudCIpLmlubmVyVGV4dCA9IGNvbm5jb3VudCgpICsgKHByaW1hbHNvY2tldCAmJiAxKQogICAgICAgICAgbG9nKCJjb25uZWN0ZWQiLCB0aGlzLnVybCwgY29ubmNvdW50KCkpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiBzb2NrZXQKICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIGFzeW5jICgpID0+IHsKICAgICAgICBwcmltYWxzb2NrZXQgPSBjb25uZWN0KCJ3c3M6Ly9jYWNoZTMucHJpbWFsLm5ldC9jYWNoZTE3IikKICAgICAgICBwcmltYWxzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcigib3BlbiIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICBwcmltYWxnbG9iYWwodGhpcykKICAgICAgICB9KQogICAgICAgIAogICAgICAgIHByaW1hbHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICBwcmltYWxzb2NrZXQgPSBudWxsCiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBmb3IobGV0IHVybCBvZiByZWxheXMoKSl7CiAgICAgICAgICBjb25zdCBzb2NrZXQgPSBjb25uZWN0KHVybCkKICAgICAgICAgIHNvY2tldHMucHVzaChzb2NrZXQpCiAgICAgICAgICAKICAgICAgICAgIHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgY2hlY2t1cGRhdGUodGhpcykKICAgICAgICAgICAgcXVlcnkodGhpcykKICAgICAgICAgIH0pCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGF3YWl0IHNsZWVwKDEwMCkucHJvbWlzZQogICAgICAgIAogICAgICAgIGlmKGhhc2tleSgpKXsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgibm9zdHIiKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGZvcihsZXQgYyBvZiBjb2xvcHRzKXsKICAgICAgICBkb2N1bWVudC53cml0ZSgnPHN0eWxlPicgKyBjb2xzY3NzLmlubmVyVGV4dC5yZXBsYWNlKC9cJFx7Y29sc1x9L2csIGMpICsgJzwvc3R5bGU+JykKICAgICAgfQogICAgPC9zY3JpcHQ+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==
https://ipfs.io/ipfs/QmeG4zvZbpzoQUpdnYetpHHrrGYqKAQGozmcp7met5sxzo
sha256
b37bf43a370d16866fcc06520013623c8a766a95697b95eacde3e2c1f31760b0 files.html
base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyIvPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL3N2Z2ljb25zLnNwYXJray5mci9zdmdpY29ucy5jc3MiLz4KICAgIDxzdHlsZT4KICAgICAgKiB7CiAgICAgICAgb3ZlcnNjcm9sbC1iZWhhdmlvci15OiBjb250YWluOwogICAgICB9CiAgICAgIAogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksIAogICAgICAjaGVhZGVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncywgCiAgICAgICNwcml2a2V5IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncyB7CiAgICAgICAgaGVpZ2h0OiA2ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNsb2dzIHsKICAgICAgICBoZWlnaHQ6IDhlbTsKICAgICAgICBvdmVyZmxvdzogc2Nyb2xsOwogICAgICAgIGZvbnQtc2l6ZTogLjhlbTsKICAgICAgfQogICAgICAKICAgICAgc2VsZWN0IHsKICAgICAgICB3aWR0aDogNGVtOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLCAKICAgICAgaW5wdXQuc3VibWl0IHsKICAgICAgICBib3JkZXItcmFkaXVzOiAuNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0LCAKICAgICAgI2hlYWRlciBhLAogICAgICAjbWVkaWEtY29udGFpbmVyIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLCAKICAgICAgZm9ybSwgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHotaW5kZXg6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgIAogICAgICBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDMwZW0pIHsKICAgICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgfQogICAgICB9CgogICAgICBmb3JtIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeSB7CiAgICAgICAgd2lkdGg6IDZlbTsKICAgICAgfQogICAgICAKICAgICAgI2xvYWRpbmcgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMHB4OwogICAgICAgIGxlZnQ6IDI3ZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgIGEgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgfQoKICAgICAgdmlkZW8gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogIAogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgIGhlaWdodDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgIG1hcmdpbi10b3A6IDAgIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgLnR5cGUgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICB6LWluZGV4OiAxOwogICAgICB9CiAgICAgIAogICAgICAjcGljLXF1ZXJ5IHsKICAgICAgICB3aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5LAogICAgICBhLAogICAgICBpbnB1dC5zdWJtaXQgewogICAgICAgIGNvbG9yOiAjOTk5OwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICBwYWRkaW5nOiAwIDFlbTsKICAgICAgfQoKICAgICAgI3F1ZXJ5ZGlzcGxheSAudGV4dCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIG1pbi13aWR0aDogM2VtOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgYSwKICAgICAgI2hlYWRlciBzcGFuIHsKICAgICAgICBwYWRkaW5nOiAwLjVlbTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQoKICAgICAgI2hlYWRlciB7CiAgICAgICAgcGFkZGluZzogMC40NWVtIDA7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQoKICAgICAgI2hlYWRlciAuaXRlbXMgewogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICB9CiAgICAgIAogICAgICAjaGVhZGVyIC5pdGVtcyB7CiAgICAgICAgbWFyZ2luLXRvcDogLjNlbTsKICAgICAgfQoKICAgICAgcCB7CiAgICAgICAgbWFyZ2luLXRvcDogMDsKICAgICAgfQogICAgICAKICAgICAgLmxhYmVsIHsKICAgICAgICBwYWRkaW5nOiAuOGVtIC44ZW0gLjhlbSAwOwogICAgICB9CgogICAgICAjcGljcyAucXVlcnkgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgfQoKICAgICAgI21lZGlhLWNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDApOwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgei1pbmRleDogNDsKICAgICAgfQogICAgICAKICAgICAgI3BpYy1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAKICAgICAgI3BpYyB7CiAgICAgICAgbWF4LXdpZHRoOiAxMDB2dzsKICAgICAgICBtYXgtaGVpZ2h0OiAxMDB2aDsKICAgICAgfQogICAgICAgIAogICAgICAjcGljcyB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgICAKICAgICAgI3BpY3MgPiBhLCAKICAgICAgI3BpY3MgaW1nLAogICAgICAjcGljcyAuZmlsZSwKICAgICAgI3BpY3MgLnZpZGVvLWNvbnRhaW5lciB7CiAgICAgICAgd2lkdGg6IDI1dnc7CiAgICAgIH0KCiAgICAgICNwaWNzID4gYSwKICAgICAgI3BpY3MgLmZpbGUsCiAgICAgICNwaWNzIC52aWRlby1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMjV2dzsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIGJvcmRlcjogMC4zZW0gc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMC4zZW07CiAgICAgICAgbWFyZ2luOiAtMC4zZW07CiAgICAgIH0KCiAgICAgICNwaWNzID4gLmZpbGUgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIAogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CiAgICAgIAogICAgICBib2R5Om5vdCgubm9zdHIpICNmaWx0ZXItbGlrZXMsIAogICAgICAuZmlsdGVyLWxpa2VzICNwaWNzID4gLml0ZW06bm90KC5yZWFjdGVkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgei1pbmRleDogMjsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3Z3OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHBhZGRpbmc6IDAgMXZ3OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNwaWMtcXVlcnkgewogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBmb250LXNpemU6IG1pbigzLjV2dywgMS41ZW0pOwogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsMC42KTsKICAgICAgICBtYXgtd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgI3BpYy1xdWVyeSB7CiAgICAgICAgcGFkZGluZzogLjZlbSAuNGVtIC4xZW0gLjRlbTsKICAgICAgICBtYXgtd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgLmxpa2UucmVhY3RlZCwKICAgICAgLmZpbHRlci1saWtlcyAjZmlsdGVyLWxpa2VzIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7CiAgICAgIH0KCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgZm9udC1zaXplOiAzZW07CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciwKICAgICAgI21lZGlhLWZvb3RlciAubGlrZSB7CiAgICAgICAgei1pbmRleDogNTsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgYm90dG9tOiAxLjllbTsKICAgICAgICBmb250LXNpemU6IDEuOGVtOwogICAgICAgIHBhZGRpbmctcmlnaHQ6IC42NWVtOwogICAgICAgIG1heC13aWR0aDogOGVtOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9CiAgICAgIAogICAgICAubGlrZSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiBhdXRvOwogICAgICAgIHBhZGRpbmc6IC4yZW07CiAgICAgICAgd2lkdGg6IDFlbTsKICAgICAgICBoZWlnaHQ6IDFlbTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CgogICAgICAubm9zdHIgLmxpa2UgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOyAgCiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgLmxpa2UgewogICAgICAgIGZvbnQtc2l6ZTogMi40ZW07CiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgewogICAgICAgIGRpc3BsYXk6IG5vbmU7ICAKICAgICAgfQogIAogICAgICAjcGljcyBpbWcgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgLmFjdGl2ZSB7CiAgICAgICAgYmFja2dyb3VuZDogIzQ0NDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI3BpY3MgPiAuYWN0aXZlIHsKICAgICAgICBib3JkZXItY29sb3I6IGdyZWVuOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KCiAgICAgIC5oZWFydHN2ZyBwYXRoIHsKICAgICAgICBzdHJva2U6ICNmZmY7CiAgICAgIH0KICAKICAgICAgYSNtZW51LCBhI2ZpbHRlci1saWtlcyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luLXRvcDogLS4zZW07CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgfQoKICAgICAgYSNtZW51IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBwYWRkaW5nOiAwIC4zZW0gMCAuNWVtOwogICAgICAgIGhlaWdodDogMi4xZW07CiAgICAgIH0KICAgICAgCiAgICAgIGEjZmlsdGVyLWxpa2VzIHsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB3aWR0aDogMS41ZW07CiAgICAgICAgaGVpZ2h0OiAxLjVlbTsKICAgICAgICBtYXJnaW46IC4xZW0gLjVlbTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgIH0KICAgICAgCiAgICAgIGEjZmlsdGVyLWxpa2VzIHN2ZyB7CiAgICAgICAgd2lkdGg6IDEuNWVtOwogICAgICAgIGhlaWdodDogMS41ZW07CiAgICAgIH0KICAgICAgIAogICAgICAubWVudXN2ZyB7CiAgICAgICAgd2lkdGg6IDJlbTsKICAgICAgICBoZWlnaHQ6IDJlbTsKICAgICAgfQoKICAgICAgLm1lbnVzdmcgcGF0aCB7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBtYXJnaW4tbGVmdDogLTE4ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzIyMjsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgei1pbmRleDogMzsgCiAgICAgICAgb3ZlcmZsb3c6IHNjcm9sbDsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudC5vcGVuIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgewogICAgICAgIHBhZGRpbmc6IDAgMWVtIDFlbSAxZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIGEsCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgcGFkZGluZzogLjVlbSAuN2VtOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHotaW5kZXg6IDM7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIG9wYWNpdHk6IC41OwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5Lm9wZW4gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIAogICAgICBzdmcsIAogICAgICBpbWcsIAogICAgICAudmlkZW8gdmlkZW8gewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAjdGVtcGxhdGUgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGRpdiBpZD0idGVtcGxhdGUiPgogICAgICA8c3ZnIGNsYXNzPSJoZWFydHN2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KICAgICAgICA8cGF0aCBkPSJNOS43MTksMTcuMDczbC02LjU2Mi02LjUxYy0wLjI3LTAuMjY4LTAuNTA0LTAuNTY3LTAuNjk2LTAuODg4QzEuMzg1LDcuODksMS42Nyw1LjYxMywzLjE1NSw0LjE0YzAuODY0LTAuODU2LDIuMDEyLTEuMzI5LDMuMjMzLTEuMzI5YzEuOTI0LDAsMy4xMTUsMS4xMiwzLjYxMiwxLjc1MmMwLjQ5OS0wLjYzNCwxLjY4OS0xLjc1MiwzLjYxMi0xLjc1MmMxLjIyMSwwLDIuMzY5LDAuNDcyLDMuMjMzLDEuMzI5YzEuNDg0LDEuNDczLDEuNzcxLDMuNzUsMC42OTMsNS41MzdjLTAuMTksMC4zMi0wLjQyNSwwLjYxOC0wLjY5NSwwLjg4N2wtNi41NjIsNi41MUMxMC4xMjUsMTcuMjI5LDkuODc1LDE3LjIyOSw5LjcxOSwxNy4wNzMgTTYuMzg4LDMuNjFDNS4zNzksMy42MSw0LjQzMSw0LDMuNzE3LDQuNzA3QzIuNDk1LDUuOTIsMi4yNTksNy43OTQsMy4xNDUsOS4yNjVjMC4xNTgsMC4yNjUsMC4zNTEsMC41MSwwLjU3NCwwLjczMUwxMCwxNi4yMjhsNi4yODEtNi4yMzJjMC4yMjQtMC4yMjEsMC40MTYtMC40NjYsMC41NzMtMC43MjljMC44ODctMS40NzIsMC42NTEtMy4zNDYtMC41NzEtNC41NkMxNS41Nyw0LDE0LjYyMSwzLjYxLDEzLjYxMiwzLjYxYy0xLjQzLDAtMi42MzksMC43ODYtMy4yNjgsMS44NjNjLTAuMTU0LDAuMjY0LTAuNTM2LDAuMjY0LTAuNjksMEM5LjAyOSw0LjM5Nyw3LjgyLDMuNjEsNi4zODgsMy42MSI+PC9wYXRoPgogICAgICA8L3N2Zz4KICAgICAgPGRpdiBpZD0iY29sc2NzcyI+CiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyAuaXRlbSB7CiAgICAgICAgd2lkdGg6IGNhbGMoMTAwdncgLyAke2NvbHN9KTsKICAgICAgfQoKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzIC5pdGVtIHsKICAgICAgICBoZWlnaHQ6IGNhbGMoMTAwdncgLyAke2NvbHN9KTsKICAgICAgfQogICAgICAKICAgICAgLmNvbHMke2NvbHN9IC5xdWVyeSwKICAgICAgLmNvbHMke2NvbHN9IC5saWtlIHsKICAgICAgICBmb250LXNpemU6IG1pbigxNHZ3ICogKDEgLyAke2NvbHN9KSwgNmVtICogKDEgLyAke2NvbHN9KSkKICAgICAgfQogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0ibWVkaWEtZm9vdGVyIj4KICAgICAgPGEgaWQ9InBpYy1saWtlIiBjbGFzcz0ibGlrZSIgaHJlZj0iIyI+PC9hPgogICAgICA8YSBpZD0icGljLXF1ZXJ5IiBocmVmPSIjIj48L2E+CiAgICAgIDxhIGlkPSJwaWMtdXNlciIgaHJlZj0iIyI+PC9hPgogICAgPC9kaXY+CiAgICA8Y2VudGVyIGlkPSJtZWRpYS1jb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJwaWMtY29udGFpbmVyIj4KICAgICAgICA8aW1nIGlkPSJwaWMiLz4KICAgICAgPC9kaXY+CiAgICA8L2NlbnRlcj4KICAgIDxkaXYgaWQ9Im1lbnUtb3ZlcmxheSI+PC9kaXY+CiAgICA8ZGl2IGlkPSJtZW51LWNvbnRlbnQiIGNsYXNzPSJ0ZXN0Ij4KICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5hdXRvcGxheTwvZGl2PgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0ib24iIGhyZWY9IiMiPm9uPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0ib2ZmIiBocmVmPSIjIj5vZmY8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJob3ZlciIgaHJlZj0iIyI+bW91c2VvdmVyPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5jb2x1bW5zPC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMSIgaHJlZj0iIyI+MTwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSIyIiBocmVmPSIjIj4yPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjQiIGhyZWY9IiMiPjQ8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iNiIgaHJlZj0iIyI+NjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSIxMCIgaHJlZj0iIyI+MTA8L2E+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmNvbm5lY3Rpb25zPC9kaXY+CiAgICAgICAgPGRpdiBpZD0iY29ubmNvdW50Ij4wPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPnJlbGF5czo8L2Rpdj4KICAgICAgICA8cD5QbGVhc2UgdXNlIHJlbGF5cyB3aXRoIE5JUC01MCAoc2VhcmNoKSBmdW5jdGlvbmFsaXR5PC9wPgogICAgICAgIDxmb3JtIGFjdGlvbj0iIyIgaWQ9InJlbGF5cy1mb3JtIj4KICAgICAgICAgIDx0ZXh0YXJlYSBpZD0icmVsYXlzIj48L3RleHRhcmVhPgogICAgICAgICAgPGlucHV0IGNsYXNzPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9InNhdmUgcmVsYXlzIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5wcml2YXRlIGtleTo8L2Rpdj4KICAgICAgICA8cD5JZiB5b3UgY2FudCB1c2UgYnJvd3NlciBhZGRvbiAobW9iaWxlKTwvcD4KICAgICAgICA8Zm9ybSBhY3Rpb249IiMiIGlkPSJwcml2a2V5LWZvcm0iPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJwcml2a2V5Ii8+CiAgICAgICAgICA8aW5wdXQgY2xhc3M9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0ic2F2ZSBrZXkiLz4KICAgICAgICA8L2Zvcm0+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmxvZ3M8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJsb2dzIj48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+bGF0ZXN0IHJlbGVhc2U6PC9kaXY+CiAgICAgICAgPGEgaWQ9InJlbGVhc2UiIGhyZWY9IiMiPjwvYT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9ImhlYWRlciI+CiAgICAgIDxhIGlkPSJmaWx0ZXItbGlrZXMiIGhyZWY9IiMiPjwvYT4KICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxhIGlkPSJtZW51IiBocmVmPSIjIj4KICAgICAgICAgIDxzdmcgY2xhc3M9Im1lbnVzdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJICAgICAgICA8cGF0aCBkPSJNMTAsMS40NDVjLTQuNzI2LDAtOC41NTUsMy44MjktOC41NTUsOC41NTVjMCw0LjcyNSwzLjgyOSw4LjU1NSw4LjU1NSw4LjU1NWM0LjcyNSwwLDguNTU1LTMuODMsOC41NTUtOC41NTVDMTguNTU1LDUuMjc0LDE0LjcyNSwxLjQ0NSwxMCwxLjQ0NSBNMTAsMTcuNjU0Yy00LjIyMSwwLTcuNjU0LTMuNDM0LTcuNjU0LTcuNjU0YzAtNC4yMjEsMy40MzMtNy42NTQsNy42NTQtNy42NTRjNC4yMjIsMCw3LjY1NCwzLjQzMyw3LjY1NCw3LjY1NEMxNy42NTQsMTQuMjIxLDE0LjIyMiwxNy42NTQsMTAsMTcuNjU0IE0xNC4zOSwxMGMwLDAuMjQ4LTAuMjAzLDAuNDUtMC40NSwwLjQ1SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMy0wLjQ1LTAuNDVzMC4yMDMtMC40NSwwLjQ1LTAuNDVoNy44NzlDMTQuMTg3LDkuNTUsMTQuMzksOS43NTIsMTQuMzksMTAgTTE0LjM5LDEyLjcwMmMwLDAuMjQ3LTAuMjAzLDAuNDQ5LTAuNDUsMC40NDlINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAyLTAuNDUtMC40NDljMC0wLjI0OCwwLjIwMy0wLjQ1MSwwLjQ1LTAuNDUxaDcuODc5QzE0LjE4NywxMi4yNTEsMTQuMzksMTIuNDU0LDE0LjM5LDEyLjcwMiBNMTQuMzksNy4yOThjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw2Ljg0OCwxNC4zOSw3LjA1MSwxNC4zOSw3LjI5OCI+PC9wYXRoPgoJICAgICAgICA8L3N2Zz4KICAgICAgICA8L2E+CiAgICAgICAgPGEgaWQ9InRpdGxlIiBocmVmPSIjIj5maWxlcy5odG1sPC9hPgogICAgICAgIDxmb3JtIGlkPSJxdWVyeS1mb3JtIiBhY3Rpb249IiMiPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJxdWVyeSIgbmFtZT0icXVlcnkiIGlkPSIiIC8+CiAgICAgICAgICA8c2VsZWN0IGlkPSJxdWVyeS10eXBlIj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iYWxsIj5hbGw8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaW1hZ2UiPmltYWdlczwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ2aWRlbyI+dmlkZW9zPC9vcHRpb24+CiAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgIDxpbnB1dCBpZD0iZ28iIHR5cGU9InN1Ym1pdCIgdmFsdWU9ImdvIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxzcGFuIGlkPSJxdWVyeWRpc3BsYXkiPgogICAgICAgICAgPHNwYW4gY2xhc3M9InRleHQiPjwvc3Bhbj4KICAgICAgICA8L3NwYW4+CiAgICAgICAgPGRpdiBpZD0ibG9hZGluZyI+dXBkYXRpbmc8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9InBpY3MiPjwvZGl2PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vdW5wa2cuY29tL25vc3RyLXRvb2xzL2xpYi9ub3N0ci5idW5kbGUuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vc2xvd2xpLmdpdGh1Yi5pby9iZWNoMzItYnVmZmVyL2Fzc2V0cy9qcy9iZWNoMzItYnVmZmVyLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0PgogICAgICBjb25zdCB1cGRhdGVzcHVia2V5ID0gImFlNWM2ZTBiNzQ2NjBkMjE5NGM4MjU0YjVjMmM4MjU2NzY1NzZiZTAyOTczNzlmYTIwNTIzMTE0YTZhODVlODciCiAgICAgIGNvbnN0IHF1ZXJpZXMgPSB7CiAgICAgICAgImdsb2JhbCI6ICdbIlJFUSIsIjxJPiIseyJjYWNoZSI6WyJleHBsb3JlIix7InRpbWVmcmFtZSI6ImxhdGVzdCIsInNjb3BlIjoiZ2xvYmFsIiwibGltaXQiOjxMPn1dfV0nLCAKICAgICAgICAiYXV0aG9yIjogJ1siUkVRIiwiPEk+Iix7ImtpbmRzIjpbMV0sImF1dGhvcnMiOlsiPFA+Il19XScsCiAgICAgICAgInJlYWN0aW9ucyI6ICdbIlJFUSIsIjxJPiIsIHsia2luZHMiOls3XSwiI2UiOiA8RT59XScKICAgICAgfQogICAgICBxcygiI3JlbGF5cyIpLnZhbHVlID0gcmVsYXlzKCkuam9pbigiXG4iKQogICAgICBxcygiI3ByaXZrZXkiKS52YWx1ZSA9IHByaXZrZXkoKQogICAgICBjb25zdCBjb2xvcHRzID0gWzEsIDIsIDQsIDYsIDEwXQoKICAgICAgY29scyA9ICgpID0+IHBhcnNlSW50KHNldHRpbmcoImNvbHMiLCBjb2xvcHRzWzFdKSwgMTApCiAgICAgIGF1dG9wbGF5ID0gKCkgPT4gc2V0dGluZygiYXV0b3BsYXkiLCAib2ZmIikKICAgICAgbGltaXQgPSAoKSA9PiBwYXJzZUludChzZXR0aW5nKCJsaW1pdCIsIDE1KSwgMTApCiAgICAgIAogICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgY29scygpKQogICAgICAKICAgICAgbGV0IHByb3RvY29sID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlLykgPyAibm9zdHI6IiA6ICJ3ZWIrbm9zdHI6IgogICAgICBsZXQgc29ja2V0cyA9IFtdCiAgICAgIGxldCByZXNoYW5kbGVycyA9IFtdCiAgICAgIGxldCB1cmxzID0gW10KICAgICAgbGV0IGxpa2VzID0gW10KICAgICAgbGV0IG5ld2xpa2VzID0gW10KICAgICAgbGV0IGlkY291bnRlciA9IDAKICAgICAgbGV0IHF1ZXJ5d2FpdCA9IG51bGwKICAgICAgbGV0IHByaW1hbHNvY2tldCA9IG51bGwKICAgICAgbGV0IHR5cGVzID0gewogICAgICAgIGltYWdlOiBbInBuZyIsICJqcGciLCAianBlZyIsICJ3ZWJwIl0sCiAgICAgICAgdmlkZW86IFsibXA0IiwgIndlYm0iXQogICAgICB9CiAgICAgIGxldCBpbWdyZWdleCA9IC9odHRwKHxzKVw6XC9cL1teIFxuXSo/XC4ocG5nfGpwZ3xqcGVnfHdlYnApL2dpCiAgICAgIGxldCB2aWRlb3JlZ2V4ID0gL2h0dHAofHMpXDpcL1wvW14gXG5dKj9cLihtcDR8d2VibSkvZ2kKICAgICAgbGV0IHZpZGVvZXh0cmVnZXggPSAvXC4obXA0fHdlYm0pJC9pCiAgICAgIGxldCBpbWdleHRyZWdleCA9IC9cLihwbmd8anBnfGpwZWd8d2VicCkkL2kKICAgICAgd2FpdG1zID0gNTAwMAogICAgICBxdWVyeXN0ciA9ICIiCiAgICAgIGxldCBxdWVyeWNvdW50ID0gMAogICAgICBsZXQgaG92ZXJlZHZpZGVvID0gbnVsbAogICAgICAKICAgICAgdXBkYXRlcXVlcnkoKQogICAgICBxcygiI3BpYy1saWtlIikuaW5uZXJIVE1MID0gcXMoIiNmaWx0ZXItbGlrZXMiKS5pbm5lckhUTUwgPSBxcygiI3RlbXBsYXRlIC5oZWFydHN2ZyIpLm91dGVySFRNTAogICAgICBzZXRhY3RpdmUoInNldGNvbHMiLCAiY29scyIsIGNvbHMoKSkKICAgICAgc2V0YWN0aXZlKCJzZXRhdXRvcGxheSIsICJhdXRvcGxheSIsIGF1dG9wbGF5KCkpCiAgICAgIAogICAgICBmdW5jdGlvbiBmcm9tSGV4U3RyaW5nKHN0cil7CiAgICAgICAgbGV0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHN0ci5sZW5ndGggLyAyKQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmZmVyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBidWZmZXJbaV0gPSBwYXJzZUludChzdHIuc3Vic3RyKDIgKiBpLCAyKSwgMTYpCiAgICAgICAgfQogICAgICAgIHJldHVybiBidWZmZXIKICAgICAgfQogIAogICAgICBmdW5jdGlvbiByZWxheXMoKXsKICAgICAgICBjb25zdCBvYmogPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJyZWxheXMiKSkKICAgICAgICBjb25zdCByID0gb2JqICYmIG9iai5maWx0ZXIociA9PiByLm1hdGNoKC93c3M6XC9cLy4rLykpIHx8IFtdCiAgICAgICAgCiAgICAgICAgcmV0dXJuIHIubGVuZ3RoID4gMCAmJiByIHx8IFsKICAgICAgICAgICJ3c3M6Ly9yZWxheS5ub3N0ci5iYW5kIiwKICAgICAgICAgICJ3c3M6Ly9uYi5yZWxheS5jZW50ZXIiLCAKICAgICAgICAgICJ3c3M6Ly9ub3N0ci5jb21waWxlLWVycm9yLm5ldCIKICAgICAgICBdCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHByaXZrZXkoKXsKICAgICAgICBsZXQga2V5ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oInByaXZrZXkiKSB8fCAiIgogICAgICAgIAogICAgICAgIGlmKGtleS5sZW5ndGggPT0gNjMpewogICAgICAgICAga2V5ID0gTm9zdHJUb29scy5uaXAxOS5kZWNvZGUoa2V5KS5kYXRhCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiBrZXkubGVuZ3RoID09IDY0ICYmIGtleSB8fCBudWxsCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNldHRpbmcoa2V5LCBkZWZhdWx0dmFsdWUpewogICAgICAgIGNvbnN0IHYgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpCiAgICAgICAgcmV0dXJuIHYgJiYgb3B0aW9uKCJzZXQiICsga2V5LCBrZXksIHYpICYmIHYgfHwgZGVmYXVsdHZhbHVlCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIG9wdGlvbihjLCBrZXksIHZhbCl7CiAgICAgICAgcmV0dXJuIHFzKCIuIiArIGMgKyAiW2RhdGEtIiArIGtleSArICI9JyIgKyB2YWwgKyAiJ10iKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxcyhxKXsKICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihxKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxc2EocSl7CiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChxKSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gZ2lkKGkpewogICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxdWVyeXR5cGUoKXsKICAgICAgICByZXR1cm4gcXMoIiNxdWVyeS10eXBlIikudmFsdWUgfHwgImFsbCIKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlcXVlcnkoKXsKICAgICAgICBsZXQgcGFydHMgPSBkZWNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaGFzaC5zdWJzdHJpbmcoMSkpLnNwbGl0KCIvIikKICAgICAgICBxdWVyeXN0ciA9IHFzKCIjcXVlcnlkaXNwbGF5IC50ZXh0IikuaW5uZXJUZXh0ID0gcGFydHNbMF0KICAgICAgICBxcygiI3F1ZXJ5IikudmFsdWUgPSBwYXJ0c1swXQogICAgICAgIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlID0gcGFydHNbMV0gfHwgImFsbCIKICAgICAgfQoKICAgICAgZnVuY3Rpb24gYWN0aXZlKCl7CiAgICAgICAgcmV0dXJuIHFzKCIjcGljcyAuYWN0aXZlIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcGljb2Zmc2V0KG9mZnNldCl7CiAgICAgICAgY29uc3QgcGljcyA9IHFzYSgiI3BpY3MgPiAuaXRlbSIpLmZpbHRlcihlID0+IGUuc3R5bGUuZGlzcGxheSA9PSAiYmxvY2siKQogICAgICAgIHJldHVybiBwaWNzW3BpY3MuaW5kZXhPZihhY3RpdmUoKSkrb2Zmc2V0XQogICAgICB9CgogICAgICBmdW5jdGlvbiBsYXN0YWN0aXZlKCl7CiAgICAgICAgcmV0dXJuIHFzYSgiI3BpY3MgLmFjdGl2ZSIpLnBvcCgpICAgICAgCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIG1lbnUoKXsKICAgICAgICBxc2EoIiNtZW51LWNvbnRlbnQsICNtZW51LW92ZXJsYXkiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QudG9nZ2xlKCJvcGVuIikpCiAgICAgIH0KICAKICAgICAgZnVuY3Rpb24gc2V0YWN0aXZlKGMsIGtleSwgdmFsKXsKICAgICAgICBxc2EoIi4iICsgYykuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikpCiAgICAgICAgY29uc3Qgb3B0aW9uID0gcXMoIi4iICsgYyArICJbZGF0YS0iICsga2V5ICsgIj0nIiArIHZhbCArICInXSIpCiAgICAgICAgb3B0aW9uPy5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiB1cGRhdGVhbGx2aWRlb3BsYXkoKXsKICAgICAgICBxc2EoIiNwaWNzIHZpZGVvIikuZm9yRWFjaChhc3luYyB2ID0+IHVwZGF0ZXZpZGVvcGxheSh2KSkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRldmlkZW9wbGF5KHYpewogICAgICAgIGNvbnN0IGFwbGF5ID0gYXV0b3BsYXkoKQogICAgICAgIAogICAgICAgIGlmKGFwbGF5ICE9ICJvbiIpewogICAgICAgICAgdi5tdXRlZCA9IGZhbHNlCiAgICAgICAgICB2LnBhdXNlKCkKICAgICAgICB9ZWxzZXsKICAgICAgICAgIHYubXV0ZWQgPSB0cnVlCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IG4gPSB2LnBhcmVudEVsZW1lbnQKICAgICAgICAKICAgICAgICBpZigobi5vZmZzZXRUb3AgKyBuLm9mZnNldEhlaWdodCkgPCBzY3JvbGxZIAogICAgICAgIHx8IG4ub2Zmc2V0VG9wID4gKHNjcm9sbFkgKyB2aXN1YWxWaWV3cG9ydC5oZWlnaHQpKXsKICAgICAgICAgIGlmKHYucmVhZHlTdGF0ZSA9PSA0KXsKICAgICAgICAgICAgdi5wYXVzZSgpCiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgdi5wcmVsb2FkID0gIm5vbmUiCiAgICAgICAgICB9CiAgICAgICAgfWVsc2UgaWYodi5yZWFkeVN0YXRlICE9IDQpewogICAgICAgICAgdi5wcmVsb2FkID0gImF1dG8iCiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoYXBsYXkgPT0gIm9uIiB8fCAoYXBsYXkgPT0gImhvdmVyIiAmJiB2ID09IGhvdmVyZWR2aWRlbykpewogICAgICAgICAgdi5wbGF5KCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsIGUgPT4gewogICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCkKICAgICAgICB1cGRhdGVhbGx2aWRlb3BsYXkoKQogICAgICB9KQogICAgICAKICAgICAgbGV0IHRvdWNoID0gbnVsbAogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsIGUgPT4gdG91Y2ggPSBlLmNoYW5nZWRUb3VjaGVzWzBdKQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLCBlID0+IHsKICAgICAgICBjb25zdCB4ZGlmZiA9IGUuY2hhbmdlZFRvdWNoZXNbMF0uc2NyZWVuWCAtIHRvdWNoLnNjcmVlblgKCiAgICAgICAgaWYoeGRpZmYgPCAtNTApewogICAgICAgICAgc3dpcGUoMSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoeGRpZmYgPiA1MCl7CiAgICAgICAgICBzd2lwZSgtMSkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBxcygiI3F1ZXJ5LWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBsb2NhdGlvbi5oYXNoID0gIiMiICsgZW5jb2RlVVJJQ29tcG9uZW50KHFzKCIjcXVlcnkiKS52YWx1ZSArICIvIiArIHF1ZXJ5dHlwZSgpKQogICAgICAgIHVwZGF0ZXF1ZXJ5KCkKICAgICAgICBxdWVyeXdhaXQucmVzb2x2ZSgpCiAgICAgIH0pCgogICAgICBxcygiI3JlbGF5cy1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgYXN5bmMgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgbGV0IHIgPSBKU09OLnN0cmluZ2lmeShxcygiI3JlbGF5cyIpLnZhbHVlLnNwbGl0KCJcbiIpKQogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJyZWxheXMiLCByKQogICAgICAgIGRpc2Nvbm5lY3QoKQogICAgICB9KQoKICAgICAgcXMoIiNwcml2a2V5LWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBhc3luYyBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBjb25zdCBrZXkgPSBxcygiI3ByaXZrZXkiKS52YWx1ZQoKICAgICAgICBpZihrZXkubGVuZ3RoICE9IDY0ICYmIGtleS5sZW5ndGggIT0gNjMpewogICAgICAgICAgYWxlcnQoImtleSBzaG91bGQgYmUgNjMgb3IgNjQgY2hhcmFjdGVycyBsb25nIikKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgicHJpdmtleSIsIGtleSkKICAgICAgICBhbGVydCgia2V5IHNhdmVkIikKICAgICAgfSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaWYoYXV0b3BsYXkoKSA9PSAiaG92ZXIiICYmIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygidmlkZW8tY29udGFpbmVyIikpewogICAgICAgICAgaG92ZXJlZHZpZGVvID0gZS50YXJnZXQucXVlcnlTZWxlY3RvcigidmlkZW8iKQogICAgICAgICAgaG92ZXJlZHZpZGVvLnBsYXkoKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IiwgYXN5bmMgKGUpID0+IHsKICAgICAgICBob3ZlcmVkdmlkZW8gPSBmYWxzZQogICAgICAgIGlmKHFzKCIjbWVkaWEtY29udGFpbmVyIikuc3R5bGUuZGlzcGxheSAhPSAiYmxvY2siICYmIGF1dG9wbGF5KCkgPT0gImhvdmVyIiAmJiBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInZpZGVvLWNvbnRhaW5lciIpKXsKICAgICAgICAgIHFzYSgidmlkZW8iKS5mb3JFYWNoKHYgPT4gdi5wYXVzZSgpKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgYXN5bmMgKGUpID0+IHsKICAgICAgICBpZihlLnRhcmdldC50eXBlID09ICJzdWJtaXQiIHx8IChlLnRhcmdldC50YWdOYW1lID09ICJBIiAmJiBlLnRhcmdldC5ocmVmLm1hdGNoKC9eKHx3ZWJcKylub3N0clw6LykpKXsKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJ0aXRsZSIpewogICAgICAgICAgcXMoIiNxdWVyeSIpLnZhbHVlID0gIiIKICAgICAgICAgIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlID0gImFsbCIKICAgICAgICAgIHFzKCIjZ28iKS5jbGljaygpCiAgICAgICAgfQoKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gImZpbHRlci1saWtlcyIpewogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCJmaWx0ZXItbGlrZXMiKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2hvdyIpKXsKICAgICAgICAgIGFjdGl2ZSgpPy5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgZ2lkKGUudGFyZ2V0LmlkKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgc2hvdyhlLnRhcmdldC5pZCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC50YWdOYW1lICE9ICJBIiAmJiAocXMoIiNwaWMtY29udGFpbmVyIikgPT0gZS50YXJnZXQgfHwgcXMoIiNtZWRpYS1jb250YWluZXIgdmlkZW8iKSA9PSBlLnRhcmdldCkpewogICAgICAgICAgaGlkZW1lZGlhKCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gIm1lbnUiIHx8IGUudGFyZ2V0LmlkID09ICJtZW51LW92ZXJsYXkiKXsKICAgICAgICAgIG1lbnUoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNldGNvbHMiKSl7CiAgICAgICAgICBmb3IobGV0IGMgb2YgY29sb3B0cyl7CiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgiY29scyIgKyBjKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgZS50YXJnZXQuZGF0YXNldC5jb2xzKQogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImNvbHMiLCBlLnRhcmdldC5kYXRhc2V0LmNvbHMpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGNvbHMiLCAiY29scyIsIGNvbHMoKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNldGF1dG9wbGF5IikpewogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImF1dG9wbGF5IiwgZS50YXJnZXQuZGF0YXNldC5hdXRvcGxheSkKICAgICAgICAgIHNldGFjdGl2ZSgic2V0YXV0b3BsYXkiLCAiYXV0b3BsYXkiLCBhdXRvcGxheSgpKQogICAgICAgICAgdXBkYXRlYWxsdmlkZW9wbGF5KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoImxpa2UiKSAmJiBsaWtlKGUudGFyZ2V0KQogICAgICB9KQogICAgICAKICAgICAgZnVuY3Rpb24gaGFza2V5KCl7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5ub3N0ciB8fCBwcml2a2V5KCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcHVia2V5KCl7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5ub3N0ciAmJiBhd2FpdCB3aW5kb3cubm9zdHIuZ2V0UHVibGljS2V5KCkgfHwgTm9zdHJUb29scy5nZXRQdWJsaWNLZXkocHJpdmtleSgpKQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBzaWduKGV2ZW50KXsKICAgICAgICBpZih3aW5kb3cubm9zdHIpewogICAgICAgICAgcmV0dXJuIGF3YWl0IG5vc3RyLnNpZ25FdmVudChldmVudCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZXZlbnQuc2lnID0gTm9zdHJUb29scy5nZXRTaWduYXR1cmUoZXZlbnQsIHByaXZrZXkoKSkKICAgICAgICByZXR1cm4gZXZlbnQKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gbGlrZShsaW5rKXsKICAgICAgICBjb25zdCBldmVudCA9IGxpbmsucGFyZW50RWxlbWVudFsiZGF0YS1ldmVudCJdCiAgICAgICAgY29uc3QgcHViayA9IGF3YWl0IHB1YmtleSgpCiAgICAgICAgY29uc3QgbGlrZSA9IGF3YWl0IHNpZ24oewogICAgICAgICAgImtpbmQiOiA3LAogICAgICAgICAgImNvbnRlbnQiOiAiKyIsCiAgICAgICAgICAidGFncyI6IFsKICAgICAgICAgICAgWyJlIiwgZXZlbnQuaWRdLAogICAgICAgICAgICBbInAiLCBldmVudC5wdWJrZXldCiAgICAgICAgICBdLAogICAgICAgICAgInB1YmtleSI6IHB1YmssCiAgICAgICAgICAiY3JlYXRlZF9hdCI6IHBhcnNlSW50KERhdGUubm93KCkgLyAxMDAwICwgMTApCiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBzb2NrZXRzLmZvckVhY2gocyA9PiBzLnNlbmQoSlNPTi5zdHJpbmdpZnkoWyJFVkVOVCIsIGxpa2VdKSkpCiAgICAgICAgbGluay5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKCiAgICAgICAgY29uc3QgcGljaWQgPSBsaW5rWyJkYXRhLWl0ZW0taWQiXSB8fCBsaW5rLmRhdGFzZXQucGljSWQKICAgICAgICAKICAgICAgICBpZihwaWNpZCl7CiAgICAgICAgICBnaWQocGljaWQpLnF1ZXJ5U2VsZWN0b3IoIi5saWtlIikuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgfQogICAgICB9CiAgICAKICAgICAgZnVuY3Rpb24gc3dpcGUob2Zmc2V0KXsKICAgICAgICBpZihwaWNvZmZzZXQob2Zmc2V0KSl7CiAgICAgICAgICBwaWNvZmZzZXQob2Zmc2V0KS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgdGhpc1tvZmZzZXQgPT0gMSAmJiAibGFzdGFjdGl2ZSIgfHwgImFjdGl2ZSJdKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIHVwZGF0ZXNob3coKQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlc2hvdygpewogICAgICAgIGlmKHFzKCIjbWVkaWEtY29udGFpbmVyIikuc3R5bGUuZGlzcGxheSA9PSAiYmxvY2siKXsKICAgICAgICAgIGhpZGV2aWRlbygpCiAgICAgICAgICBzaG93KGFjdGl2ZSgpLmlkKQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIGUgPT4gewogICAgICAgIGlmKFsiVGFiIiwgIkFycm93TGVmdCIsICJBcnJvd1JpZ2h0IiwgIkFycm93VXAiLCAiQXJyb3dEb3duIl0uaW5jbHVkZXMoZS5rZXkpKXsKICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkVzY2FwZSIpewogICAgICAgICAgbWVudSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS5rZXkgPT0gIkVudGVyIiAmJiBlLnRhcmdldC50YWdOYW1lID09ICJCT0RZIil7CiAgICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLnN0eWxlLmRpc3BsYXkgPT0gImJsb2NrIil7CiAgICAgICAgICAgIGhpZGVtZWRpYSgpCiAgICAgICAgICAgIHJldHVybgogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBzaG93KGFjdGl2ZSgpLmlkKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dVcCIgJiYgcGljb2Zmc2V0KC1jb2xzKCkpKXsKICAgICAgICAgIHBpY29mZnNldCgtY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgbGFzdGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICB1cGRhdGVzaG93KCkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd0Rvd24iICYmIHBpY29mZnNldChjb2xzKCkpKXsKICAgICAgICAgIHBpY29mZnNldChjb2xzKCkpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgdXBkYXRlc2hvdygpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dMZWZ0Iil7CiAgICAgICAgICBzd2lwZSgtMSkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd1JpZ2h0Iil7CiAgICAgICAgICBzd2lwZSgxKQogICAgICAgIH0KICAgICAgfSkKCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZXF1ZXJ5cmVzKHJlcywgc29ja2V0LCBxLCB0eXBlLCBzdGltZSl7CiAgICAgICAgc2F2ZShzb2NrZXQsIHJlcywgcSwgdHlwZSwgZmFsc2UsIGZhbHNlLCB0cnVlKQogICAgICAgIGxvZygicXVlcnkgcmVzIiwgcmVzLmxlbmd0aCwgc29ja2V0LnVybCkKICAgICAgICBxdWVyeWNvdW50LS0KICAgICAgICBpZihxdWVyeWNvdW50ID09IDApewogICAgICAgICAgcXMoIiNsb2FkaW5nIikuc3R5bGUuZGlzcGxheSA9ICJub25lIgogICAgICAgIH0KICAgICAgICAKICAgICAgICBsZXQgd2FpdCA9IHdhaXRtcyAtIChEYXRlLm5vdygpIC0gc3RpbWUpCiAgICAgICAgcXVlcnl3YWl0ID0gc2xlZXAod2FpdCkKICAgICAgICBhd2FpdCBxdWVyeXdhaXQucHJvbWlzZQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBwcmltYWxnbG9iYWwoc29ja2V0KXsKICAgICAgICBsb2coImdsb2JhbCIsIHNvY2tldC51cmwpCiAgICAgICAgcXVlcnljb3VudCsrCiAgICAgICAgcXMoIiNsb2FkaW5nIikuc3R5bGUuZGlzcGxheSA9ICJibG9jayIKICAgICAgICBsZXQgc3RpbWUgPSBEYXRlLm5vdygpCiAgICAgICAgbGV0IHFpZCA9ICJnbG9iYWxfIiArICgrK2lkY291bnRlcikKICAgICAgICBsZXQgcWlkbGlrZXMgPSAibGlrZXNfIiArICgrK2lkY291bnRlcikKCiAgICAgICAgaWYobmV3bGlrZXMubGVuZ3RoID4gMCl7CiAgICAgICAgICBwcmltYWxzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAgICJSRVEiLCAKICAgICAgICAgICAgcWlkbGlrZXMsIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgImNhY2hlIjogWwogICAgICAgICAgICAgICAgImV2ZW50cyIsIHsKICAgICAgICAgICAgICAgICAgImV2ZW50X2lkcyI6IG5ld2xpa2VzCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgICBdKSkKCiAgICAgICAgICBjb25zdCBsaWtlX2V2ZW50cyA9IGF3YWl0IHdhaXRyZXMocWlkbGlrZXMpCiAgICAgICAgICBuZXdsaWtlcy5zcGxpY2UoMCkKICAgICAgICAgIAogICAgICAgICAgYXdhaXQgc2F2ZShzb2NrZXQsIGxpa2VfZXZlbnRzLCAiIiwgImFsbCIsIHRydWUsIHRydWUsIGZhbHNlKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAiUkVRIiwgCiAgICAgICAgICBxaWQsIAogICAgICAgICAgewogICAgICAgICAgICAiY2FjaGUiOiBbCiAgICAgICAgICAgICAgImV4cGxvcmUiLCAKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidGltZWZyYW1lIjogImxhdGVzdCIsCiAgICAgICAgICAgICAgICAic2NvcGUiOiAiZ2xvYmFsIiwKICAgICAgICAgICAgICAgICJsaW1pdCI6IDIwCiAgICAgICAgICAgICAgfQogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSkpCiAgICAgICAgCiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgd2FpdHJlcyhxaWQpCiAgICAgICAgYXdhaXQgaGFuZGxlcXVlcnlyZXMocmVzLmZpbHRlcihlID0+IGUua2luZCA9PSAxKSwgc29ja2V0LCAiIiwgImFsbCIsIHN0aW1lKQogICAgICAgIHByaW1hbGdsb2JhbChzb2NrZXQpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5KHNvY2tldCwgcHJpbWFsKXsKICAgICAgICBsb2coInF1ZXJ5Iiwgc29ja2V0LnVybCkKICAgICAgICBxdWVyeWNvdW50KysKICAgICAgICBxcygiI2xvYWRpbmciKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgIAogICAgICAgIGxldCBzdGltZSA9IERhdGUubm93KCkKICAgICAgICBsZXQgcSA9IHF1ZXJ5c3RyLnRyaW0oKQogICAgICAgIGxldCB0eXBlID0gcXVlcnl0eXBlKCkKICAgICAgICBsZXQgaSA9ICsraWRjb3VudGVyCiAgICAgICAgbGV0IHFpZCA9ICJxdWVyeV8iICsgaQogICAgICAgIGxldCBmaWx0ZXJzID0gW10KCiAgICAgICAgZmlsdGVycy5wdXNoKC4uLih0eXBlc1t0eXBlXSB8fCBbXSkubWFwKCh0KSA9PiB7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBraW5kczogWzFdLCAKICAgICAgICAgICAgc2VhcmNoOiAiLiIgKyB0LAogICAgICAgICAgICBsaW1pdDogMjAKICAgICAgICAgIH0KICAgICAgICB9KSkKICAgICAgICAKICAgICAgICBpZihxLmxlbmd0aCA+IDApewogICAgICAgICAgZmlsdGVycy5wdXNoKHtraW5kczogWzFdLCBzZWFyY2g6IHF9KQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihmaWx0ZXJzLmxlbmd0aCA9PSAwKXsKICAgICAgICAgIGZpbHRlcnMucHVzaCh7a2luZHM6IFsxXX0pCiAgICAgICAgfQogICAgICAgIAogICAgICAgIAogICAgICAgIGNvbnN0IGxpa2VzcmVzID0gYXdhaXQgcXVlcnlsaWtlcyhzb2NrZXQpCiAgICAgICAgCiAgICAgICAgbGlrZXNyZXMuZm9yRWFjaChldmVudGlkID0+IHsKICAgICAgICAgIGlmKCFsaWtlcy5pbmNsdWRlcyhldmVudGlkKSl7CiAgICAgICAgICAgIGxpa2VzLnB1c2goZXZlbnRpZCkKICAgICAgICAgICAgbmV3bGlrZXMucHVzaChldmVudGlkKQogICAgICAgICAgfQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgY29uc3Qgc2VhcmNob2JqID0gWyJSRVEiLCBxaWQsIC4uLmZpbHRlcnNdCiAgICAgICAgY29uc3Qgc2VhcmNoanNvbiA9IEpTT04uc3RyaW5naWZ5KHNlYXJjaG9iaikKICAgICAgICBzb2NrZXQuc2VuZChzZWFyY2hqc29uKQogICAgICAgIAogICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHdhaXRyZXMocWlkKQogICAgICAgIGF3YWl0IGhhbmRsZXF1ZXJ5cmVzKHJlcywgc29ja2V0LCBxLCB0eXBlLCBzdGltZSkKICAgICAgICBxdWVyeShzb2NrZXQpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5bGlrZXMoc29ja2V0KXsKICAgICAgICBpZighaGFza2V5KCkpewogICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IG15cHVia2V5ID0gYXdhaXQgcHVia2V5KCkKICAgICAgICBjb25zdCBldmVudHMgPSBhd2FpdCBxdWVyeWV2ZW50cyhzb2NrZXQsIFs3XSwgbnVsbCwgW215cHVia2V5XSkKICAgICAgICByZXR1cm4gZXZlbnRzLm1hcChlID0+IGUudGFncy5maW5kKHQgPT4gdFswXSA9PSAiZSIpWzFdKQogICAgICB9CgogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeWV2ZW50cyhzb2NrZXQsIGtpbmRzLCBldmVudGlkcywgYXV0aG9ycyl7CiAgICAgICAgY29uc3QgcXVlcnlpZCA9ICJldmVudHNfIiArICgrK2lkY291bnRlcikKICAgICAgICBjb25zdCBmaWx0ZXJzID0ge30KICAgICAgICAKICAgICAgICBmaWx0ZXJzLmtpbmRzID0ga2luZHMKICAgICAgICAKICAgICAgICBpZihldmVudGlkcyl7CiAgICAgICAgICBmaWx0ZXJzWyIjZSJdID0gZXZlbnRpZHMKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoYXV0aG9ycyl7CiAgICAgICAgICBmaWx0ZXJzWyJhdXRob3JzIl0gPSBhdXRob3JzCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAiUkVRIiwgCiAgICAgICAgICBxdWVyeWlkLCAKICAgICAgICAgIGZpbHRlcnMKICAgICAgICBdKQoKICAgICAgICBzb2NrZXQuc2VuZChqc29uKQogICAgICAgIAogICAgICAgIHJldHVybiBhd2FpdCB3YWl0cmVzKHF1ZXJ5aWQpIHx8IFtdCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5cHVia2V5KHNvY2tldCwgcHViayl7CiAgICAgICAgY29uc3QgcXVlcnlpZCA9ICJxdWVyeV8iICsgKCsraWRjb3VudGVyKQogICAgICAgIHNvY2tldC5zZW5kKHF1ZXJpZXMuYXV0aG9yLnJlcGxhY2UoIjxJPiIsIHF1ZXJ5aWQpLnJlcGxhY2UoIjxQPiIsIHB1YmspKQoKICAgICAgICByZXR1cm4gKGF3YWl0IHdhaXRyZXMocXVlcnlpZCkpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHNhdmUoc29ja2V0LCBldmVudGRiLCBxLCBxdHlwZSwgcmVhY3RlZCwgYXBwZW5kLCBxdWVyeW1ldGEpewogICAgICAgIGxldCBldmVudHB1YmtleXMgPSBbXQogICAgICAgIGNvbnN0IGV2ZW50cyA9IGV2ZW50ZGIuZmlsdGVyKG8gPT4gewogICAgICAgICAgaWYocS5sZW5ndGggPiAwKXsKICAgICAgICAgICAgZm9yKGxldCB3b3JkIG9mIHEuc3BsaXQoIiAiKSl7CiAgICAgICAgICAgICAgaWYoby5jb250ZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZih3b3JkLnRvTG93ZXJDYXNlKCkpID09IC0xKXsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIHJldHVybiB0cnVlCiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBsZXQgcmVzdWx0cyA9IFtdCiAgICAgICAgY29uc3QgZXZlbnRpZHMgPSBldmVudHMubWFwKGUgPT4gZS5pZCkKICAgICAgICBsZXQgbmV3dXJscyA9IFtdCiAgICAgICAgCiAgICAgICAgZm9yKGxldCBldmVudCBvZiBldmVudHMpewogICAgICAgICAgbGV0IHVybHNtYXRjaCA9IFtdCiAgICAgICAgICAKICAgICAgICAgIGlmKHF0eXBlICE9ICJ2aWRlbyIpewogICAgICAgICAgICB1cmxzbWF0Y2gucHVzaCguLi4oZXZlbnQuY29udGVudC5tYXRjaChpbWdyZWdleCkgfHwgW10pKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBpZihxdHlwZSAhPSAiaW1hZ2UiKXsKICAgICAgICAgICAgdXJsc21hdGNoLnB1c2goLi4uKGV2ZW50LmNvbnRlbnQubWF0Y2godmlkZW9yZWdleCkgfHwgW10pKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICB1cmxzbWF0Y2ggPSB1cmxzbWF0Y2guZmlsdGVyKHVybCA9PiAhdXJscy5pbmNsdWRlcyh1cmwpKQoKICAgICAgICAgIGlmKHVybHNtYXRjaC5sZW5ndGggPiAwKXsKICAgICAgICAgICAgbmV3dXJscy5wdXNoKHsKICAgICAgICAgICAgICBldmVudDogZXZlbnQsCiAgICAgICAgICAgICAgdXJsczogdXJsc21hdGNoCiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIAogICAgICAgICAgICB1cmxzLnB1c2goLi4udXJsc21hdGNoKQogICAgICAgICAgICBldmVudHB1YmtleXMuaW5jbHVkZXMoZXZlbnQucHVia2V5KSB8fCBldmVudHB1YmtleXMucHVzaChldmVudC5wdWJrZXkpCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxvZygicXVlcnkgbWV0YSIsIHNvY2tldC51cmwpCiAgICAgICAgbGV0IG1ldGFldmVudHMgPSAocXVlcnltZXRhICYmIGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzBdLCBudWxsLCBldmVudHB1YmtleXMpIHx8IFtdKQogICAgICAgIAogICAgICAgIGZvcihsZXQgZW50cnkgb2YgbmV3dXJscyl7CiAgICAgICAgICBmb3IobGV0IHVybCBvZiBlbnRyeS51cmxzKXsKICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHsKICAgICAgICAgICAgICByZWFjdGVkOiByZWFjdGVkIHx8IGxpa2VzLmluY2x1ZGVzKGVudHJ5LmV2ZW50LmlkKSwgCiAgICAgICAgICAgICAgdXJsOiB1cmwsIAogICAgICAgICAgICAgIGV2ZW50OiBlbnRyeS5ldmVudCwgCiAgICAgICAgICAgICAgYmVjaDMyaWQ6IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKGVudHJ5LmV2ZW50LmlkKSksCiAgICAgICAgICAgICAgbWV0YTogbWV0YWV2ZW50cy5maW5kKG8gPT4gby5wdWJrZXkgPT0gZW50cnkuZXZlbnQucHVia2V5KQogICAgICAgICAgICB9KQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBsb2coInNhdmUgcmVzIiwgcmVzdWx0cy5sZW5ndGgsIHNvY2tldC51cmwpCiAgICAgICAgdXBkYXRlY29udGVudChyZXN1bHRzLCBxLCBhcHBlbmQpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZWNvbnRlbnQocmVzdWx0cywgcSwgYXBwZW5kKXsKICAgICAgICByZXN1bHRzLnJldmVyc2UoKS5mb3JFYWNoKGl0ZW0gPT4gewogICAgICAgICAgY29uc3QgdHlwZSA9IGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpICYmICJ2aWRlbyIgfHwgInBpYyIKICAgICAgICAgIGNvbnN0IHRleHQgPSAocSB8fCAidmlldyBub3RlIikuc3Vic3RyaW5nKC0zMCkKICAgICAgICAgIGNvbnN0IGlkID0gIml0ZW1fIiArICgrK2lkY291bnRlcikKICAgICAgICAgIGNvbnN0IGNvbnRlbnRlbGVtZW50cyA9ICc8ZGl2IGNsYXNzPSJ0eXBlIj4nICsgdHlwZSArICc8L2Rpdj48YSBjbGFzcz0ibGlrZScgKyAoaXRlbS5yZWFjdGVkID8gJyByZWFjdGVkJyA6ICcnKSArICciIGRhdGEtaXRlbS1pZD0iJyArIGlkICsgCiAgICAgICAgICAgICciIGhyZWY9IiMiPicgKyBxcygiI3RlbXBsYXRlIC5oZWFydHN2ZyIpLm91dGVySFRNTCArICc8L2E+PGEgY2xhc3M9InF1ZXJ5IiBocmVmPSInICsgcHJvdG9jb2wgKyAKICAgICAgICAgICAgaXRlbS5iZWNoMzJpZCArICciPicgKyB0ZXh0ICsgJzwvYT4nCiAgICAgICAgICBsZXQgcm9vdCA9IG51bGwKICAgICAgICAgIGxldCB2ID0gbnVsbAogICAgICAgICAgCiAgICAgICAgICBpZihpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KSl7CiAgICAgICAgICAgIHJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKQogICAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoInZpZGVvLWNvbnRhaW5lciIpCiAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MID0gY29udGVudGVsZW1lbnRzCiAgICAgICAgICAgIAogICAgICAgICAgICB2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKQogICAgICAgICAgICB2WyJkYXRhLWl0ZW0taWQiXSA9IGlkCiAgICAgICAgICAgIHYucHJlbG9hZCA9ICJub25lIgogICAgICAgICAgICB2Lmxvb3AgPSB0cnVlCiAgICAgICAgICAgIHYucGxheXNpbmxpbmUgPSAiIgogICAgICAgICAgICAKICAgICAgICAgICAgdi5vbmNhbnBsYXkgPSBhc3luYyBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICBjb25zdCBhc3BlY3QgPSB0aGlzLnZpZGVvV2lkdGggLyB0aGlzLnZpZGVvSGVpZ2h0CiAgICAgICAgICAgICAgaWYoYXNwZWN0ID4gMSl7CiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLndpZHRoID0gKGFzcGVjdCAqIDEwMCkgKyAiJSIKICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUuaGVpZ2h0ID0gKDEgLyBhc3BlY3QgKiAxMDApICsgIiUiCiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLm1hcmdpblRvcCA9IC0oKDEgLyBhc3BlY3QgKiAxMDAgLSAxMDApIC8gMikgKyAiJSIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgdXBkYXRldmlkZW9wbGF5KHRoaXMpCiAgICAgICAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnN0IGV4dCA9IGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpWzFdCiAgICAgICAgICAgIHYuaW5uZXJIVE1MID0gJzxzb3VyY2Ugc3JjPSInICsgaXRlbS51cmwgKyAnIiB0eXBlPSJ2aWRlby8nICsgZXh0ICsgJyI+PC9zb3VyY2U+JwogICAgICAgICAgICAKICAgICAgICAgICAgcm9vdC5hcHBlbmQodikKICAgICAgICAgIH1lbHNlIGlmKGl0ZW0udXJsLm1hdGNoKGltZ2V4dHJlZ2V4KSl7CiAgICAgICAgICAgIHJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIikKICAgICAgICAgICAgcm9vdC5ocmVmID0gIiMiCiAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MID0gY29udGVudGVsZW1lbnRzCiAgICAgICAgICAgICAgCiAgICAgICAgICAgIGlmKHR5cGUgPT0gInBpYyIpewogICAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MICs9ICc8aW1nIG9ubG9hZD0iZ2lkKFwnJyArIGlkICsgJ1wnKS5zdHlsZS5kaXNwbGF5PVwnYmxvY2tcJyIgc3JjPSInICsgaXRlbS51cmwgKyAnIi8+JwogICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICByb290LmlubmVySFRNTCArPSAnPHNwYW4gY2xhc3M9ImZpbGUiPicgKyBpdGVtLnVybCArICc8L3NwYW4+JwogICAgICAgICAgICB9CiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHJvb3QuaWQgPSBpZAogICAgICAgICAgcm9vdFsiZGF0YS1pdGVtIl0gPSBpdGVtCiAgICAgICAgICByb290WyJkYXRhLWV2ZW50Il0gPSBpdGVtLmV2ZW50CiAgICAgICAgICByb290WyJkYXRhLXF1ZXJ5Il0gPSBxCiAgICAgICAgICByb290WyJkYXRhLXRleHQiXSA9IHRleHQKICAgICAgICAgIAogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKHR5cGUpCiAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoIml0ZW0iKQogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJzaG93IikKICAgICAgICAgIAogICAgICAgICAgaWYoaXRlbS5yZWFjdGVkKXsKICAgICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgcXMoIiNwaWNzIilbYXBwZW5kICYmICJhcHBlbmQiIHx8ICJwcmVwZW5kIl0ocm9vdCkKICAgICAgICAgIAogICAgICAgICAgaWYodil7CiAgICAgICAgICAgIHVwZGF0ZXZpZGVvcGxheSh2KQogICAgICAgICAgfQogICAgICAgIH0pCgogICAgICAgIGlmKGFjdGl2ZSgpID09IG51bGwpewogICAgICAgICAgcXMoIiNwaWNzIC5pdGVtIik/LmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgfQogICAgICB9CgogICAgICBmdW5jdGlvbiBoaWRlbWVkaWEoKXsKICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gInNjcm9sbCIKICAgICAgICBxc2EoIiNtZWRpYS1jb250YWluZXIsICNwaWMsICNtZWRpYS1mb290ZXIiKS5mb3JFYWNoKG4gPT4gbi5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiKQogICAgICAgIGdpZCgicGljLWxpa2UiKS5jbGFzc0xpc3QucmVtb3ZlKCJyZWFjdGVkIikKICAgICAgICBoaWRldmlkZW8oKQogICAgICB9CgogICAgICBmdW5jdGlvbiBoaWRldmlkZW8oKXsKICAgICAgICBjb25zdCB2ID0gcXMoIiNtZWRpYS1jb250YWluZXIgdmlkZW8iKQogICAgICAgIAogICAgICAgIGlmKHYpewogICAgICAgICAgdi5tdXRlZCA9IHRydWUKICAgICAgICAgIGdpZCh2WyJkYXRhLWl0ZW0taWQiXSkuYXBwZW5kQ2hpbGQodikKICAgICAgICAgIHVwZGF0ZXZpZGVvcGxheSh2KQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gd2FpdHJlcyhrZXkpewogICAgICAgIGxldCBldmVudHMgPSBbXQogICAgICAgIAogICAgICAgIGxldCByZXNoYW5kbGVyID0gZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXsKICAgICAgICAgIHRoaXMuaGFuZGxlID0gZnVuY3Rpb24ocmVzKXsKICAgICAgICAgICAgbGV0IG8gPSBKU09OLnBhcnNlKHJlcy5kYXRhKQogICAgICAgICAgICBpZihvWzFdID09IGtleSl7CiAgICAgICAgICAgICAgaWYob1swXSA9PSAiRU9TRSIpewogICAgICAgICAgICAgICAgcmVzb2x2ZShldmVudHMpCiAgICAgICAgICAgICAgICByZXNoYW5kbGVycy5zcGxpY2UocmVzaGFuZGxlcnMuaW5kZXhPZih0aGlzKSwgMSkKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgZXZlbnRzLnB1c2gob1syXSkKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAgIAogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICByZXNoYW5kbGVycy5wdXNoKG5ldyByZXNoYW5kbGVyKHJlc29sdmUsIHJlamVjdCkpCiAgICAgICAgfSkKICAgICAgfQogICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGNoZWNrdXBkYXRlKHNvY2tldCl7CiAgICAgICAgY29uc3QgdXBkYXRlc3JlcyA9IGF3YWl0IHF1ZXJ5cHVia2V5KHNvY2tldCwgdXBkYXRlc3B1YmtleSkKICAgICAgICBjb25zdCB1cGRhdGVub3RlID0gdXBkYXRlc3Jlcy5maW5kKG4gPT4gbi5jb250ZW50Lm1hdGNoKC9eaHR0cHNcOlwvXC8vKSkKICAgICAgICAKICAgICAgICBpZighdXBkYXRlbm90ZSl7CiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgYWdlID0gTWF0aC5yb3VuZCgoRGF0ZS5ub3coKSAvIDEwMDAgLSB1cGRhdGVub3RlLmNyZWF0ZWRfYXQpIC8gMzYwMCAvIDI0KQogICAgICAgIGNvbnN0IG5vdGVpZCA9IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKHVwZGF0ZW5vdGUuaWQpKQogICAgICAgIHFzKCIjcmVsZWFzZSIpLmhyZWYgPSBwcm90b2NvbCArIG5vdGVpZAogICAgICAgIHFzKCIjcmVsZWFzZSIpLmlubmVyVGV4dCA9IChhZ2UgPT0gMCAmJiAidG9kYXkiIHx8IGFnZSArICIgZGF5KHMpIGFnbyIpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNsZWVwKG1zKXsKICAgICAgICByZXR1cm4gbmV3IGZ1bmN0aW9uKCl7CiAgICAgICAgICBsZXQgdGltZW91dCA9IG51bGwKICAgICAgICAgIGxldCByID0gbnVsbAogICAgICAgICAgCiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBwcm9taXNlOiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewogICAgICAgICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoKSwgbXMpCiAgICAgICAgICAgICAgciA9IHJlc29sdmUKICAgICAgICAgICAgfSksCiAgICAgICAgICAgIHJlc29sdmU6IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpCiAgICAgICAgICAgICAgcigpCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNob3coaWQpewogICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIgogICAgICAgIGNvbnN0IGl0ZW0gPSBnaWQoaWQpWyJkYXRhLWl0ZW0iXQogICAgICAgIGNvbnN0IG1lZGlhID0gZ2lkKCJtZWRpYS1jb250YWluZXIiKQogICAgICAgIGNvbnN0IHBpYyA9IGdpZCgicGljIikKCiAgICAgICAgaWYoaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleCkpewogICAgICAgICAgcGljLnN0eWxlLmRpc3BsYXkgPSAibm9uZSIKICAgICAgICAgIGNvbnN0IHYgPSBnaWQoaWQpLnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAgIHFzKCIjbWVkaWEtY29udGFpbmVyIikuYXBwZW5kQ2hpbGQodikKICAgICAgICAgIHYubXV0ZWQgPSBmYWxzZQogICAgICAgICAgdi5wbGF5KCkKICAgICAgICB9ZWxzZXsKICAgICAgICAgIHBpYy5zcmMgPSBpdGVtLnVybAogICAgICAgICAgcGljLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGl0ZW0ubWV0YSl7CiAgICAgICAgICBjb25zdCBtZXRhY29udGVudCA9IEpTT04ucGFyc2UoaXRlbS5tZXRhLmNvbnRlbnQpCiAgICAgICAgICBjb25zdCBuYW1lID0gbWV0YWNvbnRlbnQuZGlzcGxheV9uYW1lIHx8IG1ldGFjb250ZW50Lm5hbWUKICAgICAgICAgIHFzKCIjcGljLXVzZXIiKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgICAgcXMoIiNwaWMtdXNlciIpLmhyZWYgPSBwcm90b2NvbCArIGJlY2gzMi5lbmNvZGUoIm5wdWIiLCBmcm9tSGV4U3RyaW5nKGl0ZW0ubWV0YS5wdWJrZXkpKQogICAgICAgICAgcXMoIiNwaWMtdXNlciIpLmlubmVyVGV4dCA9IG5hbWUKICAgICAgICB9ZWxzZXsKICAgICAgICAgIHFzKCIjcGljLXVzZXIiKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiCiAgICAgICAgfQoKICAgICAgICBnaWQoInBpYy1saWtlIilbImRhdGEtaXRlbS1pZCJdID0gaWQKICAgICAgICBnaWQoIm1lZGlhLWZvb3RlciIpWyJkYXRhLWV2ZW50Il0gPSBpdGVtLmV2ZW50CgogICAgICAgIGlmKGl0ZW0ucmVhY3RlZCl7CiAgICAgICAgICBnaWQoInBpYy1saWtlIikuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGEgPSBxcygiI3BpYy1xdWVyeSIpCiAgICAgICAgYS5ocmVmID0gcHJvdG9jb2wgKyBpdGVtLmJlY2gzMmlkCiAgICAgICAgYS5pbm5lclRleHQgPSBnaWQoaWQpWyJkYXRhLXRleHQiXQogICAgICAgICAgCiAgICAgICAgbWVkaWEuc3R5bGUuZGlzcGxheSA9IGdpZCgibWVkaWEtZm9vdGVyIikuc3R5bGUuZGlzcGxheSA9ICJibG9jayIKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gY29ubmNvdW50KCl7CiAgICAgICAgcmV0dXJuIHNvY2tldHMuZmlsdGVyKHIgPT4gci5yZWFkeVN0YXRlID09IDEpLmxlbmd0aAogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBkaXNjb25uZWN0KCl7CiAgICAgICAgZm9yKGxldCBzb2NrZXQgb2Ygc29ja2V0cyl7CiAgICAgICAgICBzb2NrZXQuY2xvc2UoKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXRzLnNwbGljZSgwKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBsb2cobXNnKXsKICAgICAgICBsZXQgc2Nyb2xsID0gcXMoIiNsb2dzIikuc2Nyb2xsVG9wID09IHFzKCIjbG9ncyIpLnNjcm9sbFRvcE1heAogICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCiAgICAgICAgZGl2LmlubmVyVGV4dCA9IEFycmF5LmZyb20oYXJndW1lbnRzKS5qb2luKCIgIikKICAgICAgICBxcygiI2xvZ3MiKS5hcHBlbmQoZGl2KQogICAgICAgIAogICAgICAgIHNjcm9sbCAmJiBxcygiI2xvZ3MiKS5zY3JvbGxUbygwLCBxcygiI2xvZ3MiKS5zY3JvbGxUb3BNYXgpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGNvbm5lY3QodXJsKXsKICAgICAgICBsb2coImNvbm5lY3RpbmciLCB1cmwpCiAgICAgICAgbGV0IHNvY2tldCA9IG5ldyBXZWJTb2NrZXQodXJsKQogICAgICAgIAogICAgICAgIHNvY2tldC5vbm1lc3NhZ2UgPSBtZXNzYWdlID0+IHJlc2hhbmRsZXJzLmZvckVhY2gocmggPT4gcmguaGFuZGxlKG1lc3NhZ2UpKQogICAgICAgIAogICAgICAgIHNvY2tldC5vbmNsb3NlID0gYXN5bmMgZnVuY3Rpb24oKXsKICAgICAgICAgIHNvY2tldHMuc3BsaWNlKHNvY2tldHMuaW5kZXhPZihzb2NrZXQpLCAxKQogICAgICAgICAgcXMoIiNjb25uY291bnQiKS5pbm5lclRleHQgPSBjb25uY291bnQoKSArIChwcmltYWxzb2NrZXQgJiYgMSkKICAgICAgICAgIGxvZygiZGlzY29ubmVjdGVkIiwgdGhpcy51cmwsIGNvbm5jb3VudCgpKQogICAgICAgICAgYXdhaXQgc2xlZXAoMTAwMCkucHJvbWlzZQogICAgICAgICAgY29ubmVjdCh0aGlzLnVybCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc29ja2V0Lm9ub3BlbiA9IGZ1bmN0aW9uKCl7CiAgICAgICAgICBxcygiI2Nvbm5jb3VudCIpLmlubmVyVGV4dCA9IGNvbm5jb3VudCgpICsgKHByaW1hbHNvY2tldCAmJiAxKQogICAgICAgICAgbG9nKCJjb25uZWN0ZWQiLCB0aGlzLnVybCwgY29ubmNvdW50KCkpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiBzb2NrZXQKICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIGFzeW5jICgpID0+IHsKICAgICAgICBwcmltYWxzb2NrZXQgPSBjb25uZWN0KCJ3c3M6Ly9jYWNoZTMucHJpbWFsLm5ldC9jYWNoZTE3IikKICAgICAgICBwcmltYWxzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcigib3BlbiIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICBwcmltYWxnbG9iYWwodGhpcykKICAgICAgICB9KQogICAgICAgIAogICAgICAgIHByaW1hbHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICBwcmltYWxzb2NrZXQgPSBudWxsCiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBmb3IobGV0IHVybCBvZiByZWxheXMoKSl7CiAgICAgICAgICBjb25zdCBzb2NrZXQgPSBjb25uZWN0KHVybCkKICAgICAgICAgIHNvY2tldHMucHVzaChzb2NrZXQpCiAgICAgICAgICAKICAgICAgICAgIHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgY2hlY2t1cGRhdGUodGhpcykKICAgICAgICAgICAgcXVlcnkodGhpcykKICAgICAgICAgIH0pCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGF3YWl0IHNsZWVwKDEwMCkucHJvbWlzZQogICAgICAgIAogICAgICAgIGlmKGhhc2tleSgpKXsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgibm9zdHIiKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGZvcihsZXQgYyBvZiBjb2xvcHRzKXsKICAgICAgICBkb2N1bWVudC53cml0ZSgnPHN0eWxlPicgKyBjb2xzY3NzLmlubmVyVGV4dC5yZXBsYWNlKC9cJFx7Y29sc1x9L2csIGMpICsgJzwvc3R5bGU+JykKICAgICAgfQogICAgPC9zY3JpcHQ+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==
https://ipfs.io/ipfs/QmQpDYKGW6vBGbf9xtFYKX1XhznBkfG79LD6sKnQJ4xJ4d
sha256
ccac38b42a4e00127b9b2d4a074b07be540478891d8ba2dd8bcab77be29c3798 files.html
base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyIvPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL3N2Z2ljb25zLnNwYXJray5mci9zdmdpY29ucy5jc3MiLz4KICAgIDxzdHlsZT4KICAgICAgKiB7CiAgICAgICAgb3ZlcnNjcm9sbC1iZWhhdmlvci15OiBjb250YWluOwogICAgICB9CiAgICAgIAogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksIAogICAgICAjaGVhZGVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncywgCiAgICAgICNwcml2a2V5IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncyB7CiAgICAgICAgaGVpZ2h0OiA2ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNsb2dzIHsKICAgICAgICBoZWlnaHQ6IDhlbTsKICAgICAgICBvdmVyZmxvdzogc2Nyb2xsOwogICAgICAgIGZvbnQtc2l6ZTogLjhlbTsKICAgICAgfQogICAgICAKICAgICAgc2VsZWN0IHsKICAgICAgICB3aWR0aDogNGVtOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLCAKICAgICAgaW5wdXQuc3VibWl0IHsKICAgICAgICBib3JkZXItcmFkaXVzOiAuNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0LCAKICAgICAgI2hlYWRlciBhLAogICAgICAjbWVkaWEtY29udGFpbmVyIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLCAKICAgICAgZm9ybSwgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHotaW5kZXg6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgIAogICAgICBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDMwZW0pIHsKICAgICAgICAjcXVlcnlkaXNwbGF5LAogICAgICAgICNjb250cm9saW5mbyB7CiAgICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZm9ybSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnkgewogICAgICAgIHdpZHRoOiA2ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNsb2FkaW5nIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDBweDsKICAgICAgICBsZWZ0OiAyN2VtOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICBhIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgIH0KCiAgICAgIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAKICAgICAgI21lZGlhLWNvbnRhaW5lciB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICBoZWlnaHQ6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICBtYXJnaW4tdG9wOiAwICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgCiAgICAgIC50eXBlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgei1pbmRleDogMTsKICAgICAgfQogICAgICAKICAgICAgI3BpYy1xdWVyeSB7CiAgICAgICAgd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSwgCiAgICAgICNjb250cm9saW5mbywKICAgICAgYSwKICAgICAgaW5wdXQuc3VibWl0IHsKICAgICAgICBjb2xvcjogIzk5OTsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSB7CiAgICAgICAgcGFkZGluZzogMCAxZW07CiAgICAgIH0KCiAgICAgICNxdWVyeWRpc3BsYXkgLnRleHQgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBtaW4td2lkdGg6IDNlbTsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAjaGVhZGVyIGEsCiAgICAgICNoZWFkZXIgc3BhbiB7CiAgICAgICAgcGFkZGluZzogMC41ZW07CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgewogICAgICAgIHBhZGRpbmc6IDAuNDVlbSAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgLml0ZW1zIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQogICAgICAKICAgICAgI2hlYWRlciAuaXRlbXMsIAogICAgICAjY29udHJvbGluZm8gewogICAgICAgIG1hcmdpbi10b3A6IC4zZW07CiAgICAgIH0KCiAgICAgIHAgewogICAgICAgIG1hcmdpbi10b3A6IDA7CiAgICAgIH0KICAgICAgCiAgICAgIC5sYWJlbCB7CiAgICAgICAgcGFkZGluZzogLjhlbSAuOGVtIC44ZW0gMDsKICAgICAgfQoKICAgICAgc3BhbiNjb250cm9saW5mbywgCiAgICAgICNwaWNzIGEgPiBhLAogICAgICAjcGljcyAucXVlcnkgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgfQogICAgICAKICAgICAgc3BhbiNjb250cm9saW5mbyB7CiAgICAgICAgcmlnaHQ6IDJlbTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgfQoKICAgICAgI21lZGlhLWNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDApOwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgei1pbmRleDogNDsKICAgICAgfQogICAgICAKICAgICAgI3BpYy1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAKICAgICAgI3BpYyB7CiAgICAgICAgbWF4LXdpZHRoOiAxMDB2dzsKICAgICAgICBtYXgtaGVpZ2h0OiAxMDB2aDsKICAgICAgfQogICAgICAgIAogICAgICAjcGljcyB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgICAKICAgICAgI3BpY3MgPiBhLCAKICAgICAgI3BpY3MgaW1nLAogICAgICAjcGljcyAuZmlsZSwKICAgICAgI3BpY3MgLnZpZGVvLWNvbnRhaW5lciB7CiAgICAgICAgd2lkdGg6IDI1dnc7CiAgICAgIH0KCiAgICAgICNwaWNzID4gYSwKICAgICAgI3BpY3MgLmZpbGUsCiAgICAgICNwaWNzIC52aWRlby1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMjV2dzsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIGJvcmRlcjogMC4zZW0gc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMC4zZW07CiAgICAgICAgbWFyZ2luOiAtMC4zZW07CiAgICAgIH0KCiAgICAgICNwaWNzID4gLmZpbGUgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIAogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CiAgICAgIAogICAgICBib2R5Om5vdCgubm9zdHIpICNmaWx0ZXItbGlrZXMsIAogICAgICAuZmlsdGVyLWxpa2VzICNwaWNzID4gLml0ZW06bm90KC5yZWFjdGVkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgei1pbmRleDogMjsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3Z3OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHBhZGRpbmc6IDAgMXZ3OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNwaWMtcXVlcnkgewogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBmb250LXNpemU6IG1pbigzLjV2dywgMS41ZW0pOwogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsMC42KTsKICAgICAgICBtYXgtd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgI3BpYy1xdWVyeSB7CiAgICAgICAgcGFkZGluZzogLjZlbSAuNGVtIC4xZW0gLjRlbTsKICAgICAgICBtYXgtd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgLmxpa2UucmVhY3RlZCwKICAgICAgLmZpbHRlci1saWtlcyAjZmlsdGVyLWxpa2VzIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7CiAgICAgIH0KCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgZm9udC1zaXplOiAzZW07CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciwKICAgICAgI21lZGlhLWZvb3RlciAubGlrZSB7CiAgICAgICAgei1pbmRleDogNTsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgYm90dG9tOiAxLjllbTsKICAgICAgICBmb250LXNpemU6IDEuOGVtOwogICAgICAgIHBhZGRpbmctcmlnaHQ6IC42NWVtOwogICAgICAgIG1heC13aWR0aDogOGVtOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9CiAgICAgIAogICAgICAubGlrZSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiBhdXRvOwogICAgICAgIHBhZGRpbmc6IC4yZW07CiAgICAgICAgd2lkdGg6IDFlbTsKICAgICAgICBoZWlnaHQ6IDFlbTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CgogICAgICAubm9zdHIgLmxpa2UgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOyAgCiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgLmxpa2UgewogICAgICAgIGZvbnQtc2l6ZTogMi40ZW07CiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgewogICAgICAgIGRpc3BsYXk6IG5vbmU7ICAKICAgICAgfQogIAogICAgICAjcGljcyBpbWcgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgLmFjdGl2ZSB7CiAgICAgICAgYmFja2dyb3VuZDogIzQ0NDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI3BpY3MgPiAuYWN0aXZlIHsKICAgICAgICBib3JkZXItY29sb3I6IGdyZWVuOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KCiAgICAgIC5oZWFydHN2ZyBwYXRoIHsKICAgICAgICBzdHJva2U6ICNmZmY7CiAgICAgIH0KICAKICAgICAgYSNtZW51LCBhI2ZpbHRlci1saWtlcyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luLXRvcDogLS4zZW07CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgfQoKICAgICAgYSNtZW51IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBwYWRkaW5nOiAwIC4zZW0gMCAuNWVtOwogICAgICAgIGhlaWdodDogMi4xZW07CiAgICAgIH0KICAgICAgCiAgICAgIGEjZmlsdGVyLWxpa2VzIHsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB3aWR0aDogMS41ZW07CiAgICAgICAgaGVpZ2h0OiAxLjVlbTsKICAgICAgICBtYXJnaW46IC4xZW0gLjVlbTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgIH0KICAgICAgCiAgICAgIGEjZmlsdGVyLWxpa2VzIHN2ZyB7CiAgICAgICAgd2lkdGg6IDEuNWVtOwogICAgICAgIGhlaWdodDogMS41ZW07CiAgICAgIH0KICAgICAgIAogICAgICAubWVudXN2ZyB7CiAgICAgICAgd2lkdGg6IDJlbTsKICAgICAgICBoZWlnaHQ6IDJlbTsKICAgICAgfQoKICAgICAgLm1lbnVzdmcgcGF0aCB7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBtYXJnaW4tbGVmdDogLTE4ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzIyMjsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgei1pbmRleDogMzsgCiAgICAgICAgb3ZlcmZsb3c6IHNjcm9sbDsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudC5vcGVuIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgewogICAgICAgIHBhZGRpbmc6IDAgMWVtIDFlbSAxZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIGEsCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgcGFkZGluZzogLjVlbSAuN2VtOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHotaW5kZXg6IDM7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIG9wYWNpdHk6IC41OwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5Lm9wZW4gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIAogICAgICBzdmcsIAogICAgICBpbWcsIAogICAgICAudmlkZW8gdmlkZW8gewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAjdGVtcGxhdGUgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGRpdiBpZD0idGVtcGxhdGUiPgogICAgICA8c3ZnIGNsYXNzPSJoZWFydHN2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KICAgICAgICA8cGF0aCBkPSJNOS43MTksMTcuMDczbC02LjU2Mi02LjUxYy0wLjI3LTAuMjY4LTAuNTA0LTAuNTY3LTAuNjk2LTAuODg4QzEuMzg1LDcuODksMS42Nyw1LjYxMywzLjE1NSw0LjE0YzAuODY0LTAuODU2LDIuMDEyLTEuMzI5LDMuMjMzLTEuMzI5YzEuOTI0LDAsMy4xMTUsMS4xMiwzLjYxMiwxLjc1MmMwLjQ5OS0wLjYzNCwxLjY4OS0xLjc1MiwzLjYxMi0xLjc1MmMxLjIyMSwwLDIuMzY5LDAuNDcyLDMuMjMzLDEuMzI5YzEuNDg0LDEuNDczLDEuNzcxLDMuNzUsMC42OTMsNS41MzdjLTAuMTksMC4zMi0wLjQyNSwwLjYxOC0wLjY5NSwwLjg4N2wtNi41NjIsNi41MUMxMC4xMjUsMTcuMjI5LDkuODc1LDE3LjIyOSw5LjcxOSwxNy4wNzMgTTYuMzg4LDMuNjFDNS4zNzksMy42MSw0LjQzMSw0LDMuNzE3LDQuNzA3QzIuNDk1LDUuOTIsMi4yNTksNy43OTQsMy4xNDUsOS4yNjVjMC4xNTgsMC4yNjUsMC4zNTEsMC41MSwwLjU3NCwwLjczMUwxMCwxNi4yMjhsNi4yODEtNi4yMzJjMC4yMjQtMC4yMjEsMC40MTYtMC40NjYsMC41NzMtMC43MjljMC44ODctMS40NzIsMC42NTEtMy4zNDYtMC41NzEtNC41NkMxNS41Nyw0LDE0LjYyMSwzLjYxLDEzLjYxMiwzLjYxYy0xLjQzLDAtMi42MzksMC43ODYtMy4yNjgsMS44NjNjLTAuMTU0LDAuMjY0LTAuNTM2LDAuMjY0LTAuNjksMEM5LjAyOSw0LjM5Nyw3LjgyLDMuNjEsNi4zODgsMy42MSI+PC9wYXRoPgogICAgICA8L3N2Zz4KICAgICAgPGRpdiBpZD0iY29sc2NzcyI+CiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyAuaXRlbSB7CiAgICAgICAgd2lkdGg6IGNhbGMoMTAwdncgLyAke2NvbHN9KTsKICAgICAgfQoKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzIC5pdGVtIHsKICAgICAgICBoZWlnaHQ6IGNhbGMoMTAwdncgLyAke2NvbHN9KTsKICAgICAgfQogICAgICAKICAgICAgLmNvbHMke2NvbHN9IC5xdWVyeSwKICAgICAgLmNvbHMke2NvbHN9IC5saWtlIHsKICAgICAgICBmb250LXNpemU6IG1pbigxNHZ3ICogKDEgLyAke2NvbHN9KSwgNmVtICogKDEgLyAke2NvbHN9KSkKICAgICAgfQogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0ibWVkaWEtZm9vdGVyIj4KICAgICAgPGEgaWQ9InBpYy1saWtlIiBjbGFzcz0ibGlrZSIgaHJlZj0iIyI+PC9hPgogICAgICA8YSBpZD0icGljLXF1ZXJ5IiBocmVmPSIjIj48L2E+CiAgICAgIDxhIGlkPSJwaWMtdXNlciIgaHJlZj0iIyI+PC9hPgogICAgPC9kaXY+CiAgICA8Y2VudGVyIGlkPSJtZWRpYS1jb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJwaWMtY29udGFpbmVyIj4KICAgICAgICA8aW1nIGlkPSJwaWMiLz4KICAgICAgPC9kaXY+CiAgICA8L2NlbnRlcj4KICAgIDxkaXYgaWQ9Im1lbnUtb3ZlcmxheSI+PC9kaXY+CiAgICA8ZGl2IGlkPSJtZW51LWNvbnRlbnQiIGNsYXNzPSJ0ZXN0Ij4KICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5hdXRvcGxheTwvZGl2PgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0ib24iIGhyZWY9IiMiPm9uPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0ib2ZmIiBocmVmPSIjIj5vZmY8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJob3ZlciIgaHJlZj0iIyI+bW91c2VvdmVyPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5jb2x1bW5zPC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMSIgaHJlZj0iIyI+MTwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSIyIiBocmVmPSIjIj4yPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjQiIGhyZWY9IiMiPjQ8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iNiIgaHJlZj0iIyI+NjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSIxMCIgaHJlZj0iIyI+MTA8L2E+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmNvbm5lY3Rpb25zPC9kaXY+CiAgICAgICAgPGRpdiBpZD0iY29ubmNvdW50Ij4wPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPnJlbGF5czo8L2Rpdj4KICAgICAgICA8cD5QbGVhc2UgdXNlIHJlbGF5cyB3aXRoIE5JUC01MCAoc2VhcmNoKSBmdW5jdGlvbmFsaXR5PC9wPgogICAgICAgIDxmb3JtIGFjdGlvbj0iIyIgaWQ9InJlbGF5cy1mb3JtIj4KICAgICAgICAgIDx0ZXh0YXJlYSBpZD0icmVsYXlzIj48L3RleHRhcmVhPgogICAgICAgICAgPGlucHV0IGNsYXNzPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9InNhdmUgcmVsYXlzIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5wcml2YXRlIGtleTo8L2Rpdj4KICAgICAgICA8cD5JZiB5b3UgY2FudCB1c2UgYnJvd3NlciBhZGRvbiAobW9iaWxlKTwvcD4KICAgICAgICA8Zm9ybSBhY3Rpb249IiMiIGlkPSJwcml2a2V5LWZvcm0iPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJwcml2a2V5Ii8+CiAgICAgICAgICA8aW5wdXQgY2xhc3M9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0ic2F2ZSBrZXkiLz4KICAgICAgICA8L2Zvcm0+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmxvZ3M8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJsb2dzIj48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+bGF0ZXN0IHJlbGVhc2U6PC9kaXY+CiAgICAgICAgPGEgaWQ9InJlbGVhc2UiIGhyZWY9IiMiPjwvYT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9ImhlYWRlciI+CiAgICAgIDxzcGFuIGlkPSJjb250cm9saW5mbyI+Y29udHJvbHM6IGFycm93cywgZW50ZXIsIGVzYzwvc3Bhbj4KICAgICAgPGEgaWQ9ImZpbHRlci1saWtlcyIgaHJlZj0iIyI+PC9hPgogICAgICA8ZGl2IGNsYXNzPSJpdGVtcyI+CiAgICAgICAgPGEgaWQ9Im1lbnUiIGhyZWY9IiMiPgogICAgICAgICAgPHN2ZyBjbGFzcz0ibWVudXN2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KCQkgICAgICAgIDxwYXRoIGQ9Ik0xMCwxLjQ0NWMtNC43MjYsMC04LjU1NSwzLjgyOS04LjU1NSw4LjU1NWMwLDQuNzI1LDMuODI5LDguNTU1LDguNTU1LDguNTU1YzQuNzI1LDAsOC41NTUtMy44Myw4LjU1NS04LjU1NUMxOC41NTUsNS4yNzQsMTQuNzI1LDEuNDQ1LDEwLDEuNDQ1IE0xMCwxNy42NTRjLTQuMjIxLDAtNy42NTQtMy40MzQtNy42NTQtNy42NTRjMC00LjIyMSwzLjQzMy03LjY1NCw3LjY1NC03LjY1NGM0LjIyMiwwLDcuNjU0LDMuNDMzLDcuNjU0LDcuNjU0QzE3LjY1NCwxNC4yMjEsMTQuMjIyLDE3LjY1NCwxMCwxNy42NTQgTTE0LjM5LDEwYzAsMC4yNDgtMC4yMDMsMC40NS0wLjQ1LDAuNDVINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAzLTAuNDUtMC40NXMwLjIwMy0wLjQ1LDAuNDUtMC40NWg3Ljg3OUMxNC4xODcsOS41NSwxNC4zOSw5Ljc1MiwxNC4zOSwxMCBNMTQuMzksMTIuNzAyYzAsMC4yNDctMC4yMDMsMC40NDktMC40NSwwLjQ0OUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDItMC40NS0wLjQ0OWMwLTAuMjQ4LDAuMjAzLTAuNDUxLDAuNDUtMC40NTFoNy44NzlDMTQuMTg3LDEyLjI1MSwxNC4zOSwxMi40NTQsMTQuMzksMTIuNzAyIE0xNC4zOSw3LjI5OGMwLDAuMjQ4LTAuMjAzLDAuNDUtMC40NSwwLjQ1SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMy0wLjQ1LTAuNDVzMC4yMDMtMC40NSwwLjQ1LTAuNDVoNy44NzlDMTQuMTg3LDYuODQ4LDE0LjM5LDcuMDUxLDE0LjM5LDcuMjk4Ij48L3BhdGg+CgkgICAgICAgIDwvc3ZnPgogICAgICAgIDwvYT4KICAgICAgICA8YSBpZD0idGl0bGUiIGhyZWY9IiMiPmZpbGVzLmh0bWw8L2E+CiAgICAgICAgPGZvcm0gaWQ9InF1ZXJ5LWZvcm0iIGFjdGlvbj0iIyI+CiAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9InF1ZXJ5IiBuYW1lPSJxdWVyeSIgaWQ9IiIgLz4KICAgICAgICAgIDxzZWxlY3QgaWQ9InF1ZXJ5LXR5cGUiPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJhbGwiPmFsbDwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJpbWFnZSI+aW1hZ2VzPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9InZpZGVvIj52aWRlb3M8L29wdGlvbj4KICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgICAgPGlucHV0IGlkPSJnbyIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iZ28iLz4KICAgICAgICA8L2Zvcm0+CiAgICAgICAgPHNwYW4gaWQ9InF1ZXJ5ZGlzcGxheSI+CiAgICAgICAgICA8c3BhbiBjbGFzcz0idGV4dCI+PC9zcGFuPgogICAgICAgIDwvc3Bhbj4KICAgICAgICA8ZGl2IGlkPSJsb2FkaW5nIj51cGRhdGluZzwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0icGljcyI+PC9kaXY+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly91bnBrZy5jb20vbm9zdHItdG9vbHMvbGliL25vc3RyLmJ1bmRsZS5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9zbG93bGkuZ2l0aHViLmlvL2JlY2gzMi1idWZmZXIvYXNzZXRzL2pzL2JlY2gzMi1idWZmZXIubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQ+CiAgICAgIGNvbnN0IHVwZGF0ZXNwdWJrZXkgPSAiYWU1YzZlMGI3NDY2MGQyMTk0YzgyNTRiNWMyYzgyNTY3NjU3NmJlMDI5NzM3OWZhMjA1MjMxMTRhNmE4NWU4NyIKICAgICAgY29uc3QgcXVlcmllcyA9IHsKICAgICAgICAiZ2xvYmFsIjogJ1siUkVRIiwiPEk+Iix7ImNhY2hlIjpbImV4cGxvcmUiLHsidGltZWZyYW1lIjoibGF0ZXN0Iiwic2NvcGUiOiJnbG9iYWwiLCJsaW1pdCI6PEw+fV19XScsIAogICAgICAgICJhdXRob3IiOiAnWyJSRVEiLCI8ST4iLHsia2luZHMiOlsxXSwiYXV0aG9ycyI6WyI8UD4iXX1dJywKICAgICAgICAicmVhY3Rpb25zIjogJ1siUkVRIiwiPEk+IiwgeyJraW5kcyI6WzddLCIjZSI6IDxFPn1dJwogICAgICB9CiAgICAgIHFzKCIjcmVsYXlzIikudmFsdWUgPSByZWxheXMoKS5qb2luKCJcbiIpCiAgICAgIHFzKCIjcHJpdmtleSIpLnZhbHVlID0gcHJpdmtleSgpCiAgICAgIGNvbnN0IGNvbG9wdHMgPSBbMSwgMiwgNCwgNiwgMTBdCgogICAgICBjb2xzID0gKCkgPT4gcGFyc2VJbnQoc2V0dGluZygiY29scyIsIGNvbG9wdHNbMV0pLCAxMCkKICAgICAgYXV0b3BsYXkgPSAoKSA9PiBzZXR0aW5nKCJhdXRvcGxheSIsICJvZmYiKQogICAgICBsaW1pdCA9ICgpID0+IHBhcnNlSW50KHNldHRpbmcoImxpbWl0IiwgMTUpLCAxMCkKICAgICAgCiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgiY29scyIgKyBjb2xzKCkpCiAgICAgIAogICAgICBsZXQgcHJvdG9jb2wgPSBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvKSA/ICJub3N0cjoiIDogIndlYitub3N0cjoiCiAgICAgIGxldCBzb2NrZXRzID0gW10KICAgICAgbGV0IHJlc2hhbmRsZXJzID0gW10KICAgICAgbGV0IHVybHMgPSBbXQogICAgICBsZXQgbGlrZXMgPSBbXQogICAgICBsZXQgbmV3bGlrZXMgPSBbXQogICAgICBsZXQgcmVhY3RlZCA9IFtdCiAgICAgIGxldCBpZGNvdW50ZXIgPSAwCiAgICAgIGxldCBxdWVyeXdhaXQgPSBudWxsCiAgICAgIGxldCBwcmltYWxzb2NrZXQgPSBudWxsCiAgICAgIGxldCB0eXBlcyA9IHsKICAgICAgICBpbWFnZTogWyJwbmciLCAianBnIiwgImpwZWciLCAid2VicCJdLAogICAgICAgIHZpZGVvOiBbIm1wNCIsICJ3ZWJtIl0KICAgICAgfQogICAgICBsZXQgaW1ncmVnZXggPSAvaHR0cCh8cylcOlwvXC9bXiBcbl0qP1wuKHBuZ3xqcGd8anBlZ3x3ZWJwKS9naQogICAgICBsZXQgdmlkZW9yZWdleCA9IC9odHRwKHxzKVw6XC9cL1teIFxuXSo/XC4obXA0fHdlYm0pL2dpCiAgICAgIGxldCB2aWRlb2V4dHJlZ2V4ID0gL1wuKG1wNHx3ZWJtKSQvaQogICAgICBsZXQgaW1nZXh0cmVnZXggPSAvXC4ocG5nfGpwZ3xqcGVnfHdlYnApJC9pCiAgICAgIHdhaXRtcyA9IDUwMDAKICAgICAgcXVlcnlzdHIgPSAiIgogICAgICBsZXQgcXVlcnljb3VudCA9IDAKICAgICAgbGV0IGhvdmVyZWR2aWRlbyA9IG51bGwKICAgICAgCiAgICAgIHVwZGF0ZXF1ZXJ5KCkKICAgICAgcXMoIiNwaWMtbGlrZSIpLmlubmVySFRNTCA9IHFzKCIjZmlsdGVyLWxpa2VzIikuaW5uZXJIVE1MID0gcXMoIiN0ZW1wbGF0ZSAuaGVhcnRzdmciKS5vdXRlckhUTUwKICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgIHNldGFjdGl2ZSgic2V0YXV0b3BsYXkiLCAiYXV0b3BsYXkiLCBhdXRvcGxheSgpKQogICAgICAKICAgICAgZnVuY3Rpb24gZnJvbUhleFN0cmluZyhzdHIpewogICAgICAgIGxldCBidWZmZXIgPSBuZXcgVWludDhBcnJheShzdHIubGVuZ3RoIC8gMikKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlci5sZW5ndGg7IGkrKykgewogICAgICAgICAgYnVmZmVyW2ldID0gcGFyc2VJbnQoc3RyLnN1YnN0cigyICogaSwgMiksIDE2KQogICAgICAgIH0KICAgICAgICByZXR1cm4gYnVmZmVyCiAgICAgIH0KICAKICAgICAgZnVuY3Rpb24gcmVsYXlzKCl7CiAgICAgICAgY29uc3Qgb2JqID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgicmVsYXlzIikpCiAgICAgICAgY29uc3QgciA9IG9iaiAmJiBvYmouZmlsdGVyKHIgPT4gci5tYXRjaCgvd3NzOlwvXC8uKy8pKSB8fCBbXQogICAgICAgIAogICAgICAgIHJldHVybiByLmxlbmd0aCA+IDAgJiYgciB8fCBbCiAgICAgICAgICAid3NzOi8vcmVsYXkubm9zdHIuYmFuZCIsCiAgICAgICAgICAid3NzOi8vbmIucmVsYXkuY2VudGVyIiwgCiAgICAgICAgICAid3NzOi8vbm9zdHIuY29tcGlsZS1lcnJvci5uZXQiCiAgICAgICAgXQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBwcml2a2V5KCl7CiAgICAgICAgbGV0IGtleSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJwcml2a2V5IikgfHwgIiIKICAgICAgICAKICAgICAgICBpZihrZXkubGVuZ3RoID09IDYzKXsKICAgICAgICAgIGtleSA9IE5vc3RyVG9vbHMubmlwMTkuZGVjb2RlKGtleSkuZGF0YQogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4ga2V5Lmxlbmd0aCA9PSA2NCAmJiBrZXkgfHwgbnVsbAogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzZXR0aW5nKGtleSwgZGVmYXVsdHZhbHVlKXsKICAgICAgICBjb25zdCB2ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KQogICAgICAgIHJldHVybiB2ICYmIG9wdGlvbigic2V0IiArIGtleSwga2V5LCB2KSAmJiB2IHx8IGRlZmF1bHR2YWx1ZQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBvcHRpb24oYywga2V5LCB2YWwpewogICAgICAgIHJldHVybiBxcygiLiIgKyBjICsgIltkYXRhLSIgKyBrZXkgKyAiPSciICsgdmFsICsgIiddIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXMocSl7CiAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXNhKHEpewogICAgICAgIHJldHVybiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocSkpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGdpZChpKXsKICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXVlcnl0eXBlKCl7CiAgICAgICAgcmV0dXJuIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlIHx8ICJhbGwiCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZXF1ZXJ5KCl7CiAgICAgICAgbGV0IHBhcnRzID0gZGVjb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpKS5zcGxpdCgiLyIpCiAgICAgICAgcXVlcnlzdHIgPSBxcygiI3F1ZXJ5ZGlzcGxheSAudGV4dCIpLmlubmVyVGV4dCA9IHBhcnRzWzBdCiAgICAgICAgcXMoIiNxdWVyeSIpLnZhbHVlID0gcGFydHNbMF0KICAgICAgICBxcygiI3F1ZXJ5LXR5cGUiKS52YWx1ZSA9IHBhcnRzWzFdIHx8ICJhbGwiCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGFjdGl2ZSgpewogICAgICAgIHJldHVybiBxcygiI3BpY3MgLmFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHBpY29mZnNldChvZmZzZXQpewogICAgICAgIGNvbnN0IHBpY3MgPSBxc2EoIiNwaWNzID4gLml0ZW0iKS5maWx0ZXIoZSA9PiBlLnN0eWxlLmRpc3BsYXkgPT0gImJsb2NrIikKICAgICAgICByZXR1cm4gcGljc1twaWNzLmluZGV4T2YoYWN0aXZlKCkpK29mZnNldF0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gbGFzdGFjdGl2ZSgpewogICAgICAgIHJldHVybiBxc2EoIiNwaWNzIC5hY3RpdmUiKS5wb3AoKSAgICAgIAogICAgICB9CgogICAgICBmdW5jdGlvbiBtZW51KCl7CiAgICAgICAgcXNhKCIjbWVudS1jb250ZW50LCAjbWVudS1vdmVybGF5IikuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnRvZ2dsZSgib3BlbiIpKQogICAgICB9CiAgCiAgICAgIGZ1bmN0aW9uIHNldGFjdGl2ZShjLCBrZXksIHZhbCl7CiAgICAgICAgcXNhKCIuIiArIGMpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpKQogICAgICAgIGNvbnN0IG9wdGlvbiA9IHFzKCIuIiArIGMgKyAiW2RhdGEtIiArIGtleSArICI9JyIgKyB2YWwgKyAiJ10iKQogICAgICAgIG9wdGlvbj8uY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlYWxsdmlkZW9wbGF5KCl7CiAgICAgICAgcXNhKCIjcGljcyB2aWRlbyIpLmZvckVhY2goYXN5bmMgdiA9PiB1cGRhdGV2aWRlb3BsYXkodikpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZXZpZGVvcGxheSh2KXsKICAgICAgICBjb25zdCBhcGxheSA9IGF1dG9wbGF5KCkKICAgICAgICAKICAgICAgICBpZihhcGxheSAhPSAib24iKXsKICAgICAgICAgIHYubXV0ZWQgPSBmYWxzZQogICAgICAgICAgdi5wYXVzZSgpCiAgICAgICAgfWVsc2V7CiAgICAgICAgICB2Lm11dGVkID0gdHJ1ZQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBuID0gdi5wYXJlbnRFbGVtZW50CiAgICAgICAgCiAgICAgICAgaWYoKG4ub2Zmc2V0VG9wICsgbi5vZmZzZXRIZWlnaHQpIDwgc2Nyb2xsWSAKICAgICAgICB8fCBuLm9mZnNldFRvcCA+IChzY3JvbGxZICsgdmlzdWFsVmlld3BvcnQuaGVpZ2h0KSl7CiAgICAgICAgICBpZih2LnJlYWR5U3RhdGUgPT0gNCl7CiAgICAgICAgICAgIHYucGF1c2UoKQogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIHYucHJlbG9hZCA9ICJub25lIgogICAgICAgICAgfQogICAgICAgIH1lbHNlIGlmKHYucmVhZHlTdGF0ZSAhPSA0KXsKICAgICAgICAgIHYucHJlbG9hZCA9ICJhdXRvIgogICAgICAgIH0KICAgICAgICBlbHNlIGlmKGFwbGF5ID09ICJvbiIgfHwgKGFwbGF5ID09ICJob3ZlciIgJiYgdiA9PSBob3ZlcmVkdmlkZW8pKXsKICAgICAgICAgIHYucGxheSgpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLCBlID0+IHsKICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpCiAgICAgICAgdXBkYXRlYWxsdmlkZW9wbGF5KCkKICAgICAgfSkKICAgICAgCiAgICAgIGxldCB0b3VjaCA9IG51bGwKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCBlID0+IHRvdWNoID0gZS5jaGFuZ2VkVG91Y2hlc1swXSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIiwgZSA9PiB7CiAgICAgICAgY29uc3QgeGRpZmYgPSBlLmNoYW5nZWRUb3VjaGVzWzBdLnNjcmVlblggLSB0b3VjaC5zY3JlZW5YCgogICAgICAgIGlmKHhkaWZmIDwgLTUwKXsKICAgICAgICAgIHN3aXBlKDEpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKHhkaWZmID4gNTApewogICAgICAgICAgc3dpcGUoLTEpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgcXMoIiNxdWVyeS1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgbG9jYXRpb24uaGFzaCA9ICIjIiArIGVuY29kZVVSSUNvbXBvbmVudChxcygiI3F1ZXJ5IikudmFsdWUgKyAiLyIgKyBxdWVyeXR5cGUoKSkKICAgICAgICB1cGRhdGVxdWVyeSgpCiAgICAgICAgcXVlcnl3YWl0LnJlc29sdmUoKQogICAgICB9KQoKICAgICAgcXMoIiNyZWxheXMtZm9ybSIpLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsIGFzeW5jIGUgPT4gewogICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIGxldCByID0gSlNPTi5zdHJpbmdpZnkocXMoIiNyZWxheXMiKS52YWx1ZS5zcGxpdCgiXG4iKSkKICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgicmVsYXlzIiwgcikKICAgICAgICBkaXNjb25uZWN0KCkKICAgICAgfSkKCiAgICAgIHFzKCIjcHJpdmtleS1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgYXN5bmMgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgY29uc3Qga2V5ID0gcXMoIiNwcml2a2V5IikudmFsdWUKCiAgICAgICAgaWYoa2V5Lmxlbmd0aCAhPSA2NCAmJiBrZXkubGVuZ3RoICE9IDYzKXsKICAgICAgICAgIGFsZXJ0KCJrZXkgc2hvdWxkIGJlIDYzIG9yIDY0IGNoYXJhY3RlcnMgbG9uZyIpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oInByaXZrZXkiLCBrZXkpCiAgICAgICAgYWxlcnQoImtleSBzYXZlZCIpCiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLCBhc3luYyAoZSkgPT4gewogICAgICAgIGlmKGF1dG9wbGF5KCkgPT0gImhvdmVyIiAmJiBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInZpZGVvLWNvbnRhaW5lciIpKXsKICAgICAgICAgIGhvdmVyZWR2aWRlbyA9IGUudGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAgIGhvdmVyZWR2aWRlby5wbGF5KCkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaG92ZXJlZHZpZGVvID0gZmFsc2UKICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLnN0eWxlLmRpc3BsYXkgIT0gImJsb2NrIiAmJiBhdXRvcGxheSgpID09ICJob3ZlciIgJiYgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2aWRlby1jb250YWluZXIiKSl7CiAgICAgICAgICBxc2EoInZpZGVvIikuZm9yRWFjaCh2ID0+IHYucGF1c2UoKSkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaWYoZS50YXJnZXQudHlwZSA9PSAic3VibWl0IiB8fCAoZS50YXJnZXQudGFnTmFtZSA9PSAiQSIgJiYgZS50YXJnZXQuaHJlZi5tYXRjaCgvXih8d2ViXCspbm9zdHJcOi8pKSl7CiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAidGl0bGUiKXsKICAgICAgICAgIHFzKCIjcXVlcnkiKS52YWx1ZSA9ICIiCiAgICAgICAgICBxcygiI3F1ZXJ5LXR5cGUiKS52YWx1ZSA9ICJhbGwiCiAgICAgICAgICBxcygiI2dvIikuY2xpY2soKQogICAgICAgIH0KCiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJmaWx0ZXItbGlrZXMiKXsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnRvZ2dsZSgiZmlsdGVyLWxpa2VzIikKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKSl7CiAgICAgICAgICBhY3RpdmUoKT8uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIGdpZChlLnRhcmdldC5pZCkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIHNob3coZS50YXJnZXQuaWQpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS50YXJnZXQudGFnTmFtZSAhPSAiQSIgJiYgKHFzKCIjcGljLWNvbnRhaW5lciIpID09IGUudGFyZ2V0IHx8IHFzKCIjbWVkaWEtY29udGFpbmVyIHZpZGVvIikgPT0gZS50YXJnZXQpKXsKICAgICAgICAgIGhpZGVtZWRpYSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJtZW51IiB8fCBlLnRhcmdldC5pZCA9PSAibWVudS1vdmVybGF5Iil7CiAgICAgICAgICBtZW51KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRjb2xzIikpewogICAgICAgICAgZm9yKGxldCBjIG9mIGNvbG9wdHMpewogICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoImNvbHMiICsgYykKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJjb2xzIiArIGUudGFyZ2V0LmRhdGFzZXQuY29scykKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJjb2xzIiwgZS50YXJnZXQuZGF0YXNldC5jb2xzKQogICAgICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRhdXRvcGxheSIpKXsKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJhdXRvcGxheSIsIGUudGFyZ2V0LmRhdGFzZXQuYXV0b3BsYXkpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGF1dG9wbGF5IiwgImF1dG9wbGF5IiwgYXV0b3BsYXkoKSkKICAgICAgICAgIHVwZGF0ZWFsbHZpZGVvcGxheSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJsaWtlIikgJiYgbGlrZShlLnRhcmdldCkKICAgICAgfSkKICAgICAgCiAgICAgIGZ1bmN0aW9uIGhhc2tleSgpewogICAgICAgIHJldHVybiB3aW5kb3cubm9zdHIgfHwgcHJpdmtleSgpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHB1YmtleSgpewogICAgICAgIHJldHVybiB3aW5kb3cubm9zdHIgJiYgYXdhaXQgd2luZG93Lm5vc3RyLmdldFB1YmxpY0tleSgpIHx8IE5vc3RyVG9vbHMuZ2V0UHVibGljS2V5KHByaXZrZXkoKSkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gc2lnbihldmVudCl7CiAgICAgICAgaWYod2luZG93Lm5vc3RyKXsKICAgICAgICAgIHJldHVybiBhd2FpdCBub3N0ci5zaWduRXZlbnQoZXZlbnQpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGV2ZW50LnNpZyA9IE5vc3RyVG9vbHMuZ2V0U2lnbmF0dXJlKGV2ZW50LCBwcml2a2V5KCkpCiAgICAgICAgcmV0dXJuIGV2ZW50CiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGxpa2UobGluayl7CiAgICAgICAgY29uc3QgZXZlbnQgPSBsaW5rLnBhcmVudEVsZW1lbnRbImRhdGEtZXZlbnQiXQogICAgICAgIGNvbnN0IHB1YmsgPSBhd2FpdCBwdWJrZXkoKQogICAgICAgIGNvbnN0IGxpa2UgPSBhd2FpdCBzaWduKHsKICAgICAgICAgICJraW5kIjogNywKICAgICAgICAgICJjb250ZW50IjogIisiLAogICAgICAgICAgInRhZ3MiOiBbCiAgICAgICAgICAgIFsiZSIsIGV2ZW50LmlkXSwKICAgICAgICAgICAgWyJwIiwgZXZlbnQucHVia2V5XQogICAgICAgICAgXSwKICAgICAgICAgICJwdWJrZXkiOiBwdWJrLAogICAgICAgICAgImNyZWF0ZWRfYXQiOiBwYXJzZUludChEYXRlLm5vdygpIC8gMTAwMCAsIDEwKQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgc29ja2V0cy5mb3JFYWNoKHMgPT4gcy5zZW5kKEpTT04uc3RyaW5naWZ5KFsiRVZFTlQiLCBsaWtlXSkpKQogICAgICAgIGxpbmsuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCgogICAgICAgIGNvbnN0IHBpY2lkID0gbGlua1siZGF0YS1pdGVtLWlkIl0gfHwgbGluay5kYXRhc2V0LnBpY0lkCiAgICAgICAgCiAgICAgICAgaWYocGljaWQpewogICAgICAgICAgZ2lkKHBpY2lkKS5xdWVyeVNlbGVjdG9yKCIubGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgICAgcmVhY3RlZC5wdXNoKHBpY2lkKQogICAgICAgIH0KICAgICAgfQogICAgCiAgICAgIGZ1bmN0aW9uIHN3aXBlKG9mZnNldCl7CiAgICAgICAgaWYocGljb2Zmc2V0KG9mZnNldCkpewogICAgICAgICAgcGljb2Zmc2V0KG9mZnNldCkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIHRoaXNbb2Zmc2V0ID09IDEgJiYgImxhc3RhY3RpdmUiIHx8ICJhY3RpdmUiXSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICB1cGRhdGVzaG93KCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZXNob3coKXsKICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLnN0eWxlLmRpc3BsYXkgPT0gImJsb2NrIil7CiAgICAgICAgICBoaWRldmlkZW8oKQogICAgICAgICAgc2hvdyhhY3RpdmUoKS5pZCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBlID0+IHsKICAgICAgICBpZihbIlRhYiIsICJBcnJvd0xlZnQiLCAiQXJyb3dSaWdodCIsICJBcnJvd1VwIiwgIkFycm93RG93biJdLmluY2x1ZGVzKGUua2V5KSl7CiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJFc2NhcGUiKXsKICAgICAgICAgIG1lbnUoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUua2V5ID09ICJFbnRlciIgJiYgZS50YXJnZXQudGFnTmFtZSA9PSAiQk9EWSIpewogICAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5zdHlsZS5kaXNwbGF5ID09ICJibG9jayIpewogICAgICAgICAgICBoaWRlbWVkaWEoKQogICAgICAgICAgICByZXR1cm4KICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgc2hvdyhhY3RpdmUoKS5pZCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93VXAiICYmIHBpY29mZnNldCgtY29scygpKSl7CiAgICAgICAgICBwaWNvZmZzZXQoLWNvbHMoKSkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIGxhc3RhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgdXBkYXRlc2hvdygpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dEb3duIiAmJiBwaWNvZmZzZXQoY29scygpKSl7CiAgICAgICAgICBwaWNvZmZzZXQoY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgYWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIHVwZGF0ZXNob3coKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93TGVmdCIpewogICAgICAgICAgc3dpcGUoLTEpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dSaWdodCIpewogICAgICAgICAgc3dpcGUoMSkKICAgICAgICB9CiAgICAgIH0pCgogICAgICBhc3luYyBmdW5jdGlvbiBoYW5kbGVxdWVyeXJlcyhyZXMsIHNvY2tldCwgcSwgdHlwZSwgc3RpbWUpewogICAgICAgIHNhdmUoc29ja2V0LCByZXMsIHEsIHR5cGUsIGZhbHNlLCBmYWxzZSkKICAgICAgICBsb2coInF1ZXJ5IHJlcyIsIHJlcy5sZW5ndGgsIHNvY2tldC51cmwpCiAgICAgICAgcXVlcnljb3VudC0tCiAgICAgICAgaWYocXVlcnljb3VudCA9PSAwKXsKICAgICAgICAgIHFzKCIjbG9hZGluZyIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSIKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbGV0IHdhaXQgPSB3YWl0bXMgLSAoRGF0ZS5ub3coKSAtIHN0aW1lKQogICAgICAgIHF1ZXJ5d2FpdCA9IHNsZWVwKHdhaXQpCiAgICAgICAgYXdhaXQgcXVlcnl3YWl0LnByb21pc2UKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcHJpbWFsZ2xvYmFsKHNvY2tldCl7CiAgICAgICAgbG9nKCJnbG9iYWwiLCBzb2NrZXQudXJsKQogICAgICAgIHF1ZXJ5Y291bnQrKwogICAgICAgIHFzKCIjbG9hZGluZyIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgICAgbGV0IHN0aW1lID0gRGF0ZS5ub3coKQogICAgICAgIGxldCBxaWQgPSAiZ2xvYmFsXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgbGV0IHFpZGxpa2VzID0gImxpa2VzXyIgKyAoKytpZGNvdW50ZXIpCgogICAgICAgIGlmKG5ld2xpa2VzLmxlbmd0aCA+IDApewogICAgICAgICAgcHJpbWFsc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoWwogICAgICAgICAgICAiUkVRIiwgCiAgICAgICAgICAgIHFpZGxpa2VzLCAKICAgICAgICAgICAgewogICAgICAgICAgICAgICJjYWNoZSI6IFsKICAgICAgICAgICAgICAgICJldmVudHMiLCB7CiAgICAgICAgICAgICAgICAgICJldmVudF9pZHMiOiBuZXdsaWtlcwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIF0KICAgICAgICAgICAgfQogICAgICAgICAgXSkpCgogICAgICAgICAgY29uc3QgbGlrZV9ldmVudHMgPSBhd2FpdCB3YWl0cmVzKHFpZGxpa2VzKQogICAgICAgICAgbmV3bGlrZXMuc3BsaWNlKDApCiAgICAgICAgICAKICAgICAgICAgIGF3YWl0IHNhdmUoc29ja2V0LCBsaWtlX2V2ZW50cywgIiIsICJhbGwiLCB0cnVlLCB0cnVlKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAiUkVRIiwgCiAgICAgICAgICBxaWQsIAogICAgICAgICAgewogICAgICAgICAgICAiY2FjaGUiOiBbCiAgICAgICAgICAgICAgImV4cGxvcmUiLCAKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidGltZWZyYW1lIjogImxhdGVzdCIsCiAgICAgICAgICAgICAgICAic2NvcGUiOiAiZ2xvYmFsIiwKICAgICAgICAgICAgICAgICJsaW1pdCI6IDIwCiAgICAgICAgICAgICAgfQogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSkpCiAgICAgICAgCiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgd2FpdHJlcyhxaWQpCiAgICAgICAgYXdhaXQgaGFuZGxlcXVlcnlyZXMocmVzLmZpbHRlcihlID0+IGUua2luZCA9PSAxKSwgc29ja2V0LCAiIiwgImFsbCIsIHN0aW1lKQogICAgICAgIHByaW1hbGdsb2JhbChzb2NrZXQpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5KHNvY2tldCwgcHJpbWFsKXsKICAgICAgICBsb2coInF1ZXJ5Iiwgc29ja2V0LnVybCkKICAgICAgICBxdWVyeWNvdW50KysKICAgICAgICBxcygiI2xvYWRpbmciKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgIAogICAgICAgIGxldCBzdGltZSA9IERhdGUubm93KCkKICAgICAgICBsZXQgcSA9IHF1ZXJ5c3RyLnRyaW0oKQogICAgICAgIGxldCB0eXBlID0gcXVlcnl0eXBlKCkKICAgICAgICBsZXQgaSA9ICsraWRjb3VudGVyCiAgICAgICAgbGV0IHFpZCA9ICJxdWVyeV8iICsgaQogICAgICAgIGxldCBmaWx0ZXJzID0gW10KCiAgICAgICAgZmlsdGVycy5wdXNoKC4uLih0eXBlc1t0eXBlXSB8fCBbXSkubWFwKCh0KSA9PiB7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBraW5kczogWzFdLCAKICAgICAgICAgICAgc2VhcmNoOiAiLiIgKyB0LAogICAgICAgICAgICBsaW1pdDogMjAKICAgICAgICAgIH0KICAgICAgICB9KSkKICAgICAgICAKICAgICAgICBpZihxLmxlbmd0aCA+IDApewogICAgICAgICAgZmlsdGVycy5wdXNoKHtraW5kczogWzFdLCBzZWFyY2g6IHF9KQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihmaWx0ZXJzLmxlbmd0aCA9PSAwKXsKICAgICAgICAgIGZpbHRlcnMucHVzaCh7a2luZHM6IFsxXX0pCiAgICAgICAgfQogICAgICAgIAogICAgICAgIAogICAgICAgIGNvbnN0IGxpa2VzcmVzID0gYXdhaXQgcXVlcnlsaWtlcyhzb2NrZXQpCiAgICAgICAgCiAgICAgICAgbGlrZXNyZXMuZm9yRWFjaChldmVudGlkID0+IHsKICAgICAgICAgIGlmKCFsaWtlcy5pbmNsdWRlcyhldmVudGlkKSl7CiAgICAgICAgICAgIGxpa2VzLnB1c2goZXZlbnRpZCkKICAgICAgICAgICAgbmV3bGlrZXMucHVzaChldmVudGlkKQogICAgICAgICAgfQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgY29uc3Qgc2VhcmNob2JqID0gWyJSRVEiLCBxaWQsIC4uLmZpbHRlcnNdCiAgICAgICAgY29uc3Qgc2VhcmNoanNvbiA9IEpTT04uc3RyaW5naWZ5KHNlYXJjaG9iaikKICAgICAgICBzb2NrZXQuc2VuZChzZWFyY2hqc29uKQogICAgICAgIAogICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHdhaXRyZXMocWlkKQogICAgICAgIGF3YWl0IGhhbmRsZXF1ZXJ5cmVzKHJlcywgc29ja2V0LCBxLCB0eXBlLCBzdGltZSkKICAgICAgICBxdWVyeShzb2NrZXQpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5bGlrZXMoc29ja2V0KXsKICAgICAgICBpZighaGFza2V5KCkpewogICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IG15cHVia2V5ID0gYXdhaXQgcHVia2V5KCkKICAgICAgICBjb25zdCBldmVudHMgPSBhd2FpdCBxdWVyeWV2ZW50cyhzb2NrZXQsIFs3XSwgbnVsbCwgW215cHVia2V5XSkKICAgICAgICByZXR1cm4gZXZlbnRzLm1hcChlID0+IGUudGFncy5maW5kKHQgPT4gdFswXSA9PSAiZSIpWzFdKQogICAgICB9CgogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeWV2ZW50cyhzb2NrZXQsIGtpbmRzLCBldmVudGlkcywgYXV0aG9ycyl7CiAgICAgICAgY29uc3QgcXVlcnlpZCA9ICJldmVudHNfIiArICgrK2lkY291bnRlcikKICAgICAgICBjb25zdCBmaWx0ZXJzID0ge30KICAgICAgICAKICAgICAgICBmaWx0ZXJzLmtpbmRzID0ga2luZHMKICAgICAgICAKICAgICAgICBpZihldmVudGlkcyl7CiAgICAgICAgICBmaWx0ZXJzWyIjZSJdID0gZXZlbnRpZHMKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoYXV0aG9ycyl7CiAgICAgICAgICBmaWx0ZXJzWyJhdXRob3JzIl0gPSBhdXRob3JzCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAiUkVRIiwgCiAgICAgICAgICBxdWVyeWlkLCAKICAgICAgICAgIGZpbHRlcnMKICAgICAgICBdKQoKICAgICAgICBzb2NrZXQuc2VuZChqc29uKQogICAgICAgIAogICAgICAgIHJldHVybiBhd2FpdCB3YWl0cmVzKHF1ZXJ5aWQpIHx8IFtdCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5cHVia2V5KHNvY2tldCwgcHViayl7CiAgICAgICAgY29uc3QgcXVlcnlpZCA9ICJxdWVyeV8iICsgKCsraWRjb3VudGVyKQogICAgICAgIHNvY2tldC5zZW5kKHF1ZXJpZXMuYXV0aG9yLnJlcGxhY2UoIjxJPiIsIHF1ZXJ5aWQpLnJlcGxhY2UoIjxQPiIsIHB1YmspKQoKICAgICAgICByZXR1cm4gKGF3YWl0IHdhaXRyZXMocXVlcnlpZCkpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHNhdmUoc29ja2V0LCBldmVudGRiLCBxLCBxdHlwZSwgcmVhY3RlZCwgYXBwZW5kKXsKICAgICAgICBsZXQgZXZlbnRwdWJrZXlzID0gW10KICAgICAgICBjb25zdCBldmVudHMgPSBldmVudGRiLmZpbHRlcihvID0+IHsKICAgICAgICAgIGlmKHEubGVuZ3RoID4gMCl7CiAgICAgICAgICAgIGZvcihsZXQgd29yZCBvZiBxLnNwbGl0KCIgIikpewogICAgICAgICAgICAgIGlmKG8uY29udGVudC50b0xvd2VyQ2FzZSgpLmluZGV4T2Yod29yZC50b0xvd2VyQ2FzZSgpKSA9PSAtMSl7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2UKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm4gdHJ1ZQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgbGV0IHJlc3VsdHMgPSBbXQogICAgICAgIGNvbnN0IGV2ZW50aWRzID0gZXZlbnRzLm1hcChlID0+IGUuaWQpCiAgICAgICAgbGV0IG5ld3VybHMgPSBbXQogICAgICAgIAogICAgICAgIGZvcihsZXQgZXZlbnQgb2YgZXZlbnRzKXsKICAgICAgICAgIGxldCB1cmxzbWF0Y2ggPSBbXQogICAgICAgICAgCiAgICAgICAgICBpZihxdHlwZSAhPSAidmlkZW8iKXsKICAgICAgICAgICAgdXJsc21hdGNoLnB1c2goLi4uKGV2ZW50LmNvbnRlbnQubWF0Y2goaW1ncmVnZXgpIHx8IFtdKSkKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgaWYocXR5cGUgIT0gImltYWdlIil7CiAgICAgICAgICAgIHVybHNtYXRjaC5wdXNoKC4uLihldmVudC5jb250ZW50Lm1hdGNoKHZpZGVvcmVnZXgpIHx8IFtdKSkKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgdXJsc21hdGNoID0gdXJsc21hdGNoLmZpbHRlcih1cmwgPT4gIXVybHMuaW5jbHVkZXModXJsKSkKCiAgICAgICAgICBpZih1cmxzbWF0Y2gubGVuZ3RoID4gMCl7CiAgICAgICAgICAgIG5ld3VybHMucHVzaCh7CiAgICAgICAgICAgICAgZXZlbnQ6IGV2ZW50LAogICAgICAgICAgICAgIHVybHM6IHVybHNtYXRjaAogICAgICAgICAgICB9KQogICAgICAgICAgICAKICAgICAgICAgICAgdXJscy5wdXNoKC4uLnVybHNtYXRjaCkKICAgICAgICAgICAgZXZlbnRwdWJrZXlzLmluY2x1ZGVzKGV2ZW50LnB1YmtleSkgfHwgZXZlbnRwdWJrZXlzLnB1c2goZXZlbnQucHVia2V5KQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBsb2coInF1ZXJ5IG1ldGEiLCBzb2NrZXQudXJsKQogICAgICAgIGxldCBtZXRhZXZlbnRzID0gYXdhaXQgcXVlcnlldmVudHMoc29ja2V0LCBbMF0sIG51bGwsIGV2ZW50cHVia2V5cykKICAgICAgICAKICAgICAgICBmb3IobGV0IGVudHJ5IG9mIG5ld3VybHMpewogICAgICAgICAgZm9yKGxldCB1cmwgb2YgZW50cnkudXJscyl7CiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7CiAgICAgICAgICAgICAgcmVhY3RlZDogcmVhY3RlZCB8fCBsaWtlcy5pbmNsdWRlcyhlbnRyeS5ldmVudC5pZCksIAogICAgICAgICAgICAgIHVybDogdXJsLCAKICAgICAgICAgICAgICBldmVudDogZW50cnkuZXZlbnQsIAogICAgICAgICAgICAgIGJlY2gzMmlkOiBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyhlbnRyeS5ldmVudC5pZCkpLAogICAgICAgICAgICAgIG1ldGE6IG1ldGFldmVudHMuZmluZChvID0+IG8ucHVia2V5ID09IGVudHJ5LmV2ZW50LnB1YmtleSkKICAgICAgICAgICAgfSkKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbG9nKCJzYXZlIHJlcyIsIHJlc3VsdHMubGVuZ3RoLCBzb2NrZXQudXJsKQogICAgICAgIHVwZGF0ZWNvbnRlbnQocmVzdWx0cywgcSwgYXBwZW5kKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVjb250ZW50KHJlc3VsdHMsIHEsIGFwcGVuZCl7CiAgICAgICAgcmVzdWx0cy5yZXZlcnNlKCkuZm9yRWFjaChpdGVtID0+IHsKICAgICAgICAgIGNvbnN0IHR5cGUgPSBpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KSAmJiAidmlkZW8iIHx8ICJwaWMiCiAgICAgICAgICBjb25zdCB0ZXh0ID0gKHEgfHwgInZpZXcgbm90ZSIpLnN1YnN0cmluZygtMzApCiAgICAgICAgICBjb25zdCBpZCA9ICJpdGVtXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgICBjb25zdCBjb250ZW50ZWxlbWVudHMgPSAnPGRpdiBjbGFzcz0idHlwZSI+JyArIHR5cGUgKyAnPC9kaXY+PGEgY2xhc3M9Imxpa2UnICsgKGl0ZW0ucmVhY3RlZCA/ICcgcmVhY3RlZCcgOiAnJykgKyAnIiBkYXRhLWl0ZW0taWQ9IicgKyBpZCArIAogICAgICAgICAgICAnIiBocmVmPSIjIj4nICsgcXMoIiN0ZW1wbGF0ZSAuaGVhcnRzdmciKS5vdXRlckhUTUwgKyAnPC9hPjxhIGNsYXNzPSJxdWVyeSIgaHJlZj0iJyArIHByb3RvY29sICsgCiAgICAgICAgICAgIGl0ZW0uYmVjaDMyaWQgKyAnIj4nICsgdGV4dCArICc8L2E+JwogICAgICAgICAgbGV0IHJvb3QgPSBudWxsCiAgICAgICAgICBsZXQgdiA9IG51bGwKICAgICAgICAgIAogICAgICAgICAgaWYoaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleCkpewogICAgICAgICAgICByb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikKICAgICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJ2aWRlby1jb250YWluZXIiKQogICAgICAgICAgICByb290LmlubmVySFRNTCA9IGNvbnRlbnRlbGVtZW50cwogICAgICAgICAgICAKICAgICAgICAgICAgdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIikKICAgICAgICAgICAgdlsiZGF0YS1pdGVtLWlkIl0gPSBpZAogICAgICAgICAgICB2LnByZWxvYWQgPSAibm9uZSIKICAgICAgICAgICAgdi5sb29wID0gdHJ1ZQogICAgICAgICAgICB2LnBsYXlzaW5saW5lID0gIiIKICAgICAgICAgICAgCiAgICAgICAgICAgIHYub25jYW5wbGF5ID0gYXN5bmMgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgY29uc3QgYXNwZWN0ID0gdGhpcy52aWRlb1dpZHRoIC8gdGhpcy52aWRlb0hlaWdodAogICAgICAgICAgICAgIGlmKGFzcGVjdCA+IDEpewogICAgICAgICAgICAgICAgdGhpcy5zdHlsZS53aWR0aCA9IChhc3BlY3QgKiAxMDApICsgIiUiCiAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLmhlaWdodCA9ICgxIC8gYXNwZWN0ICogMTAwKSArICIlIgogICAgICAgICAgICAgICAgdGhpcy5zdHlsZS5tYXJnaW5Ub3AgPSAtKCgxIC8gYXNwZWN0ICogMTAwIC0gMTAwKSAvIDIpICsgIiUiCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIAogICAgICAgICAgICAgIHVwZGF0ZXZpZGVvcGxheSh0aGlzKQogICAgICAgICAgICAgIHRoaXMucGFyZW50RWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgICAgICB9CgogICAgICAgICAgICBjb25zdCBleHQgPSBpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KVsxXQogICAgICAgICAgICB2LmlubmVySFRNTCA9ICc8c291cmNlIHNyYz0iJyArIGl0ZW0udXJsICsgJyIgdHlwZT0idmlkZW8vJyArIGV4dCArICciPjwvc291cmNlPicKICAgICAgICAgICAgCiAgICAgICAgICAgIHJvb3QuYXBwZW5kKHYpCiAgICAgICAgICB9ZWxzZSBpZihpdGVtLnVybC5tYXRjaChpbWdleHRyZWdleCkpewogICAgICAgICAgICByb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpCiAgICAgICAgICAgIHJvb3QuaHJlZiA9ICIjIgogICAgICAgICAgICByb290LmlubmVySFRNTCA9IGNvbnRlbnRlbGVtZW50cwogICAgICAgICAgICAgIAogICAgICAgICAgICBpZih0eXBlID09ICJwaWMiKXsKICAgICAgICAgICAgICByb290LmlubmVySFRNTCArPSAnPGltZyBvbmxvYWQ9ImdpZChcJycgKyBpZCArICdcJykuc3R5bGUuZGlzcGxheT1cJ2Jsb2NrXCciIHNyYz0iJyArIGl0ZW0udXJsICsgJyIvPicKICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgcm9vdC5pbm5lckhUTUwgKz0gJzxzcGFuIGNsYXNzPSJmaWxlIj4nICsgaXRlbS51cmwgKyAnPC9zcGFuPicKICAgICAgICAgICAgfQogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIHJldHVybgogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICByb290LmlkID0gaWQKICAgICAgICAgIHJvb3RbImRhdGEtaXRlbSJdID0gaXRlbQogICAgICAgICAgcm9vdFsiZGF0YS1ldmVudCJdID0gaXRlbS5ldmVudAogICAgICAgICAgcm9vdFsiZGF0YS1xdWVyeSJdID0gcQogICAgICAgICAgcm9vdFsiZGF0YS10ZXh0Il0gPSB0ZXh0CiAgICAgICAgICAKICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCh0eXBlKQogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJpdGVtIikKICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgic2hvdyIpCiAgICAgICAgICAKICAgICAgICAgIGlmKGl0ZW0ucmVhY3RlZCl7CiAgICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHFzKCIjcGljcyIpW2FwcGVuZCAmJiAiYXBwZW5kIiB8fCAicHJlcGVuZCJdKHJvb3QpCiAgICAgICAgICAKICAgICAgICAgIGlmKHYpewogICAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkodikKICAgICAgICAgIH0KICAgICAgICB9KQoKICAgICAgICBpZihhY3RpdmUoKSA9PSBudWxsKXsKICAgICAgICAgIHFzKCIjcGljcyAuaXRlbSIpPy5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGlkZW1lZGlhKCl7CiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICJzY3JvbGwiCiAgICAgICAgcXNhKCIjbWVkaWEtY29udGFpbmVyLCAjcGljLCAjbWVkaWEtZm9vdGVyIikuZm9yRWFjaChuID0+IG4uc3R5bGUuZGlzcGxheSA9ICJub25lIikKICAgICAgICBnaWQoInBpYy1saWtlIikuY2xhc3NMaXN0LnJlbW92ZSgicmVhY3RlZCIpCiAgICAgICAgaGlkZXZpZGVvKCkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGlkZXZpZGVvKCl7CiAgICAgICAgY29uc3QgdiA9IHFzKCIjbWVkaWEtY29udGFpbmVyIHZpZGVvIikKICAgICAgICAKICAgICAgICBpZih2KXsKICAgICAgICAgIHYubXV0ZWQgPSB0cnVlCiAgICAgICAgICBnaWQodlsiZGF0YS1pdGVtLWlkIl0pLmFwcGVuZENoaWxkKHYpCiAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkodikKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHdhaXRyZXMoa2V5KXsKICAgICAgICBsZXQgZXZlbnRzID0gW10KICAgICAgICAKICAgICAgICBsZXQgcmVzaGFuZGxlciA9IGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7CiAgICAgICAgICB0aGlzLmhhbmRsZSA9IGZ1bmN0aW9uKHJlcyl7CiAgICAgICAgICAgIHRoaXMua2V5ID0ga2V5CiAgICAgICAgICAgIGxldCBvID0gSlNPTi5wYXJzZShyZXMuZGF0YSkKICAgICAgICAgICAgaWYob1sxXSA9PSBrZXkpewogICAgICAgICAgICAgIGlmKG9bMF0gPT0gIkVPU0UiKXsKICAgICAgICAgICAgICAgIHJlc29sdmUoZXZlbnRzKQogICAgICAgICAgICAgICAgcmVzaGFuZGxlcnMuc3BsaWNlKHJlc2hhbmRsZXJzLmluZGV4T2YodGhpcyksIDEpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGV2ZW50cy5wdXNoKG9bMl0pCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgICAKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAgICAgcmVzaGFuZGxlcnMucHVzaChuZXcgcmVzaGFuZGxlcihyZXNvbHZlLCByZWplY3QpKQogICAgICAgIH0pCiAgICAgIH0KICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBjaGVja3VwZGF0ZShzb2NrZXQpewogICAgICAgIGNvbnN0IHVwZGF0ZXNyZXMgPSBhd2FpdCBxdWVyeXB1YmtleShzb2NrZXQsIHVwZGF0ZXNwdWJrZXkpCiAgICAgICAgY29uc3QgdXBkYXRlbm90ZSA9IHVwZGF0ZXNyZXMuZmluZChuID0+IG4uY29udGVudC5tYXRjaCgvXmh0dHBzXDpcL1wvLykpCiAgICAgICAgCiAgICAgICAgaWYoIXVwZGF0ZW5vdGUpewogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGFnZSA9IE1hdGgucm91bmQoKERhdGUubm93KCkgLyAxMDAwIC0gdXBkYXRlbm90ZS5jcmVhdGVkX2F0KSAvIDM2MDAgLyAyNCkKICAgICAgICBjb25zdCBub3RlaWQgPSBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyh1cGRhdGVub3RlLmlkKSkKICAgICAgICBxcygiI3JlbGVhc2UiKS5ocmVmID0gcHJvdG9jb2wgKyBub3RlaWQKICAgICAgICBxcygiI3JlbGVhc2UiKS5pbm5lclRleHQgPSAoYWdlID09IDAgJiYgInRvZGF5IiB8fCBhZ2UgKyAiIGRheShzKSBhZ28iKQogICAgICB9CgogICAgICBmdW5jdGlvbiBzbGVlcChtcyl7CiAgICAgICAgcmV0dXJuIG5ldyBmdW5jdGlvbigpewogICAgICAgICAgbGV0IHRpbWVvdXQgPSBudWxsCiAgICAgICAgICBsZXQgciA9IG51bGwKICAgICAgICAgIAogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcHJvbWlzZTogbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXsKICAgICAgICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIG1zKQogICAgICAgICAgICAgIHIgPSByZXNvbHZlCiAgICAgICAgICAgIH0pLAogICAgICAgICAgICByZXNvbHZlOiBmdW5jdGlvbigpewogICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KQogICAgICAgICAgICAgIHIoKQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzaG93KGlkKXsKICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiIKICAgICAgICBjb25zdCBpdGVtID0gZ2lkKGlkKVsiZGF0YS1pdGVtIl0KICAgICAgICBjb25zdCBtZWRpYSA9IGdpZCgibWVkaWEtY29udGFpbmVyIikKICAgICAgICBjb25zdCBwaWMgPSBnaWQoInBpYyIpCgogICAgICAgIGlmKGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpKXsKICAgICAgICAgIHBpYy5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiCiAgICAgICAgICBjb25zdCB2ID0gZ2lkKGlkKS5xdWVyeVNlbGVjdG9yKCJ2aWRlbyIpCiAgICAgICAgICBxcygiI21lZGlhLWNvbnRhaW5lciIpLmFwcGVuZENoaWxkKHYpCiAgICAgICAgICB2Lm11dGVkID0gZmFsc2UKICAgICAgICAgIHYucGxheSgpCiAgICAgICAgfWVsc2V7CiAgICAgICAgICBwaWMuc3JjID0gaXRlbS51cmwKICAgICAgICAgIHBpYy5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihpdGVtLm1ldGEpewogICAgICAgICAgY29uc3QgbWV0YWNvbnRlbnQgPSBKU09OLnBhcnNlKGl0ZW0ubWV0YS5jb250ZW50KQogICAgICAgICAgY29uc3QgbmFtZSA9IG1ldGFjb250ZW50LmRpc3BsYXlfbmFtZSB8fCBtZXRhY29udGVudC5uYW1lCiAgICAgICAgICBxcygiI3BpYy11c2VyIikuaHJlZiA9IHByb3RvY29sICsgYmVjaDMyLmVuY29kZSgibnB1YiIsIGZyb21IZXhTdHJpbmcoaXRlbS5tZXRhLnB1YmtleSkpCiAgICAgICAgICBxcygiI3BpYy11c2VyIikuaW5uZXJUZXh0ID0gbmFtZQogICAgICAgIH0KCiAgICAgICAgZ2lkKCJwaWMtbGlrZSIpWyJkYXRhLWl0ZW0taWQiXSA9IGlkCiAgICAgICAgZ2lkKCJtZWRpYS1mb290ZXIiKVsiZGF0YS1ldmVudCJdID0gaXRlbS5ldmVudAoKICAgICAgICBpZihpdGVtLnJlYWN0ZWQgfHwgcmVhY3RlZC5pbmNsdWRlcyhpZCkpewogICAgICAgICAgZ2lkKCJwaWMtbGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBhID0gcXMoIiNwaWMtcXVlcnkiKQogICAgICAgIGEuaHJlZiA9IHByb3RvY29sICsgaXRlbS5iZWNoMzJpZAogICAgICAgIGEuaW5uZXJUZXh0ID0gZ2lkKGlkKVsiZGF0YS10ZXh0Il0KICAgICAgICAgIAogICAgICAgIG1lZGlhLnN0eWxlLmRpc3BsYXkgPSBnaWQoIm1lZGlhLWZvb3RlciIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGNvbm5jb3VudCgpewogICAgICAgIHJldHVybiBzb2NrZXRzLmZpbHRlcihyID0+IHIucmVhZHlTdGF0ZSA9PSAxKS5sZW5ndGgKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gZGlzY29ubmVjdCgpewogICAgICAgIGZvcihsZXQgc29ja2V0IG9mIHNvY2tldHMpewogICAgICAgICAgc29ja2V0LmNsb3NlKCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc29ja2V0cy5zcGxpY2UoMCkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gbG9nKG1zZyl7CiAgICAgICAgbGV0IHNjcm9sbCA9IHFzKCIjbG9ncyIpLnNjcm9sbFRvcCA9PSBxcygiI2xvZ3MiKS5zY3JvbGxUb3BNYXgKICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKQogICAgICAgIGRpdi5pbm5lclRleHQgPSBBcnJheS5mcm9tKGFyZ3VtZW50cykuam9pbigiICIpCiAgICAgICAgcXMoIiNsb2dzIikuYXBwZW5kKGRpdikKICAgICAgICAKICAgICAgICBzY3JvbGwgJiYgcXMoIiNsb2dzIikuc2Nyb2xsVG8oMCwgcXMoIiNsb2dzIikuc2Nyb2xsVG9wTWF4KQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBjb25uZWN0KHVybCl7CiAgICAgICAgbG9nKCJjb25uZWN0aW5nIiwgdXJsKQogICAgICAgIGxldCBzb2NrZXQgPSBuZXcgV2ViU29ja2V0KHVybCkKICAgICAgICAKICAgICAgICBzb2NrZXQub25tZXNzYWdlID0gbWVzc2FnZSA9PiByZXNoYW5kbGVycy5mb3JFYWNoKHJoID0+IHJoLmhhbmRsZShtZXNzYWdlKSkKICAgICAgICAKICAgICAgICBzb2NrZXQub25jbG9zZSA9IGFzeW5jIGZ1bmN0aW9uKCl7CiAgICAgICAgICBzb2NrZXRzLnNwbGljZShzb2NrZXRzLmluZGV4T2Yoc29ja2V0KSwgMSkKICAgICAgICAgIHFzKCIjY29ubmNvdW50IikuaW5uZXJUZXh0ID0gY29ubmNvdW50KCkgKyAocHJpbWFsc29ja2V0ICYmIDEpCiAgICAgICAgICBsb2coImRpc2Nvbm5lY3RlZCIsIHRoaXMudXJsLCBjb25uY291bnQoKSkKICAgICAgICAgIGF3YWl0IHNsZWVwKDEwMDApLnByb21pc2UKICAgICAgICAgIGNvbm5lY3QodGhpcy51cmwpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHNvY2tldC5vbm9wZW4gPSBmdW5jdGlvbigpewogICAgICAgICAgcXMoIiNjb25uY291bnQiKS5pbm5lclRleHQgPSBjb25uY291bnQoKSArIChwcmltYWxzb2NrZXQgJiYgMSkKICAgICAgICAgIGxvZygiY29ubmVjdGVkIiwgdGhpcy51cmwsIGNvbm5jb3VudCgpKQogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4gc29ja2V0CiAgICAgIH0KICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLCBhc3luYyAoKSA9PiB7CiAgICAgICAgcHJpbWFsc29ja2V0ID0gY29ubmVjdCgid3NzOi8vY2FjaGUzLnByaW1hbC5uZXQvY2FjaGUxNyIpCiAgICAgICAgcHJpbWFsc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoIm9wZW4iLCBmdW5jdGlvbigpewogICAgICAgICAgcHJpbWFsZ2xvYmFsKHRoaXMpCiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBwcmltYWxzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xvc2UiLCBmdW5jdGlvbigpewogICAgICAgICAgcHJpbWFsc29ja2V0ID0gbnVsbAogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgZm9yKGxldCB1cmwgb2YgcmVsYXlzKCkpewogICAgICAgICAgY29uc3Qgc29ja2V0ID0gY29ubmVjdCh1cmwpCiAgICAgICAgICBzb2NrZXRzLnB1c2goc29ja2V0KQogICAgICAgICAgCiAgICAgICAgICBzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcigib3BlbiIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIGNoZWNrdXBkYXRlKHRoaXMpCiAgICAgICAgICAgIHF1ZXJ5KHRoaXMpCiAgICAgICAgICB9KQogICAgICAgIH0KICAgICAgICAKICAgICAgICBhd2FpdCBzbGVlcCgxMDApLnByb21pc2UKICAgICAgICAKICAgICAgICBpZihoYXNrZXkoKSl7CiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoIm5vc3RyIikKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBmb3IobGV0IGMgb2YgY29sb3B0cyl7CiAgICAgICAgZG9jdW1lbnQud3JpdGUoJzxzdHlsZT4nICsgY29sc2Nzcy5pbm5lclRleHQucmVwbGFjZSgvXCRce2NvbHNcfS9nLCBjKSArICc8L3N0eWxlPicpCiAgICAgIH0KICAgIDwvc2NyaXB0PgogIDwvYm9keT4KPC9odG1sPgo=
this is a backup of #nostrbot dev files created with bk.sh
echo "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" | base64 --decode > bk.7z && 7z x -ofiles bk.7z
shasum -a 256 bk.7z
cc2ca659ab71ebf2443b4dce7704beed277c6cd86f2e5d541cce4f3cddd11725
20.0 kB
https://ipfs.io/ipfs/QmZ8zi7Xc1NtrbxTaVx5zEdzb5arwQRBDPWTzVaNf9pbYa
files.html, scroll fix, again
sha256
ac5a1182b4efe7f780567e6e4520f349777546c17bc1d39916db7532f2d915bf files.html
base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyIvPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL3N2Z2ljb25zLnNwYXJray5mci9zdmdpY29ucy5jc3MiLz4KICAgIDxzdHlsZT4KICAgICAgKiB7CiAgICAgICAgb3ZlcnNjcm9sbC1iZWhhdmlvci15OiBjb250YWluOwogICAgICB9CiAgICAgIAogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksIAogICAgICAjaGVhZGVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncywgCiAgICAgICNwcml2a2V5IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncyB7CiAgICAgICAgaGVpZ2h0OiA2ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNsb2dzIHsKICAgICAgICBoZWlnaHQ6IDhlbTsKICAgICAgICBvdmVyZmxvdzogc2Nyb2xsOwogICAgICAgIGZvbnQtc2l6ZTogLjhlbTsKICAgICAgfQogICAgICAKICAgICAgc2VsZWN0IHsKICAgICAgICB3aWR0aDogNGVtOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLCAKICAgICAgaW5wdXQuc3VibWl0IHsKICAgICAgICBib3JkZXItcmFkaXVzOiAuNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0LCAKICAgICAgI2hlYWRlciBhLAogICAgICAjbWVkaWEtY29udGFpbmVyIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLCAKICAgICAgZm9ybSwgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHotaW5kZXg6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgIAogICAgICBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDMwZW0pIHsKICAgICAgICAjcXVlcnlkaXNwbGF5LAogICAgICAgICNjb250cm9saW5mbyB7CiAgICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZm9ybSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnkgewogICAgICAgIHdpZHRoOiA2ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNsb2FkaW5nIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDBweDsKICAgICAgICBsZWZ0OiAyN2VtOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICBhIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgIH0KCiAgICAgIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAKICAgICAgI21lZGlhLWNvbnRhaW5lciB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICBoZWlnaHQ6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICBtYXJnaW4tdG9wOiAwICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgCiAgICAgIC50eXBlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgei1pbmRleDogMTsKICAgICAgfQogICAgICAKICAgICAgI3BpYy1xdWVyeSB7CiAgICAgICAgd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSwgCiAgICAgICNjb250cm9saW5mbywKICAgICAgYSwKICAgICAgaW5wdXQuc3VibWl0IHsKICAgICAgICBjb2xvcjogIzk5OTsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSB7CiAgICAgICAgcGFkZGluZzogMCAxZW07CiAgICAgIH0KCiAgICAgICNxdWVyeWRpc3BsYXkgLnRleHQgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBtaW4td2lkdGg6IDNlbTsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAjaGVhZGVyIGEsCiAgICAgICNoZWFkZXIgc3BhbiB7CiAgICAgICAgcGFkZGluZzogMC41ZW07CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgewogICAgICAgIHBhZGRpbmc6IDAuNDVlbSAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgLml0ZW1zIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQogICAgICAKICAgICAgI2hlYWRlciAuaXRlbXMsIAogICAgICAjY29udHJvbGluZm8gewogICAgICAgIG1hcmdpbi10b3A6IC4zZW07CiAgICAgIH0KCiAgICAgIHAgewogICAgICAgIG1hcmdpbi10b3A6IDA7CiAgICAgIH0KICAgICAgCiAgICAgIC5sYWJlbCB7CiAgICAgICAgcGFkZGluZzogLjhlbSAuOGVtIC44ZW0gMDsKICAgICAgfQoKICAgICAgc3BhbiNjb250cm9saW5mbywgCiAgICAgICNwaWNzIGEgPiBhLAogICAgICAjcGljcyAucXVlcnkgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgfQogICAgICAKICAgICAgc3BhbiNjb250cm9saW5mbyB7CiAgICAgICAgcmlnaHQ6IDJlbTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgfQoKICAgICAgI21lZGlhLWNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDApOwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgei1pbmRleDogNDsKICAgICAgfQogICAgICAKICAgICAgI3BpYy1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAKICAgICAgI3BpYyB7CiAgICAgICAgbWF4LXdpZHRoOiAxMDB2dzsKICAgICAgICBtYXgtaGVpZ2h0OiAxMDB2aDsKICAgICAgfQogICAgICAgIAogICAgICAjcGljcyB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgICAKICAgICAgI3BpY3MgPiBhLCAKICAgICAgI3BpY3MgaW1nLAogICAgICAjcGljcyAuZmlsZSwKICAgICAgI3BpY3MgLnZpZGVvLWNvbnRhaW5lciB7CiAgICAgICAgd2lkdGg6IDI1dnc7CiAgICAgIH0KCiAgICAgICNwaWNzID4gYSwKICAgICAgI3BpY3MgLmZpbGUsCiAgICAgICNwaWNzIC52aWRlby1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMjV2dzsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIGJvcmRlcjogMC4zZW0gc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMC4zZW07CiAgICAgICAgbWFyZ2luOiAtMC4zZW07CiAgICAgIH0KCiAgICAgICNwaWNzID4gLmZpbGUgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIAogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CiAgICAgIAogICAgICBib2R5Om5vdCgubm9zdHIpICNmaWx0ZXItbGlrZXMsIAogICAgICAuZmlsdGVyLWxpa2VzICNwaWNzID4gLml0ZW06bm90KC5yZWFjdGVkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgei1pbmRleDogMjsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3Z3OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHBhZGRpbmc6IDAgMXZ3OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNwaWMtcXVlcnkgewogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBmb250LXNpemU6IG1pbigzLjV2dywgMS41ZW0pOwogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsMC42KTsKICAgICAgICBtYXgtd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgI3BpYy1xdWVyeSB7CiAgICAgICAgcGFkZGluZzogLjZlbSAuNGVtIC4xZW0gLjRlbTsKICAgICAgICBtYXgtd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgLmxpa2UucmVhY3RlZCwKICAgICAgLmZpbHRlci1saWtlcyAjZmlsdGVyLWxpa2VzIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7CiAgICAgIH0KCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgZm9udC1zaXplOiAzZW07CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciwKICAgICAgI21lZGlhLWZvb3RlciAubGlrZSB7CiAgICAgICAgei1pbmRleDogNTsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgYm90dG9tOiAxLjllbTsKICAgICAgICBmb250LXNpemU6IDEuOGVtOwogICAgICAgIHBhZGRpbmctcmlnaHQ6IC42NWVtOwogICAgICAgIG1heC13aWR0aDogOGVtOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9CiAgICAgIAogICAgICAubGlrZSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiBhdXRvOwogICAgICAgIHBhZGRpbmc6IC4yZW07CiAgICAgICAgd2lkdGg6IDFlbTsKICAgICAgICBoZWlnaHQ6IDFlbTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CgogICAgICAubm9zdHIgLmxpa2UgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOyAgCiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgLmxpa2UgewogICAgICAgIGZvbnQtc2l6ZTogMi40ZW07CiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgewogICAgICAgIGRpc3BsYXk6IG5vbmU7ICAKICAgICAgfQogIAogICAgICAjcGljcyBpbWcgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgLmFjdGl2ZSB7CiAgICAgICAgYmFja2dyb3VuZDogIzQ0NDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI3BpY3MgPiAuYWN0aXZlIHsKICAgICAgICBib3JkZXItY29sb3I6IGdyZWVuOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KCiAgICAgIC5oZWFydHN2ZyBwYXRoIHsKICAgICAgICBzdHJva2U6ICNmZmY7CiAgICAgIH0KICAKICAgICAgYSNtZW51LCBhI2ZpbHRlci1saWtlcyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luLXRvcDogLS4zZW07CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgfQoKICAgICAgYSNtZW51IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBwYWRkaW5nOiAwIC4zZW0gMCAuNWVtOwogICAgICAgIGhlaWdodDogMi4xZW07CiAgICAgIH0KICAgICAgCiAgICAgIGEjZmlsdGVyLWxpa2VzIHsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB3aWR0aDogMS41ZW07CiAgICAgICAgaGVpZ2h0OiAxLjVlbTsKICAgICAgICBtYXJnaW46IC4xZW0gLjVlbTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgIH0KICAgICAgCiAgICAgIGEjZmlsdGVyLWxpa2VzIHN2ZyB7CiAgICAgICAgd2lkdGg6IDEuNWVtOwogICAgICAgIGhlaWdodDogMS41ZW07CiAgICAgIH0KICAgICAgIAogICAgICAubWVudXN2ZyB7CiAgICAgICAgd2lkdGg6IDJlbTsKICAgICAgICBoZWlnaHQ6IDJlbTsKICAgICAgfQoKICAgICAgLm1lbnVzdmcgcGF0aCB7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBtYXJnaW4tbGVmdDogLTE4ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzIyMjsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgei1pbmRleDogMzsgCiAgICAgICAgb3ZlcmZsb3c6IHNjcm9sbDsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudC5vcGVuIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgewogICAgICAgIHBhZGRpbmc6IDAgMWVtIDFlbSAxZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIGEsCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgcGFkZGluZzogLjVlbSAuN2VtOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHotaW5kZXg6IDM7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIG9wYWNpdHk6IC41OwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5Lm9wZW4gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIAogICAgICBzdmcsIAogICAgICBpbWcsIAogICAgICAudmlkZW8gdmlkZW8gewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAjdGVtcGxhdGUgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGRpdiBpZD0idGVtcGxhdGUiPgogICAgICA8c3ZnIGNsYXNzPSJoZWFydHN2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KICAgICAgICA8cGF0aCBkPSJNOS43MTksMTcuMDczbC02LjU2Mi02LjUxYy0wLjI3LTAuMjY4LTAuNTA0LTAuNTY3LTAuNjk2LTAuODg4QzEuMzg1LDcuODksMS42Nyw1LjYxMywzLjE1NSw0LjE0YzAuODY0LTAuODU2LDIuMDEyLTEuMzI5LDMuMjMzLTEuMzI5YzEuOTI0LDAsMy4xMTUsMS4xMiwzLjYxMiwxLjc1MmMwLjQ5OS0wLjYzNCwxLjY4OS0xLjc1MiwzLjYxMi0xLjc1MmMxLjIyMSwwLDIuMzY5LDAuNDcyLDMuMjMzLDEuMzI5YzEuNDg0LDEuNDczLDEuNzcxLDMuNzUsMC42OTMsNS41MzdjLTAuMTksMC4zMi0wLjQyNSwwLjYxOC0wLjY5NSwwLjg4N2wtNi41NjIsNi41MUMxMC4xMjUsMTcuMjI5LDkuODc1LDE3LjIyOSw5LjcxOSwxNy4wNzMgTTYuMzg4LDMuNjFDNS4zNzksMy42MSw0LjQzMSw0LDMuNzE3LDQuNzA3QzIuNDk1LDUuOTIsMi4yNTksNy43OTQsMy4xNDUsOS4yNjVjMC4xNTgsMC4yNjUsMC4zNTEsMC41MSwwLjU3NCwwLjczMUwxMCwxNi4yMjhsNi4yODEtNi4yMzJjMC4yMjQtMC4yMjEsMC40MTYtMC40NjYsMC41NzMtMC43MjljMC44ODctMS40NzIsMC42NTEtMy4zNDYtMC41NzEtNC41NkMxNS41Nyw0LDE0LjYyMSwzLjYxLDEzLjYxMiwzLjYxYy0xLjQzLDAtMi42MzksMC43ODYtMy4yNjgsMS44NjNjLTAuMTU0LDAuMjY0LTAuNTM2LDAuMjY0LTAuNjksMEM5LjAyOSw0LjM5Nyw3LjgyLDMuNjEsNi4zODgsMy42MSI+PC9wYXRoPgogICAgICA8L3N2Zz4KICAgICAgPGRpdiBpZD0iY29sc2NzcyI+CiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyA+IGEsIAogICAgICAuY29scyR7Y29sc30gI3BpY3MgaW1nLAogICAgICAuY29scyR7Y29sc30gI3BpY3MgLmZpbGUsCiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyAudmlkZW8tY29udGFpbmVyIHsKICAgICAgICB3aWR0aDogY2FsYygxMDB2dyAvICR7Y29sc30pOwogICAgICB9CgogICAgICAuY29scyR7Y29sc30gI3BpY3MgPiBhLAogICAgICAuY29scyR7Y29sc30gI3BpY3MgPiAuZmlsZSwKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzID4gLnZpZGVvLWNvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiBjYWxjKDEwMHZ3IC8gJHtjb2xzfSk7CiAgICAgIH0KICAgICAgCiAgICAgIC5jb2xzJHtjb2xzfSAucXVlcnksCiAgICAgIC5jb2xzJHtjb2xzfSAubGlrZSB7CiAgICAgICAgZm9udC1zaXplOiBtaW4oMTR2dyAqICgxIC8gJHtjb2xzfSksIDZlbSAqICgxIC8gJHtjb2xzfSkpCiAgICAgIH0KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9Im1lZGlhLWZvb3RlciI+CiAgICAgIDxhIGlkPSJwaWMtbGlrZSIgY2xhc3M9Imxpa2UiIGhyZWY9IiMiPjwvYT4KICAgICAgPGEgaWQ9InBpYy1xdWVyeSIgaHJlZj0iIyI+PC9hPgogICAgICA8YSBpZD0icGljLXVzZXIiIGhyZWY9IiMiPjwvYT4KICAgIDwvZGl2PgogICAgPGNlbnRlciBpZD0ibWVkaWEtY29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0icGljLWNvbnRhaW5lciI+CiAgICAgICAgPGltZyBpZD0icGljIi8+CiAgICAgIDwvZGl2PgogICAgPC9jZW50ZXI+CiAgICA8ZGl2IGlkPSJtZW51LW92ZXJsYXkiPjwvZGl2PgogICAgPGRpdiBpZD0ibWVudS1jb250ZW50IiBjbGFzcz0idGVzdCI+CiAgICAgIDxkaXYgY2xhc3M9Iml0ZW1zIj4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+YXV0b3BsYXk6PC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJvbiIgaHJlZj0iIyI+b248L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJvZmYiIGhyZWY9IiMiPm9mZjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0YXV0b3BsYXkiIGRhdGEtYXV0b3BsYXk9ImhvdmVyIiBocmVmPSIjIj5tb3VzZW92ZXI8L2E+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmNvbHM6PC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMSIgaHJlZj0iIyI+MTwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSIyIiBocmVmPSIjIj4yPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjQiIGhyZWY9IiMiPjQ8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iNiIgaHJlZj0iIyI+NjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSIxMCIgaHJlZj0iIyI+MTA8L2E+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmNvbm5lY3Rpb25zOjwvZGl2PgogICAgICAgIDxkaXYgaWQ9ImNvbm5jb3VudCI+MDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5yZWxheXM6PC9kaXY+CiAgICAgICAgPHA+UGxlYXNlIHVzZSByZWxheXMgd2l0aCBOSVAtNTAgKHNlYXJjaCkgZnVuY3Rpb25hbGl0eTwvcD4KICAgICAgICA8Zm9ybSBhY3Rpb249IiMiIGlkPSJyZWxheXMtZm9ybSI+CiAgICAgICAgICA8dGV4dGFyZWEgaWQ9InJlbGF5cyI+PC90ZXh0YXJlYT4KICAgICAgICAgIDxpbnB1dCBjbGFzcz0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJzYXZlIHJlbGF5cyIvPgogICAgICAgIDwvZm9ybT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+cHJpdmF0ZSBrZXk6PC9kaXY+CiAgICAgICAgPHA+SWYgeW91IGNhbnQgdXNlIGJyb3dzZXIgYWRkb24gKG1vYmlsZSk8L3A+CiAgICAgICAgPGZvcm0gYWN0aW9uPSIjIiBpZD0icHJpdmtleS1mb3JtIj4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icHJpdmtleSIvPgogICAgICAgICAgPGlucHV0IGNsYXNzPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9InNhdmUga2V5Ii8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5sb2dzOjwvZGl2PgogICAgICAgIDxkaXYgaWQ9ImxvZ3MiPjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5jb250ZW50IGVycm9yczo8L2Rpdj4KICAgICAgICA8YSBjbGFzcz0ic2V0c2hvd2Vycm9ycyIgZGF0YS1zaG93ZXJyb3JzPSJvbiIgaHJlZj0iIyI+b248L2E+CiAgICAgICAgPGEgY2xhc3M9InNldHNob3dlcnJvcnMiIGRhdGEtc2hvd2Vycm9ycz0ib2ZmIiBocmVmPSIjIj5vZmY8L2E+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmxhdGVzdCByZWxlYXNlOjwvZGl2PgogICAgICAgIDxhIGlkPSJyZWxlYXNlIiBocmVmPSIjIj48L2E+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJoZWFkZXIiPgogICAgICA8c3BhbiBpZD0iY29udHJvbGluZm8iPmNvbnRyb2xzOiBhcnJvd3MsIGVudGVyLCBlc2M8L3NwYW4+CiAgICAgIDxhIGlkPSJmaWx0ZXItbGlrZXMiIGhyZWY9IiMiPjwvYT4KICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxhIGlkPSJtZW51IiBocmVmPSIjIj4KICAgICAgICAgIDxzdmcgY2xhc3M9Im1lbnVzdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJICAgICAgICA8cGF0aCBkPSJNMTAsMS40NDVjLTQuNzI2LDAtOC41NTUsMy44MjktOC41NTUsOC41NTVjMCw0LjcyNSwzLjgyOSw4LjU1NSw4LjU1NSw4LjU1NWM0LjcyNSwwLDguNTU1LTMuODMsOC41NTUtOC41NTVDMTguNTU1LDUuMjc0LDE0LjcyNSwxLjQ0NSwxMCwxLjQ0NSBNMTAsMTcuNjU0Yy00LjIyMSwwLTcuNjU0LTMuNDM0LTcuNjU0LTcuNjU0YzAtNC4yMjEsMy40MzMtNy42NTQsNy42NTQtNy42NTRjNC4yMjIsMCw3LjY1NCwzLjQzMyw3LjY1NCw3LjY1NEMxNy42NTQsMTQuMjIxLDE0LjIyMiwxNy42NTQsMTAsMTcuNjU0IE0xNC4zOSwxMGMwLDAuMjQ4LTAuMjAzLDAuNDUtMC40NSwwLjQ1SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMy0wLjQ1LTAuNDVzMC4yMDMtMC40NSwwLjQ1LTAuNDVoNy44NzlDMTQuMTg3LDkuNTUsMTQuMzksOS43NTIsMTQuMzksMTAgTTE0LjM5LDEyLjcwMmMwLDAuMjQ3LTAuMjAzLDAuNDQ5LTAuNDUsMC40NDlINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAyLTAuNDUtMC40NDljMC0wLjI0OCwwLjIwMy0wLjQ1MSwwLjQ1LTAuNDUxaDcuODc5QzE0LjE4NywxMi4yNTEsMTQuMzksMTIuNDU0LDE0LjM5LDEyLjcwMiBNMTQuMzksNy4yOThjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw2Ljg0OCwxNC4zOSw3LjA1MSwxNC4zOSw3LjI5OCI+PC9wYXRoPgoJICAgICAgICA8L3N2Zz4KICAgICAgICA8L2E+CiAgICAgICAgPGEgaWQ9InRpdGxlIiBocmVmPSIjIj5maWxlcy5odG1sPC9hPgogICAgICAgIDxmb3JtIGlkPSJxdWVyeS1mb3JtIiBhY3Rpb249IiMiPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJxdWVyeSIgbmFtZT0icXVlcnkiIGlkPSIiIC8+CiAgICAgICAgICA8c2VsZWN0IGlkPSJxdWVyeS10eXBlIj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iYWxsIj5hbGw8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaW1hZ2UiPmltYWdlczwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ2aWRlbyI+dmlkZW9zPC9vcHRpb24+CiAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgIDxpbnB1dCBpZD0iZ28iIHR5cGU9InN1Ym1pdCIgdmFsdWU9ImdvIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxzcGFuIGlkPSJxdWVyeWRpc3BsYXkiPgogICAgICAgICAgPHNwYW4gY2xhc3M9InRleHQiPjwvc3Bhbj4KICAgICAgICA8L3NwYW4+CiAgICAgICAgPGRpdiBpZD0ibG9hZGluZyI+dXBkYXRpbmc8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9InBpY3MiPjwvZGl2PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vdW5wa2cuY29tL25vc3RyLXRvb2xzL2xpYi9ub3N0ci5idW5kbGUuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vc2xvd2xpLmdpdGh1Yi5pby9iZWNoMzItYnVmZmVyL2Fzc2V0cy9qcy9iZWNoMzItYnVmZmVyLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0PgogICAgICBjb25zdCB1cGRhdGVzcHVia2V5ID0gImFlNWM2ZTBiNzQ2NjBkMjE5NGM4MjU0YjVjMmM4MjU2NzY1NzZiZTAyOTczNzlmYTIwNTIzMTE0YTZhODVlODciCiAgICAgIGNvbnN0IHF1ZXJpZXMgPSB7CiAgICAgICAgImdsb2JhbCI6ICdbIlJFUSIsIjxJPiIseyJjYWNoZSI6WyJleHBsb3JlIix7InRpbWVmcmFtZSI6ImxhdGVzdCIsInNjb3BlIjoiZ2xvYmFsIiwibGltaXQiOjxMPn1dfV0nLCAKICAgICAgICAiYXV0aG9yIjogJ1siUkVRIiwiPEk+Iix7ImtpbmRzIjpbMV0sImF1dGhvcnMiOlsiPFA+Il19XScsCiAgICAgICAgInJlYWN0aW9ucyI6ICdbIlJFUSIsIjxJPiIsIHsia2luZHMiOls3XSwiI2UiOiA8RT59XScKICAgICAgfQogICAgICBxcygiI3JlbGF5cyIpLnZhbHVlID0gcmVsYXlzKCkuam9pbigiXG4iKQogICAgICBxcygiI3ByaXZrZXkiKS52YWx1ZSA9IHByaXZrZXkoKQogICAgICBjb25zdCBjb2xvcHRzID0gWzEsIDIsIDQsIDYsIDEwXQoKICAgICAgY29scyA9ICgpID0+IHBhcnNlSW50KHNldHRpbmcoImNvbHMiLCBjb2xvcHRzWzFdKSwgMTApCiAgICAgIGF1dG9wbGF5ID0gKCkgPT4gc2V0dGluZygiYXV0b3BsYXkiLCAib2ZmIikKICAgICAgbGltaXQgPSAoKSA9PiBwYXJzZUludChzZXR0aW5nKCJsaW1pdCIsIDE1KSwgMTApCiAgICAgIHNob3dlcnJvcnMgPSAoKSA9PiBzZXR0aW5nKCJzaG93ZXJyb3JzIiwgIm9mZiIpCiAgICAgIAogICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgY29scygpKQogICAgICAKICAgICAgbGV0IHByb3RvY29sID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlLykgPyAibm9zdHI6IiA6ICJ3ZWIrbm9zdHI6IgogICAgICBsZXQgc29ja2V0cyA9IFtdCiAgICAgIGxldCByZXNoYW5kbGVycyA9IFtdCiAgICAgIGxldCB1cmxzID0gW10KICAgICAgbGV0IGxpa2VzID0gW10KICAgICAgbGV0IG5ld2xpa2VzID0gW10KICAgICAgbGV0IHJlYWN0ZWQgPSBbXQogICAgICBsZXQgaWRjb3VudGVyID0gMAogICAgICBsZXQgcXVlcnl3YWl0ID0gbnVsbAogICAgICBsZXQgcHJpbWFsc29ja2V0ID0gbnVsbAogICAgICBsZXQgdHlwZXMgPSB7CiAgICAgICAgaW1hZ2U6IFsicG5nIiwgImpwZyIsICJqcGVnIiwgIndlYnAiXSwKICAgICAgICB2aWRlbzogWyJtcDQiLCAid2VibSJdCiAgICAgIH0KICAgICAgbGV0IGltZ3JlZ2V4ID0gL2h0dHAofHMpXDpcL1wvW14gXG5dKj9cLihwbmd8anBnfGpwZWd8d2VicCkvZ2kKICAgICAgbGV0IHZpZGVvcmVnZXggPSAvaHR0cCh8cylcOlwvXC9bXiBcbl0qP1wuKG1wNHx3ZWJtKS9naQogICAgICBsZXQgdmlkZW9leHRyZWdleCA9IC9cLihtcDR8d2VibSkkL2kKICAgICAgbGV0IGltZ2V4dHJlZ2V4ID0gL1wuKHBuZ3xqcGd8anBlZ3x3ZWJwKSQvaQogICAgICB3YWl0bXMgPSA1MDAwCiAgICAgIHF1ZXJ5c3RyID0gIiIKICAgICAgbGFzdHF1ZXJ5c3RyID0gIiIKICAgICAgbGFzdHF1ZXJ5dHlwZSA9ICIiCiAgICAgIGxldCBxdWVyeWNvdW50ID0gMAogICAgICBsZXQgaG92ZXJlZHZpZGVvID0gbnVsbAogICAgICAKICAgICAgdXBkYXRlcXVlcnkoKQogICAgICBxcygiI3BpYy1saWtlIikuaW5uZXJIVE1MID0gcXMoIiNmaWx0ZXItbGlrZXMiKS5pbm5lckhUTUwgPSBxcygiI3RlbXBsYXRlIC5oZWFydHN2ZyIpLm91dGVySFRNTAogICAgICBzZXRhY3RpdmUoInNldGNvbHMiLCAiY29scyIsIGNvbHMoKSkKICAgICAgc2V0YWN0aXZlKCJzZXRhdXRvcGxheSIsICJhdXRvcGxheSIsIGF1dG9wbGF5KCkpCiAgICAgIHNldGFjdGl2ZSgic2V0c2hvd2Vycm9ycyIsICJzaG93ZXJyb3JzIiwgc2hvd2Vycm9ycygpKQogICAgICAKICAgICAgZnVuY3Rpb24gZnJvbUhleFN0cmluZyhzdHIpewogICAgICAgIGxldCBidWZmZXIgPSBuZXcgVWludDhBcnJheShzdHIubGVuZ3RoIC8gMikKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlci5sZW5ndGg7IGkrKykgewogICAgICAgICAgYnVmZmVyW2ldID0gcGFyc2VJbnQoc3RyLnN1YnN0cigyICogaSwgMiksIDE2KQogICAgICAgIH0KICAgICAgICByZXR1cm4gYnVmZmVyCiAgICAgIH0KICAKICAgICAgZnVuY3Rpb24gcmVsYXlzKCl7CiAgICAgICAgY29uc3Qgb2JqID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgicmVsYXlzIikpCiAgICAgICAgY29uc3QgciA9IG9iaiAmJiBvYmouZmlsdGVyKHIgPT4gci5tYXRjaCgvd3NzOlwvXC8uKy8pKSB8fCBbXQogICAgICAgIAogICAgICAgIHJldHVybiByLmxlbmd0aCA+IDAgJiYgciB8fCBbCiAgICAgICAgICAid3NzOi8vcmVsYXkubm9zdHIuYmFuZCIsCiAgICAgICAgICAid3NzOi8vbmIucmVsYXkuY2VudGVyIiwgCiAgICAgICAgICAid3NzOi8vbm9zdHIuY29tcGlsZS1lcnJvci5uZXQiCiAgICAgICAgXQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBwcml2a2V5KCl7CiAgICAgICAgbGV0IGtleSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJwcml2a2V5IikgfHwgIiIKICAgICAgICAKICAgICAgICBpZihrZXkubGVuZ3RoID09IDYzKXsKICAgICAgICAgIGtleSA9IE5vc3RyVG9vbHMubmlwMTkuZGVjb2RlKGtleSkuZGF0YQogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4ga2V5Lmxlbmd0aCA9PSA2NCAmJiBrZXkgfHwgbnVsbAogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzZXR0aW5nKGtleSwgZGVmYXVsdHZhbHVlKXsKICAgICAgICBjb25zdCB2ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KQogICAgICAgIHJldHVybiB2ICYmIG9wdGlvbigic2V0IiArIGtleSwga2V5LCB2KSAmJiB2IHx8IGRlZmF1bHR2YWx1ZQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBvcHRpb24oYywga2V5LCB2YWwpewogICAgICAgIHJldHVybiBxcygiLiIgKyBjICsgIltkYXRhLSIgKyBrZXkgKyAiPSciICsgdmFsICsgIiddIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXMocSl7CiAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXNhKHEpewogICAgICAgIHJldHVybiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocSkpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGdpZChpKXsKICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXVlcnl0eXBlKCl7CiAgICAgICAgcmV0dXJuIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlIHx8ICJhbGwiCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZXF1ZXJ5KCl7CiAgICAgICAgbGV0IHBhcnRzID0gZGVjb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpKS5zcGxpdCgiLyIpCiAgICAgICAgcXVlcnlzdHIgPSBxcygiI3F1ZXJ5ZGlzcGxheSAudGV4dCIpLmlubmVyVGV4dCA9IHBhcnRzWzBdCiAgICAgICAgcXMoIiNxdWVyeSIpLnZhbHVlID0gcGFydHNbMF0KICAgICAgICBxcygiI3F1ZXJ5LXR5cGUiKS52YWx1ZSA9IHBhcnRzWzFdIHx8ICJhbGwiCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGFjdGl2ZSgpewogICAgICAgIHJldHVybiBxcygiI3BpY3MgLmFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHBpY29mZnNldChvZmZzZXQpewogICAgICAgIGNvbnN0IHBpY3MgPSBxc2EoIiNwaWNzID4gLml0ZW0iKS5maWx0ZXIoZSA9PiBlLnN0eWxlLmRpc3BsYXkgPT0gImJsb2NrIikKICAgICAgICByZXR1cm4gcGljc1twaWNzLmluZGV4T2YoYWN0aXZlKCkpK29mZnNldF0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gbGFzdGFjdGl2ZSgpewogICAgICAgIHJldHVybiBxc2EoIiNwaWNzIC5hY3RpdmUiKS5wb3AoKSAgICAgIAogICAgICB9CgogICAgICBmdW5jdGlvbiBtZW51KCl7CiAgICAgICAgcXNhKCIjbWVudS1jb250ZW50LCAjbWVudS1vdmVybGF5IikuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnRvZ2dsZSgib3BlbiIpKQogICAgICB9CiAgCiAgICAgIGZ1bmN0aW9uIHNldGFjdGl2ZShjLCBrZXksIHZhbCl7CiAgICAgICAgcXNhKCIuIiArIGMpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpKQogICAgICAgIGNvbnN0IG9wdGlvbiA9IHFzKCIuIiArIGMgKyAiW2RhdGEtIiArIGtleSArICI9JyIgKyB2YWwgKyAiJ10iKQogICAgICAgIG9wdGlvbj8uY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlYWxsdmlkZW9wbGF5KCl7CiAgICAgICAgcXNhKCIjcGljcyB2aWRlbyIpLmZvckVhY2goYXN5bmMgdiA9PiB1cGRhdGV2aWRlb3BsYXkodikpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZXZpZGVvcGxheSh2KXsKICAgICAgICBjb25zdCBhcGxheSA9IGF1dG9wbGF5KCkKICAgICAgICAKICAgICAgICBpZihhcGxheSAhPSAib24iKXsKICAgICAgICAgIHYubXV0ZWQgPSBmYWxzZQogICAgICAgICAgdi5wYXVzZSgpCiAgICAgICAgfWVsc2V7CiAgICAgICAgICB2Lm11dGVkID0gdHJ1ZQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBuID0gdi5wYXJlbnRFbGVtZW50CiAgICAgICAgCiAgICAgICAgaWYoKG4ub2Zmc2V0VG9wICsgbi5vZmZzZXRIZWlnaHQpIDwgc2Nyb2xsWSAKICAgICAgICB8fCBuLm9mZnNldFRvcCA+IChzY3JvbGxZICsgdmlzdWFsVmlld3BvcnQuaGVpZ2h0KSl7CiAgICAgICAgICBpZih2LnJlYWR5U3RhdGUgPT0gNCl7CiAgICAgICAgICAgIHYucGF1c2UoKQogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIHYucHJlbG9hZCA9ICJub25lIgogICAgICAgICAgfQogICAgICAgIH1lbHNlIGlmKHYucmVhZHlTdGF0ZSAhPSA0KXsKICAgICAgICAgIHYucHJlbG9hZCA9ICJhdXRvIgogICAgICAgIH0KICAgICAgICBlbHNlIGlmKGFwbGF5ID09ICJvbiIgfHwgKGFwbGF5ID09ICJob3ZlciIgJiYgdiA9PSBob3ZlcmVkdmlkZW8pKXsKICAgICAgICAgIHYucGxheSgpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLCBlID0+IHsKICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpCiAgICAgICAgdXBkYXRlYWxsdmlkZW9wbGF5KCkKICAgICAgfSkKICAgICAgCiAgICAgIGxldCB0b3VjaCA9IG51bGwKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCBlID0+IHsKICAgICAgICB0b3VjaCA9IGUuY2hhbmdlZFRvdWNoZXNbMF0KICAgICAgfSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIiwgZSA9PiB7CiAgICAgICAgY29uc3QgeGRpZmYgPSBlLmNoYW5nZWRUb3VjaGVzWzBdLnNjcmVlblggLSB0b3VjaC5zY3JlZW5YCiAgICAgICAgY29uc3QgeWRpZmYgPSBlLmNoYW5nZWRUb3VjaGVzWzBdLnNjcmVlblkgLSB0b3VjaC5zY3JlZW5ZCiAgICAgICAgCiAgICAgICAgaWYoeGRpZmYgPCAtNTApewogICAgICAgICAgbmV4dCgpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKHhkaWZmID4gNTApewogICAgICAgICAgcHJldigpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgcXMoIiNxdWVyeS1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgbG9jYXRpb24uaGFzaCA9ICIjIiArIGVuY29kZVVSSUNvbXBvbmVudChxcygiI3F1ZXJ5IikudmFsdWUgKyAiLyIgKyBxdWVyeXR5cGUoKSkKICAgICAgICB1cGRhdGVxdWVyeSgpCiAgICAgICAgcXVlcnl3YWl0LnJlc29sdmUoKQogICAgICB9KQoKICAgICAgcXMoIiNyZWxheXMtZm9ybSIpLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsIGFzeW5jIGUgPT4gewogICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIGxldCByID0gSlNPTi5zdHJpbmdpZnkocXMoIiNyZWxheXMiKS52YWx1ZS5zcGxpdCgiXG4iKSkKICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgicmVsYXlzIiwgcikKICAgICAgICBkaXNjb25uZWN0KCkKICAgICAgfSkKCiAgICAgIHFzKCIjcHJpdmtleS1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgYXN5bmMgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgY29uc3Qga2V5ID0gcXMoIiNwcml2a2V5IikudmFsdWUKCiAgICAgICAgaWYoa2V5Lmxlbmd0aCAhPSA2NCAmJiBrZXkubGVuZ3RoICE9IDYzKXsKICAgICAgICAgIGFsZXJ0KCJrZXkgc2hvdWxkIGJlIDYzIG9yIDY0IGNoYXJhY3RlcnMgbG9uZyIpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oInByaXZrZXkiLCBrZXkpCiAgICAgICAgYWxlcnQoImtleSBzYXZlZCIpCiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLCBhc3luYyAoZSkgPT4gewogICAgICAgIGlmKGF1dG9wbGF5KCkgPT0gImhvdmVyIiAmJiBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInZpZGVvLWNvbnRhaW5lciIpKXsKICAgICAgICAgIGhvdmVyZWR2aWRlbyA9IGUudGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAgIGhvdmVyZWR2aWRlby5wbGF5KCkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaG92ZXJlZHZpZGVvID0gZmFsc2UKICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLnN0eWxlLmRpc3BsYXkgIT0gImJsb2NrIiAmJiBhdXRvcGxheSgpID09ICJob3ZlciIgJiYgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2aWRlby1jb250YWluZXIiKSl7CiAgICAgICAgICBxc2EoInZpZGVvIikuZm9yRWFjaCh2ID0+IHYucGF1c2UoKSkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaWYoZS50YXJnZXQudHlwZSA9PSAic3VibWl0IiB8fCAoZS50YXJnZXQudGFnTmFtZSA9PSAiQSIgJiYgZS50YXJnZXQuaHJlZi5tYXRjaCgvXih8d2ViXCspbm9zdHJcOi8pKSl7CiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAidGl0bGUiKXsKICAgICAgICAgIHFzKCIjcXVlcnkiKS52YWx1ZSA9ICIiCiAgICAgICAgICBxcygiI3F1ZXJ5LXR5cGUiKS52YWx1ZSA9ICJhbGwiCiAgICAgICAgICBxcygiI2dvIikuY2xpY2soKQogICAgICAgIH0KCiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJmaWx0ZXItbGlrZXMiKXsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnRvZ2dsZSgiZmlsdGVyLWxpa2VzIikKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKSl7CiAgICAgICAgICBhY3RpdmUoKT8uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIGdpZChlLnRhcmdldC5pZCkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIHNob3coZS50YXJnZXQuaWQpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS50YXJnZXQudGFnTmFtZSAhPSAiQSIgJiYgKHFzKCIjcGljLWNvbnRhaW5lciIpID09IGUudGFyZ2V0IHx8IHFzKCIjbWVkaWEtY29udGFpbmVyIHZpZGVvIikgPT0gZS50YXJnZXQpKXsKICAgICAgICAgIGhpZGVtZWRpYSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJtZW51IiB8fCBlLnRhcmdldC5pZCA9PSAibWVudS1vdmVybGF5Iil7CiAgICAgICAgICBtZW51KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRjb2xzIikpewogICAgICAgICAgZm9yKGxldCBjIG9mIGNvbG9wdHMpewogICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoImNvbHMiICsgYykKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJjb2xzIiArIGUudGFyZ2V0LmRhdGFzZXQuY29scykKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJjb2xzIiwgZS50YXJnZXQuZGF0YXNldC5jb2xzKQogICAgICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRhdXRvcGxheSIpKXsKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJhdXRvcGxheSIsIGUudGFyZ2V0LmRhdGFzZXQuYXV0b3BsYXkpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGF1dG9wbGF5IiwgImF1dG9wbGF5IiwgYXV0b3BsYXkoKSkKICAgICAgICAgIHVwZGF0ZWFsbHZpZGVvcGxheSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2V0c2hvd2Vycm9ycyIpKXsKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJzaG93ZXJyb3JzIiwgZS50YXJnZXQuZGF0YXNldC5zaG93ZXJyb3JzKQogICAgICAgICAgc2V0YWN0aXZlKCJzZXRzaG93ZXJyb3JzIiwgInNob3dlcnJvcnMiLCBzaG93ZXJyb3JzKCkpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJsaWtlIikpewogICAgICAgICAgbGlrZShlLnRhcmdldCkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBmdW5jdGlvbiBoYXNrZXkoKXsKICAgICAgICByZXR1cm4gd2luZG93Lm5vc3RyIHx8IHByaXZrZXkoKQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBwdWJrZXkoKXsKICAgICAgICByZXR1cm4gd2luZG93Lm5vc3RyICYmIGF3YWl0IHdpbmRvdy5ub3N0ci5nZXRQdWJsaWNLZXkoKSB8fCBOb3N0clRvb2xzLmdldFB1YmxpY0tleShwcml2a2V5KCkpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHNpZ24oZXZlbnQpewogICAgICAgIGlmKHdpbmRvdy5ub3N0cil7CiAgICAgICAgICByZXR1cm4gYXdhaXQgbm9zdHIuc2lnbkV2ZW50KGV2ZW50KQogICAgICAgIH0KICAgICAgICAKICAgICAgICBldmVudC5zaWcgPSBOb3N0clRvb2xzLmdldFNpZ25hdHVyZShldmVudCwgcHJpdmtleSgpKQogICAgICAgIHJldHVybiBldmVudAogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBsaWtlKGxpbmspewogICAgICAgIGNvbnN0IGV2ZW50ID0gbGluay5wYXJlbnRFbGVtZW50WyJkYXRhLWV2ZW50Il0KICAgICAgICBjb25zdCBwdWJrID0gYXdhaXQgcHVia2V5KCkKICAgICAgICBjb25zdCBsaWtlID0gYXdhaXQgc2lnbih7CiAgICAgICAgICAia2luZCI6IDcsCiAgICAgICAgICAiY29udGVudCI6ICIrIiwKICAgICAgICAgICJ0YWdzIjogWwogICAgICAgICAgICBbImUiLCBldmVudC5pZF0sCiAgICAgICAgICAgIFsicCIsIGV2ZW50LnB1YmtleV0KICAgICAgICAgIF0sCiAgICAgICAgICAicHVia2V5IjogcHViaywKICAgICAgICAgICJjcmVhdGVkX2F0IjogcGFyc2VJbnQoRGF0ZS5ub3coKSAvIDEwMDAgLCAxMCkKICAgICAgICB9KQogICAgICAgIAogICAgICAgIGNvbnN0IGxpa2Vqc29uID0gSlNPTi5zdHJpbmdpZnkoWyJFVkVOVCIsIGxpa2VdKQogICAgICAgIHNvY2tldHMuZm9yRWFjaChzID0+IHMuc2VuZChsaWtlanNvbikpCiAgICAgICAgY29uc29sZS5sb2coInNlbnQgbGlrZSIsIGxpa2Vqc29uKSAKICAgICAgICBsaW5rLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQoKICAgICAgICBjb25zdCBwaWNpZCA9IGxpbmtbImRhdGEtaXRlbS1pZCJdIHx8IGxpbmsuZGF0YXNldC5waWNJZAogICAgICAgIAogICAgICAgIGlmKHBpY2lkKXsKICAgICAgICAgIGdpZChwaWNpZCkucXVlcnlTZWxlY3RvcigiLmxpa2UiKS5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICAgIHJlYWN0ZWQucHVzaChwaWNpZCkKICAgICAgICB9CiAgICAgIH0KICAgIAogICAgICBmdW5jdGlvbiBwcmV2KCl7CiAgICAgICAgaWYocGljb2Zmc2V0KC0xKSl7CiAgICAgICAgICBwaWNvZmZzZXQoLTEpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBsYXN0YWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIHVwZGF0ZXNob3coKQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gbmV4dCgpewogICAgICAgIGlmKHBpY29mZnNldCgxKSl7CiAgICAgICAgICBwaWNvZmZzZXQoMSkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICB1cGRhdGVzaG93KCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZXNob3coKXsKICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLnN0eWxlLmRpc3BsYXkgPT0gImJsb2NrIil7CiAgICAgICAgICBoaWRldmlkZW8oKQogICAgICAgICAgc2hvdyhhY3RpdmUoKS5pZCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBlID0+IHsKICAgICAgICBpZihbIlRhYiIsICJBcnJvd0xlZnQiLCAiQXJyb3dSaWdodCIsICJBcnJvd1VwIiwgIkFycm93RG93biJdLmluY2x1ZGVzKGUua2V5KSl7CiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJFc2NhcGUiKXsKICAgICAgICAgIG1lbnUoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUua2V5ID09ICJFbnRlciIgJiYgZS50YXJnZXQudGFnTmFtZSA9PSAiQk9EWSIpewogICAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5zdHlsZS5kaXNwbGF5ID09ICJibG9jayIpewogICAgICAgICAgICBoaWRlbWVkaWEoKQogICAgICAgICAgICByZXR1cm4KICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgc2hvdyhhY3RpdmUoKS5pZCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93VXAiICYmIHBpY29mZnNldCgtY29scygpKSl7CiAgICAgICAgICBwaWNvZmZzZXQoLWNvbHMoKSkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIGxhc3RhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgdXBkYXRlc2hvdygpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dEb3duIiAmJiBwaWNvZmZzZXQoY29scygpKSl7CiAgICAgICAgICBwaWNvZmZzZXQoY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgYWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIHVwZGF0ZXNob3coKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93TGVmdCIpewogICAgICAgICAgcHJldigpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dSaWdodCIpewogICAgICAgICAgbmV4dCgpCiAgICAgICAgfQogICAgICB9KQoKICAgICAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlcXVlcnlyZXMocmVzLCBzb2NrZXQsIHEsIHR5cGUsIHN0aW1lKXsKICAgICAgICBzYXZlKHNvY2tldCwgcmVzLCBxLCB0eXBlLCBmYWxzZSwgZmFsc2UpCiAgICAgICAgbG9nKCJxdWVyeSByZXMiLCByZXMubGVuZ3RoLCBzb2NrZXQudXJsKQogICAgICAgIHF1ZXJ5Y291bnQtLQogICAgICAgIGlmKHF1ZXJ5Y291bnQgPT0gMCl7CiAgICAgICAgICBxcygiI2xvYWRpbmciKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxldCB3YWl0ID0gd2FpdG1zIC0gKERhdGUubm93KCkgLSBzdGltZSkKICAgICAgICBxdWVyeXdhaXQgPSBzbGVlcCh3YWl0KQogICAgICAgIGF3YWl0IHF1ZXJ5d2FpdC5wcm9taXNlCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHByaW1hbGdsb2JhbChzb2NrZXQpewogICAgICAgIGxvZygiZ2xvYmFsIiwgc29ja2V0LnVybCkKICAgICAgICBxdWVyeWNvdW50KysKICAgICAgICBxcygiI2xvYWRpbmciKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgIGxldCBzdGltZSA9IERhdGUubm93KCkKICAgICAgICBsZXQgcWlkID0gImdsb2JhbF8iICsgKCsraWRjb3VudGVyKQogICAgICAgIGxldCBxaWRsaWtlcyA9ICJsaWtlc18iICsgKCsraWRjb3VudGVyKQoKICAgICAgICBpZihuZXdsaWtlcy5sZW5ndGggPiAwKXsKICAgICAgICAgIHByaW1hbHNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KFsKICAgICAgICAgICAgIlJFUSIsIAogICAgICAgICAgICBxaWRsaWtlcywgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiY2FjaGUiOiBbCiAgICAgICAgICAgICAgICAiZXZlbnRzIiwgewogICAgICAgICAgICAgICAgICAiZXZlbnRfaWRzIjogbmV3bGlrZXMKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0KICAgICAgICAgIF0pKQoKICAgICAgICAgIGNvbnN0IGxpa2VfZXZlbnRzID0gYXdhaXQgd2FpdHJlcyhxaWRsaWtlcykKICAgICAgICAgIG5ld2xpa2VzLnNwbGljZSgwKQogICAgICAgICAgCiAgICAgICAgICBhd2FpdCBzYXZlKHNvY2tldCwgbGlrZV9ldmVudHMsICIiLCAiYWxsIiwgdHJ1ZSwgdHJ1ZSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoWwogICAgICAgICAgIlJFUSIsIAogICAgICAgICAgcWlkLCAKICAgICAgICAgIHsKICAgICAgICAgICAgImNhY2hlIjogWwogICAgICAgICAgICAgICJleHBsb3JlIiwgCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInRpbWVmcmFtZSI6ICJsYXRlc3QiLAogICAgICAgICAgICAgICAgInNjb3BlIjogImdsb2JhbCIsCiAgICAgICAgICAgICAgICAibGltaXQiOiAyMAogICAgICAgICAgICAgIH0KICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0pKQogICAgICAgIAogICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHdhaXRyZXMocWlkKQogICAgICAgIGF3YWl0IGhhbmRsZXF1ZXJ5cmVzKHJlcy5maWx0ZXIoZSA9PiBlLmtpbmQgPT0gMSksIHNvY2tldCwgIiIsICJhbGwiLCBzdGltZSkKICAgICAgICBwcmltYWxnbG9iYWwoc29ja2V0KQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeShzb2NrZXQsIHByaW1hbCl7CiAgICAgICAgbG9nKCJxdWVyeSIsIHNvY2tldC51cmwpCiAgICAgICAgcXVlcnljb3VudCsrCiAgICAgICAgcXMoIiNsb2FkaW5nIikuc3R5bGUuZGlzcGxheSA9ICJibG9jayIKICAgICAgICAKICAgICAgICBsZXQgc3RpbWUgPSBEYXRlLm5vdygpCiAgICAgICAgbGV0IHEgPSBxdWVyeXN0ci50cmltKCkKICAgICAgICBsZXQgdHlwZSA9IHF1ZXJ5dHlwZSgpCiAgICAgICAgbGV0IGkgPSArK2lkY291bnRlcgogICAgICAgIGxldCBxaWQgPSAicXVlcnlfIiArIGkKICAgICAgICBsZXQgZmlsdGVycyA9IFtdCgogICAgICAgIGZpbHRlcnMucHVzaCguLi4odHlwZXNbdHlwZV0gfHwgW10pLm1hcCgodCkgPT4gewogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAga2luZHM6IFsxXSwgCiAgICAgICAgICAgIHNlYXJjaDogIi4iICsgdCwKICAgICAgICAgICAgbGltaXQ6IDIwCiAgICAgICAgICB9CiAgICAgICAgfSkpCiAgICAgICAgCiAgICAgICAgaWYocS5sZW5ndGggPiAwKXsKICAgICAgICAgIGZpbHRlcnMucHVzaCh7a2luZHM6IFsxXSwgc2VhcmNoOiBxfSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZmlsdGVycy5sZW5ndGggPT0gMCl7CiAgICAgICAgICBmaWx0ZXJzLnB1c2goe2tpbmRzOiBbMV19KQogICAgICAgIH0KICAgICAgICAKICAgICAgICAKICAgICAgICBjb25zdCBsaWtlc3JlcyA9IGF3YWl0IHF1ZXJ5bGlrZXMoc29ja2V0KQogICAgICAgIAogICAgICAgIGxpa2VzcmVzLmZvckVhY2goZXZlbnRpZCA9PiB7CiAgICAgICAgICBpZighbGlrZXMuaW5jbHVkZXMoZXZlbnRpZCkpewogICAgICAgICAgICBsaWtlcy5wdXNoKGV2ZW50aWQpCiAgICAgICAgICAgIG5ld2xpa2VzLnB1c2goZXZlbnRpZCkKICAgICAgICAgIH0KICAgICAgICB9KQogICAgICAgIAogICAgICAgIGNvbnN0IHNlYXJjaG9iaiA9IFsiUkVRIiwgcWlkLCAuLi5maWx0ZXJzXQogICAgICAgIGNvbnN0IHNlYXJjaGpzb24gPSBKU09OLnN0cmluZ2lmeShzZWFyY2hvYmopCiAgICAgICAgc29ja2V0LnNlbmQoc2VhcmNoanNvbikKICAgICAgICAKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB3YWl0cmVzKHFpZCkKICAgICAgICBhd2FpdCBoYW5kbGVxdWVyeXJlcyhyZXMsIHNvY2tldCwgcSwgdHlwZSwgc3RpbWUpCiAgICAgICAgcXVlcnkoc29ja2V0KQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeWxpa2VzKHNvY2tldCl7CiAgICAgICAgaWYoIWhhc2tleSgpKXsKICAgICAgICAgIHJldHVybiBbXQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBteXB1YmtleSA9IGF3YWl0IHB1YmtleSgpCiAgICAgICAgY29uc3QgZXZlbnRzID0gYXdhaXQgcXVlcnlldmVudHMoc29ja2V0LCBbN10sIG51bGwsIFtteXB1YmtleV0pCiAgICAgICAgcmV0dXJuIGV2ZW50cy5tYXAoZSA9PiBlLnRhZ3MuZmluZCh0ID0+IHRbMF0gPT0gImUiKVsxXSkKICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlldmVudHMoc29ja2V0LCBraW5kcywgZXZlbnRpZHMsIGF1dGhvcnMpewogICAgICAgIGNvbnN0IHF1ZXJ5aWQgPSAiZXZlbnRzXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgY29uc3QgZmlsdGVycyA9IHt9CiAgICAgICAgCiAgICAgICAgZmlsdGVycy5raW5kcyA9IGtpbmRzCiAgICAgICAgCiAgICAgICAgaWYoZXZlbnRpZHMpewogICAgICAgICAgZmlsdGVyc1siI2UiXSA9IGV2ZW50aWRzCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGF1dGhvcnMpewogICAgICAgICAgZmlsdGVyc1siYXV0aG9ycyJdID0gYXV0aG9ycwogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkoWwogICAgICAgICAgIlJFUSIsIAogICAgICAgICAgcXVlcnlpZCwgCiAgICAgICAgICBmaWx0ZXJzCiAgICAgICAgXSkKCiAgICAgICAgc29ja2V0LnNlbmQoanNvbikKICAgICAgICAKICAgICAgICByZXR1cm4gYXdhaXQgd2FpdHJlcyhxdWVyeWlkKSB8fCBbXQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeXB1YmtleShzb2NrZXQsIHB1YmspewogICAgICAgIGNvbnN0IHF1ZXJ5aWQgPSAicXVlcnlfIiArICgrK2lkY291bnRlcikKICAgICAgICBzb2NrZXQuc2VuZChxdWVyaWVzLmF1dGhvci5yZXBsYWNlKCI8ST4iLCBxdWVyeWlkKS5yZXBsYWNlKCI8UD4iLCBwdWJrKSkKCiAgICAgICAgcmV0dXJuIChhd2FpdCB3YWl0cmVzKHF1ZXJ5aWQpKQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBzYXZlKHNvY2tldCwgZXZlbnRkYiwgcSwgcXR5cGUsIHJlYWN0ZWQsIGFwcGVuZCl7CiAgICAgICAgbGV0IGV2ZW50cHVia2V5cyA9IFtdCiAgICAgICAgY29uc3QgZXZlbnRzID0gZXZlbnRkYi5maWx0ZXIobyA9PiB7CiAgICAgICAgICBpZihxLmxlbmd0aCA+IDApewogICAgICAgICAgICBmb3IobGV0IHdvcmQgb2YgcS5zcGxpdCgiICIpKXsKICAgICAgICAgICAgICBpZihvLmNvbnRlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKHdvcmQudG9Mb3dlckNhc2UoKSkgPT0gLTEpewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgcmV0dXJuIHRydWUKICAgICAgICB9KQogICAgICAgIAogICAgICAgIGxldCByZXN1bHRzID0gW10KICAgICAgICBjb25zdCBldmVudGlkcyA9IGV2ZW50cy5tYXAoZSA9PiBlLmlkKQogICAgICAgIGxldCBuZXd1cmxzID0gW10KICAgICAgICAKICAgICAgICBmb3IobGV0IGV2ZW50IG9mIGV2ZW50cyl7CiAgICAgICAgICBsZXQgdXJsc21hdGNoID0gW10KICAgICAgICAgIAogICAgICAgICAgaWYocXR5cGUgIT0gInZpZGVvIil7CiAgICAgICAgICAgIHVybHNtYXRjaC5wdXNoKC4uLihldmVudC5jb250ZW50Lm1hdGNoKGltZ3JlZ2V4KSB8fCBbXSkpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGlmKHF0eXBlICE9ICJpbWFnZSIpewogICAgICAgICAgICB1cmxzbWF0Y2gucHVzaCguLi4oZXZlbnQuY29udGVudC5tYXRjaCh2aWRlb3JlZ2V4KSB8fCBbXSkpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHVybHNtYXRjaCA9IHVybHNtYXRjaC5maWx0ZXIodXJsID0+ICF1cmxzLmluY2x1ZGVzKHVybCkpCgogICAgICAgICAgaWYodXJsc21hdGNoLmxlbmd0aCA+IDApewogICAgICAgICAgICBuZXd1cmxzLnB1c2goewogICAgICAgICAgICAgIGV2ZW50OiBldmVudCwKICAgICAgICAgICAgICB1cmxzOiB1cmxzbWF0Y2gKICAgICAgICAgICAgfSkKICAgICAgICAgICAgCiAgICAgICAgICAgIHVybHMucHVzaCguLi51cmxzbWF0Y2gpCiAgICAgICAgICAgIGV2ZW50cHVia2V5cy5pbmNsdWRlcyhldmVudC5wdWJrZXkpIHx8IGV2ZW50cHVia2V5cy5wdXNoKGV2ZW50LnB1YmtleSkKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbG9nKCJxdWVyeSBtZXRhIiwgc29ja2V0LnVybCkKICAgICAgICBsZXQgbWV0YWV2ZW50cyA9IGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzBdLCBudWxsLCBldmVudHB1YmtleXMpCiAgICAgICAgCiAgICAgICAgZm9yKGxldCBlbnRyeSBvZiBuZXd1cmxzKXsKICAgICAgICAgIGZvcihsZXQgdXJsIG9mIGVudHJ5LnVybHMpewogICAgICAgICAgICByZXN1bHRzLnB1c2goewogICAgICAgICAgICAgIHJlYWN0ZWQ6IHJlYWN0ZWQgfHwgbGlrZXMuaW5jbHVkZXMoZW50cnkuZXZlbnQuaWQpLCAKICAgICAgICAgICAgICB1cmw6IHVybCwgCiAgICAgICAgICAgICAgZXZlbnQ6IGVudHJ5LmV2ZW50LCAKICAgICAgICAgICAgICBiZWNoMzJpZDogYmVjaDMyLmVuY29kZSgibm90ZSIsIGZyb21IZXhTdHJpbmcoZW50cnkuZXZlbnQuaWQpKSwKICAgICAgICAgICAgICBtZXRhOiBtZXRhZXZlbnRzLmZpbmQobyA9PiBvLnB1YmtleSA9PSBlbnRyeS5ldmVudC5wdWJrZXkpCiAgICAgICAgICAgIH0pCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxvZygic2F2ZSByZXMiLCByZXN1bHRzLmxlbmd0aCwgc29ja2V0LnVybCkKICAgICAgICB1cGRhdGVjb250ZW50KHJlc3VsdHMsIHEsIGFwcGVuZCkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlY29udGVudChyZXN1bHRzLCBxLCBhcHBlbmQpewogICAgICAgIHJlc3VsdHMucmV2ZXJzZSgpLmZvckVhY2goaXRlbSA9PiB7CiAgICAgICAgICBjb25zdCB0eXBlID0gaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleCkgJiYgInZpZGVvIiB8fCAicGljIgogICAgICAgICAgY29uc3QgdGV4dCA9IChxIHx8ICJ2aWV3IG5vdGUiKS5zdWJzdHJpbmcoLTMwKQogICAgICAgICAgY29uc3QgaWQgPSAiaXRlbV8iICsgKCsraWRjb3VudGVyKQogICAgICAgICAgY29uc3QgY29udGVudGVsZW1lbnRzID0gJzxkaXYgY2xhc3M9InR5cGUiPicgKyB0eXBlICsgJzwvZGl2PjxhIGNsYXNzPSJsaWtlJyArIChpdGVtLnJlYWN0ZWQgPyAnIHJlYWN0ZWQnIDogJycpICsgJyIgZGF0YS1pdGVtLWlkPSInICsgaWQgKyAKICAgICAgICAgICAgJyIgaHJlZj0iIyI+JyArIHFzKCIjdGVtcGxhdGUgLmhlYXJ0c3ZnIikub3V0ZXJIVE1MICsgJzwvYT48YSBjbGFzcz0icXVlcnkiIGhyZWY9IicgKyBwcm90b2NvbCArIAogICAgICAgICAgICBpdGVtLmJlY2gzMmlkICsgJyI+JyArIHRleHQgKyAnPC9hPicKICAgICAgICAgIGxldCByb290ID0gbnVsbAogICAgICAgICAgbGV0IHYgPSBudWxsCiAgICAgICAgICAKICAgICAgICAgIGlmKGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpKXsKICAgICAgICAgICAgcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCiAgICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgidmlkZW8tY29udGFpbmVyIikKICAgICAgICAgICAgcm9vdC5pbm5lckhUTUwgPSBjb250ZW50ZWxlbWVudHMKICAgICAgICAgICAgCiAgICAgICAgICAgIHYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpCiAgICAgICAgICAgIHZbImRhdGEtaXRlbS1pZCJdID0gaWQKICAgICAgICAgICAgdi5wcmVsb2FkID0gIm5vbmUiCiAgICAgICAgICAgIHYubG9vcCA9IHRydWUKICAgICAgICAgICAgdi5wbGF5c2lubGluZSA9ICIiCiAgICAgICAgICAgIAogICAgICAgICAgICB2Lm9uY2FucGxheSA9IGFzeW5jIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIGNvbnN0IGFzcGVjdCA9IHRoaXMudmlkZW9XaWR0aCAvIHRoaXMudmlkZW9IZWlnaHQKICAgICAgICAgICAgICBpZihhc3BlY3QgPiAxKXsKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUud2lkdGggPSAoYXNwZWN0ICogMTAwKSArICIlIgogICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgdGhpcy5zdHlsZS5oZWlnaHQgPSAoMSAvIGFzcGVjdCAqIDEwMCkgKyAiJSIKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUubWFyZ2luVG9wID0gLSgoMSAvIGFzcGVjdCAqIDEwMCAtIDEwMCkgLyAyKSArICIlIgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAKICAgICAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkodGhpcykKICAgICAgICAgICAgICB0aGlzLnBhcmVudEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICJibG9jayIKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29uc3QgZXh0ID0gaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleClbMV0KICAgICAgICAgICAgdi5pbm5lckhUTUwgPSAnPHNvdXJjZSBzcmM9IicgKyBpdGVtLnVybCArICciIHR5cGU9InZpZGVvLycgKyBleHQgKyAnIj48L3NvdXJjZT4nCiAgCiAgICAgICAgICAgIGlmKHNob3dlcnJvcnMoKSA9PSAib24iKXsKICAgICAgICAgICAgICB2LnF1ZXJ5U2VsZWN0b3IoInNvdXJjZSIpLm9uZXJyb3IgPSBhc3luYyBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJlcnJvciIpCiAgICAgICAgICAgICAgICByb290LmNsYXNzTGlzdC5yZW1vdmUoInNob3ciKQogICAgICAgICAgICAgICAgcm9vdC5pbm5lclRleHQgPSAiZXJyb3IgbG9hZGluZyB1cmw6ICIgKyBpdGVtLnVybAogICAgICAgICAgICAgICAgcm9vdC5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgcm9vdC5hcHBlbmQodikKICAgICAgICAgIH1lbHNlIGlmKGl0ZW0udXJsLm1hdGNoKGltZ2V4dHJlZ2V4KSl7CiAgICAgICAgICAgIHJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIikKICAgICAgICAgICAgcm9vdC5ocmVmID0gIiMiCiAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MID0gY29udGVudGVsZW1lbnRzCiAgICAgICAgICAgICAgCiAgICAgICAgICAgIGlmKHR5cGUgPT0gInBpYyIpewogICAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MICs9ICc8aW1nIG9ubG9hZD0iZ2lkKFwnJyArIGlkICsgJ1wnKS5zdHlsZS5kaXNwbGF5PVwnYmxvY2tcJyIgc3JjPSInICsgaXRlbS51cmwgKyAnIi8+JwogICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICByb290LmlubmVySFRNTCArPSAnPHNwYW4gY2xhc3M9ImZpbGUiPicgKyBpdGVtLnVybCArICc8L3NwYW4+JwogICAgICAgICAgICB9CiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIC8vcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCiAgICAgICAgICAgIC8vcm9vdC5pbm5lclRleHQgPSBpdGVtLnVybAogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICByb290LmlkID0gaWQKICAgICAgICAgIHJvb3RbImRhdGEtaXRlbSJdID0gaXRlbQogICAgICAgICAgcm9vdFsiZGF0YS1ldmVudCJdID0gaXRlbS5ldmVudAogICAgICAgICAgcm9vdFsiZGF0YS1xdWVyeSJdID0gcQogICAgICAgICAgcm9vdFsiZGF0YS10ZXh0Il0gPSB0ZXh0CiAgICAgICAgICAKICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCh0eXBlKQogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJpdGVtIikKICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgic2hvdyIpCiAgICAgICAgICAKICAgICAgICAgIGlmKGl0ZW0ucmVhY3RlZCl7CiAgICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHFzKCIjcGljcyIpW2FwcGVuZCAmJiAiYXBwZW5kIiB8fCAicHJlcGVuZCJdKHJvb3QpCiAgICAgICAgICAKICAgICAgICAgIGlmKHYpewogICAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkodikKICAgICAgICAgIH0KICAgICAgICB9KQoKICAgICAgICBpZihhY3RpdmUoKSA9PSBudWxsKXsKICAgICAgICAgIHFzKCIjcGljcyAuaXRlbSIpPy5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGlkZW1lZGlhKCl7CiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICJzY3JvbGwiCiAgICAgICAgcXNhKCIjbWVkaWEtY29udGFpbmVyLCAjcGljLCAjbWVkaWEtZm9vdGVyIikuZm9yRWFjaChuID0+IG4uc3R5bGUuZGlzcGxheSA9ICJub25lIikKICAgICAgICBnaWQoInBpYy1saWtlIikuY2xhc3NMaXN0LnJlbW92ZSgicmVhY3RlZCIpCiAgICAgICAgaGlkZXZpZGVvKCkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGlkZXZpZGVvKCl7CiAgICAgICAgY29uc3QgdiA9IHFzKCIjbWVkaWEtY29udGFpbmVyIHZpZGVvIikKICAgICAgICAKICAgICAgICBpZih2KXsKICAgICAgICAgIHYubXV0ZWQgPSB0cnVlCiAgICAgICAgICBnaWQodlsiZGF0YS1pdGVtLWlkIl0pLmFwcGVuZENoaWxkKHYpCiAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkodikKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHdhaXRyZXMoa2V5KXsKICAgICAgICBsZXQgZXZlbnRzID0gW10KICAgICAgICAKICAgICAgICBsZXQgcmVzaGFuZGxlciA9IGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7CiAgICAgICAgICB0aGlzLmhhbmRsZSA9IGZ1bmN0aW9uKHJlcyl7CiAgICAgICAgICAgIHRoaXMua2V5ID0ga2V5CiAgICAgICAgICAgIGxldCBvID0gSlNPTi5wYXJzZShyZXMuZGF0YSkKICAgICAgICAgICAgaWYob1sxXSA9PSBrZXkpewogICAgICAgICAgICAgIGlmKG9bMF0gPT0gIkVPU0UiKXsKICAgICAgICAgICAgICAgIHJlc29sdmUoZXZlbnRzKQogICAgICAgICAgICAgICAgcmVzaGFuZGxlcnMuc3BsaWNlKHJlc2hhbmRsZXJzLmluZGV4T2YodGhpcyksIDEpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGV2ZW50cy5wdXNoKG9bMl0pCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgICAKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAgICAgcmVzaGFuZGxlcnMucHVzaChuZXcgcmVzaGFuZGxlcihyZXNvbHZlLCByZWplY3QpKQogICAgICAgIH0pCiAgICAgIH0KICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBjaGVja3VwZGF0ZShzb2NrZXQpewogICAgICAgIGNvbnN0IHVwZGF0ZXNyZXMgPSBhd2FpdCBxdWVyeXB1YmtleShzb2NrZXQsIHVwZGF0ZXNwdWJrZXkpCiAgICAgICAgY29uc3QgdXBkYXRlbm90ZSA9IHVwZGF0ZXNyZXMuZmluZChuID0+IG4uY29udGVudC5tYXRjaCgvXmh0dHBzXDpcL1wvLykpCiAgICAgICAgCiAgICAgICAgaWYoIXVwZGF0ZW5vdGUpewogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGFnZSA9IE1hdGgucm91bmQoKERhdGUubm93KCkgLyAxMDAwIC0gdXBkYXRlbm90ZS5jcmVhdGVkX2F0KSAvIDM2MDAgLyAyNCkKICAgICAgICBjb25zdCBub3RlaWQgPSBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyh1cGRhdGVub3RlLmlkKSkKICAgICAgICBxcygiI3JlbGVhc2UiKS5ocmVmID0gcHJvdG9jb2wgKyBub3RlaWQKICAgICAgICBxcygiI3JlbGVhc2UiKS5pbm5lclRleHQgPSAoYWdlID09IDAgJiYgInRvZGF5IiB8fCBhZ2UgKyAiIGRheShzKSBhZ28iKQogICAgICB9CgogICAgICBmdW5jdGlvbiBzbGVlcChtcyl7CiAgICAgICAgcmV0dXJuIG5ldyBmdW5jdGlvbigpewogICAgICAgICAgbGV0IHRpbWVvdXQgPSBudWxsCiAgICAgICAgICBsZXQgciA9IG51bGwKICAgICAgICAgIAogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcHJvbWlzZTogbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXsKICAgICAgICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIG1zKQogICAgICAgICAgICAgIHIgPSByZXNvbHZlCiAgICAgICAgICAgIH0pLAogICAgICAgICAgICByZXNvbHZlOiBmdW5jdGlvbigpewogICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KQogICAgICAgICAgICAgIHIoKQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzaG93KGlkKXsKICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiIKICAgICAgICBjb25zdCBpdGVtID0gZ2lkKGlkKVsiZGF0YS1pdGVtIl0KICAgICAgICBjb25zdCBtZWRpYSA9IGdpZCgibWVkaWEtY29udGFpbmVyIikKICAgICAgICBjb25zdCBwaWMgPSBnaWQoInBpYyIpCgogICAgICAgIGlmKGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpKXsKICAgICAgICAgIHBpYy5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiCiAgICAgICAgICBjb25zdCB2ID0gZ2lkKGlkKS5xdWVyeVNlbGVjdG9yKCJ2aWRlbyIpCiAgICAgICAgICBxcygiI21lZGlhLWNvbnRhaW5lciIpLmFwcGVuZENoaWxkKHYpCiAgICAgICAgICB2Lm11dGVkID0gZmFsc2UKICAgICAgICAgIHYucGxheSgpCiAgICAgICAgfWVsc2V7CiAgICAgICAgICBwaWMuc3JjID0gaXRlbS51cmwKICAgICAgICAgIHBpYy5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihpdGVtLm1ldGEpewogICAgICAgICAgY29uc3QgbWV0YWNvbnRlbnQgPSBKU09OLnBhcnNlKGl0ZW0ubWV0YS5jb250ZW50KQogICAgICAgICAgY29uc3QgbmFtZSA9IG1ldGFjb250ZW50LmRpc3BsYXlfbmFtZSB8fCBtZXRhY29udGVudC5uYW1lCiAgICAgICAgICBxcygiI3BpYy11c2VyIikuaHJlZiA9IHByb3RvY29sICsgYmVjaDMyLmVuY29kZSgibnB1YiIsIGZyb21IZXhTdHJpbmcoaXRlbS5tZXRhLnB1YmtleSkpCiAgICAgICAgICBxcygiI3BpYy11c2VyIikuaW5uZXJUZXh0ID0gbmFtZQogICAgICAgIH0KCiAgICAgICAgZ2lkKCJwaWMtbGlrZSIpWyJkYXRhLWl0ZW0taWQiXSA9IGlkCiAgICAgICAgZ2lkKCJtZWRpYS1mb290ZXIiKVsiZGF0YS1ldmVudCJdID0gaXRlbS5ldmVudAoKICAgICAgICBpZihpdGVtLnJlYWN0ZWQgfHwgcmVhY3RlZC5pbmNsdWRlcyhpZCkpewogICAgICAgICAgZ2lkKCJwaWMtbGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBhID0gcXMoIiNwaWMtcXVlcnkiKQogICAgICAgIGEuaHJlZiA9IHByb3RvY29sICsgaXRlbS5iZWNoMzJpZAogICAgICAgIGEuaW5uZXJUZXh0ID0gZ2lkKGlkKVsiZGF0YS10ZXh0Il0KICAgICAgICAgIAogICAgICAgIG1lZGlhLnN0eWxlLmRpc3BsYXkgPSBnaWQoIm1lZGlhLWZvb3RlciIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGNvbm5jb3VudCgpewogICAgICAgIHJldHVybiBzb2NrZXRzLmZpbHRlcihyID0+IHIucmVhZHlTdGF0ZSA9PSAxKS5sZW5ndGgKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gZGlzY29ubmVjdCgpewogICAgICAgIGZvcihsZXQgc29ja2V0IG9mIHNvY2tldHMpewogICAgICAgICAgc29ja2V0LmNsb3NlKCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc29ja2V0cy5zcGxpY2UoMCkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gbG9nKG1zZyl7CiAgICAgICAgbGV0IHNjcm9sbCA9IHFzKCIjbG9ncyIpLnNjcm9sbFRvcCA9PSBxcygiI2xvZ3MiKS5zY3JvbGxUb3BNYXgKICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKQogICAgICAgIGRpdi5pbm5lclRleHQgPSBBcnJheS5mcm9tKGFyZ3VtZW50cykuam9pbigiICIpCiAgICAgICAgcXMoIiNsb2dzIikuYXBwZW5kKGRpdikKICAgICAgICAKICAgICAgICBpZihzY3JvbGwpewogICAgICAgICAgcXMoIiNsb2dzIikuc2Nyb2xsVG8oMCwgcXMoIiNsb2dzIikuc2Nyb2xsVG9wTWF4KQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gY29ubmVjdCh1cmwpewogICAgICAgIGxvZygiY29ubmVjdGluZyIsIHVybCkKICAgICAgICBsZXQgc29ja2V0ID0gbmV3IFdlYlNvY2tldCh1cmwpCiAgICAgICAgCiAgICAgICAgc29ja2V0Lm9ubWVzc2FnZSA9IG1lc3NhZ2UgPT4gcmVzaGFuZGxlcnMuZm9yRWFjaChyaCA9PiByaC5oYW5kbGUobWVzc2FnZSkpCiAgICAgICAgCiAgICAgICAgc29ja2V0Lm9uY2xvc2UgPSBhc3luYyBmdW5jdGlvbigpewogICAgICAgICAgc29ja2V0cy5zcGxpY2Uoc29ja2V0cy5pbmRleE9mKHNvY2tldCksIDEpCiAgICAgICAgICBxcygiI2Nvbm5jb3VudCIpLmlubmVyVGV4dCA9IGNvbm5jb3VudCgpICsgKHByaW1hbHNvY2tldCAmJiAxKQogICAgICAgICAgbG9nKCJkaXNjb25uZWN0ZWQiLCB0aGlzLnVybCwgY29ubmNvdW50KCkpCiAgICAgICAgICBhd2FpdCBzbGVlcCgxMDAwKS5wcm9taXNlCiAgICAgICAgICBjb25uZWN0KHRoaXMudXJsKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXQub25vcGVuID0gZnVuY3Rpb24oKXsKICAgICAgICAgIHFzKCIjY29ubmNvdW50IikuaW5uZXJUZXh0ID0gY29ubmNvdW50KCkgKyAocHJpbWFsc29ja2V0ICYmIDEpCiAgICAgICAgICBsb2coImNvbm5lY3RlZCIsIHRoaXMudXJsLCBjb25uY291bnQoKSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIHNvY2tldAogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgYXN5bmMgKCkgPT4gewogICAgICAgIHByaW1hbHNvY2tldCA9IGNvbm5lY3QoIndzczovL2NhY2hlMy5wcmltYWwubmV0L2NhY2hlMTciKQogICAgICAgIHByaW1hbHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIiwgZnVuY3Rpb24oKXsKICAgICAgICAgIHByaW1hbGdsb2JhbCh0aGlzKQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgcHJpbWFsc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIiwgZnVuY3Rpb24oKXsKICAgICAgICAgIHByaW1hbHNvY2tldCA9IG51bGwKICAgICAgICB9KQogICAgICAgIAogICAgICAgIGZvcihsZXQgdXJsIG9mIHJlbGF5cygpKXsKICAgICAgICAgIGNvbnN0IHNvY2tldCA9IGNvbm5lY3QodXJsKQogICAgICAgICAgc29ja2V0cy5wdXNoKHNvY2tldCkKICAgICAgICAgIAogICAgICAgICAgc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoIm9wZW4iLCBmdW5jdGlvbigpewogICAgICAgICAgICBjaGVja3VwZGF0ZSh0aGlzKQogICAgICAgICAgICBxdWVyeSh0aGlzKQogICAgICAgICAgfSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgYXdhaXQgc2xlZXAoMTAwKS5wcm9taXNlCiAgICAgICAgCiAgICAgICAgaWYoaGFza2V5KCkpewogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJub3N0ciIpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgZm9yKGxldCBjIG9mIGNvbG9wdHMpewogICAgICAgIGRvY3VtZW50LndyaXRlKCc8c3R5bGU+JyArIGNvbHNjc3MuaW5uZXJUZXh0LnJlcGxhY2UoL1wkXHtjb2xzXH0vZywgYykgKyAnPC9zdHlsZT4nKQogICAgICB9CiAgICA8L3NjcmlwdD4KICA8L2JvZHk+CjwvaHRtbD4K
https://ipfs.io/ipfs/QmNvjno1s3wjev8K638LmRRD9hzaDs16s8s1eavxMwHTXD
files.html, add option to show results of videos that do not load due to error
sha256
5114e8e87b10be71e9adbef3691aa83df38d9b510439640bec220139c9a58dda files.html
base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyIvPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL3N2Z2ljb25zLnNwYXJray5mci9zdmdpY29ucy5jc3MiLz4KICAgIDxzdHlsZT4KICAgICAgYm9keSB7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgd2lkdGg6IDEwMHZ3OwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICBmb250LWZhbWlseTogIk5vdG8gU2VyaWYiOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5LCAKICAgICAgI2hlYWRlciB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQogICAgICAKICAgICAgI3JlbGF5cywKICAgICAgI2xvZ3MsIAogICAgICAjcHJpdmtleSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd2lkdGg6IDE4ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzExMTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI3JlbGF5cywKICAgICAgI2xvZ3MgewogICAgICAgIGhlaWdodDogNmVtOwogICAgICB9CiAgICAgIAogICAgICAjbG9ncyB7CiAgICAgICAgaGVpZ2h0OiA4ZW07CiAgICAgICAgb3ZlcmZsb3c6IHNjcm9sbDsKICAgICAgICBmb250LXNpemU6IC44ZW07CiAgICAgIH0KICAgICAgCiAgICAgIHNlbGVjdCB7CiAgICAgICAgd2lkdGg6IDRlbTsKICAgICAgfQogICAgICAKICAgICAgI3JlbGF5cywgCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogLjVlbTsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSAudGV4dCwgCiAgICAgICNoZWFkZXIgYSwKICAgICAgI21lZGlhLWNvbnRhaW5lciB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICB6LWluZGV4OiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAKICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMGVtKSB7CiAgICAgICAgI3F1ZXJ5ZGlzcGxheSwKICAgICAgICAjY29udHJvbGluZm8gewogICAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZvcm0gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5IHsKICAgICAgICB3aWR0aDogNmVtOwogICAgICB9CiAgICAgIAogICAgICAjbG9hZGluZyB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwcHg7CiAgICAgICAgbGVmdDogMjdlbTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgYSB7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICB9CgogICAgICB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgCiAgICAgICNtZWRpYS1jb250YWluZXIgdmlkZW8gewogICAgICAgIHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7CiAgICAgICAgaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7CiAgICAgICAgbWFyZ2luLXRvcDogMCAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAudHlwZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnkgewogICAgICAgIHdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksIAogICAgICAjY29udHJvbGluZm8sCiAgICAgIGEsCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICB9CgogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbWluLXdpZHRoOiAzZW07CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLAogICAgICAjaGVhZGVyIHNwYW4gewogICAgICAgIHBhZGRpbmc6IDAuNWVtOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CgogICAgICAjaGVhZGVyIHsKICAgICAgICBwYWRkaW5nOiAwLjQ1ZW0gMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAjaGVhZGVyIC5pdGVtcyB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgLml0ZW1zLCAKICAgICAgI2NvbnRyb2xpbmZvIHsKICAgICAgICBtYXJnaW4tdG9wOiAuM2VtOwogICAgICB9CgogICAgICBwIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICAubGFiZWwgewogICAgICAgIHBhZGRpbmc6IC44ZW0gLjhlbSAuOGVtIDA7CiAgICAgIH0KCiAgICAgIHNwYW4jY29udHJvbGluZm8sIAogICAgICAjcGljcyBhID4gYSwKICAgICAgI3BpY3MgLnF1ZXJ5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KICAgICAgCiAgICAgIHNwYW4jY29udHJvbGluZm8gewogICAgICAgIHJpZ2h0OiAyZW07CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBwYWRkaW5nOiAwIDFlbTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KCiAgICAgICNtZWRpYS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwKTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtY29udGFpbmVyIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMgewogICAgICAgIG1heC13aWR0aDogMTAwdnc7CiAgICAgICAgbWF4LWhlaWdodDogMTAwdmg7CiAgICAgIH0KICAgICAgICAKICAgICAgI3BpY3MgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgCiAgICAgICNwaWNzID4gYSwgCiAgICAgICNwaWNzIGltZywKICAgICAgI3BpY3MgLmZpbGUsCiAgICAgICNwaWNzIC52aWRlby1jb250YWluZXIgewogICAgICAgIHdpZHRoOiAyNXZ3OwogICAgICB9CgogICAgICAjcGljcyA+IGEsCiAgICAgICNwaWNzIC5maWxlLAogICAgICAjcGljcyAudmlkZW8tY29udGFpbmVyIHsKICAgICAgICBoZWlnaHQ6IDI1dnc7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBib3JkZXI6IDAuM2VtIHNvbGlkIHRyYW5zcGFyZW50OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDAuM2VtOwogICAgICAgIG1hcmdpbjogLTAuM2VtOwogICAgICB9CgogICAgICAjcGljcyA+IC5maWxlIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICAKICAgICAgI21lZGlhLWNvbnRhaW5lciB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgYm9keTpub3QoLm5vc3RyKSAjZmlsdGVyLWxpa2VzLCAKICAgICAgLmZpbHRlci1saWtlcyAjcGljcyA+IC5pdGVtOm5vdCgucmVhY3RlZCkgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UsIAogICAgICAjcGljLXF1ZXJ5LAogICAgICAjcGljLXVzZXIgewogICAgICAgIHotaW5kZXg6IDI7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDN2dzsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBwYWRkaW5nOiAwIDF2dzsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UsIAogICAgICAjcGljLXF1ZXJ5IHsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgZm9udC1zaXplOiBtaW4oMy41dncsIDEuNWVtKTsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLDAuNik7CiAgICAgICAgbWF4LXdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnkgewogICAgICAgIHBhZGRpbmc6IC42ZW0gLjRlbSAuMWVtIC40ZW07CiAgICAgICAgbWF4LXdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgIC5saWtlLnJlYWN0ZWQsCiAgICAgIC5maWx0ZXItbGlrZXMgI2ZpbHRlci1saWtlcyB7CiAgICAgICAgYmFja2dyb3VuZDogcmVkOwogICAgICB9CgogICAgICAjcGljLXF1ZXJ5LAogICAgICAjcGljLXVzZXIgewogICAgICAgIGZvbnQtc2l6ZTogM2VtOwogICAgICB9CiAgICAgIAogICAgICAjcGljLXF1ZXJ5LAogICAgICAjcGljLXVzZXIsCiAgICAgICNtZWRpYS1mb290ZXIgLmxpa2UgewogICAgICAgIHotaW5kZXg6IDU7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICB9CiAgICAgIAogICAgICAjcGljLXF1ZXJ5LAogICAgICAjcGljLXVzZXIgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICAjcGljLXVzZXIgewogICAgICAgIGJvdHRvbTogMS45ZW07CiAgICAgICAgZm9udC1zaXplOiAxLjhlbTsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAuNjVlbTsKICAgICAgICBtYXgtd2lkdGg6IDhlbTsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgfQogICAgICAKICAgICAgLmxpa2UgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogYXV0bzsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIHdpZHRoOiAxZW07CiAgICAgICAgaGVpZ2h0OiAxZW07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgfQoKICAgICAgLm5vc3RyIC5saWtlIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsgIAogICAgICB9CgogICAgICAjbWVkaWEtZm9vdGVyIC5saWtlIHsKICAgICAgICBmb250LXNpemU6IDIuNGVtOwogICAgICB9CgogICAgICAjbWVkaWEtZm9vdGVyIHsKICAgICAgICBkaXNwbGF5OiBub25lOyAgCiAgICAgIH0KICAKICAgICAgI3BpY3MgaW1nIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIC5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICM0NDQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWNzID4gLmFjdGl2ZSB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiBncmVlbjsKICAgICAgICB6LWluZGV4OiAxOwogICAgICB9CgogICAgICAuaGVhcnRzdmcgcGF0aCB7CiAgICAgICAgc3Ryb2tlOiAjZmZmOwogICAgICB9CiAgCiAgICAgIGEjbWVudSwgYSNmaWx0ZXItbGlrZXMgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbi10b3A6IC0uM2VtOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgIH0KCiAgICAgIGEjbWVudSB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgcGFkZGluZzogMCAuM2VtIDAgLjVlbTsKICAgICAgICBoZWlnaHQ6IDIuMWVtOwogICAgICB9CiAgICAgIAogICAgICBhI2ZpbHRlci1saWtlcyB7CiAgICAgICAgcGFkZGluZzogLjJlbTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgd2lkdGg6IDEuNWVtOwogICAgICAgIGhlaWdodDogMS41ZW07CiAgICAgICAgbWFyZ2luOiAuMWVtIC41ZW07CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CiAgICAgIAogICAgICBhI2ZpbHRlci1saWtlcyBzdmcgewogICAgICAgIHdpZHRoOiAxLjVlbTsKICAgICAgICBoZWlnaHQ6IDEuNWVtOwogICAgICB9CiAgICAgICAKICAgICAgLm1lbnVzdmcgewogICAgICAgIHdpZHRoOiAyZW07CiAgICAgICAgaGVpZ2h0OiAyZW07CiAgICAgIH0KCiAgICAgIC5tZW51c3ZnIHBhdGggewogICAgICAgIGZpbGw6ICNmZmY7CiAgICAgIH0KICAgIAogICAgICAjbWVudS1jb250ZW50LCAjbWVudS1jb250ZW50ICogewogICAgICAgIG92ZXJzY3JvbGwtYmVoYXZpb3IteTogY29udGFpbjsKICAgICAgfQogICAgICAKICAgICAgI21lbnUtY29udGVudCB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBtYXJnaW4tbGVmdDogLTE4ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzIyMjsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgei1pbmRleDogMzsgCiAgICAgICAgb3ZlcmZsb3c6IHNjcm9sbDsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudC5vcGVuIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgewogICAgICAgIHBhZGRpbmc6IDAgMWVtIDFlbSAxZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIGEsCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgcGFkZGluZzogLjVlbSAuN2VtOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHotaW5kZXg6IDM7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIG9wYWNpdHk6IC41OwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5Lm9wZW4gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIAogICAgICBzdmcsIAogICAgICBpbWcsIAogICAgICAudmlkZW8gdmlkZW8gewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAjdGVtcGxhdGUgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGRpdiBpZD0idGVtcGxhdGUiPgogICAgICA8c3ZnIGNsYXNzPSJoZWFydHN2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KICAgICAgICA8cGF0aCBkPSJNOS43MTksMTcuMDczbC02LjU2Mi02LjUxYy0wLjI3LTAuMjY4LTAuNTA0LTAuNTY3LTAuNjk2LTAuODg4QzEuMzg1LDcuODksMS42Nyw1LjYxMywzLjE1NSw0LjE0YzAuODY0LTAuODU2LDIuMDEyLTEuMzI5LDMuMjMzLTEuMzI5YzEuOTI0LDAsMy4xMTUsMS4xMiwzLjYxMiwxLjc1MmMwLjQ5OS0wLjYzNCwxLjY4OS0xLjc1MiwzLjYxMi0xLjc1MmMxLjIyMSwwLDIuMzY5LDAuNDcyLDMuMjMzLDEuMzI5YzEuNDg0LDEuNDczLDEuNzcxLDMuNzUsMC42OTMsNS41MzdjLTAuMTksMC4zMi0wLjQyNSwwLjYxOC0wLjY5NSwwLjg4N2wtNi41NjIsNi41MUMxMC4xMjUsMTcuMjI5LDkuODc1LDE3LjIyOSw5LjcxOSwxNy4wNzMgTTYuMzg4LDMuNjFDNS4zNzksMy42MSw0LjQzMSw0LDMuNzE3LDQuNzA3QzIuNDk1LDUuOTIsMi4yNTksNy43OTQsMy4xNDUsOS4yNjVjMC4xNTgsMC4yNjUsMC4zNTEsMC41MSwwLjU3NCwwLjczMUwxMCwxNi4yMjhsNi4yODEtNi4yMzJjMC4yMjQtMC4yMjEsMC40MTYtMC40NjYsMC41NzMtMC43MjljMC44ODctMS40NzIsMC42NTEtMy4zNDYtMC41NzEtNC41NkMxNS41Nyw0LDE0LjYyMSwzLjYxLDEzLjYxMiwzLjYxYy0xLjQzLDAtMi42MzksMC43ODYtMy4yNjgsMS44NjNjLTAuMTU0LDAuMjY0LTAuNTM2LDAuMjY0LTAuNjksMEM5LjAyOSw0LjM5Nyw3LjgyLDMuNjEsNi4zODgsMy42MSI+PC9wYXRoPgogICAgICA8L3N2Zz4KICAgICAgPGRpdiBpZD0iY29sc2NzcyI+CiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyA+IGEsIAogICAgICAuY29scyR7Y29sc30gI3BpY3MgaW1nLAogICAgICAuY29scyR7Y29sc30gI3BpY3MgLmZpbGUsCiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyAudmlkZW8tY29udGFpbmVyIHsKICAgICAgICB3aWR0aDogY2FsYygxMDB2dyAvICR7Y29sc30pOwogICAgICB9CgogICAgICAuY29scyR7Y29sc30gI3BpY3MgPiBhLAogICAgICAuY29scyR7Y29sc30gI3BpY3MgPiAuZmlsZSwKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzID4gLnZpZGVvLWNvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiBjYWxjKDEwMHZ3IC8gJHtjb2xzfSk7CiAgICAgIH0KICAgICAgCiAgICAgIC5jb2xzJHtjb2xzfSAucXVlcnksCiAgICAgIC5jb2xzJHtjb2xzfSAubGlrZSB7CiAgICAgICAgZm9udC1zaXplOiBtaW4oMTR2dyAqICgxIC8gJHtjb2xzfSksIDZlbSAqICgxIC8gJHtjb2xzfSkpCiAgICAgIH0KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9Im1lZGlhLWZvb3RlciI+CiAgICAgIDxhIGlkPSJwaWMtbGlrZSIgY2xhc3M9Imxpa2UiIGhyZWY9IiMiPjwvYT4KICAgICAgPGEgaWQ9InBpYy1xdWVyeSIgaHJlZj0iIyI+PC9hPgogICAgICA8YSBpZD0icGljLXVzZXIiIGhyZWY9IiMiPjwvYT4KICAgIDwvZGl2PgogICAgPGNlbnRlciBpZD0ibWVkaWEtY29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0icGljLWNvbnRhaW5lciI+CiAgICAgICAgPGltZyBpZD0icGljIi8+CiAgICAgIDwvZGl2PgogICAgPC9jZW50ZXI+CiAgICA8ZGl2IGlkPSJtZW51LW92ZXJsYXkiPjwvZGl2PgogICAgPGRpdiBpZD0ibWVudS1jb250ZW50IiBjbGFzcz0idGVzdCI+CiAgICAgIDxkaXYgY2xhc3M9Iml0ZW1zIj4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+YXV0b3BsYXk6PC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJvbiIgaHJlZj0iIyI+b248L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJvZmYiIGhyZWY9IiMiPm9mZjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0YXV0b3BsYXkiIGRhdGEtYXV0b3BsYXk9ImhvdmVyIiBocmVmPSIjIj5tb3VzZW92ZXI8L2E+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmNvbHM6PC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMSIgaHJlZj0iIyI+MTwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSIyIiBocmVmPSIjIj4yPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjQiIGhyZWY9IiMiPjQ8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iNiIgaHJlZj0iIyI+NjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSIxMCIgaHJlZj0iIyI+MTA8L2E+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmNvbm5lY3Rpb25zOjwvZGl2PgogICAgICAgIDxkaXYgaWQ9ImNvbm5jb3VudCI+MDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5yZWxheXM6PC9kaXY+CiAgICAgICAgPHA+UGxlYXNlIHVzZSByZWxheXMgd2l0aCBOSVAtNTAgKHNlYXJjaCkgZnVuY3Rpb25hbGl0eTwvcD4KICAgICAgICA8Zm9ybSBhY3Rpb249IiMiIGlkPSJyZWxheXMtZm9ybSI+CiAgICAgICAgICA8dGV4dGFyZWEgaWQ9InJlbGF5cyI+PC90ZXh0YXJlYT4KICAgICAgICAgIDxpbnB1dCBjbGFzcz0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJzYXZlIHJlbGF5cyIvPgogICAgICAgIDwvZm9ybT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+cHJpdmF0ZSBrZXk6PC9kaXY+CiAgICAgICAgPHA+SWYgeW91IGNhbnQgdXNlIGJyb3dzZXIgYWRkb24gKG1vYmlsZSk8L3A+CiAgICAgICAgPGZvcm0gYWN0aW9uPSIjIiBpZD0icHJpdmtleS1mb3JtIj4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icHJpdmtleSIvPgogICAgICAgICAgPGlucHV0IGNsYXNzPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9InNhdmUga2V5Ii8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5sb2dzOjwvZGl2PgogICAgICAgIDxkaXYgaWQ9ImxvZ3MiPjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5jb250ZW50IGVycm9yczo8L2Rpdj4KICAgICAgICA8YSBjbGFzcz0ic2V0c2hvd2Vycm9ycyIgZGF0YS1zaG93ZXJyb3JzPSJvbiIgaHJlZj0iIyI+b248L2E+CiAgICAgICAgPGEgY2xhc3M9InNldHNob3dlcnJvcnMiIGRhdGEtc2hvd2Vycm9ycz0ib2ZmIiBocmVmPSIjIj5vZmY8L2E+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmxhdGVzdCByZWxlYXNlOjwvZGl2PgogICAgICAgIDxhIGlkPSJyZWxlYXNlIiBocmVmPSIjIj48L2E+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJoZWFkZXIiPgogICAgICA8c3BhbiBpZD0iY29udHJvbGluZm8iPmNvbnRyb2xzOiBhcnJvd3MsIGVudGVyLCBlc2M8L3NwYW4+CiAgICAgIDxhIGlkPSJmaWx0ZXItbGlrZXMiIGhyZWY9IiMiPjwvYT4KICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxhIGlkPSJtZW51IiBocmVmPSIjIj4KICAgICAgICAgIDxzdmcgY2xhc3M9Im1lbnVzdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJICAgICAgICA8cGF0aCBkPSJNMTAsMS40NDVjLTQuNzI2LDAtOC41NTUsMy44MjktOC41NTUsOC41NTVjMCw0LjcyNSwzLjgyOSw4LjU1NSw4LjU1NSw4LjU1NWM0LjcyNSwwLDguNTU1LTMuODMsOC41NTUtOC41NTVDMTguNTU1LDUuMjc0LDE0LjcyNSwxLjQ0NSwxMCwxLjQ0NSBNMTAsMTcuNjU0Yy00LjIyMSwwLTcuNjU0LTMuNDM0LTcuNjU0LTcuNjU0YzAtNC4yMjEsMy40MzMtNy42NTQsNy42NTQtNy42NTRjNC4yMjIsMCw3LjY1NCwzLjQzMyw3LjY1NCw3LjY1NEMxNy42NTQsMTQuMjIxLDE0LjIyMiwxNy42NTQsMTAsMTcuNjU0IE0xNC4zOSwxMGMwLDAuMjQ4LTAuMjAzLDAuNDUtMC40NSwwLjQ1SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMy0wLjQ1LTAuNDVzMC4yMDMtMC40NSwwLjQ1LTAuNDVoNy44NzlDMTQuMTg3LDkuNTUsMTQuMzksOS43NTIsMTQuMzksMTAgTTE0LjM5LDEyLjcwMmMwLDAuMjQ3LTAuMjAzLDAuNDQ5LTAuNDUsMC40NDlINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAyLTAuNDUtMC40NDljMC0wLjI0OCwwLjIwMy0wLjQ1MSwwLjQ1LTAuNDUxaDcuODc5QzE0LjE4NywxMi4yNTEsMTQuMzksMTIuNDU0LDE0LjM5LDEyLjcwMiBNMTQuMzksNy4yOThjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw2Ljg0OCwxNC4zOSw3LjA1MSwxNC4zOSw3LjI5OCI+PC9wYXRoPgoJICAgICAgICA8L3N2Zz4KICAgICAgICA8L2E+CiAgICAgICAgPGEgaWQ9InRpdGxlIiBocmVmPSIjIj5maWxlcy5odG1sPC9hPgogICAgICAgIDxmb3JtIGlkPSJxdWVyeS1mb3JtIiBhY3Rpb249IiMiPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJxdWVyeSIgbmFtZT0icXVlcnkiIGlkPSIiIC8+CiAgICAgICAgICA8c2VsZWN0IGlkPSJxdWVyeS10eXBlIj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iYWxsIj5hbGw8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaW1hZ2UiPmltYWdlczwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ2aWRlbyI+dmlkZW9zPC9vcHRpb24+CiAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgIDxpbnB1dCBpZD0iZ28iIHR5cGU9InN1Ym1pdCIgdmFsdWU9ImdvIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxzcGFuIGlkPSJxdWVyeWRpc3BsYXkiPgogICAgICAgICAgPHNwYW4gY2xhc3M9InRleHQiPjwvc3Bhbj4KICAgICAgICA8L3NwYW4+CiAgICAgICAgPGRpdiBpZD0ibG9hZGluZyI+dXBkYXRpbmc8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9InBpY3MiPjwvZGl2PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vdW5wa2cuY29tL25vc3RyLXRvb2xzL2xpYi9ub3N0ci5idW5kbGUuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vc2xvd2xpLmdpdGh1Yi5pby9iZWNoMzItYnVmZmVyL2Fzc2V0cy9qcy9iZWNoMzItYnVmZmVyLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0PgogICAgICBjb25zdCB1cGRhdGVzcHVia2V5ID0gImFlNWM2ZTBiNzQ2NjBkMjE5NGM4MjU0YjVjMmM4MjU2NzY1NzZiZTAyOTczNzlmYTIwNTIzMTE0YTZhODVlODciCiAgICAgIGNvbnN0IHF1ZXJpZXMgPSB7CiAgICAgICAgImdsb2JhbCI6ICdbIlJFUSIsIjxJPiIseyJjYWNoZSI6WyJleHBsb3JlIix7InRpbWVmcmFtZSI6ImxhdGVzdCIsInNjb3BlIjoiZ2xvYmFsIiwibGltaXQiOjxMPn1dfV0nLCAKICAgICAgICAiYXV0aG9yIjogJ1siUkVRIiwiPEk+Iix7ImtpbmRzIjpbMV0sImF1dGhvcnMiOlsiPFA+Il19XScsCiAgICAgICAgInJlYWN0aW9ucyI6ICdbIlJFUSIsIjxJPiIsIHsia2luZHMiOls3XSwiI2UiOiA8RT59XScKICAgICAgfQogICAgICBxcygiI3JlbGF5cyIpLnZhbHVlID0gcmVsYXlzKCkuam9pbigiXG4iKQogICAgICBxcygiI3ByaXZrZXkiKS52YWx1ZSA9IHByaXZrZXkoKQogICAgICBjb25zdCBjb2xvcHRzID0gWzEsIDIsIDQsIDYsIDEwXQoKICAgICAgY29scyA9ICgpID0+IHBhcnNlSW50KHNldHRpbmcoImNvbHMiLCBjb2xvcHRzWzFdKSwgMTApCiAgICAgIGF1dG9wbGF5ID0gKCkgPT4gc2V0dGluZygiYXV0b3BsYXkiLCAib2ZmIikKICAgICAgbGltaXQgPSAoKSA9PiBwYXJzZUludChzZXR0aW5nKCJsaW1pdCIsIDE1KSwgMTApCiAgICAgIHNob3dlcnJvcnMgPSAoKSA9PiBzZXR0aW5nKCJzaG93ZXJyb3JzIiwgIm9mZiIpCiAgICAgIAogICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgY29scygpKQogICAgICAKICAgICAgbGV0IHByb3RvY29sID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlLykgPyAibm9zdHI6IiA6ICJ3ZWIrbm9zdHI6IgogICAgICBsZXQgc29ja2V0cyA9IFtdCiAgICAgIGxldCByZXNoYW5kbGVycyA9IFtdCiAgICAgIGxldCB1cmxzID0gW10KICAgICAgbGV0IGxpa2VzID0gW10KICAgICAgbGV0IG5ld2xpa2VzID0gW10KICAgICAgbGV0IHJlYWN0ZWQgPSBbXQogICAgICBsZXQgaWRjb3VudGVyID0gMAogICAgICBsZXQgcXVlcnl3YWl0ID0gbnVsbAogICAgICBsZXQgcHJpbWFsc29ja2V0ID0gbnVsbAogICAgICBsZXQgdHlwZXMgPSB7CiAgICAgICAgaW1hZ2U6IFsicG5nIiwgImpwZyIsICJqcGVnIiwgIndlYnAiXSwKICAgICAgICB2aWRlbzogWyJtcDQiLCAid2VibSJdCiAgICAgIH0KICAgICAgbGV0IGltZ3JlZ2V4ID0gL2h0dHAofHMpXDpcL1wvW14gXG5dKj9cLihwbmd8anBnfGpwZWd8d2VicCkvZ2kKICAgICAgbGV0IHZpZGVvcmVnZXggPSAvaHR0cCh8cylcOlwvXC9bXiBcbl0qP1wuKG1wNHx3ZWJtKS9naQogICAgICBsZXQgdmlkZW9leHRyZWdleCA9IC9cLihtcDR8d2VibSkkL2kKICAgICAgbGV0IGltZ2V4dHJlZ2V4ID0gL1wuKHBuZ3xqcGd8anBlZ3x3ZWJwKSQvaQogICAgICB3YWl0bXMgPSA1MDAwCiAgICAgIHF1ZXJ5c3RyID0gIiIKICAgICAgbGFzdHF1ZXJ5c3RyID0gIiIKICAgICAgbGFzdHF1ZXJ5dHlwZSA9ICIiCiAgICAgIGxldCBxdWVyeWNvdW50ID0gMAogICAgICBsZXQgaG92ZXJlZHZpZGVvID0gbnVsbAogICAgICAKICAgICAgdXBkYXRlcXVlcnkoKQogICAgICBxcygiI3BpYy1saWtlIikuaW5uZXJIVE1MID0gcXMoIiNmaWx0ZXItbGlrZXMiKS5pbm5lckhUTUwgPSBxcygiI3RlbXBsYXRlIC5oZWFydHN2ZyIpLm91dGVySFRNTAogICAgICBzZXRhY3RpdmUoInNldGNvbHMiLCAiY29scyIsIGNvbHMoKSkKICAgICAgc2V0YWN0aXZlKCJzZXRhdXRvcGxheSIsICJhdXRvcGxheSIsIGF1dG9wbGF5KCkpCiAgICAgIHNldGFjdGl2ZSgic2V0c2hvd2Vycm9ycyIsICJzaG93ZXJyb3JzIiwgc2hvd2Vycm9ycygpKQogICAgICAKICAgICAgZnVuY3Rpb24gZnJvbUhleFN0cmluZyhzdHIpewogICAgICAgIGxldCBidWZmZXIgPSBuZXcgVWludDhBcnJheShzdHIubGVuZ3RoIC8gMikKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlci5sZW5ndGg7IGkrKykgewogICAgICAgICAgYnVmZmVyW2ldID0gcGFyc2VJbnQoc3RyLnN1YnN0cigyICogaSwgMiksIDE2KQogICAgICAgIH0KICAgICAgICByZXR1cm4gYnVmZmVyCiAgICAgIH0KICAKICAgICAgZnVuY3Rpb24gcmVsYXlzKCl7CiAgICAgICAgY29uc3Qgb2JqID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgicmVsYXlzIikpCiAgICAgICAgY29uc3QgciA9IG9iaiAmJiBvYmouZmlsdGVyKHIgPT4gci5tYXRjaCgvd3NzOlwvXC8uKy8pKSB8fCBbXQogICAgICAgIAogICAgICAgIHJldHVybiByLmxlbmd0aCA+IDAgJiYgciB8fCBbCiAgICAgICAgICAid3NzOi8vcmVsYXkubm9zdHIuYmFuZCIsCiAgICAgICAgICAid3NzOi8vbmIucmVsYXkuY2VudGVyIiwgCiAgICAgICAgICAid3NzOi8vbm9zdHIuY29tcGlsZS1lcnJvci5uZXQiCiAgICAgICAgXQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBwcml2a2V5KCl7CiAgICAgICAgbGV0IGtleSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJwcml2a2V5IikgfHwgIiIKICAgICAgICAKICAgICAgICBpZihrZXkubGVuZ3RoID09IDYzKXsKICAgICAgICAgIGtleSA9IE5vc3RyVG9vbHMubmlwMTkuZGVjb2RlKGtleSkuZGF0YQogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4ga2V5Lmxlbmd0aCA9PSA2NCAmJiBrZXkgfHwgbnVsbAogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzZXR0aW5nKGtleSwgZGVmYXVsdHZhbHVlKXsKICAgICAgICBjb25zdCB2ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KQogICAgICAgIHJldHVybiB2ICYmIG9wdGlvbigic2V0IiArIGtleSwga2V5LCB2KSAmJiB2IHx8IGRlZmF1bHR2YWx1ZQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBvcHRpb24oYywga2V5LCB2YWwpewogICAgICAgIHJldHVybiBxcygiLiIgKyBjICsgIltkYXRhLSIgKyBrZXkgKyAiPSciICsgdmFsICsgIiddIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXMocSl7CiAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXNhKHEpewogICAgICAgIHJldHVybiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocSkpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGdpZChpKXsKICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXVlcnl0eXBlKCl7CiAgICAgICAgcmV0dXJuIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlIHx8ICJhbGwiCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZXF1ZXJ5KCl7CiAgICAgICAgbGV0IHBhcnRzID0gZGVjb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpKS5zcGxpdCgiLyIpCiAgICAgICAgcXVlcnlzdHIgPSBxcygiI3F1ZXJ5ZGlzcGxheSAudGV4dCIpLmlubmVyVGV4dCA9IHBhcnRzWzBdCiAgICAgICAgcXMoIiNxdWVyeSIpLnZhbHVlID0gcGFydHNbMF0KICAgICAgICBxcygiI3F1ZXJ5LXR5cGUiKS52YWx1ZSA9IHBhcnRzWzFdIHx8ICJhbGwiCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGFjdGl2ZSgpewogICAgICAgIHJldHVybiBxcygiI3BpY3MgLmFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHBpY29mZnNldChvZmZzZXQpewogICAgICAgIGNvbnN0IHBpY3MgPSBxc2EoIiNwaWNzID4gLml0ZW0iKS5maWx0ZXIoZSA9PiBlLnN0eWxlLmRpc3BsYXkgPT0gImJsb2NrIikKICAgICAgICByZXR1cm4gcGljc1twaWNzLmluZGV4T2YoYWN0aXZlKCkpK29mZnNldF0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gbGFzdGFjdGl2ZSgpewogICAgICAgIHJldHVybiBxc2EoIiNwaWNzIC5hY3RpdmUiKS5wb3AoKSAgICAgIAogICAgICB9CgogICAgICBmdW5jdGlvbiBtZW51KCl7CiAgICAgICAgcXNhKCIjbWVudS1jb250ZW50LCAjbWVudS1vdmVybGF5IikuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnRvZ2dsZSgib3BlbiIpKQogICAgICB9CiAgCiAgICAgIGZ1bmN0aW9uIHNldGFjdGl2ZShjLCBrZXksIHZhbCl7CiAgICAgICAgcXNhKCIuIiArIGMpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpKQogICAgICAgIGNvbnN0IG9wdGlvbiA9IHFzKCIuIiArIGMgKyAiW2RhdGEtIiArIGtleSArICI9JyIgKyB2YWwgKyAiJ10iKQogICAgICAgIG9wdGlvbj8uY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlYWxsdmlkZW9wbGF5KCl7CiAgICAgICAgcXNhKCIjcGljcyB2aWRlbyIpLmZvckVhY2goYXN5bmMgdiA9PiB1cGRhdGV2aWRlb3BsYXkodikpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZXZpZGVvcGxheSh2KXsKICAgICAgICBjb25zdCBhcGxheSA9IGF1dG9wbGF5KCkKICAgICAgICAKICAgICAgICBpZihhcGxheSAhPSAib24iKXsKICAgICAgICAgIHYubXV0ZWQgPSBmYWxzZQogICAgICAgICAgdi5wYXVzZSgpCiAgICAgICAgfWVsc2V7CiAgICAgICAgICB2Lm11dGVkID0gdHJ1ZQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBuID0gdi5wYXJlbnRFbGVtZW50CiAgICAgICAgCiAgICAgICAgaWYoKG4ub2Zmc2V0VG9wICsgbi5vZmZzZXRIZWlnaHQpIDwgc2Nyb2xsWSAKICAgICAgICB8fCBuLm9mZnNldFRvcCA+IChzY3JvbGxZICsgdmlzdWFsVmlld3BvcnQuaGVpZ2h0KSl7CiAgICAgICAgICBpZih2LnJlYWR5U3RhdGUgPT0gNCl7CiAgICAgICAgICAgIHYucGF1c2UoKQogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIHYucHJlbG9hZCA9ICJub25lIgogICAgICAgICAgfQogICAgICAgIH1lbHNlIGlmKHYucmVhZHlTdGF0ZSAhPSA0KXsKICAgICAgICAgIHYucHJlbG9hZCA9ICJhdXRvIgogICAgICAgIH0KICAgICAgICBlbHNlIGlmKGFwbGF5ID09ICJvbiIgfHwgKGFwbGF5ID09ICJob3ZlciIgJiYgdiA9PSBob3ZlcmVkdmlkZW8pKXsKICAgICAgICAgIHYucGxheSgpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLCBlID0+IHsKICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpCiAgICAgICAgdXBkYXRlYWxsdmlkZW9wbGF5KCkKICAgICAgfSkKICAgICAgCiAgICAgIGxldCB0b3VjaCA9IG51bGwKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCBlID0+IHsKICAgICAgICB0b3VjaCA9IGUuY2hhbmdlZFRvdWNoZXNbMF0KICAgICAgfSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIiwgZSA9PiB7CiAgICAgICAgY29uc3QgeGRpZmYgPSBlLmNoYW5nZWRUb3VjaGVzWzBdLnNjcmVlblggLSB0b3VjaC5zY3JlZW5YCiAgICAgICAgY29uc3QgeWRpZmYgPSBlLmNoYW5nZWRUb3VjaGVzWzBdLnNjcmVlblkgLSB0b3VjaC5zY3JlZW5ZCiAgICAgICAgCiAgICAgICAgaWYoeGRpZmYgPCAtNTApewogICAgICAgICAgbmV4dCgpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKHhkaWZmID4gNTApewogICAgICAgICAgcHJldigpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgcXMoIiNxdWVyeS1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgbG9jYXRpb24uaGFzaCA9ICIjIiArIGVuY29kZVVSSUNvbXBvbmVudChxcygiI3F1ZXJ5IikudmFsdWUgKyAiLyIgKyBxdWVyeXR5cGUoKSkKICAgICAgICB1cGRhdGVxdWVyeSgpCiAgICAgICAgcXVlcnl3YWl0LnJlc29sdmUoKQogICAgICB9KQoKICAgICAgcXMoIiNyZWxheXMtZm9ybSIpLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsIGFzeW5jIGUgPT4gewogICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIGxldCByID0gSlNPTi5zdHJpbmdpZnkocXMoIiNyZWxheXMiKS52YWx1ZS5zcGxpdCgiXG4iKSkKICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgicmVsYXlzIiwgcikKICAgICAgICBkaXNjb25uZWN0KCkKICAgICAgfSkKCiAgICAgIHFzKCIjcHJpdmtleS1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgYXN5bmMgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgY29uc3Qga2V5ID0gcXMoIiNwcml2a2V5IikudmFsdWUKCiAgICAgICAgaWYoa2V5Lmxlbmd0aCAhPSA2NCAmJiBrZXkubGVuZ3RoICE9IDYzKXsKICAgICAgICAgIGFsZXJ0KCJrZXkgc2hvdWxkIGJlIDYzIG9yIDY0IGNoYXJhY3RlcnMgbG9uZyIpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oInByaXZrZXkiLCBrZXkpCiAgICAgICAgYWxlcnQoImtleSBzYXZlZCIpCiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLCBhc3luYyAoZSkgPT4gewogICAgICAgIGlmKGF1dG9wbGF5KCkgPT0gImhvdmVyIiAmJiBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInZpZGVvLWNvbnRhaW5lciIpKXsKICAgICAgICAgIGhvdmVyZWR2aWRlbyA9IGUudGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAgIGhvdmVyZWR2aWRlby5wbGF5KCkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaG92ZXJlZHZpZGVvID0gZmFsc2UKICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLnN0eWxlLmRpc3BsYXkgIT0gImJsb2NrIiAmJiBhdXRvcGxheSgpID09ICJob3ZlciIgJiYgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2aWRlby1jb250YWluZXIiKSl7CiAgICAgICAgICBxc2EoInZpZGVvIikuZm9yRWFjaCh2ID0+IHYucGF1c2UoKSkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaWYoZS50YXJnZXQudHlwZSA9PSAic3VibWl0IiB8fCAoZS50YXJnZXQudGFnTmFtZSA9PSAiQSIgJiYgZS50YXJnZXQuaHJlZi5tYXRjaCgvXih8d2ViXCspbm9zdHJcOi8pKSl7CiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAidGl0bGUiKXsKICAgICAgICAgIHFzKCIjcXVlcnkiKS52YWx1ZSA9ICIiCiAgICAgICAgICBxcygiI3F1ZXJ5LXR5cGUiKS52YWx1ZSA9ICJhbGwiCiAgICAgICAgICBxcygiI2dvIikuY2xpY2soKQogICAgICAgIH0KCiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJmaWx0ZXItbGlrZXMiKXsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnRvZ2dsZSgiZmlsdGVyLWxpa2VzIikKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKSl7CiAgICAgICAgICBhY3RpdmUoKT8uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIGdpZChlLnRhcmdldC5pZCkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIHNob3coZS50YXJnZXQuaWQpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS50YXJnZXQudGFnTmFtZSAhPSAiQSIgJiYgKHFzKCIjcGljLWNvbnRhaW5lciIpID09IGUudGFyZ2V0IHx8IHFzKCIjbWVkaWEtY29udGFpbmVyIHZpZGVvIikgPT0gZS50YXJnZXQpKXsKICAgICAgICAgIGhpZGVtZWRpYSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJtZW51IiB8fCBlLnRhcmdldC5pZCA9PSAibWVudS1vdmVybGF5Iil7CiAgICAgICAgICBtZW51KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRjb2xzIikpewogICAgICAgICAgZm9yKGxldCBjIG9mIGNvbG9wdHMpewogICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoImNvbHMiICsgYykKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJjb2xzIiArIGUudGFyZ2V0LmRhdGFzZXQuY29scykKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJjb2xzIiwgZS50YXJnZXQuZGF0YXNldC5jb2xzKQogICAgICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRhdXRvcGxheSIpKXsKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJhdXRvcGxheSIsIGUudGFyZ2V0LmRhdGFzZXQuYXV0b3BsYXkpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGF1dG9wbGF5IiwgImF1dG9wbGF5IiwgYXV0b3BsYXkoKSkKICAgICAgICAgIHVwZGF0ZWFsbHZpZGVvcGxheSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2V0c2hvd2Vycm9ycyIpKXsKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJzaG93ZXJyb3JzIiwgZS50YXJnZXQuZGF0YXNldC5zaG93ZXJyb3JzKQogICAgICAgICAgc2V0YWN0aXZlKCJzZXRzaG93ZXJyb3JzIiwgInNob3dlcnJvcnMiLCBzaG93ZXJyb3JzKCkpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJsaWtlIikpewogICAgICAgICAgbGlrZShlLnRhcmdldCkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBmdW5jdGlvbiBoYXNrZXkoKXsKICAgICAgICByZXR1cm4gd2luZG93Lm5vc3RyIHx8IHByaXZrZXkoKQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBwdWJrZXkoKXsKICAgICAgICByZXR1cm4gd2luZG93Lm5vc3RyICYmIGF3YWl0IHdpbmRvdy5ub3N0ci5nZXRQdWJsaWNLZXkoKSB8fCBOb3N0clRvb2xzLmdldFB1YmxpY0tleShwcml2a2V5KCkpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHNpZ24oZXZlbnQpewogICAgICAgIGlmKHdpbmRvdy5ub3N0cil7CiAgICAgICAgICByZXR1cm4gYXdhaXQgbm9zdHIuc2lnbkV2ZW50KGV2ZW50KQogICAgICAgIH0KICAgICAgICAKICAgICAgICBldmVudC5zaWcgPSBOb3N0clRvb2xzLmdldFNpZ25hdHVyZShldmVudCwgcHJpdmtleSgpKQogICAgICAgIHJldHVybiBldmVudAogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBsaWtlKGxpbmspewogICAgICAgIGNvbnN0IGV2ZW50ID0gbGluay5wYXJlbnRFbGVtZW50WyJkYXRhLWV2ZW50Il0KICAgICAgICBjb25zdCBwdWJrID0gYXdhaXQgcHVia2V5KCkKICAgICAgICBjb25zdCBsaWtlID0gYXdhaXQgc2lnbih7CiAgICAgICAgICAia2luZCI6IDcsCiAgICAgICAgICAiY29udGVudCI6ICIrIiwKICAgICAgICAgICJ0YWdzIjogWwogICAgICAgICAgICBbImUiLCBldmVudC5pZF0sCiAgICAgICAgICAgIFsicCIsIGV2ZW50LnB1YmtleV0KICAgICAgICAgIF0sCiAgICAgICAgICAicHVia2V5IjogcHViaywKICAgICAgICAgICJjcmVhdGVkX2F0IjogcGFyc2VJbnQoRGF0ZS5ub3coKSAvIDEwMDAgLCAxMCkKICAgICAgICB9KQogICAgICAgIAogICAgICAgIGNvbnN0IGxpa2Vqc29uID0gSlNPTi5zdHJpbmdpZnkoWyJFVkVOVCIsIGxpa2VdKQogICAgICAgIHNvY2tldHMuZm9yRWFjaChzID0+IHMuc2VuZChsaWtlanNvbikpCiAgICAgICAgY29uc29sZS5sb2coInNlbnQgbGlrZSIsIGxpa2Vqc29uKSAKICAgICAgICBsaW5rLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQoKICAgICAgICBjb25zdCBwaWNpZCA9IGxpbmtbImRhdGEtaXRlbS1pZCJdIHx8IGxpbmsuZGF0YXNldC5waWNJZAogICAgICAgIAogICAgICAgIGlmKHBpY2lkKXsKICAgICAgICAgIGdpZChwaWNpZCkucXVlcnlTZWxlY3RvcigiLmxpa2UiKS5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICAgIHJlYWN0ZWQucHVzaChwaWNpZCkKICAgICAgICB9CiAgICAgIH0KICAgIAogICAgICBmdW5jdGlvbiBwcmV2KCl7CiAgICAgICAgaWYocGljb2Zmc2V0KC0xKSl7CiAgICAgICAgICBwaWNvZmZzZXQoLTEpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBsYXN0YWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIHVwZGF0ZXNob3coKQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gbmV4dCgpewogICAgICAgIGlmKHBpY29mZnNldCgxKSl7CiAgICAgICAgICBwaWNvZmZzZXQoMSkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICB1cGRhdGVzaG93KCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZXNob3coKXsKICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLnN0eWxlLmRpc3BsYXkgPT0gImJsb2NrIil7CiAgICAgICAgICBoaWRldmlkZW8oKQogICAgICAgICAgc2hvdyhhY3RpdmUoKS5pZCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBlID0+IHsKICAgICAgICBpZihbIlRhYiIsICJBcnJvd0xlZnQiLCAiQXJyb3dSaWdodCIsICJBcnJvd1VwIiwgIkFycm93RG93biJdLmluY2x1ZGVzKGUua2V5KSl7CiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJFc2NhcGUiKXsKICAgICAgICAgIG1lbnUoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUua2V5ID09ICJFbnRlciIgJiYgZS50YXJnZXQudGFnTmFtZSA9PSAiQk9EWSIpewogICAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5zdHlsZS5kaXNwbGF5ID09ICJibG9jayIpewogICAgICAgICAgICBoaWRlbWVkaWEoKQogICAgICAgICAgICByZXR1cm4KICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgc2hvdyhhY3RpdmUoKS5pZCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93VXAiICYmIHBpY29mZnNldCgtY29scygpKSl7CiAgICAgICAgICBwaWNvZmZzZXQoLWNvbHMoKSkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIGxhc3RhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgdXBkYXRlc2hvdygpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dEb3duIiAmJiBwaWNvZmZzZXQoY29scygpKSl7CiAgICAgICAgICBwaWNvZmZzZXQoY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgYWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIHVwZGF0ZXNob3coKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93TGVmdCIpewogICAgICAgICAgcHJldigpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dSaWdodCIpewogICAgICAgICAgbmV4dCgpCiAgICAgICAgfQogICAgICB9KQoKICAgICAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlcXVlcnlyZXMocmVzLCBzb2NrZXQsIHEsIHR5cGUsIHN0aW1lKXsKICAgICAgICBzYXZlKHNvY2tldCwgcmVzLCBxLCB0eXBlLCBmYWxzZSwgZmFsc2UpCiAgICAgICAgbG9nKCJxdWVyeSByZXMiLCByZXMubGVuZ3RoLCBzb2NrZXQudXJsKQogICAgICAgIHF1ZXJ5Y291bnQtLQogICAgICAgIGlmKHF1ZXJ5Y291bnQgPT0gMCl7CiAgICAgICAgICBxcygiI2xvYWRpbmciKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxldCB3YWl0ID0gd2FpdG1zIC0gKERhdGUubm93KCkgLSBzdGltZSkKICAgICAgICBxdWVyeXdhaXQgPSBzbGVlcCh3YWl0KQogICAgICAgIGF3YWl0IHF1ZXJ5d2FpdC5wcm9taXNlCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHByaW1hbGdsb2JhbChzb2NrZXQpewogICAgICAgIGxvZygiZ2xvYmFsIiwgc29ja2V0LnVybCkKICAgICAgICBxdWVyeWNvdW50KysKICAgICAgICBxcygiI2xvYWRpbmciKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgIGxldCBzdGltZSA9IERhdGUubm93KCkKICAgICAgICBsZXQgcWlkID0gImdsb2JhbF8iICsgKCsraWRjb3VudGVyKQogICAgICAgIGxldCBxaWRsaWtlcyA9ICJsaWtlc18iICsgKCsraWRjb3VudGVyKQoKICAgICAgICBpZihuZXdsaWtlcy5sZW5ndGggPiAwKXsKICAgICAgICAgIHByaW1hbHNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KFsKICAgICAgICAgICAgIlJFUSIsIAogICAgICAgICAgICBxaWRsaWtlcywgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiY2FjaGUiOiBbCiAgICAgICAgICAgICAgICAiZXZlbnRzIiwgewogICAgICAgICAgICAgICAgICAiZXZlbnRfaWRzIjogbmV3bGlrZXMKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0KICAgICAgICAgIF0pKQoKICAgICAgICAgIGNvbnN0IGxpa2VfZXZlbnRzID0gYXdhaXQgd2FpdHJlcyhxaWRsaWtlcykKICAgICAgICAgIG5ld2xpa2VzLnNwbGljZSgwKQogICAgICAgICAgCiAgICAgICAgICBhd2FpdCBzYXZlKHNvY2tldCwgbGlrZV9ldmVudHMsICIiLCAiYWxsIiwgdHJ1ZSwgdHJ1ZSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoWwogICAgICAgICAgIlJFUSIsIAogICAgICAgICAgcWlkLCAKICAgICAgICAgIHsKICAgICAgICAgICAgImNhY2hlIjogWwogICAgICAgICAgICAgICJleHBsb3JlIiwgCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInRpbWVmcmFtZSI6ICJsYXRlc3QiLAogICAgICAgICAgICAgICAgInNjb3BlIjogImdsb2JhbCIsCiAgICAgICAgICAgICAgICAibGltaXQiOiAyMAogICAgICAgICAgICAgIH0KICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0pKQogICAgICAgIAogICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHdhaXRyZXMocWlkKQogICAgICAgIGF3YWl0IGhhbmRsZXF1ZXJ5cmVzKHJlcy5maWx0ZXIoZSA9PiBlLmtpbmQgPT0gMSksIHNvY2tldCwgIiIsICJhbGwiLCBzdGltZSkKICAgICAgICBwcmltYWxnbG9iYWwoc29ja2V0KQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeShzb2NrZXQsIHByaW1hbCl7CiAgICAgICAgbG9nKCJxdWVyeSIsIHNvY2tldC51cmwpCiAgICAgICAgcXVlcnljb3VudCsrCiAgICAgICAgcXMoIiNsb2FkaW5nIikuc3R5bGUuZGlzcGxheSA9ICJibG9jayIKICAgICAgICAKICAgICAgICBsZXQgc3RpbWUgPSBEYXRlLm5vdygpCiAgICAgICAgbGV0IHEgPSBxdWVyeXN0ci50cmltKCkKICAgICAgICBsZXQgdHlwZSA9IHF1ZXJ5dHlwZSgpCiAgICAgICAgbGV0IGkgPSArK2lkY291bnRlcgogICAgICAgIGxldCBxaWQgPSAicXVlcnlfIiArIGkKICAgICAgICBsZXQgZmlsdGVycyA9IFtdCgogICAgICAgIGZpbHRlcnMucHVzaCguLi4odHlwZXNbdHlwZV0gfHwgW10pLm1hcCgodCkgPT4gewogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAga2luZHM6IFsxXSwgCiAgICAgICAgICAgIHNlYXJjaDogIi4iICsgdCwKICAgICAgICAgICAgbGltaXQ6IDIwCiAgICAgICAgICB9CiAgICAgICAgfSkpCiAgICAgICAgCiAgICAgICAgaWYocS5sZW5ndGggPiAwKXsKICAgICAgICAgIGZpbHRlcnMucHVzaCh7a2luZHM6IFsxXSwgc2VhcmNoOiBxfSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZmlsdGVycy5sZW5ndGggPT0gMCl7CiAgICAgICAgICBmaWx0ZXJzLnB1c2goe2tpbmRzOiBbMV19KQogICAgICAgIH0KICAgICAgICAKICAgICAgICAKICAgICAgICBjb25zdCBsaWtlc3JlcyA9IGF3YWl0IHF1ZXJ5bGlrZXMoc29ja2V0KQogICAgICAgIAogICAgICAgIGxpa2VzcmVzLmZvckVhY2goZXZlbnRpZCA9PiB7CiAgICAgICAgICBpZighbGlrZXMuaW5jbHVkZXMoZXZlbnRpZCkpewogICAgICAgICAgICBsaWtlcy5wdXNoKGV2ZW50aWQpCiAgICAgICAgICAgIG5ld2xpa2VzLnB1c2goZXZlbnRpZCkKICAgICAgICAgIH0KICAgICAgICB9KQogICAgICAgIAogICAgICAgIGNvbnN0IHNlYXJjaG9iaiA9IFsiUkVRIiwgcWlkLCAuLi5maWx0ZXJzXQogICAgICAgIGNvbnN0IHNlYXJjaGpzb24gPSBKU09OLnN0cmluZ2lmeShzZWFyY2hvYmopCiAgICAgICAgc29ja2V0LnNlbmQoc2VhcmNoanNvbikKICAgICAgICAKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB3YWl0cmVzKHFpZCkKICAgICAgICBhd2FpdCBoYW5kbGVxdWVyeXJlcyhyZXMsIHNvY2tldCwgcSwgdHlwZSwgc3RpbWUpCiAgICAgICAgcXVlcnkoc29ja2V0KQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeWxpa2VzKHNvY2tldCl7CiAgICAgICAgaWYoIWhhc2tleSgpKXsKICAgICAgICAgIHJldHVybiBbXQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBteXB1YmtleSA9IGF3YWl0IHB1YmtleSgpCiAgICAgICAgY29uc3QgZXZlbnRzID0gYXdhaXQgcXVlcnlldmVudHMoc29ja2V0LCBbN10sIG51bGwsIFtteXB1YmtleV0pCiAgICAgICAgcmV0dXJuIGV2ZW50cy5tYXAoZSA9PiBlLnRhZ3MuZmluZCh0ID0+IHRbMF0gPT0gImUiKVsxXSkKICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlldmVudHMoc29ja2V0LCBraW5kcywgZXZlbnRpZHMsIGF1dGhvcnMpewogICAgICAgIGNvbnN0IHF1ZXJ5aWQgPSAiZXZlbnRzXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgY29uc3QgZmlsdGVycyA9IHt9CiAgICAgICAgCiAgICAgICAgZmlsdGVycy5raW5kcyA9IGtpbmRzCiAgICAgICAgCiAgICAgICAgaWYoZXZlbnRpZHMpewogICAgICAgICAgZmlsdGVyc1siI2UiXSA9IGV2ZW50aWRzCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGF1dGhvcnMpewogICAgICAgICAgZmlsdGVyc1siYXV0aG9ycyJdID0gYXV0aG9ycwogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkoWwogICAgICAgICAgIlJFUSIsIAogICAgICAgICAgcXVlcnlpZCwgCiAgICAgICAgICBmaWx0ZXJzCiAgICAgICAgXSkKCiAgICAgICAgc29ja2V0LnNlbmQoanNvbikKICAgICAgICAKICAgICAgICByZXR1cm4gYXdhaXQgd2FpdHJlcyhxdWVyeWlkKSB8fCBbXQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeXB1YmtleShzb2NrZXQsIHB1YmspewogICAgICAgIGNvbnN0IHF1ZXJ5aWQgPSAicXVlcnlfIiArICgrK2lkY291bnRlcikKICAgICAgICBzb2NrZXQuc2VuZChxdWVyaWVzLmF1dGhvci5yZXBsYWNlKCI8ST4iLCBxdWVyeWlkKS5yZXBsYWNlKCI8UD4iLCBwdWJrKSkKCiAgICAgICAgcmV0dXJuIChhd2FpdCB3YWl0cmVzKHF1ZXJ5aWQpKQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBzYXZlKHNvY2tldCwgZXZlbnRkYiwgcSwgcXR5cGUsIHJlYWN0ZWQsIGFwcGVuZCl7CiAgICAgICAgbGV0IGV2ZW50cHVia2V5cyA9IFtdCiAgICAgICAgY29uc3QgZXZlbnRzID0gZXZlbnRkYi5maWx0ZXIobyA9PiB7CiAgICAgICAgICBpZihxLmxlbmd0aCA+IDApewogICAgICAgICAgICBmb3IobGV0IHdvcmQgb2YgcS5zcGxpdCgiICIpKXsKICAgICAgICAgICAgICBpZihvLmNvbnRlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKHdvcmQudG9Mb3dlckNhc2UoKSkgPT0gLTEpewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgcmV0dXJuIHRydWUKICAgICAgICB9KQogICAgICAgIAogICAgICAgIGxldCByZXN1bHRzID0gW10KICAgICAgICBjb25zdCBldmVudGlkcyA9IGV2ZW50cy5tYXAoZSA9PiBlLmlkKQogICAgICAgIGxldCBuZXd1cmxzID0gW10KICAgICAgICAKICAgICAgICBmb3IobGV0IGV2ZW50IG9mIGV2ZW50cyl7CiAgICAgICAgICBsZXQgdXJsc21hdGNoID0gW10KICAgICAgICAgIAogICAgICAgICAgaWYocXR5cGUgIT0gInZpZGVvIil7CiAgICAgICAgICAgIHVybHNtYXRjaC5wdXNoKC4uLihldmVudC5jb250ZW50Lm1hdGNoKGltZ3JlZ2V4KSB8fCBbXSkpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGlmKHF0eXBlICE9ICJpbWFnZSIpewogICAgICAgICAgICB1cmxzbWF0Y2gucHVzaCguLi4oZXZlbnQuY29udGVudC5tYXRjaCh2aWRlb3JlZ2V4KSB8fCBbXSkpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHVybHNtYXRjaCA9IHVybHNtYXRjaC5maWx0ZXIodXJsID0+ICF1cmxzLmluY2x1ZGVzKHVybCkpCgogICAgICAgICAgaWYodXJsc21hdGNoLmxlbmd0aCA+IDApewogICAgICAgICAgICBuZXd1cmxzLnB1c2goewogICAgICAgICAgICAgIGV2ZW50OiBldmVudCwKICAgICAgICAgICAgICB1cmxzOiB1cmxzbWF0Y2gKICAgICAgICAgICAgfSkKICAgICAgICAgICAgCiAgICAgICAgICAgIHVybHMucHVzaCguLi51cmxzbWF0Y2gpCiAgICAgICAgICAgIGV2ZW50cHVia2V5cy5pbmNsdWRlcyhldmVudC5wdWJrZXkpIHx8IGV2ZW50cHVia2V5cy5wdXNoKGV2ZW50LnB1YmtleSkKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbG9nKCJxdWVyeSBtZXRhIiwgc29ja2V0LnVybCkKICAgICAgICBsZXQgbWV0YWV2ZW50cyA9IGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzBdLCBudWxsLCBldmVudHB1YmtleXMpCiAgICAgICAgCiAgICAgICAgZm9yKGxldCBlbnRyeSBvZiBuZXd1cmxzKXsKICAgICAgICAgIGZvcihsZXQgdXJsIG9mIGVudHJ5LnVybHMpewogICAgICAgICAgICByZXN1bHRzLnB1c2goewogICAgICAgICAgICAgIHJlYWN0ZWQ6IHJlYWN0ZWQgfHwgbGlrZXMuaW5jbHVkZXMoZW50cnkuZXZlbnQuaWQpLCAKICAgICAgICAgICAgICB1cmw6IHVybCwgCiAgICAgICAgICAgICAgZXZlbnQ6IGVudHJ5LmV2ZW50LCAKICAgICAgICAgICAgICBiZWNoMzJpZDogYmVjaDMyLmVuY29kZSgibm90ZSIsIGZyb21IZXhTdHJpbmcoZW50cnkuZXZlbnQuaWQpKSwKICAgICAgICAgICAgICBtZXRhOiBtZXRhZXZlbnRzLmZpbmQobyA9PiBvLnB1YmtleSA9PSBlbnRyeS5ldmVudC5wdWJrZXkpCiAgICAgICAgICAgIH0pCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxvZygic2F2ZSByZXMiLCByZXN1bHRzLmxlbmd0aCwgc29ja2V0LnVybCkKICAgICAgICB1cGRhdGVjb250ZW50KHJlc3VsdHMsIHEsIGFwcGVuZCkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlY29udGVudChyZXN1bHRzLCBxLCBhcHBlbmQpewogICAgICAgIHJlc3VsdHMucmV2ZXJzZSgpLmZvckVhY2goaXRlbSA9PiB7CiAgICAgICAgICBjb25zdCB0eXBlID0gaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleCkgJiYgInZpZGVvIiB8fCAicGljIgogICAgICAgICAgY29uc3QgdGV4dCA9IChxIHx8ICJ2aWV3IG5vdGUiKS5zdWJzdHJpbmcoLTMwKQogICAgICAgICAgY29uc3QgaWQgPSAiaXRlbV8iICsgKCsraWRjb3VudGVyKQogICAgICAgICAgY29uc3QgY29udGVudGVsZW1lbnRzID0gJzxkaXYgY2xhc3M9InR5cGUiPicgKyB0eXBlICsgJzwvZGl2PjxhIGNsYXNzPSJsaWtlJyArIChpdGVtLnJlYWN0ZWQgPyAnIHJlYWN0ZWQnIDogJycpICsgJyIgZGF0YS1pdGVtLWlkPSInICsgaWQgKyAKICAgICAgICAgICAgJyIgaHJlZj0iIyI+JyArIHFzKCIjdGVtcGxhdGUgLmhlYXJ0c3ZnIikub3V0ZXJIVE1MICsgJzwvYT48YSBjbGFzcz0icXVlcnkiIGhyZWY9IicgKyBwcm90b2NvbCArIAogICAgICAgICAgICBpdGVtLmJlY2gzMmlkICsgJyI+JyArIHRleHQgKyAnPC9hPicKICAgICAgICAgIGxldCByb290ID0gbnVsbAogICAgICAgICAgbGV0IHYgPSBudWxsCiAgICAgICAgICAKICAgICAgICAgIGlmKGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpKXsKICAgICAgICAgICAgcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCiAgICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgidmlkZW8tY29udGFpbmVyIikKICAgICAgICAgICAgcm9vdC5pbm5lckhUTUwgPSBjb250ZW50ZWxlbWVudHMKICAgICAgICAgICAgCiAgICAgICAgICAgIHYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpCiAgICAgICAgICAgIHZbImRhdGEtaXRlbS1pZCJdID0gaWQKICAgICAgICAgICAgdi5wcmVsb2FkID0gIm5vbmUiCiAgICAgICAgICAgIHYubG9vcCA9IHRydWUKICAgICAgICAgICAgdi5wbGF5c2lubGluZSA9ICIiCiAgICAgICAgICAgIAogICAgICAgICAgICB2Lm9uY2FucGxheSA9IGFzeW5jIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIGNvbnN0IGFzcGVjdCA9IHRoaXMudmlkZW9XaWR0aCAvIHRoaXMudmlkZW9IZWlnaHQKICAgICAgICAgICAgICBpZihhc3BlY3QgPiAxKXsKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUud2lkdGggPSAoYXNwZWN0ICogMTAwKSArICIlIgogICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgdGhpcy5zdHlsZS5oZWlnaHQgPSAoMSAvIGFzcGVjdCAqIDEwMCkgKyAiJSIKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUubWFyZ2luVG9wID0gLSgoMSAvIGFzcGVjdCAqIDEwMCAtIDEwMCkgLyAyKSArICIlIgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAKICAgICAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkodGhpcykKICAgICAgICAgICAgICB0aGlzLnBhcmVudEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICJibG9jayIKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29uc3QgZXh0ID0gaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleClbMV0KICAgICAgICAgICAgdi5pbm5lckhUTUwgPSAnPHNvdXJjZSBzcmM9IicgKyBpdGVtLnVybCArICciIHR5cGU9InZpZGVvLycgKyBleHQgKyAnIj48L3NvdXJjZT4nCiAgCiAgICAgICAgICAgIGlmKHNob3dlcnJvcnMoKSA9PSAib24iKXsKICAgICAgICAgICAgICB2LnF1ZXJ5U2VsZWN0b3IoInNvdXJjZSIpLm9uZXJyb3IgPSBhc3luYyBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJlcnJvciIpCiAgICAgICAgICAgICAgICByb290LmNsYXNzTGlzdC5yZW1vdmUoInNob3ciKQogICAgICAgICAgICAgICAgcm9vdC5pbm5lclRleHQgPSAiZXJyb3IgbG9hZGluZyB1cmw6ICIgKyBpdGVtLnVybAogICAgICAgICAgICAgICAgcm9vdC5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgcm9vdC5hcHBlbmQodikKICAgICAgICAgIH1lbHNlIGlmKGl0ZW0udXJsLm1hdGNoKGltZ2V4dHJlZ2V4KSl7CiAgICAgICAgICAgIHJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIikKICAgICAgICAgICAgcm9vdC5ocmVmID0gIiMiCiAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MID0gY29udGVudGVsZW1lbnRzCiAgICAgICAgICAgICAgCiAgICAgICAgICAgIGlmKHR5cGUgPT0gInBpYyIpewogICAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MICs9ICc8aW1nIG9ubG9hZD0iZ2lkKFwnJyArIGlkICsgJ1wnKS5zdHlsZS5kaXNwbGF5PVwnYmxvY2tcJyIgc3JjPSInICsgaXRlbS51cmwgKyAnIi8+JwogICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICByb290LmlubmVySFRNTCArPSAnPHNwYW4gY2xhc3M9ImZpbGUiPicgKyBpdGVtLnVybCArICc8L3NwYW4+JwogICAgICAgICAgICB9CiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIC8vcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCiAgICAgICAgICAgIC8vcm9vdC5pbm5lclRleHQgPSBpdGVtLnVybAogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICByb290LmlkID0gaWQKICAgICAgICAgIHJvb3RbImRhdGEtaXRlbSJdID0gaXRlbQogICAgICAgICAgcm9vdFsiZGF0YS1ldmVudCJdID0gaXRlbS5ldmVudAogICAgICAgICAgcm9vdFsiZGF0YS1xdWVyeSJdID0gcQogICAgICAgICAgcm9vdFsiZGF0YS10ZXh0Il0gPSB0ZXh0CiAgICAgICAgICAKICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCh0eXBlKQogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJpdGVtIikKICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgic2hvdyIpCiAgICAgICAgICAKICAgICAgICAgIGlmKGl0ZW0ucmVhY3RlZCl7CiAgICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHFzKCIjcGljcyIpW2FwcGVuZCAmJiAiYXBwZW5kIiB8fCAicHJlcGVuZCJdKHJvb3QpCiAgICAgICAgICAKICAgICAgICAgIGlmKHYpewogICAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkodikKICAgICAgICAgIH0KICAgICAgICB9KQoKICAgICAgICBpZihhY3RpdmUoKSA9PSBudWxsKXsKICAgICAgICAgIHFzKCIjcGljcyAuaXRlbSIpPy5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGlkZW1lZGlhKCl7CiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICJzY3JvbGwiCiAgICAgICAgcXNhKCIjbWVkaWEtY29udGFpbmVyLCAjcGljLCAjbWVkaWEtZm9vdGVyIikuZm9yRWFjaChuID0+IG4uc3R5bGUuZGlzcGxheSA9ICJub25lIikKICAgICAgICBnaWQoInBpYy1saWtlIikuY2xhc3NMaXN0LnJlbW92ZSgicmVhY3RlZCIpCiAgICAgICAgaGlkZXZpZGVvKCkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGlkZXZpZGVvKCl7CiAgICAgICAgY29uc3QgdiA9IHFzKCIjbWVkaWEtY29udGFpbmVyIHZpZGVvIikKICAgICAgICAKICAgICAgICBpZih2KXsKICAgICAgICAgIHYubXV0ZWQgPSB0cnVlCiAgICAgICAgICBnaWQodlsiZGF0YS1pdGVtLWlkIl0pLmFwcGVuZENoaWxkKHYpCiAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkodikKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHdhaXRyZXMoa2V5KXsKICAgICAgICBsZXQgZXZlbnRzID0gW10KICAgICAgICAKICAgICAgICBsZXQgcmVzaGFuZGxlciA9IGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7CiAgICAgICAgICB0aGlzLmhhbmRsZSA9IGZ1bmN0aW9uKHJlcyl7CiAgICAgICAgICAgIHRoaXMua2V5ID0ga2V5CiAgICAgICAgICAgIGxldCBvID0gSlNPTi5wYXJzZShyZXMuZGF0YSkKICAgICAgICAgICAgaWYob1sxXSA9PSBrZXkpewogICAgICAgICAgICAgIGlmKG9bMF0gPT0gIkVPU0UiKXsKICAgICAgICAgICAgICAgIHJlc29sdmUoZXZlbnRzKQogICAgICAgICAgICAgICAgcmVzaGFuZGxlcnMuc3BsaWNlKHJlc2hhbmRsZXJzLmluZGV4T2YodGhpcyksIDEpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGV2ZW50cy5wdXNoKG9bMl0pCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgICAKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAgICAgcmVzaGFuZGxlcnMucHVzaChuZXcgcmVzaGFuZGxlcihyZXNvbHZlLCByZWplY3QpKQogICAgICAgIH0pCiAgICAgIH0KICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBjaGVja3VwZGF0ZShzb2NrZXQpewogICAgICAgIGNvbnN0IHVwZGF0ZXNyZXMgPSBhd2FpdCBxdWVyeXB1YmtleShzb2NrZXQsIHVwZGF0ZXNwdWJrZXkpCiAgICAgICAgY29uc3QgdXBkYXRlbm90ZSA9IHVwZGF0ZXNyZXMuZmluZChuID0+IG4uY29udGVudC5tYXRjaCgvXmh0dHBzXDpcL1wvLykpCiAgICAgICAgCiAgICAgICAgaWYoIXVwZGF0ZW5vdGUpewogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGFnZSA9IE1hdGgucm91bmQoKERhdGUubm93KCkgLyAxMDAwIC0gdXBkYXRlbm90ZS5jcmVhdGVkX2F0KSAvIDM2MDAgLyAyNCkKICAgICAgICBjb25zdCBub3RlaWQgPSBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyh1cGRhdGVub3RlLmlkKSkKICAgICAgICBxcygiI3JlbGVhc2UiKS5ocmVmID0gcHJvdG9jb2wgKyBub3RlaWQKICAgICAgICBxcygiI3JlbGVhc2UiKS5pbm5lclRleHQgPSAoYWdlID09IDAgJiYgInRvZGF5IiB8fCBhZ2UgKyAiIGRheShzKSBhZ28iKQogICAgICB9CgogICAgICBmdW5jdGlvbiBzbGVlcChtcyl7CiAgICAgICAgcmV0dXJuIG5ldyBmdW5jdGlvbigpewogICAgICAgICAgbGV0IHRpbWVvdXQgPSBudWxsCiAgICAgICAgICBsZXQgciA9IG51bGwKICAgICAgICAgIAogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcHJvbWlzZTogbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXsKICAgICAgICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIG1zKQogICAgICAgICAgICAgIHIgPSByZXNvbHZlCiAgICAgICAgICAgIH0pLAogICAgICAgICAgICByZXNvbHZlOiBmdW5jdGlvbigpewogICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KQogICAgICAgICAgICAgIHIoKQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzaG93KGlkKXsKICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiIKICAgICAgICBjb25zdCBpdGVtID0gZ2lkKGlkKVsiZGF0YS1pdGVtIl0KICAgICAgICBjb25zdCBtZWRpYSA9IGdpZCgibWVkaWEtY29udGFpbmVyIikKICAgICAgICBjb25zdCBwaWMgPSBnaWQoInBpYyIpCgogICAgICAgIGlmKGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpKXsKICAgICAgICAgIHBpYy5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiCiAgICAgICAgICBjb25zdCB2ID0gZ2lkKGlkKS5xdWVyeVNlbGVjdG9yKCJ2aWRlbyIpCiAgICAgICAgICBxcygiI21lZGlhLWNvbnRhaW5lciIpLmFwcGVuZENoaWxkKHYpCiAgICAgICAgICB2Lm11dGVkID0gZmFsc2UKICAgICAgICAgIHYucGxheSgpCiAgICAgICAgfWVsc2V7CiAgICAgICAgICBwaWMuc3JjID0gaXRlbS51cmwKICAgICAgICAgIHBpYy5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihpdGVtLm1ldGEpewogICAgICAgICAgY29uc3QgbWV0YWNvbnRlbnQgPSBKU09OLnBhcnNlKGl0ZW0ubWV0YS5jb250ZW50KQogICAgICAgICAgY29uc3QgbmFtZSA9IG1ldGFjb250ZW50LmRpc3BsYXlfbmFtZSB8fCBtZXRhY29udGVudC5uYW1lCiAgICAgICAgICBxcygiI3BpYy11c2VyIikuaHJlZiA9IHByb3RvY29sICsgYmVjaDMyLmVuY29kZSgibnB1YiIsIGZyb21IZXhTdHJpbmcoaXRlbS5tZXRhLnB1YmtleSkpCiAgICAgICAgICBxcygiI3BpYy11c2VyIikuaW5uZXJUZXh0ID0gbmFtZQogICAgICAgIH0KCiAgICAgICAgZ2lkKCJwaWMtbGlrZSIpWyJkYXRhLWl0ZW0taWQiXSA9IGlkCiAgICAgICAgZ2lkKCJtZWRpYS1mb290ZXIiKVsiZGF0YS1ldmVudCJdID0gaXRlbS5ldmVudAoKICAgICAgICBpZihpdGVtLnJlYWN0ZWQgfHwgcmVhY3RlZC5pbmNsdWRlcyhpZCkpewogICAgICAgICAgZ2lkKCJwaWMtbGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBhID0gcXMoIiNwaWMtcXVlcnkiKQogICAgICAgIGEuaHJlZiA9IHByb3RvY29sICsgaXRlbS5iZWNoMzJpZAogICAgICAgIGEuaW5uZXJUZXh0ID0gZ2lkKGlkKVsiZGF0YS10ZXh0Il0KICAgICAgICAgIAogICAgICAgIG1lZGlhLnN0eWxlLmRpc3BsYXkgPSBnaWQoIm1lZGlhLWZvb3RlciIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGNvbm5jb3VudCgpewogICAgICAgIHJldHVybiBzb2NrZXRzLmZpbHRlcihyID0+IHIucmVhZHlTdGF0ZSA9PSAxKS5sZW5ndGgKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gZGlzY29ubmVjdCgpewogICAgICAgIGZvcihsZXQgc29ja2V0IG9mIHNvY2tldHMpewogICAgICAgICAgc29ja2V0LmNsb3NlKCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc29ja2V0cy5zcGxpY2UoMCkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gbG9nKG1zZyl7CiAgICAgICAgbGV0IHNjcm9sbCA9IHFzKCIjbG9ncyIpLnNjcm9sbFRvcCA9PSBxcygiI2xvZ3MiKS5zY3JvbGxUb3BNYXgKICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKQogICAgICAgIGRpdi5pbm5lclRleHQgPSBBcnJheS5mcm9tKGFyZ3VtZW50cykuam9pbigiICIpCiAgICAgICAgcXMoIiNsb2dzIikuYXBwZW5kKGRpdikKICAgICAgICAKICAgICAgICBpZihzY3JvbGwpewogICAgICAgICAgcXMoIiNsb2dzIikuc2Nyb2xsVG8oMCwgcXMoIiNsb2dzIikuc2Nyb2xsVG9wTWF4KQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gY29ubmVjdCh1cmwpewogICAgICAgIGxvZygiY29ubmVjdGluZyIsIHVybCkKICAgICAgICBsZXQgc29ja2V0ID0gbmV3IFdlYlNvY2tldCh1cmwpCiAgICAgICAgCiAgICAgICAgc29ja2V0Lm9ubWVzc2FnZSA9IG1lc3NhZ2UgPT4gcmVzaGFuZGxlcnMuZm9yRWFjaChyaCA9PiByaC5oYW5kbGUobWVzc2FnZSkpCiAgICAgICAgCiAgICAgICAgc29ja2V0Lm9uY2xvc2UgPSBhc3luYyBmdW5jdGlvbigpewogICAgICAgICAgc29ja2V0cy5zcGxpY2Uoc29ja2V0cy5pbmRleE9mKHNvY2tldCksIDEpCiAgICAgICAgICBxcygiI2Nvbm5jb3VudCIpLmlubmVyVGV4dCA9IGNvbm5jb3VudCgpICsgKHByaW1hbHNvY2tldCAmJiAxKQogICAgICAgICAgbG9nKCJkaXNjb25uZWN0ZWQiLCB0aGlzLnVybCwgY29ubmNvdW50KCkpCiAgICAgICAgICBhd2FpdCBzbGVlcCgxMDAwKS5wcm9taXNlCiAgICAgICAgICBjb25uZWN0KHRoaXMudXJsKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXQub25vcGVuID0gZnVuY3Rpb24oKXsKICAgICAgICAgIHFzKCIjY29ubmNvdW50IikuaW5uZXJUZXh0ID0gY29ubmNvdW50KCkgKyAocHJpbWFsc29ja2V0ICYmIDEpCiAgICAgICAgICBsb2coImNvbm5lY3RlZCIsIHRoaXMudXJsLCBjb25uY291bnQoKSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIHNvY2tldAogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgYXN5bmMgKCkgPT4gewogICAgICAgIHByaW1hbHNvY2tldCA9IGNvbm5lY3QoIndzczovL2NhY2hlMy5wcmltYWwubmV0L2NhY2hlMTciKQogICAgICAgIHByaW1hbHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIiwgZnVuY3Rpb24oKXsKICAgICAgICAgIHByaW1hbGdsb2JhbCh0aGlzKQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgcHJpbWFsc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIiwgZnVuY3Rpb24oKXsKICAgICAgICAgIHByaW1hbHNvY2tldCA9IG51bGwKICAgICAgICB9KQogICAgICAgIAogICAgICAgIGZvcihsZXQgdXJsIG9mIHJlbGF5cygpKXsKICAgICAgICAgIGNvbnN0IHNvY2tldCA9IGNvbm5lY3QodXJsKQogICAgICAgICAgc29ja2V0cy5wdXNoKHNvY2tldCkKICAgICAgICAgIAogICAgICAgICAgc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoIm9wZW4iLCBmdW5jdGlvbigpewogICAgICAgICAgICBjaGVja3VwZGF0ZSh0aGlzKQogICAgICAgICAgICBxdWVyeSh0aGlzKQogICAgICAgICAgfSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgYXdhaXQgc2xlZXAoMTAwKS5wcm9taXNlCiAgICAgICAgCiAgICAgICAgaWYoaGFza2V5KCkpewogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJub3N0ciIpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgZm9yKGxldCBjIG9mIGNvbG9wdHMpewogICAgICAgIGRvY3VtZW50LndyaXRlKCc8c3R5bGU+JyArIGNvbHNjc3MuaW5uZXJUZXh0LnJlcGxhY2UoL1wkXHtjb2xzXH0vZywgYykgKyAnPC9zdHlsZT4nKQogICAgICB9CiAgICA8L3NjcmlwdD4KICA8L2JvZHk+CjwvaHRtbD4K
https://ipfs.io/ipfs/QmevT877jWK1uE3s8MCGdXBTgNiAxR1qojFqwFinwb3hvD
files.html, settings panel scroll improvement
sha256
017cfafccb8d2fd5752c0b807121b352d8d5a73d3926ca8b8ca4ada788a32244 files.html
base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyIvPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL3N2Z2ljb25zLnNwYXJray5mci9zdmdpY29ucy5jc3MiLz4KICAgIDxzdHlsZT4KICAgICAgYm9keSB7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgd2lkdGg6IDEwMHZ3OwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICBmb250LWZhbWlseTogIk5vdG8gU2VyaWYiOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5LCAKICAgICAgI2hlYWRlciB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQogICAgICAKICAgICAgI3JlbGF5cywKICAgICAgI2xvZ3MsIAogICAgICAjcHJpdmtleSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd2lkdGg6IDE4ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzExMTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI3JlbGF5cywKICAgICAgI2xvZ3MgewogICAgICAgIGhlaWdodDogNmVtOwogICAgICB9CiAgICAgIAogICAgICAjbG9ncyB7CiAgICAgICAgaGVpZ2h0OiA4ZW07CiAgICAgICAgb3ZlcmZsb3c6IHNjcm9sbDsKICAgICAgICBmb250LXNpemU6IC44ZW07CiAgICAgIH0KICAgICAgCiAgICAgIHNlbGVjdCB7CiAgICAgICAgd2lkdGg6IDRlbTsKICAgICAgfQogICAgICAKICAgICAgI3JlbGF5cywgCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogLjVlbTsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSAudGV4dCwgCiAgICAgICNoZWFkZXIgYSwKICAgICAgI21lZGlhLWNvbnRhaW5lciB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICB6LWluZGV4OiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAKICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMGVtKSB7CiAgICAgICAgI3F1ZXJ5ZGlzcGxheSwKICAgICAgICAjY29udHJvbGluZm8gewogICAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZvcm0gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5IHsKICAgICAgICB3aWR0aDogNmVtOwogICAgICB9CiAgICAgIAogICAgICAjbG9hZGluZyB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwcHg7CiAgICAgICAgbGVmdDogMjdlbTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgYSB7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICB9CgogICAgICB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgCiAgICAgICNtZWRpYS1jb250YWluZXIgdmlkZW8gewogICAgICAgIHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7CiAgICAgICAgaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7CiAgICAgICAgbWFyZ2luLXRvcDogMCAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAudHlwZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnkgewogICAgICAgIHdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksIAogICAgICAjY29udHJvbGluZm8sCiAgICAgIGEsCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICB9CgogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbWluLXdpZHRoOiAzZW07CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLAogICAgICAjaGVhZGVyIHNwYW4gewogICAgICAgIHBhZGRpbmc6IDAuNWVtOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CgogICAgICAjaGVhZGVyIHsKICAgICAgICBwYWRkaW5nOiAwLjQ1ZW0gMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAjaGVhZGVyIC5pdGVtcyB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgLml0ZW1zLCAKICAgICAgI2NvbnRyb2xpbmZvIHsKICAgICAgICBtYXJnaW4tdG9wOiAuM2VtOwogICAgICB9CgogICAgICBwIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICAubGFiZWwgewogICAgICAgIHBhZGRpbmc6IC44ZW0gLjhlbSAuOGVtIDA7CiAgICAgIH0KCiAgICAgIHNwYW4jY29udHJvbGluZm8sIAogICAgICAjcGljcyBhID4gYSwKICAgICAgI3BpY3MgLnF1ZXJ5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KICAgICAgCiAgICAgIHNwYW4jY29udHJvbGluZm8gewogICAgICAgIHJpZ2h0OiAyZW07CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBwYWRkaW5nOiAwIDFlbTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KCiAgICAgICNtZWRpYS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwKTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtY29udGFpbmVyIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMgewogICAgICAgIG1heC13aWR0aDogMTAwdnc7CiAgICAgICAgbWF4LWhlaWdodDogMTAwdmg7CiAgICAgIH0KICAgICAgICAKICAgICAgI3BpY3MgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgCiAgICAgICNwaWNzID4gYSwgCiAgICAgICNwaWNzIGltZywKICAgICAgI3BpY3MgLmZpbGUsCiAgICAgICNwaWNzIC52aWRlby1jb250YWluZXIgewogICAgICAgIHdpZHRoOiAyNXZ3OwogICAgICB9CgogICAgICAjcGljcyA+IGEsCiAgICAgICNwaWNzIC5maWxlLAogICAgICAjcGljcyAudmlkZW8tY29udGFpbmVyIHsKICAgICAgICBoZWlnaHQ6IDI1dnc7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBib3JkZXI6IDAuM2VtIHNvbGlkIHRyYW5zcGFyZW50OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDAuM2VtOwogICAgICAgIG1hcmdpbjogLTAuM2VtOwogICAgICB9CgogICAgICAjcGljcyA+IC5maWxlIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICAKICAgICAgI21lZGlhLWNvbnRhaW5lciB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgYm9keTpub3QoLm5vc3RyKSAjZmlsdGVyLWxpa2VzLCAKICAgICAgLmZpbHRlci1saWtlcyAjcGljcyA+IC5pdGVtOm5vdCgucmVhY3RlZCkgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UsIAogICAgICAjcGljLXF1ZXJ5LAogICAgICAjcGljLXVzZXIgewogICAgICAgIHotaW5kZXg6IDI7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDN2dzsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBwYWRkaW5nOiAwIDF2dzsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UsIAogICAgICAjcGljLXF1ZXJ5IHsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgZm9udC1zaXplOiBtaW4oMy41dncsIDEuNWVtKTsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLDAuNik7CiAgICAgICAgbWF4LXdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnkgewogICAgICAgIHBhZGRpbmc6IC42ZW0gLjRlbSAuMWVtIC40ZW07CiAgICAgICAgbWF4LXdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgIC5saWtlLnJlYWN0ZWQsCiAgICAgIC5maWx0ZXItbGlrZXMgI2ZpbHRlci1saWtlcyB7CiAgICAgICAgYmFja2dyb3VuZDogcmVkOwogICAgICB9CgogICAgICAjcGljLXF1ZXJ5LAogICAgICAjcGljLXVzZXIgewogICAgICAgIGZvbnQtc2l6ZTogM2VtOwogICAgICB9CiAgICAgIAogICAgICAjcGljLXF1ZXJ5LAogICAgICAjcGljLXVzZXIsCiAgICAgICNtZWRpYS1mb290ZXIgLmxpa2UgewogICAgICAgIHotaW5kZXg6IDU7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICB9CiAgICAgIAogICAgICAjcGljLXF1ZXJ5LAogICAgICAjcGljLXVzZXIgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICAjcGljLXVzZXIgewogICAgICAgIGJvdHRvbTogMS45ZW07CiAgICAgICAgZm9udC1zaXplOiAxLjhlbTsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAuNjVlbTsKICAgICAgICBtYXgtd2lkdGg6IDhlbTsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgfQogICAgICAKICAgICAgLmxpa2UgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogYXV0bzsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIHdpZHRoOiAxZW07CiAgICAgICAgaGVpZ2h0OiAxZW07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgfQoKICAgICAgLm5vc3RyIC5saWtlIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsgIAogICAgICB9CgogICAgICAjbWVkaWEtZm9vdGVyIC5saWtlIHsKICAgICAgICBmb250LXNpemU6IDIuNGVtOwogICAgICB9CgogICAgICAjbWVkaWEtZm9vdGVyIHsKICAgICAgICBkaXNwbGF5OiBub25lOyAgCiAgICAgIH0KICAKICAgICAgI3BpY3MgaW1nIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIC5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICM0NDQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWNzID4gLmFjdGl2ZSB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiBncmVlbjsKICAgICAgICB6LWluZGV4OiAxOwogICAgICB9CgogICAgICAuaGVhcnRzdmcgcGF0aCB7CiAgICAgICAgc3Ryb2tlOiAjZmZmOwogICAgICB9CiAgCiAgICAgIGEjbWVudSwgYSNmaWx0ZXItbGlrZXMgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbi10b3A6IC0uM2VtOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgIH0KCiAgICAgIGEjbWVudSB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgcGFkZGluZzogMCAuM2VtIDAgLjVlbTsKICAgICAgICBoZWlnaHQ6IDIuMWVtOwogICAgICB9CiAgICAgIAogICAgICBhI2ZpbHRlci1saWtlcyB7CiAgICAgICAgcGFkZGluZzogLjJlbTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgd2lkdGg6IDEuNWVtOwogICAgICAgIGhlaWdodDogMS41ZW07CiAgICAgICAgbWFyZ2luOiAuMWVtIC41ZW07CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CiAgICAgIAogICAgICBhI2ZpbHRlci1saWtlcyBzdmcgewogICAgICAgIHdpZHRoOiAxLjVlbTsKICAgICAgICBoZWlnaHQ6IDEuNWVtOwogICAgICB9CiAgICAgICAKICAgICAgLm1lbnVzdmcgewogICAgICAgIHdpZHRoOiAyZW07CiAgICAgICAgaGVpZ2h0OiAyZW07CiAgICAgIH0KCiAgICAgIC5tZW51c3ZnIHBhdGggewogICAgICAgIGZpbGw6ICNmZmY7CiAgICAgIH0KICAgIAogICAgICAjbWVudS1jb250ZW50LCAjbWVudS1jb250ZW50ICogewogICAgICAgIG92ZXJzY3JvbGwtYmVoYXZpb3IteTogY29udGFpbjsKICAgICAgfQogICAgICAKICAgICAgI21lbnUtY29udGVudCB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBtYXJnaW4tbGVmdDogLTE4ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzIyMjsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgei1pbmRleDogMzsgCiAgICAgICAgb3ZlcmZsb3c6IHNjcm9sbDsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudC5vcGVuIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgewogICAgICAgIHBhZGRpbmc6IDAgMWVtIDFlbSAxZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIGEsCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgcGFkZGluZzogLjVlbSAuN2VtOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHotaW5kZXg6IDM7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIG9wYWNpdHk6IC41OwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5Lm9wZW4gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIAogICAgICBzdmcsIAogICAgICBpbWcsIAogICAgICAudmlkZW8gdmlkZW8gewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAjdGVtcGxhdGUgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGRpdiBpZD0idGVtcGxhdGUiPgogICAgICA8c3ZnIGNsYXNzPSJoZWFydHN2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KICAgICAgICA8cGF0aCBkPSJNOS43MTksMTcuMDczbC02LjU2Mi02LjUxYy0wLjI3LTAuMjY4LTAuNTA0LTAuNTY3LTAuNjk2LTAuODg4QzEuMzg1LDcuODksMS42Nyw1LjYxMywzLjE1NSw0LjE0YzAuODY0LTAuODU2LDIuMDEyLTEuMzI5LDMuMjMzLTEuMzI5YzEuOTI0LDAsMy4xMTUsMS4xMiwzLjYxMiwxLjc1MmMwLjQ5OS0wLjYzNCwxLjY4OS0xLjc1MiwzLjYxMi0xLjc1MmMxLjIyMSwwLDIuMzY5LDAuNDcyLDMuMjMzLDEuMzI5YzEuNDg0LDEuNDczLDEuNzcxLDMuNzUsMC42OTMsNS41MzdjLTAuMTksMC4zMi0wLjQyNSwwLjYxOC0wLjY5NSwwLjg4N2wtNi41NjIsNi41MUMxMC4xMjUsMTcuMjI5LDkuODc1LDE3LjIyOSw5LjcxOSwxNy4wNzMgTTYuMzg4LDMuNjFDNS4zNzksMy42MSw0LjQzMSw0LDMuNzE3LDQuNzA3QzIuNDk1LDUuOTIsMi4yNTksNy43OTQsMy4xNDUsOS4yNjVjMC4xNTgsMC4yNjUsMC4zNTEsMC41MSwwLjU3NCwwLjczMUwxMCwxNi4yMjhsNi4yODEtNi4yMzJjMC4yMjQtMC4yMjEsMC40MTYtMC40NjYsMC41NzMtMC43MjljMC44ODctMS40NzIsMC42NTEtMy4zNDYtMC41NzEtNC41NkMxNS41Nyw0LDE0LjYyMSwzLjYxLDEzLjYxMiwzLjYxYy0xLjQzLDAtMi42MzksMC43ODYtMy4yNjgsMS44NjNjLTAuMTU0LDAuMjY0LTAuNTM2LDAuMjY0LTAuNjksMEM5LjAyOSw0LjM5Nyw3LjgyLDMuNjEsNi4zODgsMy42MSI+PC9wYXRoPgogICAgICA8L3N2Zz4KICAgICAgPGRpdiBpZD0iY29sc2NzcyI+CiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyA+IGEsIAogICAgICAuY29scyR7Y29sc30gI3BpY3MgaW1nLAogICAgICAuY29scyR7Y29sc30gI3BpY3MgLmZpbGUsCiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyAudmlkZW8tY29udGFpbmVyIHsKICAgICAgICB3aWR0aDogY2FsYygxMDB2dyAvICR7Y29sc30pOwogICAgICB9CgogICAgICAuY29scyR7Y29sc30gI3BpY3MgPiBhLAogICAgICAuY29scyR7Y29sc30gI3BpY3MgPiAuZmlsZSwKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzID4gLnZpZGVvLWNvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiBjYWxjKDEwMHZ3IC8gJHtjb2xzfSk7CiAgICAgIH0KICAgICAgCiAgICAgIC5jb2xzJHtjb2xzfSAucXVlcnksCiAgICAgIC5jb2xzJHtjb2xzfSAubGlrZSB7CiAgICAgICAgZm9udC1zaXplOiBtaW4oMTR2dyAqICgxIC8gJHtjb2xzfSksIDZlbSAqICgxIC8gJHtjb2xzfSkpCiAgICAgIH0KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9Im1lZGlhLWZvb3RlciI+CiAgICAgIDxhIGlkPSJwaWMtbGlrZSIgY2xhc3M9Imxpa2UiIGhyZWY9IiMiPjwvYT4KICAgICAgPGEgaWQ9InBpYy1xdWVyeSIgaHJlZj0iIyI+PC9hPgogICAgICA8YSBpZD0icGljLXVzZXIiIGhyZWY9IiMiPjwvYT4KICAgIDwvZGl2PgogICAgPGNlbnRlciBpZD0ibWVkaWEtY29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0icGljLWNvbnRhaW5lciI+CiAgICAgICAgPGltZyBpZD0icGljIi8+CiAgICAgIDwvZGl2PgogICAgPC9jZW50ZXI+CiAgICA8ZGl2IGlkPSJtZW51LW92ZXJsYXkiPjwvZGl2PgogICAgPGRpdiBpZD0ibWVudS1jb250ZW50IiBjbGFzcz0idGVzdCI+CiAgICAgIDxkaXYgY2xhc3M9Iml0ZW1zIj4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+YXV0b3BsYXk6PC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJvbiIgaHJlZj0iIyI+b248L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJvZmYiIGhyZWY9IiMiPm9mZjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0YXV0b3BsYXkiIGRhdGEtYXV0b3BsYXk9ImhvdmVyIiBocmVmPSIjIj5tb3VzZW92ZXI8L2E+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmNvbHM6PC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMSIgaHJlZj0iIyI+MTwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSIyIiBocmVmPSIjIj4yPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjQiIGhyZWY9IiMiPjQ8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iNiIgaHJlZj0iIyI+NjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSIxMCIgaHJlZj0iIyI+MTA8L2E+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmNvbm5lY3Rpb25zOjwvZGl2PgogICAgICAgIDxkaXYgaWQ9ImNvbm5jb3VudCI+MDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5yZWxheXM6PC9kaXY+CiAgICAgICAgPHA+UGxlYXNlIHVzZSByZWxheXMgd2l0aCBOSVAtNTAgKHNlYXJjaCkgZnVuY3Rpb25hbGl0eTwvcD4KICAgICAgICA8Zm9ybSBhY3Rpb249IiMiIGlkPSJyZWxheXMtZm9ybSI+CiAgICAgICAgICA8dGV4dGFyZWEgaWQ9InJlbGF5cyI+PC90ZXh0YXJlYT4KICAgICAgICAgIDxpbnB1dCBjbGFzcz0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJzYXZlIHJlbGF5cyIvPgogICAgICAgIDwvZm9ybT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+cHJpdmF0ZSBrZXk6PC9kaXY+CiAgICAgICAgPHA+SWYgeW91IGNhbnQgdXNlIGJyb3dzZXIgYWRkb24gKG1vYmlsZSk8L3A+CiAgICAgICAgPGZvcm0gYWN0aW9uPSIjIiBpZD0icHJpdmtleS1mb3JtIj4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icHJpdmtleSIvPgogICAgICAgICAgPGlucHV0IGNsYXNzPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9InNhdmUga2V5Ii8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5sb2dzOjwvZGl2PgogICAgICAgIDxkaXYgaWQ9ImxvZ3MiPjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5sYXRlc3QgcmVsZWFzZTo8L2Rpdj4KICAgICAgICA8YSBpZD0icmVsZWFzZSIgaHJlZj0iIyI+PC9hPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0iaGVhZGVyIj4KICAgICAgPHNwYW4gaWQ9ImNvbnRyb2xpbmZvIj5jb250cm9sczogYXJyb3dzLCBlbnRlciwgZXNjPC9zcGFuPgogICAgICA8YSBpZD0iZmlsdGVyLWxpa2VzIiBocmVmPSIjIj48L2E+CiAgICAgIDxkaXYgY2xhc3M9Iml0ZW1zIj4KICAgICAgICA8YSBpZD0ibWVudSIgaHJlZj0iIyI+CiAgICAgICAgICA8c3ZnIGNsYXNzPSJtZW51c3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgoJCSAgICAgICAgPHBhdGggZD0iTTEwLDEuNDQ1Yy00LjcyNiwwLTguNTU1LDMuODI5LTguNTU1LDguNTU1YzAsNC43MjUsMy44MjksOC41NTUsOC41NTUsOC41NTVjNC43MjUsMCw4LjU1NS0zLjgzLDguNTU1LTguNTU1QzE4LjU1NSw1LjI3NCwxNC43MjUsMS40NDUsMTAsMS40NDUgTTEwLDE3LjY1NGMtNC4yMjEsMC03LjY1NC0zLjQzNC03LjY1NC03LjY1NGMwLTQuMjIxLDMuNDMzLTcuNjU0LDcuNjU0LTcuNjU0YzQuMjIyLDAsNy42NTQsMy40MzMsNy42NTQsNy42NTRDMTcuNjU0LDE0LjIyMSwxNC4yMjIsMTcuNjU0LDEwLDE3LjY1NCBNMTQuMzksMTBjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw5LjU1LDE0LjM5LDkuNzUyLDE0LjM5LDEwIE0xNC4zOSwxMi43MDJjMCwwLjI0Ny0wLjIwMywwLjQ0OS0wLjQ1LDAuNDQ5SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMi0wLjQ1LTAuNDQ5YzAtMC4yNDgsMC4yMDMtMC40NTEsMC40NS0wLjQ1MWg3Ljg3OUMxNC4xODcsMTIuMjUxLDE0LjM5LDEyLjQ1NCwxNC4zOSwxMi43MDIgTTE0LjM5LDcuMjk4YzAsMC4yNDgtMC4yMDMsMC40NS0wLjQ1LDAuNDVINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAzLTAuNDUtMC40NXMwLjIwMy0wLjQ1LDAuNDUtMC40NWg3Ljg3OUMxNC4xODcsNi44NDgsMTQuMzksNy4wNTEsMTQuMzksNy4yOTgiPjwvcGF0aD4KCSAgICAgICAgPC9zdmc+CiAgICAgICAgPC9hPgogICAgICAgIDxhIGlkPSJ0aXRsZSIgaHJlZj0iIyI+ZmlsZXMuaHRtbDwvYT4KICAgICAgICA8Zm9ybSBpZD0icXVlcnktZm9ybSIgYWN0aW9uPSIjIj4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icXVlcnkiIG5hbWU9InF1ZXJ5IiBpZD0iIiAvPgogICAgICAgICAgPHNlbGVjdCBpZD0icXVlcnktdHlwZSI+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImFsbCI+YWxsPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImltYWdlIj5pbWFnZXM8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0idmlkZW8iPnZpZGVvczwvb3B0aW9uPgogICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgICA8aW5wdXQgaWQ9ImdvIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJnbyIvPgogICAgICAgIDwvZm9ybT4KICAgICAgICA8c3BhbiBpZD0icXVlcnlkaXNwbGF5Ij4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0ZXh0Ij48L3NwYW4+CiAgICAgICAgPC9zcGFuPgogICAgICAgIDxkaXYgaWQ9ImxvYWRpbmciPnVwZGF0aW5nPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJwaWNzIj48L2Rpdj4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL3VucGtnLmNvbS9ub3N0ci10b29scy9saWIvbm9zdHIuYnVuZGxlLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL3Nsb3dsaS5naXRodWIuaW8vYmVjaDMyLWJ1ZmZlci9hc3NldHMvanMvYmVjaDMyLWJ1ZmZlci5taW4uanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdD4KICAgICAgY29uc3QgdXBkYXRlc3B1YmtleSA9ICJhZTVjNmUwYjc0NjYwZDIxOTRjODI1NGI1YzJjODI1Njc2NTc2YmUwMjk3Mzc5ZmEyMDUyMzExNGE2YTg1ZTg3IgogICAgICBjb25zdCBxdWVyaWVzID0gewogICAgICAgICJnbG9iYWwiOiAnWyJSRVEiLCI8ST4iLHsiY2FjaGUiOlsiZXhwbG9yZSIseyJ0aW1lZnJhbWUiOiJsYXRlc3QiLCJzY29wZSI6Imdsb2JhbCIsImxpbWl0Ijo8TD59XX1dJywgCiAgICAgICAgImF1dGhvciI6ICdbIlJFUSIsIjxJPiIseyJraW5kcyI6WzFdLCJhdXRob3JzIjpbIjxQPiJdfV0nLAogICAgICAgICJyZWFjdGlvbnMiOiAnWyJSRVEiLCI8ST4iLCB7ImtpbmRzIjpbN10sIiNlIjogPEU+fV0nCiAgICAgIH0KICAgICAgcXMoIiNyZWxheXMiKS52YWx1ZSA9IHJlbGF5cygpLmpvaW4oIlxuIikKICAgICAgcXMoIiNwcml2a2V5IikudmFsdWUgPSBwcml2a2V5KCkKICAgICAgY29uc3QgY29sb3B0cyA9IFsxLCAyLCA0LCA2LCAxMF0KCiAgICAgIGNvbHMgPSAoKSA9PiBwYXJzZUludChzZXR0aW5nKCJjb2xzIiwgY29sb3B0c1sxXSksIDEwKQogICAgICBhdXRvcGxheSA9ICgpID0+IHNldHRpbmcoImF1dG9wbGF5IiwgIm9mZiIpCiAgICAgIGxpbWl0ID0gKCkgPT4gcGFyc2VJbnQoc2V0dGluZygibGltaXQiLCAxNSksIDEwKQoKICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJjb2xzIiArIGNvbHMoKSkKICAgICAgCiAgICAgIGxldCBwcm90b2NvbCA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS8pID8gIm5vc3RyOiIgOiAid2ViK25vc3RyOiIKICAgICAgbGV0IHNvY2tldHMgPSBbXQogICAgICBsZXQgcmVzaGFuZGxlcnMgPSBbXQogICAgICBsZXQgdXJscyA9IFtdCiAgICAgIGxldCBsaWtlcyA9IFtdCiAgICAgIGxldCBuZXdsaWtlcyA9IFtdCiAgICAgIGxldCByZWFjdGVkID0gW10KICAgICAgbGV0IGlkY291bnRlciA9IDAKICAgICAgbGV0IHF1ZXJ5d2FpdCA9IG51bGwKICAgICAgbGV0IHByaW1hbHNvY2tldCA9IG51bGwKICAgICAgbGV0IHR5cGVzID0gewogICAgICAgIGltYWdlOiBbInBuZyIsICJqcGciLCAianBlZyIsICJ3ZWJwIl0sCiAgICAgICAgdmlkZW86IFsibXA0IiwgIndlYm0iXQogICAgICB9CiAgICAgIGxldCBpbWdyZWdleCA9IC9odHRwKHxzKVw6XC9cL1teIFxuXSo/XC4ocG5nfGpwZ3xqcGVnfHdlYnApL2dpCiAgICAgIGxldCB2aWRlb3JlZ2V4ID0gL2h0dHAofHMpXDpcL1wvW14gXG5dKj9cLihtcDR8d2VibSkvZ2kKICAgICAgbGV0IHZpZGVvZXh0cmVnZXggPSAvXC4obXA0fHdlYm0pJC9pCiAgICAgIHdhaXRtcyA9IDUwMDAKICAgICAgcXVlcnlzdHIgPSAiIgogICAgICBsYXN0cXVlcnlzdHIgPSAiIgogICAgICBsYXN0cXVlcnl0eXBlID0gIiIKICAgICAgbGV0IHF1ZXJ5Y291bnQgPSAwCiAgICAgIGxldCBob3ZlcmVkdmlkZW8gPSBudWxsCiAgICAgIAogICAgICB1cGRhdGVxdWVyeSgpCiAgICAgIHFzKCIjcGljLWxpa2UiKS5pbm5lckhUTUwgPSBxcygiI2ZpbHRlci1saWtlcyIpLmlubmVySFRNTCA9IHFzKCIjdGVtcGxhdGUgLmhlYXJ0c3ZnIikub3V0ZXJIVE1MCiAgICAgIHNldGFjdGl2ZSgic2V0Y29scyIsICJjb2xzIiwgY29scygpKQogICAgICBzZXRhY3RpdmUoInNldGF1dG9wbGF5IiwgImF1dG9wbGF5IiwgYXV0b3BsYXkoKSkKCiAgICAgIGZ1bmN0aW9uIGZyb21IZXhTdHJpbmcoc3RyKXsKICAgICAgICBsZXQgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoc3RyLmxlbmd0aCAvIDIpCiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWZmZXIubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGJ1ZmZlcltpXSA9IHBhcnNlSW50KHN0ci5zdWJzdHIoMiAqIGksIDIpLCAxNikKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGJ1ZmZlcgogICAgICB9CiAgCiAgICAgIGZ1bmN0aW9uIHJlbGF5cygpewogICAgICAgIGNvbnN0IG9iaiA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oInJlbGF5cyIpKQogICAgICAgIGNvbnN0IHIgPSBvYmogJiYgb2JqLmZpbHRlcihyID0+IHIubWF0Y2goL3dzczpcL1wvLisvKSkgfHwgW10KICAgICAgICAKICAgICAgICByZXR1cm4gci5sZW5ndGggPiAwICYmIHIgfHwgWwogICAgICAgICAgIndzczovL3JlbGF5Lm5vc3RyLmJhbmQiLAogICAgICAgICAgIndzczovL25iLnJlbGF5LmNlbnRlciIsIAogICAgICAgICAgIndzczovL25vc3RyLmNvbXBpbGUtZXJyb3IubmV0IgogICAgICAgIF0KICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcHJpdmtleSgpewogICAgICAgIGxldCBrZXkgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgicHJpdmtleSIpIHx8ICIiCiAgICAgICAgCiAgICAgICAgaWYoa2V5Lmxlbmd0aCA9PSA2Myl7CiAgICAgICAgICBrZXkgPSBOb3N0clRvb2xzLm5pcDE5LmRlY29kZShrZXkpLmRhdGEKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIGtleS5sZW5ndGggPT0gNjQgJiYga2V5IHx8IG51bGwKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gc2V0dGluZyhrZXksIGRlZmF1bHR2YWx1ZSl7CiAgICAgICAgY29uc3QgdiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSkKICAgICAgICByZXR1cm4gdiAmJiBvcHRpb24oInNldCIgKyBrZXksIGtleSwgdikgJiYgdiB8fCBkZWZhdWx0dmFsdWUKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gb3B0aW9uKGMsIGtleSwgdmFsKXsKICAgICAgICByZXR1cm4gcXMoIi4iICsgYyArICJbZGF0YS0iICsga2V5ICsgIj0nIiArIHZhbCArICInXSIpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHFzKHEpewogICAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHEpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHFzYShxKXsKICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHEpKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBnaWQoaSl7CiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGkpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHF1ZXJ5dHlwZSgpewogICAgICAgIHJldHVybiBxcygiI3F1ZXJ5LXR5cGUiKS52YWx1ZSB8fCAiYWxsIgogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVxdWVyeSgpewogICAgICAgIGxldCBwYXJ0cyA9IGRlY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5oYXNoLnN1YnN0cmluZygxKSkuc3BsaXQoIi8iKQogICAgICAgIHF1ZXJ5c3RyID0gcXMoIiNxdWVyeWRpc3BsYXkgLnRleHQiKS5pbm5lclRleHQgPSBwYXJ0c1swXQogICAgICAgIHFzKCIjcXVlcnkiKS52YWx1ZSA9IHBhcnRzWzBdCiAgICAgICAgcXMoIiNxdWVyeS10eXBlIikudmFsdWUgPSBwYXJ0c1sxXSB8fCAiYWxsIgogICAgICB9CgogICAgICBmdW5jdGlvbiBhY3RpdmUoKXsKICAgICAgICByZXR1cm4gcXMoIiNwaWNzIC5hY3RpdmUiKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBwaWNvZmZzZXQob2Zmc2V0KXsKICAgICAgICBjb25zdCBwaWNzID0gcXNhKCIjcGljcyA+IC5pdGVtIikuZmlsdGVyKGUgPT4gZS5zdHlsZS5kaXNwbGF5ID09ICJibG9jayIpCiAgICAgICAgcmV0dXJuIHBpY3NbcGljcy5pbmRleE9mKGFjdGl2ZSgpKStvZmZzZXRdCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGxhc3RhY3RpdmUoKXsKICAgICAgICByZXR1cm4gcXNhKCIjcGljcyAuYWN0aXZlIikucG9wKCkgICAgICAKICAgICAgfQoKICAgICAgZnVuY3Rpb24gbWVudSgpewogICAgICAgIHFzYSgiI21lbnUtY29udGVudCwgI21lbnUtb3ZlcmxheSIpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC50b2dnbGUoIm9wZW4iKSkKICAgICAgfQogIAogICAgICBmdW5jdGlvbiBzZXRhY3RpdmUoYywga2V5LCB2YWwpewogICAgICAgIHFzYSgiLiIgKyBjKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKSkKICAgICAgICBjb25zdCBvcHRpb24gPSBxcygiLiIgKyBjICsgIltkYXRhLSIgKyBrZXkgKyAiPSciICsgdmFsICsgIiddIikKICAgICAgICBvcHRpb24/LmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZWFsbHZpZGVvcGxheSgpewogICAgICAgIHFzYSgiI3BpY3MgdmlkZW8iKS5mb3JFYWNoKGFzeW5jIHYgPT4gdXBkYXRldmlkZW9wbGF5KHYpKQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiB1cGRhdGV2aWRlb3BsYXkodil7CiAgICAgICAgY29uc3QgYXBsYXkgPSBhdXRvcGxheSgpCiAgICAgICAgCiAgICAgICAgaWYoYXBsYXkgIT0gIm9uIil7CiAgICAgICAgICB2Lm11dGVkID0gZmFsc2UKICAgICAgICAgIHYucGF1c2UoKQogICAgICAgIH1lbHNlewogICAgICAgICAgdi5tdXRlZCA9IHRydWUKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgbiA9IHYucGFyZW50RWxlbWVudAogICAgICAgIAogICAgICAgIGlmKChuLm9mZnNldFRvcCArIG4ub2Zmc2V0SGVpZ2h0KSA8IHNjcm9sbFkgCiAgICAgICAgfHwgbi5vZmZzZXRUb3AgPiAoc2Nyb2xsWSArIHZpc3VhbFZpZXdwb3J0LmhlaWdodCkpewogICAgICAgICAgaWYodi5yZWFkeVN0YXRlID09IDQpewogICAgICAgICAgICB2LnBhdXNlKCkKICAgICAgICAgIH1lbHNlewogICAgICAgICAgICB2LnByZWxvYWQgPSAibm9uZSIKICAgICAgICAgIH0KICAgICAgICB9ZWxzZSBpZih2LnJlYWR5U3RhdGUgIT0gNCl7CiAgICAgICAgICB2LnByZWxvYWQgPSAiYXV0byIKICAgICAgICB9CiAgICAgICAgZWxzZSBpZihhcGxheSA9PSAib24iIHx8IChhcGxheSA9PSAiaG92ZXIiICYmIHYgPT0gaG92ZXJlZHZpZGVvKSl7CiAgICAgICAgICB2LnBsYXkoKQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgZSA9PiB7CiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKQogICAgICAgIHVwZGF0ZWFsbHZpZGVvcGxheSgpCiAgICAgIH0pCiAgICAgIAogICAgICBsZXQgdG91Y2ggPSBudWxsCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwgZSA9PiB7CiAgICAgICAgdG91Y2ggPSBlLmNoYW5nZWRUb3VjaGVzWzBdCiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsIGUgPT4gewogICAgICAgIGNvbnN0IHhkaWZmID0gZS5jaGFuZ2VkVG91Y2hlc1swXS5zY3JlZW5YIC0gdG91Y2guc2NyZWVuWAogICAgICAgIGNvbnN0IHlkaWZmID0gZS5jaGFuZ2VkVG91Y2hlc1swXS5zY3JlZW5ZIC0gdG91Y2guc2NyZWVuWQogICAgICAgIAogICAgICAgIGlmKHhkaWZmIDwgLTUwKXsKICAgICAgICAgIG5leHQoKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZih4ZGlmZiA+IDUwKXsKICAgICAgICAgIHByZXYoKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIHFzKCIjcXVlcnktZm9ybSIpLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsIGUgPT4gewogICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIGxvY2F0aW9uLmhhc2ggPSAiIyIgKyBlbmNvZGVVUklDb21wb25lbnQocXMoIiNxdWVyeSIpLnZhbHVlICsgIi8iICsgcXVlcnl0eXBlKCkpCiAgICAgICAgdXBkYXRlcXVlcnkoKQogICAgICAgIHF1ZXJ5d2FpdC5yZXNvbHZlKCkKICAgICAgfSkKCiAgICAgIHFzKCIjcmVsYXlzLWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBhc3luYyBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBsZXQgciA9IEpTT04uc3RyaW5naWZ5KHFzKCIjcmVsYXlzIikudmFsdWUuc3BsaXQoIlxuIikpCiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oInJlbGF5cyIsIHIpCiAgICAgICAgZGlzY29ubmVjdCgpCiAgICAgIH0pCgogICAgICBxcygiI3ByaXZrZXktZm9ybSIpLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsIGFzeW5jIGUgPT4gewogICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIGNvbnN0IGtleSA9IHFzKCIjcHJpdmtleSIpLnZhbHVlCgogICAgICAgIGlmKGtleS5sZW5ndGggIT0gNjQgJiYga2V5Lmxlbmd0aCAhPSA2Myl7CiAgICAgICAgICBhbGVydCgia2V5IHNob3VsZCBiZSA2MyBvciA2NCBjaGFyYWN0ZXJzIGxvbmciKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJwcml2a2V5Iiwga2V5KQogICAgICAgIGFsZXJ0KCJrZXkgc2F2ZWQiKQogICAgICB9KQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwgYXN5bmMgKGUpID0+IHsKICAgICAgICBpZihhdXRvcGxheSgpID09ICJob3ZlciIgJiYgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2aWRlby1jb250YWluZXIiKSl7CiAgICAgICAgICBob3ZlcmVkdmlkZW8gPSBlLnRhcmdldC5xdWVyeVNlbGVjdG9yKCJ2aWRlbyIpCiAgICAgICAgICBob3ZlcmVkdmlkZW8ucGxheSgpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLCBhc3luYyAoZSkgPT4gewogICAgICAgIGhvdmVyZWR2aWRlbyA9IGZhbHNlCiAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5zdHlsZS5kaXNwbGF5ICE9ICJibG9jayIgJiYgYXV0b3BsYXkoKSA9PSAiaG92ZXIiICYmIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygidmlkZW8tY29udGFpbmVyIikpewogICAgICAgICAgcXNhKCJ2aWRlbyIpLmZvckVhY2godiA9PiB2LnBhdXNlKCkpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBhc3luYyAoZSkgPT4gewogICAgICAgIGlmKGUudGFyZ2V0LnR5cGUgPT0gInN1Ym1pdCIgfHwgKGUudGFyZ2V0LnRhZ05hbWUgPT0gIkEiICYmIGUudGFyZ2V0LmhyZWYubWF0Y2goL14ofHdlYlwrKW5vc3RyXDovKSkpewogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gInRpdGxlIil7CiAgICAgICAgICBxcygiI3F1ZXJ5IikudmFsdWUgPSAiIgogICAgICAgICAgcXMoIiNxdWVyeS10eXBlIikudmFsdWUgPSAiYWxsIgogICAgICAgICAgcXMoIiNnbyIpLmNsaWNrKCkKICAgICAgICB9CgogICAgICAgIGUucHJldmVudERlZmF1bHQoKQoKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAiZmlsdGVyLWxpa2VzIil7CiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC50b2dnbGUoImZpbHRlci1saWtlcyIpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzaG93IikpewogICAgICAgICAgYWN0aXZlKCk/LmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICBnaWQoZS50YXJnZXQuaWQpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBzaG93KGUudGFyZ2V0LmlkKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUudGFyZ2V0LnRhZ05hbWUgIT0gIkEiICYmIChxcygiI3BpYy1jb250YWluZXIiKSA9PSBlLnRhcmdldCB8fCBxcygiI21lZGlhLWNvbnRhaW5lciB2aWRlbyIpID09IGUudGFyZ2V0KSl7CiAgICAgICAgICBoaWRlbWVkaWEoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAibWVudSIgfHwgZS50YXJnZXQuaWQgPT0gIm1lbnUtb3ZlcmxheSIpewogICAgICAgICAgbWVudSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2V0Y29scyIpKXsKICAgICAgICAgIGZvcihsZXQgYyBvZiBjb2xvcHRzKXsKICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCJjb2xzIiArIGMpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgiY29scyIgKyBlLnRhcmdldC5kYXRhc2V0LmNvbHMpCiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiY29scyIsIGUudGFyZ2V0LmRhdGFzZXQuY29scykKICAgICAgICAgIHNldGFjdGl2ZSgic2V0Y29scyIsICJjb2xzIiwgY29scygpKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogIAogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2V0YXV0b3BsYXkiKSl7CiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiYXV0b3BsYXkiLCBlLnRhcmdldC5kYXRhc2V0LmF1dG9wbGF5KQogICAgICAgICAgc2V0YWN0aXZlKCJzZXRhdXRvcGxheSIsICJhdXRvcGxheSIsIGF1dG9wbGF5KCkpCiAgICAgICAgICB1cGRhdGVhbGx2aWRlb3BsYXkoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygibGlrZSIpKXsKICAgICAgICAgIGxpa2UoZS50YXJnZXQpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgZnVuY3Rpb24gaGFza2V5KCl7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5ub3N0ciB8fCBwcml2a2V5KCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcHVia2V5KCl7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5ub3N0ciAmJiBhd2FpdCB3aW5kb3cubm9zdHIuZ2V0UHVibGljS2V5KCkgfHwgTm9zdHJUb29scy5nZXRQdWJsaWNLZXkocHJpdmtleSgpKQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBzaWduKGV2ZW50KXsKICAgICAgICBpZih3aW5kb3cubm9zdHIpewogICAgICAgICAgcmV0dXJuIGF3YWl0IG5vc3RyLnNpZ25FdmVudChldmVudCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZXZlbnQuc2lnID0gTm9zdHJUb29scy5nZXRTaWduYXR1cmUoZXZlbnQsIHByaXZrZXkoKSkKICAgICAgICByZXR1cm4gZXZlbnQKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gbGlrZShsaW5rKXsKICAgICAgICBjb25zdCBldmVudCA9IGxpbmsucGFyZW50RWxlbWVudFsiZGF0YS1ldmVudCJdCiAgICAgICAgY29uc3QgcHViayA9IGF3YWl0IHB1YmtleSgpCiAgICAgICAgY29uc3QgbGlrZSA9IGF3YWl0IHNpZ24oewogICAgICAgICAgImtpbmQiOiA3LAogICAgICAgICAgImNvbnRlbnQiOiAiKyIsCiAgICAgICAgICAidGFncyI6IFsKICAgICAgICAgICAgWyJlIiwgZXZlbnQuaWRdLAogICAgICAgICAgICBbInAiLCBldmVudC5wdWJrZXldCiAgICAgICAgICBdLAogICAgICAgICAgInB1YmtleSI6IHB1YmssCiAgICAgICAgICAiY3JlYXRlZF9hdCI6IHBhcnNlSW50KERhdGUubm93KCkgLyAxMDAwICwgMTApCiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBjb25zdCBsaWtlanNvbiA9IEpTT04uc3RyaW5naWZ5KFsiRVZFTlQiLCBsaWtlXSkKICAgICAgICBzb2NrZXRzLmZvckVhY2gocyA9PiBzLnNlbmQobGlrZWpzb24pKQogICAgICAgIGNvbnNvbGUubG9nKCJzZW50IGxpa2UiLCBsaWtlanNvbikgCiAgICAgICAgbGluay5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKCiAgICAgICAgY29uc3QgcGljaWQgPSBsaW5rWyJkYXRhLWl0ZW0taWQiXSB8fCBsaW5rLmRhdGFzZXQucGljSWQKICAgICAgICAKICAgICAgICBpZihwaWNpZCl7CiAgICAgICAgICBnaWQocGljaWQpLnF1ZXJ5U2VsZWN0b3IoIi5saWtlIikuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgICByZWFjdGVkLnB1c2gocGljaWQpCiAgICAgICAgfQogICAgICB9CiAgICAKICAgICAgZnVuY3Rpb24gcHJldigpewogICAgICAgIGlmKHBpY29mZnNldCgtMSkpewogICAgICAgICAgcGljb2Zmc2V0KC0xKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgbGFzdGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICB1cGRhdGVzaG93KCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIG5leHQoKXsKICAgICAgICBpZihwaWNvZmZzZXQoMSkpewogICAgICAgICAgcGljb2Zmc2V0KDEpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgdXBkYXRlc2hvdygpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVzaG93KCl7CiAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5zdHlsZS5kaXNwbGF5ID09ICJibG9jayIpewogICAgICAgICAgaGlkZXZpZGVvKCkKICAgICAgICAgIHNob3coYWN0aXZlKCkuaWQpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgZSA9PiB7CiAgICAgICAgaWYoWyJUYWIiLCAiQXJyb3dMZWZ0IiwgIkFycm93UmlnaHQiLCAiQXJyb3dVcCIsICJBcnJvd0Rvd24iXS5pbmNsdWRlcyhlLmtleSkpewogICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiRXNjYXBlIil7CiAgICAgICAgICBtZW51KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLmtleSA9PSAiRW50ZXIiICYmIGUudGFyZ2V0LnRhZ05hbWUgPT0gIkJPRFkiKXsKICAgICAgICAgIGlmKHFzKCIjbWVkaWEtY29udGFpbmVyIikuc3R5bGUuZGlzcGxheSA9PSAiYmxvY2siKXsKICAgICAgICAgICAgaGlkZW1lZGlhKCkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHNob3coYWN0aXZlKCkuaWQpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd1VwIiAmJiBwaWNvZmZzZXQoLWNvbHMoKSkpewogICAgICAgICAgcGljb2Zmc2V0KC1jb2xzKCkpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBsYXN0YWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIHVwZGF0ZXNob3coKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93RG93biIgJiYgcGljb2Zmc2V0KGNvbHMoKSkpewogICAgICAgICAgcGljb2Zmc2V0KGNvbHMoKSkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICB1cGRhdGVzaG93KCkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd0xlZnQiKXsKICAgICAgICAgIHByZXYoKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93UmlnaHQiKXsKICAgICAgICAgIG5leHQoKQogICAgICAgIH0KICAgICAgfSkKCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZXF1ZXJ5cmVzKHJlcywgc29ja2V0LCBxLCB0eXBlLCBzdGltZSl7CiAgICAgICAgc2F2ZShzb2NrZXQsIHJlcywgcSwgdHlwZSwgZmFsc2UsIGZhbHNlKQogICAgICAgIGxvZygicXVlcnkgcmVzIiwgcmVzLmxlbmd0aCwgc29ja2V0LnVybCkKICAgICAgICBxdWVyeWNvdW50LS0KICAgICAgICBpZihxdWVyeWNvdW50ID09IDApewogICAgICAgICAgcXMoIiNsb2FkaW5nIikuc3R5bGUuZGlzcGxheSA9ICJub25lIgogICAgICAgIH0KICAgICAgICAKICAgICAgICBsZXQgd2FpdCA9IHdhaXRtcyAtIChEYXRlLm5vdygpIC0gc3RpbWUpCiAgICAgICAgcXVlcnl3YWl0ID0gc2xlZXAod2FpdCkKICAgICAgICBhd2FpdCBxdWVyeXdhaXQucHJvbWlzZQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBwcmltYWxnbG9iYWwoc29ja2V0KXsKICAgICAgICBsb2coImdsb2JhbCIsIHNvY2tldC51cmwpCiAgICAgICAgcXVlcnljb3VudCsrCiAgICAgICAgcXMoIiNsb2FkaW5nIikuc3R5bGUuZGlzcGxheSA9ICJibG9jayIKICAgICAgICBsZXQgc3RpbWUgPSBEYXRlLm5vdygpCiAgICAgICAgbGV0IHFpZCA9ICJnbG9iYWxfIiArICgrK2lkY291bnRlcikKICAgICAgICBsZXQgcWlkbGlrZXMgPSAibGlrZXNfIiArICgrK2lkY291bnRlcikKCiAgICAgICAgaWYobmV3bGlrZXMubGVuZ3RoID4gMCl7CiAgICAgICAgICBwcmltYWxzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAgICJSRVEiLCAKICAgICAgICAgICAgcWlkbGlrZXMsIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgImNhY2hlIjogWwogICAgICAgICAgICAgICAgImV2ZW50cyIsIHsKICAgICAgICAgICAgICAgICAgImV2ZW50X2lkcyI6IG5ld2xpa2VzCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgICBdKSkKCiAgICAgICAgICBjb25zdCBsaWtlX2V2ZW50cyA9IGF3YWl0IHdhaXRyZXMocWlkbGlrZXMpCiAgICAgICAgICBuZXdsaWtlcy5zcGxpY2UoMCkKICAgICAgICAgIAogICAgICAgICAgYXdhaXQgc2F2ZShzb2NrZXQsIGxpa2VfZXZlbnRzLCAiIiwgImFsbCIsIHRydWUsIHRydWUpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KFsKICAgICAgICAgICJSRVEiLCAKICAgICAgICAgIHFpZCwgCiAgICAgICAgICB7CiAgICAgICAgICAgICJjYWNoZSI6IFsKICAgICAgICAgICAgICAiZXhwbG9yZSIsIAogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJ0aW1lZnJhbWUiOiAibGF0ZXN0IiwKICAgICAgICAgICAgICAgICJzY29wZSI6ICJnbG9iYWwiLAogICAgICAgICAgICAgICAgImxpbWl0IjogMjAKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdKSkKICAgICAgICAKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB3YWl0cmVzKHFpZCkKICAgICAgICBhd2FpdCBoYW5kbGVxdWVyeXJlcyhyZXMuZmlsdGVyKGUgPT4gZS5raW5kID09IDEpLCBzb2NrZXQsICIiLCAiYWxsIiwgc3RpbWUpCiAgICAgICAgcHJpbWFsZ2xvYmFsKHNvY2tldCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnkoc29ja2V0LCBwcmltYWwpewogICAgICAgIGxvZygicXVlcnkiLCBzb2NrZXQudXJsKQogICAgICAgIHF1ZXJ5Y291bnQrKwogICAgICAgIHFzKCIjbG9hZGluZyIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgICAgCiAgICAgICAgbGV0IHN0aW1lID0gRGF0ZS5ub3coKQogICAgICAgIGxldCBxID0gcXVlcnlzdHIudHJpbSgpCiAgICAgICAgbGV0IHR5cGUgPSBxdWVyeXR5cGUoKQogICAgICAgIGxldCBpID0gKytpZGNvdW50ZXIKICAgICAgICBsZXQgcWlkID0gInF1ZXJ5XyIgKyBpCiAgICAgICAgbGV0IGZpbHRlcnMgPSBbXQoKICAgICAgICBmaWx0ZXJzLnB1c2goLi4uKHR5cGVzW3R5cGVdIHx8IFtdKS5tYXAoKHQpID0+IHsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGtpbmRzOiBbMV0sIAogICAgICAgICAgICBzZWFyY2g6ICIuIiArIHQsCiAgICAgICAgICAgIGxpbWl0OiAyMAogICAgICAgICAgfQogICAgICAgIH0pKQogICAgICAgIAogICAgICAgIGlmKHEubGVuZ3RoID4gMCl7CiAgICAgICAgICBmaWx0ZXJzLnB1c2goe2tpbmRzOiBbMV0sIHNlYXJjaDogcX0pCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGZpbHRlcnMubGVuZ3RoID09IDApewogICAgICAgICAgZmlsdGVycy5wdXNoKHtraW5kczogWzFdfSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgCiAgICAgICAgY29uc3QgbGlrZXNyZXMgPSBhd2FpdCBxdWVyeWxpa2VzKHNvY2tldCkKICAgICAgICAKICAgICAgICBsaWtlc3Jlcy5mb3JFYWNoKGV2ZW50aWQgPT4gewogICAgICAgICAgaWYoIWxpa2VzLmluY2x1ZGVzKGV2ZW50aWQpKXsKICAgICAgICAgICAgbGlrZXMucHVzaChldmVudGlkKQogICAgICAgICAgICBuZXdsaWtlcy5wdXNoKGV2ZW50aWQpCiAgICAgICAgICB9CiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBjb25zdCBzZWFyY2hvYmogPSBbIlJFUSIsIHFpZCwgLi4uZmlsdGVyc10KICAgICAgICBjb25zdCBzZWFyY2hqc29uID0gSlNPTi5zdHJpbmdpZnkoc2VhcmNob2JqKQogICAgICAgIHNvY2tldC5zZW5kKHNlYXJjaGpzb24pCiAgICAgICAgCiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgd2FpdHJlcyhxaWQpCiAgICAgICAgYXdhaXQgaGFuZGxlcXVlcnlyZXMocmVzLCBzb2NrZXQsIHEsIHR5cGUsIHN0aW1lKQogICAgICAgIHF1ZXJ5KHNvY2tldCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlsaWtlcyhzb2NrZXQpewogICAgICAgIGlmKCFoYXNrZXkoKSl7CiAgICAgICAgICByZXR1cm4gW10KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgbXlwdWJrZXkgPSBhd2FpdCBwdWJrZXkoKQogICAgICAgIGNvbnN0IGV2ZW50cyA9IGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzddLCBudWxsLCBbbXlwdWJrZXldKQogICAgICAgIHJldHVybiBldmVudHMubWFwKGUgPT4gZS50YWdzLmZpbmQodCA9PiB0WzBdID09ICJlIilbMV0pCiAgICAgIH0KCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5ZXZlbnRzKHNvY2tldCwga2luZHMsIGV2ZW50aWRzLCBhdXRob3JzKXsKICAgICAgICBjb25zdCBxdWVyeWlkID0gImV2ZW50c18iICsgKCsraWRjb3VudGVyKQogICAgICAgIGNvbnN0IGZpbHRlcnMgPSB7fQogICAgICAgIAogICAgICAgIGZpbHRlcnMua2luZHMgPSBraW5kcwogICAgICAgIAogICAgICAgIGlmKGV2ZW50aWRzKXsKICAgICAgICAgIGZpbHRlcnNbIiNlIl0gPSBldmVudGlkcwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihhdXRob3JzKXsKICAgICAgICAgIGZpbHRlcnNbImF1dGhvcnMiXSA9IGF1dGhvcnMKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KFsKICAgICAgICAgICJSRVEiLCAKICAgICAgICAgIHF1ZXJ5aWQsIAogICAgICAgICAgZmlsdGVycwogICAgICAgIF0pCgogICAgICAgIHNvY2tldC5zZW5kKGpzb24pCiAgICAgICAgCiAgICAgICAgcmV0dXJuIGF3YWl0IHdhaXRyZXMocXVlcnlpZCkgfHwgW10KICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlwdWJrZXkoc29ja2V0LCBwdWJrKXsKICAgICAgICBjb25zdCBxdWVyeWlkID0gInF1ZXJ5XyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgc29ja2V0LnNlbmQocXVlcmllcy5hdXRob3IucmVwbGFjZSgiPEk+IiwgcXVlcnlpZCkucmVwbGFjZSgiPFA+IiwgcHViaykpCgogICAgICAgIHJldHVybiAoYXdhaXQgd2FpdHJlcyhxdWVyeWlkKSkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gc2F2ZShzb2NrZXQsIGV2ZW50ZGIsIHEsIHF0eXBlLCByZWFjdGVkLCBhcHBlbmQpewogICAgICAgIGxldCBldmVudHB1YmtleXMgPSBbXQogICAgICAgIGNvbnN0IGV2ZW50cyA9IGV2ZW50ZGIuZmlsdGVyKG8gPT4gewogICAgICAgICAgaWYocS5sZW5ndGggPiAwKXsKICAgICAgICAgICAgZm9yKGxldCB3b3JkIG9mIHEuc3BsaXQoIiAiKSl7CiAgICAgICAgICAgICAgaWYoby5jb250ZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZih3b3JkLnRvTG93ZXJDYXNlKCkpID09IC0xKXsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIHJldHVybiB0cnVlCiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBsZXQgcmVzdWx0cyA9IFtdCiAgICAgICAgY29uc3QgZXZlbnRpZHMgPSBldmVudHMubWFwKGUgPT4gZS5pZCkKICAgICAgICBsZXQgbmV3dXJscyA9IFtdCiAgICAgICAgCiAgICAgICAgZm9yKGxldCBldmVudCBvZiBldmVudHMpewogICAgICAgICAgbGV0IHVybHNtYXRjaCA9IFtdCiAgICAgICAgICBxdHlwZSAhPSAidmlkZW8iICYmIHVybHNtYXRjaC5wdXNoKC4uLihldmVudC5jb250ZW50Lm1hdGNoKGltZ3JlZ2V4KSB8fCBbXSkpCiAgICAgICAgICBxdHlwZSAhPSAiaW1hZ2UiICYmIHVybHNtYXRjaC5wdXNoKC4uLihldmVudC5jb250ZW50Lm1hdGNoKHZpZGVvcmVnZXgpIHx8IFtdKSkKICAgICAgICAgIHVybHNtYXRjaCA9IHVybHNtYXRjaC5maWx0ZXIodXJsID0+ICF1cmxzLmluY2x1ZGVzKHVybCkpCgogICAgICAgICAgaWYodXJsc21hdGNoLmxlbmd0aCA+IDApewogICAgICAgICAgICBuZXd1cmxzLnB1c2goewogICAgICAgICAgICAgIGV2ZW50OiBldmVudCwKICAgICAgICAgICAgICB1cmxzOiB1cmxzbWF0Y2gKICAgICAgICAgICAgfSkKICAgICAgICAgICAgCiAgICAgICAgICAgIHVybHMucHVzaCguLi51cmxzbWF0Y2gpCiAgICAgICAgICAgIGV2ZW50cHVia2V5cy5pbmNsdWRlcyhldmVudC5wdWJrZXkpIHx8IGV2ZW50cHVia2V5cy5wdXNoKGV2ZW50LnB1YmtleSkKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbG9nKCJxdWVyeSBtZXRhIiwgc29ja2V0LnVybCkKICAgICAgICBsZXQgbWV0YWV2ZW50cyA9IGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzBdLCBudWxsLCBldmVudHB1YmtleXMpCiAgICAgICAgCiAgICAgICAgZm9yKGxldCBlbnRyeSBvZiBuZXd1cmxzKXsKICAgICAgICAgIGZvcihsZXQgdXJsIG9mIGVudHJ5LnVybHMpewogICAgICAgICAgICByZXN1bHRzLnB1c2goewogICAgICAgICAgICAgIHJlYWN0ZWQ6IHJlYWN0ZWQgfHwgbGlrZXMuaW5jbHVkZXMoZW50cnkuZXZlbnQuaWQpLCAKICAgICAgICAgICAgICB1cmw6IHVybCwgCiAgICAgICAgICAgICAgZXZlbnQ6IGVudHJ5LmV2ZW50LCAKICAgICAgICAgICAgICBiZWNoMzJpZDogYmVjaDMyLmVuY29kZSgibm90ZSIsIGZyb21IZXhTdHJpbmcoZW50cnkuZXZlbnQuaWQpKSwKICAgICAgICAgICAgICBtZXRhOiBtZXRhZXZlbnRzLmZpbmQobyA9PiBvLnB1YmtleSA9PSBlbnRyeS5ldmVudC5wdWJrZXkpCiAgICAgICAgICAgIH0pCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxvZygic2F2ZSByZXMiLCByZXN1bHRzLmxlbmd0aCwgc29ja2V0LnVybCkKICAgICAgICB1cGRhdGVjb250ZW50KHJlc3VsdHMsIHEsIGFwcGVuZCkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlY29udGVudChyZXN1bHRzLCBxLCBhcHBlbmQpewogICAgICAgIHJlc3VsdHMucmV2ZXJzZSgpLmZvckVhY2goaXRlbSA9PiB7CiAgICAgICAgICBjb25zdCB0eXBlID0gaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleCkgJiYgInZpZGVvIiB8fCAicGljIgogICAgICAgICAgY29uc3QgdGV4dCA9IChxIHx8ICJ2aWV3IG5vdGUiKS5zdWJzdHJpbmcoLTMwKQogICAgICAgICAgY29uc3QgaWQgPSAiaXRlbV8iICsgKCsraWRjb3VudGVyKQogICAgICAgICAgY29uc3QgY29udGVudGVsZW1lbnRzID0gJzxkaXYgY2xhc3M9InR5cGUiPicgKyB0eXBlICsgJzwvZGl2PjxhIGNsYXNzPSJsaWtlJyArIChpdGVtLnJlYWN0ZWQgPyAnIHJlYWN0ZWQnIDogJycpICsgJyIgZGF0YS1pdGVtLWlkPSInICsgaWQgKyAKICAgICAgICAgICAgJyIgaHJlZj0iIyI+JyArIHFzKCIjdGVtcGxhdGUgLmhlYXJ0c3ZnIikub3V0ZXJIVE1MICsgJzwvYT48YSBjbGFzcz0icXVlcnkiIGhyZWY9IicgKyBwcm90b2NvbCArIAogICAgICAgICAgICBpdGVtLmJlY2gzMmlkICsgJyI+JyArIHRleHQgKyAnPC9hPicKICAgICAgICAgIGxldCByb290ID0gbnVsbAogICAgICAgICAgbGV0IHYgPSBudWxsCiAgICAgICAgICAKICAgICAgICAgIGlmKGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpKXsKICAgICAgICAgICAgcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCiAgICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgidmlkZW8tY29udGFpbmVyIikKICAgICAgICAgICAgcm9vdC5pbm5lckhUTUwgPSBjb250ZW50ZWxlbWVudHMKICAgICAgICAgICAgCiAgICAgICAgICAgIHYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpCiAgICAgICAgICAgIHZbImRhdGEtaXRlbS1pZCJdID0gaWQKICAgICAgICAgICAgdi5wcmVsb2FkID0gIm5vbmUiCiAgICAgICAgICAgIHYubG9vcCA9IHRydWUKICAgICAgICAgICAgdi5wbGF5c2lubGluZSA9ICIiCiAgICAgICAgICAgIC8vcm9vdC5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgICAgICAKICAgICAgICAgICAgdi5vbmNhbnBsYXkgPSBhc3luYyBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICBjb25zdCBhc3BlY3QgPSB0aGlzLnZpZGVvV2lkdGggLyB0aGlzLnZpZGVvSGVpZ2h0CiAgICAgICAgICAgICAgaWYoYXNwZWN0ID4gMSl7CiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLndpZHRoID0gKGFzcGVjdCAqIDEwMCkgKyAiJSIKICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUuaGVpZ2h0ID0gKDEgLyBhc3BlY3QgKiAxMDApICsgIiUiCiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLm1hcmdpblRvcCA9IC0oKDEgLyBhc3BlY3QgKiAxMDAgLSAxMDApIC8gMikgKyAiJSIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgdXBkYXRldmlkZW9wbGF5KHRoaXMpCiAgICAgICAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgICAgICAgIH0KICAgICAgCiAgICAgICAgICAgIGNvbnN0IGV4dCA9IGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpWzFdCiAgICAgICAgICAgIHYuaW5uZXJIVE1MID0gJzxzb3VyY2Ugc3JjPSInICsgaXRlbS51cmwgKyAnIiB0eXBlPSJ2aWRlby8nICsgZXh0ICsgJyI+PC9zb3VyY2U+JwogICAgICAgICAgICAKICAgICAgICAgICAgcm9vdC5hcHBlbmQodikKICAgICAgICAgIH1lbHNlewogICAgICAgICAgICByb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpCiAgICAgICAgICAgIHJvb3QuaHJlZiA9ICIjIgogICAgICAgICAgICByb290LmlubmVySFRNTCA9IGNvbnRlbnRlbGVtZW50cwogICAgICAgICAgICAgIAogICAgICAgICAgICBpZih0eXBlID09ICJwaWMiKXsKICAgICAgICAgICAgICByb290LmlubmVySFRNTCArPSAnPGltZyBvbmxvYWQ9ImdpZChcJycgKyBpZCArICdcJykuc3R5bGUuZGlzcGxheT1cJ2Jsb2NrXCciIHNyYz0iJyArIGl0ZW0udXJsICsgJyIvPicKICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgcm9vdC5pbm5lckhUTUwgKz0gJzxzcGFuIGNsYXNzPSJmaWxlIj4nICsgaXRlbS51cmwgKyAnPC9zcGFuPicKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICByb290LmlkID0gaWQKICAgICAgICAgIHJvb3RbImRhdGEtaXRlbSJdID0gaXRlbQogICAgICAgICAgcm9vdFsiZGF0YS1ldmVudCJdID0gaXRlbS5ldmVudAogICAgICAgICAgcm9vdFsiZGF0YS1xdWVyeSJdID0gcQogICAgICAgICAgcm9vdFsiZGF0YS10ZXh0Il0gPSB0ZXh0CiAgICAgICAgICAKICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCh0eXBlKQogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJpdGVtIikKICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgic2hvdyIpCiAgICAgICAgICAKICAgICAgICAgIGlmKGl0ZW0ucmVhY3RlZCl7CiAgICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHFzKCIjcGljcyIpW2FwcGVuZCAmJiAiYXBwZW5kIiB8fCAicHJlcGVuZCJdKHJvb3QpCiAgICAgICAgICAKICAgICAgICAgIGlmKHYpewogICAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkodikKICAgICAgICAgIH0KICAgICAgICB9KQoKICAgICAgICBpZihhY3RpdmUoKSA9PSBudWxsKXsKICAgICAgICAgIHFzKCIjcGljcyAuaXRlbSIpPy5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGlkZW1lZGlhKCl7CiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICJzY3JvbGwiCiAgICAgICAgcXNhKCIjbWVkaWEtY29udGFpbmVyLCAjcGljLCAjbWVkaWEtZm9vdGVyIikuZm9yRWFjaChuID0+IG4uc3R5bGUuZGlzcGxheSA9ICJub25lIikKICAgICAgICBnaWQoInBpYy1saWtlIikuY2xhc3NMaXN0LnJlbW92ZSgicmVhY3RlZCIpCiAgICAgICAgaGlkZXZpZGVvKCkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGlkZXZpZGVvKCl7CiAgICAgICAgY29uc3QgdiA9IHFzKCIjbWVkaWEtY29udGFpbmVyIHZpZGVvIikKICAgICAgICAKICAgICAgICBpZih2KXsKICAgICAgICAgIHYubXV0ZWQgPSB0cnVlCiAgICAgICAgICBnaWQodlsiZGF0YS1pdGVtLWlkIl0pLmFwcGVuZENoaWxkKHYpCiAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkodikKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHdhaXRyZXMoa2V5KXsKICAgICAgICBsZXQgZXZlbnRzID0gW10KICAgICAgICAKICAgICAgICBsZXQgcmVzaGFuZGxlciA9IGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7CiAgICAgICAgICB0aGlzLmhhbmRsZSA9IGZ1bmN0aW9uKHJlcyl7CiAgICAgICAgICAgIHRoaXMua2V5ID0ga2V5CiAgICAgICAgICAgIGxldCBvID0gSlNPTi5wYXJzZShyZXMuZGF0YSkKICAgICAgICAgICAgaWYob1sxXSA9PSBrZXkpewogICAgICAgICAgICAgIGlmKG9bMF0gPT0gIkVPU0UiKXsKICAgICAgICAgICAgICAgIHJlc29sdmUoZXZlbnRzKQogICAgICAgICAgICAgICAgcmVzaGFuZGxlcnMuc3BsaWNlKHJlc2hhbmRsZXJzLmluZGV4T2YodGhpcyksIDEpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGV2ZW50cy5wdXNoKG9bMl0pCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgICAKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAgICAgcmVzaGFuZGxlcnMucHVzaChuZXcgcmVzaGFuZGxlcihyZXNvbHZlLCByZWplY3QpKQogICAgICAgIH0pCiAgICAgIH0KICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBjaGVja3VwZGF0ZShzb2NrZXQpewogICAgICAgIGNvbnN0IHVwZGF0ZXNyZXMgPSBhd2FpdCBxdWVyeXB1YmtleShzb2NrZXQsIHVwZGF0ZXNwdWJrZXkpCiAgICAgICAgY29uc3QgdXBkYXRlbm90ZSA9IHVwZGF0ZXNyZXMuZmluZChuID0+IG4uY29udGVudC5tYXRjaCgvXmh0dHBzXDpcL1wvLykpCiAgICAgICAgCiAgICAgICAgaWYoIXVwZGF0ZW5vdGUpewogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGFnZSA9IE1hdGgucm91bmQoKERhdGUubm93KCkgLyAxMDAwIC0gdXBkYXRlbm90ZS5jcmVhdGVkX2F0KSAvIDM2MDAgLyAyNCkKICAgICAgICBjb25zdCBub3RlaWQgPSBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyh1cGRhdGVub3RlLmlkKSkKICAgICAgICBxcygiI3JlbGVhc2UiKS5ocmVmID0gcHJvdG9jb2wgKyBub3RlaWQKICAgICAgICBxcygiI3JlbGVhc2UiKS5pbm5lclRleHQgPSAoYWdlID09IDAgJiYgInRvZGF5IiB8fCBhZ2UgKyAiIGRheShzKSBhZ28iKQogICAgICB9CgogICAgICBmdW5jdGlvbiBzbGVlcChtcyl7CiAgICAgICAgcmV0dXJuIG5ldyBmdW5jdGlvbigpewogICAgICAgICAgbGV0IHRpbWVvdXQgPSBudWxsCiAgICAgICAgICBsZXQgciA9IG51bGwKICAgICAgICAgIAogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcHJvbWlzZTogbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXsKICAgICAgICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIG1zKQogICAgICAgICAgICAgIHIgPSByZXNvbHZlCiAgICAgICAgICAgIH0pLAogICAgICAgICAgICByZXNvbHZlOiBmdW5jdGlvbigpewogICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KQogICAgICAgICAgICAgIHIoKQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzaG93KGlkKXsKICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiIKICAgICAgICBjb25zdCBpdGVtID0gZ2lkKGlkKVsiZGF0YS1pdGVtIl0KICAgICAgICBjb25zdCBtZWRpYSA9IGdpZCgibWVkaWEtY29udGFpbmVyIikKICAgICAgICBjb25zdCBwaWMgPSBnaWQoInBpYyIpCgogICAgICAgIGlmKGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpKXsKICAgICAgICAgIHBpYy5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiCiAgICAgICAgICBjb25zdCB2ID0gZ2lkKGlkKS5xdWVyeVNlbGVjdG9yKCJ2aWRlbyIpCiAgICAgICAgICBxcygiI21lZGlhLWNvbnRhaW5lciIpLmFwcGVuZENoaWxkKHYpCiAgICAgICAgICB2Lm11dGVkID0gZmFsc2UKICAgICAgICAgIHYucGxheSgpCiAgICAgICAgfWVsc2V7CiAgICAgICAgICBwaWMuc3JjID0gaXRlbS51cmwKICAgICAgICAgIHBpYy5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihpdGVtLm1ldGEpewogICAgICAgICAgY29uc3QgbWV0YWNvbnRlbnQgPSBKU09OLnBhcnNlKGl0ZW0ubWV0YS5jb250ZW50KQogICAgICAgICAgY29uc3QgbmFtZSA9IG1ldGFjb250ZW50LmRpc3BsYXlfbmFtZSB8fCBtZXRhY29udGVudC5uYW1lCiAgICAgICAgICBxcygiI3BpYy11c2VyIikuaHJlZiA9IHByb3RvY29sICsgYmVjaDMyLmVuY29kZSgibnB1YiIsIGZyb21IZXhTdHJpbmcoaXRlbS5tZXRhLnB1YmtleSkpCiAgICAgICAgICBxcygiI3BpYy11c2VyIikuaW5uZXJUZXh0ID0gbmFtZQogICAgICAgIH0KCiAgICAgICAgZ2lkKCJwaWMtbGlrZSIpWyJkYXRhLWl0ZW0taWQiXSA9IGlkCiAgICAgICAgZ2lkKCJtZWRpYS1mb290ZXIiKVsiZGF0YS1ldmVudCJdID0gaXRlbS5ldmVudAoKICAgICAgICBpZihpdGVtLnJlYWN0ZWQgfHwgcmVhY3RlZC5pbmNsdWRlcyhpZCkpewogICAgICAgICAgZ2lkKCJwaWMtbGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBhID0gcXMoIiNwaWMtcXVlcnkiKQogICAgICAgIGEuaHJlZiA9IHByb3RvY29sICsgaXRlbS5iZWNoMzJpZAogICAgICAgIGEuaW5uZXJUZXh0ID0gZ2lkKGlkKVsiZGF0YS10ZXh0Il0KICAgICAgICAgIAogICAgICAgIG1lZGlhLnN0eWxlLmRpc3BsYXkgPSBnaWQoIm1lZGlhLWZvb3RlciIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGNvbm5jb3VudCgpewogICAgICAgIHJldHVybiBzb2NrZXRzLmZpbHRlcihyID0+IHIucmVhZHlTdGF0ZSA9PSAxKS5sZW5ndGgKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gZGlzY29ubmVjdCgpewogICAgICAgIGZvcihsZXQgc29ja2V0IG9mIHNvY2tldHMpewogICAgICAgICAgc29ja2V0LmNsb3NlKCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc29ja2V0cy5zcGxpY2UoMCkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gbG9nKG1zZyl7CiAgICAgICAgbGV0IHNjcm9sbCA9IHFzKCIjbG9ncyIpLnNjcm9sbFRvcCA9PSBxcygiI2xvZ3MiKS5zY3JvbGxUb3BNYXgKICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKQogICAgICAgIGRpdi5pbm5lclRleHQgPSBBcnJheS5mcm9tKGFyZ3VtZW50cykuam9pbigiICIpCiAgICAgICAgcXMoIiNsb2dzIikuYXBwZW5kKGRpdikKICAgICAgICAKICAgICAgICBpZihzY3JvbGwpewogICAgICAgICAgcXMoIiNsb2dzIikuc2Nyb2xsVG8oMCwgcXMoIiNsb2dzIikuc2Nyb2xsVG9wTWF4KQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gY29ubmVjdCh1cmwpewogICAgICAgIGxvZygiY29ubmVjdGluZyIsIHVybCkKICAgICAgICBsZXQgc29ja2V0ID0gbmV3IFdlYlNvY2tldCh1cmwpCiAgICAgICAgCiAgICAgICAgc29ja2V0Lm9ubWVzc2FnZSA9IG1lc3NhZ2UgPT4gcmVzaGFuZGxlcnMuZm9yRWFjaChyaCA9PiByaC5oYW5kbGUobWVzc2FnZSkpCiAgICAgICAgCiAgICAgICAgc29ja2V0Lm9uY2xvc2UgPSBhc3luYyBmdW5jdGlvbigpewogICAgICAgICAgc29ja2V0cy5zcGxpY2Uoc29ja2V0cy5pbmRleE9mKHNvY2tldCksIDEpCiAgICAgICAgICBxcygiI2Nvbm5jb3VudCIpLmlubmVyVGV4dCA9IGNvbm5jb3VudCgpICsgKHByaW1hbHNvY2tldCAmJiAxKQogICAgICAgICAgbG9nKCJkaXNjb25uZWN0ZWQiLCB0aGlzLnVybCwgY29ubmNvdW50KCkpCiAgICAgICAgICBhd2FpdCBzbGVlcCgxMDAwKS5wcm9taXNlCiAgICAgICAgICBjb25uZWN0KHRoaXMudXJsKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXQub25vcGVuID0gZnVuY3Rpb24oKXsKICAgICAgICAgIHFzKCIjY29ubmNvdW50IikuaW5uZXJUZXh0ID0gY29ubmNvdW50KCkgKyAocHJpbWFsc29ja2V0ICYmIDEpCiAgICAgICAgICBsb2coImNvbm5lY3RlZCIsIHRoaXMudXJsLCBjb25uY291bnQoKSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIHNvY2tldAogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgYXN5bmMgKCkgPT4gewogICAgICAgIHByaW1hbHNvY2tldCA9IGNvbm5lY3QoIndzczovL2NhY2hlMy5wcmltYWwubmV0L2NhY2hlMTciKQogICAgICAgIHByaW1hbHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIiwgZnVuY3Rpb24oKXsKICAgICAgICAgIHByaW1hbGdsb2JhbCh0aGlzKQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgcHJpbWFsc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIiwgZnVuY3Rpb24oKXsKICAgICAgICAgIHByaW1hbHNvY2tldCA9IG51bGwKICAgICAgICB9KQogICAgICAgIAogICAgICAgIGZvcihsZXQgdXJsIG9mIHJlbGF5cygpKXsKICAgICAgICAgIGNvbnN0IHNvY2tldCA9IGNvbm5lY3QodXJsKQogICAgICAgICAgc29ja2V0cy5wdXNoKHNvY2tldCkKICAgICAgICAgIAogICAgICAgICAgc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoIm9wZW4iLCBmdW5jdGlvbigpewogICAgICAgICAgICBjaGVja3VwZGF0ZSh0aGlzKQogICAgICAgICAgICBxdWVyeSh0aGlzKQogICAgICAgICAgfSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgYXdhaXQgc2xlZXAoMTAwKS5wcm9taXNlCiAgICAgICAgCiAgICAgICAgaWYoaGFza2V5KCkpewogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJub3N0ciIpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgZm9yKGxldCBjIG9mIGNvbG9wdHMpewogICAgICAgIGRvY3VtZW50LndyaXRlKCc8c3R5bGU+JyArIGNvbHNjc3MuaW5uZXJUZXh0LnJlcGxhY2UoL1wkXHtjb2xzXH0vZywgYykgKyAnPC9zdHlsZT4nKQogICAgICB9CiAgICA8L3NjcmlwdD4KICA8L2JvZHk+CjwvaHRtbD4K