public static ApiTextMessageEx fromBytes(byte[] src) throws IOException {
   BserValues values = new BserValues(BserParser.deserialize(new DataInput(src, 0, src.length)));
   int key = values.getInt(1);
   byte[] content = values.getBytes(2);
   switch (key) {
     case 1:
       return Bser.parse(new ApiTextExMarkdown(), content);
     case 2:
       return Bser.parse(new ApiTextModernMessage(), content);
     case 3:
       return Bser.parse(new ApiTextCommand(), content);
     default:
       return new ApiTextMessageExUnsupported(key, content);
   }
 }
 public static UpdateReactionsUpdate fromBytes(byte[] data) throws IOException {
   return Bser.parse(new UpdateReactionsUpdate(), data);
 }
 public static RequestNotifyBannerView fromBytes(byte[] data) throws IOException {
   return Bser.parse(new RequestNotifyBannerView(), data);
 }
 public static RequestShowDialog fromBytes(byte[] data) throws IOException {
   return Bser.parse(new RequestShowDialog(), data);
 }
 public static UpdateGroupExtChanged fromBytes(byte[] data) throws IOException {
   return Bser.parse(new UpdateGroupExtChanged(), data);
 }
 public static ResponseLoadAdminSettings fromBytes(byte[] data) throws IOException {
   return Bser.parse(new ResponseLoadAdminSettings(), data);
 }
 public static RequestLoadArchived fromBytes(byte[] data) throws IOException {
   return Bser.parse(new RequestLoadArchived(), data);
 }
 public static RequestPauseNotifications fromBytes(byte[] data) throws IOException {
   return Bser.parse(new RequestPauseNotifications(), data);
 }
 public static RequestLeaveGroup fromBytes(byte[] data) throws IOException {
   return Bser.parse(new RequestLeaveGroup(), data);
 }
 public static UpdateMessageReadByMe fromBytes(byte[] data) throws IOException {
   return Bser.parse(new UpdateMessageReadByMe(), data);
 }