LCOV - code coverage report
Current view: top level - lib/matrix_api_lite/generated - model.dart (source / functions) Coverage Total Hit
Test: merged.info Lines: 9.7 % 2456 238
Test Date: 2025-01-14 13:39:53 Functions: - 0 0

            Line data    Source code
       1              : import 'dart:core' as dart;
       2              : import 'dart:core';
       3              : 
       4              : import 'package:matrix/matrix_api_lite/model/children_state.dart';
       5              : import 'package:matrix/matrix_api_lite/model/matrix_event.dart';
       6              : import 'package:matrix/matrix_api_lite/model/matrix_keys.dart';
       7              : 
       8              : part 'model.g.dart';
       9              : 
      10              : class _NameSource {
      11              :   final String source;
      12           80 :   const _NameSource(this.source);
      13              : }
      14              : 
      15              : ///
      16              : @_NameSource('spec')
      17              : class HomeserverInformation {
      18            0 :   HomeserverInformation({
      19              :     required this.baseUrl,
      20              :   });
      21              : 
      22            5 :   HomeserverInformation.fromJson(Map<String, Object?> json)
      23           10 :       : baseUrl = Uri.parse(json['base_url'] as String);
      24            2 :   Map<String, Object?> toJson() => {
      25            2 :         'base_url': baseUrl.toString(),
      26              :       };
      27              : 
      28              :   /// The base URL for the homeserver for client-server connections.
      29              :   Uri baseUrl;
      30              : 
      31            0 :   @dart.override
      32              :   bool operator ==(Object other) =>
      33              :       identical(this, other) ||
      34            0 :       (other is HomeserverInformation &&
      35            0 :           other.runtimeType == runtimeType &&
      36            0 :           other.baseUrl == baseUrl);
      37              : 
      38            0 :   @dart.override
      39            0 :   int get hashCode => baseUrl.hashCode;
      40              : }
      41              : 
      42              : ///
      43              : @_NameSource('spec')
      44              : class IdentityServerInformation {
      45            0 :   IdentityServerInformation({
      46              :     required this.baseUrl,
      47              :   });
      48              : 
      49            5 :   IdentityServerInformation.fromJson(Map<String, Object?> json)
      50           10 :       : baseUrl = Uri.parse(json['base_url'] as String);
      51            2 :   Map<String, Object?> toJson() => {
      52            2 :         'base_url': baseUrl.toString(),
      53              :       };
      54              : 
      55              :   /// The base URL for the identity server for client-server connections.
      56              :   Uri baseUrl;
      57              : 
      58            0 :   @dart.override
      59              :   bool operator ==(Object other) =>
      60              :       identical(this, other) ||
      61            0 :       (other is IdentityServerInformation &&
      62            0 :           other.runtimeType == runtimeType &&
      63            0 :           other.baseUrl == baseUrl);
      64              : 
      65            0 :   @dart.override
      66            0 :   int get hashCode => baseUrl.hashCode;
      67              : }
      68              : 
      69              : /// Used by clients to determine the homeserver, identity server, and other
      70              : /// optional components they should be interacting with.
      71              : @_NameSource('spec')
      72              : class DiscoveryInformation {
      73            0 :   DiscoveryInformation({
      74              :     required this.mHomeserver,
      75              :     this.mIdentityServer,
      76              :     this.additionalProperties = const {},
      77              :   });
      78              : 
      79            5 :   DiscoveryInformation.fromJson(Map<String, Object?> json)
      80            5 :       : mHomeserver = HomeserverInformation.fromJson(
      81            5 :           json['m.homeserver'] as Map<String, Object?>,
      82              :         ),
      83            5 :         mIdentityServer = ((v) => v != null
      84            5 :             ? IdentityServerInformation.fromJson(v as Map<String, Object?>)
      85           10 :             : null)(json['m.identity_server']),
      86            5 :         additionalProperties = Map.fromEntries(
      87            5 :           json.entries
      88            5 :               .where(
      89           20 :                 (e) => !['m.homeserver', 'm.identity_server'].contains(e.key),
      90              :               )
      91            9 :               .map((e) => MapEntry(e.key, e.value)),
      92              :         );
      93            1 :   Map<String, Object?> toJson() {
      94            1 :     final mIdentityServer = this.mIdentityServer;
      95            1 :     return {
      96            1 :       ...additionalProperties,
      97            3 :       'm.homeserver': mHomeserver.toJson(),
      98              :       if (mIdentityServer != null)
      99            2 :         'm.identity_server': mIdentityServer.toJson(),
     100              :     };
     101              :   }
     102              : 
     103              :   /// Used by clients to discover homeserver information.
     104              :   HomeserverInformation mHomeserver;
     105              : 
     106              :   /// Used by clients to discover identity server information.
     107              :   IdentityServerInformation? mIdentityServer;
     108              : 
     109              :   Map<String, Object?> additionalProperties;
     110              : 
     111            0 :   @dart.override
     112              :   bool operator ==(Object other) =>
     113              :       identical(this, other) ||
     114            0 :       (other is DiscoveryInformation &&
     115            0 :           other.runtimeType == runtimeType &&
     116            0 :           other.mHomeserver == mHomeserver &&
     117            0 :           other.mIdentityServer == mIdentityServer);
     118              : 
     119            0 :   @dart.override
     120            0 :   int get hashCode => Object.hash(mHomeserver, mIdentityServer);
     121              : }
     122              : 
     123              : ///
     124              : @_NameSource('generated')
     125              : enum Role {
     126              :   mRoleAdmin('m.role.admin'),
     127              :   mRoleSecurity('m.role.security');
     128              : 
     129              :   final String name;
     130              :   const Role(this.name);
     131              : }
     132              : 
     133              : /// A way to contact the server administrator.
     134              : @_NameSource('spec')
     135              : class Contact {
     136            0 :   Contact({
     137              :     this.emailAddress,
     138              :     this.matrixId,
     139              :     required this.role,
     140              :   });
     141              : 
     142            0 :   Contact.fromJson(Map<String, Object?> json)
     143              :       : emailAddress =
     144            0 :             ((v) => v != null ? v as String : null)(json['email_address']),
     145            0 :         matrixId = ((v) => v != null ? v as String : null)(json['matrix_id']),
     146            0 :         role = Role.values.fromString(json['role'] as String)!;
     147            0 :   Map<String, Object?> toJson() {
     148            0 :     final emailAddress = this.emailAddress;
     149            0 :     final matrixId = this.matrixId;
     150            0 :     return {
     151            0 :       if (emailAddress != null) 'email_address': emailAddress,
     152            0 :       if (matrixId != null) 'matrix_id': matrixId,
     153            0 :       'role': role.name,
     154              :     };
     155              :   }
     156              : 
     157              :   /// An email address to reach the administrator.
     158              :   ///
     159              :   /// At least one of `matrix_id` or `email_address` is
     160              :   /// required.
     161              :   String? emailAddress;
     162              : 
     163              :   /// A [Matrix User ID](https://spec.matrix.org/unstable/appendices/#user-identifiers)
     164              :   /// representing the administrator.
     165              :   ///
     166              :   /// It could be an account registered on a different
     167              :   /// homeserver so the administrator can be contacted
     168              :   /// when the homeserver is down.
     169              :   ///
     170              :   /// At least one of `matrix_id` or `email_address` is
     171              :   /// required.
     172              :   String? matrixId;
     173              : 
     174              :   /// An informal description of what the contact methods
     175              :   /// are used for.
     176              :   ///
     177              :   /// `m.role.admin` is a catch-all role for any queries
     178              :   /// and `m.role.security` is intended for sensitive
     179              :   /// requests.
     180              :   ///
     181              :   /// Unspecified roles are permitted through the use of
     182              :   /// [Namespaced Identifiers](https://spec.matrix.org/unstable/appendices/#common-namespaced-identifier-grammar).
     183              :   Role role;
     184              : 
     185            0 :   @dart.override
     186              :   bool operator ==(Object other) =>
     187              :       identical(this, other) ||
     188            0 :       (other is Contact &&
     189            0 :           other.runtimeType == runtimeType &&
     190            0 :           other.emailAddress == emailAddress &&
     191            0 :           other.matrixId == matrixId &&
     192            0 :           other.role == role);
     193              : 
     194            0 :   @dart.override
     195            0 :   int get hashCode => Object.hash(emailAddress, matrixId, role);
     196              : }
     197              : 
     198              : ///
     199              : @_NameSource('generated')
     200              : class GetWellknownSupportResponse {
     201            0 :   GetWellknownSupportResponse({
     202              :     this.contacts,
     203              :     this.supportPage,
     204              :   });
     205              : 
     206            0 :   GetWellknownSupportResponse.fromJson(Map<String, Object?> json)
     207            0 :       : contacts = ((v) => v != null
     208              :             ? (v as List)
     209            0 :                 .map((v) => Contact.fromJson(v as Map<String, Object?>))
     210            0 :                 .toList()
     211            0 :             : null)(json['contacts']),
     212            0 :         supportPage = ((v) =>
     213            0 :             v != null ? Uri.parse(v as String) : null)(json['support_page']);
     214            0 :   Map<String, Object?> toJson() {
     215            0 :     final contacts = this.contacts;
     216            0 :     final supportPage = this.supportPage;
     217            0 :     return {
     218              :       if (contacts != null)
     219            0 :         'contacts': contacts.map((v) => v.toJson()).toList(),
     220            0 :       if (supportPage != null) 'support_page': supportPage.toString(),
     221              :     };
     222              :   }
     223              : 
     224              :   /// Ways to contact the server administrator.
     225              :   ///
     226              :   /// At least one of `contacts` or `support_page` is required.
     227              :   /// If only `contacts` is set, it must contain at least one
     228              :   /// item.
     229              :   List<Contact>? contacts;
     230              : 
     231              :   /// The URL of a page to give users help specific to the
     232              :   /// homeserver, like extra login/registration steps.
     233              :   ///
     234              :   /// At least one of `contacts` or `support_page` is required.
     235              :   Uri? supportPage;
     236              : 
     237            0 :   @dart.override
     238              :   bool operator ==(Object other) =>
     239              :       identical(this, other) ||
     240            0 :       (other is GetWellknownSupportResponse &&
     241            0 :           other.runtimeType == runtimeType &&
     242            0 :           other.contacts == contacts &&
     243            0 :           other.supportPage == supportPage);
     244              : 
     245            0 :   @dart.override
     246            0 :   int get hashCode => Object.hash(contacts, supportPage);
     247              : }
     248              : 
     249              : ///
     250              : @_NameSource('generated')
     251              : class GenerateLoginTokenResponse {
     252            0 :   GenerateLoginTokenResponse({
     253              :     required this.expiresInMs,
     254              :     required this.loginToken,
     255              :   });
     256              : 
     257            0 :   GenerateLoginTokenResponse.fromJson(Map<String, Object?> json)
     258            0 :       : expiresInMs = json['expires_in_ms'] as int,
     259            0 :         loginToken = json['login_token'] as String;
     260            0 :   Map<String, Object?> toJson() => {
     261            0 :         'expires_in_ms': expiresInMs,
     262            0 :         'login_token': loginToken,
     263              :       };
     264              : 
     265              :   /// The time remaining in milliseconds until the homeserver will no longer accept the token. `120000`
     266              :   /// (2 minutes) is recommended as a default.
     267              :   int expiresInMs;
     268              : 
     269              :   /// The login token for the `m.login.token` login flow.
     270              :   String loginToken;
     271              : 
     272            0 :   @dart.override
     273              :   bool operator ==(Object other) =>
     274              :       identical(this, other) ||
     275            0 :       (other is GenerateLoginTokenResponse &&
     276            0 :           other.runtimeType == runtimeType &&
     277            0 :           other.expiresInMs == expiresInMs &&
     278            0 :           other.loginToken == loginToken);
     279              : 
     280            0 :   @dart.override
     281            0 :   int get hashCode => Object.hash(expiresInMs, loginToken);
     282              : }
     283              : 
     284              : ///
     285              : @_NameSource('rule override generated')
     286              : class MediaConfig {
     287            0 :   MediaConfig({
     288              :     this.mUploadSize,
     289              :   });
     290              : 
     291            4 :   MediaConfig.fromJson(Map<String, Object?> json)
     292              :       : mUploadSize =
     293           12 :             ((v) => v != null ? v as int : null)(json['m.upload.size']);
     294            0 :   Map<String, Object?> toJson() {
     295            0 :     final mUploadSize = this.mUploadSize;
     296            0 :     return {
     297            0 :       if (mUploadSize != null) 'm.upload.size': mUploadSize,
     298              :     };
     299              :   }
     300              : 
     301              :   /// The maximum size an upload can be in bytes.
     302              :   /// Clients SHOULD use this as a guide when uploading content.
     303              :   /// If not listed or null, the size limit should be treated as unknown.
     304              :   int? mUploadSize;
     305              : 
     306            0 :   @dart.override
     307              :   bool operator ==(Object other) =>
     308              :       identical(this, other) ||
     309            0 :       (other is MediaConfig &&
     310            0 :           other.runtimeType == runtimeType &&
     311            0 :           other.mUploadSize == mUploadSize);
     312              : 
     313            0 :   @dart.override
     314            0 :   int get hashCode => mUploadSize.hashCode;
     315              : }
     316              : 
     317              : ///
     318              : @_NameSource('rule override generated')
     319              : class PreviewForUrl {
     320            0 :   PreviewForUrl({
     321              :     this.matrixImageSize,
     322              :     this.ogImage,
     323              :   });
     324              : 
     325            0 :   PreviewForUrl.fromJson(Map<String, Object?> json)
     326              :       : matrixImageSize =
     327            0 :             ((v) => v != null ? v as int : null)(json['matrix:image:size']),
     328            0 :         ogImage = ((v) =>
     329            0 :             v != null ? Uri.parse(v as String) : null)(json['og:image']);
     330            0 :   Map<String, Object?> toJson() {
     331            0 :     final matrixImageSize = this.matrixImageSize;
     332            0 :     final ogImage = this.ogImage;
     333            0 :     return {
     334            0 :       if (matrixImageSize != null) 'matrix:image:size': matrixImageSize,
     335            0 :       if (ogImage != null) 'og:image': ogImage.toString(),
     336              :     };
     337              :   }
     338              : 
     339              :   /// The byte-size of the image. Omitted if there is no image attached.
     340              :   int? matrixImageSize;
     341              : 
     342              :   /// An [`mxc://` URI](https://spec.matrix.org/unstable/client-server-api/#matrix-content-mxc-uris) to the image. Omitted if there is no image.
     343              :   Uri? ogImage;
     344              : 
     345            0 :   @dart.override
     346              :   bool operator ==(Object other) =>
     347              :       identical(this, other) ||
     348            0 :       (other is PreviewForUrl &&
     349            0 :           other.runtimeType == runtimeType &&
     350            0 :           other.matrixImageSize == matrixImageSize &&
     351            0 :           other.ogImage == ogImage);
     352              : 
     353            0 :   @dart.override
     354            0 :   int get hashCode => Object.hash(matrixImageSize, ogImage);
     355              : }
     356              : 
     357              : ///
     358              : @_NameSource('generated')
     359              : enum Method {
     360              :   crop('crop'),
     361              :   scale('scale');
     362              : 
     363              :   final String name;
     364              :   const Method(this.name);
     365              : }
     366              : 
     367              : ///
     368              : @_NameSource('spec')
     369              : class PublicRoomsChunk {
     370            0 :   PublicRoomsChunk({
     371              :     this.avatarUrl,
     372              :     this.canonicalAlias,
     373              :     required this.guestCanJoin,
     374              :     this.joinRule,
     375              :     this.name,
     376              :     required this.numJoinedMembers,
     377              :     required this.roomId,
     378              :     this.roomType,
     379              :     this.topic,
     380              :     required this.worldReadable,
     381              :   });
     382              : 
     383            0 :   PublicRoomsChunk.fromJson(Map<String, Object?> json)
     384            0 :       : avatarUrl = ((v) =>
     385            0 :             v != null ? Uri.parse(v as String) : null)(json['avatar_url']),
     386              :         canonicalAlias =
     387            0 :             ((v) => v != null ? v as String : null)(json['canonical_alias']),
     388            0 :         guestCanJoin = json['guest_can_join'] as bool,
     389            0 :         joinRule = ((v) => v != null ? v as String : null)(json['join_rule']),
     390            0 :         name = ((v) => v != null ? v as String : null)(json['name']),
     391            0 :         numJoinedMembers = json['num_joined_members'] as int,
     392            0 :         roomId = json['room_id'] as String,
     393            0 :         roomType = ((v) => v != null ? v as String : null)(json['room_type']),
     394            0 :         topic = ((v) => v != null ? v as String : null)(json['topic']),
     395            0 :         worldReadable = json['world_readable'] as bool;
     396            0 :   Map<String, Object?> toJson() {
     397            0 :     final avatarUrl = this.avatarUrl;
     398            0 :     final canonicalAlias = this.canonicalAlias;
     399            0 :     final joinRule = this.joinRule;
     400            0 :     final name = this.name;
     401            0 :     final roomType = this.roomType;
     402            0 :     final topic = this.topic;
     403            0 :     return {
     404            0 :       if (avatarUrl != null) 'avatar_url': avatarUrl.toString(),
     405            0 :       if (canonicalAlias != null) 'canonical_alias': canonicalAlias,
     406            0 :       'guest_can_join': guestCanJoin,
     407            0 :       if (joinRule != null) 'join_rule': joinRule,
     408            0 :       if (name != null) 'name': name,
     409            0 :       'num_joined_members': numJoinedMembers,
     410            0 :       'room_id': roomId,
     411            0 :       if (roomType != null) 'room_type': roomType,
     412            0 :       if (topic != null) 'topic': topic,
     413            0 :       'world_readable': worldReadable,
     414              :     };
     415              :   }
     416              : 
     417              :   /// The URL for the room's avatar, if one is set.
     418              :   Uri? avatarUrl;
     419              : 
     420              :   /// The canonical alias of the room, if any.
     421              :   String? canonicalAlias;
     422              : 
     423              :   /// Whether guest users may join the room and participate in it.
     424              :   /// If they can, they will be subject to ordinary power level
     425              :   /// rules like any other user.
     426              :   bool guestCanJoin;
     427              : 
     428              :   /// The room's join rule. When not present, the room is assumed to
     429              :   /// be `public`.
     430              :   String? joinRule;
     431              : 
     432              :   /// The name of the room, if any.
     433              :   String? name;
     434              : 
     435              :   /// The number of members joined to the room.
     436              :   int numJoinedMembers;
     437              : 
     438              :   /// The ID of the room.
     439              :   String roomId;
     440              : 
     441              :   /// The `type` of room (from [`m.room.create`](https://spec.matrix.org/unstable/client-server-api/#mroomcreate)), if any.
     442              :   String? roomType;
     443              : 
     444              :   /// The topic of the room, if any.
     445              :   String? topic;
     446              : 
     447              :   /// Whether the room may be viewed by guest users without joining.
     448              :   bool worldReadable;
     449              : 
     450            0 :   @dart.override
     451              :   bool operator ==(Object other) =>
     452              :       identical(this, other) ||
     453            0 :       (other is PublicRoomsChunk &&
     454            0 :           other.runtimeType == runtimeType &&
     455            0 :           other.avatarUrl == avatarUrl &&
     456            0 :           other.canonicalAlias == canonicalAlias &&
     457            0 :           other.guestCanJoin == guestCanJoin &&
     458            0 :           other.joinRule == joinRule &&
     459            0 :           other.name == name &&
     460            0 :           other.numJoinedMembers == numJoinedMembers &&
     461            0 :           other.roomId == roomId &&
     462            0 :           other.roomType == roomType &&
     463            0 :           other.topic == topic &&
     464            0 :           other.worldReadable == worldReadable);
     465              : 
     466            0 :   @dart.override
     467            0 :   int get hashCode => Object.hash(
     468            0 :         avatarUrl,
     469            0 :         canonicalAlias,
     470            0 :         guestCanJoin,
     471            0 :         joinRule,
     472            0 :         name,
     473            0 :         numJoinedMembers,
     474            0 :         roomId,
     475            0 :         roomType,
     476            0 :         topic,
     477            0 :         worldReadable,
     478              :       );
     479              : }
     480              : 
     481              : ///
     482              : @_NameSource('spec')
     483              : class SpaceHierarchyRoomsChunk {
     484            0 :   SpaceHierarchyRoomsChunk({
     485              :     required this.childrenState,
     486              :     this.roomType,
     487              :   });
     488              : 
     489            0 :   SpaceHierarchyRoomsChunk.fromJson(Map<String, Object?> json)
     490            0 :       : childrenState = (json['children_state'] as List)
     491            0 :             .map((v) => ChildrenState.fromJson(v as Map<String, Object?>))
     492            0 :             .toList(),
     493            0 :         roomType = ((v) => v != null ? v as String : null)(json['room_type']);
     494            0 :   Map<String, Object?> toJson() {
     495            0 :     final roomType = this.roomType;
     496            0 :     return {
     497            0 :       'children_state': childrenState.map((v) => v.toJson()).toList(),
     498            0 :       if (roomType != null) 'room_type': roomType,
     499              :     };
     500              :   }
     501              : 
     502              :   /// The [`m.space.child`](https://spec.matrix.org/unstable/client-server-api/#mspacechild) events of the space-room, represented
     503              :   /// as [Stripped State Events](https://spec.matrix.org/unstable/client-server-api/#stripped-state) with an added `origin_server_ts` key.
     504              :   ///
     505              :   /// If the room is not a space-room, this should be empty.
     506              :   List<ChildrenState> childrenState;
     507              : 
     508              :   /// The `type` of room (from [`m.room.create`](https://spec.matrix.org/unstable/client-server-api/#mroomcreate)), if any.
     509              :   String? roomType;
     510              : 
     511            0 :   @dart.override
     512              :   bool operator ==(Object other) =>
     513              :       identical(this, other) ||
     514            0 :       (other is SpaceHierarchyRoomsChunk &&
     515            0 :           other.runtimeType == runtimeType &&
     516            0 :           other.childrenState == childrenState &&
     517            0 :           other.roomType == roomType);
     518              : 
     519            0 :   @dart.override
     520            0 :   int get hashCode => Object.hash(childrenState, roomType);
     521              : }
     522              : 
     523              : ///
     524              : @_NameSource('rule override generated')
     525              : class SpaceRoomsChunk implements PublicRoomsChunk, SpaceHierarchyRoomsChunk {
     526            0 :   SpaceRoomsChunk({
     527              :     this.avatarUrl,
     528              :     this.canonicalAlias,
     529              :     required this.guestCanJoin,
     530              :     this.joinRule,
     531              :     this.name,
     532              :     required this.numJoinedMembers,
     533              :     required this.roomId,
     534              :     this.roomType,
     535              :     this.topic,
     536              :     required this.worldReadable,
     537              :     required this.childrenState,
     538              :   });
     539              : 
     540            0 :   SpaceRoomsChunk.fromJson(Map<String, Object?> json)
     541            0 :       : avatarUrl = ((v) =>
     542            0 :             v != null ? Uri.parse(v as String) : null)(json['avatar_url']),
     543              :         canonicalAlias =
     544            0 :             ((v) => v != null ? v as String : null)(json['canonical_alias']),
     545            0 :         guestCanJoin = json['guest_can_join'] as bool,
     546            0 :         joinRule = ((v) => v != null ? v as String : null)(json['join_rule']),
     547            0 :         name = ((v) => v != null ? v as String : null)(json['name']),
     548            0 :         numJoinedMembers = json['num_joined_members'] as int,
     549            0 :         roomId = json['room_id'] as String,
     550            0 :         roomType = ((v) => v != null ? v as String : null)(json['room_type']),
     551            0 :         topic = ((v) => v != null ? v as String : null)(json['topic']),
     552            0 :         worldReadable = json['world_readable'] as bool,
     553            0 :         childrenState = (json['children_state'] as List)
     554            0 :             .map((v) => ChildrenState.fromJson(v as Map<String, Object?>))
     555            0 :             .toList();
     556            0 :   @override
     557              :   Map<String, Object?> toJson() {
     558            0 :     final avatarUrl = this.avatarUrl;
     559            0 :     final canonicalAlias = this.canonicalAlias;
     560            0 :     final joinRule = this.joinRule;
     561            0 :     final name = this.name;
     562            0 :     final roomType = this.roomType;
     563            0 :     final topic = this.topic;
     564            0 :     return {
     565            0 :       if (avatarUrl != null) 'avatar_url': avatarUrl.toString(),
     566            0 :       if (canonicalAlias != null) 'canonical_alias': canonicalAlias,
     567            0 :       'guest_can_join': guestCanJoin,
     568            0 :       if (joinRule != null) 'join_rule': joinRule,
     569            0 :       if (name != null) 'name': name,
     570            0 :       'num_joined_members': numJoinedMembers,
     571            0 :       'room_id': roomId,
     572            0 :       if (roomType != null) 'room_type': roomType,
     573            0 :       if (topic != null) 'topic': topic,
     574            0 :       'world_readable': worldReadable,
     575            0 :       'children_state': childrenState.map((v) => v.toJson()).toList(),
     576              :     };
     577              :   }
     578              : 
     579              :   /// The URL for the room's avatar, if one is set.
     580              :   @override
     581              :   Uri? avatarUrl;
     582              : 
     583              :   /// The canonical alias of the room, if any.
     584              :   @override
     585              :   String? canonicalAlias;
     586              : 
     587              :   /// Whether guest users may join the room and participate in it.
     588              :   /// If they can, they will be subject to ordinary power level
     589              :   /// rules like any other user.
     590              :   @override
     591              :   bool guestCanJoin;
     592              : 
     593              :   /// The room's join rule. When not present, the room is assumed to
     594              :   /// be `public`.
     595              :   @override
     596              :   String? joinRule;
     597              : 
     598              :   /// The name of the room, if any.
     599              :   @override
     600              :   String? name;
     601              : 
     602              :   /// The number of members joined to the room.
     603              :   @override
     604              :   int numJoinedMembers;
     605              : 
     606              :   /// The ID of the room.
     607              :   @override
     608              :   String roomId;
     609              : 
     610              :   /// The `type` of room (from [`m.room.create`](https://spec.matrix.org/unstable/client-server-api/#mroomcreate)), if any.
     611              :   @override
     612              :   String? roomType;
     613              : 
     614              :   /// The topic of the room, if any.
     615              :   @override
     616              :   String? topic;
     617              : 
     618              :   /// Whether the room may be viewed by guest users without joining.
     619              :   @override
     620              :   bool worldReadable;
     621              : 
     622              :   /// The [`m.space.child`](https://spec.matrix.org/unstable/client-server-api/#mspacechild) events of the space-room, represented
     623              :   /// as [Stripped State Events](https://spec.matrix.org/unstable/client-server-api/#stripped-state) with an added `origin_server_ts` key.
     624              :   ///
     625              :   /// If the room is not a space-room, this should be empty.
     626              :   @override
     627              :   List<ChildrenState> childrenState;
     628              : 
     629            0 :   @dart.override
     630              :   bool operator ==(Object other) =>
     631              :       identical(this, other) ||
     632            0 :       (other is SpaceRoomsChunk &&
     633            0 :           other.runtimeType == runtimeType &&
     634            0 :           other.avatarUrl == avatarUrl &&
     635            0 :           other.canonicalAlias == canonicalAlias &&
     636            0 :           other.guestCanJoin == guestCanJoin &&
     637            0 :           other.joinRule == joinRule &&
     638            0 :           other.name == name &&
     639            0 :           other.numJoinedMembers == numJoinedMembers &&
     640            0 :           other.roomId == roomId &&
     641            0 :           other.roomType == roomType &&
     642            0 :           other.topic == topic &&
     643            0 :           other.worldReadable == worldReadable &&
     644            0 :           other.childrenState == childrenState);
     645              : 
     646            0 :   @dart.override
     647            0 :   int get hashCode => Object.hash(
     648            0 :         avatarUrl,
     649            0 :         canonicalAlias,
     650            0 :         guestCanJoin,
     651            0 :         joinRule,
     652            0 :         name,
     653            0 :         numJoinedMembers,
     654            0 :         roomId,
     655            0 :         roomType,
     656            0 :         topic,
     657            0 :         worldReadable,
     658            0 :         childrenState,
     659              :       );
     660              : }
     661              : 
     662              : ///
     663              : @_NameSource('generated')
     664              : class GetSpaceHierarchyResponse {
     665            0 :   GetSpaceHierarchyResponse({
     666              :     this.nextBatch,
     667              :     required this.rooms,
     668              :   });
     669              : 
     670            0 :   GetSpaceHierarchyResponse.fromJson(Map<String, Object?> json)
     671            0 :       : nextBatch = ((v) => v != null ? v as String : null)(json['next_batch']),
     672            0 :         rooms = (json['rooms'] as List)
     673            0 :             .map((v) => SpaceRoomsChunk.fromJson(v as Map<String, Object?>))
     674            0 :             .toList();
     675            0 :   Map<String, Object?> toJson() {
     676            0 :     final nextBatch = this.nextBatch;
     677            0 :     return {
     678            0 :       if (nextBatch != null) 'next_batch': nextBatch,
     679            0 :       'rooms': rooms.map((v) => v.toJson()).toList(),
     680              :     };
     681              :   }
     682              : 
     683              :   /// A token to supply to `from` to keep paginating the responses. Not present when there are
     684              :   /// no further results.
     685              :   String? nextBatch;
     686              : 
     687              :   /// The rooms for the current page, with the current filters.
     688              :   List<SpaceRoomsChunk> rooms;
     689              : 
     690            0 :   @dart.override
     691              :   bool operator ==(Object other) =>
     692              :       identical(this, other) ||
     693            0 :       (other is GetSpaceHierarchyResponse &&
     694            0 :           other.runtimeType == runtimeType &&
     695            0 :           other.nextBatch == nextBatch &&
     696            0 :           other.rooms == rooms);
     697              : 
     698            0 :   @dart.override
     699            0 :   int get hashCode => Object.hash(nextBatch, rooms);
     700              : }
     701              : 
     702              : ///
     703              : @_NameSource('rule override generated')
     704              : enum Direction {
     705              :   b('b'),
     706              :   f('f');
     707              : 
     708              :   final String name;
     709              :   const Direction(this.name);
     710              : }
     711              : 
     712              : ///
     713              : @_NameSource('generated')
     714              : class GetRelatingEventsResponse {
     715            0 :   GetRelatingEventsResponse({
     716              :     required this.chunk,
     717              :     this.nextBatch,
     718              :     this.prevBatch,
     719              :     this.recursionDepth,
     720              :   });
     721              : 
     722            0 :   GetRelatingEventsResponse.fromJson(Map<String, Object?> json)
     723            0 :       : chunk = (json['chunk'] as List)
     724            0 :             .map((v) => MatrixEvent.fromJson(v as Map<String, Object?>))
     725            0 :             .toList(),
     726            0 :         nextBatch = ((v) => v != null ? v as String : null)(json['next_batch']),
     727            0 :         prevBatch = ((v) => v != null ? v as String : null)(json['prev_batch']),
     728              :         recursionDepth =
     729            0 :             ((v) => v != null ? v as int : null)(json['recursion_depth']);
     730            0 :   Map<String, Object?> toJson() {
     731            0 :     final nextBatch = this.nextBatch;
     732            0 :     final prevBatch = this.prevBatch;
     733            0 :     final recursionDepth = this.recursionDepth;
     734            0 :     return {
     735            0 :       'chunk': chunk.map((v) => v.toJson()).toList(),
     736            0 :       if (nextBatch != null) 'next_batch': nextBatch,
     737            0 :       if (prevBatch != null) 'prev_batch': prevBatch,
     738            0 :       if (recursionDepth != null) 'recursion_depth': recursionDepth,
     739              :     };
     740              :   }
     741              : 
     742              :   /// The child events of the requested event, ordered topologically most-recent
     743              :   /// first. The events returned will match the `relType` and `eventType` supplied
     744              :   /// in the URL.
     745              :   List<MatrixEvent> chunk;
     746              : 
     747              :   /// An opaque string representing a pagination token. The absence of this token
     748              :   /// means there are no more results to fetch and the client should stop paginating.
     749              :   String? nextBatch;
     750              : 
     751              :   /// An opaque string representing a pagination token. The absence of this token
     752              :   /// means this is the start of the result set, i.e. this is the first batch/page.
     753              :   String? prevBatch;
     754              : 
     755              :   /// If the `recurse` parameter was supplied by the client, this response field is
     756              :   /// mandatory and gives the actual depth to which the server recursed. If the client
     757              :   /// did not specify the `recurse` parameter, this field must be absent.
     758              :   int? recursionDepth;
     759              : 
     760            0 :   @dart.override
     761              :   bool operator ==(Object other) =>
     762              :       identical(this, other) ||
     763            0 :       (other is GetRelatingEventsResponse &&
     764            0 :           other.runtimeType == runtimeType &&
     765            0 :           other.chunk == chunk &&
     766            0 :           other.nextBatch == nextBatch &&
     767            0 :           other.prevBatch == prevBatch &&
     768            0 :           other.recursionDepth == recursionDepth);
     769              : 
     770            0 :   @dart.override
     771            0 :   int get hashCode => Object.hash(chunk, nextBatch, prevBatch, recursionDepth);
     772              : }
     773              : 
     774              : ///
     775              : @_NameSource('generated')
     776              : class GetRelatingEventsWithRelTypeResponse {
     777            0 :   GetRelatingEventsWithRelTypeResponse({
     778              :     required this.chunk,
     779              :     this.nextBatch,
     780              :     this.prevBatch,
     781              :     this.recursionDepth,
     782              :   });
     783              : 
     784            0 :   GetRelatingEventsWithRelTypeResponse.fromJson(Map<String, Object?> json)
     785            0 :       : chunk = (json['chunk'] as List)
     786            0 :             .map((v) => MatrixEvent.fromJson(v as Map<String, Object?>))
     787            0 :             .toList(),
     788            0 :         nextBatch = ((v) => v != null ? v as String : null)(json['next_batch']),
     789            0 :         prevBatch = ((v) => v != null ? v as String : null)(json['prev_batch']),
     790              :         recursionDepth =
     791            0 :             ((v) => v != null ? v as int : null)(json['recursion_depth']);
     792            0 :   Map<String, Object?> toJson() {
     793            0 :     final nextBatch = this.nextBatch;
     794            0 :     final prevBatch = this.prevBatch;
     795            0 :     final recursionDepth = this.recursionDepth;
     796            0 :     return {
     797            0 :       'chunk': chunk.map((v) => v.toJson()).toList(),
     798            0 :       if (nextBatch != null) 'next_batch': nextBatch,
     799            0 :       if (prevBatch != null) 'prev_batch': prevBatch,
     800            0 :       if (recursionDepth != null) 'recursion_depth': recursionDepth,
     801              :     };
     802              :   }
     803              : 
     804              :   /// The child events of the requested event, ordered topologically most-recent
     805              :   /// first. The events returned will match the `relType` and `eventType` supplied
     806              :   /// in the URL.
     807              :   List<MatrixEvent> chunk;
     808              : 
     809              :   /// An opaque string representing a pagination token. The absence of this token
     810              :   /// means there are no more results to fetch and the client should stop paginating.
     811              :   String? nextBatch;
     812              : 
     813              :   /// An opaque string representing a pagination token. The absence of this token
     814              :   /// means this is the start of the result set, i.e. this is the first batch/page.
     815              :   String? prevBatch;
     816              : 
     817              :   /// If the `recurse` parameter was supplied by the client, this response field is
     818              :   /// mandatory and gives the actual depth to which the server recursed. If the client
     819              :   /// did not specify the `recurse` parameter, this field must be absent.
     820              :   int? recursionDepth;
     821              : 
     822            0 :   @dart.override
     823              :   bool operator ==(Object other) =>
     824              :       identical(this, other) ||
     825            0 :       (other is GetRelatingEventsWithRelTypeResponse &&
     826            0 :           other.runtimeType == runtimeType &&
     827            0 :           other.chunk == chunk &&
     828            0 :           other.nextBatch == nextBatch &&
     829            0 :           other.prevBatch == prevBatch &&
     830            0 :           other.recursionDepth == recursionDepth);
     831              : 
     832            0 :   @dart.override
     833            0 :   int get hashCode => Object.hash(chunk, nextBatch, prevBatch, recursionDepth);
     834              : }
     835              : 
     836              : ///
     837              : @_NameSource('generated')
     838              : class GetRelatingEventsWithRelTypeAndEventTypeResponse {
     839            0 :   GetRelatingEventsWithRelTypeAndEventTypeResponse({
     840              :     required this.chunk,
     841              :     this.nextBatch,
     842              :     this.prevBatch,
     843              :     this.recursionDepth,
     844              :   });
     845              : 
     846            0 :   GetRelatingEventsWithRelTypeAndEventTypeResponse.fromJson(
     847              :     Map<String, Object?> json,
     848            0 :   )   : chunk = (json['chunk'] as List)
     849            0 :             .map((v) => MatrixEvent.fromJson(v as Map<String, Object?>))
     850            0 :             .toList(),
     851            0 :         nextBatch = ((v) => v != null ? v as String : null)(json['next_batch']),
     852            0 :         prevBatch = ((v) => v != null ? v as String : null)(json['prev_batch']),
     853              :         recursionDepth =
     854            0 :             ((v) => v != null ? v as int : null)(json['recursion_depth']);
     855            0 :   Map<String, Object?> toJson() {
     856            0 :     final nextBatch = this.nextBatch;
     857            0 :     final prevBatch = this.prevBatch;
     858            0 :     final recursionDepth = this.recursionDepth;
     859            0 :     return {
     860            0 :       'chunk': chunk.map((v) => v.toJson()).toList(),
     861            0 :       if (nextBatch != null) 'next_batch': nextBatch,
     862            0 :       if (prevBatch != null) 'prev_batch': prevBatch,
     863            0 :       if (recursionDepth != null) 'recursion_depth': recursionDepth,
     864              :     };
     865              :   }
     866              : 
     867              :   /// The child events of the requested event, ordered topologically most-recent
     868              :   /// first. The events returned will match the `relType` and `eventType` supplied
     869              :   /// in the URL.
     870              :   List<MatrixEvent> chunk;
     871              : 
     872              :   /// An opaque string representing a pagination token. The absence of this token
     873              :   /// means there are no more results to fetch and the client should stop paginating.
     874              :   String? nextBatch;
     875              : 
     876              :   /// An opaque string representing a pagination token. The absence of this token
     877              :   /// means this is the start of the result set, i.e. this is the first batch/page.
     878              :   String? prevBatch;
     879              : 
     880              :   /// If the `recurse` parameter was supplied by the client, this response field is
     881              :   /// mandatory and gives the actual depth to which the server recursed. If the client
     882              :   /// did not specify the `recurse` parameter, this field must be absent.
     883              :   int? recursionDepth;
     884              : 
     885            0 :   @dart.override
     886              :   bool operator ==(Object other) =>
     887              :       identical(this, other) ||
     888            0 :       (other is GetRelatingEventsWithRelTypeAndEventTypeResponse &&
     889            0 :           other.runtimeType == runtimeType &&
     890            0 :           other.chunk == chunk &&
     891            0 :           other.nextBatch == nextBatch &&
     892            0 :           other.prevBatch == prevBatch &&
     893            0 :           other.recursionDepth == recursionDepth);
     894              : 
     895            0 :   @dart.override
     896            0 :   int get hashCode => Object.hash(chunk, nextBatch, prevBatch, recursionDepth);
     897              : }
     898              : 
     899              : ///
     900              : @_NameSource('generated')
     901              : enum Include {
     902              :   all('all'),
     903              :   participated('participated');
     904              : 
     905              :   final String name;
     906              :   const Include(this.name);
     907              : }
     908              : 
     909              : ///
     910              : @_NameSource('generated')
     911              : class GetThreadRootsResponse {
     912            0 :   GetThreadRootsResponse({
     913              :     required this.chunk,
     914              :     this.nextBatch,
     915              :   });
     916              : 
     917            0 :   GetThreadRootsResponse.fromJson(Map<String, Object?> json)
     918            0 :       : chunk = (json['chunk'] as List)
     919            0 :             .map((v) => MatrixEvent.fromJson(v as Map<String, Object?>))
     920            0 :             .toList(),
     921            0 :         nextBatch = ((v) => v != null ? v as String : null)(json['next_batch']);
     922            0 :   Map<String, Object?> toJson() {
     923            0 :     final nextBatch = this.nextBatch;
     924            0 :     return {
     925            0 :       'chunk': chunk.map((v) => v.toJson()).toList(),
     926            0 :       if (nextBatch != null) 'next_batch': nextBatch,
     927              :     };
     928              :   }
     929              : 
     930              :   /// The thread roots, ordered by the `latest_event` in each event's aggregated children. All events
     931              :   /// returned include bundled [aggregations](https://spec.matrix.org/unstable/client-server-api/#aggregations-of-child-events).
     932              :   ///
     933              :   /// If the thread root event was sent by an [ignored user](https://spec.matrix.org/unstable/client-server-api/#ignoring-users), the
     934              :   /// event is returned redacted to the caller. This is to simulate the same behaviour of a client doing
     935              :   /// aggregation locally on the thread.
     936              :   List<MatrixEvent> chunk;
     937              : 
     938              :   /// A token to supply to `from` to keep paginating the responses. Not present when there are
     939              :   /// no further results.
     940              :   String? nextBatch;
     941              : 
     942            0 :   @dart.override
     943              :   bool operator ==(Object other) =>
     944              :       identical(this, other) ||
     945            0 :       (other is GetThreadRootsResponse &&
     946            0 :           other.runtimeType == runtimeType &&
     947            0 :           other.chunk == chunk &&
     948            0 :           other.nextBatch == nextBatch);
     949              : 
     950            0 :   @dart.override
     951            0 :   int get hashCode => Object.hash(chunk, nextBatch);
     952              : }
     953              : 
     954              : ///
     955              : @_NameSource('generated')
     956              : class GetEventByTimestampResponse {
     957            0 :   GetEventByTimestampResponse({
     958              :     required this.eventId,
     959              :     required this.originServerTs,
     960              :   });
     961              : 
     962            0 :   GetEventByTimestampResponse.fromJson(Map<String, Object?> json)
     963            0 :       : eventId = json['event_id'] as String,
     964            0 :         originServerTs = json['origin_server_ts'] as int;
     965            0 :   Map<String, Object?> toJson() => {
     966            0 :         'event_id': eventId,
     967            0 :         'origin_server_ts': originServerTs,
     968              :       };
     969              : 
     970              :   /// The ID of the event found
     971              :   String eventId;
     972              : 
     973              :   /// The event's timestamp, in milliseconds since the Unix epoch.
     974              :   /// This makes it easy to do a quick comparison to see if the
     975              :   /// `event_id` fetched is too far out of range to be useful for your
     976              :   /// use case.
     977              :   int originServerTs;
     978              : 
     979            0 :   @dart.override
     980              :   bool operator ==(Object other) =>
     981              :       identical(this, other) ||
     982            0 :       (other is GetEventByTimestampResponse &&
     983            0 :           other.runtimeType == runtimeType &&
     984            0 :           other.eventId == eventId &&
     985            0 :           other.originServerTs == originServerTs);
     986              : 
     987            0 :   @dart.override
     988            0 :   int get hashCode => Object.hash(eventId, originServerTs);
     989              : }
     990              : 
     991              : ///
     992              : @_NameSource('rule override generated')
     993              : enum ThirdPartyIdentifierMedium {
     994              :   email('email'),
     995              :   msisdn('msisdn');
     996              : 
     997              :   final String name;
     998              :   const ThirdPartyIdentifierMedium(this.name);
     999              : }
    1000              : 
    1001              : ///
    1002              : @_NameSource('spec')
    1003              : class ThirdPartyIdentifier {
    1004            0 :   ThirdPartyIdentifier({
    1005              :     required this.addedAt,
    1006              :     required this.address,
    1007              :     required this.medium,
    1008              :     required this.validatedAt,
    1009              :   });
    1010              : 
    1011            0 :   ThirdPartyIdentifier.fromJson(Map<String, Object?> json)
    1012            0 :       : addedAt = json['added_at'] as int,
    1013            0 :         address = json['address'] as String,
    1014              :         medium = ThirdPartyIdentifierMedium.values
    1015            0 :             .fromString(json['medium'] as String)!,
    1016            0 :         validatedAt = json['validated_at'] as int;
    1017            0 :   Map<String, Object?> toJson() => {
    1018            0 :         'added_at': addedAt,
    1019            0 :         'address': address,
    1020            0 :         'medium': medium.name,
    1021            0 :         'validated_at': validatedAt,
    1022              :       };
    1023              : 
    1024              :   /// The timestamp, in milliseconds, when the homeserver associated the third-party identifier with the user.
    1025              :   int addedAt;
    1026              : 
    1027              :   /// The third-party identifier address.
    1028              :   String address;
    1029              : 
    1030              :   /// The medium of the third-party identifier.
    1031              :   ThirdPartyIdentifierMedium medium;
    1032              : 
    1033              :   /// The timestamp, in milliseconds, when the identifier was
    1034              :   /// validated by the identity server.
    1035              :   int validatedAt;
    1036              : 
    1037            0 :   @dart.override
    1038              :   bool operator ==(Object other) =>
    1039              :       identical(this, other) ||
    1040            0 :       (other is ThirdPartyIdentifier &&
    1041            0 :           other.runtimeType == runtimeType &&
    1042            0 :           other.addedAt == addedAt &&
    1043            0 :           other.address == address &&
    1044            0 :           other.medium == medium &&
    1045            0 :           other.validatedAt == validatedAt);
    1046              : 
    1047            0 :   @dart.override
    1048            0 :   int get hashCode => Object.hash(addedAt, address, medium, validatedAt);
    1049              : }
    1050              : 
    1051              : ///
    1052              : @_NameSource('spec')
    1053              : class ThreePidCredentials {
    1054            0 :   ThreePidCredentials({
    1055              :     required this.clientSecret,
    1056              :     required this.idAccessToken,
    1057              :     required this.idServer,
    1058              :     required this.sid,
    1059              :   });
    1060              : 
    1061            0 :   ThreePidCredentials.fromJson(Map<String, Object?> json)
    1062            0 :       : clientSecret = json['client_secret'] as String,
    1063            0 :         idAccessToken = json['id_access_token'] as String,
    1064            0 :         idServer = json['id_server'] as String,
    1065            0 :         sid = json['sid'] as String;
    1066            0 :   Map<String, Object?> toJson() => {
    1067            0 :         'client_secret': clientSecret,
    1068            0 :         'id_access_token': idAccessToken,
    1069            0 :         'id_server': idServer,
    1070            0 :         'sid': sid,
    1071              :       };
    1072              : 
    1073              :   /// The client secret used in the session with the identity server.
    1074              :   String clientSecret;
    1075              : 
    1076              :   /// An access token previously registered with the identity server. Servers
    1077              :   /// can treat this as optional to distinguish between r0.5-compatible clients
    1078              :   /// and this specification version.
    1079              :   String idAccessToken;
    1080              : 
    1081              :   /// The identity server to use.
    1082              :   String idServer;
    1083              : 
    1084              :   /// The session identifier given by the identity server.
    1085              :   String sid;
    1086              : 
    1087            0 :   @dart.override
    1088              :   bool operator ==(Object other) =>
    1089              :       identical(this, other) ||
    1090            0 :       (other is ThreePidCredentials &&
    1091            0 :           other.runtimeType == runtimeType &&
    1092            0 :           other.clientSecret == clientSecret &&
    1093            0 :           other.idAccessToken == idAccessToken &&
    1094            0 :           other.idServer == idServer &&
    1095            0 :           other.sid == sid);
    1096              : 
    1097            0 :   @dart.override
    1098            0 :   int get hashCode => Object.hash(clientSecret, idAccessToken, idServer, sid);
    1099              : }
    1100              : 
    1101              : ///
    1102              : @_NameSource('generated')
    1103              : enum IdServerUnbindResult {
    1104              :   noSupport('no-support'),
    1105              :   success('success');
    1106              : 
    1107              :   final String name;
    1108              :   const IdServerUnbindResult(this.name);
    1109              : }
    1110              : 
    1111              : ///
    1112              : @_NameSource('spec')
    1113              : class RequestTokenResponse {
    1114            0 :   RequestTokenResponse({
    1115              :     required this.sid,
    1116              :     this.submitUrl,
    1117              :   });
    1118              : 
    1119            0 :   RequestTokenResponse.fromJson(Map<String, Object?> json)
    1120            0 :       : sid = json['sid'] as String,
    1121            0 :         submitUrl = ((v) =>
    1122            0 :             v != null ? Uri.parse(v as String) : null)(json['submit_url']);
    1123            0 :   Map<String, Object?> toJson() {
    1124            0 :     final submitUrl = this.submitUrl;
    1125            0 :     return {
    1126            0 :       'sid': sid,
    1127            0 :       if (submitUrl != null) 'submit_url': submitUrl.toString(),
    1128              :     };
    1129              :   }
    1130              : 
    1131              :   /// The session ID. Session IDs are opaque strings that must consist entirely
    1132              :   /// of the characters `[0-9a-zA-Z.=_-]`. Their length must not exceed 255
    1133              :   /// characters and they must not be empty.
    1134              :   String sid;
    1135              : 
    1136              :   /// An optional field containing a URL where the client must submit the
    1137              :   /// validation token to, with identical parameters to the Identity Service
    1138              :   /// API's `POST /validate/email/submitToken` endpoint (without the requirement
    1139              :   /// for an access token). The homeserver must send this token to the user (if
    1140              :   /// applicable), who should then be prompted to provide it to the client.
    1141              :   ///
    1142              :   /// If this field is not present, the client can assume that verification
    1143              :   /// will happen without the client's involvement provided the homeserver
    1144              :   /// advertises this specification version in the `/versions` response
    1145              :   /// (ie: r0.5.0).
    1146              :   Uri? submitUrl;
    1147              : 
    1148            0 :   @dart.override
    1149              :   bool operator ==(Object other) =>
    1150              :       identical(this, other) ||
    1151            0 :       (other is RequestTokenResponse &&
    1152            0 :           other.runtimeType == runtimeType &&
    1153            0 :           other.sid == sid &&
    1154            0 :           other.submitUrl == submitUrl);
    1155              : 
    1156            0 :   @dart.override
    1157            0 :   int get hashCode => Object.hash(sid, submitUrl);
    1158              : }
    1159              : 
    1160              : ///
    1161              : @_NameSource('rule override generated')
    1162              : class TokenOwnerInfo {
    1163            0 :   TokenOwnerInfo({
    1164              :     this.deviceId,
    1165              :     this.isGuest,
    1166              :     required this.userId,
    1167              :   });
    1168              : 
    1169            0 :   TokenOwnerInfo.fromJson(Map<String, Object?> json)
    1170            0 :       : deviceId = ((v) => v != null ? v as String : null)(json['device_id']),
    1171            0 :         isGuest = ((v) => v != null ? v as bool : null)(json['is_guest']),
    1172            0 :         userId = json['user_id'] as String;
    1173            0 :   Map<String, Object?> toJson() {
    1174            0 :     final deviceId = this.deviceId;
    1175            0 :     final isGuest = this.isGuest;
    1176            0 :     return {
    1177            0 :       if (deviceId != null) 'device_id': deviceId,
    1178            0 :       if (isGuest != null) 'is_guest': isGuest,
    1179            0 :       'user_id': userId,
    1180              :     };
    1181              :   }
    1182              : 
    1183              :   /// Device ID associated with the access token. If no device
    1184              :   /// is associated with the access token (such as in the case
    1185              :   /// of application services) then this field can be omitted.
    1186              :   /// Otherwise this is required.
    1187              :   String? deviceId;
    1188              : 
    1189              :   /// When `true`, the user is a [Guest User](https://spec.matrix.org/unstable/client-server-api/#guest-access).
    1190              :   /// When not present or `false`, the user is presumed to be a
    1191              :   /// non-guest user.
    1192              :   bool? isGuest;
    1193              : 
    1194              :   /// The user ID that owns the access token.
    1195              :   String userId;
    1196              : 
    1197            0 :   @dart.override
    1198              :   bool operator ==(Object other) =>
    1199              :       identical(this, other) ||
    1200            0 :       (other is TokenOwnerInfo &&
    1201            0 :           other.runtimeType == runtimeType &&
    1202            0 :           other.deviceId == deviceId &&
    1203            0 :           other.isGuest == isGuest &&
    1204            0 :           other.userId == userId);
    1205              : 
    1206            0 :   @dart.override
    1207            0 :   int get hashCode => Object.hash(deviceId, isGuest, userId);
    1208              : }
    1209              : 
    1210              : ///
    1211              : @_NameSource('spec')
    1212              : class ConnectionInfo {
    1213            0 :   ConnectionInfo({
    1214              :     this.ip,
    1215              :     this.lastSeen,
    1216              :     this.userAgent,
    1217              :   });
    1218              : 
    1219            0 :   ConnectionInfo.fromJson(Map<String, Object?> json)
    1220            0 :       : ip = ((v) => v != null ? v as String : null)(json['ip']),
    1221            0 :         lastSeen = ((v) => v != null ? v as int : null)(json['last_seen']),
    1222            0 :         userAgent = ((v) => v != null ? v as String : null)(json['user_agent']);
    1223            0 :   Map<String, Object?> toJson() {
    1224            0 :     final ip = this.ip;
    1225            0 :     final lastSeen = this.lastSeen;
    1226            0 :     final userAgent = this.userAgent;
    1227            0 :     return {
    1228            0 :       if (ip != null) 'ip': ip,
    1229            0 :       if (lastSeen != null) 'last_seen': lastSeen,
    1230            0 :       if (userAgent != null) 'user_agent': userAgent,
    1231              :     };
    1232              :   }
    1233              : 
    1234              :   /// Most recently seen IP address of the session.
    1235              :   String? ip;
    1236              : 
    1237              :   /// Unix timestamp that the session was last active.
    1238              :   int? lastSeen;
    1239              : 
    1240              :   /// User agent string last seen in the session.
    1241              :   String? userAgent;
    1242              : 
    1243            0 :   @dart.override
    1244              :   bool operator ==(Object other) =>
    1245              :       identical(this, other) ||
    1246            0 :       (other is ConnectionInfo &&
    1247            0 :           other.runtimeType == runtimeType &&
    1248            0 :           other.ip == ip &&
    1249            0 :           other.lastSeen == lastSeen &&
    1250            0 :           other.userAgent == userAgent);
    1251              : 
    1252            0 :   @dart.override
    1253            0 :   int get hashCode => Object.hash(ip, lastSeen, userAgent);
    1254              : }
    1255              : 
    1256              : ///
    1257              : @_NameSource('spec')
    1258              : class SessionInfo {
    1259            0 :   SessionInfo({
    1260              :     this.connections,
    1261              :   });
    1262              : 
    1263            0 :   SessionInfo.fromJson(Map<String, Object?> json)
    1264            0 :       : connections = ((v) => v != null
    1265              :             ? (v as List)
    1266            0 :                 .map((v) => ConnectionInfo.fromJson(v as Map<String, Object?>))
    1267            0 :                 .toList()
    1268            0 :             : null)(json['connections']);
    1269            0 :   Map<String, Object?> toJson() {
    1270            0 :     final connections = this.connections;
    1271            0 :     return {
    1272              :       if (connections != null)
    1273            0 :         'connections': connections.map((v) => v.toJson()).toList(),
    1274              :     };
    1275              :   }
    1276              : 
    1277              :   /// Information particular connections in the session.
    1278              :   List<ConnectionInfo>? connections;
    1279              : 
    1280            0 :   @dart.override
    1281              :   bool operator ==(Object other) =>
    1282              :       identical(this, other) ||
    1283            0 :       (other is SessionInfo &&
    1284            0 :           other.runtimeType == runtimeType &&
    1285            0 :           other.connections == connections);
    1286              : 
    1287            0 :   @dart.override
    1288            0 :   int get hashCode => connections.hashCode;
    1289              : }
    1290              : 
    1291              : ///
    1292              : @_NameSource('spec')
    1293              : class DeviceInfo {
    1294            0 :   DeviceInfo({
    1295              :     this.sessions,
    1296              :   });
    1297              : 
    1298            0 :   DeviceInfo.fromJson(Map<String, Object?> json)
    1299            0 :       : sessions = ((v) => v != null
    1300              :             ? (v as List)
    1301            0 :                 .map((v) => SessionInfo.fromJson(v as Map<String, Object?>))
    1302            0 :                 .toList()
    1303            0 :             : null)(json['sessions']);
    1304            0 :   Map<String, Object?> toJson() {
    1305            0 :     final sessions = this.sessions;
    1306            0 :     return {
    1307              :       if (sessions != null)
    1308            0 :         'sessions': sessions.map((v) => v.toJson()).toList(),
    1309              :     };
    1310              :   }
    1311              : 
    1312              :   /// A user's sessions (i.e. what they did with an access token from one login).
    1313              :   List<SessionInfo>? sessions;
    1314              : 
    1315            0 :   @dart.override
    1316              :   bool operator ==(Object other) =>
    1317              :       identical(this, other) ||
    1318            0 :       (other is DeviceInfo &&
    1319            0 :           other.runtimeType == runtimeType &&
    1320            0 :           other.sessions == sessions);
    1321              : 
    1322            0 :   @dart.override
    1323            0 :   int get hashCode => sessions.hashCode;
    1324              : }
    1325              : 
    1326              : ///
    1327              : @_NameSource('rule override generated')
    1328              : class WhoIsInfo {
    1329            0 :   WhoIsInfo({
    1330              :     this.devices,
    1331              :     this.userId,
    1332              :   });
    1333              : 
    1334            0 :   WhoIsInfo.fromJson(Map<String, Object?> json)
    1335            0 :       : devices = ((v) => v != null
    1336            0 :             ? (v as Map<String, Object?>).map(
    1337            0 :                 (k, v) =>
    1338            0 :                     MapEntry(k, DeviceInfo.fromJson(v as Map<String, Object?>)),
    1339              :               )
    1340            0 :             : null)(json['devices']),
    1341            0 :         userId = ((v) => v != null ? v as String : null)(json['user_id']);
    1342            0 :   Map<String, Object?> toJson() {
    1343            0 :     final devices = this.devices;
    1344            0 :     final userId = this.userId;
    1345            0 :     return {
    1346              :       if (devices != null)
    1347            0 :         'devices': devices.map((k, v) => MapEntry(k, v.toJson())),
    1348            0 :       if (userId != null) 'user_id': userId,
    1349              :     };
    1350              :   }
    1351              : 
    1352              :   /// Each key is an identifier for one of the user's devices.
    1353              :   Map<String, DeviceInfo>? devices;
    1354              : 
    1355              :   /// The Matrix user ID of the user.
    1356              :   String? userId;
    1357              : 
    1358            0 :   @dart.override
    1359              :   bool operator ==(Object other) =>
    1360              :       identical(this, other) ||
    1361            0 :       (other is WhoIsInfo &&
    1362            0 :           other.runtimeType == runtimeType &&
    1363            0 :           other.devices == devices &&
    1364            0 :           other.userId == userId);
    1365              : 
    1366            0 :   @dart.override
    1367            0 :   int get hashCode => Object.hash(devices, userId);
    1368              : }
    1369              : 
    1370              : ///
    1371              : @_NameSource('spec')
    1372              : class BooleanCapability {
    1373            0 :   BooleanCapability({
    1374              :     required this.enabled,
    1375              :   });
    1376              : 
    1377            0 :   BooleanCapability.fromJson(Map<String, Object?> json)
    1378            0 :       : enabled = json['enabled'] as bool;
    1379            0 :   Map<String, Object?> toJson() => {
    1380            0 :         'enabled': enabled,
    1381              :       };
    1382              : 
    1383              :   /// True if the user can perform the action, false otherwise.
    1384              :   bool enabled;
    1385              : 
    1386            0 :   @dart.override
    1387              :   bool operator ==(Object other) =>
    1388              :       identical(this, other) ||
    1389            0 :       (other is BooleanCapability &&
    1390            0 :           other.runtimeType == runtimeType &&
    1391            0 :           other.enabled == enabled);
    1392              : 
    1393            0 :   @dart.override
    1394            0 :   int get hashCode => enabled.hashCode;
    1395              : }
    1396              : 
    1397              : /// The stability of the room version.
    1398              : @_NameSource('rule override generated')
    1399              : enum RoomVersionAvailable {
    1400              :   stable('stable'),
    1401              :   unstable('unstable');
    1402              : 
    1403              :   final String name;
    1404              :   const RoomVersionAvailable(this.name);
    1405              : }
    1406              : 
    1407              : ///
    1408              : @_NameSource('spec')
    1409              : class RoomVersionsCapability {
    1410            0 :   RoomVersionsCapability({
    1411              :     required this.available,
    1412              :     required this.default$,
    1413              :   });
    1414              : 
    1415            0 :   RoomVersionsCapability.fromJson(Map<String, Object?> json)
    1416            0 :       : available = (json['available'] as Map<String, Object?>).map(
    1417            0 :           (k, v) =>
    1418            0 :               MapEntry(k, RoomVersionAvailable.values.fromString(v as String)!),
    1419              :         ),
    1420            0 :         default$ = json['default'] as String;
    1421            0 :   Map<String, Object?> toJson() => {
    1422            0 :         'available': available.map((k, v) => MapEntry(k, v.name)),
    1423            0 :         'default': default$,
    1424              :       };
    1425              : 
    1426              :   /// A detailed description of the room versions the server supports.
    1427              :   Map<String, RoomVersionAvailable> available;
    1428              : 
    1429              :   /// The default room version the server is using for new rooms.
    1430              :   String default$;
    1431              : 
    1432            0 :   @dart.override
    1433              :   bool operator ==(Object other) =>
    1434              :       identical(this, other) ||
    1435            0 :       (other is RoomVersionsCapability &&
    1436            0 :           other.runtimeType == runtimeType &&
    1437            0 :           other.available == available &&
    1438            0 :           other.default$ == default$);
    1439              : 
    1440            0 :   @dart.override
    1441            0 :   int get hashCode => Object.hash(available, default$);
    1442              : }
    1443              : 
    1444              : ///
    1445              : @_NameSource('spec')
    1446              : class Capabilities {
    1447            0 :   Capabilities({
    1448              :     this.m3pidChanges,
    1449              :     this.mChangePassword,
    1450              :     this.mGetLoginToken,
    1451              :     this.mRoomVersions,
    1452              :     this.mSetAvatarUrl,
    1453              :     this.mSetDisplayname,
    1454              :     this.additionalProperties = const {},
    1455              :   });
    1456              : 
    1457            0 :   Capabilities.fromJson(Map<String, Object?> json)
    1458            0 :       : m3pidChanges = ((v) => v != null
    1459            0 :             ? BooleanCapability.fromJson(v as Map<String, Object?>)
    1460            0 :             : null)(json['m.3pid_changes']),
    1461            0 :         mChangePassword = ((v) => v != null
    1462            0 :             ? BooleanCapability.fromJson(v as Map<String, Object?>)
    1463            0 :             : null)(json['m.change_password']),
    1464            0 :         mGetLoginToken = ((v) => v != null
    1465            0 :             ? BooleanCapability.fromJson(v as Map<String, Object?>)
    1466            0 :             : null)(json['m.get_login_token']),
    1467            0 :         mRoomVersions = ((v) => v != null
    1468            0 :             ? RoomVersionsCapability.fromJson(v as Map<String, Object?>)
    1469            0 :             : null)(json['m.room_versions']),
    1470            0 :         mSetAvatarUrl = ((v) => v != null
    1471            0 :             ? BooleanCapability.fromJson(v as Map<String, Object?>)
    1472            0 :             : null)(json['m.set_avatar_url']),
    1473            0 :         mSetDisplayname = ((v) => v != null
    1474            0 :             ? BooleanCapability.fromJson(v as Map<String, Object?>)
    1475            0 :             : null)(json['m.set_displayname']),
    1476            0 :         additionalProperties = Map.fromEntries(
    1477            0 :           json.entries
    1478            0 :               .where(
    1479            0 :                 (e) => ![
    1480              :                   'm.3pid_changes',
    1481              :                   'm.change_password',
    1482              :                   'm.get_login_token',
    1483              :                   'm.room_versions',
    1484              :                   'm.set_avatar_url',
    1485              :                   'm.set_displayname',
    1486            0 :                 ].contains(e.key),
    1487              :               )
    1488            0 :               .map((e) => MapEntry(e.key, e.value)),
    1489              :         );
    1490            0 :   Map<String, Object?> toJson() {
    1491            0 :     final m3pidChanges = this.m3pidChanges;
    1492            0 :     final mChangePassword = this.mChangePassword;
    1493            0 :     final mGetLoginToken = this.mGetLoginToken;
    1494            0 :     final mRoomVersions = this.mRoomVersions;
    1495            0 :     final mSetAvatarUrl = this.mSetAvatarUrl;
    1496            0 :     final mSetDisplayname = this.mSetDisplayname;
    1497            0 :     return {
    1498            0 :       ...additionalProperties,
    1499            0 :       if (m3pidChanges != null) 'm.3pid_changes': m3pidChanges.toJson(),
    1500              :       if (mChangePassword != null)
    1501            0 :         'm.change_password': mChangePassword.toJson(),
    1502            0 :       if (mGetLoginToken != null) 'm.get_login_token': mGetLoginToken.toJson(),
    1503            0 :       if (mRoomVersions != null) 'm.room_versions': mRoomVersions.toJson(),
    1504            0 :       if (mSetAvatarUrl != null) 'm.set_avatar_url': mSetAvatarUrl.toJson(),
    1505              :       if (mSetDisplayname != null)
    1506            0 :         'm.set_displayname': mSetDisplayname.toJson(),
    1507              :     };
    1508              :   }
    1509              : 
    1510              :   /// Capability to indicate if the user can change 3PID associations on their account.
    1511              :   BooleanCapability? m3pidChanges;
    1512              : 
    1513              :   /// Capability to indicate if the user can change their password.
    1514              :   BooleanCapability? mChangePassword;
    1515              : 
    1516              :   /// Capability to indicate if the user can generate tokens to log further clients into their account.
    1517              :   BooleanCapability? mGetLoginToken;
    1518              : 
    1519              :   /// The room versions the server supports.
    1520              :   RoomVersionsCapability? mRoomVersions;
    1521              : 
    1522              :   /// Capability to indicate if the user can change their avatar.
    1523              :   BooleanCapability? mSetAvatarUrl;
    1524              : 
    1525              :   /// Capability to indicate if the user can change their display name.
    1526              :   BooleanCapability? mSetDisplayname;
    1527              : 
    1528              :   Map<String, Object?> additionalProperties;
    1529              : 
    1530            0 :   @dart.override
    1531              :   bool operator ==(Object other) =>
    1532              :       identical(this, other) ||
    1533            0 :       (other is Capabilities &&
    1534            0 :           other.runtimeType == runtimeType &&
    1535            0 :           other.m3pidChanges == m3pidChanges &&
    1536            0 :           other.mChangePassword == mChangePassword &&
    1537            0 :           other.mGetLoginToken == mGetLoginToken &&
    1538            0 :           other.mRoomVersions == mRoomVersions &&
    1539            0 :           other.mSetAvatarUrl == mSetAvatarUrl &&
    1540            0 :           other.mSetDisplayname == mSetDisplayname);
    1541              : 
    1542            0 :   @dart.override
    1543            0 :   int get hashCode => Object.hash(
    1544            0 :         m3pidChanges,
    1545            0 :         mChangePassword,
    1546            0 :         mGetLoginToken,
    1547            0 :         mRoomVersions,
    1548            0 :         mSetAvatarUrl,
    1549            0 :         mSetDisplayname,
    1550              :       );
    1551              : }
    1552              : 
    1553              : ///
    1554              : @_NameSource('spec')
    1555              : class StateEvent {
    1556            2 :   StateEvent({
    1557              :     required this.content,
    1558              :     this.stateKey,
    1559              :     required this.type,
    1560              :   });
    1561              : 
    1562            0 :   StateEvent.fromJson(Map<String, Object?> json)
    1563            0 :       : content = json['content'] as Map<String, Object?>,
    1564            0 :         stateKey = ((v) => v != null ? v as String : null)(json['state_key']),
    1565            0 :         type = json['type'] as String;
    1566            2 :   Map<String, Object?> toJson() {
    1567            2 :     final stateKey = this.stateKey;
    1568            2 :     return {
    1569            4 :       'content': content,
    1570            0 :       if (stateKey != null) 'state_key': stateKey,
    1571            4 :       'type': type,
    1572              :     };
    1573              :   }
    1574              : 
    1575              :   /// The content of the event.
    1576              :   Map<String, Object?> content;
    1577              : 
    1578              :   /// The state_key of the state event. Defaults to an empty string.
    1579              :   String? stateKey;
    1580              : 
    1581              :   /// The type of event to send.
    1582              :   String type;
    1583              : 
    1584            0 :   @dart.override
    1585              :   bool operator ==(Object other) =>
    1586              :       identical(this, other) ||
    1587            0 :       (other is StateEvent &&
    1588            0 :           other.runtimeType == runtimeType &&
    1589            0 :           other.content == content &&
    1590            0 :           other.stateKey == stateKey &&
    1591            0 :           other.type == type);
    1592              : 
    1593            0 :   @dart.override
    1594            0 :   int get hashCode => Object.hash(content, stateKey, type);
    1595              : }
    1596              : 
    1597              : ///
    1598              : @_NameSource('spec')
    1599              : class Invite3pid {
    1600            0 :   Invite3pid({
    1601              :     required this.address,
    1602              :     required this.idAccessToken,
    1603              :     required this.idServer,
    1604              :     required this.medium,
    1605              :   });
    1606              : 
    1607            0 :   Invite3pid.fromJson(Map<String, Object?> json)
    1608            0 :       : address = json['address'] as String,
    1609            0 :         idAccessToken = json['id_access_token'] as String,
    1610            0 :         idServer = json['id_server'] as String,
    1611            0 :         medium = json['medium'] as String;
    1612            0 :   Map<String, Object?> toJson() => {
    1613            0 :         'address': address,
    1614            0 :         'id_access_token': idAccessToken,
    1615            0 :         'id_server': idServer,
    1616            0 :         'medium': medium,
    1617              :       };
    1618              : 
    1619              :   /// The invitee's third-party identifier.
    1620              :   String address;
    1621              : 
    1622              :   /// An access token previously registered with the identity server. Servers
    1623              :   /// can treat this as optional to distinguish between r0.5-compatible clients
    1624              :   /// and this specification version.
    1625              :   String idAccessToken;
    1626              : 
    1627              :   /// The hostname+port of the identity server which should be used for third-party identifier lookups.
    1628              :   String idServer;
    1629              : 
    1630              :   /// The kind of address being passed in the address field, for example `email`
    1631              :   /// (see [the list of recognised values](https://spec.matrix.org/unstable/appendices/#3pid-types)).
    1632              :   String medium;
    1633              : 
    1634            0 :   @dart.override
    1635              :   bool operator ==(Object other) =>
    1636              :       identical(this, other) ||
    1637            0 :       (other is Invite3pid &&
    1638            0 :           other.runtimeType == runtimeType &&
    1639            0 :           other.address == address &&
    1640            0 :           other.idAccessToken == idAccessToken &&
    1641            0 :           other.idServer == idServer &&
    1642            0 :           other.medium == medium);
    1643              : 
    1644            0 :   @dart.override
    1645            0 :   int get hashCode => Object.hash(address, idAccessToken, idServer, medium);
    1646              : }
    1647              : 
    1648              : ///
    1649              : @_NameSource('rule override generated')
    1650              : enum CreateRoomPreset {
    1651              :   privateChat('private_chat'),
    1652              :   publicChat('public_chat'),
    1653              :   trustedPrivateChat('trusted_private_chat');
    1654              : 
    1655              :   final String name;
    1656              :   const CreateRoomPreset(this.name);
    1657              : }
    1658              : 
    1659              : ///
    1660              : @_NameSource('generated')
    1661              : enum Visibility {
    1662              :   private('private'),
    1663              :   public('public');
    1664              : 
    1665              :   final String name;
    1666              :   const Visibility(this.name);
    1667              : }
    1668              : 
    1669              : /// A client device
    1670              : @_NameSource('spec')
    1671              : class Device {
    1672            0 :   Device({
    1673              :     required this.deviceId,
    1674              :     this.displayName,
    1675              :     this.lastSeenIp,
    1676              :     this.lastSeenTs,
    1677              :   });
    1678              : 
    1679            0 :   Device.fromJson(Map<String, Object?> json)
    1680            0 :       : deviceId = json['device_id'] as String,
    1681              :         displayName =
    1682            0 :             ((v) => v != null ? v as String : null)(json['display_name']),
    1683              :         lastSeenIp =
    1684            0 :             ((v) => v != null ? v as String : null)(json['last_seen_ip']),
    1685            0 :         lastSeenTs = ((v) => v != null ? v as int : null)(json['last_seen_ts']);
    1686            0 :   Map<String, Object?> toJson() {
    1687            0 :     final displayName = this.displayName;
    1688            0 :     final lastSeenIp = this.lastSeenIp;
    1689            0 :     final lastSeenTs = this.lastSeenTs;
    1690            0 :     return {
    1691            0 :       'device_id': deviceId,
    1692            0 :       if (displayName != null) 'display_name': displayName,
    1693            0 :       if (lastSeenIp != null) 'last_seen_ip': lastSeenIp,
    1694            0 :       if (lastSeenTs != null) 'last_seen_ts': lastSeenTs,
    1695              :     };
    1696              :   }
    1697              : 
    1698              :   /// Identifier of this device.
    1699              :   String deviceId;
    1700              : 
    1701              :   /// Display name set by the user for this device. Absent if no name has been
    1702              :   /// set.
    1703              :   String? displayName;
    1704              : 
    1705              :   /// The IP address where this device was last seen. (May be a few minutes out
    1706              :   /// of date, for efficiency reasons).
    1707              :   String? lastSeenIp;
    1708              : 
    1709              :   /// The timestamp (in milliseconds since the unix epoch) when this devices
    1710              :   /// was last seen. (May be a few minutes out of date, for efficiency
    1711              :   /// reasons).
    1712              :   int? lastSeenTs;
    1713              : 
    1714            0 :   @dart.override
    1715              :   bool operator ==(Object other) =>
    1716              :       identical(this, other) ||
    1717            0 :       (other is Device &&
    1718            0 :           other.runtimeType == runtimeType &&
    1719            0 :           other.deviceId == deviceId &&
    1720            0 :           other.displayName == displayName &&
    1721            0 :           other.lastSeenIp == lastSeenIp &&
    1722            0 :           other.lastSeenTs == lastSeenTs);
    1723              : 
    1724            0 :   @dart.override
    1725              :   int get hashCode =>
    1726            0 :       Object.hash(deviceId, displayName, lastSeenIp, lastSeenTs);
    1727              : }
    1728              : 
    1729              : ///
    1730              : @_NameSource('generated')
    1731              : class GetRoomIdByAliasResponse {
    1732            0 :   GetRoomIdByAliasResponse({
    1733              :     this.roomId,
    1734              :     this.servers,
    1735              :   });
    1736              : 
    1737            0 :   GetRoomIdByAliasResponse.fromJson(Map<String, Object?> json)
    1738            0 :       : roomId = ((v) => v != null ? v as String : null)(json['room_id']),
    1739            0 :         servers = ((v) => v != null
    1740            0 :             ? (v as List).map((v) => v as String).toList()
    1741            0 :             : null)(json['servers']);
    1742            0 :   Map<String, Object?> toJson() {
    1743            0 :     final roomId = this.roomId;
    1744            0 :     final servers = this.servers;
    1745            0 :     return {
    1746            0 :       if (roomId != null) 'room_id': roomId,
    1747            0 :       if (servers != null) 'servers': servers.map((v) => v).toList(),
    1748              :     };
    1749              :   }
    1750              : 
    1751              :   /// The room ID for this room alias.
    1752              :   String? roomId;
    1753              : 
    1754              :   /// A list of servers that are aware of this room alias.
    1755              :   List<String>? servers;
    1756              : 
    1757            0 :   @dart.override
    1758              :   bool operator ==(Object other) =>
    1759              :       identical(this, other) ||
    1760            0 :       (other is GetRoomIdByAliasResponse &&
    1761            0 :           other.runtimeType == runtimeType &&
    1762            0 :           other.roomId == roomId &&
    1763            0 :           other.servers == servers);
    1764              : 
    1765            0 :   @dart.override
    1766            0 :   int get hashCode => Object.hash(roomId, servers);
    1767              : }
    1768              : 
    1769              : ///
    1770              : @_NameSource('generated')
    1771              : class GetEventsResponse {
    1772            0 :   GetEventsResponse({
    1773              :     this.chunk,
    1774              :     this.end,
    1775              :     this.start,
    1776              :   });
    1777              : 
    1778            0 :   GetEventsResponse.fromJson(Map<String, Object?> json)
    1779            0 :       : chunk = ((v) => v != null
    1780              :             ? (v as List)
    1781            0 :                 .map((v) => MatrixEvent.fromJson(v as Map<String, Object?>))
    1782            0 :                 .toList()
    1783            0 :             : null)(json['chunk']),
    1784            0 :         end = ((v) => v != null ? v as String : null)(json['end']),
    1785            0 :         start = ((v) => v != null ? v as String : null)(json['start']);
    1786            0 :   Map<String, Object?> toJson() {
    1787            0 :     final chunk = this.chunk;
    1788            0 :     final end = this.end;
    1789            0 :     final start = this.start;
    1790            0 :     return {
    1791            0 :       if (chunk != null) 'chunk': chunk.map((v) => v.toJson()).toList(),
    1792            0 :       if (end != null) 'end': end,
    1793            0 :       if (start != null) 'start': start,
    1794              :     };
    1795              :   }
    1796              : 
    1797              :   /// An array of events.
    1798              :   List<MatrixEvent>? chunk;
    1799              : 
    1800              :   /// A token which correlates to the end of `chunk`. This
    1801              :   /// token should be used in the next request to `/events`.
    1802              :   String? end;
    1803              : 
    1804              :   /// A token which correlates to the start of `chunk`. This
    1805              :   /// is usually the same token supplied to `from=`.
    1806              :   String? start;
    1807              : 
    1808            0 :   @dart.override
    1809              :   bool operator ==(Object other) =>
    1810              :       identical(this, other) ||
    1811            0 :       (other is GetEventsResponse &&
    1812            0 :           other.runtimeType == runtimeType &&
    1813            0 :           other.chunk == chunk &&
    1814            0 :           other.end == end &&
    1815            0 :           other.start == start);
    1816              : 
    1817            0 :   @dart.override
    1818            0 :   int get hashCode => Object.hash(chunk, end, start);
    1819              : }
    1820              : 
    1821              : ///
    1822              : @_NameSource('generated')
    1823              : class PeekEventsResponse {
    1824            0 :   PeekEventsResponse({
    1825              :     this.chunk,
    1826              :     this.end,
    1827              :     this.start,
    1828              :   });
    1829              : 
    1830            0 :   PeekEventsResponse.fromJson(Map<String, Object?> json)
    1831            0 :       : chunk = ((v) => v != null
    1832              :             ? (v as List)
    1833            0 :                 .map((v) => MatrixEvent.fromJson(v as Map<String, Object?>))
    1834            0 :                 .toList()
    1835            0 :             : null)(json['chunk']),
    1836            0 :         end = ((v) => v != null ? v as String : null)(json['end']),
    1837            0 :         start = ((v) => v != null ? v as String : null)(json['start']);
    1838            0 :   Map<String, Object?> toJson() {
    1839            0 :     final chunk = this.chunk;
    1840            0 :     final end = this.end;
    1841            0 :     final start = this.start;
    1842            0 :     return {
    1843            0 :       if (chunk != null) 'chunk': chunk.map((v) => v.toJson()).toList(),
    1844            0 :       if (end != null) 'end': end,
    1845            0 :       if (start != null) 'start': start,
    1846              :     };
    1847              :   }
    1848              : 
    1849              :   /// An array of events.
    1850              :   List<MatrixEvent>? chunk;
    1851              : 
    1852              :   /// A token which correlates to the last value in `chunk`. This
    1853              :   /// token should be used in the next request to `/events`.
    1854              :   String? end;
    1855              : 
    1856              :   /// A token which correlates to the first value in `chunk`. This
    1857              :   /// is usually the same token supplied to `from=`.
    1858              :   String? start;
    1859              : 
    1860            0 :   @dart.override
    1861              :   bool operator ==(Object other) =>
    1862              :       identical(this, other) ||
    1863            0 :       (other is PeekEventsResponse &&
    1864            0 :           other.runtimeType == runtimeType &&
    1865            0 :           other.chunk == chunk &&
    1866            0 :           other.end == end &&
    1867            0 :           other.start == start);
    1868              : 
    1869            0 :   @dart.override
    1870            0 :   int get hashCode => Object.hash(chunk, end, start);
    1871              : }
    1872              : 
    1873              : /// A signature of an `m.third_party_invite` token to prove that this user
    1874              : /// owns a third-party identity which has been invited to the room.
    1875              : @_NameSource('spec')
    1876              : class ThirdPartySigned {
    1877            0 :   ThirdPartySigned({
    1878              :     required this.mxid,
    1879              :     required this.sender,
    1880              :     required this.signatures,
    1881              :     required this.token,
    1882              :   });
    1883              : 
    1884            0 :   ThirdPartySigned.fromJson(Map<String, Object?> json)
    1885            0 :       : mxid = json['mxid'] as String,
    1886            0 :         sender = json['sender'] as String,
    1887            0 :         signatures = (json['signatures'] as Map<String, Object?>).map(
    1888            0 :           (k, v) => MapEntry(
    1889              :             k,
    1890            0 :             (v as Map<String, Object?>).map((k, v) => MapEntry(k, v as String)),
    1891              :           ),
    1892              :         ),
    1893            0 :         token = json['token'] as String;
    1894            0 :   Map<String, Object?> toJson() => {
    1895            0 :         'mxid': mxid,
    1896            0 :         'sender': sender,
    1897            0 :         'signatures': signatures
    1898            0 :             .map((k, v) => MapEntry(k, v.map((k, v) => MapEntry(k, v)))),
    1899            0 :         'token': token,
    1900              :       };
    1901              : 
    1902              :   /// The Matrix ID of the invitee.
    1903              :   String mxid;
    1904              : 
    1905              :   /// The Matrix ID of the user who issued the invite.
    1906              :   String sender;
    1907              : 
    1908              :   /// A signatures object containing a signature of the entire signed object.
    1909              :   Map<String, Map<String, String>> signatures;
    1910              : 
    1911              :   /// The state key of the m.third_party_invite event.
    1912              :   String token;
    1913              : 
    1914            0 :   @dart.override
    1915              :   bool operator ==(Object other) =>
    1916              :       identical(this, other) ||
    1917            0 :       (other is ThirdPartySigned &&
    1918            0 :           other.runtimeType == runtimeType &&
    1919            0 :           other.mxid == mxid &&
    1920            0 :           other.sender == sender &&
    1921            0 :           other.signatures == signatures &&
    1922            0 :           other.token == token);
    1923              : 
    1924            0 :   @dart.override
    1925            0 :   int get hashCode => Object.hash(mxid, sender, signatures, token);
    1926              : }
    1927              : 
    1928              : ///
    1929              : @_NameSource('generated')
    1930              : class GetKeysChangesResponse {
    1931            0 :   GetKeysChangesResponse({
    1932              :     this.changed,
    1933              :     this.left,
    1934              :   });
    1935              : 
    1936            0 :   GetKeysChangesResponse.fromJson(Map<String, Object?> json)
    1937            0 :       : changed = ((v) => v != null
    1938            0 :             ? (v as List).map((v) => v as String).toList()
    1939            0 :             : null)(json['changed']),
    1940            0 :         left = ((v) => v != null
    1941            0 :             ? (v as List).map((v) => v as String).toList()
    1942            0 :             : null)(json['left']);
    1943            0 :   Map<String, Object?> toJson() {
    1944            0 :     final changed = this.changed;
    1945            0 :     final left = this.left;
    1946            0 :     return {
    1947            0 :       if (changed != null) 'changed': changed.map((v) => v).toList(),
    1948            0 :       if (left != null) 'left': left.map((v) => v).toList(),
    1949              :     };
    1950              :   }
    1951              : 
    1952              :   /// The Matrix User IDs of all users who updated their device
    1953              :   /// identity keys.
    1954              :   List<String>? changed;
    1955              : 
    1956              :   /// The Matrix User IDs of all users who may have left all
    1957              :   /// the end-to-end encrypted rooms they previously shared
    1958              :   /// with the user.
    1959              :   List<String>? left;
    1960              : 
    1961            0 :   @dart.override
    1962              :   bool operator ==(Object other) =>
    1963              :       identical(this, other) ||
    1964            0 :       (other is GetKeysChangesResponse &&
    1965            0 :           other.runtimeType == runtimeType &&
    1966            0 :           other.changed == changed &&
    1967            0 :           other.left == left);
    1968              : 
    1969            0 :   @dart.override
    1970            0 :   int get hashCode => Object.hash(changed, left);
    1971              : }
    1972              : 
    1973              : ///
    1974              : @_NameSource('generated')
    1975              : class ClaimKeysResponse {
    1976            0 :   ClaimKeysResponse({
    1977              :     this.failures,
    1978              :     required this.oneTimeKeys,
    1979              :   });
    1980              : 
    1981           10 :   ClaimKeysResponse.fromJson(Map<String, Object?> json)
    1982           10 :       : failures = ((v) => v != null
    1983              :             ? (v as Map<String, Object?>)
    1984           10 :                 .map((k, v) => MapEntry(k, v as Map<String, Object?>))
    1985           20 :             : null)(json['failures']),
    1986           20 :         oneTimeKeys = (json['one_time_keys'] as Map<String, Object?>).map(
    1987           20 :           (k, v) => MapEntry(
    1988              :             k,
    1989              :             (v as Map<String, Object?>)
    1990           30 :                 .map((k, v) => MapEntry(k, v as Map<String, Object?>)),
    1991              :           ),
    1992              :         );
    1993            0 :   Map<String, Object?> toJson() {
    1994            0 :     final failures = this.failures;
    1995            0 :     return {
    1996            0 :       if (failures != null) 'failures': failures.map((k, v) => MapEntry(k, v)),
    1997            0 :       'one_time_keys': oneTimeKeys
    1998            0 :           .map((k, v) => MapEntry(k, v.map((k, v) => MapEntry(k, v)))),
    1999              :     };
    2000              :   }
    2001              : 
    2002              :   /// If any remote homeservers could not be reached, they are
    2003              :   /// recorded here. The names of the properties are the names of
    2004              :   /// the unreachable servers.
    2005              :   ///
    2006              :   /// If the homeserver could be reached, but the user or device
    2007              :   /// was unknown, no failure is recorded. Instead, the corresponding
    2008              :   /// user or device is missing from the `one_time_keys` result.
    2009              :   Map<String, Map<String, Object?>>? failures;
    2010              : 
    2011              :   /// One-time keys for the queried devices. A map from user ID, to a
    2012              :   /// map from devices to a map from `<algorithm>:<key_id>` to the key object.
    2013              :   ///
    2014              :   /// See the [key algorithms](https://spec.matrix.org/unstable/client-server-api/#key-algorithms) section for information
    2015              :   /// on the Key Object format.
    2016              :   ///
    2017              :   /// If necessary, the claimed key might be a fallback key. Fallback
    2018              :   /// keys are re-used by the server until replaced by the device.
    2019              :   Map<String, Map<String, Map<String, Object?>>> oneTimeKeys;
    2020              : 
    2021            0 :   @dart.override
    2022              :   bool operator ==(Object other) =>
    2023              :       identical(this, other) ||
    2024            0 :       (other is ClaimKeysResponse &&
    2025            0 :           other.runtimeType == runtimeType &&
    2026            0 :           other.failures == failures &&
    2027            0 :           other.oneTimeKeys == oneTimeKeys);
    2028              : 
    2029            0 :   @dart.override
    2030            0 :   int get hashCode => Object.hash(failures, oneTimeKeys);
    2031              : }
    2032              : 
    2033              : ///
    2034              : @_NameSource('generated')
    2035              : class QueryKeysResponse {
    2036            0 :   QueryKeysResponse({
    2037              :     this.deviceKeys,
    2038              :     this.failures,
    2039              :     this.masterKeys,
    2040              :     this.selfSigningKeys,
    2041              :     this.userSigningKeys,
    2042              :   });
    2043              : 
    2044           32 :   QueryKeysResponse.fromJson(Map<String, Object?> json)
    2045           32 :       : deviceKeys = ((v) => v != null
    2046           32 :             ? (v as Map<String, Object?>).map(
    2047           64 :                 (k, v) => MapEntry(
    2048              :                   k,
    2049           32 :                   (v as Map<String, Object?>).map(
    2050           64 :                     (k, v) => MapEntry(
    2051              :                       k,
    2052           32 :                       MatrixDeviceKeys.fromJson(v as Map<String, Object?>),
    2053              :                     ),
    2054              :                   ),
    2055              :                 ),
    2056              :               )
    2057           64 :             : null)(json['device_keys']),
    2058           32 :         failures = ((v) => v != null
    2059              :             ? (v as Map<String, Object?>)
    2060           32 :                 .map((k, v) => MapEntry(k, v as Map<String, Object?>))
    2061           64 :             : null)(json['failures']),
    2062           32 :         masterKeys = ((v) => v != null
    2063           32 :             ? (v as Map<String, Object?>).map(
    2064           64 :                 (k, v) => MapEntry(
    2065              :                   k,
    2066           32 :                   MatrixCrossSigningKey.fromJson(v as Map<String, Object?>),
    2067              :                 ),
    2068              :               )
    2069           64 :             : null)(json['master_keys']),
    2070           32 :         selfSigningKeys = ((v) => v != null
    2071           32 :             ? (v as Map<String, Object?>).map(
    2072           64 :                 (k, v) => MapEntry(
    2073              :                   k,
    2074           32 :                   MatrixCrossSigningKey.fromJson(v as Map<String, Object?>),
    2075              :                 ),
    2076              :               )
    2077           64 :             : null)(json['self_signing_keys']),
    2078           32 :         userSigningKeys = ((v) => v != null
    2079           32 :             ? (v as Map<String, Object?>).map(
    2080           64 :                 (k, v) => MapEntry(
    2081              :                   k,
    2082           32 :                   MatrixCrossSigningKey.fromJson(v as Map<String, Object?>),
    2083              :                 ),
    2084              :               )
    2085           64 :             : null)(json['user_signing_keys']);
    2086            0 :   Map<String, Object?> toJson() {
    2087            0 :     final deviceKeys = this.deviceKeys;
    2088            0 :     final failures = this.failures;
    2089            0 :     final masterKeys = this.masterKeys;
    2090            0 :     final selfSigningKeys = this.selfSigningKeys;
    2091            0 :     final userSigningKeys = this.userSigningKeys;
    2092            0 :     return {
    2093              :       if (deviceKeys != null)
    2094            0 :         'device_keys': deviceKeys.map(
    2095            0 :           (k, v) => MapEntry(k, v.map((k, v) => MapEntry(k, v.toJson()))),
    2096              :         ),
    2097            0 :       if (failures != null) 'failures': failures.map((k, v) => MapEntry(k, v)),
    2098              :       if (masterKeys != null)
    2099            0 :         'master_keys': masterKeys.map((k, v) => MapEntry(k, v.toJson())),
    2100              :       if (selfSigningKeys != null)
    2101            0 :         'self_signing_keys':
    2102            0 :             selfSigningKeys.map((k, v) => MapEntry(k, v.toJson())),
    2103              :       if (userSigningKeys != null)
    2104            0 :         'user_signing_keys':
    2105            0 :             userSigningKeys.map((k, v) => MapEntry(k, v.toJson())),
    2106              :     };
    2107              :   }
    2108              : 
    2109              :   /// Information on the queried devices. A map from user ID, to a
    2110              :   /// map from device ID to device information.  For each device,
    2111              :   /// the information returned will be the same as uploaded via
    2112              :   /// `/keys/upload`, with the addition of an `unsigned`
    2113              :   /// property.
    2114              :   Map<String, Map<String, MatrixDeviceKeys>>? deviceKeys;
    2115              : 
    2116              :   /// If any remote homeservers could not be reached, they are
    2117              :   /// recorded here. The names of the properties are the names of
    2118              :   /// the unreachable servers.
    2119              :   ///
    2120              :   /// If the homeserver could be reached, but the user or device
    2121              :   /// was unknown, no failure is recorded. Instead, the corresponding
    2122              :   /// user or device is missing from the `device_keys` result.
    2123              :   Map<String, Map<String, Object?>>? failures;
    2124              : 
    2125              :   /// Information on the master cross-signing keys of the queried users.
    2126              :   /// A map from user ID, to master key information.  For each key, the
    2127              :   /// information returned will be the same as uploaded via
    2128              :   /// `/keys/device_signing/upload`, along with the signatures
    2129              :   /// uploaded via `/keys/signatures/upload` that the requesting user
    2130              :   /// is allowed to see.
    2131              :   Map<String, MatrixCrossSigningKey>? masterKeys;
    2132              : 
    2133              :   /// Information on the self-signing keys of the queried users. A map
    2134              :   /// from user ID, to self-signing key information.  For each key, the
    2135              :   /// information returned will be the same as uploaded via
    2136              :   /// `/keys/device_signing/upload`.
    2137              :   Map<String, MatrixCrossSigningKey>? selfSigningKeys;
    2138              : 
    2139              :   /// Information on the user-signing key of the user making the
    2140              :   /// request, if they queried their own device information. A map
    2141              :   /// from user ID, to user-signing key information.  The
    2142              :   /// information returned will be the same as uploaded via
    2143              :   /// `/keys/device_signing/upload`.
    2144              :   Map<String, MatrixCrossSigningKey>? userSigningKeys;
    2145              : 
    2146            0 :   @dart.override
    2147              :   bool operator ==(Object other) =>
    2148              :       identical(this, other) ||
    2149            0 :       (other is QueryKeysResponse &&
    2150            0 :           other.runtimeType == runtimeType &&
    2151            0 :           other.deviceKeys == deviceKeys &&
    2152            0 :           other.failures == failures &&
    2153            0 :           other.masterKeys == masterKeys &&
    2154            0 :           other.selfSigningKeys == selfSigningKeys &&
    2155            0 :           other.userSigningKeys == userSigningKeys);
    2156              : 
    2157            0 :   @dart.override
    2158            0 :   int get hashCode => Object.hash(
    2159            0 :         deviceKeys,
    2160            0 :         failures,
    2161            0 :         masterKeys,
    2162            0 :         selfSigningKeys,
    2163            0 :         userSigningKeys,
    2164              :       );
    2165              : }
    2166              : 
    2167              : ///
    2168              : @_NameSource('spec')
    2169              : class LoginFlow {
    2170            0 :   LoginFlow({
    2171              :     this.getLoginToken,
    2172              :     required this.type,
    2173              :     this.additionalProperties = const {},
    2174              :   });
    2175              : 
    2176           35 :   LoginFlow.fromJson(Map<String, Object?> json)
    2177              :       : getLoginToken =
    2178          105 :             ((v) => v != null ? v as bool : null)(json['get_login_token']),
    2179           35 :         type = json['type'] as String,
    2180           35 :         additionalProperties = Map.fromEntries(
    2181           35 :           json.entries
    2182          175 :               .where((e) => !['get_login_token', 'type'].contains(e.key))
    2183           35 :               .map((e) => MapEntry(e.key, e.value)),
    2184              :         );
    2185            0 :   Map<String, Object?> toJson() {
    2186            0 :     final getLoginToken = this.getLoginToken;
    2187            0 :     return {
    2188            0 :       ...additionalProperties,
    2189            0 :       if (getLoginToken != null) 'get_login_token': getLoginToken,
    2190            0 :       'type': type,
    2191              :     };
    2192              :   }
    2193              : 
    2194              :   /// If `type` is `m.login.token`, an optional field to indicate
    2195              :   /// to the unauthenticated client that the homeserver supports
    2196              :   /// the [`POST /login/get_token`](https://spec.matrix.org/unstable/client-server-api/#post_matrixclientv1loginget_token)
    2197              :   /// endpoint. Note that supporting the endpoint does not
    2198              :   /// necessarily indicate that the user attempting to log in will
    2199              :   /// be able to generate such a token.
    2200              :   bool? getLoginToken;
    2201              : 
    2202              :   /// The login type. This is supplied as the `type` when
    2203              :   /// logging in.
    2204              :   String type;
    2205              : 
    2206              :   Map<String, Object?> additionalProperties;
    2207              : 
    2208            0 :   @dart.override
    2209              :   bool operator ==(Object other) =>
    2210              :       identical(this, other) ||
    2211            0 :       (other is LoginFlow &&
    2212            0 :           other.runtimeType == runtimeType &&
    2213            0 :           other.getLoginToken == getLoginToken &&
    2214            0 :           other.type == type);
    2215              : 
    2216            0 :   @dart.override
    2217            0 :   int get hashCode => Object.hash(getLoginToken, type);
    2218              : }
    2219              : 
    2220              : ///
    2221              : @_NameSource('generated')
    2222              : class LoginResponse {
    2223            0 :   LoginResponse({
    2224              :     required this.accessToken,
    2225              :     required this.deviceId,
    2226              :     this.expiresInMs,
    2227              :     this.homeServer,
    2228              :     this.refreshToken,
    2229              :     required this.userId,
    2230              :     this.wellKnown,
    2231              :   });
    2232              : 
    2233            5 :   LoginResponse.fromJson(Map<String, Object?> json)
    2234            5 :       : accessToken = json['access_token'] as String,
    2235            5 :         deviceId = json['device_id'] as String,
    2236              :         expiresInMs =
    2237           15 :             ((v) => v != null ? v as int : null)(json['expires_in_ms']),
    2238              :         homeServer =
    2239           15 :             ((v) => v != null ? v as String : null)(json['home_server']),
    2240              :         refreshToken =
    2241           15 :             ((v) => v != null ? v as String : null)(json['refresh_token']),
    2242            5 :         userId = json['user_id'] as String,
    2243            5 :         wellKnown = ((v) => v != null
    2244            5 :             ? DiscoveryInformation.fromJson(v as Map<String, Object?>)
    2245           10 :             : null)(json['well_known']);
    2246            0 :   Map<String, Object?> toJson() {
    2247            0 :     final expiresInMs = this.expiresInMs;
    2248            0 :     final homeServer = this.homeServer;
    2249            0 :     final refreshToken = this.refreshToken;
    2250            0 :     final wellKnown = this.wellKnown;
    2251            0 :     return {
    2252            0 :       'access_token': accessToken,
    2253            0 :       'device_id': deviceId,
    2254            0 :       if (expiresInMs != null) 'expires_in_ms': expiresInMs,
    2255            0 :       if (homeServer != null) 'home_server': homeServer,
    2256            0 :       if (refreshToken != null) 'refresh_token': refreshToken,
    2257            0 :       'user_id': userId,
    2258            0 :       if (wellKnown != null) 'well_known': wellKnown.toJson(),
    2259              :     };
    2260              :   }
    2261              : 
    2262              :   /// An access token for the account.
    2263              :   /// This access token can then be used to authorize other requests.
    2264              :   String accessToken;
    2265              : 
    2266              :   /// ID of the logged-in device. Will be the same as the
    2267              :   /// corresponding parameter in the request, if one was specified.
    2268              :   String deviceId;
    2269              : 
    2270              :   /// The lifetime of the access token, in milliseconds. Once
    2271              :   /// the access token has expired a new access token can be
    2272              :   /// obtained by using the provided refresh token. If no
    2273              :   /// refresh token is provided, the client will need to re-log in
    2274              :   /// to obtain a new access token. If not given, the client can
    2275              :   /// assume that the access token will not expire.
    2276              :   int? expiresInMs;
    2277              : 
    2278              :   /// The server_name of the homeserver on which the account has
    2279              :   /// been registered.
    2280              :   ///
    2281              :   /// **Deprecated**. Clients should extract the server_name from
    2282              :   /// `user_id` (by splitting at the first colon) if they require
    2283              :   /// it. Note also that `homeserver` is not spelt this way.
    2284              :   String? homeServer;
    2285              : 
    2286              :   /// A refresh token for the account. This token can be used to
    2287              :   /// obtain a new access token when it expires by calling the
    2288              :   /// `/refresh` endpoint.
    2289              :   String? refreshToken;
    2290              : 
    2291              :   /// The fully-qualified Matrix ID for the account.
    2292              :   String userId;
    2293              : 
    2294              :   /// Optional client configuration provided by the server. If present,
    2295              :   /// clients SHOULD use the provided object to reconfigure themselves,
    2296              :   /// optionally validating the URLs within. This object takes the same
    2297              :   /// form as the one returned from .well-known autodiscovery.
    2298              :   DiscoveryInformation? wellKnown;
    2299              : 
    2300            0 :   @dart.override
    2301              :   bool operator ==(Object other) =>
    2302              :       identical(this, other) ||
    2303            0 :       (other is LoginResponse &&
    2304            0 :           other.runtimeType == runtimeType &&
    2305            0 :           other.accessToken == accessToken &&
    2306            0 :           other.deviceId == deviceId &&
    2307            0 :           other.expiresInMs == expiresInMs &&
    2308            0 :           other.homeServer == homeServer &&
    2309            0 :           other.refreshToken == refreshToken &&
    2310            0 :           other.userId == userId &&
    2311            0 :           other.wellKnown == wellKnown);
    2312              : 
    2313            0 :   @dart.override
    2314            0 :   int get hashCode => Object.hash(
    2315            0 :         accessToken,
    2316            0 :         deviceId,
    2317            0 :         expiresInMs,
    2318            0 :         homeServer,
    2319            0 :         refreshToken,
    2320            0 :         userId,
    2321            0 :         wellKnown,
    2322              :       );
    2323              : }
    2324              : 
    2325              : ///
    2326              : @_NameSource('spec')
    2327              : class Notification {
    2328            0 :   Notification({
    2329              :     required this.actions,
    2330              :     required this.event,
    2331              :     this.profileTag,
    2332              :     required this.read,
    2333              :     required this.roomId,
    2334              :     required this.ts,
    2335              :   });
    2336              : 
    2337            0 :   Notification.fromJson(Map<String, Object?> json)
    2338            0 :       : actions = (json['actions'] as List).map((v) => v as Object?).toList(),
    2339            0 :         event = MatrixEvent.fromJson(json['event'] as Map<String, Object?>),
    2340              :         profileTag =
    2341            0 :             ((v) => v != null ? v as String : null)(json['profile_tag']),
    2342            0 :         read = json['read'] as bool,
    2343            0 :         roomId = json['room_id'] as String,
    2344            0 :         ts = json['ts'] as int;
    2345            0 :   Map<String, Object?> toJson() {
    2346            0 :     final profileTag = this.profileTag;
    2347            0 :     return {
    2348            0 :       'actions': actions.map((v) => v).toList(),
    2349            0 :       'event': event.toJson(),
    2350            0 :       if (profileTag != null) 'profile_tag': profileTag,
    2351            0 :       'read': read,
    2352            0 :       'room_id': roomId,
    2353            0 :       'ts': ts,
    2354              :     };
    2355              :   }
    2356              : 
    2357              :   /// The action(s) to perform when the conditions for this rule are met.
    2358              :   /// See [Push Rules: API](https://spec.matrix.org/unstable/client-server-api/#push-rules-api).
    2359              :   List<Object?> actions;
    2360              : 
    2361              :   /// The Event object for the event that triggered the notification.
    2362              :   MatrixEvent event;
    2363              : 
    2364              :   /// The profile tag of the rule that matched this event.
    2365              :   String? profileTag;
    2366              : 
    2367              :   /// Indicates whether the user has sent a read receipt indicating
    2368              :   /// that they have read this message.
    2369              :   bool read;
    2370              : 
    2371              :   /// The ID of the room in which the event was posted.
    2372              :   String roomId;
    2373              : 
    2374              :   /// The unix timestamp at which the event notification was sent,
    2375              :   /// in milliseconds.
    2376              :   int ts;
    2377              : 
    2378            0 :   @dart.override
    2379              :   bool operator ==(Object other) =>
    2380              :       identical(this, other) ||
    2381            0 :       (other is Notification &&
    2382            0 :           other.runtimeType == runtimeType &&
    2383            0 :           other.actions == actions &&
    2384            0 :           other.event == event &&
    2385            0 :           other.profileTag == profileTag &&
    2386            0 :           other.read == read &&
    2387            0 :           other.roomId == roomId &&
    2388            0 :           other.ts == ts);
    2389              : 
    2390            0 :   @dart.override
    2391            0 :   int get hashCode => Object.hash(actions, event, profileTag, read, roomId, ts);
    2392              : }
    2393              : 
    2394              : ///
    2395              : @_NameSource('generated')
    2396              : class GetNotificationsResponse {
    2397            0 :   GetNotificationsResponse({
    2398              :     this.nextToken,
    2399              :     required this.notifications,
    2400              :   });
    2401              : 
    2402            0 :   GetNotificationsResponse.fromJson(Map<String, Object?> json)
    2403            0 :       : nextToken = ((v) => v != null ? v as String : null)(json['next_token']),
    2404            0 :         notifications = (json['notifications'] as List)
    2405            0 :             .map((v) => Notification.fromJson(v as Map<String, Object?>))
    2406            0 :             .toList();
    2407            0 :   Map<String, Object?> toJson() {
    2408            0 :     final nextToken = this.nextToken;
    2409            0 :     return {
    2410            0 :       if (nextToken != null) 'next_token': nextToken,
    2411            0 :       'notifications': notifications.map((v) => v.toJson()).toList(),
    2412              :     };
    2413              :   }
    2414              : 
    2415              :   /// The token to supply in the `from` param of the next
    2416              :   /// `/notifications` request in order to request more
    2417              :   /// events. If this is absent, there are no more results.
    2418              :   String? nextToken;
    2419              : 
    2420              :   /// The list of events that triggered notifications.
    2421              :   List<Notification> notifications;
    2422              : 
    2423            0 :   @dart.override
    2424              :   bool operator ==(Object other) =>
    2425              :       identical(this, other) ||
    2426            0 :       (other is GetNotificationsResponse &&
    2427            0 :           other.runtimeType == runtimeType &&
    2428            0 :           other.nextToken == nextToken &&
    2429            0 :           other.notifications == notifications);
    2430              : 
    2431            0 :   @dart.override
    2432            0 :   int get hashCode => Object.hash(nextToken, notifications);
    2433              : }
    2434              : 
    2435              : ///
    2436              : @_NameSource('rule override generated')
    2437              : enum PresenceType {
    2438              :   offline('offline'),
    2439              :   online('online'),
    2440              :   unavailable('unavailable');
    2441              : 
    2442              :   final String name;
    2443              :   const PresenceType(this.name);
    2444              : }
    2445              : 
    2446              : ///
    2447              : @_NameSource('generated')
    2448              : class GetPresenceResponse {
    2449            0 :   GetPresenceResponse({
    2450              :     this.currentlyActive,
    2451              :     this.lastActiveAgo,
    2452              :     required this.presence,
    2453              :     this.statusMsg,
    2454              :   });
    2455              : 
    2456            0 :   GetPresenceResponse.fromJson(Map<String, Object?> json)
    2457              :       : currentlyActive =
    2458            0 :             ((v) => v != null ? v as bool : null)(json['currently_active']),
    2459              :         lastActiveAgo =
    2460            0 :             ((v) => v != null ? v as int : null)(json['last_active_ago']),
    2461            0 :         presence = PresenceType.values.fromString(json['presence'] as String)!,
    2462            0 :         statusMsg = ((v) => v != null ? v as String : null)(json['status_msg']);
    2463            0 :   Map<String, Object?> toJson() {
    2464            0 :     final currentlyActive = this.currentlyActive;
    2465            0 :     final lastActiveAgo = this.lastActiveAgo;
    2466            0 :     final statusMsg = this.statusMsg;
    2467            0 :     return {
    2468            0 :       if (currentlyActive != null) 'currently_active': currentlyActive,
    2469            0 :       if (lastActiveAgo != null) 'last_active_ago': lastActiveAgo,
    2470            0 :       'presence': presence.name,
    2471            0 :       if (statusMsg != null) 'status_msg': statusMsg,
    2472              :     };
    2473              :   }
    2474              : 
    2475              :   /// Whether the user is currently active
    2476              :   bool? currentlyActive;
    2477              : 
    2478              :   /// The length of time in milliseconds since an action was performed
    2479              :   /// by this user.
    2480              :   int? lastActiveAgo;
    2481              : 
    2482              :   /// This user's presence.
    2483              :   PresenceType presence;
    2484              : 
    2485              :   /// The state message for this user if one was set.
    2486              :   String? statusMsg;
    2487              : 
    2488            0 :   @dart.override
    2489              :   bool operator ==(Object other) =>
    2490              :       identical(this, other) ||
    2491            0 :       (other is GetPresenceResponse &&
    2492            0 :           other.runtimeType == runtimeType &&
    2493            0 :           other.currentlyActive == currentlyActive &&
    2494            0 :           other.lastActiveAgo == lastActiveAgo &&
    2495            0 :           other.presence == presence &&
    2496            0 :           other.statusMsg == statusMsg);
    2497              : 
    2498            0 :   @dart.override
    2499              :   int get hashCode =>
    2500            0 :       Object.hash(currentlyActive, lastActiveAgo, presence, statusMsg);
    2501              : }
    2502              : 
    2503              : ///
    2504              : @_NameSource('rule override generated')
    2505              : class ProfileInformation {
    2506            4 :   ProfileInformation({
    2507              :     this.avatarUrl,
    2508              :     this.displayname,
    2509              :   });
    2510              : 
    2511            4 :   ProfileInformation.fromJson(Map<String, Object?> json)
    2512            4 :       : avatarUrl = ((v) =>
    2513           12 :             v != null ? Uri.parse(v as String) : null)(json['avatar_url']),
    2514              :         displayname =
    2515           12 :             ((v) => v != null ? v as String : null)(json['displayname']);
    2516            4 :   Map<String, Object?> toJson() {
    2517            4 :     final avatarUrl = this.avatarUrl;
    2518            4 :     final displayname = this.displayname;
    2519            4 :     return {
    2520            8 :       if (avatarUrl != null) 'avatar_url': avatarUrl.toString(),
    2521            4 :       if (displayname != null) 'displayname': displayname,
    2522              :     };
    2523              :   }
    2524              : 
    2525              :   /// The user's avatar URL if they have set one, otherwise not present.
    2526              :   Uri? avatarUrl;
    2527              : 
    2528              :   /// The user's display name if they have set one, otherwise not present.
    2529              :   String? displayname;
    2530              : 
    2531            0 :   @dart.override
    2532              :   bool operator ==(Object other) =>
    2533              :       identical(this, other) ||
    2534            0 :       (other is ProfileInformation &&
    2535            0 :           other.runtimeType == runtimeType &&
    2536            0 :           other.avatarUrl == avatarUrl &&
    2537            0 :           other.displayname == displayname);
    2538              : 
    2539            0 :   @dart.override
    2540            0 :   int get hashCode => Object.hash(avatarUrl, displayname);
    2541              : }
    2542              : 
    2543              : /// A list of the rooms on the server.
    2544              : @_NameSource('generated')
    2545              : class GetPublicRoomsResponse {
    2546            0 :   GetPublicRoomsResponse({
    2547              :     required this.chunk,
    2548              :     this.nextBatch,
    2549              :     this.prevBatch,
    2550              :     this.totalRoomCountEstimate,
    2551              :   });
    2552              : 
    2553            0 :   GetPublicRoomsResponse.fromJson(Map<String, Object?> json)
    2554            0 :       : chunk = (json['chunk'] as List)
    2555            0 :             .map((v) => PublicRoomsChunk.fromJson(v as Map<String, Object?>))
    2556            0 :             .toList(),
    2557            0 :         nextBatch = ((v) => v != null ? v as String : null)(json['next_batch']),
    2558            0 :         prevBatch = ((v) => v != null ? v as String : null)(json['prev_batch']),
    2559            0 :         totalRoomCountEstimate = ((v) =>
    2560            0 :             v != null ? v as int : null)(json['total_room_count_estimate']);
    2561            0 :   Map<String, Object?> toJson() {
    2562            0 :     final nextBatch = this.nextBatch;
    2563            0 :     final prevBatch = this.prevBatch;
    2564            0 :     final totalRoomCountEstimate = this.totalRoomCountEstimate;
    2565            0 :     return {
    2566            0 :       'chunk': chunk.map((v) => v.toJson()).toList(),
    2567            0 :       if (nextBatch != null) 'next_batch': nextBatch,
    2568            0 :       if (prevBatch != null) 'prev_batch': prevBatch,
    2569              :       if (totalRoomCountEstimate != null)
    2570            0 :         'total_room_count_estimate': totalRoomCountEstimate,
    2571              :     };
    2572              :   }
    2573              : 
    2574              :   /// A paginated chunk of public rooms.
    2575              :   List<PublicRoomsChunk> chunk;
    2576              : 
    2577              :   /// A pagination token for the response. The absence of this token
    2578              :   /// means there are no more results to fetch and the client should
    2579              :   /// stop paginating.
    2580              :   String? nextBatch;
    2581              : 
    2582              :   /// A pagination token that allows fetching previous results. The
    2583              :   /// absence of this token means there are no results before this
    2584              :   /// batch, i.e. this is the first batch.
    2585              :   String? prevBatch;
    2586              : 
    2587              :   /// An estimate on the total number of public rooms, if the
    2588              :   /// server has an estimate.
    2589              :   int? totalRoomCountEstimate;
    2590              : 
    2591            0 :   @dart.override
    2592              :   bool operator ==(Object other) =>
    2593              :       identical(this, other) ||
    2594            0 :       (other is GetPublicRoomsResponse &&
    2595            0 :           other.runtimeType == runtimeType &&
    2596            0 :           other.chunk == chunk &&
    2597            0 :           other.nextBatch == nextBatch &&
    2598            0 :           other.prevBatch == prevBatch &&
    2599            0 :           other.totalRoomCountEstimate == totalRoomCountEstimate);
    2600              : 
    2601            0 :   @dart.override
    2602              :   int get hashCode =>
    2603            0 :       Object.hash(chunk, nextBatch, prevBatch, totalRoomCountEstimate);
    2604              : }
    2605              : 
    2606              : ///
    2607              : @_NameSource('rule override spec')
    2608              : class PublicRoomQueryFilter {
    2609            0 :   PublicRoomQueryFilter({
    2610              :     this.genericSearchTerm,
    2611              :     this.roomTypes,
    2612              :   });
    2613              : 
    2614            0 :   PublicRoomQueryFilter.fromJson(Map<String, Object?> json)
    2615            0 :       : genericSearchTerm = ((v) =>
    2616            0 :             v != null ? v as String : null)(json['generic_search_term']),
    2617            0 :         roomTypes = ((v) => v != null
    2618              :             ? (v as List)
    2619            0 :                 .map((v) => ((v) => v != null ? v as String : null)(v))
    2620            0 :                 .toList()
    2621            0 :             : null)(json['room_types']);
    2622            0 :   Map<String, Object?> toJson() {
    2623            0 :     final genericSearchTerm = this.genericSearchTerm;
    2624            0 :     final roomTypes = this.roomTypes;
    2625            0 :     return {
    2626            0 :       if (genericSearchTerm != null) 'generic_search_term': genericSearchTerm,
    2627            0 :       if (roomTypes != null) 'room_types': roomTypes.map((v) => v).toList(),
    2628              :     };
    2629              :   }
    2630              : 
    2631              :   /// An optional string to search for in the room metadata, e.g. name,
    2632              :   /// topic, canonical alias, etc.
    2633              :   String? genericSearchTerm;
    2634              : 
    2635              :   /// An optional list of [room types](https://spec.matrix.org/unstable/client-server-api/#types) to search
    2636              :   /// for. To include rooms without a room type, specify `null` within this
    2637              :   /// list. When not specified, all applicable rooms (regardless of type)
    2638              :   /// are returned.
    2639              :   List<String?>? roomTypes;
    2640              : 
    2641            0 :   @dart.override
    2642              :   bool operator ==(Object other) =>
    2643              :       identical(this, other) ||
    2644            0 :       (other is PublicRoomQueryFilter &&
    2645            0 :           other.runtimeType == runtimeType &&
    2646            0 :           other.genericSearchTerm == genericSearchTerm &&
    2647            0 :           other.roomTypes == roomTypes);
    2648              : 
    2649            0 :   @dart.override
    2650            0 :   int get hashCode => Object.hash(genericSearchTerm, roomTypes);
    2651              : }
    2652              : 
    2653              : /// A list of the rooms on the server.
    2654              : @_NameSource('generated')
    2655              : class QueryPublicRoomsResponse {
    2656            0 :   QueryPublicRoomsResponse({
    2657              :     required this.chunk,
    2658              :     this.nextBatch,
    2659              :     this.prevBatch,
    2660              :     this.totalRoomCountEstimate,
    2661              :   });
    2662              : 
    2663            0 :   QueryPublicRoomsResponse.fromJson(Map<String, Object?> json)
    2664            0 :       : chunk = (json['chunk'] as List)
    2665            0 :             .map((v) => PublicRoomsChunk.fromJson(v as Map<String, Object?>))
    2666            0 :             .toList(),
    2667            0 :         nextBatch = ((v) => v != null ? v as String : null)(json['next_batch']),
    2668            0 :         prevBatch = ((v) => v != null ? v as String : null)(json['prev_batch']),
    2669            0 :         totalRoomCountEstimate = ((v) =>
    2670            0 :             v != null ? v as int : null)(json['total_room_count_estimate']);
    2671            0 :   Map<String, Object?> toJson() {
    2672            0 :     final nextBatch = this.nextBatch;
    2673            0 :     final prevBatch = this.prevBatch;
    2674            0 :     final totalRoomCountEstimate = this.totalRoomCountEstimate;
    2675            0 :     return {
    2676            0 :       'chunk': chunk.map((v) => v.toJson()).toList(),
    2677            0 :       if (nextBatch != null) 'next_batch': nextBatch,
    2678            0 :       if (prevBatch != null) 'prev_batch': prevBatch,
    2679              :       if (totalRoomCountEstimate != null)
    2680            0 :         'total_room_count_estimate': totalRoomCountEstimate,
    2681              :     };
    2682              :   }
    2683              : 
    2684              :   /// A paginated chunk of public rooms.
    2685              :   List<PublicRoomsChunk> chunk;
    2686              : 
    2687              :   /// A pagination token for the response. The absence of this token
    2688              :   /// means there are no more results to fetch and the client should
    2689              :   /// stop paginating.
    2690              :   String? nextBatch;
    2691              : 
    2692              :   /// A pagination token that allows fetching previous results. The
    2693              :   /// absence of this token means there are no results before this
    2694              :   /// batch, i.e. this is the first batch.
    2695              :   String? prevBatch;
    2696              : 
    2697              :   /// An estimate on the total number of public rooms, if the
    2698              :   /// server has an estimate.
    2699              :   int? totalRoomCountEstimate;
    2700              : 
    2701            0 :   @dart.override
    2702              :   bool operator ==(Object other) =>
    2703              :       identical(this, other) ||
    2704            0 :       (other is QueryPublicRoomsResponse &&
    2705            0 :           other.runtimeType == runtimeType &&
    2706            0 :           other.chunk == chunk &&
    2707            0 :           other.nextBatch == nextBatch &&
    2708            0 :           other.prevBatch == prevBatch &&
    2709            0 :           other.totalRoomCountEstimate == totalRoomCountEstimate);
    2710              : 
    2711            0 :   @dart.override
    2712              :   int get hashCode =>
    2713            0 :       Object.hash(chunk, nextBatch, prevBatch, totalRoomCountEstimate);
    2714              : }
    2715              : 
    2716              : ///
    2717              : @_NameSource('spec')
    2718              : class PusherData {
    2719            0 :   PusherData({
    2720              :     this.format,
    2721              :     this.url,
    2722              :     this.additionalProperties = const {},
    2723              :   });
    2724              : 
    2725            0 :   PusherData.fromJson(Map<String, Object?> json)
    2726            0 :       : format = ((v) => v != null ? v as String : null)(json['format']),
    2727            0 :         url = ((v) => v != null ? Uri.parse(v as String) : null)(json['url']),
    2728            0 :         additionalProperties = Map.fromEntries(
    2729            0 :           json.entries
    2730            0 :               .where((e) => !['format', 'url'].contains(e.key))
    2731            0 :               .map((e) => MapEntry(e.key, e.value)),
    2732              :         );
    2733            0 :   Map<String, Object?> toJson() {
    2734            0 :     final format = this.format;
    2735            0 :     final url = this.url;
    2736            0 :     return {
    2737            0 :       ...additionalProperties,
    2738            0 :       if (format != null) 'format': format,
    2739            0 :       if (url != null) 'url': url.toString(),
    2740              :     };
    2741              :   }
    2742              : 
    2743              :   /// The format to use when sending notifications to the Push
    2744              :   /// Gateway.
    2745              :   String? format;
    2746              : 
    2747              :   /// Required if `kind` is `http`. The URL to use to send
    2748              :   /// notifications to.
    2749              :   Uri? url;
    2750              : 
    2751              :   Map<String, Object?> additionalProperties;
    2752              : 
    2753            0 :   @dart.override
    2754              :   bool operator ==(Object other) =>
    2755              :       identical(this, other) ||
    2756            0 :       (other is PusherData &&
    2757            0 :           other.runtimeType == runtimeType &&
    2758            0 :           other.format == format &&
    2759            0 :           other.url == url);
    2760              : 
    2761            0 :   @dart.override
    2762            0 :   int get hashCode => Object.hash(format, url);
    2763              : }
    2764              : 
    2765              : ///
    2766              : @_NameSource('spec')
    2767              : class PusherId {
    2768            0 :   PusherId({
    2769              :     required this.appId,
    2770              :     required this.pushkey,
    2771              :   });
    2772              : 
    2773            0 :   PusherId.fromJson(Map<String, Object?> json)
    2774            0 :       : appId = json['app_id'] as String,
    2775            0 :         pushkey = json['pushkey'] as String;
    2776            0 :   Map<String, Object?> toJson() => {
    2777            0 :         'app_id': appId,
    2778            0 :         'pushkey': pushkey,
    2779              :       };
    2780              : 
    2781              :   /// This is a reverse-DNS style identifier for the application.
    2782              :   /// Max length, 64 chars.
    2783              :   String appId;
    2784              : 
    2785              :   /// This is a unique identifier for this pusher. See `/set` for
    2786              :   /// more detail.
    2787              :   /// Max length, 512 bytes.
    2788              :   String pushkey;
    2789              : 
    2790            0 :   @dart.override
    2791              :   bool operator ==(Object other) =>
    2792              :       identical(this, other) ||
    2793            0 :       (other is PusherId &&
    2794            0 :           other.runtimeType == runtimeType &&
    2795            0 :           other.appId == appId &&
    2796            0 :           other.pushkey == pushkey);
    2797              : 
    2798            0 :   @dart.override
    2799            0 :   int get hashCode => Object.hash(appId, pushkey);
    2800              : }
    2801              : 
    2802              : ///
    2803              : @_NameSource('spec')
    2804              : class Pusher implements PusherId {
    2805            0 :   Pusher({
    2806              :     required this.appId,
    2807              :     required this.pushkey,
    2808              :     required this.appDisplayName,
    2809              :     required this.data,
    2810              :     required this.deviceDisplayName,
    2811              :     required this.kind,
    2812              :     required this.lang,
    2813              :     this.profileTag,
    2814              :   });
    2815              : 
    2816            0 :   Pusher.fromJson(Map<String, Object?> json)
    2817            0 :       : appId = json['app_id'] as String,
    2818            0 :         pushkey = json['pushkey'] as String,
    2819            0 :         appDisplayName = json['app_display_name'] as String,
    2820            0 :         data = PusherData.fromJson(json['data'] as Map<String, Object?>),
    2821            0 :         deviceDisplayName = json['device_display_name'] as String,
    2822            0 :         kind = json['kind'] as String,
    2823            0 :         lang = json['lang'] as String,
    2824              :         profileTag =
    2825            0 :             ((v) => v != null ? v as String : null)(json['profile_tag']);
    2826            0 :   @override
    2827              :   Map<String, Object?> toJson() {
    2828            0 :     final profileTag = this.profileTag;
    2829            0 :     return {
    2830            0 :       'app_id': appId,
    2831            0 :       'pushkey': pushkey,
    2832            0 :       'app_display_name': appDisplayName,
    2833            0 :       'data': data.toJson(),
    2834            0 :       'device_display_name': deviceDisplayName,
    2835            0 :       'kind': kind,
    2836            0 :       'lang': lang,
    2837            0 :       if (profileTag != null) 'profile_tag': profileTag,
    2838              :     };
    2839              :   }
    2840              : 
    2841              :   /// This is a reverse-DNS style identifier for the application.
    2842              :   /// Max length, 64 chars.
    2843              :   @override
    2844              :   String appId;
    2845              : 
    2846              :   /// This is a unique identifier for this pusher. See `/set` for
    2847              :   /// more detail.
    2848              :   /// Max length, 512 bytes.
    2849              :   @override
    2850              :   String pushkey;
    2851              : 
    2852              :   /// A string that will allow the user to identify what application
    2853              :   /// owns this pusher.
    2854              :   String appDisplayName;
    2855              : 
    2856              :   /// A dictionary of information for the pusher implementation
    2857              :   /// itself.
    2858              :   PusherData data;
    2859              : 
    2860              :   /// A string that will allow the user to identify what device owns
    2861              :   /// this pusher.
    2862              :   String deviceDisplayName;
    2863              : 
    2864              :   /// The kind of pusher. `"http"` is a pusher that
    2865              :   /// sends HTTP pokes.
    2866              :   String kind;
    2867              : 
    2868              :   /// The preferred language for receiving notifications (e.g. 'en'
    2869              :   /// or 'en-US')
    2870              :   String lang;
    2871              : 
    2872              :   /// This string determines which set of device specific rules this
    2873              :   /// pusher executes.
    2874              :   String? profileTag;
    2875              : 
    2876            0 :   @dart.override
    2877              :   bool operator ==(Object other) =>
    2878              :       identical(this, other) ||
    2879            0 :       (other is Pusher &&
    2880            0 :           other.runtimeType == runtimeType &&
    2881            0 :           other.appId == appId &&
    2882            0 :           other.pushkey == pushkey &&
    2883            0 :           other.appDisplayName == appDisplayName &&
    2884            0 :           other.data == data &&
    2885            0 :           other.deviceDisplayName == deviceDisplayName &&
    2886            0 :           other.kind == kind &&
    2887            0 :           other.lang == lang &&
    2888            0 :           other.profileTag == profileTag);
    2889              : 
    2890            0 :   @dart.override
    2891            0 :   int get hashCode => Object.hash(
    2892            0 :         appId,
    2893            0 :         pushkey,
    2894            0 :         appDisplayName,
    2895            0 :         data,
    2896            0 :         deviceDisplayName,
    2897            0 :         kind,
    2898            0 :         lang,
    2899            0 :         profileTag,
    2900              :       );
    2901              : }
    2902              : 
    2903              : ///
    2904              : @_NameSource('spec')
    2905              : class PushCondition {
    2906           33 :   PushCondition({
    2907              :     this.is$,
    2908              :     this.key,
    2909              :     required this.kind,
    2910              :     this.pattern,
    2911              :     this.value,
    2912              :   });
    2913              : 
    2914           33 :   PushCondition.fromJson(Map<String, Object?> json)
    2915           99 :       : is$ = ((v) => v != null ? v as String : null)(json['is']),
    2916           99 :         key = ((v) => v != null ? v as String : null)(json['key']),
    2917           33 :         kind = json['kind'] as String,
    2918           99 :         pattern = ((v) => v != null ? v as String : null)(json['pattern']),
    2919           99 :         value = ((v) => v != null ? v as Object? : null)(json['value']);
    2920            0 :   Map<String, Object?> toJson() {
    2921            0 :     final is$ = this.is$;
    2922            0 :     final key = this.key;
    2923            0 :     final pattern = this.pattern;
    2924            0 :     final value = this.value;
    2925            0 :     return {
    2926            0 :       if (is$ != null) 'is': is$,
    2927            0 :       if (key != null) 'key': key,
    2928            0 :       'kind': kind,
    2929            0 :       if (pattern != null) 'pattern': pattern,
    2930            0 :       if (value != null) 'value': value,
    2931              :     };
    2932              :   }
    2933              : 
    2934              :   /// Required for `room_member_count` conditions. A decimal integer
    2935              :   /// optionally prefixed by one of, ==, <, >, >= or <=. A prefix of < matches
    2936              :   /// rooms where the member count is strictly less than the given number and
    2937              :   /// so forth. If no prefix is present, this parameter defaults to ==.
    2938              :   String? is$;
    2939              : 
    2940              :   /// Required for `event_match`, `event_property_is` and `event_property_contains`
    2941              :   /// conditions. The dot-separated field of the event to match.
    2942              :   ///
    2943              :   /// Required for `sender_notification_permission` conditions. The field in
    2944              :   /// the power level event the user needs a minimum power level for. Fields
    2945              :   /// must be specified under the `notifications` property in the power level
    2946              :   /// event's `content`.
    2947              :   String? key;
    2948              : 
    2949              :   /// The kind of condition to apply. See [conditions](https://spec.matrix.org/unstable/client-server-api/#conditions-1) for
    2950              :   /// more information on the allowed kinds and how they work.
    2951              :   String kind;
    2952              : 
    2953              :   /// Required for `event_match` conditions. The [glob-style pattern](https://spec.matrix.org/unstable/appendices#glob-style-matching)
    2954              :   /// to match against.
    2955              :   String? pattern;
    2956              : 
    2957              :   /// Required for `event_property_is` and `event_property_contains` conditions.
    2958              :   /// A non-compound [canonical JSON](https://spec.matrix.org/unstable/appendices#canonical-json) value to match
    2959              :   /// against.
    2960              :   Object? value;
    2961              : 
    2962            0 :   @dart.override
    2963              :   bool operator ==(Object other) =>
    2964              :       identical(this, other) ||
    2965            0 :       (other is PushCondition &&
    2966            0 :           other.runtimeType == runtimeType &&
    2967            0 :           other.is$ == is$ &&
    2968            0 :           other.key == key &&
    2969            0 :           other.kind == kind &&
    2970            0 :           other.pattern == pattern &&
    2971            0 :           other.value == value);
    2972              : 
    2973            0 :   @dart.override
    2974            0 :   int get hashCode => Object.hash(is$, key, kind, pattern, value);
    2975              : }
    2976              : 
    2977              : ///
    2978              : @_NameSource('spec')
    2979              : class PushRule {
    2980           33 :   PushRule({
    2981              :     required this.actions,
    2982              :     this.conditions,
    2983              :     required this.default$,
    2984              :     required this.enabled,
    2985              :     this.pattern,
    2986              :     required this.ruleId,
    2987              :   });
    2988              : 
    2989           33 :   PushRule.fromJson(Map<String, Object?> json)
    2990          132 :       : actions = (json['actions'] as List).map((v) => v as Object?).toList(),
    2991           33 :         conditions = ((v) => v != null
    2992              :             ? (v as List)
    2993           99 :                 .map((v) => PushCondition.fromJson(v as Map<String, Object?>))
    2994           33 :                 .toList()
    2995           66 :             : null)(json['conditions']),
    2996           33 :         default$ = json['default'] as bool,
    2997           33 :         enabled = json['enabled'] as bool,
    2998           99 :         pattern = ((v) => v != null ? v as String : null)(json['pattern']),
    2999           33 :         ruleId = json['rule_id'] as String;
    3000            0 :   Map<String, Object?> toJson() {
    3001            0 :     final conditions = this.conditions;
    3002            0 :     final pattern = this.pattern;
    3003            0 :     return {
    3004            0 :       'actions': actions.map((v) => v).toList(),
    3005              :       if (conditions != null)
    3006            0 :         'conditions': conditions.map((v) => v.toJson()).toList(),
    3007            0 :       'default': default$,
    3008            0 :       'enabled': enabled,
    3009            0 :       if (pattern != null) 'pattern': pattern,
    3010            0 :       'rule_id': ruleId,
    3011              :     };
    3012              :   }
    3013              : 
    3014              :   /// The actions to perform when this rule is matched.
    3015              :   List<Object?> actions;
    3016              : 
    3017              :   /// The conditions that must hold true for an event in order for a rule to be
    3018              :   /// applied to an event. A rule with no conditions always matches. Only
    3019              :   /// applicable to `underride` and `override` rules.
    3020              :   List<PushCondition>? conditions;
    3021              : 
    3022              :   /// Whether this is a default rule, or has been set explicitly.
    3023              :   bool default$;
    3024              : 
    3025              :   /// Whether the push rule is enabled or not.
    3026              :   bool enabled;
    3027              : 
    3028              :   /// The [glob-style pattern](https://spec.matrix.org/unstable/appendices#glob-style-matching) to match against.
    3029              :   /// Only applicable to `content` rules.
    3030              :   String? pattern;
    3031              : 
    3032              :   /// The ID of this rule.
    3033              :   String ruleId;
    3034              : 
    3035            0 :   @dart.override
    3036              :   bool operator ==(Object other) =>
    3037              :       identical(this, other) ||
    3038            0 :       (other is PushRule &&
    3039            0 :           other.runtimeType == runtimeType &&
    3040            0 :           other.actions == actions &&
    3041            0 :           other.conditions == conditions &&
    3042            0 :           other.default$ == default$ &&
    3043            0 :           other.enabled == enabled &&
    3044            0 :           other.pattern == pattern &&
    3045            0 :           other.ruleId == ruleId);
    3046              : 
    3047            0 :   @dart.override
    3048              :   int get hashCode =>
    3049            0 :       Object.hash(actions, conditions, default$, enabled, pattern, ruleId);
    3050              : }
    3051              : 
    3052              : ///
    3053              : @_NameSource('rule override generated')
    3054              : class PushRuleSet {
    3055            2 :   PushRuleSet({
    3056              :     this.content,
    3057              :     this.override,
    3058              :     this.room,
    3059              :     this.sender,
    3060              :     this.underride,
    3061              :   });
    3062              : 
    3063           33 :   PushRuleSet.fromJson(Map<String, Object?> json)
    3064           33 :       : content = ((v) => v != null
    3065              :             ? (v as List)
    3066           99 :                 .map((v) => PushRule.fromJson(v as Map<String, Object?>))
    3067           33 :                 .toList()
    3068           66 :             : null)(json['content']),
    3069           33 :         override = ((v) => v != null
    3070              :             ? (v as List)
    3071           99 :                 .map((v) => PushRule.fromJson(v as Map<String, Object?>))
    3072           33 :                 .toList()
    3073           66 :             : null)(json['override']),
    3074           33 :         room = ((v) => v != null
    3075              :             ? (v as List)
    3076           99 :                 .map((v) => PushRule.fromJson(v as Map<String, Object?>))
    3077           33 :                 .toList()
    3078           66 :             : null)(json['room']),
    3079           33 :         sender = ((v) => v != null
    3080              :             ? (v as List)
    3081           33 :                 .map((v) => PushRule.fromJson(v as Map<String, Object?>))
    3082           33 :                 .toList()
    3083           66 :             : null)(json['sender']),
    3084           33 :         underride = ((v) => v != null
    3085              :             ? (v as List)
    3086           99 :                 .map((v) => PushRule.fromJson(v as Map<String, Object?>))
    3087           33 :                 .toList()
    3088           66 :             : null)(json['underride']);
    3089            0 :   Map<String, Object?> toJson() {
    3090            0 :     final content = this.content;
    3091            0 :     final override = this.override;
    3092            0 :     final room = this.room;
    3093            0 :     final sender = this.sender;
    3094            0 :     final underride = this.underride;
    3095            0 :     return {
    3096            0 :       if (content != null) 'content': content.map((v) => v.toJson()).toList(),
    3097              :       if (override != null)
    3098            0 :         'override': override.map((v) => v.toJson()).toList(),
    3099            0 :       if (room != null) 'room': room.map((v) => v.toJson()).toList(),
    3100            0 :       if (sender != null) 'sender': sender.map((v) => v.toJson()).toList(),
    3101              :       if (underride != null)
    3102            0 :         'underride': underride.map((v) => v.toJson()).toList(),
    3103              :     };
    3104              :   }
    3105              : 
    3106              :   ///
    3107              :   List<PushRule>? content;
    3108              : 
    3109              :   ///
    3110              :   List<PushRule>? override;
    3111              : 
    3112              :   ///
    3113              :   List<PushRule>? room;
    3114              : 
    3115              :   ///
    3116              :   List<PushRule>? sender;
    3117              : 
    3118              :   ///
    3119              :   List<PushRule>? underride;
    3120              : 
    3121            0 :   @dart.override
    3122              :   bool operator ==(Object other) =>
    3123              :       identical(this, other) ||
    3124            0 :       (other is PushRuleSet &&
    3125            0 :           other.runtimeType == runtimeType &&
    3126            0 :           other.content == content &&
    3127            0 :           other.override == override &&
    3128            0 :           other.room == room &&
    3129            0 :           other.sender == sender &&
    3130            0 :           other.underride == underride);
    3131              : 
    3132            0 :   @dart.override
    3133            0 :   int get hashCode => Object.hash(content, override, room, sender, underride);
    3134              : }
    3135              : 
    3136              : ///
    3137              : @_NameSource('generated')
    3138              : class GetPushRulesGlobalResponse {
    3139            0 :   GetPushRulesGlobalResponse({
    3140              :     this.content,
    3141              :     this.override,
    3142              :     this.room,
    3143              :     this.sender,
    3144              :     this.underride,
    3145              :   });
    3146              : 
    3147            0 :   GetPushRulesGlobalResponse.fromJson(Map<String, Object?> json)
    3148            0 :       : content = ((v) => v != null
    3149              :             ? (v as List)
    3150            0 :                 .map((v) => PushRule.fromJson(v as Map<String, Object?>))
    3151            0 :                 .toList()
    3152            0 :             : null)(json['content']),
    3153            0 :         override = ((v) => v != null
    3154              :             ? (v as List)
    3155            0 :                 .map((v) => PushRule.fromJson(v as Map<String, Object?>))
    3156            0 :                 .toList()
    3157            0 :             : null)(json['override']),
    3158            0 :         room = ((v) => v != null
    3159              :             ? (v as List)
    3160            0 :                 .map((v) => PushRule.fromJson(v as Map<String, Object?>))
    3161            0 :                 .toList()
    3162            0 :             : null)(json['room']),
    3163            0 :         sender = ((v) => v != null
    3164              :             ? (v as List)
    3165            0 :                 .map((v) => PushRule.fromJson(v as Map<String, Object?>))
    3166            0 :                 .toList()
    3167            0 :             : null)(json['sender']),
    3168            0 :         underride = ((v) => v != null
    3169              :             ? (v as List)
    3170            0 :                 .map((v) => PushRule.fromJson(v as Map<String, Object?>))
    3171            0 :                 .toList()
    3172            0 :             : null)(json['underride']);
    3173            0 :   Map<String, Object?> toJson() {
    3174            0 :     final content = this.content;
    3175            0 :     final override = this.override;
    3176            0 :     final room = this.room;
    3177            0 :     final sender = this.sender;
    3178            0 :     final underride = this.underride;
    3179            0 :     return {
    3180            0 :       if (content != null) 'content': content.map((v) => v.toJson()).toList(),
    3181              :       if (override != null)
    3182            0 :         'override': override.map((v) => v.toJson()).toList(),
    3183            0 :       if (room != null) 'room': room.map((v) => v.toJson()).toList(),
    3184            0 :       if (sender != null) 'sender': sender.map((v) => v.toJson()).toList(),
    3185              :       if (underride != null)
    3186            0 :         'underride': underride.map((v) => v.toJson()).toList(),
    3187              :     };
    3188              :   }
    3189              : 
    3190              :   ///
    3191              :   List<PushRule>? content;
    3192              : 
    3193              :   ///
    3194              :   List<PushRule>? override;
    3195              : 
    3196              :   ///
    3197              :   List<PushRule>? room;
    3198              : 
    3199              :   ///
    3200              :   List<PushRule>? sender;
    3201              : 
    3202              :   ///
    3203              :   List<PushRule>? underride;
    3204              : 
    3205            0 :   @dart.override
    3206              :   bool operator ==(Object other) =>
    3207              :       identical(this, other) ||
    3208            0 :       (other is GetPushRulesGlobalResponse &&
    3209            0 :           other.runtimeType == runtimeType &&
    3210            0 :           other.content == content &&
    3211            0 :           other.override == override &&
    3212            0 :           other.room == room &&
    3213            0 :           other.sender == sender &&
    3214            0 :           other.underride == underride);
    3215              : 
    3216            0 :   @dart.override
    3217            0 :   int get hashCode => Object.hash(content, override, room, sender, underride);
    3218              : }
    3219              : 
    3220              : ///
    3221              : @_NameSource('rule override generated')
    3222              : enum PushRuleKind {
    3223              :   content('content'),
    3224              :   override('override'),
    3225              :   room('room'),
    3226              :   sender('sender'),
    3227              :   underride('underride');
    3228              : 
    3229              :   final String name;
    3230              :   const PushRuleKind(this.name);
    3231              : }
    3232              : 
    3233              : ///
    3234              : @_NameSource('generated')
    3235              : class RefreshResponse {
    3236            0 :   RefreshResponse({
    3237              :     required this.accessToken,
    3238              :     this.expiresInMs,
    3239              :     this.refreshToken,
    3240              :   });
    3241              : 
    3242            1 :   RefreshResponse.fromJson(Map<String, Object?> json)
    3243            1 :       : accessToken = json['access_token'] as String,
    3244              :         expiresInMs =
    3245            3 :             ((v) => v != null ? v as int : null)(json['expires_in_ms']),
    3246              :         refreshToken =
    3247            3 :             ((v) => v != null ? v as String : null)(json['refresh_token']);
    3248            0 :   Map<String, Object?> toJson() {
    3249            0 :     final expiresInMs = this.expiresInMs;
    3250            0 :     final refreshToken = this.refreshToken;
    3251            0 :     return {
    3252            0 :       'access_token': accessToken,
    3253            0 :       if (expiresInMs != null) 'expires_in_ms': expiresInMs,
    3254            0 :       if (refreshToken != null) 'refresh_token': refreshToken,
    3255              :     };
    3256              :   }
    3257              : 
    3258              :   /// The new access token to use.
    3259              :   String accessToken;
    3260              : 
    3261              :   /// The lifetime of the access token, in milliseconds. If not
    3262              :   /// given, the client can assume that the access token will not
    3263              :   /// expire.
    3264              :   int? expiresInMs;
    3265              : 
    3266              :   /// The new refresh token to use when the access token needs to
    3267              :   /// be refreshed again. If not given, the old refresh token can
    3268              :   /// be re-used.
    3269              :   String? refreshToken;
    3270              : 
    3271            0 :   @dart.override
    3272              :   bool operator ==(Object other) =>
    3273              :       identical(this, other) ||
    3274            0 :       (other is RefreshResponse &&
    3275            0 :           other.runtimeType == runtimeType &&
    3276            0 :           other.accessToken == accessToken &&
    3277            0 :           other.expiresInMs == expiresInMs &&
    3278            0 :           other.refreshToken == refreshToken);
    3279              : 
    3280            0 :   @dart.override
    3281            0 :   int get hashCode => Object.hash(accessToken, expiresInMs, refreshToken);
    3282              : }
    3283              : 
    3284              : ///
    3285              : @_NameSource('rule override generated')
    3286              : enum AccountKind {
    3287              :   guest('guest'),
    3288              :   user('user');
    3289              : 
    3290              :   final String name;
    3291              :   const AccountKind(this.name);
    3292              : }
    3293              : 
    3294              : ///
    3295              : @_NameSource('generated')
    3296              : class RegisterResponse {
    3297            0 :   RegisterResponse({
    3298              :     this.accessToken,
    3299              :     this.deviceId,
    3300              :     this.expiresInMs,
    3301              :     this.homeServer,
    3302              :     this.refreshToken,
    3303              :     required this.userId,
    3304              :   });
    3305              : 
    3306            0 :   RegisterResponse.fromJson(Map<String, Object?> json)
    3307              :       : accessToken =
    3308            0 :             ((v) => v != null ? v as String : null)(json['access_token']),
    3309            0 :         deviceId = ((v) => v != null ? v as String : null)(json['device_id']),
    3310              :         expiresInMs =
    3311            0 :             ((v) => v != null ? v as int : null)(json['expires_in_ms']),
    3312              :         homeServer =
    3313            0 :             ((v) => v != null ? v as String : null)(json['home_server']),
    3314              :         refreshToken =
    3315            0 :             ((v) => v != null ? v as String : null)(json['refresh_token']),
    3316            0 :         userId = json['user_id'] as String;
    3317            0 :   Map<String, Object?> toJson() {
    3318            0 :     final accessToken = this.accessToken;
    3319            0 :     final deviceId = this.deviceId;
    3320            0 :     final expiresInMs = this.expiresInMs;
    3321            0 :     final homeServer = this.homeServer;
    3322            0 :     final refreshToken = this.refreshToken;
    3323            0 :     return {
    3324            0 :       if (accessToken != null) 'access_token': accessToken,
    3325            0 :       if (deviceId != null) 'device_id': deviceId,
    3326            0 :       if (expiresInMs != null) 'expires_in_ms': expiresInMs,
    3327            0 :       if (homeServer != null) 'home_server': homeServer,
    3328            0 :       if (refreshToken != null) 'refresh_token': refreshToken,
    3329            0 :       'user_id': userId,
    3330              :     };
    3331              :   }
    3332              : 
    3333              :   /// An access token for the account.
    3334              :   /// This access token can then be used to authorize other requests.
    3335              :   /// Required if the `inhibit_login` option is false.
    3336              :   String? accessToken;
    3337              : 
    3338              :   /// ID of the registered device. Will be the same as the
    3339              :   /// corresponding parameter in the request, if one was specified.
    3340              :   /// Required if the `inhibit_login` option is false.
    3341              :   String? deviceId;
    3342              : 
    3343              :   /// The lifetime of the access token, in milliseconds. Once
    3344              :   /// the access token has expired a new access token can be
    3345              :   /// obtained by using the provided refresh token. If no
    3346              :   /// refresh token is provided, the client will need to re-log in
    3347              :   /// to obtain a new access token. If not given, the client can
    3348              :   /// assume that the access token will not expire.
    3349              :   ///
    3350              :   /// Omitted if the `inhibit_login` option is true.
    3351              :   int? expiresInMs;
    3352              : 
    3353              :   /// The server_name of the homeserver on which the account has
    3354              :   /// been registered.
    3355              :   ///
    3356              :   /// **Deprecated**. Clients should extract the server_name from
    3357              :   /// `user_id` (by splitting at the first colon) if they require
    3358              :   /// it. Note also that `homeserver` is not spelt this way.
    3359              :   String? homeServer;
    3360              : 
    3361              :   /// A refresh token for the account. This token can be used to
    3362              :   /// obtain a new access token when it expires by calling the
    3363              :   /// `/refresh` endpoint.
    3364              :   ///
    3365              :   /// Omitted if the `inhibit_login` option is true.
    3366              :   String? refreshToken;
    3367              : 
    3368              :   /// The fully-qualified Matrix user ID (MXID) that has been registered.
    3369              :   ///
    3370              :   /// Any user ID returned by this API must conform to the grammar given in the
    3371              :   /// [Matrix specification](https://spec.matrix.org/unstable/appendices/#user-identifiers).
    3372              :   String userId;
    3373              : 
    3374            0 :   @dart.override
    3375              :   bool operator ==(Object other) =>
    3376              :       identical(this, other) ||
    3377            0 :       (other is RegisterResponse &&
    3378            0 :           other.runtimeType == runtimeType &&
    3379            0 :           other.accessToken == accessToken &&
    3380            0 :           other.deviceId == deviceId &&
    3381            0 :           other.expiresInMs == expiresInMs &&
    3382            0 :           other.homeServer == homeServer &&
    3383            0 :           other.refreshToken == refreshToken &&
    3384            0 :           other.userId == userId);
    3385              : 
    3386            0 :   @dart.override
    3387            0 :   int get hashCode => Object.hash(
    3388            0 :         accessToken,
    3389            0 :         deviceId,
    3390            0 :         expiresInMs,
    3391            0 :         homeServer,
    3392            0 :         refreshToken,
    3393            0 :         userId,
    3394              :       );
    3395              : }
    3396              : 
    3397              : ///
    3398              : @_NameSource('spec')
    3399              : class RoomKeysUpdateResponse {
    3400            0 :   RoomKeysUpdateResponse({
    3401              :     required this.count,
    3402              :     required this.etag,
    3403              :   });
    3404              : 
    3405            4 :   RoomKeysUpdateResponse.fromJson(Map<String, Object?> json)
    3406            4 :       : count = json['count'] as int,
    3407            4 :         etag = json['etag'] as String;
    3408            0 :   Map<String, Object?> toJson() => {
    3409            0 :         'count': count,
    3410            0 :         'etag': etag,
    3411              :       };
    3412              : 
    3413              :   /// The number of keys stored in the backup
    3414              :   int count;
    3415              : 
    3416              :   /// The new etag value representing stored keys in the backup.
    3417              :   /// See `GET /room_keys/version/{version}` for more details.
    3418              :   String etag;
    3419              : 
    3420            0 :   @dart.override
    3421              :   bool operator ==(Object other) =>
    3422              :       identical(this, other) ||
    3423            0 :       (other is RoomKeysUpdateResponse &&
    3424            0 :           other.runtimeType == runtimeType &&
    3425            0 :           other.count == count &&
    3426            0 :           other.etag == etag);
    3427              : 
    3428            0 :   @dart.override
    3429            0 :   int get hashCode => Object.hash(count, etag);
    3430              : }
    3431              : 
    3432              : /// The key data
    3433              : @_NameSource('spec')
    3434              : class KeyBackupData {
    3435            4 :   KeyBackupData({
    3436              :     required this.firstMessageIndex,
    3437              :     required this.forwardedCount,
    3438              :     required this.isVerified,
    3439              :     required this.sessionData,
    3440              :   });
    3441              : 
    3442            1 :   KeyBackupData.fromJson(Map<String, Object?> json)
    3443            1 :       : firstMessageIndex = json['first_message_index'] as int,
    3444            1 :         forwardedCount = json['forwarded_count'] as int,
    3445            1 :         isVerified = json['is_verified'] as bool,
    3446            1 :         sessionData = json['session_data'] as Map<String, Object?>;
    3447            8 :   Map<String, Object?> toJson() => {
    3448            4 :         'first_message_index': firstMessageIndex,
    3449            4 :         'forwarded_count': forwardedCount,
    3450            4 :         'is_verified': isVerified,
    3451            4 :         'session_data': sessionData,
    3452              :       };
    3453              : 
    3454              :   /// The index of the first message in the session that the key can decrypt.
    3455              :   int firstMessageIndex;
    3456              : 
    3457              :   /// The number of times this key has been forwarded via key-sharing between devices.
    3458              :   int forwardedCount;
    3459              : 
    3460              :   /// Whether the device backing up the key verified the device that the key
    3461              :   /// is from.
    3462              :   bool isVerified;
    3463              : 
    3464              :   /// Algorithm-dependent data.  See the documentation for the backup
    3465              :   /// algorithms in [Server-side key backups](https://spec.matrix.org/unstable/client-server-api/#server-side-key-backups) for more information on the
    3466              :   /// expected format of the data.
    3467              :   Map<String, Object?> sessionData;
    3468              : 
    3469            0 :   @dart.override
    3470              :   bool operator ==(Object other) =>
    3471              :       identical(this, other) ||
    3472            0 :       (other is KeyBackupData &&
    3473            0 :           other.runtimeType == runtimeType &&
    3474            0 :           other.firstMessageIndex == firstMessageIndex &&
    3475            0 :           other.forwardedCount == forwardedCount &&
    3476            0 :           other.isVerified == isVerified &&
    3477            0 :           other.sessionData == sessionData);
    3478              : 
    3479            0 :   @dart.override
    3480              :   int get hashCode =>
    3481            0 :       Object.hash(firstMessageIndex, forwardedCount, isVerified, sessionData);
    3482              : }
    3483              : 
    3484              : /// The backed up keys for a room.
    3485              : @_NameSource('spec')
    3486              : class RoomKeyBackup {
    3487            4 :   RoomKeyBackup({
    3488              :     required this.sessions,
    3489              :   });
    3490              : 
    3491            1 :   RoomKeyBackup.fromJson(Map<String, Object?> json)
    3492            2 :       : sessions = (json['sessions'] as Map<String, Object?>).map(
    3493            1 :           (k, v) =>
    3494            2 :               MapEntry(k, KeyBackupData.fromJson(v as Map<String, Object?>)),
    3495              :         );
    3496            8 :   Map<String, Object?> toJson() => {
    3497           20 :         'sessions': sessions.map((k, v) => MapEntry(k, v.toJson())),
    3498              :       };
    3499              : 
    3500              :   /// A map of session IDs to key data.
    3501              :   Map<String, KeyBackupData> sessions;
    3502              : 
    3503            0 :   @dart.override
    3504              :   bool operator ==(Object other) =>
    3505              :       identical(this, other) ||
    3506            0 :       (other is RoomKeyBackup &&
    3507            0 :           other.runtimeType == runtimeType &&
    3508            0 :           other.sessions == sessions);
    3509              : 
    3510            0 :   @dart.override
    3511            0 :   int get hashCode => sessions.hashCode;
    3512              : }
    3513              : 
    3514              : ///
    3515              : @_NameSource('rule override generated')
    3516              : class RoomKeys {
    3517            4 :   RoomKeys({
    3518              :     required this.rooms,
    3519              :   });
    3520              : 
    3521            1 :   RoomKeys.fromJson(Map<String, Object?> json)
    3522            2 :       : rooms = (json['rooms'] as Map<String, Object?>).map(
    3523            1 :           (k, v) =>
    3524            2 :               MapEntry(k, RoomKeyBackup.fromJson(v as Map<String, Object?>)),
    3525              :         );
    3526            8 :   Map<String, Object?> toJson() => {
    3527           20 :         'rooms': rooms.map((k, v) => MapEntry(k, v.toJson())),
    3528              :       };
    3529              : 
    3530              :   /// A map of room IDs to room key backup data.
    3531              :   Map<String, RoomKeyBackup> rooms;
    3532              : 
    3533            0 :   @dart.override
    3534              :   bool operator ==(Object other) =>
    3535              :       identical(this, other) ||
    3536            0 :       (other is RoomKeys &&
    3537            0 :           other.runtimeType == runtimeType &&
    3538            0 :           other.rooms == rooms);
    3539              : 
    3540            0 :   @dart.override
    3541            0 :   int get hashCode => rooms.hashCode;
    3542              : }
    3543              : 
    3544              : ///
    3545              : @_NameSource('rule override generated')
    3546              : enum BackupAlgorithm {
    3547              :   mMegolmBackupV1Curve25519AesSha2('m.megolm_backup.v1.curve25519-aes-sha2');
    3548              : 
    3549              :   final String name;
    3550              :   const BackupAlgorithm(this.name);
    3551              : }
    3552              : 
    3553              : ///
    3554              : @_NameSource('generated')
    3555              : class GetRoomKeysVersionCurrentResponse {
    3556            0 :   GetRoomKeysVersionCurrentResponse({
    3557              :     required this.algorithm,
    3558              :     required this.authData,
    3559              :     required this.count,
    3560              :     required this.etag,
    3561              :     required this.version,
    3562              :   });
    3563              : 
    3564            5 :   GetRoomKeysVersionCurrentResponse.fromJson(Map<String, Object?> json)
    3565              :       : algorithm =
    3566           10 :             BackupAlgorithm.values.fromString(json['algorithm'] as String)!,
    3567            5 :         authData = json['auth_data'] as Map<String, Object?>,
    3568            5 :         count = json['count'] as int,
    3569            5 :         etag = json['etag'] as String,
    3570            5 :         version = json['version'] as String;
    3571            0 :   Map<String, Object?> toJson() => {
    3572            0 :         'algorithm': algorithm.name,
    3573            0 :         'auth_data': authData,
    3574            0 :         'count': count,
    3575            0 :         'etag': etag,
    3576            0 :         'version': version,
    3577              :       };
    3578              : 
    3579              :   /// The algorithm used for storing backups.
    3580              :   BackupAlgorithm algorithm;
    3581              : 
    3582              :   /// Algorithm-dependent data. See the documentation for the backup
    3583              :   /// algorithms in [Server-side key backups](https://spec.matrix.org/unstable/client-server-api/#server-side-key-backups) for more information on the
    3584              :   /// expected format of the data.
    3585              :   Map<String, Object?> authData;
    3586              : 
    3587              :   /// The number of keys stored in the backup.
    3588              :   int count;
    3589              : 
    3590              :   /// An opaque string representing stored keys in the backup.
    3591              :   /// Clients can compare it with the `etag` value they received
    3592              :   /// in the request of their last key storage request.  If not
    3593              :   /// equal, another client has modified the backup.
    3594              :   String etag;
    3595              : 
    3596              :   /// The backup version.
    3597              :   String version;
    3598              : 
    3599            0 :   @dart.override
    3600              :   bool operator ==(Object other) =>
    3601              :       identical(this, other) ||
    3602            0 :       (other is GetRoomKeysVersionCurrentResponse &&
    3603            0 :           other.runtimeType == runtimeType &&
    3604            0 :           other.algorithm == algorithm &&
    3605            0 :           other.authData == authData &&
    3606            0 :           other.count == count &&
    3607            0 :           other.etag == etag &&
    3608            0 :           other.version == version);
    3609              : 
    3610            0 :   @dart.override
    3611            0 :   int get hashCode => Object.hash(algorithm, authData, count, etag, version);
    3612              : }
    3613              : 
    3614              : ///
    3615              : @_NameSource('generated')
    3616              : class GetRoomKeysVersionResponse {
    3617            0 :   GetRoomKeysVersionResponse({
    3618              :     required this.algorithm,
    3619              :     required this.authData,
    3620              :     required this.count,
    3621              :     required this.etag,
    3622              :     required this.version,
    3623              :   });
    3624              : 
    3625            0 :   GetRoomKeysVersionResponse.fromJson(Map<String, Object?> json)
    3626              :       : algorithm =
    3627            0 :             BackupAlgorithm.values.fromString(json['algorithm'] as String)!,
    3628            0 :         authData = json['auth_data'] as Map<String, Object?>,
    3629            0 :         count = json['count'] as int,
    3630            0 :         etag = json['etag'] as String,
    3631            0 :         version = json['version'] as String;
    3632            0 :   Map<String, Object?> toJson() => {
    3633            0 :         'algorithm': algorithm.name,
    3634            0 :         'auth_data': authData,
    3635            0 :         'count': count,
    3636            0 :         'etag': etag,
    3637            0 :         'version': version,
    3638              :       };
    3639              : 
    3640              :   /// The algorithm used for storing backups.
    3641              :   BackupAlgorithm algorithm;
    3642              : 
    3643              :   /// Algorithm-dependent data. See the documentation for the backup
    3644              :   /// algorithms in [Server-side key backups](https://spec.matrix.org/unstable/client-server-api/#server-side-key-backups) for more information on the
    3645              :   /// expected format of the data.
    3646              :   Map<String, Object?> authData;
    3647              : 
    3648              :   /// The number of keys stored in the backup.
    3649              :   int count;
    3650              : 
    3651              :   /// An opaque string representing stored keys in the backup.
    3652              :   /// Clients can compare it with the `etag` value they received
    3653              :   /// in the request of their last key storage request.  If not
    3654              :   /// equal, another client has modified the backup.
    3655              :   String etag;
    3656              : 
    3657              :   /// The backup version.
    3658              :   String version;
    3659              : 
    3660            0 :   @dart.override
    3661              :   bool operator ==(Object other) =>
    3662              :       identical(this, other) ||
    3663            0 :       (other is GetRoomKeysVersionResponse &&
    3664            0 :           other.runtimeType == runtimeType &&
    3665            0 :           other.algorithm == algorithm &&
    3666            0 :           other.authData == authData &&
    3667            0 :           other.count == count &&
    3668            0 :           other.etag == etag &&
    3669            0 :           other.version == version);
    3670              : 
    3671            0 :   @dart.override
    3672            0 :   int get hashCode => Object.hash(algorithm, authData, count, etag, version);
    3673              : }
    3674              : 
    3675              : /// The events and state surrounding the requested event.
    3676              : @_NameSource('rule override generated')
    3677              : class EventContext {
    3678            0 :   EventContext({
    3679              :     this.end,
    3680              :     this.event,
    3681              :     this.eventsAfter,
    3682              :     this.eventsBefore,
    3683              :     this.start,
    3684              :     this.state,
    3685              :   });
    3686              : 
    3687            0 :   EventContext.fromJson(Map<String, Object?> json)
    3688            0 :       : end = ((v) => v != null ? v as String : null)(json['end']),
    3689            0 :         event = ((v) => v != null
    3690            0 :             ? MatrixEvent.fromJson(v as Map<String, Object?>)
    3691            0 :             : null)(json['event']),
    3692            0 :         eventsAfter = ((v) => v != null
    3693              :             ? (v as List)
    3694            0 :                 .map((v) => MatrixEvent.fromJson(v as Map<String, Object?>))
    3695            0 :                 .toList()
    3696            0 :             : null)(json['events_after']),
    3697            0 :         eventsBefore = ((v) => v != null
    3698              :             ? (v as List)
    3699            0 :                 .map((v) => MatrixEvent.fromJson(v as Map<String, Object?>))
    3700            0 :                 .toList()
    3701            0 :             : null)(json['events_before']),
    3702            0 :         start = ((v) => v != null ? v as String : null)(json['start']),
    3703            0 :         state = ((v) => v != null
    3704              :             ? (v as List)
    3705            0 :                 .map((v) => MatrixEvent.fromJson(v as Map<String, Object?>))
    3706            0 :                 .toList()
    3707            0 :             : null)(json['state']);
    3708            0 :   Map<String, Object?> toJson() {
    3709            0 :     final end = this.end;
    3710            0 :     final event = this.event;
    3711            0 :     final eventsAfter = this.eventsAfter;
    3712            0 :     final eventsBefore = this.eventsBefore;
    3713            0 :     final start = this.start;
    3714            0 :     final state = this.state;
    3715            0 :     return {
    3716            0 :       if (end != null) 'end': end,
    3717            0 :       if (event != null) 'event': event.toJson(),
    3718              :       if (eventsAfter != null)
    3719            0 :         'events_after': eventsAfter.map((v) => v.toJson()).toList(),
    3720              :       if (eventsBefore != null)
    3721            0 :         'events_before': eventsBefore.map((v) => v.toJson()).toList(),
    3722            0 :       if (start != null) 'start': start,
    3723            0 :       if (state != null) 'state': state.map((v) => v.toJson()).toList(),
    3724              :     };
    3725              :   }
    3726              : 
    3727              :   /// A token that can be used to paginate forwards with.
    3728              :   String? end;
    3729              : 
    3730              :   /// Details of the requested event.
    3731              :   MatrixEvent? event;
    3732              : 
    3733              :   /// A list of room events that happened just after the
    3734              :   /// requested event, in chronological order.
    3735              :   List<MatrixEvent>? eventsAfter;
    3736              : 
    3737              :   /// A list of room events that happened just before the
    3738              :   /// requested event, in reverse-chronological order.
    3739              :   List<MatrixEvent>? eventsBefore;
    3740              : 
    3741              :   /// A token that can be used to paginate backwards with.
    3742              :   String? start;
    3743              : 
    3744              :   /// The state of the room at the last event returned.
    3745              :   List<MatrixEvent>? state;
    3746              : 
    3747            0 :   @dart.override
    3748              :   bool operator ==(Object other) =>
    3749              :       identical(this, other) ||
    3750            0 :       (other is EventContext &&
    3751            0 :           other.runtimeType == runtimeType &&
    3752            0 :           other.end == end &&
    3753            0 :           other.event == event &&
    3754            0 :           other.eventsAfter == eventsAfter &&
    3755            0 :           other.eventsBefore == eventsBefore &&
    3756            0 :           other.start == start &&
    3757            0 :           other.state == state);
    3758              : 
    3759            0 :   @dart.override
    3760              :   int get hashCode =>
    3761            0 :       Object.hash(end, event, eventsAfter, eventsBefore, start, state);
    3762              : }
    3763              : 
    3764              : ///
    3765              : @_NameSource('spec')
    3766              : class RoomMember {
    3767            0 :   RoomMember({
    3768              :     this.avatarUrl,
    3769              :     this.displayName,
    3770              :   });
    3771              : 
    3772            0 :   RoomMember.fromJson(Map<String, Object?> json)
    3773            0 :       : avatarUrl = ((v) =>
    3774            0 :             v != null ? Uri.parse(v as String) : null)(json['avatar_url']),
    3775              :         displayName =
    3776            0 :             ((v) => v != null ? v as String : null)(json['display_name']);
    3777            0 :   Map<String, Object?> toJson() {
    3778            0 :     final avatarUrl = this.avatarUrl;
    3779            0 :     final displayName = this.displayName;
    3780            0 :     return {
    3781            0 :       if (avatarUrl != null) 'avatar_url': avatarUrl.toString(),
    3782            0 :       if (displayName != null) 'display_name': displayName,
    3783              :     };
    3784              :   }
    3785              : 
    3786              :   /// The avatar of the user this object is representing, as an [`mxc://` URI](https://spec.matrix.org/unstable/client-server-api/#matrix-content-mxc-uris).
    3787              :   Uri? avatarUrl;
    3788              : 
    3789              :   /// The display name of the user this object is representing.
    3790              :   String? displayName;
    3791              : 
    3792            0 :   @dart.override
    3793              :   bool operator ==(Object other) =>
    3794              :       identical(this, other) ||
    3795            0 :       (other is RoomMember &&
    3796            0 :           other.runtimeType == runtimeType &&
    3797            0 :           other.avatarUrl == avatarUrl &&
    3798            0 :           other.displayName == displayName);
    3799              : 
    3800            0 :   @dart.override
    3801            0 :   int get hashCode => Object.hash(avatarUrl, displayName);
    3802              : }
    3803              : 
    3804              : ///
    3805              : @_NameSource('(generated, rule override generated)')
    3806              : enum Membership {
    3807              :   ban('ban'),
    3808              :   invite('invite'),
    3809              :   join('join'),
    3810              :   knock('knock'),
    3811              :   leave('leave');
    3812              : 
    3813              :   final String name;
    3814              :   const Membership(this.name);
    3815              : }
    3816              : 
    3817              : /// A list of messages with a new token to request more.
    3818              : @_NameSource('generated')
    3819              : class GetRoomEventsResponse {
    3820            0 :   GetRoomEventsResponse({
    3821              :     required this.chunk,
    3822              :     this.end,
    3823              :     required this.start,
    3824              :     this.state,
    3825              :   });
    3826              : 
    3827            4 :   GetRoomEventsResponse.fromJson(Map<String, Object?> json)
    3828            4 :       : chunk = (json['chunk'] as List)
    3829           12 :             .map((v) => MatrixEvent.fromJson(v as Map<String, Object?>))
    3830            4 :             .toList(),
    3831           12 :         end = ((v) => v != null ? v as String : null)(json['end']),
    3832            4 :         start = json['start'] as String,
    3833            4 :         state = ((v) => v != null
    3834              :             ? (v as List)
    3835            4 :                 .map((v) => MatrixEvent.fromJson(v as Map<String, Object?>))
    3836            4 :                 .toList()
    3837            8 :             : null)(json['state']);
    3838            0 :   Map<String, Object?> toJson() {
    3839            0 :     final end = this.end;
    3840            0 :     final state = this.state;
    3841            0 :     return {
    3842            0 :       'chunk': chunk.map((v) => v.toJson()).toList(),
    3843            0 :       if (end != null) 'end': end,
    3844            0 :       'start': start,
    3845            0 :       if (state != null) 'state': state.map((v) => v.toJson()).toList(),
    3846              :     };
    3847              :   }
    3848              : 
    3849              :   /// A list of room events. The order depends on the `dir` parameter.
    3850              :   /// For `dir=b` events will be in reverse-chronological order,
    3851              :   /// for `dir=f` in chronological order. (The exact definition of `chronological`
    3852              :   /// is dependent on the server implementation.)
    3853              :   ///
    3854              :   /// Note that an empty `chunk` does not *necessarily* imply that no more events
    3855              :   /// are available. Clients should continue to paginate until no `end` property
    3856              :   /// is returned.
    3857              :   List<MatrixEvent> chunk;
    3858              : 
    3859              :   /// A token corresponding to the end of `chunk`. This token can be passed
    3860              :   /// back to this endpoint to request further events.
    3861              :   ///
    3862              :   /// If no further events are available (either because we have
    3863              :   /// reached the start of the timeline, or because the user does
    3864              :   /// not have permission to see any more events), this property
    3865              :   /// is omitted from the response.
    3866              :   String? end;
    3867              : 
    3868              :   /// A token corresponding to the start of `chunk`. This will be the same as
    3869              :   /// the value given in `from`.
    3870              :   String start;
    3871              : 
    3872              :   /// A list of state events relevant to showing the `chunk`. For example, if
    3873              :   /// `lazy_load_members` is enabled in the filter then this may contain
    3874              :   /// the membership events for the senders of events in the `chunk`.
    3875              :   ///
    3876              :   /// Unless `include_redundant_members` is `true`, the server
    3877              :   /// may remove membership events which would have already been
    3878              :   /// sent to the client in prior calls to this endpoint, assuming
    3879              :   /// the membership of those members has not changed.
    3880              :   List<MatrixEvent>? state;
    3881              : 
    3882            0 :   @dart.override
    3883              :   bool operator ==(Object other) =>
    3884              :       identical(this, other) ||
    3885            0 :       (other is GetRoomEventsResponse &&
    3886            0 :           other.runtimeType == runtimeType &&
    3887            0 :           other.chunk == chunk &&
    3888            0 :           other.end == end &&
    3889            0 :           other.start == start &&
    3890            0 :           other.state == state);
    3891              : 
    3892            0 :   @dart.override
    3893            0 :   int get hashCode => Object.hash(chunk, end, start, state);
    3894              : }
    3895              : 
    3896              : ///
    3897              : @_NameSource('generated')
    3898              : enum ReceiptType {
    3899              :   mFullyRead('m.fully_read'),
    3900              :   mRead('m.read'),
    3901              :   mReadPrivate('m.read.private');
    3902              : 
    3903              :   final String name;
    3904              :   const ReceiptType(this.name);
    3905              : }
    3906              : 
    3907              : ///
    3908              : @_NameSource('spec')
    3909              : class IncludeEventContext {
    3910            0 :   IncludeEventContext({
    3911              :     this.afterLimit,
    3912              :     this.beforeLimit,
    3913              :     this.includeProfile,
    3914              :   });
    3915              : 
    3916            0 :   IncludeEventContext.fromJson(Map<String, Object?> json)
    3917            0 :       : afterLimit = ((v) => v != null ? v as int : null)(json['after_limit']),
    3918              :         beforeLimit =
    3919            0 :             ((v) => v != null ? v as int : null)(json['before_limit']),
    3920              :         includeProfile =
    3921            0 :             ((v) => v != null ? v as bool : null)(json['include_profile']);
    3922            0 :   Map<String, Object?> toJson() {
    3923            0 :     final afterLimit = this.afterLimit;
    3924            0 :     final beforeLimit = this.beforeLimit;
    3925            0 :     final includeProfile = this.includeProfile;
    3926            0 :     return {
    3927            0 :       if (afterLimit != null) 'after_limit': afterLimit,
    3928            0 :       if (beforeLimit != null) 'before_limit': beforeLimit,
    3929            0 :       if (includeProfile != null) 'include_profile': includeProfile,
    3930              :     };
    3931              :   }
    3932              : 
    3933              :   /// How many events after the result are
    3934              :   /// returned. By default, this is `5`.
    3935              :   int? afterLimit;
    3936              : 
    3937              :   /// How many events before the result are
    3938              :   /// returned. By default, this is `5`.
    3939              :   int? beforeLimit;
    3940              : 
    3941              :   /// Requests that the server returns the
    3942              :   /// historic profile information for the users
    3943              :   /// that sent the events that were returned.
    3944              :   /// By default, this is `false`.
    3945              :   bool? includeProfile;
    3946              : 
    3947            0 :   @dart.override
    3948              :   bool operator ==(Object other) =>
    3949              :       identical(this, other) ||
    3950            0 :       (other is IncludeEventContext &&
    3951            0 :           other.runtimeType == runtimeType &&
    3952            0 :           other.afterLimit == afterLimit &&
    3953            0 :           other.beforeLimit == beforeLimit &&
    3954            0 :           other.includeProfile == includeProfile);
    3955              : 
    3956            0 :   @dart.override
    3957            0 :   int get hashCode => Object.hash(afterLimit, beforeLimit, includeProfile);
    3958              : }
    3959              : 
    3960              : ///
    3961              : @_NameSource('spec')
    3962              : class EventFilter {
    3963            0 :   EventFilter({
    3964              :     this.limit,
    3965              :     this.notSenders,
    3966              :     this.notTypes,
    3967              :     this.senders,
    3968              :     this.types,
    3969              :   });
    3970              : 
    3971            0 :   EventFilter.fromJson(Map<String, Object?> json)
    3972            0 :       : limit = ((v) => v != null ? v as int : null)(json['limit']),
    3973            0 :         notSenders = ((v) => v != null
    3974            0 :             ? (v as List).map((v) => v as String).toList()
    3975            0 :             : null)(json['not_senders']),
    3976            0 :         notTypes = ((v) => v != null
    3977            0 :             ? (v as List).map((v) => v as String).toList()
    3978            0 :             : null)(json['not_types']),
    3979            0 :         senders = ((v) => v != null
    3980            0 :             ? (v as List).map((v) => v as String).toList()
    3981            0 :             : null)(json['senders']),
    3982            0 :         types = ((v) => v != null
    3983            0 :             ? (v as List).map((v) => v as String).toList()
    3984            0 :             : null)(json['types']);
    3985            0 :   Map<String, Object?> toJson() {
    3986            0 :     final limit = this.limit;
    3987            0 :     final notSenders = this.notSenders;
    3988            0 :     final notTypes = this.notTypes;
    3989            0 :     final senders = this.senders;
    3990            0 :     final types = this.types;
    3991            0 :     return {
    3992            0 :       if (limit != null) 'limit': limit,
    3993            0 :       if (notSenders != null) 'not_senders': notSenders.map((v) => v).toList(),
    3994            0 :       if (notTypes != null) 'not_types': notTypes.map((v) => v).toList(),
    3995            0 :       if (senders != null) 'senders': senders.map((v) => v).toList(),
    3996            0 :       if (types != null) 'types': types.map((v) => v).toList(),
    3997              :     };
    3998              :   }
    3999              : 
    4000              :   /// The maximum number of events to return, must be an integer greater than 0.
    4001              :   ///
    4002              :   /// Servers should apply a default value, and impose a maximum value to avoid
    4003              :   /// resource exhaustion.
    4004              :   ///
    4005              :   int? limit;
    4006              : 
    4007              :   /// A list of sender IDs to exclude. If this list is absent then no senders are excluded. A matching sender will be excluded even if it is listed in the `'senders'` filter.
    4008              :   List<String>? notSenders;
    4009              : 
    4010              :   /// A list of event types to exclude. If this list is absent then no event types are excluded. A matching type will be excluded even if it is listed in the `'types'` filter. A '*' can be used as a wildcard to match any sequence of characters.
    4011              :   List<String>? notTypes;
    4012              : 
    4013              :   /// A list of senders IDs to include. If this list is absent then all senders are included.
    4014              :   List<String>? senders;
    4015              : 
    4016              :   /// A list of event types to include. If this list is absent then all event types are included. A `'*'` can be used as a wildcard to match any sequence of characters.
    4017              :   List<String>? types;
    4018              : 
    4019            0 :   @dart.override
    4020              :   bool operator ==(Object other) =>
    4021              :       identical(this, other) ||
    4022            0 :       (other is EventFilter &&
    4023            0 :           other.runtimeType == runtimeType &&
    4024            0 :           other.limit == limit &&
    4025            0 :           other.notSenders == notSenders &&
    4026            0 :           other.notTypes == notTypes &&
    4027            0 :           other.senders == senders &&
    4028            0 :           other.types == types);
    4029              : 
    4030            0 :   @dart.override
    4031            0 :   int get hashCode => Object.hash(limit, notSenders, notTypes, senders, types);
    4032              : }
    4033              : 
    4034              : ///
    4035              : @_NameSource('spec')
    4036              : class RoomEventFilter {
    4037            0 :   RoomEventFilter({
    4038              :     this.containsUrl,
    4039              :     this.includeRedundantMembers,
    4040              :     this.lazyLoadMembers,
    4041              :     this.notRooms,
    4042              :     this.rooms,
    4043              :     this.unreadThreadNotifications,
    4044              :   });
    4045              : 
    4046            0 :   RoomEventFilter.fromJson(Map<String, Object?> json)
    4047              :       : containsUrl =
    4048            0 :             ((v) => v != null ? v as bool : null)(json['contains_url']),
    4049            0 :         includeRedundantMembers = ((v) =>
    4050            0 :             v != null ? v as bool : null)(json['include_redundant_members']),
    4051              :         lazyLoadMembers =
    4052            0 :             ((v) => v != null ? v as bool : null)(json['lazy_load_members']),
    4053            0 :         notRooms = ((v) => v != null
    4054            0 :             ? (v as List).map((v) => v as String).toList()
    4055            0 :             : null)(json['not_rooms']),
    4056            0 :         rooms = ((v) => v != null
    4057            0 :             ? (v as List).map((v) => v as String).toList()
    4058            0 :             : null)(json['rooms']),
    4059            0 :         unreadThreadNotifications = ((v) =>
    4060            0 :             v != null ? v as bool : null)(json['unread_thread_notifications']);
    4061            0 :   Map<String, Object?> toJson() {
    4062            0 :     final containsUrl = this.containsUrl;
    4063            0 :     final includeRedundantMembers = this.includeRedundantMembers;
    4064            0 :     final lazyLoadMembers = this.lazyLoadMembers;
    4065            0 :     final notRooms = this.notRooms;
    4066            0 :     final rooms = this.rooms;
    4067            0 :     final unreadThreadNotifications = this.unreadThreadNotifications;
    4068            0 :     return {
    4069            0 :       if (containsUrl != null) 'contains_url': containsUrl,
    4070              :       if (includeRedundantMembers != null)
    4071            0 :         'include_redundant_members': includeRedundantMembers,
    4072            0 :       if (lazyLoadMembers != null) 'lazy_load_members': lazyLoadMembers,
    4073            0 :       if (notRooms != null) 'not_rooms': notRooms.map((v) => v).toList(),
    4074            0 :       if (rooms != null) 'rooms': rooms.map((v) => v).toList(),
    4075              :       if (unreadThreadNotifications != null)
    4076            0 :         'unread_thread_notifications': unreadThreadNotifications,
    4077              :     };
    4078              :   }
    4079              : 
    4080              :   /// If `true`, includes only events with a `url` key in their content. If `false`, excludes those events. If omitted, `url` key is not considered for filtering.
    4081              :   bool? containsUrl;
    4082              : 
    4083              :   /// If `true`, sends all membership events for all events, even if they have already
    4084              :   /// been sent to the client. Does not
    4085              :   /// apply unless `lazy_load_members` is `true`. See
    4086              :   /// [Lazy-loading room members](https://spec.matrix.org/unstable/client-server-api/#lazy-loading-room-members)
    4087              :   /// for more information. Defaults to `false`.
    4088              :   bool? includeRedundantMembers;
    4089              : 
    4090              :   /// If `true`, enables lazy-loading of membership events. See
    4091              :   /// [Lazy-loading room members](https://spec.matrix.org/unstable/client-server-api/#lazy-loading-room-members)
    4092              :   /// for more information. Defaults to `false`.
    4093              :   bool? lazyLoadMembers;
    4094              : 
    4095              :   /// A list of room IDs to exclude. If this list is absent then no rooms are excluded. A matching room will be excluded even if it is listed in the `'rooms'` filter.
    4096              :   List<String>? notRooms;
    4097              : 
    4098              :   /// A list of room IDs to include. If this list is absent then all rooms are included.
    4099              :   List<String>? rooms;
    4100              : 
    4101              :   /// If `true`, enables per-[thread](https://spec.matrix.org/unstable/client-server-api/#threading) notification
    4102              :   /// counts. Only applies to the `/sync` endpoint. Defaults to `false`.
    4103              :   bool? unreadThreadNotifications;
    4104              : 
    4105            0 :   @dart.override
    4106              :   bool operator ==(Object other) =>
    4107              :       identical(this, other) ||
    4108            0 :       (other is RoomEventFilter &&
    4109            0 :           other.runtimeType == runtimeType &&
    4110            0 :           other.containsUrl == containsUrl &&
    4111            0 :           other.includeRedundantMembers == includeRedundantMembers &&
    4112            0 :           other.lazyLoadMembers == lazyLoadMembers &&
    4113            0 :           other.notRooms == notRooms &&
    4114            0 :           other.rooms == rooms &&
    4115            0 :           other.unreadThreadNotifications == unreadThreadNotifications);
    4116              : 
    4117            0 :   @dart.override
    4118            0 :   int get hashCode => Object.hash(
    4119            0 :         containsUrl,
    4120            0 :         includeRedundantMembers,
    4121            0 :         lazyLoadMembers,
    4122            0 :         notRooms,
    4123            0 :         rooms,
    4124            0 :         unreadThreadNotifications,
    4125              :       );
    4126              : }
    4127              : 
    4128              : ///
    4129              : @_NameSource('rule override generated')
    4130              : class SearchFilter implements EventFilter, RoomEventFilter {
    4131            0 :   SearchFilter({
    4132              :     this.limit,
    4133              :     this.notSenders,
    4134              :     this.notTypes,
    4135              :     this.senders,
    4136              :     this.types,
    4137              :     this.containsUrl,
    4138              :     this.includeRedundantMembers,
    4139              :     this.lazyLoadMembers,
    4140              :     this.notRooms,
    4141              :     this.rooms,
    4142              :     this.unreadThreadNotifications,
    4143              :   });
    4144              : 
    4145            0 :   SearchFilter.fromJson(Map<String, Object?> json)
    4146            0 :       : limit = ((v) => v != null ? v as int : null)(json['limit']),
    4147            0 :         notSenders = ((v) => v != null
    4148            0 :             ? (v as List).map((v) => v as String).toList()
    4149            0 :             : null)(json['not_senders']),
    4150            0 :         notTypes = ((v) => v != null
    4151            0 :             ? (v as List).map((v) => v as String).toList()
    4152            0 :             : null)(json['not_types']),
    4153            0 :         senders = ((v) => v != null
    4154            0 :             ? (v as List).map((v) => v as String).toList()
    4155            0 :             : null)(json['senders']),
    4156            0 :         types = ((v) => v != null
    4157            0 :             ? (v as List).map((v) => v as String).toList()
    4158            0 :             : null)(json['types']),
    4159              :         containsUrl =
    4160            0 :             ((v) => v != null ? v as bool : null)(json['contains_url']),
    4161            0 :         includeRedundantMembers = ((v) =>
    4162            0 :             v != null ? v as bool : null)(json['include_redundant_members']),
    4163              :         lazyLoadMembers =
    4164            0 :             ((v) => v != null ? v as bool : null)(json['lazy_load_members']),
    4165            0 :         notRooms = ((v) => v != null
    4166            0 :             ? (v as List).map((v) => v as String).toList()
    4167            0 :             : null)(json['not_rooms']),
    4168            0 :         rooms = ((v) => v != null
    4169            0 :             ? (v as List).map((v) => v as String).toList()
    4170            0 :             : null)(json['rooms']),
    4171            0 :         unreadThreadNotifications = ((v) =>
    4172            0 :             v != null ? v as bool : null)(json['unread_thread_notifications']);
    4173            0 :   @override
    4174              :   Map<String, Object?> toJson() {
    4175            0 :     final limit = this.limit;
    4176            0 :     final notSenders = this.notSenders;
    4177            0 :     final notTypes = this.notTypes;
    4178            0 :     final senders = this.senders;
    4179            0 :     final types = this.types;
    4180            0 :     final containsUrl = this.containsUrl;
    4181            0 :     final includeRedundantMembers = this.includeRedundantMembers;
    4182            0 :     final lazyLoadMembers = this.lazyLoadMembers;
    4183            0 :     final notRooms = this.notRooms;
    4184            0 :     final rooms = this.rooms;
    4185            0 :     final unreadThreadNotifications = this.unreadThreadNotifications;
    4186            0 :     return {
    4187            0 :       if (limit != null) 'limit': limit,
    4188            0 :       if (notSenders != null) 'not_senders': notSenders.map((v) => v).toList(),
    4189            0 :       if (notTypes != null) 'not_types': notTypes.map((v) => v).toList(),
    4190            0 :       if (senders != null) 'senders': senders.map((v) => v).toList(),
    4191            0 :       if (types != null) 'types': types.map((v) => v).toList(),
    4192            0 :       if (containsUrl != null) 'contains_url': containsUrl,
    4193              :       if (includeRedundantMembers != null)
    4194            0 :         'include_redundant_members': includeRedundantMembers,
    4195            0 :       if (lazyLoadMembers != null) 'lazy_load_members': lazyLoadMembers,
    4196            0 :       if (notRooms != null) 'not_rooms': notRooms.map((v) => v).toList(),
    4197            0 :       if (rooms != null) 'rooms': rooms.map((v) => v).toList(),
    4198              :       if (unreadThreadNotifications != null)
    4199            0 :         'unread_thread_notifications': unreadThreadNotifications,
    4200              :     };
    4201              :   }
    4202              : 
    4203              :   /// The maximum number of events to return, must be an integer greater than 0.
    4204              :   ///
    4205              :   /// Servers should apply a default value, and impose a maximum value to avoid
    4206              :   /// resource exhaustion.
    4207              :   ///
    4208              :   @override
    4209              :   int? limit;
    4210              : 
    4211              :   /// A list of sender IDs to exclude. If this list is absent then no senders are excluded. A matching sender will be excluded even if it is listed in the `'senders'` filter.
    4212              :   @override
    4213              :   List<String>? notSenders;
    4214              : 
    4215              :   /// A list of event types to exclude. If this list is absent then no event types are excluded. A matching type will be excluded even if it is listed in the `'types'` filter. A '*' can be used as a wildcard to match any sequence of characters.
    4216              :   @override
    4217              :   List<String>? notTypes;
    4218              : 
    4219              :   /// A list of senders IDs to include. If this list is absent then all senders are included.
    4220              :   @override
    4221              :   List<String>? senders;
    4222              : 
    4223              :   /// A list of event types to include. If this list is absent then all event types are included. A `'*'` can be used as a wildcard to match any sequence of characters.
    4224              :   @override
    4225              :   List<String>? types;
    4226              : 
    4227              :   /// If `true`, includes only events with a `url` key in their content. If `false`, excludes those events. If omitted, `url` key is not considered for filtering.
    4228              :   @override
    4229              :   bool? containsUrl;
    4230              : 
    4231              :   /// If `true`, sends all membership events for all events, even if they have already
    4232              :   /// been sent to the client. Does not
    4233              :   /// apply unless `lazy_load_members` is `true`. See
    4234              :   /// [Lazy-loading room members](https://spec.matrix.org/unstable/client-server-api/#lazy-loading-room-members)
    4235              :   /// for more information. Defaults to `false`.
    4236              :   @override
    4237              :   bool? includeRedundantMembers;
    4238              : 
    4239              :   /// If `true`, enables lazy-loading of membership events. See
    4240              :   /// [Lazy-loading room members](https://spec.matrix.org/unstable/client-server-api/#lazy-loading-room-members)
    4241              :   /// for more information. Defaults to `false`.
    4242              :   @override
    4243              :   bool? lazyLoadMembers;
    4244              : 
    4245              :   /// A list of room IDs to exclude. If this list is absent then no rooms are excluded. A matching room will be excluded even if it is listed in the `'rooms'` filter.
    4246              :   @override
    4247              :   List<String>? notRooms;
    4248              : 
    4249              :   /// A list of room IDs to include. If this list is absent then all rooms are included.
    4250              :   @override
    4251              :   List<String>? rooms;
    4252              : 
    4253              :   /// If `true`, enables per-[thread](https://spec.matrix.org/unstable/client-server-api/#threading) notification
    4254              :   /// counts. Only applies to the `/sync` endpoint. Defaults to `false`.
    4255              :   @override
    4256              :   bool? unreadThreadNotifications;
    4257              : 
    4258            0 :   @dart.override
    4259              :   bool operator ==(Object other) =>
    4260              :       identical(this, other) ||
    4261            0 :       (other is SearchFilter &&
    4262            0 :           other.runtimeType == runtimeType &&
    4263            0 :           other.limit == limit &&
    4264            0 :           other.notSenders == notSenders &&
    4265            0 :           other.notTypes == notTypes &&
    4266            0 :           other.senders == senders &&
    4267            0 :           other.types == types &&
    4268            0 :           other.containsUrl == containsUrl &&
    4269            0 :           other.includeRedundantMembers == includeRedundantMembers &&
    4270            0 :           other.lazyLoadMembers == lazyLoadMembers &&
    4271            0 :           other.notRooms == notRooms &&
    4272            0 :           other.rooms == rooms &&
    4273            0 :           other.unreadThreadNotifications == unreadThreadNotifications);
    4274              : 
    4275            0 :   @dart.override
    4276            0 :   int get hashCode => Object.hash(
    4277            0 :         limit,
    4278            0 :         notSenders,
    4279            0 :         notTypes,
    4280            0 :         senders,
    4281            0 :         types,
    4282            0 :         containsUrl,
    4283            0 :         includeRedundantMembers,
    4284            0 :         lazyLoadMembers,
    4285            0 :         notRooms,
    4286            0 :         rooms,
    4287            0 :         unreadThreadNotifications,
    4288              :       );
    4289              : }
    4290              : 
    4291              : ///
    4292              : @_NameSource('rule override generated')
    4293              : enum GroupKey {
    4294              :   roomId('room_id'),
    4295              :   sender('sender');
    4296              : 
    4297              :   final String name;
    4298              :   const GroupKey(this.name);
    4299              : }
    4300              : 
    4301              : /// Configuration for group.
    4302              : @_NameSource('spec')
    4303              : class Group {
    4304            0 :   Group({
    4305              :     this.key,
    4306              :   });
    4307              : 
    4308            0 :   Group.fromJson(Map<String, Object?> json)
    4309            0 :       : key = ((v) => v != null
    4310            0 :             ? GroupKey.values.fromString(v as String)!
    4311            0 :             : null)(json['key']);
    4312            0 :   Map<String, Object?> toJson() {
    4313            0 :     final key = this.key;
    4314            0 :     return {
    4315            0 :       if (key != null) 'key': key.name,
    4316              :     };
    4317              :   }
    4318              : 
    4319              :   /// Key that defines the group.
    4320              :   GroupKey? key;
    4321              : 
    4322            0 :   @dart.override
    4323              :   bool operator ==(Object other) =>
    4324              :       identical(this, other) ||
    4325            0 :       (other is Group && other.runtimeType == runtimeType && other.key == key);
    4326              : 
    4327            0 :   @dart.override
    4328            0 :   int get hashCode => key.hashCode;
    4329              : }
    4330              : 
    4331              : ///
    4332              : @_NameSource('spec')
    4333              : class Groupings {
    4334            0 :   Groupings({
    4335              :     this.groupBy,
    4336              :   });
    4337              : 
    4338            0 :   Groupings.fromJson(Map<String, Object?> json)
    4339            0 :       : groupBy = ((v) => v != null
    4340              :             ? (v as List)
    4341            0 :                 .map((v) => Group.fromJson(v as Map<String, Object?>))
    4342            0 :                 .toList()
    4343            0 :             : null)(json['group_by']);
    4344            0 :   Map<String, Object?> toJson() {
    4345            0 :     final groupBy = this.groupBy;
    4346            0 :     return {
    4347            0 :       if (groupBy != null) 'group_by': groupBy.map((v) => v.toJson()).toList(),
    4348              :     };
    4349              :   }
    4350              : 
    4351              :   /// List of groups to request.
    4352              :   List<Group>? groupBy;
    4353              : 
    4354            0 :   @dart.override
    4355              :   bool operator ==(Object other) =>
    4356              :       identical(this, other) ||
    4357            0 :       (other is Groupings &&
    4358            0 :           other.runtimeType == runtimeType &&
    4359            0 :           other.groupBy == groupBy);
    4360              : 
    4361            0 :   @dart.override
    4362            0 :   int get hashCode => groupBy.hashCode;
    4363              : }
    4364              : 
    4365              : ///
    4366              : @_NameSource('rule override generated')
    4367              : enum KeyKind {
    4368              :   contentBody('content.body'),
    4369              :   contentName('content.name'),
    4370              :   contentTopic('content.topic');
    4371              : 
    4372              :   final String name;
    4373              :   const KeyKind(this.name);
    4374              : }
    4375              : 
    4376              : ///
    4377              : @_NameSource('rule override generated')
    4378              : enum SearchOrder {
    4379              :   rank('rank'),
    4380              :   recent('recent');
    4381              : 
    4382              :   final String name;
    4383              :   const SearchOrder(this.name);
    4384              : }
    4385              : 
    4386              : ///
    4387              : @_NameSource('spec')
    4388              : class RoomEventsCriteria {
    4389            0 :   RoomEventsCriteria({
    4390              :     this.eventContext,
    4391              :     this.filter,
    4392              :     this.groupings,
    4393              :     this.includeState,
    4394              :     this.keys,
    4395              :     this.orderBy,
    4396              :     required this.searchTerm,
    4397              :   });
    4398              : 
    4399            0 :   RoomEventsCriteria.fromJson(Map<String, Object?> json)
    4400            0 :       : eventContext = ((v) => v != null
    4401            0 :             ? IncludeEventContext.fromJson(v as Map<String, Object?>)
    4402            0 :             : null)(json['event_context']),
    4403            0 :         filter = ((v) => v != null
    4404            0 :             ? SearchFilter.fromJson(v as Map<String, Object?>)
    4405            0 :             : null)(json['filter']),
    4406            0 :         groupings = ((v) => v != null
    4407            0 :             ? Groupings.fromJson(v as Map<String, Object?>)
    4408            0 :             : null)(json['groupings']),
    4409              :         includeState =
    4410            0 :             ((v) => v != null ? v as bool : null)(json['include_state']),
    4411            0 :         keys = ((v) => v != null
    4412              :             ? (v as List)
    4413            0 :                 .map((v) => KeyKind.values.fromString(v as String)!)
    4414            0 :                 .toList()
    4415            0 :             : null)(json['keys']),
    4416            0 :         orderBy = ((v) => v != null
    4417            0 :             ? SearchOrder.values.fromString(v as String)!
    4418            0 :             : null)(json['order_by']),
    4419            0 :         searchTerm = json['search_term'] as String;
    4420            0 :   Map<String, Object?> toJson() {
    4421            0 :     final eventContext = this.eventContext;
    4422            0 :     final filter = this.filter;
    4423            0 :     final groupings = this.groupings;
    4424            0 :     final includeState = this.includeState;
    4425            0 :     final keys = this.keys;
    4426            0 :     final orderBy = this.orderBy;
    4427            0 :     return {
    4428            0 :       if (eventContext != null) 'event_context': eventContext.toJson(),
    4429            0 :       if (filter != null) 'filter': filter.toJson(),
    4430            0 :       if (groupings != null) 'groupings': groupings.toJson(),
    4431            0 :       if (includeState != null) 'include_state': includeState,
    4432            0 :       if (keys != null) 'keys': keys.map((v) => v.name).toList(),
    4433            0 :       if (orderBy != null) 'order_by': orderBy.name,
    4434            0 :       'search_term': searchTerm,
    4435              :     };
    4436              :   }
    4437              : 
    4438              :   /// Configures whether any context for the events
    4439              :   /// returned are included in the response.
    4440              :   IncludeEventContext? eventContext;
    4441              : 
    4442              :   /// This takes a [filter](https://spec.matrix.org/unstable/client-server-api/#filtering).
    4443              :   SearchFilter? filter;
    4444              : 
    4445              :   /// Requests that the server partitions the result set
    4446              :   /// based on the provided list of keys.
    4447              :   Groupings? groupings;
    4448              : 
    4449              :   /// Requests the server return the current state for
    4450              :   /// each room returned.
    4451              :   bool? includeState;
    4452              : 
    4453              :   /// The keys to search. Defaults to all.
    4454              :   List<KeyKind>? keys;
    4455              : 
    4456              :   /// The order in which to search for results.
    4457              :   /// By default, this is `"rank"`.
    4458              :   SearchOrder? orderBy;
    4459              : 
    4460              :   /// The string to search events for
    4461              :   String searchTerm;
    4462              : 
    4463            0 :   @dart.override
    4464              :   bool operator ==(Object other) =>
    4465              :       identical(this, other) ||
    4466            0 :       (other is RoomEventsCriteria &&
    4467            0 :           other.runtimeType == runtimeType &&
    4468            0 :           other.eventContext == eventContext &&
    4469            0 :           other.filter == filter &&
    4470            0 :           other.groupings == groupings &&
    4471            0 :           other.includeState == includeState &&
    4472            0 :           other.keys == keys &&
    4473            0 :           other.orderBy == orderBy &&
    4474            0 :           other.searchTerm == searchTerm);
    4475              : 
    4476            0 :   @dart.override
    4477            0 :   int get hashCode => Object.hash(
    4478            0 :         eventContext,
    4479            0 :         filter,
    4480            0 :         groupings,
    4481            0 :         includeState,
    4482            0 :         keys,
    4483            0 :         orderBy,
    4484            0 :         searchTerm,
    4485              :       );
    4486              : }
    4487              : 
    4488              : ///
    4489              : @_NameSource('spec')
    4490              : class Categories {
    4491            0 :   Categories({
    4492              :     this.roomEvents,
    4493              :   });
    4494              : 
    4495            0 :   Categories.fromJson(Map<String, Object?> json)
    4496            0 :       : roomEvents = ((v) => v != null
    4497            0 :             ? RoomEventsCriteria.fromJson(v as Map<String, Object?>)
    4498            0 :             : null)(json['room_events']);
    4499            0 :   Map<String, Object?> toJson() {
    4500            0 :     final roomEvents = this.roomEvents;
    4501            0 :     return {
    4502            0 :       if (roomEvents != null) 'room_events': roomEvents.toJson(),
    4503              :     };
    4504              :   }
    4505              : 
    4506              :   /// Mapping of category name to search criteria.
    4507              :   RoomEventsCriteria? roomEvents;
    4508              : 
    4509            0 :   @dart.override
    4510              :   bool operator ==(Object other) =>
    4511              :       identical(this, other) ||
    4512            0 :       (other is Categories &&
    4513            0 :           other.runtimeType == runtimeType &&
    4514            0 :           other.roomEvents == roomEvents);
    4515              : 
    4516            0 :   @dart.override
    4517            0 :   int get hashCode => roomEvents.hashCode;
    4518              : }
    4519              : 
    4520              : /// The results for a particular group value.
    4521              : @_NameSource('spec')
    4522              : class GroupValue {
    4523            0 :   GroupValue({
    4524              :     this.nextBatch,
    4525              :     this.order,
    4526              :     this.results,
    4527              :   });
    4528              : 
    4529            0 :   GroupValue.fromJson(Map<String, Object?> json)
    4530            0 :       : nextBatch = ((v) => v != null ? v as String : null)(json['next_batch']),
    4531            0 :         order = ((v) => v != null ? v as int : null)(json['order']),
    4532            0 :         results = ((v) => v != null
    4533            0 :             ? (v as List).map((v) => v as String).toList()
    4534            0 :             : null)(json['results']);
    4535            0 :   Map<String, Object?> toJson() {
    4536            0 :     final nextBatch = this.nextBatch;
    4537            0 :     final order = this.order;
    4538            0 :     final results = this.results;
    4539            0 :     return {
    4540            0 :       if (nextBatch != null) 'next_batch': nextBatch,
    4541            0 :       if (order != null) 'order': order,
    4542            0 :       if (results != null) 'results': results.map((v) => v).toList(),
    4543              :     };
    4544              :   }
    4545              : 
    4546              :   /// Token that can be used to get the next batch
    4547              :   /// of results in the group, by passing as the
    4548              :   /// `next_batch` parameter to the next call. If
    4549              :   /// this field is absent, there are no more
    4550              :   /// results in this group.
    4551              :   String? nextBatch;
    4552              : 
    4553              :   /// Key that can be used to order different
    4554              :   /// groups.
    4555              :   int? order;
    4556              : 
    4557              :   /// Which results are in this group.
    4558              :   List<String>? results;
    4559              : 
    4560            0 :   @dart.override
    4561              :   bool operator ==(Object other) =>
    4562              :       identical(this, other) ||
    4563            0 :       (other is GroupValue &&
    4564            0 :           other.runtimeType == runtimeType &&
    4565            0 :           other.nextBatch == nextBatch &&
    4566            0 :           other.order == order &&
    4567            0 :           other.results == results);
    4568              : 
    4569            0 :   @dart.override
    4570            0 :   int get hashCode => Object.hash(nextBatch, order, results);
    4571              : }
    4572              : 
    4573              : ///
    4574              : @_NameSource('spec')
    4575              : class UserProfile {
    4576            0 :   UserProfile({
    4577              :     this.avatarUrl,
    4578              :     this.displayname,
    4579              :   });
    4580              : 
    4581            0 :   UserProfile.fromJson(Map<String, Object?> json)
    4582            0 :       : avatarUrl = ((v) =>
    4583            0 :             v != null ? Uri.parse(v as String) : null)(json['avatar_url']),
    4584              :         displayname =
    4585            0 :             ((v) => v != null ? v as String : null)(json['displayname']);
    4586            0 :   Map<String, Object?> toJson() {
    4587            0 :     final avatarUrl = this.avatarUrl;
    4588            0 :     final displayname = this.displayname;
    4589            0 :     return {
    4590            0 :       if (avatarUrl != null) 'avatar_url': avatarUrl.toString(),
    4591            0 :       if (displayname != null) 'displayname': displayname,
    4592              :     };
    4593              :   }
    4594              : 
    4595              :   ///
    4596              :   Uri? avatarUrl;
    4597              : 
    4598              :   ///
    4599              :   String? displayname;
    4600              : 
    4601            0 :   @dart.override
    4602              :   bool operator ==(Object other) =>
    4603              :       identical(this, other) ||
    4604            0 :       (other is UserProfile &&
    4605            0 :           other.runtimeType == runtimeType &&
    4606            0 :           other.avatarUrl == avatarUrl &&
    4607            0 :           other.displayname == displayname);
    4608              : 
    4609            0 :   @dart.override
    4610            0 :   int get hashCode => Object.hash(avatarUrl, displayname);
    4611              : }
    4612              : 
    4613              : ///
    4614              : @_NameSource('rule override spec')
    4615              : class SearchResultsEventContext {
    4616            0 :   SearchResultsEventContext({
    4617              :     this.end,
    4618              :     this.eventsAfter,
    4619              :     this.eventsBefore,
    4620              :     this.profileInfo,
    4621              :     this.start,
    4622              :   });
    4623              : 
    4624            0 :   SearchResultsEventContext.fromJson(Map<String, Object?> json)
    4625            0 :       : end = ((v) => v != null ? v as String : null)(json['end']),
    4626            0 :         eventsAfter = ((v) => v != null
    4627              :             ? (v as List)
    4628            0 :                 .map((v) => MatrixEvent.fromJson(v as Map<String, Object?>))
    4629            0 :                 .toList()
    4630            0 :             : null)(json['events_after']),
    4631            0 :         eventsBefore = ((v) => v != null
    4632              :             ? (v as List)
    4633            0 :                 .map((v) => MatrixEvent.fromJson(v as Map<String, Object?>))
    4634            0 :                 .toList()
    4635            0 :             : null)(json['events_before']),
    4636            0 :         profileInfo = ((v) => v != null
    4637            0 :             ? (v as Map<String, Object?>).map(
    4638            0 :                 (k, v) => MapEntry(
    4639              :                   k,
    4640            0 :                   UserProfile.fromJson(v as Map<String, Object?>),
    4641              :                 ),
    4642              :               )
    4643            0 :             : null)(json['profile_info']),
    4644            0 :         start = ((v) => v != null ? v as String : null)(json['start']);
    4645            0 :   Map<String, Object?> toJson() {
    4646            0 :     final end = this.end;
    4647            0 :     final eventsAfter = this.eventsAfter;
    4648            0 :     final eventsBefore = this.eventsBefore;
    4649            0 :     final profileInfo = this.profileInfo;
    4650            0 :     final start = this.start;
    4651            0 :     return {
    4652            0 :       if (end != null) 'end': end,
    4653              :       if (eventsAfter != null)
    4654            0 :         'events_after': eventsAfter.map((v) => v.toJson()).toList(),
    4655              :       if (eventsBefore != null)
    4656            0 :         'events_before': eventsBefore.map((v) => v.toJson()).toList(),
    4657              :       if (profileInfo != null)
    4658            0 :         'profile_info': profileInfo.map((k, v) => MapEntry(k, v.toJson())),
    4659            0 :       if (start != null) 'start': start,
    4660              :     };
    4661              :   }
    4662              : 
    4663              :   /// Pagination token for the end of the chunk
    4664              :   String? end;
    4665              : 
    4666              :   /// Events just after the result.
    4667              :   List<MatrixEvent>? eventsAfter;
    4668              : 
    4669              :   /// Events just before the result.
    4670              :   List<MatrixEvent>? eventsBefore;
    4671              : 
    4672              :   /// The historic profile information of the
    4673              :   /// users that sent the events returned.
    4674              :   ///
    4675              :   /// The key is the user ID for which
    4676              :   /// the profile belongs to.
    4677              :   Map<String, UserProfile>? profileInfo;
    4678              : 
    4679              :   /// Pagination token for the start of the chunk
    4680              :   String? start;
    4681              : 
    4682            0 :   @dart.override
    4683              :   bool operator ==(Object other) =>
    4684              :       identical(this, other) ||
    4685            0 :       (other is SearchResultsEventContext &&
    4686            0 :           other.runtimeType == runtimeType &&
    4687            0 :           other.end == end &&
    4688            0 :           other.eventsAfter == eventsAfter &&
    4689            0 :           other.eventsBefore == eventsBefore &&
    4690            0 :           other.profileInfo == profileInfo &&
    4691            0 :           other.start == start);
    4692              : 
    4693            0 :   @dart.override
    4694              :   int get hashCode =>
    4695            0 :       Object.hash(end, eventsAfter, eventsBefore, profileInfo, start);
    4696              : }
    4697              : 
    4698              : /// The result object.
    4699              : @_NameSource('spec')
    4700              : class Result {
    4701            0 :   Result({
    4702              :     this.context,
    4703              :     this.rank,
    4704              :     this.result,
    4705              :   });
    4706              : 
    4707            0 :   Result.fromJson(Map<String, Object?> json)
    4708            0 :       : context = ((v) => v != null
    4709            0 :             ? SearchResultsEventContext.fromJson(v as Map<String, Object?>)
    4710            0 :             : null)(json['context']),
    4711            0 :         rank = ((v) => v != null ? (v as num).toDouble() : null)(json['rank']),
    4712            0 :         result = ((v) => v != null
    4713            0 :             ? MatrixEvent.fromJson(v as Map<String, Object?>)
    4714            0 :             : null)(json['result']);
    4715            0 :   Map<String, Object?> toJson() {
    4716            0 :     final context = this.context;
    4717            0 :     final rank = this.rank;
    4718            0 :     final result = this.result;
    4719            0 :     return {
    4720            0 :       if (context != null) 'context': context.toJson(),
    4721            0 :       if (rank != null) 'rank': rank,
    4722            0 :       if (result != null) 'result': result.toJson(),
    4723              :     };
    4724              :   }
    4725              : 
    4726              :   /// Context for result, if requested.
    4727              :   SearchResultsEventContext? context;
    4728              : 
    4729              :   /// A number that describes how closely this result matches the search. Higher is closer.
    4730              :   double? rank;
    4731              : 
    4732              :   /// The event that matched.
    4733              :   MatrixEvent? result;
    4734              : 
    4735            0 :   @dart.override
    4736              :   bool operator ==(Object other) =>
    4737              :       identical(this, other) ||
    4738            0 :       (other is Result &&
    4739            0 :           other.runtimeType == runtimeType &&
    4740            0 :           other.context == context &&
    4741            0 :           other.rank == rank &&
    4742            0 :           other.result == result);
    4743              : 
    4744            0 :   @dart.override
    4745            0 :   int get hashCode => Object.hash(context, rank, result);
    4746              : }
    4747              : 
    4748              : ///
    4749              : @_NameSource('spec')
    4750              : class ResultRoomEvents {
    4751            0 :   ResultRoomEvents({
    4752              :     this.count,
    4753              :     this.groups,
    4754              :     this.highlights,
    4755              :     this.nextBatch,
    4756              :     this.results,
    4757              :     this.state,
    4758              :   });
    4759              : 
    4760            0 :   ResultRoomEvents.fromJson(Map<String, Object?> json)
    4761            0 :       : count = ((v) => v != null ? v as int : null)(json['count']),
    4762            0 :         groups = ((v) => v != null
    4763            0 :             ? (v as Map<String, Object?>).map(
    4764            0 :                 (k, v) => MapEntry(
    4765              :                   k,
    4766            0 :                   (v as Map<String, Object?>).map(
    4767            0 :                     (k, v) => MapEntry(
    4768              :                       k,
    4769            0 :                       GroupValue.fromJson(v as Map<String, Object?>),
    4770              :                     ),
    4771              :                   ),
    4772              :                 ),
    4773              :               )
    4774            0 :             : null)(json['groups']),
    4775            0 :         highlights = ((v) => v != null
    4776            0 :             ? (v as List).map((v) => v as String).toList()
    4777            0 :             : null)(json['highlights']),
    4778            0 :         nextBatch = ((v) => v != null ? v as String : null)(json['next_batch']),
    4779            0 :         results = ((v) => v != null
    4780              :             ? (v as List)
    4781            0 :                 .map((v) => Result.fromJson(v as Map<String, Object?>))
    4782            0 :                 .toList()
    4783            0 :             : null)(json['results']),
    4784            0 :         state = ((v) => v != null
    4785            0 :             ? (v as Map<String, Object?>).map(
    4786            0 :                 (k, v) => MapEntry(
    4787              :                   k,
    4788              :                   (v as List)
    4789            0 :                       .map(
    4790            0 :                         (v) => MatrixEvent.fromJson(v as Map<String, Object?>),
    4791              :                       )
    4792            0 :                       .toList(),
    4793              :                 ),
    4794              :               )
    4795            0 :             : null)(json['state']);
    4796            0 :   Map<String, Object?> toJson() {
    4797            0 :     final count = this.count;
    4798            0 :     final groups = this.groups;
    4799            0 :     final highlights = this.highlights;
    4800            0 :     final nextBatch = this.nextBatch;
    4801            0 :     final results = this.results;
    4802            0 :     final state = this.state;
    4803            0 :     return {
    4804            0 :       if (count != null) 'count': count,
    4805              :       if (groups != null)
    4806            0 :         'groups': groups.map(
    4807            0 :           (k, v) => MapEntry(k, v.map((k, v) => MapEntry(k, v.toJson()))),
    4808              :         ),
    4809            0 :       if (highlights != null) 'highlights': highlights.map((v) => v).toList(),
    4810            0 :       if (nextBatch != null) 'next_batch': nextBatch,
    4811            0 :       if (results != null) 'results': results.map((v) => v.toJson()).toList(),
    4812              :       if (state != null)
    4813            0 :         'state':
    4814            0 :             state.map((k, v) => MapEntry(k, v.map((v) => v.toJson()).toList())),
    4815              :     };
    4816              :   }
    4817              : 
    4818              :   /// An approximate count of the total number of results found.
    4819              :   int? count;
    4820              : 
    4821              :   /// Any groups that were requested.
    4822              :   ///
    4823              :   /// The outer `string` key is the group key requested (eg: `room_id`
    4824              :   /// or `sender`). The inner `string` key is the grouped value (eg:
    4825              :   /// a room's ID or a user's ID).
    4826              :   Map<String, Map<String, GroupValue>>? groups;
    4827              : 
    4828              :   /// List of words which should be highlighted, useful for stemming which may change the query terms.
    4829              :   List<String>? highlights;
    4830              : 
    4831              :   /// Token that can be used to get the next batch of
    4832              :   /// results, by passing as the `next_batch` parameter to
    4833              :   /// the next call. If this field is absent, there are no
    4834              :   /// more results.
    4835              :   String? nextBatch;
    4836              : 
    4837              :   /// List of results in the requested order.
    4838              :   List<Result>? results;
    4839              : 
    4840              :   /// The current state for every room in the results.
    4841              :   /// This is included if the request had the
    4842              :   /// `include_state` key set with a value of `true`.
    4843              :   ///
    4844              :   /// The key is the room ID for which the `State
    4845              :   /// Event` array belongs to.
    4846              :   Map<String, List<MatrixEvent>>? state;
    4847              : 
    4848            0 :   @dart.override
    4849              :   bool operator ==(Object other) =>
    4850              :       identical(this, other) ||
    4851            0 :       (other is ResultRoomEvents &&
    4852            0 :           other.runtimeType == runtimeType &&
    4853            0 :           other.count == count &&
    4854            0 :           other.groups == groups &&
    4855            0 :           other.highlights == highlights &&
    4856            0 :           other.nextBatch == nextBatch &&
    4857            0 :           other.results == results &&
    4858            0 :           other.state == state);
    4859              : 
    4860            0 :   @dart.override
    4861              :   int get hashCode =>
    4862            0 :       Object.hash(count, groups, highlights, nextBatch, results, state);
    4863              : }
    4864              : 
    4865              : ///
    4866              : @_NameSource('spec')
    4867              : class ResultCategories {
    4868            0 :   ResultCategories({
    4869              :     this.roomEvents,
    4870              :   });
    4871              : 
    4872            0 :   ResultCategories.fromJson(Map<String, Object?> json)
    4873            0 :       : roomEvents = ((v) => v != null
    4874            0 :             ? ResultRoomEvents.fromJson(v as Map<String, Object?>)
    4875            0 :             : null)(json['room_events']);
    4876            0 :   Map<String, Object?> toJson() {
    4877            0 :     final roomEvents = this.roomEvents;
    4878            0 :     return {
    4879            0 :       if (roomEvents != null) 'room_events': roomEvents.toJson(),
    4880              :     };
    4881              :   }
    4882              : 
    4883              :   /// Mapping of category name to search criteria.
    4884              :   ResultRoomEvents? roomEvents;
    4885              : 
    4886            0 :   @dart.override
    4887              :   bool operator ==(Object other) =>
    4888              :       identical(this, other) ||
    4889            0 :       (other is ResultCategories &&
    4890            0 :           other.runtimeType == runtimeType &&
    4891            0 :           other.roomEvents == roomEvents);
    4892              : 
    4893            0 :   @dart.override
    4894            0 :   int get hashCode => roomEvents.hashCode;
    4895              : }
    4896              : 
    4897              : ///
    4898              : @_NameSource('rule override spec')
    4899              : class SearchResults {
    4900            0 :   SearchResults({
    4901              :     required this.searchCategories,
    4902              :   });
    4903              : 
    4904            0 :   SearchResults.fromJson(Map<String, Object?> json)
    4905            0 :       : searchCategories = ResultCategories.fromJson(
    4906            0 :           json['search_categories'] as Map<String, Object?>,
    4907              :         );
    4908            0 :   Map<String, Object?> toJson() => {
    4909            0 :         'search_categories': searchCategories.toJson(),
    4910              :       };
    4911              : 
    4912              :   /// Describes which categories to search in and their criteria.
    4913              :   ResultCategories searchCategories;
    4914              : 
    4915            0 :   @dart.override
    4916              :   bool operator ==(Object other) =>
    4917              :       identical(this, other) ||
    4918            0 :       (other is SearchResults &&
    4919            0 :           other.runtimeType == runtimeType &&
    4920            0 :           other.searchCategories == searchCategories);
    4921              : 
    4922            0 :   @dart.override
    4923            0 :   int get hashCode => searchCategories.hashCode;
    4924              : }
    4925              : 
    4926              : ///
    4927              : @_NameSource('spec')
    4928              : class Location {
    4929            0 :   Location({
    4930              :     required this.alias,
    4931              :     required this.fields,
    4932              :     required this.protocol,
    4933              :   });
    4934              : 
    4935            0 :   Location.fromJson(Map<String, Object?> json)
    4936            0 :       : alias = json['alias'] as String,
    4937            0 :         fields = json['fields'] as Map<String, Object?>,
    4938            0 :         protocol = json['protocol'] as String;
    4939            0 :   Map<String, Object?> toJson() => {
    4940            0 :         'alias': alias,
    4941            0 :         'fields': fields,
    4942            0 :         'protocol': protocol,
    4943              :       };
    4944              : 
    4945              :   /// An alias for a matrix room.
    4946              :   String alias;
    4947              : 
    4948              :   /// Information used to identify this third-party location.
    4949              :   Map<String, Object?> fields;
    4950              : 
    4951              :   /// The protocol ID that the third-party location is a part of.
    4952              :   String protocol;
    4953              : 
    4954            0 :   @dart.override
    4955              :   bool operator ==(Object other) =>
    4956              :       identical(this, other) ||
    4957            0 :       (other is Location &&
    4958            0 :           other.runtimeType == runtimeType &&
    4959            0 :           other.alias == alias &&
    4960            0 :           other.fields == fields &&
    4961            0 :           other.protocol == protocol);
    4962              : 
    4963            0 :   @dart.override
    4964            0 :   int get hashCode => Object.hash(alias, fields, protocol);
    4965              : }
    4966              : 
    4967              : /// Definition of valid values for a field.
    4968              : @_NameSource('spec')
    4969              : class FieldType {
    4970            0 :   FieldType({
    4971              :     required this.placeholder,
    4972              :     required this.regexp,
    4973              :   });
    4974              : 
    4975            0 :   FieldType.fromJson(Map<String, Object?> json)
    4976            0 :       : placeholder = json['placeholder'] as String,
    4977            0 :         regexp = json['regexp'] as String;
    4978            0 :   Map<String, Object?> toJson() => {
    4979            0 :         'placeholder': placeholder,
    4980            0 :         'regexp': regexp,
    4981              :       };
    4982              : 
    4983              :   /// A placeholder serving as a valid example of the field value.
    4984              :   String placeholder;
    4985              : 
    4986              :   /// A regular expression for validation of a field's value. This may be relatively
    4987              :   /// coarse to verify the value as the application service providing this protocol
    4988              :   /// may apply additional validation or filtering.
    4989              :   String regexp;
    4990              : 
    4991            0 :   @dart.override
    4992              :   bool operator ==(Object other) =>
    4993              :       identical(this, other) ||
    4994            0 :       (other is FieldType &&
    4995            0 :           other.runtimeType == runtimeType &&
    4996            0 :           other.placeholder == placeholder &&
    4997            0 :           other.regexp == regexp);
    4998              : 
    4999            0 :   @dart.override
    5000            0 :   int get hashCode => Object.hash(placeholder, regexp);
    5001              : }
    5002              : 
    5003              : ///
    5004              : @_NameSource('spec')
    5005              : class ProtocolInstance {
    5006            0 :   ProtocolInstance({
    5007              :     required this.desc,
    5008              :     required this.fields,
    5009              :     this.icon,
    5010              :     required this.networkId,
    5011              :   });
    5012              : 
    5013            0 :   ProtocolInstance.fromJson(Map<String, Object?> json)
    5014            0 :       : desc = json['desc'] as String,
    5015            0 :         fields = json['fields'] as Map<String, Object?>,
    5016            0 :         icon = ((v) => v != null ? v as String : null)(json['icon']),
    5017            0 :         networkId = json['network_id'] as String;
    5018            0 :   Map<String, Object?> toJson() {
    5019            0 :     final icon = this.icon;
    5020            0 :     return {
    5021            0 :       'desc': desc,
    5022            0 :       'fields': fields,
    5023            0 :       if (icon != null) 'icon': icon,
    5024            0 :       'network_id': networkId,
    5025              :     };
    5026              :   }
    5027              : 
    5028              :   /// A human-readable description for the protocol, such as the name.
    5029              :   String desc;
    5030              : 
    5031              :   /// Preset values for `fields` the client may use to search by.
    5032              :   Map<String, Object?> fields;
    5033              : 
    5034              :   /// An optional content URI representing the protocol. Overrides the one provided
    5035              :   /// at the higher level Protocol object.
    5036              :   String? icon;
    5037              : 
    5038              :   /// A unique identifier across all instances.
    5039              :   String networkId;
    5040              : 
    5041            0 :   @dart.override
    5042              :   bool operator ==(Object other) =>
    5043              :       identical(this, other) ||
    5044            0 :       (other is ProtocolInstance &&
    5045            0 :           other.runtimeType == runtimeType &&
    5046            0 :           other.desc == desc &&
    5047            0 :           other.fields == fields &&
    5048            0 :           other.icon == icon &&
    5049            0 :           other.networkId == networkId);
    5050              : 
    5051            0 :   @dart.override
    5052            0 :   int get hashCode => Object.hash(desc, fields, icon, networkId);
    5053              : }
    5054              : 
    5055              : ///
    5056              : @_NameSource('spec')
    5057              : class Protocol {
    5058            0 :   Protocol({
    5059              :     required this.fieldTypes,
    5060              :     required this.icon,
    5061              :     required this.instances,
    5062              :     required this.locationFields,
    5063              :     required this.userFields,
    5064              :   });
    5065              : 
    5066            0 :   Protocol.fromJson(Map<String, Object?> json)
    5067            0 :       : fieldTypes = (json['field_types'] as Map<String, Object?>).map(
    5068            0 :           (k, v) => MapEntry(k, FieldType.fromJson(v as Map<String, Object?>)),
    5069              :         ),
    5070            0 :         icon = json['icon'] as String,
    5071            0 :         instances = (json['instances'] as List)
    5072            0 :             .map((v) => ProtocolInstance.fromJson(v as Map<String, Object?>))
    5073            0 :             .toList(),
    5074              :         locationFields =
    5075            0 :             (json['location_fields'] as List).map((v) => v as String).toList(),
    5076              :         userFields =
    5077            0 :             (json['user_fields'] as List).map((v) => v as String).toList();
    5078            0 :   Map<String, Object?> toJson() => {
    5079            0 :         'field_types': fieldTypes.map((k, v) => MapEntry(k, v.toJson())),
    5080            0 :         'icon': icon,
    5081            0 :         'instances': instances.map((v) => v.toJson()).toList(),
    5082            0 :         'location_fields': locationFields.map((v) => v).toList(),
    5083            0 :         'user_fields': userFields.map((v) => v).toList(),
    5084              :       };
    5085              : 
    5086              :   /// The type definitions for the fields defined in `user_fields` and
    5087              :   /// `location_fields`. Each entry in those arrays MUST have an entry here.
    5088              :   /// The `string` key for this object is the field name itself.
    5089              :   ///
    5090              :   /// May be an empty object if no fields are defined.
    5091              :   Map<String, FieldType> fieldTypes;
    5092              : 
    5093              :   /// A content URI representing an icon for the third-party protocol.
    5094              :   String icon;
    5095              : 
    5096              :   /// A list of objects representing independent instances of configuration.
    5097              :   /// For example, multiple networks on IRC if multiple are provided by the
    5098              :   /// same application service.
    5099              :   List<ProtocolInstance> instances;
    5100              : 
    5101              :   /// Fields which may be used to identify a third-party location. These should be
    5102              :   /// ordered to suggest the way that entities may be grouped, where higher
    5103              :   /// groupings are ordered first. For example, the name of a network should be
    5104              :   /// searched before the name of a channel.
    5105              :   List<String> locationFields;
    5106              : 
    5107              :   /// Fields which may be used to identify a third-party user. These should be
    5108              :   /// ordered to suggest the way that entities may be grouped, where higher
    5109              :   /// groupings are ordered first. For example, the name of a network should be
    5110              :   /// searched before the nickname of a user.
    5111              :   List<String> userFields;
    5112              : 
    5113            0 :   @dart.override
    5114              :   bool operator ==(Object other) =>
    5115              :       identical(this, other) ||
    5116            0 :       (other is Protocol &&
    5117            0 :           other.runtimeType == runtimeType &&
    5118            0 :           other.fieldTypes == fieldTypes &&
    5119            0 :           other.icon == icon &&
    5120            0 :           other.instances == instances &&
    5121            0 :           other.locationFields == locationFields &&
    5122            0 :           other.userFields == userFields);
    5123              : 
    5124            0 :   @dart.override
    5125              :   int get hashCode =>
    5126            0 :       Object.hash(fieldTypes, icon, instances, locationFields, userFields);
    5127              : }
    5128              : 
    5129              : ///
    5130              : @_NameSource('rule override spec')
    5131              : class ThirdPartyUser {
    5132            0 :   ThirdPartyUser({
    5133              :     required this.fields,
    5134              :     required this.protocol,
    5135              :     required this.userid,
    5136              :   });
    5137              : 
    5138            0 :   ThirdPartyUser.fromJson(Map<String, Object?> json)
    5139            0 :       : fields = json['fields'] as Map<String, Object?>,
    5140            0 :         protocol = json['protocol'] as String,
    5141            0 :         userid = json['userid'] as String;
    5142            0 :   Map<String, Object?> toJson() => {
    5143            0 :         'fields': fields,
    5144            0 :         'protocol': protocol,
    5145            0 :         'userid': userid,
    5146              :       };
    5147              : 
    5148              :   /// Information used to identify this third-party location.
    5149              :   Map<String, Object?> fields;
    5150              : 
    5151              :   /// The protocol ID that the third-party location is a part of.
    5152              :   String protocol;
    5153              : 
    5154              :   /// A Matrix User ID representing a third-party user.
    5155              :   String userid;
    5156              : 
    5157            0 :   @dart.override
    5158              :   bool operator ==(Object other) =>
    5159              :       identical(this, other) ||
    5160            0 :       (other is ThirdPartyUser &&
    5161            0 :           other.runtimeType == runtimeType &&
    5162            0 :           other.fields == fields &&
    5163            0 :           other.protocol == protocol &&
    5164            0 :           other.userid == userid);
    5165              : 
    5166            0 :   @dart.override
    5167            0 :   int get hashCode => Object.hash(fields, protocol, userid);
    5168              : }
    5169              : 
    5170              : ///
    5171              : @_NameSource('generated')
    5172              : enum EventFormat {
    5173              :   client('client'),
    5174              :   federation('federation');
    5175              : 
    5176              :   final String name;
    5177              :   const EventFormat(this.name);
    5178              : }
    5179              : 
    5180              : ///
    5181              : @_NameSource('rule override generated')
    5182              : class StateFilter implements EventFilter, RoomEventFilter {
    5183           39 :   StateFilter({
    5184              :     this.limit,
    5185              :     this.notSenders,
    5186              :     this.notTypes,
    5187              :     this.senders,
    5188              :     this.types,
    5189              :     this.containsUrl,
    5190              :     this.includeRedundantMembers,
    5191              :     this.lazyLoadMembers,
    5192              :     this.notRooms,
    5193              :     this.rooms,
    5194              :     this.unreadThreadNotifications,
    5195              :   });
    5196              : 
    5197            0 :   StateFilter.fromJson(Map<String, Object?> json)
    5198            0 :       : limit = ((v) => v != null ? v as int : null)(json['limit']),
    5199            0 :         notSenders = ((v) => v != null
    5200            0 :             ? (v as List).map((v) => v as String).toList()
    5201            0 :             : null)(json['not_senders']),
    5202            0 :         notTypes = ((v) => v != null
    5203            0 :             ? (v as List).map((v) => v as String).toList()
    5204            0 :             : null)(json['not_types']),
    5205            0 :         senders = ((v) => v != null
    5206            0 :             ? (v as List).map((v) => v as String).toList()
    5207            0 :             : null)(json['senders']),
    5208            0 :         types = ((v) => v != null
    5209            0 :             ? (v as List).map((v) => v as String).toList()
    5210            0 :             : null)(json['types']),
    5211              :         containsUrl =
    5212            0 :             ((v) => v != null ? v as bool : null)(json['contains_url']),
    5213            0 :         includeRedundantMembers = ((v) =>
    5214            0 :             v != null ? v as bool : null)(json['include_redundant_members']),
    5215              :         lazyLoadMembers =
    5216            0 :             ((v) => v != null ? v as bool : null)(json['lazy_load_members']),
    5217            0 :         notRooms = ((v) => v != null
    5218            0 :             ? (v as List).map((v) => v as String).toList()
    5219            0 :             : null)(json['not_rooms']),
    5220            0 :         rooms = ((v) => v != null
    5221            0 :             ? (v as List).map((v) => v as String).toList()
    5222            0 :             : null)(json['rooms']),
    5223            0 :         unreadThreadNotifications = ((v) =>
    5224            0 :             v != null ? v as bool : null)(json['unread_thread_notifications']);
    5225           33 :   @override
    5226              :   Map<String, Object?> toJson() {
    5227           33 :     final limit = this.limit;
    5228           33 :     final notSenders = this.notSenders;
    5229           33 :     final notTypes = this.notTypes;
    5230           33 :     final senders = this.senders;
    5231           33 :     final types = this.types;
    5232           33 :     final containsUrl = this.containsUrl;
    5233           33 :     final includeRedundantMembers = this.includeRedundantMembers;
    5234           33 :     final lazyLoadMembers = this.lazyLoadMembers;
    5235           33 :     final notRooms = this.notRooms;
    5236           33 :     final rooms = this.rooms;
    5237           33 :     final unreadThreadNotifications = this.unreadThreadNotifications;
    5238           33 :     return {
    5239            3 :       if (limit != null) 'limit': limit,
    5240            0 :       if (notSenders != null) 'not_senders': notSenders.map((v) => v).toList(),
    5241            0 :       if (notTypes != null) 'not_types': notTypes.map((v) => v).toList(),
    5242            0 :       if (senders != null) 'senders': senders.map((v) => v).toList(),
    5243            0 :       if (types != null) 'types': types.map((v) => v).toList(),
    5244            0 :       if (containsUrl != null) 'contains_url': containsUrl,
    5245              :       if (includeRedundantMembers != null)
    5246            0 :         'include_redundant_members': includeRedundantMembers,
    5247           33 :       if (lazyLoadMembers != null) 'lazy_load_members': lazyLoadMembers,
    5248            0 :       if (notRooms != null) 'not_rooms': notRooms.map((v) => v).toList(),
    5249            0 :       if (rooms != null) 'rooms': rooms.map((v) => v).toList(),
    5250              :       if (unreadThreadNotifications != null)
    5251            0 :         'unread_thread_notifications': unreadThreadNotifications,
    5252              :     };
    5253              :   }
    5254              : 
    5255              :   /// The maximum number of events to return, must be an integer greater than 0.
    5256              :   ///
    5257              :   /// Servers should apply a default value, and impose a maximum value to avoid
    5258              :   /// resource exhaustion.
    5259              :   ///
    5260              :   @override
    5261              :   int? limit;
    5262              : 
    5263              :   /// A list of sender IDs to exclude. If this list is absent then no senders are excluded. A matching sender will be excluded even if it is listed in the `'senders'` filter.
    5264              :   @override
    5265              :   List<String>? notSenders;
    5266              : 
    5267              :   /// A list of event types to exclude. If this list is absent then no event types are excluded. A matching type will be excluded even if it is listed in the `'types'` filter. A '*' can be used as a wildcard to match any sequence of characters.
    5268              :   @override
    5269              :   List<String>? notTypes;
    5270              : 
    5271              :   /// A list of senders IDs to include. If this list is absent then all senders are included.
    5272              :   @override
    5273              :   List<String>? senders;
    5274              : 
    5275              :   /// A list of event types to include. If this list is absent then all event types are included. A `'*'` can be used as a wildcard to match any sequence of characters.
    5276              :   @override
    5277              :   List<String>? types;
    5278              : 
    5279              :   /// If `true`, includes only events with a `url` key in their content. If `false`, excludes those events. If omitted, `url` key is not considered for filtering.
    5280              :   @override
    5281              :   bool? containsUrl;
    5282              : 
    5283              :   /// If `true`, sends all membership events for all events, even if they have already
    5284              :   /// been sent to the client. Does not
    5285              :   /// apply unless `lazy_load_members` is `true`. See
    5286              :   /// [Lazy-loading room members](https://spec.matrix.org/unstable/client-server-api/#lazy-loading-room-members)
    5287              :   /// for more information. Defaults to `false`.
    5288              :   @override
    5289              :   bool? includeRedundantMembers;
    5290              : 
    5291              :   /// If `true`, enables lazy-loading of membership events. See
    5292              :   /// [Lazy-loading room members](https://spec.matrix.org/unstable/client-server-api/#lazy-loading-room-members)
    5293              :   /// for more information. Defaults to `false`.
    5294              :   @override
    5295              :   bool? lazyLoadMembers;
    5296              : 
    5297              :   /// A list of room IDs to exclude. If this list is absent then no rooms are excluded. A matching room will be excluded even if it is listed in the `'rooms'` filter.
    5298              :   @override
    5299              :   List<String>? notRooms;
    5300              : 
    5301              :   /// A list of room IDs to include. If this list is absent then all rooms are included.
    5302              :   @override
    5303              :   List<String>? rooms;
    5304              : 
    5305              :   /// If `true`, enables per-[thread](https://spec.matrix.org/unstable/client-server-api/#threading) notification
    5306              :   /// counts. Only applies to the `/sync` endpoint. Defaults to `false`.
    5307              :   @override
    5308              :   bool? unreadThreadNotifications;
    5309              : 
    5310            0 :   @dart.override
    5311              :   bool operator ==(Object other) =>
    5312              :       identical(this, other) ||
    5313            0 :       (other is StateFilter &&
    5314            0 :           other.runtimeType == runtimeType &&
    5315            0 :           other.limit == limit &&
    5316            0 :           other.notSenders == notSenders &&
    5317            0 :           other.notTypes == notTypes &&
    5318            0 :           other.senders == senders &&
    5319            0 :           other.types == types &&
    5320            0 :           other.containsUrl == containsUrl &&
    5321            0 :           other.includeRedundantMembers == includeRedundantMembers &&
    5322            0 :           other.lazyLoadMembers == lazyLoadMembers &&
    5323            0 :           other.notRooms == notRooms &&
    5324            0 :           other.rooms == rooms &&
    5325            0 :           other.unreadThreadNotifications == unreadThreadNotifications);
    5326              : 
    5327            0 :   @dart.override
    5328            0 :   int get hashCode => Object.hash(
    5329            0 :         limit,
    5330            0 :         notSenders,
    5331            0 :         notTypes,
    5332            0 :         senders,
    5333            0 :         types,
    5334            0 :         containsUrl,
    5335            0 :         includeRedundantMembers,
    5336            0 :         lazyLoadMembers,
    5337            0 :         notRooms,
    5338            0 :         rooms,
    5339            0 :         unreadThreadNotifications,
    5340              :       );
    5341              : }
    5342              : 
    5343              : ///
    5344              : @_NameSource('spec')
    5345              : class RoomFilter {
    5346           39 :   RoomFilter({
    5347              :     this.accountData,
    5348              :     this.ephemeral,
    5349              :     this.includeLeave,
    5350              :     this.notRooms,
    5351              :     this.rooms,
    5352              :     this.state,
    5353              :     this.timeline,
    5354              :   });
    5355              : 
    5356            0 :   RoomFilter.fromJson(Map<String, Object?> json)
    5357            0 :       : accountData = ((v) => v != null
    5358            0 :             ? StateFilter.fromJson(v as Map<String, Object?>)
    5359            0 :             : null)(json['account_data']),
    5360            0 :         ephemeral = ((v) => v != null
    5361            0 :             ? StateFilter.fromJson(v as Map<String, Object?>)
    5362            0 :             : null)(json['ephemeral']),
    5363              :         includeLeave =
    5364            0 :             ((v) => v != null ? v as bool : null)(json['include_leave']),
    5365            0 :         notRooms = ((v) => v != null
    5366            0 :             ? (v as List).map((v) => v as String).toList()
    5367            0 :             : null)(json['not_rooms']),
    5368            0 :         rooms = ((v) => v != null
    5369            0 :             ? (v as List).map((v) => v as String).toList()
    5370            0 :             : null)(json['rooms']),
    5371            0 :         state = ((v) => v != null
    5372            0 :             ? StateFilter.fromJson(v as Map<String, Object?>)
    5373            0 :             : null)(json['state']),
    5374            0 :         timeline = ((v) => v != null
    5375            0 :             ? StateFilter.fromJson(v as Map<String, Object?>)
    5376            0 :             : null)(json['timeline']);
    5377           33 :   Map<String, Object?> toJson() {
    5378           33 :     final accountData = this.accountData;
    5379           33 :     final ephemeral = this.ephemeral;
    5380           33 :     final includeLeave = this.includeLeave;
    5381           33 :     final notRooms = this.notRooms;
    5382           33 :     final rooms = this.rooms;
    5383           33 :     final state = this.state;
    5384           33 :     final timeline = this.timeline;
    5385           33 :     return {
    5386            0 :       if (accountData != null) 'account_data': accountData.toJson(),
    5387            0 :       if (ephemeral != null) 'ephemeral': ephemeral.toJson(),
    5388            3 :       if (includeLeave != null) 'include_leave': includeLeave,
    5389            0 :       if (notRooms != null) 'not_rooms': notRooms.map((v) => v).toList(),
    5390            0 :       if (rooms != null) 'rooms': rooms.map((v) => v).toList(),
    5391           66 :       if (state != null) 'state': state.toJson(),
    5392            6 :       if (timeline != null) 'timeline': timeline.toJson(),
    5393              :     };
    5394              :   }
    5395              : 
    5396              :   /// The per user account data to include for rooms.
    5397              :   StateFilter? accountData;
    5398              : 
    5399              :   /// The ephemeral events to include for rooms. These are the events that appear in the `ephemeral` property in the `/sync` response.
    5400              :   StateFilter? ephemeral;
    5401              : 
    5402              :   /// Include rooms that the user has left in the sync, default false
    5403              :   bool? includeLeave;
    5404              : 
    5405              :   /// A list of room IDs to exclude. If this list is absent then no rooms are excluded. A matching room will be excluded even if it is listed in the `'rooms'` filter. This filter is applied before the filters in `ephemeral`, `state`, `timeline` or `account_data`
    5406              :   List<String>? notRooms;
    5407              : 
    5408              :   /// A list of room IDs to include. If this list is absent then all rooms are included. This filter is applied before the filters in `ephemeral`, `state`, `timeline` or `account_data`
    5409              :   List<String>? rooms;
    5410              : 
    5411              :   /// The state events to include for rooms.
    5412              :   StateFilter? state;
    5413              : 
    5414              :   /// The message and state update events to include for rooms.
    5415              :   StateFilter? timeline;
    5416              : 
    5417            0 :   @dart.override
    5418              :   bool operator ==(Object other) =>
    5419              :       identical(this, other) ||
    5420            0 :       (other is RoomFilter &&
    5421            0 :           other.runtimeType == runtimeType &&
    5422            0 :           other.accountData == accountData &&
    5423            0 :           other.ephemeral == ephemeral &&
    5424            0 :           other.includeLeave == includeLeave &&
    5425            0 :           other.notRooms == notRooms &&
    5426            0 :           other.rooms == rooms &&
    5427            0 :           other.state == state &&
    5428            0 :           other.timeline == timeline);
    5429              : 
    5430            0 :   @dart.override
    5431            0 :   int get hashCode => Object.hash(
    5432            0 :         accountData,
    5433            0 :         ephemeral,
    5434            0 :         includeLeave,
    5435            0 :         notRooms,
    5436            0 :         rooms,
    5437            0 :         state,
    5438            0 :         timeline,
    5439              :       );
    5440              : }
    5441              : 
    5442              : ///
    5443              : @_NameSource('spec')
    5444              : class Filter {
    5445           39 :   Filter({
    5446              :     this.accountData,
    5447              :     this.eventFields,
    5448              :     this.eventFormat,
    5449              :     this.presence,
    5450              :     this.room,
    5451              :   });
    5452              : 
    5453            0 :   Filter.fromJson(Map<String, Object?> json)
    5454            0 :       : accountData = ((v) => v != null
    5455            0 :             ? EventFilter.fromJson(v as Map<String, Object?>)
    5456            0 :             : null)(json['account_data']),
    5457            0 :         eventFields = ((v) => v != null
    5458            0 :             ? (v as List).map((v) => v as String).toList()
    5459            0 :             : null)(json['event_fields']),
    5460            0 :         eventFormat = ((v) => v != null
    5461            0 :             ? EventFormat.values.fromString(v as String)!
    5462            0 :             : null)(json['event_format']),
    5463            0 :         presence = ((v) => v != null
    5464            0 :             ? EventFilter.fromJson(v as Map<String, Object?>)
    5465            0 :             : null)(json['presence']),
    5466            0 :         room = ((v) => v != null
    5467            0 :             ? RoomFilter.fromJson(v as Map<String, Object?>)
    5468            0 :             : null)(json['room']);
    5469           33 :   Map<String, Object?> toJson() {
    5470           33 :     final accountData = this.accountData;
    5471           33 :     final eventFields = this.eventFields;
    5472           33 :     final eventFormat = this.eventFormat;
    5473           33 :     final presence = this.presence;
    5474           33 :     final room = this.room;
    5475           33 :     return {
    5476            0 :       if (accountData != null) 'account_data': accountData.toJson(),
    5477              :       if (eventFields != null)
    5478            0 :         'event_fields': eventFields.map((v) => v).toList(),
    5479            0 :       if (eventFormat != null) 'event_format': eventFormat.name,
    5480            0 :       if (presence != null) 'presence': presence.toJson(),
    5481           66 :       if (room != null) 'room': room.toJson(),
    5482              :     };
    5483              :   }
    5484              : 
    5485              :   /// The user account data that isn't associated with rooms to include.
    5486              :   EventFilter? accountData;
    5487              : 
    5488              :   /// List of event fields to include. If this list is absent then all fields are included. The entries are [dot-separated paths for each property](https://spec.matrix.org/unstable/appendices#dot-separated-property-paths) to include. So ['content.body'] will include the 'body' field of the 'content' object. A server may include more fields than were requested.
    5489              :   List<String>? eventFields;
    5490              : 
    5491              :   /// The format to use for events. 'client' will return the events in a format suitable for clients. 'federation' will return the raw event as received over federation. The default is 'client'.
    5492              :   EventFormat? eventFormat;
    5493              : 
    5494              :   /// The presence updates to include.
    5495              :   EventFilter? presence;
    5496              : 
    5497              :   /// Filters to be applied to room data.
    5498              :   RoomFilter? room;
    5499              : 
    5500            0 :   @dart.override
    5501              :   bool operator ==(Object other) =>
    5502              :       identical(this, other) ||
    5503            0 :       (other is Filter &&
    5504            0 :           other.runtimeType == runtimeType &&
    5505            0 :           other.accountData == accountData &&
    5506            0 :           other.eventFields == eventFields &&
    5507            0 :           other.eventFormat == eventFormat &&
    5508            0 :           other.presence == presence &&
    5509            0 :           other.room == room);
    5510              : 
    5511            0 :   @dart.override
    5512              :   int get hashCode =>
    5513            0 :       Object.hash(accountData, eventFields, eventFormat, presence, room);
    5514              : }
    5515              : 
    5516              : ///
    5517              : @_NameSource('spec')
    5518              : class OpenIdCredentials {
    5519            0 :   OpenIdCredentials({
    5520              :     required this.accessToken,
    5521              :     required this.expiresIn,
    5522              :     required this.matrixServerName,
    5523              :     required this.tokenType,
    5524              :   });
    5525              : 
    5526            0 :   OpenIdCredentials.fromJson(Map<String, Object?> json)
    5527            0 :       : accessToken = json['access_token'] as String,
    5528            0 :         expiresIn = json['expires_in'] as int,
    5529            0 :         matrixServerName = json['matrix_server_name'] as String,
    5530            0 :         tokenType = json['token_type'] as String;
    5531            0 :   Map<String, Object?> toJson() => {
    5532            0 :         'access_token': accessToken,
    5533            0 :         'expires_in': expiresIn,
    5534            0 :         'matrix_server_name': matrixServerName,
    5535            0 :         'token_type': tokenType,
    5536              :       };
    5537              : 
    5538              :   /// An access token the consumer may use to verify the identity of
    5539              :   /// the person who generated the token. This is given to the federation
    5540              :   /// API `GET /openid/userinfo` to verify the user's identity.
    5541              :   String accessToken;
    5542              : 
    5543              :   /// The number of seconds before this token expires and a new one must
    5544              :   /// be generated.
    5545              :   int expiresIn;
    5546              : 
    5547              :   /// The homeserver domain the consumer should use when attempting to
    5548              :   /// verify the user's identity.
    5549              :   String matrixServerName;
    5550              : 
    5551              :   /// The string `Bearer`.
    5552              :   String tokenType;
    5553              : 
    5554            0 :   @dart.override
    5555              :   bool operator ==(Object other) =>
    5556              :       identical(this, other) ||
    5557            0 :       (other is OpenIdCredentials &&
    5558            0 :           other.runtimeType == runtimeType &&
    5559            0 :           other.accessToken == accessToken &&
    5560            0 :           other.expiresIn == expiresIn &&
    5561            0 :           other.matrixServerName == matrixServerName &&
    5562            0 :           other.tokenType == tokenType);
    5563              : 
    5564            0 :   @dart.override
    5565              :   int get hashCode =>
    5566            0 :       Object.hash(accessToken, expiresIn, matrixServerName, tokenType);
    5567              : }
    5568              : 
    5569              : ///
    5570              : @_NameSource('spec')
    5571              : class Tag {
    5572           33 :   Tag({
    5573              :     this.order,
    5574              :     this.additionalProperties = const {},
    5575              :   });
    5576              : 
    5577            0 :   Tag.fromJson(Map<String, Object?> json)
    5578              :       : order =
    5579            0 :             ((v) => v != null ? (v as num).toDouble() : null)(json['order']),
    5580            0 :         additionalProperties = Map.fromEntries(
    5581            0 :           json.entries
    5582            0 :               .where((e) => !['order'].contains(e.key))
    5583            0 :               .map((e) => MapEntry(e.key, e.value)),
    5584              :         );
    5585            2 :   Map<String, Object?> toJson() {
    5586            2 :     final order = this.order;
    5587            2 :     return {
    5588            2 :       ...additionalProperties,
    5589            2 :       if (order != null) 'order': order,
    5590              :     };
    5591              :   }
    5592              : 
    5593              :   /// A number in a range `[0,1]` describing a relative
    5594              :   /// position of the room under the given tag.
    5595              :   double? order;
    5596              : 
    5597              :   Map<String, Object?> additionalProperties;
    5598              : 
    5599            0 :   @dart.override
    5600              :   bool operator ==(Object other) =>
    5601              :       identical(this, other) ||
    5602            0 :       (other is Tag &&
    5603            0 :           other.runtimeType == runtimeType &&
    5604            0 :           other.order == order);
    5605              : 
    5606            0 :   @dart.override
    5607            0 :   int get hashCode => order.hashCode;
    5608              : }
    5609              : 
    5610              : ///
    5611              : @_NameSource('rule override spec')
    5612              : class Profile {
    5613            1 :   Profile({
    5614              :     this.avatarUrl,
    5615              :     this.displayName,
    5616              :     required this.userId,
    5617              :   });
    5618              : 
    5619            0 :   Profile.fromJson(Map<String, Object?> json)
    5620            0 :       : avatarUrl = ((v) =>
    5621            0 :             v != null ? Uri.parse(v as String) : null)(json['avatar_url']),
    5622              :         displayName =
    5623            0 :             ((v) => v != null ? v as String : null)(json['display_name']),
    5624            0 :         userId = json['user_id'] as String;
    5625            0 :   Map<String, Object?> toJson() {
    5626            0 :     final avatarUrl = this.avatarUrl;
    5627            0 :     final displayName = this.displayName;
    5628            0 :     return {
    5629            0 :       if (avatarUrl != null) 'avatar_url': avatarUrl.toString(),
    5630            0 :       if (displayName != null) 'display_name': displayName,
    5631            0 :       'user_id': userId,
    5632              :     };
    5633              :   }
    5634              : 
    5635              :   /// The avatar url, as an [`mxc://` URI](https://spec.matrix.org/unstable/client-server-api/#matrix-content-mxc-uris), if one exists.
    5636              :   Uri? avatarUrl;
    5637              : 
    5638              :   /// The display name of the user, if one exists.
    5639              :   String? displayName;
    5640              : 
    5641              :   /// The user's matrix user ID.
    5642              :   String userId;
    5643              : 
    5644            0 :   @dart.override
    5645              :   bool operator ==(Object other) =>
    5646              :       identical(this, other) ||
    5647            0 :       (other is Profile &&
    5648            0 :           other.runtimeType == runtimeType &&
    5649            0 :           other.avatarUrl == avatarUrl &&
    5650            0 :           other.displayName == displayName &&
    5651            0 :           other.userId == userId);
    5652              : 
    5653            0 :   @dart.override
    5654            0 :   int get hashCode => Object.hash(avatarUrl, displayName, userId);
    5655              : }
    5656              : 
    5657              : ///
    5658              : @_NameSource('generated')
    5659              : class SearchUserDirectoryResponse {
    5660            0 :   SearchUserDirectoryResponse({
    5661              :     required this.limited,
    5662              :     required this.results,
    5663              :   });
    5664              : 
    5665            0 :   SearchUserDirectoryResponse.fromJson(Map<String, Object?> json)
    5666            0 :       : limited = json['limited'] as bool,
    5667            0 :         results = (json['results'] as List)
    5668            0 :             .map((v) => Profile.fromJson(v as Map<String, Object?>))
    5669            0 :             .toList();
    5670            0 :   Map<String, Object?> toJson() => {
    5671            0 :         'limited': limited,
    5672            0 :         'results': results.map((v) => v.toJson()).toList(),
    5673              :       };
    5674              : 
    5675              :   /// Indicates if the result list has been truncated by the limit.
    5676              :   bool limited;
    5677              : 
    5678              :   /// Ordered by rank and then whether or not profile info is available.
    5679              :   List<Profile> results;
    5680              : 
    5681            0 :   @dart.override
    5682              :   bool operator ==(Object other) =>
    5683              :       identical(this, other) ||
    5684            0 :       (other is SearchUserDirectoryResponse &&
    5685            0 :           other.runtimeType == runtimeType &&
    5686            0 :           other.limited == limited &&
    5687            0 :           other.results == results);
    5688              : 
    5689            0 :   @dart.override
    5690            0 :   int get hashCode => Object.hash(limited, results);
    5691              : }
    5692              : 
    5693              : ///
    5694              : @_NameSource('rule override generated')
    5695              : class TurnServerCredentials {
    5696            0 :   TurnServerCredentials({
    5697              :     required this.password,
    5698              :     required this.ttl,
    5699              :     required this.uris,
    5700              :     required this.username,
    5701              :   });
    5702              : 
    5703            2 :   TurnServerCredentials.fromJson(Map<String, Object?> json)
    5704            2 :       : password = json['password'] as String,
    5705            2 :         ttl = json['ttl'] as int,
    5706            8 :         uris = (json['uris'] as List).map((v) => v as String).toList(),
    5707            2 :         username = json['username'] as String;
    5708            0 :   Map<String, Object?> toJson() => {
    5709            0 :         'password': password,
    5710            0 :         'ttl': ttl,
    5711            0 :         'uris': uris.map((v) => v).toList(),
    5712            0 :         'username': username,
    5713              :       };
    5714              : 
    5715              :   /// The password to use.
    5716              :   String password;
    5717              : 
    5718              :   /// The time-to-live in seconds
    5719              :   int ttl;
    5720              : 
    5721              :   /// A list of TURN URIs
    5722              :   List<String> uris;
    5723              : 
    5724              :   /// The username to use.
    5725              :   String username;
    5726              : 
    5727            0 :   @dart.override
    5728              :   bool operator ==(Object other) =>
    5729              :       identical(this, other) ||
    5730            0 :       (other is TurnServerCredentials &&
    5731            0 :           other.runtimeType == runtimeType &&
    5732            0 :           other.password == password &&
    5733            0 :           other.ttl == ttl &&
    5734            0 :           other.uris == uris &&
    5735            0 :           other.username == username);
    5736              : 
    5737            0 :   @dart.override
    5738            0 :   int get hashCode => Object.hash(password, ttl, uris, username);
    5739              : }
    5740              : 
    5741              : ///
    5742              : @_NameSource('generated')
    5743              : class GetVersionsResponse {
    5744            0 :   GetVersionsResponse({
    5745              :     this.unstableFeatures,
    5746              :     required this.versions,
    5747              :   });
    5748              : 
    5749           35 :   GetVersionsResponse.fromJson(Map<String, Object?> json)
    5750           35 :       : unstableFeatures = ((v) => v != null
    5751          105 :             ? (v as Map<String, Object?>).map((k, v) => MapEntry(k, v as bool))
    5752           70 :             : null)(json['unstable_features']),
    5753          140 :         versions = (json['versions'] as List).map((v) => v as String).toList();
    5754            0 :   Map<String, Object?> toJson() {
    5755            0 :     final unstableFeatures = this.unstableFeatures;
    5756            0 :     return {
    5757              :       if (unstableFeatures != null)
    5758            0 :         'unstable_features': unstableFeatures.map((k, v) => MapEntry(k, v)),
    5759            0 :       'versions': versions.map((v) => v).toList(),
    5760              :     };
    5761              :   }
    5762              : 
    5763              :   /// Experimental features the server supports. Features not listed here,
    5764              :   /// or the lack of this property all together, indicate that a feature is
    5765              :   /// not supported.
    5766              :   Map<String, bool>? unstableFeatures;
    5767              : 
    5768              :   /// The supported versions.
    5769              :   List<String> versions;
    5770              : 
    5771            0 :   @dart.override
    5772              :   bool operator ==(Object other) =>
    5773              :       identical(this, other) ||
    5774            0 :       (other is GetVersionsResponse &&
    5775            0 :           other.runtimeType == runtimeType &&
    5776            0 :           other.unstableFeatures == unstableFeatures &&
    5777            0 :           other.versions == versions);
    5778              : 
    5779            0 :   @dart.override
    5780            0 :   int get hashCode => Object.hash(unstableFeatures, versions);
    5781              : }
    5782              : 
    5783              : ///
    5784              : @_NameSource('generated')
    5785              : class CreateContentResponse {
    5786            0 :   CreateContentResponse({
    5787              :     required this.contentUri,
    5788              :     this.unusedExpiresAt,
    5789              :   });
    5790              : 
    5791            0 :   CreateContentResponse.fromJson(Map<String, Object?> json)
    5792            0 :       : contentUri = ((json['content_uri'] as String).startsWith('mxc://')
    5793            0 :             ? Uri.parse(json['content_uri'] as String)
    5794            0 :             : throw Exception('Uri not an mxc URI')),
    5795              :         unusedExpiresAt =
    5796            0 :             ((v) => v != null ? v as int : null)(json['unused_expires_at']);
    5797            0 :   Map<String, Object?> toJson() {
    5798            0 :     final unusedExpiresAt = this.unusedExpiresAt;
    5799            0 :     return {
    5800            0 :       'content_uri': contentUri.toString(),
    5801            0 :       if (unusedExpiresAt != null) 'unused_expires_at': unusedExpiresAt,
    5802              :     };
    5803              :   }
    5804              : 
    5805              :   /// The [`mxc://` URI](https://spec.matrix.org/unstable/client-server-api/#matrix-content-mxc-uris) at
    5806              :   /// which the content will be available, once it is uploaded.
    5807              :   Uri contentUri;
    5808              : 
    5809              :   /// The timestamp (in milliseconds since the unix epoch) when the
    5810              :   /// generated media id will expire, if media is not uploaded.
    5811              :   int? unusedExpiresAt;
    5812              : 
    5813            0 :   @dart.override
    5814              :   bool operator ==(Object other) =>
    5815              :       identical(this, other) ||
    5816            0 :       (other is CreateContentResponse &&
    5817            0 :           other.runtimeType == runtimeType &&
    5818            0 :           other.contentUri == contentUri &&
    5819            0 :           other.unusedExpiresAt == unusedExpiresAt);
    5820              : 
    5821            0 :   @dart.override
    5822            0 :   int get hashCode => Object.hash(contentUri, unusedExpiresAt);
    5823              : }
        

Generated by: LCOV version 2.0-1