[AutoExpand]

;------------------------------------------------------------------------------
;	Unreal Engine classes - [AutoExpand] section
;------------------------------------------------------------------------------

; Unreal Engine
UObjectBase=<Name>, Class=<Class->Name>, Outer=<Outer->Name>
UObject=<Name>, Class=<Class->Name>, Outer=<Outer->Name>
FFontCharacter=X=<USize>,V=<VSize>
FGuid=<A,X>,<B,X>,<C,X>,<D,X>
TSetElement<*>=<Value>
FScriptInterface=<InterfacePointer> (<ObjectPointer>)
FScriptLocation=Pos=<CodeTop>, Line=<InputLine>

;------------------------------------------------------------------------------
;	End Unreal Engine classes - [AutoExpand] section
;------------------------------------------------------------------------------

[Visualizer]

;------------------------------------------------------------------------------
;	Unreal Engine classes - [Visualizer] Section
;------------------------------------------------------------------------------

FName {
	preview
	(
		#if(!GFNameDebuggerVisualizersIsUE3)
		(
			#if(!GFNameTableForDebuggerVisualizers)
			(
				#if(($e.Index) < 0x100000)
				(
					#if(($e.Index) >= 0)
					(
						#if(!!GFNameTableForDebuggerVisualizers_MT)
						(
							#if(!!(((FNameEntry***)GFNameTableForDebuggerVisualizers_MT)[$e.Index / 0x4000]))
							(
								#if(!!(((FNameEntry***)GFNameTableForDebuggerVisualizers_MT)[$e.Index / 0x4000][$e.Index % 0x4000]))
								(
									#if(($e.Number) > 0)
									(
										#if(((((FNameEntry***)GFNameTableForDebuggerVisualizers_MT)[$e.Index / 0x4000][$e.Index % 0x4000])->Index) & 1)
										(
											#([(((FNameEntry***)GFNameTableForDebuggerVisualizers_MT)[$e.Index / 0x4000][$e.Index % 0x4000])->UniName, su], "_", ($e.Number)-1)
										)
										#else
										(
											#([(((FNameEntry***)GFNameTableForDebuggerVisualizers_MT)[$e.Index / 0x4000][$e.Index % 0x4000])->AnsiName, s], "_", ($e.Number)-1)
										)
									)
									#else
									(
										#if(((((FNameEntry***)GFNameTableForDebuggerVisualizers_MT)[$e.Index / 0x4000][$e.Index % 0x4000])->Index) & 1)
										(
											#([(((FNameEntry***)GFNameTableForDebuggerVisualizers_MT)[$e.Index / 0x4000][$e.Index % 0x4000])->UniName, su])
										)
										#else
										(
											#([(((FNameEntry***)GFNameTableForDebuggerVisualizers_MT)[$e.Index / 0x4000][$e.Index % 0x4000])->AnsiName, s])
										)
									)
								)
								#else
								(
									"Invalid3_BogusEntry"
								)
							)
							#else
							(
								"Invalid_BogusBucketPtr"
							)
						)
						#else
						(
							"Invalid_BogusTablePtr"
						)
					)
					#else
					(
						"Invalid_IndexNegative"
					)
				)
				#else
				(
					"Invalid_IndexTooLarge"
				)
			)
			#else
			(
				#if(($e.Index) < (GFNameTableForDebuggerVisualizers->ArrayNum))
				(
					#if(($e.Index) >= 0)
					(
						#if(($e.Number) > 0)
						(
							#if(((((FNameEntry**)GFNameTableForDebuggerVisualizers->AllocatorInstance.Data)[$e.Index])->Index) & 1)
							(
								#([(((FNameEntry**)GFNameTableForDebuggerVisualizers->AllocatorInstance.Data)[$e.Index])->UniName, su], "_", ($e.Number)-1)
							)
							#else
							(
								#([(((FNameEntry**)GFNameTableForDebuggerVisualizers->AllocatorInstance.Data)[$e.Index])->AnsiName, s], "_", ($e.Number)-1)
							)
						)
						#else
						(
							#if(((((FNameEntry**)GFNameTableForDebuggerVisualizers->AllocatorInstance.Data)[$e.Index])->Index) & 1)
							(
								#([(((FNameEntry**)GFNameTableForDebuggerVisualizers->AllocatorInstance.Data)[$e.Index])->UniName, su])
							)
							#else
							(
								#([(((FNameEntry**)GFNameTableForDebuggerVisualizers->AllocatorInstance.Data)[$e.Index])->AnsiName, s])
							)
						)
					)
					#else
					(
						"UE3_InvalidNegativeIndex"
					)
				)
				#else
				(
					"InvalidUE3_IndexTooLarge"
				)
			)
		)
		#else
		(
			#if(($e.Index) < ($e.Names.ArrayNum))
			(
				#if(($e.Index) >= 0)
				(
					#if(($e.Number) > 0)
					(
						#if(((((FNameEntry**)$e.Names.AllocatorInstance.Data)[$e.Index])->Index) & 1)
						(
							#([(((FNameEntry**)$e.Names.AllocatorInstance.Data)[$e.Index])->UniName, su], "_", ($e.Number)-1)
						)
						#else
						(
							#([(((FNameEntry**)$e.Names.AllocatorInstance.Data)[$e.Index])->AnsiName, s], "_", ($e.Number)-1)
						)
					)
					#else
					(
						#if(((((FNameEntry**)$e.Names.AllocatorInstance.Data)[$e.Index])->Index) & 1)
						(
							#([(((FNameEntry**)$e.Names.AllocatorInstance.Data)[$e.Index])->UniName, su])
						)
						#else
						(
							#([(((FNameEntry**)$e.Names.AllocatorInstance.Data)[$e.Index])->AnsiName, s])
						)
					)
				)
				#else
				(
					"InvalidUE3_InvalidNegativeIndex_Site2"
				)
			)
			#else
			(
				"InvalidUE3_IndexTooLarge_Site2"
			)
		)
	)
}

TArray<*,TInlineAllocator<*,*> >|TArray<*,TFixedAllocator<*> > {
	preview
	(
		#if(($e.ArrayNum) >= 0)
		(
			#if(($e.ArrayNum) == 0)
			(
				"Empty"
			)
			#else
			(
				#if(($e.ArrayNum) <= ($e.ArrayMax))
				(
					#("Num=", $e.ArrayNum)
				)
				#else
				(
					"Invalid"
				)
			)
		)
		#else
		(
			"Invalid"
		)
	)
	children
	(
		#if(($e.ArrayNum) >= 0)
		(
			#if(($e.ArrayNum) <= ($e.ArrayMax))
			(
				#if(($e.ArrayNum) > 0)
				(
					#if(($e.ArrayNum) > $T2)
					(
						#(
							#array
							(
								expr: *(($T1 *)$e.AllocatorInstance.SecondaryData.Data + $i),
								size: $e.ArrayNum
							),
							#([Members]: [$e,!])
						)
					)
					#else
					(
						#(
							#array
							(
								expr: *(($T1 *)$e.AllocatorInstance.InlineData + $i),
								size: $e.ArrayNum
							),
							#([Members]: [$e,!])
						)
					)
				)
				#else
				(
					[Members]: [$e,!]
				)
			)
		)
	)
}

TArray<*,*> {
	preview
	(
		#if(($e.ArrayNum) >= 0)
		(
			#if(($e.ArrayNum) == 0)
			(
				"Empty"
			)
			#else
			(
				#if(($e.ArrayNum) <= ($e.ArrayMax))
				(
					#("Num=", $e.ArrayNum)
				)
				#else
				(
					"Invalid"
				)
			)
		)
		#else
		(
			"Invalid"
		)
	)
	children
	(
		#if(($e.ArrayNum) >= 0)
		(
			#if(($e.ArrayNum) <= ($e.ArrayMax))
			(
				#if(($e.ArrayNum) > 0)
				(
					#(
						#array
						(
							expr: *(($T1 *)$e.AllocatorInstance.Data + $i),
							size: $e.ArrayNum
						),
						#([Members]: [$e,!])
					)
				)
				#else
				(
					[Members]: [$e,!]
				)
			)
		)
	)
}

TIndirectArray<*,*> {
	preview
	(
		#if(($e.ArrayNum) >= 0)
		(
			#if(($e.ArrayNum) == 0)
			(
				"Empty"
			)
			#else
			(
				#if(($e.ArrayNum) <= ($e.ArrayMax))
				(
					#("Num=", $e.ArrayNum)
				)
				#else
				(
					"Invalid"
				)
			)
		)
		#else
		(
			"Invalid"
		)
	)
	children
	(
		#if(($e.ArrayNum) >= 0)
		(
			#if(($e.ArrayNum) <= ($e.ArrayMax))
			(
				#if(($e.ArrayNum) > 0)
				(
					#(
						#array
						(
							expr: *(($T1 **)$e.AllocatorInstance.Data + $i),
							size: $e.ArrayNum
						),
						#([Members]: [$e,!])
					)
				)
				#else
				(
					[Members]: [$e,!]
				)
			)
		)
	)
}

TBitArray<*> {
	preview
	(
		#($e.NumBits, " / ", $e.MaxBits)
	)
	children
	(
		#if(($e.NumBits >= 0) && ($e.NumBits <= $e.MaxBits))
		(
			#if($e.SecondaryData.Data != 0)
			(
				#array
				(
					expr: (((unsigned long*)$e.SecondaryData.Data)[$i / 0x20] >> ($i % 0x20)),
					size: $e.NumBits
				) : (bool)($e & 1)
			)
			#else
			(
				#array
				(
					expr: (((unsigned long*)$e.InlineData)[$i / 0x20] >> ($i % 0x20)),
					size: $e.NumBits
				) : (bool)($e & 1)
			)
		)
		#else
		(
			"Invalid"
		)
	)
}

TSparseArray<*,*> {
	preview
	(
		#if(($e.Data.ArrayNum) > 0)
		(
			#if(($e.Data.ArrayNum) <= ($e.Data.ArrayMax))
			(
				#("Num=", ($e.Data.ArrayNum- $e.NumFreeIndices))
			)
			#else
			(
				"Invalid"
			)
		)
		#else
		(
			"Empty"
		)
	)
	children
	(
		#if($e.Data.ArrayNum >= 0 && $e.Data.ArrayNum <= $e.Data.ArrayMax)
		(
			#if(($e.Data.ArrayNum) > 0)
			(
				#(
					#array
					(
						expr: #if ($e.AllocationFlags.SecondaryData.Data != 0)
						(
							#if(((*((uint32*)($e.AllocationFlags.SecondaryData.Data + ($i/32))))>>$i)&1)
							(
								((($T1 *)$e.Data.AllocatorInstance.Data)[$i])
							)
							#else
							(
								#("Invalid")
							)
						)
						#else
						(
							#if(((*((uint32*)($e.AllocationFlags.InlineData + ($i/32))))>>$i)&1)
							(
								((($T1 *)$e.Data.AllocatorInstance.Data)[$i])
							)
							#else
							(
								#("Invalid")
							)
						),
						size: $e.Data.ArrayNum
					),
					#([Members]: [$e,!])
				)
			)
			#else
			(
				#([Members]: [$e,!])
			)
		)

	)
}

TSetElement<*> {
	preview
	(
		#($e.Value)
	)
}

TPair<*,*> {
	preview
	(
		#("(", $e.Key, ", ", $e.Value, ")")
	)
}

TMapBase<*,*,*,*,*>|TMap<*,*,*,*>|TMultiMap<*,*,*> {
	preview
	(
		#if($c.Pairs.Elements.Data.ArrayNum - $c.Pairs.Elements.NumFreeIndices > 0)
		(
			#if(($c.Pairs.Elements.Data.ArrayNum - $c.Pairs.Elements.NumFreeIndices) <= ($c.Pairs.Elements.Data.ArrayMax))
			(
				#("Num=", ($c.Pairs.Elements.Data.ArrayNum - $c.Pairs.Elements.NumFreeIndices))
			)
			#else
			(
				"Invalid"
			)
		)
		#else
		(
			"Empty"
		)
	)

	children
	(
		#(
			#array
			(
				expr: #if ($c.Pairs.Elements.AllocationFlags.SecondaryData.Data != 0)
				(
					#if(((*((uint32*)($c.Pairs.Elements.AllocationFlags.SecondaryData.Data + ($i/32))))>>$i)&1)
					(
						&((TSetElement<TPair<$T1,$T2> > *)$c.Pairs.Elements.Data.AllocatorInstance.Data)[$i]
					)
					#else
					(
						"Invalid"
					)
				)
				#else
				(
					#if(((*((uint32*)($c.Pairs.Elements.AllocationFlags.InlineData + ($i/32))))>>$i)&1)
					(
						&((TSetElement<TPair<$T1,$T2> > *)$c.Pairs.Elements.Data.AllocatorInstance.Data)[$i]
					)
					#else
					(
						"Invalid"
					)
				),
				size: (($c.Pairs.Elements.Data.ArrayNum - $c.Pairs.Elements.NumFreeIndices > 0) && ($c.Pairs.Elements.Data.ArrayNum <= $c.Pairs.Elements.Data.ArrayMax)) * $c.Pairs.Elements.Data.ArrayNum
			) : $e.Value,
			[Members]: [$c,!]
		)
	)
}

TDoubleLinkedList<*>|FEditPropertyChain {
	children
	(
		#(
			#list
			(
				head: $e.HeadNode,
				next: NextNode,
				size: $c.ListSize
			) : $e.Value,
			#([Members]: [$e,!])
		)
	)
}

FString|FStringOutputDevice {
	preview
	(
		#if((($e.Data.ArrayNum) <= ($e.Data.ArrayMax)) && (($e.Data.ArrayNum) >= 0))
		(
			#("(", ($e.Data.ArrayNum - 1), ") ", [$e.Data.AllocatorInstance.Data,su]) 
		)
		#else ( "Invalid" )
	)

	stringview
	(
		#if((($e.Data.ArrayNum) <= ($e.Data.ArrayMax)) && (($e.Data.ArrayNum) >= 0)) ( [$e.Data.AllocatorInstance.Data,sub] )
		#else ( "Invalid" )
	)
}

FWeakObjectPtr|TWeakObjectPtr<*>|TAutoWeakObjectPtr<*>{
	preview
	(
		#if ($e.ObjectSerialNumber < 1)
		(
			"NULL"
		)
		#else
		(
			#if (*((*(*GSerialNumberBlocksForDebugVisualizers + ($e.ObjectIndex / 0x4000))) + ($e.ObjectIndex % 0x4000)) != $e.ObjectSerialNumber)
			(
				"STALE"
			)
			#else
			(
				*((UObjectBase**)GObjectArrayForDebugVisualizers->AllocatorInstance.Data + $e.ObjectIndex)
			)
		)
	)
	children
	(
		#if ($e.ObjectSerialNumber > 0 && *((*(*GSerialNumberBlocksForDebugVisualizers + ($e.ObjectIndex / 0x4000))) + ($e.ObjectIndex % 0x4000)) == $e.ObjectSerialNumber)
		(
			#(
				#([Target]: [*((UObjectBase**)GObjectArrayForDebugVisualizers->AllocatorInstance.Data + $e.ObjectIndex),!]),
				#([Members]: [$e,!])
			)
		)
		#else
		(
			#([Members]: [$e,!])
		)
	)
}

;------------------------------------------------------------------------------
;	Unreal Engine classes - End of [Visualizer] Section
;------------------------------------------------------------------------------