ZGlmZiAtLWdpdCBhL3BsYW5ldHN0YWNrL2NvcmUvcGx1cy9zaXRlcy5weSBiL3BsYW5ldHN0YWNrL2NvcmUvcGx1cy9zaXRlcy5weQppbmRleCAyN2FlMzUyLi5iOTYxNjljIDEwMDY0NAotLS0gYS9wbGFuZXRzdGFjay9jb3JlL3BsdXMvc2l0ZXMucHkKKysrIGIvcGxhbmV0c3RhY2svY29yZS9wbHVzL3NpdGVzLnB5CkBAIC0xMiwxNSArMTIsMjUgQEAKICAgICBkZWYgZ2V0X3VybHMoc2VsZik6CiAgICAgICAgICIiIkFkZCBvdXIgZGFzaGJvYXJkIHZpZXcgdG8gdGhlIGFkbWluIHVybGNvbmYuIERlbGV0ZWQgdGhlIGRlZmF1bHQgaW5kZXguIiIiCiAgICAgICAgIGZyb20gZGphbmdvLmNvbmYudXJscyBpbXBvcnQgcGF0dGVybnMsIHVybAotICAgICAgICBmcm9tIHZpZXdzIGltcG9ydCBEYXNoYm9hcmRXZWxjb21lVmlldywgRGFzaGJvYXJkQWpheFZpZXcKKyAgICAgICAgZnJvbSB2aWV3cyBpbXBvcnQgRGFzaGJvYXJkV2VsY29tZVZpZXcsIERhc2hib2FyZEFqYXhWaWV3LCBTaW11bGF0b3JWaWV3LCBEYXNoYm9hcmRTdW1tYXJ5QWpheFZpZXcsIERhc2hib2FyZEFkZE9yUmVtb3ZlU2xpdmVyVmlldywgRGFzaGJvYXJkVXNlclNpdGVWaWV3LCBEYXNoYm9hcmRBbmFseXRpY3NBamF4VmlldwogCiAgICAgICAgIHVybHMgPSBzdXBlcihBZG1pbk1peGluLCBzZWxmKS5nZXRfdXJscygpCiAgICAgICAgIGRlbCB1cmxzWzBdCiAgICAgICAgIGN1c3RvbV91cmwgPSBwYXR0ZXJucygnJywKLSAgICAgICAgICAgICAgIHVybChyJ14kJywgc2VsZi5hZG1pbl92aWV3KERhc2hib2FyZFdlbGNvbWVWaWV3LmFzX3ZpZXcoKSksIAorICAgICAgICAgICAgICAgdXJsKHInXiQnLCBzZWxmLmFkbWluX3ZpZXcoRGFzaGJvYXJkV2VsY29tZVZpZXcuYXNfdmlldygpKSwKICAgICAgICAgICAgICAgICAgICAgbmFtZT0iaW5kZXgiKSwKLSAgICAgICAgICAgICAgIHVybChyJ15ocGNkYXNoYm9hcmQvJywgc2VsZi5hZG1pbl92aWV3KERhc2hib2FyZEFqYXhWaWV3LmFzX3ZpZXcoKSksIAotICAgICAgICAgICAgICAgICAgICBuYW1lPSJocGNkYXNoYm9hcmQiKQorICAgICAgICAgICAgICAgdXJsKHInXmhwY2Rhc2h1c2Vyc2xpY2VzLycsIHNlbGYuYWRtaW5fdmlldyhEYXNoYm9hcmRVc2VyU2l0ZVZpZXcuYXNfdmlldygpKSwKKyAgICAgICAgICAgICAgICAgICAgbmFtZT0iaHBjZGFzaHVzZXJzbGljZXMiKSwKKyAgICAgICAgICAgICAgIHVybChyJ15ocGNkYXNoYm9hcmQvJywgc2VsZi5hZG1pbl92aWV3KERhc2hib2FyZEFqYXhWaWV3LmFzX3ZpZXcoKSksICAgICAgICAjIERFUFJFQ0FURUQKKyAgICAgICAgICAgICAgICAgICAgbmFtZT0iaHBjZGFzaGJvYXJkIiksCisgICAgICAgICAgICAgICB1cmwocidec2ltdWxhdG9yLycsIHNlbGYuYWRtaW5fdmlldyhTaW11bGF0b3JWaWV3LmFzX3ZpZXcoKSksCisgICAgICAgICAgICAgICAgICAgIG5hbWU9InNpbXVsYXRvciIpLAorICAgICAgICAgICAgICAgdXJsKHInXmhwY3N1bW1hcnkvJywgc2VsZi5hZG1pbl92aWV3KERhc2hib2FyZFN1bW1hcnlBamF4Vmlldy5hc192aWV3KCkpLCAgICMgREVQUkVDQVRFRAorICAgICAgICAgICAgICAgICAgICBuYW1lPSJocGNzdW1tYXJ5IiksCisgICAgICAgICAgICAgICB1cmwocideYW5hbHl0aWNzLyg/UDxuYW1lPlx3KykvJCcsIHNlbGYuYWRtaW5fdmlldyhEYXNoYm9hcmRBbmFseXRpY3NBamF4Vmlldy5hc192aWV3KCkpLAorICAgICAgICAgICAgICAgICAgICBuYW1lPSJhbmFseXRpY3MiKSwKKyAgICAgICAgICAgICAgIHVybChyJ15kYXNoYm9hcmRhZGRvcnJlbXNsaXZlci8kJywgc2VsZi5hZG1pbl92aWV3KERhc2hib2FyZEFkZE9yUmVtb3ZlU2xpdmVyVmlldy5hc192aWV3KCkpLAorICAgICAgICAgICAgICAgICAgICBuYW1lPSJhZGRvcnJlbXNsaXZlciIpCiAgICAgICAgICkKIAogICAgICAgICByZXR1cm4gY3VzdG9tX3VybCArIHVybHMKZGlmZiAtLWdpdCBhL3BsYW5ldHN0YWNrL2NvcmUvcGx1cy92aWV3cy5weSBiL3BsYW5ldHN0YWNrL2NvcmUvcGx1cy92aWV3cy5weQppbmRleCA2NTNlZTk1Li5hNTBkOTQ2IDEwMDY0NAotLS0gYS9wbGFuZXRzdGFjay9jb3JlL3BsdXMvdmlld3MucHkKKysrIGIvcGxhbmV0c3RhY2svY29yZS9wbHVzL3ZpZXdzLnB5CkBAIC0xLDE5NiArMSwxNDggQEAKICN2aWV3cy5weQoraW1wb3J0IG9zCitpbXBvcnQgc3lzCiBmcm9tIGRqYW5nby52aWV3cy5nZW5lcmljIGltcG9ydCBUZW1wbGF0ZVZpZXcsIFZpZXcKIGltcG9ydCBkYXRldGltZQotCi1pbXBvcnQganNvbiAKLWZyb20gY29yZS5tb2RlbHMgaW1wb3J0IFNsaWNlLFNsaWNlUm9sZSxTbGljZVByaXZpbGVnZSxTaXRlLFJlc2VydmF0aW9uCitmcm9tIHBwcmludCBpbXBvcnQgcHByaW50CitpbXBvcnQganNvbgorZnJvbSBjb3JlLm1vZGVscyBpbXBvcnQgU2xpY2UsU2xpY2VSb2xlLFNsaWNlUHJpdmlsZWdlLFNpdGUsUmVzZXJ2YXRpb24sU2xpdmVyCiBmcm9tIGRqYW5nby5odHRwIGltcG9ydCBIdHRwUmVzcG9uc2UKK2ltcG9ydCB0cmFjZWJhY2sKIAoraWYgb3MucGF0aC5leGlzdHMoIi9ob21lL3NtYmFrZXIvcHJvamVjdHMvdmljY2kvY2RuL2JpZ3F1ZXJ5Iik6CisgICAgc3lzLnBhdGguYXBwZW5kKCIvaG9tZS9zbWJha2VyL3Byb2plY3RzL3ZpY2NpL2Nkbi9iaWdxdWVyeSIpCitlbHNlOgorICAgIHN5cy5wYXRoLmFwcGVuZCgiL29wdC9wbGFuZXRzdGFjay9ocGNfd2l6YXJkIikKK2ltcG9ydCBocGNfd2l6YXJkCitmcm9tIHBsYW5ldHN0YWNrX2FuYWx5dGljcyBpbXBvcnQgRG9QbGFuZXRTdGFja0FuYWx5dGljcwogCiBjbGFzcyBEYXNoYm9hcmRXZWxjb21lVmlldyhUZW1wbGF0ZVZpZXcpOgogICAgIHRlbXBsYXRlX25hbWUgPSAnYWRtaW4vZGFzaGJvYXJkL3dlbGNvbWUuaHRtbCcKIAogICAgIGRlZiBnZXQoc2VsZiwgcmVxdWVzdCwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAgY29udGV4dCA9IHNlbGYuZ2V0X2NvbnRleHRfZGF0YSgqKmt3YXJncykKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgc2l0ZSA9IFNpdGUub2JqZWN0cy5maWx0ZXIoaWQ9cmVxdWVzdC51c2VyLnNpdGUuaWQpCi0gICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgIHNpdGUgPSBTaXRlLm9iamVjdHMuZmlsdGVyKG5hbWU9IlByaW5jZXRvbiIpCi0gICAgICAgIGNvbnRleHRbJ3NpdGUnXSA9IHNpdGVbMF0KKyAgICAgICAgdXNlckRldGFpbHMgPSBnZXRVc2VyU2xpY2VJbmZvKHJlcXVlc3QudXNlcikKKyAgICAgICAgI2NvbnRleHRbJ3NpdGUnXSA9IHVzZXJEZXRhaWxzWydzaXRlJ10KIAotICAgICAgICBjb250ZXh0Wyd1c2VyU2xpY2VJbmZvJ10gPSBnZXRTbGljZUluZm8ocmVxdWVzdCwgY29udGV4dCkKLSAgICAgICAgY29udGV4dFsnY2RuRGF0YSddID0gZ2V0Q0ROT3BlcmF0b3JEYXRhKCk7CisgICAgICAgIGNvbnRleHRbJ3VzZXJTbGljZUluZm8nXSA9IHVzZXJEZXRhaWxzWyd1c2VyU2xpY2VJbmZvJ10KKyAgICAgICAgY29udGV4dFsnY2RuRGF0YSddID0gdXNlckRldGFpbHNbJ2NkbkRhdGEnXQogICAgICAgICByZXR1cm4gc2VsZi5yZW5kZXJfdG9fcmVzcG9uc2UoY29udGV4dD1jb250ZXh0KQogCi1kZWYgZ2V0U2xpY2VJbmZvKHJlcXVlc3QsIGNvbnRleHQpOgorZGVmIGdldFVzZXJTbGljZUluZm8odXNlciwgdGFibGVGb3JtYXQgPSBGYWxzZSk6CisgICAgICAgIHVzZXJEZXRhaWxzID0ge30KKyMgICAgICAgIHRyeToKKyMgLy8gICAgICAgICAgIHNpdGUgPSBTaXRlLm9iamVjdHMuZmlsdGVyKGlkPXVzZXIuc2l0ZS5pZCkKKyMgIC8vICAgICAgZXhjZXB0OgorIyAgIC8vICAgICAgICAgc2l0ZSA9IFNpdGUub2JqZWN0cy5maWx0ZXIobmFtZT0iUHJpbmNldG9uIikKKyMgICAgLy8gICAgdXNlckRldGFpbHNbJ3NpdGVuYW1lJ10gPSBzaXRlWzBdLm5hbWUKKyMgICAgIC8vICAgdXNlckRldGFpbHNbJ3NpdGVpZCddID0gc2l0ZVswXS5pZAorCisgICAgICAgIHVzZXJTbGljZURhdGEgPSBnZXRTbGljZUluZm8odXNlcikKKyAgICAgICAgaWYgKHRhYmxlRm9ybWF0KToKKyMgICAgICAgICAgICBwcHJpbnQoIioqKioqKiogICAgICBHRVQgVVNFUiBTTElDRSBJTkZPIikKKyAgICAgICAgICAgIHVzZXJEZXRhaWxzWyd1c2VyU2xpY2VJbmZvJ10gPSB1c2VyU2xpY2VUYWJsZUZvcm1hdHRlcih1c2VyU2xpY2VEYXRhKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdXNlckRldGFpbHNbJ3VzZXJTbGljZUluZm8nXSA9IHVzZXJTbGljZURhdGEKKyAgICAgICAgdXNlckRldGFpbHNbJ2NkbkRhdGEnXSA9IGdldENETk9wZXJhdG9yRGF0YSgpOworIyAgICAgICAgcHByaW50KCB1c2VyRGV0YWlscykKKyAgICAgICAgcmV0dXJuIHVzZXJEZXRhaWxzCisKK2RlZiB1c2VyU2xpY2VUYWJsZUZvcm1hdHRlcihkYXRhKToKKyMgICAgcHByaW50KGRhdGEpCisgICAgZm9ybWF0dGVkRGF0YSA9IHsKKyAgICAgICAgICAgICAgICAgICAgICdyb3dzJyA6IGRhdGEKKyAgICAgICAgICAgICAgICAgICAgfQorICAgIHJldHVybiBmb3JtYXR0ZWREYXRhCisKK2RlZiBnZXRTbGljZUluZm8odXNlcik6CiAgICAgc2xpY2VMaXN0ID0gU2xpY2Uub2JqZWN0cy5hbGwoKQotICAgIHNsaWNlUHJpdnMgPSBTbGljZVByaXZpbGVnZS5vYmplY3RzLmZpbHRlcih1c2VyPXJlcXVlc3QudXNlcikKKyAgICBzbGljZVByaXZzID0gU2xpY2VQcml2aWxlZ2Uub2JqZWN0cy5maWx0ZXIodXNlcj11c2VyKQogICAgIHVzZXJTbGljZUluZm8gPSBbXQogICAgIGZvciBlbnRyeSBpbiBzbGljZVByaXZzOgogCisgICAgICAgIHNsaWNlbmFtZSA9IFNsaWNlLm9iamVjdHMuZ2V0KGlkPWVudHJ5LnNsaWNlLmlkKS5uYW1lCisgICAgICAgIHNsaWNlaWQgPSBTbGljZS5vYmplY3RzLmdldChpZD1lbnRyeS5zbGljZS5pZCkuaWQKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgcmVzZXJ2YXRpb25MaXN0ID0gUmVzZXJ2YXRpb24ub2JqZWN0cy5maWx0ZXIoc2xpY2U9ZW50cnkuc2xpY2UpCi0gICAgICAgICAgICByZXNlcnZhdGlvbnMgPSAoVHJ1ZSxyZXNlcnZhdGlvbkxpc3QpCi0KKyAgICAgICAgICAgIHNsaXZlckxpc3QgPSBTbGl2ZXIub2JqZWN0cy5maWx0ZXIoc2xpY2U9ZW50cnkuc2xpY2UuaWQpCisgICAgICAgICAgICBzaXRlTGlzdCA9IHt9CisgICAgICAgICAgICBmb3IgeCBpbiBzbGl2ZXJMaXN0OgorICAgICAgICAgICAgICAgaWYgeC5ub2RlLnNpdGUgbm90IGluIHNpdGVMaXN0OgorICAgICAgICAgICAgICAgICAgc2l0ZUxpc3RbeC5ub2RlLnNpdGVdID0gMQorICAgICAgICAgICAgc2xpdmVyY291bnQgPSBsZW4oc2xpdmVyTGlzdCkKKyAgICAgICAgICAgIHNpdGVjb3VudCA9IGxlbihzaXRlTGlzdCkKICAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgcmVzZXJ2YXRpb25zID0gTm9uZQorICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCisgICAgICAgICAgICBzbGl2ZXJjb3VudCA9IDAKKyAgICAgICAgICAgIHNpdGVjb3VudCA9IDAKIAotICAgICAgICB1c2VyU2xpY2VJbmZvLmFwcGVuZCh7J3NsaWNlJzogU2xpY2Uub2JqZWN0cy5nZXQoaWQ9ZW50cnkuc2xpY2UuaWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JvbGUnOiBTbGljZVJvbGUub2JqZWN0cy5nZXQoaWQ9ZW50cnkucm9sZS5pZCkucm9sZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXNlcnZhdGlvbnMnOiByZXNlcnZhdGlvbnN9KQorICAgICAgICB1c2VyU2xpY2VJbmZvLmFwcGVuZCh7J3NsaWNlbmFtZSc6IHNsaWNlbmFtZSwgJ3NsaWNlaWQnOnNsaWNlaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAncm9sZSc6IFNsaWNlUm9sZS5vYmplY3RzLmdldChpZD1lbnRyeS5yb2xlLmlkKS5yb2xlLCAnc2xpdmVyY291bnQnOiBzbGl2ZXJjb3VudCwgJ3NpdGVjb3VudCc6c2l0ZWNvdW50fSkKKwogICAgIHJldHVybiB1c2VyU2xpY2VJbmZvCiAKLQogZGVmIGdldENETk9wZXJhdG9yRGF0YShyYW5kb21pemVEYXRhID0gRmFsc2UpOgotICAgIGNkbkRhdGEgPSB7Ci0gICAgICAgICJBcml6b25hIjogewotICAgICAgICAgICAgImxhdCI6IDMyLjIzMzMsCi0gICAgICAgICAgICAibG9uZyI6IC0xMTAuOTQ3OTk5OTk5OTk5OTgsCi0gICAgICAgICAgICAiaGVhbHRoIjogMCwKLSAgICAgICAgICAgICJudW1Ob2RlcyI6IDE1LAotICAgICAgICAgICAgIm51bUhQQ1NsaXZlcnMiOiAyLAotICAgICAgICAgICAgInNpdGVVcmwiOiAiaHR0cDovL3d3dy5jcy5hcml6b25hLmVkdS8iCi0gICAgICAgIH0sCi0gICAgICAgICJJMiBTaW5nYXBvcmUiOiB7Ci0gICAgICAgICAgICAibGF0IjogMS4zMzU0NCwKLSAgICAgICAgICAgICJsb25nIjogMTAzLjg4OTk5OTk5OTk5OTk5LAotICAgICAgICAgICAgImhlYWx0aCI6IDAsCi0gICAgICAgICAgICAibnVtTm9kZXMiOiAxNSwKLSAgICAgICAgICAgICJudW1IUENTbGl2ZXJzIjogNSwKLSAgICAgICAgICAgICJzaXRlVXJsIjogImh0dHA6Ly93d3cuaW50ZXJuZXQyLmVkdS8iCi0gICAgICAgIH0sCi0gICAgICAgICJPTi5MYWIiOiB7Ci0gICAgICAgICAgICAibGF0IjogMzcuNDUyOTU1LAotICAgICAgICAgICAgImxvbmciOiAtMTIyLjE4MTc2NTk5OTk5OTk4LAotICAgICAgICAgICAgImhlYWx0aCI6IDAsCi0gICAgICAgICAgICAibnVtTm9kZXMiOiA0NSwKLSAgICAgICAgICAgICJudW1IUENTbGl2ZXJzIjogMTIsCi0gICAgICAgICAgICAic2l0ZVVybCI6ICJodHRwOi8vd3d3Lm9ubGFiLnVzLyIKLSAgICAgICAgfSwKLSAgICAgICAgIkkyIFdhc2hpbmd0b24gREMiOiB7Ci0gICAgICAgICAgICAibGF0IjogMzguMDA5LAotICAgICAgICAgICAgImxvbmciOiAtNzcuMDAwMjk5OTk5OTk5OTgsCi0gICAgICAgICAgICAiaGVhbHRoIjogMCwKLSAgICAgICAgICAgICJudW1Ob2RlcyI6IDUwLAotICAgICAgICAgICAgIm51bUhQQ1NsaXZlcnMiOiA3LAotICAgICAgICAgICAgInNpdGVVcmwiOiAiaHR0cDovL3d3dy5pbnRlcm5ldDIuZWR1LyIKLSAgICAgICAgfSwKLSAgICAgICAgIkkyIFNlYXR0bGUiOiB7Ci0gICAgICAgICAgICAibGF0IjogNDcuNjUzMSwKLSAgICAgICAgICAgICJsb25nIjogLTEyMi4zMTI5OTk5OTk5OTk5OSwKLSAgICAgICAgICAgICJoZWFsdGgiOiAwLAotICAgICAgICAgICAgIm51bU5vZGVzIjogMTAwLAotICAgICAgICAgICAgIm51bUhQQ1NsaXZlcnMiOiAxMCwKLSAgICAgICAgICAgICJzaXRlVXJsIjogImh0dHA6Ly93d3cuaW50ZXJuZXQyLmVkdS8iCi0gICAgICAgIH0sCi0gICAgICAgICJJMiBTYWx0IExha2UgQ2l0eSI6IHsKLSAgICAgICAgICAgICJsYXQiOiA0MC43NjU5LAotICAgICAgICAgICAgImxvbmciOiAtMTExLjg0NCwKLSAgICAgICAgICAgICJoZWFsdGgiOiAwLAotICAgICAgICAgICAgIm51bU5vZGVzIjogMzUsCi0gICAgICAgICAgICAibnVtSFBDU2xpdmVycyI6IDEwLAotICAgICAgICAgICAgInNpdGVVcmwiOiAiaHR0cDovL3d3dy5pbnRlcm5ldDIuZWR1LyIKLSAgICAgICAgfSwKLSAgICAgICAgIkkyIE5ldyBZb3JrIjogewotICAgICAgICAgICAgImxhdCI6IDQwLjcyLAotICAgICAgICAgICAgImxvbmciOiAtNzMuOTkwMDAwMDAwMDAwMDEsCi0gICAgICAgICAgICAiaGVhbHRoIjogMCwKLSAgICAgICAgICAgICJudW1Ob2RlcyI6IDI1LAotICAgICAgICAgICAgIm51bUhQQ1NsaXZlcnMiOiA0LAotICAgICAgICAgICAgInNpdGVVcmwiOiAiaHR0cDovL3d3dy5pbnRlcm5ldDIuZWR1LyIKLSAgICAgICAgfSwKLSAgICAgICAgIkkyIExvcyBBbmdlbGVzIjogewotICAgICAgICAgICAgImxhdCI6IDMzLjI1MDUsCi0gICAgICAgICAgICAibG9uZyI6IC0xMTcuNTAyOTk5OTk5OTk5OTksCi0gICAgICAgICAgICAiaGVhbHRoIjogMCwKLSAgICAgICAgICAgICJudW1Ob2RlcyI6IDIwLAotICAgICAgICAgICAgIm51bUhQQ1NsaXZlcnMiOiAxMCwKLSAgICAgICAgICAgICJzaXRlVXJsIjogImh0dHA6Ly93d3cuaW50ZXJuZXQyLmVkdS8iCi0gICAgICAgIH0sCi0gICAgICAgICJJMiBLYW5zYXMgQ2l0eSI6IHsKLSAgICAgICAgICAgICJsYXQiOiAzOS4wMDEyLAotICAgICAgICAgICAgImxvbmciOiAtOTQuMDA2MzAwMDAwMDAwMDEsCi0gICAgICAgICAgICAiaGVhbHRoIjogMCwKLSAgICAgICAgICAgICJudW1Ob2RlcyI6IDE3LAotICAgICAgICAgICAgIm51bUhQQ1NsaXZlcnMiOiA4LAotICAgICAgICAgICAgInNpdGVVcmwiOiAiaHR0cDovL3d3dy5pbnRlcm5ldDIuZWR1LyIKLSAgICAgICAgfSwKLSAgICAgICAgIkkyIEhvdXN0b24iOiB7Ci0gICAgICAgICAgICAibGF0IjogMjkuMDA3NywKLSAgICAgICAgICAgICJsb25nIjogLTk1LjAwMzY5OTk5OTk5OTk4LAotICAgICAgICAgICAgImhlYWx0aCI6IDAsCi0gICAgICAgICAgICAibnVtTm9kZXMiOiAxNSwKLSAgICAgICAgICAgICJudW1IUENTbGl2ZXJzIjogMTAsCi0gICAgICAgICAgICAic2l0ZVVybCI6ICJodHRwOi8vd3d3LmludGVybmV0Mi5lZHUvIgotICAgICAgICB9LAotICAgICAgICAiSTIgQ2hpY2FnbyI6IHsKLSAgICAgICAgICAgICJsYXQiOiA0MS4wMDg1LAotICAgICAgICAgICAgImxvbmciOiAtODcuMDA2NTAwMDAwMDAwMDIsCi0gICAgICAgICAgICAiaGVhbHRoIjogMCwKLSAgICAgICAgICAgICJudW1Ob2RlcyI6IDE1LAotICAgICAgICAgICAgIm51bUhQQ1NsaXZlcnMiOiAxMCwKLSAgICAgICAgICAgICJzaXRlVXJsIjogImh0dHA6Ly93d3cuaW50ZXJuZXQyLmVkdS8iCi0gICAgICAgIH0sCi0gICAgICAgICJJMiBBdGxhbnRhIjogewotICAgICAgICAgICAgImxhdCI6IDMzLjAwNzUsCi0gICAgICAgICAgICAibG9uZyI6IC04NC4wMDM4MDAwMDAwMDAwMSwKLSAgICAgICAgICAgICJoZWFsdGgiOiAwLAotICAgICAgICAgICAgIm51bU5vZGVzIjogMTUsCi0gICAgICAgICAgICAibnVtSFBDU2xpdmVycyI6IDEwLAotICAgICAgICAgICAgInNpdGVVcmwiOiAiaHR0cDovL3d3dy5pbnRlcm5ldDIuZWR1LyIKLSAgICAgICAgfSwKLSAgICAgICAgIk1heFBsYW5jayI6IHsKLSAgICAgICAgICAgICJsYXQiOiA0OS4xNCwKLSAgICAgICAgICAgICJsb25nIjogNi41ODg5OTk5OTk5OTk5NDIsCi0gICAgICAgICAgICAiaGVhbHRoIjogMCwKLSAgICAgICAgICAgICJudW1Ob2RlcyI6IDE1LAotICAgICAgICAgICAgIm51bUhQQ1NsaXZlcnMiOiAxMCwKLSAgICAgICAgICAgICJzaXRlVXJsIjogImh0dHA6Ly93d3cubXBpLXN3cy5tcGcuZGUvIgotICAgICAgICB9LAotICAgICAgICAiR2VvcmdpYVRlY2giOiB7Ci0gICAgICAgICAgICAibGF0IjogMzMuNzc3MiwKLSAgICAgICAgICAgICJsb25nIjogLTg0LjM5NzYwMDAwMDAwMDAxLAotICAgICAgICAgICAgImhlYWx0aCI6IDAsCi0gICAgICAgICAgICAibnVtTm9kZXMiOiAxNSwKLSAgICAgICAgICAgICJudW1IUENTbGl2ZXJzIjogMTAsCi0gICAgICAgICAgICAic2l0ZVVybCI6ICJodHRwOi8vd3d3LmdhdGVjaC5lZHUvIgotICAgICAgICB9LAotICAgICAgICAiUHJpbmNldG9uIjogewotICAgICAgICAgICAgImxhdCI6IDQwLjM1MDIsCi0gICAgICAgICAgICAibG9uZyI6IC03NC42NTI0LAotICAgICAgICAgICAgImhlYWx0aCI6IDAsCi0gICAgICAgICAgICAibnVtTm9kZXMiOiAxNSwKLSAgICAgICAgICAgICJudW1IUENTbGl2ZXJzIjogMTAsCi0gICAgICAgICAgICAic2l0ZVVybCI6ICJodHRwOi8vcHJpbmNldG9uLmVkdS8iCi0gICAgICAgIH0sCi0gICAgICAgICJXYXNoaW5ndG9uIjogewotICAgICAgICAgICAgImxhdCI6IDQ3LjY1MzEsCi0gICAgICAgICAgICAibG9uZyI6IC0xMjIuMzEyOTk5OTk5OTk5OTksCi0gICAgICAgICAgICAiaGVhbHRoIjogMCwKLSAgICAgICAgICAgICJudW1Ob2RlcyI6IDE1LAotICAgICAgICAgICAgIm51bUhQQ1NsaXZlcnMiOiAxMCwKLSAgICAgICAgICAgICJzaXRlVXJsIjogImh0dHBzOi8vd3d3Lndhc2hpbmd0b24uZWR1LyIKLSAgICAgICAgfSwKLSAgICAgICAgIlN0YW5mb3JkIjogewotICAgICAgICAgICAgImxhdCI6IDM3LjQyOTQsCi0gICAgICAgICAgICAibG9uZyI6IC0xMjIuMTcyMDAwMDAwMDAwMDMsCi0gICAgICAgICAgICAiaGVhbHRoIjogMCwKLSAgICAgICAgICAgICJudW1Ob2RlcyI6IDE1LAotICAgICAgICAgICAgIm51bUhQQ1NsaXZlcnMiOiAxMCwKLSAgICAgICAgICAgICJzaXRlVXJsIjogImh0dHA6Ly93d3cuc3RhbmZvcmQuZWR1LyIKLSAgICAgICAgfSwKLSAgICB9CisgICAgcmV0dXJuIGhwY193aXphcmQuZ2V0X2hwY193aXphcmQoKS5nZXRfc2l0ZXNfZm9yX3ZpZXcoKQogCi0gICAgaWYgcmFuZG9taXplRGF0YToKLSAgICAgICAgY2RuRGF0YVsiU2lvYmhhbiJdID0geyAibGF0IjogNDMuMzQyMDMsICJsb25nIjogLTcwLjU2MzUxLCAiaGVhbHRoIjogMTAsICJudW1Ob2RlcyI6IDUsICJudW1IUENTbGl2ZXJzIjogMywgInNpdGVVcmwiOiAiaHR0cHM6ZGV2b25yZXhlcyJ9Ci0gICAgICAgIGRlbCBjZG5EYXRhWyJQcmluY2V0b24iXQotICAgICAgICBjZG5EYXRhWyJJMiBTZWF0dGxlIl1bJ3NpdGVVcmwnXSA9IGRhdGV0aW1lLmRhdGV0aW1lLm5vdygpLnN0cmZ0aW1lKCIlWS0lbS0lZCAlSDolTTolUyIpCi0gICAgICAgIGNkbkRhdGFbIkkyIFNhbHQgTGFrZSBDaXR5Il1bIm51bUhQQ1NsaXZlcnMiXSA9IDM0CitkZWYgZ2V0UGFnZVN1bW1hcnkocmVxdWVzdCk6CisgICAgc2xpY2UgPSByZXF1ZXN0LkdFVC5nZXQoJ3NsaWNlJywgTm9uZSkKKyAgICBzaXRlID0gcmVxdWVzdC5HRVQuZ2V0KCdzaXRlJywgTm9uZSkKKyAgICBub2RlID0gcmVxdWVzdC5HRVQuZ2V0KCdub2RlJywgTm9uZSkKIAogCi0gICAgcmV0dXJuIGNkbkRhdGEKK2NsYXNzIFNpbXVsYXRvclZpZXcoVmlldyk6CisgICAgZGVmIGdldChzZWxmLCByZXF1ZXN0LCAqKmt3YXJncyk6CisgICAgICAgIHNpbSA9IGpzb24ubG9hZHMoZmlsZSgiL3RtcC9zaW11bGF0b3IuanNvbiIsInIiKS5yZWFkKCkpCisgICAgICAgIHRleHQgPSAiPGh0bWw+PGhlYWQ+PC9oZWFkPjxib2R5PiIKKyAgICAgICAgdGV4dCArPSAiSXRlcmF0aW9uOiAlZDxicj4iICUgc2ltWyJpdGVyYXRpb24iXQorICAgICAgICB0ZXh0ICs9ICJFbGFwc2VkIHNpbmNlIHJlcG9ydCAlZDxicj48YnI+IiAlIHNpbVsiZWxhcHNlZF9zaW5jZV9yZXBvcnQiXQorICAgICAgICB0ZXh0ICs9ICI8dGFibGUgYm9yZGVyPTE+IgorICAgICAgICB0ZXh0ICs9ICI8dHI+PHRoPnNpdGU8L3RoPjx0aD50cmVuZDwvdGg+PHRoPndlaWdodDwvdGg+PHRoPmJ5dGVzX3NlbnQ8L3RoPjx0aD5ob3Q8L3RoPjwvdHI+IgorICAgICAgICBmb3Igc2l0ZSBpbiBzaW1bInNpdGVfbG9hZCJdLnZhbHVlcygpOgorICAgICAgICAgICAgdGV4dCArPSAiPHRyPiIKKyAgICAgICAgICAgIHRleHQgKz0gIjx0ZD4lczwvdGQ+PHRkPiUwLjJmPC90ZD48dGQ+JTAuMmY8L3RkPjx0ZD4lZDwvdGQ+PHRkPiUwLjJmPC90ZD4iICUgXAorICAgICAgICAgICAgICAgICAgICAgICAgKHNpdGVbIm5hbWUiXSwgc2l0ZVsidHJlbmQiXSwgc2l0ZVsid2VpZ2h0Il0sIHNpdGVbImJ5dGVzX3NlbnQiXSwgc2l0ZVsibG9hZF9mcmFjIl0pCisgICAgICAgICAgICB0ZXh0ICs9ICI8L3RyPiIKKyAgICAgICAgdGV4dCArPSAiPC90YWJsZT4iCisgICAgICAgIHRleHQgKz0gIjwvYm9keT48L2h0bWw+IgorICAgICAgICByZXR1cm4gSHR0cFJlc3BvbnNlKHRleHQpCisKK2NsYXNzIERhc2hib2FyZFVzZXJTaXRlVmlldyhWaWV3KToKKyAgICBkZWYgZ2V0KHNlbGYsIHJlcXVlc3QsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIEh0dHBSZXNwb25zZShqc29uLmR1bXBzKGdldFVzZXJTbGljZUluZm8ocmVxdWVzdC51c2VyLCBUcnVlKSksIG1pbWV0eXBlPSdhcHBsaWNhdGlvbi9qYXZhc2NyaXB0JykKKworY2xhc3MgRGFzaGJvYXJkU3VtbWFyeUFqYXhWaWV3KFZpZXcpOgorICAgIGRlZiBnZXQoc2VsZiwgcmVxdWVzdCwgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gSHR0cFJlc3BvbnNlKGpzb24uZHVtcHMoaHBjX3dpemFyZC5nZXRfaHBjX3dpemFyZCgpLmdldF9zdW1tYXJ5X2Zvcl92aWV3KCkpLCBtaW1ldHlwZT0nYXBwbGljYXRpb24vamF2YXNjcmlwdCcpCisKK2NsYXNzIERhc2hib2FyZEFkZE9yUmVtb3ZlU2xpdmVyVmlldyhWaWV3KToKKyAgICBkZWYgcG9zdChzZWxmLCByZXF1ZXN0LCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBzaXRlTmFtZSA9IHJlcXVlc3QuUE9TVC5nZXQoInNpdGUiLCAiMCIpCisgICAgICAgIGFjdGlvblRvRG8gPSByZXF1ZXN0LlBPU1QuZ2V0KCJhY3Rpb25Ub0RvIiwgIjAiKQorCisgICAgICAgIGlmIChhY3Rpb25Ub0RvID09ICJhZGQiKToKKyAgICAgICAgICAgIGhwY193aXphcmQuZ2V0X2hwY193aXphcmQoKS5pbmNyZWFzZV9zbGl2ZXJzKHNpdGVOYW1lLCAxKQorICAgICAgICBlbGlmIChhY3Rpb25Ub0RvID09ICJyZW0iKToKKyAgICAgICAgICAgIGhwY193aXphcmQuZ2V0X2hwY193aXphcmQoKS5kZWNyZWFzZV9zbGl2ZXJzKHNpdGVOYW1lLCAxKQorCisgICAgICAgIHByaW50ICcqJyAqIDUwCisgICAgICAgIHByaW50ICdBc2sgZm9yIHNpdGU6ICcgKyBzaXRlTmFtZSArICcgdG8gJyArIGFjdGlvblRvRG8gKyAnIGFub3RoZXIgSFBDIFNsaXZlcicKKyAgICAgICAgcmV0dXJuIEh0dHBSZXNwb25zZSgnVGhpcyBpcyBQT1NUIHJlcXVlc3QgJykKIAogY2xhc3MgRGFzaGJvYXJkQWpheFZpZXcoVmlldyk6CiAgICAgZGVmIGdldChzZWxmLCByZXF1ZXN0LCAqKmt3YXJncyk6CiAgICAgICAgIHJldHVybiBIdHRwUmVzcG9uc2UoanNvbi5kdW1wcyhnZXRDRE5PcGVyYXRvckRhdGEoVHJ1ZSkpLCBtaW1ldHlwZT0nYXBwbGljYXRpb24vamF2YXNjcmlwdCcpCi0gICAgICAgIAorCitjbGFzcyBEYXNoYm9hcmRBbmFseXRpY3NBamF4VmlldyhWaWV3KToKKyAgICBkZWYgZ2V0KHNlbGYsIHJlcXVlc3QsIG5hbWU9ImhlbGxvX3dvcmxkIiwgKiprd2FyZ3MpOgorICAgICAgICBpZiAobmFtZSA9PSAiaHBjU3VtbWFyeSIpOgorICAgICAgICAgICAgcmV0dXJuIEh0dHBSZXNwb25zZShqc29uLmR1bXBzKGhwY193aXphcmQuZ2V0X2hwY193aXphcmQoKS5nZXRfc3VtbWFyeV9mb3JfdmlldygpKSwgbWltZXR5cGU9J2FwcGxpY2F0aW9uL2phdmFzY3JpcHQnKQorICAgICAgICBlbGlmIChuYW1lID09ICJocGNVc2VyU2l0ZSIpOgorICAgICAgICAgICAgcmV0dXJuIEh0dHBSZXNwb25zZShqc29uLmR1bXBzKGdldFVzZXJTbGljZUluZm8ocmVxdWVzdC51c2VyLCBUcnVlKSksIG1pbWV0eXBlPSdhcHBsaWNhdGlvbi9qYXZhc2NyaXB0JykKKyAgICAgICAgZWxpZiAobmFtZSA9PSAiaHBjTWFwIik6CisgICAgICAgICAgICByZXR1cm4gSHR0cFJlc3BvbnNlKGpzb24uZHVtcHMoZ2V0Q0ROT3BlcmF0b3JEYXRhKFRydWUpKSwgbWltZXR5cGU9J2FwcGxpY2F0aW9uL2phdmFzY3JpcHQnKQorICAgICAgICBlbGlmIChuYW1lID09ICJiaWdxdWVyeSIpOgorICAgICAgICAgICAgKG1pbWV0eXBlLCBkYXRhKSA9IERvUGxhbmV0U3RhY2tBbmFseXRpY3MocmVxdWVzdCkKKyAgICAgICAgICAgIHJldHVybiBIdHRwUmVzcG9uc2UoZGF0YSwgbWltZXR5cGU9bWltZXR5cGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gSHR0cFJlc3BvbnNlKGpzb24uZHVtcHMoIlVua25vd24iKSwgbWltZXR5cGU9J2FwcGxpY2F0aW9uL2phdmFzY3JpcHQnKQorCmRpZmYgLS1naXQgYS9wbGFuZXRzdGFjay9jb3JlL3N0YXRpYy9ocGNfaGlzdG9yaWNhbC5jc3MgYi9wbGFuZXRzdGFjay9jb3JlL3N0YXRpYy9ocGNfaGlzdG9yaWNhbC5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEyZTk4NgotLS0gL2Rldi9udWxsCisrKyBiL3BsYW5ldHN0YWNrL2NvcmUvc3RhdGljL2hwY19oaXN0b3JpY2FsLmNzcwpAQCAtMCwwICsxLDgxMiBAQAorLnJvdyB7CisgIG1hcmdpbi1yaWdodDogLTE1cHg7CisgIG1hcmdpbi1sZWZ0OiAtMTVweDsKK30KKworLnJvdzpiZWZvcmUsCisucm93OmFmdGVyIHsKKyAgZGlzcGxheTogdGFibGU7CisgIGNvbnRlbnQ6ICIgIjsKK30KKworLnJvdzphZnRlciB7CisgIGNsZWFyOiBib3RoOworfQorCisucm93OmJlZm9yZSwKKy5yb3c6YWZ0ZXIgeworICBkaXNwbGF5OiB0YWJsZTsKKyAgY29udGVudDogIiAiOworfQorCisucm93OmFmdGVyIHsKKyAgY2xlYXI6IGJvdGg7Cit9CisKKy5jb2wteHMtMSwKKy5jb2wtc20tMSwKKy5jb2wtbWQtMSwKKy5jb2wtbGctMSwKKy5jb2wteHMtMiwKKy5jb2wtc20tMiwKKy5jb2wtbWQtMiwKKy5jb2wtbGctMiwKKy5jb2wteHMtMywKKy5jb2wtc20tMywKKy5jb2wtbWQtMywKKy5jb2wtbGctMywKKy5jb2wteHMtNCwKKy5jb2wtc20tNCwKKy5jb2wtbWQtNCwKKy5jb2wtbGctNCwKKy5jb2wteHMtNSwKKy5jb2wtc20tNSwKKy5jb2wtbWQtNSwKKy5jb2wtbGctNSwKKy5jb2wteHMtNiwKKy5jb2wtc20tNiwKKy5jb2wtbWQtNiwKKy5jb2wtbGctNiwKKy5jb2wteHMtNywKKy5jb2wtc20tNywKKy5jb2wtbWQtNywKKy5jb2wtbGctNywKKy5jb2wteHMtOCwKKy5jb2wtc20tOCwKKy5jb2wtbWQtOCwKKy5jb2wtbGctOCwKKy5jb2wteHMtOSwKKy5jb2wtc20tOSwKKy5jb2wtbWQtOSwKKy5jb2wtbGctOSwKKy5jb2wteHMtMTAsCisuY29sLXNtLTEwLAorLmNvbC1tZC0xMCwKKy5jb2wtbGctMTAsCisuY29sLXhzLTExLAorLmNvbC1zbS0xMSwKKy5jb2wtbWQtMTEsCisuY29sLWxnLTExLAorLmNvbC14cy0xMiwKKy5jb2wtc20tMTIsCisuY29sLW1kLTEyLAorLmNvbC1sZy0xMiB7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgbWluLWhlaWdodDogMXB4OworICBwYWRkaW5nLXJpZ2h0OiAxNXB4OworICBwYWRkaW5nLWxlZnQ6IDE1cHg7Cit9CisKKy5jb2wteHMtMSwKKy5jb2wteHMtMiwKKy5jb2wteHMtMywKKy5jb2wteHMtNCwKKy5jb2wteHMtNSwKKy5jb2wteHMtNiwKKy5jb2wteHMtNywKKy5jb2wteHMtOCwKKy5jb2wteHMtOSwKKy5jb2wteHMtMTAsCisuY29sLXhzLTExIHsKKyAgZmxvYXQ6IGxlZnQ7Cit9CisKKy5jb2wteHMtMTIgeworICB3aWR0aDogMTAwJTsKK30KKworLmNvbC14cy0xMSB7CisgIHdpZHRoOiA5MS42NjY2NjY2NjY2NjY2NiU7Cit9CisKKy5jb2wteHMtMTAgeworICB3aWR0aDogODMuMzMzMzMzMzMzMzMzMzQlOworfQorCisuY29sLXhzLTkgeworICB3aWR0aDogNzUlOworfQorCisuY29sLXhzLTggeworICB3aWR0aDogNjYuNjY2NjY2NjY2NjY2NjYlOworfQorCisuY29sLXhzLTcgeworICB3aWR0aDogNTguMzMzMzMzMzMzMzMzMzM2JTsKK30KKworLmNvbC14cy02IHsKKyAgd2lkdGg6IDUwJTsKK30KKworLmNvbC14cy01IHsKKyAgd2lkdGg6IDQxLjY2NjY2NjY2NjY2NjY3JTsKK30KKworLmNvbC14cy00IHsKKyAgd2lkdGg6IDMzLjMzMzMzMzMzMzMzMzMzJTsKK30KKworLmNvbC14cy0zIHsKKyAgd2lkdGg6IDI1JTsKK30KKworLmNvbC14cy0yIHsKKyAgd2lkdGg6IDE2LjY2NjY2NjY2NjY2NjY2NCU7Cit9CisKKy5jb2wteHMtMSB7CisgIHdpZHRoOiA4LjMzMzMzMzMzMzMzMzMzMiU7Cit9CisKKy5jb2wteHMtcHVsbC0xMiB7CisgIHJpZ2h0OiAxMDAlOworfQorCisuY29sLXhzLXB1bGwtMTEgeworICByaWdodDogOTEuNjY2NjY2NjY2NjY2NjYlOworfQorCisuY29sLXhzLXB1bGwtMTAgeworICByaWdodDogODMuMzMzMzMzMzMzMzMzMzQlOworfQorCisuY29sLXhzLXB1bGwtOSB7CisgIHJpZ2h0OiA3NSU7Cit9CisKKy5jb2wteHMtcHVsbC04IHsKKyAgcmlnaHQ6IDY2LjY2NjY2NjY2NjY2NjY2JTsKK30KKworLmNvbC14cy1wdWxsLTcgeworICByaWdodDogNTguMzMzMzMzMzMzMzMzMzM2JTsKK30KKworLmNvbC14cy1wdWxsLTYgeworICByaWdodDogNTAlOworfQorCisuY29sLXhzLXB1bGwtNSB7CisgIHJpZ2h0OiA0MS42NjY2NjY2NjY2NjY2NyU7Cit9CisKKy5jb2wteHMtcHVsbC00IHsKKyAgcmlnaHQ6IDMzLjMzMzMzMzMzMzMzMzMzJTsKK30KKworLmNvbC14cy1wdWxsLTMgeworICByaWdodDogMjUlOworfQorCisuY29sLXhzLXB1bGwtMiB7CisgIHJpZ2h0OiAxNi42NjY2NjY2NjY2NjY2NjQlOworfQorCisuY29sLXhzLXB1bGwtMSB7CisgIHJpZ2h0OiA4LjMzMzMzMzMzMzMzMzMzMiU7Cit9CisKKy5jb2wteHMtcHVsbC0wIHsKKyAgcmlnaHQ6IDA7Cit9CisKKy5jb2wteHMtcHVzaC0xMiB7CisgIGxlZnQ6IDEwMCU7Cit9CisKKy5jb2wteHMtcHVzaC0xMSB7CisgIGxlZnQ6IDkxLjY2NjY2NjY2NjY2NjY2JTsKK30KKworLmNvbC14cy1wdXNoLTEwIHsKKyAgbGVmdDogODMuMzMzMzMzMzMzMzMzMzQlOworfQorCisuY29sLXhzLXB1c2gtOSB7CisgIGxlZnQ6IDc1JTsKK30KKworLmNvbC14cy1wdXNoLTggeworICBsZWZ0OiA2Ni42NjY2NjY2NjY2NjY2NiU7Cit9CisKKy5jb2wteHMtcHVzaC03IHsKKyAgbGVmdDogNTguMzMzMzMzMzMzMzMzMzM2JTsKK30KKworLmNvbC14cy1wdXNoLTYgeworICBsZWZ0OiA1MCU7Cit9CisKKy5jb2wteHMtcHVzaC01IHsKKyAgbGVmdDogNDEuNjY2NjY2NjY2NjY2NjclOworfQorCisuY29sLXhzLXB1c2gtNCB7CisgIGxlZnQ6IDMzLjMzMzMzMzMzMzMzMzMzJTsKK30KKworLmNvbC14cy1wdXNoLTMgeworICBsZWZ0OiAyNSU7Cit9CisKKy5jb2wteHMtcHVzaC0yIHsKKyAgbGVmdDogMTYuNjY2NjY2NjY2NjY2NjY0JTsKK30KKworLmNvbC14cy1wdXNoLTEgeworICBsZWZ0OiA4LjMzMzMzMzMzMzMzMzMzMiU7Cit9CisKKy5jb2wteHMtcHVzaC0wIHsKKyAgbGVmdDogMDsKK30KKworLmNvbC14cy1vZmZzZXQtMTIgeworICBtYXJnaW4tbGVmdDogMTAwJTsKK30KKworLmNvbC14cy1vZmZzZXQtMTEgeworICBtYXJnaW4tbGVmdDogOTEuNjY2NjY2NjY2NjY2NjYlOworfQorCisuY29sLXhzLW9mZnNldC0xMCB7CisgIG1hcmdpbi1sZWZ0OiA4My4zMzMzMzMzMzMzMzMzNCU7Cit9CisKKy5jb2wteHMtb2Zmc2V0LTkgeworICBtYXJnaW4tbGVmdDogNzUlOworfQorCisuY29sLXhzLW9mZnNldC04IHsKKyAgbWFyZ2luLWxlZnQ6IDY2LjY2NjY2NjY2NjY2NjY2JTsKK30KKworLmNvbC14cy1vZmZzZXQtNyB7CisgIG1hcmdpbi1sZWZ0OiA1OC4zMzMzMzMzMzMzMzMzMzYlOworfQorCisuY29sLXhzLW9mZnNldC02IHsKKyAgbWFyZ2luLWxlZnQ6IDUwJTsKK30KKworLmNvbC14cy1vZmZzZXQtNSB7CisgIG1hcmdpbi1sZWZ0OiA0MS42NjY2NjY2NjY2NjY2NyU7Cit9CisKKy5jb2wteHMtb2Zmc2V0LTQgeworICBtYXJnaW4tbGVmdDogMzMuMzMzMzMzMzMzMzMzMzMlOworfQorCisuY29sLXhzLW9mZnNldC0zIHsKKyAgbWFyZ2luLWxlZnQ6IDI1JTsKK30KKworLmNvbC14cy1vZmZzZXQtMiB7CisgIG1hcmdpbi1sZWZ0OiAxNi42NjY2NjY2NjY2NjY2NjQlOworfQorCisuY29sLXhzLW9mZnNldC0xIHsKKyAgbWFyZ2luLWxlZnQ6IDguMzMzMzMzMzMzMzMzMzMyJTsKK30KKworLmNvbC14cy1vZmZzZXQtMCB7CisgIG1hcmdpbi1sZWZ0OiAwOworfQorCitAbWVkaWEgKG1pbi13aWR0aDogNzY4cHgpIHsKKyAgLmNvbnRhaW5lciB7CisgICAgd2lkdGg6IDc1MHB4OworICB9CisgIC5jb2wtc20tMSwKKyAgLmNvbC1zbS0yLAorICAuY29sLXNtLTMsCisgIC5jb2wtc20tNCwKKyAgLmNvbC1zbS01LAorICAuY29sLXNtLTYsCisgIC5jb2wtc20tNywKKyAgLmNvbC1zbS04LAorICAuY29sLXNtLTksCisgIC5jb2wtc20tMTAsCisgIC5jb2wtc20tMTEgeworICAgIGZsb2F0OiBsZWZ0OworICB9CisgIC5jb2wtc20tMTIgeworICAgIHdpZHRoOiAxMDAlOworICB9CisgIC5jb2wtc20tMTEgeworICAgIHdpZHRoOiA5MS42NjY2NjY2NjY2NjY2NiU7CisgIH0KKyAgLmNvbC1zbS0xMCB7CisgICAgd2lkdGg6IDgzLjMzMzMzMzMzMzMzMzM0JTsKKyAgfQorICAuY29sLXNtLTkgeworICAgIHdpZHRoOiA3NSU7CisgIH0KKyAgLmNvbC1zbS04IHsKKyAgICB3aWR0aDogNjYuNjY2NjY2NjY2NjY2NjYlOworICB9CisgIC5jb2wtc20tNyB7CisgICAgd2lkdGg6IDU4LjMzMzMzMzMzMzMzMzMzNiU7CisgIH0KKyAgLmNvbC1zbS02IHsKKyAgICB3aWR0aDogNTAlOworICB9CisgIC5jb2wtc20tNSB7CisgICAgd2lkdGg6IDQxLjY2NjY2NjY2NjY2NjY3JTsKKyAgfQorICAuY29sLXNtLTQgeworICAgIHdpZHRoOiAzMy4zMzMzMzMzMzMzMzMzMyU7CisgIH0KKyAgLmNvbC1zbS0zIHsKKyAgICB3aWR0aDogMjUlOworICB9CisgIC5jb2wtc20tMiB7CisgICAgd2lkdGg6IDE2LjY2NjY2NjY2NjY2NjY2NCU7CisgIH0KKyAgLmNvbC1zbS0xIHsKKyAgICB3aWR0aDogOC4zMzMzMzMzMzMzMzMzMzIlOworICB9CisgIC5jb2wtc20tcHVsbC0xMiB7CisgICAgcmlnaHQ6IDEwMCU7CisgIH0KKyAgLmNvbC1zbS1wdWxsLTExIHsKKyAgICByaWdodDogOTEuNjY2NjY2NjY2NjY2NjYlOworICB9CisgIC5jb2wtc20tcHVsbC0xMCB7CisgICAgcmlnaHQ6IDgzLjMzMzMzMzMzMzMzMzM0JTsKKyAgfQorICAuY29sLXNtLXB1bGwtOSB7CisgICAgcmlnaHQ6IDc1JTsKKyAgfQorICAuY29sLXNtLXB1bGwtOCB7CisgICAgcmlnaHQ6IDY2LjY2NjY2NjY2NjY2NjY2JTsKKyAgfQorICAuY29sLXNtLXB1bGwtNyB7CisgICAgcmlnaHQ6IDU4LjMzMzMzMzMzMzMzMzMzNiU7CisgIH0KKyAgLmNvbC1zbS1wdWxsLTYgeworICAgIHJpZ2h0OiA1MCU7CisgIH0KKyAgLmNvbC1zbS1wdWxsLTUgeworICAgIHJpZ2h0OiA0MS42NjY2NjY2NjY2NjY2NyU7CisgIH0KKyAgLmNvbC1zbS1wdWxsLTQgeworICAgIHJpZ2h0OiAzMy4zMzMzMzMzMzMzMzMzMyU7CisgIH0KKyAgLmNvbC1zbS1wdWxsLTMgeworICAgIHJpZ2h0OiAyNSU7CisgIH0KKyAgLmNvbC1zbS1wdWxsLTIgeworICAgIHJpZ2h0OiAxNi42NjY2NjY2NjY2NjY2NjQlOworICB9CisgIC5jb2wtc20tcHVsbC0xIHsKKyAgICByaWdodDogOC4zMzMzMzMzMzMzMzMzMzIlOworICB9CisgIC5jb2wtc20tcHVsbC0wIHsKKyAgICByaWdodDogMDsKKyAgfQorICAuY29sLXNtLXB1c2gtMTIgeworICAgIGxlZnQ6IDEwMCU7CisgIH0KKyAgLmNvbC1zbS1wdXNoLTExIHsKKyAgICBsZWZ0OiA5MS42NjY2NjY2NjY2NjY2NiU7CisgIH0KKyAgLmNvbC1zbS1wdXNoLTEwIHsKKyAgICBsZWZ0OiA4My4zMzMzMzMzMzMzMzMzNCU7CisgIH0KKyAgLmNvbC1zbS1wdXNoLTkgeworICAgIGxlZnQ6IDc1JTsKKyAgfQorICAuY29sLXNtLXB1c2gtOCB7CisgICAgbGVmdDogNjYuNjY2NjY2NjY2NjY2NjYlOworICB9CisgIC5jb2wtc20tcHVzaC03IHsKKyAgICBsZWZ0OiA1OC4zMzMzMzMzMzMzMzMzMzYlOworICB9CisgIC5jb2wtc20tcHVzaC02IHsKKyAgICBsZWZ0OiA1MCU7CisgIH0KKyAgLmNvbC1zbS1wdXNoLTUgeworICAgIGxlZnQ6IDQxLjY2NjY2NjY2NjY2NjY3JTsKKyAgfQorICAuY29sLXNtLXB1c2gtNCB7CisgICAgbGVmdDogMzMuMzMzMzMzMzMzMzMzMzMlOworICB9CisgIC5jb2wtc20tcHVzaC0zIHsKKyAgICBsZWZ0OiAyNSU7CisgIH0KKyAgLmNvbC1zbS1wdXNoLTIgeworICAgIGxlZnQ6IDE2LjY2NjY2NjY2NjY2NjY2NCU7CisgIH0KKyAgLmNvbC1zbS1wdXNoLTEgeworICAgIGxlZnQ6IDguMzMzMzMzMzMzMzMzMzMyJTsKKyAgfQorICAuY29sLXNtLXB1c2gtMCB7CisgICAgbGVmdDogMDsKKyAgfQorICAuY29sLXNtLW9mZnNldC0xMiB7CisgICAgbWFyZ2luLWxlZnQ6IDEwMCU7CisgIH0KKyAgLmNvbC1zbS1vZmZzZXQtMTEgeworICAgIG1hcmdpbi1sZWZ0OiA5MS42NjY2NjY2NjY2NjY2NiU7CisgIH0KKyAgLmNvbC1zbS1vZmZzZXQtMTAgeworICAgIG1hcmdpbi1sZWZ0OiA4My4zMzMzMzMzMzMzMzMzNCU7CisgIH0KKyAgLmNvbC1zbS1vZmZzZXQtOSB7CisgICAgbWFyZ2luLWxlZnQ6IDc1JTsKKyAgfQorICAuY29sLXNtLW9mZnNldC04IHsKKyAgICBtYXJnaW4tbGVmdDogNjYuNjY2NjY2NjY2NjY2NjYlOworICB9CisgIC5jb2wtc20tb2Zmc2V0LTcgeworICAgIG1hcmdpbi1sZWZ0OiA1OC4zMzMzMzMzMzMzMzMzMzYlOworICB9CisgIC5jb2wtc20tb2Zmc2V0LTYgeworICAgIG1hcmdpbi1sZWZ0OiA1MCU7CisgIH0KKyAgLmNvbC1zbS1vZmZzZXQtNSB7CisgICAgbWFyZ2luLWxlZnQ6IDQxLjY2NjY2NjY2NjY2NjY3JTsKKyAgfQorICAuY29sLXNtLW9mZnNldC00IHsKKyAgICBtYXJnaW4tbGVmdDogMzMuMzMzMzMzMzMzMzMzMzMlOworICB9CisgIC5jb2wtc20tb2Zmc2V0LTMgeworICAgIG1hcmdpbi1sZWZ0OiAyNSU7CisgIH0KKyAgLmNvbC1zbS1vZmZzZXQtMiB7CisgICAgbWFyZ2luLWxlZnQ6IDE2LjY2NjY2NjY2NjY2NjY2NCU7CisgIH0KKyAgLmNvbC1zbS1vZmZzZXQtMSB7CisgICAgbWFyZ2luLWxlZnQ6IDguMzMzMzMzMzMzMzMzMzMyJTsKKyAgfQorICAuY29sLXNtLW9mZnNldC0wIHsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgfQorfQorCitAbWVkaWEgKG1pbi13aWR0aDogOTkycHgpIHsKKyAgLmNvbnRhaW5lciB7CisgICAgd2lkdGg6IDk3MHB4OworICB9CisgIC5jb2wtbWQtMSwKKyAgLmNvbC1tZC0yLAorICAuY29sLW1kLTMsCisgIC5jb2wtbWQtNCwKKyAgLmNvbC1tZC01LAorICAuY29sLW1kLTYsCisgIC5jb2wtbWQtNywKKyAgLmNvbC1tZC04LAorICAuY29sLW1kLTksCisgIC5jb2wtbWQtMTAsCisgIC5jb2wtbWQtMTEgeworICAgIGZsb2F0OiBsZWZ0OworICB9CisgIC5jb2wtbWQtMTIgeworICAgIHdpZHRoOiAxMDAlOworICB9CisgIC5jb2wtbWQtMTEgeworICAgIHdpZHRoOiA5MS42NjY2NjY2NjY2NjY2NiU7CisgIH0KKyAgLmNvbC1tZC0xMCB7CisgICAgd2lkdGg6IDgzLjMzMzMzMzMzMzMzMzM0JTsKKyAgfQorICAuY29sLW1kLTkgeworICAgIHdpZHRoOiA3NSU7CisgIH0KKyAgLmNvbC1tZC04IHsKKyAgICB3aWR0aDogNjYuNjY2NjY2NjY2NjY2NjYlOworICB9CisgIC5jb2wtbWQtNyB7CisgICAgd2lkdGg6IDU4LjMzMzMzMzMzMzMzMzMzNiU7CisgIH0KKyAgLmNvbC1tZC02IHsKKyAgICB3aWR0aDogNTAlOworICB9CisgIC5jb2wtbWQtNSB7CisgICAgd2lkdGg6IDQxLjY2NjY2NjY2NjY2NjY3JTsKKyAgfQorICAuY29sLW1kLTQgeworICAgIHdpZHRoOiAzMy4zMzMzMzMzMzMzMzMzMyU7CisgIH0KKyAgLmNvbC1tZC0zIHsKKyAgICB3aWR0aDogMjUlOworICB9CisgIC5jb2wtbWQtMiB7CisgICAgd2lkdGg6IDE2LjY2NjY2NjY2NjY2NjY2NCU7CisgIH0KKyAgLmNvbC1tZC0xIHsKKyAgICB3aWR0aDogOC4zMzMzMzMzMzMzMzMzMzIlOworICB9CisgIC5jb2wtbWQtcHVsbC0xMiB7CisgICAgcmlnaHQ6IDEwMCU7CisgIH0KKyAgLmNvbC1tZC1wdWxsLTExIHsKKyAgICByaWdodDogOTEuNjY2NjY2NjY2NjY2NjYlOworICB9CisgIC5jb2wtbWQtcHVsbC0xMCB7CisgICAgcmlnaHQ6IDgzLjMzMzMzMzMzMzMzMzM0JTsKKyAgfQorICAuY29sLW1kLXB1bGwtOSB7CisgICAgcmlnaHQ6IDc1JTsKKyAgfQorICAuY29sLW1kLXB1bGwtOCB7CisgICAgcmlnaHQ6IDY2LjY2NjY2NjY2NjY2NjY2JTsKKyAgfQorICAuY29sLW1kLXB1bGwtNyB7CisgICAgcmlnaHQ6IDU4LjMzMzMzMzMzMzMzMzMzNiU7CisgIH0KKyAgLmNvbC1tZC1wdWxsLTYgeworICAgIHJpZ2h0OiA1MCU7CisgIH0KKyAgLmNvbC1tZC1wdWxsLTUgeworICAgIHJpZ2h0OiA0MS42NjY2NjY2NjY2NjY2NyU7CisgIH0KKyAgLmNvbC1tZC1wdWxsLTQgeworICAgIHJpZ2h0OiAzMy4zMzMzMzMzMzMzMzMzMyU7CisgIH0KKyAgLmNvbC1tZC1wdWxsLTMgeworICAgIHJpZ2h0OiAyNSU7CisgIH0KKyAgLmNvbC1tZC1wdWxsLTIgeworICAgIHJpZ2h0OiAxNi42NjY2NjY2NjY2NjY2NjQlOworICB9CisgIC5jb2wtbWQtcHVsbC0xIHsKKyAgICByaWdodDogOC4zMzMzMzMzMzMzMzMzMzIlOworICB9CisgIC5jb2wtbWQtcHVsbC0wIHsKKyAgICByaWdodDogMDsKKyAgfQorICAuY29sLW1kLXB1c2gtMTIgeworICAgIGxlZnQ6IDEwMCU7CisgIH0KKyAgLmNvbC1tZC1wdXNoLTExIHsKKyAgICBsZWZ0OiA5MS42NjY2NjY2NjY2NjY2NiU7CisgIH0KKyAgLmNvbC1tZC1wdXNoLTEwIHsKKyAgICBsZWZ0OiA4My4zMzMzMzMzMzMzMzMzNCU7CisgIH0KKyAgLmNvbC1tZC1wdXNoLTkgeworICAgIGxlZnQ6IDc1JTsKKyAgfQorICAuY29sLW1kLXB1c2gtOCB7CisgICAgbGVmdDogNjYuNjY2NjY2NjY2NjY2NjYlOworICB9CisgIC5jb2wtbWQtcHVzaC03IHsKKyAgICBsZWZ0OiA1OC4zMzMzMzMzMzMzMzMzMzYlOworICB9CisgIC5jb2wtbWQtcHVzaC02IHsKKyAgICBsZWZ0OiA1MCU7CisgIH0KKyAgLmNvbC1tZC1wdXNoLTUgeworICAgIGxlZnQ6IDQxLjY2NjY2NjY2NjY2NjY3JTsKKyAgfQorICAuY29sLW1kLXB1c2gtNCB7CisgICAgbGVmdDogMzMuMzMzMzMzMzMzMzMzMzMlOworICB9CisgIC5jb2wtbWQtcHVzaC0zIHsKKyAgICBsZWZ0OiAyNSU7CisgIH0KKyAgLmNvbC1tZC1wdXNoLTIgeworICAgIGxlZnQ6IDE2LjY2NjY2NjY2NjY2NjY2NCU7CisgIH0KKyAgLmNvbC1tZC1wdXNoLTEgeworICAgIGxlZnQ6IDguMzMzMzMzMzMzMzMzMzMyJTsKKyAgfQorICAuY29sLW1kLXB1c2gtMCB7CisgICAgbGVmdDogMDsKKyAgfQorICAuY29sLW1kLW9mZnNldC0xMiB7CisgICAgbWFyZ2luLWxlZnQ6IDEwMCU7CisgIH0KKyAgLmNvbC1tZC1vZmZzZXQtMTEgeworICAgIG1hcmdpbi1sZWZ0OiA5MS42NjY2NjY2NjY2NjY2NiU7CisgIH0KKyAgLmNvbC1tZC1vZmZzZXQtMTAgeworICAgIG1hcmdpbi1sZWZ0OiA4My4zMzMzMzMzMzMzMzMzNCU7CisgIH0KKyAgLmNvbC1tZC1vZmZzZXQtOSB7CisgICAgbWFyZ2luLWxlZnQ6IDc1JTsKKyAgfQorICAuY29sLW1kLW9mZnNldC04IHsKKyAgICBtYXJnaW4tbGVmdDogNjYuNjY2NjY2NjY2NjY2NjYlOworICB9CisgIC5jb2wtbWQtb2Zmc2V0LTcgeworICAgIG1hcmdpbi1sZWZ0OiA1OC4zMzMzMzMzMzMzMzMzMzYlOworICB9CisgIC5jb2wtbWQtb2Zmc2V0LTYgeworICAgIG1hcmdpbi1sZWZ0OiA1MCU7CisgIH0KKyAgLmNvbC1tZC1vZmZzZXQtNSB7CisgICAgbWFyZ2luLWxlZnQ6IDQxLjY2NjY2NjY2NjY2NjY3JTsKKyAgfQorICAuY29sLW1kLW9mZnNldC00IHsKKyAgICBtYXJnaW4tbGVmdDogMzMuMzMzMzMzMzMzMzMzMzMlOworICB9CisgIC5jb2wtbWQtb2Zmc2V0LTMgeworICAgIG1hcmdpbi1sZWZ0OiAyNSU7CisgIH0KKyAgLmNvbC1tZC1vZmZzZXQtMiB7CisgICAgbWFyZ2luLWxlZnQ6IDE2LjY2NjY2NjY2NjY2NjY2NCU7CisgIH0KKyAgLmNvbC1tZC1vZmZzZXQtMSB7CisgICAgbWFyZ2luLWxlZnQ6IDguMzMzMzMzMzMzMzMzMzMyJTsKKyAgfQorICAuY29sLW1kLW9mZnNldC0wIHsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgfQorfQorCitAbWVkaWEgKG1pbi13aWR0aDogMTIwMHB4KSB7CisgIC5jb250YWluZXIgeworICAgIHdpZHRoOiAxMTcwcHg7CisgIH0KKyAgLmNvbC1sZy0xLAorICAuY29sLWxnLTIsCisgIC5jb2wtbGctMywKKyAgLmNvbC1sZy00LAorICAuY29sLWxnLTUsCisgIC5jb2wtbGctNiwKKyAgLmNvbC1sZy03LAorICAuY29sLWxnLTgsCisgIC5jb2wtbGctOSwKKyAgLmNvbC1sZy0xMCwKKyAgLmNvbC1sZy0xMSB7CisgICAgZmxvYXQ6IGxlZnQ7CisgIH0KKyAgLmNvbC1sZy0xMiB7CisgICAgd2lkdGg6IDEwMCU7CisgIH0KKyAgLmNvbC1sZy0xMSB7CisgICAgd2lkdGg6IDkxLjY2NjY2NjY2NjY2NjY2JTsKKyAgfQorICAuY29sLWxnLTEwIHsKKyAgICB3aWR0aDogODMuMzMzMzMzMzMzMzMzMzQlOworICB9CisgIC5jb2wtbGctOSB7CisgICAgd2lkdGg6IDc1JTsKKyAgfQorICAuY29sLWxnLTggeworICAgIHdpZHRoOiA2Ni42NjY2NjY2NjY2NjY2NiU7CisgIH0KKyAgLmNvbC1sZy03IHsKKyAgICB3aWR0aDogNTguMzMzMzMzMzMzMzMzMzM2JTsKKyAgfQorICAuY29sLWxnLTYgeworICAgIHdpZHRoOiA1MCU7CisgIH0KKyAgLmNvbC1sZy01IHsKKyAgICB3aWR0aDogNDEuNjY2NjY2NjY2NjY2NjclOworICB9CisgIC5jb2wtbGctNCB7CisgICAgd2lkdGg6IDMzLjMzMzMzMzMzMzMzMzMzJTsKKyAgfQorICAuY29sLWxnLTMgeworICAgIHdpZHRoOiAyNSU7CisgIH0KKyAgLmNvbC1sZy0yIHsKKyAgICB3aWR0aDogMTYuNjY2NjY2NjY2NjY2NjY0JTsKKyAgfQorICAuY29sLWxnLTEgeworICAgIHdpZHRoOiA4LjMzMzMzMzMzMzMzMzMzMiU7CisgIH0KKyAgLmNvbC1sZy1wdWxsLTEyIHsKKyAgICByaWdodDogMTAwJTsKKyAgfQorICAuY29sLWxnLXB1bGwtMTEgeworICAgIHJpZ2h0OiA5MS42NjY2NjY2NjY2NjY2NiU7CisgIH0KKyAgLmNvbC1sZy1wdWxsLTEwIHsKKyAgICByaWdodDogODMuMzMzMzMzMzMzMzMzMzQlOworICB9CisgIC5jb2wtbGctcHVsbC05IHsKKyAgICByaWdodDogNzUlOworICB9CisgIC5jb2wtbGctcHVsbC04IHsKKyAgICByaWdodDogNjYuNjY2NjY2NjY2NjY2NjYlOworICB9CisgIC5jb2wtbGctcHVsbC03IHsKKyAgICByaWdodDogNTguMzMzMzMzMzMzMzMzMzM2JTsKKyAgfQorICAuY29sLWxnLXB1bGwtNiB7CisgICAgcmlnaHQ6IDUwJTsKKyAgfQorICAuY29sLWxnLXB1bGwtNSB7CisgICAgcmlnaHQ6IDQxLjY2NjY2NjY2NjY2NjY3JTsKKyAgfQorICAuY29sLWxnLXB1bGwtNCB7CisgICAgcmlnaHQ6IDMzLjMzMzMzMzMzMzMzMzMzJTsKKyAgfQorICAuY29sLWxnLXB1bGwtMyB7CisgICAgcmlnaHQ6IDI1JTsKKyAgfQorICAuY29sLWxnLXB1bGwtMiB7CisgICAgcmlnaHQ6IDE2LjY2NjY2NjY2NjY2NjY2NCU7CisgIH0KKyAgLmNvbC1sZy1wdWxsLTEgeworICAgIHJpZ2h0OiA4LjMzMzMzMzMzMzMzMzMzMiU7CisgIH0KKyAgLmNvbC1sZy1wdWxsLTAgeworICAgIHJpZ2h0OiAwOworICB9CisgIC5jb2wtbGctcHVzaC0xMiB7CisgICAgbGVmdDogMTAwJTsKKyAgfQorICAuY29sLWxnLXB1c2gtMTEgeworICAgIGxlZnQ6IDkxLjY2NjY2NjY2NjY2NjY2JTsKKyAgfQorICAuY29sLWxnLXB1c2gtMTAgeworICAgIGxlZnQ6IDgzLjMzMzMzMzMzMzMzMzM0JTsKKyAgfQorICAuY29sLWxnLXB1c2gtOSB7CisgICAgbGVmdDogNzUlOworICB9CisgIC5jb2wtbGctcHVzaC04IHsKKyAgICBsZWZ0OiA2Ni42NjY2NjY2NjY2NjY2NiU7CisgIH0KKyAgLmNvbC1sZy1wdXNoLTcgeworICAgIGxlZnQ6IDU4LjMzMzMzMzMzMzMzMzMzNiU7CisgIH0KKyAgLmNvbC1sZy1wdXNoLTYgeworICAgIGxlZnQ6IDUwJTsKKyAgfQorICAuY29sLWxnLXB1c2gtNSB7CisgICAgbGVmdDogNDEuNjY2NjY2NjY2NjY2NjclOworICB9CisgIC5jb2wtbGctcHVzaC00IHsKKyAgICBsZWZ0OiAzMy4zMzMzMzMzMzMzMzMzMyU7CisgIH0KKyAgLmNvbC1sZy1wdXNoLTMgeworICAgIGxlZnQ6IDI1JTsKKyAgfQorICAuY29sLWxnLXB1c2gtMiB7CisgICAgbGVmdDogMTYuNjY2NjY2NjY2NjY2NjY0JTsKKyAgfQorICAuY29sLWxnLXB1c2gtMSB7CisgICAgbGVmdDogOC4zMzMzMzMzMzMzMzMzMzIlOworICB9CisgIC5jb2wtbGctcHVzaC0wIHsKKyAgICBsZWZ0OiAwOworICB9CisgIC5jb2wtbGctb2Zmc2V0LTEyIHsKKyAgICBtYXJnaW4tbGVmdDogMTAwJTsKKyAgfQorICAuY29sLWxnLW9mZnNldC0xMSB7CisgICAgbWFyZ2luLWxlZnQ6IDkxLjY2NjY2NjY2NjY2NjY2JTsKKyAgfQorICAuY29sLWxnLW9mZnNldC0xMCB7CisgICAgbWFyZ2luLWxlZnQ6IDgzLjMzMzMzMzMzMzMzMzM0JTsKKyAgfQorICAuY29sLWxnLW9mZnNldC05IHsKKyAgICBtYXJnaW4tbGVmdDogNzUlOworICB9CisgIC5jb2wtbGctb2Zmc2V0LTggeworICAgIG1hcmdpbi1sZWZ0OiA2Ni42NjY2NjY2NjY2NjY2NiU7CisgIH0KKyAgLmNvbC1sZy1vZmZzZXQtNyB7CisgICAgbWFyZ2luLWxlZnQ6IDU4LjMzMzMzMzMzMzMzMzMzNiU7CisgIH0KKyAgLmNvbC1sZy1vZmZzZXQtNiB7CisgICAgbWFyZ2luLWxlZnQ6IDUwJTsKKyAgfQorICAuY29sLWxnLW9mZnNldC01IHsKKyAgICBtYXJnaW4tbGVmdDogNDEuNjY2NjY2NjY2NjY2NjclOworICB9CisgIC5jb2wtbGctb2Zmc2V0LTQgeworICAgIG1hcmdpbi1sZWZ0OiAzMy4zMzMzMzMzMzMzMzMzMyU7CisgIH0KKyAgLmNvbC1sZy1vZmZzZXQtMyB7CisgICAgbWFyZ2luLWxlZnQ6IDI1JTsKKyAgfQorICAuY29sLWxnLW9mZnNldC0yIHsKKyAgICBtYXJnaW4tbGVmdDogMTYuNjY2NjY2NjY2NjY2NjY0JTsKKyAgfQorICAuY29sLWxnLW9mZnNldC0xIHsKKyAgICBtYXJnaW4tbGVmdDogOC4zMzMzMzMzMzMzMzMzMzIlOworICB9CisgIC5jb2wtbGctb2Zmc2V0LTAgeworICAgIG1hcmdpbi1sZWZ0OiAwOworICB9Cit9CmRpZmYgLS1naXQgYS9wbGFuZXRzdGFjay9jb3JlL3N0YXRpYy9wYWdlX2FuYWx5dGljcy5qcyBiL3BsYW5ldHN0YWNrL2NvcmUvc3RhdGljL3BhZ2VfYW5hbHl0aWNzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxN2I0MDMKLS0tIC9kZXYvbnVsbAorKysgYi9wbGFuZXRzdGFjay9jb3JlL3N0YXRpYy9wYWdlX2FuYWx5dGljcy5qcwpAQCAtMCwwICsxLDgzIEBACitmdW5jdGlvbiBnZXRPYmplY3RRdWVyeSgpIHsKKyAgICB2YXIgc2VsZWN0ZWROb2RlVHh0ID0gJCgnLmN1cnJlbnRPcmlnaW5hbE5vZGUnKS50ZXh0KCk7CisgICAgc2VsZWN0ZWROb2RlVHh0ID0gc2VsZWN0ZWROb2RlVHh0LnRyaW0oKTsKKyAgICBzZWxlY3RlZE5vZGVUeHQgPSBzZWxlY3RlZE5vZGVUeHQuc3BsaXQoJyAnKS5qb2luKCcnKTsvL3NlbGVjdGVkTm9kZVR4dC5yZXBsYWNlKCIgIiwgIiIpCisgICAgdmFyIHBhcmVudE5vZGVUeHQgPSAkKCcuc2VsZWN0ZWRNYWluTmF2JykudGV4dCgpOworICAgIHBhcmVudE5vZGVUeHQgPSBwYXJlbnROb2RlVHh0LnJlcGxhY2UoIi9cbiIsIiIpOworICAgIHBhcmVudE5vZGVUeHQgPSBwYXJlbnROb2RlVHh0LnJlcGxhY2UoIrsiLCIiKTsKKyAgICBwYXJlbnROb2RlVHh0ID0gcGFyZW50Tm9kZVR4dC50cmltKCk7CisgICAgaWYgKHBhcmVudE5vZGVUeHQubGVuZ3RoID4gMCAmJiBwYXJlbnROb2RlVHh0LmNoYXJBdChwYXJlbnROb2RlVHh0Lmxlbmd0aC0xKT09J3MnKSB7CisgICAgICAgICAgICBwYXJlbnROb2RlVHh0ID0gcGFyZW50Tm9kZVR4dC5zdWJzdHJpbmcoMCwgcGFyZW50Tm9kZVR4dC5sZW5ndGgtMSk7CisgICAgfQorCisgICAgaWYgKHBhcmVudE5vZGVUeHQgPT0gIlNsaWNlIikgeworICAgICAgICByZXR1cm4gIiZzbGljZT0iICsgc2VsZWN0ZWROb2RlVHh0OworICAgIH0gZWxzZSBpZiAocGFyZW50Tm9kZVR4dCA9PSAiU2l0ZSIpIHsKKyAgICAgICAgcmV0dXJuICImc2l0ZT0iICsgc2VsZWN0ZWROb2RlVHh0OworICAgIH0gZWxzZSBpZiAocGFyZW50Tm9kZVR4dCA9PSAiTm9kZSIpIHsKKyAgICAgICAgcmV0dXJuICImbm9kZT0iICsgc2VsZWN0ZWROb2RlVHh0OworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAiIjsKKyAgICB9Cit9CisKKworZnVuY3Rpb24gc2V0UGFnZVN0YXRJbnQobGFiZWxOYW1lLCB2YWx1ZU5hbWUsIGxlZ2VuZCwgdW5pdHMsIHZhbHVlKSB7CisgICAgJCgnLicrbGFiZWxOYW1lKS50ZXh0KGxlZ2VuZCkuc2hvdygpOworICAgICQoJy4nK3ZhbHVlTmFtZSkudGV4dChNYXRoLnJvdW5kKHZhbHVlKSt1bml0cykuc2hvdygpOworfQorCitmdW5jdGlvbiBzZXRQYWdlU3RhdEZsb2F0KGxhYmVsTmFtZSwgdmFsdWVOYW1lLCBsZWdlbmQsIHVuaXRzLCB2YWx1ZSwgZHApIHsKKyAgICAkKCcuJytsYWJlbE5hbWUpLnRleHQobGVnZW5kKS5zaG93KCk7CisgICAgJCgnLicrdmFsdWVOYW1lKS50ZXh0KE51bWJlcih2YWx1ZSkudG9GaXhlZChkcCkrdW5pdHMpLnNob3coKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbm9kZSBjb3VudCBhbmQgYXZlcmFnZSBjcHUgdXRpbGl6YXRpb24KKworZnVuY3Rpb24gdXBkYXRlUGFnZUFuYWx5dGljc0RhdGEoc3VtbWFyeURhdGEpIHsKKyAgICB3aW5kb3cucGFnZUFuYWx5dGljc0RhdGEgPSBzdW1tYXJ5RGF0YTsKKyAgICBsYXN0Um93ID0gc3VtbWFyeURhdGEucm93cy5sZW5ndGgtMTsKKyAgICBzZXRQYWdlU3RhdEludCgibm9kZXNMYWJlbCIsICJub2Rlc1ZhbHVlIiwgIk5vZGUgQ291bnQiLCAiIiwgc3VtbWFyeURhdGEucm93c1tsYXN0Um93XVsiY291bnRfaG9zdG5hbWUiXSk7CisgICAgc2V0UGFnZVN0YXRJbnQoImNwdUxhYmVsIiwgImNwdVZhbHVlIiwgIkF2ZyBMb2FkIiwgIiUiLCBzdW1tYXJ5RGF0YS5yb3dzW2xhc3RSb3ddWyJhdmdfY3B1Il0pOworfQorCitmdW5jdGlvbiB1cGRhdGVQYWdlQW5hbHl0aWNzKCkgeworICAgICQuYWpheCh7CisgICAgdXJsIDogJy9hbmFseXRpY3MvYmlncXVlcnkvP2F2Zz0lY3B1JmNvdW50PSVob3N0bmFtZScgKyBnZXRPYmplY3RRdWVyeSgpLAorICAgIGRhdGFUeXBlIDogJ2pzb24nLAorICAgIHR5cGUgOiAnR0VUJywKKyAgICBzdWNjZXNzOiBmdW5jdGlvbihuZXdEYXRhKQorICAgIHsKKyAgICAgICAgdXBkYXRlUGFnZUFuYWx5dGljc0RhdGEobmV3RGF0YSk7CisgICAgfQorfSk7CisgICAgc2V0VGltZW91dCh1cGRhdGVQYWdlQW5hbHl0aWNzLCAzMDAwMCk7Cit9CisKK3NldFRpbWVvdXQodXBkYXRlUGFnZUFuYWx5dGljcywgNTAwMCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGJhbmR3aWR0aAorCitmdW5jdGlvbiB1cGRhdGVQYWdlQmFuZHdpZHRoRGF0YShzdW1tYXJ5RGF0YSkgeworICAgIHdpbmRvdy5wYWdlQmFuZERhdGEgPSBzdW1tYXJ5RGF0YTsKKyAgICBsYXN0Um93ID0gc3VtbWFyeURhdGEucm93cy5sZW5ndGgtMTsKKyAgICBzZXRQYWdlU3RhdEZsb2F0KCJiYW5kd2lkdGhMYWJlbCIsICJiYW5kd2lkdGhWYWx1ZSIsICJCYW5kd2lkdGgiLCAiR2JwcyIsIHN1bW1hcnlEYXRhLnJvd3NbbGFzdFJvd11bInN1bV9jb21wdXRlZF9ieXRlc19zZW50X2Rpdl9lbGFwc2VkIl0qOC4wLzEwMjQvMTAyNC8xMDI0LDIpOworfQorCitmdW5jdGlvbiB1cGRhdGVQYWdlQmFuZHdpZHRoKCkgeworICAgICQuYWpheCh7CisgICAgdXJsIDogJy9hbmFseXRpY3MvYmlncXVlcnkvP2NvbXB1dGVkPSVieXRlc19zZW50LyVlbGFwc2VkJyArIGdldE9iamVjdFF1ZXJ5KCksCisgICAgZGF0YVR5cGUgOiAnanNvbicsCisgICAgdHlwZSA6ICdHRVQnLAorICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKG5ld0RhdGEpCisgICAgeworICAgICAgICB1cGRhdGVQYWdlQmFuZHdpZHRoRGF0YShuZXdEYXRhKTsKKyAgICB9Cit9KTsKKyAgICBzZXRUaW1lb3V0KHVwZGF0ZVBhZ2VCYW5kd2lkdGgsIDMwMDAwKTsKK30KKworc2V0VGltZW91dCh1cGRhdGVQYWdlQmFuZHdpZHRoLCA1MDAwKTsKKwpkaWZmIC0tZ2l0IGEvcGxhbmV0c3RhY2svY29yZS9zdGF0aWMvcGxhbmV0c3RhY2suY3NzIGIvcGxhbmV0c3RhY2svY29yZS9zdGF0aWMvcGxhbmV0c3RhY2suY3NzCmluZGV4IGQ1OWFkYjcuLjc2YmMyM2IgMTAwNjQ0Ci0tLSBhL3BsYW5ldHN0YWNrL2NvcmUvc3RhdGljL3BsYW5ldHN0YWNrLmNzcworKysgYi9wbGFuZXRzdGFjay9jb3JlL3N0YXRpYy9wbGFuZXRzdGFjay5jc3MKQEAgLTEsMyArMSw2NCBAQAorLmFsaWduQ2VudGVyIHsKKyAgICB0ZXh0LWFsaWduOiBjZW50ZXIgIWltcG9ydGFudDsKKyAgICBhbGlnbjogY2VudGVyICFpbXBvcnRhbnQ7Cit9Cit0YWJsZS5kYXRhVGFibGUgdHIub2RkIHsKK2JhY2tncm91bmQtY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7Cit9Cit0YWJsZS5kYXRhVGFibGUgdHIub2RkIHRkLnNvcnRpbmdfMSB7CitiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZSAhaW1wb3J0YW50OworfQordGFibGUuZGF0YVRhYmxlIHRyLmV2ZW4gdGQuc29ydGluZ18xIHsKK2JhY2tncm91bmQtY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7Cit9Cit0YWJsZS5kYXRhVGFibGUgdGhlYWQgdGggZGl2LkRhdGFUYWJsZXNfc29ydF93cmFwcGVyIHsKKyAgICBmb250LXdlaWdodDogYm9sZDsKK30KKy5kYXNoYm9hcmQtaHBjLXNsaXZlciAudWktd2lkZ2V0LWhlYWRlciwgLmRhc2hib2FyZC1ocGMtc2xpdmVyIC51aS1kaWFsb2ctdGl0bGUsIC5kYXNoYm9hcmQtaHBjLXNsaXZlciAudWktZGlhbG9nLXRpdGxlYmFyeworfQorLnVpLXdpZGdldC1vdmVybGF5IHsKKyAgICBiYWNrZ3JvdW5kOiBibGFjayAhaW1wb3J0YW50OworfQorLnVpLWNvcm5lci1hbGwgeworYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMHB4ICFpbXBvcnRhbnQ7Citib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMHB4ICFpbXBvcnRhbnQ7Cit9CisKKyNzdWl0LWNlbnRlciB7CisgIG1pbi13aWR0aDogOTc3cHggIWltcG9ydGFudDsKK30KKyNtaW5EYXNoYm9hcmQgeworICBtaW4td2lkdGg6NjI1cHg7CisgIGRpc3BsYXk6aW5saW5lOworICBmbG9hdDogcmlnaHQ7Cit9CisudWktc3RhdGUtZGVmYXVsdCwgLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1kZWZhdWx0LCAudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtZGVmYXVsdHsKK2JhY2tncm91bmQ6IG5vbmUgIWltcG9ydGFudDsKK2JvcmRlci10b3A6IDBweCAhaW1wb3J0YW50OworYm9yZGVyLWxlZnQ6IDBweCAhaW1wb3J0YW50OworYm9yZGVyLXJpZ2h0OiAwcHggIWltcG9ydGFudDsKK30KKy51aS13aWRnZXQtaGVhZGVyIHsKK2JhY2tncm91bmQ6IG5vbmUgIWltcG9ydGFudDsKK2JvcmRlci10b3A6IDBweCAhaW1wb3J0YW50OworYm9yZGVyLWxlZnQ6IDBweCAhaW1wb3J0YW50OworYm9yZGVyLXJpZ2h0OiAwcHggIWltcG9ydGFudDsKK30KKyNzdWl0X2Zvcm1fdGFicyB7Citib3JkZXItYm90dG9tOiAxcHggc29saWQgI0I1RDFFQTsKK2JvcmRlci1ib3R0b20td2lkdGg6IDFweDsKK2JvcmRlci1ib3R0b20tc3R5bGU6IHNvbGlkOworYm9yZGVyLWJvdHRvbS1jb2xvcjogcmdiKDE4MSwgMjA5LCAyMzQpOworY29sb3I6IzEwNUU5RTsKK30KKyN0YWJzIHsKK2ZvbnQtc2l6ZTogMTJweDsKK2JvcmRlcjogMHB4OworfQorLnVpLXN0YXRlLWRlZmF1bHQgYSwgLnVpLXN0YXRlLWRlZmF1bHQgYTpsaW5rLCAudWktc3RhdGUtZGVmYXVsdCBhOnZpc2l0ZWQgeworY29sb3I6ICMxMDVFOUUgOworfQorCiAucmVxdWlyZWQ6YWZ0ZXIge2NvbG9yOiByZWQgISBpbXBvcnRhbnQ7IGZvbnQtc2l6ZTogMThweCB9CiAjLmJ0bi1zdWNjZXNzIHtjb2xvcjpibGFja30KICNzdWl0LWNlbnRlciB7CkBAIC0yNSw2ICs4Niw3IEBACiAvKkZvciBpbmNyZWFzaW5nIHRoZSBoZWFkZXIgaGVpZ2h0Ki8KIC5oZWFkZXIgewogaGVpZ2h0OiA5MHB4OworbWluLXdpZHRoOiAxMzIxcHg7CiB9CiAKIC8qRm9yIGNoYW5naW5nIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBsZWZ0IHNpZGUgbmF2aWdhdGlvbiBsaXN0IGl0ZW1zKi8KQEAgLTQ4OCwxMiArNTUwLDE1IEBACiAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMDsqLwogfQogCi0uaWNvbi1ob21lICwuaWNvbi1kZXBsb3ltZW50ICwuaWNvbi1zaXRlICwuaWNvbi1zbGljZSAsLmljb24tdXNlciwgLmljb24tcmVzZXJ2YXRpb257CisuaWNvbi1ob21lICwuaWNvbi1kZXBsb3ltZW50ICwuaWNvbi1zaXRlICwuaWNvbi1zbGljZSAsLmljb24tdXNlciwgLmljb24tcmVzZXJ2YXRpb24sIC5pY29uLWFwcHsKIGJhY2tncm91bmQtcG9zaXRpb246IGxlZnQgY2VudGVyOwogd2lkdGg6MjJweDsKIGhlaWdodDoyMnB4OwkKIH0KIAorLmljb24tYXBwIHsKK2JhY2tncm91bmQtaW1hZ2U6IHVybCgib3BlbmNsb3VkQXBwLnBuZyIpOworfQogLmljb24taG9tZSB7CiBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIkhvbWUucG5nIik7CiB9CmRpZmYgLS1naXQgYS9wbGFuZXRzdGFjay9jb3JlL3N0YXRpYy9wbGFuZXRzdGFja19ncmFwaHMuanMgYi9wbGFuZXRzdGFjay9jb3JlL3N0YXRpYy9wbGFuZXRzdGFja19ncmFwaHMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU2MmM0YgotLS0gL2Rldi9udWxsCisrKyBiL3BsYW5ldHN0YWNrL2NvcmUvc3RhdGljL3BsYW5ldHN0YWNrX2dyYXBocy5qcwpAQCAtMCwwICsxLDEzOSBAQAorZ29vZ2xlLmxvYWQoJ3Zpc3VhbGl6YXRpb24nLCAnMScsIHsncGFja2FnZXMnIDogWydjb250cm9scycsJ3RhYmxlJywnY29yZWNoYXJ0JywnZ2VvY2hhcnQnXX0pOworCitmdW5jdGlvbiByZW5kZXJDaGFydEpzb24oanNvbmRhdGEsIHlGaWVsZCwgeEZpZWxkLCBsZWdlbmQpIHsKKyAgICAkKCcjZ3JhcGgnKS5lbXB0eSgpOworICAgICQoJyNjaGFydHNNb2RhbCcpLm1vZGFsKCdzaG93Jyk7CisgICAgJCgnLm1vZGFsLWJvZHknKS5zY3JvbGxUb3AoMCk7CisKKyAgICB2YXIgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKKyAgICBkYXRhLmFkZENvbHVtbigibnVtYmVyIiwgIkRhdGUiKTsKKyAgICBkYXRhLmFkZENvbHVtbigibnVtYmVyIiwgIk5vZGVDb3VudCIpOworCisgICAgdmFyIGFyciA9IFtdOworICAgIGpzb25kYXRhLnJvd3MuZm9yRWFjaChmdW5jdGlvbihkKSB7CisgICAgICAgIGFyci5wdXNoKFsgK2RbeUZpZWxkXSwgK2RbeEZpZWxkXSBdKTsKKyAgICB9KTsKKworICAgIGNvbnNvbGUubG9nKGFycik7CisKKyAgICBkYXRhLmFkZFJvd3MoYXJyKTsKKworICAgIHZhciBsaW5lQ2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ2hhcnRXcmFwcGVyKHsKKyAgICAgICAgICAnY2hhcnRUeXBlJzogJ0xpbmVDaGFydCcsCisgICAgICAgICAgJ2NvbnRhaW5lcklkJzogJ2dyYXBoJywKKyAgICAgICAgICAnb3B0aW9ucyc6IHsKKyAgICAgICAgICAgICd3aWR0aCc6IDUyMCwKKyAgICAgICAgICAgICdoZWlnaHQnOiAzMDAsCisgICAgICAgICAgICAndGl0bGUnOiAnTmV0d29yay13aWRlIHVzYWdlJywKKwkJCSdwYWdlcyc6IHRydWUsCisJCQknbnVtUm93cyc6IDkKKyAgICAgICAgICB9LAorICAgICAgICAgICd2aWV3Jzogeydjb2x1bW5zJzogWzAsIDFdfQorICAgICAgICB9KTsKKyAgICAgICAgbGluZUNoYXJ0LnNldERhdGFUYWJsZShkYXRhKTsKKyAgICAgICAgbGluZUNoYXJ0LmRyYXcoKTsKK30KKworZnVuY3Rpb24gcmVuZGVyQ2hhcnQob3JpZ1F1ZXJ5LCB5Q29sdW1uLCB4Q29sdW1uKSB7CisgICAgJCgnI2dyYXBoJykuZW1wdHkoKTsKKyAgICAkKCcjY2hhcnRzTW9kYWwnKS5tb2RhbCgnc2hvdycpOworICAgICQoJy5tb2RhbC1ib2R5Jykuc2Nyb2xsVG9wKDApCisKKyAgICB2YXIgcXVlcnlTdHJpbmcgPSBlbmNvZGVVUklDb21wb25lbnQob3JpZ1F1ZXJ5KTsKKyAgICB2YXIgc2VydmVyUGFydCA9ICJodHRwOi8vY2xvdWQtc2NydXRpbnkuYXBwc3BvdC5jb20vY29tbWFuZD9hY3Rpb249c2VuZF9xdWVyeSZmb3JjZT1Db2x1bW5DaGFydCZxPSI7CisgICAgdmFyIGRhdGFTb3VyY2VVcmwgPSBzZXJ2ZXJQYXJ0ICsgcXVlcnlTdHJpbmc7CisKKyAgICAvL3ZhciBkYXRhU291cmNlVXJsID0gImh0dHA6Ly9ub2RlMzYucHJpbmNldG9uLnZpY2NpLm9yZzo4MDAwL2FuYWx5dGljcy9iaWdxdWVyeS8/YXZnPSUyNWNwdSZjb3VudD0lMjVob3N0bmFtZSZmb3JtYXQ9cmF3IjsKKworICAgIHZhciBxdWVyeSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5RdWVyeShkYXRhU291cmNlVXJsKQorICAgIHF1ZXJ5ICYmIHF1ZXJ5LmFib3J0KCk7CisgICAgY29uc29sZS5sb2coInF1ZXJ5LnNlbmQiKQorICAgIHF1ZXJ5LnNlbmQoZnVuY3Rpb24ocmVzcG9uc2UpIHtoYW5kbGVSZXNwb25zZV9wc2cocmVzcG9uc2UsIHlDb2x1bW4sIHhDb2x1bW4pO30pOworICAgIGNvbnNvbGUubG9nKCJxdWVyeS5zZW50IikKK30KKworLy8gTk9URTogYXBwZW5kZWQgX3BzZyB0byBzaG93TGluZSgpIGFuZCBoYW5kbGVSZXNwb25zZSgpIHRvIHByZXZlbnQgY29uZmxpY3QKKy8vICAgICAgIHdpdGggU2FwYW4ncyBhbmFseXRpY3MgcGFnZS4KKworZnVuY3Rpb24gc2hvd0xpbmVfcHNnKGR0KSB7CisgICAgY29uc29sZS5sb2coInNob3dsaW5lIikKKyAgICB2YXIgbGluZUNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNoYXJ0V3JhcHBlcih7CisgICAgICAgICAgJ2NoYXJ0VHlwZSc6ICdMaW5lQ2hhcnQnLAorICAgICAgICAgICdjb250YWluZXJJZCc6ICdncmFwaCcsCisgICAgICAgICAgJ29wdGlvbnMnOiB7CisgICAgICAgICAgICAnd2lkdGgnOiA1MjAsCisgICAgICAgICAgICAnaGVpZ2h0JzogMzAwLAorICAgICAgICAgICAgJ3RpdGxlJzogJ05ldHdvcmstd2lkZSB1c2FnZScsCisJCQkncGFnZXMnOiB0cnVlLAorCQkJJ251bVJvd3MnOiA5CisgICAgICAgICAgfSwKKyAgICAgICAgICAndmlldyc6IHsnY29sdW1ucyc6IFswLCAxXX0KKyAgICAgICAgfSk7CisgICAgICAgIGxpbmVDaGFydC5zZXREYXRhVGFibGUoZHQpOworICAgICAgICBsaW5lQ2hhcnQuZHJhdygpOworfQorCitmdW5jdGlvbiBoYW5kbGVSZXNwb25zZV9wc2cocmVzcG9uc2UsIHlDb2x1bW4sIHhDb2x1bW4pIHsKKyAgICBjb25zb2xlLmxvZygiaGFuZGxlUmVzcG9uc2UiKQorCisgICAgdmFyIHN1cHBvcnRlZENsYXNzZXMgPSB7CisgICAgICAgICAgICAgICAgICAgICdUYWJsZSc6Z29vZ2xlLnZpc3VhbGl6YXRpb24uVGFibGUsCisgICAgICAgICAgICAgICAgICAgICdMaW5lQ2hhcnQnOmdvb2dsZS52aXN1YWxpemF0aW9uLkxpbmVDaGFydCwKKyAgICAgICAgICAgICAgICAgICAgJ1NjYXR0ZXJDaGFydCc6Z29vZ2xlLnZpc3VhbGl6YXRpb24uU2NhdHRlckNoYXJ0LAorICAgICAgICAgICAgICAgICAgICAnQ29sdW1uQ2hhcnQnOmdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0LAorICAgICAgICAgICAgICAgICAgICAnR2VvQ2hhcnQnOmdvb2dsZS52aXN1YWxpemF0aW9uLkdlb0NoYXJ0LAorICAgICAgICAgICAgICAgICAgICAnUGllQ2hhcnQnOmdvb2dsZS52aXN1YWxpemF0aW9uLlBpZUNoYXJ0LAorICAgICAgICAgICAgICAgICAgICAnSGlzdG9ncmFtJzpnb29nbGUudmlzdWFsaXphdGlvbi5IaXN0b2dyYW19OworCisgICAgdmFyIHByb3h5ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNoYXJ0V3JhcHBlcih7CisgICAgICAnY2hhcnRUeXBlJzogJ1RhYmxlJywKKyAgICAgICdjb250YWluZXJJZCc6ICdncmFwaF93b3JrJywKKyAgICAgICdvcHRpb25zJzogeworICAgICAgICAnd2lkdGgnOiA4MDAsCisgICAgICAgICdoZWlnaHQnOiAzMDAsCisgICAgICAgICAgICAgICAgICAgIHBhZ2VTaXplOjUsCisgICAgICAgICAgICAgICAgICAgIHBhZ2U6J2VuYWJsZScsCisgICAgICAgICdsZWdlbmQnOiAnbm9uZScsCisgICAgICAgICd0aXRsZSc6ICdOb2RlcycKKyAgICAgIH0sCisgICAgICAndmlldyc6IHsnY29sdW1ucyc6IFswLDFdfQorICAgIH0pOworCisgICAgZ29vZ2xlLnZpc3VhbGl6YXRpb24uZXZlbnRzLmFkZExpc3RlbmVyKHByb3h5LCAncmVhZHknLCBmdW5jdGlvbiAoKSB7CisgICAgICAgIC8vIDAgLSB0aW1lIDEgLSBjaXR5IDIgLSBub2RlIDMgLSBzaXRlIDQgLSBjcHUgNSAtIGJ5dGVzCisgICAgICAgIHZhciBkdCA9IHByb3h5LmdldERhdGFUYWJsZSgpOworICAgICAgICB2YXIgZ3JvdXBlZERhdGExID0gZ29vZ2xlLnZpc3VhbGl6YXRpb24uZGF0YS5ncm91cChkdCwgW3lDb2x1bW5dLCBbeworICAgICAgICAgICAgY29sdW1uOiB4Q29sdW1uLAorICAgICAgICAgICAgdHlwZTogJ251bWJlcicsCisgICAgICAgICAgICBsYWJlbDogZHQuZ2V0Q29sdW1uTGFiZWwoeENvbHVtbiksCisgICAgICAgICAgICBhZ2dyZWdhdGlvbjogZ29vZ2xlLnZpc3VhbGl6YXRpb24uZGF0YS5zdW19XSk7CisKKyAgICAgICAgc2hvd0xpbmVfcHNnKGdyb3VwZWREYXRhMSk7CisKKyAgICAgICAgY29uc29sZS5sb2coeENvbHVtbik7CisgICAgfSk7CisKKyAgICBjb25zb2xlLmxvZyhyZXNwb25zZS5nZXRSZWFzb25zKCkpOworICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlLmdldERhdGFUYWJsZSgpKTsKKyAgICBjb25zb2xlLmxvZyhyZXNwb25zZS5nZXREZXRhaWxlZE1lc3NhZ2UoKSk7CisgICAgY29uc29sZS5sb2cocmVzcG9uc2UuZ2V0TWVzc2FnZSgpKTsKKworICAgIHByb3h5LnNldERhdGFUYWJsZShyZXNwb25zZS5nZXREYXRhVGFibGUoKSk7CisKKyAgICBwcm94eS5kcmF3KCk7Cit9CisKKyQoJy5ub2Rlc0xhYmVsLCAubm9kZXNWYWx1ZScpLmNsaWNrKGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIganNvbkRhdGEgPSB3aW5kb3cucGFnZUFuYWx5dGljc0RhdGE7CisgICAgICAgIHJlbmRlckNoYXJ0KGpzb25EYXRhLnF1ZXJ5LCAwLCAyKTsKKyAgICAgICAgLy9yZW5kZXJDaGFydEpzb24oanNvbkRhdGEsICJNaW51dGVUaW1lIiwgImNvdW50X2hvc3RuYW1lIiwgIk5vZGUgQ291bnQiKTsKK30pOworCiskKCcuY3B1TGFiZWwsIC5jcHVWYWx1ZScpLmNsaWNrKGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIganNvbkRhdGEgPSB3aW5kb3cucGFnZUFuYWx5dGljc0RhdGE7CisgICAgICAgIHJlbmRlckNoYXJ0KGpzb25EYXRhLnF1ZXJ5LDAsIDEpOworfSk7CiskKCcuYmFuZHdpZHRoTGFiZWwsIC5iYW5kd2lkdGhWYWx1ZScpLmNsaWNrKGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIganNvbkRhdGEgPSB3aW5kb3cucGFnZUJhbmREYXRhOworICAgICAgICByZW5kZXJDaGFydChqc29uRGF0YS5xdWVyeSwgMCwgMSk7Cit9KTsKZGlmZiAtLWdpdCBhL3BsYW5ldHN0YWNrL2NvcmUvc3RhdGljL3BsYW5ldHN0YWNrX2dyYXBoc19vbGQuanMgYi9wbGFuZXRzdGFjay9jb3JlL3N0YXRpYy9wbGFuZXRzdGFja19ncmFwaHNfb2xkLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNmFmZTYKLS0tIC9kZXYvbnVsbAorKysgYi9wbGFuZXRzdGFjay9jb3JlL3N0YXRpYy9wbGFuZXRzdGFja19ncmFwaHNfb2xkLmpzCkBAIC0wLDAgKzEsODkgQEAKKyQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgeworCitmdW5jdGlvbiByZW5kZXJDaGFydChqc29uRGF0YSwgeUZpZWxkLCB4RmllbGQsIGxlZ2VuZCkgeworICAgICQoJyNncmFwaCcpLmVtcHR5KCk7CisgICAgJCgnI2NoYXJ0c01vZGFsJykubW9kYWwoJ3Nob3cnKTsKKyAgICAkKCcubW9kYWwtYm9keScpLnNjcm9sbFRvcCgwKQorICAgIHZhciBtYXJnaW4gPSB7dG9wOiAwLCByaWdodDogMTAwLCBib3R0b206IDEwMCwgbGVmdDogMTc1fSwKKyAgICB3aWR0aCA9IDUyMCAtIG1hcmdpbi5sZWZ0IC0gbWFyZ2luLnJpZ2h0LAorICAgIGhlaWdodCA9IDMwMCAtIG1hcmdpbi50b3AgLSBtYXJnaW4uYm90dG9tOworCisgICAgdmFyIHBhcnNlRGF0ZSA9IGQzLnRpbWUuZm9ybWF0KCIlWS0lbS0lbS0lSC0lTSIpLnBhcnNlOworCisgICAgdmFyIHggPSBkMy50aW1lLnNjYWxlKCkKKyAgICAucmFuZ2UoWzAsIHdpZHRoXSk7CisKKyAgICB2YXIgeSA9IGQzLnNjYWxlLmxpbmVhcigpCisgICAgLnJhbmdlKFtoZWlnaHQsIDBdKTsKKworICAgIHZhciB4QXhpcyA9IGQzLnN2Zy5heGlzKCkKKyAgICAuc2NhbGUoeCkKKyAgICAudGlja3MoZDMudGltZS5taW51dGVzLCAxNSkKKyAgICAub3JpZW50KCJib3R0b20iKTsKKworICAgIHZhciB5QXhpcyA9IGQzLnN2Zy5heGlzKCkKKyAgICAuc2NhbGUoeSkKKyAgICAudGlja3MoNCkKKyAgICAub3JpZW50KCJsZWZ0Iik7CisKKyAgICB2YXIgbGluZSA9IGQzLnN2Zy5saW5lKCkKKyAgICAueChmdW5jdGlvbihkKSB7IHJldHVybiB4KGQuZGF0ZSk7IH0pCisgICAgLnkoZnVuY3Rpb24oZCkgeyByZXR1cm4geShkLnZhbHVlKTsgfSk7CisKKyAgICB2YXIgc3ZnID0gZDMuc2VsZWN0KCIjZ3JhcGgiKS5hcHBlbmQoInN2ZyIpCisgICAgLmF0dHIoIndpZHRoIiwgd2lkdGggKyBtYXJnaW4ubGVmdCArIG1hcmdpbi5yaWdodCkKKyAgICAuYXR0cigiaGVpZ2h0IiwgaGVpZ2h0ICsgbWFyZ2luLnRvcCArIG1hcmdpbi5ib3R0b20pCisgICAgLmFwcGVuZCgiZyIpCisgICAgLmF0dHIoInRyYW5zZm9ybSIsICJ0cmFuc2xhdGUoIiArIG1hcmdpbi5sZWZ0ICsgIiwiICsgbWFyZ2luLnRvcCArICIpIik7CisKKyAgICBkYXRhID0ganNvbkRhdGEucm93czsKKyAgICAkKCcjY2hhcnRIZWFkaW5nJykudGV4dChsZWdlbmQpOworICAgIGRhdGEuZm9yRWFjaChmdW5jdGlvbihkKSB7CisgICAgICAgICAgICBkLmRhdGUgPSBuZXcgRGF0ZShkW3lGaWVsZF0qMTAwMCk7CisgICAgICAgICAgICBkLnZhbHVlID0gK2RbeEZpZWxkXTsKKyAgICAgICAgICAgIH0pOworCisgICAgeC5kb21haW4oZDMuZXh0ZW50KGRhdGEsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuZGF0ZTsgfSkpOworCisgICAgdmFyIGUgPSBkMy5leHRlbnQoZGF0YSwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC52YWx1ZTt9KTsKKyAgICBlID0gW2VbMF0tMSxlWzFdKzFdOworCisgICAgeS5kb21haW4oZSk7CisKKyAgICBzdmcuYXBwZW5kKCJnIikKKyAgICAuYXR0cigiY2xhc3MiLCAieCBheGlzIikKKyAgICAuYXR0cigidHJhbnNmb3JtIiwgInRyYW5zbGF0ZSgwLCIgKyBoZWlnaHQgKyAiKSIpCisgICAgLmF0dHIoIngiLCA1KQorICAgIC5jYWxsKHhBeGlzKTsKKworICAgIHN2Zy5hcHBlbmQoImciKQorICAgIC5hdHRyKCJjbGFzcyIsICJ5IGF4aXMiKQorICAgIC5jYWxsKHlBeGlzKQorICAgIC5hcHBlbmQoInRleHQiKQorICAgIC5hdHRyKCJ0cmFuc2Zvcm0iLCAicm90YXRlKC05MCkiKQorICAgIC5hdHRyKCJ5IiwgNikKKyAgICAuYXR0cigiZHkiLCAiLjcxZW0iKQorICAgIC5zdHlsZSgidGV4dC1hbmNob3IiLCAiZW5kIikKKyAgICAudGV4dChsZWdlbmQpCisgICAgLmF0dHIoImNsYXNzIiwgImxlZ2VuZCIpOworCisgICAgc3ZnLmFwcGVuZCgicGF0aCIpCisgICAgLmRhdHVtKGRhdGEpCisgICAgLmF0dHIoImNsYXNzIiwgImxpbmUiKQorICAgIC5hdHRyKCJkIiwgbGluZSk7Cit9CisKKyQoJy5ub2Rlc0xhYmVsLCAubm9kZXNWYWx1ZScpLmNsaWNrKGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIganNvbkRhdGEgPSB3aW5kb3cucGFnZUFuYWx5dGljc0RhdGE7CisgICAgICAgIHJlbmRlckNoYXJ0KGpzb25EYXRhLCAiTWludXRlVGltZSIsICJjb3VudF9ob3N0bmFtZSIsICJOb2RlIENvdW50Iik7Cit9KTsKKyQoJy5jcHVMYWJlbCwgLmNwdVZhbHVlJykuY2xpY2soZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBqc29uRGF0YSA9IHdpbmRvdy5wYWdlQW5hbHl0aWNzRGF0YTsKKyAgICAgICAgcmVuZGVyQ2hhcnQoanNvbkRhdGEsICJNaW51dGVUaW1lIiwgImF2Z19jcHUiLCAiQXZlcmFnZSBDcHUiKTsKK30pOworJCgnLmJhbmR3aWR0aExhYmVsLCAuYmFuZHdpZHRoVmFsdWUnKS5jbGljayhmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIGpzb25EYXRhID0gd2luZG93LnBhZ2VCYW5kRGF0YTsKKyAgICAgICAgcmVuZGVyQ2hhcnQoanNvbkRhdGEsICJNaW51dGVUaW1lIiwgInN1bV9jb21wdXRlZF9ieXRlc19zZW50X2Rpdl9lbGFwc2VkIiwgIkJhbmR3aWR0aCIpOworfSk7CisKK30pCmRpZmYgLS1naXQgYS9wbGFuZXRzdGFjay90ZW1wbGF0ZXMvYWRtaW4vYmFzZS5odG1sIGIvcGxhbmV0c3RhY2svdGVtcGxhdGVzL2FkbWluL2Jhc2UuaHRtbAppbmRleCA2ODQyMDQwLi4yNWQ5NzQzIDEwMDY0NAotLS0gYS9wbGFuZXRzdGFjay90ZW1wbGF0ZXMvYWRtaW4vYmFzZS5odG1sCisrKyBiL3BsYW5ldHN0YWNrL3RlbXBsYXRlcy9hZG1pbi9iYXNlLmh0bWwKQEAgLTEsNCArMSw0IEBACi17JSBsb2FkIGFkbWluX3N0YXRpYyAlfXslIGxvYWQgc3VpdF90YWdzICV9eyUgbG9hZCB1cmwgZnJvbSBmdXR1cmUgJX08IURPQ1RZUEUgaHRtbD4KK++7v3slIGxvYWQgYWRtaW5fc3RhdGljICV9eyUgbG9hZCBzdWl0X3RhZ3MgJX17JSBsb2FkIHVybCBmcm9tIGZ1dHVyZSAlfTwhRE9DVFlQRSBodG1sPgogPGh0bWwgbGFuZz0ie3sgTEFOR1VBR0VfQ09ERXxkZWZhdWx0OiJlbi11cyIgfX0iIHslIGlmIExBTkdVQUdFX0JJREkgJX1kaXI9InJ0bCJ7JSBlbmRpZiAlfT4KIDxoZWFkPgogICA8dGl0bGU+eyUgYmxvY2sgdGl0bGUgJX0gIHslaWYgdGl0bGUgJX0ge3sgdGl0bGUgfX0gfCB7JSBlbmRpZiAlfSB7eyAnQURNSU5fTkFNRSd8c3VpdF9jb25mIH19eyUgZW5kYmxvY2sgJX08L3RpdGxlPgpAQCAtOSw3ICs5LDcgQEAKICAgeyUgYmxvY2sgZXh0cmFzdHlsZSAlfXslIGVuZGJsb2NrICV9CiAgIHslIGlmIExBTkdVQUdFX0JJREkgJX08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJ7JSBibG9jayBzdHlsZXNoZWV0X3J0bCAlfXslIHN0YXRpYyAiYWRtaW4vY3NzL3J0bC5jc3MiICV9eyUgZW5kYmxvY2sgJX0iLz57JSBlbmRpZiAlfQogICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+d2luZG93Ll9fYWRtaW5fbWVkaWFfcHJlZml4X18gPSAieyUgZmlsdGVyIGVzY2FwZWpzICV9eyUgc3RhdGljICJhZG1pbi8iICV9eyUgZW5kZmlsdGVyICV9Ijs8L3NjcmlwdD4KLSAgPHNjcmlwdCBzcmM9InslIHN0YXRpYyAnc3VpdC9qcy9qcXVlcnktMS44LjMubWluLmpzJyAlfSI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgc3JjPSJ7JSBzdGF0aWMgJ3N1aXQvanMvanF1ZXJ5LTEuOS4xLm1pbi5qcycgJX0iPjwvc2NyaXB0PgogICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+dmFyIFN1aXQgPSB7ICQ6ICQubm9Db25mbGljdCgpIH07IGlmICghJCkgJCA9IFN1aXQuJDsgPC9zY3JpcHQ+CiAgIHslIGlmICdTSE9XX1JFUVVJUkVEX0FTVEVSSVNLJ3xzdWl0X2NvbmYgJX0KICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4ucmVxdWlyZWQ6YWZ0ZXIgeyBjb250ZW50OiAnKic7IG1hcmdpbjogMCAwIDAgNXB4OyBwb3NpdGlvbjogYWJzb2x1dGU7IGNvbG9yOiAjY2NjO308L3N0eWxlPgpAQCAtODcsOSArODcsNyBAQAogICAgICAgICAgICAgeyUgaWYgdXNlci5pc19hY3RpdmUgYW5kIHVzZXIuaXNfc3RhZmYgJX0KICAgICAgICAgICAgICAgPGRpdiBpZD0idXNlci10b29scyI+CiAgICAgICAgICAgICAgICAgeyUgdHJhbnMgJ1dlbGNvbWUsJyAlfQotICAgICAgICAgICAgICAgIDxzdHJvbmc+Ci0gICAgICAgICAgICAgICAgICB7JSBmaWx0ZXIgZm9yY2VfZXNjYXBlICV9Ci0gICAgICAgICAgICAgICAgICAgIHslIGZpcnN0b2YgdXNlci5maXJzdF9uYW1lIHVzZXIudXNlcm5hbWUgJX17JSBlbmRmaWx0ZXIgJX08L3N0cm9uZz4uCisgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3t7IHJlcXVlc3QuZ2V0X2hvc3R9fS9hZG1pbi9jb3JlL3VzZXIve3t1c2VyLmlkfX0iPnt7dXNlci5lbWFpbH19PC9hPgogICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ1c2VyLWxpbmtzIj4KICAgICAgICAgICAgICAgICB7JSBibG9jayB1c2VybGlua3MgJX0KICAgICAgICAgICAgICAgICAgIHslIHVybCAnZGphbmdvLWFkbWluZG9jcy1kb2Nyb290JyBhcyBkb2Nzcm9vdCAlfQpAQCAtMTIwLDYgKzExOCwyNSBAQAogICAgICAgICAgIDxkaXYgaWQ9InN1aXQtY2VudGVyIiBjbGFzcz0ic3VpdC1jb2x1bW4iPgogCiAgICAgICAgICAgICB7JSBpZiBub3QgaXNfcG9wdXAgJX0KKyAgICAgICAgICAgIDxkaXYgaWQ9b3BlbkNsb3VkVG9wUGFnZT4KKyAgICAgICAgICAgIDxzcGFuIGlkPSJtaW5EYXNoYm9hcmQiPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhpZGUiPnt7IGFwcF9sYWJlbHxjYXBmaXJzdHxlc2NhcGUgfX08L2Rpdj4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJoaWRlIHNlbGVjdGVkTWFpbk5hdiI+e3sgb3B0cy52ZXJib3NlX25hbWVfcGx1cmFsfGNhcGZpcnN0IH19PC9kaXY+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaGlkZSBjdXJyZW50T3JpZ2luYWxOb2RlIj57eyBvcmlnaW5hbHx0cnVuY2F0ZXdvcmRzOiIxOCIgfX08L2Rpdj4KKworCisgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Im5vZGV0ZXh0Ym94IG5vZGVzTGFiZWwiIHN0eWxlPSJkaXNwbGF5OiBub25lOyIgPiA8L2xhYmVsPgorICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Im5vZGVsYWJlbCBub2Rlc1ZhbHVlIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiID48L2xhYmVsPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJub2Rlc0NudCBoaWRlIj48L3NwYW4+CisgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0ibm9kZXRleHRib3ggY3B1TGFiZWwiIHN0eWxlPSJkaXNwbGF5OiBub25lOyIgPjwvbGFiZWw+CisgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0ibm9kZWxhYmVsIGNwdVZhbHVlIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiID48L2xhYmVsPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjcHVDbnQgaGlkZSI+PC9zcGFuPgorICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJub2RldGV4dGJveCBiYW5kd2lkdGhMYWJlbCIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7IiA+PC9sYWJlbD4KKyAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJub2RlbGFiZWwgYmFuZHdpZHRoVmFsdWUiIHN0eWxlPSJ3aWR0aDo2MHB4O2Rpc3BsYXk6IG5vbmU7Ij48L2xhYmVsPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJiYW5kVXNhZ2UgaGlkZSI+PC9zcGFuPgorICAgICAgICAgICAgPC9zcGFuPgorICAgICAgICAgICAgPC9kaXY+CisKICAgICAgICAgICAgICAgeyUgYmxvY2sgYnJlYWRjcnVtYnMgJX0KICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9ImJyZWFkY3J1bWIiPiAKICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJ7JSB1cmwgJ2FkbWluOmluZGV4JyAlfSI+eyUgdHJhbnMgJ0hvbWUnICV9PC9hPgpAQCAtMTMyLDIwICsxNDksNiBAQAogICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgICAgIHslIGVuZGJsb2NrICV9Ci0JCTxkaXYgY2xhc3M9ImhpZGUiPnt7IGFwcF9sYWJlbHxjYXBmaXJzdHxlc2NhcGUgfX08L2Rpdj4KLQkJPGRpdiBjbGFzcz0iaGlkZSBzZWxlY3RlZE1haW5OYXYiPnt7IG9wdHMudmVyYm9zZV9uYW1lX3BsdXJhbHxjYXBmaXJzdCB9fTwvZGl2PgotCQk8ZGl2IGNsYXNzPSJoaWRlIGN1cnJlbnRPcmlnaW5hbE5vZGUiPnt7IG9yaWdpbmFsfHRydW5jYXRld29yZHM6IjE4IiB9fTwvZGl2PiAgCi0gICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJub2RldGV4dGJveCBub2Rlc0xhYmVsIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiID4gPC9sYWJlbD4KLSAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJub2RlbGFiZWwgbm9kZXNWYWx1ZSIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7IiA+PC9sYWJlbD4KLQkJPHNwYW4gY2xhc3M9Im5vZGVzQ250IGhpZGUiPjwvc3Bhbj4KLSAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJub2RldGV4dGJveCBjcHVMYWJlbCIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7IiA+PC9sYWJlbD4KLSAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJub2RlbGFiZWwgY3B1VmFsdWUiIHN0eWxlPSJkaXNwbGF5OiBub25lOyIgPjwvbGFiZWw+Ci0JCTxzcGFuIGNsYXNzPSJjcHVDbnQgaGlkZSI+PC9zcGFuPgotICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJub2RldGV4dGJveCBiYW5kd2lkdGhMYWJlbCIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7IiA+PC9sYWJlbD4gICAgCi0gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0ibm9kZWxhYmVsIGJhbmR3aWR0aFZhbHVlIiBzdHlsZT0id2lkdGg6NjBweDtkaXNwbGF5OiBub25lOyI+PC9sYWJlbD4KLQkJPHNwYW4gY2xhc3M9ImJhbmRVc2FnZSBoaWRlIj48L3NwYW4+CiAgICAgICAgICAgICB7JSBlbmRpZiAlfQogCiAgICAgICAgICAgICB7JSBibG9jayBtZXNzYWdlcyAlfQpAQCAtMjM3LDEwICsyNDAsMTMgQEAKIAogICA8c2NyaXB0IHNyYz0ieyUgc3RhdGljICdzdWl0L2Jvb3RzdHJhcC9qcy9ib290c3RyYXAubWluLmpzJyAlfSI+PC9zY3JpcHQ+CiAgIDxzY3JpcHQgc3JjPSJ7JSBzdGF0aWMgJ3N1aXQvanMvc3VpdC5qcycgJX0iPjwvc2NyaXB0PgotICA8c2NyaXB0IHNyYz0ieyUgc3RhdGljICdtYWluLmpzJyAlfSI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgc3JjPSJ7JSBzdGF0aWMgJ3BhZ2VfYW5hbHl0aWNzLmpzJyAlfSI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgorICA8c2NyaXB0IHNyYz0ieyUgc3RhdGljICdwbGFuZXRzdGFja19ncmFwaHMuanMnICV9Ij48L3NjcmlwdD4KKyAgPCEtLSBzcmM9InslIHN0YXRpYyAncGxhbmV0c3RhY2tfZ3JhcGhzX29sZC5qcycgJX0iIC0tPgorCiAgIHslIGJsb2NrIGV4dHJhanMgJX17JSBlbmRibG9jayAlfQogPHNjcmlwdCBzcmM9Imh0dHA6Ly9kM2pzLm9yZy9kMy52My5qcyI+PC9zY3JpcHQ+Ci0KIAk8ZGl2IGNsYXNzPSJtb2RhbCBmYWRlIGhpZGUiIGlkPSJjaGFydHNNb2RhbCIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciIGFyaWEtbGFiZWxsZWRieT0ibXlNb2RhbExhYmVsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+CiAJICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2ciPgogCSAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4KQEAgLTI2OSw2ICsyNzUsNyBAQAogCQkJCTwvZGl2PgogCQkJPC9kaXY+CiAJCTwvZGl2PgorICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImdyYXBoX3dvcmsiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjwvZGl2PgogCSAgICAgIDwvZGl2PgogCSAgICAgIDwhLS08ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPgogCQk8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCIgZGF0YS1kaXNtaXNzPSJtb2RhbCI+Q2xvc2U8L2J1dHRvbj4KZGlmZiAtLWdpdCBhL3BsYW5ldHN0YWNrL3RlbXBsYXRlcy9hZG1pbi9kYXNoYm9hcmQvaHBjX2hpc3RvcmljYWwuaHRtbCBiL3BsYW5ldHN0YWNrL3RlbXBsYXRlcy9hZG1pbi9kYXNoYm9hcmQvaHBjX2hpc3RvcmljYWwuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDQ2YWU1Ci0tLSAvZGV2L251bGwKKysrIGIvcGxhbmV0c3RhY2svdGVtcGxhdGVzL2FkbWluL2Rhc2hib2FyZC9ocGNfaGlzdG9yaWNhbC5odG1sCkBAIC0wLDAgKzEsMzI5IEBACisKKyAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KKyAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii9zdGF0aWMvaHBjX2hpc3RvcmljYWwuY3NzIj4KKyAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisJCWdvb2dsZS5sb2FkKCd2aXN1YWxpemF0aW9uJywgJzEnLCB7J3BhY2thZ2VzJyA6IFsnY29udHJvbHMnLCd0YWJsZScsJ2NvcmVjaGFydCcsJ2dlb2NoYXJ0J119KTsKKyAgICA8L3NjcmlwdD4KKwkKKyAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Cit2YXIgcXVlcnlTdHJpbmcgPSBlbmNvZGVVUklDb21wb25lbnQoIlNFTEVDVCBNSU5VVEUodGltZSkgYXMgVGltZSwgY2l0eSwgczggYXMgTm9kZSwgUkVHRVhQX1JFUExBQ0Uoczgscidub2RlWzAtOV0rXC4oLiopXC52aWNjaVwub3JnJyxyJ1xcMScpIGFzIFNpdGUsIEFWRyhpMCkgYXMgQ3B1LCBBVkcoaTEpIGFzIFJlcXVlc3RzIEZST00gW3ZpY2NpLmRlbW9ldmVudHNdIFdIRVJFIGkwIGlzIG5vdCBudWxsIEFORCBzOCBjb250YWlucyAndmljY2kub3JnJyBhbmQgbm90IGNpdHkgSU4gKCdwcmluY2V0b24nLCdVbmtub3duJykgYW5kIGNpdHkgaXMgbm90IG51bGwgR1JPVVAgQlkgVGltZSxjaXR5LFNpdGUsTm9kZSBPUkRFUiBCWSBUaW1lOyIpOworCQkJdmFyIHNlcnZlclBhcnQgPSAiaHR0cDovL2Nsb3VkLXNjcnV0aW55LmFwcHNwb3QuY29tL2NvbW1hbmQ/YWN0aW9uPXNlbmRfcXVlcnkmZm9yY2U9Q29sdW1uQ2hhcnQmcT0iCisJCQl2YXIgZGF0YVNvdXJjZVVybCA9IHNlcnZlclBhcnQgKyBxdWVyeVN0cmluZzsKKwkJCXZhciBxdWVyeTsKKworCQkJdmFyIG9wdGlvbnMgPSB7CisJICAgd2lkdGg6IDYwMCwKKwkgICBoZWlnaHQ6IDQwMCwKKwkgICBzaG93Um93TnVtYmVyOiBmYWxzZSwKKwkgICBwYWdlczp0cnVlLAorICAgICAgIG51bVJvd3M6OSwKKwkgICBiYWNrZ3JvdW5kQ29sb3I6ICJibGFjayIKKwkJCX07CisKK2dvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhmdW5jdGlvbigpIHsgc2VuZEFuZERyYXcoZGF0YVNvdXJjZVVybCk7IH0pOworCitmdW5jdGlvbiBzaG93Tm9kZUFnZyhkdCkgeworCQl2YXIgdGFiID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNoYXJ0V3JhcHBlcih7CisgICAgICAgICAgJ2NoYXJ0VHlwZSc6ICdUYWJsZScsCisgICAgICAgICAgJ2NvbnRhaW5lcklkJzogJ2NoYXJ0MycsCisgICAgICAgICAgJ29wdGlvbnMnOiB7CisgICAgICAgICAgICAnd2lkdGgnOiAzMDAsCisgICAgICAgICAgICAnaGVpZ2h0JzogMzAwLAorICAgICAgICAgICAgJ3RpdGxlJzogJ05ldHdvcmstd2lkZSB1c2FnZScsCisJCQkncGFnZSc6ICdlbmFibGUnLAorCQkJJ3BhZ2VTaXplJzogMTAKKyAgICAgICAgICB9LAorICAgICAgICAgICd2aWV3Jzogeydjb2x1bW5zJzogWzAsIDEsIDJdfQorICAgICAgICB9KTsKKworICAgICAgICB0YWIuc2V0RGF0YVRhYmxlKGR0KTsKKyAgICAgICAgdGFiLmRyYXcoKTsKK30KKworZnVuY3Rpb24gc2hvd1NpdGVUaW1lQWdnKGR0KSB7CisJCXZhciBsaW5lQ2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ2hhcnRXcmFwcGVyKHsKKyAgICAgICAgICAnY2hhcnRUeXBlJzogJ0xpbmVDaGFydCcsCisgICAgICAgICAgJ2NvbnRhaW5lcklkJzogJ2NoYXJ0NCcsCisgICAgICAgICAgJ29wdGlvbnMnOiB7CisgICAgICAgICAgICAnd2lkdGgnOiAzMDAsCisgICAgICAgICAgICAnaGVpZ2h0JzogMzAwLAorICAgICAgICAgICAgJ3RpdGxlJzogJ05ldHdvcmstd2lkZSB1c2FnZScsCisJCQkncGFnZXMnOiB0cnVlLAorCQkJJ251bVJvd3MnOiA5CisgICAgICAgICAgfSwKKyAgICAgICAgICAndmlldyc6IHsnY29sdW1ucyc6IFswLCAxLCAyXX0KKyAgICAgICAgfSk7CisgICAgICAgIGxpbmVDaGFydC5zZXREYXRhVGFibGUoZHQpOworICAgICAgICBsaW5lQ2hhcnQuZHJhdygpOworCQkvKgorCQl2YXIgc2NhdHRlckNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNoYXJ0V3JhcHBlcih7CisgICAgICAgICAgJ2NoYXJ0VHlwZSc6ICdTY2F0dGVyQ2hhcnQnLAorICAgICAgICAgICdjb250YWluZXJJZCc6ICdjaGFydDUnLAorICAgICAgICAgICdvcHRpb25zJzogeworICAgICAgICAgICAgJ3dpZHRoJzogMzAwLAorICAgICAgICAgICAgJ2hlaWdodCc6IDMwMCwKKyAgICAgICAgICB9LAorICAgICAgICAgIC8vIGZyb20gdGhlICdkYXRhJyBEYXRhVGFibGUuCisgICAgICAgICAgJ3ZpZXcnOiB7J2NvbHVtbnMnOiBbMSwgMl19CisgICAgICAgIH0pOworCQlzY2F0dGVyQ2hhcnQuc2V0RGF0YVRhYmxlKGR0KTsKKwkJc2NhdHRlckNoYXJ0LmRyYXcoKTsqLworfQorZnVuY3Rpb24gc2hvd1NpdGVBZ2coZHQpIHsKKwkJdmFyIGJhckNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNoYXJ0V3JhcHBlcih7CisgICAgICAgICAgJ2NoYXJ0VHlwZSc6ICdDb2x1bW5DaGFydCcsCisgICAgICAgICAgJ2NvbnRhaW5lcklkJzogJ2NoYXJ0MScsCisgICAgICAgICAgJ29wdGlvbnMnOiB7CisgICAgICAgICAgICAnd2lkdGgnOiAzMDAsCisgICAgICAgICAgICAnaGVpZ2h0JzogMzAwLAorICAgICAgICAgICAgJ3RpdGxlJzogJ1NpdGUtd2lzZSB1c2FnZScsCisJCQkncGFnZXMnOiB0cnVlLAorCQkJJ251bVJvd3MnOiA5CisgICAgICAgICAgfSwKKyAgICAgICAgICAvLyBJbnN0cnVjdCB0aGUgcGllY2hhcnQgdG8gdXNlIGNvbHVtcyAwIChOYW1lKSBhbmQgMyAoRG9udXRzIEVhdGVuKQorICAgICAgICAgIC8vIGZyb20gdGhlICdkYXRhJyBEYXRhVGFibGUuCisgICAgICAgICAgJ3ZpZXcnOiB7J2NvbHVtbnMnOiBbMSwgMiwgM119CisgICAgICAgIH0pOworICAgICAgICBiYXJDaGFydC5zZXREYXRhVGFibGUoZHQpOworICAgICAgICBiYXJDaGFydC5kcmF3KCk7CisJCXZhciBnZW9DaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5DaGFydFdyYXBwZXIoeworICAgICAgICAgICdjaGFydFR5cGUnOiAnR2VvQ2hhcnQnLAorICAgICAgICAgICdjb250YWluZXJJZCc6ICdjaGFydDInLAorICAgICAgICAgICdvcHRpb25zJzogeworICAgICAgICAgICAgJ3dpZHRoJzogMzAwLAorICAgICAgICAgICAgJ2hlaWdodCc6IDMwMCwKKwkJCSdkaXNwbGF5TW9kZSc6ICdtYXJrZXJzJywKKwkJCSdyZWdpb24nOicwMjEnLAorICAgICAgICAgICAgJ3RpdGxlJzogJ1VzYWdlIG1hcCcsCisgICAgICAgIAljb2xvckF4aXM6IHtjb2xvcnM6IFsnZ3JlZW4nLCAncHVycGxlJywgJ3JlZCddfQorICAgICAgICAgIH0sCisgICAgICAgICAgLy8gSW5zdHJ1Y3QgdGhlIHBpZWNoYXJ0IHRvIHVzZSBjb2x1bXMgMCAoTmFtZSkgYW5kIDMgKERvbnV0cyBFYXRlbikKKyAgICAgICAgICAvLyBmcm9tIHRoZSAnZGF0YScgRGF0YVRhYmxlLgorICAgICAgICAgICd2aWV3Jzogeydjb2x1bW5zJzogWzAsIDIsM119CisgICAgICAgIH0pOworCQlnZW9DaGFydC5zZXREYXRhVGFibGUoZHQpOworCQlnZW9DaGFydC5kcmF3KCk7CisJCisJCXZhciBoaXN0b2dyYW0gPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ2hhcnRXcmFwcGVyKHsKKyAgICAgICAgICAnY2hhcnRUeXBlJzogJ0hpc3RvZ3JhbScsCisgICAgICAgICAgJ2NvbnRhaW5lcklkJzogJ2NoYXJ0NicsCisgICAgICAgICAgJ29wdGlvbnMnOiB7CisgICAgICAgICAgICAnd2lkdGgnOiAzMDAsCisgICAgICAgICAgICAnaGVpZ2h0JzogMzAwLAorICAgICAgICAgIH0sCisJCSAgJ3RpdGxlJzogJ1NpdGVzIGJ5IGxvYWQnLAorICAgICAgICAgIC8vIEluc3RydWN0IHRoZSBwaWVjaGFydCB0byB1c2UgY29sdW1zIDAgKE5hbWUpIGFuZCAzIChEb251dHMgRWF0ZW4pCisgICAgICAgICAgLy8gZnJvbSB0aGUgJ2RhdGEnIERhdGFUYWJsZS4KKyAgICAgICAgICAndmlldyc6IHsnY29sdW1ucyc6IFsxLCAyXX0KKyAgICAgICAgfSk7CisJCWhpc3RvZ3JhbS5zZXREYXRhVGFibGUoZHQpOworCQloaXN0b2dyYW0uZHJhdygpOworCQkKK30KKworZnVuY3Rpb24gaGFuZGxlUmVzcG9uc2UocmVzcG9uc2UpIHsKK3ZhciBzdXBwb3J0ZWRDbGFzc2VzID0geworCQknVGFibGUnOmdvb2dsZS52aXN1YWxpemF0aW9uLlRhYmxlLAorCQknTGluZUNoYXJ0Jzpnb29nbGUudmlzdWFsaXphdGlvbi5MaW5lQ2hhcnQsCisJCSdTY2F0dGVyQ2hhcnQnOmdvb2dsZS52aXN1YWxpemF0aW9uLlNjYXR0ZXJDaGFydCwKKwkJJ0NvbHVtbkNoYXJ0Jzpnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydCwKKwkJJ0dlb0NoYXJ0Jzpnb29nbGUudmlzdWFsaXphdGlvbi5HZW9DaGFydCwKKwkJJ1BpZUNoYXJ0Jzpnb29nbGUudmlzdWFsaXphdGlvbi5QaWVDaGFydCwKKwkJJ0hpc3RvZ3JhbSc6Z29vZ2xlLnZpc3VhbGl6YXRpb24uSGlzdG9ncmFtCisJfTsKKworCS8qdmFyIHNsaWRlcjIgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29udHJvbFdyYXBwZXIoeworICAgICdjb250cm9sVHlwZSc6ICdOdW1iZXJSYW5nZUZpbHRlcicsCisgICAgJ2NvbnRhaW5lcklkJzogJ2NvbnRyb2wzJywKKyAgICAnb3B0aW9ucyc6IHsKKyAgICAgICdmaWx0ZXJDb2x1bW5MYWJlbCc6ICdDcHUnLAorICAgICAgbWluVmFsdWU6IDAsCisgICAgICBtYXhWYWx1ZTogMTAwLAorCSAgdWk6IHsgdGlja3M6IDEwfQorICAgIH0KKyAgfSk7Ki8KKworICB2YXIgdGltZVNsaWRlciA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db250cm9sV3JhcHBlcih7CisgICAgJ2NvbnRyb2xUeXBlJzogJ051bWJlclJhbmdlRmlsdGVyJywKKyAgICAnY29udGFpbmVySWQnOiAnY29udHJvbDEnLAorICAgICdvcHRpb25zJzogeworICAgICAgJ2ZpbHRlckNvbHVtbkxhYmVsJzogJ1RpbWUnLAorCSAgdWk6IHsgdGlja3M6IDEwfQorICAgIH0KKyAgfSk7CisKKyAgLy8gRGVmaW5lIGEgYmFyIGNoYXJ0CisgIHZhciBiYXJDaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5DaGFydFdyYXBwZXIoeworICAgICdjaGFydFR5cGUnOiAnQmFyQ2hhcnQnLAorICAgICdjb250YWluZXJJZCc6ICdjaGFydDEnLAorICAgICdvcHRpb25zJzogeworICAgICAgJ3dpZHRoJzogNDAwLAorICAgICAgJ2hlaWdodCc6IDMwMCwKKyAgICAgICdoQXhpcyc6IHsnbWluVmFsdWUnOiAwLCAnbWF4VmFsdWUnOiA2MH0sCisgICAgICAnY2hhcnRBcmVhJzoge3RvcDogMCwgcmlnaHQ6IDAsIGJvdHRvbTogMH0KKyAgICB9CisgIH0pOworCisJdmFyIGNhdGVnb3J5UGlja2VyID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbnRyb2xXcmFwcGVyKHsKKyAgICAgICAgICAnY29udHJvbFR5cGUnOiAnQ2F0ZWdvcnlGaWx0ZXInLAorICAgICAgICAgICdhbGxvd011bHRpcGxlJzogdHJ1ZSwKKyAgICAgICAgICAnY29udGFpbmVySWQnOiAnY29udHJvbDInLAorICAgICAgICAgICdvcHRpb25zJzogeworICAgICAgICAgICAgJ2ZpbHRlckNvbHVtbkxhYmVsJzogJ1NpdGUnLAorICAgICAgICAgICAgJ3VpJzogeworICAgICAgICAgICAgJ2xhYmVsU3RhY2tpbmcnOiAndmVydGljYWwnLAorICAgICAgICAgICAgICAnYWxsb3dUeXBpbmcnOiBmYWxzZQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSk7CisJLy92YXIgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RhdGF0YWJsZScpOworCS8vdmFyIHRhYmxlID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkxpbmVDaGFydChjb250YWluZXIpOworCS8vdmFyIHRhYmxlID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGNvbnRhaW5lcik7CisKKwl2YXIgcHJveHkgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ2hhcnRXcmFwcGVyKHsKKyAgICAgICAgICAnY2hhcnRUeXBlJzogJ1RhYmxlJywKKyAgICAgICAgICAnY29udGFpbmVySWQnOiAnY2hhcnQ3JywKKyAgICAgICAgICAnb3B0aW9ucyc6IHsKKyAgICAgICAgICAgICd3aWR0aCc6IDgwMCwKKyAgICAgICAgICAgICdoZWlnaHQnOiAzMDAsCisJCQlwYWdlU2l6ZTo1LAorCQkJcGFnZTonZW5hYmxlJywKKyAgICAgICAgICAgICdsZWdlbmQnOiAnbm9uZScsCisgICAgICAgICAgICAndGl0bGUnOiAnTm9kZXMnCisgICAgICAgICAgfSwKKyAgICAgICAgICAvLyBJbnN0cnVjdCB0aGUgcGllY2hhcnQgdG8gdXNlIGNvbHVtcyAwIChOYW1lKSBhbmQgMyAoRG9udXRzIEVhdGVuKQorICAgICAgICAgIC8vIGZyb20gdGhlICdkYXRhJyBEYXRhVGFibGUuCisgICAgICAgICAgJ3ZpZXcnOiB7J2NvbHVtbnMnOiBbMCwxLDIsMyw0LDVdfQorICAgICAgICB9KTsKKworCWZ1bmN0aW9uIGNvcmVfc3VtKGFycikgeworCQl2YXIgcmV0ID0gMDsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsKKwkJCXJldCs9YXJyW2ldLzEwMDA7CisJCX0KKwkJcmV0dXJuIHJldDsKKwl9CisKKwlmdW5jdGlvbiBzY2FsZWRfc3VtKGFycikgeworCQl2YXIgcmV0ID0gMDsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsKKwkJCXJldCs9YXJyW2ldLzEwMDA7CisJCX0KKwkJcmV0dXJuIHJldDsKKwl9CisKKwlmdW5jdGlvbiBjb3VudF91bmlxKGFycikgeworCQl2YXIgY291bnRzID0ge307CisJCXZhciByZXQgPSAwOworCQljb25zb2xlLmxvZygnU3RhcnRpbmcgcmV0ICcrcmV0KTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsKKwkJCQlpZiAoIWNvdW50c1thcnJbaV1dKSByZXQrPTE7CisJCQkgICAgY291bnRzW2FycltpXV0gPSAxOworCQl9CisJCXJldHVybiByZXQ7CisJfQorCWdvb2dsZS52aXN1YWxpemF0aW9uLmV2ZW50cy5hZGRMaXN0ZW5lcihwcm94eSwgJ3JlYWR5JywgZnVuY3Rpb24gKCkgeworICAgICAgICAvLyAwIC0gdGltZSAxIC0gY2l0eSAyIC0gbm9kZSAzIC0gc2l0ZSA0IC0gY3B1IDUgLSBieXRlcworICAgICAgICB2YXIgZHQgPSBwcm94eS5nZXREYXRhVGFibGUoKTsKKwkJdmFyIGdyb3VwZWREYXRhMSA9IGdvb2dsZS52aXN1YWxpemF0aW9uLmRhdGEuZ3JvdXAoZHQsIFswXSwgW3sKKyAgICAgICAgICAgIGNvbHVtbjogNCwKKyAgICAgICAgICAgIHR5cGU6ICdudW1iZXInLAorICAgICAgICAgICAgbGFiZWw6IGR0LmdldENvbHVtbkxhYmVsKDQpLAorICAgICAgICAgICAgYWdncmVnYXRpb246IGdvb2dsZS52aXN1YWxpemF0aW9uLmRhdGEuc3VtCisgICAgICAgIH0seworCQkJY29sdW1uOiA1LAorICAgICAgICAgICAgdHlwZTogJ251bWJlcicsCisgICAgICAgICAgICBsYWJlbDogZHQuZ2V0Q29sdW1uTGFiZWwoNSksCisgICAgICAgICAgICBhZ2dyZWdhdGlvbjogZ29vZ2xlLnZpc3VhbGl6YXRpb24uZGF0YS5zdW0KKwkJfV0pOworCisgICAgICAgIHNob3dTaXRlVGltZUFnZyhncm91cGVkRGF0YTEpOworICAgIH0pOworCisJLypnb29nbGUudmlzdWFsaXphdGlvbi5ldmVudHMuYWRkTGlzdGVuZXIocHJveHksICdyZWFkeScsIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgLy8gMCAtIHRpbWUgMSAtIGNpdHkgMiAtIG5vZGUgMyAtIHNpdGUgNCAtIGNwdSA1IC0gYnl0ZXMKKyAgICAgICAgdmFyIGR0ID0gcHJveHkuZ2V0RGF0YVRhYmxlKCk7CisgICAgICAgIHZhciBncm91cGVkRGF0YTAgPSBnb29nbGUudmlzdWFsaXphdGlvbi5kYXRhLmdyb3VwKGR0LCBbMl0sIFt7CisgICAgICAgICAgICBjb2x1bW46IDQsCisgICAgICAgICAgICB0eXBlOiAnbnVtYmVyJywKKyAgICAgICAgICAgIGxhYmVsOiBkdC5nZXRDb2x1bW5MYWJlbCg0KSwKKyAgICAgICAgICAgIGFnZ3JlZ2F0aW9uOiBnb29nbGUudmlzdWFsaXphdGlvbi5kYXRhLnN1bQorICAgICAgICB9LHsKKwkJCWNvbHVtbjogNSwKKyAgICAgICAgICAgIHR5cGU6ICdudW1iZXInLAorICAgICAgICAgICAgbGFiZWw6IGR0LmdldENvbHVtbkxhYmVsKDUpLAorICAgICAgICAgICAgYWdncmVnYXRpb246IGdvb2dsZS52aXN1YWxpemF0aW9uLmRhdGEuc3VtCisJCX1dKTsKKyAgICAgICAgLy8gYWZ0ZXIgZ3JvdXBpbmcsIHRoZSBkYXRhIHdpbGwgYmUgc29ydGVkIGJ5IGNvbHVtbiAwLCB0aGVuIDEsIHRoZW4gMgorICAgICAgICAvLyBpZiB5b3Ugd2FudCBhIGRpZmZlcmVudCBvcmRlciwgeW91IGhhdmUgdG8gcmUtc29ydAorCQlzaG93Tm9kZUFnZyhncm91cGVkRGF0YTApOworCQl9KTsqLworCisJZ29vZ2xlLnZpc3VhbGl6YXRpb24uZXZlbnRzLmFkZExpc3RlbmVyKHByb3h5LCAncmVhZHknLCBmdW5jdGlvbiAoKSB7CisgICAgICAgIC8vIDAgLSB0aW1lIDEgLSBjaXR5IDIgLSBub2RlIDMgLSBzaXRlIDQgLSBjcHUgNSAtIGJ5dGVzCisgICAgICAgIHZhciBkdCA9IHByb3h5LmdldERhdGFUYWJsZSgpOworICAgICAgICB2YXIgZ3JvdXBlZERhdGEwID0gZ29vZ2xlLnZpc3VhbGl6YXRpb24uZGF0YS5ncm91cChkdCwgWzEsM10sIFt7CisgICAgICAgICAgICBjb2x1bW46IDQsCisgICAgICAgICAgICB0eXBlOiAnbnVtYmVyJywKKyAgICAgICAgICAgIGxhYmVsOiAnQ29yZXMnLAorICAgICAgICAgICAgYWdncmVnYXRpb246IGNvcmVfc3VtCisgICAgICAgIH0seworCQkJY29sdW1uOiA1LAorICAgICAgICAgICAgdHlwZTogJ251bWJlcicsCisgICAgICAgICAgICBsYWJlbDogZHQuZ2V0Q29sdW1uTGFiZWwoNSksCisgICAgICAgICAgICBhZ2dyZWdhdGlvbjogc2NhbGVkX3N1bQorCQl9XSk7CisgICAgICAgIC8vIGFmdGVyIGdyb3VwaW5nLCB0aGUgZGF0YSB3aWxsIGJlIHNvcnRlZCBieSBjb2x1bW4gMCwgdGhlbiAxLCB0aGVuIDIKKyAgICAgICAgLy8gaWYgeW91IHdhbnQgYSBkaWZmZXJlbnQgb3JkZXIsIHlvdSBoYXZlIHRvIHJlLXNvcnQKKwkJc2hvd1NpdGVBZ2coZ3JvdXBlZERhdGEwKTsKKyAgICAgICAgICAgIH0pOworCisJZGF0YSA9IHJlc3BvbnNlLmdldERhdGFUYWJsZSgpOworCW5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXNoYm9hcmQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hib2FyZCcpKS4KKyAgICAgICAgICAgIC8vIEVzdGFibGlzaCBiaW5kaW5ncywgZGVjbGFyaW5nIHRoZSBib3RoIHRoZSBzbGlkZXIgYW5kIHRoZSBjYXRlZ29yeQorICAgICAgICAgICAgLy8gcGlja2VyIHdpbGwgZHJpdmUgYm90aCBjaGFydHMuCisgICAgICAgICAgICBiaW5kKFtjYXRlZ29yeVBpY2tlcix0aW1lU2xpZGVyXSwgW3Byb3h5XSkuCisgICAgICAgICAgICAvLyBEcmF3IHRoZSBlbnRpcmUgZGFzaGJvYXJkLgorICAgICAgICAgICAgZHJhdyhkYXRhKTsKKworfQorZnVuY3Rpb24gc2VuZEFuZERyYXcocXVlcnlTdHJpbmcpIHsKKwlxdWVyeSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5RdWVyeShxdWVyeVN0cmluZykKKwlxdWVyeSAmJiBxdWVyeS5hYm9ydCgpOworCXF1ZXJ5LnNlbmQoZnVuY3Rpb24ocmVzcG9uc2UpIHtoYW5kbGVSZXNwb25zZShyZXNwb25zZSk7fSk7Cit9CisgICAgICAKKworICAgIDwvc2NyaXB0PgorICAgIDxkaXYgaWQ9ImRhc2hib2FyZCIgY2xhc3M9ImNvbnRhaW5lciI+CisJCTxkaXYgY2xhc3M9InJvdyI+CisJCQk8ZGl2IGNsYXNzPSJjb2wtbWQtOCI+CisJCQkJPGRpdiBjbGFzcz0iY29sLW1kLTQiIGlkPSJjb250cm9sMiI+PC9kaXY+CisJCQkJPGRpdiBjbGFzcz0iY29sLW1kLTQiIGlkPSJjb250cm9sMSI+PC9kaXY+CisJCQkJPCEtLTxkaXYgY2xhc3M9ImNvbC1tZC00IiBpZD0iY29udHJvbDMiPjwvZGl2Pi0tPgorCQkJPC9kaXY+CisJCTwvZGl2PgorCQk8ZGl2IGNsYXNzPSJyb3ciPgorCQkJPGRpdiBjbGFzcz0iY29sLW1kLTgiPgorCQkJCTxkaXYgY2xhc3M9ImNvbC1tZC00IiBpZD0iY2hhcnQxIj4KKwkJCQk8L2Rpdj4KKwkJCQk8ZGl2IGNsYXNzPSJjb2wtbWQtNCIgaWQ9ImNoYXJ0MiI+CisJCQkJPC9kaXY+CisJCQkJPCEtLQorCQkJCTxkaXYgY2xhc3M9ImNvbC1tZC00IiBpZD0iY2hhcnQzIj4KKwkJCQk8L2Rpdj4tLT4KKwkJCTwvZGl2PgorCQk8L2Rpdj4KKwkJPGRpdiBjbGFzcz0icm93Ij4KKwkJCTxkaXYgY2xhc3M9ImNvbC1tZC04Ij4KKwkJCQk8ZGl2IGNsYXNzPSJjb2wtbWQtNCIgaWQ9ImNoYXJ0NCI+CisJCQkJPC9kaXY+CisJCQkJPCEtLQorCQkJCTxkaXYgY2xhc3M9ImNvbC1tZC00IiBpZD0iY2hhcnQ1Ij4KKwkJCQk8L2Rpdj4tLT4KKwkJCQk8ZGl2IGNsYXNzPSJjb2wtbWQtNCIgaWQ9ImNoYXJ0NiI+CisJCQkJPC9kaXY+CisJCQk8L2Rpdj4KKwkJPC9kaXY+CisgICAgPC9kaXY+CisJPGRpdiBpZD0iY2hhcnQ3IiBzdHlsZT0iZGlzcGxheTpub25lIj48L2Rpdj4KZGlmZiAtLWdpdCBhL3BsYW5ldHN0YWNrL3RlbXBsYXRlcy9hZG1pbi9kYXNoYm9hcmQvd2VsY29tZS5odG1sIGIvcGxhbmV0c3RhY2svdGVtcGxhdGVzL2FkbWluL2Rhc2hib2FyZC93ZWxjb21lLmh0bWwKaW5kZXggOGRmNWYxMC4uMzA2NDY3YSAxMDA2NDQKLS0tIGEvcGxhbmV0c3RhY2svdGVtcGxhdGVzL2FkbWluL2Rhc2hib2FyZC93ZWxjb21lLmh0bWwKKysrIGIvcGxhbmV0c3RhY2svdGVtcGxhdGVzL2FkbWluL2Rhc2hib2FyZC93ZWxjb21lLmh0bWwKQEAgLTIsNTEgKzIsMTg3IEBACiB7JSBsb2FkIGFkbWluX3N0YXRpYyAlfQogCiB7JSBibG9jayBjb250ZW50ICV9Ci08aDE+V2VsY29tZSA8YSBocmVmPSJjb3JlL3VzZXIve3t1c2VyLmlkfX0iPnt7dXNlci5lbWFpbH19PC9hPiBmcm9tIFNpdGU6IDxhIGhyZWY9ImNvcmUvc2l0ZS97e3NpdGUuaWR9fSI+e3tzaXRlfX08L2E+PC9oMT4KLTx0YWJsZSBjbGFzcz0idGFibGUgdGFibGUtc3RyaXBlZCB0YWJsZS1ib3JkZXJlZCB0YWJsZS1ob3ZlciB0YWJsZS1jb25kZW5zZWQiPgotPHRoZWFkPjx0cj4KLTx0aCBjbGFzcz0ic29ydGFibGUiPlNsaWNlczwvdGg+PHRoIGNsYXNzPSJzb3J0YWJsZSI+UHJpdmlsZWdlPC90aD4KLTx0aCBjbGFzcz0ic29ydGFibGUiPlJlc2VydmF0aW9uczwvdGg+Ci08L3RyPjwvdGhlYWQ+Ci17JSBmb3IgZW50cnkgaW4gdXNlclNsaWNlSW5mbyAlfQotPHRyPjx0ZD4gPGEgaHJlZj0iY29yZS9zbGljZS97e2VudHJ5LnNsaWNlLmlkfX0iPnt7ZW50cnkuc2xpY2UubmFtZX19PC9hPjxicj4KLTwvdGQ+PHRkPnt7ZW50cnkucm9sZX19PC90ZD4KLXslIGlmIGVudHJ5LnJlc2VydmF0aW9ucyAlfQotPHRkPjxhIGhyZWY9ImNvcmUvc2xpY2Uve3tlbnRyeS5zbGljZS5pZH19LyNyZXNlcnZhdGlvbnMiPgoteyUgZm9yIHJlc1Nsb3QgaW4gZW50cnkucmVzZXJ2YXRpb25zLjEgJX0KLXt7cmVzU2xvdH19IDxicj4KLXslIGVuZGZvciAlfQotPC9hPjwvdGQ+PC90cj4KLXslIGVsc2UgJX0KLTx0ZD48L3RkPjwvdHI+Ci17JSBlbmRpZiAlfQoteyUgZW5kZm9yICV9Ci08L3RhYmxlPgotPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ieyUgc3RhdGljICdsb2c0amF2YXNjcmlwdC0xLjQuNi9sb2c0amF2YXNjcmlwdC5qcycgJX0iPjwvc2NyaXB0PgotPGRpdiBpZD0iSFBDRGFzaGJvYXJkIj4KLSAgICA8aDE+SFBDIERhc2hib2FyZDwvaDE+Ci0gICAgPHNwYW4gaWQ9ImhwY1N1bW1hcnkiPgotICAgICAgICA8c3BhbiBjbGFzcz0ic3VtbWFyeS1hdHRyIj48Yj5BY3RpdmUgU2xpdmVyczo8L2I+IDc4IDwvc3Bhbj4KLSAgICAgICAgPHNwYW4gY2xhc3M9InN1bW1hcnktYXR0ciI+PGI+T3ZlcmFsbCBUaHJvdWdocHV0OjwvYj4gNThHYnBzPC9zcGFuPgotICAgICAgICA8c3BhbiBjbGFzcz0ic3VtbWFyeS1hdHRyLXV0aWwiPjxiPkNQVSBVdGlsaXphdGlvbjo8L2I+IDQ1JTwvc3Bhbj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgIGhyZWY9Imh0dHA6Ly9hamF4LmFzcG5ldGNkbi5jb20vYWpheC9qcXVlcnkuZGF0YVRhYmxlcy8xLjkuMC9jc3MvanF1ZXJ5LmRhdGFUYWJsZXMuY3NzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InslIHN0YXRpYyAnc3VpdC9jc3Mvc3VpdC5jc3MnICV9IiBtZWRpYT0iYWxsIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Imh0dHA6Ly9hamF4LmFzcG5ldGNkbi5jb20vYWpheC9qcXVlcnkuZGF0YVRhYmxlcy8xLjkuMC9jc3MvanF1ZXJ5LmRhdGFUYWJsZXNfdGhlbWVyb2xsZXIuY3NzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InslIHN0YXRpYyAncGxhbmV0c3RhY2suY3NzJyAlfSIgbWVkaWE9ImFsbCI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHA6Ly9jb2RlLmpxdWVyeS5jb20vdWkvMS4xMC40L3RoZW1lcy9zbW9vdGhuZXNzL2pxdWVyeS11aS5jc3MiPgogCi0gICAgPC9zcGFuPgotICAgIDxkaXYgaWQ9Im1hcC11cyIgPjwvZGl2PgotPC9kaXY+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHA6Ly9jZG4ubGVhZmxldGpzLmNvbS9sZWFmbGV0LTAuNy4yL2xlYWZsZXQuY3NzIiAvPgogPHNjcmlwdCBzcmM9Imh0dHA6Ly9jZG4ubGVhZmxldGpzLmNvbS9sZWFmbGV0LTAuNy4yL2xlYWZsZXQuanMiPjwvc2NyaXB0PgogCi08c2NyaXB0IHNyYz0ieyUgc3RhdGljICdqcy9MZWFmbGV0Lk1ha2lNYXJrZXJzLmpzJyAlfSIgPiA8L3NjcmlwdD4KIAorPCEtLSBubyBuZWVkIHRvIGluY2x1ZGUganF1ZXJ5IGhlcmUgYXMgaXQncyBhbHJlYWR5IGluY2x1ZGVkIGJ5IGJhc2UuaHRtbC4gSW5jbHVkaW5nIGl0IG11bHRpcGxlIHRpbWVzIHdpbGwgYnJlYWsgbXR1aXR5IHN0YXRpc3RpY3MuIC0tPgorPCEtLSBzcmM9Imh0dHA6Ly9jb2RlLmpxdWVyeS5jb20vanF1ZXJ5LTEuOS4xLmpzIiAtLT4KKworPHNjcmlwdCBzcmM9Imh0dHA6Ly9jb2RlLmpxdWVyeS5jb20vdWkvMS4xMC40L2pxdWVyeS11aS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iaHR0cDovL2FqYXguYXNwbmV0Y2RuLmNvbS9hamF4L2pxdWVyeS5kYXRhVGFibGVzLzEuOS40L2pxdWVyeS5kYXRhVGFibGVzLm1pbi5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ7JSBzdGF0aWMgJ2xvZzRqYXZhc2NyaXB0LTEuNC42L2xvZzRqYXZhc2NyaXB0LmpzJyAlfSI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ieyUgc3RhdGljICdqcy9MZWFmbGV0Lk1ha2lNYXJrZXJzLmpzJyAlfSIgPiA8L3NjcmlwdD4KKyAgCis8c2NyaXB0PgorICAkKGZ1bmN0aW9uKCkgeworICAgICQoICIjdGFicyIgKS50YWJzKHthY3RpdmU6IDAKKyAgICAgIC8vY29sbGFwc2libGU6IHRydWUKKyAgICB9KTsKKyAgfSk7Cis8L3NjcmlwdD4KIDxzY3JpcHQ+CiAKK2Z1bmN0aW9uIGNvbmZpcm1EaWFsb2codGl0bGUsbXNnKSB7CisgICAgdmFyIGRpYWxvZyA9ICQoJzxkaXY+Jyttc2crJzwvZGl2PicpOworICAgIHZhciBkZWYgPSAkLkRlZmVycmVkKCk7CisKKyAgICAkKGRpYWxvZykuZGlhbG9nKHsKKyAgICAgICAgcmVzaXphYmxlOiBmYWxzZSwKKyAgICAgICAgdGl0bGU6IHRpdGxlLAorICAgICAgICBhdXRvT3BlbjogdHJ1ZSwKKyAgICAgICAgbW9kYWw6IHRydWUsCisgICAgICAgIGRpYWxvZ0NsYXNzOiAiZGFzaGJvYXJkLWhwYy1zbGl2ZXIiLAorICAgICAgICBidXR0b25zOiB7CisgICAgICAgICAgICAnT0snOiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICBkZWYucmVzb2x2ZSgpOworICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2hvc2UgdG8gYWRkIGEgc2xpdmVyIik7CisgICAgICAgICAgICAgICAgJCggdGhpcyApLmRpYWxvZyggImNsb3NlIiApOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICdDYW5jZWwnOiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICBkZWYucmVqZWN0KCk7CisgICAgICAgICAgICAgICAgJCggdGhpcyApLmRpYWxvZyggImNsb3NlIiApOworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBjbG9zZTogeworICAgICAgICB9CisgICAgfSk7CisgICAgcmV0dXJuIGRlZi5wcm9taXNlKCk7Cit9CisKKyAgPC9zY3JpcHQ+CisKKzxkaXYgaWQ9InRhYnMiIGNsYXNzPSJpbm5lci1jZW50ZXItY29sdW1uIHVpLXRhYnMgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwiPgorICA8dWwgaWQ9InN1aXRfZm9ybV90YWJzIiBjbGFzcz0ibmF2IG5hdi10YWJzIG5hdi10YWJzLXN1aXQiPgorICAgIDxsaSBjbGFzcz0iYWN0aXZlIj48YSBocmVmPSIjdGFicy0xIj5EZXZlbG9wZXIgVmlldzwvYT48L2xpPgorICAgIDxsaT48YSBocmVmPSIjdGFicy0yIj5DRE4gT3BlcmF0aW9ucyA8L2E+PC9saT4KKyAgICA8bGk+PGEgaHJlZj0iI3RhYnMtMyI+SGlzdG9yaWNhbDwvYT48L2xpPgorICAgIDxsaT48YSBocmVmPSIjdGFicy0zIj5UZW5hbnQ8L2E+PC9saT4KKyAgPC91bD4KKzxkaXYgaWQ9InRhYnMtMSI+Cis8L2Rpdj4KKzxkaXYgaWQ9InRhYnMtMiI+CisgICAgPGRpdiBpZD0iSFBDRGFzaGJvYXJkIj4KKyAgICA8aDE+Q0ROIE9wZXJhdGlvbnMgVmlldzwvaDE+CisgICAgPHNwYW4gaWQ9ImhwY1N1bW1hcnkiPgorICAgICAgICA8c3BhbiBjbGFzcz0ic3VtbWFyeS1hdHRyIj48Yj5BY3RpdmUgU2xpdmVyczo8L2I+IDxzcGFuIGlkPSJhY3RpdmUtc2xpdmVycy12YWx1ZSI+IDwvc3Bhbj4gPC9zcGFuPgorICAgICAgICA8c3BhbiBjbGFzcz0ic3VtbWFyeS1hdHRyIj48Yj5PdmVyYWxsIFRocm91Z2hwdXQ6PC9iPiA8c3BhbiBpZD0ib3ZlcmFsbC10aHJvdWdocHV0LXZhbHVlIj4gPC9zcGFuPiAgPC9zcGFuPgorICAgICAgICA8c3BhbiBjbGFzcz0ic3VtbWFyeS1hdHRyLXV0aWwiPjxiPkF2ZXJhZ2UgQ1BVIFV0aWxpemF0aW9uOjwvYj4gPHNwYW4gaWQ9ImNwdS11dGlsaXphdGlvbi12YWx1ZSI+IDwvc3Bhbj4gIDwvc3Bhbj4KKyAgICA8L3NwYW4+CisgICAgPGRpdiBpZD0ibWFwLXVzIiA+PC9kaXY+CisgICAgPGRpdiBzdHlsZT0ibGluZS1oZWlnaHQ6IDMwJSI+PGJyPjwvZGl2Pjx0YWJsZSBib3JkZXI9MD48dHI+CisgICAgPHRkPkxlYXN0IExvYWRlZCZuYnNwOyZuYnNwOzwvdGQ+CisgICAgPHRkIGJnY29sb3I9IiMwMDAwRkYiIHdpZHRoPTQwPiZuYnNwOzwvdGQ+CisgICAgPHRkIGJnY29sb3I9IiMwMEZGRkYiIHdpZHRoPTQwPiZuYnNwOzwvdGQ+CisgICAgPHRkIGJnY29sb3I9IiMwMEZGMDAiIHdpZHRoPTQwPiZuYnNwOzwvdGQ+CisgICAgPHRkIGJnY29sb3I9IiNGRkZGMDAiIHdpZHRoPTQwPiZuYnNwOzwvdGQ+CisgICAgPHRkIGJnY29sb3I9IiNGRjAwMDAiIHdpZHRoPTQwPiZuYnNwOzwvdGQ+CisgICAgPHRkPiZuYnNwOyZuYnNwO01vc3QgTG9hZGVkPC90ZD4KKyAgICA8L3RyPjwvdGFibGU+CisgICAgPC9kaXY+Cis8L2Rpdj4KKzxkaXYgaWQ9InRhYnMtMyI+Cit7JSBpbmNsdWRlICIvb3B0L3BsYW5ldHN0YWNrL3RlbXBsYXRlcy9hZG1pbi9kYXNoYm9hcmQvaHBjX2hpc3RvcmljYWwuaHRtbCIgJX0KKzwvZGl2PgorPC9kaXY+CisKKzxzY3JpcHQ+Cit2YXIgb1RhYmxlOwogdmFyIGNvbnNvbGVBcHBlbmRlciA9IG5ldyBsb2c0amF2YXNjcmlwdC5Ccm93c2VyQ29uc29sZUFwcGVuZGVyKCk7CiB2YXIgcGF0dGVybkxheW91dCA9IG5ldyBsb2c0amF2YXNjcmlwdC5QYXR0ZXJuTGF5b3V0KCIlZHtISDptbTpzcyxTU1N9ICVse3M6bH0gJS01cCAtICVtezF9JW4iKTsKIGNvbnNvbGVBcHBlbmRlci5zZXRMYXlvdXQocGF0dGVybkxheW91dCk7CiAKKy8vdmFyIGxvZyAgPSBsb2c0amF2YXNjcmlwdC5nZXREZWZhdWx0TG9nZ2VyKCk7CiB2YXIgbG9nICA9IGxvZzRqYXZhc2NyaXB0LmdldFJvb3RMb2dnZXIoKTsKIGxvZy5hZGRBcHBlbmRlcihjb25zb2xlQXBwZW5kZXIpOwotbG9nLnNldExldmVsKGxvZzRqYXZhc2NyaXB0LkxldmVsLkFMTCk7Citsb2cuc2V0TGV2ZWwobG9nNGphdmFzY3JpcHQuTGV2ZWwuRVJST1IpOworCitmdW5jdGlvbiB1cGRhdGVVc2VyU2xpY2VUYWJsZSgpeworICAgIGxvZy5kZWJ1ZygiU2hvdWxkIGdyYWIgdXNlciBzbGljZSBpbmZvIik7CisgICAgalF1ZXJ5LmFqYXgoeworICAgICAgICBhc3luYzp0cnVlLAorICAgICAgICBkYXRhVHlwZTogJ2pzb24nLAorICAgICAgICB1cmw6ICcvaHBjZGFzaHVzZXJzbGljZXMnLAorICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihkYXRhKXsKKyAgICAgICAgICAgIGxvZy5pbmZvKCJHb3QgRGF0YSBiYWNrIGZvciBVc2VyIFNsaWNlVGFibGUiKTsKKyAgICAgICAgICAgIC8vcGFyc2VEYXRhKGRhdGEpOworICAgICAgICAgICAgLy9jcmVhdGVVc2VyU2xpY2VUYWJsZShkYXRhKTsKKyAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyB1cGRhdGVVc2VyU2xpY2VUYWJsZSgpIH0sIDUwMDApOworICAgICAgICB9LAorICAgICAgICBlcnJvcjogZnVuY3Rpb24oZGF0YSl7CisgICAgICAgICAgICBsb2cuZGVidWcoIkNPVUxETlQgR0VUIERBVEEgQkFDSyIpOworICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHVwZGF0ZVVzZXJTbGljZVRhYmxlKCkgfSwgNTAwMCk7CisgICAgICAgIH0KKyAgICB9KTsKK30KKworZnVuY3Rpb24gY3JlYXRlVXNlclNsaWNlVGFibGUoZGF0YSkgeworICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgVXNlciBTbGljZSBUYWJsZSIpOworCisgICAgLy9BZGQgY2hlY2sgZm9yICNkeW5hbWljdXNlcnNsaWNlaW5mb19maWx0ZXIgbGFiZWwtPiBpbnB1dCBoYXZpbmcgZm9jdXMgaGVyZQorCisgICAgJCgnI3RhYnMtMScpLmh0bWwoICc8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiIGNsYXNzPSJkaXNwbGF5IiBpZD0iZHluYW1pY3VzZXJzbGljZWluZm8iPjwvdGFibGU+JyApOworICAgIHZhciBhY3R1YWxFbnRyaWVzID0gW107CisgICAgbG9nLmRlYnVnKGRhdGFbJ3VzZXJTbGljZUluZm8nXVsncm93cyddWzBdWydzbGljZW5hbWUnXSk7CisKKyAgICB2YXIgcm93cyA9IGRhdGFbJ3VzZXJTbGljZUluZm8nXVsncm93cyddOworICAgIGZvciAocm93IGluIHJvd3MpIHsKKyAgICAgICAgbG9nLmRlYnVnKHJvd1swXSk7CisgICAgICAgIHNsaWNlbmFtZSA9IHJvd3Nbcm93XVsnc2xpY2VuYW1lJ107CisgICAgICAgIHNsaWNlaWQgPSByb3dzW3Jvd11bJ3NsaWNlaWQnXTsKKyAgICAgICAgcm9sZSA9IHJvd3Nbcm93XVsncm9sZSddOworICAgICAgICBzbGl2ZXJjb3VudCA9IHJvd3Nbcm93XVsnc2xpdmVyY291bnQnXTsKKyAgICAgICAgc2l0ZWNvdW50ID0gcm93c1tyb3ddWydzaXRlY291bnQnXTsKKyAgICAgICAgYWN0dWFsRW50cmllcy5wdXNoKFsnPGEgaHJlZj0iaHR0cDovL3t7cmVxdWVzdC5nZXRfaG9zdH19L2FkbWluL2NvcmUvc2xpY2UvJyArIHNsaWNlaWQgKyAnIj4nICsgc2xpY2VuYW1lICsgJzwvYT4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGUsIHNsaXZlcmNvdW50LCBzaXRlY291bnRdKTsKKyAgICB9CisgICAgb1RhYmxlID0gJCgnI2R5bmFtaWN1c2Vyc2xpY2VpbmZvJykuZGF0YVRhYmxlKCB7CisgICAgICAgICJiSlF1ZXJ5VUkiOiB0cnVlLAorICAgICAgICAiYWFEYXRhIjogIGFjdHVhbEVudHJpZXMgLAorICAgICAgICAiYlN0YXRlU2F2ZSI6IHRydWUsCisgICAgICAgICJhb0NvbHVtbnMiOiBbCisgICAgICAgICAgICB7ICJzVGl0bGUiOiAiU2xpY2UiIH0sCisgICAgICAgICAgICB7ICJzVGl0bGUiOiAiUHJpdmlsZWdlIiAsIHNDbGFzczogImFsaWduQ2VudGVyIn0sCisgICAgICAgICAgICB7ICJzVGl0bGUiOiAiTnVtYmVyIG9mIFNsaXZlcnMiICwgc0NsYXNzOiAiYWxpZ25DZW50ZXIifSwKKyAgICAgICAgICAgIHsgInNUaXRsZSI6ICJOdW1iZXIgb2YgU2l0ZXMiICwgc0NsYXNzOiAiYWxpZ25DZW50ZXIifSwKKyAgICAgICAgXQorICAgIH0gKTsKKworICAgIC8vIElmIHRoZSBmaWx0ZXIgaGFkIGZvY3VzLCByZWFwcGx5IGhlcmUKKworICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CisgICAgICAgalF1ZXJ5LmFqYXgoeworICAgICAgICAgICB1cmw6ICcvaHBjZGFzaHVzZXJzbGljZXMnLAorICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLAorICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihkYXRhKXsgY3JlYXRlVXNlclNsaWNlVGFibGUoZGF0YSk7IH0sCisgICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbigpeyB9LAorICAgICAgIH0pOworICAgIH0sICAxMDAwMCk7Cit9CisKK2Z1bmN0aW9uIGluaXRUYWJsZSgpeworICAgIGxvZy5kZWJ1ZygiSW5pdGlhbGl6aW5nIFRhYmxlIikKKyAgICBqUXVlcnkuYWpheCh7CisgICAgICAgIHVybDogJy9ocGNkYXNodXNlcnNsaWNlcycsCisgICAgICAgIGRhdGFUeXBlOiAnanNvbicsCisgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpeyBjcmVhdGVVc2VyU2xpY2VUYWJsZShkYXRhKTsgfSwKKyAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKCl7CisgICAgICAgIH0KKyAgICB9KTsKKyAgICB1cGRhdGVVc2VyU2xpY2VUYWJsZSgpOworfQorCisKK2luaXRUYWJsZSgpOworCisvLyQoICIjZGlhbG9nYWRkIiApLmRpYWxvZyh7IGF1dG9PcGVuOiBmYWxzZSB9KTsKKy8vJCggIiNyZW1TbGl2ZXJkaWFsb2ciICkuZGlhbG9nKHsgYXV0b09wZW46IGZhbHNlIH0pOwogCiBMLk1hcCA9IEwuTWFwLmV4dGVuZCh7CiAgICAgb3BlblBvcHVwOiBmdW5jdGlvbihwb3B1cCkgewpAQCAtNjEsMjIgKzE5NywyOCBAQAogCiAvL0l0ZXJhdGUgdGhyb3VnaCBkYXRhIGFuZCBmaW5kIHRoZSBtYXgvbWluIGNvb3JkaW5hdGVzIHRvIGluY2x1ZGUgYWxsIG9mIG91ciBwb2ludHMgdG8gc3RhcnQKIHZhciBtYXAgPSBMLm1hcCgnbWFwLXVzJyk7IC8vLnNldFZpZXcoWzAsIDBdLCAxKTsKK21hcC5zY3JvbGxXaGVlbFpvb20uZGlzYWJsZSgpOwogCi1MLnRpbGVMYXllcignaHR0cDovL3tzfS50aWxlLmNsb3VkbWFkZS5jb20vQkM5QTQ5M0I0MTAxNENBQUJCOThGMDQ3MUQ3NTk3MDcvOTk3LzI1Ni97en0ve3h9L3t5fS5wbmcnLCB7CisvLworLy8gR3JlYXQgdGlsZXMsIGJ1dCBzdGFydGluZyB0byBvY2Nhc2lvbmFsbHkgc2VlIDQwMyBlcnJvcnMgb24gY2VydGFpbiB0aWxlcyBjYXVzaW5nIGdyZXkgb3V0IGVmZmVjdAorLy9MLnRpbGVMYXllcignaHR0cDovL3tzfS50aWxlLmNsb3VkbWFkZS5jb20vQkM5QTQ5M0I0MTAxNENBQUJCOThGMDQ3MUQ3NTk3MDcvOTk3LzI1Ni97en0ve3h9L3t5fS5wbmcnLCB7CisvLworLy8gU3dhcHBpbmcgb3V0IGNsb3VkbWFkZSB0aWxlcyB0byBvcGVuc3RyZWV0bWFwIC0gdG9vIG1hbnkgZ3JleSB0aWxlcyBzaG93aW5nCitMLnRpbGVMYXllcignaHR0cDovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsIHsKICAgICBtYXhab29tOiAxOCwKICAgICBhdHRyaWJ1dGlvbjogJ1Rlc3QnCiB9KS5hZGRUbyhtYXApOwogCiB2YXIgYXJyYXlPZkxhdExuZ3MgPSBbXTsKLXZhciBkYXRhID0ge3sgY2RuRGF0YXxzYWZlIH19OwotbG9nLmluZm8oIGRhdGEgKTsKK3ZhciBtYXBEYXRhID0ge3sgY2RuRGF0YXxzYWZlIH19OworbG9nLmRlYnVnKCBtYXBEYXRhICk7CiAKLWZvciAoIHZhciBrZXkgaW4gZGF0YSApIHsKLSAgICBhcnJheU9mTGF0TG5ncy5wdXNoKFtkYXRhW2tleV1bJ2xhdCddLGRhdGFba2V5XVsnbG9uZyddXSk7Ci0gICAgbG9nLmluZm8oIGFycmF5T2ZMYXRMbmdzICk7Citmb3IgKCB2YXIga2V5IGluIG1hcERhdGEgKSB7CisgICAgYXJyYXlPZkxhdExuZ3MucHVzaChbbWFwRGF0YVtrZXldWydsYXQnXSxtYXBEYXRhW2tleV1bJ2xvbmcnXV0pOworICAgIGxvZy5kZWJ1ZyggYXJyYXlPZkxhdExuZ3MgKTsKIAotICAgIGRhdGFba2V5XVsnbWFya2VyJ10gPSBMLm1hcmtlcihbZGF0YVtrZXldWydsYXQnXSwgZGF0YVtrZXldWydsb25nJ11dLCB7aWNvbjogZ2V0SWNvbihkYXRhW2tleV1bJ251bU5vZGVzJ10sIGRhdGFba2V5XVsnbnVtSFBDU2xpdmVycyddKSB9KTsKLSAgICBkYXRhW2tleV1bJ21hcmtlciddLmFkZFRvKG1hcCkuYmluZFBvcHVwKHNldFBvcHVwVmFscyhrZXksIGRhdGFba2V5XSkpOworICAgIG1hcERhdGFba2V5XVsnbWFya2VyJ10gPSBMLm1hcmtlcihbbWFwRGF0YVtrZXldWydsYXQnXSwgbWFwRGF0YVtrZXldWydsb25nJ11dLCB7aWNvbjogZ2V0SWNvbihtYXBEYXRhW2tleV1bJ251bU5vZGVzJ10sIG1hcERhdGFba2V5XVsnbnVtSFBDU2xpdmVycyddLCAwLCBtYXBEYXRhW2tleV1bJ2hvdCddKSB9KTsKKyAgICBtYXBEYXRhW2tleV1bJ21hcmtlciddLmFkZFRvKG1hcCkuYmluZFBvcHVwKHNldFBvcHVwVmFscyhrZXksIG1hcERhdGFba2V5XSkpOwogCiB9CiB2YXIgYm91bmRzID0gbmV3IEwuTGF0TG5nQm91bmRzKGFycmF5T2ZMYXRMbmdzKTsKQEAgLTg4LDUxICsyMzAsMTA5IEBACiBmdW5jdGlvbiBzZXRQb3B1cFZhbHMgKHNpdGUsIHNpdGVEYXRhKSB7CiAgICAgdmFyIHJldFZhbCA9ICc8c3BhbiBjbGFzcz0iU2l0ZURldGFpbCI+PGI+JyArIHNpdGUgKyAnPC9iPjwvc3Bhbj4nICsgCiAgICAgICAgICAgICAgICAgICAgJzwvYnI+PGEgaHJlZj0iJyArIHNpdGVEYXRhWydzaXRlVXJsJ10gKyAnIj4nICsgc2l0ZURhdGFbJ3NpdGVVcmwnXSArICc8L2E+JyArIAotICAgICAgICAgICAgICAgICAgICc8L2JyPjxiPkF2YWlsYWJsZSBOb2RlczogPC9iPicgKyBzaXRlRGF0YVsnbnVtTm9kZXMnXSArIAotICAgICAgICAgICAgICAgICAgICc8L2JyPjxiPkFjdGl2ZSBIUEMgU2xpdmVyczogPC9iPicgKyBzaXRlRGF0YVsnbnVtSFBDU2xpdmVycyddICsgCi0gICAgICAgICAgICAgICAgICAgJzwvYnI+PHNwYW4gaWQ9ImFkZFNsaXZlcnMiPkFkZCBIUEMgU2xpdmVyczwvc3Bhbj4nICsgCi0gICAgICAgICAgICAgICAgICAgJzxzcGFuIGlkPSJyZW1TbGl2ZXJzIj5SZW1vdmUgSFBDIFNsaXZlcnM8L3NwYW4+JyA7IAorICAgICAgICAgICAgICAgICAgICc8L2JyPjxiPkhQQyBTbGl2ZXJzOiA8L2I+JyArIHNpdGVEYXRhWydudW1IUENTbGl2ZXJzJ10gKyAKKyAgICAgICAgICAgICAgICAgICAnPC9icj48Yj5Ub3RhbCBOb2RlczogPC9iPicgKyBzaXRlRGF0YVsnbnVtTm9kZXMnXSArCisvLyAgICAgICAgICAgICAgICAgICAnPC9icj48Yj5Ib3Q6IDwvYj4nICsgTWF0aC5yb3VuZChzaXRlRGF0YVsnaG90J10qMTAwKSArCisgICAgICAgICAgICAgICAgICAgJzwvYnI+PGI+TWVhc3VyZWQgTG9hZDogPC9iPicgKyBzaXRlRGF0YVsnbG9hZCddICsgJyUnICsKKyAgICAgICAgICAgICAgICAgICAnPHNwYW4gaWQ9ImFkZFNsaXZlcnMiPjwvYnI+PGEgaHJlZj0iIyIgaWQ9ImFkZEhQQ1NsaXZlciIgZGF0YS1zaXRlPSInICsgc2l0ZSArICciIGRhdGEtYXZhaWxOb2Rlcz0iJyArIHNpdGVEYXRhWydudW1Ob2RlcyddICsnIj5BZGQgSFBDIFNsaXZlcnM8L2E+IDwvc3Bhbj4nICsKKyAgICAgICAgICAgICAgICAgICAnPHNwYW4gaWQ9InJlbVNsaXZlcnMiPjxhIGhyZWY9IiMiIGlkPSJyZW1IUENTbGl2ZXIiIGRhdGEtc2l0ZT0iJyArIHNpdGUgKyAnIj5SZW1vdmUgSFBDIFNsaXZlcnM8L2E+IDwvc3Bhbj4nOwogCiAgICByZXR1cm4gcmV0VmFsOwogfQotZnVuY3Rpb24gZ2V0SWNvbihudW1Ob2RlcywgbnVtSFBDU2xpdmVycywgY3VycmVudEJXKSB7Ci0gICAgdmFyIGNvbG9yQ2hvaWNlcyA9IFsiIzAwN0ZGRiIsICIjMDAwMEZGIiwgIiM3ZjAwZmYiLCAiI0ZGMDBGRiIsICIjRkYwMDdGIiwgIiNGRjAwMDAiXTsKIAotICAgIHZhciByYXRpbyA9IChudW1IUENTbGl2ZXJzL251bU5vZGVzKSAqIDEwMDsKKyQoJyNtYXAtdXMnKS5vbignY2xpY2snLCAnI3JlbUhQQ1NsaXZlcicsIGZ1bmN0aW9uKCkgeworICAgCisgICAgJC5hamF4KHsKKyAgICAgICAgdXJsIDogJy9kYXNoYm9hcmRhZGRvcnJlbXNsaXZlci8nLAorICAgICAgICBkYXRhVHlwZSA6ICdqc29uJywKKyAgICAgICAgZGF0YToge3NpdGU6ICQodGhpcykuZGF0YSgnc2l0ZScpLAorICAgICAgICAgICAgICAgYWN0aW9uVG9EbzogInJlbSIsCisgICAgICAgICAgICAgICBjc3JmbWlkZGxld2FyZXRva2VuOiAie3sgY3NyZl90b2tlbiB9fSIsICAgLy8gPCBoZXJlIAorICAgICAgICAgICAgICAgc3RhdGU6ImluYWN0aXZlIiB9LAorICAgICAgICB0eXBlIDogJ1BPU1QnLAorICAgICAgICAvL3N1Y2Nlc3M6IGZ1bmN0aW9uKHJlc3BvbnNlKQorICAgICAgICAvL3sKKyAgICAgICAgIC8vICAgYWxlcnQoIlN1Y2Nlc3NmdWxseSBwb3N0ZWQgcmVxdWVzdCB0byBSRU1PVkUgc2xpdmVyIik7CisgICAgICAgIC8vfSwKKyAgICAgICAgY29tcGxldGU6ZnVuY3Rpb24oKXsKKyAgICAgICAgICAgIGFsZXJ0KCJTdWNjZXNzZnVsbHkgcG9zdGVkIHJlcXVlc3QgdG8gUkVNT1ZFIHNsaXZlciIpOworICAgICAgICB9LAorICAgICAgICAvL2Vycm9yOmZ1bmN0aW9uICh4aHIsIHRleHRTdGF0dXMsIHRocm93bkVycm9yKXsKKyAgICAgICAgIC8vICAgYWxlcnQoIkNvdWxkIG5vdCByZXF1ZXN0IHRvIHJlbW92ZSBIUEMgU2xpdmVyIik7CisgICAgICAgIC8vfQorICAgIH0pOworfSk7CisKKyQoJyNtYXAtdXMnKS5vbignY2xpY2snLCAnI2FkZEhQQ1NsaXZlcicsIGZ1bmN0aW9uKCkgeworICAgCisgICAgJC5hamF4KHsKKyAgICAgICAgdXJsIDogJy9kYXNoYm9hcmRhZGRvcnJlbXNsaXZlci8nLAorICAgICAgICBkYXRhVHlwZSA6ICdqc29uJywKKyAgICAgICAgZGF0YToge3NpdGU6ICQodGhpcykuZGF0YSgnc2l0ZScpLAorICAgICAgICAgICAgICAgYWN0aW9uVG9EbzogImFkZCIsCisgICAgICAgICAgICAgICBjc3JmbWlkZGxld2FyZXRva2VuOiAie3sgY3NyZl90b2tlbiB9fSIsICAgLy8gPCBoZXJlIAorICAgICAgICAgICAgICAgc3RhdGU6ImluYWN0aXZlIiB9LAorICAgICAgICB0eXBlIDogJ1BPU1QnLAorICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihyZXNwb25zZSkKKyAgICAgICAgeworICAgICAgICAgICAgYWxlcnQoIlN1Y2Nlc3NmdWxseSBwb3N0ZWQgcmVxdWVzdCB0byBhZGQgc2xpdmVyIik7CisgICAgICAgIH0sCisgICAgICAgIGNvbXBsZXRlOmZ1bmN0aW9uKCkKKyAgICAgICAgeyAKKyAgICAgICAgICAgIGFsZXJ0KCJTdWNjZXNzZnVsbHkgcG9zdGVkIHJlcXVlc3QgdG8gYWRkIHNsaXZlciIpOworICAgICAgICB9LAorICAgICAgICAvL2Vycm9yOmZ1bmN0aW9uICh4aHIsIHRleHRTdGF0dXMsIHRocm93bkVycm9yKXsKKyAgICAgICAgIC8vICAgYWxlcnQoImVycm9yIGRvaW5nIHNvbWV0aGluZyIpOworICAgICAgICAvL30KKyAgICB9KTsKKyAgLy8gIGNvbmZpcm1EaWFsb2coIkFkZCBIUEMgU2xpdmVycyIsIkFkZCBzb21lIEhQQyBTbGl2ZXJzIHRvIHNpdGUgIiArICQodGhpcykuZGF0YSgnc2l0ZScpKTsKK30pOworCitmdW5jdGlvbiBnZXRJY29uKG51bU5vZGVzLCBudW1IUENTbGl2ZXJzLCBjdXJyZW50QlcsIGhvdCkgeworICAgIC8vdmFyIGNvbG9yQ2hvaWNlcyA9IFsiIzAwN0ZGRiIsICIjMDAwMEZGIiwgIiM3ZjAwZmYiLCAiI0ZGMDBGRiIsICIjRkYwMDdGIiwgIiNGRjAwMDAiXTsKKyAgICB2YXIgY29sb3JDaG9pY2VzID0gWyIjMDAwMEZGIiwgIiMwMEZGRkYiLCAiIzAwRkYwMCIsICIjRkZGRjAwIiwgIiNGRjAwMDAiXTsKKworICAgIHZhciByYXRpbyA9IGhvdCAqIDEwMDsgLy8obnVtSFBDU2xpdmVycy9udW1Ob2RlcykgKiAxMDA7CiAgICAgdmFyIG51bUNvbG9ycyA9IGNvbG9yQ2hvaWNlcy5sZW5ndGg7CiAgICAgdmFyIGNvbG9yQmFuZHMgPSAxMDAvbnVtQ29sb3JzOwogCiAgICAgLy9BbGdvcml0aG0gZm9yIGNvbG9yIHRvbmUgc2hvdWxkIGNvbnNpZGVyIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIG5vZGVzCiAgICAgLy8gb24gdGhlIHNpdGUsIGFuZCB0aGVuIGhvdyBtdWNoIHRoZSBjdXJyZW50IGRlZGljYXRlZCBub2RlcyBhcmUgaW1wYWN0ZWQKICAgICAvL3ZhciBpY29uQ29sb3IgPSAwOwotICAgIHZhciBpY29uQ29sb3IgPSA1OworICAgIHZhciBpY29uQ29sb3IgPSBjb2xvckNob2ljZXMubGVuZ3RoLTE7CiAgICAgZm9yIChjb2xvckJhbmQgPSAwOyBjb2xvckJhbmQgPCBudW1Db2xvcnM7IGNvbG9yQmFuZCArKykgewogICAgICAgICBpZiAocmF0aW8gPCBjb2xvckJhbmRzICogY29sb3JCYW5kKzEpIHsKICAgICAgICAgICAgIGljb25Db2xvciA9IGNvbG9yQmFuZAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9Ci0gIAotICAgIHZhciBpY29uID0gTC5NYWtpTWFya2Vycy5pY29uKHtpY29uOiAic3Rhci1zdHJva2VkIiwgY29sb3I6IGNvbG9yQ2hvaWNlc1tpY29uQ29sb3JdICwgc2l6ZTogInMifSk7CisKKyAgICBpZiAobnVtSFBDU2xpdmVycyA8IDEpIHsKKyAgICAgICAgaWNvbkNvbG9yID0gIiM3RjdGN0YiOworICAgIH0gZWxzZSB7CisgICAgICAgIGljb25Db2xvciA9IGNvbG9yQ2hvaWNlc1tpY29uQ29sb3JdOworICAgIH0KKworICAgIHZhciBpY29uID0gTC5NYWtpTWFya2Vycy5pY29uKHtpY29uOiAic3Rhci1zdHJva2VkIiwgY29sb3I6IGljb25Db2xvciAsIHNpemU6ICJzIn0pOwogICAgIHJldHVybiBpY29uOwogfQogCiBmdW5jdGlvbiB1cGRhdGVNYXBzKCkgewotICAgIGxvZy5pbmZvKCJBdHRlbXB0aW5nIHRvIHVwZGF0ZSBNYXBzIik7CisgICAgbG9nLmRlYnVnKCJBdHRlbXB0aW5nIHRvIHVwZGF0ZSBNYXBzIik7CiAgICAgJC5hamF4KHsKICAgICB1cmwgOiAnL2hwY2Rhc2hib2FyZCcsCiAgICAgZGF0YVR5cGUgOiAnanNvbicsCiAgICAgdHlwZSA6ICdHRVQnLAogICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKG5ld0RhdGEpCiAgICAgewotICAgICAgICBsb2cuaW5mbygiU3VjY2Vzc2Z1bGx5IGdvdCBkYXRhIGJhY2suLi4iKTsKLSAgICAgICAgbG9nLmluZm8obmV3RGF0YSk7Ci0gICAgICAgIGxvZy5pbmZvKCJTdGlsbCBoYXZlIG9sZCBkYXRhIHRvbyIpOwotICAgICAgICBsb2cuaW5mbyhkYXRhKTsKKyAgICAgICAgbG9nLmRlYnVnKCJTdWNjZXNzZnVsbHkgZ290IGRhdGEgYmFjay4uLiIpOworICAgICAgICBsb2cuZGVidWcobmV3RGF0YSk7CisgICAgICAgIGxvZy5kZWJ1ZygiU3RpbGwgaGF2ZSBvbGQgZGF0YSB0b28iKTsKKyAgICAgICAgbG9nLmRlYnVnKG1hcERhdGEpOwogICAgICAgICB1cGRhdGVNYXBEYXRhKG5ld0RhdGEpOwogICAgIH0KIH0pOwotICAgIHNldFRpbWVvdXQodXBkYXRlTWFwcywgNDUwMDApCisgICAgc2V0VGltZW91dCh1cGRhdGVNYXBzLCAzMDAwMCkKIAogfQogCkBAIC0xNDAsMzIgKzM0MCwzMiBAQAogICAgIGZvciAoIHNpdGUgaW4gbmV3RGF0YSApIHsKICAgICAgICAgdmFyIGlzTmV3U2l0ZSA9IGZhbHNlOwogICAgICAgICAvL2NoZWNrIHRvIHNlZSBpZiB0aGUgc2l0ZSBpcyBuZXcgb3Igbm90Ci0gICAgICAgIGlmIChzaXRlIGluIGRhdGEpIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKCJTaXRlICIgKyBzaXRlICsgIiBhbHJlYWR5IG1hcHBlZCIpOworICAgICAgICBpZiAoc2l0ZSBpbiBtYXBEYXRhKSB7CisgICAgICAgICAgICBsb2cuZGVidWcoIlNpdGUgIiArIHNpdGUgKyAiIGFscmVhZHkgbWFwcGVkIik7CiAgICAgICAgICAgICAvL3Rha2Ugb3duZXJzaGlwIG9mIG1hcmtlcgotICAgICAgICAgICAgbmV3RGF0YVtzaXRlXVsnbWFya2VyJ10gPSBkYXRhW3NpdGVdWydtYXJrZXInXTsKLSAgICAgICAgICAgIGRlbGV0ZSBkYXRhW3NpdGVdOwotICAgICAgICAgICAgbmV3RGF0YVtzaXRlXVsnbWFya2VyJ10uc2V0SWNvbihnZXRJY29uKG5ld0RhdGFbc2l0ZV1bJ251bU5vZGVzJ10sIG5ld0RhdGFbc2l0ZV1bJ251bUhQQ1NsaXZlcnMnXSkpOworICAgICAgICAgICAgbmV3RGF0YVtzaXRlXVsnbWFya2VyJ10gPSBtYXBEYXRhW3NpdGVdWydtYXJrZXInXTsKKyAgICAgICAgICAgIGRlbGV0ZSBtYXBEYXRhW3NpdGVdOworICAgICAgICAgICAgbmV3RGF0YVtzaXRlXVsnbWFya2VyJ10uc2V0SWNvbihnZXRJY29uKG5ld0RhdGFbc2l0ZV1bJ251bU5vZGVzJ10sIG5ld0RhdGFbc2l0ZV1bJ251bUhQQ1NsaXZlcnMnXSwgIDAsIG5ld0RhdGFbc2l0ZV1bJ2hvdCddKSk7CiAgICAgICAgICAgICAvLyB3b3JrYXJvdW5kLCBtYXJrZXJzIGN1cnJlbnRseSBkb24ndCBoYXZlIGEgc2V0UG9wdXAgQ29udGVudCBtZXRob2QgLS0gc28gaGF2ZSB0byBncmFiIG9iamVjdCBkaXJlY3RseQogICAgICAgICAgICAgbmV3RGF0YVtzaXRlXVsnbWFya2VyJ10uX3BvcHVwLnNldENvbnRlbnQoc2V0UG9wdXBWYWxzKHNpdGUsIG5ld0RhdGFbc2l0ZV0pKTsKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIGlzTmV3U2l0ZSA9IHRydWU7Ci0gICAgICAgICAgICBsb2cuaW5mbygiTmV3IFNpdGUgZGV0ZWN0ZWQ6ICIgKyBzaXRlKTsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiTmV3IFNpdGUgZGV0ZWN0ZWQ6ICIgKyBzaXRlKTsKICAgICAgICAgICAgIG5ld0RhdGFbc2l0ZV1bJ21hcmtlciddID0gTC5tYXJrZXIoW25ld0RhdGFbc2l0ZV1bJ2xhdCddLCBuZXdEYXRhW3NpdGVdWydsb25nJ11dLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aWNvbjogZ2V0SWNvbihuZXdEYXRhW3NpdGVdWydudW1Ob2RlcyddLCBuZXdEYXRhW3NpdGVdWydudW1IUENTbGl2ZXJzJ10pIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpY29uOiBnZXRJY29uKG5ld0RhdGFbc2l0ZV1bJ251bU5vZGVzJ10sIG5ld0RhdGFbc2l0ZV1bJ251bUhQQ1NsaXZlcnMnXSwgIDAsIG5ld0RhdGFbc2l0ZV1bJ2hvdCddKSB9KTsKICAgICAgICAgICAgIG5ld0RhdGFbc2l0ZV1bJ21hcmtlciddLmFkZFRvKG1hcCkuYmluZFBvcHVwKHNldFBvcHVwVmFscyhzaXRlLCBuZXdEYXRhW3NpdGVdKSk7IC8vLm9wZW5Qb3B1cCgpOwotICAgICAgICAgICAgbG9nLmluZm8oIlNob3VsZCBoYXZlIGFkZGVkIHRoZSBuZXcgc2l0ZSIpOworICAgICAgICAgICAgbG9nLmRlYnVnKCJTaG91bGQgaGF2ZSBhZGRlZCB0aGUgbmV3IHNpdGUiKTsKIAogICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gQW55dGhpbmcgc3RpbGwgaW4gZGF0YSBuZWVkcyB0byBiZSByZW1vdmVkIHNpbmNlIGl0IGlzIG5vIGxvbmdlciBhIHZhbGlkIHNpdGUKLSAgICBmb3IgKHJlbVNpdGUgaW4gZGF0YSkgeworICAgIGZvciAocmVtU2l0ZSBpbiBtYXBEYXRhKSB7CiAgICAgICAgIGxvZy53YXJuKCJTaXRlOiAiICsgcmVtU2l0ZSArICIgaXMgbm8gbG9uZ2VyIHZhbGlkLCByZW1vdmluZyBmcm9tIG1hcCIpOwogICAgICAgICBtYXAucmVtb3ZlTGF5ZXIoZGF0YVtyZW1TaXRlXVsnbWFya2VyJ10pOwogICAgIH0KLSAgICBkYXRhID0gbmV3RGF0YTsKKyAgICBtYXBEYXRhID0gbmV3RGF0YTsKIH0KIAogZnVuY3Rpb24gb25NYXBDbGljayhlKSB7CkBAIC0xNzcsNSArMzc3LDUxIEBACiAKIHNldFRpbWVvdXQodXBkYXRlTWFwcywgNTAwMCkKIAorLy8gZnJvbSBzdGFja2V4Y2hhbmdlCitmdW5jdGlvbiBzZXRJbm5lclRleHQgKGVsZW1lbnRJZCwgdGV4dCkgeworICAgIHZhciBlbGVtZW50OworICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCkgeworICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudElkKTsKKyAgICB9IGVsc2UgaWYgKGRvY3VtZW50LmFsbCkgeworICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQuYWxsW2VsZW1lbnRJZF07CisgICAgfQorICAgIGlmIChlbGVtZW50KSB7CisgICAgICAgIGlmICh0eXBlb2YgZWxlbWVudC50ZXh0Q29udGVudCAhPSAndW5kZWZpbmVkJykgeworICAgICAgICAgICAgZWxlbWVudC50ZXh0Q29udGVudCA9IHRleHQ7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGVsZW1lbnQuaW5uZXJUZXh0ICE9ICd1bmRlZmluZWQnKSB7CisgICAgICAgICAgICBlbGVtZW50LmlubmVyVGV4dCA9IHRleHQ7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGVsZW1lbnQucmVtb3ZlQ2hpbGQgIT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgICAgICAgIHdoaWxlIChlbGVtZW50Lmhhc0NoaWxkTm9kZXMoKSkgeworICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQ2hpbGQoZWxlbWVudC5sYXN0Q2hpbGQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0ZXh0KSkgOworICAgICAgICB9CisgICAgfQorfQorCitmdW5jdGlvbiB1cGRhdGVMYWJlbERhdGEoc3VtbWFyeURhdGEpIHsKKyAgICBzZXRJbm5lclRleHQoImFjdGl2ZS1zbGl2ZXJzLXZhbHVlIiwgc3VtbWFyeURhdGFbInRvdGFsX3NsaXZlcnMiXSk7CisgICAgc2V0SW5uZXJUZXh0KCJvdmVyYWxsLXRocm91Z2hwdXQtdmFsdWUiLCAoc3VtbWFyeURhdGFbInRvdGFsX2JhbmR3aWR0aCJdKjgvMTAyNC8xMDI0LzEwMjQpLnRvRml4ZWQoMikgKyAiIEdicHMiKTsKKyAgICBzZXRJbm5lclRleHQoImNwdS11dGlsaXphdGlvbi12YWx1ZSIsIHN1bW1hcnlEYXRhWyJhdmVyYWdlX2NwdSJdICsgIiUiKTsKK30KKworZnVuY3Rpb24gdXBkYXRlTGFiZWxzKCkgeworICAgIGxvZy5kZWJ1ZygiQXR0ZW1wdGluZyB0byB1cGRhdGUgTGFiZWxzIik7CisgICAgJC5hamF4KHsKKyAgICB1cmwgOiAnL2hwY3N1bW1hcnknLAorICAgIGRhdGFUeXBlIDogJ2pzb24nLAorICAgIHR5cGUgOiAnR0VUJywKKyAgICBzdWNjZXNzOiBmdW5jdGlvbihuZXdEYXRhKQorICAgIHsKKyAgICAgICAgdXBkYXRlTGFiZWxEYXRhKG5ld0RhdGEpOworICAgIH0KK30pOworICAgIHNldFRpbWVvdXQodXBkYXRlTGFiZWxzLCAzMDAwMCkKKworfQorCitzZXRUaW1lb3V0KHVwZGF0ZUxhYmVscywgNTAwMCkKKwkJCisKIDwvc2NyaXB0PgogeyUgZW5kYmxvY2sgJX0K