1MOyoQIABAAAAAAAAAAAAP//AAABAAAAUPHvVpgqCABAAAAAQAAAAP///////wAYgqyB2YiqAAJkAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEUtBYVQ8e9Wc3EJADwAAAA8AAAAAYDCAAAKEFFyDj3AmZgAAQAAAAgAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUPHvVqt0CQBAAAAAQAAAAP///////xBRcg49wIEAAAGZmAABAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQ8e9W0M4OAE4AAABOAAAAAQBeAAAFNmkHEQMDCABFwABAVBgAAAFZ873IyMgB4AAABQIBACwBAQEBAAAAAGnSAAAAAAAAAAAAAP///wAACgIBAAAAKMjIyAEAAAAAUfHvVlEoBgB3AAAAdwAAAAGAwgAAABBRcg49wABpQkIDAAADAnyAAAAYggCN5wADDT+AABBRcg49wIADAQAUAAIADwAAAEAAMTA1MTcyMGUzZGMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKw2F39QKDzUuDgh2Ksm3mIAAAAAgAAQUXIOPcAUUfHvVi9RCABAAAAAQAAAAP///////wAYgqyB2YiqAAJlAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG8FPedR8e9W0Q4JAHYAAAB2AAAACAAnrR4TaPcoH9LFCABFAABobPxAAEAGPa3AqAc2wKgHYJbVH/Xhu/Z6DJnIq4AYAQ63fgAAAQEICgC3p6EAYercga4vQfKtVGOX20ovho8VY4bCXy66yE4zhs9KIIaPA2OBxEtjyJsDY4LMVi2dzEtjyNZSPFHx71Y7DwkAQgAAAEIAAABo9ygf0sUIACetHhMIAEUAADQnc0AAQAaDasCoB2DAqAc2H/WW1QyZyKvhu/augBAA7pANAAABAQgKAGHulwC3p6FR8e9WeSoPAOoFAADqBQAAAYDCAAAVNmkHIQMDBdz+/gODGwEGEAEAAwIiIiIiAAAACQXZQCIiIiIAAAEBAgFJgQHMBgY2aQcRAwOEBMjIyALlAgAA0wMAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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BjZpBxEDA4QEyMjIAuUCAADTAwAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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CkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbg0KQWNjZXB0OiAqLyoNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZQ0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KDQp7CiAgImFwcHMiOiB7CiAgICAgICJvcmcub25vc3Byb2plY3QucHJvdmlkZXIuYmdwLmNmZyI6IHsKICAgICAgICAgICAgICAiYmdwYXBwIjogewogICAgICAgICAgICAgICAgICAgInJvdXRlcklkIjogIjE5Mi4xNjguNy45NiIsCiAgICAgICAgICAgICAgICAgICAibG9jYWxBcyI6IDEwMCwKICAgICAgICAgICAgICAgICAgICJtYXhTZXNzaW9uIjogMTYsCiAgICAgICAgICAgICAgICAgICAibHNDYXBhYmlsaXR5IjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICJob2xkVGltZSI6IDEyMCwKICAgICAgICAgICAgICAgICAgICJsYXJnZUFzQ2FwYWJpbGl0eSI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgImZsb3dTcGVjQ2FwYWJpbGl0eSI6ICJJUFY0IiwKICAgICAgICAgICAgICAgICAgICJiZ3BQZWVyIjpbIHsicGVlcklwIjogIjE5Mi4xNjguNy4yMTEiLCAicmVtb3RlQXMiOiAxMDAsICJwZWVySG9sZFRpbWUiOiAxMjAsICJjb25uZWN0TW9kZSI6ImFjdGl2ZSJ9CiAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgfQogICAgICB9CiAgfQp9CgpW8e9WtEgHAEIAAABCAAAAaPcoH9LFCAAnrR4TCABFAAA0fxdAAEAGK8bAqAdgwKgHNh/1ls8Ovik7o2qcvoAQAjKQDQAAAQEICgBh81wAt6xbVvHvVsbyBwCJAAAAiQAAAGj3KB/SxQgAJ60eEwgARQAAe38YQABABit+wKgHYMCoBzYf9ZbPDr4pO6NqnL6AGAIykFQAAAEBCAoAYfNnALesW0hUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1MZW5ndGg6IDANClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KVvHvVhPzBwBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANMQMQABABubQwKgHNsCoB2CWzx/1o2qcvg6+KYKAECFm9VAAAAEBCAoAt6xxAGHzZ1bx71YkNQgASgAAAEoAAAA2yQchERAIACetHhMIAEUAADz3IEAAQAazF8CoB2DAqAfTnlYAs4/KBEsAAAAAoAJyEJCyAAACBAW0BAIICgBh82sAAAAAAQMDB1bx71azGQkAQAAAAEAAAAD///////8AGIKsgdmIqgACagEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAz7VGYVvHvVliYCQA8AAAAPAAAAAGAwgAAChBRcg49wJmYAAEAAAAIAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFbx71Z+mwkAQAAAAEAAAAD///////8QUXIOPcCBAAABmZgAAQAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVvHvVsjoCgA8AAAAPAAAAAgAJ60eEzbJByEREAgARcAALAEAAAD/BimIwKgH08CoB2AAs55W9muYzY/KBExgEiAAJTkAAAIEBbQAAFbx71bj6AoANgAAADYAAAA2yQchERAIACetHhMIAEUAACj3IUAAQAazKsCoB2DAqAfTnlYAs4/KBEz2a5jOUBByEJCeAABW8e9WIQILAGcAAABnAAAANskHIREQCAAnrR4TCABFAABZ9yJAAEAGsvjAqAdgwKgH055WALOPygRM9muYzlAYchCQzwAA/////////////////////wAxAQQAZAB4wKgHYBQCEgEEAAEAAQEEQAQARwEEAAEAhVbx71bn9g0APAAAADwAAAAIACetHhM2yQchERAIAEXAACgAAAAA/wYqjMCoB9PAqAdgALOeVvZrmM6PygRMUBQiODq6AAAAAAAAAABX8e9WNjQCAIICAACCAgAAAQBeKQfIACWe06bKCABFAAJ0AABAAAERxZfAqAfI4akHyAQsBCsCYAYRAQEGAAABEgCMQGETAAAAADAACGJvYXJkX3N0YQAAAAAAAAAAAAAAAAAAAADgCWj3xWAIAAAAAABVL6IaAAAAABgABGxvZwAADeAFAAAAAAAm/NUeAAAAABgABC4uAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAImQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFjx71aWRgMAPAAAADwAAAAIACetHhM2yAcRERAIAEXAACwBCAAA/wYpYsCoB/HAqAdgxqoAswAAQxEAAAAAYAIgAN0VAAACBAW0AABY8e9WsUYDADoAAAA6AAAANsgHEREQCAAnrR4TCABFAAAsAABAAEAGqirAqAdgwKgH8QCzxqpVynUpAABDEmASchCQwAAAAgQFtFjx71Z9TAMAPAAAADwAAAAIACetHhM2yAcRERAIAEXAACgCCAAA/wYoZsCoB/HAqAdgxqoAswAAQxJVynUqUBAiOCeWAAAAAAAAAABY8e9Wq00DAG8AAABvAAAACAAnrR4TNsgHEREQCABFwABhAwgAAP8GJy3AqAfxwKgHYMaqALMAAEMSVcp1KlAYIjg3dAAA/////////////////////wA5AQQAZAC0bwEBARwCGgEEAAEAAQEEAAEAhQEEQAQARwIAQQQAAABkWPHvVrRNAwA2AAAANgAAADbIBxEREAgAJ60eEwgARQAAKIAkQABABioKwKgHYMCoB/EAs8aqVcp1KgAAQ0tQEHIQkLwAAFjx71buTwMASwAAAEsAAAA2yAcRERAIACetHhMIAEUAAD2AJUAAQAYp9MCoB2DAqAfxALPGqlXKdSoAAENLUBhyEJDRAAD/////////////////////ABUDBgVY8e9WHlADADYAAAA2AAAANsgHEREQCAAnrR4TCABFAAAogCZAAEAGKgjAqAdgwKgH8QCzxqpVynU/AABDS1AUchCQvAAAWPHvVg5nCQBAAAAAQAAAAP///////wAYgqyB2YiqAAJsAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM8dwNRY8e9Wp9cKADwAAAA8AAAACAAnrR4TNskHIREQCABFwAAsAQgAAP8GKYDAqAfTwKgHYOuXALMAAAIQAAAAAGACIAD5RwAAAgQFtAAAWPHvVs3XCgA6AAAAOgAAADbJByEREAgAJ60eEwgARQAALAAAQABABqpIwKgHYMCoB9MAs+uXUtkpgQAAAhFgEnIQkKIAAAIEBbRY8e9WD+sKADwAAAA8AAAACAAnrR4TNskHIREQCABFwAAoAggAAP8GKITAqAfTwKgHYOuXALMAAAIRUtkpglAQIjiSYQAAAAAAAAAAWPHvVtftCgBvAAAAbwAAAAgAJ60eEzbJByEREAgARcAAYQMIAAD/BidLwKgH08CoB2DrlwCzAAACEVLZKYJQGCI4/jUAAP////////////////////8AOQEEAGQAtAoKCgIcAhoBBAABAAEBBAABAIUBBEAEAEcCAEEEAAAAZFjx71bn7QoANgAAADYAAAA2yQchERAIACetHhMIAEUAACjcCUAAQAbOQsCoB2DAqAfTALPrl1LZKYIAAAJKUBByEJCeAABY8e9WBiMLAGcAAABnAAAANskHIREQCAAnrR4TCABFAABZ3ApAAEAGzhDAqAdgwKgH0wCz65dS2SmCAAACSlAYchCQzwAA/////////////////////wAxAQQAZAB4wKgHYBQCEgEEAAEAAQEEQAQARwEEAAEAhVjx71bNJgsASQAAAEkAAAAIACetHhM2yQchERAIAEXAADsECAAA/wYmccCoB9PAqAdg65cAswAAAkpS2SmzUBgiOI3JAAD/////////////////////ABMEWPHvVulCCwBJAAAASQAAADbJByEREAgAJ60eEwgARQAAO9wLQABABs4twKgHYMCoB9MAs+uXUtkpswAAAl1QGHIQkLEAAP////////////////////8AEwRY8e9Wf2gLAE0AAABNAAAACAAnrR4TNskHIREQCABFwAA/BQgAAP8GJW3AqAfTwKgHYOuXALMAAAJdUtkpxlAYIjiPmwAA/////////////////////wAXAgAAAABY8e9WIAUMADYAAAA2AAAANskHIREQCAAnrR4TCABFAAAo3AxAAEAGzj/AqAdgwKgH0wCz65dS2SnGAAACdFAQchCQngAAWPHvVk4XDAClBAAApQQAAAgAJ60eEzbJByEREAgARcAElwYIAAD/BiAVwKgH08CoB2DrlwCzAAACdFLZKcZQGCI4WV0AAP////////////////////8AHgIAAAAHkA8AAwABhf////////////////////8AfAIAAABlQAEBAkACAIAEBAAAAABABQQAAABkwB0TBAIACi4xMTExLjAwMTEEAwABSZAOADZABEcEwKgH0wAAAQApAgAAAAAAAAAAAQAAHAIAAAQAAABkAgEABAoKCgICAwAIEREREQARAAD/////////////////////AKQCAAAAjUABAQJAAgCABAQAAAAAQAUEAAAAZMAdDgQCAAouMjIyMi4wMDIykA4AY0AERwTAqAfTAAABACkCAAAAAAAAAAABAAAcAgAABAAAAGQCAQAECgoKAgIDAAgiIiIiACIAAAABACkCAAAAAAAAAAABAAAcAgAABAAAAGQCAQAECgoKAgIDAAgiIiIiACIBAP////////////////////8AfAIAAABlQAEBAkACAIAEBAAAAABABQQAAABkwB0TBAIACi4zMzMzLjAwMzMEAwABSZAOADZABEcEwKgH0wAAAQApAgAAAAAAAAAAAQAAHAIAAAQAAABkAgEABAoKCgICAwAIMzMzMwAzAAD/////////////////////ASoCAAABE0ABAQJAAgCABAQAAAAAQAUEAAAAZMAdBwRHAAMAAAqQDgDwQARHBMCoB9MAAAIASQIAAAAAAAAAAAEAABwCAAAEAAAAZAIBAAQKCgoCAgMACBEREREAEQAAAQEAHAIAAAQAAABkAgEABAoKCgICAwAIIiIiIgAiAQAAAgBJAgAAAAAAAAAAAQAAHAIAAAQAAABkAgEABAoKCgICAwAIIiIiIgAiAAABAQAcAgAABAAAAGQCAQAECgoKAgIDAAgiIiIiACIBAAACAEkCAAAAAAAAAAABAAAcAgAABAAAAGQCAQAECgoKAgIDAAgiIiIiACIAAAEBABwCAAAEAAAAZAIBAAQKCgoCAgMACCIiIiIAIgMA/////////////////////wDdAgAAAMZAAQECQAIAgAQEAAAAAEAFBAAAAGTAHQcERwADAAAAkA4Ao0AERwTAqAfTAAACAEkCAAAAAAAAAAABAAAcAgAABAAAAGQCAQAECgoKAgIDAAgiIiIiACIBAAEBABwCAAAEAAAAZAIBAAQKCgoCAgMACBEREREAEQAAAAIASQIAAAAAAAAAAAEAABwCAAAEAAAAZAIBAAQKCgoCAgMACCIiIiIAIgEAAQEAHAIAAAQAAABkAgEABAoKCgICAwAIIiIiIgAiAAD/////////////////////AJACAAAAeUABAQJAAgCABAQAAAAAQAUEAAAAZMAdBwRHAAMAAAqQDgBWQARHBMCoB9MAAAIASQIAAAAAAAAAAAEAABwCAAAEAAAAZAIBAAQKCgoCAgMACDMzMzMAMwAAAQEAHAIAAAQAAABkAgEABAoKCgICAwAIIiIiIgAiAwD/////////////////////AB4CAAAAB5APAANABEdY8e9WihcMADYAAAA2AAAANskHIREQCAAnrR4TCABFAAAo3A1AAEAGzj7AqAdgwKgH0wCz65dS2SnGAAAG41AQfCSQngAAWPHvVtWBDgDqAAAA6gAAAGj3KB/SxQgAJ60eEwgARQAA3Cd4QABABoK9wKgHYMCoBzYf9ZbVDJnIs+G79r6AGADukLUAAAEBCAoAYfXFALetq4F+AKR7ImV2ZW50IjoidXBkYXRlSW5zdGFuY2UiLCJwYXlsb2FkIjp7ImlkIjoiMTkyLjE2OC43Ljk2IiwiaXAiOiIxOTIuMTY4LjcuOTYiLCJvbmxpbmUiOnRydWUsInVpQXR0YWNoZWQiOnRydWUsInN3aXRjaGVzIjoyLCJsYWJlbHMiOlsiMTkyLjE2OC43Ljk2IiwiMTkyLjE2OC43Ljk2Il19fVjx71btlg4AgQEAAIEBAABo9ygf0sUIACetHhMIAEUAAXMneUAAQAaCJcCoB2DAqAc2H/WW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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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KIdgEnIQkKsAAAIEBbRd8e9WDDQEADwAAAA8AAAACAAnrR4TNsgHMREQCABFwAAoAggAAP8GKHvAqAfcwKgHYPt3ALMAACiHPBdwclAQIjgr1AAAAAAAAAAAXfHvVsk2BABLAAAASwAAADbIBzEREAgAJ60eEwgARQAAPYmNQABABiChwKgHYMCoB9wAs/t3PBdwcgAAKIdQGHIQkLwAAP////////////////////8AFQMGBV3x71YXNwQANgAAADYAAAA2yAcxERAIACetHhMIAEUAACiJjkAAQAYgtcCoB2DAqAfcALP7dzwXcIcAACiHUBFyEJCnAABd8e9WnTgEAG8AAABvAAAACAAnrR4TNsgHMREQCABFwABhAwgAAP8GJ0LAqAfcwKgHYPt3ALMAACiHPBdwclAYIjg6sQAA/////////////////////wA5AQQAZAC0cAEBAhwCGgEEAAEAAQEEAAEAhQEEQAQARwIAQQQAAABkXfHvVqw4BAA2AAAANgAAADbIBzEREAgAJ60eEwgARcAAKGCdQABABkjmwKgHYMCoB9wAs/t3PBdwcgAAAABQBAAAdp8AAF3x71YXTAQAPAAAADwAAAAIACetHhM2yAcxERAIAEXAACgECAAA/wYme8CoB9zAqAdg+3cAswAAKMA8F3CIUBAiOCuFAAAAAAAAAABd8e9WNkwEADYAAAA2AAAANsgHMREQCAAnrR4TCABFwAAoYJ9AAEAGSOTAqAdgwKgH3ACz+3c8F3CIAAAAAFAEAAB2iQAAXfHvVkdMBAA8AAAAPAAAAAgAJ60eEzbIBzEREAgARcAAKAUIAAD/BiV7wKgH3MCoB2D7dwCzAAAowDwXcIhQESI4K4QAAAAAAAAAAF3x71ZJTAQANgAAADYAAAA2yAcxERAIACetHhMIAEXAAChgoEAAQAZI48CoB2DAqAfcALP7dzwXcIgAAAAAUAQAAHaJAABd8e9WNkEGAHcAAAB3AAAAAYDCAAAAEFFyDj3AAGlCQgMAAAMCfIAAABiCAI3nAAMNP4AAEFFyDj3AgAMBABQAAgAPAAAAQAAxMDUxNzIwZTNkYzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArDYXf1AoPNS4OCHYqybeYgAAAACAABBRcg49wBRd8e9WcOMHAEIAAABCAAAA////////NskH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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX/HvVpCEDgA8AAAAPAAAAAEAXisHyAAlntOmyggARsAAIAAAQAABAjI0wKgHyOGrB8iUBAAAFgAAjOGrB8gAAAAAAAAAAAAAAAAAAGDx71Y2gwQAPAAAADwAAAABAF4pB2kAJZ7TqoAIAEbAACAAAEAAAQIy9MCoB2nhqQdplAQAABYAAO3hqQdpAAAAAAAAAAAAAAAAAABg8e9WmeIGAEAAAABAAAAAAQBeAAD8AAwpD1wnCABGAAAgF6sAAAECaTzAqAJM4AAA/JQEAAAWAAkD4AAA/AAAAAAAAAAAAAAAAAAAAAAAAGDx71bQhQkAPAAAADwAAAABAF4sB2kAJZ7TqoAIAEbAACAAAEAAAQIy8cCoB2nhrAdplAQAABYAAOrhrAdpAAAAAAAAAAAAAAAAAABg8e9WRCkKADwAAAA8AAAAAQBeKgfJACWe06qECABGwAAgAABAAAECMjPAqAfJ4aoHyZQEAAAWAACM4aoHyQAAAAAAAAAAAAAAAAAAYPHvVl6lCgBAAAAAQAAAAP///////wAYgqyB2YiqAAJ0AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIo9iWZg8e9WJi8PAEAAAABAAAAAAQBeAAD8AAwplNvRCABGAAAgM/kAAAECTOjAqAJS4AAA/JQEAAAWAAkD4AAA/AAAAAAAAAAAAAAAAAAAAAAAAGDx71YsQg8A6gUAAOoFAAABgMIAABU2aQchAwMF3P7+A4MbAQYQAQADAiIiIiIAAAAJBdlAIiIiIgAAAQECAUmBAcwGBjZpBxEDA4QEyMjIAuUCAADTAwAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn8e9Wr78FAEAAAABAAAAAAQBeAAD8AAwpXwKUCABGAAAgJeAAAAECWyDAqAIz4AAA/JQEAAAWAAkD4AAA/AAAAAAAAAAAAAAAAAAAAAAAAGfx71aJoAcA7AAAAOwAAAD///////8AJZ7TW2kIAEUAAN4wA0AAQBF5ZMCoB1jAqAf/AIoAigDK2+MRCnkmwKgHWACKALQAACBGQ0VQRVBGRURCQ05GRUVGRURFQkVNQ0FDQUNBQ0FBQQAgRkhFUEZDRUxFSEZDRVBGRkZBQ0FDQUNBQ0FDQUNBQk8A/1NNQiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARAAAaAAAAAAAAAAAAAAAAAAAAAAAAABoAVgADAAEAAQACACsAXE1BSUxTTE9UXEJST1dTRQAIAQMPARTgF5FiAAAAAFJPT1QxLVRFQ0FMAGfx71YAoQcAXAAAAFwAAAD///////8sJ9cqy0wIAEUAAE5IkEAAQBFhgMCoBz/AqAf/AIkAiQA6cyx4MAEQAAEAAAAAAAAgRkhFUEZDRUxFSEZDRVBGRkZBQ0FDQUNBQ0FDQUNBQk4AACAAAWfx71YPogcAPAAAADwAAAD///////9IYnYFpc8IBgABCAAGBAABSGJ2BaXPwKgHAQAAAAAAAMCoB/8AAAAAAAAAAAAAAAAAAAAAAABn8e9WNkUIADwAAAA8AAAA////////ACWe06qECAYAAQgABgQAAQAlntOqhMCoB8kAAAAAAADAqAc5AAAAAAAAAAAAAAAAAAAAAAAAZ/HvViJUCAB3AAAAdwAAAAGAwgAAABBRcg49wABpQkIDAAADAnyAAAAYggCN5wADDT+AABBRcg49wIADAQAUAAIADwAAAEAAMTA1MTcyMGUzZGMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKw2F39QKDzUuDgh2Ksm3mIAAAAAgAAQUXIOPcAUZ/HvVmvQCABcAAAAXAAAAP///////wAbIayU+ggARQAATnmiAACAEWjarBAAAqwQ//8AiQCJADpARPOHARAAAQAAAAAAACBFT0VMRUhGREVGRkFEQURDQ05FRUZDQ0FDQUNBQ0FBQQAAIAABZ/HvVswIDABAAAAAQAAAAP///////wAYgqyB2YiqAAJ7AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANbV5Rlo8e9WTlIAAEIAAABCAAAA////////NsgHEREQCAYAAQgABgQAATbIBxEREMCoB/EAAAAAAADAqAf1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaPHvVg43BAA8AAAAPAAAAAgAJ60eEzbIBzEREAgARcAALAEIAAD/Bil3wKgH3MCoB2D7eACzAAAooAAAAABgAiAAws0AAAIEBbQAAGjx71YpNwQAOgAAADoAAAA2yAcxERAIACetHhMIAEUAACwAAEAAQAaqP8CoB2DAqAfcALP7ePB3zKgAACihYBJyEJCrAAACBAW0aPHvVnw9BAA8AAAAPAAAAAgAJ60eEzbIBzEREAgARcAAKAIIAAD/Bih7wKgH3MCoB2D7eACzAAAoofB3zKlQECI4GyEAAAAAAAAAAGjx71aYPwQAbwAAAG8AAAAIACetHhM2yAcxERAIAEXAAGEDCAAA/wYnQsCoB9zAqAdg+3gAswAAKKHwd8ypUBgiOCn+AAD/////////////////////ADkBBABkALRwAQECHAIaAQQAAQABAQQAAQCFAQRABABHAgBBBAAAAGRo8e9Woj8EADYAAAA2AAAANsgHMREQCAAnrR4TCABFAAAoyBdAAEAG4ivAqAdgwKgH3ACz+3jwd8ypAAAo2lAQchCQpwAAaPHvVipABABLAAAASwAAADbIBzEREAgAJ60eEwgARQAAPcgYQABABuIVwKgHYMCoB9wAs/t48HfMqQAAKNpQGHIQkLwAAP////////////////////8AFQMGBWjx71Y5QAQANgAAADYAAAA2yAcxERAIACetHhMIAEUAACjIGUAAQAbiKcCoB2DAqAfcALP7ePB3zL4AACjaUBRyEJCnAABo8e9WwfwEAFwAAABcAAAA////////ABshrJT6CABFAABOebEAAIARaMusEAACrBD//wCJAIkAOkBE84cBEAABAAAAAAAAIEVPRUxFSEZERUZGQURBRENDTkVFRkNDQUNBQ0FDQUFBAAAgAAFo8e9WI/EFADwAAAA8AAAAAQBeLAfmACWe06q0CABGwAAgAABAAAECMffAqAfm4awH5pQEAAAWAABt4awH5gAAAAAAAAAAAAAAAAAAaPHvVm1RCAA8AAAAPAAAAP///////wAlntOqhAgGAAEIAAYEAAEAJZ7TqoTAqAfJAAAAAAAAwKgHOQAAAAAAAAAAAAAAAAAAAAAAAGjx71agrQkAPAAAADwAAAABgMIAAAoQUXIOPcCZmAABAAAACAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABo8e9WY68JAEAAAABAAAAA////////EFFyDj3AgQAAAZmYAAEAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGjx71btMQwAQAAAAEAAAAD///////8AGIKsgdmIqgACfAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUw3aPHvVnbuDABAAAAAQAAAAP///////wDg/Es9epABFwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABo8e9Wx4AOAOoFAADqBQAAAYDCAAAVNmkHEQMDBdz+/gODGwEGEAEAAwIRERERAAAAHgXZQCIiIiIAAAEBAgFJgQHMBgY2aQchAwOEBMjIyAHlAgAA0wMAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiZAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP8AAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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ZW5zZS4KLS0+CjxodG1sPgo8aGVhZD4KICAgIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICAgIDxsaW5rIHJlbD0ic2hvcnRjdXQgaWNvbiIgaHJlZj0iZGF0YS9pbWcvb25vcy1sb2dvLnBuZyI+CgogICAgPGxpbmsgcmVsPSJhcHBsZS10b3VjaC1pY29uIiBocmVmPSJkYXRhL2ltZy9hcHBsZS10b3VjaC1pY29uLnBuZyI+CiAgICA8bWV0YSBuYW1lPSJhcHBsZS1tb2JpbGUtd2ViLWFwcC1jYXBhYmxlIiBjb250ZW50PSJ5ZXMiPgogICAgPG1ldGEgbmFtZT0iYXBwbGUtbW9iaWxlLXdlYi1hcHAtc3RhdHVzLWJhci1zdHlsZSIgY29udGVudD0iYmxhY2siPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiPgoKICAgIDx0aXRsZT5PTk9TPC90aXRsZT4KCiAgICA8IS0tIFRoaXJkIHBhcnR5IGxpYnJhcnkgY29kZSBpbmNsdWRlZCBoZXJlIC0tPgogICAgPCEtLVRPRE86IHVzZSBtaW5pZmllZCB2ZXJzaW9ucywgb25jZSBkZWJ1Z2dpbmcgaXMgY29tcGxldGUgLS0+CiAgICA8c2NyaXB0IHNyYz0idHAvYW5ndWxhci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0idHAvYW5ndWxhci1yb3V0ZS5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0idHAvYW5ndWxhci1jb29raWVzLmpzIj48L3NjcmlwdD4KCiAgICA8c2NyaXB0IHNyYz0idHAvZDMuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9InRwL3RvcG9qc29uLnYxLm1pbi5qcyI+PC9zY3JpcHQ+CgogICAgPHNjcmlwdCBzcmM9InRwL0NoYXJ0Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0idHAvYW5ndWxhci1jaGFydC5taW4uanMiPjwvc2NyaXB0PgoKICAgIDwhLS0gT05PUyBVSSBGcmFtZXdvcmsgaW5jbHVkZWQgaGVyZSAtLT4KICAgIDwhLS0gVE9ETzogdXNlIGEgc2luZ2xlIGNhdGVuYXRlZC1taW5pZmllZCBmaWxlIGhlcmUgLS0+CiAgICA8c2NyaXB0IHNyYz0ib25vcy5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL2RpcmVjdGl2ZXMuanMiPjwvc2NyaXB0PgoKICAgIDxzY3JpcHQgc3JjPSJhcHAvZncvdXRpbC91dGlsLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvZncvdXRpbC9lZS5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL2Z3L3V0aWwvZm4uanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC9mdy91dGlsL3JhbmRvbS5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL2Z3L3V0aWwvdGhlbWUuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC9mdy91dGlsL2tleXMuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC9mdy91dGlsL3ByZWZzLmpzIj48L3NjcmlwdD4KCiAgICA8c2NyaXB0IHNyYz0iYXBwL2Z3L21hc3QvbWFzdC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL2Z3L25hdi9uYXYuanMiPjwvc2NyaXB0PgoKICAgIDxzY3JpcHQgc3JjPSJhcHAvZncvc3ZnL3N2Zy5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL2Z3L3N2Zy9nbHlwaC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL2Z3L3N2Zy9pY29uLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvZncvc3ZnL2dlb2RhdGEuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC9mdy9zdmcvbWFwLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvZncvc3ZnL3pvb20uanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC9mdy9zdmcvc3ZnVXRpbC5qcyI+PC9zY3JpcHQ+CgogICAgPHNjcmlwdCBzcmM9ImFwcC9mdy9yZW1vdGUvcmVtb3RlLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvZncvcmVtb3RlL3VybGZuLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvZncvcmVtb3RlL3Jlc3QuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC9mdy9yZW1vdGUvd3NvY2suanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC9mdy9yZW1vdGUvd2Vic29ja2V0LmpzIj48L3NjcmlwdD4KCiAgICA8c2NyaXB0IHNyYz0iYXBwL2Z3L3dpZGdldC93aWRnZXQuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC9mdy93aWRnZXQvdGFibGUuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC9mdy93aWRnZXQvdG9vbGJhci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL2Z3L3dpZGdldC90b29sdGlwLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvZncvd2lkZ2V0L2J1dHRvbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL2Z3L3dpZGdldC90YWJsZUJ1aWxkZXIuanMiPjwvc2NyaXB0PgoKICAgIDxzY3JpcHQgc3JjPSJhcHAvZncvbGF5ZXIvbGF5ZXIuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC9mdy9sYXllci9wYW5lbC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL2Z3L2xheWVyL2RpYWxvZy5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL2Z3L2xheWVyL2ZsYXNoLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvZncvbGF5ZXIvcXVpY2toZWxwLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvZncvbGF5ZXIvdmVpbC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL2Z3L2xheWVyL2xvYWRpbmcuanMiPjwvc2NyaXB0PgoKICAgIDwhLS0gRnJhbWV3b3JrIGFuZCBsaWJyYXJ5IHN0eWxlc2hlZXRzIGluY2x1ZGVkIGhlcmUgLS0+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9InRwL2FuZ3VsYXItY2hhcnQubWluLmNzcyI+CgogICAgPCEtLSBUT0RPOiB1c2UgYSBzaW5nbGUgY2F0ZW5hdGVkLW1pbmlmaWVkIGZpbGUgaGVyZSAtLT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYXBwL29ub3MuY3NzIj4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYXBwL2NvbW1vbi5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJhcHAvZncvbWFzdC9tYXN0LmNzcyI+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImFwcC9mdy9zdmcvZ2x5cGguY3NzIj4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYXBwL2Z3L3N2Zy9pY29uLmNzcyI+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImFwcC9mdy9sYXllci9wYW5lbC5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJhcHAvZncvbGF5ZXIvZGlhbG9nLmNzcyI+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImFwcC9mdy9sYXllci9mbGFzaC5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJhcHAvZncvbGF5ZXIvcXVpY2toZWxwLmNzcyI+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImFwcC9mdy9sYXllci92ZWlsLmNzcyI+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImFwcC9mdy9sYXllci9sb2FkaW5nLmNzcyI+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImFwcC9mdy9uYXYvbmF2LmNzcyI+CiAgICA8bGluayByZWw9InN0eWxlc2hz8e9W6jcGAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0xA5AAEAG5s7AqAc2wKgHYJbPH/Wjap9FDr46eoAQIWapZwAAAQEICgC3yKYAYg+cc/HvVhQ4BgAeEAAAHhAAAGj3KB/SxQgAJ60eEwgARQAQEH8dQABABhvkwKgHYMCoBzYf9ZbPDr46eqNqn0WAGAJCn+kAAAEBCAoAYg+cALfIpWVldCIgaHJlZj0iYXBwL2Z3L3dpZGdldC9idXR0b24uY3NzIj4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYXBwL2Z3L3dpZGdldC90b29sYmFyLmNzcyI+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImFwcC9mdy93aWRnZXQvdG9vbHRpcC5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJhcHAvZncvd2lkZ2V0L3RhYmxlLmNzcyI+CgogICAgPCEtLSBCdWlsdGluIHZpZXdzIGphdmFzY3JpcHQuIC0tPgogICAgPHNjcmlwdCBzcmM9ImFwcC92aWV3L3RvcG8vdG9wby5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL3ZpZXcvdG9wby90b3BvRDMuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC92aWV3L3RvcG8vdG9wb0V2ZW50LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvdmlldy90b3BvL3RvcG9EaWFsb2cuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC92aWV3L3RvcG8vdG9wb0ZpbHRlci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL3ZpZXcvdG9wby90b3BvRm9yY2UuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC92aWV3L3RvcG8vdG9wb0luc3QuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC92aWV3L3RvcG8vdG9wb0xpbmsuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC92aWV3L3RvcG8vdG9wb01vZGVsLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvdmlldy90b3BvL3RvcG9PYmxpcXVlLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvdmlldy90b3BvL3RvcG9PdmVybGF5LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvdmlldy90b3BvL3RvcG9QYW5lbC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL3ZpZXcvdG9wby90b3BvU2VsZWN0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvdmlldy90b3BvL3RvcG9TcHJpdGUuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC92aWV3L3RvcG8vdG9wb1RyYWZmaWMuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC92aWV3L3RvcG8vdG9wb1RyYWZmaWNOZXcuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC92aWV3L3RvcG8vdG9wb1Rvb2xiYXIuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC92aWV3L2RldmljZS9kZXZpY2UuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC92aWV3L2Zsb3cvZmxvdy5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL3ZpZXcvcG9ydC9wb3J0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvdmlldy9ncm91cC9ncm91cC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL3ZpZXcvbWV0ZXIvbWV0ZXIuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC92aWV3L2xpbmsvbGluay5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL3ZpZXcvaG9zdC9ob3N0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvdmlldy9pbnRlbnQvaW50ZW50LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvdmlldy9hcHAvYXBwLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvdmlldy9zZXR0aW5ncy9zZXR0aW5ncy5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL3ZpZXcvY2x1c3Rlci9jbHVzdGVyLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvdmlldy9wcm9jZXNzb3IvcHJvY2Vzc29yLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvdmlldy90dW5uZWwvdHVubmVsLmpzIj48L3NjcmlwdD4KCiAgICA8IS0tIENvbnRyaWJ1dGVkIGphdmFzY3JpcHQgaW5qZWN0ZWQgaGVyZSAtLT4KICAgIDwhLS0gQnVpbHRpbiB2aWV3IGphdmFzY3JpcHQgZGVmaW5lZCBpbiBpbmRleC5odG1sIHRlbXBsYXRlIC0tPgoKCgogICAgPCEtLSBCdWlsdGluIHZpZXdzIHN0eWxlc2hlZXRzLiAtLT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYXBwL3ZpZXcvdG9wby90b3BvLmNzcyI+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImFwcC92aWV3L2RldmljZS9kZXZpY2UuY3NzIj4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYXBwL3ZpZXcvZmxvdy9mbG93LmNzcyI+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImFwcC92aWV3L3BvcnQvcG9ydC5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJhcHAvdmlldy9ncm91cC9ncm91cC5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJhcHAvdmlldy9tZXRlci9tZXRlci5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJhcHAvdmlldy9saW5rL2xpbmsuY3NzIj4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYXBwL3ZpZXcvaG9zdC9ob3N0LmNzcyI+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImFwcC92aWV3L2ludGVudC9pbnRlbnQuY3NzIj4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYXBwL3ZpZXcvYXBwL2FwcC5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJhcHAvdmlldy9zZXR0aW5ncy9zZXR0aW5ncy5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJhcHAvdmlldy9jbHVzdGVyL2NsdXN0ZXIuY3NzIj4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYXBwL3ZpZXcvcHJvY2Vzc29yL3Byb2Nlc3Nvci5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJhcHAvdmlldy90dW5uZWwvdHVubmVsLmNzcyI+CgogICAgPCEtLSBDb250cmlidXRlZCBzdHlsZXNoZWV0cyBpbmplY3RlZCBoZXJlIC0tPgogICAgPCEtLSBCdWlsdGluIHZpZXcgc3R5bGVzaGVldHMgZGVmaW5lZCBpbiBpbmRleC5odG1sIHRlbXBsYXRlIC0tPgoKCgo8L2hlYWQ+Cjxib2R5IGNsYXNzPSJsaWdodCIgbmctYXBwPSJvbm9zQXBwIj4KPGRpdiBpZD0iZnJhbWUiIG5nLWNvbnRyb2xsZXI9Ik9ub3NDdHJsIGFzIG9ub3NDdHJsIiBkZXRlY3QtYnJvd3Nlcj4KICAgIDxkaXYgaWQ9Im1hc3QiCiAgICAgICAgIG5nLWNvbnRyb2xsZXI9Ik1hc3RDdHJsIGFzIG1hc3RDdHJsIgogICAgICAgICBuZy1pbmNsdWRlPSInYXBwL2Z3L21hc3QvbWFzdC5odG1sJyI+PC9kaXY+CgogICAgPGRpdiBpZD0idmlldyIgbmctdmlldz48L2Rpdj4KCiAgICA8ZGl2IGlkPSJuYXYiCiAgICAgICAgIG5nLWNvbnRyb2xsZXI9Ik5hdkN0cmwgYXMgbmF2Q3RybCIKICAgICAgICAgbmctaW5jbHVkZT0iJ25hdi5odG1sJyI+PC9kaXY+CgogICAgPGRpdiBpZD0iZmxvYXRwYW5lbHMiPjwvZGl2PgogICAgPGRpdiBpZD0iYWxlcnRzIj48L2Rpdj4KICAgIDxkaXYgaWQ9InRvb2x0aXAiPjwvZGl2PgogICAgPGRpdiBpZD0iZmxhc2giPjwvZGl2PgogICAgPGRpdiBpZD0icXVpY2toZWxwIj48L2Rpdj4KICAgIDxkaXYgaWQ9InZlaWwiPgogICAgICAgIDxkaXYgY2xhc3M9Im1zZyI+PC9kaXY+CiAgICAgICAgPHN2ZyByZXNpemU+PC9zdmc+CiAgICA8L2Rpdj4KPC9kaXY+Cgo8c2NyaXB0PgogICAgPCEtLSBJbmplY3QgdXNlciBhZ2VudCBpbmZvIGludG8gaHRtbCBlbGVtZW50IHRvIGFsbG93IENTUyBzZW5zaXRpdml0eS4gLS0+CiAgICAoZnVuY3Rpb24gKCkgewogICAgICAgIHZhciB0ID0gISEoJ29udG91Y2hzdGFydCcgaW4gd2luZG93KSB8fCAhISgnb25tc2dlc3R1cmVjaGFuZ2UnIGluIHdpbmRvdyk7CiAgICAgICAgZDMuc2VsZWN0KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkKICAgICAgICAgICAgLmF0dHIoJ2RhdGEtdXNlcmFnZW50JywgbmF2aWdhdG9yLnVzZXJBZ2VudCkKICAgICAgICAgICAgLmF0dHIoJ2RhdGEtcGxhdGZvcm0nLCBuYXZpZ2F0b3IucGxhdGZvcm0pCiAgICAgICAgICAgIC5jbGFzc2VkKCd0b3VjaCcsIHQpOwogICAgfSgpKTsKPC9zY3JpcHQ+CjwvYm9keT4KPC9odG1sPgpz8e9WTDgGAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0xA9AAEAG5s3AqAc2wKgHYJbPH/Wjap9FDr5KVoAQIWaZiwAAAQEICgC3yKYAYg+cc/HvVjBLBgBKAAAASgAAAAgAJ60eE2j3KB/SxQgARQAAPG0YQABABj29wKgHNsCoB2CW1R/14bv3ggyZ4PSAGAHPI8AAAAEBCAoAt8inAGINC4iCSIhQaEthc/HvVlJLBgBCAAAAQgAAAGj3KB/SxQgAJ60eEwgARQAANCecQABABoNBwKgHYMCoBzYf9ZbVDJng9OG794qAEADukA0AAAEBCAoAYg+dALfIp3Px71biAAcAuwIAALsCAAAIACetHhNo9ygf0sUIAEUAAq3EEEAAQAbkU8CoBzbAqAdgls8f9aNqn0UOvkpWgBghZjcWAAABAQgKALfIswBiD5xHRVQgL29ub3MvdWkvdHAvYW5ndWxhci5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiAqLyoNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9WVwEHAMECAADBAgAACAAnrR4TaPcoH9LFCABFAAKz4j1AAEAGxiDAqAc2wKgHYJbUH/VA3bJsoa4r+YAYB6AIiwAAAQEICgC3yLMAYeWkR0VUIC9vbm9zL3VpL3RwL2FuZ3VsYXItcm91dGUuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVtsBBwDDAgAAwwIAAAgAJ60eE2j3KB/SxQgARQACtd2KQABABsrRwKgHNsCoB2CW0R/1jJeNl1qVdlKAGAWkfgYAAAEBCAoAt8izAGHlpEdFVCAvb25vcy91aS90cC9hbmd1bGFyLWNvb2tpZXMuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVlgCBwC2AgAAtgIAAAgAJ60eE2j3KB/SxQgARQACqGSDQABABkPmwKgHNsCoB2CW0x/1YRwya3KChBKAGAWVp8UAAAEBCAoAt8izAGHlo0dFVCAvb25vcy91aS90cC9kMy5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiAqLyoNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9W2QIHAMMCAADDAgAACAAnrR4TaPcoH9LFCABFAAK1X5tAAEAGSMHAqAc2wKgHYJbQH/X5PfygazpBAIAYBaQj7QAAAQEICgC3yLMAYeWgR0VUIC9vbm9zL3VpL3RwL3RvcG9qc29uLnYxLm1pbi5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiAqLyoNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNB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Z3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9WHRYHANECAADRAgAACAAnrR4TaPcoH9LFCABFAALD3YxAAEAGysHAqAc2wKgHYJbRH/WMl5AYWpV2kIAYBaSMpwAAAQEICgC3yLQAYg+qR0VUIC9vbm9zL3VpL2FwcC9mdy9tYXN0L21hc3QuY3NzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6IHRleHQvY3NzLCovKjtxPTAuMQ0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCnPx71YDFwcAgAAAAIAAAABo9ygf0sUIACetHhMIAEUAAHIorkAAQAaB8cCoB2DAqAc2H/WW0lNQvS40hzuRgBgCFZBLAAABAQgKAGIPqgC3yLRIVFRQLzEuMSAzMDQgTm90IE1vZGlmaWVkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCnPx71aBGgcA0QIAANECAAAIACetHhNo9ygf0sUIAEUAAsNrnEAAQAY8ssCoBzbAqAdgltIf9TSHO5FTUL1sgBgPM7JLAAABAQgKALfItABiD6pHRVQgL29ub3MvdWkvYXBwL2Z3L3N2Zy9nbHlwaC5jc3MgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogdGV4dC9jc3MsKi8qO3E9MC4xDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3Bv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ZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVkgnBwCAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAciu9QABABn7iwKgHYMCoBzYf9ZbTcoKEUGEcN2iAGAHMkEsAAAEBCAoAYg+rALfItEhUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0Kc/HvVoEnBwDUAgAA1AIAAAgAJ60eE2j3KB/SxQgARQACxmudQABABjyuwKgHNsCoB2CW0h/1NIc+IFNQvaqAGA8z5ycAAAEBCAoAt8i1AGIPq0dFVCAvb25vcy91aS9hcHAvZncvbGF5ZXIvZGlhbG9nLmNzcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiB0ZXh0L2NzcywqLyo7cT0wLjENCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9W7igHANMCAADTAgAACAAnrR4TaPcoH9LFCABFAALFZIZAAEAGQ8bAqAc2wKgHYJbTH/VhHDdocoKEjoAYBZVI0QAAAQEICgC3yLUAYg+rR0VUIC9vbm9zL3VpL2FwcC9mdy9sYXllci9mbGFzaC5jc3MgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogdGV4dC9jc3MsKi8qO3E9MC4xDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVgArBwCAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAcoEqQABABil1wKgHYMCoBzYf9ZbUoa4sN0Ddt3mAGAHhkEsAAAEBCAoAYg+sALfItUhUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0Kc/HvViktBwDXAgAA1wIAAAgAJ60eE2j3KB/SxQgARQACyeJAQABABsYHwKgHNsCoB2CW1B/1QN23eaGuLHWAGAegJAwAAAEBCAoAt8i2AGIPrEdFVCAvb25vcy91aS9hcHAvZncvbGF5ZXIvcXVpY2toZWxwLmNzcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiB0ZXh0L2NzcywqLyo7cT0wLjENCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9WSS8HAIAAAACAAAAAaPcoH9LFCAAnrR4TCABFAABygStAAEAGKXTAqAdgwKgHNh/1ltShrix1QN26DoAYAeyQSwAAAQEICgBiD6wAt8i2SFRUUC8xLjEgMzA0IE5vdCBNb2RpZmllZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQpz8e9WjDIHAIAAAACAAAAAaPcoH9LFCAAnrR4TCABFAAByK75AAEAGfuHAqAdgwKgHNh/1ltNygoSOYRw5+YAYAdeQSwAAAQEICgBiD6wAt8i1SFRUUC8xLjEgMzA0IE5vdCBNb2RpZmllZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQpz8e9WSzMHANICAADSAgAACAAnrR4TaPcoH9LFCABFAALE4kFAAEAGxgvAqAc2wKgHYJbUH/VA3boOoa4ss4AYB6D+eAAAAQEICgC3yLYAYg+sR0VUIC9vbm9zL3VpL2FwcC9mdy9sYXllci92ZWlsLmNzcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiB0ZXh0L2NzcywqLyo7cT0wLjENCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9W8jYHAIAAAACAAAAAaPcoH9LFCAAnrR4TCABFAAByiUNAAEAGIVzAqAdgwKgHNh/1ltBrOkE++T4BsoAYAduQSwAAAQEICgBiD6wAt8i1SFRUUC8xLjEgMzA0IE5vdCBNb2RpZmllZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQpz8e9WjjgHANUCAADVAgAACAAnrR4TaPcoH9LFCABFAALHZIdAAEAGQ8PAqAc2wKgHYJbTH/VhHDn5coKEzIAYBZXXmwAAAQEICgC3yLYAYg+sR0VUIC9vbm9zL3VpL2FwcC9mdy9sYXllci9sb2FkaW5nLmNzcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiB0ZXh0L2NzcywqLyo7cT0wLjENCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9WADkHAIAAAACAAAAAaPcoH9LFCAAnrR4TCABFAAByzItAAEAG3hPAqAdgwKgHNh/1ltFalXaQjJeSp4AYAhiQSwAAAQEICgBiD60At8i0SFRUUC8xLjEgMzA0IE5vdCBNb2RpZmllZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQpz8e9WejoHAM8CAADPAgAACAAnrR4TaPcoH9LFCABFAALBX51AAEAGSLPAqAc2wKgHYJbQH/X5PgGyazpBfIAYBaTvmAAAAQEICgC3yLYAYg+sR0VUIC9vbm9zL3VpL2FwcC9mdy9uYXYvbmF2LmNzcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiB0ZXh0L2NzcywqLyo7cT0wLjENCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9WGjwHANUCAADVAgAACAAnrR4TaPcoH9LFCABFAALH3Y1AAEAGyrzAqAc2wKgHYJbRH/WMl5KnWpV2zoAYBaSm/AAAAQEICgC3yLYAYg+tR0VUIC9vbm9zL3VpL2FwcC9mdy93aWRnZXQvYnV0dG9uLmNzcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiB0ZXh0L2NzcywqLyo7cT0wLjENCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9WIlUHAIAAAACAAAAAaPcoH9LFCAAnrR4TCABFAABygSxAAEAGKXPAqAdgwKgHNh/1ltShriyzQN28noAYAfeQSwAAAQEICgBiD64At8i2SFRUUC8xLjEgMzA0IE5vdCBNb2RpZmllZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQpz8e9WzlgHAIAAAACAAAAAaPcoH9LFCAAnrR4TCABFAAByzIxAAEAG3hLAqAdgwKgHNh/1ltFalXbOjJeVOoAYAiOQSwAAAQEICgBiD64At8i2SFRUUC8xLjEgMzA0IE5vdCBNb2RpZmllZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQpz8e9W/G4HAIAAAACAAAAAaPcoH9LFCAAnrR4TCABFAAByiURAAEAGIVvAqAdgwKgHNh/1ltBrOkF8+T4EP4AYAeaQSwAAAQEICgBiD7AAt8i2SFRUUC8xLjEgMzA0IE5vdCBNb2RpZmllZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQpz8e9WxG8HAIAAAACAAAAAaPcoH9LFCAAnrR4TCABFAAByKLBAAEAGge/AqAdgwKgHNh/1ltJTUL2qNIdAsoAYAiuQSwAAAQEICgBiD7AAt8i1SFRUUC8xLjEgMzA0IE5vdCBNb2RpZmllZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQpz8e9W+6AHANYCAADWAgAACAAnrR4TaPcoH9LFCABFAALI4kJAAEAGxgbAqAc2wKgHYJbUH/VA3byeoa4s8YAYB6CFaAAAAQEICgC3yL0AYg+uR0VUIC9vbm9zL3VpL2FwcC9mdy93aWRnZXQvdG9vbGJhci5jc3MgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogdGV4dC9jc3MsKi8qO3E9MC4xDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVmOhBwDWAgAA1gIAAAgAJ60eE2j3KB/SxQgARQACyN2OQABABsq6wKgHNsCoB2CW0R/1jJeVOlqVdwyAGAWkV/8AAAEBCAoAt8i9AGIPrkdFVCAvb25vcy91aS9hcHAvZncvd2lkZ2V0L3Rvb2x0aXAuY3NzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6IHRleHQvY3NzLCovKjtxPTAuMQ0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCnPx71YGogcA1AIAANQCAAAIACetHhNo9ygf0sUIAEUAAsZfnkAAQAZIrcCoBzbAqAdgltAf9fk+BD9rOkG6gBgFpBiOAAABAQgKALfIvQBiD7BHRVQgL29ub3MvdWkvYXBwL2Z3L3dpZGdldC90YWJsZS5jc3MgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogdGV4dC9jc3MsKi8qO3E9MC4xDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVrqiBwCbAgAAmwIAAAgAJ60eE2j3KB/SxQgARQACjWueQABABjzmwKgHNsCoB2CW0h/1NIdAslNQveiAGA8zsvwAAAEBCAoAt8i9AGIPsEdFVCAvb25vcy91aS9hcHAvdmlldy90b3BvL3RvcG8uY3NzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiB0ZXh0L2NzcywqLyo7cT0wLjENClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9W4aQHAEIAAABCAAAAaPcoH9LFCAAnrR4TCABFAAA0fyFAAEAGK7zAqAdgwKgHNh/1ls8OvkqUo2qkUYAQAmKQDQAAAQEICgBiD7QAt8i0c/HvVrCnBwCAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAcsyNQABABt4RwKgHYMCoBzYf9ZbRWpV3DIyXl86AGAIukEsAAAEBCAoAYg+0ALfIvUhUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0Kc/HvVluqBwCfAgAAnwIAAAgAJ60eE2j3KB/SxQgARQACkd2PQABABsrwwKgHNsCoB2CW0R/1jJeXzlqVd0qAGAWkngEAAAEBCAoAt8i+AGIPtEdFVCAvb25vcy91aS9hcHAvdmlldy9kZXZpY2UvZGV2aWNlLmNzcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogdGV4dC9jc3MsKi8qO3E9MC4xDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVkuyBwA6EQAAOhEAAGj3KB/SxQgAJ60eEwgARQARLCixQABABnE0wKgHYMCoBzYf9ZbSU1C96DSHQwuAEAI1oQUAAAEBCAoAYg+0ALfIvUhUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2Nzcw0KQ29udGVudC1MZW5ndGg6IDE3MDIzDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCi8qCiAqIENvcHlyaWdodCAyMDE0LDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gVG9wb2xvZ3kgVmlldyAtLSBDU1MgZmlsZQogKi8KCi8qIC0tLSBCYXNlIFNWRyBMYXllciAtLS0gKi8KCiNvdi10b3BvIHN2ZyB7CiAgICAvKiBwcmV2ZW50cyB0aGUgbGl0dGxlIGN1dC9jb3B5L3Bhc3RlIHNxdWFyZSB0aGF0IHdvdWxkIGFwcGVhciBvbiBpUGFkICovCiAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwp9Ci5saWdodCAjb3YtdG9wbyBzdmcgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKfQouZGFyayAjb3YtdG9wbyBzdmcgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzJiMmIyYjsKfQoKCi8qIC0tLSAiTm8gRGV2aWNlcyIgTGF5ZXIgLS0tICovCgojb3YtdG9wbyBzdmcgI3RvcG8tbm9EZXZzTGF5ZXIgewogICAgdmlzaWJpbGl0eTogaGlkZGVuOwp9CgoubGlnaHQgI292LXRvcG8gc3ZnIC5ub0RldnNCaXJkIHsKICAgIGZpbGw6ICNlY2Q7Cn0KLmRhcmsgI292LXRvcG8gc3ZnIC5ub0RldnNCaXJkIHsKICAgIGZpbGw6ICM2ODM0MzQ7Cn0KCiNvdi10b3BvIHN2ZyAjdG9wby1ub0RldnNMYXllciB0ZXh0IHsKICAgIGZvbnQtc2l6ZTogNjBwdDsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKfQoubGlnaHQgI292LXRvcG8gc3ZnICN0b3BvLW5vRGV2c0xheWVyIHRleHQgewogICAgZmlsbDogI2RkZTsKfQouZGFyayAjb3YtdG9wbyBzdmcgI3RvcG8tbm9EZXZzTGF5ZXIgdGV4dCB7CiAgICBmaWxsOiAjM2IzYjRmOwp9CgoKLyogLS0tIFRvcG8gTWFwIC0tLSAqLwoKI292LXRvcG8gc3ZnICN0b3BvLW1hcCB7CiAgICBzdHJva2Utd2lkdGg6IDJweDsKICAgIGZpbGw6IHRyYW5zcGFyZW50Owp9CgoubGlnaHQgI292LXRvcG8gc3ZnICN0b3BvLW1hcCB7CiAgICBzdHJva2U6ICNkZGQ7Cn0KLmRhcmsgI292LXRvcG8gc3ZnICN0b3BvLW1hcCB7CiAgICBzdHJva2U6ICM0NDQ7Cn0KCgovKiAtLS0gVG9wbyBTdW1tYXJ5IFBhbmVsIC0tLSAqLwoKI3RvcG8tcC1zdW1tYXJ5IHsKICAgIC8qIEJhc2UgY3NzIGZyb20gcGFuZWwuY3NzICovCn0KCi8qIC0tLSBUb3BvIERldGFpbCBQYW5lbCAtLS0gKi8KCiN0b3BvLXAtZGV0YWlsIHsKICAgIC8qIEJhc2UgY3NzIGZyb20gcGFuZWwuY3NzICovCiAgICB0b3A6IDMzOHB4Owp9Cmh0bWxbZGF0YS1wbGF0Zm9ybT0naVBhZCddICN0b3BvLXAtZGV0YWlsIHsKICAgIHRvcDogMzU0cHg7Cn0KCiN0b3BvLXAtZGV0YWlsIC5hY3Rpb25CdG5zIC5hY3Rpb25CdG4gewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9CiN0b3BvLXAtZGV0YWlsIC5hY3Rpb25CdG5zIC5hY3Rpb25CdG4gc3ZnIHsKICAgIHdpZHRoOiAzMHB4OwogICAgaGVpZ2h0OiAzMHB4Owp9CgoKLyogLS0tIGdlbmVyYWwgdG9wby1wYW5lbCBzdHlsaW5nIC0tLSAqLwoKLnRvcG8tcCBkaXYuaGVhZGVyIGRpdi5pY29uIHsKICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KLnRvcG8tcCBkaXYuYm9keSB7CiAgICBvdmVyZmxvdy15OiBzY3JvbGw7Cn0KCi50b3BvLXAgZGl2LmJvZHk6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi50b3BvLXAgc3ZnIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIHdpZHRoOiA0MnB4OwogICAgaGVpZ2h0OiA0MnB4Owp9CgoubGlnaHQgLnRvcG8tcCBzdmcgLmdseXBoIHsKICAgIGZpbGw6ICMyMjI7Cn0KCi5kYXJrIC50b3BvLXAgc3ZnIC5nbHlwaC5vdmVybGF5IHsKICAgIGZpbGw6ICMyMjI7Cn0KCi5kYXJrIC50b3BvLXAgc3ZnIC5nbHlwaCB7CiAgICBmaWxsOiAjZGRkOwp9Ci5saWdodCAudG9wby1wIHN2ZyAuZ2x5cGgub3ZlcmxheSB7CiAgICBmaWxsOiAjZmZmOwp9CgoKLnRvcG8tcCBoMiB7CiAgICBwYWRkaW5nOiAwIDRweDsKICAgIG1hcmdpbjogMDsKICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIHdpZHRoOiAyMTBweDsKICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cn0KLmxpZ2h0IC50b3BvLXAgaDIgewogICAgY29sb3I6IGJsYWNrOwp9Ci5kYXJrIC50b3BvLXAgaDIgewogICAgY29sb3I6ICNkZGQ7Cn0KCi50b3BvLXAgaDMgewogICAgcGFkZGluZzogMCA0cHg7CiAgICBtYXJnaW46IDA7CiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICB0b3A6IDIwcHg7CiAgICBsZWZ0OiA1MHB4Owp9Ci5saWdodCAudG9wby1wIGgzIHsKICAgIGNvbG9yOiBibGFjazsKfQouZGFyayAudG9wby1wIGgzIHsKICAgIGNvbG9yOiAjZGRkOwp9CgoudG9wby1wIHAsIHRhYmxlIHsKICAgIHBhZGRpbmc6IDRweDsKICAgIG1hcmdpbjogMDsKfQoKLnRvcG8tcCB0ZCB7CiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7Cn0KLnRvcG8tcCB0ZC5sYWJlbCB7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICBwYWRkaW5nLXJpZ2h0OiAxMnB4OwogICAgLyogd29ya3MgZm9yIGJvdGggbGlnaHQgYW5kIGRhcmsgdGhlbWVzIC4uLiAqLwogICAgY29sb3I6ICM3Nzc7Cn0KLnRvcG8tcCB0ZC52YWx1ZSB7Cn0KCi50b3BvLXAgaHIgewogICAgaGVpZ2h0OiAxcHg7CiAgICBib3JkZXI6IDA7Cn0KLmxpZ2h0IC50b3BvLXAgaHIgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2NjYzsKICAgIGNvbG9yOiAjY2NjOwp9Ci5kYXJrIC50b3BvLXAgaHIgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzg4ODsKICAgIGNvbG9yOiAjODg4Owp9CgovKiAtLS0gVG9wbyBJbnN0YW5jZSBQYW5lbCAtLS0gKi8KCiN0b3BvLXAtaW5zdGFuY2UgewogICAgaGVpZ2h0OiAxMDBweDsKfQoKI3RvcG8tcC1pbnN0YW5jZSBkaXYub25vc0luc3QgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgd2lkdGg6IDE3MHB4OwogICAgaGVpZ2h0OiA4NXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgojdG9wby1wLWluc3RhbmNlIHN2ZyByZWN0IHsKICAgIHN0cm9rZS13aWR0aDogMy41Owp9CiN0b3BvLXAtaW5zdGFuY2UgLm9ubGluZSBzdmcgcmVjdCB7CiAgICBvcGFjaXR5OiAxOwp9Ci5saWdodCAjdG9wby1wLWluc3RhbmNlIHN2ZyByZWN0IHsKICAgIGZpbGw6ICNjY2M7CiAgICBzdHJva2U6ICNhYWE7Cn0KLmxpZ2h0ICN0b3BvLXAtaW5zdGFuY2UgLm9ubGluZSBzdmcgcmVjdCB7CiAgICBmaWxsOiAjOWNmOwogICAgc3Ryb2tlOiAjNTU1Owp9Ci5kYXJrICN0b3BvLXAtaW5zdGFuY2Ugc3ZnIHJlY3QgewogICAgZmlsbDogIzY2NjsKICAgIHN0cm9rZTogIzIyMjsKfQouZGFyayAjdG9wby1wLWluc3RhbmNlIC5vbmxpbmUgc3ZnIHJlY3QgewogICAgZmlsbDogIzljZjsKICAgIHN0cm9rZTogIzk5OTsKfQoKCiN0b3BvLXAtaW5zdGFuY2Ugc3ZnIC5nbHlwaCB7CiAgICBmaWxsOiAjODg4OwogICAgZmlsbC1ydWxlOiBldmVub2RkOwp9CiN0b3BvLXAtaW5zdGFuY2UgLm9ubGluZSBzdmcgLmdseXBoIHsKICAgIGZpbGw6ICMwMDA7Cn0KCiN0b3BvLXAtaW5zdGFuY2Ugc3ZnIC5iYWRnZUljb24gewogICAgZmlsbC1ydWxlOiBldmVub2RkOwogICAgb3BhY2l0eTogMC40Owp9Ci5saWdodCAjdG9wby1wLWluc3RhbmNlIHN2ZyAuYmFkZ2VJY29uIHsKICAgIGZpbGw6ICM3Nzc7Cn0KLmRhcmsgI3RvcG8tcC1pbnN0YW5jZSBzdmcgLmJhZGdlSWNvbiB7CiAgICBmaWxsOiAjNTU1O3Px71YWtgcAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADRrn0AAQAY/PsCoBzbAqAdgltIf9TSHQwtTUM7ggBAPM62MAAABAQgKALfIvgBiD7Rz8e9WXLYHADoRAAA6EQAAaPcoH9LFCAAnrR4TCABFABEsKLRAAEAGcTHAqAdgwKgHNh/1ltJTUM7gNIdDC4AQAjWhBQAAAQEICgBiD7UAt8i9Cn0KCiN0b3BvLXAtaW5zdGFuY2UgLm9ubGluZSBzdmcgLmJhZGdlSWNvbiB7CiAgICBvcGFjaXR5OiAxLjA7Cn0KLmxpZ2h0ICN0b3BvLXAtaW5zdGFuY2UgLm9ubGluZSBzdmcgLmJhZGdlSWNvbiB7CiAgICBmaWxsOiAjZmZmOwp9Ci5kYXJrICN0b3BvLXAtaW5zdGFuY2UgLm9ubGluZSBzdmcgLmJhZGdlSWNvbiB7CiAgICBmaWxsOiAjZmZmOwp9CgojdG9wby1wLWluc3RhbmNlIHN2ZyB0ZXh0IHsKICAgIHRleHQtYW5jaG9yOiBtaWRkbGU7CiAgICBvcGFjaXR5OiAwLjM7Cn0KI3RvcG8tcC1pbnN0YW5jZSAub25saW5lIHN2ZyB0ZXh0IHsKICAgIG9wYWNpdHk6IDEuMDsKfQoubGlnaHQgI3RvcG8tcC1pbnN0YW5jZSBzdmcgdGV4dCB7CiAgICBmaWxsOiAjNDQ0Owp9Ci5saWdodCAjdG9wby1wLWluc3RhbmNlIC5vbmxpbmUgc3ZnIHRleHQgewogICAgZmlsbDogI2VlZTsKfQouZGFyayAjdG9wby1wLWluc3RhbmNlIHN2ZyB0ZXh0IHsKICAgIGZpbGw6ICNhYWE7Cn0KLmRhcmsgI3RvcG8tcC1pbnN0YW5jZSAub25saW5lIHN2ZyB0ZXh0IHsKICAgIGZpbGw6ICNjY2M7Cn0KCiN0b3BvLXAtaW5zdGFuY2Ugc3ZnIHRleHQuaW5zdFRpdGxlIHsKICAgIGZvbnQtc2l6ZTogMTFwdDsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwp9CiN0b3BvLXAtaW5zdGFuY2Ugc3ZnIHRleHQuaW5zdExhYmVsIHsKICAgIGZvbnQtc2l6ZTogOXB0OwogICAgZm9udC1zdHlsZTogaXRhbGljOwp9CgojdG9wby1wLWluc3RhbmNlIC5vbm9zSW5zdC5tYXN0ZXJzaGlwIHsKICAgIG9wYWNpdHk6IDAuMzsKfQojdG9wby1wLWluc3RhbmNlIC5vbm9zSW5zdC5tYXN0ZXJzaGlwLmFmZmluaXR5IHsKICAgIG9wYWNpdHk6IDEuMDsKfQoubGlnaHQgI3RvcG8tcC1pbnN0YW5jZSAub25vc0luc3QubWFzdGVyc2hpcC5hZmZpbml0eSBzdmcgcmVjdCB7CiAgICBmaWx0ZXI6IHVybCgjYmx1ZS1nbG93KTsKfQouZGFyayAjdG9wby1wLWluc3RhbmNlIC5vbm9zSW5zdC5tYXN0ZXJzaGlwLmFmZmluaXR5IHN2ZyByZWN0IHsKICAgIGZpbHRlcjogdXJsKCN5ZWxsb3ctZ2xvdyk7Cn0KLmxpZ2h0LmZpcmVmb3ggI3RvcG8tcC1pbnN0YW5jZSAub25vc0luc3QubWFzdGVyc2hpcC5hZmZpbml0eSBzdmcgcmVjdCB7CiAgICBmaWx0ZXI6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sO3V0ZjgsIDxzdmcgeG1sbnMgPSBcJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCc+PGZpbHRlciB4PVwiLTUwJVwiIHk9XCItNTAlXCIgd2lkdGg9XCIyMDAlXCIgaGVpZ2h0PVwiMjAwJVwiIGlkPVwiYmx1ZS1nbG93XCI+PGZlQ29sb3JNYXRyaXggdHlwZT1cIm1hdHJpeFwiIHZhbHVlcz1cIjAgMCAwIDAgIDAgMCAwIDAgMCAgMCAwIDAgMCAwICAwLjcgMCAwIDAgMSAgMCBcIj48L2ZlQ29sb3JNYXRyaXg+PGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj1cIjNcIiByZXN1bHQ9XCJjb2xvcmVkQmx1clwiPjwvZmVHYXVzc2lhbkJsdXI+PGZlTWVyZ2U+PGZlTWVyZ2VOb2RlIGluPVwiY29sb3JlZEJsdXJcIj48L2ZlTWVyZ2VOb2RlPjxmZU1lcmdlTm9kZSBpbj1cIlNvdXJjZUdyYXBoaWNcIj48L2ZlTWVyZ2VOb2RlPjwvZmVNZXJnZT48L2ZpbHRlcj48L3N2Zz4jYmx1ZS1nbG93Iik7Cn0KLmRhcmsuZmlyZWZveCAjdG9wby1wLWluc3RhbmNlIC5vbm9zSW5zdC5tYXN0ZXJzaGlwLmFmZmluaXR5IHN2ZyByZWN0IHsKICAgIGZpbHRlcjogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWw7dXRmOCwgPHN2ZyB4bWxucyA9IFwnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcJz48ZmlsdGVyIHg9XCItNTAlXCIgeT1cIi01MCVcIiB3aWR0aD1cIjIwMCVcIiBoZWlnaHQ9XCIyMDAlXCIgaWQ9XCJ5ZWxsb3ctZ2xvd1wiPjxmZUNvbG9yTWF0cml4IHR5cGU9XCJtYXRyaXhcIiB2YWx1ZXM9XCIwIDAgMCAwICAxLjAgMCAwIDAgMCAgMS4wIDAgMCAwIDAgIDAuMyAwIDAgMCAxICAwIFwiPjwvZmVDb2xvck1hdHJpeD48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPVwiM1wiIHJlc3VsdD1cImNvbG9yZWRCbHVyXCI+PC9mZUdhdXNzaWFuQmx1cj48ZmVNZXJnZT48ZmVNZXJnZU5vZGUgaW49XCJjb2xvcmVkQmx1clwiPjwvZmVNZXJnZU5vZGU+PGZlTWVyZ2VOb2RlIGluPVwiU291cmNlR3JhcGhpY1wiPjwvZmVNZXJnZU5vZGU+PC9mZU1lcmdlPjwvZmlsdGVyPjwvc3ZnPiN5ZWxsb3ctZ2xvdyIpOwp9CgoKLyogLS0tIFRvb2xiYXIgLS0tICovCgojdG9vbGJhci10b3BvLXRiYXIgLnRiYXItcm93LnJpZ2h0IHsKICAgIHdpZHRoOiAxMDAlOwp9CgojdG9vbGJhci10b3BvLXRiYXIgLnRiYXItcm93LXRleHQgewogICAgaGVpZ2h0OiAyMXB4OwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBwYWRkaW5nOiA4cHggNjBweCAwIDA7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7Cn0KCgovKiAtLS0gVG9wbyBOb2RlcyAtLS0gKi8KCiNvdi10b3BvIHN2ZyAuc3VwcHJlc3NlZCB7CiAgICBvcGFjaXR5OiAwLjUgIWltcG9ydGFudDsKfQoKI292LXRvcG8gc3ZnIC5zdXBwcmVzc2VkbWF4IHsKICAgIG9wYWNpdHk6IDAuMiAhaW1wb3J0YW50Owp9Cgojb3YtdG9wbyBzdmcgLm5vZGUgewogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoubGlnaHQgI292LXRvcG8gc3ZnIC5ub2RlLnNlbGVjdGVkIHJlY3QsCi5saWdodCAjb3YtdG9wbyBzdmcgLm5vZGUuc2VsZWN0ZWQgY2lyY2xlIHsKICAgIGZpbGw6ICNmOTA7CiAgICBmaWx0ZXI6IHVybCgjYmx1ZS1nbG93KTsKfQouZGFyayAjb3YtdG9wbyBzdmcgLm5vZGUuc2VsZWN0ZWQgcmVjdCwKLmRhcmsgI292LXRvcG8gc3ZnIC5ub2RlLnNlbGVjdGVkIGNpcmNsZSB7CiAgICBmaWxsOiAjZjkwOwogICAgZmlsdGVyOiB1cmwoI3llbGxvdy1nbG93KTsKfQoubGlnaHQuZmlyZWZveCAjb3YtdG9wbyBzdmcgLm5vZGUuc2VsZWN0ZWQgcmVjdCwKLmxpZ2h0LmZpcmVmb3ggI292LXRvcG8gc3ZnIC5ub2RlLnNlbGVjdGVkIGNpcmNsZSB7CiAgICBmaWx0ZXI6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sO3V0ZjgsIDxzdmcgeG1sbnMgPSBcJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCc+PGZpbHRlciB4PVwiLTUwJVwiIHk9XCItNTAlXCIgd2lkdGg9XCIyMDAlXCIgaGVpZ2h0PVwiMjAwJVwiIGlkPVwiYmx1ZS1nbG93XCI+PGZlQ29sb3JNYXRyaXggdHlwZT1cIm1hdHJpeFwiIHZhbHVlcz1cIjAgMCAwIDAgIDAgMCAwIDAgMCAgMCAwIDAgMCAwICAwLjcgMCAwIDAgMSAgMCBcIj48L2ZlQ29sb3JNYXRyaXg+PGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj1cIjNcIiByZXN1bHQ9XCJjb2xvcmVkQmx1clwiPjwvZmVHYXVzc2lhbkJsdXI+PGZlTWVyZ2U+PGZlTWVyZ2VOb2RlIGluPVwiY29sb3JlZEJsdXJcIj48L2ZlTWVyZ2VOb2RlPjxmZU1lcmdlTm9kZSBpbj1cIlNvdXJjZUdyYXBoaWNcIj48L2ZlTWVyZ2VOb2RlPjwvZmVNZXJnZT48L2ZpbHRlcj48L3N2Zz4jYmx1ZS1nbG93Iik7Cn0KLmRhcmsuZmlyZWZveCAjb3YtdG9wbyBzdmcgLm5vZGUuc2VsZWN0ZWQgcmVjdCwKLmRhcmsuZmlyZWZveCAjb3YtdG9wbyBzdmcgLm5vZGUuc2VsZWN0ZWQgY2lyY2xlIHsKICAgIGZpbHRlcjogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWw7dXRmOCwgPHN2ZyB4bWxucyA9IFwnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcJz48ZmlsdGVyIHg9XCItNTAlXCIgeT1cIi01MCVcIiB3aWR0aD1cIjIwMCVcIiBoZWlnaHQ9XCIyMDAlXCIgaWQ9XCJ5ZWxsb3ctZ2xvd1wiPjxmZUNvbG9yTWF0cml4IHR5cGU9XCJtYXRyaXhcIiB2YWx1ZXM9XCIwIDAgMCAwICAxLjAgMCAwIDAgMCAgMS4wIDAgMCAwIDAgIDAuMyAwIDAgMCAxICAwIFwiPjwvZmVDb2xvck1hdHJpeD48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPVwiM1wiIHJlc3VsdD1cImNvbG9yZWRCbHVyXCI+PC9mZUdhdXNzaWFuQmx1cj48ZmVNZXJnZT48ZmVNZXJnZU5vZGUgaW49XCJjb2xvcmVkQmx1clwiPjwvZmVNZXJnZU5vZGU+PGZlTWVyZ2VOb2RlIGluPVwiU291cmNlR3JhcGhpY1wiPjwvZmVNZXJnZU5vZGU+PC9mZU1lcmdlPjwvZmlsdGVyPjwvc3ZnPiN5ZWxsb3ctZ2xvdyIpOwp9Cgojb3YtdG9wbyBzdmcgLm5vZGUgdGV4dCB7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLyogRGV2aWNlIE5vZGVzICovCgojb3YtdG9wbyBzdmcgLm5vZGUuZGV2aWNlIHsKfQoKI292LXRvcG8gc3ZnIC5ub2RlLmRldmljZSByZWN0IHsKICAgIHN0cm9rZS13aWR0aDogMS41Owp9Cgojb3YtdG9wbyBzdmcgLm5vZGUuZGV2aWNlLmZpeGVkIHJlY3QgewogICAgc3Ryb2tlLXdpZHRoOiAxLjU7Cn0KLmxpZ2h0ICNvdi10b3BvIHN2ZyAubm9kZS5kZXZpY2UuZml4ZWQgcmVjdCB7CiAgICBzdHJva2U6ICNhYWE7Cn0KLmRhcmsgI292LXRvcG8gc3Znc/HvVrS2BwBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANGugQABABj89wKgHNsCoB2CW0h/1NIdDC1NQ39iAEA8znJMAAAEBCAoAt8i+AGIPtXPx71bOtgcAOhEAADoRAABo9ygf0sUIACetHhMIAEUAESwot0AAQAZxLsCoB2DAqAc2H/WW0lNQ39g0h0MLgBACNaEFAAABAQgKAGIPtQC3yL0gLm5vZGUuZGV2aWNlLmZpeGVkIHJlY3QgewogICAgc3Ryb2tlOiAjOTk5Owp9CgovKiBub3RlOiBkZXZpY2UgaXMgb2ZmbGluZSB3aXRob3V0IHRoZSAnb25saW5lJyBjbGFzcyAqLwoubGlnaHQgI292LXRvcG8gc3ZnIC5ub2RlLmRldmljZSB7CiAgICBmaWxsOiAjNzc3Owp9Ci5kYXJrICNvdi10b3BvIHN2ZyAubm9kZS5kZXZpY2UgewogICAgZmlsbDogIzU1NTsKfQoKLmxpZ2h0ICNvdi10b3BvIHN2ZyAubm9kZS5kZXZpY2UgcmVjdCB7CiAgICBzdHJva2U6ICM2NjY7Cn0KLmxpZ2h0ICNvdi10b3BvIHN2ZyAubm9kZS5kZXZpY2UgcmVjdCB7CiAgICBzdHJva2U6ICM5OTk7Cn0KCi5saWdodCAjb3YtdG9wbyBzdmcgLm5vZGUuZGV2aWNlLm9ubGluZSB7CiAgICBmaWxsOiAjNmU3ZmEzOwp9Ci5kYXJrICNvdi10b3BvIHN2ZyAubm9kZS5kZXZpY2Uub25saW5lIHsKICAgIGZpbGw6ICM0RTVDN0Y7Cn0KCi8qIG5vdGU6IGRldmljZSBpcyBvZmZsaW5lIHdpdGhvdXQgdGhlICdvbmxpbmUnIGNsYXNzICovCiNvdi10b3BvIHN2ZyAubm9kZS5kZXZpY2UgdGV4dCB7CiAgICBmaWxsOiAjYmJiOwogICAgZm9udDogMTBwdCBzYW5zLXNlcmlmOwp9Cgojb3YtdG9wbyBzdmcgLm5vZGUuZGV2aWNlLm9ubGluZSB0ZXh0IHsKICAgIGZpbGw6IHdoaXRlOwp9Cgojb3YtdG9wbyBzdmcgLm5vZGUuZGV2aWNlIC5zdmdJY29uIHJlY3QgewogICAgZmlsbDogI2FhYTsKfQojb3YtdG9wbyBzdmcgLm5vZGUuZGV2aWNlIC5zdmdJY29uIHVzZSB7CiAgICBmaWxsOiAjNzc3Owp9CiNvdi10b3BvIHN2ZyAubm9kZS5kZXZpY2Uuc2VsZWN0ZWQgLnN2Z0ljb24gcmVjdCB7CiAgICBmaWxsOiAjZjkwOwp9CiNvdi10b3BvIHN2ZyAubm9kZS5kZXZpY2Uub25saW5lIC5zdmdJY29uIHJlY3QgewogICAgZmlsbDogI2NjYzsKfQojb3YtdG9wbyBzdmcgLm5vZGUuZGV2aWNlLm9ubGluZSAuc3ZnSWNvbiB1c2UgewogICAgZmlsbDogIzAwMDsKfQojb3YtdG9wbyBzdmcgLm5vZGUuZGV2aWNlLm9ubGluZS5zZWxlY3RlZCAuc3ZnSWNvbiByZWN0IHsKICAgIGZpbGw6ICNmOTA7Cn0KCi8qIEJhZGdlcyAqLwovKiAoLi4uIHdvcmtzIGZvciBib3RoIGxpZ2h0IGFuZCBkYXJrIHRoZW1lcy4uLikgKi8KI292LXRvcG8gc3ZnIC5ub2RlIC5iYWRnZSBjaXJjbGUgewogICAgc3Ryb2tlOiAjYWFhOwp9Cgojb3YtdG9wbyBzdmcgLm5vZGUgLmJhZGdlLmJhZGdlSW5mbyBjaXJjbGUgewogICAgZmlsbDogIzk5ZDsKfQoKI292LXRvcG8gc3ZnIC5ub2RlIC5iYWRnZS5iYWRnZVdhcm4gY2lyY2xlIHsKICAgIGZpbGw6ICNkYTI7Cn0KCiNvdi10b3BvIHN2ZyAubm9kZSAuYmFkZ2UuYmFkZ2VFcnJvciBjaXJjbGUgewogICAgZmlsbDogI2U0NDsKfQoKI292LXRvcG8gc3ZnIC5ub2RlIC5iYWRnZSB1c2UgewogICAgZmlsbDogd2hpdGUgIWltcG9ydGFudDsKfQoKI292LXRvcG8gc3ZnIC5ub2RlIC5iYWRnZS5iYWRnZUluZm8gdXNlIHsKICAgIGZpbGw6ICM0NDg7Cn0KCiNvdi10b3BvIHN2ZyAubm9kZSAuYmFkZ2UgdGV4dCB7CiAgICBmaWxsOiB3aGl0ZSAhaW1wb3J0YW50Owp9Cgojb3YtdG9wbyBzdmcgLm5vZGUgLmJhZGdlLmJhZGdlSW5mbyB0ZXh0IHsKICAgIGZpbGw6ICM0NDg7Cn0KCi8qIEhvc3QgTm9kZXMgKi8KCiNvdi10b3BvIHN2ZyAubm9kZS5ob3N0IHsKfQoKI292LXRvcG8gc3ZnIC5ub2RlLmhvc3QgdGV4dCB7CiAgICBzdHJva2U6IG5vbmU7CiAgICBmb250OiA5cHQgc2Fucy1zZXJpZjsKfQoubGlnaHQgI292LXRvcG8gc3ZnIC5ub2RlLmhvc3QgdGV4dCB7CiAgICBmaWxsOiAjODQ2Owp9Ci5kYXJrICNvdi10b3BvIHN2ZyAubm9kZS5ob3N0IHRleHQgewogICAgZmlsbDogI0JCODA5RDsKfQoKLmxpZ2h0IHN2ZyAubm9kZS5ob3N0IGNpcmNsZSB7CiAgICBzdHJva2U6ICMwMDA7CiAgICBmaWxsOiAjZWRiOwp9Ci5kYXJrIHN2ZyAubm9kZS5ob3N0IGNpcmNsZSB7CiAgICBzdHJva2U6ICNlZWU7CiAgICBmaWxsOiAjQjJBMTgwOwp9CgoubGlnaHQgc3ZnIC5ub2RlLmhvc3QgLnN2Z0ljb24gewogICAgZmlsbDogIzQ0NDsKfQouZGFyayBzdmcgLm5vZGUuaG9zdCAuc3ZnSWNvbiB7CiAgICBmaWxsOiAjMjIyOwp9CgovKiAtLS0gVG9wbyBMaW5rcyAtLS0gKi8KCiNvdi10b3BvIHN2ZyAubGluayB7CiAgICBvcGFjaXR5OiAuOTsKfQoKI292LXRvcG8gc3ZnIC5saW5rLnNlbGVjdGVkLAojb3YtdG9wbyBzdmcgLmxpbmsuZW5oYW5jZWQgewogICAgc3Ryb2tlLXdpZHRoOiA0LjVweDsKfQoubGlnaHQgI292LXRvcG8gc3ZnIC5saW5rLnNlbGVjdGVkLAoubGlnaHQgI292LXRvcG8gc3ZnIC5saW5rLmVuaGFuY2VkIHsKICAgIGZpbHRlcjogdXJsKCNibHVlLWdsb3cpOwp9Ci5kYXJrICNvdi10b3BvIHN2ZyAubGluay5zZWxlY3RlZCwKLmRhcmsgI292LXRvcG8gc3ZnIC5saW5rLmVuaGFuY2VkIHsKICAgIGZpbHRlcjogdXJsKCN5ZWxsb3ctZ2xvdyk7Cn0KLmxpZ2h0LmZpcmVmb3ggI292LXRvcG8gc3ZnIC5saW5rLnNlbGVjdGVkLAoubGlnaHQuZmlyZWZveCAjb3YtdG9wbyBzdmcgLmxpbmsuZW5oYW5jZWQgewogICAgZmlsdGVyOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbDt1dGY4LCA8c3ZnIHhtbG5zID0gXCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wnPjxmaWx0ZXIgeD1cIi01MCVcIiB5PVwiLTUwJVwiIHdpZHRoPVwiMjAwJVwiIGhlaWdodD1cIjIwMCVcIiBpZD1cImJsdWUtZ2xvd1wiPjxmZUNvbG9yTWF0cml4IHR5cGU9XCJtYXRyaXhcIiB2YWx1ZXM9XCIwIDAgMCAwICAwIDAgMCAwIDAgIDAgMCAwIDAgMCAgMC43IDAgMCAwIDEgIDAgXCI+PC9mZUNvbG9yTWF0cml4PjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249XCIzXCIgcmVzdWx0PVwiY29sb3JlZEJsdXJcIj48L2ZlR2F1c3NpYW5CbHVyPjxmZU1lcmdlPjxmZU1lcmdlTm9kZSBpbj1cImNvbG9yZWRCbHVyXCI+PC9mZU1lcmdlTm9kZT48ZmVNZXJnZU5vZGUgaW49XCJTb3VyY2VHcmFwaGljXCI+PC9mZU1lcmdlTm9kZT48L2ZlTWVyZ2U+PC9maWx0ZXI+PC9zdmc+I2JsdWUtZ2xvdyIpOwp9Ci5kYXJrLmZpcmVmb3ggI292LXRvcG8gc3ZnIC5saW5rLnNlbGVjdGVkLAouZGFyay5maXJlZm94ICNvdi10b3BvIHN2ZyAubGluay5lbmhhbmNlZCB7CiAgICBmaWx0ZXI6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sO3V0ZjgsIDxzdmcgeG1sbnMgPSBcJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCc+PGZpbHRlciB4PVwiLTUwJVwiIHk9XCItNTAlXCIgd2lkdGg9XCIyMDAlXCIgaGVpZ2h0PVwiMjAwJVwiIGlkPVwieWVsbG93LWdsb3dcIj48ZmVDb2xvck1hdHJpeCB0eXBlPVwibWF0cml4XCIgdmFsdWVzPVwiMCAwIDAgMCAgMS4wIDAgMCAwIDAgIDEuMCAwIDAgMCAwICAwLjMgMCAwIDAgMSAgMCBcIj48L2ZlQ29sb3JNYXRyaXg+PGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj1cIjNcIiByZXN1bHQ9XCJjb2xvcmVkQmx1clwiPjwvZmVHYXVzc2lhbkJsdXI+PGZlTWVyZ2U+PGZlTWVyZ2VOb2RlIGluPVwiY29sb3JlZEJsdXJcIj48L2ZlTWVyZ2VOb2RlPjxmZU1lcmdlTm9kZSBpbj1cIlNvdXJjZUdyYXBoaWNcIj48L2ZlTWVyZ2VOb2RlPjwvZmVNZXJnZT48L2ZpbHRlcj48L3N2Zz4jeWVsbG93LWdsb3ciKTsKCn0KCiNvdi10b3BvIHN2ZyAubGluay5pbmFjdGl2ZSB7CiAgICBvcGFjaXR5OiAuNTsKICAgIHN0cm9rZS1kYXNoYXJyYXk6IDggNDsKfQovKiBGSVhNRTogUmV2aWV3IGZvciBub3QtcGVybWl0dGVkIGxpbmtzICovCiNvdi10b3BvIHN2ZyAubGluay5ub3QtcGVybWl0dGVkIHsKICAgIHN0cm9rZTogcmdiKDI1NSwwLDApOwogICAgc3Ryb2tlLXdpZHRoOiA1LjA7CiAgICBzdHJva2UtZGFzaGFycmF5OiA4IDQ7Cn0KCiNvdi10b3BvIHN2ZyAubGluay5zZWNvbmRhcnkgewogICAgc3Ryb2tlLXdpZHRoOiAzcHg7Cn0KLmxpZ2h0ICNvdi10b3BvIHN2ZyAubGluay5zZWNvbmRhcnkgewogICAgc3Ryb2tlOiByZ2JhKDAsMTUzLDUxLDAuNSk7Cn0KLmRhcmsgI292LXRvcG8gc3ZnIC5saW5rLnNlY29uZGFyeSB7CiAgICBzdHJva2U6IHJnYmEoMTIxLDIzMSwxNTgsMC41KTsKfQoKLyogUG9ydCB0cmFmZmljIGNvbG9yIHZpc3VhbGl6YXRpb24gZm9yIEticHMsIE1icHMsIGFuZCBHYnBzICovCgoubGlnaHQgI292LXRvcG8gc3ZnIC5saW5rLnNlY29uZGFyeS5wb3J0LXRyYWZmaWMtS2JwcyB7CiAgICBzdHJva2U6IHJnYigwLDE1Myw1MSk7CiAgICBzdHJva2Utd2lkdGg6IDUuMDsKfQouZGFyayAjb3YtdG9wbyBzdmcgLmxpbmsuc2Vjb25kYXJ5LnBvcnQtdHJhZmZpYy1LYnBzIHsKICAgIHN0cm9rZTogcmdiKDk4LCAxNTMsIDExOCk7CiAgICBzdHJva2Utd2lkdGg6IDUuMDsKfQoKLmxpZ2hz8e9WA7cHADwQAAA8EAAAaPcoH9LFCAAnrR4TCABFABAuKLpAAEAGcinAqAdgwKgHNh/1ltJTUPDQNIdDC4AYAjWgBwAAAQEICgBiD7UAt8i+dCAjb3YtdG9wbyBzdmcgLmxpbmsuc2Vjb25kYXJ5LnBvcnQtdHJhZmZpYy1NYnBzIHsKICAgIHN0cm9rZTogcmdiKDEyOCwxNDUsMjcpOwogICAgc3Ryb2tlLXdpZHRoOiA2LjU7Cn0KLmRhcmsgI292LXRvcG8gc3ZnIC5saW5rLnNlY29uZGFyeS5wb3J0LXRyYWZmaWMtTWJwcyB7CiAgICBzdHJva2U6IHJnYig5MSwgMTA5LCA1NCk7CiAgICBzdHJva2Utd2lkdGg6IDYuNTsKfQoKLmxpZ2h0ICNvdi10b3BvIHN2ZyAubGluay5zZWNvbmRhcnkucG9ydC10cmFmZmljLUdicHMgewogICAgc3Ryb2tlOiByZ2IoMjU1LCAxMzcsIDMpOwogICAgc3Ryb2tlLXdpZHRoOiA4LjA7Cn0KLmRhcmsgI292LXRvcG8gc3ZnIC5saW5rLnNlY29uZGFyeS5wb3J0LXRyYWZmaWMtR2JwcyB7CiAgICBzdHJva2U6IHJnYigxNzQsIDExOSwgNTUpOwogICAgc3Ryb2tlLXdpZHRoOiA4LjA7Cn0KCi5saWdodCAjb3YtdG9wbyBzdmcgLmxpbmsuc2Vjb25kYXJ5LnBvcnQtdHJhZmZpYy1HYnBzLWNob2tlZCB7CiAgICBzdHJva2U6IHJnYigxODMsIDMwLCAyMSk7CiAgICBzdHJva2Utd2lkdGg6IDguMDsKfQouZGFyayAjb3YtdG9wbyBzdmcgLmxpbmsuc2Vjb25kYXJ5LnBvcnQtdHJhZmZpYy1HYnBzLWNob2tlZCB7CiAgICBzdHJva2U6IHJnYigxMjcsIDQwLCAzOSk7CiAgICBzdHJva2Utd2lkdGg6IDguMDsKfQoKCiNvdi10b3BvIHN2ZyAubGluay5hbmltYXRlZCB7CiAgICBzdHJva2UtZGFzaGFycmF5OiA4IDU7CiAgICBhbmltYXRpb246IGFudHMgNXMgaW5maW5pdGUgbGluZWFyOwogICAgLyogYmVsb3cgbGluZSB3aWxsIGJlIGFkZGVkIHZpYSBKYXZhc2NyaXB0IGJhc2VkIG9uIHBhdGggKi8KICAgIC8qYW5pbWF0aW9uLWRpcmVjdGlvbjogcmV2ZXJzZTsqLwp9CkBrZXlmcmFtZXMgYW50cyB7CiAgICBmcm9tIHsKICAgICAgICBzdHJva2UtZGFzaG9mZnNldDogMDsKICAgIH0KICAgIHRvIHsKICAgICAgICBzdHJva2UtZGFzaG9mZnNldDogNDAwOwogICAgfQp9Cgojb3YtdG9wbyBzdmcgLmxpbmsucHJpbWFyeSB7CiAgICBzdHJva2Utd2lkdGg6IDRweDsKfQoubGlnaHQgI292LXRvcG8gc3ZnIC5saW5rLnByaW1hcnkgewogICAgc3Ryb2tlOiAjZmZBMzAwOwp9Ci5kYXJrICNvdi10b3BvIHN2ZyAubGluay5wcmltYXJ5IHsKICAgIHN0cm9rZTogI0Q1OEUwRjsKfQoKI292LXRvcG8gc3ZnIC5saW5rLnNlY29uZGFyeS5vcHRpY2FsIHsKICAgIHN0cm9rZS13aWR0aDogNHB4Owp9Ci5saWdodCAjb3YtdG9wbyBzdmcgLmxpbmsuc2Vjb25kYXJ5Lm9wdGljYWwgewogICAgc3Ryb2tlOiByZ2JhKDEyOCw2NCwyNTUsMC41KTsKfQouZGFyayAjb3YtdG9wbyBzdmcgLmxpbmsuc2Vjb25kYXJ5Lm9wdGljYWwgewogICAgc3Ryb2tlOiByZ2JhKDE2NCwxMzksMjE1LDAuNSk7Cn0KCiNvdi10b3BvIHN2ZyAubGluay5wcmltYXJ5Lm9wdGljYWwgewogICAgc3Ryb2tlLXdpZHRoOiA2cHg7Cn0KLmxpZ2h0ICNvdi10b3BvIHN2ZyAubGluay5wcmltYXJ5Lm9wdGljYWwgewogICAgc3Ryb2tlOiAjNzRmOwp9Ci5kYXJrICNvdi10b3BvIHN2ZyAubGluay5wcmltYXJ5Lm9wdGljYWwgewogICAgc3Ryb2tlOiAjNzM1MkNEOwp9CgovKiBMaW5rIExhYmVscyAqLwoKI292LXRvcG8gc3ZnIC5saW5rTGFiZWwgcmVjdCB7CiAgICBzdHJva2U6IG5vbmU7Cn0KLmxpZ2h0ICNvdi10b3BvIHN2ZyAubGlua0xhYmVsIHJlY3QgewogICAgZmlsbDogI2VlZTsKfQouZGFyayAjb3YtdG9wbyBzdmcgLmxpbmtMYWJlbCByZWN0IHsKICAgIGZpbGw6ICM1NTU7Cn0KCiNvdi10b3BvIHN2ZyAubGlua0xhYmVsIHRleHQgewogICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgIHN0cm9rZS13aWR0aDogMC4xOwogICAgZm9udC1zaXplOiA5cHQ7Cn0KLmxpZ2h0ICNvdi10b3BvIHN2ZyAubGlua0xhYmVsIHRleHQgewogICAgZmlsbDogIzQ0NDsKfQouZGFyayAjb3YtdG9wbyBzdmcgLmxpbmtMYWJlbCB0ZXh0IHsKICAgIGZpbGw6ICNlZWU7Cn0KCi8qIFBvcnQgTGFiZWxzICovCgojb3YtdG9wbyBzdmcgLnBvcnRMYWJlbCByZWN0IHsKICAgIHN0cm9rZTogbm9uZTsKfQoubGlnaHQgI292LXRvcG8gc3ZnIC5wb3J0TGFiZWwgcmVjdCB7CiAgICBmaWxsOiAjZWVlOwp9Ci5kYXJrICNvdi10b3BvIHN2ZyAucG9ydExhYmVsIHJlY3QgewogICAgZmlsbDogIzIyMjsKfQoKI292LXRvcG8gc3ZnIC5wb3J0TGFiZWwgdGV4dCB7CiAgICB0ZXh0LWFuY2hvcjogbWlkZGxlOwogICAgc3Ryb2tlLXdpZHRoOiAwLjE7CiAgICBmb250LXNpemU6IDExcHQ7Cn0KLmxpZ2h0ICNvdi10b3BvIHN2ZyAucG9ydExhYmVsIHRleHQgewogICAgZmlsbDogIzQ0NDsKfQouZGFyayAjb3YtdG9wbyBzdmcgLnBvcnRMYWJlbCB0ZXh0IHsKICAgIGZpbGw6ICNlZWU7Cn0KCi8qIE51bWJlciBvZiBMaW5rcyBMYWJlbHMgKi8KI292LXRvcG8gbGluZS5udW1MaW5rSGFzaCB7CiAgICBzdHJva2Utd2lkdGg6IDM7Cn0KCiNvdi10b3BvIHRleHQubnVtTGlua1RleHQgewogICAgZm9udC1zaXplOiAxNXB0Owp9Cgojb3YtdG9wbyB0ZXh0Lm51bUxpbmtUZXh0IHsKICAgIHRleHQtYW5jaG9yOiBtaWRkbGU7Cn0KCi5saWdodCAjb3YtdG9wbyB0ZXh0Lm51bUxpbmtUZXh0IHsKICAgIGZpbGw6ICM0NDQ7Cn0KLmRhcmsgI292LXRvcG8gdGV4dC5udW1MaW5rVGV4dCB7CiAgICBmaWxsOiAjZWVlOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qIFNwcml0ZSBMYXllciAqLwoKI292LXRvcG8gc3ZnICN0b3BvLXNwcml0ZXMgdXNlIHsKICAgIHN0cm9rZS13aWR0aDogMjsKfQojb3YtdG9wbyBzdmcgI3RvcG8tc3ByaXRlcyB0ZXh0IHsKICAgIHRleHQtYW5jaG9yOiBtaWRkbGU7CiAgICBmb250LXNpemU6IDIwcHQ7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7Cn0KCi5saWdodCAjb3YtdG9wbyBzdmcgI3RvcG8tc3ByaXRlcyAuZ29sZDEgdXNlIHsKICAgIHN0cm9rZTogI2ZkYTsKICAgIGZpbGw6IG5vbmU7Cn0KLmRhcmsgI292LXRvcG8gc3ZnICN0b3BvLXNwcml0ZXMgLmdvbGQxIHVzZSB7CiAgICBzdHJva2U6ICM1NDE7CiAgICBmaWxsOiBub25lOwp9Ci5saWdodCAjb3YtdG9wbyBzdmcgI3RvcG8tc3ByaXRlcyAuZ29sZDEgdGV4dCB7CiAgICBmaWxsOiAjZWRhOwp9Ci5kYXJrICNvdi10b3BvIHN2ZyAjdG9wby1zcHJpdGVzIC5nb2xkMSB0ZXh0IHsKICAgIGZpbGw6ICM1NDM7Cn0KCi5saWdodCAjb3YtdG9wbyBzdmcgI3RvcG8tc3ByaXRlcyAuYmx1ZTEgdXNlIHsKICAgIHN0cm9rZTogI2JiZDsKICAgIGZpbGw6IG5vbmU7Cn0KLmRhcmsgI292LXRvcG8gc3ZnICN0b3BvLXNwcml0ZXMgLmJsdWUxIHVzZSB7CiAgICBzdHJva2U6ICM0NDU7CiAgICBmaWxsOiBub25lOwp9Ci5saWdodCAjb3YtdG9wbyBzdmcgI3RvcG8tc3ByaXRlcyAuYmx1ZTEgdGV4dCB7CiAgICBmaWxsOiAjY2NlOwp9Ci5kYXJrICNvdi10b3BvIHN2ZyAjdG9wby1zcHJpdGVzIC5ibHVlMSB0ZXh0IHsKICAgIGZpbGw6ICM0NDY7Cn0KCi5saWdodCAjb3YtdG9wbyBzdmcgI3RvcG8tc3ByaXRlcyAuZ3JheTEgdXNlIHsKICAgIHN0cm9rZTogI2NjYzsKICAgIGZpbGw6IG5vbmU7Cn0KLmRhcmsgI292LXRvcG8gc3ZnICN0b3BvLXNwcml0ZXMgLmdyYXkxIHVzZSB7CiAgICBzdHJva2U6ICMzMzM7CiAgICBmaWxsOiBub25lOwp9Ci5saWdodCAjb3YtdG9wbyBzdmcgI3RvcG8tc3ByaXRlcyAuZ3JheTEgdGV4dCB7CiAgICBmaWxsOiAjZGRkOwp9Ci5kYXJrICNvdi10b3BvIHN2ZyAjdG9wby1zcHJpdGVzIC5ncmF5MSB0ZXh0IHsKICAgIGZpbGw6ICM0NDQ7Cn0KCi8qIGZpbGxzICovCi5saWdodCAjb3YtdG9wbyBzdmcgI3RvcG8tc3ByaXRlcyB1c2UuZmlsbC1ncmF5MiB7CiAgICBmaWxsOiAjZWVlOwp9Ci5kYXJrICNvdi10b3BvIHN2ZyAjdG9wby1zcHJpdGVzIHVzZS5maWxsLWdyYXkyIHsKICAgIGZpbGw6ICM0NDQ7Cn0KCi5saWdodCAjb3YtdG9wbyBzdmcgI3RvcG8tc3ByaXRlcyB1c2UuZmlsbC1ibHVlMiB7CiAgICBmaWxsOiAjYmNlOwp9Ci5kYXJrICNvdi10b3BvIHN2ZyAjdG9wby1zcHJpdGVzIHVzZS5maWxsLWJsdWUyIHsKICAgIGZpbGw6ICM0NDc7Cn0KCnPx71bIuAcAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADRroUAAQAY/PMCoBzbAqAdgltIf9TSHQwtTUQDKgBAPM3ugAAABAQgKALfIvwBiD7Vz8e9WN7oHAJsCAACbAgAACAAnrR4TaPcoH9LFCABFAAKNa6JAAEAGPOLAqAc2wKgHYJbSH/U0h0MLU1EAyoAYDzN3xAAAAQEICgC3yL8AYg+1R0VUIC9vbm9zL3VpL2FwcC92aWV3L2Zsb3cvZmxvdy5jc3MgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6IHRleHQvY3NzLCovKjtxPTAuMQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCnPx71Y3ugcAgAAAAIAAAABo9ygf0sUIACetHhMIAEUAAHKBLUAAQAYpcsCoB2DAqAc2H/WW1KGuLPFA3b8ygBgCAZBLAAABAQgKAGIPtQC3yL1IVFRQLzEuMSAzMDQgTm90IE1vZGlmaWVkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCnPx71aavAcAmwIAAJsCAAAIACetHhNo9ygf0sUIAEUAAo3iQ0AAQAbGQMCoBzbAqAdgltQf9UDdvzKhri0vgBgHoG8IAAABAQgKALfIvwBiD7VHRVQgL29ub3MvdWkvYXBwL3ZpZXcvcG9ydC9wb3J0LmNzcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogdGV4dC9jc3MsKi8qO3E9MC4xDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVk7BBwAVDgAAFQ4AAGj3KB/SxQgAJ60eEwgARQAOB8yOQABABtB7wKgHYMCoBzYf9ZbRWpV3SoyXmiuAGAI4neAAAAEBCAoAYg+1ALfIvkhUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2Nzcw0KQ29udGVudC1MZW5ndGg6IDM0NDENClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gRGV2aWNlIFZpZXcgLS0gQ1NTIGZpbGUKICovCgojb3YtZGV2aWNlIGgyIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKI292LWRldmljZSBkaXYuY3RybC1idG5zIHsKfQoKLmxpZ2h0ICNvdi1kZXZpY2UgLmN1cnJlbnQtdmlldyB1c2UgewogICAgZmlsbDogd2hpdGU7Cn0KLmRhcmsgI292LWRldmljZSAuY3VycmVudC12aWV3IHVzZSB7CiAgICBmaWxsOiAjMzA0ODYwOwp9CgoubGlnaHQgI292LWRldmljZSAuY3VycmVudC12aWV3IHJlY3QgewogICAgZmlsbDogZGVlcHNreWJsdWU7Cn0KLmRhcmsgI292LWRldmljZSAuY3VycmVudC12aWV3IHJlY3QgewogICAgZmlsbDogI2VlZTsKfQoKLyogTW9yZSBpbiBnZW5lcmljIHBhbmVsLmNzcyAqLwoKI2RldmljZS1kZXRhaWxzLXBhbmVsLmZsb2F0cGFuZWwgewogICAgLW1vei1ib3JkZXItcmFkaXVzOiAwOwogICAgYm9yZGVyLXJhZGl1czogMDsKICAgIHotaW5kZXg6IDA7Cn0KCi5saWdodCAjZGV2aWNlLWRldGFpbHMtcGFuZWwuZmxvYXRwYW5lbCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjI5LCAyMzQsIDIzNyk7Cn0KLmRhcmsgI2RldmljZS1kZXRhaWxzLXBhbmVsLmZsb2F0cGFuZWwgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzNBNDA0MjsKfQoKI2RldmljZS1kZXRhaWxzLXBhbmVsIC5jb250YWluZXIgewogICAgcGFkZGluZzogMCAxMnB4Owp9CgojZGV2aWNlLWRldGFpbHMtcGFuZWwgLmNsb3NlLWJ0biB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICByaWdodDogMTBweDsKICAgIHRvcDogMDsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoubGlnaHQgLmNsb3NlLWJ0biBzdmcuZW1iZWRkZWRJY29uIC5pY29uLnBsdXMgLmdseXBoIHsKICAgIGZpbGw6ICNhYWE7Cn0KLmRhcmsgLmNsb3NlLWJ0biBzdmcuZW1iZWRkZWRJY29uIC5pY29uLnBsdXMgLmdseXBoIHsKICAgIGZpbGw6ICNjY2M7Cn0KCiNkZXZpY2UtZGV0YWlscy1wYW5lbCAuZGV2LWljb24gewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgcGFkZGluZzogMCA2cHggMCAwOwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQoubGlnaHQgLmRldi1pY29uIHN2Zy5lbWJlZGRlZEljb24gLmdseXBoIHsKICAgIGZpbGw6IHJnYigwLCAxNzIsIDIyOSk7Cn0KLmRhcmsgLmRldi1pY29uIHN2Zy5lbWJlZGRlZEljb24gLmdseXBoIHsKICAgIGZpbGw6ICM0ODZEOTE7Cn0KCiNkZXZpY2UtZGV0YWlscy1wYW5lbCBoMiB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICBtYXJnaW46IDhweCAwOwp9CgojZGV2aWNlLWRldGFpbHMtcGFuZWwgLmVkaXRhYmxlIHsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGJvcmRlci1ib3R0b206IDFweCBkYXNoZWQgZGFya2dyZWVuOwp9CgojZGV2aWNlLWRldGFpbHMtcGFuZWwgaDIgaW5wdXQgewogICAgZm9udC1zaXplOiAxLjBlbTsKfQoKI2RldmljZS1kZXRhaWxzLXBhbmVsIC50b3AgZGl2LmxlZnQgewogICAgZmxvYXQ6IGxlZnQ7CiAgICBwYWRkaW5nOiAwIDE4cHggMCAwOwp9CiNkZXZpY2UtZGV0YWlscy1wYW5lbCAudG9wIGRpdi5yaWdodCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCiNkZXZpY2UtZGV0YWlscy1wYW5lbCB0ZC5sYWJlbCB7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICBwYWRkaW5nLXJpZ2h0OiAxMnB4OwogICAgLyogd29ya3MgZm9yIGJvdGggbGlnaHQgYW5kIGRhcmsgdGhlbWVzIC4uLiAqLwogICAgY29sb3I6ICM3Nzc7Cn0KCiNkZXZpY2UtZGV0YWlscy1wYW5lbCAuYWN0aW9uQnRucyBkaXYgewogICAgcGFkZGluZzogMTJweCA2cHg7Cn0KCiNkZXZpY2UtZGV0YWlscy1wYW5lbCAudG9wIGhyIHsKICAgIHdpZHRoOiA5NSU7CiAgICBtYXJnaW46IDAgYXV0bzsKfQoKLmxpZ2h0ICNkZXZpY2UtZGV0YWlscy1wYW5lbCBociB7CiAgICBvcGFjaXR5OiAuNTsKICAgIGJvcmRlci1jb2xvcjogI0ZGRjsKfQouZGFyayAjZGV2aWNlLWRldGFpbHMtcGFuZWwgaHIgewogICAgYm9yZGVyLWNvbG9yOiAjNjY2Owp9CgojZGV2aWNlLWRldGFpbHMtcGFuZWwgLmJvdHRvbSB0YWJsZSB7CiAgICBib3JkZXItc3BhY2luZzogMDsKfQoKI2RldmljZS1kZXRhaWxzLXBhbmVsIC5ib3R0b20gdGggewogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDJlbTsKfQoKLmxpZ2h0ICNkZXZpY2UtZGV0YWlscy1wYW5lbCAuYm90dG9tIHRoIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNDQ0M7CiAgICAvKiBkZWZhdWx0IHRleHQgY29sb3IgKi8KfQouZGFyayAjZGV2aWNlLWRldGFpbHMtcGFuZWwgLmJvdHRvbSB0aCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTMxMzEzOwogICAgY29sb3I6ICNjY2M7Cn0KCiNkZXZpY2UtZGV0YWlscy1wYW5lbCAuYm90dG9tIHRoLAojZGV2aWNlLWRldGFpbHMtcGFuZWwgLmJvdHRvbSB0ZCB7CiAgICBwYWRkaW5nOiA2cHggMTJweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKLmxpZ2h0ICNkZXZpY2UtZGV0YWlscy1wYW5lbCAuYm90dG9tIHRyOm50aC1jaGlsZChvZGQpIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7Cn0KLmxpZ2h0ICNkZXZpY2UtZGV0YWlscy1wYW5lbCAuYm90dG9tIHRyOm50aC1jaGlsZChldmVuKSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRUJFREYyOwp9Ci5kYXJrICNkZXZpY2UtZGV0YWlscy1wYW5lbCAuYm90dG9tIHRyOm50aC1jaGlsZChvZGQpIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICMzMzM7Cn0KLmRhcmsgI2RldmljZS1kZXRhaWxzLXBhbmVsIC5ib3R0b20gdHI6bnRoLWNoaWxkKGV2ZW4pIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICM1NTU7Cn0Kc/HvVl/CBwBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANN2QQABABs1MwKgHNsCoB2CW0R/1jJeaK1qVhR2AEAWkSmgAAAEBCAoAt8i/AGIPtXPx71apxgcAnQIAAJ0CAAAIACetHhNo9ygf0sUIAEUAAo/dkUAAQAbK8MCoBzbAqAdgltEf9YyXmitalYUdgBgFpKFEAAABAQgKALfIvwBiD7VHRVQgL29ub3MvdWkvYXBwL3ZpZXcvZ3JvdXAvZ3JvdXAuY3NzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiB0ZXh0L2NzcywqLyo7cT0wLjENClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9W1MoHAIAAAACAAAAAaPcoH9LFCAAnrR4TCABFAAByiUVAAEAGIVrAqAdgwKgHNh/1ltBrOkG6+T4G0YAYAfCQSwAAAQEICgBiD7YAt8i9SFRUUC8xLjEgMzA0IE5vdCBNb2RpZmllZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQpz8e9WP80HAJ0CAACdAgAACAAnrR4TaPcoH9LFCABFAAKPX59AAEAGSOPAqAc2wKgHYJbQH/X5PgbRazpB+IAYBaTgsAAAAQEICgC3yMAAYg+2R0VUIC9vbm9zL3VpL2FwcC92aWV3L21ldGVyL21ldGVyLmNzcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogdGV4dC9jc3MsKi8qO3E9MC4xDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVnjU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CiAqLwoKLyoKIE9OT1MgR1VJIC0tIExpbmsgVmlldyAtLSBDU1MgZmlsZQogKi8KCiNvdi1saW5rIGgyIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKI292LWxpbmsgZGl2LmN0cmwtYnRucyB7CiAgICB3aWR0aDogNDVweDsKfXPx71bx+wcAnwIAAJ8CAAAIACetHhNo9ygf0sUIAEUAApHEFEAAQAbka8CoBzbAqAdgls8f9aNqpqoOvk4YgBghZq9wAAABAQgKALfIwwBiD7hHRVQgL29ub3MvdWkvYXBwL3ZpZXcvaW50ZW50L2ludGVudC5jc3MgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6IHRleHQvY3NzLCovKjtxPTAuMQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCnPx71awAAgA6AQAAOgEAABo9ygf0sUIACetHhMIAEUABNqBLkAAQAYlCcCoB2DAqAc2H/WW1KGuLS9A3cGLgBgCDJSzAAABAQgKAGIPuQC3yL9IVFRQLzEuMSAyMDAgT0sNCkNvbnRlbnQtVHlwZTogdGV4dC9jc3MNCkNvbnRlbnQtTGVuZ3RoOiAxMDkyDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCi8qCiAqIENvcHlyaWdodCAyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIFBvcnQgVmlldyAtLSBDU1MgZmlsZQogKi8KCiNvdi1wb3J0IGgyIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKI292LXBvcnQgZGl2LmN0cmwtYnRucyB7Cn0KCi5saWdodCAjb3YtcG9ydCAuY3VycmVudC12aWV3IHVzZSB7CiAgICBmaWxsOiB3aGl0ZTsKfQouZGFyayAjb3YtcG9ydCAuY3VycmVudC12aWV3IHVzZSB7CiAgICBmaWxsOiAjMzA0ODYwOwp9CgoubGlnaHQgI292LXBvcnQgLmN1cnJlbnQtdmlldyByZWN0IHsKICAgIGZpbGw6IGRlZXBza3libHVlOwp9Ci5kYXJrICNvdi1wb3J0IC5jdXJyZW50LXZpZXcgcmVjdCB7CiAgICBmaWxsOiAjZWVlOwp9Cgojb3YtcG9ydCB0ZCB7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KI292LXBvcnQgdGQucmlnaHQgewogICAgdGV4dC1hbGlnbjogcmlnaHQ7Cn0KCiNvdi1wb3J0IHRyLm5vLWRhdGEgdGQgewogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CnPx71bTAQgAiAMAAIgDAABo9ygf0sUIACetHhMIAEUAA3orwkAAQAZ71cCoB2DAqAc2H/WW03KChQphHD7lgBgB7JNTAAABAQgKAGIPuQC3yMJIVFRQLzEuMSAyMDAgT0sNCkNvbnRlbnQtVHlwZTogdGV4dC9jc3MNCkNvbnRlbnQtTGVuZ3RoOiA3NDENClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gSG9zdCBWaWV3IC0tIENTUyBmaWxlCiAqLwoKI292LWhvc3QgaDIgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9Cgojb3YtaG9zdCBkaXYuY3RybC1idG5zIHsKICAgIHdpZHRoOiA0NXB4Owp9c/HvVksGCACZAgAAmQIAAAgAJ60eE2j3KB/SxQgARQACi+JEQABABsZBwKgHNsCoB2CW1B/1QN3Bi6GuMdWAGAegurkAAAEBCAoAt8jDAGIPuUdFVCAvb25vcy91aS9hcHAvdmlldy9hcHAvYXBwLmNzcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogdGV4dC9jc3MsKi8qO3E9MC4xDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVtwHCACjAgAAowIAAAgAJ60eE2j3KB/SxQgARQAClWSJQABABkPzwKgHNsCoB2CW0x/1YRw+5XKCiFCAGAWk918AAAEBCAoAt8jEAGIPuUdFVCAvb25vcy91aS9hcHAvdmlldy9zZXR0aW5ncy9zZXR0aW5ncy5jc3MgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6IHRleHQvY3NzLCovKjtxPTAuMQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCnPx71YdCQgAAgoAAAIKAABo9ygf0sUIACetHhMIAEUACfQovUAAQAZ4YMCoB2DAqAc2H/WW0lNRAMo0h0VkgBgCP5nNAAABAQgKAGIPugC3yL9IVFRQLzEuMSAyMDAgT0sNCkNvbnRlbnQtVHlwZTogdGV4dC9jc3MNCkNvbnRlbnQtTGVuZ3RoOiAyMzk4DQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCi8qCiAqIENvcHlyaWdodCAyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIEZsb3cgVmlldyAtLSBDU1MgZmlsZQogKi8KCiNvdi1mbG93IGgyIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKI292LWZsb3cgZGl2LmN0cmwtYnRucyB7Cn0KCi5saWdodCAjb3YtZmxvdyAuY3VycmVudC12aWV3IHVzZSB7CiAgICBmaWxsOiB3aGl0ZTsKfQouZGFyayAjb3YtZmxvdyAuY3VycmVudC12aWV3IHVzZSB7CiAgICBmaWxsOiAjMzA0ODYwOwp9CgoubGlnaHQgI292LWZsb3cgLmN1cnJlbnQtdmlldyByZWN0IHsKICAgIGZpbGw6IGRlZXBza3libHVlOwp9Ci5kYXJrICNvdi1mbG93IC5jdXJyZW50LXZpZXcgcmVjdCB7CiAgICBmaWxsOiAjZWVlOwp9CgoubGlnaHQgI292LWZsb3cgdHI6bnRoLWNoaWxkKDZuICsgMSksCi5saWdodCAjb3YtZmxvdyB0cjpudGgtY2hpbGQoNm4gKyAyKSwKLmxpZ2h0ICNvdi1mbG93IHRyOm50aC1jaGlsZCg2biArIDMpIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWU7Cn0KLmxpZ2h0ICNvdi1mbG93IHRyOm50aC1jaGlsZCg2biArIDQpLAoubGlnaHQgI292LWZsb3cgdHI6bnRoLWNoaWxkKDZuICsgNSksCi5saWdodCAjb3YtZmxvdyB0cjpudGgtY2hpbGQoNm4pIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7Cn0KLmRhcmsgI292LWZsb3cgdHI6bnRoLWNoaWxkKDZuICsgMSksCi5kYXJrICNvdi1mbG93IHRyOm50aC1jaGlsZCg2biArIDIpLAouZGFyayAjb3YtZmxvdyB0cjpudGgtY2hpbGQoNm4gKyAzKSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNDQ0Owp9Ci5kYXJrICNvdi1mbG93IHRyOm50aC1jaGlsZCg2biArIDQpLAouZGFyayAjb3YtZmxvdyB0cjpudGgtY2hpbGQoNm4gKyA1KSwKLmRhcmsgI292LWZsb3cgdHI6bnRoLWNoaWxkKDZuKSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzMzOwp9CgovKiBoaWdobGlnaHRlZCBjb2xvciAqLwoubGlnaHQgI292LWZsb3cgdHI6bnRoLWNoaWxkKDZuICsgMSkuZGF0YS1jaGFuZ2UsCi5saWdodCAjb3YtZmxvdyB0cjpudGgtY2hpbGQoNm4gKyAyKS5kYXRhLWNoYW5nZSwKLmxpZ2h0ICNvdi1mbG93IHRyOm50aC1jaGlsZCg2biArIDMpLmRhdGEtY2hhbmdlLAoubGlnaHQgI292LWZsb3cgdHI6bnRoLWNoaWxkKDZuICsgNCkuZGF0YS1jaGFuZ2UsCi5saWdodCAjb3YtZmxvdyB0cjpudGgtY2hpbGQoNm4gKyA1KS5kYXRhLWNoYW5nZSwKLmxpZ2h0ICNvdi1mbG93IHRyOm50aC1jaGlsZCg2bikuZGF0YS1jaGFuZ2UgewogICAgYmFja2dyb3VuZC1jb2xvcjogI0ZERkZEQzsKfQouZGFyayAjb3YtZmxvdyB0cjpudGgtY2hpbGQoNm4gKyAxKS5kYXRhLWNoYW5nZSwKLmRhcmsgI292LWZsb3cgdHI6bnRoLWNoaWxkKDZuICsgMikuZGF0YS1jaGFuZ2UsCi5kYXJrICNvdi1mbG93IHRyOm50aC1jaGlsZCg2biArIDMpLmRhdGEtY2hhbmdlLAouZGFyayAjb3YtZmxvdyB0cjpudGgtY2hpbGQoNm4gKyA0KS5kYXRhLWNoYW5nZSwKLmRhcmsgI292LWZsb3cgdHI6bnRoLWNoaWxkKDZuICsgNSkuZGF0YS1jaGFuZ2UsCi5kYXJrICNvdi1mbG93IHRyOm50aC1jaGlsZCg2bikuZGF0YS1jaGFuZ2UgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzVBNTYwMDsKfQoKI292LWZsb3cgdGQgewogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CiNvdi1mbG93IHRkLnJpZ2h0IHsKICAgIHRleHQtYWxpZ246IHJpZ2h0Owp9CiNvdi1mbG93IHRkLnNlbGVjdG9yLAojb3YtZmxvdyB0ZC50cmVhdG1lbnQgewogICAgdGV4dC1hbGlnbjogbGVmdDsKICAgIHBhZGRpbmctbGVmdDogMzZweDsKICAgIG9wYWNpdHk6IDAuNjU7Cn1z8e9WaQkIAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0a6NAAEAGPzrAqAc2wKgHYJbSH/U0h0VkU1EKioAQDzNvfQAAAQEICgC3yMQAYg+6c/HvVq0MCAChAgAAoQIAAAgAJ60eE2j3KB/SxQgARQACk2ukQABABjzawKgHNsCoB2CW0h/1NIdFZFNRCoqAGA8z1ZoAAAEBCAoAt8jEAGIPukdFVCAvb25vcy91aS9hcHAvdmlldy9jbHVzdGVyL2NsdXN0ZXIuY3NzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiB0ZXh0L2NzcywqLyo7cT0wLjENClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9WmkoIAAgOAAAIDgAAaPcoH9LFCAAnrR4TCABFAA36gS9AAEAGG+jAqAdgwKgHNh/1ltShrjHVQN3D4oAYAhad0wAAAQEICgBiD74At8jDSFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvY3NzDQpDb250ZW50LUxlbmd0aDogMzQyOA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNS0yMDE2IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIEFwcGxpY2F0aW9ucyBWaWV3IC0tIENTUyBmaWxlCiAqLwoKI292LWFwcCBoMiB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCiNvdi1hcHAgZGl2LmN0cmwtYnRucyB7CiAgICB3aWR0aDogMjkwcHg7Cn0KCiNvdi1hcHAgZm9ybSNpbnB1dEZpbGVGb3JtLAojb3YtYXBwIGlucHV0I3VwbG9hZEZpbGUgewogICAgZGlzcGxheTogbm9uZTsKfQoKI2FwcC1kaWFsb2cgcCB7CiAgICBmb250LXNpemU6IDEycHQ7Cn0KLmxpZ2h0ICNhcHAtZGlhbG9nIHAgewogICAgY29sb3I6IGRhcmtyZWQ7Cn0KLmRhcmsgI2FwcC1kaWFsb2cgcCB7CiAgICBjb2xvcjogI2M1NTsKfQoKI2FwcC1kaWFsb2cgcC5zdHJvbmcgewogICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KLmxpZ2h0ICNhcHAtZGlhbG9nIHAuc3Ryb25nIHsKICAgIGNvbG9yOiByZWQ7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmYwOwp9Ci5kYXJrICNhcHAtZGlhbG9nIHAuc3Ryb25nIHsKICAgIGNvbG9yOiAjYzU1OwogICAgYmFja2dyb3VuZC1jb2xvcjogI2RkNDsKfQoKCi5saWdodCAjYXBwLWRpYWxvZy5mbG9hdHBhbmVsLmRpYWxvZyB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOwp9Ci5kYXJrICNhcHAtZGlhbG9nLmZsb2F0cGFuZWwuZGlhbG9nIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICM0NDQ7Cn0KCiNhcHBsaWNhdGlvbi1kZXRhaWxzLXBhbmVsLmZsb2F0cGFuZWwgewogICAgLW1vei1ib3JkZXItcmFkaXVzOiAwOwogICAgYm9yZGVyLXJhZGl1czogMDsKICAgIHotaW5kZXg6IDA7Cn0KCi5saWdodCAjYXBwbGljYXRpb24tZGV0YWlscy1wYW5lbC5mbG9hdHBhbmVsIHsKICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigyMjksIDIzNCwgMjM3KTsKfQouZGFyayAjYXBwbGljYXRpb24tZGV0YWlscy1wYW5lbC5mbG9hdHBhbmVsIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICMzQTQwNDI7Cn0KCiNhcHBsaWNhdGlvbi1kZXRhaWxzLXBhbmVsIC5jb250YWluZXIgewogICAgcGFkZGluZzogMCAxMHB4Owp9CgojYXBwbGljYXRpb24tZGV0YWlscy1wYW5lbCAuY2xvc2UtYnRuIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHJpZ2h0OiAxMHB4OwogICAgdG9wOiAwOwogICAgY3Vyc29yOiBwb2ludGVyOwp9Ci5saWdodCAuY2xvc2UtYnRuIHN2Zy5lbWJlZGRlZEljb24gLmljb24ucGx1cyAuZ2x5cGggewogICAgZmlsbDogI2FhYTsKfQouZGFyayAuY2xvc2UtYnRuIHN2Zy5lbWJlZGRlZEljb24gLmljb24ucGx1cyAuZ2x5cGggewogICAgZmlsbDogI2NjYzsKfQoKI2FwcGxpY2F0aW9uLWRldGFpbHMtcGFuZWwgLmFwcC1pY29uIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIHBhZGRpbmc6IDAgNnB4IDAgMDsKICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cn0KCiNhcHBsaWNhdGlvbi1kZXRhaWxzLXBhbmVsIGgyIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIG1hcmdpbjogOHB4IDA7CiAgICBmb250LXNpemU6IDEycHQ7Cn0KCiNhcHBsaWNhdGlvbi1kZXRhaWxzLXBhbmVsIC50b3AgZGl2LmxlZnQgewogICAgZmxvYXQ6IGxlZnQ7CiAgICBwYWRkaW5nOiAwIDEycHggMCAwOwp9CiNhcHBsaWNhdGlvbi1kZXRhaWxzLXBhbmVsIC50b3AgZGl2LnJpZ2h0IHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB3aWR0aDogMzIwcHg7Cn0KCiNhcHBsaWNhdGlvbi1kZXRhaWxzLXBhbmVsIHRkLmxhYmVsLAojYXBwbGljYXRpb24tZGV0YWlscy1wYW5lbCAuYXBwLXVybCBpIHsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgIHBhZGRpbmctcmlnaHQ6IDEycHg7CiAgICAvKiB3b3JrcyBmb3IgYm90aCBsaWdodCBhbmQgZGFyayB0aGVtZXMgLi4uICovCiAgICBjb2xvcjogIzc3NzsKfQoKI2FwcGxpY2F0aW9uLWRldGFpbHMtcGFuZWwgdGQudmFsdWUtYm9sZCB7CiAgICBmb250LXdlaWdodDogYm9sZDsKfQoKI2FwcGxpY2F0aW9uLWRldGFpbHMtcGFuZWwgLmFwcC11cmwgewogICAgcGFkZGluZzogMTBweCA2cHggNnB4Owp9CgojYXBwbGljYXRpb24tZGV0YWlscy1wYW5lbCBociB7CiAgICB3aWR0aDogOTUlOwogICAgbWFyZ2luOiAxMHB4IGF1dG87Cn0KLmxpZ2h0ICNhcHBsaWNhdGlvbi1kZXRhaWxzLXBhbmVsIGhyIHsKICAgIG9wYWNpdHk6IC41OwogICAgYm9yZGVyLWNvbG9yOiAjRkZGOwp9Ci5kYXJrICNhcHBsaWNhdGlvbi1kZXRhaWxzLXBhbmVsIGhyIHsKICAgIGJvcmRlci1jb2xvcjogIzY2NjsKfQoKI2FwcGxpY2F0aW9uLWRldGFpbHMtcGFuZWwgLmJvdHRvbSB0YWJsZSB7CiAgICBib3JkZXItc3BhY2luZzogMDsKICAgIHdpZHRoOiAxMDAlOwp9CgojYXBwbGljYXRpb24tZGV0YWlscy1wYW5lbCAuYm90dG9tIHRkIHsKICAgIHBhZGRpbmc6IDZweCAxMnB4OwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKLmxpZ2h0ICNhcHBsaWNhdGlvbi1kZXRhaWxzLXBhbmVsIC5ib3R0b20gdHI6bnRoLWNoaWxkKG9kZCkgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2Y5ZjlmOTsKfQoubGlnaHQgI2FwcGxpY2F0aW9uLWRldGFpbHMtcGFuZWwgLmJvdHRvbSB0cjpudGgtY2hpbGQoZXZlbikgewogICAgYmFja2dyb3VuZC1jb2xvcjogI0VCRURGMjsKfQouZGFyayAjYXBwbGljYXRpb24tZGV0YWlscy1wYW5lbCAuYm90dG9tIHRyOm50aC1jaGlsZChvZGQpIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICMzMzM7Cn0KLmRhcmsgI2FwcGxpY2F0aW9uLWRldGFpbHMtcGFuZWwgLmJvdHRvbSB0cjpudGgtY2hpbGQoZXZlbikgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzU1NTsKfXPx71b1SggAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADTiRUAAQAbIl8CoBzbAqAdgltQf9UDdw+Khrj+bgBAHoGjDAAABAQgKALfIyABiD75z8e9WJEwIAKYIAACmCAAAaPcoH9LFCAAnrR4TCABFAAiYiUZAAEAGGTPAqAdgwKgHNh/1ltBrOkH4+T4JLIAYAfuYcQAAAQEICgBiD74At8jASFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvY3NzDQpDb250ZW50LUxlbmd0aDogMjA1MA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNiBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBNZXRlciBWaWV3IC0tIENTUyBmaWxlCiAqLwoKI292LW1ldGVyIGgyIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKI292LW1ldGVyIGRpdi5jdHJsLWJ0bnMgewp9CgoubGlnaHQgI292LW1ldGVyIC5jdXJyZW50LXZpZXcgdXNlIHsKICAgIGZpbGw6IHdoaXRlOwp9Ci5kYXJrICNvdi1tZXRlciAuY3VycmVudC12aWV3IHVzZSB7CiAgICBmaWxsOiAjMzA0ODYwOwp9CgoubGlnaHQgI292LW1ldGVyIC5jdXJyZW50LXZpZXcgcmVjdCB7CiAgICBmaWxsOiBkZWVwc2t5Ymx1ZTsKfQouZGFyayAjb3YtbWV0ZXIgLmN1cnJlbnQtdmlldyByZWN0IHsKICAgIGZpbGw6ICNlZWU7Cn0KCi5saWdodCAjb3YtbWV0ZXIgdHI6bnRoLWNoaWxkKDRuICsgMSksCi5saWdodCAjb3YtbWV0ZXIgdHI6bnRoLWNoaWxkKDRuICsgMikgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTsKfQoubGlnaHQgI292LW1ldGVyIHRyOm50aC1jaGlsZCg0biArIDMpLAoubGlnaHQgI292LW1ldGVyIHRyOm50aC1jaGlsZCg0bikgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDsKfQouZGFyayAjb3YtbWV0ZXIgdHI6bnRoLWNoaWxkKDRuICsgMSksCi5kYXJrICNvdi1tZXRlciB0cjpudGgtY2hpbGQoNG4gKyAyKSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNDQ0Owp9Ci5kYXJrICNvdi1tZXRlciB0cjpudGgtY2hpbGQoNG4gKyAzKSwKLmRhcmsgI292LW1ldGVyIHRyOm50aC1jaGlsZCg0bikgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzMzMzsKfQoKLyogaGlnaGxpZ2h0ZWQgY29sb3IgKi8KLmxpZ2h0ICNvdi1tZXRlciB0cjpudGgtY2hpbGQoNG4gKyAxKS5kYXRhLWNoYW5nZSwKLmxpZ2h0ICNvdi1tZXRlciB0cjpudGgtY2hpbGQoNG4gKyAyKS5kYXRhLWNoYW5nZSwKLmxpZ2h0ICNvdi1tZXRlciB0cjpudGgtY2hpbGQoNG4gKyAzKS5kYXRhLWNoYW5nZSwKLmxpZ2h0ICNvdi1tZXRlciB0cjpudGgtY2hpbGQoNG4pLmRhdGEtY2hhbmdlIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNGREZGREM7Cn0KLmRhcmsgI292LW1ldGVyIHRyOm50aC1jaGlsZCg0biArIDEpLmRhdGEtY2hhbmdlLAouZGFyayAjb3YtbWV0ZXIgdHI6bnRoLWNoaWxkKDRuICsgMikuZGF0YS1jaGFuZ2UsCi5kYXJrICNvdi1tZXRlciB0cjpudGgtY2hpbGQoNG4gKyAzKS5kYXRhLWNoYW5nZSwKLmRhcmsgI292LW1ldGVyIHRyOm50aC1jaGlsZCg0bikuZGF0YS1jaGFuZ2UgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzVBNTYwMDsKfQoKI292LW1ldGVyIHRkIHsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQojb3YtbWV0ZXIgdGQucmlnaHQgewogICAgdGV4dC1hbGlnbjogcmlnaHQ7Cn0KI292LW1ldGVyIHRkLmJhbmRzIHsKICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICBwYWRkaW5nLWxlZnQ6IDM2cHg7CiAgICBvcGFjaXR5OiAwLjY1Owp9c/HvVmBMCABCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANF+gQABABks9wKgHNsCoB2CW0B/1+T4JLGs6SlyAEAWkmMsAAAEBCAoAt8jIAGIPvnPx71aKTQgApQIAAKUCAAAIACetHhNo9ygf0sUIAEUAApfiRkAAQAbGM8CoBzbAqAdgltQf9UDdw+Khrj+bgBgHoPf1AAABAQgKALfIyABiD75HRVQgL29ub3MvdWkvYXBwL3ZpZXcvcHJvY2Vzc29yL3Byb2Nlc3Nvci5jc3MgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6IHRleHQvY3NzLCovKjtxPTAuMQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCnPx71blTggAkQMAAJEDAABo9ygf0sUIACetHhMIAEUAA4Mov0AAQAZ+z8CoB2DAqAc2H/WW0lNRCoo0h0fDgBgCSJNcAAABAQgKAGIPvgC3yMRIVFRQLzEuMSAyMDAgT0sNCkNvbnRlbnQtVHlwZTogdGV4dC9jc3MNCkNvbnRlbnQtTGVuZ3RoOiA3NTANClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gQ2x1c3RlciBWaWV3IC0tIENTUyBmaWxlCiAqLwoKI292LWNsdXN0ZXIgaDIgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9Cgojb3YtY2x1c3RlciBkaXYuY3RybC1idG5zIHsKICAgIHdpZHRoOiA0NXB4Owp9c/HvVs1PCACfAgAAnwIAAAgAJ60eE2j3KB/SxQgARQACkV+hQABABkjfwKgHNsCoB2CW0B/1+T4JLGs6SlyAGAWktgwAAAEBCAoAt8jIAGIPvkdFVCAvb25vcy91aS9hcHAvdmlldy90dW5uZWwvdHVubmVsLmNzcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogdGV4dC9jc3MsKi8qO3E9MC4xDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVvtTCADFAgAAxQIAAAgAJ60eE2j3KB/SxQgARQACt2ulQABABjy1wKgHNsCoB2CW0h/1NIdHw1NRDdmAGA8z8rQAAAEBCAoAt8jIAGIPvkdFVCAvb25vcy91aS90cC9hbmd1bGFyLWNoYXJ0Lm1pbi5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiAqLyoNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9WG1oIAIwDAACMAwAAaPcoH9LFCAAnrR4TCABFAAN+iUhAAEAGHkvAqAdgwKgHNh/1ltBrOkpc+T4LiYAYAgWTVwAAAQEICgBiD78At8jISFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvY3NzDQpDb250ZW50LUxlbmd0aDogNzQ1DQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCi8qCiAqIENvcHlyaWdodCAyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIExpbmsgVmlldyAtLSBDU1MgZmlsZQogKi8KCiNvdi10dW5uZWwgaDIgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9Cgojb3YtdHVubmVsIGRpdi5jdHJsLWJ0bnMgewogICAgd2lkdGg6IDQ1cHg7Cn1z8e9Wg10IAIAAAACAAAAAaPcoH9LFCAAnrR4TCABFAAByKMBAAEAGgd/AqAdgwKgHNh/1ltJTUQ3ZNIdKRoAYAlKQSwAAAQEICgBiD78At8jISFRUUC8xLjEgMzA0IE5vdCBNb2RpZmllZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQpz8e9W+V8IAH0CAAB9AgAACAAnrR4TaPcoH9LFCABFAAJvX6JAAEAGSQDAqAc2wKgHYJbQH/X5PguJazpNpoAYBaQ4TQAAAQEICgC3yMkAYg+/R0VUIC9vbm9zL3VpL29ub3MuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6ICovKg0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCnPx71Y7YAgAQgAAAEIAAABo9ygf0sUIACetHhMIAEUAADTMkUAAQAbeS8CoB2DAqAc2H/WW0VqVhR2Ml5yGgBACQ5ANAAABAQgKAGIPwAC3yL9z8e9WcmAIAL8CAAC/AgAACAAnrR4TaPcoH9LFCABFAAKxa6ZAAEAGPLrAqAc2wKgHYJbSH/U0h0pGU1EOF4AYDzNPpgAAAQEICgC3yMkAYg+/R0VUIC9vbm9zL3VpL2FwcC9kaXJlY3RpdmVzLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6ICovKg0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCnPx71ZuYggAlQMAAJUDAABo9ygf0sUIACetHhMIAEUAA4crw0AAQAZ7x8CoB2DAqAc2H/WW03KCiFBhHEFGgBgB95NgAAABAQgKAGIPwAC3yMRIVFRQLzEuMSAyMDAgT0sNCkNvbnRlbnQtVHlwZTogdGV4dC9jc3MNCkNvbnRlbnQtTGVuZ3RoOiA3NTQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gU2V0dGluZ3MgVmlldyAtLSBDU1MgZmlsZQogKi8KCiNvdi1zZXR0aW5ncyBoMiB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCiNvdi1zZXR0aW5ncyBkaXYuY3RybC1idG5zIHsKICAgIHdpZHRoOiA0NXB4Owp9CnPx71YWZQgA1AgAANQIAABo9ygf0sUIACetHhMIAEUACMZ/JUAAQAYjJsCoB2DAqAc2H/WWzw6+ThijaqkHgBgCgpifAAABAQgKAGIPwAC3yMNIVFRQLzEuMSAyMDAgT0sNCkNvbnRlbnQtVHlwZTogdGV4dC9jc3MNCkNvbnRlbnQtTGVuZ3RoOiAyMDk2DQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCi8qCiAqIENvcHlyaWdodCAyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIEludGVudCBWaWV3IC0tIENTUyBmaWxlCiAqLwoKI292LWludGVudCBoMiB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCiNvdi1pbnRlbnQgZGl2LmN0cmwtYnRucyB7Cn0KCi5saWdodCAjb3YtaW50ZW50IHRyOm50aC1jaGlsZCg2biArIDEpLAoubGlnaHQgI292LWludGVudCB0cjpudGgtY2hpbGQoNm4gKyAyKSwKLmxpZ2h0ICNvdi1pbnRlbnQgdHI6bnRoLWNoaWxkKDZuICsgMykgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTsKfQoubGlnaHQgI292LWludGVudCB0cjpudGgtY2hpbGQoNm4gKyA0KSwKLmxpZ2h0ICNvdi1pbnRlbnQgdHI6bnRoLWNoaWxkKDZuICsgNSksCi5saWdodCAjb3YtaW50ZW50IHRyOm50aC1jaGlsZCg2bikgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDsKfQouZGFyayAjb3YtaW50ZW50IHRyOm50aC1jaGlsZCg2biArIDEpLAouZGFyayAjb3YtaW50ZW50IHRyOm50aC1jaGlsZCg2biArIDIpLAouZGFyayAjb3YtaW50ZW50IHRyOm50aC1jaGlsZCg2biArIDMpIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICM0NDQ7Cn0KLmRhcmsgI292LWludGVudCB0cjpudGgtY2hpbGQoNm4gKyA0KSwKLmRhcmsgI292LWludGVudCB0cjpudGgtY2hpbGQoNm4gKyA1KSwKLmRhcmsgI292LWludGVudCB0cjpudGgtY2hpbGQoNm4pIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICMzMzM7Cn0KCi5saWdodCAjb3YtaW50ZW50IHRyOm50aC1jaGlsZCg2biArIDEpLmRhdGEtY2hhbmdlLAoubGlnaHQgI292LWludGVudCB0cjpudGgtY2hpbGQoNm4gKyAyKS5kYXRhLWNoYW5nZSwKLmxpZ2h0ICNvdi1pbnRlbnQgdHI6bnRoLWNoaWxkKDZuICsgMykuZGF0YS1jaGFuZ2UsCi5saWdodCAjb3YtaW50ZW50IHRyOm50aC1jaGlsZCg2biArIDQpLmRhdGEtY2hhbmdlLAoubGlnaHQgI292LWludGVudCB0cjpudGgtY2hpbGQoNm4gKyA1KS5kYXRhLWNoYW5nZSwKLmxpZ2h0ICNvdi1pbnRlbnQgdHI6bnRoLWNoaWxkKDZuKS5kYXRhLWNoYW5nZSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkRGRkRDOwp9Ci5kYXJrICNvdi1pbnRlbnQgdHI6bnRoLWNoaWxkKDZuICsgMSkuZGF0YS1jaGFuZ2UsCi5kYXJrICNvdi1pbnRlbnQgdHI6bnRoLWNoaWxkKDZuICsgMikuZGF0YS1jaGFuZ2UsCi5kYXJrICNvdi1pbnRlbnQgdHI6bnRoLWNoaWxkKDZuICsgMykuZGF0YS1jaGFuZ2UsCi5kYXJrICNvdi1pbnRlbnQgdHI6bnRoLWNoaWxkKDZuICsgNCkuZGF0YS1jaGFuZ2UsCi5kYXJrICNvdi1pbnRlbnQgdHI6bnRoLWNoaWxkKDZuICsgNSkuZGF0YS1jaGFuZ2UsCi5kYXJrICNvdi1pbnRlbnQgdHI6bnRoLWNoaWxkKDZuKS5kYXRhLWNoYW5nZSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNUE1NjAwOwp9Cgojb3YtaW50ZW50IHRkLnJlc291cmNlcywKI292LWludGVudCB0ZC5kZXRhaWxzIHsKICAgIHBhZGRpbmctbGVmdDogMzZweDsKICAgIG9wYWNpdHk6IDAuNjU7Cn0Kc/HvVnllCABCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANMQVQABABubHwKgHNsCoB2CWzx/1o2qpBw6+VqqAECFmgy0AAAEBCAoAt8jKAGIPwHPx71bXZwgAwQIAAMECAAAIACetHhNo9ygf0sUIAEUAArNkikAAQAZD1MCoBzbAqAdgltMf9WEcQUZygoujgBgFpF+RAAABAQgKALfIygBiD8BHRVQgL29ub3MvdWkvYXBwL2Z3L3V0aWwvdXRpbC5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiAqLyoNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9WRWsIAL8CAAC/AgAACAAnrR4TaPcoH9LFCABFAAKxxBZAAEAG5EnAqAc2wKgHYJbPH/WjaqkHDr5WqoAYIWat/AAAAQEICgC3yMoAYg/AR0VUIC9vbm9zL3VpL2FwcC9mdy91dGlsL2VlLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6ICovKg0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCnPx71Z8bAgAgAAAAIAAAABo9ygf0sUIACetHhMIAEUAAHIrxEAAQAZ+28CoB2DAqAc2H/WW03KCi6NhHEPFgBgCAZBLAAABAQgKAGIPwAC3yMpIVFRQLzEuMSAzMDQgTm90IE1vZGlmaWVkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCnPx71a4bggAvwIAAL8CAAAIACetHhNo9ygf0sUIAEUAArFki0AAQAZD1cCoBzbAqAdgltMf9WEcQ8VygovhgBgFpM9OAAABAQgKALfIygBiD8BHRVQgL29ub3MvdWkvYXBwL2Z3L3V0aWwvZm4uanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVqZwCACAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAcivFQABABn7awKgHYMCoBzYf9ZbTcoKL4WEcRkKAGAIMkEsAAAEBCAoAYg/AALfIykhUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0Kc/HvVm5xCADDAgAAwwIAAAgAJ60eE2j3KB/SxQgARQACtWSMQABABkPQwKgHNsCoB2CW0x/1YRxGQnKCjB+AGAWkB6YAAAEBCAoAt8jKAGIPwEdFVCAvb25vcy91aS9hcHAvZncvdXRpbC9yYW5kb20uanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVmp8CAD/BAAA/wQAAGj3KB/SxQgAJ60eEwgARQAE8YEyQABABiTuwKgHYMCoBzYf9ZbUoa4/m0DdxkWAGAIhlMoAAAEBCAoAYg/BALfIyEhUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2Nzcw0KQ29udGVudC1MZW5ndGg6IDExMTUNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gUHJvY2Vzc29yIFZpZXcgLS0gQ1NTIGZpbGUKICovCgojb3YtcHJvY2Vzc29yIGgyIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKI292LXByb2Nlc3NvciBkaXYuY3RybC1idG5zIHsKICAgIHdpZHRoOiA0MHB4Owp9CgoubGlnaHQgI292LXByb2Nlc3NvciAuY3VycmVudC12aWV3IHVzZSB7CiAgICBmaWxsOiB3aGl0ZTsKfQouZGFyayAjb3YtcHJvY2Vzc29yIC5jdXJyZW50LXZpZXcgdXNlIHsKICAgIGZpbGw6ICMzMDQ4NjA7Cn0KCi5saWdodCAjb3YtcHJvY2Vzc29yIC5jdXJyZW50LXZpZXcgcmVjdCB7CiAgICBmaWxsOiBkZWVwc2t5Ymx1ZTsKfQouZGFyayAjb3YtcHJvY2Vzc29yIC5jdXJyZW50LXZpZXcgcmVjdCB7CiAgICBmaWxsOiAjZWVlOwp9Cgojb3YtcHJvY2Vzc29yIHRkLm51bWJlciB7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKfQoKI292LXByb2Nlc3NvciB0ci5uby1kYXRhIHRkIHsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQpz8e9Wc30IAKkIAACpCAAAaPcoH9LFCAAnrR4TCABFAAibzJJAAEAG1ePAqAdgwKgHNh/1ltFalYUdjJechoAYAkOYdAAAAQEICgBiD8EAt8i/SFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvY3NzDQpDb250ZW50LUxlbmd0aDogMjA1Mw0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBHcm91cCBWaWV3IC0tIENTUyBmaWxlCiAqLwoKI292LWdyb3VwIGgyIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKI292LWdyb3VwIGRpdi5jdHJsLWJ0bnMgewp9CgoubGlnaHQgI292LWdyb3VwIC5jdXJyZW50LXZpZXcgdXNlIHsKICAgIGZpbGw6IHdoaXRlOwp9Ci5kYXJrICNvdi1ncm91cCAuY3VycmVudC12aWV3IHVzZSB7CiAgICBmaWxsOiAjMzA0ODYwOwp9CgoubGlnaHQgI292LWdyb3VwIC5jdXJyZW50LXZpZXcgcmVjdCB7CiAgICBmaWxsOiBkZWVwc2t5Ymx1ZTsKfQouZGFyayAjb3YtZ3JvdXAgLmN1cnJlbnQtdmlldyByZWN0IHsKICAgIGZpbGw6ICNlZWU7Cn0KCi5saWdodCAjb3YtZ3JvdXAgdHI6bnRoLWNoaWxkKDRuICsgMSksCi5saWdodCAjb3YtZ3JvdXAgdHI6bnRoLWNoaWxkKDRuICsgMikgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTsKfQoubGlnaHQgI292LWdyb3VwIHRyOm50aC1jaGlsZCg0biArIDMpLAoubGlnaHQgI292LWdyb3VwIHRyOm50aC1jaGlsZCg0bikgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDsKfQouZGFyayAjb3YtZ3JvdXAgdHI6bnRoLWNoaWxkKDRuICsgMSksCi5kYXJrICNvdi1ncm91cCB0cjpudGgtY2hpbGQoNG4gKyAyKSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNDQ0Owp9Ci5kYXJrICNvdi1ncm91cCB0cjpudGgtY2hpbGQoNG4gKyAzKSwKLmRhcmsgI292LWdyb3VwIHRyOm50aC1jaGlsZCg0bikgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzMzMzsKfQoKLyogaGlnaGxpZ2h0ZWQgY29sb3IgKi8KLmxpZ2h0ICNvdi1ncm91cCB0cjpudGgtY2hpbGQoNG4gKyAxKS5kYXRhLWNoYW5nZSwKLmxpZ2h0ICNvdi1ncm91cCB0cjpudGgtY2hpbGQoNG4gKyAyKS5kYXRhLWNoYW5nZSwKLmxpZ2h0ICNvdi1ncm91cCB0cjpudGgtY2hpbGQoNG4gKyAzKS5kYXRhLWNoYW5nZSwKLmxpZ2h0ICNvdi1ncm91cCB0cjpudGgtY2hpbGQoNG4pLmRhdGEtY2hhbmdlIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNGREZGREM7Cn0KLmRhcmsgI292LWdyb3VwIHRyOm50aC1jaGlsZCg0biArIDEpLmRhdGEtY2hhbmdlLAouZGFyayAjb3YtZ3JvdXAgdHI6bnRoLWNoaWxkKDRuICsgMikuZGF0YS1jaGFuZ2UsCi5kYXJrICNvdi1ncm91cCB0cjpudGgtY2hpbGQoNG4gKyAzKS5kYXRhLWNoYW5nZSwKLmRhcmsgI292LWdyb3VwIHRyOm50aC1jaGlsZCg0bikuZGF0YS1jaGFuZ2UgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzVBNTYwMDsKfQoKI292LWdyb3VwIHRkIHsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQojb3YtZ3JvdXAgdGQucmlnaHQgewogICAgdGV4dC1hbGlnbjogcmlnaHQ7Cn0KI292LWdyb3VwIHRkLmJ1Y2tldHMgewogICAgdGV4dC1hbGlnbjogbGVmdDsKICAgIHBhZGRpbmctbGVmdDogMzZweDsKICAgIG9wYWNpdHk6IDAuNjU7Cn0Kc/HvVrF9CABCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANN2SQABABs1KwKgHNsCoB2CW0R/1jJechlqVjYSAEAWkP44AAAEBCAoAt8jLAGIPwXPx71avfwgAwgIAAMICAAAIACetHhNo9ygf0sUIAEUAArTiR0AAQAbGFcCoBzbAqAdgltQf9UDdxkWhrkRYgBgHoPG5AAABAQgKALfIywBiD8FHRVQgL29ub3MvdWkvYXBwL2Z3L3V0aWwvdGhlbWUuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVtOBCADBAgAAwQIAAAgAJ60eE2j3KB/SxQgARQACs92TQABABsrKwKgHNsCoB2CW0R/1jJechlqVjYSAGAWk9tsAAAEBCAoAt8jLAGIPwUdFVCAvb25vcy91aS9hcHAvZncvdXRpbC9rZXlzLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6ICovKg0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCnPx71ZDgggAQgAAAEIAAABo9ygf0sUIACetHhMIAEUAADTMlEAAQAbeSMCoB2DAqAc2H/WW0VqVjYSMl58FgBACTZANAAABAQgKAGIPwgC3yMtz8e9Wto0IAIAAAACAAAAAaPcoH9LFCAAnrR4TCABFAAByzJVAAEAG3gnAqAdgwKgHNh/1ltFalY2EjJefBYAYAk2QSwAAAQEICgBiD8IAt8jLSFRUUC8xLjEgMzA0IE5vdCBNb2RpZmllZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQpz8e9WU5EIAIAAAACAAAAAaPcoH9LFCAAnrR4TCABFAAByfydAAEAGK3jAqAdgwKgHNh/1ls8Ovlaqo2qrhIAYApKQSwAAAQEICgBiD8IAt8jKSFRUUC8xLjEgMzA0IE5vdCBNb2RpZmllZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQpz8e9W8ZEIAMICAADCAgAACAAnrR4TaPcoH9LFCABFAAK03ZRAAEAGysjAqAc2wKgHYJbRH/WMl58FWpWNwoAYBaTJ4QAAAQEICgC3yMwAYg/CR0VUIC9vbm9zL3VpL2FwcC9mdy91dGlsL3ByZWZzLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6ICovKg0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCnPx71aWmQgAwQIAAMECAAAIACetHhNo9ygf0sUIAEUAArPEF0AAQAbkRsCoBzbAqAdgls8f9aNqq4QOvlbogBghZjjKAAABAQgKALfIzQBiD8JHRVQgL29ub3MvdWkvYXBwL2Z3L21hc3QvbWFzdC5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiAqLyoNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9WlpkIAIAAAACAAAAAaPcoH9LFCAAnrR4TCABFAAByK8ZAAEAGftnAqAdgwKgHNh/1ltNygowfYRxIw4AYAheQSwAAAQEICgBiD8MAt8jKSFRUUC8xLjEgMzA0IE5vdCBNb2RpZmllZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQpz8e9WTZoIAIAAAACAAAAAaPcoH9LFCAAnrR4TCABFAAByzJZAAEAG3gjAqAdgwKgHNh/1ltFalY3CjJehhYAYAliQSwAAAQEICgBiD8MAt8jMSFRUUC8xLjEgMzA0IE5vdCBNb2RpZmllZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQpz8e9WdZsIAL8CAAC/AgAACAAnrR4TaPcoH9LFCABFAAKxZI1AAEAGQ9PAqAc2wKgHYJbTH/VhHEjDcoKMXYAYBaR9IwAAAQEICgC3yM0AYg/DR0VUIC9vbm9zL3VpL2FwcC9mdy9uYXYvbmF2LmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6ICovKg0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCnPx71YAnQgAvwIAAL8CAAAIACetHhNo9ygf0sUIAEUAArHdlUAAQAbKysCoBzbAqAdgltEf9YyXoYValY4AgBgFpCMIAAABAQgKALfIzQBiD8NHRVQgL29ub3MvdWkvYXBwL2Z3L3N2Zy9zdmcuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVmSeCACAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAcivHQABABn7YwKgHYMCoBzYf9ZbTcoKMXWEcS0CAGAIhkEsAAAEBCAoAYg/DALfIzUhUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0Kc/HvVtKiCADBAgAAwQIAAAgAJ60eE2j3KB/SxQgARQACs2SOQABABkPQwKgHNsCoB2CW0x/1YRxLQHKCjJuAGAWkH9YAAAEBCAoAt8jNAGIPw0dFVCAvb25vcy91aS9hcHAvZncvc3ZnL2dseXBoLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6ICovKg0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCnPx71Y+owgAgAAAAIAAAABo9ygf0sUIACetHhMIAEUAAHLMl0AAQAbeB8CoB2DAqAc2H/WW0VqVjgCMl6QCgBgCY5BLAAABAQgKAGIPxAC3yM1IVFRQLzEuMSAzMDQgTm90IE1vZGlmaWVkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCnPx71YVpQgAwAIAAMACAAAIACetHhNo9ygf0sUIAEUAArLdlkAAQAbKyMCoBzbAqAdgltEf9YyXpAJalY4+gBgFpPgYAAABAQgKALfIzgBiD8RHRVQgL29ub3MvdWkvYXBwL2Z3L3N2Zy9pY29uLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6ICovKg0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCnPx71Y1pQgAgAAAAIAAAABo9ygf0sUIACetHhMIAEUAAHIowUAAQAaB3sCoB2DAqAc2H/WW0lNRDhc0h0zDgBgCXJBLAAABAQgKAGIPxAC3yMlIVFRQLzEuMSAzMDQgTm90IE1vZGlmaWVkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCnPx71YiqQgAwwIAAMMCAAAIACetHhNo9ygf0sUIAEUAArVrp0AAQAY8tcCoBzbAqAdgltIf9TSHTMNTUQ5VgBgPM45sAAABAQgKALfIzgBiD8RHRVQgL29ub3MvdWkvYXBwL2Z3L3N2Zy9nZW9kYXRhLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6ICovKg0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCnPx71bOqwgAgAAAAIAAAABo9ygf0sUIACetHhMIAEUAAHKBM0AAQAYpbMCoB2DAqAc2H/WW1KGuRFhA3cjFgBgCLJBLAAABAQgKAGIPxAC3yMtIVFRQLzEuMSAzMDQgTm90IE1vZGlmaWVkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCnPx71YPrggAgAAAAIAAAABo9ygf0sUIACetHhMIAEUAAHIowkAAQAaB3cCoB2DAqAc2H/WW0lNRDlU0h09EgBgCZpBLAAABAQgKAGIPxAC3yM5IVFRQLzEuMSAzMDQgTm90IE1vZGlmaWVkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCnPx71ZIrggAvwIAAL8CAAAIACetHhNo9ygf0sUIAEUAArHiSEAAQAbGF8CoBzbAqAdgltQf9UDdyMWhrkSWgBgHoETnAAABAQgKALfIzgBiD8RHRVQgL29ub3MvdWkvYXBwL2Z3L3N2Zy9tYXAuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVjCvCADAAgAAwAIAAAgAJ60eE2j3KB/SxQgARQACsmuoQABABjy3wKgHNsCoB2CW0h/1NIdPRFNRDpOAGA8zETwAAAEBCAoAt8jOAGIPxEdFVCAvb25vcy91aS9hcHAvZncvc3ZnL3pvb20uanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVsKwCACAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAcoE0QABABilrwKgHYMCoBzYf9ZbUoa5ElkDdy0KAGAI2kEsAAAEBCAoAYg/FALfIzkhUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0Kc/HvVg6zCADDAgAAwwIAAAgAJ60eE2j3KB/SxQgARQACteJJQABABsYSwKgHNsCoB2CW1B/1QN3LQqGuRNSAGAegZFIAAAEBCAoAt8jPAGIPxUdFVCAvb25vcy91aS9hcHAvZncvc3ZnL3N2Z1V0aWwuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVv6zCACAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAcijDQABABoHcwKgHYMCoBzYf9ZbSU1EOkzSHUcKAGAJwkEsAAAEBCAoAYg/FALfIzkhUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0Kc/HvViG2CADFAgAAxQIAAAgAJ60eE2j3KB/SxQgARQACt2upQABABjyxwKgHNsCoB2CW0h/1NIdRwlNRDtGAGA8zP0MAAAEBCAoAt8jPAGIPxUdFVCAvb25vcy91aS9hcHAvZncvcmVtb3RlL3JlbW90ZS5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiAqLyoNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9W5LcIAIAAAACAAAAAaPcoH9LFCAAnrR4TCABFAAByKMRAAEAGgdvAqAdgwKgHNh/1ltJTUQ7RNIdURYAYAnqQSwAAAQEICgBiD8UAt8jPSFRUUC8xLjEgMzA0IE5vdCBNb2RpZmllZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQpz8e9WGr0IAMQCAADEAgAACAAnrR4TaPcoH9LFCABFAAK2a6pAAEAGPLHAqAc2wKgHYJbSH/U0h1RFU1EPD4AYDzNzsQAAAQEICgC3yM8AYg/FR0VUIC9vbm9zL3VpL2FwcC9mdy9yZW1vdGUvdXJsZm4uanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVoDVCACAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAcijFQABABoHawKgHYMCoBzYf9ZbSU1EPDzSHVseAGAKEkEsAAAEBCAoAYg/HALfIz0hUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0Kc/HvVsTXCACAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAcivIQABABn7XwKgHYMCoBzYf9ZbTcoKMm2EcTb+AGAIskEsAAAEBCAoAYg/HALfIzUhUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0Kc/HvVkTYCADDAgAAwwIAAAgAJ60eE2j3KB/SxQgARQACtWurQABABjyxwKgHNsCoB2CW0h/1NIdWx1NRD02AGA8zmi4AAAEBCAoAt8jRAGIPx0dFVCAvb25vcy91aS9hcHAvZncvcmVtb3RlL3Jlc3QuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVjbaCADEAgAAxAIAAAgAJ60eE2j3KB/SxQgARQACtmSPQABABkPMwKgHNsCoB2CW0x/1YRxNv3KCjNmAGAWkvC4AAAEBCAoAt8jRAGIPx0dFVCAvb25vcy91aS9hcHAvZncvcmVtb3RlL3dzb2NrLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6ICovKg0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCnPx71bB2wgAgAAAAIAAAABo9ygf0sUIACetHhMIAEUAAHJ/KEAAQAYrd8CoB2DAqAc2H/WWzw6+Vuijaq4DgBgCopBLAAABAQgKAGIPxwC3yM1IVFRQLzEuMSAzMDQgTm90IE1vZGlmaWVkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCnPx71ZX3QgAyAIAAMgCAAAIACetHhNo9ygf0sUIAEUAArrEGEAAQAbkPsCoBzbAqAdgls8f9aNqrgMOvlcmgBghZsx6AAABAQgKALfI0QBiD8dHRVQgL29ub3MvdWkvYXBwL2Z3L3JlbW90ZS93ZWJzb2NrZXQuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVuTiCACAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAcijGQABABoHZwKgHYMCoBzYf9ZbSU1EPTTSHWUiAGAKOkEsAAAEBCAoAYg/IALfI0UhUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0Kc/HvVlnmCADFAgAAxQIAAAgAJ60eE2j3KB/SxQgARQACt2usQABABjyuwKgHNsCoB2CW0h/1NIdZSFNRD4uAGA8zPwUAAAEBCAoAt8jSAGIPyEdFVCAvb25vcy91aS9hcHAvZncvd2lkZ2V0L3dpZGdldC5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiAqLyoNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9W9+wIAPcVAAD3FQAAaPcoH9LFCAAnrR4TCABFABXpiUlAAEAGC9/AqAdgwKgHNh/1ltBrOk2m+T4NxIAYAhClwgAAAQEICgBiD8gAt8jJSFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvamF2YXNjcmlwdA0KQ29udGVudC1MZW5ndGg6IDU0NTINClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KLyoKICogQ29weXJpZ2h0IDIwMTQtMjAxNiBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBNYWluIEFwcGxpY2F0aW9uIE1vZHVsZQogKi8KCihmdW5jdGlvbiAoKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8gaW5qZWN0ZWQgcmVmcwogICAgdmFyICRsb2c7CgogICAgLy8gZGVmaW5lIGNvcmUgbW9kdWxlIGRlcGVuZGVuY2llcyBoZXJlLi4uCiAgICB2YXIgY29yZURlcGVuZGVuY2llcyA9IFsKICAgICAgICAnbmdSb3V0ZScsCiAgICAgICAgJ29ub3NNYXN0JywKICAgICAgICAnb25vc05hdicsCiAgICAgICAgJ29ub3NVdGlsJywKICAgICAgICAnb25vc1N2ZycsCiAgICAgICAgJ29ub3NSZW1vdGUnLAogICAgICAgICdvbm9zTGF5ZXInLAogICAgICAgICdvbm9zV2lkZ2V0JwogICAgXTsKCiAgICAvLyB2aWV3IElEcy4uIGluamVjdGVkIHZpYSB0aGUgc2VydmxldAogICAgdmFyIHZpZXdJZHMgPSBbCiAgICAgICAgCiAgICAgICAgJ2FwcCcsCiAgICAgICAgJ3NldHRpbmdzJywKICAgICAgICAnY2x1c3RlcicsCiAgICAgICAgJ3Byb2Nlc3NvcicsCiAgICAgICAgJ3RvcG8nLAogICAgICAgICdkZXZpY2UnLAogICAgICAgICdmbG93JywKICAgICAgICAncG9ydCcsCiAgICAgICAgJ2dyb3VwJywKICAgICAgICAnbWV0ZXInLAogICAgICAgICdsaW5rJywKICAgICAgICAnaG9zdCcsCiAgICAgICAgJ2ludGVudCcsCiAgICAgICAgJ3R1bm5lbCcsCgogICAgICAgIC8vIGR1bW15IGVudHJ5CiAgICAgICAgJycKICAgIF07CgogICAgLy8gc2VjcmV0IHNhdWNlCiAgICB2YXIgc2F1Y2UgPSBbCiAgICAgICAgJzY6Njk4NTc2NjYnLAogICAgICAgICc5OjgyNjk3MCcsCiAgICAgICAgJzIyOjgwNjk4Mjg2NjcnLAogICAgICAgICc2OjY5ODU3MDY4ODY2OTg4Nzk2NycsCiAgICAgICAgJzc6Njk3MTgwNjg4OTg0NzE4NicsCiAgICAgICAgJzIyOjgzNjk4Njc2ODInLAogICAgICAgICcxMzo3MzY1ODMnLAogICAgICAgICc3OjY2NzE4NjY5ODM4NCcsCiAgICAgICAgJzE6ODU3NzgwODg4Nzc4ODc2Nzg3JywKICAgICAgICAnMjA6NzA3MTcwNjYnLAogICAgICAgICcyNDo4ODY3NzQ4Njg0NjknCiAgICBdOwoKICAgIHZhciBkZWZhdWx0VmlldyA9ICd0b3BvJywKICAgICAgICB2aWV3RGVwZW5kZW5jaWVzID0gW107CgogICAgdmlld0lkcy5mb3JFYWNoKGZ1bmN0aW9uIChpZCkgewogICAgICAgIGlmIChpZCkgewogICAgICAgICAgICB2aWV3RGVwZW5kZW5jaWVzLnB1c2goJ292JyArIGNhcChpZCkpOwogICAgICAgIH0KICAgIH0pOwoKICAgIHZhciBtb2R1bGVEZXBlbmRlbmNpZXMgPSBjb3JlRGVwZW5kZW5jaWVzLmNvbmNhdCh2aWV3RGVwZW5kZW5jaWVzKTsKCiAgICBmdW5jdGlvbiBzYXVjeShlZSwga3MpIHsKICAgICAgICB2YXIgbWFwID0gZWUuZ2VuTWFwKHNhdWNlKTsKICAgICAgICBPYmplY3Qua2V5cyhtYXApLmZvckVhY2goZnVuY3Rpb24gKGspIHsKICAgICAgICAgICAga3MuYWRkU2VxKGssIG1hcFtrXSk7CiAgICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gY2FwKHMpIHsKICAgICAgICByZXR1cm4gcyA/IHNbMF0udG9VcHBlckNhc2UoKSArIHMuc2xpY2UoMSkgOiBzOwogICAgfQoKICAgIGFuZ3VsYXIubW9kdWxlKCdvbm9zQXBwJywgbW9kdWxlRGVwZW5kZW5jaWVzKQoKICAgICAgICAuY29udHJvbGxlcignT25vc0N0cmwnLCBbCiAgICAgICAgICAgICckbG9nJywgJyRzY29wZScsICckcm91dGUnLCAnJHJvdXRlUGFyYW1zJywgJyRsb2NhdGlvbicsCiAgICAgICAgICAgICdLZXlTZXJ2aWNlJywgJ1RoZW1lU2VydmljZScsICdHbHlwaFNlcnZpY2UnLCAnVmVpbFNlcnZpY2UnLAogICAgICAgICAgICAnUGFuZWxTZXJ2aWNlJywgJ0ZsYXNoU2VydmljZScsICdRdWlja0hlbHBTZXJ2aWNlJywgJ0VlU2VydmljZScsCiAgICAgICAgICAgICdXZWJTb2NrZXRTZXJ2aWNlJywKCiAgICAgICAgICAgIGZ1bmN0aW9uIChfJGxvZ18sICRzY29wZSwgJHJvdXRlLCAkcm91dGVQYXJhbXMsICRsb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgIGtzLCB0cywgZ3MsIHZzLCBwcywgZmxhc2gsIHFocywgZWUsIHdzcykgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICAgICAgICAgICAgJGxvZyA9IF8kbG9nXzsKCiAgICAgICAgICAgICAgICBzZWxmLiRyb3V0ZSA9ICRyb3V0ZTsKICAgICAgICAgICAgICAgIHNlbGYuJHJvdXRlUGFyYW1zID0gJHJvdXRlUGFyYW1zOwogICAgICAgICAgICAgICAgc2VsZi4kbG9jYXRpb24gPSAkbG9jYXRpb247CiAgICAgICAgICAgICAgICBzZWxmLnZlcnNpb24gPSAnMS41LjAnOwoKICAgICAgICAgICAgICAgIC8vIHNoYXJlZCBvYmplY3QgaW5oZXJpdGVkIGJ5IGFsbCB2aWV3czoKICAgICAgICAgICAgICAgICRzY29wZS5vbm9zID0ge307CgogICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBzZXJ2aWNlcy4uLgogICAgICAgICAgICAgICAgdHMuaW5pdCgpOwogICAgICAgICAgICAgICAga3MuaW5zdGFsbE9uKGQzLnNlbGVjdCgnYm9keScpKTsKICAgICAgICAgICAgICAgIGtzLmJpbmRRaHMocWhzKTsKICAgICAgICAgICAgICAgIGdzLmluaXQoKTsKICAgICAgICAgICAgICAgIHZzLmluaXQoKTsKICAgICAgICAgICAgICAgIHBzLmluaXQoKTsKICAgICAgICAgICAgICAgIHNhdWN5KGVlLCBrcyk7CiAgICAgICAgICAgICAgICBmbGFzaC5pbml0Rmxhc2goKTsKICAgICAgICAgICAgICAgIHFocy5pbml0UXVpY2tIZWxwKCk7CgogICAgICAgICAgICAgICAgd3NzLmNyZWF0ZVdlYlNvY2tldCh7CiAgICAgICAgICAgICAgICAgICAgd3Nwb3J0OiAkbG9jYXRpb24uc2VhcmNoKCkud3Nwb3J0CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAkbG9nLmxvZygnT25vc0N0cmwgaGFzIGJlZW4gY3JlYXRlZCcpOwoKICAgICAgICAgICAgICAgICRsb2cuZGVidWcoJ3JvdXRlOiAnLCBzZWxmLiRyb3V0ZSk7CiAgICAgICAgICAgICAgICAkbG9nLmRlYnVnKCdyb3V0ZVBhcmFtczogJywgc2VsZi4kcm91dGVQYXJhbXMpOwogICAgICAgICAgICAgICAgJGxvZy5kZWJ1ZygnbG9jYXRpb246ICcsIHNlbGYuJGxvY2F0aW9uKTsKICAgICAgICAgICAgfV0pCgogICAgICAgIC5jb25maWcoWyckcm91dGVQcm92aWRlcicsIGZ1bmN0aW9uICgkcm91dGVQcm92aWRlcikgewogICAgICAgICAgICAvLyBJZiB2aWV3IElEIG5vdCBwcm92aWRlZCwgcm91dGUgdG8gdGhlIGRlZmF1bHQgdmlldwogICAgICAgICAgICAkcm91dGVQcm92aWRlcgogICAgICAgICAgICAgICAgLm90aGVyd2lzZSh7CiAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RUbzogJy8nICsgZGVmYXVsdFZpZXcKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgZnVuY3Rpb24gdmlld0N0cmxOYW1lKHZpZCkgewogICAgICAgICAgICAgICAgcmV0dXJuICdPdicgKyBjYXAodmlkKSArICdDdHJsJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZnVuY3Rpb24gdmlld1RlbXBsYXRlVXJsKHZpZCkgewogICAgICAgICAgICAgICAgcmV0dXJuICdhcHAvdmlldy8nICsgdmlkICsgJy8nICsgdmlkICsgJy5odG1sJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQWRkIHJvdXRlcyBmb3IgZWFjaCBkZWZpbmVkIHZpZXcuCiAgICAgICAgICAgIHZpZXdJZHMuZm9yRWFjaChmdW5jdGlvbiAodmlkKSB7CiAgICAgICAgICAgICAgICBpZiAodmlkKSB7CiAgICAgICAgICAgICAgICAgICAgJHJvdXRlUHJvdmlkZXIud2hlbignLycgKyB2aWQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlcjogdmlld0N0cmxOYW1lKHZpZCksCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ2N0cmwnLAogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogdmlld1RlbXBsYXRlVXJsKHZpZCkKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfV0pCgogICAgICAgIC5kaXJlY3RpdmUoJ2RldGVjdEJyb3dzZXInLCBbJyRsb2cnLCAnRm5TZXJ2aWNlJywKICAgICAgICAgICAgZnVuY3Rpb24gKCRsb2csIGZzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHNjb3BlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGJvZHkgPSBkMy5zZWxlY3QoJ2JvZHknKSwKICAgICAgICAgICAgICAgICAgICAgICAgYnJvd3NlciA9ICcnOwogICAgICAgICAgICAgICAgICAgIGlmIChmcy5pc0Nocm9tZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyb3dzZXIgPSAnY2hyb21lJzsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZzLmlzU2FmYXJpKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYnJvd3NlciA9ICdzYWZhcmknOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZnMuaXNGaXJlZm94KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYnJvd3NlciA9ICdmaXJlZm94JzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYm9keS5jbGFzc2VkKGJyb3dzZXIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIHNjb3BlLm9ub3MuYnJvd3NlciA9IGJyb3dzZXI7CgogICAgICAgICAgICAgICAgICAgIGlmIChmcy5pc01vYmlsZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkuY2xhc3NlZCgnbW9iaWxlJywgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLm9ub3MubW9iaWxlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRsb2cuZGVidWcoJ0RldGVjdGVkIGJyb3dzZXIgaXMnLCBmcy5jYXAoYnJvd3NlcikpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICB9XSk7Cn0oKSk7CnPx71Zw7QgAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADRfo0AAQAZLOsCoBzbAqAdgltAf9fk+DcRrOmNbgBAFjns2AAABAQgKALfI0gBiD8hz8e9WbO8IAIAAAACAAAAAaPcoH9LFCAAnrR4TCABFAAByKMdAAEAGgdjAqAdgwKgHNh/1ltJTUQ+LNIdby4AYApmQSwAAAQEICgBiD8kAt8jSSFRUUC8xLjEgMzA0IE5vdCBNb2RpZmllZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQpz8e9WO/IIAMQCAADEAgAACAAnrR4TaPcoH9LFCABFAAK2X6RAAEAGSLfAqAc2wKgHYJbQH/X5Pg3EazpjW4AYBaSw2AAAAQEICgC3yNMAYg/IR0VUIC9vbm9zL3VpL2FwcC9mdy93aWRnZXQvdGFibGUuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVu3zCADGAgAAxgIAAAgAJ60eE2j3KB/SxQgARQACuGutQABABjyswKgHNsCoB2CW0h/1NIdby1NRD8mAGA8zGfQAAAEBCAoAt8jTAGIPyUdFVCAvb25vcy91aS9hcHAvZncvd2lkZ2V0L3Rvb2xiYXIuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVtn2CACAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAcn8pQABABit2wKgHYMCoBzYf9ZbPDr5XJqNqsImAGAKykEsAAAEBCAoAYg/JALfI0UhUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0Kc/HvVuv5CADGAgAAxgIAAAgAJ60eE2j3KB/SxQgARQACuMQZQABABuQ/wKgHNsCoB2CWzx/1o2qwiQ6+V2SAGCFmOQoAAAEBCAoAt8jTAGIPyUdFVCAvb25vcy91aS9hcHAvZncvd2lkZ2V0L3Rvb2x0aXAuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVhX/CACAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAcoE1QABABilqwKgHYMCoBzYf9ZbUoa5E1EDdzcOAGAJBkEsAAAEBCAoAYg/JALfIz0hUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0Kc/HvVlkCCQBCAAAAQgAAAGj3KB/S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Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiAqLyoNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9WbCEJAIAAAACAAAAAaPcoH9LFCAAnrR4TCABFAAByzJlAAEAG3gXAqAdgwKgHNh/1ltFalY58jJepCYAYAniQSwAAAQEICgBiD8wAt8jVSFRUUC8xLjEgMzA0IE5vdCBNb2RpZmllZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQpz8e9WeiYJAMMCAADDAgAACAAnrR4TaPcoH9LFCABFAAK1ZJBAAEAGQ8zAqAc2wKgHYJbTH/VhHFBBcoKNF4AYBaSOCwAAAQEICgC3yNYAYg/LR0VUIC9vbm9zL3VpL2FwcC9mdy9sYXllci9sYXllci5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiAqLyoNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9WdSgJAMMCAADDAgAACAAnrR4TaPcoH9LFCABFAAK1a65AAEAGPK7AqAc2wKgHYJbSH/U0h15PU1EQB4AYDzNMRgAAAQEICgC3yNYAYg/LR0VUIC9vbm9zL3VpL2FwcC9mdy9sYXllci9wYW5lbC5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiAqLyoNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9WjSgJAMQCAADEAgAACAAnrR4TaPcoH9LFCABFAAK24ktAAEAGxg/AqAc2wKgHYJbUH/VA3dBGoa5FUIAYB6A9lgAAAQEICgC3yNYAYg/LR0VUIC9vbm9zL3VpL2FwcC9mdy9sYXllci9kaWFsb2cuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVjEpCQDDAgAAwwIAAAgAJ60eE2j3KB/SxQgARQACtcQaQABABuRBwKgHNsCoB2CWzx/1o2qzDQ6+V6KAGCFmjlMAAAEBCAoAt8jWAGIPy0dFVCAvb25vcy91aS9hcHAvZncvbGF5ZXIvZmxhc2guanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVjspCQDHAgAAxwIAAAgAJ60eE2j3KB/SxQgARQACuV+lQABABkizwKgHNsCoB2CW0B/1+T4QRms6Y5mAGAWkosEAAAEBCAoAt8jWAGIPzEdFVCAvb25vcy91aS9hcHAvZncvbGF5ZXIvcXVpY2toZWxwLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6ICovKg0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCnPx71ZDKQkAwgIAAMICAAAIACetHhNo9ygf0sUIAEUAArTdmEAAQAbKxMCoBzbAqAdgltEf9YyXqQlalY66gBgFpG4zAAABAQgKALfI1gBiD8xHRVQgL29ub3MvdWkvYXBwL2Z3L2xheWVyL3ZlaWwuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVqAvCQCAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAcolPQABABiFQwKgHYMCoBzYf9ZbQazpjmfk+EsuAGAIlkEsAAAEBCAoAYg/NALfI1khUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0Kc/HvVuQzCQDFAgAAxQIAAAgAJ60eE2j3KB/SxQgARQACt1+mQABABki0wKgHNsCoB2CW0B/1+T4Sy2s6Y9eAGAWkHWoAAAEBCAoAt8jXAGIPzUdFVCAvb25vcy91aS9hcHAvZncvbGF5ZXIvbG9hZGluZy5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiAqLyoNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9WkDgJAHcAAAB3AAAAAYDCAAAAEFFyDj3AAGlCQgMAAAMCfIAAABiCAI3nAAMNP4AAEFFyDj3AgAMBABQAAgAPAAAAQAAxMDUxNzIwZTNkYzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArDYXf1AoPNS4OCHYqybeYgAAAACAABBRcg49wBRz8e9W9T8JAIAAAACAAAAAaPcoH9LFCAAnrR4TCABFAAByiVBAAEAGIU/AqAdgwKgHNh/1ltBrOmPX+T4VToAYAjCQSwAAAQEICgBiD84At8jXSFRUUC8xLjEgMzA0IE5vdCBNb2RpZmllZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQpz8e9WmEIJAIsCAACLAgAACAAnrR4TaPcoH9LFCABFAAJ9X6dAAEAGSO3AqAc2wKgHYJbQH/X5PhVOazpkFYAYBaSGKwAAAQEICgC3yNgAYg/OR0VUIC9vbm9zL3VpL2FwcC92aWV3L3RvcG8vdG9wby5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVsdDCQCAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAcoE3QABABilowKgHYMCoBzYf9ZbUoa5FUEDd0siAGAJWkEsAAAEBCAoAYg/OALfI1khUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0Kc/HvVldGCQCAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAcn8rQABABit0wKgHYMCoBzYf9ZbPDr5XoqNqtY6AGALTkEsAAAEBCAoAYg/OALfI1khUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0Kc/HvVpZGCQCNAgAAjQIAAAgAJ60eE2j3KB/SxQgARQACf+JMQABABsZFwKgHNsCoB2CW1B/1QN3SyKGuRY6AGAegM98AAAEBCAoAt8jYAGIPzkdFVCAvb25vcy91aS9hcHAvdmlldy90b3BvL3RvcG9EMy5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVqRICQCQAgAAkAIAAAgAJ60eE2j3KB/SxQgARQACgsQbQABABuRzwKgHNsCoB2CWzx/1o2q1jg6+V+CAGCFm8zsAAAEBCAoAt8jYAGIPzkdFVCAvb25vcy91aS9hcHAvdmlldy90b3BvL3RvcG9FdmVudC5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVixTCQCKHAAAihwAAGj3KB/SxQgAJ60eEwgARQAcfIlRQABABgVEwKgHYMCoBzYf9ZbQazpkFfk+F5eAEAI6rFUAAAEBCAoAYg/PALfI2EhUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2phdmFzY3JpcHQNCkNvbnRlbnQtTGVuZ3RoOiAxODAzNA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNCwyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIFRvcG9sb2d5IFZpZXcgTW9kdWxlCiAqLwoKKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICB2YXIgbW9kdWxlRGVwZW5kZW5jaWVzID0gWwogICAgICAgICduZ0Nvb2tpZXMnLAogICAgICAgICdvbm9zVXRpbCcsCiAgICAgICAgJ29ub3NTdmcnLAogICAgICAgICdvbm9zUmVtb3RlJwogICAgXTsKCiAgICAvLyByZWZlcmVuY2VzIHRvIGluamVjdGVkIHNlcnZpY2VzIGV0Yy4KICAgIHZhciAkc2NvcGUsICRsb2csICRjb29raWVzLCBmcywga3MsIHpzLCBncywgbXMsIHN1cywgZmxhc2gsIHdzcywgcHMsCiAgICAgICAgdGRzLCB0ZXMsIHRmcywgdHBzLCB0aXMsIHRzcywgdGxzLCB0dHMsIHRvcywgZmx0ciwgdHRicywgdHRpcCwgdG92OwoKICAgIC8vIERPTSBlbGVtZW50cwogICAgdmFyIG92dG9wbywgc3ZnLCBkZWZzLCB6b29tTGF5ZXIsIG1hcEcsIHNwcml0ZUcsIGZvcmNlRywgbm9EZXZzTGF5ZXI7CgogICAgLy8gSW50ZXJuYWwgc3RhdGUKICAgIHZhciB6b29tZXIsIGFjdGlvbk1hcDsKCiAgICAvLyAtLS0gU2hvcnQgQ3V0IEtleXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgZnVuY3Rpb24gc2V0VXBLZXlzKG92ZXJsYXlLZXlzKSB7CiAgICAgICAgLy8ga2V5IGJpbmRpbmdzIG5lZWQgdG8gYmUgbWFkZSBhZnRlciB0aGUgc2VydmljZXMgaGF2ZSBiZWVuIGluamVjdGVkCiAgICAgICAgLy8gdGh1cywgZGVmZXJyZWQgdG8gaGVyZS4uLgogICAgICAgIGFjdGlvbk1hcCA9IHsKICAgICAgICAgICAgSTogW3RvZ2dsZUluc3RhbmNlcywgJ1RvZ2dsZSBPTk9TIGluc3RhbmNlcyBwYW5lbCddLAogICAgICAgICAgICBPOiBbdG9nZ2xlU3VtbWFyeSwgJ1RvZ2dsZSBPTk9TIHN1bW1hcnkgcGFuZWwnXSwKICAgICAgICAgICAgRDogW3RvZ2dsZVVzZURldGFpbHNGbGFnLCAnRGlzYWJsZSAvIGVuYWJsZSBkZXRhaWxzIHBhbmVsJ10sCgogICAgICAgICAgICBIOiBbdG9nZ2xlSG9zdHMsICdUb2dnbGUgaG9zdCB2aXNpYmlsaXR5J10sCiAgICAgICAgICAgIE06IFt0b2dnbGVPZmZsaW5lLCAnVG9nZ2xlIG9mZmxpbmUgdmlzaWJpbGl0eSddLAogICAgICAgICAgICBQOiBbdG9nZ2xlUG9ydHMsICdUb2dnbGUgUG9ydCBIaWdobGlnaHRpbmcnXSwKICAgICAgICAgICAgZGFzaDogW3Rmcy5zaG93QmFkTGlua3MsICdTaG93IGJhZCBsaW5rcyddLAogICAgICAgICAgICBCOiBbdG9nZ2xlTWFwLCAnVG9nZ2xlIGJhY2tncm91bmQgbWFwJ10sCiAgICAgICAgICAgIFM6IFt0b2dnbGVTcHJpdGVzLCAnVG9nZ2xlIHNwcml0ZSBsYXllciddLAoKICAgICAgICAgICAgWDogW3Rmcy5yZXNldEFsbExvY2F0aW9ucywgJ1Jlc2V0IG5vZGUgbG9jYXRpb25zJ10sCiAgICAgICAgICAgIFo6IFt0b3MudG9nZ2xlT2JsaXF1ZSwgJ1RvZ2dsZSBvYmxpcXVlIHZpZXcgKEV4cGVyaW1lbnRhbCknXSwKICAgICAgICAgICAgTjogW2ZsdHIuY2xpY2tBY3Rpb24sICdDeWNsZSBub2RlIGxheWVycyddLAogICAgICAgICAgICBMOiBbdGZzLmN5Y2xlRGV2aWNlTGFiZWxzLCAnQ3ljbGUgZGV2aWNlIGxhYmVscyddLAogICAgICAgICAgICBVOiBbdGZzLnVucGluLCAnVW5waW4gbm9kZSAoaG92ZXIgbW91c2Ugb3ZlciknXSwKICAgICAgICAgICAgUjogW3Jlc2V0Wm9vbSwgJ1Jlc2V0IHBhbiAvIHpvb20nXSwKICAgICAgICAgICAgZG90OiBbdHRicy50b2dnbGVUb29sYmFyLCAnVG9nZ2xlIFRvb2xiYXInXSwKCiAgICAgICAgICAgIEU6IFtlcXVhbGl6ZU1hc3RlcnMsICdFcXVhbGl6ZSBtYXN0ZXJzaGlwIHJvbGVzJ10sCgogICAgICAgICAgICAvLyB0b3BvbG9neSBvdmVybGF5IHNlbGVjdGlvbnMKICAgICAgICAgICAgRjE6IGZ1bmN0aW9uICgpIHsgdHRicy5mbmtleSgwKTsgfSwKICAgICAgICAgICAgRjI6IGZ1bmN0aW9uICgpIHsgdHRicy5mbmtleSgxKTsgfSwKICAgICAgICAgICAgRjM6IGZ1bmN0aW9uICgpIHsgdHRicy5mbmtleSgyKTsgfSwKICAgICAgICAgICAgRjQ6IGZ1bmN0aW9uICgpIHsgdHRicy5mbmtleSgzKTsgfSwKICAgICAgICAgICAgRjU6IGZ1bmN0aW9uICgpIHsgdHRicy5mbmtleSg0KTsgfSwKCiAgICAgICAgICAgIGVzYzogaGFuZGxlRXNjYXBlLAoKICAgICAgICAgICAgX2tleUxpc3RlbmVyOiB0dGJzLmtleUxpc3RlbmVyLAoKICAgICAgICAgICAgX2hlbHBGb3JtYXQ6IFsKICAgICAgICAgICAgICAgIFsnSScsICdPJywgJ0QnLCAnSCcsICdNJywgJ1AnLCAnZGFzaCcsICdCJywgJ1MnIF0sCiAgICAgICAgICAgICAgICBbJ1gnLCAnWicsICdOJywgJ0wnLCAnVScsICdSJywgJy0nLCAnRScsICctJywgJ2RvdCddLAogICAgICAgICAgICAgICAgW10gICAvLyB0aGlzIGNvbHVtbiByZXNlcnZlZCBmb3Igb3ZlcmxheSBhY3Rpb25zCiAgICAgICAgICAgIF0KICAgICAgICB9OwoKICAgICAgICBpZiAoZnMuaXNPKG92ZXJsYXlLZXlzKSkgewogICAgICAgICAgICBtZXJnZUtleXMob3ZlcmxheUtleXMpOwogICAgICAgIH0KCiAgICAgICAga3Mua2V5QmluZGluZ3MoYWN0aW9uTWFwKTsKCiAgICAgICAga3MuZ2VzdHVyZU5vdGVzKFsKICAgICAgICAgICAgWydjbGljaycsICdTZWxlY3QgdGhlIGl0ZW0gYW5kIHNob3cgZGV0YWlscyddLAogICAgICAgICAgICBbJ3NoaWZ0LWNsaWNrJywgJ1RvZ2dsZSBzZWxlY3Rpb24gc3RhdGUnXSwKICAgICAgICAgICAgWydkcmFnJywgJ1JlcG9zaXRpb24gKGFuZCBwaW4pIGRldmljZSAvIGhvc3QnXSwKICAgICAgICAgICAgWydjbWQtc2Nyb2xsJywgJ1pvb20gaW4gLyBvdXQnXSwKICAgICAgICAgICAgWydjbWQtZHJhZycsICdQYW4nXQogICAgICAgIF0pOwogICAgfQoKICAgIC8vIHdoZW4gYSB0b3BvbG9neSBvdmVybGF5IGlzIGFjdGl2YXRlZCwgd2UgbmVlZCB0byBiaW5kIHRoZWlyIGtleXN0cm9rZXMKICAgIC8vIGFuZCBpbmNsdWRlIHRoZW0gaW4gdGhlIHF1aWNrLWhlbHAgcGFuZWwKICAgIGZ1bmN0aW9uIG1lcmdlS2V5cyhleHRyYSkgewogICAgICAgIHZhciBfaGYgPSBhY3Rpb25NYXAuX2hlbHBGb3JtYXRbMl07CgogICAgICAgIGtzLmNoZWNrTm90R2xvYmFsKGV4dHJhKTsKCiAgICAgICAgZXh0cmEuX2tleU9yZGVyLmZvckVhY2goZnVuY3Rpb24gKGspIHsKICAgICAgICAgICAgdmFyIGQgPSBleHRyYVtrXSwKICAgICAgICAgICAgICAgIGNiID0gZCAmJiBkLmNiLAogICAgICAgICAgICAgICAgdHQgPSBkICYmIGQudHQ7CiAgICAgICAgICAgIC8vIE5PVEU6IGlnbm9yZSBrZXlzIHRoYXQgYXJlIGFscmVhZHkgZGVmaW5lZAogICAgICAgICAgICBpZiAoZCAmJiAhYWN0aW9uTWFwW2tdKSB7CiAgICAgICAgICAgICAgICBhY3Rpb25NYXBba10gPSBbY2IsIHR0XTsKICAgICAgICAgICAgICAgIF9oZi5wdXNoKGspOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CgogICAgLy8gLS0tIEtleXN0cm9rZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIGZ1bmN0aW9uIHRvZ2dsZUluc3RhbmNlcyh4KSB7CiAgICAgICAgdXBkYXRlUHJlZnNTdGF0ZSgnaW5zdHMnLCB0aXMudG9nZ2xlKHgpKTsKICAgICAgICB0ZnMudXBkYXRlRGV2aWNlQ29sb3JzKCk7CiAgICB9CgogICAgZnVuY3Rpb24gdG9nZ2xlU3VtbWFyeSh4KSB7CiAgICAgICAgdXBkYXRlUHJlZnNTdGF0ZSgnc3VtbWFyeScsIHRwcy50b2dnbGVTdW1tYXJ5KHgpKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0b2dnbGVVc2VEZXRhaWxzRmxhZyh4KSB7CiAgICAgICAgdXBkYXRlUHJlZnNTdGF0ZSgnZGV0YWlsJywgdHBzLnRvZ2dsZVVzZURldGFpbHNGbGFnKHgpKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0b2dnbGVIb3N0cyh4KSB7CiAgICAgICAgdXBkYXRlUHJlZnNTdGF0ZSgnaG9zdHMnLCB0ZnMudG9nZ2xlSG9zdHMoeCkpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRvZ2dsZU9mZmxpbmUoeCkgewogICAgICAgIHVwZGF0ZVByZWZzU3RhdGUoJ29mZmRldicsIHRmcy50b2dnbGVPZmZsaW5lKHgpKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0b2dnbGVQb3J0cyh4KSB7CiAgICAgICAgdXBkYXRlUHJlZnNTdGF0ZSgncG9ydGhsJywgdGZzLnRvZ2dsZVBvcnRzKHgpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBfdG9nU3ZnTGF5ZXIoeCwgRywgdGFnLCB3aGF0KSB7CiAgICAgICAgdmFyIG9uID0gKHggPT09ICdrZXlldicpID8gIXN1cy52aXNpYmxlKEcpIDogISF4LAogICAgICAgICAgICB2ZXJiID0gb24gPyAnU2hvdycgOiAnSGlkZSc7CiAgICAgICAgc3VzLnZpc2libGUoRywgb24pOwogICAgICAgIHVwZGF0ZVByZWZzU3RhdGUodGFnLCBvbik7CiAgICAgICAgZmxhc2guZmxhc2godmVyYiArICcgJyArIHdoYXQpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRvZ2dsZU1hcCh4KSB7CiAgICAgICAgX3RvZ1N2Z0xheWVyKHgsIG1hcEcsICdiZycsICdiYWNrZ3JvdW5kIG1hcCcpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRvZ2dsZVNwcml0ZXMoeCkgewogICAgICAgIF90b2dTdmdMYXllcih4LCBzcHJpdGVHLCAnc3ByJywgJ3Nwcml0ZSBsYXllcicpOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlc2V0Wm9vbSgpIHsKICAgICAgICB6b29tZXIucmVzZXQoKTsKICAgICAgICBmbGFzaC5mbGFzaCgnUGFuIGFuZCB6b29tIHJlc2V0Jyk7CiAgICB9CgogICAgZnVuY3Rpb24gZXF1YWxpemVNYXN0ZXJzKCkgewogICAgICAgIHdzcy5zZW5kRXZlbnQoJ2VxdWFsaXplTWFzdGVycycpOwogICAgICAgIGZsYXNoLmZsYXNoKCdFcXVhbGl6aW5nIG1hc3RlciByb2xlcycpOwogICAgfQoKICAgIGZ1bmN0aW9uIGhhbmRsZUVzY2FwZSgpIHsKICAgICAgICBpZiAodGlzLnNob3dNYXN0ZXIoKSkgewogICAgICAgICAgICAvLyBpZiBhbiBpbnN0YW5jZSBpcyBzZWxlY3RlZCwgY2FuY2VsIHRoZSBhZmZpbml0eSBtYXBwaW5nCiAgICAgICAgICAgIHRpcy5jYW5jZWxBZmZpbml0eSgpCgogICAgICAgIH0gZWxzZSBpZiAodG92Lmhvb2tzLmVzY2FwZSgpKSB7CiAgICAgICAgICAgIC8vIGVsc2UgaWYgdGhlIG92ZXJsYXkgY29uc3VtZWQgdGhlIEVTQyBldmVudC4uLgogICAgICAgICAgICAvLyAod29yayBhbHJlYWR5IGRvbmUpCgogICAgICAgIH0gZWxzZSBpZiAodHNzLmRlc2VsZWN0QWxsKCkpIHsKICAgICAgICAgICAgLy8gZWxzZSBpZiB3ZSBoYXZlIG5vZGUgc2VsZWN0aW9ucywgZGVzZWxlY3QgdGhlbSBhbGwKICAgICAgICAgICAgLy8gKHdvcmsgYWxyZWFkeSBkb25lKQoKICAgICAgICB9IGVsc2UgaWYgKHRscy5kZXNlbGVjdExpbmsoKSkgewogICAgICAgICAgICAvLyBlbHNlIGlmIHdlIGhhdmUgYSBsaW5rIHNlbGVjdGVkLCBkZXNlbGVjdCBpdAogICAgICAgICAgICAvLyAod29yayBhbHJlYWR5IGRvbmUpCgogICAgICAgIH0gZWxzZSBpZiAodGlzLmlzVmlzaWJsZSgpKSB7CiAgICAgICAgICAgIC8vIGVsc2UgaWYgdGhlIEluc3RhbmNlIFBhbmVsIGlzIHZpc2libGUsIGhpZGUgaXQKICAgICAgICAgICAgdGlzLmhpZGUoKTsKICAgICAgICAgICAgdGZzLnVwZGF0ZURldmljZUNvbG9ycygpOwoKICAgICAgICB9IGVsc2UgaWYgKHRwcy5zdW1tYXJ5VmlzaWJsZSgpKSB7CiAgICAgICAgICAgIC8vIGVsc2UgaWYgdGhlIFN1bW1hcnkgUGFuZWwgaXMgdmlzaWJsZSwgaGlkZSBpdAogICAgICAgICAgICB0cHMuaGlkZVN1bW1hcnlQYW5lbCgpOwogICAgICAgIH0KICAgIH0KCiAgICAvLyAtLS0gVG9vbGJhciBGdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgZnVuY3Rpb24gbm90VmFsaWQod2hhdCkgewogICAgICAgICRsb2cud2FybigndG9wby5qcyBnZXRBY3Rpb25FbnRyeSgpOiBOb3QgYSB2YWxpZCAnICsgd2hhdCk7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0QWN0aW9uRW50cnkoa2V5KSB7CiAgICAgICAgdmFyIGVudHJ5OwoKICAgICAgICBpZiAoIWtleSkgewogICAgICAgICAgICBub3RWYWxpZCgna2V5Jyk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgZW50cnkgPSBhY3Rpb25NYXBba2V5XTsKCiAgICAgICAgaWYgKCFlbnRyeSkgewogICAgICAgICAgICBub3RWYWxpZCgnYWN0aW9uTWFwIGVudHJ5Jyk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZnMuaXNBKGVudHJ5KSB8fCBbZW50cnksICcnXTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZXRVcFRvb2xiYXIoKSB7CiAgICAgICAgdHRicy5pbml0KHsKICAgICAgICAgICAgZ2V0QWN0aW9uRW50cnk6IGdldEFjdGlvbkVudHJ5LAogICAgICAgICAgICBzZXRVcEtleXM6IHNldFVwS2V5cwogICAgICAgIH0pOwogICAgICAgIHR0YnMuY3JlYXRlVG9vbGJhcigpOwogICAgfQoKICAgIC8vIC0tLSBHbHlwaHMsIEljb25zLCBhbmQgdGhlIGxpa2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBmdW5jdGlvbiBzZXRVcERlZnMoKSB7CiAgICAgICAgZGVmcyA9IHN2Zy5hcHBlbmQoJ2RlZnMnKTsKICAgICAgICBncy5z8e9WYVMJAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0X6hAAEAGSzXAqAc2wKgHYJbQH/X5PheXazqAXYAQBY5UUwAAAQEICgC3yNkAYg/Pc/HvVqNTCQCKHAAAihwAAGj3KB/SxQgAJ60eEwgARQAcfIlWQABABgU/wKgHYMCoBzYf9ZbQazqAXfk+F5eAEAI6rFUAAAEBCAoAYg/PALfI2GxvYWREZWZzKGRlZnMpOwogICAgICAgIHN1cy5sb2FkR2xvd0RlZnMoZGVmcyk7CiAgICB9CgoKICAgIC8vIC0tLSBQYW4gYW5kIFpvb20gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAvLyB6b29tIGVuYWJsZWQgcHJlZGljYXRlLiBldiBpcyBhIEQzIHNvdXJjZSBldmVudC4KICAgIGZ1bmN0aW9uIHpvb21FbmFibGVkKGV2KSB7CiAgICAgICAgcmV0dXJuIGZzLmlzTW9iaWxlKCkgfHwgKGV2Lm1ldGFLZXkgfHwgZXYuYWx0S2V5KTsKICAgIH0KCiAgICBmdW5jdGlvbiB6b29tQ2FsbGJhY2soKSB7CiAgICAgICAgdmFyIHNjID0gem9vbWVyLnNjYWxlKCksCiAgICAgICAgICAgIHRyID0gem9vbWVyLnRyYW5zbGF0ZSgpOwoKICAgICAgICBwcy5zZXRQcmVmcygndG9wb196b29tJywge3R4OnRyWzBdLCB0eTp0clsxXSwgc2M6c2N9KTsKCiAgICAgICAgLy8ga2VlcCB0aGUgbWFwIGxpbmVzIGNvbnN0YW50IHdpZHRoIHdoaWxlIHpvb21pbmcKICAgICAgICBtYXBHLnN0eWxlKCdzdHJva2Utd2lkdGgnLCAoMi4wIC8gc2MpICsgJ3B4Jyk7CiAgICB9CgogICAgZnVuY3Rpb24gc2V0VXBab29tKCkgewogICAgICAgIHpvb21MYXllciA9IHN2Zy5hcHBlbmQoJ2cnKS5hdHRyKCdpZCcsICd0b3BvLXpvb21sYXllcicpOwogICAgICAgIHpvb21lciA9IHpzLmNyZWF0ZVpvb21lcih7CiAgICAgICAgICAgIHN2Zzogc3ZnLAogICAgICAgICAgICB6b29tTGF5ZXI6IHpvb21MYXllciwKICAgICAgICAgICAgem9vbUVuYWJsZWQ6IHpvb21FbmFibGVkLAogICAgICAgICAgICB6b29tQ2FsbGJhY2s6IHpvb21DYWxsYmFjawogICAgICAgIH0pOwogICAgfQoKCiAgICAvLyBjYWxsYmFjayBpbnZva2VkIHdoZW4gdGhlIFNWRyB2aWV3IGhhcyBiZWVuIHJlc2l6ZWQuLgogICAgZnVuY3Rpb24gc3ZnUmVzaXplZChzKSB7CiAgICAgICAgdGZzLm5ld0RpbShbcy53aWR0aCwgcy5oZWlnaHRdKTsKICAgIH0KCiAgICAvLyAtLS0gQmFja2dyb3VuZCBNYXAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgZnVuY3Rpb24gc2V0VXBOb0RldnMoKSB7CiAgICAgICAgdmFyIGcsIGJveDsKICAgICAgICBub0RldnNMYXllciA9IHN2Zy5hcHBlbmQoJ2cnKS5hdHRyKHsKICAgICAgICAgICAgaWQ6ICd0b3BvLW5vRGV2c0xheWVyJywKICAgICAgICAgICAgdHJhbnNmb3JtOiBzdXMudHJhbnNsYXRlKDUwMCw1MDApCiAgICAgICAgfSk7CiAgICAgICAgLy8gTm90ZSwgU1ZHIHZpZXdib3ggaXMgJzAgMCAxMDAwIDEwMDAnLCBkZWZpbmVkIGluIHRvcG8uaHRtbC4KICAgICAgICAvLyBXZSBhcmUgdHJhbnNsYXRpbmcgdGhpcyBsYXllciB0byBoYXZlIGl0cyBvcmlnaW4gYXQgdGhlIGNlbnRlcgoKICAgICAgICBnID0gbm9EZXZzTGF5ZXIuYXBwZW5kKCdnJyk7CiAgICAgICAgZ3MuYWRkR2x5cGgoZywgJ2JpcmQnLCAxMDApLmF0dHIoJ2NsYXNzJywgJ25vRGV2c0JpcmQnKTsKICAgICAgICBnLmFwcGVuZCgndGV4dCcpLnRleHQoJ05vIGRldmljZXMgYXJlIGNvbm5lY3RlZCcpCiAgICAgICAgICAgIC5hdHRyKHsgeDogMTIwLCB5OiA4MH0pOwoKICAgICAgICBib3ggPSBnLm5vZGUoKS5nZXRCQm94KCk7CiAgICAgICAgYm94LnggLT0gYm94LndpZHRoLzI7CiAgICAgICAgYm94LnkgLT0gYm94LmhlaWdodC8yOwogICAgICAgIGcuYXR0cigndHJhbnNmb3JtJywgc3VzLnRyYW5zbGF0ZShib3gueCwgYm94LnkpKTsKCiAgICAgICAgc2hvd05vRGV2cyh0cnVlKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzaG93Tm9EZXZzKGIpIHsKICAgICAgICBzdXMudmlzaWJsZShub0RldnNMYXllciwgYik7CiAgICB9CgoKICAgIHZhciBjb3VudHJ5RmlsdGVycyA9IHsKICAgICAgICB3b3JsZDogZnVuY3Rpb24gKGMpIHsKICAgICAgICAgICAgcmV0dXJuIGMucHJvcGVydGllcy5jb250aW5lbnQgIT09ICdBbnRhcmN0aWNhJzsKICAgICAgICB9LAoKICAgICAgICAvLyBOT1RFOiBmb3IgInVzYSIgd2UgYXJlIHVzaW5nIG91ciBoYW5kLWNyYWZ0ZWQgdG9wb2pzb24gZmlsZQoKICAgICAgICBzX2FtZXJpY2E6IGZ1bmN0aW9uIChjKSB7CiAgICAgICAgICAgIHJldHVybiBjLnByb3BlcnRpZXMuY29udGluZW50ID09PSAnU291dGggQW1lcmljYSc7CiAgICAgICAgfSwKCiAgICAgICAgbnNfYW1lcmljYTogZnVuY3Rpb24gKGMpIHsKICAgICAgICAgICAgcmV0dXJuIGMucHJvcGVydGllcy5jdXN0b20gPT09ICdVUy1jb250JyB8fAogICAgICAgICAgICAgICAgYy5wcm9wZXJ0aWVzLnN1YnJlZ2lvbiA9PT0gJ0NlbnRyYWwgQW1lcmljYScgfHwKICAgICAgICAgICAgICAgIGMucHJvcGVydGllcy5jb250aW5lbnQgPT09ICdTb3V0aCBBbWVyaWNhJzsKICAgICAgICB9LAoKICAgICAgICBqYXBhbjogZnVuY3Rpb24gKGMpIHsKICAgICAgICAgICAgcmV0dXJuIGMucHJvcGVydGllcy5nZW91bml0ID09PSAnSmFwYW4nOwogICAgICAgIH0sCgogICAgICAgIGV1cm9wZTogZnVuY3Rpb24gKGMpIHsKICAgICAgICAgICAgcmV0dXJuIGMucHJvcGVydGllcy5jb250aW5lbnQgPT09ICdFdXJvcGUnOwogICAgICAgIH0sCgogICAgICAgIGl0YWx5OiBmdW5jdGlvbiAoYykgewogICAgICAgICAgICByZXR1cm4gYy5wcm9wZXJ0aWVzLmdlb3VuaXQgPT09ICdJdGFseSc7CiAgICAgICAgfSwKCiAgICAgICAgdWs6IGZ1bmN0aW9uIChjKSB7CiAgICAgICAgICAgIC8vIHRlY2huaWNhbGx5LCBJcmVsYW5kIGlzIG5vdCBwYXJ0IG9mIHRoZSBVbml0ZWQgS2luZ2RvbSwKICAgICAgICAgICAgLy8gYnV0IHRoZSBtYXAgbG9va3Mgd2VpcmQgd2l0aG91dCBpdCBzaG93aW5nLgogICAgICAgICAgICByZXR1cm4gYy5wcm9wZXJ0aWVzLmFkbTBfYTMgPT09ICdHQlInIHx8CiAgICAgICAgICAgICAgICBjLnByb3BlcnRpZXMuYWRtMF9hMyA9PT0gJ0lSTCc7CiAgICAgICAgfSwKCiAgICAgICAgc19rb3JlYTogZnVuY3Rpb24gKGMpIHsKICAgICAgICAgICAgcmV0dXJuIGMucHJvcGVydGllcy5hZG0wX2EzID09PSAnS09SJzsKICAgICAgICB9LAoKICAgICAgICBhdXN0cmFsaWE6IGZ1bmN0aW9uIChjKSB7CiAgICAgICAgICAgIHJldHVybiBjLnByb3BlcnRpZXMuYWRtMF9hMyA9PT0gJ0FVUyc7CiAgICAgICAgfQogICAgfTsKCgogICAgZnVuY3Rpb24gc2V0VXBNYXAoJGxvYykgewogICAgICAgIHZhciBzMSA9ICRsb2Muc2VhcmNoKCkubWFwaWQsCiAgICAgICAgICAgIHMyID0gcHMuZ2V0UHJlZnMoJ3RvcG9fbWFwaWQnKSwKICAgICAgICAgICAgbWFwSWQgPSBzMSB8fCAoczIgJiYgczIuaWQpIHx8ICd1c2EnLAogICAgICAgICAgICBwcm9taXNlLAogICAgICAgICAgICBjZmlsdGVyLAogICAgICAgICAgICBvcHRzOwoKICAgICAgICBtYXBHID0gem9vbUxheWVyLmFwcGVuZCgnZycpLmF0dHIoJ2lkJywgJ3RvcG8tbWFwJyk7CiAgICAgICAgaWYgKG1hcElkID09PSAndXNhJykgewogICAgICAgICAgICBwcm9taXNlID0gbXMubG9hZE1hcEludG8obWFwRywgJypjb250aW5lbnRhbF91cycpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHBzLnNldFByZWZzKCd0b3BvX21hcGlkJywge2lkOm1hcElkfSk7CiAgICAgICAgICAgIGNmaWx0ZXIgPSBjb3VudHJ5RmlsdGVyc1ttYXBJZF0gfHwgY291bnRyeUZpbHRlcnMud29ybGQ7CiAgICAgICAgICAgIG9wdHMgPSB7IGNvdW50cnlGaWx0ZXI6IGNmaWx0ZXIgfTsKICAgICAgICAgICAgcHJvbWlzZSA9IG1zLmxvYWRNYXBSZWdpb25JbnRvKG1hcEcsIG9wdHMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcHJvbWlzZTsKICAgIH0KCiAgICBmdW5jdGlvbiBvcGFjaWZ5TWFwKGIpIHsKICAgICAgICBtYXBHLnRyYW5zaXRpb24oKQogICAgICAgICAgICAuZHVyYXRpb24oMTAwMCkKICAgICAgICAgICAgLmF0dHIoJ29wYWNpdHknLCBiID8gMSA6IDApOwogICAgfQoKICAgIGZ1bmN0aW9uIHNldFVwU3ByaXRlcygkbG9jLCB0c3ByKSB7CiAgICAgICAgdmFyIHMxID0gJGxvYy5zZWFyY2goKS5zcHJpdGVzLAogICAgICAgICAgICBzMiA9IHBzLmdldFByZWZzKCd0b3BvX3Nwcml0ZXMnKSwKICAgICAgICAgICAgc3BySWQgPSBzMSB8fCAoczIgJiYgczIuaWQpOwoKICAgICAgICBzcHJpdGVHID0gem9vbUxheWVyLmFwcGVuZCAoJ2cnKS5hdHRyKCdpZCcsICd0b3BvLXNwcml0ZXMnKTsKICAgICAgICBpZiAoc3BySWQpIHsKICAgICAgICAgICAgcHMuc2V0UHJlZnMoJ3RvcG9fc3ByaXRlcycsIHtpZDpzcHJJZH0pOwogICAgICAgICAgICB0c3ByLmxvYWRTcHJpdGVzKHNwcml0ZUcsIGRlZnMsIHNwcklkKTsKICAgICAgICB9CiAgICB9CgogICAgLy8gLS0tIFVzZXIgUHJlZmVyZW1jZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIHZhciBwcmVmc1N0YXRlID0ge307CgogICAgZnVuY3Rpb24gdXBkYXRlUHJlZnNTdGF0ZSh3aGF0LCBiKSB7CiAgICAgICAgcHJlZnNTdGF0ZVt3aGF0XSA9IGIgPyAxIDogMDsKICAgICAgICBwcy5zZXRQcmVmcygndG9wb19wcmVmcycsIHByZWZzU3RhdGUpOwogICAgfQoKCiAgICBmdW5jdGlvbiByZXN0b3JlQ29uZmlnRnJvbVByZWZzKCkgewogICAgICAgIC8vIE5PVEU6IHRvb2xiYXIgd2lsbCBoYXZlIHNldCB0aGlzIGZvciB1cy4uCiAgICAgICAgcHJlZnNTdGF0ZSA9IHBzLmFzTnVtYmVycyhwcy5nZXRQcmVmcygndG9wb19wcmVmcycpKTsKCiAgICAgICAgJGxvZy5kZWJ1ZygnVE9QTy0gUHJlZnMgU3RhdGU6JywgcHJlZnNTdGF0ZSk7CgogICAgICAgIGZsYXNoLmVuYWJsZShmYWxzZSk7CiAgICAgICAgdG9nZ2xlSW5zdGFuY2VzKHByZWZzU3RhdGUuaW5zdHMpOwogICAgICAgIHRvZ2dsZVN1bW1hcnkocHJlZnNTdGF0ZS5zdW1tYXJ5KTsKICAgICAgICB0b2dnbGVVc2VEZXRhaWxzRmxhZyhwcmVmc1N0YXRlLmRldGFpbCk7CiAgICAgICAgdG9nZ2xlSG9zdHMocHJlZnNTdGF0ZS5ob3N0cyk7CiAgICAgICAgdG9nZ2xlT2ZmbGluZShwcmVmc1N0YXRlLm9mZmRldik7CiAgICAgICAgdG9nZ2xlUG9ydHMocHJlZnNTdGF0ZS5wb3J0aGwpOwogICAgICAgIHRvZ2dsZU1hcChwcmVmc1N0YXRlLmJnKTsKICAgICAgICB0b2dnbGVTcHJpdGVzKHByZWZzU3RhdGUuc3ByKTsKICAgICAgICBmbGFzaC5lbmFibGUodHJ1ZSk7CiAgICB9CgoKICAgIC8vIHNvbWV3aGF0IGhhY2tpc2gsIGJlY2F1c2Ugc3VtbWFyeSB1cGRhdGUgY2Fubm90IGhhcHBlbiB1bnRpbCB3ZQogICAgLy8gIGhhdmUgb3BlbmVkIHRoZSB3ZWJzb2NrZXQgdG8gdGhlIHNlcnZlcjsgaGVuY2UgdGhpcyBleHRyYSBmdW5jdGlvbgogICAgLy8gaW52b2tlZCBhZnRlciB0ZXMuc3RhcnQoKQogICAgZnVuY3Rpb24gcmVzdG9yZVN1bW1hcnlGcm9tUHJlZnMoKSB7CiAgICAgICAgcHJlZnNTdGF0ZSA9IHBzLmFzTnVtYmVycyhwcy5nZXRQcmVmcygndG9wb19wcmVmcycpKTsKICAgICAgICAkbG9nLmRlYnVnKCdUT1BPLSBQcmVmcyBTVU1NQVJZIFN0YXRlOicsIHByZWZzU3RhdGUuc3VtbWFyeSk7CgogICAgICAgIGZsYXNoLmVuYWJsZShmYWxzZSk7CiAgICAgICAgdG9nZ2xlU3VtbWFyeShwcmVmc1N0YXRlLnN1bW1hcnkpOwogICAgICAgIGZsYXNoLmVuYWJsZSh0cnVlKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0b3BvU3RhcnREb25lKCkgewogICAgICAgIHZhciBkID0gJHNjb3BlLmludGVudERhdGE7CiAgICAgICAgaWYgKGQpIHsKICAgICAgICAgICAgdHRzLnNlbGVjdEludGVudChkKTsKICAgICAgICB9CiAgICB9CgogICAgLy8gLS0tIENvbnRyb2xsZXIgRGVmaW5pdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIGFuZ3VsYXIubW9kdWxlKCdvdlRvcG8nLCBtb2R1bGVEZXBlbmRlbmNpZXMpCiAgICAgICAgLmNvbnRyb2xsZXIoJ092VG9wb0N0cmwnLCBbJyRzY29wZScsICckbG9nJywgJyRsb2NhdGlvbicsICckdGltZW91dCcsCiAgICAgICAgICAgICckY29va2llcycsICdGblNlcnZpY2UnLCAnTWFzdFNlcnZpY2UnLCAnS2V5U2VydmljZScsICdab29tU2VydmljZScsCiAgICAgICAgICAgICdHbHlwaFNlcnZpY2UnLCAnTWFwU2VydmljZScsICdTdmdVdGlsU2VydmljZScsICdGbGFzaFNlcnZpY2UnLAogICAgICAgICAgICAnV2ViU29ja2V0U2VydmljZScsICdQcmVmc1NlcnZpY2UnLCAnVG9wb0RpYWxvZ1NlcnZpY2UnLAogICAgICAgICAgICAnVG9wb0V2ZW50U2VydmljZScsICdUb3BvRm9yY2VTZXJ2aWNlJywgJ1RvcG9QYW5lbFNlcnZpY2UnLAogICAgICAgICAgICAnVG9wb0luc3RTZXJ2aWNlJywgJ1RvcG9TZWxlY3RTZXJ2aWNlJywgJ1RvcG9MaW5rU2VydmljZScsCiAgICAgICAgICAgICdUb3BvVHJhZmZpY1NlcnZpY2UnLCAnVG9wb09ibGlxdWVTZXJ2aWNlJywgJ1RvcG9GaWx0ZXJTZXJ2aWNlJywKICAgICAgICAgICAgJ1RvcG9Ub29sYmFyU2VydmljZScsICdUb3BvU3ByaXRlU2VydmljZScsICdUb29sdGlwU2VydmljZScsCiAgICAgICAgICAgICdUb3BvT3ZlcmxheVNlcnZpY2UnLAoKICAgICAgICBmdW5jdGlvbiAoXyRzY29wZV8sIF8kbG9nXywgJGxvYywgJHRpbWVvdXQsIF8kY29va2llc18sIF9mc18sIG1hc3QsIF9rc18sCiAgICAgICAgICAgICAgICAgIF96c18sIF9nc18sIF9tc18sIF9zdXNfLCBfZmxhc2hfLCBfd3NzXywgX3BzXywgX3Rkc18sIF90ZXNfLAogICAgICAgICAgICAgICAgICBfdGZzXywgX3Rwc18sIF90aXNfLCBfdHNzXywgX3Rsc18sIF90dHNfLCBfdG9zXywgX2ZsdHJfLAogICAgICAgICAgICAgICAgICBfdHRic18sIHRzcHIsIF90dGlwXywgX3Rvdl8pIHsKICAgICAgICAgICAgdmFyIHBhcmFtcyA9ICRsb2Muc2VhcmNoKCksCiAgICAgICAgICAgICAgICBwcm9qZWN0aW9uLAogICAgICAgICAgICAgICAgZGltLAogICAgICAgICAgICAgICAgdXBsaW5rID0gewogICAgICAgICAgICAgICAgICAgIC8vIHByb3ZpZGVzIGZ1bmN0aW9uIGNhbGxzIGJhY2sgaW50byB0aGlzIHNwYWNlCiAgICAgICAgICAgICAgICAgICAgc2hvd05vRGV2czogc2hvd05vRGV2cywKICAgICAgICAgICAgICAgICAgICBwcm9qZWN0aW9uOiBmdW5jdGlvbiAoKSB7IHJldHVybiBwcm9qZWN0aW9uOyB9LAogICAgICAgICAgICAgICAgICAgIHpvb21MYXllcjogZnVuY3Rpb24gKCkgeyByZXR1cm4gem9vbUxheWVyOyB9LAogICAgICAgICAgICAgICAgICAgIHpvb21lcjogZnVuY3Rpb24gKCkgeyByZXR1cm4gem9vbWVyOyB9LAogICAgICAgICAgICAgICAgICBz8e9W1VMJAI4OAACODgAAaPcoH9LFCAAnrR4TCABFAA6AiVtAAEAGEzbAqAdgwKgHNh/1ltBrOpyl+T4Xl4AYAjqeWQAAAQEICgBiD88At8jZICBvcGFjaWZ5TWFwOiBvcGFjaWZ5TWFwLAogICAgICAgICAgICAgICAgICAgIHRvcG9TdGFydERvbmU6IHRvcG9TdGFydERvbmUKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAkc2NvcGUgPSBfJHNjb3BlXzsKICAgICAgICAgICAgJGxvZyA9IF8kbG9nXzsKICAgICAgICAgICAgJGNvb2tpZXMgPSBfJGNvb2tpZXNfOwogICAgICAgICAgICBmcyA9IF9mc187CiAgICAgICAgICAgIGtzID0gX2tzXzsKICAgICAgICAgICAgenMgPSBfenNfOwogICAgICAgICAgICBncyA9IF9nc187CiAgICAgICAgICAgIG1zID0gX21zXzsKICAgICAgICAgICAgc3VzID0gX3N1c187CiAgICAgICAgICAgIGZsYXNoID0gX2ZsYXNoXzsKICAgICAgICAgICAgd3NzID0gX3dzc187CiAgICAgICAgICAgIHBzID0gX3BzXzsKICAgICAgICAgICAgdGRzID0gX3Rkc187CiAgICAgICAgICAgIHRlcyA9IF90ZXNfOwogICAgICAgICAgICB0ZnMgPSBfdGZzXzsKICAgICAgICAgICAgLy8gVE9ETzogY29uc2lkZXIgZnVubmVsbGluZyBhY3Rpb25zIHRocm91Z2ggVG9wb0ZvcmNlU2VydmljZS4uLgogICAgICAgICAgICAvLyAgcmF0aGVyIHRoYW4gaW5qZWN0aW5nIHJlZmVyZW5jZXMgdG8gdGhlc2UgJ3N1Yi1tb2R1bGVzJywKICAgICAgICAgICAgLy8gIGp1c3Qgc28gd2UgY2FuIGludm9rZSBmdW5jdGlvbnMgb24gdGhlbS4KICAgICAgICAgICAgdHBzID0gX3Rwc187CiAgICAgICAgICAgIHRpcyA9IF90aXNfOwogICAgICAgICAgICB0c3MgPSBfdHNzXzsKICAgICAgICAgICAgdGxzID0gX3Rsc187CiAgICAgICAgICAgIHR0cyA9IF90dHNfOwogICAgICAgICAgICB0b3MgPSBfdG9zXzsKICAgICAgICAgICAgZmx0ciA9IF9mbHRyXzsKICAgICAgICAgICAgdHRicyA9IF90dGJzXzsKICAgICAgICAgICAgdHRpcCA9IF90dGlwXzsKICAgICAgICAgICAgdG92ID0gX3Rvdl87CgogICAgICAgICAgICBpZiAocGFyYW1zLmludGVudEtleSAmJiBwYXJhbXMuaW50ZW50QXBwSWQgJiYgcGFyYW1zLmludGVudEFwcE5hbWUpIHsKICAgICAgICAgICAgICAgICRzY29wZS5pbnRlbnREYXRhID0gewogICAgICAgICAgICAgICAgICAgIGtleTogcGFyYW1zLmludGVudEtleSwKICAgICAgICAgICAgICAgICAgICBhcHBJZDogcGFyYW1zLmludGVudEFwcElkLAogICAgICAgICAgICAgICAgICAgIGFwcE5hbWU6IHBhcmFtcy5pbnRlbnRBcHBOYW1lCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAkc2NvcGUubm90aWZ5UmVzaXplID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgc3ZnUmVzaXplZChmcy53aW5kb3dTaXplKG1hc3QubWFzdEhlaWdodCgpKSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBDbGVhbnVwIG9uIGRlc3Ryb3llZCBzY29wZS4uCiAgICAgICAgICAgICRzY29wZS4kb24oJyRkZXN0cm95JywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgJGxvZy5sb2coJ092VG9wb0N0cmwgaXMgc2F5aW5nIEJ1aC1CeWUhJyk7CiAgICAgICAgICAgICAgICB0ZXMuc3RvcCgpOwogICAgICAgICAgICAgICAga3MudW5iaW5kS2V5cygpOwogICAgICAgICAgICAgICAgdHBzLmRlc3Ryb3lQYW5lbHMoKTsKICAgICAgICAgICAgICAgIHRkcy5jbG9zZURpYWxvZygpOwogICAgICAgICAgICAgICAgdGlzLmRlc3Ryb3lJbnN0KCk7CiAgICAgICAgICAgICAgICB0ZnMuZGVzdHJveUZvcmNlKCk7CiAgICAgICAgICAgICAgICB0dGJzLmRlc3Ryb3lUb29sYmFyKCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gc3ZnIGxheWVyIGFuZCBpbml0aWFsaXphdGlvbiBvZiBjb21wb25lbnRzCiAgICAgICAgICAgIG92dG9wbyA9IGQzLnNlbGVjdCgnI292LXRvcG8nKTsKICAgICAgICAgICAgc3ZnID0gb3Z0b3BvLnNlbGVjdCgnc3ZnJyk7CiAgICAgICAgICAgIC8vIHNldCB0aGUgc3ZnIHNpemUgdG8gbWF0Y2ggdGhhdCBvZiB0aGUgd2luZG93LCBsZXNzIHRoZSBtYXN0aGVhZAogICAgICAgICAgICBzdmcuYXR0cihmcy53aW5kb3dTaXplKG1hc3QubWFzdEhlaWdodCgpKSk7CiAgICAgICAgICAgIGRpbSA9IFtzdmcuYXR0cignd2lkdGgnKSwgc3ZnLmF0dHIoJ2hlaWdodCcpXTsKCiAgICAgICAgICAgIHNldFVwS2V5cygpOwogICAgICAgICAgICBzZXRVcFRvb2xiYXIoKTsKICAgICAgICAgICAgc2V0VXBEZWZzKCk7CiAgICAgICAgICAgIHNldFVwWm9vbSgpOwogICAgICAgICAgICBzZXRVcE5vRGV2cygpOwogICAgICAgICAgICBzZXRVcE1hcCgkbG9jKS50aGVuKAogICAgICAgICAgICAgICAgZnVuY3Rpb24gKHByb2opIHsKICAgICAgICAgICAgICAgICAgICB2YXIgeiA9IHBzLmdldFByZWZzKCd0b3BvX3pvb20nKSB8fCB7dHg6MCwgdHk6MCwgc2M6MX07CiAgICAgICAgICAgICAgICAgICAgem9vbWVyLnBhblpvb20oW3oudHgsIHoudHldLCB6LnNjKTsKICAgICAgICAgICAgICAgICAgICAkbG9nLmRlYnVnKCcqKiBab29tIHJlc3RvcmVkOicsIHopOwoKICAgICAgICAgICAgICAgICAgICBwcm9qZWN0aW9uID0gcHJvajsKICAgICAgICAgICAgICAgICAgICAkbG9nLmRlYnVnKCcqKiBXZSBpbnN0YWxsZWQgdGhlIHByb2plY3Rpb246JywgcHJvaik7CiAgICAgICAgICAgICAgICAgICAgZmxhc2guZW5hYmxlKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICB0b2dnbGVNYXAocHJlZnNTdGF0ZS5iZyk7CiAgICAgICAgICAgICAgICAgICAgZmxhc2guZW5hYmxlKHRydWUpOwoKICAgICAgICAgICAgICAgICAgICAvLyBub3cgd2UgaGF2ZSB0aGUgbWFwIHByb2plY3Rpb24sIHdlIGFyZSByZWFkeSBmb3IKICAgICAgICAgICAgICAgICAgICAvLyAgdGhlIHNlcnZlciB0byBzZW5kIHVzIGRldmljZS9ob3N0IGRhdGEuLi4KICAgICAgICAgICAgICAgICAgICB0ZXMuc3RhcnQoKTsKICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGRvIHRoZSBmb2xsb3dpbmcgc28gd2UgaW1tZWRpYXRlbHkgZ2V0CiAgICAgICAgICAgICAgICAgICAgLy8gIHRoZSBzdW1tYXJ5IHBhbmVsIGRhdGEgYmFjayBmcm9tIHRoZSBzZXJ2ZXIKICAgICAgICAgICAgICAgICAgICByZXN0b3JlU3VtbWFyeUZyb21QcmVmcygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgICAgICBzZXRVcFNwcml0ZXMoJGxvYywgdHNwcik7CgogICAgICAgICAgICBmb3JjZUcgPSB6b29tTGF5ZXIuYXBwZW5kKCdnJykuYXR0cignaWQnLCAndG9wby1mb3JjZScpOwogICAgICAgICAgICB0ZnMuaW5pdEZvcmNlKHN2ZywgZm9yY2VHLCB1cGxpbmssIGRpbSk7CiAgICAgICAgICAgIHRpcy5pbml0SW5zdCh7IHNob3dNYXN0ZXJzaGlwOiB0ZnMuc2hvd01hc3RlcnNoaXAgfSk7CiAgICAgICAgICAgIHRwcy5pbml0UGFuZWxzKCk7CgogICAgICAgICAgICAvLyB0ZW1wb3Jhcnkgc29sdXRpb24gZm9yIHBlcnNpc3RpbmcgdXNlciBzZXR0aW5ncwogICAgICAgICAgICByZXN0b3JlQ29uZmlnRnJvbVByZWZzKCk7CiAgICAgICAgICAgIHR0YnMuc2V0RGVmYXVsdE92ZXJsYXkoKTsKCiAgICAgICAgICAgICRsb2cuZGVidWcoJ3JlZ2lzdGVyZWQgb3ZlcmxheXMuLi4nLCB0b3YubGlzdCgpKTsKICAgICAgICAgICAgJGxvZy5sb2coJ092VG9wb0N0cmwgaGFzIGJlZW4gY3JlYXRlZCcpOwogICAgICAgIH1dKTsKfSgpKTsKc/HvVmdWCQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANF+pQABABks0wKgHNsCoB2CW0B/1+T4Xl2s6qvGAEAWkKakAAAEBCAoAt8jZAGIPz3Px71YKWQkAkQIAAJECAAAIACetHhNo9ygf0sUIAEUAAoNfqkAAQAZI5MCoBzbAqAdgltAf9fk+F5drOqrxgBgFpP/oAAABAQgKALfI2QBiD89HRVQgL29ub3MvdWkvYXBwL3ZpZXcvdG9wby90b3BvRGlhbG9nLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiAqLyoNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9W9l0JAHcFAAB3BQAAaPcoH9LFCAAnrR4TCABFAAVpiV5AAEAGHErAqAdgwKgHNh/1ltBrOqrx+T4Z5oAYAkWVQgAAAQEICgBiD9AAt8jZSFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvamF2YXNjcmlwdA0KQ29udGVudC1MZW5ndGg6IDEyMjgNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KLyoKICogIENvcHlyaWdodCAyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIFRvcG9sb2d5IERpYWxvZyBNb2R1bGUuCiBDcmVhdGVzIGEgZGlhbG9nIGJveCBmb3IgdGhlIHRvcG9sb2d5IHZpZXcuCiAqLwoKKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBjb25zdGFudHMKICAgIHZhciBpZERpYWxvZyA9ICd0b3BvLXAtZGlhbG9nJywKICAgICAgICBvcHRzID0gewogICAgICAgICAgICBjc3NDbHM6ICd0b3BvLXAnCiAgICAgICAgfTsKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIGFuZ3VsYXIubW9kdWxlKCdvdlRvcG8nKQogICAgLmZhY3RvcnkoJ1RvcG9EaWFsb2dTZXJ2aWNlJywKICAgICAgICBbJ0RpYWxvZ1NlcnZpY2UnLAoKICAgICAgICBmdW5jdGlvbiAoZHMpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIG9wZW5EaWFsb2c6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRzLm9wZW5EaWFsb2coaWREaWFsb2csIG9wdHMpOyB9LAogICAgICAgICAgICAgICAgY2xvc2VEaWFsb2c6IGRzLmNsb3NlRGlhbG9nLAogICAgICAgICAgICAgICAgY3JlYXRlRGl2OiBkcy5jcmVhdGVEaXYKICAgICAgICAgICAgfTsKICAgICAgICB9XSk7Cn0oKSk7CnPx71Y7YQkAgAAAAIAAAABo9ygf0sUIACetHhMIAEUAAHIoyUAAQAaB1sCoB2DAqAc2H/WW0lNREAc0h2DQgBgCrZBLAAABAQgKAGIP0AC3yNZIVFRQLzEuMSAzMDQgTm90IE1vZGlmaWVkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCnPx71buYgkAkQIAAJECAAAIACetHhNo9ygf0sUIAEUAAoNfq0AAQAZI48CoBzbAqAdgltAf9fk+GeZrOrAmgBgFpOVfAAABAQgKALfI2gBiD9BHRVQgL29ub3MvdWkvYXBwL3ZpZXcvdG9wby90b3BvRmlsdGVyLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiAqLyoNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9WNmQJAIAAAACAAAAAaPcoH9LFCAAnrR4TCABFAAByK8pAAEAGftXAqAdgwKgHNh/1ltNygo0XYRxSwoAYAkGQSwAAAQEICgBiD9AAt8jWSFRUUC8xLjEgMzA0IE5vdCBNb2RpZmllZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQpz8e9WamQJAJACAACQAgAACAAnrR4TaPcoH9LFCABFAAKCa69AAEAGPODAqAc2wKgHYJbSH/U0h2DQU1EQRYAYDzPeEgAAAQEICgC3yNoAYg/QR0VUIC9vbm9zL3VpL2FwcC92aWV3L3RvcG8vdG9wb0ZvcmNlLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiAqLyoNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9WrGUJAI8CAACPAgAACAAnrR4TaPcoH9LFCABFAAKBZJFAAEAGQ//AqAc2wKgHYJbTH/VhHFLCcoKNVYAYBaTNiQAAAQEICgC3yNoAYg/QR0VUIC9vbm9zL3VpL2FwcC92aWV3L3RvcG8vdG9wb0luc3QuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6ICovKg0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCnPx71bcbAkAgAAAAIAAAABo9ygf0sUIACetHhMIAEUAAHLMmkAAQAbeBMCoB2DAqAc2H/WW0VqVjrqMl6uJgBgCgpBLAAABAQgKAGIP0QC3yNZIVFRQLzEuMSAzMDQgTm90IE1vZGlmaWVkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCnPx71YicAkAjwIAAI8CAAAIACetHhNo9ygf0sUIAEUAAoHdmUAAQAbK9sCoBzbAqAdgltEf9YyXq4lalY74gBgFpG2TAAABAQgKALfI2wBiD9FHRVQgL29ub3MvdWkvYXBwL3ZpZXcvdG9wby90b3BvTGluay5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVnlyCQCKHAAAihwAAGj3KB/SxQgAJ60eEwgARQAcfIE4QABABg1dwKgHYMCoBzYf9ZbUoa5FjkDd1ROAEAJhrFUAAAEBCAoAYg/RALfI2EhUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2phdmFzY3JpcHQNCkNvbnRlbnQtTGVuZ3RoOiAxNzM4Mg0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBUb3BvbG9neSBEMyBNb2R1bGUuCiBGdW5jdGlvbnMgZm9yIG1hbmlwdWxhdGluZyB0aGUgRDMgdmlzdWFsaXphdGlvbnMgb2YgdGhlIFRvcG9sb2d5CiAqLwoKKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBpbmplY3RlZCByZWZzCiAgICB2YXIgJGxvZywgZnMsIHN1cywgaXMsIHRzOwoKICAgIC8vIGFwaSB0byB0b3BvRm9yY2UKICAgIHZhciBhcGk7CiAgICAvKgogICAgIG5vZGUoKSAgICAgICAgICAgICAgICAgLy8gZ2V0IHJlZiB0byBEMyBzZWxlY3Rpb24gb2Ygbm9kZXMKICAgICBsaW5rKCkgICAgICAgICAgICAgICAgIC8vIGdldCByZWYgdG8gRDMgc2VsZWN0aW9uIG9mIGxpbmtzCiAgICAgbGlua0xhYmVsKCkgICAgICAgICAgICAvLyBnZXQgcmVmIHRvIEQzIHNlbGVjdGlvbiBvZiBsaW5rIGxhYmVscwogICAgIGluc3RWaXNpYmxlKCkgICAgICAgICAgLy8gdHJ1ZSBpZiBpbnN0YW5jZXMgcGFuZWwgaXMgdmlzaWJsZQogICAgIHBvc05vZGUoKSAgICAgICAgICAgICAgLy8gcG9zaXRpb24gbm9kZQogICAgIHNob3dIb3N0cygpICAgICAgICAgICAgLy8gdHJ1ZSBpZiBob3N0cyBhcmUgdG8gYmUgc2hvd24KICAgICByZXN0eWxlTGlua0VsZW1lbnQoKSAgIC8vIHVwZGF0ZSBsaW5rIHN0eWxlcyBiYXNlZCBvbiBiYWNraW5nIGRhdGEKICAgICB1cGRhdGVMaW5rTGFiZWxNb2RlbCgpIC8vIHVwZGF0ZSBiYWNraW5nIGRhdGEgZm9yIGxpbmsgbGFiZWxzCiAgICAgKi8KCiAgICAvLyBjb25maWd1cmF0aW9uCiAgICB2YXIgZGV2Q2ZnID0gewogICAgICAgICAgICB4b2ZmOiAtMjAsCiAgICAgICAgICAgIHlvZmY6IC0xOAogICAgICAgIH0sCiAgICAgICAgbGFiZWxDb25maWcgPSB7CiAgICAgICAgICAgIGltZ1BhZDogMTYsCiAgICAgICAgICAgIHBhZExSOiA0LAogICAgICAgICAgICBwYWRUQjogMywKICAgICAgICAgICAgbWFyZ2luTFI6IDMsCiAgICAgICAgICAgIG1hcmdpblRCOiAyLAogICAgICAgICAgICBwb3J0OiB7CiAgICAgICAgICAgICAgICBnYXA6IDMsCiAgICAgICAgICAgICAgICB3aWR0aDogMTgsCiAgICAgICAgICAgICAgICBoZWlnaHQ6IDE0CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIGJhZGdlQ29uZmlnID0gewogICAgICAgICAgICByYWRpdXM6IDEyLAogICAgICAgICAgICB5b2ZmOiA1LAogICAgICAgICAgICBnZGVsdGE6IDEwCiAgICAgICAgfSwKICAgICAgICBpY2ZnOwoKICAgIHZhciBzdGF0dXMgPSB7CiAgICAgICAgaTogJ2JhZGdlSW5mbycsCiAgICAgICAgdzogJ2JhZGdlV2FybicsCiAgICAgICAgZTogJ2JhZGdlRXJyb3InCiAgICB9OwoKICAgIGZ1bmN0aW9uIGJhZGdlU3RhdHVzKGJhZGdlKSB7CiAgICAgICAgcmV0dXJuIHN0YXR1c1tiYWRnZS5zdGF0dXNdIHx8IHN0YXR1cy5pOwogICAgfQoKICAgIC8vIGludGVybmFsIHN0YXRlCiAgICB2YXIgZGV2aWNlTGFiZWxJbmRleCA9IDAsCiAgICAgICAgaG9zdExhYmVsSW5kZXggPSAwOwoKCiAgICB2YXIgZENvbCA9IHsKICAgICAgICBibGFjazogJyMwMDAnLAogICAgICAgIHBhbGVibHVlOiAnI2FjZicsCiAgICAgICAgb2Zmd2hpdGU6ICcjZGRkJywKICAgICAgICBkYXJrZ3JleTogJyM0NDQnLAogICAgICAgIG1pZGdyZXk6ICcjODg4JywKICAgICAgICBsaWdodGdyZXk6ICcjYmJiJywKICAgICAgICBvcmFuZ2U6ICcjZjkwJwogICAgfTsKCiAgICAvLyBub3RlOiB0aGVzZSBhcmUgdGhlIGRldmljZSBpY29uIGNvbG9ycyB3aXRob3V0IGFmZmluaXR5CiAgICB2YXIgZENvbFRoZW1lID0gewogICAgICAgIGxpZ2h0OiB7CiAgICAgICAgICAgIHJmaWxsOiBkQ29sLm9mZndoaXRlLAogICAgICAgICAgICBvbmxpbmU6IHsKICAgICAgICAgICAgICAgIGdseXBoOiBkQ29sLmRhcmtncmV5LAogICAgICAgICAgICAgICAgcmVjdDogZENvbC5wYWxlYmx1ZQogICAgICAgICAgICB9LAogICAgICAgICAgICBvZmZsaW5lOiB7CiAgICAgICAgICAgICAgICBnbHlwaDogZENvbC5taWRncmV5LAogICAgICAgICAgICAgICAgcmVjdDogZENvbC5saWdodGdyZXkKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgZGFyazogewogICAgICAgICAgICByZmlsbDogZENvbC5taWRncmV5LAogICAgICAgICAgICBvbmxpbmU6IHsKICAgICAgICAgICAgICAgIGdseXBoOiBkQ29sLmRhcmtncmV5LAogICAgICAgICAgICAgICAgcmVjdDogZENvbC5wYWxlYmx1ZQogICAgICAgICAgICB9LAogICAgICAgICAgICBvZmZsaW5lOiB7CiAgICAgICAgICAgICAgICBnbHlwaDogZENvbC5taWRncmV5LAogICAgICAgICAgICAgICAgcmVjdDogZENvbC5kYXJrZ3JleQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCiAgICBmdW5jdGlvbiBkZXZCYXNlQ29sb3IoZCkgewogICAgICAgIHZhciBvID0gZC5vbmxpbmUgPyAnb25saW5lJyA6ICdvZmZsaW5lJzsKICAgICAgICByZXR1cm4gZENvbFRoZW1lW3RzLnRoZW1lKCldW29dOwogICAgfQoKICAgIGZ1bmN0aW9uIHNldERldmljZUNvbG9yKGQpIHsKICAgICAgICB2YXIgbyA9IGQub25saW5lLAogICAgICAgICAgICBzID0gZC5lbC5jbGFzc2VkKCdzZWxlY3RlZCcpLAogICAgICAgICAgICBjID0gZGV2QmFzZUNvbG9yKGQpLAogICAgICAgICAgICBhID0gaW5zdENvbG9yKGQubWFzdGVyLCBvKSwKICAgICAgICAgICAgaWNvbiA9IGQuZWwuc2VsZWN0KCdnLmRldmljZUljb24nKSwKICAgICAgICAgICAgZywgcjsKCiAgICAgICAgaWYgKHMpIHsKICAgICAgICAgICAgZyA9IGMuZ2x5cGg7CiAgICAgICAgICAgIHIgPSBkQ29sLm9yYW5nZTsKICAgICAgICB9IGVsc2UgaWYgKGFwaS5pbnN0VmlzaWJsZSgpKSB7CiAgICAgICAgICAgIGcgPSBvID8gYSA6IGMuZ2x5cGg7CiAgICAgICAgICAgIHIgPSBvID8gYy5yZmlsbCA6IGE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZyA9IGMuZ2x5cGg7CiAgICAgICAgICAgIHIgPSBjLnJlY3Q7CiAgICAgICAgfQoKICAgICAgICBpY29uLnNlbGVjdCgndXNlJykuc3R5bGUoJ2ZpbGwnLCBnKTsKICAgICAgICBpY29uLnNlbGVjdCgncmVjdCcpLnN0eWxlKCdmaWxsJywgcik7CiAgICB9CgogICAgZnVuY3Rpb24gaW5zdENvbG9yKGlkLCBvbmxpbmUpIHsKICAgICAgICByZXR1cm4gc3VzLmNhdDcoKS5nZXRDb2xvcihpZCwgIW9ubGluZSwgdHMudGhlbWUoKSk7CiAgICB9CgogICAgLy8gPT09PQoKICAgIGZ1bmN0aW9uIGluY0RldkxhYkluZGV4KCkgewogICAgICAgIGRldmljZUxhYmVsSW5kZXggPSAoZGV2aWNlTGFiZWxJbmRleCsxKSAlIDM7CiAgICAgICAgc3dpdGNoKGRldmljZUxhYmVsSW5kZXgpIHsKICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gJ0hpZGUgZGV2aWNlIGxhYmVscyc7CiAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuICdTaG93IGZyaWVuZGx5IGRldmljZSBsYWJlbHMnOwogICAgICAgICAgICBjYXNlIDI6IHJldHVybiAnU2hvdyBkZXZpY2UgSUQgbGFiZWxzJzsKICAgICAgICB9CiAgICB9CgogICAgLy8gUmV0dXJucyB0aGUgbmV3bHkgY29tcHV0ZWQgYm91bmRpbmcgYm94IG9mIHRoZSByZWN0YW5nbGUKICAgIGZ1bmN0aW9uIGFkanVzdFJlY3RUb0ZpdFRleHQobikgewogICAgICAgIHZhciB0ZXh0ID0gbi5zZWxlY3QoJ3RleHQnKSwKICAgICAgICAgICAgYm94ID0gdGV4dC5ub2RlKCkuZ2V0QkJveCgpLAogICAgICAgICAgICBsYWIgPSBsYWJlbENvbmZpZzsKCiAgICAgICAgdGV4dC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKQogICAgICAgICAgICAuYXR0cigneScsICctMC44ZW0nKQogICAgICAgICAgICAuYXR0cigneCcsIGxhYi5pbWdQYWQvMik7CgogICAgICAgIC8vIHRyYW5zbGF0ZSB0aGUgYmJveCBzbyB0aGF0IGl0IGlzIGNlbnRlcmVkIG9uIFt4LHldCiAgICAgICAgYm94LnggPSAtYm94LndpZHRoIC8gMjsKICAgICAgICBib3gueSA9IC1ib3guaGVpZ2h0IC8gMjsKCiAgICAgICAgLy8gYWRkIHBhZGRpbmcKICAgICAgICBib3gueCAtPSAobGFiLnBhZExSICsgbGFiLmltZ1BhZC8yKTsKICAgICAgICBib3gud2lkdGggKz0gbGFiLnBhZExSICogMiArIGxhYi5pbWdQYWQ7CiAgICAgICAgYm94LnkgLT0gbGFiLnBhZFRCOwogICAgICAgIGJveC5oZWlnaHQgKz0gbGFiLnBhZFRCICogMjsKCiAgICAgICAgcmV0dXJuIGJveDsKICAgIH0KCiAgICBmdW5jdGlvbiBob3N0TGFiZWwoZCkgewogICAgICAgIHZhciBpZHggPSAoaG9zdExhYmVsSW5kZXggPCBkLmxhYmVscy5sZW5ndGgpID8gaG9zdExhYmVsSW5kZXggOiAwOwogICAgICAgIHJldHVybiBkLmxhYmVsc1tpZHhdOwogICAgfQogICAgZnVuY3Rpb24gZGV2aWNlTGFiZWwoZCkgewogICAgICAgIHZhciBpZHggPSAoZGV2aWNlTGFiZWxJbmRleCA8IGQubGFiZWxzLmxlbmd0aCkgPyBkZXZpY2VMYWJlbEluZGV4IDogMDsKICAgICAgICByZXR1cm4gZC5sYWJlbHNbaWR4XTsKICAgIH0KICAgIGZ1bmN0aW9uIHRyaW1MYWJlbChsYWJlbCkgewogICAgICAgIHJldHVybiAobGFiZWwgJiYgbGFiZWwudHJpbSgpKSB8fCAnJzsKICAgIH0KCiAgICBmdW5jdGlvbiBlbXB0eUJveCgpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB4OiAtMiwKICAgICAgICAgICAgeTogLTIsCiAgICAgICAgICAgIHdpZHRoOiA0LAogICAgICAgICAgICBoZWlnaHQ6IDQKICAgICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZURldmljZVJlbmRlcmluZyhkKSB7CiAgICAgICAgdmFyIGxhYmVsID0gdHJpbUxhYmVsKGRldmljZUxhYmVsKGQpKSwKICAgICAgICAgICAgbm9MYWJlbCA9ICFsYWJlbCwKICAgICAgICAgICAgbm9kZSA9IGQuZWwsCiAgICAgICAgICAgIGRpbSA9IGljZmcuZGV2aWNlLmRpbSwKICAgICAgICAgICAgYm94LCBkeCwgZHksCiAgICAgICAgICAgIGJkZyA9IGQuYmFkZ2U7CgogICAgICAgIG5vZGUuc2VsZWN0KCd0ZXh0JykKICAgICAgICAgICAgLnRleHQobGFiZWwpOwoKICAgICAgICBpZiAobm9MYWJlbCkgewogICAgICAgICAgICBib3ggPSBlbXB0eUJveCgpOwogICAgICAgICAgICBkeCA9IC1kaW0vMjsKICAgICAgICAgICAgZHkgPSAtZGltLzI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYm94ID0gYWRqdXN0UmVjdFRvRml0VGV4dChub2RlKTsKICAgICAgICAgICAgZHggPSBib3gueCArIGRldkNmZy54b2ZmOwogICAgICAgICAgICBkeSA9IGJveC55ICsgZGV2Q2ZnLnlvZmY7CiAgICAgICAgfQoKICAgICAgICBub2RlLnNlbGVjdCgncmVjdCcpCiAgICAgICAgICAgIC50cmFuc2l0aW9uKCkKICAgICAgICAgICAgLmF0dHIoYm94KTsKCiAgICAgICAgbm9kZS5zZWxlY3QoJ2cuZGV2aWNlSWNvbicpCiAgICAgICAgICAgIC50cmFuc2l0aW9uKCkKICAgICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIHN1cy50cmFuc2xhdGUoZHgsIGR5KSk7CgogICAgICAgIC8vIGhhbmRsZSBiYWRnZSwgaWYgZGVmaW5lZAogICAgICAgIGlmIChiZGcpIHsKICAgICAgICAgICAgcmVuZGVyQmFkZ2Uobm9kZSwgYmRnLCB7IGR4OiBkeCArIGRpbSwgZHk6IGR5IH0pOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiB1cGRhdGVIb3N0UmVuZGVyaW5nKGQpIHsKICAgICAgICB2YXIgbm9kZSA9IGQuZWwsCiAgICAgICAgICAgIGJkZyA9IGQuYmFkZ2U7CgogICAgICAgIHVwZGF0ZUhvc3RMYWJlbChkKTsKCiAgICAgICAgLy8gaGFuZGxlIGJhZGdlLCBpZiBkZWZpbmVkCiAgICAgICAgaWYgKGJkZykgewogICAgICAgICAgICByZW5kZXJCYWRnZShub2RlLCBiZGcsIGljZmcuaG9zdC5iYWRnZSk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHJlbmRlckJhZGdlKG5vZGUsIGJkZywgYm9mZikgewogICAgICAgIHZhciBic2VsLAogICAgICAgICAgICBiY3IgPSBiYWRnZUNvbmZpZy5yYWRpdXMsCiAgICAgICAgICAgIGJjZ2QgPSBiYWRnZUNvbmZpZy5nZGVsdGE7CgogICAgICAgIG5vZGUuc2VsZWN0KCdnLmJhZGdlJykucmVtb3ZlKCk7CgogICAgICAgIGJzZWwgPSBub2RlLmFwcGVuZCgnZycpCiAgICAgICAgICAgIC5jbGFzc2VkKCdiYWRnZScsIHRydWUpCiAgICAgICAgICAgIC5jbGFzc2VkKGJhZGdlU3RhdHVzKGJkZyksIHRydWUpCiAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBzdXMudHJhbnNsYXRlKGJvZmYuZHgsIGJvZmYuZHkpKTsKCiAgICAgICAgYnNlbC5hcHBlbmQoJ2NpcmNsZScpCiAgICAgICAgICAgIC5hdHRyKCdyJywgYmNyKTsKCiAgICAgICAgaWYgKGJkZy50eHQpIHsKICAgICAgICAgICAgYnNlbC5hcHBlbmQoJ3RleHQnKQogICAgICAgICAgICAgICAgLmF0dHIoJ2R5JywgYmFkZ2VDb25maWcueW9mZikKICAgICAgICAgICAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKQogICAgICAgICAgICAgICAgLnRleHQoYmRnLnR4dCk7CiAgICAgICAgfSBlbHNlIGlmIChiZGcuZ2lkKSB7CiAgICAgICAgICAgIGJzZWwuYXBwZW5kKCd1c2UnKQogICAgICAgICAgICAgICAgLmF0dHIoewogICAgICAgICAgICAgICAgICAgIHdpZHRoOiBiY2dkICogMiwKICAgICAgICAgICBz8e9WEXMJAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA04k1AAEAGyI/AqAc2wKgHYJbUH/VA3dUToa5h1oAQB6A1MQAAAQEICgC3yNsAYg/Rc/HvVj1zCQCKHAAAihwAAGj3KB/SxQgAJ60eEwgARQAcfIE9QABABg1YwKgHYMCoBzYf9ZbUoa5h1kDd1ROAEAJhrFUAAAEBCAoAYg/RALfI2CAgICAgICAgIGhlaWdodDogYmNnZCAqIDIsCiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBzdXMudHJhbnNsYXRlKC1iY2dkLCAtYmNnZCksCiAgICAgICAgICAgICAgICAgICAgJ3hsaW5rOmhyZWYnOiAnIycgKyBiZGcuZ2lkCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gdXBkYXRlSG9zdExhYmVsKGQpIHsKICAgICAgICB2YXIgbGFiZWwgPSB0cmltTGFiZWwoaG9zdExhYmVsKGQpKTsKICAgICAgICBkLmVsLnNlbGVjdCgndGV4dCcpLnRleHQobGFiZWwpOwogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZURldmljZUNvbG9ycyhkKSB7CiAgICAgICAgaWYgKGQpIHsKICAgICAgICAgICAgc2V0RGV2aWNlQ29sb3IoZCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYXBpLm5vZGUoKS5maWx0ZXIoJy5kZXZpY2UnKS5lYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICBzZXREZXZpY2VDb2xvcihkKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfQoKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gdXBkYXRlTm9kZXMgLSBzdWJmdW5jdGlvbnMKCiAgICBmdW5jdGlvbiBkZXZpY2VFeGlzdGluZyhkKSB7CiAgICAgICAgdmFyIG5vZGUgPSBkLmVsOwogICAgICAgIG5vZGUuY2xhc3NlZCgnb25saW5lJywgZC5vbmxpbmUpOwogICAgICAgIHVwZGF0ZURldmljZVJlbmRlcmluZyhkKTsKICAgICAgICBhcGkucG9zTm9kZShkLCB0cnVlKTsKICAgIH0KCiAgICBmdW5jdGlvbiBob3N0RXhpc3RpbmcoZCkgewogICAgICAgIHVwZGF0ZUhvc3RSZW5kZXJpbmcoZCk7CiAgICAgICAgYXBpLnBvc05vZGUoZCwgdHJ1ZSk7CiAgICB9CgogICAgZnVuY3Rpb24gZGV2aWNlRW50ZXIoZCkgewogICAgICAgIHZhciBub2RlID0gZDMuc2VsZWN0KHRoaXMpLAogICAgICAgICAgICBnbHlwaElkID0gZC50eXBlIHx8ICd1bmtub3duJywKICAgICAgICAgICAgbGFiZWwgPSB0cmltTGFiZWwoZGV2aWNlTGFiZWwoZCkpLAogICAgICAgICAgICAvL2RldkNmZyA9IGRldmljZUljb25Db25maWcsCiAgICAgICAgICAgIG5vTGFiZWwgPSAhbGFiZWwsCiAgICAgICAgICAgIGJveCwgZHgsIGR5LCBpY29uOwoKICAgICAgICBkLmVsID0gbm9kZTsKCiAgICAgICAgbm9kZS5hcHBlbmQoJ3JlY3QnKS5hdHRyKHsgcng6IDUsIHJ5OiA1IH0pOwogICAgICAgIG5vZGUuYXBwZW5kKCd0ZXh0JykudGV4dChsYWJlbCkuYXR0cignZHknLCAnMS4xZW0nKTsKICAgICAgICBib3ggPSBhZGp1c3RSZWN0VG9GaXRUZXh0KG5vZGUpOwogICAgICAgIG5vZGUuc2VsZWN0KCdyZWN0JykuYXR0cihib3gpOwoKICAgICAgICBpY29uID0gaXMuYWRkRGV2aWNlSWNvbihub2RlLCBnbHlwaElkKTsKCiAgICAgICAgaWYgKG5vTGFiZWwpIHsKICAgICAgICAgICAgZHggPSAtaWNvbi5kaW0vMjsKICAgICAgICAgICAgZHkgPSAtaWNvbi5kaW0vMjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBib3ggPSBhZGp1c3RSZWN0VG9GaXRUZXh0KG5vZGUpOwogICAgICAgICAgICBkeCA9IGJveC54ICsgZGV2Q2ZnLnhvZmY7CiAgICAgICAgICAgIGR5ID0gYm94LnkgKyBkZXZDZmcueW9mZjsKICAgICAgICB9CgogICAgICAgIGljb24uYXR0cigndHJhbnNmb3JtJywgc3VzLnRyYW5zbGF0ZShkeCwgZHkpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBob3N0RW50ZXIoZCkgewogICAgICAgIHZhciBub2RlID0gZDMuc2VsZWN0KHRoaXMpLAogICAgICAgICAgICBnaWQgPSBkLnR5cGUgfHwgJ3Vua25vd24nLAogICAgICAgICAgICByYWQgPSBpY2ZnLmhvc3QucmFkaXVzLAogICAgICAgICAgICByID0gZC50eXBlID8gcmFkLndpdGhHbHlwaCA6IHJhZC5ub0dseXBoLAogICAgICAgICAgICB0ZXh0RHkgPSByICsgMTA7CgogICAgICAgIGQuZWwgPSBub2RlOwogICAgICAgIHN1cy52aXNpYmxlKG5vZGUsIGFwaS5zaG93SG9zdHMoKSk7CgogICAgICAgIGlzLmFkZEhvc3RJY29uKG5vZGUsIHIsIGdpZCk7CgogICAgICAgIG5vZGUuYXBwZW5kKCd0ZXh0JykKICAgICAgICAgICAgLnRleHQoaG9zdExhYmVsKQogICAgICAgICAgICAuYXR0cignZHknLCB0ZXh0RHkpCiAgICAgICAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKTsKICAgIH0KCiAgICBmdW5jdGlvbiBob3N0RXhpdChkKSB7CiAgICAgICAgdmFyIG5vZGUgPSBkLmVsOwogICAgICAgIG5vZGUuc2VsZWN0KCd1c2UnKQogICAgICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAwLjUpCiAgICAgICAgICAgIC50cmFuc2l0aW9uKCkKICAgICAgICAgICAgLmR1cmF0aW9uKDgwMCkKICAgICAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMCk7CgogICAgICAgIG5vZGUuc2VsZWN0KCd0ZXh0JykKICAgICAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMC41KQogICAgICAgICAgICAudHJhbnNpdGlvbigpCiAgICAgICAgICAgIC5kdXJhdGlvbig4MDApCiAgICAgICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDApOwoKICAgICAgICBub2RlLnNlbGVjdCgnY2lyY2xlJykKICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UtZmlsbCcsICcjNTU1JykKICAgICAgICAgICAgLnN0eWxlKCdmaWxsJywgJyM4ODgnKQogICAgICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAwLjUpCiAgICAgICAgICAgIC50cmFuc2l0aW9uKCkKICAgICAgICAgICAgLmR1cmF0aW9uKDE1MDApCiAgICAgICAgICAgIC5hdHRyKCdyJywgMCk7CiAgICB9CgogICAgZnVuY3Rpb24gZGV2aWNlRXhpdChkKSB7CiAgICAgICAgdmFyIG5vZGUgPSBkLmVsOwogICAgICAgIG5vZGUuc2VsZWN0KCd1c2UnKQogICAgICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAwLjUpCiAgICAgICAgICAgIC50cmFuc2l0aW9uKCkKICAgICAgICAgICAgLmR1cmF0aW9uKDgwMCkKICAgICAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMCk7CgogICAgICAgIG5vZGUuc2VsZWN0QWxsKCdyZWN0JykKICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UtZmlsbCcsICcjNTU1JykKICAgICAgICAgICAgLnN0eWxlKCdmaWxsJywgJyM4ODgnKQogICAgICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAwLjUpOwogICAgfQoKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gdXBkYXRlTGlua3MgLSBzdWJmdW5jdGlvbnMKCiAgICBmdW5jdGlvbiBsaW5rRW50ZXJpbmcoZCkgewogICAgICAgIHZhciBsaW5rID0gZDMuc2VsZWN0KHRoaXMpOwogICAgICAgIGQuZWwgPSBsaW5rOwogICAgICAgIGFwaS5yZXN0eWxlTGlua0VsZW1lbnQoZCk7CiAgICAgICAgaWYgKGQudHlwZSgpID09PSAnaG9zdExpbmsnKSB7CiAgICAgICAgICAgIHN1cy52aXNpYmxlKGxpbmssIGFwaS5zaG93SG9zdHMoKSk7CiAgICAgICAgfQogICAgfQoKICAgIHZhciBsaW5rTGFiZWxPZmZzZXQgPSAnMC4zZW0nOwoKICAgIGZ1bmN0aW9uIGFwcGx5TGlua0xhYmVscygpIHsKICAgICAgICB2YXIgZW50ZXJpbmc7CgogICAgICAgIGFwaS51cGRhdGVMaW5rTGFiZWxNb2RlbCgpOwoKICAgICAgICAvLyBmb3IgZWxlbWVudHMgYWxyZWFkeSBleGlzdGluZywgd2UgbmVlZCB0byB1cGRhdGUgdGhlIHRleHQKICAgICAgICAvLyBhbmQgYWRqdXN0IHRoZSByZWN0YW5nbGUgc2l6ZSB0byBmaXQKICAgICAgICBhcGkubGlua0xhYmVsKCkuZWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgICAgICB2YXIgZWwgPSBkMy5zZWxlY3QodGhpcyksCiAgICAgICAgICAgICAgICByZWN0ID0gZWwuc2VsZWN0KCdyZWN0JyksCiAgICAgICAgICAgICAgICB0ZXh0ID0gZWwuc2VsZWN0KCd0ZXh0Jyk7CiAgICAgICAgICAgIHRleHQudGV4dChkLmxhYmVsKTsKICAgICAgICAgICAgcmVjdC5hdHRyKHJlY3RBcm91bmRUZXh0KGVsKSk7CiAgICAgICAgfSk7CgogICAgICAgIGVudGVyaW5nID0gYXBpLmxpbmtMYWJlbCgpLmVudGVyKCkuYXBwZW5kKCdnJykKICAgICAgICAgICAgLmNsYXNzZWQoJ2xpbmtMYWJlbCcsIHRydWUpCiAgICAgICAgICAgIC5hdHRyKCdpZCcsIGZ1bmN0aW9uIChkKSB7IHJldHVybiBkLmlkOyB9KTsKCiAgICAgICAgZW50ZXJpbmcuZWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgICAgICB2YXIgZWwgPSBkMy5zZWxlY3QodGhpcyksCiAgICAgICAgICAgICAgICByZWN0LAogICAgICAgICAgICAgICAgdGV4dDsKCiAgICAgICAgICAgIGlmIChkLmxkYXRhLnR5cGUoKSA9PT0gJ2hvc3RMaW5rJykgewogICAgICAgICAgICAgICAgZWwuY2xhc3NlZCgnaG9zdExpbmtMYWJlbCcsIHRydWUpOwogICAgICAgICAgICAgICAgc3VzLnZpc2libGUoZWwsIGFwaS5zaG93SG9zdHMoKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGQuZWwgPSBlbDsKICAgICAgICAgICAgcmVjdCA9IGVsLmFwcGVuZCgncmVjdCcpOwogICAgICAgICAgICB0ZXh0ID0gZWwuYXBwZW5kKCd0ZXh0JykudGV4dChkLmxhYmVsKTsKICAgICAgICAgICAgcmVjdC5hdHRyKHJlY3RBcm91bmRUZXh0KGVsKSk7CiAgICAgICAgICAgIHRleHQuYXR0cignZHknLCBsaW5rTGFiZWxPZmZzZXQpOwoKICAgICAgICAgICAgZWwuYXR0cigndHJhbnNmb3JtJywgdHJhbnNmb3JtTGFiZWwoZC5sZGF0YS5wb3NpdGlvbikpOwogICAgICAgIH0pOwoKICAgICAgICAvLyBSZW1vdmUgYW55IGxhYmVscyB0aGF0IGFyZSBubyBsb25nZXIgcmVxdWlyZWQuCiAgICAgICAgYXBpLmxpbmtMYWJlbCgpLmV4aXQoKS5yZW1vdmUoKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZWN0QXJvdW5kVGV4dChlbCkgewogICAgICAgIHZhciB0ZXh0ID0gZWwuc2VsZWN0KCd0ZXh0JyksCiAgICAgICAgICAgIGJveCA9IHRleHQubm9kZSgpLmdldEJCb3goKTsKCiAgICAgICAgLy8gdHJhbnNsYXRlIHRoZSBiYm94IHNvIHRoYXQgaXQgaXMgY2VudGVyZWQgb24gW3gseV0KICAgICAgICBib3gueCA9IC1ib3gud2lkdGggLyAyOwogICAgICAgIGJveC55ID0gLWJveC5oZWlnaHQgLyAyOwoKICAgICAgICAvLyBhZGQgcGFkZGluZwogICAgICAgIGJveC54IC09IDE7CiAgICAgICAgYm94LndpZHRoICs9IDI7CiAgICAgICAgcmV0dXJuIGJveDsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2Zvcm1MYWJlbChwKSB7CiAgICAgICAgdmFyIGR4ID0gcC54MiAtIHAueDEsCiAgICAgICAgICAgIGR5ID0gcC55MiAtIHAueTEsCiAgICAgICAgICAgIHhNaWQgPSBkeC8yICsgcC54MSwKICAgICAgICAgICAgeU1pZCA9IGR5LzIgKyBwLnkxOwogICAgICAgIHJldHVybiBzdXMudHJhbnNsYXRlKHhNaWQsIHlNaWQpOwogICAgfQoKICAgIGZ1bmN0aW9uIGFwcGx5UG9ydExhYmVscyhkYXRhLCBwb3J0TGFiZWxHKSB7CiAgICAgICAgdmFyIGVudGVyaW5nID0gcG9ydExhYmVsRy5zZWxlY3RBbGwoJy5wb3J0TGFiZWwnKQogICAgICAgICAgICAuZGF0YShkYXRhKS5lbnRlcigpLmFwcGVuZCgnZycpCiAgICAgICAgICAgIC5jbGFzc2VkKCdwb3J0TGFiZWwnLCB0cnVlKQogICAgICAgICAgICAuYXR0cignaWQnLCBmdW5jdGlvbiAoZCkgeyByZXR1cm4gZC5pZDsgfSk7CgogICAgICAgIGVudGVyaW5nLmVhY2goZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgdmFyIGVsID0gZDMuc2VsZWN0KHRoaXMpLAogICAgICAgICAgICAgICAgcmVjdCA9IGVsLmFwcGVuZCgncmVjdCcpLAogICAgICAgICAgICAgICAgdGV4dCA9IGVsLmFwcGVuZCgndGV4dCcpLnRleHQoZC5udW0pOwoKICAgICAgICAgICAgcmVjdC5hdHRyKHJlY3RBcm91bmRUZXh0KGVsKSk7CiAgICAgICAgICAgIHRleHQuYXR0cignZHknLCBsaW5rTGFiZWxPZmZzZXQpOwogICAgICAgICAgICBlbC5hdHRyKCd0cmFuc2Zvcm0nLCBzdXMudHJhbnNsYXRlKGQueCwgZC55KSk7CiAgICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gbGFiZWxQb2ludChsaW5rUG9zKSB7CiAgICAgICAgdmFyIGxlbmd0aFVwTGluZSA9IDEgLyAzLAogICAgICAgICAgICBkeCA9IGxpbmtQb3MueDIgLSBsaW5rUG9zLngxLAogICAgICAgICAgICBkeSA9IGxpbmtQb3MueTIgLSBsaW5rUG9zLnkxLAogICAgICAgICAgICBtb3ZlZFggPSBkeCAqIGxlbmd0aFVwTGluZSwKICAgICAgICAgICAgbW92ZWRZID0gZHkgKiBsZW5ndGhVcExpbmU7CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHg6IG1vdmVkWCwKICAgICAgICAgICAgeTogbW92ZWRZCiAgICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBjYWxjR3JvdXBQb3MobGlua1BvcykgewogICAgICAgIHZhciBtb3ZlZCA9IGxhYmVsUG9pbnQobGlua1Bvcyk7CiAgICAgICAgcmV0dXJuIHN1cy50cmFuc2xhdGUobGlua1Bvcy54MSArIG1vdmVkLngsIGxpbmtQb3MueTEgKyBtb3ZlZC55KTsKICAgIH0KCiAgICAvLyBjYWxjdWxhdGVzIHdoZXJlIG9uIHRoZSBsaW5rIHRoYXQgdGhlIGhhc2ggbGluZSBmb3IgNSsgbGFiZWwgYXBwZWFycwogICAgZnVuY3Rpb24gaGFzaEF0dHJzKGxpbmtQb3MpIHsKICAgICAgICB2YXIgaGFzaExlbmd0aCA9IDI1LAogICAgICAgICAgICBoYWxmTGVuZ3RoID0gaGFzaExlbmd0aCAvIDIsCiAgICAgICAgICAgIGR4ID0gbGlua1Bvcy54MiAtIGxpbmtQb3MueDEsCiAgICAgICAgICAgIGR5ID0gbGlua1Bvcy55MiAtIGxpbmtQb3MueTEsCiAgICAgICAgICAgIGxlbmd0aCA9IE1hdGguc3FydCgoZHggKiBkeCkgKyAoZHkgKiBkeSkpLAogICAgICAgICAgICBtb3ZlQW10WCA9IChkeCAvIGxlbmd0aCkgKiBoYWxmTGVuZ3RoLAogICAgICAgICAgICBtb3ZlQW10WSA9IChkeSAvIGxlbmd0aCkgKiBoYWxmTGVuZ3RoLAogICAgICAgICAgICBtaWQgPSBsYWJlbFBvaW50KGxpbmtQb3MpLAogICAgICAgICAgICBhbmdsZSA9IE1hdGguYXRhbihkeSAvIGR4KSArIDQ1OwoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB4MTogbWlkLnggLSBtb3ZlQW10WCwKICAgICAgICAgICAgeTE6IG1pZC55IC0gbW92ZUFtdFksCiAgICAgICAgICAgIHgyOiBtaWQueCArIG1vdmVBbXRYLAogICAgICAgICAgICB5MjogbWlkLnkgKyBtb3ZlQW10WSwKICAgICAgICAgICAgc3Ryb2tlOiBhcGkubGlua0NvbmZpZygpW3RzLnRoZW1lKCldLmJhc2VDb2xvciwKICAgICAgICAgICAgdHJhbnNmb3JtOiAncm90YXRlKCcgKyBhbmdsZSArICcsJyArIG1pZC54ICsgJywnICsgbWlkLnkgKyAnKScKICAgICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHRleHRMYWJlbFBvcyhsaW5rUG9zKSB7CiAgICAgICAgdmFyIHBvaW50ID0gbGFiZWxQb2ludChsaW5rUG9zKSwKICAgICAgICAgICAgZGlzdCA9IDIwOwogICAgICBz8e9WdHMJAAIMAAACDAAAaPcoH9LFCAAnrR4TCABFAAv0gUJAAEAGHdvAqAdgwKgHNh/1ltShrn4eQN3VE4AYAmGbzQAAAQEICgBiD9EAt8jbICByZXR1cm4gewogICAgICAgICAgICB4OiBwb2ludC54ICsgZGlzdCwKICAgICAgICAgICAgeTogcG9pbnQueSArIGRpc3QKICAgICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGFwcGx5TnVtTGlua0xhYmVscyhkYXRhLCBsYmxzRykgewogICAgICAgIHZhciBsYWJlbHMgPSBsYmxzRy5zZWxlY3RBbGwoJ2cubnVtTGlua0xhYmVsJykKICAgICAgICAgICAgICAgIC5kYXRhKGRhdGEsIGZ1bmN0aW9uIChkKSB7IHJldHVybiAncGFpci0nICsgZC5pZDsgfSksCiAgICAgICAgICAgIGVudGVyaW5nOwoKICAgICAgICAvLyB1cGRhdGUgZXhpc3RpbmcgbGFiZWxzCiAgICAgICAgbGFiZWxzLmVhY2goZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgdmFyIGVsID0gZDMuc2VsZWN0KHRoaXMpOwoKICAgICAgICAgICAgZWwuYXR0cih7CiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IGZ1bmN0aW9uIChkKSB7IHJldHVybiBjYWxjR3JvdXBQb3MoZC5saW5rQ29vcmRzKTsgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZWwuc2VsZWN0KCdsaW5lJykKICAgICAgICAgICAgICAgIC5hdHRyKGhhc2hBdHRycyhkLmxpbmtDb29yZHMpKTsKICAgICAgICAgICAgZWwuc2VsZWN0KCd0ZXh0JykKICAgICAgICAgICAgICAgIC5hdHRyKHRleHRMYWJlbFBvcyhkLmxpbmtDb29yZHMpKQogICAgICAgICAgICAgICAgLnRleHQoZC5udW0pOwogICAgICAgIH0pOwoKICAgICAgICAvLyBhZGQgbmV3IGxhYmVscwogICAgICAgIGVudGVyaW5nID0gbGFiZWxzCiAgICAgICAgICAgIC5lbnRlcigpCiAgICAgICAgICAgIC5hcHBlbmQoJ2cnKQogICAgICAgICAgICAuYXR0cih7CiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IGZ1bmN0aW9uIChkKSB7IHJldHVybiBjYWxjR3JvdXBQb3MoZC5saW5rQ29vcmRzKTsgfSwKICAgICAgICAgICAgICAgIGlkOiBmdW5jdGlvbiAoZCkgeyByZXR1cm4gJ3BhaXItJyArIGQuaWQ7IH0KICAgICAgICAgICAgfSkKICAgICAgICAgICAgLmNsYXNzZWQoJ251bUxpbmtMYWJlbCcsIHRydWUpOwoKICAgICAgICBlbnRlcmluZy5lYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIHZhciBlbCA9IGQzLnNlbGVjdCh0aGlzKTsKCiAgICAgICAgICAgIGVsLmFwcGVuZCgnbGluZScpCiAgICAgICAgICAgICAgICAuY2xhc3NlZCgnbnVtTGlua0hhc2gnLCB0cnVlKQogICAgICAgICAgICAgICAgLmF0dHIoaGFzaEF0dHJzKGQubGlua0Nvb3JkcykpOwogICAgICAgICAgICBlbC5hcHBlbmQoJ3RleHQnKQogICAgICAgICAgICAgICAgLmNsYXNzZWQoJ251bUxpbmtUZXh0JywgdHJ1ZSkKICAgICAgICAgICAgICAgIC5hdHRyKHRleHRMYWJlbFBvcyhkLmxpbmtDb29yZHMpKQogICAgICAgICAgICAgICAgLnRleHQoZC5udW0pOwogICAgICAgIH0pOwoKICAgICAgICAvLyByZW1vdmUgb2xkIGxhYmVscwogICAgICAgIGxhYmVscy5leGl0KCkucmVtb3ZlKCk7CiAgICB9CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIE1vZHVsZSBkZWZpbml0aW9uCgogICAgYW5ndWxhci5tb2R1bGUoJ292VG9wbycpCiAgICAuZmFjdG9yeSgnVG9wb0QzU2VydmljZScsCiAgICAgICAgWyckbG9nJywgJ0ZuU2VydmljZScsICdTdmdVdGlsU2VydmljZScsICdJY29uU2VydmljZScsICdUaGVtZVNlcnZpY2UnLAoKICAgICAgICBmdW5jdGlvbiAoXyRsb2dfLCBfZnNfLCBfc3VzXywgX2lzXywgX3RzXykgewogICAgICAgICAgICAkbG9nID0gXyRsb2dfOwogICAgICAgICAgICBmcyA9IF9mc187CiAgICAgICAgICAgIHN1cyA9IF9zdXNfOwogICAgICAgICAgICBpcyA9IF9pc187CiAgICAgICAgICAgIHRzID0gX3RzXzsKCiAgICAgICAgICAgIGljZmcgPSBpcy5pY29uQ29uZmlnKCk7CgogICAgICAgICAgICBmdW5jdGlvbiBpbml0RDMoX2FwaV8pIHsKICAgICAgICAgICAgICAgIGFwaSA9IF9hcGlfOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiBkZXN0cm95RDMoKSB7IH0KCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBpbml0RDM6IGluaXREMywKICAgICAgICAgICAgICAgIGRlc3Ryb3lEMzogZGVzdHJveUQzLAoKICAgICAgICAgICAgICAgIGluY0RldkxhYkluZGV4OiBpbmNEZXZMYWJJbmRleCwKICAgICAgICAgICAgICAgIGFkanVzdFJlY3RUb0ZpdFRleHQ6IGFkanVzdFJlY3RUb0ZpdFRleHQsCiAgICAgICAgICAgICAgICBob3N0TGFiZWw6IGhvc3RMYWJlbCwKICAgICAgICAgICAgICAgIGRldmljZUxhYmVsOiBkZXZpY2VMYWJlbCwKICAgICAgICAgICAgICAgIHRyaW1MYWJlbDogdHJpbUxhYmVsLAoKICAgICAgICAgICAgICAgIHVwZGF0ZURldmljZUxhYmVsOiB1cGRhdGVEZXZpY2VSZW5kZXJpbmcsCiAgICAgICAgICAgICAgICB1cGRhdGVIb3N0TGFiZWw6IHVwZGF0ZUhvc3RMYWJlbCwKICAgICAgICAgICAgICAgIHVwZGF0ZURldmljZUNvbG9yczogdXBkYXRlRGV2aWNlQ29sb3JzLAoKICAgICAgICAgICAgICAgIGRldmljZUV4aXN0aW5nOiBkZXZpY2VFeGlzdGluZywKICAgICAgICAgICAgICAgIGhvc3RFeGlzdGluZzogaG9zdEV4aXN0aW5nLAogICAgICAgICAgICAgICAgZGV2aWNlRW50ZXI6IGRldmljZUVudGVyLAogICAgICAgICAgICAgICAgaG9zdEVudGVyOiBob3N0RW50ZXIsCiAgICAgICAgICAgICAgICBob3N0RXhpdDogaG9zdEV4aXQsCiAgICAgICAgICAgICAgICBkZXZpY2VFeGl0OiBkZXZpY2VFeGl0LAoKICAgICAgICAgICAgICAgIGxpbmtFbnRlcmluZzogbGlua0VudGVyaW5nLAogICAgICAgICAgICAgICAgYXBwbHlMaW5rTGFiZWxzOiBhcHBseUxpbmtMYWJlbHMsCiAgICAgICAgICAgICAgICB0cmFuc2Zvcm1MYWJlbDogdHJhbnNmb3JtTGFiZWwsCiAgICAgICAgICAgICAgICBhcHBseVBvcnRMYWJlbHM6IGFwcGx5UG9ydExhYmVscywKICAgICAgICAgICAgICAgIGFwcGx5TnVtTGlua0xhYmVsczogYXBwbHlOdW1MaW5rTGFiZWxzCiAgICAgICAgICAgIH07CiAgICAgICAgfV0pOwp9KCkpOwpz8e9Wr3sJAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA04k5AAEAGyI7AqAc2wKgHYJbUH/VA3dUToa6J3oAQB6ANKQAAAQEICgC3yNsAYg/Rc/HvVip+CQCQAgAAkAIAAAgAJ60eE2j3KB/SxQgARQACguJPQABABsY/wKgHNsCoB2CW1B/1QN3VE6Guid6AGAegmxEAAAEBCAoAt8jbAGIP0UdFVCAvb25vcy91aS9hcHAvdmlldy90b3BvL3RvcG9Nb2RlbC5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVjKyCQCKHAAAihwAAGj3KB/SxQgAJ60eEwgARQAcfMybQABABsH5wKgHYMCoBzYf9ZbRWpWO+IyXrdaAEAKNrFUAAAEBCAoAYg/TALfI20hUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2phdmFzY3JpcHQNCkNvbnRlbnQtTGVuZ3RoOiA5MzE5DQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCi8qCiAqIENvcHlyaWdodCAyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIFRvcG9sb2d5IExpbmsgTW9kdWxlLgogRnVuY3Rpb25zIGZvciBoaWdobGlnaHRpbmcvc2VsZWN0aW5nIGxpbmtzCiAqLwoKKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBpbmplY3RlZCByZWZzCiAgICB2YXIgJGxvZywgZnMsIHN1cywgdHMsIGZsYXNoLCB0c3MsIHRwczsKCiAgICAvLyBpbnRlcm5hbCBzdGF0ZQogICAgdmFyIGFwaSwKICAgICAgICB0ZDMsCiAgICAgICAgbmV0d29yaywKICAgICAgICBzaG93UG9ydHMgPSB0cnVlLCAgICAgICAvLyBlbmFibGUgcG9ydCBoaWdobGlnaHRpbmcgYnkgZGVmYXVsdAogICAgICAgIGVuaGFuY2VkTGluayA9IG51bGwsICAgIC8vIHRoZSBsaW5rIG92ZXIgd2hpY2ggdGhlIG1vdXNlIGlzIGhvdmVyaW5nCiAgICAgICAgc2VsZWN0ZWRMaW5rID0gbnVsbDsgICAgLy8gdGhlIGxpbmsgd2hpY2ggaXMgY3VycmVudGx5IHNlbGVjdGVkCgogICAgLy8gU1ZHIGVsZW1lbnRzOwogICAgdmFyIHN2ZzsKCgogICAgLy8gPT09PT09PT0gQUxHT1JJVEhNIFRPIEZJTkQgTElOSyBDTE9TRVNUIFRPIE1PVVNFID09PT09PT09CgogICAgZnVuY3Rpb24gZ2V0TG9naWNhbE1vdXNlUG9zaXRpb24oY29udGFpbmVyKSB7CiAgICAgICAgdmFyIG0gPSBkMy5tb3VzZShjb250YWluZXIpLAogICAgICAgICAgICBzYyA9IGFwaS56b29tZXIuc2NhbGUoKSwKICAgICAgICAgICAgdHIgPSBhcGkuem9vbWVyLnRyYW5zbGF0ZSgpLAogICAgICAgICAgICBteCA9IChtWzBdIC0gdHJbMF0pIC8gc2MsCiAgICAgICAgICAgIG15ID0gKG1bMV0gLSB0clsxXSkgLyBzYzsKICAgICAgICByZXR1cm4ge3g6IG14LCB5OiBteX07CiAgICB9CgoKICAgIGZ1bmN0aW9uIHNxKHgpIHsgcmV0dXJuIHggKiB4OyB9CgogICAgZnVuY3Rpb24gbWRpc3QocCwgbSkgewogICAgICAgIHJldHVybiBNYXRoLnNxcnQoc3EocC54IC0gbS54KSArIHNxKHAueSAtIG0ueSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIHByb3goZGlzdCkgewogICAgICAgIHJldHVybiBkaXN0IC8gYXBpLnpvb21lci5zY2FsZSgpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbXB1dGVOZWFyZXN0Tm9kZShtb3VzZSkgewogICAgICAgIHZhciBwcm94aW1pdHkgPSBwcm94KDMwKSwKICAgICAgICAgICAgbmVhcmVzdCA9IG51bGwsCiAgICAgICAgICAgIG1pbkRpc3Q7CgogICAgICAgIGlmIChuZXR3b3JrLm5vZGVzLmxlbmd0aCkgewogICAgICAgICAgICBtaW5EaXN0ID0gcHJveGltaXR5ICogMjsKCiAgICAgICAgICAgIG5ldHdvcmsubm9kZXMuZm9yRWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgdmFyIGRpc3Q7CgogICAgICAgICAgICAgICAgaWYgKCFhcGkuc2hvd0hvc3RzKCkgJiYgZC5jbGFzcyA9PT0gJ2hvc3QnKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBza2lwIGhpZGRlbiBob3N0cwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGRpc3QgPSBtZGlzdCh7eDogZC54LCB5OiBkLnl9LCBtb3VzZSk7CiAgICAgICAgICAgICAgICBpZiAoZGlzdCA8IG1pbkRpc3QgJiYgZGlzdCA8IHByb3hpbWl0eSkgewogICAgICAgICAgICAgICAgICAgIG1pbkRpc3QgPSBkaXN0OwogICAgICAgICAgICAgICAgICAgIG5lYXJlc3QgPSBkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5lYXJlc3Q7CiAgICB9CgoKICAgIGZ1bmN0aW9uIGNvbXB1dGVOZWFyZXN0TGluayhtb3VzZSkgewogICAgICAgIHZhciBwcm94aW1pdHkgPSBwcm94KDMwKSwKICAgICAgICAgICAgbmVhcmVzdCA9IG51bGwsCiAgICAgICAgICAgIG1pbkRpc3Q7CgogICAgICAgIGZ1bmN0aW9uIHBkcm9wKGxpbmUsIG1vdXNlKSB7CiAgICAgICAgICAgIHZhciB4MSA9IGxpbmUueDEsCiAgICAgICAgICAgICAgICB5MSA9IGxpbmUueTEsCiAgICAgICAgICAgICAgICB4MiA9IGxpbmUueDIsCiAgICAgICAgICAgICAgICB5MiA9IGxpbmUueTIsCiAgICAgICAgICAgICAgICB4MyA9IG1vdXNlLngsCiAgICAgICAgICAgICAgICB5MyA9IG1vdXNlLnksCiAgICAgICAgICAgICAgICBrID0gKCh5Mi15MSkgKiAoeDMteDEpIC0gKHgyLXgxKSAqICh5My15MSkpIC8KICAgICAgICAgICAgICAgICAgICAoc3EoeTIteTEpICsgc3EoeDIteDEpKSwKICAgICAgICAgICAgICAgIHg0ID0geDMgLSBrICogKHkyLXkxKSwKICAgICAgICAgICAgICAgIHk0ID0geTMgKyBrICogKHgyLXgxKTsKICAgICAgICAgICAgcmV0dXJuIHt4Ong0LCB5Onk0fTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGxpbmVIaXQobGluZSwgcCwgbSkgewogICAgICAgICAgICBpZiAocC54IDwgbGluZS54MSAmJiBwLnggPCBsaW5lLngyKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIGlmIChwLnggPiBsaW5lLngxICYmIHAueCA+IGxpbmUueDIpIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgaWYgKHAueSA8IGxpbmUueTEgJiYgcC55IDwgbGluZS55MikgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICBpZiAocC55ID4gbGluZS55MSAmJiBwLnkgPiBsaW5lLnkyKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIC8vIGxpbmUgaW50ZXJzZWN0cywgYnV0IGFyZSB3ZSBjbG9zZSBlbm91Z2g/CiAgICAgICAgICAgIHJldHVybiBtZGlzdChwLCBtKSA8PSBwcm94aW1pdHk7CiAgICAgICAgfQoKICAgICAgICBpZiAobmV0d29yay5saW5rcy5sZW5ndGgpIHsKICAgICAgICAgICAgbWluRGlzdCA9IHByb3hpbWl0eSAqIDI7CgogICAgICAgICAgICBuZXR3b3JrLmxpbmtzLmZvckVhY2goZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgIGlmICghYXBpLnNob3dIb3N0cygpICYmIGQudHlwZSgpID09PSAnaG9zdExpbmsnKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBza2lwIGhpZGRlbiBob3N0IGxpbmtzCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBkLnBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgIHBvaW50ID0gcGRyb3AobGluZSwgbW91c2UpLAogICAgICAgICAgICAgICAgICAgIGhpdCA9IGxpbmVIaXQobGluZSwgcG9pbnQsIG1vdXNlKSwKICAgICAgICAgICAgICAgICAgICBkaXN0OwoKICAgICAgICAgICAgICAgIGlmIChoaXQpIHsKICAgICAgICAgICAgICAgICAgICBkaXN0ID0gbWRpc3QocG9pbnQsIG1vdXNlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZGlzdCA8IG1pbkRpc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWluRGlzdCA9IGRpc3Q7CiAgICAgICAgICAgICAgICAgICAgICAgIG5lYXJlc3QgPSBkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZWFyZXN0OwogICAgfQoKICAgIGZ1bmN0aW9uIGVuaGFuY2VMaW5rKGxkYXRhKSB7CiAgICAgICAgLy8gaWYgdGhlIG5ldyBsaW5rIGlzIHNhbWUgYXMgb2xkIGxpbmssIGRvIG5vdGhpbmcKICAgICAgICBpZiAoZW5oYW5jZWRMaW5rICYmIGxkYXRhICYmIGVuaGFuY2VkTGluay5rZXkgPT09IGxkYXRhLmtleSkgcmV0dXJuOwoKICAgICAgICAvLyBmaXJzdCwgdW5lbmhhbmNlIHRoZSBjdXJyZW50bHkgZW5oYW5jZWQgbGluawogICAgICAgIGlmIChlbmhhbmNlZExpbmspIHsKICAgICAgICAgICAgdW5lbmhhbmNlKGVuaGFuY2VkTGluayk7CiAgICAgICAgfQogICAgICAgIGVuaGFuY2VkTGluayA9IGxkYXRhOwogICAgICAgIGlmIChlbmhhbmNlZExpbmspIHsKICAgICAgICAgICAgZW5oYW5jZShlbmhhbmNlZExpbmspOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiB1bmVuaGFuY2UoZCkgewogICAgICAgIC8vIGd1YXJkIGFnYWluc3QgbGluayBlbGVtZW50IG5vdCBzZXQKICAgICAgICBpZiAoZC5lbCkgewogICAgICAgICAgICBkLmVsLmNsYXNzZWQoJ2VuaGFuY2VkJywgZmFsc2UpOwogICAgICAgIH0KICAgICAgICBhcGkucG9ydExhYmVsRygpLnNlbGVjdEFsbCgnLnBvcnRMYWJlbCcpLnJlbW92ZSgpOwogICAgfQoKICAgIGZ1bmN0aW9uIGVuaGFuY2UoZCkgewogICAgICAgIHZhciBkYXRhID0gW10sCiAgICAgICAgICAgIHBvaW50OwoKICAgICAgICAvLyBndWFyZCBhZ2FpbnN0IGxpbmsgZWxlbWVudCBub3Qgc2V0CiAgICAgICAgaWYgKCFkLmVsKSByZXR1cm47CgogICAgICAgIGQuZWwuY2xhc3NlZCgnZW5oYW5jZWQnLCB0cnVlKTsKCiAgICAgICAgLy8gRGVmaW5lIHBvcnQgbGFiZWwgZGF0YSBvYmplY3RzLgogICAgICAgIC8vIE5PVEU6IHNyYyBwb3J0IGlzIGFic2VudCBpbiB0aGUgY2FzZSBvZiBob3N0LWxpbmtzLgoKICAgICAgICBwb2ludCA9IGxvY2F0ZVBvcnRMYWJlbChkKTsKICAgICAgICBhbmd1bGFyLmV4dGVuZChwb2ludCwgewogICAgICAgICAgICBpZDogJ3RvcG8tcG9ydC10Z3QnLAogICAgICAgICAgICBudW06IGQudGd0UG9ydAogICAgICAgIH0pOwogICAgICAgIGRhdGEucHVzaChwb2ludCk7CgogICAgICAgIGlmIChkLnNyY1BvcnQpIHsKICAgICAgICAgICAgcG9pbnQgPSBsb2NhdGVQb3J0TGFiZWwoZCwgMSk7CiAgICAgICAgICAgIGFuZ3VsYXIuZXh0ZW5kKHBvaW50LCB7CiAgICAgICAgICAgICAgICBpZDogJ3RvcG8tcG9ydC1zcmMnLAogICAgICAgICAgICAgICAgbnVtOiBkLnNyY1BvcnQKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRhdGEucHVzaChwb2ludCk7CiAgICAgICAgfQoKICAgICAgICB0ZDMuYXBwbHlQb3J0TGFiZWxzKGRhdGEsIGFwaS5wb3J0TGFiZWxHKCkpOwogICAgfQoKICAgIGZ1bmN0aW9uIGxvY2F0ZVBvcnRMYWJlbChsaW5rLCBzcmMpIHsKICAgICAgICB2YXIgb2Zmc2V0ID0gMzIsCiAgICAgICAgICAgIHBvcyA9IGxpbmsucG9zaXRpb24sCiAgICAgICAgICAgIG5lYXJYID0gc3JjID8gcG9zLngxIDogcG9zLngyLAogICAgICAgICAgICBuZWFyWSA9IHNyYyA/IHBvcy55MSA6IHBvcy55MiwKICAgICAgICAgICAgZmFyWCA9IHNyYyA/IHBvcy54MiA6IHBvcy54MSwKICAgICAgICAgICAgZmFyWSA9IHNyYyA/IHBvcy55MiA6IHBvcy55MTsKCiAgICAgICAgZnVuY3Rpb24gZGlzdCh4LCB5KSB7IHJldHVybiBNYXRoLnNxcnQoeCp4ICsgeSp5KTsgfQoKICAgICAgICB2YXIgZHggPSBmYXJYIC0gbmVhclgsCiAgICAgICAgICAgIGR5ID0gZmFyWSAtIG5lYXJZLAogICAgICAgICAgICBrID0gb2Zmc2V0IC8gZGlzdChkeCwgZHkpOwoKICAgICAgICByZXR1cm4ge3g6IGsgKiBkeCArIG5lYXJYLCB5OiBrICogZHkgKyBuZWFyWX07CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0TGluayhsZGF0YSkgewogICAgICAgIC8vIGlmIHRoZSBuZXcgbGluayBpcyBzYW1lIGFzIG9sZCBsaW5rLCBkbyBub3RoaW5nCiAgICAgICAgaWYgKHNlbGVjdGVkTGluayAmJiBsZGF0YSAmJiBzZWxlY3RlZExpbmsua2V5ID09PSBsZGF0YS5rZXkpIHJldHVybjsKCiAgICAgICAgLy8gbWFrZSBzdXJlIG5vIG5vZGVzIGFyZSBzZWxlY3RlZAogICAgICAgIHRzcy5kZXNlbGVjdEFsbCgpOwoKICAgICAgICAvLyBmaXJzdCwgdW5lbmhhbmNlIHRoZSBjdXJyZW50bHkgZW5oYW5jZWQgbGluawogICAgICAgIGlmIChzZWxlY3RlZExpbmspIHsKICAgICAgICAgICAgdW5zZWxMaW5rKHNlbGVjdGVkTGluayk7CiAgICAgICAgfQogICAgICAgIHNlbGVjdGVkTGluayA9IGxkYXRhOwogICAgICAgIGlmIChzZWxlY3RlZExpbmspIHsKICAgICAgICAgICAgc2VsTGluayhzZWxlY3RlZExpbmspOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiB1bnNlbExpbmsoZCkgewogICAgICAgIC8vIGd1YXJkIGFnYWluc3QgbGluayBlbGVtZW50IG5vdCBzZXQKICAgICAgICBpZiAoZC5lbCkgewogICAgICAgICAgICBkLmVsLmNsYXNzZWQoJ3NlbGVjdGVkJywgZmFsc2UpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBzZWxMaW5rKGQpIHsKICAgICAgICAvLyBndWFyZCBhZ2FpbnN0IGxpbmsgZWxlbWVudCBub3Qgc2V0CiAgICAgICAgaWYgKCFkLmVsKSByZXR1cm47CgogICAgICAgIGQuZWwuY2xhc3NlZCgnc2VsZWN0ZWQnLCB0cnVlKTsKCiAgICAgICAgdHBzLmRpc3BsYXlMaW5rKGQpOwogICAgICAgIHRwcy5kaXNwbGF5U29tZXRoaW5nKCk7CiAgICB9CgogICAgLy8gPT09PT09IE1PVVNFIEVWRU5UIEhBTkRMRVJTID09PT09PQoKICAgIGZ1bmN0aW9uIG1vdXNlTW92ZUhhbmRsZXIoKSB7CiAgICAgICAgdmFyIG1wID0gZ2V0TG9naWNhbE1vdXNlUG9zaXRpb24odGhpcyksCiAgICAgICAgICAgIGxpbmsgPSBjb21wdXRlTmVhcmVzdExpbmsobXApOwogICAgICAgIGVuaGFuY2VMaW5rKGxpbmspOwogICAgfQoKICAgIGZ1bmN0aW9uIG1vdXNlQ2xpY2tIYW5kbGVyKCkgewogICAgICAgIHZhciBtcCwgbGluaywgbm9kZTsKCiAgICAgICAgaWYgKCF0c3MuY2xpY2tDb25zdW1lZCgpKSB7CiAgICAgICAgICAgIG1wID0gZ2V0TG9naWNhbE1vdXNlUG9zaXRpb24odGhpcyk7CiAgICAgICAgICAgIG5vZGUgPSBjb21wdXRlTmVhcmVzdE5vZGUobXBz8e9WO7IJAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA03ZpAAEAGzULAqAc2wKgHYJbRH/WMl63WWpWrQIAQBY4QcgAAAQEICgC3yN8AYg/Tc/HvVjuyCQDKCAAAyggAAGj3KB/SxQgAJ60eEwgARQAIvMygQABABtW0wKgHYMCoBzYf9ZbRWpWrQIyXrdaAGAKNmJUAAAEBCAoAYg/VALfI2yk7CiAgICAgICAgICAgIGlmIChub2RlKSB7CiAgICAgICAgICAgICAgICAkbG9nLmRlYnVnKCdmb3VuZCBuZWFyZXN0IG5vZGU6Jywgbm9kZS5sYWJlbHNbMV0pOwogICAgICAgICAgICAgICAgdHNzLnNlbGVjdE9iamVjdChub2RlKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGxpbmsgPSBjb21wdXRlTmVhcmVzdExpbmsobXApOwogICAgICAgICAgICAgICAgc2VsZWN0TGluayhsaW5rKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PQoKICAgIGZ1bmN0aW9uIHRvZ2dsZVBvcnRzKHgpIHsKICAgICAgICB2YXIga2V2ID0gKHggPT09ICdrZXlldicpLAogICAgICAgICAgICBvbiA9IGtldiA/ICFzaG93UG9ydHMgOiAhIXgsCiAgICAgICAgICAgIHdoYXQgPSBvbiA/ICdFbmFibGUnIDogJ0Rpc2FibGUnLAogICAgICAgICAgICBoYW5kbGVyID0gb24gPyBtb3VzZU1vdmVIYW5kbGVyIDogbnVsbDsKCiAgICAgICAgc2hvd1BvcnRzID0gb247CgogICAgICAgIGlmICghb24pIHsKICAgICAgICAgICAgZW5oYW5jZUxpbmsobnVsbCk7CiAgICAgICAgfQogICAgICAgIHN2Zy5vbignbW91c2Vtb3ZlJywgaGFuZGxlcik7CiAgICAgICAgZmxhc2guZmxhc2god2hhdCArICcgcG9ydCBoaWdobGlnaHRpbmcnKTsKICAgICAgICByZXR1cm4gb247CiAgICB9CgogICAgZnVuY3Rpb24gZGVzZWxlY3RMaW5rKCkgewogICAgICAgIGlmIChzZWxlY3RlZExpbmspIHsKICAgICAgICAgICAgdW5zZWxMaW5rKHNlbGVjdGVkTGluayk7CiAgICAgICAgICAgIHNlbGVjdGVkTGluayA9IG51bGw7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIE1vZHVsZSBkZWZpbml0aW9uCgogICAgYW5ndWxhci5tb2R1bGUoJ292VG9wbycpCiAgICAgICAgLmZhY3RvcnkoJ1RvcG9MaW5rU2VydmljZScsCiAgICAgICAgWyckbG9nJywgJ0ZuU2VydmljZScsICdTdmdVdGlsU2VydmljZScsICdUaGVtZVNlcnZpY2UnLCAnRmxhc2hTZXJ2aWNlJywKICAgICAgICAgICAgJ1RvcG9TZWxlY3RTZXJ2aWNlJywgJ1RvcG9QYW5lbFNlcnZpY2UnLAoKICAgICAgICBmdW5jdGlvbiAoXyRsb2dfLCBfZnNfLCBfc3VzXywgX3RzXywgX2ZsYXNoXywgX3Rzc18sIF90cHNfKSB7CiAgICAgICAgICAgICRsb2cgPSBfJGxvZ187CiAgICAgICAgICAgIGZzID0gX2ZzXzsKICAgICAgICAgICAgc3VzID0gX3N1c187CiAgICAgICAgICAgIHRzID0gX3RzXzsKICAgICAgICAgICAgZmxhc2ggPSBfZmxhc2hfOwogICAgICAgICAgICB0c3MgPSBfdHNzXzsKICAgICAgICAgICAgdHBzID0gX3Rwc187CgogICAgICAgICAgICBmdW5jdGlvbiBpbml0TGluayhfYXBpXywgX3RkM18pIHsKICAgICAgICAgICAgICAgIGFwaSA9IF9hcGlfOwogICAgICAgICAgICAgICAgdGQzID0gX3RkM187CiAgICAgICAgICAgICAgICBzdmcgPSBhcGkuc3ZnOwogICAgICAgICAgICAgICAgbmV0d29yayA9IGFwaS5uZXR3b3JrOwogICAgICAgICAgICAgICAgaWYgKHNob3dQb3J0cyAmJiAhZnMuaXNNb2JpbGUoKSkgewogICAgICAgICAgICAgICAgICAgIHN2Zy5vbignbW91c2Vtb3ZlJywgbW91c2VNb3ZlSGFuZGxlcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzdmcub24oJ2NsaWNrJywgbW91c2VDbGlja0hhbmRsZXIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiBkZXN0cm95TGluaygpIHsKICAgICAgICAgICAgICAgIC8vIHVuY29uZGl0aW9uYWxseSByZW1vdmUgYW55IGV2ZW50IGhhbmRsZXJzCiAgICAgICAgICAgICAgICBzdmcub24oJ21vdXNlbW92ZScsIG51bGwpOwogICAgICAgICAgICAgICAgc3ZnLm9uKCdjbGljaycsIG51bGwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgaW5pdExpbms6IGluaXRMaW5rLAogICAgICAgICAgICAgICAgZGVzdHJveUxpbms6IGRlc3Ryb3lMaW5rLAogICAgICAgICAgICAgICAgdG9nZ2xlUG9ydHM6IHRvZ2dsZVBvcnRzLAogICAgICAgICAgICAgICAgZGVzZWxlY3RMaW5rOiBkZXNlbGVjdExpbmsKICAgICAgICAgICAgfTsKICAgICAgICB9XSk7Cn0oKSk7CnPx71Y0tQkAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADTdm0AAQAbNQcCoBzbAqAdgltEf9YyXrdZalbPIgBAFpAfSAAABAQgKALfI3wBiD9Vz8e9Wh7YJAJICAACSAgAACAAnrR4TaPcoH9LFCABFAAKE3ZxAAEAGyvDAqAc2wKgHYJbRH/WMl63WWpWzyIAYBaQpRAAAAQEICgC3yN8AYg/VR0VUIC9vbm9zL3VpL2FwcC92aWV3L3RvcG8vdG9wb09ibGlxdWUuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6ICovKg0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCnPx71b6tgkAoTcAAKE3AABo9ygf0sUIACetHhMIAEUAN5OBRUAAQAbyOMCoB2DAqAc2H/WW1KGuid5A3ddhgBgCa8dsAAABAQgKAGIP1QC3yNtIVFRQLzEuMSAyMDAgT0sNCkNvbnRlbnQtVHlwZTogdGV4dC9qYXZhc2NyaXB0DQpDb250ZW50LUxlbmd0aDogMTQwNjkNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gVG9wb2xvZ3kgTW9kZWwgTW9kdWxlLgogQXV4aWxpYXJ5IGZ1bmN0aW9ucyBmb3IgdGhlIG1vZGVsIG9mIHRoZSB0b3BvbG9neTsgdGhhdCBpcywgb3VyIGludGVybmFsCiAgcmVwcmVzZW50YXRpb25zIG9mIGRldmljZXMsIGhvc3RzLCBsaW5rcywgZXRjLgogKi8KCihmdW5jdGlvbiAoKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8gaW5qZWN0ZWQgcmVmcwogICAgdmFyICRsb2csIGZzLCBybmQ7CgogICAgLy8gYXBpIHRvIHRvcG9Gb3JjZQogICAgdmFyIGFwaTsKICAgIC8qCiAgICAgICBwcm9qZWN0aW9uKCkKICAgICAgIG5ldHdvcmsgey4uLn0KICAgICAgIHJlc3R5bGVMaW5rRWxlbWVudCggbGRhdGEgKQogICAgICAgcmVtb3ZlTGlua0VsZW1lbnQoIGxkYXRhICkKICAgICAqLwoKICAgIC8vIHNob3J0aGFuZAogICAgdmFyIGx1LCBybGssIG5vZGVzLCBsaW5rcywgbGlua3NCeURldmljZTsKCiAgICB2YXIgZGltOyAgICAvLyBkaW1lbnNpb25zIG9mIGxheW91dCBbdyxoXQoKICAgIC8vIGNvbmZpZ3VyYXRpb24gJ2NvbnN0YW50cycKICAgIHZhciBkZWZhdWx0TGlua1R5cGUgPSAnZGlyZWN0JywKICAgICAgICBuZWFyRGlzdCA9IDE1OwoKCiAgICBmdW5jdGlvbiBjb29yZEZyb21MbmdMYXQobG9jKSB7CiAgICAgICAgdmFyIHAgPSBhcGkucHJvamVjdGlvbigpOwogICAgICAgIC8vIHN1c3BlY3RlZCBjYXVzZSBvZiBPTk9TLTIxMDkKICAgICAgICByZXR1cm4gcCA/IHAoW2xvYy5sbmcsIGxvYy5sYXRdKSA6IFswLCAwXTsKICAgIH0KCiAgICBmdW5jdGlvbiBsbmdMYXRGcm9tQ29vcmQoY29vcmQpIHsKICAgICAgICB2YXIgcCA9IGFwaS5wcm9qZWN0aW9uKCk7CiAgICAgICAgcmV0dXJuIHAgPyBwLmludmVydChjb29yZCkgOiBbMCwgMF07CiAgICB9CgogICAgZnVuY3Rpb24gcG9zaXRpb25Ob2RlKG5vZGUsIGZvclVwZGF0ZSkgewogICAgICAgIHZhciBtZXRhID0gbm9kZS5tZXRhVWksCiAgICAgICAgICAgIHggPSBtZXRhICYmIG1ldGEueCwKICAgICAgICAgICAgeSA9IG1ldGEgJiYgbWV0YS55LAogICAgICAgICAgICB4eTsKCiAgICAgICAgLy8gaWYgdGhlIGRldmljZSBjb250YWlucyBleHBsaWNpdCBMT05HL0xBVCBkYXRhLCB1c2UgdGhhdCB0byBwb3NpdGlvbgogICAgICAgIGlmIChzZXRMb25nTGF0KG5vZGUpKSB7CiAgICAgICAgICAgIC8vIGluZGljYXRlIHdlIHdhbnQgdG8gdXBkYXRlIGNhY2hlZCBtZXRhIGRhdGEuLi4KICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAvLyBlbHNlIGlmIHdlIGhhdmUgW3gseV0gY2FjaGVkIGluIG1ldGEgZGF0YSwgdXNlIHRoYXQuLi4KICAgICAgICBpZiAoeCAmJiB5KSB7CiAgICAgICAgICAgIG5vZGUuZml4ZWQgPSB0cnVlOwogICAgICAgICAgICBub2RlLnB4ID0gbm9kZS54ID0geDsKICAgICAgICAgICAgbm9kZS5weSA9IG5vZGUueSA9IHk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIGlmIHRoaXMgaXMgYSBub2RlIHVwZGF0ZSAobm90IGEgbm9kZSBhZGQpLi4gc2tpcCByYW5kb21pemVyCiAgICAgICAgaWYgKGZvclVwZGF0ZSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBOb3RlOiBQbGFjaW5nIGluY29taW5nIHVucGlubmVkIG5vZGVzIGF0IGV4YWN0bHkgdGhlIHNhbWUgcG9pbnQKICAgICAgICAvLyAgICAgICAgKGNlbnRlciBvZiB0aGUgdmlldykgY2F1c2VzIHRoZW0gdG8gZXhwbG9kZSBvdXR3YXJkcyB3aGVuCiAgICAgICAgLy8gICAgICAgIHRoZSBmb3JjZSBsYXlvdXQga2lja3MgaW4uIFNvLCB3ZSBzcHJlYWQgdGhlbSBvdXQgYSBiaXQKICAgICAgICAvLyAgICAgICAgaW5pdGlhbGx5LCB0byBwcm92aWRlIGEgbW9yZSBzZXJlbmUgbGF5b3V0IGNvbnZlcmdlbmNlLgogICAgICAgIC8vICAgICAgIEFkZGl0aW9uYWxseSwgaWYgdGhlIG5vZGUgaXMgYSBob3N0LCB3ZSBwbGFjZSBpdCBuZWFyCiAgICAgICAgLy8gICAgICAgIHRoZSBkZXZpY2UgaXQgaXMgY29ubmVjdGVkIHRvLgoKICAgICAgICBmdW5jdGlvbiByYW5kKCkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgeDogcm5kLnJhbmREaW0oZGltWzBdKSwKICAgICAgICAgICAgICAgIHk6IHJuZC5yYW5kRGltKGRpbVsxXSkKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIG5lYXIobm9kZSkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgeDogbm9kZS54ICsgbmVhckRpc3QgKyBybmQuc3ByZWFkKG5lYXJEaXN0KSwKICAgICAgICAgICAgICAgIHk6IG5vZGUueSArIG5lYXJEaXN0ICsgcm5kLnNwcmVhZChuZWFyRGlzdCkKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGdldERldmljZShjcCkgewogICAgICAgICAgICB2YXIgZCA9IGx1W2NwLmRldmljZV07CiAgICAgICAgICAgIHJldHVybiBkIHx8IHJhbmQoKTsKICAgICAgICB9CgogICAgICAgIHh5ID0gKG5vZGUuY2xhc3MgPT09ICdob3N0JykgPyBuZWFyKGdldERldmljZShub2RlLmNwKSkgOiByYW5kKCk7CiAgICAgICAgYW5ndWxhci5leHRlbmQobm9kZSwgeHkpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNldExvbmdMYXQobm9kZSkgewogICAgICAgIHZhciBsb2MgPSBub2RlLmxvY2F0aW9uLAogICAgICAgICAgICBjb29yZDsKCiAgICAgICAgaWYgKGxvYyAmJiBsb2MudHlwZSA9PT0gJ2xuZ2xhdCcpIHsKICAgICAgICAgICAgY29vcmQgPSBjb29yZEZyb21MbmdMYXQobG9jKTsKICAgICAgICAgICAgbm9kZS5maXhlZCA9IHRydWU7CiAgICAgICAgICAgIG5vZGUucHggPSBub2RlLnggPSBjb29yZFswXTsKICAgICAgICAgICAgbm9kZS5weSA9IG5vZGUueSA9IGNvb3JkWzFdOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gcmVzZXRBbGxMb2NhdGlvbnMoKSB7CiAgICAgICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgICAgICBzZXRMb25nTGF0KGQpOwogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIG1rU3ZnQ2xzKGRoLCB0LCBvbikgewogICAgICAgIHZhciBuZGggPSAnbm9kZSAnICsgZGgsCiAgICAgICAgICAgIG5kaHQgPSB0ID8gbmRoICsgJyAnICsgdCA6IG5kaDsKICAgICAgICByZXR1cm4gb24gPyBuZGh0ICsgJyBvbmxpbmUnIDogbmRodDsKICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdGVEZXZpY2VOb2RlKGRldmljZSkgewogICAgICAgIHZhciBub2RlID0gZGV2aWNlOwoKICAgICAgICAvLyBBdWdtZW50IGFzIG5lZWRlZC4uLgogICAgICAgIG5vZGUuY2xhc3MgPSAnZGV2aWNlJzsKICAgICAgICBub2RlLnN2Z0NsYXNzID0gbWtTdmdDbHMoJ2RldmljZScsIGRldmljZS50eXBlLCBkZXZpY2Uub25saW5lKTsKICAgICAgICBwb3NpdGlvbk5vZGUobm9kZSk7CiAgICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRlSG9zdE5vZGUoaG9zdCkgewogICAgICAgIHZhciBub2RlID0gaG9zdDsKCiAgICAgICAgLy8gQXVnbWVudCBhcyBuZWVkZWQuLi4KICAgICAgICBub2RlLmNsYXNzID0gJ2hvc3QnOwogICAgICAgIGlmICghbm9kZS50eXBlKSB7CiAgICAgICAgICAgIG5vZGUudHlwZSA9ICdlbmRzdGF0aW9uJzsKICAgICAgICB9CiAgICAgICAgbm9kZS5zdmdDbGFzcyA9IG1rU3ZnQ2xzKCdob3N0Jywgbm9kZS50eXBlKTsKICAgICAgICBwb3NpdGlvbk5vZGUobm9kZSk7CiAgICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRlSG9zdExpbmsoaG9zdCkgewogICAgICAgIHZhciBzcmMgPSBob3N0LmlkLAogICAgICAgICAgICBkc3QgPSBob3N0LmNwLmRldmljZSwKICAgICAgICAgICAgaWQgPSBob3N0LmluZ3Jlc3MsCiAgICAgICAgICAgIGxuayA9IGxpbmtFbmRQb2ludHMoc3JjLCBkc3QpOwoKICAgICAgICBpZiAoIWxuaykgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIC8vIFN5bnRoZXNpemUgbGluayAuLi4KICAgICAgICBhbmd1bGFyLmV4dGVuZChsbmssIHsKICAgICAgICAgICAga2V5OiBpZCwKICAgICAgICAgICAgY2xhc3M6ICdsaW5rJywKICAgICAgICAgICAgLy8gTk9URTogc3JjUG9ydCBsZWZ0IHVuZGVmaW5lZCAoaG9zdCBlbmQgb2YgdGhlIGxpbmspCiAgICAgICAgICAgIHRndFBvcnQ6IGhvc3QuY3AucG9ydCwKCiAgICAgICAgICAgIHR5cGU6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICdob3N0TGluayc7IH0sCiAgICAgICAgICAgIGV4cGVjdGVkOiBmdW5jdGlvbiAoKSB7IHJldHVybiB0cnVlOyB9LAogICAgICAgICAgICBvbmxpbmU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIC8vIGhvc3RsaW5rIHRhcmdldCBpcyBlZGdlIHN3aXRjaAogICAgICAgICAgICAgICAgcmV0dXJuIGxuay50YXJnZXQub25saW5lOwogICAgICAgICAgICB9LAogICAgICAgICAgICBsaW5rV2lkdGg6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDE7IH0KICAgICAgICB9KTsKICAgICAgICByZXR1cm4gbG5rOwogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0ZUxpbmsobGluaykgewogICAgICAgIHZhciBsbmsgPSBsaW5rRW5kUG9pbnRzKGxpbmsuc3JjLCBsaW5rLmRzdCk7CgogICAgICAgIGlmICghbG5rKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgYW5ndWxhci5leHRlbmQobG5rLCB7CiAgICAgICAgICAgIGtleTogbGluay5pZCwKICAgICAgICAgICAgY2xhc3M6ICdsaW5rJywKICAgICAgICAgICAgZnJvbVNvdXJjZTogbGluaywKICAgICAgICAgICAgc3JjUG9ydDogbGluay5zcmNQb3J0LAogICAgICAgICAgICB0Z3RQb3J0OiBsaW5rLmRzdFBvcnQsCiAgICAgICAgICAgIHBvc2l0aW9uOiB7CiAgICAgICAgICAgICAgICB4MTogMCwKICAgICAgICAgICAgICAgIHkxOiAwLAogICAgICAgICAgICAgICAgeDI6IDAsCiAgICAgICAgICAgICAgICB5MjogMAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gZnVuY3Rpb25zIHRvIGFnZ3JlZ2F0ZSBkdWFsIGxpbmsgc3RhdGUKICAgICAgICAgICAgdHlwZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIHMgPSBsbmsuZnJvbVNvdXJjZSwKICAgICAgICAgICAgICAgICAgICB0ID0gbG5rLmZyb21UYXJnZXQ7CiAgICAgICAgICAgICAgICByZXR1cm4gKHMgJiYgcy50eXBlKSB8fCAodCAmJiB0LnR5cGUpIHx8IGRlZmF1bHRMaW5rVHlwZTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXhwZWN0ZWQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBzID0gbG5rLmZyb21Tb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgdCA9IGxuay5mcm9tVGFyZ2V0OwogICAgICAgICAgICAgICAgcmV0dXJuIChzICYmIHMuZXhwZWN0ZWQpICYmICh0ICYmIHQuZXhwZWN0ZWQpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBvbmxpbmU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBzID0gbG5rLmZyb21Tb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgdCA9IGxuay5mcm9tVGFyZ2V0LAogICAgICAgICAgICAgICAgICAgIGJvdGggPSBsbmsuc291cmNlLm9ubGluZSAmJiBsbmsudGFyZ2V0Lm9ubGluZTsKICAgICAgICAgICAgICAgIHJldHVybiBib3RoICYmIChzICYmIHMub25saW5lKSAmJiAodCAmJiB0Lm9ubGluZSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGxpbmtXaWR0aDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIHMgPSBsbmsuZnJvbVNvdXJjZSwKICAgICAgICAgICAgICAgICAgICB0ID0gbG5rLmZyb21UYXJnZXQsCiAgICAgICAgICAgICAgICAgICAgd3MgPSAocyAmJiBzLmxpbmtXaWR0aCkgfHwgMCwKICAgICAgICAgICAgICAgICAgICB3dCA9ICh0ICYmIHQubGlua1dpZHRoKSB8fCAwOwogICAgICAgICAgICAgICAgcmV0dXJuIGxuay5wb3NpdGlvbi5tdWx0aUxpbmsgPyA1IDogTWF0aC5tYXgod3MsIHd0KTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBsbms7CiAgICB9CgoKICAgIGZ1bmN0aW9uIGxpbmtFbmRQb2ludHMoc3JjSWQsIGRzdElkKSB7CiAgICAgICAgdmFyIHNyY05vZGUgPSBsdVtzcmNJZF0sCiAgICAgICAgICAgIGRzdE5vZGUgPSBsdVtkc3RJZF0sCiAgICAgICAgICAgIHNNaXNzID0gIXNyY05vZGUgPyBtaXNzTXNnKCdzcmMnLCBzcmNJZCkgOiAnJywKICAgICAgICAgICAgZE1pc3MgPSAhZHN0Tm9kZSA/IG1pc3NNc2coJ2RzdCcsIGRzdElkKSA6ICcnOwoKICAgICAgICBpZiAoc01pc3MgfHwgZE1pc3MpIHsKICAgICAgICAgICAgJGxvZy5lcnJvcignTm9kZShzKSBub3Qgb24gbWFwIGZvciBsaW5rOicgKyBzTWlzcyArIGRNaXNzKTsKICAgICAgICAgICAgLy9sb2dpY0Vycm9yKCdOb2RlKHMpIG5vdCBvbiBtYXAgZm9yIGxpbms6XG4nICsgc01pc3MgKyBkTWlzcyk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gewogICAgICAgICAgICBzb3VyY2U6IHNyY05vZGUsCiAgICAgICAgICAgIHRhcmdldDogZHN0Tm9kZQogICAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gbWlzc01zZyh3aGF0LCBpZCkgewogICAgICAgIHJldHVybiAnXG5bJyArIHdoYXQgKyAnXSAiJyArIGlkICsgJyIgbWlzc2luZyc7CiAgICB9CgoKICAgIGZ1bmN0aW9uIG1ha2VOb2RlS2V5KGQsIHdoYXQpIHsKICAgICAgICB2YXIgcG9ydCA9IHdoYXQgKyAnUG9ydCc7CiAgICAgICAgcmV0dXJuIGRbd2hhdF0gKyAnLycgKyBkW3BvcnRdOwogICAgfQoKICAgIGZ1bmN0aW9uIG1ha2VMaW5rS2V5KGQsIGZsaXBwZWQpIHsKICAgICAgICB2YXIgb25lID0gZmxpcHBlZCA/IG1ha2VOb2RlS2V5KGQsICdkc3QnKSA6IG1ha2VOb2RlS2V5KGQsICdzcmMnKSwKICAgICAgICAgICAgdHdvID0gZmxpcHBlZCA/IG1ha2VOb2RlS2V5KGQsICdzcmMnKSA6IG1ha2VOb2RlS2V5KGQsICdkc3QnKTsKICAgICAgICByZXR1cm4gb25lICsgJy0nICsgdHdvOwogICAgfQoKICAgIGZ1bmN0aW9uIGZpbmRMaW5rQnlJZChpZCkgewogICAgICAgIC8vIGNoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIGEgcmV2ZXJzZSBsb29rdXAsIGVsc2UgZGVmYXVsdCB0byBnaXZlbiBpZAogICAgICAgIHZhciBrZXkgPSBybGtbaWRdIHx8IGlkOwogICAgICAgIHJldHVybiBrZXkgJiYgbHVba2V5XTsKICAgIH0KCiAgICBmdW5jdGlvbiBmaW5kTGluayhsaW5rRGF0YSwgb3ApIHsKICAgICAgICB2YXIga2V5ID0gbWFrZUxpbmtLZXkobGlua0RhdGEpLAogICAgICAgICAgICBrZXlyZXYgPSBtYWtlTGlua0tleShsaW5rRGF0YSwgMSksCiAgICAgICAgICAgIGxpbmsgPSBsdVtrZXldLAogICAgICAgICAgICBsaW5rUmV2ID0gbHVba2V5cmV2XSwKICAgICAgICAgICAgcmVzdWx0ID0ge30sCiAgICAgICAgICAgIGxkYXRhID0gbGluayB8fCBsaW5rUmV2LAogICAgICAgICAgICByYXdMaW5rOwoKICAgICAgICBpZiAob3AgPT09ICdhZGQnKSB7CiAgICAgICAgICAgIGlmIChsaW5rKSB7CiAgICAgICAgICAgICAgICAvLyB0cnlpbmcgdG8gYWRkIGEgbGluayB0aGF0IHdlIGFscmVhZHkga25vdyBhYm91dAogICAgICAgICAgICAgICAgcmVzdWx0LmxkYXRhID0gbGluazsKICAgICAgICAgICAgICAgIHJlc3VsdC5iYWRMb2dpYyA9ICdhZGRMaW5rOiBsaW5rIGFscmVhZHkgYWRkZWQnOwoKICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5rUmV2KSB7CiAgICAgICAgICAgICAgICAvLyB3ZSBmb3VuZCB0aGUgcmV2ZXJzZSBvZiB0aGUgbGluayB0byBiZSBhZGRlZAogICAgICAgICAgICAgICAgcmVzdWx0LmxkYXRhID0gbGlua1JldjsKICAgICAgICAgICAgICAgIGlmIChsaW5rUmV2LmZyb21UYXJnZXQpIHsKICAgICAgICAgICAgICAgICAgICByZXN1bHQuYmFkTG9naWMgPSAnYWRkTGluazogbGluayBhbHJlYWR5IGFkZGVkJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAob3AgPT09ICd1cGRhdGUnKSB7CiAgICAgICAgICAgIGlmICghbGRhdGEpIHsKICAgICAgICAgICAgICAgIHJlc3VsdC5iYWRMb2dpYyA9ICd1cGRhdGVMaW5rOiBsaW5rIG5vdCBmb3VuZCc7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByYXdMaW5rID0gbGluayA/IGxkYXRhLmZyb21Tb3VyY2UgOiBsZGF0YS5mcm9tVGFyZ2V0OwogICAgICAgICAgICAgICAgcmVzdWx0LnVwZGF0ZVdpdGggPSBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgICAgIGFuZ3VsYXIuZXh0ZW5kKHJhd0xpbmssIGRhdGEpOwogICAgICAgICAgICAgICAgICAgIGFwaS5yZXN0eWxlTGlua0VsZW1lbnQobGRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChvcCA9PT0gJ3JlbW92ZScpIHsKICAgICAgICAgICAgaWYgKCFsZGF0YSkgewogICAgICAgICAgICAgICAgcmVzdWx0LmJhZExvZ2ljID0gJ3JlbW92ZUxpbms6IGxpbmsgbm90IGZvdW5kJzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJhd0xpbmsgPSBsaW5rID8gbGRhdGEuZnJvbVNvdXJjZSA6IGxkYXRhLmZyb21UYXJnZXQ7CgogICAgICAgICAgICAgICAgaWYgKCFyYXdMaW5rKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmJhZExvZ2ljID0gJ3JlbW92ZUxpbms6IGxpbmsgbm90IGZvdW5kJzsKCiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5yZW1vdmVSYXdMaW5rID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgbGluayBvdXQgb2YgYWdncmVnYXRlIGxpbmtzQnlEZXZpY2UgbGlzdAogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGlua3NGb3JEZXZQYWlyID0gbGlua3NCeURldmljZVtsZGF0YS5kZXZpY2VQYWlyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJtdklkeCA9IGZzLmZpbmQobGRhdGEua2V5LCBsaW5rc0ZvckRldlBhaXIsICdrZXknKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJtdklkeCA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rc0ZvckRldlBhaXIuc3BsaWNlKHJtdklkeCwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgbGRhdGEucG9zaXRpb24ubXVsdGlsaW5rID0gbGlua3NGb3JEZXZQYWlyLmxlbmd0aCA+PSA1OwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBmcm9tU291cmNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZGF0YS5mcm9tU291cmNlID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZGF0YS5mcm9tVGFyZ2V0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvbW90ZSB0YXJnZXQgaW50byBzb3VyY2UgcG9zaXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZGF0YS5mcm9tU291cmNlID0gbGRhdGEuZnJvbVRhcmdldDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZGF0YS5mcm9tVGFyZ2V0ID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZGF0YS5rZXkgPSBrZXlyZXY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGx1W2tleV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHVba2V5cmV2XSA9IGxkYXRhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBybGtba2V5cmV2XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBmcm9tVGFyZ2V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZGF0YS5mcm9tVGFyZ2V0ID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBybGtba2V5cmV2XTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobGRhdGEuZnJvbVNvdXJjZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpLnJlc3R5bGVMaW5rRWxlbWVudChsZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGkucmVtb3ZlTGlua0VsZW1lbnQobGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgZnVuY3Rpb24gZmluZERldmljZXMob2ZmbGluZU9ubHkpIHsKICAgICAgICB2YXIgYSA9IFtdOwogICAgICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgaWYgKGQuY2xhc3MgPT09ICdkZXZpY2UnICYmICEob2ZmbGluZU9ubHkgJiYgZC5vbmxpbmUpKSB7CiAgICAgICAgICAgICAgICBhLnB1c2goZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICByZXR1cm4gYTsKICAgIH0KCiAgICBmdW5jdGlvbiBmaW5kQXR0YWNoZWRIb3N0cyhkZXZJZCkgewogICAgICAgIHZhciBob3N0cyA9IFtdOwogICAgICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgaWYgKGQuY2xhc3MgPT09ICdob3N0JyAmJiBkLmNwLmRldmljZSA9PT0gZGV2SWQpIHsKICAgICAgICAgICAgICAgIGhvc3RzLnB1c2goZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICByZXR1cm4gaG9zdHM7CiAgICB9CgogICAgZnVuY3Rpb24gZmluZEF0dGFjaGVkTGlua3MoZGV2SWQpIHsKICAgICAgICB2YXIgbG5rcyA9IFtdOwogICAgICAgIGxpbmtzLmZvckVhY2goZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgaWYgKGQuc291cmNlLmlkID09PSBkZXZJZCB8fCBkLnRhcmdldC5pZCA9PT0gZGV2SWQpIHsKICAgICAgICAgICAgICAgIGxua3MucHVzaChkKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBsbmtzOwogICAgfQoKICAgIC8vIHJldHVybnMgb25lLXdheSBsaW5rcyBvciB3aGVyZSB0aGUgaW50ZXJuYWwgbGluayB0eXBlcyBkaWZmZXIKICAgIGZ1bmN0aW9uIGZpbmRCYWRMaW5rcygpIHsKICAgICAgICB2YXIgbG5rcyA9IFtdLAogICAgICAgICAgICBzcmMsIHRndDsKICAgICAgICBsaW5rcy5mb3JFYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIC8vIE5PVEU6IHNraXAgZWRnZSBsaW5rcywgd2hpY2ggYXJlIHN5bnRoZXNpemVkCiAgICAgICAgICAgIGlmIChkLnR5cGUoKSAhPT0gJ2hvc3RMaW5rJykgewogICAgICAgICAgICAgICAgZGVsZXRlIGQuYmFkOwogICAgICAgICAgICAgICAgc3JjID0gZC5mcm9tU291cmNlOwogICAgICAgICAgICAgICAgdGd0ID0gZC5mcm9tVGFyZ2V0OwogICAgICAgICAgICAgICAgaWYgKHNyYyAmJiAhdGd0KSB7CiAgICAgICAgICAgICAgICAgICAgZC5iYWQgPSAnbWlzc2luZyBsaW5rJzsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3JjLnR5cGUgIT09IHRndC50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgZC5iYWQgPSAndHlwZSBtaXNtYXRjaCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZC5iYWQpIHsKICAgICAgICAgICAgICAgICAgICBsbmtzLnB1c2goZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICByZXR1cm4gbG5rczsKICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gTW9kdWxlIGRlZmluaXRpb24KCiAgICBhbmd1bGFyLm1vZHVsZSgnb3ZUb3BvJykKICAgIC5mYWN0b3J5KCdUb3BvTW9kZWxTZXJ2aWNlJywKICAgICAgICBbJyRsb2cnLCAnRm5TZXJ2aWNlJywgJ1JhbmRvbVNlcnZpY2UnLAoKICAgICAgICBmdW5jdGlvbiAoXyRsb2dfLCBfZnNfLCBfcm5kXykgewogICAgICAgICAgICAkbG9nID0gXyRsb2dfOwogICAgICAgICAgICBmcyA9IF9mc187CiAgICAgICAgICAgIHJuZCA9IF9ybmRfOwoKICAgICAgICAgICAgZnVuY3Rpb24gaW5pdE1vZGVsKF9hcGlfLCBfZGltXykgewogICAgICAgICAgICAgICAgYXBpID0gX2FwaV87CiAgICAgICAgICAgICAgICBkaW0gPSBfZGltXzsKICAgICAgICAgICAgICAgIGx1ID0gYXBpLm5ldHdvcmsubG9va3VwOwogICAgICAgICAgICAgICAgcmxrID0gYXBpLm5ldHdvcmsucmV2TGlua1RvS2V5OwogICAgICAgICAgICAgICAgbm9kZXMgPSBhcGkubmV0d29yay5ub2RlczsKICAgICAgICAgICAgICAgIGxpbmtzID0gYXBpLm5ldHdvcmsubGlua3M7CiAgICAgICAgICAgICAgICBsaW5rc0J5RGV2aWNlID0gYXBpLm5ldHdvcmsubGlua3NCeURldmljZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZnVuY3Rpb24gbmV3RGltKF9kaW1fKSB7CiAgICAgICAgICAgICAgICBkaW0gPSBfZGltXzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZnVuY3Rpb24gZGVzdHJveU1vZGVsKCkgeyB9CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgaW5pdE1vZGVsOiBpbml0TW9kZWwsCiAgICAgICAgICAgICAgICBuZXdEaW06IG5ld0RpbSwKICAgICAgICAgICAgICAgIGRlc3Ryb3lNb2RlbDogZGVzdHJveU1vZGVsLAoKICAgICAgICAgICAgICAgIHBvc2l0aW9uTm9kZTogcG9zaXRpb25Ob2RlLAogICAgICAgICAgICAgICAgcmVzZXRBbGxMb2NhdGlvbnM6IHJlc2V0QWxsTG9jYXRpb25zLAogICAgICAgICAgICAgICAgY3JlYXRlRGV2aWNlTm9kZTogY3JlYXRlRGV2aWNlTm9kZSwKICAgICAgICAgICAgICAgIGNyZWF0ZUhvc3ROb2RlOiBjcmVhdGVIb3N0Tm9kZSwKICAgICAgICAgICAgICAgIGNyZWF0ZUhvc3RMaW5rOiBjcmVhdGVIb3N0TGluaywKICAgICAgICAgICAgICAgIGNyZWF0ZUxpbms6IGNyZWF0ZUxpbmssCiAgICAgICAgICAgICAgICBjb29yZEZyb21MbmdMYXQ6IGNvb3JkRnJvbUxuZ0xhdCwKICAgICAgICAgICAgICAgIGxuZ0xhdEZyb21Db29yZDogbG5nTGF0RnJvbUNvb3JkLAogICAgICAgICAgICAgICAgZmluZExpbms6IGZpbmRMaW5rLAogICAgICAgICAgICAgICAgZmluZExpbmtCeUlkOiBmaW5kTGlua0J5SWQsCiAgICAgICAgICAgICAgICBmaW5kRGV2aWNlczogZmluZERldmljZXMsCiAgICAgICAgICAgICAgICBmaW5kQXR0YWNoZWRIb3N0czogZmluZEF0dGFjaGVkSG9zdHMsCiAgICAgICAgICAgICAgICBmaW5kQXR0YWNoZWRMaW5rczogZmluZEF0dGFjaGVkTGlua3MsCiAgICAgICAgICAgICAgICBmaW5kQmFkTGlua3M6IGZpbmRCYWRMaW5rcwogICAgICAgICAgICB9CiAgICAgICAgfV0pOwp9KCkpOwpz8e9Wu7gJAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA04lBAAEAGyIzAqAc2wKgHYJbUH/VA3ddhoa7BPYAQB4rTiQAAAQEICgC3yN8AYg/Vc/HvVru4CQCSAgAAkgIAAAgAJ60eE2j3KB/SxQgARQAChOJRQABABsY7wKgHNsCoB2CW1B/1QN3XYaGuwT2AGAeg690AAAEBCAoAt8jfAGIP1UdFVCAvb25vcy91aS9hcHAvdmlldy90b3BvL3RvcG9PdmVybGF5LmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiAqLyoNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9WINcJAEIAAABCAAAAaPcoH9LFCAAnrR4TCABFAAA0fyxAAEAGK7HAqAdgwKgHNh/1ls8Ovlfgo2q33IAQAuOQDQAAAQEICgBiD9gAt8jYc/HvVjnbCQB6PgAAej4AAGj3KB/SxQgAJ60eEwgARQA+bCjKQABABkPbwKgHYMCoBzYf9ZbSU1EQRTSHYx6AEAK3zkUAAAEBCAoAYg/YALfI2khUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2phdmFzY3JpcHQNClRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCjgwMDANCi8qCiAqIENvcHlyaWdodCAyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIFRvcG9sb2d5IEZvcmNlIE1vZHVsZS4KIFZpc3VhbGl6YXRpb24gb2YgdGhlIHRvcG9sb2d5IGluIGFuIFNWRyBsYXllciwgdXNpbmcgYSBEMyBGb3JjZSBMYXlvdXQuCiAqLwoKKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBpbmplY3RlZCByZWZzCiAgICB2YXIgJGxvZywgJHRpbWVvdXQsIGZzLCBzdXMsIHRzLCBmbGFzaCwgd3NzLCB0b3YsCiAgICAgICAgdGlzLCB0bXMsIHRkMywgdHNzLCB0dHMsIHRvcywgZmx0ciwgdGxzLCB1cGxpbmssIHN2ZzsKCiAgICAvLyBjb25maWd1cmF0aW9uCiAgICB2YXIgbGlua0NvbmZpZyA9IHsKICAgICAgICBsaWdodDogewogICAgICAgICAgICBiYXNlQ29sb3I6ICcjNjY2JywKICAgICAgICAgICAgaW5Db2xvcjogJyM2NmYnLAogICAgICAgICAgICBvdXRDb2xvcjogJyNmMDAnCiAgICAgICAgfSwKICAgICAgICBkYXJrOiB7CiAgICAgICAgICAgIGJhc2VDb2xvcjogJyNhYWEnLAogICAgICAgICAgICBpbkNvbG9yOiAnIzY2ZicsCiAgICAgICAgICAgIG91dENvbG9yOiAnI2Y2NicKICAgICAgICB9LAogICAgICAgIGluV2lkdGg6IDEyLAogICAgICAgIG91dFdpZHRoOiAxMAogICAgfTsKCiAgICAvLyBpbnRlcm5hbCBzdGF0ZQogICAgdmFyIHNldHRpbmdzLCAgIC8vIG1lcmdlZCBkZWZhdWx0IHNldHRpbmdzIGFuZCBvcHRpb25zCiAgICAgICAgZm9yY2UsICAgICAgLy8gZm9yY2UgbGF5b3V0IG9iamVjdAogICAgICAgIGRyYWcsICAgICAgIC8vIGRyYWcgYmVoYXZpb3IgaGFuZGxlcgogICAgICAgIG5ldHdvcmsgPSB7CiAgICAgICAgICAgIG5vZGVzOiBbXSwKICAgICAgICAgICAgbGlua3M6IFtdLAogICAgICAgICAgICBsaW5rc0J5RGV2aWNlOiB7fSwKICAgICAgICAgICAgbG9va3VwOiB7fSwKICAgICAgICAgICAgcmV2TGlua1RvS2V5OiB7fQogICAgICAgIH0sCiAgICAgICAgbHUsICAgICAgICAgICAgICAgICAgICAgLy8gc2hvcnRoYW5kIGZvciBsb29rdXAKICAgICAgICBybGssICAgICAgICAgICAgICAgICAgICAvLyBzaG9ydGhhbmQgZm9yIHJldkxpbmt0b0tleQogICAgICAgIHNob3dIb3N0cyA9IGZhbHNlLCAgICAgIC8vIHdoZXRoZXIgaG9zdHMgYXJlIGRpc3BsYXllZAogICAgICAgIHNob3dPZmZsaW5lID0gdHJ1ZSwgICAgIC8vIHdoZXRoZXIgb2ZmbGluZSBkZXZpY2VzIGFyZSBkaXNwbGF5ZWQKICAgICAgICBub2RlTG9jayA9IGZhbHNlLCAgICAgICAvLyB3aGV0aGVyIG5vZGVzIGNhbiBiZSBkcmFnZ2VkIG9yIG5vdCAobG9ja2VkKQogICAgICAgIGZUaW1lciwgICAgICAgICAgICAgICAgIC8vIHRpbWVyIGZvciBkZWxheWVkIGZvcmNlIGxheW91dAogICAgICAgIGZOb2Rlc1RpbWVyLCAgICAgICAgICAgIC8vIHRpbWVyIGZvciBkZWxheWVkIG5vZGVzIHVwZGF0ZQogICAgICAgIGZMaW5rc1RpbWVyLCAgICAgICAgICAgIC8vIHRpbWVyIGZvciBkZWxheWVkIGxpbmtzIHVwZGF0ZQogICAgICAgIGRpbSwgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBmb3JjZSBsYXlvdXQgW3csaF0KICAgICAgICBsaW5rTnVtcyA9IFtdOyAgICAgICAgICAvLyBhcnJheSBvZiBsaW5rIG51bWJlciBsYWJlbHMKCiAgICAvLyBTVkcgZWxlbWVudHM7CiAgICB2YXIgbGlua0csIGxpbmtMYWJlbEcsIG51bUxpbmtMYmxzRywgcG9ydExhYmVsRywgbm9kZUc7CgogICAgLy8gRDMgc2VsZWN0aW9uczsKICAgIHZhciBsaW5rLCBsaW5rTGFiZWwsIG5vZGU7CgogICAgLy8gZGVmYXVsdCBzZXR0aW5ncyBmb3IgZm9yY2UgbGF5b3V0CiAgICB2YXIgZGVmYXVsdFNldHRpbmdzID0gewogICAgICAgIGdyYXZpdHk6IDAuNCwKICAgICAgICBmcmljdGlvbjogMC43LAogICAgICAgIGNoYXJnZTogewogICAgICAgICAgICAvLyBub3RlOiBrZXkgaXMgbm9kZS5jbGFzcwogICAgICAgICAgICBkZXZpY2U6IC04MDAwLAogICAgICAgICAgICBob3N0OiAtNTAwMCwKICAgICAgICAgICAgX2RlZl86IC0xMjAwMAogICAgICAgIH0sCiAgICAgICAgbGlua0Rpc3RhbmNlOiB7CiAgICAgICAgICAgIC8vIG5vdGU6IGtleSBpcyBsaW5rLnR5cGUKICAgICAgICAgICAgZGlyZWN0OiAxMDAsCiAgICAgICAgICAgIG9wdGljYWw6IDEyMCwKICAgICAgICAgICAgaG9zdExpbms6IDMsCiAgICAgICAgICAgIF9kZWZfOiA1MAogICAgICAgIH0sCiAgICAgICAgbGlua1N0cmVuZ3RoOiB7CiAgICAgICAgICAgIC8vIG5vdGU6IGtleSBpcyBsaW5rLnR5cGUKICAgICAgICAgICAgLy8gcmFuZ2U6IHswLjAgLi4uIDEuMH0KICAgICAgICAgICAgLy9kaXJlY3Q6IDEuMCwKICAgICAgICAgICAgLy9vcHRpY2FsOiAxLjAsCiAgICAgICAgICAgIC8vaG9zdExpbms6IDEuMCwKICAgICAgICAgICAgX2RlZl86IDEuMAogICAgICAgIH0KICAgIH07CgoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyA9PT0gRVZFTlQgSEFORExFUlMKCiAgICBmdW5jdGlvbiBhZGREZXZpY2UoZGF0YSkgewogICAgICAgIHZhciBpZCA9IGRhdGEuaWQsCiAgICAgICAgICAgIGQ7CgogICAgICAgIHVwbGluay5zaG93Tm9EZXZzKGZhbHNlKTsKCiAgICAgICAgLy8gYWx0aG91Z2ggdGhpcyBpcyBhbiBhZGQgZGV2aWNlIGV2ZW50LCBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhlCiAgICAgICAgLy8gIGRldmljZSwgdHJlYXQgaXQgYXMgYW4gdXBkYXRlIGluc3RlYWQuLgogICAgICAgIGlmIChsdVtpZF0pIHsKICAgICAgICAgICAgdXBkYXRlRGV2aWNlKGRhdGEpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBkID0gdG1zLmNyZWF0ZURldmljZU5vZGUoZGF0YSk7CiAgICAgICAgbmV0d29yay5ub2Rlcy5wdXNoKGQpOwogICAgICAgIGx1W2lkXSA9IGQ7CiAgICAgICAgdXBkYXRlTm9kZXMoKTsKICAgICAgICBmU3RhcnQoKTsKICAgIH0KCiAgICBmdW5jdGlvbiB1cGRhdGVEZXZpY2UoZGF0YSkgewogICAgICAgIHZhciBpZCA9IGRhdGEuaWQsCiAgICAgICAgICAgIGQgPSBsdVtpZF0sCiAgICAgICAgICAgIHdhc09ubGluZTsKCiAgICAgICAgaWYgKGQpIHsKICAgICAgICAgICAgd2FzT25saW5lID0gZC5vbmxpbmU7CiAgICAgICAgICAgIGFuZ3VsYXIuZXh0ZW5kKGQsIGRhdGEpOwogICAgICAgICAgICBpZiAodG1zLnBvc2l0aW9uTm9kZShkLCB0cnVlKSkgewogICAgICAgICAgICAgICAgc2VuZFVwZGF0ZU1ldGEoZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdXBkYXRlTm9kZXMoKTsKICAgICAgICAgICAgaWYgKHdhc09ubGluZSAhPT0gZC5vbmxpbmUpIHsKICAgICAgICAgICAgICAgIHRtcy5maW5kQXR0YWNoZWRMaW5rcyhkLmlkKS5mb3JFYWNoKHJlc3R5bGVMaW5rRWxlbWVudCk7CiAgICAgICAgICAgICAgICB1cGRhdGVPZmZsaW5lVmlzaWJpbGl0eShkKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiByZW1vdmVEZXZpY2UoZGF0YSkgewogICAgICAgIHZhciBpZCA9IGRhdGEuaWQsCiAgICAgICAgICAgIGQgPSBsdVtpZF07CiAgICAgICAgaWYgKGQpIHsKICAgICAgICAgICAgcmVtb3ZlRGV2aWNlRWxlbWVudChkKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gYWRkSG9zdChkYXRhKSB7CiAgICAgICAgdmFyIGlkID0gZGF0YS5pZCwKICAgICAgICAgICAgZCwgbG5rOwoKICAgICAgICAvLyBhbHRob3VnaCB0aGlzIGlzIGFuIGFkZCBob3N0IGV2ZW50LCBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhlCiAgICAgICAgLy8gIGhvc3QsIHRyZWF0IGl0IGFzIGFuIHVwZGF0ZSBpbnN0ZWFkLi4KICAgICAgICBpZiAobHVbaWRdKSB7CiAgICAgICAgICAgIHVwZGF0ZUhvc3QoZGF0YSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGQgPSB0bXMuY3JlYXRlSG9zdE5vZGUoZGF0YSk7CiAgICAgICAgbmV0d29yay5ub2Rlcy5wdXNoKGQpOwogICAgICAgIGx1W2lkXSA9IGQ7CiAgICAgICAgdXBkYXRlTm9kZXMoKTsKCiAgICAgICAgbG5rID0gdG1zLmNyZWF0ZUhvc3RMaW5rKGRhdGEpOwogICAgICAgIGlmIChsbmspIHsKICAgICAgICAgICAgZC5saW5rRGF0YSA9IGxuazsgICAgLy8gY2FjaGUgcmVmIG9uIGl0cyBob3N0CiAgICAgICAgICAgIG5ldHdvcmsubGlua3MucHVzaChsbmspOwogICAgICAgICAgICBsdVtkLmluZ3Jlc3NdID0gbG5rOwogICAgICAgICAgICBsdVtkLmVncmVzc10gPSBsbms7CiAgICAgICAgICAgIHVwZGF0ZUxpbmtzKCk7CiAgICAgICAgfQogICAgICAgIGZTdGFydCgpOwogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZUhvc3QoZGF0YSkgewogICAgICAgIHZhciBpZCA9IGRhdGEuaWQsCiAgICAgICAgICAgIGQgPSBsdVtpZF07CiAgICAgICAgaWYgKGQpIHsKICAgICAgICAgICAgYW5ndWxhci5leHRlbmQoZCwgZGF0YSk7CiAgICAgICAgICAgIGlmICh0bXMucG9zaXRpb25Ob2RlKGQsIHRydWUpKSB7CiAgICAgICAgICAgICAgICBzZW5kVXBkYXRlTWV0YShkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB1cGRhdGVOb2RlcygpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBtb3ZlSG9zdChkYXRhKSB7CiAgICAgICAgdmFyIGlkID0gZGF0YS5pZCwKICAgICAgICAgICAgZCA9IGx1W2lkXSwKICAgICAgICAgICAgbG5rOwogICAgICAgIGlmIChkKSB7CiAgICAgICAgICAgIC8vIGZpcnN0IHJlbW92ZSB0aGUgb2xkIGhvc3QgbGluawogICAgICAgICAgICByZW1vdmVMaW5rRWxlbWVudChkLmxpbmtEYXRhKTsKCiAgICAgICAgICAgIC8vIG1lcmdlIG5ldyBkYXRhCiAgICAgICAgICAgIGFuZ3VsYXIuZXh0ZW5kKGQsIGRhdGEpOwogICAgICAgICAgICBpZiAodG1zLnBvc2l0aW9uTm9kZShkLCB0cnVlKSkgewogICAgICAgICAgICAgICAgc2VuZFVwZGF0ZU1ldGEoZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIG5vdyBjcmVhdGUgYSBuZXcgaG9zdCBsaW5rCiAgICAgICAgICAgIGxuayA9IHRtcy5jcmVhdGVIb3N0TGluayhkYXRhKTsKICAgICAgICAgICAgaWYgKGxuaykgewogICAgICAgICAgICAgICAgZC5saW5rRGF0YSA9IGxuazsKICAgICAgICAgICAgICAgIG5ldHdvcmsubGlua3MucHVzaChsbmspOwogICAgICAgICAgICAgICAgbHVbZC5pbmdyZXNzXSA9IGxuazsKICAgICAgICAgICAgICAgIGx1W2QuZWdyZXNzXSA9IGxuazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdXBkYXRlTm9kZXMoKTsKICAgICAgICAgICAgdXBkYXRlTGlua3MoKTsKICAgICAgICAgICAgZlJlc3VtZSgpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiByZW1vdmVIb3N0KGRhdGEpIHsKICAgICAgICB2YXIgaWQgPSBkYXRhLmlkLAogICAgICAgICAgICBkID0gbHVbaWRdOwogICAgICAgIGlmIChkKSB7CiAgICAgICAgICAgIHJlbW92ZUhvc3RFbGVtZW50KGQsIHRydWUpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBhZGRMaW5rKGRhdGEpIHsKICAgICAgICB2YXIgcmVzdWx0ID0gdG1zLmZpbmRMaW5rKGRhdGEsICdhZGQnKSwKICAgICAgICAgICAgYmFkID0gcmVzdWx0LmJhZExvZ2ljLAogICAgICAgICAgICBkID0gcmVzdWx0LmxkYXRhOwoKICAgICAgICBpZiAoYmFkKSB7CiAgICAgICAgICAgICRsb2cuZGVidWcoYmFkICsgJzogJyArIGxpbmsuaWQpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZiAoZCkgewogICAgICAgICAgICAvLyB3ZSBhbHJlYWR5IGhhdmUgYSBiYWNraW5nIHN0b3JlIGxpbmsgZm9yIHNyYy9kc3Qgbm9kZXMKICAgICAgICAgICAgYWRkTGlua1VwZGF0ZShkLCBkYXRhKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gbm8gYmFja2luZyBzdG9yZSBsaW5rIHlldAogICAgICAgIGQgPSB0bXMuY3JlYXRlTGluayhkYXRhKTsKICAgICAgICBpZiAoZCkgewogICAgICAgICAgICBuZXR3b3JrLmxpbmtzLnB1c2goZCk7CiAgICAgICAgICAgIGFnZ3JlZ2F0ZUxpbmsoZCwgZGF0YSk7CiAgICAgICAgICAgIGx1W2Qua2V5XSA9IGQ7CiAgICAgICAgICAgIHVwZGF0ZUxpbmtzKCk7CiAgICAgICAgICAgIGZTdGFydCgpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiB1cGRhdGVMaW5rKGRhdGEpIHsKICAgICAgICB2YXIgcmVzdWx0ID0gdG1zLmZpbmRMaW5rKGRhdGEsICd1cGRhdGUnKSwKICAgICAgICAgICAgYmFkID0gcmVzdWx0LmJhZExvZ2ljOwogICAgICAgIGlmIChiYWQpIHsKICAgICAgICAgICAgJGxvZy5kZWJ1ZyhiYWQgKyAnOiAnICsgbGluay5pZCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgcmVzdWx0LnVwZGF0ZVdpdGgoZGF0YSk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVtb3ZlTGluayhkYXRhKSB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRtcy5maW5kTGluayhkYXRhLCAncmVtb3ZlJyk7CgogICAgICAgIGlmICghcmVzdWx0LmJhZExvZ2ljKSB7CiAgICAgICAgICAgIHJlc3VsdC5yZW1vdmVSYXdMaW5rKCk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHRvcG9TdGFydERvbmUoZGF0YSkgewogICAgICAgIC8vIGNhbGxlZCB3aGVuIHRoZSBpbml0aWFsIGJhcnJhZ2Ugb2YgZGF0YSBoYXMgYmVlbiBzZW50IGZyb20gc2VydmVyCiAgICAgICAgdXBsaW5rLnRvcG9TdGFydERvbmUoKTsKICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBmdW5jdGlvbiBub2RlQnlJZChpZCkgewogICAgICAgIHJldHVybiBsdVtpZF07CiAgICB9CgogICAgZnVuY3Rpb24gbWFrZU5vZGVLZXkobm9kZTEsIG5vZGUyKSB7CiAgICAgICAgcmV0dXJuIG5vZGUxICsgJy0nICsgbm9kZTI7CiAgICB9CgogICAgZnVuY3Rpb24gZmluZE5vZGVQYWlyKGtleSwga2V5UmV2KSB7CiAgICAgICAgaWYgKG5ldHdvcmsubGlua3NCeURldmljZVtrZXldKSB7CiAgICAgICAgICAgIHJldHVybiBrZXk7CiAgICAgICAgfSBlbHNlIGlmIChuZXR3b3JrLmxpbmtzQnlEZXZpY2Vba2V5UmV2XSkgewogICAgICAgICAgICByZXR1cm4ga2V5UmV2OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gYWdncmVnYXRlTGluayhsZGF0YSwgbGluaykgewogICAgICAgIHZhciBrZXkgPSBtYWtlTm9kZUtleShsaW5rLnNyYywgbGluay5kc3QpLAogICAgICAgICAgICBrZXlSZXYgPSBtYWtlTm9kZUtleShsaW5rLmRzdCwgbGluay5zcmMpLAogICAgICAgICAgICBmb3VuZCA9IGZpbmROb2RlUGFpcihrZXksIGtleVJldik7CgogICAgICAgIGlmIChmb3VuZCkgewogICAgICAgICAgICBuZXR3b3JrLmxpbmtzQnlEZXZpY2VbZm91bmRdLnB1c2gobGRhdGEpOwogICAgICAgICAgICBsZGF0YS5kZXZpY2VQYWlyID0gZm91bmQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbmV0d29yay5saW5rc0J5RGV2aWNlW2tleV0gPSBbIGxkYXRhIF07CiAgICAgICAgICAgIGxkYXRhLmRldmljZVBhaXIgPSBrZXk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGFkZExpbmtVcGRhdGUobGRhdGEsIGxpbmspIHsKICAgICAgICAvLyBhZGQgbGluayBldmVudCwgYnV0IHdlIGFscmVhZHkgaGF2ZSB0aGUgcmV2ZXJzZSBsaW5rIGluc3RhbGxlZAogICAgICAgIGxkYXRhLmZyb21UYXJnZXQgPSBsaW5rOwogICAgICAgIHJsa1tsaW5rLmlkXSA9IGxkYXRhLmtleTsKICAgICAgICAvLyBwb3NzaWJsZSBzb2x1dGlvbiB0byBlbCBiZWluZyB1bmRlZmluZWQgaW4gcmVzdHlsZUxpbmtFbGVtZW50OgogICAgICAgIC8vX3VwZGF0ZUxpbmtzKCk7CiAgICAgICAgcmVzdHlsZUxpbmtFbGVtZW50KGxkYXRhKTsKICAgIH0KCgogICAgdmFyIHdpZHRoUmF0aW8gPSAxLjQsCiAgICAgICAgbGlua1NjYWxlID0gZDMuc2NhbGUubGluZWFyKCkKICAgICAgICAgICAgLmRvbWFpbihbMSwgMTJdKQogICAgICAgICAgICAucmFuZ2UoW3dpZHRoUmF0aW8sIDEyICogd2lkdGhSYXRpb10pCiAgICAgICAgICAgIC5jbGFtcCh0cnVlKSwKICAgICAgICBhbGxMaW5rVHlwZXMgPSAnZGlyZWN0IGluZGlyZWN0IG9wdGljYWwgdHVubmVsJywKICAgICAgICBhbGxMaW5rU3ViVHlwZXMgPSAnaW5hY3RpdmUgbm90LXBlcm1pdHRlZCc7CgogICAgZnVuY3Rpb24gcmVzdHlsZUxpbmtFbGVtZW50KGxkYXRhLCBpbW1lZGlhdGUpIHsKICAgICAgICAvLyB0aGlzIGZuJ3Mgam9iIGlzIHRvIGxvb2sgYXQgcmF3IGxpbmtzIGFuZCBkZWNpZGUgd2hhdCBzdmcgY2xhc3NlcwogICAgICAgIC8vIG5lZWQgdG8gYmUgYXBwbGllZCB0byB0aGUgbGluZSBlbGVtZW50IGluIHRoZSBET00KICAgICAgICB2YXIgdGggPSB0cy50aGVtZSgpLAogICAgICAgICAgICBlbCA9IGxkYXRhLmVsLAogICAgICAgICAgICB0eXBlID0gbGRhdGEudHlwZSgpLAogICAgICAgICAgICBsdyA9IGxkYXRhLmxpbmtXaWR0aCgpLAogICAgICAgICAgICBvbmxpbmUgPSBsZGF0YS5vbmxpbmUoKSwKICAgICAgICAgICAgbW9kZUNscyA9IGxkYXRhLmV4cGVjdGVkKCkgPyAnaW5hY3RpdmUnIDogJ25vdC1wZXJtaXR0ZWQnLAogICAgICAgICAgICBkZWxheSA9IGltbWVkaWF0ZSA/IDAgOiAxMDAwOwoKICAgICAgICAvLyBGSVhNRTogdW5kZXJzdGFuZCB3aHkgZWwgaXMgc29tZXRpbWVzIHVuZGVmaW5lZCBvbiBhZGRMaW5rIGV2ZW50cy4uLgogICAgICAgIC8vIEludmVzdGlnYXRlZDoKICAgICAgICAvLyBlbCBpcyB1bmRlZmluZWQgd2hlbiBpdCdzIGEgcmV2ZXJzZSBsaW5rIHRoYXQgaXMgYmVpbmcgYWRkZWQuCiAgICAgICAgLy8gdXBkYXRlTGlua3MgKHdoaWNoIHNldHMgbGRhdGEuZWwpIGlzbid0IGNhbGxlZCBiZWZvcmUgdGhpcyBpcyBjYWxsZWQuCiAgICAgICAgLy8gQ2FsbGluZyBfdXBkYXRlTGlua3MgaW4gYWRkTGlua1VwZGF0ZSBmaXhlcyBpdCwgYnV0IHRoZXJlIG1pZ2h0IGJlCiAgICAgICAgLy8gYSBtb3JlIGVmZmljaWVudCB3YXkgdG8gZml4IGl0LgogICAgICAgIGlmIChlbCAmJiAhZWwuZW1wdHkoKSkgewogICAgICAgICAgICBlbC5jbGFzc2VkKCdsaW5rJywgdHJ1ZSk7CiAgICAgICAgICAgIGVsLmNsYXNzZWQoYWxsTGlua1N1YlR5cGVzLCBmYWxzZSk7CiAgICAgICAgICAgIGVsLmNsYXNzZWQobW9kZUNscywgIW9ubGluZSk7CiAgICAgICAgICAgIGVsLmNsYXNzZWQoYWxsTGlua1R5cGVzLCBmYWxzZSk7CiAgICAgICAgICAgIGlmICh0eXBlKSB7CiAgICAgICAgICAgICAgICBlbC5jbGFzc2VkKHR5cGUsIHRydWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsLnRyYW5zaXRpb24oKQogICAgICAgICAgICAgICAgLmR1cmF0aW9uKGRlbGF5KQogICAgICAgICAgICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIGxpbmtTY2FsZShsdykpCiAgICAgICAgICAgICAgICAuYXR0cignc3Ryb2tlJywgbGlua0NvbmZpZ1t0aF0uYmFzZUNvbG9yKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gcmVtb3ZlTGlua0VsZW1lbnQoZCkgewogICAgICAgIHZhciBpZHggPSBmcy5maW5kKGQua2V5LCBuZXR3b3JrLmxpbmtzLCAna2V5JyksCiAgICAgICAgICAgIHJlbW92ZWQ7CiAgICAgICAgaWYgKGlkeCA+PTApIHsKICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gbGlua3MgYXJyYXkKICAgICAgICAgICAgcmVtb3ZlZCA9IG5ldHdvcmsubGlua3Muc3BsaWNlKGlkeCwgMSk7CiAgICAgICAgICAgIC8vIHJlbW92ZSBmcm9tIGxvb2t1cCBjYWNoZQogICAgICAgICAgICBkZWxldGUgbHVbcmVtb3ZlZFswXS5rZXldOwogICAgICAgICAgICB1cGRhdGVMaW5rcygpOwogICAgICAgICAgICBmUmVzdW1lKCk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHJlbW92ZUhvc3RFbGVtZW50KGQsIHVwZCkgewogICAgICAgIC8vIGZpcnN0LCByZW1vdmUgYXNzb2NpYXRlZCBob3N0TGluay4uLgogICAgICAgIHJlbW92ZUxpbmtFbGVtZW50KGQubGlua0RhdGEpOwoKICAgICAgICAvLyByZW1vdmUgaG9zdExpbmsgYmluZGluZ3MKICAgICAgICBkZWxldGUgbHVbZC5pbmdyZXNzXTsKICAgICAgICBkZWxldGUgbHVbZC5lZ3Jlc3NdOwoKICAgICAgICAvLyByZW1vdmUgZnJvbSBsb29rdXAgY2FjaGUKICAgICAgICBkZWxldGUgbHVbZC5pZF07CiAgICAgICAgLy8gcmVtb3ZlIGZyb20gbm9kZXMgYXJyYXkKICAgICAgICB2YXIgaWR4ID0gZnMuZmluZChkLmlkLCBuZXR3b3JrLm5vZGVzKTsKICAgICAgICBuZXR3b3JrLm5vZGVzLnNwbGljZShpZHgsIDEpOwoKICAgICAgICAvLyByZW1vdmUgZnJvbSBTVkcKICAgICAgICAvLyBOT1RFOiB1cGQgaXMgZmFsc2UgaWYgd2Ugd2VyZSBjYWxsZWQgZnJvbSByZW1vdmVEZXZpY2VFbGVtZW50KCkKICAgICAgICBpZiAodXBkKSB7CiAgICAgICAgICAgIHVwZGF0ZU5vZGVzKCk7CiAgICAgICAgICAgIGZSZXN1bWUoKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gcmVtb3ZlRGV2aWNlRWxlbWVudChkKSB7CiAgICAgICAgdmFyIGlkID0gZC5pZCwKICAgICAgICAgICAgaWR4OwogICAgICAgIC8vIGZpcnN0LCByZW1vdmUgYXNzb2NpYXRlZCBob3N0cyBhbmQgbGlua3MuLgogICAgICAgIHRtcy5maW5kQXR0YWNoZWRIb3N0cyhpZCkuZm9yRWFjaChyZW1vdmVIb3N0RWxlbWVudCk7CiAgICAgICAgdG1zLmZpbmRBdHRhY2hlZExpbmtzKGlkKS5mb3JFYWNoKHJlbW92ZUxpbmtFbGVtZW50KTsKCiAgICAgICAgLy8gcmVtb3ZlIGZyb20gbG9va3VwIGNhY2hlCiAgICAgICAgZGVsZXRlIGx1W2lkXTsKICAgICAgICAvLyByZW1vdmUgZnJvbSBub2RlcyBhcnJheQogICAgICAgIGlkeCA9IGZzLmZpbmQoaWQsIG5ldHdvcmsubm9kZXMpOwogICAgICAgIGlmIChpZHggPiAtMSkgewogICAgICAgICAgICBuZXR3b3JrLm5vZGVzLnNwbGljZShpZHgsIDEpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFuZXR3b3JrLm5vZGVzLmxlbmd0aCkgewogICAgICAgICAgICB1cGxpbmsuc2hvd05vRGV2cyh0cnVlKTsKICAgICAgICB9CgogICAgICAgIC8vIHJlbW92ZSBmcm9tIFNWRwogICAgICAgIHVwZGF0ZU5vZGVzKCk7CiAgICAgICAgZlJlc3VtZSgpOwogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZUhvc3RWaXNpYmlsaXR5KCkgewogICAgICAgIHN1cy52aXNpYmxlKG5vZGVHLnNlbGVjdEFsbCgnLmhvc3QnKSwgc2hvd0hvc3RzKTsKICAgICAgICBzdXMudmlzaWJsZShsaW5rRy5zZWxlY3RBbGwoJy5ob3N0TGluaycpLCBzaG93SG9zdHMpOwogICAgICAgIHN1cy52aXNpYmxlKGxpbmtMYWJlbEcuc2VsZWN0QWxsKCcuaG9zdExpbmtMYWJlbCcpLCBzaG93SG9zdHMpOwogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZU9mZmxpbmVWaXNpYmlsaXR5KGRldikgewogICAgICAgIGZ1bmN0aW9uIHVwZERldihkLCBzaG93KSB7CiAgICAgICAgICAgIHZhciBiOwogICAgICAgICAgICBzdXMudmlzaWJsZShkLmVsLCBzaG93KTsKCiAgICAgICAgICAgIHRtcy5maW5kQXR0YWNoZWRMaW5rcyhkLmlkKS5mb3JFYWNoKGZ1bmN0aW9uIChsaW5rKSB7CiAgICAgICAgICAgICAgICBiID0gc2hvdyAmJiAoKGxpbmsudHlwZSgpICE9PSAnaG9zdExpbmsnKSB8fCBzaG93SG9zdHMpOwogICAgICAgICAgICAgICAgc3VzLnZpc2libGUobGluay5lbCwgYik7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0bXMuZmluZEF0dGFjaGVkSG9zdHMoZC5pZCkuZm9yRWFjaChmdW5jdGlvbiAoaG9zdCkgewogICAgICAgICAgICAgICAgYiA9IHNob3cgJiYgc2hvd0hvc3RzOwogICAgICAgICAgICAgICAgc3VzLnZpc2libGUoaG9zdC5lbCwgYik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgaWYgKGRldikgewogICAgICAgICAgICAvLyB1cGRhdGluZyBhIHNwZWNpZmljIGRldmljZSB0aGF0IGp1c3QgdG9nZ2xlZCBvZmYvb24tbGluZQogICAgICAgICAgICB1cGREZXYoZGV2LCBkZXYub25saW5lIHx8IHNob3dPZmZsaW5lKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyB1cGRhdGluZyBhbGwgb2ZmbGluZSBkZXZpY2VzCiAgICAgICAgICAgIHRtcy5maW5kRGV2aWNlcyh0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICB1cGREZXYoZCwgc2hvd09mZmxpbmUpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CgoKICAgIGZ1bmN0aW9uIHNlbmRVcGRhdGVNZXRhKGQsIGNsZWFyUG9zKSB7CiAgICAgICAgdmFyIG1ldGFVaSA9IHt9LAogICAgICAgICAgICBsbDsKCiAgICAgICAgLy8gaWYgd2UgYXJlIG5vdCBjbGVhcmluZyB0aGUgcG9zaXRpb24gZGF0YSAodW5waW5uaW5nKSwKICAgICAgICAvLyBhdHRhY2ggdGhlIHgsIHksIChhbmQgZXF1aXZhbGVudCBsb25naXR1ZGUsIGxhdGl0dWRlKS4uLgogICAgICAgIGlmICghY2xlYXJQb3MpIHsKICAgICAgICAgICAgbGwgPSB0bXMubG5nTGF0RnJvbUNvb3JkKFtkLngsIGQueV0pOwogICAgICAgICAgICBtZXRhVWkgPSB7CiAgICAgICAgICAgICAgICB4OiBkLngsCiAgICAgICAgICAgICAgICB5OiBkLnksCiAgICAgICAgICAgICAgICBlcXVpdkxvYzogewogICAgICAgICAgICAgICAgICAgIGxuZzogbGxbMF0sCiAgICAgICAgICAgICAgICAgICAgbGF0OiBsbFsxXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBkLm1ldGFVaSA9IG1ldGFVaTsKICAgICAgICB3c3Muc2VuZEV2ZW50KCd1cGRhdGVNZXRhJywgewogICAgICAgICAgICBpZDogZC5pZCwKICAgICAgICAgICAgY2xhc3M6IGQuY2xhc3MsCiAgICAgICAgICAgIG1lbWVudG86IG1ldGFVaQogICAgICAgIH0pOwogICAgfQoKCiAgICBmdW5jdGlvbiBta1N2Z0NsYXNzKGQpIHsKICAgICAgICByZXR1cm4gZC5maXhlZCA/IGQuc3ZnQ2xhc3MgKyAnIGZpeGVkJyA6IGQuc3ZnQ2xhc3M7CiAgICB9CgogICAgZnVuY3Rpb24gdmlzKGIpIHsKICAgICAgICByZXR1cm4gYiA/ICd2aXNpYmxlJyA6ICdoaWRkZW4nOwogICAgfQoKICAgIGZ1bmN0aW9uIHRvZ2dsZUhvc3RzKHgpIHsKICAgICAgICB2YXIga2V2ID0gKHggPT09ICdrZXlldicpLAogICAgICAgICAgICBvbiA9IGtldiA/ICFzaG93SG9zdHMgOiAhIXg7CgogICAgICAgIHNob3dIb3N0cyA9IG9uOwogICAgICAgIHVwZGF0ZUhvc3RWaXNpYmlsaXR5KCk7CiAgICAgICAgZmxhc2guZmxhc2goJ0hvc3RzICcgKyB2aXMob24pKTsKICAgICAgICByZXR1cm4gb247CiAgICB9CgogICAgZnVuY3Rpb24gdG9nZ2xlT2ZmbGluZSh4KSB7CiAgICAgICAgdmFyIGtldiA9ICh4ID09PSAna2V5ZXYnKSwKICAgICAgICAgICAgb24gPSBrZXYgPyAhc2hvd09mZmxpbmUgOiAhIXg7CgogICAgICAgIHNob3dPZmZsaW5lID0gb247CiAgICAgICAgdXBkYXRlT2ZmbGluZVZpc2liaWxpdHkoKTsKICAgICAgICBmbGFzaC5mbGFzaCgnT2ZmbGluZSBkZXZpY2VzICcgKyB2aXMob24pKTsKICAgICAgICByZXR1cm4gb247CiAgICB9CgogICAgZnVuY3Rpb24gY3ljbGVEZXZpY2VMYWJlbHMoKSB7CiAgICAgICAgZmxhc2guZmxhc2godGQzLmluY0RldkxhYkluZGV4KCkpOwogICAgICAgIHRtcy5maW5kRGV2aWNlcygpLmZvckVhY2goZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgdGQzLnVwZGF0ZURldmljZUxhYmVsKGQpOwogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIHVucGluKCkgewogICAgICAgIHZhciBob3YgPSB0c3MuaG92ZXJlZCgpOwogICAgICAgIGlmIChob3YpIHsKICAgICAgICAgICAgc2VuZFVwZGF0ZU1ldGEoaG92LCB0cnVlKTsKICAgICAgICAgICAgaG92LmZpeGVkID0gZmFsc2U7CiAgICAgICAgICAgIGhvdi5lbC5jbGFzc2VkKCdmaXhlZCcsIGZhbHNlKTsKICAgICAgICAgICAgZlJlc3VtZSgpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBzaG93TWFzdGVyc2hpcChtYXN0ZXJJZCkgewogICAgICAgIGlmICghbWFzdGVySWQpIHsKICAgICAgICAgICAgcmVzdG9yZUxheWVyU3RhdGUoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzaG93TWFzdGVyc2hpcEZvcihtYXN0ZXJJZCk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHJlc3RvcmVMYXllclN0YXRlKCkgewogICAgICAgIC8vIE5PVEU6IHRoaXMgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gcmVxdWlyZWQsIGZvciB3aGVuIHdlIGhhdmUKICAgICAgICAvLyAgICAgICAgICB0aGUgbGF5ZXIgZmlsdGVyIGZ1bmN0aW9uYWxpdHkgcmUtaW1wbGVtZW50ZWQKICAgICAgICBzdXBwcmVzc0xheWVycyhmYWxzZSk7CiAgICB9CgogICAgZnVuY3Rpb24gc2hvd01hc3RlcnNoaXBGb3IoaWQpIHsKICAgICAgICBzdXBwcmVzc0xheWVycyh0cnVlKTsKICAgICAgICBub2RlLmVhY2goZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgaWYgKG4ubWFzdGVyID09PSBpZCkgewogICAgICAgICAgICAgICAgbi5lbC5jbGFzc2VkKCdzdXBwcmVzc2VkbWF4JywgZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gc3VwQW10KGxlc3MpIHsKICAgICAgICByZXR1cm4gbGVzcyA/ICJzdXBwcmVzc2VkIiA6ICJzdXBwcmVzc2VkbWF4IjsKICAgIH0KCiAgICBmdW5jdGlvbiBzdXBwcmVzc0xheWVycyhiLCBsZXNzKSB7CiAgICAgICAgdmFyIGNscyA9IHN1cEFtdChsZXNzKTsKICAgICAgICBub2RlLmNsYXNzZWQoY2xzLCBiKTsKICAgICAgICBsaW5rLmNsYXNzZWQoY2xzLCBiKTsKICAgIH0KCiAgICBmdW5jdGlvbiB1bnN1cHByZXNzTm9kZShpZCwgbGVzcykgewogICAgICAgIHZhciBjbHMgPSBzdXBBbXQobGVzcyk7CiAgICAgICAgbm9kZS5lYWNoKGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgIGlmIChuLmlkID09PSBpZCkgewogICAgICAgICAgICAgICAgbi5lbC5jbGFzc2VkKGNscywgZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gdW5zdXBwcmVzc0xpbmsoa2V5LCBsZXNzKSB7CiAgICAgICAgdmFyIGNscyA9IHN1cEFtdChsZXNzKTsKICAgICAgICBsaW5rLmVhY2goZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgaWYgKG4ua2V5ID09PSBrZXkpIHsKICAgICAgICAgICAgICAgIG4uZWwuY2xhc3NlZChjbHMsIGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIHNob3dCYWRMaW5rcygpIHsKICAgICAgICB2YXIgYmFkTGlua3MgPSB0bXMuZmluZEJhZExpbmtzKCk7CiAgICAgICAgZmxhc2guZmxhc2goJ0JhZCBMaW5rczogJyArIGJhZExpbmtzLmxlbmd0aCk7CiAgICBz8e9WjdsJAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0a7BAAEAGPy3AqAc2wKgHYJbSH/U0h2MeU1FOfYAQDzMNlAAAAQEICgC3yOIAYg/Yc/HvVrPcCQB6PgAAej4AAGj3KB/SxQgAJ60eEwgARQA+bCjVQABABkPQwKgHYMCoBzYf9ZbSU1FOfTSHYx6AEAK3zkUAAAEBCAoAYg/YALfI2iAgICAkbG9nLmRlYnVnKCdCYWQgTGluayBMaXN0ICgnICsgYmFkTGlua3MubGVuZ3RoICsgJyk6Jyk7CiAgICAgICAgYmFkTGlua3MuZm9yRWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAkbG9nLmRlYnVnKCdiYWQgbGluazogKCcgKyBkLmJhZCArICcpICcgKyBkLmtleSwgZCk7CiAgICAgICAgICAgIGlmIChkLmVsKSB7CiAgICAgICAgICAgICAgICBkLmVsLmF0dHIoJ3N0cm9rZS13aWR0aCcsIGxpbmtTY2FsZSgyLjgpKQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCdzdHJva2UnLCAncmVkJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICAvLyBiYWNrIHRvIG5vcm1hbCBhZnRlciAyIHNlY29uZHMuLi4KICAgICAgICAkdGltZW91dCh1cGRhdGVMaW5rcywgMjAwMCk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVzZXRBbGxMb2NhdGlvbnMoKSB7CiAgICAgICAgdG1zLnJlc2V0QWxsTG9jYXRpb25zKCk7CiAgICAgICAgdXBkYXRlTm9kZXMoKTsKICAgICAgICB0aWNrKCk7IC8vIGZvcmNlIG5vZGVzIHRvIGJlIHJlZHJhd24gaW4gdGhlaXIgbmV3IGxvY2F0aW9ucwogICAgICAgIGZsYXNoLmZsYXNoKCdSZXNldCBOb2RlIExvY2F0aW9ucycpOwogICAgfQoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIGZ1bmN0aW9uIHVwZGF0ZU5vZGVzKCkgewogICAgICAgIGlmIChmTm9kZXNUaW1lcikgewogICAgICAgICAgICAkdGltZW91dC5jYW5jZWwoZk5vZGVzVGltZXIpOwogICAgICAgIH0KICAgICAgICBmTm9kZXNUaW1lciA9ICR0aW1lb3V0KF91cGRhdGVOb2RlcywgMTUwKTsKICAgIH0KCiAgICAvLyBJTVBMRU1FTlRBVElPTiBOT1RFOiBfdXBkYXRlTm9kZXMoKSBzaG91bGQgTk9UIHN0b3AsIHN0YXJ0LCBvciByZXN1bWUKICAgIC8vICB0aGUgZm9yY2UgbGF5b3V0OyB0aGF0IG5lZWRzIHRvIGJlIGRldGVybWluZWQgYW5kIGltcGxlbWVudGVkIGVsc2V3aGVyZQogICAgZnVuY3Rpb24gX3VwZGF0ZU5vZGVzKCkgewogICAgICAgIC8vIHNlbGVjdCBhbGwgdGhlIG5vZGVzIGluIHRoZSBsYXlvdXQ6CiAgICAgICAgbm9kZSA9IG5vZGVHLnNlbGVjdEFsbCgnLm5vZGUnKQogICAgICAgICAgICAuZGF0YShuZXR3b3JrLm5vZGVzLCBmdW5jdGlvbiAoZCkgeyByZXR1cm4gZC5pZDsgfSk7CgogICAgICAgIC8vIG9wZXJhdGUgb24gZXhpc3Rpbmcgbm9kZXM6CiAgICAgICAgbm9kZS5maWx0ZXIoJy5kZXZpY2UnKS5lYWNoKHRkMy5kZXZpY2VFeGlzdGluZyk7CiAgICAgICAgbm9kZS5maWx0ZXIoJy5ob3N0JykuZWFjaCh0ZDMuaG9zdEV4aXN0aW5nKTsKCiAgICAgICAgLy8gb3BlcmF0ZSBvbiBlbnRlcmluZyBub2RlczoKICAgICAgICB2YXIgZW50ZXJpbmcgPSBub2RlLmVudGVyKCkKICAgICAgICAgICAgLmFwcGVuZCgnZycpCiAgICAgICAgICAgIC5hdHRyKHsKICAgICAgICAgICAgICAgIGlkOiBmdW5jdGlvbiAoZCkgeyByZXR1cm4gc3VzLnNhZmVJZChkLmlkKTsgfSwKICAgICAgICAgICAgICAgIGNsYXNzOiBta1N2Z0NsYXNzLAogICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gZ3VhcmQgYWdhaW5zdCBOYU4gaGVyZSA/PwogICAgICAgICAgICAgICAgICAgIHJldHVybiBzdXMudHJhbnNsYXRlKGQueCwgZC55KTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBvcGFjaXR5OiAwCiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIC5jYWxsKGRyYWcpCiAgICAgICAgICAgIC5vbignbW91c2VvdmVyJywgdHNzLm5vZGVNb3VzZU92ZXIpCiAgICAgICAgICAgIC5vbignbW91c2VvdXQnLCB0c3Mubm9kZU1vdXNlT3V0KQogICAgICAgICAgICAudHJhbnNpdGlvbigpCiAgICAgICAgICAgIC5hdHRyKCdvcGFjaXR5JywgMSk7CgogICAgICAgIC8vIGF1Z21lbnQgZW50ZXJpbmcgbm9kZXM6CiAgICAgICAgZW50ZXJpbmcuZmlsdGVyKCcuZGV2aWNlJykuZWFjaCh0ZDMuZGV2aWNlRW50ZXIpOwogICAgICAgIGVudGVyaW5nLmZpbHRlcignLmhvc3QnKS5lYWNoKHRkMy5ob3N0RW50ZXIpOwoKICAgICAgICAvLyBvcGVyYXRlIG9uIGJvdGggZXhpc3RpbmcgYW5kIG5ldyBub2RlczoKICAgICAgICB0ZDMudXBkYXRlRGV2aWNlQ29sb3JzKCk7CgogICAgICAgIC8vIG9wZXJhdGUgb24gZXhpdGluZyBub2RlczoKICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIG5vZGUgaXMgcmVtb3ZlZCBhZnRlciAyIHNlY29uZHMuCiAgICAgICAgLy8gU3ViIGVsZW1lbnQgYW5pbWF0aW9ucyBzaG91bGQgYmUgc2hvcnRlciB0aGFuIDIgc2Vjb25kcy4KICAgICAgICB2YXIgZXhpdGluZyA9IG5vZGUuZXhpdCgpCiAgICAgICAgICAgIC50cmFuc2l0aW9uKCkKICAgICAgICAgICAgLmR1cmF0aW9uKDIwMDApCiAgICAgICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDApCiAgICAgICAgICAgIC5yZW1vdmUoKTsKCiAgICAgICAgLy8gZXhpdGluZyBub2RlIHNwZWNpZmljczoKICAgICAgICBleGl0aW5nLmZpbHRlcignLmhvc3QnKS5lYWNoKHRkMy5ob3N0RXhpdCk7CiAgICAgICAgZXhpdGluZy5maWx0ZXIoJy5kZXZpY2UnKS5lYWNoKHRkMy5kZXZpY2VFeGl0KTsKICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIGZ1bmN0aW9uIGdldERlZmF1bHRQb3MobGluaykgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHgxOiBsaW5rLnNvdXJjZS54LAogICAgICAgICAgICB5MTogbGluay5zb3VyY2UueSwKICAgICAgICAgICAgeDI6IGxpbmsudGFyZ2V0LngsCiAgICAgICAgICAgIHkyOiBsaW5rLnRhcmdldC55CiAgICAgICAgfTsKICAgIH0KCiAgICAvLyByZXR1cm5zIGFtb3VudCBvZiBhZGp1c3RtZW50IGFsb25nIHRoZSBub3JtYWwgZm9yIGdpdmVuIGxpbmsKICAgIGZ1bmN0aW9uIGFtdChudW1MaW5rcywgbGlua0lkeCkgewogICAgICAgIHZhciBnYXAgPSA2OwogICAgICAgIHJldHVybiAobGlua0lkeCAtICgobnVtTGlua3MgLSAxKSAvIDIpKSAqIGdhcDsKICAgIH0KCiAgICBmdW5jdGlvbiBjYWxjTW92ZW1lbnQoZCwgYW10LCBmbGlwcGVkKSB7CiAgICAgICAgdmFyIHBvcyA9IGdldERlZmF1bHRQb3MoZCksCiAgICAgICAgICAgIG11bHQgPSBmbGlwcGVkID8gLWFtdCA6IGFtdCwKICAgICAgICAgICAgZHggPSBwb3MueDIgLSBwb3MueDEsCiAgICAgICAgICAgIGR5ID0gcG9zLnkyIC0gcG9zLnkxLAogICAgICAgICAgICBsZW5ndGggPSBNYXRoLnNxcnQoKGR4ICogZHgpICsgKGR5ICogZHkpKTsKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgeDE6IHBvcy54MSArIChtdWx0ICogZHkgLyBsZW5ndGgpLAogICAgICAgICAgICB5MTogcG9zLnkxICsgKG11bHQgKiAtZHggLyBsZW5ndGgpLAogICAgICAgICAgICB4MjogcG9zLngyICsgKG11bHQgKiBkeSAvIGxlbmd0aCksCiAgICAgICAgICAgIHkyOiBwb3MueTIgKyAobXVsdCAqIC1keCAvIGxlbmd0aCkKICAgICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGNhbGNQb3NpdGlvbigpIHsKICAgICAgICB2YXIgbGluZXMgPSB0aGlzLAogICAgICAgICAgICBsaW5rU3JjSWQ7CiAgICAgICAgbGlua051bXMgPSBbXTsKICAgICAgICBsaW5lcy5lYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIGlmIChkLnR5cGUoKSA9PT0gJ2hvc3RMaW5rJykgewogICAgICAgICAgICAgICAgZC5wb3NpdGlvbiA9IGdldERlZmF1bHRQb3MoZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgZnVuY3Rpb24gbm9ybWFsaXplTGlua1NyYyhsaW5rKSB7CiAgICAgICAgICAgIC8vIGVuc3VyZSBzb3VyY2UgZGV2aWNlIGlzIGNvbnNpc3RlbnQgYWNyb3NzIHNldCBvZiBsaW5rcwogICAgICAgICAgICAvLyB0ZW1wb3JhcnkgbWVhc3VyZSB1bnRpbCBsaW5rIG1vZGVsaW5nIGlzIHJlZmFjdG9yZWQKICAgICAgICAgICAgaWYgKCFsaW5rU3JjSWQpIHsKICAgICAgICAgICAgICAgIGxpbmtTcmNJZCA9IGxpbmsuc291cmNlLmlkOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbGluay5zb3VyY2UuaWQgIT09IGxpbmtTcmNJZDsKICAgICAgICB9CgogICAgICAgIGFuZ3VsYXIuZm9yRWFjaChuZXR3b3JrLmxpbmtzQnlEZXZpY2UsIGZ1bmN0aW9uIChsaW5rQXJyLCBrZXkpIHsKICAgICAgICAgICAgdmFyIG51bUxpbmtzID0gbGlua0Fyci5sZW5ndGgsCiAgICAgICAgICAgICAgICBsaW5rOwoKICAgICAgICAgICAgaWYgKG51bUxpbmtzID09PSAxKSB7CiAgICAgICAgICAgICAgICBsaW5rID0gbGlua0FyclswXTsKICAgICAgICAgICAgICAgIGxpbmsucG9zaXRpb24gPSBnZXREZWZhdWx0UG9zKGxpbmspOwogICAgICAgICAgICAgICAgbGluay5wb3NpdGlvbi5tdWx0aUxpbmsgPSBmYWxzZTsKICAgICAgICAgICAgfSBlbHNlIGlmIChudW1MaW5rcyA+PSA1KSB7CiAgICAgICAgICAgICAgICAvLyB0aGlzIGNvZGUgaXMgaW5lZmZpY2llbnQsIGluIHRoZSBmdXR1cmUgdGhlIHdheSBsaW5rcwogICAgICAgICAgICAgICAgLy8gYXJlIG1vZGVsZWQgd2lsbCBiZSBjaGFuZ2VkCiAgICAgICAgICAgICAgICBhbmd1bGFyLmZvckVhY2gobGlua0FyciwgZnVuY3Rpb24gKGxpbmspIHsKICAgICAgICAgICAgICAgICAgICBsaW5rLnBvc2l0aW9uID0gZ2V0RGVmYXVsdFBvcyhsaW5rKTsKICAgICAgICAgICAgICAgICAgICBsaW5rLnBvc2l0aW9uLm11bHRpTGluayA9IHRydWU7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGxpbmtOdW1zLnB1c2goewogICAgICAgICAgICAgICAgICAgIGlkOiBrZXksCiAgICAgICAgICAgICAgICAgICAgbnVtOiBudW1MaW5rcywKICAgICAgICAgICAgICAgICAgICBsaW5rQ29vcmRzOiBsaW5rQXJyWzBdLnBvc2l0aW9uCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGxpbmtTcmNJZCA9IG51bGw7CiAgICAgICAgICAgICAgICBhbmd1bGFyLmZvckVhY2gobGlua0FyciwgZnVuY3Rpb24gKGxpbmssIGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9mZnNldEFtdCA9IGFtdChudW1MaW5rcywgaW5kZXgpLAogICAgICAgICAgICAgICAgICAgICAgICBuZWVkVG9GbGlwID0gbm9ybWFsaXplTGlua1NyYyhsaW5rKTsKICAgICAgICAgICAgICAgICAgICBsaW5rLnBvc2l0aW9uID0gY2FsY01vdmVtZW50KGxpbmssIG9mZnNldEFtdCwgbmVlZFRvRmxpcCk7CiAgICAgICAgICAgICAgICAgICAgbGluay5wb3NpdGlvbi5tdWx0aUxpbmsgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gdXBkYXRlTGlua3MoKSB7CiAgICAgICAgaWYgKGZMaW5rc1RpbWVyKSB7CiAgICAgICAgICAgICR0aW1lb3V0LmNhbmNlbChmTGlua3NUaW1lcik7CiAgICAgICAgfQogICAgICAgIGZMaW5rc1RpbWVyID0gJHRpbWVvdXQoX3VwZGF0ZUxpbmtzLCAxNTApOwogICAgfQoKICAgIC8vIElNUExFTUVOVEFUSU9OIE5PVEU6IF91cGRhdGVMaW5rcygpIHNob3VsZCBOT1Qgc3RvcCwgc3RhcnQsIG9yIHJlc3VtZQogICAgLy8gIHRoZSBmb3JjZSBsYXlvdXQ7IHRoYXQgbmVlZHMgdG8gYmUgZGV0ZXJtaW5lZCBhbmQgaW1wbGVtZW50ZWQgZWxzZXdoZXJlCiAgICBmdW5jdGlvbiBfdXBkYXRlTGlua3MoKSB7CiAgICAgICAgdmFyIHRoID0gdHMudGhlbWUoKTsKCiAgICAgICAgbGluayA9IGxpbmtHLnNlbGVjdEFsbCgnLmxpbmsnKQogICAgICAgICAgICAuZGF0YShuZXR3b3JrLmxpbmtzLCBmdW5jdGlvbiAoZCkgeyByZXR1cm4gZC5rZXk7IH0pOwoKICAgICAgICAvLyBvcGVyYXRlIG9uIGV4aXN0aW5nIGxpbmtzOgogICAgICAgIGxpbmsuZWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAvLyB0aGlzIGlzIHN1cHBvc2VkIHRvIGJlIGFuIGV4aXN0aW5nIGxpbmssIGJ1dCB3ZSBoYXZlIG9ic2VydmVkCiAgICAgICAgICAgIC8vICBvY2Nhc2lvbnMgKHdoZXJlIGxpbmtzIGFyZSBkZWxldGVkIGFuZCBhZGRlZCByYXBpZGx5Pykgd2hlcmUKICAgICAgICAgICAgLy8gIHRoZSBET00gZWxlbWVudCBoYXMgbm90IGJlZW4gZGVmaW5lZC4gU28gcHJvdGVjdCBhZ2FpbnN0IHRoYXQuLi4KICAgICAgICAgICAgaWYgKGQuZWwpIHsKICAgICAgICAgICAgICAgIHJlc3R5bGVMaW5rRWxlbWVudChkLCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICAvLyBvcGVyYXRlIG9uIGVudGVyaW5nIGxpbmtzOgogICAgICAgIHZhciBlbnRlcmluZyA9IGxpbmsuZW50ZXIoKQogICAgICAgICAgICAuYXBwZW5kKCdsaW5lJykKICAgICAgICAgICAgLmNhbGwoY2FsY1Bvc2l0aW9uKQogICAgICAgICAgICAuYXR0cih7CiAgICAgICAgICAgICAgICB4MTogZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGQucG9zaXRpb24ueDE7IH0sCiAgICAgICAgICAgICAgICB5MTogZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGQucG9zaXRpb24ueTE7IH0sCiAgICAgICAgICAgICAgICB4MjogZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGQucG9zaXRpb24ueDI7IH0sCiAgICAgICAgICAgICAgICB5MjogZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGQucG9zaXRpb24ueTI7IH0sCiAgICAgICAgICAgICAgICBzdHJva2U6IGxpbmtDb25maWdbdGhdLmluQ29sb3IsCiAgICAgICAgICAgICAgICAnc3Ryb2tlLXdpZHRoJzogbGlua0NvbmZpZy5pbldpZHRoCiAgICAgICAgICAgIH0pOwoKICAgICAgICAvLyBhdWdtZW50IGxpbmtzCiAgICAgICAgZW50ZXJpbmcuZWFjaCh0ZDMubGlua0VudGVyaW5nKTsKCiAgICAgICAgLy8gb3BlcmF0ZSBvbiBib3RoIGV4aXN0aW5nIGFuZCBuZXcgbGlua3M6CiAgICAgICAgLy9saW5rLmVhY2goLi4uKQoKICAgICAgICAvLyBhZGQgbGFiZWxzIGZvciBob3cgbWFueSBsaW5rcyBhcmUgaW4gYSB0aGljayBsaW5lCiAgICAgICAgdGQzLmFwcGx5TnVtTGlua0xhYmVscyhsaW5rTnVtcywgbnVtTGlua0xibHNHKTsKCiAgICAgICAgLy8gYXBwbHkgb3IgcmVtb3ZlIGxhYmVscwogICAgICAgIHRkMy5hcHBseUxpbmtMYWJlbHMoKTsKCiAgICAgICAgLy8gb3BlcmF0ZSBvbiBleGl0aW5nIGxpbmtzOgogICAgICAgIGxpbmsuZXhpdCgpCiAgICAgICAgICAgIC5hdHRyKCdzdHJva2UtZGFzaGFycmF5JywgJzMgMycpCiAgICAgICAgICAgIC5hdHRyKCdzdHJva2UnLCBsaW5rQ29uZmlnW3RoXS5vdXRDb2xvcikKICAgICAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMC41KQogICAgICAgICAgICAudHJhbnNpdGlvbigpCiAgICAgICAgICAgIC5kdXJhdGlvbigxNTAwKQogICAgICAgICAgICAuYXR0cih7CiAgICAgICAgICAgICAgICAnc3Ryb2tlLWRhc2hhcnJheSc6ICczIDEyJywKICAgICAgICAgICAgICAgICdzdHJva2Utd2lkdGgnOiBsaW5rQ29uZmlnLm91dFdpZHRoCiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDAuMCkKICAgICAgICAgICAgLnJlbW92ZSgpOwogICAgfQoKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gZm9yY2UgbGF5b3V0IHRpY2sgZnVuY3Rpb24KCiAgICBmdW5jdGlvbiBmUmVzdW1lKCkgewogICAgICAgIGlmICghdG9zLmlzT2JsaXF1ZSgpKSB7CiAgICAgICAgICAgIGZvcmNlLnJlc3VtZSgpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBmU3RhcnQoKSB7CiAgICAgICAgaWYgKCF0b3MuaXNPYmxpcXVlKCkpIHsKICAgICAgICAgICAgaWYgKGZUaW1lcikgewogICAgICAgICAgICAgICAgJHRpbWVvdXQuY2FuY2VsKGZUaW1lcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZlRpbWVyID0gJHRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgJGxvZy5kZWJ1ZygiU3RhcnRpbmcgZm9yY2UtbGF5b3V0Iik7CiAgICAgICAgICAgICAgICBmb3JjZS5zdGFydCgpOwogICAgICAgICAgICB9LCAyMDApOwogICAgICAgIH0KICAgIH0KCiAgICB2YXIgdGlja1N0dWZmID0gewogICAgICAgIG5vZGVBdHRyOiB7CiAgICAgICAgICAgIHRyYW5zZm9ybTogZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgIHZhciBkeCA9IGlzTmFOKGQueCkgPyAwIDogZC54LAogICAgICAgICAgICAgICAgICAgIGR5ID0gaXNOYU4oZC55KSA/IDAgOiBkLnk7CiAgICAgICAgICAgICAgICByZXR1cm4gc3VzLnRyYW5zbGF0ZShkeCwgZHkpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBsaW5rQXR0cjogewogICAgICAgICAgICB4MTogZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGQucG9zaXRpb24ueDE7IH0sCiAgICAgICAgICAgIHkxOiBmdW5jdGlvbiAoZCkgeyByZXR1cm4gZC5wb3NpdGlvbi55MTsgfSwKICAgICAgICAgICAgeDI6IGZ1bmN0aW9uIChkKSB7IHJldHVybiBkLnBvc2l0aW9uLngyOyB9LAogICAgICAgICAgICB5MjogZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGQucG9zaXRpb24ueTI7IH0KICAgICAgICB9LAogICAgICAgIGxpbmtMYWJlbEF0dHI6IHsKICAgICAgICAgICAgdHJhbnNmb3JtOiBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgdmFyIGxuayA9IHRtcy5maW5kTGlua0J5SWQoZC5rZXkpOwogICAgICAgICAgICAgICAgaWYgKGxuaykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZDMudHJhbnNmb3JtTGFiZWwobG5rLnBvc2l0aW9uKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gdGljaygpIHsKICAgICAgICAvLyBndWFyZCBhZ2FpbnN0IG51bGwgKHdoaWNoIGNhbiBoYXBwZW4gd2hlbiBvdXIgdmlldyBwYWdlcyBvdXQpLi4uCiAgICAgICAgaWYgKG5vZGUgJiYgbm9kZS5zaXplKCkpIHsKICAgICAgICAgICAgbm9kZS5hdHRyKHRpY2tTdHVmZi5ub2RlQXR0cik7CiAgICAgICAgfQogICAgICAgIGlmIChsaW5rICYmIGxpbmsuc2l6ZSgpKSB7CiAgICAgICAgICAgIGxpbmsuY2FsbChjYWxjUG9zaXRpb24pCiAgICAgICAgICAgICAgICAuYXR0cih0aWNrU3R1ZmYubGlua0F0dHIpOwogICAgICAgICAgICB0ZDMuYXBwbHlOdW1MaW5rTGFiZWxzKGxpbmtOdW1zLCBudW1MaW5rTGJsc0cpOwogICAgICAgIH0KICAgICAgICBpZiAobGlua0xhYmVsICYmIGxpbmtMYWJlbC5zaXplKCkpIHsKICAgICAgICAgICAgbGlua0xhYmVsLmF0dHIodGlja1N0dWZmLmxpbmtMYWJlbEF0dHIpOwogICAgICAgIH0KICAgIH0KCgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vID09PSBNT1VTRSBHRVNUVVJFIEhBTkRMRVJTCgogICAgZnVuY3Rpb24gem9vbWluZ09yUGFubmluZyhldikgewogICAgICAgIHJldHVybiBldi5tZXRhS2V5IHx8IGV2LmFsdEtleTsKICAgIH0KCiAgICBmdW5jdGlvbiBhdERyYWdFbmQoZCkgewogICAgICAgIC8vIG9uY2Ugd2UndmUgZmluaXNoZWQgbW92aW5nLCBwaW4gdGhlIG5vZGUgaW4gcG9zaXRpb24KICAgICAgICBkLmZpeGVkID0gdHJ1ZTsKICAgICAgICBkMy5zZWxlY3QodGhpcykuY2xhc3NlZCgnZml4ZWQnLCB0cnVlKTsKICAgICAgICBzZW5kVXBkYXRlTWV0YShkKTsKICAgICAgICB0c3MuY2xpY2tDb25zdW1lZCh0cnVlKTsKICAgIH0KCiAgICAvLyBwcmVkaWNhdGUgdGhhdCBpbmRpY2F0ZXMgd2hlbiBkcmFnZ2luZyBpcyBhY3RpdmUKICAgIGZ1bmN0aW9uIGRyYWdFbmFibGVkKCkgewogICAgICAgIHZhciBldiA9IGQzLmV2ZW50LnNvdXJjZUV2ZW50OwogICAgICAgIC8vIG5vZGVMb2NrIG1lYW5zIHdlIGFyZW4ndCBhbGxvd2luZyBub2RlcyB0byBiZSBkcmFnZ2VkLi4uCiAgICAgICAgcmV0dXJuICFub2RlTG9jayAmJiAhem9vbWluZ09yUGFubmluZyhldik7CiAgICB9CgogICAgLy8gcHJlZGljYXRlIHRoYXQgaW5kaWNhdGVzIHdoZW4gY2xpY2tpbmcgaXMgYWN0aXZlCiAgICBmdW5jdGlvbiBjbGlja0VuYWJsZWQoKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBmdW5jdGlvbiBlbnRyeSBwb2ludHMgZm9yIG92ZXJsYXkgbW9kdWxlCgogICAgLy8gVE9ETzogZmluZCBhbiBhdXRvbWF0aWMgd2F5IG9mIHRyYWNraW5nIHZpYSB0aGUgInNob3dIaWdobGlnaHRzIiBldmVudHMKICAgIHZhciBhbGxUcmFmZmljQ2xhc3NlcyA9ICdwcmltYXJ5IHNlY29uZGFyeSBvcHRpY2FsIGFuaW1hdGVkICcgKwogICAgICAgICdwb3J0LXRyYWZmaWMtS2JwcyBwb3J0LXRyYWZmaWMtTWJwcyBwb3J0LXRyYWZmaWMtR2JwcyAnICsKICAgICAgICAncG9ydC10cmFmZmljLUdicHMtY2hva2VkJzsKCiAgICBmdW5jdGlvbiBjbGVhckxpbmtUcmFmZmljU3R5bGUoKSB7CiAgICAgICAgbGluay5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgbnVsbCkKICAgICAgICAgICAgLmNsYXNzZWQoYWxsVHJhZmZpY0NsYXNzZXMsIGZhbHNlKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZW1vdmVMaW5rTGFiZWxzKCkgewogICAgICAgIG5ldHdvcmsubGlua3MuZm9yRWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgICAgICBkLmxhYmVsID0gJyc7CiAgICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gY2xlYXJOb2RlRGVjbygpIHsKICAgICAgICBub2RlLnNlbGVjdEFsbCgnZy5iYWRnZScpLnJlbW92ZSgpOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlbW92ZU5vZGVCYWRnZXMoKSB7CiAgICAgICAgbmV0d29yay5ub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIGQuYmFkZ2UgPSBudWxsOwogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZUxpbmtMYWJlbE1vZGVsKCkgewogICAgICAgIC8vIGNyZWF0ZSB0aGUgYmFja2luZyBkYXRhIGZvciBzaG93aW5nIGxhYmVscy4uCiAgICAgICAgdmFyIGRhdGEgPSBbXTsKICAgICAgICBsaW5rLmVhY2goZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgaWYgKGQubGFiZWwpIHsKICAgICAgICAgICAgICAgIGRhdGEucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdsYWItJyArIGQua2V5LAogICAgICAgICAgICAgICAgICAgIGtleTogZC5rZXksCiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGQubGFiZWwsCiAgICAgICAgICAgICAgICAgICAgbGRhdGE6IGQKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIGxpbmtMYWJlbCA9IGxpbmtMYWJlbEcuc2VsZWN0QWxsKCcubGlua0xhYmVsJykKICAgICAgICAgICAgLmRhdGEoZGF0YSwgZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGQuaWQ7IH0pOwogICAgfQoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBNb2R1bGUgZGVmaW5pdGlvbgoKICAgIGZ1bmN0aW9uIG1rTW9kZWxBcGkodXBsaW5rKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcHJvamVjdGlvbjogdXBsaW5rLnByb2plY3Rpb24sCiAgICAgICAgICAgIG5ldHdvcms6IG5ldHdvcmssCiAgICAgICAgICAgIHJlc3R5bGVMaW5rRWxlbWVudDogcmVzdHlsZUxpbmtFbGVtZW50LAogICAgICAgICAgICByZW1vdmVMaW5rRWxlbWVudDogcmVtb3ZlTGlua0VsZW1lbnQKICAgICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIG1rRDNBcGkoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbm9kZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gbm9kZTsgfSwKICAgICAgICAgICAgbGluazogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGluazsgfSwKICAgICAgICAgICAgbGlua0xhYmVsOiBmdW5jdGlvbiAoKSB7IHJldHVybiBsaW5rTGFiZWw7IH0sCiAgICAgICAgICAgIGluc3RWaXNpYmxlOiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aXMuaXNWaXNpYmxlKCk7IH0sCiAgICAgICAgICAgIHBvc05vZGU6IHRtcy5wb3NpdGlvbk5vZGUsCiAgICAgICAgICAgIHNob3dIb3N0czogZnVuY3Rpb24gKCkgeyByZXR1cm4gc2hvd0hvc3RzOyB9LAogICAgICAgICAgICByZXN0eWxlTGlua0VsZW1lbnQ6IHJlc3R5bGVMaW5rRWxlbWVudCwKICAgICAgICAgICAgdXBkYXRlTGlua0xhYmVsTW9kZWw6IHVwZGF0ZUxpbmtMYWJlbE1vZGVsLAogICAgICAgICAgICBsaW5rQ29uZmlnOiBmdW5jdGlvbiAoKSB7IHJldHVybiBsaW5rQ29uZmlnOyB9CiAgICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBta1NlbGVjdEFwaSgpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBub2RlOiBmdW5jdGlvbiAoKSB7IHJldHVybiBub2RlOyB9LAogICAgICAgICAgICB6b29taW5nT3JQYW5uaW5nOiB6b29taW5nT3JQYW5uaW5nLAogICAgICAgICAgICB1cGRhdGVEZXZpY2VDb2xvcnM6IHRkMy51cGRhdGVEZXZpY2VDb2xvcnMsCiAgICAgICAgICAgIGRlc2VsZWN0TGluazogdGxzLmRlc2VsZWN0TGluawogICAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gbWtUcmFmZmljQXBpKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGhvdmVyZWQ6IHRzcy5ob3ZlcmVkLAogICAgICAgICAgICBzb21ldGhpbmdTZWxlY3RlZDogdHNzLnNvbWV0aGluZ1NlbGVjdGVkLAogICAgICAgICAgICBzZWxlY3RPcmRlcjogdHNzLnNlbGVjdE9yZGVyCiAgICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBta092ZXJsYXlBcGkoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgY2xlYXJOb2RlRGVjbzogY2xlYXJOb2RlRGVjbywKICAgICAgICAgICAgcmVtb3ZlTm9kZUJhZGdlczogcmVtb3ZlTm9kZUJhZGdlcywKICAgICAgICAgICAgY2xlYXJMaW5rVHJhZmZpY1N0eWxlOiBjbGVhckxpbmtUcmFmZmljU3R5bGUsCiAgICAgICAgICAgIHJlbW92ZUxpbmtMYWJlbHM6IHJlbW92ZUxpbmtMYWJlbHMsCiAgICAgICAgICAgIGZpbmRMaW5rQnlJZDogdG1zLmZpbmRMaW5rQnlJZCwKICAgICAgICAgICAgZmluZE5vZGVCeUlkOiBub2RlQnlJZCwKICAgICAgICAgICAgdXBkYXRlTGlua3M6IHVwZGF0ZUxpbmtzLAogICAgICAgICAgICB1cGRhdGVOb2RlczogdXBkYXRlTm9kZXMsCiAgICAgICAgICAgIHN1cExheWVyczogc3VwcHJlc3NMYXllcnMsCiAgICAgICAgICAgIHVuc3VwTm9kZTogdW5zdXBwcmVzc05vZGUsCiAgICAgICAgICAgIHVuc3VwTGluazogdW5zdXBwcmVzc0xpbmsKICAgICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIG1rT2JsaXF1ZUFwaSh1cGxpbmssIGZsdHIpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBmb3JjZTogZnVuY3Rpb24oKSB7IHJldHVybiBmb3JjZTsgfSwKICAgICAgICAgICAgem9vbUxheWVyOiB1cGxpbmsuem9vbUxheWVyLAogICAgICAgICAgICBub2RlR0JCb3g6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbm9kZUcubm9kZSgpLmdldEJCb3goKTsgfSwKICAgICAgICAgICAgbm9kZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gbm9kZTsgfSwKICAgICAgICAgICAgbGluazogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGluazsgfSwKICAgICAgICAgICAgbGlua0xhYmVsOiBmdW5jdGlvbiAoKSB7IHJldHVybiBsaW5rTGFiZWw7IH0sCiAgICAgICAgICAgIG5vZGVzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXR3b3JrLm5vZGVzOyB9LAogICAgICAgICAgICB0aWNrU3R1ZmY6IHRpY2tTdHVmZiwKICAgICAgICAgICAgbm9kZUxvY2s6IGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICB2YXIgb2xkID0gbm9kZUxvY2s7CiAgICAgICAgICAgICAgICBub2RlTG9jayA9IGI7CiAgICAgICAgICAgICAgICByZXR1cm4gb2xkOwogICAgICAgICAgICB9LAogICAgICAgICAgICBvcGFjaWZ5TWFwOiB1cGxpbmsub3BhY2lmeU1hcCwKICAgICAgICAgICAgaW5MYXllcjogZmx0ci5pbkxheWVyLAogICAgICAgICAgICBjYWxjTGlua1BvczogY2FsY1Bvc2l0aW9uLAogICAgICAgICAgICBhcHBseU51bUxpbmtMYWJlbHM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHRkMy5hcHBseU51bUxpbmtMYWJlbHMobGlua051bXMsIG51bUxpbmtMYmxzRyk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIG1rRmlsdGVyQXBpKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIG5vZGU6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5vZGU7IH0sCiAgICAgICAgICAgIGxpbms6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGxpbms7IH0KICAgICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIG1rTGlua0FwaShzdmcsIHVwbGluaykgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHN2Zzogc3ZnLAogICAgICAgICAgICB6b29tZXI6IHVwbGluay56b29tZXIoKSwKICAgICAgICAgICAgbmV0d29yazogbmV0d29yaywKICAgICAgICAgICAgcG9ydExhYmVsRzogZnVuY3Rpb24gKCkgeyByZXR1cm4gcG9ydExhYmVsRzsgfSwKICAgICAgICAgICAgc2hvd0hvc3RzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBzaG93SG9zdHM7IH0KICAgICAgICB9OwogICAgfQoKICAgIGFuZ3VsYXIubW9kdWxlKCdvdlRvcG8nKQogICAgLmZhY3RvcnkoJ1RvcG9Gb3JjZVNlcnZpY2UnLAogICAgICAgIFsnJGxvZycsICckdGltZW91dCcsICdGblNlcnZpY2UnLCAnU3ZnVXRpbFNlcnZpY2UnLAogICAgICAgICAgICAnVGhlbWVTZXJ2aWNlJywgJ0ZsYXNoU2VydmljZScsICdXZWJTb2NrZXRTZXJ2aWNlJywKICAgICAgICAgICAgJ1RvcG9PdmVybGF5U2VydmljZScsICdUb3BvSW5zdFNlcnZpY2UnLCAnVG9wb01vZGVsU2VydmljZScsCiAgICAgICAgICAgICdUb3BvRDNTZXJ2aWNlJywgJ1RvcG9TZWxlY3RTZXJ2aWNlJywgJ1RvcG9UcmFmZmljU2VydmljZScsCiAgICAgICAgICAgICdUb3BvT2JsaXF1ZVNlcnZpY2UnLCAnVG9wb0ZpbHRlclNlcnZpY2UnLCAnVG9wb0xpbmtTZXJ2aWNlJywKCiAgICAgICAgZnVuY3Rpb24gKF8kbG9nXywgXyR0aW1lb3V0XywgX2ZzXywgX3N1c18sIF90c18sIF9mbGFzaF8sIF93c3NfLCBfdG92XywKICAgICAgICAgICAgICAgICAgX3Rpc18sIF90bXNfLCBfdGQzXywgX3Rzc18sIF90dHNfLCBfdG9zXywgX2ZsdHJfLCBfdGxzXykgewogICAgICAgICAgICAkbG9nID0gXyRsb2dfOwogICAgICAgICAgICAkdGltZW91dCA9IF8kdGltZW91dF87CiAgICAgICAgICAgIGZzID0gX2ZzXzsKICAgICAgICAgICAgc3VzID0gX3N1c187CiAgICAgICAgICAgIHRzID0gX3RzXzsKICAgICAgICAgICAgZmxhc2ggPSBfZmxhc2hfOwogICAgICAgICAgICB3c3MgPSBfd3NzXzsKICAgICAgICAgICAgdG92ID0gX3Rvdl87CiAgICAgICAgICAgIHRpcyA9IF90aXNfOwogICAgICAgICAgICB0bXMgPSBfdG1zXzsKICAgICAgICAgICAgdGQzID0gX3RkM187CiAgICAgICAgICAgIHRzcyA9IF90c3NfOwogICAgICAgICAgICB0dHMgPSBfdHRzXzsKICAgICAgICAgICAgdG9zID0gX3Rvc187CiAgICAgICAgICAgIGZsdHIgPSBfZmx0cl87CiAgICAgICAgICAgIHRscyA9IF90bHNfOwoKICAgICAgICAgICAgdmFyIHRoZW1lTGlzdGVuZXIgPSB0cy5hZGRMaXN0ZW5lcihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB1cGRhdGVMaW5rcygpOwogICAgICAgICAgICAgICAgdXBkYXRlTm9kZXMoKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBmb3JjZUcgaXMgdGhlIFNWRyBncm91cCB0byBkaXNwbGF5IHRoZSBmb3JjZSBsYXlvdXQgaW4KICAgICAgICAgICAgLy8gdXBsaW5rIGlzIHRoZSBhcGkgZnJvbSB0aGUgbWFpbiB0b3BvIHNvdXJjZSBmaWxlCiAgICAgICAgICAgIC8vIGRpbSBpcyB0aGUgaW5pdGlhbCBkaW1lbnNpb25zIG9mIHRoZSBTVkcgYXMgW3csaF0KICAgICAgICAgICAgLy8gb3B0cyBhcmUsIHdlbGwsIG9wdGlvbmFsIDopCiAgICAgICAgICAgIGZ1bmN0aW9uIGluaXRGb3JjZShfc3ZnXywgZm9yY2VHLCBfdXBsaW5rXywgX2RpbV8sIG9wdHMpIHsKICAgICAgICAgICAgICAgIHVwbGluayA9IF91cGxz8e9Wjd0JAEcEAABHBAAAaPcoH9LFCAAnrR4TCABFAAQ5KOBAAEAGffjAqAdgwKgHNh/1ltJTUYy1NIdjHoAYAreUEgAAAQEICgBiD9gAt8jiaW5rXzsKICAgICAgICAgICAgICAgIGRpbSA9IF9kaW1fOwogICAgICAgICAgICAgICAgc3ZnID0gX3N2Z187CgogICAgICAgICAgICAgICAgbHUgPSBuZXR3b3JrLmxvb2t1cDsKICAgICAgICAgICAgICAgIHJsayA9IG5ldHdvcmsucmV2TGlua1RvS2V5OwoKICAgICAgICAgICAgICAgICRsb2cuZGVidWcoJ2luaXRGb3JjZSgpLi4gZGltID0gJyArIGRpbSk7CgogICAgICAgICAgICAgICAgdG92LnNldEFwaShta092ZXJsYXlBcGkoKSwgdHNzKTsKICAgICAgICAgICAgICAgIHRtcy5pbml0TW9kZWwobWtNb2RlbEFwaSh1cGxpbmspLCBkaW0pOwogICAgICAgICAgICAgICAgdGQzLmluaXREMyhta0QzQXBpKCkpOwogICAgICAgICAgICAgICAgdHNzLmluaXRTZWxlY3QobWtTZWxlY3RBcGkoKSk7CiAgICAgICAgICAgICAgICB0dHMuaW5pdFRyYWZmaWMobWtUcmFmZmljQXBpKCkpOwogICAgICAgICAgICAgICAgdG9zLmluaXRPYmxpcXVlKG1rT2JsaXF1ZUFwaSh1cGxpbmssIGZsdHIpKTsKICAgICAgICAgICAgICAgIGZsdHIuaW5pdEZpbHRlcihta0ZpbHRlckFwaSgpKTsKICAgICAgICAgICAgICAgIHRscy5pbml0TGluayhta0xpbmtBcGkoc3ZnLCB1cGxpbmspLCB0ZDMpOwoKICAgICAgICAgICAgICAgIHNldHRpbmdzID0gYW5ndWxhci5leHRlbmQoe30sIGRlZmF1bHRTZXR0aW5ncywgb3B0cyk7CgogICAgICAgICAgICAgICAgbGlua0cgPSBmb3JjZUcuYXBwZW5kKCdnJykuYXR0cignaWQnLCAndG9wby1saW5rcycpOwogICAgICAgICAgICAgICAgbGlua0xhYmVsRyA9IGZvcmNlRy5hcHBlbmQoJ2cnKS5hdHRyKCdpZCcsICd0b3BvLWxpbmtMYWJlbHMnKTsKICAgICAgICAgICAgICAgIG51bUxpbmtMYmxzRyA9IGZvcmNlRy5hcHBlbmQoJ2cnKS5hdHRyKCdpZCcsICd0b3BvLW51bUxpbmtMYWJlbHMnKTsKICAgICAgICAgICAgICAgIG5vZGVHID0gZm9yY2VHLmFwcGVuZCgnZycpLmF0dHIoJ2lkJywgJ3RvcG8tbm9kZXMnKTsKICAgICAgICAgICAgICAgIHBvcnRMYWJlbEcgPSBmb3JjZUcuYXBwZW5kc/HvVgHfCQBmDQAAZg0AAGj3KB/SxQgAJ60eEwgARQANWCjhQABABnTYwKgHYMCoBzYf9ZbSU1GQujSHYx6AGAK3nTEAAAEBCAoAYg/YALfI4g0KRDFCDQooJ2cnKS5hdHRyKCdpZCcsICd0b3BvLXBvcnRMYWJlbHMnKTsKCiAgICAgICAgICAgICAgICBsaW5rID0gbGlua0cuc2VsZWN0QWxsKCcubGluaycpOwogICAgICAgICAgICAgICAgbGlua0xhYmVsID0gbGlua0xhYmVsRy5zZWxlY3RBbGwoJy5saW5rTGFiZWwnKTsKICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlRy5zZWxlY3RBbGwoJy5ub2RlJyk7CgogICAgICAgICAgICAgICAgZm9yY2UgPSBkMy5sYXlvdXQuZm9yY2UoKQogICAgICAgICAgICAgICAgICAgIC5zaXplKGRpbSkKICAgICAgICAgICAgICAgICAgICAubm9kZXMobmV0d29yay5ub2RlcykKICAgICAgICAgICAgICAgICAgICAubGlua3MobmV0d29yay5saW5rcykKICAgICAgICAgICAgICAgICAgICAuZ3Jhdml0eShzZXR0aW5ncy5ncmF2aXR5KQogICAgICAgICAgICAgICAgICAgIC5mcmljdGlvbihzZXR0aW5ncy5mcmljdGlvbikKICAgICAgICAgICAgICAgICAgICAuY2hhcmdlKHNldHRpbmdzLmNoYXJnZS5fZGVmXykKICAgICAgICAgICAgICAgICAgICAubGlua0Rpc3RhbmNlKHNldHRpbmdzLmxpbmtEaXN0YW5jZS5fZGVmXykKICAgICAgICAgICAgICAgICAgICAubGlua1N0cmVuZ3RoKHNldHRpbmdzLmxpbmtTdHJlbmd0aC5fZGVmXykKICAgICAgICAgICAgICAgICAgICAub24oJ3RpY2snLCB0aWNrKTsKCiAgICAgICAgICAgICAgICBkcmFnID0gc3VzLmNyZWF0ZURyYWdCZWhhdmlvcihmb3JjZSwKICAgICAgICAgICAgICAgICAgICB0c3Muc2VsZWN0T2JqZWN0LCBhdERyYWdFbmQsIGRyYWdFbmFibGVkLCBjbGlja0VuYWJsZWQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiBuZXdEaW0oX2RpbV8pIHsKICAgICAgICAgICAgICAgIGRpbSA9IF9kaW1fOwogICAgICAgICAgICAgICAgZm9yY2Uuc2l6ZShkaW0pOwogICAgICAgICAgICAgICAgdG1zLm5ld0RpbShkaW0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiBkZXN0cm95Rm9yY2UoKSB7CiAgICAgICAgICAgICAgICBmb3JjZS5zdG9wKCk7CgogICAgICAgICAgICAgICAgdGxzLmRlc3Ryb3lMaW5rKCk7CiAgICAgICAgICAgICAgICB0b3MuZGVzdHJveU9ibGlxdWUoKTsKICAgICAgICAgICAgICAgIHR0cy5kZXN0cm95VHJhZmZpYygpOwogICAgICAgICAgICAgICAgdHNzLmRlc3Ryb3lTZWxlY3QoKTsKICAgICAgICAgICAgICAgIHRkMy5kZXN0cm95RDMoKTsKICAgICAgICAgICAgICAgIHRtcy5kZXN0cm95TW9kZWwoKTsKICAgICAgICAgICAgICAgIC8vIG5vdGU6IG5vIG5lZWQgdG8gZGVzdHJveSBvdmVybGF5IHNlcnZpY2UKICAgICAgICAgICAgICAgIHRzLnJlbW92ZUxpc3RlbmVyKHRoZW1lTGlzdGVuZXIpOwogICAgICAgICAgICAgICAgdGhlbWVMaXN0ZW5lciA9IG51bGw7CgogICAgICAgICAgICAgICAgLy8gY2xlYW4gdXAgdGhlIERPTQogICAgICAgICAgICAgICAgc3ZnLnNlbGVjdEFsbCgnZycpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgc3ZnLnNlbGVjdEFsbCgnZGVmcycpLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgIC8vIGNsZWFuIHVwIGludGVybmFsIHN0YXRlCiAgICAgICAgICAgICAgICBuZXR3b3JrLm5vZGVzID0gW107CiAgICAgICAgICAgICAgICBuZXR3b3JrLmxpbmtzID0gW107CiAgICAgICAgICAgICAgICBuZXR3b3JrLmxpbmtzQnlEZXZpY2UgPSB7fTsKICAgICAgICAgICAgICAgIG5ldHdvcmsubG9va3VwID0ge307CiAgICAgICAgICAgICAgICBuZXR3b3JrLnJldkxpbmtUb0tleSA9IHt9OwoKICAgICAgICAgICAgICAgIGxpbmtOdW1zID0gW107CgogICAgICAgICAgICAgICAgbGlua0cgPSBsaW5rTGFiZWxHID0gbnVtTGlua0xibHNHID0gbm9kZUcgPSBwb3J0TGFiZWxHID0gbnVsbDsKICAgICAgICAgICAgICAgIGxpbmsgPSBsaW5rTGFiZWwgPSBub2RlID0gbnVsbDsKICAgICAgICAgICAgICAgIGZvcmNlID0gZHJhZyA9IG51bGw7CgogICAgICAgICAgICAgICAgLy8gY2xlYW4gdXAgJHRpbWVvdXQgcHJvbWlzZXMKICAgICAgICAgICAgICAgIGlmIChmVGltZXIpIHsKICAgICAgICAgICAgICAgICAgICAkdGltZW91dC5jYW5jZWwoZlRpbWVyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChmTm9kZXNUaW1lcikgewogICAgICAgICAgICAgICAgICAgICR0aW1lb3V0LmNhbmNlbChmTm9kZXNUaW1lcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZkxpbmtzVGltZXIpIHsKICAgICAgICAgICAgICAgICAgICAkdGltZW91dC5jYW5jZWwoZkxpbmtzVGltZXIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgaW5pdEZvcmNlOiBpbml0Rm9yY2UsCiAgICAgICAgICAgICAgICBuZXdEaW06IG5ld0RpbSwKICAgICAgICAgICAgICAgIGRlc3Ryb3lGb3JjZTogZGVzdHJveUZvcmNlLAoKICAgICAgICAgICAgICAgIHVwZGF0ZURldmljZUNvbG9yczogdGQzLnVwZGF0ZURldmljZUNvbG9ycywKICAgICAgICAgICAgICAgIHRvZ2dsZUhvc3RzOiB0b2dnbGVIb3N0cywKICAgICAgICAgICAgICAgIHRvZ2dsZVBvcnRzOiB0bHMudG9nZ2xlUG9ydHMsCiAgICAgICAgICAgICAgICB0b2dnbGVPZmZsaW5lOiB0b2dnbGVPZmZsaW5lLAogICAgICAgICAgICAgICAgY3ljbGVEZXZpY2VMYWJlbHM6IGN5Y2xlRGV2aWNlTGFiZWxzLAogICAgICAgICAgICAgICAgdW5waW46IHVucGluLAogICAgICAgICAgICAgICAgc2hvd01hc3RlcnNoaXA6IHNob3dNYXN0ZXJzaGlwLAogICAgICAgICAgICAgICAgc2hvd0JhZExpbmtzOiBzaG93QmFkTGlua3MsCgogICAgICAgICAgICAgICAgcmVzZXRBbGxMb2NhdGlvbnM6IHJlc2V0QWxsTG9jYXRpb25zLAogICAgICAgICAgICAgICAgYWRkRGV2aWNlOiBhZGREZXZpY2UsCiAgICAgICAgICAgICAgICB1cGRhdGVEZXZpY2U6IHVwZGF0ZURldmljZSwKICAgICAgICAgICAgICAgIHJlbW92ZURldmljZTogcmVtb3ZlRGV2aWNlLAogICAgICAgICAgICAgICAgYWRkSG9zdDogYWRkSG9zdCwKICAgICAgICAgICAgICAgIHVwZGF0ZUhvc3Q6IHVwZGF0ZUhvc3QsCiAgICAgICAgICAgICAgICBtb3ZlSG9zdDogbW92ZUhvc3QsCiAgICAgICAgICAgICAgICByZW1vdmVIb3N0OiByZW1vdmVIb3N0LAogICAgICAgICAgICAgICAgYWRkTGluazogYWRkTGluaywKICAgICAgICAgICAgICAgIHVwZGF0ZUxpbms6IHVwZGF0ZUxpbmssCiAgICAgICAgICAgICAgICByZW1vdmVMaW5rOiByZW1vdmVMaW5rLAogICAgICAgICAgICAgICAgdG9wb1N0YXJ0RG9uZTogdG9wb1N0YXJ0RG9uZQogICAgICAgICAgICB9OwogICAgICAgIH1dKTsKfSgpKTsKDQpz8e9Wit8JAEcAAABHAAAAaPcoH9LFCAAnrR4TCABFAAA5KORAAEAGgfTAqAdgwKgHNh/1ltJTUZ3eNIdjHoAYAreQEgAAAQEICgBiD9gAt8jiMA0KDQpz8e9WtuAJAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0a7FAAEAGPyzAqAc2wKgHYJbSH/U0h2MeU1Gd44AQDzO+LQAAAQEICgC3yOIAYg/Yc/HvVmHiCQCQAgAAkAIAAAgAJ60eE2j3KB/SxQgARQACgmuyQABABjzdwKgHNsCoB2CW0h/1NIdjHlNRneOAGA8zWgkAAAEBCAoAt8jiAGIP2EdFVCAvb25vcy91aS9hcHAvdmlldy90b3BvL3RvcG9QYW5lbC5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVhXjCQCcMAAAnDAAAGj3KB/SxQgAJ60eEwgARQAwjoFPQABABvkzwKgHYMCoBzYf9ZbUoa7BPUDd2bGAGAJ2wGcAAAEBCAoAYg/YALfI30hUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2phdmFzY3JpcHQNCkNvbnRlbnQtTGVuZ3RoOiAxMjI3Mg0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKgogKi8KCi8qCiBPTk9TIEdVSSAtLSBUb3BvbG9neSBPdmVybGF5IE1vZHVsZS4KCiBQcm92aWRlcyBvdmVybGF5IGNhcGFiaWxpdGllcywgYWxsb3dpbmcgT05PUyBhcHBzIHRvIHByb3ZpZGUgYWRkaXRpb25hbAogY3VzdG9tIGRhdGEvYmVoYXZpb3IgZm9yIHRoZSB0b3BvbG9neSB2aWV3LgoKICovCgooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIGNvbnN0YW50cwogICAgdmFyIHRvcyA9ICdUb3BvT3ZlcmxheVNlcnZpY2U6ICc7CgogICAgLy8gaW5qZWN0ZWQgcmVmcwogICAgdmFyICRsb2csICR0aW1lb3V0LCBmcywgZ3MsIHdzcywgbnMsIHRzcywgdHBzLCBhcGk7CgogICAgLy8gaW50ZXJuYWwgc3RhdGUKICAgIHZhciBvdmVybGF5cyA9IHt9LAogICAgICAgIGN1cnJlbnQgPSBudWxsLAogICAgICAgIHJlc2V0ID0gdHJ1ZTsKCiAgICBmdW5jdGlvbiBlcnJvcihmbiwgbXNnKSB7CiAgICAgICAgJGxvZy5lcnJvcih0b3MgKyBmbiArICcoKTogJyArIG1zZyk7CiAgICB9CgogICAgZnVuY3Rpb24gd2FybihmbiwgbXNnKSB7CiAgICAgICAgJGxvZy53YXJuKHRvcyArIGZuICsgJygpOiAnICsgbXNnKTsKICAgIH0KCiAgICBmdW5jdGlvbiBta0dseXBoSWQob2lkLCBnaWQpIHsKICAgICAgICByZXR1cm4gKGdpZFswXSA9PT0gJyonKSA/IG9pZCArICctJyArIGdpZC5zbGljZSgxKSA6IGdpZDsKICAgIH0KCiAgICBmdW5jdGlvbiBoYW5kbGVHbHlwaHMobykgewogICAgICAgIHZhciBnZGF0YSA9IGZzLmlzTyhvLmdseXBocyksCiAgICAgICAgICAgIG9pZCA9IG8ub3ZlcmxheUlkLAogICAgICAgICAgICBnaWQgPSBvLmdseXBoSWQgfHwgJ3Vua25vd24nLAogICAgICAgICAgICBkYXRhID0ge30sCiAgICAgICAgICAgIG5vdGUgPSBbXTsKCiAgICAgICAgby5fZ2x5cGhJZCA9IG1rR2x5cGhJZChvaWQsIGdpZCk7CgogICAgICAgIG8ubWtHaWQgPSBmdW5jdGlvbiAoZykgewogICAgICAgICAgICByZXR1cm4gbWtHbHlwaElkKG9pZCwgZyk7CiAgICAgICAgfTsKICAgICAgICBvLm1rSWQgPSBmdW5jdGlvbiAocykgewogICAgICAgICAgICByZXR1cm4gb2lkICsgJy0nICsgczsKICAgICAgICB9OwoKICAgICAgICAvLyBwcm9jZXNzIGdseXBocyBpZiBkZWZpbmVkCiAgICAgICAgaWYgKGdkYXRhKSB7CiAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaChnZGF0YSwgZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHsKICAgICAgICAgICAgICAgIHZhciBmdWxsa2V5ID0gb2lkICsgJy0nICsga2V5OwogICAgICAgICAgICAgICAgZGF0YVsnXycgKyBmdWxsa2V5XSA9IHZhbHVlLnZiOwogICAgICAgICAgICAgICAgZGF0YVtmdWxsa2V5XSA9IHZhbHVlLmQ7CiAgICAgICAgICAgICAgICBub3RlLnB1c2goJyonICsga2V5KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGdzLnJlZ2lzdGVyR2x5cGhzKGRhdGEpOwogICAgICAgICAgICAkbG9nLmRlYnVnKCdyZWdpc3RlcmVkIG92ZXJsYXkgZ2x5cGhzOicsIG9pZCwgbm90ZSk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHJlZ2lzdGVyKG92ZXJsYXkpIHsKICAgICAgICB2YXIgciA9ICdyZWdpc3RlcicsCiAgICAgICAgICAgIG92ZXIgPSBmcy5pc08ob3ZlcmxheSksCiAgICAgICAgICAgIGtiID0gb3ZlciA/IGZzLmlzTyhvdmVybGF5LmtleUJpbmRpbmdzKSA6IG51bGwsCiAgICAgICAgICAgIGlkID0gb3ZlciA/IG92ZXIub3ZlcmxheUlkIDogJyc7CgogICAgICAgIGlmICghaWQpIHsKICAgICAgICAgICAgcmV0dXJuIGVycm9yKHIsICdub3QgYSByZWNvZ25pemVkIG92ZXJsYXknKTsKICAgICAgICB9CiAgICAgICAgaWYgKG92ZXJsYXlzW2lkXSkgewogICAgICAgICAgICByZXR1cm4gd2FybihyLCAnYWxyZWFkeSByZWdpc3RlcmVkOiAiJyArIGlkICsgJyInKTsKICAgICAgICB9CiAgICAgICAgb3ZlcmxheXNbaWRdID0gb3ZlcmxheTsKICAgICAgICBoYW5kbGVHbHlwaHMob3ZlcmxheSk7CgogICAgICAgIGlmIChrYikgewogICAgICAgICAgICBpZiAoIWZzLmlzQShrYi5fa2V5T3JkZXIpKSB7CiAgICAgICAgICAgICAgICB3YXJuKHIsICdubyBfa2V5T3JkZXIgYXJyYXkgZGVmaW5lZCBvbiBrZXlCaW5kaW5ncycpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAga2IuX2tleU9yZGVyLmZvckVhY2goZnVuY3Rpb24gKGspIHsKICAgICAgICAgICAgICAgICAgICBpZiAoayAhPT0gJy0nICYmICFrYltrXSkgewogICAgICAgICAgICAgICAgICAgICAgICB3YXJuKHIsICdubyAiJyArIGsgKyAnIiBwcm9wZXJ0eSBkZWZpbmVkIG9uIGtleUJpbmRpbmdzJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRsb2cuZGVidWcodG9zICsgJ3JlZ2lzdGVyZWQgb3ZlcmxheTogJyArIGlkLCBvdmVybGF5KTsKICAgIH0KCiAgICAvLyByZXR1cm5zIHRoZSBsaXN0IG9mIG92ZXJsYXkgaWRlbnRpZmllcnMKICAgIGZ1bmN0aW9uIGxpc3QoKSB7CiAgICAgICAgcmV0dXJuIGQzLm1hcChvdmVybGF5cykua2V5cygpOwogICAgfQoKICAgIC8vIGFkZCBhIHJhZGlvIGJ1dHRvbiBmb3IgZWFjaCByZWdpc3RlcmVkIG92ZXJsYXkKICAgIC8vIHJldHVybiBhbiBvdmVybGF5IGlkIHRvIGluZGV4IG1hcAogICAgZnVuY3Rpb24gYXVnbWVudFJic2V0KHJzZXQsIHN3aXRjaEZuKSB7CiAgICAgICAgdmFyIG1hcCA9IHt9LAogICAgICAgICAgICBpZHggPSAxOwoKICAgICAgICBhbmd1bGFyLmZvckVhY2gob3ZlcmxheXMsIGZ1bmN0aW9uIChvdikgewogICAgICAgICAgICByc2V0LnB1c2goewogICAgICAgICAgICAgICAgZ2lkOiBvdi5fZ2x5cGhJZCwKICAgICAgICAgICAgICAgIHRvb2x0aXA6IChvdi50b29sdGlwIHx8ICcobm8gdG9vbHRpcCknKSwKICAgICAgICAgICAgICAgIGNiOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdGJTZWxlY3Rpb24ob3Yub3ZlcmxheUlkLCBzd2l0Y2hGbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBtYXBbb3Yub3ZlcmxheUlkXSA9IGlkeCsrOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBtYXA7CiAgICB9CgogICAgLy8gYW4gb3ZlcmxheSB3YXMgc2VsZWN0ZWQgdmlhIHRvb2xiYXIgcmFkaW8gYnV0dG9uIHByZXNzIGZyb20gdXNlcgogICAgZnVuY3Rpb24gdGJTZWxlY3Rpb24oaWQsIHN3aXRjaEZuKSB7CiAgICAgICAgdmFyIHNhbWUgPSBjdXJyZW50ICYmIGN1cnJlbnQub3ZlcmxheUlkID09PSBpZCwKICAgICAgICAgICAgcGF5bG9hZCA9IHt9LAogICAgICAgICAgICBhY3Rpb25zOwoKICAgICAgICBmdW5jdGlvbiBkb29wKG9wKSB7CiAgICAgICAgICAgIHZhciBvaWQgPSBjdXJyZW50Lm92ZXJsYXlJZDsKICAgICAgICAgICAgJGxvZy5kZWJ1ZygnT3ZlcmxheTonLCBvcCwgb2lkKTsKICAgICAgICAgICAgY3VycmVudFtvcF0oKTsKICAgICAgICAgICAgcGF5bG9hZFtvcF0gPSBvaWQ7CiAgICAgICAgfQoKICAgICAgICBpZiAocmVzZXQgfHwgIXNhbWUpIHsKICAgICAgICAgICAgcmVzZXQgPSBmYWxzZTsKICAgICAgICAgICAgY3VycmVudCAmJiBkb29wKCdkZWFjdGl2YXRlJyk7CiAgICAgICAgICAgIGN1cnJlbnQgPSBvdmVybGF5c1tpZF07CiAgICAgICAgICAgIGN1cnJlbnQgJiYgZG9vcCgnYWN0aXZhdGUnKTsKICAgICAgICAgICAgYWN0aW9ucyA9IGN1cnJlbnQgJiYgZnMuaXNPKGN1cnJlbnQua2V5QmluZGluZ3MpOwogICAgICAgICAgICBzd2l0Y2hGbihpZCwgYWN0aW9ucyk7CgogICAgICAgICAgICB3c3Muc2VuZEV2ZW50KCd0b3BvU2VsZWN0T3ZlcmxheScsIHBheWxvYWQpOwoKICAgICAgICAgICAgLy8gRW5zdXJlIHN1bW1hcnkgYW5kIGRldGFpbHMgcGFuZWxzIGFyZSB1cGRhdGVkIGltbWVkaWF0ZWx5Li4KICAgICAgICAgICAgd3NzLnNlbmRFdmVudCgncmVxdWVzdFN1bW1hcnknKTsKICAgICAgICAgICAgdHNzLnVwZGF0ZURldGFpbCgpOwogICAgICAgIH0KICAgIH0KCiAgICB2YXIgY29yZUJ1dHRvbnMgPSB7CiAgICAgICAgc2hvd0RldmljZVZpZXc6IHsKICAgICAgICAgICAgZ2lkOiAnc3dpdGNoJywKICAgICAgICAgICAgdHQ6ICdTaG93IERldmljZSBWaWV3JywKICAgICAgICAgICAgcGF0aDogJ2RldmljZScKICAgICAgICB9LAogICAgICAgIHNob3dGbG93VmlldzogewogICAgICAgICAgICBnaWQ6ICdmbG93VGFibGUnLAogICAgICAgICAgICB0dDogJ1Nob3cgRmxvdyBWaWV3IGZvciB0aGlzIERldmljZScsCiAgICAgICAgICAgIHBhdGg6ICdmbG93JwogICAgICAgIH0sCiAgICAgICAgc2hvd1BvcnRWaWV3OiB7CiAgICAgICAgICAgIGdpZDogJ3BvcnRUYWJsZScsCiAgICAgICAgICAgIHR0OiAnU2hvdyBQb3J0IFZpZXcgZm9yIHRoaXMgRGV2aWNlJywKICAgICAgICAgICAgcGF0aDogJ3BvcnQnCiAgICAgICAgfSwKICAgICAgICBzaG93R3JvdXBWaWV3OiB7CiAgICAgICAgICAgIGdpZDogJ2dyb3VwVGFibGUnLAogICAgICAgICAgICB0dDogJ1Nob3cgR3JvdXAgVmlldyBmb3IgdGhpcyBEZXZpY2UnLAogICAgICAgICAgICBwYXRoOiAnZ3JvdXAnCiAgICAgICAgfSwKICAgICAgICBzaG93TWV0ZXJWaWV3OiB7CiAgICAgICAgICAgIGdpZDogJ21ldGVyVGFibGUnLAogICAgICAgICAgICB0dDogJ1Nob3cgTWV0ZXIgVmlldyBmb3IgdGhpcyBEZXZpY2UnLAogICAgICAgICAgICBwYXRoOiAnbWV0ZXInCiAgICAgICAgfQogICAgfTsKCiAgICAvLyByZXRyaWV2ZXMgYSBidXR0b24gZGVmaW5pdGlvbiBmcm9tIHRoZSBjdXJyZW50IG92ZXJsYXkgYW5kIGdlbmVyYXRlcwogICAgLy8gIGEgYnV0dG9uIGRlc2NyaXB0b3IgdG8gYmUgYWRkZWQgdG8gdGhlIHBhbmVsLCB3aXRoIHRoZSBkYXRhIGJha2VkIGluCiAgICBmdW5jdGlvbiBfZ2V0QnV0dG9uRGVmKGlkLCBkYXRhKSB7CiAgICAgICAgdmFyIGJ0bnMgPSBjdXJyZW50ICYmIGN1cnJlbnQuYnV0dG9ucywKICAgICAgICAgICAgYiA9IGJ0bnMgJiYgYnRuc1tpZF0sCiAgICAgICAgICAgIGNiID0gZnMuaXNGKGIuY2IpLAogICAgICAgICAgICBmID0gY2IgPyBmdW5jdGlvbiAoKSB7IGNiKGRhdGEpOyB9IDogZnVuY3Rpb24gKCkge307CgogICAgICAgIHJldHVybiBiID8gewogICAgICAgICAgICBpZDogY3VycmVudC5ta0lkKGlkKSwKICAgICAgICAgICAgZ2lkOiBjdXJyZW50Lm1rR2lkKGIuZ2lkKSwKICAgICAgICAgICAgdHQ6IGIudHQsCiAgICAgICAgICAgIGNiOiBmCiAgICAgICAgfSA6IG51bGw7CiAgICB9CgogICAgLy8gaW5zdGFsbCBjb3JlIGJ1dHRvbnMsIGFuZCBpbmNsdWRlIGFueSBhZGRpdGlvbmFsIGZyb20gdGhlIGN1cnJlbnQgb3ZlcmxheQogICAgZnVuY3Rpb24gaW5zdGFsbEJ1dHRvbnMoYnV0dG9ucywgZGF0YSwgZGV2SWQpIHsKICAgICAgICBidXR0b25zLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7CiAgICAgICAgICAgIHZhciBidG4gPSBjb3JlQnV0dG9uc1tpZF0sCiAgICAgICAgICAgICAgICBnaWQgPSBidG4gJiYgYnRuLmdpZCwKICAgICAgICAgICAgICAgIHR0ID0gYnRuICYmIGJ0bi50dCwKICAgICAgICAgICAgICAgIHBhdGggPSBidG4gJiYgYnRuLnBhdGg7CgogICAgICAgICAgICBpZiAoYnRuKSB7CiAgICAgICAgICAgICAgICB0cHMuYWRkQWN0aW9uKHsKICAgICAgICAgICAgICAgICAgICBpZDogJ2NvcmUtJyArIGlkLAogICAgICAgICAgICAgICAgICAgIGdpZDogZ2lkLAogICAgICAgICAgICAgICAgICAgIHR0OiB0dCwKICAgICAgICAgICAgICAgICAgICBjYjogZnVuY3Rpb24gKCkgeyBucy5uYXZUbyhwYXRoLCB7ZGV2SWQ6IGRldklkIH0pOyB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSBlbHNlIGlmIChidG4gPSBfZ2V0QnV0dG9uRGVmKGlkLCBkYXRhKSkgewogICAgICAgICAgICAgICAgdHBzLmFkZEFjdGlvbihidG4pOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gYWRkRGV0YWlsQnV0dG9uKGlkKSB7CiAgICAgICAgdmFyIGIgPSBfZ2V0QnV0dG9uRGVmKGlkKTsKICAgICAgICBpZiAoYikgewogICAgICAgICAgICB0cHMuYWRkQWN0aW9uKHsKICAgICAgICAgICAgICAgIGlkOiBjdXJyZW50Lm1rSWQoaWQpLAogICAgICAgICAgICAgICAgZ2lkOiBjdXJyZW50Lm1rR2lkKGIuZ2lkKSwKICAgICAgICAgICAgICAgIGNiOiBiLmNiLAogICAgICAgICAgICAgICAgdHQ6IGIudHQKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfQoKCiAgICAvLyA9PT0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vICBIb29rcyBmb3Igb3ZlcmxheXMKCiAgICBmdW5jdGlvbiBfaG9vayh4KSB7CiAgICAgICAgdmFyIGggPSBjdXJyZW50ICYmIGN1cnJlbnQuaG9va3M7CiAgICAgICAgcmV0dXJuIGggJiYgZnMuaXNGKGhbeF0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGVzY2FwZUhvb2soKSB7CiAgICAgICAgdmFyIGVoID0gX2hvb2soJ2VzY2FwZScpOwogICAgICAgIHJldHVybiBlaCA/IGVoKCkgOiBmYWxzZTsKICAgIH0KCiAgICBmdW5jdGlvbiBlbXB0eVNlbGVjdEhvb2soKSB7CiAgICAgICAgdmFyIGNiID0gX2hvb2soJ2VtcHR5Jyk7CiAgICAgICAgY2IgJiYgY2IoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzaW5nbGVTZWxlY3RIb29rKGRhdGEpIHsKICAgICAgICB2YXIgY2IgPSBfaG9vaygnc2luZ2xlJyk7CiAgICAgICAgY2IgJiYgY2IoZGF0YSk7CiAgICB9CgogICAgZnVuY3Rpb24gbXVsdGlTZWxlY3RIb29rKHNlbGVjdE9yZGVyKSB7CiAgICAgICAgdmFyIGNiID0gX2hvb2soJ211bHRpJyk7CiAgICAgICAgY2IgJiYgY2Ioc2VsZWN0T3JkZXIpOwogICAgfQoKICAgIGZ1bmN0aW9uIG1vdXNlT3Zlckhvb2sod2hhdCkgewogICAgICAgIHZhciBjYiA9IF9ob29rKCdtb3VzZW92ZXInKTsKICAgICAgICBjYiAmJiBjYih3aGF0KTsKICAgIH0KCiAgICBmdW5jdGlvbiBtb3VzZU91dEhvb2soKSB7CiAgICAgICAgdmFyIGNiID0gX2hvb2soJ21vdXNlb3V0Jyk7CiAgICAgICAgY2IgJiYgY2IoKTsKICAgIH0KCiAgICAvLyA9PT0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vICBFdmVudCAoZnJvbSBzZXJ2ZXIpIEhhbmRsZXJzCgogICAgZnVuY3Rpb24gc2V0QXBpKF9hcGlfLCBfdHNzXykgewogICAgICAgIGFwaSA9IF9hcGlfOwogICAgICAgIHRzcyA9IF90c3NfOwogICAgfQoKICAgIC8vcHJvY2VzcyBoaWdobGlnaHQgZXZlbnQgd2l0aCBvcHRpb25hbCBkZWxheQogICAgZnVuY3Rpb24gc2hvd0hpZ2hsaWdodHMoZGF0YSkgewogICAgICAgIGZ1bmN0aW9uIGRvSGlnaGxpZ2h0KCkgewogICAgICAgICAgICBfc2hvd0hpZ2hsaWdodHMoZGF0YSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoZGF0YS5kZWxheSkgewogICAgICAgICAgICAkdGltZW91dChkb0hpZ2hsaWdodCwgZGF0YS5kZWxheSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZG9IaWdobGlnaHQoKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gX3Nob3dIaWdobGlnaHRzKGRhdGEpIHsKICAgICAgICB2YXIgbGVzczsKCiAgICAgICAgLyoKICAgICAgICAgICBBUEkgdG8gdG9wb0ZvcmNlCiAgICAgICAgICAgICBjbGVhckxpbmtUcmFmZmljU3R5bGUoKQogICAgICAgICAgICAgcmVtb3ZlTGlua0xhYmVscygpCiAgICAgICAgICAgICBmaW5kTGlua0J5SWQoIGlkICkKICAgICAgICAgICAgIGZpbmROb2RlQnlJZCggaWQgKQogICAgICAgICAgICAgdXBkYXRlTGlua3MoKQogICAgICAgICAgICAgdXBkYXRlTm9kZXMoKQogICAgICAgICAgICAgc3VwTGF5ZXJzKCBib29sLCBbbGVzc10gKQogICAgICAgICAgICAgdW5zdXBOb2RlKCBpZCwgW2xlc3NdICkKICAgICAgICAgICAgIHVuc3VwTGluaygga2V5LCBbbGVzc10gKQogICAgICAgICAqLwoKICAgICAgICBhcGkuY2xlYXJOb2RlRGVjbygpOwogICAgICAgIGFwaS5yZW1vdmVOb2RlQmFkZ2VzKCk7CiAgICAgICAgYXBpLmNsZWFyTGlua1RyYWZmaWNTdHlsZSgpOwogICAgICAgIGFwaS5yZW1vdmVMaW5rTGFiZWxzKCk7CgogICAgICAgIC8vIGhhbmRsZSBlbGVtZW50IHN1cHByZXNzaW9uCiAgICAgICAgaWYgKGRhdGEuc3ViZHVlKSB7CiAgICAgICAgICAgIGxlc3MgPSBkYXRhLnN1YmR1ZSA9PT0gJ21pbic7CiAgICAgICAgICAgIGFwaS5zdXBMYXllcnModHJ1ZSwgbGVzcyk7CgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGFwaS5zdXBMYXllcnMoZmFsc2UpOwogICAgICAgICAgICBhcGkuc3VwTGF5ZXJzKGZhbHNlLCB0cnVlKTsKICAgICAgICB9CgogICAgICAgIGRhdGEuaG9zdHMuZm9yRWFjaChmdW5jdGlvbiAoaG9zdCkgewogICAgICAgICAgICB2YXIgaGRhdGEgPSBhcGkuZmluZE5vZGVCeUlkKGhvc3QuaWQpLAogICAgICAgICAgICAgICAgYmFkZ2VEYXRhID0gaG9zdC5iYWRnZSB8fCBudWxsOwoKICAgICAgICAgICAgaWYgKGhkYXRhICYmICFoZGF0YS5lbC5lbXB0eSgpKSB7CiAgICAgICAgICAgICAgICBoZGF0YS5iYWRnZSA9IGJhZGdlRGF0YTsKICAgICAgICAgICAgICAgIGlmICghaG9zdC5zdWJkdWUpIHsKICAgICAgICAgICAgICAgICAgICBhcGkudW5zdXBOb2RlKGhkYXRhLmlkLCBsZXNzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIFRPRE86IGZ1cnRoZXIgaGlnaGxpZ2h0aW5nPwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIGRhdGEuZGV2aWNlcy5mb3JFYWNoKGZ1bmN0aW9uIChkZXZpY2UpIHsKICAgICAgICAgICAgdmFyIGRkYXRhID0gYXBpLmZpbmROb2RlQnlJZChkZXZpY2UuaWQpLAogICAgICAgICAgICAgICAgYmFkZ2VEYXRhID0gZGV2aWNlLmJhZGdlIHx8IG51bGw7CgogICAgICAgICAgICBpZiAoZGRhdGEgJiYgIWRkYXRhLmVsLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgIGRkYXRhLmJhZGdlID0gYmFkZ2VEYXRhOwogICAgICAgICAgICAgICAgaWYgKCFkZXZpY2Uuc3ViZHVlKSB7CiAgICAgICAgICAgICAgICAgICAgYXBpLnVuc3VwTm9kZShkZGF0YS5pZCwgbGVzcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBUT0RPOiBmdXJ0aGVyIGhpZ2hsaWdodGluZz8KICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICBkYXRhLmxpbmtzLmZvckVhY2goZnVuY3Rpb24gKGxpbmspIHsKICAgICAgICAgICAgdmFyIGxkYXRhID0gYXBpLmZpbmRMaW5rQnlJZChsaW5rLmlkKSwKICAgICAgICAgICAgICAgIGxhYiA9IGxpbmsubGFiZWwsCiAgICAgICAgICAgICAgICB1bml0cywgcG9ydGNscywgbWFnbml0dWRlOwogICAgICAgICAgICBpZiAobGRhdGEgJiYgIWxkYXRhLmVsLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgIGlmICghbGluay5zdWJkdWUpIHsKICAgICAgICAgICAgICAgICAgICBhcGkudW5zdXBMaW5rKGxkYXRhLmtleSwgbGVzcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsZGF0YS5lbC5jbGFzc2VkKGxpbmsuY3NzLCB0cnVlKTsKICAgICAgICAgICAgICAgIGxkYXRhLmxhYmVsID0gbGFiOwoKICAgICAgICAgICAgICAgIC8vIFRPRE86IHRoaXMgbmVlZHMgdG8gYmUgcHVsbGVkIG91dCBpbnRvIHRyYWZmaWMgb3ZlcmxheQogICAgICAgICAgICAgICAgLy8gaW5qZWN0IGFkZGl0aW9uYWwgc3R5bGluZyBmb3IgcG9ydC1iYXNlZCB0cmFmZmljCiAgICAgICAgICAgICAgICBpZiAoZnMuZW5kc1dpdGgobGFiLCAnYnBzJykpIHsKICAgICAgICAgICAgICAgICAgICB1bml0cyA9IGxhYi5zdWJzdHJpbmcobGFiLmxlbmd0aC00KTsKICAgICAgICAgICAgICAgICAgICBwb3J0Y2xzID0gJ3BvcnQtdHJhZmZpYy0nICsgdW5pdHM7CgogICAgICAgICAgICAgICAgICAgIC8vIGZvciBHQnBzCiAgICAgICAgICAgICAgICAgICAgaWYgKHVuaXRzLnN1YnN0cmluZygwLDEpID09PSAnRycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFnbml0dWRlID0gZnMucGFyc2VCaXRSYXRlKGxhYik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYWduaXR1ZGUgPj0gOSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydGNscyArPSAnLWNob2tlZCcKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBsZGF0YS5lbC5jbGFzc2VkKHBvcnRjbHMsIHRydWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIGFwaS51cGRhdGVOb2RlcygpOwogICAgICAgIGFwaS51cGRhdGVMaW5rcygpOwogICAgfQoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIGFuZ3VsYXIubW9kdWxlKCdvdlRvcG8nKQogICAgLmZhY3RvcnkoJ1RvcG9PdmVybGF5U2VydmljZScsCiAgICAgICAgWyckbG9nJywgJyR0aW1lb3V0JywgJ0ZuU2VydmljZScsICdHbHlwaFNlcnZpY2UnLCAnV2ViU29ja2V0U2VydmljZScsCiAgICAgICAgICAgICdOYXZTZXJ2aWNlJywgJ1RvcG9QYW5lbFNlcnZpY2UnLAoKICAgICAgICBmdW5jdGlvbiAoXyRsb2dfLCBfJHRpbWVvdXRfLCBfZnNfLCBfZ3NfLCBfd3NzXywgX25zXywgX3Rwc18pIHsKICAgICAgICAgICAgJGxvZyA9IF8kbG9nXzsKICAgICAgICAgICAgJHRpbWVvdXQgPSBfJHRpbWVvdXRfOwogICAgICAgICAgICBmcyA9IF9mc187CiAgICAgICAgICAgIGdzID0gX2dzXzsKICAgICAgICAgICAgd3NzID0gX3dzc187CiAgICAgICAgICAgIG5zID0gX25zXzsKICAgICAgICAgICAgdHBzID0gX3Rwc187CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgcmVnaXN0ZXI6IHJlZ2lzdGVyLAogICAgICAgICAgICAgICAgc2V0QXBpOiBzZXRBcGksCiAgICAgICAgICAgICAgICBsaXN0OiBsaXN0LAogICAgICAgICAgICAgICAgYXVnbWVudFJic2V0OiBhdWdtZW50UmJzZXQsCiAgICAgICAgICAgICAgICBta0dseXBoSWQ6IG1rR2x5cGhJZCwKICAgICAgICAgICAgICAgIHRiU2VsZWN0aW9uOiB0YlNlbGVjdGlvbiwKICAgICAgICAgICAgICAgIGluc3RhbGxCdXR0b25zOiBpbnN0YWxsQnV0dG9ucywKICAgICAgICAgICAgICAgIGFkZERldGFpbEJ1dHRvbjogYWRkRGV0YWlsQnV0dG9uLAogICAgICAgICAgICAgICAgcmVzZXRPblRvb2xiYXJEZXN0cm95OiBmdW5jdGlvbiAoKSB7IHJlc2V0ID0gdHJ1ZTsgfSwKICAgICAgICAgICAgICAgIGhvb2tzOiB7CiAgICAgICAgICAgICAgICAgICAgZXNjYXBlOiBlc2NhcGVIb29rLAogICAgICAgICAgICAgICAgICAgIGVtcHR5U2VsZWN0OiBlbXB0eVNlbGVjdEhvb2ssCiAgICAgICAgICAgICAgICAgICAgc2luZ2xlU2VsZWN0OiBzaW5nbGVTZWxlY3RIb29rLAogICAgICAgICAgICAgICAgICAgIG11bHRpU2VsZWN0OiBtdWx0aVNlbGVjdEhvb2ssCiAgICAgICAgICAgICAgICAgICAgbW91c2VPdmVyOiBtb3VzZU92ZXJIb29rLAogICAgICAgICAgICAgICAgICAgIG1vdXNlT3V0OiBtb3VzZU91dEhvb2sKICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgc2hvd0hpZ2hsaWdodHM6IHNob3dIaWdobGlnaHRzCiAgICAgICAgICAgIH0KICAgICAgICB9XSk7Cgp9KCkpO3Px71aX5AkAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADTiUkAAQAbIisCoBzbAqAdgltQf9UDd2bGhrvGXgBAHiqDZAAABAQgKALfI4gBiD9hz8e9WQ+YJAIocAACKHAAAaPcoH9LFCAAnrR4TCABFABx8K8tAAEAGYsrAqAdgwKgHNh/1ltNygo1VYRxVD4AQAkysVQAAAQEICgBiD9gAt8jaSFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvamF2YXNjcmlwdA0KQ29udGVudC1MZW5ndGg6IDk1NTcNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gVG9wb2xvZ3kgSW5zdGFuY2VzIE1vZHVsZS4KIERlZmluZXMgbW9kZWxpbmcgb2YgT05PUyBpbnN0YW5jZXMuCiAqLwoKKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBpbmplY3RlZCByZWZzCiAgICB2YXIgJGxvZywgcHMsIHN1cywgZ3MsIHRzLCBmcywgZmxhc2g7CgogICAgLy8gYXBpIGZyb20gdG9wbwogICAgdmFyIGFwaTsKICAgIC8qCiAgICAgICAgc2hvd01hc3RlcnNoaXAoIGlkICkKICAgICAqLwoKICAgIC8vIGNvbmZpZ3VyYXRpb24KICAgIHZhciBpbnN0Q2ZnID0gewogICAgICAgICAgICByZWN0UGFkOiA4LAogICAgICAgICAgICBub2RlT3g6IDksCiAgICAgICAgICAgIG5vZGVPeTogOSwKICAgICAgICAgICAgbm9kZURpbTogNDAsCiAgICAgICAgICAgIGJpcmRPeDogMTksCiAgICAgICAgICAgIGJpcmRPeTogMjEsCiAgICAgICAgICAgIGJpcmREaW06IDIxLAogICAgICAgICAgICB1aUR5OiA0NSwKICAgICAgICAgICAgdGl0bGVEeTogMzAsCiAgICAgICAgICAgIHRleHRZT2ZmOiAyMCwKICAgICAgICAgICAgdGV4dFlTcGM6IDE1CiAgICAgICAgfSwKICAgICAgICBzaG93TG9naWNFcnJvcnMgPSB0cnVlLAogICAgICAgIGlkSW5zID0gJ3RvcG8tcC1pbnN0YW5jZScsCiAgICAgICAgaW5zdE9wdHMgPSB7CiAgICAgICAgICAgIGVkZ2U6ICdsZWZ0JywKICAgICAgICAgICAgd2lkdGg6IDIwCiAgICAgICAgfTsKCiAgICAvLyBpbnRlcm5hbCBzdGF0ZQogICAgdmFyIG9ub3NJbnN0YW5jZXMsCiAgICAgICAgb25vc09yZGVyLAogICAgICAgIG9pU2hvd01hc3RlciwKICAgICAgICBvaUJveCwKICAgICAgICB0aGVtZUxpc3RlbmVyOwoKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIGZ1bmN0aW9uIGFkZEluc3RhbmNlKGRhdGEpIHsKICAgICAgICB2YXIgaWQgPSBkYXRhLmlkOwoKICAgICAgICBpZiAob25vc0luc3RhbmNlc1tpZF0pIHsKICAgICAgICAgICAgdXBkYXRlSW5zdGFuY2UoZGF0YSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgb25vc0luc3RhbmNlc1tpZF0gPSBkYXRhOwogICAgICAgIG9ub3NPcmRlci5wdXNoKGRhdGEpOwogICAgICAgIHVwZGF0ZUluc3RhbmNlcygpOwogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZUluc3RhbmNlKGRhdGEpIHsKICAgICAgICB2YXIgaWQgPSBkYXRhLmlkLAogICAgICAgICAgICBkID0gb25vc0luc3RhbmNlc1tpZF07CiAgICAgICAgaWYgKGQpIHsKICAgICAgICAgICAgYW5ndWxhci5leHRlbmQoZCwgZGF0YSk7CiAgICAgICAgICAgIHVwZGF0ZUluc3RhbmNlcygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGxvZ2ljRXJyb3IoJ3VwZGF0ZUluc3RhbmNlOiBsb29rdXAgZmFpbDogSUQgPSAiJyArIGlkICsgJyInKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gcmVtb3ZlSW5zdGFuY2UoZGF0YSkgewogICAgICAgIHZhciBpZCA9IGRhdGEuaWQsCiAgICAgICAgICAgIGQgPSBvbm9zSW5zdGFuY2VzW2lkXTsKICAgICAgICBpZiAoZCkgewogICAgICAgICAgICB2YXIgaWR4ID0gZnMuZmluZChpZCwgb25vc09yZGVyKTsKICAgICAgICAgICAgaWYgKGlkeCA+PSAwKSB7CiAgICAgICAgICAgICAgICBvbm9zT3JkZXIuc3BsaWNlKGlkeCwgMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVsZXRlIG9ub3NJbnN0YW5jZXNbaWRdOwogICAgICAgICAgICB1cGRhdGVJbnN0YW5jZXMoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsb2dpY0Vycm9yKCdyZW1vdmVJbnN0YW5jZSBsb29rdXAgZmFpbC4gSUQgPSAiJyArIGlkICsgJyInKTsKICAgICAgICB9CiAgICB9CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBmdW5jdGlvbiBjb21wdXRlRGltKHNlbGYpIHsKICAgICAgICB2YXIgY3NzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoc2VsZik7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgdzogc3VzLnN0cmlwUHgoY3NzLndpZHRoKSwKICAgICAgICAgICAgaDogc3VzLnN0cmlwUHgoY3NzLmhlaWdodCkKICAgICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGNsaWNrSW5zdChkKSB7CiAgICAgICAgdmFyIGVsID0gZDMuc2VsZWN0KHRoaXMpLAogICAgICAgICAgICBhZmYgPSBlbC5jbGFzc2VkKCdhZmZpbml0eScpOwogICAgICAgIGlmICghYWZmKSB7CiAgICAgICAgICAgIHNldEFmZmluaXR5KGVsLCBkKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjYW5jZWxBZmZpbml0eSgpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBzZXRBZmZpbml0eShlbCwgZCkgewogICAgICAgIGQzLnNlbGVjdEFsbCgnLm9ub3NJbnN0JykKICAgICAgICAgICAgLmNsYXNzZWQoJ21hc3RlcnNoaXAnLCB0cnVlKQogICAgICAgICAgICAuY2xhc3NlZCgnYWZmaW5pdHknLCBmYWxzZSk7CiAgICAgICAgZWwuY2xhc3NlZCgnYWZmaW5pdHknLCB0cnVlKTsKCiAgICAgICAgLy8gc3VwcHJlc3MgYWxsIGVsZW1lbnRzIGV4Y2VwdCBub2RlcyB3aG9zZSBtYXN0ZXIgaXMgdGhpcyBpbnN0YW5jZQogICAgICAgIGFwaS5zaG93TWFzdGVyc2hpcChkLmlkKTsKICAgICAgICBvaVNob3dNYXN0ZXIgPSB0cnVlOwogICAgfQoKICAgIGZ1bmN0aW9uIGNhbmNlbEFmZmluaXR5KCkgewogICAgICAgIGQzLnNlbGVjdEFsbCgnLm9ub3NJbnN0JykKICAgICAgICAgICAgLmNsYXNzZWQoJ21hc3RlcnNoaXAgYWZmaW5pdHknLCBmYWxzZSk7CgogICAgICAgIGFwaS5zaG93TWFzdGVyc2hpcChudWxsKTsKICAgICAgICBvaVNob3dNYXN0ZXIgPSBmYWxzZTsKICAgIH0KCiAgICBmdW5jdGlvbiBpbnN0UmVjdEF0dHIoZGltKSB7CiAgICAgICAgdmFyIHBhZCA9IGluc3RDZmcucmVjdFBhZDsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB4OiBwYWQsCiAgICAgICAgICAgIHk6IHBhZCwKICAgICAgICAgICAgd2lkdGg6IGRpbS53IC0gcGFkKjIsCiAgICAgICAgICAgIGhlaWdodDogZGltLmggLSBwYWQqMiwKICAgICAgICAgICAgcng6IDYKICAgICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHZpZXdCb3goZGltKSB7CiAgICAgICAgcmV0dXJuICcwIDAgJyArIGRpbS53ICsgJyAnICsgZGltLmg7CiAgICB9CgogICAgZnVuY3Rpb24gYXR0YWNoVWlCYWRnZShzdmcpIHsKICAgICAgICBncy5hZGRHbHlwaChzdmcsICd1aUF0dGFjaGVkJywgMzAsIHRydWUsIFsxMiwgaW5zdENmZy51aUR5XSkKICAgICAgICAgICAgLmNsYXNzZWQoJ2JhZGdlSWNvbiB1aUJhZGdlJywgdHJ1ZSk7CiAgICB9CgogICAgZnVuY3Rpb24gaW5zdENvbG9yKGlkLCBvbmxpbmUpIHsKICAgICAgICByZXR1cm4gc3VzLmNhdDcoKS5nZXRDb2xvcihpZCwgIW9ubGluZSwgdHMudGhlbWUoKSk7CiAgICB9CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgZnVuY3Rpb24gdXBkYXRlSW5zdGFuY2VzKCkgewogICAgICAgIHZhciBvbm9zZXMgPSBvaUJveC5lbCgpLnNlbGVjdEFsbCgnLm9ub3NJbnN0JykKICAgICAgICAgICAgICAgIC5kYXRhKG9ub3NPcmRlciwgZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGQuaWQ7IH0pLAogICAgICAgICAgICBpbnN0RGltID0ge3c6MCxoOjB9LAogICAgICAgICAgICBjID0gaW5zdENmZzsKCiAgICAgICAgZnVuY3Rpb24gblN3KG4pIHsKICAgICAgICAgICAgcmV0dXJuICcjIFN3aXRjaGVzOiAnICsgbjsKICAgICAgICB9CgogICAgICAgIC8vIG9wZXJhdGUgb24gZXhpc3Rpbmcgb25vcyBpbnN0YW5jZXMgaWYgbmVjZXNzYXJ5CiAgICAgICAgb25vc2VzLmVhY2goZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgdmFyIGVsID0gZDMuc2VsZWN0KHRoaXMpLAogICAgICAgICAgICAgICAgc3ZnID0gZWwuc2VsZWN0KCdzdmcnKTsKICAgICAgICAgICAgaW5zdERpbSA9IGNvbXB1dGVEaW0odGhpcyk7CgogICAgICAgICAgICAvLyB1cGRhdGUgb25saW5lIHN0YXRlCiAgICAgICAgICAgIGVsLmNsYXNzZWQoJ29ubGluZScsIGQub25saW5lKTsKCiAgICAgICAgICAgIC8vIHVwZGF0ZSB1aS1hdHRhY2hlZCBzdGF0ZQogICAgICAgICAgICBzdmcuc2VsZWN0KCd1c2UudWlCYWRnZScpLnJlbW92ZSgpOwogICAgICAgICAgICBpZiAoZC51aUF0dGFjaGVkKSB7CiAgICAgICAgICAgICAgICBhdHRhY2hVaUJhZGdlKHN2Zyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZ1bmN0aW9uIHVwZEF0dHIoaWQsIHZhbHVlKSB7CiAgICAgICAgICAgICAgICBzdmcuc2VsZWN0KCd0ZXh0Lmluc3RMYWJlbC4nK2lkKS50ZXh0KHZhbHVlKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdXBkQXR0cignaXAnLCBkLmlwKTsKICAgICAgICAgICAgdXBkQXR0cignbnMnLCBuU3coZC5zd2l0Y2hlcykpOwogICAgICAgIH0pOwoKCiAgICAgICAgLy8gb3BlcmF0ZSBvbiBuZXcgb25vcyBpbnN0YW5jZXMKICAgICAgICB2YXIgZW50ZXJpbmcgPSBvbm9zZXMuZW50ZXIoKQogICAgICAgICAgICAuYXBwZW5kKCdkaXYnKQogICAgICAgICAgICAuYXR0cignY2xhc3MnLCAnb25vc0luc3QnKQogICAgICAgICAgICAuY2xhc3NlZCgnb25saW5lJywgZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGQub25saW5lOyB9KQogICAgICAgICAgICAub24oJ2NsaWNrJywgY2xpY2tJbnN0KTsKCiAgICAgICAgZW50ZXJpbmcuZWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgICAgICB2YXIgZWwgPSBkMy5zZWxlY3QodGhpcyksCiAgICAgICAgICAgICAgICByZWN0QXR0ciwKICAgICAgICAgICAgICAgIHN2ZzsKICAgICAgICAgICAgaW5zdERpbSA9IGNvbXB1dGVEaW0odGhpcyk7CiAgICAgICAgICAgIHJlY3RBdHRyID0gaW5zdFJlY3RBdHRyKGluc3REaW0pOwoKICAgICAgICAgICAgc3ZnID0gZWwuYXBwZW5kKCdzdmcnKS5hdHRyKHsKICAgICAgICAgICAgICAgIHdpZHRoOiBpbnN0RGltLncsCiAgICAgICAgICAgICAgICBoZWlnaHQ6IGluc3REaW0uaCwKICAgICAgICAgICAgICAgIHZpZXdCb3g6IHZpZXdCb3goaW5zdERpbSkKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBzdmcuYXBwZW5kKCdyZWN0JykuYXR0cihyZWN0QXR0cik7CgogICAgICAgICAgICBncy5hZGRHbHlwaChzdmcsICdiaXJkJywgMjgsIHRydWUsIFsxNCwgMTRdKQogICAgICAgICAgICAgICAgLmNsYXNzZWQoJ2JhZGdlSWNvbicsIHRydWUpOwoKICAgICAgICAgICAgaWYgKGQudWlBdHRhY2hlZCkgewogICAgICAgICAgICAgICAgYXR0YWNoVWlCYWRnZShzdmcpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgbGVmdCA9IGMubm9kZU94ICsgYy5ub2RlRGltLAogICAgICAgICAgICAgICAgbGVuID0gcmVjdEF0dHIud2lkdGggLSBsZWZ0LAogICAgICAgICAgICAgICAgaGxlbiA9IGxlbiAvIDIsCiAgICAgICAgICAgICAgICBtaWRsaW5lID0gaGxlbiArIGxlZnQ7CgogICAgICAgICAgICAvLyB0aXRsZQogICAgICAgICAgICBzdmcuYXBwZW5kKCd0ZXh0JykKICAgICAgICAgICAgICAgIC5hdHRyKHsKICAgICAgICAgICAgICAgICAgICBjbGFzczogJ2luc3RUaXRsZScsCiAgICAgICAgICAgICAgICAgICAgeDogbWlkbGluZSwKICAgICAgICAgICAgICAgICAgICB5OiBjLnRpdGxlRHkKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAudGV4dChkLmlkKTsKCiAgICAgICAgICAgIC8vIGEgY291cGxlIG9mIGF0dHJpYnV0ZXMKICAgICAgICAgICAgdmFyIHR5ID0gYy50aXRsZUR5ICsgYy50ZXh0WU9mZjsKCiAgICAgICAgICAgIGZ1bmN0aW9uIGFkZEF0dHIoaWQsIGxhYmVsKSB7CiAgICAgICAgICAgICAgICBzdmcuYXBwZW5kKCd0ZXh0JykuYXR0cih7CiAgICAgICAgICAgICAgICAgICAgY2xhc3M6ICdpbnN0TGFiZWwgJyArIGlkLAogICAgICAgICAgICAgICAgICAgIHg6IG1pZGxpbmUsCiAgICAgICAgICAgICAgICAgICAgeTogdHkKICAgICAgICAgICAgICAgIH0pLnRleHQobGFiZWwpOwogICAgICAgICAgICAgICAgdHkgKz0gYy50ZXh0WVNwYzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYWRkQXR0cignaXAnLCBkLmlwKTsKICAgICAgICAgICAgYWRkQXR0cignbnMnLCBuU3coZC5zd2l0Y2hlcykpOwogICAgICAgIH0pOwoKICAgICAgICAvLyBvcGVyYXRlIG9uIGV4aXN0aW5nICsgbmV3IG9ub3NlcyBoZXJlCiAgICAgICAgLy8gc2V0IHRoZSBhZmZpbml0eSBjb2xvcnMuLi4KICAgICAgICBvbm9zZXMuZWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgICAgICB2YXIgZWwgPSBkMy5zZWxlY3QodGhpcyksCiAgICAgICAgICAgICAgICByZWN0ID0gZWwuc2VsZWN0KCdzdmcnKS5zZWxlY3QoJ3JlY3QnKSwKICAgICAgICAgICAgICAgIGNvbCA9IGluc3RDb2xvcihkLmlkLCBkLm9ubGluZSk7CiAgICAgICAgICAgIHJlY3Quc3R5bGUoJ2ZpbGwnLCBjb2wpOwogICAgICAgIH0pOwoKICAgICAgICAvLyBhZGp1c3QgdGhlIHBhbmVsIHNpemUgYXBwcm9wcmlhdGVseS4uLgogICAgICAgIG9pQm94LndpZHRoKGluc3REaW0udyAqIG9ub3NPcmRlci5sZW5ndGgpOwogICAgICAgIHPx71Z65gkAuAkAALgJAABo9ygf0sUIACetHhMIAEUACaor0EAAQAZ1l8CoB2DAqAc2H/WW03KCqZ1hHFUPgBgCTJmDAAABAQgKAGIP2AC3yNpvaUJveC5oZWlnaHQoaW5zdERpbS5oKTsKCiAgICAgICAgLy8gcmVtb3ZlIGFueSBvdXRnb2luZyBpbnN0YW5jZXMKICAgICAgICBvbm9zZXMuZXhpdCgpLnJlbW92ZSgpOwogICAgfQoKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIGZ1bmN0aW9uIGxvZ2ljRXJyb3IobXNnKSB7CiAgICAgICAgaWYgKHNob3dMb2dpY0Vycm9ycykgewogICAgICAgICAgICAkbG9nLndhcm4oJ1RvcG9JbnN0U2VydmljZTogJyArIG1zZyk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGluaXRJbnN0KF9hcGlfKSB7CiAgICAgICAgYXBpID0gX2FwaV87CiAgICAgICAgb2lCb3ggPSBwcy5jcmVhdGVQYW5lbChpZElucywgaW5zdE9wdHMpOwogICAgICAgIG9pQm94LnNob3coKTsKCiAgICAgICAgb25vc0luc3RhbmNlcyA9IHt9OwogICAgICAgIG9ub3NPcmRlciA9IFtdOwogICAgICAgIG9pU2hvd01hc3RlciA9IGZhbHNlOwoKICAgICAgICAvLyB3ZSB3YW50IHRvIHVwZGF0ZSB0aGUgaW5zdGFuY2VzLCBlYWNoIHRpbWUgdGhlIHRoZW1lIGNoYW5nZXMKICAgICAgICB0aGVtZUxpc3RlbmVyID0gdHMuYWRkTGlzdGVuZXIodXBkYXRlSW5zdGFuY2VzKTsKICAgIH0KCiAgICBmdW5jdGlvbiBkZXN0cm95SW5zdCgpIHsKICAgICAgICB0cy5yZW1vdmVMaXN0ZW5lcih0aGVtZUxpc3RlbmVyKTsKICAgICAgICB0aGVtZUxpc3RlbmVyID0gbnVsbDsKCiAgICAgICAgcHMuZGVzdHJveVBhbmVsKGlkSW5zKTsKICAgICAgICBvaUJveCA9IG51bGw7CgogICAgICAgIG9ub3NJbnN0YW5jZXMgPSB7fTsKICAgICAgICBvbm9zT3JkZXIgPSBbXTsKICAgICAgICBvaVNob3dNYXN0ZXIgPSBmYWxzZTsKICAgIH0KCiAgICBmdW5jdGlvbiBzaG93SW5zdHMoKSB7CiAgICAgICAgb2lCb3guc2hvdygpOwogICAgfQoKICAgIGZ1bmN0aW9uIGhpZGVJbnN0cygpIHsKICAgICAgICBvaUJveC5oaWRlKCk7CiAgICB9CgogICAgZnVuY3Rpb24gdG9nZ2xlSW5zdHMoeCkgewogICAgICAgIHZhciBrZXYgPSAoeCA9PT0gJ2tleWV2JyksCiAgICAgICAgICAgIG9uLAogICAgICAgICAgICB2ZXJiOwoKICAgICAgICBpZiAoa2V2KSB7CiAgICAgICAgICAgIG9uID0gb2lCb3gudG9nZ2xlKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgb24gPSAhIXg7CiAgICAgICAgICAgIGlmIChvbikgewogICAgICAgICAgICAgICAgc2hvd0luc3RzKCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBoaWRlSW5zdHMoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2ZXJiID0gb24gPyAnU2hvdycgOiAnSGlkZSc7CiAgICAgICAgZmxhc2guZmxhc2godmVyYiArICcgaW5zdGFuY2VzIHBhbmVsJyk7CiAgICAgICAgcmV0dXJuIG9uOwogICAgfQoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgYW5ndWxhci5tb2R1bGUoJ292VG9wbycpCiAgICAuZmFjdG9yeSgnVG9wb0luc3RTZXJ2aWNlJywKICAgICAgICBbJyRsb2cnLCAnUGFuZWxTZXJ2aWNlJywgJ1N2Z1V0aWxTZXJ2aWNlJywgJ0dseXBoU2VydmljZScsCiAgICAgICAgICAgICdUaGVtZVNlcnZpY2UnLCAnRm5TZXJ2aWNlJywgJ0ZsYXNoU2VydmljZScsCgogICAgICAgIGZ1bmN0aW9uIChfJGxvZ18sIF9wc18sIF9zdXNfLCBfZ3NfLCBfdHNfLCBfZnNfLCBfZmxhc2hfKSB7CiAgICAgICAgICAgICRsb2cgPSBfJGxvZ187CiAgICAgICAgICAgIHBzID0gX3BzXzsKICAgICAgICAgICAgc3VzID0gX3N1c187CiAgICAgICAgICAgIGdzID0gX2dzXzsKICAgICAgICAgICAgdHMgPSBfdHNfOwogICAgICAgICAgICBmcyA9IF9mc187CiAgICAgICAgICAgIGZsYXNoID0gX2ZsYXNoXzsKCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBpbml0SW5zdDogaW5pdEluc3QsCiAgICAgICAgICAgICAgICBkZXN0cm95SW5zdDogZGVzdHJveUluc3QsCgogICAgICAgICAgICAgICAgYWRkSW5zdGFuY2U6IGFkZEluc3RhbmNlLAogICAgICAgICAgICAgICAgdXBkYXRlSW5zdGFuY2U6IHVwZGF0ZUluc3RhbmNlLAogICAgICAgICAgICAgICAgcmVtb3ZlSW5zdGFuY2U6IHJlbW92ZUluc3RhbmNlLAoKICAgICAgICAgICAgICAgIGNhbmNlbEFmZmluaXR5OiBjYW5jZWxBZmZpbml0eSwKCiAgICAgICAgICAgICAgICBpc1Zpc2libGU6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG9pQm94LmlzVmlzaWJsZSgpOyB9LAogICAgICAgICAgICAgICAgc2hvdzogc2hvd0luc3RzLAogICAgICAgICAgICAgICAgaGlkZTogaGlkZUluc3RzLAogICAgICAgICAgICAgICAgdG9nZ2xlOiB0b2dnbGVJbnN0cywKICAgICAgICAgICAgICAgIHNob3dNYXN0ZXI6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG9pU2hvd01hc3RlcjsgfQogICAgICAgICAgICB9OwogICAgICAgIH1dKTsKfSgpKTsKc/HvVqfmCQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANGSSQABABkZLwKgHNsCoB2CW0x/1YRxVD3KCsxOAEAWDdPUAAAEBCAoAt8jiAGIP2HPx71aK6QkAMg8AADIPAABo9ygf0sUIACetHhMIAEUADyR/LUAAQAYcwMCoB2DAqAc2H/WWzw6+V+CjarfcgBgC4579AAABAQgKAGIP2QC3yNhIVFRQLzEuMSAyMDAgT0sNCkNvbnRlbnQtVHlwZTogdGV4dC9qYXZhc2NyaXB0DQpDb250ZW50LUxlbmd0aDogMzcxOQ0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBUb3BvbG9neSBFdmVudCBNb2R1bGUuCgogRGVmaW5lcyB0aGUgY29uZHVpdCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHRoZSBzZXJ2ZXI6CiAgICAtIHByb3ZpZGVzIGEgY2xlYW4gQVBJIGZvciBzZW5kaW5nIGV2ZW50cyB0byB0aGUgc2VydmVyCiAgICAtIGRpc3BhdGNoZXMgaW5jb21pbmcgZXZlbnRzIGZyb20gdGhlIHNlcnZlciB0byB0aGUgYXBwcm9wcmlhdGUgc3ViLW1vZHVsZQoKICovCgooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIGluamVjdGVkIHJlZnMKICAgIHZhciAkbG9nLCAkaW50ZXJ2YWwsIHdzcywgdHBzLCB0aXMsIHRmcywgdHNzLCB0b3YsIHRzcHI7CgogICAgLy8gaW50ZXJuYWwgc3RhdGUKICAgIHZhciBoYW5kbGVyTWFwLAogICAgICAgIG9wZW5MaXN0ZW5lciwKICAgICAgICBoZWFydGJlYXRUaW1lcjsKCiAgICB2YXIgaGVhcnRiZWF0UGVyaW9kID0gOTAwMDsgLy8gOSBzZWNvbmRzCgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBmdW5jdGlvbiBjcmVhdGVIYW5kbGVyTWFwKCkgewogICAgICAgIGhhbmRsZXJNYXAgPSB7CiAgICAgICAgICAgIHNob3dTdW1tYXJ5OiB0cHMsCgogICAgICAgICAgICBzaG93RGV0YWlsczogdHNzLAoKICAgICAgICAgICAgc2hvd0hpZ2hsaWdodHM6IHRvdiwKCiAgICAgICAgICAgIGFkZEluc3RhbmNlOiB0aXMsCiAgICAgICAgICAgIHVwZGF0ZUluc3RhbmNlOiB0aXMsCiAgICAgICAgICAgIHJlbW92ZUluc3RhbmNlOiB0aXMsCgogICAgICAgICAgICBhZGREZXZpY2U6IHRmcywKICAgICAgICAgICAgdXBkYXRlRGV2aWNlOiB0ZnMsCiAgICAgICAgICAgIHJlbW92ZURldmljZTogdGZzLAogICAgICAgICAgICBhZGRIb3N0OiB0ZnMsCiAgICAgICAgICAgIHVwZGF0ZUhvc3Q6IHRmcywKICAgICAgICAgICAgbW92ZUhvc3Q6IHRmcywKICAgICAgICAgICAgcmVtb3ZlSG9zdDogdGZzLAogICAgICAgICAgICBhZGRMaW5rOiB0ZnMsCiAgICAgICAgICAgIHVwZGF0ZUxpbms6IHRmcywKICAgICAgICAgICAgcmVtb3ZlTGluazogdGZzLAoKICAgICAgICAgICAgdG9wb1N0YXJ0RG9uZTogdGZzLAoKICAgICAgICAgICAgc3ByaXRlTGlzdFJlc3BvbnNlOiB0c3ByLAogICAgICAgICAgICBzcHJpdGVEYXRhUmVzcG9uc2U6IHRzcHIKICAgICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHdzT3Blbihob3N0LCB1cmwpIHsKICAgICAgICAkbG9nLmRlYnVnKCdUT1BPOiB3ZWIgc29ja2V0IG9wZW4gLSBjbHVzdGVyIG5vZGU6JywgaG9zdCwgJ1VSTDonLCB1cmwpOwogICAgICAgIC8vIFJlcXVlc3QgYmF0Y2ggb2YgaW5pdGlhbCBkYXRhIGZyb20gdGhlIG5ldyBzZXJ2ZXIKICAgICAgICB3c3Muc2VuZEV2ZW50KCd0b3BvU3RhcnQnKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjYW5jZWxIZWFydGJlYXQoKSB7CiAgICAgICAgaWYgKGhlYXJ0YmVhdFRpbWVyKSB7CiAgICAgICAgICAgICRpbnRlcnZhbC5jYW5jZWwoaGVhcnRiZWF0VGltZXIpOwogICAgICAgIH0KICAgICAgICBoZWFydGJlYXRUaW1lciA9IG51bGw7CiAgICB9CgogICAgZnVuY3Rpb24gc2NoZWR1bGVIZWFydGJlYXQoKSB7CiAgICAgICAgY2FuY2VsSGVhcnRiZWF0KCk7CiAgICAgICAgaGVhcnRiZWF0VGltZXIgPSAkaW50ZXJ2YWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICB3c3Muc2VuZEV2ZW50KCd0b3BvSGVhcnRiZWF0Jyk7CiAgICAgICAgfSwgaGVhcnRiZWF0UGVyaW9kKTsKICAgIH0KCgogICAgYW5ndWxhci5tb2R1bGUoJ292VG9wbycpCiAgICAuZmFjdG9yeSgnVG9wb0V2ZW50U2VydmljZScsCiAgICAgICAgWyckbG9nJywgJyRpbnRlcnZhbCcsICdXZWJTb2NrZXRTZXJ2aWNlJywKICAgICAgICAgICAgJ1RvcG9QYW5lbFNlcnZpY2UnLCAnVG9wb0luc3RTZXJ2aWNlJywgJ1RvcG9Gb3JjZVNlcnZpY2UnLAogICAgICAgICAgICAnVG9wb1NlbGVjdFNlcnZpY2UnLCAnVG9wb092ZXJsYXlTZXJ2aWNlJywgJ1RvcG9TcHJpdGVTZXJ2aWNlJywKCiAgICAgICAgZnVuY3Rpb24gKF8kbG9nXywgIF8kaW50ZXJ2YWxfLCBfd3NzXywKICAgICAgICAgICAgICAgICAgX3Rwc18sIF90aXNfLCBfdGZzXywgX3Rzc18sIF90b3ZfLCBfdHNwcl8pIHsKICAgICAgICAgICAgJGxvZyA9IF8kbG9nXzsKICAgICAgICAgICAgJGludGVydmFsID0gXyRpbnRlcnZhbF87CiAgICAgICAgICAgIHdzcyA9IF93c3NfOwogICAgICAgICAgICB0cHMgPSBfdHBzXzsKICAgICAgICAgICAgdGlzID0gX3Rpc187CiAgICAgICAgICAgIHRmcyA9IF90ZnNfOwogICAgICAgICAgICB0c3MgPSBfdHNzXzsKICAgICAgICAgICAgdG92ID0gX3Rvdl87CiAgICAgICAgICAgIHRzcHIgPSBfdHNwcl87CgogICAgICAgICAgICBjcmVhdGVIYW5kbGVyTWFwKCk7CgogICAgICAgICAgICBmdW5jdGlvbiBzdGFydCgpIHsKICAgICAgICAgICAgICAgIG9wZW5MaXN0ZW5lciA9IHdzcy5hZGRPcGVuTGlzdGVuZXIod3NPcGVuKTsKICAgICAgICAgICAgICAgIHdzcy5iaW5kSGFuZGxlcnMoaGFuZGxlck1hcCk7CiAgICAgICAgICAgICAgICB3c3Muc2VuZEV2ZW50KCd0b3BvU3RhcnQnKTsKICAgICAgICAgICAgICAgIHNjaGVkdWxlSGVhcnRiZWF0KCk7CiAgICAgICAgICAgICAgICAkbG9nLmRlYnVnKCd0b3BvIGNvbW1zIHN0YXJ0ZWQnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZnVuY3Rpb24gc3RvcCgpIHsKICAgICAgICAgICAgICAgIGNhbmNlbEhlYXJ0YmVhdCgpOwogICAgICAgICAgICAgICAgd3NzLnNlbmRFdmVudCgndG9wb1N0b3AnKTsKICAgICAgICAgICAgICAgIHdzcy51bmJpbmRIYW5kbGVycyhoYW5kbGVyTWFwKTsKICAgICAgICAgICAgICAgIHdzcy5yZW1vdmVPcGVuTGlzdGVuZXIob3Blbkxpc3RlbmVyKTsKICAgICAgICAgICAgICAgIG9wZW5MaXN0ZW5lciA9IG51bGw7CiAgICAgICAgICAgICAgICAkbG9nLmRlYnVnKCd0b3BvIGNvbW1zIHN0b3BwZWQnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHN0YXJ0OiBzdGFydCwKICAgICAgICAgICAgICAgIHN0b3A6IHN0b3AKICAgICAgICAgICAgfTsKICAgICAgICB9XSk7Cn0oKSk7CnPx71bL6QkAkQIAAJECAAAIACetHhNo9ygf0sUIAEUAAoPiU0AAQAbGOsCoBzbAqAdgltQf9UDd2bGhrvGXgBgHoHT1AAABAQgKALfI4gBiD9hHRVQgL29ub3MvdWkvYXBwL3ZpZXcvdG9wby90b3BvU2VsZWN0LmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiAqLyoNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9Wy+kJAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0xBxAAEAG5sDAqAc2wKgHYJbPH/WjarfcDr5m0IAQIWZkAQAAAQEICgC3yOIAYg/Zc/HvVv/tCQCRAgAAkQIAAAgAJ60eE2j3KB/SxQgARQACg2STQABABkP7wKgHNsCoB2CW0x/1YRxVD3KCsxOAGAWkSO4AAAEBCAoAt8jjAGIP2EdFVCAvb25vcy91aS9hcHAvdmlldy90b3BvL3RvcG9TcHJpdGUuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6ICovKg0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCnPx71YJ8AkAkgIAAJICAAAIACetHhNo9ygf0sUIAEUAAoTEHUAAQAbkb8CoBzbAqAdgls8f9aNqt9wOvmbQgBghZoSFAAABAQgKALfI4wBiD9lHRVQgL29ub3MvdWkvYXBwL3ZpZXcvdG9wby90b3BvVHJhZmZpYy5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVgnwCQBCAAAAQgAAAGj3KB/SxQgAJ60eEwgARQAANH8wQABABiutwKgHYMCoBzYf9ZbPDr5m0KNquiyAEALzkA0AAAEBCAoAYg/ZALfI43Px71Yz+AkAQgAAAEIAAABo9ygf0sUIACetHhMIAEUAADSJX0AAQAYhfsCoB2DAqAc2H/WW0Gs6sCb5Phw1gBACTpANAAABAQgKAGIP2gC3yNpz8e9WnP8JALAcAACwHAAAaPcoH9LFCAAnrR4TCABFAByiK9JAAEAGYp3AqAdgwKgHNh/1ltNygrMTYRxXXoAYAlasewAAAQEICgBiD9oAt8jjSFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvamF2YXNjcmlwdA0KQ29udGVudC1MZW5ndGg6IDcxNzMNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gVG9wb2xvZ3kgU3ByaXRlIE1vZHVsZS4KIERlZmluZXMgYmVoYXZpb3IgZm9yIGxvYWRpbmcgc3ByaXRlcyBpbnRvIHRoZSBzcHJpdGUgbGF5ZXIuCiAqLwoKKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBpbmplY3RlZCByZWZzCiAgICB2YXIgJGxvZywgJGh0dHAsIGZzLCBncywgc3VzLCB3c3M7CgogICAgLy8gY29uc3RhbnRzCiAgICB2YXIgdHNzaWQgPSAnVG9wb1Nwcml0ZVNlcnZpY2U6ICcsCiAgICAgICAgZm9udHNpemUgPSAyMDsgIC8vIGRlZmF1bHQgZm9udCBzaXplIDIwcHQuCgogICAgLy8gaW50ZXJuYWwgc3RhdGUKICAgIHZhciBzcHJpdGVMYXllciwgZGVmc0VsZW1lbnQ7CgoKICAgIGZ1bmN0aW9uIHJlZ2lzdGVyUGF0aHNBc0dseXBocyhwYXRocykgewogICAgICAgIHZhciBjdXN0b20gPSB7fSwKICAgICAgICAgICAgaWRzID0gW107CgogICAgICAgIGZ1bmN0aW9uIG1rZChkKSB7CiAgICAgICAgICAgIHJldHVybiBmcy5pc0EoZCkgPyBkLmpvaW4oJycpIDogZDsKICAgICAgICB9CgogICAgICAgIHBhdGhzLmZvckVhY2goZnVuY3Rpb24gKHBhdGgpIHsKICAgICAgICAgICAgdmFyIHRhZyA9ICdzcHJfJyArIHBhdGgudGFnOwoKICAgICAgICAgICAgaWYgKHBhdGguZ2x5cGgpIHsKICAgICAgICAgICAgICAgIC8vIGFzc3VtcHRpb24gaXMgdGhhdCB3ZSBhcmUgdXNpbmcgYSBidWlsdC1pbiBnbHlwaAogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjdXN0b21bJ18nICsgdGFnXSA9IHBhdGgudmlld2JveCB8fCAnMCAwIDEwMDAgMTAwMCc7CiAgICAgICAgICAgIGN1c3RvbVt0YWddID0gbWtkKHBhdGguZCk7CiAgICAgICAgICAgIGlkcy5wdXNoKHRhZyk7CiAgICAgICAgfSk7CgogICAgICAgIGdzLnJlZ2lzdGVyR2x5cGhzKGN1c3RvbSk7CiAgICAgICAgZ3MubG9hZERlZnMoZGVmc0VsZW1lbnQsIGlkcywgdHJ1ZSk7CiAgICB9CgogICAgZnVuY3Rpb24gYXBwbHlTdHJva2VTdHlsZShzLCB1c2UpIHsKICAgICAgICB2YXIgc3R5bGU7CiAgICAgICAgaWYgKHMpIHsKICAgICAgICAgICAgc3R5bGUgPSB7fTsKICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKHMsIGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7CiAgICAgICAgICAgICAgICBzdHlsZVsnc3Ryb2tlLScgKyBrZXldID0gdmFsdWU7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB1c2Uuc3R5bGUoc3R5bGUpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBhcHBseUZpbGxDbGFzcyhmLCB1c2UpIHsKICAgICAgICB1c2UuY2xhc3NlZCgnZmlsbC0nICsgZiwgdHJ1ZSk7CiAgICB9CgogICAgZnVuY3Rpb24gZG9TcHJpdGUoc3ByLCBkZWYsIHBhdGhtZXRhKSB7CiAgICAgICAgdmFyIHBtZXRhID0gcGF0aG1ldGFbZGVmLnBhdGhdLAogICAgICAgICAgICBjID0gc3ByLmNsYXNzIHx8ICdncmF5MScsCiAgICAgICAgICAgIHAgPSBzcHIucG9zIHx8IFswLDBdLAogICAgICAgICAgICBsYWIgPSBzcHIubGFiZWwsCiAgICAgICAgICAgIGRpbSA9IGRlZi5kaW0gfHwgWzQwLDQwXSwKICAgICAgICAgICAgdyA9IGRpbVswXSwKICAgICAgICAgICAgaCA9IGRpbVsxXSwKICAgICAgICAgICAgZHkgPSBkZWYubGFiZWx5b2ZmIHx8IDEsCiAgICAgICAgICAgIHNjID0gZGVmLnNjYWxlLAogICAgICAgICAgICB4Zm0gPSBzdXMudHJhbnNsYXRlKHApLAogICAgICAgICAgICBnLCBhdHRyLCB1c2U7CgogICAgICAgIGlmIChzYykgewogICAgICAgICAgICB4Zm0gKz0gc3VzLnNjYWxlKHNjLCBzYyk7CiAgICAgICAgfQoKICAgICAgICBnID0gc3ByaXRlTGF5ZXIuYXBwZW5kKCdnJykKICAgICAgICAgICAgLmNsYXNzZWQoYywgdHJ1ZSkKICAgICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIHhmbSk7CgogICAgICAgIGF0dHIgPSB7CiAgICAgICAgICAgIHdpZHRoOiB3LAogICAgICAgICAgICBoZWlnaHQ6IGgsCiAgICAgICAgICAgICd4bGluazpocmVmJzogJyMnICsgcG1ldGEudQogICAgICAgIH07CgogICAgICAgIHVzZSA9IGcuYXBwZW5kKCd1c2UnKS5hdHRyKGF0dHIpOwogICAgICAgIGFwcGx5U3Ryb2tlU3R5bGUocG1ldGEucywgdXNlKTsKICAgICAgICBhcHBseUZpbGxDbGFzcyhkZWYuZmlsbCwgdXNlKTsKCgogICAgICAgIC8vIGFkZCBzdWJwYXRocyBpZiB0aGV5IGhhdmUgYmVlbiBkZWZpbmVkCiAgICAgICAgaWYgKGZzLmlzQShkZWYuc3VicGF0aHMpKSB7CiAgICAgICAgICAgIGRlZi5zdWJwYXRocy5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7CiAgICAgICAgICAgICAgICBwbWV0YSA9IHBhdGhtZXRhW3YucGF0aF07CiAgICAgICAgICAgICAgICBhdHRyID0gewogICAgICAgICAgICAgICAgICAgIHdpZHRoOiB3LAogICAgICAgICAgICAgICAgICAgIGhlaWdodDogaCwKICAgICAgICAgICAgICAgICAgICAneGxpbms6aHJlZic6ICcjJyArIHBtZXRhLnUsCiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBzdXMudHJhbnNsYXRlKHYucG9zKQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHVzZSA9IGcuYXBwZW5kKCd1c2UnKS5hdHRyKGF0dHIpOwogICAgICAgICAgICAgICAgYXBwbHlTdHJva2VTdHlsZShwbWV0YS5zLCB1c2UpOwogICAgICAgICAgICAgICAgYXBwbHlGaWxsQ2xhc3MoZGVmLnN1YnBhdGhmaWxsLCB1c2UpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIGlmIChsYWIpIHsKICAgICAgICAgICAgZy5hcHBlbmQoJ3RleHQnKQogICAgICAgICAgICAgICAgLnRleHQobGFiKQogICAgICAgICAgICAgICAgLmF0dHIoeyB4OiB3IC8gMiwgeTogaCAqIGR5IH0pOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBkb0xhYmVsKGxhYmVsKSB7CiAgICAgICAgdmFyIGMgPSBsYWJlbC5jbGFzcyB8fCAnZ3JheTEnLAogICAgICAgICAgICBwID0gbGFiZWwucG9zIHx8IFswLDBdLAogICAgICAgICAgICBzeiA9IGxhYmVsLnNpemUgfHwgMS4wLAogICAgICAgICAgICBnID0gc3ByaXRlTGF5ZXIuYXBwZW5kKCdnJykKICAgICAgICAgICAgICAgIC5jbGFzc2VkKGMsIHRydWUpCiAgICAgICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgc3VzLnRyYW5zbGF0ZShwKSkKICAgICAgICAgICAgICAgIC5hcHBlbmQoJ3RleHQnKQogICAgICAgICAgICAgICAgLnRleHQobGFiZWwudGV4dCkKICAgICAgICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgKGZvbnRzaXplICogc3opKydwdCcpOwogICAgfQoKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gZXZlbnQgaGFuZGxlcnMKCiAgICAvLyBIYW5kbGVzIHJlc3BvbnNlIGZyb20gJ3Nwcml0ZUxpc3RSZXF1ZXN0JyB3aGljaCBsaXN0cyBhbGwgdGhlCiAgICAvLyByZWdpc3RlcmVkIHNwcml0ZSBkZWZpbml0aW9ucyBvbiB0aGUgc2VydmVyLgogICAgLy8gKHNlZSBvbm9zLXVwbG9hZC1zcHJpdGVzKQogICAgZnVuY3Rpb24gaW5MaXN0KHBheWxvYWQpIHsKICAgICAgICAkbG9nLmRlYnVnKHRzc2lkICsgJ1JlZ2lzdGVyZWQgc3ByaXRlIGRlZmluaXRpb25zOicsIHBheWxvYWQubmFtZXMpOwogICAgICAgIC8vIFNvbWUgZGF5LCB3ZSB3aWxsIG1ha2UgdGhpcyBsaXN0IGF2YWlsYWJsZSB0byB0aGUgdXNlciBpbgogICAgICAgIC8vICBhIGRyb3Bkb3duIHNlbGVjdGlvbiBib3guLi4KICAgIH0KCiAgICAvLyBIYW5kbGVzIHJlc3BvbnNlIGZyb20gJ3Nwcml0ZURhdGFSZXF1ZXN0JyB3aGljaCBwcm92aWRlcyB0aGUKICAgIC8vICBkYXRhIGZvciB0aGUgcmVxdWVzdGVkIHNwcml0ZSBkZWZpbml0aW9uLgogICAgZnVuY3Rpb24gaW5EYXRhKHBheWxvYWQpIHsKICAgICAgICB2YXIgZGF0YSA9IHBheWxvYWQuZGF0YSwKICAgICAgICAgICAgbmFtZSwgZGVzYywgcGZ4LCBzcHJpdGVzLCBsYWJlbHMsIGFscGhhLAogICAgICAgICAgICBwYXRocywgZGVmbiwgbG9hZCwKICAgICAgICAgICAgcGF0aG1ldGEgPSB7fSwKICAgICAgICAgICAgZGVmcyA9IHt9LAogICAgICAgICAgICB3YXJuID0gW107CgogICAgICAgIGlmICghZGF0YSkgewogICAgICAgICAgICAkbG9nLndhcm4odHNzaWQgKyAnTm8gc3ByaXRlIGRhdGEgbG9hZGVkLicpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIG5hbWUgPSBkYXRhLmRlZm5fbmFtZTsKICAgICAgICBkZXNjID0gZGF0YS5kZWZuX2Rlc2M7CiAgICAgICAgcGF0aHMgPSBkYXRhLnBhdGhzOwogICAgICAgIGRlZm4gPSBkYXRhLmRlZm47CiAgICAgICAgbG9hZCA9IGRhdGEubG9hZDsKICAgICAgICBwZnggPSB0c3NpZCArICdbJyArIG5hbWUgKyAnXTogJzsKCiAgICAgICAgJGxvZy5kZWJ1ZygiTG9hZGluZyBzcHJpdGVzLi4uWyIgKyBuYW1lICsgIl0iLCBkZXNjKTsKCiAgICAgICAgZnVuY3Rpb24gbm8od2hhdCkgewogICAgICAgICAgICB3YXJuLnB1c2gocGZ4ICsgJ05vICcgKyB3aGF0ICsgJyBwcm9wZXJ0eSBkZWZpbmVkJyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoIXBhdGhzKSBubygncGF0aHMnKTsKICAgICAgICBpZiAoIWRlZm4pIG5vKCdkZWZuJyk7CiAgICAgICAgaWYgKCFsb2FkKSBubygnbG9hZCcpOwoKICAgICAgICBpZiAod2Fybi5sZW5ndGgpIHsKICAgICAgICAgICAgJGxvZy5lcnJvcih3YXJuLmpvaW4oJ1xuJykpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBhbnkgY3VzdG9tIHBhdGhzIG5lZWQgdG8gYmUgYWRkZWQgdG8gdGhlIGdseXBoIERCLCBhbmQgaW1wb3J0ZWQKICAgICAgICByZWdpc3RlclBhdGhzQXNHbHlwaHMocGF0aHMpOwoKICAgICAgICBwYXRocy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7CiAgICAgICAgICAgIHBhdGhtZXRhW3AudGFnXSA9IHsKICAgICAgICAgICAgICAgIHM6IHAuc3Ryb2tlLAogICAgICAgICAgICAgICAgdTogcC5nbHlwaCB8fCAnc3ByXycgKyBwLnRhZwogICAgICAgICAgICB9OwogICAgICAgIH0pOwoKICAgICAgICBkZWZuLmZvckVhY2goZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgZGVmc1tkLmlkXSA9IGQ7CiAgICAgICAgfSk7CgogICAgICAgIC8vIHNwcml0ZXMsIGxhYmVscyBhbmQgYWxwaGEgYXJlIGVhY2ggb3B0aW9uYWwgY29tcG9uZW50cyBvZiB0aGUgbG9hZAogICAgICAgIHNwcml0ZXMgPSBsb2FkLnNwcml0ZXM7CiAgICAgICAgbGFiZWxzID0gbG9hZC5sYWJlbHM7CiAgICAgICAgYWxwaGEgPSBsb2FkLmFscGhhOwoKICAgICAgICBpZiAoYWxwaGEpIHsKICAgICAgICAgICAgc3ByaXRlTGF5ZXIuc3R5bGUoJ29wYWNpdHknLCBhbHBoYSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoc3ByaXRlcykgewogICAgICAgICAgICBzcHJpdGVzLmZvckVhY2goZnVuY3Rpb24gKHNwcikgewogICAgICAgICAgICAgICAgdmFyIGRlZiA9IGRlZnNbc3ByLmlkXTsKICAgICAgICAgICAgICAgIGRvU3ByaXRlKHNwciwgZGVmLCBwYXRobWV0YSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgaWYgKGxhYmVscykgewogICAgICAgICAgICBsYWJlbHMuZm9yRWFjaChkb0xhYmVsKTsKICAgICAgICB9CiAgICB9CgoKICAgIGZ1bmN0aW9uIGxvYWRTcHJpdGVzKGxheWVyLCBkZWZzRWxlbSwgZGVmbmFtZSkgewogICAgICAgIHZhciBuYW1lID0gZGVmbmFtZSB8fCAnc3ByaXRlcyc7CiAgICAgICAgc3ByaXRlTGF5ZXIgPSBsYXllcjsKICAgICAgICBkZWZzRWxlbWVudCA9IGRlZnNFbGVtOwoKICAgICAgICAkbG9nLmluZm8odHNzaWQgKyAnUmVxdWVzdGluZyBzcHJpdGUgZGVmaW5pdGlvbiBbJytuYW1lKyddLi4uJyk7CgogICAgICAgIHdzcy5zZW5kRXZlbnQoJ3Nwcml0ZUxpc3RSZXF1ZXN0Jyk7CiAgICAgICAgd3NzLnNlbmRFdmVudCgnc3ByaXRlRGF0YVJlcXVlc3QnLCB7bmFtZTogbmFtZX0pOwogICAgfQoKICAgIC8vID09PSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gPT09IE1PRFVMRSBERUZJTklUSU9OID09PQoKICAgIGFuZ3VsYXIubW9kdWxlKCdvdlRvcG8nKQogICAgLmZhY3RvcnkoJ1RvcG9TcHJpdGVTZXJ2aWNlJywKICAgICAgICBbJyRsb2cnLCAnJGh0dHAnLCAnRm5TZXJ2aWNlJywgJ0dseXBoU2VydmljZScsCiAgICAgICAgICAgICdTdmdVdGlsU2VydmljZScsICdXZWJTb2NrZXRTZXJ2aWNlJywKCiAgICAgICAgZnVuY3Rpb24gKF8kbG9nXywgXyRodHRwXywgX2ZzXywgX2dzXywgX3N1c18sIF93c3NfKSB7CiAgICAgICAgICAgICRsb2cgPSBfJGxvZ187CiAgICAgICAgICAgICRodHRwID0gXyRodHRwXzsKICAgICAgICAgICAgZnMgPSBfZnNfOwogICAgICAgICAgICBncyA9IF9nc187CiAgICAgICAgICAgIHN1cyA9IF9zdXNfOwogICAgICAgICAgICB3c3MgPSBfd3NzXzsKCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBsb2FkU3ByaXRlczogbG9hZFNwcml0ZXMsCiAgICAgICAgICAgICAgICBzcHJpdGVMaXN0UmVzcG9uc2U6IGluTGlzdCwKICAgICAgICAgICAgICAgIHNwcml0ZURhdGFSZXNwb25zZTogaW5EYXRhCiAgICAgICAgICAgIH07CiAgICAgICAgfV0pOwoKfSgpKTsKc/HvVtcCCgBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANGSUQABABkZJwKgHNsCoB2CW0x/1YRxXXnKCz4GAEAWOVikAAAEBCAoAt8jkAGIP2nPx71aqBQoAlQIAAJUCAAAIACetHhNo9ygf0sUIAEUAAodklUAAQAZD9cCoBzbAqAdgltMf9WEcV15ygs+BgBgFpGF/AAABAQgKALfI5ABiD9pHRVQgL29ub3MvdWkvYXBwL3ZpZXcvdG9wby90b3BvVHJhZmZpY05ldy5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVsMJCgB6FAAAehQAAGj3KB/SxQgAJ60eEwgARQAUbCvYQABABmrNwKgHYMCoBzYf9ZbTcoLPgWEcWbGAGAJhpEUAAAEBCAoAYg/aALfI5EhUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2phdmFzY3JpcHQNCkNvbnRlbnQtTGVuZ3RoOiA1MDcxDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCi8qCiAqIENvcHlyaWdodCAyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqCiAqLwoKLyoKIE9OT1MgR1VJIC0tIFRvcG9sb2d5IFRyYWZmaWMgT3ZlcmxheSBNb2R1bGUuCiBEZWZpbmVzIGJlaGF2aW9yIGZvciB2aWV3aW5nIGRpZmZlcmVudCB0cmFmZmljIG1vZGVzLgogSW5zdGFsbGVkIGFzIGEgVG9wb2xvZ3kgT3ZlcmxheS4KICovCihmdW5jdGlvbiAoKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8gaW5qZWN0ZWQgcmVmcwogICAgdmFyICRsb2csIHRvdiwgdHRzOwoKICAgIC8vIE5PVEU6IG5vIGludGVybmFsIHN0YXRlIGhlcmUgLS0gc2VlIFRvcG9UcmFmZmljU2VydmljZSBmb3IgdGhhdAoKICAgIC8vIE5PVEU6IHByb3ZpZGluZyBidXR0b24gZGlzYWJsaW5nIHJlcXVpcmVzIHRvbyBiaWcgYSByZWZhY3RvcmluZyBvZgogICAgLy8gICAgICAgdGhlIGJ1dHRvbiBmYWN0b3J5IGV0Yy4gV2lsbCBoYXZlIHRvIGJlIGRvbmUgYW5vdGhlciB0aW1lLgoKCiAgICAvLyB0cmFmZmljIG92ZXJsYXkgZGVmaW5pdGlvbgogICAgdmFyIG92ZXJsYXkgPSB7CiAgICAgICAgb3ZlcmxheUlkOiAndHJhZmZpYycsCiAgICAgICAgZ2x5cGhJZDogJ2FsbFRyYWZmaWMnLAogICAgICAgIHRvb2x0aXA6ICdUcmFmZmljIE92ZXJsYXknLAoKICAgICAgICAvLyBOT1RFOiBUcmFmZmljIGdseXBocyBhbHJlYWR5IGluc3RhbGxlZCBhcyBwYXJ0IG9mIHRoZSBiYXNlIE9OT1Mgc2V0LgoKICAgICAgICBhY3RpdmF0ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAkbG9nLmRlYnVnKCJUcmFmZmljIG92ZXJsYXkgQUNUSVZBVEVEIik7CiAgICAgICAgfSwKCiAgICAgICAgZGVhY3RpdmF0ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0dHMuY2FuY2VsVHJhZmZpYyh0cnVlKTsKICAgICAgICAgICAgJGxvZy5kZWJ1ZygiVHJhZmZpYyBvdmVybGF5IERFQUNUSVZBVEVEIik7CiAgICAgICAgfSwKCiAgICAgICAgLy8gZGV0YWlsIHBhbmVsIGJ1dHRvbiBkZWZpbml0aW9ucwogICAgICAgIC8vIChrZXlzIG1hdGNoIGJ1dHRvbiBpZGVudGlmaWVycywgYWxzbyBkZWZpbmVkIGluIFRyYWZmaWNPdmVybGF5LmphdmEpCiAgICAgICAgYnV0dG9uczogewogICAgICAgICAgICBzaG93RGV2aWNlRmxvd3M6IHsKICAgICAgICAgICAgICAgIGdpZDogJ2Zsb3dzJywKICAgICAgICAgICAgICAgIHR0OiAnU2hvdyBEZXZpY2UgRmxvd3MnLAogICAgICAgICAgICAgICAgY2I6IGZ1bmN0aW9uIChkYXRhKSB7IHR0cy5zaG93RGV2aWNlTGlua0Zsb3dzKCk7IH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIHNob3dSZWxhdGVkVHJhZmZpYzogewogICAgICAgICAgICAgICAgZ2lkOiAncmVsYXRlZEludGVudHMnLAogICAgICAgICAgICAgICAgdHQ6ICdTaG93IFJlbGF0ZWQgVHJhZmZpYycsCiAgICAgICAgICAgICAgICBjYjogZnVuY3Rpb24gKGRhdGEpIHsgdHRzLnNob3dSZWxhdGVkSW50ZW50cygpOyB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvLyBrZXkgYmluZGluZ3MgZm9yIHRyYWZmaWMgb3ZlcmxheSB0b29sYmFyIGJ1dHRvbnMKICAgICAgICAvLyBOT1RFOiBmdWxseSBxdWFsLiBidXR0b24gSUQgaXMgZGVyaXZlZCBmcm9tIG92ZXJsYXktaWQgYW5kIGtleS1uYW1lCiAgICAgICAga2V5QmluZGluZ3M6IHsKICAgICAgICAgICAgMDogewogICAgICAgICAgICAgICAgY2I6IGZ1bmN0aW9uICgpIHsgdHRzLmNhbmNlbFRyYWZmaWModHJ1ZSk7IH0sCiAgICAgICAgICAgICAgICB0dDogJ0NhbmNlbCB0cmFmZmljIG1vbml0b3JpbmcnLAogICAgICAgICAgICAgICAgZ2lkOiAneE1hcmsnCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBBOiB7CiAgICAgICAgICAgICAgICBjYjogZnVuY3Rpb24gKCkgeyB0dHMuc2hvd0FsbEZsb3dUcmFmZmljKCk7IH0sCiAgICAgICAgICAgICAgICB0dDogJ01vbml0b3IgYWxsIHRyYWZmaWMgdXNpbmcgZmxvdyBzdGF0cycsCiAgICAgICAgICAgICAgICBnaWQ6ICdhbGxUcmFmZmljJwogICAgICAgICAgICB9LAogICAgICAgICAgICBROiB7CiAgICAgICAgICAgICAgICBjYjogZnVuY3Rpb24gKCkgeyB0dHMuc2hvd0FsbFBvcnRUcmFmZmljKCk7IH0sCiAgICAgICAgICAgICAgICB0dDogJ01vbml0b3IgYWxsIHRyYWZmaWMgdXNpbmcgcG9ydCBzdGF0cycsCiAgICAgICAgICAgICAgICBnaWQ6ICdhbGxUcmFmZmljJwogICAgICAgICAgICB9LAogICAgICAgICAgICBGOiB7CiAgICAgICAgICAgICAgICBjYjogZnVuY3Rpb24gKCkgeyB0dHMuc2hvd0RldmljZUxpbmtGbG93cygpOyB9LAogICAgICAgICAgICAgICAgdHQ6ICdTaG93IGRldmljZSBsaW5rIGZsb3dzJywKICAgICAgICAgICAgICAgIGdpZDogJ2Zsb3dzJwogICAgICAgICAgICB9LAogICAgICAgICAgICBWOiB7CiAgICAgICAgICAgICAgICBjYjogZnVuY3Rpb24gKCkgeyB0dHMuc2hvd1JlbGF0ZWRJbnRlbnRzKCk7IH0sCiAgICAgICAgICAgICAgICB0dDogJ1Nob3cgYWxsIHJlbGF0ZWQgaW50ZW50cycsCiAgICAgICAgICAgICAgICBnaWQ6ICdyZWxhdGVkSW50ZW50cycKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbGVmdEFycm93OiB7CiAgICAgICAgICAgICAgICBjYjogZnVuY3Rpb24gKCkgeyB0dHMuc2hvd1ByZXZJbnRlbnQoKTsgfSwKICAgICAgICAgICAgICAgIHR0OiAnU2hvdyBwcmV2aW91cyByZWxhdGVkIGludGVudCcsCiAgICAgICAgICAgICAgICBnaWQ6ICdwcmV2SW50ZW50JwogICAgICAgICAgICB9LAogICAgICAgICAgICByaWdodEFycm93OiB7CiAgICAgICAgICAgICAgICBjYjogZnVuY3Rpb24gKCkgeyB0dHMuc2hvd05leHRJbnRlbnQoKTsgfSwKICAgICAgICAgICAgICAgIHR0OiAnU2hvdyBuZXh0IHJlbGF0ZWQgaW50ZW50JywKICAgICAgICAgICAgICAgIGdpZDogJ25leHRJbnRlbnQnCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFc6IHsKICAgICAgICAgICAgICAgIGNiOiBmdW5jdGlvbiAoKSB7IHR0cy5zaG93U2VsZWN0ZWRJbnRlbnRUcmFmZmljKCk7IH0sCiAgICAgICAgICAgICAgICB0dDogJ01vbml0b3IgdHJhZmZpYyBvZiBzZWxlY3RlZCBpbnRlbnQnLAogICAgICAgICAgICAgICAgZ2lkOiAnaW50ZW50VHJhZmZpYycKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIF9rZXlPcmRlcjogWwogICAgICAgICAgICAgICAgJzAnLCAnQScsICdRJywgJ0YnLCAnVicsICdsZWZ0QXJyb3cnLCAncmlnaHRBcnJvdycsICdXJwogICAgICAgICAgICBdCiAgICAgICAgfSwKCiAgICAgICAgaG9va3M6IHsKICAgICAgICAgICAgLy8gaG9vayBmb3IgaGFuZGxpbmcgZXNjYXBlIGtleQogICAgICAgICAgICBlc2NhcGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIC8vIE11c3QgcmV0dXJuIHRydWUgdG8gY29uc3VtZSBFU0MsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgICAgICAgIHJldHVybiB0dHMuY2FuY2VsVHJhZmZpYyh0cnVlKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8vIGhvb2tzIGZvciB3aGVuIHRoZSBzZWxlY3Rpb24gY2hhbmdlcy4uLgogICAgICAgICAgICBlbXB0eTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdHRzLmNhbmNlbFRyYWZmaWMoKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgc2luZ2xlOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgdHRzLnJlcXVlc3RUcmFmZmljRm9yTW9kZSgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBtdWx0aTogZnVuY3Rpb24gKHNlbGVjdE9yZGVyKSB7CiAgICAgICAgICAgICAgICB0dHMucmVxdWVzdFRyYWZmaWNGb3JNb2RlKCk7CiAgICAgICAgICAgICAgICB0b3YuYWRkRGV0YWlsQnV0dG9uKCdzaG93UmVsYXRlZFRyYWZmaWMnKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8vIG1vdXNlIGhvb2tzCiAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24gKG0pIHsKICAgICAgICAgICAgICAgIC8vIG0gaGFzIGlkLCBjbGFzcywgYW5kIHR5cGUgcHJvcGVydGllcwogICAgICAgICAgICAgICAgdHRzLnJlcXVlc3RUcmFmZmljRm9yTW9kZSh0cnVlKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHR0cy5yZXF1ZXN0VHJhZmZpY0Zvck1vZGUodHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIC8vIGludm9rZSBjb2RlIHRvIHJlZ2lzdGVyIHdpdGggdGhlIG92ZXJsYXkgc2VydmljZQogICAgYW5ndWxhci5tb2R1bGUoJ292VG9wbycpCiAgICAgICAgLnJ1bihbJyRsb2cnLCAnVG9wb092ZXJsYXlTZXJ2aWNlJywgJ1RvcG9UcmFmZmljU2VydmljZScsCgogICAgICAgIGZ1bmN0aW9uIChfJGxvZ18sIF90b3ZfLCBfdHRzXykgewogICAgICAgICAgICAkbG9nID0gXyRsb2dfOwogICAgICAgICAgICB0b3YgPSBfdG92XzsKICAgICAgICAgICAgdHRzID0gX3R0c187CiAgICAgICAgICAgIHRvdi5yZWdpc3RlcihvdmVybGF5KTsKICAgICAgICB9XSk7Cgp9KCkpOwpz8e9WeQ0KAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0ZJZAAEAGRkfAqAc2wKgHYJbTH/VhHFmxcoLjuYAQBY4/nQAAAQEICgC3yOUAYg/ac/HvVuwPCgCSAgAAkgIAAAgAJ60eE2j3KB/SxQgARQAChGSXQABABkP2wKgHNsCoB2CW0x/1YRxZsXKC47mAGAWkZPMAAAEBCAoAt8jlAGIP2kdFVCAvb25vcy91aS9hcHAvdmlldy90b3BvL3RvcG9Ub29sYmFyLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiAqLyoNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9WWRAKAKgQAACoEAAAaPcoH9LFCAAnrR4TCABFABCaiWBAAEAGERfAqAdgwKgHNh/1ltBrOrAm+T4cNYAYAk6gcwAAAQEICgBiD9sAt8jaSFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvamF2YXNjcmlwdA0KQ29udGVudC1MZW5ndGg6IDQwOTMNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gVG9wb2xvZ3kgbGF5ZXIgZmlsdGVyaW5nIE1vZHVsZS4KIFByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgdG8gdmlzdWFsbHkgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHRoZSBwYWNrZXQgYW5kCiBvcHRpY2FsIGxheWVycyBvZiB0aGUgdG9wb2xvZ3kuCiAqLwoKKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBpbmplY3RlZCByZWZzCiAgICB2YXIgJGxvZywgZnMsIGZsYXNoLCB0cHMsIHR0czsKCiAgICAvLyBhcGkgdG8gdG9wb0ZvcmNlCiAgICB2YXIgYXBpOwogICAgLyoKICAgICBub2RlKCkgICAgIC8vIGdldCByZWYgdG8gRDMgc2VsZWN0aW9uIG9mIG5vZGVzCiAgICAgbGluaygpICAgICAvLyBnZXQgcmVmIHRvIEQzIHNlbGVjdGlvbiBvZiBsaW5rcwogICAgICovCgogICAgdmFyIHNtYXggPSAnc3VwcHJlc3NlZG1heCc7CgogICAgLy8gd2hpY2ggImxheWVyIiBhIHBhcnRpY3VsYXIgaXRlbSAiYmVsb25ncyB0byIKICAgIHZhciBsYXllckxvb2t1cCA9IHsKICAgICAgICAgICAgaG9zdDogewogICAgICAgICAgICAgICAgZW5kc3RhdGlvbjogJ3BrdCcsIC8vIGRlZmF1bHQsIGlmIGhvc3QgZXZlbnQgZG9lcyBub3QgZGVmaW5lIHR5cGUKICAgICAgICAgICAgICAgIHJvdXRlcjogICAgICdwa3QnLAogICAgICAgICAgICAgICAgYmdwU3BlYWtlcjogJ3BrdCcKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZGV2aWNlOiB7CiAgICAgICAgICAgICAgICBzd2l0Y2g6ICdwa3QnLAogICAgICAgICAgICAgICAgcm9hZG06ICdvcHQnLAogICAgICAgICAgICAgICAgb3RuOiAnb3B0JwogICAgICAgICAgICB9LAogICAgICAgICAgICBsaW5rOiB7CiAgICAgICAgICAgICAgICBob3N0TGluazogJ3BrdCcsCiAgICAgICAgICAgICAgICBkaXJlY3Q6ICdwa3QnLAogICAgICAgICAgICAgICAgaW5kaXJlY3Q6ICcnLAogICAgICAgICAgICAgICAgdHVubmVsOiAnJywKICAgICAgICAgICAgICAgIG9wdGljYWw6ICdvcHQnCiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIC8vIG9yZGVyIG9mIGxheWVyIGN5Y2xpbmcgaW4gYnV0dG9uCiAgICAgICAgZGlzcGF0Y2ggPSBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHR5cGU6ICdhbGwnLAogICAgICAgICAgICAgICAgYWN0aW9uOiBmdW5jdGlvbiAoKSB7IHN1cHByZXNzTGF5ZXJzKGZhbHNlKTsgfSwKICAgICAgICAgICAgICAgIG1zZzogJ0FsbCBMYXllcnMgU2hvd24nCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHR5cGU6ICdwa3QnLAogICAgICAgICAgICAgICAgYWN0aW9uOiBmdW5jdGlvbiAoKSB7IHNob3dMYXllcigncGt0Jyk7IH0sCiAgICAgICAgICAgICAgICBtc2c6ICdQYWNrZXQgTGF5ZXIgU2hvd24nCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHR5cGU6ICdvcHQnLAogICAgICAgICAgICAgICAgYWN0aW9uOiBmdW5jdGlvbiAoKSB7IHNob3dMYXllcignb3B0Jyk7IH0sCiAgICAgICAgICAgICAgICBtc2c6ICdPcHRpY2FsIExheWVyIFNob3duJwogICAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICBsYXllciA9IDA7CgogICAgZnVuY3Rpb24gY2xpY2tBY3Rpb24oKSB7CiAgICAgICAgbGF5ZXIgPSAobGF5ZXIgKyAxKSAlIGRpc3BhdGNoLmxlbmd0aDsKICAgICAgICBkaXNwYXRjaFtsYXllcl0uYWN0aW9uKCk7CiAgICAgICAgZmxhc2guZmxhc2goZGlzcGF0Y2hbbGF5ZXJdLm1zZyk7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0ZWQoKSB7CiAgICAgICAgcmV0dXJuIGRpc3BhdGNoW2xheWVyXS50eXBlOwogICAgfQoKICAgIGZ1bmN0aW9uIGluTGF5ZXIoZCwgbGF5ZXIpIHsKICAgICAgICB2YXIgdHlwZSA9IGQuY2xhc3MgPT09ICdsaW5rJyA/IGQudHlwZSgpIDogZC50eXBlLAogICAgICAgICAgICBsb29rID0gbGF5ZXJMb29rdXBbZC5jbGFzc10sCiAgICAgICAgICAgIGx5ciA9IGxvb2sgJiYgbG9va1t0eXBlXTsKICAgICAgICByZXR1cm4gbHlyID09PSBsYXllcjsKICAgIH0KCiAgICBmdW5jdGlvbiB1bnN1cHByZXNzTGF5ZXIod2hpY2gpIHsKICAgICAgICBhcGkubm9kZSgpLmVhY2goZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgdmFyIG5vZGUgPSBkLmVsOwogICAgICAgICAgICBpZiAoaW5MYXllcihkLCB3aGljaCkpIHsKICAgICAgICAgICAgICAgIG5vZGUuY2xhc3NlZChzbWF4LCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgYXBpLmxpbmsoKS5lYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIHZhciBsaW5rID0gZC5lbDsKICAgICAgICAgICAgaWYgKGluTGF5ZXIoZCwgd2hpY2gpKSB7CiAgICAgICAgICAgICAgICBsaW5rLmNsYXNzZWQoc21heCwgZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gc3VwcHJlc3NMYXllcnMoYikgewogICAgICAgIGFwaS5ub2RlKCkuY2xhc3NlZChzbWF4LCBiKTsKICAgICAgICBhcGkubGluaygpLmNsYXNzZWQoc21heCwgYik7CiAgICB9CgogICAgZnVuY3Rpb24gc2hvd0xheWVyKHdoaWNoKSB7CiAgICAgICAgc3VwcHJlc3NMYXllcnModHJ1ZSk7CiAgICAgICAgdW5zdXBwcmVzc0xheWVyKHdoaWNoKTsKICAgIH0KCiAgICAvLyA9PT0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vID09PSBNT0RVTEUgREVGSU5JVElPTiA9PT0KCiAgICBhbmd1bGFyLm1vZHVsZSgnb3ZUb3BvJykKICAgICAgICAuZmFjdG9yeSgnVG9wb0ZpbHRlclNlcnZpY2UnLAogICAgICAgIFsnJGxvZycsICdGblNlcnZpY2UnLAogICAgICAgICAgICAnRmxhc2hTZXJ2aWNlJywKICAgICAgICAgICAgJ1RvcG9QYW5lbFNlcnZpY2UnLAogICAgICAgICAgICAnVG9wb1RyYWZmaWNTZXJ2aWNlJywKCiAgICAgICAgICAgIGZ1bmN0aW9uIChfJGxvZ18sIF9mc18sIF9mbGFzaF8sIF90cHNfLCBfdHRzXykgewogICAgICAgICAgICAgICAgJGxvZyA9IF8kbG9nXzsKICAgICAgICAgICAgICAgIGZzID0gX2ZzXzsKICAgICAgICAgICAgICAgIGZsYXNoID0gX2ZsYXNoXzsKICAgICAgICAgICAgICAgIHRwcyA9IF90cHNfOwogICAgICAgICAgICAgICAgdHRzID0gX3R0c187CgogICAgICAgICAgICAgICAgZnVuY3Rpb24gaW5pdEZpbHRlcihfYXBpXykgewogICAgICAgICAgICAgICAgICAgIGFwaSA9IF9hcGlfOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgaW5pdEZpbHRlcjogaW5pdEZpbHRlciwKCiAgICAgICAgICAgICAgICAgICAgY2xpY2tBY3Rpb246IGNsaWNrQWN0aW9uLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkOiBzZWxlY3RlZCwKICAgICAgICAgICAgICAgICAgICBpbkxheWVyOiBpbkxheWVyCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9XSk7Cn0oKSk7CnPx71aFEAoAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADRfrEAAQAZLMcCoBzbAqAdgltAf9fk+HDVrOsCMgBAFjg9uAAABAQgKALfI5QBiD9tz8e9WrBIKAKYcAACmHAAAaPcoH9LFCAAnrR4TCABFAByYzKJAAEAGwdbAqAdgwKgHNh/1ltFalbPIjJewJoAYApiscQAAAQEICgBiD9sAt8jfSFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvamF2YXNjcmlwdA0KQ29udGVudC1MZW5ndGg6IDcxNjMNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gVG9wb2xvZ3kgT2JsaXF1ZSBWaWV3IE1vZHVsZS4KIFByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgdG8gdmlldyB0aGUgdG9wb2xvZ3kgYXMgdHdvIHBsYW5lcyAocGFja2V0ICYgb3B0aWNhbCkKIGZyb20gYW4gb2JsaXF1ZSAoc2lkZS1vbikgcGVyc3BlY3RpdmUuCiAqLwoKKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBpbmplY3RlZCByZWZzCiAgICB2YXIgJGxvZywgZnMsIHN1cywgZmxhc2g7CgogICAgLy8gYXBpIHRvIHRvcG9Gb3JjZQogICAgdmFyIGFwaTsKICAgIC8qCiAgICAgZm9yY2UoKSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCByZWYgdG8gZm9yY2UgbGF5b3V0IG9iamVjdAogICAgIHpvb21MYXllcigpICAgICAgICAgICAgICAgICAgICAvLyBnZXQgcmVmIHRvIHpvb20gbGF5ZXIKICAgICBub2RlR0JCb3goKSAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGJvdW5kaW5nIGJveCBvZiBub2RlIGdyb3VwIGxheWVyCiAgICAgbm9kZSgpICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCByZWYgdG8gRDMgc2VsZWN0aW9uIG9mIG5vZGVzCiAgICAgbGluaygpICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCByZWYgdG8gRDMgc2VsZWN0aW9uIG9mIGxpbmtzCiAgICAgbm9kZXMoKSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCByZWYgdG8gbmV0d29yayBub2RlcyBhcnJheQogICAgIHRpY2tTdHVmZiAgICAgICAgICAgICAgICAgICAgICAvLyByZWYgdG8gdGljayBmdW5jdGlvbnMKICAgICBub2RlTG9jayhiKSAgICAgICAgICAgICAgICAgICAgLy8gdGVzdC1hbmQtc2V0IG5vZGVMb2NrIHN0YXRlCiAgICAgb3BhY2lmeU1hcChiKSAgICAgICAgICAgICAgICAgIC8vIHNob3cgb3IgaGlkZSBtYXAgbGF5ZXIKICAgICBpbkxheWVyKGQsIGxheWVyKSAgICAgICAgICAgICAgLy8gcmV0dXJuIHRydWUgaWYgZCBpbiBsYXllciB7J3BrdCd8J29wdCd9CiAgICAgY2FsY0xpbmtQb3MoKSAgICAgICAgICAgICAgICAgIC8vIHJlY29tcHV0ZXMgbGluayBwb3MgYmFzZWQgb24gbm9kZSBkYXRhCiAgICAgKi8KCiAgICAvLyBjb25maWd1cmF0aW9uCiAgICB2YXIgeHNreSA9IC0uNywgICAgIC8vIHggc2tldyB5IGZhY3RvcgogICAgICAgIHhzayA9IC0zNSwgICAgICAvLyB4IHNrZXcgYW5nbGUKICAgICAgICB5c2MgPSAuNSwgICAgICAgLy8geSBzY2FsZQogICAgICAgIHBhZCA9IDUwLAogICAgICAgIHRpbWUgPSAxNTAwLAogICAgICAgIGZpbGwgPSB7CiAgICAgICAgICAgIHBrdDogJ3JnYmEoMTMwLDEzMCwxNzAsMC4zKScsICAgLy8gYmx1ZS1pc2gKICAgICAgICAgICAgb3B0OiAncmdiYSgxNzAsMTMwLDE3MCwwLjMpJyAgICAvLyBtYWdlbnRhLWlzaAogICAgICAgIH07CgogICAgLy8gaW50ZXJuYWwgc3RhdGUKICAgIHZhciBvYmxpcXVlID0gZmFsc2UsCiAgICAgICAgeGZmbiA9IG51bGwsCiAgICAgICAgcGxhbmUgPSB7fSwKICAgICAgICBvbGROb2RlTG9jazsKCgogICAgZnVuY3Rpb24gcGxhbmVJZCh0YWcpIHsKICAgICAgICByZXR1cm4gJ3RvcG8tb2J2aWV3LScgKyB0YWcgKyAnUGxhbmUnOwogICAgfQoKICAgIGZ1bmN0aW9uIHl0Zm4oaCwgZGlyKSB7CiAgICAgICAgcmV0dXJuIGggKiB5c2MgKiBkaXIgKiAxLjE7CiAgICB9CgogICAgZnVuY3Rpb24gb2JYZm9ybShoLCBkaXIpIHsKICAgICAgICB2YXIgeXQgPSB5dGZuKGgsIGRpcik7CiAgICAgICAgcmV0dXJuIHN1cy5zY2FsZSgxLCB5c2MpICsgc3VzLnRyYW5zbGF0ZSgwLCB5dCkgKyBzdXMuc2tld1goeHNrKTsKICAgIH0KCiAgICBmdW5jdGlvbiBub1hmb3JtKCkgewogICAgICAgIHJldHVybiBzdXMuc2tld1goMCkgKyBzdXMudHJhbnNsYXRlKDAsMCkgKyBzdXMuc2NhbGUoMSwxKTsKICAgIH0KCiAgICBmdW5jdGlvbiBwYWRCb3goYm94LCBwKSB7CiAgICAgICAgYm94LnggLT0gcDsKICAgICAgICBib3gueSAtPSBwOwogICAgICAgIGJveC53aWR0aCArPSBwKjI7CiAgICAgICAgYm94LmhlaWdodCArPSBwKjI7CiAgICB9CgogICAgZnVuY3Rpb24gdG9PYmxpcXVlVmlldygpIHsKICAgICAgICB2YXIgYm94ID0gYXBpLm5vZGVHQkJveCgpLAogICAgICAgICAgICBveCwgb3k7CgogICAgICAgIHBhZEJveChib3gsIHBhZCk7CgogICAgICAgIG94ID0gYm94LnggKyBib3gud2lkdGggLyAyOwogICAgICAgIG95ID0gYm94LnkgKyBib3guaGVpZ2h0IC8gMjsKCiAgICAgICAgLy8gcmVtZW1iZXIgbm9kZSBsb2NrIHN0YXRlLCB0aGVuIGxvY2sgdGhlIG5vZGVzIGRvd24KICAgICAgICBvbGROb2RlTG9jayA9IGFwaS5ub2RlTG9jayh0cnVlKTsKICAgICAgICBhcGkub3BhY2lmeU1hcChmYWxzZSk7CgogICAgICAgIGluc2VydFBsYW5lcyhveCwgb3kpOwoKICAgICAgICB4ZmZuID0gZnVuY3Rpb24gKHh5LCBkaXIpIHsKICAgICAgICAgICAgdmFyIHl0ID0geXRmbihib3guaGVpZ2h0LCBkaXIpLAogICAgICAgICAgICAgICAgYXggPSB4eS54IC0gb3gsCiAgICAgICAgICAgICAgICBheSA9IHh5LnkgLSBveSwKICAgICAgICAgICAgICAgIHggPSBheCArIGF5ICogeHNreSwKICAgICAgICAgICAgICAgIHkgPSAoYXkgKyB5dCkgKiB5c2M7CiAgICAgICAgICAgIHJldHVybiB7eDogb3ggKyB4LCB5OiBveSArIHl9OwogICAgICAgIH07CgogICAgICAgIHNob3dQbGFuZSgncGt0JywgYm94LCAtMSk7CiAgICAgICAgc2hvd1BsYW5lKCdvcHQnLCBib3gsIDEpOwogICAgICAgIG9iVHJhbnNpdGlvbk5vZGVzKCk7CiAgICB9CgogICAgZnVuY3Rpb24gdG9Ob3JtYWxWaWV3KCkgewogICAgICAgIHhmZm4gPSBudWxsOwoKICAgICAgICBoaWRlUGxhbmUoJ3BrdCcpOwogICAgICAgIGhpZGVQbGFuZSgnb3B0Jyk7CiAgICAgICAgb2JUcmFuc2l0aW9uTm9kZXMoKTsKCiAgICAgICAgcmVtb3ZlUGxhbmVzKCk7CgogICAgICAgIC8vIHJlc3RvcmUgbm9kZSBsb2NrIHN0YXRlCiAgICAgICAgYXBpLm5vZGVMb2NrKG9sZE5vZGVMb2NrKTsKICAgICAgICBhcGkub3BhY2lmeU1hcCh0cnVlKTsKICAgIH0KCiAgICBmdW5jdGlvbiBvYlRyYW5zaXRpb25Ob2RlcygpIHsKICAgICAgICAvLyByZXR1cm4gdGhlIGRpcmVjdGlvbiBmb3IgdGhlIG5vZGUKICAgICAgICAvLyAtMSBmb3IgcGt0IGxheWVyLCAxIGZvciBvcHRpY2FsIGxheWVyCiAgICAgICAgZnVuY3Rpb24gZGlyKGQpIHsKICAgICAgICAgICAgcmV0dXJuIGFwaS5pbkxheWVyKGQsICdwa3QnKSA/IC0xIDogMTsKICAgICAgICB9CgogICAgICAgIGlmICh4ZmZuKSB7CiAgICAgICAgICAgIGFwaS5ub2RlcygpLmZvckVhY2goZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgIHZhciBvbGR4eSA9IHt4OiBkLngsIHk6IGQueX0sCiAgICAgICAgICAgICAgICAgICAgY29vcmRzID0geGZmbihvbGR4eSwgZGlyKGQpKTsKICAgICAgICAgICAgICAgIGQub2xkeHkgPSBvbGR4eTsKICAgICAgICAgICAgICAgIGQucHggPSBkLnggPSBjb29yZHMueDsKICAgICAgICAgICAgICAgIGQucHkgPSBkLnkgPSBjb29yZHMueTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYXBpLm5vZGVzKCkuZm9yRWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgdmFyIG9sZCA9IGQub2xkeHkgfHwge3g6IGQueCwgeTogZC55fTsKICAgICAgICAgICAgICAgIGQucHggPSBkLnggPSBvbGQueDsKICAgICAgICAgICAgICAgIGQucHkgPSBkLnkgPSBvbGQueTsKICAgICAgICAgICAgICAgIGRlbGV0ZSBkLm9sZHh5OwogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIGFwaS5ub2RlKCkudHJhbnNpdGlvbigpCiAgICAgICAgICAgIC5kdXJhdGlvbih0aW1lKQogICAgICAgICAgICAuYXR0cihhcGkudGlja1N0dWZmLm5vZGVBdHRyKTsKICAgICAgICBhcGkubGluaygpLnRyYW5zaXRpb24oKQogICAgICAgICAgICAuZHVyYXRpb24odGltZSkKICAgICAgICAgICAgLmNhbGwoYXBpLmNhbGNMaW5rUG9zKQogICAgICAgICAgICAuYXR0cihhcGkudGlja1N0dWZmLmxpbmtBdHRyKQogICAgICAgICAgICAuY2FsbChhcGkuYXBwbHlOdW1MaW5rTGFiZWxzKTsKICAgICAgICBhcGkubGlua0xhYmVsKCkudHJhbnNpdGlvbigpCiAgICAgICAgICAgIC5kdXJhdGlvbih0aW1lKQogICAgICAgICAgICAuYXR0cihhcGkudGlja1N0dWZmLmxpbmtMYWJlbEF0dHIpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNob3dQbGFuZSh0YWcsIGJveCwgZGlyKSB7CiAgICAgICAgLy8gc2V0IGJveCBvcmlnaW4gYXQgY2VudGVyLi4KICAgICAgICBib3gueCA9IC1ib3gud2lkdGgvMjsKICAgICAgICBib3gueSA9IC1ib3guaGVpZ2h0LzI7CgogICAgICAgIHBsYW5lW3RhZ10uc2VsZWN0KCdyZWN0JykKICAgICAgICAgICAgLmF0dHIoYm94KQogICAgICAgICAgICAuYXR0cignb3BhY2l0eScsIDApCiAgICAgICAgICAgIC50cmFuc2l0aW9uKCkKICAgICAgICAgICAgLmR1cmF0aW9uKHRpbWUpCiAgICAgICAgICAgIC5hdHRyKCdvcGFjaXR5JywgMSkKICAgICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIG9iWGZvcm0oYm94LmhlaWdodCwgZGlyKSk7CiAgICB9CgogICAgZnVuY3Rpb24gaGlkZVBsYW5lKHRhZykgewogICAgICAgIHBsYW5lW3RhZ10uc2VsZWN0KCdyZWN0JykKICAgICAgICAgICAgLnRyYW5zaXRpb24oKQogICAgICAgICAgICAuZHVyYXRpb24odGltZSkKICAgICAgICAgICAgLmF0dHIoJ29wYWNpdHknLCAwKQogICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgbm9YZm9ybSgpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBpbnNlcnRQbGFuZXMob3gsIG95KSB7CiAgICAgICAgZnVuY3Rpb24gaW5zKHRhZykgewogICAgICAgICAgICB2YXIgaWQgPSBwbGFuZUlkKHRhZyksCiAgICAgICAgICAgICAgICBnID0gYXBpLnpvb21MYXllcigpLmluc2VydCgnZycsICcjdG9wby1HJykKICAgICAgICAgICAgICAgICAgICAuYXR0cignaWQnLCBpZCkKICAgICAgICAgICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgc3VzLnRyYW5zbGF0ZShveCxveSkpOwogICAgICAgICAgICBnLmFwcGVuZCgncmVjdCcpCiAgICAgICAgICAgICAgICAuYXR0cignZmlsbCcsIGZpbGxbdGFnXSkKICAgICAgICAgICAgICAgIC5hdHRyKCdvcGFjaXR5JywgMCk7CiAgICAgICAgICAgIHBsYW5lW3RhZ10gPSBnOwogICAgICAgIH0KICAgICAgICBpbnMoJ29wdCcpOwogICAgICAgIGlucygncGt0Jyk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVtb3ZlUGxhbmVzKCkgewogICAgICAgIGZ1bmN0aW9uIHJlbSh0YWcpIHsKICAgICAgICAgICAgdmFyIGlkID0gcGxhbmVJZCh0YWcpOwogICAgICAgICAgICBhcGkuem9vbUxheWVyKCkuc2VsZWN0KCcjJytpZCkKICAgICAgICAgICAgICAgIC50cmFuc2l0aW9uKCkKICAgICAgICAgICAgICAgIC5kdXJhdGlvbih0aW1lICsgNTApCiAgICAgICAgICAgICAgICAucmVtb3ZlKCk7CiAgICAgICAgICAgIGRlbGV0ZSBwbGFuZVt0YWddOwogICAgICAgIH0KICAgICAgICByZW0oJ29wdCcpOwogICAgICAgIHJlbSgncGt0Jyk7CiAgICB9CgoKLy8gPT09IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vID09PSBNT0RVTEUgREVGSU5JVElPTiA9PT0KCmFuZ3VsYXIubW9kdWxlKCdvdlRvcG8nKQogICAgLmZhY3RvcnkoJ1RvcG9PYmxpcXVlU2VydmljZScsCiAgICBbJyRsb2cnLCAnRm5TZXJ2aWNlJywgJ1N2Z1V0aWxTZXJ2aWNlJywgJ0ZsYXNoU2VydmljZScsCgogICAgZnVuY3Rpb24gKF8kbG9nXywgX2ZzXywgX3N1c18sIF9mbGFzaF8pIHsKICAgICAgICAkbG9nID0gXyRsb2dfOwogICAgICAgIGZzID0gX2ZzXzsKICAgICAgICBzdXMgPSBfc3VzXzsKICAgICAgICBmbGFzaCA9IF9mbGFzaF87CgogICAgICAgIGZ1bmN0aW9uIGluaXRPYmxpcXVlKF9hcGlfKSB7CiAgICAgICAgICAgIGFwaSA9IF9hcGlfOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZGVzdHJveU9ibGlxdWUoKSB7IH0KCiAgICAgICAgZnVuY3Rpb24gdG9nZ2xlT2JsaXF1ZSgpIHsKICAgICAgICAgICAgb2JsaXF1ZSA9ICFvYmxpcXVlOwogICAgICAgICAgICBpZiAob2JsaXF1ZSkgewogICAgICAgICAgICAgICAgYXBpLmZvcmNlKCkuc3RvcCgpOwogICAgICAgICAgICAgICAgZmxhc2guZmxhc2goJ09ibGlxdWUgdmlldycpOwogICAgICAgICAgICAgICAgdG9PYmxpcXVlVmlldygpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZmxhc2guZmxhc2goJ05vcm1hbCB2aWV3Jyk7CiAgICAgICAgICAgICAgICB0b05vcm1hbFZpZXcoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgaW5pdE9ibGlxdWU6IGluaXRPYmxpcXVlLAogICAgICAgICAgICBkZXN0cm95T2JsaXF1ZTogZGVzdHJveU9ibGlxdWUsCgogICAgICAgICAgICBpc09ibGlxdWU6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG9ibGlxdWU7IH0sCiAgICAgICAgICAgIHRvZ2dsZU9ibGlxdWU6IHRvZ2dsZU9ibGlxdWUKICAgICAgICB9OwogICAgfV0pOwp9KCkpOwpz8e9WlhMKAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA03Z1AAEAGzT/AqAc2wKgHYJbRH/WMl7AmWpXQLIAQBY7pJwAAAQEICgC3yOUAYg/bc/HvVvMTCgCPAgAAjwIAAAgAJ60eE2j3KB/SxQgARQACgV+tQABABkjjwKgHNsCoB2CW0B/1+T4cNWs6wIyAGAWkdAAAAAEBCAoAt8jlAGIP20dFVCAvb25vcy91aS9hcHAvdmlldy9kZXZpY2UvZGV2aWNlLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiAqLyoNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9W/hMKAEIAAABCAAAAaPcoH9LFCAAnrR4TCABFAAA0iWNAAEAGIXrAqAdgwKgHNh/1ltBrOsCM+T4egoAQAleQDQAAAQEICgBiD9sAt8jlc/HvVgQYCgCLAgAAiwIAAAgAJ60eE2j3KB/SxQgARQACfd2eQABABsr1wKgHNsCoB2CW0R/1jJewJlqV0CyAGAWkBncAAAEBCAoAt8jlAGIP20dFVCAvb25vcy91aS9hcHAvdmlldy9mbG93L2Zsb3cuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6ICovKg0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCnPx71aKIQoA3TAAAN0wAABo9ygf0sUIACetHhMIAEUAMM+JZEAAQAbw3cCoB2DAqAc2H/WW0Gs6wIz5Ph6CgBgCV8CoAAABAQgKAGIP3AC3yOVIVFRQLzEuMSAyMDAgT0sNCkNvbnRlbnQtVHlwZTogdGV4dC9qYXZhc2NyaXB0DQpDb250ZW50LUxlbmd0aDogMTIzMzcNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KLyoKICogQ29weXJpZ2h0IDIwMTUsMjAxNiBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBEZXZpY2UgVmlldyBNb2R1bGUKICovCgooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIGluamVjdGVkIHJlZnMKICAgIHZhciAkbG9nLCAkc2NvcGUsICRsb2MsIGZzLCBtYXN0LCBwcywgd3NzLCBpcywgbnMsIGtzOwoKICAgIC8vIGludGVybmFsIHN0YXRlCiAgICB2YXIgZGV0YWlsc1BhbmVsLAogICAgICAgIHBTdGFydFksCiAgICAgICAgcEhlaWdodCwKICAgICAgICB0b3AsCiAgICAgICAgYm90dG9tLAogICAgICAgIGljb25EaXYsCiAgICAgICAgd1NpemUsCiAgICAgICAgZWRpdGluZ05hbWUgPSBmYWxzZTsKCiAgICAvLyBjb25zdGFudHMKICAgIHZhciB0b3BQZGcgPSAxMywKICAgICAgICBjdG5yUGRnID0gMjQsCiAgICAgICAgc2Nyb2xsU2l6ZSA9IDE3LAogICAgICAgIHBvcnRzVGJsUGRnID0gNTAsCgogICAgICAgIHBOYW1lID0gJ2RldmljZS1kZXRhaWxzLXBhbmVsJywKICAgICAgICBkZXRhaWxzUmVxID0gJ2RldmljZURldGFpbHNSZXF1ZXN0JywKICAgICAgICBkZXRhaWxzUmVzcCA9ICdkZXZpY2VEZXRhaWxzUmVzcG9uc2UnLAogICAgICAgIG5hbWVDaGFuZ2VSZXEgPSAnZGV2aWNlTmFtZUNoYW5nZVJlcXVlc3QnLAogICAgICAgIG5hbWVDaGFuZ2VSZXNwID0gJ2RldmljZU5hbWVDaGFuZ2VSZXNwb25zZScsCgogICAgICAgIHByb3BPcmRlciA9IFsKICAgICAgICAgICAgJ2lkJywgJ3R5cGUnLCAnbWFzdGVyaWQnLCAnY2hhc3Npc2lkJywKICAgICAgICAgICAgJ21mcicsICdodycsICdzdycsICdwcm90b2NvbCcsICdzZXJpYWwnCiAgICAgICAgXSwKICAgICAgICBmcmllbmRseVByb3BzID0gWwogICAgICAgICAgICAnVVJJJywgJ1R5cGUnLCAnTWFzdGVyIElEJywgJ0NoYXNzaXMgSUQnLAogICAgICAgICAgICAnVmVuZG9yJywgJ0gvVyBWZXJzaW9uJywgJ1MvVyBWZXJzaW9uJywgJ1Byb3RvY29sJywgJ1NlcmlhbCAjJwogICAgICAgIF0sCiAgICAgICAgcG9ydENvbHMgPSBbCiAgICAgICAgICAgICdlbmFibGVkJywgJ2lkJywgJ3NwZWVkJywgJ3R5cGUnLCAnZWxpbmtzX2Rlc3QnLCAnbmFtZScKICAgICAgICBdLAogICAgICAgIGZyaWVuZGx5UG9ydENvbHMgPSBbCiAgICAgICAgICAgICdFbmFibGVkJywgJ0lEJywgJ1NwZWVkJywgJ1R5cGUnLCAnRWdyZXNzIExpbmtzJywgJ05hbWUnCiAgICAgICAgXTsKCiAgICBmdW5jdGlvbiBjbG9zZVBhbmVsKCkgewogICAgICAgIGlmIChkZXRhaWxzUGFuZWwuaXNWaXNpYmxlKCkpIHsKICAgICAgICAgICAgJHNjb3BlLnNlbElkID0gbnVsbDsKICAgICAgICAgICAgZGV0YWlsc1BhbmVsLmhpZGUoKTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBmdW5jdGlvbiBhZGRDbG9zZUJ0bihkaXYpIHsKICAgICAgICBpcy5sb2FkRW1iZWRkZWRJY29uKGRpdiwgJ3BsdXMnLCAzMCk7CiAgICAgICAgZGl2LnNlbGVjdCgnZycpLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoMjUsIDApIHJvdGF0ZSg0NSknKTsKICAgICAgICBkaXYub24oJ2NsaWNrJywgY2xvc2VQYW5lbCk7CiAgICB9CgogICAgZnVuY3Rpb24gZXhpdEVkaXRNb2RlKG5hbWVIMiwgbmFtZSkgewogICAgICAgIG5hbWVIMi5odG1sKG5hbWUpOwogICAgICAgIG5hbWVIMi5jbGFzc2VkKCdlZGl0YWJsZScsIHRydWUpOwogICAgICAgIGVkaXRpbmdOYW1lID0gZmFsc2U7CiAgICAgICAga3MuZW5hYmxlR2xvYmFsS2V5cyh0cnVlKTsKICAgIH0KCiAgICBmdW5jdGlvbiBlZGl0TmFtZVNhdmUoKSB7CiAgICAgICAgdmFyIG5hbWVIMiA9IHRvcC5zZWxlY3QoJ2gyJyksCiAgICAgICAgICAgIGlkID0gJHNjb3BlLnBhbmVsRGF0YS5pZCwKICAgICAgICAgICAgdmFsLAogICAgICAgICAgICBuZXdWYWw7CgogICAgICAgIGlmIChlZGl0aW5nTmFtZSkgewogICAgICAgICAgICB2YWwgPSBuYW1lSDIuc2VsZWN0KCdpbnB1dCcpLnByb3BlcnR5KCd2YWx1ZScpLnRyaW0oKTsKICAgICAgICAgICAgbmV3VmFsID0gdmFsIHx8IGlkOwoKICAgICAgICAgICAgZXhpdEVkaXRNb2RlKG5hbWVIMiwgbmV3VmFsKTsKICAgICAgICAgICAgJHNjb3BlLnBhbmVsRGF0YS5uYW1lID0gbmV3VmFsOwogICAgICAgICAgICB3c3Muc2VuZEV2ZW50KG5hbWVDaGFuZ2VSZXEsIHsgaWQ6IGlkLCBuYW1lOiB2YWwgfSk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGVkaXROYW1lQ2FuY2VsKCkgewogICAgICAgIGlmIChlZGl0aW5nTmFtZSkgewogICAgICAgICAgICBleGl0RWRpdE1vZGUodG9wLnNlbGVjdCgnaDInKSwgJHNjb3BlLnBhbmVsRGF0YS5uYW1lKTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBmdW5jdGlvbiBlZGl0TmFtZSgpIHsKICAgICAgICB2YXIgbmFtZUgyID0gdG9wLnNlbGVjdCgnaDInKSwKICAgICAgICAgICAgdGYsIGVsOwoKICAgICAgICBpZiAoIWVkaXRpbmdOYW1lKSB7CiAgICAgICAgICAgIG5hbWVIMi5jbGFzc2VkKCdlZGl0YWJsZScsIGZhbHNlKTsKICAgICAgICAgICAgbmFtZUgyLmh0bWwoJycpOwogICAgICAgICAgICB0ZiA9IG5hbWVIMi5hcHBlbmQoJ2lucHV0JykuY2xhc3NlZCgnbmFtZS1pbnB1dCcsIHRydWUpCiAgICAgICAgICAgICAgICAuYXR0cigndHlwZScsICd0ZXh0JykKICAgICAgICAgICAgICAgIC5hdHRyKCd2YWx1ZScsICRzY29wZS5wYW5lbERhdGEubmFtZSk7CiAgICAgICAgICAgIGVsID0gdGZbMF1bMF07CiAgICAgICAgICAgIGVsLmZvY3VzKCk7CiAgICAgICAgICAgIGVsLnNlbGVjdCgpOwogICAgICAgICAgICBlZGl0aW5nTmFtZSA9IHRydWU7CiAgICAgICAgICAgIGtzLmVuYWJsZUdsb2JhbEtleXMoZmFsc2UpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBoYW5kbGVFc2NhcGUoKSB7CiAgICAgICAgcmV0dXJuIGVkaXROYW1lQ2FuY2VsKCkgfHwgY2xvc2VQYW5lbCgpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNldFVwUGFuZWwoKSB7CiAgICAgICAgdmFyIGNvbnRhaW5lciwgY2xvc2VCdG4sIHRibERpdjsKICAgICAgICBkZXRhaWxzUGFuZWwuZW1wdHkoKTsKCiAgICAgICAgY29udGFpbmVyID0gZGV0YWlsc1BhbmVsLmFwcGVuZCgnZGl2JykuY2xhc3NlZCgnY29udGFpbmVyJywgdHJ1ZSk7CgogICAgICAgIHRvcCA9IGNvbnRhaW5lci5hcHBlbmQoJ2RpdicpLmNsYXNzZWQoJ3RvcCcsIHRydWUpOwogICAgICAgIGNsb3NlQnRuID0gdG9wLmFwcGVuZCgnZGl2JykuY2xhc3NlZCgnY2xvc2UtYnRuJywgdHJ1ZSk7CiAgICAgICAgYWRkQ2xvc2VCdG4oY2xvc2VCdG4pOwogICAgICAgIGljb25EaXYgPSB0b3AuYXBwZW5kKCdkaXYnKS5jbGFzc2VkKCdkZXYtaWNvbicsIHRydWUpOwogICAgICAgIHRvcC5hcHBlbmQoJ2gyJykuY2xhc3NlZCgnZWRpdGFibGUnLCB0cnVlKS5vbignY2xpY2snLCBlZGl0TmFtZSk7CgogICAgICAgIHRibERpdiA9IHRvcC5hcHBlbmQoJ2RpdicpLmNsYXNzZWQoJ3RvcC10YWJsZXMnLCB0cnVlKTsKICAgICAgICB0YmxEaXYuYXBwZW5kKCdkaXYnKS5jbGFzc2VkKCdsZWZ0JywgdHJ1ZSkuYXBwZW5kKCd0YWJsZScpOwogICAgICAgIHRibERpdi5hcHBlbmQoJ2RpdicpLmNsYXNzZWQoJ3JpZ2h0JywgdHJ1ZSkuYXBwZW5kKCd0YWJsZScpOwoKICAgICAgICB0b3AuYXBwZW5kKCdocicpOwoKICAgICAgICBib3R0b20gPSBjb250YWluZXIuYXBwZW5kKCdkaXYnKS5jbGFzc2VkKCdib3R0b20nLCB0cnVlKTsKICAgICAgICBib3R0b20uYXBwZW5kKCdoMicpLmNsYXNzZWQoJ3BvcnRzLXRpdGxlJywgdHJ1ZSkuaHRtbCgnUG9ydHMnKTsKICAgICAgICBib3R0b20uYXBwZW5kKCd0YWJsZScpOwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZFByb3AodGJvZHksIGluZGV4LCB2YWx1ZSkgewogICAgICAgIHZhciB0ciA9IHRib2R5LmFwcGVuZCgndHInKTsKCiAgICAgICAgZnVuY3Rpb24gYWRkQ2VsbChjbHMsIHR4dCkgewogICAgICAgICAgICB0ci5hcHBlbmQoJ3RkJykuYXR0cignY2xhc3MnLCBjbHMpLmh0bWwodHh0KTsKICAgICAgICB9CiAgICAgICAgYWRkQ2VsbCgnbGFiZWwnLCBmcmllbmRseVByb3BzW2luZGV4XSArICcgOicpOwogICAgICAgIGFkZENlbGwoJ3ZhbHVlJywgdmFsdWUpOwogICAgfQoKICAgIGZ1bmN0aW9uIHBvcHVsYXRlVG9wKHRibERpdiwgZGV0YWlscykgewogICAgICAgIHZhciBsZWZ0VGJsID0gdGJsRGl2LnNlbGVjdCgnLmxlZnQnKQogICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0KCd0YWJsZScpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJ3Rib2R5JyksCiAgICAgICAgICAgIHJpZ2h0VGJsID0gdGJsRGl2LnNlbGVjdCgnLnJpZ2h0JykKICAgICAgICAgICAgICAgICAgICAgICAgLnNlbGVjdCgndGFibGUnKQogICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCd0Ym9keScpOwoKICAgICAgICBpcy5sb2FkRW1iZWRkZWRJY29uKGljb25EaXYsIGRldGFpbHMuX2ljb25pZF90eXBlLCA0MCk7CiAgICAgICAgdG9wLnNlbGVjdCgnaDInKS5odG1sKGRldGFpbHMubmFtZSk7CgogICAgICAgIHByb3BPcmRlci5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wLCBpKSB7CiAgICAgICAgICAgIC8vIHByb3BlcnRpZXMgYXJlIHNwbGl0IGludG8gdHdvIHRhYmxlcwogICAgICAgICAgICBhZGRQcm9wKGkgPCA0ID8gbGVmdFRibCA6IHJpZ2h0VGJsLCBpLCBkZXRhaWxzW3Byb3BdKTsKICAgICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBhZGRQb3J0Um93KHRib2R5LCBwb3J0KSB7CiAgICAgICAgdmFyIHRyID0gdGJvZHkuYXBwZW5kKCd0cicpOwoKICAgICAgICBwb3J0Q29scy5mb3JFYWNoKGZ1bmN0aW9uIChjb2wpIHsKICAgICAgICAgICAgdHIuYXBwZW5kKCd0ZCcpLmh0bWwocG9ydFtjb2xdKTsKICAgICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBwb3B1bGF0ZUJvdHRvbSh0YWJsZSwgcG9ydHMpIHsKICAgICAgICB2YXIgdGhlYWRlciA9IHRhYmxlLmFwcGVuZCgndGhlYWQnKS5hcHBlbmQoJ3RyJyksCiAgICAgICAgICAgIHRib2R5ID0gdGFibGUuYXBwZW5kKCd0Ym9keScpLAogICAgICAgICAgICB0YldpZHRoLCB0YkhlaWdodDsKCiAgICAgICAgZnJpZW5kbHlQb3J0Q29scy5mb3JFYWNoKGZ1bmN0aW9uIChjb2wpIHsKICAgICAgICAgICAgdGhlYWRlci5hcHBlbmQoJ3RoJykuaHRtbChjb2wpOwogICAgICAgIH0pOwogICAgICAgIHBvcnRzLmZvckVhY2goZnVuY3Rpb24gKHBvcnQpIHsKICAgICAgICAgICAgYWRkUG9ydFJvdyh0Ym9keSwgcG9ydCk7CiAgICAgICAgfSk7CgogICAgICAgIHRiV2lkdGggPSBmcy5ub1B4U3R5bGUodGJvZHksICd3aWR0aCcpICsgc2Nyb2xsU2l6ZTsKICAgICAgICB0YkhlaWdodCA9IHBIZWlnaHQKICAgICAgICAgICAgICAgICAgICAtIChmcy5ub1B4U3R5bGUoZGV0YWlsc1BhbmVsLmVsKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QoJy50b3AnKSwgJ2hlaWdodCcpCiAgICAgICAgICAgICAgICAgICAgKyBmcy5ub1B4U3R5bGUoZGV0YWlsc1BhbmVsLmVsKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QoJy5wb3J0cy10aXRsZScpLCAnaGVpZ2h0JykKICAgICAgICAgICAgICAgICAgICArIHBvcnRzVGJsUGRnKTsKCiAgICAgICAgdGFibGUuc3R5bGUoewogICAgICAgICAgICBoZWlnaHQ6IHRiSGVpZ2h0ICsgJ3B4JywKICAgICAgICAgICAgd2lkdGg6IHRiV2lkdGggKyAncHgnLAogICAgICAgICAgICBvdmVyZmxvdzogJ2F1dG8nLAogICAgICAgICAgICBkaXNwbGF5OiAnYmxvY2snCiAgICAgICAgfSk7CgogICAgICAgIGRldGFpbHNQYW5lbC53aWR0aCh0YldpZHRoICsgY3RuclBkZyk7CiAgICB9CgogICAgZnVuY3Rpb24gcG9wdWxhdGVOYW1lKGRpdiwgbmFtZSkgewogICAgICAgIHZhciBsYWIgPSBkaXYuc2VsZWN0KCcubGFiZWwnKSwKICAgICAgICAgICAgdmFsID0gZGl2LnNlbGVjdCgnLnZhbHVlJyk7CiAgICAgICAgbGFiLmh0bWwoJ0ZyaWVuZGx5IE5hbWU6Jyk7CiAgICAgICAgdmFsLmh0bWwobmFtZSk7CiAgICB9CgogICAgZnVuY3Rpb24gcG9wdWxhdGVEZXRhaWxzKGRldGFpbHMpIHsKICAgICAgICB2YXIgbmFtZURpdiwgdG9wVGJzLCBidG1UYmwsIHBvcnRzOwogICAgICAgIHNldFVwUGFuZWwoKTsKCiAgICAgICAgbmFtZURpdiA9IHRvcC5zZWxlY3QoJy5uYW1lLWRpdicpOwogICAgICAgIHRvcFRicyA9IHRvcC5zZWxlY3QoJy50b3AtdGFibGVzJyk7CiAgICAgICAgYnRtVGJsID0gYm90dG9tLnNlbGVjdCgndGFibGUnKTsKICAgICAgICBwb3J0cyA9IGRldGFpbHMucG9ydHM7CgogICAgICAgIHBvcHVsYXRlTmFtZShuYW1lRGl2LCBkZXRhaWxzLm5hbWUpOwogICAgICAgIHBvcHVsYXRlVG9wKHRvcFRicywgZGV0YWlscyk7CiAgICAgICAgcG9wdWxhdGVCb3R0b20oYnRtVGJsLCBwb3J0cyk7CgogICAgICAgIGRldGFpbHNQYW5lbC5oZWlnaHQocEhlaWdodCk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVzcERldGFpbHNDYihkYXRhKSB7CiAgICAgICAgJHNjb3BlLnBhbmVsRGF0YSA9IGRhdGEuZGV0YWlsczsKICAgICAgICAkc2NvcGUuJGFwcGx5KCk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVzcE5hbWVDYihkYXRhKSB7CiAgICAgICAgaWYgKGRhdGEud2FybikgewogICAgICAgICAgICAkbG9nLndhcm4oZGF0YS53YXJuLCBkYXRhLmlkKTsKICAgICAgICAgICAgdG9wLnNlbGVjdCgnaDInKS5odG1sKGRhdGEuaWQpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdGVEZXRhaWxzUGFuZSgpIHsKICAgICAgICBkZXRhaWxzUGFuZWwgPSBwcy5jcmVhdGVQYW5lbChwTmFtZSwgewogICAgICAgICAgICB3aWR0aDogd1NpemUud2lkdGgsCiAgICAgICAgICAgIG1hcmdpbjogMCwKICAgICAgICAgICAgaGlkZU1hcmdpbjogMAogICAgICAgIH0pOwogICAgICAgIGRldGFpbHNQYW5lbC5lbCgpLnN0eWxlKHsKICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsCiAgICAgICAgICAgIHRvcDogcFN0YXJ0WSArICdweCcKICAgICAgICB9KTsKICAgICAgICAkc2NvcGUuaGlkZVBhbmVsID0gZnVuY3Rpb24gKCkgeyBkZXRhaWxzUGFuZWwuaGlkZSgpOyB9OwogICAgICAgIGRldGFpbHNQYW5lbC5oaWRlKCk7CiAgICB9CgogICAgYW5ndWxhci5tb2R1bGUoJ292RGV2aWNlJywgW10pCiAgICAuY29udHJvbGxlcignT3ZEZXZpY2VDdHJsJywKICAgICAgICBbJyRsb2cnLCAnJHNjb3BlJywgJyRsb2NhdGlvbicsICdUYWJsZUJ1aWxkZXJTZXJ2aWNlJywgJ0ZuU2VydmljZScsCiAgICAgICAgICAgICdNYXN0U2VydmljZScsICdQYW5lbFNlcnZpY2UnLCAnV2ViU29ja2V0U2VydmljZScsICdJY29uU2VydmljZScsCiAgICAgICAgICAgICdOYXZTZXJ2aWNlJywgJ0tleVNlcnZpY2UnLAoKICAgICAgICBmdW5jdGlvbiAoXyRsb2dfLCBfJHNjb3BlXywgXyRsb2NhdGlvbl8sCiAgICAgICAgICAgICAgICAgIHRicywgX2ZzXywgX21hc3RfLCBfcHNfLCBfd3NzXywgX2lzXywgX25zXywgX2tzXykgewogICAgICAgICAgICB2YXIgcGFyYW1zLAogICAgICAgICAgICAgICAgaGFuZGxlcnMgPSB7fTsKCiAgICAgICAgICAgICRsb2cgPSBfJGxvZ187CiAgICAgICAgICAgICRzY29wZSA9IF8kc2NvcGVfOwogICAgICAgICAgICAkbG9jID0gXyRsb2NhdGlvbl87CiAgICAgICAgICAgIGZzID0gX2ZzXzsKICAgICAgICAgICAgbWFzdCA9IF9tYXN0XzsKICAgICAgICAgICAgcHMgPSBfcHNfOwogICAgICAgICAgICB3c3MgPSBfd3NzXzsKICAgICAgICAgICAgaXMgPSBfaXNfOwogICAgICAgICAgICBucyA9IF9uc187CiAgICAgICAgICAgIGtzID0gX2tzXzsKCiAgICAgICAgICAgIHBhcmFtcyA9ICRsb2Muc2VhcmNoKCk7CgogICAgICAgICAgICAkc2NvcGUucGFuZWxEYXRhID0ge307CiAgICAgICAgICAgICRzY29wZS5mbG93VGlwID0gJ1Nob3cgZmxvdyB2aWV3IGZvciBzZWxlY3RlZCBkZXZpY2UnOwogICAgICAgICAgICAkc2NvcGUucG9ydFRpcCA9ICdTaG93IHBvcnQgdmlldyBmb3Igc2VsZWN0ZWQgZGV2aWNlJzsKICAgICAgICAgICAgJHNjb3BlLmdyb3VwVGlwID0gJ1Nob3cgZ3JvdXAgdmlldyBmb3Igc2VsZWN0ZWQgZGV2aWNlJzsKICAgICAgICAgICAgJHNjb3BlLm1ldGVyVGlwID0gJ1Nob3cgbWV0ZXIgdmlldyBmb3Igc2VsZWN0ZWQgZGV2aWNlJzsKCiAgICAgICAgICAgIC8vIGRldGFpbHMgcGFuZWwgaGFuZGxlcnMKICAgICAgICAgICAgaGFuZGxlcnNbZGV0YWlsc1Jlc3BdID0gcmVzcERldGFpbHNDYjsKICAgICAgICAgICAgaGFuZGxlcnNbbmFtZUNoYW5nZVJlc3BdID0gcmVzcE5hbWVDYjsKICAgICAgICAgICAgd3NzLmJpbmRIYW5kbGVycyhoYW5kbGVycyk7CgogICAgICAgICAgICAvLyBxdWVyeSBmb3IgaWYgYSBjZXJ0YWluIGRldmljZSBuZWVkcyB0byBiZSBoaWdobGlnaHRlZAogICAgICAgICAgICBpZiAocGFyYW1zLmhhc093blByb3BlcnR5KCdkZXZJZCcpKSB7CiAgICAgICAgICAgICAgICAkc2NvcGUuc2VsSWQgPSBwYXJhbXNbJ2RldklkJ107CiAgICAgICAgICAgICAgICB3c3Muc2VuZEV2ZW50KGRldGFpbHNSZXEsIHsgaWQ6ICRzY29wZS5zZWxJZCB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZnVuY3Rpb24gc2VsQ2IoJGV2ZW50LCByb3cpIHsKICAgICAgICAgICAgICAgIGlmICgkc2NvcGUuc2VsSWQpIHsKICAgICAgICAgICAgICAgICAgICB3c3Muc2VuZEV2ZW50KGRldGFpbHNSZXEsIHsgaWQ6IHJvdy5pZCB9KTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmhpZGVQYW5lbCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGxvZy5kZWJ1ZygnR290IGEgY2xpY2sgb246Jywgcm93KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGJzLmJ1aWxkVGFibGUoewogICAgICAgICAgICAgICAgc2NvcGU6ICRzY29wZSwKICAgICAgICAgICAgICAgIHRhZzogJ2RldmljZScsCiAgICAgICAgICAgICAgICBzZWxDYjogc2VsQ2IKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAkc2NvcGUubmF2ID0gZnVuY3Rpb24gKHBhdGgpIHsKICAgICAgICAgICAgICAgIGlmICgkc2NvcGUuc2VsSWQpIHsKICAgICAgICAgICAgICAgICAgICBucy5uYXZUbyhwYXRoLCB7IGRldklkOiAkc2NvcGUuc2VsSWQgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAkc2NvcGUuJG9uKCckZGVzdHJveScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHdzcy51bmJpbmRIYW5kbGVycyhoYW5kbGVycyk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgJGxvZy5sb2coJ092RGV2aWNlQ3RybCBoYXMgYmVlbiBjcmVhdGVkJyk7CiAgICAgICAgfV0pCgogICAgLmRpcmVjdGl2ZSgnZGV2aWNlRGV0YWlsc1BhbmVsJywKICAgIFsnJHJvb3RTY29wZScsICckd2luZG93JywgJyR0aW1lb3V0JywgJ0tleVNlcnZpY2UnLAogICAgZnVuY3Rpb24gKCRyb290U2NvcGUsICR3aW5kb3csICR0aW1lb3V0LCBrcykgewogICAgICAgIHJldHVybiBmdW5jdGlvbiAoc2NvcGUpIHsKICAgICAgICAgICAgdmFyIHVuYmluZFdhdGNoOwoKICAgICAgICAgICAgZnVuY3Rpb24gaGVpZ2h0Q2FsYygpIHsKICAgICAgICAgICAgICAgIHBTdGFydFkgPSBmcy5ub1B4U3R5bGUoZDMuc2VsZWN0KCcudGFidWxhci1oZWFkZXInKSwgJ2hlaWdodCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1hc3QubWFzdEhlaWdodCgpICsgdG9wUGRnOwogICAgICAgICAgICAgICAgd1NpemUgPSBmcy53aW5kb3dTaXplKHBTdGFydFkpOwogICAgICAgICAgICAgICAgcEhlaWdodCA9IHdTaXplLmhlaWdodDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZnVuY3Rpb24gaW5pdFBhbmVsKCkgewogICAgICAgICAgICAgICAgaGVpZ2h0Q2FsYygpOwogICAgICAgICAgICAgICAgY3JlYXRlRGV0YWlsc1BhbmUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gU2FmYXJpIGhhcyBhIGJ1ZyB3aGVyZSBpdCByZW5kZXJzIHRoZSBmaXhlZC1sYXlvdXQgdGFibGUgd3JvbmcKICAgICAgICAgICAgLy8gaWYgeW91IGFzayBmb3IgdGhlIHdpbmRvdydzIHNpemUgdG9vIGVhcmx5CiAgICAgICAgICAgIGlmIChzY29wZS5vbm9zLmJyb3dzZXIgPT09ICdzYWZhcmknKSB7CiAgICAgICAgICAgICAgICAkdGltZW91dChpbml0UGFuZWwpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaW5pdFBhbmVsKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gY3JlYXRlIGtleSBiaW5kaW5ncyB0byBoYW5kbGUgcGFuZWwKICAgICAgICAgICAga3Mua2V5QmluZGluZ3MoewogICAgICAgICAgICAgICAgZW50ZXI6IGVkaXROYW1lU2F2ZSwKICAgICAgICAgICAgICAgIGVzYzogW2hhbmRsZUVzY2FwZSwgJ0Nsb3NlIHRoZSBkZXRhaWxzIHBhbmVsJ10sCiAgICAgICAgICAgICAgICBfaGVscEZvcm1hdDogWydlc2MnXQogICAgICAgICAgICB9KTsKICAgICAgICAgICAga3MuZ2VzdHVyZU5vdGVzKFsKICAgICAgICAgICAgICAgIFsnY2xpY2snLCAnU2VsZWN0IGEgcm93IHRvIHNob3cgZGV2aWNlIGRldGFpbHMnXSwKICAgICAgICAgICAgICAgIFsnc2Nyb2xsIGRvd24nLCAnU2VlIG1vcmUgZGV2aWNlcyddCiAgICAgICAgICAgIF0pOwoKICAgICAgICAgICAgLy8gaWYgdGhlIHBhbmVsRGF0YSBjaGFuZ2VzCiAgICAgICAgICAgIHNjb3BlLiR3YXRjaCgncGFuZWxEYXRhJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKCFmcy5pc0VtcHR5T2JqZWN0KHNjb3BlLnBhbmVsRGF0YSkpIHsKICAgICAgICAgICAgICAgICAgICBwb3B1bGF0ZURldGFpbHMoc2NvcGUucGFuZWxEYXRhKTsKICAgICAgICAgICAgICAgICAgICBkZXRhaWxzUGFuZWwuc2hvdygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIGlmIHRoZSB3aW5kb3cgc2l6ZSBjaGFuZ2VzCiAgICAgICAgICAgIHVuYmluZFdhdGNoID0gJHJvb3RTY29wZS4kd2F0Y2hDb2xsZWN0aW9uKAogICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGg6ICR3aW5kb3cuaW5uZXJIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgIHc6ICR3aW5kb3cuaW5uZXJXaWR0aAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFmcy5pc0VtcHR5T2JqZWN0KHNjb3BlLnBhbmVsRGF0YSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0Q2FsYygpOwogICAgICAgICAgICAgICAgICAgICAgICBwb3B1bGF0ZURldGFpbHMoc2NvcGUucGFuZWxEYXRhKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICBzY29wZS4kb24oJyRkZXN0cm95JywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdW5iaW5kV2F0Y2goKTsKICAgICAgICAgICAgICAgIGtzLnVuYmluZEtleXMoKTsKICAgICAgICAgICAgICAgIHBzLmRlc3Ryb3lQYW5lbChwTmFtZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICB9XSk7Cn0oKSk7CnPx71aUIQoAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADRfrkAAQAZLL8CoBzbAqAdgltAf9fk+HoJrOvEngBAFbtyjAAABAQgKALfI5gBiD9xz8e9WlSYKAIsCAACLAgAACAAnrR4TaPcoH9LFCABFAAJ9X69AAEAGSOXAqAc2wKgHYJbQH/X5Ph6CazrxJ4AYBaTsxQAAAQEICgC3yOYAYg/cR0VUIC9vbm9zL3VpL2FwcC92aWV3L3BvcnQvcG9ydC5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVm8tCgBhCAAAYQgAAGj3KB/SxQgAJ60eEwgARQAIU8yoQABABtYVwKgHYMCoBzYf9ZbRWpXQLIyXsm+AGAKimCwAAAEBCAoAYg/dALfI5UhUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2phdmFzY3JpcHQNCkNvbnRlbnQtTGVuZ3RoOiAxOTc0DQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCi8qCiAqIENvcHlyaWdodCAyMDE1LDIwMTYgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gRmxvdyBWaWV3IE1vZHVsZQogKi8KCihmdW5jdGlvbiAoKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8gaW5qZWN0ZWQgcmVmZXJlbmNlcwogICAgdmFyICRsb2csICRzY29wZSwgJGxvY2F0aW9uLCBmcywgdGJzLCBuczsKCiAgICBhbmd1bGFyLm1vZHVsZSgnb3ZGbG93JywgW10pCiAgICAuY29udHJvbGxlcignT3ZGbG93Q3RybCcsCiAgICAgICAgWyckbG9nJywgJyRzY29wZScsICckbG9jYXRpb24nLAogICAgICAgICAgICAnRm5TZXJ2aWNlJywgJ1RhYmxlQnVpbGRlclNlcnZpY2UnLCAnTmF2U2VydmljZScsCgogICAgICAgIGZ1bmN0aW9uIChfJGxvZ18sIF8kc2NvcGVfLCBfJGxvY2F0aW9uXywgX2ZzXywgX3Ric18sIF9uc18pIHsKICAgICAgICAgICAgdmFyIHBhcmFtczsKICAgICAgICAgICAgJGxvZyA9IF8kbG9nXzsKICAgICAgICAgICAgJHNjb3BlID0gXyRzY29wZV87CiAgICAgICAgICAgICRsb2NhdGlvbiA9IF8kbG9jYXRpb25fOwogICAgICAgICAgICBmcyA9IF9mc187CiAgICAgICAgICAgIHRicyA9IF90YnNfOwogICAgICAgICAgICBucyA9IF9uc187CiAgICAgICAgICAgICRzY29wZS5kZXZpY2VUaXAgPSAnU2hvdyBkZXZpY2UgdGFibGUnOwogICAgICAgICAgICAkc2NvcGUucG9ydFRpcCA9ICdTaG93IHBvcnQgdmlldyBmb3IgdGhpcyBkZXZpY2UnOwogICAgICAgICAgICAkc2NvcGUuZ3JvdXBUaXAgPSAnU2hvdyBncm91cCB2aWV3IGZvciB0aGlzIGRldmljZSc7CiAgICAgICAgICAgICRzY29wZS5tZXRlclRpcCA9ICdTaG93IG1ldGVyIHZpZXcgZm9yIHNlbGVjdGVkIGRldmljZSc7CgogICAgICAgICAgICBwYXJhbXMgPSAkbG9jYXRpb24uc2VhcmNoKCk7CiAgICAgICAgICAgIGlmIChwYXJhbXMuaGFzT3duUHJvcGVydHkoJ2RldklkJykpIHsKICAgICAgICAgICAgICAgICRzY29wZS5kZXZJZCA9IHBhcmFtc1snZGV2SWQnXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGJzLmJ1aWxkVGFibGUoewogICAgICAgICAgICAgICAgc2NvcGU6ICRzY29wZSwKICAgICAgICAgICAgICAgIHRhZzogJ2Zsb3cnLAogICAgICAgICAgICAgICAgcXVlcnk6IHBhcmFtcwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICRzY29wZS5uYXYgPSBmdW5jdGlvbiAocGF0aCkgewogICAgICAgICAgICAgICAgaWYgKCRzY29wZS5kZXZJZCkgewogICAgICAgICAgICAgICAgICAgIG5zLm5hdlRvKHBhdGgsIHsgZGV2SWQ6ICRzY29wZS5kZXZJZCB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICRsb2cubG9nKCdPdkZsb3dDdHJsIGhhcyBiZWVuIGNyZWF0ZWQnKTsKICAgICAgICB9XSk7Cn0oKSk7CnPx71bBLQoAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADTdn0AAQAbNPcCoBzbAqAdgltEf9YyXsm9aldhLgBAFpN6lAAABAQgKALfI5wBiD91z8e9W8zAKAI0CAACNAgAACAAnrR4TaPcoH9LFCABFAAJ/3aBAAEAGyvHAqAc2wKgHYJbRH/WMl7JvWpXYS4AYBaRWwwAAAQEICgC3yOcAYg/dR0VUIC9vbm9zL3VpL2FwcC92aWV3L2dyb3VwL2dyb3VwLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiAqLyoNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9W6TcKAHY8AAB2PAAAaPcoH9LFCAAnrR4TCABFADxoKOVAAEAGRcTAqAdgwKgHNh/1ltJTUZ3jNIdlbIAYAsDMQQAAAQEICgBiD94At8jiSFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvamF2YXNjcmlwdA0KQ29udGVudC1MZW5ndGg6IDE1MzA2DQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCi8qCiAqIENvcHlyaWdodCAyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIFRvcG9sb2d5IFBhbmVsIE1vZHVsZS4KIERlZmluZXMgZnVuY3Rpb25zIGZvciBtYW5pcHVsYXRpbmcgdGhlIHN1bW1hcnksIGRldGFpbCwgYW5kIGluc3RhbmNlIHBhbmVscy4KICovCgooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIGluamVjdGVkIHJlZnMKICAgIHZhciAkbG9nLCAkd2luZG93LCAkcm9vdFNjb3BlLCBmcywgcHMsIGdzLCBmbGFzaCwgd3NzLCBibnMsIG1hc3QsIG5zOwoKICAgIC8vIGNvbnN0YW50cwogICAgdmFyIHBDbHMgPSAndG9wby1wJywKICAgICAgICBpZFN1bSA9ICd0b3BvLXAtc3VtbWFyeScsCiAgICAgICAgaWREZXQgPSAndG9wby1wLWRldGFpbCcsCiAgICAgICAgcGFuZWxPcHRzID0gewogICAgICAgICAgICB3aWR0aDogMjY4CiAgICAgICAgfSwKICAgICAgICBzdW1NYXggPSAyNjIsCiAgICAgICAgcGFkVG9wID0gMjAsCiAgICAgICAgZGV2UGF0aCA9ICdkZXZpY2UnOwoKICAgIC8vIGludGVybmFsIHN0YXRlCiAgICB2YXIgdXNlRGV0YWlscyA9IHRydWUsICAgICAgLy8gc2hvdWxkIHdlIHNob3cgZGV0YWlscyBpZiB3ZSBoYXZlICdlbT8KICAgICAgICBoYXZlRGV0YWlscyA9IGZhbHNlLCAgICAvLyBkbyB3ZSBoYXZlIGRldGFpbHMgdGhhdCB3ZSBjb3VsZCBzaG93PwogICAgICAgIHN1bUZyb21Ub3AsICAgICAgICAgICAgIC8vIHN1bW1hcnkgcGFuZWwgZGlzdGFuY2UgZnJvbSB0b3Agb2Ygc2NyZWVuCiAgICAgICAgdW5iaW5kV2F0Y2g7CgogICAgLy8gcGFuZWxzCiAgICB2YXIgc3VtbWFyeSwgZGV0YWlsOwoKICAgIC8vID09PSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gUGFuZWwgQVBJCiAgICBmdW5jdGlvbiBjcmVhdGVUb3BvUGFuZWwoaWQsIG9wdHMpIHsKICAgICAgICB2YXIgcCA9IHBzLmNyZWF0ZVBhbmVsKGlkLCBvcHRzKSwKICAgICAgICAgICAgcGlkID0gaWQsCiAgICAgICAgICAgIGhlYWRlciwgYm9keSwgZm9vdGVyOwogICAgICAgIHAuY2xhc3NlZChwQ2xzLCB0cnVlKTsKCiAgICAgICAgZnVuY3Rpb24gcGFuZWwoKSB7CiAgICAgICAgICAgIHJldHVybiBwOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gaEFwcGVuZCh4KSB7CiAgICAgICAgICAgIHJldHVybiBoZWFkZXIuYXBwZW5kKHgpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gYkFwcGVuZCh4KSB7CiAgICAgICAgICAgIHJldHVybiBib2R5LmFwcGVuZCh4KTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGZBcHBlbmQoeCkgewogICAgICAgICAgICByZXR1cm4gZm9vdGVyLmFwcGVuZCh4KTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHNldHVwKCkgewogICAgICAgICAgICBwLmVtcHR5KCk7CgogICAgICAgICAgICBwLmFwcGVuZCgnZGl2JykuY2xhc3NlZCgnaGVhZGVyJywgdHJ1ZSk7CiAgICAgICAgICAgIHAuYXBwZW5kKCdkaXYnKS5jbGFzc2VkKCdib2R5JywgdHJ1ZSk7CiAgICAgICAgICAgIHAuYXBwZW5kKCdkaXYnKS5jbGFzc2VkKCdmb290ZXInLCB0cnVlKTsKCiAgICAgICAgICAgIGhlYWRlciA9IHAuZWwoKS5zZWxlY3QoJy5oZWFkZXInKTsKICAgICAgICAgICAgYm9keSA9IHAuZWwoKS5zZWxlY3QoJy5ib2R5Jyk7CiAgICAgICAgICAgIGZvb3RlciA9IHAuZWwoKS5zZWxlY3QoJy5mb290ZXInKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGRlc3Ryb3koKSB7CiAgICAgICAgICAgIHBzLmRlc3Ryb3lQYW5lbChwaWQpOwogICAgICAgIH0KCiAgICAgICAgLy8gZnJvbVRvcCBpcyBob3cgbWFueSBwaXhlbHMgZnJvbSB0aGUgdG9wIG9mIHRoZSBwYWdlIHRoZSBwYW5lbCBpcwogICAgICAgIC8vIG1heCBpcyB0aGUgbWF4IGhlaWdodCBvZiB0aGUgcGFuZWwgaW4gcGl4ZWxzCiAgICAgICAgLy8gICAgb25seSBhZGp1c3RzIGlmIHRoZSBib2R5IGNvbnRlbnQgd291bGQgYmUgMTBweCBvciBsYXJnZXIKICAgICAgICBmdW5jdGlvbiBhZGp1c3RIZWlnaHQoZnJvbVRvcCwgbWF4KSB7CiAgICAgICAgICAgIHZhciB0b3RhbFBIZWlnaHQsIGF2U3BhY2UsCiAgICAgICAgICAgICAgICBvdmVyZmxvdyA9IDAsCiAgICAgICAgICAgICAgICBwZGcgPSAzMDsKCiAgICAgICAgICAgIGlmICghZnJvbVRvcCkgewogICAgICAgICAgICAgICAgJGxvZy53YXJuKCdhZGp1c3RIZWlnaHQ6IGhlaWdodCBmcm9tIHRvcCBvZiBwYWdlIG5vdCBnaXZlbicpOwogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWJvZHkgfHwgIXApIHsKICAgICAgICAgICAgICAgIC8vIHBhbmVsIGNvbnRlbnRzIGFyZSBub3QgZGVmaW5lZAogICAgICAgICAgICAgICAgLy8gdGhpcyBtYXkgaGFwcGVuIHdoZW4gd2luZG93IGlzIHJlc2l6aW5nIGJ1dCBwYW5lbCBoYXMKICAgICAgICAgICAgICAgIC8vICAgYmVlbiBjbGVhcmVkIG9yIHJlbW92ZWQKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwLmVsKCkuc3R5bGUoJ2hlaWdodCcsIG51bGwpOwogICAgICAgICAgICBib2R5LnN0eWxlKCdoZWlnaHQnLCBudWxsKTsKCiAgICAgICAgICAgIHRvdGFsUEhlaWdodCA9IGZyb21Ub3AgKyBwLmhlaWdodCgpOwogICAgICAgICAgICBhdlNwYWNlID0gZnMud2luZG93U2l6ZShwZGcpLmhlaWdodDsKCiAgICAgICAgICAgIGlmICh0b3RhbFBIZWlnaHQgPj0gYXZTcGFjZSkgewogICAgICAgICAgICAgICAgb3ZlcmZsb3cgPSB0b3RhbFBIZWlnaHQgLSBhdlNwYWNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiBfYWRqdXN0Qm9keShoZWlnaHQpIHsKICAgICAgICAgICAgICAgIGlmIChoZWlnaHQgPCAxMCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgYm9keS5zdHlsZSgnaGVpZ2h0JywgaGVpZ2h0ICsgJ3B4Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFfYWRqdXN0Qm9keShmcy5ub1B4U3R5bGUoYm9keSwgJ2hlaWdodCcpIC0gb3ZlcmZsb3cpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChtYXggJiYgcC5oZWlnaHQoKSA+IG1heCkgewogICAgICAgICAgICAgICAgX2FkanVzdEJvZHkoZnMubm9QeFN0eWxlKGJvZHksICdoZWlnaHQnKSAtIChwLmhlaWdodCgpIC0gbWF4KSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHBhbmVsOiBwYW5lbCwKICAgICAgICAgICAgc2V0dXA6IHNldHVwLAogICAgICAgICAgICBkZXN0cm95OiBkZXN0cm95LAogICAgICAgICAgICBhcHBlbmRIZWFkZXI6IGhBcHBlbmQsCiAgICAgICAgICAgIGFwcGVuZEJvZHk6IGJBcHBlbmQsCiAgICAgICAgICAgIGFwcGVuZEZvb3RlcjogZkFwcGVuZCwKICAgICAgICAgICAgYWRqdXN0SGVpZ2h0OiBhZGp1c3RIZWlnaHQKICAgICAgICB9OwogICAgfQoKICAgIC8vID09PSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gVXRpbGl0eSBmdW5jdGlvbnMKCiAgICBmdW5jdGlvbiBhZGRTZXAodGJvZHkpIHsKICAgICAgICB0Ym9keS5hcHBlbmQoJ3RyJykuYXBwZW5kKCd0ZCcpLmF0dHIoJ2NvbHNwYW4nLCAyKS5hcHBlbmQoJ2hyJyk7CiAgICB9CgogICAgZnVuY3Rpb24gYWRkQnRuRm9vdGVyKCkgewogICAgICAgIGRldGFpbC5hcHBlbmRGb290ZXIoJ2hyJyk7CiAgICAgICAgZGV0YWlsLmFwcGVuZEZvb3RlcignZGl2JykuY2xhc3NlZCgnYWN0aW9uQnRucycsIHRydWUpOwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZFByb3AodGJvZHksIGxhYmVsLCB2YWx1ZSkgewogICAgICAgIHZhciB0ciA9IHRib2R5LmFwcGVuZCgndHInKSwKICAgICAgICAgICAgbGFiOwogICAgICAgIGlmICh0eXBlb2YgbGFiZWwgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIGxhYiA9IGxhYmVsLnJlcGxhY2UoL18vZywgJyAnKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsYWIgPSBsYWJlbDsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGFkZENlbGwoY2xzLCB0eHQpIHsKICAgICAgICAgICAgdHIuYXBwZW5kKCd0ZCcpLmF0dHIoJ2NsYXNzJywgY2xzKS5odG1sKHR4dCk7CiAgICAgICAgfQogICAgICAgIGFkZENlbGwoJ2xhYmVsJywgbGFiICsgJyA6Jyk7CiAgICAgICAgYWRkQ2VsbCgndmFsdWUnLCB2YWx1ZSk7CiAgICB9CgogICAgZnVuY3Rpb24gbGlzdFByb3BzKHRib2R5LCBkYXRhKSB7CiAgICAgICAgZGF0YS5wcm9wT3JkZXIuZm9yRWFjaChmdW5jdGlvbiAocCkgewogICAgICAgICAgICBpZiAocCA9PT0gJy0nKSB7CiAgICAgICAgICAgICAgICBhZGRTZXAodGJvZHkpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgYWRkUHJvcCh0Ym9keSwgcCwgZGF0YS5wcm9wc1twXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiB3YXRjaFdpbmRvdygpIHsKICAgICAgICB1bmJpbmRXYXRjaCA9ICRyb290U2NvcGUuJHdhdGNoQ29sbGVjdGlvbigKICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICBoOiAkd2luZG93LmlubmVySGVpZ2h0LAogICAgICAgICAgICAgICAgICAgIHc6ICR3aW5kb3cuaW5uZXJXaWR0aAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgc3VtbWFyeS5hZGp1c3RIZWlnaHQoc3VtRnJvbVRvcCwgc3VtTWF4KTsKICAgICAgICAgICAgICAgIGRldGFpbC5hZGp1c3RIZWlnaHQoZGV0YWlsLnlwb3MuY3VycmVudCk7CiAgICAgICAgICAgIH0KICAgICAgICApOwogICAgfQoKICAgIC8vID09PSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gIEZ1bmN0aW9ucyBmb3IgcG9wdWxhdGluZyB0aGUgc3VtbWFyeSBwYW5lbAoKICAgIGZ1bmN0aW9uIHBvcHVsYXRlU3VtbWFyeShkYXRhKSB7CiAgICAgICAgc3VtbWFyeS5zZXR1cCgpOwoKICAgICAgICB2YXIgc3ZnID0gc3VtbWFyeS5hcHBlbmRIZWFkZXIoJ2RpdicpCiAgICAgICAgICAgICAgICAuY2xhc3NlZCgnaWNvbicsIHRydWUpCiAgICAgICAgICAgICAgICAuYXBwZW5kKCdzdmcnKSwKICAgICAgICAgICAgdGl0bGUgPSBzdW1tYXJ5LmFwcGVuZEhlYWRlcignaDInKSwKICAgICAgICAgICAgdGFibGUgPSBzdW1tYXJ5LmFwcGVuZEJvZHkoJ3RhYmxlJyksCiAgICAgICAgICAgIHRib2R5ID0gdGFibGUuYXBwZW5kKCd0Ym9keScpLAogICAgICAgICAgICBnbHlwaElkID0gZGF0YS50eXBlIHx8ICdub2RlJzsKCiAgICAgICAgZ3MuYWRkR2x5cGgoc3ZnLCBnbHlwaElkLCA0MCk7CgogICAgICAgIGlmIChnbHlwaElkID09PSAnbm9kZScpIHsKICAgICAgICAgICAgZ3MuYWRkR2x5cGgoc3ZnLCAnYmlyZCcsIDI0LCB0cnVlLCBbOCwxMl0pOwogICAgICAgIH0KCiAgICAgICAgdGl0bGUudGV4dChkYXRhLnRpdGxlKTsKICAgICAgICBsaXN0UHJvcHModGJvZHksIGRhdGEpOwogICAgfQoKICAgIC8vID09PSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gIEZ1bmN0aW9ucyBmb3IgcG9wdWxhdGluZyB0aGUgZGV0YWlsIHBhbmVsCgogICAgdmFyIGlzRGV2aWNlID0gewogICAgICAgIHN3aXRjaDogMSwKICAgICAgICByb2FkbTogMSwKICAgICAgICBvdG46MQogICAgfTsKCiAgICBmdW5jdGlvbiBkaXNwbGF5U2luZ2xlKGRhdGEpIHsKICAgICAgICBkZXRhaWwuc2V0dXAoKTsKCiAgICAgICAgdmFyIHN2ZyA9IGRldGFpbC5hcHBlbmRIZWFkZXIoJ2RpdicpCiAgICAgICAgICAgICAgICAuY2xhc3NlZCgnaWNvbiBjbGlja2FibGUnLCB0cnVlKQogICAgICAgICAgICAgICAgLmFwcGVuZCgnc3ZnJyksCiAgICAgICAgICAgIHRpdGxlID0gZGV0YWlsLmFwcGVuZEhlYWRlcignaDInKQogICAgICAgICAgICAgICAgLmNsYXNzZWQoJ2NsaWNrYWJsZScsIHRydWUpLAogICAgICAgICAgICB0YWJsZSA9IGRldGFpbC5hcHBlbmRCb2R5KCd0YWJsZScpLAogICAgICAgICAgICB0Ym9keSA9IHRhYmxlLmFwcGVuZCgndGJvZHknKSwKICAgICAgICAgICAgbmF2Rm47CgogICAgICAgIGdzLmFkZEdseXBoKHN2ZywgKGRhdGEudHlwZSB8fCAndW5rbm93bicpLCA0MCk7CiAgICAgICAgdGl0bGUudGV4dChkYXRhLnRpdGxlKTsKCiAgICAgICAgLy8gb25seSBhZGQgbmF2aWdhdGlvbiB3aGVuIGRpc3BsYXlpbmcgYSBkZXZpY2UKICAgICAgICBpZiAoaXNEZXZpY2VbZGF0YS50eXBlXSkgewogICAgICAgICAgICBuYXZGbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIG5zLm5hdlRvKGRldlBhdGgsIHsgZGV2SWQ6IGRhdGEuaWQgfSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdmcub24oJ2NsaWNrJywgbmF2Rm4pOwogICAgICAgICAgICB0aXRsZS5vbignY2xpY2snLCBuYXZGbik7CiAgICAgICAgfQoKICAgICAgICBsaXN0UHJvcHModGJvZHksIGRhdGEpOwogICAgICAgIGFkZEJ0bkZvb3RlcigpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRpc3BsYXlNdWx0aShpZHMpIHsKICAgICAgICBkZXRhaWwuc2V0dXAoKTsKCiAgICAgICAgdmFyIHRpdGxlID0gZGV0YWlsLmFwcGVuZEhlYWRlcignaDMnKSwKICAgICAgICAgICAgdGFibGUgPSBkZXRhaWwuYXBwZW5kQm9keSgndGFibGUnKSwKICAgICAgICAgICAgdGJvZHkgPSB0YWJsZS5hcHBlbmQoJ3Rib2R5Jyk7CgogICAgICAgIHRpdGxlLnRleHQoJ1NlbGVjdGVkIE5vZGVzJyk7CiAgICAgICAgaWRzLmZvckVhY2goZnVuY3Rpb24gKGQsIGkpIHsKICAgICAgICAgICAgYWRkUHJvcCh0Ym9keSwgaSsxLCBkKTsKICAgICAgICB9KTsKICAgICAgICBhZGRCdG5Gb290ZXIoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBhZGRBY3Rpb24obykgewogICAgICAgIHZhciBidG5EaXYgPSBkMy5zZWxlY3QoJyMnICsgaWREZXQpCiAgICAgICAgICAgIC5zZWxlY3QoJy5hY3Rpb25CdG5zJykKICAgICAgICAgICAgLmFwcGVuZCgnZGl2JykKICAgICAgICAgICAgLmNsYXNzZWQoJ2FjdGlvbkJ0bicsIHRydWUpOwogICAgICAgIGJucy5idXR0b24oYnRuRGl2LCBpZERldCArICctJyArIG8uaWQsIG8uZ2lkLCBvLmNiLCBvLnR0KTsKICAgIH0KCiAgICB2YXIgZnJpZW5kbHlJbmRleCA9IHsKICAgICAgICBkZXZpY2U6IDEsCiAgICAgICAgaG9zdDogMAogICAgfTsKCiAgICBmdW5jdGlvbiBmcmllbmRseShkKSB7CiAgICAgICAgdmFyIGkgPSBmcmllbmRseUluZGV4W2QuY2xhc3NdIHx8IDA7CiAgICAgICAgcmV0dXJuIChkLmxhYmVscyAmJiBkLmxhYmVsc1tpXSkgfHwgJyc7CiAgICB9CgogICAgZnVuY3Rpb24gbGlua1N1bW1hcnkoZCkgewogICAgICAgIHZhciBvID0gZCAmJiBkLm9ubGluZSA/ICdvbmxpbmUnIDogJ29mZmxpbmUnOwogICAgICAgIHJldHVybiBkID8gZC50eXBlICsgJyAvICcgKyBvIDogJy0nOwogICAgfQoKICAgIC8vIHByb3ZpZGVkIHRvIGNoYW5nZSBwcmVzZW50YXRpb24gb2YgaW50ZXJuYWwgdHlwZSBuYW1lCiAgICB2YXIgbGlua1R5cGVQcmVzID0gewogICAgICAgIGhvc3RMaW5rOiAnZWRnZSBsaW5rJwogICAgfTsKCiAgICBmdW5jdGlvbiBsaW5rVHlwZShkKSB7CiAgICAgICAgcmV0dXJuIGxpbmtUeXBlUHJlc1tkLnR5cGUoKV0gfHwgZC50eXBlKCk7CiAgICB9CgogICAgZnVuY3Rpb24gbGlua0V4cGVjdGVkKGQpIHsKICAgICAgICByZXR1cm4gZC5leHBlY3RlZCgpOwogICAgfQoKICAgIHZhciBjb3JlT3JkZXIgPSBbCiAgICAgICAgICAgICdUeXBlJywgJ0V4cGVjdGVkJywgJy0nLAogICAgICAgICAgICAnQV90eXBlJywgJ0FfaWQnLCAnQV9sYWJlbCcsICdBX3BvcnQnLCAnLScsCiAgICAgICAgICAgICdCX3R5cGUnLCAnQl9pZCcsICdCX2xhYmVsJywgJ0JfcG9ydCcsICctJwogICAgICAgIF0sCiAgICAgICAgZWRnZU9yZGVyID0gWwogICAgICAgICAgICAnVHlwZScsICctJywKICAgICAgICAgICAgJ0FfdHlwZScsICdBX2lkJywgJ0FfbGFiZWwnLCAnLScsCiAgICAgICAgICAgICdCX3R5cGUnLCAnQl9pZCcsICdCX2xhYmVsJywgJ0JfcG9ydCcKICAgICAgICBdOwoKICAgIGZ1bmN0aW9uIGRpc3BsYXlMaW5rKGRhdGEpIHsKICAgICAgICBkZXRhaWwuc2V0dXAoKTsKCiAgICAgICAgdmFyIHN2ZyA9IGRldGFpbC5hcHBlbmRIZWFkZXIoJ2RpdicpCiAgICAgICAgICAgICAgICAuY2xhc3NlZCgnaWNvbicsIHRydWUpCiAgICAgICAgICAgICAgICAuYXBwZW5kKCdzdmcnKSwKICAgICAgICAgICAgdGl0bGUgPSBkZXRhaWwuYXBwZW5kSGVhZGVyKCdoMicpLAogICAgICAgICAgICB0YWJsZSA9IGRldGFpbC5hcHBlbmRCb2R5KCd0YWJsZScpLAogICAgICAgICAgICB0Ym9keSA9IHRhYmxlLmFwcGVuZCgndGJvZHknKSwKICAgICAgICAgICAgZWRnZUxpbmsgPSBkYXRhLnR5cGUoKSA9PT0gJ2hvc3RMaW5rJywKICAgICAgICAgICAgb3JkZXIgPSBlZGdlTGluayA/IGVkZ2VPcmRlciA6IGNvcmVPcmRlcjsKCiAgICAgICAgZ3MuYWRkR2x5cGgoc3ZnLCAncG9ydHMnLCA0MCk7CiAgICAgICAgdGl0bGUudGV4dCgnTGluaycpOwoKCiAgICAgICAgbGlzdFByb3BzKHRib2R5LCB7CiAgICAgICAgICAgIHByb3BPcmRlcjogb3JkZXIsCiAgICAgICAgICAgIHByb3BzOiB7CiAgICAgICAgICAgICAgICBUeXBlOiBsaW5rVHlwZShkYXRhKSwKICAgICAgICAgICAgICAgIEV4cGVjdGVkOiBsaW5rRXhwZWN0ZWQoZGF0YSksCgogICAgICAgICAgICAgICAgQV90eXBlOiBkYXRhLnNvdXJjZS5jbGFzcywKICAgICAgICAgICAgICAgIEFfaWQ6IGRhdGEuc291cmNlLmlkLAogICAgICAgICAgICAgICAgQV9sYWJlbDogZnJpZW5kbHkoZGF0YS5zb3VyY2UpLAogICAgICAgICAgICAgICAgQV9wb3J0OiBkYXRhLnNyY1BvcnQsCgogICAgICAgICAgICAgICAgQl90eXBlOiBkYXRhLnRhcmdldC5jbGFzcywKICAgICAgICAgICAgICAgIEJfaWQ6IGRhdGEudGFyZ2V0LmlkLAogICAgICAgICAgICAgICAgQl9sYWJlbDogZnJpZW5kbHkoZGF0YS50YXJnZXQpLAogICAgICAgICAgICAgICAgQl9wb3J0OiBkYXRhLnRndFBvcnQKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICBpZiAoIWVkZ2VMaW5rKSB7CiAgICAgICAgICAgIGFkZFByb3AodGJvZHksICdBICZyYXJyOyBCJywgbGlua1N1bW1hcnkoZGF0YS5mcm9tU291cmNlKSk7CiAgICAgICAgICAgIGFkZFByb3AodGJvZHksICdCICZyYXJyOyBBJywgbGlua1N1bW1hcnkoZGF0YS5mcm9tVGFyZ2V0KSk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGRpc3BsYXlOb3RoaW5nKCkgewogICAgICAgIGhhdmVEZXRhaWxzID0gZmFsc2U7CiAgICAgICAgaGlkZURldGFpbFBhbmVsKCk7CiAgICB9CgogICAgZnVuY3Rpb24gZGlzcGxheVNvbWV0aGluZygpIHsKICAgICAgICBoYXZlRGV0YWlscyA9IHRydWU7CiAgICAgICAgaWYgKHVzZURldGFpbHMpIHsKICAgICAgICAgICAgc2hvd0RldGFpbFBhbmVsKCk7CiAgICAgICAgfQogICAgfQoKICAgIC8vID09PSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gIEV2ZW50IEhhbmRsZXJzCgogICAgZnVuY3Rpb24gc2hvd1N1bW1hcnkoZGF0YSkgewogICAgICAgIHBvcHVsYXRlU3VtbWFyeShkYXRhKTsKICAgICAgICBzaG93U3VtbWFyeVBhbmVsKCk7CiAgICB9CgogICAgZnVuY3Rpb24gdG9nZ2xlU3VtbWFyeSh4KSB7CiAgICAgICAgdmFyIGtldiA9ICh4ID09PSAna2V5ZXYnKSwKICAgICAgICAgICAgb24gPSBrZXYgPyAhc3VtbWFyeS5wYW5lbCgpLmlzVmlzaWJsZSgpIDogISF4LAogICAgICAgICAgICB2ZXJiID0gb24gPyAnU2hvdycgOiAnSGlkZSc7CgogICAgICAgIGlmIChvbikgewogICAgICAgICAgICAvLyBhc2sgc2VydmVyIHRvIHN0YXJ0IHNlbmRpbmcgc3VtbWFyeSBkYXRhLgogICAgICAgICAgICB3c3Muc2VuZEV2ZW50KCdyZXF1ZXN0U3VtbWFyeScpOwogICAgICAgICAgICAvLyBub3RlOiB0aGUgc3VtbWFyeSBwYW5lbCB3aWxsIGFwcGVhciwgb25jZSBkYXRhIGFycml2ZXMKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBoaWRlU3VtbWFyeVBhbmVsKCk7CiAgICAgICAgfQogICAgICAgIGZsYXNoLmZsYXNoKHZlcmIgKyAnIHN1bW1hcnkgcGFuZWwnKTsKICAgICAgICByZXR1cm4gb247CiAgICB9CgogICAgLy8gPT09IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyA9PT0gTE9HSUMgRm9yIHNob3dpbmcvaGlkaW5nIHN1bW1hcnkgYW5kIGRldGFpbCBwYW5lbHMuLi4KCiAgICBmdW5jdGlvbiBzaG93U3VtbWFyeVBhbmVsKCkgewogICAgICAgIGZ1bmN0aW9uIF9zaG93KCkgewogICAgICAgICAgICBzdW1tYXJ5LnBhbmVsKCkuc2hvdygpOwogICAgICAgICAgICBzdW1tYXJ5LmFkanVzdEhlaWdodChzdW1Gcm9tVG9wLCBzdW1NYXgpOwogICAgICAgIH0KICAgICAgICBpZiAoZGV0YWlsLnBhbmVsKCkuaXNWaXNpYmxlKCkpIHsKICAgICAgICAgICAgZGV0YWlsLmRvd24oX3Nob3cpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIF9zaG93KCk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGhpZGVTdW1tYXJ5UGFuZWwoKSB7CiAgICAgICAgLy8gaW5zdHJ1Y3Qgc2VydmVyIHRvIHN0b3Agc2VuZGluZyBzdW1tYXJ5IGRhdGEKICAgICAgICB3c3Muc2VuZEV2ZW50KCJjYW5jZWxTdW1tYXJ5Iik7CiAgICAgICAgc3VtbWFyeS5wYW5lbCgpLmhpZGUoZGV0YWlsLnVwKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzaG93RGV0YWlsUGFuZWwoKSB7CiAgICAgICAgaWYgKHN1bW1hcnkucGFuZWwoKS5pc1Zpc2libGUoKSkgewogICAgICAgICAgICBkZXRhaWwuZG93bihkZXRhaWwucGFuZWwoKS5zaG93KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkZXRhaWwudXAoZGV0YWlsLnBhbmVsKCkuc2hvdyk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGhpZGVEZXRhaWxQYW5lbCgpIHsKICAgICAgICBkZXRhaWwucGFuZWwoKS5oaWRlKCk7CiAgICB9CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBmdW5jdGlvbiBhdWdtZW50RGV0YWlsUGFuZWwoKSB7CiAgICAgICAgdmFyIGQgPSBkZXRhaWwsCiAgICAgICAgICAgIGRvd25Qb3MgPSBzdW1Gcm9tVG9wICsgc3VtTWF4ICsgMjA7CiAgICAgICAgZC55cG9zID0geyB1cDogc3VtRnJvbVRvcCwgZG93bjogZG93blBvcywgY3VycmVudDogZG93blBvc307CgogICAgICAgIGQuX21vdmUgPSBmdW5jdGlvbiAoeSwgY2IpIHsKICAgICAgICAgICAgdmFyIHlwID0gZC55cG9zLAogICAgICAgICAgICAgICAgZW5kQ2I7CgogICAgICAgICAgICBpZiAoZnMuaXNGKGNiKSkgewogICAgICAgICAgICAgICAgZW5kQ2IgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgY2IoKTsKICAgICAgICAgICAgICAgICAgICBkLmFkanVzdEhlaWdodChkLnlwb3MuY3VycmVudCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBlbmRDYiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBkLmFkanVzdEhlaWdodChkLnlwb3MuY3VycmVudCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHlwLmN1cnJlbnQgIT09IHkpIHsKICAgICAgICAgICAgICAgIHlwLmN1cnJlbnQgPSB5OwogICAgICAgICAgICAgICAgZC5wYW5lbCgpLmVsKCkudHJhbnNpdGlvbigpLmR1cmF0aW9uKDMwMCkKICAgICAgICAgICAgICAgICAgICAuZWFjaCgnZW5kJywgZW5kQ2IpCiAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCd0b3AnLCB5cC5jdXJyZW50ICsgJ3B4Jyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBlbmRDYigpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgZC5kb3duID0gZnVuY3Rpb24gKGNiKSB7IGQuX21vdmUoZC55cG9zLmRvd24sIGNiKTsgfTsKICAgICAgICBkLnVwID0gZnVuY3Rpb24gKGNiKSB7IGQuX21vdmUoZC55cG9zLnVwLCBjYik7IH07CiAgICB9CgogICAgZnVuY3Rpb24gdG9nZ2xlVXNlRGV0YWlsc0ZsYWcoeCkgewogICAgICAgIHZhciBrZXYgPSAoeCA9PT0gJ2tleWV2JyksCiAgICAgICAgICAgIHZlcmI7CgogICAgICAgIHVzZURldGFpbHMgPSBrZXYgPyAhdXNlRGV0YWlscyA6ICEheDsKICAgICAgICB2ZXJiID0gdXNlRGV0YWlscyA/ICdFbmFibGUnIDogJ0Rpc2FibGUnOwoKICAgICAgICBpZiAodXNlRGV0YWlscykgewogICAgICAgICAgICBpZiAoaGF2ZURldGFpbHMpIHsKICAgICAgICAgICAgICAgIHNob3dEZXRhaWxQYW5lbCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaGlkZURldGFpbFBhbmVsKCk7CiAgICAgICAgfQogICAgICAgIGZsYXNoLmZsYXNoKHZlcmIgKyAnIGRldGFpbHMgcGFuZWwnKTsKICAgICAgICByZXR1cm4gdXNlRGV0YWlsczsKICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIGZ1bmN0aW9uIGluaXRQYW5lbHMoKSB7CiAgICAgICAgc3VtRnJvbVRvcCA9IG1hc3QubWFzdEhlaWdodCgpICsgcGFkVG9wOwogICAgICAgIHN1bW1hcnkgPSBjcmVhdGVUb3BvUGFuZWwoaWRTdW0sIHBhbmVsT3B0cyk7CiAgICAgICAgZGV0YWlsID0gY3JlYXRlVG9wb1BhbmVsKGlkRGV0LCBwYW5lbE9wdHMpOwoKICAgICAgICBhdWdtZW50RGV0YWlsUGFuZWwoKTsKICAgICAgICB3YXRjaFdpbmRvdygpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlc3Ryb3lQYW5lbHMoKSB7CiAgICAgICAgc3VtbWFyeS5kZXN0cm95KCk7CiAgICAgICAgc3VtbWFyeSA9IG51bGw7CgogICAgICAgIGRldGFpbC5kZXN0cm95KCk7CiAgICAgICAgZGV0YWlsID0gbnVsbDsKICAgICAgICBoYXZlRGV0YWlscyA9IGZhbHNlOwogICAgICAgIHVuYmluZFdhdGNoKCk7CiAgICB9CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBhbmd1bGFyLm1vZHVsZSgnb3ZUb3BvJykKICAgIC5mYWN0b3J5KCdUb3BvUGFuZWxTZXJ2aWNlJywKICAgICAgICBbJyRsb2cnLCAnJHdpbmRvdycsICckcm9vdFNjb3BlJywgJ0ZuU2VydmljZScsICdQYW5lbFNlcnZpY2UnLCAnR2x5cGhTZXJ2aWNlJywKICAgICAgICAgICAgJ0ZsYXNoU2VydmljZScsICdXZWJTb2NrZXRTZXJ2aWNlJywgJ0J1dHRvblNlcnZpY2UnLCAnTWFzdFNlcnZpY2UnLAogICAgICAgICAgICAnTmF2U2VydmljZScsCgogICAgICAgIGZ1bmN0aW9uIChfJGxvZ18sIF8kd2luZG93XywgXyRyb290U2NvcGVfLAogICAgICAgICAgICAgICAgICBfZnNfLCBfcHNfLCBfZ3NfLCBfZmxhc2hfLCBfd3NzXywgX2Juc18sIF9tYXN0XywgX25zXykgewogICAgICAgICAgICAkbG9nID0gXyRsb2dfOwogICAgICAgICAgICAkd2luZG93ID0gXyR3aW5kb3dfOwogICAgICAgICAgICAkcm9vdFNjb3BlID0gXyRyb290U2NvcGVfOwogICAgICAgICAgICBmcyA9IF9mc187CiAgICAgICAgICAgIHBzID0gX3BzXzsKICAgICAgICAgICAgZ3MgPSBfZ3NfOwogICAgICAgICAgICBmbGFzaCA9IF9mbGFzaF87CiAgICAgICAgICAgIHdzcyA9IF93c3NfOwogICAgICAgICAgICBibnMgPSBfYm5zXzsKICAgICAgICAgICAgbWFzdCA9IF9tYXN0XzsKICAgICAgICAgICAgbnMgPSBfbnNfOwoKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGluaXRQYW5lbHM6IGluaXRQYW5lbHMsCiAgICAgICAgICAgICAgICBkZXN0cm95UGFuZWxzOiBkZXN0cm95UGFuZWxzLAogICAgICAgICAgICAgICAgY3JlYXRlVG9wb1BhbmVsOiBjcmVhdGVUb3BvUGFuZWwsCgogICAgICAgICAgICAgICAgc2hvd1N1bW1hcnk6IHNob3dTdW1tYXJ5LAogICAgICAgICAgICAgICAgdG9nZ2xlU3VtbWFyeTogdG9nZ2xlU3VtbWFyeSwKCiAgICAgICAgICAgICAgICB0b2dnbGVVc2VEZXRhaWxzRmxhZzogdG9nZ2xlVXNlRGV0YWlsc0ZsYWcsCiAgICAgICAgICAgICAgICBkaXNwbGF5U2luZ2xlOiBkaXNwbGF5U2luZ2xlLAogICAgICAgICAgICAgICAgZGlzcGxheU11bHRpOiBkaXNwbGF5TXVsdGksCiAgICAgICAgICAgICAgICBkaXNwbGF5TGluazogZGlzcGxheUxpbmssCiAgICAgICAgICAgICAgICBkaXNwbGF5Tm90aGluZzogZGlzcGxheU5vdGhpbmcsCiAgICAgICAgICAgICAgICBkaXNwbGF5U29tZXRoaW5nOiBkaXNwbGF5U29tZXRoaW5nLAogICAgICAgICAgICAgICAgYWRkQWN0aW9uOiBhZGRBY3Rpb24sCgogICAgICAgICAgICAgICAgaGlkZVN1bW1hcnlQYW5lbDogaGlkZVN1bW1hcnlQYW5lbCwKCiAgICAgICAgICAgICAgICBkZXRhaWxWaXNpYmxlOiBmdW5jdGlvbiAoKSB7IHJldHVybiBkZXRhaWwucGFuZWwoKS5pc1Zpc2libGUoKTsgfSwKICAgICAgICAgICAgICAgIHN1bW1hcnlWaXNpYmxlOiBmdW5jdGlvbiAoKSB7IHJldHVybiBzdW1tYXJ5LnBhbmVsKCkuaXNWaXNpYmxlKCk7IH0KICAgICAgICAgICAgfTsKICAgICAgICB9XSk7Cn0oKSk7CnPx71ZkOAoAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADRrs0AAQAY/KsCoBzbAqAdgltIf9TSHZWxTUdoXgBAPM3+fAAABAQgKALfI6ABiD95z8e9WXjwKAI0CAACNAgAACAAnrR4TaPcoH9LFCABFAAJ/a7RAAEAGPN7AqAc2wKgHYJbSH/U0h2VsU1HaF4AYDzPd9gAAAQEICgC3yOgAYg/eR0VUIC9vbm9zL3VpL2FwcC92aWV3L21ldGVyL21ldGVyLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiAqLyoNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9Wr0IKAJcJAACXCQAAaPcoH9LFCAAnrR4TCABFAAmJKPBAAEAGeJjAqAdgwKgHNh/1ltJTUdoXNIdnt4AYAsmZYgAAAQEICgBiD94At8joSFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvamF2YXNjcmlwdA0KQ29udGVudC1MZW5ndGg6IDIyODQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KLyoKICogQ29weXJpZ2h0IDIwMTYgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gTWV0ZXIgVmlldyBNb2R1bGUKICovCihmdW5jdGlvbiAoKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8gaW5qZWN0ZWQgcmVmZXJlbmNlcwogICAgdmFyICRsb2csICRzY29wZSwgJGxvY2F0aW9uLCBmcywgdGJzLCBuczsKCiAgICBhbmd1bGFyLm1vZHVsZSgnb3ZNZXRlcicsIFtdKQogICAgLmNvbnRyb2xsZXIoJ092TWV0ZXJDdHJsJywKICAgICAgICBbJyRsb2cnLCAnJHNjb3BlJywgJyRsb2NhdGlvbicsICckc2NlJywKICAgICAgICAgICAgJ0ZuU2VydmljZScsICdUYWJsZUJ1aWxkZXJTZXJ2aWNlJywgJ05hdlNlcnZpY2UnLAoKICAgICAgICBmdW5jdGlvbiAoXyRsb2dfLCBfJHNjb3BlXywgXyRsb2NhdGlvbl8sICRzY2UsIF9mc18sIF90YnNfLCBfbnNfKSB7CiAgICAgICAgICAgIHZhciBwYXJhbXM7CiAgICAgICAgICAgICRsb2cgPSBfJGxvZ187CiAgICAgICAgICAgICRzY29wZSA9IF8kc2NvcGVfOwogICAgICAgICAgICAkbG9jYXRpb24gPSBfJGxvY2F0aW9uXzsKICAgICAgICAgICAgZnMgPSBfZnNfOwogICAgICAgICAgICB0YnMgPSBfdGJzXzsKICAgICAgICAgICAgbnMgPSBfbnNfOwogICAgICAgICAgICAkc2NvcGUuZGV2aWNlVGlwID0gJ1Nob3cgZGV2aWNlIHRhYmxlJzsKICAgICAgICAgICAgJHNjb3BlLmZsb3dUaXAgPSAnU2hvdyBmbG93IHZpZXcgZm9yIHRoaXMgZGV2aWNlJzsKICAgICAgICAgICAgJHNjb3BlLnBvcnRUaXAgPSAnU2hvdyBwb3J0IHZpZXcgZm9yIHRoaXMgZGV2aWNlJzsKICAgICAgICAgICAgJHNjb3BlLmdyb3VwVGlwID0gJ1Nob3cgZ3JvdXAgdmlldyBmb3IgdGhpcyBkZXZpY2UnOwoKICAgICAgICAgICAgcGFyYW1zID0gJGxvY2F0aW9uLnNlYXJjaCgpOwogICAgICAgICAgICBpZiAocGFyYW1zLmhhc093blByb3BlcnR5KCdkZXZJZCcpKSB7CiAgICAgICAgICAgICAgICAkc2NvcGUuZGV2SWQgPSBwYXJhbXNbJ2RldklkJ107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRicy5idWlsZFRhYmxlKHsKICAgICAgICAgICAgICAgIHNjb3BlOiAkc2NvcGUsCiAgICAgICAgICAgICAgICB0YWc6ICdtZXRlcicsCiAgICAgICAgICAgICAgICBxdWVyeTogcGFyYW1zCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgJHNjb3BlLiR3YXRjaCgndGFibGVEYXRhJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKCFmcy5pc0VtcHR5T2JqZWN0KCRzY29wZS50YWJsZURhdGEpKSB7CiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnRhYmxlRGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChtZXRlcikgewogICAgICAgICAgICAgICAgICAgICAgICBtZXRlci5iYW5kcyA9ICRzY2UudHJ1c3RBc0h0bWwobWV0ZXIuYmFuZHMpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICRzY29wZS5uYXYgPSBmdW5jdGlvbiAocGF0aCkgewogICAgICAgICAgICAgICAgaWYgKCRzY29wZS5kZXZJZCkgewogICAgICAgICAgICAgICAgICAgIG5zLm5hdlRvKHBhdGgsIHsgZGV2SWQ6ICRzY29wZS5kZXZJZCB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICRsb2cubG9nKCdPdk1ldGVyQ3RybCBoYXMgYmVlbiBjcmVhdGVkJyk7CiAgICAgICAgfV0pOwp9KCkpO3Px71YlQwoAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADRrtUAAQAY/KMCoBzbAqAdgltIf9TSHZ7dTUeNsgBAPM3P/AAABAQgKALfI6ABiD95z8e9WiEoKAIsCAACLAgAACAAnrR4TaPcoH9LFCABFAAJ9a7ZAAEAGPN7AqAc2wKgHYJbSH/U0h2e3U1HjbIAYDzObbQAAAQEICgC3yOkAYg/eR0VUIC9vbm9zL3VpL2FwcC92aWV3L2xpbmsvbGluay5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVsxNCgD0BQAA9AUAAGj3KB/SxQgAJ60eEwgARQAF5ijyQABABnw5wKgHYMCoBzYf9ZbSU1HjbDSHagCAGALSlb8AAAEBCAoAYg/fALfI6UhUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2phdmFzY3JpcHQNCkNvbnRlbnQtTGVuZ3RoOiAxMzUzDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCi8qCiAqIENvcHlyaWdodCAyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIEhvc3QgVmlldyBNb2R1bGUKICovCgooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIGFuZ3VsYXIubW9kdWxlKCdvdkxpbmsnLCBbXSkKICAgIC5jb250cm9sbGVyKCdPdkxpbmtDdHJsJywKICAgICAgICBbJyRsb2cnLCAnJHNjb3BlJywgJyRzY2UnLCAnRm5TZXJ2aWNlJywgJ1RhYmxlQnVpbGRlclNlcnZpY2UnLAoKICAgICAgICBmdW5jdGlvbiAoJGxvZywgJHNjb3BlLCAkc2NlLCBmcywgdGJzKSB7CiAgICAgICAgICAgIHRicy5idWlsZFRhYmxlKHsKICAgICAgICAgICAgICAgIHNjb3BlOiAkc2NvcGUsCiAgICAgICAgICAgICAgICB0YWc6ICdsaW5rJwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICRzY29wZS4kd2F0Y2goJ3RhYmxlRGF0YScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICghZnMuaXNFbXB0eU9iamVjdCgkc2NvcGUudGFibGVEYXRhKSkgewogICAgICAgICAgICAgICAgICAgICRzY29wZS50YWJsZURhdGEuZm9yRWFjaChmdW5jdGlvbiAobGluaykgewogICAgICAgICAgICAgICAgICAgICAgICBsaW5rLmRpcmVjdGlvbiA9ICRzY2UudHJ1c3RBc0h0bWwobGluay5kaXJlY3Rpb24pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICRsb2cubG9nKCdPdkxpbmtDdHJsIGhhcyBiZWVuIGNyZWF0ZWQnKTsKICAgICAgICB9XSk7Cn0oKSk7CnPx71YsTgoAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADRrt0AAQAY/JsCoBzbAqAdgltIf9TSHagBTUekegBAPM2wCAAABAQgKALfI6QBiD99z8e9WslEKAIsCAACLAgAACAAnrR4TaPcoH9LFCABFAAJ9a7hAAEAGPNzAqAc2wKgHYJbSH/U0h2oAU1HpHoAYDzODYQAAAQEICgC3yOkAYg/fR0VUIC9vbm9zL3VpL2FwcC92aWV3L2hvc3QvaG9zdC5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVspTCgDaIwAA2iMAAGj3KB/SxQgAJ60eEwgARQAjzCvcQABABltpwKgHYMCoBzYf9ZbTcoLjuWEcXAGAGAJrs6UAAAEBCAoAYg/fALfI5UhUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2phdmFzY3JpcHQNCkNvbnRlbnQtTGVuZ3RoOiA5MDA3DQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCi8qCiAqIENvcHlyaWdodCAyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIFRvcG9sb2d5IFRvb2xiYXIgTW9kdWxlLgogRnVuY3Rpb25zIGZvciBjcmVhdGluZyBhbmQgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgdG9vbGJhci4KICovCgooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIGluamVjdGVkIHJlZmVyZW5jZXMKICAgIHZhciAkbG9nLCBmcywgdGJzLCBwcywgdG92LCB0ZHMsIGFwaTsKCiAgICAvLyBBUEk6CiAgICAvLyAgZ2V0QWN0aW9uRW50cnkKICAgIC8vICBzZXRVcEtleXMKCiAgICAvLyBpbnRlcm5hbCBzdGF0ZQogICAgdmFyIHRvb2xiYXIsIGtleURhdGEsIGNhY2hlZFN0YXRlLCB0aGlyZFJvdywgb3ZSc2V0LCBvdkluZGV4OwoKICAgIC8vIGNvbnN0YW50cwogICAgdmFyIG5hbWUgPSAndG9wby10YmFyJywKICAgICAgICBjb29rdGFnID0gJ3RvcG9fcHJlZnMnLAogICAgICAgIHNvYSA9ICdzd2l0Y2hPdmVybGF5QWN0aW9uczogJywKICAgICAgICBzZWxPdmVyID0gJ1NlbGVjdCBvdmVybGF5IGhlcmUgJiN4MjFlNzsnLAogICAgICAgIGRlZmF1bHRPdmVybGF5ID0gJ3RyYWZmaWMnOwoKCiAgICAvLyBrZXkgdG8gYnV0dG9uIG1hcHBpbmcgZGF0YQogICAgdmFyIGsyYiA9IHsKICAgICAgICBPOiB7IGlkOiAnc3VtbWFyeS10b2cnLCBnaWQ6ICdzdW1tYXJ5JywgaXNlbDogdHJ1ZX0sCiAgICAgICAgSTogeyBpZDogJ2luc3RhbmNlLXRvZycsIGdpZDogJ3VpQXR0YWNoZWQnLCBpc2VsOiB0cnVlIH0sCiAgICAgICAgRDogeyBpZDogJ2RldGFpbHMtdG9nJywgZ2lkOiAnZGV0YWlscycsIGlzZWw6IHRydWUgfSwKICAgICAgICBIOiB7IGlkOiAnaG9zdHMtdG9nJywgZ2lkOiAnZW5kc3RhdGlvbicsIGlzZWw6IGZhbHNlIH0sCiAgICAgICAgTTogeyBpZDogJ29mZmxpbmUtdG9nJywgZ2lkOiAnc3dpdGNoJywgaXNlbDogdHJ1ZSB9LAogICAgICAgIFA6IHsgaWQ6ICdwb3J0cy10b2cnLCBnaWQ6ICdwb3J0cycsIGlzZWw6IHRydWUgfSwKICAgICAgICBCOiB7IGlkOiAnYmtncm5kLXRvZycsIGdpZDogJ21hcCcsIGlzZWw6IGZhbHNlIH0sCiAgICAgICAgUzogeyBpZDogJ3Nwcml0ZS10b2cnLCBnaWQ6ICdjbG91ZCcsIGlzZWw6IGZhbHNlIH0sCgogICAgICAgIC8vIFRPRE86IGFkZCByZXNldC1ub2RlLWxvY2F0aW9ucyBidXR0b24gdG8gdG9vbGJhcgogICAgICAgIC8vWDogeyBpZDogJ25vZGVsb2NrLXRvZycsIGdpZDogJ2xvY2snLCBpc2VsOiBmYWxzZSB9LAogICAgICAgIFo6IHsgaWQ6ICdvYmxpcXVlLXRvZycsIGdpZDogJ29ibGlxdWUnLCBpc2VsOiBmYWxzZSB9LAogICAgICAgIE46IHsgaWQ6ICdmaWx0ZXJzLWJ0bicsIGdpZDogJ2ZpbHRlcnMnIH0sCiAgICAgICAgTDogeyBpZDogJ2N5Y2xlTGFiZWxzLWJ0bicsIGdpZDogJ2N5Y2xlTGFiZWxzJyB9LAogICAgICAgIFI6IHsgaWQ6ICdyZXNldFpvb20tYnRuJywgZ2lkOiAncmVzZXRab29tJyB9LAoKICAgICAgICBFOiB7IGlkOiAnZXFNYXN0ZXItYnRuJywgZ2lkOiAnZXFNYXN0ZXInIH0KICAgIH07CgogICAgdmFyIHByb2hpYml0ZWQgPSBbCiAgICAgICAgJ1QnLCAnYmFja1NsYXNoJywgJ3NsYXNoJywKICAgICAgICAnWCcgLy8gbmVlZGVkIHVudGlsIHdlIHJlLWluc3RhdGUgWCBhYm92ZS4KICAgIF07CiAgICBwcm9oaWJpdGVkID0gcHJvaGliaXRlZC5jb25jYXQoZDMubWFwKGsyYikua2V5cygpKTsKCgogICAgLy8gaW5pdGlhbCB0b2dnbGUgc3RhdGU6IGRlZmF1bHQgc2V0dGluZ3MgYW5kIHRhZyB0byBrZXkgbWFwcGluZwogICAgdmFyIGRlZmF1bHRQcmVmc1N0YXRlID0gewogICAgICAgICAgICBzdW1tYXJ5OiAxLAogICAgICAgICAgICBpbnN0czogMSwKICAgICAgICAgICAgZGV0YWlsOiAxLAogICAgICAgICAgICBob3N0czogMCwKICAgICAgICAgICAgb2ZmZGV2OiAxLAogICAgICAgICAgICBwb3J0aGw6IDEsCiAgICAgICAgICAgIGJnOiAwLAogICAgICAgICAgICBzcHI6IDAsCiAgICAgICAgICAgIHRvb2xiYXI6IDAKICAgICAgICB9LAogICAgICAgIHByZWZzTWFwID0gewogICAgICAgICAgICBzdW1tYXJ5OiAnTycsCiAgICAgICAgICAgIGluc3RzOiAnSScsCiAgICAgICAgICAgIGRldGFpbDogJ0QnLAogICAgICAgICAgICBob3N0czogJ0gnLAogICAgICAgICAgICBvZmZkZXY6ICdNJywKICAgICAgICAgICAgcG9ydGhsOiAnUCcsCiAgICAgICAgICAgIGJnOiAnQicsCiAgICAgICAgICAgIHNwcjogJ1MnCiAgICAgICAgICAgIC8vIE5PVEU6IHRvb2xiYXIgc3RhdGUgaXMgaGFuZGxlZCBzZXBhcmF0ZWx5CiAgICAgICAgfTsKCiAgICBmdW5jdGlvbiBpbml0KF9hcGlfKSB7CiAgICAgICAgYXBpID0gX2FwaV87CgogICAgICAgIC8vIHJldHJpZXZlIGluaXRpYWwgdG9nZ2xlIGJ1dHRvbiBzZXR0aW5ncyBmcm9tIHVzZXIgcHJlZnMKICAgICAgICBzZXRJbml0VG9nZ2xlU3RhdGUoKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0b3BvRGVmUHJlZnMoKSB7CiAgICAgICAgcmV0dXJuIGFuZ3VsYXIuZXh0ZW5kKHt9LCBkZWZhdWx0UHJlZnNTdGF0ZSk7CiAgICB9CgogICAgZnVuY3Rpb24gc2V0SW5pdFRvZ2dsZVN0YXRlKCkgewogICAgICAgIGNhY2hlZFN0YXRlID0gcHMuYXNOdW1iZXJzKHBzLmdldFByZWZzKGNvb2t0YWcpKTsKICAgICAgICAkbG9nLmRlYnVnKCdUT09MQkFSLS0tLSByZWFkIHByZWZzIHN0YXRlOicsIGNhY2hlZFN0YXRlKTsKCiAgICAgICAgaWYgKCFjYWNoZWRTdGF0ZSkgewogICAgICAgICAgICBjYWNoZWRTdGF0ZSA9IHRvcG9EZWZQcmVmcygpOwogICAgICAgICAgICBwcy5zZXRQcmVmcyhjb29rdGFnLCBjYWNoZWRTdGF0ZSk7CiAgICAgICAgICAgICRsb2cuZGVidWcoJ1RPT0xCQVItLS0tIFNldCBkZWZhdWx0IHByZWZzIHN0YXRlOicsIGNhY2hlZFN0YXRlKTsKICAgICAgICB9CgogICAgICAgIGFuZ3VsYXIuZm9yRWFjaChwcmVmc01hcCwgZnVuY3Rpb24gKHYsIGspIHsKICAgICAgICAgICAgdmFyIGNmZyA9IGsyYlt2XTsKICAgICAgICAgICAgY2ZnICYmIChjZmcuaXNlbCA9ICEhY2FjaGVkU3RhdGVba10pOwogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGluaXRLZXlEYXRhKCkgewogICAgICAgIC8vIFRPRE86IHVzZSBhbmd1bGFyIGZvckVhY2ggaW5zdGVhZCBvZiBkMy5tYXAKICAgICAgICBrZXlEYXRhID0gZDMubWFwKGsyYik7CiAgICAgICAga2V5RGF0YS5mb3JFYWNoKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgdmFyIGRhdGEgPSBhcGkuZ2V0QWN0aW9uRW50cnkoa2V5KTsKICAgICAgICAgICAgdmFsdWUuY2IgPSBkYXRhWzBdOyAgICAgICAgICAgICAgICAgICAgIC8vIG9uLWNsaWNrIGNhbGxiYWNrCiAgICAgICAgICAgIHZhbHVlLnR0ID0gZGF0YVsxXSArICcgKCcgKyBrZXkgKyAnKSc7ICAvLyB0b29sdGlwCiAgICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gYWRkQnV0dG9uKGtleSkgewogICAgICAgIHZhciB2ID0ga2V5RGF0YS5nZXQoa2V5KTsKICAgICAgICB2LmJ0biA9IHRvb2xiYXIuYWRkQnV0dG9uKHYuaWQsIHYuZ2lkLCB2LmNiLCB2LnR0KTsKICAgIH0KCiAgICBmdW5jdGlvbiBhZGRUb2dnbGUoa2V5LCBzdXBwcmVzc0lmTW9iaWxlKSB7CiAgICAgICAgdmFyIHYgPSBrZXlEYXRhLmdldChrZXkpOwogICAgICAgIGlmIChzdXBwcmVzc0lmTW9iaWxlICYmIGZzLmlzTW9iaWxlKCkpIHsgcmV0dXJuOyB9CiAgICAgICAgdi50b2cgPSB0b29sYmFyLmFkZFRvZ2dsZSh2LmlkLCB2LmdpZCwgdi5pc2VsLCB2LmNiLCB2LnR0KTsKICAgIH0KCiAgICBmdW5jdGlvbiBhZGRGaXJzdFJvdygpIHsKICAgICAgICBhZGRUb2dnbGUoJ0knKTsKICAgICAgICBhZGRUb2dnbGUoJ08nKTsKICAgICAgICBhZGRUb2dnbGUoJ0QnKTsKICAgICAgICB0b29sYmFyLmFkZFNlcGFyYXRvcigpOwoKICAgICAgICBhZGRUb2dnbGUoJ0gnKTsKICAgICAgICBhZGRUb2dnbGUoJ00nKTsKICAgICAgICBhZGRUb2dnbGUoJ1AnLCB0cnVlKTsKICAgICAgICBhZGRUb2dnbGUoJ0InKTsKICAgICAgICBhZGRUb2dnbGUoJ1MnLCB0cnVlKTsKICAgIH0KCiAgICBmdW5jdGlvbiBhZGRTZWNvbmRSb3coKSB7CiAgICAgICAgLy9hZGRUb2dnbGUoJ1gnKTsKICAgICAgICBhZGRUb2dnbGUoJ1onKTsKICAgICAgICBhZGRCdXR0b24oJ04nKTsKICAgICAgICBhZGRCdXR0b24oJ0wnKTsKICAgICAgICBhZGRCdXR0b24oJ1InKTsKICAgICAgICB0b29sYmFyLmFkZFNlcGFyYXRvcigpOwogICAgICAgIGFkZEJ1dHRvbignRScpOwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZE92ZXJsYXlzKCkgewogICAgICAgIHRvb2xiYXIuYWRkU2VwYXJhdG9yKCk7CgogICAgICAgIC8vIGdlbmVyYXRlIHJhZGlvIGJ1dHRvbiBzZXQgZm9yIG92ZXJsYXlzOyBzdGFydCB3aXRoICdub25lJwogICAgICAgIHZhciByc2V0ID0gW3sKICAgICAgICAgICAgICAgIGdpZDogJ3Vua25vd24nLAogICAgICAgICAgICAgICAgdG9vbHRpcDogJ05vIE92ZXJsYXknLAogICAgICAgICAgICAgICAgY2I6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB0b3YudGJTZWxlY3Rpb24obnVsbCwgc3dpdGNoT3ZlcmxheUFjdGlvbnMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9XTsKICAgICAgICBvdkluZGV4ID0gdG92LmF1Z21lbnRSYnNldChyc2V0LCBzd2l0Y2hPdmVybGF5QWN0aW9ucyk7CiAgICAgICAgb3ZSc2V0ID0gdG9vbGJhci5hZGRSYWRpb1NldCgndG9wby1vdmVybGF5cycsIHJzZXQpOwogICAgfQoKICAgIC8vIGludm9rZWQgYnkgb3ZlcmxheSBzZXJ2aWNlIHRvIHN3aXRjaCBvdXQgb2xkIGJ1dHRvbnMgYW5kIHN3aXRjaCBpbiBuZXcKICAgIGZ1bmN0aW9uIHN3aXRjaE92ZXJsYXlBY3Rpb25zKG9pZCwga2V5QmluZGluZ3MpIHsKICAgICAgICB2YXIgcHJvaGliaXRzID0gW10sCiAgICAgICAgICAgIGtiID0gZnMuaXNPKGtleUJpbmRpbmdzKSB8fCB7fSwKICAgICAgICAgICAgb3JkZXIgPSBmcy5pc0Eoa2IuX2tleU9yZGVyKSB8fCBbXTsKCiAgICAgICAgaWYgKGtleUJpbmRpbmdzICYmICFrZXlCaW5kaW5ncy5fa2V5T3JkZXIpIHsKICAgICAgICAgICAgJGxvZy53YXJuKHNvYSArICdubyBfa2V5T3JkZXIgcHJvcGVydHkgZGVmaW5lZCcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIHNhbml0eSByZW1vdmFsIG9mIHJlc2VydmVkIHByb3BlcnR5IG5hbWVzCiAgICAgICAgICAgIFsnZXNjJywgJ19rZXlMaXN0ZW5lcicsICdfaGVscEZvcm1hdCddLmZvckVhY2goZnVuY3Rpb24gKGspIHsKICAgICAgICAgICAgICAgIGZzLnJlbW92ZUZyb21BcnJheShrLCBvcmRlcik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLy8gZW5zdXJlIGRpYWxvZyBoYXMgY2xvc2VkIChpZiBvcGVuZWQgYnkgb3V0Z29pbmcgb3ZlcmxheSkKICAgICAgICB0ZHMuY2xvc2VEaWFsb2coKTsKICAgICAgICB0aGlyZFJvdy5jbGVhcigpOwoKICAgICAgICBpZiAoIW9yZGVyLmxlbmd0aCkgewogICAgICAgICAgICB0aGlyZFJvdy5zZXRUZXh0KHNlbE92ZXIpOwogICAgICAgICAgICB0aGlyZFJvdy5jbGFzc2VkKCdyaWdodCcsIHRydWUpOwogICAgICAgICAgICBhcGkuc2V0VXBLZXlzKCk7IC8vIGNsZWFyIHByZXZpb3VzIG92ZXJsYXkga2V5IGJpbmRpbmdzCgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXJkUm93LmNsYXNzZWQoJ3JpZ2h0JywgZmFsc2UpOwogICAgICAgICAgICBhbmd1bGFyLmZvckVhY2gob3JkZXIsIGZ1bmN0aW9uIChrZXkpIHsKICAgICAgICAgICAgICAgIHZhciB2YWx1ZSwgYmlkLCBnaWQsIHR0OwoKICAgICAgICAgICAgICAgIGlmIChwcm9oaWJpdGVkLmluZGV4T2Yoa2V5KSA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgcHJvaGliaXRzLnB1c2goa2V5KTsKCiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0ga2V5QmluZGluZ3Nba2V5XTsKICAgICAgICAgICAgICAgICAgICBiaWQgPSBvaWQgKyAnLScgKyBrZXk7CiAgICAgICAgICAgICAgICAgICAgZ2lkID0gdG92Lm1rR2x5cGhJZChvaWQsIHZhbHVlLmdpZCk7CiAgICAgICAgICAgICAgICAgICAgdHQgPSB2YWx1ZS50dCArICcgKCcgKyBrZXkgKyAnKSc7CiAgICAgICAgICAgICAgICAgICAgdGhpcmRSb3cuYWRkQnV0dG9uKGJpZCwgZ2lkLCB2YWx1ZS5jYiwgdHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgYXBpLnNldFVwS2V5cyhrZXlCaW5kaW5ncyk7IC8vIGFkZCBvdmVybGF5IGtleSBiaW5kaW5ncwogICAgICAgIH0KCiAgICAgICAgaWYgKHByb2hpYml0cy5sZW5ndGgpIHsKICAgICAgICAgICAgJGxvZy53YXJuKHNvYSArICdQcm9oaWJpdGVkIGtleSBiaW5kaW5ncyBpZ25vcmVkOicsIHByb2hpYml0cyk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0ZVRvb2xiYXIoKSB7CiAgICAgICAgaW5pdEtleURhdGEoKTsKICAgICAgICB0b29sYmFyID0gdGJzLmNyZWF0ZVRvb2xiYXIobmFtZSk7CiAgICAgICAgYWRkRmlyc3RSb3coKTsKICAgICAgICB0b29sYmFyLmFkZFJvdygpOwogICAgICAgIGFkZFNlY29uZFJvdygpOwogICAgICAgIGFkZE92ZXJsYXlzKCk7CiAgICAgICAgdGhpcmRSb3cgPSB0b29sYmFyLmFkZFJvdygpOwogICAgICAgIHRoaXJkUm93LnNldFRleHQoc2VsT3Zlcik7CiAgICAgICAgdGhpcmRSb3cuY2xhc3NlZCgncmlnaHQnLCB0cnVlKTsKCiAgICAgICAgaWYgKGNhY2hlZFN0YXRlLnRvb2xiYXIpIHsKICAgICAgICAgICAgdG9vbGJhci5zaG93KCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdG9vbGJhci5oaWRlKCk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGRlc3Ryb3lUb29sYmFyKCkgewogICAgICAgIHRicy5kZXN0cm95VG9vbGJhcihuYW1lKTsKICAgICAgICB0b3YucmVzZXRPblRvb2xiYXJEZXN0cm95KCk7CiAgICB9CgogICAgLy8gYWxsb3dzIHVzIHRvIGVuc3VyZSB0aGUgYnV0dG9uIHN0YXRlcyB0cmFjayBrZXkgc3Ryb2tlcwogICAgZnVuY3Rpb24ga2V5TGlzdGVuZXIoa2V5KSB7CiAgICAgICAgdmFyIHYgPSBrZXlEYXRhLmdldChrZXkpOwoKICAgICAgICBpZiAodikgewogICAgICAgICAgICAvLyB3ZSBoYXZlIGEgdmFsaWQgYnV0dG9uIG1hcHBpbmcKICAgICAgICAgICAgaWYgKHYudG9nKSB7CiAgICAgICAgICAgICAgICAvLyBpdCdzIGEgdG9nZ2xlIGJ1dHRvbgogICAgICAgICAgICAgICAgdi50b2cudG9nZ2xlTm9DYigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHRvZ2dsZVRvb2xiYXIoKSB7CiAgICAgICAgdG9vbGJhci50b2dnbGUoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZXREZWZhdWx0T3ZlcmxheSgpIHsKICAgICAgICB2YXIgaWR4ID0gb3ZJbmRleFtkZWZhdWx0T3ZlcmxheV0gfHwgMDsKICAgICAgICBvdlJzZXQuc2VsZWN0ZWRJbmRleChpZHgpOwogICAgfQoKICAgIC8vIGFuIG92ZXJsYXkgd2FzIHNlbGVjdGVkIHZpYSBGdW5jdGlvbi1LZXkgcHJlc3MKICAgIGZ1bmN0aW9uIGZua2V5KGlkeCkgewogICAgICAgIGlmIChpZHggPCBvdlJzZXQuc2l6ZSgpICYmIGlkeCAhPT0gb3ZSc2V0LnNlbGVjdGVkSW5kZXgoKSkgewogICAgICAgICAgICBvdlJzZXQuc2VsZWN0ZWRJbmRleChpZHgpOwogICAgICAgIH0KICAgIH0KCiAgICBhbmd1bGFyLm1vZHVsZSgnb3ZUb3BvJykKICAgICAgICAuZmFjdG9yeSgnVG9wb1Rvb2xiYXJTZXJ2aWNlJywKICAgICAgICBbJyRsb2cnLCAnRm5TZXJ2aWNlJywgJ1Rvb2xiYXJTZXJ2aWNlJywgJ1ByZWZzU2VydmljZScsCiAgICAgICAgICAgICdUb3BvT3ZlcmxheVNlcnZpY2UnLCAnVG9wb0RpYWxvZ1NlcnZpY2UnLAoKICAgICAgICBmdW5jdGlvbiAoXyRsb2dfLCBfZnNfLCBfdGJzXywgX3BzXywgX3Rvdl8sIF90ZHNfKSB7CiAgICAgICAgICAgICRsb2cgPSBfJGxvZ187CiAgICAgICAgICAgIGZzID0gX2ZzXzsKICAgICAgICAgICAgdGJzID0gX3Ric187CiAgICAgICAgICAgIHBzID0gX3BzXzsKICAgICAgICAgICAgdG92ID0gX3Rvdl87CiAgICAgICAgICAgIHRkcyA9IF90ZHNfOwoKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGluaXQ6IGluaXQsCiAgICAgICAgICAgICAgICBjcmVhdGVUb29sYmFyOiBjcmVhdGVUb29sYmFyLAogICAgICAgICAgICAgICAgZGVzdHJveVRvb2xiYXI6IGRlc3Ryb3lUb29sYmFyLAogICAgICAgICAgICAgICAga2V5TGlzdGVuZXI6IGtleUxpc3RlbmVyLAogICAgICAgICAgICAgICAgdG9nZ2xlVG9vbGJhcjogdG9nZ2xlVG9vbGJhciwKICAgICAgICAgICAgICAgIHNldERlZmF1bHRPdmVybGF5OiBzZXREZWZhdWx0T3ZlcmxheSwKICAgICAgICAgICAgICAgIGZua2V5OiBmbmtleQogICAgICAgICAgICB9OwogICAgICAgIH1dKTsKfSgpKTtz8e9Wg1oKAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0ZJhAAEAGRkXAqAc2wKgHYJbTH/VhHFwBcoMHUYAQBW4ZzAAAAQEICgC3yOkAYg/fc/HvVrpaCgCPAgAAjwIAAAgAJ60eE2j3KB/SxQgARQACgWSZQABABkP3wKgHNsCoB2CW0x/1YRxcAXKDB1GAGAWkXBsAAAEBCAoAt8jqAGIP30dFVCAvb25vcy91aS9hcHAvdmlldy9pbnRlbnQvaW50ZW50LmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiAqLyoNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9W/l0KAGEIAABhCAAAaPcoH9LFCAAnrR4TCABFAAhTiW1AAEAGGVHAqAdgwKgHNh/1ltBrOvEn+T4gy4AYAmGYLAAAAQEICgBiD+AAt8jmSFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvamF2YXNjcmlwdA0KQ29udGVudC1MZW5ndGg6IDE5NzQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KLyoKICogQ29weXJpZ2h0IDIwMTUsMjAxNiBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBQb3J0IFZpZXcgTW9kdWxlCiAqLwoKKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBpbmplY3RlZCByZWZlcmVuY2VzCiAgICB2YXIgJGxvZywgJHNjb3BlLCAkbG9jYXRpb24sIGZzLCB0YnMsIG5zOwoKICAgIGFuZ3VsYXIubW9kdWxlKCdvdlBvcnQnLCBbXSkKICAgIC5jb250cm9sbGVyKCdPdlBvcnRDdHJsJywKICAgICAgICBbJyRsb2cnLCAnJHNjb3BlJywgJyRsb2NhdGlvbicsCiAgICAgICAgICAgICdGblNlcnZpY2UnLCAnVGFibGVCdWlsZGVyU2VydmljZScsICdOYXZTZXJ2aWNlJywKCiAgICAgICAgZnVuY3Rpb24gKF8kbG9nXywgXyRzY29wZV8sIF8kbG9jYXRpb25fLCBfZnNfLCBfdGJzXywgX25zXykgewogICAgICAgICAgICB2YXIgcGFyYW1zOwogICAgICAgICAgICAkbG9nID0gXyRsb2dfOwogICAgICAgICAgICAkc2NvcGUgPSBfJHNjb3BlXzsKICAgICAgICAgICAgJGxvY2F0aW9uID0gXyRsb2NhdGlvbl87CiAgICAgICAgICAgIGZzID0gX2ZzXzsKICAgICAgICAgICAgdGJzID0gX3Ric187CiAgICAgICAgICAgIG5zID0gX25zXzsKICAgICAgICAgICAgJHNjb3BlLmRldmljZVRpcCA9ICdTaG93IGRldmljZSB0YWJsZSc7CiAgICAgICAgICAgICRzY29wZS5mbG93VGlwID0gJ1Nob3cgZmxvdyB2aWV3IGZvciB0aGlzIGRldmljZSc7CiAgICAgICAgICAgICRzY29wZS5ncm91cFRpcCA9ICdTaG93IGdyb3VwIHZpZXcgZm9yIHRoaXMgZGV2aWNlJzsKICAgICAgICAgICAgJHNjb3BlLm1ldGVyVGlwID0gJ1Nob3cgbWV0ZXIgdmlldyBmb3Igc2VsZWN0ZWQgZGV2aWNlJzsKCiAgICAgICAgICAgIHBhcmFtcyA9ICRsb2NhdGlvbi5zZWFyY2goKTsKICAgICAgICAgICAgaWYgKHBhcmFtcy5oYXNPd25Qcm9wZXJ0eSgnZGV2SWQnKSkgewogICAgICAgICAgICAgICAgJHNjb3BlLmRldklkID0gcGFyYW1zWydkZXZJZCddOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0YnMuYnVpbGRUYWJsZSh7CiAgICAgICAgICAgICAgICBzY29wZTogJHNjb3BlLAogICAgICAgICAgICAgICAgdGFnOiAncG9ydCcsCiAgICAgICAgICAgICAgICBxdWVyeTogcGFyYW1zCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgJHNjb3BlLm5hdiA9IGZ1bmN0aW9uIChwYXRoKSB7CiAgICAgICAgICAgICAgICBpZiAoJHNjb3BlLmRldklkKSB7CiAgICAgICAgICAgICAgICAgICAgbnMubmF2VG8ocGF0aCwgeyBkZXZJZDogJHNjb3BlLmRldklkIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgJGxvZy5sb2coJ092UG9ydEN0cmwgaGFzIGJlZW4gY3JlYXRlZCcpOwogICAgICAgIH1dKTsKfSgpKTsKc/HvVjZeCgBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANF+wQABABkstwKgHNsCoB2CW0B/1+T4gy2s6+UaAEAWk0f0AAAEBCAoAt8jqAGIP4HPx71b6XwoAdhsAAHYbAABo9ygf0sUIACetHhMIAEUAG2h/MUAAQAYQeMCoB2DAqAc2H/WWzw6+ZtCjarosgBgC86tBAAABAQgKAGIP4AC3yONIVFRQLzEuMSAyMDAgT0sNCkNvbnRlbnQtVHlwZTogdGV4dC9qYXZhc2NyaXB0DQpDb250ZW50LUxlbmd0aDogNjg1OQ0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBUb3BvbG9neSBUcmFmZmljIE1vZHVsZS4KIERlZmluZXMgYmVoYXZpb3IgZm9yIHZpZXdpbmcgZGlmZmVyZW50IHRyYWZmaWMgbW9kZXMuCiAqLwoKKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBpbmplY3RlZCByZWZzCiAgICB2YXIgJGxvZywgZnMsIGZsYXNoLCB3c3MsIGFwaTsKCiAgICAvKgogICAgICAgQVBJIHRvIHRvcG9Gb3JjZQogICAgICAgICBob3ZlcmVkKCkKICAgICAgICAgc29tZXRoaW5nU2VsZWN0ZWQoKQogICAgICAgICBzZWxlY3RPcmRlcigpCiAgICAgKi8KCiAgICAvLyBpbnRlcm5hbCBzdGF0ZQogICAgdmFyIHRyYWZmaWNNb2RlID0gbnVsbCwKICAgICAgICBob3Zlck1vZGUgPSBudWxsOwoKCiAgICAvLyA9PT0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vICBIZWxwZXIgZnVuY3Rpb25zCgogICAgLy8gaW52b2tlZCBpbiByZXNwb25zZSB0byBjaGFuZ2UgaW4gc2VsZWN0aW9uIGFuZC9vciBtb3VzZW92ZXIvb3V0OgogICAgZnVuY3Rpb24gcmVxdWVzdFRyYWZmaWNGb3JNb2RlKG1vdXNlKSB7CiAgICAgICAgaWYgKHRyYWZmaWNNb2RlID09PSAnZmxvd3MnKSB7CiAgICAgICAgICAgIHJlcXVlc3REZXZpY2VMaW5rRmxvd3MoKTsKICAgICAgICB9IGVsc2UgaWYgKHRyYWZmaWNNb2RlID09PSAnaW50ZW50cycpIHsKICAgICAgICAgICAgaWYgKCFtb3VzZSB8fCBob3Zlck1vZGUgPT09ICdpbnRlbnRzJykgewogICAgICAgICAgICAgICAgcmVxdWVzdFJlbGF0ZWRJbnRlbnRzKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBkbyBub3RoaW5nCiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHJlcXVlc3REZXZpY2VMaW5rRmxvd3MoKSB7CiAgICAgICAgLy8gZ2VuZXJhdGVzIHBheWxvYWQgYmFzZWQgb24gY3VycmVudCBob3Zlci1zdGF0ZQogICAgICAgIHZhciBob3YgPSBhcGkuaG92ZXJlZCgpOwoKICAgICAgICBmdW5jdGlvbiBob3ZlclZhbGlkKCkgewogICAgICAgICAgICByZXR1cm4gaG92ZXJNb2RlID09PSAnZmxvd3MnICYmCiAgICAgICAgICAgICAgICBob3YgJiYgKGhvdi5jbGFzcyA9PT0gJ2RldmljZScpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGFwaS5zb21ldGhpbmdTZWxlY3RlZCgpKSB7CiAgICAgICAgICAgIHdzcy5zZW5kRXZlbnQoJ3JlcXVlc3REZXZpY2VMaW5rRmxvd3MnLCB7CiAgICAgICAgICAgICAgICBpZHM6IGFwaS5zZWxlY3RPcmRlcigpLAogICAgICAgICAgICAgICAgaG92ZXI6IGhvdmVyVmFsaWQoKSA/IGhvdi5pZCA6ICcnCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiByZXF1ZXN0UmVsYXRlZEludGVudHMoKSB7CiAgICAgICAgLy8gZ2VuZXJhdGVzIHBheWxvYWQgYmFzZWQgb24gY3VycmVudCBob3Zlci1zdGF0ZQogICAgICAgIHZhciBob3YgPSBhcGkuaG92ZXJlZCgpOwoKICAgICAgICBmdW5jdGlvbiBob3ZlclZhbGlkKCkgewogICAgICAgICAgICByZXR1cm4gaG92ZXJNb2RlID09PSAnaW50ZW50cycgJiYKICAgICAgICAgICAgICAgIGhvdiAmJiAoaG92LmNsYXNzID09PSAnaG9zdCcgfHwgaG92LmNsYXNzID09PSAnZGV2aWNlJyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoYXBpLnNvbWV0aGluZ1NlbGVjdGVkKCkpIHsKICAgICAgICAgICAgd3NzLnNlbmRFdmVudCgncmVxdWVzdFJlbGF0ZWRJbnRlbnRzJywgewogICAgICAgICAgICAgICAgaWRzOiBhcGkuc2VsZWN0T3JkZXIoKSwKICAgICAgICAgICAgICAgIGhvdmVyOiBob3ZlclZhbGlkKCkgPyBob3YuaWQgOiAnJwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CgoKICAgIC8vID09PSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyAgVHJhZmZpYyByZXF1ZXN0cyBpbnZva2VkIGZyb20ga2V5c3Ryb2tlcyBvciB0b29sYmFyIGJ1dHRvbnMuLi4KCiAgICBmdW5jdGlvbiBjYW5jZWxUcmFmZmljKGZvcmNlZCkgewogICAgICAgIGlmICghdHJhZmZpY01vZGUgfHwgKCFmb3JjZWQgJiYgdHJhZmZpY01vZGUgPT09ICdhbGxGbG93UG9ydCcpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIHRyYWZmaWNNb2RlID0gaG92ZXJNb2RlID0gbnVsbDsKICAgICAgICB3c3Muc2VuZEV2ZW50KCdjYW5jZWxUcmFmZmljJyk7CiAgICAgICAgZmxhc2guZmxhc2goJ1RyYWZmaWMgbW9uaXRvcmluZyBjYW5jZWxlZCcpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIGZ1bmN0aW9uIHNob3dBbGxGbG93VHJhZmZpYygpIHsKICAgICAgICB0cmFmZmljTW9kZSA9ICdhbGxGbG93UG9ydCc7CiAgICAgICAgaG92ZXJNb2RlID0gbnVsbDsKICAgICAgICB3c3Muc2VuZEV2ZW50KCdyZXF1ZXN0QWxsRmxvd1RyYWZmaWMnKTsKICAgICAgICBmbGFzaC5mbGFzaCgnQWxsIEZsb3cgVHJhZmZpYycpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNob3dBbGxQb3J0VHJhZmZpYygpIHsKICAgICAgICB0cmFmZmljTW9kZSA9ICdhbGxGbG93UG9ydCc7CiAgICAgICAgaG92ZXJNb2RlID0gbnVsbDsKICAgICAgICB3c3Muc2VuZEV2ZW50KCdyZXF1ZXN0QWxsUG9ydFRyYWZmaWMnKTsKICAgICAgICBmbGFzaC5mbGFzaCgnQWxsIFBvcnQgVHJhZmZpYycpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNob3dEZXZpY2VMaW5rRmxvd3MgKCkgewogICAgICAgIHRyYWZmaWNNb2RlID0gaG92ZXJNb2RlID0gJ2Zsb3dzJzsKICAgICAgICByZXF1ZXN0RGV2aWNlTGlua0Zsb3dzKCk7CiAgICAgICAgZmxhc2guZmxhc2goJ0RldmljZSBGbG93cycpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNob3dSZWxhdGVkSW50ZW50cyAoKSB7CiAgICAgICAgdHJhZmZpY01vZGUgPSBob3Zlck1vZGUgPSAnaW50ZW50cyc7CiAgICAgICAgcmVxdWVzdFJlbGF0ZWRJbnRlbnRzKCk7CiAgICAgICAgZmxhc2guZmxhc2goJ1JlbGF0ZWQgUGF0aHMnKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzaG93UHJldkludGVudCgpIHsKICAgICAgICBpZiAodHJhZmZpY01vZGUgPT09ICdpbnRlbnRzJykgewogICAgICAgICAgICBob3Zlck1vZGUgPSBudWxsOwogICAgICAgICAgICB3c3Muc2VuZEV2ZW50KCdyZXF1ZXN0UHJldlJlbGF0ZWRJbnRlbnQnKTsKICAgICAgICAgICAgZmxhc2guZmxhc2goJ1ByZXZpb3VzIHJlbGF0ZWQgaW50ZW50Jyk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHNob3dOZXh0SW50ZW50KCkgewogICAgICAgIGlmICh0cmFmZmljTW9kZSA9PT0gJ2ludGVudHMnKSB7CiAgICAgICAgICAgIGhvdmVyTW9kZSA9IG51bGw7CiAgICAgICAgICAgIHdzcy5zZW5kRXZlbnQoJ3JlcXVlc3ROZXh0UmVsYXRlZEludGVudCcpOwogICAgICAgICAgICBmbGFzaC5mbGFzaCgnTmV4dCByZWxhdGVkIGludGVudCcpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBzaG93U2VsZWN0ZWRJbnRlbnRUcmFmZmljKCkgewogICAgICAgIGlmICh0cmFmZmljTW9kZSA9PT0gJ2ludGVudHMnKSB7CiAgICAgICAgICAgIGhvdmVyTW9kZSA9IG51bGw7CiAgICAgICAgICAgIHdzcy5zZW5kRXZlbnQoJ3JlcXVlc3RTZWxlY3RlZEludGVudFRyYWZmaWMnKTsKICAgICAgICAgICAgZmxhc2guZmxhc2goJ1RyYWZmaWMgb24gU2VsZWN0ZWQgUGF0aCcpOwogICAgICAgIH0KICAgIH0KCiAgICAvLyBmb3JjZSB0aGUgc3lzdGVtIHRvIGNyZWF0ZSBhIHNpbmdsZSBpbnRlbnQgc2VsZWN0aW9uCiAgICBmdW5jdGlvbiBzZWxlY3RJbnRlbnQoZGF0YSkgewogICAgICAgIHRyYWZmaWNNb2RlID0gJ2ludGVudHMnOwogICAgICAgIGhvdmVyTW9kZSA9IG51bGw7CiAgICAgICAgd3NzLnNlbmRFdmVudCgnc2VsZWN0SW50ZW50JywgZGF0YSk7CiAgICAgICAgZmxhc2guZmxhc2goJ1NlbGVjdGluZyBJbnRlbnQgJyArIGRhdGEua2V5KTsKICAgIH0KCgogICAgLy8gPT09IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gYWN0aW9uIGJ1dHRvbnMgb24gZGV0YWlsIHBhbmVsIChtdWx0aXBsZSBzZWxlY3Rpb24pCgogICAgZnVuY3Rpb24gYWRkSG9zdEludGVudCAoKSB7CiAgICAgICAgdmFyIHNvID0gYXBpLnNlbGVjdE9yZGVyKCk7CiAgICAgICAgd3NzLnNlbmRFdmVudCgnYWRkSG9zdEludGVudCcsIHsKICAgICAgICAgICAgb25lOiBzb1swXSwKICAgICAgICAgICAgdHdvOiBzb1sxXSwKICAgICAgICAgICAgaWRzOiBzbwogICAgICAgIH0pOwogICAgICAgIHRyYWZmaWNNb2RlID0gJ2ludGVudHMnOwogICAgICAgIGhvdmVyTW9kZSA9IG51bGw7CiAgICAgICAgZmxhc2guZmxhc2goJ0hvc3QtdG8tSG9zdCBmbG93IGFkZGVkJyk7CiAgICB9CgogICAgZnVuY3Rpb24gYWRkTXVsdGlTb3VyY2VJbnRlbnQgKCkgewogICAgICAgIHZhciBzbyA9IGFwaS5zZWxlY3RPcmRlcigpOwogICAgICAgIHdzcy5zZW5kRXZlbnQoJ2FkZE11bHRpU291cmNlSW50ZW50JywgewogICAgICAgICAgICBzcmM6IHNvLnNsaWNlKDAsIHNvLmxlbmd0aCAtIDEpLAogICAgICAgICAgICBkc3Q6IHNvW3NvLmxlbmd0aCAtIDFdLAogICAgICAgICAgICBpZHM6IHNvCiAgICAgICAgfSk7CiAgICAgICAgdHJhZmZpY01vZGUgPSAnaW50ZW50cyc7CiAgICAgICAgaG92ZXJNb2RlID0gbnVsbDsKICAgICAgICBmbGFzaC5mbGFzaCgnTXVsdGktU291cmNlIGZsb3cgYWRkZWQnKTsKICAgIH0KCgogICAgLy8gPT09IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyA9PT0gTU9EVUxFIERFRklOSVRJT04gPT09CgogICAgYW5ndWxhci5tb2R1bGUoJ292VG9wbycpCiAgICAuZmFjdG9yeSgnVG9wb1RyYWZmaWNTZXJ2aWNlJywKICAgICAgICBbJyRsb2cnLCAnRm5TZXJ2aWNlJywgJ0ZsYXNoU2VydmljZScsICdXZWJTb2NrZXRTZXJ2aWNlJywKCiAgICAgICAgZnVuY3Rpb24gKF8kbG9nXywgX2ZzXywgX2ZsYXNoXywgX3dzc18pIHsKICAgICAgICAgICAgJGxvZyA9IF8kbG9nXzsKICAgICAgICAgICAgZnMgPSBfZnNfOwogICAgICAgICAgICBmbGFzaCA9IF9mbGFzaF87CiAgICAgICAgICAgIHdzcyA9IF93c3NfOwoKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGluaXRUcmFmZmljOiBmdW5jdGlvbiAoX2FwaV8pIHsgYXBpID0gX2FwaV87IH0sCiAgICAgICAgICAgICAgICBkZXN0cm95VHJhZmZpYzogZnVuY3Rpb24gKCkgeyB9LAoKICAgICAgICAgICAgICAgIC8vIGludm9rZWQgZnJvbSB0b29sYmFyIG92ZXJsYXkgYnV0dG9ucyBvciBrZXlzdHJva2VzCiAgICAgICAgICAgICAgICBjYW5jZWxUcmFmZmljOiBjYW5jZWxUcmFmZmljLAogICAgICAgICAgICAgICAgc2hvd0FsbEZsb3dUcmFmZmljOiBzaG93QWxsRmxvd1RyYWZmaWMsCiAgICAgICAgICAgICAgICBzaG93QWxsUG9ydFRyYWZmaWM6IHNob3dBbGxQb3J0VHJhZmZpYywKICAgICAgICAgICAgICAgIHNob3dEZXZpY2VMaW5rRmxvd3M6IHNob3dEZXZpY2VMaW5rRmxvd3MsCiAgICAgICAgICAgICAgICBzaG93UmVsYXRlZEludGVudHM6IHNob3dSZWxhdGVkSW50ZW50cywKICAgICAgICAgICAgICAgIHNob3dQcmV2SW50ZW50OiBzaG93UHJldkludGVudCwKICAgICAgICAgICAgICAgIHNob3dOZXh0SW50ZW50OiBzaG93TmV4dEludGVudCwKICAgICAgICAgICAgICAgIHNob3dTZWxlY3RlZEludGVudFRyYWZmaWM6IHNob3dTZWxlY3RlZEludGVudFRyYWZmaWMsCiAgICAgICAgICAgICAgICBzZWxlY3RJbnRlbnQ6IHNlbGVjdEludGVudCwKCiAgICAgICAgICAgICAgICAvLyBpbnZva2VkIGZyb20gbW91c2VvdmVyL21vdXNlb3V0IGFuZCBzZWxlY3Rpb24gY2hhbmdlCiAgICAgICAgICAgICAgICByZXF1ZXN0VHJhZmZpY0Zvck1vZGU6IHJlcXVlc3RUcmFmZmljRm9yTW9kZSwKCiAgICAgICAgICAgICAgICAvLyBUT0RPOiB0aGVzZSBzaG91bGQgbW92ZSB0byBuZXcgVUkgZGVtbyBhcHAKICAgICAgICAgICAgICAgIC8vIGludm9rZWQgZnJvbSBidXR0b25zIG9uIGRldGFpbCAobXVsdGktc2VsZWN0KSBwYW5lbAogICAgICAgICAgICAgICAgYWRkSG9zdEludGVudDogYWRkSG9zdEludGVudCwKICAgICAgICAgICAgICAgIGFkZE11bHRpU291cmNlSW50ZW50OiBhZGRNdWx0aVNvdXJjZUludGVudAogICAgICAgICAgICB9OwogICAgICAgIH1dKTsKfSgpKTsKc/HvVsJgCgBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANMQeQABABua+wKgHNsCoB2CWzx/1o2q6LA6+ggSAECFmRm4AAAEBCAoAt8jqAGIP4HPx71bxYQoAiQIAAIkCAAAIACetHhNo9ygf0sUIAEUAAntfsUAAQAZI5cCoBzbAqAdgltAf9fk+IMtrOvlGgBgFpDUOAAABAQgKALfI6gBiD+BHRVQgL29ub3MvdWkvYXBwL3ZpZXcvYXBwL2FwcC5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVl5kCgCTAgAAkwIAAAgAJ60eE2j3KB/SxQgARQAChcQfQABABuRswKgHNsCoB2CWzx/1o2q6LA6+ggSAGCFmqRAAAAEBCAoAt8jqAGIP4EdFVCAvb25vcy91aS9hcHAvdmlldy9zZXR0aW5ncy9zZXR0aW5ncy5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVthpCgCuOAAArjgAAGj3KB/SxQgAJ60eEwgARQA4oIlvQABABukBwKgHYMCoBzYf9ZbQazr5Rvk+IxKAGAJqyHkAAAEBCAoAYg/hALfI6khUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2phdmFzY3JpcHQNCkNvbnRlbnQtTGVuZ3RoOiAxNDMzOA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNS0yMDE2IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAnTGljZW5zZScpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gJ0FTIElTJyBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIEFwcCBWaWV3IE1vZHVsZQogKi8KCihmdW5jdGlvbiAoKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8gaW5qZWN0ZWQgcmVmcwogICAgdmFyICRsb2csICRzY29wZSwgd3NzLCBmcywga3MsIHBzLCBpczsKCiAgICAvLyBpbnRlcm5hbCBzdGF0ZQogICAgdmFyICBkZXRhaWxzUGFuZWwsCiAgICAgICAgIHBTdGFydFksCiAgICAgICAgIHBIZWlnaHQsCiAgICAgICAgIHRvcCwKICAgICAgICAgbWlkZGxlLAogICAgICAgICBib3R0b20sCiAgICAgICAgIHdTaXplID0gZmFsc2U7CgogICAgLy8gY29uc3RhbnRzCiAgICB2YXIgSU5TVEFMTEVEID0gJ0lOU1RBTExFRCcsCiAgICAgICAgQUNUSVZFID0gJ0FDVElWRScsCiAgICAgICAgYXBwTWdtdFJlcSA9ICdhcHBNYW5hZ2VtZW50UmVxdWVzdCcsCiAgICAgICAgdG9wUGRnID0gNTAsCiAgICAgICAgcGFuZWxXaWR0aCA9IDUwMCwKICAgICAgICBwTmFtZSA9ICdhcHBsaWNhdGlvbi1kZXRhaWxzLXBhbmVsJywKICAgICAgICBkZXRhaWxzUmVxID0gJ2FwcERldGFpbHNSZXF1ZXN0JywKICAgICAgICBkZXRhaWxzUmVzcCA9ICdhcHBEZXRhaWxzUmVzcG9uc2UnLAogICAgICAgIGZpbGVVcGxvYWRVcmwgPSAnYXBwbGljYXRpb25zL3VwbG9hZCcsCiAgICAgICAgaWNvblVybFByZWZpeCA9ICdycy9hcHBsaWNhdGlvbnMvJywKICAgICAgICBpY29uVXJsU3VmZml4ID0gJy9pY29uJywKICAgICAgICBkaWFsb2dJZCA9ICdhcHAtZGlhbG9nJywKICAgICAgICBkaWFsb2dPcHRzID0gewogICAgICAgICAgICBlZGdlOiAncmlnaHQnCiAgICAgICAgfSwKICAgICAgICBzdHJvbmdXYXJuaW5nID0gewogICAgICAgICAgICAnb3JnLm9ub3Nwcm9qZWN0LmRyaXZlcnMnOiB0cnVlCiAgICAgICAgfSwKICAgICAgICBkaXNjb3VyYWdlbWVudCA9ICdEZWFjdGl2YXRpbmcgb3IgdW5pbnN0YWxsaW5nIHRoaXMgY29tcG9uZW50IGNhbicgKwogICAgICAgICcgaGF2ZSBzZXJpb3VzIG5lZ2F0aXZlIGNvbnNlcXVlbmNlcyEgRG8gc28gYXQgeW91ciBvd24gcmlzayEhJywKICAgICAgICBwcm9wT3JkZXIgPSBbJ2lkJywgJ3N0YXRlJywgJ2NhdGVnb3J5JywgJ3ZlcnNpb24nLCAnb3JpZ2luJywgJ3JvbGUnXSwKICAgICAgICBmcmllbmRseVByb3BzID0gWydBcHAgSUQnLCAnU3RhdGUnLCAnQ2F0ZWdvcnknLCAnVmVyc2lvbicsICdPcmlnaW4nLCAnUm9sZSddOwogICAgICAgIC8vIG5vdGU6IHVybCBpcyBoYW5kbGVkIHNlcGFyYXRlbHkKCiAgICBmdW5jdGlvbiBjcmVhdGVEZXRhaWxzUGFuZSgpIHsKICAgICAgICBkZXRhaWxzUGFuZWwgPSBwcy5jcmVhdGVQYW5lbChwTmFtZSwgewogICAgICAgICAgICB3aWR0aDogd1NpemUud2lkdGgsCiAgICAgICAgICAgIG1hcmdpbjogMCwKICAgICAgICAgICAgaGlkZU1hcmdpbjogMAogICAgICAgIH0pOwogICAgICAgIGRldGFpbHNQYW5lbC5lbCgpLnN0eWxlKHsKICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsCiAgICAgICAgICAgIHRvcDogcFN0YXJ0WSArICdweCcKICAgICAgICB9KTsKICAgICAgICAkc2NvcGUuaGlkZVBhbmVsID0gZnVuY3Rpb24gKCkgeyBkZXRhaWxzUGFuZWwuaGlkZSgpOyB9OwogICAgICAgIGRldGFpbHNQYW5lbC5oaWRlKCk7CiAgICB9CgogICAgZnVuY3Rpb24gY2xvc2VQYW5lbCgpIHsKICAgICAgICBpZiAoZGV0YWlsc1BhbmVsLmlzVmlzaWJsZSgpKSB7CiAgICAgICAgICAgICRzY29wZS5zZWxJZCA9IG51bGw7CiAgICAgICAgICAgIGRldGFpbHNQYW5lbC5oaWRlKCk7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgZnVuY3Rpb24gYWRkQ2xvc2VCdG4oZGl2KSB7CiAgICAgICAgaXMubG9hZEVtYmVkZGVkSWNvbihkaXYsICdwbHVzJywgMzApOwogICAgICAgIGRpdi5zZWxlY3QoJ2cnKS5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDI1LCAwKSByb3RhdGUoNDUpJyk7CiAgICAgICAgZGl2Lm9uKCdjbGljaycsIGNsb3NlUGFuZWwpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNldFVwUGFuZWwoKSB7CiAgICAgICAgdmFyIGNvbnRhaW5lciwgY2xvc2VCdG4sIGRpdjsKCiAgICAgICAgZGV0YWlsc1BhbmVsLmVtcHR5KCk7CiAgICAgICAgZGV0YWlsc1BhbmVsLndpZHRoKHBhbmVsV2lkdGgpOwoKICAgICAgICBjb250YWluZXIgPSBkZXRhaWxzUGFuZWwuYXBwZW5kKCdkaXYnKS5jbGFzc2VkKCdjb250YWluZXInLCB0cnVlKTsKCiAgICAgICAgdG9wID0gY29udGFpbmVyLmFwcGVuZCgnZGl2JykuY2xhc3NlZCgndG9wJywgdHJ1ZSk7CiAgICAgICAgY2xvc2VCdG4gPSB0b3AuYXBwZW5kKCdkaXYnKS5jbGFzc2VkKCdjbG9zZS1idG4nLCB0cnVlKTsKICAgICAgICBhZGRDbG9zZUJ0bihjbG9zZUJ0bik7CgogICAgICAgIGRpdiA9IHRvcC5hcHBlbmQoJ2RpdicpLmNsYXNzZWQoJ3RvcC1jb250ZW50JywgdHJ1ZSk7CgogICAgICAgIGZ1bmN0aW9uIG5kaXYoY2xzLCB0Y2xzKSB7CiAgICAgICAgICAgIHZhciAgZCA9IGRpdi5hcHBlbmQoJ2RpdicpLmNsYXNzZWQoY2xzLCB0cnVlKTsKICAgICAgICAgICAgaWYgKHRjbHMpIHsKICAgICAgICAgICAgICAgIGQuYXBwZW5kKCd0YWJsZScpLmNsYXNzZWQodGNscywgdHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG5kaXYoJ2xlZnQgYXBwLWljb24nKTsKICAgICAgICBuZGl2KCdyaWdodCcsICdhcHAtcHJvcHMnKTsKICAgICAgICBuZGl2KCdhcHAtdXJsJyk7CgogICAgICAgIGNvbnRhaW5lci5hcHBlbmQoJ2hyJyk7CgogICAgICAgIG1pZGRsZSA9IGNvbnRhaW5lci5hcHBlbmQoJ2RpdicpLmNsYXNzZWQoJ21pZGRsZScsIHRydWUpOwogICAgICAgIG1pZGRsZS5hcHBlbmQoJ2RpdicpLmNsYXNzZWQoJ2FwcC1yZWFkbWUnLCB0cnVlKTsKCiAgICAgICAgY29udGFpbmVyLmFwcGVuZCgnaHInKTsKCiAgICAgICAgLy8gVE9ETzogbWFrZSBib3R0b20gY29udGFpbmVyIHNjcm9sbGFibGUKICAgICAgICBib3R0b20gPSBjb250YWluZXIuYXBwZW5kKCdkaXYnKS5jbGFzc2VkKCdib3R0b20nLCB0cnVlKTsKCiAgICAgICAgZnVuY3Rpb24gblRhYmxlKGhkciwgY2xzKSB7CiAgICAgICAgICAgIGJvdHRvbS5hcHBlbmQoJ2gyJykuaHRtbChoZHIpOwogICAgICAgICAgICBib3R0b20uYXBwZW5kKCdkaXYnKS5jbGFzc2VkKGNscywgdHJ1ZSkuYXBwZW5kKCd0YWJsZScpOwogICAgICAgIH0KCiAgICAgICAgblRhYmxlKCdGZWF0dXJlcycsICdmZWF0dXJlcycpOwogICAgICAgIG5UYWJsZSgnUmVxdWlyZWQgQXBwcycsICdyZXF1aXJlZC1hcHBzJyk7CiAgICAgICAgblRhYmxlKCdQZXJtaXNzaW9ucycsICdwZXJtaXNzaW9ucycpOwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZFByb3AodGJvZHksIGluZGV4LCB2YWx1ZSkgewogICAgICAgIHZhciB0ciA9IHRib2R5LmFwcGVuZCgndHInKSwKICAgICAgICAgICAgdmNscyA9IGluZGV4ID8gJ3ZhbHVlJyA6ICd2YWx1ZS1ib2xkJzsKCiAgICAgICAgZnVuY3Rpb24gYWRkQ2VsbChjbHMsIHR4dCkgewogICAgICAgICAgICB0ci5hcHBlbmQoJ3RkJykuYXR0cignY2xhc3MnLCBjbHMpLmh0bWwodHh0KTsKICAgICAgICB9CgogICAgICAgIGFkZENlbGwoJ2xhYmVsJywgZnJpZW5kbHlQcm9wc1tpbmRleF0gKyAnOicpOwogICAgICAgIGFkZENlbGwodmNscywgdmFsdWUpOwogICAgfQoKICAgIGZ1bmN0aW9uIHVybGl6ZSh1KSB7CiAgICAgICAgcmV0dXJuICc8aT5VUkw6PC9pPiA8YSBocmVmPSInICsgdSArICciIHRhcmdldD0iX2JsYW5rIj4nICsgdSArICc8L2E+JzsKICAgIH0KCiAgICBmdW5jdGlvbiBhZGRJY29uKGVsZW0sIHZhbHVlKSB7CiAgICAgICAgZWxlbS5hcHBlbmQoJ2ltZycpLmF0dHIoJ3NyYycsIGljb25VcmxQcmVmaXggKyB2YWx1ZSArIGljb25VcmxTdWZmaXgpOwogICAgfQoKICAgIGZ1bmN0aW9uIHBvcHVsYXRlVG9wKGRldGFpbHMpIHsKICAgICAgICB2YXIgcHJvcHNCb2R5ID0gdG9wLnNlbGVjdCgnLmFwcC1wcm9wcycpLmFwcGVuZCgndGJvZHknKSwKICAgICAgICAgICAgdXJsID0gZGV0YWlscy51cmw7CgogICAgICAgIGFkZEljb24odG9wLnNlbGVjdCgnLmFwcC1pY29uJyksIGRldGFpbHMuaWQpOwoKICAgICAgICBwcm9wT3JkZXIuZm9yRWFjaChmdW5jdGlvbiAocHJvcCwgaSkgewogICAgICAgICAgICBhZGRQcm9wKHByb3BzQm9keSwgaSwgZGV0YWlsc1twcm9wXSk7CiAgICAgICAgfSk7CgogICAgICAgIGlmICh1cmwpIHsKICAgICAgICAgICAgdG9wLnNlbGVjdCgnLmFwcC11cmwnKS5odG1sKHVybGl6ZSh1cmwpKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gcG9wdWxhdGVNaWRkbGUoZGV0YWlscykgewogICAgICAgIG1pZGRsZS5zZWxlY3QoJy5hcHAtcmVhZG1lJykudGV4dChkZXRhaWxzLnJlYWRtZSk7CiAgICB9CgogICAgZnVuY3Rpb24gcG9wdWxhdGVCb3R0b20oZGV0YWlscykgewoKICAgICAgICBmdW5jdGlvbiBhZGRJdGVtcyhjbHMsIGl0ZW1zKSB7CiAgICAgICAgICAgIHZhciB0YWJsZSA9IGJvdHRvbS5zZWxlY3QoJy4nICsgY2xzKS5zZWxlY3QoJ3RhYmxlJyksCiAgICAgICAgICAgICAgICB0Ym9keSA9IHRhYmxlLmFwcGVuZCgndGJvZHknKTsKCiAgICAgICAgICAgIGl0ZW1zLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgICAgIHRib2R5LmFwcGVuZCgndHInKS5hcHBlbmQoJ3RkJykuaHRtbChpdGVtKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICBhZGRJdGVtcygnZmVhdHVyZXMnLCBkZXRhaWxzLmZlYXR1cmVzKTsKICAgICAgICBhZGRJdGVtcygncmVxdWlyZWQtYXBwcycsIGRldGFpbHMucmVxdWlyZWRfYXBwcyk7CiAgICAgICAgYWRkSXRlbXMoJ3Blcm1pc3Npb25zJywgZGV0YWlscy5wZXJtaXNzaW9ucyk7CiAgICB9CgogICAgZnVuY3Rpb24gcG9wdWxhdGVEZXRhaWxzKGRldGFpbHMpIHsKICAgICAgICBzZXRVcFBhbmVsKCk7CiAgICAgICAgcG9wdWxhdGVUb3AoZGV0YWlscyk7CiAgICAgICAgcG9wdWxhdGVNaWRkbGUoZGV0YWlscyk7CiAgICAgICAgcG9wdWxhdGVCb3R0b20oZGV0YWlscyk7CiAgICAgICAgZGV0YWlsc1BhbmVsLmhlaWdodChwSGVpZ2h0KTsKICAgIH0KCiAgICBmdW5jdGlvbiByZXNwRGV0YWlsc0NiKGRhdGEpIHsKICAgICAgICAkc2NvcGUucGFuZWxEYXRhID0gZGF0YS5kZXRhaWxzOwogICAgICAgICRzY29wZS4kYXBwbHkoKTsKICAgIH0KCiAgICBhbmd1bGFyLm1vZHVsZSgnb3ZBcHAnLCBbXSkKICAgIC5jb250cm9sbGVyKCdPdkFwcEN0cmwnLAogICAgICAgIFsnJGxvZycsICckc2NvcGUnLCAnJGh0dHAnLAogICAgICAgICAnV2ViU29ja2V0U2VydmljZScsICdGblNlcnZpY2UnLCAnS2V5U2VydmljZScsICdQYW5lbFNlcnZpY2UnLAogICAgICAgICAnSWNvblNlcnZpY2UnLCAnVXJsRm5TZXJ2aWNlJywgJ0RpYWxvZ1NlcnZpY2UnLCAnVGFibGVCdWlsZGVyU2VydmljZScsCgogICAgZnVuY3Rpb24gKF8kbG9nXywgXyRzY29wZV8sICRodHRwLCBfd3NzXywgX2ZzXywgX2tzXywgX3BzXywgX2lzXywgdWZzLCBkcywgdGJzKSB7CiAgICAgICAgJGxvZyA9IF8kbG9nXzsKICAgICAgICAkc2NvcGUgPSBfJHNjb3BlXzsKICAgICAgICB3c3MgPSBfd3NzXzsKICAgICAgICBmcyA9IF9mc187CiAgICAgICAga3MgPSBfa3NfOwogICAgICAgIHBzID0gX3BzXzsKICAgICAgICBpcyA9IF9pc187CiAgICAgICAgJHNjb3BlLnBhbmVsRGF0YSA9IHt9OwogICAgICAgICRzY29wZS5jdHJsQnRuU3RhdGUgPSB7fTsKICAgICAgICAkc2NvcGUudXBsb2FkVGlwID0gJ1VwbG9hZCBhbiBhcHBsaWNhdGlvbiAoLm9hciBmaWxlKSc7CiAgICAgICAgJHNjb3BlLmFjdGl2YXRlVGlwID0gJ0FjdGl2YXRlIHNlbGVjdGVkIGFwcGxpY2F0aW9uJzsKICAgICAgICAkc2NvcGUuZGVhY3RpdmF0ZVRpcCA9ICdEZWFjdGl2YXRlIHNlbGVjdGVkIGFwcGxpY2F0aW9uJzsKICAgICAgICAkc2NvcGUudW5pbnN0YWxsVGlwID0gJ1VuaW5zdGFsbCBzZWxlY3RlZCBhcHBsaWNhdGlvbic7CgogICAgICAgIHZhciBoYW5kbGVycyA9IHt9OwoKICAgICAgICAvLyBkZXRhaWxzIHBhbmVsIGhhbmRsZXJzCiAgICAgICAgaGFuZGxlcnNbZGV0YWlsc1Jlc3BdID0gcmVzcERldGFpbHNDYjsKICAgICAgICB3c3MuYmluZEhhbmRsZXJzKGhhbmRsZXJzKTsKCiAgICAgICAgZnVuY3Rpb24gc2VsQ2IoJGV2ZW50LCByb3cpIHsKICAgICAgICAgICAgLy8gJHNjb3BlLnNlbElkIGlzIHNldCBieSBjb2RlIGluIHRhYmxlQnVpbGRlcgogICAgICAgICAgICAkc2NvcGUuY3RybEJ0blN0YXRlLnNlbGVjdGlvbiA9ICEhJHNjb3BlLnNlbElkOwogICAgICAgICAgICByZWZyZXNoQ3RybHMoKTsKICAgICAgICAgICAgZHMuY2xvc2VEaWFsb2coKTsgIC8vIGRvbid0IHdhbnQgZGlhbG9nIGZyb20gcHJldmlvdXMgc2VsZWN0aW9uCgogICAgICAgICAgICBpZiAoJHNjb3BlLnNlbElkKSB7CiAgICAgICAgICAgICAgICB3c3Muc2VuZEV2ZW50KGRldGFpbHNSZXEsIHsgaWQ6IHJvdy5pZCB9KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRzY29wZS5oaWRlUGFuZWwoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcmVmcmVzaEN0cmxzKCkgewogICAgICAgICAgICB2YXIgcm93LCByb3dJZHg7CiAgICAgICAgICAgIGlmICgkc2NvcGUuY3RybEJ0blN0YXRlLnNlbGVjdGlvbikgewogICAgICAgICAgICAgICAgcm93SWR4ID0gZnMuZmluZCgkc2NvcGUuc2VsSWQsICRzY29wZS50YWJsZURhdGEpOwogICAgICAgICAgICAgICAgcm93ID0gcm93SWR4ID49IDAgPyAkc2NvcGUudGFibGVEYXRhW3Jvd0lkeF0gOiBudWxsOwoKICAgICAgICAgICAgICAgICRzY29wZS5jdHJsQnRuU3RhdGUuaW5zdGFsbGVkID0gcm93ICYmIHJvdy5zdGF0ZSA9PT0gSU5TVEFMTEVEOwogICAgICAgICAgICAgICAgJHNjb3BlLmN0cmxCdG5TdGF0ZS5hY3RpdmUgPSByb3cgJiYgcm93LnN0YXRlID09PSBBQ1RJVkU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkc2NvcGUuY3RybEJ0blN0YXRlLmluc3RhbGxlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgJHNjb3BlLmN0cmxCdG5TdGF0ZS5hY3RpdmUgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdGJzLmJ1aWxkVGFibGUoewogICAgICAgICAgICBzY29wZTogJHNjb3BlLAogICAgICAgICAgICB0YWc6ICdhcHAnLAogICAgICAgICAgICBzZWxDYjogc2VsQ2IsCiAgICAgICAgICAgIHJlc3BDYjogcmVmcmVzaEN0cmxzLAogICAgICAgICAgICAvLyBwcmUtcG9wdWxhdGUgc29ydCBzbyBhY3RpdmUgYXBwcyBhcmUgYXQgdGhlIHRvcCBvZiB0aGUgbGlzdAogICAgICAgICAgICBzb3J0UGFyYW1zOiB7CiAgICAgICAgICAgICAgICBmaXJzdENvbDogJ3N0YXRlJywKICAgICAgICAgICAgICAgIGZpcnN0RGlyOiAnZGVzYycsCiAgICAgICAgICAgICAgICBzZWNvbmRDb2w6ICdpZCcsCiAgICAgICAgICAgICAgICBzZWNvbmREaXI6ICdhc2MnCiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgLy8gVE9ETzogcmVleGFtaW5lIHdoZXJlIGtleWJpbmRpbmdzIHNob3VsZCBiZSAtIGRpcmVjdGl2ZSBvciBjb250cm9sbGVyPwogICAgICAgIGtzLmtleUJpbmRpbmdzKHsKICAgICAgICAgICAgZXNjOiBbJHNjb3BlLnNlbGVjdENhbGxiYWNrLCAnRGVzZWxlY3QgYXBwbGljYXRpb24nXSwKICAgICAgICAgICAgX2hlbHBGb3JtYXQ6IFsnZXNjJ10KICAgICAgICB9KTsKICAgICAgICBrcy5nZXN0dXJlTm90ZXMoWwogICAgICAgICAgICBbJ2NsaWNrIHJvdycsICdTZWxlY3QgLyBkZXNlbGVjdCBhcHBsaWNhdGlvbiddLAogICAgICAgICAgICBbJ3Njcm9sbCBkb3duJywgJ1NlZSBtb3JlIGFwcGxpY2F0aW9ucyddCiAgICAgICAgXSk7CgogICAgICAgIGZ1bmN0aW9uIGNyZWF0ZUNvbmZpcm1hdGlvblRleHQoYWN0aW9uLCBpdGVtSWQpIHsKICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSBkcy5jcmVhdGVEaXYoKTsKICAgICAgICAgICAgY29udGVudC5hcHBlbmQoJ3AnKS50ZXh0KGZzLmNhcChhY3Rpb24pICsgJyAnICsgaXRlbUlkKTsKICAgICAgICAgICAgaWYgKHN0cm9uZ1dhcm5pbmdbaXRlbUlkXSkgewogICAgICAgICAgICAgICAgY29udGVudC5hcHBlbmQoJ3AnKS50ZXh0KGRpc2NvdXJhZ2VtZW50KS5jbGFzc2VkKCdzdHJvbmcnLCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gY29udGVudDsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGNvbmZpcm1BY3Rpb24oYWN0aW9uKSB7CiAgICAgICAgICAgIHZhciBpdGVtSWQgPSAkc2NvcGUuc2VsSWQsCiAgICAgICAgICAgICAgICBzcGFyID0gJHNjb3BlLnNvcnRQYXJhbXM7CgogICAgICAgICAgICBmdW5jdGlvbiBkT2soKSB7CiAgICAgICAgICAgICAgICAkbG9nLmRlYnVnKCdJbml0aWF0aW5nJywgYWN0aW9uLCAnb2YnLCBpdGVtSWQpOwogICAgICAgICAgICAgICAgd3NzLnNlbmRFdmVudChhcHBNZ210UmVxLCB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgbmFtZTogaXRlbUlkLAogICAgICAgICAgICAgICAgICAgIHNvcnRDb2w6IHNwYXIuc29ydENvbCwKICAgICAgICAgICAgICAgICAgICBzb3J0RGlyOiBzcGFyLnNvcnREaXIKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiBkQ2FuY2VsKCkgewogICAgICAgICAgICAgICAgJGxvZy5kZWJ1ZygnQ2FuY2VsaW5nJywgYWN0aW9uLCAnb2YnLCBpdGVtSWQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBkcy5vcGVuRGlhbG9nKGRpYWxvZ0lkLCBkaWFsb2dPcHRzKQogICAgICAgICAgICAgICAgLnNldFRpdGxlKCdDb25maXJtIEFjdGlvbicpCiAgICAgICAgICAgICAgICAuYWRkQ29udGVudChjcmVhdGVDb25maXJtYXRpb25UZXh0KGFjdGlvbiwgaXRlbUlkKSkKICAgICAgICAgICAgICAgIC5hZGRPayhkT2spCiAgICAgICAgICAgICAgICAuYWRkQ2FuY2VsKGRDYW5jZWwpCiAgICAgICAgICAgICAgICAuYmluZEtleXMoKTsKICAgICAgICB9CgogICAgICAgICRzY29wZS5hcHBBY3Rpb24gPSBmdW5jdGlvbiAoYWN0aW9uKSB7CiAgICAgICAgICAgIGlmICgkc2NvcGUuY3RybEJ0blN0YXRlLnNlbGVjdGlvbikgewogICAgICAgICAgICAgICAgY29uZmlybUFjdGlvbihhY3Rpb24pOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgJHNjb3BlLiRvbignRmlsZUNoYW5nZWQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOwogICAgICAgICAgICBpZiAoJHNjb3BlLmFwcEZpbGUpIHsKICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsICRzY29wZS5hcHBGaWxlKTsKICAgICAgICAgICAgICAgICRodHRwLnBvc3QodWZzLnJzVXJsKGZpbGVVcGxvYWRVcmwpLCBmb3JtRGF0YSwgewogICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybVJlcXVlc3Q6IGFuZ3VsYXIuaWRlbnRpdHksCiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogewogICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogdW5kZWZpbmVkCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAuZmluYWxseShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5zb3J0Q2FsbGJhY2soJHNjb3BlLnNvcnRQYXJhbXMpOwogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXRGaWxlRm9ybScpLnJlc2V0KCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgJHNjb3BlLiRvbignJGRlc3Ryb3knLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGtzLnVuYmluZEtleXMoKTsKICAgICAgICAgICAgd3NzLnVuYmluZEhhbmRsZXJzKGhhbmRsZXJzKTsKICAgICAgICB9KTsKCiAgICAgICAgJGxvZy5sb2coJ092QXBwQ3RybCBoYXMgYmVlbiBjcmVhdGVkJyk7CiAgICB9XSkKCiAgICAvLyB0cmlnZ2VycyB0aGUgaW5wdXQgZm9ybSB0byBhcHBlYXIgd2hlbiBidXR0b24gaXMgY2xpY2tlZAogICAgLmRpcmVjdGl2ZSgndHJpZ2dlckZvcm0nLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmVzdHJpY3Q6ICdBJywKICAgICAgICAgICAgbGluazogZnVuY3Rpb24gKHNjb3BlLCBlbGVtKSB7CiAgICAgICAgICAgICAgICBlbGVtLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGxvYWRGaWxlJykKICAgICAgICAgICAgICAgICAgICAgICAgLmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoJ2NsaWNrJykpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfSkKCiAgICAvLyBiaW5kcyB0aGUgbW9kZWwgZmlsZSB0byB0aGUgc2NvcGUgaW4gc2NvcGUuYXBwRmlsZQogICAgLy8gc2VuZHMgdXBsb2FkIHJlcXVlc3QgdG8gdGhlIHNlcnZlcgogICAgLmRpcmVjdGl2ZSgnZmlsZU1vZGVsJywgWyckcGFyc2UnLAogICAgICAgICAgICBmdW5jdGlvbiAoJHBhcnNlKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmVzdHJpY3Q6ICdBJywKICAgICAgICAgICAgbGluazogZnVuY3Rpb24gKHNjb3BlLCBlbGVtLCBhdHRycykgewogICAgICAgICAgICAgICAgdmFyIG1vZGVsID0gJHBhcnNlKGF0dHJzLmZpbGVNb2RlbCksCiAgICAgICAgICAgICAgICAgICAgbW9kZWxTZXR0ZXIgPSBtb2RlbC5hc3NpZ247CgogICAgICAgICAgICAgICAgZWxlbS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgc2NvcGUuJGFwcGx5KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxTZXR0ZXIoc2NvcGUsIGVsZW1bMF0uZmlsZXNbMF0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIHNjb3BlLiRlbWl0KCdGaWxlQ2hhbmdlZCcpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfV0pCgogICAgLmRpcmVjdGl2ZSgnYXBwbGljYXRpb25EZXRhaWxzUGFuZWwnLAogICAgICAgIFsnJHJvb3RTY29wZScsICckd2luZG93JywgJyR0aW1lb3V0JywgJ0tleVNlcnZpY2UnLAogICAgICAgIGZ1bmN0aW9uICgkcm9vdFNjb3BlLCAkd2luZG93LCAkdGltZW91dCwga3MpIHsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzY29wZSkgewogICAgICAgICAgICAgICAgdmFyIHVuYmluZFdhdGNoOwoKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGhlaWdodENhbGMoKSB7CiAgICAgICAgICAgICAgICAgICAgcFN0YXJ0WSA9IGZzLm5vUHhTdHlsZShkMy5zZWxlY3QoJy50YWJ1bGFyLWhlYWRlcicpLCAnaGVpZ2h0JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdG9wUGRnOwogICAgICAgICAgICAgICAgICAgIHdTaXplID0gZnMud2luZG93U2l6ZShwU3RhcnRZKTsKICAgICAgICAgICAgICAgICAgICBwSGVpZ2h0ID0gd1NpemUuaGVpZ2h0OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGluaXRQYW5lbCgpIHsKICAgICAgICAgICAgICAgICAgICBoZWlnaHRDYWxjKCk7CiAgICAgICAgICAgICAgICAgICAgY3JlYXRlRGV0YWlsc1BhbmUoKTsKICAgICAgICAgICAgICAgICAgICAkbG9nLmRlYnVnKCdzdGFydCB0byBpbml0aWFsaXplIHBhbmVsIScpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIFNhZmFyaSBoYXMgYSBidWcgd2hlcmUgaXQgcmVuZGVycyB0aGUgZml4ZWQtbGF5b3V0IHRhYmxlIHdyb25nCiAgICAgICAgICAgICAgICAvLyBpZiB5b3UgYXNrIGZvciB0aGUgd2luZG93J3Mgc2l6ZSB0b28gZWFybHkKICAgICAgICAgICAgICAgIGlmIChzY29wZS5vbm9zLmJyb3dzZXIgPT09ICdzYWZhcmknKSB7CiAgICAgICAgICAgICAgICAgICAgJHRpbWVvdXQoaW5pdFBhbmVsKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaW5pdFBhbmVsKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBjcmVhdGUga2V5IGJpbmRpbmdzIHRvIGhhbmRsZSBwYW5lbAogICAgICAgICAgICAgICAga3Mua2V5QmluZGluZ3MoewogICAgICAgICAgICAgICAgICAgIGVzYzogW2Nsb3NlUGFuZWwsICdDbG9zZSB0aGUgZGV0YWlscyBwYW5lbCddLAogICAgICAgICAgICAgICAgICAgIF9oZWxwRm9ybWF0OiBbJ2VzYyddCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGtzLmdlc3R1cmVOb3RlcyhbCiAgICAgICAgICAgICAgICAgICAgWydjbGljaycsICdTZWxlY3QgYSByb3cgdG8gc2hvdyBhcHBsaWNhdGlvbiBkZXRhaWxzJ10sCiAgICAgICAgICAgICAgICAgICAgWydzY3JvbGwgZG93bicsICdTZWUgbW9yZSBhcHBsaWNhdGlvbiddCiAgICAgICAgICAgICAgICBdKTsKCiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcGFuZWxEYXRhIGNoYW5nZXMKICAgICAgICAgICAgICAgIHNjb3BlLiR3YXRjaCgncGFuZWxEYXRhJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGlmICghZnMuaXNFbXB0eU9iamVjdChzY29wZS5wYW5lbERhdGEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcHVsYXRlRGV0YWlscyhzY29wZS5wYW5lbERhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzUGFuZWwuc2hvdygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB3aW5kb3cgc2l6ZSBjaGFuZ2VzCiAgICAgICAgICAgICAgICB1bmJpbmRXYXRjaCA9ICRyb290U2NvcGUuJHdhdGNoQ29sbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoOiAkd2luZG93LmlubmVySGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdzogJHdpbmRvdy5pbm5lcldpZHRoCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZzLmlzRW1wdHlPYmplY3Qoc2NvcGUucGFuZWxEYXRhKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0Q2FsYygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wdWxhdGVEZXRhaWxzKHNjb3BlLnBhbmVsRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIHNjb3BlLiRvbignJGRlc3Ryb3knLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdW5iaW5kV2F0Y2goKTsKICAgICAgICAgICAgICAgICAgICBrcy51bmJpbmRLZXlzKCk7CiAgICAgICAgICAgICAgICAgICAgcHMuZGVzdHJveVBhbmVsKHBOYW1lKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIH1dKTsKfSgpKTsKc/HvVjNqCgBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANF+yQABABksrwKgHNsCoB2CW0B/1+T4jEms7MbKAEAVul34AAAEBCAoAt8jrAGIP4XPx71bGbwoAvQQAAL0EAABo9ygf0sUIACetHhMIAEUABK9/NkAAQAYnLMCoB2DAqAc2H/WWzw6+ggSjarx9gBgDA5SIAAABAQgKAGIP4QC3yOpIVFRQLzEuMSAyMDAgT0sNCkNvbnRlbnQtVHlwZTogdGV4dC9qYXZhc2NyaXB0DQpDb250ZW50LUxlbmd0aDogMTA0Mg0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBDb21wb25lbnQgU2V0dGluZ3MgVmlldyBNb2R1bGUKICovCgooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIGFuZ3VsYXIubW9kdWxlKCdvdlNldHRpbmdzJywgW10pCiAgICAuY29udHJvbGxlcignT3ZTZXR0aW5nc0N0cmwnLAogICAgICAgIFsnJGxvZycsICckc2NvcGUnLCAnVGFibGVCdWlsZGVyU2VydmljZScsCgogICAgICAgIGZ1bmN0aW9uICgkbG9nLCAkc2NvcGUsIHRicykgewogICAgICAgICAgICB0YnMuYnVpbGRUYWJsZSh7CiAgICAgICAgICAgICAgICBzY29wZTogJHNjb3BlLAogICAgICAgICAgICAgICAgdGFnOiAnc2V0dGluZycKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAkbG9nLmxvZygnT3ZTZXR0aW5nc0N0cmwgaGFzIGJlZW4gY3JlYXRlZCcpOwogICAgICAgIH1dKTsKfSgpKTsKc/HvVpNwCgCRAgAAkQIAAAgAJ60eE2j3KB/SxQgARQACg1+zQABABkjbwKgHNsCoB2CW0B/1+T4jEms7MbKAGAWkHqcAAAEBCAoAt8jrAGIP4UdFVCAvb25vcy91aS9hcHAvdmlldy9jbHVzdGVyL2NsdXN0ZXIuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6ICovKg0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCnPx71b3eQoAlQIAAJUCAAAIACetHhNo9ygf0sUIAEUAAofEIEAAQAbkacCoBzbAqAdgls8f9aNqvH0OvoZ/gBghZvASAAABAQgKALfI7ABiD+FHRVQgL29ub3MvdWkvYXBwL3ZpZXcvcHJvY2Vzc29yL3Byb2Nlc3Nvci5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVmWICgCmCQAApgkAAGj3KB/SxQgAJ60eEwgARQAJmMyqQABABtTOwKgHYMCoBzYf9ZbRWpXYS4yXtLqAGAKtmXEAAAEBCAoAYg/iALfI50hUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2phdmFzY3JpcHQNCkNvbnRlbnQtTGVuZ3RoOiAyMjk5DQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCi8qCiAqIENvcHlyaWdodCAyMDE1LDIwMTYgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gR3JvdXAgVmlldyBNb2R1bGUKICovCgooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIGluamVjdGVkIHJlZmVyZW5jZXMKICAgIHZhciAkbG9nLCAkc2NvcGUsICRsb2NhdGlvbiwgZnMsIHRicywgbnM7CgogICAgYW5ndWxhci5tb2R1bGUoJ292R3JvdXAnLCBbXSkKICAgIC5jb250cm9sbGVyKCdPdkdyb3VwQ3RybCcsCiAgICAgICAgWyckbG9nJywgJyRzY29wZScsICckbG9jYXRpb24nLCAnJHNjZScsCiAgICAgICAgICAgICdGblNlcnZpY2UnLCAnVGFibGVCdWlsZGVyU2VydmljZScsICdOYXZTZXJ2aWNlJywKCiAgICAgICAgZnVuY3Rpb24gKF8kbG9nXywgXyRzY29wZV8sIF8kbG9jYXRpb25fLCAkc2NlLCBfZnNfLCBfdGJzXywgX25zXykgewogICAgICAgICAgICB2YXIgcGFyYW1zOwogICAgICAgICAgICAkbG9nID0gXyRsb2dfOwogICAgICAgICAgICAkc2NvcGUgPSBfJHNjb3BlXzsKICAgICAgICAgICAgJGxvY2F0aW9uID0gXyRsb2NhdGlvbl87CiAgICAgICAgICAgIGZzID0gX2ZzXzsKICAgICAgICAgICAgdGJzID0gX3Ric187CiAgICAgICAgICAgIG5zID0gX25zXzsKICAgICAgICAgICAgJHNjb3BlLmRldmljZVRpcCA9ICdTaG93IGRldmljZSB0YWJsZSc7CiAgICAgICAgICAgICRzY29wZS5mbG93VGlwID0gJ1Nob3cgZmxvdyB2aWV3IGZvciB0aGlzIGRldmljZSc7CiAgICAgICAgICAgICRzY29wZS5wb3J0VGlwID0gJ1Nob3cgcG9ydCB2aWV3IGZvciB0aGlzIGRldmljZSc7CiAgICAgICAgICAgICRzY29wZS5tZXRlclRpcCA9ICdTaG93IG1ldGVyIHZpZXcgZm9yIHNlbGVjdGVkIGRldmljZSc7CgogICAgICAgICAgICBwYXJhbXMgPSAkbG9jYXRpb24uc2VhcmNoKCk7CiAgICAgICAgICAgIGlmIChwYXJhbXMuaGFzT3duUHJvcGVydHkoJ2RldklkJykpIHsKICAgICAgICAgICAgICAgICRzY29wZS5kZXZJZCA9IHBhcmFtc1snZGV2SWQnXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGJzLmJ1aWxkVGFibGUoewogICAgICAgICAgICAgICAgc2NvcGU6ICRzY29wZSwKICAgICAgICAgICAgICAgIHRhZzogJ2dyb3VwJywKICAgICAgICAgICAgICAgIHF1ZXJ5OiBwYXJhbXMKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAkc2NvcGUuJHdhdGNoKCd0YWJsZURhdGEnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBpZiAoIWZzLmlzRW1wdHlPYmplY3QoJHNjb3BlLnRhYmxlRGF0YSkpIHsKICAgICAgICAgICAgICAgICAgICAkc2NvcGUudGFibGVEYXRhLmZvckVhY2goZnVuY3Rpb24gKGdyb3VwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwLmJ1Y2tldHMgPSAkc2NlLnRydXN0QXNIdG1sKGdyb3VwLmJ1Y2tldHMpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICRzY29wZS5uYXYgPSBmdW5jdGlvbiAocGF0aCkgewogICAgICAgICAgICAgICAgaWYgKCRzY29wZS5kZXZJZCkgewogICAgICAgICAgICAgICAgICAgIG5zLm5hdlRvKHBhdGgsIHsgZGV2SWQ6ICRzY29wZS5kZXZJZCB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICRsb2cubG9nKCdPdkdyb3VwQ3RybCBoYXMgYmVlbiBjcmVhdGVkJyk7CiAgICAgICAgfV0pOwp9KCkpOwpz8e9WnIgKAEIAAABCAAAAaPcoH9LFCAAnrR4TCABFAAA0gVhAAEAGKYXAqAdgwKgHNh/1ltShrvGXQN3cAIAQAoCQDQAAAQEICgBiD+MAt8jic/HvVpyICgBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANN2hQABABs07wKgHNsCoB2CW0R/1jJe0ulqV4a+AEAWk0usAAAEBCAoAt8jtAGIP4nPx71YSjAoAjwIAAI8CAAAIACetHhNo9ygf0sUIAEUAAoHdokAAQAbK7cCoBzbAqAdgltEf9YyXtLpaleGvgBgFpBFuAAABAQgKALfI7QBiD+JHRVQgL29ub3MvdWkvYXBwL3ZpZXcvdHVubmVsL3R1bm5lbC5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVraOCgDPBAAAzwQAAGj3KB/SxQgAJ60eEwgARQAEwYl5QABABhzXwKgHYMCoBzYf9ZbQazsxsvk+JWGAGAJzlJoAAAEBCAoAYg/jALfI60hUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2phdmFzY3JpcHQNCkNvbnRlbnQtTGVuZ3RoOiAxMDYwDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCi8qCiAqIENvcHlyaWdodCAyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIENsdXN0ZXIgVmlldyBNb2R1bGUKICovCgooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIGFuZ3VsYXIubW9kdWxlKCdvdkNsdXN0ZXInLCBbXSkKICAgICAgICAuY29udHJvbGxlcignT3ZDbHVzdGVyQ3RybCcsCiAgICAgICAgWyckbG9nJywgJyRzY29wZScsICdUYWJsZUJ1aWxkZXJTZXJ2aWNlJywKCiAgICAgICAgICAgIGZ1bmN0aW9uICgkbG9nLCAkc2NvcGUsIHRicykgewogICAgICAgICAgICAgICAgdGJzLmJ1aWxkVGFibGUoewogICAgICAgICAgICAgICAgICAgIHNjb3BlOiAkc2NvcGUsCiAgICAgICAgICAgICAgICAgICAgdGFnOiAnY2x1c3RlcicKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICRsb2cubG9nKCdPdkNsdXN0ZXJDdHJsIGhhcyBiZWVuIGNyZWF0ZWQnKTsKICAgICAgICAgICAgfV0pOwp9KCkpOwpz8e9Wi48KAM4hAADOIQAAaPcoH9LFCAAnrR4TCABFACHAgVlAAEAGB/jAqAdgwKgHNh/1ltShrvGXQN3cAIAYAoCxmQAAAQEICgBiD+MAt8jiSFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvamF2YXNjcmlwdA0KQ29udGVudC1MZW5ndGg6IDg0ODMNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gVG9wb2xvZ3kgU2VsZWN0aW9uIE1vZHVsZS4KIERlZmluZXMgYmVoYXZpb3Igd2hlbiBzZWxlY3Rpbmcgbm9kZXMuCiAqLwoKKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBpbmplY3RlZCByZWZzCiAgICB2YXIgJGxvZywgZnMsIHdzcywgdG92LCB0cHMsIHR0cywgbnM7CgogICAgLy8gYXBpIHRvIHRvcG9Gb3JjZQogICAgdmFyIGFwaTsKICAgIC8qCiAgICAgICBub2RlKCkgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHJlZiB0byBEMyBzZWxlY3Rpb24gb2Ygbm9kZXMKICAgICAgIHpvb21pbmdPclBhbm5pbmcoIGV2ICkKICAgICAgIHVwZGF0ZURldmljZUNvbG9ycyggW2Rldl0gKQogICAgICAgZGVzZWxlY3RMaW5rKCkKICAgICAqLwoKICAgIC8vIGludGVybmFsIHN0YXRlCiAgICB2YXIgaG92ZXJlZCwgICAgICAgICAgICAgICAgLy8gdGhlIG5vZGUgb3ZlciB3aGljaCB0aGUgbW91c2UgaXMgaG92ZXJpbmcKICAgICAgICBzZWxlY3Rpb25zID0ge30sICAgICAgICAvLyBjdXJyZW50bHkgc2VsZWN0ZWQgbm9kZXMgKGJ5IGlkKQogICAgICAgIHNlbGVjdE9yZGVyID0gW10sICAgICAgIC8vIHRoZSBvcmRlciBpbiB3aGljaCB3ZSBtYWRlIHNlbGVjdGlvbnMKICAgICAgICBjb25zdW1lQ2xpY2sgPSBmYWxzZTsgICAvLyB1c2VkIHRvIGNvb3JkaW5hdGUgd2l0aCBTVkcgY2xpY2sgaGFuZGxlcgoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgZnVuY3Rpb24gblNlbCgpIHsKICAgICAgICByZXR1cm4gc2VsZWN0T3JkZXIubGVuZ3RoOwogICAgfQogICAgZnVuY3Rpb24gZ2V0U2VsKGlkeCkgewogICAgICAgIHJldHVybiBzZWxlY3Rpb25zW3NlbGVjdE9yZGVyW2lkeF1dOwogICAgfQogICAgZnVuY3Rpb24gYWxsU2VsZWN0aW9uc0NsYXNzKGNscykgewogICAgICAgIGZvciAodmFyIGk9MCwgbj1uU2VsKCk7IGk8bjsgaSsrKSB7CiAgICAgICAgICAgIGlmIChnZXRTZWwoaSkub2JqLmNsYXNzICE9PSBjbHMpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIGZ1bmN0aW9uIG5vZGVNb3VzZU92ZXIobSkgewogICAgICAgIGlmICghbS5kcmFnU3RhcnRlZCkgewogICAgICAgICAgICBpZiAoaG92ZXJlZCAhPSBtKSB7CiAgICAgICAgICAgICAgICBob3ZlcmVkID0gbTsKICAgICAgICAgICAgICAgIHRvdi5ob29rcy5tb3VzZU92ZXIoewogICAgICAgICAgICAgICAgICAgIGlkOiBtLmlkLAogICAgICAgICAgICAgICAgICAgIGNsYXNzOiBtLmNsYXNzLAogICAgICAgICAgICAgICAgICAgIHR5cGU6IG0udHlwZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gbm9kZU1vdXNlT3V0KG0pIHsKICAgICAgICBpZiAoIW0uZHJhZ1N0YXJ0ZWQpIHsKICAgICAgICAgICAgaWYgKGhvdmVyZWQpIHsKICAgICAgICAgICAgICAgIGhvdmVyZWQgPSBudWxsOwogICAgICAgICAgICAgICAgdG92Lmhvb2tzLm1vdXNlT3V0KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBmdW5jdGlvbiBzZWxlY3RPYmplY3Qob2JqKSB7CiAgICAgICAgdmFyIGVsID0gdGhpcywKICAgICAgICAgICAgbm9kZUV2ID0gZWwgJiYgZWwudGFnTmFtZSA9PT0gJ2cnLAogICAgICAgICAgICBldiA9IGQzLmV2ZW50LnNvdXJjZUV2ZW50IHx8IHt9LAogICAgICAgICAgICBuOwoKICAgICAgICBpZiAoYXBpLnpvb21pbmdPclBhbm5pbmcoZXYpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmIChub2RlRXYpIHsKICAgICAgICAgICAgbiA9IGQzLnNlbGVjdChlbCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYXBpLm5vZGUoKS5lYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICBpZiAoZCA9PSBvYmopIHsKICAgICAgICAgICAgICAgICAgICBuID0gZDMuc2VsZWN0KGVsID0gdGhpcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBpZiAoIW4pIHJldHVybjsKCiAgICAgICAgaWYgKG5vZGVFdikgewogICAgICAgICAgICBjb25zdW1lQ2xpY2sgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBhcGkuZGVzZWxlY3RMaW5rKCk7CgogICAgICAgIGlmIChldi5zaGlmdEtleSAmJiBuLmNsYXNzZWQoJ3NlbGVjdGVkJykpIHsKICAgICAgICAgICAgZGVzZWxlY3RPYmplY3Qob2JqLmlkKTsKICAgICAgICAgICAgdXBkYXRlRGV0YWlsKCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICghZXYuc2hpZnRLZXkpIHsKICAgICAgICAgICAgZGVzZWxlY3RBbGwodHJ1ZSk7CiAgICAgICAgfQoKICAgICAgICBzZWxlY3Rpb25zW29iai5pZF0gPSB7IG9iajogb2JqLCBlbDogZWwgfTsKICAgICAgICBzZWxlY3RPcmRlci5wdXNoKG9iai5pZCk7CgogICAgICAgIG4uY2xhc3NlZCgnc2VsZWN0ZWQnLCB0cnVlKTsKICAgICAgICBhcGkudXBkYXRlRGV2aWNlQ29sb3JzKG9iaik7CiAgICAgICAgdXBkYXRlRGV0YWlsKCk7CiAgICB9CgogICAgZnVuY3Rpb24gZGVzZWxlY3RPYmplY3QoaWQpIHsKICAgICAgICB2YXIgb2JqID0gc2VsZWN0aW9uc1tpZF07CiAgICAgICAgaWYgKG9iaikgewogICAgICAgICAgICBkMy5zZWxlY3Qob2JqLmVsKS5jbGFzc2VkKCdzZWxlY3RlZCcsIGZhbHNlKTsKICAgICAgICAgICAgZGVsZXRlIHNlbGVjdGlvbnNbaWRdOwogICAgICAgICAgICBmcy5yZW1vdmVGcm9tQXJyYXkoaWQsIHNlbGVjdE9yZGVyKTsKICAgICAgICAgICAgYXBpLnVwZGF0ZURldmljZUNvbG9ycyhvYmoub2JqKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZGVzZWxlY3RBbGwoc2tpcFVwZGF0ZSkgewogICAgICAgIHZhciBzb21ldGhpbmcgPSAoc2VsZWN0T3JkZXIubGVuZ3RoID4gMCk7CgogICAgICAgIC8vIGRlc2VsZWN0IGFsbCBub2RlcyBpbiB0aGUgbmV0d29yay4uLgogICAgICAgIGFwaS5ub2RlKCkuY2xhc3NlZCgnc2VsZWN0ZWQnLCBmYWxzZSk7CiAgICAgICAgc2VsZWN0aW9ucyA9IHt9OwogICAgICAgIHNlbGVjdE9yZGVyID0gW107CiAgICAgICAgYXBpLnVwZGF0ZURldmljZUNvbG9ycygpOwogICAgICAgIGlmICghc2tpcFVwZGF0ZSkgewogICAgICAgICAgICB1cGRhdGVEZXRhaWwoKTsKICAgICAgICB9CgogICAgICAgIC8vIHJldHVybiB0cnVlIGlmIHNvbWV0aGluZyB3YXMgc2VsZWN0ZWQKICAgICAgICByZXR1cm4gc29tZXRoaW5nOwogICAgfQoKICAgIC8vID09PSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIGZ1bmN0aW9uIHJlcXVlc3REZXRhaWxzKGRhdGEpIHsKICAgICAgICB3c3Muc2VuZEV2ZW50KCdyZXF1ZXN0RGV0YWlscycsIHsKICAgICAgICAgICAgaWQ6IGRhdGEuaWQsCiAgICAgICAgICAgIGNsYXNzOiBkYXRhLmNsYXNzCiAgICAgICAgfSk7CiAgICB9CgogICAgLy8gPT09IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgZnVuY3Rpb24gdXBkYXRlRGV0YWlsKCkgewogICAgICAgIHZhciBuU2VsID0gc2VsZWN0T3JkZXIubGVuZ3RoOwogICAgICAgIGlmICghblNlbCkgewogICAgICAgICAgICBlbXB0eVNlbGVjdCgpOwogICAgICAgIH0gZWxzZSBpZiAoblNlbCA9PT0gMSkgewogICAgICAgICAgICBzaW5nbGVTZWxlY3QoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBtdWx0aVNlbGVjdCgpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBlbXB0eVNlbGVjdCgpIHsKICAgICAgICB0b3YuaG9va3MuZW1wdHlTZWxlY3QoKTsKICAgICAgICB0cHMuZGlzcGxheU5vdGhpbmcoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzaW5nbGVTZWxlY3QoKSB7CiAgICAgICAgdmFyIGRhdGEgPSBnZXRTZWwoMCkub2JqOwogICAgICAgIHJlcXVlc3REZXRhaWxzKGRhdGEpOwogICAgICAgIC8vIE5PVEU6IGRldGFpbCBwYW5lbCBpcyBzaG93biBhcyBhIHJlc3BvbnNlIHRvIHJlY2VpdmluZwogICAgICAgIC8vICAgICAgIGEgJ3Nob3dEZXRhaWxzJyBldmVudCBmcm9tIHRoZSBzZXJ2ZXIuIFNlZSAnc2hvd0RldGFpbHMnCiAgICAgICAgLy8gICAgICAgY2FsbGJhY2sgZnVuY3Rpb24gYmVsb3cuLi4KICAgIH0KCiAgICBmdW5jdGlvbiBtdWx0aVNlbGVjdCgpIHsKICAgICAgICAvLyBkaXNwbGF5IHRoZSBzZWxlY3RlZCBub2RlcyBpbiB0aGUgZGV0YWlsIHBhbmVsCiAgICAgICAgdHBzLmRpc3BsYXlNdWx0aShzZWxlY3RPcmRlcik7CiAgICAgICAgYWRkSG9zdFNlbGVjdGlvbkFjdGlvbnMoKTsKICAgICAgICB0b3YuaG9va3MubXVsdGlTZWxlY3Qoc2VsZWN0T3JkZXIpOwogICAgICAgIHRwcy5kaXNwbGF5U29tZXRoaW5nKCk7CiAgICB9CgogICAgZnVuY3Rpb24gYWRkSG9zdFNlbGVjdGlvbkFjdGlvbnMoKSB7CiAgICAgICAgaWYgKGFsbFNlbGVjdGlvbnNDbGFzcygnaG9zdCcpKSB7CiAgICAgICAgICAgIGlmIChuU2VsKCkgPT09IDIpIHsKICAgICAgICAgICAgICAgIHRwcy5hZGRBY3Rpb24oewogICAgICAgICAgICAgICAgICAgIGlkOiAnaG9zdC1mbG93LWJ0bicsCiAgICAgICAgICAgICAgICAgICAgZ2lkOiAnZW5kc3RhdGlvbicsCiAgICAgICAgICAgICAgICAgICAgY2I6IHR0cy5hZGRIb3N0SW50ZW50LAogICAgICAgICAgICAgICAgICAgIHR0OiAnQ3JlYXRlIEhvc3QtdG8tSG9zdCBGbG93JwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoblNlbCgpID49IDIpIHsKICAgICAgICAgICAgICAgIHRwcy5hZGRBY3Rpb24oewogICAgICAgICAgICAgICAgICAgIGlkOiAnbXVsdC1zcmMtZmxvdy1idG4nLAogICAgICAgICAgICAgICAgICAgIGdpZDogJ2Zsb3dzJywKICAgICAgICAgICAgICAgICAgICBjYjogdHRzLmFkZE11bHRpU291cmNlSW50ZW50LAogICAgICAgICAgICAgICAgICAgIHR0OiAnQ3JlYXRlIE11bHRpLVNvdXJjZSBGbG93JwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgoKICAgIC8vID09PSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gIEV2ZW50IEhhbmRsZXJzCgogICAgLy8gZGlzcGxheSB0aGUgZGF0YSBmb3IgdGhlIHNpbmdsZSBzZWxlY3RlZCBub2RlCiAgICBmdW5jdGlvbiBzaG93RGV0YWlscyhkYXRhKSB7CiAgICAgICAgdmFyIGJ1dHRvbnMgPSBmcy5pc0EoZGF0YS5idXR0b25zKSB8fCBbXTsKICAgICAgICB0cHMuZGlzcGxheVNpbmdsZShkYXRhKTsKICAgICAgICB0b3YuaW5zdGFsbEJ1dHRvbnMoYnV0dG9ucywgZGF0YSwgZGF0YS5wcm9wc1snVVJJJ10pOwogICAgICAgIHRvdi5ob29rcy5zaW5nbGVTZWxlY3QoZGF0YSk7CiAgICAgICAgdHBzLmRpc3BsYXlTb21ldGhpbmcoKTsKICAgIH0KCiAgICAvLyByZXR1cm5zIHRydWUgaWYgb25lIG9yIG1vcmUgbm9kZXMgYXJlIHNlbGVjdGVkLgogICAgZnVuY3Rpb24gc29tZXRoaW5nU2VsZWN0ZWQoKSB7CiAgICAgICAgcmV0dXJuIG5TZWwoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjbGlja0NvbnN1bWVkKHgpIHsKICAgICAgICB2YXIgY2MgPSBjb25zdW1lQ2xpY2s7CiAgICAgICAgY29uc3VtZUNsaWNrID0gISF4OwogICAgICAgIHJldHVybiBjYzsKICAgIH0KCiAgICAvLyByZXR1cm5zIGEgc2VsZWN0aW9uIGNvbnRleHQsIHByb3ZpZGluZyBpbmZvIGFib3V0IHdoYXQgaXMgc2VsZWN0ZWQKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbkNvbnRleHQoKSB7CiAgICAgICAgdmFyIGRldmljZXMgPSBbXSwKICAgICAgICAgICAgaG9zdHMgPSBbXSwKICAgICAgICAgICAgdHlwZXMgPSB7fTsKCiAgICAgICAgYW5ndWxhci5mb3JFYWNoKHNlbGVjdGlvbnMsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIHZhciBvID0gZC5vYmosCiAgICAgICAgICAgICAgICBjID0gby5jbGFzczsKCiAgICAgICAgICAgIGlmIChjID09PSAnZGV2aWNlJykgewogICAgICAgICAgICAgICAgZGV2aWNlcy5wdXNoKG8uaWQpOwogICAgICAgICAgICAgICAgdHlwZXNbby5pZF0gPSBvLnR5cGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGMgPT09ICdob3N0JykgewogICAgICAgICAgICAgICAgaG9zdHMucHVzaChvLmlkKTsKICAgICAgICAgICAgICAgIHR5cGVzW28uaWRdID0gby50eXBlOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGRldmljZXM6IGRldmljZXMsCiAgICAgICAgICAgIGhvc3RzOiBob3N0cywKICAgICAgICAgICAgdHlwZXM6IHR5cGVzCiAgICAgICAgfTsKICAgIH0KCiAgICAvLyA9PT0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vID09PSBNT0RVTEUgREVGSU5JVElPTiA9PT0KCiAgICBhbmd1bGFyLm1vZHVsZSgnb3ZUb3BvJykKICAgIC5mYWN0b3J5KCdUb3BvU2VsZWN0U2VydmljZScsCiAgICAgICAgWyckbG9nJywgJ0ZuU2VydmljZScsICdXZWJTb2NrZXRTZXJ2aWNlJywgJ1RvcG9PdmVybGF5U2VydmljZScsCiAgICAgICAgICAgICdUb3BvUGFuZWxTZXJ2aWNlJywgJ1RvcG9UcmFmZmljU2VydmljZScsICdOYXZTZXJ2aWNlJywKCiAgICAgICAgZnVuY3Rpb24gKF8kbG9nXywgX2ZzXywgX3dzc18sIF90b3ZfLCBfdHBzXywgX3R0c18sIF9uc18pIHsKICAgICAgICAgICAgJGxvZyA9IF8kbG9nXzsKICAgICAgICAgICAgZnMgPSBfZnNfOwogICAgICAgICAgICB3c3MgPSBfd3NzXzsKICAgICAgICAgICAgdG92ID0gX3Rvdl87CiAgICAgICAgICAgIHRwcyA9IF90cHNfOwogICAgICAgICAgICB0dHMgPSBfdHRzXzsKICAgICAgICAgICAgbnMgPSBfbnNfOwoKICAgICAgICAgICAgZnVuY3Rpb24gaW5pdFNlbGVjdChfYXBpXykgewogICAgICAgICAgICAgICAgYXBpID0gX2FwaV87CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZ1bmN0aW9uIGRlc3Ryb3lTZWxlY3QoKSB7IH0KCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBpbml0U2VsZWN0OiBpbml0U2VsZWN0LAogICAgICAgICAgICAgICAgZGVzdHJveVNlbGVjdDogZGVzdHJveVNlbGVjdCwKCiAgICAgICAgICAgICAgICBzaG93RGV0YWlsczogc2hvd0RldGFpbHMsCgogICAgICAgICAgICAgICAgbm9kZU1vdXNlT3Zlcjogbm9kZU1vdXNlT3ZlciwKICAgICAgICAgICAgICAgIG5vZGVNb3VzZU91dDogbm9kZU1vdXNlT3V0LAogICAgICAgICAgICAgICAgc2VsZWN0T2JqZWN0OiBzZWxlY3RPYmplY3QsCiAgICAgICAgICAgICAgICBkZXNlbGVjdE9iamVjdDogZGVzZWxlY3RPYmplY3QsCiAgICAgICAgICAgICAgICBkZXNlbGVjdEFsbDogZGVzZWxlY3RBbGwsCiAgICAgICAgICAgICAgICB1cGRhdGVEZXRhaWw6IHVwZGF0ZURldGFpbCwKCiAgICAgICAgICAgICAgICBob3ZlcmVkOiBmdW5jdGlvbiAoKSB7IHJldHVybiBob3ZlcmVkOyB9LAogICAgICAgICAgICAgICAgc2VsZWN0T3JkZXI6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNlbGVjdE9yZGVyOyB9LAogICAgICAgICAgICAgICAgc29tZXRoaW5nU2VsZWN0ZWQ6IHNvbWV0aGluZ1NlbGVjdGVkLAoKICAgICAgICAgICAgICAgIGNsaWNrQ29uc3VtZWQ6IGNsaWNrQ29uc3VtZWQsCiAgICAgICAgICAgICAgICBzZWxlY3Rpb25Db250ZXh0OiBzZWxlY3Rpb25Db250ZXh0CiAgICAgICAgICAgIH07CiAgICAgICAgfV0pOwp9KCkpOwpz8e9WvJAKAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA04lRAAEAGyIjAqAc2wKgHYJbUH/VA3dwAoa8TI4AQB4p86AAAAQEICgC3yO0AYg/jc/HvVpuTCgCgBAAAoAQAAGj3KB/SxQgAJ60eEwgARQAEkij0QABABn2LwKgHYMCoBzYf9ZbSU1HpHjSHbEmAGALblGsAAAEBCAoAYg/kALfI6UhUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2phdmFzY3JpcHQNCkNvbnRlbnQtTGVuZ3RoOiAxMDEzDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCi8qCiAqIENvcHlyaWdodCAyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIEhvc3QgVmlldyBNb2R1bGUKICovCgooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIGFuZ3VsYXIubW9kdWxlKCdvdkhvc3QnLCBbXSkKICAgIC5jb250cm9sbGVyKCdPdkhvc3RDdHJsJywKICAgICAgICBbJyRsb2cnLCAnJHNjb3BlJywgJ1RhYmxlQnVpbGRlclNlcnZpY2UnLAoKICAgICAgICBmdW5jdGlvbiAoJGxvZywgJHNjb3BlLCB0YnMpIHsKICAgICAgICAgICAgdGJzLmJ1aWxkVGFibGUoewogICAgICAgICAgICAgICAgc2NvcGU6ICRzY29wZSwKICAgICAgICAgICAgICAgIHRhZzogJ2hvc3QnCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgJGxvZy5sb2coJ092SG9zdEN0cmwgaGFzIGJlZW4gY3JlYXRlZCcpOwogICAgICAgIH1dKTsKfSgpKTsKc/HvVimZCgCgBwAAoAcAAGj3KB/SxQgAJ60eEwgARQAHkivjQABABnecwKgHYMCoBzYf9ZbTcoMHUWEcXk6AGAJ2l2sAAAEBCAoAYg/kALfI6khUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2phdmFzY3JpcHQNCkNvbnRlbnQtTGVuZ3RoOiAxNzgxDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCi8qCiAqIENvcHlyaWdodCAyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIEludGVudCBWaWV3IE1vZHVsZQogKi8KCihmdW5jdGlvbiAoKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgYW5ndWxhci5tb2R1bGUoJ292SW50ZW50JywgW10pCiAgICAgICAgLmNvbnRyb2xsZXIoJ092SW50ZW50Q3RybCcsCiAgICAgICAgWyckbG9nJywgJyRzY29wZScsICdUYWJsZUJ1aWxkZXJTZXJ2aWNlJywgJ05hdlNlcnZpY2UnLAoKICAgICAgICBmdW5jdGlvbiAoJGxvZywgJHNjb3BlLCB0YnMsIG5zKSB7CgogICAgICAgICAgICBmdW5jdGlvbiBzZWxDYigkZXZlbnQsIHJvdykgewogICAgICAgICAgICAgICAgJGxvZy5kZWJ1ZygnR290IGEgY2xpY2sgb246Jywgcm93KTsKICAgICAgICAgICAgICAgIHZhciBtID0gLyhcZCspXHM6XHMoLiopLy5leGVjKHJvdy5hcHBJZCksCiAgICAgICAgICAgICAgICAgICAgaWQgPSBtID8gbVsxXSA6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG0gPyBtWzJdIDogbnVsbDsKCiAgICAgICAgICAgICAgICAkc2NvcGUuaW50ZW50RGF0YSA9ICgkc2NvcGUuc2VsSWQgJiYgbSkgPyB7CiAgICAgICAgICAgICAgICAgICAgaW50ZW50QXBwSWQ6IGlkLAogICAgICAgICAgICAgICAgICAgIGludGVudEFwcE5hbWU6IG5hbWUsCiAgICAgICAgICAgICAgICAgICAgaW50ZW50S2V5OiByb3cua2V5CiAgICAgICAgICAgICAgICB9IDogbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGJzLmJ1aWxkVGFibGUoewogICAgICAgICAgICAgICAgc2NvcGU6ICRzY29wZSwKICAgICAgICAgICAgICAgIHRhZzogJ2ludGVudCcsCiAgICAgICAgICAgICAgICBzZWxDYjogc2VsQ2IsCiAgICAgICAgICAgICAgICBpZEtleTogJ2tleScKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAkc2NvcGUudG9wb1RpcCA9ICdTaG93IHNlbGVjdGVkIGludGVudCBvbiB0b3BvbG9neSB2aWV3JzsKCiAgICAgICAgICAgICRzY29wZS5zaG93SW50ZW50ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGQgPSAkc2NvcGUuaW50ZW50RGF0YTsKICAgICAgICAgICAgICAgIGQgJiYgbnMubmF2VG8oJ3RvcG8nLCBkKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICRsb2cubG9nKCdPdkludGVudEN0cmwgaGFzIGJlZW4gY3JlYXRlZCcpOwogICAgICAgIH1dKTsKfSgpKTsKc/HvVr6aCgBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANGSaQABABkZDwKgHNsCoB2CW0x/1YRxeTnKDDq+AEAWkD+EAAAEBCAoAt8juAGIP5HPx71ZvrQoABAYAAAQGAABo9ygf0sUIACetHhMIAEUABfbMrEAAQAbYbsCoB2DAqAc2H/WW0VqV4a+Ml7cHgBgCuJXPAAABAQgKAGIP5QC3yO1IVFRQLzEuMSAyMDAgT0sNCkNvbnRlbnQtVHlwZTogdGV4dC9qYXZhc2NyaXB0DQpDb250ZW50LUxlbmd0aDogMTM2OQ0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBIb3N0IFZpZXcgTW9kdWxlCiAqLwoKKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICBhbmd1bGFyLm1vZHVsZSgnb3ZUdW5uZWwnLCBbXSkKICAgIC5jb250cm9sbGVyKCdPdlR1bm5lbEN0cmwnLAogICAgICAgIFsnJGxvZycsICckc2NvcGUnLCAnJHNjZScsICdGblNlcnZpY2UnLCAnVGFibGVCdWlsZGVyU2VydmljZScsCgogICAgICAgIGZ1bmN0aW9uICgkbG9nLCAkc2NvcGUsICRzY2UsIGZzLCB0YnMpIHsKICAgICAgICAgICAgdGJzLmJ1aWxkVGFibGUoewogICAgICAgICAgICAgICAgc2NvcGU6ICRzY29wZSwKICAgICAgICAgICAgICAgIHRhZzogJ3R1bm5lbCcKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAkc2NvcGUuJHdhdGNoKCd0YWJsZURhdGEnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBpZiAoIWZzLmlzRW1wdHlPYmplY3QoJHNjb3BlLnRhYmxlRGF0YSkpIHsKICAgICAgICAgICAgICAgICAgICAkc2NvcGUudGFibGVEYXRhLmZvckVhY2goZnVuY3Rpb24gKHR1bm5lbCkgewogICAgICAgICAgICAgICAgICAgICAgICAvL3R1bm5lbC5kaXJlY3Rpb24gPSAkc2NlLnRydXN0QXNIdG1sKHR1bm5lbC5kaXJlY3Rpb24pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICRsb2cubG9nKCdPdlR1bm5lbEN0cmwgaGFzIGJlZW4gY3JlYXRlZCcpOwogICAgICAgIH1dKTsKfSgpKTsKc/HvVsitCgBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANN2jQABABs05wKgHNsCoB2CW0R/1jJe3B1qV53GAEAWkytcAAAEBCAoAt8jvAGIP5XPx71YNtAoAMgcAADIHAABo9ygf0sUIACetHhMIAEUAByR/N0AAQAYktsCoB2DAqAc2H/WWzw6+hn+jar7QgBgDE5b9AAABAQgKAGIP5QC3yOxIVFRQLzEuMSAyMDAgT0sNCkNvbnRlbnQtVHlwZTogdGV4dC9qYXZhc2NyaXB0DQpDb250ZW50LUxlbmd0aDogMTY3MQ0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBQYWNrZXQgUHJvY2Vzc29yIFZpZXcgTW9kdWxlCiAqLwoKKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBpbmplY3RlZCByZWZlcmVuY2VzCiAgICB2YXIgJGxvZywgJHNjb3BlLCAkbG9jYXRpb24sIGZzLCB0YnMsIG5zOwoKICAgIGFuZ3VsYXIubW9kdWxlKCdvdlByb2Nlc3NvcicsIFtdKQogICAgLmNvbnRyb2xsZXIoJ092UHJvY2Vzc29yQ3RybCcsCiAgICAgICAgWyckbG9nJywgJyRzY29wZScsICckbG9jYXRpb24nLAogICAgICAgICAgICAnRm5TZXJ2aWNlJywgJ1RhYmxlQnVpbGRlclNlcnZpY2UnLCAnTmF2U2VydmljZScsCgogICAgICAgIGZ1bmN0aW9uIChfJGxvZ18sIF8kc2NvcGVfLCBfJGxvY2F0aW9uXywgX2ZzXywgX3Ric18sIF9uc18pIHsKICAgICAgICAgICAgdmFyIHBhcmFtczsKICAgICAgICAgICAgJGxvZyA9IF8kbG9nXzsKICAgICAgICAgICAgJHNjb3BlID0gXyRzY29wZV87CiAgICAgICAgICAgICRsb2NhdGlvbiA9IF8kbG9jYXRpb25fOwogICAgICAgICAgICBmcyA9IF9mc187CiAgICAgICAgICAgIHRicyA9IF90YnNfOwogICAgICAgICAgICBucyA9IF9uc187CiAgICAgICAgICAgICRzY29wZS5yZXF1ZXN0VGlwID0gJ1Nob3cgcGFja2V0IHJlcXVlc3RzJzsKCiAgICAgICAgICAgIHBhcmFtcyA9ICRsb2NhdGlvbi5zZWFyY2goKTsKCiAgICAgICAgICAgIHRicy5idWlsZFRhYmxlKHsKICAgICAgICAgICAgICAgIHNjb3BlOiAkc2NvcGUsCiAgICAgICAgICAgICAgICB0YWc6ICdwcm9jZXNzb3InLAogICAgICAgICAgICAgICAgcXVlcnk6IHBhcmFtcwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICRzY29wZS5uYXYgPSBmdW5jdGlvbiAocGF0aCkgewogICAgICAgICAgICAgICAgaWYgKCRzY29wZS5kZXZJZCkgewogICAgICAgICAgICAgICAgICAgIG5zLm5hdlRvKHBhdGgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgJGxvZy5sb2coJ092UHJvY2Vzc29yQ3RybCBoYXMgYmVlbiBjcmVhdGVkJyk7CiAgICAgICAgfV0pOwp9KCkpOwpz8e9WZrQKAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0xCFAAEAG5rvAqAc2wKgHYJbPH/Wjar7QDr6Nb4AQIWY2VQAAAQEICgC3yO8AYg/lc/HvVuQkCwBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANF+0QABABkspwKgHNsCoB2CW0B/1+T4lYWs7Nj+AEAWkkF4AAAEBCAoAt8j3AGIP43Px71YfJQsAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADRruUAAQAY/JMCoBzbAqAdgltIf9TSHbElTUe18gBAPM2VIAAABAQgKALfI9wBiD+Rz8e9Wr7ELAOkCAADpAgAACAAnrR4TaPcoH9LFCABFAALbxCJAAEAG5BPAqAc2wKgHYJbPH/Wjar7QDr6Nb4AYIWYrEwAAAQEICgC3yP8AYg/lR0VUIC9vbm9zL3VpL2RhdGEvaW1nL2xvYWRpbmcvbGlnaHQvbG9hZC0wMS5wbmcgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogaW1hZ2Uvd2VicCxpbWFnZS8qLCovKjtxPTAuOA0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCnPx71YGsgsA6AIAAOgCAAAIACetHhNo9ygf0sUIAEUAAtrdpEAAQAbKksCoBzbAqAdgltEf9YyXtwdaledxgBgFpLEbAAABAQgKALfI/wBiD+VHRVQgL29ub3MvdWkvZGF0YS9pbWcvbG9hZGluZy9kYXJrL2xvYWQtMDEucG5nIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6IGltYWdlL3dlYnAsaW1hZ2UvKiwqLyo7cT0wLjgNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9WIbILAOkCAADpAgAACAAnrR4TaPcoH9LFCABFAALbZJtAAEAGQ5vAqAc2wKgHYJbTH/VhHF5OcoMOr4AYBaQDnQAAAQEICgC3yQAAYg/kR0VUIC9vbm9zL3VpL2RhdGEvaW1nL2xvYWRpbmcvbGlnaHQvbG9hZC0wMi5wbmcgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogaW1hZ2Uvd2VicCxpbWFnZS8qLCovKjtxPTAuOA0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCnPx71Y4sgsA6AIAAOgCAAAIACetHhNo9ygf0sUIAEUAAtprukAAQAY8fcCoBzbAqAdgltIf9TSHbElTUe18gBgPM0uSAAABAQgKALfJAABiD+RHRVQgL29ub3MvdWkvZGF0YS9pbWcvbG9hZGluZy9kYXJrL2xvYWQtMDIucG5nIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6IGltYWdlL3dlYnAsaW1hZ2UvKiwqLyo7cT0wLjgNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9WWLILAOkCAADpAgAACAAnrR4TaPcoH9LFCABFAALb4lVAAEAGxeDAqAc2wKgHYJbUH/VA3dwAoa8TI4AYB6BvjQAAAQEICgC3yQAAYg/jR0VUIC9vbm9zL3VpL2RhdGEvaW1nL2xvYWRpbmcvbGlnaHQvbG9hZC0wMy5wbmcgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogaW1hZ2Uvd2VicCxpbWFnZS8qLCovKjtxPTAuOA0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCnPx71Z2sgsAQgAAAEIAAABo9ygf0sUIACetHhMIAEUAADSBX0AAQAYpfsCoB2DAqAc2H/WW1KGvEyNA3d6ngBACi5ANAAABAQgKAGIP9gC3yQBz8e9Wr7ILAOgCAADoAgAACAAnrR4TaPcoH9LFCABFAALaX7VAAEAGSILAqAc2wKgHYJbQH/X5PiVhazs2P4AYBaR2pwAAAQEICgC3yQAAYg/jR0VUIC9vbm9zL3VpL2RhdGEvaW1nL2xvYWRpbmcvZGFyay9sb2FkLTAzLnBuZyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiBpbWFnZS93ZWJwLGltYWdlLyosKi8qO3E9MC44DQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVtG1CwCAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAcn85QABABitmwKgHYMCoBzYf9ZbPDr6Nb6NqwXeAGAMjkEsAAAEBCAoAYg/2ALfI/0hUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0Kc/HvVj24CwCAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAcsyuQABABt3wwKgHYMCoBzYf9ZbRWpXncYyXua2AGALCkEsAAAEBCAoAYg/2ALfI/0hUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0Kc/HvVl+6CwCAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAcivlQABABn66wKgHYMCoBzYf9ZbTcoMOr2EcYPWAGAKBkEsAAAEBCAoAYg/2ALfJAEhUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0Kc/HvVm/LCwDpAgAA6QIAAAgAJ60eE2j3KB/SxQgARQAC22ScQABABkOawKgHNsCoB2CW0x/1YRxg9XKDDu2AGAWk/qQAAAEBCAoAt8kBAGIP9kdFVCAvb25vcy91aS9kYXRhL2ltZy9sb2FkaW5nL2xpZ2h0L2xvYWQtMDQucG5nIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6IGltYWdlL3dlYnAsaW1hZ2UvKiwqLyo7cT0wLjgNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9WlcsLAOgCAADoAgAACAAnrR4TaPcoH9LFCABFAALa3aVAAEAGypHAqAc2wKgHYJbRH/WMl7mtWpXnr4AYBaSuIQAAAQEICgC3yQEAYg/2R0VUIC9vbm9zL3VpL2RhdGEvaW1nL2xvYWRpbmcvZGFyay9sb2FkLTA0LnBuZyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiBpbWFnZS93ZWJwLGltYWdlLyosKi8qO3E9MC44DQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVrzLCwDpAgAA6QIAAAgAJ60eE2j3KB/SxQgARQAC28QjQABABuQSwKgHNsCoB2CWzx/1o2rBdw6+ja2AGCFmJBsAAAEBCAoAt8kBAGIP9kdFVCAvb25vcy91aS9kYXRhL2ltZy9sb2FkaW5nL2xpZ2h0L2xvYWQtMDUucG5nIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6IGltYWdlL3dlYnAsaW1hZ2UvKiwqLyo7cT0wLjgNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9WTtYLAIAAAACAAAAAaPcoH9LFCAAnrR4TCABFAAByiXpAAEAGISXAqAdgwKgHNh/1ltBrOzY/+T4oB4AYAn6QSwAAAQEICgBiD/gAt8kASFRUUC8xLjEgMzA0IE5vdCBNb2RpZmllZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQpz8e9W7dYLAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0X7ZAAEAGSyfAqAc2wKgHYJbQH/X5PigHazs2fYAQBaSNWgAAAQEICgC3yQIAYg/4c/HvVn/dCwCAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAcoFgQABABik/wKgHYMCoBzYf9ZbUoa8TI0Dd3qeAGAKLkEsAAAEBCAoAYg/4ALfJAEhUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0Kc/HvVgLmCwCAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAcn86QABABitlwKgHYMCoBzYf9ZbPDr6NraNqxB6AGAMtkEsAAAEBCAoAYg/5ALfJAUhUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0Kc/HvVknmCwDoAgAA6AIAAAgAJ60eE2j3KB/SxQgARQAC2uJWQABABsXgwKgHNsCoB2CW1B/1QN3ep6GvE2GAGAegYBIAAAEBCAoAt8kDAGIP+EdFVCAvb25vcy91aS9kYXRhL2ltZy9sb2FkaW5nL2RhcmsvbG9hZC0wNS5wbmcgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogaW1hZ2Uvd2VicCxpbWFnZS8qLCovKjtxPTAuOA0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29m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eDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCnPx71aD/wsA6AIAAOgCAAAIACetHhNo9ygf0sUIAEUAAtrdpkAAQAbKkMCoBzbAqAdgltEf9YyXvFNaleftgBgFpKszAAABAQgKALfJBQBiD/lHRVQgL29ub3MvdWkvZGF0YS9pbWcvbG9hZGluZy9kYXJrL2xvYWQtMDcucG5nIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6IGltYWdlL3dlYnAsaW1hZ2UvKiwqLyo7cT0wLjgNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45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BsqOwKgHNsCoB2CW0R/1jJe++VqV6CuAGAWkrswAAAEBCAoAt8kGAGIP+0dFVCAvb25vcy91aS9kYXRhL2ltZy9sb2FkaW5nL2xpZ2h0L2xvYWQtMDkucG5nIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6IGltYWdlL3dlYnAsaW1hZ2UvKiwqLyo7cT0wLjgNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9WcRwMAOgCAADoAgAACAAnrR4TaPcoH9LFCABFAALaZJ5AAEAGQ5nAqAc2wKgHYJbTH/VhHGZDcoMPaYAYBaTtTQAAAQEICgC3yQYAYg/8R0VUIC9vbm9zL3VpL2RhdGEvaW1nL2xvYWRpbmcvZGFyay9sb2FkLTA5LnBuZyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiBpbWFnZS93ZWJwLGltYWdlLyosKi8qO3E9MC44DQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVnIdDAArAwAAKwMAAAgAJ60eE2j3KB/SxQgARQADHWcWQABABkDewKgHNsCoB2CW2h/1lxiuE0AdJqWAGADlZQ0AAAEBCAoAt8kHAGIP/EdFVCAvb25vcy91aS93ZWJzb2NrL2NvcmUgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBVcGdyYWRlDQpQcmFnbWE6IG5vLWNhY2hlDQpDYWNoZS1Db250cm9sOiBuby1jYWNoZQ0KVXBncmFkZTogd2Vic29ja2V0DQpPcmlnaW46IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MQ0KU2VjLVdlYlNvY2tldC1WZXJzaW9uOiAxMw0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQpTZWMtV2ViU29ja2V0LUtleTogUDNNVHJ3T1lRZlQzM0IxVGhDRG1iQT09DQpTZWMtV2ViU29ja2V0LUV4dGVuc2lvbnM6IHBlcm1lc3NhZ2UtZGVmbGF0ZTsgY2xpZW50X21heF93aW5kb3dfYml0cw0KDQpz8e9Whh0MAEIAAABCAAAAaPcoH9LFCAAnrR4TCABFAAA0KVlAAEAGgYTAqAdgwKgHNh/1ltpAHSallxiw/IAQAO6QDQAAAQEICgBiD/0At8kHc/HvVlIeDADpAgAA6QIAAAgAJ60eE2j3KB/SxQgARQAC28QmQABABuQPwKgHNsCoB2CWzx/1o2rJbA6+jmeAGCFmIGAAAAEBCAoAt8kHAGIP+0dFVCAvb25vcy91aS9kYXRhL2ltZy9sb2FkaW5nL2xpZ2h0L2xvYWQtMTAucG5nIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6IGltYWdlL3dlYnAsaW1hZ2UvKiwqLyo7cT0wLjgNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9WrB4MAOgCAADoAgAACAAnrR4TaPcoH9LFCABFAALaa71AAEAGPHrAqAc2wKgHYJbSH/U0h3GVU1Ht+IAYDzNErwAAAQEICgC3yQcAYg/6R0VUIC9vbm9zL3VpL2RhdGEvaW1nL2xvYWRpbmcvZGFyay9sb2FkLTEwLnBuZyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiBpbWFnZS93ZWJwLGltYWdlLyosKi8qO3E9MC44DQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVhYgDACAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAcsyxQABABt3twKgHYMCoBzYf9ZbRWpXoK4yXwaCAGALikEsAAAEBCAoAYg/9ALfJBkhUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0Kc/HvVmIiDACAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAcij3QABABoGowKgHYMCoBzYf9ZbSU1Ht+DSHdDuAGAL7kEsAAAEBCAoAYg/9ALfJB0hUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0Kc/HvVlgkDACAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAcn89QABABitiwKgHYMCoBzYf9ZbPDr6OZ6NqzBOAGANNkEsAAAEBCAoAYg/9ALfJB0hUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0Kc/HvVjYpDACAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAcivoQABABn63wKgHYMCoBzYf9ZbTcoMPaWEcaOmAGAKhkEsAAAEBCAoAYg/9ALfJBkhUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0Kc/HvVuQrDADpAgAA6QIAAAgAJ60eE2j3KB/SxQgARQAC21+3QABABkh/wKgHNsCoB2CW0B/1+T4oB2s7Nn2AGAWkgiIAAAEBCAoAt8kHAGIP+EdFVCAvb25vcy91aS9kYXRhL2ltZy9sb2FkaW5nL2xpZ2h0L2xvYWQtMTEucG5nIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6IGltYWdlL3dlYnAsaW1hZ2UvKiwqLyo7cT0wLjgNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9WUi0MAIAAAACAAAAAaPcoH9LFCAAnrR4TCABFAABygWJAAEAGKT3AqAdgwKgHNh/1ltShrxOfQN3j84AYAqCQSwAAAQEICgBiD/4At8kGSFRUUC8xLjEgMzA0IE5vdCBNb2RpZmllZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQpz8e9WnTUMAIAAAACAAAAAaPcoH9LFCAAnrR4TCABFAAByiXtAAEAGISTAqAdgwKgHNh/1ltBrOzZ9+T4qroAYAoiQSwAAAQEICgBiD/4At8kHSFRUUC8xLjEgMzA0IE5vdCBNb2RpZmllZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQpz8e9W4TUMAMMAAADDAAAAaPcoH9LFCAAnrR4TCABFAAC1KVpAAEAGgQLAqAdgwKgHNh/1ltpAHSallxiw/IAYAO6QjgAAAQEICgBiD/4At8kHSFRUUC8xLjEgMTAxIFN3aXRjaGluZyBQcm90b2NvbHMNClVwZ3JhZGU6IFdlYlNvY2tldA0KQ29ubmVjdGlvbjogVXBncmFkZQ0KU2VjLVdlYlNvY2tldC1BY2NlcHQ6IDE0R3Q3OVFXanl4SmVVWm9GTS92T2RKYlN6cz0NCg0Kc/HvVuE1DABCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANGcXQABABkPGwKgHNsCoB2CW2h/1lxiw/EAdJyaAEADtpaEAAAEBCAoAt8kIAGIP/nPx71YkSQwA6AIAAOgCAAAIACetHhNo9ygf0sUIAEUAAtpfuEAAQAZIf8CoBzbAqAdgltAf9fk+Kq5rOza7gBgFpG+8AAABAQgKALfJCQBiD/5HRVQgL29ub3MvdWkvZGF0YS9pbWcvbG9hZGluZy9kYXJrL2xvYWQtMTEucG5nIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6IGltYWdlL3dlYnAsaW1hZ2UvKiwqLyo7cT0wLjgNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9WQUkMAOkCAADpAgAACAAnrR4TaPcoH9LFCABFAALb4lhAAEAGxd3AqAc2wKgHYJbUH/VA3ePzoa8T3YAYB6BnuwAAAQEICgC3yQkAYg/+R0VUIC9vbm9zL3VpL2RhdGEvaW1nL2xvYWRpbmcvbGlnaHQvbG9hZC0xMi5wbmcgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogaW1hZ2Uvd2VicCxpbWFnZS8qLCovKjtxPTAuOA0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCnPx71bpSwwA6AIAAOgCAAAIACetHhNo9ygf0sUIAEUAAtpkn0AAQAZDmMCoBzbAqAdgltMf9WEcaOlygw+ngBgFpOlsAAABAQgKALfJCQBiD/1HRVQgL29ub3MvdWkvZGF0YS9pbWcvbG9hZGluZy9kYXJrL2xvYWQtMTIucG5nIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6IGltYWdlL3dlYnAsaW1hZ2UvKiwqLyo7cT0wLjgNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9WNUwMAOkCAADpAgAACAAnrR4TaPcoH9LFCABFAALbxCdAAEAG5A7AqAc2wKgHYJbPH/WjaswTDr6OpYAYIWYadwAAAQEICgC3yQkAYg/9R0VUIC9vbm9zL3VpL2RhdGEvaW1nL2xvYWRpbmcvbGlnaHQvbG9hZC0xMy5wbmcgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogaW1hZ2Uvd2VicCxpbWFnZS8qLCovKjtxPTAuOA0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCnPx71YTTQwA6AIAAOgCAAAIACetHhNo9ygf0sUIAEUAAtprvkAAQAY8ecCoBzbAqAdgltIf9TSHdDtTUe42gBgPM0HDAAABAQgKALfJCQBiD/1HRVQgL29ub3MvdWkvZGF0YS9pbWcvbG9hZGluZy9kYXJrL2xvYWQtMTMucG5nIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6IGltYWdlL3dlYnAsaW1hZ2UvKiwqLyo7cT0wLjgNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9WcU0MAOkCAADpAgAACAAnrR4TaPcoH9LFCABFAALb3ahAAEAGyo3AqAc2wKgHYJbRH/WMl8GgWpXoaYAYBaSw4AAAAQEICgC3yQoAYg/9R0VUIC9vbm9zL3VpL2RhdGEvaW1nL2xvYWRpbmcvbGlnaHQvbG9hZC0xNC5wbmcgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogaW1hZ2Uvd2VicCxpbWFnZS8qLCovKjtxPTAuOA0KSWYtTm9uZS1NYXRjaDog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LCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KDQpz8e9Wmm8MAOgCAADoAgAACAAnrR4TaPcoH9LFCABFAALaxChAAEAG5A7AqAc2wKgHYJbPH/Wjas66Dr6O44AYIWYKDwAAAQEICgC3yQwAYhABR0VUIC9vbm9zL3VpL2RhdGEvaW1nL2xvYWRpbmcvZGFyay9sb2FkLTE0LnBuZyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiBpbWFnZS93ZWJwLGltYWdlLyosKi8qO3E9MC44DQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVk5xDACcAgAAnAIAAAgAJ60eE2j3KB/SxQgARQACjt2pQABABsrZwKgHNsCoB2CW0R/1jJfER1qV6KeAGAWkM9sAAAEBCAoAt8kMAGIQAUdFVCAvb25vcy91aS9uYXYuaHRtbCBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVuhyDACAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAcn8/QABABitgwKgHYMCoBzYf9ZbPDr6O46Nq0WCAGANikEsAAAEBCAoAYhACALfJDEhUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0Kc/HvVhpzDACrAgAAqwIAAAgAJ60eE2j3KB/SxQgARQACnWSgQABABkPUwKgHNsCoB2CW0x/1YRxrj3KDD+WAGAWkEG0AAAEBCAoAt8kMAGIQAUdFVCAvb25vcy91aS9hcHAvdmlldy90b3BvL3RvcG8uaHRtbCBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVrR4DADpAgAA6QIAAAgAJ60eE2j3KB/SxQgARQAC21+5QABABkh9wKgHNsCoB2CW0B/1+T4tVGs7NvmAGAWkeEwAAAEBCAoAt8kMAGIQAEdFVCAvb25vcy91aS9kYXRhL2ltZy9sb2FkaW5nL2xpZ2h0L2xvYWQtMTUucG5nIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6IGltYWdlL3dlYnAsaW1hZ2UvKiwqLyo7cT0wLjgNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9WZ3sMAOgCAADoAgAACAAnrR4TaPcoH9LFCABFAALaxClAAEAG5A3AqAc2wKgHYJbPH/WjatFgDr6PIYAYIWYHKQAAAQEICgC3yQwAYhACR0VUIC9vbm9zL3VpL2RhdGEvaW1nL2xvYWRpbmcvZGFyay9sb2FkLTE1LnBuZyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiBpbWFnZS93ZWJwLGltYWdlLyosKi8qO3E9MC44DQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVrN8DADpAgAA6QIAAAgAJ60eE2j3KB/SxQgARQAC22u/QABABjx3wKgHNsCoB2CW0h/1NId24VNR7nSAGA8zSVMAAAEBCAoAt8kNAGIQAEdFVCAvb25vcy91aS9kYXRhL2ltZy9sb2FkaW5nL2xpZ2h0L2xvYWQtMTYucG5nIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6IGltYWdlL3dlYnAsaW1hZ2UvKiwqLyo7cT0wLjgNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQpz8e9WW4QMAIAAAACAAAAAaPcoH9LFCAAnrR4TCABFAABygWRAAEAGKTvAqAdgwKgHNh/1ltShrxQbQN3pH4AYArWQSwAAAQEICgBiEAMAt8kMSFRUUC8xLjEgMzA0IE5vdCBNb2RpZmllZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQpz8e9WLIcMAIAAAACAAAAAaPcoH9LFCAAnrR4TCABFAAByiX1AAEAGISLAqAdgwKgHNh/1ltBrOzb5+T4v+4AYAp2QSwAAAQEICgBiEAMAt8kMSFRUUC8xLjEgMzA0IE5vdCBNb2RpZmllZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQpz8e9WI48MAIAAAACAAAAAaPcoH9LFCAAnrR4TCABFAAByKPlAAEAGgabAqAdgwKgHNh/1ltJTUe50NId5iIAYAxCQSwAAAQEICgBiEAQAt8kNSFRUUC8xLjEgMzA0IE5vdCBNb2RpZmllZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQpz8e9W5JIMAOgCAADoAgAACAAnrR4TaPcoH9LFCABFAALaa8BAAEAGPHfAqAc2wKgHYJbSH/U0h3mIU1HusoAYDzM76wAAAQEICgC3yQ4AYhAER0VUIC9vbm9zL3VpL2RhdGEvaW1nL2xvYWRpbmcvZGFyay9sb2FkLTE2LnBuZyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiBpbWFnZS93ZWJwLGltYWdlLyosKi8qO3E9MC44DQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVuSSDACAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAcn9AQABABitfwKgHYMCoBzYf9ZbPDr6PIaNq1AaAGANtkEsAAAEBCAoAYhAEALfJDEhUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0Kc/HvVuyXDABnAQAAZwEAAGj3KB/SxQgAJ60eEwgARQABWSvqQABABn3OwKgHYMCoBzYf9ZbTcoMP5WEcbfiAGAK2kTIAAAEBCAoAYhAEALfJDEhUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2h0bWwNCkNvbnRlbnQtTGVuZ3RoOiAxOTUNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KPCEtLSBUb3BvbG9neSBWaWV3IHBhcnRpYWwgSFRNTCAtLT4KPGRpdiBpZD0ib3YtdG9wbyI+CiAgICA8c3ZnIHZpZXdCb3g9IjAgMCAxMDAwIDEwMDAiCiAgICAgICAgIHJlc2l6ZSBvZmZzZXQtaGVpZ2h0PSI1NiIgb2Zmc2V0LXdpZHRoPSIxMiIKICAgICAgICAgbm90aWZpZXI9Im5vdGlmeVJlc2l6ZSgpIj4KICAgIDwvc3ZnPgo8L2Rpdj4Kc/HvVnOiDACAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAcij6QABABoGlwKgHYMCoBzYf9ZbSU1HusjSHfC6AGAMbkEsAAAEBCAoAYhAFALfJDkhUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0Kc/HvVkunDADzBAAA8wQAAGj3KB/SxQgAJ60eEwgARQAE5cyzQABABtl4wKgHYMCoBzYf9ZbRWpXop4yXxqGAGAL3lL4AAAEBCAoAYhAFALfJDEhUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2h0bWwNCkNvbnRlbnQtTGVuZ3RoOiAxMTAyDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCjwhLS0ge0lOSkVDVEVELVZJRVctTkFWLVNUQVJUfSAtLT4KPGRpdiBjbGFzcz0ibmF2LWhkciI+UGxhdGZvcm08L2Rpdj4KPGEgbmctY2xpY2s9Im5hdkN0cmwuaGlkZU5hdigpIiBocmVmPSIjL2FwcCI+PGRpdiBpY29uIGljb24taWQ9Im5hdl9hcHBzIj48L2Rpdj4gQXBwbGljYXRpb25zPC9hPgo8YSBuZy1jbGljaz0ibmF2Q3RybC5oaWRlTmF2KCkiIGhyZWY9IiMvc2V0dGluZ3MiPjxkaXYgaWNvbiBpY29uLWlkPSJuYXZfc2V0dGluZ3MiPjwvZGl2PiBTZXR0aW5nczwvYT4KPGEgbmctY2xpY2s9Im5hdkN0cmwuaGlkZU5hdigpIiBocmVmPSIjL2NsdXN0ZXIiPjxkaXYgaWNvbiBpY29uLWlkPSJuYXZfY2x1c3RlciI+PC9kaXY+IENsdXN0ZXIgTm9kZXM8L2E+CjxhIG5nLWNsaWNrPSJuYXZDdHJsLmhpZGVOYXYoKSIgaHJlZj0iIy9wcm9jZXNzb3IiPjxkaXYgaWNvbiBpY29uLWlkPSJuYXZfcHJvY2Vzc29ycyI+PC9kaXY+IFBhY2tldCBQcm9jZXNzb3JzPC9hPgo8ZGl2IGNsYXNzPSJuYXYtaGRyIj5OZXR3b3JrPC9kaXY+CjxhIG5nLWNsaWNrPSJuYXZDdHJsLmhpZGVOYXYoKSIgaHJlZj0iIy90b3BvIj48ZGl2IGljb24gaWNvbi1pZD0ibmF2X3RvcG8iPjwvZGl2PiBUb3BvbG9neTwvYT4KPGEgbmctY2xpY2s9Im5hdkN0cmwuaGlkZU5hdigpIiBocmVmPSIjL2RldmljZSI+PGRpdiBpY29uIGljb24taWQ9Im5hdl9kZXZzIj48L2Rpdj4gRGV2aWNlczwvYT4KPGEgbmctY2xpY2s9Im5hdkN0cmwuaGlkZU5hdigpIiBocmVmPSIjL2xpbmsiPjxkaXYgaWNvbiBpY29uLWlkPSJuYXZfbGlua3MiPjwvZGl2PiBMaW5rczwvYT4KPGEgbmctY2xpY2s9Im5hdkN0cmwuaGlkZU5hdigpIiBocmVmPSIjL2hvc3QiPjxkaXYgaWNvbiBpY29uLWlkPSJuYXZfaG9zdHMiPjwvZGl2PiBIb3N0czwvYT4KPGEgbmctY2xpY2s9Im5hdkN0cmwuaGlkZU5hdigpIiBocmVmPSIjL2ludGVudCI+PGRpdiBpY29uIGljb24taWQ9Im5hdl9pbnRlbnRzIj48L2Rpdj4gSW50ZW50czwvYT4KPGEgbmctY2xpY2s9Im5hdkN0cmwuaGlkZU5hdigpIiBocmVmPSIjL3R1bm5lbCI+PGRpdiBpY29uIGljb24taWQ9Im5hdl9saW5rcyI+PC9kaXY+IFR1bm5lbHM8L2E+Cgpz8e9WxKsMANwCAADcAgAACAAnrR4TaPcoH9LFCABFAALOa8FAAEAGPILAqAc2wKgHYJbSH/U0h3wuU1Hu8IAYDzMiFgAAAQEICgC3yRAAYhAFR0VUIC9vbm9zL3VpL2RhdGEvaW1nL25hdi1tZW51LnBuZyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiBpbWFnZS93ZWJwLGltYWdlLyosKi8qO3E9MC44DQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0Kc/HvVt6rDADdAgAA3QIAAAgAJ60eE2j3KB/SxQgARQACz2ShQABABkOhwKgHNsCoB2CW0x/1YRxt+HKDEQqAGAWkGjUAAAEBCAoAt8kQAGIQBEdFVCAvb25vcy91aS9kYXRhL2ltZy9vbm9zLWxvZ28ucG5nIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6IGltYWdlL3dlYnAsaW1hZ2UvKiwqLyo7cT0wLjgNCklmLU5vbmUtTWF0Y2g6IDE0NTg1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cnkiLCJ0eXBlIjoibm9kZSIsImlkIjpudWxsLCJwcm9wT3JkZXIiOlsiVmVyc2lvbiIsIi0iLCJEZXZpY2VzIiwiTGlua3MiLCJIb3N0cyIsIlRvcG9sb2d5IFNDQ3MiLCItIiwiSW50ZW50cyIsIlR1bm5lbHMiLCJGbG93cyJdLCJwcm9wcyI6eyJWZXJzaW9uIjoiMS41LjAuc3RhbmRhcmQiLCItIjoiIiwiRGV2aWNlcyI6IjQiLCJMaW5rcyI6IjAiLCJIb3N0cyI6IjAiLCJUb3BvbG9neSBTQ0NzIjoiNCIsIkludGVudHMiOiIwIiwiVHVubmVscyI6IjAiLCJGbG93cyI6IjAifSwiYnV0dG9ucyI6W119fXPx71Zq2A0A0gIAANICAAAIACetHhNo9ygf0sUIAEUAAsRrw0AAQAY8isCoBzbAqAdgltIf9TSHfshTUe8ugBgPM9LfAAABAQgKALfJIwBiEAZHRVQgL29ub3MvdWkvZGF0YS9tYXAvY29udGluZW50YWxfdXMudG9wb2pzb24gSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKg0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5z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CAAA/wYpYsCoB/HAqAdgxq0AswAAK6QAAAAAYAIgAPR/AAACBAW0AAB18e9Wu3oDADoAAAA6AAAANsgHEREQCAAnrR4TCABFAAAsAABAAEAGqirAqAdgwKgH8QCzxq3qq5/5AAArpWASchCQwAAAAgQFtHXx71YIhQMAPAAAADwAAAAIACetHhM2yAcRERAIAEXAACgCCAAA/wYoZsCoB/HAqAdgxq0AswAAK6Xqq5/6UBAiOH9OAAAAAAAAAAB18e9WKo0DAG8AAABvAAAACAAnrR4TNsgHEREQCABFwABhAwgAAP8GJy3AqAfxwKgHYMatALMAACul6quf+lAYIjiPLAAA/////////////////////wA5AQQAZAC0bwEBARwCGgEEAAEAAQEEAAEAhQEEQAQARwIAQQQAAABkdfHvVkaNAwA2AAAANgAAADbIBxEREAgAJ60eEwgARQAAKI6eQABABhuQwKgHYMCoB/EAs8at6quf+gAAK95QEHIQkLwAAHXx71a3jgMASwAAAEsAAAA2yAcRERAIACetHhMIAEUAAD2On0AAQAYbesCoB2DAqAfxALPGreqrn/oAACveUBhyEJDRAAD/////////////////////ABUDBgV18e9WYI8DADYAAAA2AAAANsgHEREQCAAnrR4TCABFAAAojqBAAEAGG47AqAdgwKgH8QCzxq3qq6APAAAr3lAUchCQvAAAdfHvVuXpBwBcAAAAXAAAAP////////w/20UtAQgARQAATmLLQABAEUbWwKgHrsCoB/8AiQCJADqijEhhARAAAQAAAAAAACBGSEVQRkNFTEVIRkNFUEZGRkFDQUNBQ0FDQUNBQ0FCTgAAIAABdfHvVvvqBwDsAAAA7AAAAP///////wAlntNbaQgARQAA3jARQABAEXlWwKgHWMCoB/8AigCKAMonpREKeS7AqAdYAIoAtAAAIEZDRVBFUEZFREJDTkZFRUZFREVCRU1DQUNBQ0FDQUFBACBGSEVQRkNFTEVIRkNFUEZGRkFDQUNBQ0FDQUNBQ0FCTwD/U01CJQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEAABoAAAAAAAAAAAAAAAAAAAAAAAAAGgBWAAMAAQABAAIAKwBcTUFJTFNMT1RcQlJPV1NFAAgBBw8BFJBOkWIAAAAAUk9P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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB28e9WIc0OAEAAAABAAAAA////////ABiCrIHZiKoAAgsBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB38e9WkfYOAEAAAABAAAAA////////ABiCrIHZiKoAAgwBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO3gXXjx71aSEAMAQgAAAEIAAAD///////825gchERAIBgABCAAGBAABNuYHIREQwKgH3gAAAAAAAMCoB/MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB48e9We7kOAE4AAABOAAAAAQBeAAAFNmkHEQMDCABFwABAWBgAAAFZ773IyMgB4AAABQIBACwBAQEBAAAAAGnSAAAAAAAAAAAAAP///wAACgIBAAAAKMjIyAEAAAAAePHvVvEdDwBAAAAAQAAAAP///////wAYgqyB2YiqAAINAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrF2D958e9WK40AAOoFAADqBQAAAYDCAAAVNmkHIQMDBdz+/gODGwEGEAEAAwIiIiIiAAAACQXZQCIiIiIAAAEBAgFJgQHMBgY2aQcRAwOEBMjIyALlAgAA0wMAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJkAAAAAAAAAAAAAAAAA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AQIBSYEBzAYGNmkHEQMDhATIyMgC5QIAANMDAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfPHvVmNkAQBAAAAAQAAAAP///////wDg/BZ/MJABEgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB88e9WmqsCADwAAAA8AAAA////////AAwpnaQ8CAYAAQgABgQAAQAMKZ2kPMCoAjkAAAAAAADAqAI8AAAAAAAAAAAAAAAAAAAAAAAAfPHvVkasAgA8AAAAPAAAAP///////wAMKXtNDQgGAAEIAAYEAAEADCl7TQ3AqAI8AAAAAAAAwKgCOQAAAAAAAAAAAAAAAAAAAAAAAHzx71Z7YgQAPAAAADwAAAAIACetHhM2yAcxERAIAEXAACwBCAAA/wYpd8CoB9zAqAdg+3sAswAAsj4AAAAAYAIgADksAAACBAW0AAB88e9WlWIEADoAAAA6AAAANsgHMREQCAAnrR4TCABFAAAsAABAAEAGqj/AqAdgwKgH3ACz+3t0lKliAACyP2ASchCQqwAAAgQFtHzx71bCcQQAPAAAADwAAAAIACetHhM2yAcxERAIAEXAACgCCAAA/wYoe8CoB9zAqAdg+3sAswAAsj90lKljUBAiODCpAAAAAAAAAAB88e9WeHQEAG8AAABvAAAACAAnrR4TNsgHMREQCABFwABhAwgAAP8GJ0LAqAfcwKgHYPt7ALMAALI/dJSpY1AYIjg/hgAA/////////////////////wA5AQQAZAC0cAEBAhwCGgEEAAEAAQEEAAEAhQEEQAQARwIAQQQAAABkfPHvVoV0BAA2AAAANgAAADbIBzEREAgAJ60eEwgARQAAKLEqQABABvkYwKgHYMCoB9wAs/t7dJSpYwAAsnhQEHIQkKcAAHzx71bKdAQASwAAAEsAAAA2yAcxERAIACetHhMIAEUAAD2xK0AAQAb5AsCoB2DAqAfcALP7e3SUqWMAALJ4UBhyEJC8AAD/////////////////////ABUDBgV88e9WDXUEADYAAAA2AAAANsgHMREQCAAnrR4TCABFAAAosSxAAEAG+RbAqAdgwKgH3ACz+3t0lKl4AACyeFAUchCQpwAAfPHvVsO+CQA8AAAAPAAAAP///////xBRciGiIAgGAAEIAAYEAAEQUXIhoiAKFIIlAAAAAAAAChSCAQAAAAAAAAAAAAAAAAAAAAAAAH3x71ZDPAAAQgAAAEIAAAD///////96AQAAAACIb8AB3sAEAgAAAQAAAAAAAAAAAAAAAQQAAAAAAABoAHQAaQBwAGwALQA3ADkANgAzADQAAAB98e9W8HkAAEAAAABAAAAA////////ABiCrIHZiKoAAhEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAx0VwBX3x71b8hwAAdgAAAHYAAAAIACetHhNo9ygf0sUIAEUAAGhnKkAAQAZDf8CoBzbAqAdgltof9ZcYsidAHTFggBgBML3iAAABAQgKALfSDQBiFs+BrqbqfR7dyBhow4QJPJzICXHWhTV7x5gJfMOLCTyKyA53wshHKIrIDX/fhhJ/wshHZduXffHvVheIAABCAAAAQgAAAGj3KB/SxQgAJ60eEwgARQAANClqQABABoFzwKgHYMCoBzYf9ZbaQB0xYJcYsluAEADukA0AAAEBCAoAYhkDALfSDX3x71bGPAkAdwAAAHcAAAABgMIAAAAQUXIOPcAAaUJCAwAAAwJ8gAAAGIIAjecAAw0/gAAQUXIOPcCAAwEAFAACAA8AAABAADEwNTE3MjBlM2RjMAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsNhd/UCg81Lg4IdirJt5iAAAAAIAAEFFyDj3AFH7x71YdoAAAQAAAAEAAAAD///////8AGIKsgdmIqgACEgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC5PTijfvHvVtGUAwA8AAAAPAAAAAgAJ60eEzbIBxEREAgARcAALAEIAAD/BiliwKgH8cCoB2DGrgCzAAAArgAAAABgAiAAH3UAAAIEBbQAAH7x71bslAMAOgAAADoAAAA2yAcRERAIACetHhMIAEUAACwAAEAAQAaqKsCoB2DAqAfxALPGrkqTnrIAAACvYBJyEJDAAAACBAW0fvHvVq2nAwA8AAAAPAAAAAgAJ60eEzbIBxEREAgARcAAKAIIAAD/BihmwKgH8cCoB2DGrgCzAAAAr0qTnrNQECI4S6MAAAAAAAAAAH7x71blqAMAbwAAAG8AAAAIACetHhM2yAcRERAIAEXAAGEDCAAA/wYnLcCoB/HAqAdgxq4AswAAAK9Kk56zUBgiOFuBAAD/////////////////////ADkBBABkALRvAQEBHAIaAQQAAQABAQQAAQCFAQRABABHAgBBBAAAAGR+8e9W5agDADYAAAA2AAAANsgHEREQCAAnrR4TCABFAAAohINAAEAGJavAqAdgwKgH8QCzxq5Kk56zAAAA6FAQchCQvAAAfvHvVjaqAwBLAAAASwAAADbIBxEREAgAJ60eEwgARQAAPYSEQABABiWVwKgHYMCoB/EAs8auSpOeswAAAOhQGHIQkNEAAP////////////////////8AFQMGBX7x71YBrQMANgAAADYAAAA2yAcRERAIACetHhMIAEUAACiEhUAAQAYlqcCoB2DAqAfxALPGrkqTnsgAAADoUBRyEJC8AAB+8e9WodMHAEkAAABJAAAACAAnrR4TNskHIREQCABFwAA7CAgAAP8GInHAqAfTwKgHYOuXALMAAAdfUtkpxlAYIjiIoQAA/////////////////////wATBH7x71a00wcANgAAADYAAAA2yQchERAIACetHhMIAEUAACjcD0AAQAbOPMCoB2DAqAfTALPrl1LZKcYAAAdyUBB8JJCeAAB+8e9WjRwIAMYAAADGAAAACAAnrR4TNskHIREQCABFwAC4CQgAAP8GIPTAqAfTwKgHYOuXALMAAAdyUtkpxlAYIjiDQQAA/////////////////////wCQAgAAAHlAAQECQAIAgAQEAAAAAEAFBAAAAGTAHQcERwADAAAKkA4AVkAERwTAqAfTAAACAEkCAAAAAAAAAAABAAAcAgAABAAAAGQCAQAECgoKAgIDAAgiIiIiACIAAAEBABwCAAAEAAAAZAIBAAQKCgoCAgMACCIiIiIAIgIAfvHvVqAcCAA2AAAANgAAADbJByEREAgAJ60eEwgARQAAKNwQQABABs47wKgHYMCoB9MAs+uXUtkpxgAACAJQEIUCkJ4AAH7x71bxsg4A6gUAAOoFAAABgMIAABU2aQcRAwMF3P7+A4MbAQYQAQADAhEREREAAAAeBdlAIiIiIgAAAQECAUmBAcwGBjZpByEDA4QEyMjIAeUCAADTAwAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAImQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACC8e9WOOIKAIICAACCAgAAAQBe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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF8e9W+ZwBAEAAAABAAAAA////////ABiCrIHZiKoAAhgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ12NNoXx71ZN2AoAdwAAAHcAAAABgMIAAAAQUXIOPcAAaUJCAwAAAwJ8gAAAGIIAjecAAw0/gAAQUXIOPcCAAwEAFAACAA8AAABAADEwNTE3MjBlM2RjMAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsNhd/UCg81Lg4IdirJt5iAAAAAIAAEFFyDj3AFIbx71bbhwAAdgAAAHYAAAAIACetHhNo9ygf0sUIAEUAAGhnLUAAQAZDfMCoBzbAqAdgltof9ZcYsmtAHTFogBgBMM1AAAABAQgKALfa1wBiIJOBrnoQkrgBMvfOH37mmkAy5tcKf9rdG2Lm2h9x5ppWMuHRHjKoj1Yy4tkDfP3ZHjKowwdthvHvVvGHAABCAAAAQgAAAGj3KB/SxQgAJ60eEwgARQAANClvQABABoFuwKgHYMCoBzYf9ZbaQB0xaJcYsp+AEADukA0AAAEBCAoAYiHNALfa14bx71aRxwEAQAAAAEAAAAD///////8AGIKsgdmIqgACGQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNdbVUhvHvVjh/BAA8AAAAPAAAAAgAJ60eEzbIBzEREAgARcAALAEIAAD/Bil3wKgH3MCoB2D7fACzAABYXAAAAABgAiAAkw0AAAIEBbQAAIbx71ZcfwQAOgAAADoAAAA2yAcxERAIACetHhMIAEUAACwAAEAAQAaqP8CoB2DAqAfcALP7fC5tVwQAAFhdYBJyEJCrAAACBAW0hvHvVmCWBAA8AAAAPAAAAAgAJ60eEzbIBzEREAgARcAAKAIIAAD/Bih7wKgH3MCoB2D7fACzAABYXS5tVwVQECI4IxAAAAAAAAAAAIbx71aJmAQASwAAAEsAAAA2yAcxERAIACetHhMIAEUAAD11CkAAQAY1JMCoB2DAqAfcALP7fC5tVwUAAFhdUBhyEJC8AAD/////////////////////ABUDBgWG8e9WzZgEADYAAAA2AAAANsgHMREQCAAnrR4TCABFAAAodQtAAEAGNTjAqAdgwKgH3ACz+3wubVcaAABYXVARchCQpwAAhvHvVpaZBABvAAAAbwAAAAgAJ60eEzbIBzEREAgARcAAYQMIAAD/BidCwKgH3MCoB2D7fACzAABYXS5tVwVQGCI4Me0AAP////////////////////8AOQEEAGQAtHABAQIcAhoBBAABAAEBBAABAIUBBEAEAEcCAEEEAAAAZIbx71ammQQANgAAADYAAAA2yAcxERAIACetHhMIAEXAAChypEAAQAY238CoB2DAqAfcALP7fC5tVwUAAAAAUAQAAJ2xAACG8e9WtK0EADwAAAA8AAAACAAnrR4TNsgHMREQCABFwAAoBAgAAP8GJnvAqAfcwKgHYPt8ALMAAFiWLm1XG1AQIjgiwQAAAAAAAAAAhvHvVjCvBAA2AAAANgAAADbIBzEREAgAJ60eEwgARcAAKHKlQABABjbewKgHYMCoB9wAs/t8Lm1XGwAAAABQBAAAnZsAAIbx71ZgrwQAPAAAADwAAAAIACetHhM2yAcxERAIAEXAACgFCAAA/wYle8CoB9zAqAdg+3wAswAAWJYubVcbUBEiOCLAAAAAAAAAAACG8e9Wdq8EADYAAAA2AAAANsgHMREQCAAnrR4TCABFwAAocqZAAEAGNt3AqAdgwKgH3ACz+3wubVcbAAAAAFAEAACdmwAAhvHvVqGhCQA8AAAAPAAAAAGAwgAAChBRcg49wJmYAAEAAAAIAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIbx71ZypAkAQAAAAEAAAAD///////8QUXIOPcCBAAABmZgAAQAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAh/HvViI+AABCAAAAQgAAAP///////3oBAAAAAIhvwAHewAQCAAABAAAAAAAAAAAAAAABBAAAAAAAAGgAdABpAHAAbAAtADcAOQA2ADMANAAAAIfx71b27gEAQAAAAEAAAAD///////8AGIKsgdmIqgACGgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzDf3yh/HvVu7dCQA8AAAAPAAAAP///////xBRciGiIAgGAAEIAAYEAAEQUXIhoiAKFIIlAAAAAAAAChSCAQAAAAAAAAAAAAAAAAAAAAAAAIfx71b94AkAQAAAAEAAAAD///////8A4PxLPXqQARcBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAh/HvVh/KCgB3AAAAdwAAAAGAwgAAABBRcg49wABpQkIDAAADAnyAAAAYggCN5wADDT+AABBRcg49wIADAQAUAAIADwAAAEAAMTA1MTcyMGUzZGMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKw2F39QKDzUuDgh2Ksm3mIAAAAAgAAQUXIOPcAUh/HvVsW4DgDqBQAA6gUAAAGAwgAAFTZpBxEDAwXc/v4DgxsBBhABAAMCEREREQAAAB4F2UAiIiIiAAABAQIBSYEBzAYGNmkHIQMDhATIyMgB5QIAANMDAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo3x71Y1DQ4AFiEAABYhAABo9ygf0sUIACetHhMIAEUAIQgo/UAAQAZhDMCoB2DAqAc2H/WW0lNR72w0h4PfgBgDO7DhAAABAQgKAGIpgAC34olIVFRQLzEuMSAyMDAgT0sNCkNvbnRlbnQtVHlwZTogdGV4dC9odG1sDQpDb250ZW50LUxlbmd0aDogODMwNQ0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQo8IURPQ1RZUEUgaHRtbD4KPCEtLQp+IENvcHlyaWdodCAyMDE0LTIwMTYgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKfgp+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKfgp+ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKfgp+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAp+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgp+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0+CjxodG1sPgo8aGVhZD4KICAgIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICAgIDxsaW5rIHJlbD0ic2hvcnRjdXQgaWNvbiIgaHJlZj0iZGF0YS9pbWcvb25vcy1sb2dvLnBuZyI+CgogICAgPGxpbmsgcmVsPSJhcHBsZS10b3VjaC1pY29uIiBocmVmPSJkYXRhL2ltZy9hcHBsZS10b3VjaC1pY29uLnBuZyI+CiAgICA8bWV0YSBuYW1lPSJhcHBsZS1tb2JpbGUtd2ViLWFwcC1jYXBhYmxlIiBjb250ZW50PSJ5ZXMiPgogICAgPG1ldGEgbmFtZT0iYXBwbGUtbW9iaWxlLXdlYi1hcHAtc3RhdHVzLWJhci1zdHlsZSIgY29udGVudD0iYmxhY2siPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiPgoKICAgIDx0aXRsZT5PTk9TPC90aXRsZT4KCiAgICA8IS0tIFRoaXJkIHBhcnR5IGxpYnJhcnkgY29kZSBpbmNsdWRlZCBoZXJlIC0tPgogICAgPCEtLVRPRE86IHVzZSBtaW5pZmllZCB2ZXJzaW9ucywgb25jZSBkZWJ1Z2dpbmcgaXMgY29tcGxldGUgLS0+CiAgICA8c2NyaXB0IHNyYz0idHAvYW5ndWxhci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0idHAvYW5ndWxhci1yb3V0ZS5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0idHAvYW5ndWxhci1jb29raWVzLmpzIj48L3NjcmlwdD4KCiAgICA8c2NyaXB0IHNyYz0idHAvZDMuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9InRwL3RvcG9qc29uLnYxLm1pbi5qcyI+PC9zY3JpcHQ+CgogICAgPHNjcmlwdCBzcmM9InRwL0NoYXJ0Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0idHAvYW5ndWxhci1jaGFydC5taW4uanMiPjwvc2NyaXB0PgoKICAgIDwhLS0gT05PUyBVSSBGcmFtZXdvcmsgaW5jbHVkZWQgaGVyZSAtLT4KICAgIDwhLS0gVE9ETzogdXNlIGEgc2luZ2xlIGNhdGVuYXRlZC1taW5pZmllZCBmaWxlIGhlcmUgLS0+CiAgICA8c2NyaXB0IHNyYz0ib25vcy5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL2RpcmVjdGl2ZXMuanMiPjwvc2NyaXB0PgoKICAgIDxzY3JpcHQgc3JjPSJhcHAvZncvdXRpbC91dGlsLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvZncvdXRpbC9lZS5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL2Z3L3V0aWwvZm4uanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC9mdy91dGlsL3JhbmRvbS5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL2Z3L3V0aWwvdGhlbWUuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC9mdy91dGlsL2tleXMuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC9mdy91dGlsL3ByZWZzLmpzIj48L3NjcmlwdD4KCiAgICA8c2NyaXB0IHNyYz0iYXBwL2Z3L21hc3QvbWFzdC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL2Z3L25hdi9uYXYuanMiPjwvc2NyaXB0PgoKICAgIDxzY3JpcHQgc3JjPSJhcHAvZncvc3ZnL3N2Zy5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL2Z3L3N2Zy9nbHlwaC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL2Z3L3N2Zy9pY29uLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvZncvc3ZnL2dlb2RhdGEuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC9mdy9zdmcvbWFwLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvZncvc3ZnL3pvb20uanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC9mdy9zdmcvc3ZnVXRpbC5qcyI+PC9zY3JpcHQ+CgogICAgPHNjcmlwdCBzcmM9ImFwcC9mdy9yZW1vdGUvcmVtb3RlLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvZncvcmVtb3RlL3VybGZuLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvZncvcmVtb3RlL3Jlc3QuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC9mdy9yZW1vdGUvd3NvY2suanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC9mdy9yZW1vdGUvd2Vic29ja2V0LmpzIj48L3NjcmlwdD4KCiAgICA8c2NyaXB0IHNyYz0iYXBwL2Z3L3dpZGdldC93aWRnZXQuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC9mdy93aWRnZXQvdGFibGUuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC9mdy93aWRnZXQvdG9vbGJhci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL2Z3L3dpZGdldC90b29sdGlwLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvZncvd2lkZ2V0L2J1dHRvbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL2Z3L3dpZGdldC90YWJsZUJ1aWxkZXIuanMiPjwvc2NyaXB0PgoKICAgIDxzY3JpcHQgc3JjPSJhcHAvZncvbGF5ZXIvbGF5ZXIuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC9mdy9sYXllci9wYW5lbC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL2Z3L2xheWVyL2RpYWxvZy5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL2Z3L2xheWVyL2ZsYXNoLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvZncvbGF5ZXIvcXVpY2toZWxwLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvZncvbGF5ZXIvdmVpbC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL2Z3L2xheWVyL2xvYWRpbmcuanMiPjwvc2NyaXB0PgoKICAgIDwhLS0gRnJhbWV3b3JrIGFuZCBsaWJyYXJ5IHN0eWxlc2hlZXRzIGluY2x1ZGVkIGhlcmUgLS0+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9InRwL2FuZ3VsYXItY2hhcnQubWluLmNzcyI+CgogICAgPCEtLSBUT0RPOiB1c2UgYSBzaW5nbGUgY2F0ZW5hdGVkLW1pbmlmaWVkIGZpbGUgaGVyZSAtLT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYXBwL29ub3MuY3NzIj4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYXBwL2NvbW1vbi5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJhcHAvZncvbWFzdC9tYXN0LmNzcyI+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImFwcC9mdy9zdmcvZ2x5cGguY3NzIj4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYXBwL2Z3L3N2Zy9pY29uLmNzcyI+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImFwcC9mdy9sYXllci9wYW5lbC5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJhcHAvZncvbGF5ZXIvZGlhbG9nLmNzcyI+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImFwcC9mdy9sYXllci9mbGFzaC5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJhcHAvZncvbGF5ZXIvcXVpY2toZWxwLmNzcyI+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImFwcC9mdy9sYXllci92ZWlsLmNzcyI+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImFwcC9mdy9sYXllci9sb2FkaW5nLmNzcyI+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImFwcC9mdy9uYXYvbmF2LmNzcyI+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImFwcC9mdy93aWRnZXQvYnV0dG9uLmNzcyI+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImFwcC9mdy93aWRnZXQvdG9vbGJhci5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJhcHAvZncvd2lkZ2V0L3Rvb2x0aXAuY3NzIj4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYXBwL2Z3L3dpZGdldC90YWJsZS5jc3MiPgoKICAgIDwhLS0gQnVpbHRpbiB2aWV3cyBqYXZhc2NyaXB0LiAtLT4KICAgIDxzY3JpcHQgc3JjPSJhcHAvdmlldy90b3BvL3RvcG8uanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC92aWV3L3RvcG8vdG9wb0QzLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvdmlldy90b3BvL3RvcG9FdmVudC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL3ZpZXcvdG9wby90b3BvRGlhbG9nLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvdmlldy90b3BvL3RvcG9GaWx0ZXIuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC92aWV3L3RvcG8vdG9wb0ZvcmNlLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvdmlldy90b3BvL3RvcG9JbnN0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvdmlldy90b3BvL3RvcG9MaW5rLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvdmlldy90b3BvL3RvcG9Nb2RlbC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL3ZpZXcvdG9wby90b3BvT2JsaXF1ZS5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL3ZpZXcvdG9wby90b3BvT3ZlcmxheS5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL3ZpZXcvdG9wby90b3BvUGFuZWwuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC92aWV3L3RvcG8vdG9wb1NlbGVjdC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL3ZpZXcvdG9wby90b3BvU3ByaXRlLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvdmlldy90b3BvL3RvcG9UcmFmZmljLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvdmlldy90b3BvL3RvcG9UcmFmZmljTmV3LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvdmlldy90b3BvL3RvcG9Ub29sYmFyLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvdmlldy9kZXZpY2UvZGV2aWNlLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvdmlldy9mbG93L2Zsb3cuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC92aWV3L3BvcnQvcG9ydC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL3ZpZXcvZ3JvdXAvZ3JvdXAuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC92aWV3L21ldGVyL21ldGVyLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvdmlldy9saW5rL2xpbmsuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC92aWV3L2hvc3QvaG9zdC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL3ZpZXcvaW50ZW50L2ludGVudC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL3ZpZXcvYXBwL2FwcC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL3ZpZXcvc2V0dGluZ3Mvc2V0dGluZ3MuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC92aWV3L2NsdXN0ZXIvY2x1c3Rlci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL3ZpZXcvcHJvY2Vzc29yL3Byb2Nlc3Nvci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL3ZpZXcvdHVubmVsL3R1bm5lbC5qcyI+PC9zY3JpcHQ+CgogICAgPCEtLSBDb250cmlidXRlZCBqYXZhc2NyaXB0IGluamVjdGVkIGhlcmUgLS0+CiAgICA8IS0tIEJ1aWx0aW4gdmlldyBqYXZhc2NyaXB0IGRlZmluZWQgaW4gaW5kZXguaHRtbCB0ZW1wbGF0ZSAtLT4KCgoKICAgIDwhLS0gQnVpbHRpbiB2aWV3cyBzdHlsZXNoZWV0cy4gLS0+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImFwcC92aWV3L3RvcG8vdG9wby5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJhcHAvdmlldy9kZXZpY2UvZGV2aWNlLmNzcyI+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImFwcC92aWV3L2Zsb3cvZmxvdy5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJhcHAvdmlldy9wb3J0L3BvcnQuY3NzIj4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYXBwL3ZpZXcvZ3JvdXAvZ3JvdXAuY3NzIj4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYXBwL3ZpZXcvbWV0ZXIvbWV0ZXIuY3NzIj4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYXBwL3ZpZXcvbGluay9saW5rLmNzcyI+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImFwcC92aWV3L2hvc3QvaG9zdC5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJhcHAvdmlldy9pbnRlbnQvaW50ZW50LmNzcyI+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImFwcC92aWV3L2FwcC9hcHAuY3NzIj4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYXBwL3ZpZXcvc2V0dGluZ3Mvc2V0dGluZ3MuY3NzIj4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYXBwL3ZpZXcvY2x1c3Rlci9jbHVzdGVyLmNzcyI+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImFwcC92aWV3L3Byb2Nlc3Nvci9wcm9jZXNzb3IuY3NzIj4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYXBwL3ZpZXcvdHVubmVsL3R1bm5lbC5jc3MiPgoKICAgIDwhLS0gQ29udHJpYnV0ZWQgc3R5bGVzaGVldHMgaW5qZWN0ZWQgaGVyZSAtLT4KICAgIDwhLS0gQnVpbHRpbiB2aWV3IHN0eWxlc2hlZXRzIGRlZmluZWQgaW4gaW5kZXguaHRtbCB0ZW1wbGF0ZSAtLT4KCgoKPC9oZWFkPgo8Ym9keSBjbGFzcz0ibGlnaHQiIG5nLWFwcD0ib25vc0FwcCI+CjxkaXYgaWQ9ImZyYW1lIiBuZy1jb250cm9sbGVyPSJPbm9zQ3RybCBhcyBvbm9zQ3RybCIgZGV0ZWN0LWJyb3dzZXI+CiAgICA8ZGl2IGlkPSJtYXN0IgogICAgICAgICBuZy1jb250cm9sbGVyPSJNYXN0Q3RybCBhcyBtYXN0Q3RybCIKICAgICAgICAgbmctaW5jbHVkZT0iJ2FwcC9mdy9tYXN0L21hc3QuaHRtbCciPjwvZGl2PgoKICAgIDxkaXYgaWQ9InZpZXciIG5nLXZpZXc+PC9kaXY+CgogICAgPGRpdiBpZD0ibmF2IgogICAgICAgICBuZy1jb250cm9sbGVyPSJOYXZDdHJsIGFzIG5hdkN0cmwiCiAgICAgICAgIG5nLWluY2x1ZGU9IiduYXYuaHRtbCciPjwvZGl2PgoKICAgIDxkaXYgaWQ9ImZsb2F0cGFuZWxzIj48L2Rpdj4KICAgIDxkaXYgaWQ9ImFsZXJ0cyI+PC9kaXY+CiAgICA8ZGl2IGlkPSJ0b29sdGlwIj48L2Rpdj4KICAgIDxkaXYgaWQ9ImZsYXNoIj48L2Rpdj4KICAgIDxkaXYgaWQ9InF1aWNraGVscCI+PC9kaXY+CiAgICA8ZGl2IGlkPSJ2ZWlsIj4KICAgICAgICA8ZGl2IGNsYXNzPSJtc2ciPjwvZGl2PgogICAgICAgIDxzdmcgcmVzaXplPjwvc3ZnPgogICAgPC9kaXY+CjwvZGl2PgoKPHNjcmlwdD4KICAgIDwhLS0gSW5qZWN0IHVzZXIgYWdlbnQgaW5mbyBpbnRvIGh0bWwgZWxlbWVudCB0byBhbGxvdyBDU1Mgc2Vuc2l0aXZpdHkuIC0tPgogICAgKGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgdCA9ICEhKCdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdykgfHwgISEoJ29ubXNnZXN0dXJlY2hhbmdlJyBpbiB3aW5kb3cpOwogICAgICAgIGQzLnNlbGVjdChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpCiAgICAgICAgICAgIC5hdHRyKCdkYXRhLXVzZXJhZ2VudCcsIG5hdmlnYXRvci51c2VyQWdlbnQpCiAgICAgICAgICAgIC5hdHRyKCdkYXRhLXBsYXRmb3JtJywgbmF2aWdhdG9yLnBsYXRmb3JtKQogICAgICAgICAgICAuY2xhc3NlZCgndG91Y2gnLCB0KTsKICAgIH0oKSk7Cjwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD4KjfHvVmoQDgBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANGvGQABABj8XwKgHNsCoB2CW0h/1NIeD31NSEECAEA8z974AAAEBCAoAt+KKAGIpgI3x71ZjJQ4ASgAAAEoAAAAIACetHhNo9ygf0sUIAEUAADxnL0AAQAZDpsCoBzbAqAdgltof9ZcYsqdAHTFsgBgBMJLoAAABAQgKALfiiwBiJXWIguTmgwHnD43x71buJQ4AQgAAAEIAAABo9ygf0sUIACetHhMIAEUAADQpckAAQAaBa8CoB2DAqAc2H/WW2kAdMWyXGLKvgBAA7pANAAABAQgKAGIpggC34ouN8e9W+K4OALsCAAC7AgAACAAnrR4TaPcoH9LFCABFAAKta8dAAEAGPJ3AqAc2wKgHYJbSH/U0h4PfU1IQQIAYDzOVTAAAAQEICgC34pQAYimAR0VUIC9vbm9zL3VpL3RwL2FuZ3VsYXIuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0KjfHvVhS1DgDBAgAAwQIAAAgAJ60eE2j3KB/SxQgARQACs2SjQABABkO7wKgHNsCoB2CW0x/1YRxwk3KDEUiAGAWkMboAAAEBCAoAt+KVAGIQBkdFVCAvb25vcy91aS90cC9hbmd1bGFyLXJvdXRlLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6ICovKg0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxs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c3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0KjfHvVo7lDgC9AgAAvQIAAAgAJ60eE2j3KB/SxQgARQACr+JbQABABsYGwKgHNsCoB2CW1B/1QN3pH6GvFFmAGAegpRoAAAEBCAoAt+KYAGIQA0dFVCAvb25vcy91aS90cC9DaGFydC5taW4uanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0KjfHvVmrmDgDFAgAAxQIAAAgAJ60eE2j3KB/SxQgARQACt2vJQABABjyRwKgHNsCoB2CW0h/1NIeGWFNSEH6AGA8zfdwAAAEBCAoAt+KYAGIpi0dFVCAvb25vcy91aS90cC9hbmd1bGFyLWNoYXJ0Lm1pbi5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiAqLyoNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQqN8e9WyuYOAH0CAAB9AgAACAAnrR4TaPcoH9LFCABFAAJvZKVAAEAGQ/3AqAc2wKgHYJbTH/VhHHMScoMRhoAYBaRqHwAAAQEICgC34pgAYimLR0VUIC9vbm9zL3VpL29ub3MuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6ICovKg0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo3x71Yy6A4AvwIA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ZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBUb3BvbG9neSBWaWV3IC0tIENTUyBmaWxlCiAqLwoKLyogLS0tIEJhc2UgU1ZHIExheWVyIC0tLSAqLwoKI292LXRvcG8gc3ZnIHsKICAgIC8qIHByZXZlbnRzIHRoZSBsaXR0bGUgY3V0L2NvcHkvcGFzdGUgc3F1YXJlIHRoYXQgd291bGQgYXBwZWFyIG9uIGlQYWQgKi8KICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7Cn0KLmxpZ2h0ICNvdi10b3BvIHN2ZyB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOwp9Ci5kYXJrICNvdi10b3BvIHN2ZyB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMmIyYjJiOwp9CgoKLyogLS0tICJObyBEZXZpY2VzIiBMYXllciAtLS0gKi8KCiNvdi10b3BvIHN2ZyAjdG9wby1ub0RldnNMYXllciB7CiAgICB2aXNpYmlsaXR5OiBoaWRkZW47Cn0KCi5saWdodCAjb3YtdG9wbyBzdmcgLm5vRGV2c0JpcmQgewogICAgZmlsbDogI2VjZDsKfQouZGFyayAjb3YtdG9wbyBzdmcgLm5vRGV2c0JpcmQgewogICAgZmlsbDogIzY4MzQzNDsKfQoKI292LXRvcG8gc3ZnICN0b3BvLW5vRGV2c0xheWVyIHRleHQgewogICAgZm9udC1zaXplOiA2MHB0OwogICAgZm9udC1zdHlsZTogaXRhbGljOwp9Ci5saWdodCAjb3YtdG9wbyBzdmcgI3RvcG8tbm9EZXZzTGF5ZXIgdGV4dCB7CiAgICBmaWxsOiAjZGRlOwp9Ci5kYXJrICNvdi10b3BvIHN2ZyAjdG9wby1ub0RldnNMYXllciB0ZXh0IHsKICAgIGZpbGw6ICMzYjNiNGY7Cn0KCgovKiAtLS0gVG9wbyBNYXAgLS0tICovCgojb3YtdG9wbyBzdmcgI3RvcG8tbWFwIHsKICAgIHN0cm9rZS13aWR0aDogMnB4OwogICAgZmlsbDogdHJhbnNwYXJlbnQ7Cn0KCi5saWdodCAjb3YtdG9wbyBzdmcgI3RvcG8tbWFwIHsKICAgIHN0cm9rZTogI2RkZDsKfQouZGFyayAjb3YtdG9wbyBzdmcgI3RvcG8tbWFwIHsKICAgIHN0cm9rZTogIzQ0NDsKfQoKCi8qIC0tLSBUb3BvIFN1bW1hcnkgUGFuZWwgLS0tICovCgojdG9wby1wLXN1bW1hcnkgewogICAgLyogQmFzZSBjc3MgZnJvbSBwYW5lbC5jc3MgKi8KfQoKLyogLS0tIFRvcG8gRGV0YWlsIFBhbmVsIC0tLSAqLwoKI3RvcG8tcC1kZXRhaWwgewogICAgLyogQmFzZSBjc3MgZnJvbSBwYW5lbC5jc3MgKi8KICAgIHRvcDogMzM4cHg7Cn0KaHRtbFtkYXRhLXBsYXRmb3JtPSdpUGFkJ10gI3RvcG8tcC1kZXRhaWwgewogICAgdG9wOiAzNTRweDsKfQoKI3RvcG8tcC1kZXRhaWwgLmFjdGlvbkJ0bnMgLmFjdGlvbkJ0biB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KI3RvcG8tcC1kZXRhaWwgLmFjdGlvbkJ0bnMgLmFjdGlvbkJ0biBzdmcgewogICAgd2lkdGg6IDMwcHg7CiAgICBoZWlnaHQ6IDMwcHg7Cn0KCgovKiAtLS0gZ2VuZXJhbCB0b3BvLXBhbmVsIHN0eWxpbmcgLS0tICovCgoudG9wby1wIGRpdi5oZWFkZXIgZGl2Lmljb24gewogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoudG9wby1wIGRpdi5ib2R5IHsKICAgIG92ZXJmbG93LXk6IHNjcm9sbDsKfQoKLnRvcG8tcCBkaXYuYm9keTo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgZGlzcGxheTogbm9uZTsKfQoKLnRvcG8tcCBzdmcgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgd2lkdGg6IDQycHg7CiAgICBoZWlnaHQ6IDQycHg7Cn0KCi5saWdodCAudG9wby1wIHN2ZyAuZ2x5cGggewogICAgZmlsbDogIzIyMjsKfQoKLmRhcmsgLnRvcG8tcCBzdmcgLmdseXBoLm92ZXJsYXkgewogICAgZmlsbDogIzIyMjsKfQoKLmRhcmsgLnRvcG8tcCBzdmcgLmdseXBoIHsKICAgIGZpbGw6ICNkZGQ7Cn0KLmxpZ2h0IC50b3BvLXAgc3ZnIC5nbHlwaC5vdmVybGF5IHsKICAgIGZpbGw6ICNmZmY7Cn0KCgoudG9wby1wIGgyIHsKICAgIHBhZGRpbmc6IDAgNHB4OwogICAgbWFyZ2luOiAwOwogICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgd2lkdGg6IDIxMHB4OwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQoubGlnaHQgLnRvcG8tcCBoMiB7CiAgICBjb2xvcjogYmxhY2s7Cn0KLmRhcmsgLnRvcG8tcCBoMiB7CiAgICBjb2xvcjogI2RkZDsKfQoKLnRvcG8tcCBoMyB7CiAgICBwYWRkaW5nOiAwIDRweDsKICAgIG1hcmdpbjogMDsKICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgIHRvcDogMjBweDsKICAgIGxlZnQ6II3x71buCg8AQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADTELkAAQAbmrsCoBzbAqAdgls8f9aNq2NMOvprtgBAhZtt9AAABAQgKALfimgBiKZCN8e9WYAsPAJILAACSCwAAaPcoH9LFCAAnrR4TCABFAAuEf0RAAEAGIEnAqAdgwKgHNh/1ls8Ovprto2rY04AQA4KbXQAAAQEICgBiKZEAt+KaNTBweDsKfQoubGlnaHQgLnRvcG8tcCBoMyB7CiAgICBjb2xvcjogYmxhY2s7Cn0KLmRhcmsgLnRvcG8tcCBoMyB7CiAgICBjb2xvcjogI2RkZDsKfQoKLnRvcG8tcCBwLCB0YWJsZSB7CiAgICBwYWRkaW5nOiA0cHg7CiAgICBtYXJnaW46IDA7Cn0KCi50b3BvLXAgdGQgewogICAgd29yZC13cmFwOiBicmVhay13b3JkOwp9Ci50b3BvLXAgdGQubGFiZWwgewogICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgcGFkZGluZy1yaWdodDogMTJweDsKICAgIC8qIHdvcmtzIGZvciBib3RoIGxpZ2h0IGFuZCBkYXJrIHRoZW1lcyAuLi4gKi8KICAgIGNvbG9yOiAjNzc3Owp9Ci50b3BvLXAgdGQudmFsdWUgewp9CgoudG9wby1wIGhyIHsKICAgIGhlaWdodDogMXB4OwogICAgYm9yZGVyOiAwOwp9Ci5saWdodCAudG9wby1wIGhyIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNjY2M7CiAgICBjb2xvcjogI2NjYzsKfQouZGFyayAudG9wby1wIGhyIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICM4ODg7CiAgICBjb2xvcjogIzg4ODsKfQoKLyogLS0tIFRvcG8gSW5zdGFuY2UgUGFuZWwgLS0tICovCgojdG9wby1wLWluc3RhbmNlIHsKICAgIGhlaWdodDogMTAwcHg7Cn0KCiN0b3BvLXAtaW5zdGFuY2UgZGl2Lm9ub3NJbnN0IHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIHdpZHRoOiAxNzBweDsKICAgIGhlaWdodDogODVweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKI3RvcG8tcC1pbnN0YW5jZSBzdmcgcmVjdCB7CiAgICBzdHJva2Utd2lkdGg6IDMuNTsKfQojdG9wby1wLWluc3RhbmNlIC5vbmxpbmUgc3ZnIHJlY3QgewogICAgb3BhY2l0eTogMTsKfQoubGlnaHQgI3RvcG8tcC1pbnN0YW5jZSBzdmcgcmVjdCB7CiAgICBmaWxsOiAjY2NjOwogICAgc3Ryb2tlOiAjYWFhOwp9Ci5saWdodCAjdG9wby1wLWluc3RhbmNlIC5vbmxpbmUgc3ZnIHJlY3QgewogICAgZmlsbDogIzljZjsKICAgIHN0cm9rZTogIzU1NTsKfQouZGFyayAjdG9wby1wLWluc3RhbmNlIHN2ZyByZWN0IHsKICAgIGZpbGw6ICM2NjY7CiAgICBzdHJva2U6ICMyMjI7Cn0KLmRhcmsgI3RvcG8tcC1pbnN0YW5jZSAub25saW5lIHN2ZyByZWN0IHsKICAgIGZpbGw6ICM5Y2Y7CiAgICBzdHJva2U6ICM5OTk7Cn0KCgojdG9wby1wLWluc3RhbmNlIHN2ZyAuZ2x5cGggewogICAgZmlsbDogIzg4ODsKICAgIGZpbGwtcnVsZTogZXZlbm9kZDsKfQojdG9wby1wLWluc3RhbmNlIC5vbmxpbmUgc3ZnIC5nbHlwaCB7CiAgICBmaWxsOiAjMDAwOwp9CgojdG9wby1wLWluc3RhbmNlIHN2ZyAuYmFkZ2VJY29uIHsKICAgIGZpbGwtcnVsZTogZXZlbm9kZDsKICAgIG9wYWNpdHk6IDAuNDsKfQoubGlnaHQgI3RvcG8tcC1pbnN0YW5jZSBzdmcgLmJhZGdlSWNvbiB7CiAgICBmaWxsOiAjNzc3Owp9Ci5kYXJrICN0b3BvLXAtaW5zdGFuY2Ugc3ZnIC5iYWRnZUljb24gewogICAgZmlsbDogIzU1NTsKfQoKI3RvcG8tcC1pbnN0YW5jZSAub25saW5lIHN2ZyAuYmFkZ2VJY29uIHsKICAgIG9wYWNpdHk6IDEuMDsKfQoubGlnaHQgI3RvcG8tcC1pbnN0YW5jZSAub25saW5lIHN2ZyAuYmFkZ2VJY29uIHsKICAgIGZpbGw6ICNmZmY7Cn0KLmRhcmsgI3RvcG8tcC1pbnN0YW5jZSAub25saW5lIHN2ZyAuYmFkZ2VJY29uIHsKICAgIGZpbGw6ICNmZmY7Cn0KCiN0b3BvLXAtaW5zdGFuY2Ugc3ZnIHRleHQgewogICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgIG9wYWNpdHk6IDAuMzsKfQojdG9wby1wLWluc3RhbmNlIC5vbmxpbmUgc3ZnIHRleHQgewogICAgb3BhY2l0eTogMS4wOwp9Ci5saWdodCAjdG9wby1wLWluc3RhbmNlIHN2ZyB0ZXh0IHsKICAgIGZpbGw6ICM0NDQ7Cn0KLmxpZ2h0ICN0b3BvLXAtaW5zdGFuY2UgLm9ubGluZSBzdmcgdGV4dCB7CiAgICBmaWxsOiAjZWVlOwp9Ci5kYXJrICN0b3BvLXAtaW5zdGFuY2Ugc3ZnIHRleHQgewogICAgZmlsbDogI2FhYTsKfQouZGFyayAjdG9wby1wLWluc3RhbmNlIC5vbmxpbmUgc3ZnIHRleHQgewogICAgZmlsbDogI2NjYzsKfQoKI3RvcG8tcC1pbnN0YW5jZSBzdmcgdGV4dC5pbnN0VGl0bGUgewogICAgZm9udC1zaXplOiAxMXB0OwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KI3RvcG8tcC1pbnN0YW5jZSBzdmcgdGV4dC5pbnN0TGFiZWwgewogICAgZm9udC1zaXplOiA5cHQ7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7Cn0KCiN0b3BvLXAtaW5zdGFuY2UgLm9ub3NJbnN0Lm1hc3RlcnNoaXAgewogICAgb3BhY2l0eTogMC4zOwp9CiN0b3BvLXAtaW5zdGFuY2UgLm9ub3NJbnN0Lm1hc3RlcnNoaXAuYWZmaW5pdHkgewogICAgb3BhY2l0eTogMS4wOwp9Ci5saWdodCAjdG9wby1wLWluc3RhbmNlIC5vbm9zSW5zdC5tYXN0ZXJzaGlwLmFmZmluaXR5IHN2ZyByZWN0IHsKICAgIGZpbHRlcjogdXJsKCNibHVlLWdsb3cpOwp9Ci5kYXJrICN0b3BvLXAtaW5zdGFuY2UgLm9ub3NJbnN0Lm1hc3RlcnNoaXAuYWZmaW5pdHkgc3ZnIHJlY3QgewogICAgZmlsdGVyOiB1cmwoI3llbGxvdy1nbG93KTsKfQoubGlnaHQuZmlyZWZveCAjdG9wby1wLWluc3RhbmNlIC5vbm9zSW5zdC5tYXN0ZXJzaGlwLmFmZmluaXR5IHN2ZyByZWN0IHsKICAgIGZpbHRlcjogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWw7dXRmOCwgPHN2ZyB4bWxucyA9IFwnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcJz48ZmlsdGVyIHg9XCItNTAlXCIgeT1cIi01MCVcIiB3aWR0aD1cIjIwMCVcIiBoZWlnaHQ9XCIyMDAlXCIgaWQ9XCJibHVlLWdsb3dcIj48ZmVDb2xvck1hdHJpeCB0eXBlPVwibWF0cml4XCIgdmFsdWVzPVwiMCAwIDAgMCAgMCAwIDAgMCAwICAwIDAgMCAwIDAgIDAuNyAwIDAgMCAxICAwIFwiPjwvZmVDb2xvck1hdHJpeD48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPVwiM1wiIHJlc3VsdD1cImNvbG9yZWRCbHVyXCI+PI3x71bvCw8AQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADTEL0AAQAbmrcCoBzbAqAdgls8f9aNq2NMOvqY9gBAhZtAsAAABAQgKALfimgBiKZGN8e9WNQwPAJILAACSCwAAaPcoH9LFCAAnrR4TCABFAAuEf0ZAAEAGIEfAqAdgwKgHNh/1ls8OvqY9o2rY04AQA4KbXQAAAQEICgBiKZEAt+KaL2ZlR2F1c3NpYW5CbHVyPjxmZU1lcmdlPjxmZU1lcmdlTm9kZSBpbj1cImNvbG9yZWRCbHVyXCI+PC9mZU1lcmdlTm9kZT48ZmVNZXJnZU5vZGUgaW49XCJTb3VyY2VHcmFwaGljXCI+PC9mZU1lcmdlTm9kZT48L2ZlTWVyZ2U+PC9maWx0ZXI+PC9zdmc+I2JsdWUtZ2xvdyIpOwp9Ci5kYXJrLmZpcmVmb3ggI3RvcG8tcC1pbnN0YW5jZSAub25vc0luc3QubWFzdGVyc2hpcC5hZmZpbml0eSBzdmcgcmVjdCB7CiAgICBmaWx0ZXI6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sO3V0ZjgsIDxzdmcgeG1sbnMgPSBcJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCc+PGZpbHRlciB4PVwiLTUwJVwiIHk9XCItNTAlXCIgd2lkdGg9XCIyMDAlXCIgaGVpZ2h0PVwiMjAwJVwiIGlkPVwieWVsbG93LWdsb3dcIj48ZmVDb2xvck1hdHJpeCB0eXBlPVwibWF0cml4XCIgdmFsdWVzPVwiMCAwIDAgMCAgMS4wIDAgMCAwIDAgIDEuMCAwIDAgMCAwICAwLjMgMCAwIDAgMSAgMCBcIj48L2ZlQ29sb3JNYXRyaXg+PGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj1cIjNcIiByZXN1bHQ9XCJjb2xvcmVkQmx1clwiPjwvZmVHYXVzc2lhbkJsdXI+PGZlTWVyZ2U+PGZlTWVyZ2VOb2RlIGluPVwiY29sb3JlZEJsdXJcIj48L2ZlTWVyZ2VOb2RlPjxmZU1lcmdlTm9kZSBpbj1cIlNvdXJjZUdyYXBoaWNcIj48L2ZlTWVyZ2VOb2RlPjwvZmVNZXJnZT48L2ZpbHRlcj48L3N2Zz4jeWVsbG93LWdsb3ciKTsKfQoKCi8qIC0tLSBUb29sYmFyIC0tLSAqLwoKI3Rvb2xiYXItdG9wby10YmFyIC50YmFyLXJvdy5yaWdodCB7CiAgICB3aWR0aDogMTAwJTsKfQoKI3Rvb2xiYXItdG9wby10YmFyIC50YmFyLXJvdy10ZXh0IHsKICAgIGhlaWdodDogMjFweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgcGFkZGluZzogOHB4IDYwcHggMCAwOwogICAgZm9udC1zdHlsZTogaXRhbGljOwp9CgoKLyogLS0tIFRvcG8gTm9kZXMgLS0tICovCgojb3YtdG9wbyBzdmcgLnN1cHByZXNzZWQgewogICAgb3BhY2l0eTogMC41ICFpbXBvcnRhbnQ7Cn0KCiNvdi10b3BvIHN2ZyAuc3VwcHJlc3NlZG1heCB7CiAgICBvcGFjaXR5OiAwLjIgIWltcG9ydGFudDsKfQoKI292LXRvcG8gc3ZnIC5ub2RlIHsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLmxpZ2h0ICNvdi10b3BvIHN2ZyAubm9kZS5zZWxlY3RlZCByZWN0LAoubGlnaHQgI292LXRvcG8gc3ZnIC5ub2RlLnNlbGVjdGVkIGNpcmNsZSB7CiAgICBmaWxsOiAjZjkwOwogICAgZmlsdGVyOiB1cmwoI2JsdWUtZ2xvdyk7Cn0KLmRhcmsgI292LXRvcG8gc3ZnIC5ub2RlLnNlbGVjdGVkIHJlY3QsCi5kYXJrICNvdi10b3BvIHN2ZyAubm9kZS5zZWxlY3RlZCBjaXJjbGUgewogICAgZmlsbDogI2Y5MDsKICAgIGZpbHRlcjogdXJsKCN5ZWxsb3ctZ2xvdyk7Cn0KLmxpZ2h0LmZpcmVmb3ggI292LXRvcG8gc3ZnIC5ub2RlLnNlbGVjdGVkIHJlY3QsCi5saWdodC5maXJlZm94ICNvdi10b3BvIHN2ZyAubm9kZS5zZWxlY3RlZCBjaXJjbGUgewogICAgZmlsdGVyOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbDt1dGY4LCA8c3ZnIHhtbG5zID0gXCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wnPjxmaWx0ZXIgeD1cIi01MCVcIiB5PVwiLTUwJVwiIHdpZHRoPVwiMjAwJVwiIGhlaWdodD1cIjIwMCVcIiBpZD1cImJsdWUtZ2xvd1wiPjxmZUNvbG9yTWF0cml4IHR5cGU9XCJtYXRyaXhcIiB2YWx1ZXM9XCIwIDAgMCAwICAwIDAgMCAwIDAgIDAgMCAwIDAgMCAgMC43IDAgMCAwIDEgIDAgXCI+PC9mZUNvbG9yTWF0cml4PjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249XCIzXCIgcmVzdWx0PVwiY29sb3JlZEJsdXJcIj48L2ZlR2F1c3NpYW5CbHVyPjxmZU1lcmdlPjxmZU1lcmdlTm9kZSBpbj1cImNvbG9yZWRCbHVyXCI+PC9mZU1lcmdlTm9kZT48ZmVNZXJnZU5vZGUgaW49XCJTb3VyY2VHcmFwaGljXCI+PC9mZU1lcmdlTm9kZT48L2ZlTWVyZ2U+PC9maWx0ZXI+PC9zdmc+I2JsdWUtZ2xvdyIpOwp9Ci5kYXJrLmZpcmVmb3ggI292LXRvcG8gc3ZnIC5ub2RlLnNlbGVjdGVkIHJlY3QsCi5kYXJrLmZpcmVmb3ggI292LXRvcG8gc3ZnIC5ub2RlLnNlbGVjdGVkIGNpcmNsZSB7CiAgICBmaWx0ZXI6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sO3V0ZjgsIDxzdmcgeG1sbnMgPSBcJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCc+PGZpbHRlciB4PVwiLTUwJVwiIHk9XCItNTAlXCIgd2lkdGg9XCIyMDAlXCIgaGVpZ2h0PVwiMjAwJVwiIGlkPVwieWVsbG93LWdsb3dcIj48ZmVDb2xvck1hdHJpeCB0eXBlPVwibWF0cml4XCIgdmFsdWVzPVwiMCAwIDAgMCAgMS4wIDAgMCAwIDAgIDEuMCAwIDAgMCAwICAwLjMgMCAwIDAgMSAgMCBcIj48L2ZlQ29sb3JNYXRyaXg+PGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj1cIjNcIiByZXN1bHQ9XCJjb2xvcmVkQmx1clwiPjwvZmVHYXVzc2lhbkJsdXI+PGZlTWVyZ2U+PGZlTWVyZ2VOb2RlIGluPVwiY29sb3JlZEJsdXJcIj48L2ZlTWVyZ2VOb2RlPjxmZU1lcmdlTm9kZSBpbj1cIlNvdXJjZUdyYXBoaWNcIj48L2ZlTWVyZ2VOb2RlPjwvZmVNZXJnZT48L2ZpbHRlcj48L3N2Zz4jeWVsbG93LWdsb3ciKTsKfQoKI292LXRvcG8gc3ZnIC5ub2RlIHRleHQgewogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi8qIERldmljZSBOb2RlcyAqLwoKI292LXRvcG8gc3ZnIC5ub2RlLmRldmljZSB7Cn0KCiNvdi10b3BvIHN2ZyAubm9kZS5kZXZpY2UgcmVjdCB7CiAgICBzdHJva2Utd2lkdGg6IDEuNTsKfQoKI292LXRvcG8gc3ZnIC5ub2RlLmRldmljZS5maXhlZCByZWN0IHsKICAgIHN0cm9rZS13aWR0aDogMS41Owp9Ci5saWdodCAjb3YtdG9wbyBzdmcgLm5vZGUuZGV2aWNlLmZpeGVkIHJlY3QgewogICAgc3Ryb2tlOiAjYWFhOwp9Ci5kYXJrICNvdi10b3BvIHN2Z43x71anDA8AQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADTEMEAAQAbmrMCoBzbAqAdgls8f9aNq2NMOvrGNgBAhZsTcAAABAQgKALfimgBiKZGN8e9W2gwPAJ8CAACfAgAACAAnrR4TaPcoH9LFCABFAAKRa8pAAEAGPLbAqAc2wKgHYJbSH/U0h4jbU1IQvIAYDzM1jgAAAQEICgC34poAYimQR0VUIC9vbm9zL3VpL2FwcC92aWV3L2RldmljZS9kZXZpY2UuY3NzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiB0ZXh0L2NzcywqLyo7cT0wLjENClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQqN8e9WEw0PAJILAACSCwAAaPcoH9LFCAAnrR4TCABFAAuEf0hAAEAGIEXAqAdgwKgHNh/1ls8OvrGNo2rY04AQA4KbXQAAAQEICgBiKZEAt+KaIC5ub2RlLmRldmljZS5maXhlZCByZWN0IHsKICAgIHN0cm9rZTogIzk5OTsKfQoKLyogbm90ZTogZGV2aWNlIGlzIG9mZmxpbmUgd2l0aG91dCB0aGUgJ29ubGluZScgY2xhc3MgKi8KLmxpZ2h0ICNvdi10b3BvIHN2ZyAubm9kZS5kZXZpY2UgewogICAgZmlsbDogIzc3NzsKfQouZGFyayAjb3YtdG9wbyBzdmcgLm5vZGUuZGV2aWNlIHsKICAgIGZpbGw6ICM1NTU7Cn0KCi5saWdodCAjb3YtdG9wbyBzdmcgLm5vZGUuZGV2aWNlIHJlY3QgewogICAgc3Ryb2tlOiAjNjY2Owp9Ci5saWdodCAjb3YtdG9wbyBzdmcgLm5vZGUuZGV2aWNlIHJlY3QgewogICAgc3Ryb2tlOiAjOTk5Owp9CgoubGlnaHQgI292LXRvcG8gc3ZnIC5ub2RlLmRldmljZS5vbmxpbmUgewogICAgZmlsbDogIzZlN2ZhMzsKfQouZGFyayAjb3YtdG9wbyBzdmcgLm5vZGUuZGV2aWNlLm9ubGluZSB7CiAgICBmaWxsOiAjNEU1QzdGOwp9CgovKiBub3RlOiBkZXZpY2UgaXMgb2ZmbGluZSB3aXRob3V0IHRoZSAnb25saW5lJyBjbGFzcyAqLwojb3YtdG9wbyBzdmcgLm5vZGUuZGV2aWNlIHRleHQgewogICAgZmlsbDogI2JiYjsKICAgIGZvbnQ6IDEwcHQgc2Fucy1zZXJpZjsKfQoKI292LXRvcG8gc3ZnIC5ub2RlLmRldmljZS5vbmxpbmUgdGV4dCB7CiAgICBmaWxsOiB3aGl0ZTsKfQoKI292LXRvcG8gc3ZnIC5ub2RlLmRldmljZSAuc3ZnSWNvbiByZWN0IHsKICAgIGZpbGw6ICNhYWE7Cn0KI292LXRvcG8gc3ZnIC5ub2RlLmRldmljZSAuc3ZnSWNvbiB1c2UgewogICAgZmlsbDogIzc3NzsKfQojb3YtdG9wbyBzdmcgLm5vZGUuZGV2aWNlLnNlbGVjdGVkIC5zdmdJY29uIHJlY3QgewogICAgZmlsbDogI2Y5MDsKfQojb3YtdG9wbyBzdmcgLm5vZGUuZGV2aWNlLm9ubGluZSAuc3ZnSWNvbiByZWN0IHsKICAgIGZpbGw6ICNjY2M7Cn0KI292LXRvcG8gc3ZnIC5ub2RlLmRldmljZS5vbmxpbmUgLnN2Z0ljb24gdXNlIHsKICAgIGZpbGw6ICMwMDA7Cn0KI292LXRvcG8gc3ZnIC5ub2RlLmRldmljZS5vbmxpbmUuc2VsZWN0ZWQgLnN2Z0ljb24gcmVjdCB7CiAgICBmaWxsOiAjZjkwOwp9CgovKiBCYWRnZXMgKi8KLyogKC4uLiB3b3JrcyBmb3IgYm90aCBsaWdodCBhbmQgZGFyayB0aGVtZXMuLi4pICovCiNvdi10b3BvIHN2ZyAubm9kZSAuYmFkZ2UgY2lyY2xlIHsKICAgIHN0cm9rZTogI2FhYTsKfQoKI292LXRvcG8gc3ZnIC5ub2RlIC5iYWRnZS5iYWRnZUluZm8gY2lyY2xlIHsKICAgIGZpbGw6ICM5OWQ7Cn0KCiNvdi10b3BvIHN2ZyAubm9kZSAuYmFkZ2UuYmFkZ2VXYXJuIGNpcmNsZSB7CiAgICBmaWxsOiAjZGEyOwp9Cgojb3YtdG9wbyBzdmcgLm5vZGUgLmJhZGdlLmJhZGdlRXJyb3IgY2lyY2xlIHsKICAgIGZpbGw6ICNlNDQ7Cn0KCiNvdi10b3BvIHN2ZyAubm9kZSAuYmFkZ2UgdXNlIHsKICAgIGZpbGw6IHdoaXRlICFpbXBvcnRhbnQ7Cn0KCiNvdi10b3BvIHN2ZyAubm9kZSAuYmFkZ2UuYmFkZ2VJbmZvIHVzZSB7CiAgICBmaWxsOiAjNDQ4Owp9Cgojb3YtdG9wbyBzdmcgLm5vZGUgLmJhZGdlIHRleHQgewogICAgZmlsbDogd2hpdGUgIWltcG9ydGFudDsKfQoKI292LXRvcG8gc3ZnIC5ub2RlIC5iYWRnZS5iYWRnZUluZm8gdGV4dCB7CiAgICBmaWxsOiAjNDQ4Owp9CgovKiBIb3N0IE5vZGVzICovCgojb3YtdG9wbyBzdmcgLm5vZGUuaG9zdCB7Cn0KCiNvdi10b3BvIHN2ZyAubm9kZS5ob3N0IHRleHQgewogICAgc3Ryb2tlOiBub25lOwogICAgZm9udDogOXB0IHNhbnMtc2VyaWY7Cn0KLmxpZ2h0ICNvdi10b3BvIHN2ZyAubm9kZS5ob3N0IHRleHQgewogICAgZmlsbDogIzg0NjsKfQouZGFyayAjb3YtdG9wbyBzdmcgLm5vZGUuaG9zdCB0ZXh0IHsKICAgIGZpbGw6ICNCQjgwOUQ7Cn0KCi5saWdodCBzdmcgLm5vZGUuaG9zdCBjaXJjbGUgewogICAgc3Ryb2tlOiAjMDAwOwogICAgZmlsbDogI2VkYjsKfQouZGFyayBzdmcgLm5vZGUuaG9zdCBjaXJjbGUgewogICAgc3Ryb2tlOiAjZWVlOwogICAgZmlsbDogI0IyQTE4MDsKfQoKLmxpZ2h0IHN2ZyAubm9kZS5ob3N0IC5zdmdJY29uIHsKICAgIGZpbGw6ICM0NDQ7Cn0KLmRhcmsgc3ZnIC5ub2RlLmhvc3QgLnN2Z0ljb24gewogICAgZmlsbDogIzIyMjsKfQoKLyogLS0tIFRvcG8gTGlua3MgLS0tICovCgojb3YtdG9wbyBzdmcgLmxpbmsgewogICAgb3BhY2l0eTogLjk7Cn0KCiNvdi10b3BvIHN2ZyAubGluay5zZWxlY3RlZCwKI292LXRvcG8gc3ZnIC5saW5rLmVuaGFuY2VkIHsKICAgIHN0cm9rZS13aWR0aDogNC41cHg7Cn0KLmxpZ2h0ICNvdi10b3BvIHN2ZyAubGluay5zZWxlY3RlZCwKLmxpZ2h0ICNvdi10b3BvIHN2ZyAubGluay5lbmhhbmNlZCB7CiAgICBmaWx0ZXI6IHVybCgjYmx1ZS1nbG93KTsKfQouZGFyayAjb3YtdG9wbyBzdmcgLmxpbmsuc2VsZWN0ZWQsCi5kYXJrICNvdi10b3BvIHN2ZyAubGluay5lbmhhbmNlZCB7CiAgICBmaWx0ZXI6IHVybCgjeWVsbG93LWdsb3cpOwp9Ci5saWdodC5maXJlZm94ICNvdi10b3BvIHN2ZyAubGluay5zZWxlY3RlZCwKLmxpZ2h0LmZpcmVmb3ggI292LXRvcG8gc3ZnIC5saW5rLmVuaGFuY2VkIHsKICAgIGZpbHRlcjogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWw7dXRmOCwgPHN2ZyB4bWxucyA9IFwnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcJz48ZmlsdGVyIHg9XCItNTAlXCIgeT1cIi01MCVcIiB3aWR0aD1cIjIwMCVcIiBoZWlnaHQ9XCIyMDAlXCIgaWQ9XCJibHVlLWdsb3dcIj48ZmVDb2xvck1hdHJpeCB0eXBlPVwibWF0cml4XCIgdmFsdWVzPVwiMCAwIDAgMCAgMCAwIDAgMCAwICAwIDAgMCAwIDAgIDAuNyAwIDAgMCAxICAwIFwiPjwvZmVDb2xvck1hdHJpeD48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPVwiM1wiIHJlc3VsdD1cImNvbG9yZWRCbHVyXCI+PC9mZUdhdXNzaWFuQmx1cj48ZmVNZXJnZY3x71ZcDQ8AQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADTEMUAAQAbmq8CoBzbAqAdgls8f9aNq2NMOvrzdgBAhZrmMAAABAQgKALfimgBiKZGN8e9WYA0PAJsCAACbAgAACAAnrR4TaPcoH9LFCABFAAKNX71AAEAGSMfAqAc2wKgHYJbQH/X5PjJ8azs3dYAYBaRK4QAAAQEICgC34poAYimQR0VUIC9vbm9zL3VpL2FwcC92aWV3L2Zsb3cvZmxvdy5jc3MgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6IHRleHQvY3NzLCovKjtxPTAuMQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo3x71Z9DQ8AkgsAAJILAABo9ygf0sUIACetHhMIAEUAC4R/SkAAQAYgQ8CoB2DAqAc2H/WWzw6+vN2jatjTgBADgptdAAABAQgKAGIpkQC34po+PGZlTWVyZ2VOb2RlIGluPVwiY29sb3JlZEJsdXJcIj48L2ZlTWVyZ2VOb2RlPjxmZU1lcmdlTm9kZSBpbj1cIlNvdXJjZUdyYXBoaWNcIj48L2ZlTWVyZ2VOb2RlPjwvZmVNZXJnZT48L2ZpbHRlcj48L3N2Zz4jYmx1ZS1nbG93Iik7Cn0KLmRhcmsuZmlyZWZveCAjb3YtdG9wbyBzdmcgLmxpbmsuc2VsZWN0ZWQsCi5kYXJrLmZpcmVmb3ggI292LXRvcG8gc3ZnIC5saW5rLmVuaGFuY2VkIHsKICAgIGZpbHRlcjogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWw7dXRmOCwgPHN2ZyB4bWxucyA9IFwnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcJz48ZmlsdGVyIHg9XCItNTAlXCIgeT1cIi01MCVcIiB3aWR0aD1cIjIwMCVcIiBoZWlnaHQ9XCIyMDAlXCIgaWQ9XCJ5ZWxsb3ctZ2xvd1wiPjxmZUNvbG9yTWF0cml4IHR5cGU9XCJtYXRyaXhcIiB2YWx1ZXM9XCIwIDAgMCAwICAxLjAgMCAwIDAgMCAgMS4wIDAgMCAwIDAgIDAuMyAwIDAgMCAxICAwIFwiPjwvZmVDb2xvck1hdHJpeD48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPVwiM1wiIHJlc3VsdD1cImNvbG9yZWRCbHVyXCI+PC9mZUdhdXNzaWFuQmx1cj48ZmVNZXJnZT48ZmVNZXJnZU5vZGUgaW49XCJjb2xvcmVkQmx1clwiPjwvZmVNZXJnZU5vZGU+PGZlTWVyZ2VOb2RlIGluPVwiU291cmNlR3JhcGhpY1wiPjwvZmVNZXJnZU5vZGU+PC9mZU1lcmdlPjwvZmlsdGVyPjwvc3ZnPiN5ZWxsb3ctZ2xvdyIpOwoKfQoKI292LXRvcG8gc3ZnIC5saW5rLmluYWN0aXZlIHsKICAgIG9wYWNpdHk6IC41OwogICAgc3Ryb2tlLWRhc2hhcnJheTogOCA0Owp9Ci8qIEZJWE1FOiBSZXZpZXcgZm9yIG5vdC1wZXJtaXR0ZWQgbGlua3MgKi8KI292LXRvcG8gc3ZnIC5saW5rLm5vdC1wZXJtaXR0ZWQgewogICAgc3Ryb2tlOiByZ2IoMjU1LDAsMCk7CiAgICBzdHJva2Utd2lkdGg6IDUuMDsKICAgIHN0cm9rZS1kYXNoYXJyYXk6IDggNDsKfQoKI292LXRvcG8gc3ZnIC5saW5rLnNlY29uZGFyeSB7CiAgICBzdHJva2Utd2lkdGg6IDNweDsKfQoubGlnaHQgI292LXRvcG8gc3ZnIC5saW5rLnNlY29uZGFyeSB7CiAgICBzdHJva2U6IHJnYmEoMCwxNTMsNTEsMC41KTsKfQouZGFyayAjb3YtdG9wbyBzdmcgLmxpbmsuc2Vjb25kYXJ5IHsKICAgIHN0cm9rZTogcmdiYSgxMjEsMjMxLDE1OCwwLjUpOwp9CgovKiBQb3J0IHRyYWZmaWMgY29sb3IgdmlzdWFsaXphdGlvbiBmb3IgS2JwcywgTWJwcywgYW5kIEdicHMgKi8KCi5saWdodCAjb3YtdG9wbyBzdmcgLmxpbmsuc2Vjb25kYXJ5LnBvcnQtdHJhZmZpYy1LYnBzIHsKICAgIHN0cm9rZTogcmdiKDAsMTUzLDUxKTsKICAgIHN0cm9rZS13aWR0aDogNS4wOwp9Ci5kYXJrICNvdi10b3BvIHN2ZyAubGluay5zZWNvbmRhcnkucG9ydC10cmFmZmljLUticHMgewogICAgc3Ryb2tlOiByZ2IoOTgsIDE1MywgMTE4KTsKICAgIHN0cm9rZS13aWR0aDogNS4wOwp9CgoubGlnaHQgI292LXRvcG8gc3ZnIC5saW5rLnNlY29uZGFyeS5wb3J0LXRyYWZmaWMtTWJwcyB7CiAgICBzdHJva2U6IHJnYigxMjgsMTQ1LDI3KTsKICAgIHN0cm9rZS13aWR0aDogNi41Owp9Ci5kYXJrICNvdi10b3BvIHN2ZyAubGluay5zZWNvbmRhcnkucG9ydC10cmFmZmljLU1icHMgewogICAgc3Ryb2tlOiByZ2IoOTEsIDEwOSwgNTQpOwogICAgc3Ryb2tlLXdpZHRoOiA2LjU7Cn0KCi5saWdodCAjb3YtdG9wbyBzdmcgLmxpbmsuc2Vjb25kYXJ5LnBvcnQtdHJhZmZpYy1HYnBzIHsKICAgIHN0cm9rZTogcmdiKDI1NSwgMTM3LCAzKTsKICAgIHN0cm9rZS13aWR0aDogOC4wOwp9Ci5kYXJrICNvdi10b3BvIHN2ZyAubGluay5zZWNvbmRhcnkucG9ydC10cmFmZmljLUdicHMgewogICAgc3Ryb2tlOiByZ2IoMTc0LCAxMTksIDU1KTsKICAgIHN0cm9rZS13aWR0aDogOC4wOwp9CgoubGlnaHQgI292LXRvcG8gc3ZnIC5saW5rLnNlY29uZGFyeS5wb3J0LXRyYWZmaWMtR2Jwcy1jaG9rZWQgewogICAgc3Ryb2tlOiByZ2IoMTgzLCAzMCwgMjEpOwogICAgc3Ryb2tlLXdpZHRoOiA4LjA7Cn0KLmRhcmsgI292LXRvcG8gc3ZnIC5saW5rLnNlY29uZGFyeS5wb3J0LXRyYWZmaWMtR2Jwcy1jaG9rZWQgewogICAgc3Ryb2tlOiByZ2IoMTI3LCA0MCwgMzkpOwogICAgc3Ryb2tlLXdpZHRoOiA4LjA7Cn0KCgojb3YtdG9wbyBzdmcgLmxpbmsuYW5pbWF0ZWQgewogICAgc3Ryb2tlLWRhc2hhcnJheTogOCA1OwogICAgYW5pbWF0aW9uOiBhbnRzIDVzIGluZmluaXRlIGxpbmVhcjsKICAgIC8qIGJlbG93IGxpbmUgd2lsbCBiZSBhZGRlZCB2aWEgSmF2YXNjcmlwdCBiYXNlZCBvbiBwYXRoICovCiAgICAvKmFuaW1hdGlvbi1kaXJlY3Rpb246IHJldmVyc2U7Ki8KfQpAa2V5ZnJhbWVzIGFudHMgewogICAgZnJvbSB7CiAgICAgICAgc3Ryb2tlLWRhc2hvZmZzZXQ6IDA7CiAgICB9CiAgICB0byB7CiAgICAgICAgc3Ryb2tlLWRhc2hvZmZzZXQ6IDQwMDsKICAgIH0KfQoKI292LXRvcG8gc3ZnIC5saW5rLnByaW1hcnkgewogICAgc3Ryb2tlLXdpZHRoOiA0cHg7Cn0KLmxpZ2h0ICNvdi10b3BvIHN2ZyAubGluay5wcmltYXJ5IHsKICAgIHN0cm9rZTogI2ZmQTMwMDsKfQouZGFyayAjb3YtdG9wbyBzdmcgLmxpbmsucHJpbWFyeSB7CiAgICBzdHJva2U6ICNENThFMEY7Cn0KCiNvdi10b3BvIHN2ZyAubGluay5zZWNvbmRhcnkub3B0aWNhbCB7CiAgICBzdHJva2Utd2lkdGg6IDRweDsKfQoubGlnaHQgI292LXRvcG8gc3ZnIC5saW5rLnNlY29uZGFyeS5vcHRpY2FsIHsKICAgIHN0cm9rZTogcmdiYSgxMjgsNjQsMjU1LDAuNSk7Cn0KLmRhcmsgI292LXRvcG8gc3ZnIC5saW5rLnNlY29uZGFyeS5vcHRpY2FsIHsKICAgIHN0cm9rZTogcmdiYSgxNjQsMTM5LDIxNSwwLjUpOwp9Cgojb3YtdG9wbyBzdmcgLmxpbmsucHJpbWFyeS5vcHRpY2FsIHsKICAgIHN0cm9rZS13aWR0aDogjfHvVqsNDwBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANMQyQABABuaqwKgHNsCoB2CWzx/1o2rY0w6+yC2AECFmrjwAAAEBCAoAt+KaAGIpkY3x71avDQ8AmwIAAJsCAAAIACetHhNo9ygf0sUIAEUAAo3iXUAAQAbGJsCoBzbAqAdgltQf9UDd65qhrxSXgBgHoCeBAAABAQgKALfimgBiKZBHRVQgL29ub3MvdWkvYXBwL3ZpZXcvcG9ydC9wb3J0LmNzcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogdGV4dC9jc3MsKi8qO3E9MC4xDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0KjfHvVssNDwCUCgAAlAoAAGj3KB/SxQgAJ60eEwgARQAKhn9MQABABiE/wKgHYMCoBzYf9ZbPDr7ILaNq2NOAGAOCml8AAAEBCAoAYimRALfimjZweDsKfQoubGlnaHQgI292LXRvcG8gc3ZnIC5saW5rLnByaW1hcnkub3B0aWNhbCB7CiAgICBzdHJva2U6ICM3NGY7Cn0KLmRhcmsgI292LXRvcG8gc3ZnIC5saW5rLnByaW1hcnkub3B0aWNhbCB7CiAgICBzdHJva2U6ICM3MzUyQ0Q7Cn0KCi8qIExpbmsgTGFiZWxzICovCgojb3YtdG9wbyBzdmcgLmxpbmtMYWJlbCByZWN0IHsKICAgIHN0cm9rZTogbm9uZTsKfQoubGlnaHQgI292LXRvcG8gc3ZnIC5saW5rTGFiZWwgcmVjdCB7CiAgICBmaWxsOiAjZWVlOwp9Ci5kYXJrICNvdi10b3BvIHN2ZyAubGlua0xhYmVsIHJlY3QgewogICAgZmlsbDogIzU1NTsKfQoKI292LXRvcG8gc3ZnIC5saW5rTGFiZWwgdGV4dCB7CiAgICB0ZXh0LWFuY2hvcjogbWlkZGxlOwogICAgc3Ryb2tlLXdpZHRoOiAwLjE7CiAgICBmb250LXNpemU6IDlwdDsKfQoubGlnaHQgI292LXRvcG8gc3ZnIC5saW5rTGFiZWwgdGV4dCB7CiAgICBmaWxsOiAjNDQ0Owp9Ci5kYXJrICNvdi10b3BvIHN2ZyAubGlua0xhYmVsIHRleHQgewogICAgZmlsbDogI2VlZTsKfQoKLyogUG9ydCBMYWJlbHMgKi8KCiNvdi10b3BvIHN2ZyAucG9ydExhYmVsIHJlY3QgewogICAgc3Ryb2tlOiBub25lOwp9Ci5saWdodCAjb3YtdG9wbyBzdmcgLnBvcnRMYWJlbCByZWN0IHsKICAgIGZpbGw6ICNlZWU7Cn0KLmRhcmsgI292LXRvcG8gc3ZnIC5wb3J0TGFiZWwgcmVjdCB7CiAgICBmaWxsOiAjMjIyOwp9Cgojb3YtdG9wbyBzdmcgLnBvcnRMYWJlbCB0ZXh0IHsKICAgIHRleHQtYW5jaG9yOiBtaWRkbGU7CiAgICBzdHJva2Utd2lkdGg6IDAuMTsKICAgIGZvbnQtc2l6ZTogMTFwdDsKfQoubGlnaHQgI292LXRvcG8gc3ZnIC5wb3J0TGFiZWwgdGV4dCB7CiAgICBmaWxsOiAjNDQ0Owp9Ci5kYXJrICNvdi10b3BvIHN2ZyAucG9ydExhYmVsIHRleHQgewogICAgZmlsbDogI2VlZTsKfQoKLyogTnVtYmVyIG9mIExpbmtzIExhYmVscyAqLwojb3YtdG9wbyBsaW5lLm51bUxpbmtIYXNoIHsKICAgIHN0cm9rZS13aWR0aDogMzsKfQoKI292LXRvcG8gdGV4dC5udW1MaW5rVGV4dCB7CiAgICBmb250LXNpemU6IDE1cHQ7Cn0KCiNvdi10b3BvIHRleHQubnVtTGlua1RleHQgewogICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKfQoKLmxpZ2h0ICNvdi10b3BvIHRleHQubnVtTGlua1RleHQgewogICAgZmlsbDogIzQ0NDsKfQouZGFyayAjb3YtdG9wbyB0ZXh0Lm51bUxpbmtUZXh0IHsKICAgIGZpbGw6ICNlZWU7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogU3ByaXRlIExheWVyICovCgojb3YtdG9wbyBzdmcgI3RvcG8tc3ByaXRlcyB1c2UgewogICAgc3Ryb2tlLXdpZHRoOiAyOwp9CiNvdi10b3BvIHN2ZyAjdG9wby1zcHJpdGVzIHRleHQgewogICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgIGZvbnQtc2l6ZTogMjBwdDsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKfQoKLmxpZ2h0ICNvdi10b3BvIHN2ZyAjdG9wby1zcHJpdGVzIC5nb2xkMSB1c2UgewogICAgc3Ryb2tlOiAjZmRhOwogICAgZmlsbDogbm9uZTsKfQouZGFyayAjb3YtdG9wbyBzdmcgI3RvcG8tc3ByaXRlcyAuZ29sZDEgdXNlIHsKICAgIHN0cm9rZTogIzU0MTsKICAgIGZpbGw6IG5vbmU7Cn0KLmxpZ2h0ICNvdi10b3BvIHN2ZyAjdG9wby1zcHJpdGVzIC5nb2xkMSB0ZXh0IHsKICAgIGZpbGw6ICNlZGE7Cn0KLmRhcmsgI292LXRvcG8gc3ZnICN0b3BvLXNwcml0ZXMgLmdvbGQxIHRleHQgewogICAgZmlsbDogIzU0MzsKfQoKLmxpZ2h0ICNvdi10b3BvIHN2ZyAjdG9wby1zcHJpdGVzIC5ibHVlMSB1c2UgewogICAgc3Ryb2tlOiAjYmJkOwogICAgZmlsbDogbm9uZTsKfQouZGFyayAjb3YtdG9wbyBzdmcgI3RvcG8tc3ByaXRlcyAuYmx1ZTEgdXNlIHsKICAgIHN0cm9rZTogIzQ0NTsKICAgIGZpbGw6IG5vbmU7Cn0KLmxpZ2h0ICNvdi10b3BvIHN2ZyAjdG9wby1zcHJpdGVzIC5ibHVlMSB0ZXh0IHsKICAgIGZpbGw6ICNjY2U7Cn0KLmRhcmsgI292LXRvcG8gc3ZnICN0b3BvLXNwcml0ZXMgLmJsdWUxIHRleHQgewogICAgZmlsbDogIzQ0NjsKfQoKLmxpZ2h0ICNvdi10b3BvIHN2ZyAjdG9wby1zcHJpdGVzIC5ncmF5MSB1c2UgewogICAgc3Ryb2tlOiAjY2NjOwogICAgZmlsbDogbm9uZTsKfQouZGFyayAjb3YtdG9wbyBzdmcgI3RvcG8tc3ByaXRlcyAuZ3JheTEgdXNlIHsKICAgIHN0cm9rZTogIzMzMzsKICAgIGZpbGw6IG5vbmU7Cn0KLmxpZ2h0ICNvdi10b3BvIHN2ZyAjdG9wby1zcHJpdGVzIC5ncmF5MSB0ZXh0IHsKICAgIGZpbGw6ICNkZGQ7Cn0KLmRhcmsgI292LXRvcG8gc3ZnICN0b3BvLXNwcml0ZXMgLmdyYXkxIHRleHQgewogICAgZmlsbDogIzQ0NDsKfQoKLyogZmlsbHMgKi8KLmxpZ2h0ICNvdi10b3BvIHN2ZyAjdG9wby1zcHJpdGVzIHVzZS5maWxsLWdyYXkyIHsKICAgIGZpbGw6ICNlZWU7Cn0KLmRhcmsgI292LXRvcG8gc3ZnICN0b3BvLXNwcml0ZXMgdXNlLmZpbGwtZ3JheTIgewogICAgZmlsbDogIzQ0NDsKfQoKLmxpZ2h0ICNvdi10b3BvIHN2ZyAjdG9wby1zcHJpdGVzIHVzZS5maWxsLWJsdWUyIHsKICAgIGZpbGw6ICNiY2U7Cn0KLmRhcmsgI292LXRvcG8gc3ZnICN0b3BvLXNwcml0ZXMgdXNlLmZpbGwtYmx1ZTIgewogICAgZmlsbDogIzQ0NzsKfQoKjfHvVvoNDwBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANMQzQABABuapwKgHNsCoB2CWzx/1o2rY0w6+0n+AECFmo+oAAAEBCAoAt+KaAGIpkY3x71btEg8AnQIAAJ0CAAAIACetHhNo9ygf0sUIAEUAAo/ENEAAQAbkTcCoBzbAqAdgls8f9aNq2NMOvtJ/gBghZvrFAAABAQgKALfimwBiKZFHRVQgL29ub3MvdWkvYXBwL3ZpZXcvZ3JvdXAvZ3JvdXAuY3NzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiB0ZXh0L2NzcywqLyo7cT0wLjENClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQqN8e9WASQPAIAAAACAAAAAaPcoH9LFCAAnrR4TCABFAAByzLVAAEAG3enAqAdgwKgHNh/1ltFale2WjJfLn4AYAwyQSwAAAQEICgBiKZIAt+KYSFRUUC8xLjEgMzA0IE5vdCBNb2RpZmllZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQqN8e9WGygPAJILAACSCwAAaPcoH9LFCAAnrR4TCABFAAuEK+1AAEAGc6DAqAdgwKgHNh/1ltNygxGGYRx1TYAQAtabXQAAAQEICgBiKZIAt+KYSFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvamF2YXNjcmlwdA0KQ29udGVudC1MZW5ndGg6IDU0NTINClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KLyoKICogQ29weXJpZ2h0IDIwMTQtMjAxNiBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBNYWluIEFwcGxpY2F0aW9uIE1vZHVsZQogKi8KCihmdW5jdGlvbiAoKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8gaW5qZWN0ZWQgcmVmcwogICAgdmFyICRsb2c7CgogICAgLy8gZGVmaW5lIGNvcmUgbW9kdWxlIGRlcGVuZGVuY2llcyBoZXJlLi4uCiAgICB2YXIgY29yZURlcGVuZGVuY2llcyA9IFsKICAgICAgICAnbmdSb3V0ZScsCiAgICAgICAgJ29ub3NNYXN0JywKICAgICAgICAnb25vc05hdicsCiAgICAgICAgJ29ub3NVdGlsJywKICAgICAgICAnb25vc1N2ZycsCiAgICAgICAgJ29ub3NSZW1vdGUnLAogICAgICAgICdvbm9zTGF5ZXInLAogICAgICAgICdvbm9zV2lkZ2V0JwogICAgXTsKCiAgICAvLyB2aWV3IElEcy4uIGluamVjdGVkIHZpYSB0aGUgc2VydmxldAogICAgdmFyIHZpZXdJZHMgPSBbCiAgICAgICAgCiAgICAgICAgJ2FwcCcsCiAgICAgICAgJ3NldHRpbmdzJywKICAgICAgICAnY2x1c3RlcicsCiAgICAgICAgJ3Byb2Nlc3NvcicsCiAgICAgICAgJ3RvcG8nLAogICAgICAgICdkZXZpY2UnLAogICAgICAgICdmbG93JywKICAgICAgICAncG9ydCcsCiAgICAgICAgJ2dyb3VwJywKICAgICAgICAnbWV0ZXInLAogICAgICAgICdsaW5rJywKICAgICAgICAnaG9zdCcsCiAgICAgICAgJ2ludGVudCcsCiAgICAgICAgJ3R1bm5lbCcsCgogICAgICAgIC8vIGR1bW15IGVudHJ5CiAgICAgICAgJycKICAgIF07CgogICAgLy8gc2VjcmV0IHNhdWNlCiAgICB2YXIgc2F1Y2UgPSBbCiAgICAgICAgJzY6Njk4NTc2NjYnLAogICAgICAgICc5OjgyNjk3MCcsCiAgICAgICAgJzIyOjgwNjk4Mjg2NjcnLAogICAgICAgICc2OjY5ODU3MDY4ODY2OTg4Nzk2NycsCiAgICAgICAgJzc6Njk3MTgwNjg4OTg0NzE4NicsCiAgICAgICAgJzIyOjgzNjk4Njc2ODInLAogICAgICAgICcxMzo3MzY1ODMnLAogICAgICAgICc3OjY2NzE4NjY5ODM4NCcsCiAgICAgICAgJzE6ODU3NzgwODg4Nzc4ODc2Nzg3JywKICAgICAgICAnMjA6NzA3MTcwNjYnLAogICAgICAgICcyNDo4ODY3NzQ4Njg0NjknCiAgICBdOwoKICAgIHZhciBkZWZhdWx0VmlldyA9ICd0b3BvJywKICAgICAgICB2aWV3RGVwZW5kZW5jaWVzID0gW107CgogICAgdmlld0lkcy5mb3JFYWNoKGZ1bmN0aW9uIChpZCkgewogICAgICAgIGlmIChpZCkgewogICAgICAgICAgICB2aWV3RGVwZW5kZW5jaWVzLnB1c2goJ292JyArIGNhcChpZCkpOwogICAgICAgIH0KICAgIH0pOwoKICAgIHZhciBtb2R1bGVEZXBlbmRlbmNpZXMgPSBjb3JlRGVwZW5kZW5jaWVzLmNvbmNhdCh2aWV3RGVwZW5kZW5jaWVzKTsKCiAgICBmdW5jdGlvbiBzYXVjeShlZSwga3MpIHsKICAgICAgICB2YXIgbWFwID0gZWUuZ2VuTWFwKHNhdWNlKTsKICAgICAgICBPYmplY3Qua2V5cyhtYXApLmZvckVhY2goZnVuY3Rpb24gKGspIHsKICAgICAgICAgICAga3MuYWRkU2VxKGssIG1hcFtrXSk7CiAgICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gY2FwKHMpIHsKICAgICAgICByZXR1cm4gcyA/IHNbMF0udG9VcHBlckNhc2UoKSArIHMuc2xpY2UoMSkgOiBzOwogICAgfQoKICAgIGFuZ3VsYXIubW9kdWxlKCdvbm9zQXBwJywgbW9kdWxlRGVwZW5kZW5jaWVzKQoKICAgICAgICAuY29udHJvbGxlcignT25vc0N0cmwnLCBbCiAgICAgICAgICAgICckbG9nJywgJyRzY29wZScsICckcm91dGUnLCAnJHJvdXRlUGFyYW1zJywgJyRsb2NhdGlvbicsCiAgICAgICAgICAgICdLZXlTZXJ2aWNlJywgJ1RoZW1lU2VydmljZScsICdHbHlwaFNlcnZpY2UnLCAnVmVpbFNlcnZpY2UnLAogICAgICAgICAgICAnUGFuZWxTZXJ2aWNlJywgJ0ZsYXNoU2VydmljZScsICdRdWlja0hlbHBTZXJ2aWNlJywgJ0VlU2VydmljZScsCiAgICAgICAgICAgICdXZWJTb2NrZXRTZXJ2aWNlJywKCiAgICAgICAgICAgIGZ1bmN0aW9uIChfJGxvZ18sICRzY29wZSwgJHJvdXRlLCAkcm91dGVQYXJhbXMsICRsb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgIGtzLCB0cywgZ3MsIHZzLCBwcywgZmxhc2gsIHFocywgZWUsIHdzcykgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICAgICAgICAgICAgJGxvZyA9IF8kbG9nXzsKCiAgICAgICAgICAgICAgICBzZWxmLiRyb3V0ZSA9ICRyb3V0ZTsKICAgICAgICAgICAgICAgIHNlbGYuJHJvdXRlUGFyYW1zID0gJHJvdXRlUI3x71ZmKA8ApwoAAKcKAABo9ygf0sUIACetHhMIAEUACpkr70AAQAZ0icCoB2DAqAc2H/WW03KDHNZhHHVNgBgC1ppyAAABAQgKAGIpkwC34phhcmFtczsKICAgICAgICAgICAgICAgIHNlbGYuJGxvY2F0aW9uID0gJGxvY2F0aW9uOwogICAgICAgICAgICAgICAgc2VsZi52ZXJzaW9uID0gJzEuNS4wJzsKCiAgICAgICAgICAgICAgICAvLyBzaGFyZWQgb2JqZWN0IGluaGVyaXRlZCBieSBhbGwgdmlld3M6CiAgICAgICAgICAgICAgICAkc2NvcGUub25vcyA9IHt9OwoKICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemUgc2VydmljZXMuLi4KICAgICAgICAgICAgICAgIHRzLmluaXQoKTsKICAgICAgICAgICAgICAgIGtzLmluc3RhbGxPbihkMy5zZWxlY3QoJ2JvZHknKSk7CiAgICAgICAgICAgICAgICBrcy5iaW5kUWhzKHFocyk7CiAgICAgICAgICAgICAgICBncy5pbml0KCk7CiAgICAgICAgICAgICAgICB2cy5pbml0KCk7CiAgICAgICAgICAgICAgICBwcy5pbml0KCk7CiAgICAgICAgICAgICAgICBzYXVjeShlZSwga3MpOwogICAgICAgICAgICAgICAgZmxhc2guaW5pdEZsYXNoKCk7CiAgICAgICAgICAgICAgICBxaHMuaW5pdFF1aWNrSGVscCgpOwoKICAgICAgICAgICAgICAgIHdzcy5jcmVhdGVXZWJTb2NrZXQoewogICAgICAgICAgICAgICAgICAgIHdzcG9ydDogJGxvY2F0aW9uLnNlYXJjaCgpLndzcG9ydAogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgJGxvZy5sb2coJ09ub3NDdHJsIGhhcyBiZWVuIGNyZWF0ZWQnKTsKCiAgICAgICAgICAgICAgICAkbG9nLmRlYnVnKCdyb3V0ZTogJywgc2VsZi4kcm91dGUpOwogICAgICAgICAgICAgICAgJGxvZy5kZWJ1Zygncm91dGVQYXJhbXM6ICcsIHNlbGYuJHJvdXRlUGFyYW1zKTsKICAgICAgICAgICAgICAgICRsb2cuZGVidWcoJ2xvY2F0aW9uOiAnLCBzZWxmLiRsb2NhdGlvbik7CiAgICAgICAgICAgIH1dKQoKICAgICAgICAuY29uZmlnKFsnJHJvdXRlUHJvdmlkZXInLCBmdW5jdGlvbiAoJHJvdXRlUHJvdmlkZXIpIHsKICAgICAgICAgICAgLy8gSWYgdmlldyBJRCBub3QgcHJvdmlkZWQsIHJvdXRlIHRvIHRoZSBkZWZhdWx0IHZpZXcKICAgICAgICAgICAgJHJvdXRlUHJvdmlkZXIKICAgICAgICAgICAgICAgIC5vdGhlcndpc2UoewogICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VG86ICcvJyArIGRlZmF1bHRWaWV3CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGZ1bmN0aW9uIHZpZXdDdHJsTmFtZSh2aWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnT3YnICsgY2FwKHZpZCkgKyAnQ3RybCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZ1bmN0aW9uIHZpZXdUZW1wbGF0ZVVybCh2aWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnYXBwL3ZpZXcvJyArIHZpZCArICcvJyArIHZpZCArICcuaHRtbCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEFkZCByb3V0ZXMgZm9yIGVhY2ggZGVmaW5lZCB2aWV3LgogICAgICAgICAgICB2aWV3SWRzLmZvckVhY2goZnVuY3Rpb24gKHZpZCkgewogICAgICAgICAgICAgICAgaWYgKHZpZCkgewogICAgICAgICAgICAgICAgICAgICRyb3V0ZVByb3ZpZGVyLndoZW4oJy8nICsgdmlkLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6IHZpZXdDdHJsTmFtZSh2aWQpLAogICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyQXM6ICdjdHJsJywKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6IHZpZXdUZW1wbGF0ZVVybCh2aWQpCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH1dKQoKICAgICAgICAuZGlyZWN0aXZlKCdkZXRlY3RCcm93c2VyJywgWyckbG9nJywgJ0ZuU2VydmljZScsCiAgICAgICAgICAgIGZ1bmN0aW9uICgkbG9nLCBmcykgewogICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzY29wZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBib2R5ID0gZDMuc2VsZWN0KCdib2R5JyksCiAgICAgICAgICAgICAgICAgICAgICAgIGJyb3dzZXIgPSAnJzsKICAgICAgICAgICAgICAgICAgICBpZiAoZnMuaXNDaHJvbWUoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBicm93c2VyID0gJ2Nocm9tZSc7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmcy5pc1NhZmFyaSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyb3dzZXIgPSAnc2FmYXJpJzsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZzLmlzRmlyZWZveCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyb3dzZXIgPSAnZmlyZWZveCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJvZHkuY2xhc3NlZChicm93c2VyLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBzY29wZS5vbm9zLmJyb3dzZXIgPSBicm93c2VyOwoKICAgICAgICAgICAgICAgICAgICBpZiAoZnMuaXNNb2JpbGUoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBib2R5LmNsYXNzZWQoJ21vYmlsZScsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5vbm9zLm1vYmlsZSA9IHRydWU7CiAgICAgICAgICAg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ZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCi8qCiAqIENvcHlyaWdodCAyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIERldmljZSBWaWV3IC0tIENTUyBmaWxlCiAqLwoKI292LWRldmljZSBoMiB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCiNvdi1kZXZpY2UgZGl2LmN0cmwtYnRucyB7Cn0KCi5saWdodCAjb3YtZGV2aWNlIC5jdXJyZW50LXZpZXcgdXNlIHsKICAgIGZpbGw6IHdoaXRlOwp9Ci5kYXJrICNvdi1kZXZpY2UgLmN1cnJlbnQtdmlldyB1c2UgewogICAgZmlsbDogIzMwNDg2MDsKfQoKLmxpZ2h0ICNvdi1kZXZpY2UgLmN1cnJlbnQtdmlldyByZWN0IHsKICAgIGZpbGw6IGRlZXBza3libHVlOwp9Ci5kYXJrICNvdi1kZXZpY2UgLmN1cnJlbnQtdmlldyByZWN0IHsKICAgIGZpbGw6ICNlZWU7Cn0KCi8qIE1vcmUgaW4gZ2VuZXJpYyBwYW5lbC5jc3MgKi8KCiNkZXZpY2UtZGV0YWlscy1wYW5lbC5mbG9hdHBhbmVsIHsKICAgIC1tb3otYm9yZGVyLXJhZGl1czogMDsKICAgIGJvcmRlci1yYWRpdXM6IDA7CiAgICB6LWluZGV4OiAwOwp9CgoubGlnaHQgI2RldmljZS1kZXRhaWxzLXBhbmVsLmZsb2F0cGFuZWwgewogICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIyOSwgMjM0LCAyMzcpOwp9Ci5kYXJrICNkZXZpY2UtZGV0YWlscy1wYW5lbC5mbG9hdHBhbmVsIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICMzQTQwNDI7Cn0KCiNkZXZpY2UtZGV0YWlscy1wYW5lbCAuY29udGFpbmVyIHsKICAgIHBhZGRpbmc6IDAgMTJweDsKfQoKI2RldmljZS1kZXRhaWxzLXBhbmVsIC5jbG9zZS1idG4gewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgcmlnaHQ6IDEwcHg7CiAgICB0b3A6IDA7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KLmxpZ2h0IC5jbG9zZS1idG4gc3ZnLmVtYmVkZGVkSWNvbiAuaWNvbi5wbHVzIC5nbHlwaCB7CiAgICBmaWxsOiAjYWFhOwp9Ci5kYXJrIC5jbG9zZS1idG4gc3ZnLmVtYmVkZGVkSWNvbiAuaWNvbi5wbHVzIC5nbHlwaCB7CiAgICBmaWxsOiAjY2NjOwp9CgojZGV2aWNlLWRldGFpbHMtcGFuZWwgLmRldi1pY29uIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIHBhZGRpbmc6IDAgNnB4IDAgMDsKICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cn0KLmxpZ2h0IC5kZXYtaWNvbiBzdmcuZW1iZWRkZWRJY29uIC5nbHlwaCB7CiAgICBmaWxsOiByZ2IoMCwgMTcyLCAyMjkpOwp9Ci5kYXJrIC5kZXYtaWNvbiBzdmcuZW1iZWRkZWRJY29uIC5nbHlwaCB7CiAgICBmaWxsOiAjNDg2RDkxOwp9CgojZGV2aWNlLWRldGFpbHMtcGFuZWwgaDIgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgbWFyZ2luOiA4cHggMDsKfQoKI2RldmljZS1kZXRhaWxzLXBhbmVsIC5lZGl0YWJsZSB7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBib3JkZXItYm90dG9tOiAxcHggZGFzaGVkIGRhcmtncmVlbjsKfQoKI2RldmljZS1kZXRhaWxzLXBhbmVsIGgyIGlucHV0IHsKICAgIGZvbnQtc2l6ZTogMS4wZW07Cn0KCiNkZXZpY2UtZGV0YWlscy1wYW5lbCAudG9wIGRpdi5sZWZ0IHsKICAgIGZsb2F0OiBsZWZ0OwogICAgcGFkZGluZzogMCAxOHB4IDAgMDsKfQojZGV2aWNlLWRldGFpbHMtcGFuZWwgLnRvcCBkaXYucmlnaHQgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9CgojZGV2aWNlLWRldGFpbHMtcGFuZWwgdGQubGFiZWwgewogICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgcGFkZGluZy1yaWdodDogMTJweDsKICAgIC8qIHdvcmtzIGZvciBib3RoIGxpZ2h0IGFuZCBkYXJrIHRoZW1lcyAuLi4gKi8KICAgIGNvbG9yOiAjNzc3Owp9CgojZGV2aWNlLWRldGFpbHMtcGFuZWwgLmFjdGlvbkJ0bnMgZGl2IHsKICAgIHBhZGRpbmc6IDEycHggNnB4Owp9CgojZGV2aWNlLWRldGFpbHMtcGFuZWwgLnRvcCBociB7CiAgICB3aWR0aDogOTUlOwogICAgbWFyZ2luOiAwIGF1dG87Cn0KCi5saWdodCAjZGV2aWNlLWRldGFpbHMtcGFuZWwgaHIgewogICAgb3BhY2l0eTogLjU7CiAgICBib3JkZXItY29sb3I6ICNGRkY7Cn0KLmRhcmsgI2RldmljZS1kZXRhaWxzLXBhbmVsIGhyIHsKICAgIGJvcmRlci1jb2xvcjogIzY2NjsKfQoKI2RldmljZS1kZXRhaWxzLXBhbmVsIC5ib3R0b20gdGFibGUgewogICAgYm9yZGVyLXNwYWNpbmc6IDA7Cn0KCiNkZXZpY2UtZGV0YWlscy1wYW5lbCAuYm90dG9tIHRoIHsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAyZW07Cn0KCi5saWdodCAjZGV2aWNlLWRldGFpbHMtcGFuZWwgLmJvdHRvbSB0aCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDOwogICAgLyogZGVmYXVsdCB0ZXh0IGNvbG9yICovCn0KLmRhcmsgI2RldmljZS1kZXRhaWxzLXBhbmVsIC5ib3R0b20gdGggewogICAgYmFja2dyb3VuZC1jb2xvcjogIzEzMTMxMzsKICAgIGNvbG9yOiAjY2NjOwp9CgojZGV2aWNlLWRldGFpbHMtcGFuZWwgLmJvdHRvbSB0aCwKI2RldmljZS1kZXRhaWxzLXBhbmVsIC5ib3R0b20gdGQgewogICAgcGFkZGluZzogNnB4IDEycHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi5saWdodCAjZGV2aWNlLWRldGFpbHMtcGFuZWwgLmJvdHRvbSB0cjpudGgtY2hpbGQob2RkKSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjlmOWY5Owp9Ci5saWdodCAjZGV2aWNlLWRldGFpbHMtcGFuZWwgLmJvdHRvbSB0cjpudGgtY2hpbGQoZXZlbikgewogICAgYmFja2dyb3VuZC1jb2xvcjogI0VCRURGMjsKfQouZGFyayAjZGV2aWNlLWRldGFpbHMtcGFuZWwgLmJvdHRvbSB0cjpudGgtY2hpbGQob2RkKSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzMzOwp9Ci5kYXJrICNkZXZpY2UtZGV0YWlscy1wYW5lbCAuYm90dG9tIHRyOm50aC1jaGlsZChldmVuKSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNTU1Owp9Co3x71acPQ8AQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADRry0AAQAY/EsCoBzbAqAdgltIf9TSHizhTUh6PgBAPM+HwAAABAQgKALfinQBiKZOO8e9WdwUAAJsCAACbAgAACAAnrR4TaPcoH9LFCABFAAKNa8xAAEAGPLjAqAc2wKgHYJbSH/U0h4s4U1Iej4AYDzPYDQAAAQEICgC34p4AYimTR0VUIC9vbm9zL3VpL2FwcC92aWV3L2hvc3QvaG9zdC5jc3MgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6IHRleHQvY3NzLCovKjtxPTAuMQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71ZHCwAA6AQAAOgEAABo9ygf0sUIACetHhMIAEUABNqBZkAAQAYk0cCoB2DAqAc2H/WW1KGvFJdA3e3zgBgCy5SzAAABAQgKAGIplQC34ppIVFRQLzEuMSAyMDAgT0sNCkNvbnRlbnQtVHlwZTogdGV4dC9jc3MNCkNvbnRlbnQtTGVuZ3RoOiAxMDkyDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCi8qCiAqIENvcHlyaWdodCAyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIFBvcnQgVmlldyAtLSBDU1MgZmlsZQogKi8KCiNvdi1wb3J0IGgyIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKI292LXBvcnQgZGl2LmN0cmwtYnRucyB7Cn0KCi5saWdodCAjb3YtcG9ydCAuY3VycmVudC12aWV3IHVzZSB7CiAgICBmaWxsOiB3aGl0ZTsKfQouZGFyayAjb3YtcG9ydCAuY3VycmVudC12aWV3IHVzZSB7CiAgICBmaWxsOiAjMzA0ODYwOwp9CgoubGlnaHQgI292LXBvcnQgLmN1cnJlbnQtdmlldyByZWN0IHsKICAgIGZpbGw6IGRlZXBza3libHVlOwp9Ci5kYXJrICNvdi1wb3J0IC5jdXJyZW50LXZpZXcgcmVjdCB7CiAgICBmaWxsOiAjZWVlOwp9Cgojb3YtcG9ydCB0ZCB7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KI292LXBvcnQgdGQucmlnaHQgewogICAgdGV4dC1hbGlnbjogcmlnaHQ7Cn0KCiNvdi1wb3J0IHRyLm5vLWRhdGEgdGQgewogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9Co7x71YCEAAAnwIAAJ8CAAAIACetHhNo9ygf0sUIAEUAApHiXkAAQAbGIcCoBzbAqAdgltQf9UDd7fOhrxk9gBgHoFKmAAABAQgKALfinwBiKZVHRVQgL29ub3MvdWkvYXBwL3ZpZXcvaW50ZW50L2ludGVudC5jc3MgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6IHRleHQvY3NzLCovKjtxPTAuMQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71YCEAAApggAAKYIAABo9ygf0sUIACetHhMIAEUACJjMtkAAQAbVwsCoB2DAqAc2H/WW0VqV7dSMl836gBgDF5hxAAABAQgKAGIplQC34pxIVFRQLzEuMSAyMDAgT0sNCkNvbnRlbnQtVHlwZTogdGV4dC9jc3MNCkNvbnRlbnQtTGVuZ3RoOiAyMDUwDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCi8qCiAqIENvcHlyaWdodCAyMDE2IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIE1ldGVyIFZpZXcgLS0gQ1NTIGZpbGUKICovCgojb3YtbWV0ZXIgaDIgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9Cgojb3YtbWV0ZXIgZGl2LmN0cmwtYnRucyB7Cn0KCi5saWdodCAjb3YtbWV0ZXIgLmN1cnJlbnQtdmlldyB1c2UgewogICAgZmlsbDogd2hpdGU7Cn0KLmRhcmsgI292LW1ldGVyIC5jdXJyZW50LXZpZXcgdXNlIHsKICAgIGZpbGw6ICMzMDQ4NjA7Cn0KCi5saWdodCAjb3YtbWV0ZXIgLmN1cnJlbnQtdmlldyByZWN0IHsKICAgIGZpbGw6IGRlZXBza3libHVlOwp9Ci5kYXJrICNvdi1tZXRlciAuY3VycmVudC12aWV3IHJlY3QgewogICAgZmlsbDogI2VlZTsKfQoKLmxpZ2h0ICNvdi1tZXRlciB0cjpudGgtY2hpbGQoNG4gKyAxKSwKLmxpZ2h0ICNvdi1tZXRlciB0cjpudGgtY2hpbGQoNG4gKyAyKSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlOwp9Ci5saWdodCAjb3YtbWV0ZXIgdHI6bnRoLWNoaWxkKDRuICsgMyksCi5saWdodCAjb3YtbWV0ZXIgdHI6bnRoLWNoaWxkKDRuKSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkOwp9Ci5kYXJrICNvdi1tZXRlciB0cjpudGgtY2hpbGQoNG4gKyAxKSwKLmRhcmsgI292LW1ldGVyIHRyOm50aC1jaGlsZCg0biArIDIpIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICM0NDQ7Cn0KLmRhcmsgI292LW1ldGVyIHRyOm50aC1jaGlsZCg0biArIDMpLAouZGFyayAjb3YtbWV0ZXIgdHI6bnRoLWNoaWxkKDRuKSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzMzOwp9CgovKiBoaWdobGlnaHRlZCBjb2xvciAqLwoubGlnaHQgI292LW1ldGVyIHRyOm50aC1jaGlsZCg0biArIDEpLmRhdGEtY2hhbmdlLAoubGlnaHQgI292LW1ldGVyIHRyOm50aC1jaGlsZCg0biArIDIpLmRhdGEtY2hhbmdlLAoubGlnaHQgI292LW1ldGVyIHRyOm50aC1jaGlsZCg0biArIDMpLmRhdGEtY2hhbmdlLAoubGlnaHQgI292LW1ldGVyIHRyOm50aC1jaGlsZCg0bikuZGF0YS1jaGFuZ2UgewogICAgYmFja2dyb3VuZC1jb2xvcjogI0ZERkZEQzsKfQouZGFyayAjb3YtbWV0ZXIgdHI6bnRoLWNoaWxkKDRuICsgMSkuZGF0YS1jaGFuZ2UsCi5kYXJrICNvdi1tZXRlciB0cjpudGgtY2hpbGQoNG4gKyAyKS5kYXRhLWNoYW5nZSwKLmRhcmsgI292LW1ldGVyIHRyOm50aC1jaGlsZCg0biArIDMpLmRhdGEtY2hhbmdlLAouZGFyayAjb3YtbWV0ZXIgdHI6bnRoLWNoaWxkKDRuKS5kYXRhLWNoYW5nZSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNUE1NjAwOwp9Cgojb3YtbWV0ZXIgdGQgewogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CiNvdi1tZXRlciB0ZC5yaWdodCB7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKfQojb3YtbWV0ZXIgdGQuYmFuZHMgewogICAgdGV4dC1hbGlnbjogbGVmdDsKICAgIHBhZGRpbmctbGVmdDogMzZweDsKICAgIG9wYWNpdHk6IDAuNjU7Cn2O8e9WAhAAAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA03a9AAEAGzS3AqAc2wKgHYJbRH/WMl836WpX2OIAQBaRxvQAAAQEICgC34p8AYimVjvHvVscWAACZAgAAmQIAAAgAJ60eE2j3KB/SxQgARQACi92wQABABsrVwKgHNsCoB2CW0R/1jJfN+lqV9jiAGAWks4wAAAEBCAoAt+KfAGIplUdFVCAvb25vcy91aS9hcHAvdmlldy9hcHAvYXBwLmNzcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogdGV4dC9jc3MsKi8qO3E9MC4xDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0KjvHvVvMeAAAIDgAACA4AAGj3KB/SxQgAJ60eEwgARQAN+sy4QABABtBewKgHYMCoBzYf9ZbRWpX2OIyX0FGAGAMindMAAAEBCAoAYimWALfin0hUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2Nzcw0KQ29udGVudC1MZW5ndGg6IDM0MjgNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KLyoKICogQ29weXJpZ2h0IDIwMTUtMjAxNiBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBBcHBsaWNhdGlvbnMgVmlldyAtLSBDU1MgZmlsZQogKi8KCiNvdi1hcHAgaDIgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9Cgojb3YtYXBwIGRpdi5jdHJsLWJ0bnMgewogICAgd2lkdGg6IDI5MHB4Owp9Cgojb3YtYXBwIGZvcm0jaW5wdXRGaWxlRm9ybSwKI292LWFwcCBpbnB1dCN1cGxvYWRGaWxlIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCiNhcHAtZGlhbG9nIHAgewogICAgZm9udC1zaXplOiAxMnB0Owp9Ci5saWdodCAjYXBwLWRpYWxvZyBwIHsKICAgIGNvbG9yOiBkYXJrcmVkOwp9Ci5kYXJrICNhcHAtZGlhbG9nIHAgewogICAgY29sb3I6ICNjNTU7Cn0KCiNhcHAtZGlhbG9nIHAuc3Ryb25nIHsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwp9Ci5saWdodCAjYXBwLWRpYWxvZyBwLnN0cm9uZyB7CiAgICBjb2xvcjogcmVkOwogICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmMDsKfQouZGFyayAjYXBwLWRpYWxvZyBwLnN0cm9uZyB7CiAgICBjb2xvcjogI2M1NTsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkZDQ7Cn0KCgoubGlnaHQgI2FwcC1kaWFsb2cuZmxvYXRwYW5lbC5kaWFsb2cgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKfQouZGFyayAjYXBwLWRpYWxvZy5mbG9hdHBhbmVsLmRpYWxvZyB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNDQ0Owp9CgojYXBwbGljYXRpb24tZGV0YWlscy1wYW5lbC5mbG9hdHBhbmVsIHsKICAgIC1tb3otYm9yZGVyLXJhZGl1czogMDsKICAgIGJvcmRlci1yYWRpdXM6IDA7CiAgICB6LWluZGV4OiAwOwp9CgoubGlnaHQgI2FwcGxpY2F0aW9uLWRldGFpbHMtcGFuZWwuZmxvYXRwYW5lbCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjI5LCAyMzQsIDIzNyk7Cn0KLmRhcmsgI2FwcGxpY2F0aW9uLWRldGFpbHMtcGFuZWwuZmxvYXRwYW5lbCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjM0E0MDQyOwp9CgojYXBwbGljYXRpb24tZGV0YWlscy1wYW5lbCAuY29udGFpbmVyIHsKICAgIHBhZGRpbmc6IDAgMTBweDsKfQoKI2FwcGxpY2F0aW9uLWRldGFpbHMtcGFuZWwgLmNsb3NlLWJ0biB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICByaWdodDogMTBweDsKICAgIHRvcDogMDsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoubGlnaHQgLmNsb3NlLWJ0biBzdmcuZW1iZWRkZWRJY29uIC5pY29uLnBsdXMgLmdseXBoIHsKICAgIGZpbGw6ICNhYWE7Cn0KLmRhcmsgLmNsb3NlLWJ0biBzdmcuZW1iZWRkZWRJY29uIC5pY29uLnBsdXMgLmdseXBoIHsKICAgIGZpbGw6ICNjY2M7Cn0KCiNhcHBsaWNhdGlvbi1kZXRhaWxzLXBhbmVsIC5hcHAtaWNvbiB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICBwYWRkaW5nOiAwIDZweCAwIDA7CiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwp9CgojYXBwbGljYXRpb24tZGV0YWlscy1wYW5lbCBoMiB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICBtYXJnaW46IDhweCAwOwogICAgZm9udC1zaXplOiAxMnB0Owp9CgojYXBwbGljYXRpb24tZGV0YWlscy1wYW5lbCAudG9wIGRpdi5sZWZ0IHsKICAgIGZsb2F0OiBsZWZ0OwogICAgcGFkZGluZzogMCAxMnB4IDAgMDsKfQojYXBwbGljYXRpb24tZGV0YWlscy1wYW5lbCAudG9wIGRpdi5yaWdodCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgd2lkdGg6IDMyMHB4Owp9CgojYXBwbGljYXRpb24tZGV0YWlscy1wYW5lbCB0ZC5sYWJlbCwKI2FwcGxpY2F0aW9uLWRldGFpbHMtcGFuZWwgLmFwcC11cmwgaSB7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICBwYWRkaW5nLXJpZ2h0OiAxMnB4OwogICAgLyogd29ya3MgZm9yIGJvdGggbGlnaHQgYW5kIGRhcmsgdGhlbWVzIC4uLiAqLwogICAgY29sb3I6ICM3Nzc7Cn0KCiNhcHBsaWNhdGlvbi1kZXRhaWxzLXBhbmVsIHRkLnZhbHVlLWJvbGQgewogICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCiNhcHBsaWNhdGlvbi1kZXRhaWxzLXBhbmVsIC5hcHAtdXJsIHsKICAgIHBhZGRpbmc6IDEwcHggNnB4IDZweDsKfQoKI2FwcGxpY2F0aW9uLWRldGFpbHMtcGFuZWwgaHIgewogICAgd2lkdGg6IDk1JTsKICAgIG1hcmdpbjogMTBweCBhdXRvOwp9Ci5saWdodCAjYXBwbGljYXRpb24tZGV0YWlscy1wYW5lbCBociB7CiAgICBvcGFjaXR5OiAuNTsKICAgIGJvcmRlci1jb2xvcjogI0ZGRjsKfQouZGFyayAjYXBwbGljYXRpb24tZGV0YWlscy1wYW5lbCBociB7CiAgICBib3JkZXItY29sb3I6ICM2NjY7Cn0KCiNhcHBsaWNhdGlvbi1kZXRhaWxzLXBhbmVsIC5ib3R0b20gdGFibGUgewogICAgYm9yZGVyLXNwYWNpbmc6IDA7CiAgICB3aWR0aDogMTAwJTsKfQoKI2FwcGxpY2F0aW9uLWRldGFpbHMtcGFuZWwgLmJvdHRvbSB0ZCB7CiAgICBwYWRkaW5nOiA2cHggMTJweDsKICAgIHRleHQtYWxpZ246IGxlZnQ7Cn0KCi5saWdodCAjYXBwbGljYXRpb24tZGV0YWlscy1wYW5lbCAuYm90dG9tIHRyOm50aC1jaGlsZChvZGQpIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7Cn0KLmxpZ2h0ICNhcHBsaWNhdGlvbi1kZXRhaWxzLXBhbmVsIC5ib3R0b20gdHI6bnRoLWNoaWxkKGV2ZW4pIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNFQkVERjI7Cn0KLmRhcmsgI2FwcGxpY2F0aW9uLWRldGFpbHMtcGFuZWwgLmJvdHRvbSB0cjpudGgtY2hpbGQob2RkKSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzMzOwp9Ci5kYXJrICNhcHBsaWNhdGlvbi1kZXRhaWxzLXBhbmVsIC5ib3R0b20gdHI6bnRoLWNoaWxkKGV2ZW4pIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICM1NTU7Cn2O8e9WNCIAANQIAADUCAAAaPcoH9LFCAAnrR4TCABFAAjGgWdAAEAGIOTAqAdgwKgHNh/1ltShrxk9QN3wUIAYAtWYnwAAAQEICgBiKZYAt+KfSFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvY3NzDQpDb250ZW50LUxlbmd0aDogMjA5Ng0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBJbnRlbnQgVmlldyAtLSBDU1MgZmlsZQogKi8KCiNvdi1pbnRlbnQgaDIgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9Cgojb3YtaW50ZW50IGRpdi5jdHJsLWJ0bnMgewp9CgoubGlnaHQgI292LWludGVudCB0cjpudGgtY2hpbGQoNm4gKyAxKSwKLmxpZ2h0ICNvdi1pbnRlbnQgdHI6bnRoLWNoaWxkKDZuICsgMiksCi5saWdodCAjb3YtaW50ZW50IHRyOm50aC1jaGlsZCg2biArIDMpIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWU7Cn0KLmxpZ2h0ICNvdi1pbnRlbnQgdHI6bnRoLWNoaWxkKDZuICsgNCksCi5saWdodCAjb3YtaW50ZW50IHRyOm50aC1jaGlsZCg2biArIDUpLAoubGlnaHQgI292LWludGVudCB0cjpudGgtY2hpbGQoNm4pIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7Cn0KLmRhcmsgI292LWludGVudCB0cjpudGgtY2hpbGQoNm4gKyAxKSwKLmRhcmsgI292LWludGVudCB0cjpudGgtY2hpbGQoNm4gKyAyKSwKLmRhcmsgI292LWludGVudCB0cjpudGgtY2hpbGQoNm4gKyAzKSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNDQ0Owp9Ci5kYXJrICNvdi1pbnRlbnQgdHI6bnRoLWNoaWxkKDZuICsgNCksCi5kYXJrICNvdi1pbnRlbnQgdHI6bnRoLWNoaWxkKDZuICsgNSksCi5kYXJrICNvdi1pbnRlbnQgdHI6bnRoLWNoaWxkKDZuKSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzMzOwp9CgoubGlnaHQgI292LWludGVudCB0cjpudGgtY2hpbGQoNm4gKyAxKS5kYXRhLWNoYW5nZSwKLmxpZ2h0ICNvdi1pbnRlbnQgdHI6bnRoLWNoaWxkKDZuICsgMikuZGF0YS1jaGFuZ2UsCi5saWdodCAjb3YtaW50ZW50IHRyOm50aC1jaGlsZCg2biArIDMpLmRhdGEtY2hhbmdlLAoubGlnaHQgI292LWludGVudCB0cjpudGgtY2hpbGQoNm4gKyA0KS5kYXRhLWNoYW5nZSwKLmxpZ2h0ICNvdi1pbnRlbnQgdHI6bnRoLWNoaWxkKDZuICsgNSkuZGF0YS1jaGFuZ2UsCi5saWdodCAjb3YtaW50ZW50IHRyOm50aC1jaGlsZCg2bikuZGF0YS1jaGFuZ2UgewogICAgYmFja2dyb3VuZC1jb2xvcjogI0ZERkZEQzsKfQouZGFyayAjb3YtaW50ZW50IHRyOm50aC1jaGlsZCg2biArIDEpLmRhdGEtY2hhbmdlLAouZGFyayAjb3YtaW50ZW50IHRyOm50aC1jaGlsZCg2biArIDIpLmRhdGEtY2hhbmdlLAouZGFyayAjb3YtaW50ZW50IHRyOm50aC1jaGlsZCg2biArIDMpLmRhdGEtY2hhbmdlLAouZGFyayAjb3YtaW50ZW50IHRyOm50aC1jaGlsZCg2biArIDQpLmRhdGEtY2hhbmdlLAouZGFyayAjb3YtaW50ZW50IHRyOm50aC1jaGlsZCg2biArIDUpLmRhdGEtY2hhbmdlLAouZGFyayAjb3YtaW50ZW50IHRyOm50aC1jaGlsZCg2bikuZGF0YS1jaGFuZ2UgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzVBNTYwMDsKfQoKI292LWludGVudCB0ZC5yZXNvdXJjZXMsCiNvdi1pbnRlbnQgdGQuZGV0YWlscyB7CiAgICBwYWRkaW5nLWxlZnQ6IDM2cHg7CiAgICBvcGFjaXR5OiAwLjY1Owp9Co7x71YaIwAAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADTiX0AAQAbIfcCoBzbAqAdgltQf9UDd8FChryHPgBAHoCZwAAABAQgKALfioABiKZaO8e9WBiUAAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA03bFAAEAGzSvAqAc2wKgHYJbRH/WMl9BRWpYD/oAQBaRhngAAAQEICgC34qAAYimWjvHvVmAtAAACCgAAAgoAAGj3KB/SxQgAJ60eEwgARQAJ9Il/QABABheewKgHYMCoBzYf9ZbQazs3dfk+NNWAGAKzmc0AAAEBCAoAYimXALfimkhUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2Nzcw0KQ29udGVudC1MZW5ndGg6IDIzOTgNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gRmxvdyBWaWV3IC0tIENTUyBmaWxlCiAqLwoKI292LWZsb3cgaDIgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9Cgojb3YtZmxvdyBkaXYuY3RybC1idG5zIHsKfQoKLmxpZ2h0ICNvdi1mbG93IC5jdXJyZW50LXZpZXcgdXNlIHsKICAgIGZpbGw6IHdoaXRlOwp9Ci5kYXJrICNvdi1mbG93IC5jdXJyZW50LXZpZXcgdXNlIHsKICAgIGZpbGw6ICMzMDQ4NjA7Cn0KCi5saWdodCAjb3YtZmxvdyAuY3VycmVudC12aWV3IHJlY3QgewogICAgZmlsbDogZGVlcHNreWJsdWU7Cn0KLmRhcmsgI292LWZsb3cgLmN1cnJlbnQtdmlldyByZWN0IHsKICAgIGZpbGw6ICNlZWU7Cn0KCi5saWdodCAjb3YtZmxvdyB0cjpudGgtY2hpbGQoNm4gKyAxKSwKLmxpZ2h0ICNvdi1mbG93IHRyOm50aC1jaGlsZCg2biArIDIpLAoubGlnaHQgI292LWZsb3cgdHI6bnRoLWNoaWxkKDZuICsgMykgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTsKfQoubGlnaHQgI292LWZsb3cgdHI6bnRoLWNoaWxkKDZuICsgNCksCi5saWdodCAjb3YtZmxvdyB0cjpudGgtY2hpbGQoNm4gKyA1KSwKLmxpZ2h0ICNvdi1mbG93IHRyOm50aC1jaGlsZCg2bikgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDsKfQouZGFyayAjb3YtZmxvdyB0cjpudGgtY2hpbGQoNm4gKyAxKSwKLmRhcmsgI292LWZsb3cgdHI6bnRoLWNoaWxkKDZuICsgMiksCi5kYXJrICNvdi1mbG93IHRyOm50aC1jaGlsZCg2biArIDMpIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICM0NDQ7Cn0KLmRhcmsgI292LWZsb3cgdHI6bnRoLWNoaWxkKDZuICsgNCksCi5kYXJrICNvdi1mbG93IHRyOm50aC1jaGlsZCg2biArIDUpLAouZGFyayAjb3YtZmxvdyB0cjpudGgtY2hpbGQoNm4pIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICMzMzM7Cn0KCi8qIGhpZ2hsaWdodGVkIGNvbG9yICovCi5saWdodCAjb3YtZmxvdyB0cjpudGgtY2hpbGQoNm4gKyAxKS5kYXRhLWNoYW5nZSwKLmxpZ2h0ICNvdi1mbG93IHRyOm50aC1jaGlsZCg2biArIDIpLmRhdGEtY2hhbmdlLAoubGlnaHQgI292LWZsb3cgdHI6bnRoLWNoaWxkKDZuICsgMykuZGF0YS1jaGFuZ2UsCi5saWdodCAjb3YtZmxvdyB0cjpudGgtY2hpbGQoNm4gKyA0KS5kYXRhLWNoYW5nZSwKLmxpZ2h0ICNvdi1mbG93IHRyOm50aC1jaGlsZCg2biArIDUpLmRhdGEtY2hhbmdlLAoubGlnaHQgI292LWZsb3cgdHI6bnRoLWNoaWxkKDZuKS5kYXRhLWNoYW5nZSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkRGRkRDOwp9Ci5kYXJrICNvdi1mbG93IHRyOm50aC1jaGlsZCg2biArIDEpLmRhdGEtY2hhbmdlLAouZGFyayAjb3YtZmxvdyB0cjpudGgtY2hpbGQoNm4gKyAyKS5kYXRhLWNoYW5nZSwKLmRhcmsgI292LWZsb3cgdHI6bnRoLWNoaWxkKDZuICsgMykuZGF0YS1jaGFuZ2UsCi5kYXJrICNvdi1mbG93IHRyOm50aC1jaGlsZCg2biArIDQpLmRhdGEtY2hhbmdlLAouZGFyayAjb3YtZmxvdyB0cjpudGgtY2hpbGQoNm4gKyA1KS5kYXRhLWNoYW5nZSwKLmRhcmsgI292LWZsb3cgdHI6bnRoLWNoaWxkKDZuKS5kYXRhLWNoYW5nZSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNUE1NjAwOwp9Cgojb3YtZmxvdyB0ZCB7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KI292LWZsb3cgdGQucmlnaHQgewogICAgdGV4dC1hbGlnbjogcmlnaHQ7Cn0KI292LWZsb3cgdGQuc2VsZWN0b3IsCiNvdi1mbG93IHRkLnRyZWF0bWVudCB7CiAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgcGFkZGluZy1sZWZ0OiAzNnB4OwogICAgb3BhY2l0eTogMC42NTsKfY7x71b6MwAAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADRfvkAAQAZLH8CoBzbAqAdgltAf9fk+NNVrO0E1gBAFpEKWAAABAQgKALfioQBiKZeO8e9WKDYAAKkIAACpCAAAaPcoH9LFCAAnrR4TCABFAAibf05AAEAGIyjAqAdgwKgHNh/1ls8OvtJ/o2rbLoAYA42YdAAAAQEICgBiKZgAt+KbSFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvY3NzDQpDb250ZW50LUxlbmd0aDogMjA1Mw0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBHcm91cCBWaWV3IC0tIENTUyBmaWxlCiAqLwoKI292LWdyb3VwIGgyIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKI292LWdyb3VwIGRpdi5jdHJsLWJ0bnMgewp9CgoubGlnaHQgI292LWdyb3VwIC5jdXJyZW50LXZpZXcgdXNlIHsKICAgIGZpbGw6IHdoaXRlOwp9Ci5kYXJrICNvdi1ncm91cCAuY3VycmVudC12aWV3IHVzZSB7CiAgICBmaWxsOiAjMzA0ODYwOwp9CgoubGlnaHQgI292LWdyb3VwIC5jdXJyZW50LXZpZXcgcmVjdCB7CiAgICBmaWxsOiBkZWVwc2t5Ymx1ZTsKfQouZGFyayAjb3YtZ3JvdXAgLmN1cnJlbnQtdmlldyByZWN0IHsKICAgIGZpbGw6ICNlZWU7Cn0KCi5saWdodCAjb3YtZ3JvdXAgdHI6bnRoLWNoaWxkKDRuICsgMSksCi5saWdodCAjb3YtZ3JvdXAgdHI6bnRoLWNoaWxkKDRuICsgMikgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTsKfQoubGlnaHQgI292LWdyb3VwIHRyOm50aC1jaGlsZCg0biArIDMpLAoubGlnaHQgI292LWdyb3VwIHRyOm50aC1jaGlsZCg0bikgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDsKfQouZGFyayAjb3YtZ3JvdXAgdHI6bnRoLWNoaWxkKDRuICsgMSksCi5kYXJrICNvdi1ncm91cCB0cjpudGgtY2hpbGQoNG4gKyAyKSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNDQ0Owp9Ci5kYXJrICNvdi1ncm91cCB0cjpudGgtY2hpbGQoNG4gKyAzKSwKLmRhcmsgI292LWdyb3VwIHRyOm50aC1jaGlsZCg0bikgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzMzMzsKfQoKLyogaGlnaGxpZ2h0ZWQgY29sb3IgKi8KLmxpZ2h0ICNvdi1ncm91cCB0cjpudGgtY2hpbGQoNG4gKyAxKS5kYXRhLWNoYW5nZSwKLmxpZ2h0ICNvdi1ncm91cCB0cjpudGgtY2hpbGQoNG4gKyAyKS5kYXRhLWNoYW5nZSwKLmxpZ2h0ICNvdi1ncm91cCB0cjpudGgtY2hpbGQoNG4gKyAzKS5kYXRhLWNoYW5nZSwKLmxpZ2h0ICNvdi1ncm91cCB0cjpudGgtY2hpbGQoNG4pLmRhdGEtY2hhbmdlIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNGREZGREM7Cn0KLmRhcmsgI292LWdyb3VwIHRyOm50aC1jaGlsZCg0biArIDEpLmRhdGEtY2hhbmdlLAouZGFyayAjb3YtZ3JvdXAgdHI6bnRoLWNoaWxkKDRuICsgMikuZGF0YS1jaGFuZ2UsCi5kYXJrICNvdi1ncm91cCB0cjpudGgtY2hpbGQoNG4gKyAzKS5kYXRhLWNoYW5nZSwKLmRhcmsgI292LWdyb3VwIHRyOm50aC1jaGlsZCg0bikuZGF0YS1jaGFuZ2UgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzVBNTYwMDsKfQoKI292LWdyb3VwIHRkIHsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQojb3YtZ3JvdXAgdGQucmlnaHQgewogICAgdGV4dC1hbGlnbjogcmlnaHQ7Cn0KI292LWdyb3VwIHRkLmJ1Y2tldHMgewogICAgdGV4dC1hbGlnbjogbGVmdDsKICAgIHBhZGRpbmctbGVmdDogMzZweDsKICAgIG9wYWNpdHk6IDAuNjU7Cn0KjvHvVqQ2AABCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANMQ1QABABuanwKgHNsCoB2CWzx/1o2rbLg6+2uaAECFmmRoAAAEBCAoAt+KhAGIpmI7x71YpOQAAowIAAKMCAAAIACetHhNo9ygf0sUIAEUAApXdskAAQAbKycCoBzbAqAdgltEf9YyX0FFalgP+gBgFpKL+AAABAQgKALfioQBiKZZHRVQgL29ub3MvdWkvYXBwL3ZpZXcvc2V0dGluZ3Mvc2V0dGluZ3MuY3NzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiB0ZXh0L2NzcywqLyo7cT0wLjENClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQqO8e9WmDkAAKECAAChAgAACAAnrR4TaPcoH9LFCABFAAKT4mBAAEAGxh3AqAc2wKgHYJbUH/VA3fBQoa8hz4AYB6CMjAAAAQEICgC34qEAYimWR0VUIC9vbm9zL3VpL2FwcC92aWV3L2NsdXN0ZXIvY2x1c3Rlci5jc3MgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6IHRleHQvY3NzLCovKjtxPTAuMQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71b5QQAAkQMAAJEDAABo9ygf0sUIACetHhMIAEUAA4OBaUAAQAYmJcCoB2DAqAc2H/WW1KGvIc9A3fKvgBgC4JNcAAABAQgKAGIpmAC34qFIVFRQLzEuMSAyMDAgT0sNCkNvbnRlbnQtVHlwZTogdGV4dC9jc3MNCkNvbnRlbnQtTGVuZ3RoOiA3NTANClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gQ2x1c3RlciBWaWV3IC0tIENTUyBmaWxlCiAqLwoKI292LWNsdXN0ZXIgaDIgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9Cgojb3YtY2x1c3RlciBkaXYuY3RybC1idG5zIHsKICAgIHdpZHRoOiA0NXB4Owp9jvHvVmtHAAClAgAApQIAAAgAJ60eE2j3KB/SxQgARQACl1+/QABABki7wKgHNsCoB2CW0B/1+T401Ws7QTWAGAWk0ccAAAEBCAoAt+KiAGIpl0dFVCAvb25vcy91aS9hcHAvdmlldy9wcm9jZXNzb3IvcHJvY2Vzc29yLmNzcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogdGV4dC9jc3MsKi8qO3E9MC4xDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0KjvHvVmtHAACfAgAAnwIAAAgAJ60eE2j3KB/SxQgARQACkcQ2QABABuRJwKgHNsCoB2CWzx/1o2rbLg6+2uaAGCFmtloAAAEBCAoAt+KiAGIpmEdFVCAvb25vcy91aS9hcHAvdmlldy90dW5uZWwvdHVubmVsLmNzcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogdGV4dC9jc3MsKi8qO3E9MC4xDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0KjvHvVnVLAADBAgAAwQIAAAgAJ60eE2j3KB/SxQgARQACs+JhQABABsX8wKgHNsCoB2CW1B/1QN3yr6GvJR6AGAeg0BAAAAEBCAoAt+KjAGIpmEdFVCAvb25vcy91aS9hcHAvZncvdXRpbC91dGlsLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6ICovKg0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71bSTgAAgAAAAIAAAABo9ygf0sUIACetHhMIAEUAAHKBakAAQAYpNcCoB2DAqAc2H/WW1KGvJR5A3fUugBgC6pBLAAABAQgKAGIpmQC34qNIVFRQLzEuMSAzMDQgTm90IE1vZGlmaWVkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCo7x71ZjVwAAvwIAAL8CAAAIACetHhNo9ygf0sUIAEUAArHiYkAAQAbF/cCoBzbAqAdgltQf9UDd9S6hryVcgBgHoEjOAAABAQgKALfiowBiKZlHRVQgL29ub3MvdWkvYXBwL2Z3L3V0aWwvZWUuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0KjvHvVpJbAACAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAcoFrQABABik0wKgHYMCoBzYf9ZbUoa8lXEDd96uAGAL1kEsAAAEBCAoAYimaALfio0hUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KjvHvVnJlAACMAwAAjAMAAGj3KB/SxQgAJ60eEwgARQADfn9QQABABihDwKgHYMCoBzYf9ZbPDr7a5qNq3YuAGAOXk1cAAAEBCAoAYimaALfiokhUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2Nzcw0KQ29udGVudC1MZW5ndGg6IDc0NQ0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBMaW5rIFZpZXcgLS0gQ1NTIGZpbGUKICovCgojb3YtdHVubmVsIGgyIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKI292LXR1bm5lbCBkaXYuY3RybC1idG5zIHsKICAgIHdpZHRoOiA0NXB4Owp9jvHvVklqAAC/AgAAvwIAAAgAJ60eE2j3KB/SxQgARQACseJjQABABsX8wKgHNsCoB2CW1B/1QN33q6GvJZqAGAegPRAAAAEBCAoAt+KkAGIpmkdFVCAvb25vcy91aS9hcHAvZncvdXRpbC9mbi5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiAqLyoNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQqO8e9Wh24AAMMCAADDAgAACAAnrR4TaPcoH9LFCABFAAK1xDdAAEAG5CTAqAc2wKgHYJbPH/Wjat2LDr7eMIAYIWbwTQAAAQEICgC34qUAYimaR0VUIC9vbm9zL3VpL2FwcC9mdy91dGlsL3JhbmRvbS5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiAqLyoNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQqO8e9WBm8AAJUDAACVAwAAaPcoH9LFCAAnrR4TCABFAAOHzLtAAEAG2s7AqAdgwKgHNh/1ltFalgP+jJfSsoAYAyyTYAAAAQEICgBiKZsAt+KhSFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvY3NzDQpDb250ZW50LUxlbmd0aDogNzU0DQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCi8qCiAqIENvcHlyaWdodCAyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIFNldHRpbmdzIFZpZXcgLS0gQ1NTIGZpbGUKICovCgojb3Ytc2V0dGluZ3MgaDIgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9Cgojb3Ytc2V0dGluZ3MgZGl2LmN0cmwtYnRucyB7CiAgICB3aWR0aDogNDVweDsKfQqO8e9WKXIAAIAAAACAAAAAaPcoH9LFCAAnrR4TCABFAABygWxAAEAGKTPAqAdgwKgHNh/1ltShryWaQN36KIAYAv+QSwAAAQEICgBiKZsAt+KkSFRUUC8xLjEgMzA0IE5vdCBNb2RpZmllZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQqO8e9WinIAAMICAADCAgAACAAnrR4TaPcoH9LFCABFAAK03bNAAEAGyqnAqAc2wKgHYJbRH/WMl9KyWpYHUYAYBaTr/AAAAQEICgC34qUAYimbR0VUIC9vbm9zL3VpL2FwcC9mdy91dGlsL3RoZW1lLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6ICovKg0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71ZOdAAAgAAAAIAAAABo9ygf0sUIACetHhMIAEUAAHJ/UUAAQAYrTsCoB2DAqAc2H/WWzw6+3jCjauAMgBgDopBLAAABAQgKAGIpnAC34qVIVFRQLzEuMSAzMDQgTm90IE1vZGlmaWVkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCo7x71bXdgAAwQIAAMECAAAIACetHhNo9ygf0sUIAEUAArPiZEAAQAbF+cCoBzbAqAdgltQf9UDd+iihryXYgBgHoM/SAAABAQgKALfipQBiKZtHRVQgL29ub3MvdWkvYXBwL2Z3L3V0aWwva2V5cy5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiAqLyoNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQqO8e9W33kAAMICAADCAgAACAAnrR4TaPcoH9LFCABFAAK0xDhAAEAG5CTAqAc2wKgHYJbPH/WjauAMDr7eboAYIWYdvgAAAQEICgC34qYAYimcR0VUIC9vbm9zL3VpL2FwcC9mdy91dGlsL3ByZWZzLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6ICovKg0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71aogAAAQgAAAEIAAABo9ygf0sUIACetHhMIAEUAADQr8UAAQAZ+7MCoB2DAqAc2H/WW03KDJzthHHemgBAC4JANAAABAQgKAGIpnQC34p2O8e9W+4EAAIgDAACIAwAAaPcoH9LFCAAnrR4TCABFAAN6K/JAAEAGe6XAqAdgwKgHNh/1ltNygyc7YRx3poAYAuCTUwAAAQEICgBiKZ0At+KdSFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvY3NzDQpDb250ZW50LUxlbmd0aDogNzQxDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCi8qCiAqIENvcHlyaWdodCAyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIExpbmsgVmlldyAtLSBDU1MgZmlsZQogKi8KCiNvdi1saW5rIGgyIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKI292LWxpbmsgZGl2LmN0cmwtYnRucyB7CiAgICB3aWR0aDogNDVweDsKfY7x71bghgAAgAAAAIAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjvHvVoKyAAC/AgAAvwIAAAgAJ60eE2j3KB/SxQgARQACscQ5QABABuQmwKgHNsCoB2CWzx/1o2rijA6+3qyAGCFmduEAAAEBCAoAt+KpAGIpnkdFVCAvb25vcy91aS9hcHAvZncvc3ZnL3N2Zy5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiAqLyoNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQqO8e9W4bQAAMECAADBAgAACAAnrR4TaPcoH9LFCABFAAKz3bRAAEAGyqnAqAc2wKgHYJbRH/WMl9UyWpYHj4AYBaTTqwAAAQEICgC34qkAYimeR0VUIC9vbm9zL3VpL2FwcC9mdy9zdmcvZ2x5cGguanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0KjvHvVly1AADAAgAAwAIAAAgAJ60eE2j3KB/SxQgARQACsmSqQABABkO1wKgHNsCoB2CW0x/1YRx6JXKDKr+AGAWkZUsAAAEBCAoAt+KpAGIpnkdFVCAvb25vcy91aS9hcHAvZncvc3ZnL2ljb24uanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0KjvHvVqC1AADDAgAAwwIAAAgAJ60eE2j3KB/SxQgARQACteJmQABABsX1wKgHNsCoB2CW1B/1QN3/JKGvJlSAGAegPTIAAAEBCAoAt+KpAGIpn0dFVCAvb25vcy91aS9hcHAvZncvc3ZnL2dlb2RhdGEuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0KjvHvVkS4AACAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAcsy9QABABt3hwKgHYMCoBzYf9ZbRWpYHj4yX17GAGANBkEsAAAEBCAoAYimgALfiqUhUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KjvHvVni6AACAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAcn9TQABABitMwKgHYMCoBzYf9ZbPDr7erKNq5QmAGAO3kEsAAAEBCAoAYimgALfiqUhUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KjvHvVrm8AAC/AgAAvwIAAAgAJ60eE2j3KB/SxQgARQACsd21QABABsqqwKgHNsCoB2CW0R/1jJfXsVqWB82AGAWkPGkAAAEBCAoAt+KqAGIpoEdFVCAvb25vcy91aS9hcHAvZncvc3ZnL21hcC5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiAqLyoNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQqO8e9Wcb4AAMACAADAAgAACAAnrR4TaPcoH9LFCABFAAKyxDpAAEAG5CTAqAc2wKgHYJbPH/WjauUJDr7e6oAYIWY65gAAAQEICgC34qoAYimgR0VUIC9vbm9zL3VpL2FwcC9mdy9zdmcvem9vbS5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiAqLyoNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQqO8e9Wu74AAP8EAAD/BAAAaPcoH9LFCAAnrR4TCABFAATxiYFAAEAGHJ/AqAdgwKgHNh/1ltBrO0E1+T43OIAYAr2UygAAAQEICgBiKaAAt+KiSFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvY3NzDQpDb250ZW50LUxlbmd0aDogMTExNQ0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBQcm9jZXNzb3IgVmlldyAtLSBDU1MgZmlsZQogKi8KCiNvdi1wcm9jZXNzb3IgaDIgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9Cgojb3YtcHJvY2Vzc29yIGRpdi5jdHJsLWJ0bnMgewogICAgd2lkdGg6IDQwcHg7Cn0KCi5saWdodCAjb3YtcHJvY2Vzc29yIC5jdXJyZW50LXZpZXcgdXNlIHsKICAgIGZpbGw6IHdoaXRlOwp9Ci5kYXJrICNvdi1wcm9jZXNzb3IgLmN1cnJlbnQtdmlldyB1c2UgewogICAgZmlsbDogIzMwNDg2MDsKfQoKLmxpZ2h0ICNvdi1wcm9jZXNzb3IgLmN1cnJlbnQtdmlldyByZWN0IHsKICAgIGZpbGw6IGRlZXBza3libHVlOwp9Ci5kYXJrICNvdi1wcm9jZXNzb3IgLmN1cnJlbnQtdmlldyByZWN0IHsKICAgIGZpbGw6ICNlZWU7Cn0KCiNvdi1wcm9jZXNzb3IgdGQubnVtYmVyIHsKICAgIHRleHQtYWxpZ246IHJpZ2h0Owp9Cgojb3YtcHJvY2Vzc29yIHRyLm5vLWRhdGEgdGQgewogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9Co7x71Z5wQAAgAAAAIAAAABo9ygf0sUIACetHhMIAEUAAHIr9UAAQAZ+qsCoB2DAqAc2H/WW03KDKr9hHHyjgBgC9ZBLAAABAQgKAGIpoAC34qlIVFRQLzEuMSAzMDQgTm90IE1vZGlmaWVkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCo7x71Y7wwAAwwIAAMMCAAAIACetHhNo9ygf0sUIAEUAArVfwEAAQAZInMCoBzbAqAdgltAf9fk+NzhrO0XygBgFpEOaAAABAQgKALfiqgBiKaBHRVQgL29ub3MvdWkvYXBwL2Z3L3N2Zy9zdmdVdGlsLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6ICovKg0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71ZFxAAAiAMAAIgDAABo9ygf0sUIACetHhMIAEUAA3opCUAAQAZ+jsCoB2DAqAc2H/WW0lNSHo80h42RgBgDZZNTAAABAQgKAGIpoQC34p5IVFRQLzEuMSAyMDAgT0sNCkNvbnRlbnQtVHlwZTogdGV4dC9jc3MNCkNvbnRlbnQtTGVuZ3RoOiA3NDENClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gSG9zdCBWaWV3IC0tIENTUyBmaWxlCiAqLwoKI292LWhvc3QgaDIgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9Cgojb3YtaG9zdCBkaXYuY3RybC1idG5zIHsKICAgIHdpZHRoOiA0NXB4Owp9jvHvVpPFAADFAgAAxQIAAAgAJ60eE2j3KB/SxQgARQACt2SrQABABkOvwKgHNsCoB2CW0x/1YRx8o3KDKv2AGAWkgkYAAAEBCAoAt+KqAGIpoEdFVCAvb25vcy91aS9hcHAvZncvcmVtb3RlL3JlbW90ZS5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiAqLyoNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQqO8e9Wb8cAAMQCAADEAgAACAAnrR4TaPcoH9LFCABFAAK2a81AAEAGPI7AqAc2wKgHYJbSH/U0h42RU1Ih1YAYDzPz5QAAAQEICgC34qsAYimhR0VUIC9vbm9zL3VpL2FwcC9mdy9yZW1vdGUvdXJsZm4uanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1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LUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiAqLyoNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQqO8e9WO9gAAIAAAACAAAAAaPcoH9LFCAAnrR4TCABFAAByK/ZAAEAGfqnAqAdgwKgHNh/1ltNygyr9YRx/JoAYAwCQSwAAAQEICgBiKaIAt+KqSFRUUC8xLjEgMzA0IE5vdCBNb2RpZmllZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQqO8e9WkdgAAMgCAADIAgAACAAnrR4TaPcoH9LFCABFAAK63bZAAEAGyqDAqAc2wKgHYJbRH/WMl9ouWpYIC4AYBaSibwAAAQEICgC34qwAYimiR0VUIC9vbm9zL3VpL2FwcC9mdy9yZW1vdGUvd2Vic29ja2V0LmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6ICovKg0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71bt2wAAgAAAAIAAAABo9ygf0sUIACetHhMIAEUAAHJ/VUAAQAYrSsCoB2DAqAc2H/WWzw6+3yijauoJgBgDzJBLAAABAQgKAGIpogC34qxIVFRQLzEuMSAzMDQgTm90IE1vZGlmaWVkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCo7x71ZE3AAAxQIAAMUCAAAIACetHhNo9ygf0sUIAEUAArdkrEAAQAZDrsCoBzbAqAdgltMf9WEcfyZygys7gBgFpIeJAAABAQgKALfirABiKaJHRVQgL29ub3MvdWkvYXBwL2Z3L3dpZGdldC93aWRnZXQuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0KjvHvVrziAADEAgAAxAIAAAgAJ60eE2j3KB/SxQgARQACtsQ8QABABuQewKgHNsCoB2CWzx/1o2rqCQ6+32aAGCFmu2MAAAEBCAoAt+KsAGIpokdFVCAvb25vcy91aS9hcHAvZncvd2lkZ2V0L3RhYmxlLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6ICovKg0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71Zq7AAAgAAAAIAAAABo9ygf0sUIACetHhMIAEUAAHLMv0AAQAbd38CoB2DAqAc2H/WW0VqWCAuMl9y0gBgDV5BLAAABAQgKAGIpowC34qxIVFRQLzEuMSAzMDQgTm90IE1vZGlmaWVkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCo7x71b57QAAgAAAAIAAAABo9ygf0sUIACetHhMIAEUAAHIr90AAQAZ+qMCoB2DAqAc2H/WW03KDKzthHIGpgBgDCpBLAAABAQgKAGIpowC34qxIVFRQLzEuMSAzMDQgTm90IE1vZGlmaWVkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCo7x71Zy7gAAxgIAAMYCAAAIACetHhNo9ygf0sUIAEUAArjdt0AAQAbKocCoBzbAqAdgltEf9YyX3LRalghJgBgFpBcRAAABAQgKALfirQBiKaNHRVQgL29ub3MvdWkvYXBwL2Z3L3dpZGdldC90b29sYmFyLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6ICovKg0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71bY8AAAxgIAAMYCAAAIACetHhNo9ygf0sUIAEUAArhkrUAAQAZDrMCoBzbAqAdgltMf9WEcgalygyt5gBgFpFpoAAABAQgKALfirQBiKaNHRVQgL29ub3MvdWkvYXBwL2Z3L3dpZGdldC90b29sdGlwLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6ICovKg0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71ZO9AAAgAAAAIAAAABo9ygf0sUIACetHhMIAEUAAHLMwEAAQAbd3sCoB2DAqAc2H/WW0VqWCEmMl984gBgDYZBLAAABAQgKAGIppAC34q1IVFRQLzEuMSAzMDQgTm90IE1vZGlmaWVkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCo7x71Zc9wAAgAAAAIAAAABo9ygf0sUIACetHhMIAEUAAHIpC0AAQAaBlMCoB2DAqAc2H/WW0lNSIdU0h5ATgBgDcJBLAAABAQgKAGIppAC34qtIVFRQLzEuMSAzMDQgTm90IE1vZGlmaWVkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCo7x71aG9wAAxQIAAMUCAAAIACetHhNo9ygf0sUIAEUAArfduEAAQAbKocCoBzbAqAdgltEf9YyX3zhalgiHgBgFpCOWAAABAQgKALfirgBiKaRHRVQgL29ub3MvdWkvYXBwL2Z3L3dpZGdldC9idXR0b24uanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0KjvHvVo75AADLAgAAywIAAAgAJ60eE2j3KB/SxQgARQACvWvOQABABjyGwKgHNsCoB2CW0h/1NIeQE1NSIhOAGA8ztrAAAAEBCAoAt+KuAGIppEdFVCAvb25vcy91aS9hcHAvZncvd2lkZ2V0L3RhYmxlQnVpbGRlci5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiAqLyoNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQqO8e9W4PoAAIAAAACAAAAAaPcoH9LFCAAnrR4TCABFAAByzMFAAEAG3d3AqAdgwKgHNh/1ltFalgiHjJfhu4AYA2yQSwAAAQEICgBiKaQAt+KuSFRUUC8xLjEgMzA0IE5vdCBNb2RpZmllZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQqO8e9WFv0AAIAAAACAAAAAaPcoH9LFCAAnrR4TCABFAAByKQxAAEAGgZPAqAdgwKgHNh/1ltJTUiITNIeSnIAYA3uQSwAAAQEICgBiKaQAt+KuSFRUUC8xLjEgMzA0IE5vdCBNb2RpZmllZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQqO8e9Wmf0AAMMCAADDAgAACAAnrR4TaPcoH9LFCABFAAK13blAAEAGyqLAqAc2wKgHYJbRH/WMl+G7WpYIxYAYBaQ5pQAAAQEICgC34q4AYimkR0VUIC9vbm9zL3VpL2FwcC9mdy9sYXllci9sYXllci5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiAqLyoNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQqO8e9Wu/8AAMMCAADDAgAACAAnrR4TaPcoH9LFCABFAAK1a89AAEAGPI3AqAc2wKgHYJbSH/U0h5KcU1IiUYAYDzPR/AAAAQEICgC34q4AYimkR0VUIC9vbm9zL3VpL2FwcC9mdy9sYXllci9wYW5lbC5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiAqLyoNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQqO8e9WmQABAIAAAACAAAAAaPcoH9LFCAAnrR4TCABFAAByzMJAAEAG3dzAqAdgwKgHNh/1ltFalgjFjJfkPIAYA3aQSwAAAQEICgBiKaUAt+KuSFRUUC8xLjEgMzA0IE5vdCBNb2RpZmllZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQqO8e9WegYBAMQCAADEAgAACAAnrR4TaPcoH9LFCABFAAK23bpAAEAGyqDAqAc2wKgHYJbRH/WMl+Q8WpYJA4AYBaQvlwAAAQEICgC34q8AYimlR0VUIC9vbm9zL3VpL2FwcC9mdy9sYXllci9kaWFsb2cuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0KjvHvVtoGAQCAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAcikNQABABoGSwKgHYMCoBzYf9ZbSU1IiUTSHlR2AGAOFkEsAAAEBCAoAYimlALfirkhUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KjvHvVtkKAQDDAgAAwwIAAAgAJ60eE2j3KB/SxQgARQACtWvQQABABjyMwKgHNsCoB2CW0h/1NIeVHVNSIo+AGA8z6iIAAAEBCAoAt+KvAGIppUdFVCAvb25vcy91aS9hcHAvZncvbGF5ZXIvZmxhc2guanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0KjvHvVgELAQCAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAciv4QABABn6nwKgHYMCoBzYf9ZbTcoMreWEchC2AGAMUkEsAAAEBCAoAYimlALfirUhUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KjvHvVi0PAQDHAgAAxwIAAAgAJ60eE2j3KB/SxQgARQACuWSuQABABkOqwKgHNsCoB2CW0x/1YRyELXKDK7eAGAWkw+AAAAEBCAoAt+KvAGIppUdFVCAvb25vcy91aS9hcHAvZncvbGF5ZXIvcXVpY2toZWxwLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6ICovKg0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71YmEAEAgAAAAIAAAABo9ygf0sUIACetHhMIAEUAAHKJgkAAQAYhHcCoB2DAqAc2H/WW0Gs7RfL5Pjm5gBgCyJBLAAABAQgKAGIppgC34qpIVFRQLzEuMSAzMDQgTm90IE1vZGlmaWVkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCo7x71ZKEgEAgAAAAIAAAABo9ygf0sUIACetHhMIAEUAAHKBcEAAQAYpL8CoB2DAqAc2H/WW1KGvJpJA3gQmgBgDJ5BLAAABAQgKAGIppgC34qtIVFRQLzEuMSAzMDQgTm90IE1vZGlmaWVkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCo7x71aTEgEAwgIAAMICAAAIACetHhNo9ygf0sUIAEUAArRfwUAAQAZInMCoBzbAqAdgltAf9fk+OblrO0YwgBgFpHUOAAABAQgKALfirwBiKaZHRVQgL29ub3MvdWkvYXBwL2Z3L2xheWVyL3ZlaWwuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0KjvHvVjwZAQCAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAciv5QABABn6mwKgHYMCoBzYf9ZbTcoMrt2EchrKAGAMekEsAAAEBCAoAYimmALfir0hUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KjvHvVo4ZAQDFAgAAxQIAAAgAJ60eE2j3KB/SxQgARQACt+JoQABABsXxwKgHNsCoB2CW1B/1QN4EJqGvJtCAGAegtU8AAAEBCAoAt+KwAGIppkdFVCAvb25vcy91aS9hcHAvZncvbGF5ZXIvbG9hZGluZy5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiAqLyoNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQqO8e9WXhoBAIAAAACAAAAAaPcoH9LFCAAnrR4TCABFAAByf1ZAAEAGK0nAqAdgwKgHNh/1ls8Ovt9mo2rsi4AYA9aQSwAAAQEICgBiKaYAt+KsSFRUUC8xLjEgMzA0IE5vdCBNb2RpZmllZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQqO8e9WJx0BAIsCAACLAgAACAAnrR4TaPcoH9LFCABFAAJ9ZK9AAEAGQ+XAqAc2wKgHYJbTH/VhHIaycoMr9YAYBaSqDQAAAQEICgC34rAAYimmR0VUIC9vbm9zL3VpL2FwcC92aWV3L3RvcG8vdG9wby5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0KjvHvVjUfAQCNAgAAjQIAAAgAJ60eE2j3KB/SxQgARQACf8Q9QABABuRUwKgHNsCoB2CWzx/1o2rsiw6+36SAGCFmYvcAAAEBCAoAt+KwAGIppkdFVCAvb25vcy91aS9hcHAvdmlldy90b3BvL3RvcG9EMy5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0KjvHvVmZbAQCAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAcoFxQABABikuwKgHYMCoBzYf9ZbUoa8m0EDeBqmAGAMxkEsAAAEBCAoAYimrALfisEhUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KjvHvVmdbAQCAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAcomDQABABiEcwKgHYMCoBzYf9ZbQaztGMPk+PDmAGALTkEsAAAEBCAoAYimrALfir0hUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KjvHvVkxfAQCQAgAAkAIAAAgAJ60eE2j3KB/SxQgARQACguJpQABABsYlwKgHNsCoB2CW1B/1QN4GqaGvJw6AGAegiJYAAAEBCAoAt+K0AGIpq0dFVCAvb25vcy91aS9hcHAvdmlldy90b3BvL3RvcG9FdmVudC5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0KjvHvVutfAQDSOAAA0jgAAGj3KB/SxQgAJ60eEwgARQA4xH9XQABABvL1wKgHYMCoBzYf9ZbPDr7fpKNq7taAEAPgyJ0AAAEBCAoAYimrALfisEhUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2phdmFzY3JpcHQNCkNvbnRlbnQtTGVuZ3RoOiAxNzM4Mg0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBUb3BvbG9neSBEMyBNb2R1bGUuCiBGdW5jdGlvbnMgZm9yIG1hbmlwdWxhdGluZyB0aGUgRDMgdmlzdWFsaXphdGlvbnMgb2YgdGhlIFRvcG9sb2d5CiAqLwoKKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBpbmplY3RlZCByZWZzCiAgICB2YXIgJGxvZywgZnMsIHN1cywgaXMsIHRzOwoKICAgIC8vIGFwaSB0byB0b3BvRm9yY2UKICAgIHZhciBhcGk7CiAgICAvKgogICAgIG5vZGUoKSAgICAgICAgICAgICAgICAgLy8gZ2V0IHJlZiB0byBEMyBzZWxlY3Rpb24gb2Ygbm9kZXMKICAgICBsaW5rKCkgICAgICAgICAgICAgICAgIC8vIGdldCByZWYgdG8gRDMgc2VsZWN0aW9uIG9mIGxpbmtzCiAgICAgbGlua0xhYmVsKCkgICAgICAgICAgICAvLyBnZXQgcmVmIHRvIEQzIHNlbGVjdGlvbiBvZiBsaW5rIGxhYmVscwogICAgIGluc3RWaXNpYmxlKCkgICAgICAgICAgLy8gdHJ1ZSBpZiBpbnN0YW5jZXMgcGFuZWwgaXMgdmlzaWJsZQogICAgIHBvc05vZGUoKSAgICAgICAgICAgICAgLy8gcG9zaXRpb24gbm9kZQogICAgIHNob3dIb3N0cygpICAgICAgICAgICAgLy8gdHJ1ZSBpZiBob3N0cyBhcmUgdG8gYmUgc2hvd24KICAgICByZXN0eWxlTGlua0VsZW1lbnQoKSAgIC8vIHVwZGF0ZSBsaW5rIHN0eWxlcyBiYXNlZCBvbiBiYWNraW5nIGRhdGEKICAgICB1cGRhdGVMaW5rTGFiZWxNb2RlbCgpIC8vIHVwZGF0ZSBiYWNraW5nIGRhdGEgZm9yIGxpbmsgbGFiZWxzCiAgICAgKi8KCiAgICAvLyBjb25maWd1cmF0aW9uCiAgICB2YXIgZGV2Q2ZnID0gewogICAgICAgICAgICB4b2ZmOiAtMjAsCiAgICAgICAgICAgIHlvZmY6IC0xOAogICAgICAgIH0sCiAgICAgICAgbGFiZWxDb25maWcgPSB7CiAgICAgICAgICAgIGltZ1BhZDogMTYsCiAgICAgICAgICAgIHBhZExSOiA0LAogICAgICAgICAgICBwYWRUQjogMywKICAgICAgICAgICAgbWFyZ2luTFI6IDMsCiAgICAgICAgICAgIG1hcmdpblRCOiAyLAogICAgICAgICAgICBwb3J0OiB7CiAgICAgICAgICAgICAgICBnYXA6IDMsCiAgICAgICAgICAgICAgICB3aWR0aDogMTgsCiAgICAgICAgICAgICAgICBoZWlnaHQ6IDE0CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIGJhZGdlQ29uZmlnID0gewogICAgICAgICAgICByYWRpdXM6IDEyLAogICAgICAgICAgICB5b2ZmOiA1LAogICAgICAgICAgICBnZGVsdGE6IDEwCiAgICAgICAgfSwKICAgICAgICBpY2ZnOwoKICAgIHZhciBzdGF0dXMgPSB7CiAgICAgICAgaTogJ2JhZGdlSW5mbycsCiAgICAgICAgdzogJ2JhZGdlV2FybicsCiAgICAgICAgZTogJ2JhZGdlRXJyb3InCiAgICB9OwoKICAgIGZ1bmN0aW9uIGJhZGdlU3RhdHVzKGJhZGdlKSB7CiAgICAgICAgcmV0dXJuIHN0YXR1c1tiYWRnZS5zdGF0dXNdIHx8IHN0YXR1cy5pOwogICAgfQoKICAgIC8vIGludGVybmFsIHN0YXRlCiAgICB2YXIgZGV2aWNlTGFiZWxJbmRleCA9IDAsCiAgICAgICAgaG9zdExhYmVsSW5kZXggPSAwOwoKCiAgICB2YXIgZENvbCA9IHsKICAgICAgICBibGFjazogJyMwMDAnLAogICAgICAgIHBhbGVibHVlOiAnI2FjZicsCiAgICAgICAgb2Zmd2hpdGU6ICcjZGRkJywKICAgICAgICBkYXJrZ3JleTogJyM0NDQnLAogICAgICAgIG1pZGdyZXk6ICcjODg4JywKICAgICAgICBsaWdodGdyZXk6ICcjYmJiJywKICAgICAgICBvcmFuZ2U6ICcjZjkwJwogICAgfTsKCiAgICAvLyBub3RlOiB0aGVzZSBhcmUgdGhlIGRldmljZSBpY29uIGNvbG9ycyB3aXRob3V0IGFmZmluaXR5CiAgICB2YXIgZENvbFRoZW1lID0gewogICAgICAgIGxpZ2h0OiB7CiAgICAgICAgICAgIHJmaWxsOiBkQ29sLm9mZndoaXRlLAogICAgICAgICAgICBvbmxpbmU6IHsKICAgICAgICAgICAgICAgIGdseXBoOiBkQ29sLmRhcmtncmV5LAogICAgICAgICAgICAgICAgcmVjdDogZENvbC5wYWxlYmx1ZQogICAgICAgICAgICB9LAogICAgICAgICAgICBvZmZsaW5lOiB7CiAgICAgICAgICAgICAgICBnbHlwaDogZENvbC5taWRncmV5LAogICAgICAgICAgICAgICAgcmVjdDogZENvbC5saWdodGdyZXkKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgZGFyazogewogICAgICAgICAgICByZmlsbDogZENvbC5taWRncmV5LAogICAgICAgICAgICBvbmxpbmU6IHsKICAgICAgICAgICAgICAgIGdseXBoOiBkQ29sLmRhcmtncmV5LAogICAgICAgICAgICAgICAgcmVjdDogZENvbC5wYWxlYmx1ZQogICAgICAgICAgICB9LAogICAgICAgICAgICBvZmZsaW5lOiB7CiAgICAgICAgICAgICAgICBnbHlwaDogZENvbC5taWRncmV5LAogICAgICAgICAgICAgICAgcmVjdDogZENvbC5kYXJrZ3JleQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCiAgICBmdW5jdGlvbiBkZXZCYXNlQ29sb3IoZCkgewogICAgICAgIHZhciBvID0gZC5vbmxpbmUgPyAnb25saW5lJyA6ICdvZmZsaW5lJzsKICAgICAgICByZXR1cm4gZENvbFRoZW1lW3RzLnRoZW1lKCldW29dOwogICAgfQoKICAgIGZ1bmN0aW9uIHNldERldmljZUNvbG9yKGQpIHsKICAgICAgICB2YXIgbyA9IGQub25saW5lLAogICAgICAgICAgICBzID0gZC5lbC5jbGFzc2VkKCdzZWxlY3RlZCcpLAogICAgICAgICAgICBjID0gZGV2QmFzZUNvbG9yKGQpLAogICAgICAgICAgICBhID0gaW5zdENvbG9yKGQubWFzdGVyLCBvKSwKICAgICAgICAgICAgaWNvbiA9IGQuZWwuc2VsZWN0KCdnLmRldmljZUljb24nKSwKICAgICAgICAgICAgZywgcjsKCiAgICAgICAgaWYgKHMpIHsKICAgICAgICAgICAgZyA9IGMuZ2x5cGg7CiAgICAgICAgICAgIHIgPSBkQ29sLm9yYW5nZTsKICAgICAgICB9IGVsc2UgaWYgKGFwaS5pbnN0VmlzaWJsZSgpKSB7CiAgICAgICAgICAgIGcgPSBvID8gYSA6IGMuZ2x5cGg7CiAgICAgICAgICAgIHIgPSBvID8gYy5yZmlsbCA6IGE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZyA9IGMuZ2x5cGg7CiAgICAgICAgICAgIHIgPSBjLnJlY3Q7CiAgICAgICAgfQoKICAgICAgICBpY29uLnNlbGVjdCgndXNlJykuc3R5bGUoJ2ZpbGwnLCBnKTsKICAgICAgICBpY29uLnNlbGVjdCgncmVjdCcpLnN0eWxlKCdmaWxsJywgcik7CiAgICB9CgogICAgZnVuY3Rpb24gaW5zdENvbG9yKGlkLCBvbmxpbmUpIHsKICAgICAgICByZXR1cm4gc3VzLmNhdDcoKS5nZXRDb2xvcihpZCwgIW9ubGluZSwgdHMudGhlbWUoKSk7CiAgICB9CgogICAgLy8gPT09PQoKICAgIGZ1bmN0aW9uIGluY0RldkxhYkluZGV4KCkgewogICAgICAgIGRldmljZUxhYmVsSW5kZXggPSAoZGV2aWNlTGFiZWxJbmRleCsxKSAlIDM7CiAgICAgICAgc3dpdGNoKGRldmljZUxhYmVsSW5kZXgpIHsKICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gJ0hpZGUgZGV2aWNlIGxhYmVscyc7CiAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuICdTaG93IGZyaWVuZGx5IGRldmljZSBsYWJlbHMnOwogICAgICAgICAgICBjYXNlIDI6IHJldHVybiAnU2hvdyBkZXZpY2UgSUQgbGFiZWxzJzsKICAgICAgICB9CiAgICB9CgogICAgLy8gUmV0dXJucyB0aGUgbmV3bHkgY29tcHV0ZWQgYm91bmRpbmcgYm94IG9mIHRoZSByZWN0YW5nbGUKICAgIGZ1bmN0aW9uIGFkanVzdFJlY3RUb0ZpdFRleHQobikgewogICAgICAgIHZhciB0ZXh0ID0gbi5zZWxlY3QoJ3RleHQnKSwKICAgICAgICAgICAgYm94ID0gdGV4dC5ub2RlKCkuZ2V0QkJveCgpLAogICAgICAgICAgICBsYWIgPSBsYWJlbENvbmZpZzsKCiAgICAgICAgdGV4dC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKQogICAgICAgICAgICAuYXR0cigneScsICctMC44ZW0nKQogICAgICAgICAgICAuYXR0cigneCcsIGxhYi5pbWdQYWQvMik7CgogICAgICAgIC8vIHRyYW5zbGF0ZSB0aGUgYmJveCBzbyB0aGF0IGl0IGlzIGNlbnRlcmVkIG9uIFt4LHldCiAgICAgICAgYm94LnggPSAtYm94LndpZHRoIC8gMjsKICAgICAgICBib3gueSA9IC1ib3guaGVpZ2h0IC8gMjsKCiAgICAgICAgLy8gYWRkIHBhZGRpbmcKICAgICAgICBib3gueCAtPSAobGFiLnBhZExSICsgbGFiLmltZ1BhZC8yKTsKICAgICAgICBib3gud2lkdGggKz0gbGFiLnBhZExSICogMiArIGxhYi5pbWdQYWQ7CiAgICAgICAgYm94LnkgLT0gbGFiLnBhZFRCOwogICAgICAgIGJveC5oZWlnaHQgKz0gbGFiLnBhZFRCICogMjsKCiAgICAgICAgcmV0dXJuIGJveDsKICAgIH0KCiAgICBmdW5jdGlvbiBob3N0TGFiZWwoZCkgewogICAgICAgIHZhciBpZHggPSAoaG9zdExhYmVsSW5kZXggPCBkLmxhYmVscy5sZW5ndGgpID8gaG9zdExhYmVsSW5kZXggOiAwOwogICAgICAgIHJldHVybiBkLmxhYmVsc1tpZHhdOwogICAgfQogICAgZnVuY3Rpb24gZGV2aWNlTGFiZWwoZCkgewogICAgICAgIHZhciBpZHggPSAoZGV2aWNlTGFiZWxJbmRleCA8IGQubGFiZWxzLmxlbmd0aCkgPyBkZXZpY2VMYWJlbEluZGV4IDogMDsKICAgICAgICByZXR1cm4gZC5sYWJlbHNbaWR4XTsKICAgIH0KICAgIGZ1bmN0aW9uIHRyaW1MYWJlbChsYWJlbCkgewogICAgICAgIHJldHVybiAobGFiZWwgJiYgbGFiZWwudHJpbSgpKSB8fCAnJzsKICAgIH0KCiAgICBmdW5jdGlvbiBlbXB0eUJveCgpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB4OiAtMiwKICAgICAgICAgICAgeTogLTIsCiAgICAgICAgICAgIHdpZHRoOiA0LAogICAgICAgICAgICBoZWlnaHQ6IDQKICAgICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZURldmljZVJlbmRlcmluZyhkKSB7CiAgICAgICAgdmFyIGxhYmVsID0gdHJpbUxhYmVsKGRldmljZUxhYmVsKGQpKSwKICAgICAgICAgICAgbm9MYWJlbCA9ICFsYWJlbCwKICAgICAgICAgICAgbm9kZSA9IGQuZWwsCiAgICAgICAgICAgIGRpbSA9IGljZmcuZGV2aWNlLmRpbSwKICAgICAgICAgICAgYm94LCBkeCwgZHksCiAgICAgICAgICAgIGJkZyA9IGQuYmFkZ2U7CgogICAgICAgIG5vZGUuc2VsZWN0KCd0ZXh0JykKICAgICAgICAgICAgLnRleHQobGFiZWwpOwoKICAgICAgICBpZiAobm9MYWJlbCkgewogICAgICAgICAgICBib3ggPSBlbXB0eUJveCgpOwogICAgICAgICAgICBkeCA9IC1kaW0vMjsKICAgICAgICAgICAgZHkgPSAtZGltLzI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYm94ID0gYWRqdXN0UmVjdFRvRml0VGV4dChub2RlKTsKICAgICAgICAgICAgZHggPSBib3gueCArIGRldkNmZy54b2ZmOwogICAgICAgICAgICBkeSA9IGJveC55ICsgZGV2Q2ZnLnlvZmY7CiAgICAgICAgfQoKICAgICAgICBub2RlLnNlbGVjdCgncmVjdCcpCiAgICAgICAgICAgIC50cmFuc2l0aW9uKCkKICAgICAgICAgICAgLmF0dHIoYm94KTsKCiAgICAgICAgbm9kZS5zZWxlY3QoJ2cuZGV2aWNlSWNvbicpCiAgICAgICAgICAgIC50cmFuc2l0aW9uKCkKICAgICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIHN1cy50cmFuc2xhdGUoZHgsIGR5KSk7CgogICAgICAgIC8vIGhhbmRsZSBiYWRnZSwgaWYgZGVmaW5lZAogICAgICAgIGlmIChiZGcpIHsKICAgICAgICAgICAgcmVuZGVyQmFkZ2Uobm9kZSwgYmRnLCB7IGR4OiBkeCArIGRpbSwgZHk6IGR5IH0pOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiB1cGRhdGVIb3N0UmVuZGVyaW5nKGQpIHsKICAgICAgICB2YXIgbm9kZSA9IGQuZWwsCiAgICAgICAgICAgIGJkZyA9IGQuYmFkZ2U7CgogICAgICAgIHVwZGF0ZUhvc3RMYWJlbChkKTsKCiAgICAgICAgLy8gaGFuZGxlIGJhZGdlLCBpZiBkZWZpbmVkCiAgICAgICAgaWYgKGJkZykgewogICAgICAgICAgICByZW5kZXJCYWRnZShub2RlLCBiZGcsIGljZmcuaG9zdC5iYWRnZSk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHJlbmRlckJhZGdlKG5vZGUsIGJkZywgYm9mZikgewogICAgICAgIHZhciBic2VsLAogICAgICAgICAgICBiY3IgPSBiYWRnZUNvbmZpZy5yYWRpdXMsCiAgICAgICAgICAgIGJjZ2QgPSBiYWRnZUNvbmZpZy5nZGVsdGE7CgogICAgICAgIG5vZGUuc2VsZWN0KCdnLmJhZGdlJykucmVtb3ZlKCk7CgogICAgICAgIGJzZWwgPSBub2RlLmFwcGVuZCgnZycpCiAgICAgICAgICAgIC5jbGFzc2VkKCdiYWRnZScsIHRydWUpCiAgICAgICAgICAgIC5jbGFzc2VkKGJhZGdlU3RhdHVzKGJkZyksIHRydWUpCiAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBzdXMudHJhbnNsYXRlKGJvZmYuZHgsIGJvZmYuZHkpKTsKCiAgICAgICAgYnNlbC5hcHBlbmQoJ2NpcmNsZScpCiAgICAgICAgICAgIC5hdHRyKCdyJywgYmNyKTsKCiAgICAgICAgaWYgKGJkZy50eHQpIHsKICAgICAgICAgICAgYnNlbC5hcHBlbmQoJ3RleHQnKQogICAgICAgICAgICAgICAgLmF0dHIoJ2R5JywgYmFkZ2VDb25maWcueW9mZikKICAgICAgICAgICAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKQogICAgICAgICAgICAgICAgLnRleHQoYmRnLnR4dCk7CiAgICAgICAgfSBlbHNlIGlmIChiZGcuZ2lkKSB7CiAgICAgICAgICAgIGJzZWwuYXBwZW5kKCd1c2UnKQogICAgICAgICAgICAgICAgLmF0dHIoewogICAgICAgICAgICAgICAgICAgIHdpZHRoOiBiY2dkICogMiwKICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGJjZ2QgKiAyLAogICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogc3VzLnRyYW5zbGF0ZSgtYmNnZCwgLWJjZ2QpLAogICAgICAgICAgICAgICAgICAgICd4bGluazpocmVmJzogJyMnICsgYmRnLmdpZAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZUhvc3RMYWJlbChkKSB7CiAgICAgICAgdmFyIGxhYmVsID0gdHJpbUxhYmVsKGhvc3RMYWJlbChkKSk7CiAgICAgICAgZC5lbC5zZWxlY3QoJ3RleHQnKS50ZXh0KGxhYmVsKTsKICAgIH0KCiAgICBmdW5jdGlvbiB1cGRhdGVEZXZpY2VDb2xvcnMoZCkgewogICAgICAgIGlmIChkKSB7CiAgICAgICAgICAgIHNldERldmljZUNvbG9yKGQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGFwaS5ub2RlKCkuZmlsdGVyKCcuZGV2aWNlJykuZWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgc2V0RGV2aWNlQ29sb3IoZCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KCgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIHVwZGF0ZU5vZGVzIC0gc3ViZnVuY3Rpb25zCgogICAgZnVuY3Rpb24gZGV2aWNlRXhpc3RpbmcoZCkgewogICAgICAgIHZhciBub2RlID0gZC5lbDsKICAgICAgICBub2RlLmNsYXNzZWQoJ29ubGluZScsIGQub25saW5lKTsKICAgICAgICB1cGRhdGVEZXZpY2VSZW5kZXJpbmcoZCk7CiAgICAgICAgYXBpLnBvc05vZGUoZCwgdHJ1ZSk7CiAgICB9CgogICAgZnVuY3Rpb24gaG9zdEV4aXN0aW5nKGQpIHsKICAgICAgICB1cGRhdGVIb3N0UmVuZGVyaW5nKGQpOwogICAgICAgIGFwaS5wb3NOb2RlKGQsIHRydWUpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRldmljZUVudGVyKGQpIHsKICAgICAgICB2YXIgbm9kZSA9IGQzLnNlbGVjdCh0aGlzKSwKICAgICAgICAgICAgZ2x5cGhJZCA9IGQudHlwZSB8fCAndW5rbm93bicsCiAgICAgICAgICAgIGxhYmVsID0gdHJpbUxhYmVsKGRldmljZUxhYmVsKGQpKSwKICAgICAgICAgICAgLy9kZXZDZmcgPSBkZXZpY2VJY29uQ29uZmlnLAogICAgICAgICAgICBub0xhYmVsID0gIWxhYmVsLAogICAgICAgICAgICBib3gsIGR4LCBkeSwgaWNvbjsKCiAgICAgICAgZC5lbCA9IG5vZGU7CgogICAgICAgIG5vZGUuYXBwZW5kKCdyZWN0JykuYXR0cih7IHJ4OiA1LCByeTogNSB9KTsKICAgICAgICBub2RlLmFwcGVuZCgndGV4dCcpLnRleHQobGFiZWwpLmF0dHIoJ2R5JywgJzEuMWVtJyk7CiAgICAgICAgYm94ID0gYWRqdXN0UmVjdFRvRml0VGV4dChub2RlKTsKICAgICAgICBub2RlLnNlbGVjdCgncmVjdCcpLmF0dHIoYm94KTsKCiAgICAgICAgaWNvbiA9IGlzLmFkZERldmljZUljb24obm9kZSwgZ2x5cGhJZCk7CgogICAgICAgIGlmIChub0xhYmVsKSB7CiAgICAgICAgICAgIGR4ID0gLWljb24uZGltLzI7CiAgICAgICAgICAgIGR5ID0gLWljb24uZGltLzI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYm94ID0gYWRqdXN0UmVjdFRvRml0VGV4dChub2RlKTsKICAgICAgICAgICAgZHggPSBib3gueCArIGRldkNmZy54b2ZmOwogICAgICAgICAgICBkeSA9IGJveC55ICsgZGV2Q2ZnLnlvZmY7CiAgICAgICAgfQoKICAgICAgICBpY29uLmF0dHIoJ3RyYW5zZm9ybScsIHN1cy50cmFuc2xhdGUoZHgsIGR5KSk7CiAgICB9CgogICAgZnVuY3Rpb24gaG9zdEVudGVyKGQpIHsKICAgICAgICB2YXIgbm9kZSA9IGQzLnNlbGVjdCh0aGlzKSwKICAgICAgICAgICAgZ2lkID0gZC50eXBlIHx8ICd1bmtub3duJywKICAgICAgICAgICAgcmFkID0gaWNmZy5ob3N0LnJhZGl1cywKICAgICAgICAgICAgciA9IGQudHlwZSA/IHJhZC53aXRoR2x5cGggOiByYWQubm9HbHlwaCwKICAgICAgICAgICAgdGV4dER5ID0gciArIDEwOwoKICAgICAgICBkLmVsID0gbm9kZTsKICAgICAgICBzdXMudmlzaWJsZShub2RlLCBhcGkuc2hvd0hvc3RzKCkpOwoKICAgICAgICBpcy5hZGRIb3N0SWNvbihub2RlLCByLCBnaWQpOwoKICAgICAgICBub2RlLmFwcGVuZCgndGV4dCcpCiAgICAgICAgICAgIC50ZXh0KGhvc3RMYWJlbCkKICAgICAgICAgICAgLmF0dHIoJ2R5JywgdGV4dER5KQogICAgICAgICAgICAuYXR0cigndGV4dC1hbmNob3InLCAnbWlkZGxlJyk7CiAgICB9CgogICAgZnVuY3Rpb24gaG9zdEV4aXQoZCkgewogICAgICAgIHZhciBub2RlID0gZC5lbDsKICAgICAgICBub2RlLnNlbGVjdCgndXNlJykKICAgICAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMC41KQogICAgICAgICAgICAudHJhbnNpdGlvbigpCiAgICAgICAgICAgIC5kdXJhdGlvbig4MDApCiAgICAgICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDApOwoKICAgICAgICBub2RlLnNlbGVjdCgndGV4dCcpCiAgICAgICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDAuNSkKICAgICAgICAgICAgLnRyYW5zaXRpb24oKQogICAgICAgICAgICAuZHVyYXRpb24oODAwKQogICAgICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAwKTsKCiAgICAgICAgbm9kZS5zZWxlY3QoJ2NpcmNsZScpCiAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLWZpbGwnLCAnIzU1NScpCiAgICAgICAgICAgIC5zdHlsZSgnZmlsbCcsICcjODg4JykKICAgICAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMC41KQogICAgICAgICAgICAudHJhbnNpdGlvbigpCiAgICAgICAgICAgIC5kdXJhdGlvbigxNTAwKQogICAgICAgICAgICAuYXR0cigncicsIDApOwogICAgfQoKICAgIGZ1bmN0aW9uIGRldmljZUV4aXQoZCkgewogICAgICAgIHZhciBub2RlID0gZC5lbDsKICAgICAgICBub2RlLnNlbGVjdCgndXNlJykKICAgICAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMC41KQogICAgICAgICAgICAudHJhbnNpdGlvbigpCiAgICAgICAgICAgIC5kdXJhdGlvbig4MDApCiAgICAgICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDApOwoKICAgICAgICBub2RlLnNlbGVjdEFsbCgncmVjdCcpCiAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLWZpbGwnLCAnIzU1NScpCiAgICAgICAgICAgIC5zdHlsZSgnZmlsbCcsICcjODg4JykKICAgICAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMC41KTsKICAgIH0KCgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIHVwZGF0ZUxpbmtzIC0gc3ViZnVuY3Rpb25zCgogICAgZnVuY3Rpb24gbGlua0VudGVyaW5nKGQpIHsKICAgICAgICB2YXIgbGluayA9IGQzLnNlbGVjdCh0aGlzKTsKICAgICAgICBkLmVsID0gbGluazsKICAgICAgICBhcGkucmVzdHlsZUxpbmtFbGVtZW50KGQpOwogICAgICAgIGlmIChkLnR5cGUoKSA9PT0gJ2hvc3RMaW5rJykgewogICAgICAgICAgICBzdXMudmlzaWJsZShsaW5rLCBhcGkuc2hvd0hvc3RzKCkpOwogICAgICAgIH0KICAgIH0KCiAgICB2YXIgbGlua0xhYmVsT2Zmc2V0ID0gJzAuM2VtJzsKCiAgICBmdW5jdGlvbiBhcHBseUxpbmtMYWJlbHMoKSB7CiAgICAgICAgdmFyIGVudGVyaW5nOwoKICAgICAgICBhcGkudXBkYXRlTGlua0xhYmVsTW9kZWwoKTsKCiAgICAgICAgLy8gZm9yIGVsZW1lbnRzIGFscmVhZHkgZXhpc3RpbmcsIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSB0ZXh0CiAgICAgICAgLy8gYW5kIGFkanVzdCB0aGUgcmVjdGFuZ2xlIHNpemUgdG8gZml0CiAgICAgICAgYXBpLmxpbmtMYWJlbCgpLmVhY2goZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgdmFyIGVsID0gZDMuc2VsZWN0KHRoaXMpLAogICAgICAgICAgICAgICAgcmVjdCA9IGVsLnNlbGVjdCgncmVjdCcpLAogICAgICAgICAgICAgICAgdGV4dCA9IGVsLnNlbGVjdCgndGV4dCcpOwogICAgICAgICAgICB0ZXh0LnRleHQoZC5sYWJlbCk7CiAgICAgICAgICAgIHJlY3QuYXR0cihyZWN0QXJvdW5kVGV4dChlbCkpOwogICAgICAgIH0pOwoKICAgICAgICBlbnRlcmluZyA9IGFwaS5saW5rTGFiZWwoKS5lbnRlcigpLmFwcGVuZCgnZycpCiAgICAgICAgICAgIC5jbGFzc2VkKCdsaW5rTGFiZWwnLCB0cnVlKQogICAgICAgICAgICAuYXR0cignaWQnLCBmdW5jdGlvbiAoZCkgeyByZXR1cm4gZC5pZDsgfSk7CgogICAgICAgIGVudGVyaW5nLmVhY2goZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgdmFyIGVsID0gZDMuc2VsZWN0KHRoaXMpLAogICAgICAgICAgICAgICAgcmVjdCwKICAgICAgICAgICAgICAgIHRleHQ7CgogICAgICAgICAgICBpZiAoZC5sZGF0YS50eXBlKCkgPT09ICdob3N0TGluaycpIHsKICAgICAgICAgICAgICAgIGVsLmNsYXNzZWQoJ2hvc3RMaW5rTGFiZWwnLCB0cnVlKTsKICAgICAgICAgICAgICAgIHN1cy52aXNpYmxlKGVsLCBhcGkuc2hvd0hvc3RzKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBkLmVsID0gZWw7CiAgICAgICAgICAgIHJlY3QgPSBlbC5hcHBlbmQoJ3JlY3QnKTsKICAgICAgICAgICAgdGV4dCA9IGVsLmFwcGVuZCgndGV4dCcpLnRleHQoZC5sYWJlbCk7CiAgICAgICAgICAgIHJlY3QuYXR0cihyZWN0QXJvdW5kVGV4dChlbCkpOwogICAgICAgICAgICB0ZXh0LmF0dHIoJ2R5JywgbGlua0xhYmVsT2Zmc2V0KTsKCiAgICAgICAgICAgIGVsLmF0dHIoJ3RyYW5zZm9ybScsIHRyYW5zZm9ybUxhYmVsKGQubGRhdGEucG9zaXRpb24pKTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gUmVtb3ZlIGFueSBsYWJlbHMgdGhhdCBhcmUgbm8gbG9uZ2VyIHJlcXVpcmVkLgogICAgICAgIGFwaS5saW5rTGFiZWwoKS5leGl0KCkucmVtb3ZlKCk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVjdEFyb3VuZFRleHQoZWwpIHsKICAgICAgICB2YXIgdGV4dCA9IGVsLnNlbGVjdCgndGV4dCcpLAogICAgICAgICAgICBib3ggPSB0ZXh0Lm5vZGUoKS5nZXRCQm94KCk7CgogICAgICAgIC8vIHRyYW5zbGF0ZSB0aGUgYmJveCBzbyB0aGF0IGl0IGlzIGNlbnRlcmVkIG9uIFt4LHldCiAgICAgICAgYm94LnggPSAtYm94LndpZHRoIC8gMjsKICAgICAgICBib3gueSA9IC1ib3guaGVpZ2h0IC8gMjsKCiAgICAgICAgLy8gYWRkIHBhZGRpbmcKICAgICAgICBib3gueCAtPSAxOwogICAgICAgIGJveC53aWR0aCArPSAyOwogICAgICAgIHJldHVybiBib3g7CiAgICB9CgogICAgZnVuY3Rpb24gdHJhbnNmb3JtTGFiZWwocCkgewogICAgICAgIHZhciBkeCA9IHAueDIgLSBwLngxLAogICAgICAgICAgICBkeSA9IHAueTIgLSBwLnkxLAogICAgICAgICAgICB4TWlkID0gZHgvMiArIHAueDEsCiAgICAgICAgICAgIHlNaWQgPSBkeS8yICsgcC55MTsKICAgICAgICByZXR1cm4gc3VzLnRyYW5zbGF0ZSh4TWlkLCB5TWlkKTsKICAgIH0KCiAgICBmdW5jdGlvbiBhcHBseVBvcnRMYWJlbHMoZGF0YSwgcG9ydExhYmVsRykgewogICAgICAgIHZhciBlbnRlcmluZyA9IHBvcnRMYWJlbEcuc2VsZWN0QWxsKCcucG9ydExhYmVsJykKICAgICAgICAgICAgLmRhdGEoZGF0YSkuZW50ZXIoKS5hcHBlbmQoJ2cnKQogICAgICAgICAgICAuY2xhc3NlZCgncG9ydExhYmVsJywgdHJ1ZSkKICAgICAgICAgICAgLmF0dHIoJ2lkJywgZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGQuaWQ7IH0pOwoKICAgICAgICBlbnRlcmluZy5lYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIHZhciBlbCA9IGQzLnNlbGVjdCh0aGlzKSwKICAgICAgICAgICAgICAgIHJlY3QgPSBlbC5hcHBlbmQoJ3JlY3QnKSwKICAgICAgICAgICAgICAgIHRleHQgPSBlbC5hcHBlbmQoJ3RleHQnKS50ZXh0KGQubnVtKTsKCiAgICAgICAgICAgIHJlY3QuYXR0cihyZWN0QXJvdW5kVGV4dChlbCkpOwogICAgICAgICAgICB0ZXh0LmF0dHIoJ2R5JywgbGlua0xhYmVsT2Zmc2V0KTsKICAgICAgICAgICAgZWwuYXR0cigndHJhbnNmb3JtJywgc3VzLnRyYW5zbGF0ZShkLngsIGQueSkpOwogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGxhYmVsUG9pbnQobGlua1BvcykgewogICAgICAgIHZhciBsZW5ndGhVcExpbmUgPSAxIC8gMywKICAgICAgICAgICAgZHggPSBsaW5rUG9zLngyIC0gbGlua1Bvcy54MSwKICAgICAgICAgICAgZHkgPSBsaW5rUG9zLnkyIC0gbGlua1Bvcy55MSwKICAgICAgICAgICAgbW92ZWRYID0gZHggKiBsZW5ndGhVcExpbmUsCiAgICAgICAgICAgIG1vdmVkWSA9IGR5ICogbGVuZ3RoVXBMaW5lOwoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB4OiBtb3ZlZFgsCiAgICAgICAgICAgIHk6IG1vdmVkWQogICAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gY2FsY0dyb3VwUG9zKGxpbmtQb3MpIHsKICAgICAgICB2YXIgbW92ZWQgPSBsYWJlbFBvaW50KGxpbmtQb3MpOwogICAgICAgIHJldHVybiBzdXMudHJhbnNsYXRlKGxpbmtQb3MueDEgKyBtb3ZlZC54LCBsaW5rUG9zLnkxICsgbW92ZWQueSk7CiAgICB9CgogICAgLy8gY2FsY3VsYXRlcyB3aGVyZSBvbiB0aGUgbGluayB0aGF0IHRoZSBoYXNoIGxpbmUgZm9yIDUrIGxhYmVsIGFwcGVhcnMKICAgIGZ1bmN0aW9uIGhhc2hBdHRycyhsaW5rUG9zKSB7CiAgICAgICAgdmFyIGhhc2hMZW5ndGggPSAyNSwKICAgICAgICAgICAgaGFsZkxlbmd0aCA9IGhhc2hMZW5ndGggLyAyLAogICAgICAgICAgICBkeCA9IGxpbmtQb3MueDIgLSBsaW5rUG9zLngxLAogICAgICAgICAgICBkeSA9IGxpbmtQb3MueTIgLSBsaW5rUG9zLnkxLAogICAgICAgICAgICBsZW5ndGggPSBNYXRoLnNxcnQoKGR4ICogZHgpICsgKGR5ICogZHkpKSwKICAgICAgICAgICAgbW92ZUFtdFggPSAoZHggLyBsZW5ndGgpICogaGFsZkxlbmd0aCwKICAgICAgICAgICAgbW92ZUFtdFkgPSAoZHkgLyBsZW5ndGgpICogaGFsZkxlbmd0aCwKICAgICAgICAgICAgbWlkID0gbGFiZWxQb2ludChsaW5rUG9zKSwKICAgICAgICAgICAgYW5nbGUgPSBNYXRoLmF0YW4oZHkgLyBkeCkgKyA0NTsKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgeDE6IG1pZC54IC0gbW92ZUFtdFgsCiAgICAgICAgICAgIHkxOiBtaWQueSAtIG1vdmVBbXRZLAogICAgICAgICAgICB4MjogbWlkLnggKyBtb3ZlQW10WCwKICAgICAgICAgICAgeTI6IG1pZC55ICsgbW92ZUFtdFksCiAgICAgICAgICAgIHN0cm9rZTogYXBpLmxpbmtDb25maWcoKVt0cy50aGVtZSgpXS5iYXNlQ29sb3IsCiAgICAgICAgICAgIHRyYW5zZm9ybTogJ3JvdGF0ZSgnICsgYW5nbGUgKyAnLCcgKyBtaWQueCArICcsJyArIG1pZC55ICsgJyknCiAgICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiB0ZXh0TGFiZWxQb3MobGlua1BvcykgewogICAgICAgIHZhciBwb2ludCA9IGxhYmVsUG9pbnQobGlua1BvcyksCiAgICAgICAgICAgIGRpc3QgPSAyMDsKICAgICAgjvHvVplgAQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANMQ+QABABuaewKgHNsCoB2CWzx/1o2ru1g6/GDSAECFmR/4AAAEBCAoAt+K0AGIpq47x71bvYAEAAgwAAAIMAABo9ygf0sUIACetHhMIAEUAC/R/YUAAQAYfvMCoB2DAqAc2H/WWzw6/GDSjau7WgBgD4JvNAAABAQgKAGIpqwC34rAgIHJldHVybiB7CiAgICAgICAgICAgIHg6IHBvaW50LnggKyBkaXN0LAogICAgICAgICAgICB5OiBwb2ludC55ICsgZGlzdAogICAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gYXBwbHlOdW1MaW5rTGFiZWxzKGRhdGEsIGxibHNHKSB7CiAgICAgICAgdmFyIGxhYmVscyA9IGxibHNHLnNlbGVjdEFsbCgnZy5udW1MaW5rTGFiZWwnKQogICAgICAgICAgICAgICAgLmRhdGEoZGF0YSwgZnVuY3Rpb24gKGQpIHsgcmV0dXJuICdwYWlyLScgKyBkLmlkOyB9KSwKICAgICAgICAgICAgZW50ZXJpbmc7CgogICAgICAgIC8vIHVwZGF0ZSBleGlzdGluZyBsYWJlbHMKICAgICAgICBsYWJlbHMuZWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgICAgICB2YXIgZWwgPSBkMy5zZWxlY3QodGhpcyk7CgogICAgICAgICAgICBlbC5hdHRyKHsKICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGNhbGNHcm91cFBvcyhkLmxpbmtDb29yZHMpOyB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBlbC5zZWxlY3QoJ2xpbmUnKQogICAgICAgICAgICAgICAgLmF0dHIoaGFzaEF0dHJzKGQubGlua0Nvb3JkcykpOwogICAgICAgICAgICBlbC5zZWxlY3QoJ3RleHQnKQogICAgICAgICAgICAgICAgLmF0dHIodGV4dExhYmVsUG9zKGQubGlua0Nvb3JkcykpCiAgICAgICAgICAgICAgICAudGV4dChkLm51bSk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIGFkZCBuZXcgbGFiZWxzCiAgICAgICAgZW50ZXJpbmcgPSBsYWJlbHMKICAgICAgICAgICAgLmVudGVyKCkKICAgICAgICAgICAgLmFwcGVuZCgnZycpCiAgICAgICAgICAgIC5hdHRyKHsKICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGNhbGNHcm91cFBvcyhkLmxpbmtDb29yZHMpOyB9LAogICAgICAgICAgICAgICAgaWQ6IGZ1bmN0aW9uIChkKSB7IHJldHVybiAncGFpci0nICsgZC5pZDsgfQogICAgICAgICAgICB9KQogICAgICAgICAgICAuY2xhc3NlZCgnbnVtTGlua0xhYmVsJywgdHJ1ZSk7CgogICAgICAgIGVudGVyaW5nLmVhY2goZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgdmFyIGVsID0gZDMuc2VsZWN0KHRoaXMpOwoKICAgICAgICAgICAgZWwuYXBwZW5kKCdsaW5lJykKICAgICAgICAgICAgICAgIC5jbGFzc2VkKCdudW1MaW5rSGFzaCcsIHRydWUpCiAgICAgICAgICAgICAgICAuYXR0cihoYXNoQXR0cnMoZC5saW5rQ29vcmRzKSk7CiAgICAgICAgICAgIGVsLmFwcGVuZCgndGV4dCcpCiAgICAgICAgICAgICAgICAuY2xhc3NlZCgnbnVtTGlua1RleHQnLCB0cnVlKQogICAgICAgICAgICAgICAgLmF0dHIodGV4dExhYmVsUG9zKGQubGlua0Nvb3JkcykpCiAgICAgICAgICAgICAgICAudGV4dChkLm51bSk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIHJlbW92ZSBvbGQgbGFiZWxzCiAgICAgICAgbGFiZWxzLmV4aXQoKS5yZW1vdmUoKTsKICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gTW9kdWxlIGRlZmluaXRpb24KCiAgICBhbmd1bGFyLm1vZHVsZSgnb3ZUb3BvJykKICAgIC5mYWN0b3J5KCdUb3BvRDNTZXJ2aWNlJywKICAgICAgICBbJyRsb2cnLCAnRm5TZXJ2aWNlJywgJ1N2Z1V0aWxTZXJ2aWNlJywgJ0ljb25TZXJ2aWNlJywgJ1RoZW1lU2VydmljZScsCgogICAgICAgIGZ1bmN0aW9uIChfJGxvZ18sIF9mc18sIF9zdXNfLCBfaXNfLCBfdHNfKSB7CiAgICAgICAgICAgICRsb2cgPSBfJGxvZ187CiAgICAgICAgICAgIGZzID0gX2ZzXzsKICAgICAgICAgICAgc3VzID0gX3N1c187CiAgICAgICAgICAgIGlzID0gX2lzXzsKICAgICAgICAgICAgdHMgPSBfdHNfOwoKICAgICAgICAgICAgaWNmZyA9IGlzLmljb25Db25maWcoKTsKCiAgICAgICAgICAgIGZ1bmN0aW9uIGluaXREMyhfYXBpXykgewogICAgICAgICAgICAgICAgYXBpID0gX2FwaV87CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZ1bmN0aW9uIGRlc3Ryb3lEMygpIHsgfQoKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGluaXREMzogaW5pdEQzLAogICAgICAgICAgICAgICAgZGVzdHJveUQzOiBkZXN0cm95RDMsCgogICAgICAgICAgICAgICAgaW5jRGV2TGFiSW5kZXg6IGluY0RldkxhYkluZGV4LAogICAgICAgICAgICAgICAgYWRqdXN0UmVjdFRvRml0VGV4dDogYWRqdXN0UmVjdFRvRml0VGV4dCwKICAgICAgICAgICAgICAgIGhvc3RMYWJlbDogaG9zdExhYmVsLAogICAgICAgICAgICAgICAgZGV2aWNlTGFiZWw6IGRldmljZUxhYmVsLAogICAgICAgICAgICAgICAgdHJpbUxhYmVsOiB0cmltTGFiZWwsCgogICAgICAgICAgICAgICAgdXBkYXRlRGV2aWNlTGFiZWw6IHVwZGF0ZURldmljZVJlbmRlcmluZywKICAgICAgICAgICAgICAgIHVwZGF0ZUhvc3RMYWJlbDogdXBkYXRlSG9zdExhYmVsLAogICAgICAgICAgICAgICAgdXBkYXRlRGV2aWNlQ29sb3JzOiB1cGRhdGVEZXZpY2VDb2xvcnMsCgogICAgICAgICAgICAgICAgZGV2aWNlRXhpc3Rpbmc6IGRldmljZUV4aXN0aW5nLAogICAgICAgICAgICAgICAgaG9zdEV4aXN0aW5nOiBob3N0RXhpc3RpbmcsCiAgICAgICAgICAgICAgICBkZXZpY2VFbnRlcjogZGV2aWNlRW50ZXIsCiAgICAgICAgICAgICAgICBob3N0RW50ZXI6IGhvc3RFbnRlciwKICAgICAgICAgICAgICAgIGhvc3RFeGl0OiBob3N0RXhpdCwKICAgICAgICAgICAgICAgIGRldmljZUV4aXQ6IGRldmljZUV4aXQsCgogICAgICAgICAgICAgICAgbGlua0VudGVyaW5nOiBsaW5rRW50ZXJpbmcsCiAgICAgICAgICAgICAgICBhcHBseUxpbmtMYWJlbHM6IGFwcGx5TGlua0xhYmVscywKICAgICAgICAgICAgICAgIHRyYW5zZm9ybUxhYmVsOiB0cmFuc2Zvcm1MYWJlbCwKICAgICAgICAgICAgICAgIGFwcGx5UG9ydExhYmVsczogYXBwbHlQb3J0TGFiZWxzLAogICAgICAgICAgICAgICAgYXBwbHlOdW1MaW5rTGFiZWxzOiBhcHBseU51bUxpbmtMYWJlbHMKICAgICAgICAgICAgfTsKICAgICAgICB9XSk7Cn0oKSk7Co7x71ZNYQEAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADTEP0AAQAbmncCoBzbAqAdgls8f9aNq7tYOvyP0gBAhZjw+AAABAQgKALfitABiKauO8e9WQmIBAJECAACRAgAACAAnrR4TaPcoH9LFCABFAAKDX8JAAEAGSMzAqAc2wKgHYJbQH/X5Pjw5aztGboAYBaQMEgAAAQEICgC34rQAYimrR0VUIC9vbm9zL3VpL2FwcC92aWV3L3RvcG8vdG9wb0RpYWxvZy5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0KjvHvViFmAQCRAgAAkQIAAAgAJ60eE2j3KB/SxQgARQACg8RAQABABuRNwKgHNsCoB2CWzx/1o2ru1g6/I/SAGCFm/3kAAAEBCAoAt+K1AGIpq0dFVCAvb25vcy91aS9hcHAvdmlldy90b3BvL3RvcG9GaWx0ZXIuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6ICovKg0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71aPcAEAgAAAAIAAAABo9ygf0sUIACetHhMIAEUAAHLMw0AAQAbd28CoB2DAqAc2H/WW0VqWCQOMl+a+gBgDgZBLAAABAQgKAGIprAC34q9IVFRQLzEuMSAzMDQgTm90IE1vZGlmaWVkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCo7x71aDcQEAgAAAAIAAAABo9ygf0sUIACetHhMIAEUAAHIpDkAAQAaBkcCoB2DAqAc2H/WW0lNSIo80h5eegBgDj5BLAAABAQgKAGIprAC34q9IVFRQLzEuMSAzMDQgTm90IE1vZGlmaWVkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCo7x71b1dAEAMg8AADIPAABo9ygf0sUIACetHhMIAEUADySBckAAQAYae8CoB2DAqAc2H/WW1KGvJw5A3gj3gBgDO579AAABAQgKAGIprAC34rRIVFRQLzEuMSAyMDAgT0sNCkNvbnRlbnQtVHlwZTogdGV4dC9qYXZhc2NyaXB0DQpDb250ZW50LUxlbmd0aDogMzcxOQ0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBUb3BvbG9neSBFdmVudCBNb2R1bGUuCgogRGVmaW5lcyB0aGUgY29uZHVpdCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHRoZSBzZXJ2ZXI6CiAgICAtIHByb3ZpZGVzIGEgY2xlYW4gQVBJIGZvciBzZW5kaW5nIGV2ZW50cyB0byB0aGUgc2VydmVyCiAgICAtIGRpc3BhdGNoZXMgaW5jb21pbmcgZXZlbnRzIGZyb20gdGhlIHNlcnZlciB0byB0aGUgYXBwcm9wcmlhdGUgc3ViLW1vZHVsZQoKICovCgooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIGluamVjdGVkIHJlZnMKICAgIHZhciAkbG9nLCAkaW50ZXJ2YWwsIHdzcywgdHBzLCB0aXMsIHRmcywgdHNzLCB0b3YsIHRzcHI7CgogICAgLy8gaW50ZXJuYWwgc3RhdGUKICAgIHZhciBoYW5kbGVyTWFwLAogICAgICAgIG9wZW5MaXN0ZW5lciwKICAgICAgICBoZWFydGJlYXRUaW1lcjsKCiAgICB2YXIgaGVhcnRiZWF0UGVyaW9kID0gOTAwMDsgLy8gOSBzZWNvbmRzCgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBmdW5jdGlvbiBjcmVhdGVIYW5kbGVyTWFwKCkgewogICAgICAgIGhhbmRsZXJNYXAgPSB7CiAgICAgICAgICAgIHNob3dTdW1tYXJ5OiB0cHMsCgogICAgICAgICAgICBzaG93RGV0YWlsczogdHNzLAoKICAgICAgICAgICAgc2hvd0hpZ2hsaWdodHM6IHRvdiwKCiAgICAgICAgICAgIGFkZEluc3RhbmNlOiB0aXMsCiAgICAgICAgICAgIHVwZGF0ZUluc3RhbmNlOiB0aXMsCiAgICAgICAgICAgIHJlbW92ZUluc3RhbmNlOiB0aXMsCgogICAgICAgICAgICBhZGREZXZpY2U6IHRmcywKICAgICAgICAgICAgdXBkYXRlRGV2aWNlOiB0ZnMsCiAgICAgICAgICAgIHJlbW92ZURldmljZTogdGZzLAogICAgICAgICAgICBhZGRIb3N0OiB0ZnMsCiAgICAgICAgICAgIHVwZGF0ZUhvc3Q6IHRmcywKICAgICAgICAgICAgbW92ZUhvc3Q6IHRmcywKICAgICAgICAgICAgcmVtb3ZlSG9zdDogdGZzLAogICAgICAgICAgICBhZGRMaW5rOiB0ZnMsCiAgICAgICAgICAgIHVwZGF0ZUxpbms6IHRmcywKICAgICAgICAgICAgcmVtb3ZlTGluazogdGZzLAoKICAgICAgICAgICAgdG9wb1N0YXJ0RG9uZTogdGZzLAoKICAgICAgICAgICAgc3ByaXRlTGlzdFJlc3BvbnNlOiB0c3ByLAogICAgICAgICAgICBzcHJpdGVEYXRhUmVzcG9uc2U6IHRzcHIKICAgICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHdzT3Blbihob3N0LCB1cmwpIHsKICAgICAgICAkbG9nLmRlYnVnKCdUT1BPOiB3ZWIgc29ja2V0IG9wZW4gLSBjbHVzdGVyIG5vZGU6JywgaG9zdCwgJ1VSTDonLCB1cmwpOwogICAgICAgIC8vIFJlcXVlc3QgYmF0Y2ggb2YgaW5pdGlhbCBkYXRhIGZyb20gdGhlIG5ldyBzZXJ2ZXIKICAgICAgICB3c3Muc2VuZEV2ZW50KCd0b3BvU3RhcnQnKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjYW5jZWxIZWFydGJlYXQoKSB7CiAgICAgICAgaWYgKGhlYXJ0YmVhdFRpbWVyKSB7CiAgICAgICAgICAgICRpbnRlcnZhbC5jYW5jZWwoaGVhcnRiZWF0VGltZXIpOwogICAgICAgIH0KICAgICAgICBoZWFydGJlYXRUaW1lciA9IG51bGw7CiAgICB9CgogICAgZnVuY3Rpb24gc2NoZWR1bGVIZWFydGJlYXQoKSB7CiAgICAgICAgY2FuY2VsSGVhcnRiZWF0KCk7CiAgICAgICAgaGVhcnRiZWF0VGltZXIgPSAkaW50ZXJ2YWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICB3c3Muc2VuZEV2ZW50KCd0b3BvSGVhcnRiZWF0Jyk7CiAgICAgICAgfSwgaGVhcnRiZWF0UGVyaW9kKTsKICAgIH0KCgogICAgYW5ndWxhci5tb2R1bGUoJ292VG9wbycpCiAgICAuZmFjdG9yeSgnVG9wb0V2ZW50U2VydmljZScsCiAgICAgICAgWyckbG9nJywgJyRpbnRlcnZhbCcsICdXZWJTb2NrZXRTZXJ2aWNlJywKICAgICAgICAgICAgJ1RvcG9QYW5lbFNlcnZpY2UnLCAnVG9wb0luc3RTZXJ2aWNlJywgJ1RvcG9Gb3JjZVNlcnZpY2UnLAogICAgICAgICAgICAnVG9wb1NlbGVjdFNlcnZpY2UnLCAnVG9wb092ZXJsYXlTZXJ2aWNlJywgJ1RvcG9TcHJpdGVTZXJ2aWNlJywKCiAgICAgICAgZnVuY3Rpb24gKF8kbG9nXywgIF8kaW50ZXJ2YWxfLCBfd3NzXywKICAgICAgICAgICAgICAgICAgX3Rwc18sIF90aXNfLCBfdGZzXywgX3Rzc18sIF90b3ZfLCBfdHNwcl8pIHsKICAgICAgICAgICAgJGxvZyA9IF8kbG9nXzsKICAgICAgICAgICAgJGludGVydmFsID0gXyRpbnRlcnZhbF87CiAgICAgICAgICAgIHdzcyA9IF93c3NfOwogICAgICAgICAgICB0cHMgPSBfdHBzXzsKICAgICAgICAgICAgdGlzID0gX3Rpc187CiAgICAgICAgICAgIHRmcyA9IF90ZnNfOwogICAgICAgICAgICB0c3MgPSBfdHNzXzsKICAgICAgICAgICAgdG92ID0gX3Rvdl87CiAgICAgICAgICAgIHRzcHIgPSBfdHNwcl87CgogICAgICAgICAgICBjcmVhdGVIYW5kbGVyTWFwKCk7CgogICAgICAgICAgICBmdW5jdGlvbiBzdGFydCgpIHsKICAgICAgICAgICAgICAgIG9wZW5MaXN0ZW5lciA9IHdzcy5hZGRPcGVuTGlzdGVuZXIod3NPcGVuKTsKICAgICAgICAgICAgICAgIHdzcy5iaW5kSGFuZGxlcnMoaGFuZGxlck1hcCk7CiAgICAgICAgICAgICAgICB3c3Muc2VuZEV2ZW50KCd0b3BvU3RhcnQnKTsKICAgICAgICAgICAgICAgIHNjaGVkdWxlSGVhcnRiZWF0KCk7CiAgICAgICAgICAgICAgICAkbG9nLmRlYnVnKCd0b3BvIGNvbW1zIHN0YXJ0ZWQnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZnVuY3Rpb24gc3RvcCgpIHsKICAgICAgICAgICAgICAgIGNhbmNlbEhlYXJ0YmVhdCgpOwogICAgICAgICAgICAgICAgd3NzLnNlbmRFdmVudCgndG9wb1N0b3AnKTsKICAgICAgICAgICAgICAgIHdzcy51bmJpbmRIYW5kbGVycyhoYW5kbGVyTWFwKTsKICAgICAgICAgICAgICAgIHdzcy5yZW1vdmVPcGVuTGlzdGVuZXIob3Blbkxpc3RlbmVyKTsKICAgICAgICAgICAgICAgIG9wZW5MaXN0ZW5lciA9IG51bGw7CiAgICAgICAgICAgICAgICAkbG9nLmRlYnVnKCd0b3BvIGNvbW1zIHN0b3BwZWQnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHN0YXJ0OiBzdGFydCwKICAgICAgICAgICAgICAgIHN0b3A6IHN0b3AKICAgICAgICAgICAgfTsKICAgICAgICB9XSk7Cn0oKSk7Co7x71YBdQEAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADTiakAAQAbIcsCoBzbAqAdgltQf9UDeCPehrzX+gBAHoPltAAABAQgKALfitgBiKayO8e9Wq3cBAJACAACQAgAACAAnrR4TaPcoH9LFCABFAAKC3btAAEAGytPAqAc2wKgHYJbRH/WMl+a+WpYJQYAYBaTVqgAAAQEICgC34rYAYimsR0VUIC9vbm9zL3VpL2FwcC92aWV3L3RvcG8vdG9wb0ZvcmNlLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiAqLyoNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQqO8e9WwHoBAI8CAACPAgAACAAnrR4TaPcoH9LFCABFAAKBa9FAAEAGPL/AqAc2wKgHYJbSH/U0h5eeU1IizYAYDzMBtQAAAQEICgC34rYAYimsR0VUIC9vbm9zL3VpL2FwcC92aWV3L3RvcG8vdG9wb0luc3QuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6ICovKg0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71bxfwEAjwIAAI8CAAAIACetHhNo9ygf0sUIAEUAAoHia0AAQAbGJMCoBzbAqAdgltQf9UDeCPehrzX+gBgHoDgKAAABAQgKALfitgBiKaxHRVQgL29ub3MvdWkvYXBwL3ZpZXcvdG9wby90b3BvTGluay5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0KjvHvVmGkAQCKHAAAihwAAGj3KB/SxQgAJ60eEwgARQAcfCv6QABABmKbwKgHYMCoBzYf9ZbTcoMr9WEciPuAEAMorFUAAAEBCAoAYimvALfisEhUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2phdmFzY3JpcHQNCkNvbnRlbnQtTGVuZ3RoOiAxODAzNA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNCwyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIFRvcG9sb2d5IFZpZXcgTW9kdWxlCiAqLwoKKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICB2YXIgbW9kdWxlRGVwZW5kZW5jaWVzID0gWwogICAgICAgICduZ0Nvb2tpZXMnLAogICAgICAgICdvbm9zVXRpbCcsCiAgICAgICAgJ29ub3NTdmcnLAogICAgICAgICdvbm9zUmVtb3RlJwogICAgXTsKCiAgICAvLyByZWZlcmVuY2VzIHRvIGluamVjdGVkIHNlcnZpY2VzIGV0Yy4KICAgIHZhciAkc2NvcGUsICRsb2csICRjb29raWVzLCBmcywga3MsIHpzLCBncywgbXMsIHN1cywgZmxhc2gsIHdzcywgcHMsCiAgICAgICAgdGRzLCB0ZXMsIHRmcywgdHBzLCB0aXMsIHRzcywgdGxzLCB0dHMsIHRvcywgZmx0ciwgdHRicywgdHRpcCwgdG92OwoKICAgIC8vIERPTSBlbGVtZW50cwogICAgdmFyIG92dG9wbywgc3ZnLCBkZWZzLCB6b29tTGF5ZXIsIG1hcEcsIHNwcml0ZUcsIGZvcmNlRywgbm9EZXZzTGF5ZXI7CgogICAgLy8gSW50ZXJuYWwgc3RhdGUKICAgIHZhciB6b29tZXIsIGFjdGlvbk1hcDsKCiAgICAvLyAtLS0gU2hvcnQgQ3V0IEtleXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgZnVuY3Rpb24gc2V0VXBLZXlzKG92ZXJsYXlLZXlzKSB7CiAgICAgICAgLy8ga2V5IGJpbmRpbmdzIG5lZWQgdG8gYmUgbWFkZSBhZnRlciB0aGUgc2VydmljZXMgaGF2ZSBiZWVuIGluamVjdGVkCiAgICAgICAgLy8gdGh1cywgZGVmZXJyZWQgdG8gaGVyZS4uLgogICAgICAgIGFjdGlvbk1hcCA9IHsKICAgICAgICAgICAgSTogW3RvZ2dsZUluc3RhbmNlcywgJ1RvZ2dsZSBPTk9TIGluc3RhbmNlcyBwYW5lbCddLAogICAgICAgICAgICBPOiBbdG9nZ2xlU3VtbWFyeSwgJ1RvZ2dsZSBPTk9TIHN1bW1hcnkgcGFuZWwnXSwKICAgICAgICAgICAgRDogW3RvZ2dsZVVzZURldGFpbHNGbGFnLCAnRGlzYWJsZSAvIGVuYWJsZSBkZXRhaWxzIHBhbmVsJ10sCgogICAgICAgICAgICBIOiBbdG9nZ2xlSG9zdHMsICdUb2dnbGUgaG9zdCB2aXNpYmlsaXR5J10sCiAgICAgICAgICAgIE06IFt0b2dnbGVPZmZsaW5lLCAnVG9nZ2xlIG9mZmxpbmUgdmlzaWJpbGl0eSddLAogICAgICAgICAgICBQOiBbdG9nZ2xlUG9ydHMsICdUb2dnbGUgUG9ydCBIaWdobGlnaHRpbmcnXSwKICAgICAgICAgICAgZGFzaDogW3Rmcy5zaG93QmFkTGlua3MsICdTaG93IGJhZCBsaW5rcyddLAogICAgICAgICAgICBCOiBbdG9nZ2xlTWFwLCAnVG9nZ2xlIGJhY2tncm91bmQgbWFwJ10sCiAgICAgICAgICAgIFM6IFt0b2dnbGVTcHJpdGVzLCAnVG9nZ2xlIHNwcml0ZSBsYXllciddLAoKICAgICAgICAgICAgWDogW3Rmcy5yZXNldEFsbExvY2F0aW9ucywgJ1Jlc2V0IG5vZGUgbG9jYXRpb25zJ10sCiAgICAgICAgICAgIFo6IFt0b3MudG9nZ2xlT2JsaXF1ZSwgJ1RvZ2dsZSBvYmxpcXVlIHZpZXcgKEV4cGVyaW1lbnRhbCknXSwKICAgICAgICAgICAgTjogW2ZsdHIuY2xpY2tBY3Rpb24sICdDeWNsZSBub2RlIGxheWVycyddLAogICAgICAgICAgICBMOiBbdGZzLmN5Y2xlRGV2aWNlTGFiZWxzLCAnQ3ljbGUgZGV2aWNlIGxhYmVscyddLAogICAgICAgICAgICBVOiBbdGZzLnVucGluLCAnVW5waW4gbm9kZSAoaG92ZXIgbW91c2Ugb3ZlciknXSwKICAgICAgICAgICAgUjogW3Jlc2V0Wm9vbSwgJ1Jlc2V0IHBhbiAvIHpvb20nXSwKICAgICAgICAgICAgZG90OiBbdHRicy50b2dnbGVUb29sYmFyLCAnVG9nZ2xlIFRvb2xiYXInXSwKCiAgICAgICAgICAgIEU6IFtlcXVhbGl6ZU1hc3RlcnMsICdFcXVhbGl6ZSBtYXN0ZXJzaGlwIHJvbGVzJ10sCgogICAgICAgICAgICAvLyB0b3BvbG9neSBvdmVybGF5IHNlbGVjdGlvbnMKICAgICAgICAgICAgRjE6IGZ1bmN0aW9uICgpIHsgdHRicy5mbmtleSgwKTsgfSwKICAgICAgICAgICAgRjI6IGZ1bmN0aW9uICgpIHsgdHRicy5mbmtleSgxKTsgfSwKICAgICAgICAgICAgRjM6IGZ1bmN0aW9uICgpIHsgdHRicy5mbmtleSgyKTsgfSwKICAgICAgICAgICAgRjQ6IGZ1bmN0aW9uICgpIHsgdHRicy5mbmtleSgzKTsgfSwKICAgICAgICAgICAgRjU6IGZ1bmN0aW9uICgpIHsgdHRicy5mbmtleSg0KTsgfSwKCiAgICAgICAgICAgIGVzYzogaGFuZGxlRXNjYXBlLAoKICAgICAgICAgICAgX2tleUxpc3RlbmVyOiB0dGJzLmtleUxpc3RlbmVyLAoKICAgICAgICAgICAgX2hlbHBGb3JtYXQ6IFsKICAgICAgICAgICAgICAgIFsnSScsICdPJywgJ0QnLCAnSCcsICdNJywgJ1AnLCAnZGFzaCcsICdCJywgJ1MnIF0sCiAgICAgICAgICAgICAgICBbJ1gnLCAnWicsICdOJywgJ0wnLCAnVScsICdSJywgJy0nLCAnRScsICctJywgJ2RvdCddLAogICAgICAgICAgICAgICAgW10gICAvLyB0aGlzIGNvbHVtbiByZXNlcnZlZCBmb3Igb3ZlcmxheSBhY3Rpb25zCiAgICAgICAgICAgIF0KICAgICAgICB9OwoKICAgICAgICBpZiAoZnMuaXNPKG92ZXJsYXlLZXlzKSkgewogICAgICAgICAgICBtZXJnZUtleXMob3ZlcmxheUtleXMpOwogICAgICAgIH0KCiAgICAgICAga3Mua2V5QmluZGluZ3MoYWN0aW9uTWFwKTsKCiAgICAgICAga3MuZ2VzdHVyZU5vdGVzKFsKICAgICAgICAgICAgWydjbGljaycsICdTZWxlY3QgdGhlIGl0ZW0gYW5kIHNob3cgZGV0YWlscyddLAogICAgICAgICAgICBbJ3NoaWZ0LWNsaWNrJywgJ1RvZ2dsZSBzZWxlY3Rpb24gc3RhdGUnXSwKICAgICAgICAgICAgWydkcmFnJywgJ1JlcG9zaXRpb24gKGFuZCBwaW4pIGRldmljZSAvIGhvc3QnXSwKICAgICAgICAgICAgWydjbWQtc2Nyb2xsJywgJ1pvb20gaW4gLyBvdXQnXSwKICAgICAgICAgICAgWydjbWQtZHJhZycsICdQYW4nXQogICAgICAgIF0pOwogICAgfQoKICAgIC8vIHdoZW4gYSB0b3BvbG9neSBvdmVybGF5IGlzIGFjdGl2YXRlZCwgd2UgbmVlZCB0byBiaW5kIHRoZWlyIGtleXN0cm9rZXMKICAgIC8vIGFuZCBpbmNsdWRlIHRoZW0gaW4gdGhlIHF1aWNrLWhlbHAgcGFuZWwKICAgIGZ1bmN0aW9uIG1lcmdlS2V5cyhleHRyYSkgewogICAgICAgIHZhciBfaGYgPSBhY3Rpb25NYXAuX2hlbHBGb3JtYXRbMl07CgogICAgICAgIGtzLmNoZWNrTm90R2xvYmFsKGV4dHJhKTsKCiAgICAgICAgZXh0cmEuX2tleU9yZGVyLmZvckVhY2goZnVuY3Rpb24gKGspIHsKICAgICAgICAgICAgdmFyIGQgPSBleHRyYVtrXSwKICAgICAgICAgICAgICAgIGNiID0gZCAmJiBkLmNiLAogICAgICAgICAgICAgICAgdHQgPSBkICYmIGQudHQ7CiAgICAgICAgICAgIC8vIE5PVEU6IGlnbm9yZSBrZXlzIHRoYXQgYXJlIGFscmVhZHkgZGVmaW5lZAogICAgICAgICAgICBpZiAoZCAmJiAhYWN0aW9uTWFwW2tdKSB7CiAgICAgICAgICAgICAgICBhY3Rpb25NYXBba10gPSBbY2IsIHR0XTsKICAgICAgICAgICAgICAgIF9oZi5wdXNoKGspOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CgogICAgLy8gLS0tIEtleXN0cm9rZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIGZ1bmN0aW9uIHRvZ2dsZUluc3RhbmNlcyh4KSB7CiAgICAgICAgdXBkYXRlUHJlZnNTdGF0ZSgnaW5zdHMnLCB0aXMudG9nZ2xlKHgpKTsKICAgICAgICB0ZnMudXBkYXRlRGV2aWNlQ29sb3JzKCk7CiAgICB9CgogICAgZnVuY3Rpb24gdG9nZ2xlU3VtbWFyeSh4KSB7CiAgICAgICAgdXBkYXRlUHJlZnNTdGF0ZSgnc3VtbWFyeScsIHRwcy50b2dnbGVTdW1tYXJ5KHgpKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0b2dnbGVVc2VEZXRhaWxzRmxhZyh4KSB7CiAgICAgICAgdXBkYXRlUHJlZnNTdGF0ZSgnZGV0YWlsJywgdHBzLnRvZ2dsZVVzZURldGFpbHNGbGFnKHgpKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0b2dnbGVIb3N0cyh4KSB7CiAgICAgICAgdXBkYXRlUHJlZnNTdGF0ZSgnaG9zdHMnLCB0ZnMudG9nZ2xlSG9zdHMoeCkpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRvZ2dsZU9mZmxpbmUoeCkgewogICAgICAgIHVwZGF0ZVByZWZzU3RhdGUoJ29mZmRldicsIHRmcy50b2dnbGVPZmZsaW5lKHgpKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0b2dnbGVQb3J0cyh4KSB7CiAgICAgICAgdXBkYXRlUHJlZnNTdGF0ZSgncG9ydGhsJywgdGZzLnRvZ2dsZVBvcnRzKHgpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBfdG9nU3ZnTGF5ZXIoeCwgRywgdGFnLCB3aGF0KSB7CiAgICAgICAgdmFyIG9uID0gKHggPT09ICdrZXlldicpID8gIXN1cy52aXNpYmxlKEcpIDogISF4LAogICAgICAgICAgICB2ZXJiID0gb24gPyAnU2hvdycgOiAnSGlkZSc7CiAgICAgICAgc3VzLnZpc2libGUoRywgb24pOwogICAgICAgIHVwZGF0ZVByZWZzU3RhdGUodGFnLCBvbik7CiAgICAgICAgZmxhc2guZmxhc2godmVyYiArICcgJyArIHdoYXQpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRvZ2dsZU1hcCh4KSB7CiAgICAgICAgX3RvZ1N2Z0xheWVyKHgsIG1hcEcsICdiZycsICdiYWNrZ3JvdW5kIG1hcCcpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRvZ2dsZVNwcml0ZXMoeCkgewogICAgICAgIF90b2dTdmdMYXllcih4LCBzcHJpdGVHLCAnc3ByJywgJ3Nwcml0ZSBsYXllcicpOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlc2V0Wm9vbSgpIHsKICAgICAgICB6b29tZXIucmVzZXQoKTsKICAgICAgICBmbGFzaC5mbGFzaCgnUGFuIGFuZCB6b29tIHJlc2V0Jyk7CiAgICB9CgogICAgZnVuY3Rpb24gZXF1YWxpemVNYXN0ZXJzKCkgewogICAgICAgIHdzcy5zZW5kRXZlbnQoJ2VxdWFsaXplTWFzdGVycycpOwogICAgICAgIGZsYXNoLmZsYXNoKCdFcXVhbGl6aW5nIG1hc3RlciByb2xlcycpOwogICAgfQoKICAgIGZ1bmN0aW9uIGhhbmRsZUVzY2FwZSgpIHsKICAgICAgICBpZiAodGlzLnNob3dNYXN0ZXIoKSkgewogICAgICAgICAgICAvLyBpZiBhbiBpbnN0YW5jZSBpcyBzZWxlY3RlZCwgY2FuY2VsIHRoZSBhZmZpbml0eSBtYXBwaW5nCiAgICAgICAgICAgIHRpcy5jYW5jZWxBZmZpbml0eSgpCgogICAgICAgIH0gZWxzZSBpZiAodG92Lmhvb2tzLmVzY2FwZSgpKSB7CiAgICAgICAgICAgIC8vIGVsc2UgaWYgdGhlIG92ZXJsYXkgY29uc3VtZWQgdGhlIEVTQyBldmVudC4uLgogICAgICAgICAgICAvLyAod29yayBhbHJlYWR5IGRvbmUpCgogICAgICAgIH0gZWxzZSBpZiAodHNzLmRlc2VsZWN0QWxsKCkpIHsKICAgICAgICAgICAgLy8gZWxzZSBpZiB3ZSBoYXZlIG5vZGUgc2VsZWN0aW9ucywgZGVzZWxlY3QgdGhlbSBhbGwKICAgICAgICAgICAgLy8gKHdvcmsgYWxyZWFkeSBkb25lKQoKICAgICAgICB9IGVsc2UgaWYgKHRscy5kZXNlbGVjdExpbmsoKSkgewogICAgICAgICAgICAvLyBlbHNlIGlmIHdlIGhhdmUgYSBsaW5rIHNlbGVjdGVkLCBkZXNlbGVjdCBpdAogICAgICAgICAgICAvLyAod29yayBhbHJlYWR5IGRvbmUpCgogICAgICAgIH0gZWxzZSBpZiAodGlzLmlzVmlzaWJsZSgpKSB7CiAgICAgICAgICAgIC8vIGVsc2UgaWYgdGhlIEluc3RhbmNlIFBhbmVsIGlzIHZpc2libGUsIGhpZGUgaXQKICAgICAgICAgICAgdGlzLmhpZGUoKTsKICAgICAgICAgICAgdGZzLnVwZGF0ZURldmljZUNvbG9ycygpOwoKICAgICAgICB9IGVsc2UgaWYgKHRwcy5zdW1tYXJ5VmlzaWJsZSgpKSB7CiAgICAgICAgICAgIC8vIGVsc2UgaWYgdGhlIFN1bW1hcnkgUGFuZWwgaXMgdmlzaWJsZSwgaGlkZSBpdAogICAgICAgICAgICB0cHMuaGlkZVN1bW1hcnlQYW5lbCgpOwogICAgICAgIH0KICAgIH0KCiAgICAvLyAtLS0gVG9vbGJhciBGdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgZnVuY3Rpb24gbm90VmFsaWQod2hhdCkgewogICAgICAgICRsb2cud2FybigndG9wby5qcyBnZXRBY3Rpb25FbnRyeSgpOiBOb3QgYSB2YWxpZCAnICsgd2hhdCk7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0QWN0aW9uRW50cnkoa2V5KSB7CiAgICAgICAgdmFyIGVudHJ5OwoKICAgICAgICBpZiAoIWtleSkgewogICAgICAgICAgICBub3RWYWxpZCgna2V5Jyk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgZW50cnkgPSBhY3Rpb25NYXBba2V5XTsKCiAgICAgICAgaWYgKCFlbnRyeSkgewogICAgICAgICAgICBub3RWYWxpZCgnYWN0aW9uTWFwIGVudHJ5Jyk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZnMuaXNBKGVudHJ5KSB8fCBbZW50cnksICcnXTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZXRVcFRvb2xiYXIoKSB7CiAgICAgICAgdHRicy5pbml0KHsKICAgICAgICAgICAgZ2V0QWN0aW9uRW50cnk6IGdldEFjdGlvbkVudHJ5LAogICAgICAgICAgICBzZXRVcEtleXM6IHNldFVwS2V5cwogICAgICAgIH0pOwogICAgICAgIHR0YnMuY3JlYXRlVG9vbGJhcigpOwogICAgfQoKICAgIC8vIC0tLSBHbHlwaHMsIEljb25zLCBhbmQgdGhlIGxpa2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBmdW5jdGlvbiBzZXRVcERlZnMoKSB7CiAgICAgICAgZGVmcyA9IHN2Zy5hcHBlbmQoJ2RlZnMnKTsKICAgICAgICBncy6O8e9Wu6QBAIocAACKHAAAaPcoH9LFCAAnrR4TCABFABx8K/9AAEAGYpbAqAdgwKgHNh/1ltNyg0g9YRyI+4AQAyisVQAAAQEICgBiKa8At+KwbG9hZERlZnMoZGVmcyk7CiAgICAgICAgc3VzLmxvYWRHbG93RGVmcyhkZWZzKTsKICAgIH0KCgogICAgLy8gLS0tIFBhbiBhbmQgWm9vbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIC8vIHpvb20gZW5hYmxlZCBwcmVkaWNhdGUuIGV2IGlzIGEgRDMgc291cmNlIGV2ZW50LgogICAgZnVuY3Rpb24gem9vbUVuYWJsZWQoZXYpIHsKICAgICAgICByZXR1cm4gZnMuaXNNb2JpbGUoKSB8fCAoZXYubWV0YUtleSB8fCBldi5hbHRLZXkpOwogICAgfQoKICAgIGZ1bmN0aW9uIHpvb21DYWxsYmFjaygpIHsKICAgICAgICB2YXIgc2MgPSB6b29tZXIuc2NhbGUoKSwKICAgICAgICAgICAgdHIgPSB6b29tZXIudHJhbnNsYXRlKCk7CgogICAgICAgIHBzLnNldFByZWZzKCd0b3BvX3pvb20nLCB7dHg6dHJbMF0sIHR5OnRyWzFdLCBzYzpzY30pOwoKICAgICAgICAvLyBrZWVwIHRoZSBtYXAgbGluZXMgY29uc3RhbnQgd2lkdGggd2hpbGUgem9vbWluZwogICAgICAgIG1hcEcuc3R5bGUoJ3N0cm9rZS13aWR0aCcsICgyLjAgLyBzYykgKyAncHgnKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZXRVcFpvb20oKSB7CiAgICAgICAgem9vbUxheWVyID0gc3ZnLmFwcGVuZCgnZycpLmF0dHIoJ2lkJywgJ3RvcG8tem9vbWxheWVyJyk7CiAgICAgICAgem9vbWVyID0genMuY3JlYXRlWm9vbWVyKHsKICAgICAgICAgICAgc3ZnOiBzdmcsCiAgICAgICAgICAgIHpvb21MYXllcjogem9vbUxheWVyLAogICAgICAgICAgICB6b29tRW5hYmxlZDogem9vbUVuYWJsZWQsCiAgICAgICAgICAgIHpvb21DYWxsYmFjazogem9vbUNhbGxiYWNrCiAgICAgICAgfSk7CiAgICB9CgoKICAgIC8vIGNhbGxiYWNrIGludm9rZWQgd2hlbiB0aGUgU1ZHIHZpZXcgaGFzIGJlZW4gcmVzaXplZC4uCiAgICBmdW5jdGlvbiBzdmdSZXNpemVkKHMpIHsKICAgICAgICB0ZnMubmV3RGltKFtzLndpZHRoLCBzLmhlaWdodF0pOwogICAgfQoKICAgIC8vIC0tLSBCYWNrZ3JvdW5kIE1hcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBmdW5jdGlvbiBzZXRVcE5vRGV2cygpIHsKICAgICAgICB2YXIgZywgYm94OwogICAgICAgIG5vRGV2c0xheWVyID0gc3ZnLmFwcGVuZCgnZycpLmF0dHIoewogICAgICAgICAgICBpZDogJ3RvcG8tbm9EZXZzTGF5ZXInLAogICAgICAgICAgICB0cmFuc2Zvcm06IHN1cy50cmFuc2xhdGUoNTAwLDUwMCkKICAgICAgICB9KTsKICAgICAgICAvLyBOb3RlLCBTVkcgdmlld2JveCBpcyAnMCAwIDEwMDAgMTAwMCcsIGRlZmluZWQgaW4gdG9wby5odG1sLgogICAgICAgIC8vIFdlIGFyZSB0cmFuc2xhdGluZyB0aGlzIGxheWVyIHRvIGhhdmUgaXRzIG9yaWdpbiBhdCB0aGUgY2VudGVyCgogICAgICAgIGcgPSBub0RldnNMYXllci5hcHBlbmQoJ2cnKTsKICAgICAgICBncy5hZGRHbHlwaChnLCAnYmlyZCcsIDEwMCkuYXR0cignY2xhc3MnLCAnbm9EZXZzQmlyZCcpOwogICAgICAgIGcuYXBwZW5kKCd0ZXh0JykudGV4dCgnTm8gZGV2aWNlcyBhcmUgY29ubmVjdGVkJykKICAgICAgICAgICAgLmF0dHIoeyB4OiAxMjAsIHk6IDgwfSk7CgogICAgICAgIGJveCA9IGcubm9kZSgpLmdldEJCb3goKTsKICAgICAgICBib3gueCAtPSBib3gud2lkdGgvMjsKICAgICAgICBib3gueSAtPSBib3guaGVpZ2h0LzI7CiAgICAgICAgZy5hdHRyKCd0cmFuc2Zvcm0nLCBzdXMudHJhbnNsYXRlKGJveC54LCBib3gueSkpOwoKICAgICAgICBzaG93Tm9EZXZzKHRydWUpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNob3dOb0RldnMoYikgewogICAgICAgIHN1cy52aXNpYmxlKG5vRGV2c0xheWVyLCBiKTsKICAgIH0KCgogICAgdmFyIGNvdW50cnlGaWx0ZXJzID0gewogICAgICAgIHdvcmxkOiBmdW5jdGlvbiAoYykgewogICAgICAgICAgICByZXR1cm4gYy5wcm9wZXJ0aWVzLmNvbnRpbmVudCAhPT0gJ0FudGFyY3RpY2EnOwogICAgICAgIH0sCgogICAgICAgIC8vIE5PVEU6IGZvciAidXNhIiB3ZSBhcmUgdXNpbmcgb3VyIGhhbmQtY3JhZnRlZCB0b3BvanNvbiBmaWxlCgogICAgICAgIHNfYW1lcmljYTogZnVuY3Rpb24gKGMpIHsKICAgICAgICAgICAgcmV0dXJuIGMucHJvcGVydGllcy5jb250aW5lbnQgPT09ICdTb3V0aCBBbWVyaWNhJzsKICAgICAgICB9LAoKICAgICAgICBuc19hbWVyaWNhOiBmdW5jdGlvbiAoYykgewogICAgICAgICAgICByZXR1cm4gYy5wcm9wZXJ0aWVzLmN1c3RvbSA9PT0gJ1VTLWNvbnQnIHx8CiAgICAgICAgICAgICAgICBjLnByb3BlcnRpZXMuc3VicmVnaW9uID09PSAnQ2VudHJhbCBBbWVyaWNhJyB8fAogICAgICAgICAgICAgICAgYy5wcm9wZXJ0aWVzLmNvbnRpbmVudCA9PT0gJ1NvdXRoIEFtZXJpY2EnOwogICAgICAgIH0sCgogICAgICAgIGphcGFuOiBmdW5jdGlvbiAoYykgewogICAgICAgICAgICByZXR1cm4gYy5wcm9wZXJ0aWVzLmdlb3VuaXQgPT09ICdKYXBhbic7CiAgICAgICAgfSwKCiAgICAgICAgZXVyb3BlOiBmdW5jdGlvbiAoYykgewogICAgICAgICAgICByZXR1cm4gYy5wcm9wZXJ0aWVzLmNvbnRpbmVudCA9PT0gJ0V1cm9wZSc7CiAgICAgICAgfSwKCiAgICAgICAgaXRhbHk6IGZ1bmN0aW9uIChjKSB7CiAgICAgICAgICAgIHJldHVybiBjLnByb3BlcnRpZXMuZ2VvdW5pdCA9PT0gJ0l0YWx5JzsKICAgICAgICB9LAoKICAgICAgICB1azogZnVuY3Rpb24gKGMpIHsKICAgICAgICAgICAgLy8gdGVjaG5pY2FsbHksIElyZWxhbmQgaXMgbm90IHBhcnQgb2YgdGhlIFVuaXRlZCBLaW5nZG9tLAogICAgICAgICAgICAvLyBidXQgdGhlIG1hcCBsb29rcyB3ZWlyZCB3aXRob3V0IGl0IHNob3dpbmcuCiAgICAgICAgICAgIHJldHVybiBjLnByb3BlcnRpZXMuYWRtMF9hMyA9PT0gJ0dCUicgfHwKICAgICAgICAgICAgICAgIGMucHJvcGVydGllcy5hZG0wX2EzID09PSAnSVJMJzsKICAgICAgICB9LAoKICAgICAgICBzX2tvcmVhOiBmdW5jdGlvbiAoYykgewogICAgICAgICAgICByZXR1cm4gYy5wcm9wZXJ0aWVzLmFkbTBfYTMgPT09ICdLT1InOwogICAgICAgIH0sCgogICAgICAgIGF1c3RyYWxpYTogZnVuY3Rpb24gKGMpIHsKICAgICAgICAgICAgcmV0dXJuIGMucHJvcGVydGllcy5hZG0wX2EzID09PSAnQVVTJzsKICAgICAgICB9CiAgICB9OwoKCiAgICBmdW5jdGlvbiBzZXRVcE1hcCgkbG9jKSB7CiAgICAgICAgdmFyIHMxID0gJGxvYy5zZWFyY2goKS5tYXBpZCwKICAgICAgICAgICAgczIgPSBwcy5nZXRQcmVmcygndG9wb19tYXBpZCcpLAogICAgICAgICAgICBtYXBJZCA9IHMxIHx8IChzMiAmJiBzMi5pZCkgfHwgJ3VzYScsCiAgICAgICAgICAgIHByb21pc2UsCiAgICAgICAgICAgIGNmaWx0ZXIsCiAgICAgICAgICAgIG9wdHM7CgogICAgICAgIG1hcEcgPSB6b29tTGF5ZXIuYXBwZW5kKCdnJykuYXR0cignaWQnLCAndG9wby1tYXAnKTsKICAgICAgICBpZiAobWFwSWQgPT09ICd1c2EnKSB7CiAgICAgICAgICAgIHByb21pc2UgPSBtcy5sb2FkTWFwSW50byhtYXBHLCAnKmNvbnRpbmVudGFsX3VzJyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcHMuc2V0UHJlZnMoJ3RvcG9fbWFwaWQnLCB7aWQ6bWFwSWR9KTsKICAgICAgICAgICAgY2ZpbHRlciA9IGNvdW50cnlGaWx0ZXJzW21hcElkXSB8fCBjb3VudHJ5RmlsdGVycy53b3JsZDsKICAgICAgICAgICAgb3B0cyA9IHsgY291bnRyeUZpbHRlcjogY2ZpbHRlciB9OwogICAgICAgICAgICBwcm9taXNlID0gbXMubG9hZE1hcFJlZ2lvbkludG8obWFwRywgb3B0cyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwcm9taXNlOwogICAgfQoKICAgIGZ1bmN0aW9uIG9wYWNpZnlNYXAoYikgewogICAgICAgIG1hcEcudHJhbnNpdGlvbigpCiAgICAgICAgICAgIC5kdXJhdGlvbigxMDAwKQogICAgICAgICAgICAuYXR0cignb3BhY2l0eScsIGIgPyAxIDogMCk7CiAgICB9CgogICAgZnVuY3Rpb24gc2V0VXBTcHJpdGVzKCRsb2MsIHRzcHIpIHsKICAgICAgICB2YXIgczEgPSAkbG9jLnNlYXJjaCgpLnNwcml0ZXMsCiAgICAgICAgICAgIHMyID0gcHMuZ2V0UHJlZnMoJ3RvcG9fc3ByaXRlcycpLAogICAgICAgICAgICBzcHJJZCA9IHMxIHx8IChzMiAmJiBzMi5pZCk7CgogICAgICAgIHNwcml0ZUcgPSB6b29tTGF5ZXIuYXBwZW5kICgnZycpLmF0dHIoJ2lkJywgJ3RvcG8tc3ByaXRlcycpOwogICAgICAgIGlmIChzcHJJZCkgewogICAgICAgICAgICBwcy5zZXRQcmVmcygndG9wb19zcHJpdGVzJywge2lkOnNwcklkfSk7CiAgICAgICAgICAgIHRzcHIubG9hZFNwcml0ZXMoc3ByaXRlRywgZGVmcywgc3BySWQpOwogICAgICAgIH0KICAgIH0KCiAgICAvLyAtLS0gVXNlciBQcmVmZXJlbWNlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgdmFyIHByZWZzU3RhdGUgPSB7fTsKCiAgICBmdW5jdGlvbiB1cGRhdGVQcmVmc1N0YXRlKHdoYXQsIGIpIHsKICAgICAgICBwcmVmc1N0YXRlW3doYXRdID0gYiA/IDEgOiAwOwogICAgICAgIHBzLnNldFByZWZzKCd0b3BvX3ByZWZzJywgcHJlZnNTdGF0ZSk7CiAgICB9CgoKICAgIGZ1bmN0aW9uIHJlc3RvcmVDb25maWdGcm9tUHJlZnMoKSB7CiAgICAgICAgLy8gTk9URTogdG9vbGJhciB3aWxsIGhhdmUgc2V0IHRoaXMgZm9yIHVzLi4KICAgICAgICBwcmVmc1N0YXRlID0gcHMuYXNOdW1iZXJzKHBzLmdldFByZWZzKCd0b3BvX3ByZWZzJykpOwoKICAgICAgICAkbG9nLmRlYnVnKCdUT1BPLSBQcmVmcyBTdGF0ZTonLCBwcmVmc1N0YXRlKTsKCiAgICAgICAgZmxhc2guZW5hYmxlKGZhbHNlKTsKICAgICAgICB0b2dnbGVJbnN0YW5jZXMocHJlZnNTdGF0ZS5pbnN0cyk7CiAgICAgICAgdG9nZ2xlU3VtbWFyeShwcmVmc1N0YXRlLnN1bW1hcnkpOwogICAgICAgIHRvZ2dsZVVzZURldGFpbHNGbGFnKHByZWZzU3RhdGUuZGV0YWlsKTsKICAgICAgICB0b2dnbGVIb3N0cyhwcmVmc1N0YXRlLmhvc3RzKTsKICAgICAgICB0b2dnbGVPZmZsaW5lKHByZWZzU3RhdGUub2ZmZGV2KTsKICAgICAgICB0b2dnbGVQb3J0cyhwcmVmc1N0YXRlLnBvcnRobCk7CiAgICAgICAgdG9nZ2xlTWFwKHByZWZzU3RhdGUuYmcpOwogICAgICAgIHRvZ2dsZVNwcml0ZXMocHJlZnNTdGF0ZS5zcHIpOwogICAgICAgIGZsYXNoLmVuYWJsZSh0cnVlKTsKICAgIH0KCgogICAgLy8gc29tZXdoYXQgaGFja2lzaCwgYmVjYXVzZSBzdW1tYXJ5IHVwZGF0ZSBjYW5ub3QgaGFwcGVuIHVudGlsIHdlCiAgICAvLyAgaGF2ZSBvcGVuZWQgdGhlIHdlYnNvY2tldCB0byB0aGUgc2VydmVyOyBoZW5jZSB0aGlzIGV4dHJhIGZ1bmN0aW9uCiAgICAvLyBpbnZva2VkIGFmdGVyIHRlcy5zdGFydCgpCiAgICBmdW5jdGlvbiByZXN0b3JlU3VtbWFyeUZyb21QcmVmcygpIHsKICAgICAgICBwcmVmc1N0YXRlID0gcHMuYXNOdW1iZXJzKHBzLmdldFByZWZzKCd0b3BvX3ByZWZzJykpOwogICAgICAgICRsb2cuZGVidWcoJ1RPUE8tIFByZWZzIFNVTU1BUlkgU3RhdGU6JywgcHJlZnNTdGF0ZS5zdW1tYXJ5KTsKCiAgICAgICAgZmxhc2guZW5hYmxlKGZhbHNlKTsKICAgICAgICB0b2dnbGVTdW1tYXJ5KHByZWZzU3RhdGUuc3VtbWFyeSk7CiAgICAgICAgZmxhc2guZW5hYmxlKHRydWUpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRvcG9TdGFydERvbmUoKSB7CiAgICAgICAgdmFyIGQgPSAkc2NvcGUuaW50ZW50RGF0YTsKICAgICAgICBpZiAoZCkgewogICAgICAgICAgICB0dHMuc2VsZWN0SW50ZW50KGQpOwogICAgICAgIH0KICAgIH0KCiAgICAvLyAtLS0gQ29udHJvbGxlciBEZWZpbml0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgYW5ndWxhci5tb2R1bGUoJ292VG9wbycsIG1vZHVsZURlcGVuZGVuY2llcykKICAgICAgICAuY29udHJvbGxlcignT3ZUb3BvQ3RybCcsIFsnJHNjb3BlJywgJyRsb2cnLCAnJGxvY2F0aW9uJywgJyR0aW1lb3V0JywKICAgICAgICAgICAgJyRjb29raWVzJywgJ0ZuU2VydmljZScsICdNYXN0U2VydmljZScsICdLZXlTZXJ2aWNlJywgJ1pvb21TZXJ2aWNlJywKICAgICAgICAgICAgJ0dseXBoU2VydmljZScsICdNYXBTZXJ2aWNlJywgJ1N2Z1V0aWxTZXJ2aWNlJywgJ0ZsYXNoU2VydmljZScsCiAgICAgICAgICAgICdXZWJTb2NrZXRTZXJ2aWNlJywgJ1ByZWZzU2VydmljZScsICdUb3BvRGlhbG9nU2VydmljZScsCiAgICAgICAgICAgICdUb3BvRXZlbnRTZXJ2aWNlJywgJ1RvcG9Gb3JjZVNlcnZpY2UnLCAnVG9wb1BhbmVsU2VydmljZScsCiAgICAgICAgICAgICdUb3BvSW5zdFNlcnZpY2UnLCAnVG9wb1NlbGVjdFNlcnZpY2UnLCAnVG9wb0xpbmtTZXJ2aWNlJywKICAgICAgICAgICAgJ1RvcG9UcmFmZmljU2VydmljZScsICdUb3BvT2JsaXF1ZVNlcnZpY2UnLCAnVG9wb0ZpbHRlclNlcnZpY2UnLAogICAgICAgICAgICAnVG9wb1Rvb2xiYXJTZXJ2aWNlJywgJ1RvcG9TcHJpdGVTZXJ2aWNlJywgJ1Rvb2x0aXBTZXJ2aWNlJywKICAgICAgICAgICAgJ1RvcG9PdmVybGF5U2VydmljZScsCgogICAgICAgIGZ1bmN0aW9uIChfJHNjb3BlXywgXyRsb2dfLCAkbG9jLCAkdGltZW91dCwgXyRjb29raWVzXywgX2ZzXywgbWFzdCwgX2tzXywKICAgICAgICAgICAgICAgICAgX3pzXywgX2dzXywgX21zXywgX3N1c18sIF9mbGFzaF8sIF93c3NfLCBfcHNfLCBfdGRzXywgX3Rlc18sCiAgICAgICAgICAgICAgICAgIF90ZnNfLCBfdHBzXywgX3Rpc18sIF90c3NfLCBfdGxzXywgX3R0c18sIF90b3NfLCBfZmx0cl8sCiAgICAgICAgICAgICAgICAgIF90dGJzXywgdHNwciwgX3R0aXBfLCBfdG92XykgewogICAgICAgICAgICB2YXIgcGFyYW1zID0gJGxvYy5zZWFyY2goKSwKICAgICAgICAgICAgICAgIHByb2plY3Rpb24sCiAgICAgICAgICAgICAgICBkaW0sCiAgICAgICAgICAgICAgICB1cGxpbmsgPSB7CiAgICAgICAgICAgICAgICAgICAgLy8gcHJvdmlkZXMgZnVuY3Rpb24gY2FsbHMgYmFjayBpbnRvIHRoaXMgc3BhY2UKICAgICAgICAgICAgICAgICAgICBzaG93Tm9EZXZzOiBzaG93Tm9EZXZzLAogICAgICAgICAgICAgICAgICAgIHByb2plY3Rpb246IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHByb2plY3Rpb247IH0sCiAgICAgICAgICAgICAgICAgICAgem9vbUxheWVyOiBmdW5jdGlvbiAoKSB7IHJldHVybiB6b29tTGF5ZXI7IH0sCiAgICAgICAgICAgICAgICAgICAgem9vbWVyOiBmdW5jdGlvbiAoKSB7IHJldHVybiB6b29tZXI7IH0sCiAgICAgICAgICAgICAgICAgII7x71ZMpwEAihwAAIocAABo9ygf0sUIACetHhMIAEUAHHyBdUAAQAYNIMCoB2DAqAc2H/WW1KGvNf5A3gtEgBADRaxVAAABAQgKAGIprwC34rZIVFRQLzEuMSAyMDAgT0sNCkNvbnRlbnQtVHlwZTogdGV4dC9qYXZhc2NyaXB0DQpDb250ZW50LUxlbmd0aDogOTMxOQ0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBUb3BvbG9neSBMaW5rIE1vZHVsZS4KIEZ1bmN0aW9ucyBmb3IgaGlnaGxpZ2h0aW5nL3NlbGVjdGluZyBsaW5rcwogKi8KCihmdW5jdGlvbiAoKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8gaW5qZWN0ZWQgcmVmcwogICAgdmFyICRsb2csIGZzLCBzdXMsIHRzLCBmbGFzaCwgdHNzLCB0cHM7CgogICAgLy8gaW50ZXJuYWwgc3RhdGUKICAgIHZhciBhcGksCiAgICAgICAgdGQzLAogICAgICAgIG5ldHdvcmssCiAgICAgICAgc2hvd1BvcnRzID0gdHJ1ZSwgICAgICAgLy8gZW5hYmxlIHBvcnQgaGlnaGxpZ2h0aW5nIGJ5IGRlZmF1bHQKICAgICAgICBlbmhhbmNlZExpbmsgPSBudWxsLCAgICAvLyB0aGUgbGluayBvdmVyIHdoaWNoIHRoZSBtb3VzZSBpcyBob3ZlcmluZwogICAgICAgIHNlbGVjdGVkTGluayA9IG51bGw7ICAgIC8vIHRoZSBsaW5rIHdoaWNoIGlzIGN1cnJlbnRseSBzZWxlY3RlZAoKICAgIC8vIFNWRyBlbGVtZW50czsKICAgIHZhciBzdmc7CgoKICAgIC8vID09PT09PT09IEFMR09SSVRITSBUTyBGSU5EIExJTksgQ0xPU0VTVCBUTyBNT1VTRSA9PT09PT09PQoKICAgIGZ1bmN0aW9uIGdldExvZ2ljYWxNb3VzZVBvc2l0aW9uKGNvbnRhaW5lcikgewogICAgICAgIHZhciBtID0gZDMubW91c2UoY29udGFpbmVyKSwKICAgICAgICAgICAgc2MgPSBhcGkuem9vbWVyLnNjYWxlKCksCiAgICAgICAgICAgIHRyID0gYXBpLnpvb21lci50cmFuc2xhdGUoKSwKICAgICAgICAgICAgbXggPSAobVswXSAtIHRyWzBdKSAvIHNjLAogICAgICAgICAgICBteSA9IChtWzFdIC0gdHJbMV0pIC8gc2M7CiAgICAgICAgcmV0dXJuIHt4OiBteCwgeTogbXl9OwogICAgfQoKCiAgICBmdW5jdGlvbiBzcSh4KSB7IHJldHVybiB4ICogeDsgfQoKICAgIGZ1bmN0aW9uIG1kaXN0KHAsIG0pIHsKICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KHNxKHAueCAtIG0ueCkgKyBzcShwLnkgLSBtLnkpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBwcm94KGRpc3QpIHsKICAgICAgICByZXR1cm4gZGlzdCAvIGFwaS56b29tZXIuc2NhbGUoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjb21wdXRlTmVhcmVzdE5vZGUobW91c2UpIHsKICAgICAgICB2YXIgcHJveGltaXR5ID0gcHJveCgzMCksCiAgICAgICAgICAgIG5lYXJlc3QgPSBudWxsLAogICAgICAgICAgICBtaW5EaXN0OwoKICAgICAgICBpZiAobmV0d29yay5ub2Rlcy5sZW5ndGgpIHsKICAgICAgICAgICAgbWluRGlzdCA9IHByb3hpbWl0eSAqIDI7CgogICAgICAgICAgICBuZXR3b3JrLm5vZGVzLmZvckVhY2goZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgIHZhciBkaXN0OwoKICAgICAgICAgICAgICAgIGlmICghYXBpLnNob3dIb3N0cygpICYmIGQuY2xhc3MgPT09ICdob3N0JykgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gc2tpcCBoaWRkZW4gaG9zdHMKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBkaXN0ID0gbWRpc3Qoe3g6IGQueCwgeTogZC55fSwgbW91c2UpOwogICAgICAgICAgICAgICAgaWYgKGRpc3QgPCBtaW5EaXN0ICYmIGRpc3QgPCBwcm94aW1pdHkpIHsKICAgICAgICAgICAgICAgICAgICBtaW5EaXN0ID0gZGlzdDsKICAgICAgICAgICAgICAgICAgICBuZWFyZXN0ID0gZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZWFyZXN0OwogICAgfQoKCiAgICBmdW5jdGlvbiBjb21wdXRlTmVhcmVzdExpbmsobW91c2UpIHsKICAgICAgICB2YXIgcHJveGltaXR5ID0gcHJveCgzMCksCiAgICAgICAgICAgIG5lYXJlc3QgPSBudWxsLAogICAgICAgICAgICBtaW5EaXN0OwoKICAgICAgICBmdW5jdGlvbiBwZHJvcChsaW5lLCBtb3VzZSkgewogICAgICAgICAgICB2YXIgeDEgPSBsaW5lLngxLAogICAgICAgICAgICAgICAgeTEgPSBsaW5lLnkxLAogICAgICAgICAgICAgICAgeDIgPSBsaW5lLngyLAogICAgICAgICAgICAgICAgeTIgPSBsaW5lLnkyLAogICAgICAgICAgICAgICAgeDMgPSBtb3VzZS54LAogICAgICAgICAgICAgICAgeTMgPSBtb3VzZS55LAogICAgICAgICAgICAgICAgayA9ICgoeTIteTEpICogKHgzLXgxKSAtICh4Mi14MSkgKiAoeTMteTEpKSAvCiAgICAgICAgICAgICAgICAgICAgKHNxKHkyLXkxKSArIHNxKHgyLXgxKSksCiAgICAgICAgICAgICAgICB4NCA9IHgzIC0gayAqICh5Mi15MSksCiAgICAgICAgICAgICAgICB5NCA9IHkzICsgayAqICh4Mi14MSk7CiAgICAgICAgICAgIHJldHVybiB7eDp4NCwgeTp5NH07CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBsaW5lSGl0KGxpbmUsIHAsIG0pIHsKICAgICAgICAgICAgaWYgKHAueCA8IGxpbmUueDEgJiYgcC54IDwgbGluZS54MikgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICBpZiAocC54ID4gbGluZS54MSAmJiBwLnggPiBsaW5lLngyKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIGlmIChwLnkgPCBsaW5lLnkxICYmIHAueSA8IGxpbmUueTIpIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgaWYgKHAueSA+IGxpbmUueTEgJiYgcC55ID4gbGluZS55MikgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAvLyBsaW5lIGludGVyc2VjdHMsIGJ1dCBhcmUgd2UgY2xvc2UgZW5vdWdoPwogICAgICAgICAgICByZXR1cm4gbWRpc3QocCwgbSkgPD0gcHJveGltaXR5OwogICAgICAgIH0KCiAgICAgICAgaWYgKG5ldHdvcmsubGlua3MubGVuZ3RoKSB7CiAgICAgICAgICAgIG1pbkRpc3QgPSBwcm94aW1pdHkgKiAyOwoKICAgICAgICAgICAgbmV0d29yay5saW5rcy5mb3JFYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICBpZiAoIWFwaS5zaG93SG9zdHMoKSAmJiBkLnR5cGUoKSA9PT0gJ2hvc3RMaW5rJykgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gc2tpcCBoaWRkZW4gaG9zdCBsaW5rcwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBsaW5lID0gZC5wb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICBwb2ludCA9IHBkcm9wKGxpbmUsIG1vdXNlKSwKICAgICAgICAgICAgICAgICAgICBoaXQgPSBsaW5lSGl0KGxpbmUsIHBvaW50LCBtb3VzZSksCiAgICAgICAgICAgICAgICAgICAgZGlzdDsKCiAgICAgICAgICAgICAgICBpZiAoaGl0KSB7CiAgICAgICAgICAgICAgICAgICAgZGlzdCA9IG1kaXN0KHBvaW50LCBtb3VzZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3QgPCBtaW5EaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1pbkRpc3QgPSBkaXN0OwogICAgICAgICAgICAgICAgICAgICAgICBuZWFyZXN0ID0gZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmVhcmVzdDsKICAgIH0KCiAgICBmdW5jdGlvbiBlbmhhbmNlTGluayhsZGF0YSkgewogICAgICAgIC8vIGlmIHRoZSBuZXcgbGluayBpcyBzYW1lIGFzIG9sZCBsaW5rLCBkbyBub3RoaW5nCiAgICAgICAgaWYgKGVuaGFuY2VkTGluayAmJiBsZGF0YSAmJiBlbmhhbmNlZExpbmsua2V5ID09PSBsZGF0YS5rZXkpIHJldHVybjsKCiAgICAgICAgLy8gZmlyc3QsIHVuZW5oYW5jZSB0aGUgY3VycmVudGx5IGVuaGFuY2VkIGxpbmsKICAgICAgICBpZiAoZW5oYW5jZWRMaW5rKSB7CiAgICAgICAgICAgIHVuZW5oYW5jZShlbmhhbmNlZExpbmspOwogICAgICAgIH0KICAgICAgICBlbmhhbmNlZExpbmsgPSBsZGF0YTsKICAgICAgICBpZiAoZW5oYW5jZWRMaW5rKSB7CiAgICAgICAgICAgIGVuaGFuY2UoZW5oYW5jZWRMaW5rKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gdW5lbmhhbmNlKGQpIHsKICAgICAgICAvLyBndWFyZCBhZ2FpbnN0IGxpbmsgZWxlbWVudCBub3Qgc2V0CiAgICAgICAgaWYgKGQuZWwpIHsKICAgICAgICAgICAgZC5lbC5jbGFzc2VkKCdlbmhhbmNlZCcsIGZhbHNlKTsKICAgICAgICB9CiAgICAgICAgYXBpLnBvcnRMYWJlbEcoKS5zZWxlY3RBbGwoJy5wb3J0TGFiZWwnKS5yZW1vdmUoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBlbmhhbmNlKGQpIHsKICAgICAgICB2YXIgZGF0YSA9IFtdLAogICAgICAgICAgICBwb2ludDsKCiAgICAgICAgLy8gZ3VhcmQgYWdhaW5zdCBsaW5rIGVsZW1lbnQgbm90IHNldAogICAgICAgIGlmICghZC5lbCkgcmV0dXJuOwoKICAgICAgICBkLmVsLmNsYXNzZWQoJ2VuaGFuY2VkJywgdHJ1ZSk7CgogICAgICAgIC8vIERlZmluZSBwb3J0IGxhYmVsIGRhdGEgb2JqZWN0cy4KICAgICAgICAvLyBOT1RFOiBzcmMgcG9ydCBpcyBhYnNlbnQgaW4gdGhlIGNhc2Ugb2YgaG9zdC1saW5rcy4KCiAgICAgICAgcG9pbnQgPSBsb2NhdGVQb3J0TGFiZWwoZCk7CiAgICAgICAgYW5ndWxhci5leHRlbmQocG9pbnQsIHsKICAgICAgICAgICAgaWQ6ICd0b3BvLXBvcnQtdGd0JywKICAgICAgICAgICAgbnVtOiBkLnRndFBvcnQKICAgICAgICB9KTsKICAgICAgICBkYXRhLnB1c2gocG9pbnQpOwoKICAgICAgICBpZiAoZC5zcmNQb3J0KSB7CiAgICAgICAgICAgIHBvaW50ID0gbG9jYXRlUG9ydExhYmVsKGQsIDEpOwogICAgICAgICAgICBhbmd1bGFyLmV4dGVuZChwb2ludCwgewogICAgICAgICAgICAgICAgaWQ6ICd0b3BvLXBvcnQtc3JjJywKICAgICAgICAgICAgICAgIG51bTogZC5zcmNQb3J0CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkYXRhLnB1c2gocG9pbnQpOwogICAgICAgIH0KCiAgICAgICAgdGQzLmFwcGx5UG9ydExhYmVscyhkYXRhLCBhcGkucG9ydExhYmVsRygpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBsb2NhdGVQb3J0TGFiZWwobGluaywgc3JjKSB7CiAgICAgICAgdmFyIG9mZnNldCA9IDMyLAogICAgICAgICAgICBwb3MgPSBsaW5rLnBvc2l0aW9uLAogICAgICAgICAgICBuZWFyWCA9IHNyYyA/IHBvcy54MSA6IHBvcy54MiwKICAgICAgICAgICAgbmVhclkgPSBzcmMgPyBwb3MueTEgOiBwb3MueTIsCiAgICAgICAgICAgIGZhclggPSBzcmMgPyBwb3MueDIgOiBwb3MueDEsCiAgICAgICAgICAgIGZhclkgPSBzcmMgPyBwb3MueTIgOiBwb3MueTE7CgogICAgICAgIGZ1bmN0aW9uIGRpc3QoeCwgeSkgeyByZXR1cm4gTWF0aC5zcXJ0KHgqeCArIHkqeSk7IH0KCiAgICAgICAgdmFyIGR4ID0gZmFyWCAtIG5lYXJYLAogICAgICAgICAgICBkeSA9IGZhclkgLSBuZWFyWSwKICAgICAgICAgICAgayA9IG9mZnNldCAvIGRpc3QoZHgsIGR5KTsKCiAgICAgICAgcmV0dXJuIHt4OiBrICogZHggKyBuZWFyWCwgeTogayAqIGR5ICsgbmVhcll9OwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdExpbmsobGRhdGEpIHsKICAgICAgICAvLyBpZiB0aGUgbmV3IGxpbmsgaXMgc2FtZSBhcyBvbGQgbGluaywgZG8gbm90aGluZwogICAgICAgIGlmIChzZWxlY3RlZExpbmsgJiYgbGRhdGEgJiYgc2VsZWN0ZWRMaW5rLmtleSA9PT0gbGRhdGEua2V5KSByZXR1cm47CgogICAgICAgIC8vIG1ha2Ugc3VyZSBubyBub2RlcyBhcmUgc2VsZWN0ZWQKICAgICAgICB0c3MuZGVzZWxlY3RBbGwoKTsKCiAgICAgICAgLy8gZmlyc3QsIHVuZW5oYW5jZSB0aGUgY3VycmVudGx5IGVuaGFuY2VkIGxpbmsKICAgICAgICBpZiAoc2VsZWN0ZWRMaW5rKSB7CiAgICAgICAgICAgIHVuc2VsTGluayhzZWxlY3RlZExpbmspOwogICAgICAgIH0KICAgICAgICBzZWxlY3RlZExpbmsgPSBsZGF0YTsKICAgICAgICBpZiAoc2VsZWN0ZWRMaW5rKSB7CiAgICAgICAgICAgIHNlbExpbmsoc2VsZWN0ZWRMaW5rKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gdW5zZWxMaW5rKGQpIHsKICAgICAgICAvLyBndWFyZCBhZ2FpbnN0IGxpbmsgZWxlbWVudCBub3Qgc2V0CiAgICAgICAgaWYgKGQuZWwpIHsKICAgICAgICAgICAgZC5lbC5jbGFzc2VkKCdzZWxlY3RlZCcsIGZhbHNlKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gc2VsTGluayhkKSB7CiAgICAgICAgLy8gZ3VhcmQgYWdhaW5zdCBsaW5rIGVsZW1lbnQgbm90IHNldAogICAgICAgIGlmICghZC5lbCkgcmV0dXJuOwoKICAgICAgICBkLmVsLmNsYXNzZWQoJ3NlbGVjdGVkJywgdHJ1ZSk7CgogICAgICAgIHRwcy5kaXNwbGF5TGluayhkKTsKICAgICAgICB0cHMuZGlzcGxheVNvbWV0aGluZygpOwogICAgfQoKICAgIC8vID09PT09PSBNT1VTRSBFVkVOVCBIQU5ETEVSUyA9PT09PT0KCiAgICBmdW5jdGlvbiBtb3VzZU1vdmVIYW5kbGVyKCkgewogICAgICAgIHZhciBtcCA9IGdldExvZ2ljYWxNb3VzZVBvc2l0aW9uKHRoaXMpLAogICAgICAgICAgICBsaW5rID0gY29tcHV0ZU5lYXJlc3RMaW5rKG1wKTsKICAgICAgICBlbmhhbmNlTGluayhsaW5rKTsKICAgIH0KCiAgICBmdW5jdGlvbiBtb3VzZUNsaWNrSGFuZGxlcigpIHsKICAgICAgICB2YXIgbXAsIGxpbmssIG5vZGU7CgogICAgICAgIGlmICghdHNzLmNsaWNrQ29uc3VtZWQoKSkgewogICAgICAgICAgICBtcCA9IGdldExvZ2ljYWxNb3VzZVBvc2l0aW9uKHRoaXMpOwogICAgICAgICAgICBub2RlID0gY29tcHV0ZU5lYXJlc3ROb2RlKG1wjvHvVomnAQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANGSwQABABkYtwKgHNsCoB2CW0x/1YRyI+3KDZIWAEAVtW/4AAAEBCAoAt+K5AGIpr47x71aJpwEAjg4AAI4OAABo9ygf0sUIACetHhMIAEUADoAsBEAAQAZwjcCoB2DAqAc2H/WW03KDZIVhHIj7gBgDKJ5ZAAABAQgKAGIprwC34rkgIG9wYWNpZnlNYXA6IG9wYWNpZnlNYXAsCiAgICAgICAgICAgICAgICAgICAgdG9wb1N0YXJ0RG9uZTogdG9wb1N0YXJ0RG9uZQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICRzY29wZSA9IF8kc2NvcGVfOwogICAgICAgICAgICAkbG9nID0gXyRsb2dfOwogICAgICAgICAgICAkY29va2llcyA9IF8kY29va2llc187CiAgICAgICAgICAgIGZzID0gX2ZzXzsKICAgICAgICAgICAga3MgPSBfa3NfOwogICAgICAgICAgICB6cyA9IF96c187CiAgICAgICAgICAgIGdzID0gX2dzXzsKICAgICAgICAgICAgbXMgPSBfbXNfOwogICAgICAgICAgICBzdXMgPSBfc3VzXzsKICAgICAgICAgICAgZmxhc2ggPSBfZmxhc2hfOwogICAgICAgICAgICB3c3MgPSBfd3NzXzsKICAgICAgICAgICAgcHMgPSBfcHNfOwogICAgICAgICAgICB0ZHMgPSBfdGRzXzsKICAgICAgICAgICAgdGVzID0gX3Rlc187CiAgICAgICAgICAgIHRmcyA9IF90ZnNfOwogICAgICAgICAgICAvLyBUT0RPOiBjb25zaWRlciBmdW5uZWxsaW5nIGFjdGlvbnMgdGhyb3VnaCBUb3BvRm9yY2VTZXJ2aWNlLi4uCiAgICAgICAgICAgIC8vICByYXRoZXIgdGhhbiBpbmplY3RpbmcgcmVmZXJlbmNlcyB0byB0aGVzZSAnc3ViLW1vZHVsZXMnLAogICAgICAgICAgICAvLyAganVzdCBzbyB3ZSBjYW4gaW52b2tlIGZ1bmN0aW9ucyBvbiB0aGVtLgogICAgICAgICAgICB0cHMgPSBfdHBzXzsKICAgICAgICAgICAgdGlzID0gX3Rpc187CiAgICAgICAgICAgIHRzcyA9IF90c3NfOwogICAgICAgICAgICB0bHMgPSBfdGxzXzsKICAgICAgICAgICAgdHRzID0gX3R0c187CiAgICAgICAgICAgIHRvcyA9IF90b3NfOwogICAgICAgICAgICBmbHRyID0gX2ZsdHJfOwogICAgICAgICAgICB0dGJzID0gX3R0YnNfOwogICAgICAgICAgICB0dGlwID0gX3R0aXBfOwogICAgICAgICAgICB0b3YgPSBfdG92XzsKCiAgICAgICAgICAgIGlmIChwYXJhbXMuaW50ZW50S2V5ICYmIHBhcmFtcy5pbnRlbnRBcHBJZCAmJiBwYXJhbXMuaW50ZW50QXBwTmFtZSkgewogICAgICAgICAgICAgICAgJHNjb3BlLmludGVudERhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAga2V5OiBwYXJhbXMuaW50ZW50S2V5LAogICAgICAgICAgICAgICAgICAgIGFwcElkOiBwYXJhbXMuaW50ZW50QXBwSWQsCiAgICAgICAgICAgICAgICAgICAgYXBwTmFtZTogcGFyYW1zLmludGVudEFwcE5hbWUKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRzY29wZS5ub3RpZnlSZXNpemUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBzdmdSZXNpemVkKGZzLndpbmRvd1NpemUobWFzdC5tYXN0SGVpZ2h0KCkpKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIENsZWFudXAgb24gZGVzdHJveWVkIHNjb3BlLi4KICAgICAgICAgICAgJHNjb3BlLiRvbignJGRlc3Ryb3knLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAkbG9nLmxvZygnT3ZUb3BvQ3RybCBpcyBzYXlpbmcgQnVoLUJ5ZSEnKTsKICAgICAgICAgICAgICAgIHRlcy5zdG9wKCk7CiAgICAgICAgICAgICAgICBrcy51bmJpbmRLZXlzKCk7CiAgICAgICAgICAgICAgICB0cHMuZGVzdHJveVBhbmVscygpOwogICAgICAgICAgICAgICAgdGRzLmNsb3NlRGlhbG9nKCk7CiAgICAgICAgICAgICAgICB0aXMuZGVzdHJveUluc3QoKTsKICAgICAgICAgICAgICAgIHRmcy5kZXN0cm95Rm9yY2UoKTsKICAgICAgICAgICAgICAgIHR0YnMuZGVzdHJveVRvb2xiYXIoKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBzdmcgbGF5ZXIgYW5kIGluaXRpYWxpemF0aW9uIG9mIGNvbXBvbmVudHMKICAgICAgICAgICAgb3Z0b3BvID0gZDMuc2VsZWN0KCcjb3YtdG9wbycpOwogICAgICAgICAgICBzdmcgPSBvdnRvcG8uc2VsZWN0KCdzdmcnKTsKICAgICAgICAgICAgLy8gc2V0IHRoZSBzdmcgc2l6ZSB0byBtYXRjaCB0aGF0IG9mIHRoZSB3aW5kb3csIGxlc3MgdGhlIG1hc3RoZWFkCiAgICAgICAgICAgIHN2Zy5hdHRyKGZzLndpbmRvd1NpemUobWFzdC5tYXN0SGVpZ2h0KCkpKTsKICAgICAgICAgICAgZGltID0gW3N2Zy5hdHRyKCd3aWR0aCcpLCBzdmcuYXR0cignaGVpZ2h0JyldOwoKICAgICAgICAgICAgc2V0VXBLZXlzKCk7CiAgICAgICAgICAgIHNldFVwVG9vbGJhcigpOwogICAgICAgICAgICBzZXRVcERlZnMoKTsKICAgICAgICAgICAgc2V0VXBab29tKCk7CiAgICAgICAgICAgIHNldFVwTm9EZXZzKCk7CiAgICAgICAgICAgIHNldFVwTWFwKCRsb2MpLnRoZW4oCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAocHJvaikgewogICAgICAgICAgICAgICAgICAgIHZhciB6ID0gcHMuZ2V0UHJlZnMoJ3RvcG9fem9vbScpIHx8IHt0eDowLCB0eTowLCBzYzoxfTsKICAgICAgICAgICAgICAgICAgICB6b29tZXIucGFuWm9vbShbei50eCwgei50eV0sIHouc2MpOwogICAgICAgICAgICAgICAgICAgICRsb2cuZGVidWcoJyoqIFpvb20gcmVzdG9yZWQ6Jywgeik7CgogICAgICAgICAgICAgICAgICAgIHByb2plY3Rpb24gPSBwcm9qOwogICAgICAgICAgICAgICAgICAgICRsb2cuZGVidWcoJyoqIFdlIGluc3RhbGxlZCB0aGUgcHJvamVjdGlvbjonLCBwcm9qKTsKICAgICAgICAgICAgICAgICAgICBmbGFzaC5lbmFibGUoZmFsc2UpOwogICAgICAgICAgICAgICAgICAgIHRvZ2dsZU1hcChwcmVmc1N0YXRlLmJnKTsKICAgICAgICAgICAgICAgICAgICBmbGFzaC5lbmFibGUodHJ1ZSk7CgogICAgICAgICAgICAgICAgICAgIC8vIG5vdyB3ZSBoYXZlIHRoZSBtYXAgcHJvamVjdGlvbiwgd2UgYXJlIHJlYWR5IGZvcgogICAgICAgICAgICAgICAgICAgIC8vICB0aGUgc2VydmVyIHRvIHNlbmQgdXMgZGV2aWNlL2hvc3QgZGF0YS4uLgogICAgICAgICAgICAgICAgICAgIHRlcy5zdGFydCgpOwogICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gZG8gdGhlIGZvbGxvd2luZyBzbyB3ZSBpbW1lZGlhdGVseSBnZXQKICAgICAgICAgICAgICAgICAgICAvLyAgdGhlIHN1bW1hcnkgcGFuZWwgZGF0YSBiYWNrIGZyb20gdGhlIHNlcnZlcgogICAgICAgICAgICAgICAgICAgIHJlc3RvcmVTdW1tYXJ5RnJvbVByZWZzKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHNldFVwU3ByaXRlcygkbG9jLCB0c3ByKTsKCiAgICAgICAgICAgIGZvcmNlRyA9IHpvb21MYXllci5hcHBlbmQoJ2cnKS5hdHRyKCdpZCcsICd0b3BvLWZvcmNlJyk7CiAgICAgICAgICAgIHRmcy5pbml0Rm9yY2Uoc3ZnLCBmb3JjZUcsIHVwbGluaywgZGltKTsKICAgICAgICAgICAgdGlzLmluaXRJbnN0KHsgc2hvd01hc3RlcnNoaXA6IHRmcy5zaG93TWFzdGVyc2hpcCB9KTsKICAgICAgICAgICAgdHBzLmluaXRQYW5lbHMoKTsKCiAgICAgICAgICAgIC8vIHRlbXBvcmFyeSBzb2x1dGlvbiBmb3IgcGVyc2lzdGluZyB1c2VyIHNldHRpbmdzCiAgICAgICAgICAgIHJlc3RvcmVDb25maWdGcm9tUHJlZnMoKTsKICAgICAgICAgICAgdHRicy5zZXREZWZhdWx0T3ZlcmxheSgpOwoKICAgICAgICAgICAgJGxvZy5kZWJ1ZygncmVnaXN0ZXJlZCBvdmVybGF5cy4uLicsIHRvdi5saXN0KCkpOwogICAgICAgICAgICAkbG9nLmxvZygnT3ZUb3BvQ3RybCBoYXMgYmVlbiBjcmVhdGVkJyk7CiAgICAgICAgfV0pOwp9KCkpOwqO8e9WiacBAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA04mxAAEAGyHDAqAc2wKgHYJbUH/VA3gtEoa9SRoAQB6Da0gAAAQEICgC34rkAYimvjvHvVomnAQDKCAAAyggAAGj3KB/SxQgAJ60eEwgARQAIvIF6QABABiDbwKgHYMCoBzYf9ZbUoa9SRkDeC0SAGANFmJUAAAEBCAoAYimvALfitik7CiAgICAgICAgICAgIGlmIChub2RlKSB7CiAgICAgICAgICAgICAgICAkbG9nLmRlYnVnKCdmb3VuZCBuZWFyZXN0IG5vZGU6Jywgbm9kZS5sYWJlbHNbMV0pOwogICAgICAgICAgICAgICAgdHNzLnNlbGVjdE9iamVjdChub2RlKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGxpbmsgPSBjb21wdXRlTmVhcmVzdExpbmsobXApOwogICAgICAgICAgICAgICAgc2VsZWN0TGluayhsaW5rKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PQoKICAgIGZ1bmN0aW9uIHRvZ2dsZVBvcnRzKHgpIHsKICAgICAgICB2YXIga2V2ID0gKHggPT09ICdrZXlldicpLAogICAgICAgICAgICBvbiA9IGtldiA/ICFzaG93UG9ydHMgOiAhIXgsCiAgICAgICAgICAgIHdoYXQgPSBvbiA/ICdFbmFibGUnIDogJ0Rpc2FibGUnLAogICAgICAgICAgICBoYW5kbGVyID0gb24gPyBtb3VzZU1vdmVIYW5kbGVyIDogbnVsbDsKCiAgICAgICAgc2hvd1BvcnRzID0gb247CgogICAgICAgIGlmICghb24pIHsKICAgICAgICAgICAgZW5oYW5jZUxpbmsobnVsbCk7CiAgICAgICAgfQogICAgICAgIHN2Zy5vbignbW91c2Vtb3ZlJywgaGFuZGxlcik7CiAgICAgICAgZmxhc2guZmxhc2god2hhdCArICcgcG9ydCBoaWdobGlnaHRpbmcnKTsKICAgICAgICByZXR1cm4gb247CiAgICB9CgogICAgZnVuY3Rpb24gZGVzZWxlY3RMaW5rKCkgewogICAgICAgIGlmIChzZWxlY3RlZExpbmspIHsKICAgICAgICAgICAgdW5zZWxMaW5rKHNlbGVjdGVkTGluayk7CiAgICAgICAgICAgIHNlbGVjdGVkTGluayA9IG51bGw7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIE1vZHVsZSBkZWZpbml0aW9uCgogICAgYW5ndWxhci5tb2R1bGUoJ292VG9wbycpCiAgICAgICAgLmZhY3RvcnkoJ1RvcG9MaW5rU2VydmljZScsCiAgICAgICAgWyckbG9nJywgJ0ZuU2VydmljZScsICdTdmdVdGlsU2VydmljZScsICdUaGVtZVNlcnZpY2UnLCAnRmxhc2hTZXJ2aWNlJywKICAgICAgICAgICAgJ1RvcG9TZWxlY3RTZXJ2aWNlJywgJ1RvcG9QYW5lbFNlcnZpY2UnLAoKICAgICAgICBmdW5jdGlvbiAoXyRsb2dfLCBfZnNfLCBfc3VzXywgX3RzXywgX2ZsYXNoXywgX3Rzc18sIF90cHNfKSB7CiAgICAgICAgICAgICRsb2cgPSBfJGxvZ187CiAgICAgICAgICAgIGZzID0gX2ZzXzsKICAgICAgICAgICAgc3VzID0gX3N1c187CiAgICAgICAgICAgIHRzID0gX3RzXzsKICAgICAgICAgICAgZmxhc2ggPSBfZmxhc2hfOwogICAgICAgICAgICB0c3MgPSBfdHNzXzsKICAgICAgICAgICAgdHBzID0gX3Rwc187CgogICAgICAgICAgICBmdW5jdGlvbiBpbml0TGluayhfYXBpXywgX3RkM18pIHsKICAgICAgICAgICAgICAgIGFwaSA9IF9hcGlfOwogICAgICAgICAgICAgICAgdGQzID0gX3RkM187CiAgICAgICAgICAgICAgICBzdmcgPSBhcGkuc3ZnOwogICAgICAgICAgICAgICAgbmV0d29yayA9IGFwaS5uZXR3b3JrOwogICAgICAgICAgICAgICAgaWYgKHNob3dQb3J0cyAmJiAhZnMuaXNNb2JpbGUoKSkgewogICAgICAgICAgICAgICAgICAgIHN2Zy5vbignbW91c2Vtb3ZlJywgbW91c2VNb3ZlSGFuZGxlcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzdmcub24oJ2NsaWNrJywgbW91c2VDbGlja0hhbmRsZXIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiBkZXN0cm95TGluaygpIHsKICAgICAgICAgICAgICAgIC8vIHVuY29uZGl0aW9uYWxseSByZW1vdmUgYW55IGV2ZW50IGhhbmRsZXJzCiAgICAgICAgICAgICAgICBzdmcub24oJ21vdXNlbW92ZScsIG51bGwpOwogICAgICAgICAgICAgICAgc3ZnLm9uKCdjbGljaycsIG51bGwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgaW5pdExpbms6IGluaXRMaW5rLAogICAgICAgICAgICAgICAgZGVzdHJveUxpbms6IGRlc3Ryb3lMaW5rLAogICAgICAgICAgICAgICAgdG9nZ2xlUG9ydHM6IHRvZ2dsZVBvcnRzLAogICAgICAgICAgICAgICAgZGVzZWxlY3RMaW5rOiBkZXNlbGVjdExpbmsKICAgICAgICAgICAgfTsKICAgICAgICB9XSk7Cn0oKSk7Co7x71ZFqAEAACYAAAAmAABo9ygf0sUIACetHhMIAEUAJfIpD0AAQAZcEMCoB2DAqAc2H/WW0lNSIs00h5nrgBgDmbXLAAABAQgKAGIprwC34rZIVFRQLzEuMSAyMDAgT0sNCkNvbnRlbnQtVHlwZTogdGV4dC9qYXZhc2NyaXB0DQpDb250ZW50LUxlbmd0aDogOTU1Nw0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBUb3BvbG9neSBJbnN0YW5jZXMgTW9kdWxlLgogRGVmaW5lcyBtb2RlbGluZyBvZiBPTk9TIGluc3RhbmNlcy4KICovCgooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIGluamVjdGVkIHJlZnMKICAgIHZhciAkbG9nLCBwcywgc3VzLCBncywgdHMsIGZzLCBmbGFzaDsKCiAgICAvLyBhcGkgZnJvbSB0b3BvCiAgICB2YXIgYXBpOwogICAgLyoKICAgICAgICBzaG93TWFzdGVyc2hpcCggaWQgKQogICAgICovCgogICAgLy8gY29uZmlndXJhdGlvbgogICAgdmFyIGluc3RDZmcgPSB7CiAgICAgICAgICAgIHJlY3RQYWQ6IDgsCiAgICAgICAgICAgIG5vZGVPeDogOSwKICAgICAgICAgICAgbm9kZU95OiA5LAogICAgICAgICAgICBub2RlRGltOiA0MCwKICAgICAgICAgICAgYmlyZE94OiAxOSwKICAgICAgICAgICAgYmlyZE95OiAyMSwKICAgICAgICAgICAgYmlyZERpbTogMjEsCiAgICAgICAgICAgIHVpRHk6IDQ1LAogICAgICAgICAgICB0aXRsZUR5OiAzMCwKICAgICAgICAgICAgdGV4dFlPZmY6IDIwLAogICAgICAgICAgICB0ZXh0WVNwYzogMTUKICAgICAgICB9LAogICAgICAgIHNob3dMb2dpY0Vycm9ycyA9IHRydWUsCiAgICAgICAgaWRJbnMgPSAndG9wby1wLWluc3RhbmNlJywKICAgICAgICBpbnN0T3B0cyA9IHsKICAgICAgICAgICAgZWRnZTogJ2xlZnQnLAogICAgICAgICAgICB3aWR0aDogMjAKICAgICAgICB9OwoKICAgIC8vIGludGVybmFsIHN0YXRlCiAgICB2YXIgb25vc0luc3RhbmNlcywKICAgICAgICBvbm9zT3JkZXIsCiAgICAgICAgb2lTaG93TWFzdGVyLAogICAgICAgIG9pQm94LAogICAgICAgIHRoZW1lTGlzdGVuZXI7CgoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgZnVuY3Rpb24gYWRkSW5zdGFuY2UoZGF0YSkgewogICAgICAgIHZhciBpZCA9IGRhdGEuaWQ7CgogICAgICAgIGlmIChvbm9zSW5zdGFuY2VzW2lkXSkgewogICAgICAgICAgICB1cGRhdGVJbnN0YW5jZShkYXRhKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBvbm9zSW5zdGFuY2VzW2lkXSA9IGRhdGE7CiAgICAgICAgb25vc09yZGVyLnB1c2goZGF0YSk7CiAgICAgICAgdXBkYXRlSW5zdGFuY2VzKCk7CiAgICB9CgogICAgZnVuY3Rpb24gdXBkYXRlSW5zdGFuY2UoZGF0YSkgewogICAgICAgIHZhciBpZCA9IGRhdGEuaWQsCiAgICAgICAgICAgIGQgPSBvbm9zSW5zdGFuY2VzW2lkXTsKICAgICAgICBpZiAoZCkgewogICAgICAgICAgICBhbmd1bGFyLmV4dGVuZChkLCBkYXRhKTsKICAgICAgICAgICAgdXBkYXRlSW5zdGFuY2VzKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbG9naWNFcnJvcigndXBkYXRlSW5zdGFuY2U6IGxvb2t1cCBmYWlsOiBJRCA9ICInICsgaWQgKyAnIicpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiByZW1vdmVJbnN0YW5jZShkYXRhKSB7CiAgICAgICAgdmFyIGlkID0gZGF0YS5pZCwKICAgICAgICAgICAgZCA9IG9ub3NJbnN0YW5jZXNbaWRdOwogICAgICAgIGlmIChkKSB7CiAgICAgICAgICAgIHZhciBpZHggPSBmcy5maW5kKGlkLCBvbm9zT3JkZXIpOwogICAgICAgICAgICBpZiAoaWR4ID49IDApIHsKICAgICAgICAgICAgICAgIG9ub3NPcmRlci5zcGxpY2UoaWR4LCAxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZWxldGUgb25vc0luc3RhbmNlc1tpZF07CiAgICAgICAgICAgIHVwZGF0ZUluc3RhbmNlcygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGxvZ2ljRXJyb3IoJ3JlbW92ZUluc3RhbmNlIGxvb2t1cCBmYWlsLiBJRCA9ICInICsgaWQgKyAnIicpOwogICAgICAgIH0KICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIGZ1bmN0aW9uIGNvbXB1dGVEaW0oc2VsZikgewogICAgICAgIHZhciBjc3MgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShzZWxmKTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB3OiBzdXMuc3RyaXBQeChjc3Mud2lkdGgpLAogICAgICAgICAgICBoOiBzdXMuc3RyaXBQeChjc3MuaGVpZ2h0KQogICAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gY2xpY2tJbnN0KGQpIHsKICAgICAgICB2YXIgZWwgPSBkMy5zZWxlY3QodGhpcyksCiAgICAgICAgICAgIGFmZiA9IGVsLmNsYXNzZWQoJ2FmZmluaXR5Jyk7CiAgICAgICAgaWYgKCFhZmYpIHsKICAgICAgICAgICAgc2V0QWZmaW5pdHkoZWwsIGQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNhbmNlbEFmZmluaXR5KCk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHNldEFmZmluaXR5KGVsLCBkKSB7CiAgICAgICAgZDMuc2VsZWN0QWxsKCcub25vc0luc3QnKQogICAgICAgICAgICAuY2xhc3NlZCgnbWFzdGVyc2hpcCcsIHRydWUpCiAgICAgICAgICAgIC5jbGFzc2VkKCdhZmZpbml0eScsIGZhbHNlKTsKICAgICAgICBlbC5jbGFzc2VkKCdhZmZpbml0eScsIHRydWUpOwoKICAgICAgICAvLyBzdXBwcmVzcyBhbGwgZWxlbWVudHMgZXhjZXB0IG5vZGVzIHdob3NlIG1hc3RlciBpcyB0aGlzIGluc3RhbmNlCiAgICAgICAgYXBpLnNob3dNYXN0ZXJzaGlwKGQuaWQpOwogICAgICAgIG9pU2hvd01hc3RlciA9IHRydWU7CiAgICB9CgogICAgZnVuY3Rpb24gY2FuY2VsQWZmaW5pdHkoKSB7CiAgICAgICAgZDMuc2VsZWN0QWxsKCcub25vc0luc3QnKQogICAgICAgICAgICAuY2xhc3NlZCgnbWFzdGVyc2hpcCBhZmZpbml0eScsIGZhbHNlKTsKCiAgICAgICAgYXBpLnNob3dNYXN0ZXJzaGlwKG51bGwpOwogICAgICAgIG9pU2hvd01hc3RlciA9IGZhbHNlOwogICAgfQoKICAgIGZ1bmN0aW9uIGluc3RSZWN0QXR0cihkaW0pIHsKICAgICAgICB2YXIgcGFkID0gaW5zdENmZy5yZWN0UGFkOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHg6IHBhZCwKICAgICAgICAgICAgeTogcGFkLAogICAgICAgICAgICB3aWR0aDogZGltLncgLSBwYWQqMiwKICAgICAgICAgICAgaGVpZ2h0OiBkaW0uaCAtIHBhZCoyLAogICAgICAgICAgICByeDogNgogICAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gdmlld0JveChkaW0pIHsKICAgICAgICByZXR1cm4gJzAgMCAnICsgZGltLncgKyAnICcgKyBkaW0uaDsKICAgIH0KCiAgICBmdW5jdGlvbiBhdHRhY2hVaUJhZGdlKHN2ZykgewogICAgICAgIGdzLmFkZEdseXBoKHN2ZywgJ3VpQXR0YWNoZWQnLCAzMCwgdHJ1ZSwgWzEyLCBpbnN0Q2ZnLnVpRHldKQogICAgICAgICAgICAuY2xhc3NlZCgnYmFkZ2VJY29uIHVpQmFkZ2UnLCB0cnVlKTsKICAgIH0KCiAgICBmdW5jdGlvbiBpbnN0Q29sb3IoaWQsIG9ubGluZSkgewogICAgICAgIHJldHVybiBzdXMuY2F0NygpLmdldENvbG9yKGlkLCAhb25saW5lLCB0cy50aGVtZSgpKTsKICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBmdW5jdGlvbiB1cGRhdGVJbnN0YW5jZXMoKSB7CiAgICAgICAgdmFyIG9ub3NlcyA9IG9pQm94LmVsKCkuc2VsZWN0QWxsKCcub25vc0luc3QnKQogICAgICAgICAgICAgICAgLmRhdGEob25vc09yZGVyLCBmdW5jdGlvbiAoZCkgeyByZXR1cm4gZC5pZDsgfSksCiAgICAgICAgICAgIGluc3REaW0gPSB7dzowLGg6MH0sCiAgICAgICAgICAgIGMgPSBpbnN0Q2ZnOwoKICAgICAgICBmdW5jdGlvbiBuU3cobikgewogICAgICAgICAgICByZXR1cm4gJyMgU3dpdGNoZXM6ICcgKyBuOwogICAgICAgIH0KCiAgICAgICAgLy8gb3BlcmF0ZSBvbiBleGlzdGluZyBvbm9zIGluc3RhbmNlcyBpZiBuZWNlc3NhcnkKICAgICAgICBvbm9zZXMuZWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgICAgICB2YXIgZWwgPSBkMy5zZWxlY3QodGhpcyksCiAgICAgICAgICAgICAgICBzdmcgPSBlbC5zZWxlY3QoJ3N2ZycpOwogICAgICAgICAgICBpbnN0RGltID0gY29tcHV0ZURpbSh0aGlzKTsKCiAgICAgICAgICAgIC8vIHVwZGF0ZSBvbmxpbmUgc3RhdGUKICAgICAgICAgICAgZWwuY2xhc3NlZCgnb25saW5lJywgZC5vbmxpbmUpOwoKICAgICAgICAgICAgLy8gdXBkYXRlIHVpLWF0dGFjaGVkIHN0YXRlCiAgICAgICAgICAgIHN2Zy5zZWxlY3QoJ3VzZS51aUJhZGdlJykucmVtb3ZlKCk7CiAgICAgICAgICAgIGlmIChkLnVpQXR0YWNoZWQpIHsKICAgICAgICAgICAgICAgIGF0dGFjaFVpQmFkZ2Uoc3ZnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZnVuY3Rpb24gdXBkQXR0cihpZCwgdmFsdWUpIHsKICAgICAgICAgICAgICAgIHN2Zy5zZWxlY3QoJ3RleHQuaW5zdExhYmVsLicraWQpLnRleHQodmFsdWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB1cGRBdHRyKCdpcCcsIGQuaXApOwogICAgICAgICAgICB1cGRBdHRyKCducycsIG5TdyhkLnN3aXRjaGVzKSk7CiAgICAgICAgfSk7CgoKICAgICAgICAvLyBvcGVyYXRlIG9uIG5ldyBvbm9zIGluc3RhbmNlcwogICAgICAgIHZhciBlbnRlcmluZyA9IG9ub3Nlcy5lbnRlcigpCiAgICAgICAgICAgIC5hcHBlbmQoJ2RpdicpCiAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdvbm9zSW5zdCcpCiAgICAgICAgICAgIC5jbGFzc2VkKCdvbmxpbmUnLCBmdW5jdGlvbiAoZCkgeyByZXR1cm4gZC5vbmxpbmU7IH0pCiAgICAgICAgICAgIC5vbignY2xpY2snLCBjbGlja0luc3QpOwoKICAgICAgICBlbnRlcmluZy5lYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIHZhciBlbCA9IGQzLnNlbGVjdCh0aGlzKSwKICAgICAgICAgICAgICAgIHJlY3RBdHRyLAogICAgICAgICAgICAgICAgc3ZnOwogICAgICAgICAgICBpbnN0RGltID0gY29tcHV0ZURpbSh0aGlzKTsKICAgICAgICAgICAgcmVjdEF0dHIgPSBpbnN0UmVjdEF0dHIoaW5zdERpbSk7CgogICAgICAgICAgICBzdmcgPSBlbC5hcHBlbmQoJ3N2ZycpLmF0dHIoewogICAgICAgICAgICAgICAgd2lkdGg6IGluc3REaW0udywKICAgICAgICAgICAgICAgIGhlaWdodDogaW5zdERpbS5oLAogICAgICAgICAgICAgICAgdmlld0JveDogdmlld0JveChpbnN0RGltKQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHN2Zy5hcHBlbmQoJ3JlY3QnKS5hdHRyKHJlY3RBdHRyKTsKCiAgICAgICAgICAgIGdzLmFkZEdseXBoKHN2ZywgJ2JpcmQnLCAyOCwgdHJ1ZSwgWzE0LCAxNF0pCiAgICAgICAgICAgICAgICAuY2xhc3NlZCgnYmFkZ2VJY29uJywgdHJ1ZSk7CgogICAgICAgICAgICBpZiAoZC51aUF0dGFjaGVkKSB7CiAgICAgICAgICAgICAgICBhdHRhY2hVaUJhZGdlKHN2Zyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBsZWZ0ID0gYy5ub2RlT3ggKyBjLm5vZGVEaW0sCiAgICAgICAgICAgICAgICBsZW4gPSByZWN0QXR0ci53aWR0aCAtIGxlZnQsCiAgICAgICAgICAgICAgICBobGVuID0gbGVuIC8gMiwKICAgICAgICAgICAgICAgIG1pZGxpbmUgPSBobGVuICsgbGVmdDsKCiAgICAgICAgICAgIC8vIHRpdGxlCiAgICAgICAgICAgIHN2Zy5hcHBlbmQoJ3RleHQnKQogICAgICAgICAgICAgICAgLmF0dHIoewogICAgICAgICAgICAgICAgICAgIGNsYXNzOiAnaW5zdFRpdGxlJywKICAgICAgICAgICAgICAgICAgICB4OiBtaWRsaW5lLAogICAgICAgICAgICAgICAgICAgIHk6IGMudGl0bGVEeQogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC50ZXh0KGQuaWQpOwoKICAgICAgICAgICAgLy8gYSBjb3VwbGUgb2YgYXR0cmlidXRlcwogICAgICAgICAgICB2YXIgdHkgPSBjLnRpdGxlRHkgKyBjLnRleHRZT2ZmOwoKICAgICAgICAgICAgZnVuY3Rpb24gYWRkQXR0cihpZCwgbGFiZWwpIHsKICAgICAgICAgICAgICAgIHN2Zy5hcHBlbmQoJ3RleHQnKS5hdHRyKHsKICAgICAgICAgICAgICAgICAgICBjbGFzczogJ2luc3RMYWJlbCAnICsgaWQsCiAgICAgICAgICAgICAgICAgICAgeDogbWlkbGluZSwKICAgICAgICAgICAgICAgICAgICB5OiB0eQogICAgICAgICAgICAgICAgfSkudGV4dChsYWJlbCk7CiAgICAgICAgICAgICAgICB0eSArPSBjLnRleHRZU3BjOwogICAgICAgICAgICB9CgogICAgICAgICAgICBhZGRBdHRyKCdpcCcsIGQuaXApOwogICAgICAgICAgICBhZGRBdHRyKCducycsIG5TdyhkLnN3aXRjaGVzKSk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIG9wZXJhdGUgb24gZXhpc3RpbmcgKyBuZXcgb25vc2VzIGhlcmUKICAgICAgICAvLyBzZXQgdGhlIGFmZmluaXR5IGNvbG9ycy4uLgogICAgICAgIG9ub3Nlcy5lYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIHZhciBlbCA9IGQzLnNlbGVjdCh0aGlzKSwKICAgICAgICAgICAgICAgIHJlY3QgPSBlbC5zZWxlY3QoJ3N2ZycpLnNlbGVjdCgncmVjdCcpLAogICAgICAgICAgICAgICAgY29sID0gaW5zdENvbG9yKGQuaWQsIGQub25saW5lKTsKICAgICAgICAgICAgcmVjdC5zdHlsZSgnZmlsbCcsIGNvbCk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIGFkanVzdCB0aGUgcGFuZWwgc2l6ZSBhcHByb3ByaWF0ZWx5Li4uCiAgICAgICAgb2lCb3gud2lkdGgoaW5zdERpbS53ICogb25vc09yZGVyLmxlbmd0aCk7CiAgICAgICAgb2lCb3guaGVpZ2h0KGluc3REaW0uaCk7CgogICAgICAgIC8vIHJlbW92ZSBhbnkgb3V0Z29pbmcgaW5zdGFuY2VzCiAgICAgICAgb25vc2VzLmV4aXQoKS5yZW1vdmUoKTsKICAgIH0KCgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBmdW5jdGlvbiBsb2dpY0Vycm9yKG1zZykgewogICAgICAgIGlmIChzaG93TG9naWNFcnJvcnMpIHsKICAgICAgICAgICAgJGxvZy53YXJuKCdUb3BvSW5zdFNlcnZpY2U6ICcgKyBtc2cpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBpbml0SW5zdChfYXBpXykgewogICAgICAgIGFwaSA9IF9hcGlfOwogICAgICAgIG9pQm94ID0gcHMuY3JlYXRlUGFuZWwoaWRJbnMsIGluc3RPcHRzKTsKICAgICAgICBvaUJveC5zaG93KCk7CgogICAgICAgIG9ub3NJbnN0YW5jZXMgPSB7fTsKICAgICAgICBvbm9zT3JkZXIgPSBbXTsKICAgICAgICBvaVNob3dNYXN0ZXIgPSBmYWxzZTsKCiAgICAgICAgLy8gd2Ugd2FudCB0byB1cGRhdGUgdGhlIGluc3RhbmNlcywgZWFjaCB0aW1lIHRoZSB0aGVtZSBjaGFuZ2VzCiAgICAgICAgdGhlbWVMaXN0ZW5lciA9IHRzLmFkZExpc3RlbmVyKHVwZGF0ZUluc3RhbmNlcyk7CiAgICB9CgogICAgZnVuY3Rpb24gZGVzdHJveUluc3QoKSB7CiAgICAgICAgdHMucmVtb3ZlTGlzdGVuZXIodGhlbWVMaXN0ZW5lcik7CiAgICAgICAgdGhlbWVMaXN0ZW5lciA9IG51bGw7CgogICAgICAgIHBzLmRlc3Ryb3lQYW5lbChpZElucyk7CiAgICAgICAgb2lCb3ggPSBudWxsOwoKICAgICAgICBvbm9zSW5zdGFuY2VzID0ge307CiAgICAgICAgb25vc09yZGVyID0gW107CiAgICAgICAgb2lTaG93TWFzdGVyID0gZmFsc2U7CiAgICB9CgogICAgZnVuY3Rpb24gc2hvd0luc3RzKCkgewogICAgICAgIG9pQm94LnNob3coKTsKICAgIH0KCiAgICBmdW5jdGlvbiBoaWRlSW5zdHMoKSB7CiAgICAgICAgb2lCb3guaGlkZSgpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRvZ2dsZUluc3RzKHgpIHsKICAgICAgICB2YXIga2V2ID0gKHggPT09ICdrZXlldicpLAogICAgICAgICAgICBvbiwKICAgICAgICAgICAgdmVyYjsKCiAgICAgICAgaWYgKGtldikgewogICAgICAgICAgICBvbiA9IG9pQm94LnRvZ2dsZSgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG9uID0gISF4OwogICAgICAgICAgICBpZiAob24pIHsKICAgICAgICAgICAgICAgIHNob3dJbnN0cygpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaGlkZUluc3RzKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdmVyYiA9IG9uID8gJ1Nob3cnIDogJ0hpZGUnOwogICAgICAgIGZsYXNoLmZsYXNoKHZlcmIgKyAnIGluc3RhbmNlcyBwYW5lbCcpOwogICAgICAgIHJldHVybiBvbjsKICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIGFuZ3VsYXIubW9kdWxlKCdvdlRvcG8nKQogICAgLmZhY3RvcnkoJ1RvcG9JbnN0U2VydmljZScsCiAgICAgICAgWyckbG9nJywgJ1BhbmVsU2VydmljZScsICdTdmdVdGlsU2VydmljZScsICdHbHlwaFNlcnZpY2UnLAogICAgICAgICAgICAnVGhlbWVTZXJ2aWNlJywgJ0ZuU2VydmljZScsICdGbGFzaFNlcnZpY2UnLAoKICAgICAgICBmdW5jdGlvbiAoXyRsb2dfLCBfcHNfLCBfc3VzXywgX2dzXywgX3RzXywgX2ZzXywgX2ZsYXNoXykgewogICAgICAgICAgICAkbG9nID0gXyRsb2dfOwogICAgICAgICAgICBwcyA9IF9wc187CiAgICAgICAgICAgIHN1cyA9IF9zdXNfOwogICAgICAgICAgICBncyA9IF9nc187CiAgICAgICAgICAgIHRzID0gX3RzXzsKICAgICAgICAgICAgZnMgPSBfZnNfOwogICAgICAgICAgICBmbGFzaCA9IF9mbGFzaF87CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgaW5pdEluc3Q6IGluaXRJbnN0LAogICAgICAgICAgICAgICAgZGVzdHJveUluc3Q6IGRlc3Ryb3lJbnN0LAoKICAgICAgICAgICAgICAgIGFkZEluc3RhbmNlOiBhZGRJbnN0YW5jZSwKICAgICAgICAgICAgICAgIHVwZGF0ZUluc3RhbmNlOiB1cGRhdGVJbnN0YW5jZSwKICAgICAgICAgICAgICAgIHJlbW92ZUluc3RhbmNlOiByZW1vdmVJbnN0YW5jZSwKCiAgICAgICAgICAgICAgICBjYW5jZWxBZmZpbml0eTogY2FuY2VsQWZmaW5pdHksCgogICAgICAgICAgICAgICAgaXNWaXNpYmxlOiBmdW5jdGlvbiAoKSB7IHJldHVybiBvaUJveC5pc1Zpc2libGUoKTsgfSwKICAgICAgICAgICAgICAgIHNo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AEAGyG/AqAc2wKgHYJbUH/VA3gtEoa9azoAQB6DSSgAAAQEICgC34rkAYimvjvHvVm6wAQCoEAAAqBAAAGj3KB/SxQgAJ60eEwgARQAQmn9kQABABhsTwKgHYMCoBzYf9ZbPDr8j9KNq8SWAGAPqoHMAAAEBCAoAYimwALfitUhUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2phdmFzY3JpcHQNCkNvbnRlbnQtTGVuZ3RoOiA0MDkzDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCi8qCiAqIENvcHlyaWdodCAyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIFRvcG9sb2d5IGxheWVyIGZpbHRlcmluZyBNb2R1bGUuCiBQcm92aWRlcyBmdW5jdGlvbmFsaXR5IHRvIHZpc3VhbGx5IGRpZmZlcmVudGlhdGUgYmV0d2VlbiB0aGUgcGFja2V0IGFuZAogb3B0aWNhbCBsYXllcnMgb2YgdGhlIHRvcG9sb2d5LgogKi8KCihmdW5jdGlvbiAoKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8gaW5qZWN0ZWQgcmVmcwogICAgdmFyICRsb2csIGZzLCBmbGFzaCwgdHBzLCB0dHM7CgogICAgLy8gYXBpIHRvIHRvcG9Gb3JjZQogICAgdmFyIGFwaTsKICAgIC8qCiAgICAgbm9kZSgpICAgICAvLyBnZXQgcmVmIHRvIEQzIHNlbGVjdGlvbiBvZiBub2RlcwogICAgIGxpbmsoKSAgICAgLy8gZ2V0IHJlZiB0byBEMyBzZWxlY3Rpb24gb2YgbGlua3MKICAgICAqLwoKICAgIHZhciBzbWF4ID0gJ3N1cHByZXNzZWRtYXgnOwoKICAgIC8vIHdoaWNoICJsYXllciIgYSBwYXJ0aWN1bGFyIGl0ZW0gImJlbG9uZ3MgdG8iCiAgICB2YXIgbGF5ZXJMb29rdXAgPSB7CiAgICAgICAgICAgIGhvc3Q6IHsKICAgICAgICAgICAgICAgIGVuZHN0YXRpb246ICdwa3QnLCAvLyBkZWZhdWx0LCBpZiBob3N0IGV2ZW50IGRvZXMgbm90IGRlZmluZSB0eXBlCiAgICAgICAgICAgICAgICByb3V0ZXI6ICAgICAncGt0JywKICAgICAgICAgICAgICAgIGJncFNwZWFrZXI6ICdwa3QnCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGRldmljZTogewogICAgICAgICAgICAgICAgc3dpdGNoOiAncGt0JywKICAgICAgICAgICAgICAgIHJvYWRtOiAnb3B0JywKICAgICAgICAgICAgICAgIG90bjogJ29wdCcKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbGluazogewogICAgICAgICAgICAgICAgaG9zdExpbms6ICdwa3QnLAogICAgICAgICAgICAgICAgZGlyZWN0OiAncGt0JywKICAgICAgICAgICAgICAgIGluZGlyZWN0OiAnJywKICAgICAgICAgICAgICAgIHR1bm5lbDogJycsCiAgICAgICAgICAgICAgICBvcHRpY2FsOiAnb3B0JwogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAvLyBvcmRlciBvZiBsYXllciBjeWNsaW5nIGluIGJ1dHRvbgogICAgICAgIGRpc3BhdGNoID0gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0eXBlOiAnYWxsJywKICAgICAgICAgICAgICAgIGFjdGlvbjogZnVuY3Rpb24gKCkgeyBzdXBwcmVzc0xheWVycyhmYWxzZSk7IH0sCiAgICAgICAgICAgICAgICBtc2c6ICdBbGwgTGF5ZXJzIFNob3duJwogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0eXBlOiAncGt0JywKICAgICAgICAgICAgICAgIGFjdGlvbjogZnVuY3Rpb24gKCkgeyBzaG93TGF5ZXIoJ3BrdCcpOyB9LAogICAgICAgICAgICAgICAgbXNnOiAnUGFja2V0IExheWVyIFNob3duJwogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0eXBlOiAnb3B0JywKICAgICAgICAgICAgICAgIGFjdGlvbjogZnVuY3Rpb24gKCkgeyBzaG93TGF5ZXIoJ29wdCcpOyB9LAogICAgICAgICAgICAgICAgbXNnOiAnT3B0aWNhbCBMYXllciBTaG93bicKICAgICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgbGF5ZXIgPSAwOwoKICAgIGZ1bmN0aW9uIGNsaWNrQWN0aW9uKCkgewogICAgICAgIGxheWVyID0gKGxheWVyICsgMSkgJSBkaXNwYXRjaC5sZW5ndGg7CiAgICAgICAgZGlzcGF0Y2hbbGF5ZXJdLmFjdGlvbigpOwogICAgICAgIGZsYXNoLmZsYXNoKGRpc3BhdGNoW2xheWVyXS5tc2cpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGVkKCkgewogICAgICAgIHJldHVybiBkaXNwYXRjaFtsYXllcl0udHlwZTsKICAgIH0KCiAgICBmdW5jdGlvbiBpbkxheWVyKGQsIGxheWVyKSB7CiAgICAgICAgdmFyIHR5cGUgPSBkLmNsYXNzID09PSAnbGluaycgPyBkLnR5cGUoKSA6IGQudHlwZSwKICAgICAgICAgICAgbG9vayA9IGxheWVyTG9va3VwW2QuY2xhc3NdLAogICAgICAgICAgICBseXIgPSBsb29rICYmIGxvb2tbdHlwZV07CiAgICAgICAgcmV0dXJuIGx5ciA9PT0gbGF5ZXI7CiAgICB9CgogICAgZnVuY3Rpb24gdW5zdXBwcmVzc0xheWVyKHdoaWNoKSB7CiAgICAgICAgYXBpLm5vZGUoKS5lYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIHZhciBub2RlID0gZC5lbDsKICAgICAgICAgICAgaWYgKGluTGF5ZXIoZCwgd2hpY2gpKSB7CiAgICAgICAgICAgICAgICBub2RlLmNsYXNzZWQoc21heCwgZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIGFwaS5saW5rKCkuZWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgICAgICB2YXIgbGluayA9IGQuZWw7CiAgICAgICAgICAgIGlmIChpbkxheWVyKGQsIHdoaWNoKSkgewogICAgICAgICAgICAgICAgbGluay5jbGFzc2VkKHNtYXgsIGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIHN1cHByZXNzTGF5ZXJzKGIpIHsKICAgICAgICBhcGkubm9kZSgpLmNsYXNzZWQoc21heCwgYik7CiAgICAgICAgYXBpLmxpbmsoKS5jbGFzc2VkKHNtYXgsIGIpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNob3dMYXllcih3aGljaCkgewogICAgICAgIHN1cHByZXNzTGF5ZXJzKHRydWUpOwogICAgICAgIHVuc3VwcHJlc3NMYXllcih3aGljaCk7CiAgICB9CgogICAgLy8gPT09IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyA9PT0gTU9EVUxFIERFRklOSVRJT04gPT09CgogICAgYW5ndWxhci5tb2R1bGUoJ292VG9wbycpCiAgICAgICAgLmZhY3RvcnkoJ1RvcG9GaWx0ZXJTZXJ2aWNlJywKICAgICAgICBbJyRsb2cnLCAnRm5TZXJ2aWNlJywKICAgICAgICAgICAgJ0ZsYXNoU2VydmljZScsCiAgICAgICAgICAgICdUb3BvUGFuZWxTZXJ2aWNlJywKICAgICAgICAgICAgJ1RvcG9UcmFmZmljU2VydmljZScsCgogICAgICAgICAgICBmdW5jdGlvbiAoXyRsb2dfLCBfZnNfLCBfZmxhc2hfLCBfdHBzXywgX3R0c18pIHsKICAgICAgICAgICAgICAgICRsb2cgPSBfJGxvZ187CiAgICAgICAgICAgICAgICBmcyA9IF9mc187CiAgICAgICAgICAgICAgICBmbGFzaCA9IF9mbGFzaF87CiAgICAgICAgICAgICAgICB0cHMgPSBfdHBzXzsKICAgICAgICAgICAgICAgIHR0cyA9IF90dHNfOwoKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGluaXRGaWx0ZXIoX2FwaV8pIHsKICAgICAgICAgICAgICAgICAgICBhcGkgPSBfYXBpXzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIGluaXRGaWx0ZXI6IGluaXRGaWx0ZXIsCgogICAgICAgICAgICAgICAgICAgIGNsaWNrQWN0aW9uOiBjbGlja0FjdGlvbiwKICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZDogc2VsZWN0ZWQsCiAgICAgICAgICAgICAgICAgICAgaW5MYXllcjogaW5MYXllcgogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfV0pOwp9KCkpOwqO8e9WrrABAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0xEFAAEAG5pvAqAc2wKgHYJbPH/WjavElDr80WoAQIWYpfgAAAQEICgC34roAYimwjvHvVn+xAQCdAgAAnQIAAAgAJ60eE2j3KB/SxQgARQACj2SyQABABkPQwKgHNsCoB2CW0x/1YRyI+3KDctGAGAWkhqkAAAEBCAoAt+K6AGIpr0dFVCAvb25vcy91aS90cC9hbmd1bGFyLWNoYXJ0Lm1pbi5jc3MgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6IHRleHQvY3NzLCovKjtxPTAuMQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71YCtAEAkQIAAJECAAAIACetHhNo9ygf0sUIAEUAAoPibkAAQAbGH8CoBzbAqAdgltQf9UDeC0Shr1rOgBgHoLZdAAABAQgKALfiugBiKa9HRVQgL29ub3MvdWkvYXBwL29ub3MuY3NzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiB0ZXh0L2NzcywqLyo7cT0wLjENClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQqO8e9WebQBAJMCAACTAgAACAAnrR4TaPcoH9LFCABFAAKFa9NAAEAGPLnAqAc2wKgHYJbSH/U0h5nrU1JIi4AYDzMjuQAAAQEICgC34roAYimvR0VUIC9vbm9zL3VpL2FwcC9jb21tb24uY3NzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiB0ZXh0L2NzcywqLyo7cT0wLjENClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQqO8e9WqbQBAJkCAACZAgAACAAnrR4TaPcoH9LFCABFAAKLX8NAAEAGSMPAqAc2wKgHYJbQH/X5Pj6IaztLo4AYBaSW4gAAAQEICgC34roAYimvR0VUIC9vbm9zL3VpL2FwcC9mdy9tYXN0L21hc3QuY3NzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiB0ZXh0L2NzcywqLyo7cT0wLjENClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQqO8e9W9rgBAJkCAACZAgAACAAnrR4TaPcoH9LFCABFAAKLxEJAAEAG5EPAqAc2wKgHYJbPH/WjavElDr80WoAYIWZUUAAAAQEICgC34roAYimwR0VUIC9vbm9zL3VpL2FwcC9mdy9zdmcvZ2x5cGguY3NzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiB0ZXh0L2NzcywqLyo7cT0wLjENClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQqO8e9WQ7wBANIDAADSAwAAaPcoH9LFCAAnrR4TCABFAAPELAdAAEAGe0bAqAdgwKgHNh/1ltNyg3LRYRyLVoAYAzKTnQAAAQEICgBiKbEAt+K6SFRUUC8xLjEgMjAwIE9LDQpFVGFnOiAxNDU4NTY1Mzg2ODE5DQpDb250ZW50LVR5cGU6IHRleHQvY3NzDQpUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQozMEMNCi5jaGFydC1sZWdlbmQsLmJhci1sZWdlbmQsLmxpbmUtbGVnZW5kLC5waWUtbGVnZW5kLC5yYWRhci1sZWdlbmQsLnBvbGFyYXJlYS1sZWdlbmQsLmRvdWdobnV0LWxlZ2VuZHtsaXN0LXN0eWxlLXR5cGU6bm9uZTttYXJnaW4tdG9wOjVweDt0ZXh0LWFsaWduOmNlbnRlcjstd2Via2l0LXBhZGRpbmctc3RhcnQ6MDstbW96LXBhZGRpbmctc3RhcnQ6MDtwYWRkaW5nLWxlZnQ6MH0uY2hhcnQtbGVnZW5kIGxpLC5iYXItbGVnZW5kIGxpLC5saW5lLWxlZ2VuZCBsaSwucGllLWxlZ2VuZCBsaSwucmFkYXItbGVnZW5kIGxpLC5wb2xhcmFyZWEtbGVnZW5kIGxpLC5kb3VnaG51dC1sZWdlbmQgbGl7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2hpdGUtc3BhY2U6bm93cmFwO3Bvc2l0aW9uOnJlbGF0aXZlO21hcmdpbi1ib3R0b206NHB4O2JvcmRlci1yYWRpdXM6NXB4O3BhZGRpbmc6MnB4IDhweCAycHggMjhweDtmb250LXNpemU6c21hbGxlcjtjdXJzb3I6ZGVmYXVsdH0uY2hhcnQtbGVnZW5kIGxpIHNwYW4sLmJhci1sZWdlbmQgbGkgc3BhbiwubGluZS1sZWdlbmQgbGkgc3BhbiwucGllLWxlZ2VuZCBsaSBzcGFuLC5yYWRhci1sZWdlbmQgbGkgc3BhbiwucG9sYXJhcmVhLWxlZ2VuZCBsaSBzcGFuLC5kb3VnaG51dC1sZWdlbmQgbGkgc3BhbntkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6MDt0b3A6MDt3aWR0aDoyMHB4O2hlaWdodDoyMHB4O2JvcmRlci1yYWRpdXM6NXB4fQovKiMgc291cmNlTWFwcGluZ1VSTD1hbmd1bGFyLWNoYXJ0Lm1pbi5jc3MubWFwICovCg0KjvHvVgG9AQAIBAAACAQAAGj3KB/SxQgAJ60eEwgARQAD+ikWQABABn4BwKgHYMCoBzYf9ZbSU1JIizSHnDyAGAOjk9MAAAEBCAoAYimxALfiukhUVFAvMS4xIDIwMCBPSw0KRVRhZzogMTQ1ODU2NTM4NjgxOQ0KQ29udGVudC1UeXBlOiB0ZXh0L2Nzcw0KVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KMzQyDQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBjb21tb24gLS0gQ1NTIGZpbGUKICovCgojdmlldyBoMiB7CiAgICBtYXJnaW46IDA7CiAgICAvKiBzZXBhcmF0ZWQgb3V0IHNvIHRoYXQgb3RoZXIgcGFkZGluZyBkb2Vzbid0IGdldCBjbG9iYmVyZWQgKi8KICAgIHBhZGRpbmctdG9wOiAyMHB4OwogICAgcGFkZGluZy1ib3R0b206IDIwcHg7Cn0KCi5jbGlja2FibGUgewogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoNCo7x71YhvgEARwAAAEcAAABo9ygf0sUIACetHhMIAEUAADkpF0AAQAaBwcCoB2DAqAc2H/WW0lNSTFE0h5w8gBgDo5ASAAABAQgKAGIpsQC34rowDQoNCo7x71YHvwEAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADRr1EAAQAY/CcCoBzbAqAdgltIf9TSHnDxTUkxWgBAPM6LqAAABAQgKALfiugBiKbGO8e9Wd8EBAJgCAACYAgAACAAnrR4TaPcoH9LFCABFAAKKa9VAAEAGPLLAqAc2wKgHYJbSH/U0h5w8U1JMVoAYDzN9iAAAAQEICgC34rsAYimxR0VUIC9vbm9zL3VpL2FwcC9mdy9zdmcvaWNvbi5jc3MgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6IHRleHQvY3NzLCovKjtxPTAuMQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71YpxgEAXQgAAF0IAABo9ygf0sUIACetHhMIAEUACE+JhUAAQAYZPcCoB2DAqAc2H/WW0Gs7S6P5PkDfgBgC6JgoAAABAQgKAGIpsQC34rpIVFRQLzEuMSAyMDAgT0sNCkVUYWc6IDE0NTg1NjUzODY4MTkNCkNvbnRlbnQtVHlwZTogdGV4dC9jc3MNClRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCjc5Nw0KLyoKICogQ29weXJpZ2h0IDIwMTQsMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBNYXN0aGVhZCAtLSBDU1MgZmlsZQogKi8KCiNtYXN0IHsKICAgIGhlaWdodDogMzZweDsKICAgIHBhZGRpbmc6IDRweDsKICAgIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsKfQoKaHRtbFtkYXRhLXBsYXRmb3JtPSdpUGFkJ10gI21hc3QgewogICAgcGFkZGluZy10b3A6IDE2cHg7Cn0KCi5saWdodCAjbWFzdCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYmJiOwogICAgYm94LXNoYWRvdzogMCAycHggOHB4ICM3Nzc7Cn0KLmRhcmsgI21hc3QgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzQ0NDsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCAjMjIyOwp9CgojbWFzdCAubmF2LW1lbnUtYnV0dG9uIHsKICAgIHdpZHRoOiAzMHB4OwogICAgaGVpZ2h0OiAzMHB4OwogICAgbWFyZ2luLWxlZnQ6IDhweDsKICAgIG1hcmdpbi1ib3R0b206IDRweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoubGlnaHQgI21hc3QgLm5hdi1tZW51LWJ1dHRvbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkOwp9Ci5kYXJrICNtYXN0IC5uYXYtbWVudS1idXR0b246aG92ZXIgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzc3NzsKfQoKI21hc3QgaW1nLmxvZ28gewogICAgaGVpZ2h0OiAzOHB4OwogICAgcGFkZGluZy1sZWZ0OiA4cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7Cn0KCiNtYXN0IGltZy5sb2dvOmhvdmVyIHsKICAgIC8qIG5lZWQgc29tZXRoaW5nIGJldHRlciAqLwogICAgLypiYWNrZ3JvdW5kLWNvbG9yOiAjODg4OyovCn0KCiNtYXN0IC50aXRsZSB7CiAgICBmb250LXNpemU6IDE0cHQ7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICB2ZXJ0aWNhbC1hbGlnbjogMTJweDsKfQoKLmxpZ2h0ICNtYXN0IC50aXRsZSB7CiAgICBjb2xvcjogIzM2OTsKfQouZGFyayAjbWFzdCAudGl0bGUgewogICAgY29sb3I6ICNlZWU7Cn0KCiNtYXN0LXJpZ2h0IHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIHBhZGRpbmctdG9wOiA4cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiAxNnB4OwogICAgZmxvYXQ6IHJpZ2h0OwogICAgLypib3JkZXI6IDFweCBzb2xpZCByZWQ7Ki8KfQoKI21hc3QtcmlnaHQgYSB7CiAgICBmb250LXNpemU6IDEycHQ7CiAgICBmb250LXN0eWxlOiBub3JtYWw7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQoKLmxpZ2h0ICNtYXN0LXJpZ2h0IGEgewogICAgY29sb3I6ICMzNjk7Cn0KLmRhcmsgI21hc3QtcmlnaHQgYSB7CiAgICBjb2xvcjogI2VlZTsKfQoKI21hc3QtcmlnaHQgYTpob3ZlciB7CiAgICBjb2xvcjogI0NFNTY1MDsKfQoNCo7x71ZrxgEAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADRfxEAAQAZLGcCoBzbAqAdgltAf9fk+QN9rO1O+gBAFpCPPAAABAQgKALfiuwBiKbGO8e9WtcYBAIocAACKHAAAaPcoH9LFCAAnrR4TCABFABx8zMRAAEAGwdDAqAdgwKgHNh/1ltFalglBjJfpDIAQA4ysVQAAAQEICgBiKbEAt+K2SFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvamF2YXNjcmlwdA0KVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KODAwMA0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gVG9wb2xvZ3kgRm9yY2UgTW9kdWxlLgogVmlzdWFsaXphdGlvbiBvZiB0aGUgdG9wb2xvZ3kgaW4gYW4gU1ZHIGxheWVyLCB1c2luZyBhIEQzIEZvcmNlIExheW91dC4KICovCgooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIGluamVjdGVkIHJlZnMKICAgIHZhciAkbG9nLCAkdGltZW91dCwgZnMsIHN1cywgdHMsIGZsYXNoLCB3c3MsIHRvdiwKICAgICAgICB0aXMsIHRtcywgdGQzLCB0c3MsIHR0cywgdG9zLCBmbHRyLCB0bHMsIHVwbGluaywgc3ZnOwoKICAgIC8vIGNvbmZpZ3VyYXRpb24KICAgIHZhciBsaW5rQ29uZmlnID0gewogICAgICAgIGxpZ2h0OiB7CiAgICAgICAgICAgIGJhc2VDb2xvcjogJyM2NjYnLAogICAgICAgICAgICBpbkNvbG9yOiAnIzY2ZicsCiAgICAgICAgICAgIG91dENvbG9yOiAnI2YwMCcKICAgICAgICB9LAogICAgICAgIGRhcms6IHsKICAgICAgICAgICAgYmFzZUNvbG9yOiAnI2FhYScsCiAgICAgICAgICAgIGluQ29sb3I6ICcjNjZmJywKICAgICAgICAgICAgb3V0Q29sb3I6ICcjZjY2JwogICAgICAgIH0sCiAgICAgICAgaW5XaWR0aDogMTIsCiAgICAgICAgb3V0V2lkdGg6IDEwCiAgICB9OwoKICAgIC8vIGludGVybmFsIHN0YXRlCiAgICB2YXIgc2V0dGluZ3MsICAgLy8gbWVyZ2VkIGRlZmF1bHQgc2V0dGluZ3MgYW5kIG9wdGlvbnMKICAgICAgICBmb3JjZSwgICAgICAvLyBmb3JjZSBsYXlvdXQgb2JqZWN0CiAgICAgICAgZHJhZywgICAgICAgLy8gZHJhZyBiZWhhdmlvciBoYW5kbGVyCiAgICAgICAgbmV0d29yayA9IHsKICAgICAgICAgICAgbm9kZXM6IFtdLAogICAgICAgICAgICBsaW5rczogW10sCiAgICAgICAgICAgIGxpbmtzQnlEZXZpY2U6IHt9LAogICAgICAgICAgICBsb29rdXA6IHt9LAogICAgICAgICAgICByZXZMaW5rVG9LZXk6IHt9CiAgICAgICAgfSwKICAgICAgICBsdSwgICAgICAgICAgICAgICAgICAgICAvLyBzaG9ydGhhbmQgZm9yIGxvb2t1cAogICAgICAgIHJsaywgICAgICAgICAgICAgICAgICAgIC8vIHNob3J0aGFuZCBmb3IgcmV2TGlua3RvS2V5CiAgICAgICAgc2hvd0hvc3RzID0gZmFsc2UsICAgICAgLy8gd2hldGhlciBob3N0cyBhcmUgZGlzcGxheWVkCiAgICAgICAgc2hvd09mZmxpbmUgPSB0cnVlLCAgICAgLy8gd2hldGhlciBvZmZsaW5lIGRldmljZXMgYXJlIGRpc3BsYXllZAogICAgICAgIG5vZGVMb2NrID0gZmFsc2UsICAgICAgIC8vIHdoZXRoZXIgbm9kZXMgY2FuIGJlIGRyYWdnZWQgb3Igbm90IChsb2NrZWQpCiAgICAgICAgZlRpbWVyLCAgICAgICAgICAgICAgICAgLy8gdGltZXIgZm9yIGRlbGF5ZWQgZm9yY2UgbGF5b3V0CiAgICAgICAgZk5vZGVzVGltZXIsICAgICAgICAgICAgLy8gdGltZXIgZm9yIGRlbGF5ZWQgbm9kZXMgdXBkYXRlCiAgICAgICAgZkxpbmtzVGltZXIsICAgICAgICAgICAgLy8gdGltZXIgZm9yIGRlbGF5ZWQgbGlua3MgdXBkYXRlCiAgICAgICAgZGltLCAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGRpbWVuc2lvbnMgb2YgdGhlIGZvcmNlIGxheW91dCBbdyxoXQogICAgICAgIGxpbmtOdW1zID0gW107ICAgICAgICAgIC8vIGFycmF5IG9mIGxpbmsgbnVtYmVyIGxhYmVscwoKICAgIC8vIFNWRyBlbGVtZW50czsKICAgIHZhciBsaW5rRywgbGlua0xhYmVsRywgbnVtTGlua0xibHNHLCBwb3J0TGFiZWxHLCBub2RlRzsKCiAgICAvLyBEMyBzZWxlY3Rpb25zOwogICAgdmFyIGxpbmssIGxpbmtMYWJlbCwgbm9kZTsKCiAgICAvLyBkZWZhdWx0IHNldHRpbmdzIGZvciBmb3JjZSBsYXlvdXQKICAgIHZhciBkZWZhdWx0U2V0dGluZ3MgPSB7CiAgICAgICAgZ3Jhdml0eTogMC40LAogICAgICAgIGZyaWN0aW9uOiAwLjcsCiAgICAgICAgY2hhcmdlOiB7CiAgICAgICAgICAgIC8vIG5vdGU6IGtleSBpcyBub2RlLmNsYXNzCiAgICAgICAgICAgIGRldmljZTogLTgwMDAsCiAgICAgICAgICAgIGhvc3Q6IC01MDAwLAogICAgICAgICAgICBfZGVmXzogLTEyMDAwCiAgICAgICAgfSwKICAgICAgICBsaW5rRGlzdGFuY2U6IHsKICAgICAgICAgICAgLy8gbm90ZToga2V5IGlzIGxpbmsudHlwZQogICAgICAgICAgICBkaXJlY3Q6IDEwMCwKICAgICAgICAgICAgb3B0aWNhbDogMTIwLAogICAgICAgICAgICBob3N0TGluazogMywKICAgICAgICAgICAgX2RlZl86IDUwCiAgICAgICAgfSwKICAgICAgICBsaW5rU3RyZW5ndGg6IHsKICAgICAgICAgICAgLy8gbm90ZToga2V5IGlzIGxpbmsudHlwZQogICAgICAgICAgICAvLyByYW5nZTogezAuMCAuLi4gMS4wfQogICAgICAgICAgICAvL2RpcmVjdDogMS4wLAogICAgICAgICAgICAvL29wdGljYWw6IDEuMCwKICAgICAgICAgICAgLy9ob3N0TGluazogMS4wLAogICAgICAgICAgICBfZGVmXzogMS4wCiAgICAgICAgfQogICAgfTsKCgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vID09PSBFVkVOVCBIQU5ETEVSUwoKICAgIGZ1bmN0aW9uIGFkZERldmljZShkYXRhKSB7CiAgICAgICAgdmFyIGlkID0gZGF0YS5pZCwKICAgICAgICAgICAgZDsKCiAgICAgICAgdXBsaW5rLnNob3dOb0RldnMoZmFsc2UpOwoKICAgICAgICAvLyBhbHRob3VnaCB0aGlzIGlzIGFuIGFkZCBkZXZpY2UgZXZlbnQsIGlmIHdlIGFscmVhZHkgaGF2ZSB0aGUKICAgICAgICAvLyAgZGV2aWNlLCB0cmVhdCBpdCBhcyBhbiB1cGRhdGUgaW5zdGVhZC4uCiAgICAgICAgaWYgKGx1W2lkXSkgewogICAgICAgICAgICB1cGRhdGVEZXZpY2UoZGF0YSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGQgPSB0bXMuY3JlYXRlRGV2aWNlTm9kZShkYXRhKTsKICAgICAgICBuZXR3b3JrLm5vZGVzLnB1c2goZCk7CiAgICAgICAgbHVbaWRdID0gZDsKICAgICAgICB1cGRhdGVOb2RlcygpOwogICAgICAgIGZTdGFydCgpOwogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZURldmljZShkYXRhKSB7CiAgICAgICAgdmFyIGlkID0gZGF0YS5pZCwKICAgICAgICAgICAgZCA9IGx1W2lkXSwKICAgICAgICAgICAgd2FzT25saW5lOwoKICAgICAgICBpZiAoZCkgewogICAgICAgICAgICB3YXNPbmxpbmUgPSBkLm9ubGluZTsKICAgICAgICAgICAgYW5ndWxhci5leHRlbmQoZCwgZGF0YSk7CiAgICAgICAgICAgIGlmICh0bXMucG9zaXRpb25Ob2RlKGQsIHRydWUpKSB7CiAgICAgICAgICAgICAgICBzZW5kVXBkYXRlTWV0YShkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB1cGRhdGVOb2RlcygpOwogICAgICAgICAgICBpZiAod2FzT25saW5lICE9PSBkLm9ubGluZSkgewogICAgICAgICAgICAgICAgdG1zLmZpbmRBdHRhY2hlZExpbmtzKGQuaWQpLmZvckVhY2gocmVzdHlsZUxpbmtFbGVtZW50KTsKICAgICAgICAgICAgICAgIHVwZGF0ZU9mZmxpbmVWaXNpYmlsaXR5KGQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHJlbW92ZURldmljZShkYXRhKSB7CiAgICAgICAgdmFyIGlkID0gZGF0YS5pZCwKICAgICAgICAgICAgZCA9IGx1W2lkXTsKICAgICAgICBpZiAoZCkgewogICAgICAgICAgICByZW1vdmVEZXZpY2VFbGVtZW50KGQpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBhZGRIb3N0KGRhdGEpIHsKICAgICAgICB2YXIgaWQgPSBkYXRhLmlkLAogICAgICAgICAgICBkLCBsbms7CgogICAgICAgIC8vIGFsdGhvdWdoIHRoaXMgaXMgYW4gYWRkIGhvc3QgZXZlbnQsIGlmIHdlIGFscmVhZHkgaGF2ZSB0aGUKICAgICAgICAvLyAgaG9zdCwgdHJlYXQgaXQgYXMgYW4gdXBkYXRlIGluc3RlYWQuLgogICAgICAgIGlmIChsdVtpZF0pIHsKICAgICAgICAgICAgdXBkYXRlSG9zdChkYXRhKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgZCA9IHRtcy5jcmVhdGVIb3N0Tm9kZShkYXRhKTsKICAgICAgICBuZXR3b3JrLm5vZGVzLnB1c2goZCk7CiAgICAgICAgbHVbaWRdID0gZDsKICAgICAgICB1cGRhdGVOb2RlcygpOwoKICAgICAgICBsbmsgPSB0bXMuY3JlYXRlSG9zdExpbmsoZGF0YSk7CiAgICAgICAgaWYgKGxuaykgewogICAgICAgICAgICBkLmxpbmtEYXRhID0gbG5rOyAgICAvLyBjYWNoZSByZWYgb24gaXRzIGhvc3QKICAgICAgICAgICAgbmV0d29yay5saW5rcy5wdXNoKGxuayk7CiAgICAgICAgICAgIGx1W2QuaW5ncmVzc10gPSBsbms7CiAgICAgICAgICAgIGx1W2QuZWdyZXNzXSA9IGxuazsKICAgICAgICAgICAgdXBkYXRlTGlua3MoKTsKICAgICAgICB9CiAgICAgICAgZlN0YXJ0KCk7CiAgICB9CgogICAgZnVuY3Rpb24gdXBkYXRlSG9zdChkYXRhKSB7CiAgICAgICAgdmFyIGlkID0gZGF0YS5pZCwKICAgICAgICAgICAgZCA9IGx1W2lkXTsKICAgICAgICBpZiAoZCkgewogICAgICAgICAgICBhbmd1bGFyLmV4dGVuZChkLCBkYXRhKTsKICAgICAgICAgICAgaWYgKHRtcy5wb3NpdGlvbk5vZGUoZCwgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgIHNlbmRVcGRhdGVNZXRhKGQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHVwZGF0ZU5vZGVzKCk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIG1vdmVIb3N0KGRhdGEpIHsKICAgICAgICB2YXIgaWQgPSBkYXRhLmlkLAogICAgICAgICAgICBkID0gbHVbaWRdLAogICAgICAgICAgICBsbms7CiAgICAgICAgaWYgKGQpIHsKICAgICAgICAgICAgLy8gZmlyc3QgcmVtb3ZlIHRoZSBvbGQgaG9zdCBsaW5rCiAgICAgICAgICAgIHJlbW92ZUxpbmtFbGVtZW50KGQubGlua0RhdGEpOwoKICAgICAgICAgICAgLy8gbWVyZ2UgbmV3IGRhdGEKICAgICAgICAgICAgYW5ndWxhci5leHRlbmQoZCwgZGF0YSk7CiAgICAgICAgICAgIGlmICh0bXMucG9zaXRpb25Ob2RlKGQsIHRydWUpKSB7CiAgICAgICAgICAgICAgICBzZW5kVXBkYXRlTWV0YShkKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbm93IGNyZWF0ZSBhIG5ldyBob3N0IGxpbmsKICAgICAgICAgICAgbG5rID0gdG1zLmNyZWF0ZUhvc3RMaW5rKGRhdGEpOwogICAgICAgICAgICBpZiAobG5rKSB7CiAgICAgICAgICAgICAgICBkLmxpbmtEYXRhID0gbG5rOwogICAgICAgICAgICAgICAgbmV0d29yay5saW5rcy5wdXNoKGxuayk7CiAgICAgICAgICAgICAgICBsdVtkLmluZ3Jlc3NdID0gbG5rOwogICAgICAgICAgICAgICAgbHVbZC5lZ3Jlc3NdID0gbG5rOwogICAgICAgICAgICB9CgogICAgICAgICAgICB1cGRhdGVOb2RlcygpOwogICAgICAgICAgICB1cGRhdGVMaW5rcygpOwogICAgICAgICAgICBmUmVzdW1lKCk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHJlbW92ZUhvc3QoZGF0YSkgewogICAgICAgIHZhciBpZCA9IGRhdGEuaWQsCiAgICAgICAgICAgIGQgPSBsdVtpZF07CiAgICAgICAgaWYgKGQpIHsKICAgICAgICAgICAgcmVtb3ZlSG9zdEVsZW1lbnQoZCwgdHJ1ZSk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGFkZExpbmsoZGF0YSkgewogICAgICAgIHZhciByZXN1bHQgPSB0bXMuZmluZExpbmsoZGF0YSwgJ2FkZCcpLAogICAgICAgICAgICBiYWQgPSByZXN1bHQuYmFkTG9naWMsCiAgICAgICAgICAgIGQgPSByZXN1bHQubGRhdGE7CgogICAgICAgIGlmIChiYWQpIHsKICAgICAgICAgICAgJGxvZy5kZWJ1ZyhiYWQgKyAnOiAnICsgbGluay5pZCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmIChkKSB7CiAgICAgICAgICAgIC8vIHdlIGFscmVhZHkgaGF2ZSBhIGJhY2tpbmcgc3RvcmUgbGluayBmb3Igc3JjL2RzdCBub2RlcwogICAgICAgICAgICBhZGRMaW5rVXBkYXRlKGQsIGRhdGEpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBubyBiYWNraW5nIHN0b3JlIGxpbmsgeWV0CiAgICAgICAgZCA9IHRtcy5jcmVhdGVMaW5rKGRhdGEpOwogICAgICAgIGlmIChkKSB7CiAgICAgICAgICAgIG5ldHdvcmsubGlua3MucHVzaChkKTsKICAgICAgICAgICAgYWdncmVnYXRlTGluayhkLCBkYXRhKTsKICAgICAgICAgICAgbHVbZC5rZXldID0gZDsKICAgICAgICAgICAgdXBkYXRlTGlua3MoKTsKICAgICAgICAgICAgZlN0YXJ0KCk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZUxpbmsoZGF0YSkgewogICAgICAgIHZhciByZXN1bHQgPSB0bXMuZmluZExpbmsoZGF0YSwgJ3VwZGF0ZScpLAogICAgICAgICAgICBiYWQgPSByZXN1bHQuYmFkTG9naWM7CiAgICAgICAgaWYgKGJhZCkgewogICAgICAgICAgICAkbG9nLmRlYnVnKGJhZCArICc6ICcgKyBsaW5rLmlkKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICByZXN1bHQudXBkYXRlV2l0aChkYXRhKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZW1vdmVMaW5rKGRhdGEpIHsKICAgICAgICB2YXIgcmVzdWx0ID0gdG1zLmZpbmRMaW5rKGRhdGEsICdyZW1vdmUnKTsKCiAgICAgICAgaWYgKCFyZXN1bHQuYmFkTG9naWMpIHsKICAgICAgICAgICAgcmVzdWx0LnJlbW92ZVJhd0xpbmsoKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gdG9wb1N0YXJ0RI7x71b/xgEAihwAAIocAABo9ygf0sUIACetHhMIAEUAHHzMyUAAQAbBy8CoB2DAqAc2H/WW0VqWJYmMl+kMgBADjKxVAAABAQgKAGIpsQC34rZvbmUoZGF0YSkgewogICAgICAgIC8vIGNhbGxlZCB3aGVuIHRoZSBpbml0aWFsIGJhcnJhZ2Ugb2YgZGF0YSBoYXMgYmVlbiBzZW50IGZyb20gc2VydmVyCiAgICAgICAgdXBsaW5rLnRvcG9TdGFydERvbmUoKTsKICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBmdW5jdGlvbiBub2RlQnlJZChpZCkgewogICAgICAgIHJldHVybiBsdVtpZF07CiAgICB9CgogICAgZnVuY3Rpb24gbWFrZU5vZGVLZXkobm9kZTEsIG5vZGUyKSB7CiAgICAgICAgcmV0dXJuIG5vZGUxICsgJy0nICsgbm9kZTI7CiAgICB9CgogICAgZnVuY3Rpb24gZmluZE5vZGVQYWlyKGtleSwga2V5UmV2KSB7CiAgICAgICAgaWYgKG5ldHdvcmsubGlua3NCeURldmljZVtrZXldKSB7CiAgICAgICAgICAgIHJldHVybiBrZXk7CiAgICAgICAgfSBlbHNlIGlmIChuZXR3b3JrLmxpbmtzQnlEZXZpY2Vba2V5UmV2XSkgewogICAgICAgICAgICByZXR1cm4ga2V5UmV2OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gYWdncmVnYXRlTGluayhsZGF0YSwgbGluaykgewogICAgICAgIHZhciBrZXkgPSBtYWtlTm9kZUtleShsaW5rLnNyYywgbGluay5kc3QpLAogICAgICAgICAgICBrZXlSZXYgPSBtYWtlTm9kZUtleShsaW5rLmRzdCwgbGluay5zcmMpLAogICAgICAgICAgICBmb3VuZCA9IGZpbmROb2RlUGFpcihrZXksIGtleVJldik7CgogICAgICAgIGlmIChmb3VuZCkgewogICAgICAgICAgICBuZXR3b3JrLmxpbmtzQnlEZXZpY2VbZm91bmRdLnB1c2gobGRhdGEpOwogICAgICAgICAgICBsZGF0YS5kZXZpY2VQYWlyID0gZm91bmQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbmV0d29yay5saW5rc0J5RGV2aWNlW2tleV0gPSBbIGxkYXRhIF07CiAgICAgICAgICAgIGxkYXRhLmRldmljZVBhaXIgPSBrZXk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGFkZExpbmtVcGRhdGUobGRhdGEsIGxpbmspIHsKICAgICAgICAvLyBhZGQgbGluayBldmVudCwgYnV0IHdlIGFscmVhZHkgaGF2ZSB0aGUgcmV2ZXJzZSBsaW5rIGluc3RhbGxlZAogICAgICAgIGxkYXRhLmZyb21UYXJnZXQgPSBsaW5rOwogICAgICAgIHJsa1tsaW5rLmlkXSA9IGxkYXRhLmtleTsKICAgICAgICAvLyBwb3NzaWJsZSBzb2x1dGlvbiB0byBlbCBiZWluZyB1bmRlZmluZWQgaW4gcmVzdHlsZUxpbmtFbGVtZW50OgogICAgICAgIC8vX3VwZGF0ZUxpbmtzKCk7CiAgICAgICAgcmVzdHlsZUxpbmtFbGVtZW50KGxkYXRhKTsKICAgIH0KCgogICAgdmFyIHdpZHRoUmF0aW8gPSAxLjQsCiAgICAgICAgbGlua1NjYWxlID0gZDMuc2NhbGUubGluZWFyKCkKICAgICAgICAgICAgLmRvbWFpbihbMSwgMTJdKQogICAgICAgICAgICAucmFuZ2UoW3dpZHRoUmF0aW8sIDEyICogd2lkdGhSYXRpb10pCiAgICAgICAgICAgIC5jbGFtcCh0cnVlKSwKICAgICAgICBhbGxMaW5rVHlwZXMgPSAnZGlyZWN0IGluZGlyZWN0IG9wdGljYWwgdHVubmVsJywKICAgICAgICBhbGxMaW5rU3ViVHlwZXMgPSAnaW5hY3RpdmUgbm90LXBlcm1pdHRlZCc7CgogICAgZnVuY3Rpb24gcmVzdHlsZUxpbmtFbGVtZW50KGxkYXRhLCBpbW1lZGlhdGUpIHsKICAgICAgICAvLyB0aGlzIGZuJ3Mgam9iIGlzIHRvIGxvb2sgYXQgcmF3IGxpbmtzIGFuZCBkZWNpZGUgd2hhdCBzdmcgY2xhc3NlcwogICAgICAgIC8vIG5lZWQgdG8gYmUgYXBwbGllZCB0byB0aGUgbGluZSBlbGVtZW50IGluIHRoZSBET00KICAgICAgICB2YXIgdGggPSB0cy50aGVtZSgpLAogICAgICAgICAgICBlbCA9IGxkYXRhLmVsLAogICAgICAgICAgICB0eXBlID0gbGRhdGEudHlwZSgpLAogICAgICAgICAgICBsdyA9IGxkYXRhLmxpbmtXaWR0aCgpLAogICAgICAgICAgICBvbmxpbmUgPSBsZGF0YS5vbmxpbmUoKSwKICAgICAgICAgICAgbW9kZUNscyA9IGxkYXRhLmV4cGVjdGVkKCkgPyAnaW5hY3RpdmUnIDogJ25vdC1wZXJtaXR0ZWQnLAogICAgICAgICAgICBkZWxheSA9IGltbWVkaWF0ZSA/IDAgOiAxMDAwOwoKICAgICAgICAvLyBGSVhNRTogdW5kZXJzdGFuZCB3aHkgZWwgaXMgc29tZXRpbWVzIHVuZGVmaW5lZCBvbiBhZGRMaW5rIGV2ZW50cy4uLgogICAgICAgIC8vIEludmVzdGlnYXRlZDoKICAgICAgICAvLyBlbCBpcyB1bmRlZmluZWQgd2hlbiBpdCdzIGEgcmV2ZXJzZSBsaW5rIHRoYXQgaXMgYmVpbmcgYWRkZWQuCiAgICAgICAgLy8gdXBkYXRlTGlua3MgKHdoaWNoIHNldHMgbGRhdGEuZWwpIGlzbid0IGNhbGxlZCBiZWZvcmUgdGhpcyBpcyBjYWxsZWQuCiAgICAgICAgLy8gQ2FsbGluZyBfdXBkYXRlTGlua3MgaW4gYWRkTGlua1VwZGF0ZSBmaXhlcyBpdCwgYnV0IHRoZXJlIG1pZ2h0IGJlCiAgICAgICAgLy8gYSBtb3JlIGVmZmljaWVudCB3YXkgdG8gZml4IGl0LgogICAgICAgIGlmIChlbCAmJiAhZWwuZW1wdHkoKSkgewogICAgICAgICAgICBlbC5jbGFzc2VkKCdsaW5rJywgdHJ1ZSk7CiAgICAgICAgICAgIGVsLmNsYXNzZWQoYWxsTGlua1N1YlR5cGVzLCBmYWxzZSk7CiAgICAgICAgICAgIGVsLmNsYXNzZWQobW9kZUNscywgIW9ubGluZSk7CiAgICAgICAgICAgIGVsLmNsYXNzZWQoYWxsTGlua1R5cGVzLCBmYWxzZSk7CiAgICAgICAgICAgIGlmICh0eXBlKSB7CiAgICAgICAgICAgICAgICBlbC5jbGFzc2VkKHR5cGUsIHRydWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsLnRyYW5zaXRpb24oKQogICAgICAgICAgICAgICAgLmR1cmF0aW9uKGRlbGF5KQogICAgICAgICAgICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIGxpbmtTY2FsZShsdykpCiAgICAgICAgICAgICAgICAuYXR0cignc3Ryb2tlJywgbGlua0NvbmZpZ1t0aF0uYmFzZUNvbG9yKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gcmVtb3ZlTGlua0VsZW1lbnQoZCkgewogICAgICAgIHZhciBpZHggPSBmcy5maW5kKGQua2V5LCBuZXR3b3JrLmxpbmtzLCAna2V5JyksCiAgICAgICAgICAgIHJlbW92ZWQ7CiAgICAgICAgaWYgKGlkeCA+PTApIHsKICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gbGlua3MgYXJyYXkKICAgICAgICAgICAgcmVtb3ZlZCA9IG5ldHdvcmsubGlua3Muc3BsaWNlKGlkeCwgMSk7CiAgICAgICAgICAgIC8vIHJlbW92ZSBmcm9tIGxvb2t1cCBjYWNoZQogICAgICAgICAgICBkZWxldGUgbHVbcmVtb3ZlZFswXS5rZXldOwogICAgICAgICAgICB1cGRhdGVMaW5rcygpOwogICAgICAgICAgICBmUmVzdW1lKCk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHJlbW92ZUhvc3RFbGVtZW50KGQsIHVwZCkgewogICAgICAgIC8vIGZpcnN0LCByZW1vdmUgYXNzb2NpYXRlZCBob3N0TGluay4uLgogICAgICAgIHJlbW92ZUxpbmtFbGVtZW50KGQubGlua0RhdGEpOwoKICAgICAgICAvLyByZW1vdmUgaG9zdExpbmsgYmluZGluZ3MKICAgICAgICBkZWxldGUgbHVbZC5pbmdyZXNzXTsKICAgICAgICBkZWxldGUgbHVbZC5lZ3Jlc3NdOwoKICAgICAgICAvLyByZW1vdmUgZnJvbSBsb29rdXAgY2FjaGUKICAgICAgICBkZWxldGUgbHVbZC5pZF07CiAgICAgICAgLy8gcmVtb3ZlIGZyb20gbm9kZXMgYXJyYXkKICAgICAgICB2YXIgaWR4ID0gZnMuZmluZChkLmlkLCBuZXR3b3JrLm5vZGVzKTsKICAgICAgICBuZXR3b3JrLm5vZGVzLnNwbGljZShpZHgsIDEpOwoKICAgICAgICAvLyByZW1vdmUgZnJvbSBTVkcKICAgICAgICAvLyBOT1RFOiB1cGQgaXMgZmFsc2UgaWYgd2Ugd2VyZSBjYWxsZWQgZnJvbSByZW1vdmVEZXZpY2VFbGVtZW50KCkKICAgICAgICBpZiAodXBkKSB7CiAgICAgICAgICAgIHVwZGF0ZU5vZGVzKCk7CiAgICAgICAgICAgIGZSZXN1bWUoKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gcmVtb3ZlRGV2aWNlRWxlbWVudChkKSB7CiAgICAgICAgdmFyIGlkID0gZC5pZCwKICAgICAgICAgICAgaWR4OwogICAgICAgIC8vIGZpcnN0LCByZW1vdmUgYXNzb2NpYXRlZCBob3N0cyBhbmQgbGlua3MuLgogICAgICAgIHRtcy5maW5kQXR0YWNoZWRIb3N0cyhpZCkuZm9yRWFjaChyZW1vdmVIb3N0RWxlbWVudCk7CiAgICAgICAgdG1zLmZpbmRBdHRhY2hlZExpbmtzKGlkKS5mb3JFYWNoKHJlbW92ZUxpbmtFbGVtZW50KTsKCiAgICAgICAgLy8gcmVtb3ZlIGZyb20gbG9va3VwIGNhY2hlCiAgICAgICAgZGVsZXRlIGx1W2lkXTsKICAgICAgICAvLyByZW1vdmUgZnJvbSBub2RlcyBhcnJheQogICAgICAgIGlkeCA9IGZzLmZpbmQoaWQsIG5ldHdvcmsubm9kZXMpOwogICAgICAgIGlmIChpZHggPiAtMSkgewogICAgICAgICAgICBuZXR3b3JrLm5vZGVzLnNwbGljZShpZHgsIDEpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFuZXR3b3JrLm5vZGVzLmxlbmd0aCkgewogICAgICAgICAgICB1cGxpbmsuc2hvd05vRGV2cyh0cnVlKTsKICAgICAgICB9CgogICAgICAgIC8vIHJlbW92ZSBmcm9tIFNWRwogICAgICAgIHVwZGF0ZU5vZGVzKCk7CiAgICAgICAgZlJlc3VtZSgpOwogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZUhvc3RWaXNpYmlsaXR5KCkgewogICAgICAgIHN1cy52aXNpYmxlKG5vZGVHLnNlbGVjdEFsbCgnLmhvc3QnKSwgc2hvd0hvc3RzKTsKICAgICAgICBzdXMudmlzaWJsZShsaW5rRy5zZWxlY3RBbGwoJy5ob3N0TGluaycpLCBzaG93SG9zdHMpOwogICAgICAgIHN1cy52aXNpYmxlKGxpbmtMYWJlbEcuc2VsZWN0QWxsKCcuaG9zdExpbmtMYWJlbCcpLCBzaG93SG9zdHMpOwogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZU9mZmxpbmVWaXNpYmlsaXR5KGRldikgewogICAgICAgIGZ1bmN0aW9uIHVwZERldihkLCBzaG93KSB7CiAgICAgICAgICAgIHZhciBiOwogICAgICAgICAgICBzdXMudmlzaWJsZShkLmVsLCBzaG93KTsKCiAgICAgICAgICAgIHRtcy5maW5kQXR0YWNoZWRMaW5rcyhkLmlkKS5mb3JFYWNoKGZ1bmN0aW9uIChsaW5rKSB7CiAgICAgICAgICAgICAgICBiID0gc2hvdyAmJiAoKGxpbmsudHlwZSgpICE9PSAnaG9zdExpbmsnKSB8fCBzaG93SG9zdHMpOwogICAgICAgICAgICAgICAgc3VzLnZpc2libGUobGluay5lbCwgYik7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0bXMuZmluZEF0dGFjaGVkSG9zdHMoZC5pZCkuZm9yRWFjaChmdW5jdGlvbiAoaG9zdCkgewogICAgICAgICAgICAgICAgYiA9IHNob3cgJiYgc2hvd0hvc3RzOwogICAgICAgICAgICAgICAgc3VzLnZpc2libGUoaG9zdC5lbCwgYik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgaWYgKGRldikgewogICAgICAgICAgICAvLyB1cGRhdGluZyBhIHNwZWNpZmljIGRldmljZSB0aGF0IGp1c3QgdG9nZ2xlZCBvZmYvb24tbGluZQogICAgICAgICAgICB1cGREZXYoZGV2LCBkZXYub25saW5lIHx8IHNob3dPZmZsaW5lKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyB1cGRhdGluZyBhbGwgb2ZmbGluZSBkZXZpY2VzCiAgICAgICAgICAgIHRtcy5maW5kRGV2aWNlcyh0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICB1cGREZXYoZCwgc2hvd09mZmxpbmUpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CgoKICAgIGZ1bmN0aW9uIHNlbmRVcGRhdGVNZXRhKGQsIGNsZWFyUG9zKSB7CiAgICAgICAgdmFyIG1ldGFVaSA9IHt9LAogICAgICAgICAgICBsbDsKCiAgICAgICAgLy8gaWYgd2UgYXJlIG5vdCBjbGVhcmluZyB0aGUgcG9zaXRpb24gZGF0YSAodW5waW5uaW5nKSwKICAgICAgICAvLyBhdHRhY2ggdGhlIHgsIHksIChhbmQgZXF1aXZhbGVudCBsb25naXR1ZGUsIGxhdGl0dWRlKS4uLgogICAgICAgIGlmICghY2xlYXJQb3MpIHsKICAgICAgICAgICAgbGwgPSB0bXMubG5nTGF0RnJvbUNvb3JkKFtkLngsIGQueV0pOwogICAgICAgICAgICBtZXRhVWkgPSB7CiAgICAgICAgICAgICAgICB4OiBkLngsCiAgICAgICAgICAgICAgICB5OiBkLnksCiAgICAgICAgICAgICAgICBlcXVpdkxvYzogewogICAgICAgICAgICAgICAgICAgIGxuZzogbGxbMF0sCiAgICAgICAgICAgICAgICAgICAgbGF0OiBsbFsxXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBkLm1ldGFVaSA9IG1ldGFVaTsKICAgICAgICB3c3Muc2VuZEV2ZW50KCd1cGRhdGVNZXRhJywgewogICAgICAgICAgICBpZDogZC5pZCwKICAgICAgICAgICAgY2xhc3M6IGQuY2xhc3MsCiAgICAgICAgICAgIG1lbWVudG86IG1ldGFVaQogICAgICAgIH0pOwogICAgfQoKCiAgICBmdW5jdGlvbiBta1N2Z0NsYXNzKGQpIHsKICAgICAgICByZXR1cm4gZC5maXhlZCA/IGQuc3ZnQ2xhc3MgKyAnIGZpeGVkJyA6IGQuc3ZnQ2xhc3M7CiAgICB9CgogICAgZnVuY3Rpb24gdmlzKGIpIHsKICAgICAgICByZXR1cm4gYiA/ICd2aXNpYmxlJyA6ICdoaWRkZW4nOwogICAgfQoKICAgIGZ1bmN0aW9uIHRvZ2dsZUhvc3RzKHgpIHsKICAgICAgICB2YXIga2V2ID0gKHggPT09ICdrZXlldicpLAogICAgICAgICAgICBvbiA9IGtldiA/ICFzaG93SG9zdHMgOiAhIXg7CgogICAgICAgIHNob3dIb3N0cyA9IG9uOwogICAgICAgIHVwZGF0ZUhvc3RWaXNpYmlsaXR5KCk7CiAgICAgICAgZmxhc2guZmxhc2goJ0hvc3RzICcgKyB2aXMob24pKTsKICAgICAgICByZXR1cm4gb247CiAgICB9CgogICAgZnVuY3Rpb24gdG9nZ2xlT2ZmbGluZSh4KSB7CiAgICAgICAgdmFyIGtldiA9ICh4ID09PSAna2V5ZXYnKSwKICAgICAgICAgICAgb24gPSBrZXYgPyAhc2hvd09mZmxpbmUgOiAhIXg7CgogICAgICAgIHNob3dPZmZsaW5lID0gb247CiAgICAgICAgdXBkYXRlT2ZmbGluZVZpc2liaWxpdHkoKTsKICAgICAgICBmbGFzaC5mbGFzaCgnT2ZmbGluZSBkZXZpY2VzICcgKyB2aXMob24pKTsKICAgICAgICByZXR1cm4gb247CiAgICB9CgogICAgZnVuY3Rpb24gY3ljbGVEZXZpY2VMYWJlbHMoKSB7CiAgICAgICAgZmxhc2guZmxhc2godGQzLmluY0RldkxhYkluZGV4KCkpOwogICAgICAgIHRtcy5maW5kRGV2aWNlcygpLmZvckVhY2goZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgdGQzLnVwZGF0ZURldmljZUxhYmVsKGQpOwogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIHVucGluKCkgewogICAgICAgIHZhciBob3YgPSB0c3MuaG92ZXJlZCgpOwogICAgICAgIGlmIChob3YpIHsKICAgICAgICAgICAgc2VuZFVwZGF0ZU1ldGEoaG92LCB0cnVlKTsKICAgICAgICAgICAgaG92LmZpeGVkID0gZmFsc2U7CiAgICAgICAgICAgIGhvdi5lbC5jbGFzjvHvVqLHAQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANN28QABABs0gwKgHNsCoB2CW0R/1jJfpDFqWQdGAEAVtCxEAAAEBCAoAt+K7AGIpsY7x71axxwEA0jgAANI4AABo9ygf0sUIACetHhMIAEUAOMTMzkAAQAalfsCoB2DAqAc2H/WW0VqWQdGMl+kMgBADjMidAAABAQgKAGIpsQC34rtzZWQoJ2ZpeGVkJywgZmFsc2UpOwogICAgICAgICAgICBmUmVzdW1lKCk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHNob3dNYXN0ZXJzaGlwKG1hc3RlcklkKSB7CiAgICAgICAgaWYgKCFtYXN0ZXJJZCkgewogICAgICAgICAgICByZXN0b3JlTGF5ZXJTdGF0ZSgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNob3dNYXN0ZXJzaGlwRm9yKG1hc3RlcklkKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gcmVzdG9yZUxheWVyU3RhdGUoKSB7CiAgICAgICAgLy8gTk9URTogdGhpcyBsZXZlbCBvZiBpbmRpcmVjdGlvbiByZXF1aXJlZCwgZm9yIHdoZW4gd2UgaGF2ZQogICAgICAgIC8vICAgICAgICAgIHRoZSBsYXllciBmaWx0ZXIgZnVuY3Rpb25hbGl0eSByZS1pbXBsZW1lbnRlZAogICAgICAgIHN1cHByZXNzTGF5ZXJzKGZhbHNlKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzaG93TWFzdGVyc2hpcEZvcihpZCkgewogICAgICAgIHN1cHByZXNzTGF5ZXJzKHRydWUpOwogICAgICAgIG5vZGUuZWFjaChmdW5jdGlvbiAobikgewogICAgICAgICAgICBpZiAobi5tYXN0ZXIgPT09IGlkKSB7CiAgICAgICAgICAgICAgICBuLmVsLmNsYXNzZWQoJ3N1cHByZXNzZWRtYXgnLCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBzdXBBbXQobGVzcykgewogICAgICAgIHJldHVybiBsZXNzID8gInN1cHByZXNzZWQiIDogInN1cHByZXNzZWRtYXgiOwogICAgfQoKICAgIGZ1bmN0aW9uIHN1cHByZXNzTGF5ZXJzKGIsIGxlc3MpIHsKICAgICAgICB2YXIgY2xzID0gc3VwQW10KGxlc3MpOwogICAgICAgIG5vZGUuY2xhc3NlZChjbHMsIGIpOwogICAgICAgIGxpbmsuY2xhc3NlZChjbHMsIGIpOwogICAgfQoKICAgIGZ1bmN0aW9uIHVuc3VwcHJlc3NOb2RlKGlkLCBsZXNzKSB7CiAgICAgICAgdmFyIGNscyA9IHN1cEFtdChsZXNzKTsKICAgICAgICBub2RlLmVhY2goZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgaWYgKG4uaWQgPT09IGlkKSB7CiAgICAgICAgICAgICAgICBuLmVsLmNsYXNzZWQoY2xzLCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiB1bnN1cHByZXNzTGluayhrZXksIGxlc3MpIHsKICAgICAgICB2YXIgY2xzID0gc3VwQW10KGxlc3MpOwogICAgICAgIGxpbmsuZWFjaChmdW5jdGlvbiAobikgewogICAgICAgICAgICBpZiAobi5rZXkgPT09IGtleSkgewogICAgICAgICAgICAgICAgbi5lbC5jbGFzc2VkKGNscywgZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gc2hvd0JhZExpbmtzKCkgewogICAgICAgIHZhciBiYWRMaW5rcyA9IHRtcy5maW5kQmFkTGlua3MoKTsKICAgICAgICBmbGFzaC5mbGFzaCgnQmFkIExpbmtzOiAnICsgYmFkTGlua3MubGVuZ3RoKTsKICAgICAgICAkbG9nLmRlYnVnKCdCYWQgTGluayBMaXN0ICgnICsgYmFkTGlua3MubGVuZ3RoICsgJyk6Jyk7CiAgICAgICAgYmFkTGlua3MuZm9yRWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAkbG9nLmRlYnVnKCdiYWQgbGluazogKCcgKyBkLmJhZCArICcpICcgKyBkLmtleSwgZCk7CiAgICAgICAgICAgIGlmIChkLmVsKSB7CiAgICAgICAgICAgICAgICBkLmVsLmF0dHIoJ3N0cm9rZS13aWR0aCcsIGxpbmtTY2FsZSgyLjgpKQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCdzdHJva2UnLCAncmVkJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICAvLyBiYWNrIHRvIG5vcm1hbCBhZnRlciAyIHNlY29uZHMuLi4KICAgICAgICAkdGltZW91dCh1cGRhdGVMaW5rcywgMjAwMCk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVzZXRBbGxMb2NhdGlvbnMoKSB7CiAgICAgICAgdG1zLnJlc2V0QWxsTG9jYXRpb25zKCk7CiAgICAgICAgdXBkYXRlTm9kZXMoKTsKICAgICAgICB0aWNrKCk7IC8vIGZvcmNlIG5vZGVzIHRvIGJlIHJlZHJhd24gaW4gdGhlaXIgbmV3IGxvY2F0aW9ucwogICAgICAgIGZsYXNoLmZsYXNoKCdSZXNldCBOb2RlIExvY2F0aW9ucycpOwogICAgfQoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIGZ1bmN0aW9uIHVwZGF0ZU5vZGVzKCkgewogICAgICAgIGlmIChmTm9kZXNUaW1lcikgewogICAgICAgICAgICAkdGltZW91dC5jYW5jZWwoZk5vZGVzVGltZXIpOwogICAgICAgIH0KICAgICAgICBmTm9kZXNUaW1lciA9ICR0aW1lb3V0KF91cGRhdGVOb2RlcywgMTUwKTsKICAgIH0KCiAgICAvLyBJTVBMRU1FTlRBVElPTiBOT1RFOiBfdXBkYXRlTm9kZXMoKSBzaG91bGQgTk9UIHN0b3AsIHN0YXJ0LCBvciByZXN1bWUKICAgIC8vICB0aGUgZm9yY2UgbGF5b3V0OyB0aGF0IG5lZWRzIHRvIGJlIGRldGVybWluZWQgYW5kIGltcGxlbWVudGVkIGVsc2V3aGVyZQogICAgZnVuY3Rpb24gX3VwZGF0ZU5vZGVzKCkgewogICAgICAgIC8vIHNlbGVjdCBhbGwgdGhlIG5vZGVzIGluIHRoZSBsYXlvdXQ6CiAgICAgICAgbm9kZSA9IG5vZGVHLnNlbGVjdEFsbCgnLm5vZGUnKQogICAgICAgICAgICAuZGF0YShuZXR3b3JrLm5vZGVzLCBmdW5jdGlvbiAoZCkgeyByZXR1cm4gZC5pZDsgfSk7CgogICAgICAgIC8vIG9wZXJhdGUgb24gZXhpc3Rpbmcgbm9kZXM6CiAgICAgICAgbm9kZS5maWx0ZXIoJy5kZXZpY2UnKS5lYWNoKHRkMy5kZXZpY2VFeGlzdGluZyk7CiAgICAgICAgbm9kZS5maWx0ZXIoJy5ob3N0JykuZWFjaCh0ZDMuaG9zdEV4aXN0aW5nKTsKCiAgICAgICAgLy8gb3BlcmF0ZSBvbiBlbnRlcmluZyBub2RlczoKICAgICAgICB2YXIgZW50ZXJpbmcgPSBub2RlLmVudGVyKCkKICAgICAgICAgICAgLmFwcGVuZCgnZycpCiAgICAgICAgICAgIC5hdHRyKHsKICAgICAgICAgICAgICAgIGlkOiBmdW5jdGlvbiAoZCkgeyByZXR1cm4gc3VzLnNhZmVJZChkLmlkKTsgfSwKICAgICAgICAgICAgICAgIGNsYXNzOiBta1N2Z0NsYXNzLAogICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gZ3VhcmQgYWdhaW5zdCBOYU4gaGVyZSA/PwogICAgICAgICAgICAgICAgICAgIHJldHVybiBzdXMudHJhbnNsYXRlKGQueCwgZC55KTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBvcGFjaXR5OiAwCiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIC5jYWxsKGRyYWcpCiAgICAgICAgICAgIC5vbignbW91c2VvdmVyJywgdHNzLm5vZGVNb3VzZU92ZXIpCiAgICAgICAgICAgIC5vbignbW91c2VvdXQnLCB0c3Mubm9kZU1vdXNlT3V0KQogICAgICAgICAgICAudHJhbnNpdGlvbigpCiAgICAgICAgICAgIC5hdHRyKCdvcGFjaXR5JywgMSk7CgogICAgICAgIC8vIGF1Z21lbnQgZW50ZXJpbmcgbm9kZXM6CiAgICAgICAgZW50ZXJpbmcuZmlsdGVyKCcuZGV2aWNlJykuZWFjaCh0ZDMuZGV2aWNlRW50ZXIpOwogICAgICAgIGVudGVyaW5nLmZpbHRlcignLmhvc3QnKS5lYWNoKHRkMy5ob3N0RW50ZXIpOwoKICAgICAgICAvLyBvcGVyYXRlIG9uIGJvdGggZXhpc3RpbmcgYW5kIG5ldyBub2RlczoKICAgICAgICB0ZDMudXBkYXRlRGV2aWNlQ29sb3JzKCk7CgogICAgICAgIC8vIG9wZXJhdGUgb24gZXhpdGluZyBub2RlczoKICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIG5vZGUgaXMgcmVtb3ZlZCBhZnRlciAyIHNlY29uZHMuCiAgICAgICAgLy8gU3ViIGVsZW1lbnQgYW5pbWF0aW9ucyBzaG91bGQgYmUgc2hvcnRlciB0aGFuIDIgc2Vjb25kcy4KICAgICAgICB2YXIgZXhpdGluZyA9IG5vZGUuZXhpdCgpCiAgICAgICAgICAgIC50cmFuc2l0aW9uKCkKICAgICAgICAgICAgLmR1cmF0aW9uKDIwMDApCiAgICAgICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDApCiAgICAgICAgICAgIC5yZW1vdmUoKTsKCiAgICAgICAgLy8gZXhpdGluZyBub2RlIHNwZWNpZmljczoKICAgICAgICBleGl0aW5nLmZpbHRlcignLmhvc3QnKS5lYWNoKHRkMy5ob3N0RXhpdCk7CiAgICAgICAgZXhpdGluZy5maWx0ZXIoJy5kZXZpY2UnKS5lYWNoKHRkMy5kZXZpY2VFeGl0KTsKICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIGZ1bmN0aW9uIGdldERlZmF1bHRQb3MobGluaykgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHgxOiBsaW5rLnNvdXJjZS54LAogICAgICAgICAgICB5MTogbGluay5zb3VyY2UueSwKICAgICAgICAgICAgeDI6IGxpbmsudGFyZ2V0LngsCiAgICAgICAgICAgIHkyOiBsaW5rLnRhcmdldC55CiAgICAgICAgfTsKICAgIH0KCiAgICAvLyByZXR1cm5zIGFtb3VudCBvZiBhZGp1c3RtZW50IGFsb25nIHRoZSBub3JtYWwgZm9yIGdpdmVuIGxpbmsKICAgIGZ1bmN0aW9uIGFtdChudW1MaW5rcywgbGlua0lkeCkgewogICAgICAgIHZhciBnYXAgPSA2OwogICAgICAgIHJldHVybiAobGlua0lkeCAtICgobnVtTGlua3MgLSAxKSAvIDIpKSAqIGdhcDsKICAgIH0KCiAgICBmdW5jdGlvbiBjYWxjTW92ZW1lbnQoZCwgYW10LCBmbGlwcGVkKSB7CiAgICAgICAgdmFyIHBvcyA9IGdldERlZmF1bHRQb3MoZCksCiAgICAgICAgICAgIG11bHQgPSBmbGlwcGVkID8gLWFtdCA6IGFtdCwKICAgICAgICAgICAgZHggPSBwb3MueDIgLSBwb3MueDEsCiAgICAgICAgICAgIGR5ID0gcG9zLnkyIC0gcG9zLnkxLAogICAgICAgICAgICBsZW5ndGggPSBNYXRoLnNxcnQoKGR4ICogZHgpICsgKGR5ICogZHkpKTsKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgeDE6IHBvcy54MSArIChtdWx0ICogZHkgLyBsZW5ndGgpLAogICAgICAgICAgICB5MTogcG9zLnkxICsgKG11bHQgKiAtZHggLyBsZW5ndGgpLAogICAgICAgICAgICB4MjogcG9zLngyICsgKG11bHQgKiBkeSAvIGxlbmd0aCksCiAgICAgICAgICAgIHkyOiBwb3MueTIgKyAobXVsdCAqIC1keCAvIGxlbmd0aCkKICAgICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGNhbGNQb3NpdGlvbigpIHsKICAgICAgICB2YXIgbGluZXMgPSB0aGlzLAogICAgICAgICAgICBsaW5rU3JjSWQ7CiAgICAgICAgbGlua051bXMgPSBbXTsKICAgICAgICBsaW5lcy5lYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIGlmIChkLnR5cGUoKSA9PT0gJ2hvc3RMaW5rJykgewogICAgICAgICAgICAgICAgZC5wb3NpdGlvbiA9IGdldERlZmF1bHRQb3MoZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgZnVuY3Rpb24gbm9ybWFsaXplTGlua1NyYyhsaW5rKSB7CiAgICAgICAgICAgIC8vIGVuc3VyZSBzb3VyY2UgZGV2aWNlIGlzIGNvbnNpc3RlbnQgYWNyb3NzIHNldCBvZiBsaW5rcwogICAgICAgICAgICAvLyB0ZW1wb3JhcnkgbWVhc3VyZSB1bnRpbCBsaW5rIG1vZGVsaW5nIGlzIHJlZmFjdG9yZWQKICAgICAgICAgICAgaWYgKCFsaW5rU3JjSWQpIHsKICAgICAgICAgICAgICAgIGxpbmtTcmNJZCA9IGxpbmsuc291cmNlLmlkOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbGluay5zb3VyY2UuaWQgIT09IGxpbmtTcmNJZDsKICAgICAgICB9CgogICAgICAgIGFuZ3VsYXIuZm9yRWFjaChuZXR3b3JrLmxpbmtzQnlEZXZpY2UsIGZ1bmN0aW9uIChsaW5rQXJyLCBrZXkpIHsKICAgICAgICAgICAgdmFyIG51bUxpbmtzID0gbGlua0Fyci5sZW5ndGgsCiAgICAgICAgICAgICAgICBsaW5rOwoKICAgICAgICAgICAgaWYgKG51bUxpbmtzID09PSAxKSB7CiAgICAgICAgICAgICAgICBsaW5rID0gbGlua0FyclswXTsKICAgICAgICAgICAgICAgIGxpbmsucG9zaXRpb24gPSBnZXREZWZhdWx0UG9zKGxpbmspOwogICAgICAgICAgICAgICAgbGluay5wb3NpdGlvbi5tdWx0aUxpbmsgPSBmYWxzZTsKICAgICAgICAgICAgfSBlbHNlIGlmIChudW1MaW5rcyA+PSA1KSB7CiAgICAgICAgICAgICAgICAvLyB0aGlzIGNvZGUgaXMgaW5lZmZpY2llbnQsIGluIHRoZSBmdXR1cmUgdGhlIHdheSBsaW5rcwogICAgICAgICAgICAgICAgLy8gYXJlIG1vZGVsZWQgd2lsbCBiZSBjaGFuZ2VkCiAgICAgICAgICAgICAgICBhbmd1bGFyLmZvckVhY2gobGlua0FyciwgZnVuY3Rpb24gKGxpbmspIHsKICAgICAgICAgICAgICAgICAgICBsaW5rLnBvc2l0aW9uID0gZ2V0RGVmYXVsdFBvcyhsaW5rKTsKICAgICAgICAgICAgICAgICAgICBsaW5rLnBvc2l0aW9uLm11bHRpTGluayA9IHRydWU7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGxpbmtOdW1zLnB1c2goewogICAgICAgICAgICAgICAgICAgIGlkOiBrZXksCiAgICAgICAgICAgICAgICAgICAgbnVtOiBudW1MaW5rcywKICAgICAgICAgICAgICAgICAgICBsaW5rQ29vcmRzOiBsaW5rQXJyWzBdLnBvc2l0aW9uCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGxpbmtTcmNJZCA9IG51bGw7CiAgICAgICAgICAgICAgICBhbmd1bGFyLmZvckVhY2gobGlua0FyciwgZnVuY3Rpb24gKGxpbmssIGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9mZnNldEFtdCA9IGFtdChudW1MaW5rcywgaW5kZXgpLAogICAgICAgICAgICAgICAgICAgICAgICBuZWVkVG9GbGlwID0gbm9ybWFsaXplTGlua1NyYyhsaW5rKTsKICAgICAgICAgICAgICAgICAgICBsaW5rLnBvc2l0aW9uID0gY2FsY01vdmVtZW50KGxpbmssIG9mZnNldEFtdCwgbmVlZFRvRmxpcCk7CiAgICAgICAgICAgICAgICAgICAgbGluay5wb3NpdGlvbi5tdWx0aUxpbmsgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gdXBkYXRlTGlua3MoKSB7CiAgICAgICAgaWYgKGZMaW5rc1RpbWVyKSB7CiAgICAgICAgICAgICR0aW1lb3V0LmNhbmNlbChmTGlua3NUaW1lcik7CiAgICAgICAgfQogICAgICAgIGZMaW5rc1RpbWVyID0gJHRpbWVvdXQoX3VwZGF0ZUxpbmtzLCAxNTApOwogICAgfQoKICAgIC8vIElNUExFTUVOVEFUSU9OIE5PVEU6IF91cGRhdGVMaW5rcygpIHNob3VsZCBOT1Qgc3RvcCwgc3RhcnQsIG9yIHJlc3VtZQogICAgLy8gIHRoZSBmb3JjZSBsYXlvdXQ7IHRoYXQgbmVlZHMgdG8gYmUgZGV0ZXJtaW5lZCBhbmQgaW1wbGVtZW50ZWQgZWxzZXdoZXJlCiAgICBmdW5jdGlvbiBfdXBkYXRlTGlua3MoKSB7CiAgICAgICAgdmFyIHRoID0gdHMudGhlbWUoKTsKCiAgICAgICAgbGluayA9IGxpbmtHLnNlbGVjdEFsbCgnLmxpbmsnKQogICAgICAgICAgICAuZGF0YShuZXR3b3JrLmxpbmtzLCBmdW5jdGlvbiAoZCkgeyByZXR1cm4gZC5rZXk7IH0pOwoKICAgICAgICAvLyBvcGVyYXRlIG9uIGV4aXN0aW5nIGxpbmtzOgogICAgICAgIGxpbmsuZWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAvLyB0aGlzIGlzIHN1cHBvc2VkIHRvIGJlIGFuIGV4aXN0aW5nIGxpbmssIGJ1dCB3ZSBoYXZlIG9ic2VydmVkCiAgICAgICAgICAgIC8vICBvY2Nhc2lvbnMgKHdoZXJlIGxpbmtzIGFyZSBkZWxldGVkIGFuZCBhZGRlZCByYXBpZGx5Pykgd2hlcmUKICAgICAgICAgICAgLy8gIHRoZSBET00gZWxlbWVudCBoYXMgbm90IGJlZW4gZGVmaW5lZC4gU28gcHJvdGVjdCBhZ2FpbnN0IHRoYXQuLi4KICAgICAgICAgICAgaWYgKGQuZWwpIHsKICAgICAgICAgICAgICAgIHJlc3R5bGVMaW5rRWxlbWVudChkLCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICAvLyBvcGVyYXRlIG9uIGVudGVyaW5nIGxpbmtzOgogICAgICAgIHZhciBlbnRlcmluZyA9IGxpbmsuZW50ZXIoKQogICAgICAgICAgICAuYXBwZW5kKCdsaW5lJykKICAgICAgICAgICAgLmNhbGwoY2FsY1Bvc2l0aW9uKQogICAgICAgICAgICAuYXR0cih7CiAgICAgICAgICAgICAgICB4MTogZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGQucG9zaXRpb24ueDE7IH0sCiAgICAgICAgICAgICAgICB5MTogZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGQucG9zaXRpb24ueTE7IH0sCiAgICAgICAgICAgICAgICB4MjogZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGQucG9zaXRpb24ueDI7IH0sCiAgICAgICAgICAgICAgICB5MjogZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGQucG9zaXRpb24ueTI7IH0sCiAgICAgICAgICAgICAgICBzdHJva2U6IGxpbmtDb25maWdbdGhdLmluQ29sb3IsCiAgICAgICAgICAgICAgICAnc3Ryb2tlLXdpZHRoJzogbGlua0NvbmZpZy5pbldpZHRoCiAgICAgICAgICAgIH0pOwoKICAgICAgICAvLyBhdWdtZW50IGxpbmtzCiAgICAgICAgZW50ZXJpbmcuZWFjaCh0ZDMubGlua0VudGVyaW5nKTsKCiAgICAgICAgLy8gb3BlcmF0ZSBvbiBib3RoIGV4aXN0aW5nIGFuZCBuZXcgbGlua3M6CiAgICAgICAgLy9saW5rLmVhY2goLi4uKQoKICAgICAgICAvLyBhZGQgbGFiZWxzIGZvciBob3cgbWFueSBsaW5rcyBhcmUgaW4gYSB0aGljayBsaW5lCiAgICAgICAgdGQzLmFwcGx5TnVtTGlua0xhYmVscyhsaW5rTnVtcywgbnVtTGlua0xibHNHKTsKCiAgICAgICAgLy8gYXBwbHkgb3IgcmVtb3ZlIGxhYmVscwogICAgICAgIHRkMy5hcHBseUxpbmtMYWJlbHMoKTsKCiAgICAgICAgLy8gb3BlcmF0ZSBvbiBleGl0aW5nIGxpbmtzOgogICAgICAgIGxpbmsuZXhpdCgpCiAgICAgICAgICAgIC5hdHRyKCdzdHJva2UtZGFzaGFycmF5JywgJzMgMycpCiAgICAgICAgICAgIC5hdHRyKCdzdHJva2UnLCBsaW5rQ29uZmlnW3RoXS5vdXRDb2xvcikKICAgICAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMC41KQogICAgICAgICAgICAudHJhbnNpdGlvbigpCiAgICAgICAgICAgIC5kdXJhdGlvbigxNTAwKQogICAgICAgICAgICAuYXR0cih7CiAgICAgICAgICAgICAgICAnc3Ryb2tlLWRhc2hhcnJheSc6ICczIDEyJywKICAgICAgICAgICAgICAgICdzdHJva2Utd2lkdGgnOiBsaW5rQ29uZmlnLm91dFdpZHRoCiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDAuMCkKICAgICAgICAgICAgLnJlbW92ZSgpOwogICAgfQoKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gZm9yY2UgbGF5b3V0IHRpY2sgZnVuY3Rpb24KCiAgICBmdW5jdGlvbiBmUmVzdW1lKCkgewogICAgICAgIGlmICghdG9zLmlzT2JsaXF1ZSgpKSB7CiAgICAgICAgICAgIGZvcmNlLnJlc3VtZSgpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBmU3RhcnQoKSB7CiAgICAgICAgaWYgKCF0b3MuaXNPYmxpcXVlKCkpIHsKICAgICAgICAgICAgaWYgKGZUaW1lcikgewogICAgICAgICAgICAgICAgJHRpbWVvdXQuY2FuY2VsKGZUaW1lcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZlRpbWVyID0gJHRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgJGxvZy5kZWJ1ZygiU3RhcnRpbmcgZm9yY2UtbGF5b3V0Iik7CiAgICAgICAgICAgICAgICBmb3JjZS5zdGFydCgpOwogICAgICAgICAgICB9LCAyMDApOwogICAgICAgIH0KICAgIH0KCiAgICB2YXIgdGlja1N0dWZmID0gewogICAgICAgIG5vZGVBdHRyOiB7CiAgICAgICAgICAgIHRyYW5zZm9ybTogZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgIHZhciBkeCA9IGlzTmFOKGQueCkgPyAwIDogZC54LAogICAgICAgICAgICAgICAgICAgIGR5ID0gaXNOYU4oZC55KSA/IDAgOiBkLnk7CiAgICAgICAgICAgICAgICByZXR1cm4gc3VzLnRyYW5zbGF0ZShkeCwgZHkpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBsaW5rQXR0cjogewogICAgICAgICAgICB4MTogZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGQucG9zaXRpb24ueDE7IH0sCiAgICAgICAgICAgIHkxOiBmdW5jdGlvbiAoZCkgeyByZXR1cm4gZC5wb3NpdGlvbi55MTsgfSwKICAgICAgICAgICAgeDI6IGZ1bmN0aW9uIChkKSB7IHJldHVybiBkLnBvc2l0aW9uLngyOyB9LAogICAgICAgICAgICB5MjogZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGQucG9zaXRpb24ueTI7IH0KICAgICAgICB9LAogICAgICAgIGxpbmtMYWJlbEF0dHI6IHsKICAgICAgICAgICAgdHJhbnNmb3JtOiBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgdmFyIGxuayA9IHRtcy5maW5kTGlua0J5SWQoZC5rZXkpOwogICAgICAgICAgICAgICAgaWYgKGxuaykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZDMudHJhbnNmb3JtTGFiZWwobG5rLnBvc2l0aW9uKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gdGljaygpIHsKICAgICAgICAvLyBndWFyZCBhZ2FpbnN0IG51bGwgKHdoaWNoIGNhbiBoYXBwZW4gd2hlbiBvdXIgdmlldyBwYWdlcyBvdXQpLi4uCiAgICAgICAgaWYgKG5vZGUgJiYgbm9kZS5zaXplKCkpIHsKICAgICAgICAgICAgbm9kZS5hdHRyKHRpY2tTdHVmZi5ub2RlQXR0cik7CiAgICAgICAgfQogICAgICAgIGlmIChsaW5rICYmIGxpbmsuc2l6ZSgpKSB7CiAgICAgICAgICAgIGxpbmsuY2FsbChjYWxjUG9zaXRpb24pCiAgICAgICAgICAgICAgICAuYXR0cih0aWNrU3R1ZmYubGlua0F0dHIpOwogICAgICAgICAgICB0ZDMuYXBwbHlOdW1MaW5rTGFiZWxzKGxpbmtOdW1zLCBudW1MaW5rTGJsc0cpOwogICAgICAgIH0KICAgICAgICBpZiAobGlua0xhYmVsICYmIGxpbmtMYWJlbC5zaXplKCkpIHsKICAgICAgICAgICAgbGlua0xhYmVsLmF0dHIodGlja1N0dWZmLmxpbmtMYWJlbEF0dHIpOwogICAgICAgIH0KICAgIH0KCgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vID09PSBNT1VTRSBHRVNUVVJFIEhBTkRMRVJTCgogICAgZnVuY3Rpb24gem9vbWluZ09yUGFubmluZyhldikgewogICAgICAgIHJldHVybiBldi5tZXRhS2V5IHx8IGV2LmFsdEtleTsKICAgIH0KCiAgICBmdW5jdGlvbiBhdERyYWdFbmQoZCkgewogICAgICAgIC8vIG9uY2Ugd2UndmUgZmluaXNoZWQgbW92aW5nLCBwaW4gdGhlIG5vZGUgaW4gcG9zaXRpb24KICAgICAgICBkLmZpeGVkID0gdHJ1ZTsKICAgICAgICBkMy5zZWxlY3QodGhpcykuY2xhc3NlZCgnZml4ZWQnLCB0cnVlKTsKICAgICAgICBzZW5kVXBkYXRlTWV0YShkKTsKICAgICAgICB0c3MuY2xpY2tDb25zdW1lZCh0cnVlKTsKICAgIH0KCiAgICAvLyBwcmVkaWNhdGUgdGhhdCBpbmRpY2F0ZXMgd2hlbiBkcmFnZ2luZyBpcyBhY3RpdmUKICAgIGZ1bmN0aW9uIGRyYWdFbmFibGVkKCkgewogICAgICAgIHZhciBldiA9IGQzLmV2ZW50LnNvdXJjZUV2ZW50OwogICAgICAgIC8vIG5vZGVMb2NrIG1lYW5zIHdlIGFyZW4ndCBhbGxvd2luZyBub2RlcyB0byBiZSBkcmFnZ2VkLi4uCiAgICAgICAgcmV0dXJuICFub2RlTG9jayAmJiAhem9vbWluZ09yUGFubmluZyhldik7CiAgICB9CgogICAgLy8gcHJlZGljYXRlIHRoYXQgaW5kaWNhdGVzIHdoZW4gY2xpY2tpbmcgaXMgYWN0aXZlCiAgICBmdW5jdGlvbiBjbGlja0VuYWJsZWQoKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBmdW5jdGlvbiBlbnRyeSBwb2ludHMgZm9yIG92ZXJsYXkgbW9kdWxlCgogICAgLy8gVE9ETzogZmluZCBhbiBhdXRvbWF0aWMgd2F5IG9mIHRyYWNraW5nIHZpYSB0aGUgInNob3dIaWdobGlnaHRzIiBldmVudHMKICAgIHZhciBhbGxUcmFmZmljQ2xhc3NlcyA9ICdwcmltYXJ5IHNlY29uZGFyeSBvcHRpY2FsIGFuaW1hdGVkICcgKwogICAgICAgICdwb3J0LXRyYWZmaWMtS2JwcyBwb3J0LXRyYWZmaWMtTWJwcyBwb3J0LXRyYWZmaWMtR2JwcyAnICsKICAgICAgICAncG9ydC10cmFmZmljLUdicHMtY2hva2VkJzsKCiAgICBmdW5jdGlvbiBjbGVhckxpbmtUcmFmZmljU3R5bGUoKSB7CiAgICAgICAgbGluay5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgbnVsbCkKICAgICAgICAgICAgLmNsYXNzZWQoYWxsVHJhZmZpY0NsYXNzZXMsIGZhbHNlKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZW1vdmVMaW5rTGFiZWxzKCkgewogICAgICAgIG5ldHdvcmsubGlua3MuZm9yRWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgICAgICBkLmxhYmVsID0gJyc7CiAgICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gY2xlYXJOb2RlRGVjbygpIHsKICAgICAgICBub2RlLnNlbGVjdEFsbCgnZy5iYWRnZScpLnJlbW92ZSgpOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlbW92ZU5vZGVCYWRnZXMoKSB7CiAgICAgICAgbmV0d29yay5ub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIGQuYmFkZ2UgPSBudWxsOwogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZUxpbmtMYWJlbE1vZGVsKCkgewogICAgICAgIC8vIGNyZWF0ZSB0aGUgYmFja2luZyBkYXRhIGZvciBzaG93aW5nIGxhYmVscy4uCiAgICAgICAgdmFyIGRhdGEgPSBbXTsKICAgICAgICBsaW5rLmVhY2goZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgaWYgKGQubGFiZWwpIHsKICAgICAgICAgICAgICAgIGRhdGEucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdsYWItJyArIGQua2V5LAogICAgICAgICAgICAgICAgICAgIGtleTogZC5rZXksCiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGQubGFiZWwsCiAgICAgICAgICAgICAgICAgICAgbGRhdGE6IGQKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIGxpbmtMYWJlbCA9IGxpbmtMYWJlbEcuc2VsZWN0QWxsKCcubGlua0xhYmVsJykKICAgICAgICAgICAgLmRhdGEoZGF0YSwgZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGQuaWQ7IH0pOwogICAgfQoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBNb2R1bGUgZGVmaW5pdGlvbgoKICAgIGZ1bmN0aW9uIG1rTW9kZWxBcGkodXBsaW5rKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcHJvamVjdGlvbjogdXBsaW5rLnByb2plY3Rpb24sCiAgICAgICAgICAgIG5ldHdvcms6IG5ldHdvcmssCiAgICAgICAgICAgIHJlc3R5bGVMaW5rRWxlbWVudDogcmVzdHlsZUxpbmtFbGVtZW50LAogICAgICAgICAgICByZW1vdmVMaW5rRWxlbWVudDogcmVtb3ZlTGlua0VsZW1lbnQKICAgICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIG1rRDNBcGkoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbm9kZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gbm9kZTsgfSwKICAgICAgICAgICAgbGluazogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGluazsgfSwKICAgICAgICAgICAgbGlua0xhYmVsOiBmdW5jdGlvbiAoKSB7IHJldHVybiBsaW5rTGFiZWw7IH0sCiAgICAgICAgICAgIGluc3RWaXNpYmxlOiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aXMuaXNWaXNpYmxlKCk7IH0sCiAgICAgICAgICAgIHBvc05vZGU6IHRtcy5wb3NpdGlvbk5vZGUsCiAgICAgICAgICAgIHNob3dIb3N0czogZnVuY3Rpb24gKCkgeyByZXR1cm4gc2hvd0hvc3RzOyB9LAogICAgICAgICAgICByZXN0eWxlTGlua0VsZW1lbnQ6IHJlc3R5bGVMaW5rRWxlbWVudCwKICAgICAgICAgICAgdXBkYXRlTGlua0xhYmVsTW9kZWw6IHVwZGF0ZUxpbmtMYWJlbE1vZGVsLAogICAgICAgICAgICBsaW5rQ29uZmlnOiBmdW5jdGlvbiAoKSB7IHJldHVybiBsaW5rQ29uZmlnOyB9CiAgICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBta1NlbGVjdEFwaSgpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBub2RlOiBmdW5jdGlvbiAoKSB7IHJldHVybiBub2RlOyB9LAogICAgICAgICAgICB6b29taW5nT3JQYW5uaW5nOiB6b29taW5nT3JQYW5uaW5nLAogICAgICAgICAgICB1cGRhdGVEZXZpY2VDb2xvcnM6IHRkMy51cGRhdGVEZXZpY2VDb2xvcnMsCiAgICAgICAgICAgIGRlc2VsZWN0TGluazogdGxzLmRlc2VsZWN0TGluawogICAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gbWtUcmFmZmljQXBpKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGhvdmVyZWQ6IHRzcy5ob3ZlcmVkLAogICAgICAgICAgICBzb21ldGhpbmdTZWxlY3RlZDogdHNzLnNvbWV0aGluZ1NlbGVjdGVkLAogICAgICAgICAgICBzZWxlY3RPcmRlcjogdHNzLnNlbGVjdE9yZGVyCiAgICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBta092ZXJsYXlBcGkoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgY2xlYXJOb2RlRGVjbzogY2xlYXJOb2RlRGVjbywKICAgICAgICAgICAgcmVtb3ZlTm9kZUJhZGdlczogcmVtb3ZlTm9kZUJhZGdlcywKICAgICAgICAgICAgY2xlYXJMaW5rVHJhZmZpY1N0eWxlOiBjbGVhckxpbmtUcmFmZmljU3R5bGUsCiAgICAgICAgICAgIHJlbW92ZUxpbmtMYWJlbHM6IHJlbW92ZUxpbmtMYWJlbHMsCiAgICAgICAgICAgIGZpbmRMaW5rQnlJZDogdG1zLmZpbmRMaW5rQnlJZCwKICAgICAgICAgICAgZmluZE5vZGVCeUlkOiBub2RlQnlJZCwKICAgICAgICAgICAgdXBkYXRlTGlua3M6IHVwZGF0ZUxpbmtzLAogICAgICAgICAgICB1cGRhdGVOb2RlczogdXBkYXRlTm9kZXMsCiAgICAgII7x71bQxwEAlw8AAJcPAABo9ygf0sUIACetHhMIAEUAD4nM2EAAQAbOr8CoB2DAqAc2H/WW0VqWemGMl+kMgBgDjJ9iAAABAQgKAGIpsQC34rsgICAgICBzdXBMYXllcnM6IHN1cHByZXNzTGF5ZXJzLAogICAgICAgICAgICB1bnN1cE5vZGU6IHVuc3VwcHJlc3NOb2RlLAogICAgICAgICAgICB1bnN1cExpbms6IHVuc3VwcHJlc3NMaW5rCiAgICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBta09ibGlxdWVBcGkodXBsaW5rLCBmbHRyKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgZm9yY2U6IGZ1bmN0aW9uKCkgeyByZXR1cm4gZm9yY2U7IH0sCiAgICAgICAgICAgIHpvb21MYXllcjogdXBsaW5rLnpvb21MYXllciwKICAgICAgICAgICAgbm9kZUdCQm94OiBmdW5jdGlvbigpIHsgcmV0dXJuIG5vZGVHLm5vZGUoKS5nZXRCQm94KCk7IH0sCiAgICAgICAgICAgIG5vZGU6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5vZGU7IH0sCiAgICAgICAgICAgIGxpbms6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGxpbms7IH0sCiAgICAgICAgICAgIGxpbmtMYWJlbDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua0xhYmVsOyB9LAogICAgICAgICAgICBub2RlczogZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV0d29yay5ub2RlczsgfSwKICAgICAgICAgICAgdGlja1N0dWZmOiB0aWNrU3R1ZmYsCiAgICAgICAgICAgIG5vZGVMb2NrOiBmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgdmFyIG9sZCA9IG5vZGVMb2NrOwogICAgICAgICAgICAgICAgbm9kZUxvY2sgPSBiOwogICAgICAgICAgICAgICAgcmV0dXJuIG9sZDsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgb3BhY2lmeU1hcDogdXBsaW5rLm9wYWNpZnlNYXAsCiAgICAgICAgICAgIGluTGF5ZXI6IGZsdHIuaW5MYXllciwKICAgICAgICAgICAgY2FsY0xpbmtQb3M6IGNhbGNQb3NpdGlvbiwKICAgICAgICAgICAgYXBwbHlOdW1MaW5rTGFiZWxzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB0ZDMuYXBwbHlOdW1MaW5rTGFiZWxzKGxpbmtOdW1zLCBudW1MaW5rTGJsc0cpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBta0ZpbHRlckFwaSgpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBub2RlOiBmdW5jdGlvbiAoKSB7IHJldHVybiBub2RlOyB9LAogICAgICAgICAgICBsaW5rOiBmdW5jdGlvbiAoKSB7IHJldHVybiBsaW5rOyB9CiAgICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBta0xpbmtBcGkoc3ZnLCB1cGxpbmspIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBzdmc6IHN2ZywKICAgICAgICAgICAgem9vbWVyOiB1cGxpbmsuem9vbWVyKCksCiAgICAgICAgICAgIG5ldHdvcms6IG5ldHdvcmssCiAgICAgICAgICAgIHBvcnRMYWJlbEc6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHBvcnRMYWJlbEc7IH0sCiAgICAgICAgICAgIHNob3dIb3N0czogZnVuY3Rpb24gKCkgeyByZXR1cm4gc2hvd0hvc3RzOyB9CiAgICAgICAgfTsKICAgIH0KCiAgICBhbmd1bGFyLm1vZHVsZSgnb3ZUb3BvJykKICAgIC5mYWN0b3J5KCdUb3BvRm9yY2VTZXJ2aWNlJywKICAgICAgICBbJyRsb2cnLCAnJHRpbWVvdXQnLCAnRm5TZXJ2aWNlJywgJ1N2Z1V0aWxTZXJ2aWNlJywKICAgICAgICAgICAgJ1RoZW1lU2VydmljZScsICdGbGFzaFNlcnZpY2UnLCAnV2ViU29ja2V0U2VydmljZScsCiAgICAgICAgICAgICdUb3BvT3ZlcmxheVNlcnZpY2UnLCAnVG9wb0luc3RTZXJ2aWNlJywgJ1RvcG9Nb2RlbFNlcnZpY2UnLAogICAgICAgICAgICAnVG9wb0QzU2VydmljZScsICdUb3BvU2VsZWN0U2VydmljZScsICdUb3BvVHJhZmZpY1NlcnZpY2UnLAogICAgICAgICAgICAnVG9wb09ibGlxdWVTZXJ2aWNlJywgJ1RvcG9GaWx0ZXJTZXJ2aWNlJywgJ1RvcG9MaW5rU2VydmljZScsCgogICAgICAgIGZ1bmN0aW9uIChfJGxvZ18sIF8kdGltZW91dF8sIF9mc18sIF9zdXNfLCBfdHNfLCBfZmxhc2hfLCBfd3NzXywgX3Rvdl8sCiAgICAgICAgICAgICAgICAgIF90aXNfLCBfdG1zXywgX3RkM18sIF90c3NfLCBfdHRzXywgX3Rvc18sIF9mbHRyXywgX3Rsc18pIHsKICAgICAgICAgICAgJGxvZyA9IF8kbG9nXzsKICAgICAgICAgICAgJHRpbWVvdXQgPSBfJHRpbWVvdXRfOwogICAgICAgICAgICBmcyA9IF9mc187CiAgICAgICAgICAgIHN1cyA9IF9zdXNfOwogICAgICAgICAgICB0cyA9IF90c187CiAgICAgICAgICAgIGZsYXNoID0gX2ZsYXNoXzsKICAgICAgICAgICAgd3NzID0gX3dzc187CiAgICAgICAgICAgIHRvdiA9IF90b3ZfOwogICAgICAgICAgICB0aXMgPSBfdGlzXzsKICAgICAgICAgICAgdG1zID0gX3Rtc187CiAgICAgICAgICAgIHRkMyA9IF90ZDNfOwogICAgICAgICAgICB0c3MgPSBfdHNzXzsKICAgICAgICAgICAgdHRzID0gX3R0c187CiAgICAgICAgICAgIHRvcyA9IF90b3NfOwogICAgICAgICAgICBmbHRyID0gX2ZsdHJfOwogICAgICAgICAgICB0bHMgPSBfdGxzXzsKCiAgICAgICAgICAgIHZhciB0aGVtZUxpc3RlbmVyID0gdHMuYWRkTGlzdGVuZXIoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdXBkYXRlTGlua3MoKTsKICAgICAgICAgICAgICAgIHVwZGF0ZU5vZGVzKCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gZm9yY2VHIGlzIHRoZSBTVkcgZ3JvdXAgdG8gZGlzcGxheSB0aGUgZm9yY2UgbGF5b3V0IGluCiAgICAgICAgICAgIC8vIHVwbGluayBpcyB0aGUgYXBpIGZyb20gdGhlIG1haW4gdG9wbyBzb3VyY2UgZmlsZQogICAgICAgICAgICAvLyBkaW0gaXMgdGhlIGluaXRpYWwgZGltZW5zaW9ucyBvZiB0aGUgU1ZHIGFzIFt3LGhdCiAgICAgICAgICAgIC8vIG9wdHMgYXJlLCB3ZWxsLCBvcHRpb25hbCA6KQogICAgICAgICAgICBmdW5jdGlvbiBpbml0Rm9yY2UoX3N2Z18sIGZvcmNlRywgX3VwbGlua18sIF9kaW1fLCBvcHRzKSB7CiAgICAgICAgICAgICAgICB1cGxpbmsgPSBfdXBsaW5rXzsKICAgICAgICAgICAgICAgIGRpbSA9IF9kaW1fOwogICAgICAgICAgICAgICAgc3ZnID0gX3N2Z187CgogICAgICAgICAgICAgICAgbHUgPSBuZXR3b3JrLmxvb2t1cDsKICAgICAgICAgICAgICAgIHJsayA9IG5ldHdvcmsucmV2TGlua1RvS2V5OwoKICAgICAgICAgICAgICAgICRsb2cuZGVidWcoJ2luaXRGb3JjZSgpLi4gZGltID0gJyArIGRpbSk7CgogICAgICAgICAgICAgICAgdG92LnNldEFwaShta092ZXJsYXlBcGkoKSwgdHNzKTsKICAgICAgICAgICAgICAgIHRtcy5pbml0TW9kZWwobWtNb2RlbEFwaSh1cGxpbmspLCBkaW0pOwogICAgICAgICAgICAgICAgdGQzLmluaXREMyhta0QzQXBpKCkpOwogICAgICAgICAgICAgICAgdHNzLmluaXRTZWxlY3QobWtTZWxlY3RBcGkoKSk7CiAgICAgICAgICAgICAgICB0dHMuaW5pdFRyYWZmaWMobWtUcmFmZmljQXBpKCkpOwogICAgICAgICAgICAgICAgdG9zLmluaXRPYmxpcXVlKG1rT2JsaXF1ZUFwaSh1cGxpbmssIGZsdHIpKTsKICAgICAgICAgICAgICAgIGZsdHIuaW5pdEZpbHRlcihta0ZpbHRlckFwaSgpKTsKICAgICAgICAgICAgICAgIHRscy5pbml0TGluayhta0xpbmtBcGkoc3ZnLCB1cGxpbmspLCB0ZDMpOwoKICAgICAgICAgICAgICAgIHNldHRpbmdzID0gYW5ndWxhci5leHRlbmQoe30sIGRlZmF1bHRTZXR0aW5ncywgb3B0cyk7CgogICAgICAgICAgICAgICAgbGlua0cgPSBmb3JjZUcuYXBwZW5kKCdnJykuYXR0cignaWQnLCAndG9wby1saW5rcycpOwogICAgICAgICAgICAgICAgbGlua0xhYmVsRyA9IGZvcmNlRy5hcHBlbmQoJ2cnKS5hdHRyKCdpZCcsICd0b3BvLWxpbmtMYWJlbHMnKTsKICAgICAgICAgICAgICAgIG51bUxpbmtMYmxzRyA9IGZvcmNlRy5hcHBlbmQoJ2cnKS5hdHRyKCdpZCcsICd0b3BvLW51bUxpbmtMYWJlbHMnKTsKICAgICAgICAgICAgICAgIG5vZGVHID0gZm9yY2VHLmFwcGVuZCgnZycpLmF0dHIoJ2lkJywgJ3RvcG8tbm9kZXMnKTsKICAgICAgICAgICAgICAgIHBvcnRMYWJlbEcgPSBmb3JjZUcuYXBwZW5kjvHvVrDJAQBHAAAARwAAAGj3KB/SxQgAJ60eEwgARQAAOSwIQABABn7QwKgHYMCoBzYf9ZbTcoN2YWEci1aAGAMykBIAAAEBCAoAYimxALfiujANCg0KjvHvVtnKAQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANN29QABABs0fwKgHNsCoB2CW0R/1jJfpDFqWibaAEAWkwvQAAAEBCAoAt+K7AGIpsY7x71ZGywEAaw0AAGsNAABo9ygf0sUIACetHhMIAEUADV3M20AAQAbQ2MCoB2DAqAc2H/WW0VqWibaMl+kMgBgDjJ02AAABAQgKAGIpsgC34rsNCkQxQg0KKCdnJykuYXR0cignaWQnLCAndG9wby1wb3J0TGFiZWxzJyk7CgogICAgICAgICAgICAgICAgbGluayA9IGxpbmtHLnNlbGVjdEFsbCgnLmxpbmsnKTsKICAgICAgICAgICAgICAgIGxpbmtMYWJlbCA9IGxpbmtMYWJlbEcuc2VsZWN0QWxsKCcubGlua0xhYmVsJyk7CiAgICAgICAgICAgICAgICBub2RlID0gbm9kZUcuc2VsZWN0QWxsKCcubm9kZScpOwoKICAgICAgICAgICAgICAgIGZvcmNlID0gZDMubGF5b3V0LmZvcmNlKCkKICAgICAgICAgICAgICAgICAgICAuc2l6ZShkaW0pCiAgICAgICAgICAgICAgICAgICAgLm5vZGVzKG5ldHdvcmsubm9kZXMpCiAgICAgICAgICAgICAgICAgICAgLmxpbmtzKG5ldHdvcmsubGlua3MpCiAgICAgICAgICAgICAgICAgICAgLmdyYXZpdHkoc2V0dGluZ3MuZ3Jhdml0eSkKICAgICAgICAgICAgICAgICAgICAuZnJpY3Rpb24oc2V0dGluZ3MuZnJpY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgLmNoYXJnZShzZXR0aW5ncy5jaGFyZ2UuX2RlZl8pCiAgICAgICAgICAgICAgICAgICAgLmxpbmtEaXN0YW5jZShzZXR0aW5ncy5saW5rRGlzdGFuY2UuX2RlZl8pCiAgICAgICAgICAgICAgICAgICAgLmxpbmtTdHJlbmd0aChzZXR0aW5ncy5saW5rU3RyZW5ndGguX2RlZl8pCiAgICAgICAgICAgICAgICAgICAgLm9uKCd0aWNrJywgdGljayk7CgogICAgICAgICAgICAgICAgZHJhZyA9IHN1cy5jcmVhdGVEcmFnQmVoYXZpb3IoZm9yY2UsCiAgICAgICAgICAgICAgICAgICAgdHNzLnNlbGVjdE9iamVjdCwgYXREcmFnRW5kLCBkcmFnRW5hYmxlZCwgY2xpY2tFbmFibGVkKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZnVuY3Rpb24gbmV3RGltKF9kaW1fKSB7CiAgICAgICAgICAgICAgICBkaW0gPSBfZGltXzsKICAgICAgICAgICAgICAgIGZvcmNlLnNpemUoZGltKTsKICAgICAgICAgICAgICAgIHRtcy5uZXdEaW0oZGltKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZnVuY3Rpb24gZGVzdHJveUZvcmNlKCkgewogICAgICAgICAgICAgICAgZm9yY2Uuc3RvcCgpOwoKICAgICAgICAgICAgICAgIHRscy5kZXN0cm95TGluaygpOwogICAgICAgICAgICAgICAgdG9zLmRlc3Ryb3lPYmxpcXVlKCk7CiAgICAgICAgICAgICAgICB0dHMuZGVzdHJveVRyYWZmaWMoKTsKICAgICAgICAgICAgICAgIHRzcy5kZXN0cm95U2VsZWN0KCk7CiAgICAgICAgICAgICAgICB0ZDMuZGVzdHJveUQzKCk7CiAgICAgICAgICAgICAgICB0bXMuZGVzdHJveU1vZGVsKCk7CiAgICAgICAgICAgICAgICAvLyBub3RlOiBubyBuZWVkIHRvIGRlc3Ryb3kgb3ZlcmxheSBzZXJ2aWNlCiAgICAgICAgICAgICAgICB0cy5yZW1vdmVMaXN0ZW5lcih0aGVtZUxpc3RlbmVyKTsKICAgICAgICAgICAgICAgIHRoZW1lTGlzdGVuZXIgPSBudWxsOwoKICAgICAgICAgICAgICAgIC8vIGNsZWFuIHVwIHRoZSBET00KICAgICAgICAgICAgICAgIHN2Zy5zZWxlY3RBbGwoJ2cnKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIHN2Zy5zZWxlY3RBbGwoJ2RlZnMnKS5yZW1vdmUoKTsKCiAgICAgICAgICAgICAgICAvLyBjbGVhbiB1cCBpbnRlcm5hbCBzdGF0ZQogICAgICAgICAgICAgICAgbmV0d29yay5ub2RlcyA9IFtdOwogICAgICAgICAgICAgICAgbmV0d29yay5saW5rcyA9IFtdOwogICAgICAgICAgICAgICAgbmV0d29yay5saW5rc0J5RGV2aWNlID0ge307CiAgICAgICAgICAgICAgICBuZXR3b3JrLmxvb2t1cCA9IHt9OwogICAgICAgICAgICAgICAgbmV0d29yay5yZXZMaW5rVG9LZXkgPSB7fTsKCiAgICAgICAgICAgICAgICBsaW5rTnVtcyA9IFtdOwoKICAgICAgICAgICAgICAgIGxpbmtHID0gbGlua0xhYmVsRyA9IG51bUxpbmtMYmxzRyA9IG5vZGVHID0gcG9ydExhYmVsRyA9IG51bGw7CiAgICAgICAgICAgICAgICBsaW5rID0gbGlua0xhYmVsID0gbm9kZSA9IG51bGw7CiAgICAgICAgICAgICAgICBmb3JjZSA9IGRyYWcgPSBudWxsOwoKICAgICAgICAgICAgICAgIC8vIGNsZWFuIHVwICR0aW1lb3V0IHByb21pc2VzCiAgICAgICAgICAgICAgICBpZiAoZlRpbWVyKSB7CiAgICAgICAgICAgICAgICAgICAgJHRpbWVvdXQuY2FuY2VsKGZUaW1lcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZk5vZGVzVGltZXIpIHsKICAgICAgICAgICAgICAgICAgICAkdGltZW91dC5jYW5jZWwoZk5vZGVzVGltZXIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGZMaW5rc1RpbWVyKSB7CiAgICAgICAgICAgICAgICAgICAgJHRpbWVvdXQuY2FuY2VsKGZMaW5rc1RpbWVyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGluaXRGb3JjZTogaW5pdEZvcmNlLAogICAgICAgICAgICAgICAgbmV3RGltOiBuZXdEaW0sCiAgICAgICAgICAgICAgICBkZXN0cm95Rm9yY2U6IGRlc3Ryb3lGb3JjZSwKCiAgICAgICAgICAgICAgICB1cGRhdGVEZXZpY2VDb2xvcnM6IHRkMy51cGRhdGVEZXZpY2VDb2xvcnMsCiAgICAgICAgICAgICAgICB0b2dnbGVIb3N0czogdG9nZ2xlSG9zdHMsCiAgICAgICAgICAgICAgICB0b2dnbGVQb3J0czogdGxzLnRvZ2dsZVBvcnRzLAogICAgICAgICAgICAgICAgdG9nZ2xlT2ZmbGluZTogdG9nZ2xlT2ZmbGluZSwKICAgICAgICAgICAgICAgIGN5Y2xlRGV2aWNlTGFiZWxzOiBjeWNsZURldmljZUxhYmVscywKICAgICAgICAgICAgICAgIHVucGluOiB1bnBpbiwKICAgICAgICAgICAgICAgIHNob3dNYXN0ZXJzaGlwOiBzaG93TWFzdGVyc2hpcCwKICAgICAgICAgICAgICAgIHNob3dCYWRMaW5rczogc2hvd0JhZExpbmtzLAoKICAgICAgICAgICAgICAgIHJlc2V0QWxsTG9jYXRpb25zOiByZXNldEFsbExvY2F0aW9ucywKICAgICAgICAgICAgICAgIGFkZERldmljZTogYWRkRGV2aWNlLAogICAgICAgICAgICAgICAgdXBkYXRlRGV2aWNlOiB1cGRhdGVEZXZpY2UsCiAgICAgICAgICAgICAgICByZW1vdmVEZXZpY2U6IHJlbW92ZURldmljZSwKICAgICAgICAgICAgICAgIGFkZEhvc3Q6IGFkZEhvc3QsCiAgICAgICAgICAgICAgICB1cGRhdGVIb3N0OiB1cGRhdGVIb3N0LAogICAgICAgICAgICAgICAgbW92ZUhvc3Q6IG1vdmVIb3N0LAogICAgICAgICAgICAgICAgcmVtb3ZlSG9zdDogcmVtb3ZlSG9zdCwKICAgICAgICAgICAgICAgIGFkZExpbms6IGFkZExpbmssCiAgICAgICAgICAgICAgICB1cGRhdGVMaW5rOiB1cGRhdGVMaW5rLAogICAgICAgICAgICAgICAgcmVtb3ZlTGluazogcmVtb3ZlTGluaywKICAgICAgICAgICAgICAgIHRvcG9TdGFydERvbmU6IHRvcG9TdGFydERvbmUKICAgICAgICAgICAgfTsKICAgICAgICB9XSk7Cn0oKSk7Cg0KMA0KDQqO8e9WkMsBAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0ZLNAAEAGRirAqAc2wKgHYJbTH/VhHItWcoN2ZoAQBaRHhwAAAQEICgC34rsAYimxjvHvVizMAQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANN2+QABABs0ewKgHNsCoB2CW0R/1jJfpDFqWlt+AEAWktcoAAAEBCAoAt+K7AGIpso7x71aAzQEAmwIAAJsCAAAIACetHhNo9ygf0sUIAEUAAo1ktEAAQAZD0MCoBzbAqAdgltMf9WEci1Zyg3ZmgBgFpPMcAAABAQgKALfiuwBiKbFHRVQgL29ub3MvdWkvYXBwL2Z3L2xheWVyL3BhbmVsLmNzcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogdGV4dC9jc3MsKi8qO3E9MC4xDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0KjvHvVoDNAQCcAgAAnAIAAAgAJ60eE2j3KB/SxQgARQACjt2/QABABsrDwKgHNsCoB2CW0R/1jJfpDFqWlt+AGAWktqkAAAEBCAoAt+K7AGIpskdFVCAvb25vcy91aS9hcHAvZncvbGF5ZXIvZGlhbG9nLmNzcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogdGV4dC9jc3MsKi8qO3E9MC4xDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0KjvHvVnLXAQBHAAAARwAAAGj3KB/SxQgAJ60eEwgARQAAOYmHQABABiFRwKgHYMCoBzYf9ZbQaztTvvk+QN+AGALokBIAAAEBCAoAYimyALfiuzANCg0KjvHvVk3aAQCbAgAAmwIAAAgAJ60eE2j3KB/SxQgARQACjV/FQABABki/wKgHNsCoB2CW0B/1+T5A32s7U8OAGAWk6kQAAAEBCAoAt+K8AGIpskdFVCAvb25vcy91aS9hcHAvZncvbGF5ZXIvZmxhc2guY3NzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiB0ZXh0L2NzcywqLyo7cT0wLjENClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQqO8e9WJdwBAKMGAACjBgAAaPcoH9LFCAAnrR4TCABFAAaVgXxAAEAGIwDAqAdgwKgHNh/1ltShr1rOQN4Nk4AYA0+WbgAAAQEICgBiKbMAt+K6SFRUUC8xLjEgMjAwIE9LDQpFVGFnOiAxNDU4NTY1Mzg2ODE5DQpDb250ZW50LVR5cGU6IHRleHQvY3NzDQpUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQo1REQNCi8qCiAqIENvcHlyaWdodCAyMDE0LDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gY29yZSAtLSBDU1MgZmlsZQogKi8KCmh0bWwgewogICAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7CiAgICAtd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6IDEwMCU7CiAgICAtbXMtdGV4dC1zaXplLWFkanVzdDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKfQoKLyoKICAgb3ZlcmZsb3cgaGlkZGVuIGlzIHRvIGVuc3VyZSB0aGF0IHRoZSBib2R5IGRvZXMgbm90IGV4cGFuZCB0byBhY2NvdW50CiAgIGZvciBhbnkgZmx5b3V0IHBhbmVzLCB0aGF0IGFyZSBwb3NpdGlvbmVkICJvZmYgc2NyZWVuIi4KICovCmJvZHkgewogICAgaGVpZ2h0OiAxMDAlOwogICAgbWFyZ2luOiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKYm9keS5saWdodCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKfQpib2R5LmRhcmsgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzJiMmIyYjsKfQoKI3ZpZXcgewogICAgcGFkZGluZzogNnB4OwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7Cn0KCiN2aWV3IGgyIHsKICAgIHBhZGRpbmctbGVmdDogMTJweDsKfQoKLmxpZ2h0ICN2aWV3IGgyIHsKICAgIGNvbG9yOiAjODAwOwp9Ci5kYXJrICN2aWV3IGgyIHsKICAgIGNvbG9yOiAjQ0U1NjUwOwp9CgouY2VudGVyZWQgewogICAgcG9zaXRpb246IGZpeGVkOwogICAgdG9wOiA1MCU7CiAgICBsZWZ0OiA1MCU7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICBib3gtc2hhZG93OiAycHggMnB4IDI0cHggNXB4ICM4ODg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlOwogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMTBweDsKfQoNCo7x71aE3AEAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADTib0AAQAbIbcCoBzbAqAdgltQf9UDeDZOhr2EvgBAHoMmTAAABAQgKALfivABiKbOO8e9W99wBAEcAAABHAAAAaPcoH9LFCAAnrR4TCABFAAA5gX5AAEAGKVrAqAdgwKgHNh/1ltShr2EvQN4Nk4AYA0+QEgAAAQEICgBiKbMAt+K8MA0KDQqO8e9WIuABACAFAAAgBQAAaPcoH9LFCAAnrR4TCABFAAUSiYhAAEAGHHfAqAdgwKgHNh/1ltBrO1PD+T5DOIAYAvKU6wAAAQEICgBiKbMAt+K8SFRUUC8xLjEgMjAwIE9LDQpFVGFnOiAxNDU4NTY1Mzg2ODE5DQpDb250ZW50LVR5cGU6IHRleHQvY3NzDQpUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQo0NUENCi8qCiAqIENvcHlyaWdodCAyMDE0LDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gRmxhc2ggU2VydmljZSAtLSBDU1MgZmlsZQogKi8KCiNmbGFzaCB7CiAgICB6LWluZGV4OiAxNDAwOwp9CgojZmxhc2ggc3ZnIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGJvdHRvbTogMDsKICAgIG9wYWNpdHk6IDAuODsKfQoKLmxpZ2h0ICNmbGFzaCBzdmcgZy5mbGFzaEl0ZW0gcmVjdCB7CiAgICBmaWxsOiAjY2NjOwp9Ci5kYXJrICNmbGFzaCBzdmcgZy5mbGFzaEl0ZW0gcmVjdCB7CiAgICBmaWxsOiAjNTU1Owp9CgojZmxhc2ggc3ZnIGcuZmxhc2hJdGVtIHRleHQgewogICAgc3Ryb2tlOiBub25lOwogICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgIGFsaWdubWVudC1iYXNlbGluZTogbWlkZGxlOwogICAgZm9udC1zaXplOiAxNnB0Owp9Ci5saWdodCAjZmxhc2ggc3ZnIGcuZmxhc2hJdGVtIHRleHQgewogICAgZmlsbDogIzMzMzsKfQouZGFyayAjZmxhc2ggc3ZnIGcuZmxhc2hJdGVtIHRleHQgewogICAgZmlsbDogIzk5OTsKfQoNCo7x71Yd4QEARwAAAEcAAABo9ygf0sUIACetHhMIAEUAADmJiUAAQAYhT8CoB2DAqAc2H/WW0Gs7WKH5PkM4gBgC8pASAAABAQgKAGIpswC34rwwDQoNCo7x71Y14QEAnwIAAJ8CAAAIACetHhNo9ygf0sUIAEUAApHicEAAQAbGD8CoBzbAqAdgltQf9UDeDZOhr2E0gBgHoKQ4AAABAQgKALfivQBiKbNHRVQgL29ub3MvdWkvYXBwL2Z3L2xheWVyL3F1aWNraGVscC5jc3MgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6IHRleHQvY3NzLCovKjtxPTAuMQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71b54gEAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADRfxkAAQAZLF8CoBzbAqAdgltAf9fk+QzhrO1imgBAFpByKAAABAQgKALfivQBiKbOO8e9WkuMBAJoCAACaAgAACAAnrR4TaPcoH9LFCABFAAKMX8dAAEAGSL7AqAc2wKgHYJbQH/X5PkM4aztYpoAYBaRy1gAAAQEICgC34r0AYimzR0VUIC9vbm9zL3VpL2FwcC9mdy9sYXllci92ZWlsLmNzcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogdGV4dC9jc3MsKi8qO3E9MC4xDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0KjvHvVornAQAECAAABAgAAGj3KB/SxQgAJ60eEwgARQAH9ikYQABABnoDwKgHYMCoBzYf9ZbSU1JMVjSHnpKAGAOtl88AAAEBCAoAYimzALfiu0hUVFAvMS4xIDIwMCBPSw0KRVRhZzogMTQ1ODU2NTM4NjgxOQ0KQ29udGVudC1UeXBlOiB0ZXh0L2Nzcw0KVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KNzNFDQovKgogKiBDb3B5cmlnaHQgMjAxNCwyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIEljb24gU2VydmljZSAtLSBDU1MgZmlsZQogKi8KCnN2ZyNJY29uTGliRGVmcyB7CiAgZGlzcGxheTogbm9uZTsKfQoKc3ZnIC5zdmdJY29uIHsKICAgIGZpbGwtcnVsZTogZXZlbm9kZDsKfQoKc3ZnLmVtYmVkZGVkSWNvbiBnLmljb24gewogICAgZmlsbDogbm9uZTsKfQoKc3ZnLmVtYmVkZGVkSWNvbiBnLmljb24gcmVjdCB7CiAgICBzdHJva2U6IG5vbmU7CiAgICBmaWxsOiBub25lOwp9CgpzdmcuZW1iZWRkZWRJY29uIGcuaWNvbiAuZ2x5cGggewogICAgc3Ryb2tlOiBub25lOwogICAgZmlsbDogd2hpdGU7CiAgICBmaWxsLXJ1bGU6IGV2ZW5vZGQ7Cn0KCgovKiBTb3J0YWJsZSB0YWJsZSBoZWFkZXJzICovCi5saWdodCBkaXYudGFibGVDb2xTb3J0IHN2Zy5lbWJlZGRlZEljb24gLmljb24gLmdseXBoIHsKICAgIGZpbGw6IGJsYWNrOwp9Ci5kYXJrIGRpdi50YWJsZUNvbFNvcnQgc3ZnLmVtYmVkZGVkSWNvbiAuaWNvbiAuZ2x5cGggewogICAgZmlsbDogI2NjYzsKfQoKCi8qIGNvbG9yIHNjaGVtZXMgZm9yIHNwZWNpZmljIGljb24gY2xhc3NlcyAqLwoKc3ZnLmVtYmVkZGVkSWNvbiAuaWNvbi5hcHBJbmFjdGl2ZSAuZ2x5cGggewogICAgZmlsbDogbm9uZTsKfQoKLmxpZ2h0IHN2Zy5lbWJlZGRlZEljb24gLmljb24uYWN0aXZlIC5nbHlwaCB7CiAgICBmaWxsOiBncmVlbjsKfQouZGFyayBzdmcuZW1iZWRkZWRJY29uIC5pY29uLmFjdGl2ZSAuZ2x5cGggewogICAgZmlsbDogIzMwOEMxMDsKfQoKCi5saWdodCB0YWJsZSBzdmcuZW1iZWRkZWRJY29uIHsKICAgIGZpbGw6ICNjY2M7Cn0KLmRhcmsgdGFibGUgc3ZnLmVtYmVkZGVkSWNvbiB7CiAgICBmaWxsOiAjMjIyOwp9Ci5saWdodCB0YWJsZSBzdmcuZW1iZWRkZWRJY29uIC5nbHlwaCB7CiAgICBmaWxsOiAjMzMzOwp9Ci5kYXJrIHRhYmxlIHN2Zy5lbWJlZGRlZEljb24gLmdseXBoIHsKICAgIGZpbGw6ICNjY2M7Cn0KCi5saWdodCBzdmcuZW1iZWRkZWRJY29uIC5pY29uLmFjdGl2ZSAuZ2x5cGggewogICAgZmlsbDogZ3JlZW47Cn0KLmxpZ2h0IHN2Zy5lbWJlZGRlZEljb24gLmljb24uaW5hY3RpdmUgLmdseXBoIHsKICAgIGZpbGw6IGRhcmtyZWQ7Cn0KLmRhcmsgc3ZnLmVtYmVkZGVkSWNvbiAuaWNvbi5hY3RpdmUgLmdseXBoIHsKICAgIGZpbGw6ICMzMDhDMTA7Cn0KLmRhcmsgc3ZnLmVtYmVkZGVkSWNvbiAuaWNvbi5pbmFjdGl2ZSAuZ2x5cGggewogICAgZmlsbDogI0FEMkQyRDsKfQoNCo7x71bD6QEAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADRr1kAAQAY/B8CoBzbAqAdgltIf9TSHnpJTUlQYgBAPM5jNAAABAQgKALfivQBiKbOO8e9WGOwBABoEAAAaBAAAaPcoH9LFCAAnrR4TCABFAAQMf2dAAEAGJ57AqAdgwKgHNh/1ls8OvzRao2rzfIAYA/WT5QAAAQEICgBiKbQAt+K6SFRUUC8xLjEgMjAwIE9LDQpFVGFnOiAxNDU4NTY1Mzg2ODE5DQpDb250ZW50LVR5cGU6IHRleHQvY3NzDQpUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQozNTQNCi8qCiAqIENvcHlyaWdodCAyMDE0LDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gR2x5cGggU2VydmljZSAtLSBDU1MgZmlsZQogKi8KCnN2ZyAuZ2x5cGggewogICAgc3Ryb2tlOiBub25lOwogICAgZmlsbC1ydWxlOiBldmVub2RkOwp9CgoubGlnaHQgc3ZnIC5nbHlwaCwKLmRhcmsgc3ZnIC5nbHlwaC5vdmVybGF5IHsKICAgIGZpbGw6IGJsYWNrOwp9CgouZGFyayBzdmcgLmdseXBoLAoubGlnaHQgc3ZnIC5nbHlwaC5vdmVybGF5IHsKICAgIGZpbGw6IHdoaXRlOwp9Cg0KjvHvVubsAQBHAAAARwAAAGj3KB/SxQgAJ60eEwgARQAAOX9oQABABitwwKgHYMCoBzYf9ZbPDr84MqNq83yAGAP1kBIAAAEBCAoAYim0ALfiujANCg0KjvHvVlnuAQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANMRDQABABuaZwKgHNsCoB2CWzx/1o2rzfA6/ODeAECFmI0MAAAEBCAoAt+K9AGIptI7x71bG7wEAnQIAAJ0CAAAIACetHhNo9ygf0sUIAEUAAo/EREAAQAbkPcCoBzbAqAdgls8f9aNq83wOvzg3gBghZntaAAABAQgKALfivgBiKbRHRVQgL29ub3MvdWkvYXBwL2Z3L2xheWVyL2xvYWRpbmcuY3NzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiB0ZXh0L2NzcywqLyo7cT0wLjENClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQqO8e9W0fIBAPwDAAD8AwAAaPcoH9LFCAAnrR4TCABFAAPuf2lAAEAGJ7rAqAdgwKgHNh/1ls8Ovzg3o2r114AYA/+TxwAAAQEICgBiKbQAt+K+SFRUUC8xLjEgMjAwIE9LDQpFVGFnOiAxNDU4NTY1Mzg2ODE5DQpDb250ZW50LVR5cGU6IHRleHQvY3NzDQpUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQozMzYNCi8qCiAqICBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBMb2FkaW5nIFNlcnZpY2UgLS0gQ1NTIGZpbGUKICovCgojbG9hZGluZy1hbmltIHsKICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgIHRvcDogNTAlOwogICAgbGVmdDogNTAlOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOwp9Cg0KjvHvVhMiAgCbBQAAmwUAAGj3KB/SxQgAJ60eEwgARQAFjSwJQABABnl7wKgHYMCoBzYf9ZbTcoN2ZmEcja+AGAM8lWYAAAEBCAoAYim3ALfiu0hUVFAvMS4xIDIwMCBPSw0KRVRhZzogMTQ1ODU2NTM4NjgxOQ0KQ29udGVudC1UeXBlOiB0ZXh0L2Nzcw0KVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KNEQ1DQovKgogKiBDb3B5cmlnaHQgMjAxNCwyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIFBhbmVsIFNlcnZpY2UgLS0gQ1NTIGZpbGUKICovCgouZmxvYXRwYW5lbCB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB6LWluZGV4OiAxMDA7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIHRvcDogNjRweDsKICAgIHdpZHRoOiAyMDBweDsKICAgIHJpZ2h0OiAtMjIwcHg7CiAgICBvcGFjaXR5OiAwOwoKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBmb250LXNpemU6IDEwcHQ7CgogICAgLW1vei1ib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7Cn0KCi5mbG9hdHBhbmVsLmRpYWxvZyB7CiAgICB0b3A6IDE4MHB4Owp9CgpodG1sW2RhdGEtcGxhdGZvcm09J2lQYWQnXSAuZmxvYXRwYW5lbCB7CiAgICB0b3A6IDgwcHg7Cn0KCi5saWdodCAuZmxvYXRwYW5lbCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LDAuOCk7CiAgICBjb2xvcjogYmxhY2s7CiAgICBib3gtc2hhZG93OiAwIDJweCAxMnB4ICM3Nzc7Cn0KLmRhcmsgLmZsb2F0cGFuZWwgewogICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSg1MCw1MCw1MCwwLjgpOwogICAgY29sb3I6ICNjY2M7CiAgICBib3gtc2hhZG93OiAwIDJweCAxMnB4ICMwMDA7Cn0KDQqO8e9WcCICAEcAAABHAAAAaPcoH9LFCAAnrR4TCABFAAA5LApAAEAGfs7AqAdgwKgHNh/1ltNyg3u/YRyNr4AYAzyQEgAAAQEICgBiKbcAt+K7MA0KDQqO8e9WricCAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0ZLVAAEAGRijAqAc2wKgHYJbTH/VhHI2vcoN7xIAQBaQ/xAAAAQEICgC34sEAYim3jvHvVv0pAgBHAAAARwAAAGj3KB/SxQgAJ60eEwgARQAAOX9qQABABituwKgHYMCoBzYf9ZbPDr878aNq9deAGAP/kBIAAAEBCAoAYim4ALfivjANCg0KjvHvVtYqAgBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANMRFQABABuaXwKgHNsCoB2CWzx/1o2r11w6/O/aAECFmHSUAAAEBCAoAt+LBAGIptI7x71aULAIAlwIAAJcCAAAIACetHhNo9ygf0sUIAEUAAolktkAAQAZD0sCoBzbAqAdgltMf9WEcja9yg3vEgBgFpMUoAAABAQgKALfiwQBiKbdHRVQgL29ub3MvdWkvYXBwL2Z3L25hdi9uYXYuY3NzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiB0ZXh0L2NzcywqLyo7cT0wLjENClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQqO8e9W6i4CAPIEAADyBAAAaPcoH9LFCAAnrR4TCABFAATkiYpAAEAGHKPAqAdgwKgHNh/1ltBrO1im+T5FkIAYAv2UvQAAAQEICgBiKbgAt+K9SFRUUC8xLjEgMjAwIE9LDQpFVGFnOiAxNDU4NTY1Mzg2ODE5DQpDb250ZW50LVR5cGU6IHRleHQvY3NzDQpUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQo0MkMNCi8qCiAqIENvcHlyaWdodCAyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIFZlaWwgU2VydmljZSAtLSBDU1MgZmlsZQogKi8KCiN2ZWlsIHsKICAgIHotaW5kZXg6IDUwMDA7CiAgICBkaXNwbGF5OiBub25lOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAwOwogICAgbGVmdDogMDsKfQoKLmxpZ2h0ICN2ZWlsIHsKICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwwLDAsMC43NSk7Cn0KLmRhcmsgI3ZlaWwgewogICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSg2NCw2NCw2NCwwLjc1KTsKfQoKI3ZlaWwgLm1zZyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBwYWRkaW5nOiA2MHB4Owp9CgojdmVpbCAubXNnIHAgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBmb250LXNpemU6IDE0cHQ7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICBjb2xvcjogI2RkZDsKfQoKI3ZlaWwgc3ZnIC5nbHlwaCB7CiAgICBmaWxsOiAjMjIyOwp9Cg0KjvHvViQwAgBHAAAARwAAAGj3KB/SxQgAJ60eEwgARQAAOYmLQABABiFNwKgHYMCoBzYf9ZbQaztdVvk+RZCAGAL9kBIAAAEBCAoAYim4ALfivTANCg0KjvHvVlUxAgCdAgAAnQIAAAgAJ60eE2j3KB/SxQgARQACj8RGQABABuQ7wKgHNsCoB2CWzx/1o2r11w6/O/aAGCFmoukAAAEBCAoAt+LCAGIptEdFVCAvb25vcy91aS9hcHAvZncvd2lkZ2V0L2J1dHRvbi5jc3MgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6IHRleHQvY3NzLCovKjtxPTAuMQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71ZdMQIAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADRfyEAAQAZLFcCoBzbAqAdgltAf9fk+RZBrO11bgBAFpBVzAAABAQgKALfiwgBiKbiO8e9WLDMCALEFAACxBQAAaPcoH9LFCAAnrR4TCABFAAWjgX9AAEAGI+/AqAdgwKgHNh/1ltShr2E0QN4P8IAYA1mVfAAAAQEICgBiKbgAt+K9SFRUUC8xLjEgMjAwIE9LDQpFVGFnOiAxNDU4NTY1Mzg2ODE5DQpDb250ZW50LVR5cGU6IHRleHQvY3NzDQpUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQo0RUINCi8qCiAqIENvcHlyaWdodCAyMDE0LDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gUXVpY2sgSGVscCBTZXJ2aWNlIC0tIENTUyBmaWxlCiAqLwoKI3F1aWNraGVscCB7CiAgICB6LWluZGV4OiAxMzAwOwp9CgojcXVpY2toZWxwIHN2ZyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDE4MHB4OwogICAgb3BhY2l0eTogMTsKfQoKI3F1aWNraGVscCBzdmcgZy5oZWxwIHJlY3QgewogICAgZmlsbDogYmxhY2s7CiAgICBvcGFjaXR5OiAwLjc7Cn0KCiNxdWlja2hlbHAgc3ZnIHRleHQudGl0bGUgewogICAgZm9udC1zaXplOiAxMHB0OwogICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgIGZpbGw6ICM5OTk7Cn0KCiNxdWlja2hlbHAgc3ZnIGcua2V5SXRlbSB7CiAgICBmaWxsOiB3aGl0ZTsKfQoKI3F1aWNraGVscCBzdmcgZyBsaW5lLnFocm93c2VwIHsKICAgIHN0cm9rZTogIzg4ODsKICAgIHN0cm9rZS1kYXNoYXJyYXk6IDIgMjsKfQoKI3F1aWNraGVscCBzdmcgdGV4dCB7CiAgICBmb250LXNpemU6IDdwdDsKICAgIGFsaWdubWVudC1iYXNlbGluZTogbWlkZGxlOwp9CgojcXVpY2toZWxwIHN2ZyB0ZXh0LmtleSB7CiAgICBmaWxsOiAjYWRkOwp9CgojcXVpY2toZWxwIHN2ZyB0ZXh0LmRlc2MgewogICAgZmlsbDogI2RkZDsKfQoKDQqO8e9WUjMCAEcAAABHAAAAaPcoH9LFCAAnrR4TCABFAAA5gYBAAEAGKVjAqAdgwKgHNh/1ltShr2ajQN4P8IAYA1mQEgAAAQEICgBiKbgAt+K9MA0KDQqO8e9WDDQCAJ4CAACeAgAACAAnrR4TaPcoH9LFCABFAAKQX8lAAEAGSLjAqAc2wKgHYJbQH/X5PkWQaztdW4AYBaT1hQAAAQEICgC34sIAYim4R0VUIC9vbm9zL3VpL2FwcC9mdy93aWRnZXQvdG9vbGJhci5jc3MgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6IHRleHQvY3NzLCovKjtxPTAuMQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71ZLNwIAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADTicUAAQAbIa8CoBzbAqAdgltQf9UDeD/Chr2aogBAHoMGyAAABAQgKALfiwgBiKbiO8e9WtTgCAJ4CAACeAgAACAAnrR4TaPcoH9LFCABFAAKQ4nJAAEAGxg7AqAc2wKgHYJbUH/VA3g/woa9mqIAYB6CZtQAAAQEICgC34sIAYim4R0VUIC9vbm9zL3VpL2FwcC9mdy93aWRnZXQvdG9vbHRpcC5jc3MgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6IHRleHQvY3NzLCovKjtxPTAuMQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71a4OgIARwAAAEcAAABo9ygf0sUIACetHhMIAEUAADkpGkAAQAaBvsCoB2DAqAc2H/WW0lNSVBg0h56SgBgDrZASAAABAQgKAGIpuQC34r0wDQoNCo7x71Z6PAIAnAIAAJwCAAAIACetHhNo9ygf0sUIAEUAAo5r10AAQAY8rMCoBzbAqAdgltIf9TSHnpJTUlQdgBgPM+hOAAABAQgKALfiwgBiKblHRVQgL29ub3MvdWkvYXBwL2Z3L3dpZGdldC90YWJsZS5jc3MgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6IHRleHQvY3NzLCovKjtxPTAuMQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71YJPgIA7wQAAO8EAABo9ygf0sUIACetHhMIAEUABOGBgUAAQAYkr8CoB2DAqAc2H/WW1KGvZqhA3hJMgBgDY5S6AAABAQgKAGIpuQC34sJIVFRQLzEuMSAyMDAgT0sNCkVUYWc6IDE0NTg1NjUzODY4MTkNCkNvbnRlbnQtVHlwZTogdGV4dC9jc3MNClRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCjQyOQ0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gVG9vbHRpcCBTZXJ2aWNlIC0tIENTUyBmaWxlCiAqLwoKI3Rvb2x0aXAgewogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgZm9udC1zaXplOiA4MCU7CiAgICBib3JkZXI6IDFweCBzb2xpZDsKICAgIHBhZGRpbmc6IDVweDsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHotaW5kZXg6IDUwMDA7CiAgICBkaXNwbGF5OiBub25lOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi8qIGNvbG9ycyBzdWJqZWN0IHRvIGNoYW5nZSAqLwoKLmxpZ2h0ICN0b29sdGlwIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7CiAgICBjb2xvcjogIzQ0NDsKICAgIGJvcmRlci1jb2xvcjogI2NjYzsKfQoKLmRhcmsgI3Rvb2x0aXAgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzE1MTUxNTsKICAgIGNvbG9yOiAjQjJCMkIyOwogICAgYm9yZGVyLWNvbG9yOiAjMjUyNTI1Owp9DQqO8e9Wlz4CAEcAAABHAAAAaPcoH9LFCAAnrR4TCABFAAA5gYJAAEAGKVbAqAdgwKgHNh/1ltShr2tVQN4STIAYA2OQEgAAAQEICgBiKbkAt+LCMA0KDQqO8e9WzEACAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA04nNAAEAGyGnAqAc2wKgHYJbUH/VA3hJMoa9rWoAQB6C6ogAAAQEICgC34sMAYim5jvHvVglCAgCQAgAAkAIAAAgAJ60eE2j3KB/SxQgARQACguJ0QABABsYawKgHNsCoB2CW1B/1QN4STKGva1qAGAegSIsAAAEBCAoAt+LDAGIpuUdFVCAvb25vcy91aS9hcHAvdmlldy90b3BvL3RvcG9Nb2RlbC5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0KjvHvVghZAgDaJwAA2icAAGj3KB/SxQgAJ60eEwgARQAnzIGDQABABgHCwKgHYMCoBzYf9ZbUoa9rWkDeFJqAEANtt6UAAAEBCAoAYim5ALfiw0hUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2phdmFzY3JpcHQNCkNvbnRlbnQtTGVuZ3RoOiAxNDA2OQ0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBUb3BvbG9neSBNb2RlbCBNb2R1bGUuCiBBdXhpbGlhcnkgZnVuY3Rpb25zIGZvciB0aGUgbW9kZWwgb2YgdGhlIHRvcG9sb2d5OyB0aGF0IGlzLCBvdXIgaW50ZXJuYWwKICByZXByZXNlbnRhdGlvbnMgb2YgZGV2aWNlcywgaG9zdHMsIGxpbmtzLCBldGMuCiAqLwoKKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBpbmplY3RlZCByZWZzCiAgICB2YXIgJGxvZywgZnMsIHJuZDsKCiAgICAvLyBhcGkgdG8gdG9wb0ZvcmNlCiAgICB2YXIgYXBpOwogICAgLyoKICAgICAgIHByb2plY3Rpb24oKQogICAgICAgbmV0d29yayB7Li4ufQogICAgICAgcmVzdHlsZUxpbmtFbGVtZW50KCBsZGF0YSApCiAgICAgICByZW1vdmVMaW5rRWxlbWVudCggbGRhdGEgKQogICAgICovCgogICAgLy8gc2hvcnRoYW5kCiAgICB2YXIgbHUsIHJsaywgbm9kZXMsIGxpbmtzLCBsaW5rc0J5RGV2aWNlOwoKICAgIHZhciBkaW07ICAgIC8vIGRpbWVuc2lvbnMgb2YgbGF5b3V0IFt3LGhdCgogICAgLy8gY29uZmlndXJhdGlvbiAnY29uc3RhbnRzJwogICAgdmFyIGRlZmF1bHRMaW5rVHlwZSA9ICdkaXJlY3QnLAogICAgICAgIG5lYXJEaXN0ID0gMTU7CgoKICAgIGZ1bmN0aW9uIGNvb3JkRnJvbUxuZ0xhdChsb2MpIHsKICAgICAgICB2YXIgcCA9IGFwaS5wcm9qZWN0aW9uKCk7CiAgICAgICAgLy8gc3VzcGVjdGVkIGNhdXNlIG9mIE9OT1MtMjEwOQogICAgICAgIHJldHVybiBwID8gcChbbG9jLmxuZywgbG9jLmxhdF0pIDogWzAsIDBdOwogICAgfQoKICAgIGZ1bmN0aW9uIGxuZ0xhdEZyb21Db29yZChjb29yZCkgewogICAgICAgIHZhciBwID0gYXBpLnByb2plY3Rpb24oKTsKICAgICAgICByZXR1cm4gcCA/IHAuaW52ZXJ0KGNvb3JkKSA6IFswLCAwXTsKICAgIH0KCiAgICBmdW5jdGlvbiBwb3NpdGlvbk5vZGUobm9kZSwgZm9yVXBkYXRlKSB7CiAgICAgICAgdmFyIG1ldGEgPSBub2RlLm1ldGFVaSwKICAgICAgICAgICAgeCA9IG1ldGEgJiYgbWV0YS54LAogICAgICAgICAgICB5ID0gbWV0YSAmJiBtZXRhLnksCiAgICAgICAgICAgIHh5OwoKICAgICAgICAvLyBpZiB0aGUgZGV2aWNlIGNvbnRhaW5zIGV4cGxpY2l0IExPTkcvTEFUIGRhdGEsIHVzZSB0aGF0IHRvIHBvc2l0aW9uCiAgICAgICAgaWYgKHNldExvbmdMYXQobm9kZSkpIHsKICAgICAgICAgICAgLy8gaW5kaWNhdGUgd2Ugd2FudCB0byB1cGRhdGUgY2FjaGVkIG1ldGEgZGF0YS4uLgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIC8vIGVsc2UgaWYgd2UgaGF2ZSBbeCx5XSBjYWNoZWQgaW4gbWV0YSBkYXRhLCB1c2UgdGhhdC4uLgogICAgICAgIGlmICh4ICYmIHkpIHsKICAgICAgICAgICAgbm9kZS5maXhlZCA9IHRydWU7CiAgICAgICAgICAgIG5vZGUucHggPSBub2RlLnggPSB4OwogICAgICAgICAgICBub2RlLnB5ID0gbm9kZS55ID0geTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gaWYgdGhpcyBpcyBhIG5vZGUgdXBkYXRlIChub3QgYSBub2RlIGFkZCkuLiBza2lwIHJhbmRvbWl6ZXIKICAgICAgICBpZiAoZm9yVXBkYXRlKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIE5vdGU6IFBsYWNpbmcgaW5jb21pbmcgdW5waW5uZWQgbm9kZXMgYXQgZXhhY3RseSB0aGUgc2FtZSBwb2ludAogICAgICAgIC8vICAgICAgICAoY2VudGVyIG9mIHRoZSB2aWV3KSBjYXVzZXMgdGhlbSB0byBleHBsb2RlIG91dHdhcmRzIHdoZW4KICAgICAgICAvLyAgICAgICAgdGhlIGZvcmNlIGxheW91dCBraWNrcyBpbi4gU28sIHdlIHNwcmVhZCB0aGVtIG91dCBhIGJpdAogICAgICAgIC8vICAgICAgICBpbml0aWFsbHksIHRvIHByb3ZpZGUgYSBtb3JlIHNlcmVuZSBsYXlvdXQgY29udmVyZ2VuY2UuCiAgICAgICAgLy8gICAgICAgQWRkaXRpb25hbGx5LCBpZiB0aGUgbm9kZSBpcyBhIGhvc3QsIHdlIHBsYWNlIGl0IG5lYXIKICAgICAgICAvLyAgICAgICAgdGhlIGRldmljZSBpdCBpcyBjb25uZWN0ZWQgdG8uCgogICAgICAgIGZ1bmN0aW9uIHJhbmQoKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICB4OiBybmQucmFuZERpbShkaW1bMF0pLAogICAgICAgICAgICAgICAgeTogcm5kLnJhbmREaW0oZGltWzFdKQogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gbmVhcihub2RlKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICB4OiBub2RlLnggKyBuZWFyRGlzdCArIHJuZC5zcHJlYWQobmVhckRpc3QpLAogICAgICAgICAgICAgICAgeTogbm9kZS55ICsgbmVhckRpc3QgKyBybmQuc3ByZWFkKG5lYXJEaXN0KQogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZ2V0RGV2aWNlKGNwKSB7CiAgICAgICAgICAgIHZhciBkID0gbHVbY3AuZGV2aWNlXTsKICAgICAgICAgICAgcmV0dXJuIGQgfHwgcmFuZCgpOwogICAgICAgIH0KCiAgICAgICAgeHkgPSAobm9kZS5jbGFzcyA9PT0gJ2hvc3QnKSA/IG5lYXIoZ2V0RGV2aWNlKG5vZGUuY3ApKSA6IHJhbmQoKTsKICAgICAgICBhbmd1bGFyLmV4dGVuZChub2RlLCB4eSk7CiAgICB9CgogICAgZnVuY3Rpb24gc2V0TG9uZ0xhdChub2RlKSB7CiAgICAgICAgdmFyIGxvYyA9IG5vZGUubG9jYXRpb24sCiAgICAgICAgICAgIGNvb3JkOwoKICAgICAgICBpZiAobG9jICYmIGxvYy50eXBlID09PSAnbG5nbGF0JykgewogICAgICAgICAgICBjb29yZCA9IGNvb3JkRnJvbUxuZ0xhdChsb2MpOwogICAgICAgICAgICBub2RlLmZpeGVkID0gdHJ1ZTsKICAgICAgICAgICAgbm9kZS5weCA9IG5vZGUueCA9IGNvb3JkWzBdOwogICAgICAgICAgICBub2RlLnB5ID0gbm9kZS55ID0gY29vcmRbMV07CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiByZXNldEFsbExvY2F0aW9ucygpIHsKICAgICAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIHNldExvbmdMYXQoZCk7CiAgICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gbWtTdmdDbHMoZGgsIHQsIG9uKSB7CiAgICAgICAgdmFyIG5kaCA9ICdub2RlICcgKyBkaCwKICAgICAgICAgICAgbmRodCA9IHQgPyBuZGggKyAnICcgKyB0IDogbmRoOwogICAgICAgIHJldHVybiBvbiA/IG5kaHQgKyAnIG9ubGluZScgOiBuZGh0OwogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0ZURldmljZU5vZGUoZGV2aWNlKSB7CiAgICAgICAgdmFyIG5vZGUgPSBkZXZpY2U7CgogICAgICAgIC8vIEF1Z21lbnQgYXMgbmVlZGVkLi4uCiAgICAgICAgbm9kZS5jbGFzcyA9ICdkZXZpY2UnOwogICAgICAgIG5vZGUuc3ZnQ2xhc3MgPSBta1N2Z0NscygnZGV2aWNlJywgZGV2aWNlLnR5cGUsIGRldmljZS5vbmxpbmUpOwogICAgICAgIHBvc2l0aW9uTm9kZShub2RlKTsKICAgICAgICByZXR1cm4gbm9kZTsKICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdGVIb3N0Tm9kZShob3N0KSB7CiAgICAgICAgdmFyIG5vZGUgPSBob3N0OwoKICAgICAgICAvLyBBdWdtZW50IGFzIG5lZWRlZC4uLgogICAgICAgIG5vZGUuY2xhc3MgPSAnaG9zdCc7CiAgICAgICAgaWYgKCFub2RlLnR5cGUpIHsKICAgICAgICAgICAgbm9kZS50eXBlID0gJ2VuZHN0YXRpb24nOwogICAgICAgIH0KICAgICAgICBub2RlLnN2Z0NsYXNzID0gbWtTdmdDbHMoJ2hvc3QnLCBub2RlLnR5cGUpOwogICAgICAgIHBvc2l0aW9uTm9kZShub2RlKTsKICAgICAgICByZXR1cm4gbm9kZTsKICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdGVIb3N0TGluayhob3N0KSB7CiAgICAgICAgdmFyIHNyYyA9IGhvc3QuaWQsCiAgICAgICAgICAgIGRzdCA9IGhvc3QuY3AuZGV2aWNlLAogICAgICAgICAgICBpZCA9IGhvc3QuaW5ncmVzcywKICAgICAgICAgICAgbG5rID0gbGlua0VuZFBvaW50cyhzcmMsIGRzdCk7CgogICAgICAgIGlmICghbG5rKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgLy8gU3ludGhlc2l6ZSBsaW5rIC4uLgogICAgICAgIGFuZ3VsYXIuZXh0ZW5kKGxuaywgewogICAgICAgICAgICBrZXk6IGlkLAogICAgICAgICAgICBjbGFzczogJ2xpbmsnLAogICAgICAgICAgICAvLyBOT1RFOiBzcmNQb3J0IGxlZnQgdW5kZWZpbmVkIChob3N0IGVuZCBvZiB0aGUgbGluaykKICAgICAgICAgICAgdGd0UG9ydDogaG9zdC5jcC5wb3J0LAoKICAgICAgICAgICAgdHlwZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gJ2hvc3RMaW5rJzsgfSwKICAgICAgICAgICAgZXhwZWN0ZWQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH0sCiAgICAgICAgICAgIG9ubGluZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgLy8gaG9zdGxpbmsgdGFyZ2V0IGlzIGVkZ2Ugc3dpdGNoCiAgICAgICAgICAgICAgICByZXR1cm4gbG5rLnRhcmdldC5vbmxpbmU7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGxpbmtXaWR0aDogZnVuY3Rpb24gKCkgeyByZXR1cm4gMTsgfQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBsbms7CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRlTGluayhsaW5rKSB7CiAgICAgICAgdmFyIGxuayA9IGxpbmtFbmRQb2ludHMobGluay5zcmMsIGxpbmsuZHN0KTsKCiAgICAgICAgaWYgKCFsbmspIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICBhbmd1bGFyLmV4dGVuZChsbmssIHsKICAgICAgICAgICAga2V5OiBsaW5rLmlkLAogICAgICAgICAgICBjbGFzczogJ2xpbmsnLAogICAgICAgICAgICBmcm9tU291cmNlOiBsaW5rLAogICAgICAgICAgICBzcmNQb3J0OiBsaW5rLnNyY1BvcnQsCiAgICAgICAgICAgIHRndFBvcnQ6IGxpbmsuZHN0UG9ydCwKICAgICAgICAgICAgcG9zaXRpb246IHsKICAgICAgICAgICAgICAgIHgxOiAwLAogICAgICAgICAgICAgICAgeTE6IDAsCiAgICAgICAgICAgICAgICB4MjogMCwKICAgICAgICAgICAgICAgIHkyOiAwCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBmdW5jdGlvbnMgdG8gYWdncmVnYXRlIGR1YWwgbGluayBzdGF0ZQogICAgICAgICAgICB0eXBlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgcyA9IGxuay5mcm9tU291cmNlLAogICAgICAgICAgICAgICAgICAgIHQgPSBsbmsuZnJvbVRhcmdldDsKICAgICAgICAgICAgICAgIHJldHVybiAocyAmJiBzLnR5cGUpIHx8ICh0ICYmIHQudHlwZSkgfHwgZGVmYXVsdExpbmtUeXBlOwogICAgICAgICAgICB9LAogICAgICAgICAgICBleHBlY3RlZDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIHMgPSBsbmsuZnJvbVNvdXJjZSwKICAgICAgICAgICAgICAgICAgICB0ID0gbG5rLmZyb21UYXJnZXQ7CiAgICAgICAgICAgICAgICByZXR1cm4gKHMgJiYgcy5leHBlY3RlZCkgJiYgKHQgJiYgdC5leHBlY3RlZCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG9ubGluZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIHMgPSBsbmsuZnJvbVNvdXJjZSwKICAgICAgICAgICAgICAgICAgICB0ID0gbG5rLmZyb21UYXJnZXQsCiAgICAgICAgICAgICAgICAgICAgYm90aCA9IGxuay5zb3VyY2Uub25saW5lICYmIGxuay50YXJnZXQub25saW5lOwogICAgICAgICAgICAgICAgcmV0dXJuIGJvdGggJiYgKHMgJiYgcy5vbmxpbmUpICYmICh0ICYmIHQub25saW5lKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbGlua1dpZHRoOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgcyA9IGxuay5mcm9tU291cmNlLAogICAgICAgICAgICAgICAgICAgIHQgPSBsbmsuZnJvbVRhcmdldCwKICAgICAgICAgICAgICAgICAgICB3cyA9IChzICYmIHMubGlua1dpZHRoKSB8fCAwLAogICAgICAgICAgICAgICAgICAgIHd0ID0gKHQgJiYgdC5saW5rV2lkdGgpIHx8IDA7CiAgICAgICAgICAgICAgICByZXR1cm4gbG5rLnBvc2l0aW9uLm11bHRpTGluayA/IDUgOiBNYXRoLm1heCh3cywgd3QpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGxuazsKICAgIH0KCgogICAgZnVuY3Rpb24gbGlua0VuZFBvaW50cyhzcmNJZCwgZHN0SWQpIHsKICAgICAgICB2YXIgc3JjTm9kZSA9IGx1W3NyY0lkXSwKICAgICAgICAgICAgZHN0Tm9kZSA9IGx1W2RzdElkXSwKICAgICAgICAgICAgc01pc3MgPSAhc3JjTm9kZSA/IG1pc3NNc2coJ3NyYycsIHNyY0lkKSA6ICcnLAogICAgICAgICAgICBkTWlzcyA9ICFkc3ROb2RlID8gbWlzc01zZygnZHN0JywgZHN0SWQpIDogJyc7CgogICAgICAgIGlmIChzTWlzcyB8fCBkTWlzcykgewogICAgICAgICAgICAkbG9nLmVycm9yKCdOb2RlKHMpIG5vdCBvbiBtYXAgZm9yIGxpbms6JyArIHNNaXNzICsgZE1pc3MpOwogICAgICAgICAgICAvL2xvZ2ljRXJyb3IoJ05vZGUocykgbm90IG9uIG1hcCBmb3IgbGluazpcbicgKyBzTWlzcyArIGRNaXNzKTsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHNvdXJjZTogc3JjTm9kZSwKICAgICAgICAgICAgdGFyZ2V0OiBkc3ROb2RlCiAgICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBtaXNzTXNnKHdoYXQsIGlkKSB7CiAgICAgICAgcmV0dXJuICdcblsnICsgd2hhdCArICddICInICsgaWQgKyAnIiBtaXNzaW5nJzsKICAgIH0KCgogICAgZnVuY3Rpb24gbWFrZU5vZGVLZXkoZCwgd2hhdCkgewogICAgICAgIHZhciBwb3J0ID0gd2hhdCArICdQb3J0JzsKICAgICAgICByZXR1cm4gZFt3aGF0XSArICcvJyArIGRbcG9ydF07CiAgICB9CgogICAgZnVuY3Rpb24gbWFrZUxpbmtLZXkoZCwgZmxpcHBlZCkgewogICAgICAgIHZhciBvbmUgPSBmbGlwcGVkID8gbWFrZU5vZGVLZXkoZCwgJ2RzdCcpIDogbWFrZU5vZGVLZXkoZCwgJ3NyYycpLAogICAgICAgICAgICB0d28gPSBmbGlwcGVkID8gbWFrZU5vZGVLZXkoZCwgJ3NyYycpIDogbWFrZU5vZGVLZXkoZCwgJ2RzdCcpOwogICAgICAgIHJldHVybiBvbmUgKyAnLScgKyB0d287CiAgICB9CgogICAgZnVuY3Rpb24gZmluZExpbmtCeUlkKGlkKSB7CiAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYSByZXZlcnNlIGxvb2t1cCwgZWxzZSBkZWZhdWx0IHRvIGdpdmVuIGlkCiAgICAgICAgdmFyIGtleSA9IHJsa1tpZF0gfHwgaWQ7CiAgICAgICAgcmV0dXJuIGtleSAmJiBsdVtrZXldOwogICAgfQoKICAgIGZ1bmN0aW9uIGZpbmRMaW5rKGxpbmtEYXRhLCBvcCkgewogICAgICAgIHZhciBrZXkgPSBtYWtlTGlua0tleShsaW5rRGF0YSksCiAgICAgICAgICAgIGtleXJldiA9IG1ha2VMaW5rS2V5KGxpbmtEYXRhLCAxKSwKICAgICAgICAgICAgbGluayA9IGx1W2tleV0sCiAgICAgICAgICAgIGxpbmtSZXYgPSBsdVtrZXlyZXZdLAogICAgICAgICAgICByZXN1bHQgPSB7fSwKICAgICAgICAgICAgbGRhdGEgPSBsaW5rIHx8IGxpbmtSZXYsCiAgICAgICAgICAgIHJhd0xpbms7CgogICAgICAgIGlmIChvcCA9PT0gJ2FkZCcpIHsKICAgICAgICAgICAgaWYgKGxpbmspIHsKICAgICAgICAgICAgICAgIC8vIHRyeWluZyB0byBhZGQgYSBsaW5rIHRoYXQgd2UgYWxyZWFkeSBrbm93IGFib3V0CiAgICAgICAgICAgICAgICByZXN1bHQubGRhdGEgPSBsaW5rOwogICAgICAgICAgICAgICAgcmVzdWx0LmJhZExvZ2ljID0gJ2FkZExpbms6IGxpbmsgYWxyZWFkeSBhZGRlZCc7CgogICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmtSZXYpIHsKICAgICAgICAgICAgICAgIC8vIHdlIGZvdW5kIHRoZSByZXZlcnNlIG9mIHRoZSBsaW5rIHRvIGJlIGFkZGVkCiAgICAgICAgICAgICAgICByZXN1bHQubGRhdGEgPSBsaW5rUmV2OwogICAgICAgICAgICAgICAgaWYgKGxpbmtSZXYuZnJvbVRhcmdldCkgewogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5iYWRMb2dpYyA9ICdhZGRMaW5rOiBsaW5rIGFscmVhZHkgYWRkZWQnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChvcCA9PT0gJ3VwZGF0ZScpIHsKICAgICAgICAgICAgaWYgKCFsZGF0YSkgewogICAgICAgICAgICAgICAgcmVzdWx0LmJhZExvZ2ljID0gJ3VwZGF0ZUxpbms6IGxpbmsgbm90IGZvdW5kJzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJhd0xpbmsgPSBsaW5rID8gbGRhdGEuZnJvbVNvdXJjZSA6IGxkYXRhLmZyb21UYXJnZXQ7CiAgICAgICAgICAgICAgICByZXN1bHQudXBkYXRlV2l0aCA9IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgYW5ndWxhci5leHRlbmQocmF3TGluaywgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgYXBpLnJlc3R5bGVMaW5rRWxlbWVudChsZGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKG9wID09PSAncmVtb3ZlJykgewogICAgICAgICAgICBpZiAoIWxkYXRhKSB7CiAgICAgICAgICAgICAgICByZXN1bHQuYmFkTG9naWMgPSAncmVtb3ZlTGluazogbGluayBub3QgZm91bmQnOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmF3TGluayA9IGxpbmsgPyBsZGF0YS5mcm9tU291cmNlIDogbGRhdGEuZnJvbVRhcmdldDsKCiAgICAgICAgICAgICAgICBpZiAoIXJhd0xpbmspIHsKICAgICAgICAgICAgICAgICAgICByZXN1bHQuYmFkTG9naWMgPSAncmVtb3ZlTGluazogbGluayBub3QgZm91bmQnOwoKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJlbW92ZVJhd0xpbmsgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBsaW5rIG91dCBvZiBhZ2dyZWdhdGUgbGlua3NCeURldmljZSBsaXN0CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsaW5rc0ZvckRldlBhaXIgPSBsaW5rc0J5RGV2aWNlW2xkYXRhLmRldmljZVBhaXJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm12SWR4ID0gZnMuZmluZChsZGF0YS5rZXksIGxpbmtzRm9yRGV2UGFpciwgJ2tleScpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocm12SWR4ID49IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtzRm9yRGV2UGFpci5zcGxpY2Uocm12SWR4LCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBsZGF0YS5wb3NpdGlvbi5tdWx0aWxpbmsgPSBsaW5rc0ZvckRldlBhaXIubGVuZ3RoID49IDU7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb21Tb3VyY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxkYXRhLmZyb21Tb3VyY2UgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgjvHvVtdZAgBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANOJ1QABABshnwKgHNsCoB2CW1B/1QN4UmqGvkvKAEAeKkNEAAAEBCAoAt+LEAGIpuY7x71b2WgIACRAAAAkQAABo9ygf0sUIACetHhMIAEUAD/uBikAAQAYZjMCoB2DAqAc2H/WW1KGvkvJA3hSagBgDbZ/UAAABAQgKAGIpuwC34sMgICAgICBpZiAobGRhdGEuZnJvbVRhcmdldCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb21vdGUgdGFyZ2V0IGludG8gc291cmNlIHBvc2l0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGRhdGEuZnJvbVNvdXJjZSA9IGxkYXRhLmZyb21UYXJnZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGRhdGEuZnJvbVRhcmdldCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGRhdGEua2V5ID0ga2V5cmV2OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBsdVtrZXldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx1W2tleXJldl0gPSBsZGF0YTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcmxrW2tleXJldl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgZnJvbVRhcmdldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGRhdGEuZnJvbVRhcmdldCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcmxrW2tleXJldl07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxkYXRhLmZyb21Tb3VyY2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaS5yZXN0eWxlTGlua0VsZW1lbnQobGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpLnJlbW92ZUxpbmtFbGVtZW50KGxkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIGZ1bmN0aW9uIGZpbmREZXZpY2VzKG9mZmxpbmVPbmx5KSB7CiAgICAgICAgdmFyIGEgPSBbXTsKICAgICAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIGlmIChkLmNsYXNzID09PSAnZGV2aWNlJyAmJiAhKG9mZmxpbmVPbmx5ICYmIGQub25saW5lKSkgewogICAgICAgICAgICAgICAgYS5wdXNoKGQpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGE7CiAgICB9CgogICAgZnVuY3Rpb24gZmluZEF0dGFjaGVkSG9zdHMoZGV2SWQpIHsKICAgICAgICB2YXIgaG9zdHMgPSBbXTsKICAgICAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIGlmIChkLmNsYXNzID09PSAnaG9zdCcgJiYgZC5jcC5kZXZpY2UgPT09IGRldklkKSB7CiAgICAgICAgICAgICAgICBob3N0cy5wdXNoKGQpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGhvc3RzOwogICAgfQoKICAgIGZ1bmN0aW9uIGZpbmRBdHRhY2hlZExpbmtzKGRldklkKSB7CiAgICAgICAgdmFyIGxua3MgPSBbXTsKICAgICAgICBsaW5rcy5mb3JFYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIGlmIChkLnNvdXJjZS5pZCA9PT0gZGV2SWQgfHwgZC50YXJnZXQuaWQgPT09IGRldklkKSB7CiAgICAgICAgICAgICAgICBsbmtzLnB1c2goZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICByZXR1cm4gbG5rczsKICAgIH0KCiAgICAvLyByZXR1cm5zIG9uZS13YXkgbGlua3Mgb3Igd2hlcmUgdGhlIGludGVybmFsIGxpbmsgdHlwZXMgZGlmZmVyCiAgICBmdW5jdGlvbiBmaW5kQmFkTGlua3MoKSB7CiAgICAgICAgdmFyIGxua3MgPSBbXSwKICAgICAgICAgICAgc3JjLCB0Z3Q7CiAgICAgICAgbGlua3MuZm9yRWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAvLyBOT1RFOiBza2lwIGVkZ2UgbGlua3MsIHdoaWNoIGFyZSBzeW50aGVzaXplZAogICAgICAgICAgICBpZiAoZC50eXBlKCkgIT09ICdob3N0TGluaycpIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSBkLmJhZDsKICAgICAgICAgICAgICAgIHNyYyA9IGQuZnJvbVNvdXJjZTsKICAgICAgICAgICAgICAgIHRndCA9IGQuZnJvbVRhcmdldDsKICAgICAgICAgICAgICAgIGlmIChzcmMgJiYgIXRndCkgewogICAgICAgICAgICAgICAgICAgIGQuYmFkID0gJ21pc3NpbmcgbGluayc7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNyYy50eXBlICE9PSB0Z3QudHlwZSkgewogICAgICAgICAgICAgICAgICAgIGQuYmFkID0gJ3R5cGUgbWlzbWF0Y2gnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGQuYmFkKSB7CiAgICAgICAgICAgICAgICAgICAgbG5rcy5wdXNoKGQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGxua3M7CiAgICB9CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIE1vZHVsZSBkZWZpbml0aW9uCgogICAgYW5ndWxhci5tb2R1bGUoJ292VG9wbycpCiAgICAuZmFjdG9yeSgnVG9wb01vZGVsU2VydmljZScsCiAgICAgICAgWyckbG9nJywgJ0ZuU2VydmljZScsICdSYW5kb21TZXJ2aWNlJywKCiAgICAgICAgZnVuY3Rpb24gKF8kbG9nXywgX2ZzXywgX3JuZF8pIHsKICAgICAgICAgICAgJGxvZyA9IF8kbG9nXzsKICAgICAgICAgICAgZnMgPSBfZnNfOwogICAgICAgICAgICBybmQgPSBfcm5kXzsKCiAgICAgICAgICAgIGZ1bmN0aW9uIGluaXRNb2RlbChfYXBpXywgX2RpbV8pIHsKICAgICAgICAgICAgICAgIGFwaSA9IF9hcGlfOwogICAgICAgICAgICAgICAgZGltID0gX2RpbV87CiAgICAgICAgICAgICAgICBsdSA9IGFwaS5uZXR3b3JrLmxvb2t1cDsKICAgICAgICAgICAgICAgIHJsayA9IGFwaS5uZXR3b3JrLnJldkxpbmtUb0tleTsKICAgICAgICAgICAgICAgIG5vZGVzID0gYXBpLm5ldHdvcmsubm9kZXM7CiAgICAgICAgICAgICAgICBsaW5rcyA9IGFwaS5uZXR3b3JrLmxpbmtzOwogICAgICAgICAgICAgICAgbGlua3NCeURldmljZSA9IGFwaS5uZXR3b3JrLmxpbmtzQnlEZXZpY2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZ1bmN0aW9uIG5ld0RpbShfZGltXykgewogICAgICAgICAgICAgICAgZGltID0gX2RpbV87CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZ1bmN0aW9uIGRlc3Ryb3lNb2RlbCgpIHsgfQoKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGluaXRNb2RlbDogaW5pdE1vZGVsLAogICAgICAgICAgICAgICAgbmV3RGltOiBuZXdEaW0sCiAgICAgICAgICAgICAgICBkZXN0cm95TW9kZWw6IGRlc3Ryb3lNb2RlbCwKCiAgICAgICAgICAgICAgICBwb3NpdGlvbk5vZGU6IHBvc2l0aW9uTm9kZSwKICAgICAgICAgICAgICAgIHJlc2V0QWxsTG9jYXRpb25zOiByZXNldEFsbExvY2F0aW9ucywKICAgICAgICAgICAgICAgIGNyZWF0ZURldmljZU5vZGU6IGNyZWF0ZURldmljZU5vZGUsCiAgICAgICAgICAgICAgICBjcmVhdGVIb3N0Tm9kZTogY3JlYXRlSG9zdE5vZGUsCiAgICAgICAgICAgICAgICBjcmVhdGVIb3N0TGluazogY3JlYXRlSG9zdExpbmssCiAgICAgICAgICAgICAgICBjcmVhdGVMaW5rOiBjcmVhdGVMaW5rLAogICAgICAgICAgICAgICAgY29vcmRGcm9tTG5nTGF0OiBjb29yZEZyb21MbmdMYXQsCiAgICAgICAgICAgICAgICBsbmdMYXRGcm9tQ29vcmQ6IGxuZ0xhdEZyb21Db29yZCwKICAgICAgICAgICAgICAgIGZpbmRMaW5rOiBmaW5kTGluaywKICAgICAgICAgICAgICAgIGZpbmRMaW5rQnlJZDogZmluZExpbmtCeUlkLAogICAgICAgICAgICAgICAgZmluZERldmljZXM6IGZpbmREZXZpY2VzLAogICAgICAgICAgICAgICAgZmluZEF0dGFjaGVkSG9zdHM6IGZpbmRBdHRhY2hlZEhvc3RzLAogICAgICAgICAgICAgICAgZmluZEF0dGFjaGVkTGlua3M6IGZpbmRBdHRhY2hlZExpbmtzLAogICAgICAgICAgICAgICAgZmluZEJhZExpbmtzOiBmaW5kQmFkTGlua3MKICAgICAgICAgICAgfQogICAgICAgIH1dKTsKfSgpKTsKjvHvVgNcAgBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANOJ2QABABshmwKgHNsCoB2CW1B/1QN4UmqGvormAEAeKgQgAAAEBCAoAt+LEAGIpu47x71bSYAIAkgIAAJICAAAIACetHhNo9ygf0sUIAEUAAoTid0AAQAbGFcCoBzbAqAdgltQf9UDeFJqhr6K5gBgHoKJjAAABAQgKALfixQBiKbtHRVQgL29ub3MvdWkvYXBwL3ZpZXcvdG9wby90b3BvT2JsaXF1ZS5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0KjvHvVjFlAgBCAAAAQgAAAGj3KB/SxQgAJ60eEwgARQAANMzeQABABt3+wKgHYMCoBzYf9ZbRWpaW34yX62aAEAOWkA0AAAEBCAoAYim8ALfiu47x71b5agIAphwAAKYcAABo9ygf0sUIACetHhMIAEUAHJiBjUAAQAYM7MCoB2DAqAc2H/WW1KGvorlA3hbqgBgDd6xxAAABAQgKAGIpvAC34sVIVFRQLzEuMSAyMDAgT0sNCkNvbnRlbnQtVHlwZTogdGV4dC9qYXZhc2NyaXB0DQpDb250ZW50LUxlbmd0aDogNzE2Mw0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBUb3BvbG9neSBPYmxpcXVlIFZpZXcgTW9kdWxlLgogUHJvdmlkZXMgZnVuY3Rpb25hbGl0eSB0byB2aWV3IHRoZSB0b3BvbG9neSBhcyB0d28gcGxhbmVzIChwYWNrZXQgJiBvcHRpY2FsKQogZnJvbSBhbiBvYmxpcXVlIChzaWRlLW9uKSBwZXJzcGVjdGl2ZS4KICovCgooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIGluamVjdGVkIHJlZnMKICAgIHZhciAkbG9nLCBmcywgc3VzLCBmbGFzaDsKCiAgICAvLyBhcGkgdG8gdG9wb0ZvcmNlCiAgICB2YXIgYXBpOwogICAgLyoKICAgICBmb3JjZSgpICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHJlZiB0byBmb3JjZSBsYXlvdXQgb2JqZWN0CiAgICAgem9vbUxheWVyKCkgICAgICAgICAgICAgICAgICAgIC8vIGdldCByZWYgdG8gem9vbSBsYXllcgogICAgIG5vZGVHQkJveCgpICAgICAgICAgICAgICAgICAgICAvLyBnZXQgYm91bmRpbmcgYm94IG9mIG5vZGUgZ3JvdXAgbGF5ZXIKICAgICBub2RlKCkgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHJlZiB0byBEMyBzZWxlY3Rpb24gb2Ygbm9kZXMKICAgICBsaW5rKCkgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHJlZiB0byBEMyBzZWxlY3Rpb24gb2YgbGlua3MKICAgICBub2RlcygpICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHJlZiB0byBuZXR3b3JrIG5vZGVzIGFycmF5CiAgICAgdGlja1N0dWZmICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZiB0byB0aWNrIGZ1bmN0aW9ucwogICAgIG5vZGVMb2NrKGIpICAgICAgICAgICAgICAgICAgICAvLyB0ZXN0LWFuZC1zZXQgbm9kZUxvY2sgc3RhdGUKICAgICBvcGFjaWZ5TWFwKGIpICAgICAgICAgICAgICAgICAgLy8gc2hvdyBvciBoaWRlIG1hcCBsYXllcgogICAgIGluTGF5ZXIoZCwgbGF5ZXIpICAgICAgICAgICAgICAvLyByZXR1cm4gdHJ1ZSBpZiBkIGluIGxheWVyIHsncGt0J3wnb3B0J30KICAgICBjYWxjTGlua1BvcygpICAgICAgICAgICAgICAgICAgLy8gcmVjb21wdXRlcyBsaW5rIHBvcyBiYXNlZCBvbiBub2RlIGRhdGEKICAgICAqLwoKICAgIC8vIGNvbmZpZ3VyYXRpb24KICAgIHZhciB4c2t5ID0gLS43LCAgICAgLy8geCBza2V3IHkgZmFjdG9yCiAgICAgICAgeHNrID0gLTM1LCAgICAgIC8vIHggc2tldyBhbmdsZQogICAgICAgIHlzYyA9IC41LCAgICAgICAvLyB5IHNjYWxlCiAgICAgICAgcGFkID0gNTAsCiAgICAgICAgdGltZSA9IDE1MDAsCiAgICAgICAgZmlsbCA9IHsKICAgICAgICAgICAgcGt0OiAncmdiYSgxMzAsMTMwLDE3MCwwLjMpJywgICAvLyBibHVlLWlzaAogICAgICAgICAgICBvcHQ6ICdyZ2JhKDE3MCwxMzAsMTcwLDAuMyknICAgIC8vIG1hZ2VudGEtaXNoCiAgICAgICAgfTsKCiAgICAvLyBpbnRlcm5hbCBzdGF0ZQogICAgdmFyIG9ibGlxdWUgPSBmYWxzZSwKICAgICAgICB4ZmZuID0gbnVsbCwKICAgICAgICBwbGFuZSA9IHt9LAogICAgICAgIG9sZE5vZGVMb2NrOwoKCiAgICBmdW5jdGlvbiBwbGFuZUlkKHRhZykgewogICAgICAgIHJldHVybiAndG9wby1vYnZpZXctJyArIHRhZyArICdQbGFuZSc7CiAgICB9CgogICAgZnVuY3Rpb24geXRmbihoLCBkaXIpIHsKICAgICAgICByZXR1cm4gaCAqIHlzYyAqIGRpciAqIDEuMTsKICAgIH0KCiAgICBmdW5jdGlvbiBvYlhmb3JtKGgsIGRpcikgewogICAgICAgIHZhciB5dCA9IHl0Zm4oaCwgZGlyKTsKICAgICAgICByZXR1cm4gc3VzLnNjYWxlKDEsIHlzYykgKyBzdXMudHJhbnNsYXRlKDAsIHl0KSArIHN1cy5za2V3WCh4c2spOwogICAgfQoKICAgIGZ1bmN0aW9uIG5vWGZvcm0oKSB7CiAgICAgICAgcmV0dXJuIHN1cy5za2V3WCgwKSArIHN1cy50cmFuc2xhdGUoMCwwKSArIHN1cy5zY2FsZSgxLDEpOwogICAgfQoKICAgIGZ1bmN0aW9uIHBhZEJveChib3gsIHApIHsKICAgICAgICBib3gueCAtPSBwOwogICAgICAgIGJveC55IC09IHA7CiAgICAgICAgYm94LndpZHRoICs9IHAqMjsKICAgICAgICBib3guaGVpZ2h0ICs9IHAqMjsKICAgIH0KCiAgICBmdW5jdGlvbiB0b09ibGlxdWVWaWV3KCkgewogICAgICAgIHZhciBib3ggPSBhcGkubm9kZUdCQm94KCksCiAgICAgICAgICAgIG94LCBveTsKCiAgICAgICAgcGFkQm94KGJveCwgcGFkKTsKCiAgICAgICAgb3ggPSBib3gueCArIGJveC53aWR0aCAvIDI7CiAgICAgICAgb3kgPSBib3gueSArIGJveC5oZWlnaHQgLyAyOwoKICAgICAgICAvLyByZW1lbWJlciBub2RlIGxvY2sgc3RhdGUsIHRoZW4gbG9jayB0aGUgbm9kZXMgZG93bgogICAgICAgIG9sZE5vZGVMb2NrID0gYXBpLm5vZGVMb2NrKHRydWUpOwogICAgICAgIGFwaS5vcGFjaWZ5TWFwKGZhbHNlKTsKCiAgICAgICAgaW5zZXJ0UGxhbmVzKG94LCBveSk7CgogICAgICAgIHhmZm4gPSBmdW5jdGlvbiAoeHksIGRpcikgewogICAgICAgICAgICB2YXIgeXQgPSB5dGZuKGJveC5oZWlnaHQsIGRpciksCiAgICAgICAgICAgICAgICBheCA9IHh5LnggLSBveCwKICAgICAgICAgICAgICAgIGF5ID0geHkueSAtIG95LAogICAgICAgICAgICAgICAgeCA9IGF4ICsgYXkgKiB4c2t5LAogICAgICAgICAgICAgICAgeSA9IChheSArIHl0KSAqIHlzYzsKICAgICAgICAgICAgcmV0dXJuIHt4OiBveCArIHgsIHk6IG95ICsgeX07CiAgICAgICAgfTsKCiAgICAgICAgc2hvd1BsYW5lKCdwa3QnLCBib3gsIC0xKTsKICAgICAgICBzaG93UGxhbmUoJ29wdCcsIGJveCwgMSk7CiAgICAgICAgb2JUcmFuc2l0aW9uTm9kZXMoKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0b05vcm1hbFZpZXcoKSB7CiAgICAgICAgeGZmbiA9IG51bGw7CgogICAgICAgIGhpZGVQbGFuZSgncGt0Jyk7CiAgICAgICAgaGlkZVBsYW5lKCdvcHQnKTsKICAgICAgICBvYlRyYW5zaXRpb25Ob2RlcygpOwoKICAgICAgICByZW1vdmVQbGFuZXMoKTsKCiAgICAgICAgLy8gcmVzdG9yZSBub2RlIGxvY2sgc3RhdGUKICAgICAgICBhcGkubm9kZUxvY2sob2xkTm9kZUxvY2spOwogICAgICAgIGFwaS5vcGFjaWZ5TWFwKHRydWUpOwogICAgfQoKICAgIGZ1bmN0aW9uIG9iVHJhbnNpdGlvbk5vZGVzKCkgewogICAgICAgIC8vIHJldHVybiB0aGUgZGlyZWN0aW9uIGZvciB0aGUgbm9kZQogICAgICAgIC8vIC0xIGZvciBwa3QgbGF5ZXIsIDEgZm9yIG9wdGljYWwgbGF5ZXIKICAgICAgICBmdW5jdGlvbiBkaXIoZCkgewogICAgICAgICAgICByZXR1cm4gYXBpLmluTGF5ZXIoZCwgJ3BrdCcpID8gLTEgOiAxOwogICAgICAgIH0KCiAgICAgICAgaWYgKHhmZm4pIHsKICAgICAgICAgICAgYXBpLm5vZGVzKCkuZm9yRWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgdmFyIG9sZHh5ID0ge3g6IGQueCwgeTogZC55fSwKICAgICAgICAgICAgICAgICAgICBjb29yZHMgPSB4ZmZuKG9sZHh5LCBkaXIoZCkpOwogICAgICAgICAgICAgICAgZC5vbGR4eSA9IG9sZHh5OwogICAgICAgICAgICAgICAgZC5weCA9IGQueCA9IGNvb3Jkcy54OwogICAgICAgICAgICAgICAgZC5weSA9IGQueSA9IGNvb3Jkcy55OwogICAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhcGkubm9kZXMoKS5mb3JFYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICB2YXIgb2xkID0gZC5vbGR4eSB8fCB7eDogZC54LCB5OiBkLnl9OwogICAgICAgICAgICAgICAgZC5weCA9IGQueCA9IG9sZC54OwogICAgICAgICAgICAgICAgZC5weSA9IGQueSA9IG9sZC55OwogICAgICAgICAgICAgICAgZGVsZXRlIGQub2xkeHk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgYXBpLm5vZGUoKS50cmFuc2l0aW9uKCkKICAgICAgICAgICAgLmR1cmF0aW9uKHRpbWUpCiAgICAgICAgICAgIC5hdHRyKGFwaS50aWNrU3R1ZmYubm9kZUF0dHIpOwogICAgICAgIGFwaS5saW5rKCkudHJhbnNpdGlvbigpCiAgICAgICAgICAgIC5kdXJhdGlvbih0aW1lKQogICAgICAgICAgICAuY2FsbChhcGkuY2FsY0xpbmtQb3MpCiAgICAgICAgICAgIC5hdHRyKGFwaS50aWNrU3R1ZmYubGlua0F0dHIpCiAgICAgICAgICAgIC5jYWxsKGFwaS5hcHBseU51bUxpbmtMYWJlbHMpOwogICAgICAgIGFwaS5saW5rTGFiZWwoKS50cmFuc2l0aW9uKCkKICAgICAgICAgICAgLmR1cmF0aW9uKHRpbWUpCiAgICAgICAgICAgIC5hdHRyKGFwaS50aWNrU3R1ZmYubGlua0xhYmVsQXR0cik7CiAgICB9CgogICAgZnVuY3Rpb24gc2hvd1BsYW5lKHRhZywgYm94LCBkaXIpIHsKICAgICAgICAvLyBzZXQgYm94IG9yaWdpbiBhdCBjZW50ZXIuLgogICAgICAgIGJveC54ID0gLWJveC53aWR0aC8yOwogICAgICAgIGJveC55ID0gLWJveC5oZWlnaHQvMjsKCiAgICAgICAgcGxhbmVbdGFnXS5zZWxlY3QoJ3JlY3QnKQogICAgICAgICAgICAuYXR0cihib3gpCiAgICAgICAgICAgIC5hdHRyKCdvcGFjaXR5JywgMCkKICAgICAgICAgICAgLnRyYW5zaXRpb24oKQogICAgICAgICAgICAuZHVyYXRpb24odGltZSkKICAgICAgICAgICAgLmF0dHIoJ29wYWNpdHknLCAxKQogICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgb2JYZm9ybShib3guaGVpZ2h0LCBkaXIpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBoaWRlUGxhbmUodGFnKSB7CiAgICAgICAgcGxhbmVbdGFnXS5zZWxlY3QoJ3JlY3QnKQogICAgICAgICAgICAudHJhbnNpdGlvbigpCiAgICAgICAgICAgIC5kdXJhdGlvbih0aW1lKQogICAgICAgICAgICAuYXR0cignb3BhY2l0eScsIDApCiAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBub1hmb3JtKCkpOwogICAgfQoKICAgIGZ1bmN0aW9uIGluc2VydFBsYW5lcyhveCwgb3kpIHsKICAgICAgICBmdW5jdGlvbiBpbnModGFnKSB7CiAgICAgICAgICAgIHZhciBpZCA9IHBsYW5lSWQodGFnKSwKICAgICAgICAgICAgICAgIGcgPSBhcGkuem9vbUxheWVyKCkuaW5zZXJ0KCdnJywgJyN0b3BvLUcnKQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCdpZCcsIGlkKQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBzdXMudHJhbnNsYXRlKG94LG95KSk7CiAgICAgICAgICAgIGcuYXBwZW5kKCdyZWN0JykKICAgICAgICAgICAgICAgIC5hdHRyKCdmaWxsJywgZmlsbFt0YWddKQogICAgICAgICAgICAgICAgLmF0dHIoJ29wYWNpdHknLCAwKTsKICAgICAgICAgICAgcGxhbmVbdGFnXSA9IGc7CiAgICAgICAgfQogICAgICAgIGlucygnb3B0Jyk7CiAgICAgICAgaW5zKCdwa3QnKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZW1vdmVQbGFuZXMoKSB7CiAgICAgICAgZnVuY3Rpb24gcmVtKHRhZykgewogICAgICAgICAgICB2YXIgaWQgPSBwbGFuZUlkKHRhZyk7CiAgICAgICAgICAgIGFwaS56b29tTGF5ZXIoKS5zZWxlY3QoJyMnK2lkKQogICAgICAgICAgICAgICAgLnRyYW5zaXRpb24oKQogICAgICAgICAgICAgICAgLmR1cmF0aW9uKHRpbWUgKyA1MCkKICAgICAgICAgICAgICAgIC5yZW1vdmUoKTsKICAgICAgICAgICAgZGVsZXRlIHBsYW5lW3RhZ107CiAgICAgICAgfQogICAgICAgIHJlbSgnb3B0Jyk7CiAgICAgICAgcmVtKCdwa3QnKTsKICAgIH0KCgovLyA9PT0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gPT09IE1PRFVMRSBERUZJTklUSU9OID09PQoKYW5ndWxhci5tb2R1bGUoJ292VG9wbycpCiAgICAuZmFjdG9yeSgnVG9wb09ibGlxdWVTZXJ2aWNlJywKICAgIFsnJGxvZycsICdGblNlcnZpY2UnLCAnU3ZnVXRpbFNlcnZpY2UnLCAnRmxhc2hTZXJ2aWNlJywKCiAgICBmdW5jdGlvbiAoXyRsb2dfLCBfZnNfLCBfc3VzXywgX2ZsYXNoXykgewogICAgICAgICRsb2cgPSBfJGxvZ187CiAgICAgICAgZnMgPSBfZnNfOwogICAgICAgIHN1cyA9IF9zdXNfOwogICAgICAgIGZsYXNoID0gX2ZsYXNoXzsKCiAgICAgICAgZnVuY3Rpb24gaW5pdE9ibGlxdWUoX2FwaV8pIHsKICAgICAgICAgICAgYXBpID0gX2FwaV87CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBkZXN0cm95T2JsaXF1ZSgpIHsgfQoKICAgICAgICBmdW5jdGlvbiB0b2dnbGVPYmxpcXVlKCkgewogICAgICAgICAgICBvYmxpcXVlID0gIW9ibGlxdWU7CiAgICAgICAgICAgIGlmIChvYmxpcXVlKSB7CiAgICAgICAgICAgICAgICBhcGkuZm9yY2UoKS5zdG9wKCk7CiAgICAgICAgICAgICAgICBmbGFzaC5mbGFzaCgnT2JsaXF1ZSB2aWV3Jyk7CiAgICAgICAgICAgICAgICB0b09ibGlxdWVWaWV3KCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBmbGFzaC5mbGFzaCgnTm9ybWFsIHZpZXcnKTsKICAgICAgICAgICAgICAgIHRvTm9ybWFsVmlldygpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBpbml0T2JsaXF1ZTogaW5pdE9ibGlxdWUsCiAgICAgICAgICAgIGRlc3Ryb3lPYmxpcXVlOiBkZXN0cm95T2JsaXF1ZSwKCiAgICAgICAgICAgIGlzT2JsaXF1ZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gb2JsaXF1ZTsgfSwKICAgICAgICAgICAgdG9nZ2xlT2JsaXF1ZTogdG9nZ2xlT2JsaXF1ZQogICAgICAgIH07CiAgICB9XSk7Cn0oKSk7Co7x71ZHawIAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADTieEAAQAbIZMCoBzbAqAdgltQf9UDeFuqhr78dgBAHoGI8AAABAQgKALfixQBiKbyO8e9Wu28CAKkNAACpDQAAaPcoH9LFCAAnrR4TCABFAA2bf2tAAEAGHgvAqAdgwKgHNh/1ls8Ovzv2o2r4MoAYBAiddAAAAQEICgBiKbwAt+LCSFRUUC8xLjEgMjAwIE9LDQpFVGFnOiAxNDU4NTY1Mzg2ODE5DQpDb250ZW50LVR5cGU6IHRleHQvY3NzDQpUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQpDRTMNCi8qCiAqIENvcHlyaWdodCAyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIEJ1dHRvbiBTZXJ2aWNlIC0tIENTUyBmaWxlCiAqLwoKLmJ1dHRvbiwKLnRvZ2dsZUJ1dHRvbiwKLnJhZGlvU2V0IHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIHBhZGRpbmc6IDAgNHB4Owp9Ci5yYWRpb0J1dHRvbiB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICBwYWRkaW5nOiAwIDJweDsKfQoKLmJ1dHRvbiBzdmcuZW1iZWRkZWRJY29uLAoudG9nZ2xlQnV0dG9uIHN2Zy5lbWJlZGRlZEljb24sCi5yYWRpb0J1dHRvbiBzdmcuZW1iZWRkZWRJY29uIHsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQouYnV0dG9uIHN2Zy5lbWJlZGRlZEljb24gLmljb24gcmVjdCwKLnRvZ2dsZUJ1dHRvbiBzdmcuZW1iZWRkZWRJY29uIC5pY29uIHJlY3QsCi5yYWRpb0J1dHRvbiBzdmcuZW1iZWRkZWRJY29uIC5pY29uIHJlY3R7CiAgICBzdHJva2U6IG5vbmU7Cn0KCi8qIFNlbGVjdGVkIGJ1dHRvbiBjb2xvciAqLwoubGlnaHQgLmJ1dHRvbiBzdmcuZW1iZWRkZWRJY29uIC5pY29uIHJlY3QsCi5saWdodCAudG9nZ2xlQnV0dG9uLnNlbGVjdGVkIHN2Zy5lbWJlZGRlZEljb24gLmljb24gcmVjdCwKLmxpZ2h0IC5yYWRpb0J1dHRvbi5zZWxlY3RlZCBzdmcuZW1iZWRkZWRJY29uIC5pY29uIHJlY3QgewogICAgZmlsbDogIzgzODM4MzsKfQoKLmxpZ2h0IC5idXR0b246aG92ZXIgc3ZnLmVtYmVkZGVkSWNvbiAuaWNvbiByZWN0LAoubGlnaHQgLnRvZ2dsZUJ1dHRvbi5zZWxlY3RlZDpob3ZlciBzdmcuZW1iZWRkZWRJY29uIC5pY29uIHJlY3QKLyogTk9URTogc2VsZWN0ZWQgcmFkaW8gYnV0dG9uIHNob3VsZCBOT1QgaGF2ZSBob3ZlciBoaWdobGlnaHQgKi8KewogICAgZmlsbDogIzQ0NDQ0NDsKfQoKLmxpZ2h0IC5idXR0b24gc3ZnLmVtYmVkZGVkSWNvbiAuZ2x5cGgsCi5saWdodCAudG9nZ2xlQnV0dG9uLnNlbGVjdGVkIHN2Zy5lbWJlZGRlZEljb24gLmdseXBoLAoubGlnaHQgLnJhZGlvQnV0dG9uLnNlbGVjdGVkIHN2Zy5lbWJlZGRlZEljb24gLmdseXBoIHsKICAgIGZpbGw6IHdoaXRlOwp9CgouZGFyayAuYnV0dG9uIHN2Zy5lbWJlZGRlZEljb24gLmljb24gcmVjdCwKLmRhcmsgLnRvZ2dsZUJ1dHRvbi5zZWxlY3RlZCBzdmcuZW1iZWRkZWRJY29uIC5pY29uIHJlY3QsCi5kYXJrIC5yYWRpb0J1dHRvbi5zZWxlY3RlZCBzdmcuZW1iZWRkZWRJY29uIC5pY29uIHJlY3QgewogICAgZmlsbDogIzE1MTUxNTsKfQoKLmRhcmsgLmJ1dHRvbjpob3ZlciBzdmcuZW1iZWRkZWRJY29uIC5pY29uIHJlY3QsCi5kYXJrIC50b2dnbGVCdXR0b24uc2VsZWN0ZWQ6aG92ZXIgc3ZnLmVtYmVkZGVkSWNvbiAuaWNvbiByZWN0Ci8qIE5PVEU6IHNlbGVjdGVkIHJhZGlvIGJ1dHRvbiBzaG91bGQgTk9UIGhhdmUgaG92ZXIgaGlnaGxpZ2h0ICovCnsKICAgIGZpbGw6ICM0NDQ7Cn0KCi5kYXJrIC5idXR0b24gc3ZnLmVtYmVkZGVkSWNvbiAuZ2x5cGgsCi5kYXJrIC50b2dnbGVCdXR0b24uc2VsZWN0ZWQgc3ZnLmVtYmVkZGVkSWNvbiAuZ2x5cGgsCi5kYXJrIC5yYWRpb0J1dHRvbi5zZWxlY3RlZCBzdmcuZW1iZWRkZWRJY29uIC5nbHlwaCB7CiAgICBmaWxsOiAjQjJCMkIyOwp9CgovKiBVbnNlbGVjdGVkIGJ1dHRvbiBjb2xvciAqLwoubGlnaHQgLnRvZ2dsZUJ1dHRvbiBzdmcuZW1iZWRkZWRJY29uIC5pY29uIHJlY3QsCi5saWdodCAucmFkaW9CdXR0b24gc3ZnLmVtYmVkZGVkSWNvbiAuaWNvbiByZWN0IHsKICAgIGZpbGw6ICNlZWU7Cn0KCi5saWdodCAudG9nZ2xlQnV0dG9uOmhvdmVyIHN2Zy5lbWJlZGRlZEljb24gLmljb24gcmVjdCwKLmxpZ2h0IC5yYWRpb0J1dHRvbjpob3Zlcjpub3QoLnNlbGVjdGVkKSBzdmcuZW1iZWRkZWRJY29uIC5pY29uIHJlY3QgewogICAgZmlsbDogI2NjYzsKfQoKLmxpZ2h0IC50b2dnbGVCdXR0b24gc3ZnLmVtYmVkZGVkSWNvbiAuZ2x5cGgsCi5saWdodCAucmFkaW9CdXR0b24gc3ZnLmVtYmVkZGVkSWNvbiAuZ2x5cGggewogICAgZmlsbDogI2JiYjsKfQoubGlnaHQgLnRvZ2dsZUJ1dHRvbjpob3Zlcjpub3QoLnNlbGVjdGVkKSBzdmcuZW1iZWRkZWRJY29uIC5nbHlwaCwKLmxpZ2h0IC5yYWRpb0J1dHRvbjpob3Zlcjpub3QoLnNlbGVjdGVkKSBzdmcuZW1iZWRkZWRJY29uIC5nbHlwaCB7CiAgICBmaWxsOiAjOTk5Owp9CgouZGFyayAudG9nZ2xlQnV0dG9uIHN2Zy5lbWJlZGRlZEljb24gLmljb24gcmVjdCwKLmRhcmsgLnJhZGlvQnV0dG9uIHN2Zy5lbWJlZGRlZEljb24gLmljb24gcmVjdCB7CiAgICBmaWxsOiAjMzAzMDMwOwp9CgouZGFyayAudG9nZ2xlQnV0dG9uOmhvdmVyOm5vdCguc2VsZWN0ZWQpIHN2Zy5lbWJlZGRlZEljb24gLmljb24gcmVjdCwKLmRhcmsgLnJhZGlvQnV0dG9uOmhvdmVyOm5vdCguc2VsZWN0ZWQpIHN2Zy5lbWJlZGRlZEljb24gLmljb24gcmVjdCB7CiAgICBmaWxsOiAjNTU1Owp9CgouZGFyayAudG9nZ2xlQnV0dG9uIHN2Zy5lbWJlZGRlZEljb24gLmdseXBoLAouZGFyayAucmFkaW9CdXR0b24gc3ZnLmVtYmVkZGVkSWNvbiAuZ2x5cGggewogICAgZmlsbDogIzU2NTY1NjsKfQoKLmRhcmsgLnRvZ2dsZUJ1dHRvbjpob3Zlcjpub3QoLnNlbGVjdGVkKSBzdmcuZW1iZWRkZWRJY29uIC5nbHlwaCwKLmRhcmsgLnJhZGlvQnV0dG9uOmhvdmVyOm5vdCguc2VsZWN0ZWQpIHN2Zy5lbWJlZGRlZEljb24gLmdseXBoIHsKICAgIGZpbGw6ICM3Nzc7Cn0KDQqO8e9W2nECAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0xEdAAEAG5pXAqAc2wKgHYJbPH/WjavgyDr9JXYAQIWYNVgAAAQEICgC34sYAYim8jvHvVqVzAgCSAgAAkgIAAAgAJ60eE2j3KB/SxQgARQAChOJ5QABABsYTwKgHNsCoB2CW1B/1QN4W6qGvvx2AGAegeqUAAAEBCAoAt+LGAGIpvEdFVCAvb25vcy91aS9hcHAvdmlldy90b3BvL3RvcG9PdmVybGF5LmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiAqLyoNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQqO8e9WCHUCAL0HAAC9BwAAaPcoH9LFCAAnrR4TCABFAAevLAtAAEAGd1fAqAdgwKgHNh/1ltNyg3vEYRyQBIAYA0aXiAAAAQEICgBiKbwAt+LBSFRUUC8xLjEgMjAwIE9LDQpFVGFnOiAxNDU4NTY1Mzg2ODE5DQpDb250ZW50LVR5cGU6IHRleHQvY3NzDQpUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQo2RjcNCi8qCiAqIENvcHlyaWdodCAyMDE0LDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gTmF2aWdhdGlvbiAtLSBDU1MgZmlsZQogKi8KCiNuYXYgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiA0NXB4OwogICAgbGVmdDogMXB4OwogICAgcGFkZGluZzogMDsKICAgIHotaW5kZXg6IDMwMDA7CiAgICB2aXNpYmlsaXR5OiBoaWRkZW47Cn0KCmh0bWxbZGF0YS1wbGF0Zm9ybT0naVBhZCddICNuYXYgewogICAgdG9wOiA1N3B4Owp9CgoubGlnaHQgI25hdiB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYmJiOwogICAgYm94LXNoYWRvdzogMCAycHggOHB4ICM3Nzc7Cn0KLmRhcmsgI25hdiB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNDQ0OwogICAgYm94LXNoYWRvdzogMCAycHggOHB4ICMxMTE7Cn0KCiNuYXYgLm5hdi1oZHIgewogICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgcGFkZGluZzogNnB4IDhweCA2cHggOHB4Owp9CgoubGlnaHQgI25hdiAubmF2LWhkciB7CiAgICBjb2xvcjogI2RkZDsKICAgIGJvcmRlci1ib3R0b206IHNvbGlkIDFweCAjOTk5OwogICAgYmFja2dyb3VuZC1jb2xvcjogI2FhYTsKfQouZGFyayAjbmF2IC5uYXYtaGRyIHsKICAgIGNvbG9yOiAjODg4OwogICAgYm9yZGVyLWJvdHRvbTogc29saWQgMXB4ICM0NDQ7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNTU1Owp9CgojbmF2IGEgewogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgZm9udC1zaXplOiAxNHB0OwogICAgZGlzcGxheTogYmxvY2s7CiAgICBwYWRkaW5nOiA4cHggMTZweCA2cHggMTJweDsKfQoKLmxpZ2h0ICNuYXYgYSB7CiAgICBjb2xvcjogIzM2OTsKICAgIGJvcmRlci1ib3R0b206IHNvbGlkICNjY2MgMXB4Owp9Ci5kYXJrICNuYXYgYSB7CiAgICBjb2xvcjogI2VlZTsKICAgIGJvcmRlci1ib3R0b206IHNvbGlkICMzMzMgMXB4Owp9CgoubGlnaHQgI25hdiBhOmhvdmVyIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7Cn0KLmRhcmsgI25hdiBhOmhvdmVyIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICM3Nzc7Cn0KCiNuYXYgYSBkaXYgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgIHBhZGRpbmctcmlnaHQ6IDRweDsKfQoKI25hdiBhIGRpdiBzdmcuZW1iZWRkZWRJY29uIGcuaWNvbiAuZ2x5cGggewogICAgZmlsbDogI2M2NjsKfQoNCo7x71Y1dQIAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADRkt0AAQAZGJsCoBzbAqAdgltMf9WEckARyg4M/gBAFpDXqAAABAQgKALfixgBiKbyO8e9WenUCAFgFAABYBQAAaPcoH9LFCAAnrR4TCABFAAVKzN9AAEAG2OfAqAdgwKgHNh/1ltFalpbfjJfrZoAYA5aVIwAAAQEICgBiKb0At+K7SFRUUC8xLjEgMjAwIE9LDQpFVGFnOiAxNDU4NTY1Mzg2ODE5DQpDb250ZW50LVR5cGU6IHRleHQvY3NzDQpUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQo0OTINCi8qCiAqIENvcHlyaWdodCAyMDE2IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIERpYWxvZyBTZXJ2aWNlIC0tIENTUyBmaWxlCiAqLwoKLmRpYWxvZyBoMiB7CiAgICBwYWRkaW5nOiAwIDRweDsKICAgIG1hcmdpbjogMDsKICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIHdpZHRoOiAyMTBweDsKICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cn0KLmxpZ2h0IC5kaWFsb2cgaDIgewogICAgY29sb3I6IGJsYWNrOwp9Ci5kYXJrIC5kaWFsb2cgaDIgewogICAgY29sb3I6ICNkZGQ7Cn0KCi5kaWFsb2cgLmRpYWxvZy1idXR0b24gewogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgaGVpZ2h0OiAyMHB4OwogICAgcGFkZGluZzogNnB4IDhweCAycHggOHB4OwogICAgbWFyZ2luOiA0cHg7CiAgICBmbG9hdDogcmlnaHQ7CiAgICAvKiBjb2xvciB3b3JrcyBmb3IgYm90aCBsaWdodCBhbmQgZGFyayB0aGVtZXMgKi8KICAgIGJhY2tncm91bmQtY29sb3I6ICNjNTU7CiAgICBjb2xvcjogd2hpdGU7Cn0KCg0KjvHvVnt2AgBHAAAARwAAAGj3KB/SxQgAJ60eEwgARQAAOczgQABABt33wKgHYMCoBzYf9ZbRWpab9YyX62aAGAOWkBIAAAEBCAoAYim9ALfiuzANCg0KjvHvVsR6AgDeBgAA3gYAAGj3KB/SxQgAJ60eEwgARQAG0ImMQABABhq1wKgHYMCoBzYf9ZbQaztdW/k+R+yAGAMIlqkAAAEBCAoAYim9ALfiwkhUVFAvMS4xIDIwMCBPSw0KRVRhZzogMTQ1ODU2NTM4NjgxOQ0KQ29udGVudC1UeXBlOiB0ZXh0L2Nzcw0KVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KNjE4DQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBUb29sYmFyIFNlcnZpY2UgLS0gQ1NTIGZpbGUKICovCgoubGlnaHQgLnRiYXItYXJyb3cgc3ZnLmVtYmVkZGVkSWNvbiAuaWNvbiAuZ2x5cGggewogICAgZmlsbDogIzgzODM4MzsKfQouZGFyayAudGJhci1hcnJvdyBzdmcuZW1iZWRkZWRJY29uIC5pY29uIC5nbHlwaCB7CiAgICBmaWxsOiAjQjJCMkIyOwp9CgoKZGl2LnRiYXItYXJyb3cgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiA1MyU7CiAgICBsZWZ0OiA5NiU7CiAgICBtYXJnaW4tcmlnaHQ6IC00JTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOwogICAgY3Vyc29yOiBwb2ludGVyOwp9Ci5zYWZhcmkgZGl2LnRiYXItYXJyb3cgewogICAgdG9wOiA0NiU7Cn0KLmZpcmVmb3ggZGl2LnRiYXItYXJyb3cgewogICAgbGVmdDogOTclOwogICAgbWFyZ2luLXJpZ2h0OiAtMyU7Cn0KCi50YmFyLWFycm93IHN2Zy5lbWJlZGRlZEljb24gLmljb24gcmVjdCB7CiAgICBzdHJva2U6IG5vbmU7Cn0KLmxpZ2h0IC50YmFyLWFycm93IHN2Zy5lbWJlZGRlZEljb24gLmljb24gcmVjdCB7CiAgICBmaWxsOiBub25lOwp9Ci5kYXJrIC50YmFyLWFycm93IHN2Zy5lbWJlZGRlZEljb24gLmljb24gcmVjdCB7CiAgICBmaWxsOiBub25lOwp9CgoKLnRvb2xiYXIgewogICAgbGluZS1oZWlnaHQ6IDEyNSU7Cn0KLnRiYXItcm93IHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKCgouc2VwYXJhdG9yIHsKICAgIGJvcmRlcjogMXB4IHNvbGlkOwogICAgbWFyZ2luOiAwIDRweCAwIDRweDsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIGhlaWdodDogMjNweDsKICAgIHdpZHRoOiAwOwp9Ci5saWdodCAuc2VwYXJhdG9yIHsKICAgIGJvcmRlci1jb2xvcjogI2RkZDsKfQouZGFyayAuc2VwYXJhdG9yIHsKICAgIGJvcmRlci1jb2xvcjogIzFBMUExQTsKfQoNCo7x71aaewIAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADTdwEAAQAbNHMCoBzbAqAdgltEf9YyX62Zalpv6gBAFpK4/AAABAQgKALfixgBiKb2O8e9WpHsCAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0X8pAAEAGSxPAqAc2wKgHYJbQH/X5Pkfsaztj94AQBaQMcQAAAQEICgC34scAYim9jvHvVsl8AgBHAAAARwAAAGj3KB/SxQgAJ60eEwgARQAAOYmOQABABiFKwKgHYMCoBzYf9ZbQaztj9/k+R+yAGAMIkBIAAAEBCAoAYim9ALfixzANCg0KjvHvVnZ9AgCQAgAAkAIAAAgAJ60eE2j3KB/SxQgARQACgt3BQABABsrNwKgHNsCoB2CW0R/1jJfrZlqWm/qAGAWkShoAAAEBCAoAt+LHAGIpvUdFVCAvb25vcy91aS9hcHAvdmlldy90b3BvL3RvcG9QYW5lbC5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0KjvHvVoF9AgBCAAAAQgAAAGj3KB/SxQgAJ60eEwgARQAANMzhQABABt37wKgHYMCoBzYf9ZbRWpab+oyX7bSAEAOhkA0AAAEBCAoAYim9ALfix47x71YygwIAkQIAAJECAAAIACetHhNo9ygf0sUIAEUAAoNfy0AAQAZIw8CoBzbAqAdgltAf9fk+R+xrO2P8gBgFpOCdAAABAQgKALfixwBiKb1HRVQgL29ub3MvdWkvYXBwL3ZpZXcvdG9wby90b3BvU2VsZWN0LmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiAqLyoNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQqO8e9WKoYCANI4AADSOAAAaPcoH9LFCAAnrR4TCABFADjEzOJAAEAGpWrAqAdgwKgHNh/1ltFalpv6jJfttIAQA6HInQAAAQEICgBiKb0At+LHSFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvamF2YXNjcmlwdA0KQ29udGVudC1MZW5ndGg6IDE1MzA2DQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCi8qCiAqIENvcHlyaWdodCAyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIFRvcG9sb2d5IFBhbmVsIE1vZHVsZS4KIERlZmluZXMgZnVuY3Rpb25zIGZvciBtYW5pcHVsYXRpbmcgdGhlIHN1bW1hcnksIGRldGFpbCwgYW5kIGluc3RhbmNlIHBhbmVscy4KICovCgooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIGluamVjdGVkIHJlZnMKICAgIHZhciAkbG9nLCAkd2luZG93LCAkcm9vdFNjb3BlLCBmcywgcHMsIGdzLCBmbGFzaCwgd3NzLCBibnMsIG1hc3QsIG5zOwoKICAgIC8vIGNvbnN0YW50cwogICAgdmFyIHBDbHMgPSAndG9wby1wJywKICAgICAgICBpZFN1bSA9ICd0b3BvLXAtc3VtbWFyeScsCiAgICAgICAgaWREZXQgPSAndG9wby1wLWRldGFpbCcsCiAgICAgICAgcGFuZWxPcHRzID0gewogICAgICAgICAgICB3aWR0aDogMjY4CiAgICAgICAgfSwKICAgICAgICBzdW1NYXggPSAyNjIsCiAgICAgICAgcGFkVG9wID0gMjAsCiAgICAgICAgZGV2UGF0aCA9ICdkZXZpY2UnOwoKICAgIC8vIGludGVybmFsIHN0YXRlCiAgICB2YXIgdXNlRGV0YWlscyA9IHRydWUsICAgICAgLy8gc2hvdWxkIHdlIHNob3cgZGV0YWlscyBpZiB3ZSBoYXZlICdlbT8KICAgICAgICBoYXZlRGV0YWlscyA9IGZhbHNlLCAgICAvLyBkbyB3ZSBoYXZlIGRldGFpbHMgdGhhdCB3ZSBjb3VsZCBzaG93PwogICAgICAgIHN1bUZyb21Ub3AsICAgICAgICAgICAgIC8vIHN1bW1hcnkgcGFuZWwgZGlzdGFuY2UgZnJvbSB0b3Agb2Ygc2NyZWVuCiAgICAgICAgdW5iaW5kV2F0Y2g7CgogICAgLy8gcGFuZWxzCiAgICB2YXIgc3VtbWFyeSwgZGV0YWlsOwoKICAgIC8vID09PSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gUGFuZWwgQVBJCiAgICBmdW5jdGlvbiBjcmVhdGVUb3BvUGFuZWwoaWQsIG9wdHMpIHsKICAgICAgICB2YXIgcCA9IHBzLmNyZWF0ZVBhbmVsKGlkLCBvcHRzKSwKICAgICAgICAgICAgcGlkID0gaWQsCiAgICAgICAgICAgIGhlYWRlciwgYm9keSwgZm9vdGVyOwogICAgICAgIHAuY2xhc3NlZChwQ2xzLCB0cnVlKTsKCiAgICAgICAgZnVuY3Rpb24gcGFuZWwoKSB7CiAgICAgICAgICAgIHJldHVybiBwOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gaEFwcGVuZCh4KSB7CiAgICAgICAgICAgIHJldHVybiBoZWFkZXIuYXBwZW5kKHgpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gYkFwcGVuZCh4KSB7CiAgICAgICAgICAgIHJldHVybiBib2R5LmFwcGVuZCh4KTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGZBcHBlbmQoeCkgewogICAgICAgICAgICByZXR1cm4gZm9vdGVyLmFwcGVuZCh4KTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHNldHVwKCkgewogICAgICAgICAgICBwLmVtcHR5KCk7CgogICAgICAgICAgICBwLmFwcGVuZCgnZGl2JykuY2xhc3NlZCgnaGVhZGVyJywgdHJ1ZSk7CiAgICAgICAgICAgIHAuYXBwZW5kKCdkaXYnKS5jbGFzc2VkKCdib2R5JywgdHJ1ZSk7CiAgICAgICAgICAgIHAuYXBwZW5kKCdkaXYnKS5jbGFzc2VkKCdmb290ZXInLCB0cnVlKTsKCiAgICAgICAgICAgIGhlYWRlciA9IHAuZWwoKS5zZWxlY3QoJy5oZWFkZXInKTsKICAgICAgICAgICAgYm9keSA9IHAuZWwoKS5zZWxlY3QoJy5ib2R5Jyk7CiAgICAgICAgICAgIGZvb3RlciA9IHAuZWwoKS5zZWxlY3QoJy5mb290ZXInKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGRlc3Ryb3koKSB7CiAgICAgICAgICAgIHBzLmRlc3Ryb3lQYW5lbChwaWQpOwogICAgICAgIH0KCiAgICAgICAgLy8gZnJvbVRvcCBpcyBob3cgbWFueSBwaXhlbHMgZnJvbSB0aGUgdG9wIG9mIHRoZSBwYWdlIHRoZSBwYW5lbCBpcwogICAgICAgIC8vIG1heCBpcyB0aGUgbWF4IGhlaWdodCBvZiB0aGUgcGFuZWwgaW4gcGl4ZWxzCiAgICAgICAgLy8gICAgb25seSBhZGp1c3RzIGlmIHRoZSBib2R5IGNvbnRlbnQgd291bGQgYmUgMTBweCBvciBsYXJnZXIKICAgICAgICBmdW5jdGlvbiBhZGp1c3RIZWlnaHQoZnJvbVRvcCwgbWF4KSB7CiAgICAgICAgICAgIHZhciB0b3RhbFBIZWlnaHQsIGF2U3BhY2UsCiAgICAgICAgICAgICAgICBvdmVyZmxvdyA9IDAsCiAgICAgICAgICAgICAgICBwZGcgPSAzMDsKCiAgICAgICAgICAgIGlmICghZnJvbVRvcCkgewogICAgICAgICAgICAgICAgJGxvZy53YXJuKCdhZGp1c3RIZWlnaHQ6IGhlaWdodCBmcm9tIHRvcCBvZiBwYWdlIG5vdCBnaXZlbicpOwogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWJvZHkgfHwgIXApIHsKICAgICAgICAgICAgICAgIC8vIHBhbmVsIGNvbnRlbnRzIGFyZSBub3QgZGVmaW5lZAogICAgICAgICAgICAgICAgLy8gdGhpcyBtYXkgaGFwcGVuIHdoZW4gd2luZG93IGlzIHJlc2l6aW5nIGJ1dCBwYW5lbCBoYXMKICAgICAgICAgICAgICAgIC8vICAgYmVlbiBjbGVhcmVkIG9yIHJlbW92ZWQKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwLmVsKCkuc3R5bGUoJ2hlaWdodCcsIG51bGwpOwogICAgICAgICAgICBib2R5LnN0eWxlKCdoZWlnaHQnLCBudWxsKTsKCiAgICAgICAgICAgIHRvdGFsUEhlaWdodCA9IGZyb21Ub3AgKyBwLmhlaWdodCgpOwogICAgICAgICAgICBhdlNwYWNlID0gZnMud2luZG93U2l6ZShwZGcpLmhlaWdodDsKCiAgICAgICAgICAgIGlmICh0b3RhbFBIZWlnaHQgPj0gYXZTcGFjZSkgewogICAgICAgICAgICAgICAgb3ZlcmZsb3cgPSB0b3RhbFBIZWlnaHQgLSBhdlNwYWNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiBfYWRqdXN0Qm9keShoZWlnaHQpIHsKICAgICAgICAgICAgICAgIGlmIChoZWlnaHQgPCAxMCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgYm9keS5zdHlsZSgnaGVpZ2h0JywgaGVpZ2h0ICsgJ3B4Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFfYWRqdXN0Qm9keShmcy5ub1B4U3R5bGUoYm9keSwgJ2hlaWdodCcpIC0gb3ZlcmZsb3cpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChtYXggJiYgcC5oZWlnaHQoKSA+IG1heCkgewogICAgICAgICAgICAgICAgX2FkanVzdEJvZHkoZnMubm9QeFN0eWxlKGJvZHksICdoZWlnaHQnKSAtIChwLmhlaWdodCgpIC0gbWF4KSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHBhbmVsOiBwYW5lbCwKICAgICAgICAgICAgc2V0dXA6IHNldHVwLAogICAgICAgICAgICBkZXN0cm95OiBkZXN0cm95LAogICAgICAgICAgICBhcHBlbmRIZWFkZXI6IGhBcHBlbmQsCiAgICAgICAgICAgIGFwcGVuZEJvZHk6IGJBcHBlbmQsCiAgICAgICAgICAgIGFwcGVuZEZvb3RlcjogZkFwcGVuZCwKICAgICAgICAgICAgYWRqdXN0SGVpZ2h0OiBhZGp1c3RIZWlnaHQKICAgICAgICB9OwogICAgfQoKICAgIC8vID09PSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gVXRpbGl0eSBmdW5jdGlvbnMKCiAgICBmdW5jdGlvbiBhZGRTZXAodGJvZHkpIHsKICAgICAgICB0Ym9keS5hcHBlbmQoJ3RyJykuYXBwZW5kKCd0ZCcpLmF0dHIoJ2NvbHNwYW4nLCAyKS5hcHBlbmQoJ2hyJyk7CiAgICB9CgogICAgZnVuY3Rpb24gYWRkQnRuRm9vdGVyKCkgewogICAgICAgIGRldGFpbC5hcHBlbmRGb290ZXIoJ2hyJyk7CiAgICAgICAgZGV0YWlsLmFwcGVuZEZvb3RlcignZGl2JykuY2xhc3NlZCgnYWN0aW9uQnRucycsIHRydWUpOwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZFByb3AodGJvZHksIGxhYmVsLCB2YWx1ZSkgewogICAgICAgIHZhciB0ciA9IHRib2R5LmFwcGVuZCgndHInKSwKICAgICAgICAgICAgbGFiOwogICAgICAgIGlmICh0eXBlb2YgbGFiZWwgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIGxhYiA9IGxhYmVsLnJlcGxhY2UoL18vZywgJyAnKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsYWIgPSBsYWJlbDsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGFkZENlbGwoY2xzLCB0eHQpIHsKICAgICAgICAgICAgdHIuYXBwZW5kKCd0ZCcpLmF0dHIoJ2NsYXNzJywgY2xzKS5odG1sKHR4dCk7CiAgICAgICAgfQogICAgICAgIGFkZENlbGwoJ2xhYmVsJywgbGFiICsgJyA6Jyk7CiAgICAgICAgYWRkQ2VsbCgndmFsdWUnLCB2YWx1ZSk7CiAgICB9CgogICAgZnVuY3Rpb24gbGlzdFByb3BzKHRib2R5LCBkYXRhKSB7CiAgICAgICAgZGF0YS5wcm9wT3JkZXIuZm9yRWFjaChmdW5jdGlvbiAocCkgewogICAgICAgICAgICBpZiAocCA9PT0gJy0nKSB7CiAgICAgICAgICAgICAgICBhZGRTZXAodGJvZHkpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgYWRkUHJvcCh0Ym9keSwgcCwgZGF0YS5wcm9wc1twXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiB3YXRjaFdpbmRvdygpIHsKICAgICAgICB1bmJpbmRXYXRjaCA9ICRyb290U2NvcGUuJHdhdGNoQ29sbGVjdGlvbigKICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICBoOiAkd2luZG93LmlubmVySGVpZ2h0LAogICAgICAgICAgICAgICAgICAgIHc6ICR3aW5kb3cuaW5uZXJXaWR0aAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgc3VtbWFyeS5hZGp1c3RIZWlnaHQoc3VtRnJvbVRvcCwgc3VtTWF4KTsKICAgICAgICAgICAgICAgIGRldGFpbC5hZGp1c3RIZWlnaHQoZGV0YWlsLnlwb3MuY3VycmVudCk7CiAgICAgICAgICAgIH0KICAgICAgICApOwogICAgfQoKICAgIC8vID09PSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gIEZ1bmN0aW9ucyBmb3IgcG9wdWxhdGluZyB0aGUgc3VtbWFyeSBwYW5lbAoKICAgIGZ1bmN0aW9uIHBvcHVsYXRlU3VtbWFyeShkYXRhKSB7CiAgICAgICAgc3VtbWFyeS5zZXR1cCgpOwoKICAgICAgICB2YXIgc3ZnID0gc3VtbWFyeS5hcHBlbmRIZWFkZXIoJ2RpdicpCiAgICAgICAgICAgICAgICAuY2xhc3NlZCgnaWNvbicsIHRydWUpCiAgICAgICAgICAgICAgICAuYXBwZW5kKCdzdmcnKSwKICAgICAgICAgICAgdGl0bGUgPSBzdW1tYXJ5LmFwcGVuZEhlYWRlcignaDInKSwKICAgICAgICAgICAgdGFibGUgPSBzdW1tYXJ5LmFwcGVuZEJvZHkoJ3RhYmxlJyksCiAgICAgICAgICAgIHRib2R5ID0gdGFibGUuYXBwZW5kKCd0Ym9keScpLAogICAgICAgICAgICBnbHlwaElkID0gZGF0YS50eXBlIHx8ICdub2RlJzsKCiAgICAgICAgZ3MuYWRkR2x5cGgoc3ZnLCBnbHlwaElkLCA0MCk7CgogICAgICAgIGlmIChnbHlwaElkID09PSAnbm9kZScpIHsKICAgICAgICAgICAgZ3MuYWRkR2x5cGgoc3ZnLCAnYmlyZCcsIDI0LCB0cnVlLCBbOCwxMl0pOwogICAgICAgIH0KCiAgICAgICAgdGl0bGUudGV4dChkYXRhLnRpdGxlKTsKICAgICAgICBsaXN0UHJvcHModGJvZHksIGRhdGEpOwogICAgfQoKICAgIC8vID09PSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gIEZ1bmN0aW9ucyBmb3IgcG9wdWxhdGluZyB0aGUgZGV0YWlsIHBhbmVsCgogICAgdmFyIGlzRGV2aWNlID0gewogICAgICAgIHN3aXRjaDogMSwKICAgICAgICByb2FkbTogMSwKICAgICAgICBvdG46MQogICAgfTsKCiAgICBmdW5jdGlvbiBkaXNwbGF5U2luZ2xlKGRhdGEpIHsKICAgICAgICBkZXRhaWwuc2V0dXAoKTsKCiAgICAgICAgdmFyIHN2ZyA9IGRldGFpbC5hcHBlbmRIZWFkZXIoJ2RpdicpCiAgICAgICAgICAgICAgICAuY2xhc3NlZCgnaWNvbiBjbGlja2FibGUnLCB0cnVlKQogICAgICAgICAgICAgICAgLmFwcGVuZCgnc3ZnJyksCiAgICAgICAgICAgIHRpdGxlID0gZGV0YWlsLmFwcGVuZEhlYWRlcignaDInKQogICAgICAgICAgICAgICAgLmNsYXNzZWQoJ2NsaWNrYWJsZScsIHRydWUpLAogICAgICAgICAgICB0YWJsZSA9IGRldGFpbC5hcHBlbmRCb2R5KCd0YWJsZScpLAogICAgICAgICAgICB0Ym9keSA9IHRhYmxlLmFwcGVuZCgndGJvZHknKSwKICAgICAgICAgICAgbmF2Rm47CgogICAgICAgIGdzLmFkZEdseXBoKHN2ZywgKGRhdGEudHlwZSB8fCAndW5rbm93bicpLCA0MCk7CiAgICAgICAgdGl0bGUudGV4dChkYXRhLnRpdGxlKTsKCiAgICAgICAgLy8gb25seSBhZGQgbmF2aWdhdGlvbiB3aGVuIGRpc3BsYXlpbmcgYSBkZXZpY2UKICAgICAgICBpZiAoaXNEZXZpY2VbZGF0YS50eXBlXSkgewogICAgICAgICAgICBuYXZGbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIG5zLm5hdlRvKGRldlBhdGgsIHsgZGV2SWQ6IGRhdGEuaWQgfSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdmcub24oJ2NsaWNrJywgbmF2Rm4pOwogICAgICAgICAgICB0aXRsZS5vbignY2xpY2snLCBuYXZGbik7CiAgICAgICAgfQoKICAgICAgICBsaXN0UHJvcHModGJvZHksIGRhdGEpOwogICAgICAgIGFkZEJ0bkZvb3RlcigpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRpc3BsYXlNdWx0aShpZHMpIHsKICAgICAgICBkZXRhaWwuc2V0dXAoKTsKCiAgICAgICAgdmFyIHRpdGxlID0gZGV0YWlsLmFwcGVuZEhlYWRlcignaDMnKSwKICAgICAgICAgICAgdGFibGUgPSBkZXRhaWwuYXBwZW5kQm9keSgndGFibGUnKSwKICAgICAgICAgICAgdGJvZHkgPSB0YWJsZS5hcHBlbmQoJ3Rib2R5Jyk7CgogICAgICAgIHRpdGxlLnRleHQoJ1NlbGVjdGVkIE5vZGVzJyk7CiAgICAgICAgaWRzLmZvckVhY2goZnVuY3Rpb24gKGQsIGkpIHsKICAgICAgICAgICAgYWRkUHJvcCh0Ym9keSwgaSsxLCBkKTsKICAgICAgICB9KTsKICAgICAgICBhZGRCdG5Gb290ZXIoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBhZGRBY3Rpb24obykgewogICAgICAgIHZhciBidG5EaXYgPSBkMy5zZWxlY3QoJyMnICsgaWREZXQpCiAgICAgICAgICAgIC5zZWxlY3QoJy5hY3Rpb25CdG5zJykKICAgICAgICAgICAgLmFwcGVuZCgnZGl2JykKICAgICAgICAgICAgLmNsYXNzZWQoJ2FjdGlvbkJ0bicsIHRydWUpOwogICAgICAgIGJucy5idXR0b24oYnRuRGl2LCBpZERldCArICctJyArIG8uaWQsIG8uZ2lkLCBvLmNiLCBvLnR0KTsKICAgIH0KCiAgICB2YXIgZnJpZW5kbHlJbmRleCA9IHsKICAgICAgICBkZXZpY2U6IDEsCiAgICAgICAgaG9zdDogMAogICAgfTsKCiAgICBmdW5jdGlvbiBmcmllbmRseShkKSB7CiAgICAgICAgdmFyIGkgPSBmcmllbmRseUluZGV4W2QuY2xhc3NdIHx8IDA7CiAgICAgICAgcmV0dXJuIChkLmxhYmVscyAmJiBkLmxhYmVsc1tpXSkgfHwgJyc7CiAgICB9CgogICAgZnVuY3Rpb24gbGlua1N1bW1hcnkoZCkgewogICAgICAgIHZhciBvID0gZCAmJiBkLm9ubGluZSA/ICdvbmxpbmUnIDogJ29mZmxpbmUnOwogICAgICAgIHJldHVybiBkID8gZC50eXBlICsgJyAvICcgKyBvIDogJy0nOwogICAgfQoKICAgIC8vIHByb3ZpZGVkIHRvIGNoYW5nZSBwcmVzZW50YXRpb24gb2YgaW50ZXJuYWwgdHlwZSBuYW1lCiAgICB2YXIgbGlua1R5cGVQcmVzID0gewogICAgICAgIGhvc3RMaW5rOiAnZWRnZSBsaW5rJwogICAgfTsKCiAgICBmdW5jdGlvbiBsaW5rVHlwZShkKSB7CiAgICAgICAgcmV0dXJuIGxpbmtUeXBlUHJlc1tkLnR5cGUoKV0gfHwgZC50eXBlKCk7CiAgICB9CgogICAgZnVuY3Rpb24gbGlua0V4cGVjdGVkKGQpIHsKICAgICAgICByZXR1cm4gZC5leHBlY3RlZCgpOwogICAgfQoKICAgIHZhciBjb3JlT3JkZXIgPSBbCiAgICAgICAgICAgICdUeXBlJywgJ0V4cGVjdGVkJywgJy0nLAogICAgICAgICAgICAnQV90eXBlJywgJ0FfaWQnLCAnQV9sYWJlbCcsICdBX3BvcnQnLCAnLScsCiAgICAgICAgICAgICdCX3R5cGUnLCAnQl9pZCcsICdCX2xhYmVsJywgJ0JfcG9ydCcsICctJwogICAgICAgIF0sCiAgICAgICAgZWRnZU9yZGVyID0gWwogICAgICAgICAgICAnVHlwZScsICctJywKICAgICAgICAgICAgJ0FfdHlwZScsICdBX2lkJywgJ0FfbGFiZWwnLCAnLScsCiAgICAgICAgICAgICdCX3R5cGUnLCAnQl9pZCcsICdCX2xhYmVsJywgJ0JfcG9ydCcKICAgICAgICBdOwoKICAgIGZ1bmN0aW9uIGRpc3BsYXlMaW5rKGRhdGEpIHsKICAgICAgICBkZXRhaWwuc2V0dXAoKTsKCiAgICAgICAgdmFyIHN2ZyA9IGRldGFpbC5hcHBlbmRIZWFkZXIoJ2RpdicpCiAgICAgICAgICAgICAgICAuY2xhc3NlZCgnaWNvbicsIHRydWUpCiAgICAgICAgICAgICAgICAuYXBwZW5kKCdzdmcnKSwKICAgICAgICAgICAgdGl0bGUgPSBkZXRhaWwuYXBwZW5kSGVhZGVyKCdoMicpLAogICAgICAgICAgICB0YWJsZSA9IGRldGFpbC5hcHBlbmRCb2R5KCd0YWJsZScpLAogICAgICAgICAgICB0Ym9keSA9IHRhYmxlLmFwcGVuZCgndGJvZHknKSwKICAgICAgICAgICAgZWRnZUxpbmsgPSBkYXRhLnR5cGUoKSA9PT0gJ2hvc3RMaW5rJywKICAgICAgICAgICAgb3JkZXIgPSBlZGdlTGluayA/IGVkZ2VPcmRlciA6IGNvcmVPcmRlcjsKCiAgICAgICAgZ3MuYWRkR2x5cGgoc3ZnLCAncG9ydHMnLCA0MCk7CiAgICAgICAgdGl0bGUudGV4dCgnTGluaycpOwoKCiAgICAgICAgbGlzdFByb3BzKHRib2R5LCB7CiAgICAgICAgICAgIHByb3BPcmRlcjogb3JkZXIsCiAgICAgICAgICAgIHByb3BzOiB7CiAgICAgICAgICAgICAgICBUeXBlOiBsaW5rVHlwZShkYXRhKSwKICAgICAgICAgICAgICAgIEV4cGVjdGVkOiBsaW5rRXhwZWN0ZWQoZGF0YSksCgogICAgICAgICAgICAgICAgQV90eXBlOiBkYXRhLnNvdXJjZS5jbGFzcywKICAgICAgICAgICAgICAgIEFfaWQ6IGRhdGEuc291cmNlLmlkLAogICAgICAgICAgICAgICAgQV9sYWJlbDogZnJpZW5kbHkoZGF0YS5zb3VyY2UpLAogICAgICAgICAgICAgICAgQV9wb3J0OiBkYXRhLnNyY1BvcnQsCgogICAgICAgICAgICAgICAgQl90eXBlOiBkYXRhLnRhcmdldC5jbGFzcywKICAgICAgICAgICAgICAgIEJfaWQ6IGRhdGEudGFyZ2V0LmlkLAogICAgICAgICAgICAgICAgQl9sYWJlbDogZnJpZW5kbHkoZGF0YS50YXJnZXQpLAogICAgICAgICAgICAgICAgQl9wb3J0OiBkYXRhLnRndFBvcnQKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICBpZiAoIWVkZ2VMaW5rKSB7CiAgICAgICAgICAgIGFkZFByb3AodGJvZHksICdBICZyYXJyOyBCJywgbGlua1N1bW1hcnkoZGF0YS5mcm9tU291cmNlKSk7CiAgICAgICAgICAgIGFkZFByb3AodGJvZHksICdCICZyYXJyOyBBJywgbGlua1N1bW1hcnkoZGF0YS5mcm9tVGFyZ2V0KSk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGRpc3BsYXlOb3RoaW5nKCkgewogICAgICAgIGhhdmVEZXRhaWxzID0gZmFsc2U7CiAgICAgICAgaGlkZURldGFpbFBhbmVsKCk7CiAgICB9CgogICAgZnVuY3Rpb24gZGlzcGxheVNvbWV0aGluZygpIHsKICAgICAgICBoYXZlRGV0YWlscyA9IHRydWU7CiAgICAgICAgaWYgKHVzZURldGFpbHMpIHsKICAgICAgICAgICAgc2hvd0RldGFpbFBhbmVsKCk7CiAgICAgICAgfQogICAgfQoKICAgIC8vID09PSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gIEV2ZW50IEhhbmRsZXJzCgogICAgZnVuY3Rpb24gc2hvd1N1bW1hcnkoZGF0YSkgewogICAgICAgIHBvcHVsYXRlU3VtbWFyeShkYXRhKTsKICAgICAgICBzaG93U3VtbWFyeVBhbmVsKCk7CiAgICB9CgogICAgZnVuY3Rpb24gdG9nZ2xlU3VtbWFyeSh4KSB7CiAgICAgICAgdmFyIGtldiA9ICh4ID09PSAna2V5ZXYnKSwKICAgICAgICAgICAgb24gPSBrZXYgPyAhc3VtbWFyeS5wYW5lbCgpLmlzVmlzaWJsZSgpIDogISF4LAogICAgICAgICAgICB2ZXJiID0gb24gPyAnU2hvdycgOiAnSGlkZSc7CgogICAgICAgIGlmIChvbikgewogICAgICAgICAgICAvLyBhc2sgc2VydmVyIHRvIHN0YXJ0IHNlbmRpbmcgc3VtbWFyeSBkYXRhLgogICAgICAgICAgICB3c3Muc2VuZEV2ZW50KCdyZXF1ZXN0U3VtbWFyeScpOwogICAgICAgICAgICAvLyBub3RlOiB0aGUgc3VtbWFyeSBwYW5lbCB3aWxsIGFwcGVhciwgb25jZSBkYXRhIGFycml2ZXMKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBoaWRlU3VtbWFyeVBhbmVsKCk7CiAgICAgICAgfQogICAgICAgIGZsYXNoLmZsYXNoKHZlcmIgKyAnIHN1bW1hcnkgcGFuZWwnKTsKICAgICAgICByZXR1cm4gb247CiAgICB9CgogICAgLy8gPT09IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyA9PT0gTE9HSUMgRm9yIHNob3dpbmcvaGlkaW5nIHN1bW1hcnkgYW5kIGRldGFpbCBwYW5lbHMuLi4KCiAgICBmdW5jdGlvbiBzaG93U3VtbWFyeVBhbmVsKCkgewogICAgICAgIGZ1bmN0aW9uIF9zaG93KCkgewogICAgICAgICAgICBzdW1tYXJ5LnBhbmVsKCkuc2hvdygpOwogICAgICAgICAgICBzdW1tYXJ5LmFkanVzdEhlaWdodChzdW1Gcm9tVG9wLCBzdW1NYXgpOwogICAgICAgIH0KICAgICAgICBpZiAoZGV0YWlsLnBhbmVsKCkuaXNWaXNpYmxlKCkpIHsKICAgICAgICAgICAgZGV0YWlsLmRvd24oX3Nob3cpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIF9zaG93KCk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGhpZGVTdW1tYXJ5UGFuZWwoKSB7CiAgICAgICAgLy8gaW5zdHJ1Y3Qgc2VydmVyIHRvIHN0b3Agc2VuZGluZyBzdW1tYXJ5IGRhdGEKICAgICAgICB3c3Muc2VuZEV2ZW50KCJjYW5jZWxTdW1tYXJ5Iik7CiAgICAgICAgc3VtbWFyeS5wYW5lbCgpLmhpZGUoZGV0YWlsLnVwKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzaG93RGV0YWlsUGFuZWwoKSB7CiAgICAgICAgaWYgKHN1bW1hcnkucGFuZWwoKS5pc1Zpc2libGUoKSkgewogICAgICAgICAgICBkZXRhaWwuZG93bihkZXRhaWwucGFuZWwoKS5zaG93KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkZXRhaWwudXAoZGV0YWlsLnBhbmVsKCkuc2hvdyk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGhpZGVEZXRhaWxQYW5lbCgpIHsKICAgICAgICBkZXRhaWwucGFuZWwoKS5oaWRlKCk7CiAgICB9CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBmdW5jdGlvbiBhdWdtZW50RGV0YWlsUGFuZWwoKSB7CiAgICAgICAgdmFyIGQgPSBkZXRhaWwsCiAgICAgICAgICAgIGRvd25Qb3MgPSBzdW1Gcm9tVG9wICsgc3VtTWF4ICsgMjA7CiAgICAgICAgZC55cG9zID0geyB1cDogc3VtRnJvbVRvcCwgZG93bjogZG93blBvcywgY3VycmVudDogZG93blBvc307CgogICAgICAgIGQuX21vdmUgPSBmdW5jdGlvbiAoeSwgY2IpIHsKICAgICAgICAgICAgdmFyIHlwID0gZC55cG9zLAogICAgICAgICAgICAgICAgZW5kQ2I7CgogICAgICAgICAgICBpZiAoZnMuaXNGKGNiKSkgewogICAgICAgICAgICAgICAgZW5kQ2IgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgY2IoKTsKICAgICAgICAgICAgICAgICAgICBkLmFkanVzdEhlaWdodChkLnlwb3MuY3VycmVudCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBlbmRDYiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBkLmFkanVzdEhlaWdodChkLnlwb3MuY3VycmVudCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHlwLmN1cnJlbnQgIT09IHkpIHsKICAgICAgICAgICAgICAgIHlwLmN1cnJlbnQgPSB5OwogICAgICAgICAgICAgICAgZC5wYW5lbCgpLmVsKCkudHJhbnNpdGlvbigpLmR1cmF0aW9uKDMwMCkKICAgICAgICAgICAgICAgICAgICAuZWFjaCgnZW5kJywgZW5kQ2IpCiAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCd0b3AnLCB5cC5jdXJyZW50ICsgJ3B4Jyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBlbmRDYigpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgZC5kb3duID0gZnVuY3Rpb24gKGNiKSB7IGQuX21vdmUoZC55cG9zLmRvd24sIGNiKTsgfTsKICAgICAgICBkLnVwID0gZnVuY3Rpb24gKGNiKSB7IGQuX21vdmUoZC55cG9zLnVwLCBjYik7IH07CiAgICB9CgogICAgZnVuY3Rpb24gdG9nZ2xlVXNlRGV0YWlsc0ZsYWcoeCkgewogICAgICAgIHZhciBrZXYgPSAoeCA9PT0gJ2tleWV2JyksCiAgICAgICAgICAgIHZlcmI7CgogICAgICAgIHVzZURldGFpbHMgPSBrZXYgPyAhdXNlRGV0YWlscyA6ICEheDsKICAgICAgICB2ZXJiID0gdXNlRGV0YWlscyA/ICdFbmFibGUnIDogJ0Rpc2FibGUnOwoKICAgICAgICBpZiAodXNlRGV0YWlscykgewogICAgICAgICAgICBpZiAoaGF2ZURldGFpbHMpIHsKICAgICAgICAgICAgICAgIHNob3dEZXRhaWxQYW5lbCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaGlkZURldGFpbFBhbmVsKCk7CiAgICAgICAgfQogICAgICAgIGZsYXNoLmZsYXNoKHZlcmIgKyAnIGRldGFpbHMgcGFuZWwnKTsKICAgICAgICByZXR1cm4gdXNlRGV0YWlsczsKICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIGZ1bmN0aW9uIGluaXRQYW5lbHMoKSB7CiAgICAgICAgc3VtRnJvbVRvcCA9IG1hc3QubWFzdEhlaWdodCgpICsgcGFkVG9wOwogICAgICAgIHN1bW1hcnkgPSBjcmVhdGVUb3BvUGFuZWwoaWRTdW0sIHBhbmVsT3B0cyk7CiAgICAgICAgZGV0YWlsID0gY3JlYXRlVG9wb1BhbmVsKGlkRGV0LCBwYW5lbE9wdHMpOwoKICAgICAgICBhdWdtZW50RGV0YWlsUGFuZWwoKTsKICAgICAgICB3YXRjaFdpbmRvdygpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlc3Ryb3lQYW5lbHMoKSB7CiAgICAgICAgc3VtbWFyeS5kZXN0cm95KCk7CiAgICAgICAgc3VtbWFyeSA9IG51bGw7CgogICAgICAgIGRldGFpbC5kZXN0cm95KCk7CiAgICAgICAgZGV0YWlsID0gbnVsbDsKICAgICAgICBoYXZlRGV0YWlscyA9IGZhbHNlOwogICAgICAgIHVuYmluZFdhdGNoKCk7CiAgICB9CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBhbmd1bGFyLm1vZHVsZSgnb3ZUb3BvJykKICAgIC5mYWN0b3J5KCdUb3BvUGFuZWxTZXJ2aWNlJywKICAgICAgICBbJyRsb2cnLCAnJHdpbmRvdycsICckcm9vdFNjb3BlJywgJ0ZuU2VydmljZScsICdQYW5lbFNlcnZpY2UnLCAnR2x5cGhTZXJ2aWNlJywKICAgICAgICAgICAgJ0ZsYXNoU2VydmljZScsICdXZWJTb2NrZXRTZXJ2aWNlJywgJ0J1dHRvblNlcnZpY2UnLCAnTWFzdFNlcnZpY2UnLAogICAgICAgICAgICAnTmF2U2VydmljZScsCgogICAgICAgIGZ1bmN0aW9uIChfJGxvZ18sIF8kd2luZG93XywgXyRyb290U2NvcGVfLAogICAgICAgICAgICAgICAgICBfZnNfLCBfcHNfLCBfZ3NfLCBfZmxhc2hfLCBfd3NzXywgX2Juc18sIF9tYXN0XywgX25zXykgewogICAgICAgICAgICAkbG9nID0gXyRsb2dfOwogICAgICAgICAgICAkd2luZG93ID0gXyR3aW5kb3dfOwogICAgICAgICAgICAkcm9vdFNjb3BlID0gXyRyb290U2NvcGVfOwogICAgICAgICAgICBmcyA9IF9mc187CiAgICAgICAgICAgIHBzID0gX3BzXzsKICAgICAgICAgICAgZ3MgPSBfZ3NfOwogICAgICAgICAgICBmbGFzaCA9IF9mbGFzaF87CiCO8e9WM4YCAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA03cJAAEAGzRrAqAc2wKgHYJbRH/WMl+20WpbUioAQBW5zlgAAAQEICgC34scAYim9jvHvVjOGAgDmAwAA5gMAAGj3KB/SxQgAJ60eEwgARQAD2MzsQABABtpMwKgHYMCoBzYf9ZbRWpbUioyX7bSAGAOhk7EAAAEBCAoAYim+ALfixyAgICAgICAgICAgd3NzID0gX3dzc187CiAgICAgICAgICAgIGJucyA9IF9ibnNfOwogICAgICAgICAgICBtYXN0ID0gX21hc3RfOwogICAgICAgICAgICBucyA9IF9uc187CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgaW5pdFBhbmVsczogaW5pdFBhbmVscywKICAgICAgICAgICAgICAgIGRlc3Ryb3lQYW5lbHM6IGRlc3Ryb3lQYW5lbHMsCiAgICAgICAgICAgICAgICBjcmVhdGVUb3BvUGFuZWw6IGNyZWF0ZVRvcG9QYW5lbCwKCiAgICAgICAgICAgICAgICBzaG93U3VtbWFyeTogc2hvd1N1bW1hcnksCiAgICAgICAgICAgICAgICB0b2dnbGVTdW1tYXJ5OiB0b2dnbGVTdW1tYXJ5LAoKICAgICAgICAgICAgICAgIHRvZ2dsZVVzZURldGFpbHNGbGFnOiB0b2dnbGVVc2VEZXRhaWxzRmxhZywKICAgICAgICAgICAgICAgIGRpc3BsYXlTaW5nbGU6IGRpc3BsYXlTaW5nbGUsCiAgICAgICAgICAgICAgICBkaXNwbGF5TXVsdGk6IGRpc3BsYXlNdWx0aSwKICAgICAgICAgICAgICAgIGRpc3BsYXlMaW5rOiBkaXNwbGF5TGluaywKICAgICAgICAgICAgICAgIGRpc3BsYXlOb3RoaW5nOiBkaXNwbGF5Tm90aGluZywKICAgICAgICAgICAgICAgIGRpc3BsYXlTb21ldGhpbmc6IGRpc3BsYXlTb21ldGhpbmcsCiAgICAgICAgICAgICAgICBhZGRBY3Rpb246IGFkZEFjdGlvbiwKCiAgICAgICAgICAgICAgICBoaWRlU3VtbWFyeVBhbmVsOiBoaWRlU3VtbWFyeVBhbmVsLAoKICAgICAgICAgICAgICAgIGRldGFpbFZpc2libGU6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRldGFpbC5wYW5lbCgpLmlzVmlzaWJsZSgpOyB9LAogICAgICAgICAgICAgICAgc3VtbWFyeVZpc2libGU6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHN1bW1hcnkucGFuZWwoKS5pc1Zpc2libGUoKTsgfQogICAgICAgICAgICB9OwogICAgICAgIH1dKTsKfSgpKTsKjvHvVjSGAgBHAAAARwAAAGj3KB/SxQgAJ60eEwgARQAAOSwNQABABn7LwKgHYMCoBzYf9ZbTcoODP2EckASAGANGkBIAAAEBCAoAYim+ALfixjANCg0KjvHvVneKAgCRAgAAkQIAAAgAJ60eE2j3KB/SxQgARQACg2S4QABABkPWwKgHNsCoB2CW0x/1YRyQBHKDg0SAGAWkCf0AAAEBCAoAt+LHAGIpvkdFVCAvb25vcy91aS9hcHAvdmlldy90b3BvL3RvcG9TcHJpdGUuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6ICovKg0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71bUigIAkgIAAJICAAAIACetHhNo9ygf0sUIAEUAAoTdw0AAQAbKycCoBzbAqAdgltEf9YyX7bRaltgugBgFpJBAAAABAQgKALfixwBiKb5HRVQgL29ub3MvdWkvYXBwL3ZpZXcvdG9wby90b3BvVHJhZmZpYy5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0KjvHvVlWVAgB2GwAAdhsAAGj3KB/SxQgAJ60eEwgARQAbaMztQABABsK7wKgHYMCoBzYf9ZbRWpbYLoyX8ASAGAOsq0EAAAEBCAoAYim+ALfix0hUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2phdmFzY3JpcHQNCkNvbnRlbnQtTGVuZ3RoOiA2ODU5DQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCi8qCiAqIENvcHlyaWdodCAyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIFRvcG9sb2d5IFRyYWZmaWMgTW9kdWxlLgogRGVmaW5lcyBiZWhhdmlvciBmb3Igdmlld2luZyBkaWZmZXJlbnQgdHJhZmZpYyBtb2Rlcy4KICovCgooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIGluamVjdGVkIHJlZnMKICAgIHZhciAkbG9nLCBmcywgZmxhc2gsIHdzcywgYXBpOwoKICAgIC8qCiAgICAgICBBUEkgdG8gdG9wb0ZvcmNlCiAgICAgICAgIGhvdmVyZWQoKQogICAgICAgICBzb21ldGhpbmdTZWxlY3RlZCgpCiAgICAgICAgIHNlbGVjdE9yZGVyKCkKICAgICAqLwoKICAgIC8vIGludGVybmFsIHN0YXRlCiAgICB2YXIgdHJhZmZpY01vZGUgPSBudWxsLAogICAgICAgIGhvdmVyTW9kZSA9IG51bGw7CgoKICAgIC8vID09PSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gIEhlbHBlciBmdW5jdGlvbnMKCiAgICAvLyBpbnZva2VkIGluIHJlc3BvbnNlIHRvIGNoYW5nZSBpbiBzZWxlY3Rpb24gYW5kL29yIG1vdXNlb3Zlci9vdXQ6CiAgICBmdW5jdGlvbiByZXF1ZXN0VHJhZmZpY0Zvck1vZGUobW91c2UpIHsKICAgICAgICBpZiAodHJhZmZpY01vZGUgPT09ICdmbG93cycpIHsKICAgICAgICAgICAgcmVxdWVzdERldmljZUxpbmtGbG93cygpOwogICAgICAgIH0gZWxzZSBpZiAodHJhZmZpY01vZGUgPT09ICdpbnRlbnRzJykgewogICAgICAgICAgICBpZiAoIW1vdXNlIHx8IGhvdmVyTW9kZSA9PT0gJ2ludGVudHMnKSB7CiAgICAgICAgICAgICAgICByZXF1ZXN0UmVsYXRlZEludGVudHMoKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gcmVxdWVzdERldmljZUxpbmtGbG93cygpIHsKICAgICAgICAvLyBnZW5lcmF0ZXMgcGF5bG9hZCBiYXNlZCBvbiBjdXJyZW50IGhvdmVyLXN0YXRlCiAgICAgICAgdmFyIGhvdiA9IGFwaS5ob3ZlcmVkKCk7CgogICAgICAgIGZ1bmN0aW9uIGhvdmVyVmFsaWQoKSB7CiAgICAgICAgICAgIHJldHVybiBob3Zlck1vZGUgPT09ICdmbG93cycgJiYKICAgICAgICAgICAgICAgIGhvdiAmJiAoaG92LmNsYXNzID09PSAnZGV2aWNlJyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoYXBpLnNvbWV0aGluZ1NlbGVjdGVkKCkpIHsKICAgICAgICAgICAgd3NzLnNlbmRFdmVudCgncmVxdWVzdERldmljZUxpbmtGbG93cycsIHsKICAgICAgICAgICAgICAgIGlkczogYXBpLnNlbGVjdE9yZGVyKCksCiAgICAgICAgICAgICAgICBob3ZlcjogaG92ZXJWYWxpZCgpID8gaG92LmlkIDogJycKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHJlcXVlc3RSZWxhdGVkSW50ZW50cygpIHsKICAgICAgICAvLyBnZW5lcmF0ZXMgcGF5bG9hZCBiYXNlZCBvbiBjdXJyZW50IGhvdmVyLXN0YXRlCiAgICAgICAgdmFyIGhvdiA9IGFwaS5ob3ZlcmVkKCk7CgogICAgICAgIGZ1bmN0aW9uIGhvdmVyVmFsaWQoKSB7CiAgICAgICAgICAgIHJldHVybiBob3Zlck1vZGUgPT09ICdpbnRlbnRzJyAmJgogICAgICAgICAgICAgICAgaG92ICYmIChob3YuY2xhc3MgPT09ICdob3N0JyB8fCBob3YuY2xhc3MgPT09ICdkZXZpY2UnKTsKICAgICAgICB9CgogICAgICAgIGlmIChhcGkuc29tZXRoaW5nU2VsZWN0ZWQoKSkgewogICAgICAgICAgICB3c3Muc2VuZEV2ZW50KCdyZXF1ZXN0UmVsYXRlZEludGVudHMnLCB7CiAgICAgICAgICAgICAgICBpZHM6IGFwaS5zZWxlY3RPcmRlcigpLAogICAgICAgICAgICAgICAgaG92ZXI6IGhvdmVyVmFsaWQoKSA/IGhvdi5pZCA6ICcnCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KCgogICAgLy8gPT09IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vICBUcmFmZmljIHJlcXVlc3RzIGludm9rZWQgZnJvbSBrZXlzdHJva2VzIG9yIHRvb2xiYXIgYnV0dG9ucy4uLgoKICAgIGZ1bmN0aW9uIGNhbmNlbFRyYWZmaWMoZm9yY2VkKSB7CiAgICAgICAgaWYgKCF0cmFmZmljTW9kZSB8fCAoIWZvcmNlZCAmJiB0cmFmZmljTW9kZSA9PT0gJ2FsbEZsb3dQb3J0JykpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgdHJhZmZpY01vZGUgPSBob3Zlck1vZGUgPSBudWxsOwogICAgICAgIHdzcy5zZW5kRXZlbnQoJ2NhbmNlbFRyYWZmaWMnKTsKICAgICAgICBmbGFzaC5mbGFzaCgnVHJhZmZpYyBtb25pdG9yaW5nIGNhbmNlbGVkJyk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgZnVuY3Rpb24gc2hvd0FsbEZsb3dUcmFmZmljKCkgewogICAgICAgIHRyYWZmaWNNb2RlID0gJ2FsbEZsb3dQb3J0JzsKICAgICAgICBob3Zlck1vZGUgPSBudWxsOwogICAgICAgIHdzcy5zZW5kRXZlbnQoJ3JlcXVlc3RBbGxGbG93VHJhZmZpYycpOwogICAgICAgIGZsYXNoLmZsYXNoKCdBbGwgRmxvdyBUcmFmZmljJyk7CiAgICB9CgogICAgZnVuY3Rpb24gc2hvd0FsbFBvcnRUcmFmZmljKCkgewogICAgICAgIHRyYWZmaWNNb2RlID0gJ2FsbEZsb3dQb3J0JzsKICAgICAgICBob3Zlck1vZGUgPSBudWxsOwogICAgICAgIHdzcy5zZW5kRXZlbnQoJ3JlcXVlc3RBbGxQb3J0VHJhZmZpYycpOwogICAgICAgIGZsYXNoLmZsYXNoKCdBbGwgUG9ydCBUcmFmZmljJyk7CiAgICB9CgogICAgZnVuY3Rpb24gc2hvd0RldmljZUxpbmtGbG93cyAoKSB7CiAgICAgICAgdHJhZmZpY01vZGUgPSBob3Zlck1vZGUgPSAnZmxvd3MnOwogICAgICAgIHJlcXVlc3REZXZpY2VMaW5rRmxvd3MoKTsKICAgICAgICBmbGFzaC5mbGFzaCgnRGV2aWNlIEZsb3dzJyk7CiAgICB9CgogICAgZnVuY3Rpb24gc2hvd1JlbGF0ZWRJbnRlbnRzICgpIHsKICAgICAgICB0cmFmZmljTW9kZSA9IGhvdmVyTW9kZSA9ICdpbnRlbnRzJzsKICAgICAgICByZXF1ZXN0UmVsYXRlZEludGVudHMoKTsKICAgICAgICBmbGFzaC5mbGFzaCgnUmVsYXRlZCBQYXRocycpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNob3dQcmV2SW50ZW50KCkgewogICAgICAgIGlmICh0cmFmZmljTW9kZSA9PT0gJ2ludGVudHMnKSB7CiAgICAgICAgICAgIGhvdmVyTW9kZSA9IG51bGw7CiAgICAgICAgICAgIHdzcy5zZW5kRXZlbnQoJ3JlcXVlc3RQcmV2UmVsYXRlZEludGVudCcpOwogICAgICAgICAgICBmbGFzaC5mbGFzaCgnUHJldmlvdXMgcmVsYXRlZCBpbnRlbnQnKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gc2hvd05leHRJbnRlbnQoKSB7CiAgICAgICAgaWYgKHRyYWZmaWNNb2RlID09PSAnaW50ZW50cycpIHsKICAgICAgICAgICAgaG92ZXJNb2RlID0gbnVsbDsKICAgICAgICAgICAgd3NzLnNlbmRFdmVudCgncmVxdWVzdE5leHRSZWxhdGVkSW50ZW50Jyk7CiAgICAgICAgICAgIGZsYXNoLmZsYXNoKCdOZXh0IHJlbGF0ZWQgaW50ZW50Jyk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHNob3dTZWxlY3RlZEludGVudFRyYWZmaWMoKSB7CiAgICAgICAgaWYgKHRyYWZmaWNNb2RlID09PSAnaW50ZW50cycpIHsKICAgICAgICAgICAgaG92ZXJNb2RlID0gbnVsbDsKICAgICAgICAgICAgd3NzLnNlbmRFdmVudCgncmVxdWVzdFNlbGVjdGVkSW50ZW50VHJhZmZpYycpOwogICAgICAgICAgICBmbGFzaC5mbGFzaCgnVHJhZmZpYyBvbiBTZWxlY3RlZCBQYXRoJyk7CiAgICAgICAgfQogICAgfQoKICAgIC8vIGZvcmNlIHRoZSBzeXN0ZW0gdG8gY3JlYXRlIGEgc2luZ2xlIGludGVudCBzZWxlY3Rpb24KICAgIGZ1bmN0aW9uIHNlbGVjdEludGVudChkYXRhKSB7CiAgICAgICAgdHJhZmZpY01vZGUgPSAnaW50ZW50cyc7CiAgICAgICAgaG92ZXJNb2RlID0gbnVsbDsKICAgICAgICB3c3Muc2VuZEV2ZW50KCdzZWxlY3RJbnRlbnQnLCBkYXRhKTsKICAgICAgICBmbGFzaC5mbGFzaCgnU2VsZWN0aW5nIEludGVudCAnICsgZGF0YS5rZXkpOwogICAgfQoKCiAgICAvLyA9PT0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBhY3Rpb24gYnV0dG9ucyBvbiBkZXRhaWwgcGFuZWwgKG11bHRpcGxlIHNlbGVjdGlvbikKCiAgICBmdW5jdGlvbiBhZGRIb3N0SW50ZW50ICgpIHsKICAgICAgICB2YXIgc28gPSBhcGkuc2VsZWN0T3JkZXIoKTsKICAgICAgICB3c3Muc2VuZEV2ZW50KCdhZGRIb3N0SW50ZW50JywgewogICAgICAgICAgICBvbmU6IHNvWzBdLAogICAgICAgICAgICB0d286IHNvWzFdLAogICAgICAgICAgICBpZHM6IHNvCiAgICAgICAgfSk7CiAgICAgICAgdHJhZmZpY01vZGUgPSAnaW50ZW50cyc7CiAgICAgICAgaG92ZXJNb2RlID0gbnVsbDsKICAgICAgICBmbGFzaC5mbGFzaCgnSG9zdC10by1Ib3N0IGZsb3cgYWRkZWQnKTsKICAgIH0KCiAgICBmdW5jdGlvbiBhZGRNdWx0aVNvdXJjZUludGVudCAoKSB7CiAgICAgICAgdmFyIHNvID0gYXBpLnNlbGVjdE9yZGVyKCk7CiAgICAgICAgd3NzLnNlbmRFdmVudCgnYWRkTXVsdGlTb3VyY2VJbnRlbnQnLCB7CiAgICAgICAgICAgIHNyYzogc28uc2xpY2UoMCwgc28ubGVuZ3RoIC0gMSksCiAgICAgICAgICAgIGRzdDogc29bc28ubGVuZ3RoIC0gMV0sCiAgICAgICAgICAgIGlkczogc28KICAgICAgICB9KTsKICAgICAgICB0cmFmZmljTW9kZSA9ICdpbnRlbnRzJzsKICAgICAgICBob3Zlck1vZGUgPSBudWxsOwogICAgICAgIGZsYXNoLmZsYXNoKCdNdWx0aS1Tb3VyY2UgZmxvdyBhZGRlZCcpOwogICAgfQoKCiAgICAvLyA9PT0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vID09PSBNT0RVTEUgREVGSU5JVElPTiA9PT0KCiAgICBhbmd1bGFyLm1vZHVsZSgnb3ZUb3BvJykKICAgIC5mYWN0b3J5KCdUb3BvVHJhZmZpY1NlcnZpY2UnLAogICAgICAgIFsnJGxvZycsICdGblNlcnZpY2UnLCAnRmxhc2hTZXJ2aWNlJywgJ1dlYlNvY2tldFNlcnZpY2UnLAoKICAgICAgICBmdW5jdGlvbiAoXyRsb2dfLCBfZnNfLCBfZmxhc2hfLCBfd3NzXykgewogICAgICAgICAgICAkbG9nID0gXyRsb2dfOwogICAgICAgICAgICBmcyA9IF9mc187CiAgICAgICAgICAgIGZsYXNoID0gX2ZsYXNoXzsKICAgICAgICAgICAgd3NzID0gX3dzc187CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgaW5pdFRyYWZmaWM6IGZ1bmN0aW9uIChfYXBpXykgeyBhcGkgPSBfYXBpXzsgfSwKICAgICAgICAgICAgICAgIGRlc3Ryb3lUcmFmZmljOiBmdW5jdGlvbiAoKSB7IH0sCgogICAgICAgICAgICAgICAgLy8gaW52b2tlZCBmcm9tIHRvb2xiYXIgb3ZlcmxheSBidXR0b25zIG9yIGtleXN0cm9rZXMKICAgICAgICAgICAgICAgIGNhbmNlbFRyYWZmaWM6IGNhbmNlbFRyYWZmaWMsCiAgICAgICAgICAgICAgICBzaG93QWxsRmxvd1RyYWZmaWM6IHNob3dBbGxGbG93VHJhZmZpYywKICAgICAgICAgICAgICAgIHNob3dBbGxQb3J0VHJhZmZpYzogc2hvd0FsbFBvcnRUcmFmZmljLAogICAgICAgICAgICAgICAgc2hvd0RldmljZUxpbmtGbG93czogc2hvd0RldmljZUxpbmtGbG93cywKICAgICAgICAgICAgICAgIHNob3dSZWxhdGVkSW50ZW50czogc2hvd1JlbGF0ZWRJbnRlbnRzLAogICAgICAgICAgICAgICAgc2hvd1ByZXZJbnRlbnQ6IHNob3dQcmV2SW50ZW50LAogICAgICAgICAgICAgICAgc2hvd05leHRJbnRlbnQ6IHNob3dOZXh0SW50ZW50LAogICAgICAgICAgICAgICAgc2hvd1NlbGVjdGVkSW50ZW50VHJhZmZpYzogc2hvd1NlbGVjdGVkSW50ZW50VHJhZmZpYywKICAgICAgICAgICAgICAgIHNlbGVjdEludGVudDogc2VsZWN0SW50ZW50LAoKICAgICAgICAgICAgICAgIC8vIGludm9rZWQgZnJvbSBtb3VzZW92ZXIvbW91c2VvdXQgYW5kIHNlbGVjdGlvbiBjaGFuZ2UKICAgICAgICAgICAgICAgIHJlcXVlc3RUcmFmZmljRm9yTW9kZTogcmVxdWVzdFRyYWZmaWNGb3JNb2RlLAoKICAgICAgICAgICAgICAgIC8vIFRPRE86IHRoZXNlIHNob3VsZCBtb3ZlIHRvIG5ldyBVSSBkZW1vIGFwcAogICAgICAgICAgICAgICAgLy8gaW52b2tlZCBmcm9tIGJ1dHRvbnMgb24gZGV0YWlsIChtdWx0aS1zZWxlY3QpIHBhbmVsCiAgICAgICAgICAgICAgICBhZGRIb3N0SW50ZW50OiBhZGRIb3N0SW50ZW50LAogICAgICAgICAgICAgICAgYWRkTXVsdGlTb3VyY2VJbnRlbnQ6IGFkZE11bHRpU291cmNlSW50ZW50CiAgICAgICAgICAgIH07CiAgICAgICAgfV0pOwp9KCkpOwqO8e9WmpUCAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA03cRAAEAGzRjAqAc2wKgHYJbRH/WMl/AEWpbzYoAQBY5STAAAAQEICgC34sgAYim+jvHvVvaZAgCVAgAAlQIAAAgAJ60eE2j3KB/SxQgARQACh93FQABABsrEwKgHNsCoB2CW0R/1jJfwBFqW82KAGAWkXaIAAAEBCAoAt+LIAGIpvkdFVCAvb25vcy91aS9hcHAvdmlldy90b3BvL3RvcG9UcmFmZmljTmV3LmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiAqLyoNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQqO8e9WyMECAHoUAAB6FAAAaPcoH9LFCAAnrR4TCABFABRszPJAAEAGybLAqAdgwKgHNh/1ltFalvNijJfyV4AYA7akRQAAAQEICgBiKcEAt+LISFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvamF2YXNjcmlwdA0KQ29udGVudC1MZW5ndGg6IDUwNzENClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICoKICovCgovKgogT05PUyBHVUkgLS0gVG9wb2xvZ3kgVHJhZmZpYyBPdmVybGF5IE1vZHVsZS4KIERlZmluZXMgYmVoYXZpb3IgZm9yIHZpZXdpbmcgZGlmZmVyZW50IHRyYWZmaWMgbW9kZXMuCiBJbnN0YWxsZWQgYXMgYSBUb3BvbG9neSBPdmVybGF5LgogKi8KKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBpbmplY3RlZCByZWZzCiAgICB2YXIgJGxvZywgdG92LCB0dHM7CgogICAgLy8gTk9URTogbm8gaW50ZXJuYWwgc3RhdGUgaGVyZSAtLSBzZWUgVG9wb1RyYWZmaWNTZXJ2aWNlIGZvciB0aGF0CgogICAgLy8gTk9URTogcHJvdmlkaW5nIGJ1dHRvbiBkaXNhYmxpbmcgcmVxdWlyZXMgdG9vIGJpZyBhIHJlZmFjdG9yaW5nIG9mCiAgICAvLyAgICAgICB0aGUgYnV0dG9uIGZhY3RvcnkgZXRjLiBXaWxsIGhhdmUgdG8gYmUgZG9uZSBhbm90aGVyIHRpbWUuCgoKICAgIC8vIHRyYWZmaWMgb3ZlcmxheSBkZWZpbml0aW9uCiAgICB2YXIgb3ZlcmxheSA9IHsKICAgICAgICBvdmVybGF5SWQ6ICd0cmFmZmljJywKICAgICAgICBnbHlwaElkOiAnYWxsVHJhZmZpYycsCiAgICAgICAgdG9vbHRpcDogJ1RyYWZmaWMgT3ZlcmxheScsCgogICAgICAgIC8vIE5PVEU6IFRyYWZmaWMgZ2x5cGhzIGFscmVhZHkgaW5zdGFsbGVkIGFzIHBhcnQgb2YgdGhlIGJhc2UgT05PUyBzZXQuCgogICAgICAgIGFjdGl2YXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICRsb2cuZGVidWcoIlRyYWZmaWMgb3ZlcmxheSBBQ1RJVkFURUQiKTsKICAgICAgICB9LAoKICAgICAgICBkZWFjdGl2YXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHR0cy5jYW5jZWxUcmFmZmljKHRydWUpOwogICAgICAgICAgICAkbG9nLmRlYnVnKCJUcmFmZmljIG92ZXJsYXkgREVBQ1RJVkFURUQiKTsKICAgICAgICB9LAoKICAgICAgICAvLyBkZXRhaWwgcGFuZWwgYnV0dG9uIGRlZmluaXRpb25zCiAgICAgICAgLy8gKGtleXMgbWF0Y2ggYnV0dG9uIGlkZW50aWZpZXJzLCBhbHNvIGRlZmluZWQgaW4gVHJhZmZpY092ZXJsYXkuamF2YSkKICAgICAgICBidXR0b25zOiB7CiAgICAgICAgICAgIHNob3dEZXZpY2VGbG93czogewogICAgICAgICAgICAgICAgZ2lkOiAnZmxvd3MnLAogICAgICAgICAgICAgICAgdHQ6ICdTaG93IERldmljZSBGbG93cycsCiAgICAgICAgICAgICAgICBjYjogZnVuY3Rpb24gKGRhdGEpIHsgdHRzLnNob3dEZXZpY2VMaW5rRmxvd3MoKTsgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgc2hvd1JlbGF0ZWRUcmFmZmljOiB7CiAgICAgICAgICAgICAgICBnaWQ6ICdyZWxhdGVkSW50ZW50cycsCiAgICAgICAgICAgICAgICB0dDogJ1Nob3cgUmVsYXRlZCBUcmFmZmljJywKICAgICAgICAgICAgICAgIGNiOiBmdW5jdGlvbiAoZGF0YSkgeyB0dHMuc2hvd1JlbGF0ZWRJbnRlbnRzKCk7IH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8vIGtleSBiaW5kaW5ncyBmb3IgdHJhZmZpYyBvdmVybGF5IHRvb2xiYXIgYnV0dG9ucwogICAgICAgIC8vIE5PVEU6IGZ1bGx5IHF1YWwuIGJ1dHRvbiBJRCBpcyBkZXJpdmVkIGZyb20gb3ZlcmxheS1pZCBhbmQga2V5LW5hbWUKICAgICAgICBrZXlCaW5kaW5nczogewogICAgICAgICAgICAwOiB7CiAgICAgICAgICAgICAgICBjYjogZnVuY3Rpb24gKCkgeyB0dHMuY2FuY2VsVHJhZmZpYyh0cnVlKTsgfSwKICAgICAgICAgICAgICAgIHR0OiAnQ2FuY2VsIHRyYWZmaWMgbW9uaXRvcmluZycsCiAgICAgICAgICAgICAgICBnaWQ6ICd4TWFyaycKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIEE6IHsKICAgICAgICAgICAgICAgIGNiOiBmdW5jdGlvbiAoKSB7IHR0cy5zaG93QWxsRmxvd1RyYWZmaWMoKTsgfSwKICAgICAgICAgICAgICAgIHR0OiAnTW9uaXRvciBhbGwgdHJhZmZpYyB1c2luZyBmbG93IHN0YXRzJywKICAgICAgICAgICAgICAgIGdpZDogJ2FsbFRyYWZmaWMnCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFE6IHsKICAgICAgICAgICAgICAgIGNiOiBmdW5jdGlvbiAoKSB7IHR0cy5zaG93QWxsUG9ydFRyYWZmaWMoKTsgfSwKICAgICAgICAgICAgICAgIHR0OiAnTW9uaXRvciBhbGwgdHJhZmZpYyB1c2luZyBwb3J0IHN0YXRzJywKICAgICAgICAgICAgICAgIGdpZDogJ2FsbFRyYWZmaWMnCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEY6IHsKICAgICAgICAgICAgICAgIGNiOiBmdW5jdGlvbiAoKSB7IHR0cy5zaG93RGV2aWNlTGlua0Zsb3dzKCk7IH0sCiAgICAgICAgICAgICAgICB0dDogJ1Nob3cgZGV2aWNlIGxpbmsgZmxvd3MnLAogICAgICAgICAgICAgICAgZ2lkOiAnZmxvd3MnCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFY6IHsKICAgICAgICAgICAgICAgIGNiOiBmdW5jdGlvbiAoKSB7IHR0cy5zaG93UmVsYXRlZEludGVudHMoKTsgfSwKICAgICAgICAgICAgICAgIHR0OiAnU2hvdyBhbGwgcmVsYXRlZCBpbnRlbnRzJywKICAgICAgICAgICAgICAgIGdpZDogJ3JlbGF0ZWRJbnRlbnRzJwogICAgICAgICAgICB9LAogICAgICAgICAgICBsZWZ0QXJyb3c6IHsKICAgICAgICAgICAgICAgIGNiOiBmdW5jdGlvbiAoKSB7IHR0cy5zaG93UHJldkludGVudCgpOyB9LAogICAgICAgICAgICAgICAgdHQ6ICdTaG93IHByZXZpb3VzIHJlbGF0ZWQgaW50ZW50JywKICAgICAgICAgICAgICAgIGdpZDogJ3ByZXZJbnRlbnQnCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHJpZ2h0QXJyb3c6IHsKICAgICAgICAgICAgICAgIGNiOiBmdW5jdGlvbiAoKSB7IHR0cy5zaG93TmV4dEludGVudCgpOyB9LAogICAgICAgICAgICAgICAgdHQ6ICdTaG93IG5leHQgcmVsYXRlZCBpbnRlbnQnLAogICAgICAgICAgICAgICAgZ2lkOiAnbmV4dEludGVudCcKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVzogewogICAgICAgICAgICAgICAgY2I6IGZ1bmN0aW9uICgpIHsgdHRzLnNob3dTZWxlY3RlZEludGVudFRyYWZmaWMoKTsgfSwKICAgICAgICAgICAgICAgIHR0OiAnTW9uaXRvciB0cmFmZmljIG9mIHNlbGVjdGVkIGludGVudCcsCiAgICAgICAgICAgICAgICBnaWQ6ICdpbnRlbnRUcmFmZmljJwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgX2tleU9yZGVyOiBbCiAgICAgICAgICAgICAgICAnMCcsICdBJywgJ1EnLCAnRicsICdWJywgJ2xlZnRBcnJvdycsICdyaWdodEFycm93JywgJ1cnCiAgICAgICAgICAgIF0KICAgICAgICB9LAoKICAgICAgICBob29rczogewogICAgICAgICAgICAvLyBob29rIGZvciBoYW5kbGluZyBlc2NhcGUga2V5CiAgICAgICAgICAgIGVzY2FwZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgLy8gTXVzdCByZXR1cm4gdHJ1ZSB0byBjb25zdW1lIEVTQywgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAgICAgICAgcmV0dXJuIHR0cy5jYW5jZWxUcmFmZmljKHRydWUpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gaG9va3MgZm9yIHdoZW4gdGhlIHNlbGVjdGlvbiBjaGFuZ2VzLi4uCiAgICAgICAgICAgIGVtcHR5OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB0dHMuY2FuY2VsVHJhZmZpYygpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBzaW5nbGU6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICB0dHMucmVxdWVzdFRyYWZmaWNGb3JNb2RlKCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG11bHRpOiBmdW5jdGlvbiAoc2VsZWN0T3JkZXIpIHsKICAgICAgICAgICAgICAgIHR0cy5yZXF1ZXN0VHJhZmZpY0Zvck1vZGUoKTsKICAgICAgICAgICAgICAgIHRvdi5hZGREZXRhaWxCdXR0b24oJ3Nob3dSZWxhdGVkVHJhZmZpYycpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gbW91c2UgaG9va3MKICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbiAobSkgewogICAgICAgICAgICAgICAgLy8gbSBoYXMgaWQsIGNsYXNzLCBhbmQgdHlwZSBwcm9wZXJ0aWVzCiAgICAgICAgICAgICAgICB0dHMucmVxdWVzdFRyYWZmaWNGb3JNb2RlKHRydWUpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdHRzLnJlcXVlc3RUcmFmZmljRm9yTW9kZSh0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CgogICAgLy8gaW52b2tlIGNvZGUgdG8gcmVnaXN0ZXIgd2l0aCB0aGUgb3ZlcmxheSBzZXJ2aWNlCiAgICBhbmd1bGFyLm1vZHVsZSgnb3ZUb3BvJykKICAgICAgICAucnVuKFsnJGxvZycsICdUb3BvT3ZlcmxheVNlcnZpY2UnLCAnVG9wb1RyYWZmaWNTZXJ2aWNlJywKCiAgICAgICAgZnVuY3Rpb24gKF8kbG9nXywgX3Rvdl8sIF90dHNfKSB7CiAgICAgICAgICAgICRsb2cgPSBfJGxvZ187CiAgICAgICAgICAgIHRvdiA9IF90b3ZfOwogICAgICAgICAgICB0dHMgPSBfdHRzXzsKICAgICAgICAgICAgdG92LnJlZ2lzdGVyKG92ZXJsYXkpOwogICAgICAgIH1dKTsKCn0oKSk7Co7x71YMwgIAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADTdxkAAQAbNFsCoBzbAqAdgltEf9YyX8ldalweagBAFjju7AAABAQgKALfiywBiKcGO8e9WLMMCAEcAAABHAAAAaPcoH9LFCAAnrR4TCABFAAA5f25AAEAGK2rAqAdgwKgHNh/1ls8Ov0ldo2r4MoAYBAiQEgAAAQEICgBiKcEAt+LGMA0KDQqO8e9Wd8cCAJICAACSAgAACAAnrR4TaPcoH9LFCABFAAKExEhAAEAG5ETAqAc2wKgHYJbPH/WjavgyDr9JYoAYIWYyswAAAQEICgC34ssAYinBR0VUIC9vbm9zL3VpL2FwcC92aWV3L3RvcG8vdG9wb1Rvb2xiYXIuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6ICovKg0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71adxwIAjwIAAI8CAAAIACetHhNo9ygf0sUIAEUAAoHdx0AAQAbKyMCoBzbAqAdgltEf9YyX8ldalweagBgFpKBNAAABAQgKALfiywBiKcFHRVQgL29ub3MvdWkvYXBwL3ZpZXcvZGV2aWNlL2RldmljZS5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0KjvHvVu3LAgDdMAAA3TAAAGj3KB/SxQgAJ60eEwgARQAwz8z2QABABq1LwKgHYMCoBzYf9ZbRWpcHmoyX9KSAGAPBwKgAAAEBCAoAYinCALfiy0hUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2phdmFzY3JpcHQNCkNvbnRlbnQtTGVuZ3RoOiAxMjMzNw0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNSwyMDE2IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIERldmljZSBWaWV3IE1vZHVsZQogKi8KCihmdW5jdGlvbiAoKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8gaW5qZWN0ZWQgcmVmcwogICAgdmFyICRsb2csICRzY29wZSwgJGxvYywgZnMsIG1hc3QsIHBzLCB3c3MsIGlzLCBucywga3M7CgogICAgLy8gaW50ZXJuYWwgc3RhdGUKICAgIHZhciBkZXRhaWxzUGFuZWwsCiAgICAgICAgcFN0YXJ0WSwKICAgICAgICBwSGVpZ2h0LAogICAgICAgIHRvcCwKICAgICAgICBib3R0b20sCiAgICAgICAgaWNvbkRpdiwKICAgICAgICB3U2l6ZSwKICAgICAgICBlZGl0aW5nTmFtZSA9IGZhbHNlOwoKICAgIC8vIGNvbnN0YW50cwogICAgdmFyIHRvcFBkZyA9IDEzLAogICAgICAgIGN0bnJQZGcgPSAyNCwKICAgICAgICBzY3JvbGxTaXplID0gMTcsCiAgICAgICAgcG9ydHNUYmxQZGcgPSA1MCwKCiAgICAgICAgcE5hbWUgPSAnZGV2aWNlLWRldGFpbHMtcGFuZWwnLAogICAgICAgIGRldGFpbHNSZXEgPSAnZGV2aWNlRGV0YWlsc1JlcXVlc3QnLAogICAgICAgIGRldGFpbHNSZXNwID0gJ2RldmljZURldGFpbHNSZXNwb25zZScsCiAgICAgICAgbmFtZUNoYW5nZVJlcSA9ICdkZXZpY2VOYW1lQ2hhbmdlUmVxdWVzdCcsCiAgICAgICAgbmFtZUNoYW5nZVJlc3AgPSAnZGV2aWNlTmFtZUNoYW5nZVJlc3BvbnNlJywKCiAgICAgICAgcHJvcE9yZGVyID0gWwogICAgICAgICAgICAnaWQnLCAndHlwZScsICdtYXN0ZXJpZCcsICdjaGFzc2lzaWQnLAogICAgICAgICAgICAnbWZyJywgJ2h3JywgJ3N3JywgJ3Byb3RvY29sJywgJ3NlcmlhbCcKICAgICAgICBdLAogICAgICAgIGZyaWVuZGx5UHJvcHMgPSBbCiAgICAgICAgICAgICdVUkknLCAnVHlwZScsICdNYXN0ZXIgSUQnLCAnQ2hhc3NpcyBJRCcsCiAgICAgICAgICAgICdWZW5kb3InLCAnSC9XIFZlcnNpb24nLCAnUy9XIFZlcnNpb24nLCAnUHJvdG9jb2wnLCAnU2VyaWFsICMnCiAgICAgICAgXSwKICAgICAgICBwb3J0Q29scyA9IFsKICAgICAgICAgICAgJ2VuYWJsZWQnLCAnaWQnLCAnc3BlZWQnLCAndHlwZScsICdlbGlua3NfZGVzdCcsICduYW1lJwogICAgICAgIF0sCiAgICAgICAgZnJpZW5kbHlQb3J0Q29scyA9IFsKICAgICAgICAgICAgJ0VuYWJsZWQnLCAnSUQnLCAnU3BlZWQnLCAnVHlwZScsICdFZ3Jlc3MgTGlua3MnLCAnTmFtZScKICAgICAgICBdOwoKICAgIGZ1bmN0aW9uIGNsb3NlUGFuZWwoKSB7CiAgICAgICAgaWYgKGRldGFpbHNQYW5lbC5pc1Zpc2libGUoKSkgewogICAgICAgICAgICAkc2NvcGUuc2VsSWQgPSBudWxsOwogICAgICAgICAgICBkZXRhaWxzUGFuZWwuaGlkZSgpOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZENsb3NlQnRuKGRpdikgewogICAgICAgIGlzLmxvYWRFbWJlZGRlZEljb24oZGl2LCAncGx1cycsIDMwKTsKICAgICAgICBkaXYuc2VsZWN0KCdnJykuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgyNSwgMCkgcm90YXRlKDQ1KScpOwogICAgICAgIGRpdi5vbignY2xpY2snLCBjbG9zZVBhbmVsKTsKICAgIH0KCiAgICBmdW5jdGlvbiBleGl0RWRpdE1vZGUobmFtZUgyLCBuYW1lKSB7CiAgICAgICAgbmFtZUgyLmh0bWwobmFtZSk7CiAgICAgICAgbmFtZUgyLmNsYXNzZWQoJ2VkaXRhYmxlJywgdHJ1ZSk7CiAgICAgICAgZWRpdGluZ05hbWUgPSBmYWxzZTsKICAgICAgICBrcy5lbmFibGVHbG9iYWxLZXlzKHRydWUpOwogICAgfQoKICAgIGZ1bmN0aW9uIGVkaXROYW1lU2F2ZSgpIHsKICAgICAgICB2YXIgbmFtZUgyID0gdG9wLnNlbGVjdCgnaDInKSwKICAgICAgICAgICAgaWQgPSAkc2NvcGUucGFuZWxEYXRhLmlkLAogICAgICAgICAgICB2YWwsCiAgICAgICAgICAgIG5ld1ZhbDsKCiAgICAgICAgaWYgKGVkaXRpbmdOYW1lKSB7CiAgICAgICAgICAgIHZhbCA9IG5hbWVIMi5zZWxlY3QoJ2lucHV0JykucHJvcGVydHkoJ3ZhbHVlJykudHJpbSgpOwogICAgICAgICAgICBuZXdWYWwgPSB2YWwgfHwgaWQ7CgogICAgICAgICAgICBleGl0RWRpdE1vZGUobmFtZUgyLCBuZXdWYWwpOwogICAgICAgICAgICAkc2NvcGUucGFuZWxEYXRhLm5hbWUgPSBuZXdWYWw7CiAgICAgICAgICAgIHdzcy5zZW5kRXZlbnQobmFtZUNoYW5nZVJlcSwgeyBpZDogaWQsIG5hbWU6IHZhbCB9KTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZWRpdE5hbWVDYW5jZWwoKSB7CiAgICAgICAgaWYgKGVkaXRpbmdOYW1lKSB7CiAgICAgICAgICAgIGV4aXRFZGl0TW9kZSh0b3Auc2VsZWN0KCdoMicpLCAkc2NvcGUucGFuZWxEYXRhLm5hbWUpOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIGZ1bmN0aW9uIGVkaXROYW1lKCkgewogICAgICAgIHZhciBuYW1lSDIgPSB0b3Auc2VsZWN0KCdoMicpLAogICAgICAgICAgICB0ZiwgZWw7CgogICAgICAgIGlmICghZWRpdGluZ05hbWUpIHsKICAgICAgICAgICAgbmFtZUgyLmNsYXNzZWQoJ2VkaXRhYmxlJywgZmFsc2UpOwogICAgICAgICAgICBuYW1lSDIuaHRtbCgnJyk7CiAgICAgICAgICAgIHRmID0gbmFtZUgyLmFwcGVuZCgnaW5wdXQnKS5jbGFzc2VkKCduYW1lLWlucHV0JywgdHJ1ZSkKICAgICAgICAgICAgICAgIC5hdHRyKCd0eXBlJywgJ3RleHQnKQogICAgICAgICAgICAgICAgLmF0dHIoJ3ZhbHVlJywgJHNjb3BlLnBhbmVsRGF0YS5uYW1lKTsKICAgICAgICAgICAgZWwgPSB0ZlswXVswXTsKICAgICAgICAgICAgZWwuZm9jdXMoKTsKICAgICAgICAgICAgZWwuc2VsZWN0KCk7CiAgICAgICAgICAgIGVkaXRpbmdOYW1lID0gdHJ1ZTsKICAgICAgICAgICAga3MuZW5hYmxlR2xvYmFsS2V5cyhmYWxzZSk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGhhbmRsZUVzY2FwZSgpIHsKICAgICAgICByZXR1cm4gZWRpdE5hbWVDYW5jZWwoKSB8fCBjbG9zZVBhbmVsKCk7CiAgICB9CgogICAgZnVuY3Rpb24gc2V0VXBQYW5lbCgpIHsKICAgICAgICB2YXIgY29udGFpbmVyLCBjbG9zZUJ0biwgdGJsRGl2OwogICAgICAgIGRldGFpbHNQYW5lbC5lbXB0eSgpOwoKICAgICAgICBjb250YWluZXIgPSBkZXRhaWxzUGFuZWwuYXBwZW5kKCdkaXYnKS5jbGFzc2VkKCdjb250YWluZXInLCB0cnVlKTsKCiAgICAgICAgdG9wID0gY29udGFpbmVyLmFwcGVuZCgnZGl2JykuY2xhc3NlZCgndG9wJywgdHJ1ZSk7CiAgICAgICAgY2xvc2VCdG4gPSB0b3AuYXBwZW5kKCdkaXYnKS5jbGFzc2VkKCdjbG9zZS1idG4nLCB0cnVlKTsKICAgICAgICBhZGRDbG9zZUJ0bihjbG9zZUJ0bik7CiAgICAgICAgaWNvbkRpdiA9IHRvcC5hcHBlbmQoJ2RpdicpLmNsYXNzZWQoJ2Rldi1pY29uJywgdHJ1ZSk7CiAgICAgICAgdG9wLmFwcGVuZCgnaDInKS5jbGFzc2VkKCdlZGl0YWJsZScsIHRydWUpLm9uKCdjbGljaycsIGVkaXROYW1lKTsKCiAgICAgICAgdGJsRGl2ID0gdG9wLmFwcGVuZCgnZGl2JykuY2xhc3NlZCgndG9wLXRhYmxlcycsIHRydWUpOwogICAgICAgIHRibERpdi5hcHBlbmQoJ2RpdicpLmNsYXNzZWQoJ2xlZnQnLCB0cnVlKS5hcHBlbmQoJ3RhYmxlJyk7CiAgICAgICAgdGJsRGl2LmFwcGVuZCgnZGl2JykuY2xhc3NlZCgncmlnaHQnLCB0cnVlKS5hcHBlbmQoJ3RhYmxlJyk7CgogICAgICAgIHRvcC5hcHBlbmQoJ2hyJyk7CgogICAgICAgIGJvdHRvbSA9IGNvbnRhaW5lci5hcHBlbmQoJ2RpdicpLmNsYXNzZWQoJ2JvdHRvbScsIHRydWUpOwogICAgICAgIGJvdHRvbS5hcHBlbmQoJ2gyJykuY2xhc3NlZCgncG9ydHMtdGl0bGUnLCB0cnVlKS5odG1sKCdQb3J0cycpOwogICAgICAgIGJvdHRvbS5hcHBlbmQoJ3RhYmxlJyk7CiAgICB9CgogICAgZnVuY3Rpb24gYWRkUHJvcCh0Ym9keSwgaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgdmFyIHRyID0gdGJvZHkuYXBwZW5kKCd0cicpOwoKICAgICAgICBmdW5jdGlvbiBhZGRDZWxsKGNscywgdHh0KSB7CiAgICAgICAgICAgIHRyLmFwcGVuZCgndGQnKS5hdHRyKCdjbGFzcycsIGNscykuaHRtbCh0eHQpOwogICAgICAgIH0KICAgICAgICBhZGRDZWxsKCdsYWJlbCcsIGZyaWVuZGx5UHJvcHNbaW5kZXhdICsgJyA6Jyk7CiAgICAgICAgYWRkQ2VsbCgndmFsdWUnLCB2YWx1ZSk7CiAgICB9CgogICAgZnVuY3Rpb24gcG9wdWxhdGVUb3AodGJsRGl2LCBkZXRhaWxzKSB7CiAgICAgICAgdmFyIGxlZnRUYmwgPSB0YmxEaXYuc2VsZWN0KCcubGVmdCcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QoJ3RhYmxlJykKICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgndGJvZHknKSwKICAgICAgICAgICAgcmlnaHRUYmwgPSB0YmxEaXYuc2VsZWN0KCcucmlnaHQnKQogICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0KCd0YWJsZScpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJ3Rib2R5Jyk7CgogICAgICAgIGlzLmxvYWRFbWJlZGRlZEljb24oaWNvbkRpdiwgZGV0YWlscy5faWNvbmlkX3R5cGUsIDQwKTsKICAgICAgICB0b3Auc2VsZWN0KCdoMicpLmh0bWwoZGV0YWlscy5uYW1lKTsKCiAgICAgICAgcHJvcE9yZGVyLmZvckVhY2goZnVuY3Rpb24gKHByb3AsIGkpIHsKICAgICAgICAgICAgLy8gcHJvcGVydGllcyBhcmUgc3BsaXQgaW50byB0d28gdGFibGVzCiAgICAgICAgICAgIGFkZFByb3AoaSA8IDQgPyBsZWZ0VGJsIDogcmlnaHRUYmwsIGksIGRldGFpbHNbcHJvcF0pOwogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZFBvcnRSb3codGJvZHksIHBvcnQpIHsKICAgICAgICB2YXIgdHIgPSB0Ym9keS5hcHBlbmQoJ3RyJyk7CgogICAgICAgIHBvcnRDb2xzLmZvckVhY2goZnVuY3Rpb24gKGNvbCkgewogICAgICAgICAgICB0ci5hcHBlbmQoJ3RkJykuaHRtbChwb3J0W2NvbF0pOwogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIHBvcHVsYXRlQm90dG9tKHRhYmxlLCBwb3J0cykgewogICAgICAgIHZhciB0aGVhZGVyID0gdGFibGUuYXBwZW5kKCd0aGVhZCcpLmFwcGVuZCgndHInKSwKICAgICAgICAgICAgdGJvZHkgPSB0YWJsZS5hcHBlbmQoJ3Rib2R5JyksCiAgICAgICAgICAgIHRiV2lkdGgsIHRiSGVpZ2h0OwoKICAgICAgICBmcmllbmRseVBvcnRDb2xzLmZvckVhY2goZnVuY3Rpb24gKGNvbCkgewogICAgICAgICAgICB0aGVhZGVyLmFwcGVuZCgndGgnKS5odG1sKGNvbCk7CiAgICAgICAgfSk7CiAgICAgICAgcG9ydHMuZm9yRWFjaChmdW5jdGlvbiAocG9ydCkgewogICAgICAgICAgICBhZGRQb3J0Um93KHRib2R5LCBwb3J0KTsKICAgICAgICB9KTsKCiAgICAgICAgdGJXaWR0aCA9IGZzLm5vUHhTdHlsZSh0Ym9keSwgJ3dpZHRoJykgKyBzY3JvbGxTaXplOwogICAgICAgIHRiSGVpZ2h0ID0gcEhlaWdodAogICAgICAgICAgICAgICAgICAgIC0gKGZzLm5vUHhTdHlsZShkZXRhaWxzUGFuZWwuZWwoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNlbGVjdCgnLnRvcCcpLCAnaGVpZ2h0JykKICAgICAgICAgICAgICAgICAgICArIGZzLm5vUHhTdHlsZShkZXRhaWxzUGFuZWwuZWwoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNlbGVjdCgnLnBvcnRzLXRpdGxlJyksICdoZWlnaHQnKQogICAgICAgICAgICAgICAgICAgICsgcG9ydHNUYmxQZGcpOwoKICAgICAgICB0YWJsZS5zdHlsZSh7CiAgICAgICAgICAgIGhlaWdodDogdGJIZWlnaHQgKyAncHgnLAogICAgICAgICAgICB3aWR0aDogdGJXaWR0aCArICdweCcsCiAgICAgICAgICAgIG92ZXJmbG93OiAnYXV0bycsCiAgICAgICAgICAgIGRpc3BsYXk6ICdibG9jaycKICAgICAgICB9KTsKCiAgICAgICAgZGV0YWlsc1BhbmVsLndpZHRoKHRiV2lkdGggKyBjdG5yUGRnKTsKICAgIH0KCiAgICBmdW5jdGlvbiBwb3B1bGF0ZU5hbWUoZGl2LCBuYW1lKSB7CiAgICAgICAgdmFyIGxhYiA9IGRpdi5zZWxlY3QoJy5sYWJlbCcpLAogICAgICAgICAgICB2YWwgPSBkaXYuc2VsZWN0KCcudmFsdWUnKTsKICAgICAgICBsYWIuaHRtbCgnRnJpZW5kbHkgTmFtZTonKTsKICAgICAgICB2YWwuaHRtbChuYW1lKTsKICAgIH0KCiAgICBmdW5jdGlvbiBwb3B1bGF0ZURldGFpbHMoZGV0YWlscykgewogICAgICAgIHZhciBuYW1lRGl2LCB0b3BUYnMsIGJ0bVRibCwgcG9ydHM7CiAgICAgICAgc2V0VXBQYW5lbCgpOwoKICAgICAgICBuYW1lRGl2ID0gdG9wLnNlbGVjdCgnLm5hbWUtZGl2Jyk7CiAgICAgICAgdG9wVGJzID0gdG9wLnNlbGVjdCgnLnRvcC10YWJsZXMnKTsKICAgICAgICBidG1UYmwgPSBib3R0b20uc2VsZWN0KCd0YWJsZScpOwogICAgICAgIHBvcnRzID0gZGV0YWlscy5wb3J0czsKCiAgICAgICAgcG9wdWxhdGVOYW1lKG5hbWVEaXYsIGRldGFpbHMubmFtZSk7CiAgICAgICAgcG9wdWxhdGVUb3AodG9wVGJzLCBkZXRhaWxzKTsKICAgICAgICBwb3B1bGF0ZUJvdHRvbShidG1UYmwsIHBvcnRzKTsKCiAgICAgICAgZGV0YWlsc1BhbmVsLmhlaWdodChwSGVpZ2h0KTsKICAgIH0KCiAgICBmdW5jdGlvbiByZXNwRGV0YWlsc0NiKGRhdGEpIHsKICAgICAgICAkc2NvcGUucGFuZWxEYXRhID0gZGF0YS5kZXRhaWxzOwogICAgICAgICRzY29wZS4kYXBwbHkoKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZXNwTmFtZUNiKGRhdGEpIHsKICAgICAgICBpZiAoZGF0YS53YXJuKSB7CiAgICAgICAgICAgICRsb2cud2FybihkYXRhLndhcm4sIGRhdGEuaWQpOwogICAgICAgICAgICB0b3Auc2VsZWN0KCdoMicpLmh0bWwoZGF0YS5pZCk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0ZURldGFpbHNQYW5lKCkgewogICAgICAgIGRldGFpbHNQYW5lbCA9IHBzLmNyZWF0ZVBhbmVsKHBOYW1lLCB7CiAgICAgICAgICAgIHdpZHRoOiB3U2l6ZS53aWR0aCwKICAgICAgICAgICAgbWFyZ2luOiAwLAogICAgICAgICAgICBoaWRlTWFyZ2luOiAwCiAgICAgICAgfSk7CiAgICAgICAgZGV0YWlsc1BhbmVsLmVsKCkuc3R5bGUoewogICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJywKICAgICAgICAgICAgdG9wOiBwU3RhcnRZICsgJ3B4JwogICAgICAgIH0pOwogICAgICAgICRzY29wZS5oaWRlUGFuZWwgPSBmdW5jdGlvbiAoKSB7IGRldGFpbHNQYW5lbC5oaWRlKCk7IH07CiAgICAgICAgZGV0YWlsc1BhbmVsLmhpZGUoKTsKICAgIH0KCiAgICBhbmd1bGFyLm1vZHVsZSgnb3ZEZXZpY2UnLCBbXSkKICAgIC5jb250cm9sbGVyKCdPdkRldmljZUN0cmwnLAogICAgICAgIFsnJGxvZycsICckc2NvcGUnLCAnJGxvY2F0aW9uJywgJ1RhYmxlQnVpbGRlclNlcnZpY2UnLCAnRm5TZXJ2aWNlJywKICAgICAgICAgICAgJ01hc3RTZXJ2aWNlJywgJ1BhbmVsU2VydmljZScsICdXZWJTb2NrZXRTZXJ2aWNlJywgJ0ljb25TZXJ2aWNlJywKICAgICAgICAgICAgJ05hdlNlcnZpY2UnLCAnS2V5U2VydmljZScsCgogICAgICAgIGZ1bmN0aW9uIChfJGxvZ18sIF8kc2NvcGVfLCBfJGxvY2F0aW9uXywKICAgICAgICAgICAgICAgICAgdGJzLCBfZnNfLCBfbWFzdF8sIF9wc18sIF93c3NfLCBfaXNfLCBfbnNfLCBfa3NfKSB7CiAgICAgICAgICAgIHZhciBwYXJhbXMsCiAgICAgICAgICAgICAgICBoYW5kbGVycyA9IHt9OwoKICAgICAgICAgICAgJGxvZyA9IF8kbG9nXzsKICAgICAgICAgICAgJHNjb3BlID0gXyRzY29wZV87CiAgICAgICAgICAgICRsb2MgPSBfJGxvY2F0aW9uXzsKICAgICAgICAgICAgZnMgPSBfZnNfOwogICAgICAgICAgICBtYXN0ID0gX21hc3RfOwogICAgICAgICAgICBwcyA9IF9wc187CiAgICAgICAgICAgIHdzcyA9IF93c3NfOwogICAgICAgICAgICBpcyA9IF9pc187CiAgICAgICAgICAgIG5zID0gX25zXzsKICAgICAgICAgICAga3MgPSBfa3NfOwoKICAgICAgICAgICAgcGFyYW1zID0gJGxvYy5zZWFyY2goKTsKCiAgICAgICAgICAgICRzY29wZS5wYW5lbERhdGEgPSB7fTsKICAgICAgICAgICAgJHNjb3BlLmZsb3dUaXAgPSAnU2hvdyBmbG93IHZpZXcgZm9yIHNlbGVjdGVkIGRldmljZSc7CiAgICAgICAgICAgICRzY29wZS5wb3J0VGlwID0gJ1Nob3cgcG9ydCB2aWV3IGZvciBzZWxlY3RlZCBkZXZpY2UnOwogICAgICAgICAgICAkc2NvcGUuZ3JvdXBUaXAgPSAnU2hvdyBncm91cCB2aWV3IGZvciBzZWxlY3RlZCBkZXZpY2UnOwogICAgICAgICAgICAkc2NvcGUubWV0ZXJUaXAgPSAnU2hvdyBtZXRlciB2aWV3IGZvciBzZWxlY3RlZCBkZXZpY2UnOwoKICAgICAgICAgICAgLy8gZGV0YWlscyBwYW5lbCBoYW5kbGVycwogICAgICAgICAgICBoYW5kbGVyc1tkZXRhaWxzUmVzcF0gPSByZXNwRGV0YWlsc0NiOwogICAgICAgICAgICBoYW5kbGVyc1tuYW1lQ2hhbmdlUmVzcF0gPSByZXNwTmFtZUNiOwogICAgICAgICAgICB3c3MuYmluZEhhbmRsZXJzKGhhbmRsZXJzKTsKCiAgICAgICAgICAgIC8vIHF1ZXJ5IGZvciBpZiBhIGNlcnRhaW4gZGV2aWNlIG5lZWRzIHRvIGJlIGhpZ2hsaWdodGVkCiAgICAgICAgICAgIGlmIChwYXJhbXMuaGFzT3duUHJvcGVydHkoJ2RldklkJykpIHsKICAgICAgICAgICAgICAgICRzY29wZS5zZWxJZCA9IHBhcmFtc1snZGV2SWQnXTsKICAgICAgICAgICAgICAgIHdzcy5zZW5kRXZlbnQoZGV0YWlsc1JlcSwgeyBpZDogJHNjb3BlLnNlbElkIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiBzZWxDYigkZXZlbnQsIHJvdykgewogICAgICAgICAgICAgICAgaWYgKCRzY29wZS5zZWxJZCkgewogICAgICAgICAgICAgICAgICAgIHdzcy5zZW5kRXZlbnQoZGV0YWlsc1JlcSwgeyBpZDogcm93LmlkIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkc2NvcGUuaGlkZVBhbmVsKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkbG9nLmRlYnVnKCdHb3QgYSBjbGljayBvbjonLCByb3cpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0YnMuYnVpbGRUYWJsZSh7CiAgICAgICAgICAgICAgICBzY29wZTogJHNjb3BlLAogICAgICAgICAgICAgICAgdGFnOiAnZGV2aWNlJywKICAgICAgICAgICAgICAgIHNlbENiOiBzZWxDYgogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICRzY29wZS5uYXYgPSBmdW5jdGlvbiAocGF0aCkgewogICAgICAgICAgICAgICAgaWYgKCRzY29wZS5zZWxJZCkgewogICAgICAgICAgICAgICAgICAgIG5zLm5hdlRvKHBhdGgsIHsgZGV2SWQ6ICRzY29wZS5zZWxJZCB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICRzY29wZS4kb24oJyRkZXN0cm95JywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgd3NzLnVuYmluZEhhbmRsZXJzKGhhbmRsZXJzKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAkbG9nLmxvZygnT3ZEZXZpY2VDdHJsIGhhcyBiZWVuIGNyZWF0ZWQnKTsKICAgICAgICB9XSkKCiAgICAuZGlyZWN0aXZlKCdkZXZpY2VEZXRhaWxzUGFuZWwnLAogICAgWyckcm9vdFNjb3BlJywgJyR3aW5kb3cnLCAnJHRpbWVvdXQnLCAnS2V5U2VydmljZScsCiAgICBmdW5jdGlvbiAoJHJvb3RTY29wZSwgJHdpbmRvdywgJHRpbWVvdXQsIGtzKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzY29wZSkgewogICAgICAgICAgICB2YXIgdW5iaW5kV2F0Y2g7CgogICAgICAgICAgICBmdW5jdGlvbiBoZWlnaHRDYWxjKCkgewogICAgICAgICAgICAgICAgcFN0YXJ0WSA9IGZzLm5vUHhTdHlsZShkMy5zZWxlY3QoJy50YWJ1bGFyLWhlYWRlcicpLCAnaGVpZ2h0JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbWFzdC5tYXN0SGVpZ2h0KCkgKyB0b3BQZGc7CiAgICAgICAgICAgICAgICB3U2l6ZSA9IGZzLndpbmRvd1NpemUocFN0YXJ0WSk7CiAgICAgICAgICAgICAgICBwSGVpZ2h0ID0gd1NpemUuaGVpZ2h0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiBpbml0UGFuZWwoKSB7CiAgICAgICAgICAgICAgICBoZWlnaHRDYWxjKCk7CiAgICAgICAgICAgICAgICBjcmVhdGVEZXRhaWxzUGFuZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBTYWZhcmkgaGFzIGEgYnVnIHdoZXJlIGl0IHJlbmRlcnMgdGhlIGZpeGVkLWxheW91dCB0YWJsZSB3cm9uZwogICAgICAgICAgICAvLyBpZiB5b3UgYXNrIGZvciB0aGUgd2luZG93J3Mgc2l6ZSB0b28gZWFybHkKICAgICAgICAgICAgaWYgKHNjb3BlLm9ub3MuYnJvd3NlciA9PT0gJ3NhZmFyaScpIHsKICAgICAgICAgICAgICAgICR0aW1lb3V0KGluaXRQYW5lbCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpbml0UGFuZWwoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBjcmVhdGUga2V5IGJpbmRpbmdzIHRvIGhhbmRsZSBwYW5lbAogICAgICAgICAgICBrcy5rZXlCaW5kaW5ncyh7CiAgICAgICAgICAgICAgICBlbnRlcjogZWRpdE5hbWVTYXZlLAogICAgICAgICAgICAgICAgZXNjOiBbaGFuZGxlRXNjYXBlLCAnQ2xvc2UgdGhlIGRldGFpbHMgcGFuZWwnXSwKICAgICAgICAgICAgICAgIF9oZWxwRm9ybWF0OiBbJ2VzYyddCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBrcy5nZXN0dXJlTm90ZXMoWwogICAgICAgICAgICAgICAgWydjbGljaycsICdTZWxlY3QgYSByb3cgdG8gc2hvdyBkZXZpY2UgZGV0YWlscyddLAogICAgICAgICAgICAgICAgWydzY3JvbGwgZG93bicsICdTZWUgbW9yZSBkZXZpY2VzJ10KICAgICAgICAgICAgXSk7CgogICAgICAgICAgICAvLyBpZiB0aGUgcGFuZWxEYXRhIGNoYW5nZXMKICAgICAgICAgICAgc2NvcGUuJHdhdGNoKCdwYW5lbERhdGEnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBpZiAoIWZzLmlzRW1wdHlPYmplY3Qoc2NvcGUucGFuZWxEYXRhKSkgewogICAgICAgICAgICAgICAgICAgIHBvcHVsYXRlRGV0YWlscyhzY29wZS5wYW5lbERhdGEpOwogICAgICAgICAgICAgICAgICAgIGRldGFpbHNQYW5lbC5zaG93KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gaWYgdGhlIHdpbmRvdyBzaXplIGNoYW5nZXMKICAgICAgICAgICAgdW5iaW5kV2F0Y2ggPSAkcm9vdFNjb3BlLiR3YXRjaENvbGxlY3Rpb24oCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgaDogJHdpbmRvdy5pbm5lckhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgdzogJHdpbmRvdy5pbm5lcldpZHRoCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWZzLmlzRW1wdHlPYmplY3Qoc2NvcGUucGFuZWxEYXRhKSkgewogICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHRDYWxjKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcHVsYXRlRGV0YWlscyhzY29wZS5wYW5lbERhdGEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHNjb3BlLiRvbignJGRlc3Ryb3knLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB1bmJpbmRXYXRjaCgpOwogICAgICAgICAgICAgICAga3MudW5iaW5kS2V5cygpOwogICAgICAgICAgICAgICAgcHMuZGVzdHJveVBhbmVsKHBOYW1lKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgIH1dKTsKfSgpKTsKjvHvVl3MAgBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANN3IQABABs0UwKgHNsCoB2CW0R/1jJf0pFqXODWAEAVuCPEAAAEBCAoAt+LMAGIpwo7x71ZezQIAuQ8AALkPAABo9ygf0sUIACetHhMIAEUAD6spG0AAQAZyS8CoB2DAqAc2H/WW0lNSVB00h6DsgBgDt5+EAAABAQgKAGIpwgC34sJIVFRQLzEuMSAyMDAgT0sNCkVUYWc6IDE0NTg1NjUzODY4MTkNCkNvbnRlbnQtVHlwZTogdGV4dC9jc3MNClRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCkVGMw0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKiAtLS0tLS0gZm9yIHN1bW1hcnktbGlzdCB0YWJsZXMgLS0tLS0tICovCgpkaXYuc3VtbWFyeS1saXN0IHsKICAgIG1hcmdpbjogMCAyMHB4IDE2cHggMTBweDsKICAgIGZvbnQtc2l6ZTogMTBwdDsKICAgIGJvcmRlci1zcGFjaW5nOiAwOwp9CgpkaXYuc3VtbWFyeS1saXN0IHRhYmxlIHsKICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CiAgICB0YWJsZS1sYXlvdXQ6IGZpeGVkOwogICAgZW1wdHktY2VsbHM6IHNob3c7CiAgICBtYXJnaW46IDA7Cn0KCmRpdi5zdW1tYXJ5LWxpc3QgZGl2LnRhYmxlLWJvZHkgewogICAgb3ZlcmZsb3cteTogc2Nyb2xsOwp9CgpkaXYuc3VtbWFyeS1saXN0IGRpdi50YWJsZS1ib2R5Ojotd2Via2l0LXNjcm9sbGJhciB7CiAgICBkaXNwbGF5OiBub25lOwp9CgpkaXYuc3VtbWFyeS1saXN0IHRyLm5vLWRhdGEgdGQgewogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgZm9udC1zdHlsZTogaXRhbGljOwp9CgoubGlnaHQgZGl2LnN1bW1hcnktbGlzdCB0cjpudGgtY2hpbGQoZXZlbikgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDsKfQoubGlnaHQgZGl2LnN1bW1hcnktbGlzdCB0cjpudGgtY2hpbGQob2RkKSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlOwp9Ci5kYXJrIGRpdi5zdW1tYXJ5LWxpc3QgdHI6bnRoLWNoaWxkKGV2ZW4pIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICMzMzM7Cn0KLmRhcmsgZGl2LnN1bW1hcnktbGlzdCB0cjpudGgtY2hpbGQob2RkKSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNDQ0Owp9CgoubGlnaHQgZGl2LnN1bW1hcnktbGlzdCB0ci5zZWxlY3RlZCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBkZWVwc2t5Ymx1ZSAhaW1wb3J0YW50Owp9CgouZGFyayBkaXYuc3VtbWFyeS1saXN0IHRyLnNlbGVjdGVkIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICMzMDQ4NjA7Cn0KCi8qIGhpZ2hsaWdodGluZyAqLwpkaXYuc3VtbWFyeS1saXN0IHRyIHsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgNTAwbXM7Cn0KLmxpZ2h0IGRpdi5zdW1tYXJ5LWxpc3QgdHIuZGF0YS1jaGFuZ2UgewogICAgYmFja2dyb3VuZC1jb2xvcjogI0ZERkZEQzsKfQouZGFyayBkaXYuc3VtbWFyeS1saXN0IHRyLmRhdGEtY2hhbmdlIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICM1QTU2MDA7Cn0KCmRpdi5zdW1tYXJ5LWxpc3QgdGQgewogICAgcGFkZGluZzogNnB4OwogICAgdGV4dC1hbGlnbjogbGVmdDsKICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKfQoKZGl2LnN1bW1hcnktbGlzdCAudGFibGUtaGVhZGVyIHRkIHsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAyZW07CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBmb250LXdlaWdodDogYm9sZDsKfQpkaXYuc3VtbWFyeS1saXN0IC50YWJsZS1oZWFkZXIgdGQ6Zmlyc3QtY2hpbGQgewogICAgYm9yZGVyLXJhZGl1czogOHB4IDAgMCAwOwp9CmRpdi5zdW1tYXJ5LWxpc3QgLnRhYmxlLWhlYWRlciB0ZDpsYXN0LWNoaWxkIHsKICAgIGJvcmRlci1yYWRpdXM6IDAgOHB4IDAgMDsKfQoKLmxpZ2h0IGRpdi5zdW1tYXJ5LWxpc3QgLnRhYmxlLWhlYWRlciB0ZCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYmJiOwp9Ci5kYXJrIGRpdi5zdW1tYXJ5LWxpc3QgLnRhYmxlLWhlYWRlciB0ZCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjIyOwogICAgY29sb3I6ICNjY2M7Cn0KCi8qIHJvd3MgYXJlIHNlbGVjdGFibGUgKi8KZGl2LnN1bW1hcnktbGlzdCAudGFibGUtYm9keSB0ZCB7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi5kYXJrIGRpdi5zdW1tYXJ5LWxpc3QgdGQgewogICAgY29sb3I6ICNjY2M7Cn0KCi8qIFRhYnVsYXIgdmlldyB1cHBlciByaWdodCBjb250cm9sIGJ1dHRvbnMgKi8KCmRpdi5jdHJsLWJ0bnMgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgZmxvYXQ6IHJpZ2h0OwogICAgaGVpZ2h0OiA0NHB4OwogICAgbWFyZ2luLXJpZ2h0OiAyNHB4OwogICAgbWFyZ2luLXRvcDogN3B4Owp9CgoKZGl2LmN0cmwtYnRucyBkaXYgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgcGFkZGluZzogNHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgpkaXYuY3RybC1idG5zIGRpdi5zZXBhcmF0b3IgIHsKICAgIGN1cnNvcjogYXV0bzsKICAgIHdpZHRoOiAyNHB4OwogICAgYm9yZGVyOiBub25lOwp9CgovKiBJbmFjdGl2ZSAqLwoubGlnaHQgLmN0cmwtYnRucyBkaXYgZy5pY29uIHJlY3QsCi5saWdodCAuY3RybC1idG5zIGRpdjpob3ZlciBnLmljb24gcmVjdCB7CiAgICBmaWxsOiAjZWVlOwp9Ci5kYXJrIC5jdHJsLWJ0bnMgZGl2IGcuaWNvbiByZWN0LAouZGFyayAuY3RybC1idG5zIGRpdjpob3ZlciBnLmljb24gcmVjdCB7CiAgICBmaWxsOiAjMjIyOwp9CgoubGlnaHQgLmN0cmwtYnRucyBkaXYgZy5pY29uIHVzZSB7CiAgICBmaWxsOiAjZGRkOwp9Ci5kYXJrIC5jdHJsLWJ0bnMgZGl2IGcuaWNvbiB1c2UgewogICAgZmlsbDogIzMzMzsKfQoKLyogQWN0aXZlIGhvdmVyICovCi5saWdodCAuY3RybC1idG5zIGRpdi5hY3RpdmU6aG92ZXIgZy5pY29uIHJlY3QgewogICAgZmlsbDogIzgwMDsKfQoKLmRhcmsgLmN0cmwtYnRucyBkaXYuYWN0aXZlOmhvdmVyIGcuaWNvbiByZWN0IHsKICAgIGZpbGw6ICNDRTU2NTA7Cn0KCi8qIEFjdGl2ZSAqLwoubGlnaHQgLmN0cmwtYnRucyBkaXYuYWN0aXZlIGcuaWNvbiB1c2UgewogICAgZmlsbDogI2ZmZjsKfQouZGFyayAuY3RybC1idG5zIGRpdi5hY3RpdmUgZy5pY29uIHVzZSB7CiAgICBmaWxsOiAjZWVlOwp9CgoubGlnaHQgLmN0cmwtYnRucyBkaXYuYWN0aXZlIGcuaWNvbiByZWN0IHsKICAgIGZpbGw6ICNiYmI7Cn0KLmRhcmsgLmN0cmwtYnRucyBkaXYuYWN0aXZlIGcuaWNvbiByZWN0IHsKICAgIGZpbGw6ICM0NDQ7Cn0KCi8qIFJlZnJlc2ggYnV0dG9uIHNwZWNpZmljICovCi5saWdodCAuY3RybC1idG5zIGRpdi5yZWZyZXNoLmFjdGl2ZSBnLmljb24gcmVjdCB7CiAgICBmaWxsOiAjOTY0OTQ5Owp9CgouZGFyayAuY3RybC1idG5zIGRpdi5yZWZyZXNoLmFjdGl2ZSBnLmljb24gcmVjdCB7CiAgICBmaWxsOiAjOUI0NjQxOwp9Ci5saWdodCAuY3RybC1idG5zIGRpdi5yZWZyZXNoOmhvdmVyIGcuaWNvbiByZWN0IHsKICAgIGZpbGw6ICM5NjQ5NDk7Cn0KCi5kYXJrIC5jdHJsLWJ0bnMgZGl2LnJlZnJlc2g6aG92ZXIgZy5pY29uIHJlY3QgewogICAgZmlsbDogIzlCNDY0MTsKfQoNCo7x71a0zQIAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADRr2EAAQAY/BcCoBzbAqAdgltIf9TSHoOxTUmOUgBAPM4bZAAABAQgKALfizABiKcKO8e9WO84CAEcAAABHAAAAaPcoH9LFCAAnrR4TCABFAAA5KR5AAEAGgbrAqAdgwKgHNh/1ltJTUmOUNIeg7IAYA7eQEgAAAQEICgBiKcIAt+LMMA0KDQqO8e9WA88CAEIAAABCAAAAaPcoH9LFCAAnrR4TCABFAAA0f29AAEAGK27AqAdgwKgHNh/1ls8Ov0lio2r6goAQBBGQDQAAAQEICgBiKcIAt+LLjvHvVnXTAgCLAgAAiwIAAAgAJ60eE2j3KB/SxQgARQACfd3JQABABsrKwKgHNsCoB2CW0R/1jJf0pFqXODWAGAWkJiAAAAEBCAoAt+LMAGIpwkdFVCAvb25vcy91aS9hcHAvdmlldy9mbG93L2Zsb3cuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6ICovKg0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71ab0wIAiwIAAIsCAAAIACetHhNo9ygf0sUIAEUAAn1r2UAAQAY8u8CoBzbAqAdgltIf9TSHoOxTUmOZgBgPM5csAAABAQgKALfizABiKcJHRVQgL29ub3MvdWkvYXBwL3ZpZXcvcG9ydC9wb3J0LmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiAqLyoNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQqO8e9WkNkCAGEIAABhCAAAaPcoH9LFCAAnrR4TCABFAAhTKR9AAEAGeZ/AqAdgwKgHNh/1ltJTUmOZNIejNYAYA8GYLAAAAQEICgBiKcMAt+LMSFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvamF2YXNjcmlwdA0KQ29udGVudC1MZW5ndGg6IDE5NzQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KLyoKICogQ29weXJpZ2h0IDIwMTUsMjAxNiBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBQb3J0IFZpZXcgTW9kdWxlCiAqLwoKKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBpbmplY3RlZCByZWZlcmVuY2VzCiAgICB2YXIgJGxvZywgJHNjb3BlLCAkbG9jYXRpb24sIGZzLCB0YnMsIG5zOwoKICAgIGFuZ3VsYXIubW9kdWxlKCdvdlBvcnQnLCBbXSkKICAgIC5jb250cm9sbGVyKCdPdlBvcnRDdHJsJywKICAgICAgICBbJyRsb2cnLCAnJHNjb3BlJywgJyRsb2NhdGlvbicsCiAgICAgICAgICAgICdGblNlcnZpY2UnLCAnVGFibGVCdWlsZGVyU2VydmljZScsICdOYXZTZXJ2aWNlJywKCiAgICAgICAgZnVuY3Rpb24gKF8kbG9nXywgXyRzY29wZV8sIF8kbG9jYXRpb25fLCBfZnNfLCBfdGJzXywgX25zXykgewogICAgICAgICAgICB2YXIgcGFyYW1zOwogICAgICAgICAgICAkbG9nID0gXyRsb2dfOwogICAgICAgICAgICAkc2NvcGUgPSBfJHNjb3BlXzsKICAgICAgICAgICAgJGxvY2F0aW9uID0gXyRsb2NhdGlvbl87CiAgICAgICAgICAgIGZzID0gX2ZzXzsKICAgICAgICAgICAgdGJzID0gX3Ric187CiAgICAgICAgICAgIG5zID0gX25zXzsKICAgICAgICAgICAgJHNjb3BlLmRldmljZVRpcCA9ICdTaG93IGRldmljZSB0YWJsZSc7CiAgICAgICAgICAgICRzY29wZS5mbG93VGlwID0gJ1Nob3cgZmxvdyB2aWV3IGZvciB0aGlzIGRldmljZSc7CiAgICAgICAgICAgICRzY29wZS5ncm91cFRpcCA9ICdTaG93IGdyb3VwIHZpZXcgZm9yIHRoaXMgZGV2aWNlJzsKICAgICAgICAgICAgJHNjb3BlLm1ldGVyVGlwID0gJ1Nob3cgbWV0ZXIgdmlldyBmb3Igc2VsZWN0ZWQgZGV2aWNlJzsKCiAgICAgICAgICAgIHBhcmFtcyA9ICRsb2NhdGlvbi5zZWFyY2goKTsKICAgICAgICAgICAgaWYgKHBhcmFtcy5oYXNPd25Qcm9wZXJ0eSgnZGV2SWQnKSkgewogICAgICAgICAgICAgICAgJHNjb3BlLmRldklkID0gcGFyYW1zWydkZXZJZCddOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0YnMuYnVpbGRUYWJsZSh7CiAgICAgICAgICAgICAgICBzY29wZTogJHNjb3BlLAogICAgICAgICAgICAgICAgdGFnOiAncG9ydCcsCiAgICAgICAgICAgICAgICBxdWVyeTogcGFyYW1zCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgJHNjb3BlLm5hdiA9IGZ1bmN0aW9uIChwYXRoKSB7CiAgICAgICAgICAgICAgICBpZiAoJHNjb3BlLmRldklkKSB7CiAgICAgICAgICAgICAgICAgICAgbnMubmF2VG8ocGF0aCwgeyBkZXZJZDogJHNjb3BlLmRldklkIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgJGxvZy5sb2coJ092UG9ydEN0cmwgaGFzIGJlZW4gY3JlYXRlZCcpOwogICAgICAgIH1dKTsKfSgpKTsKjvHvVt/ZAgBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANGvaQABABj8DwKgHNsCoB2CW0h/1NIejNVNSa7iAEA8zfGsAAAEBCAoAt+LMAGIpw47x71YY3wIAjQIAAI0CAAAIACetHhNo9ygf0sUIAEUAAn9r20AAQAY8t8CoBzbAqAdgltIf9TSHozVTUmu4gBgPM/SHAAABAQgKALfizQBiKcNHRVQgL29ub3MvdWkvYXBwL3ZpZXcvZ3JvdXAvZ3JvdXAuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6ICovKg0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71ZG6wIA2iMAANojAABo9ygf0sUIACetHhMIAEUAI8x/cEAAQAYH1cCoB2DAqAc2H/WWzw6/SWKjavqCgBgEEbOlAAABAQgKAGIpwwC34stIVFRQLzEuMSAyMDAgT0sNCkNvbnRlbnQtVHlwZTogdGV4dC9qYXZhc2NyaXB0DQpDb250ZW50LUxlbmd0aDogOTAwNw0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBUb3BvbG9neSBUb29sYmFyIE1vZHVsZS4KIEZ1bmN0aW9ucyBmb3IgY3JlYXRpbmcgYW5kIGludGVyYWN0aW5nIHdpdGggdGhlIHRvb2xiYXIuCiAqLwoKKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBpbmplY3RlZCByZWZlcmVuY2VzCiAgICB2YXIgJGxvZywgZnMsIHRicywgcHMsIHRvdiwgdGRzLCBhcGk7CgogICAgLy8gQVBJOgogICAgLy8gIGdldEFjdGlvbkVudHJ5CiAgICAvLyAgc2V0VXBLZXlzCgogICAgLy8gaW50ZXJuYWwgc3RhdGUKICAgIHZhciB0b29sYmFyLCBrZXlEYXRhLCBjYWNoZWRTdGF0ZSwgdGhpcmRSb3csIG92UnNldCwgb3ZJbmRleDsKCiAgICAvLyBjb25zdGFudHMKICAgIHZhciBuYW1lID0gJ3RvcG8tdGJhcicsCiAgICAgICAgY29va3RhZyA9ICd0b3BvX3ByZWZzJywKICAgICAgICBzb2EgPSAnc3dpdGNoT3ZlcmxheUFjdGlvbnM6ICcsCiAgICAgICAgc2VsT3ZlciA9ICdTZWxlY3Qgb3ZlcmxheSBoZXJlICYjeDIxZTc7JywKICAgICAgICBkZWZhdWx0T3ZlcmxheSA9ICd0cmFmZmljJzsKCgogICAgLy8ga2V5IHRvIGJ1dHRvbiBtYXBwaW5nIGRhdGEKICAgIHZhciBrMmIgPSB7CiAgICAgICAgTzogeyBpZDogJ3N1bW1hcnktdG9nJywgZ2lkOiAnc3VtbWFyeScsIGlzZWw6IHRydWV9LAogICAgICAgIEk6IHsgaWQ6ICdpbnN0YW5jZS10b2cnLCBnaWQ6ICd1aUF0dGFjaGVkJywgaXNlbDogdHJ1ZSB9LAogICAgICAgIEQ6IHsgaWQ6ICdkZXRhaWxzLXRvZycsIGdpZDogJ2RldGFpbHMnLCBpc2VsOiB0cnVlIH0sCiAgICAgICAgSDogeyBpZDogJ2hvc3RzLXRvZycsIGdpZDogJ2VuZHN0YXRpb24nLCBpc2VsOiBmYWxzZSB9LAogICAgICAgIE06IHsgaWQ6ICdvZmZsaW5lLXRvZycsIGdpZDogJ3N3aXRjaCcsIGlzZWw6IHRydWUgfSwKICAgICAgICBQOiB7IGlkOiAncG9ydHMtdG9nJywgZ2lkOiAncG9ydHMnLCBpc2VsOiB0cnVlIH0sCiAgICAgICAgQjogeyBpZDogJ2JrZ3JuZC10b2cnLCBnaWQ6ICdtYXAnLCBpc2VsOiBmYWxzZSB9LAogICAgICAgIFM6IHsgaWQ6ICdzcHJpdGUtdG9nJywgZ2lkOiAnY2xvdWQnLCBpc2VsOiBmYWxzZSB9LAoKICAgICAgICAvLyBUT0RPOiBhZGQgcmVzZXQtbm9kZS1sb2NhdGlvbnMgYnV0dG9uIHRvIHRvb2xiYXIKICAgICAgICAvL1g6IHsgaWQ6ICdub2RlbG9jay10b2cnLCBnaWQ6ICdsb2NrJywgaXNlbDogZmFsc2UgfSwKICAgICAgICBaOiB7IGlkOiAnb2JsaXF1ZS10b2cnLCBnaWQ6ICdvYmxpcXVlJywgaXNlbDogZmFsc2UgfSwKICAgICAgICBOOiB7IGlkOiAnZmlsdGVycy1idG4nLCBnaWQ6ICdmaWx0ZXJzJyB9LAogICAgICAgIEw6IHsgaWQ6ICdjeWNsZUxhYmVscy1idG4nLCBnaWQ6ICdjeWNsZUxhYmVscycgfSwKICAgICAgICBSOiB7IGlkOiAncmVzZXRab29tLWJ0bicsIGdpZDogJ3Jlc2V0Wm9vbScgfSwKCiAgICAgICAgRTogeyBpZDogJ2VxTWFzdGVyLWJ0bicsIGdpZDogJ2VxTWFzdGVyJyB9CiAgICB9OwoKICAgIHZhciBwcm9oaWJpdGVkID0gWwogICAgICAgICdUJywgJ2JhY2tTbGFzaCcsICdzbGFzaCcsCiAgICAgICAgJ1gnIC8vIG5lZWRlZCB1bnRpbCB3ZSByZS1pbnN0YXRlIFggYWJvdmUuCiAgICBdOwogICAgcHJvaGliaXRlZCA9IHByb2hpYml0ZWQuY29uY2F0KGQzLm1hcChrMmIpLmtleXMoKSk7CgoKICAgIC8vIGluaXRpYWwgdG9nZ2xlIHN0YXRlOiBkZWZhdWx0IHNldHRpbmdzIGFuZCB0YWcgdG8ga2V5IG1hcHBpbmcKICAgIHZhciBkZWZhdWx0UHJlZnNTdGF0ZSA9IHsKICAgICAgICAgICAgc3VtbWFyeTogMSwKICAgICAgICAgICAgaW5zdHM6IDEsCiAgICAgICAgICAgIGRldGFpbDogMSwKICAgICAgICAgICAgaG9zdHM6IDAsCiAgICAgICAgICAgIG9mZmRldjogMSwKICAgICAgICAgICAgcG9ydGhsOiAxLAogICAgICAgICAgICBiZzogMCwKICAgICAgICAgICAgc3ByOiAwLAogICAgICAgICAgICB0b29sYmFyOiAwCiAgICAgICAgfSwKICAgICAgICBwcmVmc01hcCA9IHsKICAgICAgICAgICAgc3VtbWFyeTogJ08nLAogICAgICAgICAgICBpbnN0czogJ0knLAogICAgICAgICAgICBkZXRhaWw6ICdEJywKICAgICAgICAgICAgaG9zdHM6ICdIJywKICAgICAgICAgICAgb2ZmZGV2OiAnTScsCiAgICAgICAgICAgIHBvcnRobDogJ1AnLAogICAgICAgICAgICBiZzogJ0InLAogICAgICAgICAgICBzcHI6ICdTJwogICAgICAgICAgICAvLyBOT1RFOiB0b29sYmFyIHN0YXRlIGlzIGhhbmRsZWQgc2VwYXJhdGVseQogICAgICAgIH07CgogICAgZnVuY3Rpb24gaW5pdChfYXBpXykgewogICAgICAgIGFwaSA9IF9hcGlfOwoKICAgICAgICAvLyByZXRyaWV2ZSBpbml0aWFsIHRvZ2dsZSBidXR0b24gc2V0dGluZ3MgZnJvbSB1c2VyIHByZWZzCiAgICAgICAgc2V0SW5pdFRvZ2dsZVN0YXRlKCk7CiAgICB9CgogICAgZnVuY3Rpb24gdG9wb0RlZlByZWZzKCkgewogICAgICAgIHJldHVybiBhbmd1bGFyLmV4dGVuZCh7fSwgZGVmYXVsdFByZWZzU3RhdGUpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNldEluaXRUb2dnbGVTdGF0ZSgpIHsKICAgICAgICBjYWNoZWRTdGF0ZSA9IHBzLmFzTnVtYmVycyhwcy5nZXRQcmVmcyhjb29rdGFnKSk7CiAgICAgICAgJGxvZy5kZWJ1ZygnVE9PTEJBUi0tLS0gcmVhZCBwcmVmcyBzdGF0ZTonLCBjYWNoZWRTdGF0ZSk7CgogICAgICAgIGlmICghY2FjaGVkU3RhdGUpIHsKICAgICAgICAgICAgY2FjaGVkU3RhdGUgPSB0b3BvRGVmUHJlZnMoKTsKICAgICAgICAgICAgcHMuc2V0UHJlZnMoY29va3RhZywgY2FjaGVkU3RhdGUpOwogICAgICAgICAgICAkbG9nLmRlYnVnKCdUT09MQkFSLS0tLSBTZXQgZGVmYXVsdCBwcmVmcyBzdGF0ZTonLCBjYWNoZWRTdGF0ZSk7CiAgICAgICAgfQoKICAgICAgICBhbmd1bGFyLmZvckVhY2gocHJlZnNNYXAsIGZ1bmN0aW9uICh2LCBrKSB7CiAgICAgICAgICAgIHZhciBjZmcgPSBrMmJbdl07CiAgICAgICAgICAgIGNmZyAmJiAoY2ZnLmlzZWwgPSAhIWNhY2hlZFN0YXRlW2tdKTsKICAgICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBpbml0S2V5RGF0YSgpIHsKICAgICAgICAvLyBUT0RPOiB1c2UgYW5ndWxhciBmb3JFYWNoIGluc3RlYWQgb2YgZDMubWFwCiAgICAgICAga2V5RGF0YSA9IGQzLm1hcChrMmIpOwogICAgICAgIGtleURhdGEuZm9yRWFjaChmdW5jdGlvbihrZXksIHZhbHVlKSB7CiAgICAgICAgICAgIHZhciBkYXRhID0gYXBpLmdldEFjdGlvbkVudHJ5KGtleSk7CiAgICAgICAgICAgIHZhbHVlLmNiID0gZGF0YVswXTsgICAgICAgICAgICAgICAgICAgICAvLyBvbi1jbGljayBjYWxsYmFjawogICAgICAgICAgICB2YWx1ZS50dCA9IGRhdGFbMV0gKyAnICgnICsga2V5ICsgJyknOyAgLy8gdG9vbHRpcAogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZEJ1dHRvbihrZXkpIHsKICAgICAgICB2YXIgdiA9IGtleURhdGEuZ2V0KGtleSk7CiAgICAgICAgdi5idG4gPSB0b29sYmFyLmFkZEJ1dHRvbih2LmlkLCB2LmdpZCwgdi5jYiwgdi50dCk7CiAgICB9CgogICAgZnVuY3Rpb24gYWRkVG9nZ2xlKGtleSwgc3VwcHJlc3NJZk1vYmlsZSkgewogICAgICAgIHZhciB2ID0ga2V5RGF0YS5nZXQoa2V5KTsKICAgICAgICBpZiAoc3VwcHJlc3NJZk1vYmlsZSAmJiBmcy5pc01vYmlsZSgpKSB7IHJldHVybjsgfQogICAgICAgIHYudG9nID0gdG9vbGJhci5hZGRUb2dnbGUodi5pZCwgdi5naWQsIHYuaXNlbCwgdi5jYiwgdi50dCk7CiAgICB9CgogICAgZnVuY3Rpb24gYWRkRmlyc3RSb3coKSB7CiAgICAgICAgYWRkVG9nZ2xlKCdJJyk7CiAgICAgICAgYWRkVG9nZ2xlKCdPJyk7CiAgICAgICAgYWRkVG9nZ2xlKCdEJyk7CiAgICAgICAgdG9vbGJhci5hZGRTZXBhcmF0b3IoKTsKCiAgICAgICAgYWRkVG9nZ2xlKCdIJyk7CiAgICAgICAgYWRkVG9nZ2xlKCdNJyk7CiAgICAgICAgYWRkVG9nZ2xlKCdQJywgdHJ1ZSk7CiAgICAgICAgYWRkVG9nZ2xlKCdCJyk7CiAgICAgICAgYWRkVG9nZ2xlKCdTJywgdHJ1ZSk7CiAgICB9CgogICAgZnVuY3Rpb24gYWRkU2Vjb25kUm93KCkgewogICAgICAgIC8vYWRkVG9nZ2xlKCdYJyk7CiAgICAgICAgYWRkVG9nZ2xlKCdaJyk7CiAgICAgICAgYWRkQnV0dG9uKCdOJyk7CiAgICAgICAgYWRkQnV0dG9uKCdMJyk7CiAgICAgICAgYWRkQnV0dG9uKCdSJyk7CiAgICAgICAgdG9vbGJhci5hZGRTZXBhcmF0b3IoKTsKICAgICAgICBhZGRCdXR0b24oJ0UnKTsKICAgIH0KCiAgICBmdW5jdGlvbiBhZGRPdmVybGF5cygpIHsKICAgICAgICB0b29sYmFyLmFkZFNlcGFyYXRvcigpOwoKICAgICAgICAvLyBnZW5lcmF0ZSByYWRpbyBidXR0b24gc2V0IGZvciBvdmVybGF5czsgc3RhcnQgd2l0aCAnbm9uZScKICAgICAgICB2YXIgcnNldCA9IFt7CiAgICAgICAgICAgICAgICBnaWQ6ICd1bmtub3duJywKICAgICAgICAgICAgICAgIHRvb2x0aXA6ICdObyBPdmVybGF5JywKICAgICAgICAgICAgICAgIGNiOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdG92LnRiU2VsZWN0aW9uKG51bGwsIHN3aXRjaE92ZXJsYXlBY3Rpb25zKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfV07CiAgICAgICAgb3ZJbmRleCA9IHRvdi5hdWdtZW50UmJzZXQocnNldCwgc3dpdGNoT3ZlcmxheUFjdGlvbnMpOwogICAgICAgIG92UnNldCA9IHRvb2xiYXIuYWRkUmFkaW9TZXQoJ3RvcG8tb3ZlcmxheXMnLCByc2V0KTsKICAgIH0KCiAgICAvLyBpbnZva2VkIGJ5IG92ZXJsYXkgc2VydmljZSB0byBzd2l0Y2ggb3V0IG9sZCBidXR0b25zIGFuZCBzd2l0Y2ggaW4gbmV3CiAgICBmdW5jdGlvbiBzd2l0Y2hPdmVybGF5QWN0aW9ucyhvaWQsIGtleUJpbmRpbmdzKSB7CiAgICAgICAgdmFyIHByb2hpYml0cyA9IFtdLAogICAgICAgICAgICBrYiA9IGZzLmlzTyhrZXlCaW5kaW5ncykgfHwge30sCiAgICAgICAgICAgIG9yZGVyID0gZnMuaXNBKGtiLl9rZXlPcmRlcikgfHwgW107CgogICAgICAgIGlmIChrZXlCaW5kaW5ncyAmJiAha2V5QmluZGluZ3MuX2tleU9yZGVyKSB7CiAgICAgICAgICAgICRsb2cud2Fybihzb2EgKyAnbm8gX2tleU9yZGVyIHByb3BlcnR5IGRlZmluZWQnKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBzYW5pdHkgcmVtb3ZhbCBvZiByZXNlcnZlZCBwcm9wZXJ0eSBuYW1lcwogICAgICAgICAgICBbJ2VzYycsICdfa2V5TGlzdGVuZXInLCAnX2hlbHBGb3JtYXQnXS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7CiAgICAgICAgICAgICAgICBmcy5yZW1vdmVGcm9tQXJyYXkoaywgb3JkZXIpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8vIGVuc3VyZSBkaWFsb2cgaGFzIGNsb3NlZCAoaWYgb3BlbmVkIGJ5IG91dGdvaW5nIG92ZXJsYXkpCiAgICAgICAgdGRzLmNsb3NlRGlhbG9nKCk7CiAgICAgICAgdGhpcmRSb3cuY2xlYXIoKTsKCiAgICAgICAgaWYgKCFvcmRlci5sZW5ndGgpIHsKICAgICAgICAgICAgdGhpcmRSb3cuc2V0VGV4dChzZWxPdmVyKTsKICAgICAgICAgICAgdGhpcmRSb3cuY2xhc3NlZCgncmlnaHQnLCB0cnVlKTsKICAgICAgICAgICAgYXBpLnNldFVwS2V5cygpOyAvLyBjbGVhciBwcmV2aW91cyBvdmVybGF5IGtleSBiaW5kaW5ncwoKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlyZFJvdy5jbGFzc2VkKCdyaWdodCcsIGZhbHNlKTsKICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKG9yZGVyLCBmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUsIGJpZCwgZ2lkLCB0dDsKCiAgICAgICAgICAgICAgICBpZiAocHJvaGliaXRlZC5pbmRleE9mKGtleSkgPiAtMSkgewogICAgICAgICAgICAgICAgICAgIHByb2hpYml0cy5wdXNoKGtleSk7CgogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGtleUJpbmRpbmdzW2tleV07CiAgICAgICAgICAgICAgICAgICAgYmlkID0gb2lkICsgJy0nICsga2V5OwogICAgICAgICAgICAgICAgICAgIGdpZCA9IHRvdi5ta0dseXBoSWQob2lkLCB2YWx1ZS5naWQpOwogICAgICAgICAgICAgICAgICAgIHR0ID0gdmFsdWUudHQgKyAnICgnICsga2V5ICsgJyknOwogICAgICAgICAgICAgICAgICAgIHRoaXJkUm93LmFkZEJ1dHRvbihiaWQsIGdpZCwgdmFsdWUuY2IsIHR0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGFwaS5zZXRVcEtleXMoa2V5QmluZGluZ3MpOyAvLyBhZGQgb3ZlcmxheSBrZXkgYmluZGluZ3MKICAgICAgICB9CgogICAgICAgIGlmIChwcm9oaWJpdHMubGVuZ3RoKSB7CiAgICAgICAgICAgICRsb2cud2Fybihzb2EgKyAnUHJvaGliaXRlZCBrZXkgYmluZGluZ3MgaWdub3JlZDonLCBwcm9oaWJpdHMpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdGVUb29sYmFyKCkgewogICAgICAgIGluaXRLZXlEYXRhKCk7CiAgICAgICAgdG9vbGJhciA9IHRicy5jcmVhdGVUb29sYmFyKG5hbWUpOwogICAgICAgIGFkZEZpcnN0Um93KCk7CiAgICAgICAgdG9vbGJhci5hZGRSb3coKTsKICAgICAgICBhZGRTZWNvbmRSb3coKTsKICAgICAgICBhZGRPdmVybGF5cygpOwogICAgICAgIHRoaXJkUm93ID0gdG9vbGJhci5hZGRSb3coKTsKICAgICAgICB0aGlyZFJvdy5zZXRUZXh0KHNlbE92ZXIpOwogICAgICAgIHRoaXJkUm93LmNsYXNzZWQoJ3JpZ2h0JywgdHJ1ZSk7CgogICAgICAgIGlmIChjYWNoZWRTdGF0ZS50b29sYmFyKSB7CiAgICAgICAgICAgIHRvb2xiYXIuc2hvdygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRvb2xiYXIuaGlkZSgpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBkZXN0cm95VG9vbGJhcigpIHsKICAgICAgICB0YnMuZGVzdHJveVRvb2xiYXIobmFtZSk7CiAgICAgICAgdG92LnJlc2V0T25Ub29sYmFyRGVzdHJveSgpOwogICAgfQoKICAgIC8vIGFsbG93cyB1cyB0byBlbnN1cmUgdGhlIGJ1dHRvbiBzdGF0ZXMgdHJhY2sga2V5IHN0cm9rZXMKICAgIGZ1bmN0aW9uIGtleUxpc3RlbmVyKGtleSkgewogICAgICAgIHZhciB2ID0ga2V5RGF0YS5nZXQoa2V5KTsKCiAgICAgICAgaWYgKHYpIHsKICAgICAgICAgICAgLy8gd2UgaGF2ZSBhIHZhbGlkIGJ1dHRvbiBtYXBwaW5nCiAgICAgICAgICAgIGlmICh2LnRvZykgewogICAgICAgICAgICAgICAgLy8gaXQncyBhIHRvZ2dsZSBidXR0b24KICAgICAgICAgICAgICAgIHYudG9nLnRvZ2dsZU5vQ2IoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiB0b2dnbGVUb29sYmFyKCkgewogICAgICAgIHRvb2xiYXIudG9nZ2xlKCk7CiAgICB9CgogICAgZnVuY3Rpb24gc2V0RGVmYXVsdE92ZXJsYXkoKSB7CiAgICAgICAgdmFyIGlkeCA9IG92SW5kZXhbZGVmYXVsdE92ZXJsYXldIHx8IDA7CiAgICAgICAgb3ZSc2V0LnNlbGVjdGVkSW5kZXgoaWR4KTsKICAgIH0KCiAgICAvLyBhbiBvdmVybGF5IHdhcyBzZWxlY3RlZCB2aWEgRnVuY3Rpb24tS2V5IHByZXNzCiAgICBmdW5jdGlvbiBmbmtleShpZHgpIHsKICAgICAgICBpZiAoaWR4IDwgb3ZSc2V0LnNpemUoKSAmJiBpZHggIT09IG92UnNldC5zZWxlY3RlZEluZGV4KCkpIHsKICAgICAgICAgICAgb3ZSc2V0LnNlbGVjdGVkSW5kZXgoaWR4KTsKICAgICAgICB9CiAgICB9CgogICAgYW5ndWxhci5tb2R1bGUoJ292VG9wbycpCiAgICAgICAgLmZhY3RvcnkoJ1RvcG9Ub29sYmFyU2VydmljZScsCiAgICAgICAgWyckbG9nJywgJ0ZuU2VydmljZScsICdUb29sYmFyU2VydmljZScsICdQcmVmc1NlcnZpY2UnLAogICAgICAgICAgICAnVG9wb092ZXJsYXlTZXJ2aWNlJywgJ1RvcG9EaWFsb2dTZXJ2aWNlJywKCiAgICAgICAgZnVuY3Rpb24gKF8kbG9nXywgX2ZzXywgX3Ric18sIF9wc18sIF90b3ZfLCBfdGRzXykgewogICAgICAgICAgICAkbG9nID0gXyRsb2dfOwogICAgICAgICAgICBmcyA9IF9mc187CiAgICAgICAgICAgIHRicyA9IF90YnNfOwogICAgICAgICAgICBwcyA9IF9wc187CiAgICAgICAgICAgIHRvdiA9IF90b3ZfOwogICAgICAgICAgICB0ZHMgPSBfdGRzXzsKCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBpbml0OiBpbml0LAogICAgICAgICAgICAgICAgY3JlYXRlVG9vbGJhcjogY3JlYXRlVG9vbGJhciwKICAgICAgICAgICAgICAgIGRlc3Ryb3lUb29sYmFyOiBkZXN0cm95VG9vbGJhciwKICAgICAgICAgICAgICAgIGtleUxpc3RlbmVyOiBrZXlMaXN0ZW5lciwKICAgICAgICAgICAgICAgIHRvZ2dsZVRvb2xiYXI6IHRvZ2dsZVRvb2xiYXIsCiAgICAgICAgICAgICAgICBzZXREZWZhdWx0T3ZlcmxheTogc2V0RGVmYXVsdE92ZXJsYXksCiAgICAgICAgICAgICAgICBmbmtleTogZm5rZXkKICAgICAgICAgICAgfTsKICAgICAgICB9XSk7Cn0oKSk7jvHvVg3tAgBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANMRJQABABuaTwKgHNsCoB2CWzx/1o2r6gg6/bPqAECFm51kAAAEBCAoAt+LOAGIpw47x71bb9QIAnDAAAJwwAABo9ygf0sUIACetHhMIAEUAMI6Bk0AAQAb478CoB2DAqAc2H/WW1KGvvx1A3hk6gBgDgcBnAAABAQgKAGIpxQC34sZIVFRQLzEuMSAyMDAgT0sNCkNvbnRlbnQtVHlwZTogdGV4dC9qYXZhc2NyaXB0DQpDb250ZW50LUxlbmd0aDogMTIyNzINClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICoKICovCgovKgogT05PUyBHVUkgLS0gVG9wb2xvZ3kgT3ZlcmxheSBNb2R1bGUuCgogUHJvdmlkZXMgb3ZlcmxheSBjYXBhYmlsaXRpZXMsIGFsbG93aW5nIE9OT1MgYXBwcyB0byBwcm92aWRlIGFkZGl0aW9uYWwKIGN1c3RvbSBkYXRhL2JlaGF2aW9yIGZvciB0aGUgdG9wb2xvZ3kgdmlldy4KCiAqLwoKKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBjb25zdGFudHMKICAgIHZhciB0b3MgPSAnVG9wb092ZXJsYXlTZXJ2aWNlOiAnOwoKICAgIC8vIGluamVjdGVkIHJlZnMKICAgIHZhciAkbG9nLCAkdGltZW91dCwgZnMsIGdzLCB3c3MsIG5zLCB0c3MsIHRwcywgYXBpOwoKICAgIC8vIGludGVybmFsIHN0YXRlCiAgICB2YXIgb3ZlcmxheXMgPSB7fSwKICAgICAgICBjdXJyZW50ID0gbnVsbCwKICAgICAgICByZXNldCA9IHRydWU7CgogICAgZnVuY3Rpb24gZXJyb3IoZm4sIG1zZykgewogICAgICAgICRsb2cuZXJyb3IodG9zICsgZm4gKyAnKCk6ICcgKyBtc2cpOwogICAgfQoKICAgIGZ1bmN0aW9uIHdhcm4oZm4sIG1zZykgewogICAgICAgICRsb2cud2Fybih0b3MgKyBmbiArICcoKTogJyArIG1zZyk7CiAgICB9CgogICAgZnVuY3Rpb24gbWtHbHlwaElkKG9pZCwgZ2lkKSB7CiAgICAgICAgcmV0dXJuIChnaWRbMF0gPT09ICcqJykgPyBvaWQgKyAnLScgKyBnaWQuc2xpY2UoMSkgOiBnaWQ7CiAgICB9CgogICAgZnVuY3Rpb24gaGFuZGxlR2x5cGhzKG8pIHsKICAgICAgICB2YXIgZ2RhdGEgPSBmcy5pc08oby5nbHlwaHMpLAogICAgICAgICAgICBvaWQgPSBvLm92ZXJsYXlJZCwKICAgICAgICAgICAgZ2lkID0gby5nbHlwaElkIHx8ICd1bmtub3duJywKICAgICAgICAgICAgZGF0YSA9IHt9LAogICAgICAgICAgICBub3RlID0gW107CgogICAgICAgIG8uX2dseXBoSWQgPSBta0dseXBoSWQob2lkLCBnaWQpOwoKICAgICAgICBvLm1rR2lkID0gZnVuY3Rpb24gKGcpIHsKICAgICAgICAgICAgcmV0dXJuIG1rR2x5cGhJZChvaWQsIGcpOwogICAgICAgIH07CiAgICAgICAgby5ta0lkID0gZnVuY3Rpb24gKHMpIHsKICAgICAgICAgICAgcmV0dXJuIG9pZCArICctJyArIHM7CiAgICAgICAgfTsKCiAgICAgICAgLy8gcHJvY2VzcyBnbHlwaHMgaWYgZGVmaW5lZAogICAgICAgIGlmIChnZGF0YSkgewogICAgICAgICAgICBhbmd1bGFyLmZvckVhY2goZ2RhdGEsIGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7CiAgICAgICAgICAgICAgICB2YXIgZnVsbGtleSA9IG9pZCArICctJyArIGtleTsKICAgICAgICAgICAgICAgIGRhdGFbJ18nICsgZnVsbGtleV0gPSB2YWx1ZS52YjsKICAgICAgICAgICAgICAgIGRhdGFbZnVsbGtleV0gPSB2YWx1ZS5kOwogICAgICAgICAgICAgICAgbm90ZS5wdXNoKCcqJyArIGtleSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBncy5yZWdpc3RlckdseXBocyhkYXRhKTsKICAgICAgICAgICAgJGxvZy5kZWJ1ZygncmVnaXN0ZXJlZCBvdmVybGF5IGdseXBoczonLCBvaWQsIG5vdGUpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiByZWdpc3RlcihvdmVybGF5KSB7CiAgICAgICAgdmFyIHIgPSAncmVnaXN0ZXInLAogICAgICAgICAgICBvdmVyID0gZnMuaXNPKG92ZXJsYXkpLAogICAgICAgICAgICBrYiA9IG92ZXIgPyBmcy5pc08ob3ZlcmxheS5rZXlCaW5kaW5ncykgOiBudWxsLAogICAgICAgICAgICBpZCA9IG92ZXIgPyBvdmVyLm92ZXJsYXlJZCA6ICcnOwoKICAgICAgICBpZiAoIWlkKSB7CiAgICAgICAgICAgIHJldHVybiBlcnJvcihyLCAnbm90IGEgcmVjb2duaXplZCBvdmVybGF5Jyk7CiAgICAgICAgfQogICAgICAgIGlmIChvdmVybGF5c1tpZF0pIHsKICAgICAgICAgICAgcmV0dXJuIHdhcm4ociwgJ2FscmVhZHkgcmVnaXN0ZXJlZDogIicgKyBpZCArICciJyk7CiAgICAgICAgfQogICAgICAgIG92ZXJsYXlzW2lkXSA9IG92ZXJsYXk7CiAgICAgICAgaGFuZGxlR2x5cGhzKG92ZXJsYXkpOwoKICAgICAgICBpZiAoa2IpIHsKICAgICAgICAgICAgaWYgKCFmcy5pc0Eoa2IuX2tleU9yZGVyKSkgewogICAgICAgICAgICAgICAgd2FybihyLCAnbm8gX2tleU9yZGVyIGFycmF5IGRlZmluZWQgb24ga2V5QmluZGluZ3MnKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGtiLl9rZXlPcmRlci5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGsgIT09ICctJyAmJiAha2Jba10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgd2FybihyLCAnbm8gIicgKyBrICsgJyIgcHJvcGVydHkgZGVmaW5lZCBvbiBrZXlCaW5kaW5ncycpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkbG9nLmRlYnVnKHRvcyArICdyZWdpc3RlcmVkIG92ZXJsYXk6ICcgKyBpZCwgb3ZlcmxheSk7CiAgICB9CgogICAgLy8gcmV0dXJucyB0aGUgbGlzdCBvZiBvdmVybGF5IGlkZW50aWZpZXJzCiAgICBmdW5jdGlvbiBsaXN0KCkgewogICAgICAgIHJldHVybiBkMy5tYXAob3ZlcmxheXMpLmtleXMoKTsKICAgIH0KCiAgICAvLyBhZGQgYSByYWRpbyBidXR0b24gZm9yIGVhY2ggcmVnaXN0ZXJlZCBvdmVybGF5CiAgICAvLyByZXR1cm4gYW4gb3ZlcmxheSBpZCB0byBpbmRleCBtYXAKICAgIGZ1bmN0aW9uIGF1Z21lbnRSYnNldChyc2V0LCBzd2l0Y2hGbikgewogICAgICAgIHZhciBtYXAgPSB7fSwKICAgICAgICAgICAgaWR4ID0gMTsKCiAgICAgICAgYW5ndWxhci5mb3JFYWNoKG92ZXJsYXlzLCBmdW5jdGlvbiAob3YpIHsKICAgICAgICAgICAgcnNldC5wdXNoKHsKICAgICAgICAgICAgICAgIGdpZDogb3YuX2dseXBoSWQsCiAgICAgICAgICAgICAgICB0b29sdGlwOiAob3YudG9vbHRpcCB8fCAnKG5vIHRvb2x0aXApJyksCiAgICAgICAgICAgICAgICBjYjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHRiU2VsZWN0aW9uKG92Lm92ZXJsYXlJZCwgc3dpdGNoRm4pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgbWFwW292Lm92ZXJsYXlJZF0gPSBpZHgrKzsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gbWFwOwogICAgfQoKICAgIC8vIGFuIG92ZXJsYXkgd2FzIHNlbGVjdGVkIHZpYSB0b29sYmFyIHJhZGlvIGJ1dHRvbiBwcmVzcyBmcm9tIHVzZXIKICAgIGZ1bmN0aW9uIHRiU2VsZWN0aW9uKGlkLCBzd2l0Y2hGbikgewogICAgICAgIHZhciBzYW1lID0gY3VycmVudCAmJiBjdXJyZW50Lm92ZXJsYXlJZCA9PT0gaWQsCiAgICAgICAgICAgIHBheWxvYWQgPSB7fSwKICAgICAgICAgICAgYWN0aW9uczsKCiAgICAgICAgZnVuY3Rpb24gZG9vcChvcCkgewogICAgICAgICAgICB2YXIgb2lkID0gY3VycmVudC5vdmVybGF5SWQ7CiAgICAgICAgICAgICRsb2cuZGVidWcoJ092ZXJsYXk6Jywgb3AsIG9pZCk7CiAgICAgICAgICAgIGN1cnJlbnRbb3BdKCk7CiAgICAgICAgICAgIHBheWxvYWRbb3BdID0gb2lkOwogICAgICAgIH0KCiAgICAgICAgaWYgKHJlc2V0IHx8ICFzYW1lKSB7CiAgICAgICAgICAgIHJlc2V0ID0gZmFsc2U7CiAgICAgICAgICAgIGN1cnJlbnQgJiYgZG9vcCgnZGVhY3RpdmF0ZScpOwogICAgICAgICAgICBjdXJyZW50ID0gb3ZlcmxheXNbaWRdOwogICAgICAgICAgICBjdXJyZW50ICYmIGRvb3AoJ2FjdGl2YXRlJyk7CiAgICAgICAgICAgIGFjdGlvbnMgPSBjdXJyZW50ICYmIGZzLmlzTyhjdXJyZW50LmtleUJpbmRpbmdzKTsKICAgICAgICAgICAgc3dpdGNoRm4oaWQsIGFjdGlvbnMpOwoKICAgICAgICAgICAgd3NzLnNlbmRFdmVudCgndG9wb1NlbGVjdE92ZXJsYXknLCBwYXlsb2FkKTsKCiAgICAgICAgICAgIC8vIEVuc3VyZSBzdW1tYXJ5IGFuZCBkZXRhaWxzIHBhbmVscyBhcmUgdXBkYXRlZCBpbW1lZGlhdGVseS4uCiAgICAgICAgICAgIHdzcy5zZW5kRXZlbnQoJ3JlcXVlc3RTdW1tYXJ5Jyk7CiAgICAgICAgICAgIHRzcy51cGRhdGVEZXRhaWwoKTsKICAgICAgICB9CiAgICB9CgogICAgdmFyIGNvcmVCdXR0b25zID0gewogICAgICAgIHNob3dEZXZpY2VWaWV3OiB7CiAgICAgICAgICAgIGdpZDogJ3N3aXRjaCcsCiAgICAgICAgICAgIHR0OiAnU2hvdyBEZXZpY2UgVmlldycsCiAgICAgICAgICAgIHBhdGg6ICdkZXZpY2UnCiAgICAgICAgfSwKICAgICAgICBzaG93Rmxvd1ZpZXc6IHsKICAgICAgICAgICAgZ2lkOiAnZmxvd1RhYmxlJywKICAgICAgICAgICAgdHQ6ICdTaG93IEZsb3cgVmlldyBmb3IgdGhpcyBEZXZpY2UnLAogICAgICAgICAgICBwYXRoOiAnZmxvdycKICAgICAgICB9LAogICAgICAgIHNob3dQb3J0VmlldzogewogICAgICAgICAgICBnaWQ6ICdwb3J0VGFibGUnLAogICAgICAgICAgICB0dDogJ1Nob3cgUG9ydCBWaWV3IGZvciB0aGlzIERldmljZScsCiAgICAgICAgICAgIHBhdGg6ICdwb3J0JwogICAgICAgIH0sCiAgICAgICAgc2hvd0dyb3VwVmlldzogewogICAgICAgICAgICBnaWQ6ICdncm91cFRhYmxlJywKICAgICAgICAgICAgdHQ6ICdTaG93IEdyb3VwIFZpZXcgZm9yIHRoaXMgRGV2aWNlJywKICAgICAgICAgICAgcGF0aDogJ2dyb3VwJwogICAgICAgIH0sCiAgICAgICAgc2hvd01ldGVyVmlldzogewogICAgICAgICAgICBnaWQ6ICdtZXRlclRhYmxlJywKICAgICAgICAgICAgdHQ6ICdTaG93IE1ldGVyIFZpZXcgZm9yIHRoaXMgRGV2aWNlJywKICAgICAgICAgICAgcGF0aDogJ21ldGVyJwogICAgICAgIH0KICAgIH07CgogICAgLy8gcmV0cmlldmVzIGEgYnV0dG9uIGRlZmluaXRpb24gZnJvbSB0aGUgY3VycmVudCBvdmVybGF5IGFuZCBnZW5lcmF0ZXMKICAgIC8vICBhIGJ1dHRvbiBkZXNjcmlwdG9yIHRvIGJlIGFkZGVkIHRvIHRoZSBwYW5lbCwgd2l0aCB0aGUgZGF0YSBiYWtlZCBpbgogICAgZnVuY3Rpb24gX2dldEJ1dHRvbkRlZihpZCwgZGF0YSkgewogICAgICAgIHZhciBidG5zID0gY3VycmVudCAmJiBjdXJyZW50LmJ1dHRvbnMsCiAgICAgICAgICAgIGIgPSBidG5zICYmIGJ0bnNbaWRdLAogICAgICAgICAgICBjYiA9IGZzLmlzRihiLmNiKSwKICAgICAgICAgICAgZiA9IGNiID8gZnVuY3Rpb24gKCkgeyBjYihkYXRhKTsgfSA6IGZ1bmN0aW9uICgpIHt9OwoKICAgICAgICByZXR1cm4gYiA/IHsKICAgICAgICAgICAgaWQ6IGN1cnJlbnQubWtJZChpZCksCiAgICAgICAgICAgIGdpZDogY3VycmVudC5ta0dpZChiLmdpZCksCiAgICAgICAgICAgIHR0OiBiLnR0LAogICAgICAgICAgICBjYjogZgogICAgICAgIH0gOiBudWxsOwogICAgfQoKICAgIC8vIGluc3RhbGwgY29yZSBidXR0b25zLCBhbmQgaW5jbHVkZSBhbnkgYWRkaXRpb25hbCBmcm9tIHRoZSBjdXJyZW50IG92ZXJsYXkKICAgIGZ1bmN0aW9uIGluc3RhbGxCdXR0b25zKGJ1dHRvbnMsIGRhdGEsIGRldklkKSB7CiAgICAgICAgYnV0dG9ucy5mb3JFYWNoKGZ1bmN0aW9uIChpZCkgewogICAgICAgICAgICB2YXIgYnRuID0gY29yZUJ1dHRvbnNbaWRdLAogICAgICAgICAgICAgICAgZ2lkID0gYnRuICYmIGJ0bi5naWQsCiAgICAgICAgICAgICAgICB0dCA9IGJ0biAmJiBidG4udHQsCiAgICAgICAgICAgICAgICBwYXRoID0gYnRuICYmIGJ0bi5wYXRoOwoKICAgICAgICAgICAgaWYgKGJ0bikgewogICAgICAgICAgICAgICAgdHBzLmFkZEFjdGlvbih7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdjb3JlLScgKyBpZCwKICAgICAgICAgICAgICAgICAgICBnaWQ6IGdpZCwKICAgICAgICAgICAgICAgICAgICB0dDogdHQsCiAgICAgICAgICAgICAgICAgICAgY2I6IGZ1bmN0aW9uICgpIHsgbnMubmF2VG8ocGF0aCwge2RldklkOiBkZXZJZCB9KTsgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoYnRuID0gX2dldEJ1dHRvbkRlZihpZCwgZGF0YSkpIHsKICAgICAgICAgICAgICAgIHRwcy5hZGRBY3Rpb24oYnRuKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZERldGFpbEJ1dHRvbihpZCkgewogICAgICAgIHZhciBiID0gX2dldEJ1dHRvbkRlZihpZCk7CiAgICAgICAgaWYgKGIpIHsKICAgICAgICAgICAgdHBzLmFkZEFjdGlvbih7CiAgICAgICAgICAgICAgICBpZDogY3VycmVudC5ta0lkKGlkKSwKICAgICAgICAgICAgICAgIGdpZDogY3VycmVudC5ta0dpZChiLmdpZCksCiAgICAgICAgICAgICAgICBjYjogYi5jYiwKICAgICAgICAgICAgICAgIHR0OiBiLnR0CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KCgogICAgLy8gPT09IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyAgSG9va3MgZm9yIG92ZXJsYXlzCgogICAgZnVuY3Rpb24gX2hvb2soeCkgewogICAgICAgIHZhciBoID0gY3VycmVudCAmJiBjdXJyZW50Lmhvb2tzOwogICAgICAgIHJldHVybiBoICYmIGZzLmlzRihoW3hdKTsKICAgIH0KCiAgICBmdW5jdGlvbiBlc2NhcGVIb29rKCkgewogICAgICAgIHZhciBlaCA9IF9ob29rKCdlc2NhcGUnKTsKICAgICAgICByZXR1cm4gZWggPyBlaCgpIDogZmFsc2U7CiAgICB9CgogICAgZnVuY3Rpb24gZW1wdHlTZWxlY3RIb29rKCkgewogICAgICAgIHZhciBjYiA9IF9ob29rKCdlbXB0eScpOwogICAgICAgIGNiICYmIGNiKCk7CiAgICB9CgogICAgZnVuY3Rpb24gc2luZ2xlU2VsZWN0SG9vayhkYXRhKSB7CiAgICAgICAgdmFyIGNiID0gX2hvb2soJ3NpbmdsZScpOwogICAgICAgIGNiICYmIGNiKGRhdGEpOwogICAgfQoKICAgIGZ1bmN0aW9uIG11bHRpU2VsZWN0SG9vayhzZWxlY3RPcmRlcikgewogICAgICAgIHZhciBjYiA9IF9ob29rKCdtdWx0aScpOwogICAgICAgIGNiICYmIGNiKHNlbGVjdE9yZGVyKTsKICAgIH0KCiAgICBmdW5jdGlvbiBtb3VzZU92ZXJIb29rKHdoYXQpIHsKICAgICAgICB2YXIgY2IgPSBfaG9vaygnbW91c2VvdmVyJyk7CiAgICAgICAgY2IgJiYgY2Iod2hhdCk7CiAgICB9CgogICAgZnVuY3Rpb24gbW91c2VPdXRIb29rKCkgewogICAgICAgIHZhciBjYiA9IF9ob29rKCdtb3VzZW91dCcpOwogICAgICAgIGNiICYmIGNiKCk7CiAgICB9CgogICAgLy8gPT09IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyAgRXZlbnQgKGZyb20gc2VydmVyKSBIYW5kbGVycwoKICAgIGZ1bmN0aW9uIHNldEFwaShfYXBpXywgX3Rzc18pIHsKICAgICAgICBhcGkgPSBfYXBpXzsKICAgICAgICB0c3MgPSBfdHNzXzsKICAgIH0KCiAgICAvL3Byb2Nlc3MgaGlnaGxpZ2h0IGV2ZW50IHdpdGggb3B0aW9uYWwgZGVsYXkKICAgIGZ1bmN0aW9uIHNob3dIaWdobGlnaHRzKGRhdGEpIHsKICAgICAgICBmdW5jdGlvbiBkb0hpZ2hsaWdodCgpIHsKICAgICAgICAgICAgX3Nob3dIaWdobGlnaHRzKGRhdGEpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGRhdGEuZGVsYXkpIHsKICAgICAgICAgICAgJHRpbWVvdXQoZG9IaWdobGlnaHQsIGRhdGEuZGVsYXkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGRvSGlnaGxpZ2h0KCk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIF9zaG93SGlnaGxpZ2h0cyhkYXRhKSB7CiAgICAgICAgdmFyIGxlc3M7CgogICAgICAgIC8qCiAgICAgICAgICAgQVBJIHRvIHRvcG9Gb3JjZQogICAgICAgICAgICAgY2xlYXJMaW5rVHJhZmZpY1N0eWxlKCkKICAgICAgICAgICAgIHJlbW92ZUxpbmtMYWJlbHMoKQogICAgICAgICAgICAgZmluZExpbmtCeUlkKCBpZCApCiAgICAgICAgICAgICBmaW5kTm9kZUJ5SWQoIGlkICkKICAgICAgICAgICAgIHVwZGF0ZUxpbmtzKCkKICAgICAgICAgICAgIHVwZGF0ZU5vZGVzKCkKICAgICAgICAgICAgIHN1cExheWVycyggYm9vbCwgW2xlc3NdICkKICAgICAgICAgICAgIHVuc3VwTm9kZSggaWQsIFtsZXNzXSApCiAgICAgICAgICAgICB1bnN1cExpbmsoIGtleSwgW2xlc3NdICkKICAgICAgICAgKi8KCiAgICAgICAgYXBpLmNsZWFyTm9kZURlY28oKTsKICAgICAgICBhcGkucmVtb3ZlTm9kZUJhZGdlcygpOwogICAgICAgIGFwaS5jbGVhckxpbmtUcmFmZmljU3R5bGUoKTsKICAgICAgICBhcGkucmVtb3ZlTGlua0xhYmVscygpOwoKICAgICAgICAvLyBoYW5kbGUgZWxlbWVudCBzdXBwcmVzc2lvbgogICAgICAgIGlmIChkYXRhLnN1YmR1ZSkgewogICAgICAgICAgICBsZXNzID0gZGF0YS5zdWJkdWUgPT09ICdtaW4nOwogICAgICAgICAgICBhcGkuc3VwTGF5ZXJzKHRydWUsIGxlc3MpOwoKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhcGkuc3VwTGF5ZXJzKGZhbHNlKTsKICAgICAgICAgICAgYXBpLnN1cExheWVycyhmYWxzZSwgdHJ1ZSk7CiAgICAgICAgfQoKICAgICAgICBkYXRhLmhvc3RzLmZvckVhY2goZnVuY3Rpb24gKGhvc3QpIHsKICAgICAgICAgICAgdmFyIGhkYXRhID0gYXBpLmZpbmROb2RlQnlJZChob3N0LmlkKSwKICAgICAgICAgICAgICAgIGJhZGdlRGF0YSA9IGhvc3QuYmFkZ2UgfHwgbnVsbDsKCiAgICAgICAgICAgIGlmIChoZGF0YSAmJiAhaGRhdGEuZWwuZW1wdHkoKSkgewogICAgICAgICAgICAgICAgaGRhdGEuYmFkZ2UgPSBiYWRnZURhdGE7CiAgICAgICAgICAgICAgICBpZiAoIWhvc3Quc3ViZHVlKSB7CiAgICAgICAgICAgICAgICAgICAgYXBpLnVuc3VwTm9kZShoZGF0YS5pZCwgbGVzcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBUT0RPOiBmdXJ0aGVyIGhpZ2hsaWdodGluZz8KICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICBkYXRhLmRldmljZXMuZm9yRWFjaChmdW5jdGlvbiAoZGV2aWNlKSB7CiAgICAgICAgICAgIHZhciBkZGF0YSA9IGFwaS5maW5kTm9kZUJ5SWQoZGV2aWNlLmlkKSwKICAgICAgICAgICAgICAgIGJhZGdlRGF0YSA9IGRldmljZS5iYWRnZSB8fCBudWxsOwoKICAgICAgICAgICAgaWYgKGRkYXRhICYmICFkZGF0YS5lbC5lbXB0eSgpKSB7CiAgICAgICAgICAgICAgICBkZGF0YS5iYWRnZSA9IGJhZGdlRGF0YTsKICAgICAgICAgICAgICAgIGlmICghZGV2aWNlLnN1YmR1ZSkgewogICAgICAgICAgICAgICAgICAgIGFwaS51bnN1cE5vZGUoZGRhdGEuaWQsIGxlc3MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gVE9ETzogZnVydGhlciBoaWdobGlnaHRpbmc/CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgZGF0YS5saW5rcy5mb3JFYWNoKGZ1bmN0aW9uIChsaW5rKSB7CiAgICAgICAgICAgIHZhciBsZGF0YSA9IGFwaS5maW5kTGlua0J5SWQobGluay5pZCksCiAgICAgICAgICAgICAgICBsYWIgPSBsaW5rLmxhYmVsLAogICAgICAgICAgICAgICAgdW5pdHMsIHBvcnRjbHMsIG1hZ25pdHVkZTsKICAgICAgICAgICAgaWYgKGxkYXRhICYmICFsZGF0YS5lbC5lbXB0eSgpKSB7CiAgICAgICAgICAgICAgICBpZiAoIWxpbmsuc3ViZHVlKSB7CiAgICAgICAgICAgICAgICAgICAgYXBpLnVuc3VwTGluayhsZGF0YS5rZXksIGxlc3MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGRhdGEuZWwuY2xhc3NlZChsaW5rLmNzcywgdHJ1ZSk7CiAgICAgICAgICAgICAgICBsZGF0YS5sYWJlbCA9IGxhYjsKCiAgICAgICAgICAgICAgICAvLyBUT0RPOiB0aGlzIG5lZWRzIHRvIGJlIHB1bGxlZCBvdXQgaW50byB0cmFmZmljIG92ZXJsYXkKICAgICAgICAgICAgICAgIC8vIGluamVjdCBhZGRpdGlvbmFsIHN0eWxpbmcgZm9yIHBvcnQtYmFzZWQgdHJhZmZpYwogICAgICAgICAgICAgICAgaWYgKGZzLmVuZHNXaXRoKGxhYiwgJ2JwcycpKSB7CiAgICAgICAgICAgICAgICAgICAgdW5pdHMgPSBsYWIuc3Vic3RyaW5nKGxhYi5sZW5ndGgtNCk7CiAgICAgICAgICAgICAgICAgICAgcG9ydGNscyA9ICdwb3J0LXRyYWZmaWMtJyArIHVuaXRzOwoKICAgICAgICAgICAgICAgICAgICAvLyBmb3IgR0JwcwogICAgICAgICAgICAgICAgICAgIGlmICh1bml0cy5zdWJzdHJpbmcoMCwxKSA9PT0gJ0cnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hZ25pdHVkZSA9IGZzLnBhcnNlQml0UmF0ZShsYWIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFnbml0dWRlID49IDkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRjbHMgKz0gJy1jaG9rZWQnCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbGRhdGEuZWwuY2xhc3NlZChwb3J0Y2xzLCB0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICBhcGkudXBkYXRlTm9kZXMoKTsKICAgICAgICBhcGkudXBkYXRlTGlua3MoKTsKICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBhbmd1bGFyLm1vZHVsZSgnb3ZUb3BvJykKICAgIC5mYWN0b3J5KCdUb3BvT3ZlcmxheVNlcnZpY2UnLAogICAgICAgIFsnJGxvZycsICckdGltZW91dCcsICdGblNlcnZpY2UnLCAnR2x5cGhTZXJ2aWNlJywgJ1dlYlNvY2tldFNlcnZpY2UnLAogICAgICAgICAgICAnTmF2U2VydmljZScsICdUb3BvUGFuZWxTZXJ2aWNlJywKCiAgICAgICAgZnVuY3Rpb24gKF8kbG9nXywgXyR0aW1lb3V0XywgX2ZzXywgX2dzXywgX3dzc18sIF9uc18sIF90cHNfKSB7CiAgICAgICAgICAgICRsb2cgPSBfJGxvZ187CiAgICAgICAgICAgICR0aW1lb3V0ID0gXyR0aW1lb3V0XzsKICAgICAgICAgICAgZnMgPSBfZnNfOwogICAgICAgICAgICBncyA9IF9nc187CiAgICAgICAgICAgIHdzcyA9IF93c3NfOwogICAgICAgICAgICBucyA9IF9uc187CiAgICAgICAgICAgIHRwcyA9IF90cHNfOwoKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHJlZ2lzdGVyOiByZWdpc3RlciwKICAgICAgICAgICAgICAgIHNldEFwaTogc2V0QXBpLAogICAgICAgICAgICAgICAgbGlzdDogbGlzdCwKICAgICAgICAgICAgICAgIGF1Z21lbnRSYnNldDogYXVnbWVudFJic2V0LAogICAgICAgICAgICAgICAgbWtHbHlwaElkOiBta0dseXBoSWQsCiAgICAgICAgICAgICAgICB0YlNlbGVjdGlvbjogdGJTZWxlY3Rpb24sCiAgICAgICAgICAgICAgICBpbnN0YWxsQnV0dG9uczogaW5zdGFsbEJ1dHRvbnMsCiAgICAgICAgICAgICAgICBhZGREZXRhaWxCdXR0b246IGFkZERldGFpbEJ1dHRvbiwKICAgICAgICAgICAgICAgIHJlc2V0T25Ub29sYmFyRGVzdHJveTogZnVuY3Rpb24gKCkgeyByZXNldCA9IHRydWU7IH0sCiAgICAgICAgICAgICAgICBob29rczogewogICAgICAgICAgICAgICAgICAgIGVzY2FwZTogZXNjYXBlSG9vaywKICAgICAgICAgICAgICAgICAgICBlbXB0eVNlbGVjdDogZW1wdHlTZWxlY3RIb29rLAogICAgICAgICAgICAgICAgICAgIHNpbmdsZVNlbGVjdDogc2luZ2xlU2VsZWN0SG9vaywKICAgICAgICAgICAgICAgICAgICBtdWx0aVNlbGVjdDogbXVsdGlTZWxlY3RIb29rLAogICAgICAgICAgICAgICAgICAgIG1vdXNlT3ZlcjogbW91c2VPdmVySG9vaywKICAgICAgICAgICAgICAgICAgICBtb3VzZU91dDogbW91c2VPdXRIb29rCiAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgIHNob3dIaWdobGlnaHRzOiBzaG93SGlnaGxpZ2h0cwogICAgICAgICAgICB9CiAgICAgICAgfV0pOwoKfSgpKTuO8e9WMP0CAIocAACKHAAAaPcoH9LFCAAnrR4TCABFABx8iY9AAEAGBQbAqAdgwKgHNh/1ltBrO2P8+T5KO4AQAxKsVQAAAQEICgBiKcUAt+LHSFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvamF2YXNjcmlwdA0KQ29udGVudC1MZW5ndGg6IDg0ODMNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gVG9wb2xvZ3kgU2VsZWN0aW9uIE1vZHVsZS4KIERlZmluZXMgYmVoYXZpb3Igd2hlbiBzZWxlY3Rpbmcgbm9kZXMuCiAqLwoKKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBpbmplY3RlZCByZWZzCiAgICB2YXIgJGxvZywgZnMsIHdzcywgdG92LCB0cHMsIHR0cywgbnM7CgogICAgLy8gYXBpIHRvIHRvcG9Gb3JjZQogICAgdmFyIGFwaTsKICAgIC8qCiAgICAgICBub2RlKCkgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHJlZiB0byBEMyBzZWxlY3Rpb24gb2Ygbm9kZXMKICAgICAgIHpvb21pbmdPclBhbm5pbmcoIGV2ICkKICAgICAgIHVwZGF0ZURldmljZUNvbG9ycyggW2Rldl0gKQogICAgICAgZGVzZWxlY3RMaW5rKCkKICAgICAqLwoKICAgIC8vIGludGVybmFsIHN0YXRlCiAgICB2YXIgaG92ZXJlZCwgICAgICAgICAgICAgICAgLy8gdGhlIG5vZGUgb3ZlciB3aGljaCB0aGUgbW91c2UgaXMgaG92ZXJpbmcKICAgICAgICBzZWxlY3Rpb25zID0ge30sICAgICAgICAvLyBjdXJyZW50bHkgc2VsZWN0ZWQgbm9kZXMgKGJ5IGlkKQogICAgICAgIHNlbGVjdE9yZGVyID0gW10sICAgICAgIC8vIHRoZSBvcmRlciBpbiB3aGljaCB3ZSBtYWRlIHNlbGVjdGlvbnMKICAgICAgICBjb25zdW1lQ2xpY2sgPSBmYWxzZTsgICAvLyB1c2VkIHRvIGNvb3JkaW5hdGUgd2l0aCBTVkcgY2xpY2sgaGFuZGxlcgoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgZnVuY3Rpb24gblNlbCgpIHsKICAgICAgICByZXR1cm4gc2VsZWN0T3JkZXIubGVuZ3RoOwogICAgfQogICAgZnVuY3Rpb24gZ2V0U2VsKGlkeCkgewogICAgICAgIHJldHVybiBzZWxlY3Rpb25zW3NlbGVjdE9yZGVyW2lkeF1dOwogICAgfQogICAgZnVuY3Rpb24gYWxsU2VsZWN0aW9uc0NsYXNzKGNscykgewogICAgICAgIGZvciAodmFyIGk9MCwgbj1uU2VsKCk7IGk8bjsgaSsrKSB7CiAgICAgICAgICAgIGlmIChnZXRTZWwoaSkub2JqLmNsYXNzICE9PSBjbHMpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIGZ1bmN0aW9uIG5vZGVNb3VzZU92ZXIobSkgewogICAgICAgIGlmICghbS5kcmFnU3RhcnRlZCkgewogICAgICAgICAgICBpZiAoaG92ZXJlZCAhPSBtKSB7CiAgICAgICAgICAgICAgICBob3ZlcmVkID0gbTsKICAgICAgICAgICAgICAgIHRvdi5ob29rcy5tb3VzZU92ZXIoewogICAgICAgICAgICAgICAgICAgIGlkOiBtLmlkLAogICAgICAgICAgICAgICAgICAgIGNsYXNzOiBtLmNsYXNzLAogICAgICAgICAgICAgICAgICAgIHR5cGU6IG0udHlwZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gbm9kZU1vdXNlT3V0KG0pIHsKICAgICAgICBpZiAoIW0uZHJhZ1N0YXJ0ZWQpIHsKICAgICAgICAgICAgaWYgKGhvdmVyZWQpIHsKICAgICAgICAgICAgICAgIGhvdmVyZWQgPSBudWxsOwogICAgICAgICAgICAgICAgdG92Lmhvb2tzLm1vdXNlT3V0KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBmdW5jdGlvbiBzZWxlY3RPYmplY3Qob2JqKSB7CiAgICAgICAgdmFyIGVsID0gdGhpcywKICAgICAgICAgICAgbm9kZUV2ID0gZWwgJiYgZWwudGFnTmFtZSA9PT0gJ2cnLAogICAgICAgICAgICBldiA9IGQzLmV2ZW50LnNvdXJjZUV2ZW50IHx8IHt9LAogICAgICAgICAgICBuOwoKICAgICAgICBpZiAoYXBpLnpvb21pbmdPclBhbm5pbmcoZXYpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmIChub2RlRXYpIHsKICAgICAgICAgICAgbiA9IGQzLnNlbGVjdChlbCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYXBpLm5vZGUoKS5lYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICBpZiAoZCA9PSBvYmopIHsKICAgICAgICAgICAgICAgICAgICBuID0gZDMuc2VsZWN0KGVsID0gdGhpcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBpZiAoIW4pIHJldHVybjsKCiAgICAgICAgaWYgKG5vZGVFdikgewogICAgICAgICAgICBjb25zdW1lQ2xpY2sgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBhcGkuZGVzZWxlY3RMaW5rKCk7CgogICAgICAgIGlmIChldi5zaGlmdEtleSAmJiBuLmNsYXNzZWQoJ3NlbGVjdGVkJykpIHsKICAgICAgICAgICAgZGVzZWxlY3RPYmplY3Qob2JqLmlkKTsKICAgICAgICAgICAgdXBkYXRlRGV0YWlsKCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICghZXYuc2hpZnRLZXkpIHsKICAgICAgICAgICAgZGVzZWxlY3RBbGwodHJ1ZSk7CiAgICAgICAgfQoKICAgICAgICBzZWxlY3Rpb25zW29iai5pZF0gPSB7IG9iajogb2JqLCBlbDogZWwgfTsKICAgICAgICBzZWxlY3RPcmRlci5wdXNoKG9iai5pZCk7CgogICAgICAgIG4uY2xhc3NlZCgnc2VsZWN0ZWQnLCB0cnVlKTsKICAgICAgICBhcGkudXBkYXRlRGV2aWNlQ29sb3JzKG9iaik7CiAgICAgICAgdXBkYXRlRGV0YWlsKCk7CiAgICB9CgogICAgZnVuY3Rpb24gZGVzZWxlY3RPYmplY3QoaWQpIHsKICAgICAgICB2YXIgb2JqID0gc2VsZWN0aW9uc1tpZF07CiAgICAgICAgaWYgKG9iaikgewogICAgICAgICAgICBkMy5zZWxlY3Qob2JqLmVsKS5jbGFzc2VkKCdzZWxlY3RlZCcsIGZhbHNlKTsKICAgICAgICAgICAgZGVsZXRlIHNlbGVjdGlvbnNbaWRdOwogICAgICAgICAgICBmcy5yZW1vdmVGcm9tQXJyYXkoaWQsIHNlbGVjdE9yZGVyKTsKICAgICAgICAgICAgYXBpLnVwZGF0ZURldmljZUNvbG9ycyhvYmoub2JqKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZGVzZWxlY3RBbGwoc2tpcFVwZGF0ZSkgewogICAgICAgIHZhciBzb21ldGhpbmcgPSAoc2VsZWN0T3JkZXIubGVuZ3RoID4gMCk7CgogICAgICAgIC8vIGRlc2VsZWN0IGFsbCBub2RlcyBpbiB0aGUgbmV0d29yay4uLgogICAgICAgIGFwaS5ub2RlKCkuY2xhc3NlZCgnc2VsZWN0ZWQnLCBmYWxzZSk7CiAgICAgICAgc2VsZWN0aW9ucyA9IHt9OwogICAgICAgIHNlbGVjdE9yZGVyID0gW107CiAgICAgICAgYXBpLnVwZGF0ZURldmljZUNvbG9ycygpOwogICAgICAgIGlmICghc2tpcFVwZGF0ZSkgewogICAgICAgICAgICB1cGRhdGVEZXRhaWwoKTsKICAgICAgICB9CgogICAgICAgIC8vIHJldHVybiB0cnVlIGlmIHNvbWV0aGluZyB3YXMgc2VsZWN0ZWQKICAgICAgICByZXR1cm4gc29tZXRoaW5nOwogICAgfQoKICAgIC8vID09PSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIGZ1bmN0aW9uIHJlcXVlc3REZXRhaWxzKGRhdGEpIHsKICAgICAgICB3c3Muc2VuZEV2ZW50KCdyZXF1ZXN0RGV0YWlscycsIHsKICAgICAgICAgICAgaWQ6IGRhdGEuaWQsCiAgICAgICAgICAgIGNsYXNzOiBkYXRhLmNsYXNzCiAgICAgICAgfSk7CiAgICB9CgogICAgLy8gPT09IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgZnVuY3Rpb24gdXBkYXRlRGV0YWlsKCkgewogICAgICAgIHZhciBuU2VsID0gc2VsZWN0T3JkZXIubGVuZ3RoOwogICAgICAgIGlmICghblNlbCkgewogICAgICAgICAgICBlbXB0eVNlbGVjdCgpOwogICAgICAgIH0gZWxzZSBpZiAoblNlbCA9PT0gMSkgewogICAgICAgICAgICBzaW5nbGVTZWxlY3QoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBtdWx0aVNlbGVjdCgpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBlbXB0eVNlbGVjdCgpIHsKICAgICAgICB0b3YuaG9va3MuZW1wdHlTZWxlY3QoKTsKICAgICAgICB0cHMuZGlzcGxheU5vdGhpbmcoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzaW5nbGVTZWxlY3QoKSB7CiAgICAgICAgdmFyIGRhdGEgPSBnZXRTZWwoMCkub2JqOwogICAgICAgIHJlcXVlc3REZXRhaWxzKGRhdGEpOwogICAgICAgIC8vIE5PVEU6IGRldGFpbCBwYW5lbCBpcyBzaG93biBhcyBhIHJlc3BvbnNlIHRvIHJlY2VpdmluZwogICAgICAgIC8vICAgICAgIGEgJ3Nob3dEZXRhaWxzJyBldmVudCBmcm9tIHRoZSBzZXJ2ZXIuIFNlZSAnc2hvd0RldGFpbHMnCiAgICAgICAgLy8gICAgICAgY2FsbGJhY2sgZnVuY3Rpb24gYmVsb3cuLi4KICAgIH0KCiAgICBmdW5jdGlvbiBtdWx0aVNlbGVjdCgpIHsKICAgICAgICAvLyBkaXNwbGF5IHRoZSBzZWxlY3RlZCBub2RlcyBpbiB0aGUgZGV0YWlsIHBhbmVsCiAgICAgICAgdHBzLmRpc3BsYXlNdWx0aShzZWxlY3RPcmRlcik7CiAgICAgICAgYWRkSG9zdFNlbGVjdGlvbkFjdGlvbnMoKTsKICAgICAgICB0b3YuaG9va3MubXVsdGlTZWxlY3Qoc2VsZWN0T3JkZXIpOwogICAgICAgIHRwcy5kaXNwbGF5U29tZXRoaW5nKCk7CiAgICB9CgogICAgZnVuY3Rpb24gYWRkSG9zdFNlbGVjdGlvbkFjdGlvbnMoKSB7CiAgICAgICAgaWYgKGFsbFNlbGVjdGlvbnNDbGFzcygnaG9zdCcpKSB7CiAgICAgICAgICAgIGlmIChuU2VsKCkgPT09IDIpIHsKICAgICAgICAgICAgICAgIHRwcy5hZGRBY3Rpb24oewogICAgICAgICAgICAgICAgICAgIGlkOiAnaG9zdC1mbG93LWJ0bicsCiAgICAgICAgICAgICAgICAgICAgZ2lkOiAnZW5kc3RhdGlvbicsCiAgICAgICAgICAgICAgICAgICAgY2I6IHR0cy5hZGRIb3N0SW50ZW50LAogICAgICAgICAgICAgICAgICAgIHR0OiAnQ3JlYXRlIEhvc3QtdG8tSG9zdCBGbG93JwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoblNlbCgpID49IDIpIHsKICAgICAgICAgICAgICAgIHRwcy5hZGRBY3Rpb24oewogICAgICAgICAgICAgICAgICAgIGlkOiAnbXVsdC1zcmMtZmxvdy1idG4nLAogICAgICAgICAgICAgICAgICAgIGdpZDogJ2Zsb3dzJywKICAgICAgICAgICAgICAgICAgICBjYjogdHRzLmFkZE11bHRpU291cmNlSW50ZW50LAogICAgICAgICAgICAgICAgICAgIHR0OiAnQ3JlYXRlIE11bHRpLVNvdXJjZSBGbG93JwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgoKICAgIC8vID09PSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gIEV2ZW50IEhhbmRsZXJzCgogICAgLy8gZGlzcGxheSB0aGUgZGF0YSBmb3IgdGhlIHNpbmdsZSBzZWxlY3RlZCBub2RlCiAgICBmdW5jdGlvbiBzaG93RGV0YWlscyhkYXRhKSB7CiAgICAgICAgdmFyIGJ1dHRvbnMgPSBmcy5pc0EoZGF0YS5idXR0b25zKSB8fCBbXTsKICAgICAgICB0cHMuZGlzcGxheVNpbmdsZShkYXRhKTsKICAgICAgICB0b3YuaW5zdGFsbEJ1dHRvbnMoYnV0dG9ucywgZGF0YSwgZGF0YS5wcm9wc1snVVJJJ10pOwogICAgICAgIHRvdi5ob29rcy5zaW5nbGVTZWxlY3QoZGF0YSk7CiAgICAgICAgdHBzLmRpc3BsYXlTb21ldGhpbmcoKTsKICAgIH0KCiAgICAvLyByZXR1cm5zIHRydWUgaWYgb25lIG9yIG1vcmUgbm9kZXMgYXJlIHNlbGVjdGVkLgogICAgZnVuY3Rpb24gc29tZXRoaW5nU2VsZWN0ZWQoKSB7CiAgICAgICAgcmV0dXJuIG5TZWwoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjbGlja0NvbnN1bWVkKHgpIHsKICAgICAgICB2YXIgY2MgPSBjb25zdW1lQ2xpY2s7CiAgICAgICAgY29uc3VtZUNsaWNrID0gISF4OwogICAgICAgIHJldHVybiBjYzsKICAgIH0KCiAgICAvLyByZXR1cm5zIGEgc2VsZWN0aW9uIGNvbnRleHQsIHByb3ZpZGluZyBpbmZvIGFib3V0IHdoYXQgaXMgc2VsZWN0ZWQKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbkNvbnRleHQoKSB7CiAgICAgICAgdmFyIGRldmljZXMgPSBbXSwKICAgICAgICAgICAgaG9zdHMgPSBbXSwKICAgICAgICAgICAgdHlwZXMgPSB7fTsKCiAgICAgICAgYW5ndWxhci5mb3JFYWNoKHNlbGVjdGlvbnMsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIHZhciBvID0gZC5vYmosCiAgICAgICAgICAgICAgICBjID0gby5jbGFzczsKCiAgICAgICAgICAgIGlmIChjID09PSAnZGV2aWNlJykgewogICAgICAgICAgICAgICAgZGV2aWNlcy5wdXNoKG8uaWQpOwogICAgICAgICAgICAgICAgdHlwZXNbby5pZF0gPSBvLnR5cGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGMgPT09ICdob3N0JykgewogICAgICAgICAgICAgICAgaG9zdHMucHVzaChvLmlkKTsKICAgICAgICAgICAgICAgIHR5cGVzW28uaWRdID0gby50eXBlOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGRldmljZXM6IGRldmljZXMsCiAgICAgICAgICAgIGhvc3RzOiBob3N0cywKICAgICAgICAgICAgdHlwZXM6IHR5cGVzCiAgICAgICAgfTsKICAgIH0KCiAgICAvLyA9PT0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLY7x71Z8/QIAhgUAAIYFAABo9ygf0sUIACetHhMIAEUABXiJlEAAQAYcBcCoB2DAqAc2H/WW0Gs7gET5Pko7gBgDEpVRAAABAQgKAGIpxQC34sctLS0tLS0tLS0tCiAgICAvLyA9PT0gTU9EVUxFIERFRklOSVRJT04gPT09CgogICAgYW5ndWxhci5tb2R1bGUoJ292VG9wbycpCiAgICAuZmFjdG9yeSgnVG9wb1NlbGVjdFNlcnZpY2UnLAogICAgICAgIFsnJGxvZycsICdGblNlcnZpY2UnLCAnV2ViU29ja2V0U2VydmljZScsICdUb3BvT3ZlcmxheVNlcnZpY2UnLAogICAgICAgICAgICAnVG9wb1BhbmVsU2VydmljZScsICdUb3BvVHJhZmZpY1NlcnZpY2UnLCAnTmF2U2VydmljZScsCgogICAgICAgIGZ1bmN0aW9uIChfJGxvZ18sIF9mc18sIF93c3NfLCBfdG92XywgX3Rwc18sIF90dHNfLCBfbnNfKSB7CiAgICAgICAgICAgICRsb2cgPSBfJGxvZ187CiAgICAgICAgICAgIGZzID0gX2ZzXzsKICAgICAgICAgICAgd3NzID0gX3dzc187CiAgICAgICAgICAgIHRvdiA9IF90b3ZfOwogICAgICAgICAgICB0cHMgPSBfdHBzXzsKICAgICAgICAgICAgdHRzID0gX3R0c187CiAgICAgICAgICAgIG5zID0gX25zXzsKCiAgICAgICAgICAgIGZ1bmN0aW9uIGluaXRTZWxlY3QoX2FwaV8pIHsKICAgICAgICAgICAgICAgIGFwaSA9IF9hcGlfOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiBkZXN0cm95U2VsZWN0KCkgeyB9CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgaW5pdFNlbGVjdDogaW5pdFNlbGVjdCwKICAgICAgICAgICAgICAgIGRlc3Ryb3lTZWxlY3Q6IGRlc3Ryb3lTZWxlY3QsCgogICAgICAgICAgICAgICAgc2hvd0RldGFpbHM6IHNob3dEZXRhaWxzLAoKICAgICAgICAgICAgICAgIG5vZGVNb3VzZU92ZXI6IG5vZGVNb3VzZU92ZXIsCiAgICAgICAgICAgICAgICBub2RlTW91c2VPdXQ6IG5vZGVNb3VzZU91dCwKICAgICAgICAgICAgICAgIHNlbGVjdE9iamVjdDogc2VsZWN0T2JqZWN0LAogICAgICAgICAgICAgICAgZGVzZWxlY3RPYmplY3Q6IGRlc2VsZWN0T2JqZWN0LAogICAgICAgICAgICAgICAgZGVzZWxlY3RBbGw6IGRlc2VsZWN0QWxsLAogICAgICAgICAgICAgICAgdXBkYXRlRGV0YWlsOiB1cGRhdGVEZXRhaWwsCgogICAgICAgICAgICAgICAgaG92ZXJlZDogZnVuY3Rpb24gKCkgeyByZXR1cm4gaG92ZXJlZDsgfSwKICAgICAgICAgICAgICAgIHNlbGVjdE9yZGVyOiBmdW5jdGlvbiAoKSB7IHJldHVybiBzZWxlY3RPcmRlcjsgfSwKICAgICAgICAgICAgICAgIHNvbWV0aGluZ1NlbGVjdGVkOiBzb21ldGhpbmdTZWxlY3RlZCwKCiAgICAgICAgICAgICAgICBjbGlja0NvbnN1bWVkOiBjbGlja0NvbnN1bWVkLAogICAgICAgICAgICAgICAgc2VsZWN0aW9uQ29udGV4dDogc2VsZWN0aW9uQ29udGV4dAogICAgICAgICAgICB9OwogICAgICAgIH1dKTsKfSgpKTsKjvHvVmcGAwBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANOJ6QABABshiwKgHNsCoB2CW1B/1QN4ZOqGv73eAEAeKL5UAAAEBCAoAt+LPAGIpxY7x71YBBwMAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADRfzEAAQAZLEcCoBzbAqAdgltAf9fk+SjtrO4WIgBAFh+idAAABAQgKALfizwBiKcWO8e9WdwcDAI0CAACNAgAACAAnrR4TaPcoH9LFCABFAAJ/xEpAAEAG5EfAqAc2wKgHYJbPH/WjavqCDr9s+oAYIWZFsAAAAQEICgC34s8AYinDR0VUIC9vbm9zL3VpL2FwcC92aWV3L21ldGVyL21ldGVyLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiAqLyoNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQqO8e9WHRADAIsCAACLAgAACAAnrR4TaPcoH9LFCABFAAJ94ntAAEAGxhjAqAc2wKgHYJbUH/VA3hk6oa/vd4AYB6BW7QAAAQEICgC34tAAYinFR0VUIC9vbm9zL3VpL2FwcC92aWV3L2xpbmsvbGluay5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0KjvHvVmIQAwCLAgAAiwIAAAgAJ60eE2j3KB/SxQgARQACfV/NQABABkjHwKgHNsCoB2CW0B/1+T5KO2s7hYiAGAWk/94AAAEBCAoAt+LQAGIpxUdFVCAvb25vcy91aS9hcHAvdmlldy9ob3N0L2hvc3QuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6ICovKg0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71aFHAMAsBwAALAcAABo9ygf0sUIACetHhMIAEUAHKIsDkAAQAZiYcCoB2DAqAc2H/WW03KDg0RhHJJTgBgDUKx7AAABAQgKAGIpxwC34sdIVFRQLzEuMSAyMDAgT0sNCkNvbnRlbnQtVHlwZTogdGV4dC9qYXZhc2NyaXB0DQpDb250ZW50LUxlbmd0aDogNzE3Mw0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBUb3BvbG9neSBTcHJpdGUgTW9kdWxlLgogRGVmaW5lcyBiZWhhdmlvciBmb3IgbG9hZGluZyBzcHJpdGVzIGludG8gdGhlIHNwcml0ZSBsYXllci4KICovCgooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIGluamVjdGVkIHJlZnMKICAgIHZhciAkbG9nLCAkaHR0cCwgZnMsIGdzLCBzdXMsIHdzczsKCiAgICAvLyBjb25zdGFudHMKICAgIHZhciB0c3NpZCA9ICdUb3BvU3ByaXRlU2VydmljZTogJywKICAgICAgICBmb250c2l6ZSA9IDIwOyAgLy8gZGVmYXVsdCBmb250IHNpemUgMjBwdC4KCiAgICAvLyBpbnRlcm5hbCBzdGF0ZQogICAgdmFyIHNwcml0ZUxheWVyLCBkZWZzRWxlbWVudDsKCgogICAgZnVuY3Rpb24gcmVnaXN0ZXJQYXRoc0FzR2x5cGhzKHBhdGhzKSB7CiAgICAgICAgdmFyIGN1c3RvbSA9IHt9LAogICAgICAgICAgICBpZHMgPSBbXTsKCiAgICAgICAgZnVuY3Rpb24gbWtkKGQpIHsKICAgICAgICAgICAgcmV0dXJuIGZzLmlzQShkKSA/IGQuam9pbignJykgOiBkOwogICAgICAgIH0KCiAgICAgICAgcGF0aHMuZm9yRWFjaChmdW5jdGlvbiAocGF0aCkgewogICAgICAgICAgICB2YXIgdGFnID0gJ3Nwcl8nICsgcGF0aC50YWc7CgogICAgICAgICAgICBpZiAocGF0aC5nbHlwaCkgewogICAgICAgICAgICAgICAgLy8gYXNzdW1wdGlvbiBpcyB0aGF0IHdlIGFyZSB1c2luZyBhIGJ1aWx0LWluIGdseXBoCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGN1c3RvbVsnXycgKyB0YWddID0gcGF0aC52aWV3Ym94IHx8ICcwIDAgMTAwMCAxMDAwJzsKICAgICAgICAgICAgY3VzdG9tW3RhZ10gPSBta2QocGF0aC5kKTsKICAgICAgICAgICAgaWRzLnB1c2godGFnKTsKICAgICAgICB9KTsKCiAgICAgICAgZ3MucmVnaXN0ZXJHbHlwaHMoY3VzdG9tKTsKICAgICAgICBncy5sb2FkRGVmcyhkZWZzRWxlbWVudCwgaWRzLCB0cnVlKTsKICAgIH0KCiAgICBmdW5jdGlvbiBhcHBseVN0cm9rZVN0eWxlKHMsIHVzZSkgewogICAgICAgIHZhciBzdHlsZTsKICAgICAgICBpZiAocykgewogICAgICAgICAgICBzdHlsZSA9IHt9OwogICAgICAgICAgICBhbmd1bGFyLmZvckVhY2gocywgZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHsKICAgICAgICAgICAgICAgIHN0eWxlWydzdHJva2UtJyArIGtleV0gPSB2YWx1ZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHVzZS5zdHlsZShzdHlsZSk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGFwcGx5RmlsbENsYXNzKGYsIHVzZSkgewogICAgICAgIHVzZS5jbGFzc2VkKCdmaWxsLScgKyBmLCB0cnVlKTsKICAgIH0KCiAgICBmdW5jdGlvbiBkb1Nwcml0ZShzcHIsIGRlZiwgcGF0aG1ldGEpIHsKICAgICAgICB2YXIgcG1ldGEgPSBwYXRobWV0YVtkZWYucGF0aF0sCiAgICAgICAgICAgIGMgPSBzcHIuY2xhc3MgfHwgJ2dyYXkxJywKICAgICAgICAgICAgcCA9IHNwci5wb3MgfHwgWzAsMF0sCiAgICAgICAgICAgIGxhYiA9IHNwci5sYWJlbCwKICAgICAgICAgICAgZGltID0gZGVmLmRpbSB8fCBbNDAsNDBdLAogICAgICAgICAgICB3ID0gZGltWzBdLAogICAgICAgICAgICBoID0gZGltWzFdLAogICAgICAgICAgICBkeSA9IGRlZi5sYWJlbHlvZmYgfHwgMSwKICAgICAgICAgICAgc2MgPSBkZWYuc2NhbGUsCiAgICAgICAgICAgIHhmbSA9IHN1cy50cmFuc2xhdGUocCksCiAgICAgICAgICAgIGcsIGF0dHIsIHVzZTsKCiAgICAgICAgaWYgKHNjKSB7CiAgICAgICAgICAgIHhmbSArPSBzdXMuc2NhbGUoc2MsIHNjKTsKICAgICAgICB9CgogICAgICAgIGcgPSBzcHJpdGVMYXllci5hcHBlbmQoJ2cnKQogICAgICAgICAgICAuY2xhc3NlZChjLCB0cnVlKQogICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgeGZtKTsKCiAgICAgICAgYXR0ciA9IHsKICAgICAgICAgICAgd2lkdGg6IHcsCiAgICAgICAgICAgIGhlaWdodDogaCwKICAgICAgICAgICAgJ3hsaW5rOmhyZWYnOiAnIycgKyBwbWV0YS51CiAgICAgICAgfTsKCiAgICAgICAgdXNlID0gZy5hcHBlbmQoJ3VzZScpLmF0dHIoYXR0cik7CiAgICAgICAgYXBwbHlTdHJva2VTdHlsZShwbWV0YS5zLCB1c2UpOwogICAgICAgIGFwcGx5RmlsbENsYXNzKGRlZi5maWxsLCB1c2UpOwoKCiAgICAgICAgLy8gYWRkIHN1YnBhdGhzIGlmIHRoZXkgaGF2ZSBiZWVuIGRlZmluZWQKICAgICAgICBpZiAoZnMuaXNBKGRlZi5zdWJwYXRocykpIHsKICAgICAgICAgICAgZGVmLnN1YnBhdGhzLmZvckVhY2goZnVuY3Rpb24gKHYpIHsKICAgICAgICAgICAgICAgIHBtZXRhID0gcGF0aG1ldGFbdi5wYXRoXTsKICAgICAgICAgICAgICAgIGF0dHIgPSB7CiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHcsCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBoLAogICAgICAgICAgICAgICAgICAgICd4bGluazpocmVmJzogJyMnICsgcG1ldGEudSwKICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IHN1cy50cmFuc2xhdGUodi5wb3MpCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdXNlID0gZy5hcHBlbmQoJ3VzZScpLmF0dHIoYXR0cik7CiAgICAgICAgICAgICAgICBhcHBseVN0cm9rZVN0eWxlKHBtZXRhLnMsIHVzZSk7CiAgICAgICAgICAgICAgICBhcHBseUZpbGxDbGFzcyhkZWYuc3VicGF0aGZpbGwsIHVzZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgaWYgKGxhYikgewogICAgICAgICAgICBnLmFwcGVuZCgndGV4dCcpCiAgICAgICAgICAgICAgICAudGV4dChsYWIpCiAgICAgICAgICAgICAgICAuYXR0cih7IHg6IHcgLyAyLCB5OiBoICogZHkgfSk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGRvTGFiZWwobGFiZWwpIHsKICAgICAgICB2YXIgYyA9IGxhYmVsLmNsYXNzIHx8ICdncmF5MScsCiAgICAgICAgICAgIHAgPSBsYWJlbC5wb3MgfHwgWzAsMF0sCiAgICAgICAgICAgIHN6ID0gbGFiZWwuc2l6ZSB8fCAxLjAsCiAgICAgICAgICAgIGcgPSBzcHJpdGVMYXllci5hcHBlbmQoJ2cnKQogICAgICAgICAgICAgICAgLmNsYXNzZWQoYywgdHJ1ZSkKICAgICAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBzdXMudHJhbnNsYXRlKHApKQogICAgICAgICAgICAgICAgLmFwcGVuZCgndGV4dCcpCiAgICAgICAgICAgICAgICAudGV4dChsYWJlbC50ZXh0KQogICAgICAgICAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCAoZm9udHNpemUgKiBzeikrJ3B0Jyk7CiAgICB9CgoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBldmVudCBoYW5kbGVycwoKICAgIC8vIEhhbmRsZXMgcmVzcG9uc2UgZnJvbSAnc3ByaXRlTGlzdFJlcXVlc3QnIHdoaWNoIGxpc3RzIGFsbCB0aGUKICAgIC8vIHJlZ2lzdGVyZWQgc3ByaXRlIGRlZmluaXRpb25zIG9uIHRoZSBzZXJ2ZXIuCiAgICAvLyAoc2VlIG9ub3MtdXBsb2FkLXNwcml0ZXMpCiAgICBmdW5jdGlvbiBpbkxpc3QocGF5bG9hZCkgewogICAgICAgICRsb2cuZGVidWcodHNzaWQgKyAnUmVnaXN0ZXJlZCBzcHJpdGUgZGVmaW5pdGlvbnM6JywgcGF5bG9hZC5uYW1lcyk7CiAgICAgICAgLy8gU29tZSBkYXksIHdlIHdpbGwgbWFrZSB0aGlzIGxpc3QgYXZhaWxhYmxlIHRvIHRoZSB1c2VyIGluCiAgICAgICAgLy8gIGEgZHJvcGRvd24gc2VsZWN0aW9uIGJveC4uLgogICAgfQoKICAgIC8vIEhhbmRsZXMgcmVzcG9uc2UgZnJvbSAnc3ByaXRlRGF0YVJlcXVlc3QnIHdoaWNoIHByb3ZpZGVzIHRoZQogICAgLy8gIGRhdGEgZm9yIHRoZSByZXF1ZXN0ZWQgc3ByaXRlIGRlZmluaXRpb24uCiAgICBmdW5jdGlvbiBpbkRhdGEocGF5bG9hZCkgewogICAgICAgIHZhciBkYXRhID0gcGF5bG9hZC5kYXRhLAogICAgICAgICAgICBuYW1lLCBkZXNjLCBwZngsIHNwcml0ZXMsIGxhYmVscywgYWxwaGEsCiAgICAgICAgICAgIHBhdGhzLCBkZWZuLCBsb2FkLAogICAgICAgICAgICBwYXRobWV0YSA9IHt9LAogICAgICAgICAgICBkZWZzID0ge30sCiAgICAgICAgICAgIHdhcm4gPSBbXTsKCiAgICAgICAgaWYgKCFkYXRhKSB7CiAgICAgICAgICAgICRsb2cud2Fybih0c3NpZCArICdObyBzcHJpdGUgZGF0YSBsb2FkZWQuJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgbmFtZSA9IGRhdGEuZGVmbl9uYW1lOwogICAgICAgIGRlc2MgPSBkYXRhLmRlZm5fZGVzYzsKICAgICAgICBwYXRocyA9IGRhdGEucGF0aHM7CiAgICAgICAgZGVmbiA9IGRhdGEuZGVmbjsKICAgICAgICBsb2FkID0gZGF0YS5sb2FkOwogICAgICAgIHBmeCA9IHRzc2lkICsgJ1snICsgbmFtZSArICddOiAnOwoKICAgICAgICAkbG9nLmRlYnVnKCJMb2FkaW5nIHNwcml0ZXMuLi5bIiArIG5hbWUgKyAiXSIsIGRlc2MpOwoKICAgICAgICBmdW5jdGlvbiBubyh3aGF0KSB7CiAgICAgICAgICAgIHdhcm4ucHVzaChwZnggKyAnTm8gJyArIHdoYXQgKyAnIHByb3BlcnR5IGRlZmluZWQnKTsKICAgICAgICB9CgogICAgICAgIGlmICghcGF0aHMpIG5vKCdwYXRocycpOwogICAgICAgIGlmICghZGVmbikgbm8oJ2RlZm4nKTsKICAgICAgICBpZiAoIWxvYWQpIG5vKCdsb2FkJyk7CgogICAgICAgIGlmICh3YXJuLmxlbmd0aCkgewogICAgICAgICAgICAkbG9nLmVycm9yKHdhcm4uam9pbignXG4nKSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIGFueSBjdXN0b20gcGF0aHMgbmVlZCB0byBiZSBhZGRlZCB0byB0aGUgZ2x5cGggREIsIGFuZCBpbXBvcnRlZAogICAgICAgIHJlZ2lzdGVyUGF0aHNBc0dseXBocyhwYXRocyk7CgogICAgICAgIHBhdGhzLmZvckVhY2goZnVuY3Rpb24gKHApIHsKICAgICAgICAgICAgcGF0aG1ldGFbcC50YWddID0gewogICAgICAgICAgICAgICAgczogcC5zdHJva2UsCiAgICAgICAgICAgICAgICB1OiBwLmdseXBoIHx8ICdzcHJfJyArIHAudGFnCiAgICAgICAgICAgIH07CiAgICAgICAgfSk7CgogICAgICAgIGRlZm4uZm9yRWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgICAgICBkZWZzW2QuaWRdID0gZDsKICAgICAgICB9KTsKCiAgICAgICAgLy8gc3ByaXRlcywgbGFiZWxzIGFuZCBhbHBoYSBhcmUgZWFjaCBvcHRpb25hbCBjb21wb25lbnRzIG9mIHRoZSBsb2FkCiAgICAgICAgc3ByaXRlcyA9IGxvYWQuc3ByaXRlczsKICAgICAgICBsYWJlbHMgPSBsb2FkLmxhYmVsczsKICAgICAgICBhbHBoYSA9IGxvYWQuYWxwaGE7CgogICAgICAgIGlmIChhbHBoYSkgewogICAgICAgICAgICBzcHJpdGVMYXllci5zdHlsZSgnb3BhY2l0eScsIGFscGhhKTsKICAgICAgICB9CgogICAgICAgIGlmIChzcHJpdGVzKSB7CiAgICAgICAgICAgIHNwcml0ZXMuZm9yRWFjaChmdW5jdGlvbiAoc3ByKSB7CiAgICAgICAgICAgICAgICB2YXIgZGVmID0gZGVmc1tzcHIuaWRdOwogICAgICAgICAgICAgICAgZG9TcHJpdGUoc3ByLCBkZWYsIHBhdGhtZXRhKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICBpZiAobGFiZWxzKSB7CiAgICAgICAgICAgIGxhYmVscy5mb3JFYWNoKGRvTGFiZWwpOwogICAgICAgIH0KICAgIH0KCgogICAgZnVuY3Rpb24gbG9hZFNwcml0ZXMobGF5ZXIsIGRlZnNFbGVtLCBkZWZuYW1lKSB7CiAgICAgICAgdmFyIG5hbWUgPSBkZWZuYW1lIHx8ICdzcHJpdGVzJzsKICAgICAgICBzcHJpdGVMYXllciA9IGxheWVyOwogICAgICAgIGRlZnNFbGVtZW50ID0gZGVmc0VsZW07CgogICAgICAgICRsb2cuaW5mbyh0c3NpZCArICdSZXF1ZXN0aW5nIHNwcml0ZSBkZWZpbml0aW9uIFsnK25hbWUrJ10uLi4nKTsKCiAgICAgICAgd3NzLnNlbmRFdmVudCgnc3ByaXRlTGlzdFJlcXVlc3QnKTsKICAgICAgICB3c3Muc2VuZEV2ZW50KCdzcHJpdGVEYXRhUmVxdWVzdCcsIHtuYW1lOiBuYW1lfSk7CiAgICB9CgogICAgLy8gPT09IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyA9PT0gTU9EVUxFIERFRklOSVRJT04gPT09CgogICAgYW5ndWxhci5tb2R1bGUoJ292VG9wbycpCiAgICAuZmFjdG9yeSgnVG9wb1Nwcml0ZVNlcnZpY2UnLAogICAgICAgIFsnJGxvZycsICckaHR0cCcsICdGblNlcnZpY2UnLCAnR2x5cGhTZXJ2aWNlJywKICAgICAgICAgICAgJ1N2Z1V0aWxTZXJ2aWNlJywgJ1dlYlNvY2tldFNlcnZpY2Un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IHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBNZXRlciBWaWV3IE1vZHVsZQogKi8KKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBpbmplY3RlZCByZWZlcmVuY2VzCiAgICB2YXIgJGxvZywgJHNjb3BlLCAkbG9jYXRpb24sIGZzLCB0YnMsIG5zOwoKICAgIGFuZ3VsYXIubW9kdWxlKCdvdk1ldGVyJywgW10pCiAgICAuY29udHJvbGxlcignT3ZNZXRlckN0cmwnLAogICAgICAgIFsnJGxvZycsICckc2NvcGUnLCAnJGxvY2F0aW9uJywgJyRzY2UnLAogICAgICAgICAgICAnRm5TZXJ2aWNlJywgJ1RhYmxlQnVpbGRlclNlcnZpY2UnLCAnTmF2U2VydmljZScsCgogICAgICAgIGZ1bmN0aW9uIChfJGxvZ18sIF8kc2NvcGVfLCBfJGxvY2F0aW9uXywgJHNjZSwgX2ZzXywgX3Ric18sIF9uc18pIHsKICAgICAgICAgICAgdmFyIHBhcmFtczsKICAgICAgICAgICAgJGxvZyA9IF8kbG9nXzsKICAgICAgICAgICAgJHNjb3BlID0gXyRzY29wZV87CiAgICAgICAgICAgICRsb2NhdGlvbiA9IF8kbG9jYXRpb25fOwogICAgICAgICAgICBmcyA9IF9mc187CiAgICAgICAgICAgIHRicyA9IF90YnNfOwogICAgICAgICAgICBucyA9IF9uc187CiAgICAgICAgICAgICRzY29wZS5kZXZpY2VUaXAgPSAnU2hvdyBkZXZpY2UgdGFibGUnOwogICAgICAgICAgICAkc2NvcGUuZmxvd1RpcCA9ICdTaG93IGZsb3cgdmlldyBmb3IgdGhpcyBkZXZpY2UnOwogICAgICAgICAgICAkc2NvcGUucG9ydFRpcCA9ICdTaG93IHBvcnQgdmlldyBmb3IgdGhpcyBkZXZpY2UnOwogICAgICAgICAgICAkc2NvcGUuZ3JvdXBUaXAgPSAnU2hvdyBncm91cCB2aWV3IGZvciB0aGlzIGRldmljZSc7CgogICAgICAgICAgICBwYXJhbXMgPSAkbG9jYXRpb24uc2VhcmNoKCk7CiAgICAgICAgICAgIGlmIChwYXJhbXMuaGFzT3duUHJvcGVydHkoJ2RldklkJykpIHsKICAgICAgICAgICAgICAgICRzY29wZS5kZXZJZCA9IHBhcmFtc1snZGV2SWQnXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGJzLmJ1aWxkVGFibGUoewogICAgICAgICAgICAgICAgc2NvcGU6ICRzY29wZSwKICAgICAgICAgICAgICAgIHRhZzogJ21ldGVyJywKICAgICAgICAgICAgICAgIHF1ZXJ5OiBwYXJhbXMKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAkc2NvcGUuJHdhdGNoKCd0YWJsZURhdGEnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBpZiAoIWZzLmlzRW1wdHlPYmplY3QoJHNjb3BlLnRhYmxlRGF0YSkpIHsKICAgICAgICAgICAgICAgICAgICAkc2NvcGUudGFibGVEYXRhLmZvckVhY2goZnVuY3Rpb24gKG1ldGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGVyLmJhbmRzID0gJHNjZS50cnVzdEFzSHRtbChtZXRlci5iYW5kcyk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgJHNjb3BlLm5hdiA9IGZ1bmN0aW9uIChwYXRoKSB7CiAgICAgICAgICAgICAgICBpZiAoJHNjb3BlLmRldklkKSB7CiAgICAgICAgICAgICAgICAgICAgbnMubmF2VG8ocGF0aCwgeyBkZXZJZDogJHNjb3BlLmRldklkIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgJGxvZy5sb2coJ092TWV0ZXJDdHJsIGhhcyBiZWVuIGNyZWF0ZWQnKTsKICAgICAgICB9XSk7Cn0oKSk7jvHvVotYAwBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANMRLQABABuaRwKgHNsCoB2CWzx/1o2r8zQ6/dk+AECFm26oAAAEBCAoAt+LVAGIpy47x71aBXgMAiQIAAIkCAAAIACetHhNo9ygf0sUIAEUAAnvETEAAQAbkScCoBzbAqAdgls8f9aNq/M0Ov3ZPgBghZj67AAABAQgKALfi1QBiKctHRVQgL29ub3MvdWkvYXBwL3ZpZXcvYXBwL2FwcC5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0KjvHvVl5jAwCuOAAArjgAAGj3KB/SxQgAJ60eEwgARQA4oH95QABABvL3wKgHYMCoBzYf9ZbPDr92T6Nq/xSAGAQkyHkAAAEBCAoAYinMALfi1UhUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2phdmFzY3JpcHQNCkNvbnRlbnQtTGVuZ3RoOiAxNDMzOA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNS0yMDE2IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAnTGljZW5zZScpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gJ0FTIElTJyBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIEFwcCBWaWV3IE1vZHVsZQogKi8KCihmdW5jdGlvbiAoKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8gaW5qZWN0ZWQgcmVmcwogICAgdmFyICRsb2csICRzY29wZSwgd3NzLCBmcywga3MsIHBzLCBpczsKCiAgICAvLyBpbnRlcm5hbCBzdGF0ZQogICAgdmFyICBkZXRhaWxzUGFuZWwsCiAgICAgICAgIHBTdGFydFksCiAgICAgICAgIHBIZWlnaHQsCiAgICAgICAgIHRvcCwKICAgICAgICAgbWlkZGxlLAogICAgICAgICBib3R0b20sCiAgICAgICAgIHdTaXplID0gZmFsc2U7CgogICAgLy8gY29uc3RhbnRzCiAgICB2YXIgSU5TVEFMTEVEID0gJ0lOU1RBTExFRCcsCiAgICAgICAgQUNUSVZFID0gJ0FDVElWRScsCiAgICAgICAgYXBwTWdtdFJlcSA9ICdhcHBNYW5hZ2VtZW50UmVxdWVzdCcsCiAgICAgICAgdG9wUGRnID0gNTAsCiAgICAgICAgcGFuZWxXaWR0aCA9IDUwMCwKICAgICAgICBwTmFtZSA9ICdhcHBsaWNhdGlvbi1kZXRhaWxzLXBhbmVsJywKICAgICAgICBkZXRhaWxzUmVxID0gJ2FwcERldGFpbHNSZXF1ZXN0JywKICAgICAgICBkZXRhaWxzUmVzcCA9ICdhcHBEZXRhaWxzUmVzcG9uc2UnLAogICAgICAgIGZpbGVVcGxvYWRVcmwgPSAnYXBwbGljYXRpb25zL3VwbG9hZCcsCiAgICAgICAgaWNvblVybFByZWZpeCA9ICdycy9hcHBsaWNhdGlvbnMvJywKICAgICAgICBpY29uVXJsU3VmZml4ID0gJy9pY29uJywKICAgICAgICBkaWFsb2dJZCA9ICdhcHAtZGlhbG9nJywKICAgICAgICBkaWFsb2dPcHRzID0gewogICAgICAgICAgICBlZGdlOiAncmlnaHQnCiAgICAgICAgfSwKICAgICAgICBzdHJvbmdXYXJuaW5nID0gewogICAgICAgICAgICAnb3JnLm9ub3Nwcm9qZWN0LmRyaXZlcnMnOiB0cnVlCiAgICAgICAgfSwKICAgICAgICBkaXNjb3VyYWdlbWVudCA9ICdEZWFjdGl2YXRpbmcgb3IgdW5pbnN0YWxsaW5nIHRoaXMgY29tcG9uZW50IGNhbicgKwogICAgICAgICcgaGF2ZSBzZXJpb3VzIG5lZ2F0aXZlIGNvbnNlcXVlbmNlcyEgRG8gc28gYXQgeW91ciBvd24gcmlzayEhJywKICAgICAgICBwcm9wT3JkZXIgPSBbJ2lkJywgJ3N0YXRlJywgJ2NhdGVnb3J5JywgJ3ZlcnNpb24nLCAnb3JpZ2luJywgJ3JvbGUnXSwKICAgICAgICBmcmllbmRseVByb3BzID0gWydBcHAgSUQnLCAnU3RhdGUnLCAnQ2F0ZWdvcnknLCAnVmVyc2lvbicsICdPcmlnaW4nLCAnUm9sZSddOwogICAgICAgIC8vIG5vdGU6IHVybCBpcyBoYW5kbGVkIHNlcGFyYXRlbHkKCiAgICBmdW5jdGlvbiBjcmVhdGVEZXRhaWxzUGFuZSgpIHsKICAgICAgICBkZXRhaWxzUGFuZWwgPSBwcy5jcmVhdGVQYW5lbChwTmFtZSwgewogICAgICAgICAgICB3aWR0aDogd1NpemUud2lkdGgsCiAgICAgICAgICAgIG1hcmdpbjogMCwKICAgICAgICAgICAgaGlkZU1hcmdpbjogMAogICAgICAgIH0pOwogICAgICAgIGRldGFpbHNQYW5lbC5lbCgpLnN0eWxlKHsKICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsCiAgICAgICAgICAgIHRvcDogcFN0YXJ0WSArICdweCcKICAgICAgICB9KTsKICAgICAgICAkc2NvcGUuaGlkZVBhbmVsID0gZnVuY3Rpb24gKCkgeyBkZXRhaWxzUGFuZWwuaGlkZSgpOyB9OwogICAgICAgIGRldGFpbHNQYW5lbC5oaWRlKCk7CiAgICB9CgogICAgZnVuY3Rpb24gY2xvc2VQYW5lbCgpIHsKICAgICAgICBpZiAoZGV0YWlsc1BhbmVsLmlzVmlzaWJsZSgpKSB7CiAgICAgICAgICAgICRzY29wZS5zZWxJZCA9IG51bGw7CiAgICAgICAgICAgIGRldGFpbHNQYW5lbC5oaWRlKCk7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgZnVuY3Rpb24gYWRkQ2xvc2VCdG4oZGl2KSB7CiAgICAgICAgaXMubG9hZEVtYmVkZGVkSWNvbihkaXYsICdwbHVzJywgMzApOwogICAgICAgIGRpdi5zZWxlY3QoJ2cnKS5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDI1LCAwKSByb3RhdGUoNDUpJyk7CiAgICAgICAgZGl2Lm9uKCdjbGljaycsIGNsb3NlUGFuZWwpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNldFVwUGFuZWwoKSB7CiAgICAgICAgdmFyIGNvbnRhaW5lciwgY2xvc2VCdG4sIGRpdjsKCiAgICAgICAgZGV0YWlsc1BhbmVsLmVtcHR5KCk7CiAgICAgICAgZGV0YWlsc1BhbmVsLndpZHRoKHBhbmVsV2lkdGgpOwoKICAgICAgICBjb250YWluZXIgPSBkZXRhaWxzUGFuZWwuYXBwZW5kKCdkaXYnKS5jbGFzc2VkKCdjb250YWluZXInLCB0cnVlKTsKCiAgICAgICAgdG9wID0gY29udGFpbmVyLmFwcGVuZCgnZGl2JykuY2xhc3NlZCgndG9wJywgdHJ1ZSk7CiAgICAgICAgY2xvc2VCdG4gPSB0b3AuYXBwZW5kKCdkaXYnKS5jbGFzc2VkKCdjbG9zZS1idG4nLCB0cnVlKTsKICAgICAgICBhZGRDbG9zZUJ0bihjbG9zZUJ0bik7CgogICAgICAgIGRpdiA9IHRvcC5hcHBlbmQoJ2RpdicpLmNsYXNzZWQoJ3RvcC1jb250ZW50JywgdHJ1ZSk7CgogICAgICAgIGZ1bmN0aW9uIG5kaXYoY2xzLCB0Y2xzKSB7CiAgICAgICAgICAgIHZhciAgZCA9IGRpdi5hcHBlbmQoJ2RpdicpLmNsYXNzZWQoY2xzLCB0cnVlKTsKICAgICAgICAgICAgaWYgKHRjbHMpIHsKICAgICAgICAgICAgICAgIGQuYXBwZW5kKCd0YWJsZScpLmNsYXNzZWQodGNscywgdHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG5kaXYoJ2xlZnQgYXBwLWljb24nKTsKICAgICAgICBuZGl2KCdyaWdodCcsICdhcHAtcHJvcHMnKTsKICAgICAgICBuZGl2KCdhcHAtdXJsJyk7CgogICAgICAgIGNvbnRhaW5lci5hcHBlbmQoJ2hyJyk7CgogICAgICAgIG1pZGRsZSA9IGNvbnRhaW5lci5hcHBlbmQoJ2RpdicpLmNsYXNzZWQoJ21pZGRsZScsIHRydWUpOwogICAgICAgIG1pZGRsZS5hcHBlbmQoJ2RpdicpLmNsYXNzZWQoJ2FwcC1yZWFkbWUnLCB0cnVlKTsKCiAgICAgICAgY29udGFpbmVyLmFwcGVuZCgnaHInKTsKCiAgICAgICAgLy8gVE9ETzogbWFrZSBib3R0b20gY29udGFpbmVyIHNjcm9sbGFibGUKICAgICAgICBib3R0b20gPSBjb250YWluZXIuYXBwZW5kKCdkaXYnKS5jbGFzc2VkKCdib3R0b20nLCB0cnVlKTsKCiAgICAgICAgZnVuY3Rpb24gblRhYmxlKGhkciwgY2xzKSB7CiAgICAgICAgICAgIGJvdHRvbS5hcHBlbmQoJ2gyJykuaHRtbChoZHIpOwogICAgICAgICAgICBib3R0b20uYXBwZW5kKCdkaXYnKS5jbGFzc2VkKGNscywgdHJ1ZSkuYXBwZW5kKCd0YWJsZScpOwogICAgICAgIH0KCiAgICAgICAgblRhYmxlKCdGZWF0dXJlcycsICdmZWF0dXJlcycpOwogICAgICAgIG5UYWJsZSgnUmVxdWlyZWQgQXBwcycsICdyZXF1aXJlZC1hcHBzJyk7CiAgICAgICAgblRhYmxlKCdQZXJtaXNzaW9ucycsICdwZXJtaXNzaW9ucycpOwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZFByb3AodGJvZHksIGluZGV4LCB2YWx1ZSkgewogICAgICAgIHZhciB0ciA9IHRib2R5LmFwcGVuZCgndHInKSwKICAgICAgICAgICAgdmNscyA9IGluZGV4ID8gJ3ZhbHVlJyA6ICd2YWx1ZS1ib2xkJzsKCiAgICAgICAgZnVuY3Rpb24gYWRkQ2VsbChjbHMsIHR4dCkgewogICAgICAgICAgICB0ci5hcHBlbmQoJ3RkJykuYXR0cignY2xhc3MnLCBjbHMpLmh0bWwodHh0KTsKICAgICAgICB9CgogICAgICAgIGFkZENlbGwoJ2xhYmVsJywgZnJpZW5kbHlQcm9wc1tpbmRleF0gKyAnOicpOwogICAgICAgIGFkZENlbGwodmNscywgdmFsdWUpOwogICAgfQoKICAgIGZ1bmN0aW9uIHVybGl6ZSh1KSB7CiAgICAgICAgcmV0dXJuICc8aT5VUkw6PC9pPiA8YSBocmVmPSInICsgdSArICciIHRhcmdldD0iX2JsYW5rIj4nICsgdSArICc8L2E+JzsKICAgIH0KCiAgICBmdW5jdGlvbiBhZGRJY29uKGVsZW0sIHZhbHVlKSB7CiAgICAgICAgZWxlbS5hcHBlbmQoJ2ltZycpLmF0dHIoJ3NyYycsIGljb25VcmxQcmVmaXggKyB2YWx1ZSArIGljb25VcmxTdWZmaXgpOwogICAgfQoKICAgIGZ1bmN0aW9uIHBvcHVsYXRlVG9wKGRldGFpbHMpIHsKICAgICAgICB2YXIgcHJvcHNCb2R5ID0gdG9wLnNlbGVjdCgnLmFwcC1wcm9wcycpLmFwcGVuZCgndGJvZHknKSwKICAgICAgICAgICAgdXJsID0gZGV0YWlscy51cmw7CgogICAgICAgIGFkZEljb24odG9wLnNlbGVjdCgnLmFwcC1pY29uJyksIGRldGFpbHMuaWQpOwoKICAgICAgICBwcm9wT3JkZXIuZm9yRWFjaChmdW5jdGlvbiAocHJvcCwgaSkgewogICAgICAgICAgICBhZGRQcm9wKHByb3BzQm9keSwgaSwgZGV0YWlsc1twcm9wXSk7CiAgICAgICAgfSk7CgogICAgICAgIGlmICh1cmwpIHsKICAgICAgICAgICAgdG9wLnNlbGVjdCgnLmFwcC11cmwnKS5odG1sKHVybGl6ZSh1cmwpKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gcG9wdWxhdGVNaWRkbGUoZGV0YWlscykgewogICAgICAgIG1pZGRsZS5zZWxlY3QoJy5hcHAtcmVhZG1lJykudGV4dChkZXRhaWxzLnJlYWRtZSk7CiAgICB9CgogICAgZnVuY3Rpb24gcG9wdWxhdGVCb3R0b20oZGV0YWlscykgewoKICAgICAgICBmdW5jdGlvbiBhZGRJdGVtcyhjbHMsIGl0ZW1zKSB7CiAgICAgICAgICAgIHZhciB0YWJsZSA9IGJvdHRvbS5zZWxlY3QoJy4nICsgY2xzKS5zZWxlY3QoJ3RhYmxlJyksCiAgICAgICAgICAgICAgICB0Ym9keSA9IHRhYmxlLmFwcGVuZCgndGJvZHknKTsKCiAgICAgICAgICAgIGl0ZW1zLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgICAgIHRib2R5LmFwcGVuZCgndHInKS5hcHBlbmQoJ3RkJykuaHRtbChpdGVtKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICBhZGRJdGVtcygnZmVhdHVyZXMnLCBkZXRhaWxzLmZlYXR1cmVzKTsKICAgICAgICBhZGRJdGVtcygncmVxdWlyZWQtYXBwcycsIGRldGFpbHMucmVxdWlyZWRfYXBwcyk7CiAgICAgICAgYWRkSXRlbXMoJ3Blcm1pc3Npb25zJywgZGV0YWlscy5wZXJtaXNzaW9ucyk7CiAgICB9CgogICAgZnVuY3Rpb24gcG9wdWxhdGVEZXRhaWxzKGRldGFpbHMpIHsKICAgICAgICBzZXRVcFBhbmVsKCk7CiAgICAgICAgcG9wdWxhdGVUb3AoZGV0YWlscyk7CiAgICAgICAgcG9wdWxhdGVNaWRkbGUoZGV0YWlscyk7CiAgICAgICAgcG9wdWxhdGVCb3R0b20oZGV0YWlscyk7CiAgICAgICAgZGV0YWlsc1BhbmVsLmhlaWdodChwSGVpZ2h0KTsKICAgIH0KCiAgICBmdW5jdGlvbiByZXNwRGV0YWlsc0NiKGRhdGEpIHsKICAgICAgICAkc2NvcGUucGFuZWxEYXRhID0gZGF0YS5kZXRhaWxzOwogICAgICAgICRzY29wZS4kYXBwbHkoKTsKICAgIH0KCiAgICBhbmd1bGFyLm1vZHVsZSgnb3ZBcHAnLCBbXSkKICAgIC5jb250cm9sbGVyKCdPdkFwcEN0cmwnLAogICAgICAgIFsnJGxvZycsICckc2NvcGUnLCAnJGh0dHAnLAogICAgICAgICAnV2ViU29ja2V0U2VydmljZScsICdGblNlcnZpY2UnLCAnS2V5U2VydmljZScsICdQYW5lbFNlcnZpY2UnLAogICAgICAgICAnSWNvblNlcnZpY2UnLCAnVXJsRm5TZXJ2aWNlJywgJ0RpYWxvZ1NlcnZpY2UnLCAnVGFibGVCdWlsZGVyU2VydmljZScsCgogICAgZnVuY3Rpb24gKF8kbG9nXywgXyRzY29wZV8sICRodHRwLCBfd3NzXywgX2ZzXywgX2tzXywgX3BzXywgX2lzXywgdWZzLCBkcywgdGJzKSB7CiAgICAgICAgJGxvZyA9IF8kbG9nXzsKICAgICAgICAkc2NvcGUgPSBfJHNjb3BlXzsKICAgICAgICB3c3MgPSBfd3NzXzsKICAgICAgICBmcyA9IF9mc187CiAgICAgICAga3MgPSBfa3NfOwogICAgICAgIHBzID0gX3BzXzsKICAgICAgICBpcyA9IF9pc187CiAgICAgICAgJHNjb3BlLnBhbmVsRGF0YSA9IHt9OwogICAgICAgICRzY29wZS5jdHJsQnRuU3RhdGUgPSB7fTsKICAgICAgICAkc2NvcGUudXBsb2FkVGlwID0gJ1VwbG9hZCBhbiBhcHBsaWNhdGlvbiAoLm9hciBmaWxlKSc7CiAgICAgICAgJHNjb3BlLmFjdGl2YXRlVGlwID0gJ0FjdGl2YXRlIHNlbGVjdGVkIGFwcGxpY2F0aW9uJzsKICAgICAgICAkc2NvcGUuZGVhY3RpdmF0ZVRpcCA9ICdEZWFjdGl2YXRlIHNlbGVjdGVkIGFwcGxpY2F0aW9uJzsKICAgICAgICAkc2NvcGUudW5pbnN0YWxsVGlwID0gJ1VuaW5zdGFsbCBzZWxlY3RlZCBhcHBsaWNhdGlvbic7CgogICAgICAgIHZhciBoYW5kbGVycyA9IHt9OwoKICAgICAgICAvLyBkZXRhaWxzIHBhbmVsIGhhbmRsZXJzCiAgICAgICAgaGFuZGxlcnNbZGV0YWlsc1Jlc3BdID0gcmVzcERldGFpbHNDYjsKICAgICAgICB3c3MuYmluZEhhbmRsZXJzKGhhbmRsZXJzKTsKCiAgICAgICAgZnVuY3Rpb24gc2VsQ2IoJGV2ZW50LCByb3cpIHsKICAgICAgICAgICAgLy8gJHNjb3BlLnNlbElkIGlzIHNldCBieSBjb2RlIGluIHRhYmxlQnVpbGRlcgogICAgICAgICAgICAkc2NvcGUuY3RybEJ0blN0YXRlLnNlbGVjdGlvbiA9ICEhJHNjb3BlLnNlbElkOwogICAgICAgICAgICByZWZyZXNoQ3RybHMoKTsKICAgICAgICAgICAgZHMuY2xvc2VEaWFsb2coKTsgIC8vIGRvbid0IHdhbnQgZGlhbG9nIGZyb20gcHJldmlvdXMgc2VsZWN0aW9uCgogICAgICAgICAgICBpZiAoJHNjb3BlLnNlbElkKSB7CiAgICAgICAgICAgICAgICB3c3Muc2VuZEV2ZW50KGRldGFpbHNSZXEsIHsgaWQ6IHJvdy5pZCB9KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRzY29wZS5oaWRlUGFuZWwoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcmVmcmVzaEN0cmxzKCkgewogICAgICAgICAgICB2YXIgcm93LCByb3dJZHg7CiAgICAgICAgICAgIGlmICgkc2NvcGUuY3RybEJ0blN0YXRlLnNlbGVjdGlvbikgewogICAgICAgICAgICAgICAgcm93SWR4ID0gZnMuZmluZCgkc2NvcGUuc2VsSWQsICRzY29wZS50YWJsZURhdGEpOwogICAgICAgICAgICAgICAgcm93ID0gcm93SWR4ID49IDAgPyAkc2NvcGUudGFibGVEYXRhW3Jvd0lkeF0gOiBudWxsOwoKICAgICAgICAgICAgICAgICRzY29wZS5jdHJsQnRuU3RhdGUuaW5zdGFsbGVkID0gcm93ICYmIHJvdy5zdGF0ZSA9PT0gSU5TVEFMTEVEOwogICAgICAgICAgICAgICAgJHNjb3BlLmN0cmxCdG5TdGF0ZS5hY3RpdmUgPSByb3cgJiYgcm93LnN0YXRlID09PSBBQ1RJVkU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkc2NvcGUuY3RybEJ0blN0YXRlLmluc3RhbGxlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgJHNjb3BlLmN0cmxCdG5TdGF0ZS5hY3RpdmUgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdGJzLmJ1aWxkVGFibGUoewogICAgICAgICAgICBzY29wZTogJHNjb3BlLAogICAgICAgICAgICB0YWc6ICdhcHAnLAogICAgICAgICAgICBzZWxDYjogc2VsQ2IsCiAgICAgICAgICAgIHJlc3BDYjogcmVmcmVzaEN0cmxzLAogICAgICAgICAgICAvLyBwcmUtcG9wdWxhdGUgc29ydCBzbyBhY3RpdmUgYXBwcyBhcmUgYXQgdGhlIHRvcCBvZiB0aGUgbGlzdAogICAgICAgICAgICBzb3J0UGFyYW1zOiB7CiAgICAgICAgICAgICAgICBmaXJzdENvbDogJ3N0YXRlJywKICAgICAgICAgICAgICAgIGZpcnN0RGlyOiAnZGVzYycsCiAgICAgICAgICAgICAgICBzZWNvbmRDb2w6ICdpZCcsCiAgICAgICAgICAgICAgICBzZWNvbmREaXI6ICdhc2MnCiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgLy8gVE9ETzogcmVleGFtaW5lIHdoZXJlIGtleWJpbmRpbmdzIHNob3VsZCBiZSAtIGRpcmVjdGl2ZSBvciBjb250cm9sbGVyPwogICAgICAgIGtzLmtleUJpbmRpbmdzKHsKICAgICAgICAgICAgZXNjOiBbJHNjb3BlLnNlbGVjdENhbGxiYWNrLCAnRGVzZWxlY3QgYXBwbGljYXRpb24nXSwKICAgICAgICAgICAgX2hlbHBGb3JtYXQ6IFsnZXNjJ10KICAgICAgICB9KTsKICAgICAgICBrcy5nZXN0dXJlTm90ZXMoWwogICAgICAgICAgICBbJ2NsaWNrIHJvdycsICdTZWxlY3QgLyBkZXNlbGVjdCBhcHBsaWNhdGlvbiddLAogICAgICAgICAgICBbJ3Njcm9sbCBkb3duJywgJ1NlZSBtb3JlIGFwcGxpY2F0aW9ucyddCiAgICAgICAgXSk7CgogICAgICAgIGZ1bmN0aW9uIGNyZWF0ZUNvbmZpcm1hdGlvblRleHQoYWN0aW9uLCBpdGVtSWQpIHsKICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSBkcy5jcmVhdGVEaXYoKTsKICAgICAgICAgICAgY29udGVudC5hcHBlbmQoJ3AnKS50ZXh0KGZzLmNhcChhY3Rpb24pICsgJyAnICsgaXRlbUlkKTsKICAgICAgICAgICAgaWYgKHN0cm9uZ1dhcm5pbmdbaXRlbUlkXSkgewogICAgICAgICAgICAgICAgY29udGVudC5hcHBlbmQoJ3AnKS50ZXh0KGRpc2NvdXJhZ2VtZW50KS5jbGFzc2VkKCdzdHJvbmcnLCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gY29udGVudDsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGNvbmZpcm1BY3Rpb24oYWN0aW9uKSB7CiAgICAgICAgICAgIHZhciBpdGVtSWQgPSAkc2NvcGUuc2VsSWQsCiAgICAgICAgICAgICAgICBzcGFyID0gJHNjb3BlLnNvcnRQYXJhbXM7CgogICAgICAgICAgICBmdW5jdGlvbiBkT2soKSB7CiAgICAgICAgICAgICAgICAkbG9nLmRlYnVnKCdJbml0aWF0aW5nJywgYWN0aW9uLCAnb2YnLCBpdGVtSWQpOwogICAgICAgICAgICAgICAgd3NzLnNlbmRFdmVudChhcHBNZ210UmVxLCB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgbmFtZTogaXRlbUlkLAogICAgICAgICAgICAgICAgICAgIHNvcnRDb2w6IHNwYXIuc29ydENvbCwKICAgICAgICAgICAgICAgICAgICBzb3J0RGlyOiBzcGFyLnNvcnREaXIKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiBkQ2FuY2VsKCkgewogICAgICAgICAgICAgICAgJGxvZy5kZWJ1ZygnQ2FuY2VsaW5nJywgYWN0aW9uLCAnb2YnLCBpdGVtSWQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBkcy5vcGVuRGlhbG9nKGRpYWxvZ0lkLCBkaWFsb2dPcHRzKQogICAgICAgICAgICAgICAgLnNldFRpdGxlKCdDb25maXJtIEFjdGlvbicpCiAgICAgICAgICAgICAgICAuYWRkQ29udGVudChjcmVhdGVDb25maXJtYXRpb25UZXh0KGFjdGlvbiwgaXRlbUlkKSkKICAgICAgICAgICAgICAgIC5hZGRPayhkT2spCiAgICAgICAgICAgICAgICAuYWRkQ2FuY2VsKGRDYW5jZWwpCiAgICAgICAgICAgICAgICAuYmluZEtleXMoKTsKICAgICAgICB9CgogICAgICAgICRzY29wZS5hcHBBY3Rpb24gPSBmdW5jdGlvbiAoYWN0aW9uKSB7CiAgICAgICAgICAgIGlmICgkc2NvcGUuY3RybEJ0blN0YXRlLnNlbGVjdGlvbikgewogICAgICAgICAgICAgICAgY29uZmlybUFjdGlvbihhY3Rpb24pOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgJHNjb3BlLiRvbignRmlsZUNoYW5nZWQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOwogICAgICAgICAgICBpZiAoJHNjb3BlLmFwcEZpbGUpIHsKICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsICRzY29wZS5hcHBGaWxlKTsKICAgICAgICAgICAgICAgICRodHRwLnBvc3QodWZzLnJzVXJsKGZpbGVVcGxvYWRVcmwpLCBmb3JtRGF0YSwgewogICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybVJlcXVlc3Q6IGFuZ3VsYXIuaWRlbnRpdHksCiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogewogICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogdW5kZWZpbmVkCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAuZmluYWxseShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5zb3J0Q2FsbGJhY2soJHNjb3BlLnNvcnRQYXJhbXMpOwogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXRGaWxlRm9ybScpLnJlc2V0KCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgJHNjb3BlLiRvbignJGRlc3Ryb3knLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGtzLnVuYmluZEtleXMoKTsKICAgICAgICAgICAgd3NzLnVuYmluZEhhbmRsZXJzKGhhbmRsZXJzKTsKICAgICAgICB9KTsKCiAgICAgICAgJGxvZy5sb2coJ092QXBwQ3RybCBoYXMgYmVlbiBjcmVhdGVkJyk7CiAgICB9XSkKCiAgICAvLyB0cmlnZ2VycyB0aGUgaW5wdXQgZm9ybSB0byBhcHBlYXIgd2hlbiBidXR0b24gaXMgY2xpY2tlZAogICAgLmRpcmVjdGl2ZSgndHJpZ2dlckZvcm0nLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmVzdHJpY3Q6ICdBJywKICAgICAgICAgICAgbGluazogZnVuY3Rpb24gKHNjb3BlLCBlbGVtKSB7CiAgICAgICAgICAgICAgICBlbGVtLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGxvYWRGaWxlJykKICAgICAgICAgICAgICAgICAgICAgICAgLmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoJ2NsaWNrJykpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfSkKCiAgICAvLyBiaW5kcyB0aGUgbW9kZWwgZmlsZSB0byB0aGUgc2NvcGUgaW4gc2NvcGUuYXBwRmlsZQogICAgLy8gc2VuZHMgdXBsb2FkIHJlcXVlc3QgdG8gdGhlIHNlcnZlcgogICAgLmRpcmVjdGl2ZSgnZmlsZU1vZGVsJywgWyckcGFyc2UnLAogICAgICAgICAgICBmdW5jdGlvbiAoJHBhcnNlKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmVzdHJpY3Q6ICdBJywKICAgICAgICAgICAgbGluazogZnVuY3Rpb24gKHNjb3BlLCBlbGVtLCBhdHRycykgewogICAgICAgICAgICAgICAgdmFyIG1vZGVsID0gJHBhcnNlKGF0dHJzLmZpbGVNb2RlbCksCiAgICAgICAgICAgICAgICAgICAgbW9kZWxTZXR0ZXIgPSBtb2RlbC5hc3NpZ247CgogICAgICAgICAgICAgICAgZWxlbS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgc2NvcGUuJGFwcGx5KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxTZXR0ZXIoc2NvcGUsIGVsZW1bMF0uZmlsZXNbMF0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIHNjb3BlLiRlbWl0KCdGaWxlQ2hhbmdlZCcpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfV0pCgogICAgLmRpcmVjdGl2ZSgnYXBwbGljYXRpb25EZXRhaWxzUGFuZWwnLAogICAgICAgIFsnJHJvb3RTY29wZScsICckd2luZG93JywgJyR0aW1lb3V0JywgJ0tleVNlcnZpY2UnLAogICAgICAgIGZ1bmN0aW9uICgkcm9vdFNjb3BlLCAkd2luZG93LCAkdGltZW91dCwga3MpIHsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzY29wZSkgewogICAgICAgICAgICAgICAgdmFyIHVuYmluZFdhdGNoOwoKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGhlaWdodENhbGMoKSB7CiAgICAgICAgICAgICAgICAgICAgcFN0YXJ0WSA9IGZzLm5vUHhTdHlsZShkMy5zZWxlY3QoJy50YWJ1bGFyLWhlYWRlcicpLCAnaGVpZ2h0JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdG9wUGRnOwogICAgICAgICAgICAgICAgICAgIHdTaXplID0gZnMud2luZG93U2l6ZShwU3RhcnRZKTsKICAgICAgICAgICAgICAgICAgICBwSGVpZ2h0ID0gd1NpemUuaGVpZ2h0OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGluaXRQYW5lbCgpIHsKICAgICAgICAgICAgICAgICAgICBoZWlnaHRDYWxjKCk7CiAgICAgICAgICAgICAgICAgICAgY3JlYXRlRGV0YWlsc1BhbmUoKTsKICAgICAgICAgICAgICAgICAgICAkbG9nLmRlYnVnKCdzdGFydCB0byBpbml0aWFsaXplIHBhbmVsIScpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIFNhZmFyaSBoYXMgYSBidWcgd2hlcmUgaXQgcmVuZGVycyB0aGUgZml4ZWQtbGF5b3V0IHRhYmxlIHdyb25nCiAgICAgICAgICAgICAgICAvLyBpZiB5b3UgYXNrIGZvciB0aGUgd2luZG93J3Mgc2l6ZSB0b28gZWFybHkKICAgICAgICAgICAgICAgIGlmIChzY29wZS5vbm9zLmJyb3dzZXIgPT09ICdzYWZhcmknKSB7CiAgICAgICAgICAgICAgICAgICAgJHRpbWVvdXQoaW5pdFBhbmVsKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaW5pdFBhbmVsKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBjcmVhdGUga2V5IGJpbmRpbmdzIHRvIGhhbmRsZSBwYW5lbAogICAgICAgICAgICAgICAga3Mua2V5QmluZGluZ3MoewogICAgICAgICAgICAgICAgICAgIGVzYzogW2Nsb3NlUGFuZWwsICdDbG9zZSB0aGUgZGV0YWlscyBwYW5lbCddLAogICAgICAgICAgICAgICAgICAgIF9oZWxwRm9ybWF0OiBbJ2VzYyddCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGtzLmdlc3R1cmVOb3RlcyhbCiAgICAgICAgICAgICAgICAgICAgWydjbGljaycsICdTZWxlY3QgYSByb3cgdG8gc2hvdyBhcHBsaWNhdGlvbiBkZXRhaWxzJ10sCiAgICAgICAgICAgICAgICAgICAgWydzY3JvbGwgZG93bicsICdTZWUgbW9yZSBhcHBsaWNhdGlvbiddCiAgICAgICAgICAgICAgICBdKTsKCiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcGFuZWxEYXRhIGNoYW5nZXMKICAgICAgICAgICAgICAgIHNjb3BlLiR3YXRjaCgncGFuZWxEYXRhJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGlmICghZnMuaXNFbXB0eU9iamVjdChzY29wZS5wYW5lbERhdGEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcHVsYXRlRGV0YWlscyhzY29wZS5wYW5lbERhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzUGFuZWwuc2hvdygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB3aW5kb3cgc2l6ZSBjaGFuZ2VzCiAgICAgICAgICAgICAgICB1bmJpbmRXYXRjaCA9ICRyb290U2NvcGUuJHdhdGNoQ29sbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoOiAkd2luZG93LmlubmVySGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdzogJHdpbmRvdy5pbm5lcldpZHRoCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZzLmlzRW1wdHlPYmplY3Qoc2NvcGUucGFuZWxEYXRhKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0Q2FsYygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wdWxhdGVEZXRhaWxzKHNjb3BlLnBhbmVsRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIHNjb3BlLiRvbignJGRlc3Ryb3knLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdW5iaW5kV2F0Y2goKTsKICAgICAgICAgICAgICAgICAgICBrcy51bmJpbmRLZXlzKCk7CiAgICAgICAgICAgICAgICAgICAgcHMuZGVzdHJveVBhbmVsKHBOYW1lKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIH1dKTsKfSgpKTsKjvHvVqZjAwBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANMRNQABABuaPwKgHNsCoB2CWzx/1o2r/FA6/rruAECFmoPYAAAEBCAoAt+LVAGIpzI7x71brbwMAQgAAAEIAAABo9ygf0sUIACetHhMIAEUAADTM/0AAQAbd3cCoB2DAqAc2H/WW0VqXODWMl/btgBADy5ANAAABAQgKAGIpzQC34syO8e9WVHADAEIAAABCAAAAaPcoH9LFCAAnrR4TCABFAAA0KSFAAEAGgbzAqAdgwKgHNh/1ltJTUmu4NIelgIAQA8uQDQAAAQEICgBiKc0At+LNjvHvVqhwAwCTAgAAkwIAAAgAJ60eE2j3KB/SxQgARQAChcROQABABuQ9wKgHNsCoB2CWzx/1o2r/FA6/rruAGCFmA5gAAAEBCAoAt+LWAGIpzEdFVCAvb25vcy91aS9hcHAvdmlldy9zZXR0aW5ncy9zZXR0aW5ncy5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0KjvHvVkpxAwCgBAAAoAQAAGj3KB/SxQgAJ60eEwgARQAEkomVQABABhzqwKgHYMCoBzYf9ZbQazuFiPk+TISAGAMdlGsAAAEBCAoAYinNALfi0EhUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2phdmFzY3JpcHQNCkNvbnRlbnQtTGVuZ3RoOiAxMDEzDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCi8qCiAqIENvcHlyaWdodCAyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIEhvc3QgVmlldyBNb2R1bGUKICovCgooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIGFuZ3VsYXIubW9kdWxlKCdvdkhvc3QnLCBbXSkKICAgIC5jb250cm9sbGVyKCdPdkhvc3RDdHJsJywKICAgICAgICBbJyRsb2cnLCAnJHNjb3BlJywgJ1RhYmxlQnVpbGRlclNlcnZpY2UnLAoKICAgICAgICBmdW5jdGlvbiAoJGxvZywgJHNjb3BlLCB0YnMpIHsKICAgICAgICAgICAgdGJzLmJ1aWxkVGFibGUoewogICAgICAgICAgICAgICAgc2NvcGU6ICRzY29wZSwKICAgICAgICAgICAgICAgIHRhZzogJ2hvc3QnCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgJGxvZy5sb2coJ092SG9zdEN0cmwgaGFzIGJlZW4gY3JlYXRlZCcpOwogICAgICAgIH1dKTsKfSgpKTsKjvHvVkZ0AwCmCQAApgkAAGj3KB/SxQgAJ60eEwgARQAJmCkiQABABnhXwKgHYMCoBzYf9ZbSU1JruDSHpYCAGAPLmXEAAAEBCAoAYinNALfizUhUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2phdmFzY3JpcHQNCkNvbnRlbnQtTGVuZ3RoOiAyMjk5DQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCi8qCiAqIENvcHlyaWdodCAyMDE1LDIwMTYgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gR3JvdXAgVmlldyBNb2R1bGUKICovCgooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIGluamVjdGVkIHJlZmVyZW5jZXMKICAgIHZhciAkbG9nLCAkc2NvcGUsICRsb2NhdGlvbiwgZnMsIHRicywgbnM7CgogICAgYW5ndWxhci5tb2R1bGUoJ292R3JvdXAnLCBbXSkKICAgIC5jb250cm9sbGVyKCdPdkdyb3VwQ3RybCcsCiAgICAgICAgWyckbG9nJywgJyRzY29wZScsICckbG9jYXRpb24nLCAnJHNjZScsCiAgICAgICAgICAgICdGblNlcnZpY2UnLCAnVGFibGVCdWlsZGVyU2VydmljZScsICdOYXZTZXJ2aWNlJywKCiAgICAgICAgZnVuY3Rpb24gKF8kbG9nXywgXyRzY29wZV8sIF8kbG9jYXRpb25fLCAkc2NlLCBfZnNfLCBfdGJzXywgX25zXykgewogICAgICAgICAgICB2YXIgcGFyYW1zOwogICAgICAgICAgICAkbG9nID0gXyRsb2dfOwogICAgICAgICAgICAkc2NvcGUgPSBfJHNjb3BlXzsKICAgICAgICAgICAgJGxvY2F0aW9uID0gXyRsb2NhdGlvbl87CiAgICAgICAgICAgIGZzID0gX2ZzXzsKICAgICAgICAgICAgdGJzID0gX3Ric187CiAgICAgICAgICAgIG5zID0gX25zXzsKICAgICAgICAgICAgJHNjb3BlLmRldmljZVRpcCA9ICdTaG93IGRldmljZSB0YWJsZSc7CiAgICAgICAgICAgICRzY29wZS5mbG93VGlwID0gJ1Nob3cgZmxvdyB2aWV3IGZvciB0aGlzIGRldmljZSc7CiAgICAgICAgICAgICRzY29wZS5wb3J0VGlwID0gJ1Nob3cgcG9ydCB2aWV3IGZvciB0aGlzIGRldmljZSc7CiAgICAgICAgICAgICRzY29wZS5tZXRlclRpcCA9ICdTaG93IG1ldGVyIHZpZXcgZm9yIHNlbGVjdGVkIGRldmljZSc7CgogICAgICAgICAgICBwYXJhbXMgPSAkbG9jYXRpb24uc2VhcmNoKCk7CiAgICAgICAgICAgIGlmIChwYXJhbXMuaGFzT3duUHJvcGVydHkoJ2RldklkJykpIHsKICAgICAgICAgICAgICAgICRzY29wZS5kZXZJZCA9IHBhcmFtc1snZGV2SWQnXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGJzLmJ1aWxkVGFibGUoewogICAgICAgICAgICAgICAgc2NvcGU6ICRzY29wZSwKICAgICAgICAgICAgICAgIHRhZzogJ2dyb3VwJywKICAgICAgICAgICAgICAgIHF1ZXJ5OiBwYXJhbXMKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAkc2NvcGUuJHdhdGNoKCd0YWJsZURhdGEnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBpZiAoIWZzLmlzRW1wdHlPYmplY3QoJHNjb3BlLnRhYmxlRGF0YSkpIHsKICAgICAgICAgICAgICAgICAgICAkc2NvcGUudGFibGVEYXRhLmZvckVhY2goZnVuY3Rpb24gKGdyb3VwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwLmJ1Y2tldHMgPSAkc2NlLnRydXN0QXNIdG1sKGdyb3VwLmJ1Y2tldHMpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICRzY29wZS5uYXYgPSBmdW5jdGlvbiAocGF0aCkgewogICAgICAgICAgICAgICAg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CkNvbnRlbnQtVHlwZTogdGV4dC9qYXZhc2NyaXB0DQpDb250ZW50LUxlbmd0aDogMTk3NA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNSwyMDE2IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIEZsb3cgVmlldyBNb2R1bGUKICovCgooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIGluamVjdGVkIHJlZmVyZW5jZXMKICAgIHZhciAkbG9nLCAkc2NvcGUsICRsb2NhdGlvbiwgZnMsIHRicywgbnM7CgogICAgYW5ndWxhci5tb2R1bGUoJ292RmxvdycsIFtdKQogICAgLmNvbnRyb2xsZXIoJ092Rmxvd0N0cmwnLAogICAgICAgIFsnJGxvZycsICckc2NvcGUnLCAnJGxvY2F0aW9uJywKICAgICAgICAgICAgJ0ZuU2VydmljZScsICdUYWJsZUJ1aWxkZXJTZXJ2aWNlJywgJ05hdlNlcnZpY2UnLAoKICAgICAgICBmdW5jdGlvbiAoXyRsb2dfLCBfJHNjb3BlXywgXyRsb2NhdGlvbl8sIF9mc18sIF90YnNfLCBfbnNfKSB7CiAgICAgICAgICAgIHZhciBwYXJhbXM7CiAgICAgICAgICAgICRsb2cgPSBfJGxvZ187CiAgICAgICAgICAgICRzY29wZSA9IF8kc2NvcGVfOwogICAgICAgICAgICAkbG9jYXRpb24gPSBfJGxvY2F0aW9uXzsKICAgICAgICAgICAgZnMgPSBfZnNfOwogICAgICAgICAgICB0YnMgPSBfdGJzXzsKICAgICAgICAgICAgbnMgPSBfbnNfOwogICAgICAgICAgICAkc2NvcGUuZGV2aWNlVGlwID0gJ1Nob3cgZGV2aWNlIHRhYmxlJzsKICAgICAgICAgICAgJHNjb3BlLnBvcnRUaXAgPSAnU2hvdyBwb3J0IHZpZXcgZm9yIHRoaXMgZGV2aWNlJzsKICAgICAgICAgICAgJHNjb3BlLmdyb3VwVGlwID0gJ1Nob3cgZ3JvdXAgdmlldyBmb3IgdGhpcyBkZXZpY2UnOwogICAgICAgICAgICAkc2NvcGUubWV0ZXJUaXAgPSAnU2hvdyBtZXRlciB2aWV3IGZvciBzZWxlY3RlZCBkZXZpY2UnOwoKICAgICAgICAgICAgcGFyYW1zID0gJGxvY2F0aW9uLnNlYXJjaCgpOwogICAgICAgICAgICBpZiAocGFyYW1zLmhhc093blByb3BlcnR5KCdkZXZJZCcpKSB7CiAgICAgICAgICAgICAgICAkc2NvcGUuZGV2SWQgPSBwYXJhbXNbJ2RldklkJ107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRicy5idWlsZFRhYmxlKHsKICAgICAgICAgICAgICAgIHNjb3BlOiAkc2NvcGUsCiAgICAgICAgICAgICAgICB0YWc6ICdmbG93JywKICAgICAgICAgICAgICAgIHF1ZXJ5OiBwYXJhbXMKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAkc2NvcGUubmF2ID0gZnVuY3Rpb24gKHBhdGgpIHsKICAgICAgICAgICAgICAgIGlmICgkc2NvcGUuZGV2SWQpIHsKICAgICAgICAgICAgICAgICAgICBucy5uYXZUbyhwYXRoLCB7IGRldklkOiAkc2NvcGUuZGV2SWQgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAkbG9nLmxvZygnT3ZGbG93Q3RybCBoYXMgYmVlbiBjcmVhdGVkJyk7CiAgICAgICAgfV0pOwp9KCkpOwqO8e9W2XkDAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA03cpAAEAGzRLAqAc2wKgHYJbRH/WMl/btWpdAVIAQBaT+PAAAAQEICgC34tcAYinNjvHvVp57AwD0BQAA9AUAAGj3KB/SxQgAJ60eEwgARQAF5oGcQABABiOPwKgHYMCoBzYf9ZbUoa/vd0DeG4OAGAOKlb8AAAEBCAoAYinNALfi0EhUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2phdmFzY3JpcHQNCkNvbnRlbnQtTGVuZ3RoOiAxMzUzDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCi8qCiAqIENvcHlyaWdodCAyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIEhvc3QgVmlldyBNb2R1bGUKICovCgooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIGFuZ3VsYXIubW9kdWxlKCdvdkxpbmsnLCBbXSkKICAgIC5jb250cm9sbGVyKCdPdkxpbmtDdHJsJywKICAgICAgICBbJyRsb2cnLCAnJHNjb3BlJywgJyRzY2UnLCAnRm5TZXJ2aWNlJywgJ1RhYmxlQnVpbGRlclNlcnZpY2UnLAoKICAgICAgICBmdW5jdGlvbiAoJGxvZywgJHNjb3BlLCAkc2NlLCBmcywgdGJzKSB7CiAgICAgICAgICAgIHRicy5idWlsZFRhYmxlKHsKICAgICAgICAgICAgICAgIHNjb3BlOiAkc2NvcGUsCiAgICAgICAgICAgICAgICB0YWc6ICdsaW5rJwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICRzY29wZS4kd2F0Y2goJ3RhYmxlRGF0YScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICghZnMuaXNFbXB0eU9iamVjdCgkc2NvcGUudGFibGVEYXRhKSkgewogICAgICAgICAgICAgICAgICAgICRzY29wZS50YWJsZURhdGEuZm9yRWFjaChmdW5jdGlvbiAobGluaykgewogICAgICAgICAgICAgICAgICAgICAgICBsaW5rLmRpcmVjdGlvbiA9ICRzY2UudHJ1c3RBc0h0bWwobGluay5kaXJlY3Rpb24pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICRsb2cubG9nKCdPdkxpbmtDdHJsIGhhcyBiZWVuIGNyZWF0ZWQnKTsKICAgICAgICB9XSk7Cn0oKSk7Co7x71YBfAMAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADTifEAAQAbIYMCoBzbAqAdgltQf9UDeG4Ohr/UpgBAHoCd0AAABAQgKALfi1wBiKc2O8e9WkXwDAI8CAACPAgAACAAnrR4TaPcoH9LFCABFAAKB3ctAAEAGysTAqAc2wKgHYJbRH/WMl/btWpdAVIAYBaQ8vwAAAQEICgC34tcAYinNR0VUIC9vbm9zL3VpL2FwcC92aWV3L3R1bm5lbC90dW5uZWwuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6ICovKg0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71aZfAMAQgAAAEIAAABo9ygf0sUIACetHhMIAEUAADTNAkAAQAbd2sCoB2DAqAc2H/WW0VqXQFSMl/k6gBAD1pANAAABAQgKAGIpzQC34teO8e9WzYEDAAQGAAAEBgAAaPcoH9LFCAAnrR4TCABFAAX2zQNAAEAG2BfAqAdgwKgHNh/1ltFal0BUjJf5OoAYA9aVzwAAAQEICgBiKc4At+LXSFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvamF2YXNjcmlwdA0KQ29udGVudC1MZW5ndGg6IDEzNjkNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gSG9zdCBWaWV3IE1vZHVsZQogKi8KCihmdW5jdGlvbiAoKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgYW5ndWxhci5tb2R1bGUoJ292VHVubmVsJywgW10pCiAgICAuY29udHJvbGxlcignT3ZUdW5uZWxDdHJsJywKICAgICAgICBbJyRsb2cnLCAnJHNjb3BlJywgJyRzY2UnLCAnRm5TZXJ2aWNlJywgJ1RhYmxlQnVpbGRlclNlcnZpY2UnLAoKICAgICAgICBmdW5jdGlvbiAoJGxvZywgJHNjb3BlLCAkc2NlLCBmcywgdGJzKSB7CiAgICAgICAgICAgIHRicy5idWlsZFRhYmxlKHsKICAgICAgICAgICAgICAgIHNjb3BlOiAkc2NvcGUsCiAgICAgICAgICAgICAgICB0YWc6ICd0dW5uZWwnCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgJHNjb3BlLiR3YXRjaCgndGFibGVEYXRhJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKCFmcy5pc0VtcHR5T2JqZWN0KCRzY29wZS50YWJsZURhdGEpKSB7CiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnRhYmxlRGF0YS5mb3JFYWNoKGZ1bmN0aW9uICh0dW5uZWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy90dW5uZWwuZGlyZWN0aW9uID0gJHNjZS50cnVzdEFzSHRtbCh0dW5uZWwuZGlyZWN0aW9uKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAkbG9nLmxvZygnT3ZUdW5uZWxDdHJsIGhhcyBiZWVuIGNyZWF0ZWQnKTsKICAgICAgICB9XSk7Cn0oKSk7Co7x71bqggMAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADTdzEAAQAbNEMCoBzbAqAdgltEf9YyX+Tpal0YWgBAFpPYsAAABAQgKALfi1wBiKc6O8e9WyooDADIHAAAyBwAAaPcoH9LFCAAnrR4TCABFAAckKSVAAEAGesjAqAdgwKgHNh/1ltJTUnUcNIen04AYA9WW/QAAAQEICgBiKc4At+LXSFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvamF2YXNjcmlwdA0KQ29udGVudC1MZW5ndGg6IDE2NzENClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gUGFja2V0IFByb2Nlc3NvciBWaWV3IE1vZHVsZQogKi8KCihmdW5jdGlvbiAoKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8gaW5qZWN0ZWQgcmVmZXJlbmNlcwogICAgdmFyICRsb2csICRzY29wZSwgJGxvY2F0aW9uLCBmcywgdGJzLCBuczsKCiAgICBhbmd1bGFyLm1vZHVsZSgnb3ZQcm9jZXNzb3InLCBbXSkKICAgIC5jb250cm9sbGVyKCdPdlByb2Nlc3NvckN0cmwnLAogICAgICAgIFsnJGxvZycsICckc2NvcGUnLCAnJGxvY2F0aW9uJywKICAgICAgICAgICAgJ0ZuU2VydmljZScsICdUYWJsZUJ1aWxkZXJTZXJ2aWNlJywgJ05hdlNlcnZpY2UnLAoKICAgICAgICBmdW5jdGlvbiAoXyRsb2dfLCBfJHNjb3BlXywgXyRsb2NhdGlvbl8sIF9mc18sIF90YnNfLCBfbnNfKSB7CiAgICAgICAgICAgIHZhciBwYXJhbXM7CiAgICAgICAgICAgICRsb2cgPSBfJGxvZ187CiAgICAgICAgICAgICRzY29wZSA9IF8kc2NvcGVfOwogICAgICAgICAgICAkbG9jYXRpb24gPSBfJGxvY2F0aW9uXzsKICAgICAgICAgICAgZnMgPSBfZnNfOwogICAgICAgICAgICB0YnMgPSBfdGJzXzsKICAgICAgICAgICAgbnMgPSBfbnNfOwogICAgICAgICAgICAkc2NvcGUucmVxdWVzdFRpcCA9ICdTaG93IHBhY2tldCByZXF1ZXN0cyc7CgogICAgICAgICAgICBwYXJhbXMgPSAkbG9jYXRpb24uc2VhcmNoKCk7CgogICAgICAgICAgICB0YnMuYnVpbGRUYWJsZSh7CiAgICAgICAgICAgICAgICBzY29wZTogJHNjb3BlLAogICAgICAgICAgICAgICAgdGFnOiAncHJvY2Vzc29yJywKICAgICAgICAgICAgICAgIHF1ZXJ5OiBwYXJhbXMKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAkc2NvcGUubmF2ID0gZnVuY3Rpb24gKHBhdGgpIHsKICAgICAgICAgICAgICAgIGlmICgkc2NvcGUuZGV2SWQpIHsKICAgICAgICAgICAgICAgICAgICBucy5uYXZUbyhwYXRoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICRsb2cubG9nKCdPdlByb2Nlc3NvckN0cmwgaGFzIGJlZW4gY3JlYXRlZCcpOwogICAgICAgIH1dKTsKfSgpKTsKjvHvVhaLAwBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANGveQABABj7/wKgHNsCoB2CW0h/1NIen01NSfAyAEA8zZ2IAAAEBCAoAt+LYAGIpzo7x71YpkQMAzwQAAM8EAABo9ygf0sUIACetHhMIAEUABMGJlkAAQAYcusCoB2DAqAc2H/WW0Gs7ieb5Pk7TgBgDJ5SaAAABAQgKAGIpzgC34tZIVFRQLzEuMSAyMDAgT0sNCkNvbnRlbnQtVHlwZTogdGV4dC9qYXZhc2NyaXB0DQpDb250ZW50LUxlbmd0aDogMTA2MA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBDbHVzdGVyIFZpZXcgTW9kdWxlCiAqLwoKKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICBhbmd1bGFyLm1vZHVsZSgnb3ZDbHVzdGVy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Ym9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gSW50ZW50IFZpZXcgTW9kdWxlCiAqLwoKKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICBhbmd1bGFyLm1vZHVsZSgnb3ZJbnRlbnQnLCBbXSkKICAgICAgICAuY29udHJvbGxlcignT3ZJbnRlbnRDdHJsJywKICAgICAgICBbJyRsb2cnLCAnJHNjb3BlJywgJ1RhYmxlQnVpbGRlclNlcnZpY2UnLCAnTmF2U2VydmljZScsCgogICAgICAgIGZ1bmN0aW9uICgkbG9nLCAkc2NvcGUsIHRicywgbnMpIHsKCiAgICAgICAgICAgIGZ1bmN0aW9uIHNlbENiKCRldmVudCwgcm93KSB7CiAgICAgICAgICAgICAgICAkbG9nLmRlYnVnKCdHb3QgYSBjbGljayBvbjonLCByb3cpOwogICAgICAgICAgICAgICAgdmFyIG0gPSAvKFxkKylcczpccyguKikvLmV4ZWMocm93LmFwcElkKSwKICAgICAgICAgICAgICAgICAgICBpZCA9IG0gPyBtWzFdIDogbnVsbCwKICAgICAgICAgICAgICAgICAgICBuYW1lID0gbSA/IG1bMl0gOiBudWxsOwoKICAgICAgICAgICAgICAgICRzY29wZS5pbnRlbnREYXRhID0gKCRzY29wZS5zZWxJZCAmJiBtKSA/IHsKICAgICAgICAgICAgICAgICAgICBpbnRlbnRBcHBJZDogaWQsCiAgICAgICAgICAgICAgICAgICAgaW50ZW50QXBwTmFtZTogbmFtZSwKICAgICAgICAgICAgICAgICAgICBpbnRlbnRLZXk6IHJvdy5rZXkKICAgICAgICAgICAgICAgIH0gOiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0YnMuYnVpbGRUYWJsZSh7CiAgICAgICAgICAgICAgICBzY29wZTogJHNjb3BlLAogICAgICAgICAgICAgICAgdGFnOiAnaW50ZW50JywKICAgICAgICAgICAgICAgIHNlbENiOiBzZWxDYiwKICAgICAgICAgICAgICAgIGlkS2V5OiAna2V5JwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICRzY29wZS50b3BvVGlwID0gJ1Nob3cgc2VsZWN0ZWQgaW50ZW50IG9uIHRvcG9sb2d5IHZpZXcnOwoKICAgICAgICAgICAgJHNjb3BlLnNob3dJbnRlbnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgZCA9ICRzY29wZS5pbnRlbnREYXRhOwogICAgICAgICAgICAgICAgZCAmJiBucy5uYXZUbygndG9wbycsIGQpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgJGxvZy5sb2coJ092SW50ZW50Q3RybCBoYXMgYmVlbiBjcmVhdGVkJyk7CiAgICAgICAgfV0pOwp9KCkpOwqO8e9W0J0DAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0ZLtAAEAGRiLAqAc2wKgHYJbTH/VhHJSgcoOnEIAQBaQNVwAAAQEICgC34tkAYinPjvHvVl8iBABCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANF/PQABABksOwKgHNsCoB2CW0B/1+T5O02s7jnOAEAWk2uEAAAEBCAoAt+LiAGIpzo7x71bdMwQAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADTET0AAQAbmjcCoBzbAqAdgls8f9aNrAWUOv7M2gBAhZpoZAAABAQgKALfi4wBiKc+O8e9WzWQEAOkCAADpAgAACAAnrR4TaPcoH9LFCABFAALbZLxAAEAGQ3rAqAc2wKgHYJbTH/VhHJSgcoOnEIAYBaQCGAAAAQEICgC34uYAYinPR0VUIC9vbm9zL3VpL2RhdGEvaW1nL2xvYWRpbmcvbGlnaHQvbG9hZC0wMS5wbmcgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogaW1hZ2Uvd2VicCxpbWFnZS8qLCovKjtxPTAuOA0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71bpZAQA6AIAAOgCAAAIACetHhNo9ygf0sUIAEUAAtrEUEAAQAbj5sCoBzbAqAdgls8f9aNrAWUOv7M2gBghZoBqAAABAQgKALfi5gBiKc9HRVQgL29ub3MvdWkvZGF0YS9pbWcvbG9hZGluZy9kYXJrL2xvYWQtMDEucG5nIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6IGltYWdlL3dlYnAsaW1hZ2UvKiwqLyo7cT0wLjgNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQqO8e9WSWUEAOkCAADpAgAACAAnrR4TaPcoH9LFCABFAALbX9BAAEAGSGbAqAc2wKgHYJbQH/X5Pk7TazuOc4AYBaTOqwAAAQEICgC34uYAYinOR0VUIC9vbm9zL3VpL2RhdGEvaW1nL2xvYWRpbmcvbGlnaHQvbG9hZC0wMi5wbmcgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogaW1hZ2Uvd2VicCxpbWFnZS8qLCovKjtxPTAuOA0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71ZSZQQA6AIAAOgCAAAIACetHhNo9ygf0sUIAEUAAtpr30AAQAY8WMCoBzbAqAdgltIf9TSHp9NTUnwMgBgPM02nAAABAQgKALfi5gBiKc5HRVQgL29ub3MvdWkvZGF0YS9pbWcvbG9hZGluZy9kYXJrL2xvYWQtMDIucG5nIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6IGltYWdlL3dlYnAsaW1hZ2UvKiwqLyo7cT0wLjgNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQqO8e9WlmUEAOkCAADpAgAACAAnrR4TaPcoH9LFCABFAALb3c1AAEAGymjAqAc2wKgHYJbRH/WMl/k6WpdGFoAYBaTo6wAAAQEICgC34uYAYinOR0VUIC9vbm9zL3VpL2RhdGEvaW1nL2xvYWRpbmcvbGlnaHQvbG9hZC0wMy5wbmcgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogaW1hZ2Uvd2VicCxpbWFnZS8qLCovKjtxPTAuOA0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71bpZQQA6AIAAOgCAAAIACetHhNo9ygf0sUIAEUAAtrifUAAQAbFucCoBzbAqAdgltQf9UDeG4Ohr/UpgBgHoA23AAABAQgKALfi5gBiKc1HRVQgL29ub3MvdWkvZGF0YS9pbWcvbG9hZGluZy9kYXJrL2xvYWQtMDMucG5nIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6IGltYWdlL3dlYnAsaW1hZ2UvKiwqLyo7cT0wLjgNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQqO8e9WG2oEAIAAAACAAAAAaPcoH9LFCAAnrR4TCABFAAByf4RAAEAGKxvAqAdgwKgHNh/1ls8Ov7M2o2sEC4AYBDiQSwAAAQEICgBiKdwAt+LmSFRUUC8xLjEgMzA0IE5vdCBNb2RpZmllZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQqO8e9WWGsEAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0xFFAAEAG5ovAqAc2wKgHYJbPH/WjawQLDr+zdIAQIWaXJQAAAQEICgC34uYAYincjvHvVnNuBACAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAciwWQABABn6JwKgHYMCoBzYf9ZbTcoOnEGEcl0eAGANlkEsAAAEBCAoAYindALfi5khUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KjvHvVjVxBACAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAcs0FQABABt2ZwKgHYMCoBzYf9ZbRWpdGFoyX++GAGAPhkEsAAAEBCAoAYindALfi5khUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KjvHvVgh0BACAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAciknQABABoF4wKgHYMCoBzYf9ZbSU1J8DDSHqnmAGAPgkEsAAAEBCAoAYindALfi5khUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KjvHvVjp/BADpAgAA6QIAAAgAJ60eE2j3KB/SxQgARQAC22S9QABABkN5wKgHNsCoB2CW0x/1YRyXR3KDp06AGAWk/CMAAAEBCAoAt+LnAGIp3UdFVCAvb25vcy91aS9kYXRhL2ltZy9sb2FkaW5nL2xpZ2h0L2xvYWQtMDQucG5nIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6IGltYWdlL3dlYnAsaW1hZ2UvKiwqLyo7cT0wLjgNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQqO8e9WmYMEAIAAAACAAAAAaPcoH9LFCAAnrR4TCABFAAByiZdAAEAGIQjAqAdgwKgHNh/1ltBrO45z+T5ReoAYAzKQSwAAAQEICgBiKd4At+LmSFRUUC8xLjEgMzA0IE5vdCBNb2RpZmllZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQqO8e9WKIQEAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0X9FAAEAGSwzAqAc2wKgHYJbQH/X5PlF6azuOsYAQBaTX5gAAAQEICgC34ugAYinejvHvVriFBADoAgAA6AIAAAgAJ60eE2j3KB/SxQgARQAC2mvgQABABjxXwKgHNsCoB2CW0h/1NIeqeVNSfEqAGA8zSrAAAAEBCAoAt+LoAGIp3UdFVCAvb25vcy91aS9kYXRhL2ltZy9sb2FkaW5nL2RhcmsvbG9hZC0wNC5wbmcgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogaW1hZ2Uvd2VicCxpbWFnZS8qLCovKjtxPTAuOA0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71ZMiQQA6QIAAOkCAAAIACetHhNo9ygf0sUIAEUAAttf0kAAQAZIZMCoBzbAqAdgltAf9fk+UXprO46xgBgFpMi0AAABAQgKALfi6ABiKd5HRVQgL29ub3MvdWkvZGF0YS9pbWcvbG9hZGluZy9saWdodC9sb2FkLTA1LnBuZyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiBpbWFnZS93ZWJwLGltYWdlLyosKi8qO3E9MC44DQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0KjvHvVkyJBADoAgAA6AIAAAgAJ60eE2j3KB/SxQgARQAC2t3OQABABspowKgHNsCoB2CW0R/1jJf74VqXRlSAGAWk2XcAAAEBCAoAt+LoAGIp3UdFVCAvb25vcy91aS9kYXRhL2ltZy9sb2FkaW5nL2RhcmsvbG9hZC0wNS5wbmcgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogaW1hZ2Uvd2VicCxpbWFnZS8qLCovKjtxPTAuOA0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71ZMiQQA6QIAAOkCAAAIACetHhNo9ygf0sUIAEUAAtvEUkAAQAbj48CoBzbAqAdgls8f9aNrBAsOv7N0gBghZobxAAABAQgKALfi6ABiKdxHRVQgL29ub3MvdWkvZGF0YS9pbWcvbG9hZGluZy9saWdodC9sb2FkLTA2LnBuZyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiBpbWFnZS93ZWJwLGltYWdlLyosKi8qO3E9MC44DQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0KjvHvVsqKBACAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAcoGeQABABikBwKgHYMCoBzYf9ZbUoa/1KUDeHimAGAOVkEsAAAEBCAoAYinfALfi5khUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KjvHvVpuVBADoAgAA6AIAAAgAJ60eE2j3KB/SxQgARQAC2uJ+QABABsW4wKgHNsCoB2CW1B/1QN4eKaGv9WeAGAegCrsAAAEBCAoAt+LpAGIp30dFVCAvb25vcy91aS9kYXRhL2ltZy9sb2FkaW5nL2RhcmsvbG9hZC0wNi5wbmcgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogaW1hZ2Uvd2VicCxpbWFnZS8qLCovKjtxPTAuOA0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71aLlgQAgAAAAIAAAABo9ygf0sUIACetHhMIAEUAAHLNBkAAQAbdmMCoB2DAqAc2H/WW0VqXRlSMl/6HgBgD65BLAAABAQgKAGIp3wC34uhIVFRQLzEuMSAzMDQgTm90IE1vZGlmaWVkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCo7x71aLmgQA6QIAAOkCAAAIACetHhNo9ygf0sUIAEUAAtvdz0AAQAbKZsCoBzbAqAdgltEf9YyX/odal0aSgBgFpN8OAAABAQgKALfi6QBiKd9HRVQgL29ub3MvdWkvZGF0YS9pbWcvbG9hZGluZy9saWdodC9sb2FkLTA3LnBuZyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiBpbWFnZS93ZWJwLGltYWdlLyosKi8qO3E9MC44DQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0KjvHvVjudBACAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAcs0HQABABt2XwKgHYMCoBzYf9ZbRWpdGkoyYAS6AGAP2kEsAAAEBCAoAYingALfi6UhUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KjvHvVvmlBADoAgAA6AIAAAgAJ60eE2j3KB/SxQgARQAC2t3QQABABspmwKgHNsCoB2CW0R/1jJgBLlqXRtCAGAWk06cAAAEBCAoAt+LqAGIp4EdFVCAvb25vcy91aS9kYXRhL2ltZy9sb2FkaW5nL2RhcmsvbG9hZC0wNy5wbmcgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogaW1hZ2Uvd2VicCxpbWFnZS8qLCovKjtxPTAuOA0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71a6qAQAgAAAAIAAAABo9ygf0sUIACetHhMIAEUAAHLNCEAAQAbdlsCoB2DAqAc2H/WW0VqXRtCMmAPUgBgEAJBLAAABAQgKAGIp4AC34upIVFRQLzEuMSAzMDQgTm90IE1vZGlmaWVkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCo7x71bprAQAgAAAAIAAAABo9ygf0sUIACetHhMIAEUAAHJ/hUAAQAYrGsCoB2DAqAc2H/WWzw6/s3SjawaygBgEQ5BLAAABAQgKAGIp4QC34uhIVFRQLzEuMSAzMDQgTm90IE1vZGlmaWVkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCo7x71aCrgQAgAAAAIAAAABo9ygf0sUIACetHhMIAEUAAHIsF0AAQAZ+iMCoB2DAqAc2H/WW03KDp05hHJnugBgDcJBLAAABAQgKAGIp4QC34udIVFRQLzEuMSAzMDQgTm90IE1vZGlmaWVkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCo7x71b4tAQA6QIAAOkCAAAIACetHhNo9ygf0sUIAEUAAtvEU0AAQAbj4sCoBzbAqAdgls8f9aNrBrIOv7OygBghZoIEAAABAQgKALfi6wBiKeFHRVQgL29ub3MvdWkvZGF0YS9pbWcvbG9hZGluZy9saWdodC9sb2FkLTA4LnBuZyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiBpbWFnZS93ZWJwLGltYWdlLyosKi8qO3E9MC44DQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0KjvHvVoO5BADoAgAA6AIAAAgAJ60eE2j3KB/SxQgARQAC2mS+QABABkN5wKgHNsCoB2CW0x/1YRyZ7nKDp4yAGAWk7bUAAAEBCAoAt+LrAGIp4UdFVCAvb25vcy91aS9kYXRhL2ltZy9sb2FkaW5nL2RhcmsvbG9hZC0wOC5wbmcgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogaW1hZ2Uvd2VicCxpbWFnZS8qLCovKjtxPTAuOA0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71bxugQA6QIAAOkCAAAIACetHhNo9ygf0sUIAEUAAtvd0UAAQAbKZMCoBzbAqAdgltEf9YyYA9Ral0cOgBgFpNdCAAABAQgKALfi6wBiKeBHRVQgL29ub3MvdWkvZGF0YS9pbWcvbG9hZGluZy9saWdodC9sb2FkLTA5LnBuZyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiBpbWFnZS93ZWJwLGltYWdlLyosKi8qO3E9MC44DQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0KjvHvVuG8BACAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAcikoQABABoF3wKgHYMCoBzYf9ZbSU1J8SjSHrR+AGAPqkEsAAAEBCAoAYiniALfi6EhUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KjvHvVofABACAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAcoGfQABABikAwKgHYMCoBzYf9ZbUoa/1Z0DeIM+AGAOfkEsAAAEBCAoAYiniALfi6UhUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KjvHvVkHDBACAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAcs0JQABABt2VwKgHYMCoBzYf9ZbRWpdHDoyYBnuAGAQLkEsAAAEBCAoAYiniALfi60hUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KjvHvVsHEBACAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAcomYQABABiEHwKgHYMCoBzYf9ZbQazuOsfk+VCGAGAM9kEsAAAEBCAoAYiniALfi6EhUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KjvHvVrLGBADoAgAA6AIAAAgAJ60eE2j3KB/SxQgARQAC2uJ/QABABsW3wKgHNsCoB2CW1B/1QN4gz6Gv9aWAGAegB84AAAEBCAoAt+LsAGIp4kdFVCAvb25vcy91aS9kYXRhL2ltZy9sb2FkaW5nL2RhcmsvbG9hZC0wOS5wbmcgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogaW1hZ2Uvd2VicCxpbWFnZS8qLCovKjtxPTAuOA0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71a/ywQAgAAAAIAAAABo9ygf0sUIACetHhMIAEUAAHKBoEAAQAYo/8CoB2DAqAc2H/WW1KGv9aVA3iN1gBgDqpBLAAABAQgKAGIp4wC34uxIVFRQLzEuMSAzMDQgTm90IE1vZGlmaWVkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCo7x71bozgQAgAAAAIAAAABo9ygf0sUIACetHhMIAEUAAHIsGEAAQAZ+h8CoB2DAqAc2H/WW03KDp4xhHJyUgBgDepBLAAABAQgKAGIp4wC34utIVFRQLzEuMSAzMDQgTm90IE1vZGlmaWVkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCo7x71aGzwQASgAAAEoAAAAIACetHhNo9ygf0sUIAEUAADyrDkAAQAb/xsCoBzbAqAdgltsf9ehOSeMAAAAAoAJyEHlhAAACBAW0BAIICgC34u0AAAAAAQMDB47x71aozwQASgAAAEoAAABo9ygf0sUIACetHhMIAEUAADwAAEAAQAaq1cCoB2DAqAc2H/WW275RvTvoTknkoBJxIJAVAAACBAW0BAIICgBiKeMAt+LtAQMDB47x71Yt0wQAgAAAAIAAAABo9ygf0sUIACetHhMIAEUAAHJ/hkAAQAYrGcCoB2DAqAc2H/WWzw6/s7KjawlZgBgETZBLAAABAQgKAGIp4wC34utIVFRQLzEuMSAzMDQgTm90IE1vZGlmaWVkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCo7x71Z20wQAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADSrD0AAQAb/zcCoBzbAqAdgltsf9ehOSeS+Ub08gBAA5XN1AAABAQgKALfi7QBiKeOO8e9WwdkEAOkCAADpAgAACAAnrR4TaPcoH9LFCABFAALbX9NAAEAGSGPAqAc2wKgHYJbQH/X5PlQhazuO74AYBaTKxQAAAQEICgC34u0AYiniR0VUIC9vbm9zL3VpL2RhdGEvaW1nL2xvYWRpbmcvbGlnaHQvbG9hZC0xMC5wbmcgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogaW1hZ2Uvd2VicCxpbWFnZS8qLCovKjtxPTAuOA0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71bV3wQAgAAAAIAAAABo9ygf0sUIACetHhMIAEUAAHKJmUAAQAYhBsCoB2DAqAc2H/WW0Gs7ju/5PlbIgBgDR5BLAAABAQgKAGIp5AC34u1IVFRQLzEuMSAzMDQgTm90IE1vZGlmaWVkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCo7x71bi4gQAKwMAACsDAAAIACetHhNo9ygf0sUIAEUAAx2rEEAAQAb848CoBzbAqAdgltsf9ehOSeS+Ub08gBgA5S2HAAABAQgKALfi7gBiKeNHRVQgL29ub3MvdWkvd2Vic29jay9jb3JlIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjogVXBncmFkZQ0KUHJhZ21hOiBuby1jYWNoZQ0KQ2FjaGUtQ29udHJvbDogbm8tY2FjaGUNClVwZ3JhZGU6IHdlYnNvY2tldA0KT3JpZ2luOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODENClNlYy1XZWJTb2NrZXQtVmVyc2lvbjogMTMNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KU2VjLVdlYlNvY2tldC1LZXk6IHFDSmo2MmNEU2EwM0lBb2wwbDNCZ2c9PQ0KU2VjLVdlYlNvY2tldC1FeHRlbnNpb25zOiBwZXJtZXNzYWdlLWRlZmxhdGU7IGNsaWVudF9tYXhfd2luZG93X2JpdHMNCg0KjvHvVv3iBABCAAAAQgAAAGj3KB/SxQgAJ60eEwgARQAANJTfQABABhX+wKgHYMCoBzYf9ZbbvlG9POhOTM2AEADukA0AAAEBCAoAYinkALfi7o7x71a55QQA6AIAAOgCAAAIACetHhNo9ygf0sUIAEUAAtrEVEAAQAbj4sCoBzbAqAdgls8f9aNrCVkOv7PwgBghZnahAAABAQgKALfi7gBiKeNHRVQgL29ub3MvdWkvZGF0YS9pbWcvbG9hZGluZy9kYXJrL2xvYWQtMTAucG5nIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6IGltYWdlL3dlYnAsaW1hZ2UvKiwqLyo7cT0wLjgNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQqO8e9WzucEAOkCAADpAgAACAAnrR4TaPcoH9LFCABFAALbZL9AAEAGQ3fAqAc2wKgHYJbTH/VhHJyUcoOnyoAYBaT5TAAAAQEICgC34u4AYinjR0VUIC9vbm9zL3VpL2RhdGEvaW1nL2xvYWRpbmcvbGlnaHQvbG9hZC0xMS5wbmcgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogaW1hZ2Uvd2VicCxpbWFnZS8qLCovKjtxPTAuOA0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71al7AQA6AIAAOgCAAAIACetHhNo9ygf0sUIAEUAAtpf1EAAQAZIY8CoBzbAqAdgltAf9fk+VshrO48tgBgFpLdjAAABAQgKALfi7wBiKeRHRVQgL29ub3MvdWkvZGF0YS9pbWcvbG9hZGluZy9kYXJrL2xvYWQtMTEucG5nIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6IGltYWdlL3dlYnAsaW1hZ2UvKiwqLyo7cT0wLjgNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQqO8e9WB+8EAOkCAADpAgAACAAnrR4TaPcoH9LFCABFAALb4oBAAEAGxbXAqAc2wKgHYJbUH/VA3iN1oa/144AYB6ASZwAAAQEICgC34u8AYinjR0VUIC9vbm9zL3VpL2RhdGEvaW1nL2xvYWRpbmcvbGlnaHQvbG9hZC0xMi5wbmcgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogaW1hZ2Uvd2VicCxpbWFnZS8qLCovKjtxPTAuOA0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71ZN8wQA6AIAAOgCAAAIACetHhNo9ygf0sUIAEUAAtrd0kAAQAbKZMCoBzbAqAdgltEf9YyYBntal0dMgBgFpMzcAAABAQgKALfi7wBiKeJHRVQgL29ub3MvdWkvZGF0YS9pbWcvbG9hZGluZy9kYXJrL2xvYWQtMTIucG5nIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6IGltYWdlL3dlYnAsaW1hZ2UvKiwqLyo7cT0wLjgNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQqO8e9WCvQEAOkCAADpAgAACAAnrR4TaPcoH9LFCABFAALba+FAAEAGPFXAqAc2wKgHYJbSH/U0h60fU1J8iIAYDzNUPAAAAQEICgC34u8AYiniR0VUIC9vbm9zL3VpL2RhdGEvaW1nL2xvYWRpbmcvbGlnaHQvbG9hZC0xMy5wbmcgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogaW1hZ2Uvd2VicCxpbWFnZS8qLCovKjtxPTAuOA0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71Z5+AQAgAAAAIAAAABo9ygf0sUIACetHhMIAEUAAHJ/h0AAQAYrGMCoB2DAqAc2H/WWzw6/s/Cjawv/gBgEWJBLAAABAQgKAGIp5gC34u5IVFRQLzEuMSAzMDQgTm90IE1vZGlmaWVkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCo7x71bJ+wQAgAAAAIAAAABo9ygf0sUIACetHhMIAEUAAHIpKUAAQAaBdsCoB2DAqAc2H/WW0lNSfIg0h6/GgBgD9ZBLAAABAQgKAGIp5gC34u9IVFRQLzEuMSAzMDQgTm90IE1vZGlmaWVkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCo7x71a8/wQAgAAAAIAAAABo9ygf0sUIACetHhMIAEUAAHKJmkAAQAYhBcCoB2DAqAc2H/WW0Gs7jy35PllugBgDUpBLAAABAQgKAGIp5gC34u9IVFRQLzEuMSAzMDQgTm90IE1vZGlmaWVkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCo7x71YJAwUAgAAAAIAAAABo9ygf0sUIACetHhMIAEUAAHKBoUAAQAYo/sCoB2DAqAc2H/WW1KGv9eNA3iYcgBgDtJBLAAABAQgKAGIp5gC34u9IVFRQLzEuMSAzMDQgTm90IE1vZGlmaWVkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCo7x71aJBgUA6AIAAOgCAAAIACetHhNo9ygf0sUIAEUAAtpr4kAAQAY8VcCoBzbAqAdgltIf9TSHr8ZTUnzGgBgPM0PXAAABAQgKALfi8ABiKeZHRVQgL29ub3MvdWkvZGF0YS9pbWcvbG9hZGluZy9kYXJrL2xvYWQtMTMucG5nIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6IGltYWdlL3dlYnAsaW1hZ2UvKiwqLyo7cT0wLjgNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQqO8e9WjgwFAIAAAACAAAAAaPcoH9LFCAAnrR4TCABFAAByzQpAAEAG3ZTAqAdgwKgHNh/1ltFal0dMjJgJIYAYBBaQSwAAAQEICgBiKecAt+LvSFRUUC8xLjEgMzA0IE5vdCBNb2RpZmllZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQqO8e9WdA4FAOkCAADpAgAACAAnrR4TaPcoH9LFCABFAALb4oFAAEAGxbTAqAc2wKgHYJbUH/VA3iYcoa/2IYAYB6ANfQAAAQEICgC34vEAYinmR0VUIC9vbm9zL3VpL2RhdGEvaW1nL2xvYWRpbmcvbGlnaHQvbG9hZC0xNC5wbmcgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogaW1hZ2Uvd2VicCxpbWFnZS8qLCovKjtxPTAuOA0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71Z7EQUAgAAAAIAAAABo9ygf0sUIACetHhMIAEUAAHIsGUAAQAZ+hsCoB2DAqAc2H/WW03KDp8phHJ87gBgDhZBLAAABAQgKAGIp5wC34u5IVFRQLzEuMSAzMDQgTm90IE1vZGlmaWVkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCo7x71YFFAUAwwAAAMMAAABo9ygf0sUIACetHhMIAEUAALWU4EAAQAYVfMCoB2DAqAc2H/WW275RvTzoTkzNgBgA7pCOAAABAQgKAGIp5wC34u5IVFRQLzEuMSAxMDEgU3dpdGNoaW5nIFByb3RvY29scw0KVXBncmFkZTogV2ViU29ja2V0DQpDb25uZWN0aW9uOiBVcGdyYWRlDQpTZWMtV2ViU29ja2V0LUFjY2VwdDogWldaK2RiU1c3dnhabVYxeGFpc3ZqUm1NY2Y4PQ0KDQqO8e9WRxQFAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0qxFAAEAG/8vAqAc2wKgHYJbbH/XoTkzNvlG9vYAQAO1v+wAAAQEICgC34vEAYinnjvHvVkcUBQDoAgAA6AIAAAgAJ60eE2j3KB/SxQgARQAC2l/VQABABkhiwKgHNsCoB2CW0B/1+T5Zbms7j2uAGAWktHgAAAEBCAoAt+LxAGIp5kdFVCAvb25vcy91aS9kYXRhL2ltZy9sb2FkaW5nL2RhcmsvbG9hZC0xNC5wbmcgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogaW1hZ2Uvd2VicCxpbWFnZS8qLCovKjtxPTAuOA0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71ZXHgUAxwIAAMcCAAAIACetHhNo9ygf0sUIAEUAArnd00AAQAbKhMCoBzbAqAdgltEf9YyYCSFal0eKgBgFpJZjAAABAQgKALfi8QBiKedHRVQgL29ub3MvdWkvYXBwL2Z3L21hc3QvbWFzdC5odG1sIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyoNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KDQqO8e9WbR4FAOkCAADpAgAACAAnrR4TaPcoH9LFCABFAALbxFVAAEAG4+DAqAc2wKgHYJbPH/Wjawv/Dr+0LoAYIWZ/LgAAAQEICgC34vIAYinmR0VUIC9vbm9zL3VpL2RhdGEvaW1nL2xvYWRpbmcvbGlnaHQvbG9hZC0xNS5wbmcgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogaW1hZ2Uvd2VicCxpbWFnZS8qLCovKjtxPTAuOA0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71ZxHgUAnAIAAJwCAAAIACetHhNo9ygf0sUIAEUAAo5kwEAAQAZDw8CoBzbAqAdgltMf9WEcnztyg6gIgBgFpHlFAAABAQgKALfi8gBiKedHRVQgL29ub3MvdWkvbmF2Lmh0bWwgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKg0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71a9KwUAgAAAAIAAAABo9ygf0sUIACetHhMIAEUAAHJ/iEAAQAYrF8CoB2DAqAc2H/WWzw6/tC6jaw6mgBgEY5BLAAABAQgKAGIp6AC34vJIVFRQLzEuMSAzMDQgTm90IE1vZGlmaWVkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCo7x71a2MAUAqwIAAKsCAAAIACetHhNo9ygf0sUIAEUAAp3EVkAAQAbkHcCoBzbAqAdgls8f9aNrDqYOv7RsgBghZpq3AAABAQgKALfi8wBiKehHRVQgL29ub3MvdWkvYXBwL3ZpZXcvdG9wby90b3BvLmh0bWwgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKg0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71b9MQUAgAAAAIAAAABo9ygf0sUIACetHhMIAEUAAHLNC0AAQAbdk8CoB2DAqAc2H/WW0VqXR4qMmAumgBgEIJBLAAABAQgKAGIp6QC34vFIVFRQLzEuMSAzMDQgTm90IE1vZGlmaWVkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCo7x71ZEQQUA6AIAAOgCAAAIACetHhNo9ygf0sUIAEUAAtrd1EAAQAbKYsCoBzbAqAdgltEf9YyYC6Zal0fIgBgFpMcmAAABAQgKALfi9ABiKelHRVQgL29ub3MvdWkvZGF0YS9pbWcvbG9hZGluZy9kYXJrL2xvYWQtMTUucG5nIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6IGltYWdlL3dlYnAsaW1hZ2UvKiwqLyo7cT0wLjgNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQqO8e9WQ0UFAGcBAABnAQAAaPcoH9LFCAAnrR4TCABFAAFZf4lAAEAGKi/AqAdgwKgHNh/1ls8Ov7Rso2sRD4AYBG2RMgAAAQEICgBiKeoAt+LzSFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvaHRtbA0KQ29udGVudC1MZW5ndGg6IDE5NQ0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQo8IS0tIFRvcG9sb2d5IFZpZXcgcGFydGlhbCBIVE1MIC0tPgo8ZGl2IGlkPSJvdi10b3BvIj4KICAgIDxzdmcgdmlld0JveD0iMCAwIDEwMDAgMTAwMCIKICAgICAgICAgcmVzaXplIG9mZnNldC1oZWlnaHQ9IjU2IiBvZmZzZXQtd2lkdGg9IjEyIgogICAgICAgICBub3RpZmllcj0ibm90aWZ5UmVzaXplKCkiPgogICAgPC9zdmc+CjwvZGl2PgqO8e9WmUkFAIAAAACAAAAAaPcoH9LFCAAnrR4TCABFAAByzQxAAEAG3ZLAqAdgwKgHNh/1ltFal0fIjJgOTIAYBCuQSwAAAQEICgBiKesAt+L0SFRUUC8xLjEgMzA0IE5vdCBNb2RpZmllZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQqO8e9W+1YFAOkCAADpAgAACAAnrR4TaPcoH9LFCABFAALb3dVAAEAGymDAqAc2wKgHYJbRH/WMmA5MWpdIBoAYBaTOvAAAAQEICgC34vUAYinrR0VUIC9vbm9zL3VpL2RhdGEvaW1nL2xvYWRpbmcvbGlnaHQvbG9hZC0xNi5wbmcgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogaW1hZ2Uvd2VicCxpbWFnZS8qLCovKjtxPTAuOA0KSWYtTm9uZS1NYXRjaDogMTQ1ODU2NTM4NjgxOQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogSlNFU1NJT05JRD11d24xOGFraXN4eXYxMHc1dXFpeTc4aGZxOyB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwDQoNCo7x71bgVwUA6AIAAOgCAAAIACetHhNo9ygf0sUIAEUAAtrEV0AAQAbj38CoBzbAqAdgls8f9aNrEQ8Ov7WRgBghZm02AAABAQgKALfi9QBiKepHRVQgL29ub3MvdWkvZGF0YS9pbWcvbG9hZGluZy9kYXJrL2xvYWQtMTYucG5nIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6IGltYWdlL3dlYnAsaW1hZ2UvKiwqLyo7cT0wLjgNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQqO8e9WN14FAIAAAACAAAAAaPcoH9LFCAAnrR4TCABFAAByzQ1AAEAG3ZHAqAdgwKgHNh/1ltFal0gGjJgQ84AYBDWQSwAAAQEICgBiKewAt+L1SFRUUC8xLjEgMzA0IE5vdCBNb2RpZmllZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQqO8e9WXmIFANwCAADcAgAACAAnrR4TaPcoH9LFCABFAALO3dZAAEAGymzAqAc2wKgHYJbRH/WMmBDzWpdIRIAYBaSqaQAAAQEICgC34vYAYinsR0VUIC9vbm9zL3VpL2RhdGEvaW1nL25hdi1tZW51LnBuZyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiBpbWFnZS93ZWJwLGltYWdlLyosKi8qO3E9MC44DQpJZi1Ob25lLU1hdGNoOiAxNDU4NTY1Mzg2ODE5DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiBKU0VTU0lPTklEPXV3bjE4YWtpc3h5djEwdzV1cWl5NzhoZnE7IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0KjvHvVvljBQCAAAAAgAAAAGj3KB/SxQgAJ60eEwgARQAAcikqQABABoF1wKgHYMCoBzYf9ZbSU1J8xjSHsmyAGAQAkEsAAAEBCAoAYintALfi8EhUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KjvHvVm9oBQDdAgAA3QIAAAgAJ60eE2j3KB/SxQgARQACz2vjQABABjxfwKgHNsCoB2CW0h/1NIeybFNSfQSAGA8zeC8AAAEBCAoAt+L2AGIp7UdFVCAvb25vcy91aS9kYXRhL2ltZy9vbm9zLWxvZ28ucG5nIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6IGltYWdlL3dlYnAsaW1hZ2UvKiwqLyo7cT0wLjgNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjUzODY4MTkNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IEpTRVNTSU9OSUQ9dXduMThha2lzeHl2MTB3NXVxaXk3OGhmcTsgdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMA0KDQqO8e9WcWwFAIAAAACAAAAAaPcoH9LFCAAnrR4TCABFAAByKStAAEAGgXTAqAdgwKgHNh/1ltJTUn0ENIe1B4AYBAqQSwAAAQEICgBiKe0At+L2SFRUUC8xLjEgMzA0IE5vdCBNb2RpZmllZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQqO8e9W0ngFAIAAAACAAAAAaPcoH9LFCAAnrR4TCABFAAByiZtAAEAGIQTAqAdgwKgHNh/1ltBrO49r+T5cFIAYA1yQSwAAAQEICgBiKe4At+LxSFRUUC8xLjEgMzA0IE5vdCBNb2RpZmllZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQqO8e9WfoAFAIAAAACAAAAAaPcoH9LFCAAnrR4TCABFAABygaJAAEAGKP3AqAdgwKgHNh/1ltShr/YhQN4ow4AYA7+QSwAAAQEICgBiKe4At+LxSFRUUC8xLjEgMzA0IE5vdCBNb2RpZmllZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQqO8e9W8YIFAIAAAACAAAAAaPcoH9LFCAAnrR4TCABFAAByzQ5AAEAG3ZDAqAdgwKgHNh/1ltFal0hEjJgTjYAYBECQSwAAAQEICgBiKe8At+L2SFRUUC8xLjEgMzA0IE5vdCBNb2RpZmllZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQqO8e9Wn48FAPMEAADzBAAAaPcoH9LFCAAnrR4TCABFAATlLBpAAEAGehLAqAdgwKgHNh/1ltNyg6gIYRyhlYAYA5CUvgAAAQEICgBiKe8At+LySFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvaHRtbA0KQ29udGVudC1MZW5ndGg6IDExMDINClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KPCEtLSB7SU5KRUNURUQtVklFVy1OQVYtU1RBUlR9IC0tPgo8ZGl2IGNsYXNzPSJuYXYtaGRyIj5QbGF0Zm9ybTwvZGl2Pgo8YSBuZy1jbGljaz0ibmF2Q3RybC5oaWRlTmF2KCkiIGhyZWY9IiMvYXBwIj48ZGl2IGljb24gaWNvbi1pZD0ibmF2X2FwcHMiPjwvZGl2PiBBcHBsaWNhdGlvbnM8L2E+CjxhIG5nLWNsaWNrPSJuYXZDdHJsLmhpZGVOYXYoKSIgaHJlZj0iIy9zZXR0aW5ncyI+PGRpdiBpY29uIGljb24taWQ9Im5hdl9zZXR0aW5ncyI+PC9kaXY+IFNldHRpbmdzPC9hPgo8YSBuZy1jbGljaz0ibmF2Q3RybC5oaWRlTmF2KCkiIGhyZWY9IiMvY2x1c3RlciI+PGRpdiBpY29uIGljb24taWQ9Im5hdl9jbHVzdGVyIj48L2Rpdj4gQ2x1c3RlciBOb2RlczwvYT4KPGEgbmctY2xpY2s9Im5hdkN0cmwuaGlkZU5hdigpIiBocmVmPSIjL3Byb2Nlc3NvciI+PGRpdiBpY29uIGljb24taWQ9Im5hdl9wcm9jZXNzb3JzIj48L2Rpdj4gUGFja2V0IFByb2Nlc3NvcnM8L2E+CjxkaXYgY2xhc3M9Im5hdi1oZHIiPk5ldHdvcms8L2Rpdj4KPGEgbmctY2xpY2s9Im5hdkN0cmwuaGlkZU5hdigpIiBocmVmPSIjL3RvcG8iPjxkaXYgaWNvbiBpY29uLWlkPSJuYXZfdG9wbyI+PC9kaXY+IFRvcG9sb2d5PC9hPgo8YSBuZy1jbGljaz0ibmF2Q3RybC5oaWRlTmF2KCkiIGhyZWY9IiMvZGV2aWNlIj48ZGl2IGljb24gaWNvbi1pZD0ibmF2X2RldnMiPjwvZGl2PiBEZXZpY2VzPC9hPgo8YSBuZy1jbGljaz0ibmF2Q3RybC5oaWRlTmF2KCkiIGhyZWY9IiMvbGluayI+PGRpdiBpY29uIGljb24taWQ9Im5hdl9s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AAAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACR8e9WIT4AAEIAAABCAAAA////////egEAAAAAiG/AAd7ABAIAAAEAAAAAAAAAAAAAAAEEAAAAAAAAaAB0AGkAcABsAC0ANwA5ADYAMwA0AAAAkfHvVh3EAADqBQAA6gUAAAGAwgAAFTZpByEDAwXc/v4DgxsBBhABAAMCIiIiIgAAAAkF2UAiIiIiAAABAQIBSYEBzAYGNmkHEQMDhATIyMgC5QIAANMDAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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