{"data":"77u/PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9InB0LUJSIj4KPGhlYWQ+CjxtZXRhIGNoYXJzZXQ9IlVURi04Ij4KPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiPgo8dGl0bGU+V2hhdHNBcHAgLSBNZXNxdWl0YSAoTWVnYSk8L3RpdGxlPgo8bGluayByZWw9InByZWNvbm5lY3QiIGhyZWY9Imh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20iPgo8bGluayBocmVmPSJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PUludGVyOndnaHRANDAwOzUwMDs2MDAmZGlzcGxheT1zd2FwIiByZWw9InN0eWxlc2hlZXQiPgo8c3R5bGU+CiAgOnJvb3QgewogICAgLS13YS1ncmVlbi1kYXJrOiAjMDc1ZTU0OwogICAgLS13YS1ncmVlbjogIzEyOGM3ZTsKICAgIC0td2EtZ3JlZW4tbGlnaHQ6ICMyNWQzNjY7CiAgICAtLXdhLWdyZWVuLWhlYWRlcjogIzA3NWU1NDsKICAgIC0td2EtYmc6ICNlNWRkZDU7CiAgICAtLXdhLWJnLXBhdHRlcm46ICNkOWQyYzU7CiAgICAtLXdhLWlucHV0LWJnOiAjZmZmZmZmOwogICAgLS13YS1idWJibGUtb3V0OiAjZGNmOGM2OwogICAgLS13YS1idWJibGUtaW46ICNmZmZmZmY7CiAgICAtLXdhLXRleHQ6ICMzMDMwMzA7CiAgICAtLXdhLXRleHQtbGlnaHQ6ICM2Njc3ODE7CiAgICAtLXdhLXRpbWU6ICM2Njc3ODE7CiAgICAtLXdhLWVuY3J5cHQtYmc6ICNmZGY0YzU7CiAgICAtLXdhLWVuY3J5cHQtdGV4dDogIzU0NjU2ZjsKICAgIC0td2EtaGVhZGVyLWljb246ICNhMGI0YmM7CiAgICAtLXdhLW1pYy1iZzogIzAwYTg4NDsKICAgIC0td2EtYmx1ZS10aWNrOiAjNTNiZGViOwogIH0KCiAgKiB7IG1hcmdpbjogMDsgcGFkZGluZzogMDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgfQoKICBib2R5IHsNCiAgICBmb250LWZhbWlseTogJ0ludGVyJywgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCBzYW5zLXNlcmlmOw0KICAgIGJhY2tncm91bmQ6ICMwYTBhMGE7DQogICAgZGlzcGxheTogZmxleDsNCiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCiAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KICAgIGhlaWdodDogMTAwdmg7DQogICAgaGVpZ2h0OiAxMDBkdmg7DQogICAgb3ZlcmZsb3c6IGhpZGRlbjsNCiAgICBwb3NpdGlvbjogZml4ZWQ7DQogICAgaW5zZXQ6IDA7DQogIH0NCg0KICAucGhvbmUtZnJhbWUgew0KICAgIHdpZHRoOiAxMDAlOw0KICAgIG1heC13aWR0aDogNDIwcHg7DQogICAgaGVpZ2h0OiAxMDB2aDsNCiAgICBoZWlnaHQ6IDEwMGR2aDsNCiAgICBtYXgtaGVpZ2h0OiA3ODBweDsNCiAgICBiYWNrZ3JvdW5kOiB2YXIoLS13YS1iZyk7DQogICAgZGlzcGxheTogZmxleDsNCiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOw0KICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsNCiAgICBvdmVyZmxvdzogaGlkZGVuOw0KICAgIGJveC1zaGFkb3c6IDAgMjBweCA4MHB4IHJnYmEoMCwwLDAsMC41KTsNCiAgfQ0KDQogIEBtZWRpYSAobWF4LXdpZHRoOiA0NDBweCkgew0KICAgIC5waG9uZS1mcmFtZSB7DQogICAgICBtYXgtd2lkdGg6IDEwMCU7DQogICAgICBtYXgtaGVpZ2h0OiAxMDB2aDsNCiAgICAgIG1heC1oZWlnaHQ6IDEwMGR2aDsNCiAgICAgIGJveC1zaGFkb3c6IG5vbmU7DQogICAgfQ0KICB9CgogIC8qIMOi4oCd4oKsw6LigJ3igqwgSEVBREVSIMOi4oCd4oKsw6LigJ3igqwgKi8KICAuY2hhdC1oZWFkZXIgewogICAgYmFja2dyb3VuZDogdmFyKC0td2EtZ3JlZW4taGVhZGVyKTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgcGFkZGluZzogOHB4IDEycHg7CiAgICBnYXA6IDEwcHg7CiAgICBtaW4taGVpZ2h0OiA1NnB4OwogICAgZmxleC1zaHJpbms6IDA7CiAgICB6LWluZGV4OiAxMDsKICB9CgogIC5oZWFkZXItYmFjayB7CiAgICBjb2xvcjogI2ZmZjsKICAgIGZvbnQtc2l6ZTogMjBweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHBhZGRpbmc6IDRweDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogIH0KCiAgLmhlYWRlci1hdmF0YXIgewogICAgd2lkdGg6IDQwcHg7CiAgICBoZWlnaHQ6IDQwcHg7CiAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICBiYWNrZ3JvdW5kOiAjY2ZkOGRjOwogICAgZmxleC1zaHJpbms6IDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICB9CgogIC5oZWFkZXItYXZhdGFyIHN2ZyB7CiAgICB3aWR0aDogMjZweDsKICAgIGhlaWdodDogMjZweDsKICAgIGZpbGw6ICNmZmY7CiAgfQoKICAuaGVhZGVyLWluZm8gewogICAgZmxleDogMTsKICAgIG1pbi13aWR0aDogMDsKICB9CgogIC5oZWFkZXItbmFtZSB7CiAgICBjb2xvcjogI2ZmZjsKICAgIGZvbnQtc2l6ZTogMTZweDsKICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICBsaW5lLWhlaWdodDogMS4yOwogIH0KCiAgLmhlYWRlci1zdGF0dXMgewogICAgY29sb3I6IHZhcigtLXdhLWhlYWRlci1pY29uKTsKICAgIGZvbnQtc2l6ZTogMTIuNXB4OwogICAgbGluZS1oZWlnaHQ6IDEuMzsKICB9CgogIC5oZWFkZXItYWN0aW9ucyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiAxOHB4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICB9CgogIC5oZWFkZXItYWN0aW9ucyBzdmcgewogICAgd2lkdGg6IDIycHg7CiAgICBoZWlnaHQ6IDIycHg7CiAgICBmaWxsOiB2YXIoLS13YS1oZWFkZXItaWNvbik7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOiBmaWxsIDAuMTVzOwogIH0KCiAgLmhlYWRlci1hY3Rpb25zIHN2Zzpob3ZlciB7CiAgICBmaWxsOiAjZmZmOwogIH0KCiAgLyogw6LigJ3igqzDouKAneKCrCBFTkNSWVBUSU9OIEJBTk5FUiDDouKAneKCrMOi4oCd4oKsICovCiAgLmVuY3J5cHQtYmFubmVyIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLXdhLWVuY3J5cHQtYmcpOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgcGFkZGluZzogOHB4IDQwcHg7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogdmFyKC0td2EtZW5jcnlwdC10ZXh0KTsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ7CiAgICBmbGV4LXNocmluazogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDVweDsKICB9CgogIC5lbmNyeXB0LWJhbm5lciBzdmcgewogICAgd2lkdGg6IDEzcHg7CiAgICBoZWlnaHQ6IDEzcHg7CiAgICBmaWxsOiB2YXIoLS13YS1lbmNyeXB0LXRleHQpOwogICAgZmxleC1zaHJpbms6IDA7CiAgfQoKICAvKiDDouKAneKCrMOi4oCd4oKsIENIQVQgQVJFQSDDouKAneKCrMOi4oCd4oKsICovDQogIC5jaGF0LWFyZWEgew0KICAgIGZsZXg6IDE7DQogICAgbWluLWhlaWdodDogMDsNCiAgICBvdmVyZmxvdy15OiBhdXRvOw0KICAgIHBhZGRpbmc6IDhweCAxMnB4Ow0KICAgIGRpc3BsYXk6IGZsZXg7DQogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsNCiAgICBnYXA6IDNweDsNCiAgICBwb3NpdGlvbjogcmVsYXRpdmU7DQogIH0KCiAgLmNoYXQtYXJlYTo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgd2lkdGg6IDVweDsKICB9CgogIC5jaGF0LWFyZWE6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsMC4yKTsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgfQoKICAvKiBXaGF0c0FwcCBkb29kbGUgYmFja2dyb3VuZCAqLwogIC5jaGF0LWFyZWE6OmJlZm9yZSB7CiAgICBjb250ZW50OiAnJzsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzIwMCcgaGVpZ2h0PScyMDAnIHZpZXdCb3g9JzAgMCAyMDAgMjAwJyUzRSUzQ2cgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjNjOWMxYjUnIHN0cm9rZS13aWR0aD0nMC44JyBvcGFjaXR5PScwLjQ1JyUzRSUzQ3BhdGggZD0nTTMwIDIwbDUgMTAtNSAxMCcvJTNFJTNDY2lyY2xlIGN4PSc2MCcgY3k9JzMwJyByPSc4Jy8lM0UlM0NwYXRoIGQ9J005MCAxNXYxNWgxMCcvJTNFJTNDcmVjdCB4PScxMjAnIHk9JzE4JyB3aWR0aD0nMTQnIGhlaWdodD0nMTQnIHJ4PScyJy8lM0UlM0NwYXRoIGQ9J00xNjAgMjBsOCA4LTggOCcvJTNFJTNDY2lyY2xlIGN4PScyNScgY3k9JzYwJyByPSc1Jy8lM0UlM0NwYXRoIGQ9J001MCA1MGwxMCA1LTEwIDUnLyUzRSUzQ3BhdGggZD0nTTgwIDU1aDE1Jy8lM0UlM0NjaXJjbGUgY3g9JzExNScgY3k9JzU4JyByPSc3Jy8lM0UlM0NwYXRoIGQ9J00xNTAgNTBsNSAxMicvJTNFJTNDcGF0aCBkPSdNMTc1IDU1bDUtNSA1IDUnLyUzRSUzQ3BhdGggZD0nTTIwIDkwbDgtNSA4IDUnLyUzRSUzQ2NpcmNsZSBjeD0nNTUnIGN5PSc5NScgcj0nNicvJTNFJTNDcGF0aCBkPSdNODUgODh2MTQnLyUzRSUzQ3JlY3QgeD0nMTEwJyB5PSc4NScgd2lkdGg9JzEyJyBoZWlnaHQ9JzEyJyByeD0nNicvJTNFJTNDcGF0aCBkPSdNMTQ1IDkwaDEyJy8lM0UlM0NwYXRoIGQ9J00xNzAgODhsNiA2LTYgNicvJTNFJTNDY2lyY2xlIGN4PSczMCcgY3k9JzEzMCcgcj0nNCcvJTNFJTNDcGF0aCBkPSdNNTUgMTIwbDEwIDEwLTEwIDEwJy8lM0UlM0NwYXRoIGQ9J005MCAxMjVoOHY4Jy8lM0UlM0NjaXJjbGUgY3g9JzEyNScgY3k9JzEzMicgcj0nNicvJTNFJTNDcGF0aCBkPSdNMTU1IDEyMmw4IDEwJy8lM0UlM0NwYXRoIGQ9J00xODAgMTI4bDUgNS01IDUnLyUzRSUzQ3BhdGggZD0nTTIwIDE2MGw2IDgtNiA4Jy8lM0UlM0NjaXJjbGUgY3g9JzU1JyBjeT0nMTY1JyByPSc1Jy8lM0UlM0NwYXRoIGQ9J004NSAxNTh2MTJoOCcvJTNFJTNDcmVjdCB4PScxMTUnIHk9JzE1NScgd2lkdGg9JzEwJyBoZWlnaHQ9JzEwJyByeD0nMicvJTNFJTNDcGF0aCBkPSdNMTUwIDE2MGw2IDYtNiA2Jy8lM0UlM0NjaXJjbGUgY3g9JzE4MCcgY3k9JzE2Micgcj0nNCcvJTNFJTNDL2clM0UlM0Mvc3ZnJTNFIik7CiAgICBiYWNrZ3JvdW5kLXNpemU6IDIwMHB4IDIwMHB4OwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB6LWluZGV4OiAwOwogIH0KCiAgLmNoYXQtYXJlYSA+ICogewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgei1pbmRleDogMTsKICB9CgogIC8qIMOi4oCd4oKsw6LigJ3igqwgQlVCQkxFUyDDouKAneKCrMOi4oCd4oKsICovCiAgLm1zZy1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIG1heC13aWR0aDogODIlOwogICAgYW5pbWF0aW9uOiBtc2dJbiAwLjI1cyBlYXNlLW91dDsKICB9CgogIEBrZXlmcmFtZXMgbXNnSW4gewogICAgZnJvbSB7IG9wYWNpdHk6IDA7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSg4cHgpIHNjYWxlKDAuOTcpOyB9CiAgICB0byB7IG9wYWNpdHk6IDE7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKSBzY2FsZSgxKTsgfQogIH0KCiAgLm1zZy1yb3cub3V0IHsKICAgIGFsaWduLXNlbGY6IGZsZXgtZW5kOwogIH0KCiAgLm1zZy1yb3cuaW4gewogICAgYWxpZ24tc2VsZjogZmxleC1zdGFydDsKICB9CgogIC5idWJibGUgewogICAgcGFkZGluZzogNnB4IDhweCA0cHg7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBmb250LXNpemU6IDE0LjJweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgY29sb3I6IHZhcigtLXdhLXRleHQpOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgbWluLXdpZHRoOiA4MHB4OwogIH0KCiAgLm1zZy1yb3cub3V0IC5idWJibGUgewogICAgYmFja2dyb3VuZDogdmFyKC0td2EtYnViYmxlLW91dCk7CiAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMDsKICB9CgogIC5tc2ctcm93LmluIC5idWJibGUgewogICAgYmFja2dyb3VuZDogdmFyKC0td2EtYnViYmxlLWluKTsKICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDA7CiAgfQoKICAubXNnLXJvdy5vdXQgLmJ1YmJsZTo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICcnOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAwOwogICAgcmlnaHQ6IC04cHg7CiAgICB3aWR0aDogMDsKICAgIGhlaWdodDogMDsKICAgIGJvcmRlci1sZWZ0OiA4cHggc29saWQgdmFyKC0td2EtYnViYmxlLW91dCk7CiAgICBib3JkZXItYm90dG9tOiA4cHggc29saWQgdHJhbnNwYXJlbnQ7CiAgfQoKICAubXNnLXJvdy5pbiAuYnViYmxlOjpiZWZvcmUgewogICAgY29udGVudDogJyc7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDA7CiAgICBsZWZ0OiAtOHB4OwogICAgd2lkdGg6IDA7CiAgICBoZWlnaHQ6IDA7CiAgICBib3JkZXItcmlnaHQ6IDhweCBzb2xpZCB2YXIoLS13YS1idWJibGUtaW4pOwogICAgYm9yZGVyLWJvdHRvbTogOHB4IHNvbGlkIHRyYW5zcGFyZW50OwogIH0KCiAgLmJ1YmJsZS10ZXh0IHsKICAgIG1hcmdpbi1yaWdodDogNTJweDsKICB9CgogIC5idWJibGUtbWV0YSB7CiAgICBmbG9hdDogcmlnaHQ7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogM3B4OwogICAgbWFyZ2luLXRvcDogLTEycHg7CiAgICBtYXJnaW4tbGVmdDogOHB4OwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgdG9wOiA2cHg7CiAgfQoKICAuYnViYmxlLXRpbWUgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLXdhLXRpbWUpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICB9CgogIC5idWJibGUtdGljayB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICB9CgogIC5idWJibGUtdGljayBzdmcgewogICAgd2lkdGg6IDE2cHg7CiAgICBoZWlnaHQ6IDExcHg7CiAgfQoKICAvKiDDouKAneKCrMOi4oCd4oKsIElNQUdFIElOIEJVQkJMRSDDouKAneKCrMOi4oCd4oKsICovCiAgLmJ1YmJsZS1pbWcgewogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIG1hcmdpbjogLTNweCAtNHB4IDRweDsKICB9CgogIC5idWJibGUtaW1nIGltZyB7CiAgICB3aWR0aDogMTAwJTsKICAgIG1heC13aWR0aDogMjgwcHg7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICB9CgogIC8qIMOi4oCd4oKsw6LigJ3igqwgQVVESU8gQlVCQkxFIMOi4oCd4oKsw6LigJ3igqwgKi8KICAuYnViYmxlLWF1ZGlvIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgbWluLXdpZHRoOiAyNDBweDsKICAgIHBhZGRpbmc6IDZweCA0cHg7CiAgfQoKICAuYXVkaW8tcGxheSB7CiAgICB3aWR0aDogMzZweDsKICAgIGhlaWdodDogMzZweDsKICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgIGJhY2tncm91bmQ6IHZhcigtLXdhLWdyZWVuKTsKICAgIGJvcmRlcjogbm9uZTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBmbGV4LXNocmluazogMDsKICB9CgogIC5hdWRpby1wbGF5IHN2ZyB7CiAgICB3aWR0aDogMTZweDsKICAgIGhlaWdodDogMTZweDsKICAgIGZpbGw6ICNmZmY7CiAgICBtYXJnaW4tbGVmdDogMnB4OwogIH0KCiAgLmF1ZGlvLXdhdmUgewogICAgZmxleDogMTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAycHg7CiAgICBoZWlnaHQ6IDI4cHg7CiAgfQoKICAuYXVkaW8td2F2ZSBzcGFuIHsKICAgIHdpZHRoOiAzcHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS13YS1ncmVlbik7CiAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICBvcGFjaXR5OiAwLjU7CiAgfQoKICAuYXVkaW8tZHVyYXRpb24gewogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLXdhLXRpbWUpOwogICAgZmxleC1zaHJpbms6IDA7CiAgfQoKICAvKiDDouKAneKCrMOi4oCd4oKsIERBVEUgU0VQQVJBVE9SIMOi4oCd4oKsw6LigJ3igqwgKi8KICAuZGF0ZS1zZXAgewogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgbWFyZ2luOiA4cHggMDsKICB9CgogIC5kYXRlLXNlcCBzcGFuIHsKICAgIGJhY2tncm91bmQ6ICNlMWYzZmI7CiAgICBjb2xvcjogdmFyKC0td2EtdGV4dC1saWdodCk7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBwYWRkaW5nOiA1cHggMTJweDsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIGJveC1zaGFkb3c6IDAgMXB4IDFweCByZ2JhKDAsMCwwLDAuMSk7CiAgfQoKICAvKiDDouKAneKCrMOi4oCd4oKsIFRZUElORyBJTkRJQ0FUT1Igw6LigJ3igqzDouKAneKCrCAqLwogIC50eXBpbmctaW5kaWNhdG9yIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBhbGlnbi1zZWxmOiBmbGV4LXN0YXJ0OwogICAgcGFkZGluZzogMTBweCAxNHB4OwogICAgYmFja2dyb3VuZDogdmFyKC0td2EtYnViYmxlLWluKTsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDA7CiAgICBnYXA6IDRweDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBtYXJnaW4tbGVmdDogNHB4OwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogIH0KCiAgLnR5cGluZy1pbmRpY2F0b3I6OmJlZm9yZSB7CiAgICBjb250ZW50OiAnJzsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMDsKICAgIGxlZnQ6IC04cHg7CiAgICB3aWR0aDogMDsKICAgIGhlaWdodDogMDsKICAgIGJvcmRlci1yaWdodDogOHB4IHNvbGlkIHZhcigtLXdhLWJ1YmJsZS1pbik7CiAgICBib3JkZXItYm90dG9tOiA4cHggc29saWQgdHJhbnNwYXJlbnQ7CiAgfQoKICAudHlwaW5nLWluZGljYXRvci5hY3RpdmUgewogICAgZGlzcGxheTogZmxleDsKICB9CgogIC50eXBpbmctZG90IHsKICAgIHdpZHRoOiA3cHg7CiAgICBoZWlnaHQ6IDdweDsKICAgIGJhY2tncm91bmQ6ICM4Njk2YTA7CiAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICBhbmltYXRpb246IHR5cGluZ0JvdW5jZSAxLjRzIGluZmluaXRlOwogIH0KCiAgLnR5cGluZy1kb3Q6bnRoLWNoaWxkKDIpIHsgYW5pbWF0aW9uLWRlbGF5OiAwLjJzOyB9CiAgLnR5cGluZy1kb3Q6bnRoLWNoaWxkKDMpIHsgYW5pbWF0aW9uLWRlbGF5OiAwLjRzOyB9CgogIEBrZXlmcmFtZXMgdHlwaW5nQm91bmNlIHsKICAgIDAlLCA2MCUsIDEwMCUgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7IG9wYWNpdHk6IDAuNDsgfQogICAgMzAlIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01cHgpOyBvcGFjaXR5OiAxOyB9CiAgfQoKICAvKiDDouKAneKCrMOi4oCd4oKsIElOUFVUIEJBUiDDouKAneKCrMOi4oCd4oKsICovCiAgLmlucHV0LWJhciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGZsZXgtZW5kOwogICAgcGFkZGluZzogNnB4IDZweDsKICAgIGdhcDogNnB4OwogICAgYmFja2dyb3VuZDogdmFyKC0td2EtYmcpOwogICAgZmxleC1zaHJpbms6IDA7CiAgfQoKICAuaW5wdXQtbGVmdCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiA0cHg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogIH0KCiAgLmljb24tYnRuIHsKICAgIHdpZHRoOiA0MHB4OwogICAgaGVpZ2h0OiA0MHB4OwogICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgYm9yZGVyOiBub25lOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZmxleC1zaHJpbms6IDA7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTVzOwogIH0KCiAgLmljb24tYnRuOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsMC4wNik7CiAgfQoKICAuaWNvbi1idG4gc3ZnIHsKICAgIHdpZHRoOiAyNHB4OwogICAgaGVpZ2h0OiAyNHB4OwogICAgZmlsbDogIzU0NjU2ZjsKICB9CgogIC5pbnB1dC1maWVsZC13cmFwIHsKICAgIGZsZXg6IDE7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS13YS1pbnB1dC1iZyk7CiAgICBib3JkZXItcmFkaXVzOiAyMnB4OwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsKICAgIHBhZGRpbmc6IDZweCAxMnB4OwogICAgbWluLWhlaWdodDogNDJweDsKICAgIG1heC1oZWlnaHQ6IDEyMHB4OwogIH0KCiAgLmlucHV0LWZpZWxkIHsKICAgIGZsZXg6IDE7CiAgICBib3JkZXI6IG5vbmU7CiAgICBvdXRsaW5lOiBub25lOwogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICBmb250LXNpemU6IDE1cHg7CiAgICBjb2xvcjogdmFyKC0td2EtdGV4dCk7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIHJlc2l6ZTogbm9uZTsKICAgIG1heC1oZWlnaHQ6IDEwMHB4OwogICAgbGluZS1oZWlnaHQ6IDEuMzU7CiAgICBwYWRkaW5nOiA0cHggMDsKICB9CgogIC5pbnB1dC1maWVsZDo6cGxhY2Vob2xkZXIgewogICAgY29sb3I6ICM4Njk2YTA7CiAgfQoKICAubWljLWJ0biB7CiAgICB3aWR0aDogNDRweDsKICAgIGhlaWdodDogNDRweDsKICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgIGJhY2tncm91bmQ6IHZhcigtLXdhLW1pYy1iZyk7CiAgICBib3JkZXI6IG5vbmU7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZmxleC1zaHJpbms6IDA7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTVzOwogIH0KCiAgLm1pYy1idG46aG92ZXIgewogICAgYmFja2dyb3VuZDogIzAwOGY3MjsKICB9CgogIC5taWMtYnRuIHN2ZyB7CiAgICB3aWR0aDogMjJweDsKICAgIGhlaWdodDogMjJweDsKICAgIGZpbGw6ICNmZmY7CiAgfQoKICAubWljLWJ0bi5yZWNvcmRpbmcgewogICAgYmFja2dyb3VuZDogI2U3NGMzYzsKICAgIGFuaW1hdGlvbjogbWljUHVsc2UgMXMgaW5maW5pdGU7CiAgfQoKICBAa2V5ZnJhbWVzIG1pY1B1bHNlIHsKICAgIDAlLCAxMDAlIHsgYm94LXNoYWRvdzogMCAwIDAgMCByZ2JhKDIzMSw3Niw2MCwwLjQpOyB9CiAgICA1MCUgeyBib3gtc2hhZG93OiAwIDAgMCAxMHB4IHJnYmEoMjMxLDc2LDYwLDApOyB9CiAgfQoKICAuc2VuZC1idG4gewogICAgZGlzcGxheTogbm9uZTsKICB9CgogIC5zZW5kLWJ0bi52aXNpYmxlIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgfQoKICAuc2VuZC1idG4gc3ZnIHsKICAgIGZpbGw6ICM1NDY1NmY7CiAgfQoKICAvKiDDouKAneKCrMOi4oCd4oKsIEVNT0pJIFBJQ0tFUiDDouKAneKCrMOi4oCd4oKsICovCiAgLmVtb2ppLXBhbmVsIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBiYWNrZ3JvdW5kOiAjZjBmMGYwOwogICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7CiAgICBwYWRkaW5nOiA4cHg7CiAgICBmbGV4LXNocmluazogMDsKICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgb3ZlcmZsb3cteTogYXV0bzsKICB9CgogIC5lbW9qaS1wYW5lbC5vcGVuIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogIH0KCiAgLmVtb2ppLWdyaWQgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDgsIDFmcik7CiAgICBnYXA6IDJweDsKICB9CgogIC5lbW9qaS1pdGVtIHsKICAgIGZvbnQtc2l6ZTogMjRweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHBhZGRpbmc6IDZweCAycHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTJzOwogICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgfQoKICAuZW1vamktaXRlbTpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLDAuMDgpOwogIH0KCiAgLyogw6LigJ3igqzDouKAneKCrCBBVFRBQ0hNRU5UIE1FTlUgw6LigJ3igqzDouKAneKCrCAqLwogIC5hdHRhY2gtbWVudSB7CiAgICBkaXNwbGF5OiBub25lOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgYm90dG9tOiA2MHB4OwogICAgbGVmdDogMTBweDsKICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICBib3JkZXItcmFkaXVzOiAxNHB4OwogICAgYm94LXNoYWRvdzogMCA0cHggMjRweCByZ2JhKDAsMCwwLDAuMTgpOwogICAgcGFkZGluZzogMTBweDsKICAgIHotaW5kZXg6IDEwMDsKICAgIG1pbi13aWR0aDogMTgwcHg7CiAgfQoKICAuYXR0YWNoLW1lbnUub3BlbiB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGFuaW1hdGlvbjogbWVudVBvcCAwLjJzIGVhc2Utb3V0OwogIH0KCiAgQGtleWZyYW1lcyBtZW51UG9wIHsKICAgIGZyb20geyBvcGFjaXR5OiAwOyB0cmFuc2Zvcm06IHNjYWxlKDAuOSkgdHJhbnNsYXRlWSgxMHB4KTsgfQogICAgdG8geyBvcGFjaXR5OiAxOyB0cmFuc2Zvcm06IHNjYWxlKDEpIHRyYW5zbGF0ZVkoMCk7IH0KICB9CgogIC5hdHRhY2gtaXRlbSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTJweDsKICAgIHBhZGRpbmc6IDEycHggMTRweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTJzOwogICAgZm9udC1zaXplOiAxNHB4OwogICAgY29sb3I6IHZhcigtLXdhLXRleHQpOwogIH0KCiAgLmF0dGFjaC1pdGVtOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6ICNmNWY1ZjU7CiAgfQoKICAuYXR0YWNoLWljb24gewogICAgd2lkdGg6IDQwcHg7CiAgICBoZWlnaHQ6IDQwcHg7CiAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogIH0KCiAgLmF0dGFjaC1pY29uIHN2ZyB7CiAgICB3aWR0aDogMjBweDsKICAgIGhlaWdodDogMjBweDsKICAgIGZpbGw6ICNmZmY7CiAgfQoKICAuYXR0YWNoLWljb24uaW1nIHsgYmFja2dyb3VuZDogIzdmNjZmZjsgfQogIC5hdHRhY2gtaWNvbi5kb2MgeyBiYWNrZ3JvdW5kOiAjNTE1N2FlOyB9CiAgLmF0dGFjaC1pY29uLmF1ZGlvIHsgYmFja2dyb3VuZDogI2VlNTYyMzsgfQ0KICAvKiDDouKAneKCrMOi4oCd4oKsIENIQVQgTUVOVSAodHLDqnMgcG9udGluaG9zKSDDouKAneKCrMOi4oCd4oKsICovCiAgLmNoYXQtbWVudSB7CiAgICBkaXNwbGF5OiBub25lOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiA1MnB4OwogICAgcmlnaHQ6IDEwcHg7CiAgICBiYWNrZ3JvdW5kOiAjZmZmOwogICAgYm9yZGVyLXJhZGl1czogMTRweDsKICAgIGJveC1zaGFkb3c6IDAgNHB4IDI0cHggcmdiYSgwLDAsMCwwLjE4KTsKICAgIHBhZGRpbmc6IDhweDsKICAgIHotaW5kZXg6IDExMDsKICAgIG1pbi13aWR0aDogMjEwcHg7CiAgfQoKICAuY2hhdC1tZW51Lm9wZW4gewogICAgZGlzcGxheTogYmxvY2s7CiAgICBhbmltYXRpb246IG1lbnVQb3AgMC4ycyBlYXNlLW91dDsKICB9CgogIC5jaGF0LW1lbnUtaXRlbSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTJweDsKICAgIHBhZGRpbmc6IDEycHggMTRweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTJzOwogICAgZm9udC1zaXplOiAxNHB4OwogICAgY29sb3I6IHZhcigtLXdhLXRleHQpOwogIH0KCiAgLmNoYXQtbWVudS1pdGVtOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6ICNmNWY1ZjU7CiAgfQoKICAuY2hhdC1tZW51LWl0ZW0gc3ZnIHsKICAgIHdpZHRoOiAyMHB4OwogICAgaGVpZ2h0OiAyMHB4OwogICAgZmlsbDogIzY2Nzc4MTsKICAgIGZsZXgtc2hyaW5rOiAwOwogIH0KCgogIC8qIMOi4oCd4oKsw6LigJ3igqwgUkVDT1JESU5HIEJBUiDDouKAneKCrMOi4oCd4oKsICovCiAgLnJlY29yZGluZy1iYXIgewogICAgZGlzcGxheTogbm9uZTsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBwYWRkaW5nOiA2cHggNnB4OwogICAgYmFja2dyb3VuZDogdmFyKC0td2EtYmcpOwogICAgZmxleC1zaHJpbms6IDA7CiAgICBhbmltYXRpb246IG1zZ0luIDAuMnMgZWFzZS1vdXQ7CiAgfQoKICAucmVjb3JkaW5nLWJhci5hY3RpdmUgewogICAgZGlzcGxheTogZmxleDsKICB9CgogIC5yZWMtZG90IHsKICAgIHdpZHRoOiAxMHB4OwogICAgaGVpZ2h0OiAxMHB4OwogICAgYmFja2dyb3VuZDogI2U3NGMzYzsKICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgIGFuaW1hdGlvbjogcmVjQmxpbmsgMXMgaW5maW5pdGU7CiAgfQoKICBAa2V5ZnJhbWVzIHJlY0JsaW5rIHsKICAgIDAlLCAxMDAlIHsgb3BhY2l0eTogMTsgfQogICAgNTAlIHsgb3BhY2l0eTogMC4zOyB9CiAgfQoKICAucmVjLXRpbWVyIHsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGNvbG9yOiB2YXIoLS13YS10ZXh0KTsKICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7CiAgICBtaW4td2lkdGg6IDQwcHg7CiAgfQoKICAucmVjLWNhbmNlbCB7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBjb2xvcjogI2U3NGMzYzsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgfQoKICAucmVjLXNlbmQgewogICAgbWFyZ2luLWxlZnQ6IGF1dG87CiAgfQoKICAucmVjLXNlbmQgc3ZnIHsKICAgIHdpZHRoOiAyNHB4OwogICAgaGVpZ2h0OiAyNHB4OwogICAgZmlsbDogI2ZmZjsKICB9CgogIC8qIEhpZGRlbiBmaWxlIGlucHV0cyAqLwogIC5oaWRkZW4geyBkaXNwbGF5OiBub25lOyB9CgogIC8qIMOi4oCd4oKsw6LigJ3igqwgVElDSyBTVEFURVMgw6LigJ3igqzDouKAneKCrCAqLwogIC50aWNrLXNpbmdsZSB7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IH0KICAudGljay1zaW5nbGUgc3ZnIHsgd2lkdGg6IDE2cHg7IGhlaWdodDogMTFweDsgfQogIC50aWNrLWRvdWJsZSB7IGRpc3BsYXk6IG5vbmU7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IH0KICAudGljay1kb3VibGUgc3ZnIHsgd2lkdGg6IDE4cHg7IGhlaWdodDogMTFweDsgbWFyZ2luLWxlZnQ6IC00cHg7IH0KICAudGljay1kb3VibGUgLnRpY2stc2Vjb25kIHsgb3BhY2l0eTogMDsgfQogIC50aWNrLWRlbGl2ZXJlZCAudGljay1zZWNvbmQgeyBvcGFjaXR5OiAxOyBmaWxsOiAjODY5NmEwOyB9CiAgLnRpY2stcmVhZCAudGljay1zZWNvbmQgeyBvcGFjaXR5OiAxOyBmaWxsOiB2YXIoLS13YS1ibHVlLXRpY2spOyB9CgogIC8qIMOi4oCd4oKsw6LigJ3igqwgQ0FMTCBPVkVSTEFZIMOi4oCd4oKsw6LigJ3igqwgKi8KICAuY2FsbC1vdmVybGF5IHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIHotaW5kZXg6IDIwMDsKICAgIGJhY2tncm91bmQ6ICMxYTJjMzQ7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogIH0KCiAgLmNhbGwtb3ZlcmxheS5hY3RpdmUgewogICAgZGlzcGxheTogZmxleDsKICB9CgogIC5jYWxsLW92ZXJsYXktYmcgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICBvcGFjaXR5OiAwLjA4OwogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzIwMCcgaGVpZ2h0PScyMDAnIHZpZXdCb3g9JzAgMCAyMDAgMjAwJyUzRSUzQ2cgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjNmZmZmZmYnIHN0cm9rZS13aWR0aD0nMC44JyBvcGFjaXR5PScwLjUnJTNFJTNDcGF0aCBkPSdNMzAgMjBsNSAxMC01IDEwJy8lM0UlM0NjaXJjbGUgY3g9JzYwJyBjeT0nMzAnIHI9JzgnLyUzRSUzQ3BhdGggZD0nTTkwIDE1djE1aDEwJy8lM0UlM0NyZWN0IHg9JzEyMCcgeT0nMTgnIHdpZHRoPScxNCcgaGVpZ2h0PScxNCcgcng9JzInLyUzRSUzQ3BhdGggZD0nTTE2MCAyMGw4IDgtOCA4Jy8lM0UlM0NjaXJjbGUgY3g9JzI1JyBjeT0nNjAnIHI9JzUnLyUzRSUzQ3BhdGggZD0nTTUwIDUwbDEwIDUtMTAgNScvJTNFJTNDcGF0aCBkPSdNODAgNTVoMTUnLyUzRSUzQ2NpcmNsZSBjeD0nMTE1JyBjeT0nNTgnIHI9JzcnLyUzRSUzQ3BhdGggZD0nTTE1MCA1MGw1IDEyJy8lM0UlM0NwYXRoIGQ9J00xNzUgNTVsNS01IDUgNScvJTNFJTNDcGF0aCBkPSdNMjAgOTBsOC01IDggNScvJTNFJTNDY2lyY2xlIGN4PSc1NScgY3k9Jzk1JyByPSc2Jy8lM0UlM0NwYXRoIGQ9J004NSA4OHYxNCcvJTNFJTNDcmVjdCB4PScxMTAnIHk9Jzg1JyB3aWR0aD0nMTInIGhlaWdodD0nMTInIHJ4PSc2Jy8lM0UlM0NwYXRoIGQ9J00xNDUgOTBoMTInLyUzRSUzQ3BhdGggZD0nTTE3MCA4OGw2IDYtNiA2Jy8lM0UlM0MvZyUzRSUzQy9zdmclM0UiKTsKICAgIGJhY2tncm91bmQtc2l6ZTogMjAwcHggMjAwcHg7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICB9CgogIC5jYWxsLWhlYWRlciB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDA7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6IDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIHBhZGRpbmc6IDEycHggMTZweDsKICAgIHotaW5kZXg6IDI7CiAgfQoKICAuY2FsbC1oZWFkZXItbGVmdCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogIH0KCiAgLmNhbGwtaGVhZGVyLWxlZnQgc3ZnIHsKICAgIHdpZHRoOiAyMHB4OwogICAgaGVpZ2h0OiAyMHB4OwogICAgZmlsbDogI2ZmZjsKICB9CgogIC5jYWxsLWhlYWRlci1jZW50ZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LDAuNyk7CiAgICBmb250LXNpemU6IDEycHg7CiAgfQoKICAuY2FsbC1oZWFkZXItcmlnaHQgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LDAuNyk7CiAgICBmb250LXNpemU6IDEycHg7CiAgfQoKICAuY2FsbC1ib2R5IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTZweDsKICAgIHotaW5kZXg6IDI7CiAgfQoKICAuY2FsbC1uYW1lIHsKICAgIGNvbG9yOiAjZmZmOwogICAgZm9udC1zaXplOiAyMnB4OwogICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICB9CgogIC5jYWxsLWVuY3J5cHQgewogICAgY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsMC41KTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHBhZGRpbmc6IDAgNDBweDsKICB9CgogIC5jYWxsLWF2YXRhciB7CiAgICB3aWR0aDogMTQwcHg7CiAgICBoZWlnaHQ6IDE0MHB4OwogICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGJvcmRlcjogM3B4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4xNSk7CiAgICBtYXJnaW46IDIwcHggMDsKICB9CgogIC5jYWxsLWF2YXRhciBpbWcgewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBvYmplY3QtZml0OiBjb3ZlcjsKICB9CgogIC5jYWxsLXN0YXR1cyB7CiAgICBjb2xvcjogcmdiYSgyNTUsMjU1LDI1NSwwLjYpOwogICAgZm9udC1zaXplOiAxNHB4OwogICAgbWFyZ2luLXRvcDogOHB4OwogIH0KCiAgLmNhbGwtc3RhdHVzLnVuYXZhaWxhYmxlIHsKICAgIGNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LDAuOCk7CiAgfQoKICAuY2FsbC1hY3Rpb25zIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGJvdHRvbTogNjBweDsKICAgIGxlZnQ6IDA7CiAgICByaWdodDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogMjBweDsKICAgIHotaW5kZXg6IDI7CiAgfQoKICAuY2FsbC1hY3Rpb24tYnRuIHsKICAgIHdpZHRoOiA1MnB4OwogICAgaGVpZ2h0OiA1MnB4OwogICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgYm9yZGVyOiBub25lOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4xNXM7CiAgfQoKICAuY2FsbC1hY3Rpb24tYnRuOmhvdmVyIHsgb3BhY2l0eTogMC44NTsgfQogIC5jYWxsLWFjdGlvbi1idG4gc3ZnIHsgd2lkdGg6IDI0cHg7IGhlaWdodDogMjRweDsgZmlsbDogI2ZmZjsgfQoKICAuY2FsbC1hY3Rpb24tYnRuLm1vcmUgeyBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwyNTUsMjU1LDAuMTUpOyB9CiAgLmNhbGwtYWN0aW9uLWJ0bi5jYW1lcmEgeyBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwyNTUsMjU1LDAuMTUpOyB9CiAgLmNhbGwtYWN0aW9uLWJ0bi5zcGVha2VyIHsgYmFja2dyb3VuZDogcmdiYSgyNTUsMjU1LDI1NSwwLjE1KTsgfQogIC5jYWxsLWFjdGlvbi1idG4ubXV0ZSB7IGJhY2tncm91bmQ6IHJnYmEoMjU1LDI1NSwyNTUsMC4xNSk7IH0KICAuY2FsbC1hY3Rpb24tYnRuLmVuZCB7IGJhY2tncm91bmQ6ICNlNzRjM2M7IH0KICAuY2FsbC1hY3Rpb24tYnRuLmVuZCBzdmcgeyB3aWR0aDogMjhweDsgaGVpZ2h0OiAyOHB4OyB9CgogIC5jYWxsLW5hdiB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBib3R0b206IDE2cHg7CiAgICBsZWZ0OiA1MCU7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiA4MHB4OwogICAgei1pbmRleDogMjsKICB9CgogIC5jYWxsLW5hdiBzcGFuIHsKICAgIHdpZHRoOiA0MHB4OwogICAgaGVpZ2h0OiA0cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwyNTUsMjU1LDAuMyk7CiAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgfQoKICAuY2FsbC1uYXYtZG90IHsKICAgIHdpZHRoOiA2cHggIWltcG9ydGFudDsKICAgIGhlaWdodDogNnB4ICFpbXBvcnRhbnQ7CiAgICBib3JkZXItcmFkaXVzOiA1MCUgIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LDI1NSwyNTUsMC4zKSAhaW1wb3J0YW50OwogIH0KPC9zdHlsZT4KPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vaGVpYzJhbnlAMC4wLjQvZGlzdC9oZWljMmFueS5taW4uanMiPjwvc2NyaXB0Pgo8L2hlYWQ+Cjxib2R5PgoKPGRpdiBjbGFzcz0icGhvbmUtZnJhbWUiPgogIDwhLS0gSEVBREVSIC0tPgogIDxkaXYgY2xhc3M9ImNoYXQtaGVhZGVyIiBkYXRhLW9kLWlkPSJjaGF0LWhlYWRlciI+CiAgICA8ZGl2IGNsYXNzPSJoZWFkZXItYmFjayI+CiAgICAgIDxzdmcgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBkPSJNMjAgMTFINy44M2w1LjU5LTUuNTlMMTIgNGwtOCA4IDggOCAxLjQxLTEuNDFMNy44MyAxM0gyMHYtMnoiLz48L3N2Zz4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iaGVhZGVyLWF2YXRhciI+CiAgICAgIDxpbWcgc3JjPSJpbWFnZS0xLnBuZyIgYWx0PSJNZXNxdWl0YSBNZWdhIiBzdHlsZT0id2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtvYmplY3QtZml0OmNvdmVyO2JvcmRlci1yYWRpdXM6NTAlIj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iaGVhZGVyLWluZm8iPgogICAgICA8ZGl2IGNsYXNzPSJoZWFkZXItbmFtZSI+TWVzcXVpdGEgKE1lZ2EpPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImhlYWRlci1zdGF0dXMiPm9ubGluZTwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJoZWFkZXItYWN0aW9ucyI+CiAgICAgIDxzdmcgdmlld0JveD0iMCAwIDI0IDI0IiBkYXRhLW9kLWlkPSJidG4tdmlkZW8iPjxwYXRoIGQ9Ik0xNyAxMC41VjdjMC0uNTUtLjQ1LTEtMS0xSDRjLS41NSAwLTEgLjQ1LTEgMXYxMGMwIC41NS40NSAxIDEgMWgxMmMuNTUgMCAxLS40NSAxLTF2LTMuNWw0IDR2LTExbC00IDR6Ii8+PC9zdmc+CiAgICAgIDxzdmcgdmlld0JveD0iMCAwIDI0IDI0IiBkYXRhLW9kLWlkPSJidG4tY2FsbCI+PHBhdGggZD0iTTIwLjAxIDE1LjM4Yy0xLjIzIDAtMi40Mi0uMi0zLjUzLS41Ni0uMzUtLjEyLS43NC0uMDMtMS4wMS4yNGwtMS41NyAxLjk3Yy0yLjgzLTEuMzUtNS40OC0zLjktNi44OS02LjgzbDEuOTUtMS42NmMuMjctLjI4LjM1LS42Ny4yNC0xLjAyLS4zNy0xLjExLS41Ni0yLjMtLjU2LTMuNTMgMC0uNTQtLjQ1LS45OS0uOTktLjk5SDQuMTlDMy42NSAzIDMgMy4yNCAzIDMuOTkgMyAxMy4yOCAxMC43MyAyMSAyMC4wMSAyMWMuNzEgMCAuOTktLjYzLjk5LTEuMTh2LTMuNDVjMC0uNTQtLjQ1LS45OS0uOTktLjk5eiIvPjwvc3ZnPgogICAgICA8c3ZnIHZpZXdCb3g9IjAgMCAyNCAyNCIgZGF0YS1vZC1pZD0iYnRuLW1lbnUiPjxwYXRoIGQ9Ik0xMiA4YzEuMSAwIDItLjkgMi0ycy0uOS0yLTItMi0yIC45LTIgMiAuOSAyIDIgMnptMCAyYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptMCA2Yy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnoiLz48L3N2Zz4KICAgIDwvZGl2PgogIDwvZGl2PgoKICA8IS0tIENIQVQgTUVOVSAtLT4KICA8ZGl2IGNsYXNzPSJjaGF0LW1lbnUiIGlkPSJjaGF0TWVudSI+CiAgICA8ZGl2IGNsYXNzPSJjaGF0LW1lbnUtaXRlbSIgaWQ9Im1lbnVDbGVhciI+CiAgICAgIDxzdmcgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBkPSJNNiAxOWMwIDEuMS45IDIgMiAyaDhjMS4xIDAgMi0uOSAyLTJWN0g2djEyek0xOSA0aC0zLjVsLTEtMWgtNWwtMSAxSDV2MmgxNFY0eiIvPjwvc3ZnPgogICAgICBMaW1wYXIgY29udmVyc2EKICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iY2hhdC1tZW51LWl0ZW0iIGlkPSJtZW51RXhwb3J0Ij4KICAgICAgPHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xOSA5aC00VjNIOXY2SDVsNyA3IDctN3pNNSAxOHYyaDE0di0ySDV6Ii8+PC9zdmc+CiAgICAgIEV4cG9ydGFyIGNvbnZlcnNhICgudHh0KQogICAgPC9kaXY+CiAgPC9kaXY+CiAgPCEtLSBFTkNSWVBUSU9OIEJBTk5FUiAtLT4KICA8ZGl2IGNsYXNzPSJlbmNyeXB0LWJhbm5lciIgZGF0YS1vZC1pZD0iZW5jcnlwdC1iYW5uZXIiPgogICAgPHN2ZyB2aWV3Qm94PSIwIDAgMTYgMTYiPjxwYXRoIGQ9Ik04IDFhNCA0IDAgMCAwLTQgNHYySDNhMSAxIDAgMCAwLTEgMXY2YTEgMSAwIDAgMCAxIDFoMTBhMSAxIDAgMCAwIDEtMVY4YTEgMSAwIDAgMC0xLTFoLTFWNWE0IDQgMCAwIDAtNC00em0yIDZINlY1YTIgMiAwIDEgMSA0IDB2MnoiLz48L3N2Zz4KICAgIEFzIG1lbnNhZ2VucyBlIGNoYW1hZGFzIGRlc3RhIGNvbnZlcnNhIGVzdMOjbyBhZ29yYSBzZWd1cmFzIGNvbSBjcmlwdG9ncmFmaWEgZGUgcG9udGEgYSBwb250YS4gVG9xdWUgcGFyYSBvYnRlciBtYWlzIGluZm9ybWHDp8O1ZXMuCiAgPC9kaXY+CgogIDwhLS0gQ0hBVCBBUkVBIC0tPgogIDxkaXYgY2xhc3M9ImNoYXQtYXJlYSIgaWQ9ImNoYXRBcmVhIiBkYXRhLW9kLWlkPSJjaGF0LWFyZWEiPgogICAgPCEtLSBUeXBpbmcgaW5kaWNhdG9yIC0tPgogICAgPGRpdiBjbGFzcz0idHlwaW5nLWluZGljYXRvciIgaWQ9InR5cGluZ0luZGljYXRvciI+CiAgICAgIDxkaXYgY2xhc3M9InR5cGluZy1kb3QiPjwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJ0eXBpbmctZG90Ij48L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0idHlwaW5nLWRvdCI+PC9kaXY+CiAgICA8L2Rpdj4KICA8L2Rpdj4KCiAgPCEtLSBFTU9KSSBQQU5FTCAtLT4KICA8ZGl2IGNsYXNzPSJlbW9qaS1wYW5lbCIgaWQ9ImVtb2ppUGFuZWwiPgogICAgPGRpdiBjbGFzcz0iZW1vamktZ3JpZCIgaWQ9ImVtb2ppR3JpZCI+PC9kaXY+CiAgPC9kaXY+CgogIDwhLS0gUkVDT1JESU5HIEJBUiAtLT4KICA8ZGl2IGNsYXNzPSJyZWNvcmRpbmctYmFyIiBpZD0icmVjb3JkaW5nQmFyIj4KICAgIDxkaXYgY2xhc3M9InJlYy1kb3QiPjwvZGl2PgogICAgPHNwYW4gY2xhc3M9InJlYy10aW1lciIgaWQ9InJlY1RpbWVyIj4wOjAwPC9zcGFuPgogICAgPHNwYW4gY2xhc3M9InJlYy1jYW5jZWwiIGlkPSJyZWNDYW5jZWwiPkNhbmNlbGFyPC9zcGFuPgogICAgPGJ1dHRvbiBjbGFzcz0iaWNvbi1idG4gcmVjLXNlbmQiIGlkPSJyZWNTZW5kIiBkYXRhLW9kLWlkPSJidG4tcmVjLXNlbmQiPgogICAgICA8c3ZnIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTIuMDEgMjFMMjMgMTIgMi4wMSAzIDIgMTBsMTUgMi0xNSAyeiIvPjwvc3ZnPgogICAgPC9idXR0b24+CiAgPC9kaXY+CgogIDwhLS0gSU5QVVQgQkFSIC0tPgogIDxkaXYgY2xhc3M9ImlucHV0LWJhciIgaWQ9ImlucHV0QmFyIiBkYXRhLW9kLWlkPSJpbnB1dC1iYXIiPgogICAgPGRpdiBjbGFzcz0iaW5wdXQtbGVmdCI+CiAgICAgIDxidXR0b24gY2xhc3M9Imljb24tYnRuIiBpZD0iZW1vamlCdG4iIGRhdGEtb2QtaWQ9ImJ0bi1lbW9qaSI+CiAgICAgICAgPHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xMS45OSAyQzYuNDcgMiAyIDYuNDggMiAxMnM0LjQ3IDEwIDkuOTkgMTBDMTcuNTIgMjIgMjIgMTcuNTIgMjIgMTJTMTcuNTIgMiAxMS45OSAyek0xMiAyMGMtNC40MiAwLTgtMy41OC04LThzMy41OC04IDgtOCA4IDMuNTggOCA4LTMuNTggOC04IDh6bTMuNS05Yy44MyAwIDEuNS0uNjcgMS41LTEuNVMxNi4zMyA4IDE1LjUgOCAxNCA4LjY3IDE0IDkuNXMuNjcgMS41IDEuNSAxLjV6bS03IDBjLjgzIDAgMS41LS42NyAxLjUtMS41UzkuMzMgOCA4LjUgOCA3IDguNjcgNyA5LjUgNy42NyAxMSA4LjUgMTF6bTMuNSA2LjVjMi4zMyAwIDQuMzEtMS40NiA1LjExLTMuNUg2Ljg5Yy44IDIuMDQgMi43OCAzLjUgNS4xMSAzLjV6Ii8+PC9zdmc+CiAgICAgIDwvYnV0dG9uPgogICAgICA8YnV0dG9uIGNsYXNzPSJpY29uLWJ0biIgaWQ9ImF0dGFjaEJ0biIgZGF0YS1vZC1pZD0iYnRuLWF0dGFjaCI+CiAgICAgICAgPHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xNi41IDZ2MTEuNWMwIDIuMjEtMS43OSA0LTQgNHMtNC0xLjc5LTQtNFY1YzAtMS4zOCAxLjEyLTIuNSAyLjUtMi41czIuNSAxLjEyIDIuNSAyLjV2MTAuNWMwIC41NS0uNDUgMS0xIDFzLTEtLjQ1LTEtMVY2SDEwdjkuNWMwIDEuMzggMS4xMiAyLjUgMi41IDIuNXMyLjUtMS4xMiAyLjUtMi41VjVjMC0yLjIxLTEuNzktNC00LTRTNyAyLjc5IDcgNXYxMi41YzAgMy4wNCAyLjQ2IDUuNSA1LjUgNS41czUuNS0yLjQ2IDUuNS01LjVWNmgtMS41eiIvPjwvc3ZnPgogICAgICA8L2J1dHRvbj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iaW5wdXQtZmllbGQtd3JhcCI+CiAgICAgIDx0ZXh0YXJlYSBjbGFzcz0iaW5wdXQtZmllbGQiIGlkPSJpbnB1dEZpZWxkIiBwbGFjZWhvbGRlcj0iRGlnaXRlIGFxdWkuLi4iIHJvd3M9IjEiIGRhdGEtb2QtaWQ9ImlucHV0LW1lc3NhZ2UiPjwvdGV4dGFyZWE+CiAgICA8L2Rpdj4KICAgIDxidXR0b24gY2xhc3M9Imljb24tYnRuIHNlbmQtYnRuIiBpZD0ic2VuZEJ0biIgZGF0YS1vZC1pZD0iYnRuLXNlbmQiPgogICAgICA8c3ZnIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTIuMDEgMjFMMjMgMTIgMi4wMSAzIDIgMTBsMTUgMi0xNSAyeiIvPjwvc3ZnPgogICAgPC9idXR0b24+CiAgICA8YnV0dG9uIGNsYXNzPSJtaWMtYnRuIiBpZD0ibWljQnRuIiBkYXRhLW9kLWlkPSJidG4tbWljIj4KICAgICAgPHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xMiAxNGMxLjY2IDAgMi45OS0xLjM0IDIuOTktM0wxNSA1YzAtMS42Ni0xLjM0LTMtMy0zUzkgMy4zNCA5IDV2NmMwIDEuNjYgMS4zNCAzIDMgM3ptNS4zLTNjMCAzLTIuNTQgNS4xLTUuMyA1LjFTNi43IDE0IDYuNyAxMUg1YzAgMy40MSAyLjcyIDYuMjMgNiA2LjcyVjIxaDJ2LTMuMjhjMy4yOC0uNDggNi0zLjMgNi02LjcyaC0xLjd6Ii8+PC9zdmc+CiAgICA8L2J1dHRvbj4KICA8L2Rpdj4KCiAgPCEtLSBBVFRBQ0hNRU5UIE1FTlUgLS0+CiAgPGRpdiBjbGFzcz0iYXR0YWNoLW1lbnUiIGlkPSJhdHRhY2hNZW51IiBkYXRhLW9kLWlkPSJhdHRhY2gtbWVudSI+CiAgICA8ZGl2IGNsYXNzPSJhdHRhY2gtaXRlbSIgaWQ9ImF0dGFjaEltZyI+CiAgICAgIDxkaXYgY2xhc3M9ImF0dGFjaC1pY29uIGltZyI+CiAgICAgICAgPHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0yMSAxOVY1YzAtMS4xLS45LTItMi0ySDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJ6TTguNSAxMy41bDIuNSAzLjAxTDE0LjUgMTJsNC41IDZINWwzLjUtNC41eiIvPjwvc3ZnPgogICAgICA8L2Rpdj4KICAgICAgPHNwYW4+Rm90byBvdSBWw61kZW88L3NwYW4+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImF0dGFjaC1pdGVtIiBpZD0iYXR0YWNoRG9jIj4KICAgICAgPGRpdiBjbGFzcz0iYXR0YWNoLWljb24gZG9jIj4KICAgICAgICA8c3ZnIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTE0IDJINmMtMS4xIDAtMS45OS45LTEuOTkgMkw0IDIwYzAgMS4xLjg5IDIgMS45OSAySDE4YzEuMSAwIDItLjkgMi0yVjhsLTYtNnptMiAxNkg4di0yaDh2MnptMC00SDh2LTJoOHYyem0tMy01VjMuNUwxOC41IDlIMTN6Ii8+PC9zdmc+CiAgICAgIDwvZGl2PgogICAgICA8c3Bhbj5Eb2N1bWVudG88L3NwYW4+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImF0dGFjaC1pdGVtIiBpZD0iYXR0YWNoQXVkaW8iPgogICAgICA8ZGl2IGNsYXNzPSJhdHRhY2gtaWNvbiBhdWRpbyI+CiAgICAgICAgPHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xMiAzdjEwLjU1Yy0uNTktLjM0LTEuMjctLjU1LTItLjU1LTIuMjEgMC00IDEuNzktNCA0czEuNzkgNCA0IDQgNC0xLjc5IDQtNFY3aDRWM2gtNnoiLz48L3N2Zz4KICAgICAgPC9kaXY+CiAgICAgIDxzcGFuPsOBdWRpbzwvc3Bhbj4KICAgIDwvZGl2PgogIDwvZGl2PgoKICA8IS0tIEhpZGRlbiBmaWxlIGlucHV0cyAtLT4KICA8aW5wdXQgdHlwZT0iZmlsZSIgYWNjZXB0PSJpbWFnZS8qLC5qcGcsLmpwZWcsLnBuZywud2VicCwuaGVpYywuaGVpZiIgY2xhc3M9ImhpZGRlbiIgaWQ9ImZpbGVJbWciPg0KICA8aW5wdXQgdHlwZT0iZmlsZSIgYWNjZXB0PSIucGRmLC5kb2MsLmRvY3gsLnR4dCwuanBnLC5qcGVnLC5wbmcsLndlYnAiIGNsYXNzPSJoaWRkZW4iIGlkPSJmaWxlRG9jIj4KCiAgPCEtLSBDQUxMIE9WRVJMQVkgLS0+CiAgPGRpdiBjbGFzcz0iY2FsbC1vdmVybGF5IiBpZD0iY2FsbE92ZXJsYXkiPgogICAgPGRpdiBjbGFzcz0iY2FsbC1vdmVybGF5LWJnIj48L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImNhbGwtaGVhZGVyIj4KICAgICAgPGRpdiBjbGFzcz0iY2FsbC1oZWFkZXItbGVmdCI+CiAgICAgICAgPHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0tMiAxNWwtNS01IDEuNDEtMS40MUwxMCAxNC4xN2w3LjU5LTcuNTlMMTkgOGwtOSA5eiIvPjwvc3ZnPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2FsbC1oZWFkZXItY2VudGVyIj4KICAgICAgICA8c3ZnIHZpZXdCb3g9IjAgMCAxNiAxNiIgc3R5bGU9IndpZHRoOjEycHg7aGVpZ2h0OjEycHgiPjxwYXRoIGQ9Ik04IDFhNCA0IDAgMCAwLTQgNHYySDNhMSAxIDAgMCAwLTEgMXY2YTEgMSAwIDAgMCAxIDFoMTBhMSAxIDAgMCAwIDEtMVY4YTEgMSAwIDAgMC0xLTFoLTFWNWE0IDQgMCAwIDAtNC00eiIgZmlsbD0icmdiYSgyNTUsMjU1LDI1NSwwLjYpIi8+PC9zdmc+CiAgICAgICAgPHNwYW4+UHJvdGVnaWRhIGNvbSBhIGNyaXB0b2dyYWZpYTxicj5kZSBwb250YSBhIHBvbnRhPC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2FsbC1oZWFkZXItcmlnaHQiPgogICAgICAgIDxzdmcgdmlld0JveD0iMCAwIDI0IDI0IiBzdHlsZT0id2lkdGg6MThweDtoZWlnaHQ6MThweCI+PHBhdGggZD0iTTE3IDEuMDFMNyAxYy0xLjEgMC0yIC45LTIgMnYxOGMwIDEuMS45IDIgMiAyaDEwYzEuMSAwIDItLjkgMi0yVjNjMC0xLjEtLjktMS45OS0yLTEuOTl6TTE3IDE5SDdWNWgxMHYxNHoiIGZpbGw9InJnYmEoMjU1LDI1NSwyNTUsMC41KSIvPjwvc3ZnPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iY2FsbC1ib2R5Ij4KICAgICAgPGRpdiBjbGFzcz0iY2FsbC1uYW1lIiBpZD0iY2FsbE5hbWUiPk1lc3F1aXRhIChNZWdhKTwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjYWxsLWVuY3J5cHQiPlByb3RlZ2lkYSBjb20gYSBjcmlwdG9ncmFmaWE8YnI+ZGUgcG9udGEgYSBwb250YTwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjYWxsLWF2YXRhciI+CiAgICAgICAgPGltZyBzcmM9ImltYWdlLTEucG5nIiBhbHQ9Ik1lc3F1aXRhIE1lZ2EiPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2FsbC1zdGF0dXMiIGlkPSJjYWxsU3RhdHVzIj5DaGFtYW5kby4uLjwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJjYWxsLWFjdGlvbnMiPgogICAgICA8YnV0dG9uIGNsYXNzPSJjYWxsLWFjdGlvbi1idG4gbW9yZSI+PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiPjxjaXJjbGUgY3g9IjUiIGN5PSIxMiIgcj0iMiIvPjxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjIiLz48Y2lyY2xlIGN4PSIxOSIgY3k9IjEyIiByPSIyIi8+PC9zdmc+PC9idXR0b24+CiAgICAgIDxidXR0b24gY2xhc3M9ImNhbGwtYWN0aW9uLWJ0biBjYW1lcmEiPjxzdmcgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBkPSJNMTcgMTAuNVY3YzAtLjU1LS40NS0xLTEtMUg0Yy0uNTUgMC0xIC40NS0xIDF2MTBjMCAuNTUuNDUgMSAxIDFoMTJjLjU1IDAgMS0uNDUgMS0xdi0zLjVsNCA0di0xMWwtNCA0eiIvPjwvc3ZnPjwvYnV0dG9uPgogICAgICA8YnV0dG9uIGNsYXNzPSJjYWxsLWFjdGlvbi1idG4gc3BlYWtlciI+PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0zIDl2Nmg0bDUgNVY0TDcgOUgzem0xMy41IDNjMC0xLjc3LTEuMDItMy4yOS0yLjUtNC4wM3Y4LjA1YzEuNDgtLjczIDIuNS0yLjI1IDIuNS00LjAyek0xNCAzLjIzdjIuMDZjMi44OS44NiA1IDMuNTQgNSA2Ljcxcy0yLjExIDUuODUtNSA2LjcxdjIuMDZjNC4wMS0uOTEgNy00LjQ5IDctOC43N3MtMi45OS03Ljg2LTctOC43N3oiLz48L3N2Zz48L2J1dHRvbj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iY2FsbC1hY3Rpb24tYnRuIG11dGUiPjxzdmcgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBkPSJNMTkgMTFoLTEuN2MwIC43NC0uMTYgMS40My0uNDMgMi4wNWwxLjIzIDEuMjNjLjU2LS45OC45LTIuMDkuOS0zLjI4em0tNC4wMi4xN2MwLS4wNi4wMi0uMTEuMDItLjE3VjVjMC0xLjY2LTEuMzQtMy0zLTNTOSAzLjM0IDkgNXYuMThsNS45OCA1Ljk5ek00LjI3IDNMMyA0LjI3bDYuMDEgNi4wMVYxMWMwIDEuNjYgMS4zMyAzIDIuOTkgMyAuMjIgMCAuNDQtLjAzLjY1LS4wOGwxLjY2IDEuNjZjLS43MS4zMy0xLjUuNTItMi4zMS41Mi0yLjc2IDAtNS4zLTIuMS01LjMtNS4xSDVjMCAzLjQxIDIuNzIgNi4yMyA2IDYuNzJWMjFoMnYtMy4yOGMuOTEtLjEzIDEuNzctLjQ1IDIuNTQtLjlMMTkuNzMgMjEgMjEgMTkuNzMgNC4yNyAzeiIvPjwvc3ZnPjwvYnV0dG9uPgogICAgICA8YnV0dG9uIGNsYXNzPSJjYWxsLWFjdGlvbi1idG4gZW5kIiBpZD0iY2FsbEVuZEJ0biI+PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xMiA5Yy0xLjYgMC0zLjE1LjI1LTQuNi43MnYzLjFjMCAuMzktLjIzLjc0LS41Ni45LS45OC40OS0xLjg3IDEuMTItMi42NiAxLjg1LS4xOC4xOC0uNDMuMjgtLjcuMjgtLjI4IDAtLjUzLS4xMS0uNzEtLjI5TC4yOSAxMy4wOGMtLjE4LS4xNy0uMjktLjQyLS4yOS0uNyAwLS4yOC4xMS0uNTMuMjktLjcxQzMuMzQgOC43OCA3LjQ2IDcgMTIgN3M4LjY2IDEuNzggMTEuNzEgNC42N2MuMTguMTguMjkuNDMuMjkuNzEgMCAuMjgtLjExLjUzLS4yOS43MWwtMi40OCAyLjQ4Yy0uMTguMTgtLjQzLjI5LS43MS4yOS0uMjcgMC0uNTItLjExLS43LS4yOC0uNzktLjc0LTEuNjktMS4zNi0yLjY3LTEuODUtLjMzLS4xNi0uNTYtLjUtLjU2LS45di0zLjFDMTUuMTUgOS4yNSAxMy42IDkgMTIgOXoiLz48L3N2Zz48L2J1dHRvbj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iY2FsbC1uYXYiPgogICAgICA8c3Bhbj48L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJjYWxsLW5hdi1kb3QiPjwvc3Bhbj4KICAgICAgPHNwYW4+PC9zcGFuPgogICAgPC9kaXY+CiAgPC9kaXY+CjwvZGl2PgoKPHNjcmlwdD4KKGZ1bmN0aW9uKCkgewogIGNvbnN0IFdFQkhPT0tfVVJMID0gJ2h0dHBzOi8vbjhuLW44bi5zYmwwd3EuZWFzeXBhbmVsLmhvc3Qvd2ViaG9vay91cGxvYWQtbWVnYSc7DQogIGNvbnN0IGNoYXRBcmVhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoYXRBcmVhJyk7CiAgY29uc3QgaW5wdXRGaWVsZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dEZpZWxkJyk7CiAgY29uc3Qgc2VuZEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZW5kQnRuJyk7CiAgY29uc3QgbWljQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21pY0J0bicpOwogIGNvbnN0IGVtb2ppQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vtb2ppQnRuJyk7CiAgY29uc3QgZW1vamlQYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbW9qaVBhbmVsJyk7CiAgY29uc3QgZW1vamlHcmlkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vtb2ppR3JpZCcpOwogIGNvbnN0IGF0dGFjaEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdHRhY2hCdG4nKTsKICBjb25zdCBhdHRhY2hNZW51ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F0dGFjaE1lbnUnKTsKICBjb25zdCBhdHRhY2hJbWcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXR0YWNoSW1nJyk7CiAgY29uc3QgYXR0YWNoRG9jID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F0dGFjaERvYycpOwogIGNvbnN0IGF0dGFjaEF1ZGlvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F0dGFjaEF1ZGlvJyk7CiAgY29uc3QgZmlsZUltZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlSW1nJyk7CiAgY29uc3QgZmlsZURvYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlRG9jJyk7CiAgY29uc3QgcmVjb3JkaW5nQmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlY29yZGluZ0JhcicpOwogIGNvbnN0IHJlY1RpbWVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlY1RpbWVyJyk7CiAgY29uc3QgcmVjQ2FuY2VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlY0NhbmNlbCcpOwogIGNvbnN0IHJlY1NlbmQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjU2VuZCcpOwogIGNvbnN0IHR5cGluZ0luZGljYXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0eXBpbmdJbmRpY2F0b3InKTsKICBjb25zdCBpbnB1dEJhciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dEJhcicpOwoKICBjb25zdCBlbW9qaXMgPSBbDQogICAgJ/CfmIAnLCwgJ/CfmIInLCwgJ/CfmI0nLCwgJ/CfpbAnLCwgJ/CfmI4nLCwgJ/CfpKknLCwgJ/CfmIcnLCwgJ/CfpbMnLCwgJ/CfmIsnLCwgJ/CfpJQnLA0KICAgICfwn5iPJywsICfwn5iiJywsICfwn5itJywsICfwn5ikJywsICfwn6SvJywsICfwn5ixJywsICfwn6uhJywsICfwn6SdJywsICfwn5KqJywsICfwn5mPJywNCiAgICAn4p2k77iPJywsICfwn5SlJywsICfirZAnLCwgJ/Cfkq8nLCwgJ/CfjoknLCwgJ/CfkY8nLCwgJ+KcjO+4jycsLCAn8J+kmCcsLCAn8J+rticsLCAn4pyoJywNCiAgICAn8J+RjScsLCAn8J+RjicsLCAn8J+RiScsLCAn8J+RhicsLCAn8J+rsCcsLCAn8J+SqicsLCAn8J+noCcsLCAn8J+RgCcsLCAn8J+RhCcsLCAn8J+mticsDQogICAgJ/CfkoAnLCwgJ/CfkbsnLCwgJ/CfjoMnLCwgJ/CfjIgnLCwgJ+KYgO+4jycsLCAn8J+MmScsLCAn4pqhJywsICfwn5KnJywsICfwn42VJywsICfwn42UJywNCiAgICAn4piVJywsICfwn461JywsICfwn5OxJywsICfwn5K7JywsICfwn5O4JywsICfwn46sJywsICfimr0nLCwgJ/Cfjq4nLCwgJ/Cfj4YnLCwgJ+KciO+4jycsDQogICAgJ/CfmpcnLCwgJ/Cfj6AnLCwgJ/CfkrAnLCwgJ/CfjoEnLCwgJ/Cfk6YnLCwgJ/Cfm5InLCwgJ/CfkrwnLCwgJ/Cfk54nLCwgJ+Kcie+4jycsLCAn8J+UkScsDQogICAgJ/Cfq4InLCwgJ/CfmLQnLCwgJ/CfpK8nLCwgJ/CfpK4nLCwgJ/CfpKcnLCwgJ/CfpbYnLCwgJ/CfpbUnLCwgJ/CfpKAnLCwgJ/CfpKEnLCwgJ/CfkbknLA0KICBdOwoKICAvLyBCdWlsZCBlbW9qaSBncmlkCiAgZW1vamlzLmZvckVhY2goZSA9PiB7CiAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgc3Bhbi5jbGFzc05hbWUgPSAnZW1vamktaXRlbSc7CiAgICBzcGFuLnRleHRDb250ZW50ID0gZTsKICAgIHNwYW4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7CiAgICAgIGlucHV0RmllbGQudmFsdWUgKz0gZTsKICAgICAgaW5wdXRGaWVsZC5mb2N1cygpOwogICAgICB1cGRhdGVTZW5kQnRuKCk7CiAgICB9KTsKICAgIGVtb2ppR3JpZC5hcHBlbmRDaGlsZChzcGFuKTsKICB9KTsKCiAgbGV0IGxhc3RNZXNzYWdlRGF0ZSA9ICcnOwoKICBmdW5jdGlvbiBkYXRlS2V5KGQpIHsKICAgIHJldHVybiBkLmdldEZ1bGxZZWFyKCkgKyAnLScgKyAoZC5nZXRNb250aCgpKzEpICsgJy0nICsgZC5nZXREYXRlKCk7CiAgfQoKICBmdW5jdGlvbiBkYXRlTGFiZWwoZCkgewogICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpOwogICAgY29uc3QgeWVzdGVyZGF5ID0gbmV3IERhdGUoKTsKICAgIHllc3RlcmRheS5zZXREYXRlKHllc3RlcmRheS5nZXREYXRlKCkgLSAxKTsKICAgIGlmIChkYXRlS2V5KGQpID09PSBkYXRlS2V5KHRvZGF5KSkgcmV0dXJuICdIT0pFJzsKICAgIGlmIChkYXRlS2V5KGQpID09PSBkYXRlS2V5KHllc3RlcmRheSkpIHJldHVybiAnT05URU0nOwogICAgY29uc3QgZGF5cyA9IFsnRE9NJywnU0VHJywnVEVSJywnUVVBJywnUVVJJywnU0VYJywnU0FCJ107CiAgICBjb25zdCBtb250aHMgPSBbJ0pBTicsJ0ZFVicsJ01BUicsJ0FCUicsJ01BSScsJ0pVTicsJ0pVTCcsJ0FHTycsJ1NFVCcsJ09VVCcsJ05PVicsJ0RFWiddOwogICAgcmV0dXJuIGRheXNbZC5nZXREYXkoKV0gKyAnLCAnICsgZC5nZXREYXRlKCkgKyAnIGRlICcgKyBtb250aHNbZC5nZXRNb250aCgpXTsKICB9CgogIGZ1bmN0aW9uIGNoZWNrRGF0ZVNlcCgpIHsKICAgIGNvbnN0IGQgPSBuZXcgRGF0ZSgpOwogICAgY29uc3Qga2V5ID0gZGF0ZUtleShkKTsKICAgIGlmIChrZXkgIT09IGxhc3RNZXNzYWdlRGF0ZSkgewogICAgICBsYXN0TWVzc2FnZURhdGUgPSBrZXk7CiAgICAgIGNvbnN0IHNlcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICBzZXAuY2xhc3NOYW1lID0gJ2RhdGUtc2VwJzsKICAgICAgc2VwLmlubmVySFRNTCA9ICc8c3Bhbj4nICsgZGF0ZUxhYmVsKGQpICsgJzwvc3Bhbj4nOwogICAgICBjaGF0QXJlYS5pbnNlcnRCZWZvcmUoc2VwLCB0eXBpbmdJbmRpY2F0b3IpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gbm93KCkgewogICAgY29uc3QgZCA9IG5ldyBEYXRlKCk7CiAgICByZXR1cm4gZC5nZXRIb3VycygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwnMCcpICsgJzonICsgZC5nZXRNaW51dGVzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCcwJyk7CiAgfQoKICBmdW5jdGlvbiBkb3VibGVDaGVja1NWRygpIHsKICAgIHJldHVybiAnPHN2ZyB2aWV3Qm94PSIwIDAgMTYgMTEiIHdpZHRoPSIxNiIgaGVpZ2h0PSIxMSI+PHBhdGggZD0iTTExLjA3MS42NTNhLjQ1Ny40NTcgMCAwIDAtLjMwNC0uMTAyLjQ5My40OTMgMCAwIDAtLjM4MS4xNzhsLTYuMTkgNy42MzYtMi4wMTEtMi4xNzVhLjQ2LjQ2IDAgMCAwLS4zNTMtLjE0NS40Ny40NyAwIDAgMC0uMzM1LjEzNi40NzQuNDc0IDAgMCAwLS4wMTYuNjc4bDIuMzc1IDIuNTc0YS40NDguNDQ4IDAgMCAwIC4zNDcuMTU3aC4wMTRhLjQ3Mi40NzIgMCAwIDAgLjM1Mi0uMTc0bDYuNTM2LTguMDY2YS40NDguNDQ4IDAgMCAwLS4wMzQtLjYzOHoiIGZpbGw9IiM4Njk2YTAiLz48L3N2Zz4nOwogIH0KCiAgZnVuY3Rpb24gdGlja0hUTUwoKSB7CiAgICByZXR1cm4gJzxzcGFuIGNsYXNzPSJ0aWNrLXNpbmdsZSI+JyArIGRvdWJsZUNoZWNrU1ZHKCkgKyAnPC9zcGFuPjxzcGFuIGNsYXNzPSJ0aWNrLWRvdWJsZSI+PHN2ZyB2aWV3Qm94PSIwIDAgMTYgMTEiPjxwYXRoIGQ9Ik0xMS4wNzEuNjUzYS40NTcuNDU3IDAgMCAwLS4zMDQtLjEwMi40OTMuNDkzIDAgMCAwLS4zODEuMTc4bC02LjE5IDcuNjM2LTIuMDExLTIuMTc1YS40Ni40NiAwIDAgMC0uMzUzLS4xNDUuNDcuNDcgMCAwIDAtLjMzNS4xMzYuNDc0LjQ3NCAwIDAgMC0uMDE2LjY3OGwyLjM3NSAyLjU3NGEuNDQ4LjQ0OCAwIDAgMCAuMzQ3LjE1N2guMDE0YS40NzIuNDcyIDAgMCAwIC4zNTItLjE3NGw2LjUzNi04LjA2NmEuNDQ4LjQ0OCAwIDAgMC0uMDM0LS42Mzh6IiBmaWxsPSIjODY5NmEwIi8+PC9zdmc+PHN2ZyBjbGFzcz0idGljay1zZWNvbmQiIHZpZXdCb3g9IjAgMCAxNiAxMSI+PHBhdGggZD0iTTExLjA3MS42NTNhLjQ1Ny40NTcgMCAwIDAtLjMwNC0uMTAyLjQ5My40OTMgMCAwIDAtLjM4MS4xNzhsLTYuMTkgNy42MzYtMi4wMTEtMi4xNzVhLjQ2LjQ2IDAgMCAwLS4zNTMtLjE0NS40Ny40NyAwIDAgMC0uMzM1LjEzNi40NzQuNDc0IDAgMCAwLS4wMTYuNjc4bDIuMzc1IDIuNTc0YS40NDguNDQ4IDAgMCAwIC4zNDcuMTU3aC4wMTRhLjQ3Mi40NzIgMCAwIDAgLjM1Mi0uMTc0bDYuNTM2LTguMDY2YS40NDguNDQ4IDAgMCAwLS4wMzQtLjYzOHoiIGZpbGw9IiM4Njk2YTAiLz48L3N2Zz48L3NwYW4+JzsKICB9CgogIGZ1bmN0aW9uIGFuaW1hdGVUaWNrcyhyb3cpIHsKICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICBjb25zdCBzaW5nbGUgPSByb3cucXVlcnlTZWxlY3RvcignLnRpY2stc2luZ2xlJyk7CiAgICAgIGNvbnN0IGRvdWJsZSA9IHJvdy5xdWVyeVNlbGVjdG9yKCcudGljay1kb3VibGUnKTsKICAgICAgaWYgKHNpbmdsZSkgc2luZ2xlLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgIGlmIChkb3VibGUpIGRvdWJsZS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnOwogICAgfSwgODAwKTsKICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICBjb25zdCB3cmFwID0gcm93LnF1ZXJ5U2VsZWN0b3IoJy50aWNrLWRvdWJsZScpOwogICAgICBpZiAod3JhcCkgd3JhcC5jbGFzc0xpc3QuYWRkKCd0aWNrLWRlbGl2ZXJlZCcpOwogICAgfSwgMTgwMCk7CiAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgY29uc3Qgd3JhcCA9IHJvdy5xdWVyeVNlbGVjdG9yKCcudGljay1kb3VibGUnKTsKICAgICAgaWYgKHdyYXApIHsKICAgICAgICB3cmFwLmNsYXNzTGlzdC5yZW1vdmUoJ3RpY2stZGVsaXZlcmVkJyk7CiAgICAgICAgd3JhcC5jbGFzc0xpc3QuYWRkKCd0aWNrLXJlYWQnKTsKICAgICAgfQogICAgfSwgMzUwMCk7CiAgfQoKICBmdW5jdGlvbiBhZGRNZXNzYWdlKHRleHQsIHR5cGUpIHsKICAgIGNoZWNrRGF0ZVNlcCgpOwogICAgY29uc3Qgcm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICByb3cuY2xhc3NOYW1lID0gJ21zZy1yb3cgJyArIHR5cGU7CiAgICBjb25zdCB0aWNrID0gdHlwZSA9PT0gJ291dCcgPyAnPHNwYW4gY2xhc3M9ImJ1YmJsZS10aWNrIj4nICsgdGlja0hUTUwoKSArICc8L3NwYW4+JyA6ICcnOwogICAgcm93LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPSJidWJibGUiPjxkaXYgY2xhc3M9ImJ1YmJsZS10ZXh0Ij4nICsgdGV4dCArICc8L2Rpdj48ZGl2IGNsYXNzPSJidWJibGUtbWV0YSI+PHNwYW4gY2xhc3M9ImJ1YmJsZS10aW1lIj4nICsgbm93KCkgKyAnPC9zcGFuPicgKyB0aWNrICsgJzwvZGl2PjwvZGl2Pic7CiAgICBjaGF0QXJlYS5pbnNlcnRCZWZvcmUocm93LCB0eXBpbmdJbmRpY2F0b3IpOwogICAgaWYgKHR5cGUgPT09ICdvdXQnKSBhbmltYXRlVGlja3Mocm93KTsKICAgIHNjcm9sbEJvdHRvbSgpOwogIH0KCiAgZnVuY3Rpb24gYWRkSW1hZ2VNZXNzYWdlKGRhdGFVcmwsIHN0YXR1c0VsKSB7DQogICAgY2hlY2tEYXRlU2VwKCk7DQogICAgY29uc3Qgcm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7DQogICAgcm93LmNsYXNzTmFtZSA9ICdtc2ctcm93IG91dCc7DQogICAgcm93LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPSJidWJibGUiPjxkaXYgY2xhc3M9ImJ1YmJsZS1pbWciPjxpbWcgc3JjPSInICsgZGF0YVVybCArICciIGFsdD0iSW1hZ2VtIGVudmlhZGEiPjwvZGl2PjxkaXYgY2xhc3M9ImJ1YmJsZS1tZXRhIj48c3BhbiBjbGFzcz0iYnViYmxlLXRpbWUiPicgKyBub3coKSArICc8L3NwYW4+PHNwYW4gY2xhc3M9ImJ1YmJsZS10aWNrIj4nICsgdGlja0hUTUwoKSArICc8L3NwYW4+PC9kaXY+PC9kaXY+JzsNCiAgICBjaGF0QXJlYS5pbnNlcnRCZWZvcmUocm93LCB0eXBpbmdJbmRpY2F0b3IpOw0KICAgIGlmIChzdGF0dXNFbCkgcm93LnF1ZXJ5U2VsZWN0b3IoJy5idWJibGUtbWV0YScpLmFwcGVuZENoaWxkKHN0YXR1c0VsKTsNCiAgICBhbmltYXRlVGlja3Mocm93KTsNCiAgICBzY3JvbGxCb3R0b20oKTsNCiAgICByZXR1cm4gcm93Ow0KICB9DQoNCiAgICBmdW5jdGlvbiBhZGRBdWRpb01lc3NhZ2UoKSB7CiAgICBjaGVja0RhdGVTZXAoKTsKICAgIGNvbnN0IGJhcnMgPSBBcnJheS5mcm9tKHtsZW5ndGg6IDI4fSwgKCkgPT4gewogICAgICBjb25zdCBoID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTgpICsgNDsKICAgICAgcmV0dXJuICc8c3BhbiBzdHlsZT0iaGVpZ2h0OicgKyBoICsgJ3B4Ij48L3NwYW4+JzsKICAgIH0pLmpvaW4oJycpOwogICAgY29uc3Qgcm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICByb3cuY2xhc3NOYW1lID0gJ21zZy1yb3cgb3V0JzsKICAgIHJvdy5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz0iYnViYmxlIj48ZGl2IGNsYXNzPSJidWJibGUtYXVkaW8iPjxidXR0b24gY2xhc3M9ImF1ZGlvLXBsYXkiPjxzdmcgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBkPSJNOCA1djE0bDExLTd6Ii8+PC9zdmc+PC9idXR0b24+PGRpdiBjbGFzcz0iYXVkaW8td2F2ZSI+JyArIGJhcnMgKyAnPC9kaXY+PHNwYW4gY2xhc3M9ImF1ZGlvLWR1cmF0aW9uIj4wOicgKyAoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKjIwKSs1KS50b1N0cmluZygpLnBhZFN0YXJ0KDIsJzAnKSArICc8L3NwYW4+PC9kaXY+PGRpdiBjbGFzcz0iYnViYmxlLW1ldGEiPjxzcGFuIGNsYXNzPSJidWJibGUtdGltZSI+JyArIG5vdygpICsgJzwvc3Bhbj48c3BhbiBjbGFzcz0iYnViYmxlLXRpY2siPicgKyB0aWNrSFRNTCgpICsgJzwvc3Bhbj48L2Rpdj48L2Rpdj4nOwogICAgY2hhdEFyZWEuaW5zZXJ0QmVmb3JlKHJvdywgdHlwaW5nSW5kaWNhdG9yKTsKICAgIGFuaW1hdGVUaWNrcyhyb3cpOwogICAgc2Nyb2xsQm90dG9tKCk7CiAgfQoKICBmdW5jdGlvbiBhZGRQZGZNZXNzYWdlKGZpbGVuYW1lLCBzdGF0dXNFbCwgZmlsZVVybCkgewogICAgY2hlY2tEYXRlU2VwKCk7CiAgICBjb25zdCByb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIHJvdy5jbGFzc05hbWUgPSAnbXNnLXJvdyBvdXQnOwogICAgcm93LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPSJidWJibGUiIHN0eWxlPSJtaW4td2lkdGg6MjIwcHgnICsgKGZpbGVVcmwgPyAnO2N1cnNvcjpwb2ludGVyJyA6ICcnKSArICciPjxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEwcHg7cGFkZGluZzo0cHggMCI+PGRpdiBzdHlsZT0id2lkdGg6NDBweDtoZWlnaHQ6NDBweDtib3JkZXItcmFkaXVzOjhweDtiYWNrZ3JvdW5kOiM1MTU3YWU7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2ZsZXgtc2hyaW5rOjAiPjxzdmcgd2lkdGg9IjIwIiBoZWlnaHQ9IjIwIiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9IiNmZmYiPjxwYXRoIGQ9Ik0xNCAySDZjLTEuMSAwLTEuOTkuOS0xLjk5IDJMNCAyMGMwIDEuMS44OSAyIDEuOTkgMkgxOGMxLjEgMCAyLS45IDItMlY4bC02LTZ6bTIgMTZIOHYtMmg4djJ6bTAtNEg4di0yaDh2MnptLTMtNVYzLjVMMTguNSA5SDEzeiIvPjwvc3ZnPjwvZGl2PjxkaXY+PGRpdiBzdHlsZT0iZm9udC1zaXplOjEzcHg7Zm9udC13ZWlnaHQ6NTAwO2NvbG9yOiMzMDMwMzA7d29yZC1icmVhazpicmVhay1hbGwiPicgKyBmaWxlbmFtZSArICc8L2Rpdj48ZGl2IHN0eWxlPSJmb250LXNpemU6MTFweDtjb2xvcjojNjY3NzgxO21hcmdpbi10b3A6MnB4Ij4nICsgKGZpbGVVcmwgPyAnUERGIC0gdG9xdWUgcGFyYSBhYnJpcicgOiAnUERGJykgKyAnPC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iYnViYmxlLW1ldGEiPjxzcGFuIGNsYXNzPSJidWJibGUtdGltZSI+JyArIG5vdygpICsgJzwvc3Bhbj48c3BhbiBjbGFzcz0iYnViYmxlLXRpY2siPicgKyB0aWNrSFRNTCgpICsgJzwvc3Bhbj48L2Rpdj48L2Rpdj4nOwogICAgY2hhdEFyZWEuaW5zZXJ0QmVmb3JlKHJvdywgdHlwaW5nSW5kaWNhdG9yKTsKICAgIGlmIChzdGF0dXNFbCkgcm93LnF1ZXJ5U2VsZWN0b3IoJy5idWJibGUtbWV0YScpLmFwcGVuZENoaWxkKHN0YXR1c0VsKTsKICAgIGlmIChmaWxlVXJsKSB7CiAgICAgIGNvbnN0IGJ1YmJsZSA9IHJvdy5xdWVyeVNlbGVjdG9yKCcuYnViYmxlJyk7CiAgICAgIGJ1YmJsZS50aXRsZSA9ICdBYnJpciAnICsgZmlsZW5hbWU7CiAgICAgIGJ1YmJsZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsKICAgICAgICB3aW5kb3cub3BlbihmaWxlVXJsLCAnX2JsYW5rJyk7CiAgICAgIH0pOwogICAgfQogICAgYW5pbWF0ZVRpY2tzKHJvdyk7CiAgICBzY3JvbGxCb3R0b20oKTsKICAgIHJldHVybiByb3c7CiAgfQogIGZ1bmN0aW9uIHNjcm9sbEJvdHRvbSgpIHsKICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7CiAgICAgIGNoYXRBcmVhLnNjcm9sbFRvcCA9IGNoYXRBcmVhLnNjcm9sbEhlaWdodDsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlU2VuZEJ0bigpIHsKICAgIGNvbnN0IGhhc1RleHQgPSBpbnB1dEZpZWxkLnZhbHVlLnRyaW0oKS5sZW5ndGggPiAwOwogICAgc2VuZEJ0bi5jbGFzc0xpc3QudG9nZ2xlKCd2aXNpYmxlJywgaGFzVGV4dCk7CiAgICBtaWNCdG4uc3R5bGUuZGlzcGxheSA9IGhhc1RleHQgPyAnbm9uZScgOiAnZmxleCc7CiAgfQoKZnVuY3Rpb24gc2V0VXBsb2FkU3RhdHVzKHJvdywgdHh0LCBjb2xvcikgewogIHZhciBzdGF0dXMgPSByb3cucXVlcnlTZWxlY3RvcigiLnVwbG9hZC1zdGF0dXMiKTsKICBpZiAoIXN0YXR1cykgewogICAgc3RhdHVzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOwogICAgc3RhdHVzLmNsYXNzTmFtZSA9ICJ1cGxvYWQtc3RhdHVzIjsKICAgIHN0YXR1cy5zdHlsZS5jc3NUZXh0ID0gImZvbnQtc2l6ZToxMHB4O2NvbG9yOiM4Njk2YTA7bWFyZ2luLWxlZnQ6NHB4IjsKICAgIHJvdy5xdWVyeVNlbGVjdG9yKCIuYnViYmxlLW1ldGEiKS5hcHBlbmRDaGlsZChzdGF0dXMpOwogIH0KICBzdGF0dXMudGV4dENvbnRlbnQgPSB0eHQ7CiAgaWYgKGNvbG9yKSBzdGF0dXMuc3R5bGUuY29sb3IgPSBjb2xvcjsKICByZXR1cm4gc3RhdHVzOwp9CgpmdW5jdGlvbiBwb3N0RmlsZShmb3JtRGF0YSkgewogIHZhciBjb250cm9sbGVyID0gbnVsbDsKICB0cnkgewogICAgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKICB9IGNhdGNoIChlKSB7CiAgICBjb250cm9sbGVyID0gbnVsbDsKICB9CiAgdmFyIHRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICB0cnkgewogICAgICBpZiAoY29udHJvbGxlcikgY29udHJvbGxlci5hYm9ydCgpOwogICAgfSBjYXRjaCAoZSkge30KICB9LCA2MDAwMCk7CiAgdmFyIG9wdHMgPSB7IG1ldGhvZDogIlBPU1QiLCBib2R5OiBmb3JtRGF0YSB9OwogIGlmIChjb250cm9sbGVyKSBvcHRzLnNpZ25hbCA9IGNvbnRyb2xsZXIuc2lnbmFsOwogIHJldHVybiBmZXRjaChXRUJIT09LX1VSTCwgb3B0cykudGhlbigKICAgIGZ1bmN0aW9uIChyKSB7CiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7CiAgICAgIHJldHVybiByOwogICAgfSwKICAgIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTsKICAgICAgdGhyb3cgZXJyOwogICAgfSwKICApOwp9CgpmdW5jdGlvbiBidWlsZEZvcm0oZmlsZSwgZXh0cmEpIHsKICBjb25zdCBmZCA9IG5ldyBGb3JtRGF0YSgpOwogIGZkLmFwcGVuZCgiZmlsZSIsIGZpbGUsIGZpbGUubmFtZSB8fCAiY29tcHJvdmFudGUiKTsKICBmZC5hcHBlbmQoImZpbGVuYW1lIiwgZmlsZS5uYW1lIHx8ICJjb21wcm92YW50ZSIpOwogIGZkLmFwcGVuZCgib3JpZ2luYWxOYW1lIiwgKGV4dHJhICYmIGV4dHJhLm9yaWdpbmFsTmFtZSkgfHwgZmlsZS5uYW1lIHx8ICIiKTsKICBmZC5hcHBlbmQoIm1pbWV0eXBlIiwgZmlsZS50eXBlIHx8ICIiKTsKICBmZC5hcHBlbmQoInRpcG8iLCAiY29tcHJvdmFudGUiKTsKICBpZiAoZXh0cmEpCiAgICBPYmplY3Qua2V5cyhleHRyYSkuZm9yRWFjaChmdW5jdGlvbiAoaykgewogICAgICBpZiAoayAhPT0gIm9yaWdpbmFsTmFtZSIpIGZkLmFwcGVuZChrLCBleHRyYVtrXSk7CiAgICB9KTsKICByZXR1cm4gZmQ7Cn0KCmZ1bmN0aW9uIGlzSW1hZ2VGaWxlKGZpbGUpIHsKICBjb25zdCBuYW1lID0gZmlsZS5uYW1lIHx8ICIiOwogIHJldHVybiAoCiAgICAoZmlsZS50eXBlIHx8ICIiKS5pbmRleE9mKCJpbWFnZS8iKSA9PT0gMCB8fAogICAgL1wuKGpwZT9nfHBuZ3x3ZWJwfGhlaWN8aGVpZnxnaWZ8Ym1wKSQvaS50ZXN0KG5hbWUpCiAgKTsKfQoKLy8gQ29tcHJpbWUgYSBpbWFnZW0gbm8gcHLDs3ByaW8gY2VsdWxhcjogSlBFRyBsZXZlIHF1ZSBvIHBhaW5lbCBzZW1wcmUgbMOqLgpmdW5jdGlvbiBjb21wcmVzc0ltYWdlKGZpbGUpIHsKICBmdW5jdGlvbiBpc0hlaWMoZikgewogICAgdmFyIG5tID0gU3RyaW5nKChmICYmIGYubmFtZSkgfHwgIiIpICsgIiAiICsgU3RyaW5nKChmICYmIGYudHlwZSkgfHwgIiIpOwogICAgcmV0dXJuIC9oZWljfGhlaWYvaS50ZXN0KG5tKTsKICB9CiAgZnVuY3Rpb24gcnVuKGYpIHsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkgewogICAgICB2YXIgdXJsID0gbnVsbDsKICAgICAgdHJ5IHsKICAgICAgICB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGYpOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgcmVzb2x2ZShmaWxlKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdmFyIGltZyA9IG5ldyBJbWFnZSgpOwogICAgICBpbWcub25sb2FkID0gZnVuY3Rpb24gKCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICB2YXIgTUFYID0gMTYwMDsKICAgICAgICAgIHZhciB3ID0gaW1nLm5hdHVyYWxXaWR0aCB8fCAxMjAwLAogICAgICAgICAgICBoID0gaW1nLm5hdHVyYWxIZWlnaHQgfHwgMTYwMDsKICAgICAgICAgIHZhciBzY2FsZSA9IE1hdGgubWluKDEsIE1BWCAvIE1hdGgubWF4KHcsIGgpKTsKICAgICAgICAgIHcgPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKHcgKiBzY2FsZSkpOwogICAgICAgICAgaCA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoaCAqIHNjYWxlKSk7CiAgICAgICAgICB2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7CiAgICAgICAgICBjYW52YXMud2lkdGggPSB3OwogICAgICAgICAgY2FudmFzLmhlaWdodCA9IGg7CiAgICAgICAgICBjYW52YXMuZ2V0Q29udGV4dCgiMmQiKS5kcmF3SW1hZ2UoaW1nLCAwLCAwLCB3LCBoKTsKICAgICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTsKICAgICAgICAgIGlmIChjYW52YXMudG9CbG9iKSB7CiAgICAgICAgICAgIGNhbnZhcy50b0Jsb2IoCiAgICAgICAgICAgICAgZnVuY3Rpb24gKGJsb2IpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgIGlmIChibG9iICYmIHR5cGVvZiBGaWxlICE9PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgIHZhciBiYXNlID0gKGYubmFtZSB8fCAiY29tcHJvdmFudGUiKS5yZXBsYWNlKAogICAgICAgICAgICAgICAgICAgICAgL1wuW2EtejAtOV0rJC9pLAogICAgICAgICAgICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlKAogICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoW2Jsb2JdLCBiYXNlICsgIi5qcGciLCB7IHR5cGU6ICJpbWFnZS9qcGVnIiB9KSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmlsZSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmaWxlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICJpbWFnZS9qcGVnIiwKICAgICAgICAgICAgICAwLjgyLAogICAgICAgICAgICApOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVzb2x2ZShmaWxlKTsKICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7CiAgICAgICAgICB9IGNhdGNoIChlMikge30KICAgICAgICAgIHJlc29sdmUoZmlsZSk7CiAgICAgICAgfQogICAgICB9OwogICAgICBpbWcub25lcnJvciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB0cnkgewogICAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpOwogICAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICAgICAgcmVzb2x2ZShmaWxlKTsKICAgICAgfTsKICAgICAgaW1nLnNyYyA9IHVybDsKICAgIH0pOwogIH0KICBpZiAoaXNIZWljKGZpbGUpICYmIHR5cGVvZiBoZWljMmFueSAhPT0gInVuZGVmaW5lZCIgJiYgaGVpYzJhbnkpIHsKICAgIHRyeSB7CiAgICAgIHJldHVybiBoZWljMmFueSh7IGJsb2I6IGZpbGUsIHRvVHlwZTogImltYWdlL2pwZWciLCBxdWFsaXR5OiAwLjgyIH0pCiAgICAgICAgLnRoZW4oZnVuY3Rpb24gKG91dCkgewogICAgICAgICAgdmFyIGIgPSBBcnJheS5pc0FycmF5KG91dCkgPyBvdXRbMF0gOiBvdXQ7CiAgICAgICAgICB2YXIgYmFzZSA9IFN0cmluZyhmaWxlLm5hbWUgfHwgImNvbXByb3ZhbnRlIikucmVwbGFjZSgKICAgICAgICAgICAgL1wuW2EtejAtOV0rJC9pLAogICAgICAgICAgICAiIiwKICAgICAgICAgICk7CiAgICAgICAgICByZXR1cm4gcnVuKG5ldyBGaWxlKFtiXSwgYmFzZSArICIuanBnIiwgeyB0eXBlOiAiaW1hZ2UvanBlZyIgfSkpOwogICAgICAgIH0pCiAgICAgICAgLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHJldHVybiBydW4oZmlsZSk7CiAgICAgICAgfSk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHJldHVybiBydW4oZmlsZSk7CiAgICB9CiAgfQogIHJldHVybiBydW4oZmlsZSk7Cn0KCi8vIFNlIG8gcGFpbmVsIHJlY3VzYXIgYSBpbWFnZW0sIHJlZW52aWEgZGVudHJvIGRlIHVtIFBERiAoc2VtIHJlY2FkYXN0cmFyIG5hZGEpLgpmdW5jdGlvbiBqcGVnVG9QZGZCbG9iKGpwZWdCbG9iLCBpbWdXLCBpbWdIKSB7CiAgcmV0dXJuIGpwZWdCbG9iLmFycmF5QnVmZmVyKCkudGhlbihmdW5jdGlvbiAoYnVmKSB7CiAgICBjb25zdCBmaXQgPSBNYXRoLm1pbigxLCA1OTUgLyBpbWdXKTsKICAgIGNvbnN0IHBhZ2VXID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChpbWdXICogZml0KSk7CiAgICBjb25zdCBwYWdlSCA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoaW1nSCAqIGZpdCkpOwogICAgY29uc3QgZW5jID0gbmV3IFRleHRFbmNvZGVyKCk7CiAgICBjb25zdCBqcGcgPSBuZXcgVWludDhBcnJheShidWYpOwogICAgY29uc3QgcGFydHMgPSBbXTsKICAgIGNvbnN0IG9mZnNldHMgPSBbMF07CiAgICBmdW5jdGlvbiBwdXNoKGIpIHsKICAgICAgb2Zmc2V0cy5wdXNoKG9mZnNldHNbb2Zmc2V0cy5sZW5ndGggLSAxXSArIGIubGVuZ3RoKTsKICAgICAgcGFydHMucHVzaChiKTsKICAgIH0KICAgIHB1c2goZW5jLmVuY29kZSgiJVBERi0xLjRcbiIpKTsKICAgIHB1c2goZW5jLmVuY29kZSgiMSAwIG9ialxuPDwgL1R5cGUgL0NhdGFsb2cgL1BhZ2VzIDIgMCBSID4+XG5lbmRvYmpcbiIpKTsKICAgIHB1c2goCiAgICAgIGVuYy5lbmNvZGUoCiAgICAgICAgIjIgMCBvYmpcbjw8IC9UeXBlIC9QYWdlcyAvS2lkcyBbMyAwIFJdIC9Db3VudCAxID4+XG5lbmRvYmpcbiIsCiAgICAgICksCiAgICApOwogICAgcHVzaCgKICAgICAgZW5jLmVuY29kZSgKICAgICAgICAiMyAwIG9ialxuPDwgL1R5cGUgL1BhZ2UgL1BhcmVudCAyIDAgUiAvTWVkaWFCb3ggWzAgMCAiICsKICAgICAgICAgIHBhZ2VXICsKICAgICAgICAgICIgIiArCiAgICAgICAgICBwYWdlSCArCiAgICAgICAgICAiXSAvUmVzb3VyY2VzIDw8IC9YT2JqZWN0IDw8IC9JbTAgNCAwIFIgPj4gL1Byb2NTZXQgWy9QREYgL0ltYWdlQ10gPj4gL0NvbnRlbnRzIDUgMCBSID4+XG5lbmRvYmpcbiIsCiAgICAgICksCiAgICApOwogICAgcHVzaCgKICAgICAgZW5jLmVuY29kZSgKICAgICAgICAiNCAwIG9ialxuPDwgL1R5cGUgL1hPYmplY3QgL1N1YnR5cGUgL0ltYWdlIC9XaWR0aCAiICsKICAgICAgICAgIGltZ1cgKwogICAgICAgICAgIiAvSGVpZ2h0ICIgKwogICAgICAgICAgaW1nSCArCiAgICAgICAgICAiIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IgL0JpdHNQZXJDb21wb25lbnQgOCAvRmlsdGVyIC9EQ1REZWNvZGUgL0xlbmd0aCAiICsKICAgICAgICAgIGpwZy5sZW5ndGggKwogICAgICAgICAgIiA+Plxuc3RyZWFtXG4iLAogICAgICApLAogICAgKTsKICAgIHB1c2goanBnKTsKICAgIHB1c2goZW5jLmVuY29kZSgiXG5lbmRzdHJlYW1cbmVuZG9ialxuIikpOwogICAgY29uc3Qgb2JqNXBvcyA9IG9mZnNldHNbb2Zmc2V0cy5sZW5ndGggLSAxXTsKICAgIGNvbnN0IGNvbnRlbnQgPSBlbmMuZW5jb2RlKAogICAgICAicVxuIiArIHBhZ2VXICsgIiAwIDAgIiArIHBhZ2VIICsgIiAwIDAgY21cbi9JbTAgRG9cblFcbiIsCiAgICApOwogICAgcHVzaChlbmMuZW5jb2RlKCI1IDAgb2JqXG48PCAvTGVuZ3RoICIgKyBjb250ZW50Lmxlbmd0aCArICIgPj5cbnN0cmVhbVxuIikpOwogICAgcHVzaChjb250ZW50KTsKICAgIHB1c2goZW5jLmVuY29kZSgiZW5kc3RyZWFtXG5lbmRvYmpcbiIpKTsKICAgIGNvbnN0IHhyZWZQb3MgPSBvZmZzZXRzW29mZnNldHMubGVuZ3RoIC0gMV07CiAgICBsZXQgeHJlZiA9ICJ4cmVmXG4wIDZcbjAwMDAwMDAwMDAgNjU1MzUgZiBcbiI7CiAgICBjb25zdCBvYmpPZmZzZXRzID0gWzAsIG9mZnNldHNbMV0sIG9mZnNldHNbMl0sIG9mZnNldHNbM10sIG9mZnNldHNbNF0sIG9iajVwb3NdOwogICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gNTsgaSsrKQogICAgICB4cmVmICs9IFN0cmluZyhvYmpPZmZzZXRzW2ldKS5wYWRTdGFydCgxMCwgIjAiKSArICIgMDAwMDAgbiBcbiI7CiAgICBwdXNoKAogICAgICBlbmMuZW5jb2RlKAogICAgICAgIHhyZWYgKwogICAgICAgICAgInRyYWlsZXJcbjw8IC9TaXplIDYgL1Jvb3QgMSAwIFIgPj5cbnN0YXJ0eHJlZlxuIiArCiAgICAgICAgICB4cmVmUG9zICsKICAgICAgICAgICJcbiUlRU9GIiwKICAgICAgKSwKICAgICk7CiAgICByZXR1cm4gbmV3IEJsb2IocGFydHMsIHsgdHlwZTogImFwcGxpY2F0aW9uL3BkZiIgfSk7CiAgfSk7Cn0KCmZ1bmN0aW9uIHJldHJ5SW1hZ2VBc1BkZihqcGVnRmlsZSwgb3JpZ2luYWxOYW1lLCByb3cpIHsKICBzZXRVcGxvYWRTdGF0dXMocm93LCAiY29udmVydGVuZG8gZW0gUERGLi4uIik7CiAgdmFyIG5tVGlwbyA9IFN0cmluZygob3JpZ2luYWxOYW1lIHx8ICIiKSArICIgIiArIChqcGVnRmlsZS50eXBlIHx8ICIiKSkudG9Mb3dlckNhc2UoKTsKICBpZiAobm1UaXBvLmluZGV4T2YoImhlaWMiKSA+IC0xIHx8IG5tVGlwby5pbmRleE9mKCJoZWlmIikgPiAtMSkgewogICAgc2V0VXBsb2FkU3RhdHVzKHJvdywgIkVSUk8iLCAiI2VmNTM1MCIpOwogICAgYWRkTWVzc2FnZSgiRm90byBlbSBmb3JtYXRvIEhFSUMgKGlQaG9uZSkuIEVudmllIGNvbW8gUERGIG91IHRpcmUgdW0gcHJpbnQgZGEgdGVsYS4iLCAiaW4iKTsKICAgIHNpbXVsYXRlUmVwbHkoKTsKICAgIHJldHVybjsKICB9CiAgdHJ5IHsgIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoanBlZ0ZpbGUpOwogIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpOwogIGltZy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7CiAgICBjb25zdCB3ID0gaW1nLm5hdHVyYWxXaWR0aCB8fCAxMjAwLAogICAgICBoID0gaW1nLm5hdHVyYWxIZWlnaHQgfHwgMTYwMDsKICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTsKICAgIGpwZWdUb1BkZkJsb2IoanBlZ0ZpbGUsIHcsIGgpCiAgICAgIC50aGVuKGZ1bmN0aW9uIChwZGZCbG9iKSB7CiAgICAgICAgY29uc3QgYmFzZSA9IChvcmlnaW5hbE5hbWUgfHwgImNvbXByb3ZhbnRlIikucmVwbGFjZSgKICAgICAgICAgIC9cLlthLXowLTldKyQvaSwKICAgICAgICAgICIiLAogICAgICAgICk7CiAgICAgICAgY29uc3QgcGRmRmlsZSA9IG5ldyBGaWxlKFtwZGZCbG9iXSwgYmFzZSArICIucGRmIiwgewogICAgICAgICAgdHlwZTogImFwcGxpY2F0aW9uL3BkZiIsCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHBvc3RGaWxlKAogICAgICAgICAgYnVpbGRGb3JtKHBkZkZpbGUsIHsKICAgICAgICAgICAgb3JpZ2luYWxOYW1lOiBvcmlnaW5hbE5hbWUsCiAgICAgICAgICAgIGNvbnZlcnNhbzogImltYWdlbS1wYXJhLXBkZiIsCiAgICAgICAgICB9KSwKICAgICAgICApOwogICAgICB9KQogICAgICAudGhlbihmdW5jdGlvbiAocjIpIHsKICAgICAgICBpZiAocjIub2spIHNldFVwbG9hZFN0YXR1cyhyb3csICJPSyIsICIjMDBhODg0Iik7CiAgICAgICAgZWxzZSBzZXRVcGxvYWRTdGF0dXMocm93LCAiRVJSTyIsICIjZWY1MzUwIik7CiAgICAgICAgc2ltdWxhdGVSZXBseSgpOwogICAgICB9KQogICAgICAuY2F0Y2goZnVuY3Rpb24gKCkgewogICAgICAgIHNldFVwbG9hZFN0YXR1cyhyb3csICJFUlJPIiwgIiNlZjUzNTAiKTsKICAgICAgICBzaW11bGF0ZVJlcGx5KCk7CiAgICAgIH0pOwogIH07CiAgaW1nLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7CiAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7CiAgICBzZXRVcGxvYWRTdGF0dXMocm93LCAiRVJSTyIsICIjZWY1MzUwIik7CiAgICBzaW11bGF0ZVJlcGx5KCk7CiAgfTsKICBpbWcuc3JjID0gdXJsOwogIH0gY2F0Y2ggKGUpIHsKICAgIHNldFVwbG9hZFN0YXR1cyhyb3csICJFUlJPIiwgIiNlZjUzNTAiKTsKICAgIGFkZE1lc3NhZ2UoIk5hbyBmb2kgcG9zc2l2ZWwgY29udmVydGVyIGEgaW1hZ2VtLiBFbnZpZSBjb21vIFBERiBvdSBwcmludCBkYSB0ZWxhLiIsICJpbiIpOwogICAgc2ltdWxhdGVSZXBseSgpOwogIH0KfQoKZnVuY3Rpb24gc2VuZFRvTjhOKGZpbGUsIHJvdykgewogIHNldFVwbG9hZFN0YXR1cyhyb3csICJlbnZpYW5kby4uLiIpOwogIGNvbnN0IG9yaWdpbmFsTmFtZSA9IGZpbGUubmFtZSB8fCAiY29tcHJvdmFudGUiOwogIGNvbnN0IGltYWdlID0gaXNJbWFnZUZpbGUoZmlsZSk7CiAgY29uc3QgcmVhZHkgPSBpbWFnZSA/IGNvbXByZXNzSW1hZ2UoZmlsZSkgOiBQcm9taXNlLnJlc29sdmUoZmlsZSk7CiAgcmVhZHkKICAgIC50aGVuKGZ1bmN0aW9uICh0b1NlbmQpIHsKICAgICAgcmV0dXJuIHBvc3RGaWxlKGJ1aWxkRm9ybSh0b1NlbmQsIHsgb3JpZ2luYWxOYW1lOiBvcmlnaW5hbE5hbWUgfSkpLnRoZW4oCiAgICAgICAgZnVuY3Rpb24gKHIpIHsKICAgICAgICAgIHJldHVybiB7IHI6IHIsIHRvU2VuZDogdG9TZW5kIH07CiAgICAgICAgfSwKICAgICAgKTsKICAgIH0pCiAgICAudGhlbihmdW5jdGlvbiAob3V0KSB7CiAgICAgIGlmIChvdXQuci5vaykgewogICAgICAgIHNldFVwbG9hZFN0YXR1cyhyb3csICJPSyIsICIjMDBhODg0Iik7CiAgICAgICAgc2ltdWxhdGVSZXBseSgpOwogICAgICB9IGVsc2UgaWYgKGltYWdlKSB7CiAgICAgICAgcmV0cnlJbWFnZUFzUGRmKG91dC50b1NlbmQsIG9yaWdpbmFsTmFtZSwgcm93KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzZXRVcGxvYWRTdGF0dXMocm93LCAiRVJSTyIsICIjZWY1MzUwIik7CiAgICAgICAgc2ltdWxhdGVSZXBseSgpOwogICAgICB9CiAgICB9KQogICAgLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKGltYWdlKSB7CiAgICAgICAgY29tcHJlc3NJbWFnZShmaWxlKS50aGVuKGZ1bmN0aW9uICh0b1NlbmQpIHsKICAgICAgICAgIHJldHJ5SW1hZ2VBc1BkZih0b1NlbmQsIG9yaWdpbmFsTmFtZSwgcm93KTsKICAgICAgICB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzZXRVcGxvYWRTdGF0dXMocm93LCAiRVJSTyIsICIjZWY1MzUwIik7CiAgICAgICAgc2ltdWxhdGVSZXBseSgpOwogICAgICB9CiAgICB9KTsKfQ0KDQogIC8vIEF1dG8tcmVzaXplIHRleHRhcmVhCiAgaW5wdXRGaWVsZC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHsKICAgIGlucHV0RmllbGQuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nOwogICAgaW5wdXRGaWVsZC5zdHlsZS5oZWlnaHQgPSBNYXRoLm1pbihpbnB1dEZpZWxkLnNjcm9sbEhlaWdodCwgMTAwKSArICdweCc7CiAgICB1cGRhdGVTZW5kQnRuKCk7CiAgfSk7CgogIC8vIFNlbmQgbWVzc2FnZQogIGZ1bmN0aW9uIHNlbmRNZXNzYWdlKCkgewogICAgY29uc3QgdGV4dCA9IGlucHV0RmllbGQudmFsdWUudHJpbSgpOwogICAgaWYgKCF0ZXh0KSByZXR1cm47CiAgICBhZGRNZXNzYWdlKHRleHQsICdvdXQnKTsKICAgIGlucHV0RmllbGQudmFsdWUgPSAnJzsKICAgIGlucHV0RmllbGQuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nOwogICAgdXBkYXRlU2VuZEJ0bigpOwogICAgY2xvc2VQYW5lbHMoKTsKICB9CgogIHNlbmRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzZW5kTWVzc2FnZSk7CgogIGlucHV0RmllbGQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7CiAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicgJiYgIWUuc2hpZnRLZXkpIHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBzZW5kTWVzc2FnZSgpOwogICAgfQogIH0pOwoKICAvLyBFbW9qaSBwYW5lbAogIGVtb2ppQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHsKICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICBlbW9qaVBhbmVsLmNsYXNzTGlzdC50b2dnbGUoJ29wZW4nKTsKICAgIGF0dGFjaE1lbnUuY2xhc3NMaXN0LnJlbW92ZSgnb3BlbicpOwogIH0pOwoKICAvLyBBdHRhY2ggbWVudQogIGF0dGFjaEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7CiAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgYXR0YWNoTWVudS5jbGFzc0xpc3QudG9nZ2xlKCdvcGVuJyk7CiAgICBlbW9qaVBhbmVsLmNsYXNzTGlzdC5yZW1vdmUoJ29wZW4nKTsKICB9KTsKCiAgYXR0YWNoSW1nLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gewogICAgZmlsZUltZy5jbGljaygpOwogICAgYXR0YWNoTWVudS5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJyk7CiAgfSk7CgogIGF0dGFjaERvYy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsKICAgIGZpbGVEb2MuY2xpY2soKTsKICAgIGF0dGFjaE1lbnUuY2xhc3NMaXN0LnJlbW92ZSgnb3BlbicpOwogIH0pOwoKICBhdHRhY2hBdWRpby5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsKICAgIGF0dGFjaE1lbnUuY2xhc3NMaXN0LnJlbW92ZSgnb3BlbicpOwogICAgYWRkQXVkaW9NZXNzYWdlKCk7CiAgfSk7CgpmaWxlSW1nLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIChlKSA9PiB7CiAgY29uc3QgZmlsZSA9IGUudGFyZ2V0LmZpbGVzWzBdOwogIGlmICghZmlsZSkgcmV0dXJuOwogIGlmIChmaWxlLnNpemUgPiAxNSAqIDEwMjQgKiAxMDI0KSB7CiAgICBhZGRNZXNzYWdlKCJBcnF1aXZvIG1haW9yIHF1ZSAxNU1CLiBFbnZpZSB1bWEgZm90byBtZW5vciBvdSB1bSBQREYuIiwgImluIik7CiAgICBmaWxlSW1nLnZhbHVlID0gIiI7CiAgICByZXR1cm47CiAgfQogIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7CiAgcmVhZGVyLm9ubG9hZCA9IChldikgPT4gewogICAgY29uc3Qgcm93ID0gYWRkSW1hZ2VNZXNzYWdlKGV2LnRhcmdldC5yZXN1bHQpOwogICAgc2VuZFRvTjhOKGZpbGUsIHJvdyk7CiAgfTsKICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTsKICBmaWxlSW1nLnZhbHVlID0gIiI7Cn0pOwoKICBmaWxlRG9jLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIChlKSA9PiB7CiAgY29uc3QgZmlsZSA9IGUudGFyZ2V0LmZpbGVzWzBdOwogIGlmICghZmlsZSkgcmV0dXJuOwogIGlmICh0eXBlb2YgaXNJbWFnZUZpbGUgPT09ICJmdW5jdGlvbiIgJiYgaXNJbWFnZUZpbGUoZmlsZSkpIHsKICAgIGlmIChmaWxlLnNpemUgPiAxNSAqIDEwMjQgKiAxMDI0KSB7CiAgICAgIGFkZE1lc3NhZ2UoCiAgICAgICAgIkFycXVpdm8gbWFpb3IgcXVlIDE1TUIuIEVudmllIHVtYSBmb3RvIG1lbm9yIG91IHVtIFBERi4iLAogICAgICAgICJpbiIsCiAgICAgICk7CiAgICAgIGZpbGVEb2MudmFsdWUgPSAiIjsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTsKICAgIHJlYWRlci5vbmxvYWQgPSAoZXYpID0+IHsKICAgICAgY29uc3Qgcm93ID0gYWRkSW1hZ2VNZXNzYWdlKGV2LnRhcmdldC5yZXN1bHQpOwogICAgICBzZW5kVG9OOE4oZmlsZSwgcm93KTsKICAgIH07CiAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTsKICAgIGZpbGVEb2MudmFsdWUgPSAiIjsKICAgIHJldHVybjsKICB9CiAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChmaWxlKTsKICBjb25zdCByb3cgPSBhZGRQZGZNZXNzYWdlKGZpbGUubmFtZSwgbnVsbCwgdXJsKTsKICBzZW5kVG9OOE4oZmlsZSwgcm93KTsKICBmaWxlRG9jLnZhbHVlID0gIiI7Cn0pOwoKCiAgLy8gQ2xvc2UgcGFuZWxzIG9uIG91dHNpZGUgY2xpY2sKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7CiAgICBpZiAoIWVtb2ppUGFuZWwuY29udGFpbnMoZS50YXJnZXQpICYmIGUudGFyZ2V0ICE9PSBlbW9qaUJ0biAmJiAhZW1vamlCdG4uY29udGFpbnMoZS50YXJnZXQpKSB7CiAgICAgIGVtb2ppUGFuZWwuY2xhc3NMaXN0LnJlbW92ZSgnb3BlbicpOwogICAgfQogICAgaWYgKCFhdHRhY2hNZW51LmNvbnRhaW5zKGUudGFyZ2V0KSAmJiBlLnRhcmdldCAhPT0gYXR0YWNoQnRuICYmICFhdHRhY2hCdG4uY29udGFpbnMoZS50YXJnZXQpKSB7CiAgICAgIGF0dGFjaE1lbnUuY2xhc3NMaXN0LnJlbW92ZSgnb3BlbicpOwogICAgfQogICAgaWYgKCFjaGF0TWVudS5jb250YWlucyhlLnRhcmdldCkgJiYgZS50YXJnZXQgIT09IGJ0bk1lbnUgJiYgIWJ0bk1lbnUuY29udGFpbnMoZS50YXJnZXQpKSB7CiAgICAgIGNoYXRNZW51LmNsYXNzTGlzdC5yZW1vdmUoJ29wZW4nKTsKICAgIH0KICB9KTsKCiAgZnVuY3Rpb24gY2xvc2VQYW5lbHMoKSB7CiAgICBlbW9qaVBhbmVsLmNsYXNzTGlzdC5yZW1vdmUoJ29wZW4nKTsKICAgIGF0dGFjaE1lbnUuY2xhc3NMaXN0LnJlbW92ZSgnb3BlbicpOwogIH0KCiAgLy8gQXVkaW8gcmVjb3JkaW5nIHNpbXVsYXRpb24KICBsZXQgaXNSZWNvcmRpbmcgPSBmYWxzZTsKICBsZXQgcmVjSW50ZXJ2YWwgPSBudWxsOwogIGxldCByZWNTZWNvbmRzID0gMDsKCiAgbWljQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gewogICAgaWYgKGlzUmVjb3JkaW5nKSB7CiAgICAgIHN0b3BSZWNvcmRpbmcoKTsKICAgIH0gZWxzZSB7CiAgICAgIHN0YXJ0UmVjb3JkaW5nKCk7CiAgICB9CiAgfSk7CgogIGZ1bmN0aW9uIHN0YXJ0UmVjb3JkaW5nKCkgewogICAgaXNSZWNvcmRpbmcgPSB0cnVlOwogICAgcmVjU2Vjb25kcyA9IDA7CiAgICBtaWNCdG4uY2xhc3NMaXN0LmFkZCgncmVjb3JkaW5nJyk7CiAgICBpbnB1dEJhci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgcmVjb3JkaW5nQmFyLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpOwogICAgcmVjVGltZXIudGV4dENvbnRlbnQgPSAnMDowMCc7CiAgICByZWNJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHsKICAgICAgcmVjU2Vjb25kcysrOwogICAgICBjb25zdCBtID0gTWF0aC5mbG9vcihyZWNTZWNvbmRzIC8gNjApOwogICAgICBjb25zdCBzID0gcmVjU2Vjb25kcyAlIDYwOwogICAgICByZWNUaW1lci50ZXh0Q29udGVudCA9IG0gKyAnOicgKyBzLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTsKICAgIH0sIDEwMDApOwogIH0KCiAgZnVuY3Rpb24gc3RvcFJlY29yZGluZygpIHsKICAgIGlzUmVjb3JkaW5nID0gZmFsc2U7CiAgICBjbGVhckludGVydmFsKHJlY0ludGVydmFsKTsKICAgIG1pY0J0bi5jbGFzc0xpc3QucmVtb3ZlKCdyZWNvcmRpbmcnKTsKICAgIHJlY29yZGluZ0Jhci5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTsKICAgIGlucHV0QmFyLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7CiAgICBpZiAocmVjU2Vjb25kcyA+IDApIHsKICAgICAgYWRkQXVkaW9NZXNzYWdlKCk7CiAgICB9CiAgfQoKICByZWNDYW5jZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7CiAgICBpc1JlY29yZGluZyA9IGZhbHNlOwogICAgY2xlYXJJbnRlcnZhbChyZWNJbnRlcnZhbCk7CiAgICBtaWNCdG4uY2xhc3NMaXN0LnJlbW92ZSgncmVjb3JkaW5nJyk7CiAgICByZWNvcmRpbmdCYXIuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7CiAgICBpbnB1dEJhci5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnOwogIH0pOwoKICByZWNTZW5kLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc3RvcFJlY29yZGluZyk7CgogIC8vIFNpbXVsYXRlZCByZXBsaWVzIC0gb25seSBmb3IgaW1hZ2VzIGFuZCBQREZzCiAgZnVuY3Rpb24gc2ltdWxhdGVSZXBseSgpIHsKICAgIHR5cGluZ0luZGljYXRvci5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTsKICAgIHNjcm9sbEJvdHRvbSgpOwogICAgY29uc3QgZGVsYXkgPSAxMjAwICsgTWF0aC5yYW5kb20oKSAqIDE4MDA7CiAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgdHlwaW5nSW5kaWNhdG9yLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpOwogICAgICBhZGRNZXNzYWdlKCdFbnZpYW5kbyBwYXJhIG8gQm9sw6NvIE1lZ2EhJywgJ2luJyk7CiAgICB9LCBkZWxheSk7CiAgfQoKICAvLyDDouKAneKCrMOi4oCd4oKsIENBTEwgT1ZFUkxBWSDDouKAneKCrMOi4oCd4oKsCiAgY29uc3QgY2FsbE92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FsbE92ZXJsYXknKTsKICBjb25zdCBjYWxsU3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbGxTdGF0dXMnKTsKICBjb25zdCBjYWxsRW5kQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbGxFbmRCdG4nKTsKICBjb25zdCBidG5WaWRlbyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW9kLWlkPSJidG4tdmlkZW8iXScpOwogIGNvbnN0IGJ0bkNhbGwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1vZC1pZD0iYnRuLWNhbGwiXScpOwoKICBmdW5jdGlvbiBzdGFydENhbGwoKSB7CiAgICBjYWxsT3ZlcmxheS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTsKICAgIGNhbGxTdGF0dXMudGV4dENvbnRlbnQgPSAnQ2hhbWFuZG8uLi4nOwogICAgY2FsbFN0YXR1cy5jbGFzc0xpc3QucmVtb3ZlKCd1bmF2YWlsYWJsZScpOwogICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgIGNhbGxTdGF0dXMudGV4dENvbnRlbnQgPSAnSW5kaXNwb27DrXZlbCBwYXJhIGxpZ2HDp8O1ZXMnOwogICAgICBjYWxsU3RhdHVzLmNsYXNzTGlzdC5hZGQoJ3VuYXZhaWxhYmxlJyk7CiAgICB9LCA1MDAwKTsKICB9CgogIGZ1bmN0aW9uIGVuZENhbGwoKSB7CiAgICBjYWxsT3ZlcmxheS5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTsKICB9CgogIGJ0bkNhbGwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzdGFydENhbGwpOwogIGJ0blZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc3RhcnRDYWxsKTsKICBjYWxsRW5kQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZW5kQ2FsbCk7CgogIC8vIMOi4oCd4oKsw6LigJ3igqwgQ0hBVCBNRU5VICh0csOqcyBwb250aW5ob3MpIMOi4oCd4oKsw6LigJ3igqwKICBjb25zdCBidG5NZW51ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtb2QtaWQ9ImJ0bi1tZW51Il0nKTsKICBjb25zdCBjaGF0TWVudSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGF0TWVudScpOwogIGNvbnN0IG1lbnVDbGVhciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZW51Q2xlYXInKTsKICBjb25zdCBtZW51RXhwb3J0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21lbnVFeHBvcnQnKTsKCiAgYnRuTWVudS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7CiAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgY2hhdE1lbnUuY2xhc3NMaXN0LnRvZ2dsZSgnb3BlbicpOwogICAgZW1vamlQYW5lbC5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJyk7CiAgICBhdHRhY2hNZW51LmNsYXNzTGlzdC5yZW1vdmUoJ29wZW4nKTsKICB9KTsKCiAgbWVudUNsZWFyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gewogICAgY2hhdE1lbnUuY2xhc3NMaXN0LnJlbW92ZSgnb3BlbicpOwogICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2NoYXRBcmVhIC5tc2ctcm93JykuZm9yRWFjaCgocikgPT4gci5yZW1vdmUoKSk7CiAgICBsYXN0TWVzc2FnZURhdGUgPSAnJzsKICB9KTsKCiAgbWVudUV4cG9ydC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsKICAgIGNoYXRNZW51LmNsYXNzTGlzdC5yZW1vdmUoJ29wZW4nKTsKICAgIGNvbnN0IHJvd3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjY2hhdEFyZWEgLm1zZy1yb3cnKTsKICAgIGlmICghcm93cy5sZW5ndGgpIHJldHVybjsKICAgIGNvbnN0IGxpbmVzID0gW107CiAgICByb3dzLmZvckVhY2goKHIpID0+IHsKICAgICAgbGV0IHRleHQgPSAnJzsKICAgICAgY29uc3QgdCA9IHIucXVlcnlTZWxlY3RvcignLmJ1YmJsZS10ZXh0Jyk7CiAgICAgIGlmICh0KSB0ZXh0ID0gdC50ZXh0Q29udGVudDsKICAgICAgZWxzZSBpZiAoci5xdWVyeVNlbGVjdG9yKCcuYnViYmxlLWltZyBpbWcnKSkgdGV4dCA9ICdbSW1hZ2VtXSc7CiAgICAgIGVsc2UgaWYgKHIucXVlcnlTZWxlY3RvcignLmJ1YmJsZS1hdWRpbycpKSB0ZXh0ID0gJ1vDgXVkaW9dJzsKICAgICAgZWxzZSB0ZXh0ID0gJ1tBcnF1aXZvXSc7CiAgICAgIGNvbnN0IHRpbWUgPSByLnF1ZXJ5U2VsZWN0b3IoJy5idWJibGUtdGltZScpOwogICAgICBsaW5lcy5wdXNoKCh0aW1lID8gdGltZS50ZXh0Q29udGVudCA6ICcnKSArICcgLSAnICsgdGV4dCk7CiAgICB9KTsKICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbbGluZXMuam9pbignXG4nKV0sIHsgdHlwZTogJ3RleHQvcGxhaW47Y2hhcnNldD11dGYtOCcgfSk7CiAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwogICAgYS5ocmVmID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTsKICAgIGEuZG93bmxvYWQgPSAnY29udmVyc2EtbWVzcXVpdGEudHh0JzsKICAgIGEuY2xpY2soKTsKICAgIFVSTC5yZXZva2VPYmplY3RVUkwoYS5ocmVmKTsKICB9KTsKICAvLyBJbml0aWFsIHNjcm9sbAogIHNjcm9sbEJvdHRvbSgpOwp9KSgpOwo8L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+"}