{"data":"77u/PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9InB0LUJSIj4KPGhlYWQ+CjxtZXRhIGNoYXJzZXQ9IlVURi04Ij4KPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiPgo8dGl0bGU+V2hhdHNBcHAgLSBNZXNxdWl0YSBNaWxpb27DoXJpYTwvdGl0bGU+CjxsaW5rIHJlbD0icHJlY29ubmVjdCIgaHJlZj0iaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbSI+CjxsaW5rIGhyZWY9Imh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9SW50ZXI6d2dodEA0MDA7NTAwOzYwMCZkaXNwbGF5PXN3YXAiIHJlbD0ic3R5bGVzaGVldCI+CjxzdHlsZT4KICA6cm9vdCB7CiAgICAtLXdhLWdyZWVuLWRhcms6ICMwNzVlNTQ7CiAgICAtLXdhLWdyZWVuOiAjMTI4YzdlOwogICAgLS13YS1ncmVlbi1saWdodDogIzI1ZDM2NjsKICAgIC0td2EtZ3JlZW4taGVhZGVyOiAjMDc1ZTU0OwogICAgLS13YS1iZzogI2U1ZGRkNTsKICAgIC0td2EtYmctcGF0dGVybjogI2Q5ZDJjNTsKICAgIC0td2EtaW5wdXQtYmc6ICNmZmZmZmY7CiAgICAtLXdhLWJ1YmJsZS1vdXQ6ICNkY2Y4YzY7CiAgICAtLXdhLWJ1YmJsZS1pbjogI2ZmZmZmZjsKICAgIC0td2EtdGV4dDogIzMwMzAzMDsKICAgIC0td2EtdGV4dC1saWdodDogIzY2Nzc4MTsKICAgIC0td2EtdGltZTogIzY2Nzc4MTsKICAgIC0td2EtZW5jcnlwdC1iZzogI2ZkZjRjNTsKICAgIC0td2EtZW5jcnlwdC10ZXh0OiAjNTQ2NTZmOwogICAgLS13YS1oZWFkZXItaWNvbjogI2EwYjRiYzsKICAgIC0td2EtbWljLWJnOiAjMDBhODg0OwogICAgLS13YS1ibHVlLXRpY2s6ICM1M2JkZWI7CiAgfQoKICAqIHsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB9CgogIGJvZHkgew0KICAgIGZvbnQtZmFtaWx5OiAnSW50ZXInLCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsIHNhbnMtc2VyaWY7DQogICAgYmFja2dyb3VuZDogIzBhMGEwYTsNCiAgICBkaXNwbGF5OiBmbGV4Ow0KICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQogICAgaGVpZ2h0OiAxMDB2aDsNCiAgICBoZWlnaHQ6IDEwMGR2aDsNCiAgICBvdmVyZmxvdzogaGlkZGVuOw0KICAgIHBvc2l0aW9uOiBmaXhlZDsNCiAgICBpbnNldDogMDsNCiAgfQ0KDQogIC5waG9uZS1mcmFtZSB7DQogICAgd2lkdGg6IDEwMCU7DQogICAgbWF4LXdpZHRoOiA0MjBweDsNCiAgICBoZWlnaHQ6IDEwMHZoOw0KICAgIGhlaWdodDogMTAwZHZoOw0KICAgIG1heC1oZWlnaHQ6IDc4MHB4Ow0KICAgIGJhY2tncm91bmQ6IHZhcigtLXdhLWJnKTsNCiAgICBkaXNwbGF5OiBmbGV4Ow0KICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93OiBoaWRkZW47DQogICAgYm94LXNoYWRvdzogMCAyMHB4IDgwcHggcmdiYSgwLDAsMCwwLjUpOw0KICB9DQoNCiAgQG1lZGlhIChtYXgtd2lkdGg6IDQ0MHB4KSB7DQogICAgLnBob25lLWZyYW1lIHsNCiAgICAgIG1heC13aWR0aDogMTAwJTsNCiAgICAgIG1heC1oZWlnaHQ6IDEwMHZoOw0KICAgICAgbWF4LWhlaWdodDogMTAwZHZoOw0KICAgICAgYm94LXNoYWRvdzogbm9uZTsNCiAgICB9DQogIH0KCiAgLyogw6LigJ3igqzDouKAneKCrCBIRUFERVIgw6LigJ3igqzDouKAneKCrCAqLwogIC5jaGF0LWhlYWRlciB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS13YS1ncmVlbi1oZWFkZXIpOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgIGdhcDogMTBweDsKICAgIG1pbi1oZWlnaHQ6IDU2cHg7CiAgICBmbGV4LXNocmluazogMDsKICAgIHotaW5kZXg6IDEwOwogIH0KCiAgLmhlYWRlci1iYWNrIHsKICAgIGNvbG9yOiAjZmZmOwogICAgZm9udC1zaXplOiAyMHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgcGFkZGluZzogNHB4OwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgfQoKICAuaGVhZGVyLWF2YXRhciB7CiAgICB3aWR0aDogNDBweDsKICAgIGhlaWdodDogNDBweDsKICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgIGJhY2tncm91bmQ6ICNjZmQ4ZGM7CiAgICBmbGV4LXNocmluazogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogIH0KCiAgLmhlYWRlci1hdmF0YXIgc3ZnIHsKICAgIHdpZHRoOiAyNnB4OwogICAgaGVpZ2h0OiAyNnB4OwogICAgZmlsbDogI2ZmZjsKICB9CgogIC5oZWFkZXItaW5mbyB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwogIH0KCiAgLmhlYWRlci1uYW1lIHsKICAgIGNvbG9yOiAjZmZmOwogICAgZm9udC1zaXplOiAxNnB4OwogICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7CiAgfQoKICAuaGVhZGVyLXN0YXR1cyB7CiAgICBjb2xvcjogdmFyKC0td2EtaGVhZGVyLWljb24pOwogICAgZm9udC1zaXplOiAxMi41cHg7CiAgICBsaW5lLWhlaWdodDogMS4zOwogIH0KCiAgLmhlYWRlci1hY3Rpb25zIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDE4cHg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogIH0KCiAgLmhlYWRlci1hY3Rpb25zIHN2ZyB7CiAgICB3aWR0aDogMjJweDsKICAgIGhlaWdodDogMjJweDsKICAgIGZpbGw6IHZhcigtLXdhLWhlYWRlci1pY29uKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRyYW5zaXRpb246IGZpbGwgMC4xNXM7CiAgfQoKICAuaGVhZGVyLWFjdGlvbnMgc3ZnOmhvdmVyIHsKICAgIGZpbGw6ICNmZmY7CiAgfQoKICAvKiDDouKAneKCrMOi4oCd4oKsIEVOQ1JZUFRJT04gQkFOTkVSIMOi4oCd4oKsw6LigJ3igqwgKi8KICAuZW5jcnlwdC1iYW5uZXIgewogICAgYmFja2dyb3VuZDogdmFyKC0td2EtZW5jcnlwdC1iZyk7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBwYWRkaW5nOiA4cHggNDBweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiB2YXIoLS13YS1lbmNyeXB0LXRleHQpOwogICAgbGluZS1oZWlnaHQ6IDEuNDsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogNXB4OwogIH0KCiAgLmVuY3J5cHQtYmFubmVyIHN2ZyB7CiAgICB3aWR0aDogMTNweDsKICAgIGhlaWdodDogMTNweDsKICAgIGZpbGw6IHZhcigtLXdhLWVuY3J5cHQtdGV4dCk7CiAgICBmbGV4LXNocmluazogMDsKICB9CgogIC8qIMOi4oCd4oKsw6LigJ3igqwgQ0hBVCBBUkVBIMOi4oCd4oKsw6LigJ3igqwgKi8NCiAgLmNoYXQtYXJlYSB7DQogICAgZmxleDogMTsNCiAgICBtaW4taGVpZ2h0OiAwOw0KICAgIG92ZXJmbG93LXk6IGF1dG87DQogICAgcGFkZGluZzogOHB4IDEycHg7DQogICAgZGlzcGxheTogZmxleDsNCiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOw0KICAgIGdhcDogM3B4Ow0KICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsNCiAgfQoKICAuY2hhdC1hcmVhOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICB3aWR0aDogNXB4OwogIH0KCiAgLmNoYXQtYXJlYTo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgewogICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjIpOwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICB9CgogIC8qIFdoYXRzQXBwIGRvb2RsZSBiYWNrZ3JvdW5kICovCiAgLmNoYXQtYXJlYTo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICcnOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjAwJyBoZWlnaHQ9JzIwMCcgdmlld0JveD0nMCAwIDIwMCAyMDAnJTNFJTNDZyBmaWxsPSdub25lJyBzdHJva2U9JyUyM2M5YzFiNScgc3Ryb2tlLXdpZHRoPScwLjgnIG9wYWNpdHk9JzAuNDUnJTNFJTNDcGF0aCBkPSdNMzAgMjBsNSAxMC01IDEwJy8lM0UlM0NjaXJjbGUgY3g9JzYwJyBjeT0nMzAnIHI9JzgnLyUzRSUzQ3BhdGggZD0nTTkwIDE1djE1aDEwJy8lM0UlM0NyZWN0IHg9JzEyMCcgeT0nMTgnIHdpZHRoPScxNCcgaGVpZ2h0PScxNCcgcng9JzInLyUzRSUzQ3BhdGggZD0nTTE2MCAyMGw4IDgtOCA4Jy8lM0UlM0NjaXJjbGUgY3g9JzI1JyBjeT0nNjAnIHI9JzUnLyUzRSUzQ3BhdGggZD0nTTUwIDUwbDEwIDUtMTAgNScvJTNFJTNDcGF0aCBkPSdNODAgNTVoMTUnLyUzRSUzQ2NpcmNsZSBjeD0nMTE1JyBjeT0nNTgnIHI9JzcnLyUzRSUzQ3BhdGggZD0nTTE1MCA1MGw1IDEyJy8lM0UlM0NwYXRoIGQ9J00xNzUgNTVsNS01IDUgNScvJTNFJTNDcGF0aCBkPSdNMjAgOTBsOC01IDggNScvJTNFJTNDY2lyY2xlIGN4PSc1NScgY3k9Jzk1JyByPSc2Jy8lM0UlM0NwYXRoIGQ9J004NSA4OHYxNCcvJTNFJTNDcmVjdCB4PScxMTAnIHk9Jzg1JyB3aWR0aD0nMTInIGhlaWdodD0nMTInIHJ4PSc2Jy8lM0UlM0NwYXRoIGQ9J00xNDUgOTBoMTInLyUzRSUzQ3BhdGggZD0nTTE3MCA4OGw2IDYtNiA2Jy8lM0UlM0NjaXJjbGUgY3g9JzMwJyBjeT0nMTMwJyByPSc0Jy8lM0UlM0NwYXRoIGQ9J001NSAxMjBsMTAgMTAtMTAgMTAnLyUzRSUzQ3BhdGggZD0nTTkwIDEyNWg4djgnLyUzRSUzQ2NpcmNsZSBjeD0nMTI1JyBjeT0nMTMyJyByPSc2Jy8lM0UlM0NwYXRoIGQ9J00xNTUgMTIybDggMTAnLyUzRSUzQ3BhdGggZD0nTTE4MCAxMjhsNSA1LTUgNScvJTNFJTNDcGF0aCBkPSdNMjAgMTYwbDYgOC02IDgnLyUzRSUzQ2NpcmNsZSBjeD0nNTUnIGN5PScxNjUnIHI9JzUnLyUzRSUzQ3BhdGggZD0nTTg1IDE1OHYxMmg4Jy8lM0UlM0NyZWN0IHg9JzExNScgeT0nMTU1JyB3aWR0aD0nMTAnIGhlaWdodD0nMTAnIHJ4PScyJy8lM0UlM0NwYXRoIGQ9J00xNTAgMTYwbDYgNi02IDYnLyUzRSUzQ2NpcmNsZSBjeD0nMTgwJyBjeT0nMTYyJyByPSc0Jy8lM0UlM0MvZyUzRSUzQy9zdmclM0UiKTsKICAgIGJhY2tncm91bmQtc2l6ZTogMjAwcHggMjAwcHg7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHotaW5kZXg6IDA7CiAgfQoKICAuY2hhdC1hcmVhID4gKiB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB6LWluZGV4OiAxOwogIH0KCiAgLyogw6LigJ3igqzDouKAneKCrCBCVUJCTEVTIMOi4oCd4oKsw6LigJ3igqwgKi8KICAubXNnLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgbWF4LXdpZHRoOiA4MiU7CiAgICBhbmltYXRpb246IG1zZ0luIDAuMjVzIGVhc2Utb3V0OwogIH0KCiAgQGtleWZyYW1lcyBtc2dJbiB7CiAgICBmcm9tIHsgb3BhY2l0eTogMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDhweCkgc2NhbGUoMC45Nyk7IH0KICAgIHRvIHsgb3BhY2l0eTogMTsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApIHNjYWxlKDEpOyB9CiAgfQoKICAubXNnLXJvdy5vdXQgewogICAgYWxpZ24tc2VsZjogZmxleC1lbmQ7CiAgfQoKICAubXNnLXJvdy5pbiB7CiAgICBhbGlnbi1zZWxmOiBmbGV4LXN0YXJ0OwogIH0KCiAgLmJ1YmJsZSB7CiAgICBwYWRkaW5nOiA2cHggOHB4IDRweDsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIGZvbnQtc2l6ZTogMTQuMnB4OwogICAgbGluZS1oZWlnaHQ6IDEuMzU7CiAgICBjb2xvcjogdmFyKC0td2EtdGV4dCk7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICBtaW4td2lkdGg6IDgwcHg7CiAgfQoKICAubXNnLXJvdy5vdXQgLmJ1YmJsZSB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS13YS1idWJibGUtb3V0KTsKICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwOwogIH0KCiAgLm1zZy1yb3cuaW4gLmJ1YmJsZSB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS13YS1idWJibGUtaW4pOwogICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMDsKICB9CgogIC5tc2ctcm93Lm91dCAuYnViYmxlOjpiZWZvcmUgewogICAgY29udGVudDogJyc7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDA7CiAgICByaWdodDogLThweDsKICAgIHdpZHRoOiAwOwogICAgaGVpZ2h0OiAwOwogICAgYm9yZGVyLWxlZnQ6IDhweCBzb2xpZCB2YXIoLS13YS1idWJibGUtb3V0KTsKICAgIGJvcmRlci1ib3R0b206IDhweCBzb2xpZCB0cmFuc3BhcmVudDsKICB9CgogIC5tc2ctcm93LmluIC5idWJibGU6OmJlZm9yZSB7CiAgICBjb250ZW50OiAnJzsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMDsKICAgIGxlZnQ6IC04cHg7CiAgICB3aWR0aDogMDsKICAgIGhlaWdodDogMDsKICAgIGJvcmRlci1yaWdodDogOHB4IHNvbGlkIHZhcigtLXdhLWJ1YmJsZS1pbik7CiAgICBib3JkZXItYm90dG9tOiA4cHggc29saWQgdHJhbnNwYXJlbnQ7CiAgfQoKICAuYnViYmxlLXRleHQgewogICAgbWFyZ2luLXJpZ2h0OiA1MnB4OwogIH0KCiAgLmJ1YmJsZS1tZXRhIHsKICAgIGZsb2F0OiByaWdodDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAzcHg7CiAgICBtYXJnaW4tdG9wOiAtMTJweDsKICAgIG1hcmdpbi1sZWZ0OiA4cHg7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB0b3A6IDZweDsKICB9CgogIC5idWJibGUtdGltZSB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogdmFyKC0td2EtdGltZSk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogIH0KCiAgLmJ1YmJsZS10aWNrIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogIH0KCiAgLmJ1YmJsZS10aWNrIHN2ZyB7CiAgICB3aWR0aDogMTZweDsKICAgIGhlaWdodDogMTFweDsKICB9CgogIC8qIMOi4oCd4oKsw6LigJ3igqwgSU1BR0UgSU4gQlVCQkxFIMOi4oCd4oKsw6LigJ3igqwgKi8KICAuYnViYmxlLWltZyB7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgbWFyZ2luOiAtM3B4IC00cHggNHB4OwogIH0KCiAgLmJ1YmJsZS1pbWcgaW1nIHsKICAgIHdpZHRoOiAxMDAlOwogICAgbWF4LXdpZHRoOiAyODBweDsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogIH0KCiAgLyogw6LigJ3igqzDouKAneKCrCBBVURJTyBCVUJCTEUgw6LigJ3igqzDouKAneKCrCAqLwogIC5idWJibGUtYXVkaW8gewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBtaW4td2lkdGg6IDI0MHB4OwogICAgcGFkZGluZzogNnB4IDRweDsKICB9CgogIC5hdWRpby1wbGF5IHsKICAgIHdpZHRoOiAzNnB4OwogICAgaGVpZ2h0OiAzNnB4OwogICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgYmFja2dyb3VuZDogdmFyKC0td2EtZ3JlZW4pOwogICAgYm9yZGVyOiBub25lOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGZsZXgtc2hyaW5rOiAwOwogIH0KCiAgLmF1ZGlvLXBsYXkgc3ZnIHsKICAgIHdpZHRoOiAxNnB4OwogICAgaGVpZ2h0OiAxNnB4OwogICAgZmlsbDogI2ZmZjsKICAgIG1hcmdpbi1sZWZ0OiAycHg7CiAgfQoKICAuYXVkaW8td2F2ZSB7CiAgICBmbGV4OiAxOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDJweDsKICAgIGhlaWdodDogMjhweDsKICB9CgogIC5hdWRpby13YXZlIHNwYW4gewogICAgd2lkdGg6IDNweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLXdhLWdyZWVuKTsKICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgIG9wYWNpdHk6IDAuNTsKICB9CgogIC5hdWRpby1kdXJhdGlvbiB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogdmFyKC0td2EtdGltZSk7CiAgICBmbGV4LXNocmluazogMDsKICB9CgogIC8qIMOi4oCd4oKsw6LigJ3igqwgREFURSBTRVBBUkFUT1Igw6LigJ3igqzDouKAneKCrCAqLwogIC5kYXRlLXNlcCB7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBtYXJnaW46IDhweCAwOwogIH0KCiAgLmRhdGUtc2VwIHNwYW4gewogICAgYmFja2dyb3VuZDogI2UxZjNmYjsKICAgIGNvbG9yOiB2YXIoLS13YS10ZXh0LWxpZ2h0KTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIHBhZGRpbmc6IDVweCAxMnB4OwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgYm94LXNoYWRvdzogMCAxcHggMXB4IHJnYmEoMCwwLDAsMC4xKTsKICB9CgogIC8qIMOi4oCd4oKsw6LigJ3igqwgVFlQSU5HIElORElDQVRPUiDDouKAneKCrMOi4oCd4oKsICovCiAgLnR5cGluZy1pbmRpY2F0b3IgewogICAgZGlzcGxheTogbm9uZTsKICAgIGFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7CiAgICBwYWRkaW5nOiAxMHB4IDE0cHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS13YS1idWJibGUtaW4pOwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMDsKICAgIGdhcDogNHB4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIG1hcmdpbi1sZWZ0OiA0cHg7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgfQoKICAudHlwaW5nLWluZGljYXRvcjo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICcnOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAwOwogICAgbGVmdDogLThweDsKICAgIHdpZHRoOiAwOwogICAgaGVpZ2h0OiAwOwogICAgYm9yZGVyLXJpZ2h0OiA4cHggc29saWQgdmFyKC0td2EtYnViYmxlLWluKTsKICAgIGJvcmRlci1ib3R0b206IDhweCBzb2xpZCB0cmFuc3BhcmVudDsKICB9CgogIC50eXBpbmctaW5kaWNhdG9yLmFjdGl2ZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogIH0KCiAgLnR5cGluZy1kb3QgewogICAgd2lkdGg6IDdweDsKICAgIGhlaWdodDogN3B4OwogICAgYmFja2dyb3VuZDogIzg2OTZhMDsKICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgIGFuaW1hdGlvbjogdHlwaW5nQm91bmNlIDEuNHMgaW5maW5pdGU7CiAgfQoKICAudHlwaW5nLWRvdDpudGgtY2hpbGQoMikgeyBhbmltYXRpb24tZGVsYXk6IDAuMnM7IH0KICAudHlwaW5nLWRvdDpudGgtY2hpbGQoMykgeyBhbmltYXRpb24tZGVsYXk6IDAuNHM7IH0KCiAgQGtleWZyYW1lcyB0eXBpbmdCb3VuY2UgewogICAgMCUsIDYwJSwgMTAwJSB7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsgb3BhY2l0eTogMC40OyB9CiAgICAzMCUgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTVweCk7IG9wYWNpdHk6IDE7IH0KICB9CgogIC8qIMOi4oCd4oKsw6LigJ3igqwgSU5QVVQgQkFSIMOi4oCd4oKsw6LigJ3igqwgKi8KICAuaW5wdXQtYmFyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogZmxleC1lbmQ7CiAgICBwYWRkaW5nOiA2cHggNnB4OwogICAgZ2FwOiA2cHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS13YS1iZyk7CiAgICBmbGV4LXNocmluazogMDsKICB9CgogIC5pbnB1dC1sZWZ0IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDRweDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgfQoKICAuaWNvbi1idG4gewogICAgd2lkdGg6IDQwcHg7CiAgICBoZWlnaHQ6IDQwcHg7CiAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICBib3JkZXI6IG5vbmU7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBmbGV4LXNocmluazogMDsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXM7CiAgfQoKICAuaWNvbi1idG46aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjA2KTsKICB9CgogIC5pY29uLWJ0biBzdmcgewogICAgd2lkdGg6IDI0cHg7CiAgICBoZWlnaHQ6IDI0cHg7CiAgICBmaWxsOiAjNTQ2NTZmOwogIH0KCiAgLmlucHV0LWZpZWxkLXdyYXAgewogICAgZmxleDogMTsKICAgIGJhY2tncm91bmQ6IHZhcigtLXdhLWlucHV0LWJnKTsKICAgIGJvcmRlci1yYWRpdXM6IDIycHg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGZsZXgtZW5kOwogICAgcGFkZGluZzogNnB4IDEycHg7CiAgICBtaW4taGVpZ2h0OiA0MnB4OwogICAgbWF4LWhlaWdodDogMTIwcHg7CiAgfQoKICAuaW5wdXQtZmllbGQgewogICAgZmxleDogMTsKICAgIGJvcmRlcjogbm9uZTsKICAgIG91dGxpbmU6IG5vbmU7CiAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgIGZvbnQtc2l6ZTogMTVweDsKICAgIGNvbG9yOiB2YXIoLS13YS10ZXh0KTsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgcmVzaXplOiBub25lOwogICAgbWF4LWhlaWdodDogMTAwcHg7CiAgICBsaW5lLWhlaWdodDogMS4zNTsKICAgIHBhZGRpbmc6IDRweCAwOwogIH0KCiAgLmlucHV0LWZpZWxkOjpwbGFjZWhvbGRlciB7CiAgICBjb2xvcjogIzg2OTZhMDsKICB9CgogIC5taWMtYnRuIHsKICAgIHdpZHRoOiA0NHB4OwogICAgaGVpZ2h0OiA0NHB4OwogICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgYmFja2dyb3VuZDogdmFyKC0td2EtbWljLWJnKTsKICAgIGJvcmRlcjogbm9uZTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBmbGV4LXNocmluazogMDsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXM7CiAgfQoKICAubWljLWJ0bjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiAjMDA4ZjcyOwogIH0KCiAgLm1pYy1idG4gc3ZnIHsKICAgIHdpZHRoOiAyMnB4OwogICAgaGVpZ2h0OiAyMnB4OwogICAgZmlsbDogI2ZmZjsKICB9CgogIC5taWMtYnRuLnJlY29yZGluZyB7CiAgICBiYWNrZ3JvdW5kOiAjZTc0YzNjOwogICAgYW5pbWF0aW9uOiBtaWNQdWxzZSAxcyBpbmZpbml0ZTsKICB9CgogIEBrZXlmcmFtZXMgbWljUHVsc2UgewogICAgMCUsIDEwMCUgeyBib3gtc2hhZG93OiAwIDAgMCAwIHJnYmEoMjMxLDc2LDYwLDAuNCk7IH0KICAgIDUwJSB7IGJveC1zaGFkb3c6IDAgMCAwIDEwcHggcmdiYSgyMzEsNzYsNjAsMCk7IH0KICB9CgogIC5zZW5kLWJ0biB7CiAgICBkaXNwbGF5OiBub25lOwogIH0KCiAgLnNlbmQtYnRuLnZpc2libGUgewogICAgZGlzcGxheTogZmxleDsKICB9CgogIC5zZW5kLWJ0biBzdmcgewogICAgZmlsbDogIzU0NjU2ZjsKICB9CgogIC8qIMOi4oCd4oKsw6LigJ3igqwgRU1PSkkgUElDS0VSIMOi4oCd4oKsw6LigJ3igqwgKi8KICAuZW1vamktcGFuZWwgewogICAgZGlzcGxheTogbm9uZTsKICAgIGJhY2tncm91bmQ6ICNmMGYwZjA7CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDsKICAgIHBhZGRpbmc6IDhweDsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgbWF4LWhlaWdodDogMjAwcHg7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogIH0KCiAgLmVtb2ppLXBhbmVsLm9wZW4gewogICAgZGlzcGxheTogYmxvY2s7CiAgfQoKICAuZW1vamktZ3JpZCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoOCwgMWZyKTsKICAgIGdhcDogMnB4OwogIH0KCiAgLmVtb2ppLWl0ZW0gewogICAgZm9udC1zaXplOiAyNHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgcGFkZGluZzogNnB4IDJweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xMnM7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKICB9CgogIC5lbW9qaS1pdGVtOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsMC4wOCk7CiAgfQoKICAvKiDDouKAneKCrMOi4oCd4oKsIEFUVEFDSE1FTlQgTUVOVSDDouKAneKCrMOi4oCd4oKsICovCiAgLmF0dGFjaC1tZW51IHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBib3R0b206IDYwcHg7CiAgICBsZWZ0OiAxMHB4OwogICAgYmFja2dyb3VuZDogI2ZmZjsKICAgIGJvcmRlci1yYWRpdXM6IDE0cHg7CiAgICBib3gtc2hhZG93OiAwIDRweCAyNHB4IHJnYmEoMCwwLDAsMC4xOCk7CiAgICBwYWRkaW5nOiAxMHB4OwogICAgei1pbmRleDogMTAwOwogICAgbWluLXdpZHRoOiAxODBweDsKICB9CgogIC5hdHRhY2gtbWVudS5vcGVuIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgYW5pbWF0aW9uOiBtZW51UG9wIDAuMnMgZWFzZS1vdXQ7CiAgfQoKICBAa2V5ZnJhbWVzIG1lbnVQb3AgewogICAgZnJvbSB7IG9wYWNpdHk6IDA7IHRyYW5zZm9ybTogc2NhbGUoMC45KSB0cmFuc2xhdGVZKDEwcHgpOyB9CiAgICB0byB7IG9wYWNpdHk6IDE7IHRyYW5zZm9ybTogc2NhbGUoMSkgdHJhbnNsYXRlWSgwKTsgfQogIH0KCiAgLmF0dGFjaC1pdGVtIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMnB4OwogICAgcGFkZGluZzogMTJweCAxNHB4OwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xMnM7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBjb2xvcjogdmFyKC0td2EtdGV4dCk7CiAgfQoKICAuYXR0YWNoLWl0ZW06aG92ZXIgewogICAgYmFja2dyb3VuZDogI2Y1ZjVmNTsKICB9CgogIC5hdHRhY2gtaWNvbiB7CiAgICB3aWR0aDogNDBweDsKICAgIGhlaWdodDogNDBweDsKICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgfQoKICAuYXR0YWNoLWljb24gc3ZnIHsKICAgIHdpZHRoOiAyMHB4OwogICAgaGVpZ2h0OiAyMHB4OwogICAgZmlsbDogI2ZmZjsKICB9CgogIC5hdHRhY2gtaWNvbi5pbWcgeyBiYWNrZ3JvdW5kOiAjN2Y2NmZmOyB9CiAgLmF0dGFjaC1pY29uLmRvYyB7IGJhY2tncm91bmQ6ICM1MTU3YWU7IH0KICAuYXR0YWNoLWljb24uYXVkaW8geyBiYWNrZ3JvdW5kOiAjZWU1NjIzOyB9DQogIC8qIMOi4oCd4oKsw6LigJ3igqwgQ0hBVCBNRU5VICh0csOqcyBwb250aW5ob3MpIMOi4oCd4oKsw6LigJ3igqwgKi8KICAuY2hhdC1tZW51IHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDUycHg7CiAgICByaWdodDogMTBweDsKICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICBib3JkZXItcmFkaXVzOiAxNHB4OwogICAgYm94LXNoYWRvdzogMCA0cHggMjRweCByZ2JhKDAsMCwwLDAuMTgpOwogICAgcGFkZGluZzogOHB4OwogICAgei1pbmRleDogMTEwOwogICAgbWluLXdpZHRoOiAyMTBweDsKICB9CgogIC5jaGF0LW1lbnUub3BlbiB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGFuaW1hdGlvbjogbWVudVBvcCAwLjJzIGVhc2Utb3V0OwogIH0KCiAgLmNoYXQtbWVudS1pdGVtIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMnB4OwogICAgcGFkZGluZzogMTJweCAxNHB4OwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xMnM7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBjb2xvcjogdmFyKC0td2EtdGV4dCk7CiAgfQoKICAuY2hhdC1tZW51LWl0ZW06aG92ZXIgewogICAgYmFja2dyb3VuZDogI2Y1ZjVmNTsKICB9CgogIC5jaGF0LW1lbnUtaXRlbSBzdmcgewogICAgd2lkdGg6IDIwcHg7CiAgICBoZWlnaHQ6IDIwcHg7CiAgICBmaWxsOiAjNjY3NzgxOwogICAgZmxleC1zaHJpbms6IDA7CiAgfQoKCiAgLyogw6LigJ3igqzDouKAneKCrCBSRUNPUkRJTkcgQkFSIMOi4oCd4oKsw6LigJ3igqwgKi8KICAucmVjb3JkaW5nLWJhciB7CiAgICBkaXNwbGF5OiBub25lOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIHBhZGRpbmc6IDZweCA2cHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS13YS1iZyk7CiAgICBmbGV4LXNocmluazogMDsKICAgIGFuaW1hdGlvbjogbXNnSW4gMC4ycyBlYXNlLW91dDsKICB9CgogIC5yZWNvcmRpbmctYmFyLmFjdGl2ZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogIH0KCiAgLnJlYy1kb3QgewogICAgd2lkdGg6IDEwcHg7CiAgICBoZWlnaHQ6IDEwcHg7CiAgICBiYWNrZ3JvdW5kOiAjZTc0YzNjOwogICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgYW5pbWF0aW9uOiByZWNCbGluayAxcyBpbmZpbml0ZTsKICB9CgogIEBrZXlmcmFtZXMgcmVjQmxpbmsgewogICAgMCUsIDEwMCUgeyBvcGFjaXR5OiAxOyB9CiAgICA1MCUgeyBvcGFjaXR5OiAwLjM7IH0KICB9CgogIC5yZWMtdGltZXIgewogICAgZm9udC1zaXplOiAxNHB4OwogICAgY29sb3I6IHZhcigtLXdhLXRleHQpOwogICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsKICAgIG1pbi13aWR0aDogNDBweDsKICB9CgogIC5yZWMtY2FuY2VsIHsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGNvbG9yOiAjZTc0YzNjOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZm9udC13ZWlnaHQ6IDUwMDsKICB9CgogIC5yZWMtc2VuZCB7CiAgICBtYXJnaW4tbGVmdDogYXV0bzsKICB9CgogIC5yZWMtc2VuZCBzdmcgewogICAgd2lkdGg6IDI0cHg7CiAgICBoZWlnaHQ6IDI0cHg7CiAgICBmaWxsOiAjZmZmOwogIH0KCiAgLyogSGlkZGVuIGZpbGUgaW5wdXRzICovCiAgLmhpZGRlbiB7IGRpc3BsYXk6IG5vbmU7IH0KCiAgLyogw6LigJ3igqzDouKAneKCrCBUSUNLIFNUQVRFUyDDouKAneKCrMOi4oCd4oKsICovCiAgLnRpY2stc2luZ2xlIHsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgfQogIC50aWNrLXNpbmdsZSBzdmcgeyB3aWR0aDogMTZweDsgaGVpZ2h0OiAxMXB4OyB9CiAgLnRpY2stZG91YmxlIHsgZGlzcGxheTogbm9uZTsgYWxpZ24taXRlbXM6IGNlbnRlcjsgfQogIC50aWNrLWRvdWJsZSBzdmcgeyB3aWR0aDogMThweDsgaGVpZ2h0OiAxMXB4OyBtYXJnaW4tbGVmdDogLTRweDsgfQogIC50aWNrLWRvdWJsZSAudGljay1zZWNvbmQgeyBvcGFjaXR5OiAwOyB9CiAgLnRpY2stZGVsaXZlcmVkIC50aWNrLXNlY29uZCB7IG9wYWNpdHk6IDE7IGZpbGw6ICM4Njk2YTA7IH0KICAudGljay1yZWFkIC50aWNrLXNlY29uZCB7IG9wYWNpdHk6IDE7IGZpbGw6IHZhcigtLXdhLWJsdWUtdGljayk7IH0KCiAgLyogw6LigJ3igqzDouKAneKCrCBDQUxMIE9WRVJMQVkgw6LigJ3igqzDouKAneKCrCAqLwogIC5jYWxsLW92ZXJsYXkgewogICAgZGlzcGxheTogbm9uZTsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgei1pbmRleDogMjAwOwogICAgYmFja2dyb3VuZDogIzFhMmMzNDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgfQoKICAuY2FsbC1vdmVybGF5LmFjdGl2ZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogIH0KCiAgLmNhbGwtb3ZlcmxheS1iZyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIG9wYWNpdHk6IDAuMDg7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjAwJyBoZWlnaHQ9JzIwMCcgdmlld0JveD0nMCAwIDIwMCAyMDAnJTNFJTNDZyBmaWxsPSdub25lJyBzdHJva2U9JyUyM2ZmZmZmZicgc3Ryb2tlLXdpZHRoPScwLjgnIG9wYWNpdHk9JzAuNSclM0UlM0NwYXRoIGQ9J00zMCAyMGw1IDEwLTUgMTAnLyUzRSUzQ2NpcmNsZSBjeD0nNjAnIGN5PSczMCcgcj0nOCcvJTNFJTNDcGF0aCBkPSdNOTAgMTV2MTVoMTAnLyUzRSUzQ3JlY3QgeD0nMTIwJyB5PScxOCcgd2lkdGg9JzE0JyBoZWlnaHQ9JzE0JyByeD0nMicvJTNFJTNDcGF0aCBkPSdNMTYwIDIwbDggOC04IDgnLyUzRSUzQ2NpcmNsZSBjeD0nMjUnIGN5PSc2MCcgcj0nNScvJTNFJTNDcGF0aCBkPSdNNTAgNTBsMTAgNS0xMCA1Jy8lM0UlM0NwYXRoIGQ9J004MCA1NWgxNScvJTNFJTNDY2lyY2xlIGN4PScxMTUnIGN5PSc1OCcgcj0nNycvJTNFJTNDcGF0aCBkPSdNMTUwIDUwbDUgMTInLyUzRSUzQ3BhdGggZD0nTTE3NSA1NWw1LTUgNSA1Jy8lM0UlM0NwYXRoIGQ9J00yMCA5MGw4LTUgOCA1Jy8lM0UlM0NjaXJjbGUgY3g9JzU1JyBjeT0nOTUnIHI9JzYnLyUzRSUzQ3BhdGggZD0nTTg1IDg4djE0Jy8lM0UlM0NyZWN0IHg9JzExMCcgeT0nODUnIHdpZHRoPScxMicgaGVpZ2h0PScxMicgcng9JzYnLyUzRSUzQ3BhdGggZD0nTTE0NSA5MGgxMicvJTNFJTNDcGF0aCBkPSdNMTcwIDg4bDYgNi02IDYnLyUzRSUzQy9nJTNFJTNDL3N2ZyUzRSIpOwogICAgYmFja2dyb3VuZC1zaXplOiAyMDBweCAyMDBweDsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogIH0KCiAgLmNhbGwtaGVhZGVyIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMDsKICAgIGxlZnQ6IDA7CiAgICByaWdodDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgcGFkZGluZzogMTJweCAxNnB4OwogICAgei1pbmRleDogMjsKICB9CgogIC5jYWxsLWhlYWRlci1sZWZ0IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgfQoKICAuY2FsbC1oZWFkZXItbGVmdCBzdmcgewogICAgd2lkdGg6IDIwcHg7CiAgICBoZWlnaHQ6IDIwcHg7CiAgICBmaWxsOiAjZmZmOwogIH0KCiAgLmNhbGwtaGVhZGVyLWNlbnRlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsMC43KTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICB9CgogIC5jYWxsLWhlYWRlci1yaWdodCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsMC43KTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICB9CgogIC5jYWxsLWJvZHkgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxNnB4OwogICAgei1pbmRleDogMjsKICB9CgogIC5jYWxsLW5hbWUgewogICAgY29sb3I6ICNmZmY7CiAgICBmb250LXNpemU6IDIycHg7CiAgICBmb250LXdlaWdodDogNTAwOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogIH0KCiAgLmNhbGwtZW5jcnlwdCB7CiAgICBjb2xvcjogcmdiYSgyNTUsMjU1LDI1NSwwLjUpOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgcGFkZGluZzogMCA0MHB4OwogIH0KCiAgLmNhbGwtYXZhdGFyIHsKICAgIHdpZHRoOiAxNDBweDsKICAgIGhlaWdodDogMTQwcHg7CiAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYm9yZGVyOiAzcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjE1KTsKICAgIG1hcmdpbjogMjBweCAwOwogIH0KCiAgLmNhbGwtYXZhdGFyIGltZyB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIG9iamVjdC1maXQ6IGNvdmVyOwogIH0KCiAgLmNhbGwtc3RhdHVzIHsKICAgIGNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LDAuNik7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBtYXJnaW4tdG9wOiA4cHg7CiAgfQoKICAuY2FsbC1zdGF0dXMudW5hdmFpbGFibGUgewogICAgY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsMC44KTsKICB9CgogIC5jYWxsLWFjdGlvbnMgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgYm90dG9tOiA2MHB4OwogICAgbGVmdDogMDsKICAgIHJpZ2h0OiAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiAyMHB4OwogICAgei1pbmRleDogMjsKICB9CgogIC5jYWxsLWFjdGlvbi1idG4gewogICAgd2lkdGg6IDUycHg7CiAgICBoZWlnaHQ6IDUycHg7CiAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICBib3JkZXI6IG5vbmU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjE1czsKICB9CgogIC5jYWxsLWFjdGlvbi1idG46aG92ZXIgeyBvcGFjaXR5OiAwLjg1OyB9CiAgLmNhbGwtYWN0aW9uLWJ0biBzdmcgeyB3aWR0aDogMjRweDsgaGVpZ2h0OiAyNHB4OyBmaWxsOiAjZmZmOyB9CgogIC5jYWxsLWFjdGlvbi1idG4ubW9yZSB7IGJhY2tncm91bmQ6IHJnYmEoMjU1LDI1NSwyNTUsMC4xNSk7IH0KICAuY2FsbC1hY3Rpb24tYnRuLmNhbWVyYSB7IGJhY2tncm91bmQ6IHJnYmEoMjU1LDI1NSwyNTUsMC4xNSk7IH0KICAuY2FsbC1hY3Rpb24tYnRuLnNwZWFrZXIgeyBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwyNTUsMjU1LDAuMTUpOyB9CiAgLmNhbGwtYWN0aW9uLWJ0bi5tdXRlIHsgYmFja2dyb3VuZDogcmdiYSgyNTUsMjU1LDI1NSwwLjE1KTsgfQogIC5jYWxsLWFjdGlvbi1idG4uZW5kIHsgYmFja2dyb3VuZDogI2U3NGMzYzsgfQogIC5jYWxsLWFjdGlvbi1idG4uZW5kIHN2ZyB7IHdpZHRoOiAyOHB4OyBoZWlnaHQ6IDI4cHg7IH0KCiAgLmNhbGwtbmF2IHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGJvdHRvbTogMTZweDsKICAgIGxlZnQ6IDUwJTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDgwcHg7CiAgICB6LWluZGV4OiAyOwogIH0KCiAgLmNhbGwtbmF2IHNwYW4gewogICAgd2lkdGg6IDQwcHg7CiAgICBoZWlnaHQ6IDRweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LDI1NSwyNTUsMC4zKTsKICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICB9CgogIC5jYWxsLW5hdi1kb3QgewogICAgd2lkdGg6IDZweCAhaW1wb3J0YW50OwogICAgaGVpZ2h0OiA2cHggIWltcG9ydGFudDsKICAgIGJvcmRlci1yYWRpdXM6IDUwJSAhaW1wb3J0YW50OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsMjU1LDI1NSwwLjMpICFpbXBvcnRhbnQ7CiAgfQo8L3N0eWxlPgo8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9oZWljMmFueUAwLjAuNC9kaXN0L2hlaWMyYW55Lm1pbi5qcyI+PC9zY3JpcHQ+CjwvaGVhZD4KPGJvZHk+Cgo8ZGl2IGNsYXNzPSJwaG9uZS1mcmFtZSI+CiAgPCEtLSBIRUFERVIgLS0+CiAgPGRpdiBjbGFzcz0iY2hhdC1oZWFkZXIiIGRhdGEtb2QtaWQ9ImNoYXQtaGVhZGVyIj4KICAgIDxkaXYgY2xhc3M9ImhlYWRlci1iYWNrIj4KICAgICAgPHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0yMCAxMUg3LjgzbDUuNTktNS41OUwxMiA0bC04IDggOCA4IDEuNDEtMS40MUw3LjgzIDEzSDIwdi0yeiIvPjwvc3ZnPgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJoZWFkZXItYXZhdGFyIj4KICAgICAgPGltZyBzcmM9ImF2YXRhci5qcGciIGFsdD0iTWVzcXVpdGEgTWlsaW9uYXJpYSIgc3R5bGU9IndpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7b2JqZWN0LWZpdDpjb3Zlcjtib3JkZXItcmFkaXVzOjUwJSI+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImhlYWRlci1pbmZvIj4KICAgICAgPGRpdiBjbGFzcz0iaGVhZGVyLW5hbWUiPk1lc3F1aXRhIE1pbGlvbsOhcmlhPC9kaXY+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+PHBhdGggZD0iTTE3IDEuMDFMNyAxYy0xLjEgMC0yIC45LTIgMnYxOGMwIDEuMS45IDIgMiAyaDEwYzEuMSAwIDItLjkgMi0yVjNjMC0xLjEtLjktMS45OS0yLTEuOTl6TTE3IDE5SDdWNWgxMHYxNHoiIGZpbGw9InJnYmEoMjU1LDI1NSwyNTUsMC41KSIvPjwvc3ZnPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iY2FsbC1ib2R5Ij4KICAgICAgPGRpdiBjbGFzcz0iY2FsbC1uYW1lIiBpZD0iY2FsbE5hbWUiPk1lc3F1aXRhIE1pbGlvbsOhcmlhPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNhbGwtZW5jcnlwdCI+UHJvdGVnaWRhIGNvbSBhIGNyaXB0b2dyYWZpYTxicj5kZSBwb250YSBhIHBvbnRhPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNhbGwtYXZhdGFyIj4KICAgICAgICA8aW1nIHNyYz0iYXZhdGFyLmpwZyIgYWx0PSJNZXNxdWl0YSBNaWxpb25hcmlhIj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNhbGwtc3RhdHVzIiBpZD0iY2FsbFN0YXR1cyI+Q2hhbWFuZG8uLi48L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iY2FsbC1hY3Rpb25zIj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iY2FsbC1hY3Rpb24tYnRuIG1vcmUiPjxzdmcgdmlld0JveD0iMCAwIDI0IDI0Ij48Y2lyY2xlIGN4PSI1IiBjeT0iMTIiIHI9IjIiLz48Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIyIi8+PGNpcmNsZSBjeD0iMTkiIGN5PSIxMiIgcj0iMiIvPjwvc3ZnPjwvYnV0dG9uPgogICAgICA8YnV0dG9uIGNsYXNzPSJjYWxsLWFjdGlvbi1idG4gY2FtZXJhIj48c3ZnIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTE3IDEwLjVWN2MwLS41NS0uNDUtMS0xLTFINGMtLjU1IDAtMSAuNDUtMSAxdjEwYzAgLjU1LjQ1IDEgMSAxaDEyYy41NSAwIDEtLjQ1IDEtMXYtMy41bDQgNHYtMTFsLTQgNHoiLz48L3N2Zz48L2J1dHRvbj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iY2FsbC1hY3Rpb24tYnRuIHNwZWFrZXIiPjxzdmcgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBkPSJNMyA5djZoNGw1IDVWNEw3IDlIM3ptMTMuNSAzYzAtMS43Ny0xLjAyLTMuMjktMi41LTQuMDN2OC4wNWMxLjQ4LS43MyAyLjUtMi4yNSAyLjUtNC4wMnpNMTQgMy4yM3YyLjA2YzIuODkuODYgNSAzLjU0IDUgNi43MXMtMi4xMSA1Ljg1LTUgNi43MXYyLjA2YzQuMDEtLjkxIDctNC40OSA3LTguNzdzLTIuOTktNy44Ni03LTguNzd6Ii8+PC9zdmc+PC9idXR0b24+CiAgICAgIDxidXR0b24gY2xhc3M9ImNhbGwtYWN0aW9uLWJ0biBtdXRlIj48c3ZnIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTE5IDExaC0xLjdjMCAuNzQtLjE2IDEuNDMtLjQzIDIuMDVsMS4yMyAxLjIzYy41Ni0uOTguOS0yLjA5LjktMy4yOHptLTQuMDIuMTdjMC0uMDYuMDItLjExLjAyLS4xN1Y1YzAtMS42Ni0xLjM0LTMtMy0zUzkgMy4zNCA5IDV2LjE4bDUuOTggNS45OXpNNC4yNyAzTDMgNC4yN2w2LjAxIDYuMDFWMTFjMCAxLjY2IDEuMzMgMyAyLjk5IDMgLjIyIDAgLjQ0LS4wMy42NS0uMDhsMS42NiAxLjY2Yy0uNzEuMzMtMS41LjUyLTIuMzEuNTItMi43NiAwLTUuMy0yLjEtNS4zLTUuMUg1YzAgMy40MSAyLjcyIDYuMjMgNiA2LjcyVjIxaDJ2LTMuMjhjLjkxLS4xMyAxLjc3LS40NSAyLjU0LS45TDE5LjczIDIxIDIxIDE5LjczIDQuMjcgM3oiLz48L3N2Zz48L2J1dHRvbj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iY2FsbC1hY3Rpb24tYnRuIGVuZCIgaWQ9ImNhbGxFbmRCdG4iPjxzdmcgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBkPSJNMTIgOWMtMS42IDAtMy4xNS4yNS00LjYuNzJ2My4xYzAgLjM5LS4yMy43NC0uNTYuOS0uOTguNDktMS44NyAxLjEyLTIuNjYgMS44NS0uMTguMTgtLjQzLjI4LS43LjI4LS4yOCAwLS41My0uMTEtLjcxLS4yOUwuMjkgMTMuMDhjLS4xOC0uMTctLjI5LS40Mi0uMjktLjcgMC0uMjguMTEtLjUzLjI5LS43MUMzLjM0IDguNzggNy40NiA3IDEyIDdzOC42NiAxLjc4IDExLjcxIDQuNjdjLjE4LjE4LjI5LjQzLjI5LjcxIDAgLjI4LS4xMS41My0uMjkuNzFsLTIuNDggMi40OGMtLjE4LjE4LS40My4yOS0uNzEuMjktLjI3IDAtLjUyLS4xMS0uNy0uMjgtLjc5LS43NC0xLjY5LTEuMzYtMi42Ny0xLjg1LS4zMy0uMTYtLjU2LS41LS41Ni0uOXYtMy4xQzE1LjE1IDkuMjUgMTMuNiA5IDEyIDl6Ii8+PC9zdmc+PC9idXR0b24+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImNhbGwtbmF2Ij4KICAgICAgPHNwYW4+PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0iY2FsbC1uYXYtZG90Ij48L3NwYW4+CiAgICAgIDxzcGFuPjwvc3Bhbj4KICAgIDwvZGl2PgogIDwvZGl2Pgo8L2Rpdj4KCjxzY3JpcHQ+CihmdW5jdGlvbigpIHsKICBjb25zdCBXRUJIT09LX1VSTCA9ICdodHRwczovL244bi1uOG4uc2JsMHdxLmVhc3lwYW5lbC5ob3N0L3dlYmhvb2svdXBsb2FkLW1pbGlvbmFyaWEnOw0KICBjb25zdCBjaGF0QXJlYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGF0QXJlYScpOwogIGNvbnN0IGlucHV0RmllbGQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXRGaWVsZCcpOwogIGNvbnN0IHNlbmRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VuZEJ0bicpOwogIGNvbnN0IG1pY0J0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtaWNCdG4nKTsKICBjb25zdCBlbW9qaUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbW9qaUJ0bicpOwogIGNvbnN0IGVtb2ppUGFuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1vamlQYW5lbCcpOwogIGNvbnN0IGVtb2ppR3JpZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbW9qaUdyaWQnKTsKICBjb25zdCBhdHRhY2hCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXR0YWNoQnRuJyk7CiAgY29uc3QgYXR0YWNoTWVudSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdHRhY2hNZW51Jyk7CiAgY29uc3QgYXR0YWNoSW1nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F0dGFjaEltZycpOwogIGNvbnN0IGF0dGFjaERvYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdHRhY2hEb2MnKTsKICBjb25zdCBhdHRhY2hBdWRpbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdHRhY2hBdWRpbycpOwogIGNvbnN0IGZpbGVJbWcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZUltZycpOwogIGNvbnN0IGZpbGVEb2MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZURvYycpOwogIGNvbnN0IHJlY29yZGluZ0JhciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNvcmRpbmdCYXInKTsKICBjb25zdCByZWNUaW1lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNUaW1lcicpOwogIGNvbnN0IHJlY0NhbmNlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNDYW5jZWwnKTsKICBjb25zdCByZWNTZW5kID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlY1NlbmQnKTsKICBjb25zdCB0eXBpbmdJbmRpY2F0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndHlwaW5nSW5kaWNhdG9yJyk7CiAgY29uc3QgaW5wdXRCYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXRCYXInKTsKCiAgY29uc3QgZW1vamlzID0gWw0KICAgICfwn5iAJywsICfwn5iCJywsICfwn5iNJywsICfwn6WwJywsICfwn5iOJywsICfwn6SpJywsICfwn5iHJywsICfwn6WzJywsICfwn5iLJywsICfwn6SUJywNCiAgICAn8J+YjycsLCAn8J+YoicsLCAn8J+YrScsLCAn8J+YpCcsLCAn8J+krycsLCAn8J+YsScsLCAn8J+roScsLCAn8J+knScsLCAn8J+SqicsLCAn8J+ZjycsDQogICAgJ+KdpO+4jycsLCAn8J+UpScsLCAn4q2QJywsICfwn5KvJywsICfwn46JJywsICfwn5GPJywsICfinIzvuI8nLCwgJ/CfpJgnLCwgJ/Cfq7YnLCwgJ+KcqCcsDQogICAgJ/CfkY0nLCwgJ/CfkY4nLCwgJ/CfkYknLCwgJ/CfkYYnLCwgJ/Cfq7AnLCwgJ/CfkqonLCwgJ/Cfp6AnLCwgJ/CfkYAnLCwgJ/CfkYQnLCwgJ/CfprYnLA0KICAgICfwn5KAJywsICfwn5G7JywsICfwn46DJywsICfwn4yIJywsICfimIDvuI8nLCwgJ/CfjJknLCwgJ+KaoScsLCAn8J+SpycsLCAn8J+NlScsLCAn8J+NlCcsDQogICAgJ+KYlScsLCAn8J+OtScsLCAn8J+TsScsLCAn8J+SuycsLCAn8J+TuCcsLCAn8J+OrCcsLCAn4pq9JywsICfwn46uJywsICfwn4+GJywsICfinIjvuI8nLA0KICAgICfwn5qXJywsICfwn4+gJywsICfwn5KwJywsICfwn46BJywsICfwn5OmJywsICfwn5uSJywsICfwn5K8JywsICfwn5OeJywsICfinInvuI8nLCwgJ/CflJEnLA0KICAgICfwn6uCJywsICfwn5i0JywsICfwn6SvJywsICfwn6SuJywsICfwn6SnJywsICfwn6W2JywsICfwn6W1JywsICfwn6SgJywsICfwn6ShJywsICfwn5G5JywNCiAgXTsKCiAgLy8gQnVpbGQgZW1vamkgZ3JpZAogIGVtb2ppcy5mb3JFYWNoKGUgPT4gewogICAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICAgIHNwYW4uY2xhc3NOYW1lID0gJ2Vtb2ppLWl0ZW0nOwogICAgc3Bhbi50ZXh0Q29udGVudCA9IGU7CiAgICBzcGFuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gewogICAgICBpbnB1dEZpZWxkLnZhbHVlICs9IGU7CiAgICAgIGlucHV0RmllbGQuZm9jdXMoKTsKICAgICAgdXBkYXRlU2VuZEJ0bigpOwogICAgfSk7CiAgICBlbW9qaUdyaWQuYXBwZW5kQ2hpbGQoc3Bhbik7CiAgfSk7CgogIGxldCBsYXN0TWVzc2FnZURhdGUgPSAnJzsKCiAgZnVuY3Rpb24gZGF0ZUtleShkKSB7CiAgICByZXR1cm4gZC5nZXRGdWxsWWVhcigpICsgJy0nICsgKGQuZ2V0TW9udGgoKSsxKSArICctJyArIGQuZ2V0RGF0ZSgpOwogIH0KCiAgZnVuY3Rpb24gZGF0ZUxhYmVsKGQpIHsKICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTsKICAgIGNvbnN0IHllc3RlcmRheSA9IG5ldyBEYXRlKCk7CiAgICB5ZXN0ZXJkYXkuc2V0RGF0ZSh5ZXN0ZXJkYXkuZ2V0RGF0ZSgpIC0gMSk7CiAgICBpZiAoZGF0ZUtleShkKSA9PT0gZGF0ZUtleSh0b2RheSkpIHJldHVybiAnSE9KRSc7CiAgICBpZiAoZGF0ZUtleShkKSA9PT0gZGF0ZUtleSh5ZXN0ZXJkYXkpKSByZXR1cm4gJ09OVEVNJzsKICAgIGNvbnN0IGRheXMgPSBbJ0RPTScsJ1NFRycsJ1RFUicsJ1FVQScsJ1FVSScsJ1NFWCcsJ1NBQiddOwogICAgY29uc3QgbW9udGhzID0gWydKQU4nLCdGRVYnLCdNQVInLCdBQlInLCdNQUknLCdKVU4nLCdKVUwnLCdBR08nLCdTRVQnLCdPVVQnLCdOT1YnLCdERVonXTsKICAgIHJldHVybiBkYXlzW2QuZ2V0RGF5KCldICsgJywgJyArIGQuZ2V0RGF0ZSgpICsgJyBkZSAnICsgbW9udGhzW2QuZ2V0TW9udGgoKV07CiAgfQoKICBmdW5jdGlvbiBjaGVja0RhdGVTZXAoKSB7CiAgICBjb25zdCBkID0gbmV3IERhdGUoKTsKICAgIGNvbnN0IGtleSA9IGRhdGVLZXkoZCk7CiAgICBpZiAoa2V5ICE9PSBsYXN0TWVzc2FnZURhdGUpIHsKICAgICAgbGFzdE1lc3NhZ2VEYXRlID0ga2V5OwogICAgICBjb25zdCBzZXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgc2VwLmNsYXNzTmFtZSA9ICdkYXRlLXNlcCc7CiAgICAgIHNlcC5pbm5lckhUTUwgPSAnPHNwYW4+JyArIGRhdGVMYWJlbChkKSArICc8L3NwYW4+JzsKICAgICAgY2hhdEFyZWEuaW5zZXJ0QmVmb3JlKHNlcCwgdHlwaW5nSW5kaWNhdG9yKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIG5vdygpIHsKICAgIGNvbnN0IGQgPSBuZXcgRGF0ZSgpOwogICAgcmV0dXJuIGQuZ2V0SG91cnMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsJzAnKSArICc6JyArIGQuZ2V0TWludXRlcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwnMCcpOwogIH0KCiAgZnVuY3Rpb24gZG91YmxlQ2hlY2tTVkcoKSB7CiAgICByZXR1cm4gJzxzdmcgdmlld0JveD0iMCAwIDE2IDExIiB3aWR0aD0iMTYiIGhlaWdodD0iMTEiPjxwYXRoIGQ9Ik0xMS4wNzEuNjUzYS40NTcuNDU3IDAgMCAwLS4zMDQtLjEwMi40OTMuNDkzIDAgMCAwLS4zODEuMTc4bC02LjE5IDcuNjM2LTIuMDExLTIuMTc1YS40Ni40NiAwIDAgMC0uMzUzLS4xNDUuNDcuNDcgMCAwIDAtLjMzNS4xMzYuNDc0LjQ3NCAwIDAgMC0uMDE2LjY3OGwyLjM3NSAyLjU3NGEuNDQ4LjQ0OCAwIDAgMCAuMzQ3LjE1N2guMDE0YS40NzIuNDcyIDAgMCAwIC4zNTItLjE3NGw2LjUzNi04LjA2NmEuNDQ4LjQ0OCAwIDAgMC0uMDM0LS42Mzh6IiBmaWxsPSIjODY5NmEwIi8+PC9zdmc+JzsKICB9CgogIGZ1bmN0aW9uIHRpY2tIVE1MKCkgewogICAgcmV0dXJuICc8c3BhbiBjbGFzcz0idGljay1zaW5nbGUiPicgKyBkb3VibGVDaGVja1NWRygpICsgJzwvc3Bhbj48c3BhbiBjbGFzcz0idGljay1kb3VibGUiPjxzdmcgdmlld0JveD0iMCAwIDE2IDExIj48cGF0aCBkPSJNMTEuMDcxLjY1M2EuNDU3LjQ1NyAwIDAgMC0uMzA0LS4xMDIuNDkzLjQ5MyAwIDAgMC0uMzgxLjE3OGwtNi4xOSA3LjYzNi0yLjAxMS0yLjE3NWEuNDYuNDYgMCAwIDAtLjM1My0uMTQ1LjQ3LjQ3IDAgMCAwLS4zMzUuMTM2LjQ3NC40NzQgMCAwIDAtLjAxNi42NzhsMi4zNzUgMi41NzRhLjQ0OC40NDggMCAwIDAgLjM0Ny4xNTdoLjAxNGEuNDcyLjQ3MiAwIDAgMCAuMzUyLS4xNzRsNi41MzYtOC4wNjZhLjQ0OC40NDggMCAwIDAtLjAzNC0uNjM4eiIgZmlsbD0iIzg2OTZhMCIvPjwvc3ZnPjxzdmcgY2xhc3M9InRpY2stc2Vjb25kIiB2aWV3Qm94PSIwIDAgMTYgMTEiPjxwYXRoIGQ9Ik0xMS4wNzEuNjUzYS40NTcuNDU3IDAgMCAwLS4zMDQtLjEwMi40OTMuNDkzIDAgMCAwLS4zODEuMTc4bC02LjE5IDcuNjM2LTIuMDExLTIuMTc1YS40Ni40NiAwIDAgMC0uMzUzLS4xNDUuNDcuNDcgMCAwIDAtLjMzNS4xMzYuNDc0LjQ3NCAwIDAgMC0uMDE2LjY3OGwyLjM3NSAyLjU3NGEuNDQ4LjQ0OCAwIDAgMCAuMzQ3LjE1N2guMDE0YS40NzIuNDcyIDAgMCAwIC4zNTItLjE3NGw2LjUzNi04LjA2NmEuNDQ4LjQ0OCAwIDAgMC0uMDM0LS42Mzh6IiBmaWxsPSIjODY5NmEwIi8+PC9zdmc+PC9zcGFuPic7CiAgfQoKICBmdW5jdGlvbiBhbmltYXRlVGlja3Mocm93KSB7CiAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgY29uc3Qgc2luZ2xlID0gcm93LnF1ZXJ5U2VsZWN0b3IoJy50aWNrLXNpbmdsZScpOwogICAgICBjb25zdCBkb3VibGUgPSByb3cucXVlcnlTZWxlY3RvcignLnRpY2stZG91YmxlJyk7CiAgICAgIGlmIChzaW5nbGUpIHNpbmdsZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICBpZiAoZG91YmxlKSBkb3VibGUuc3R5bGUuZGlzcGxheSA9ICdmbGV4JzsKICAgIH0sIDgwMCk7CiAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgY29uc3Qgd3JhcCA9IHJvdy5xdWVyeVNlbGVjdG9yKCcudGljay1kb3VibGUnKTsKICAgICAgaWYgKHdyYXApIHdyYXAuY2xhc3NMaXN0LmFkZCgndGljay1kZWxpdmVyZWQnKTsKICAgIH0sIDE4MDApOwogICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgIGNvbnN0IHdyYXAgPSByb3cucXVlcnlTZWxlY3RvcignLnRpY2stZG91YmxlJyk7CiAgICAgIGlmICh3cmFwKSB7CiAgICAgICAgd3JhcC5jbGFzc0xpc3QucmVtb3ZlKCd0aWNrLWRlbGl2ZXJlZCcpOwogICAgICAgIHdyYXAuY2xhc3NMaXN0LmFkZCgndGljay1yZWFkJyk7CiAgICAgIH0KICAgIH0sIDM1MDApOwogIH0KCiAgZnVuY3Rpb24gYWRkTWVzc2FnZSh0ZXh0LCB0eXBlKSB7CiAgICBjaGVja0RhdGVTZXAoKTsKICAgIGNvbnN0IHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgcm93LmNsYXNzTmFtZSA9ICdtc2ctcm93ICcgKyB0eXBlOwogICAgY29uc3QgdGljayA9IHR5cGUgPT09ICdvdXQnID8gJzxzcGFuIGNsYXNzPSJidWJibGUtdGljayI+JyArIHRpY2tIVE1MKCkgKyAnPC9zcGFuPicgOiAnJzsKICAgIHJvdy5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz0iYnViYmxlIj48ZGl2IGNsYXNzPSJidWJibGUtdGV4dCI+JyArIHRleHQgKyAnPC9kaXY+PGRpdiBjbGFzcz0iYnViYmxlLW1ldGEiPjxzcGFuIGNsYXNzPSJidWJibGUtdGltZSI+JyArIG5vdygpICsgJzwvc3Bhbj4nICsgdGljayArICc8L2Rpdj48L2Rpdj4nOwogICAgY2hhdEFyZWEuaW5zZXJ0QmVmb3JlKHJvdywgdHlwaW5nSW5kaWNhdG9yKTsKICAgIGlmICh0eXBlID09PSAnb3V0JykgYW5pbWF0ZVRpY2tzKHJvdyk7CiAgICBzY3JvbGxCb3R0b20oKTsKICB9CgogIGZ1bmN0aW9uIGFkZEltYWdlTWVzc2FnZShkYXRhVXJsLCBzdGF0dXNFbCkgew0KICAgIGNoZWNrRGF0ZVNlcCgpOw0KICAgIGNvbnN0IHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOw0KICAgIHJvdy5jbGFzc05hbWUgPSAnbXNnLXJvdyBvdXQnOw0KICAgIHJvdy5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz0iYnViYmxlIj48ZGl2IGNsYXNzPSJidWJibGUtaW1nIj48aW1nIHNyYz0iJyArIGRhdGFVcmwgKyAnIiBhbHQ9IkltYWdlbSBlbnZpYWRhIj48L2Rpdj48ZGl2IGNsYXNzPSJidWJibGUtbWV0YSI+PHNwYW4gY2xhc3M9ImJ1YmJsZS10aW1lIj4nICsgbm93KCkgKyAnPC9zcGFuPjxzcGFuIGNsYXNzPSJidWJibGUtdGljayI+JyArIHRpY2tIVE1MKCkgKyAnPC9zcGFuPjwvZGl2PjwvZGl2Pic7DQogICAgY2hhdEFyZWEuaW5zZXJ0QmVmb3JlKHJvdywgdHlwaW5nSW5kaWNhdG9yKTsNCiAgICBpZiAoc3RhdHVzRWwpIHJvdy5xdWVyeVNlbGVjdG9yKCcuYnViYmxlLW1ldGEnKS5hcHBlbmRDaGlsZChzdGF0dXNFbCk7DQogICAgYW5pbWF0ZVRpY2tzKHJvdyk7DQogICAgc2Nyb2xsQm90dG9tKCk7DQogICAgcmV0dXJuIHJvdzsNCiAgfQ0KDQogICAgZnVuY3Rpb24gYWRkQXVkaW9NZXNzYWdlKCkgewogICAgY2hlY2tEYXRlU2VwKCk7CiAgICBjb25zdCBiYXJzID0gQXJyYXkuZnJvbSh7bGVuZ3RoOiAyOH0sICgpID0+IHsKICAgICAgY29uc3QgaCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDE4KSArIDQ7CiAgICAgIHJldHVybiAnPHNwYW4gc3R5bGU9ImhlaWdodDonICsgaCArICdweCI+PC9zcGFuPic7CiAgICB9KS5qb2luKCcnKTsKICAgIGNvbnN0IHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgcm93LmNsYXNzTmFtZSA9ICdtc2ctcm93IG91dCc7CiAgICByb3cuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9ImJ1YmJsZSI+PGRpdiBjbGFzcz0iYnViYmxlLWF1ZGlvIj48YnV0dG9uIGNsYXNzPSJhdWRpby1wbGF5Ij48c3ZnIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTggNXYxNGwxMS03eiIvPjwvc3ZnPjwvYnV0dG9uPjxkaXYgY2xhc3M9ImF1ZGlvLXdhdmUiPicgKyBiYXJzICsgJzwvZGl2PjxzcGFuIGNsYXNzPSJhdWRpby1kdXJhdGlvbiI+MDonICsgKE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoyMCkrNSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCcwJykgKyAnPC9zcGFuPjwvZGl2PjxkaXYgY2xhc3M9ImJ1YmJsZS1tZXRhIj48c3BhbiBjbGFzcz0iYnViYmxlLXRpbWUiPicgKyBub3coKSArICc8L3NwYW4+PHNwYW4gY2xhc3M9ImJ1YmJsZS10aWNrIj4nICsgdGlja0hUTUwoKSArICc8L3NwYW4+PC9kaXY+PC9kaXY+JzsKICAgIGNoYXRBcmVhLmluc2VydEJlZm9yZShyb3csIHR5cGluZ0luZGljYXRvcik7CiAgICBhbmltYXRlVGlja3Mocm93KTsKICAgIHNjcm9sbEJvdHRvbSgpOwogIH0KCiAgZnVuY3Rpb24gYWRkUGRmTWVzc2FnZShmaWxlbmFtZSwgc3RhdHVzRWwsIGZpbGVVcmwpIHsKICAgIGNoZWNrRGF0ZVNlcCgpOwogICAgY29uc3Qgcm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICByb3cuY2xhc3NOYW1lID0gJ21zZy1yb3cgb3V0JzsKICAgIHJvdy5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz0iYnViYmxlIiBzdHlsZT0ibWluLXdpZHRoOjIyMHB4JyArIChmaWxlVXJsID8gJztjdXJzb3I6cG9pbnRlcicgOiAnJykgKyAnIj48ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMHB4O3BhZGRpbmc6NHB4IDAiPjxkaXYgc3R5bGU9IndpZHRoOjQwcHg7aGVpZ2h0OjQwcHg7Ym9yZGVyLXJhZGl1czo4cHg7YmFja2dyb3VuZDojNTE1N2FlO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtmbGV4LXNocmluazowIj48c3ZnIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSIjZmZmIj48cGF0aCBkPSJNMTQgMkg2Yy0xLjEgMC0xLjk5LjktMS45OSAyTDQgMjBjMCAxLjEuODkgMiAxLjk5IDJIMThjMS4xIDAgMi0uOSAyLTJWOGwtNi02em0yIDE2SDh2LTJoOHYyem0wLTRIOHYtMmg4djJ6bS0zLTVWMy41TDE4LjUgOUgxM3oiLz48L3N2Zz48L2Rpdj48ZGl2PjxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxM3B4O2ZvbnQtd2VpZ2h0OjUwMDtjb2xvcjojMzAzMDMwO3dvcmQtYnJlYWs6YnJlYWstYWxsIj4nICsgZmlsZW5hbWUgKyAnPC9kaXY+PGRpdiBzdHlsZT0iZm9udC1zaXplOjExcHg7Y29sb3I6IzY2Nzc4MTttYXJnaW4tdG9wOjJweCI+JyArIChmaWxlVXJsID8gJ1BERiAtIHRvcXVlIHBhcmEgYWJyaXInIDogJ1BERicpICsgJzwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImJ1YmJsZS1tZXRhIj48c3BhbiBjbGFzcz0iYnViYmxlLXRpbWUiPicgKyBub3coKSArICc8L3NwYW4+PHNwYW4gY2xhc3M9ImJ1YmJsZS10aWNrIj4nICsgdGlja0hUTUwoKSArICc8L3NwYW4+PC9kaXY+PC9kaXY+JzsKICAgIGNoYXRBcmVhLmluc2VydEJlZm9yZShyb3csIHR5cGluZ0luZGljYXRvcik7CiAgICBpZiAoc3RhdHVzRWwpIHJvdy5xdWVyeVNlbGVjdG9yKCcuYnViYmxlLW1ldGEnKS5hcHBlbmRDaGlsZChzdGF0dXNFbCk7CiAgICBpZiAoZmlsZVVybCkgewogICAgICBjb25zdCBidWJibGUgPSByb3cucXVlcnlTZWxlY3RvcignLmJ1YmJsZScpOwogICAgICBidWJibGUudGl0bGUgPSAnQWJyaXIgJyArIGZpbGVuYW1lOwogICAgICBidWJibGUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7CiAgICAgICAgd2luZG93Lm9wZW4oZmlsZVVybCwgJ19ibGFuaycpOwogICAgICB9KTsKICAgIH0KICAgIGFuaW1hdGVUaWNrcyhyb3cpOwogICAgc2Nyb2xsQm90dG9tKCk7CiAgICByZXR1cm4gcm93OwogIH0KICBmdW5jdGlvbiBzY3JvbGxCb3R0b20oKSB7CiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gewogICAgICBjaGF0QXJlYS5zY3JvbGxUb3AgPSBjaGF0QXJlYS5zY3JvbGxIZWlnaHQ7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHVwZGF0ZVNlbmRCdG4oKSB7CiAgICBjb25zdCBoYXNUZXh0ID0gaW5wdXRGaWVsZC52YWx1ZS50cmltKCkubGVuZ3RoID4gMDsKICAgIHNlbmRCdG4uY2xhc3NMaXN0LnRvZ2dsZSgndmlzaWJsZScsIGhhc1RleHQpOwogICAgbWljQnRuLnN0eWxlLmRpc3BsYXkgPSBoYXNUZXh0ID8gJ25vbmUnIDogJ2ZsZXgnOwogIH0KCmZ1bmN0aW9uIHNldFVwbG9hZFN0YXR1cyhyb3csIHR4dCwgY29sb3IpIHsKICB2YXIgc3RhdHVzID0gcm93LnF1ZXJ5U2VsZWN0b3IoIi51cGxvYWQtc3RhdHVzIik7CiAgaWYgKCFzdGF0dXMpIHsKICAgIHN0YXR1cyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTsKICAgIHN0YXR1cy5jbGFzc05hbWUgPSAidXBsb2FkLXN0YXR1cyI7CiAgICBzdGF0dXMuc3R5bGUuY3NzVGV4dCA9ICJmb250LXNpemU6MTBweDtjb2xvcjojODY5NmEwO21hcmdpbi1sZWZ0OjRweCI7CiAgICByb3cucXVlcnlTZWxlY3RvcigiLmJ1YmJsZS1tZXRhIikuYXBwZW5kQ2hpbGQoc3RhdHVzKTsKICB9CiAgc3RhdHVzLnRleHRDb250ZW50ID0gdHh0OwogIGlmIChjb2xvcikgc3RhdHVzLnN0eWxlLmNvbG9yID0gY29sb3I7CiAgcmV0dXJuIHN0YXR1czsKfQoKZnVuY3Rpb24gcG9zdEZpbGUoZm9ybURhdGEpIHsKICB2YXIgY29udHJvbGxlciA9IG51bGw7CiAgdHJ5IHsKICAgIGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CiAgfSBjYXRjaCAoZSkgewogICAgY29udHJvbGxlciA9IG51bGw7CiAgfQogIHZhciB0aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgdHJ5IHsKICAgICAgaWYgKGNvbnRyb2xsZXIpIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgIH0gY2F0Y2ggKGUpIHt9CiAgfSwgNjAwMDApOwogIHZhciBvcHRzID0geyBtZXRob2Q6ICJQT1NUIiwgYm9keTogZm9ybURhdGEgfTsKICBpZiAoY29udHJvbGxlcikgb3B0cy5zaWduYWwgPSBjb250cm9sbGVyLnNpZ25hbDsKICByZXR1cm4gZmV0Y2goV0VCSE9PS19VUkwsIG9wdHMpLnRoZW4oCiAgICBmdW5jdGlvbiAocikgewogICAgICBjbGVhclRpbWVvdXQodGltZXIpOwogICAgICByZXR1cm4gcjsKICAgIH0sCiAgICBmdW5jdGlvbiAoZXJyKSB7CiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7CiAgICAgIHRocm93IGVycjsKICAgIH0sCiAgKTsKfQoKZnVuY3Rpb24gYnVpbGRGb3JtKGZpbGUsIGV4dHJhKSB7CiAgY29uc3QgZmQgPSBuZXcgRm9ybURhdGEoKTsKICBmZC5hcHBlbmQoImZpbGUiLCBmaWxlLCBmaWxlLm5hbWUgfHwgImNvbXByb3ZhbnRlIik7CiAgZmQuYXBwZW5kKCJmaWxlbmFtZSIsIGZpbGUubmFtZSB8fCAiY29tcHJvdmFudGUiKTsKICBmZC5hcHBlbmQoIm9yaWdpbmFsTmFtZSIsIChleHRyYSAmJiBleHRyYS5vcmlnaW5hbE5hbWUpIHx8IGZpbGUubmFtZSB8fCAiIik7CiAgZmQuYXBwZW5kKCJtaW1ldHlwZSIsIGZpbGUudHlwZSB8fCAiIik7CiAgZmQuYXBwZW5kKCJ0aXBvIiwgImNvbXByb3ZhbnRlIik7CiAgaWYgKGV4dHJhKQogICAgT2JqZWN0LmtleXMoZXh0cmEpLmZvckVhY2goZnVuY3Rpb24gKGspIHsKICAgICAgaWYgKGsgIT09ICJvcmlnaW5hbE5hbWUiKSBmZC5hcHBlbmQoaywgZXh0cmFba10pOwogICAgfSk7CiAgcmV0dXJuIGZkOwp9CgpmdW5jdGlvbiBpc0ltYWdlRmlsZShmaWxlKSB7CiAgY29uc3QgbmFtZSA9IGZpbGUubmFtZSB8fCAiIjsKICByZXR1cm4gKAogICAgKGZpbGUudHlwZSB8fCAiIikuaW5kZXhPZigiaW1hZ2UvIikgPT09IDAgfHwKICAgIC9cLihqcGU/Z3xwbmd8d2VicHxoZWljfGhlaWZ8Z2lmfGJtcCkkL2kudGVzdChuYW1lKQogICk7Cn0KCi8vIENvbXByaW1lIGEgaW1hZ2VtIG5vIHByw7NwcmlvIGNlbHVsYXI6IEpQRUcgbGV2ZSBxdWUgbyBwYWluZWwgc2VtcHJlIGzDqi4KZnVuY3Rpb24gY29tcHJlc3NJbWFnZShmaWxlKSB7CiAgZnVuY3Rpb24gaXNIZWljKGYpIHsKICAgIHZhciBubSA9IFN0cmluZygoZiAmJiBmLm5hbWUpIHx8ICIiKSArICIgIiArIFN0cmluZygoZiAmJiBmLnR5cGUpIHx8ICIiKTsKICAgIHJldHVybiAvaGVpY3xoZWlmL2kudGVzdChubSk7CiAgfQogIGZ1bmN0aW9uIHJ1bihmKSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKICAgICAgdmFyIHVybCA9IG51bGw7CiAgICAgIHRyeSB7CiAgICAgICAgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChmKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIHJlc29sdmUoZmlsZSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHZhciBpbWcgPSBuZXcgSW1hZ2UoKTsKICAgICAgaW1nLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB0cnkgewogICAgICAgICAgdmFyIE1BWCA9IDE2MDA7CiAgICAgICAgICB2YXIgdyA9IGltZy5uYXR1cmFsV2lkdGggfHwgMTIwMCwKICAgICAgICAgICAgaCA9IGltZy5uYXR1cmFsSGVpZ2h0IHx8IDE2MDA7CiAgICAgICAgICB2YXIgc2NhbGUgPSBNYXRoLm1pbigxLCBNQVggLyBNYXRoLm1heCh3LCBoKSk7CiAgICAgICAgICB3ID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZCh3ICogc2NhbGUpKTsKICAgICAgICAgIGggPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGggKiBzY2FsZSkpOwogICAgICAgICAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOwogICAgICAgICAgY2FudmFzLndpZHRoID0gdzsKICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSBoOwogICAgICAgICAgY2FudmFzLmdldENvbnRleHQoIjJkIikuZHJhd0ltYWdlKGltZywgMCwgMCwgdywgaCk7CiAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7CiAgICAgICAgICBpZiAoY2FudmFzLnRvQmxvYikgewogICAgICAgICAgICBjYW52YXMudG9CbG9iKAogICAgICAgICAgICAgIGZ1bmN0aW9uIChibG9iKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICBpZiAoYmxvYiAmJiB0eXBlb2YgRmlsZSAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYmFzZSA9IChmLm5hbWUgfHwgImNvbXByb3ZhbnRlIikucmVwbGFjZSgKICAgICAgICAgICAgICAgICAgICAgIC9cLlthLXowLTldKyQvaSwKICAgICAgICAgICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgKICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKFtibG9iXSwgYmFzZSArICIuanBnIiwgeyB0eXBlOiAiaW1hZ2UvanBlZyIgfSksCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZpbGUpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmlsZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAiaW1hZ2UvanBlZyIsCiAgICAgICAgICAgICAgMC44MiwKICAgICAgICAgICAgKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJlc29sdmUoZmlsZSk7CiAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpOwogICAgICAgICAgfSBjYXRjaCAoZTIpIHt9CiAgICAgICAgICByZXNvbHZlKGZpbGUpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgaW1nLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTsKICAgICAgICB9IGNhdGNoIChlKSB7fQogICAgICAgIHJlc29sdmUoZmlsZSk7CiAgICAgIH07CiAgICAgIGltZy5zcmMgPSB1cmw7CiAgICB9KTsKICB9CiAgaWYgKGlzSGVpYyhmaWxlKSAmJiB0eXBlb2YgaGVpYzJhbnkgIT09ICJ1bmRlZmluZWQiICYmIGhlaWMyYW55KSB7CiAgICB0cnkgewogICAgICByZXR1cm4gaGVpYzJhbnkoeyBibG9iOiBmaWxlLCB0b1R5cGU6ICJpbWFnZS9qcGVnIiwgcXVhbGl0eTogMC44MiB9KQogICAgICAgIC50aGVuKGZ1bmN0aW9uIChvdXQpIHsKICAgICAgICAgIHZhciBiID0gQXJyYXkuaXNBcnJheShvdXQpID8gb3V0WzBdIDogb3V0OwogICAgICAgICAgdmFyIGJhc2UgPSBTdHJpbmcoZmlsZS5uYW1lIHx8ICJjb21wcm92YW50ZSIpLnJlcGxhY2UoCiAgICAgICAgICAgIC9cLlthLXowLTldKyQvaSwKICAgICAgICAgICAgIiIsCiAgICAgICAgICApOwogICAgICAgICAgcmV0dXJuIHJ1bihuZXcgRmlsZShbYl0sIGJhc2UgKyAiLmpwZyIsIHsgdHlwZTogImltYWdlL2pwZWciIH0pKTsKICAgICAgICB9KQogICAgICAgIC5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICByZXR1cm4gcnVuKGZpbGUpOwogICAgICAgIH0pOwogICAgfSBjYXRjaCAoZSkgewogICAgICByZXR1cm4gcnVuKGZpbGUpOwogICAgfQogIH0KICByZXR1cm4gcnVuKGZpbGUpOwp9CgovLyBTZSBvIHBhaW5lbCByZWN1c2FyIGEgaW1hZ2VtLCByZWVudmlhIGRlbnRybyBkZSB1bSBQREYgKHNlbSByZWNhZGFzdHJhciBuYWRhKS4KZnVuY3Rpb24ganBlZ1RvUGRmQmxvYihqcGVnQmxvYiwgaW1nVywgaW1nSCkgewogIHJldHVybiBqcGVnQmxvYi5hcnJheUJ1ZmZlcigpLnRoZW4oZnVuY3Rpb24gKGJ1ZikgewogICAgY29uc3QgZml0ID0gTWF0aC5taW4oMSwgNTk1IC8gaW1nVyk7CiAgICBjb25zdCBwYWdlVyA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoaW1nVyAqIGZpdCkpOwogICAgY29uc3QgcGFnZUggPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGltZ0ggKiBmaXQpKTsKICAgIGNvbnN0IGVuYyA9IG5ldyBUZXh0RW5jb2RlcigpOwogICAgY29uc3QganBnID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTsKICAgIGNvbnN0IHBhcnRzID0gW107CiAgICBjb25zdCBvZmZzZXRzID0gWzBdOwogICAgZnVuY3Rpb24gcHVzaChiKSB7CiAgICAgIG9mZnNldHMucHVzaChvZmZzZXRzW29mZnNldHMubGVuZ3RoIC0gMV0gKyBiLmxlbmd0aCk7CiAgICAgIHBhcnRzLnB1c2goYik7CiAgICB9CiAgICBwdXNoKGVuYy5lbmNvZGUoIiVQREYtMS40XG4iKSk7CiAgICBwdXNoKGVuYy5lbmNvZGUoIjEgMCBvYmpcbjw8IC9UeXBlIC9DYXRhbG9nIC9QYWdlcyAyIDAgUiA+PlxuZW5kb2JqXG4iKSk7CiAgICBwdXNoKAogICAgICBlbmMuZW5jb2RlKAogICAgICAgICIyIDAgb2JqXG48PCAvVHlwZSAvUGFnZXMgL0tpZHMgWzMgMCBSXSAvQ291bnQgMSA+PlxuZW5kb2JqXG4iLAogICAgICApLAogICAgKTsKICAgIHB1c2goCiAgICAgIGVuYy5lbmNvZGUoCiAgICAgICAgIjMgMCBvYmpcbjw8IC9UeXBlIC9QYWdlIC9QYXJlbnQgMiAwIFIgL01lZGlhQm94IFswIDAgIiArCiAgICAgICAgICBwYWdlVyArCiAgICAgICAgICAiICIgKwogICAgICAgICAgcGFnZUggKwogICAgICAgICAgIl0gL1Jlc291cmNlcyA8PCAvWE9iamVjdCA8PCAvSW0wIDQgMCBSID4+IC9Qcm9jU2V0IFsvUERGIC9JbWFnZUNdID4+IC9Db250ZW50cyA1IDAgUiA+PlxuZW5kb2JqXG4iLAogICAgICApLAogICAgKTsKICAgIHB1c2goCiAgICAgIGVuYy5lbmNvZGUoCiAgICAgICAgIjQgMCBvYmpcbjw8IC9UeXBlIC9YT2JqZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lkdGggIiArCiAgICAgICAgICBpbWdXICsKICAgICAgICAgICIgL0hlaWdodCAiICsKICAgICAgICAgIGltZ0ggKwogICAgICAgICAgIiAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCIC9CaXRzUGVyQ29tcG9uZW50IDggL0ZpbHRlciAvRENURGVjb2RlIC9MZW5ndGggIiArCiAgICAgICAgICBqcGcubGVuZ3RoICsKICAgICAgICAgICIgPj5cbnN0cmVhbVxuIiwKICAgICAgKSwKICAgICk7CiAgICBwdXNoKGpwZyk7CiAgICBwdXNoKGVuYy5lbmNvZGUoIlxuZW5kc3RyZWFtXG5lbmRvYmpcbiIpKTsKICAgIGNvbnN0IG9iajVwb3MgPSBvZmZzZXRzW29mZnNldHMubGVuZ3RoIC0gMV07CiAgICBjb25zdCBjb250ZW50ID0gZW5jLmVuY29kZSgKICAgICAgInFcbiIgKyBwYWdlVyArICIgMCAwICIgKyBwYWdlSCArICIgMCAwIGNtXG4vSW0wIERvXG5RXG4iLAogICAgKTsKICAgIHB1c2goZW5jLmVuY29kZSgiNSAwIG9ialxuPDwgL0xlbmd0aCAiICsgY29udGVudC5sZW5ndGggKyAiID4+XG5zdHJlYW1cbiIpKTsKICAgIHB1c2goY29udGVudCk7CiAgICBwdXNoKGVuYy5lbmNvZGUoImVuZHN0cmVhbVxuZW5kb2JqXG4iKSk7CiAgICBjb25zdCB4cmVmUG9zID0gb2Zmc2V0c1tvZmZzZXRzLmxlbmd0aCAtIDFdOwogICAgbGV0IHhyZWYgPSAieHJlZlxuMCA2XG4wMDAwMDAwMDAwIDY1NTM1IGYgXG4iOwogICAgY29uc3Qgb2JqT2Zmc2V0cyA9IFswLCBvZmZzZXRzWzFdLCBvZmZzZXRzWzJdLCBvZmZzZXRzWzNdLCBvZmZzZXRzWzRdLCBvYmo1cG9zXTsKICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IDU7IGkrKykKICAgICAgeHJlZiArPSBTdHJpbmcob2JqT2Zmc2V0c1tpXSkucGFkU3RhcnQoMTAsICIwIikgKyAiIDAwMDAwIG4gXG4iOwogICAgcHVzaCgKICAgICAgZW5jLmVuY29kZSgKICAgICAgICB4cmVmICsKICAgICAgICAgICJ0cmFpbGVyXG48PCAvU2l6ZSA2IC9Sb290IDEgMCBSID4+XG5zdGFydHhyZWZcbiIgKwogICAgICAgICAgeHJlZlBvcyArCiAgICAgICAgICAiXG4lJUVPRiIsCiAgICAgICksCiAgICApOwogICAgcmV0dXJuIG5ldyBCbG9iKHBhcnRzLCB7IHR5cGU6ICJhcHBsaWNhdGlvbi9wZGYiIH0pOwogIH0pOwp9CgpmdW5jdGlvbiByZXRyeUltYWdlQXNQZGYoanBlZ0ZpbGUsIG9yaWdpbmFsTmFtZSwgcm93KSB7CiAgc2V0VXBsb2FkU3RhdHVzKHJvdywgImNvbnZlcnRlbmRvIGVtIFBERi4uLiIpOwogIHZhciBubVRpcG8gPSBTdHJpbmcoKG9yaWdpbmFsTmFtZSB8fCAiIikgKyAiICIgKyAoanBlZ0ZpbGUudHlwZSB8fCAiIikpLnRvTG93ZXJDYXNlKCk7CiAgaWYgKG5tVGlwby5pbmRleE9mKCJoZWljIikgPiAtMSB8fCBubVRpcG8uaW5kZXhPZigiaGVpZiIpID4gLTEpIHsKICAgIHNldFVwbG9hZFN0YXR1cyhyb3csICJFUlJPIiwgIiNlZjUzNTAiKTsKICAgIGFkZE1lc3NhZ2UoIkZvdG8gZW0gZm9ybWF0byBIRUlDIChpUGhvbmUpLiBFbnZpZSBjb21vIFBERiBvdSB0aXJlIHVtIHByaW50IGRhIHRlbGEuIiwgImluIik7CiAgICBzaW11bGF0ZVJlcGx5KCk7CiAgICByZXR1cm47CiAgfQogIHRyeSB7ICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGpwZWdGaWxlKTsKICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTsKICBpbWcub25sb2FkID0gZnVuY3Rpb24gKCkgewogICAgY29uc3QgdyA9IGltZy5uYXR1cmFsV2lkdGggfHwgMTIwMCwKICAgICAgaCA9IGltZy5uYXR1cmFsSGVpZ2h0IHx8IDE2MDA7CiAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7CiAgICBqcGVnVG9QZGZCbG9iKGpwZWdGaWxlLCB3LCBoKQogICAgICAudGhlbihmdW5jdGlvbiAocGRmQmxvYikgewogICAgICAgIGNvbnN0IGJhc2UgPSAob3JpZ2luYWxOYW1lIHx8ICJjb21wcm92YW50ZSIpLnJlcGxhY2UoCiAgICAgICAgICAvXC5bYS16MC05XSskL2ksCiAgICAgICAgICAiIiwKICAgICAgICApOwogICAgICAgIGNvbnN0IHBkZkZpbGUgPSBuZXcgRmlsZShbcGRmQmxvYl0sIGJhc2UgKyAiLnBkZiIsIHsKICAgICAgICAgIHR5cGU6ICJhcHBsaWNhdGlvbi9wZGYiLAogICAgICAgIH0pOwogICAgICAgIHJldHVybiBwb3N0RmlsZSgKICAgICAgICAgIGJ1aWxkRm9ybShwZGZGaWxlLCB7CiAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogb3JpZ2luYWxOYW1lLAogICAgICAgICAgICBjb252ZXJzYW86ICJpbWFnZW0tcGFyYS1wZGYiLAogICAgICAgICAgfSksCiAgICAgICAgKTsKICAgICAgfSkKICAgICAgLnRoZW4oZnVuY3Rpb24gKHIyKSB7CiAgICAgICAgaWYgKHIyLm9rKSBzZXRVcGxvYWRTdGF0dXMocm93LCAiT0siLCAiIzAwYTg4NCIpOwogICAgICAgIGVsc2Ugc2V0VXBsb2FkU3RhdHVzKHJvdywgIkVSUk8iLCAiI2VmNTM1MCIpOwogICAgICAgIHNpbXVsYXRlUmVwbHkoKTsKICAgICAgfSkKICAgICAgLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICBzZXRVcGxvYWRTdGF0dXMocm93LCAiRVJSTyIsICIjZWY1MzUwIik7CiAgICAgICAgc2ltdWxhdGVSZXBseSgpOwogICAgICB9KTsKICB9OwogIGltZy5vbmVycm9yID0gZnVuY3Rpb24gKCkgewogICAgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpOwogICAgc2V0VXBsb2FkU3RhdHVzKHJvdywgIkVSUk8iLCAiI2VmNTM1MCIpOwogICAgc2ltdWxhdGVSZXBseSgpOwogIH07CiAgaW1nLnNyYyA9IHVybDsKICB9IGNhdGNoIChlKSB7CiAgICBzZXRVcGxvYWRTdGF0dXMocm93LCAiRVJSTyIsICIjZWY1MzUwIik7CiAgICBhZGRNZXNzYWdlKCJOYW8gZm9pIHBvc3NpdmVsIGNvbnZlcnRlciBhIGltYWdlbS4gRW52aWUgY29tbyBQREYgb3UgcHJpbnQgZGEgdGVsYS4iLCAiaW4iKTsKICAgIHNpbXVsYXRlUmVwbHkoKTsKICB9Cn0KCmZ1bmN0aW9uIHNlbmRUb044TihmaWxlLCByb3cpIHsKICBzZXRVcGxvYWRTdGF0dXMocm93LCAiZW52aWFuZG8uLi4iKTsKICBjb25zdCBvcmlnaW5hbE5hbWUgPSBmaWxlLm5hbWUgfHwgImNvbXByb3ZhbnRlIjsKICBjb25zdCBpbWFnZSA9IGlzSW1hZ2VGaWxlKGZpbGUpOwogIGNvbnN0IHJlYWR5ID0gaW1hZ2UgPyBjb21wcmVzc0ltYWdlKGZpbGUpIDogUHJvbWlzZS5yZXNvbHZlKGZpbGUpOwogIHJlYWR5CiAgICAudGhlbihmdW5jdGlvbiAodG9TZW5kKSB7CiAgICAgIHJldHVybiBwb3N0RmlsZShidWlsZEZvcm0odG9TZW5kLCB7IG9yaWdpbmFsTmFtZTogb3JpZ2luYWxOYW1lIH0pKS50aGVuKAogICAgICAgIGZ1bmN0aW9uIChyKSB7CiAgICAgICAgICByZXR1cm4geyByOiByLCB0b1NlbmQ6IHRvU2VuZCB9OwogICAgICAgIH0sCiAgICAgICk7CiAgICB9KQogICAgLnRoZW4oZnVuY3Rpb24gKG91dCkgewogICAgICBpZiAob3V0LnIub2spIHsKICAgICAgICBzZXRVcGxvYWRTdGF0dXMocm93LCAiT0siLCAiIzAwYTg4NCIpOwogICAgICAgIHNpbXVsYXRlUmVwbHkoKTsKICAgICAgfSBlbHNlIGlmIChpbWFnZSkgewogICAgICAgIHJldHJ5SW1hZ2VBc1BkZihvdXQudG9TZW5kLCBvcmlnaW5hbE5hbWUsIHJvdyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2V0VXBsb2FkU3RhdHVzKHJvdywgIkVSUk8iLCAiI2VmNTM1MCIpOwogICAgICAgIHNpbXVsYXRlUmVwbHkoKTsKICAgICAgfQogICAgfSkKICAgIC5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgIGlmIChpbWFnZSkgewogICAgICAgIGNvbXByZXNzSW1hZ2UoZmlsZSkudGhlbihmdW5jdGlvbiAodG9TZW5kKSB7CiAgICAgICAgICByZXRyeUltYWdlQXNQZGYodG9TZW5kLCBvcmlnaW5hbE5hbWUsIHJvdyk7CiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2V0VXBsb2FkU3RhdHVzKHJvdywgIkVSUk8iLCAiI2VmNTM1MCIpOwogICAgICAgIHNpbXVsYXRlUmVwbHkoKTsKICAgICAgfQogICAgfSk7Cn0NCg0KICAvLyBBdXRvLXJlc2l6ZSB0ZXh0YXJlYQogIGlucHV0RmllbGQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7CiAgICBpbnB1dEZpZWxkLnN0eWxlLmhlaWdodCA9ICdhdXRvJzsKICAgIGlucHV0RmllbGQuc3R5bGUuaGVpZ2h0ID0gTWF0aC5taW4oaW5wdXRGaWVsZC5zY3JvbGxIZWlnaHQsIDEwMCkgKyAncHgnOwogICAgdXBkYXRlU2VuZEJ0bigpOwogIH0pOwoKICAvLyBTZW5kIG1lc3NhZ2UKICBmdW5jdGlvbiBzZW5kTWVzc2FnZSgpIHsKICAgIGNvbnN0IHRleHQgPSBpbnB1dEZpZWxkLnZhbHVlLnRyaW0oKTsKICAgIGlmICghdGV4dCkgcmV0dXJuOwogICAgYWRkTWVzc2FnZSh0ZXh0LCAnb3V0Jyk7CiAgICBpbnB1dEZpZWxkLnZhbHVlID0gJyc7CiAgICBpbnB1dEZpZWxkLnN0eWxlLmhlaWdodCA9ICdhdXRvJzsKICAgIHVwZGF0ZVNlbmRCdG4oKTsKICAgIGNsb3NlUGFuZWxzKCk7CiAgfQoKICBzZW5kQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc2VuZE1lc3NhZ2UpOwoKICBpbnB1dEZpZWxkLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4gewogICAgaWYgKGUua2V5ID09PSAnRW50ZXInICYmICFlLnNoaWZ0S2V5KSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgc2VuZE1lc3NhZ2UoKTsKICAgIH0KICB9KTsKCiAgLy8gRW1vamkgcGFuZWwKICBlbW9qaUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7CiAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgZW1vamlQYW5lbC5jbGFzc0xpc3QudG9nZ2xlKCdvcGVuJyk7CiAgICBhdHRhY2hNZW51LmNsYXNzTGlzdC5yZW1vdmUoJ29wZW4nKTsKICB9KTsKCiAgLy8gQXR0YWNoIG1lbnUKICBhdHRhY2hCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4gewogICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgIGF0dGFjaE1lbnUuY2xhc3NMaXN0LnRvZ2dsZSgnb3BlbicpOwogICAgZW1vamlQYW5lbC5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJyk7CiAgfSk7CgogIGF0dGFjaEltZy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsKICAgIGZpbGVJbWcuY2xpY2soKTsKICAgIGF0dGFjaE1lbnUuY2xhc3NMaXN0LnJlbW92ZSgnb3BlbicpOwogIH0pOwoKICBhdHRhY2hEb2MuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7CiAgICBmaWxlRG9jLmNsaWNrKCk7CiAgICBhdHRhY2hNZW51LmNsYXNzTGlzdC5yZW1vdmUoJ29wZW4nKTsKICB9KTsKCiAgYXR0YWNoQXVkaW8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7CiAgICBhdHRhY2hNZW51LmNsYXNzTGlzdC5yZW1vdmUoJ29wZW4nKTsKICAgIGFkZEF1ZGlvTWVzc2FnZSgpOwogIH0pOwoKZmlsZUltZy5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCAoZSkgPT4gewogIGNvbnN0IGZpbGUgPSBlLnRhcmdldC5maWxlc1swXTsKICBpZiAoIWZpbGUpIHJldHVybjsKICBpZiAoZmlsZS5zaXplID4gMTUgKiAxMDI0ICogMTAyNCkgewogICAgYWRkTWVzc2FnZSgiQXJxdWl2byBtYWlvciBxdWUgMTVNQi4gRW52aWUgdW1hIGZvdG8gbWVub3Igb3UgdW0gUERGLiIsICJpbiIpOwogICAgZmlsZUltZy52YWx1ZSA9ICIiOwogICAgcmV0dXJuOwogIH0KICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpOwogIHJlYWRlci5vbmxvYWQgPSAoZXYpID0+IHsKICAgIGNvbnN0IHJvdyA9IGFkZEltYWdlTWVzc2FnZShldi50YXJnZXQucmVzdWx0KTsKICAgIHNlbmRUb044TihmaWxlLCByb3cpOwogIH07CiAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7CiAgZmlsZUltZy52YWx1ZSA9ICIiOwp9KTsKCiAgZmlsZURvYy5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCAoZSkgPT4gewogIGNvbnN0IGZpbGUgPSBlLnRhcmdldC5maWxlc1swXTsKICBpZiAoIWZpbGUpIHJldHVybjsKICBpZiAodHlwZW9mIGlzSW1hZ2VGaWxlID09PSAiZnVuY3Rpb24iICYmIGlzSW1hZ2VGaWxlKGZpbGUpKSB7CiAgICBpZiAoZmlsZS5zaXplID4gMTUgKiAxMDI0ICogMTAyNCkgewogICAgICBhZGRNZXNzYWdlKAogICAgICAgICJBcnF1aXZvIG1haW9yIHF1ZSAxNU1CLiBFbnZpZSB1bWEgZm90byBtZW5vciBvdSB1bSBQREYuIiwKICAgICAgICAiaW4iLAogICAgICApOwogICAgICBmaWxlRG9jLnZhbHVlID0gIiI7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7CiAgICByZWFkZXIub25sb2FkID0gKGV2KSA9PiB7CiAgICAgIGNvbnN0IHJvdyA9IGFkZEltYWdlTWVzc2FnZShldi50YXJnZXQucmVzdWx0KTsKICAgICAgc2VuZFRvTjhOKGZpbGUsIHJvdyk7CiAgICB9OwogICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7CiAgICBmaWxlRG9jLnZhbHVlID0gIiI7CiAgICByZXR1cm47CiAgfQogIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoZmlsZSk7CiAgY29uc3Qgcm93ID0gYWRkUGRmTWVzc2FnZShmaWxlLm5hbWUsIG51bGwsIHVybCk7CiAgc2VuZFRvTjhOKGZpbGUsIHJvdyk7CiAgZmlsZURvYy52YWx1ZSA9ICIiOwp9KTsKCgogIC8vIENsb3NlIHBhbmVscyBvbiBvdXRzaWRlIGNsaWNrCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4gewogICAgaWYgKCFlbW9qaVBhbmVsLmNvbnRhaW5zKGUudGFyZ2V0KSAmJiBlLnRhcmdldCAhPT0gZW1vamlCdG4gJiYgIWVtb2ppQnRuLmNvbnRhaW5zKGUudGFyZ2V0KSkgewogICAgICBlbW9qaVBhbmVsLmNsYXNzTGlzdC5yZW1vdmUoJ29wZW4nKTsKICAgIH0KICAgIGlmICghYXR0YWNoTWVudS5jb250YWlucyhlLnRhcmdldCkgJiYgZS50YXJnZXQgIT09IGF0dGFjaEJ0biAmJiAhYXR0YWNoQnRuLmNvbnRhaW5zKGUudGFyZ2V0KSkgewogICAgICBhdHRhY2hNZW51LmNsYXNzTGlzdC5yZW1vdmUoJ29wZW4nKTsKICAgIH0KICAgIGlmICghY2hhdE1lbnUuY29udGFpbnMoZS50YXJnZXQpICYmIGUudGFyZ2V0ICE9PSBidG5NZW51ICYmICFidG5NZW51LmNvbnRhaW5zKGUudGFyZ2V0KSkgewogICAgICBjaGF0TWVudS5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJyk7CiAgICB9CiAgfSk7CgogIGZ1bmN0aW9uIGNsb3NlUGFuZWxzKCkgewogICAgZW1vamlQYW5lbC5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJyk7CiAgICBhdHRhY2hNZW51LmNsYXNzTGlzdC5yZW1vdmUoJ29wZW4nKTsKICB9CgogIC8vIEF1ZGlvIHJlY29yZGluZyBzaW11bGF0aW9uCiAgbGV0IGlzUmVjb3JkaW5nID0gZmFsc2U7CiAgbGV0IHJlY0ludGVydmFsID0gbnVsbDsKICBsZXQgcmVjU2Vjb25kcyA9IDA7CgogIG1pY0J0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsKICAgIGlmIChpc1JlY29yZGluZykgewogICAgICBzdG9wUmVjb3JkaW5nKCk7CiAgICB9IGVsc2UgewogICAgICBzdGFydFJlY29yZGluZygpOwogICAgfQogIH0pOwoKICBmdW5jdGlvbiBzdGFydFJlY29yZGluZygpIHsKICAgIGlzUmVjb3JkaW5nID0gdHJ1ZTsKICAgIHJlY1NlY29uZHMgPSAwOwogICAgbWljQnRuLmNsYXNzTGlzdC5hZGQoJ3JlY29yZGluZycpOwogICAgaW5wdXRCYXIuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgIHJlY29yZGluZ0Jhci5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTsKICAgIHJlY1RpbWVyLnRleHRDb250ZW50ID0gJzA6MDAnOwogICAgcmVjSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgIHJlY1NlY29uZHMrKzsKICAgICAgY29uc3QgbSA9IE1hdGguZmxvb3IocmVjU2Vjb25kcyAvIDYwKTsKICAgICAgY29uc3QgcyA9IHJlY1NlY29uZHMgJSA2MDsKICAgICAgcmVjVGltZXIudGV4dENvbnRlbnQgPSBtICsgJzonICsgcy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7CiAgICB9LCAxMDAwKTsKICB9CgogIGZ1bmN0aW9uIHN0b3BSZWNvcmRpbmcoKSB7CiAgICBpc1JlY29yZGluZyA9IGZhbHNlOwogICAgY2xlYXJJbnRlcnZhbChyZWNJbnRlcnZhbCk7CiAgICBtaWNCdG4uY2xhc3NMaXN0LnJlbW92ZSgncmVjb3JkaW5nJyk7CiAgICByZWNvcmRpbmdCYXIuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7CiAgICBpbnB1dEJhci5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnOwogICAgaWYgKHJlY1NlY29uZHMgPiAwKSB7CiAgICAgIGFkZEF1ZGlvTWVzc2FnZSgpOwogICAgfQogIH0KCiAgcmVjQ2FuY2VsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gewogICAgaXNSZWNvcmRpbmcgPSBmYWxzZTsKICAgIGNsZWFySW50ZXJ2YWwocmVjSW50ZXJ2YWwpOwogICAgbWljQnRuLmNsYXNzTGlzdC5yZW1vdmUoJ3JlY29yZGluZycpOwogICAgcmVjb3JkaW5nQmFyLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpOwogICAgaW5wdXRCYXIuc3R5bGUuZGlzcGxheSA9ICdmbGV4JzsKICB9KTsKCiAgcmVjU2VuZC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHN0b3BSZWNvcmRpbmcpOwoKICAvLyBTaW11bGF0ZWQgcmVwbGllcyAtIG9ubHkgZm9yIGltYWdlcyBhbmQgUERGcwogIGZ1bmN0aW9uIHNpbXVsYXRlUmVwbHkoKSB7CiAgICB0eXBpbmdJbmRpY2F0b3IuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7CiAgICBzY3JvbGxCb3R0b20oKTsKICAgIGNvbnN0IGRlbGF5ID0gMTIwMCArIE1hdGgucmFuZG9tKCkgKiAxODAwOwogICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgIHR5cGluZ0luZGljYXRvci5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTsKICAgICAgYWRkTWVzc2FnZSgnRW52aWFuZG8gcGFyYSBvIEJvbMOjbyBNaWxpb27DoXJpYSEnLCAnaW4nKTsKICAgIH0sIGRlbGF5KTsKICB9CgogIC8vIMOi4oCd4oKsw6LigJ3igqwgQ0FMTCBPVkVSTEFZIMOi4oCd4oKsw6LigJ3igqwKICBjb25zdCBjYWxsT3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYWxsT3ZlcmxheScpOwogIGNvbnN0IGNhbGxTdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FsbFN0YXR1cycpOwogIGNvbnN0IGNhbGxFbmRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FsbEVuZEJ0bicpOwogIGNvbnN0IGJ0blZpZGVvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtb2QtaWQ9ImJ0bi12aWRlbyJdJyk7CiAgY29uc3QgYnRuQ2FsbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW9kLWlkPSJidG4tY2FsbCJdJyk7CgogIGZ1bmN0aW9uIHN0YXJ0Q2FsbCgpIHsKICAgIGNhbGxPdmVybGF5LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpOwogICAgY2FsbFN0YXR1cy50ZXh0Q29udGVudCA9ICdDaGFtYW5kby4uLic7CiAgICBjYWxsU3RhdHVzLmNsYXNzTGlzdC5yZW1vdmUoJ3VuYXZhaWxhYmxlJyk7CiAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgY2FsbFN0YXR1cy50ZXh0Q29udGVudCA9ICdJbmRpc3BvbsOtdmVsIHBhcmEgbGlnYcOnw7Vlcyc7CiAgICAgIGNhbGxTdGF0dXMuY2xhc3NMaXN0LmFkZCgndW5hdmFpbGFibGUnKTsKICAgIH0sIDUwMDApOwogIH0KCiAgZnVuY3Rpb24gZW5kQ2FsbCgpIHsKICAgIGNhbGxPdmVybGF5LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpOwogIH0KCiAgYnRuQ2FsbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHN0YXJ0Q2FsbCk7CiAgYnRuVmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzdGFydENhbGwpOwogIGNhbGxFbmRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlbmRDYWxsKTsKCiAgLy8gw6LigJ3igqzDouKAneKCrCBDSEFUIE1FTlUgKHRyw6pzIHBvbnRpbmhvcykgw6LigJ3igqzDouKAneKCrAogIGNvbnN0IGJ0bk1lbnUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1vZC1pZD0iYnRuLW1lbnUiXScpOwogIGNvbnN0IGNoYXRNZW51ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoYXRNZW51Jyk7CiAgY29uc3QgbWVudUNsZWFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21lbnVDbGVhcicpOwogIGNvbnN0IG1lbnVFeHBvcnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVudUV4cG9ydCcpOwoKICBidG5NZW51LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHsKICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICBjaGF0TWVudS5jbGFzc0xpc3QudG9nZ2xlKCdvcGVuJyk7CiAgICBlbW9qaVBhbmVsLmNsYXNzTGlzdC5yZW1vdmUoJ29wZW4nKTsKICAgIGF0dGFjaE1lbnUuY2xhc3NMaXN0LnJlbW92ZSgnb3BlbicpOwogIH0pOwoKICBtZW51Q2xlYXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7CiAgICBjaGF0TWVudS5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJyk7CiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjY2hhdEFyZWEgLm1zZy1yb3cnKS5mb3JFYWNoKChyKSA9PiByLnJlbW92ZSgpKTsKICAgIGxhc3RNZXNzYWdlRGF0ZSA9ICcnOwogIH0pOwoKICBtZW51RXhwb3J0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gewogICAgY2hhdE1lbnUuY2xhc3NMaXN0LnJlbW92ZSgnb3BlbicpOwogICAgY29uc3Qgcm93cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNjaGF0QXJlYSAubXNnLXJvdycpOwogICAgaWYgKCFyb3dzLmxlbmd0aCkgcmV0dXJuOwogICAgY29uc3QgbGluZXMgPSBbXTsKICAgIHJvd3MuZm9yRWFjaCgocikgPT4gewogICAgICBsZXQgdGV4dCA9ICcnOwogICAgICBjb25zdCB0ID0gci5xdWVyeVNlbGVjdG9yKCcuYnViYmxlLXRleHQnKTsKICAgICAgaWYgKHQpIHRleHQgPSB0LnRleHRDb250ZW50OwogICAgICBlbHNlIGlmIChyLnF1ZXJ5U2VsZWN0b3IoJy5idWJibGUtaW1nIGltZycpKSB0ZXh0ID0gJ1tJbWFnZW1dJzsKICAgICAgZWxzZSBpZiAoci5xdWVyeVNlbGVjdG9yKCcuYnViYmxlLWF1ZGlvJykpIHRleHQgPSAnW8OBdWRpb10nOwogICAgICBlbHNlIHRleHQgPSAnW0FycXVpdm9dJzsKICAgICAgY29uc3QgdGltZSA9IHIucXVlcnlTZWxlY3RvcignLmJ1YmJsZS10aW1lJyk7CiAgICAgIGxpbmVzLnB1c2goKHRpbWUgPyB0aW1lLnRleHRDb250ZW50IDogJycpICsgJyAtICcgKyB0ZXh0KTsKICAgIH0pOwogICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtsaW5lcy5qb2luKCdcbicpXSwgeyB0eXBlOiAndGV4dC9wbGFpbjtjaGFyc2V0PXV0Zi04JyB9KTsKICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7CiAgICBhLmhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOwogICAgYS5kb3dubG9hZCA9ICdjb252ZXJzYS1tZXNxdWl0YS50eHQnOwogICAgYS5jbGljaygpOwogICAgVVJMLnJldm9rZU9iamVjdFVSTChhLmhyZWYpOwogIH0pOwogIC8vIEluaXRpYWwgc2Nyb2xsCiAgc2Nyb2xsQm90dG9tKCk7Cn0pKCk7Cjwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD4="}