ITxhcmNoPgpfXy5QS0dERUYgICAgICAgMCAgICAgICAgICAgMCAgICAgMCAgICAgNjQ0ICAgICA0NDEyICAgICAgYApnbyBvYmplY3QgbGludXggYW1kNjQgZ28xLjUuMSBYOm5vbmUKYnVpbGQgaWQgImJmNmIyN2Q3NWUxYjAyYWU2MWEzZTE4NTg1M2QxZTI3NjkxMzY3M2EiCgokJApwYWNrYWdlIHN2ZwoJaW1wb3J0IHJ1bnRpbWUgInJ1bnRpbWUiCglpbXBvcnQgYnl0ZXMgImJ5dGVzIgoJaW1wb3J0IHJlZ2V4cCAicmVnZXhwIgoJaW1wb3J0IHN0cmluZ3MgInN0cmluZ3MiCgl0eXBlIEAiYnl0ZXMiLnJlYWRPcCBpbnQKCWltcG9ydCBpbyAiaW8iIC8vIGluZGlyZWN0Cgl0eXBlIEAiaW8iLlJlYWRlciBpbnRlcmZhY2UgeyBSZWFkKEAiaW8iLnAgW11ieXRlKSAoQCJpbyIubiBpbnQsIEAiaW8iLmVyciBlcnJvcikgfQoJdHlwZSBAImlvIi5Xcml0ZXIgaW50ZXJmYWNlIHsgV3JpdGUoQCJpbyIucCBbXWJ5dGUpIChAImlvIi5uIGludCwgQCJpbyIuZXJyIGVycm9yKSB9Cgl0eXBlIEAiYnl0ZXMiLkJ1ZmZlciBzdHJ1Y3QgeyBAImJ5dGVzIi5idWYgW11ieXRlOyBAImJ5dGVzIi5vZmYgaW50OyBAImJ5dGVzIi5ydW5lQnl0ZXMgWzRdYnl0ZTsgQCJieXRlcyIuYm9vdHN0cmFwIFs2NF1ieXRlOyBAImJ5dGVzIi5sYXN0UmVhZCBAImJ5dGVzIi5yZWFkT3AgfQoJZnVuYyAoQCJieXRlcyIuYsK3MiAqQCJieXRlcyIuQnVmZmVyICJlc2M6MHgyMiIpIEJ5dGVzICgpICg/IFtdYnl0ZSkgeyByZXR1cm4gQCJieXRlcyIuYsK3Mi5AImJ5dGVzIi5idWZbQCJieXRlcyIuYsK3Mi5AImJ5dGVzIi5vZmY6XSB9CglmdW5jIChAImJ5dGVzIi5iwrcyICpAImJ5dGVzIi5CdWZmZXIgImVzYzoweDEiKSBDYXAgKCkgKD8gaW50KSB7IHJldHVybiBjYXAoQCJieXRlcyIuYsK3Mi5AImJ5dGVzIi5idWYpIH0KCWZ1bmMgKEAiYnl0ZXMiLmLCtzEgKkAiYnl0ZXMiLkJ1ZmZlcikgR3JvdyAoQCJieXRlcyIubsK3MiBpbnQpCglmdW5jIChAImJ5dGVzIi5iwrcyICpAImJ5dGVzIi5CdWZmZXIgImVzYzoweDEiKSBMZW4gKCkgKD8gaW50KSB7IHJldHVybiBsZW4oQCJieXRlcyIuYsK3Mi5AImJ5dGVzIi5idWYpIC0gQCJieXRlcyIuYsK3Mi5AImJ5dGVzIi5vZmYgfQoJZnVuYyAoQCJieXRlcyIuYsK3MiAqQCJieXRlcyIuQnVmZmVyICJlc2M6MHgyMiIpIE5leHQgKEAiYnl0ZXMiLm7CtzMgaW50KSAoPyBbXWJ5dGUpIHsgQCJieXRlcyIuYsK3Mi5AImJ5dGVzIi5sYXN0UmVhZCA9IEAiYnl0ZXMiLnJlYWRPcCgweDApOyB2YXIgQCJieXRlcyIubcK3NCBpbnQ7IDsgQCJieXRlcyIubcK3NCA9IEAiYnl0ZXMiLmLCtzIuTGVuKCk7IGlmIEAiYnl0ZXMiLm7CtzMgPiBAImJ5dGVzIi5twrc0IHsgQCJieXRlcyIubsK3MyA9IEAiYnl0ZXMiLm3CtzQgfTsgdmFyIEAiYnl0ZXMiLmRhdGHCtzUgW11ieXRlOyA7IEAiYnl0ZXMiLmRhdGHCtzUgPSBAImJ5dGVzIi5iwrcyLkAiYnl0ZXMiLmJ1ZltAImJ5dGVzIi5iwrcyLkAiYnl0ZXMiLm9mZjpAImJ5dGVzIi5iwrcyLkAiYnl0ZXMiLm9mZiArIEAiYnl0ZXMiLm7CtzNdOyBAImJ5dGVzIi5iwrcyLkAiYnl0ZXMiLm9mZiArPSBAImJ5dGVzIi5uwrczOyBpZiBAImJ5dGVzIi5uwrczID4gMHgwIHsgQCJieXRlcyIuYsK3Mi5AImJ5dGVzIi5sYXN0UmVhZCA9IEAiYnl0ZXMiLnJlYWRPcCgweDIpIH07IHJldHVybiBAImJ5dGVzIi5kYXRhwrc1IH0KCWZ1bmMgKEAiYnl0ZXMiLmLCtzMgKkAiYnl0ZXMiLkJ1ZmZlciAiZXNjOjB4OSIpIFJlYWQgKEAiYnl0ZXMiLnDCtzQgW11ieXRlICJlc2M6MHgxIikgKEAiYnl0ZXMiLm7CtzEgaW50LCBAImJ5dGVzIi5lcnLCtzIgZXJyb3IpCglmdW5jIChAImJ5dGVzIi5iwrczICpAImJ5dGVzIi5CdWZmZXIgImVzYzoweDEiKSBSZWFkQnl0ZSAoKSAoQCJieXRlcyIuY8K3MSBieXRlLCBAImJ5dGVzIi5lcnLCtzIgZXJyb3IpCglmdW5jIChAImJ5dGVzIi5iwrczICpAImJ5dGVzIi5CdWZmZXIgImVzYzoweDkiKSBSZWFkQnl0ZXMgKEAiYnl0ZXMiLmRlbGltwrc0IGJ5dGUpIChAImJ5dGVzIi5saW5lwrcxIFtdYnl0ZSwgQCJieXRlcyIuZXJywrcyIGVycm9yKQoJZnVuYyAoQCJieXRlcyIuYsK3MyAqQCJieXRlcyIuQnVmZmVyICJlc2M6MHg5IikgUmVhZEZyb20gKEAiYnl0ZXMiLnLCtzQgQCJpbyIuUmVhZGVyKSAoQCJieXRlcyIubsK3MSBpbnQ2NCwgQCJieXRlcyIuZXJywrcyIGVycm9yKQoJZnVuYyAoQCJieXRlcyIuYsK3NCAqQCJieXRlcyIuQnVmZmVyICJlc2M6MHgxIikgUmVhZFJ1bmUgKCkgKEAiYnl0ZXMiLnLCtzEgcnVuZSwgQCJieXRlcyIuc2l6ZcK3MiBpbnQsIEAiYnl0ZXMiLmVycsK3MyBlcnJvcikKCWZ1bmMgKEAiYnl0ZXMiLmLCtzMgKkAiYnl0ZXMiLkJ1ZmZlciAiZXNjOjB4MSIpIFJlYWRTdHJpbmcgKEAiYnl0ZXMiLmRlbGltwrc0IGJ5dGUpIChAImJ5dGVzIi5saW5lwrcxIHN0cmluZywgQCJieXRlcyIuZXJywrcyIGVycm9yKQoJZnVuYyAoQCJieXRlcyIuYsK3MSAqQCJieXRlcyIuQnVmZmVyICJlc2M6MHgxIikgUmVzZXQgKCkKCWZ1bmMgKEAiYnl0ZXMiLmLCtzIgKkAiYnl0ZXMiLkJ1ZmZlciAiZXNjOjB4MSIpIFN0cmluZyAoKSAoPyBzdHJpbmcpIHsgaWYgQCJieXRlcyIuYsK3MiA9PSBuaWwgeyByZXR1cm4gIjxuaWw+IiB9OyByZXR1cm4gc3RyaW5nKEAiYnl0ZXMiLmLCtzIuQCJieXRlcyIuYnVmW0AiYnl0ZXMiLmLCtzIuQCJieXRlcyIub2ZmOl0pIH0KCWZ1bmMgKEAiYnl0ZXMiLmLCtzEgKkAiYnl0ZXMiLkJ1ZmZlciAiZXNjOjB4MSIpIFRydW5jYXRlIChAImJ5dGVzIi5uwrcyIGludCkKCWZ1bmMgKEAiYnl0ZXMiLmLCtzIgKkAiYnl0ZXMiLkJ1ZmZlciAiZXNjOjB4MSIpIFVucmVhZEJ5dGUgKCkgKD8gZXJyb3IpIHsgaWYgQCJieXRlcyIuYsK3Mi5AImJ5dGVzIi5sYXN0UmVhZCAhPSBAImJ5dGVzIi5yZWFkT3AoMHgxKSAmJiBAImJ5dGVzIi5iwrcyLkAiYnl0ZXMiLmxhc3RSZWFkICE9IEAiYnl0ZXMiLnJlYWRPcCgweDIpIHsgcmV0dXJuIEAiZXJyb3JzIi5OZXcoImJ5dGVzLkJ1ZmZlcjogVW5yZWFkQnl0ZTogcHJldmlvdXMgb3BlcmF0aW9uIHdhcyBub3QgYSByZWFkIikgfTsgQCJieXRlcyIuYsK3Mi5AImJ5dGVzIi5sYXN0UmVhZCA9IEAiYnl0ZXMiLnJlYWRPcCgweDApOyBpZiBAImJ5dGVzIi5iwrcyLkAiYnl0ZXMiLm9mZiA+IDB4MCB7IEAiYnl0ZXMiLmLCtzIuQCJieXRlcyIub2ZmLS0gfTsgcmV0dXJuIG5pbCB9CglmdW5jIChAImJ5dGVzIi5iwrcyICpAImJ5dGVzIi5CdWZmZXIgImVzYzoweDEiKSBVbnJlYWRSdW5lICgpICg/IGVycm9yKQoJZnVuYyAoQCJieXRlcyIuYsK3MyAqQCJieXRlcyIuQnVmZmVyKSBXcml0ZSAoQCJieXRlcyIucMK3NCBbXWJ5dGUgImVzYzoweDkiKSAoQCJieXRlcyIubsK3MSBpbnQsIEAiYnl0ZXMiLmVycsK3MiBlcnJvcikKCWZ1bmMgKEAiYnl0ZXMiLmLCtzIgKkAiYnl0ZXMiLkJ1ZmZlcikgV3JpdGVCeXRlIChAImJ5dGVzIi5jwrczIGJ5dGUpICg/IGVycm9yKQoJZnVuYyAoQCJieXRlcyIuYsK3MyAqQCJieXRlcyIuQnVmZmVyKSBXcml0ZVJ1bmUgKEAiYnl0ZXMiLnLCtzQgcnVuZSkgKEAiYnl0ZXMiLm7CtzEgaW50LCBAImJ5dGVzIi5lcnLCtzIgZXJyb3IpCglmdW5jIChAImJ5dGVzIi5iwrczICpAImJ5dGVzIi5CdWZmZXIpIFdyaXRlU3RyaW5nIChAImJ5dGVzIi5zwrc0IHN0cmluZyAiZXNjOjB4OSIpIChAImJ5dGVzIi5uwrcxIGludCwgQCJieXRlcyIuZXJywrcyIGVycm9yKQoJZnVuYyAoQCJieXRlcyIuYsK3MyAqQCJieXRlcyIuQnVmZmVyICJlc2M6MHg5IikgV3JpdGVUbyAoQCJieXRlcyIud8K3NCBAImlvIi5Xcml0ZXIpIChAImJ5dGVzIi5uwrcxIGludDY0LCBAImJ5dGVzIi5lcnLCtzIgZXJyb3IpCglmdW5jIChAImJ5dGVzIi5iwrcyICpAImJ5dGVzIi5CdWZmZXIpIEAiYnl0ZXMiLmdyb3cgKEAiYnl0ZXMiLm7CtzMgaW50KSAoPyBpbnQpCglmdW5jIChAImJ5dGVzIi5iwrczICpAImJ5dGVzIi5CdWZmZXIgImVzYzoweDIyIikgQCJieXRlcyIucmVhZFNsaWNlIChAImJ5dGVzIi5kZWxpbcK3NCBieXRlKSAoQCJieXRlcyIubGluZcK3MSBbXWJ5dGUsIEAiYnl0ZXMiLmVycsK3MiBlcnJvcikKCWZ1bmMgQCIiLk1hc3NhZ2UgKEAiIi5pbsK3MiBAImJ5dGVzIi5CdWZmZXIgImVzYzoweDEiKSAoPyBzdHJpbmcpCglmdW5jIEAiIi5pbml0ICgpCglpbXBvcnQgZXJyb3JzICJlcnJvcnMiIC8vIGluZGlyZWN0CglmdW5jIEAiZXJyb3JzIi5OZXcgKEAiZXJyb3JzIi50ZXh0wrcyIHN0cmluZykgKD8gZXJyb3IpIHsgcmV0dXJuICgmQCJlcnJvcnMiLmVycm9yU3RyaW5neyBAImVycm9ycyIuczpAImVycm9ycyIudGV4dMK3MiB9KSB9Cgl0eXBlIEAiZXJyb3JzIi5lcnJvclN0cmluZyBzdHJ1Y3QgeyBAImVycm9ycyIucyBzdHJpbmcgfQoJZnVuYyAoQCJlcnJvcnMiLmXCtzIgKkAiZXJyb3JzIi5lcnJvclN0cmluZyAiZXNjOjB4MjIiKSBFcnJvciAoKSAoPyBzdHJpbmcpIHsgcmV0dXJuIEAiZXJyb3JzIi5lwrcyLkAiZXJyb3JzIi5zIH0KCiQkCl9nb18ubyAgICAgICAgICAwICAg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dGltZS5wYW5pY2luZGV4AAAAihAICgAAJHJ1bnRpbWUucGFuaWNzbGljZQAAAJgQCAoAACRydW50aW1lLnBhbmljaW5kZXgAAACmEAgKAAAkcnVudGltZS5wYW5pY3NsaWNlAAAAtBAICgAAJHJ1bnRpbWUucGFuaWNpbmRleAAAAMIQCAoAACRydW50aW1lLnBhbmljc2xpY2UAAADQEAgKAAAkcnVudGltZS5wYW5pY2luZGV4AAAA3hAICgAAJHJ1bnRpbWUucGFuaWNzbGljZQAAAOwQCAoAACRydW50aW1lLnBhbmljaW5kZXgAAAD6EAgKAAAkcnVudGltZS5wYW5pY3NsaWNlAAAAiBEICgAAJHJ1bnRpbWUucGFuaWNpbmRleAAAAJYRCAoAACRydW50aW1lLnBhbmljc2xpY2UAAACkEQgKAAAwcnVudGltZS5tb3Jlc3RhY2tfbm9jdHh0AAAAgAKwAwAAJB4iIi5hdXRvdG1wXzAwMTMAAAIWdHlwZS5zdHJpbmcAHiIiLmF1dG90bXBfMDAxMgAAAhB0eXBlLmludAAeIiIuYXV0b3RtcF8wMDExAAACFnR5cGUuc3RyaW5nAB4iIi5hdXRvdG1wXzAwMTAAAAIQdHlwZS5pbnQAHiIiLmF1dG90bXBfMDAwOQAAAhZ0eXBlLnN0cmluZwAeIiIuYXV0b3RtcF8wMDA4AAACEHR5cGUuaW50AB4iIi5hdXRvdG1wXzAwMDcAAAIWdHlwZS5zdHJpbmcAHiIiLmF1dG90bXBfMDAwNgAAAhB0eXBlLmludAAeIiIuYXV0b3RtcF8wMDA1AP8BAhZ0eXBlLnN0cmluZwAeIiIuYXV0b3RtcF8wMDAzAN8BAhZ0eXBlLnN0cmluZwAeIiIuYXV0b3RtcF8wMDAyAAACEHR5cGUuaW50AAwiIi5+cjAAvwECGHR5cGUuW111aW50OAAMIiIubG9jAC8CFHR5cGUuW11pbnQADCIiLmxvYwCPAQIUdHlwZS5bXWludAAMIiIubG9jAF8CFHR5cGUuW11pbnQADCIiLnN2ZwCfAgIWdHlwZS5zdHJpbmcADCIiLn5yMQDgAQQWdHlwZS5zdHJpbmcACiIiLmluAAAEInR5cGUuYnl0ZXMuQnVmZmVyABoCH7AD1gevAwGwA2oACALgCABaMDECbQhVLl8CHASEAQZfAhwGfQZPAhwEiQEGGAUOAw4HDgUOBw4DDjcHAQ8AAi4AjwECgwEC0QEBLgLKAQEuAsYBAZEBAARUZ2Nsb2NhbHPCtzdhMzIzY2ExYzE1ODgwZjFkNjU0ZWI2OTFlNjc0NmEwAFRnY2xvY2Fsc8K3NWJhMTJjM2VmN2E1MjQ5NGYzMzAzYTZiZjdmZDI0YzcAAAACcHByZWJ1aWx0cy9nby9saW51eC14ODYvc3JjL2NtZC9wcHJvZi9pbnRlcm5hbC9zdmcvc3ZnLmdvAv4CDiIiLmluaXQAAIAFAAD6BGRIiwwlAAAAAEg7YRAPhiABAABIg+wYD7YdAAAAAID7AHQYD7YdAAAAAID7AnUFSIPEGMPoAAAAAA8LxgUAAAAAAegAAAAA6AAAAADoAAAAAEiNHQAAAABIiRwkSMdEJAg3AAAA6AAAAABIi1wkEIA9AAAAAAAPhZ0AAABIiR0AAAAASI0dAAAAAEiJHCRIx0QkCA8AAADoAAAAAEiLXCQQgD0AAAAAAHVYSIkdAAAAAEiNHQAAAABIiRwkSMdEJAgGAAAA6AAAAABIi1wkEIA9AAAAAAB1E0iJHQAAAADGBQAAAAACSIPEGMNIjS0AAAAASIksJEiJXCQI6AAAAADr3UiNLQAAAABIiSwkSIlcJAjoAAAAAOuYSI0tAAAAAEiJLCRIiVwkCOgAAAAA6VD////oAAAAAOnD/v//OAoIGgAAAAAAADQIFgAAGiIiLmluaXRkb25lwrcAAABMCBYAABoiIi5pbml0ZG9uZcK3AAAAaggKAAAicnVudGltZS50aHJvd2luaXQAAAB6CBYBABoiIi5pbml0ZG9uZcK3AAAAhgEICgAAFGJ5dGVzLmluaXQAAACQAQgKAAAWcmVnZXhwLmluaXQAAACaAQgKAAAYc3RyaW5ncy5pbml0AAAAqAEIFgAAngFnby5zdHJpbmcuIjxzdmdcXHMqd2lkdGg9XCJbXlwiXStcIlxccypoZWlnaHQ9XCJbXlwiXStcIlxccyp2aWV3Qm94PVwiW15cIl0rXCIiAAAAzAEICgAAJHJlZ2V4cC5NdXN0Q29tcGlsZQAAAOIBCBYBADZydW50aW1lLndyaXRlQmFycmllckVuYWJsZWQAAAD+AQgWAAAUIiIudmlld0JveAAAAIwCCBYAADxnby5zdHJpbmcuIjxnIGlkPVwiZ3JhcGhcXGRcIiIAAACwAggKAAAkcmVnZXhwLk11c3RDb21waWxlAAAAxgIIFgEANnJ1bnRpbWUud3JpdGVCYXJyaWVyRW5hYmxlZAAAANoCCBYAABQiIi5ncmFwaElkAAAA6AIIFgAAJGdvLnN0cmluZy4iPC9zdmc+IgAAAIwDCAoAACRyZWdleHAuTXVzdENvbXBpbGUAAACiAwgWAQA2cnVudGltZS53cml0ZUJhcnJpZXJFbmFibGVkAAAAtgMIFgAAFiIiLnN2Z0Nsb3NlAAAAwgMIFgEAGiIiLmluaXRkb25lwrcAAADcAwgWAAAWIiIuc3ZnQ2xvc2UAAAD4AwgKAAAucnVudGltZS53cml0ZWJhcnJpZXJwdHIAAACKBAgWAAAUIiIuZ3JhcGhJZAAAAKYECAoAAC5ydW50aW1lLndyaXRlYmFycmllcnB0cgAAALgECBYAABQiIi52aWV3Qm94AAAA1AQICgAALnJ1bnRpbWUud3JpdGViYXJyaWVycHRyAAAA6AQICgAAMHJ1bnRpbWUubW9yZXN0YWNrX25vY3R4dAAAAAAwAAAAHAIXMBwvATC2AS8BMFUAIAJRAo4BAQwCFQECAjEBDQAydlFVMgIuAi5SDFEVUgJTFQICAxUCBVQNAAIMADQCjAIABFRnY2xvY2Fsc8K3MzNjZGVjY2NjZWJlODAzMjlmMWZkYmVlN2Y1ODc0Y2IAVGdjbG9jYWxzwrczM2NkZWNjY2NlYmU4MDMyOWYxZmRiZWU3ZjU4NzRjYgAAAAR2cHJlYnVpbHRzL2dvL2xpbnV4LXg4Ni9zcmMvY21kL3Bwcm9mL2ludGVybmFsL3N2Zy9zdmdwYW4uZ28CcHByZWJ1aWx0cy9nby9saW51eC14ODYvc3JjL2NtZC9wcHJvZi9pbnRlcm5hbC9zdmcvc3ZnLmdvAv4QJGdvLnN0cmluZy5oZHIuIiY7IgAGIAAAIAAAAAAAAAAAAgAAAAAAAAACABACAAAcZ28uc3RyaW5nLiImOyIAAAD+EBxnby5zdHJpbmcuIiY7IgAGEAAABiY7AAD+ECxnby5zdHJpbmcuaGRyLiImYW1wOzsiAAYgAAAgAAAAAAAAAAAGAAAAAAAAAAIAEAIAACRnby5zdHJpbmcuIiZhbXA7OyIAAAD+ECRnby5zdHJpbmcuIiZhbXA7OyIABhAAAA4mYW1wOzsAAP4QZmdvLnN0cmluZy5oZHIuIjxzdmcgd2lkdGg9XCIxMDAlXCIgaGVpZ2h0PVwiMTAwJVwiIgAGIAAAIAAAAAAAAAAAHwAAAAAAAAACABACAABeZ28uc3RyaW5nLiI8c3ZnIHdpZHRoPVwiMTAwJVwiIGhlaWdodD1cIjEwMCVcIiIAAAD+EF5nby5zdHJpbmcuIjxzdmcgd2lkdGg9XCIxMDAlXCIgaGVpZ2h0PVwiMTAwJVwiIgAGQAAAQDxzdmcgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIAAP4QJCIiLmhkci4uZ29zdHJpbmcuMQAGIAAAIAAAAAAAAAAA5h0AAAAAAAACABACAAAcIiIuLmdvc3RyaW5nLjEAAAD+EBwiIi4uZ29zdHJpbmcuMQAG0HcAAM53PHNjcmlwdCB0eXBlPSJ0ZXh0L2VjbWFzY3JpcHQiPjwhW0NEQVRBWwovKiogCiAqICBTVkdQYW4gbGlicmFyeSAxLjIuMQogKiA9PT09PT09PT09PT09PT09PT09PT09CiAqCiAqIEdpdmVuIGFuIHVuaXF1ZSBleGlzdGluZyBlbGVtZW50IHdpdGggaWQgInZpZXdwb3J0IiAob3Igd2hlbiBtaXNzaW5nLCB0aGUgZmlyc3QgZyAKICogZWxlbWVudCksIGluY2x1ZGluZyB0aGUgdGhlIGxpYnJhcnkgaW50byBhbnkgU1ZHIGFkZHMgdGhlIGZvbGxvd2luZyBjYXBhYmlsaXRpZXM6CiAqCiAqICAtIE1vdXNlIHBhbm5pbmcKICogIC0gTW91c2Ugem9vbWluZyAodXNpbmcgdGhlIHdoZWVsKQogKiAgLSBPYmplY3QgZHJhZ2dpbmcKICoKICogWW91IGNhbiBjb25maWd1cmUgdGhlIGJlaGF2aW91ciBvZiB0aGUgcGFuL3pvb20vZHJhZyB3aXRoIHRoZSB2YXJpYWJsZXMKICogbGlzdGVkIGluIHRoZSBDT05GSUdVUkFUSU9OIHNlY3Rpb24gb2YgdGhpcyBmaWxlLgogKgogKiBLbm93biBpc3N1ZXM6CiAqCiAqICAtIFpvb21pbmcgKHdoaWxlIHBhbm5pbmcpIG9uIFNhZmFyaSBoYXMgc3RpbGwgc29tZSBpc3N1ZXMKICoKICogUmVsZWFzZXM6CiAqCiAqIDEuMi4xLCBNb24gSnVsICA0IDAwOjMzOjE4IENFU1QgMjAxMSwgQW5kcmVhIExlb2ZyZWRkaQogKgktIEZpeGVkIGEgcmVncmVzc2lvbiB3aXRoIG1vdXNlIHdoZWVsIChub3cgd29ya2luZyBvbiBGaXJlZm94IDUpCiAqCS0gV29ya2luZyB3aXRoIHZpZXdCb3ggYXR0cmlidXRlICgjNCkKICoJLSBBZGRlZCAidXNlIHN0cmljdDsiIGFuZCBmaXhlZCByZXN1bHRpbmcgd2FybmluZ3MgKCM1KQogKgktIEFkZGVkIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzLCBkcmFnZ2luZyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0ICgjMykKICoKICogMS4yLCBTYXQgTWFyIDIwIDA4OjQyOjUwIEdNVCAyMDEwLCBaZW5nIFhpYW9odWkKICoJRml4ZWQgYSBidWcgd2l0aCBicm93c2VyIG1vdXNlIGhhbmRsZXIgaW50ZXJhY3Rpb24KICoKICogMS4xLCBXZWQgRmViICAzIDE3OjM5OjMzIEdNVCAyMDEwLCBaZW5nIFhpYW9odWkKICoJVXBkYXRlZCB0aGUgem9vbSBjb2RlIHRvIHN1cHBvcnQgdGhlIG1vdXNlIHdoZWVsIG9uIFNhZmFyaS9DaHJvbWUKICoKICogMS4wLCBBbmRyZWEgTGVvZnJlZGRpCiAqCUZpcnN0IHJlbGVhc2UKICoKICogVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBmb2xsb3dpbmcgQlNEIGxpY2Vuc2U6CiAqCiAqIENvcHlyaWdodCAyMDA5LTIwMTAgQW5kcmVhIExlb2ZyZWRkaSA8YS5sZW9mcmVkZGlAaXRjaGFybS5jb20+LiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiAKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlCiAqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgogKiAKICogICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YKICogICAgICAgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogKiAKICogICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3QKICogICAgICAgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKICogICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKiAKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBbmRyZWEgTGVvZnJlZGRpIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAogKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBbmRyZWEgTGVvZnJlZGRpIE9SCiAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgogKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgogKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICogCiAqIFRoZSB2aWV3cyBhbmQgY29uY2x1c2lvbnMgY29udGFpbmVkIGluIHRoZSBzb2Z0d2FyZSBhbmQgZG9jdW1lbnRhdGlvbiBhcmUgdGhvc2Ugb2YgdGhlCiAqIGF1dGhvcnMgYW5kIHNob3VsZCBub3QgYmUgaW50ZXJwcmV0ZWQgYXMgcmVwcmVzZW50aW5nIG9mZmljaWFsIHBvbGljaWVzLCBlaXRoZXIgZXhwcmVzc2VkCiAqIG9yIGltcGxpZWQsIG9mIEFuZHJlYSBMZW9mcmVkZGkuCiAqLwoKInVzZSBzdHJpY3QiOwoKLy8vIENPTkZJR1VSQVRJT04gCi8vLyA9PT09PgoKdmFyIGVuYWJsZVBhbiA9IDE7IC8vIDEgb3IgMDogZW5hYmxlIG9yIGRpc2FibGUgcGFubmluZyAoZGVmYXVsdCBlbmFibGVkKQp2YXIgZW5hYmxlWm9vbSA9IDE7IC8vIDEgb3IgMDogZW5hYmxlIG9yIGRpc2FibGUgem9vbWluZyAoZGVmYXVsdCBlbmFibGVkKQp2YXIgZW5hYmxlRHJhZyA9IDA7IC8vIDEgb3IgMDogZW5hYmxlIG9yIGRpc2FibGUgZHJhZ2dpbmcgKGRlZmF1bHQgZGlzYWJsZWQpCgovLy8gPD09PT0KLy8vIEVORCBPRiBDT05GSUdVUkFUSU9OIAoKdmFyIHJvb3QgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7Cgp2YXIgc3RhdGUgPSAnbm9uZScsIHN2Z1Jvb3QsIHN0YXRlVGFyZ2V0LCBzdGF0ZU9yaWdpbiwgc3RhdGVUZjsKCnNldHVwSGFuZGxlcnMocm9vdCk7CgovKioKICogUmVnaXN0ZXIgaGFuZGxlcnMKICovCmZ1bmN0aW9uIHNldHVwSGFuZGxlcnMocm9vdCl7CglzZXRBdHRyaWJ1dGVzKHJvb3QsIHsKCQkib25tb3VzZXVwIiA6ICJoYW5kbGVNb3VzZVVwKGV2dCkiLAoJCSJvbm1vdXNlZG93biIgOiAiaGFuZGxlTW91c2VEb3duKGV2dCkiLAoJCSJvbm1vdXNlbW92ZSIgOiAiaGFuZGxlTW91c2VNb3ZlKGV2dCkiLAoJCS8vIm9ubW91c2VvdXQiIDogImhhbmRsZU1vdXNlVXAoZXZ0KSIsIC8vIERlY29tbWVudCB0aGlzIHRvIHN0b3AgdGhlIHBhbiBmdW5jdGlvbmFsaXR5IHdoZW4gZHJhZ2dpbmcgb3V0IG9mIHRoZSBTVkcgZWxlbWVudAoJfSk7CgoJaWYobmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ3dlYmtpdCcpID49IDApCgkJd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNld2hlZWwnLCBoYW5kbGVNb3VzZVdoZWVsLCBmYWxzZSk7IC8vIENocm9tZS9TYWZhcmkKCWVsc2UKCQl3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignRE9NTW91c2VTY3JvbGwnLCBoYW5kbGVNb3VzZVdoZWVsLCBmYWxzZSk7IC8vIE90aGVycwp9CgovKioKICogUmV0cmlldmVzIHRoZSByb290IGVsZW1lbnQgZm9yIFNWRyBtYW5pcHVsYXRpb24uIFRoZSBlbGVtZW50IGlzIHRoZW4gY2FjaGVkIGludG8gdGhlIHN2Z1Jvb3QgZ2xvYmFsIHZhcmlhYmxlLgogKi8KZnVuY3Rpb24gZ2V0Um9vdChyb290KSB7CglpZih0eXBlb2Yoc3ZnUm9vdCkgPT0gInVuZGVmaW5lZCIpIHsKCQl2YXIgZyA9IG51bGw7CgoJCWcgPSByb290LmdldEVsZW1lbnRCeUlkKCJ2aWV3cG9ydCIpOwoKCQlpZihnID09IG51bGwpCgkJCWcgPSByb290LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdnJylbMF07CgoJCWlmKGcgPT0gbnVsbCkKCQkJYWxlcnQoJ1VuYWJsZSB0byBvYnRhaW4gU1ZHIHJvb3QgZWxlbWVudCcpOwoKCQlzZXRDVE0oZywgZy5nZXRDVE0oKSk7CgoJCWcucmVtb3ZlQXR0cmlidXRlKCJ2aWV3Qm94Iik7CgoJCXN2Z1Jvb3QgPSBnOwoJfQoKCXJldHVybiBzdmdSb290Owp9CgovKioKICogSW5zdGFuY2UgYW4gU1ZHUG9pbnQgb2JqZWN0IHdpdGggZ2l2ZW4gZXZlbnQgY29vcmRpbmF0ZXMuCiAqLwpmdW5jdGlvbiBnZXRFdmVudFBvaW50KGV2dCkgewoJdmFyIHAgPSByb290LmNyZWF0ZVNWR1BvaW50KCk7CgoJcC54ID0gZXZ0LmNsaWVudFg7CglwLnkgPSBldnQuY2xpZW50WTsKCglyZXR1cm4gcDsKfQoKLyoqCiAqIFNldHMgdGhlIGN1cnJlbnQgdHJhbnNmb3JtIG1hdHJpeCBvZiBhbiBlbGVtZW50LgogKi8KZnVuY3Rpb24gc2V0Q1RNKGVsZW1lbnQsIG1hdHJpeCkgewoJdmFyIHMgPSAibWF0cml4KCIgKyBtYXRyaXguYSArICIsIiArIG1hdHJpeC5iICsgIiwiICsgbWF0cml4LmMgKyAiLCIgKyBtYXRyaXguZCArICIsIiArIG1hdHJpeC5lICsgIiwiICsgbWF0cml4LmYgKyAiKSI7CgoJZWxlbWVudC5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsIHMpOwp9CgovKioKICogRHVtcHMgYSBtYXRyaXggdG8gYSBzdHJpbmcgKHVzZWZ1bCBmb3IgZGVidWcpLgogKi8KZnVuY3Rpb24gZHVtcE1hdHJpeChtYXRyaXgpIHsKCXZhciBzID0gIlsgIiArIG1hdHJpeC5hICsgIiwgIiArIG1hdHJpeC5jICsgIiwgIiArIG1hdHJpeC5lICsgIlxuICAiICsgbWF0cml4LmIgKyAiLCAiICsgbWF0cml4LmQgKyAiLCAiICsgbWF0cml4LmYgKyAiXG4gIDAsIDAsIDEgXSI7CgoJcmV0dXJuIHM7Cn0KCi8qKgogKiBTZXRzIGF0dHJpYnV0ZXMgb2YgYW4gZWxlbWVudC4KICovCmZ1bmN0aW9uIHNldEF0dHJpYnV0ZXMoZWxlbWVudCwgYXR0cmlidXRlcyl7Cglmb3IgKHZhciBpIGluIGF0dHJpYnV0ZXMpCgkJZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBpLCBhdHRyaWJ1dGVzW2ldKTsKfQoKLyoqCiAqIEhhbmRsZSBtb3VzZSB3aGVlbCBldmVudC4KICovCmZ1bmN0aW9uIGhhbmRsZU1vdXNlV2hlZWwoZXZ0KSB7CglpZighZW5hYmxlWm9vbSkKCQlyZXR1cm47CgoJaWYoZXZ0LnByZXZlbnREZWZhdWx0KQoJCWV2dC5wcmV2ZW50RGVmYXVsdCgpOwoKCWV2dC5yZXR1cm5WYWx1ZSA9IGZhbHNlOwoKCXZhciBzdmdEb2MgPSBldnQudGFyZ2V0Lm93bmVyRG9jdW1lbnQ7CgoJdmFyIGRlbHRhOwoKCWlmKGV2dC53aGVlbERlbHRhKQoJCWRlbHRhID0gZXZ0LndoZWVsRGVsdGEgLyAzNjAwOyAvLyBDaHJvbWUvU2FmYXJpCgllbHNlCgkJZGVsdGEgPSBldnQuZGV0YWlsIC8gLTkwOyAvLyBNb3ppbGxhCgoJdmFyIHogPSAxICsgZGVsdGE7IC8vIFpvb20gZmFjdG9yOiAwLjkvMS4xCgoJdmFyIGcgPSBnZXRSb290KHN2Z0RvYyk7CgkKCXZhciBwID0gZ2V0RXZlbnRQb2ludChldnQpOwoKCXAgPSBwLm1hdHJpeFRyYW5zZm9ybShnLmdldENUTSgpLmludmVyc2UoKSk7CgoJLy8gQ29tcHV0ZSBuZXcgc2NhbGUgbWF0cml4IGluIGN1cnJlbnQgbW91c2UgcG9zaXRpb24KCXZhciBrID0gcm9vdC5jcmVhdGVTVkdNYXRyaXgoKS50cmFuc2xhdGUocC54LCBwLnkpLnNjYWxlKHopLnRyYW5zbGF0ZSgtcC54LCAtcC55KTsKCiAgICAgICAgc2V0Q1RNKGcsIGcuZ2V0Q1RNKCkubXVsdGlwbHkoaykpOwoKCWlmKHR5cGVvZihzdGF0ZVRmKSA9PSAidW5kZWZpbmVkIikKCQlzdGF0ZVRmID0gZy5nZXRDVE0oKS5pbnZlcnNlKCk7CgoJc3RhdGVUZiA9IHN0YXRlVGYubXVsdGlwbHkoay5pbnZlcnNlKCkpOwp9CgovKioKICogSGFuZGxlIG1vdXNlIG1vdmUgZXZlbnQuCiAqLwpmdW5jdGlvbiBoYW5kbGVNb3VzZU1vdmUoZXZ0KSB7CglpZihldnQucHJldmVudERlZmF1bHQpCgkJZXZ0LnByZXZlbnREZWZhdWx0KCk7CgoJZXZ0LnJldHVyblZhbHVlID0gZmFsc2U7CgoJdmFyIHN2Z0RvYyA9IGV2dC50YXJnZXQub3duZXJEb2N1bWVudDsKCgl2YXIgZyA9IGdldFJvb3Qoc3ZnRG9jKTsKCglpZihzdGF0ZSA9PSAncGFuJyAmJiBlbmFibGVQYW4pIHsKCQkvLyBQYW4gbW9kZQoJCXZhciBwID0gZ2V0RXZlbnRQb2ludChldnQpLm1hdHJpeFRyYW5zZm9ybShzdGF0ZVRmKTsKCgkJc2V0Q1RNKGcsIHN0YXRlVGYuaW52ZXJzZSgpLnRyYW5zbGF0ZShwLnggLSBzdGF0ZU9yaWdpbi54LCBwLnkgLSBzdGF0ZU9yaWdpbi55KSk7Cgl9IGVsc2UgaWYoc3RhdGUgPT0gJ2RyYWcnICYmIGVuYWJsZURyYWcpIHsKCQkvLyBEcmFnIG1vZGUKCQl2YXIgcCA9IGdldEV2ZW50UG9pbnQoZXZ0KS5tYXRyaXhUcmFuc2Zvcm0oZy5nZXRDVE0oKS5pbnZlcnNlKCkpOwoKCQlzZXRDVE0oc3RhdGVUYXJnZXQsIHJvb3QuY3JlYXRlU1ZHTWF0cml4KCkudHJhbnNsYXRlKHAueCAtIHN0YXRlT3JpZ2luLngsIHAueSAtIHN0YXRlT3JpZ2luLnkpLm11bHRpcGx5KGcuZ2V0Q1RNKCkuaW52ZXJzZSgpKS5tdWx0aXBseShzdGF0ZVRhcmdldC5nZXRDVE0oKSkpOwoKCQlzdGF0ZU9yaWdpbiA9IHA7Cgl9Cn0KCi8qKgogKiBIYW5kbGUgY2xpY2sgZXZlbnQuCiAqLwpmdW5jdGlvbiBoYW5kbGVNb3VzZURvd24oZXZ0KSB7CglpZihldnQucHJldmVudERlZmF1bHQpCgkJZXZ0LnByZXZlbnREZWZhdWx0KCk7CgoJZXZ0LnJldHVyblZhbHVlID0gZmFsc2U7CgoJdmFyIHN2Z0RvYyA9IGV2dC50YXJnZXQub3duZXJEb2N1bWVudDsKCgl2YXIgZyA9IGdldFJvb3Qoc3ZnRG9jKTsKCglpZigKCQlldnQudGFyZ2V0LnRhZ05hbWUgPT0gInN2ZyIgCgkJfHwgIWVuYWJsZURyYWcgLy8gUGFuIGFueXdheSB3aGVuIGRyYWcgaXMgZGlzYWJsZWQgYW5kIHRoZSB1c2VyIGNsaWNrZWQgb24gYW4gZWxlbWVudCAKCSkgewoJCS8vIFBhbiBtb2RlCgkJc3RhdGUgPSAncGFuJzsKCgkJc3RhdGVUZiA9IGcuZ2V0Q1RNKCkuaW52ZXJzZSgpOwoKCQlzdGF0ZU9yaWdpbiA9IGdldEV2ZW50UG9pbnQoZXZ0KS5tYXRyaXhUcmFuc2Zvcm0oc3RhdGVUZik7Cgl9IGVsc2UgewoJCS8vIERyYWcgbW9kZQoJCXN0YXRlID0gJ2RyYWcnOwoKCQlzdGF0ZVRhcmdldCA9IGV2dC50YXJnZXQ7CgoJCXN0YXRlVGYgPSBnLmdldENUTSgpLmludmVyc2UoKTsKCgkJc3RhdGVPcmlnaW4gPSBnZXRFdmVudFBvaW50KGV2dCkubWF0cml4VHJhbnNmb3JtKHN0YXRlVGYpOwoJfQp9CgovKioKICogSGFuZGxlIG1vdXNlIGJ1dHRvbiByZWxlYXNlIGV2ZW50LgogKi8KZnVuY3Rpb24gaGFuZGxlTW91c2VVcChldnQpIHsKCWlmKGV2dC5wcmV2ZW50RGVmYXVsdCkKCQlldnQucHJldmVudERlZmF1bHQoKTsKCglldnQucmV0dXJuVmFsdWUgPSBmYWxzZTsKCgl2YXIgc3ZnRG9jID0gZXZ0LnRhcmdldC5vd25lckRvY3VtZW50OwoKCWlmKHN0YXRlID09ICdwYW4nIHx8IHN0YXRlID09ICdkcmFnJykgewoJCS8vIFF1aXQgcGFuIG1vZGUKCQlzdGF0ZSA9ICcnOwoJfQp9CgpdXT48L3NjcmlwdD48ZyBpZD0idmlld3BvcnQiIHRyYW5zZm9ybT0ic2NhbGUoMC41LDAuNSkgdHJhbnNsYXRlKDAsMCkiPgAA/hAoZ28uc3RyaW5nLmhkci4iPC9nPiIABiAAACAAAAAAAAAAAAQAAAAAAAAAAgAQAgAAIGdvLnN0cmluZy4iPC9nPiIAAAD+ECBnby5zdHJpbmcuIjwvZz4iAAYQAAAKPC9n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Z2FycmF5AAAAQBACAAAicnVudGltZS5nY2JpdHMuMDEAAABQEAIAAC5nby5zdHJpbmcuaGRyLiJbXXVpbnQ4IgAAAHAQAgAAKmdvLndlYWsudHlwZS4qW111aW50OAAAAIABEAIAACJydW50aW1lLnplcm92YWx1ZQAAAJABEAIAABR0eXBlLnVpbnQ4AAAA/hA2Z28udHlwZWxpbmsuW111aW50OAlbXXVpbnQ4AAIQAAAQAAAAAAAAAAACABACAAAYdHlwZS5bXXVpbnQ4AAAA/hAuZ28uc3RyaW5nLmhkci4icnVudGltZSIABiAAACAAAAAAAAAAAAcAAAAAAAAAAgAQAgAAJmdvLnN0cmluZy4icnVudGltZSIAAAD+ECZnby5zdHJpbmcuInJ1bnRpbWUiAAYQAAAQcnVudGltZQAA/hAsZ28uaW1wb3J0cGF0aC5ydW50aW1lLgACIAAAIAAAAAAAAAAABwAAAAAAAAACABACAAAmZ28uc3RyaW5nLiJydW50aW1lIgAAAP4QKmdvLnN0cmluZy5oZHIuImJ5dGVzIgAGIAAAIAAAAAAAAAAABQAAAAAAAAACABACAAAiZ28uc3RyaW5nLiJieXRlcyIAAAD+ECJnby5zdHJpbmcuImJ5dGVzIgAGEAAADGJ5dGVzAAD+EChnby5pbXBvcnRwYXRoLmJ5dGVzLgACIAAAIAAAAAAAAAAABQAAAAAAAAACABACAAAiZ28uc3RyaW5nLiJieXRlcyIAAAD+ECxnby5zdHJpbmcuaGRyLiJyZWdleHAiAAYgAAAgAAAAAAAAAAAGAAAAAAAAAAIAEAIAACRnby5zdHJpbmcuInJlZ2V4cCIAAAD+ECRnby5zdHJpbmcuInJlZ2V4cCIABhAAAA5yZWdleHAAAP4QKmdvLmltcG9ydHBhdGgucmVnZXhwLgACIAAAIAAAAAAAAAAABgAAAAAAAAACABACAAAkZ28uc3RyaW5nLiJyZWdleHAiAAAA/hAuZ28uc3RyaW5nLmhkci4ic3RyaW5ncyIABiAAACAAAAAAAAAAAAcAAAAAAAAAAgAQAgAAJmdvLnN0cmluZy4ic3RyaW5ncyIAAAD+ECZnby5zdHJpbmcuInN0cmluZ3MiAAYQAAAQc3RyaW5ncwAA/hAsZ28uaW1wb3J0cGF0aC5zdHJpbmdzLgACIAAAIAAAAAAAAAAABwAAAAAAAAACABACAAAmZ28uc3RyaW5nLiJzdHJpbmdzIgAAAP4QInJ1bnRpbWUuemVyb3ZhbHVlAAIAAAAAAP//Z28xM2xkAA==