// Author: fengshengxiong
// Date: 2024/6/18
// Description: Browse-首页模型

import 'dart:convert';

class BrowseModel {
	ResponseContext? responseContext;
	Contents? contents;
	ContinuationContents? continuationContents;
	String? trackingParams;
	Microformat? microformat;
	int? maxAgeStoreSeconds;
	ThumbnailClass? background;

	BrowseModel({
		this.responseContext,
		this.contents,
		this.continuationContents,
		this.trackingParams,
		this.maxAgeStoreSeconds,
		this.background,
	});

	factory BrowseModel.fromJson(String str) => BrowseModel.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory BrowseModel.fromMap(Map<String, dynamic> json) => BrowseModel(
		responseContext: json["responseContext"] == null ? null : ResponseContext.fromMap(json["responseContext"]),
		contents: json["contents"] == null ? null : Contents.fromMap(json["contents"]),
		continuationContents: json["continuationContents"] == null ? null : ContinuationContents.fromMap(json["continuationContents"]),
		trackingParams: json["trackingParams"],
		maxAgeStoreSeconds: json["maxAgeStoreSeconds"],
		background: json["background"] == null ? null : ThumbnailClass.fromMap(json["background"]),
	);

	Map<String, dynamic> toMap() => {
		"responseContext": responseContext?.toMap(),
		"contents": contents?.toMap(),
		"continuationContents": continuationContents?.toMap(),
		"trackingParams": trackingParams,
		"maxAgeStoreSeconds": maxAgeStoreSeconds,
		"background": background?.toMap(),
	};
}

class ThumbnailClass {
	MusicThumbnailRenderer? musicThumbnailRenderer;

	ThumbnailClass({
		this.musicThumbnailRenderer,
	});

	factory ThumbnailClass.fromJson(String str) => ThumbnailClass.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory ThumbnailClass.fromMap(Map<String, dynamic> json) => ThumbnailClass(
		musicThumbnailRenderer: json["musicThumbnailRenderer"] == null ? null : MusicThumbnailRenderer.fromMap(json["musicThumbnailRenderer"]),
	);

	Map<String, dynamic> toMap() => {
		"musicThumbnailRenderer": musicThumbnailRenderer?.toMap(),
	};
}

class MusicThumbnailRenderer {
	MusicThumbnailRendererThumbnail? thumbnail;
	String? thumbnailCrop;
	String? thumbnailScale;
	String? trackingParams;

	MusicThumbnailRenderer({
		this.thumbnail,
		this.thumbnailCrop,
		this.thumbnailScale,
		this.trackingParams,
	});

	factory MusicThumbnailRenderer.fromJson(String str) => MusicThumbnailRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory MusicThumbnailRenderer.fromMap(Map<String, dynamic> json) => MusicThumbnailRenderer(
		thumbnail: json["thumbnail"] == null ? null : MusicThumbnailRendererThumbnail.fromMap(json["thumbnail"]),
		thumbnailCrop: json["thumbnailCrop"],
		thumbnailScale: json["thumbnailScale"],
		trackingParams: json["trackingParams"],
	);

	Map<String, dynamic> toMap() => {
		"thumbnail": thumbnail?.toMap(),
		"thumbnailCrop": thumbnailCrop,
		"thumbnailScale": thumbnailScale,
		"trackingParams": trackingParams,
	};
}

class MusicThumbnailRendererThumbnail {
	List<ThumbnailElement>? thumbnails;

	MusicThumbnailRendererThumbnail({
		this.thumbnails,
	});

	factory MusicThumbnailRendererThumbnail.fromJson(String str) => MusicThumbnailRendererThumbnail.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory MusicThumbnailRendererThumbnail.fromMap(Map<String, dynamic> json) => MusicThumbnailRendererThumbnail(
		thumbnails: json["thumbnails"] == null ? [] : List<ThumbnailElement>.from(json["thumbnails"]!.map((x) => ThumbnailElement.fromMap(x))),
	);

	Map<String, dynamic> toMap() => {
		"thumbnails": thumbnails == null ? [] : List<dynamic>.from(thumbnails!.map((x) => x.toMap())),
	};
}

class ThumbnailElement {
	String? url;
	int? width;
	int? height;

	ThumbnailElement({
		this.url,
		this.width,
		this.height,
	});

	factory ThumbnailElement.fromJson(String str) => ThumbnailElement.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory ThumbnailElement.fromMap(Map<String, dynamic> json) => ThumbnailElement(
		url: json["url"],
		width: json["width"],
		height: json["height"],
	);

	Map<String, dynamic> toMap() => {
		"url": url,
		"width": width,
		"height": height,
	};
}

class Contents {
	SingleColumnBrowseResultsRenderer? singleColumnBrowseResultsRenderer;
	TwoColumnBrowseResultsRenderer? twoColumnBrowseResultsRenderer;

	Contents({
		this.singleColumnBrowseResultsRenderer,
		this.twoColumnBrowseResultsRenderer,
	});

	factory Contents.fromJson(String str) => Contents.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory Contents.fromMap(Map<String, dynamic> json) => Contents(
		singleColumnBrowseResultsRenderer: json["singleColumnBrowseResultsRenderer"] == null ? null : SingleColumnBrowseResultsRenderer.fromMap(json["singleColumnBrowseResultsRenderer"]),
		twoColumnBrowseResultsRenderer: json["twoColumnBrowseResultsRenderer"] == null ? null : TwoColumnBrowseResultsRenderer.fromMap(json["twoColumnBrowseResultsRenderer"]),
	);

	Map<String, dynamic> toMap() => {
		"singleColumnBrowseResultsRenderer": singleColumnBrowseResultsRenderer?.toMap(),
		"twoColumnBrowseResultsRenderer": twoColumnBrowseResultsRenderer?.toMap(),
	};
}

class SingleColumnBrowseResultsRenderer {
	List<Tab>? tabs;

	SingleColumnBrowseResultsRenderer({
		this.tabs,
	});

	factory SingleColumnBrowseResultsRenderer.fromJson(String str) => SingleColumnBrowseResultsRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory SingleColumnBrowseResultsRenderer.fromMap(Map<String, dynamic> json) => SingleColumnBrowseResultsRenderer(
		tabs: json["tabs"] == null ? [] : List<Tab>.from(json["tabs"]!.map((x) => Tab.fromMap(x))),
	);

	Map<String, dynamic> toMap() => {
		"tabs": tabs == null ? [] : List<dynamic>.from(tabs!.map((x) => x.toMap())),
	};
}

class Tab {
	TabRenderer? tabRenderer;

	Tab({
		this.tabRenderer,
	});

	factory Tab.fromJson(String str) => Tab.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory Tab.fromMap(Map<String, dynamic> json) => Tab(
		tabRenderer: json["tabRenderer"] == null ? null : TabRenderer.fromMap(json["tabRenderer"]),
	);

	Map<String, dynamic> toMap() => {
		"tabRenderer": tabRenderer?.toMap(),
	};
}

class TabRenderer {
	Endpoint? endpoint;
	String? title;
	bool? selected;
	TabRendererContent? content;
	Icon? icon;
	String? tabIdentifier;
	String? trackingParams;

	TabRenderer({
		this.endpoint,
		this.title,
		this.selected,
		this.content,
		this.icon,
		this.tabIdentifier,
		this.trackingParams,
	});

	factory TabRenderer.fromJson(String str) => TabRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory TabRenderer.fromMap(Map<String, dynamic> json) => TabRenderer(
		endpoint: json["endpoint"] == null ? null : Endpoint.fromMap(json["endpoint"]),
		title: json["title"],
		selected: json["selected"],
		content: json["content"] == null ? null : TabRendererContent.fromMap(json["content"]),
		icon: json["icon"] == null ? null : Icon.fromMap(json["icon"]),
		tabIdentifier: json["tabIdentifier"],
		trackingParams: json["trackingParams"],
	);

	Map<String, dynamic> toMap() => {
		"endpoint": endpoint?.toMap(),
		"title": title,
		"selected": selected,
		"content": content?.toMap(),
		"icon": icon?.toMap(),
		"tabIdentifier": tabIdentifier,
		"trackingParams": trackingParams,
	};
}

class TabRendererContent {
	SectionList? sectionListRenderer;

	TabRendererContent({
		this.sectionListRenderer,
	});

	factory TabRendererContent.fromJson(String str) => TabRendererContent.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory TabRendererContent.fromMap(Map<String, dynamic> json) => TabRendererContent(
		sectionListRenderer: json["sectionListRenderer"] == null ? null : SectionList.fromMap(json["sectionListRenderer"]),
	);

	Map<String, dynamic> toMap() => {
		"sectionListRenderer": sectionListRenderer?.toMap(),
	};
}

class SectionList {
	List<SectionListContinuationContent>? contents;
	List<Continuation>? continuations;
	String? trackingParams;
	SectionListContinuationHeader? header;

	SectionList({
		this.contents,
		this.continuations,
		this.trackingParams,
		this.header,
	});

	factory SectionList.fromJson(String str) => SectionList.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory SectionList.fromMap(Map<String, dynamic> json) => SectionList(
		contents: json["contents"] == null ? [] : List<SectionListContinuationContent>.from(json["contents"]!.map((x) => SectionListContinuationContent.fromMap(x))),
		continuations: json["continuations"] == null ? [] : List<Continuation>.from(json["continuations"]!.map((x) => Continuation.fromMap(x))),
		trackingParams: json["trackingParams"],
		header: json["header"] == null ? null : SectionListContinuationHeader.fromMap(json["header"]),
	);

	Map<String, dynamic> toMap() => {
		"contents": contents == null ? [] : List<dynamic>.from(contents!.map((x) => x.toMap())),
		"continuations": continuations == null ? [] : List<dynamic>.from(continuations!.map((x) => x.toMap())),
		"trackingParams": trackingParams,
		"header": header?.toMap(),
	};
}

class SectionListContinuationContent {
	MusicCarouselShelfRenderer? musicCarouselShelfRenderer;
	MusicTastebuilderShelfRenderer? musicTastebuilderShelfRenderer;
	MusicResponsiveHeaderRenderer? musicResponsiveHeaderRenderer;

	SectionListContinuationContent({
		this.musicCarouselShelfRenderer,
		this.musicTastebuilderShelfRenderer,
		this.musicResponsiveHeaderRenderer,
	});

	factory SectionListContinuationContent.fromJson(String str) => SectionListContinuationContent.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory SectionListContinuationContent.fromMap(Map<String, dynamic> json) => SectionListContinuationContent(
		musicCarouselShelfRenderer: json["musicCarouselShelfRenderer"] == null ? null : MusicCarouselShelfRenderer.fromMap(json["musicCarouselShelfRenderer"]),
		musicTastebuilderShelfRenderer: json["musicTastebuilderShelfRenderer"] == null ? null : MusicTastebuilderShelfRenderer.fromMap(json["musicTastebuilderShelfRenderer"]),
		musicResponsiveHeaderRenderer: json["musicResponsiveHeaderRenderer"] == null ? null : MusicResponsiveHeaderRenderer.fromMap(json["musicResponsiveHeaderRenderer"]),
	);

	Map<String, dynamic> toMap() => {
		"musicCarouselShelfRenderer": musicCarouselShelfRenderer?.toMap(),
		"musicTastebuilderShelfRenderer": musicTastebuilderShelfRenderer?.toMap(),
		"musicResponsiveHeaderRenderer": musicResponsiveHeaderRenderer?.toMap(),
	};
}

class MusicCarouselShelfRenderer {
	MusicCarouselShelfRendererHeader? header;
	List<MusicCarouselShelfRendererContent>? contents;
	String? trackingParams;
	String? itemSize;
	String? numItemsPerColumn;

	MusicCarouselShelfRenderer({
		this.header,
		this.contents,
		this.trackingParams,
		this.itemSize,
		this.numItemsPerColumn,
	});

	factory MusicCarouselShelfRenderer.fromJson(String str) => MusicCarouselShelfRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory MusicCarouselShelfRenderer.fromMap(Map<String, dynamic> json) => MusicCarouselShelfRenderer(
		header: json["header"] == null ? null : MusicCarouselShelfRendererHeader.fromMap(json["header"]),
		contents: json["contents"] == null ? [] : List<MusicCarouselShelfRendererContent>.from(json["contents"]!.map((x) => MusicCarouselShelfRendererContent.fromMap(x))),
		trackingParams: json["trackingParams"],
		itemSize: json["itemSize"],
		numItemsPerColumn: json["numItemsPerColumn"],
	);

	Map<String, dynamic> toMap() => {
		"header": header?.toMap(),
		"contents": contents == null ? [] : List<dynamic>.from(contents!.map((x) => x.toMap())),
		"trackingParams": trackingParams,
		"itemSize": itemSize,
		"numItemsPerColumn": numItemsPerColumn,
	};
}

class MusicCarouselShelfRendererContent {
	MusicResponsiveListItemRenderer? musicResponsiveListItemRenderer;
	MusicTwoRowItemRenderer? musicTwoRowItemRenderer;

	MusicCarouselShelfRendererContent({
		this.musicResponsiveListItemRenderer,
		this.musicTwoRowItemRenderer,
	});

	factory MusicCarouselShelfRendererContent.fromJson(String str) => MusicCarouselShelfRendererContent.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory MusicCarouselShelfRendererContent.fromMap(Map<String, dynamic> json) => MusicCarouselShelfRendererContent(
		musicResponsiveListItemRenderer: json["musicResponsiveListItemRenderer"] == null ? null : MusicResponsiveListItemRenderer.fromMap(json["musicResponsiveListItemRenderer"]),
		musicTwoRowItemRenderer: json["musicTwoRowItemRenderer"] == null ? null : MusicTwoRowItemRenderer.fromMap(json["musicTwoRowItemRenderer"]),
	);

	Map<String, dynamic> toMap() => {
		"musicResponsiveListItemRenderer": musicResponsiveListItemRenderer?.toMap(),
		"musicTwoRowItemRenderer": musicTwoRowItemRenderer?.toMap(),
	};
}

class MusicResponsiveListItemRenderer {
	String? trackingParams;
	ThumbnailClass? thumbnail;
	Overlay? overlay;
	List<FlexColumn>? flexColumns;
	List<FixedColumn>? fixedColumns;
	MusicResponsiveListItemRendererMenu? menu;
	PlaylistItemData? playlistItemData;
	String? flexColumnDisplayStyle;
	String? itemHeight;

	MusicResponsiveListItemRenderer({
		this.trackingParams,
		this.thumbnail,
		this.overlay,
		this.flexColumns,
		this.fixedColumns,
		this.menu,
		this.playlistItemData,
		this.flexColumnDisplayStyle,
		this.itemHeight,
	});

	factory MusicResponsiveListItemRenderer.fromJson(String str) => MusicResponsiveListItemRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory MusicResponsiveListItemRenderer.fromMap(Map<String, dynamic> json) => MusicResponsiveListItemRenderer(
		trackingParams: json["trackingParams"],
		thumbnail: json["thumbnail"] == null ? null : ThumbnailClass.fromMap(json["thumbnail"]),
		overlay: json["overlay"] == null ? null : Overlay.fromMap(json["overlay"]),
		flexColumns: json["flexColumns"] == null ? [] : List<FlexColumn>.from(json["flexColumns"]!.map((x) => FlexColumn.fromMap(x))),
		fixedColumns: json["fixedColumns"] == null ? [] : List<FixedColumn>.from(json["fixedColumns"]!.map((x) => FixedColumn.fromMap(x))),
		menu: json["menu"] == null ? null : MusicResponsiveListItemRendererMenu.fromMap(json["menu"]),
		playlistItemData: json["playlistItemData"] == null ? null : PlaylistItemData.fromMap(json["playlistItemData"]),
		flexColumnDisplayStyle: json["flexColumnDisplayStyle"],
		itemHeight: json["itemHeight"],
	);

	Map<String, dynamic> toMap() => {
		"trackingParams": trackingParams,
		"thumbnail": thumbnail?.toMap(),
		"overlay": overlay?.toMap(),
		"flexColumns": flexColumns == null ? [] : List<dynamic>.from(flexColumns!.map((x) => x.toMap())),
		"fixedColumns": fixedColumns == null ? [] : List<dynamic>.from(fixedColumns!.map((x) => x.toMap())),
		"menu": menu?.toMap(),
		"playlistItemData": playlistItemData?.toMap(),
		"flexColumnDisplayStyle": flexColumnDisplayStyle,
		"itemHeight": itemHeight,
	};
}

class FlexColumn {
	MusicResponsiveListItemFlexColumnRenderer? musicResponsiveListItemFlexColumnRenderer;

	FlexColumn({
		this.musicResponsiveListItemFlexColumnRenderer,
	});

	factory FlexColumn.fromJson(String str) => FlexColumn.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory FlexColumn.fromMap(Map<String, dynamic> json) => FlexColumn(
		musicResponsiveListItemFlexColumnRenderer: json["musicResponsiveListItemFlexColumnRenderer"] == null ? null : MusicResponsiveListItemFlexColumnRenderer.fromMap(json["musicResponsiveListItemFlexColumnRenderer"]),
	);

	Map<String, dynamic> toMap() => {
		"musicResponsiveListItemFlexColumnRenderer": musicResponsiveListItemFlexColumnRenderer?.toMap(),
	};
}

class MusicResponsiveListItemFlexColumnRenderer {
	Text? text;
	String? displayPriority;

	MusicResponsiveListItemFlexColumnRenderer({
		this.text,
		this.displayPriority,
	});

	factory MusicResponsiveListItemFlexColumnRenderer.fromJson(String str) => MusicResponsiveListItemFlexColumnRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory MusicResponsiveListItemFlexColumnRenderer.fromMap(Map<String, dynamic> json) => MusicResponsiveListItemFlexColumnRenderer(
		text: json["text"] == null ? null : Text.fromMap(json["text"]),
		displayPriority: json["displayPriority"],
	);

	Map<String, dynamic> toMap() => {
		"text": text?.toMap(),
		"displayPriority": displayPriority,
	};
}

class Text {
	List<PurpleRun>? runs;

	Text({
		this.runs,
	});

	factory Text.fromJson(String str) => Text.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory Text.fromMap(Map<String, dynamic> json) => Text(
		runs: json["runs"] == null ? [] : List<PurpleRun>.from(json["runs"]!.map((x) => PurpleRun.fromMap(x))),
	);

	Map<String, dynamic> toMap() => {
		"runs": runs == null ? [] : List<dynamic>.from(runs!.map((x) => x.toMap())),
	};
}

class PurpleRun {
	String? text;
	PurpleNavigationEndpoint? navigationEndpoint;

	PurpleRun({
		this.text,
		this.navigationEndpoint,
	});

	factory PurpleRun.fromJson(String str) => PurpleRun.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory PurpleRun.fromMap(Map<String, dynamic> json) => PurpleRun(
		text: json["text"],
		navigationEndpoint: json["navigationEndpoint"] == null ? null : PurpleNavigationEndpoint.fromMap(json["navigationEndpoint"]),
	);

	Map<String, dynamic> toMap() => {
		"text": text,
		"navigationEndpoint": navigationEndpoint?.toMap(),
	};
}

class PurpleNavigationEndpoint {
	String? clickTrackingParams;
	NavigationEndpointWatchEndpoint? watchEndpoint;
	PurpleBrowseEndpoint? browseEndpoint;

	PurpleNavigationEndpoint({
		this.clickTrackingParams,
		this.watchEndpoint,
		this.browseEndpoint,
	});

	factory PurpleNavigationEndpoint.fromJson(String str) => PurpleNavigationEndpoint.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory PurpleNavigationEndpoint.fromMap(Map<String, dynamic> json) => PurpleNavigationEndpoint(
		clickTrackingParams: json["clickTrackingParams"],
		watchEndpoint: json["watchEndpoint"] == null ? null : NavigationEndpointWatchEndpoint.fromMap(json["watchEndpoint"]),
		browseEndpoint: json["browseEndpoint"] == null ? null : PurpleBrowseEndpoint.fromMap(json["browseEndpoint"]),
	);

	Map<String, dynamic> toMap() => {
		"clickTrackingParams": clickTrackingParams,
		"watchEndpoint": watchEndpoint?.toMap(),
		"browseEndpoint": browseEndpoint?.toMap(),
	};
}

class PurpleBrowseEndpoint {
	String? browseId;
	String? params;
	BrowseEndpointContextSupportedConfigs? browseEndpointContextSupportedConfigs;

	PurpleBrowseEndpoint({
		this.browseId,
		this.params,
		this.browseEndpointContextSupportedConfigs,
	});

	factory PurpleBrowseEndpoint.fromJson(String str) => PurpleBrowseEndpoint.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory PurpleBrowseEndpoint.fromMap(Map<String, dynamic> json) => PurpleBrowseEndpoint(
		browseId: json["browseId"],
		params: json["params"],
		browseEndpointContextSupportedConfigs: json["browseEndpointContextSupportedConfigs"] == null ? null : BrowseEndpointContextSupportedConfigs.fromMap(json["browseEndpointContextSupportedConfigs"]),
	);

	Map<String, dynamic> toMap() => {
		"browseId": browseId,
		"params": params,
		"browseEndpointContextSupportedConfigs": browseEndpointContextSupportedConfigs?.toMap(),
	};
}

class BrowseEndpointContextSupportedConfigs {
	BrowseEndpointContextMusicConfig? browseEndpointContextMusicConfig;

	BrowseEndpointContextSupportedConfigs({
		this.browseEndpointContextMusicConfig,
	});

	factory BrowseEndpointContextSupportedConfigs.fromJson(String str) => BrowseEndpointContextSupportedConfigs.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory BrowseEndpointContextSupportedConfigs.fromMap(Map<String, dynamic> json) => BrowseEndpointContextSupportedConfigs(
		browseEndpointContextMusicConfig: json["browseEndpointContextMusicConfig"] == null ? null : BrowseEndpointContextMusicConfig.fromMap(json["browseEndpointContextMusicConfig"]),
	);

	Map<String, dynamic> toMap() => {
		"browseEndpointContextMusicConfig": browseEndpointContextMusicConfig?.toMap(),
	};
}

class BrowseEndpointContextMusicConfig {
	String? pageType;

	BrowseEndpointContextMusicConfig({
		this.pageType,
	});

	factory BrowseEndpointContextMusicConfig.fromJson(String str) => BrowseEndpointContextMusicConfig.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory BrowseEndpointContextMusicConfig.fromMap(Map<String, dynamic> json) => BrowseEndpointContextMusicConfig(
		pageType: json["pageType"],
	);

	Map<String, dynamic> toMap() => {
		"pageType": pageType,
	};
}

class NavigationEndpointWatchEndpoint {
	String? videoId;
	String? playlistId;
	String? params;
	LoggingContext? loggingContext;
	WatchEndpointMusicSupportedConfigs? watchEndpointMusicSupportedConfigs;

	NavigationEndpointWatchEndpoint({
		this.videoId,
		this.playlistId,
		this.params,
		this.loggingContext,
		this.watchEndpointMusicSupportedConfigs,
	});

	factory NavigationEndpointWatchEndpoint.fromJson(String str) => NavigationEndpointWatchEndpoint.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory NavigationEndpointWatchEndpoint.fromMap(Map<String, dynamic> json) => NavigationEndpointWatchEndpoint(
		videoId: json["videoId"],
		playlistId: json["playlistId"],
		params: json["params"],
		loggingContext: json["loggingContext"] == null ? null : LoggingContext.fromMap(json["loggingContext"]),
		watchEndpointMusicSupportedConfigs: json["watchEndpointMusicSupportedConfigs"] == null ? null : WatchEndpointMusicSupportedConfigs.fromMap(json["watchEndpointMusicSupportedConfigs"]),
	);

	Map<String, dynamic> toMap() => {
		"videoId": videoId,
		"playlistId": playlistId,
		"params": params,
		"loggingContext": loggingContext?.toMap(),
		"watchEndpointMusicSupportedConfigs": watchEndpointMusicSupportedConfigs?.toMap(),
	};
}

class LoggingContext {
	VssLoggingContext? vssLoggingContext;

	LoggingContext({
		this.vssLoggingContext,
	});

	factory LoggingContext.fromJson(String str) => LoggingContext.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory LoggingContext.fromMap(Map<String, dynamic> json) => LoggingContext(
		vssLoggingContext: json["vssLoggingContext"] == null ? null : VssLoggingContext.fromMap(json["vssLoggingContext"]),
	);

	Map<String, dynamic> toMap() => {
		"vssLoggingContext": vssLoggingContext?.toMap(),
	};
}

class VssLoggingContext {
	String? serializedContextData;

	VssLoggingContext({
		this.serializedContextData,
	});

	factory VssLoggingContext.fromJson(String str) => VssLoggingContext.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory VssLoggingContext.fromMap(Map<String, dynamic> json) => VssLoggingContext(
		serializedContextData: json["serializedContextData"],
	);

	Map<String, dynamic> toMap() => {
		"serializedContextData": serializedContextData,
	};
}

class WatchEndpointMusicSupportedConfigs {
	WatchEndpointMusicConfig? watchEndpointMusicConfig;

	WatchEndpointMusicSupportedConfigs({
		this.watchEndpointMusicConfig,
	});

	factory WatchEndpointMusicSupportedConfigs.fromJson(String str) => WatchEndpointMusicSupportedConfigs.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory WatchEndpointMusicSupportedConfigs.fromMap(Map<String, dynamic> json) => WatchEndpointMusicSupportedConfigs(
		watchEndpointMusicConfig: json["watchEndpointMusicConfig"] == null ? null : WatchEndpointMusicConfig.fromMap(json["watchEndpointMusicConfig"]),
	);

	Map<String, dynamic> toMap() => {
		"watchEndpointMusicConfig": watchEndpointMusicConfig?.toMap(),
	};
}

class WatchEndpointMusicConfig {
	String? musicVideoType;

	WatchEndpointMusicConfig({
		this.musicVideoType,
	});

	factory WatchEndpointMusicConfig.fromJson(String str) => WatchEndpointMusicConfig.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory WatchEndpointMusicConfig.fromMap(Map<String, dynamic> json) => WatchEndpointMusicConfig(
		musicVideoType: json["musicVideoType"],
	);

	Map<String, dynamic> toMap() => {
		"musicVideoType": musicVideoType,
	};
}

class MusicResponsiveListItemRendererMenu {
	PurpleMenuRenderer? menuRenderer;

	MusicResponsiveListItemRendererMenu({
		this.menuRenderer,
	});

	factory MusicResponsiveListItemRendererMenu.fromJson(String str) => MusicResponsiveListItemRendererMenu.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory MusicResponsiveListItemRendererMenu.fromMap(Map<String, dynamic> json) => MusicResponsiveListItemRendererMenu(
		menuRenderer: json["menuRenderer"] == null ? null : PurpleMenuRenderer.fromMap(json["menuRenderer"]),
	);

	Map<String, dynamic> toMap() => {
		"menuRenderer": menuRenderer?.toMap(),
	};
}

class PurpleMenuRenderer {
	List<PurpleItem>? items;
	String? trackingParams;
	List<TopLevelButton>? topLevelButtons;
	Accessibility? accessibility;

	PurpleMenuRenderer({
		this.items,
		this.trackingParams,
		this.topLevelButtons,
		this.accessibility,
	});

	factory PurpleMenuRenderer.fromJson(String str) => PurpleMenuRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory PurpleMenuRenderer.fromMap(Map<String, dynamic> json) => PurpleMenuRenderer(
		items: json["items"] == null ? [] : List<PurpleItem>.from(json["items"]!.map((x) => PurpleItem.fromMap(x))),
		trackingParams: json["trackingParams"],
		topLevelButtons: json["topLevelButtons"] == null ? [] : List<TopLevelButton>.from(json["topLevelButtons"]!.map((x) => TopLevelButton.fromMap(x))),
		accessibility: json["accessibility"] == null ? null : Accessibility.fromMap(json["accessibility"]),
	);

	Map<String, dynamic> toMap() => {
		"items": items == null ? [] : List<dynamic>.from(items!.map((x) => x.toMap())),
		"trackingParams": trackingParams,
		"topLevelButtons": topLevelButtons == null ? [] : List<dynamic>.from(topLevelButtons!.map((x) => x.toMap())),
		"accessibility": accessibility?.toMap(),
	};
}

class Accessibility {
	AccessibilityData? accessibilityData;

	Accessibility({
		this.accessibilityData,
	});

	factory Accessibility.fromJson(String str) => Accessibility.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory Accessibility.fromMap(Map<String, dynamic> json) => Accessibility(
		accessibilityData: json["accessibilityData"] == null ? null : AccessibilityData.fromMap(json["accessibilityData"]),
	);

	Map<String, dynamic> toMap() => {
		"accessibilityData": accessibilityData?.toMap(),
	};
}

class AccessibilityData {
	String? label;

	AccessibilityData({
		this.label,
	});

	factory AccessibilityData.fromJson(String str) => AccessibilityData.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory AccessibilityData.fromMap(Map<String, dynamic> json) => AccessibilityData(
		label: json["label"],
	);

	Map<String, dynamic> toMap() => {
		"label": label,
	};
}

class PurpleItem {
	MenuItemRenderer? menuNavigationItemRenderer;
	MenuItemRenderer? menuServiceItemRenderer;
	PurpleToggleMenuServiceItemRenderer? toggleMenuServiceItemRenderer;

	PurpleItem({
		this.menuNavigationItemRenderer,
		this.menuServiceItemRenderer,
		this.toggleMenuServiceItemRenderer,
	});

	factory PurpleItem.fromJson(String str) => PurpleItem.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory PurpleItem.fromMap(Map<String, dynamic> json) => PurpleItem(
		menuNavigationItemRenderer: json["menuNavigationItemRenderer"] == null ? null : MenuItemRenderer.fromMap(json["menuNavigationItemRenderer"]),
		menuServiceItemRenderer: json["menuServiceItemRenderer"] == null ? null : MenuItemRenderer.fromMap(json["menuServiceItemRenderer"]),
		toggleMenuServiceItemRenderer: json["toggleMenuServiceItemRenderer"] == null ? null : PurpleToggleMenuServiceItemRenderer.fromMap(json["toggleMenuServiceItemRenderer"]),
	);

	Map<String, dynamic> toMap() => {
		"menuNavigationItemRenderer": menuNavigationItemRenderer?.toMap(),
		"menuServiceItemRenderer": menuServiceItemRenderer?.toMap(),
		"toggleMenuServiceItemRenderer": toggleMenuServiceItemRenderer?.toMap(),
	};
}

class MenuItemRenderer {
	PrimaryText? text;
	Icon? icon;
	MenuNavigationItemRendererNavigationEndpoint? navigationEndpoint;
	String? trackingParams;
	ServiceEndpoint? serviceEndpoint;

	MenuItemRenderer({
		this.text,
		this.icon,
		this.navigationEndpoint,
		this.trackingParams,
		this.serviceEndpoint,
	});

	factory MenuItemRenderer.fromJson(String str) => MenuItemRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory MenuItemRenderer.fromMap(Map<String, dynamic> json) => MenuItemRenderer(
		text: json["text"] == null ? null : PrimaryText.fromMap(json["text"]),
		icon: json["icon"] == null ? null : Icon.fromMap(json["icon"]),
		navigationEndpoint: json["navigationEndpoint"] == null ? null : MenuNavigationItemRendererNavigationEndpoint.fromMap(json["navigationEndpoint"]),
		trackingParams: json["trackingParams"],
		serviceEndpoint: json["serviceEndpoint"] == null ? null : ServiceEndpoint.fromMap(json["serviceEndpoint"]),
	);

	Map<String, dynamic> toMap() => {
		"text": text?.toMap(),
		"icon": icon?.toMap(),
		"navigationEndpoint": navigationEndpoint?.toMap(),
		"trackingParams": trackingParams,
		"serviceEndpoint": serviceEndpoint?.toMap(),
	};
}

class Icon {
	String? iconType;

	Icon({
		this.iconType,
	});

	factory Icon.fromJson(String str) => Icon.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory Icon.fromMap(Map<String, dynamic> json) => Icon(
		iconType: json["iconType"],
	);

	Map<String, dynamic> toMap() => {
		"iconType": iconType,
	};
}

class MenuNavigationItemRendererNavigationEndpoint {
	String? clickTrackingParams;
	NavigationEndpointWatchEndpoint? watchEndpoint;
	ModalEndpoint? modalEndpoint;
	ShareEntityEndpoint? shareEntityEndpoint;
	PurpleBrowseEndpoint? browseEndpoint;
	WatchPlaylistEndpoint? watchPlaylistEndpoint;

	MenuNavigationItemRendererNavigationEndpoint({
		this.clickTrackingParams,
		this.watchEndpoint,
		this.modalEndpoint,
		this.shareEntityEndpoint,
		this.browseEndpoint,
		this.watchPlaylistEndpoint,
	});

	factory MenuNavigationItemRendererNavigationEndpoint.fromJson(String str) => MenuNavigationItemRendererNavigationEndpoint.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory MenuNavigationItemRendererNavigationEndpoint.fromMap(Map<String, dynamic> json) => MenuNavigationItemRendererNavigationEndpoint(
		clickTrackingParams: json["clickTrackingParams"],
		watchEndpoint: json["watchEndpoint"] == null ? null : NavigationEndpointWatchEndpoint.fromMap(json["watchEndpoint"]),
		modalEndpoint: json["modalEndpoint"] == null ? null : ModalEndpoint.fromMap(json["modalEndpoint"]),
		shareEntityEndpoint: json["shareEntityEndpoint"] == null ? null : ShareEntityEndpoint.fromMap(json["shareEntityEndpoint"]),
		browseEndpoint: json["browseEndpoint"] == null ? null : PurpleBrowseEndpoint.fromMap(json["browseEndpoint"]),
		watchPlaylistEndpoint: json["watchPlaylistEndpoint"] == null ? null : WatchPlaylistEndpoint.fromMap(json["watchPlaylistEndpoint"]),
	);

	Map<String, dynamic> toMap() => {
		"clickTrackingParams": clickTrackingParams,
		"watchEndpoint": watchEndpoint?.toMap(),
		"modalEndpoint": modalEndpoint?.toMap(),
		"shareEntityEndpoint": shareEntityEndpoint?.toMap(),
		"browseEndpoint": browseEndpoint?.toMap(),
		"watchPlaylistEndpoint": watchPlaylistEndpoint?.toMap(),
	};
}

class ModalEndpoint {
	Modal? modal;

	ModalEndpoint({
		this.modal,
	});

	factory ModalEndpoint.fromJson(String str) => ModalEndpoint.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory ModalEndpoint.fromMap(Map<String, dynamic> json) => ModalEndpoint(
		modal: json["modal"] == null ? null : Modal.fromMap(json["modal"]),
	);

	Map<String, dynamic> toMap() => {
		"modal": modal?.toMap(),
	};
}

class Modal {
	ModalWithTitleAndButtonRenderer? modalWithTitleAndButtonRenderer;

	Modal({
		this.modalWithTitleAndButtonRenderer,
	});

	factory Modal.fromJson(String str) => Modal.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory Modal.fromMap(Map<String, dynamic> json) => Modal(
		modalWithTitleAndButtonRenderer: json["modalWithTitleAndButtonRenderer"] == null ? null : ModalWithTitleAndButtonRenderer.fromMap(json["modalWithTitleAndButtonRenderer"]),
	);

	Map<String, dynamic> toMap() => {
		"modalWithTitleAndButtonRenderer": modalWithTitleAndButtonRenderer?.toMap(),
	};
}

class ModalWithTitleAndButtonRenderer {
	PrimaryText? title;
	PrimaryText? content;
	Button? button;

	ModalWithTitleAndButtonRenderer({
		this.title,
		this.content,
		this.button,
	});

	factory ModalWithTitleAndButtonRenderer.fromJson(String str) => ModalWithTitleAndButtonRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory ModalWithTitleAndButtonRenderer.fromMap(Map<String, dynamic> json) => ModalWithTitleAndButtonRenderer(
		title: json["title"] == null ? null : PrimaryText.fromMap(json["title"]),
		content: json["content"] == null ? null : PrimaryText.fromMap(json["content"]),
		button: json["button"] == null ? null : Button.fromMap(json["button"]),
	);

	Map<String, dynamic> toMap() => {
		"title": title?.toMap(),
		"content": content?.toMap(),
		"button": button?.toMap(),
	};
}

class Button {
	ButtonButtonRenderer? buttonRenderer;

	Button({
		this.buttonRenderer,
	});

	factory Button.fromJson(String str) => Button.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory Button.fromMap(Map<String, dynamic> json) => Button(
		buttonRenderer: json["buttonRenderer"] == null ? null : ButtonButtonRenderer.fromMap(json["buttonRenderer"]),
	);

	Map<String, dynamic> toMap() => {
		"buttonRenderer": buttonRenderer?.toMap(),
	};
}

class ButtonButtonRenderer {
	String? style;
	bool? isDisabled;
	PrimaryText? text;
	FluffyNavigationEndpoint? navigationEndpoint;
	String? trackingParams;

	ButtonButtonRenderer({
		this.style,
		this.isDisabled,
		this.text,
		this.navigationEndpoint,
		this.trackingParams,
	});

	factory ButtonButtonRenderer.fromJson(String str) => ButtonButtonRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory ButtonButtonRenderer.fromMap(Map<String, dynamic> json) => ButtonButtonRenderer(
		style: json["style"],
		isDisabled: json["isDisabled"],
		text: json["text"] == null ? null : PrimaryText.fromMap(json["text"]),
		navigationEndpoint: json["navigationEndpoint"] == null ? null : FluffyNavigationEndpoint.fromMap(json["navigationEndpoint"]),
		trackingParams: json["trackingParams"],
	);

	Map<String, dynamic> toMap() => {
		"style": style,
		"isDisabled": isDisabled,
		"text": text?.toMap(),
		"navigationEndpoint": navigationEndpoint?.toMap(),
		"trackingParams": trackingParams,
	};
}

class FluffyNavigationEndpoint {
	String? clickTrackingParams;
	SignInEndpoint? signInEndpoint;

	FluffyNavigationEndpoint({
		this.clickTrackingParams,
		this.signInEndpoint,
	});

	factory FluffyNavigationEndpoint.fromJson(String str) => FluffyNavigationEndpoint.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory FluffyNavigationEndpoint.fromMap(Map<String, dynamic> json) => FluffyNavigationEndpoint(
		clickTrackingParams: json["clickTrackingParams"],
		signInEndpoint: json["signInEndpoint"] == null ? null : SignInEndpoint.fromMap(json["signInEndpoint"]),
	);

	Map<String, dynamic> toMap() => {
		"clickTrackingParams": clickTrackingParams,
		"signInEndpoint": signInEndpoint?.toMap(),
	};
}

class SignInEndpoint {
	bool? hack;

	SignInEndpoint({
		this.hack,
	});

	factory SignInEndpoint.fromJson(String str) => SignInEndpoint.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory SignInEndpoint.fromMap(Map<String, dynamic> json) => SignInEndpoint(
		hack: json["hack"],
	);

	Map<String, dynamic> toMap() => {
		"hack": hack,
	};
}

class PrimaryText {
	List<PrimaryTextRun>? runs;

	PrimaryText({
		this.runs,
	});

	factory PrimaryText.fromJson(String str) => PrimaryText.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory PrimaryText.fromMap(Map<String, dynamic> json) => PrimaryText(
		runs: json["runs"] == null ? [] : List<PrimaryTextRun>.from(json["runs"]!.map((x) => PrimaryTextRun.fromMap(x))),
	);

	Map<String, dynamic> toMap() => {
		"runs": runs == null ? [] : List<dynamic>.from(runs!.map((x) => x.toMap())),
	};
}

class PrimaryTextRun {
	String? text;

	PrimaryTextRun({
		this.text,
	});

	factory PrimaryTextRun.fromJson(String str) => PrimaryTextRun.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory PrimaryTextRun.fromMap(Map<String, dynamic> json) => PrimaryTextRun(
		text: json["text"],
	);

	Map<String, dynamic> toMap() => {
		"text": text,
	};
}

class ShareEntityEndpoint {
	String? serializedShareEntity;
	String? sharePanelType;

	ShareEntityEndpoint({
		this.serializedShareEntity,
		this.sharePanelType,
	});

	factory ShareEntityEndpoint.fromJson(String str) => ShareEntityEndpoint.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory ShareEntityEndpoint.fromMap(Map<String, dynamic> json) => ShareEntityEndpoint(
		serializedShareEntity: json["serializedShareEntity"],
		sharePanelType: json["sharePanelType"],
	);

	Map<String, dynamic> toMap() => {
		"serializedShareEntity": serializedShareEntity,
		"sharePanelType": sharePanelType,
	};
}

class WatchPlaylistEndpoint {
	String? playlistId;
	String? params;

	WatchPlaylistEndpoint({
		this.playlistId,
		this.params,
	});

	factory WatchPlaylistEndpoint.fromJson(String str) => WatchPlaylistEndpoint.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory WatchPlaylistEndpoint.fromMap(Map<String, dynamic> json) => WatchPlaylistEndpoint(
		playlistId: json["playlistId"],
		params: json["params"],
	);

	Map<String, dynamic> toMap() => {
		"playlistId": playlistId,
		"params": params,
	};
}

class ServiceEndpoint {
	String? clickTrackingParams;
	QueueAddEndpoint? queueAddEndpoint;

	ServiceEndpoint({
		this.clickTrackingParams,
		this.queueAddEndpoint,
	});

	factory ServiceEndpoint.fromJson(String str) => ServiceEndpoint.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory ServiceEndpoint.fromMap(Map<String, dynamic> json) => ServiceEndpoint(
		clickTrackingParams: json["clickTrackingParams"],
		queueAddEndpoint: json["queueAddEndpoint"] == null ? null : QueueAddEndpoint.fromMap(json["queueAddEndpoint"]),
	);

	Map<String, dynamic> toMap() => {
		"clickTrackingParams": clickTrackingParams,
		"queueAddEndpoint": queueAddEndpoint?.toMap(),
	};
}

class QueueAddEndpoint {
	QueueTarget? queueTarget;
	String? queueInsertPosition;
	List<Command>? commands;

	QueueAddEndpoint({
		this.queueTarget,
		this.queueInsertPosition,
		this.commands,
	});

	factory QueueAddEndpoint.fromJson(String str) => QueueAddEndpoint.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory QueueAddEndpoint.fromMap(Map<String, dynamic> json) => QueueAddEndpoint(
		queueTarget: json["queueTarget"] == null ? null : QueueTarget.fromMap(json["queueTarget"]),
		queueInsertPosition: json["queueInsertPosition"],
		commands: json["commands"] == null ? [] : List<Command>.from(json["commands"]!.map((x) => Command.fromMap(x))),
	);

	Map<String, dynamic> toMap() => {
		"queueTarget": queueTarget?.toMap(),
		"queueInsertPosition": queueInsertPosition,
		"commands": commands == null ? [] : List<dynamic>.from(commands!.map((x) => x.toMap())),
	};
}

class Command {
	String? clickTrackingParams;
	AddToToastAction? addToToastAction;

	Command({
		this.clickTrackingParams,
		this.addToToastAction,
	});

	factory Command.fromJson(String str) => Command.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory Command.fromMap(Map<String, dynamic> json) => Command(
		clickTrackingParams: json["clickTrackingParams"],
		addToToastAction: json["addToToastAction"] == null ? null : AddToToastAction.fromMap(json["addToToastAction"]),
	);

	Map<String, dynamic> toMap() => {
		"clickTrackingParams": clickTrackingParams,
		"addToToastAction": addToToastAction?.toMap(),
	};
}

class AddToToastAction {
	AddToToastActionItem? item;

	AddToToastAction({
		this.item,
	});

	factory AddToToastAction.fromJson(String str) => AddToToastAction.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory AddToToastAction.fromMap(Map<String, dynamic> json) => AddToToastAction(
		item: json["item"] == null ? null : AddToToastActionItem.fromMap(json["item"]),
	);

	Map<String, dynamic> toMap() => {
		"item": item?.toMap(),
	};
}

class AddToToastActionItem {
	NotificationTextRenderer? notificationTextRenderer;

	AddToToastActionItem({
		this.notificationTextRenderer,
	});

	factory AddToToastActionItem.fromJson(String str) => AddToToastActionItem.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory AddToToastActionItem.fromMap(Map<String, dynamic> json) => AddToToastActionItem(
		notificationTextRenderer: json["notificationTextRenderer"] == null ? null : NotificationTextRenderer.fromMap(json["notificationTextRenderer"]),
	);

	Map<String, dynamic> toMap() => {
		"notificationTextRenderer": notificationTextRenderer?.toMap(),
	};
}

class NotificationTextRenderer {
	PrimaryText? successResponseText;
	String? trackingParams;

	NotificationTextRenderer({
		this.successResponseText,
		this.trackingParams,
	});

	factory NotificationTextRenderer.fromJson(String str) => NotificationTextRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory NotificationTextRenderer.fromMap(Map<String, dynamic> json) => NotificationTextRenderer(
		successResponseText: json["successResponseText"] == null ? null : PrimaryText.fromMap(json["successResponseText"]),
		trackingParams: json["trackingParams"],
	);

	Map<String, dynamic> toMap() => {
		"successResponseText": successResponseText?.toMap(),
		"trackingParams": trackingParams,
	};
}

class QueueTarget {
	String? videoId;
	OnEmptyQueue? onEmptyQueue;
	String? playlistId;

	QueueTarget({
		this.videoId,
		this.onEmptyQueue,
		this.playlistId,
	});

	factory QueueTarget.fromJson(String str) => QueueTarget.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory QueueTarget.fromMap(Map<String, dynamic> json) => QueueTarget(
		videoId: json["videoId"],
		onEmptyQueue: json["onEmptyQueue"] == null ? null : OnEmptyQueue.fromMap(json["onEmptyQueue"]),
		playlistId: json["playlistId"],
	);

	Map<String, dynamic> toMap() => {
		"videoId": videoId,
		"onEmptyQueue": onEmptyQueue?.toMap(),
		"playlistId": playlistId,
	};
}

class OnEmptyQueue {
	String? clickTrackingParams;
	OnEmptyQueueWatchEndpoint? watchEndpoint;

	OnEmptyQueue({
		this.clickTrackingParams,
		this.watchEndpoint,
	});

	factory OnEmptyQueue.fromJson(String str) => OnEmptyQueue.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory OnEmptyQueue.fromMap(Map<String, dynamic> json) => OnEmptyQueue(
		clickTrackingParams: json["clickTrackingParams"],
		watchEndpoint: json["watchEndpoint"] == null ? null : OnEmptyQueueWatchEndpoint.fromMap(json["watchEndpoint"]),
	);

	Map<String, dynamic> toMap() => {
		"clickTrackingParams": clickTrackingParams,
		"watchEndpoint": watchEndpoint?.toMap(),
	};
}

class OnEmptyQueueWatchEndpoint {
	String? videoId;
	String? playlistId;

	OnEmptyQueueWatchEndpoint({
		this.videoId,
		this.playlistId,
	});

	factory OnEmptyQueueWatchEndpoint.fromJson(String str) => OnEmptyQueueWatchEndpoint.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory OnEmptyQueueWatchEndpoint.fromMap(Map<String, dynamic> json) => OnEmptyQueueWatchEndpoint(
		videoId: json["videoId"],
		playlistId: json["playlistId"],
	);

	Map<String, dynamic> toMap() => {
		"videoId": videoId,
		"playlistId": playlistId,
	};
}

class PurpleToggleMenuServiceItemRenderer {
	PrimaryText? defaultText;
	Icon? defaultIcon;
	DefaultServiceEndpointClass? defaultServiceEndpoint;
	PrimaryText? toggledText;
	Icon? toggledIcon;
	PurpleToggledServiceEndpoint? toggledServiceEndpoint;
	String? trackingParams;

	PurpleToggleMenuServiceItemRenderer({
		this.defaultText,
		this.defaultIcon,
		this.defaultServiceEndpoint,
		this.toggledText,
		this.toggledIcon,
		this.toggledServiceEndpoint,
		this.trackingParams,
	});

	factory PurpleToggleMenuServiceItemRenderer.fromJson(String str) => PurpleToggleMenuServiceItemRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory PurpleToggleMenuServiceItemRenderer.fromMap(Map<String, dynamic> json) => PurpleToggleMenuServiceItemRenderer(
		defaultText: json["defaultText"] == null ? null : PrimaryText.fromMap(json["defaultText"]),
		defaultIcon: json["defaultIcon"] == null ? null : Icon.fromMap(json["defaultIcon"]),
		defaultServiceEndpoint: json["defaultServiceEndpoint"] == null ? null : DefaultServiceEndpointClass.fromMap(json["defaultServiceEndpoint"]),
		toggledText: json["toggledText"] == null ? null : PrimaryText.fromMap(json["toggledText"]),
		toggledIcon: json["toggledIcon"] == null ? null : Icon.fromMap(json["toggledIcon"]),
		toggledServiceEndpoint: json["toggledServiceEndpoint"] == null ? null : PurpleToggledServiceEndpoint.fromMap(json["toggledServiceEndpoint"]),
		trackingParams: json["trackingParams"],
	);

	Map<String, dynamic> toMap() => {
		"defaultText": defaultText?.toMap(),
		"defaultIcon": defaultIcon?.toMap(),
		"defaultServiceEndpoint": defaultServiceEndpoint?.toMap(),
		"toggledText": toggledText?.toMap(),
		"toggledIcon": toggledIcon?.toMap(),
		"toggledServiceEndpoint": toggledServiceEndpoint?.toMap(),
		"trackingParams": trackingParams,
	};
}

class DefaultServiceEndpointClass {
	String? clickTrackingParams;
	ModalEndpoint? modalEndpoint;

	DefaultServiceEndpointClass({
		this.clickTrackingParams,
		this.modalEndpoint,
	});

	factory DefaultServiceEndpointClass.fromJson(String str) => DefaultServiceEndpointClass.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory DefaultServiceEndpointClass.fromMap(Map<String, dynamic> json) => DefaultServiceEndpointClass(
		clickTrackingParams: json["clickTrackingParams"],
		modalEndpoint: json["modalEndpoint"] == null ? null : ModalEndpoint.fromMap(json["modalEndpoint"]),
	);

	Map<String, dynamic> toMap() => {
		"clickTrackingParams": clickTrackingParams,
		"modalEndpoint": modalEndpoint?.toMap(),
	};
}

class PurpleToggledServiceEndpoint {
	String? clickTrackingParams;
	FeedbackEndpoint? feedbackEndpoint;

	PurpleToggledServiceEndpoint({
		this.clickTrackingParams,
		this.feedbackEndpoint,
	});

	factory PurpleToggledServiceEndpoint.fromJson(String str) => PurpleToggledServiceEndpoint.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory PurpleToggledServiceEndpoint.fromMap(Map<String, dynamic> json) => PurpleToggledServiceEndpoint(
		clickTrackingParams: json["clickTrackingParams"],
		feedbackEndpoint: json["feedbackEndpoint"] == null ? null : FeedbackEndpoint.fromMap(json["feedbackEndpoint"]),
	);

	Map<String, dynamic> toMap() => {
		"clickTrackingParams": clickTrackingParams,
		"feedbackEndpoint": feedbackEndpoint?.toMap(),
	};
}

class FeedbackEndpoint {
	String? feedbackToken;

	FeedbackEndpoint({
		this.feedbackToken,
	});

	factory FeedbackEndpoint.fromJson(String str) => FeedbackEndpoint.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory FeedbackEndpoint.fromMap(Map<String, dynamic> json) => FeedbackEndpoint(
		feedbackToken: json["feedbackToken"],
	);

	Map<String, dynamic> toMap() => {
		"feedbackToken": feedbackToken,
	};
}

class TopLevelButton {
	LikeButtonRenderer? likeButtonRenderer;

	TopLevelButton({
		this.likeButtonRenderer,
	});

	factory TopLevelButton.fromJson(String str) => TopLevelButton.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory TopLevelButton.fromMap(Map<String, dynamic> json) => TopLevelButton(
		likeButtonRenderer: json["likeButtonRenderer"] == null ? null : LikeButtonRenderer.fromMap(json["likeButtonRenderer"]),
	);

	Map<String, dynamic> toMap() => {
		"likeButtonRenderer": likeButtonRenderer?.toMap(),
	};
}

class LikeButtonRenderer {
	PlaylistItemData? target;
	String? likeStatus;
	String? trackingParams;
	bool? likesAllowed;
	DefaultServiceEndpointClass? dislikeNavigationEndpoint;
	DefaultServiceEndpointClass? likeCommand;

	LikeButtonRenderer({
		this.target,
		this.likeStatus,
		this.trackingParams,
		this.likesAllowed,
		this.dislikeNavigationEndpoint,
		this.likeCommand,
	});

	factory LikeButtonRenderer.fromJson(String str) => LikeButtonRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory LikeButtonRenderer.fromMap(Map<String, dynamic> json) => LikeButtonRenderer(
		target: json["target"] == null ? null : PlaylistItemData.fromMap(json["target"]),
		likeStatus: json["likeStatus"],
		trackingParams: json["trackingParams"],
		likesAllowed: json["likesAllowed"],
		dislikeNavigationEndpoint: json["dislikeNavigationEndpoint"] == null ? null : DefaultServiceEndpointClass.fromMap(json["dislikeNavigationEndpoint"]),
		likeCommand: json["likeCommand"] == null ? null : DefaultServiceEndpointClass.fromMap(json["likeCommand"]),
	);

	Map<String, dynamic> toMap() => {
		"target": target?.toMap(),
		"likeStatus": likeStatus,
		"trackingParams": trackingParams,
		"likesAllowed": likesAllowed,
		"dislikeNavigationEndpoint": dislikeNavigationEndpoint?.toMap(),
		"likeCommand": likeCommand?.toMap(),
	};
}

class PlaylistItemData {
	String? videoId;

	PlaylistItemData({
		this.videoId,
	});

	factory PlaylistItemData.fromJson(String str) => PlaylistItemData.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory PlaylistItemData.fromMap(Map<String, dynamic> json) => PlaylistItemData(
		videoId: json["videoId"],
	);

	Map<String, dynamic> toMap() => {
		"videoId": videoId,
	};
}

class Overlay {
	OverlayMusicItemThumbnailOverlayRenderer? musicItemThumbnailOverlayRenderer;

	Overlay({
		this.musicItemThumbnailOverlayRenderer,
	});

	factory Overlay.fromJson(String str) => Overlay.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory Overlay.fromMap(Map<String, dynamic> json) => Overlay(
		musicItemThumbnailOverlayRenderer: json["musicItemThumbnailOverlayRenderer"] == null ? null : OverlayMusicItemThumbnailOverlayRenderer.fromMap(json["musicItemThumbnailOverlayRenderer"]),
	);

	Map<String, dynamic> toMap() => {
		"musicItemThumbnailOverlayRenderer": musicItemThumbnailOverlayRenderer?.toMap(),
	};
}

class OverlayMusicItemThumbnailOverlayRenderer {
	MusicItemThumbnailOverlayRendererBackground? background;
	PurpleContent? content;
	String? contentPosition;
	String? displayStyle;

	OverlayMusicItemThumbnailOverlayRenderer({
		this.background,
		this.content,
		this.contentPosition,
		this.displayStyle,
	});

	factory OverlayMusicItemThumbnailOverlayRenderer.fromJson(String str) => OverlayMusicItemThumbnailOverlayRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory OverlayMusicItemThumbnailOverlayRenderer.fromMap(Map<String, dynamic> json) => OverlayMusicItemThumbnailOverlayRenderer(
		background: json["background"] == null ? null : MusicItemThumbnailOverlayRendererBackground.fromMap(json["background"]),
		content: json["content"] == null ? null : PurpleContent.fromMap(json["content"]),
		contentPosition: json["contentPosition"],
		displayStyle: json["displayStyle"],
	);

	Map<String, dynamic> toMap() => {
		"background": background?.toMap(),
		"content": content?.toMap(),
		"contentPosition": contentPosition,
		"displayStyle": displayStyle,
	};
}

class MusicItemThumbnailOverlayRendererBackground {
	VerticalGradient? verticalGradient;

	MusicItemThumbnailOverlayRendererBackground({
		this.verticalGradient,
	});

	factory MusicItemThumbnailOverlayRendererBackground.fromJson(String str) => MusicItemThumbnailOverlayRendererBackground.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory MusicItemThumbnailOverlayRendererBackground.fromMap(Map<String, dynamic> json) => MusicItemThumbnailOverlayRendererBackground(
		verticalGradient: json["verticalGradient"] == null ? null : VerticalGradient.fromMap(json["verticalGradient"]),
	);

	Map<String, dynamic> toMap() => {
		"verticalGradient": verticalGradient?.toMap(),
	};
}

class VerticalGradient {
	List<String>? gradientLayerColors;

	VerticalGradient({
		this.gradientLayerColors,
	});

	factory VerticalGradient.fromJson(String str) => VerticalGradient.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory VerticalGradient.fromMap(Map<String, dynamic> json) => VerticalGradient(
		gradientLayerColors: json["gradientLayerColors"] == null ? [] : List<String>.from(json["gradientLayerColors"]!.map((x) => x)),
	);

	Map<String, dynamic> toMap() => {
		"gradientLayerColors": gradientLayerColors == null ? [] : List<dynamic>.from(gradientLayerColors!.map((x) => x)),
	};
}

class PurpleContent {
	PurpleMusicPlayButtonRenderer? musicPlayButtonRenderer;
	MusicShelfRenderer? musicShelfRenderer;
	MusicPlaylistShelfRenderer? musicPlaylistShelfRenderer;

	PurpleContent({
		this.musicPlayButtonRenderer,
		this.musicShelfRenderer,
		this.musicPlaylistShelfRenderer,
	});

	factory PurpleContent.fromJson(String str) => PurpleContent.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory PurpleContent.fromMap(Map<String, dynamic> json) => PurpleContent(
		musicPlayButtonRenderer: json["musicPlayButtonRenderer"] == null ? null : PurpleMusicPlayButtonRenderer.fromMap(json["musicPlayButtonRenderer"]),
		musicShelfRenderer: json["musicShelfRenderer"] == null ? null : MusicShelfRenderer.fromMap(json["musicShelfRenderer"]),
		musicPlaylistShelfRenderer: json["musicPlaylistShelfRenderer"] == null ? null : MusicPlaylistShelfRenderer.fromMap(json["musicPlaylistShelfRenderer"]),
	);

	Map<String, dynamic> toMap() => {
		"musicPlayButtonRenderer": musicPlayButtonRenderer?.toMap(),
		"musicShelfRenderer": musicShelfRenderer?.toMap(),
		"musicPlaylistShelfRenderer": musicPlaylistShelfRenderer?.toMap(),
	};
}

class PurpleMusicPlayButtonRenderer {
	PurplePlayNavigationEndpoint? playNavigationEndpoint;
	String? trackingParams;
	Icon? playIcon;
	Icon? pauseIcon;
	int? iconColor;
	int? backgroundColor;
	int? activeBackgroundColor;
	int? loadingIndicatorColor;
	Icon? playingIcon;
	int? iconLoadingColor;
	int? activeScaleFactor;
	String? buttonSize;
	String? rippleTarget;
	Accessibility? accessibilityPlayData;
	Accessibility? accessibilityPauseData;

	PurpleMusicPlayButtonRenderer({
		this.playNavigationEndpoint,
		this.trackingParams,
		this.playIcon,
		this.pauseIcon,
		this.iconColor,
		this.backgroundColor,
		this.activeBackgroundColor,
		this.loadingIndicatorColor,
		this.playingIcon,
		this.iconLoadingColor,
		this.activeScaleFactor,
		this.buttonSize,
		this.rippleTarget,
		this.accessibilityPlayData,
		this.accessibilityPauseData,
	});

	factory PurpleMusicPlayButtonRenderer.fromJson(String str) => PurpleMusicPlayButtonRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory PurpleMusicPlayButtonRenderer.fromMap(Map<String, dynamic> json) => PurpleMusicPlayButtonRenderer(
		playNavigationEndpoint: json["playNavigationEndpoint"] == null ? null : PurplePlayNavigationEndpoint.fromMap(json["playNavigationEndpoint"]),
		trackingParams: json["trackingParams"],
		playIcon: json["playIcon"] == null ? null : Icon.fromMap(json["playIcon"]),
		pauseIcon: json["pauseIcon"] == null ? null : Icon.fromMap(json["pauseIcon"]),
		iconColor: json["iconColor"],
		backgroundColor: json["backgroundColor"],
		activeBackgroundColor: json["activeBackgroundColor"],
		loadingIndicatorColor: json["loadingIndicatorColor"],
		playingIcon: json["playingIcon"] == null ? null : Icon.fromMap(json["playingIcon"]),
		iconLoadingColor: json["iconLoadingColor"],
		activeScaleFactor: json["activeScaleFactor"],
		buttonSize: json["buttonSize"],
		rippleTarget: json["rippleTarget"],
		accessibilityPlayData: json["accessibilityPlayData"] == null ? null : Accessibility.fromMap(json["accessibilityPlayData"]),
		accessibilityPauseData: json["accessibilityPauseData"] == null ? null : Accessibility.fromMap(json["accessibilityPauseData"]),
	);

	Map<String, dynamic> toMap() => {
		"playNavigationEndpoint": playNavigationEndpoint?.toMap(),
		"trackingParams": trackingParams,
		"playIcon": playIcon?.toMap(),
		"pauseIcon": pauseIcon?.toMap(),
		"iconColor": iconColor,
		"backgroundColor": backgroundColor,
		"activeBackgroundColor": activeBackgroundColor,
		"loadingIndicatorColor": loadingIndicatorColor,
		"playingIcon": playingIcon?.toMap(),
		"iconLoadingColor": iconLoadingColor,
		"activeScaleFactor": activeScaleFactor,
		"buttonSize": buttonSize,
		"rippleTarget": rippleTarget,
		"accessibilityPlayData": accessibilityPlayData?.toMap(),
		"accessibilityPauseData": accessibilityPauseData?.toMap(),
	};
}

class PurplePlayNavigationEndpoint {
	String? clickTrackingParams;
	NavigationEndpointWatchEndpoint? watchEndpoint;

	PurplePlayNavigationEndpoint({
		this.clickTrackingParams,
		this.watchEndpoint,
	});

	factory PurplePlayNavigationEndpoint.fromJson(String str) => PurplePlayNavigationEndpoint.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory PurplePlayNavigationEndpoint.fromMap(Map<String, dynamic> json) => PurplePlayNavigationEndpoint(
		clickTrackingParams: json["clickTrackingParams"],
		watchEndpoint: json["watchEndpoint"] == null ? null : NavigationEndpointWatchEndpoint.fromMap(json["watchEndpoint"]),
	);

	Map<String, dynamic> toMap() => {
		"clickTrackingParams": clickTrackingParams,
		"watchEndpoint": watchEndpoint?.toMap(),
	};
}

class MusicTwoRowItemRenderer {
	ThumbnailClass? thumbnailRenderer;
	String? aspectRatio;
	Title? title;
	Subtitle? subtitle;
	MusicTwoRowItemRendererNavigationEndpoint? navigationEndpoint;
	String? trackingParams;
	MusicTwoRowItemRendererMenu? menu;
	ThumbnailOverlay? thumbnailOverlay;

	MusicTwoRowItemRenderer({
		this.thumbnailRenderer,
		this.aspectRatio,
		this.title,
		this.subtitle,
		this.navigationEndpoint,
		this.trackingParams,
		this.menu,
		this.thumbnailOverlay,
	});

	factory MusicTwoRowItemRenderer.fromJson(String str) => MusicTwoRowItemRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory MusicTwoRowItemRenderer.fromMap(Map<String, dynamic> json) => MusicTwoRowItemRenderer(
		thumbnailRenderer: json["thumbnailRenderer"] == null ? null : ThumbnailClass.fromMap(json["thumbnailRenderer"]),
		aspectRatio: json["aspectRatio"],
		title: json["title"] == null ? null : Title.fromMap(json["title"]),
		subtitle: json["subtitle"] == null ? null : Subtitle.fromMap(json["subtitle"]),
		navigationEndpoint: json["navigationEndpoint"] == null ? null : MusicTwoRowItemRendererNavigationEndpoint.fromMap(json["navigationEndpoint"]),
		trackingParams: json["trackingParams"],
		menu: json["menu"] == null ? null : MusicTwoRowItemRendererMenu.fromMap(json["menu"]),
		thumbnailOverlay: json["thumbnailOverlay"] == null ? null : ThumbnailOverlay.fromMap(json["thumbnailOverlay"]),
	);

	Map<String, dynamic> toMap() => {
		"thumbnailRenderer": thumbnailRenderer?.toMap(),
		"aspectRatio": aspectRatio,
		"title": title?.toMap(),
		"subtitle": subtitle?.toMap(),
		"navigationEndpoint": navigationEndpoint?.toMap(),
		"trackingParams": trackingParams,
		"menu": menu?.toMap(),
		"thumbnailOverlay": thumbnailOverlay?.toMap(),
	};
}

class MusicTwoRowItemRendererMenu {
	FluffyMenuRenderer? menuRenderer;

	MusicTwoRowItemRendererMenu({
		this.menuRenderer,
	});

	factory MusicTwoRowItemRendererMenu.fromJson(String str) => MusicTwoRowItemRendererMenu.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory MusicTwoRowItemRendererMenu.fromMap(Map<String, dynamic> json) => MusicTwoRowItemRendererMenu(
		menuRenderer: json["menuRenderer"] == null ? null : FluffyMenuRenderer.fromMap(json["menuRenderer"]),
	);

	Map<String, dynamic> toMap() => {
		"menuRenderer": menuRenderer?.toMap(),
	};
}

class FluffyMenuRenderer {
	List<FluffyItem>? items;
	String? trackingParams;
	Accessibility? accessibility;

	FluffyMenuRenderer({
		this.items,
		this.trackingParams,
		this.accessibility,
	});

	factory FluffyMenuRenderer.fromJson(String str) => FluffyMenuRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory FluffyMenuRenderer.fromMap(Map<String, dynamic> json) => FluffyMenuRenderer(
		items: json["items"] == null ? [] : List<FluffyItem>.from(json["items"]!.map((x) => FluffyItem.fromMap(x))),
		trackingParams: json["trackingParams"],
		accessibility: json["accessibility"] == null ? null : Accessibility.fromMap(json["accessibility"]),
	);

	Map<String, dynamic> toMap() => {
		"items": items == null ? [] : List<dynamic>.from(items!.map((x) => x.toMap())),
		"trackingParams": trackingParams,
		"accessibility": accessibility?.toMap(),
	};
}

class FluffyItem {
	MenuItemRenderer? menuNavigationItemRenderer;
	MenuItemRenderer? menuServiceItemRenderer;
	FluffyToggleMenuServiceItemRenderer? toggleMenuServiceItemRenderer;

	FluffyItem({
		this.menuNavigationItemRenderer,
		this.menuServiceItemRenderer,
		this.toggleMenuServiceItemRenderer,
	});

	factory FluffyItem.fromJson(String str) => FluffyItem.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory FluffyItem.fromMap(Map<String, dynamic> json) => FluffyItem(
		menuNavigationItemRenderer: json["menuNavigationItemRenderer"] == null ? null : MenuItemRenderer.fromMap(json["menuNavigationItemRenderer"]),
		menuServiceItemRenderer: json["menuServiceItemRenderer"] == null ? null : MenuItemRenderer.fromMap(json["menuServiceItemRenderer"]),
		toggleMenuServiceItemRenderer: json["toggleMenuServiceItemRenderer"] == null ? null : FluffyToggleMenuServiceItemRenderer.fromMap(json["toggleMenuServiceItemRenderer"]),
	);

	Map<String, dynamic> toMap() => {
		"menuNavigationItemRenderer": menuNavigationItemRenderer?.toMap(),
		"menuServiceItemRenderer": menuServiceItemRenderer?.toMap(),
		"toggleMenuServiceItemRenderer": toggleMenuServiceItemRenderer?.toMap(),
	};
}

class FluffyToggleMenuServiceItemRenderer {
	PrimaryText? defaultText;
	Icon? defaultIcon;
	DefaultServiceEndpointClass? defaultServiceEndpoint;
	PrimaryText? toggledText;
	Icon? toggledIcon;
	FluffyToggledServiceEndpoint? toggledServiceEndpoint;
	String? trackingParams;

	FluffyToggleMenuServiceItemRenderer({
		this.defaultText,
		this.defaultIcon,
		this.defaultServiceEndpoint,
		this.toggledText,
		this.toggledIcon,
		this.toggledServiceEndpoint,
		this.trackingParams,
	});

	factory FluffyToggleMenuServiceItemRenderer.fromJson(String str) => FluffyToggleMenuServiceItemRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory FluffyToggleMenuServiceItemRenderer.fromMap(Map<String, dynamic> json) => FluffyToggleMenuServiceItemRenderer(
		defaultText: json["defaultText"] == null ? null : PrimaryText.fromMap(json["defaultText"]),
		defaultIcon: json["defaultIcon"] == null ? null : Icon.fromMap(json["defaultIcon"]),
		defaultServiceEndpoint: json["defaultServiceEndpoint"] == null ? null : DefaultServiceEndpointClass.fromMap(json["defaultServiceEndpoint"]),
		toggledText: json["toggledText"] == null ? null : PrimaryText.fromMap(json["toggledText"]),
		toggledIcon: json["toggledIcon"] == null ? null : Icon.fromMap(json["toggledIcon"]),
		toggledServiceEndpoint: json["toggledServiceEndpoint"] == null ? null : FluffyToggledServiceEndpoint.fromMap(json["toggledServiceEndpoint"]),
		trackingParams: json["trackingParams"],
	);

	Map<String, dynamic> toMap() => {
		"defaultText": defaultText?.toMap(),
		"defaultIcon": defaultIcon?.toMap(),
		"defaultServiceEndpoint": defaultServiceEndpoint?.toMap(),
		"toggledText": toggledText?.toMap(),
		"toggledIcon": toggledIcon?.toMap(),
		"toggledServiceEndpoint": toggledServiceEndpoint?.toMap(),
		"trackingParams": trackingParams,
	};
}

class FluffyToggledServiceEndpoint {
	String? clickTrackingParams;
	LikeEndpoint? likeEndpoint;

	FluffyToggledServiceEndpoint({
		this.clickTrackingParams,
		this.likeEndpoint,
	});

	factory FluffyToggledServiceEndpoint.fromJson(String str) => FluffyToggledServiceEndpoint.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory FluffyToggledServiceEndpoint.fromMap(Map<String, dynamic> json) => FluffyToggledServiceEndpoint(
		clickTrackingParams: json["clickTrackingParams"],
		likeEndpoint: json["likeEndpoint"] == null ? null : LikeEndpoint.fromMap(json["likeEndpoint"]),
	);

	Map<String, dynamic> toMap() => {
		"clickTrackingParams": clickTrackingParams,
		"likeEndpoint": likeEndpoint?.toMap(),
	};
}

class LikeEndpoint {
	String? status;
	TargetClass? target;

	LikeEndpoint({
		this.status,
		this.target,
	});

	factory LikeEndpoint.fromJson(String str) => LikeEndpoint.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory LikeEndpoint.fromMap(Map<String, dynamic> json) => LikeEndpoint(
		status: json["status"],
		target: json["target"] == null ? null : TargetClass.fromMap(json["target"]),
	);

	Map<String, dynamic> toMap() => {
		"status": status,
		"target": target?.toMap(),
	};
}

class TargetClass {
	String? playlistId;

	TargetClass({
		this.playlistId,
	});

	factory TargetClass.fromJson(String str) => TargetClass.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory TargetClass.fromMap(Map<String, dynamic> json) => TargetClass(
		playlistId: json["playlistId"],
	);

	Map<String, dynamic> toMap() => {
		"playlistId": playlistId,
	};
}

class MusicTwoRowItemRendererNavigationEndpoint {
	String? clickTrackingParams;
	FluffyBrowseEndpoint? browseEndpoint;

	MusicTwoRowItemRendererNavigationEndpoint({
		this.clickTrackingParams,
		this.browseEndpoint,
	});

	factory MusicTwoRowItemRendererNavigationEndpoint.fromJson(String str) => MusicTwoRowItemRendererNavigationEndpoint.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory MusicTwoRowItemRendererNavigationEndpoint.fromMap(Map<String, dynamic> json) => MusicTwoRowItemRendererNavigationEndpoint(
		clickTrackingParams: json["clickTrackingParams"],
		browseEndpoint: json["browseEndpoint"] == null ? null : FluffyBrowseEndpoint.fromMap(json["browseEndpoint"]),
	);

	Map<String, dynamic> toMap() => {
		"clickTrackingParams": clickTrackingParams,
		"browseEndpoint": browseEndpoint?.toMap(),
	};
}

class FluffyBrowseEndpoint {
	String? browseId;
	String? params;
	BrowseEndpointContextSupportedConfigs? browseEndpointContextSupportedConfigs;

	FluffyBrowseEndpoint({
		this.browseId,
		this.params,
		this.browseEndpointContextSupportedConfigs,
	});

	factory FluffyBrowseEndpoint.fromJson(String str) => FluffyBrowseEndpoint.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory FluffyBrowseEndpoint.fromMap(Map<String, dynamic> json) => FluffyBrowseEndpoint(
		browseId: json["browseId"],
		params: json["params"],
		browseEndpointContextSupportedConfigs: json["browseEndpointContextSupportedConfigs"] == null ? null : BrowseEndpointContextSupportedConfigs.fromMap(json["browseEndpointContextSupportedConfigs"]),
	);

	Map<String, dynamic> toMap() => {
		"browseId": browseId,
		"params": params,
		"browseEndpointContextSupportedConfigs": browseEndpointContextSupportedConfigs?.toMap(),
	};
}

class Subtitle {
	List<SubtitleRun>? runs;

	Subtitle({
		this.runs,
	});

	factory Subtitle.fromJson(String str) => Subtitle.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory Subtitle.fromMap(Map<String, dynamic> json) => Subtitle(
		runs: json["runs"] == null ? [] : List<SubtitleRun>.from(json["runs"]!.map((x) => SubtitleRun.fromMap(x))),
	);

	Map<String, dynamic> toMap() => {
		"runs": runs == null ? [] : List<dynamic>.from(runs!.map((x) => x.toMap())),
	};
}

class SubtitleRun {
	String? text;
	TentacledNavigationEndpoint? navigationEndpoint;

	SubtitleRun({
		this.text,
		this.navigationEndpoint,
	});

	factory SubtitleRun.fromJson(String str) => SubtitleRun.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory SubtitleRun.fromMap(Map<String, dynamic> json) => SubtitleRun(
		text: json["text"],
		navigationEndpoint: json["navigationEndpoint"] == null ? null : TentacledNavigationEndpoint.fromMap(json["navigationEndpoint"]),
	);

	Map<String, dynamic> toMap() => {
		"text": text,
		"navigationEndpoint": navigationEndpoint?.toMap(),
	};
}

class TentacledNavigationEndpoint {
	String? clickTrackingParams;
	PurpleBrowseEndpoint? browseEndpoint;

	TentacledNavigationEndpoint({
		this.clickTrackingParams,
		this.browseEndpoint,
	});

	factory TentacledNavigationEndpoint.fromJson(String str) => TentacledNavigationEndpoint.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory TentacledNavigationEndpoint.fromMap(Map<String, dynamic> json) => TentacledNavigationEndpoint(
		clickTrackingParams: json["clickTrackingParams"],
		browseEndpoint: json["browseEndpoint"] == null ? null : PurpleBrowseEndpoint.fromMap(json["browseEndpoint"]),
	);

	Map<String, dynamic> toMap() => {
		"clickTrackingParams": clickTrackingParams,
		"browseEndpoint": browseEndpoint?.toMap(),
	};
}

class ThumbnailOverlay {
	ThumbnailOverlayMusicItemThumbnailOverlayRenderer? musicItemThumbnailOverlayRenderer;

	ThumbnailOverlay({
		this.musicItemThumbnailOverlayRenderer,
	});

	factory ThumbnailOverlay.fromJson(String str) => ThumbnailOverlay.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory ThumbnailOverlay.fromMap(Map<String, dynamic> json) => ThumbnailOverlay(
		musicItemThumbnailOverlayRenderer: json["musicItemThumbnailOverlayRenderer"] == null ? null : ThumbnailOverlayMusicItemThumbnailOverlayRenderer.fromMap(json["musicItemThumbnailOverlayRenderer"]),
	);

	Map<String, dynamic> toMap() => {
		"musicItemThumbnailOverlayRenderer": musicItemThumbnailOverlayRenderer?.toMap(),
	};
}

class ThumbnailOverlayMusicItemThumbnailOverlayRenderer {
	MusicItemThumbnailOverlayRendererBackground? background;
	FluffyContent? content;
	String? contentPosition;
	String? displayStyle;

	ThumbnailOverlayMusicItemThumbnailOverlayRenderer({
		this.background,
		this.content,
		this.contentPosition,
		this.displayStyle,
	});

	factory ThumbnailOverlayMusicItemThumbnailOverlayRenderer.fromJson(String str) => ThumbnailOverlayMusicItemThumbnailOverlayRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory ThumbnailOverlayMusicItemThumbnailOverlayRenderer.fromMap(Map<String, dynamic> json) => ThumbnailOverlayMusicItemThumbnailOverlayRenderer(
		background: json["background"] == null ? null : MusicItemThumbnailOverlayRendererBackground.fromMap(json["background"]),
		content: json["content"] == null ? null : FluffyContent.fromMap(json["content"]),
		contentPosition: json["contentPosition"],
		displayStyle: json["displayStyle"],
	);

	Map<String, dynamic> toMap() => {
		"background": background?.toMap(),
		"content": content?.toMap(),
		"contentPosition": contentPosition,
		"displayStyle": displayStyle,
	};
}

class FluffyContent {
	FluffyMusicPlayButtonRenderer? musicPlayButtonRenderer;

	FluffyContent({
		this.musicPlayButtonRenderer,
	});

	factory FluffyContent.fromJson(String str) => FluffyContent.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory FluffyContent.fromMap(Map<String, dynamic> json) => FluffyContent(
		musicPlayButtonRenderer: json["musicPlayButtonRenderer"] == null ? null : FluffyMusicPlayButtonRenderer.fromMap(json["musicPlayButtonRenderer"]),
	);

	Map<String, dynamic> toMap() => {
		"musicPlayButtonRenderer": musicPlayButtonRenderer?.toMap(),
	};
}

class FluffyMusicPlayButtonRenderer {
	FluffyPlayNavigationEndpoint? playNavigationEndpoint;
	String? trackingParams;
	Icon? playIcon;
	Icon? pauseIcon;
	int? iconColor;
	int? backgroundColor;
	int? activeBackgroundColor;
	int? loadingIndicatorColor;
	Icon? playingIcon;
	int? iconLoadingColor;
	double? activeScaleFactor;
	String? buttonSize;
	String? rippleTarget;
	Accessibility? accessibilityPlayData;
	Accessibility? accessibilityPauseData;

	FluffyMusicPlayButtonRenderer({
		this.playNavigationEndpoint,
		this.trackingParams,
		this.playIcon,
		this.pauseIcon,
		this.iconColor,
		this.backgroundColor,
		this.activeBackgroundColor,
		this.loadingIndicatorColor,
		this.playingIcon,
		this.iconLoadingColor,
		this.activeScaleFactor,
		this.buttonSize,
		this.rippleTarget,
		this.accessibilityPlayData,
		this.accessibilityPauseData,
	});

	factory FluffyMusicPlayButtonRenderer.fromJson(String str) => FluffyMusicPlayButtonRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory FluffyMusicPlayButtonRenderer.fromMap(Map<String, dynamic> json) => FluffyMusicPlayButtonRenderer(
		playNavigationEndpoint: json["playNavigationEndpoint"] == null ? null : FluffyPlayNavigationEndpoint.fromMap(json["playNavigationEndpoint"]),
		trackingParams: json["trackingParams"],
		playIcon: json["playIcon"] == null ? null : Icon.fromMap(json["playIcon"]),
		pauseIcon: json["pauseIcon"] == null ? null : Icon.fromMap(json["pauseIcon"]),
		iconColor: json["iconColor"],
		backgroundColor: json["backgroundColor"],
		activeBackgroundColor: json["activeBackgroundColor"],
		loadingIndicatorColor: json["loadingIndicatorColor"],
		playingIcon: json["playingIcon"] == null ? null : Icon.fromMap(json["playingIcon"]),
		iconLoadingColor: json["iconLoadingColor"],
		activeScaleFactor: json["activeScaleFactor"]?.toDouble(),
		buttonSize: json["buttonSize"],
		rippleTarget: json["rippleTarget"],
		accessibilityPlayData: json["accessibilityPlayData"] == null ? null : Accessibility.fromMap(json["accessibilityPlayData"]),
		accessibilityPauseData: json["accessibilityPauseData"] == null ? null : Accessibility.fromMap(json["accessibilityPauseData"]),
	);

	Map<String, dynamic> toMap() => {
		"playNavigationEndpoint": playNavigationEndpoint?.toMap(),
		"trackingParams": trackingParams,
		"playIcon": playIcon?.toMap(),
		"pauseIcon": pauseIcon?.toMap(),
		"iconColor": iconColor,
		"backgroundColor": backgroundColor,
		"activeBackgroundColor": activeBackgroundColor,
		"loadingIndicatorColor": loadingIndicatorColor,
		"playingIcon": playingIcon?.toMap(),
		"iconLoadingColor": iconLoadingColor,
		"activeScaleFactor": activeScaleFactor,
		"buttonSize": buttonSize,
		"rippleTarget": rippleTarget,
		"accessibilityPlayData": accessibilityPlayData?.toMap(),
		"accessibilityPauseData": accessibilityPauseData?.toMap(),
	};
}

class FluffyPlayNavigationEndpoint {
	String? clickTrackingParams;
	TargetClass? watchPlaylistEndpoint;

	FluffyPlayNavigationEndpoint({
		this.clickTrackingParams,
		this.watchPlaylistEndpoint,
	});

	factory FluffyPlayNavigationEndpoint.fromJson(String str) => FluffyPlayNavigationEndpoint.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory FluffyPlayNavigationEndpoint.fromMap(Map<String, dynamic> json) => FluffyPlayNavigationEndpoint(
		clickTrackingParams: json["clickTrackingParams"],
		watchPlaylistEndpoint: json["watchPlaylistEndpoint"] == null ? null : TargetClass.fromMap(json["watchPlaylistEndpoint"]),
	);

	Map<String, dynamic> toMap() => {
		"clickTrackingParams": clickTrackingParams,
		"watchPlaylistEndpoint": watchPlaylistEndpoint?.toMap(),
	};
}

class Title {
	List<FluffyRun>? runs;

	Title({
		this.runs,
	});

	factory Title.fromJson(String str) => Title.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory Title.fromMap(Map<String, dynamic> json) => Title(
		runs: json["runs"] == null ? [] : List<FluffyRun>.from(json["runs"]!.map((x) => FluffyRun.fromMap(x))),
	);

	Map<String, dynamic> toMap() => {
		"runs": runs == null ? [] : List<dynamic>.from(runs!.map((x) => x.toMap())),
	};
}

class FluffyRun {
	String? text;
	MusicTwoRowItemRendererNavigationEndpoint? navigationEndpoint;

	FluffyRun({
		this.text,
		this.navigationEndpoint,
	});

	factory FluffyRun.fromJson(String str) => FluffyRun.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory FluffyRun.fromMap(Map<String, dynamic> json) => FluffyRun(
		text: json["text"],
		navigationEndpoint: json["navigationEndpoint"] == null ? null : MusicTwoRowItemRendererNavigationEndpoint.fromMap(json["navigationEndpoint"]),
	);

	Map<String, dynamic> toMap() => {
		"text": text,
		"navigationEndpoint": navigationEndpoint?.toMap(),
	};
}

class MusicCarouselShelfRendererHeader {
	MusicCarouselShelfBasicHeaderRenderer? musicCarouselShelfBasicHeaderRenderer;

	MusicCarouselShelfRendererHeader({
		this.musicCarouselShelfBasicHeaderRenderer,
	});

	factory MusicCarouselShelfRendererHeader.fromJson(String str) => MusicCarouselShelfRendererHeader.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory MusicCarouselShelfRendererHeader.fromMap(Map<String, dynamic> json) => MusicCarouselShelfRendererHeader(
		musicCarouselShelfBasicHeaderRenderer: json["musicCarouselShelfBasicHeaderRenderer"] == null ? null : MusicCarouselShelfBasicHeaderRenderer.fromMap(json["musicCarouselShelfBasicHeaderRenderer"]),
	);

	Map<String, dynamic> toMap() => {
		"musicCarouselShelfBasicHeaderRenderer": musicCarouselShelfBasicHeaderRenderer?.toMap(),
	};
}

class MusicCarouselShelfBasicHeaderRenderer {
	PrimaryText? title;
	PrimaryText? strapline;
	Accessibility? accessibilityData;
	String? headerStyle;
	MoreContentButton? moreContentButton;
	String? trackingParams;

	MusicCarouselShelfBasicHeaderRenderer({
		this.title,
		this.strapline,
		this.accessibilityData,
		this.headerStyle,
		this.moreContentButton,
		this.trackingParams,
	});

	factory MusicCarouselShelfBasicHeaderRenderer.fromJson(String str) => MusicCarouselShelfBasicHeaderRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory MusicCarouselShelfBasicHeaderRenderer.fromMap(Map<String, dynamic> json) => MusicCarouselShelfBasicHeaderRenderer(
		title: json["title"] == null ? null : PrimaryText.fromMap(json["title"]),
		strapline: json["strapline"] == null ? null : PrimaryText.fromMap(json["strapline"]),
		accessibilityData: json["accessibilityData"] == null ? null : Accessibility.fromMap(json["accessibilityData"]),
		headerStyle: json["headerStyle"],
		moreContentButton: json["moreContentButton"] == null ? null : MoreContentButton.fromMap(json["moreContentButton"]),
		trackingParams: json["trackingParams"],
	);

	Map<String, dynamic> toMap() => {
		"title": title?.toMap(),
		"strapline": strapline?.toMap(),
		"accessibilityData": accessibilityData?.toMap(),
		"headerStyle": headerStyle,
		"moreContentButton": moreContentButton?.toMap(),
		"trackingParams": trackingParams,
	};
}

class MoreContentButton {
	MoreContentButtonButtonRenderer? buttonRenderer;

	MoreContentButton({
		this.buttonRenderer,
	});

	factory MoreContentButton.fromJson(String str) => MoreContentButton.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory MoreContentButton.fromMap(Map<String, dynamic> json) => MoreContentButton(
		buttonRenderer: json["buttonRenderer"] == null ? null : MoreContentButtonButtonRenderer.fromMap(json["buttonRenderer"]),
	);

	Map<String, dynamic> toMap() => {
		"buttonRenderer": buttonRenderer?.toMap(),
	};
}

class MoreContentButtonButtonRenderer {
	String? style;
	PrimaryText? text;
	StickyNavigationEndpoint? navigationEndpoint;
	String? trackingParams;
	Accessibility? accessibilityData;

	MoreContentButtonButtonRenderer({
		this.style,
		this.text,
		this.navigationEndpoint,
		this.trackingParams,
		this.accessibilityData,
	});

	factory MoreContentButtonButtonRenderer.fromJson(String str) => MoreContentButtonButtonRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory MoreContentButtonButtonRenderer.fromMap(Map<String, dynamic> json) => MoreContentButtonButtonRenderer(
		style: json["style"],
		text: json["text"] == null ? null : PrimaryText.fromMap(json["text"]),
		navigationEndpoint: json["navigationEndpoint"] == null ? null : StickyNavigationEndpoint.fromMap(json["navigationEndpoint"]),
		trackingParams: json["trackingParams"],
		accessibilityData: json["accessibilityData"] == null ? null : Accessibility.fromMap(json["accessibilityData"]),
	);

	Map<String, dynamic> toMap() => {
		"style": style,
		"text": text?.toMap(),
		"navigationEndpoint": navigationEndpoint?.toMap(),
		"trackingParams": trackingParams,
		"accessibilityData": accessibilityData?.toMap(),
	};
}

class StickyNavigationEndpoint {
	String? clickTrackingParams;
	WatchPlaylistEndpoint? watchPlaylistEndpoint;

	StickyNavigationEndpoint({
		this.clickTrackingParams,
		this.watchPlaylistEndpoint,
	});

	factory StickyNavigationEndpoint.fromJson(String str) => StickyNavigationEndpoint.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory StickyNavigationEndpoint.fromMap(Map<String, dynamic> json) => StickyNavigationEndpoint(
		clickTrackingParams: json["clickTrackingParams"],
		watchPlaylistEndpoint: json["watchPlaylistEndpoint"] == null ? null : WatchPlaylistEndpoint.fromMap(json["watchPlaylistEndpoint"]),
	);

	Map<String, dynamic> toMap() => {
		"clickTrackingParams": clickTrackingParams,
		"watchPlaylistEndpoint": watchPlaylistEndpoint?.toMap(),
	};
}

class MusicTastebuilderShelfRenderer {
	MusicTastebuilderShelfRendererThumbnail? thumbnail;
	PrimaryText? primaryText;
	PrimaryText? secondaryText;
	ActionButton? actionButton;
	bool? isVisible;
	String? trackingParams;

	MusicTastebuilderShelfRenderer({
		this.thumbnail,
		this.primaryText,
		this.secondaryText,
		this.actionButton,
		this.isVisible,
		this.trackingParams,
	});

	factory MusicTastebuilderShelfRenderer.fromJson(String str) => MusicTastebuilderShelfRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory MusicTastebuilderShelfRenderer.fromMap(Map<String, dynamic> json) => MusicTastebuilderShelfRenderer(
		thumbnail: json["thumbnail"] == null ? null : MusicTastebuilderShelfRendererThumbnail.fromMap(json["thumbnail"]),
		primaryText: json["primaryText"] == null ? null : PrimaryText.fromMap(json["primaryText"]),
		secondaryText: json["secondaryText"] == null ? null : PrimaryText.fromMap(json["secondaryText"]),
		actionButton: json["actionButton"] == null ? null : ActionButton.fromMap(json["actionButton"]),
		isVisible: json["isVisible"],
		trackingParams: json["trackingParams"],
	);

	Map<String, dynamic> toMap() => {
		"thumbnail": thumbnail?.toMap(),
		"primaryText": primaryText?.toMap(),
		"secondaryText": secondaryText?.toMap(),
		"actionButton": actionButton?.toMap(),
		"isVisible": isVisible,
		"trackingParams": trackingParams,
	};
}

class ActionButton {
	ActionButtonButtonRenderer? buttonRenderer;

	ActionButton({
		this.buttonRenderer,
	});

	factory ActionButton.fromJson(String str) => ActionButton.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory ActionButton.fromMap(Map<String, dynamic> json) => ActionButton(
		buttonRenderer: json["buttonRenderer"] == null ? null : ActionButtonButtonRenderer.fromMap(json["buttonRenderer"]),
	);

	Map<String, dynamic> toMap() => {
		"buttonRenderer": buttonRenderer?.toMap(),
	};
}

class ActionButtonButtonRenderer {
	String? style;
	PrimaryText? text;
	DefaultServiceEndpointClass? navigationEndpoint;
	String? trackingParams;

	ActionButtonButtonRenderer({
		this.style,
		this.text,
		this.navigationEndpoint,
		this.trackingParams,
	});

	factory ActionButtonButtonRenderer.fromJson(String str) => ActionButtonButtonRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory ActionButtonButtonRenderer.fromMap(Map<String, dynamic> json) => ActionButtonButtonRenderer(
		style: json["style"],
		text: json["text"] == null ? null : PrimaryText.fromMap(json["text"]),
		navigationEndpoint: json["navigationEndpoint"] == null ? null : DefaultServiceEndpointClass.fromMap(json["navigationEndpoint"]),
		trackingParams: json["trackingParams"],
	);

	Map<String, dynamic> toMap() => {
		"style": style,
		"text": text?.toMap(),
		"navigationEndpoint": navigationEndpoint?.toMap(),
		"trackingParams": trackingParams,
	};
}

class MusicTastebuilderShelfRendererThumbnail {
	MusicTastebuilderShelfThumbnailRenderer? musicTastebuilderShelfThumbnailRenderer;

	MusicTastebuilderShelfRendererThumbnail({
		this.musicTastebuilderShelfThumbnailRenderer,
	});

	factory MusicTastebuilderShelfRendererThumbnail.fromJson(String str) => MusicTastebuilderShelfRendererThumbnail.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory MusicTastebuilderShelfRendererThumbnail.fromMap(Map<String, dynamic> json) => MusicTastebuilderShelfRendererThumbnail(
		musicTastebuilderShelfThumbnailRenderer: json["musicTastebuilderShelfThumbnailRenderer"] == null ? null : MusicTastebuilderShelfThumbnailRenderer.fromMap(json["musicTastebuilderShelfThumbnailRenderer"]),
	);

	Map<String, dynamic> toMap() => {
		"musicTastebuilderShelfThumbnailRenderer": musicTastebuilderShelfThumbnailRenderer?.toMap(),
	};
}

class MusicTastebuilderShelfThumbnailRenderer {
	MusicThumbnailRendererThumbnail? thumbnail;

	MusicTastebuilderShelfThumbnailRenderer({
		this.thumbnail,
	});

	factory MusicTastebuilderShelfThumbnailRenderer.fromJson(String str) => MusicTastebuilderShelfThumbnailRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory MusicTastebuilderShelfThumbnailRenderer.fromMap(Map<String, dynamic> json) => MusicTastebuilderShelfThumbnailRenderer(
		thumbnail: json["thumbnail"] == null ? null : MusicThumbnailRendererThumbnail.fromMap(json["thumbnail"]),
	);

	Map<String, dynamic> toMap() => {
		"thumbnail": thumbnail?.toMap(),
	};
}

class Continuation {
	NextContinuationData? nextContinuationData;

	Continuation({
		this.nextContinuationData,
	});

	factory Continuation.fromJson(String str) => Continuation.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory Continuation.fromMap(Map<String, dynamic> json) => Continuation(
		nextContinuationData: json["nextContinuationData"] == null ? null : NextContinuationData.fromMap(json["nextContinuationData"]),
	);

	Map<String, dynamic> toMap() => {
		"nextContinuationData": nextContinuationData?.toMap(),
	};
}

class NextContinuationData {
	String? continuation;
	String? clickTrackingParams;

	NextContinuationData({
		this.continuation,
		this.clickTrackingParams,
	});

	factory NextContinuationData.fromJson(String str) => NextContinuationData.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory NextContinuationData.fromMap(Map<String, dynamic> json) => NextContinuationData(
		continuation: json["continuation"],
		clickTrackingParams: json["clickTrackingParams"],
	);

	Map<String, dynamic> toMap() => {
		"continuation": continuation,
		"clickTrackingParams": clickTrackingParams,
	};
}

class SectionListContinuationHeader {
	ChipCloudRenderer? chipCloudRenderer;

	SectionListContinuationHeader({
		this.chipCloudRenderer,
	});

	factory SectionListContinuationHeader.fromJson(String str) => SectionListContinuationHeader.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory SectionListContinuationHeader.fromMap(Map<String, dynamic> json) => SectionListContinuationHeader(
		chipCloudRenderer: json["chipCloudRenderer"] == null ? null : ChipCloudRenderer.fromMap(json["chipCloudRenderer"]),
	);

	Map<String, dynamic> toMap() => {
		"chipCloudRenderer": chipCloudRenderer?.toMap(),
	};
}

class ChipCloudRenderer {
	List<Chip>? chips;
	String? trackingParams;
	bool? horizontalScrollable;

	ChipCloudRenderer({
		this.chips,
		this.trackingParams,
		this.horizontalScrollable,
	});

	factory ChipCloudRenderer.fromJson(String str) => ChipCloudRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory ChipCloudRenderer.fromMap(Map<String, dynamic> json) => ChipCloudRenderer(
		chips: json["chips"] == null ? [] : List<Chip>.from(json["chips"]!.map((x) => Chip.fromMap(x))),
		trackingParams: json["trackingParams"],
		horizontalScrollable: json["horizontalScrollable"],
	);

	Map<String, dynamic> toMap() => {
		"chips": chips == null ? [] : List<dynamic>.from(chips!.map((x) => x.toMap())),
		"trackingParams": trackingParams,
		"horizontalScrollable": horizontalScrollable,
	};
}

class Chip {
	ChipCloudChipRenderer? chipCloudChipRenderer;

	Chip({
		this.chipCloudChipRenderer,
	});

	factory Chip.fromJson(String str) => Chip.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory Chip.fromMap(Map<String, dynamic> json) => Chip(
		chipCloudChipRenderer: json["chipCloudChipRenderer"] == null ? null : ChipCloudChipRenderer.fromMap(json["chipCloudChipRenderer"]),
	);

	Map<String, dynamic> toMap() => {
		"chipCloudChipRenderer": chipCloudChipRenderer?.toMap(),
	};
}

class ChipCloudChipRenderer {
	Style? style;
	PrimaryText? text;
	OnDeselectedCommandClass? navigationEndpoint;
	String? trackingParams;
	bool? isSelected;
	OnDeselectedCommandClass? onDeselectedCommand;

	ChipCloudChipRenderer({
		this.style,
		this.text,
		this.navigationEndpoint,
		this.trackingParams,
		this.isSelected,
		this.onDeselectedCommand,
	});

	factory ChipCloudChipRenderer.fromJson(String str) => ChipCloudChipRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory ChipCloudChipRenderer.fromMap(Map<String, dynamic> json) => ChipCloudChipRenderer(
		style: json["style"] == null ? null : Style.fromMap(json["style"]),
		text: json["text"] == null ? null : PrimaryText.fromMap(json["text"]),
		navigationEndpoint: json["navigationEndpoint"] == null ? null : OnDeselectedCommandClass.fromMap(json["navigationEndpoint"]),
		trackingParams: json["trackingParams"],
		isSelected: json["isSelected"],
		onDeselectedCommand: json["onDeselectedCommand"] == null ? null : OnDeselectedCommandClass.fromMap(json["onDeselectedCommand"]),
	);

	Map<String, dynamic> toMap() => {
		"style": style?.toMap(),
		"text": text?.toMap(),
		"navigationEndpoint": navigationEndpoint?.toMap(),
		"trackingParams": trackingParams,
		"isSelected": isSelected,
		"onDeselectedCommand": onDeselectedCommand?.toMap(),
	};
}

class OnDeselectedCommandClass {
	String? clickTrackingParams;
	OnDeselectedCommandBrowseEndpoint? browseEndpoint;

	OnDeselectedCommandClass({
		this.clickTrackingParams,
		this.browseEndpoint,
	});

	factory OnDeselectedCommandClass.fromJson(String str) => OnDeselectedCommandClass.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory OnDeselectedCommandClass.fromMap(Map<String, dynamic> json) => OnDeselectedCommandClass(
		clickTrackingParams: json["clickTrackingParams"],
		browseEndpoint: json["browseEndpoint"] == null ? null : OnDeselectedCommandBrowseEndpoint.fromMap(json["browseEndpoint"]),
	);

	Map<String, dynamic> toMap() => {
		"clickTrackingParams": clickTrackingParams,
		"browseEndpoint": browseEndpoint?.toMap(),
	};
}

class OnDeselectedCommandBrowseEndpoint {
	String? browseId;
	String? params;

	OnDeselectedCommandBrowseEndpoint({
		this.browseId,
		this.params,
	});

	factory OnDeselectedCommandBrowseEndpoint.fromJson(String str) => OnDeselectedCommandBrowseEndpoint.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory OnDeselectedCommandBrowseEndpoint.fromMap(Map<String, dynamic> json) => OnDeselectedCommandBrowseEndpoint(
		browseId: json["browseId"],
		params: json["params"],
	);

	Map<String, dynamic> toMap() => {
		"browseId": browseId,
		"params": params,
	};
}

class Style {
	String? styleType;

	Style({
		this.styleType,
	});

	factory Style.fromJson(String str) => Style.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory Style.fromMap(Map<String, dynamic> json) => Style(
		styleType: json["styleType"],
	);

	Map<String, dynamic> toMap() => {
		"styleType": styleType,
	};
}

class Endpoint {
	String? clickTrackingParams;
	EndpointBrowseEndpoint? browseEndpoint;

	Endpoint({
		this.clickTrackingParams,
		this.browseEndpoint,
	});

	factory Endpoint.fromJson(String str) => Endpoint.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory Endpoint.fromMap(Map<String, dynamic> json) => Endpoint(
		clickTrackingParams: json["clickTrackingParams"],
		browseEndpoint: json["browseEndpoint"] == null ? null : EndpointBrowseEndpoint.fromMap(json["browseEndpoint"]),
	);

	Map<String, dynamic> toMap() => {
		"clickTrackingParams": clickTrackingParams,
		"browseEndpoint": browseEndpoint?.toMap(),
	};
}

class EndpointBrowseEndpoint {
	String? browseId;

	EndpointBrowseEndpoint({
		this.browseId,
	});

	factory EndpointBrowseEndpoint.fromJson(String str) => EndpointBrowseEndpoint.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory EndpointBrowseEndpoint.fromMap(Map<String, dynamic> json) => EndpointBrowseEndpoint(
		browseId: json["browseId"],
	);

	Map<String, dynamic> toMap() => {
		"browseId": browseId,
	};
}

class ContinuationContents {
	SectionList? sectionListContinuation;

	ContinuationContents({
		this.sectionListContinuation,
	});

	factory ContinuationContents.fromJson(String str) => ContinuationContents.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory ContinuationContents.fromMap(Map<String, dynamic> json) => ContinuationContents(
		sectionListContinuation: json["sectionListContinuation"] == null ? null : SectionList.fromMap(json["sectionListContinuation"]),
	);

	Map<String, dynamic> toMap() => {
		"sectionListContinuation": sectionListContinuation?.toMap(),
	};
}

class ResponseContext {
	String? visitorData;
	List<ServiceTrackingParam>? serviceTrackingParams;
	int? maxAgeSeconds;

	ResponseContext({
		this.visitorData,
		this.serviceTrackingParams,
		this.maxAgeSeconds,
	});

	factory ResponseContext.fromJson(String str) => ResponseContext.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory ResponseContext.fromMap(Map<String, dynamic> json) => ResponseContext(
		visitorData: json["visitorData"],
		serviceTrackingParams: json["serviceTrackingParams"] == null ? [] : List<ServiceTrackingParam>.from(json["serviceTrackingParams"]!.map((x) => ServiceTrackingParam.fromMap(x))),
		maxAgeSeconds: json["maxAgeSeconds"],
	);

	Map<String, dynamic> toMap() => {
		"visitorData": visitorData,
		"serviceTrackingParams": serviceTrackingParams == null ? [] : List<dynamic>.from(serviceTrackingParams!.map((x) => x.toMap())),
		"maxAgeSeconds": maxAgeSeconds,
	};
}

class ServiceTrackingParam {
	String? service;
	List<Param>? params;

	ServiceTrackingParam({
		this.service,
		this.params,
	});

	factory ServiceTrackingParam.fromJson(String str) => ServiceTrackingParam.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory ServiceTrackingParam.fromMap(Map<String, dynamic> json) => ServiceTrackingParam(
		service: json["service"],
		params: json["params"] == null ? [] : List<Param>.from(json["params"]!.map((x) => Param.fromMap(x))),
	);

	Map<String, dynamic> toMap() => {
		"service": service,
		"params": params == null ? [] : List<dynamic>.from(params!.map((x) => x.toMap())),
	};
}

class Param {
	String? key;
	String? value;

	Param({
		this.key,
		this.value,
	});

	factory Param.fromJson(String str) => Param.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory Param.fromMap(Map<String, dynamic> json) => Param(
		key: json["key"],
		value: json["value"],
	);

	Map<String, dynamic> toMap() => {
		"key": key,
		"value": value,
	};
}

class TwoColumnBrowseResultsRenderer {
	SecondaryContents? secondaryContents;
	List<Tab>? tabs;

	TwoColumnBrowseResultsRenderer({
		this.secondaryContents,
		this.tabs,
	});

	factory TwoColumnBrowseResultsRenderer.fromJson(String str) => TwoColumnBrowseResultsRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory TwoColumnBrowseResultsRenderer.fromMap(Map<String, dynamic> json) => TwoColumnBrowseResultsRenderer(
		secondaryContents: json["secondaryContents"] == null ? null : SecondaryContents.fromMap(json["secondaryContents"]),
		tabs: json["tabs"] == null ? [] : List<Tab>.from(json["tabs"]!.map((x) => Tab.fromMap(x))),
	);

	Map<String, dynamic> toMap() => {
		"secondaryContents": secondaryContents?.toMap(),
		"tabs": tabs == null ? [] : List<dynamic>.from(tabs!.map((x) => x.toMap())),
	};
}

class SecondaryContents {
	SecondaryContentsSectionListRenderer? sectionListRenderer;

	SecondaryContents({
		this.sectionListRenderer,
	});

	factory SecondaryContents.fromJson(String str) => SecondaryContents.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory SecondaryContents.fromMap(Map<String, dynamic> json) => SecondaryContents(
		sectionListRenderer: json["sectionListRenderer"] == null ? null : SecondaryContentsSectionListRenderer.fromMap(json["sectionListRenderer"]),
	);

	Map<String, dynamic> toMap() => {
		"sectionListRenderer": sectionListRenderer?.toMap(),
	};
}

class SecondaryContentsSectionListRenderer {
	List<PurpleContent>? contents;
	String? trackingParams;

	SecondaryContentsSectionListRenderer({
		this.contents,
		this.trackingParams,
	});

	factory SecondaryContentsSectionListRenderer.fromJson(String str) => SecondaryContentsSectionListRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory SecondaryContentsSectionListRenderer.fromMap(Map<String, dynamic> json) => SecondaryContentsSectionListRenderer(
		contents: json["contents"] == null ? [] : List<PurpleContent>.from(json["contents"]!.map((x) => PurpleContent.fromMap(x))),
		trackingParams: json["trackingParams"],
	);

	Map<String, dynamic> toMap() => {
		"contents": contents == null ? [] : List<dynamic>.from(contents!.map((x) => x.toMap())),
		"trackingParams": trackingParams,
	};
}

class MusicShelfRenderer {
	List<MusicShelfRendererContent>? contents;
	String? trackingParams;
	ShelfDivider? shelfDivider;
	bool? contentsMultiSelectable;

	MusicShelfRenderer({
		this.contents,
		this.trackingParams,
		this.shelfDivider,
		this.contentsMultiSelectable,
	});

	factory MusicShelfRenderer.fromJson(String str) => MusicShelfRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory MusicShelfRenderer.fromMap(Map<String, dynamic> json) => MusicShelfRenderer(
		contents: json["contents"] == null ? [] : List<MusicShelfRendererContent>.from(json["contents"]!.map((x) => MusicShelfRendererContent.fromMap(x))),
		trackingParams: json["trackingParams"],
		shelfDivider: json["shelfDivider"] == null ? null : ShelfDivider.fromMap(json["shelfDivider"]),
		contentsMultiSelectable: json["contentsMultiSelectable"],
	);

	Map<String, dynamic> toMap() => {
		"contents": contents == null ? [] : List<dynamic>.from(contents!.map((x) => x.toMap())),
		"trackingParams": trackingParams,
		"shelfDivider": shelfDivider?.toMap(),
		"contentsMultiSelectable": contentsMultiSelectable,
	};
}

class MusicShelfRendererContent {
	MusicResponsiveListItemRenderer? musicResponsiveListItemRenderer;

	MusicShelfRendererContent({
		this.musicResponsiveListItemRenderer,
	});

	factory MusicShelfRendererContent.fromJson(String str) => MusicShelfRendererContent.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory MusicShelfRendererContent.fromMap(Map<String, dynamic> json) => MusicShelfRendererContent(
		musicResponsiveListItemRenderer: json["musicResponsiveListItemRenderer"] == null ? null : MusicResponsiveListItemRenderer.fromMap(json["musicResponsiveListItemRenderer"]),
	);

	Map<String, dynamic> toMap() => {
		"musicResponsiveListItemRenderer": musicResponsiveListItemRenderer?.toMap(),
	};
}

class FixedColumn {
	MusicResponsiveListItemFixedColumnRenderer? musicResponsiveListItemFixedColumnRenderer;

	FixedColumn({
		this.musicResponsiveListItemFixedColumnRenderer,
	});

	factory FixedColumn.fromJson(String str) => FixedColumn.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory FixedColumn.fromMap(Map<String, dynamic> json) => FixedColumn(
		musicResponsiveListItemFixedColumnRenderer: json["musicResponsiveListItemFixedColumnRenderer"] == null ? null : MusicResponsiveListItemFixedColumnRenderer.fromMap(json["musicResponsiveListItemFixedColumnRenderer"]),
	);

	Map<String, dynamic> toMap() => {
		"musicResponsiveListItemFixedColumnRenderer": musicResponsiveListItemFixedColumnRenderer?.toMap(),
	};
}

class MusicResponsiveListItemFixedColumnRenderer {
	Index? text;
	String? displayPriority;
	String? size;

	MusicResponsiveListItemFixedColumnRenderer({
		this.text,
		this.displayPriority,
		this.size,
	});

	factory MusicResponsiveListItemFixedColumnRenderer.fromJson(String str) => MusicResponsiveListItemFixedColumnRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory MusicResponsiveListItemFixedColumnRenderer.fromMap(Map<String, dynamic> json) => MusicResponsiveListItemFixedColumnRenderer(
		text: json["text"] == null ? null : Index.fromMap(json["text"]),
		displayPriority: json["displayPriority"],
		size: json["size"],
	);

	Map<String, dynamic> toMap() => {
		"text": text?.toMap(),
		"displayPriority": displayPriority,
		"size": size,
	};
}

class Index {
	List<IndexRun>? runs;

	Index({
		this.runs,
	});

	factory Index.fromJson(String str) => Index.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory Index.fromMap(Map<String, dynamic> json) => Index(
		runs: json["runs"] == null ? [] : List<IndexRun>.from(json["runs"]!.map((x) => IndexRun.fromMap(x))),
	);

	Map<String, dynamic> toMap() => {
		"runs": runs == null ? [] : List<dynamic>.from(runs!.map((x) => x.toMap())),
	};
}

class IndexRun {
	String? text;

	IndexRun({
		this.text,
	});

	factory IndexRun.fromJson(String str) => IndexRun.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory IndexRun.fromMap(Map<String, dynamic> json) => IndexRun(
		text: json["text"],
	);

	Map<String, dynamic> toMap() => {
		"text": text,
	};
}

class NavigationEndpoint {
	String? clickTrackingParams;
	PlayNavigationEndpointWatchEndpoint? watchEndpoint;

	NavigationEndpoint({
		this.clickTrackingParams,
		this.watchEndpoint,
	});

	factory NavigationEndpoint.fromJson(String str) => NavigationEndpoint.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory NavigationEndpoint.fromMap(Map<String, dynamic> json) => NavigationEndpoint(
		clickTrackingParams: json["clickTrackingParams"],
		watchEndpoint: json["watchEndpoint"] == null ? null : PlayNavigationEndpointWatchEndpoint.fromMap(json["watchEndpoint"]),
	);

	Map<String, dynamic> toMap() => {
		"clickTrackingParams": clickTrackingParams,
		"watchEndpoint": watchEndpoint?.toMap(),
	};
}

class PlayNavigationEndpointWatchEndpoint {
	String? videoId;
	String? playlistId;
	LoggingContext? loggingContext;
	WatchEndpointMusicSupportedConfigs? watchEndpointMusicSupportedConfigs;
	String? params;
	int? index;

	PlayNavigationEndpointWatchEndpoint({
		this.videoId,
		this.playlistId,
		this.loggingContext,
		this.watchEndpointMusicSupportedConfigs,
		this.params,
		this.index,
	});

	factory PlayNavigationEndpointWatchEndpoint.fromJson(String str) => PlayNavigationEndpointWatchEndpoint.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory PlayNavigationEndpointWatchEndpoint.fromMap(Map<String, dynamic> json) => PlayNavigationEndpointWatchEndpoint(
		videoId: json["videoId"],
		playlistId: json["playlistId"],
		loggingContext: json["loggingContext"] == null ? null : LoggingContext.fromMap(json["loggingContext"]),
		watchEndpointMusicSupportedConfigs: json["watchEndpointMusicSupportedConfigs"] == null ? null : WatchEndpointMusicSupportedConfigs.fromMap(json["watchEndpointMusicSupportedConfigs"]),
		params: json["params"],
		index: json["index"],
	);

	Map<String, dynamic> toMap() => {
		"videoId": videoId,
		"playlistId": playlistId,
		"loggingContext": loggingContext?.toMap(),
		"watchEndpointMusicSupportedConfigs": watchEndpointMusicSupportedConfigs?.toMap(),
		"params": params,
		"index": index,
	};
}

class Menu {
	MenuMenuRenderer? menuRenderer;

	Menu({
		this.menuRenderer,
	});

	factory Menu.fromJson(String str) => Menu.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory Menu.fromMap(Map<String, dynamic> json) => Menu(
		menuRenderer: json["menuRenderer"] == null ? null : MenuMenuRenderer.fromMap(json["menuRenderer"]),
	);

	Map<String, dynamic> toMap() => {
		"menuRenderer": menuRenderer?.toMap(),
	};
}

class MenuMenuRenderer {
	List<PurpleItem>? items;
	String? trackingParams;
	List<TopLevelButton>? topLevelButtons;
	Accessibility? accessibility;

	MenuMenuRenderer({
		this.items,
		this.trackingParams,
		this.topLevelButtons,
		this.accessibility,
	});

	factory MenuMenuRenderer.fromJson(String str) => MenuMenuRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory MenuMenuRenderer.fromMap(Map<String, dynamic> json) => MenuMenuRenderer(
		items: json["items"] == null ? [] : List<PurpleItem>.from(json["items"]!.map((x) => PurpleItem.fromMap(x))),
		trackingParams: json["trackingParams"],
		topLevelButtons: json["topLevelButtons"] == null ? [] : List<TopLevelButton>.from(json["topLevelButtons"]!.map((x) => TopLevelButton.fromMap(x))),
		accessibility: json["accessibility"] == null ? null : Accessibility.fromMap(json["accessibility"]),
	);

	Map<String, dynamic> toMap() => {
		"items": items == null ? [] : List<dynamic>.from(items!.map((x) => x.toMap())),
		"trackingParams": trackingParams,
		"topLevelButtons": topLevelButtons == null ? [] : List<dynamic>.from(topLevelButtons!.map((x) => x.toMap())),
		"accessibility": accessibility?.toMap(),
	};
}

class BrowseEndpoint {
	String? browseId;
	BrowseEndpointContextSupportedConfigs? browseEndpointContextSupportedConfigs;

	BrowseEndpoint({
		this.browseId,
		this.browseEndpointContextSupportedConfigs,
	});

	factory BrowseEndpoint.fromJson(String str) => BrowseEndpoint.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory BrowseEndpoint.fromMap(Map<String, dynamic> json) => BrowseEndpoint(
		browseId: json["browseId"],
		browseEndpointContextSupportedConfigs: json["browseEndpointContextSupportedConfigs"] == null ? null : BrowseEndpointContextSupportedConfigs.fromMap(json["browseEndpointContextSupportedConfigs"]),
	);

	Map<String, dynamic> toMap() => {
		"browseId": browseId,
		"browseEndpointContextSupportedConfigs": browseEndpointContextSupportedConfigs?.toMap(),
	};
}

class ModalWithTitleAndButtonRendererButton {
	ButtonRenderer? buttonRenderer;

	ModalWithTitleAndButtonRendererButton({
		this.buttonRenderer,
	});

	factory ModalWithTitleAndButtonRendererButton.fromJson(String str) => ModalWithTitleAndButtonRendererButton.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory ModalWithTitleAndButtonRendererButton.fromMap(Map<String, dynamic> json) => ModalWithTitleAndButtonRendererButton(
		buttonRenderer: json["buttonRenderer"] == null ? null : ButtonRenderer.fromMap(json["buttonRenderer"]),
	);

	Map<String, dynamic> toMap() => {
		"buttonRenderer": buttonRenderer?.toMap(),
	};
}

class ButtonRenderer {
	String? style;
	bool? isDisabled;
	Index? text;
	ButtonRendererNavigationEndpoint? navigationEndpoint;
	String? trackingParams;

	ButtonRenderer({
		this.style,
		this.isDisabled,
		this.text,
		this.navigationEndpoint,
		this.trackingParams,
	});

	factory ButtonRenderer.fromJson(String str) => ButtonRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory ButtonRenderer.fromMap(Map<String, dynamic> json) => ButtonRenderer(
		style: json["style"],
		isDisabled: json["isDisabled"],
		text: json["text"] == null ? null : Index.fromMap(json["text"]),
		navigationEndpoint: json["navigationEndpoint"] == null ? null : ButtonRendererNavigationEndpoint.fromMap(json["navigationEndpoint"]),
		trackingParams: json["trackingParams"],
	);

	Map<String, dynamic> toMap() => {
		"style": style,
		"isDisabled": isDisabled,
		"text": text?.toMap(),
		"navigationEndpoint": navigationEndpoint?.toMap(),
		"trackingParams": trackingParams,
	};
}

class ButtonRendererNavigationEndpoint {
	String? clickTrackingParams;
	SignInEndpoint? signInEndpoint;

	ButtonRendererNavigationEndpoint({
		this.clickTrackingParams,
		this.signInEndpoint,
	});

	factory ButtonRendererNavigationEndpoint.fromJson(String str) => ButtonRendererNavigationEndpoint.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory ButtonRendererNavigationEndpoint.fromMap(Map<String, dynamic> json) => ButtonRendererNavigationEndpoint(
		clickTrackingParams: json["clickTrackingParams"],
		signInEndpoint: json["signInEndpoint"] == null ? null : SignInEndpoint.fromMap(json["signInEndpoint"]),
	);

	Map<String, dynamic> toMap() => {
		"clickTrackingParams": clickTrackingParams,
		"signInEndpoint": signInEndpoint?.toMap(),
	};
}

class DefaultNavigationEndpoint {
	String? clickTrackingParams;
	ModalEndpoint? modalEndpoint;

	DefaultNavigationEndpoint({
		this.clickTrackingParams,
		this.modalEndpoint,
	});

	factory DefaultNavigationEndpoint.fromJson(String str) => DefaultNavigationEndpoint.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory DefaultNavigationEndpoint.fromMap(Map<String, dynamic> json) => DefaultNavigationEndpoint(
		clickTrackingParams: json["clickTrackingParams"],
		modalEndpoint: json["modalEndpoint"] == null ? null : ModalEndpoint.fromMap(json["modalEndpoint"]),
	);

	Map<String, dynamic> toMap() => {
		"clickTrackingParams": clickTrackingParams,
		"modalEndpoint": modalEndpoint?.toMap(),
	};
}

class LikeButtonRendererTarget {
	String? videoId;

	LikeButtonRendererTarget({
		this.videoId,
	});

	factory LikeButtonRendererTarget.fromJson(String str) => LikeButtonRendererTarget.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory LikeButtonRendererTarget.fromMap(Map<String, dynamic> json) => LikeButtonRendererTarget(
		videoId: json["videoId"],
	);

	Map<String, dynamic> toMap() => {
		"videoId": videoId,
	};
}

class MultiSelectCheckbox {
	CheckboxRenderer? checkboxRenderer;

	MultiSelectCheckbox({
		this.checkboxRenderer,
	});

	factory MultiSelectCheckbox.fromJson(String str) => MultiSelectCheckbox.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory MultiSelectCheckbox.fromMap(Map<String, dynamic> json) => MultiSelectCheckbox(
		checkboxRenderer: json["checkboxRenderer"] == null ? null : CheckboxRenderer.fromMap(json["checkboxRenderer"]),
	);

	Map<String, dynamic> toMap() => {
		"checkboxRenderer": checkboxRenderer?.toMap(),
	};
}

class CheckboxRenderer {
	OnSelectionChangeCommand? onSelectionChangeCommand;
	String? checkedState;
	String? trackingParams;

	CheckboxRenderer({
		this.onSelectionChangeCommand,
		this.checkedState,
		this.trackingParams,
	});

	factory CheckboxRenderer.fromJson(String str) => CheckboxRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory CheckboxRenderer.fromMap(Map<String, dynamic> json) => CheckboxRenderer(
		onSelectionChangeCommand: json["onSelectionChangeCommand"] == null ? null : OnSelectionChangeCommand.fromMap(json["onSelectionChangeCommand"]),
		checkedState: json["checkedState"],
		trackingParams: json["trackingParams"],
	);

	Map<String, dynamic> toMap() => {
		"onSelectionChangeCommand": onSelectionChangeCommand?.toMap(),
		"checkedState": checkedState,
		"trackingParams": trackingParams,
	};
}

class OnSelectionChangeCommand {
	String? clickTrackingParams;
	UpdateMultiSelectStateCommand? updateMultiSelectStateCommand;

	OnSelectionChangeCommand({
		this.clickTrackingParams,
		this.updateMultiSelectStateCommand,
	});

	factory OnSelectionChangeCommand.fromJson(String str) => OnSelectionChangeCommand.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory OnSelectionChangeCommand.fromMap(Map<String, dynamic> json) => OnSelectionChangeCommand(
		clickTrackingParams: json["clickTrackingParams"],
		updateMultiSelectStateCommand: json["updateMultiSelectStateCommand"] == null ? null : UpdateMultiSelectStateCommand.fromMap(json["updateMultiSelectStateCommand"]),
	);

	Map<String, dynamic> toMap() => {
		"clickTrackingParams": clickTrackingParams,
		"updateMultiSelectStateCommand": updateMultiSelectStateCommand?.toMap(),
	};
}

class UpdateMultiSelectStateCommand {
	String? multiSelectParams;
	String? multiSelectItem;

	UpdateMultiSelectStateCommand({
		this.multiSelectParams,
		this.multiSelectItem,
	});

	factory UpdateMultiSelectStateCommand.fromJson(String str) => UpdateMultiSelectStateCommand.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory UpdateMultiSelectStateCommand.fromMap(Map<String, dynamic> json) => UpdateMultiSelectStateCommand(
		multiSelectParams: json["multiSelectParams"],
		multiSelectItem: json["multiSelectItem"],
	);

	Map<String, dynamic> toMap() => {
		"multiSelectParams": multiSelectParams,
		"multiSelectItem": multiSelectItem,
	};
}

class MusicItemThumbnailOverlayRenderer {
	Background? background;
	MusicItemThumbnailOverlayRendererContent? content;
	String? contentPosition;
	String? displayStyle;

	MusicItemThumbnailOverlayRenderer({
		this.background,
		this.content,
		this.contentPosition,
		this.displayStyle,
	});

	factory MusicItemThumbnailOverlayRenderer.fromJson(String str) => MusicItemThumbnailOverlayRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory MusicItemThumbnailOverlayRenderer.fromMap(Map<String, dynamic> json) => MusicItemThumbnailOverlayRenderer(
		background: json["background"] == null ? null : Background.fromMap(json["background"]),
		content: json["content"] == null ? null : MusicItemThumbnailOverlayRendererContent.fromMap(json["content"]),
		contentPosition: json["contentPosition"],
		displayStyle: json["displayStyle"],
	);

	Map<String, dynamic> toMap() => {
		"background": background?.toMap(),
		"content": content?.toMap(),
		"contentPosition": contentPosition,
		"displayStyle": displayStyle,
	};
}

class Background {
	VerticalGradient? verticalGradient;

	Background({
		this.verticalGradient,
	});

	factory Background.fromJson(String str) => Background.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory Background.fromMap(Map<String, dynamic> json) => Background(
		verticalGradient: json["verticalGradient"] == null ? null : VerticalGradient.fromMap(json["verticalGradient"]),
	);

	Map<String, dynamic> toMap() => {
		"verticalGradient": verticalGradient?.toMap(),
	};
}

class MusicItemThumbnailOverlayRendererContent {
	ContentMusicPlayButtonRenderer? musicPlayButtonRenderer;

	MusicItemThumbnailOverlayRendererContent({
		this.musicPlayButtonRenderer,
	});

	factory MusicItemThumbnailOverlayRendererContent.fromJson(String str) => MusicItemThumbnailOverlayRendererContent.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory MusicItemThumbnailOverlayRendererContent.fromMap(Map<String, dynamic> json) => MusicItemThumbnailOverlayRendererContent(
		musicPlayButtonRenderer: json["musicPlayButtonRenderer"] == null ? null : ContentMusicPlayButtonRenderer.fromMap(json["musicPlayButtonRenderer"]),
	);

	Map<String, dynamic> toMap() => {
		"musicPlayButtonRenderer": musicPlayButtonRenderer?.toMap(),
	};
}

class ContentMusicPlayButtonRenderer {
	NavigationEndpoint? playNavigationEndpoint;
	String? trackingParams;
	Icon? playIcon;
	Icon? pauseIcon;
	int? iconColor;
	int? backgroundColor;
	int? activeBackgroundColor;
	int? loadingIndicatorColor;
	Icon? playingIcon;
	int? iconLoadingColor;
	int? activeScaleFactor;
	String? buttonSize;
	String? rippleTarget;
	Accessibility? accessibilityPlayData;
	Accessibility? accessibilityPauseData;

	ContentMusicPlayButtonRenderer({
		this.playNavigationEndpoint,
		this.trackingParams,
		this.playIcon,
		this.pauseIcon,
		this.iconColor,
		this.backgroundColor,
		this.activeBackgroundColor,
		this.loadingIndicatorColor,
		this.playingIcon,
		this.iconLoadingColor,
		this.activeScaleFactor,
		this.buttonSize,
		this.rippleTarget,
		this.accessibilityPlayData,
		this.accessibilityPauseData,
	});

	factory ContentMusicPlayButtonRenderer.fromJson(String str) => ContentMusicPlayButtonRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory ContentMusicPlayButtonRenderer.fromMap(Map<String, dynamic> json) => ContentMusicPlayButtonRenderer(
		playNavigationEndpoint: json["playNavigationEndpoint"] == null ? null : NavigationEndpoint.fromMap(json["playNavigationEndpoint"]),
		trackingParams: json["trackingParams"],
		playIcon: json["playIcon"] == null ? null : Icon.fromMap(json["playIcon"]),
		pauseIcon: json["pauseIcon"] == null ? null : Icon.fromMap(json["pauseIcon"]),
		iconColor: json["iconColor"],
		backgroundColor: json["backgroundColor"],
		activeBackgroundColor: json["activeBackgroundColor"],
		loadingIndicatorColor: json["loadingIndicatorColor"],
		playingIcon: json["playingIcon"] == null ? null : Icon.fromMap(json["playingIcon"]),
		iconLoadingColor: json["iconLoadingColor"],
		activeScaleFactor: json["activeScaleFactor"],
		buttonSize: json["buttonSize"],
		rippleTarget: json["rippleTarget"],
		accessibilityPlayData: json["accessibilityPlayData"] == null ? null : Accessibility.fromMap(json["accessibilityPlayData"]),
		accessibilityPauseData: json["accessibilityPauseData"] == null ? null : Accessibility.fromMap(json["accessibilityPauseData"]),
	);

	Map<String, dynamic> toMap() => {
		"playNavigationEndpoint": playNavigationEndpoint?.toMap(),
		"trackingParams": trackingParams,
		"playIcon": playIcon?.toMap(),
		"pauseIcon": pauseIcon?.toMap(),
		"iconColor": iconColor,
		"backgroundColor": backgroundColor,
		"activeBackgroundColor": activeBackgroundColor,
		"loadingIndicatorColor": loadingIndicatorColor,
		"playingIcon": playingIcon?.toMap(),
		"iconLoadingColor": iconLoadingColor,
		"activeScaleFactor": activeScaleFactor,
		"buttonSize": buttonSize,
		"rippleTarget": rippleTarget,
		"accessibilityPlayData": accessibilityPlayData?.toMap(),
		"accessibilityPauseData": accessibilityPauseData?.toMap(),
	};
}

class ShelfDivider {
	MusicShelfDividerRenderer? musicShelfDividerRenderer;

	ShelfDivider({
		this.musicShelfDividerRenderer,
	});

	factory ShelfDivider.fromJson(String str) => ShelfDivider.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory ShelfDivider.fromMap(Map<String, dynamic> json) => ShelfDivider(
		musicShelfDividerRenderer: json["musicShelfDividerRenderer"] == null ? null : MusicShelfDividerRenderer.fromMap(json["musicShelfDividerRenderer"]),
	);

	Map<String, dynamic> toMap() => {
		"musicShelfDividerRenderer": musicShelfDividerRenderer?.toMap(),
	};
}

class MusicShelfDividerRenderer {
	bool? hidden;

	MusicShelfDividerRenderer({
		this.hidden,
	});

	factory MusicShelfDividerRenderer.fromJson(String str) => MusicShelfDividerRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory MusicShelfDividerRenderer.fromMap(Map<String, dynamic> json) => MusicShelfDividerRenderer(
		hidden: json["hidden"],
	);

	Map<String, dynamic> toMap() => {
		"hidden": hidden,
	};
}

class ContentSectionListRenderer {
	List<FluffyContent>? contents;
	String? trackingParams;

	ContentSectionListRenderer({
		this.contents,
		this.trackingParams,
	});

	factory ContentSectionListRenderer.fromJson(String str) => ContentSectionListRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory ContentSectionListRenderer.fromMap(Map<String, dynamic> json) => ContentSectionListRenderer(
		contents: json["contents"] == null ? [] : List<FluffyContent>.from(json["contents"]!.map((x) => FluffyContent.fromMap(x))),
		trackingParams: json["trackingParams"],
	);

	Map<String, dynamic> toMap() => {
		"contents": contents == null ? [] : List<dynamic>.from(contents!.map((x) => x.toMap())),
		"trackingParams": trackingParams,
	};
}

class MusicResponsiveHeaderRenderer {
	StraplineThumbnailClass? thumbnail;
	List<ButtonElement>? buttons;
	Index? title;
	Index? subtitle;
	String? trackingParams;
	StraplineTextOne? straplineTextOne;
	StraplineThumbnailClass? straplineThumbnail;
	MusicResponsiveHeaderRendererDescription? description;
	Index? secondSubtitle;

	MusicResponsiveHeaderRenderer({
		this.thumbnail,
		this.buttons,
		this.title,
		this.subtitle,
		this.trackingParams,
		this.straplineTextOne,
		this.straplineThumbnail,
		this.description,
		this.secondSubtitle,
	});

	factory MusicResponsiveHeaderRenderer.fromJson(String str) => MusicResponsiveHeaderRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory MusicResponsiveHeaderRenderer.fromMap(Map<String, dynamic> json) => MusicResponsiveHeaderRenderer(
		thumbnail: json["thumbnail"] == null ? null : StraplineThumbnailClass.fromMap(json["thumbnail"]),
		buttons: json["buttons"] == null ? [] : List<ButtonElement>.from(json["buttons"]!.map((x) => ButtonElement.fromMap(x))),
		title: json["title"] == null ? null : Index.fromMap(json["title"]),
		subtitle: json["subtitle"] == null ? null : Index.fromMap(json["subtitle"]),
		trackingParams: json["trackingParams"],
		straplineTextOne: json["straplineTextOne"] == null ? null : StraplineTextOne.fromMap(json["straplineTextOne"]),
		straplineThumbnail: json["straplineThumbnail"] == null ? null : StraplineThumbnailClass.fromMap(json["straplineThumbnail"]),
		description: json["description"] == null ? null : MusicResponsiveHeaderRendererDescription.fromMap(json["description"]),
		secondSubtitle: json["secondSubtitle"] == null ? null : Index.fromMap(json["secondSubtitle"]),
	);

	Map<String, dynamic> toMap() => {
		"thumbnail": thumbnail?.toMap(),
		"buttons": buttons == null ? [] : List<dynamic>.from(buttons!.map((x) => x.toMap())),
		"title": title?.toMap(),
		"subtitle": subtitle?.toMap(),
		"trackingParams": trackingParams,
		"straplineTextOne": straplineTextOne?.toMap(),
		"straplineThumbnail": straplineThumbnail?.toMap(),
		"description": description?.toMap(),
		"secondSubtitle": secondSubtitle?.toMap(),
	};
}

class ButtonElement {
	ButtonToggleButtonRenderer? toggleButtonRenderer;
	ButtonMusicPlayButtonRenderer? musicPlayButtonRenderer;
	ButtonMenuRenderer? menuRenderer;

	ButtonElement({
		this.toggleButtonRenderer,
		this.musicPlayButtonRenderer,
		this.menuRenderer,
	});

	factory ButtonElement.fromJson(String str) => ButtonElement.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory ButtonElement.fromMap(Map<String, dynamic> json) => ButtonElement(
		toggleButtonRenderer: json["toggleButtonRenderer"] == null ? null : ButtonToggleButtonRenderer.fromMap(json["toggleButtonRenderer"]),
		musicPlayButtonRenderer: json["musicPlayButtonRenderer"] == null ? null : ButtonMusicPlayButtonRenderer.fromMap(json["musicPlayButtonRenderer"]),
		menuRenderer: json["menuRenderer"] == null ? null : ButtonMenuRenderer.fromMap(json["menuRenderer"]),
	);

	Map<String, dynamic> toMap() => {
		"toggleButtonRenderer": toggleButtonRenderer?.toMap(),
		"musicPlayButtonRenderer": musicPlayButtonRenderer?.toMap(),
		"menuRenderer": menuRenderer?.toMap(),
	};
}

class ButtonMenuRenderer {
	List<FluffyItem>? items;
	String? trackingParams;
	Accessibility? accessibility;

	ButtonMenuRenderer({
		this.items,
		this.trackingParams,
		this.accessibility,
	});

	factory ButtonMenuRenderer.fromJson(String str) => ButtonMenuRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory ButtonMenuRenderer.fromMap(Map<String, dynamic> json) => ButtonMenuRenderer(
		items: json["items"] == null ? [] : List<FluffyItem>.from(json["items"]!.map((x) => FluffyItem.fromMap(x))),
		trackingParams: json["trackingParams"],
		accessibility: json["accessibility"] == null ? null : Accessibility.fromMap(json["accessibility"]),
	);

	Map<String, dynamic> toMap() => {
		"items": items == null ? [] : List<dynamic>.from(items!.map((x) => x.toMap())),
		"trackingParams": trackingParams,
		"accessibility": accessibility?.toMap(),
	};
}

class ToggleMenuServiceItemRenderer {
	Index? defaultText;
	Icon? defaultIcon;
	DefaultNavigationEndpoint? defaultServiceEndpoint;
	Index? toggledText;
	Icon? toggledIcon;
	ToggledServiceEndpoint? toggledServiceEndpoint;
	String? trackingParams;

	ToggleMenuServiceItemRenderer({
		this.defaultText,
		this.defaultIcon,
		this.defaultServiceEndpoint,
		this.toggledText,
		this.toggledIcon,
		this.toggledServiceEndpoint,
		this.trackingParams,
	});

	factory ToggleMenuServiceItemRenderer.fromJson(String str) => ToggleMenuServiceItemRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory ToggleMenuServiceItemRenderer.fromMap(Map<String, dynamic> json) => ToggleMenuServiceItemRenderer(
		defaultText: json["defaultText"] == null ? null : Index.fromMap(json["defaultText"]),
		defaultIcon: json["defaultIcon"] == null ? null : Icon.fromMap(json["defaultIcon"]),
		defaultServiceEndpoint: json["defaultServiceEndpoint"] == null ? null : DefaultNavigationEndpoint.fromMap(json["defaultServiceEndpoint"]),
		toggledText: json["toggledText"] == null ? null : Index.fromMap(json["toggledText"]),
		toggledIcon: json["toggledIcon"] == null ? null : Icon.fromMap(json["toggledIcon"]),
		toggledServiceEndpoint: json["toggledServiceEndpoint"] == null ? null : ToggledServiceEndpoint.fromMap(json["toggledServiceEndpoint"]),
		trackingParams: json["trackingParams"],
	);

	Map<String, dynamic> toMap() => {
		"defaultText": defaultText?.toMap(),
		"defaultIcon": defaultIcon?.toMap(),
		"defaultServiceEndpoint": defaultServiceEndpoint?.toMap(),
		"toggledText": toggledText?.toMap(),
		"toggledIcon": toggledIcon?.toMap(),
		"toggledServiceEndpoint": toggledServiceEndpoint?.toMap(),
		"trackingParams": trackingParams,
	};
}

class ToggledServiceEndpoint {
	String? clickTrackingParams;
	LikeEndpoint? likeEndpoint;

	ToggledServiceEndpoint({
		this.clickTrackingParams,
		this.likeEndpoint,
	});

	factory ToggledServiceEndpoint.fromJson(String str) => ToggledServiceEndpoint.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory ToggledServiceEndpoint.fromMap(Map<String, dynamic> json) => ToggledServiceEndpoint(
		clickTrackingParams: json["clickTrackingParams"],
		likeEndpoint: json["likeEndpoint"] == null ? null : LikeEndpoint.fromMap(json["likeEndpoint"]),
	);

	Map<String, dynamic> toMap() => {
		"clickTrackingParams": clickTrackingParams,
		"likeEndpoint": likeEndpoint?.toMap(),
	};
}

class LikeEndpointTarget {
	String? playlistId;

	LikeEndpointTarget({
		this.playlistId,
	});

	factory LikeEndpointTarget.fromJson(String str) => LikeEndpointTarget.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory LikeEndpointTarget.fromMap(Map<String, dynamic> json) => LikeEndpointTarget(
		playlistId: json["playlistId"],
	);

	Map<String, dynamic> toMap() => {
		"playlistId": playlistId,
	};
}

class ButtonMusicPlayButtonRenderer {
	NavigationEndpoint? playNavigationEndpoint;
	String? trackingParams;
	Icon? playIcon;
	Icon? pauseIcon;
	int? iconColor;
	int? backgroundColor;
	int? activeBackgroundColor;
	int? loadingIndicatorColor;
	Icon? playingIcon;
	int? iconLoadingColor;
	int? activeScaleFactor;
	Accessibility? accessibilityPlayData;
	Accessibility? accessibilityPauseData;

	ButtonMusicPlayButtonRenderer({
		this.playNavigationEndpoint,
		this.trackingParams,
		this.playIcon,
		this.pauseIcon,
		this.iconColor,
		this.backgroundColor,
		this.activeBackgroundColor,
		this.loadingIndicatorColor,
		this.playingIcon,
		this.iconLoadingColor,
		this.activeScaleFactor,
		this.accessibilityPlayData,
		this.accessibilityPauseData,
	});

	factory ButtonMusicPlayButtonRenderer.fromJson(String str) => ButtonMusicPlayButtonRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory ButtonMusicPlayButtonRenderer.fromMap(Map<String, dynamic> json) => ButtonMusicPlayButtonRenderer(
		playNavigationEndpoint: json["playNavigationEndpoint"] == null ? null : NavigationEndpoint.fromMap(json["playNavigationEndpoint"]),
		trackingParams: json["trackingParams"],
		playIcon: json["playIcon"] == null ? null : Icon.fromMap(json["playIcon"]),
		pauseIcon: json["pauseIcon"] == null ? null : Icon.fromMap(json["pauseIcon"]),
		iconColor: json["iconColor"],
		backgroundColor: json["backgroundColor"],
		activeBackgroundColor: json["activeBackgroundColor"],
		loadingIndicatorColor: json["loadingIndicatorColor"],
		playingIcon: json["playingIcon"] == null ? null : Icon.fromMap(json["playingIcon"]),
		iconLoadingColor: json["iconLoadingColor"],
		activeScaleFactor: json["activeScaleFactor"],
		accessibilityPlayData: json["accessibilityPlayData"] == null ? null : Accessibility.fromMap(json["accessibilityPlayData"]),
		accessibilityPauseData: json["accessibilityPauseData"] == null ? null : Accessibility.fromMap(json["accessibilityPauseData"]),
	);

	Map<String, dynamic> toMap() => {
		"playNavigationEndpoint": playNavigationEndpoint?.toMap(),
		"trackingParams": trackingParams,
		"playIcon": playIcon?.toMap(),
		"pauseIcon": pauseIcon?.toMap(),
		"iconColor": iconColor,
		"backgroundColor": backgroundColor,
		"activeBackgroundColor": activeBackgroundColor,
		"loadingIndicatorColor": loadingIndicatorColor,
		"playingIcon": playingIcon?.toMap(),
		"iconLoadingColor": iconLoadingColor,
		"activeScaleFactor": activeScaleFactor,
		"accessibilityPlayData": accessibilityPlayData?.toMap(),
		"accessibilityPauseData": accessibilityPauseData?.toMap(),
	};
}

class ButtonToggleButtonRenderer {
	bool? isToggled;
	bool? isDisabled;
	Icon? defaultIcon;
	Icon? toggledIcon;
	String? trackingParams;
	DefaultNavigationEndpoint? defaultNavigationEndpoint;
	Accessibility? accessibilityData;
	Accessibility? toggledAccessibilityData;

	ButtonToggleButtonRenderer({
		this.isToggled,
		this.isDisabled,
		this.defaultIcon,
		this.toggledIcon,
		this.trackingParams,
		this.defaultNavigationEndpoint,
		this.accessibilityData,
		this.toggledAccessibilityData,
	});

	factory ButtonToggleButtonRenderer.fromJson(String str) => ButtonToggleButtonRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory ButtonToggleButtonRenderer.fromMap(Map<String, dynamic> json) => ButtonToggleButtonRenderer(
		isToggled: json["isToggled"],
		isDisabled: json["isDisabled"],
		defaultIcon: json["defaultIcon"] == null ? null : Icon.fromMap(json["defaultIcon"]),
		toggledIcon: json["toggledIcon"] == null ? null : Icon.fromMap(json["toggledIcon"]),
		trackingParams: json["trackingParams"],
		defaultNavigationEndpoint: json["defaultNavigationEndpoint"] == null ? null : DefaultNavigationEndpoint.fromMap(json["defaultNavigationEndpoint"]),
		accessibilityData: json["accessibilityData"] == null ? null : Accessibility.fromMap(json["accessibilityData"]),
		toggledAccessibilityData: json["toggledAccessibilityData"] == null ? null : Accessibility.fromMap(json["toggledAccessibilityData"]),
	);

	Map<String, dynamic> toMap() => {
		"isToggled": isToggled,
		"isDisabled": isDisabled,
		"defaultIcon": defaultIcon?.toMap(),
		"toggledIcon": toggledIcon?.toMap(),
		"trackingParams": trackingParams,
		"defaultNavigationEndpoint": defaultNavigationEndpoint?.toMap(),
		"accessibilityData": accessibilityData?.toMap(),
		"toggledAccessibilityData": toggledAccessibilityData?.toMap(),
	};
}

class MusicResponsiveHeaderRendererDescription {
	MusicDescriptionShelfRenderer? musicDescriptionShelfRenderer;

	MusicResponsiveHeaderRendererDescription({
		this.musicDescriptionShelfRenderer,
	});

	factory MusicResponsiveHeaderRendererDescription.fromJson(String str) => MusicResponsiveHeaderRendererDescription.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory MusicResponsiveHeaderRendererDescription.fromMap(Map<String, dynamic> json) => MusicResponsiveHeaderRendererDescription(
		musicDescriptionShelfRenderer: json["musicDescriptionShelfRenderer"] == null ? null : MusicDescriptionShelfRenderer.fromMap(json["musicDescriptionShelfRenderer"]),
	);

	Map<String, dynamic> toMap() => {
		"musicDescriptionShelfRenderer": musicDescriptionShelfRenderer?.toMap(),
	};
}

class MusicDescriptionShelfRenderer {
	MusicDescriptionShelfRendererDescription? description;
	MoreButton? moreButton;
	String? trackingParams;
	String? shelfStyle;

	MusicDescriptionShelfRenderer({
		this.description,
		this.moreButton,
		this.trackingParams,
		this.shelfStyle,
	});

	factory MusicDescriptionShelfRenderer.fromJson(String str) => MusicDescriptionShelfRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory MusicDescriptionShelfRenderer.fromMap(Map<String, dynamic> json) => MusicDescriptionShelfRenderer(
		description: json["description"] == null ? null : MusicDescriptionShelfRendererDescription.fromMap(json["description"]),
		moreButton: json["moreButton"] == null ? null : MoreButton.fromMap(json["moreButton"]),
		trackingParams: json["trackingParams"],
		shelfStyle: json["shelfStyle"],
	);

	Map<String, dynamic> toMap() => {
		"description": description?.toMap(),
		"moreButton": moreButton?.toMap(),
		"trackingParams": trackingParams,
		"shelfStyle": shelfStyle,
	};
}

class MusicDescriptionShelfRendererDescription {
	List<DescriptionRun>? runs;

	MusicDescriptionShelfRendererDescription({
		this.runs,
	});

	factory MusicDescriptionShelfRendererDescription.fromJson(String str) => MusicDescriptionShelfRendererDescription.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory MusicDescriptionShelfRendererDescription.fromMap(Map<String, dynamic> json) => MusicDescriptionShelfRendererDescription(
		runs: json["runs"] == null ? [] : List<DescriptionRun>.from(json["runs"]!.map((x) => DescriptionRun.fromMap(x))),
	);

	Map<String, dynamic> toMap() => {
		"runs": runs == null ? [] : List<dynamic>.from(runs!.map((x) => x.toMap())),
	};
}

class DescriptionRun {
	String? text;
	PurpleNavigationEndpoint? navigationEndpoint;

	DescriptionRun({
		this.text,
		this.navigationEndpoint,
	});

	factory DescriptionRun.fromJson(String str) => DescriptionRun.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory DescriptionRun.fromMap(Map<String, dynamic> json) => DescriptionRun(
		text: json["text"],
		navigationEndpoint: json["navigationEndpoint"] == null ? null : PurpleNavigationEndpoint.fromMap(json["navigationEndpoint"]),
	);

	Map<String, dynamic> toMap() => {
		"text": text,
		"navigationEndpoint": navigationEndpoint?.toMap(),
	};
}

class UrlEndpoint {
	String? url;
	String? target;

	UrlEndpoint({
		this.url,
		this.target,
	});

	factory UrlEndpoint.fromJson(String str) => UrlEndpoint.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory UrlEndpoint.fromMap(Map<String, dynamic> json) => UrlEndpoint(
		url: json["url"],
		target: json["target"],
	);

	Map<String, dynamic> toMap() => {
		"url": url,
		"target": target,
	};
}

class MoreButton {
	MoreButtonToggleButtonRenderer? toggleButtonRenderer;

	MoreButton({
		this.toggleButtonRenderer,
	});

	factory MoreButton.fromJson(String str) => MoreButton.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory MoreButton.fromMap(Map<String, dynamic> json) => MoreButton(
		toggleButtonRenderer: json["toggleButtonRenderer"] == null ? null : MoreButtonToggleButtonRenderer.fromMap(json["toggleButtonRenderer"]),
	);

	Map<String, dynamic> toMap() => {
		"toggleButtonRenderer": toggleButtonRenderer?.toMap(),
	};
}

class MoreButtonToggleButtonRenderer {
	bool? isToggled;
	bool? isDisabled;
	Icon? defaultIcon;
	Index? defaultText;
	Icon? toggledIcon;
	Index? toggledText;
	String? trackingParams;

	MoreButtonToggleButtonRenderer({
		this.isToggled,
		this.isDisabled,
		this.defaultIcon,
		this.defaultText,
		this.toggledIcon,
		this.toggledText,
		this.trackingParams,
	});

	factory MoreButtonToggleButtonRenderer.fromJson(String str) => MoreButtonToggleButtonRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory MoreButtonToggleButtonRenderer.fromMap(Map<String, dynamic> json) => MoreButtonToggleButtonRenderer(
		isToggled: json["isToggled"],
		isDisabled: json["isDisabled"],
		defaultIcon: json["defaultIcon"] == null ? null : Icon.fromMap(json["defaultIcon"]),
		defaultText: json["defaultText"] == null ? null : Index.fromMap(json["defaultText"]),
		toggledIcon: json["toggledIcon"] == null ? null : Icon.fromMap(json["toggledIcon"]),
		toggledText: json["toggledText"] == null ? null : Index.fromMap(json["toggledText"]),
		trackingParams: json["trackingParams"],
	);

	Map<String, dynamic> toMap() => {
		"isToggled": isToggled,
		"isDisabled": isDisabled,
		"defaultIcon": defaultIcon?.toMap(),
		"defaultText": defaultText?.toMap(),
		"toggledIcon": toggledIcon?.toMap(),
		"toggledText": toggledText?.toMap(),
		"trackingParams": trackingParams,
	};
}

class StraplineTextOne {
	List<StraplineTextOneRun>? runs;

	StraplineTextOne({
		this.runs,
	});

	factory StraplineTextOne.fromJson(String str) => StraplineTextOne.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory StraplineTextOne.fromMap(Map<String, dynamic> json) => StraplineTextOne(
		runs: json["runs"] == null ? [] : List<StraplineTextOneRun>.from(json["runs"]!.map((x) => StraplineTextOneRun.fromMap(x))),
	);

	Map<String, dynamic> toMap() => {
		"runs": runs == null ? [] : List<dynamic>.from(runs!.map((x) => x.toMap())),
	};
}

class StraplineTextOneRun {
	String? text;
	FluffyNavigationEndpoint? navigationEndpoint;

	StraplineTextOneRun({
		this.text,
		this.navigationEndpoint,
	});

	factory StraplineTextOneRun.fromJson(String str) => StraplineTextOneRun.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory StraplineTextOneRun.fromMap(Map<String, dynamic> json) => StraplineTextOneRun(
		text: json["text"],
		navigationEndpoint: json["navigationEndpoint"] == null ? null : FluffyNavigationEndpoint.fromMap(json["navigationEndpoint"]),
	);

	Map<String, dynamic> toMap() => {
		"text": text,
		"navigationEndpoint": navigationEndpoint?.toMap(),
	};
}

class StraplineThumbnailClass {
	MusicThumbnailRenderer? musicThumbnailRenderer;

	StraplineThumbnailClass({
		this.musicThumbnailRenderer,
	});

	factory StraplineThumbnailClass.fromJson(String str) => StraplineThumbnailClass.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory StraplineThumbnailClass.fromMap(Map<String, dynamic> json) => StraplineThumbnailClass(
		musicThumbnailRenderer: json["musicThumbnailRenderer"] == null ? null : MusicThumbnailRenderer.fromMap(json["musicThumbnailRenderer"]),
	);

	Map<String, dynamic> toMap() => {
		"musicThumbnailRenderer": musicThumbnailRenderer?.toMap(),
	};
}

class Microformat {
	MicroformatDataRenderer? microformatDataRenderer;

	Microformat({
		this.microformatDataRenderer,
	});

	factory Microformat.fromJson(String str) => Microformat.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory Microformat.fromMap(Map<String, dynamic> json) => Microformat(
		microformatDataRenderer: json["microformatDataRenderer"] == null ? null : MicroformatDataRenderer.fromMap(json["microformatDataRenderer"]),
	);

	Map<String, dynamic> toMap() => {
		"microformatDataRenderer": microformatDataRenderer?.toMap(),
	};
}

class MicroformatDataRenderer {
	String? urlCanonical;

	MicroformatDataRenderer({
		this.urlCanonical,
	});

	factory MicroformatDataRenderer.fromJson(String str) => MicroformatDataRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory MicroformatDataRenderer.fromMap(Map<String, dynamic> json) => MicroformatDataRenderer(
		urlCanonical: json["urlCanonical"],
	);

	Map<String, dynamic> toMap() => {
		"urlCanonical": urlCanonical,
	};
}

class MusicPlaylistShelfRenderer {
	String? playlistId;
	List<MusicShelfRendererContent>? contents;
	int? collapsedItemCount;
	String? trackingParams;
	bool? contentsMultiSelectable;

	MusicPlaylistShelfRenderer({
		this.playlistId,
		this.contents,
		this.collapsedItemCount,
		this.trackingParams,
		this.contentsMultiSelectable,
	});

	factory MusicPlaylistShelfRenderer.fromJson(String str) => MusicPlaylistShelfRenderer.fromMap(json.decode(str));

	String toJson() => json.encode(toMap());

	factory MusicPlaylistShelfRenderer.fromMap(Map<String, dynamic> json) => MusicPlaylistShelfRenderer(
		playlistId: json["playlistId"],
		contents: json["contents"] == null ? [] : List<MusicShelfRendererContent>.from(json["contents"]!.map((x) => MusicShelfRendererContent.fromMap(x))),
		collapsedItemCount: json["collapsedItemCount"],
		trackingParams: json["trackingParams"],
		contentsMultiSelectable: json["contentsMultiSelectable"],
	);

	Map<String, dynamic> toMap() => {
		"playlistId": playlistId,
		"contents": contents == null ? [] : List<dynamic>.from(contents!.map((x) => x.toMap())),
		"collapsedItemCount": collapsedItemCount,
		"trackingParams": trackingParams,
		"contentsMultiSelectable": contentsMultiSelectable,
	};
}