https://ipfs.io/ipfs/QmR4TMivJgmA5tVbn5JDPxgFP7cun8wPq9qecgyKMec53G
files.html, release notes: 1) improved search, 2) no longer using primal caching service, instead two regular relays
sha256
326c679689633f392925710661ca34cb754040bae9081ea992975408a468496b images.html
base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xIi8+CiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwOi8vc3ZnaWNvbnMuc3BhcmtrLmZyL3N2Z2ljb25zLmNzcyIvPgogICAgPHN0eWxlPgogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5LCAKICAgICAgI2hlYWRlciB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSAudGV4dCwgCiAgICAgICNoZWFkZXIgYSwKICAgICAgI21lZGlhLWNvbnRhaW5lciB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICB6LWluZGV4OiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAKICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMGVtKSB7CiAgICAgICAgI3F1ZXJ5ZGlzcGxheSwKICAgICAgICAjY29udHJvbGluZm8gewogICAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZvcm0gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5IHsKICAgICAgICB3aWR0aDogNmVtOwogICAgICB9CiAgICAgIAogICAgICBhIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgIH0KCiAgICAgIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAKICAgICAgI21lZGlhLWNvbnRhaW5lciB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICBoZWlnaHQ6IDEwMCUgIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgLnZpZGVvLWNvbnRhaW5lciB7CiAgICAgICAgLypjdXJzb3I6IHBvaW50ZXI7Ki8KICAgICAgfQogICAgICAKICAgICAgLnZpZGVvLWNvbnRhaW5lciAudHlwZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjcGljLXF1ZXJ5IHsKICAgICAgICB3aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5LCAKICAgICAgI2NvbnRyb2xpbmZvLAogICAgICBhIHsKICAgICAgICBjb2xvcjogIzk5OTsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSB7CiAgICAgICAgcGFkZGluZzogMCAxZW07CiAgICAgIH0KCiAgICAgICNxdWVyeWRpc3BsYXkgLnRleHQgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBtaW4td2lkdGg6IDNlbTsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAjaGVhZGVyIGEsCiAgICAgICNoZWFkZXIgc3BhbiB7CiAgICAgICAgcGFkZGluZzogMC44ZW07CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgewogICAgICAgIHBhZGRpbmc6IDAuNDVlbSAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgLml0ZW1zIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQogICAgICAKICAgICAgI2hlYWRlciAuaXRlbXMsIAogICAgICAjY29udHJvbGluZm8gewogICAgICAgIG1hcmdpbi10b3A6IC4zZW07CiAgICAgIH0KCiAgICAgIC5sYWJlbCB7CiAgICAgICAgcGFkZGluZzogLjhlbSAuOGVtIC44ZW0gMDsKICAgICAgfQoKICAgICAgc3BhbiNjb250cm9saW5mbywgCiAgICAgICNwaWNzIGEgPiBhLAogICAgICAjcGljcyAucXVlcnkgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgfQogICAgICAKICAgICAgc3BhbiNjb250cm9saW5mbyB7CiAgICAgICAgcmlnaHQ6IDJlbTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgfQoKICAgICAgI21lZGlhLWNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDApOwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgei1pbmRleDogNDsKICAgICAgfQogICAgICAKICAgICAgI3BpYy1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAKICAgICAgI3BpYyB7CiAgICAgICAgbWF4LXdpZHRoOiAxMDB2dzsKICAgICAgICBtYXgtaGVpZ2h0OiAxMDB2aDsKICAgICAgfQogICAgICAgIAogICAgICAjcGljcyB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgICAKICAgICAgI3BpY3MgPiBhLCAKICAgICAgI3BpY3MgaW1nLAogICAgICAjcGljcyAuZmlsZSwKICAgICAgI3BpY3MgLnZpZGVvLWNvbnRhaW5lciB7CiAgICAgICAgd2lkdGg6IDI1dnc7CiAgICAgIH0KCiAgICAgICNwaWNzID4gYSwKICAgICAgI3BpY3MgLmZpbGUsCiAgICAgICNwaWNzIC52aWRlby1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMjV2dzsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIGJvcmRlcjogMC4zZW0gc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMC4zZW07CiAgICAgICAgbWFyZ2luOiAtMC4zZW07CiAgICAgIH0KCiAgICAgICNwaWNzID4gLmZpbGUgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIAogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CiAgICAgIAogICAgICBib2R5Om5vdCgubm9zdHIpICNmaWx0ZXItbGlrZXMsIAogICAgICAuZmlsdGVyLWxpa2VzICNwaWNzID4gYTpub3QoLnJlYWN0ZWQpIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlLCAKICAgICAgI3BpYy1xdWVyeSwKICAgICAgI3BpYy11c2VyIHsKICAgICAgICB6LWluZGV4OiAyOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3JkZXItcmFkaXVzOiAzdnc7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcGFkZGluZzogMCAxdnc7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlLCAKICAgICAgI3BpYy1xdWVyeSB7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGZvbnQtc2l6ZTogbWluKDMuNXZ3LCAxLjVlbSk7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjYpOwogICAgICAgIG1heC13aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcGljLXF1ZXJ5IHsKICAgICAgICBwYWRkaW5nOiAuNmVtIC40ZW0gLjFlbSAuNGVtOwogICAgICAgIG1heC13aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICBhLmxpa2UucmVhY3RlZCwKICAgICAgLmZpbHRlci1saWtlcyAjZmlsdGVyLWxpa2VzIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7CiAgICAgIH0KCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgZm9udC1zaXplOiAzZW07CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciwKICAgICAgI21lZGlhLWZvb3RlciAubGlrZSB7CiAgICAgICAgei1pbmRleDogNTsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgYm90dG9tOiAxLjllbTsKICAgICAgICBmb250LXNpemU6IDEuOGVtOwogICAgICAgIHBhZGRpbmctcmlnaHQ6IC42NWVtOwogICAgICAgIG1heC13aWR0aDogOGVtOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9CiAgICAgIAogICAgICAubGlrZSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiBhdXRvOwogICAgICAgIHBhZGRpbmc6IC4yZW07CiAgICAgICAgd2lkdGg6IDFlbTsKICAgICAgICBoZWlnaHQ6IDFlbTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CgogICAgICAubm9zdHIgLmxpa2UgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOyAgCiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgLmxpa2UgewogICAgICAgIGZvbnQtc2l6ZTogMi40ZW07CiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgewogICAgICAgIGRpc3BsYXk6IG5vbmU7ICAKICAgICAgfQogIAogICAgICAjcGljcyBpbWcgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgLmFjdGl2ZSB7CiAgICAgICAgYmFja2dyb3VuZDogIzQ0NDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI3BpY3MgPiAuYWN0aXZlIHsKICAgICAgICBib3JkZXItY29sb3I6IGdyZWVuOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KCiAgICAgIC5oZWFydHN2ZyBwYXRoIHsKICAgICAgICBzdHJva2U6ICNmZmY7CiAgICAgIH0KICAKICAgICAgYSNtZW51LCBhI2ZpbHRlci1saWtlcyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luLXRvcDogLS4zZW07CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgfQoKICAgICAgYSNtZW51IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBwYWRkaW5nOiAwIC4zZW0gMCAuNWVtOwogICAgICAgIGhlaWdodDogMi4xZW07CiAgICAgIH0KICAgICAgCiAgICAgIGEjZmlsdGVyLWxpa2VzIHsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB3aWR0aDogMS41ZW07CiAgICAgICAgaGVpZ2h0OiAxLjVlbTsKICAgICAgICBtYXJnaW46IC4xZW0gLjVlbTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgIH0KICAgICAgCiAgICAgIGEjZmlsdGVyLWxpa2VzIHN2ZyB7CiAgICAgICAgd2lkdGg6IDEuNWVtOwogICAgICAgIGhlaWdodDogMS41ZW07CiAgICAgIH0KICAgICAgIAogICAgICAubWVudXN2ZyB7CiAgICAgICAgd2lkdGg6IDJlbTsKICAgICAgICBoZWlnaHQ6IDJlbTsKICAgICAgfQoKICAgICAgLm1lbnVzdmcgcGF0aCB7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgICB3aWR0aDogMTVlbTsKICAgICAgICBtYXJnaW4tbGVmdDogLTE1ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzIyMjsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgei1pbmRleDogMzsgCiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQub3BlbiB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDA7CiAgICAgIH0KICAgICAgCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIHsKICAgICAgICBwYWRkaW5nOiAwIDFlbTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgYSB7CiAgICAgICAgcGFkZGluZzogLjVlbSAuN2VtOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHotaW5kZXg6IDM7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIG9wYWNpdHk6IC41OwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5Lm9wZW4gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICBzdmcsIAogICAgICBpbWcsIAogICAgICAudmlkZW8gdmlkZW8gewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAjdGVtcGxhdGUgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGRpdiBpZD0idGVtcGxhdGUiPgogICAgICA8c3ZnIGNsYXNzPSJoZWFydHN2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KICAgICAgICA8cGF0aCBkPSJNOS43MTksMTcuMDczbC02LjU2Mi02LjUxYy0wLjI3LTAuMjY4LTAuNTA0LTAuNTY3LTAuNjk2LTAuODg4QzEuMzg1LDcuODksMS42Nyw1LjYxMywzLjE1NSw0LjE0YzAuODY0LTAuODU2LDIuMDEyLTEuMzI5LDMuMjMzLTEuMzI5YzEuOTI0LDAsMy4xMTUsMS4xMiwzLjYxMiwxLjc1MmMwLjQ5OS0wLjYzNCwxLjY4OS0xLjc1MiwzLjYxMi0xLjc1MmMxLjIyMSwwLDIuMzY5LDAuNDcyLDMuMjMzLDEuMzI5YzEuNDg0LDEuNDczLDEuNzcxLDMuNzUsMC42OTMsNS41MzdjLTAuMTksMC4zMi0wLjQyNSwwLjYxOC0wLjY5NSwwLjg4N2wtNi41NjIsNi41MUMxMC4xMjUsMTcuMjI5LDkuODc1LDE3LjIyOSw5LjcxOSwxNy4wNzMgTTYuMzg4LDMuNjFDNS4zNzksMy42MSw0LjQzMSw0LDMuNzE3LDQuNzA3QzIuNDk1LDUuOTIsMi4yNTksNy43OTQsMy4xNDUsOS4yNjVjMC4xNTgsMC4yNjUsMC4zNTEsMC41MSwwLjU3NCwwLjczMUwxMCwxNi4yMjhsNi4yODEtNi4yMzJjMC4yMjQtMC4yMjEsMC40MTYtMC40NjYsMC41NzMtMC43MjljMC44ODctMS40NzIsMC42NTEtMy4zNDYtMC41NzEtNC41NkMxNS41Nyw0LDE0LjYyMSwzLjYxLDEzLjYxMiwzLjYxYy0xLjQzLDAtMi42MzksMC43ODYtMy4yNjgsMS44NjNjLTAuMTU0LDAuMjY0LTAuNTM2LDAuMjY0LTAuNjksMEM5LjAyOSw0LjM5Nyw3LjgyLDMuNjEsNi4zODgsMy42MSI+PC9wYXRoPgogICAgICA8L3N2Zz4KICAgICAgPGRpdiBpZD0iY29sc2NzcyI+CiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyA+IGEsIAogICAgICAuY29scyR7Y29sc30gI3BpY3MgaW1nLAogICAgICAuY29scyR7Y29sc30gI3BpY3MgLmZpbGUsCiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyAudmlkZW8tY29udGFpbmVyIHsKICAgICAgICB3aWR0aDogY2FsYygxMDB2dyAvICR7Y29sc30pOwogICAgICB9CgogICAgICAuY29scyR7Y29sc30gI3BpY3MgPiBhLAogICAgICAuY29scyR7Y29sc30gI3BpY3MgPiAuZmlsZSwKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzID4gLnZpZGVvLWNvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiBjYWxjKDEwMHZ3IC8gJHtjb2xzfSk7CiAgICAgIH0KICAgICAgCiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyA+IGEgPiBhLCB7CiAgICAgICAgZm9udC1zaXplOiBtaW4oMTR2dyAqICgxIC8gJHtjb2xzfSksIDZlbSAqICgxIC8gJHtjb2xzfSkpCiAgICAgIH0KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9Im1lZGlhLWZvb3RlciI+CiAgICAgIDxhIGlkPSJwaWMtbGlrZSIgY2xhc3M9Imxpa2UiIGhyZWY9IiMiPjwvYT4KICAgICAgPGEgaWQ9InBpYy1xdWVyeSIgaHJlZj0iIyI+PC9hPgogICAgICA8YSBpZD0icGljLXVzZXIiIGhyZWY9IiMiPjwvYT4KICAgIDwvZGl2PgogICAgPGNlbnRlciBpZD0ibWVkaWEtY29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0icGljLWNvbnRhaW5lciI+CiAgICAgICAgPGltZyBpZD0icGljIi8+CiAgICAgIDwvZGl2PgogICAgPC9jZW50ZXI+CiAgICA8ZGl2IGlkPSJtZW51LW92ZXJsYXkiPjwvZGl2PgogICAgPGRpdiBpZD0ibWVudS1jb250ZW50IiBjbGFzcz0idGVzdCI+CiAgICAgIDxkaXYgY2xhc3M9Iml0ZW1zIj4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+YXV0b3BsYXk6PC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJvbiIgaHJlZj0iIyI+b248L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJvZmYiIGhyZWY9IiMiPm9mZjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0YXV0b3BsYXkiIGRhdGEtYXV0b3BsYXk9ImhvdmVyIiBocmVmPSIjIj5tb3VzZW92ZXI8L2E+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmNvbHM6PC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMiIgaHJlZj0iIyI+MjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSI0IiBocmVmPSIjIj40PC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjYiIGhyZWY9IiMiPjY8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMTAiIGhyZWY9IiMiPjEwPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5saW1pdDo8L2Rpdj4KICAgICAgICA8YSBjbGFzcz0ic2V0bGltaXQiIGRhdGEtbGltaXQ9IjE1IiBocmVmPSIjIj4xNTwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0bGltaXQiIGRhdGEtbGltaXQ9IjMwIiBocmVmPSIjIj4zMDwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0bGltaXQiIGRhdGEtbGltaXQ9IjEwMCIgaHJlZj0iIyI+MTAwPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5sYXRlc3QgcmVsZWFzZTo8L2Rpdj4KICAgICAgICA8YSBpZD0icmVsZWFzZSIgaHJlZj0iIyI+PC9hPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0iaGVhZGVyIj4KICAgICAgPHNwYW4gaWQ9ImNvbnRyb2xpbmZvIj5jb250cm9sczogYXJyb3dzLCBlbnRlciwgZXNjPC9zcGFuPgogICAgICA8YSBpZD0iZmlsdGVyLWxpa2VzIiBocmVmPSIjIj48L2E+CiAgICAgIDxkaXYgY2xhc3M9Iml0ZW1zIj4KICAgICAgICA8YSBpZD0ibWVudSIgaHJlZj0iIyI+CiAgICAgICAgICA8c3ZnIGNsYXNzPSJtZW51c3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgoJCSAgICAgICAgPHBhdGggZD0iTTEwLDEuNDQ1Yy00LjcyNiwwLTguNTU1LDMuODI5LTguNTU1LDguNTU1YzAsNC43MjUsMy44MjksOC41NTUsOC41NTUsOC41NTVjNC43MjUsMCw4LjU1NS0zLjgzLDguNTU1LTguNTU1QzE4LjU1NSw1LjI3NCwxNC43MjUsMS40NDUsMTAsMS40NDUgTTEwLDE3LjY1NGMtNC4yMjEsMC03LjY1NC0zLjQzNC03LjY1NC03LjY1NGMwLTQuMjIxLDMuNDMzLTcuNjU0LDcuNjU0LTcuNjU0YzQuMjIyLDAsNy42NTQsMy40MzMsNy42NTQsNy42NTRDMTcuNjU0LDE0LjIyMSwxNC4yMjIsMTcuNjU0LDEwLDE3LjY1NCBNMTQuMzksMTBjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw5LjU1LDE0LjM5LDkuNzUyLDE0LjM5LDEwIE0xNC4zOSwxMi43MDJjMCwwLjI0Ny0wLjIwMywwLjQ0OS0wLjQ1LDAuNDQ5SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMi0wLjQ1LTAuNDQ5YzAtMC4yNDgsMC4yMDMtMC40NTEsMC40NS0wLjQ1MWg3Ljg3OUMxNC4xODcsMTIuMjUxLDE0LjM5LDEyLjQ1NCwxNC4zOSwxMi43MDIgTTE0LjM5LDcuMjk4YzAsMC4yNDgtMC4yMDMsMC40NS0wLjQ1LDAuNDVINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAzLTAuNDUtMC40NXMwLjIwMy0wLjQ1LDAuNDUtMC40NWg3Ljg3OUMxNC4xODcsNi44NDgsMTQuMzksNy4wNTEsMTQuMzksNy4yOTgiPjwvcGF0aD4KCSAgICAgICAgPC9zdmc+CiAgICAgICAgPC9hPgogICAgICAgIDxhIGlkPSJ0aXRsZSIgaHJlZj0iIyI+ZmlsZXMuaHRtbDwvYT4KICAgICAgICA8Zm9ybSBhY3Rpb249IiMiPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJxdWVyeSIgbmFtZT0icXVlcnkiIGlkPSIiIC8+CiAgICAgICAgICA8c2VsZWN0IGlkPSJxdWVyeS10eXBlIj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iYWxsIj5hbGw8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaW1hZ2UiPmltYWdlczwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ2aWRlbyI+dmlkZW9zPC9vcHRpb24+CiAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgIDxpbnB1dCBpZD0iZ28iIHR5cGU9InN1Ym1pdCIgdmFsdWU9ImdvIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxzcGFuIGlkPSJxdWVyeWRpc3BsYXkiPgogICAgICAgICAgPHNwYW4gY2xhc3M9InRleHQiPjwvc3Bhbj4KICAgICAgICA8L3NwYW4+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJwaWNzIj48L2Rpdj4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL3Nsb3dsaS5naXRodWIuaW8vYmVjaDMyLWJ1ZmZlci9hc3NldHMvanMvYmVjaDMyLWJ1ZmZlci5taW4uanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdD4KICAgICAgY29uc3QgdXBkYXRlc3B1YmtleSA9ICJhZTVjNmUwYjc0NjYwZDIxOTRjODI1NGI1YzJjODI1Njc2NTc2YmUwMjk3Mzc5ZmEyMDUyMzExNGE2YTg1ZTg3IgogICAgICBjb25zdCBxdWVyaWVzID0gewogICAgICAgICJnbG9iYWwiOiAnWyJSRVEiLCI8ST4iLHsiY2FjaGUiOlsiZXhwbG9yZSIseyJ0aW1lZnJhbWUiOiJsYXRlc3QiLCJzY29wZSI6Imdsb2JhbCIsImxpbWl0Ijo8TD59XX1dJywgCiAgICAgICAgLy8ic2VhcmNoIjogJ1siUkVRIiwiPEk+Iix7ImNhY2hlIjpbInNlYXJjaCIseyJxdWVyeSI6IjxRPiIsImxpbWl0Ijo8TD59XX1dJywKICAgICAgICAvLyJzZWFyY2hyZWxheSI6ICdbIlJFUSIsICI8ST4iLCA8U0E+XScsIC8vIFNBOiB7ICJraW5kcyI6IFsxLCAyXSwgInNlYXJjaCI6ICJzdHIiIH0sIHt9Li4uCiAgICAgICAgImF1dGhvciI6ICdbIlJFUSIsIjxJPiIseyJraW5kcyI6WzFdLCJhdXRob3JzIjpbIjxQPiJdfV0nLAogICAgICAgICJyZWFjdGlvbnMiOiAnWyJSRVEiLCI8ST4iLCB7ImtpbmRzIjpbN10sIiNlIjogPEU+fV0nCiAgICAgIH0KICAgICAgY29uc3QgcmVsYXlzID0gWwogICAgICAgICJ3c3M6Ly9ub3MubG9sIiwKICAgICAgICAid3NzOi8vcmVsYXkubm9zdHIuYmFuZC8iCiAgICAgIF0KICAgICAgCiAgICAgIGNvbnN0IGNvbG9wdHMgPSBbMiwgNCwgNiwgMTBdCgogICAgICBjb2xzID0gKCkgPT4gc2V0dGluZygiY29scyIsIGNvbG9wdHNbMV0pCiAgICAgIGF1dG9wbGF5ID0gKCkgPT4gc2V0dGluZygiYXV0b3BsYXkiLCAib2ZmIikKICAgICAgbGltaXQgPSAoKSA9PiBzZXR0aW5nKCJsaW1pdCIsIDE1KQogICAgICAKICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJjb2xzIiArIGNvbHMoKSkKICAgICAgCiAgICAgIGxldCBwcm90b2NvbCA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS8pID8gIm5vc3RyOiIgOiAid2ViK25vc3RyOiIKICAgICAgbGV0IHNvY2tldHMgPSBbXQogICAgICBsZXQgcmVzaGFuZGxlcnMgPSBbXQogICAgICBsZXQgdXJscyA9IFtdCiAgICAgIGxldCByZWFjdGVkID0gW10KICAgICAgbGV0IGlkY291bnRlciA9IDAKICAgICAgbGV0IHR5cGVzID0gewogICAgICAgIGltYWdlOiBbInBuZyIsICJqcGciLCAianBlZyIsICJ3ZWJwIl0sCiAgICAgICAgdmlkZW86IFsibXA0IiwgIndlYm0iXQogICAgICB9CiAgICAgIHR5cGVzWyJhbGwiXSA9IFsuLi50eXBlcy5pbWFnZSwgLi4udHlwZXMudmlkZW9dCiAgICAgIGxldCBpbWdyZWdleCA9IC9odHRwKHxzKVw6XC9cL1teIFxuXSo/XC4ocG5nfGpwZ3xqcGVnfHdlYnApL2dpCiAgICAgIC8vbGV0IGZpbGVyZWdleCA9IC9odHRwKHxzKVw6XC9cL1teIFxuXSo/XC4obXAzfG1wNHx0eHQpL2dpCiAgICAgIGxldCB2aWRlb3JlZ2V4ID0gL2h0dHAofHMpXDpcL1wvW14gXG5dKj9cLihtcDR8d2VibSkvZ2kKICAgICAgbGV0IHZpZGVvZXh0cmVnZXggPSAvXC4obXA0fHdlYm0pJC9pCiAgICAgIHdhaXRtcyA9IDEwMDAwCiAgICAgIHF1ZXJ5c3RyID0gIiIKICAgICAgbGFzdHF1ZXJ5c3RyID0gIiIKICAgICAgbGFzdHF1ZXJ5dHlwZSA9ICIiCiAgICAgIAogICAgICB1cGRhdGVxdWVyeSgpCiAgICAgIHFzKCIjcGljLWxpa2UiKS5pbm5lckhUTUwgPSBxcygiI2ZpbHRlci1saWtlcyIpLmlubmVySFRNTCA9IHFzKCIjdGVtcGxhdGUgLmhlYXJ0c3ZnIikub3V0ZXJIVE1MCiAgICAgIHNldGFjdGl2ZSgic2V0Y29scyIsICJjb2xzIiwgY29scygpKQogICAgICBzZXRhY3RpdmUoInNldGF1dG9wbGF5IiwgImF1dG9wbGF5IiwgYXV0b3BsYXkoKSkKICAgICAgc2V0YWN0aXZlKCJzZXRsaW1pdCIsICJsaW1pdCIsIGxpbWl0KCkpCgogICAgICBmdW5jdGlvbiBmcm9tSGV4U3RyaW5nKHN0cil7CiAgICAgICAgbGV0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHN0ci5sZW5ndGggLyAyKQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmZmVyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBidWZmZXJbaV0gPSBwYXJzZUludChzdHIuc3Vic3RyKDIgKiBpLCAyKSwgMTYpCiAgICAgICAgfQogICAgICAgIHJldHVybiBidWZmZXIKICAgICAgfQogIAogICAgICBmdW5jdGlvbiBzZXR0aW5nKGtleSwgZGVmYXVsdHZhbHVlKXsKICAgICAgICBjb25zdCB2ID0gcGFyc2VJbnQobG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KSwgMTApCiAgICAgICAgcmV0dXJuIHYgJiYgb3B0aW9uKCJzZXQiICsga2V5LCBrZXksIHYpICYmIHYgfHwgZGVmYXVsdHZhbHVlCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIG9wdGlvbihjLCBrZXksIHZhbCl7CiAgICAgICAgcmV0dXJuIHFzKCIuIiArIGMgKyAiW2RhdGEtIiArIGtleSArICI9JyIgKyB2YWwgKyAiJ10iKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxcyhxKXsKICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihxKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxc2EocSl7CiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChxKSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gZ2lkKGkpewogICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxdWVyeXR5cGUoKXsKICAgICAgICByZXR1cm4gcXMoIiNxdWVyeS10eXBlIikudmFsdWUgfHwgImFsbCIKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlcXVlcnkoKXsKICAgICAgICBsZXQgcGFydHMgPSBkZWNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaGFzaC5zdWJzdHJpbmcoMSkpLnNwbGl0KCIvIikKICAgICAgICBxdWVyeXN0ciA9IHFzKCIjcXVlcnlkaXNwbGF5IC50ZXh0IikuaW5uZXJUZXh0ID0gcGFydHNbMF0KICAgICAgICBxcygiI3F1ZXJ5IikudmFsdWUgPSBwYXJ0c1swXQogICAgICAgIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlID0gcGFydHNbMV0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gYWN0aXZlKCl7CiAgICAgICAgcmV0dXJuIHFzKCIjcGljcyAuYWN0aXZlIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcGljb2Zmc2V0KG9mZnNldCl7CiAgICAgICAgY29uc3QgcGljcyA9IHFzYSgiI3BpY3MgPiBhIikuZmlsdGVyKGUgPT4gZS5zdHlsZS5kaXNwbGF5ID09ICJibG9jayIpCiAgICAgICAgcmV0dXJuIHBpY3NbcGljcy5pbmRleE9mKGFjdGl2ZSgpKStvZmZzZXRdCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGxhc3RhY3RpdmUoKXsKICAgICAgICByZXR1cm4gcXNhKCIjcGljcyAuYWN0aXZlIikucG9wKCkgICAgICAKICAgICAgfQoKICAgICAgZnVuY3Rpb24gbWVudSgpewogICAgICAgIHFzYSgiI21lbnUtY29udGVudCwgI21lbnUtb3ZlcmxheSIpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC50b2dnbGUoIm9wZW4iKSkKICAgICAgfQogIAogICAgICBmdW5jdGlvbiBzZXRhY3RpdmUoYywga2V5LCB2YWwpewogICAgICAgIHFzYSgiLiIgKyBjKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKSkKICAgICAgICBjb25zdCBvcHRpb24gPSBxcygiLiIgKyBjICsgIltkYXRhLSIgKyBrZXkgKyAiPSciICsgdmFsICsgIiddIikKICAgICAgICBvcHRpb24/LmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZXZpZGVvcGxheSgpewogICAgICAgIGxldCBlbmFibGVkdmlkZW9zID0gMAogICAgICAgIGxldCB0b3RhbHZpZGVvcyA9IDAKICAgICAgICBsZXQgcmVhZHl2aWRlb3MgPSAwCiAgICAgICAgCiAgICAgICAgcXNhKCJ2aWRlbyIpLmZvckVhY2goYXN5bmMgdiA9PiB7CiAgICAgICAgICB0b3RhbHZpZGVvcysrCiAgICAgICAgICAKICAgICAgICAgIGlmKHYucmVhZHlTdGF0ZSA9PSA0KXsKICAgICAgICAgICAgcmVhZHl2aWRlb3MrKwogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBjb25zdCBhcGxheSA9IGF1dG9wbGF5KCkKICAgICAgICAgIGlmKGFwbGF5ICE9ICJvbiIpewogICAgICAgICAgICB2LnBhdXNlKCkKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgY29uc3QgbiA9IHYucGFyZW50RWxlbWVudAogICAgICAgICAgCiAgICAgICAgICBpZigobi5vZmZzZXRUb3AgKyBuLm9mZnNldEhlaWdodCkgPCBzY3JvbGxZIAogICAgICAgICAgfHwgbi5vZmZzZXRUb3AgPiAoc2Nyb2xsWSArIHZpc3VhbFZpZXdwb3J0LmhlaWdodCkpewogICAgICAgICAgICBpZih2LnJlYWR5U3RhdGUgPT0gNCl7CiAgICAgICAgICAgICAgdi5wYXVzZSgpCiAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgIHYucHJlbG9hZCA9ICJub25lIgogICAgICAgICAgICB9CiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgZW5hYmxlZHZpZGVvcysrCiAgICAgICAgICAgIGlmKHYucmVhZHlTdGF0ZSAhPSA0KXsKICAgICAgICAgICAgICB2LnByZWxvYWQgPSAiYXV0byIKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgaWYoKGFwbGF5ID09ICJvbiIgfHwgYXBsYXkgPT0gImhvdmVyIikgJiYgdi5yZWFkeVN0YXRlID09IDQpewogICAgICAgICAgICAgIC8vYXdhaXQgc2xlZXAoMTAwMCkKICAgICAgICAgICAgICB2LnBsYXkoKQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSkKICAgICAgICAKICAgICAgICAvL2NvbnNvbGUubG9nKCJ2aWRlb3MgZW5hYmxlZCIsIGVuYWJsZWR2aWRlb3MpCiAgICAgICAgLy9jb25zb2xlLmxvZygidmlkZW9zIHJlYWR5IiwgcmVhZHl2aWRlb3MpCiAgICAgICAgLy9jb25zb2xlLmxvZygidmlkZW9zIHRvdGFsIiwgdG90YWx2aWRlb3MpCiAgICAgIH0KICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsICgpID0+IHVwZGF0ZXZpZGVvcGxheSgpKQogICAgICAKICAgICAgcXMoImZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBsb2NhdGlvbi5oYXNoID0gIiMiICsgZW5jb2RlVVJJQ29tcG9uZW50KHFzKCIjcXVlcnkiKS52YWx1ZSArICIvIiArIHF1ZXJ5dHlwZSgpKQogICAgICAgIHVwZGF0ZXF1ZXJ5KCkKICAgICAgfSkKCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaWYoYXV0b3BsYXkoKSA9PSAiaG92ZXIiICYmIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygidmlkZW8tY29udGFpbmVyIikpewogICAgICAgICAgZS50YXJnZXQucXVlcnlTZWxlY3RvcigidmlkZW8iKS5wbGF5KCkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5zdHlsZS5kaXNwbGF5ICE9ICJibG9jayIgJiYgYXV0b3BsYXkoKSA9PSAiaG92ZXIiICYmIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygidmlkZW8tY29udGFpbmVyIikpewogICAgICAgICAgcXNhKCJ2aWRlbyIpLmZvckVhY2godiA9PiB2LnBhdXNlKCkpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBhc3luYyAoZSkgPT4gewogICAgICAgIC8vY29uc29sZS5sb2coImNsaWNrIiwgZSwgZS50YXJnZXQuaHJlZikKICAgICAgICBpZihlLnRhcmdldC50eXBlID09ICJzdWJtaXQiIHx8IChlLnRhcmdldC50YWdOYW1lID09ICJBIiAmJiBlLnRhcmdldC5ocmVmLm1hdGNoKC9eKHx3ZWJcKylub3N0clw6LykpKXsKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJ0aXRsZSIpewogICAgICAgICAgcXMoIiNxdWVyeSIpLnZhbHVlID0gIiIKICAgICAgICAgIHFzKCIjZ28iKS5jbGljaygpCiAgICAgICAgfQoKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gImZpbHRlci1saWtlcyIpewogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCJmaWx0ZXItbGlrZXMiKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2hvdyIpKXsKICAgICAgICAgIGFjdGl2ZSgpPy5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgZ2lkKGUudGFyZ2V0LmlkKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgc2hvdyhlLnRhcmdldC5pZCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC50YWdOYW1lICE9ICJBIiAmJiAocXMoIiNwaWMtY29udGFpbmVyIikgPT0gZS50YXJnZXQgfHwgcXMoIiNtZWRpYS1jb250YWluZXIgdmlkZW8iKSA9PSBlLnRhcmdldCkpewogICAgICAgICAgaGlkZW1lZGlhKCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gIm1lbnUiIHx8IGUudGFyZ2V0LmlkID09ICJtZW51LW92ZXJsYXkiKXsKICAgICAgICAgIG1lbnUoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNldGNvbHMiKSl7CiAgICAgICAgICBmb3IobGV0IGMgb2YgY29sb3B0cyl7CiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgiY29scyIgKyBjKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgZS50YXJnZXQuZGF0YXNldC5jb2xzKQogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImNvbHMiLCBlLnRhcmdldC5kYXRhc2V0LmNvbHMpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGNvbHMiLCAiY29scyIsIGNvbHMoKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRsaW1pdCIpKXsKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJsaW1pdCIsIGUudGFyZ2V0LmRhdGFzZXQubGltaXQpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGxpbWl0IiwgImxpbWl0IiwgbGltaXQoKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNldGF1dG9wbGF5IikpewogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImF1dG9wbGF5IiwgZS50YXJnZXQuZGF0YXNldC5hdXRvcGxheSkKICAgICAgICAgIHNldGFjdGl2ZSgic2V0YXV0b3BsYXkiLCAiYXV0b3BsYXkiLCBhdXRvcGxheSgpKQogICAgICAgICAgdXBkYXRldmlkZW9wbGF5KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoImxpa2UiKSl7CiAgICAgICAgICBsaWtlKGUudGFyZ2V0KQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGxpa2UobGluayl7CiAgICAgICAgY29uc3QgZXZlbnQgPSBsaW5rLnBhcmVudEVsZW1lbnRbImRhdGEtZXZlbnQiXQogICAgICAgIGNvbnN0IHB1YmtleSA9IGF3YWl0IG5vc3RyLmdldFB1YmxpY0tleSgpCiAgICAgICAgY29uc3QgbGlrZSA9IGF3YWl0IG5vc3RyLnNpZ25FdmVudCh7CiAgICAgICAgICAia2luZCI6IDcsCiAgICAgICAgICAiY29udGVudCI6ICIrIiwKICAgICAgICAgICJ0YWdzIjogWwogICAgICAgICAgICBbImUiLCBldmVudC5pZF0sCiAgICAgICAgICAgIFsicCIsIGV2ZW50LnB1YmtleV0KICAgICAgICAgIF0sCiAgICAgICAgICAicHVia2V5IjogcHVia2V5LAogICAgICAgICAgImNyZWF0ZWRfYXQiOiBwYXJzZUludChEYXRlLm5vdygpIC8gMTAwMCAsIDEwKQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgc29ja2V0cy5mb3JFYWNoKHMgPT4gcy5zZW5kKEpTT04uc3RyaW5naWZ5KFsiRVZFTlQiLCBsaWtlXSkpKQoKICAgICAgICBsaW5rLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQoKICAgICAgICBjb25zdCBwaWNpZCA9IGxpbmtbImRhdGEtaXRlbS1pZCJdIHx8IGxpbmsuZGF0YXNldC5waWNJZAogICAgICAgIAogICAgICAgIGlmKHBpY2lkKXsKICAgICAgICAgIGdpZChwaWNpZCkucXVlcnlTZWxlY3RvcigiLmxpa2UiKS5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICAgIHJlYWN0ZWQucHVzaChwaWNpZCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc29sZS5sb2coInJlYWN0aW9uIHNlbnQiKQogICAgICB9CgogICAgICBhZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgZSA9PiB7CiAgICAgICAgaWYoWyJUYWIiLCAiQXJyb3dMZWZ0IiwgIkFycm93UmlnaHQiLCAiQXJyb3dVcCIsICJBcnJvd0Rvd24iXS5pbmNsdWRlcyhlLmtleSkpewogICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiRXNjYXBlIil7CiAgICAgICAgICBtZW51KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLmtleSA9PSAiRW50ZXIiICYmIGUudGFyZ2V0LnRhZ05hbWUgPT0gIkJPRFkiKXsKICAgICAgICAgIGlmKHFzKCIjbWVkaWEtY29udGFpbmVyIikuc3R5bGUuZGlzcGxheSA9PSAiYmxvY2siKXsKICAgICAgICAgICAgaGlkZW1lZGlhKCkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHNob3coYWN0aXZlKCkuaWQpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd1VwIiAmJiBwaWNvZmZzZXQoLWNvbHMoKSkpewogICAgICAgICAgcGljb2Zmc2V0KC1jb2xzKCkpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBsYXN0YWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd0Rvd24iICYmIHBpY29mZnNldChjb2xzKCkpKXsKICAgICAgICAgIHBpY29mZnNldChjb2xzKCkpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93TGVmdCIgJiYgcGljb2Zmc2V0KC0xKSl7CiAgICAgICAgICBwaWNvZmZzZXQoLTEpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBsYXN0YWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd1JpZ2h0IiAmJiBwaWNvZmZzZXQoMSkpewogICAgICAgICAgcGljb2Zmc2V0KDEpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgIH0KICAKICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLnN0eWxlLmRpc3BsYXkgPT0gImJsb2NrIil7CiAgICAgICAgICBzaG93KGFjdGl2ZSgpLmlkKQogICAgICAgIH0KICAgICAgfSkKCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5KHNvY2tldCl7CiAgICAgICAgbGV0IHQgPSBEYXRlLm5vdygpCiAgICAgICAgbGV0IHEgPSBxdWVyeXN0ci50cmltKCkKICAgICAgICBsZXQgdHlwZSA9IHF1ZXJ5dHlwZSgpCiAgICAgICAgbGV0IGwgPSBsaW1pdCgpCiAgICAgICAgbGV0IGkgPSArK2lkY291bnRlcgogICAgICAgIGxldCBxaWQgPSAicXVlcnlfIiArIGkKICAgICAgICBsZXQgZmlsdGVycyA9IHR5cGVzW3R5cGVdLm1hcCgodCkgPT4gewogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAga2luZHM6IFswLCAxXSwgCiAgICAgICAgICAgIHNlYXJjaDogIi4iICsgdCwKICAgICAgICAgICAgbGltaXQ6IGwKICAgICAgICAgIH0KICAgICAgICB9KQogICAgICAgIGlmKHEubGVuZ3RoID4gMCl7CiAgICAgICAgICBmaWx0ZXJzLnB1c2goe2tpbmRzOiBbMCwgMV0sIHNlYXJjaDogcX0pCiAgICAgICAgfQogICAgICAgIGNvbnN0IHNlYXJjaG9iaiA9IFsiUkVRIiwgcWlkLCAuLi5maWx0ZXJzXQogICAgICAgIGNvbnN0IHNlYXJjaGpzb24gPSBKU09OLnN0cmluZ2lmeShzZWFyY2hvYmopCiAgICAgICAgCiAgICAgICAgc29ja2V0LnNlbmQoc2VhcmNoanNvbikKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB3YWl0cmVzKHFpZCkKICAgICAgICBzYXZlKHJlcywgcSwgdHlwZSkKICAgICAgICBsZXQgd2FpdCA9IHdhaXRtcyAtIChEYXRlLm5vdygpIC0gdCkKICAgICAgICBhd2FpdCBzbGVlcCh3YWl0KQogICAgICAgIHF1ZXJ5KHNvY2tldCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlsaWtlcyhzb2NrZXQsIGV2ZW50aWRzKXsKICAgICAgICBpZighd2luZG93Lm5vc3RyKXsKICAgICAgICAgIHJldHVybiBbXQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBteXB1YmtleSA9IGF3YWl0IG5vc3RyLmdldFB1YmxpY0tleSgpCiAgICAgICAgCiAgICAgICAgY29uc3QgcXVlcnlpZCA9ICJsaWtlc18iICsgKCsraWRjb3VudGVyKQogICAgICAgIHNvY2tldC5zZW5kKHF1ZXJpZXMucmVhY3Rpb25zLnJlcGxhY2UoIjxJPiIsIHF1ZXJ5aWQpLnJlcGxhY2UoIjxFPiIsIEpTT04uc3RyaW5naWZ5KGV2ZW50aWRzKSkpCiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgd2FpdHJlcyhxdWVyeWlkKQogICAgICAgIHJldHVybiByZXMgJiYgcmVzLmZpbHRlcihlID0+IGUucHVia2V5ID09IG15cHVia2V5KS5tYXAoZSA9PiBlLnRhZ3MuZmluZCh0ID0+IHRbMF0gPT0gImUiKVsxXSkgfHwgW10KICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlwdWJrZXkoc29ja2V0LCBwdWJrZXkpewogICAgICAgIGNvbnN0IHF1ZXJ5aWQgPSAicXVlcnlfIiArICgrK2lkY291bnRlcikKICAgICAgICBzb2NrZXQuc2VuZChxdWVyaWVzLmF1dGhvci5yZXBsYWNlKCI8ST4iLCBxdWVyeWlkKS5yZXBsYWNlKCI8UD4iLCBwdWJrZXkpKQoKICAgICAgICByZXR1cm4gKGF3YWl0IHdhaXRyZXMocXVlcnlpZCkpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNhdmVyZXN1bHRzKGV2ZW50LCByZWdleCwgbWV0YWV2ZW50cywgcmVhY3RlZGV2ZW50aWRzKXsKICAgICAgICBsZXQgcmVzdWx0cyA9IFtdCiAgICAgICAgCiAgICAgICAgZm9yKGxldCB1cmwgb2YgZXZlbnQuY29udGVudC5tYXRjaChyZWdleCkgfHwgW10pewogICAgICAgICAgaWYoIXVybHMuaW5jbHVkZXModXJsKSl7CiAgICAgICAgICAgIGNvbnN0IG1ldGEgPSBtZXRhZXZlbnRzLmZpbmQobyA9PiBvLnB1YmtleSA9PSBldmVudC5wdWJrZXkpCiAgICAgICAgICAgIAogICAgICAgICAgICB1cmxzLnB1c2godXJsKQogICAgICAgICAgICByZXN1bHRzLnB1c2goewogICAgICAgICAgICAgIHJlYWN0ZWQ6IHJlYWN0ZWRldmVudGlkcy5pbmNsdWRlcyhldmVudC5pZCksIAogICAgICAgICAgICAgIHVybDogdXJsLCAKICAgICAgICAgICAgICBldmVudDogZXZlbnQsIAogICAgICAgICAgICAgIGJlY2gzMmlkOiBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyhldmVudC5pZCkpLAogICAgICAgICAgICAgIG1ldGE6IG1ldGEKICAgICAgICAgICAgfSkKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIHJlc3VsdHMKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gc2F2ZShldmVudGRiLCBxLCBxdHlwZSl7CiAgICAgICAgY29uc3QgbWV0YWV2ZW50cyA9IGV2ZW50ZGIuZmlsdGVyKG8gPT4gby5raW5kID09IDApCiAgICAgICAgY29uc3QgZXZlbnRzID0gZXZlbnRkYi5maWx0ZXIobyA9PiBvLmtpbmQgPT0gMSkvLy5zbGljZSgwLCAxMDApCiAgICAgICAgbGV0IHJlc3VsdHMgPSBbXQogICAgICAgIAogICAgICAgIGNvbnN0IGV2ZW50aWRzID0gZXZlbnRzLm1hcChlID0+IGUuaWQpCiAgICAgICAgbGV0IHJlYWN0ZWRldmVudGlkcyA9IFtdCiAgICAgICAgZm9yKGxldCBzIG9mIHNvY2tldHMpewogICAgICAgICAgcmVhY3RlZGV2ZW50aWRzLnB1c2goLi4uKGF3YWl0IHF1ZXJ5bGlrZXMocywgZXZlbnRpZHMpKSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZm9yKGxldCBldmVudCBvZiBldmVudHMpewogICAgICAgICAgaWYocXR5cGUgIT0gInZpZGVvIil7CiAgICAgICAgICAgIHJlc3VsdHMucHVzaCguLi5zYXZlcmVzdWx0cyhldmVudCwgaW1ncmVnZXgsIG1ldGFldmVudHMsIHJlYWN0ZWRldmVudGlkcykpCiAgICAgICAgICB9CgogICAgICAgICAgaWYocXR5cGUgIT0gImltYWdlIil7CiAgICAgICAgICAgIHJlc3VsdHMucHVzaCguLi5zYXZlcmVzdWx0cyhldmVudCwgdmlkZW9yZWdleCwgbWV0YWV2ZW50cywgcmVhY3RlZGV2ZW50aWRzKSkKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgdXBkYXRlY29udGVudChyZXN1bHRzLCBxKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVjb250ZW50KHJlc3VsdHMsIHEpewogICAgICAgIHJlc3VsdHMucmV2ZXJzZSgpLmZvckVhY2goaXRlbSA9PiB7CiAgICAgICAgICBjb25zdCB0ZXh0ID0gKHEgfHwgInZpZXcgbm90ZSIpLnN1YnN0cmluZygtMzApCiAgICAgICAgICBjb25zdCBpZCA9ICJpdGVtXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgICBjb25zdCBjb250ZW50ZWxlbWVudHMgPSAnPGRpdiBjbGFzcz0idHlwZSI+JyArIChpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KSAmJiAidiIgfHwgImkiKSArICc8L2Rpdj48YSBjbGFzcz0ibGlrZScgKyAoaXRlbS5yZWFjdGVkID8gJyByZWFjdGVkJyA6ICcnKSArICciIGRhdGEtaXRlbS1pZD0iJyArIGlkICsgCiAgICAgICAgICAgICciIGhyZWY9IiMiPicgKyBxcygiI3RlbXBsYXRlIC5oZWFydHN2ZyIpLm91dGVySFRNTCArICc8L2E+PGEgY2xhc3M9InF1ZXJ5IiBocmVmPSInICsgcHJvdG9jb2wgKyAKICAgICAgICAgICAgaXRlbS5iZWNoMzJpZCArICciPicgKyB0ZXh0ICsgJzwvYT4nCgogICAgICAgICAgaWYoaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleCkpewogICAgICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKQogICAgICAgICAgICBkaXYuY2xhc3NMaXN0LmFkZCgidmlkZW8tY29udGFpbmVyIikKICAgICAgICAgICAgCiAgICAgICAgICAgIGNvbnN0IHYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpCiAgICAgICAgICAgIGRpdi5jbGFzc0xpc3QuYWRkKCJzaG93IikKICAgICAgICAgICAgCiAgICAgICAgICAgIGRpdi5pZCA9IGlkCiAgICAgICAgICAgIGRpdlsiZGF0YS1pdGVtIl0gPSBpdGVtCiAgICAgICAgICAgIGRpdlsiZGF0YS1ldmVudCJdID0gaXRlbS5ldmVudAogICAgICAgICAgICBkaXZbImRhdGEtcXVlcnkiXSA9IHEKICAgICAgICAgICAgZGl2WyJkYXRhLXRleHQiXSA9IHRleHQKICAgICAgICAgICAgZGl2LmlubmVySFRNTCA9IGNvbnRlbnRlbGVtZW50cwogICAgICAgICAgICAvL2Rpdi5pbm5lckhUTUwgKz0gJzxkaXYgY2xhc3M9InByb2dyZXNzIj4wICU8L2Rpdj4nCiAgICAgICAgICAgIHZbImRhdGEtaXRlbS1pZCJdID0gaWQKICAgICAgICAgICAgCiAgICAgICAgICAgIHYucHJlbG9hZCA9ICJub25lIgogICAgICAgICAgICAvL3YuY29udHJvbHMgPSB0cnVlCiAgICAgICAgICAgIHYubG9vcCA9IHRydWUKICAgICAgICAgICAgdi5tdXRlZCA9IHRydWUKICAgICAgICAgICAgdi5wbGF5c2lubGluZSA9ICIiCiAgICAgICAgICAgIC8vdi5wcmVsb2FkID0gImF1dG8iCiAgICAgICAgICAgIGRpdi5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgICAgICAKICAgICAgICAgICAgdi5vbmNhbnBsYXkgPSBhc3luYyBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICBjb25zdCBhc3BlY3QgPSB0aGlzLnZpZGVvV2lkdGggLyB0aGlzLnZpZGVvSGVpZ2h0CiAgICAgICAgICAgICAgaWYoYXNwZWN0ID4gMSl7CiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLndpZHRoID0gKGFzcGVjdCAqIDEwMCkgKyAiJSIKICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUuaGVpZ2h0ID0gKDEgLyBhc3BlY3QgKiAxMDApICsgIiUiCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIAogICAgICAgICAgICAgIHVwZGF0ZXZpZGVvcGxheSgpCiAgICAgICAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vdi5vbnByb2dyZXNzID0gYXN5bmMgZnVuY3Rpb24oZSl7CiAgICAgICAgICAgIC8vICBsZXQgcHJvZ3Jlc3MgPSBwYXJzZUludCh0aGlzLmJ1ZmZlcmVkLmxlbmd0aCA9PSAwID8gMCA6IHRoaXMuYnVmZmVyZWQuZW5kKDApIC8gdGhpcy5kdXJhdGlvbiAqIDEwMDAwLCAxMCkgLyAxMDAKICAgICAgICAgICAgLy8gIHRoaXMucGFyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKCIucHJvZ3Jlc3MiKS5pbm5lclRleHQgPSBwcm9ncmVzcyArICIgfCAiICsgdGhpcy5idWZmZXJlZC5sZW5ndGgKICAgICAgICAgICAgLy8gIGNvbnNvbGUubG9nKCJwcm9ncmVzcyIsIHByb2dyZXNzKQogICAgICAgICAgICAvL30KICAgICAgCiAgICAgICAgICAgIGRpdi5jbGFzc0xpc3QuYWRkKCJ2aWRlbyIpCiAgICAgICAgICAgIGNvbnN0IGV4dCA9IGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpWzFdCiAgICAgICAgICAgIHYuaW5uZXJIVE1MID0gJzxzb3VyY2Ugc3JjPSInICsgaXRlbS51cmwgKyAnIiB0eXBlPSJ2aWRlby8nICsgZXh0ICsgJyI+PC9zb3VyY2U+JwogICAgICAgICAgICAKICAgICAgICAgICAgZGl2LmFwcGVuZCh2KQogICAgICAgICAgICBxcygiI3BpY3MiKS5wcmVwZW5kKGRpdikKICAgICAgICAgIH1lbHNleyAKICAgICAgICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKQogICAgICAgICAgICBhLmlkID0gaWQKICAgICAgICAgICAgYS5jbGFzc0xpc3QuYWRkKCJzaG93IikKICAgICAgICAgICAgYS5jbGFzc0xpc3QuYWRkKGl0ZW0udHlwZSkKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmKGl0ZW0ucmVhY3RlZCl7CiAgICAgICAgICAgICAgYS5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgYVsiZGF0YS1pdGVtIl0gPSBpdGVtCiAgICAgICAgICAgIGFbImRhdGEtZXZlbnQiXSA9IGl0ZW0uZXZlbnQKICAgICAgICAgICAgYVsiZGF0YS1xdWVyeSJdID0gcQogICAgICAgICAgICBhWyJkYXRhLXRleHQiXSA9IHRleHQKICAgICAgICAgICAgYS5ocmVmID0gIiMiCiAgICAgICAgICAgIGEuaW5uZXJIVE1MID0gY29udGVudGVsZW1lbnRzCiAgICAgICAgICAgICAgCiAgICAgICAgICAgIGlmKGl0ZW0udHlwZSA9PSAicGljIil7CiAgICAgICAgICAgICAgYS5pbm5lckhUTUwgKz0gJzxpbWcgb25sb2FkPSJnaWQoXCcnICsgYS5pZCArICdcJykuc3R5bGUuZGlzcGxheT1cJ2Jsb2NrXCciIHNyYz0iJyArIGl0ZW0udXJsICsgJyIvPicKICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgYS5pbm5lckhUTUwgKz0gJzxzcGFuIGNsYXNzPSJmaWxlIj4nICsgaXRlbS51cmwgKyAnPC9zcGFuPicKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgcXMoIiNwaWNzIikucHJlcGVuZChhKQogICAgICAgICAgfQogICAgICAgIH0pCgogICAgICAgIGlmKGFjdGl2ZSgpID09IG51bGwpewogICAgICAgICAgcXMoIiNwaWNzIGEiKT8uY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgdXBkYXRldmlkZW9wbGF5KCkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGlkZW1lZGlhKCl7CiAgICAgICAgcXNhKCIjbWVkaWEtY29udGFpbmVyLCAjcGljLCAjbWVkaWEtZm9vdGVyIikuZm9yRWFjaChuID0+IG4uc3R5bGUuZGlzcGxheSA9ICJub25lIikKICAgICAgICBnaWQoInBpYy1saWtlIikuY2xhc3NMaXN0LnJlbW92ZSgicmVhY3RlZCIpCiAgICAgICAgLy9xcygiI21lZGlhLWNvbnRhaW5lciB2aWRlbyIpPy5wYXVzZSgpCiAgICAgICAgY29uc3QgdiA9IHFzKCIjbWVkaWEtY29udGFpbmVyIHZpZGVvIikKICAgICAgICAKICAgICAgICBpZih2KXsKICAgICAgICAgIHYubXV0ZWQgPSB0cnVlCiAgICAgICAgICBnaWQodlsiZGF0YS1pdGVtLWlkIl0pLmFwcGVuZENoaWxkKHYpCiAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkoKQogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gd2FpdHJlcyhrZXkpewogICAgICAgIGxldCBldmVudHMgPSBbXQogICAgICAgIAogICAgICAgIGxldCByZXNoYW5kbGVyID0gZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXsKICAgICAgICAgIHRoaXMuaGFuZGxlID0gZnVuY3Rpb24ocmVzKXsKICAgICAgICAgICAgdGhpcy5rZXkgPSBrZXkKICAgICAgICAgICAgbGV0IG8gPSBKU09OLnBhcnNlKHJlcy5kYXRhKQogICAgICAgICAgICBpZihvWzFdID09IGtleSl7CiAgICAgICAgICAgICAgaWYob1swXSA9PSAiRU9TRSIpewogICAgICAgICAgICAgICAgcmVzb2x2ZShldmVudHMpCiAgICAgICAgICAgICAgICByZXNoYW5kbGVycy5zcGxpY2UocmVzaGFuZGxlcnMuaW5kZXhPZih0aGlzKSwgMSkKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgZXZlbnRzLnB1c2gob1syXSkKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAgIAogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICByZXNoYW5kbGVycy5wdXNoKG5ldyByZXNoYW5kbGVyKHJlc29sdmUsIHJlamVjdCkpCiAgICAgICAgfSkKICAgICAgfQogICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGNoZWNrdXBkYXRlKCl7CiAgICAgICAgY29uc3QgdXBkYXRlc3JlcyA9IGF3YWl0IHF1ZXJ5cHVia2V5KHNvY2tldHNbMF0sIHVwZGF0ZXNwdWJrZXkpCiAgICAgICAgY29uc3QgdXBkYXRlbm90ZSA9IHVwZGF0ZXNyZXMuZmluZChuID0+IG4uY29udGVudC5tYXRjaCgvXmh0dHBzXDpcL1wvLykpCiAgICAgICAgY29uc3QgYWdlID0gTWF0aC5yb3VuZCgoRGF0ZS5ub3coKSAvIDEwMDAgLSB1cGRhdGVub3RlLmNyZWF0ZWRfYXQpIC8gMzYwMCAvIDI0KQogICAgICAgIGNvbnN0IG5vdGVpZCA9IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKHVwZGF0ZW5vdGUuaWQpKQogICAgICAgIHFzKCIjcmVsZWFzZSIpLmhyZWYgPSBwcm90b2NvbCArIG5vdGVpZAogICAgICAgIHFzKCIjcmVsZWFzZSIpLmlubmVyVGV4dCA9IChhZ2UgPT0gMCAmJiAidG9kYXkiIHx8IGFnZSArICIgZGF5KHMpIGFnbyIpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNsZWVwKG1zKXsKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIG1zKSkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gc2hvdyhpZCl7CiAgICAgICAgY29uc3QgaXRlbSA9IGdpZChpZClbImRhdGEtaXRlbSJdCiAgICAgICAgY29uc3QgbWVkaWEgPSBnaWQoIm1lZGlhLWNvbnRhaW5lciIpCiAgICAgICAgCiAgICAgICAgaWYoaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleCkpewogICAgICAgICAgY29uc3QgdiA9IGdpZChpZCkucXVlcnlTZWxlY3RvcigidmlkZW8iKQogICAgICAgICAgcXMoIiNtZWRpYS1jb250YWluZXIiKS5hcHBlbmRDaGlsZCh2KQogICAgICAgICAgdi5tdXRlZCA9IGZhbHNlCiAgICAgICAgICB2LnBsYXkoKQogICAgICAgICAgLy9jb25zdCB2ID0gY3JlYXRldmlkZW8ocXMoIiNtZWRpYS1jb250YWluZXIiKSwgaXRlbS51cmwpCiAgICAgICAgICAvL3YuY29udHJvbHMgPSB0cnVlCiAgICAgICAgfWVsc2V7CiAgICAgICAgICBjb25zdCBwaWMgPSBnaWQoInBpYyIpCiAgICAgICAgICBwaWMuc3JjID0gaXRlbS51cmwKICAgICAgICAgIHBpYy5vbmxvYWQgPSAoKSA9PiAocGljLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihpdGVtLm1ldGEpewogICAgICAgICAgY29uc3QgbWV0YWNvbnRlbnQgPSBKU09OLnBhcnNlKGl0ZW0ubWV0YS5jb250ZW50KQogICAgICAgICAgY29uc3QgbmFtZSA9IG1ldGFjb250ZW50LmRpc3BsYXlfbmFtZSB8fCBtZXRhY29udGVudC5uYW1lCiAgICAgICAgICBxcygiI3BpYy11c2VyIikuaHJlZiA9IHByb3RvY29sICsgYmVjaDMyLmVuY29kZSgibnB1YiIsIGZyb21IZXhTdHJpbmcoaXRlbS5tZXRhLnB1YmtleSkpCiAgICAgICAgICBxcygiI3BpYy11c2VyIikuaW5uZXJUZXh0ID0gbmFtZQogICAgICAgIH0KCiAgICAgICAgZ2lkKCJwaWMtbGlrZSIpWyJkYXRhLWl0ZW0taWQiXSA9IGlkCiAgICAgICAgZ2lkKCJtZWRpYS1mb290ZXIiKVsiZGF0YS1ldmVudCJdID0gaXRlbS5ldmVudAoKICAgICAgICBpZihpdGVtLnJlYWN0ZWQgfHwgcmVhY3RlZC5pbmNsdWRlcyhpZCkpewogICAgICAgICAgZ2lkKCJwaWMtbGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBhID0gcXMoIiNwaWMtcXVlcnkiKQogICAgICAgIGEuaHJlZiA9IHByb3RvY29sICsgaXRlbS5iZWNoMzJpZAogICAgICAgIGEuaW5uZXJUZXh0ID0gZ2lkKGlkKVsiZGF0YS10ZXh0Il0KICAgICAgICAgIAogICAgICAgIG1lZGlhLnN0eWxlLmRpc3BsYXkgPSBnaWQoIm1lZGlhLWZvb3RlciIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGNvbm5jb3VudCgpewogICAgICAgIHJldHVybiBzb2NrZXRzLmZpbHRlcihyID0+IHIucmVhZHlTdGF0ZSA9PSAxKS5sZW5ndGgKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gY29ubmVjdCgpewogICAgICAgIGZvcihsZXQgcmVsYXkgb2YgcmVsYXlzKXsKICAgICAgICAgIGlmKHJlbGF5LnJlYWR5U3RhdGUgPT0gMSl7CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGxldCBzb2NrZXQgPSBuZXcgV2ViU29ja2V0KHJlbGF5KQogICAgICAgICAgY29uc29sZS5sb2coImNvbm5lY3RpbmcgdG8iLCBzb2NrZXQudXJsKQogICAgICAgICAgc29ja2V0cy5wdXNoKHNvY2tldCkKICAgICAgICAgIHNvY2tldC5vbm1lc3NhZ2UgPSBtZXNzYWdlID0+IHJlc2hhbmRsZXJzLmZvckVhY2gocmggPT4gcmguaGFuZGxlKG1lc3NhZ2UpKQogICAgICAgICAgc29ja2V0Lm9uY2xvc2UgPSBhc3luYyBmdW5jdGlvbigpewogICAgICAgICAgICBjb25zb2xlLmxvZygiZGlzY29ubmVjdGVkIiwgdGhpcy51cmwsIGNvbm5jb3VudCgpKQogICAgICAgICAgICAvL2F3YWl0IHNsZWVwKDEwMDApCiAgICAgICAgICAgIC8vY29ubmVjdCgpCiAgICAgICAgICB9CiAgICAgICAgICBzb2NrZXQub25vcGVuID0gYXN5bmMgZnVuY3Rpb24oZSl7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCJjb25uZWN0ZWQiLCB0aGlzLnVybCwgY29ubmNvdW50KCkpCiAgICAgICAgICAgIGNoZWNrdXBkYXRlKCkKICAgICAgICAgICAgcXVlcnkoc29ja2V0KQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIGFzeW5jICgpID0+IHsKICAgICAgICBjb25uZWN0KCkKICAgICAgICAKICAgICAgICBhd2FpdCBzbGVlcCgxMDApCiAgICAgICAgCiAgICAgICAgaWYod2luZG93Lm5vc3RyKXsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgibm9zdHIiKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGZvcihsZXQgYyBvZiBjb2xvcHRzKXsKICAgICAgICBkb2N1bWVudC53cml0ZSgnPHN0eWxlPicgKyBjb2xzY3NzLmlubmVyVGV4dC5yZXBsYWNlKC9cJFx7Y29sc1x9L2csIGMpICsgJzwvc3R5bGU+JykKICAgICAgfQogICAgPC9zY3JpcHQ+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==